From 53562273d06916b58785fe6c803a7b881f13a3dc Mon Sep 17 00:00:00 2001 From: Jacob Colling Date: Fri, 10 May 2024 09:01:23 -0600 Subject: [PATCH] Next --- caret.code-workspace | 8 + main.js | 522 +++++++++++++++++++++++---------- main.ts | 673 ++++++++++++++++++++++++++++--------------- 3 files changed, 817 insertions(+), 386 deletions(-) create mode 100644 caret.code-workspace diff --git a/caret.code-workspace b/caret.code-workspace new file mode 100644 index 0000000..33c9351 --- /dev/null +++ b/caret.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} diff --git a/main.js b/main.js index 5cf1a7b..d90ec9f 100644 --- a/main.js +++ b/main.js @@ -32460,6 +32460,9 @@ ${messages}\`\`\``; var MyPlugin = class extends import_obsidian.Plugin { constructor() { super(...arguments); + this.canvas_patched = false; + this.selected_node_colors = {}; + this.color_picker_open_on_last_click = false; this.childNode = async (canvas, parentNode, x, y, content = "", from_side = "right", to_side = "left", origin = "ignore") => { var _a3; let tempChildNode = this.addNode(canvas, this.random(16), { @@ -32570,10 +32573,14 @@ var MyPlugin = class extends import_obsidian.Plugin { this.patchCanvasMenu(); } }); + this.registerEvent(this.app.workspace.on("layout-change", () => { + })); + const that = this; this.registerEvent( this.app.workspace.on("active-leaf-change", () => { const currentLeaf = this.app.workspace.activeLeaf; if ((currentLeaf == null ? void 0 : currentLeaf.view.getViewType()) === "canvas") { + const canvas = currentLeaf.view; this.patchCanvasMenu(); } }) @@ -32582,13 +32589,14 @@ var MyPlugin = class extends import_obsidian.Plugin { this.registerEditorExtension([redBackgroundField]); this.addSidebarTab(); this.addCommand({ - id: "log", + id: "caret-log", name: "Log", callback: async () => { const currentLeaf = this.app.workspace.activeLeaf; if ((currentLeaf == null ? void 0 : currentLeaf.view.getViewType()) === "canvas") { const canvasView = currentLeaf.view; const canvas = canvasView.canvas; + console.log(canvas); const viewportNodes = canvas.getViewportNodes(); } } @@ -32767,32 +32775,6 @@ var MyPlugin = class extends import_obsidian.Plugin { return content; } } - function parseCustomXML(xmlString) { - function getContent(tag, string) { - const openTag = `<${tag}>`; - const closeTag = ``; - const start = string.indexOf(openTag) + openTag.length; - const end = string.indexOf(closeTag); - return string.substring(start, end).trim(); - } - const conversationId = getContent("id", xmlString); - const result = { - metadata: { - id: conversationId - }, - conversation: { - messages: [] - } - }; - const messagesContent = getContent("conversation", xmlString); - const messageTags = messagesContent.split("").slice(0, -1); - for (const messageTag of messageTags) { - const role = getContent("role", messageTag); - const content = getContent("content", messageTag); - result.conversation.messages.push({ role, content }); - } - return result; - } this.addCommand({ id: "open-chat", name: "Open Chat", @@ -32840,6 +32822,73 @@ var MyPlugin = class extends import_obsidian.Plugin { } }); } + async highlight_lineage() { + var _a3; + await new Promise((resolve) => setTimeout(resolve, 200)); + console.log("Running highlight lineage"); + const canvas_view = (_a3 = this.app.workspace.getLeavesOfType("canvas").first()) == null ? void 0 : _a3.view; + if (!canvas_view) { + return; + } + const canvas = canvas_view.canvas; + const selection = canvas.selection; + const selection_iterator = selection.values(); + const node = selection_iterator.next().value; + if (!node) { + return; + } + const nodes_iterator = canvas.nodes.values(); + const nodes_array = Array.from(nodes_iterator); + const canvas_data = canvas.getData(); + const { edges, nodes } = canvas_data; + const longest_lineage = await this.getLongestLineage(nodes, edges, node.id); + const lineage_node_ids = new Set(longest_lineage.map((node2) => node2.id)); + for (const lineage_node of longest_lineage) { + const lineage_id = lineage_node.id; + const lineage_color = lineage_node.color; + if (!this.selected_node_colors.hasOwnProperty(lineage_id)) { + this.selected_node_colors[lineage_id] = lineage_color; + const filtered_nodes = nodes_array.filter((node2) => node2.id === lineage_id); + filtered_nodes.forEach((node2) => { + node2.color = "4"; + node2.render(); + }); + } + } + Object.keys(this.selected_node_colors).forEach((node_id) => { + if (!lineage_node_ids.has(node_id)) { + const original_color = this.selected_node_colors[node_id]; + const filtered_nodes = nodes_array.filter((node2) => node2.id === node_id); + filtered_nodes.forEach((node2) => { + node2.color = original_color; + node2.render(); + }); + delete this.selected_node_colors[node_id]; + } + }); + console.log(this.selected_node_colors); + } + async unhighlight_lineage(event) { + var _a3; + const canvas_view = (_a3 = this.app.workspace.getLeavesOfType("canvas").first()) == null ? void 0 : _a3.view; + if (!canvas_view) { + return; + } + console.log("Running in unhighlight_lineage"); + const canvas = canvas_view.canvas; + const nodes_iterator = canvas.nodes.values(); + const nodes_array = Array.from(nodes_iterator); + for (const node_id in this.selected_node_colors) { + console.log("Resetting color"); + const filtered_nodes = nodes_array.filter((node) => node.id === node_id); + filtered_nodes.forEach((node) => { + node.color = this.selected_node_colors[node_id]; + node.render(); + }); + } + this.selected_node_colors = {}; + console.log(); + } patchCanvasMenu() { var _a3, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l; const canvasView = (_a3 = this.app.workspace.getLeavesOfType("canvas").first()) == null ? void 0 : _a3.view; @@ -32847,7 +32896,7 @@ var MyPlugin = class extends import_obsidian.Plugin { return; } const canvas = canvasView.canvas; - const menu = canvasView.canvas.menu; + const menu = canvas.menu; if (!menu) { console.error("No menu found on the canvas"); return; @@ -32861,6 +32910,28 @@ var MyPlugin = class extends import_obsidian.Plugin { return result; } }); + this.register(menuUninstaller); + if (!this.canvas_patched) { + const functions = { + onDoubleClick: (next) => function(event) { + next.call(this, event); + }, + onPointerdown: (next) => function(event) { + const isNode = event.target.closest(".canvas-node"); + const canvas_color_picker_item = document.querySelector( + '.clickable-icon button[aria-label="Set Color"]' + ); + if (isNode) { + that.highlight_lineage(event); + } else { + that.unhighlight_lineage(event); + } + next.call(this, event); + } + }; + const doubleClickPatcher = around(canvas.constructor.prototype, functions); + this.register(doubleClickPatcher); + } (_b = canvasView.scope) == null ? void 0 : _b.register(["Mod", "Shift"], "ArrowUp", () => { that.create_directional_node(canvas, "top"); }); @@ -32894,7 +32965,10 @@ var MyPlugin = class extends import_obsidian.Plugin { (_l = canvasView.scope) == null ? void 0 : _l.register(["Mod", "Shift"], "Enter", () => { that.run_graph_chat(canvas); }); - this.register(menuUninstaller); + if (!this.canvas_patched) { + canvasView.leaf.rebuildView(); + this.canvas_patched = true; + } } create_directional_node(canvas, direction) { const selection = canvas.selection; @@ -33061,6 +33135,24 @@ var MyPlugin = class extends import_obsidian.Plugin { canvas.selectOnly(target_node); canvas.zoomToSelection(); } + this.highlight_lineage(); + } + parseCustomXML(xmlString, tags) { + console.log("In parse custom"); + console.log({ tags, xmlString }); + function getContent(tag, string) { + const openTag = `<${tag}>`; + const closeTag = ``; + const start = string.indexOf(openTag) + openTag.length; + const end = string.indexOf(closeTag); + return string.substring(start, end).trim(); + } + const result = {}; + tags.forEach((tag) => { + const content = getContent(tag, xmlString); + result[tag] = content; + }); + return result; } async extractTextFromPDF(file_name) { pdf$1.GlobalWorkerOptions.workerSrc = await this.app.vault.getResourcePath({ @@ -33101,11 +33193,9 @@ var MyPlugin = class extends import_obsidian.Plugin { var _a3; const canvasView = (_a3 = this.app.workspace.getLeavesOfType("canvas").first()) == null ? void 0 : _a3.view; const canvas = canvasView.canvas; - console.log(canvas); const selection = canvas.selection; const selectionIterator = selection.values(); const node = selectionIterator.next().value; - console.log(node); const x = node.x + node.width + 200; this.childNode(canvas, node, x, node.y, "user"); }); @@ -33194,8 +33284,21 @@ var MyPlugin = class extends import_obsidian.Plugin { return directAncestorsWithContext; } async get_ref_blocks_content(node) { + console.log("Running in ref blocks. This is the node"); + console.log({ node }); let rep_block_content = ""; - const ref_blocks = node.text.match(/\[\[.*?\]\]/g) || []; + console.log(node.text); + let ref_blocks; + if (!node.text) { + return ""; + } + try { + ref_blocks = node.text.match(/\[\[.*?\]\]/g) || []; + } catch (error2) { + console.error(node); + console.error(node.text); + throw error2; + } const inner_texts = ref_blocks.map((block) => block.slice(2, -2)); const files = this.app.vault.getFiles(); for (const file_name of inner_texts) { @@ -33207,12 +33310,237 @@ ${text} `; } else { - console.log("File not found for:", file_name); + console.error("File not found for:", file_name); } } rep_block_content = rep_block_content.trim(); return rep_block_content; } + async sparkle(node_id) { + var _a3; + const canvas_view = (_a3 = this.app.workspace.getLeavesOfType("canvas").first()) == null ? void 0 : _a3.view; + if (!canvas_view) { + console.error("No canvas view found."); + return; + } + const canvas = canvas_view.canvas; + await canvas.requestSave(true); + const canvas_data = canvas.getData(); + const { edges, nodes } = canvas_data; + const nodes_iterator = canvas.nodes.values(); + let node = null; + console.log(node_id); + for (const node_objs of nodes_iterator) { + console.log(node_objs); + if (node_objs.id === node_id) { + node = node_objs; + break; + } + } + if (!node) { + console.error("Node not found with ID:", node_id); + return; + } + console.log("Found node:"); + console.log(node); + if (node.hasOwnProperty("file")) { + console.log("Node has a 'file' attribute."); + const file_path = node.file.path; + const file = this.app.vault.getAbstractFileByPath(file_path); + if (file) { + console.log(file); + const text = await this.app.vault.cachedRead(file); + console.log(text); + const front_matter_match = text.match(/^---\s*^([\s\S]*?)^---/m); + if (front_matter_match) { + const front_matter_content = front_matter_match[1]; + console.log("Front matter content extracted:", front_matter_content); + const caret_prompt_match = front_matter_content.match(/caret_prompt:\s*(\w+)/); + let caret_prompt = ""; + let prompt_tags = []; + if (caret_prompt_match) { + caret_prompt = caret_prompt_match[1]; + const lines = front_matter_content.split("\n"); + console.log(lines); + const promptsIndex = lines.findIndex((line) => line.trim().startsWith("prompts:")); + if (promptsIndex !== -1) { + for (let i = promptsIndex + 1; i < lines.length; i++) { + const line = lines[i].trim(); + if (line.startsWith("-")) { + prompt_tags.push(line.substring(1).trim()); + } else { + break; + } + } + console.log("Prompts extracted:", prompt_tags); + } + } + if (caret_prompt === "multiprompt") { + const prompts = this.parseCustomXML(text, prompt_tags); + const prompts_keys = Object.keys(prompts); + const total_prompts = prompts_keys.length; + const card_height = node.height; + const middle_index = Math.floor(total_prompts / 2); + const highest_y = node.y - middle_index * (100 + card_height); + const sparklePromises = []; + for (let i = 0; i < prompts_keys.length; i++) { + const prompt = prompts[prompts_keys[i]]; + console.log({ prompt }); + let x = node.x + node.width + 200; + let y = highest_y + i * (100 + card_height); + const new_node_content = `user +${prompt}`; + const node_output = await this.childNode( + canvas, + node, + x, + y, + new_node_content, + "right", + "left", + "groq" + ); + sparklePromises.push(this.sparkle(node_output.id)); + } + await Promise.all(sparklePromises); + } + return; + } + } else { + console.error("File not found or is not a readable file:", file_path); + } + } + console.log("Running just a normal node?? This print 3 times"); + const longest_lineage = this.getLongestLineage(nodes, edges, node.id); + const ancestors_with_context = this.getDirectAncestorsWithContext(nodes, edges, node.id); + const ref_blocks = await this.get_ref_blocks_content(node); + let added_context = ``; + for (let i = 0; i < ancestors_with_context.length; i++) { + const node2 = ancestors_with_context[i]; + added_context += node2.text + "\n"; + } + if (ref_blocks.length > 1) { + added_context += ` + ${ref_blocks}`; + } + added_context = added_context.trim(); + let conversation = []; + for (let i = 0; i < longest_lineage.length; i++) { + const node2 = longest_lineage[i]; + let text = ""; + if (node2.type === "text") { + text = node2.text; + } else if (node2.type === "file" && node2.file.includes(".pdf")) { + const file_name = node2.file; + text = await this.extractTextFromPDF(file_name); + added_context += text; + const role = "assistant"; + const message = { + role, + content: text + }; + conversation.push(message); + continue; + } + const userRegex = /User<\/role>/i; + const assistantRegex = /assistant<\/role>/i; + if (userRegex.test(text)) { + const split_text = text.split(userRegex); + const role = "user"; + let content = split_text[1].trim(); + if (added_context.length > 1 && i === 0) { + content += ` +${added_context}`; + } + const message = { + role, + content + }; + conversation.push(message); + } + if (assistantRegex.test(text)) { + const split_text = text.split(assistantRegex); + const role = "assistant"; + const content = split_text[1].trim(); + const message = { + role, + content + }; + conversation.push(message); + } + } + conversation.reverse(); + const data = { + conversation + }; + const total_conversation_length = conversation.reduce((total, message) => { + return total + message.content.split(/\s+/).filter(Boolean).length; + }, 0); + console.log(`Total word count in conversation: ${total_conversation_length}`); + let model_choice = "groq"; + if (total_conversation_length > 1e4) { + model_choice = "openai-gpt-4"; + } + let node_content = ""; + if (model_choice === "local") { + try { + const response = await fetch("http://localhost:8000/conversation", { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(data) + }); + const output = await response.json(); + if (output) { + node_content = `assistant +${output.response}`; + } + } catch (error2) { + console.error("Error:", error2); + } + } + if (model_choice === "groq") { + const model = "llama3-70b-8192"; + const params = { + messages: conversation, + model, + // tools: tools, + // tool_choice: tool_choice, + max_tokens: 12e3, + stop: null + }; + new import_obsidian.Notice("Calling Groq!"); + groq.chat.completions.create(params).then((chat_completion) => { + new import_obsidian.Notice("Message back from Groq!"); + const content = chat_completion.choices[0].message.content; + const node_content2 = `assistant +${content}`; + const x = node.x + node.width + 200; + this.childNode(canvas, node, x, node.y, node_content2, "right", "left", "groq"); + }).catch((error2) => { + console.error("Error fetching chat completion from Groq:", error2); + }); + } + if (model_choice === "openai-gpt-4") { + const model = "gpt-4-1106-preview"; + const params = { + messages: conversation, + model + }; + new import_obsidian.Notice("Calling GPT-4!"); + openai.chat.completions.create(params).then((chat_completion) => { + new import_obsidian.Notice("Message back from GPT-4!"); + const content = chat_completion.choices[0].message.content; + const node_content2 = `assistant +${content}`; + const x = node.x + node.width + 200; + this.childNode(canvas, node, x, node.y, node_content2, "right", "left", "groq"); + }).catch((error2) => { + console.error("Error fetching chat completion:", error2); + }); + } + } addAIButtonIfNeeded(menuEl) { if (!menuEl.querySelector(".gpt-menu-item")) { const buttonEl = createEl("button", "clickable-icon gpt-menu-item"); @@ -33223,132 +33551,12 @@ ${text} const canvasView = (_a3 = this.app.workspace.getLeavesOfType("canvas").first()) == null ? void 0 : _a3.view; const canvas = canvasView.canvas; await canvas.requestSave(true); + console.log(canvas); const selection = canvas.selection; const selectionIterator = selection.values(); const node = selectionIterator.next().value; - const canvas_data = canvas.getData(); - const { edges, nodes } = canvas_data; - console.log(canvas_data); - const longest_lineage = this.getLongestLineage(nodes, edges, node.id); - const ancestors_with_context = this.getDirectAncestorsWithContext(nodes, edges, node.id); - const ref_blocks = await this.get_ref_blocks_content(node); - let added_context = ``; - for (let i = 0; i < ancestors_with_context.length; i++) { - const node2 = ancestors_with_context[i]; - added_context += node2.text + "\n"; - } - if (ref_blocks.length > 1) { - added_context += ` - ${ref_blocks}`; - } - added_context = added_context.trim(); - let conversation = []; - console.log("Here"); - for (let i = 0; i < longest_lineage.length; i++) { - const node2 = longest_lineage[i]; - let text = ""; - console.log(node2); - if (node2.type === "text") { - text = node2.text; - } else if (node2.type === "file" && node2.file.includes(".pdf")) { - const file_name = node2.file; - text = await this.extractTextFromPDF(file_name); - console.log("Got text"); - console.log(text); - added_context += text; - const role = "assistant"; - const message = { - role, - content: text - }; - conversation.push(message); - continue; - } - const userRegex = /User<\/role>/i; - const assistantRegex = /assistant<\/role>/i; - if (userRegex.test(text)) { - const split_text = text.split(userRegex); - const role = "user"; - let content = split_text[1].trim(); - if (added_context.length > 1 && i === 0) { - content += ` -${added_context}`; - } - const message = { - role, - content - }; - conversation.push(message); - } - if (assistantRegex.test(text)) { - const split_text = text.split(assistantRegex); - const role = "assistant"; - const content = split_text[1].trim(); - const message = { - role, - content - }; - conversation.push(message); - } - } - conversation.reverse(); - console.log({ conversation }); - const data = { - conversation - }; - let model_choice = "openai-gpt-4"; - let node_content = ""; - if (model_choice === "local") { - try { - const response = await fetch("http://localhost:8000/conversation", { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify(data) - }); - const output = await response.json(); - console.log(output); - if (output) { - node_content = `assistant -${output.response}`; - } - } catch (error2) { - console.error("Error:", error2); - } - } - if (model_choice === "groq") { - const model = "llama3-70b-8192"; - const params = { - messages: conversation, - model, - // tools: tools, - // tool_choice: tool_choice, - max_tokens: 12e3, - stop: null - }; - new import_obsidian.Notice("Calling Groq!"); - const chat_completion = await groq.chat.completions.create(params); - new import_obsidian.Notice("Message back from Groq"); - const content = chat_completion.choices[0].message.content; - node_content = `assistant -${content}`; - } - if (model_choice === "openai-gpt-4") { - const model = "gpt-4-1106-preview"; - const params = { - messages: conversation, - model - }; - new import_obsidian.Notice("Calling GPT-4!"); - const chat_completion = await openai.chat.completions.create(params); - new import_obsidian.Notice("Message back from GPT-4!"); - const content = chat_completion.choices[0].message.content; - node_content = `assistant -${content}`; - } - const x = node.x + node.width + 200; - this.childNode(canvas, node, x, node.y, node_content, "right", "left", "groq"); + const node_id = node.id; + await this.sparkle(node_id); }); menuEl.appendChild(buttonEl); } @@ -33418,4 +33626,4 @@ ${content}`; *) (*! https://mths.be/punycode v1.4.1 by @mathias *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2RvdGVudi9wYWNrYWdlLmpzb24iLCAibm9kZV9tb2R1bGVzL2RvdGVudi9saWIvbWFpbi5qcyIsICJtYWluLnRzIiwgIm5vZGVfbW9kdWxlcy9AYnVuZGxlZC1lcy1tb2R1bGVzL3BkZmpzLWRpc3QvYnVpbGQvcGRmLmpzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3ZlcnNpb24udHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvX3NoaW1zL3JlZ2lzdHJ5LnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL19zaGltcy9NdWx0aXBhcnRCb2R5LnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL19zaGltcy93ZWItcnVudGltZS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL19zaGltcy9pbmRleC5tanMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvZXJyb3IudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvc3RyZWFtaW5nLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3VwbG9hZHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvY29yZS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9wYWdpbmF0aW9uLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9jaGF0L2NvbXBsZXRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9jaGF0L2NoYXQudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2F1ZGlvL3NwZWVjaC50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYXVkaW8vdHJhbnNjcmlwdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2F1ZGlvL3RyYW5zbGF0aW9ucy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYXVkaW8vYXVkaW8udHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JhdGNoZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvYXNzaXN0YW50cy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvUnVubmFibGVGdW5jdGlvbi50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvY2hhdENvbXBsZXRpb25VdGlscy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lci50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvQ2hhdENvbXBsZXRpb25SdW5uZXIudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lci50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS9jaGF0L2NvbXBsZXRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL2NoYXQvY2hhdC50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvQWJzdHJhY3RBc3Npc3RhbnRTdHJlYW1SdW5uZXIudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0Fzc2lzdGFudFN0cmVhbS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL21lc3NhZ2VzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvcnVucy9zdGVwcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL3J1bnMvcnVucy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL3RocmVhZHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL1V0aWwudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdmVjdG9yLXN0b3Jlcy9maWxlcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS92ZWN0b3Itc3RvcmVzL2ZpbGUtYmF0Y2hlcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS92ZWN0b3Itc3RvcmVzL3ZlY3Rvci1zdG9yZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvYmV0YS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvY29tcGxldGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2VtYmVkZGluZ3MudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2ZpbGVzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9maW5lLXR1bmluZy9qb2JzL2NoZWNrcG9pbnRzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9maW5lLXR1bmluZy9qb2JzL2pvYnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2ZpbmUtdHVuaW5nL2ZpbmUtdHVuaW5nLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9pbWFnZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL21vZGVscy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvbW9kZXJhdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy92ZXJzaW9uLnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvX3NoaW1zL3JlZ2lzdHJ5LnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvX3NoaW1zL011bHRpcGFydEJvZHkudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9fc2hpbXMvd2ViLXJ1bnRpbWUudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL19zaGltcy9pbmRleC5tanMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9lcnJvci50cyIsICJub2RlX21vZHVsZXMvZ3JvcS1zZGsvc3JjL2xpYi9zdHJlYW1pbmcudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy91cGxvYWRzLnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvY29yZS50cyIsICJub2RlX21vZHVsZXMvZ3JvcS1zZGsvc3JjL3Jlc291cmNlLnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvcmVzb3VyY2VzL2NoYXQvY29tcGxldGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9yZXNvdXJjZXMvY2hhdC9jaGF0LnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvcmVzb3VyY2VzL21vZGVscy50cyIsICJub2RlX21vZHVsZXMvZ3JvcS1zZGsvc3JjL3Jlc291cmNlcy9hdWRpby90cmFuc2NyaXB0aW9ucy50cyIsICJub2RlX21vZHVsZXMvZ3JvcS1zZGsvc3JjL3Jlc291cmNlcy9hdWRpby90cmFuc2xhdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9yZXNvdXJjZXMvYXVkaW8vYXVkaW8udHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9pbmRleC50cyIsICJub2RlX21vZHVsZXMvbW9ua2V5LWFyb3VuZC9kaXN0L2luZGV4Lm1qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsie1xuICBcIm5hbWVcIjogXCJkb3RlbnZcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMTYuNC41XCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJMb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVcIixcbiAgXCJtYWluXCI6IFwibGliL21haW4uanNcIixcbiAgXCJ0eXBlc1wiOiBcImxpYi9tYWluLmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vbGliL21haW4uZC50c1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9saWIvbWFpbi5qc1wiLFxuICAgICAgXCJkZWZhdWx0XCI6IFwiLi9saWIvbWFpbi5qc1wiXG4gICAgfSxcbiAgICBcIi4vY29uZmlnXCI6IFwiLi9jb25maWcuanNcIixcbiAgICBcIi4vY29uZmlnLmpzXCI6IFwiLi9jb25maWcuanNcIixcbiAgICBcIi4vbGliL2Vudi1vcHRpb25zXCI6IFwiLi9saWIvZW52LW9wdGlvbnMuanNcIixcbiAgICBcIi4vbGliL2Vudi1vcHRpb25zLmpzXCI6IFwiLi9saWIvZW52LW9wdGlvbnMuanNcIixcbiAgICBcIi4vbGliL2NsaS1vcHRpb25zXCI6IFwiLi9saWIvY2xpLW9wdGlvbnMuanNcIixcbiAgICBcIi4vbGliL2NsaS1vcHRpb25zLmpzXCI6IFwiLi9saWIvY2xpLW9wdGlvbnMuanNcIixcbiAgICBcIi4vcGFja2FnZS5qc29uXCI6IFwiLi9wYWNrYWdlLmpzb25cIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiZHRzLWNoZWNrXCI6IFwidHNjIC0tcHJvamVjdCB0ZXN0cy90eXBlcy90c2NvbmZpZy5qc29uXCIsXG4gICAgXCJsaW50XCI6IFwic3RhbmRhcmRcIixcbiAgICBcImxpbnQtcmVhZG1lXCI6IFwic3RhbmRhcmQtbWFya2Rvd25cIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biBkdHMtY2hlY2tcIixcbiAgICBcInRlc3RcIjogXCJ0YXAgdGVzdHMvKi5qcyAtLTEwMCAtUnNwZWNcIixcbiAgICBcInRlc3Q6Y292ZXJhZ2VcIjogXCJ0YXAgLS1jb3ZlcmFnZS1yZXBvcnQ9bGNvdlwiLFxuICAgIFwicHJlcmVsZWFzZVwiOiBcIm5wbSB0ZXN0XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwic3RhbmRhcmQtdmVyc2lvblwiXG4gIH0sXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQ6Ly9naXRodWIuY29tL21vdGRvdGxhL2RvdGVudi5naXRcIlxuICB9LFxuICBcImZ1bmRpbmdcIjogXCJodHRwczovL2RvdGVudnguY29tXCIsXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwiZG90ZW52XCIsXG4gICAgXCJlbnZcIixcbiAgICBcIi5lbnZcIixcbiAgICBcImVudmlyb25tZW50XCIsXG4gICAgXCJ2YXJpYWJsZXNcIixcbiAgICBcImNvbmZpZ1wiLFxuICAgIFwic2V0dGluZ3NcIlxuICBdLFxuICBcInJlYWRtZUZpbGVuYW1lXCI6IFwiUkVBRE1FLm1kXCIsXG4gIFwibGljZW5zZVwiOiBcIkJTRC0yLUNsYXVzZVwiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAZGVmaW5pdGVseXR5cGVkL2R0c2xpbnRcIjogXCJeMC4wLjEzM1wiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMTguMTEuM1wiLFxuICAgIFwiZGVjYWNoZVwiOiBcIl40LjYuMVwiLFxuICAgIFwic2lub25cIjogXCJeMTQuMC4xXCIsXG4gICAgXCJzdGFuZGFyZFwiOiBcIl4xNy4wLjBcIixcbiAgICBcInN0YW5kYXJkLW1hcmtkb3duXCI6IFwiXjcuMS4wXCIsXG4gICAgXCJzdGFuZGFyZC12ZXJzaW9uXCI6IFwiXjkuNS4wXCIsXG4gICAgXCJ0YXBcIjogXCJeMTYuMy4wXCIsXG4gICAgXCJ0YXJcIjogXCJeNi4xLjExXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjQuOC40XCJcbiAgfSxcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCI+PTEyXCJcbiAgfSxcbiAgXCJicm93c2VyXCI6IHtcbiAgICBcImZzXCI6IGZhbHNlXG4gIH1cbn1cbiIsICJjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKVxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbmNvbnN0IHBhY2thZ2VKc29uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJylcblxuY29uc3QgdmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb25cblxuY29uc3QgTElORSA9IC8oPzpefF4pXFxzKig/OmV4cG9ydFxccyspPyhbXFx3Li1dKykoPzpcXHMqPVxccyo/fDpcXHMrPykoXFxzKicoPzpcXFxcJ3xbXiddKSonfFxccypcIig/OlxcXFxcInxbXlwiXSkqXCJ8XFxzKmAoPzpcXFxcYHxbXmBdKSpgfFteI1xcclxcbl0rKT9cXHMqKD86Iy4qKT8oPzokfCQpL21nXG5cbi8vIFBhcnNlIHNyYyBpbnRvIGFuIE9iamVjdFxuZnVuY3Rpb24gcGFyc2UgKHNyYykge1xuICBjb25zdCBvYmogPSB7fVxuXG4gIC8vIENvbnZlcnQgYnVmZmVyIHRvIHN0cmluZ1xuICBsZXQgbGluZXMgPSBzcmMudG9TdHJpbmcoKVxuXG4gIC8vIENvbnZlcnQgbGluZSBicmVha3MgdG8gc2FtZSBmb3JtYXRcbiAgbGluZXMgPSBsaW5lcy5yZXBsYWNlKC9cXHJcXG4/L21nLCAnXFxuJylcblxuICBsZXQgbWF0Y2hcbiAgd2hpbGUgKChtYXRjaCA9IExJTkUuZXhlYyhsaW5lcykpICE9IG51bGwpIHtcbiAgICBjb25zdCBrZXkgPSBtYXRjaFsxXVxuXG4gICAgLy8gRGVmYXVsdCB1bmRlZmluZWQgb3IgbnVsbCB0byBlbXB0eSBzdHJpbmdcbiAgICBsZXQgdmFsdWUgPSAobWF0Y2hbMl0gfHwgJycpXG5cbiAgICAvLyBSZW1vdmUgd2hpdGVzcGFjZVxuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpXG5cbiAgICAvLyBDaGVjayBpZiBkb3VibGUgcXVvdGVkXG4gICAgY29uc3QgbWF5YmVRdW90ZSA9IHZhbHVlWzBdXG5cbiAgICAvLyBSZW1vdmUgc3Vycm91bmRpbmcgcXVvdGVzXG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eKFsnXCJgXSkoW1xcc1xcU10qKVxcMSQvbWcsICckMicpXG5cbiAgICAvLyBFeHBhbmQgbmV3bGluZXMgaWYgZG91YmxlIHF1b3RlZFxuICAgIGlmIChtYXliZVF1b3RlID09PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXFxcci9nLCAnXFxyJylcbiAgICB9XG5cbiAgICAvLyBBZGQgdG8gb2JqZWN0XG4gICAgb2JqW2tleV0gPSB2YWx1ZVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5mdW5jdGlvbiBfcGFyc2VWYXVsdCAob3B0aW9ucykge1xuICBjb25zdCB2YXVsdFBhdGggPSBfdmF1bHRQYXRoKG9wdGlvbnMpXG5cbiAgLy8gUGFyc2UgLmVudi52YXVsdFxuICBjb25zdCByZXN1bHQgPSBEb3RlbnZNb2R1bGUuY29uZmlnRG90ZW52KHsgcGF0aDogdmF1bHRQYXRoIH0pXG4gIGlmICghcmVzdWx0LnBhcnNlZCkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgTUlTU0lOR19EQVRBOiBDYW5ub3QgcGFyc2UgJHt2YXVsdFBhdGh9IGZvciBhbiB1bmtub3duIHJlYXNvbmApXG4gICAgZXJyLmNvZGUgPSAnTUlTU0lOR19EQVRBJ1xuICAgIHRocm93IGVyclxuICB9XG5cbiAgLy8gaGFuZGxlIHNjZW5hcmlvIGZvciBjb21tYSBzZXBhcmF0ZWQga2V5cyAtIGZvciB1c2Ugd2l0aCBrZXkgcm90YXRpb25cbiAgLy8gZXhhbXBsZTogRE9URU5WX0tFWT1cImRvdGVudjovLzprZXlfMTIzNEBkb3RlbnZ4LmNvbS92YXVsdC8uZW52LnZhdWx0P2Vudmlyb25tZW50PXByb2QsZG90ZW52Oi8vOmtleV83ODkwQGRvdGVudnguY29tL3ZhdWx0Ly5lbnYudmF1bHQ/ZW52aXJvbm1lbnQ9cHJvZFwiXG4gIGNvbnN0IGtleXMgPSBfZG90ZW52S2V5KG9wdGlvbnMpLnNwbGl0KCcsJylcbiAgY29uc3QgbGVuZ3RoID0ga2V5cy5sZW5ndGhcblxuICBsZXQgZGVjcnlwdGVkXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGZ1bGwga2V5XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldLnRyaW0oKVxuXG4gICAgICAvLyBHZXQgaW5zdHJ1Y3Rpb25zIGZvciBkZWNyeXB0XG4gICAgICBjb25zdCBhdHRycyA9IF9pbnN0cnVjdGlvbnMocmVzdWx0LCBrZXkpXG5cbiAgICAgIC8vIERlY3J5cHRcbiAgICAgIGRlY3J5cHRlZCA9IERvdGVudk1vZHVsZS5kZWNyeXB0KGF0dHJzLmNpcGhlcnRleHQsIGF0dHJzLmtleSlcblxuICAgICAgYnJlYWtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gbGFzdCBrZXlcbiAgICAgIGlmIChpICsgMSA+PSBsZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICAgIC8vIHRyeSBuZXh0IGtleVxuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlIGRlY3J5cHRlZCAuZW52IHN0cmluZ1xuICByZXR1cm4gRG90ZW52TW9kdWxlLnBhcnNlKGRlY3J5cHRlZClcbn1cblxuZnVuY3Rpb24gX2xvZyAobWVzc2FnZSkge1xuICBjb25zb2xlLmxvZyhgW2RvdGVudkAke3ZlcnNpb259XVtJTkZPXSAke21lc3NhZ2V9YClcbn1cblxuZnVuY3Rpb24gX3dhcm4gKG1lc3NhZ2UpIHtcbiAgY29uc29sZS5sb2coYFtkb3RlbnZAJHt2ZXJzaW9ufV1bV0FSTl0gJHttZXNzYWdlfWApXG59XG5cbmZ1bmN0aW9uIF9kZWJ1ZyAobWVzc2FnZSkge1xuICBjb25zb2xlLmxvZyhgW2RvdGVudkAke3ZlcnNpb259XVtERUJVR10gJHttZXNzYWdlfWApXG59XG5cbmZ1bmN0aW9uIF9kb3RlbnZLZXkgKG9wdGlvbnMpIHtcbiAgLy8gcHJpb3JpdGl6ZSBkZXZlbG9wZXIgZGlyZWN0bHkgc2V0dGluZyBvcHRpb25zLkRPVEVOVl9LRVlcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5ET1RFTlZfS0VZICYmIG9wdGlvbnMuRE9URU5WX0tFWS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuRE9URU5WX0tFWVxuICB9XG5cbiAgLy8gc2Vjb25kYXJ5IGluZnJhIGFscmVhZHkgY29udGFpbnMgYSBET1RFTlZfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlXG4gIGlmIChwcm9jZXNzLmVudi5ET1RFTlZfS0VZICYmIHByb2Nlc3MuZW52LkRPVEVOVl9LRVkubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5ET1RFTlZfS0VZXG4gIH1cblxuICAvLyBmYWxsYmFjayB0byBlbXB0eSBzdHJpbmdcbiAgcmV0dXJuICcnXG59XG5cbmZ1bmN0aW9uIF9pbnN0cnVjdGlvbnMgKHJlc3VsdCwgZG90ZW52S2V5KSB7XG4gIC8vIFBhcnNlIERPVEVOVl9LRVkuIEZvcm1hdCBpcyBhIFVSSVxuICBsZXQgdXJpXG4gIHRyeSB7XG4gICAgdXJpID0gbmV3IFVSTChkb3RlbnZLZXkpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yLmNvZGUgPT09ICdFUlJfSU5WQUxJRF9VUkwnKSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0lOVkFMSURfRE9URU5WX0tFWTogV3JvbmcgZm9ybWF0LiBNdXN0IGJlIGluIHZhbGlkIHVyaSBmb3JtYXQgbGlrZSBkb3RlbnY6Ly86a2V5XzEyMzRAZG90ZW52eC5jb20vdmF1bHQvLmVudi52YXVsdD9lbnZpcm9ubWVudD1kZXZlbG9wbWVudCcpXG4gICAgICBlcnIuY29kZSA9ICdJTlZBTElEX0RPVEVOVl9LRVknXG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgLy8gR2V0IGRlY3J5cHQga2V5XG4gIGNvbnN0IGtleSA9IHVyaS5wYXNzd29yZFxuICBpZiAoIWtleSkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignSU5WQUxJRF9ET1RFTlZfS0VZOiBNaXNzaW5nIGtleSBwYXJ0JylcbiAgICBlcnIuY29kZSA9ICdJTlZBTElEX0RPVEVOVl9LRVknXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICAvLyBHZXQgZW52aXJvbm1lbnRcbiAgY29uc3QgZW52aXJvbm1lbnQgPSB1cmkuc2VhcmNoUGFyYW1zLmdldCgnZW52aXJvbm1lbnQnKVxuICBpZiAoIWVudmlyb25tZW50KSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKCdJTlZBTElEX0RPVEVOVl9LRVk6IE1pc3NpbmcgZW52aXJvbm1lbnQgcGFydCcpXG4gICAgZXJyLmNvZGUgPSAnSU5WQUxJRF9ET1RFTlZfS0VZJ1xuICAgIHRocm93IGVyclxuICB9XG5cbiAgLy8gR2V0IGNpcGhlcnRleHQgcGF5bG9hZFxuICBjb25zdCBlbnZpcm9ubWVudEtleSA9IGBET1RFTlZfVkFVTFRfJHtlbnZpcm9ubWVudC50b1VwcGVyQ2FzZSgpfWBcbiAgY29uc3QgY2lwaGVydGV4dCA9IHJlc3VsdC5wYXJzZWRbZW52aXJvbm1lbnRLZXldIC8vIERPVEVOVl9WQVVMVF9QUk9EVUNUSU9OXG4gIGlmICghY2lwaGVydGV4dCkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgTk9UX0ZPVU5EX0RPVEVOVl9FTlZJUk9OTUVOVDogQ2Fubm90IGxvY2F0ZSBlbnZpcm9ubWVudCAke2Vudmlyb25tZW50S2V5fSBpbiB5b3VyIC5lbnYudmF1bHQgZmlsZS5gKVxuICAgIGVyci5jb2RlID0gJ05PVF9GT1VORF9ET1RFTlZfRU5WSVJPTk1FTlQnXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICByZXR1cm4geyBjaXBoZXJ0ZXh0LCBrZXkgfVxufVxuXG5mdW5jdGlvbiBfdmF1bHRQYXRoIChvcHRpb25zKSB7XG4gIGxldCBwb3NzaWJsZVZhdWx0UGF0aCA9IG51bGxcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnBhdGggJiYgb3B0aW9ucy5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnBhdGgpKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGVwYXRoIG9mIG9wdGlvbnMucGF0aCkge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlcGF0aCkpIHtcbiAgICAgICAgICBwb3NzaWJsZVZhdWx0UGF0aCA9IGZpbGVwYXRoLmVuZHNXaXRoKCcudmF1bHQnKSA/IGZpbGVwYXRoIDogYCR7ZmlsZXBhdGh9LnZhdWx0YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvc3NpYmxlVmF1bHRQYXRoID0gb3B0aW9ucy5wYXRoLmVuZHNXaXRoKCcudmF1bHQnKSA/IG9wdGlvbnMucGF0aCA6IGAke29wdGlvbnMucGF0aH0udmF1bHRgXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBvc3NpYmxlVmF1bHRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LnZhdWx0JylcbiAgfVxuXG4gIGlmIChmcy5leGlzdHNTeW5jKHBvc3NpYmxlVmF1bHRQYXRoKSkge1xuICAgIHJldHVybiBwb3NzaWJsZVZhdWx0UGF0aFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVIb21lIChlbnZQYXRoKSB7XG4gIHJldHVybiBlbnZQYXRoWzBdID09PSAnficgPyBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCBlbnZQYXRoLnNsaWNlKDEpKSA6IGVudlBhdGhcbn1cblxuZnVuY3Rpb24gX2NvbmZpZ1ZhdWx0IChvcHRpb25zKSB7XG4gIF9sb2coJ0xvYWRpbmcgZW52IGZyb20gZW5jcnlwdGVkIC5lbnYudmF1bHQnKVxuXG4gIGNvbnN0IHBhcnNlZCA9IERvdGVudk1vZHVsZS5fcGFyc2VWYXVsdChvcHRpb25zKVxuXG4gIGxldCBwcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnZcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wcm9jZXNzRW52ICE9IG51bGwpIHtcbiAgICBwcm9jZXNzRW52ID0gb3B0aW9ucy5wcm9jZXNzRW52XG4gIH1cblxuICBEb3RlbnZNb2R1bGUucG9wdWxhdGUocHJvY2Vzc0VudiwgcGFyc2VkLCBvcHRpb25zKVxuXG4gIHJldHVybiB7IHBhcnNlZCB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ0RvdGVudiAob3B0aW9ucykge1xuICBjb25zdCBkb3RlbnZQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52JylcbiAgbGV0IGVuY29kaW5nID0gJ3V0ZjgnXG4gIGNvbnN0IGRlYnVnID0gQm9vbGVhbihvcHRpb25zICYmIG9wdGlvbnMuZGVidWcpXG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGluZykge1xuICAgIGVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZ1xuICB9IGVsc2Uge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgX2RlYnVnKCdObyBlbmNvZGluZyBpcyBzcGVjaWZpZWQuIFVURi04IGlzIHVzZWQgYnkgZGVmYXVsdCcpXG4gICAgfVxuICB9XG5cbiAgbGV0IG9wdGlvblBhdGhzID0gW2RvdGVudlBhdGhdIC8vIGRlZmF1bHQsIGxvb2sgZm9yIC5lbnZcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wYXRoKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMucGF0aCkpIHtcbiAgICAgIG9wdGlvblBhdGhzID0gW19yZXNvbHZlSG9tZShvcHRpb25zLnBhdGgpXVxuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25QYXRocyA9IFtdIC8vIHJlc2V0IGRlZmF1bHRcbiAgICAgIGZvciAoY29uc3QgZmlsZXBhdGggb2Ygb3B0aW9ucy5wYXRoKSB7XG4gICAgICAgIG9wdGlvblBhdGhzLnB1c2goX3Jlc29sdmVIb21lKGZpbGVwYXRoKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgcGFyc2VkIGRhdGEgaW4gYSB0ZW1wb3Jhcnkgb2JqZWN0IChiZWNhdXNlIHdlIG5lZWQgdG8gcmV0dXJuIGl0KS4gIE9uY2Ugd2UgaGF2ZSB0aGUgZmluYWxcbiAgLy8gcGFyc2VkIGRhdGEsIHdlIHdpbGwgY29tYmluZSBpdCB3aXRoIHByb2Nlc3MuZW52IChvciBvcHRpb25zLnByb2Nlc3NFbnYgaWYgcHJvdmlkZWQpLlxuICBsZXQgbGFzdEVycm9yXG4gIGNvbnN0IHBhcnNlZEFsbCA9IHt9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBvcHRpb25QYXRocykge1xuICAgIHRyeSB7XG4gICAgICAvLyBTcGVjaWZ5aW5nIGFuIGVuY29kaW5nIHJldHVybnMgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGJ1ZmZlclxuICAgICAgY29uc3QgcGFyc2VkID0gRG90ZW52TW9kdWxlLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLCB7IGVuY29kaW5nIH0pKVxuXG4gICAgICBEb3RlbnZNb2R1bGUucG9wdWxhdGUocGFyc2VkQWxsLCBwYXJzZWQsIG9wdGlvbnMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIF9kZWJ1ZyhgRmFpbGVkIHRvIGxvYWQgJHtwYXRofSAke2UubWVzc2FnZX1gKVxuICAgICAgfVxuICAgICAgbGFzdEVycm9yID0gZVxuICAgIH1cbiAgfVxuXG4gIGxldCBwcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnZcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wcm9jZXNzRW52ICE9IG51bGwpIHtcbiAgICBwcm9jZXNzRW52ID0gb3B0aW9ucy5wcm9jZXNzRW52XG4gIH1cblxuICBEb3RlbnZNb2R1bGUucG9wdWxhdGUocHJvY2Vzc0VudiwgcGFyc2VkQWxsLCBvcHRpb25zKVxuXG4gIGlmIChsYXN0RXJyb3IpIHtcbiAgICByZXR1cm4geyBwYXJzZWQ6IHBhcnNlZEFsbCwgZXJyb3I6IGxhc3RFcnJvciB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgcGFyc2VkOiBwYXJzZWRBbGwgfVxuICB9XG59XG5cbi8vIFBvcHVsYXRlcyBwcm9jZXNzLmVudiBmcm9tIC5lbnYgZmlsZVxuZnVuY3Rpb24gY29uZmlnIChvcHRpb25zKSB7XG4gIC8vIGZhbGxiYWNrIHRvIG9yaWdpbmFsIGRvdGVudiBpZiBET1RFTlZfS0VZIGlzIG5vdCBzZXRcbiAgaWYgKF9kb3RlbnZLZXkob3B0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIERvdGVudk1vZHVsZS5jb25maWdEb3RlbnYob3B0aW9ucylcbiAgfVxuXG4gIGNvbnN0IHZhdWx0UGF0aCA9IF92YXVsdFBhdGgob3B0aW9ucylcblxuICAvLyBkb3RlbnZLZXkgZXhpc3RzIGJ1dCAuZW52LnZhdWx0IGZpbGUgZG9lcyBub3QgZXhpc3RcbiAgaWYgKCF2YXVsdFBhdGgpIHtcbiAgICBfd2FybihgWW91IHNldCBET1RFTlZfS0VZIGJ1dCB5b3UgYXJlIG1pc3NpbmcgYSAuZW52LnZhdWx0IGZpbGUgYXQgJHt2YXVsdFBhdGh9LiBEaWQgeW91IGZvcmdldCB0byBidWlsZCBpdD9gKVxuXG4gICAgcmV0dXJuIERvdGVudk1vZHVsZS5jb25maWdEb3RlbnYob3B0aW9ucylcbiAgfVxuXG4gIHJldHVybiBEb3RlbnZNb2R1bGUuX2NvbmZpZ1ZhdWx0KG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGRlY3J5cHQgKGVuY3J5cHRlZCwga2V5U3RyKSB7XG4gIGNvbnN0IGtleSA9IEJ1ZmZlci5mcm9tKGtleVN0ci5zbGljZSgtNjQpLCAnaGV4JylcbiAgbGV0IGNpcGhlcnRleHQgPSBCdWZmZXIuZnJvbShlbmNyeXB0ZWQsICdiYXNlNjQnKVxuXG4gIGNvbnN0IG5vbmNlID0gY2lwaGVydGV4dC5zdWJhcnJheSgwLCAxMilcbiAgY29uc3QgYXV0aFRhZyA9IGNpcGhlcnRleHQuc3ViYXJyYXkoLTE2KVxuICBjaXBoZXJ0ZXh0ID0gY2lwaGVydGV4dC5zdWJhcnJheSgxMiwgLTE2KVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYWVzZ2NtID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0yNTYtZ2NtJywga2V5LCBub25jZSlcbiAgICBhZXNnY20uc2V0QXV0aFRhZyhhdXRoVGFnKVxuICAgIHJldHVybiBgJHthZXNnY20udXBkYXRlKGNpcGhlcnRleHQpfSR7YWVzZ2NtLmZpbmFsKCl9YFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGlzUmFuZ2UgPSBlcnJvciBpbnN0YW5jZW9mIFJhbmdlRXJyb3JcbiAgICBjb25zdCBpbnZhbGlkS2V5TGVuZ3RoID0gZXJyb3IubWVzc2FnZSA9PT0gJ0ludmFsaWQga2V5IGxlbmd0aCdcbiAgICBjb25zdCBkZWNyeXB0aW9uRmFpbGVkID0gZXJyb3IubWVzc2FnZSA9PT0gJ1Vuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YSdcblxuICAgIGlmIChpc1JhbmdlIHx8IGludmFsaWRLZXlMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignSU5WQUxJRF9ET1RFTlZfS0VZOiBJdCBtdXN0IGJlIDY0IGNoYXJhY3RlcnMgbG9uZyAob3IgbW9yZSknKVxuICAgICAgZXJyLmNvZGUgPSAnSU5WQUxJRF9ET1RFTlZfS0VZJ1xuICAgICAgdGhyb3cgZXJyXG4gICAgfSBlbHNlIGlmIChkZWNyeXB0aW9uRmFpbGVkKSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0RFQ1JZUFRJT05fRkFJTEVEOiBQbGVhc2UgY2hlY2sgeW91ciBET1RFTlZfS0VZJylcbiAgICAgIGVyci5jb2RlID0gJ0RFQ1JZUFRJT05fRkFJTEVEJ1xuICAgICAgdGhyb3cgZXJyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG5cbi8vIFBvcHVsYXRlIHByb2Nlc3MuZW52IHdpdGggcGFyc2VkIHZhbHVlc1xuZnVuY3Rpb24gcG9wdWxhdGUgKHByb2Nlc3NFbnYsIHBhcnNlZCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGRlYnVnID0gQm9vbGVhbihvcHRpb25zICYmIG9wdGlvbnMuZGVidWcpXG4gIGNvbnN0IG92ZXJyaWRlID0gQm9vbGVhbihvcHRpb25zICYmIG9wdGlvbnMub3ZlcnJpZGUpXG5cbiAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKCdPQkpFQ1RfUkVRVUlSRUQ6IFBsZWFzZSBjaGVjayB0aGUgcHJvY2Vzc0VudiBhcmd1bWVudCBiZWluZyBwYXNzZWQgdG8gcG9wdWxhdGUnKVxuICAgIGVyci5jb2RlID0gJ09CSkVDVF9SRVFVSVJFRCdcbiAgICB0aHJvdyBlcnJcbiAgfVxuXG4gIC8vIFNldCBwcm9jZXNzLmVudlxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXJzZWQpKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9jZXNzRW52LCBrZXkpKSB7XG4gICAgICBpZiAob3ZlcnJpZGUgPT09IHRydWUpIHtcbiAgICAgICAgcHJvY2Vzc0VudltrZXldID0gcGFyc2VkW2tleV1cbiAgICAgIH1cblxuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGlmIChvdmVycmlkZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIF9kZWJ1ZyhgXCIke2tleX1cIiBpcyBhbHJlYWR5IGRlZmluZWQgYW5kIFdBUyBvdmVyd3JpdHRlbmApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2RlYnVnKGBcIiR7a2V5fVwiIGlzIGFscmVhZHkgZGVmaW5lZCBhbmQgd2FzIE5PVCBvdmVyd3JpdHRlbmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0VudltrZXldID0gcGFyc2VkW2tleV1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgRG90ZW52TW9kdWxlID0ge1xuICBjb25maWdEb3RlbnYsXG4gIF9jb25maWdWYXVsdCxcbiAgX3BhcnNlVmF1bHQsXG4gIGNvbmZpZyxcbiAgZGVjcnlwdCxcbiAgcGFyc2UsXG4gIHBvcHVsYXRlXG59XG5cbm1vZHVsZS5leHBvcnRzLmNvbmZpZ0RvdGVudiA9IERvdGVudk1vZHVsZS5jb25maWdEb3RlbnZcbm1vZHVsZS5leHBvcnRzLl9jb25maWdWYXVsdCA9IERvdGVudk1vZHVsZS5fY29uZmlnVmF1bHRcbm1vZHVsZS5leHBvcnRzLl9wYXJzZVZhdWx0ID0gRG90ZW52TW9kdWxlLl9wYXJzZVZhdWx0XG5tb2R1bGUuZXhwb3J0cy5jb25maWcgPSBEb3RlbnZNb2R1bGUuY29uZmlnXG5tb2R1bGUuZXhwb3J0cy5kZWNyeXB0ID0gRG90ZW52TW9kdWxlLmRlY3J5cHRcbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gRG90ZW52TW9kdWxlLnBhcnNlXG5tb2R1bGUuZXhwb3J0cy5wb3B1bGF0ZSA9IERvdGVudk1vZHVsZS5wb3B1bGF0ZVxuXG5tb2R1bGUuZXhwb3J0cyA9IERvdGVudk1vZHVsZVxuIiwgImltcG9ydCBwZGZqcyBmcm9tIFwiQGJ1bmRsZWQtZXMtbW9kdWxlcy9wZGZqcy1kaXN0L2J1aWxkL3BkZlwiO1xuaW1wb3J0IHZpZXdlciBmcm9tIFwiQGJ1bmRsZWQtZXMtbW9kdWxlcy9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyXCI7XG5pbXBvcnQgT3BlbkFJIGZyb20gXCJvcGVuYWlcIjtcbmltcG9ydCBHcm9xIGZyb20gXCJncm9xLXNka1wiO1xuaW1wb3J0IHsgYXJvdW5kIH0gZnJvbSBcIm1vbmtleS1hcm91bmRcIjtcbmltcG9ydCB7IENhbnZhcywgVmlld3BvcnROb2RlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gICAgQXBwLFxuICAgIEVkaXRvcixcbiAgICBNYXJrZG93blZpZXcsXG4gICAgTW9kYWwsXG4gICAgTm90aWNlLFxuICAgIFBsdWdpbixcbiAgICBQbHVnaW5TZXR0aW5nVGFiLFxuICAgIFNldHRpbmcsXG4gICAgSXRlbVZpZXcsXG4gICAgV29ya3NwYWNlTGVhZixcbiAgICBzZXRUb29sdGlwLFxuICAgIHNldEljb24sXG4gICAgVmlldyxcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge1xuICAgIE5vZGVTaWRlLFxuICAgIEVkZ2VFbmQsXG4gICAgQ2FudmFzQ29sb3IsXG4gICAgQ2FudmFzRGF0YSxcbiAgICBDYW52YXNFZGdlRGF0YSxcbiAgICBDYW52YXNGaWxlRGF0YSxcbiAgICBDYW52YXNHcm91cERhdGEsXG4gICAgQ2FudmFzTGlua0RhdGEsXG4gICAgQ2FudmFzTm9kZURhdGEsXG4gICAgQ2FudmFzVGV4dERhdGEsXG4gICAgQWxsQ2FudmFzTm9kZURhdGEsXG59IGZyb20gXCJvYnNpZGlhbi9jYW52YXNcIjtcbmltcG9ydCB7IHN5bnRheFRyZWUgfSBmcm9tIFwiQGNvZGVtaXJyb3IvbGFuZ3VhZ2VcIjtcbmltcG9ydCB7IEV4dGVuc2lvbiwgUmFuZ2VTZXRCdWlsZGVyLCBTdGF0ZUZpZWxkLCBUcmFuc2FjdGlvbiB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCwgRWRpdG9yVmlldywgV2lkZ2V0VHlwZSB9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQgKiBhcyBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuLy8gZG90ZW52LmNvbmZpZyh7IGRlYnVnOiB0cnVlfVxuXG5jb25zdCBiYXNlUGF0aCA9IFwiL1VzZXJzL2phY29iY29sbGluZy9Eb2N1bWVudHMvYWNjZWxlcmF0ZS9hY2NlbGVyYXRlL1wiO1xuXG5kb3RlbnYuY29uZmlnKHtcbiAgICBwYXRoOiBgJHtiYXNlUGF0aH0vLm9ic2lkaWFuL3BsdWdpbnMvY2FyZXQvLmVudmAsXG59KTtcblxuY29uc3QgZ3JvcV9hcGlfa2V5ID0gcHJvY2Vzcy5lbnYuR1JPUV9BUElfS0VZO1xuY29uc3Qgb3BlbmFpX2tleSA9IHByb2Nlc3MuZW52Lk9QRU5BSV9LRVk7XG5jb25zdCBncm9xID0gbmV3IEdyb3EoeyBhcGlLZXk6IGdyb3FfYXBpX2tleSwgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXI6IHRydWUgfSk7XG5jb25zdCBvcGVuYWkgPSBuZXcgT3BlbkFJKHsgYXBpS2V5OiBvcGVuYWlfa2V5LCBkYW5nZXJvdXNseUFsbG93QnJvd3NlcjogdHJ1ZSB9KTtcblxuLy8gU3RhcnQgb2Ygbm9kZSBhbmQgZWRnZSBmdW5jdGlvbnNcbmludGVyZmFjZSBlZGdlVCB7XG4gICAgZnJvbU9yVG86IHN0cmluZztcbiAgICBzaWRlOiBzdHJpbmc7XG4gICAgbm9kZTogQ2FudmFzTm9kZURhdGE7XG59XG5cbmludGVyZmFjZSBUcmVlTm9kZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjaGlsZHJlbjogVHJlZU5vZGVbXTtcbn1cblxuaW50ZXJmYWNlIE5vZGUge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBFZGdlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGZyb21Ob2RlOiBzdHJpbmc7XG4gICAgZnJvbVNpZGU6IHN0cmluZztcbiAgICB0b05vZGU6IHN0cmluZztcbiAgICB0b1NpZGU6IHN0cmluZztcbn1cbmV4cG9ydCBjbGFzcyBDTURKTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgcmVzdWx0OiBzdHJpbmc7XG4gICAgc2VsZWN0ZWRUZXh0OiBzdHJpbmc7XG4gICAgc3RhcnRJbmRleDogbnVtYmVyO1xuICAgIGVuZEluZGV4OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgc2VsZWN0ZWRUZXh0OiBzdHJpbmcsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcikge1xuICAgICAgICBzdXBlcihhcHApO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IHNlbGVjdGVkVGV4dDtcbiAgICAgICAgdGhpcy5zdGFydEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICAgICAgdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4O1xuICAgIH1cblxuICAgIG9uT3BlbigpIHtcbiAgICAgICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHRleHREaXNwbGF5ID0gY29udGVudEVsLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuc2VsZWN0ZWRUZXh0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGV4dERpc3BsYXkuc3R5bGUuaGVpZ2h0ID0gXCI2MHB4XCI7XG4gICAgICAgIHRleHREaXNwbGF5LnN0eWxlLm92ZXJmbG93ID0gXCJzY3JvbGxcIjtcblxuICAgICAgICBjb250ZW50RWwuY3JlYXRlRWwoXCJiclwiKTsgLy8gTGluZSBicmVha1xuXG4gICAgICAgIGNvbnN0IHRleHRBcmVhID0gY29udGVudEVsLmNyZWF0ZUVsKFwidGV4dGFyZWFcIiwge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiVHlwZSBoZXJlLi4uXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0ZXh0QXJlYS5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5taW5IZWlnaHQgPSBcIjEwMHB4XCI7XG4gICAgICAgIHRleHRBcmVhLnN0eWxlLnJlc2l6ZSA9IFwibm9uZVwiO1xuICAgICAgICB0ZXh0QXJlYS5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuaGVpZ2h0ID0gXCJcIjsgLy8gUmVzZXQgdGhlIGhlaWdodFxuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuaGVpZ2h0ID0gYCR7dGV4dEFyZWEuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBjb250ZW50RWwuY3JlYXRlRWwoXCJkaXZcIiwgeyBjbHM6IFwiYnV0dG9uLWNvbnRhaW5lclwiIH0pO1xuICAgICAgICAvLyBidXR0b25Db250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuICAgICAgICAvLyBidXR0b25Db250YWluZXIuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSBcInNwYWNlLWJldHdlZW5cIjsgLy8gVGhpcyB3aWxsIHNwYWNlIHRoZSBidXR0b25zIGV2ZW5seVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgXCJBcHBlbmQgT3V0cHV0XCIgYnV0dG9uXG4gICAgICAgIG5ldyBTZXR0aW5nKGJ1dHRvbkNvbnRhaW5lcilcbiAgICAgICAgICAgIC5hZGRCdXR0b24oKGJ0bikgPT5cbiAgICAgICAgICAgICAgICBidG5cbiAgICAgICAgICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoXCJBcHBlbmQgT3V0cHV0XCIpXG5cbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB0ZXh0QXJlYS52YWx1ZTsgLy8gQ2FwdHVyZSB0aGUgdmFsdWUgZnJvbSB0aGUgdGV4dGFyZWFcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuc3VibWl0X2VkaXQodGhpcy5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRfcmVzcG9uc2UoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkQnV0dG9uKChidG4pID0+XG4gICAgICAgICAgICAgICAgYnRuXG4gICAgICAgICAgICAgICAgICAgIC5zZXRCdXR0b25UZXh0KFwiUmVwbGFjZVwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB0ZXh0QXJlYS52YWx1ZTsgLy8gQ2FwdHVyZSB0aGUgdmFsdWUgZnJvbSB0aGUgdGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnN1Ym1pdF9lZGl0KHRoaXMucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlfZGVsZXRlKHRoaXMucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0X3Jlc3BvbnNlKGNvbnRlbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXRfZWRpdChyZXN1bHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGBcblBsZWFzZSBhcHBseSB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB0byB0aGUgYmVsb3cgY29udGVudDpcblxuSW5zdHJ1Y3Rpb25zOlxuJHt0aGlzLnJlc3VsdH1cblxuQ29udGVudDpcbiR7dGhpcy5zZWxlY3RlZFRleHR9XG5cbiMjIFJ1bGVzOlxuLSBKdXN0IHJldHVybiB0aGUgcmVwb25zZSB0aGF0IGZvbGxvd3MgdGhlIGluc3RydWN0aW9ucy4gTm8gbmVlZCB0byBpbmNsdWRlIGEgcHJlYW1wbGUgb3IgYW55dGhpbmdcblxuIyMgTWFya2Rvd24gRm9ybWF0dGluZzogXG5BbHdheXMgYXBwbHkgbWFya2Rvd24gZm9ybWF0dGluZy4gRm9yIGtleXdvcmRzIHVzZSB0aGUgZm9sbG93aW5nOlxuXHR0b2RvcyAtIFByZXBlbmQgdG9kbyBsaW5lcyB3aXRoOlxuXHQtIFsgXSBcbmAudHJpbSgpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IG1lc3NhZ2UgfTtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKFwiaHR0cDovL2xvY2FsaG9zdDo4MDAwL3NpbmdsZS10dXJuXCIsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dC5jb250ZW50O1xuICAgIH1cblxuICAgIGluc2VydF9yZXNwb25zZShyZXNwb25zZTogc3RyaW5nLCByZXBsYWNlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZWRpdG9yO1xuICAgICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmVuZEluZGV4O1xuICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IGVkaXRvci5vZmZzZXRUb1BvcyhpbmRleCk7XG4gICAgICAgICAgICBlZGl0b3IucmVwbGFjZVJhbmdlKGBcXG58KyR7cmVzcG9uc2V9K3xgLCBwb3MpO1xuICAgICAgICAgICAgZWRpdG9yLnNldEN1cnNvcihwb3MpOyAvLyBPcHRpb25hbGx5IHNldCB0aGUgY3Vyc29yIGFmdGVyIHRoZSBpbnNlcnRlZCB0ZXh0XG4gICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTsgLy8gRm9jdXMgdGhlIGVkaXRvciBhZnRlciBpbnNlcnRpbmcgdGV4dFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlfZGVsZXRlKHRleHQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5lZGl0b3I7XG4gICAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VsZWN0ZWRUZXh0KTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVUZXh0ID0gY29udGVudC5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyVGV4dCA9IGNvbnRlbnQuc3Vic3RyaW5nKGluZGV4ICsgdGhpcy5zZWxlY3RlZFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gYmVmb3JlVGV4dCArIGB8LSR7dGhpcy5zZWxlY3RlZFRleHR9LXxgICsgYWZ0ZXJUZXh0O1xuICAgICAgICAgICAgICAgIGVkaXRvci5zZXRWYWx1ZShuZXdUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgIGxldCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVkQmFja2dyb3VuZEZpZWxkID0gU3RhdGVGaWVsZC5kZWZpbmU8RGVjb3JhdGlvblNldD4oe1xuICAgIGNyZWF0ZShzdGF0ZSk6IERlY29yYXRpb25TZXQge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgIH0sXG4gICAgdXBkYXRlKG9sZFN0YXRlOiBEZWNvcmF0aW9uU2V0LCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiBEZWNvcmF0aW9uU2V0IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXI8RGVjb3JhdGlvbj4oKTtcbiAgICAgICAgY29uc3QgZG9jVGV4dCA9IHRyYW5zYWN0aW9uLnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBkZWxldGVfcmVnZXggPSAvXFx8LSguKj8pLVxcfC9nczsgLy8gQ2hhbmdlZCB0byBtYXRjaCBhY3Jvc3MgbGluZXNcbiAgICAgICAgY29uc3QgYWRkX3JlZ2V4ID0gL1xcfFxcKyguKj8pXFwrXFx8L2dzOyAvLyBDaGFuZ2VkIHRvIG1hdGNoIGFjcm9zcyBsaW5lc1xuICAgICAgICBsZXQgZGVsZXRlX21hdGNoO1xuICAgICAgICBsZXQgYWRkX21hdGNoO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG5cbiAgICAgICAgd2hpbGUgKChkZWxldGVfbWF0Y2ggPSBkZWxldGVfcmVnZXguZXhlYyhkb2NUZXh0KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gZGVsZXRlX21hdGNoLmluZGV4O1xuICAgICAgICAgICAgY29uc3QgZW5kID0gZGVsZXRlX3JlZ2V4Lmxhc3RJbmRleDtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgc3RhcnQsIGVuZCwgc3R5bGU6IFwiYmFja2dyb3VuZC1jb2xvcjogI2Y1NmM2MjtcIiB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlICgoYWRkX21hdGNoID0gYWRkX3JlZ2V4LmV4ZWMoZG9jVGV4dCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGFkZF9tYXRjaC5pbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IGFkZF9yZWdleC5sYXN0SW5kZXg7XG4gICAgICAgICAgICByYW5nZXMucHVzaCh7IHN0YXJ0LCBlbmQsIHN0eWxlOiBcImJhY2tncm91bmQtY29sb3I6ICM2NGY1NjI7XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydCByYW5nZXMgYnkgc3RhcnQgcG9zaXRpb25cbiAgICAgICAgcmFuZ2VzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnQgLSBiLnN0YXJ0KTtcblxuICAgICAgICAvLyBBZGQgc29ydGVkIHJhbmdlcyB0byB0aGUgYnVpbGRlclxuICAgICAgICByYW5nZXMuZm9yRWFjaCgocmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkKFxuICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgIHJhbmdlLmVuZCxcbiAgICAgICAgICAgICAgICBEZWNvcmF0aW9uLm1hcmsoe1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7IHN0eWxlOiByYW5nZS5zdHlsZSB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICB9LFxuICAgIHByb3ZpZGUoZmllbGQ6IFN0YXRlRmllbGQ8RGVjb3JhdGlvblNldD4pOiBFeHRlbnNpb24ge1xuICAgICAgICByZXR1cm4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGZpZWxkKTtcbiAgICB9LFxufSk7XG4vLyBSZW1lbWJlciB0byByZW5hbWUgdGhlc2UgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyFcblxuaW50ZXJmYWNlIE15UGx1Z2luU2V0dGluZ3Mge1xuICAgIG15U2V0dGluZzogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBNeVBsdWdpblNldHRpbmdzID0ge1xuICAgIG15U2V0dGluZzogXCJkZWZhdWx0XCIsXG59O1xuXG5leHBvcnQgY29uc3QgVklFV19OQU1FX1NJREVCQVJfQ0hBVCA9IFwic2lkZWJhci1jYXJldFwiO1xuY2xhc3MgU2lkZWJhckNoYXQgZXh0ZW5kcyBJdGVtVmlldyB7XG4gICAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZikge1xuICAgICAgICBzdXBlcihsZWFmKTtcbiAgICB9XG4gICAgdGV4dEJveDogSFRNTFRleHRBcmVhRWxlbWVudDtcbiAgICBtZXNzYWdlc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7IC8vIENvbnRhaW5lciBmb3IgbWVzc2FnZXNcblxuICAgIGdldFZpZXdUeXBlKCkge1xuICAgICAgICByZXR1cm4gVklFV19OQU1FX1NJREVCQVJfQ0hBVDtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5VGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIFZJRVdfTkFNRV9TSURFQkFSX0NIQVQ7XG4gICAgfVxuXG4gICAgYXN5bmMgb25PcGVuKCkge1xuICAgICAgICBjb25zdCBtZXRhY29udGFpbmVyID0gdGhpcy5jb250YWluZXJFbC5jaGlsZHJlblsxXTtcbiAgICAgICAgbWV0YWNvbnRhaW5lci5lbXB0eSgpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBtZXRhY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsczogXCJjb250YWluZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGFjb250YWluZXIucHJlcGVuZChjb250YWluZXIpO1xuICAgICAgICAvLyB0aGlzLmNvbnRhaW5lckVsLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGZvciBtZXNzYWdlc1xuICAgICAgICB0aGlzLm1lc3NhZ2VzQ29udGFpbmVyID0gY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsczogXCJtZXNzYWdlcy1jb250YWluZXJcIixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIGEgXCJIZWxsbyBXb3JsZFwiIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKFwiTUxYIFRlc3RpbmdcIiwgXCJzeXN0ZW1cIik7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhdElucHV0QXJlYShjb250YWluZXIpO1xuICAgIH1cbiAgICBjcmVhdGVDaGF0SW5wdXRBcmVhKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGZvciB0aGUgdGV4dCBib3ggYW5kIHRoZSBzdWJtaXQgYnV0dG9uXG4gICAgICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsczogXCJjaGF0LWlucHV0LWNvbnRhaW5lclwiLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHRleHQgYm94IHdpdGhpbiB0aGUgaW5wdXQgY29udGFpbmVyXG4gICAgICAgIHRoaXMudGV4dEJveCA9IGlucHV0Q29udGFpbmVyLmNyZWF0ZUVsKFwidGV4dGFyZWFcIiwge1xuICAgICAgICAgICAgY2xzOiBcImZ1bGxfd2lkdGhfdGV4dF9jb250YWluZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGV4dEJveC5wbGFjZWhvbGRlciA9IFwiVHlwZSBzb21ldGhpbmcuLi5cIjtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHN1Ym1pdCBidXR0b24gd2l0aGluIHRoZSBpbnB1dCBjb250YWluZXJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gaW5wdXRDb250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIik7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IFwiU3VibWl0XCI7XG4gICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRNZXNzYWdlKHRoaXMudGV4dEJveC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnRleHRCb3gudmFsdWUgPSBcIlwiOyAvLyBDbGVhciB0aGUgdGV4dCBib3ggYWZ0ZXIgc2VuZGluZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRNZXNzYWdlKHRleHQ6IHN0cmluZywgc2VuZGVyOiBcInVzZXJcIiB8IFwic3lzdGVtXCIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZURpdiA9IHRoaXMubWVzc2FnZXNDb250YWluZXIuY3JlYXRlRWwoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xzOiBgbWVzc2FnZSAke3NlbmRlcn1gLFxuICAgICAgICB9KTtcbiAgICAgICAgbWVzc2FnZURpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgfVxuXG4gICAgc3VibWl0TWVzc2FnZSh1c2VyTWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjdXJyZW50X3BhZ2VfY29udGVudCA9IFwiXCI7XG4gICAgICAgIGlmICh1c2VyTWVzc2FnZS5pbmNsdWRlcyhcIkBjdXJyZW50XCIpKSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBNYXJrZG93blZpZXcgdGhhdCBpcyBvcGVuIGluIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICAgIGNvbnN0IG1hcmtkb3duVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZVxuICAgICAgICAgICAgICAgIC5nZXRMZWF2ZXNPZlR5cGUoXCJtYXJrZG93blwiKVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAuZmluZCgobGVhZikgPT4gbGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIGxlYWYud2lkdGggPiAwKT8udmlldyBhcyBNYXJrZG93blZpZXc7XG4gICAgICAgICAgICBpZiAobWFya2Rvd25WaWV3ICYmIG1hcmtkb3duVmlldy5lZGl0b3IpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50X3BhZ2VfY29udGVudCA9IG1hcmtkb3duVmlldy5lZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZE1lc3NhZ2UodXNlck1lc3NhZ2UsIFwidXNlclwiKTsgLy8gRGlzcGxheSB0aGUgdXNlciBtZXNzYWdlIGltbWVkaWF0ZWx5XG5cbiAgICAgICAgY29uc3QgY3VycmVudF9wYWdlX21lc3NhZ2UgPSBgXG5cdFx0JHt1c2VyTWVzc2FnZX1cblxuXHRcdC0tLS0tLSBOb3RlIGZvciBNb2RlbCAtLS0gXG5cdFx0V2hlbiBJIGFtIHJlZmVycmluZyB0byBAY3VycmVudCwgSSBtZWFudCB0aGUgZm9sbG93aW5nOlxuXG5cdFx0JHtjdXJyZW50X3BhZ2VfY29udGVudH1cblx0XHRgO1xuXG4gICAgICAgIGxldCBmaW5hbF9tZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICAgIGlmIChjdXJyZW50X3BhZ2VfY29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaW5hbF9tZXNzYWdlID0gY3VycmVudF9wYWdlX21lc3NhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0geyBtZXNzYWdlOiBmaW5hbF9tZXNzYWdlIH07XG4gICAgICAgIGZldGNoKFwiaHR0cDovL2xvY2FsaG9zdDo4MDAwL2NvbnZlcnNhdGlvblwiLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTWVzc2FnZShkYXRhLnJlc3BvbnNlLCBcInN5c3RlbVwiKTsgLy8gRGlzcGxheSB0aGUgcmVzcG9uc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOlwiLCBlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkNsb3NlKCkge1xuICAgICAgICAvLyBDbGVhbnVwIGxvZ2ljIGlmIG5lY2Vzc2FyeVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZJRVdfTkFNRV9NQUlOX0NIQVQgPSBcIm1haW4tY2FyZXRcIjtcbmNsYXNzIE1haW5DaGF0IGV4dGVuZHMgSXRlbVZpZXcge1xuICAgIGNoYXRfaWQ6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgbGVhZjogV29ya3NwYWNlTGVhZixcbiAgICAgICAgY2hhdF9pZD86IHN0cmluZyxcbiAgICAgICAgY29udmVyc2F0aW9uOiB7IGNvbnRlbnQ6IHN0cmluZzsgcm9sZTogXCJ1c2VyXCIgfCBcInN5c3RlbVwiIH1bXSA9IFtdXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGxlYWYpO1xuICAgICAgICB0aGlzLmNoYXRfaWQgPSBjaGF0X2lkIHx8IHRoaXMuZ2VuZXJhdGVSYW5kb21JRCg1KTtcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb24gPSBjb252ZXJzYXRpb247IC8vIEluaXRpYWxpemUgY29udmVyc2F0aW9uIGxpc3Qgd2l0aCBkZWZhdWx0IG9yIHBhc3NlZCB2YWx1ZVxuICAgIH1cbiAgICB0ZXh0Qm94OiBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgIG1lc3NhZ2VzQ29udGFpbmVyOiBIVE1MRWxlbWVudDsgLy8gQ29udGFpbmVyIGZvciBtZXNzYWdlc1xuICAgIGNvbnZlcnNhdGlvbjogeyBjb250ZW50OiBzdHJpbmc7IHJvbGU6IFwidXNlclwiIHwgXCJzeXN0ZW1cIiB9W107IC8vIExpc3QgdG8gc3RvcmUgY29udmVyc2F0aW9uIG1lc3NhZ2VzXG5cbiAgICBnZXRWaWV3VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFZJRVdfTkFNRV9NQUlOX0NIQVQ7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVRleHQoKSB7XG4gICAgICAgIHJldHVybiBgTUxYIExvY2FsIENoYXQ6ICR7dGhpcy5jaGF0X2lkfWA7XG4gICAgfVxuXG4gICAgYXN5bmMgb25PcGVuKCkge1xuICAgICAgICBjb25zdCBtZXRhY29udGFpbmVyID0gdGhpcy5jb250YWluZXJFbC5jaGlsZHJlblsxXTtcbiAgICAgICAgbWV0YWNvbnRhaW5lci5lbXB0eSgpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBtZXRhY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsczogXCJjb250YWluZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGFjb250YWluZXIucHJlcGVuZChjb250YWluZXIpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgbWVzc2FnZXNcbiAgICAgICAgdGhpcy5tZXNzYWdlc0NvbnRhaW5lciA9IGNvbnRhaW5lci5jcmVhdGVFbChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbHM6IFwibWVzc2FnZXMtY29udGFpbmVyXCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlbmRlciBpbml0aWFsIGNvbnZlcnNhdGlvblxuICAgICAgICB0aGlzLnJlbmRlckNvbnZlcnNhdGlvbigpO1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXRJbnB1dEFyZWEoY29udGFpbmVyKTtcbiAgICB9XG4gICAgY3JlYXRlQ2hhdElucHV0QXJlYShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgdGhlIHRleHQgYm94XG4gICAgICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHt9KTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHRleHQgYm94IHdpdGhpbiB0aGUgaW5wdXQgY29udGFpbmVyXG4gICAgICAgIHRoaXMudGV4dEJveCA9IGlucHV0Q29udGFpbmVyLmNyZWF0ZUVsKFwidGV4dGFyZWFcIiwge1xuICAgICAgICAgICAgY2xzOiBcImZ1bGxfd2lkdGhfdGV4dF9jb250YWluZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGV4dEJveC5wbGFjZWhvbGRlciA9IFwiVHlwZSBzb21ldGhpbmcuLi5cIjtcblxuICAgICAgICAvLyBDcmVhdGUgYSBzZXBhcmF0ZSBjb250YWluZXIgZm9yIGJ1dHRvbnMgd2l0aGluIHRoZSBpbnB1dCBjb250YWluZXJcbiAgICAgICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gaW5wdXRDb250YWluZXIuY3JlYXRlRWwoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xzOiBcImJ1dHRvbi1jb250YWluZXJcIixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBzYXZlIGJ1dHRvbiB3aXRoaW4gdGhlIGJ1dHRvbiBjb250YWluZXJcbiAgICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IGJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiKTtcbiAgICAgICAgc2F2ZUJ1dHRvbi50ZXh0Q29udGVudCA9IFwiU2F2ZSBDaGF0XCI7XG4gICAgICAgIHNhdmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNoYXQoKTsgLy8gQ2FsbCB0aGUgc2F2ZUNoYXQgZnVuY3Rpb24gdG8gc2F2ZSB0aGUgY29udmVyc2F0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgc3VibWl0IGJ1dHRvbiB3aXRoaW4gdGhlIGJ1dHRvbiBjb250YWluZXJcbiAgICAgICAgY29uc3Qgc3VibWl0QnV0dG9uID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKFwiYnV0dG9uXCIpO1xuICAgICAgICBzdWJtaXRCdXR0b24udGV4dENvbnRlbnQgPSBcIlN1Ym1pdFwiO1xuICAgICAgICBzdWJtaXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0TWVzc2FnZSh0aGlzLnRleHRCb3gudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy50ZXh0Qm94LnZhbHVlID0gXCJcIjsgLy8gQ2xlYXIgdGhlIHRleHQgYm94IGFmdGVyIHNlbmRpbmdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkTWVzc2FnZSh0ZXh0OiBzdHJpbmcsIHNlbmRlcjogXCJ1c2VyXCIgfCBcInN5c3RlbVwiKSB7XG4gICAgICAgIC8vIEFkZCBtZXNzYWdlIHRvIHRoZSBjb252ZXJzYXRpb24gYXJyYXlcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb24ucHVzaCh7IGNvbnRlbnQ6IHRleHQsIHJvbGU6IHNlbmRlciB9KTtcbiAgICAgICAgLy8gUmUtcmVuZGVyIHRoZSBjb252ZXJzYXRpb24gaW4gdGhlIEhUTUxcbiAgICAgICAgdGhpcy5yZW5kZXJDb252ZXJzYXRpb24oKTtcbiAgICB9XG5cbiAgICByZW5kZXJDb252ZXJzYXRpb24oKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IG1lc3NhZ2VzXG4gICAgICAgIHRoaXMubWVzc2FnZXNDb250YWluZXIuZW1wdHkoKTtcblxuICAgICAgICAvLyBBZGQgZWFjaCBtZXNzYWdlIGluIHRoZSBjb252ZXJzYXRpb24gdG8gdGhlIG1lc3NhZ2VzIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbi5mb3JFYWNoKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlRGl2ID0gdGhpcy5tZXNzYWdlc0NvbnRhaW5lci5jcmVhdGVFbChcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgY2xzOiBgbWVzc2FnZSAke21lc3NhZ2Uucm9sZX1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtZXNzYWdlRGl2LnRleHRDb250ZW50ID0gbWVzc2FnZS5jb250ZW50O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXRNZXNzYWdlKHVzZXJNZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKHVzZXJNZXNzYWdlLCBcInVzZXJcIik7IC8vIERpc3BsYXkgdGhlIHVzZXIgbWVzc2FnZSBpbW1lZGlhdGVseVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBjb252ZXJzYXRpb246IHRoaXMuY29udmVyc2F0aW9uLFxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9jb252ZXJzYXRpb25cIiwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2Uob3V0cHV0LnJlc3BvbnNlLCBcInN5c3RlbVwiKTsgLy8gRGlzcGxheSB0aGUgcmVzcG9uc2VcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNhdmVDaGF0KCkge1xuICAgICAgICBjb25zdCBjaGF0X2ZvbGRlcl9wYXRoID0gXCJjaGF0cy9cIjtcbiAgICAgICAgY29uc3QgZmlsZV9uYW1lID0gYCR7dGhpcy5jaGF0X2lkfS5tZGA7XG4gICAgICAgIGNvbnN0IGZpbGVfcGF0aCA9IGNoYXRfZm9sZGVyX3BhdGggKyBmaWxlX25hbWU7XG5cbiAgICAgICAgbGV0IGZpbGVfY29udGVudCA9IGBcXGBcXGBcXGB4bWxcblx0XHQ8bWV0YWRhdGE+XFxuPGlkPiR7dGhpcy5jaGF0X2lkfTwvaWQ+XFxuPC9tZXRhZGF0YT5cblx0XHRgO1xuXG4gICAgICAgIGxldCBtZXNzYWdlcyA9IGBgO1xuXG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VfeG1sID0gYFxuXHRcdFx0PG1lc3NhZ2U+XG5cdFx0XHRcdDxyb2xlPiR7bWVzc2FnZS5yb2xlfTwvcm9sZT5cblx0XHRcdFx0PGNvbnRlbnQ+JHttZXNzYWdlLmNvbnRlbnR9PC9jb250ZW50PlxuXHRcdFx0PC9tZXNzYWdlPlxuXHRcdFx0YC50cmltKCk7XG4gICAgICAgICAgICBtZXNzYWdlcyArPSBtZXNzYWdlX3htbDtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjb252ZXJzYXRpb24gPSBgPGNvbnZlcnNhdGlvbj5cXG4ke21lc3NhZ2VzfTwvY29udmVyc2F0aW9uPlxcYFxcYFxcYGA7XG4gICAgICAgIGZpbGVfY29udGVudCArPSBjb252ZXJzYXRpb247XG4gICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5nZXRGaWxlQnlQYXRoKGZpbGVfcGF0aCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQubW9kaWZ5KGZpbGUsIGZpbGVfY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNyZWF0ZShmaWxlX3BhdGgsIGZpbGVfY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNhdmUgY2hhdDpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVSYW5kb21JRChsZW5ndGg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhc3luYyBvbkNsb3NlKCkge1xuICAgICAgICAvLyBDbGVhbnVwIGxvZ2ljIGlmIG5lY2Vzc2FyeVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICAgIHNldHRpbmdzOiBNeVBsdWdpblNldHRpbmdzO1xuICAgIGFzeW5jIG9ubG9hZCgpIHtcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcInBhdGNoLW1lbnVcIixcbiAgICAgICAgICAgIG5hbWU6IFwiUGF0Y2ggTWVudVwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGNoQ2FudmFzTWVudSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudChcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbihcImFjdGl2ZS1sZWFmLWNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudExlYWY/LnZpZXcuZ2V0Vmlld1R5cGUoKSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdGNoQ2FudmFzTWVudSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckVkaXRvckV4dGVuc2lvbihbcmVkQmFja2dyb3VuZEZpZWxkXSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIHNpZGViYXIgaWNvblxuICAgICAgICB0aGlzLmFkZFNpZGViYXJUYWIoKTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwibG9nXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkxvZ1wiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGVhZj8udmlldy5nZXRWaWV3VHlwZSgpID09PSBcImNhbnZhc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhc1ZpZXcgPSBjdXJyZW50TGVhZi52aWV3O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSAoY2FudmFzVmlldyBhcyBhbnkpLmNhbnZhcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnROb2RlcyA9IGNhbnZhcy5nZXRWaWV3cG9ydE5vZGVzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImNhbnZhcy1wcm9tcHRcIixcbiAgICAgICAgICAgIG5hbWU6IFwiQ2FudmFzIFByb21wdFwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGVhZj8udmlldy5nZXRWaWV3VHlwZSgpID09PSBcImNhbnZhc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhc1ZpZXcgPSBjdXJyZW50TGVhZi52aWV3O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSAoY2FudmFzVmlldyBhcyBhbnkpLmNhbnZhcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gY2FudmFzLnNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF2ZXJhZ2VfeSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhdmVyYWdlX2hlaWdodCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhdmVyYWdlX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1heF94ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsX3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxfaGVpZ2h0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsX3dpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsbF90ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvYmogb2Ygc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHgsIHksIGhlaWdodCwgd2lkdGggfSA9IG9iajtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heF94ID0gTWF0aC5tYXgobWF4X3gsIHgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfeSArPSB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfaGVpZ2h0ICs9IGhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3dpZHRoICs9IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcInRleHRcIiBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRleHQgfSA9IG9iajtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF90ZXh0ICs9IHRleHQgKyBcIlxcblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcImZpbGVQYXRoXCIgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHsgZmlsZVBhdGggfSA9IG9iajtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuZ2V0RmlsZUJ5UGF0aChmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVfdGV4dCA9IGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGU6ICR7ZmlsZVBhdGgucmVwbGFjZShcIi5tZFwiLCBcIlwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0ZXh0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX3RleHQgKz0gZmlsZV90ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhdmVyYWdlX3kgPSBjb3VudCA+IDAgPyB0b3RhbF95IC8gY291bnQgOiAwO1xuICAgICAgICAgICAgICAgICAgICBhdmVyYWdlX2hlaWdodCA9IGNvdW50ID4gMCA/IHRvdGFsX2hlaWdodCAvIGNvdW50IDogMDtcbiAgICAgICAgICAgICAgICAgICAgYXZlcmFnZV93aWR0aCA9IGNvdW50ID4gMCA/IHRvdGFsX3dpZHRoIC8gY291bnQgOiAwO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgbW9kZWwgLS0tXG4gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG1vZGFsIHdpdGggYSB0ZXh0IGlucHV0IGFuZCBhIHN1Ym1pdCBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kYWwgPSBuZXcgTW9kYWwodGhpcy5hcHApO1xuICAgICAgICAgICAgICAgICAgICBtb2RhbC5jb250ZW50RWwuY3JlYXRlRWwoXCJoMVwiLCB7IHRleHQ6IFwiQ2FudmFzIFByb21wdFwiIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBtb2RhbC5jb250ZW50RWwuY3JlYXRlRGl2KHsgY2xzOiBcImZsZXgtY29sXCIgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRBcmVhID0gY29udGFpbmVyLmNyZWF0ZUVsKFwidGV4dGFyZWFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbHM6IFwidy1mdWxsIG1iLTJcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbiA9IGNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiLCB7IHRleHQ6IFwiU3VibWl0XCIgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5vbmNsaWNrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdCA9IGBcbiAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBkbyB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgICAgICAgICAgICAgJHt0ZXh0QXJlYS52YWx1ZX1cblxuICAgICAgICAgICAgICAgICAgICAgICAgR2l2ZW4gdGhpcyBjb250ZW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgJHthbGxfdGV4dH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBvbmVfc2hvdChwcm9tcHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGVDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiB7IHg6IG1heF94ICsgNTAsIHk6IGF2ZXJhZ2VfeSB9LCAvLyBQb3NpdGlvbiBvbiB0aGUgY2FudmFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyB3aWR0aDogYXZlcmFnZV93aWR0aCwgaGVpZ2h0OiBhdmVyYWdlX2hlaWdodCB9LCAvLyBTaXplIG9mIHRoZSB0ZXh0IGJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImNlbnRlclwiLCAvLyBUaGlzIG1pZ2h0IHJlbGF0ZSB0byB0ZXh0IGFsaWdubWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNvbnRlbnQsIC8vIFRleHQgY29udGVudCBmcm9tIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZTogdHJ1ZSwgLy8gU2F2ZSB0aGlzIG5vZGUncyBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzOiB0cnVlLCAvLyBGb2N1cyBhbmQgc3RhcnQgZWRpdGluZyBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSB0ZXh0IG5vZGUgb24gdGhlIGNhbnZhc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGNhbnZhcy5jcmVhdGVUZXh0Tm9kZSh0ZXh0Tm9kZUNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlX2lkID0gbm9kZS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY29sb3IgPSBcIjZcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuem9vbVRvU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLm9wZW4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiY3JlYXRlLWNoaWxkXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkNyZWF0ZSBDaGlsZFwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGVhZj8udmlldy5nZXRWaWV3VHlwZSgpID09PSBcImNhbnZhc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhc1ZpZXcgPSBjdXJyZW50TGVhZi52aWV3O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSAoY2FudmFzVmlldyBhcyBhbnkpLmNhbnZhcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gY2FudmFzLnNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24udmFsdWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBzZWxlY3Rpb25JdGVyYXRvci5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZShjYW52YXMsIG5vZGUsIG5vZGUueSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcIm9wZW4tY21kai1tb2RhbFwiLFxuICAgICAgICAgICAgbmFtZTogXCJPcGVuIENNRCtKIE1vZGFsXCIsXG4gICAgICAgICAgICBob3RrZXlzOiBbeyBtb2RpZmllcnM6IFtcIk1vZFwiXSwga2V5OiBcImpcIiB9XSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVZpZXcgJiYgYWN0aXZlVmlldy5lZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gYWN0aXZlVmlldy5lZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhY3RpdmVWaWV3LmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gY29udGVudC5pbmRleE9mKHNlbGVjdGVkVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHNlbGVjdGVkVGV4dC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBDTURKTW9kYWwodGhpcy5hcHAsIHNlbGVjdGVkVGV4dCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm9wZW4oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiTm8gYWN0aXZlIG1hcmtkb3duIGVkaXRvciBvciBubyB0ZXh0IHNlbGVjdGVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgY3VzdG9tIHZpZXdcbiAgICAgICAgdGhpcy5yZWdpc3RlclZpZXcoVklFV19OQU1FX1NJREVCQVJfQ0hBVCwgKGxlYWYpID0+IG5ldyBTaWRlYmFyQ2hhdChsZWFmKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KFZJRVdfTkFNRV9NQUlOX0NIQVQsIChsZWFmKSA9PiBuZXcgTWFpbkNoYXQobGVhZikpO1xuICAgICAgICAvLyBEZWZpbmUgYSBjb21tYW5kIHRvIGluc2VydCB0ZXh0IGludG8gdGhlIHNpZGViYXJcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImluc2VydC10ZXh0LWludG8tc2lkZWJhclwiLFxuICAgICAgICAgICAgbmFtZTogXCJJbnNlcnQgVGV4dCBpbnRvIFNpZGViYXJcIixcbiAgICAgICAgICAgIGhvdGtleXM6IFt7IG1vZGlmaWVyczogW1wiTW9kXCJdLCBrZXk6IFwibFwiIH1dLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVMZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmFjdGl2ZUxlYWY7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUxlYWYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRpdG9yID0gYWN0aXZlTGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ID8gYWN0aXZlTGVhZi52aWV3LmVkaXRvciA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IGVkaXRvci5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGV4dEludG9TaWRlYmFyKHNlbGVjdGVkVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWZpbmUgYSBjb21tYW5kIHRvIGNsZWFyIHRleHQgZnJvbSB0aGUgc2lkZWJhclxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiY2xlYXItdGV4dC1pbi1zaWRlYmFyXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkNsZWFyIFRleHQgaW4gU2lkZWJhclwiLFxuICAgICAgICAgICAgaG90a2V5czogW3sgbW9kaWZpZXJzOiBbXCJNb2RcIl0sIGtleTogXCI7XCIgfV0sXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUZXh0SW5TaWRlYmFyKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBhc3luYyBmdW5jdGlvbiBvbmVfc2hvdChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGxldCBtb2RlbCA9IFwib3BlbmFpLWdwdC00XCI7XG4gICAgICAgICAgICBpZiAobW9kZWwgPT09IFwibG9jYWxcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IG1lc3NhZ2UgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goXCJodHRwOi8vbG9jYWxob3N0OjgwMDAvc2luZ2xlLXR1cm5cIiwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5jb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAobW9kZWwgPT09IFwib3BlbmFpLWdwdC00XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyX21lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IFwidXNlclwiLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBcImdwdC00LTExMDYtcHJldmlld1wiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IFt1c2VyX21lc3NhZ2VdLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbDogbW9kZWwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIkNhbGxpbmcgR1BULTQhXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXRfY29tcGxldGlvbjogT3BlbkFJLkNoYXQuQ2hhdENvbXBsZXRpb24gPSBhd2FpdCBvcGVuYWkuY2hhdC5jb21wbGV0aW9ucy5jcmVhdGUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiTWVzc2FnZSBiYWNrIGZyb20gR1BULTQhXCIpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNoYXRfY29tcGxldGlvbjogT3BlbkFJLkNoYXQuQ2hhdENvbXBsZXRpb24gPSBhd2FpdCBncm9xLmNoYXQuY29tcGxldGlvbnMuY3JlYXRlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGNoYXRfY29tcGxldGlvbi5jaG9pY2VzWzBdLm1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgICAgICAvLyBub2RlX2NvbnRlbnQgPSBgPHJvbGU+YXNzaXN0YW50PC9yb2xlPlxcbiR7Y29udGVudH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcGFyc2VDdXN0b21YTUwoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIC8vIEZ1bmN0aW9uIHRvIGV4dHJhY3QgY29udGVudCBiZXR3ZWVuIHRhZ3NcbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldENvbnRlbnQodGFnOiBzdHJpbmcsIHN0cmluZzogc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlblRhZyA9IGA8JHt0YWd9PmA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvc2VUYWcgPSBgPC8ke3RhZ30+YDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IHN0cmluZy5pbmRleE9mKG9wZW5UYWcpICsgb3BlblRhZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gc3RyaW5nLmluZGV4T2YoY2xvc2VUYWcpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRXh0cmFjdCBjb252ZXJzYXRpb24gSURcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbklkID0gZ2V0Q29udGVudChcImlkXCIsIHhtbFN0cmluZyk7XG5cbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHJlc3VsdCBvYmplY3Qgd2l0aCBtZXRhZGF0YVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBjb252ZXJzYXRpb25JZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEV4dHJhY3QgbWVzc2FnZXNcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzQ29udGVudCA9IGdldENvbnRlbnQoXCJjb252ZXJzYXRpb25cIiwgeG1sU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VUYWdzID0gbWVzc2FnZXNDb250ZW50LnNwbGl0KFwiPC9tZXNzYWdlPlwiKS5zbGljZSgwLCAtMSk7IC8vIFNwbGl0IGFuZCByZW1vdmUgbGFzdCBlbXB0eSBlbGVtZW50XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVzc2FnZVRhZyBvZiBtZXNzYWdlVGFncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBnZXRDb250ZW50KFwicm9sZVwiLCBtZXNzYWdlVGFnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZ2V0Q29udGVudChcImNvbnRlbnRcIiwgbWVzc2FnZVRhZyk7XG4gICAgICAgICAgICAgICAgLy9AdHMtaWdub3JlIC8vIFRPRE8gLSBSZW1vdmUgdGhpcyBhbmQgZml4IGl0XG4gICAgICAgICAgICAgICAgcmVzdWx0LmNvbnZlcnNhdGlvbi5tZXNzYWdlcy5wdXNoKHsgcm9sZSwgY29udGVudCB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJvcGVuLWNoYXRcIixcbiAgICAgICAgICAgIG5hbWU6IFwiT3BlbiBDaGF0XCIsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk/LmVkaXRvcjtcbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXCJgYGB4bWxcIiwgXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKFwiYGBgXCIsIFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sID0gcGFyc2VDdXN0b21YTUwoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZvX2lkID0geG1sLm1ldGFkYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHhtbC5jb252ZXJzYXRpb24ubWVzc2FnZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZvX2lkICYmIG1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGF0VmlldyA9IG5ldyBNYWluQ2hhdChsZWFmLCBjb252b19pZCwgbWVzc2FnZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHR5cGU6IFZJRVdfTkFNRV9NQUlOX0NIQVQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RhdGU6IHsgY2hhdElkOiBjb252b19pZCwgbWVzc2FnZXM6IG1lc3NhZ2VzIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWFmLm9wZW4oY2hhdFZpZXcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLnJldmVhbExlYWYobGVhZik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiTm8gdmFsaWQgY2hhdCBkYXRhIGZvdW5kIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJObyBhY3RpdmUgbWFya2Rvd24gZWRpdG9yIGZvdW5kLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiYXBwbHktZGlmZnNcIixcbiAgICAgICAgICAgIG5hbWU6IFwiQXBwbHkgRGlmZnNcIixcbiAgICAgICAgICAgIGhvdGtleXM6IFt7IG1vZGlmaWVyczogW1wiTW9kXCJdLCBrZXk6IFwiZFwiIH1dLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5lZGl0b3I7XG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWdleCB0byBmaW5kIHwtY29udGVudC18XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZVJlZ2V4ID0gL1xcfC0oLio/KS1cXHwvZ3M7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZ2V4IHRvIGZpbmQgfCtjb250ZW50K3xcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgfC1jb250ZW50LXwgd2l0aCBlbXB0eSBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShkZWxldGVSZWdleCwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiB8K2NvbnRlbnQrfCB3aXRoIGVtcHR5IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoXCJ8K1wiLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKFwiK3xcIiwgXCJcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBtb2RpZmllZCBjb250ZW50IGJhY2sgdG8gdGhlIGVkaXRvclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0VmFsdWUoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJEaXBzIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiTm8gYWN0aXZlIG1hcmtkb3duIGVkaXRvciBmb3VuZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcGF0Y2hDYW52YXNNZW51KCkge1xuICAgICAgICBjb25zdCBjYW52YXNWaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShcImNhbnZhc1wiKS5maXJzdCgpPy52aWV3O1xuICAgICAgICBpZiAoIWNhbnZhc1ZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW52YXMgPSBjYW52YXNWaWV3LmNhbnZhcztcblxuICAgICAgICBjb25zdCBtZW51ID0gY2FudmFzVmlldy5jYW52YXMubWVudTtcbiAgICAgICAgaWYgKCFtZW51KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gbWVudSBmb3VuZCBvbiB0aGUgY2FudmFzXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzOyAvLyBDYXB0dXJlIHRoZSBjb3JyZWN0ICd0aGlzJyBjb250ZXh0LlxuXG4gICAgICAgIGNvbnN0IG1lbnVVbmluc3RhbGxlciA9IGFyb3VuZChtZW51LmNvbnN0cnVjdG9yLnByb3RvdHlwZSwge1xuICAgICAgICAgICAgcmVuZGVyOiAobmV4dDogYW55KSA9PlxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICguLi5hcmdzOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV4dC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB0aGF0LmFkZEdyYXBoQnV0dG9uSWZOZWVkZWQodGhpcy5tZW51RWwpO1xuICAgICAgICAgICAgICAgICAgICB0aGF0LmFkZEFJQnV0dG9uSWZOZWVkZWQodGhpcy5tZW51RWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbnZhc1ZpZXcuc2NvcGU/LnJlZ2lzdGVyKFtcIk1vZFwiLCBcIlNoaWZ0XCJdLCBcIkFycm93VXBcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5jcmVhdGVfZGlyZWN0aW9uYWxfbm9kZShjYW52YXMsIFwidG9wXCIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjYW52YXNWaWV3LnNjb3BlPy5yZWdpc3RlcihbXCJNb2RcIl0sIFwiQXJyb3dVcFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGF0Lm5hdmlnYXRlKGNhbnZhcywgXCJ0b3BcIik7XG4gICAgICAgIH0pO1xuICAgICAgICBjYW52YXNWaWV3LnNjb3BlPy5yZWdpc3RlcihbXCJNb2RcIl0sIFwiQXJyb3dEb3duXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoYXQubmF2aWdhdGUoY2FudmFzLCBcImJvdHRvbVwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbnZhc1ZpZXcuc2NvcGU/LnJlZ2lzdGVyKFtcIk1vZFwiXSwgXCJBcnJvd0xlZnRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5uYXZpZ2F0ZShjYW52YXMsIFwibGVmdFwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbnZhc1ZpZXcuc2NvcGU/LnJlZ2lzdGVyKFtcIk1vZFwiXSwgXCJBcnJvd1JpZ2h0XCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoYXQubmF2aWdhdGUoY2FudmFzLCBcInJpZ2h0XCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2FudmFzVmlldy5zY29wZT8ucmVnaXN0ZXIoW1wiTW9kXCJdLCBcIkVudGVyXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoYXQuc3RhcnRfZWRpdGluZ19ub2RlKGNhbnZhcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNhbnZhc1ZpZXcuc2NvcGU/LnJlZ2lzdGVyKFtcIk1vZFwiLCBcIlNoaWZ0XCJdLCBcIkFycm93VXBcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5jcmVhdGVfZGlyZWN0aW9uYWxfbm9kZShjYW52YXMsIFwidG9wXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2FudmFzVmlldy5zY29wZT8ucmVnaXN0ZXIoW1wiTW9kXCIsIFwiU2hpZnRcIl0sIFwiQXJyb3dEb3duXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoYXQuY3JlYXRlX2RpcmVjdGlvbmFsX25vZGUoY2FudmFzLCBcImJvdHRvbVwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbnZhc1ZpZXcuc2NvcGU/LnJlZ2lzdGVyKFtcIk1vZFwiLCBcIlNoaWZ0XCJdLCBcIkFycm93TGVmdFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGF0LmNyZWF0ZV9kaXJlY3Rpb25hbF9ub2RlKGNhbnZhcywgXCJsZWZ0XCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2FudmFzVmlldy5zY29wZT8ucmVnaXN0ZXIoW1wiTW9kXCIsIFwiU2hpZnRcIl0sIFwiQXJyb3dSaWdodFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGF0LmNyZWF0ZV9kaXJlY3Rpb25hbF9ub2RlKGNhbnZhcywgXCJyaWdodFwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbnZhc1ZpZXcuc2NvcGU/LnJlZ2lzdGVyKFtcIk1vZFwiLCBcIlNoaWZ0XCJdLCBcIkVudGVyXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoYXQucnVuX2dyYXBoX2NoYXQoY2FudmFzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gY29uc3QgY2FudmFzVmlld3VuaXN0YWxsZXIgPSBhcm91bmQoY2FudmFzVmlldy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgLy8gICAgIG9uT3BlbjogKG5leHQpID0+XG4gICAgICAgIC8vICAgICAgICAgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAgICAgICAgICAgICBpZiAodHJ1ZSkge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5zY29wZSk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtcIk1vZFwiXSwgXCJBcnJvd1VwXCIsICgpID0+IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGF0Lm5hdmlnYXRlKHRoaXMuY2FudmFzLCBcInRvcFwiKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXCJNb2RcIl0sIFwiQXJyb3dEb3duXCIsICgpID0+IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGF0Lm5hdmlnYXRlKHRoaXMuY2FudmFzLCBcImJvdHRvbVwiKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXCJNb2RcIl0sIFwiQXJyb3dMZWZ0XCIsICgpID0+IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGF0Lm5hdmlnYXRlKHRoaXMuY2FudmFzLCBcImxlZnRcIik7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiTW9kXCJdLCBcIkFycm93UmlnaHRcIiwgKCkgPT4ge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoYXQubmF2aWdhdGUodGhpcy5jYW52YXMsIFwicmlnaHRcIik7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiTW9kXCJdLCBcIkVudGVyXCIsICgpID0+IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGF0LnN0YXJ0X2VkaXRpbmdfbm9kZSh0aGlzLmNhbnZhcyk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtcIk1vZFwiLCBcIlNoaWZ0XCJdLCBcIkFycm93VXBcIiwgKCkgPT4ge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgdGhhdC5jcmVhdGVfZGlyZWN0aW9uYWxfbm9kZSh0aGlzLmNhbnZhcywgXCJ0b3BcIik7XG4gICAgICAgIC8vICAgICAgICAgICAgIH0pO1xuICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLnNjb3BlLnJlZ2lzdGVyKFtcIk1vZFwiLCBcIlNoaWZ0XCJdLCBcIkFycm93RG93blwiLCAoKSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB0aGF0LmNyZWF0ZV9kaXJlY3Rpb25hbF9ub2RlKHRoaXMuY2FudmFzLCBcImJvdHRvbVwiKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgfSk7XG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiTW9kXCIsIFwiU2hpZnRcIl0sIFwiQXJyb3dMZWZ0XCIsICgpID0+IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHRoYXQuY3JlYXRlX2RpcmVjdGlvbmFsX25vZGUodGhpcy5jYW52YXMsIFwibGVmdFwiKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgfSk7XG4gICAgICAgIC8vICAgICAgICAgICAgIHRoaXMuc2NvcGUucmVnaXN0ZXIoW1wiTW9kXCIsIFwiU2hpZnRcIl0sIFwiQXJyb3dSaWdodFwiLCAoKSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB0aGF0LmNyZWF0ZV9kaXJlY3Rpb25hbF9ub2RlKHRoaXMuY2FudmFzLCBcInJpZ2h0XCIpO1xuICAgICAgICAvLyAgICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5zY29wZS5yZWdpc3RlcihbXCJNb2RcIiwgXCJTaGlmdFwiXSwgXCJFbnRlclwiLCAoKSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICB0aGF0LnJ1bl9ncmFwaF9jaGF0KHRoaXMuY2FudmFzKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gICAgICAgICAgICAgcmV0dXJuIG5leHQuY2FsbCh0aGlzKTtcbiAgICAgICAgLy8gICAgICAgICB9LFxuICAgICAgICAvLyB9KTtcblxuICAgICAgICB0aGlzLnJlZ2lzdGVyKG1lbnVVbmluc3RhbGxlcik7XG4gICAgfVxuICAgIGNyZWF0ZV9kaXJlY3Rpb25hbF9ub2RlKGNhbnZhczogYW55LCBkaXJlY3Rpb246IHN0cmluZykge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBjYW52YXMuc2VsZWN0aW9uO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi52YWx1ZXMoKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuaXNFZGl0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyZW50X25vZGVfeCA9IG5vZGUueDtcbiAgICAgICAgY29uc3QgcGFyZW50X25vZGVfeSA9IG5vZGUueTtcbiAgICAgICAgY29uc3QgcGFyZW50X3dpZHRoID0gbm9kZS53aWR0aDtcbiAgICAgICAgY29uc3QgcGFyZW50X2hlaWdodCA9IG5vZGUuaGVpZ2h0O1xuXG4gICAgICAgIGxldCB4OiBudW1iZXI7XG4gICAgICAgIGxldCB5OiBudW1iZXI7XG4gICAgICAgIGxldCBmcm9tX3NpZGU6IHN0cmluZztcbiAgICAgICAgbGV0IHRvX3NpZGU6IHN0cmluZztcblxuICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgICAgICAgICB4ID0gcGFyZW50X25vZGVfeCAtIHBhcmVudF93aWR0aCAtIDIwMDtcbiAgICAgICAgICAgICAgICB5ID0gcGFyZW50X25vZGVfeTtcbiAgICAgICAgICAgICAgICBmcm9tX3NpZGUgPSBcImxlZnRcIjtcbiAgICAgICAgICAgICAgICB0b19zaWRlID0gXCJyaWdodFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgeCA9IHBhcmVudF9ub2RlX3ggKyBwYXJlbnRfd2lkdGggKyAyMDA7XG4gICAgICAgICAgICAgICAgeSA9IHBhcmVudF9ub2RlX3k7XG4gICAgICAgICAgICAgICAgZnJvbV9zaWRlID0gXCJyaWdodFwiO1xuICAgICAgICAgICAgICAgIHRvX3NpZGUgPSBcImxlZnRcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ0b3BcIjpcbiAgICAgICAgICAgICAgICB4ID0gcGFyZW50X25vZGVfeDtcbiAgICAgICAgICAgICAgICB5ID0gcGFyZW50X25vZGVfeSAtIHBhcmVudF9oZWlnaHQgLSAyMDA7XG4gICAgICAgICAgICAgICAgZnJvbV9zaWRlID0gXCJ0b3BcIjtcbiAgICAgICAgICAgICAgICB0b19zaWRlID0gXCJib3R0b21cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJib3R0b21cIjpcbiAgICAgICAgICAgICAgICB4ID0gcGFyZW50X25vZGVfeDtcbiAgICAgICAgICAgICAgICB5ID0gcGFyZW50X25vZGVfeSArIHBhcmVudF9oZWlnaHQgKyAyMDA7XG4gICAgICAgICAgICAgICAgZnJvbV9zaWRlID0gXCJib3R0b21cIjtcbiAgICAgICAgICAgICAgICB0b19zaWRlID0gXCJ0b3BcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgZGlyZWN0aW9uIHByb3ZpZGVkXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hpbGROb2RlKGNhbnZhcywgbm9kZSwgeCwgeSwgXCI8cm9sZT51c2VyPC9yb2xlPlwiLCBmcm9tX3NpZGUsIHRvX3NpZGUpO1xuICAgIH1cbiAgICBzdGFydF9lZGl0aW5nX25vZGUoY2FudmFzKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNhbnZhcy5zZWxlY3Rpb247XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkl0ZXJhdG9yID0gc2VsZWN0aW9uLnZhbHVlcygpO1xuICAgICAgICBjb25zdCBub2RlID0gc2VsZWN0aW9uSXRlcmF0b3IubmV4dCgpLnZhbHVlO1xuICAgICAgICBjb25zdCBub2RlX2lkID0gbm9kZS5pZDtcbiAgICAgICAgbm9kZS5pc0VkaXRpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBlZGl0QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhbnZhcy1tZW51IGJ1dHRvblthcmlhLWxhYmVsPVwiRWRpdFwiXScpO1xuICAgICAgICBpZiAoZWRpdEJ1dHRvbikge1xuICAgICAgICAgICAgZWRpdEJ1dHRvbi5jbGljaygpOyAvLyBTaW11bGF0ZSB0aGUgY2xpY2sgb24gdGhlIGVkaXQgYnV0dG9uXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRWRpdCBidXR0b24gbm90IGZvdW5kXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJ1bl9ncmFwaF9jaGF0KGNhbnZhczogQ2FudmFzKSB7XG4gICAgICAgIGNhbnZhcy5yZXF1ZXN0U2F2ZSgpO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBjYW52YXMuc2VsZWN0aW9uO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi52YWx1ZXMoKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3Qgbm9kZV9pZCA9IG5vZGUuaWQ7XG5cbiAgICAgICAgY29uc3QgZWRpdEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYW52YXMtbWVudSBidXR0b25bYXJpYS1sYWJlbD1cIlNwYXJrbGVcIl0nKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICAgICAgaWYgKGVkaXRCdXR0b24pIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGVkaXRCdXR0b24uY2xpY2soKTsgLy8gU2ltdWxhdGUgdGhlIGNsaWNrIG9uIHRoZSBlZGl0IGJ1dHRvbiBhZnRlciAyMDAgbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVkaXQgYnV0dG9uIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuYXZpZ2F0ZShjYW52YXMsIGRpcmVjdGlvbjogc3RyaW5nKSB7XG4gICAgICAgIC8vIGNvbnN0IGNhbnZhcyA9IGNhbnZhc1ZpZXcuY2FudmFzO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBjYW52YXMuc2VsZWN0aW9uO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi52YWx1ZXMoKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuaXNFZGl0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZV9pZCA9IG5vZGUuaWQ7XG4gICAgICAgIGNvbnN0IGNhbnZhc19kYXRhID0gY2FudmFzLmdldERhdGEoKTtcblxuICAgICAgICAvLyBBc3N1bWluZyBkaXJlY3Rpb24gY2FuIGJlICduZXh0JyBvciAncHJldmlvdXMnIGZvciBzaW1wbGljaXR5XG4gICAgICAgIGNvbnN0IGVkZ2VzID0gY2FudmFzX2RhdGEuZWRnZXM7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gY2FudmFzX2RhdGEubm9kZXM7XG4gICAgICAgIGxldCB0YXJnZXROb2RlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIFwicmlnaHRcIjpcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYm90aCAnZnJvbScgYW5kICd0bycgY2FzZXMgZm9yICdyaWdodCdcbiAgICAgICAgICAgICAgICBjb25zdCBlZGdlUmlnaHRGcm9tID0gZWRnZXMuZmluZCgoZWRnZSkgPT4gZWRnZS5mcm9tTm9kZSA9PT0gbm9kZV9pZCAmJiBlZGdlLmZyb21TaWRlID09PSBcInJpZ2h0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChlZGdlUmlnaHRGcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGVJRCA9IGVkZ2VSaWdodEZyb20udG9Ob2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VSaWdodFRvID0gZWRnZXMuZmluZCgoZWRnZSkgPT4gZWRnZS50b05vZGUgPT09IG5vZGVfaWQgJiYgZWRnZS50b1NpZGUgPT09IFwicmlnaHRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGdlUmlnaHRUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlEID0gZWRnZVJpZ2h0VG8uZnJvbU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBib3RoICdmcm9tJyBhbmQgJ3RvJyBjYXNlcyBmb3IgJ2xlZnQnXG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZUxlZnRGcm9tID0gZWRnZXMuZmluZCgoZWRnZSkgPT4gZWRnZS5mcm9tTm9kZSA9PT0gbm9kZV9pZCAmJiBlZGdlLmZyb21TaWRlID09PSBcImxlZnRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2VMZWZ0RnJvbSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlSUQgPSBlZGdlTGVmdEZyb20udG9Ob2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VMZWZ0VG8gPSBlZGdlcy5maW5kKChlZGdlKSA9PiBlZGdlLnRvTm9kZSA9PT0gbm9kZV9pZCAmJiBlZGdlLnRvU2lkZSA9PT0gXCJsZWZ0XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWRnZUxlZnRUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlEID0gZWRnZUxlZnRUby5mcm9tTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ0b3BcIjpcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYm90aCAnZnJvbScgYW5kICd0bycgY2FzZXMgZm9yICd0b3AnXG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZVRvcEZyb20gPSBlZGdlcy5maW5kKChlZGdlKSA9PiBlZGdlLmZyb21Ob2RlID09PSBub2RlX2lkICYmIGVkZ2UuZnJvbVNpZGUgPT09IFwidG9wXCIpO1xuICAgICAgICAgICAgICAgIGlmIChlZGdlVG9wRnJvbSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlSUQgPSBlZGdlVG9wRnJvbS50b05vZGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRnZVRvcFRvID0gZWRnZXMuZmluZCgoZWRnZSkgPT4gZWRnZS50b05vZGUgPT09IG5vZGVfaWQgJiYgZWRnZS50b1NpZGUgPT09IFwidG9wXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWRnZVRvcFRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlSUQgPSBlZGdlVG9wVG8uZnJvbU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYm90dG9tXCI6XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGJvdGggJ2Zyb20nIGFuZCAndG8nIGNhc2VzIGZvciAnYm90dG9tJ1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VCb3R0b21Gcm9tID0gZWRnZXMuZmluZCgoZWRnZSkgPT4gZWRnZS5mcm9tTm9kZSA9PT0gbm9kZV9pZCAmJiBlZGdlLmZyb21TaWRlID09PSBcImJvdHRvbVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZUJvdHRvbUZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlEID0gZWRnZUJvdHRvbUZyb20udG9Ob2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VCb3R0b21UbyA9IGVkZ2VzLmZpbmQoKGVkZ2UpID0+IGVkZ2UudG9Ob2RlID09PSBub2RlX2lkICYmIGVkZ2UudG9TaWRlID09PSBcImJvdHRvbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkZ2VCb3R0b21Ubykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlEID0gZWRnZUJvdHRvbVRvLmZyb21Ob2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnN0IHZpZXdwb3J0Tm9kZXMgPSBjYW52YXMuZ2V0Vmlld3BvcnROb2RlcygpO1xuICAgICAgICBsZXQgdmlld3BvcnRfbm9kZXM6IFZpZXdwb3J0Tm9kZVtdID0gW107XG4gICAgICAgIGxldCBpbml0aWFsX3ZpZXdwb3J0X2NoaWxkcmVuID0gY2FudmFzLm5vZGVJbmRleC5kYXRhLmNoaWxkcmVuO1xuICAgICAgICBpZiAoaW5pdGlhbF92aWV3cG9ydF9jaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsZXQgdHlwZV9ub2RlcyA9IFwibm9kZXNcIjtcblxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSBjaGlsZGVuIHRoZW4gdXNlIHRoaXMgcGF0aC5cbiAgICAgICAgICAgIGlmIChpbml0aWFsX3ZpZXdwb3J0X2NoaWxkcmVuWzBdICYmIFwiY2hpbGRyZW5cIiBpbiBpbml0aWFsX3ZpZXdwb3J0X2NoaWxkcmVuWzBdKSB7XG4gICAgICAgICAgICAgICAgdHlwZV9ub2RlcyA9IFwiY2hpbGRyZW5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlX25vZGVzID09PSBcImNoaWxkcmVuXCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluaXRpYWxfdmlld3BvcnRfY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNfbGlzdCA9IGluaXRpYWxfdmlld3BvcnRfY2hpbGRyZW5baV0uY2hpbGRyZW47XG5cbiAgICAgICAgICAgICAgICAgICAgbm9kZXNfbGlzdC5mb3JFYWNoKChub2RlOiBWaWV3cG9ydE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0X25vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlX25vZGVzID09PSBcIm5vZGVzXCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluaXRpYWxfdmlld3BvcnRfY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRfbm9kZSA9IGluaXRpYWxfdmlld3BvcnRfY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0X25vZGVzLnB1c2godmlld3BvcnRfbm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldE5vZGVJRCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0X25vZGUgPSB2aWV3cG9ydF9ub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLmlkID09PSB0YXJnZXROb2RlSUQpO1xuXG4gICAgICAgICAgICBjYW52YXMuc2VsZWN0T25seSh0YXJnZXRfbm9kZSk7XG4gICAgICAgICAgICBjYW52YXMuem9vbVRvU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXh0cmFjdFRleHRGcm9tUERGKGZpbGVfbmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gcGRmanMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgPSBcInBkZi53b3JrZXIuanNcIjtcbiAgICAgICAgLy8gQXNzdW1pbmcgdGhpcyBjb2RlIGlzIGluc2lkZSBhIG1ldGhvZCBvZiB5b3VyIHBsdWdpbiBjbGFzc1xuXG4gICAgICAgIHBkZmpzLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuZ2V0UmVzb3VyY2VQYXRoKHtcbiAgICAgICAgICAgIHBhdGg6IFwiLm9ic2lkaWFuL3BsdWdpbnMvY2FyZXQvcGRmLndvcmtlci5qc1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gY29uc3QgZmlsZV9wYXRoID0gYC9Vc2Vycy9qYWNvYmNvbGxpbmcvRG9jdW1lbnRzL2FjY2VsZXJhdGUvYWNjZWxlcmF0ZS9BdHRlbnRpb24gaXMgQWxsIFlvdXIgTmVlZC5wZGZgO1xuICAgICAgICAvLyBjb25zdCBkb2N1bWVudCA9IGF3YWl0IGdldERvY3VtZW50KGZpbGVfcGF0aCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGRvY3VtZW50KTtcbiAgICAgICAgY29uc3QgZmlsZV9wYXRoID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuZ2V0UmVzb3VyY2VQYXRoKHtcbiAgICAgICAgICAgIHBhdGg6IGZpbGVfbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRBbmRFeHRyYWN0VGV4dChmaWxlX3BhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IGF3YWl0IHBkZmpzLmdldERvY3VtZW50KGZpbGVfcGF0aCkucHJvbWlzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1QYWdlcyA9IGRvYy5udW1QYWdlcztcblxuICAgICAgICAgICAgICAgIC8vIExvYWQgbWV0YWRhdGFcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGRvYy5nZXRNZXRhZGF0YSgpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGZ1bGxUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBudW1QYWdlczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBkb2MuZ2V0UGFnZShpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHsgc2NhbGU6IDEuMCB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcGFnZS5nZXRUZXh0Q29udGVudCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlVGV4dCA9IGNvbnRlbnQuaXRlbXMubWFwKChpdGVtOiB7IHN0cjogc3RyaW5nIH0pID0+IGl0ZW0uc3RyKS5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZnVsbFRleHQgKz0gcGFnZVRleHQgKyBcIiBcIjtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIHBhZ2UgcmVzb3VyY2VzLlxuICAgICAgICAgICAgICAgICAgICBwYWdlLmNsZWFudXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGxUZXh0O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBcIiArIGVycik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnVsbERvY3VtZW50VGV4dCA9IGF3YWl0IGxvYWRBbmRFeHRyYWN0VGV4dChmaWxlX3BhdGgpO1xuICAgICAgICByZXR1cm4gZnVsbERvY3VtZW50VGV4dDtcbiAgICB9XG4gICAgYWRkR3JhcGhCdXR0b25JZk5lZWRlZChtZW51RWw6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICghbWVudUVsLnF1ZXJ5U2VsZWN0b3IoXCIuZ3JhcGgtbWVudS1pdGVtXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBncmFwaEJ1dHRvbkVsID0gY3JlYXRlRWwoXCJidXR0b25cIiwgXCJjbGlja2FibGUtaWNvbiBncmFwaC1tZW51LWl0ZW1cIik7XG4gICAgICAgICAgICBzZXRUb29sdGlwKGdyYXBoQnV0dG9uRWwsIFwiQ3JlYXRlIE5vZGVcIiwgeyBwbGFjZW1lbnQ6IFwidG9wXCIgfSk7XG4gICAgICAgICAgICBzZXRJY29uKGdyYXBoQnV0dG9uRWwsIFwibHVjaWRlLXdvcmtmbG93XCIpO1xuICAgICAgICAgICAgZ3JhcGhCdXR0b25FbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEFzc3VtaW5nIGNhbnZhc1ZpZXcgaXMgYWNjZXNzaWJsZSBoZXJlLCBvciB5b3UgbmVlZCB0byBwYXNzIGl0IHNpbWlsYXJseVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhc1ZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFwiY2FudmFzXCIpLmZpcnN0KCk/LnZpZXc7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSBjYW52YXNWaWV3LmNhbnZhcztcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjYW52YXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNhbnZhcy5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24udmFsdWVzKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhub2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gbm9kZS54ICsgbm9kZS53aWR0aCArIDIwMDtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZShjYW52YXMsIG5vZGUsIHgsIG5vZGUueSwgXCI8cm9sZT51c2VyPC9yb2xlPlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWVudUVsLmFwcGVuZENoaWxkKGdyYXBoQnV0dG9uRWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0X2FuY2VzdG9ycyhub2RlczogTm9kZVtdLCBlZGdlczogRWRnZVtdLCBub2RlSWQ6IHN0cmluZyk6IE5vZGVbXSB7XG4gICAgICAgIGxldCBhbmNlc3RvcnM6IE5vZGVbXSA9IFtdO1xuICAgICAgICBsZXQgY3VycmVudElkOiBzdHJpbmcgPSBub2RlSWQ7XG4gICAgICAgIGxldCBwcm9jZXNzZWROb2RlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluY29taW5nRWRnZXM6IEVkZ2VbXSA9IGVkZ2VzLmZpbHRlcigoZWRnZSkgPT4gZWRnZS50b05vZGUgPT09IGN1cnJlbnRJZCk7XG4gICAgICAgICAgICBpZiAoaW5jb21pbmdFZGdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gTm8gbW9yZSBhbmNlc3RvcnNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3VycmVudElkID0gaW5jb21pbmdFZGdlc1swXS5mcm9tTm9kZTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzZWROb2Rlcy5oYXMoY3VycmVudElkKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBBdm9pZCBpbmZpbml0ZSBsb29wcyBpbiBjeWNsaWMgZ3JhcGhzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9jZXNzZWROb2Rlcy5hZGQoY3VycmVudElkKTtcblxuICAgICAgICAgICAgY29uc3QgYW5jZXN0b3I6IE5vZGUgfCB1bmRlZmluZWQgPSBub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLmlkID09PSBjdXJyZW50SWQpO1xuICAgICAgICAgICAgaWYgKGFuY2VzdG9yKSB7XG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzLnB1c2goYW5jZXN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ycztcbiAgICB9XG4gICAgZ2V0QWxsQW5jZXN0b3JOb2Rlcyhub2RlczogTm9kZVtdLCBlZGdlczogRWRnZVtdLCBub2RlSWQ6IHN0cmluZyk6IE5vZGVbXSB7XG4gICAgICAgIGxldCBhbmNlc3RvcnM6IE5vZGVbXSA9IFtdO1xuICAgICAgICBsZXQgcXVldWU6IHN0cmluZ1tdID0gW25vZGVJZF07XG4gICAgICAgIGxldCBwcm9jZXNzZWROb2RlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50SWQgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50SWQgfHwgcHJvY2Vzc2VkTm9kZXMuaGFzKGN1cnJlbnRJZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBwcm9jZXNzZWROb2Rlcy5hZGQoY3VycmVudElkKTtcbiAgICAgICAgICAgIGNvbnN0IGluY29taW5nRWRnZXM6IEVkZ2VbXSA9IGVkZ2VzLmZpbHRlcigoZWRnZSkgPT4gZWRnZS50b05vZGUgPT09IGN1cnJlbnRJZCk7XG4gICAgICAgICAgICBpbmNvbWluZ0VkZ2VzLmZvckVhY2goKGVkZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3RvciA9IG5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IGVkZ2UuZnJvbU5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvciAmJiAhcHJvY2Vzc2VkTm9kZXMuaGFzKGFuY2VzdG9yLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICBhbmNlc3RvcnMucHVzaChhbmNlc3Rvcik7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goYW5jZXN0b3IuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ycztcbiAgICB9XG4gICAgZ2V0TG9uZ2VzdExpbmVhZ2Uobm9kZXM6IE5vZGVbXSwgZWRnZXM6IEVkZ2VbXSwgbm9kZUlkOiBzdHJpbmcpOiBOb2RlW10ge1xuICAgICAgICBsZXQgbG9uZ2VzdExpbmVhZ2U6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIGZ1bmN0aW9uIGZpbmRMb25nZXN0UGF0aChjdXJyZW50SWQ6IHN0cmluZywgcGF0aDogTm9kZVtdKTogdm9pZCB7XG4gICAgICAgICAgICBjb25zdCBpbmNvbWluZ0VkZ2VzOiBFZGdlW10gPSBlZGdlcy5maWx0ZXIoKGVkZ2UpID0+IGVkZ2UudG9Ob2RlID09PSBjdXJyZW50SWQpO1xuICAgICAgICAgICAgaWYgKGluY29taW5nRWRnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcGF0aCBpcyB0aGUgbG9uZ2VzdCB3ZSd2ZSBlbmNvdW50ZXJlZFxuICAgICAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA+IGxvbmdlc3RMaW5lYWdlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsb25nZXN0TGluZWFnZSA9IHBhdGguc2xpY2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmNvbWluZ0VkZ2VzLmZvckVhY2goKGVkZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3RvciA9IG5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IGVkZ2UuZnJvbU5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYW5jZXN0b3IgaXMgdGhlIGRpcmVjdCBhbmNlc3RvciAoaW5kZXggMSkgYW5kIGhhcyAnY29udGV4dCcgaW4gaXRzIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAxICYmIGFuY2VzdG9yLnR5cGUgPT09IFwidGV4dFwiICYmIGFuY2VzdG9yLnRleHQuaW5jbHVkZXMoXCI8Y29udGV4dD5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gU2tpcCB0aGlzIGxpbmVhZ2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5kTG9uZ2VzdFBhdGgoYW5jZXN0b3IuaWQsIHBhdGguY29uY2F0KGFuY2VzdG9yKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB3aXRoIHRoZSBnaXZlbiBub2RlXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IG5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IG5vZGVJZCk7XG4gICAgICAgIGlmIChzdGFydE5vZGUpIHtcbiAgICAgICAgICAgIGZpbmRMb25nZXN0UGF0aChub2RlSWQsIFtzdGFydE5vZGVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb25nZXN0TGluZWFnZTtcbiAgICB9XG4gICAgZ2V0RGlyZWN0QW5jZXN0b3JzV2l0aENvbnRleHQobm9kZXM6IE5vZGVbXSwgZWRnZXM6IEVkZ2VbXSwgbm9kZUlkOiBzdHJpbmcpOiBOb2RlW10ge1xuICAgICAgICBsZXQgZGlyZWN0QW5jZXN0b3JzV2l0aENvbnRleHQ6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IG5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IG5vZGVJZCk7XG4gICAgICAgIGlmICghc3RhcnROb2RlKSByZXR1cm4gW107XG5cbiAgICAgICAgY29uc3QgaW5jb21pbmdFZGdlczogRWRnZVtdID0gZWRnZXMuZmlsdGVyKChlZGdlKSA9PiBlZGdlLnRvTm9kZSA9PT0gbm9kZUlkKTtcbiAgICAgICAgaW5jb21pbmdFZGdlcy5mb3JFYWNoKChlZGdlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmNlc3RvciA9IG5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IGVkZ2UuZnJvbU5vZGUpO1xuICAgICAgICAgICAgaWYgKGFuY2VzdG9yICYmIGFuY2VzdG9yLnR5cGUgPT09IFwidGV4dFwiICYmIGFuY2VzdG9yLnRleHQuaW5jbHVkZXMoXCI8Y29udGV4dD5cIikpIHtcbiAgICAgICAgICAgICAgICBkaXJlY3RBbmNlc3RvcnNXaXRoQ29udGV4dC5wdXNoKGFuY2VzdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRpcmVjdEFuY2VzdG9yc1dpdGhDb250ZXh0O1xuICAgIH1cblxuICAgIGFzeW5jIGdldF9yZWZfYmxvY2tzX2NvbnRlbnQobm9kZTogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHJlcF9ibG9ja19jb250ZW50ID0gXCJcIjtcbiAgICAgICAgY29uc3QgcmVmX2Jsb2NrcyA9IG5vZGUudGV4dC5tYXRjaCgvXFxbXFxbLio/XFxdXFxdL2cpIHx8IFtdO1xuICAgICAgICBjb25zdCBpbm5lcl90ZXh0cyA9IHJlZl9ibG9ja3MubWFwKChibG9jazogc3RyaW5nKSA9PiBibG9jay5zbGljZSgyLCAtMikpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlX25hbWUgb2YgaW5uZXJfdGV4dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kRmlsZSA9IGZpbGVzLmZpbmQoKGZpbGUpID0+IGZpbGUuYmFzZW5hbWUgPT09IGZpbGVfbmFtZSk7XG4gICAgICAgICAgICBpZiAoZm91bmRGaWxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNhY2hlZFJlYWQoZm91bmRGaWxlKTtcbiAgICAgICAgICAgICAgICByZXBfYmxvY2tfY29udGVudCArPSBgVGl0bGU6ICR7ZmlsZV9uYW1lfVxcbiR7dGV4dH1cXG5cXG5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZpbGUgbm90IGZvdW5kIGZvcjpcIiwgZmlsZV9uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXBfYmxvY2tfY29udGVudCA9IHJlcF9ibG9ja19jb250ZW50LnRyaW0oKTtcbiAgICAgICAgcmV0dXJuIHJlcF9ibG9ja19jb250ZW50O1xuICAgIH1cblxuICAgIGFkZEFJQnV0dG9uSWZOZWVkZWQobWVudUVsOiBIVE1MRWxlbWVudCkge1xuICAgICAgICBpZiAoIW1lbnVFbC5xdWVyeVNlbGVjdG9yKFwiLmdwdC1tZW51LWl0ZW1cIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbkVsID0gY3JlYXRlRWwoXCJidXR0b25cIiwgXCJjbGlja2FibGUtaWNvbiBncHQtbWVudS1pdGVtXCIpO1xuICAgICAgICAgICAgc2V0VG9vbHRpcChidXR0b25FbCwgXCJTcGFya2xlXCIsIHsgcGxhY2VtZW50OiBcInRvcFwiIH0pO1xuICAgICAgICAgICAgc2V0SWNvbihidXR0b25FbCwgXCJsdWNpZGUtc3BhcmtsZXNcIik7XG4gICAgICAgICAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhc1ZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFwiY2FudmFzXCIpLmZpcnN0KCk/LnZpZXc7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gY2FudmFzVmlldy5jYW52YXM7XG4gICAgICAgICAgICAgICAgYXdhaXQgY2FudmFzLnJlcXVlc3RTYXZlKHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNhbnZhcy5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24udmFsdWVzKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKS52YWx1ZTtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGZpbGVfbmFtZSA9IFwiQXR0ZW50aW9uIGlzIEFsbCBZb3VyIE5lZWRcIjtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZm91bmRGaWxlID0gZmlsZXMuZmluZCgoZmlsZSkgPT4gZmlsZS5iYXNlbmFtZSA9PT0gZmlsZV9uYW1lKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBwZGZfdGV4dCA9IGF3YWl0IHRoaXMuZXh0cmFjdFRleHRGcm9tUERGKGZvdW5kRmlsZSk7XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgbm9kZS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgbm9kZS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzX2RhdGEgPSBjYW52YXMuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZWRnZXMsIG5vZGVzIH0gPSBjYW52YXNfZGF0YTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjYW52YXNfZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAvLyBjb25zdCBhbmNlc3RvcnMgPSB0aGlzLmdldF9hbmNlc3RvcnMobm9kZXMsIGVkZ2VzLCBub2RlLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBhbGxfYW5jZXN0b3JzID0gdGhpcy5nZXRBbGxBbmNlc3Rvck5vZGVzKG5vZGVzLCBlZGdlcywgbm9kZS5pZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9uZ2VzdF9saW5lYWdlID0gdGhpcy5nZXRMb25nZXN0TGluZWFnZShub2RlcywgZWRnZXMsIG5vZGUuaWQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JzX3dpdGhfY29udGV4dCA9IHRoaXMuZ2V0RGlyZWN0QW5jZXN0b3JzV2l0aENvbnRleHQobm9kZXMsIGVkZ2VzLCBub2RlLmlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZfYmxvY2tzID0gYXdhaXQgdGhpcy5nZXRfcmVmX2Jsb2Nrc19jb250ZW50KG5vZGUpO1xuICAgICAgICAgICAgICAgIGxldCBhZGRlZF9jb250ZXh0ID0gYGA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbmNlc3RvcnNfd2l0aF9jb250ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBhbmNlc3RvcnNfd2l0aF9jb250ZXh0W2ldO1xuICAgICAgICAgICAgICAgICAgICBhZGRlZF9jb250ZXh0ICs9IG5vZGUudGV4dCArIFwiXFxuXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZWZfYmxvY2tzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkZWRfY29udGV4dCArPSBgXFxuICR7cmVmX2Jsb2Nrc31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRlZF9jb250ZXh0ID0gYWRkZWRfY29udGV4dC50cmltKCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnZlcnNhdGlvbiA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSGVyZVwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvbmdlc3RfbGluZWFnZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gbG9uZ2VzdF9saW5lYWdlW2ldO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSBcInRleHRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG5vZGUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IFwiZmlsZVwiICYmIG5vZGUuZmlsZS5pbmNsdWRlcyhcIi5wZGZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVfbmFtZSA9IG5vZGUuZmlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuZ2V0RmlsZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGZvdW5kRmlsZSA9IGZpbGVzLmZpbmQoKGZpbGUpID0+IGZpbGUuYmFzZW5hbWUgPT09IGZpbGVfbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYXdhaXQgdGhpcy5leHRyYWN0VGV4dEZyb21QREYoZmlsZV9uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR290IHRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkX2NvbnRleHQgKz0gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBcImFzc2lzdGFudFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJSZWdleCA9IC88cm9sZT5Vc2VyPFxcL3JvbGU+L2k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2lzdGFudFJlZ2V4ID0gLzxyb2xlPmFzc2lzdGFudDxcXC9yb2xlPi9pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyUmVnZXgudGVzdCh0ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRfdGV4dCA9IHRleHQuc3BsaXQodXNlclJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBcInVzZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gc3BsaXRfdGV4dFsxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZvciB0aGUgZmlyc3Qgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGVkX2NvbnRleHQubGVuZ3RoID4gMSAmJiBpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgXFxuJHthZGRlZF9jb250ZXh0fWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24ucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXNzaXN0YW50UmVnZXgudGVzdCh0ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRfdGV4dCA9IHRleHQuc3BsaXQoYXNzaXN0YW50UmVnZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IFwiYXNzaXN0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gc3BsaXRfdGV4dFsxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24ucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHsgY29udmVyc2F0aW9uIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbGV0IG1vZGVsX2Nob2ljZSA9IFwib3BlbmFpLWdwdC00XCI7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVfY29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGVsX2Nob2ljZSA9PT0gXCJsb2NhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZm9yIGxvY2FsXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cDovL2xvY2FsaG9zdDo4MDAwL2NvbnZlcnNhdGlvblwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG91dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZV9jb250ZW50ID0gYDxyb2xlPmFzc2lzdGFudDwvcm9sZT5cXG4ke291dHB1dC5yZXNwb25zZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHggPSBub2RlLnggKyBub2RlLndpZHRoICsgMjAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuY2hpbGROb2RlKGNhbnZhcywgbm9kZSwgeCwgbm9kZS55LCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1vZGVsX2Nob2ljZSA9PT0gXCJncm9xXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBcImxsYW1hMy03MGItODE5MlwiO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBjb252ZXJzYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbDogbW9kZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b29sczogdG9vbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b29sX2Nob2ljZTogdG9vbF9jaG9pY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhfdG9rZW5zOiAxMjAwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3A6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiQ2FsbGluZyBHcm9xIVwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhdF9jb21wbGV0aW9uOiBPcGVuQUkuQ2hhdC5DaGF0Q29tcGxldGlvbiA9IGF3YWl0IGdyb3EuY2hhdC5jb21wbGV0aW9ucy5jcmVhdGUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIk1lc3NhZ2UgYmFjayBmcm9tIEdyb3FcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGNoYXRfY29tcGxldGlvbi5jaG9pY2VzWzBdLm1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgbm9kZV9jb250ZW50ID0gYDxyb2xlPmFzc2lzdGFudDwvcm9sZT5cXG4ke2NvbnRlbnR9YDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobW9kZWxfY2hvaWNlID09PSBcIm9wZW5haS1ncHQtNFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gXCJncHQtNC0xMTA2LXByZXZpZXdcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IGNvbnZlcnNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOiBtb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiQ2FsbGluZyBHUFQtNCFcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXRfY29tcGxldGlvbjogT3BlbkFJLkNoYXQuQ2hhdENvbXBsZXRpb24gPSBhd2FpdCBvcGVuYWkuY2hhdC5jb21wbGV0aW9ucy5jcmVhdGUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIk1lc3NhZ2UgYmFjayBmcm9tIEdQVC00IVwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgY2hhdF9jb21wbGV0aW9uOiBPcGVuQUkuQ2hhdC5DaGF0Q29tcGxldGlvbiA9IGF3YWl0IGdyb3EuY2hhdC5jb21wbGV0aW9ucy5jcmVhdGUocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGNoYXRfY29tcGxldGlvbi5jaG9pY2VzWzBdLm1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgbm9kZV9jb250ZW50ID0gYDxyb2xlPmFzc2lzdGFudDwvcm9sZT5cXG4ke2NvbnRlbnR9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IG5vZGUueCArIG5vZGUud2lkdGggKyAyMDA7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGUoY2FudmFzLCBub2RlLCB4LCBub2RlLnksIG5vZGVfY29udGVudCwgXCJyaWdodFwiLCBcImxlZnRcIiwgXCJncm9xXCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtZW51RWwuYXBwZW5kQ2hpbGQoYnV0dG9uRWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGROb2RlID0gYXN5bmMgKFxuICAgICAgICBjYW52YXM6IENhbnZhcyxcbiAgICAgICAgcGFyZW50Tm9kZTogQ2FudmFzTm9kZURhdGEsXG4gICAgICAgIHg6IG51bWJlcixcbiAgICAgICAgeTogbnVtYmVyLFxuICAgICAgICBjb250ZW50OiBzdHJpbmcgPSBcIlwiLFxuICAgICAgICBmcm9tX3NpZGU6IHN0cmluZyA9IFwicmlnaHRcIixcbiAgICAgICAgdG9fc2lkZTogc3RyaW5nID0gXCJsZWZ0XCIsXG4gICAgICAgIG9yaWdpbjogc3RyaW5nID0gXCJpZ25vcmVcIlxuICAgICkgPT4ge1xuICAgICAgICBsZXQgdGVtcENoaWxkTm9kZSA9IHRoaXMuYWRkTm9kZShjYW52YXMsIHRoaXMucmFuZG9tKDE2KSwge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHksXG4gICAgICAgICAgICB3aWR0aDogcGFyZW50Tm9kZS53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogcGFyZW50Tm9kZS5oZWlnaHQsXG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUVkZ2UocGFyZW50Tm9kZSwgdGVtcENoaWxkTm9kZSwgY2FudmFzLCBmcm9tX3NpZGUsIHRvX3NpZGUpO1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSBjYW52YXMubm9kZXM/LmdldCh0ZW1wQ2hpbGROb2RlPy5pZCEpO1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybjtcblxuICAgICAgICAvLyBjYW52YXMuc2VsZWN0T25seShub2RlKTtcblxuICAgICAgICBjYW52YXMucmVxdWVzdFNhdmUoKTtcblxuICAgICAgICByZXR1cm4gdGVtcENoaWxkTm9kZTtcbiAgICB9O1xuXG4gICAgYWRkTm9kZSA9IChcbiAgICAgICAgY2FudmFzOiBDYW52YXMsXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgIHN1YnBhdGgsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIHg6IG51bWJlcjtcbiAgICAgICAgICAgIHk6IG51bWJlcjtcbiAgICAgICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgICAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiIHwgXCJmaWxlXCI7XG4gICAgICAgICAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgICAgICAgICBzdWJwYXRoPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgKSA9PiB7XG4gICAgICAgIGlmICghY2FudmFzKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IGNhbnZhcy5nZXREYXRhKCk7XG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5vZGU6IFBhcnRpYWw8Q2FudmFzVGV4dERhdGEgfCBDYW52YXNGaWxlRGF0YT4gPSB7XG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICAgICAgICAgICAgbm9kZS50ZXh0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICAgICAgICAgICAgbm9kZS5maWxlID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBpZiAoc3VicGF0aCkgbm9kZS5zdWJwYXRoID0gc3VicGF0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbnZhcy5pbXBvcnREYXRhKDxDYW52YXNEYXRhPntcbiAgICAgICAgICAgIG5vZGVzOiBbLi4uZGF0YS5ub2Rlcywgbm9kZV0sXG4gICAgICAgICAgICBlZGdlczogZGF0YS5lZGdlcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FudmFzLnJlcXVlc3RGcmFtZSgpO1xuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH07XG4gICAgY3JlYXRlRWRnZSA9IGFzeW5jIChub2RlMTogYW55LCBub2RlMjogYW55LCBjYW52YXM6IGFueSwgZnJvbV9zaWRlOiBzdHJpbmcgPSBcInJpZ2h0XCIsIHRvX3NpZGU6IHN0cmluZyA9IFwibGVmdFwiKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkRWRnZShcbiAgICAgICAgICAgIGNhbnZhcyxcbiAgICAgICAgICAgIHRoaXMucmFuZG9tKDE2KSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmcm9tT3JUbzogXCJmcm9tXCIsXG4gICAgICAgICAgICAgICAgc2lkZTogZnJvbV9zaWRlLFxuICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmcm9tT3JUbzogXCJ0b1wiLFxuICAgICAgICAgICAgICAgIHNpZGU6IHRvX3NpZGUsXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZTIsXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfTtcbiAgICAvLyBUT0RPIC0gQ2hhbmdlIHRoaXNcbiAgICByYW5kb20gPSAoZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGxldCB0ID0gW107XG4gICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgZTsgbisrKSB7XG4gICAgICAgICAgICB0LnB1c2goKCgxNiAqIE1hdGgucmFuZG9tKCkpIHwgMCkudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdC5qb2luKFwiXCIpO1xuICAgIH07XG4gICAgYWRkRWRnZSA9IChjYW52YXM6IGFueSwgZWRnZUlEOiBzdHJpbmcsIGZyb21FZGdlOiBlZGdlVCwgdG9FZGdlOiBlZGdlVCkgPT4ge1xuICAgICAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjYW52YXMuZ2V0RGF0YSgpO1xuICAgICAgICBpZiAoIWRhdGEpIHJldHVybjtcblxuICAgICAgICBjYW52YXMuaW1wb3J0RGF0YSh7XG4gICAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgICAgIC4uLmRhdGEuZWRnZXMsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWRnZUlELFxuICAgICAgICAgICAgICAgICAgICBmcm9tTm9kZTogZnJvbUVkZ2Uubm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgZnJvbVNpZGU6IGZyb21FZGdlLnNpZGUsXG4gICAgICAgICAgICAgICAgICAgIHRvTm9kZTogdG9FZGdlLm5vZGUuaWQsXG4gICAgICAgICAgICAgICAgICAgIHRvU2lkZTogdG9FZGdlLnNpZGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBub2RlczogZGF0YS5ub2RlcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FudmFzLnJlcXVlc3RGcmFtZSgpO1xuICAgIH07XG5cbiAgICAvLyBNZXRob2QgdG8gaW5zZXJ0IHRleHQgaW50byB0aGUgc2lkZWJhclxuICAgIGluc2VydFRleHRJbnRvU2lkZWJhcih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdHJpbW1lZF90ZXh0ID0gdGV4dC50cmltKCk7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XG4gICAgICAgICAgICBpZiAobGVhZi52aWV3LmdldFZpZXdUeXBlKCkgPT09IFZJRVdfTkFNRV9TSURFQkFSX0NIQVQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3IGFzIFNpZGViYXJDaGF0O1xuICAgICAgICAgICAgICAgIGlmICh2aWV3LnRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy50ZXh0Qm94LnZhbHVlICs9IHRyaW1tZWRfdGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1ldGhvZCB0byBjbGVhciB0ZXh0IGZyb20gdGhlIHNpZGViYXJcbiAgICBjbGVhclRleHRJblNpZGViYXIoKSB7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XG4gICAgICAgICAgICBpZiAobGVhZi52aWV3LmdldFZpZXdUeXBlKCkgPT09IFZJRVdfTkFNRV9TSURFQkFSX0NIQVQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3IGFzIFNpZGViYXJDaGF0O1xuICAgICAgICAgICAgICAgIGlmICh2aWV3LnRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy50ZXh0Qm94LnZhbHVlID0gXCJcIjsgLy8gQ2xlYXIgdGhlIHRleHQgYm94XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2aWV3Lm1lc3NhZ2VzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcubWVzc2FnZXNDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjsgLy8gQ2xlYXIgdGhlIG1lc3NhZ2VzIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZFNpZGViYXJUYWIoKSB7XG4gICAgICAgIHRoaXMuYWRkUmliYm9uSWNvbihcImRvY3VtZW50XCIsIFwiT3BlbiBDYXJldFwiLCBhc3luYyAoZXZ0KSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmlldyBpcyBhbHJlYWR5IHByZXNlbnQgaW4gYW55IGxlYWZcblxuICAgICAgICAgICAgLy8gVGhpcyBjcmVhdGVzIHRoZSB2aWV3IGluIHRoZSBzaWRlYmFyXG4gICAgICAgICAgICAvLyBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgaWYgKGxlYWYudmlldy5nZXRWaWV3VHlwZSgpID09PSBWSUVXX05BTUVfU0lERUJBUl9DSEFUKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gSWYgdGhlIHZpZXcgaXMgbm90IHRoZSBhY3RpdmUgdmlldywgYnJpbmcgaXQgaW50byBmb2N1c1xuICAgICAgICAgICAgLy8gICAgICAgICBpZiAoIWxlYWYudmlldy5jb250YWluZXJFbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImlzLWFjdGl2ZVwiKSkge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLnJldmVhbExlYWYobGVhZik7XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9KTtcblxuICAgICAgICAgICAgLy8gLy8gSWYgdGhlIHZpZXcgd2FzIG5vdCBmb3VuZCwgY3JlYXRlIGl0IGluIHRoZSByaWdodCBzaWRlYmFyXG4gICAgICAgICAgICAvLyBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAvLyAgICAgYXdhaXQgdGhpcy5hcHAud29ya3NwYWNlLmdldFJpZ2h0TGVhZihmYWxzZSkuc2V0Vmlld1N0YXRlKHtcbiAgICAgICAgICAgIC8vICAgICAgICAgdHlwZTogVklFV19OQU1FX1NJREVCQVJfQ0hBVCxcbiAgICAgICAgICAgIC8vICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuYXBwLndvcmtzcGFjZS5yZXZlYWxMZWFmKHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpKTtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgbGV0IG1haW5fY2hhdF9mb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobGVhZi52aWV3LmdldFZpZXdUeXBlKCkgPT09IFZJRVdfTkFNRV9NQUlOX0NIQVQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbl9jaGF0X2ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZpZXcgaXMgbm90IHRoZSBhY3RpdmUgdmlldywgYnJpbmcgaXQgaW50byBmb2N1c1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmICghbGVhZi52aWV3LmNvbnRhaW5lckVsLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiaXMtYWN0aXZlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UucmV2ZWFsTGVhZihsZWFmKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgdmlldyB3YXMgbm90IGZvdW5kLCBjcmVhdGUgaXQgaW4gdGhlIHJpZ2h0IHNpZGViYXJcbiAgICAgICAgICAgIGlmICghbWFpbl9jaGF0X2ZvdW5kKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSkuc2V0Vmlld1N0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogVklFV19OQU1FX01BSU5fQ0hBVCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuYXBwLndvcmtzcGFjZS5yZXZlYWxMZWFmKHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKHRydWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb251bmxvYWQoKSB7fVxuXG4gICAgYXN5bmMgbG9hZFNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG4gICAgfVxufVxuXG5jbGFzcyBTYW1wbGVTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gICAgcGx1Z2luOiBNeVBsdWdpbjtcblxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IE15UGx1Z2luKSB7XG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcbiAgICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47XG4gICAgfVxuXG4gICAgZGlzcGxheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuICAgICAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoXCJTZXR0aW5nICMxXCIpXG4gICAgICAgICAgICAuc2V0RGVzYyhcIkl0J3MgYSBzZWNyZXRcIilcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFBsYWNlaG9sZGVyKFwiRW50ZXIgeW91ciBzZWNyZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm15U2V0dGluZylcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubXlTZXR0aW5nID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgfVxufVxuIiwgImZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7XG5cdHJldHVybiB4ICYmIHguX19lc01vZHVsZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ2RlZmF1bHQnKSA/IHhbJ2RlZmF1bHQnXSA6IHg7XG59XG5cbmZ1bmN0aW9uIGdldEF1Z21lbnRlZE5hbWVzcGFjZShuKSB7XG4gIGlmIChuLl9fZXNNb2R1bGUpIHJldHVybiBuO1xuICB2YXIgZiA9IG4uZGVmYXVsdDtcblx0aWYgKHR5cGVvZiBmID09IFwiZnVuY3Rpb25cIikge1xuXHRcdHZhciBhID0gZnVuY3Rpb24gYSAoKSB7XG5cdFx0XHRpZiAodGhpcyBpbnN0YW5jZW9mIGEpIHtcblx0XHRcdFx0dmFyIGFyZ3MgPSBbbnVsbF07XG5cdFx0XHRcdGFyZ3MucHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpO1xuXHRcdFx0XHR2YXIgQ3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoZiwgYXJncyk7XG5cdFx0XHRcdHJldHVybiBuZXcgQ3RvcigpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHR9O1xuXHRcdGEucHJvdG90eXBlID0gZi5wcm90b3R5cGU7XG4gIH0gZWxzZSBhID0ge307XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCAnX19lc01vZHVsZScsIHt2YWx1ZTogdHJ1ZX0pO1xuXHRPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG5cdFx0dmFyIGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sIGspO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBrLCBkLmdldCA/IGQgOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBuW2tdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblx0cmV0dXJuIGE7XG59XG5cbnZhciBnbG9iYWwkMSA9ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDpcbiAgdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDpcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KTtcblxudmFyIGxvb2t1cCA9IFtdO1xudmFyIHJldkxvb2t1cCA9IFtdO1xudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheTtcbnZhciBpbml0ZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGluaXQgKCkge1xuICBpbml0ZWQgPSB0cnVlO1xuICB2YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBsb29rdXBbaV0gPSBjb2RlW2ldO1xuICAgIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaTtcbiAgfVxuXG4gIHJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MjtcbiAgcmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzO1xufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIGlmICghaW5pdGVkKSB7XG4gICAgaW5pdCgpO1xuICB9XG4gIHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyO1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aDtcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcGxhY2VIb2xkZXJzID0gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMDtcblxuICAvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbiAgYXJyID0gbmV3IEFycihsZW4gKiAzIC8gNCAtIHBsYWNlSG9sZGVycyk7XG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW47XG5cbiAgdmFyIEwgPSAwO1xuXG4gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSA0LCBqICs9IDMpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV07XG4gICAgYXJyW0wrK10gPSAodG1wID4+IDE2KSAmIDB4RkY7XG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRjtcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkY7XG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNCk7XG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGO1xuICB9IGVsc2UgaWYgKHBsYWNlSG9sZGVycyA9PT0gMSkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKTtcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGO1xuICAgIGFycltMKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICsgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wO1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKTtcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICBpZiAoIWluaXRlZCkge1xuICAgIGluaXQoKTtcbiAgfVxuICB2YXIgdG1wO1xuICB2YXIgbGVuID0gdWludDgubGVuZ3RoO1xuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDM7IC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBvdXRwdXQgPSAnJztcbiAgdmFyIHBhcnRzID0gW107XG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzOyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKTtcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXTtcbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAyXTtcbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXTtcbiAgICBvdXRwdXQgKz0gJz09JztcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgKHVpbnQ4W2xlbiAtIDFdKTtcbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF07XG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl07XG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl07XG4gICAgb3V0cHV0ICs9ICc9JztcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KTtcblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cblxuZnVuY3Rpb24gcmVhZCAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbTtcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBuQml0cyA9IC03O1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwO1xuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDE7XG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldO1xuXG4gIGkgKz0gZDtcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKTtcbiAgcyA+Pj0gKC1uQml0cyk7XG4gIG5CaXRzICs9IGVMZW47XG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSk7XG4gIGUgPj49ICgtbkJpdHMpO1xuICBuQml0cyArPSBtTGVuO1xuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhcztcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKTtcbiAgICBlID0gZSAtIGVCaWFzO1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmZ1bmN0aW9uIHdyaXRlIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgYztcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMCk7XG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSk7XG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMTtcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDA7XG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7XG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDA7XG4gICAgZSA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpO1xuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMDtcbiAgICAgIGUgPSBlTWF4O1xuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSBlICsgZUJpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbTtcbiAgZUxlbiArPSBtTGVuO1xuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4O1xufVxuXG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIGlzQXJyYXkkMiA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5cbnZhciBJTlNQRUNUX01BWF9CWVRFUyA9IDUwO1xuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbCQxLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbCQxLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0cnVlO1xuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5rTWF4TGVuZ3RoKCk7XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlO1xuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKTtcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGg7XG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTI7IC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlO1xuICByZXR1cm4gYXJyXG59O1xuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn07XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlO1xuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheTtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIDtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpO1xuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59O1xuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpO1xuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKTtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufTtcbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn07XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMDtcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpO1xuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpO1xuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKTtcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDA7XG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NTtcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aDsgLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KTtcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXk7XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlO1xuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDA7XG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pO1xuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbik7XG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheSQyKG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuQnVmZmVyLmlzQnVmZmVyID0gaXNCdWZmZXI7XG5mdW5jdGlvbiBpbnRlcm5hbElzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYSkgfHwgIWludGVybmFsSXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGg7XG4gIHZhciB5ID0gYi5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV07XG4gICAgICB5ID0gYltpXTtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufTtcblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn07XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkkMihsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaTtcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKTtcbiAgdmFyIHBvcyA9IDA7XG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV07XG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKTtcbiAgICBwb3MgKz0gYnVmLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59O1xuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZztcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoO1xuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTtcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoO1xuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlO1xuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDA7XG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwO1xuICBzdGFydCA+Pj49IDA7XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCc7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlO1xuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXTtcbiAgYltuXSA9IGJbbV07XG4gIGJbbV0gPSBpO1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKTtcbiAgfVxuICByZXR1cm4gdGhpc1xufTtcblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMyk7XG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpO1xuICB9XG4gIHJldHVybiB0aGlzXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KTtcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNik7XG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpO1xuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KTtcbiAgfVxuICByZXR1cm4gdGhpc1xufTtcblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMDtcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnO1xuICB2YXIgbWF4ID0gSU5TUEVDVF9NQVhfQllURVM7XG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKTtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnO1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDA7XG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDA7XG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMDtcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoO1xuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMDtcbiAgZW5kID4+Pj0gMDtcbiAgdGhpc1N0YXJ0ID4+Pj0gMDtcbiAgdGhpc0VuZCA+Pj49IDA7XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnQ7XG4gIHZhciB5ID0gZW5kIC0gc3RhcnQ7XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KTtcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZCk7XG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXTtcbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldO1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59O1xuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXQ7XG4gICAgYnl0ZU9mZnNldCA9IDA7XG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZjtcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDA7XG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0OyAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXQ7XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMTtcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwO1xuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpO1xuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKGludGVybmFsSXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGOyAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxO1xuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGg7XG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyO1xuICAgICAgYXJyTGVuZ3RoIC89IDI7XG4gICAgICB2YWxMZW5ndGggLz0gMjtcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGk7XG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xO1xuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpO1xuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXg7XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGg7XG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWU7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn07XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMDtcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXQ7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpO1xuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aDtcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KTtcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWQ7XG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgb2Zmc2V0ID0gMDtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldDtcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBvZmZzZXQgPSAwO1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwO1xuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aDtcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0O1xuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmc7XG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCc7XG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2U7XG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn07XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBmcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTtcbiAgdmFyIHJlcyA9IFtdO1xuXG4gIHZhciBpID0gc3RhcnQ7XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXTtcbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbDtcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDE7XG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50O1xuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpO1xuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdO1xuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpO1xuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXTtcbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXTtcbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpO1xuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRDtcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxO1xuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDA7XG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkY7XG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KTtcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2U7XG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDA7XG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGg7XG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJyc7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZCk7XG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnO1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpO1xuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMDtcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlbjtcblxuICB2YXIgb3V0ID0gJyc7XG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGg7XG4gIHN0YXJ0ID0gfn5zdGFydDtcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZDtcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuO1xuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDtcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuO1xuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuO1xuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwO1xuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlbjtcbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7XG5cbiAgdmFyIG5ld0J1ZjtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKTtcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydDtcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn07XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XTtcbiAgdmFyIG11bCA9IDE7XG4gIHZhciBpID0gMDtcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bDtcbiAgfVxuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdO1xuICB2YXIgbXVsID0gMTtcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bDtcbiAgfVxuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpO1xuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIGkgPSAwO1xuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsO1xuICB9XG4gIG11bCAqPSAweDgwO1xuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpO1xuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aCk7XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXTtcbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bDtcbiAgfVxuICBtdWwgKj0gMHg4MDtcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKTtcblxuICByZXR1cm4gdmFsXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7XG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KTtcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOCk7XG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiByZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuIHJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59O1xuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMTtcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMCk7XG4gIH1cblxuICB2YXIgbXVsID0gMTtcbiAgdmFyIGkgPSAwO1xuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkY7XG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMDtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDE7XG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApO1xuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMTtcbiAgdmFyIG11bCA9IDE7XG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkY7XG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMCk7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICByZXR1cm4gb2Zmc2V0ICsgMVxufTtcblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxO1xuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogODtcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKTtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZik7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOCk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn07XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDE7XG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmO1xuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKTtcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNik7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOCk7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpO1xuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIHN1YiA9IDA7XG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRjtcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMTtcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRjtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSk7XG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdCk7XG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIHN1YiA9IDA7XG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkY7XG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxO1xuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApO1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDE7XG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICByZXR1cm4gb2Zmc2V0ICsgMVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNik7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpO1xuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKTtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNik7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOCk7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufTtcblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCk7XG4gIH1cbiAgd3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KTtcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn07XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgpO1xuICB9XG4gIHdyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOCk7XG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59O1xuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMDtcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aDtcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwO1xuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnQ7XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoO1xuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydDtcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydDtcbiAgdmFyIGk7XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBsZW5cbn07XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kO1xuICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApO1xuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTU7XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDA7XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDA7XG5cbiAgaWYgKCF2YWwpIHZhbCA9IDA7XG5cbiAgdmFyIGk7XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IGludGVybmFsSXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKTtcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufTtcblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2c7XG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJyk7XG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9JztcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eTtcbiAgdmFyIGNvZGVQb2ludDtcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbDtcbiAgdmFyIGJ5dGVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludDtcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludDtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGw7XG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KTtcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKTtcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG87XG4gIHZhciBieXRlQXJyYXkgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBoaSA9IGMgPj4gODtcbiAgICBsbyA9IGMgJSAyNTY7XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pO1xuICAgIGJ5dGVBcnJheS5wdXNoKGhpKTtcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIHRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXTtcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG5cbi8vIHRoZSBmb2xsb3dpbmcgaXMgZnJvbSBpcy1idWZmZXIsIGFsc28gYnkgRmVyb3NzIEFib3VraGFkaWplaCBhbmQgd2l0aCBzYW1lIGxpc2VuY2Vcbi8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3Npbmdcbi8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHlcbmZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKCEhb2JqLl9pc0J1ZmZlciB8fCBpc0Zhc3RCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSlcbn1cblxuZnVuY3Rpb24gaXNGYXN0QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNGYXN0QnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cblxuLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG4vLyBiYXNlZCBvZmYgaHR0cHM6Ly9naXRodWIuY29tL2RlZnVuY3R6b21iaWUvbm9kZS1wcm9jZXNzL2Jsb2IvbWFzdGVyL2Jyb3dzZXIuanNcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG52YXIgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbmlmICh0eXBlb2YgZ2xvYmFsJDEuc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xufVxuaWYgKHR5cGVvZiBnbG9iYWwkMS5jbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG59XG5cbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cbmZ1bmN0aW9uIG5leHRUaWNrKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59XG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xudmFyIHRpdGxlID0gJ2Jyb3dzZXInO1xudmFyIHBsYXRmb3JtID0gJ2Jyb3dzZXInO1xudmFyIGJyb3dzZXIgPSB0cnVlO1xudmFyIGVudiA9IHt9O1xudmFyIGFyZ3YgPSBbXTtcbnZhciB2ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG52YXIgdmVyc2lvbnMgPSB7fTtcbnZhciByZWxlYXNlID0ge307XG52YXIgY29uZmlnID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgb24gPSBub29wO1xudmFyIGFkZExpc3RlbmVyID0gbm9vcDtcbnZhciBvbmNlID0gbm9vcDtcbnZhciBvZmYgPSBub29wO1xudmFyIHJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnZhciByZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xudmFyIGVtaXQgPSBub29wO1xuXG5mdW5jdGlvbiBiaW5kaW5nJDEobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1cblxuZnVuY3Rpb24gY3dkICgpIHsgcmV0dXJuICcvJyB9XG5mdW5jdGlvbiBjaGRpciAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn1mdW5jdGlvbiB1bWFzaygpIHsgcmV0dXJuIDA7IH1cblxuLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20va3VtYXZpcy9icm93c2VyLXByb2Nlc3MtaHJ0aW1lL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG52YXIgcGVyZm9ybWFuY2UgPSBnbG9iYWwkMS5wZXJmb3JtYW5jZSB8fCB7fTtcbnZhciBwZXJmb3JtYW5jZU5vdyA9XG4gIHBlcmZvcm1hbmNlLm5vdyAgICAgICAgfHxcbiAgcGVyZm9ybWFuY2UubW96Tm93ICAgICB8fFxuICBwZXJmb3JtYW5jZS5tc05vdyAgICAgIHx8XG4gIHBlcmZvcm1hbmNlLm9Ob3cgICAgICAgfHxcbiAgcGVyZm9ybWFuY2Uud2Via2l0Tm93ICB8fFxuICBmdW5jdGlvbigpeyByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSB9O1xuXG4vLyBnZW5lcmF0ZSB0aW1lc3RhbXAgb3IgZGVsdGFcbi8vIHNlZSBodHRwOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19ocnRpbWVcbmZ1bmN0aW9uIGhydGltZShwcmV2aW91c1RpbWVzdGFtcCl7XG4gIHZhciBjbG9ja3RpbWUgPSBwZXJmb3JtYW5jZU5vdy5jYWxsKHBlcmZvcm1hbmNlKSoxZS0zO1xuICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IoY2xvY2t0aW1lKTtcbiAgdmFyIG5hbm9zZWNvbmRzID0gTWF0aC5mbG9vcigoY2xvY2t0aW1lJTEpKjFlOSk7XG4gIGlmIChwcmV2aW91c1RpbWVzdGFtcCkge1xuICAgIHNlY29uZHMgPSBzZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMF07XG4gICAgbmFub3NlY29uZHMgPSBuYW5vc2Vjb25kcyAtIHByZXZpb3VzVGltZXN0YW1wWzFdO1xuICAgIGlmIChuYW5vc2Vjb25kczwwKSB7XG4gICAgICBzZWNvbmRzLS07XG4gICAgICBuYW5vc2Vjb25kcyArPSAxZTk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbc2Vjb25kcyxuYW5vc2Vjb25kc11cbn1cblxudmFyIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5mdW5jdGlvbiB1cHRpbWUoKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCk7XG4gIHZhciBkaWYgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTtcbiAgcmV0dXJuIGRpZiAvIDEwMDA7XG59XG5cbnZhciBicm93c2VyJDEgPSB7XG4gIG5leHRUaWNrOiBuZXh0VGljayxcbiAgdGl0bGU6IHRpdGxlLFxuICBicm93c2VyOiBicm93c2VyLFxuICBlbnY6IGVudixcbiAgYXJndjogYXJndixcbiAgdmVyc2lvbjogdmVyc2lvbixcbiAgdmVyc2lvbnM6IHZlcnNpb25zLFxuICBvbjogb24sXG4gIGFkZExpc3RlbmVyOiBhZGRMaXN0ZW5lcixcbiAgb25jZTogb25jZSxcbiAgb2ZmOiBvZmYsXG4gIHJlbW92ZUxpc3RlbmVyOiByZW1vdmVMaXN0ZW5lcixcbiAgcmVtb3ZlQWxsTGlzdGVuZXJzOiByZW1vdmVBbGxMaXN0ZW5lcnMsXG4gIGVtaXQ6IGVtaXQsXG4gIGJpbmRpbmc6IGJpbmRpbmckMSxcbiAgY3dkOiBjd2QsXG4gIGNoZGlyOiBjaGRpcixcbiAgdW1hc2s6IHVtYXNrLFxuICBocnRpbWU6IGhydGltZSxcbiAgcGxhdGZvcm06IHBsYXRmb3JtLFxuICByZWxlYXNlOiByZWxlYXNlLFxuICBjb25maWc6IGNvbmZpZyxcbiAgdXB0aW1lOiB1cHRpbWVcbn07XG5cbmZ1bmN0aW9uIGNvbW1vbmpzUmVxdWlyZShwYXRoKSB7XG5cdHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGR5bmFtaWNhbGx5IHJlcXVpcmUgXCInICsgcGF0aCArICdcIi4gUGxlYXNlIGNvbmZpZ3VyZSB0aGUgZHluYW1pY1JlcXVpcmVUYXJnZXRzIG9yL2FuZCBpZ25vcmVEeW5hbWljUmVxdWlyZXMgb3B0aW9uIG9mIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgcmVxdWlyZSBjYWxsIHRvIHdvcmsuJyk7XG59XG5cbnZhciBwZGYkMiA9IHtleHBvcnRzOiB7fX07XG5cbnZhciBfcG9seWZpbGxOb2RlX2ZzID0ge307XG5cbnZhciBfcG9seWZpbGxOb2RlX2ZzJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0ZGVmYXVsdDogX3BvbHlmaWxsTm9kZV9mc1xufSk7XG5cbnZhciByZXF1aXJlJCQwID0gLypAX19QVVJFX18qL2dldEF1Z21lbnRlZE5hbWVzcGFjZShfcG9seWZpbGxOb2RlX2ZzJDEpO1xuXG52YXIgX25vZGVSZXNvbHZlX2VtcHR5ID0ge307XG5cbnZhciBfbm9kZVJlc29sdmVfZW1wdHkkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRkZWZhdWx0OiBfbm9kZVJlc29sdmVfZW1wdHlcbn0pO1xuXG52YXIgcmVxdWlyZSQkMSA9IC8qQF9fUFVSRV9fKi9nZXRBdWdtZW50ZWROYW1lc3BhY2UoX25vZGVSZXNvbHZlX2VtcHR5JDEpO1xuXG52YXIgaGFzRmV0Y2ggPSBpc0Z1bmN0aW9uJDEoZ2xvYmFsJDEuZmV0Y2gpICYmIGlzRnVuY3Rpb24kMShnbG9iYWwkMS5SZWFkYWJsZVN0cmVhbSk7XG5cbnZhciBfYmxvYkNvbnN0cnVjdG9yO1xuZnVuY3Rpb24gYmxvYkNvbnN0cnVjdG9yKCkge1xuICBpZiAodHlwZW9mIF9ibG9iQ29uc3RydWN0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIF9ibG9iQ29uc3RydWN0b3I7XG4gIH1cbiAgdHJ5IHtcbiAgICBuZXcgZ2xvYmFsJDEuQmxvYihbbmV3IEFycmF5QnVmZmVyKDEpXSk7XG4gICAgX2Jsb2JDb25zdHJ1Y3RvciA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBfYmxvYkNvbnN0cnVjdG9yID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIF9ibG9iQ29uc3RydWN0b3Jcbn1cbnZhciB4aHI7XG5cbmZ1bmN0aW9uIGNoZWNrVHlwZVN1cHBvcnQodHlwZSkge1xuICBpZiAoIXhocikge1xuICAgIHhociA9IG5ldyBnbG9iYWwkMS5YTUxIdHRwUmVxdWVzdCgpO1xuICAgIC8vIElmIGxvY2F0aW9uLmhvc3QgaXMgZW1wdHksIGUuZy4gaWYgdGhpcyBwYWdlL3dvcmtlciB3YXMgbG9hZGVkXG4gICAgLy8gZnJvbSBhIEJsb2IsIHRoZW4gdXNlIGV4YW1wbGUuY29tIHRvIGF2b2lkIGFuIGVycm9yXG4gICAgeGhyLm9wZW4oJ0dFVCcsIGdsb2JhbCQxLmxvY2F0aW9uLmhvc3QgPyAnLycgOiAnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICB9XG4gIHRyeSB7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHhoci5yZXNwb25zZVR5cGUgPT09IHR5cGVcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbn1cblxuLy8gRm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIFNhZmFyaSA3LjAgcmVwb3J0cyB0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyID09PSAnb2JqZWN0Jy5cbi8vIFNhZmFyaSA3LjEgYXBwZWFycyB0byBoYXZlIGZpeGVkIHRoaXMgYnVnLlxudmFyIGhhdmVBcnJheUJ1ZmZlciA9IHR5cGVvZiBnbG9iYWwkMS5BcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgaGF2ZVNsaWNlID0gaGF2ZUFycmF5QnVmZmVyICYmIGlzRnVuY3Rpb24kMShnbG9iYWwkMS5BcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO1xuXG52YXIgYXJyYXlidWZmZXIgPSBoYXZlQXJyYXlCdWZmZXIgJiYgY2hlY2tUeXBlU3VwcG9ydCgnYXJyYXlidWZmZXInKTtcbiAgLy8gVGhlc2UgbmV4dCB0d28gdGVzdHMgdW5hdm9pZGFibHkgc2hvdyB3YXJuaW5ncyBpbiBDaHJvbWUuIFNpbmNlIGZldGNoIHdpbGwgYWx3YXlzXG4gIC8vIGJlIHVzZWQgaWYgaXQncyBhdmFpbGFibGUsIGp1c3QgcmV0dXJuIGZhbHNlIGZvciB0aGVzZSB0byBhdm9pZCB0aGUgd2FybmluZ3MuXG52YXIgbXNzdHJlYW0gPSAhaGFzRmV0Y2ggJiYgaGF2ZVNsaWNlICYmIGNoZWNrVHlwZVN1cHBvcnQoJ21zLXN0cmVhbScpO1xudmFyIG1vemNodW5rZWRhcnJheWJ1ZmZlciA9ICFoYXNGZXRjaCAmJiBoYXZlQXJyYXlCdWZmZXIgJiZcbiAgY2hlY2tUeXBlU3VwcG9ydCgnbW96LWNodW5rZWQtYXJyYXlidWZmZXInKTtcbnZhciBvdmVycmlkZU1pbWVUeXBlID0gaXNGdW5jdGlvbiQxKHhoci5vdmVycmlkZU1pbWVUeXBlKTtcbnZhciB2YkFycmF5ID0gaXNGdW5jdGlvbiQxKGdsb2JhbCQxLlZCQXJyYXkpO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uJDEodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG54aHIgPSBudWxsOyAvLyBIZWxwIGdjXG5cbnZhciBpbmhlcml0cztcbmlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJyl7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICBpbmhlcml0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKTtcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gIH07XG59XG52YXIgaW5oZXJpdHMkMSA9IGluaGVyaXRzO1xuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmZ1bmN0aW9uIGZvcm1hdCQxKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZnVuY3Rpb24gZGVwcmVjYXRlKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbCQxLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAoYnJvd3NlciQxLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChicm93c2VyJDEudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAoYnJvd3NlciQxLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmZ1bmN0aW9uIGRlYnVnbG9nKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBicm93c2VyJDEuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gMDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBmb3JtYXQkMS5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufVxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBpbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5JDEodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkkMSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSQxKHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5JDEoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5mdW5jdGlvbiBfZXh0ZW5kKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eSQxKG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cbnZhciBkb21haW47XG5cbi8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBzdG9yZSBldmVudCBoYW5kbGVycy4gSW5zdGFudGlhdGluZyB0aGlzIGlzXG4vLyBmYXN0ZXIgdGhhbiBleHBsaWNpdGx5IGNhbGxpbmcgYE9iamVjdC5jcmVhdGUobnVsbClgIHRvIGdldCBhIFwiY2xlYW5cIiBlbXB0eVxuLy8gb2JqZWN0ICh0ZXN0ZWQgd2l0aCB2OCB2NC45KS5cbmZ1bmN0aW9uIEV2ZW50SGFuZGxlcnMoKSB7fVxuRXZlbnRIYW5kbGVycy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIEV2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyk7XG59XG5cbi8vIG5vZGVqcyBvZGRpdHlcbi8vIHJlcXVpcmUoJ2V2ZW50cycpID09PSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci51c2luZ0RvbWFpbnMgPSBmYWxzZTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5kb21haW4gPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbkV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbkV2ZW50RW1pdHRlci5pbml0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZG9tYWluID0gbnVsbDtcbiAgaWYgKEV2ZW50RW1pdHRlci51c2luZ0RvbWFpbnMpIHtcbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgZG9tYWluLCB0aGVuIGF0dGFjaCB0byBpdC5cbiAgICBpZiAoZG9tYWluLmFjdGl2ZSApIDtcbiAgfVxuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8IHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiblwiIGFyZ3VtZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiAkZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiAkZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuLy8gVGhlc2Ugc3RhbmRhbG9uZSBlbWl0KiBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gb3B0aW1pemUgY2FsbGluZyBvZiBldmVudFxuLy8gaGFuZGxlcnMgZm9yIGZhc3QgY2FzZXMgYmVjYXVzZSBlbWl0KCkgaXRzZWxmIG9mdGVuIGhhcyBhIHZhcmlhYmxlIG51bWJlciBvZlxuLy8gYXJndW1lbnRzIGFuZCBjYW4gYmUgZGVvcHRpbWl6ZWQgYmVjYXVzZSBvZiB0aGF0LiBUaGVzZSBmdW5jdGlvbnMgYWx3YXlzIGhhdmVcbi8vIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgYW5kIHRodXMgZG8gbm90IGdldCBkZW9wdGltaXplZCwgc28gdGhlIGNvZGVcbi8vIGluc2lkZSB0aGVtIGNhbiBleGVjdXRlIGZhc3Rlci5cbmZ1bmN0aW9uIGVtaXROb25lKGhhbmRsZXIsIGlzRm4sIHNlbGYpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5jYWxsKHNlbGYpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZik7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRPbmUoaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJnMSkge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmNhbGwoc2VsZiwgYXJnMSk7XG4gIGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmLCBhcmcxKTtcbiAgfVxufVxuZnVuY3Rpb24gZW1pdFR3byhoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxLCBhcmcyKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxLCBhcmcyKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEsIGFyZzIpO1xuICB9XG59XG5mdW5jdGlvbiBlbWl0VGhyZWUoaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmNhbGwoc2VsZiwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gIGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0TWFueShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmdzKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuYXBwbHkoc2VsZiwgYXJncyk7XG4gIGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBldmVudHMsIGRvbWFpbjtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT0gbnVsbCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBkb21haW4gPSB0aGlzLmRvbWFpbjtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgaWYgKGRvbWFpbikge1xuICAgICAgaWYgKCFlcilcbiAgICAgICAgZXIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQnKTtcbiAgICAgIGVyLmRvbWFpbkVtaXR0ZXIgPSB0aGlzO1xuICAgICAgZXIuZG9tYWluID0gZG9tYWluO1xuICAgICAgZXIuZG9tYWluVGhyb3duID0gZmFsc2U7XG4gICAgICBkb21haW4uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgfSBlbHNlIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmICghaGFuZGxlcilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGlzRm4gPSB0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJztcbiAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgc3dpdGNoIChsZW4pIHtcbiAgICAvLyBmYXN0IGNhc2VzXG4gICAgY2FzZSAxOlxuICAgICAgZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgdGhpcyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICBlbWl0T25lKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDpcbiAgICAgIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCB0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSwgYXJndW1lbnRzWzNdKTtcbiAgICAgIGJyZWFrO1xuICAgIC8vIHNsb3dlclxuICAgIGRlZmF1bHQ6XG4gICAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKVxuICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoIWV2ZW50cykge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKCFleGlzdGluZykge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBpZiAoIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgbSA9ICRnZXRNYXhMaXN0ZW5lcnModGFyZ2V0KTtcbiAgICAgIGlmIChtICYmIG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0pIHtcbiAgICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIHcgPSBuZXcgRXJyb3IoJ1Bvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgdHlwZSArICcgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQnKTtcbiAgICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgICAgdy50eXBlID0gdHlwZTtcbiAgICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgICAgZW1pdFdhcm5pbmcodyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGVtaXRXYXJuaW5nKGUpIHtcbiAgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnNvbGUud2FybihlKSA6IGNvbnNvbGUubG9nKGUpO1xufVxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCB0cnVlKTtcbiAgICB9O1xuXG5mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgZmlyZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0YXJnZXQucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHJldHVybiBnO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgdGhpcy5wcmVwZW5kTGlzdGVuZXIodHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0LCBldmVudHMsIHBvc2l0aW9uLCBpLCBvcmlnaW5hbExpc3RlbmVyO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmICghZXZlbnRzKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgbGlzdCA9IGV2ZW50c1t0eXBlXTtcbiAgICAgIGlmICghbGlzdClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCAobGlzdC5saXN0ZW5lciAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICBpZiAoZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3QubGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgb3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RbaV0ubGlzdGVuZXI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGxpc3RbMF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIG9yaWdpbmFsTGlzdGVuZXIgfHwgbGlzdGVuZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFxuLy8gQWxpYXMgZm9yIHJlbW92ZUxpc3RlbmVyIGFkZGVkIGluIE5vZGVKUyAxMC4wXG4vLyBodHRwczovL25vZGVqcy5vcmcvYXBpL2V2ZW50cy5odG1sI2V2ZW50c19lbWl0dGVyX29mZl9ldmVudG5hbWVfbGlzdGVuZXJcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpe1xuICAgIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoIWV2ZW50cylcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmICghZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwga2V5OyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycykge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGRvIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9IHdoaWxlIChsaXN0ZW5lcnNbMF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHZhciBldmxpc3RlbmVyO1xuICB2YXIgcmV0O1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmICghZXZlbnRzKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIHtcbiAgICBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICAgIGlmICghZXZsaXN0ZW5lcilcbiAgICAgIHJldCA9IFtdO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgICAgcmV0ID0gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl07XG4gICAgZWxzZVxuICAgICAgcmV0ID0gdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQkMS5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50JDE7XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50JDEodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuLy8gQWJvdXQgMS41eCBmYXN0ZXIgdGhhbiB0aGUgdHdvLWFyZyB2ZXJzaW9uIG9mIEFycmF5I3NwbGljZSgpLlxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAodmFyIGkgPSBpbmRleCwgayA9IGkgKyAxLCBuID0gbGlzdC5sZW5ndGg7IGsgPCBuOyBpICs9IDEsIGsgKz0gMSlcbiAgICBsaXN0W2ldID0gbGlzdFtrXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIGkpIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0pXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3QoKSB7XG4gIHRoaXMuaGVhZCA9IG51bGw7XG4gIHRoaXMudGFpbCA9IG51bGw7XG4gIHRoaXMubGVuZ3RoID0gMDtcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogbnVsbCB9O1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gIHRoaXMudGFpbCA9IGVudHJ5O1xuICArK3RoaXMubGVuZ3RoO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogdGhpcy5oZWFkIH07XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gIHRoaXMuaGVhZCA9IGVudHJ5O1xuICArK3RoaXMubGVuZ3RoO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAtLXRoaXMubGVuZ3RoO1xuICByZXR1cm4gcmV0O1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gIHRoaXMubGVuZ3RoID0gMDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiAocykge1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gIHZhciByZXQgPSAnJyArIHAuZGF0YTtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICByZXQgKz0gcyArIHAuZGF0YTtcbiAgfXJldHVybiByZXQ7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAobikge1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4gPj4+IDApO1xuICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgdmFyIGkgPSAwO1xuICB3aGlsZSAocCkge1xuICAgIHAuZGF0YS5jb3B5KHJldCwgaSk7XG4gICAgaSArPSBwLmRhdGEubGVuZ3RoO1xuICAgIHAgPSBwLm5leHQ7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfTtcblxuXG5mdW5jdGlvbiBhc3NlcnRFbmNvZGluZyhlbmNvZGluZykge1xuICBpZiAoZW5jb2RpbmcgJiYgIWlzQnVmZmVyRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB9XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy4gQ0VTVS04IGlzIGhhbmRsZWQgYXMgcGFydCBvZiB0aGUgVVRGLTggZW5jb2RpbmcuXG4vL1xuLy8gQFRPRE8gSGFuZGxpbmcgYWxsIGVuY29kaW5ncyBpbnNpZGUgYSBzaW5nbGUgb2JqZWN0IG1ha2VzIGl0IHZlcnkgZGlmZmljdWx0XG4vLyB0byByZWFzb24gYWJvdXQgdGhpcyBjb2RlLCBzbyBpdCBzaG91bGQgYmUgc3BsaXQgdXAgaW4gdGhlIGZ1dHVyZS5cbi8vIEBUT0RPIFRoZXJlIHNob3VsZCBiZSBhIHV0Zjgtc3RyaWN0IGVuY29kaW5nIHRoYXQgcmVqZWN0cyBpbnZhbGlkIFVURi04IGNvZGVcbi8vIHBvaW50cyBhcyB1c2VkIGJ5IENFU1UtOC5cbmZ1bmN0aW9uIFN0cmluZ0RlY29kZXIoZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IChlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sICcnKTtcbiAgYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIC8vIENFU1UtOCByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMy1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgLy8gVVRGLTE2IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAyLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAyO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgLy8gQmFzZS02NCBzdG9yZXMgMyBieXRlcyBpbiA0IGNoYXJzLCBhbmQgcGFkcyB0aGUgcmVtYWluZGVyLlxuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gcGFzc1Rocm91Z2hXcml0ZTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEVub3VnaCBzcGFjZSB0byBzdG9yZSBhbGwgYnl0ZXMgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLiBVVEYtOCBuZWVkcyA0XG4gIC8vIGJ5dGVzLCBidXQgQ0VTVS04IG1heSByZXF1aXJlIHVwIHRvIDYgKDMgYnl0ZXMgcGVyIHN1cnJvZ2F0ZSkuXG4gIHRoaXMuY2hhckJ1ZmZlciA9IG5ldyBCdWZmZXIoNik7XG4gIC8vIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSAwO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhckxlbmd0aCA9IDA7XG59XG5cbi8vIHdyaXRlIGRlY29kZXMgdGhlIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBpdCBhcyBKUyBzdHJpbmcgdGhhdCBpc1xuLy8gZ3VhcmFudGVlZCB0byBub3QgY29udGFpbiBhbnkgcGFydGlhbCBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuIEFueSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIGJ1ZmZlcmVkIHVwLCBhbmQgd2lsbCBiZVxuLy8gcmV0dXJuZWQgd2hlbiBjYWxsaW5nIHdyaXRlIGFnYWluIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcy5cbi8vXG4vLyBOb3RlOiBDb252ZXJ0aW5nIGEgQnVmZmVyIGNvbnRhaW5pbmcgYW4gb3JwaGFuIHN1cnJvZ2F0ZSB0byBhIFN0cmluZ1xuLy8gY3VycmVudGx5IHdvcmtzLCBidXQgY29udmVydGluZyBhIFN0cmluZyB0byBhIEJ1ZmZlciAodmlhIGBuZXcgQnVmZmVyYCwgb3Jcbi8vIEJ1ZmZlciN3cml0ZSkgd2lsbCByZXBsYWNlIGluY29tcGxldGUgc3Vycm9nYXRlcyB3aXRoIHRoZSB1bmljb2RlXG4vLyByZXBsYWNlbWVudCBjaGFyYWN0ZXIuIFNlZSBodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzEyMTE3MzAwOS8gLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIGNoYXJTdHIgPSAnJztcbiAgLy8gaWYgb3VyIGxhc3Qgd3JpdGUgZW5kZWQgd2l0aCBhbiBpbmNvbXBsZXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXJcbiAgd2hpbGUgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGRldGVybWluZSBob3cgbWFueSByZW1haW5pbmcgYnl0ZXMgdGhpcyBidWZmZXIgaGFzIHRvIG9mZmVyIGZvciB0aGlzIGNoYXJcbiAgICB2YXIgYXZhaWxhYmxlID0gKGJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQpID9cbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQgOlxuICAgICAgICBidWZmZXIubGVuZ3RoO1xuXG4gICAgLy8gYWRkIHRoZSBuZXcgYnl0ZXMgdG8gdGhlIGNoYXIgYnVmZmVyXG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCB0aGlzLmNoYXJSZWNlaXZlZCwgMCwgYXZhaWxhYmxlKTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBhdmFpbGFibGU7XG5cbiAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQgPCB0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIHN0aWxsIG5vdCBlbm91Z2ggY2hhcnMgaW4gdGhpcyBidWZmZXI/IHdhaXQgZm9yIG1vcmUgLi4uXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGJ5dGVzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBjaGFyYWN0ZXIgZnJvbSB0aGUgYnVmZmVyXG4gICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGF2YWlsYWJsZSwgYnVmZmVyLmxlbmd0aCk7XG5cbiAgICAvLyBnZXQgdGhlIGNoYXJhY3RlciB0aGF0IHdhcyBzcGxpdFxuICAgIGNoYXJTdHIgPSB0aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCwgdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcblxuICAgIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGggLSAxKTtcbiAgICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICAgIGNoYXJTdHIgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IHRoaXMuY2hhckxlbmd0aCA9IDA7XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBieXRlcyBpbiB0aGlzIGJ1ZmZlciwganVzdCBlbWl0IG91ciBjaGFyXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjaGFyU3RyO1xuICAgIH1cbiAgICBicmVhaztcbiAgfVxuXG4gIC8vIGRldGVybWluZSBhbmQgc2V0IGNoYXJMZW5ndGggLyBjaGFyUmVjZWl2ZWRcbiAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpO1xuXG4gIHZhciBlbmQgPSBidWZmZXIubGVuZ3RoO1xuICBpZiAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gYnVmZmVyIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlciBieXRlcyB3ZSBnb3RcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCwgZW5kKTtcbiAgICBlbmQgLT0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gIH1cblxuICBjaGFyU3RyICs9IGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpO1xuXG4gIHZhciBlbmQgPSBjaGFyU3RyLmxlbmd0aCAtIDE7XG4gIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpO1xuICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgdGhpcy5jaGFyTGVuZ3RoICs9IHNpemU7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHNpemUsIDAsIHNpemUpO1xuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgMCwgc2l6ZSk7XG4gICAgcmV0dXJuIGNoYXJTdHIuc3Vic3RyaW5nKDAsIGVuZCk7XG4gIH1cblxuICAvLyBvciBqdXN0IGVtaXQgdGhlIGNoYXJTdHJcbiAgcmV0dXJuIGNoYXJTdHI7XG59O1xuXG4vLyBkZXRlY3RJbmNvbXBsZXRlQ2hhciBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGFuIGluY29tcGxldGUgVVRGLTggY2hhcmFjdGVyIGF0XG4vLyB0aGUgZW5kIG9mIHRoZSBnaXZlbiBidWZmZXIuIElmIHNvLCBpdCBzZXRzIHRoaXMuY2hhckxlbmd0aCB0byB0aGUgYnl0ZVxuLy8gbGVuZ3RoIHRoYXQgY2hhcmFjdGVyLCBhbmQgc2V0cyB0aGlzLmNoYXJSZWNlaXZlZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4vLyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hhcmFjdGVyLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHdlIGhhdmUgdG8gY2hlY2sgYXQgdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlclxuICB2YXIgaSA9IChidWZmZXIubGVuZ3RoID49IDMpID8gMyA6IGJ1ZmZlci5sZW5ndGg7XG5cbiAgLy8gRmlndXJlIG91dCBpZiBvbmUgb2YgdGhlIGxhc3QgaSBieXRlcyBvZiBvdXIgYnVmZmVyIGFubm91bmNlcyBhblxuICAvLyBpbmNvbXBsZXRlIGNoYXIuXG4gIGZvciAoOyBpID4gMDsgaS0tKSB7XG4gICAgdmFyIGMgPSBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIGldO1xuXG4gICAgLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgjRGVzY3JpcHRpb25cblxuICAgIC8vIDExMFhYWFhYXG4gICAgaWYgKGkgPT0gMSAmJiBjID4+IDUgPT0gMHgwNikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMjtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTBYWFhYXG4gICAgaWYgKGkgPD0gMiAmJiBjID4+IDQgPT0gMHgwRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMztcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTEwWFhYXG4gICAgaWYgKGkgPD0gMyAmJiBjID4+IDMgPT0gMHgxRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGk7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5sZW5ndGgpXG4gICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIpO1xuXG4gIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkge1xuICAgIHZhciBjciA9IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgIHZhciBidWYgPSB0aGlzLmNoYXJCdWZmZXI7XG4gICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgcmVzICs9IGJ1Zi5zbGljZSgwLCBjcikudG9TdHJpbmcoZW5jKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBwYXNzVGhyb3VnaFdyaXRlKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAyO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDIgOiAwO1xufVxuXG5mdW5jdGlvbiBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMztcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAzIDogMDtcbn1cblxuUmVhZGFibGUuUmVhZGFibGVTdGF0ZSA9IFJlYWRhYmxlU3RhdGU7XG5cbnZhciBkZWJ1ZyA9IGRlYnVnbG9nKCdzdHJlYW0nKTtcbmluaGVyaXRzJDEoUmVhZGFibGUsIEV2ZW50RW1pdHRlcik7XG5cbmZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4pIHtcbiAgLy8gU2FkbHkgdGhpcyBpcyBub3QgY2FjaGVhYmxlIGFzIHNvbWUgbGlicmFyaWVzIGJ1bmRsZSB0aGVpciBvd25cbiAgLy8gZXZlbnQgZW1pdHRlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZW0uXG4gIGlmICh0eXBlb2YgZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgYW55XG4gICAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gICAgLy8gdG8gY29udGludWUgdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE5vZGUuanMgdGhhdCBkbyBub3QgaW5jbHVkZVxuICAgIC8vIHRoZSBwcmVwZW5kTGlzdGVuZXIoKSBtZXRob2QuIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMgaGFjay5cbiAgICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSlcbiAgICAgIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKVxuICAgICAgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtcbiAgICBlbHNlXG4gICAgICBlbWl0dGVyLl9ldmVudHNbZXZlbnRdID0gW2ZuLCBlbWl0dGVyLl9ldmVudHNbZXZlbnRdXTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCAoZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoO1xufVxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KClcbiAgdGhpcy5idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpO1xuICB0aGlzLmxlbmd0aCA9IDA7XG4gIHRoaXMucGlwZXMgPSBudWxsO1xuICB0aGlzLnBpcGVzQ291bnQgPSAwO1xuICB0aGlzLmZsb3dpbmcgPSBudWxsO1xuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIHRoaXMuZW5kRW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyB3aGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgdGhpcy5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgdGhpcy5yZWFkYWJsZUxpc3RlbmluZyA9IGZhbHNlO1xuICB0aGlzLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIHdoZW4gcGlwaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgJ3JlYWRhYmxlJyBldmVudHMgdGhhdCBoYXBwZW5cbiAgLy8gYWZ0ZXIgcmVhZCgpaW5nIGFsbCB0aGUgYnl0ZXMgYW5kIG5vdCBnZXR0aW5nIGFueSBwdXNoYmFjay5cbiAgdGhpcy5yYW5PdXQgPSBmYWxzZTtcblxuICAvLyB0aGUgbnVtYmVyIG9mIHdyaXRlcnMgdGhhdCBhcmUgYXdhaXRpbmcgYSBkcmFpbiBldmVudCBpbiAucGlwZSgpc1xuICB0aGlzLmF3YWl0RHJhaW4gPSAwO1xuXG4gIC8vIGlmIHRydWUsIGEgbWF5YmVSZWFkTW9yZSBoYXMgYmVlbiBzY2hlZHVsZWRcbiAgdGhpcy5yZWFkaW5nTW9yZSA9IGZhbHNlO1xuXG4gIHRoaXMuZGVjb2RlciA9IG51bGw7XG4gIHRoaXMuZW5jb2RpbmcgPSBudWxsO1xuICBpZiAob3B0aW9ucy5lbmNvZGluZykge1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBmYWxzZSk7XG59O1xuXG4vLyBVbnNoaWZ0IHNob3VsZCAqYWx3YXlzKiBiZSBzb21ldGhpbmcgZGlyZWN0bHkgb3V0IG9mIHJlYWQoKVxuUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCAnJywgdHJ1ZSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPT09IGZhbHNlO1xufTtcblxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGFkZFRvRnJvbnQpIHtcbiAgdmFyIGVyID0gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuayk7XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfSBlbHNlIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2UgaWYgKHN0YXRlLm9iamVjdE1vZGUgfHwgY2h1bmsgJiYgY2h1bmsubGVuZ3RoID4gMCkge1xuICAgIGlmIChzdGF0ZS5lbmRlZCAmJiAhYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmVuZEVtaXR0ZWQgJiYgYWRkVG9Gcm9udCkge1xuICAgICAgdmFyIF9lID0gbmV3IEVycm9yKCdzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCcpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgX2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2tpcEFkZDtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICBza2lwQWRkID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgY2h1bmsubGVuZ3RoID09PSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gRG9uJ3QgYWRkIHRvIHRoZSBidWZmZXIgaWYgd2UndmUgZGVjb2RlZCB0byBhbiBlbXB0eSBzdHJpbmcgY2h1bmsgYW5kXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gb2JqZWN0IG1vZGVcbiAgICAgIGlmICghc2tpcEFkZCkge1xuICAgICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyIHRvIHByZXZlbnQgaW5jcmVhc2luZyBod20gZXhjZXNzaXZlbHkgaW5cbiAgICAvLyB0aW55IGFtb3VudHNcbiAgICBuLS07XG4gICAgbiB8PSBuID4+PiAxO1xuICAgIG4gfD0gbiA+Pj4gMjtcbiAgICBuIHw9IG4gPj4+IDQ7XG4gICAgbiB8PSBuID4+PiA4O1xuICAgIG4gfD0gbiA+Pj4gMTY7XG4gICAgbisrO1xuICB9XG4gIHJldHVybiBuO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIHJldHVybiAwO1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIDE7XG4gIGlmIChuICE9PSBuKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lXG4gICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoKSByZXR1cm4gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg7ZWxzZSByZXR1cm4gc3RhdGUubGVuZ3RoO1xuICB9XG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKTtcbiAgaWYgKG4gPD0gc3RhdGUubGVuZ3RoKSByZXR1cm4gbjtcbiAgLy8gRG9uJ3QgaGF2ZSBlbm91Z2hcbiAgaWYgKCFzdGF0ZS5lbmRlZCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbn1cblxuLy8geW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKTtcbiAgbiA9IHBhcnNlSW50KG4sIDEwKTtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIG5PcmlnID0gbjtcblxuICBpZiAobiAhPT0gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfSBlbHNlIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gICAgLy8gSWYgX3JlYWQgcHVzaGVkIGRhdGEgc3luY2hyb25vdXNseSwgdGhlbiBgcmVhZGluZ2Agd2lsbCBiZSBmYWxzZSxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSBuID0gaG93TXVjaFRvUmVhZChuT3JpZywgc3RhdGUpO1xuICB9XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuO1xuICB9XG5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gICAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICAgIGlmIChuT3JpZyAhPT0gbiAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7XG4gIH1cblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYykgbmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIG5leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSk7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IGNsZWFudXA7XG4gIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBuZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAobGlzdGVuZXJDb3VudChkZXN0LCAnZXJyb3InKSA9PT0gMCkgZGVzdC5lbWl0KCdlcnJvcicsIGVyKTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSBvdXIgZXJyb3IgaGFuZGxlciBpcyBhdHRhY2hlZCBiZWZvcmUgdXNlcmxhbmQgb25lcy5cbiAgcHJlcGVuZExpc3RlbmVyKGRlc3QsICdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIEJvdGggY2xvc2UgYW5kIGZpbmlzaCBzaG91bGQgdHJpZ2dlciB1bnBpcGUsIGJ1dCBvbmx5IG9uY2UuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnY2xvc2UnLCBvbmNsb3NlKTtcbiAgZnVuY3Rpb24gb25maW5pc2goKSB7XG4gICAgZGVidWcoJ29uZmluaXNoJyk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblxuICBmdW5jdGlvbiB1bnBpcGUoKSB7XG4gICAgZGVidWcoJ3VucGlwZScpO1xuICAgIHNyYy51bnBpcGUoZGVzdCk7XG4gIH1cblxuICAvLyB0ZWxsIHRoZSBkZXN0IHRoYXQgaXQncyBiZWluZyBwaXBlZCB0b1xuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpO1xuXG4gIC8vIHN0YXJ0IHRoZSBmbG93IGlmIGl0IGhhc24ndCBiZWVuIHN0YXJ0ZWQgYWxyZWFkeS5cbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJyk7XG4gICAgc3JjLnJlc3VtZSgpO1xuICB9XG5cbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG5mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdGUgPSBzcmMuX3JlYWRhYmxlU3RhdGU7XG4gICAgZGVidWcoJ3BpcGVPbkRyYWluJywgc3RhdGUuYXdhaXREcmFpbik7XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4pIHN0YXRlLmF3YWl0RHJhaW4tLTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiA9PT0gMCAmJiBzcmMubGlzdGVuZXJzKCdkYXRhJykubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICAgIGZsb3coc3JjKTtcbiAgICB9XG4gIH07XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGUgPSBmdW5jdGlvbiAoZGVzdCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBwaXBpbmcgYW55d2hlcmUsIHRoZW4gZG8gbm90aGluZy5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDApIHJldHVybiB0aGlzO1xuXG4gIC8vIGp1c3Qgb25lIGRlc3RpbmF0aW9uLiAgbW9zdCBjb21tb24gY2FzZS5cbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHtcbiAgICAvLyBwYXNzZWQgaW4gb25lLCBidXQgaXQncyBub3QgdGhlIHJpZ2h0IG9uZS5cbiAgICBpZiAoZGVzdCAmJiBkZXN0ICE9PSBzdGF0ZS5waXBlcykgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAoIWRlc3QpIGRlc3QgPSBzdGF0ZS5waXBlcztcblxuICAgIC8vIGdvdCBhIG1hdGNoLlxuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgaWYgKGRlc3QpIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBzbG93IGNhc2UuIG11bHRpcGxlIHBpcGUgZGVzdGluYXRpb25zLlxuXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgdmFyIGRlc3RzID0gc3RhdGUucGlwZXM7XG4gICAgdmFyIGxlbiA9IHN0YXRlLnBpcGVzQ291bnQ7XG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsZW47IF9pKyspIHtcbiAgICAgIGRlc3RzW19pXS5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICB9cmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaSA9IGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpO1xuICBpZiAoaSA9PT0gLTEpIHJldHVybiB0aGlzO1xuXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpLCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIG5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssIHRoaXMpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIG5leHRUaWNrKHJlc3VtZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZV8oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICB9XG5cbiAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG4gIHN0YXRlLmF3YWl0RHJhaW4gPSAwO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuICBpZiAoZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwYXVzZScpO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcbiAgd2hpbGUgKHN0YXRlLmZsb3dpbmcgJiYgc3RyZWFtLnJlYWQoKSAhPT0gbnVsbCkge31cbn1cblxuLy8gd3JhcCBhbiBvbGQtc3R5bGUgc3RyZWFtIGFzIHRoZSBhc3luYyBkYXRhIHNvdXJjZS5cbi8vIFRoaXMgaXMgKm5vdCogcGFydCBvZiB0aGUgcmVhZGFibGUgc3RyZWFtIGludGVyZmFjZS5cbi8vIEl0IGlzIGFuIHVnbHkgdW5mb3J0dW5hdGUgbWVzcyBvZiBoaXN0b3J5LlxuUmVhZGFibGUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBwYXVzZWQgPSBmYWxzZTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIGRlYnVnKCd3cmFwcGVkIGVuZCcpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFzdGF0ZS5lbmRlZCkge1xuICAgICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHNlbGYucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgc2VsZi5wdXNoKG51bGwpO1xuICB9KTtcblxuICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBkYXRhJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG5cbiAgICAvLyBkb24ndCBza2lwIG92ZXIgZmFsc3kgdmFsdWVzIGluIG9iamVjdE1vZGVcbiAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSAmJiAoY2h1bmsgPT09IG51bGwgfHwgY2h1bmsgPT09IHVuZGVmaW5lZCkpIHJldHVybjtlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpKSByZXR1cm47XG5cbiAgICB2YXIgcmV0ID0gc2VsZi5wdXNoKGNodW5rKTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5wYXVzZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gcHJveHkgYWxsIHRoZSBvdGhlciBtZXRob2RzLlxuICAvLyBpbXBvcnRhbnQgd2hlbiB3cmFwcGluZyBmaWx0ZXJzIGFuZCBkdXBsZXhlcy5cbiAgZm9yICh2YXIgaSBpbiBzdHJlYW0pIHtcbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSwgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oaSk7XG4gICAgfVxuICB9XG5cbiAgLy8gcHJveHkgY2VydGFpbiBpbXBvcnRhbnQgZXZlbnRzLlxuICB2YXIgZXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuICBmb3JFYWNoKGV2ZW50cywgZnVuY3Rpb24gKGV2KSB7XG4gICAgc3RyZWFtLm9uKGV2LCBzZWxmLmVtaXQuYmluZChzZWxmLCBldikpO1xuICB9KTtcblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICBzZWxmLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn07XG5cbi8vIGV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0O1xuXG4vLyBQbHVjayBvZmYgbiBieXRlcyBmcm9tIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4vLyBMZW5ndGggaXMgdGhlIGNvbWJpbmVkIGxlbmd0aHMgb2YgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBsaXN0LlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdChuLCBzdGF0ZSkge1xuICAvLyBub3RoaW5nIGJ1ZmZlcmVkXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIHZhciByZXQ7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXQgPSBzdGF0ZS5idWZmZXIuc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IHN0YXRlLmxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgbGlzdFxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJyk7ZWxzZSBpZiAoc3RhdGUuYnVmZmVyLmxlbmd0aCA9PT0gMSkgcmV0ID0gc3RhdGUuYnVmZmVyLmhlYWQuZGF0YTtlbHNlIHJldCA9IHN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKTtcbiAgICBzdGF0ZS5idWZmZXIuY2xlYXIoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdFxuICAgIHJldCA9IGZyb21MaXN0UGFydGlhbChuLCBzdGF0ZS5idWZmZXIsIHN0YXRlLmRlY29kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gRXh0cmFjdHMgb25seSBlbm91Z2ggYnVmZmVyZWQgZGF0YSB0byBzYXRpc2Z5IHRoZSBhbW91bnQgcmVxdWVzdGVkLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBmcm9tTGlzdFBhcnRpYWwobiwgbGlzdCwgaGFzU3RyaW5ncykge1xuICB2YXIgcmV0O1xuICBpZiAobiA8IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzXG4gICAgcmV0ID0gbGlzdC5oZWFkLmRhdGEuc2xpY2UoMCwgbik7XG4gICAgbGlzdC5oZWFkLmRhdGEgPSBsaXN0LmhlYWQuZGF0YS5zbGljZShuKTtcbiAgfSBlbHNlIGlmIChuID09PSBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBmaXJzdCBjaHVuayBpcyBhIHBlcmZlY3QgbWF0Y2hcbiAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzdWx0IHNwYW5zIG1vcmUgdGhhbiBvbmUgYnVmZmVyXG4gICAgcmV0ID0gaGFzU3RyaW5ncyA/IGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIDogY29weUZyb21CdWZmZXIobiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YVxuLy8gY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSB7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHZhciByZXQgPSBwLmRhdGE7XG4gIG4gLT0gcmV0Lmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgc3RyID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBzdHIubGVuZ3RoID8gc3RyLmxlbmd0aCA6IG47XG4gICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSByZXQgKz0gc3RyO2Vsc2UgcmV0ICs9IHN0ci5zbGljZSgwLCBuKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gc3RyLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuLy8gQ29waWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGEgY2h1bmtzLlxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KSB7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBuZXh0VGljayhlbmRSZWFkYWJsZU5ULCBzdGF0ZSwgc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLCBzdHJlYW0pIHtcbiAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgZ2V0IG9uZSBsYXN0IHVuc2hpZnQuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiBzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICBzdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZW5kJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yRWFjaCh4cywgZikge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGYoeHNbaV0sIGkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoeHNbaV0gPT09IHgpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcbmluaGVyaXRzJDEoV3JpdGFibGUsIEV2ZW50RW1pdHRlcik7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdidWZmZXInLCB7XG4gICAgZ2V0OiBkZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nKVxuICB9KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIHdyaXRlKCkgc3RhcnRzIHJldHVybmluZyBmYWxzZVxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIHRoYXQgd2UgYWx3YXlzIHJldHVybiBmYWxzZSBpZlxuICAvLyB0aGUgZW50aXJlIGJ1ZmZlciBpcyBub3QgZmx1c2hlZCBpbW1lZGlhdGVseSBvbiB3cml0ZSgpXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfiB+dGhpcy5oaWdoV2F0ZXJNYXJrO1xuXG4gIHRoaXMubmVlZERyYWluID0gZmFsc2U7XG4gIC8vIGF0IHRoZSBzdGFydCBvZiBjYWxsaW5nIGVuZCgpXG4gIHRoaXMuZW5kaW5nID0gZmFsc2U7XG4gIC8vIHdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWRcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAvLyB3aGVuICdmaW5pc2gnIGlzIGVtaXR0ZWRcbiAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIHNob3VsZCB3ZSBkZWNvZGUgc3RyaW5ncyBpbnRvIGJ1ZmZlcnMgYmVmb3JlIHBhc3NpbmcgdG8gX3dyaXRlP1xuICAvLyB0aGlzIGlzIGhlcmUgc28gdGhhdCBzb21lIG5vZGUtY29yZSBzdHJlYW1zIGNhbiBvcHRpbWl6ZSBzdHJpbmdcbiAgLy8gaGFuZGxpbmcgYXQgYSBsb3dlciBsZXZlbC5cbiAgdmFyIG5vRGVjb2RlID0gb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZTtcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlO1xuXG4gIC8vIENyeXB0byBpcyBraW5kIG9mIG9sZCBhbmQgY3J1c3R5LiAgSGlzdG9yaWNhbGx5LCBpdHMgZGVmYXVsdCBzdHJpbmdcbiAgLy8gZW5jb2RpbmcgaXMgJ2JpbmFyeScgc28gd2UgaGF2ZSB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlLlxuICAvLyBFdmVyeXRoaW5nIGVsc2UgaW4gdGhlIHVuaXZlcnNlIHVzZXMgJ3V0ZjgnLCB0aG91Z2guXG4gIHRoaXMuZGVmYXVsdEVuY29kaW5nID0gb3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcgfHwgJ3V0ZjgnO1xuXG4gIC8vIG5vdCBhbiBhY3R1YWwgYnVmZmVyIHdlIGtlZXAgdHJhY2sgb2YsIGJ1dCBhIG1lYXN1cmVtZW50XG4gIC8vIG9mIGhvdyBtdWNoIHdlJ3JlIHdhaXRpbmcgdG8gZ2V0IHB1c2hlZCB0byBzb21lIHVuZGVybHlpbmdcbiAgLy8gc29ja2V0IG9yIGZpbGUuXG4gIHRoaXMubGVuZ3RoID0gMDtcblxuICAvLyBhIGZsYWcgdG8gc2VlIHdoZW4gd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIHdyaXRlLlxuICB0aGlzLndyaXRpbmcgPSBmYWxzZTtcblxuICAvLyB3aGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsXG4gIHRoaXMuY29ya2VkID0gMDtcblxuICAvLyBhIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZTtcblxuICAvLyBhIGZsYWcgdG8ga25vdyBpZiB3ZSdyZSBwcm9jZXNzaW5nIHByZXZpb3VzbHkgYnVmZmVyZWQgaXRlbXMsIHdoaWNoXG4gIC8vIG1heSBjYWxsIHRoZSBfd3JpdGUoKSBjYWxsYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyB0aGF0IHdlIGRvbid0XG4gIC8vIGVuZCB1cCBpbiBhbiBvdmVybGFwcGVkIG9ud3JpdGUgc2l0dWF0aW9uLlxuICB0aGlzLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCdzIHBhc3NlZCB0byBfd3JpdGUoY2h1bmssY2IpXG4gIHRoaXMub253cml0ZSA9IGZ1bmN0aW9uIChlcikge1xuICAgIG9ud3JpdGUoc3RyZWFtLCBlcik7XG4gIH07XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQgdGhlIHVzZXIgc3VwcGxpZXMgdG8gd3JpdGUoY2h1bmssZW5jb2RpbmcsY2IpXG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG5cbiAgLy8gdGhlIGFtb3VudCB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4gd2hlbiBfd3JpdGUgaXMgY2FsbGVkLlxuICB0aGlzLndyaXRlbGVuID0gMDtcblxuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cbiAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkXG4gIHRoaXMucGVuZGluZ2NiID0gMDtcblxuICAvLyBlbWl0IHByZWZpbmlzaCBpZiB0aGUgb25seSB0aGluZyB3ZSdyZSB3YWl0aW5nIGZvciBpcyBfd3JpdGUgY2JzXG4gIC8vIFRoaXMgaXMgcmVsZXZhbnQgZm9yIHN5bmNocm9ub3VzIFRyYW5zZm9ybSBzdHJlYW1zXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBUcnVlIGlmIHRoZSBlcnJvciB3YXMgYWxyZWFkeSBlbWl0dGVkIGFuZCBzaG91bGQgbm90IGJlIHRocm93biBhZ2FpblxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8vIGNvdW50IGJ1ZmZlcmVkIHJlcXVlc3RzXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gIC8vIGFsbG9jYXRlIHRoZSBmaXJzdCBDb3JrZWRSZXF1ZXN0LCB0aGVyZSBpcyBhbHdheXNcbiAgLy8gb25lIGFsbG9jYXRlZCBhbmQgZnJlZSB0byB1c2UsIGFuZCB3ZSBtYWludGFpbiBhdCBtb3N0IHR3b1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xufVxuXG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiB3cml0YWJsZVN0YXRlR2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcblxuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRob3VnaCB0aGV5J3JlIG5vdFxuICAvLyBpbnN0YW5jZW9mIFdyaXRhYmxlLCB0aGV5J3JlIGluc3RhbmNlb2YgUmVhZGFibGUuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gIH1cblxuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBuZXh0VGljayhjYiwgZXIpO1xufVxuXG4vLyBJZiB3ZSBnZXQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG51bGwsIG9yIHVuZGVmaW5lZCxcbi8vIGFuZCB3ZSdyZSBub3QgaW4gb2JqZWN0TW9kZSwgdGhlbiB0aGF0J3MgYW4gZXJyb3IuXG4vLyBPdGhlcndpc2Ugc3RyZWFtIGNodW5rcyBhcmUgYWxsIGNvbnNpZGVyZWQgdG8gYmUgb2YgbGVuZ3RoPTEsIGFuZCB0aGVcbi8vIHdhdGVybWFya3MgZGV0ZXJtaW5lIGhvdyBtYW55IG9iamVjdHMgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLCByYXRoZXIgdGhhblxuLy8gaG93IG1hbnkgYnl0ZXMgb3IgY2hhcmFjdGVycy5cbmZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGNiKSB7XG4gIHZhciB2YWxpZCA9IHRydWU7XG4gIHZhciBlciA9IGZhbHNlO1xuICAvLyBBbHdheXMgdGhyb3cgZXJyb3IgaWYgYSBudWxsIGlzIHdyaXR0ZW5cbiAgLy8gaWYgd2UgYXJlIG5vdCBpbiBvYmplY3QgbW9kZSB0aGVuIHRocm93XG4gIC8vIGlmIGl0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBvciB1bmRlZmluZWQuXG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignTWF5IG5vdCB3cml0ZSBudWxsIHZhbHVlcyB0byBzdHJlYW0nKTtcbiAgfSBlbHNlIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gICAgbmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmICh2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjaHVuayA9IGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpO1xuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO1xuICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgc3RhdGUubGVuZ3RoICs9IGxlbjtcblxuICB2YXIgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgLy8gd2UgbXVzdCBlbnN1cmUgdGhhdCBwcmV2aW91cyBuZWVkRHJhaW4gd2lsbCBub3QgYmUgcmVzZXQgdG8gZmFsc2UuXG4gIGlmICghcmV0KSBzdGF0ZS5uZWVkRHJhaW4gPSB0cnVlO1xuXG4gIGlmIChzdGF0ZS53cml0aW5nIHx8IHN0YXRlLmNvcmtlZCkge1xuICAgIHZhciBsYXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbmV3IFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBsYXN0Lm5leHQgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxO1xuICB9IGVsc2Uge1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpO2Vsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgLS1zdGF0ZS5wZW5kaW5nY2I7XG4gIGlmIChzeW5jKSBuZXh0VGljayhjYiwgZXIpO2Vsc2UgY2IoZXIpO1xuXG4gIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSkge1xuICBzdGF0ZS53cml0aW5nID0gZmFsc2U7XG4gIHN0YXRlLndyaXRlY2IgPSBudWxsO1xuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW47XG4gIHN0YXRlLndyaXRlbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gb253cml0ZShzdHJlYW0sIGVyKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHN5bmMgPSBzdGF0ZS5zeW5jO1xuICB2YXIgY2IgPSBzdGF0ZS53cml0ZWNiO1xuXG4gIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSk7XG5cbiAgaWYgKGVyKSBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKTtlbHNlIHtcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBhY3R1YWxseSByZWFkeSB0byBmaW5pc2gsIGJ1dCBkb24ndCBlbWl0IHlldFxuICAgIHZhciBmaW5pc2hlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuXG4gICAgaWYgKCFmaW5pc2hlZCAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8qPHJlcGxhY2VtZW50PiovXG4gICAgICAgIG5leHRUaWNrKGFmdGVyV3JpdGUsIHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICAvKjwvcmVwbGFjZW1lbnQ+Ki9cbiAgICB9IGVsc2Uge1xuICAgICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpIHtcbiAgaWYgKCFmaW5pc2hlZCkgb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpO1xuICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgY2IoKTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbi8vIE11c3QgZm9yY2UgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIG5leHRUaWNrLCBzbyB0aGF0IHdlIGRvbid0XG4vLyBlbWl0ICdkcmFpbicgYmVmb3JlIHRoZSB3cml0ZSgpIGNvbnN1bWVyIGdldHMgdGhlICdmYWxzZScgcmV0dXJuXG4vLyB2YWx1ZSwgYW5kIGhhcyBhIGNoYW5jZSB0byBhdHRhY2ggYSAnZHJhaW4nIGxpc3RlbmVyLlxuZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5uZWVkRHJhaW4pIHtcbiAgICBzdGF0ZS5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKTtcbiAgfVxufVxuXG4vLyBpZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gcHJvY2VzcyBpdFxuZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdmFyIGVudHJ5ID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0O1xuXG4gIGlmIChzdHJlYW0uX3dyaXRldiAmJiBlbnRyeSAmJiBlbnRyeS5uZXh0KSB7XG4gICAgLy8gRmFzdCBjYXNlLCB3cml0ZSBldmVyeXRoaW5nIHVzaW5nIF93cml0ZXYoKVxuICAgIHZhciBsID0gc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsKTtcbiAgICB2YXIgaG9sZGVyID0gc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlO1xuICAgIGhvbGRlci5lbnRyeSA9IGVudHJ5O1xuXG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIGJ1ZmZlcltjb3VudF0gPSBlbnRyeTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIGNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbG1vc3QgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nICYmICFzdGF0ZS5maW5pc2hlZCkgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbn07XG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmVuZGluZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID09PSBudWxsICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUud3JpdGluZztcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCkge1xuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuICBpZiAobmVlZCkge1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgbmV4dFRpY2soY2IpO2Vsc2Ugc3RyZWFtLm9uY2UoJ2ZpbmlzaCcsIGNiKTtcbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlO1xufVxuXG4vLyBJdCBzZWVtcyBhIGxpbmtlZCBsaXN0IGJ1dCBpdCBpcyBub3Rcbi8vIHRoZXJlIHdpbGwgYmUgb25seSAyIG9mIHRoZXNlIGZvciBlYWNoIHN0cmVhbVxuZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHRoaXMubmV4dCA9IG51bGw7XG4gIHRoaXMuZW50cnkgPSBudWxsO1xuXG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBlbnRyeSA9IF90aGlzLmVudHJ5O1xuICAgIF90aGlzLmVudHJ5ID0gbnVsbDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgICBjYihlcnIpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlKSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IF90aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBfdGhpcztcbiAgICB9XG4gIH07XG59XG5cbmluaGVyaXRzJDEoRHVwbGV4LCBSZWFkYWJsZSk7XG5cbnZhciBrZXlzID0gT2JqZWN0LmtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbmZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xufVxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgbmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG4vLyBhIHRyYW5zZm9ybSBzdHJlYW0gaXMgYSByZWFkYWJsZS93cml0YWJsZSBzdHJlYW0gd2hlcmUgeW91IGRvXG4vLyBzb21ldGhpbmcgd2l0aCB0aGUgZGF0YS4gIFNvbWV0aW1lcyBpdCdzIGNhbGxlZCBhIFwiZmlsdGVyXCIsXG4vLyBidXQgdGhhdCdzIG5vdCBhIGdyZWF0IG5hbWUgZm9yIGl0LCBzaW5jZSB0aGF0IGltcGxpZXMgYSB0aGluZyB3aGVyZVxuLy8gc29tZSBiaXRzIHBhc3MgdGhyb3VnaCwgYW5kIG90aGVycyBhcmUgc2ltcGx5IGlnbm9yZWQuICAoVGhhdCB3b3VsZFxuLy8gYmUgYSB2YWxpZCBleGFtcGxlIG9mIGEgdHJhbnNmb3JtLCBvZiBjb3Vyc2UuKVxuLy9cbi8vIFdoaWxlIHRoZSBvdXRwdXQgaXMgY2F1c2FsbHkgcmVsYXRlZCB0byB0aGUgaW5wdXQsIGl0J3Mgbm90IGFcbi8vIG5lY2Vzc2FyaWx5IHN5bW1ldHJpYyBvciBzeW5jaHJvbm91cyB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLFxuLy8gYSB6bGliIHN0cmVhbSBtaWdodCB0YWtlIG11bHRpcGxlIHBsYWluLXRleHQgd3JpdGVzKCksIGFuZCB0aGVuXG4vLyBlbWl0IGEgc2luZ2xlIGNvbXByZXNzZWQgY2h1bmsgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gSGVyZSdzIGhvdyB0aGlzIHdvcmtzOlxuLy9cbi8vIFRoZSBUcmFuc2Zvcm0gc3RyZWFtIGhhcyBhbGwgdGhlIGFzcGVjdHMgb2YgdGhlIHJlYWRhYmxlIGFuZCB3cml0YWJsZVxuLy8gc3RyZWFtIGNsYXNzZXMuICBXaGVuIHlvdSB3cml0ZShjaHVuayksIHRoYXQgY2FsbHMgX3dyaXRlKGNodW5rLGNiKVxuLy8gaW50ZXJuYWxseSwgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlcmUncyBhIGxvdCBvZiBwZW5kaW5nIHdyaXRlc1xuLy8gYnVmZmVyZWQgdXAuICBXaGVuIHlvdSBjYWxsIHJlYWQoKSwgdGhhdCBjYWxscyBfcmVhZChuKSB1bnRpbFxuLy8gdGhlcmUncyBlbm91Z2ggcGVuZGluZyByZWFkYWJsZSBkYXRhIGJ1ZmZlcmVkIHVwLlxuLy9cbi8vIEluIGEgdHJhbnNmb3JtIHN0cmVhbSwgdGhlIHdyaXR0ZW4gZGF0YSBpcyBwbGFjZWQgaW4gYSBidWZmZXIuICBXaGVuXG4vLyBfcmVhZChuKSBpcyBjYWxsZWQsIGl0IHRyYW5zZm9ybXMgdGhlIHF1ZXVlZCB1cCBkYXRhLCBjYWxsaW5nIHRoZVxuLy8gYnVmZmVyZWQgX3dyaXRlIGNiJ3MgYXMgaXQgY29uc3VtZXMgY2h1bmtzLiAgSWYgY29uc3VtaW5nIGEgc2luZ2xlXG4vLyB3cml0dGVuIGNodW5rIHdvdWxkIHJlc3VsdCBpbiBtdWx0aXBsZSBvdXRwdXQgY2h1bmtzLCB0aGVuIHRoZSBmaXJzdFxuLy8gb3V0cHV0dGVkIGJpdCBjYWxscyB0aGUgcmVhZGNiLCBhbmQgc3Vic2VxdWVudCBjaHVua3MganVzdCBnbyBpbnRvXG4vLyB0aGUgcmVhZCBidWZmZXIsIGFuZCB3aWxsIGNhdXNlIGl0IHRvIGVtaXQgJ3JlYWRhYmxlJyBpZiBuZWNlc3NhcnkuXG4vL1xuLy8gVGhpcyB3YXksIGJhY2stcHJlc3N1cmUgaXMgYWN0dWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcmVhZGluZyBzaWRlLFxuLy8gc2luY2UgX3JlYWQgaGFzIHRvIGJlIGNhbGxlZCB0byBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGNodW5rLiAgSG93ZXZlcixcbi8vIGEgcGF0aG9sb2dpY2FsIGluZmxhdGUgdHlwZSBvZiB0cmFuc2Zvcm0gY2FuIGNhdXNlIGV4Y2Vzc2l2ZSBidWZmZXJpbmdcbi8vIGhlcmUuICBGb3IgZXhhbXBsZSwgaW1hZ2luZSBhIHN0cmVhbSB3aGVyZSBldmVyeSBieXRlIG9mIGlucHV0IGlzXG4vLyBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIGZyb20gMC0yNTUsIGFuZCB0aGVuIHJlc3VsdHMgaW4gdGhhdCBtYW55XG4vLyBieXRlcyBvZiBvdXRwdXQuICBXcml0aW5nIHRoZSA0IGJ5dGVzIHtmZixmZixmZixmZn0gd291bGQgcmVzdWx0IGluXG4vLyAxa2Igb2YgZGF0YSBiZWluZyBvdXRwdXQuICBJbiB0aGlzIGNhc2UsIHlvdSBjb3VsZCB3cml0ZSBhIHZlcnkgc21hbGxcbi8vIGFtb3VudCBvZiBpbnB1dCwgYW5kIGVuZCB1cCB3aXRoIGEgdmVyeSBsYXJnZSBhbW91bnQgb2Ygb3V0cHV0LiAgSW5cbi8vIHN1Y2ggYSBwYXRob2xvZ2ljYWwgaW5mbGF0aW5nIG1lY2hhbmlzbSwgdGhlcmUnZCBiZSBubyB3YXkgdG8gdGVsbFxuLy8gdGhlIHN5c3RlbSB0byBzdG9wIGRvaW5nIHRoZSB0cmFuc2Zvcm0uICBBIHNpbmdsZSA0TUIgd3JpdGUgY291bGRcbi8vIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcnVuIG91dCBvZiBtZW1vcnkuXG4vL1xuLy8gSG93ZXZlciwgZXZlbiBpbiBzdWNoIGEgcGF0aG9sb2dpY2FsIGNhc2UsIG9ubHkgYSBzaW5nbGUgd3JpdHRlbiBjaHVua1xuLy8gd291bGQgYmUgY29uc3VtZWQsIGFuZCB0aGVuIHRoZSByZXN0IHdvdWxkIHdhaXQgKHVuLXRyYW5zZm9ybWVkKSB1bnRpbFxuLy8gdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzIHRyYW5zZm9ybWVkIGNodW5rIHdlcmUgY29uc3VtZWQuXG5cbmluaGVyaXRzJDEoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdGF0ZShzdHJlYW0pIHtcbiAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgIHJldHVybiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKTtcbiAgfTtcblxuICB0aGlzLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgdGhpcy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcbiAgdGhpcy53cml0ZWNodW5rID0gbnVsbDtcbiAgdGhpcy53cml0ZWVuY29kaW5nID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSkge1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuICB0cy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcblxuICB2YXIgY2IgPSB0cy53cml0ZWNiO1xuXG4gIGlmICghY2IpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzJykpO1xuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIGNiKGVyKTtcblxuICB2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUodGhpcyk7XG5cbiAgLy8gd2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB2YXIgc3RyZWFtID0gdGhpcztcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgdGhpcy5vbmNlKCdwcmVmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyKSB7XG4gICAgICBkb25lKHN0cmVhbSwgZXIpO1xuICAgIH0pO2Vsc2UgZG9uZShzdHJlYW0pO1xuICB9KTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAod3MubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmICh0cy50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn1cblxuaW5oZXJpdHMkMShQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59O1xuXG5pbmhlcml0cyQxKFN0cmVhbSwgRXZlbnRFbWl0dGVyKTtcblN0cmVhbS5SZWFkYWJsZSA9IFJlYWRhYmxlO1xuU3RyZWFtLldyaXRhYmxlID0gV3JpdGFibGU7XG5TdHJlYW0uRHVwbGV4ID0gRHVwbGV4O1xuU3RyZWFtLlRyYW5zZm9ybSA9IFRyYW5zZm9ybTtcblN0cmVhbS5QYXNzVGhyb3VnaCA9IFBhc3NUaHJvdWdoO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbTtcblxuLy8gb2xkLXN0eWxlIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhlIHBpcGUgbWV0aG9kICh0aGUgb25seSByZWxldmFudFxuLy8gcGFydCBvZiB0aGlzIGNsYXNzKSBpcyBvdmVycmlkZGVuIGluIHRoZSBSZWFkYWJsZSBjbGFzcy5cblxuZnVuY3Rpb24gU3RyZWFtKCkge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbn1cblxuU3RyZWFtLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oZGVzdCwgb3B0aW9ucykge1xuICB2YXIgc291cmNlID0gdGhpcztcblxuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBpZiAoZGVzdC53cml0YWJsZSkge1xuICAgICAgaWYgKGZhbHNlID09PSBkZXN0LndyaXRlKGNodW5rKSAmJiBzb3VyY2UucGF1c2UpIHtcbiAgICAgICAgc291cmNlLnBhdXNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKTtcblxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgLy8gSWYgdGhlICdlbmQnIG9wdGlvbiBpcyBub3Qgc3VwcGxpZWQsIGRlc3QuZW5kKCkgd2lsbCBiZSBjYWxsZWQgd2hlblxuICAvLyBzb3VyY2UgZ2V0cyB0aGUgJ2VuZCcgb3IgJ2Nsb3NlJyBldmVudHMuICBPbmx5IGRlc3QuZW5kKCkgb25jZS5cbiAgaWYgKCFkZXN0Ll9pc1N0ZGlvICYmICghb3B0aW9ucyB8fCBvcHRpb25zLmVuZCAhPT0gZmFsc2UpKSB7XG4gICAgc291cmNlLm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuICB9XG5cbiAgdmFyIGRpZE9uRW5kID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBkZXN0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIGRlc3QuZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gZG9uJ3QgbGVhdmUgZGFuZ2xpbmcgcGlwZXMgd2hlbiB0aGVyZSBhcmUgZXJyb3JzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgY2xlYW51cCgpO1xuICAgIGlmIChFdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCh0aGlzLCAnZXJyb3InKSA9PT0gMCkge1xuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCBzdHJlYW0gZXJyb3IgaW4gcGlwZS5cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGRlc3Qub24oJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gcmVtb3ZlIGFsbCB0aGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgd2VyZSBhZGRlZC5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcbiAgfVxuXG4gIHNvdXJjZS5vbignZW5kJywgY2xlYW51cCk7XG4gIHNvdXJjZS5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0Lm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3QuZW1pdCgncGlwZScsIHNvdXJjZSk7XG5cbiAgLy8gQWxsb3cgZm9yIHVuaXgtbGlrZSB1c2FnZTogQS5waXBlKEIpLnBpcGUoQylcbiAgcmV0dXJuIGRlc3Q7XG59O1xuXG52YXIgclN0YXRlcyA9IHtcbiAgVU5TRU5UOiAwLFxuICBPUEVORUQ6IDEsXG4gIEhFQURFUlNfUkVDRUlWRUQ6IDIsXG4gIExPQURJTkc6IDMsXG4gIERPTkU6IDRcbn07XG5mdW5jdGlvbiBJbmNvbWluZ01lc3NhZ2UoeGhyLCByZXNwb25zZSwgbW9kZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIFJlYWRhYmxlLmNhbGwoc2VsZik7XG5cbiAgc2VsZi5fbW9kZSA9IG1vZGU7XG4gIHNlbGYuaGVhZGVycyA9IHt9O1xuICBzZWxmLnJhd0hlYWRlcnMgPSBbXTtcbiAgc2VsZi50cmFpbGVycyA9IHt9O1xuICBzZWxmLnJhd1RyYWlsZXJzID0gW107XG5cbiAgLy8gRmFrZSB0aGUgJ2Nsb3NlJyBldmVudCwgYnV0IG9ubHkgb25jZSAnZW5kJyBmaXJlc1xuICBzZWxmLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGUgbmV4dFRpY2sgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgdGhlICdyZXF1ZXN0JyBtb2R1bGUgZnJvbSBjYXVzaW5nIGFuIGluZmluaXRlIGxvb3BcbiAgICBicm93c2VyJDEubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG4gICAgfSk7XG4gIH0pO1xuICB2YXIgcmVhZDtcbiAgaWYgKG1vZGUgPT09ICdmZXRjaCcpIHtcbiAgICBzZWxmLl9mZXRjaFJlc3BvbnNlID0gcmVzcG9uc2U7XG5cbiAgICBzZWxmLnVybCA9IHJlc3BvbnNlLnVybDtcbiAgICBzZWxmLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgc2VsZi5zdGF0dXNNZXNzYWdlID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlIHZlcnNpb24gb2YgZm9yICg8aXRlbT4gb2YgPGl0ZXJhYmxlPik6XG4gICAgICAvLyBmb3IgKHZhciA8aXRlbT4sX2ksX2l0ID0gPGl0ZXJhYmxlPltTeW1ib2wuaXRlcmF0b3JdKCk7IDxpdGVtPiA9IChfaSA9IF9pdC5uZXh0KCkpLnZhbHVlLCFfaS5kb25lOylcbiAgICBmb3IgKHZhciBoZWFkZXIsIF9pLCBfaXQgPSByZXNwb25zZS5oZWFkZXJzW1N5bWJvbC5pdGVyYXRvcl0oKTsgaGVhZGVyID0gKF9pID0gX2l0Lm5leHQoKSkudmFsdWUsICFfaS5kb25lOykge1xuICAgICAgc2VsZi5oZWFkZXJzW2hlYWRlclswXS50b0xvd2VyQ2FzZSgpXSA9IGhlYWRlclsxXTtcbiAgICAgIHNlbGYucmF3SGVhZGVycy5wdXNoKGhlYWRlclswXSwgaGVhZGVyWzFdKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiB0aGlzIGRvZXNuJ3QgcmVzcGVjdCBiYWNrcHJlc3N1cmUuIE9uY2UgV3JpdGFibGVTdHJlYW0gaXMgYXZhaWxhYmxlLCB0aGlzIGNhbiBiZSBmaXhlZFxuICAgIHZhciByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuXG4gICAgcmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgaWYgKHNlbGYuX2Rlc3Ryb3llZClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgc2VsZi5wdXNoKG51bGwpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHNlbGYucHVzaChuZXcgQnVmZmVyKHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICByZWFkKCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJlYWQoKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbGYuX3hociA9IHhocjtcbiAgICBzZWxmLl9wb3MgPSAwO1xuXG4gICAgc2VsZi51cmwgPSB4aHIucmVzcG9uc2VVUkw7XG4gICAgc2VsZi5zdGF0dXNDb2RlID0geGhyLnN0YXR1cztcbiAgICBzZWxmLnN0YXR1c01lc3NhZ2UgPSB4aHIuc3RhdHVzVGV4dDtcbiAgICB2YXIgaGVhZGVycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5zcGxpdCgvXFxyP1xcbi8pO1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHZhciBtYXRjaGVzID0gaGVhZGVyLm1hdGNoKC9eKFteOl0rKTpcXHMqKC4qKS8pO1xuICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgdmFyIGtleSA9IG1hdGNoZXNbMV0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICAgICAgaWYgKHNlbGYuaGVhZGVyc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNlbGYuaGVhZGVyc1trZXldID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYuaGVhZGVyc1trZXldLnB1c2gobWF0Y2hlc1syXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VsZi5oZWFkZXJzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNlbGYuaGVhZGVyc1trZXldICs9ICcsICcgKyBtYXRjaGVzWzJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuaGVhZGVyc1trZXldID0gbWF0Y2hlc1syXTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmLnJhd0hlYWRlcnMucHVzaChtYXRjaGVzWzFdLCBtYXRjaGVzWzJdKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNlbGYuX2NoYXJzZXQgPSAneC11c2VyLWRlZmluZWQnO1xuICAgIGlmICghb3ZlcnJpZGVNaW1lVHlwZSkge1xuICAgICAgdmFyIG1pbWVUeXBlID0gc2VsZi5yYXdIZWFkZXJzWydtaW1lLXR5cGUnXTtcbiAgICAgIGlmIChtaW1lVHlwZSkge1xuICAgICAgICB2YXIgY2hhcnNldE1hdGNoID0gbWltZVR5cGUubWF0Y2goLztcXHMqY2hhcnNldD0oW147XSkoO3wkKS8pO1xuICAgICAgICBpZiAoY2hhcnNldE1hdGNoKSB7XG4gICAgICAgICAgc2VsZi5fY2hhcnNldCA9IGNoYXJzZXRNYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNlbGYuX2NoYXJzZXQpXG4gICAgICAgIHNlbGYuX2NoYXJzZXQgPSAndXRmLTgnOyAvLyBiZXN0IGd1ZXNzXG4gICAgfVxuICB9XG59XG5cbmluaGVyaXRzJDEoSW5jb21pbmdNZXNzYWdlLCBSZWFkYWJsZSk7XG5cbkluY29taW5nTWVzc2FnZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbigpIHt9O1xuXG5JbmNvbWluZ01lc3NhZ2UucHJvdG90eXBlLl9vblhIUlByb2dyZXNzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICB2YXIgeGhyID0gc2VsZi5feGhyO1xuXG4gIHZhciByZXNwb25zZSA9IG51bGw7XG4gIHN3aXRjaCAoc2VsZi5fbW9kZSkge1xuICBjYXNlICd0ZXh0OnZiYXJyYXknOiAvLyBGb3IgSUU5XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkRPTkUpXG4gICAgICBicmVha1xuICAgIHRyeSB7XG4gICAgICAvLyBUaGlzIGZhaWxzIGluIElFOFxuICAgICAgcmVzcG9uc2UgPSBuZXcgZ2xvYmFsJDEuVkJBcnJheSh4aHIucmVzcG9uc2VCb2R5KS50b0FycmF5KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gcGFzc1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2UgIT09IG51bGwpIHtcbiAgICAgIHNlbGYucHVzaChuZXcgQnVmZmVyKHJlc3BvbnNlKSk7XG4gICAgICBicmVha1xuICAgIH1cbiAgICAvLyBGYWxscyB0aHJvdWdoIGluIElFOFxuICBjYXNlICd0ZXh0JzpcbiAgICB0cnkgeyAvLyBUaGlzIHdpbGwgZmFpbCB3aGVuIHJlYWR5U3RhdGUgPSAzIGluIElFOS4gU3dpdGNoIG1vZGUgYW5kIHdhaXQgZm9yIHJlYWR5U3RhdGUgPSA0XG4gICAgICByZXNwb25zZSA9IHhoci5yZXNwb25zZVRleHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2VsZi5fbW9kZSA9ICd0ZXh0OnZiYXJyYXknO1xuICAgICAgYnJlYWtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA+IHNlbGYuX3Bvcykge1xuICAgICAgdmFyIG5ld0RhdGEgPSByZXNwb25zZS5zdWJzdHIoc2VsZi5fcG9zKTtcbiAgICAgIGlmIChzZWxmLl9jaGFyc2V0ID09PSAneC11c2VyLWRlZmluZWQnKSB7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnVmZmVyKG5ld0RhdGEubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdEYXRhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgIGJ1ZmZlcltpXSA9IG5ld0RhdGEuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG5cbiAgICAgICAgc2VsZi5wdXNoKGJ1ZmZlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnB1c2gobmV3RGF0YSwgc2VsZi5fY2hhcnNldCk7XG4gICAgICB9XG4gICAgICBzZWxmLl9wb3MgPSByZXNwb25zZS5sZW5ndGg7XG4gICAgfVxuICAgIGJyZWFrXG4gIGNhc2UgJ2FycmF5YnVmZmVyJzpcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuRE9ORSB8fCAheGhyLnJlc3BvbnNlKVxuICAgICAgYnJlYWtcbiAgICByZXNwb25zZSA9IHhoci5yZXNwb25zZTtcbiAgICBzZWxmLnB1c2gobmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShyZXNwb25zZSkpKTtcbiAgICBicmVha1xuICBjYXNlICdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcic6IC8vIHRha2Ugd2hvbGVcbiAgICByZXNwb25zZSA9IHhoci5yZXNwb25zZTtcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuTE9BRElORyB8fCAhcmVzcG9uc2UpXG4gICAgICBicmVha1xuICAgIHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSkpO1xuICAgIGJyZWFrXG4gIGNhc2UgJ21zLXN0cmVhbSc6XG4gICAgcmVzcG9uc2UgPSB4aHIucmVzcG9uc2U7XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSByU3RhdGVzLkxPQURJTkcpXG4gICAgICBicmVha1xuICAgIHZhciByZWFkZXIgPSBuZXcgZ2xvYmFsJDEuTVNTdHJlYW1SZWFkZXIoKTtcbiAgICByZWFkZXIub25wcm9ncmVzcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHJlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aCA+IHNlbGYuX3Bvcykge1xuICAgICAgICBzZWxmLnB1c2gobmV3IEJ1ZmZlcihuZXcgVWludDhBcnJheShyZWFkZXIucmVzdWx0LnNsaWNlKHNlbGYuX3BvcykpKSk7XG4gICAgICAgIHNlbGYuX3BvcyA9IHJlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aDtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYucHVzaChudWxsKTtcbiAgICB9O1xuICAgICAgLy8gcmVhZGVyLm9uZXJyb3IgPSA/Pz8gLy8gVE9ETzogdGhpc1xuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihyZXNwb25zZSk7XG4gICAgYnJlYWtcbiAgfVxuXG4gIC8vIFRoZSBtcy1zdHJlYW0gY2FzZSBoYW5kbGVzIGVuZCBzZXBhcmF0ZWx5IGluIHJlYWRlci5vbmxvYWQoKVxuICBpZiAoc2VsZi5feGhyLnJlYWR5U3RhdGUgPT09IHJTdGF0ZXMuRE9ORSAmJiBzZWxmLl9tb2RlICE9PSAnbXMtc3RyZWFtJykge1xuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfVxufTtcblxuLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vamhpZXNleS90by1hcnJheWJ1ZmZlci9ibG9iLzY1MDJkOTg1MGU3MGJhNzkzNWE3ZGY0YWQ4NmIzNThmYzIxNmY5ZjAvaW5kZXguanNcblxuZnVuY3Rpb24gdG9BcnJheUJ1ZmZlciAoYnVmKSB7XG4gIC8vIElmIHRoZSBidWZmZXIgaXMgYmFja2VkIGJ5IGEgVWludDhBcnJheSwgYSBmYXN0ZXIgdmVyc2lvbiB3aWxsIHdvcmtcbiAgaWYgKGJ1ZiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAvLyBJZiB0aGUgYnVmZmVyIGlzbid0IGEgc3ViYXJyYXksIHJldHVybiB0aGUgdW5kZXJseWluZyBBcnJheUJ1ZmZlclxuICAgIGlmIChidWYuYnl0ZU9mZnNldCA9PT0gMCAmJiBidWYuYnl0ZUxlbmd0aCA9PT0gYnVmLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYnVmLmJ1ZmZlclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJ1Zi5idWZmZXIuc2xpY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGdldCBhIHByb3BlciBjb3B5XG4gICAgICByZXR1cm4gYnVmLmJ1ZmZlci5zbGljZShidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVPZmZzZXQgKyBidWYuYnl0ZUxlbmd0aClcbiAgICB9XG4gIH1cblxuICBpZiAoaXNCdWZmZXIoYnVmKSkge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNsb3cgdmVyc2lvbiB0aGF0IHdpbGwgd29yayB3aXRoIGFueSBCdWZmZXJcbiAgICAvLyBpbXBsZW1lbnRhdGlvbiAoZXZlbiBpbiBvbGQgYnJvd3NlcnMpXG4gICAgdmFyIGFycmF5Q29weSA9IG5ldyBVaW50OEFycmF5KGJ1Zi5sZW5ndGgpO1xuICAgIHZhciBsZW4gPSBidWYubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFycmF5Q29weVtpXSA9IGJ1ZltpXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5Q29weS5idWZmZXJcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlY2lkZU1vZGUocHJlZmVyQmluYXJ5LCB1c2VGZXRjaCkge1xuICBpZiAoaGFzRmV0Y2ggJiYgdXNlRmV0Y2gpIHtcbiAgICByZXR1cm4gJ2ZldGNoJ1xuICB9IGVsc2UgaWYgKG1vemNodW5rZWRhcnJheWJ1ZmZlcikge1xuICAgIHJldHVybiAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInXG4gIH0gZWxzZSBpZiAobXNzdHJlYW0pIHtcbiAgICByZXR1cm4gJ21zLXN0cmVhbSdcbiAgfSBlbHNlIGlmIChhcnJheWJ1ZmZlciAmJiBwcmVmZXJCaW5hcnkpIHtcbiAgICByZXR1cm4gJ2FycmF5YnVmZmVyJ1xuICB9IGVsc2UgaWYgKHZiQXJyYXkgJiYgcHJlZmVyQmluYXJ5KSB7XG4gICAgcmV0dXJuICd0ZXh0OnZiYXJyYXknXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICd0ZXh0J1xuICB9XG59XG5cbmZ1bmN0aW9uIENsaWVudFJlcXVlc3Qob3B0cykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIFdyaXRhYmxlLmNhbGwoc2VsZik7XG5cbiAgc2VsZi5fb3B0cyA9IG9wdHM7XG4gIHNlbGYuX2JvZHkgPSBbXTtcbiAgc2VsZi5faGVhZGVycyA9IHt9O1xuICBpZiAob3B0cy5hdXRoKVxuICAgIHNlbGYuc2V0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBuZXcgQnVmZmVyKG9wdHMuYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgT2JqZWN0LmtleXMob3B0cy5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBzZWxmLnNldEhlYWRlcihuYW1lLCBvcHRzLmhlYWRlcnNbbmFtZV0pO1xuICB9KTtcblxuICB2YXIgcHJlZmVyQmluYXJ5O1xuICB2YXIgdXNlRmV0Y2ggPSB0cnVlO1xuICBpZiAob3B0cy5tb2RlID09PSAnZGlzYWJsZS1mZXRjaCcpIHtcbiAgICAvLyBJZiB0aGUgdXNlIG9mIFhIUiBzaG91bGQgYmUgcHJlZmVycmVkIGFuZCBpbmNsdWRlcyBwcmVzZXJ2aW5nIHRoZSAnY29udGVudC10eXBlJyBoZWFkZXJcbiAgICB1c2VGZXRjaCA9IGZhbHNlO1xuICAgIHByZWZlckJpbmFyeSA9IHRydWU7XG4gIH0gZWxzZSBpZiAob3B0cy5tb2RlID09PSAncHJlZmVyLXN0cmVhbWluZycpIHtcbiAgICAvLyBJZiBzdHJlYW1pbmcgaXMgYSBoaWdoIHByaW9yaXR5IGJ1dCBiaW5hcnkgY29tcGF0aWJpbGl0eSBhbmRcbiAgICAvLyB0aGUgYWNjdXJhY3kgb2YgdGhlICdjb250ZW50LXR5cGUnIGhlYWRlciBhcmVuJ3RcbiAgICBwcmVmZXJCaW5hcnkgPSBmYWxzZTtcbiAgfSBlbHNlIGlmIChvcHRzLm1vZGUgPT09ICdhbGxvdy13cm9uZy1jb250ZW50LXR5cGUnKSB7XG4gICAgLy8gSWYgc3RyZWFtaW5nIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gcHJlc2VydmluZyB0aGUgJ2NvbnRlbnQtdHlwZScgaGVhZGVyXG4gICAgcHJlZmVyQmluYXJ5ID0gIW92ZXJyaWRlTWltZVR5cGU7XG4gIH0gZWxzZSBpZiAoIW9wdHMubW9kZSB8fCBvcHRzLm1vZGUgPT09ICdkZWZhdWx0JyB8fCBvcHRzLm1vZGUgPT09ICdwcmVmZXItZmFzdCcpIHtcbiAgICAvLyBVc2UgYmluYXJ5IGlmIHRleHQgc3RyZWFtaW5nIG1heSBjb3JydXB0IGRhdGEgb3IgdGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIsIG9yIGZvciBzcGVlZFxuICAgIHByZWZlckJpbmFyeSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBvcHRzLm1vZGUnKVxuICB9XG4gIHNlbGYuX21vZGUgPSBkZWNpZGVNb2RlKHByZWZlckJpbmFyeSwgdXNlRmV0Y2gpO1xuXG4gIHNlbGYub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uKCkge1xuICAgIHNlbGYuX29uRmluaXNoKCk7XG4gIH0pO1xufVxuXG5pbmhlcml0cyQxKENsaWVudFJlcXVlc3QsIFdyaXRhYmxlKTtcbi8vIFRha2VuIGZyb20gaHR0cDovL3d3dy53My5vcmcvVFIvWE1MSHR0cFJlcXVlc3QvI3RoZS1zZXRyZXF1ZXN0aGVhZGVyJTI4JTI5LW1ldGhvZFxudmFyIHVuc2FmZUhlYWRlcnMgPSBbXG4gICdhY2NlcHQtY2hhcnNldCcsXG4gICdhY2NlcHQtZW5jb2RpbmcnLFxuICAnYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1oZWFkZXJzJyxcbiAgJ2FjY2Vzcy1jb250cm9sLXJlcXVlc3QtbWV0aG9kJyxcbiAgJ2Nvbm5lY3Rpb24nLFxuICAnY29udGVudC1sZW5ndGgnLFxuICAnY29va2llJyxcbiAgJ2Nvb2tpZTInLFxuICAnZGF0ZScsXG4gICdkbnQnLFxuICAnZXhwZWN0JyxcbiAgJ2hvc3QnLFxuICAna2VlcC1hbGl2ZScsXG4gICdvcmlnaW4nLFxuICAncmVmZXJlcicsXG4gICd0ZScsXG4gICd0cmFpbGVyJyxcbiAgJ3RyYW5zZmVyLWVuY29kaW5nJyxcbiAgJ3VwZ3JhZGUnLFxuICAndXNlci1hZ2VudCcsXG4gICd2aWEnXG5dO1xuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0SGVhZGVyID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIC8vIFRoaXMgY2hlY2sgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IGl0IHByZXZlbnRzIHdhcm5pbmdzIGZyb20gYnJvd3NlcnMgYWJvdXQgc2V0dGluZyB1bnNhZmVcbiAgICAvLyBoZWFkZXJzLiBUbyBiZSBob25lc3QgSSdtIG5vdCBlbnRpcmVseSBzdXJlIGhpZGluZyB0aGVzZSB3YXJuaW5ncyBpcyBhIGdvb2QgdGhpbmcsIGJ1dFxuICAgIC8vIGh0dHAtYnJvd3NlcmlmeSBkaWQgaXQsIHNvIEkgd2lsbCB0b28uXG4gIGlmICh1bnNhZmVIZWFkZXJzLmluZGV4T2YobG93ZXJOYW1lKSAhPT0gLTEpXG4gICAgcmV0dXJuXG5cbiAgc2VsZi5faGVhZGVyc1tsb3dlck5hbWVdID0ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5nZXRIZWFkZXIgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHNlbGYuX2hlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXS52YWx1ZVxufTtcblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUucmVtb3ZlSGVhZGVyID0gZnVuY3Rpb24obmFtZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGRlbGV0ZSBzZWxmLl9oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV07XG59O1xuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25GaW5pc2ggPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGlmIChzZWxmLl9kZXN0cm95ZWQpXG4gICAgcmV0dXJuXG4gIHZhciBvcHRzID0gc2VsZi5fb3B0cztcblxuICB2YXIgaGVhZGVyc09iaiA9IHNlbGYuX2hlYWRlcnM7XG4gIHZhciBib2R5O1xuICBpZiAob3B0cy5tZXRob2QgPT09ICdQT1NUJyB8fCBvcHRzLm1ldGhvZCA9PT0gJ1BVVCcgfHwgb3B0cy5tZXRob2QgPT09ICdQQVRDSCcpIHtcbiAgICBpZiAoYmxvYkNvbnN0cnVjdG9yKCkpIHtcbiAgICAgIGJvZHkgPSBuZXcgZ2xvYmFsJDEuQmxvYihzZWxmLl9ib2R5Lm1hcChmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIHRvQXJyYXlCdWZmZXIoYnVmZmVyKVxuICAgICAgfSksIHtcbiAgICAgICAgdHlwZTogKGhlYWRlcnNPYmpbJ2NvbnRlbnQtdHlwZSddIHx8IHt9KS52YWx1ZSB8fCAnJ1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGdldCB1dGY4IHN0cmluZ1xuICAgICAgYm9keSA9IEJ1ZmZlci5jb25jYXQoc2VsZi5fYm9keSkudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2VsZi5fbW9kZSA9PT0gJ2ZldGNoJykge1xuICAgIHZhciBoZWFkZXJzID0gT2JqZWN0LmtleXMoaGVhZGVyc09iaikubWFwKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHJldHVybiBbaGVhZGVyc09ialtuYW1lXS5uYW1lLCBoZWFkZXJzT2JqW25hbWVdLnZhbHVlXVxuICAgIH0pO1xuXG4gICAgZ2xvYmFsJDEuZmV0Y2goc2VsZi5fb3B0cy51cmwsIHtcbiAgICAgIG1ldGhvZDogc2VsZi5fb3B0cy5tZXRob2QsXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgYm9keTogYm9keSxcbiAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgIGNyZWRlbnRpYWxzOiBvcHRzLndpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdzYW1lLW9yaWdpbidcbiAgICB9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICBzZWxmLl9mZXRjaFJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICBzZWxmLl9jb25uZWN0KCk7XG4gICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgcmVhc29uKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgeGhyID0gc2VsZi5feGhyID0gbmV3IGdsb2JhbCQxLlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgdHJ5IHtcbiAgICAgIHhoci5vcGVuKHNlbGYuX29wdHMubWV0aG9kLCBzZWxmLl9vcHRzLnVybCwgdHJ1ZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBicm93c2VyJDEubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDYW4ndCBzZXQgcmVzcG9uc2VUeXBlIG9uIHJlYWxseSBvbGQgYnJvd3NlcnNcbiAgICBpZiAoJ3Jlc3BvbnNlVHlwZScgaW4geGhyKVxuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IHNlbGYuX21vZGUuc3BsaXQoJzonKVswXTtcblxuICAgIGlmICgnd2l0aENyZWRlbnRpYWxzJyBpbiB4aHIpXG4gICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gISFvcHRzLndpdGhDcmVkZW50aWFscztcblxuICAgIGlmIChzZWxmLl9tb2RlID09PSAndGV4dCcgJiYgJ292ZXJyaWRlTWltZVR5cGUnIGluIHhocilcbiAgICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L3BsYWluOyBjaGFyc2V0PXgtdXNlci1kZWZpbmVkJyk7XG5cbiAgICBPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlcnNPYmpbbmFtZV0ubmFtZSwgaGVhZGVyc09ialtuYW1lXS52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICBzZWxmLl9yZXNwb25zZSA9IG51bGw7XG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgc3dpdGNoICh4aHIucmVhZHlTdGF0ZSkge1xuICAgICAgY2FzZSByU3RhdGVzLkxPQURJTkc6XG4gICAgICBjYXNlIHJTdGF0ZXMuRE9ORTpcbiAgICAgICAgc2VsZi5fb25YSFJQcm9ncmVzcygpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH07XG4gICAgICAvLyBOZWNlc3NhcnkgZm9yIHN0cmVhbWluZyBpbiBGaXJlZm94LCBzaW5jZSB4aHIucmVzcG9uc2UgaXMgT05MWSBkZWZpbmVkXG4gICAgICAvLyBpbiBvbnByb2dyZXNzLCBub3QgaW4gb25yZWFkeXN0YXRlY2hhbmdlIHdpdGggeGhyLnJlYWR5U3RhdGUgPSAzXG4gICAgaWYgKHNlbGYuX21vZGUgPT09ICdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcicpIHtcbiAgICAgIHhoci5vbnByb2dyZXNzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX29uWEhSUHJvZ3Jlc3MoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzZWxmLl9kZXN0cm95ZWQpXG4gICAgICAgIHJldHVyblxuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignWEhSIGVycm9yJykpO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgeGhyLnNlbmQoYm9keSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBicm93c2VyJDEubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHhoci5zdGF0dXMgaXMgcmVhZGFibGUgYW5kIG5vbi16ZXJvLCBpbmRpY2F0aW5nIG5vIGVycm9yLlxuICogRXZlbiB0aG91Z2ggdGhlIHNwZWMgc2F5cyBpdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHJlYWR5U3RhdGUgMyxcbiAqIGFjY2Vzc2luZyBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIElFOFxuICovXG5mdW5jdGlvbiBzdGF0dXNWYWxpZCh4aHIpIHtcbiAgdHJ5IHtcbiAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1cztcbiAgICByZXR1cm4gKHN0YXR1cyAhPT0gbnVsbCAmJiBzdGF0dXMgIT09IDApXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFzdGF0dXNWYWxpZChzZWxmLl94aHIpIHx8IHNlbGYuX2Rlc3Ryb3llZClcbiAgICByZXR1cm5cblxuICBpZiAoIXNlbGYuX3Jlc3BvbnNlKVxuICAgIHNlbGYuX2Nvbm5lY3QoKTtcblxuICBzZWxmLl9yZXNwb25zZS5fb25YSFJQcm9ncmVzcygpO1xufTtcblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX2Nvbm5lY3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGlmIChzZWxmLl9kZXN0cm95ZWQpXG4gICAgcmV0dXJuXG5cbiAgc2VsZi5fcmVzcG9uc2UgPSBuZXcgSW5jb21pbmdNZXNzYWdlKHNlbGYuX3hociwgc2VsZi5fZmV0Y2hSZXNwb25zZSwgc2VsZi5fbW9kZSk7XG4gIHNlbGYuZW1pdCgncmVzcG9uc2UnLCBzZWxmLl9yZXNwb25zZSk7XG59O1xuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBzZWxmLl9ib2R5LnB1c2goY2h1bmspO1xuICBjYigpO1xufTtcblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuYWJvcnQgPSBDbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgaWYgKHNlbGYuX3Jlc3BvbnNlKVxuICAgIHNlbGYuX3Jlc3BvbnNlLl9kZXN0cm95ZWQgPSB0cnVlO1xuICBpZiAoc2VsZi5feGhyKVxuICAgIHNlbGYuX3hoci5hYm9ydCgpO1xuICAgIC8vIEN1cnJlbnRseSwgdGhlcmUgaXNuJ3QgYSB3YXkgdG8gdHJ1bHkgYWJvcnQgYSBmZXRjaC5cbiAgICAvLyBJZiB5b3UgbGlrZSBiaWtlc2hlZGRpbmcsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2ZldGNoL2lzc3Vlcy8yN1xufTtcblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oZGF0YSwgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBXcml0YWJsZS5wcm90b3R5cGUuZW5kLmNhbGwoc2VsZiwgZGF0YSwgZW5jb2RpbmcsIGNiKTtcbn07XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmZsdXNoSGVhZGVycyA9IGZ1bmN0aW9uKCkge307XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7fTtcbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldE5vRGVsYXkgPSBmdW5jdGlvbigpIHt9O1xuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0U29ja2V0S2VlcEFsaXZlID0gZnVuY3Rpb24oKSB7fTtcblxuLyohIGh0dHBzOi8vbXRocy5iZS9wdW55Y29kZSB2MS40LjEgYnkgQG1hdGhpYXMgKi9cblxuXG4vKiogSGlnaGVzdCBwb3NpdGl2ZSBzaWduZWQgMzItYml0IGZsb2F0IHZhbHVlICovXG52YXIgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG4vKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG52YXIgYmFzZSA9IDM2O1xudmFyIHRNaW4gPSAxO1xudmFyIHRNYXggPSAyNjtcbnZhciBza2V3ID0gMzg7XG52YXIgZGFtcCA9IDcwMDtcbnZhciBpbml0aWFsQmlhcyA9IDcyO1xudmFyIGluaXRpYWxOID0gMTI4OyAvLyAweDgwXG52YXIgZGVsaW1pdGVyID0gJy0nOyAvLyAnXFx4MkQnXG52YXIgcmVnZXhOb25BU0NJSSA9IC9bXlxceDIwLVxceDdFXS87IC8vIHVucHJpbnRhYmxlIEFTQ0lJIGNoYXJzICsgbm9uLUFTQ0lJIGNoYXJzXG52YXIgcmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZzsgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG4vKiogRXJyb3IgbWVzc2FnZXMgKi9cbnZhciBlcnJvcnMgPSB7XG4gICdvdmVyZmxvdyc6ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcycsXG4gICdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG4gICdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG59O1xuXG4vKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG52YXIgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLyoqXG4gKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXJyb3IgdHlwZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZXJyb3IodHlwZSkge1xuICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihlcnJvcnNbdHlwZV0pO1xufVxuXG4vKipcbiAqIEEgZ2VuZXJpYyBgQXJyYXkjbWFwYCB1dGlsaXR5IGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnkgYXJyYXlcbiAqIGl0ZW0uXG4gKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IGFycmF5IG9mIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hcCQxKGFycmF5LCBmbikge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHNpbXBsZSBgQXJyYXkjbWFwYC1saWtlIHdyYXBwZXIgdG8gd29yayB3aXRoIGRvbWFpbiBuYW1lIHN0cmluZ3Mgb3IgZW1haWxcbiAqIGFkZHJlc3Nlcy5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG4gKiBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFja1xuICogZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hcERvbWFpbihzdHJpbmcsIGZuKSB7XG4gIHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgLy8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuICAgIC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXG4gICAgcmVzdWx0ID0gcGFydHNbMF0gKyAnQCc7XG4gICAgc3RyaW5nID0gcGFydHNbMV07XG4gIH1cbiAgLy8gQXZvaWQgYHNwbGl0KHJlZ2V4KWAgZm9yIElFOCBjb21wYXRpYmlsaXR5LiBTZWUgIzE3LlxuICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuICB2YXIgbGFiZWxzID0gc3RyaW5nLnNwbGl0KCcuJyk7XG4gIHZhciBlbmNvZGVkID0gbWFwJDEobGFiZWxzLCBmbikuam9pbignLicpO1xuICByZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcbiAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcbiAqIEBuYW1lIGRlY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cbiAqL1xuZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcbiAgdmFyIG91dHB1dCA9IFtdLFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgdmFsdWUsXG4gICAgZXh0cmE7XG4gIHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgdmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuICAgIGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICAgIC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuICAgICAgZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuICAgICAgaWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIGxvdyBzdXJyb2dhdGVcbiAgICAgICAgb3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0XG4gICAgICAgIC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuICAgICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7XG4gICAgICAgIGNvdW50ZXItLTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpcyBgZGlnaXRgLCB3aGljaCBuZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2VcbiAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcbiAqIGlmIGBmbGFnYCBpcyBub24temVybyBhbmQgYGRpZ2l0YCBoYXMgbm8gdXBwZXJjYXNlIGZvcm0uXG4gKi9cbmZ1bmN0aW9uIGRpZ2l0VG9CYXNpYyhkaWdpdCwgZmxhZykge1xuICAvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuICAvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcbiAgcmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcbn1cblxuLyoqXG4gKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkYXB0KGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuICB2YXIgayA9IDA7XG4gIGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XG4gIGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcbiAgZm9yICggLyogbm8gaW5pdGlhbGl6YXRpb24gKi8gOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuICAgIGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcbiAgfVxuICByZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMgKGUuZy4gYSBkb21haW4gbmFtZSBsYWJlbCkgdG8gYVxuICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICovXG5mdW5jdGlvbiBlbmNvZGUoaW5wdXQpIHtcbiAgdmFyIG4sXG4gICAgZGVsdGEsXG4gICAgaGFuZGxlZENQQ291bnQsXG4gICAgYmFzaWNMZW5ndGgsXG4gICAgYmlhcyxcbiAgICBqLFxuICAgIG0sXG4gICAgcSxcbiAgICBrLFxuICAgIHQsXG4gICAgY3VycmVudFZhbHVlLFxuICAgIG91dHB1dCA9IFtdLFxuICAgIC8qKiBgaW5wdXRMZW5ndGhgIHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIGluIGBpbnB1dGAuICovXG4gICAgaW5wdXRMZW5ndGgsXG4gICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG4gICAgaGFuZGxlZENQQ291bnRQbHVzT25lLFxuICAgIGJhc2VNaW51c1QsXG4gICAgcU1pbnVzVDtcblxuICAvLyBDb252ZXJ0IHRoZSBpbnB1dCBpbiBVQ1MtMiB0byBVbmljb2RlXG4gIGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cbiAgLy8gQ2FjaGUgdGhlIGxlbmd0aFxuICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuICAvLyBJbml0aWFsaXplIHRoZSBzdGF0ZVxuICBuID0gaW5pdGlhbE47XG4gIGRlbHRhID0gMDtcbiAgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG4gIC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcbiAgZm9yIChqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcbiAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcbiAgICBpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGggPSBvdXRwdXQubGVuZ3RoO1xuXG4gIC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuICAvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cbiAgLy8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgLSBpZiBpdCBpcyBub3QgZW1wdHkgLSB3aXRoIGEgZGVsaW1pdGVyXG4gIGlmIChiYXNpY0xlbmd0aCkge1xuICAgIG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG4gIH1cblxuICAvLyBNYWluIGVuY29kaW5nIGxvb3A6XG4gIHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cbiAgICAvLyBBbGwgbm9uLWJhc2ljIGNvZGUgcG9pbnRzIDwgbiBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LiBGaW5kIHRoZSBuZXh0XG4gICAgLy8gbGFyZ2VyIG9uZTpcbiAgICBmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuICAgICAgY3VycmVudFZhbHVlID0gaW5wdXRbal07XG4gICAgICBpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkge1xuICAgICAgICBtID0gY3VycmVudFZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcbiAgICAvLyBidXQgZ3VhcmQgYWdhaW5zdCBvdmVyZmxvd1xuICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcbiAgICBpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuICAgICAgZXJyb3IoJ292ZXJmbG93Jyk7XG4gICAgfVxuXG4gICAgZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcbiAgICBuID0gbTtcblxuICAgIGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkge1xuICAgICAgICBlcnJvcignb3ZlcmZsb3cnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PSBuKSB7XG4gICAgICAgIC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyXG4gICAgICAgIGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovIDsgayArPSBiYXNlKSB7XG4gICAgICAgICAgdCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG4gICAgICAgICAgaWYgKHEgPCB0KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcU1pbnVzVCA9IHEgLSB0O1xuICAgICAgICAgIGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcbiAgICAgICAgICBvdXRwdXQucHVzaChcbiAgICAgICAgICAgIHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEsIDApKSk7XG4gICAgICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG4gICAgICAgIGRlbHRhID0gMDtcbiAgICAgICAgKytoYW5kbGVkQ1BDb3VudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICArK2RlbHRhO1xuICAgICsrbjtcblxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG4gKiBQdW55Y29kZS4gT25seSB0aGUgbm9uLUFTQ0lJIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB3aWxsIGJlIGNvbnZlcnRlZCxcbiAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxuICogQVNDSUkuXG4gKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXG4gKiBVbmljb2RlIHN0cmluZy5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBQdW55Y29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZG9tYWluIG5hbWUgb3JcbiAqIGVtYWlsIGFkZHJlc3MuXG4gKi9cbmZ1bmN0aW9uIHRvQVNDSUkoaW5wdXQpIHtcbiAgcmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpID9cbiAgICAgICd4bi0tJyArIGVuY29kZShzdHJpbmcpIDpcbiAgICAgIHN0cmluZztcbiAgfSk7XG59XG5cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5cbi8vIElmIG9iai5oYXNPd25Qcm9wZXJ0eSBoYXMgYmVlbiBvdmVycmlkZGVuLCB0aGVuIGNhbGxpbmdcbi8vIG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSB3aWxsIGJyZWFrLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzE3MDdcbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbmZ1bmN0aW9uIHN0cmluZ2lmeVByaW1pdGl2ZSh2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeSAob2JqLCBzZXAsIGVxLCBuYW1lKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG1hcChvYmplY3RLZXlzKG9iaiksIGZ1bmN0aW9uKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG4gICAgICBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICAgIHJldHVybiBtYXAob2JqW2tdLCBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZSh2KSk7XG4gICAgICAgIH0pLmpvaW4oc2VwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSk7XG4gICAgICB9XG4gICAgfSkuam9pbihzZXApO1xuXG4gIH1cblxuICBpZiAoIW5hbWUpIHJldHVybiAnJztcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUobmFtZSkpICsgZXEgK1xuICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTtcbn1cbmZ1bmN0aW9uIG1hcCAoeHMsIGYpIHtcbiAgaWYgKHhzLm1hcCkgcmV0dXJuIHhzLm1hcChmKTtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzLnB1c2goZih4c1tpXSwgaSkpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgcmVzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gcGFyc2UkMShxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8vIFdIQVRXRyBBUElcbmNvbnN0IFVSTCQxID0gZ2xvYmFsJDEuVVJMO1xuY29uc3QgVVJMU2VhcmNoUGFyYW1zID0gZ2xvYmFsJDEuVVJMU2VhcmNoUGFyYW1zO1xudmFyIF9wb2x5ZmlsbE5vZGVfdXJsID0ge1xuICBwYXJzZTogdXJsUGFyc2UsXG4gIHJlc29sdmU6IHVybFJlc29sdmUsXG4gIHJlc29sdmVPYmplY3Q6IHVybFJlc29sdmVPYmplY3QsXG4gIGZpbGVVUkxUb1BhdGg6IHVybEZpbGVVUkxUb1BhdGgsXG4gIGZvcm1hdDogdXJsRm9ybWF0LFxuICBVcmw6IFVybCxcblxuICAvLyBXSEFUV0cgQVBJXG4gIFVSTDogVVJMJDEsXG4gIFVSTFNlYXJjaFBhcmFtcywgIFxufTtcbmZ1bmN0aW9uIFVybCgpIHtcbiAgdGhpcy5wcm90b2NvbCA9IG51bGw7XG4gIHRoaXMuc2xhc2hlcyA9IG51bGw7XG4gIHRoaXMuYXV0aCA9IG51bGw7XG4gIHRoaXMuaG9zdCA9IG51bGw7XG4gIHRoaXMucG9ydCA9IG51bGw7XG4gIHRoaXMuaG9zdG5hbWUgPSBudWxsO1xuICB0aGlzLmhhc2ggPSBudWxsO1xuICB0aGlzLnNlYXJjaCA9IG51bGw7XG4gIHRoaXMucXVlcnkgPSBudWxsO1xuICB0aGlzLnBhdGhuYW1lID0gbnVsbDtcbiAgdGhpcy5wYXRoID0gbnVsbDtcbiAgdGhpcy5ocmVmID0gbnVsbDtcbn1cblxuLy8gUmVmZXJlbmNlOiBSRkMgMzk4NiwgUkZDIDE4MDgsIFJGQyAyMzk2XG5cbi8vIGRlZmluZSB0aGVzZSBoZXJlIHNvIGF0IGxlYXN0IHRoZXkgb25seSBoYXZlIHRvIGJlXG4vLyBjb21waWxlZCBvbmNlIG9uIHRoZSBmaXJzdCBtb2R1bGUgbG9hZC5cbnZhciBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pLFxuICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuICBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW15cXD9cXHNdKikoXFw/W15cXHNdKik/JC8sXG5cbiAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbiAgLy8gV2UgYWN0dWFsbHkganVzdCBhdXRvLWVzY2FwZSB0aGVzZS5cbiAgZGVsaW1zID0gWyc8JywgJz4nLCAnXCInLCAnYCcsICcgJywgJ1xccicsICdcXG4nLCAnXFx0J10sXG5cbiAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAgdW53aXNlID0gWyd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCddLmNvbmNhdChkZWxpbXMpLFxuXG4gIC8vIEFsbG93ZWQgYnkgUkZDcywgYnV0IGNhdXNlIG9mIFhTUyBhdHRhY2tzLiAgQWx3YXlzIGVzY2FwZSB0aGVzZS5cbiAgYXV0b0VzY2FwZSA9IFsnXFwnJ10uY29uY2F0KHVud2lzZSksXG4gIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUuXG4gIC8vIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBjaGFycyBhcmUgYWxzbyBoYW5kbGVkLCBidXQgdGhlc2VcbiAgLy8gYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4gIC8vIHRoZW0uXG4gIG5vbkhvc3RDaGFycyA9IFsnJScsICcvJywgJz8nLCAnOycsICcjJ10uY29uY2F0KGF1dG9Fc2NhcGUpLFxuICBob3N0RW5kaW5nQ2hhcnMgPSBbJy8nLCAnPycsICcjJ10sXG4gIGhvc3RuYW1lTWF4TGVuID0gMjU1LFxuICBob3N0bmFtZVBhcnRQYXR0ZXJuID0gL15bK2EtejAtOUEtWl8tXXswLDYzfSQvLFxuICBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgLy8gcHJvdG9jb2xzIHRoYXQgY2FuIGFsbG93IFwidW5zYWZlXCIgYW5kIFwidW53aXNlXCIgY2hhcnMuXG4gIHVuc2FmZVByb3RvY29sID0ge1xuICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gIH0sXG4gIC8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbiAgaG9zdGxlc3NQcm90b2NvbCA9IHtcbiAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICB9LFxuICAvLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbiAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgICdodHRwJzogdHJ1ZSxcbiAgICAnaHR0cHMnOiB0cnVlLFxuICAgICdmdHAnOiB0cnVlLFxuICAgICdnb3BoZXInOiB0cnVlLFxuICAgICdmaWxlJzogdHJ1ZSxcbiAgICAnaHR0cDonOiB0cnVlLFxuICAgICdodHRwczonOiB0cnVlLFxuICAgICdmdHA6JzogdHJ1ZSxcbiAgICAnZ29waGVyOic6IHRydWUsXG4gICAgJ2ZpbGU6JzogdHJ1ZVxuICB9O1xuXG5mdW5jdGlvbiB1cmxQYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICh1cmwgJiYgaXNPYmplY3QodXJsKSAmJiB1cmwgaW5zdGFuY2VvZiBVcmwpIHJldHVybiB1cmw7XG5cbiAgdmFyIHUgPSBuZXcgVXJsO1xuICB1LnBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpO1xuICByZXR1cm4gdTtcbn1cblVybC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbih1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIHJldHVybiBwYXJzZSh0aGlzLCB1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlKHNlbGYsIHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKCFpc1N0cmluZyh1cmwpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGFyYW1ldGVyIFxcJ3VybFxcJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJyArIHR5cGVvZiB1cmwpO1xuICB9XG5cbiAgLy8gQ29weSBjaHJvbWUsIElFLCBvcGVyYSBiYWNrc2xhc2gtaGFuZGxpbmcgYmVoYXZpb3IuXG4gIC8vIEJhY2sgc2xhc2hlcyBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyBnZXQgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlc1xuICAvLyBTZWU6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0yNTkxNlxuICB2YXIgcXVlcnlJbmRleCA9IHVybC5pbmRleE9mKCc/JyksXG4gICAgc3BsaXR0ZXIgPVxuICAgIChxdWVyeUluZGV4ICE9PSAtMSAmJiBxdWVyeUluZGV4IDwgdXJsLmluZGV4T2YoJyMnKSkgPyAnPycgOiAnIycsXG4gICAgdVNwbGl0ID0gdXJsLnNwbGl0KHNwbGl0dGVyKSxcbiAgICBzbGFzaFJlZ2V4ID0gL1xcXFwvZztcbiAgdVNwbGl0WzBdID0gdVNwbGl0WzBdLnJlcGxhY2Uoc2xhc2hSZWdleCwgJy8nKTtcbiAgdXJsID0gdVNwbGl0LmpvaW4oc3BsaXR0ZXIpO1xuXG4gIHZhciByZXN0ID0gdXJsO1xuXG4gIC8vIHRyaW0gYmVmb3JlIHByb2NlZWRpbmcuXG4gIC8vIFRoaXMgaXMgdG8gc3VwcG9ydCBwYXJzZSBzdHVmZiBsaWtlIFwiICBodHRwOi8vZm9vLmNvbSAgXFxuXCJcbiAgcmVzdCA9IHJlc3QudHJpbSgpO1xuXG4gIGlmICghc2xhc2hlc0Rlbm90ZUhvc3QgJiYgdXJsLnNwbGl0KCcjJykubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gVHJ5IGZhc3QgcGF0aCByZWdleHBcbiAgICB2YXIgc2ltcGxlUGF0aCA9IHNpbXBsZVBhdGhQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gICAgaWYgKHNpbXBsZVBhdGgpIHtcbiAgICAgIHNlbGYucGF0aCA9IHJlc3Q7XG4gICAgICBzZWxmLmhyZWYgPSByZXN0O1xuICAgICAgc2VsZi5wYXRobmFtZSA9IHNpbXBsZVBhdGhbMV07XG4gICAgICBpZiAoc2ltcGxlUGF0aFsyXSkge1xuICAgICAgICBzZWxmLnNlYXJjaCA9IHNpbXBsZVBhdGhbMl07XG4gICAgICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgICAgc2VsZi5xdWVyeSA9IHBhcnNlJDEoc2VsZi5zZWFyY2guc3Vic3RyKDEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLnF1ZXJ5ID0gc2VsZi5zZWFyY2guc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZWFyY2ggPSAnJztcbiAgICAgICAgc2VsZi5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHNlbGYucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpO1xuICB9XG5cbiAgLy8gZmlndXJlIG91dCBpZiBpdCdzIGdvdCBhIGhvc3RcbiAgLy8gdXNlckBzZXJ2ZXIgaXMgKmFsd2F5cyogaW50ZXJwcmV0ZWQgYXMgYSBob3N0bmFtZSwgYW5kIHVybFxuICAvLyByZXNvbHV0aW9uIHdpbGwgdHJlYXQgLy9mb28vYmFyIGFzIGhvc3Q9Zm9vLHBhdGg9YmFyIGJlY2F1c2UgdGhhdCdzXG4gIC8vIGhvdyB0aGUgYnJvd3NlciByZXNvbHZlcyByZWxhdGl2ZSBVUkxzLlxuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICB2YXIgc2xhc2hlcyA9IHJlc3Quc3Vic3RyKDAsIDIpID09PSAnLy8nO1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMik7XG4gICAgICBzZWxmLnNsYXNoZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuICB2YXIgaSwgaGVjLCBsLCBwO1xuICBpZiAoIWhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dICYmXG4gICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgZm9yIChpID0gMDsgaSA8IGhvc3RFbmRpbmdDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgdmFyIGF1dGgsIGF0U2lnbjtcbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGF0U2lnbiBtdXN0IGJlIGluIGF1dGggcG9ydGlvbi5cbiAgICAgIC8vIGh0dHA6Ly9hQGIvY0BkID0+IGhvc3Q6YiBhdXRoOmEgcGF0aDovY0BkXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJywgaG9zdEVuZCk7XG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKTtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpO1xuICAgICAgc2VsZi5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIH1cblxuICAgIC8vIHRoZSBob3N0IGlzIHRoZSByZW1haW5pbmcgdG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IG5vbi1ob3N0IGNoYXJcbiAgICBob3N0RW5kID0gLTE7XG4gICAgZm9yIChpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgaGVjID0gcmVzdC5pbmRleE9mKG5vbkhvc3RDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuICAgIC8vIGlmIHdlIHN0aWxsIGhhdmUgbm90IGhpdCBpdCwgdGhlbiB0aGUgZW50aXJlIHRoaW5nIGlzIGEgaG9zdC5cbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpXG4gICAgICBob3N0RW5kID0gcmVzdC5sZW5ndGg7XG5cbiAgICBzZWxmLmhvc3QgPSByZXN0LnNsaWNlKDAsIGhvc3RFbmQpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKGhvc3RFbmQpO1xuXG4gICAgLy8gcHVsbCBvdXQgcG9ydC5cbiAgICBwYXJzZUhvc3Qoc2VsZik7XG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgc2VsZi5ob3N0bmFtZSA9IHNlbGYuaG9zdG5hbWUgfHwgJyc7XG5cbiAgICAvLyBpZiBob3N0bmFtZSBiZWdpbnMgd2l0aCBbIGFuZCBlbmRzIHdpdGggXVxuICAgIC8vIGFzc3VtZSB0aGF0IGl0J3MgYW4gSVB2NiBhZGRyZXNzLlxuICAgIHZhciBpcHY2SG9zdG5hbWUgPSBzZWxmLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgIHNlbGYuaG9zdG5hbWVbc2VsZi5ob3N0bmFtZS5sZW5ndGggLSAxXSA9PT0gJ10nO1xuXG4gICAgLy8gdmFsaWRhdGUgYSBsaXR0bGUuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHZhciBob3N0cGFydHMgPSBzZWxmLmhvc3RuYW1lLnNwbGl0KC9cXC4vKTtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gaG9zdHBhcnRzW2ldO1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICB2YXIgbmV3cGFydCA9ICcnO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgdGVzdCBhZ2FpbiB3aXRoIEFTQ0lJIGNoYXIgb25seVxuICAgICAgICAgIGlmICghbmV3cGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgICAgdmFyIHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB2YXIgbm90SG9zdCA9IGhvc3RwYXJ0cy5zbGljZShpICsgMSk7XG4gICAgICAgICAgICB2YXIgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydCk7XG4gICAgICAgICAgICBpZiAoYml0KSB7XG4gICAgICAgICAgICAgIHZhbGlkUGFydHMucHVzaChiaXRbMV0pO1xuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gJy8nICsgbm90SG9zdC5qb2luKCcuJykgKyByZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5ob3N0bmFtZSA9IHZhbGlkUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNlbGYuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHNlbGYuaG9zdG5hbWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaG9zdG5hbWVzIGFyZSBhbHdheXMgbG93ZXIgY2FzZS5cbiAgICAgIHNlbGYuaG9zdG5hbWUgPSBzZWxmLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIC8vIElETkEgU3VwcG9ydDogUmV0dXJucyBhIHB1bnljb2RlZCByZXByZXNlbnRhdGlvbiBvZiBcImRvbWFpblwiLlxuICAgICAgLy8gSXQgb25seSBjb252ZXJ0cyBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgdGhhdFxuICAgICAgLy8gaGF2ZSBub24tQVNDSUkgY2hhcmFjdGVycywgaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZlxuICAgICAgLy8geW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0IGFscmVhZHkgaXMgQVNDSUktb25seS5cbiAgICAgIHNlbGYuaG9zdG5hbWUgPSB0b0FTQ0lJKHNlbGYuaG9zdG5hbWUpO1xuICAgIH1cblxuICAgIHAgPSBzZWxmLnBvcnQgPyAnOicgKyBzZWxmLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHNlbGYuaG9zdG5hbWUgfHwgJyc7XG4gICAgc2VsZi5ob3N0ID0gaCArIHA7XG4gICAgc2VsZi5ocmVmICs9IHNlbGYuaG9zdDtcblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHNlbGYuaG9zdG5hbWUgPSBzZWxmLmhvc3RuYW1lLnN1YnN0cigxLCBzZWxmLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgLy8gY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICBpZiAoIXVuc2FmZVByb3RvY29sW2xvd2VyUHJvdG9dKSB7XG5cbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBmb3IgKGkgPSAwLCBsID0gYXV0b0VzY2FwZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBhZSA9IGF1dG9Fc2NhcGVbaV07XG4gICAgICBpZiAocmVzdC5pbmRleE9mKGFlKSA9PT0gLTEpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdmFyIGVzYyA9IGVuY29kZVVSSUNvbXBvbmVudChhZSk7XG4gICAgICBpZiAoZXNjID09PSBhZSkge1xuICAgICAgICBlc2MgPSBlc2NhcGUoYWUpO1xuICAgICAgfVxuICAgICAgcmVzdCA9IHJlc3Quc3BsaXQoYWUpLmpvaW4oZXNjKTtcbiAgICB9XG4gIH1cblxuXG4gIC8vIGNob3Agb2ZmIGZyb20gdGhlIHRhaWwgZmlyc3QuXG4gIHZhciBoYXNoID0gcmVzdC5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoICE9PSAtMSkge1xuICAgIC8vIGdvdCBhIGZyYWdtZW50IHN0cmluZy5cbiAgICBzZWxmLmhhc2ggPSByZXN0LnN1YnN0cihoYXNoKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBoYXNoKTtcbiAgfVxuICB2YXIgcW0gPSByZXN0LmluZGV4T2YoJz8nKTtcbiAgaWYgKHFtICE9PSAtMSkge1xuICAgIHNlbGYuc2VhcmNoID0gcmVzdC5zdWJzdHIocW0pO1xuICAgIHNlbGYucXVlcnkgPSByZXN0LnN1YnN0cihxbSArIDEpO1xuICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICBzZWxmLnF1ZXJ5ID0gcGFyc2UkMShzZWxmLnF1ZXJ5KTtcbiAgICB9XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgcW0pO1xuICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAvLyBubyBxdWVyeSBzdHJpbmcsIGJ1dCBwYXJzZVF1ZXJ5U3RyaW5nIHN0aWxsIHJlcXVlc3RlZFxuICAgIHNlbGYuc2VhcmNoID0gJyc7XG4gICAgc2VsZi5xdWVyeSA9IHt9O1xuICB9XG4gIGlmIChyZXN0KSBzZWxmLnBhdGhuYW1lID0gcmVzdDtcbiAgaWYgKHNsYXNoZWRQcm90b2NvbFtsb3dlclByb3RvXSAmJlxuICAgIHNlbGYuaG9zdG5hbWUgJiYgIXNlbGYucGF0aG5hbWUpIHtcbiAgICBzZWxmLnBhdGhuYW1lID0gJy8nO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICBpZiAoc2VsZi5wYXRobmFtZSB8fCBzZWxmLnNlYXJjaCkge1xuICAgIHAgPSBzZWxmLnBhdGhuYW1lIHx8ICcnO1xuICAgIHZhciBzID0gc2VsZi5zZWFyY2ggfHwgJyc7XG4gICAgc2VsZi5wYXRoID0gcCArIHM7XG4gIH1cblxuICAvLyBmaW5hbGx5LCByZWNvbnN0cnVjdCB0aGUgaHJlZiBiYXNlZCBvbiB3aGF0IGhhcyBiZWVuIHZhbGlkYXRlZC5cbiAgc2VsZi5ocmVmID0gZm9ybWF0KHNlbGYpO1xuICByZXR1cm4gc2VsZjtcbn1cblxuZnVuY3Rpb24gdXJsRmlsZVVSTFRvUGF0aChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpXG4gICAgcGF0aCA9IG5ldyBVcmwoKS5wYXJzZShwYXRoKTtcbiAgZWxzZSBpZiAoIShwYXRoIGluc3RhbmNlb2YgVXJsKSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJwYXRoXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBhbiBpbnN0YW5jZSBvZiBVUkwuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgcGF0aCkgKyBTdHJpbmcocGF0aCkpO1xuICBpZiAocGF0aC5wcm90b2NvbCAhPT0gJ2ZpbGU6JylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgVVJMIG11c3QgYmUgb2Ygc2NoZW1lIGZpbGUnKTtcbiAgcmV0dXJuIGdldFBhdGhGcm9tVVJMUG9zaXgocGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldFBhdGhGcm9tVVJMUG9zaXgodXJsKSB7XG4gIGNvbnN0IHBhdGhuYW1lID0gdXJsLnBhdGhuYW1lO1xuICBmb3IgKGxldCBuID0gMDsgbiA8IHBhdGhuYW1lLmxlbmd0aDsgbisrKSB7XG4gICAgaWYgKHBhdGhuYW1lW25dID09PSAnJScpIHtcbiAgICAgIGNvbnN0IHRoaXJkID0gcGF0aG5hbWUuY29kZVBvaW50QXQobiArIDIpIHwgMHgyMDtcbiAgICAgIGlmIChwYXRobmFtZVtuICsgMV0gPT09ICcyJyAmJiB0aGlyZCA9PT0gMTAyKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ211c3Qgbm90IGluY2x1ZGUgZW5jb2RlZCAvIGNoYXJhY3RlcnMnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocGF0aG5hbWUpO1xufVxuXG4vLyBmb3JtYXQgYSBwYXJzZWQgb2JqZWN0IGludG8gYSB1cmwgc3RyaW5nXG5mdW5jdGlvbiB1cmxGb3JtYXQob2JqKSB7XG4gIC8vIGVuc3VyZSBpdCdzIGFuIG9iamVjdCwgYW5kIG5vdCBhIHN0cmluZyB1cmwuXG4gIC8vIElmIGl0J3MgYW4gb2JqLCB0aGlzIGlzIGEgbm8tb3AuXG4gIC8vIHRoaXMgd2F5LCB5b3UgY2FuIGNhbGwgdXJsX2Zvcm1hdCgpIG9uIHN0cmluZ3NcbiAgLy8gdG8gY2xlYW4gdXAgcG90ZW50aWFsbHkgd29ua3kgdXJscy5cbiAgaWYgKGlzU3RyaW5nKG9iaikpIG9iaiA9IHBhcnNlKHt9LCBvYmopO1xuICByZXR1cm4gZm9ybWF0KG9iaik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdChzZWxmKSB7XG4gIHZhciBhdXRoID0gc2VsZi5hdXRoIHx8ICcnO1xuICBpZiAoYXV0aCkge1xuICAgIGF1dGggPSBlbmNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgYXV0aCA9IGF1dGgucmVwbGFjZSgvJTNBL2ksICc6Jyk7XG4gICAgYXV0aCArPSAnQCc7XG4gIH1cblxuICB2YXIgcHJvdG9jb2wgPSBzZWxmLnByb3RvY29sIHx8ICcnLFxuICAgIHBhdGhuYW1lID0gc2VsZi5wYXRobmFtZSB8fCAnJyxcbiAgICBoYXNoID0gc2VsZi5oYXNoIHx8ICcnLFxuICAgIGhvc3QgPSBmYWxzZSxcbiAgICBxdWVyeSA9ICcnO1xuXG4gIGlmIChzZWxmLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHNlbGYuaG9zdDtcbiAgfSBlbHNlIGlmIChzZWxmLmhvc3RuYW1lKSB7XG4gICAgaG9zdCA9IGF1dGggKyAoc2VsZi5ob3N0bmFtZS5pbmRleE9mKCc6JykgPT09IC0xID9cbiAgICAgIHNlbGYuaG9zdG5hbWUgOlxuICAgICAgJ1snICsgdGhpcy5ob3N0bmFtZSArICddJyk7XG4gICAgaWYgKHNlbGYucG9ydCkge1xuICAgICAgaG9zdCArPSAnOicgKyBzZWxmLnBvcnQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNlbGYucXVlcnkgJiZcbiAgICBpc09iamVjdChzZWxmLnF1ZXJ5KSAmJlxuICAgIE9iamVjdC5rZXlzKHNlbGYucXVlcnkpLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gc3RyaW5naWZ5KHNlbGYucXVlcnkpO1xuICB9XG5cbiAgdmFyIHNlYXJjaCA9IHNlbGYuc2VhcmNoIHx8IChxdWVyeSAmJiAoJz8nICsgcXVlcnkpKSB8fCAnJztcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuc3Vic3RyKC0xKSAhPT0gJzonKSBwcm90b2NvbCArPSAnOic7XG5cbiAgLy8gb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gIC8vIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gIGlmIChzZWxmLnNsYXNoZXMgfHxcbiAgICAoIXByb3RvY29sIHx8IHNsYXNoZWRQcm90b2NvbFtwcm90b2NvbF0pICYmIGhvc3QgIT09IGZhbHNlKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJyk7XG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lLmNoYXJBdCgwKSAhPT0gJy8nKSBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lO1xuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnO1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSBzZWFyY2ggPSAnPycgKyBzZWFyY2g7XG5cbiAgcGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCk7XG4gIH0pO1xuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKTtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufVxuXG5VcmwucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZm9ybWF0KHRoaXMpO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZShzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlKHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgcmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh1cmxQYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpKS5mb3JtYXQoKTtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmVPYmplY3Qoc291cmNlLCByZWxhdGl2ZSkge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHJlbGF0aXZlO1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZU9iamVjdCA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIGlmIChpc1N0cmluZyhyZWxhdGl2ZSkpIHtcbiAgICB2YXIgcmVsID0gbmV3IFVybCgpO1xuICAgIHJlbC5wYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJlbGF0aXZlID0gcmVsO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBVcmwoKTtcbiAgdmFyIHRrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gIGZvciAodmFyIHRrID0gMDsgdGsgPCB0a2V5cy5sZW5ndGg7IHRrKyspIHtcbiAgICB2YXIgdGtleSA9IHRrZXlzW3RrXTtcbiAgICByZXN1bHRbdGtleV0gPSB0aGlzW3RrZXldO1xuICB9XG5cbiAgLy8gaGFzaCBpcyBhbHdheXMgb3ZlcnJpZGRlbiwgbm8gbWF0dGVyIHdoYXQuXG4gIC8vIGV2ZW4gaHJlZj1cIlwiIHdpbGwgcmVtb3ZlIGl0LlxuICByZXN1bHQuaGFzaCA9IHJlbGF0aXZlLmhhc2g7XG5cbiAgLy8gaWYgdGhlIHJlbGF0aXZlIHVybCBpcyBlbXB0eSwgdGhlbiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyBoZXJlLlxuICBpZiAocmVsYXRpdmUuaHJlZiA9PT0gJycpIHtcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaHJlZnMgbGlrZSAvL2Zvby9iYXIgYWx3YXlzIGN1dCB0byB0aGUgcHJvdG9jb2wuXG4gIGlmIChyZWxhdGl2ZS5zbGFzaGVzICYmICFyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgIC8vIHRha2UgZXZlcnl0aGluZyBleGNlcHQgdGhlIHByb3RvY29sIGZyb20gcmVsYXRpdmVcbiAgICB2YXIgcmtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgZm9yICh2YXIgcmsgPSAwOyByayA8IHJrZXlzLmxlbmd0aDsgcmsrKykge1xuICAgICAgdmFyIHJrZXkgPSBya2V5c1tya107XG4gICAgICBpZiAocmtleSAhPT0gJ3Byb3RvY29sJylcbiAgICAgICAgcmVzdWx0W3JrZXldID0gcmVsYXRpdmVbcmtleV07XG4gICAgfVxuXG4gICAgLy91cmxQYXJzZSBhcHBlbmRzIHRyYWlsaW5nIC8gdG8gdXJscyBsaWtlIGh0dHA6Ly93d3cuZXhhbXBsZS5jb21cbiAgICBpZiAoc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF0gJiZcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZSA9ICcvJztcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHZhciByZWxQYXRoO1xuICBpZiAocmVsYXRpdmUucHJvdG9jb2wgJiYgcmVsYXRpdmUucHJvdG9jb2wgIT09IHJlc3VsdC5wcm90b2NvbCkge1xuICAgIC8vIGlmIGl0J3MgYSBrbm93biB1cmwgcHJvdG9jb2wsIHRoZW4gY2hhbmdpbmdcbiAgICAvLyB0aGUgcHJvdG9jb2wgZG9lcyB3ZWlyZCB0aGluZ3NcbiAgICAvLyBmaXJzdCwgaWYgaXQncyBub3QgZmlsZTosIHRoZW4gd2UgTVVTVCBoYXZlIGEgaG9zdCxcbiAgICAvLyBhbmQgaWYgdGhlcmUgd2FzIGEgcGF0aFxuICAgIC8vIHRvIGJlZ2luIHdpdGgsIHRoZW4gd2UgTVVTVCBoYXZlIGEgcGF0aC5cbiAgICAvLyBpZiBpdCBpcyBmaWxlOiwgdGhlbiB0aGUgaG9zdCBpcyBkcm9wcGVkLFxuICAgIC8vIGJlY2F1c2UgdGhhdCdzIGtub3duIHRvIGJlIGhvc3RsZXNzLlxuICAgIC8vIGFueXRoaW5nIGVsc2UgaXMgYXNzdW1lZCB0byBiZSBhYnNvbHV0ZS5cbiAgICBpZiAoIXNsYXNoZWRQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1t2XTtcbiAgICAgICAgcmVzdWx0W2tdID0gcmVsYXRpdmVba107XG4gICAgICB9XG4gICAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmVzdWx0LnByb3RvY29sID0gcmVsYXRpdmUucHJvdG9jb2w7XG4gICAgaWYgKCFyZWxhdGl2ZS5ob3N0ICYmICFob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICAgIHdoaWxlIChyZWxQYXRoLmxlbmd0aCAmJiAhKHJlbGF0aXZlLmhvc3QgPSByZWxQYXRoLnNoaWZ0KCkpKTtcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgcmVsYXRpdmUuaG9zdCA9ICcnO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0bmFtZSkgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJztcbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxQYXRoLmpvaW4oJy8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsYXRpdmUucGF0aG5hbWU7XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgcmVzdWx0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0IHx8ICcnO1xuICAgIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0O1xuICAgIHJlc3VsdC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQucGF0aG5hbWUgfHwgcmVzdWx0LnNlYXJjaCkge1xuICAgICAgdmFyIHAgPSByZXN1bHQucGF0aG5hbWUgfHwgJyc7XG4gICAgICB2YXIgcyA9IHJlc3VsdC5zZWFyY2ggfHwgJyc7XG4gICAgICByZXN1bHQucGF0aCA9IHAgKyBzO1xuICAgIH1cbiAgICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBpc1NvdXJjZUFicyA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSxcbiAgICBpc1JlbEFicyA9IChcbiAgICAgIHJlbGF0aXZlLmhvc3QgfHxcbiAgICAgIHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgKSxcbiAgICBtdXN0RW5kQWJzID0gKGlzUmVsQWJzIHx8IGlzU291cmNlQWJzIHx8XG4gICAgICAocmVzdWx0Lmhvc3QgJiYgcmVsYXRpdmUucGF0aG5hbWUpKSxcbiAgICByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicyxcbiAgICBzcmNQYXRoID0gcmVzdWx0LnBhdGhuYW1lICYmIHJlc3VsdC5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG4gIHJlbFBhdGggPSByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdO1xuICAvLyBpZiB0aGUgdXJsIGlzIGEgbm9uLXNsYXNoZWQgdXJsLCB0aGVuIHJlbGF0aXZlXG4gIC8vIGxpbmtzIGxpa2UgLi4vLi4gc2hvdWxkIGJlIGFibGVcbiAgLy8gdG8gY3Jhd2wgdXAgdG8gdGhlIGhvc3RuYW1lLCBhcyB3ZWxsLiAgVGhpcyBpcyBzdHJhbmdlLlxuICAvLyByZXN1bHQucHJvdG9jb2wgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgbm93LlxuICAvLyBMYXRlciBvbiwgcHV0IHRoZSBmaXJzdCBwYXRoIHBhcnQgaW50byB0aGUgaG9zdCBmaWVsZC5cbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9ICcnO1xuICAgIHJlc3VsdC5wb3J0ID0gbnVsbDtcbiAgICBpZiAocmVzdWx0Lmhvc3QpIHtcbiAgICAgIGlmIChzcmNQYXRoWzBdID09PSAnJykgc3JjUGF0aFswXSA9IHJlc3VsdC5ob3N0O1xuICAgICAgZWxzZSBzcmNQYXRoLnVuc2hpZnQocmVzdWx0Lmhvc3QpO1xuICAgIH1cbiAgICByZXN1bHQuaG9zdCA9ICcnO1xuICAgIGlmIChyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgPSBudWxsO1xuICAgICAgcmVsYXRpdmUucG9ydCA9IG51bGw7XG4gICAgICBpZiAocmVsYXRpdmUuaG9zdCkge1xuICAgICAgICBpZiAocmVsUGF0aFswXSA9PT0gJycpIHJlbFBhdGhbMF0gPSByZWxhdGl2ZS5ob3N0O1xuICAgICAgICBlbHNlIHJlbFBhdGgudW5zaGlmdChyZWxhdGl2ZS5ob3N0KTtcbiAgICAgIH1cbiAgICAgIHJlbGF0aXZlLmhvc3QgPSBudWxsO1xuICAgIH1cbiAgICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyAmJiAocmVsUGF0aFswXSA9PT0gJycgfHwgc3JjUGF0aFswXSA9PT0gJycpO1xuICB9XG4gIHZhciBhdXRoSW5Ib3N0O1xuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gKHJlbGF0aXZlLmhvc3QgfHwgcmVsYXRpdmUuaG9zdCA9PT0gJycpID9cbiAgICAgIHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAocmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnKSA/XG4gICAgICByZWxhdGl2ZS5ob3N0bmFtZSA6IHJlc3VsdC5ob3N0bmFtZTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHNyY1BhdGggPSByZWxQYXRoO1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZG90LWhhbmRsaW5nIGJlbG93LlxuICB9IGVsc2UgaWYgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgLy8gaXQncyByZWxhdGl2ZVxuICAgIC8vIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgIGlmICghc3JjUGF0aCkgc3JjUGF0aCA9IFtdO1xuICAgIHNyY1BhdGgucG9wKCk7XG4gICAgc3JjUGF0aCA9IHNyY1BhdGguY29uY2F0KHJlbFBhdGgpO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gIH0gZWxzZSBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHJlbGF0aXZlLnNlYXJjaCkpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXRpb25hbHkgdGhlIGF1dGggY2FuIGdldCBzdHVjayBvbmx5IGluIGhvc3RcbiAgICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICAgIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAoIWlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICFpc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBubyBwYXRoIGF0IGFsbC4gIGVhc3kuXG4gICAgLy8gd2UndmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBvdGhlciBzdHVmZiBhYm92ZS5cbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnNlYXJjaCkge1xuICAgICAgcmVzdWx0LnBhdGggPSAnLycgKyByZXN1bHQuc2VhcmNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBpZiBhIHVybCBFTkRzIGluIC4gb3IgLi4sIHRoZW4gaXQgbXVzdCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgLy8gaG93ZXZlciwgaWYgaXQgZW5kcyBpbiBhbnl0aGluZyBlbHNlIG5vbi1zbGFzaHksXG4gIC8vIHRoZW4gaXQgbXVzdCBOT1QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIHZhciBsYXN0ID0gc3JjUGF0aC5zbGljZSgtMSlbMF07XG4gIHZhciBoYXNUcmFpbGluZ1NsYXNoID0gKFxuICAgIChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiZcbiAgICAobGFzdCA9PT0gJy4nIHx8IGxhc3QgPT09ICcuLicpIHx8IGxhc3QgPT09ICcnKTtcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJlxuICAgICghc3JjUGF0aFswXSB8fCBzcmNQYXRoWzBdLmNoYXJBdCgwKSAhPT0gJy8nKSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoaGFzVHJhaWxpbmdTbGFzaCAmJiAoc3JjUGF0aC5qb2luKCcvJykuc3Vic3RyKC0xKSAhPT0gJy8nKSkge1xuICAgIHNyY1BhdGgucHVzaCgnJyk7XG4gIH1cblxuICB2YXIgaXNBYnNvbHV0ZSA9IHNyY1BhdGhbMF0gPT09ICcnIHx8XG4gICAgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gaXNBYnNvbHV0ZSA/ICcnIDpcbiAgICAgIHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgP1xuICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzIHx8IChyZXN1bHQuaG9zdCAmJiBzcmNQYXRoLmxlbmd0aCk7XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IHNyY1BhdGguam9pbignLycpO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IHJlcXVlc3QuaHR0cFxuICBpZiAoIWlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICFpc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICB9XG4gIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aCB8fCByZXN1bHQuYXV0aDtcbiAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBwYXJzZUhvc3QodGhpcyk7XG59O1xuXG5mdW5jdGlvbiBwYXJzZUhvc3Qoc2VsZikge1xuICB2YXIgaG9zdCA9IHNlbGYuaG9zdDtcbiAgdmFyIHBvcnQgPSBwb3J0UGF0dGVybi5leGVjKGhvc3QpO1xuICBpZiAocG9ydCkge1xuICAgIHBvcnQgPSBwb3J0WzBdO1xuICAgIGlmIChwb3J0ICE9PSAnOicpIHtcbiAgICAgIHNlbGYucG9ydCA9IHBvcnQuc3Vic3RyKDEpO1xuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zdWJzdHIoMCwgaG9zdC5sZW5ndGggLSBwb3J0Lmxlbmd0aCk7XG4gIH1cbiAgaWYgKGhvc3QpIHNlbGYuaG9zdG5hbWUgPSBob3N0O1xufVxuXG52YXIgX3BvbHlmaWxsTm9kZV91cmwkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRVUkw6IFVSTCQxLFxuXHRVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtcyxcblx0VXJsOiBVcmwsXG5cdGRlZmF1bHQ6IF9wb2x5ZmlsbE5vZGVfdXJsLFxuXHRmaWxlVVJMVG9QYXRoOiB1cmxGaWxlVVJMVG9QYXRoLFxuXHRmb3JtYXQ6IHVybEZvcm1hdCxcblx0cGFyc2U6IHVybFBhcnNlLFxuXHRyZXNvbHZlOiB1cmxSZXNvbHZlLFxuXHRyZXNvbHZlT2JqZWN0OiB1cmxSZXNvbHZlT2JqZWN0XG59KTtcblxuZnVuY3Rpb24gcmVxdWVzdCQxKG9wdHMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3N0cmluZycpXG4gICAgb3B0cyA9IHVybFBhcnNlKG9wdHMpO1xuXG5cbiAgLy8gTm9ybWFsbHksIHRoZSBwYWdlIGlzIGxvYWRlZCBmcm9tIGh0dHAgb3IgaHR0cHMsIHNvIG5vdCBzcGVjaWZ5aW5nIGEgcHJvdG9jb2xcbiAgLy8gd2lsbCByZXN1bHQgaW4gYSAodmFsaWQpIHByb3RvY29sLXJlbGF0aXZlIHVybC4gSG93ZXZlciwgdGhpcyB3b24ndCB3b3JrIGlmXG4gIC8vIHRoZSBwcm90b2NvbCBpcyBzb21ldGhpbmcgZWxzZSwgbGlrZSAnZmlsZTonXG4gIHZhciBkZWZhdWx0UHJvdG9jb2wgPSBnbG9iYWwkMS5sb2NhdGlvbi5wcm90b2NvbC5zZWFyY2goL15odHRwcz86JC8pID09PSAtMSA/ICdodHRwOicgOiAnJztcblxuICB2YXIgcHJvdG9jb2wgPSBvcHRzLnByb3RvY29sIHx8IGRlZmF1bHRQcm90b2NvbDtcbiAgdmFyIGhvc3QgPSBvcHRzLmhvc3RuYW1lIHx8IG9wdHMuaG9zdDtcbiAgdmFyIHBvcnQgPSBvcHRzLnBvcnQ7XG4gIHZhciBwYXRoID0gb3B0cy5wYXRoIHx8ICcvJztcblxuICAvLyBOZWNlc3NhcnkgZm9yIElQdjYgYWRkcmVzc2VzXG4gIGlmIChob3N0ICYmIGhvc3QuaW5kZXhPZignOicpICE9PSAtMSlcbiAgICBob3N0ID0gJ1snICsgaG9zdCArICddJztcblxuICAvLyBUaGlzIG1heSBiZSBhIHJlbGF0aXZlIHVybC4gVGhlIGJyb3dzZXIgc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGludGVycHJldCBpdCBjb3JyZWN0bHkuXG4gIG9wdHMudXJsID0gKGhvc3QgPyAocHJvdG9jb2wgKyAnLy8nICsgaG9zdCkgOiAnJykgKyAocG9ydCA/ICc6JyArIHBvcnQgOiAnJykgKyBwYXRoO1xuICBvcHRzLm1ldGhvZCA9IChvcHRzLm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgb3B0cy5oZWFkZXJzID0gb3B0cy5oZWFkZXJzIHx8IHt9O1xuXG4gIC8vIEFsc28gdmFsaWQgb3B0cy5hdXRoLCBvcHRzLm1vZGVcblxuICB2YXIgcmVxID0gbmV3IENsaWVudFJlcXVlc3Qob3B0cyk7XG4gIGlmIChjYilcbiAgICByZXEub24oJ3Jlc3BvbnNlJywgY2IpO1xuICByZXR1cm4gcmVxXG59XG5cbmZ1bmN0aW9uIGdldCQxKG9wdHMsIGNiKSB7XG4gIHZhciByZXEgPSByZXF1ZXN0JDEob3B0cywgY2IpO1xuICByZXEuZW5kKCk7XG4gIHJldHVybiByZXFcbn1cblxuZnVuY3Rpb24gQWdlbnQkMSgpIHt9XG5BZ2VudCQxLmRlZmF1bHRNYXhTb2NrZXRzID0gNDtcblxudmFyIE1FVEhPRFMkMSA9IFtcbiAgJ0NIRUNLT1VUJyxcbiAgJ0NPTk5FQ1QnLFxuICAnQ09QWScsXG4gICdERUxFVEUnLFxuICAnR0VUJyxcbiAgJ0hFQUQnLFxuICAnTE9DSycsXG4gICdNLVNFQVJDSCcsXG4gICdNRVJHRScsXG4gICdNS0FDVElWSVRZJyxcbiAgJ01LQ09MJyxcbiAgJ01PVkUnLFxuICAnTk9USUZZJyxcbiAgJ09QVElPTlMnLFxuICAnUEFUQ0gnLFxuICAnUE9TVCcsXG4gICdQUk9QRklORCcsXG4gICdQUk9QUEFUQ0gnLFxuICAnUFVSR0UnLFxuICAnUFVUJyxcbiAgJ1JFUE9SVCcsXG4gICdTRUFSQ0gnLFxuICAnU1VCU0NSSUJFJyxcbiAgJ1RSQUNFJyxcbiAgJ1VOTE9DSycsXG4gICdVTlNVQlNDUklCRSdcbl07XG52YXIgU1RBVFVTX0NPREVTJDEgPSB7XG4gIDEwMDogJ0NvbnRpbnVlJyxcbiAgMTAxOiAnU3dpdGNoaW5nIFByb3RvY29scycsXG4gIDEwMjogJ1Byb2Nlc3NpbmcnLCAvLyBSRkMgMjUxOCwgb2Jzb2xldGVkIGJ5IFJGQyA0OTE4XG4gIDIwMDogJ09LJyxcbiAgMjAxOiAnQ3JlYXRlZCcsXG4gIDIwMjogJ0FjY2VwdGVkJyxcbiAgMjAzOiAnTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24nLFxuICAyMDQ6ICdObyBDb250ZW50JyxcbiAgMjA1OiAnUmVzZXQgQ29udGVudCcsXG4gIDIwNjogJ1BhcnRpYWwgQ29udGVudCcsXG4gIDIwNzogJ011bHRpLVN0YXR1cycsIC8vIFJGQyA0OTE4XG4gIDMwMDogJ011bHRpcGxlIENob2ljZXMnLFxuICAzMDE6ICdNb3ZlZCBQZXJtYW5lbnRseScsXG4gIDMwMjogJ01vdmVkIFRlbXBvcmFyaWx5JyxcbiAgMzAzOiAnU2VlIE90aGVyJyxcbiAgMzA0OiAnTm90IE1vZGlmaWVkJyxcbiAgMzA1OiAnVXNlIFByb3h5JyxcbiAgMzA3OiAnVGVtcG9yYXJ5IFJlZGlyZWN0JyxcbiAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICA0MDE6ICdVbmF1dGhvcml6ZWQnLFxuICA0MDI6ICdQYXltZW50IFJlcXVpcmVkJyxcbiAgNDAzOiAnRm9yYmlkZGVuJyxcbiAgNDA0OiAnTm90IEZvdW5kJyxcbiAgNDA1OiAnTWV0aG9kIE5vdCBBbGxvd2VkJyxcbiAgNDA2OiAnTm90IEFjY2VwdGFibGUnLFxuICA0MDc6ICdQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcsXG4gIDQwODogJ1JlcXVlc3QgVGltZS1vdXQnLFxuICA0MDk6ICdDb25mbGljdCcsXG4gIDQxMDogJ0dvbmUnLFxuICA0MTE6ICdMZW5ndGggUmVxdWlyZWQnLFxuICA0MTI6ICdQcmVjb25kaXRpb24gRmFpbGVkJyxcbiAgNDEzOiAnUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlJyxcbiAgNDE0OiAnUmVxdWVzdC1VUkkgVG9vIExhcmdlJyxcbiAgNDE1OiAnVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZScsXG4gIDQxNjogJ1JlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGUnLFxuICA0MTc6ICdFeHBlY3RhdGlvbiBGYWlsZWQnLFxuICA0MTg6ICdJXFwnbSBhIHRlYXBvdCcsIC8vIFJGQyAyMzI0XG4gIDQyMjogJ1VucHJvY2Vzc2FibGUgRW50aXR5JywgLy8gUkZDIDQ5MThcbiAgNDIzOiAnTG9ja2VkJywgLy8gUkZDIDQ5MThcbiAgNDI0OiAnRmFpbGVkIERlcGVuZGVuY3knLCAvLyBSRkMgNDkxOFxuICA0MjU6ICdVbm9yZGVyZWQgQ29sbGVjdGlvbicsIC8vIFJGQyA0OTE4XG4gIDQyNjogJ1VwZ3JhZGUgUmVxdWlyZWQnLCAvLyBSRkMgMjgxN1xuICA0Mjg6ICdQcmVjb25kaXRpb24gUmVxdWlyZWQnLCAvLyBSRkMgNjU4NVxuICA0Mjk6ICdUb28gTWFueSBSZXF1ZXN0cycsIC8vIFJGQyA2NTg1XG4gIDQzMTogJ1JlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnLCAvLyBSRkMgNjU4NVxuICA1MDA6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICA1MDE6ICdOb3QgSW1wbGVtZW50ZWQnLFxuICA1MDI6ICdCYWQgR2F0ZXdheScsXG4gIDUwMzogJ1NlcnZpY2UgVW5hdmFpbGFibGUnLFxuICA1MDQ6ICdHYXRld2F5IFRpbWUtb3V0JyxcbiAgNTA1OiAnSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWQnLFxuICA1MDY6ICdWYXJpYW50IEFsc28gTmVnb3RpYXRlcycsIC8vIFJGQyAyMjk1XG4gIDUwNzogJ0luc3VmZmljaWVudCBTdG9yYWdlJywgLy8gUkZDIDQ5MThcbiAgNTA5OiAnQmFuZHdpZHRoIExpbWl0IEV4Y2VlZGVkJyxcbiAgNTEwOiAnTm90IEV4dGVuZGVkJywgLy8gUkZDIDI3NzRcbiAgNTExOiAnTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcgLy8gUkZDIDY1ODVcbn07XG5cbnZhciBfcG9seWZpbGxOb2RlX2h0dHAgPSB7XG4gIHJlcXVlc3Q6IHJlcXVlc3QkMSxcbiAgZ2V0OiBnZXQkMSxcbiAgQWdlbnQ6IEFnZW50JDEsXG4gIE1FVEhPRFM6IE1FVEhPRFMkMSxcbiAgU1RBVFVTX0NPREVTOiBTVEFUVVNfQ09ERVMkMVxufTtcblxudmFyIF9wb2x5ZmlsbE5vZGVfaHR0cCQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdEFnZW50OiBBZ2VudCQxLFxuXHRNRVRIT0RTOiBNRVRIT0RTJDEsXG5cdFNUQVRVU19DT0RFUzogU1RBVFVTX0NPREVTJDEsXG5cdGRlZmF1bHQ6IF9wb2x5ZmlsbE5vZGVfaHR0cCxcblx0Z2V0OiBnZXQkMSxcblx0cmVxdWVzdDogcmVxdWVzdCQxXG59KTtcblxudmFyIHJlcXVpcmUkJDIgPSAvKkBfX1BVUkVfXyovZ2V0QXVnbWVudGVkTmFtZXNwYWNlKF9wb2x5ZmlsbE5vZGVfaHR0cCQxKTtcblxuZnVuY3Rpb24gcmVxdWVzdChvcHRzLCBjYikge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKVxuICAgIG9wdHMgPSB1cmxQYXJzZShvcHRzKTtcblxuXG4gIC8vIE5vcm1hbGx5LCB0aGUgcGFnZSBpcyBsb2FkZWQgZnJvbSBodHRwIG9yIGh0dHBzLCBzbyBub3Qgc3BlY2lmeWluZyBhIHByb3RvY29sXG4gIC8vIHdpbGwgcmVzdWx0IGluIGEgKHZhbGlkKSBwcm90b2NvbC1yZWxhdGl2ZSB1cmwuIEhvd2V2ZXIsIHRoaXMgd29uJ3Qgd29yayBpZlxuICAvLyB0aGUgcHJvdG9jb2wgaXMgc29tZXRoaW5nIGVsc2UsIGxpa2UgJ2ZpbGU6J1xuICB2YXIgZGVmYXVsdFByb3RvY29sID0gZ2xvYmFsJDEubG9jYXRpb24ucHJvdG9jb2wuc2VhcmNoKC9eaHR0cHM/OiQvKSA9PT0gLTEgPyAnaHR0cDonIDogJyc7XG5cbiAgdmFyIHByb3RvY29sID0gb3B0cy5wcm90b2NvbCB8fCBkZWZhdWx0UHJvdG9jb2w7XG4gIHZhciBob3N0ID0gb3B0cy5ob3N0bmFtZSB8fCBvcHRzLmhvc3Q7XG4gIHZhciBwb3J0ID0gb3B0cy5wb3J0O1xuICB2YXIgcGF0aCA9IG9wdHMucGF0aCB8fCAnLyc7XG5cbiAgLy8gTmVjZXNzYXJ5IGZvciBJUHY2IGFkZHJlc3Nlc1xuICBpZiAoaG9zdCAmJiBob3N0LmluZGV4T2YoJzonKSAhPT0gLTEpXG4gICAgaG9zdCA9ICdbJyArIGhvc3QgKyAnXSc7XG5cbiAgLy8gVGhpcyBtYXkgYmUgYSByZWxhdGl2ZSB1cmwuIFRoZSBicm93c2VyIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBpbnRlcnByZXQgaXQgY29ycmVjdGx5LlxuICBvcHRzLnVybCA9IChob3N0ID8gKHByb3RvY29sICsgJy8vJyArIGhvc3QpIDogJycpICsgKHBvcnQgPyAnOicgKyBwb3J0IDogJycpICsgcGF0aDtcbiAgb3B0cy5tZXRob2QgPSAob3B0cy5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gIG9wdHMuaGVhZGVycyA9IG9wdHMuaGVhZGVycyB8fCB7fTtcblxuICAvLyBBbHNvIHZhbGlkIG9wdHMuYXV0aCwgb3B0cy5tb2RlXG5cbiAgdmFyIHJlcSA9IG5ldyBDbGllbnRSZXF1ZXN0KG9wdHMpO1xuICBpZiAoY2IpXG4gICAgcmVxLm9uKCdyZXNwb25zZScsIGNiKTtcbiAgcmV0dXJuIHJlcVxufVxuXG5mdW5jdGlvbiBnZXQob3B0cywgY2IpIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3Qob3B0cywgY2IpO1xuICByZXEuZW5kKCk7XG4gIHJldHVybiByZXFcbn1cblxuZnVuY3Rpb24gQWdlbnQoKSB7fVxuQWdlbnQuZGVmYXVsdE1heFNvY2tldHMgPSA0O1xuXG52YXIgTUVUSE9EUyA9IFtcbiAgJ0NIRUNLT1VUJyxcbiAgJ0NPTk5FQ1QnLFxuICAnQ09QWScsXG4gICdERUxFVEUnLFxuICAnR0VUJyxcbiAgJ0hFQUQnLFxuICAnTE9DSycsXG4gICdNLVNFQVJDSCcsXG4gICdNRVJHRScsXG4gICdNS0FDVElWSVRZJyxcbiAgJ01LQ09MJyxcbiAgJ01PVkUnLFxuICAnTk9USUZZJyxcbiAgJ09QVElPTlMnLFxuICAnUEFUQ0gnLFxuICAnUE9TVCcsXG4gICdQUk9QRklORCcsXG4gICdQUk9QUEFUQ0gnLFxuICAnUFVSR0UnLFxuICAnUFVUJyxcbiAgJ1JFUE9SVCcsXG4gICdTRUFSQ0gnLFxuICAnU1VCU0NSSUJFJyxcbiAgJ1RSQUNFJyxcbiAgJ1VOTE9DSycsXG4gICdVTlNVQlNDUklCRSdcbl07XG52YXIgU1RBVFVTX0NPREVTID0ge1xuICAxMDA6ICdDb250aW51ZScsXG4gIDEwMTogJ1N3aXRjaGluZyBQcm90b2NvbHMnLFxuICAxMDI6ICdQcm9jZXNzaW5nJywgLy8gUkZDIDI1MTgsIG9ic29sZXRlZCBieSBSRkMgNDkxOFxuICAyMDA6ICdPSycsXG4gIDIwMTogJ0NyZWF0ZWQnLFxuICAyMDI6ICdBY2NlcHRlZCcsXG4gIDIwMzogJ05vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uJyxcbiAgMjA0OiAnTm8gQ29udGVudCcsXG4gIDIwNTogJ1Jlc2V0IENvbnRlbnQnLFxuICAyMDY6ICdQYXJ0aWFsIENvbnRlbnQnLFxuICAyMDc6ICdNdWx0aS1TdGF0dXMnLCAvLyBSRkMgNDkxOFxuICAzMDA6ICdNdWx0aXBsZSBDaG9pY2VzJyxcbiAgMzAxOiAnTW92ZWQgUGVybWFuZW50bHknLFxuICAzMDI6ICdNb3ZlZCBUZW1wb3JhcmlseScsXG4gIDMwMzogJ1NlZSBPdGhlcicsXG4gIDMwNDogJ05vdCBNb2RpZmllZCcsXG4gIDMwNTogJ1VzZSBQcm94eScsXG4gIDMwNzogJ1RlbXBvcmFyeSBSZWRpcmVjdCcsXG4gIDQwMDogJ0JhZCBSZXF1ZXN0JyxcbiAgNDAxOiAnVW5hdXRob3JpemVkJyxcbiAgNDAyOiAnUGF5bWVudCBSZXF1aXJlZCcsXG4gIDQwMzogJ0ZvcmJpZGRlbicsXG4gIDQwNDogJ05vdCBGb3VuZCcsXG4gIDQwNTogJ01ldGhvZCBOb3QgQWxsb3dlZCcsXG4gIDQwNjogJ05vdCBBY2NlcHRhYmxlJyxcbiAgNDA3OiAnUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnLFxuICA0MDg6ICdSZXF1ZXN0IFRpbWUtb3V0JyxcbiAgNDA5OiAnQ29uZmxpY3QnLFxuICA0MTA6ICdHb25lJyxcbiAgNDExOiAnTGVuZ3RoIFJlcXVpcmVkJyxcbiAgNDEyOiAnUHJlY29uZGl0aW9uIEZhaWxlZCcsXG4gIDQxMzogJ1JlcXVlc3QgRW50aXR5IFRvbyBMYXJnZScsXG4gIDQxNDogJ1JlcXVlc3QtVVJJIFRvbyBMYXJnZScsXG4gIDQxNTogJ1Vuc3VwcG9ydGVkIE1lZGlhIFR5cGUnLFxuICA0MTY6ICdSZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlJyxcbiAgNDE3OiAnRXhwZWN0YXRpb24gRmFpbGVkJyxcbiAgNDE4OiAnSVxcJ20gYSB0ZWFwb3QnLCAvLyBSRkMgMjMyNFxuICA0MjI6ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsIC8vIFJGQyA0OTE4XG4gIDQyMzogJ0xvY2tlZCcsIC8vIFJGQyA0OTE4XG4gIDQyNDogJ0ZhaWxlZCBEZXBlbmRlbmN5JywgLy8gUkZDIDQ5MThcbiAgNDI1OiAnVW5vcmRlcmVkIENvbGxlY3Rpb24nLCAvLyBSRkMgNDkxOFxuICA0MjY6ICdVcGdyYWRlIFJlcXVpcmVkJywgLy8gUkZDIDI4MTdcbiAgNDI4OiAnUHJlY29uZGl0aW9uIFJlcXVpcmVkJywgLy8gUkZDIDY1ODVcbiAgNDI5OiAnVG9vIE1hbnkgUmVxdWVzdHMnLCAvLyBSRkMgNjU4NVxuICA0MzE6ICdSZXF1ZXN0IEhlYWRlciBGaWVsZHMgVG9vIExhcmdlJywgLy8gUkZDIDY1ODVcbiAgNTAwOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgNTAxOiAnTm90IEltcGxlbWVudGVkJyxcbiAgNTAyOiAnQmFkIEdhdGV3YXknLFxuICA1MDM6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcbiAgNTA0OiAnR2F0ZXdheSBUaW1lLW91dCcsXG4gIDUwNTogJ0hUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkJyxcbiAgNTA2OiAnVmFyaWFudCBBbHNvIE5lZ290aWF0ZXMnLCAvLyBSRkMgMjI5NVxuICA1MDc6ICdJbnN1ZmZpY2llbnQgU3RvcmFnZScsIC8vIFJGQyA0OTE4XG4gIDUwOTogJ0JhbmR3aWR0aCBMaW1pdCBFeGNlZWRlZCcsXG4gIDUxMDogJ05vdCBFeHRlbmRlZCcsIC8vIFJGQyAyNzc0XG4gIDUxMTogJ05ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnIC8vIFJGQyA2NTg1XG59O1xuXG52YXIgX3BvbHlmaWxsTm9kZV9odHRwcyA9IHtcbiAgcmVxdWVzdCxcbiAgZ2V0LFxuICBBZ2VudCxcbiAgTUVUSE9EUyxcbiAgU1RBVFVTX0NPREVTXG59O1xuXG52YXIgX3BvbHlmaWxsTm9kZV9odHRwcyQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdEFnZW50OiBBZ2VudCxcblx0TUVUSE9EUzogTUVUSE9EUyxcblx0U1RBVFVTX0NPREVTOiBTVEFUVVNfQ09ERVMsXG5cdGRlZmF1bHQ6IF9wb2x5ZmlsbE5vZGVfaHR0cHMsXG5cdGdldDogZ2V0LFxuXHRyZXF1ZXN0OiByZXF1ZXN0XG59KTtcblxudmFyIHJlcXVpcmUkJDMgPSAvKkBfX1BVUkVfXyovZ2V0QXVnbWVudGVkTmFtZXNwYWNlKF9wb2x5ZmlsbE5vZGVfaHR0cHMkMSk7XG5cbnZhciByZXF1aXJlJCQ0ID0gLypAX19QVVJFX18qL2dldEF1Z21lbnRlZE5hbWVzcGFjZShfcG9seWZpbGxOb2RlX3VybCQxKTtcblxudmFyIG1zZyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbmZ1bmN0aW9uIGFycmF5U2V0KGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7XG4gIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4pLCBkZXN0X29mZnMpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICB9XG59XG5cblxudmFyIEJ1ZjggPSBVaW50OEFycmF5O1xudmFyIEJ1ZjE2ID0gVWludDE2QXJyYXk7XG52YXIgQnVmMzIgPSBJbnQzMkFycmF5O1xuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8vdmFyIFpfRklMVEVSRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9IVUZGTUFOX09OTFkgICAgICA9IDI7XG4vL3ZhciBaX1JMRSAgICAgICAgICAgICAgID0gMztcbnZhciBaX0ZJWEVEJDIgPSA0O1xuLy92YXIgWl9ERUZBVUxUX1NUUkFURUdZICA9IDA7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbnZhciBaX0JJTkFSWSQxID0gMDtcbnZhciBaX1RFWFQkMSA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04kMiA9IDI7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuZnVuY3Rpb24gemVybyQxKGJ1Zikge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aDtcbiAgd2hpbGUgKC0tbGVuID49IDApIHtcbiAgICBidWZbbGVuXSA9IDA7XG4gIH1cbn1cblxuLy8gRnJvbSB6dXRpbC5oXG5cbnZhciBTVE9SRURfQkxPQ0sgPSAwO1xudmFyIFNUQVRJQ19UUkVFUyA9IDE7XG52YXIgRFlOX1RSRUVTID0gMjtcbi8qIFRoZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovXG5cbnZhciBNSU5fTUFUQ0gkMSA9IDM7XG52YXIgTUFYX01BVENIJDEgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbnZhciBMRU5HVEhfQ09ERVMkMSA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBMSVRFUkFMUyQxID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG5cbnZhciBMX0NPREVTJDEgPSBMSVRFUkFMUyQxICsgMSArIExFTkdUSF9DT0RFUyQxO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG5cbnZhciBEX0NPREVTJDEgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgQkxfQ09ERVMkMSA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbnZhciBIRUFQX1NJWkUkMSA9IDIgKiBMX0NPREVTJDEgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxudmFyIE1BWF9CSVRTJDEgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgQnVmX3NpemUgPSAxNjtcbi8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi9cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0YW50c1xuICovXG5cbnZhciBNQVhfQkxfQklUUyA9IDc7XG4vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovXG5cbnZhciBFTkRfQkxPQ0sgPSAyNTY7XG4vKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovXG5cbnZhciBSRVBfM182ID0gMTY7XG4vKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzNfMTAgPSAxNztcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDMtMTAgdGltZXMgICgzIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG52YXIgUkVQWl8xMV8xMzggPSAxODtcbi8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbi8qIGVzbGludC1kaXNhYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG52YXIgZXh0cmFfbGJpdHMgPSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovIFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwXTtcblxudmFyIGV4dHJhX2RiaXRzID0gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBkaXN0YW5jZSBjb2RlICovIFswLCAwLCAwLCAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4LCA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTNdO1xuXG52YXIgZXh0cmFfYmxiaXRzID0gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDMsIDddO1xuXG52YXIgYmxfb3JkZXIgPSBbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV07XG4vKiBlc2xpbnQtZW5hYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG5cbi8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmdcbiAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLlxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS5cbiAqL1xuXG4vLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2Fwc1xuXG52YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zZGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG52YXIgc3RhdGljX2x0cmVlID0gbmV3IEFycmF5KChMX0NPREVTJDEgKyAyKSAqIDIpO1xuemVybyQxKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgPSBuZXcgQXJyYXkoRF9DT0RFUyQxICogMik7XG56ZXJvJDEoc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvJDEoX2Rpc3RfY29kZSk7XG4vKiBEaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzXG4gKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mXG4gKiB0aGUgMTUgYml0IGRpc3RhbmNlcy5cbiAqL1xuXG52YXIgX2xlbmd0aF9jb2RlID0gbmV3IEFycmF5KE1BWF9NQVRDSCQxIC0gTUlOX01BVENIJDEgKyAxKTtcbnplcm8kMShfbGVuZ3RoX2NvZGUpO1xuLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqL1xuXG52YXIgYmFzZV9sZW5ndGggPSBuZXcgQXJyYXkoTEVOR1RIX0NPREVTJDEpO1xuemVybyQxKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2Rpc3QgPSBuZXcgQXJyYXkoRF9DT0RFUyQxKTtcbnplcm8kMShiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlID0gc3RhdGljX3RyZWU7IC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iaXRzID0gZXh0cmFfYml0czsgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlID0gZXh0cmFfYmFzZTsgLyogYmFzZSBpbmRleCBmb3IgZXh0cmFfYml0cyAqL1xuICB0aGlzLmVsZW1zID0gZWxlbXM7IC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoID0gbWF4X2xlbmd0aDsgLyogbWF4IGJpdCBsZW5ndGggZm9yIHRoZSBjb2RlcyAqL1xuXG4gIC8vIHNob3cgaWYgYHN0YXRpY190cmVlYCBoYXMgZGF0YSBvciBkdW1teSAtIG5lZWRlZCBmb3IgbW9ub21vcnBoaWMgb2JqZWN0c1xuICB0aGlzLmhhc19zdHJlZSA9IHN0YXRpY190cmVlICYmIHN0YXRpY190cmVlLmxlbmd0aDtcbn1cblxuXG52YXIgc3RhdGljX2xfZGVzYztcbnZhciBzdGF0aWNfZF9kZXNjO1xudmFyIHN0YXRpY19ibF9kZXNjO1xuXG5cbmZ1bmN0aW9uIFRyZWVEZXNjKGR5bl90cmVlLCBzdGF0X2Rlc2MpIHtcbiAgdGhpcy5keW5fdHJlZSA9IGR5bl90cmVlOyAvKiB0aGUgZHluYW1pYyB0cmVlICovXG4gIHRoaXMubWF4X2NvZGUgPSAwOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdGhpcy5zdGF0X2Rlc2MgPSBzdGF0X2Rlc2M7IC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5mdW5jdGlvbiBkX2NvZGUoZGlzdCkge1xuICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NiArIChkaXN0ID4+PiA3KV07XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHtcbiAgLy8gICAgcHV0X2J5dGUocywgKHVjaCkoKHcpICYgMHhmZikpO1xuICAvLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodXNoKSh3KSA+PiA4KSk7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gKHcpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodyA+Pj4gOCkgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHZhbHVlIG9uIGEgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuXG4gKiBJTiBhc3NlcnRpb246IGxlbmd0aCA8PSAxNiBhbmQgdmFsdWUgZml0cyBpbiBsZW5ndGggYml0cy5cbiAqL1xuZnVuY3Rpb24gc2VuZF9iaXRzKHMsIHZhbHVlLCBsZW5ndGgpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPiAoQnVmX3NpemUgLSBsZW5ndGgpKSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSB2YWx1ZSA+PiAoQnVmX3NpemUgLSBzLmJpX3ZhbGlkKTtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJ1Zl9zaXplO1xuICB9IGVsc2Uge1xuICAgIHMuYmlfYnVmIHw9ICh2YWx1ZSA8PCBzLmJpX3ZhbGlkKSAmIDB4ZmZmZjtcbiAgICBzLmJpX3ZhbGlkICs9IGxlbmd0aDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlbmRfY29kZShzLCBjLCB0cmVlKSB7XG4gIHNlbmRfYml0cyhzLCB0cmVlW2MgKiAyXSAvKi5Db2RlKi8gLCB0cmVlW2MgKiAyICsgMV0gLyouTGVuKi8gKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyXG4gKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpXG4gKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1XG4gKi9cbmZ1bmN0aW9uIGJpX3JldmVyc2UoY29kZSwgbGVuKSB7XG4gIHZhciByZXMgPSAwO1xuICBkbyB7XG4gICAgcmVzIHw9IGNvZGUgJiAxO1xuICAgIGNvZGUgPj4+PSAxO1xuICAgIHJlcyA8PD0gMTtcbiAgfSB3aGlsZSAoLS1sZW4gPiAwKTtcbiAgcmV0dXJuIHJlcyA+Pj4gMTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LlxuICovXG5mdW5jdGlvbiBiaV9mbHVzaChzKSB7XG4gIGlmIChzLmJpX3ZhbGlkID09PSAxNikge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gICAgcy5iaV9idWYgPSAwO1xuICAgIHMuYmlfdmFsaWQgPSAwO1xuXG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+PSA4KSB7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZiAmIDB4ZmY7XG4gICAgcy5iaV9idWYgPj49IDg7XG4gICAgcy5iaV92YWxpZCAtPSA4O1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aFxuICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmRcbiAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlXG4gKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguXG4gKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzXG4gKiAgICAgbm90IG51bGwuXG4gKi9cbmZ1bmN0aW9uIGdlbl9iaXRsZW4ocywgZGVzYykge1xuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xuICB2YXIgdHJlZSA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBtYXhfY29kZSA9IGRlc2MubWF4X2NvZGU7XG4gIHZhciBzdHJlZSA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZXh0cmEgPSBkZXNjLnN0YXRfZGVzYy5leHRyYV9iaXRzO1xuICB2YXIgYmFzZSA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7XG4gIHZhciBtYXhfbGVuZ3RoID0gZGVzYy5zdGF0X2Rlc2MubWF4X2xlbmd0aDtcbiAgdmFyIGg7IC8qIGhlYXAgaW5kZXggKi9cbiAgdmFyIG4sIG07IC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgLyogYml0IGxlbmd0aCAqL1xuICB2YXIgeGJpdHM7IC8qIGV4dHJhIGJpdHMgKi9cbiAgdmFyIGY7IC8qIGZyZXF1ZW5jeSAqL1xuICB2YXIgb3ZlcmZsb3cgPSAwOyAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqL1xuXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFMkMTsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdIC8qLkxlbiovID0gMDsgLyogcm9vdCBvZiB0aGUgaGVhcCAqL1xuXG4gIGZvciAoaCA9IHMuaGVhcF9tYXggKyAxOyBoIDwgSEVBUF9TSVpFJDE7IGgrKykge1xuICAgIG4gPSBzLmhlYXBbaF07XG4gICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdIC8qLkRhZCovICogMiArIDFdIC8qLkxlbiovICsgMTtcbiAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIHtcbiAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoO1xuICAgICAgb3ZlcmZsb3crKztcbiAgICB9XG4gICAgdHJlZVtuICogMiArIDFdIC8qLkxlbiovID0gYml0cztcbiAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqL1xuXG4gICAgaWYgKG4gPiBtYXhfY29kZSkge1xuICAgICAgY29udGludWU7XG4gICAgfSAvKiBub3QgYSBsZWFmIG5vZGUgKi9cblxuICAgIHMuYmxfY291bnRbYml0c10rKztcbiAgICB4Yml0cyA9IDA7XG4gICAgaWYgKG4gPj0gYmFzZSkge1xuICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXSAvKi5GcmVxKi8gO1xuICAgIHMub3B0X2xlbiArPSBmICogKGJpdHMgKyB4Yml0cyk7XG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuICs9IGYgKiAoc3RyZWVbbiAqIDIgKyAxXSAvKi5MZW4qLyArIHhiaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKG92ZXJmbG93ID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVHJhY2UoKHN0ZGVycixcIlxcbmJpdCBsZW5ndGggb3ZlcmZsb3dcXG5cIikpO1xuICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqL1xuXG4gIC8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovXG4gIGRvIHtcbiAgICBiaXRzID0gbWF4X2xlbmd0aCAtIDE7XG4gICAgd2hpbGUgKHMuYmxfY291bnRbYml0c10gPT09IDApIHtcbiAgICAgIGJpdHMtLTtcbiAgICB9XG4gICAgcy5ibF9jb3VudFtiaXRzXS0tOyAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0cmVlW20gKiAyICsgMV0gLyouTGVuKi8gIT09IGJpdHMpIHtcbiAgICAgICAgLy8gVHJhY2UoKHN0ZGVycixcImNvZGUgJWQgYml0cyAlZC0+JWRcXG5cIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTtcbiAgICAgICAgcy5vcHRfbGVuICs9IChiaXRzIC0gdHJlZVttICogMiArIDFdIC8qLkxlbiovICkgKiB0cmVlW20gKiAyXSAvKi5GcmVxKi8gO1xuICAgICAgICB0cmVlW20gKiAyICsgMV0gLyouTGVuKi8gPSBiaXRzO1xuICAgICAgfVxuICAgICAgbi0tO1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogR2VuZXJhdGUgdGhlIGNvZGVzIGZvciBhIGdpdmVuIHRyZWUgYW5kIGJpdCBjb3VudHMgKHdoaWNoIG5lZWQgbm90IGJlXG4gKiBvcHRpbWFsKS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBiaXQgbGVuZ3RoIHN0YXRpc3RpY3MgZm9yXG4gKiB0aGUgZ2l2ZW4gdHJlZSBhbmQgdGhlIGZpZWxkIGxlbiBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbjogdGhlIGZpZWxkIGNvZGUgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cyBvZiBub25cbiAqICAgICB6ZXJvIGNvZGUgbGVuZ3RoLlxuICovXG5mdW5jdGlvbiBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIGJsX2NvdW50KSB7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4vLyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovXG5cbiAgdmFyIG5leHRfY29kZSA9IG5ldyBBcnJheShNQVhfQklUUyQxICsgMSk7IC8qIG5leHQgY29kZSB2YWx1ZSBmb3IgZWFjaCBiaXQgbGVuZ3RoICovXG4gIHZhciBjb2RlID0gMDsgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAvKiBiaXQgaW5kZXggKi9cbiAgdmFyIG47IC8qIGNvZGUgaW5kZXggKi9cblxuICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXNcbiAgICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuXG4gICAqL1xuICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTJDE7IGJpdHMrKykge1xuICAgIG5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIGJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTtcbiAgfVxuICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlXG4gICAqIG11c3QgYmUgYWxsIG9uZXMuXG4gICAqL1xuICAvL0Fzc2VydCAoY29kZSArIGJsX2NvdW50W01BWF9CSVRTXS0xID09ICgxPDxNQVhfQklUUyktMSxcbiAgLy8gICAgICAgIFwiaW5jb25zaXN0ZW50IGJpdCBjb3VudHNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsXCJcXG5nZW5fY29kZXM6IG1heF9jb2RlICVkIFwiLCBtYXhfY29kZSkpO1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIHZhciBsZW4gPSB0cmVlW24gKiAyICsgMV0gLyouTGVuKi8gO1xuICAgIGlmIChsZW4gPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvKiBOb3cgcmV2ZXJzZSB0aGUgYml0cyAqL1xuICAgIHRyZWVbbiAqIDJdIC8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAvKiBiaXQgY291bnRlciAqL1xuICB2YXIgbGVuZ3RoOyAvKiBsZW5ndGggdmFsdWUgKi9cbiAgdmFyIGNvZGU7IC8qIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGRpc3Q7IC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyQxICsgMSk7XG4gIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqL1xuXG4gIC8vIGRvIGNoZWNrIGluIF90cl9pbml0KClcbiAgLy9pZiAoc3RhdGljX2luaXRfZG9uZSkgcmV0dXJuO1xuXG4gIC8qIEZvciBzb21lIGVtYmVkZGVkIHRhcmdldHMsIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdCBpbml0aWFsaXplZDogKi9cbiAgLyojaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlNcbiAgICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICAgIHN0YXRpY19sX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2xiaXRzO1xuICAgIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7XG4gICAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gICAgc3RhdGljX2JsX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2JsYml0cztcbiAgI2VuZGlmKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGxlbmd0aCAoMC4uMjU1KSAtPiBsZW5ndGggY29kZSAoMC4uMjgpICovXG4gIGxlbmd0aCA9IDA7XG4gIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMkMSAtIDE7IGNvZGUrKykge1xuICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoO1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqL1xuICBkaXN0ID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoOyBjb2RlIDwgRF9DT0RFUyQxOyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IChleHRyYV9kYml0c1tjb2RlXSAtIDcpKTsgbisrKSB7XG4gICAgICBfZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IDI1NitkaXN0ICE9IDUxMlwiKTtcblxuICAvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovXG4gIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFMkMTsgYml0cysrKSB7XG4gICAgYmxfY291bnRbYml0c10gPSAwO1xuICB9XG5cbiAgbiA9IDA7XG4gIHdoaWxlIChuIDw9IDE0Mykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdIC8qLkxlbiovID0gODtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOF0rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyNTUpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXSAvKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gLyouTGVuKi8gPSA3O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs3XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI4Nykge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdIC8qLkxlbiovID0gODtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOF0rKztcbiAgfVxuICAvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGVcbiAgICogdHJlZSBjb25zdHJ1Y3Rpb24gdG8gZ2V0IGEgY2Fub25pY2FsIEh1ZmZtYW4gdHJlZSAobG9uZ2VzdCBjb2RlXG4gICAqIGFsbCBvbmVzKVxuICAgKi9cbiAgZ2VuX2NvZGVzKHN0YXRpY19sdHJlZSwgTF9DT0RFUyQxICsgMSwgYmxfY291bnQpO1xuXG4gIC8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZSBpcyB0cml2aWFsOiAqL1xuICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUyQxOyBuKyspIHtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXSAvKi5MZW4qLyA9IDU7XG4gICAgc3RhdGljX2R0cmVlW24gKiAyXSAvKi5Db2RlKi8gPSBiaV9yZXZlcnNlKG4sIDUpO1xuICB9XG5cbiAgLy8gTm93IGRhdGEgcmVhZHkgYW5kIHdlIGNhbiBpbml0IHN0YXRpYyB0cmVlc1xuICBzdGF0aWNfbF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19sdHJlZSwgZXh0cmFfbGJpdHMsIExJVEVSQUxTJDEgKyAxLCBMX0NPREVTJDEsIE1BWF9CSVRTJDEpO1xuICBzdGF0aWNfZF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKHN0YXRpY19kdHJlZSwgZXh0cmFfZGJpdHMsIDAsIERfQ09ERVMkMSwgTUFYX0JJVFMkMSk7XG4gIHN0YXRpY19ibF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSwgZXh0cmFfYmxiaXRzLCAwLCBCTF9DT0RFUyQxLCBNQVhfQkxfQklUUyk7XG5cbiAgLy9zdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGluaXRfYmxvY2socykge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovXG4gIGZvciAobiA9IDA7IG4gPCBMX0NPREVTJDE7IG4rKykge1xuICAgIHMuZHluX2x0cmVlW24gKiAyXSAvKi5GcmVxKi8gPSAwO1xuICB9XG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTJDE7IG4rKykge1xuICAgIHMuZHluX2R0cmVlW24gKiAyXSAvKi5GcmVxKi8gPSAwO1xuICB9XG4gIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUyQxOyBuKyspIHtcbiAgICBzLmJsX3RyZWVbbiAqIDJdIC8qLkZyZXEqLyA9IDA7XG4gIH1cblxuICBzLmR5bl9sdHJlZVtFTkRfQkxPQ0sgKiAyXSAvKi5GcmVxKi8gPSAxO1xuICBzLm9wdF9sZW4gPSBzLnN0YXRpY19sZW4gPSAwO1xuICBzLmxhc3RfbGl0ID0gcy5tYXRjaGVzID0gMDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyIGFuZCBhbGlnbiB0aGUgb3V0cHV0IG9uIGEgYnl0ZSBib3VuZGFyeVxuICovXG5mdW5jdGlvbiBiaV93aW5kdXAocykge1xuICBpZiAocy5iaV92YWxpZCA+IDgpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPiAwKSB7XG4gICAgLy9wdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpO1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWY7XG4gIH1cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0c1xuICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlfYmxvY2socywgYnVmLCBsZW4sIGhlYWRlcikge1xuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovXG4vL3Vuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi9cbi8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovXG5cbiAgYmlfd2luZHVwKHMpOyAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovXG5cbiAgaWYgKGhlYWRlcikge1xuICAgIHB1dF9zaG9ydChzLCBsZW4pO1xuICAgIHB1dF9zaG9ydChzLCB+bGVuKTtcbiAgfVxuICAvLyAgd2hpbGUgKGxlbi0tKSB7XG4gIC8vICAgIHB1dF9ieXRlKHMsICpidWYrKyk7XG4gIC8vICB9XG4gIGFycmF5U2V0KHMucGVuZGluZ19idWYsIHMud2luZG93LCBidWYsIGxlbiwgcy5wZW5kaW5nKTtcbiAgcy5wZW5kaW5nICs9IGxlbjtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlblxuICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIHtcbiAgdmFyIF9uMiA9IG4gKiAyO1xuICB2YXIgX20yID0gbSAqIDI7XG4gIHJldHVybiAodHJlZVtfbjJdIC8qLkZyZXEqLyA8IHRyZWVbX20yXSAvKi5GcmVxKi8gfHxcbiAgICAodHJlZVtfbjJdIC8qLkZyZXEqLyA9PT0gdHJlZVtfbTJdIC8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLFxuICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmdcbiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHNcbiAqIHR3byBzb25zKS5cbiAqL1xuZnVuY3Rpb24gcHFkb3duaGVhcChzLCB0cmVlLCBrKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xue1xuICB2YXIgdiA9IHMuaGVhcFtrXTtcbiAgdmFyIGogPSBrIDw8IDE7IC8qIGxlZnQgc29uIG9mIGsgKi9cbiAgd2hpbGUgKGogPD0gcy5oZWFwX2xlbikge1xuICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovXG4gICAgaWYgKGogPCBzLmhlYXBfbGVuICYmXG4gICAgICBzbWFsbGVyKHRyZWUsIHMuaGVhcFtqICsgMV0sIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHtcbiAgICAgIGorKztcbiAgICB9XG4gICAgLyogRXhpdCBpZiB2IGlzIHNtYWxsZXIgdGhhbiBib3RoIHNvbnMgKi9cbiAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBFeGNoYW5nZSB2IHdpdGggdGhlIHNtYWxsZXN0IHNvbiAqL1xuICAgIHMuaGVhcFtrXSA9IHMuaGVhcFtqXTtcbiAgICBrID0gajtcblxuICAgIC8qIEFuZCBjb250aW51ZSBkb3duIHRoZSB0cmVlLCBzZXR0aW5nIGogdG8gdGhlIGxlZnQgc29uIG9mIGsgKi9cbiAgICBqIDw8PSAxO1xuICB9XG4gIHMuaGVhcFtrXSA9IHY7XG59XG5cblxuLy8gaW5saW5lZCBtYW51YWxseVxuLy8gdmFyIFNNQUxMRVNUID0gMTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIHRoZSBibG9jayBkYXRhIGNvbXByZXNzZWQgdXNpbmcgdGhlIGdpdmVuIEh1ZmZtYW4gdHJlZXNcbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NfYmxvY2socywgbHRyZWUsIGR0cmVlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGNvbnN0IGN0X2RhdGEgKmx0cmVlOyAvKiBsaXRlcmFsIHRyZWUgKi9cbi8vICAgIGNvbnN0IGN0X2RhdGEgKmR0cmVlOyAvKiBkaXN0YW5jZSB0cmVlICovXG57XG4gIHZhciBkaXN0OyAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGM7IC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqL1xuICB2YXIgbHggPSAwOyAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG4gIHZhciBjb2RlOyAvKiB0aGUgY29kZSB0byBzZW5kICovXG4gIHZhciBleHRyYTsgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqL1xuXG4gIGlmIChzLmxhc3RfbGl0ICE9PSAwKSB7XG4gICAgZG8ge1xuICAgICAgZGlzdCA9IChzLnBlbmRpbmdfYnVmW3MuZF9idWYgKyBseCAqIDJdIDw8IDgpIHwgKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMiArIDFdKTtcbiAgICAgIGxjID0gcy5wZW5kaW5nX2J1ZltzLmxfYnVmICsgbHhdO1xuICAgICAgbHgrKztcblxuICAgICAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgICAgLy9UcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLFwiICclYycgXCIsIGxjKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgICAgIGNvZGUgPSBfbGVuZ3RoX2NvZGVbbGNdO1xuICAgICAgICBzZW5kX2NvZGUocywgY29kZSArIExJVEVSQUxTJDEgKyAxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7IC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi9cbiAgICAgICAgfVxuICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqL1xuXG4gICAgICAvKiBDaGVjayB0aGF0IHRoZSBvdmVybGF5IGJldHdlZW4gcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmIGlzIG9rOiAqL1xuICAgICAgLy9Bc3NlcnQoKHVJbnQpKHMtPnBlbmRpbmcpIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LFxuICAgICAgLy8gICAgICAgXCJwZW5kaW5nQnVmIG92ZXJmbG93XCIpO1xuXG4gICAgfSB3aGlsZSAobHggPCBzLmxhc3RfbGl0KTtcbiAgfVxuXG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLlxuICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhcbiAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpc1xuICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfdHJlZShzLCBkZXNjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHRyZWVfZGVzYyAqZGVzYzsgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqL1xue1xuICB2YXIgdHJlZSA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07IC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7IC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkUkMTtcblxuICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykge1xuICAgIGlmICh0cmVlW24gKiAyXSAvKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuICogMiArIDFdIC8qLkxlbiovID0gMDtcbiAgICB9XG4gIH1cblxuICAvKiBUaGUgcGt6aXAgZm9ybWF0IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIGRpc3RhbmNlIGNvZGUgZXhpc3RzLFxuICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmVcbiAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3RcbiAgICogdHdvIGNvZGVzIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeS5cbiAgICovXG4gIHdoaWxlIChzLmhlYXBfbGVuIDwgMikge1xuICAgIG5vZGUgPSBzLmhlYXBbKytzLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7XG4gICAgdHJlZVtub2RlICogMl0gLyouRnJlcSovID0gMTtcbiAgICBzLmRlcHRoW25vZGVdID0gMDtcbiAgICBzLm9wdF9sZW4tLTtcblxuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiAtPSBzdHJlZVtub2RlICogMiArIDFdIC8qLkxlbiovIDtcbiAgICB9XG4gICAgLyogbm9kZSBpcyAwIG9yIDEgc28gaXQgZG9lcyBub3QgaGF2ZSBleHRyYSBiaXRzICovXG4gIH1cbiAgZGVzYy5tYXhfY29kZSA9IG1heF9jb2RlO1xuXG4gIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSxcbiAgICogZXN0YWJsaXNoIHN1Yi1oZWFwcyBvZiBpbmNyZWFzaW5nIGxlbmd0aHM6XG4gICAqL1xuICBmb3IgKG4gPSAocy5oZWFwX2xlbiA+PiAxIC8qaW50IC8yKi8gKTsgbiA+PSAxOyBuLS0pIHtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIG4pO1xuICB9XG5cbiAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3b1xuICAgKiBmcmVxdWVudCBub2Rlcy5cbiAgICovXG4gIG5vZGUgPSBlbGVtczsgLyogbmV4dCBpbnRlcm5hbCBub2RlIG9mIHRoZSB0cmVlICovXG4gIGRvIHtcbiAgICAvL3BxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovXG4gICAgLyoqKiBwcXJlbW92ZSAqKiovXG4gICAgbiA9IHMuaGVhcFsxIC8qU01BTExFU1QqLyBdO1xuICAgIHMuaGVhcFsxIC8qU01BTExFU1QqLyBdID0gcy5oZWFwW3MuaGVhcF9sZW4tLV07XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxIC8qU01BTExFU1QqLyApO1xuICAgIC8qKiovXG5cbiAgICBtID0gcy5oZWFwWzEgLypTTUFMTEVTVCovIF07IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovXG5cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi9cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07XG5cbiAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqL1xuICAgIHRyZWVbbm9kZSAqIDJdIC8qLkZyZXEqLyA9IHRyZWVbbiAqIDJdIC8qLkZyZXEqLyArIHRyZWVbbSAqIDJdIC8qLkZyZXEqLyA7XG4gICAgcy5kZXB0aFtub2RlXSA9IChzLmRlcHRoW25dID49IHMuZGVwdGhbbV0gPyBzLmRlcHRoW25dIDogcy5kZXB0aFttXSkgKyAxO1xuICAgIHRyZWVbbiAqIDIgKyAxXSAvKi5EYWQqLyA9IHRyZWVbbSAqIDIgKyAxXSAvKi5EYWQqLyA9IG5vZGU7XG5cbiAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqL1xuICAgIHMuaGVhcFsxIC8qU01BTExFU1QqLyBdID0gbm9kZSsrO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMSAvKlNNQUxMRVNUKi8gKTtcblxuICB9IHdoaWxlIChzLmhlYXBfbGVuID49IDIpO1xuXG4gIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gcy5oZWFwWzEgLypTTUFMTEVTVCovIF07XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vd1xuICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuXG4gICAqL1xuICBnZW5fYml0bGVuKHMsIGRlc2MpO1xuXG4gIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi9cbiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHNjYW5fdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7IC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdIC8qLkxlbiovIDsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7IC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuICB0cmVlWyhtYXhfY29kZSArIDEpICogMiArIDFdIC8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqL1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXSAvKi5MZW4qLyA7XG5cbiAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkge1xuICAgICAgcy5ibF90cmVlW2N1cmxlbiAqIDJdIC8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgcy5ibF90cmVlW2N1cmxlbiAqIDJdIC8qLkZyZXEqLyArKztcbiAgICAgIH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0gLyouRnJlcSovICsrO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8PSAxMCkge1xuICAgICAgcy5ibF90cmVlW1JFUFpfM18xMCAqIDJdIC8qLkZyZXEqLyArKztcblxuICAgIH0gZWxzZSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8xMV8xMzggKiAyXSAvKi5GcmVxKi8gKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgcHJldmxlbiA9IC0xOyAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovXG4gIHZhciBjdXJsZW47IC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi9cblxuICB2YXIgbmV4dGxlbiA9IHRyZWVbMCAqIDIgKyAxXSAvKi5MZW4qLyA7IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgLyogbWF4IHJlcGVhdCBjb3VudCAqL1xuICB2YXIgbWluX2NvdW50ID0gNDsgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIC8qIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gLTE7ICovXG4gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cblxuICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHtcbiAgICBjdXJsZW4gPSBuZXh0bGVuO1xuICAgIG5leHRsZW4gPSB0cmVlWyhuICsgMSkgKiAyICsgMV0gLyouTGVuKi8gO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgIH0gd2hpbGUgKC0tY291bnQgIT09IDApO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHtcbiAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTtcbiAgICAgICAgY291bnQtLTtcbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KGNvdW50ID49IDMgJiYgY291bnQgPD0gNiwgXCIgM182P1wiKTtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMik7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8zXzEwLCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMywgMyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUFpfMTFfMTM4LCBzLmJsX3RyZWUpO1xuICAgICAgc2VuZF9iaXRzKHMsIGNvdW50IC0gMTEsIDcpO1xuICAgIH1cblxuICAgIGNvdW50ID0gMDtcbiAgICBwcmV2bGVuID0gY3VybGVuO1xuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgZm9yIHRoZSBiaXQgbGVuZ3RocyBhbmQgcmV0dXJuIHRoZSBpbmRleCBpblxuICogYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkX2JsX3RyZWUocykge1xuICB2YXIgbWF4X2JsaW5kZXg7IC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyQxIC0gMTsgbWF4X2JsaW5kZXggPj0gMzsgbWF4X2JsaW5kZXgtLSkge1xuICAgIGlmIChzLmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdICogMiArIDFdIC8qLkxlbiovICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi9cbiAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgLyogaW5kZXggaW4gYmxfb3JkZXIgKi9cblxuICAvL0Fzc2VydCAobGNvZGVzID49IDI1NyAmJiBkY29kZXMgPj0gMSAmJiBibGNvZGVzID49IDQsIFwibm90IGVub3VnaCBjb2Rlc1wiKTtcbiAgLy9Bc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsXG4gIC8vICAgICAgICBcInRvbyBtYW55IGNvZGVzXCIpO1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvdW50czogXCIpKTtcbiAgc2VuZF9iaXRzKHMsIGxjb2RlcyAtIDI1NywgNSk7IC8qIG5vdCArMjU1IGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBzZW5kX2JpdHMocywgZGNvZGVzIC0gMSwgNSk7XG4gIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgNCk7IC8qIG5vdCAtMyBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykge1xuICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY29kZSAlMmQgXCIsIGJsX29yZGVyW3JhbmtdKSk7XG4gICAgc2VuZF9iaXRzKHMsIHMuYmxfdHJlZVtibF9vcmRlcltyYW5rXSAqIDIgKyAxXSAvKi5MZW4qLyAsIDMpO1xuICB9XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2x0cmVlLCBsY29kZXMgLSAxKTsgLyogbGl0ZXJhbCB0cmVlICovXG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xuXG4gIHNlbmRfdHJlZShzLCBzLmR5bl9kdHJlZSwgZGNvZGVzIC0gMSk7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IHRyZWU6IHNlbnQgJWxkXCIsIHMtPmJpdHNfc2VudCkpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ2hlY2sgaWYgdGhlIGRhdGEgdHlwZSBpcyBURVhUIG9yIEJJTkFSWSwgdXNpbmcgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06XG4gKiAtIFRFWFQgaWYgdGhlIHR3byBjb25kaXRpb25zIGJlbG93IGFyZSBzYXRpc2ZpZWQ6XG4gKiAgICBhKSBUaGVyZSBhcmUgbm8gbm9uLXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcImJsYWNrIGxpc3RcIiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLlxuICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZVxuICogICAgICAgXCJ3aGl0ZSBsaXN0XCIgKDkge1RBQn0sIDEwIHtMRn0sIDEzIHtDUn0sIDMyLi4yNTUpLlxuICogLSBCSU5BUlkgb3RoZXJ3aXNlLlxuICogLSBUaGUgZm9sbG93aW5nIHBhcnRpYWxseS1wb3J0YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgZm9ybSBhXG4gKiAgIFwiZ3JheSBsaXN0XCIgdGhhdCBpcyBpZ25vcmVkIGluIHRoaXMgZGV0ZWN0aW9uIGFsZ29yaXRobTpcbiAqICAgKDcge0JFTH0sIDgge0JTfSwgMTEge1ZUfSwgMTIge0ZGfSwgMjYge1NVQn0sIDI3IHtFU0N9KS5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBGcmVxIG9mIGR5bl9sdHJlZSBhcmUgc2V0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RfZGF0YV90eXBlKHMpIHtcbiAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzXG4gICAqIHNldCBiaXRzIDAuLjYsIDE0Li4yNSwgYW5kIDI4Li4zMVxuICAgKiAweGYzZmZjMDdmID0gYmluYXJ5IDExMTEwMDExMTExMTExMTExMTAwMDAwMDAxMTExMTExXG4gICAqL1xuICB2YXIgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2Y7XG4gIHZhciBuO1xuXG4gIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoXCJibGFjay1saXN0ZWRcIikgYnl0ZXMuICovXG4gIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj49IDEpIHtcbiAgICBpZiAoKGJsYWNrX21hc2sgJiAxKSAmJiAocy5keW5fbHRyZWVbbiAqIDJdIC8qLkZyZXEqLyAhPT0gMCkpIHtcbiAgICAgIHJldHVybiBaX0JJTkFSWSQxO1xuICAgIH1cbiAgfVxuXG4gIC8qIENoZWNrIGZvciB0ZXh0dWFsIChcIndoaXRlLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgaWYgKHMuZHluX2x0cmVlWzkgKiAyXSAvKi5GcmVxKi8gIT09IDAgfHwgcy5keW5fbHRyZWVbMTAgKiAyXSAvKi5GcmVxKi8gIT09IDAgfHxcbiAgICBzLmR5bl9sdHJlZVsxMyAqIDJdIC8qLkZyZXEqLyAhPT0gMCkge1xuICAgIHJldHVybiBaX1RFWFQkMTtcbiAgfVxuICBmb3IgKG4gPSAzMjsgbiA8IExJVEVSQUxTJDE7IG4rKykge1xuICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0gLyouRnJlcSovICE9PSAwKSB7XG4gICAgICByZXR1cm4gWl9URVhUJDE7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlcmUgYXJlIG5vIFwiYmxhY2stbGlzdGVkXCIgb3IgXCJ3aGl0ZS1saXN0ZWRcIiBieXRlczpcbiAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKFwiZ3JheS1saXN0ZWRcIikgYnl0ZXMgb25seS5cbiAgICovXG4gIHJldHVybiBaX0JJTkFSWSQxO1xufVxuXG5cbnZhciBzdGF0aWNfaW5pdF9kb25lID0gZmFsc2U7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBfdHJfaW5pdChzKSB7XG5cbiAgaWYgKCFzdGF0aWNfaW5pdF9kb25lKSB7XG4gICAgdHJfc3RhdGljX2luaXQoKTtcbiAgICBzdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbiAgfVxuXG4gIHMubF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLCBzdGF0aWNfbF9kZXNjKTtcbiAgcy5kX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5keW5fZHRyZWUsIHN0YXRpY19kX2Rlc2MpO1xuICBzLmJsX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5ibF90cmVlLCBzdGF0aWNfYmxfZGVzYyk7XG5cbiAgcy5iaV9idWYgPSAwO1xuICBzLmJpX3ZhbGlkID0gMDtcblxuICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi9cbiAgaW5pdF9ibG9jayhzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBzdG9yZWQgYmxvY2tcbiAqL1xuZnVuY3Rpb24gX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2sgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0sgPDwgMSkgKyAobGFzdCA/IDEgOiAwKSwgMyk7IC8qIHNlbmQgYmxvY2sgdHlwZSAqL1xuICBjb3B5X2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgdHJ1ZSk7IC8qIHdpdGggaGVhZGVyICovXG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLlxuICogVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIF90cl9hbGlnbihzKSB7XG4gIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVMgPDwgMSwgMyk7XG4gIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7XG4gIGJpX2ZsdXNoKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nIGZvciB0aGUgY3VycmVudCBibG9jazogZHluYW1pYyB0cmVlcywgc3RhdGljXG4gKiB0cmVlcyBvciBzdG9yZSwgYW5kIG91dHB1dCB0aGUgZW5jb2RlZCBibG9jayB0byB0aGUgemlwIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIF90cl9mbHVzaF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpXG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgKmJ1ZjsgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICB2YXIgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovXG4gIHZhciBtYXhfYmxpbmRleCA9IDA7IC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOJDIpIHtcbiAgICAgIHMuc3RybS5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpO1xuICAgIH1cblxuICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi9cbiAgICBidWlsZF90cmVlKHMsIHMubF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuXG4gICAgYnVpbGRfdHJlZShzLCBzLmRfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG4gICAgLyogQXQgdGhpcyBwb2ludCwgb3B0X2xlbiBhbmQgc3RhdGljX2xlbiBhcmUgdGhlIHRvdGFsIGJpdCBsZW5ndGhzIG9mXG4gICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKi9cblxuICAgIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWUgZm9yIHRoZSBhYm92ZSB0d28gdHJlZXMsIGFuZCBnZXQgdGhlIGluZGV4XG4gICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuXG4gICAgICovXG4gICAgbWF4X2JsaW5kZXggPSBidWlsZF9ibF90cmVlKHMpO1xuXG4gICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqL1xuICAgIG9wdF9sZW5iID0gKHMub3B0X2xlbiArIDMgKyA3KSA+Pj4gMztcbiAgICBzdGF0aWNfbGVuYiA9IChzLnN0YXRpY19sZW4gKyAzICsgNykgPj4+IDM7XG5cbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSBcIixcbiAgICAvLyAgICAgICAgb3B0X2xlbmIsIHMtPm9wdF9sZW4sIHN0YXRpY19sZW5iLCBzLT5zdGF0aWNfbGVuLCBzdG9yZWRfbGVuLFxuICAgIC8vICAgICAgICBzLT5sYXN0X2xpdCkpO1xuXG4gICAgaWYgKHN0YXRpY19sZW5iIDw9IG9wdF9sZW5iKSB7XG4gICAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iO1xuICAgIH1cblxuICB9IGVsc2Uge1xuICAgIC8vIEFzc2VydChidWYgIT0gKGNoYXIqKTAsIFwibG9zdCBidWZcIik7XG4gICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqL1xuICB9XG5cbiAgaWYgKChzdG9yZWRfbGVuICsgNCA8PSBvcHRfbGVuYikgJiYgKGJ1ZiAhPT0gLTEpKSB7XG4gICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqL1xuXG4gICAgLyogVGhlIHRlc3QgYnVmICE9IE5VTEwgaXMgb25seSBuZWNlc3NhcnkgaWYgTElUX0JVRlNJWkUgPiBXU0laRS5cbiAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlXG4gICAgICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuXG4gICAgICogc3VjY2Vzc2Z1bC4gSWYgTElUX0JVRlNJWkUgPD0gV1NJWkUsIGl0IGlzIG5ldmVyIHRvbyBsYXRlIHRvXG4gICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay5cbiAgICAgKi9cbiAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdCk7XG5cbiAgfSBlbHNlIGlmIChzLnN0cmF0ZWd5ID09PSBaX0ZJWEVEJDIgfHwgc3RhdGljX2xlbmIgPT09IG9wdF9sZW5iKSB7XG5cbiAgICBzZW5kX2JpdHMocywgKFNUQVRJQ19UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzdGF0aWNfbHRyZWUsIHN0YXRpY19kdHJlZSk7XG5cbiAgfSBlbHNlIHtcbiAgICBzZW5kX2JpdHMocywgKERZTl9UUkVFUyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTtcbiAgICBzZW5kX2FsbF90cmVlcyhzLCBzLmxfZGVzYy5tYXhfY29kZSArIDEsIHMuZF9kZXNjLm1heF9jb2RlICsgMSwgbWF4X2JsaW5kZXggKyAxKTtcbiAgICBjb21wcmVzc19ibG9jayhzLCBzLmR5bl9sdHJlZSwgcy5keW5fZHRyZWUpO1xuICB9XG4gIC8vIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCBcImJhZCBjb21wcmVzc2VkIHNpemVcIik7XG4gIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CXG4gICAqIGFuZCB1TG9uZyBpbXBsZW1lbnRlZCBvbiAzMiBiaXRzLlxuICAgKi9cbiAgaW5pdF9ibG9jayhzKTtcblxuICBpZiAobGFzdCkge1xuICAgIGJpX3dpbmR1cChzKTtcbiAgfVxuICAvLyBUcmFjZXYoKHN0ZGVycixcIlxcbmNvbXBybGVuICVsdSglbHUpIFwiLCBzLT5jb21wcmVzc2VkX2xlbj4+MyxcbiAgLy8gICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNypsYXN0KSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2F2ZSB0aGUgbWF0Y2ggaW5mbyBhbmQgdGFsbHkgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFJldHVybiB0cnVlIGlmXG4gKiB0aGUgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIF90cl90YWxseShzLCBkaXN0LCBsYylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICB1bnNpZ25lZCBkaXN0OyAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi9cbi8vICAgIHVuc2lnbmVkIGxjOyAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqL1xue1xuICAvL3ZhciBvdXRfbGVuZ3RoLCBpbl9sZW5ndGgsIGRjb2RlO1xuXG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyXSA9IChkaXN0ID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjtcblxuICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMHhmZjtcbiAgcy5sYXN0X2xpdCsrO1xuXG4gIGlmIChkaXN0ID09PSAwKSB7XG4gICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovXG4gICAgcy5keW5fbHRyZWVbbGMgKiAyXSAvKi5GcmVxKi8gKys7XG4gIH0gZWxzZSB7XG4gICAgcy5tYXRjaGVzKys7XG4gICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqL1xuICAgIGRpc3QtLTsgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgIC8vQXNzZXJ0KCh1c2gpZGlzdCA8ICh1c2gpTUFYX0RJU1QocykgJiZcbiAgICAvLyAgICAgICAodXNoKWxjIDw9ICh1c2gpKE1BWF9NQVRDSC1NSU5fTUFUQ0gpICYmXG4gICAgLy8gICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICBcIl90cl90YWxseTogYmFkIG1hdGNoXCIpO1xuXG4gICAgcy5keW5fbHRyZWVbKF9sZW5ndGhfY29kZVtsY10gKyBMSVRFUkFMUyQxICsgMSkgKiAyXSAvKi5GcmVxKi8gKys7XG4gICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0gLyouRnJlcSovICsrO1xuICB9XG5cbiAgLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbiAgLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuXG4gIC8vI2lmZGVmIFRSVU5DQVRFX0JMT0NLXG4gIC8vICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi9cbiAgLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHtcbiAgLy8gICAgLyogQ29tcHV0ZSBhbiB1cHBlciBib3VuZCBmb3IgdGhlIGNvbXByZXNzZWQgbGVuZ3RoICovXG4gIC8vICAgIG91dF9sZW5ndGggPSBzLmxhc3RfbGl0Kjg7XG4gIC8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuICAvL1xuICAvLyAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7XG4gIC8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTtcbiAgLy8gICAgfVxuICAvLyAgICBvdXRfbGVuZ3RoID4+Pj0gMztcbiAgLy8gICAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSBcIixcbiAgLy8gICAgLy8gICAgICAgcy0+bGFzdF9saXQsIGluX2xlbmd0aCwgb3V0X2xlbmd0aCxcbiAgLy8gICAgLy8gICAgICAgMTAwTCAtIG91dF9sZW5ndGgqMTAwTC9pbl9sZW5ndGgpKTtcbiAgLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykge1xuICAvLyAgICAgIHJldHVybiB0cnVlO1xuICAvLyAgICB9XG4gIC8vICB9XG4gIC8vI2VuZGlmXG5cbiAgcmV0dXJuIChzLmxhc3RfbGl0ID09PSBzLmxpdF9idWZzaXplIC0gMSk7XG4gIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0S1xuICAgKiBvbiAxNiBiaXQgbWFjaGluZXMgYW5kIGJlY2F1c2Ugc3RvcmVkIGJsb2NrcyBhcmUgcmVzdHJpY3RlZCB0b1xuICAgKiA2NEstMSBieXRlcy5cbiAgICovXG59XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGRvZXNuJ3Qgd29ydGggdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbmEgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbnZhciBaX05PX0ZMVVNIJDEgPSAwO1xudmFyIFpfUEFSVElBTF9GTFVTSCQxID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIJDEgPSAzO1xudmFyIFpfRklOSVNIJDIgPSA0O1xudmFyIFpfQkxPQ0skMiA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0skMiA9IDA7XG52YXIgWl9TVFJFQU1fRU5EJDIgPSAxO1xuLy92YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SJDIgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IkMiA9IC0zO1xuLy92YXIgWl9NRU1fRVJST1IgICAgID0gLTQ7XG52YXIgWl9CVUZfRVJST1IkMiA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OJDEgPSAtMTtcblxuXG52YXIgWl9GSUxURVJFRCQxID0gMTtcbnZhciBaX0hVRkZNQU5fT05MWSQxID0gMjtcbnZhciBaX1JMRSQxID0gMztcbnZhciBaX0ZJWEVEJDEgPSA0O1xuXG4vKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG4vL3ZhciBaX0JJTkFSWSAgICAgICAgICAgICAgPSAwO1xuLy92YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgICA9IDE7IC8vID0gWl9URVhUXG52YXIgWl9VTktOT1dOJDEgPSAyO1xuXG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQkMiA9IDg7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyIE1BWF9NRU1fTEVWRUwgPSA5O1xuXG5cbnZhciBMRU5HVEhfQ09ERVMgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTID0gMjU2O1xuLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovXG52YXIgTF9DT0RFUyA9IExJVEVSQUxTICsgMSArIExFTkdUSF9DT0RFUztcbi8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIERfQ09ERVMgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xudmFyIEJMX0NPREVTID0gMTk7XG4vKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi9cbnZhciBIRUFQX1NJWkUgPSAyICogTF9DT0RFUyArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xudmFyIE1BWF9CSVRTID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgPSAxOyAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi9cbnZhciBCU19CTE9DS19ET05FID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoO1xuICB3aGlsZSAoLS1sZW4gPj0gMCkge1xuICAgIGJ1ZltsZW5dID0gMDtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFycmF5U2V0KHN0cm0ub3V0cHV0LCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmdfb3V0LCBsZW4sIHN0cm0ubmV4dF9vdXQpO1xuICBzdHJtLm5leHRfb3V0ICs9IGxlbjtcbiAgcy5wZW5kaW5nX291dCArPSBsZW47XG4gIHN0cm0udG90YWxfb3V0ICs9IGxlbjtcbiAgc3RybS5hdmFpbF9vdXQgLT0gbGVuO1xuICBzLnBlbmRpbmcgLT0gbGVuO1xuICBpZiAocy5wZW5kaW5nID09PSAwKSB7XG4gICAgcy5wZW5kaW5nX291dCA9IDA7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBmbHVzaF9ibG9ja19vbmx5KHMsIGxhc3QpIHtcbiAgX3RyX2ZsdXNoX2Jsb2NrKHMsIChzLmJsb2NrX3N0YXJ0ID49IDAgPyBzLmJsb2NrX3N0YXJ0IDogLTEpLCBzLnN0cnN0YXJ0IC0gcy5ibG9ja19zdGFydCwgbGFzdCk7XG4gIHMuYmxvY2tfc3RhcnQgPSBzLnN0cnN0YXJ0O1xuICBmbHVzaF9wZW5kaW5nKHMuc3RybSk7XG59XG5cblxuZnVuY3Rpb24gcHV0X2J5dGUocywgYikge1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGI7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUHV0IGEgc2hvcnQgaW4gdGhlIHBlbmRpbmcgYnVmZmVyLiBUaGUgMTYtYml0IHZhbHVlIGlzIHB1dCBpbiBNU0Igb3JkZXIuXG4gKiBJTiBhc3NlcnRpb246IHRoZSBzdHJlYW0gc3RhdGUgaXMgY29ycmVjdCBhbmQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW5cbiAqIHBlbmRpbmdfYnVmLlxuICovXG5mdW5jdGlvbiBwdXRTaG9ydE1TQihzLCBiKSB7XG4gIC8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7XG4gIC8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkge1xuICAgIGxlbiA9IHNpemU7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgc3RybS5hdmFpbF9pbiAtPSBsZW47XG5cbiAgLy8gem1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7XG4gIGFycmF5U2V0KGJ1Ziwgc3RybS5pbnB1dCwgc3RybS5uZXh0X2luLCBsZW4sIHN0YXJ0KTtcbiAgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMSkge1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH0gZWxzZSBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAyKSB7XG4gICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIGJ1ZiwgbGVuLCBzdGFydCk7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gKz0gbGVuO1xuICBzdHJtLnRvdGFsX2luICs9IGxlbjtcblxuICByZXR1cm4gbGVuO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kXG4gKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsXG4gKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzXG4gKiBnYXJiYWdlLlxuICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudFxuICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMVxuICogT1VUIGFzc2VydGlvbjogdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QgZ3JlYXRlciB0aGFuIHMtPmxvb2thaGVhZC5cbiAqL1xuZnVuY3Rpb24gbG9uZ2VzdF9tYXRjaChzLCBjdXJfbWF0Y2gpIHtcbiAgdmFyIGNoYWluX2xlbmd0aCA9IHMubWF4X2NoYWluX2xlbmd0aDsgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAvKiBtYXRjaGVkIHN0cmluZyAqL1xuICB2YXIgbGVuOyAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAvKiBiZXN0IG1hdGNoIGxlbmd0aCBzbyBmYXIgKi9cbiAgdmFyIG5pY2VfbWF0Y2ggPSBzLm5pY2VfbWF0Y2g7IC8qIHN0b3AgaWYgbWF0Y2ggbG9uZyBlbm91Z2ggKi9cbiAgdmFyIGxpbWl0ID0gKHMuc3Ryc3RhcnQgPiAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkgP1xuICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAgLypOSUwqLyA7XG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdzsgLy8gc2hvcnRjdXRcblxuICB2YXIgd21hc2sgPSBzLndfbWFzaztcbiAgdmFyIHByZXYgPSBzLnByZXY7XG5cbiAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSxcbiAgICogd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZyBvZiB3aW5kb3cgaW5kZXggMC5cbiAgICovXG5cbiAgdmFyIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gIHZhciBzY2FuX2VuZDEgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG5cbiAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuXG4gICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICAvLyBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgXCJDb2RlIHRvbyBjbGV2ZXJcIik7XG5cbiAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi9cbiAgaWYgKHMucHJldl9sZW5ndGggPj0gcy5nb29kX21hdGNoKSB7XG4gICAgY2hhaW5fbGVuZ3RoID4+PSAyO1xuICB9XG4gIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogdG8gbWFrZSBkZWZsYXRlIGRldGVybWluaXN0aWMuXG4gICAqL1xuICBpZiAobmljZV9tYXRjaCA+IHMubG9va2FoZWFkKSB7XG4gICAgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkO1xuICB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICE9PSBzY2FuX2VuZCB8fFxuICAgICAgX3dpblttYXRjaCArIGJlc3RfbGVuIC0gMV0gIT09IHNjYW5fZW5kMSB8fFxuICAgICAgX3dpblttYXRjaF0gIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgIF93aW5bKyttYXRjaF0gIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgIHNjYW4gPCBzdHJlbmQpO1xuXG4gICAgLy8gQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuXG4gICAgbGVuID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7XG5cbiAgICBpZiAobGVuID4gYmVzdF9sZW4pIHtcbiAgICAgIHMubWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7XG4gICAgICBiZXN0X2xlbiA9IGxlbjtcbiAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHNjYW5fZW5kMSA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gICAgICBzY2FuX2VuZCA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcbiAgICB9XG4gIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdCAmJiAtLWNoYWluX2xlbmd0aCAhPT0gMCk7XG5cbiAgaWYgKGJlc3RfbGVuIDw9IHMubG9va2FoZWFkKSB7XG4gICAgcmV0dXJuIGJlc3RfbGVuO1xuICB9XG4gIHJldHVybiBzLmxvb2thaGVhZDtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZpbGwgdGhlIHdpbmRvdyB3aGVuIHRoZSBsb29rYWhlYWQgYmVjb21lcyBpbnN1ZmZpY2llbnQuXG4gKiBVcGRhdGVzIHN0cnN0YXJ0IGFuZCBsb29rYWhlYWQuXG4gKlxuICogSU4gYXNzZXJ0aW9uOiBsb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEXG4gKiBPVVQgYXNzZXJ0aW9uczogc3Ryc3RhcnQgPD0gd2luZG93X3NpemUtTUlOX0xPT0tBSEVBRFxuICogICAgQXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4gcmVhZCwgb3IgYXZhaWxfaW4gPT0gMDsgcmVhZHMgYXJlXG4gKiAgICBwZXJmb3JtZWQgZm9yIGF0IGxlYXN0IHR3byBieXRlcyAocmVxdWlyZWQgZm9yIHRoZSB6aXAgdHJhbnNsYXRlX2VvbFxuICogICAgb3B0aW9uIC0tIG5vdCBzdXBwb3J0ZWQgaGVyZSkuXG4gKi9cbmZ1bmN0aW9uIGZpbGxfd2luZG93KHMpIHtcbiAgdmFyIF93X3NpemUgPSBzLndfc2l6ZTtcbiAgdmFyIHAsIG4sIG0sIG1vcmUsIHN0cjtcblxuICAvL0Fzc2VydChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFELCBcImFscmVhZHkgZW5vdWdoIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgbW9yZSA9IHMud2luZG93X3NpemUgLSBzLmxvb2thaGVhZCAtIHMuc3Ryc3RhcnQ7XG5cbiAgICAvLyBKUyBpbnRzIGhhdmUgMzIgYml0LCBibG9jayBiZWxvdyBub3QgbmVlZGVkXG4gICAgLyogRGVhbCB3aXRoICFAIyQlIDY0SyBsaW1pdDogKi9cbiAgICAvL2lmIChzaXplb2YoaW50KSA8PSAyKSB7XG4gICAgLy8gICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7XG4gICAgLy8gICAgICAgIG1vcmUgPSB3c2l6ZTtcbiAgICAvL1xuICAgIC8vICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHtcbiAgICAvLyAgICAgICAgLyogVmVyeSB1bmxpa2VseSwgYnV0IHBvc3NpYmxlIG9uIDE2IGJpdCBtYWNoaW5lIGlmXG4gICAgLy8gICAgICAgICAqIHN0cnN0YXJ0ID09IDAgJiYgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgYSBieXRlIGF0IHRpbWUpXG4gICAgLy8gICAgICAgICAqL1xuICAgIC8vICAgICAgICBtb3JlLS07XG4gICAgLy8gICAgfVxuICAgIC8vfVxuXG5cbiAgICAvKiBJZiB0aGUgd2luZG93IGlzIGFsbW9zdCBmdWxsIGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLFxuICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgPj0gX3dfc2l6ZSArIChfd19zaXplIC0gTUlOX0xPT0tBSEVBRCkpIHtcblxuICAgICAgYXJyYXlTZXQocy53aW5kb3csIHMud2luZG93LCBfd19zaXplLCBfd19zaXplLCAwKTtcbiAgICAgIHMubWF0Y2hfc3RhcnQgLT0gX3dfc2l6ZTtcbiAgICAgIHMuc3Ryc3RhcnQgLT0gX3dfc2l6ZTtcbiAgICAgIC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovXG4gICAgICBzLmJsb2NrX3N0YXJ0IC09IF93X3NpemU7XG5cbiAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlc1xuICAgICAgIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZSkuIFdlIHNsaWRlIGV2ZW4gd2hlbiBsZXZlbCA9PSAwXG4gICAgICAgdG8ga2VlcCB0aGUgaGFzaCB0YWJsZSBjb25zaXN0ZW50IGlmIHdlIHN3aXRjaCBiYWNrIHRvIGxldmVsID4gMFxuICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZlxuICAgICAgIHpsaWIsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBwYXRob2xvZ2ljYWwgY2FzZS4pXG4gICAgICAgKi9cblxuICAgICAgbiA9IHMuaGFzaF9zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLmhlYWRbLS1wXTtcbiAgICAgICAgcy5oZWFkW3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBuID0gX3dfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5wcmV2Wy0tcF07XG4gICAgICAgIHMucHJldltwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgICAvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dFxuICAgICAgICAgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLlxuICAgICAgICAgKi9cbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG1vcmUgKz0gX3dfc2l6ZTtcbiAgICB9XG4gICAgaWYgKHMuc3RybS5hdmFpbF9pbiA9PT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyogSWYgdGhlcmUgd2FzIG5vIHNsaWRpbmc6XG4gICAgICogICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiZcbiAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnRcbiAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gKE1JTl9MT09LQUhFQUQtMSArIFdTSVpFICsgTUFYX0RJU1QtMSlcbiAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gMipXU0laRSArIDJcbiAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSxcbiAgICAgKiAgIHdpbmRvd19zaXplID09IGlucHV0X3NpemUgKyBNSU5fTE9PS0FIRUFEICAmJlxuICAgICAqICAgc3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgPD0gaW5wdXRfc2l6ZSA9PiBtb3JlID49IE1JTl9MT09LQUhFQUQuXG4gICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi5cbiAgICAgKiBJZiB0aGVyZSB3YXMgc2xpZGluZywgbW9yZSA+PSBXU0laRS4gU28gaW4gYWxsIGNhc2VzLCBtb3JlID49IDIuXG4gICAgICovXG4gICAgLy9Bc3NlcnQobW9yZSA+PSAyLCBcIm1vcmUgPCAyXCIpO1xuICAgIG4gPSByZWFkX2J1ZihzLnN0cm0sIHMud2luZG93LCBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQsIG1vcmUpO1xuICAgIHMubG9va2FoZWFkICs9IG47XG5cbiAgICAvKiBJbml0aWFsaXplIHRoZSBoYXNoIHZhbHVlIG5vdyB0aGF0IHdlIGhhdmUgc29tZSBpbnB1dDogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIHN0ciA9IHMuc3Ryc3RhcnQgLSBzLmluc2VydDtcbiAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzdHJdO1xuXG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIDFdKTsgKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgLy8jaWYgTUlOX01BVENIICE9IDNcbiAgICAgIC8vICAgICAgICBDYWxsIHVwZGF0ZV9oYXNoKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuICAgICAgLy8jZW5kaWZcbiAgICAgIHdoaWxlIChzLmluc2VydCkge1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3N0ciArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4gICAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgICAgc3RyKys7XG4gICAgICAgIHMuaW5zZXJ0LS07XG4gICAgICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0IDwgTUlOX01BVENIKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyogSWYgdGhlIHdob2xlIGlucHV0IGhhcyBsZXNzIHRoYW4gTUlOX01BVENIIGJ5dGVzLCBpbnNfaCBpcyBnYXJiYWdlLFxuICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC5cbiAgICAgKi9cblxuICB9IHdoaWxlIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy5zdHJtLmF2YWlsX2luICE9PSAwKTtcblxuICAvKiBJZiB0aGUgV0lOX0lOSVQgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBkYXRhIGhhdmUgbmV2ZXIgYmVlblxuICAgKiB3cml0dGVuLCB0aGVuIHplcm8gdGhvc2UgYnl0ZXMgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHJlcG9ydHMgb2ZcbiAgICogdGhlIHVzZSBvZiB1bmluaXRpYWxpemVkIChvciB1bmluaXRpYWxpc2VkIGFzIEp1bGlhbiB3cml0ZXMpIGJ5dGVzIGJ5XG4gICAqIHRoZSBsb25nZXN0IG1hdGNoIHJvdXRpbmVzLiAgVXBkYXRlIHRoZSBoaWdoIHdhdGVyIG1hcmsgZm9yIHRoZSBuZXh0XG4gICAqIHRpbWUgdGhyb3VnaCBoZXJlLiAgV0lOX0lOSVQgaXMgc2V0IHRvIE1BWF9NQVRDSCBzaW5jZSB0aGUgbG9uZ2VzdCBtYXRjaFxuICAgKiByb3V0aW5lcyBhbGxvdyBzY2FubmluZyB0byBzdHJzdGFydCArIE1BWF9NQVRDSCwgaWdub3JpbmcgbG9va2FoZWFkLlxuICAgKi9cbiAgLy8gIGlmIChzLmhpZ2hfd2F0ZXIgPCBzLndpbmRvd19zaXplKSB7XG4gIC8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuICAvLyAgICB2YXIgaW5pdCA9IDA7XG4gIC8vXG4gIC8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4gIC8vICAgICAgLyogUHJldmlvdXMgaGlnaCB3YXRlciBtYXJrIGJlbG93IGN1cnJlbnQgZGF0YSAtLSB6ZXJvIFdJTl9JTklUXG4gIC8vICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4gIC8vICAgICAgICovXG4gIC8vICAgICAgaW5pdCA9IHMud2luZG93X3NpemUgLSBjdXJyO1xuICAvLyAgICAgIGlmIChpbml0ID4gV0lOX0lOSVQpXG4gIC8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4gIC8vICAgICAgem1lbXplcm8ocy0+d2luZG93ICsgY3VyciwgKHVuc2lnbmVkKWluaXQpO1xuICAvLyAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDtcbiAgLy8gICAgfVxuICAvLyAgICBlbHNlIGlmIChzLT5oaWdoX3dhdGVyIDwgKHVsZyljdXJyICsgV0lOX0lOSVQpIHtcbiAgLy8gICAgICAvKiBIaWdoIHdhdGVyIG1hcmsgYXQgb3IgYWJvdmUgY3VycmVudCBkYXRhLCBidXQgYmVsb3cgY3VycmVudCBkYXRhXG4gIC8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbiAgLy8gICAgICAgKiB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbiAgLy8gICAgICAgKi9cbiAgLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuICAvLyAgICAgIGlmIChpbml0ID4gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyKVxuICAvLyAgICAgICAgaW5pdCA9IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcjtcbiAgLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4gIC8vICAgICAgcy0+aGlnaF93YXRlciArPSBpbml0O1xuICAvLyAgICB9XG4gIC8vICB9XG4gIC8vXG4gIC8vICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsXG4gIC8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbiAgICAgIC8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbiAgICAgIC8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuICAgICAgLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbiAgICAgIC8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgfVxuICAgIC8vQXNzZXJ0KHMtPmJsb2NrX3N0YXJ0ID49IDBMLCBcImJsb2NrIGdvbmVcIik7XG4gICAgLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIJDIpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuXG4gIGlmIChzLnN0cnN0YXJ0ID4gcy5ibG9ja19zdGFydCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuXG4gIHJldHVybiBCU19ORUVEX01PUkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudFxuICogYmxvY2sgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHNcbiAqIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydFxuICogbWF0Y2hlcy4gSXQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZmFzdCBjb21wcmVzc2lvbiBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBkZWZsYXRlX2Zhc3QocywgZmx1c2gpIHtcbiAgdmFyIGhhc2hfaGVhZDsgLyogaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZVxuICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOlxuICAgICAqL1xuICAgIGhhc2hfaGVhZCA9IDAgLypOSUwqLyA7XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSFxuICAgICAqL1xuICAgIGlmIChoYXNoX2hlYWQgIT09IDAgLypOSUwqLyAmJiAoKHMuc3Ryc3RhcnQgLSBoYXNoX2hlYWQpIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSkge1xuICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmdcbiAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaFxuICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2gocywgaGFzaF9oZWFkKTtcbiAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovXG4gICAgfVxuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vIGNoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMubWF0Y2hfc3RhcnQsIHMubWF0Y2hfbGVuZ3RoKTsgLy8gZm9yIGRlYnVnIG9ubHlcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG5cbiAgICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGhcbiAgICAgICAqIGlzIG5vdCB0b28gbGFyZ2UuIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uXG4gICAgICAgKi9cbiAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA8PSBzLm1heF9sYXp5X21hdGNoIC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgICAgIHMuaW5zX2ggPSBzLndpbmRvd1tzLnN0cnN0YXJ0XTtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy5pbnNfaCwgcy53aW5kb3dbcy5zdHJzdGFydCsxXSk7ICovXG4gICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICAvLyNpZiBNSU5fTUFUQ0ggIT0gM1xuICAgICAgICAvLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuICAgICAgICAvLyNlbmRpZlxuICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdFxuICAgICAgICAgKiBtYXR0ZXIgc2luY2UgaXQgd2lsbCBiZSByZWNvbXB1dGVkIGF0IG5leHQgZGVmbGF0ZSBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuXG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgIH1cbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9ICgocy5zdHJzdGFydCA8IChNSU5fTUFUQ0ggLSAxKSkgPyBzLnN0cnN0YXJ0IDogTUlOX01BVENIIC0gMSk7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenlcbiAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXNcbiAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc2xvdyhzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi9cbiAgdmFyIGJmbHVzaDsgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIJDEpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMCAvKk5JTCovIDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqL1xuICAgIHMucHJldl9sZW5ndGggPSBzLm1hdGNoX2xlbmd0aDtcbiAgICBzLnByZXZfbWF0Y2ggPSBzLm1hdGNoX3N0YXJ0O1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcblxuICAgIGlmIChoYXNoX2hlYWQgIT09IDAgLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgcy5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSAvKk1BWF9ESVNUKHMpKi8gKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfRklMVEVSRUQkMSB8fCAocy5tYXRjaF9sZW5ndGggPT09IE1JTl9NQVRDSCAmJiBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCA+IDQwOTYgLypUT09fRkFSKi8gKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIJDIpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuXG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfUkxFLCBzaW1wbHkgbG9vayBmb3IgcnVucyBvZiBieXRlcywgZ2VuZXJhdGUgbWF0Y2hlcyBvbmx5IG9mIGRpc3RhbmNlXG4gKiBvbmUuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLiAgKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2ZcbiAqIGRlZmxhdGUgc3dpdGNoZXMgYXdheSBmcm9tIFpfUkxFLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9ybGUocywgZmx1c2gpIHtcbiAgdmFyIGJmbHVzaDsgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAvKiBieXRlIGF0IGRpc3RhbmNlIG9uZSB0byBtYXRjaCAqL1xuICB2YXIgc2Nhbiwgc3RyZW5kOyAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIJDEpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+IHMubG9va2FoZWFkKSB7XG4gICAgICAgICAgcy5tYXRjaF9sZW5ndGggPSBzLmxvb2thaGVhZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVJbnQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcbiAgICB9XG5cbiAgICAvKiBFbWl0IG1hdGNoIGlmIGhhdmUgcnVuIG9mIE1JTl9NQVRDSCBvciBsb25nZXIsIGVsc2UgZW1pdCBsaXRlcmFsICovXG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLnN0cnN0YXJ0IC0gMSwgcy5tYXRjaF9sZW5ndGgpO1xuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydF0pO1xuXG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgIH1cbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX0hVRkZNQU5fT05MWSwgZG8gbm90IGxvb2sgZm9yIG1hdGNoZXMuICBEbyBub3QgbWFpbnRhaW4gYSBoYXNoIHRhYmxlLlxuICogKEl0IHdpbGwgYmUgcmVnZW5lcmF0ZWQgaWYgdGhpcyBydW4gb2YgZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gSHVmZm1hbi4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfaHVmZihzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpdGVyYWwgdG8gd3JpdGUuICovXG4gICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfTk9fRkxVU0gkMSkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogT3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgIGJmbHVzaCA9IF90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG4gICAgcy5sb29rYWhlYWQtLTtcbiAgICBzLnN0cnN0YXJ0Kys7XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIJDIpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgLyogMSBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqL1xuICBuZXcgQ29uZmlnKDQsIDUsIDE2LCA4LCBkZWZsYXRlX2Zhc3QpLCAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgLyogNSAqL1xuICBuZXcgQ29uZmlnKDgsIDE2LCAxMjgsIDEyOCwgZGVmbGF0ZV9zbG93KSwgLyogNiAqL1xuICBuZXcgQ29uZmlnKDgsIDMyLCAxMjgsIDI1NiwgZGVmbGF0ZV9zbG93KSwgLyogNyAqL1xuICBuZXcgQ29uZmlnKDMyLCAxMjgsIDI1OCwgMTAyNCwgZGVmbGF0ZV9zbG93KSwgLyogOCAqL1xuICBuZXcgQ29uZmlnKDMyLCAyNTgsIDI1OCwgNDA5NiwgZGVmbGF0ZV9zbG93KSAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7IC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovXG4gIHRoaXMuc3RhdHVzID0gMDsgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqL1xuICB0aGlzLnBlbmRpbmdfYnVmID0gbnVsbDsgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgLyogc2l6ZSBvZiBwZW5kaW5nX2J1ZiAqL1xuICB0aGlzLnBlbmRpbmdfb3V0ID0gMDsgLyogbmV4dCBwZW5kaW5nIGJ5dGUgdG8gb3V0cHV0IHRvIHRoZSBzdHJlYW0gKi9cbiAgdGhpcy5wZW5kaW5nID0gMDsgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovXG4gIHRoaXMud3JhcCA9IDA7IC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAvKiBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiB0byB3cml0ZSAqL1xuICB0aGlzLmd6aW5kZXggPSAwOyAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQkMjsgLyogY2FuIG9ubHkgYmUgREVGTEFURUQgKi9cbiAgdGhpcy5sYXN0X2ZsdXNoID0gLTE7IC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7IC8qIExaNzcgd2luZG93IHNpemUgKDMySyBieSBkZWZhdWx0KSAqL1xuICB0aGlzLndfYml0cyA9IDA7IC8qIGxvZzIod19zaXplKSAgKDguLjE2KSAqL1xuICB0aGlzLndfbWFzayA9IDA7IC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqL1xuXG4gIHRoaXMuaW5zX2ggPSAwOyAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqL1xuICB0aGlzLmhhc2hfc2l6ZSA9IDA7IC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBoYXNoIHRhYmxlICovXG4gIHRoaXMuaGFzaF9iaXRzID0gMDsgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgLyogaGFzaF9zaXplLTEgKi9cblxuICB0aGlzLmhhc2hfc2hpZnQgPSAwO1xuICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dFxuICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3RcbiAgICogYnl0ZSBubyBsb25nZXIgdGFrZXMgcGFydCBpbiB0aGUgaGFzaCBrZXksIHRoYXQgaXM6XG4gICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHNcbiAgICovXG5cbiAgdGhpcy5ibG9ja19zdGFydCA9IDA7XG4gIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0c1xuICAgKiBuZWdhdGl2ZSB3aGVuIHRoZSB3aW5kb3cgaXMgbW92ZWQgYmFja3dhcmRzLlxuICAgKi9cblxuICB0aGlzLm1hdGNoX2xlbmd0aCA9IDA7IC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovXG4gIHRoaXMucHJldl9tYXRjaCA9IDA7IC8qIHByZXZpb3VzIG1hdGNoICovXG4gIHRoaXMubWF0Y2hfYXZhaWxhYmxlID0gMDsgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqL1xuICB0aGlzLnN0cnN0YXJ0ID0gMDsgLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqL1xuICB0aGlzLm1hdGNoX3N0YXJ0ID0gMDsgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovXG4gIHRoaXMubG9va2FoZWFkID0gMDsgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovXG4gIHRoaXMuc3RyYXRlZ3kgPSAwOyAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovXG5cbiAgdGhpcy5nb29kX21hdGNoID0gMDtcbiAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovXG5cbiAgdGhpcy5uaWNlX21hdGNoID0gMDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqL1xuXG4gIC8qIHVzZWQgYnkgYzogKi9cblxuICAvKiBEaWRuJ3QgdXNlIGN0X2RhdGEgdHlwZWRlZiBiZWxvdyB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovXG5cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBkeW5fbHRyZWVbSEVBUF9TSVpFXTsgICAvKiBsaXRlcmFsIGFuZCBsZW5ndGggdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi9cbiAgLy8gc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovXG5cbiAgLy8gVXNlIGZsYXQgYXJyYXkgb2YgRE9VQkxFIHNpemUsIHdpdGggaW50ZXJsZWF2ZWQgZmF0YSxcbiAgLy8gYmVjYXVzZSBKUyBkb2VzIG5vdCBzdXBwb3J0IGVmZmVjdGl2ZVxuICB0aGlzLmR5bl9sdHJlZSA9IG5ldyBCdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgPSBuZXcgQnVmMTYoKDIgKiBEX0NPREVTICsgMSkgKiAyKTtcbiAgdGhpcy5ibF90cmVlID0gbmV3IEJ1ZjE2KCgyICogQkxfQ09ERVMgKyAxKSAqIDIpO1xuICB6ZXJvKHRoaXMuZHluX2x0cmVlKTtcbiAgemVybyh0aGlzLmR5bl9kdHJlZSk7XG4gIHplcm8odGhpcy5ibF90cmVlKTtcblxuICB0aGlzLmxfZGVzYyA9IG51bGw7IC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi9cbiAgdGhpcy5kX2Rlc2MgPSBudWxsOyAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgPSBudWxsOyAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyBCdWYxNigyICogTF9DT0RFUyArIDEpOyAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi9cbiAgemVybyh0aGlzLmhlYXApO1xuXG4gIHRoaXMuaGVhcF9sZW4gPSAwOyAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7IC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi9cbiAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC5cbiAgICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbFxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IEJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovXG5cbiAgdGhpcy5kX2J1ZiA9IDA7XG4gIC8qIEJ1ZmZlciBpbmRleCBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmVcbiAgICogdGhlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyB1c2UgZGlmZmVyZW50IGxlbmd0aHMsIGFuIGV4dHJhIGZsYWdcbiAgICogYXJyYXkgd291bGQgYmUgbmVjZXNzYXJ5LlxuICAgKi9cblxuICB0aGlzLm9wdF9sZW4gPSAwOyAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBvcHRpbWFsIHRyZWVzICovXG4gIHRoaXMuc3RhdGljX2xlbiA9IDA7IC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIHN0YXRpYyB0cmVlcyAqL1xuICB0aGlzLm1hdGNoZXMgPSAwOyAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqL1xuICB0aGlzLmluc2VydCA9IDA7IC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUiQyKTtcbiAgfVxuXG4gIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IDA7XG4gIHN0cm0uZGF0YV90eXBlID0gWl9VTktOT1dOJDE7XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG4gIHMucGVuZGluZyA9IDA7XG4gIHMucGVuZGluZ19vdXQgPSAwO1xuXG4gIGlmIChzLndyYXAgPCAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgICAvKiB3YXMgbWFkZSBuZWdhdGl2ZSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqL1xuICB9XG4gIHMuc3RhdHVzID0gKHMud3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFKTtcbiAgc3RybS5hZGxlciA9IChzLndyYXAgPT09IDIpID9cbiAgICAwIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgICA6XG4gICAgMTsgLy8gYWRsZXIzMigwLCBaX05VTEwsIDApXG4gIHMubGFzdF9mbHVzaCA9IFpfTk9fRkxVU0gkMTtcbiAgX3RyX2luaXQocyk7XG4gIHJldHVybiBaX09LJDI7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0skMikge1xuICAgIGxtX2luaXQoc3RybS5zdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDI7XG4gIH1cbiAgdmFyIHdyYXAgPSAxO1xuXG4gIGlmIChsZXZlbCA9PT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OJDEpIHtcbiAgICBsZXZlbCA9IDY7XG4gIH1cblxuICBpZiAod2luZG93Qml0cyA8IDApIHsgLyogc3VwcHJlc3MgemxpYiB3cmFwcGVyICovXG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9IGVsc2UgaWYgKHdpbmRvd0JpdHMgPiAxNSkge1xuICAgIHdyYXAgPSAyOyAvKiB3cml0ZSBnemlwIHdyYXBwZXIgaW5zdGVhZCAqL1xuICAgIHdpbmRvd0JpdHMgLT0gMTY7XG4gIH1cblxuXG4gIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPT0gWl9ERUZMQVRFRCQyIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEJDEpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SJDIpO1xuICB9XG5cblxuICBpZiAod2luZG93Qml0cyA9PT0gOCkge1xuICAgIHdpbmRvd0JpdHMgPSA5O1xuICB9XG4gIC8qIHVudGlsIDI1Ni1ieXRlIHdpbmRvdyBidWcgZml4ZWQgKi9cblxuICB2YXIgcyA9IG5ldyBEZWZsYXRlU3RhdGUoKTtcblxuICBzdHJtLnN0YXRlID0gcztcbiAgcy5zdHJtID0gc3RybTtcblxuICBzLndyYXAgPSB3cmFwO1xuICBzLmd6aGVhZCA9IG51bGw7XG4gIHMud19iaXRzID0gd2luZG93Qml0cztcbiAgcy53X3NpemUgPSAxIDw8IHMud19iaXRzO1xuICBzLndfbWFzayA9IHMud19zaXplIC0gMTtcblxuICBzLmhhc2hfYml0cyA9IG1lbUxldmVsICsgNztcbiAgcy5oYXNoX3NpemUgPSAxIDw8IHMuaGFzaF9iaXRzO1xuICBzLmhhc2hfbWFzayA9IHMuaGFzaF9zaXplIC0gMTtcbiAgcy5oYXNoX3NoaWZ0ID0gfn4oKHMuaGFzaF9iaXRzICsgTUlOX01BVENIIC0gMSkgLyBNSU5fTUFUQ0gpO1xuXG4gIHMud2luZG93ID0gbmV3IEJ1Zjgocy53X3NpemUgKiAyKTtcbiAgcy5oZWFkID0gbmV3IEJ1ZjE2KHMuaGFzaF9zaXplKTtcbiAgcy5wcmV2ID0gbmV3IEJ1ZjE2KHMud19zaXplKTtcblxuICAvLyBEb24ndCBuZWVkIG1lbSBpbml0IG1hZ2ljIGZvciBKUy5cbiAgLy9zLmhpZ2hfd2F0ZXIgPSAwOyAgLyogbm90aGluZyB3cml0dGVuIHRvIHMtPndpbmRvdyB5ZXQgKi9cblxuICBzLmxpdF9idWZzaXplID0gMSA8PCAobWVtTGV2ZWwgKyA2KTsgLyogMTZLIGVsZW1lbnRzIGJ5IGRlZmF1bHQgKi9cblxuICBzLnBlbmRpbmdfYnVmX3NpemUgPSBzLmxpdF9idWZzaXplICogNDtcblxuICAvL292ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpO1xuICAvL3MtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTtcbiAgcy5wZW5kaW5nX2J1ZiA9IG5ldyBCdWY4KHMucGVuZGluZ19idWZfc2l6ZSk7XG5cbiAgLy8gSXQgaXMgb2Zmc2V0IGZyb20gYHMucGVuZGluZ19idWZgIChzaXplIGlzIGBzLmxpdF9idWZzaXplICogMmApXG4gIC8vcy0+ZF9idWYgPSBvdmVybGF5ICsgcy0+bGl0X2J1ZnNpemUvc2l6ZW9mKHVzaCk7XG4gIHMuZF9idWYgPSAxICogcy5saXRfYnVmc2l6ZTtcblxuICAvL3MtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7XG4gIHMubF9idWYgPSAoMSArIDIpICogcy5saXRfYnVmc2l6ZTtcblxuICBzLmxldmVsID0gbGV2ZWw7XG4gIHMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgcy5tZXRob2QgPSBtZXRob2Q7XG5cbiAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlJDEoc3RybSwgZmx1c2gpIHtcbiAgdmFyIG9sZF9mbHVzaCwgcztcbiAgdmFyIGJlZywgdmFsOyAvLyBmb3IgZ3ppcCBoZWFkZXIgd3JpdGUgb25seVxuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSB8fFxuICAgIGZsdXNoID4gWl9CTE9DSyQyIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SJDIpIDogWl9TVFJFQU1fRVJST1IkMjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuXG4gIGlmICghc3RybS5vdXRwdXQgfHxcbiAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkgfHxcbiAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gkMikpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIChzdHJtLmF2YWlsX291dCA9PT0gMCkgPyBaX0JVRl9FUlJPUiQyIDogWl9TVFJFQU1fRVJST1IkMik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuICAgIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICAgIC8vIEdaSVAgaGVhZGVyXG4gICAgICBzdHJtLmFkbGVyID0gMDsgLy9jcmMzMigwTCwgWl9OVUxMLCAwKTtcbiAgICAgIHB1dF9ieXRlKHMsIDMxKTtcbiAgICAgIHB1dF9ieXRlKHMsIDEzOSk7XG4gICAgICBwdXRfYnl0ZShzLCA4KTtcbiAgICAgIGlmICghcy5nemhlYWQpIHsgLy8gcy0+Z3poZWFkID09IFpfTlVMTFxuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMubGV2ZWwgPT09IDkgPyAyIDpcbiAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSQxIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIE9TX0NPREUpO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGV4dCA/IDEgOiAwKSArXG4gICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICghcy5nemhlYWQuZXh0cmEgPyAwIDogNCkgK1xuICAgICAgICAgICghcy5nemhlYWQubmFtZSA/IDAgOiA4KSArXG4gICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZJDEgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQub3MgJiAweGZmKTtcbiAgICAgICAgaWYgKHMuZ3poZWFkLmV4dHJhICYmIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmYpO1xuICAgICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC5leHRyYS5sZW5ndGggPj4gOCkgJiAweGZmKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcsIDApO1xuICAgICAgICB9XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gRVhUUkFfU1RBVEU7XG4gICAgICB9XG4gICAgfSBlbHNlIC8vIERFRkxBVEUgaGVhZGVyXG4gICAge1xuICAgICAgdmFyIGhlYWRlciA9IChaX0RFRkxBVEVEJDIgKyAoKHMud19iaXRzIC0gOCkgPDwgNCkpIDw8IDg7XG4gICAgICB2YXIgbGV2ZWxfZmxhZ3MgPSAtMTtcblxuICAgICAgaWYgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkkMSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgICAgaGVhZGVyIHw9IFBSRVNFVF9ESUNUO1xuICAgICAgfVxuICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTtcblxuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTtcblxuICAgICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovXG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkge1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IDE7IC8vIGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgfVxuICB9XG5cbiAgLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhIC8qICE9IFpfTlVMTCovICkge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG5cbiAgICAgIHdoaWxlIChzLmd6aW5kZXggPCAocy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZmZmKSkge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLmV4dHJhW3MuZ3ppbmRleF0gJiAweGZmKTtcbiAgICAgICAgcy5nemluZGV4Kys7XG4gICAgICB9XG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aW5kZXggPT09IHMuZ3poZWFkLmV4dHJhLmxlbmd0aCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLm5hbWUgLyogIT0gWl9OVUxMKi8gKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7IC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gQ09NTUVOVF9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5jb21tZW50IC8qICE9IFpfTlVMTCovICkge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICB9XG4gIH1cbiAgLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSyQyO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIJDIpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfQlVGX0VSUk9SJDIpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IkMik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCQxICYmIHMuc3RhdHVzICE9PSBGSU5JU0hfU1RBVEUpKSB7XG4gICAgdmFyIGJzdGF0ZSA9IChzLnN0cmF0ZWd5ID09PSBaX0hVRkZNQU5fT05MWSQxKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFJDEgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LJDI7XG4gICAgICAvKiBJZiBmbHVzaCAhPSBaX05PX0ZMVVNIICYmIGF2YWlsX291dCA9PSAwLCB0aGUgbmV4dCBjYWxsXG4gICAgICAgKiBvZiBkZWZsYXRlIHNob3VsZCB1c2UgdGhlIHNhbWUgZmx1c2ggcGFyYW1ldGVyIHRvIG1ha2Ugc3VyZVxuICAgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuXG4gICAgICAgKiBlbXB0eSBibG9jayBoZXJlLCB0aGlzIHdpbGwgYmUgZG9uZSBhdCBuZXh0IGNhbGwuIFRoaXMgYWxzb1xuICAgICAgICogZW5zdXJlcyB0aGF0IGZvciBhIHZlcnkgc21hbGwgb3V0cHV0IGJ1ZmZlciwgd2UgZW1pdCBhdCBtb3N0XG4gICAgICAgKiBvbmUgZW1wdHkgYmxvY2suXG4gICAgICAgKi9cbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfQkxPQ0tfRE9ORSkge1xuICAgICAgaWYgKGZsdXNoID09PSBaX1BBUlRJQUxfRkxVU0gkMSkge1xuICAgICAgICBfdHJfYWxpZ24ocyk7XG4gICAgICB9IGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLJDIpIHsgLyogRlVMTF9GTFVTSCBvciBTWU5DX0ZMVVNIICovXG5cbiAgICAgICAgX3RyX3N0b3JlZF9ibG9jayhzLCAwLCAwLCBmYWxzZSk7XG4gICAgICAgIC8qIEZvciBhIGZ1bGwgZmx1c2gsIHRoaXMgZW1wdHkgYmxvY2sgd2lsbCBiZSByZWNvZ25pemVkXG4gICAgICAgICAqIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfRlVMTF9GTFVTSCQxKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0skMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQoc3RybS0+YXZhaWxfb3V0ID4gMCwgXCJidWcyXCIpO1xuICAvL2lmIChzdHJtLmF2YWlsX291dCA8PSAwKSB7IHRocm93IG5ldyBFcnJvcihcImJ1ZzJcIik7fVxuXG4gIGlmIChmbHVzaCAhPT0gWl9GSU5JU0gkMikge1xuICAgIHJldHVybiBaX09LJDI7XG4gIH1cbiAgaWYgKHMud3JhcCA8PSAwKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VORCQyO1xuICB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkge1xuICAgIHMud3JhcCA9IC1zLndyYXA7XG4gIH1cbiAgLyogd3JpdGUgdGhlIHRyYWlsZXIgb25seSBvbmNlISAqL1xuICByZXR1cm4gcy5wZW5kaW5nICE9PSAwID8gWl9PSyQyIDogWl9TVFJFQU1fRU5EJDI7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybSAvKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlIC8qPT0gWl9OVUxMKi8gKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDI7XG4gIH1cblxuICBzdGF0dXMgPSBzdHJtLnN0YXRlLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gSU5JVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRVhUUkFfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IE5BTUVfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IENPTU1FTlRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEhDUkNfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEJVU1lfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEZJTklTSF9TVEFURVxuICApIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SJDIpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IkMikgOiBaX09LJDI7XG59XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5kZWZsYXRlQm91bmQgPSBkZWZsYXRlQm91bmQ7XG5leHBvcnRzLmRlZmxhdGVDb3B5ID0gZGVmbGF0ZUNvcHk7XG5leHBvcnRzLmRlZmxhdGVQYXJhbXMgPSBkZWZsYXRlUGFyYW1zO1xuZXhwb3J0cy5kZWZsYXRlUGVuZGluZyA9IGRlZmxhdGVQZW5kaW5nO1xuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5leHBvcnRzLmRlZmxhdGVUdW5lID0gZGVmbGF0ZVR1bmU7XG4qL1xuXG4vLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanNcbnZhciBCQUQkMSA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgVFlQRSQxID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5mdW5jdGlvbiBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgX2luOyAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5pbnB1dCAqL1xuICB2YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogaGF2ZSBlbm91Z2ggaW5wdXQgd2hpbGUgaW4gPCBsYXN0ICovXG4gIHZhciBfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgYmVnOyAgICAgICAgICAgICAgICAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovXG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICB2YXIgZG1heDsgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovXG4vLyNlbmRpZlxuICB2YXIgd3NpemU7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHZhciB3aGF2ZTsgICAgICAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHZhciB3bmV4dDsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgLy8gVXNlIGBzX3dpbmRvd2AgaW5zdGVhZCBgd2luZG93YCwgYXZvaWQgY29uZmxpY3Qgd2l0aCBpbnN0cnVtZW50YXRpb24gdG9vbHNcbiAgdmFyIHNfd2luZG93OyAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5ob2xkICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmJpdHMgKi9cbiAgdmFyIGxjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ubGVuY29kZSAqL1xuICB2YXIgZGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5kaXN0Y29kZSAqL1xuICB2YXIgbG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovXG4gIHZhciBkbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuICB2YXIgaGVyZTsgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovXG4gIHZhciBvcDsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB3aW5kb3cgcG9zaXRpb24sIHdpbmRvdyBieXRlcyB0byBjb3B5ICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqL1xuICB2YXIgZGlzdDsgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG5cblxuICB2YXIgaW5wdXQsIG91dHB1dDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuXG4gIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgLy9oZXJlID0gc3RhdGUuaGVyZTtcbiAgX2luID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGxhc3QgPSBfaW4gKyAoc3RybS5hdmFpbF9pbiAtIDUpO1xuICBfb3V0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGJlZyA9IF9vdXQgLSAoc3RhcnQgLSBzdHJtLmF2YWlsX291dCk7XG4gIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgZG1heCA9IHN0YXRlLmRtYXg7XG4vLyNlbmRpZlxuICB3c2l6ZSA9IHN0YXRlLndzaXplO1xuICB3aGF2ZSA9IHN0YXRlLndoYXZlO1xuICB3bmV4dCA9IHN0YXRlLnduZXh0O1xuICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdztcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7XG4gIGRjb2RlID0gc3RhdGUuZGlzdGNvZGU7XG4gIGxtYXNrID0gKDEgPDwgc3RhdGUubGVuYml0cykgLSAxO1xuICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7XG5cblxuICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2hcbiAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi9cblxuICB0b3A6XG4gIGRvIHtcbiAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICB9XG5cbiAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTtcblxuICAgIGRvbGVuOlxuICAgIGZvciAoOzspIHsgLy8gR290byBlbXVsYXRpb25cbiAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgYml0cyAtPSBvcDtcbiAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcbiAgICAgIGlmIChvcCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICBvdXRwdXRbX291dCsrXSA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi9cbiAgICAgICAgbGVuID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgaWYgKG9wKSB7XG4gICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgbGVuKSk7XG4gICAgICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTtcblxuICAgICAgICBkb2Rpc3Q6XG4gICAgICAgIGZvciAoOzspIHsgLy8gZ290byBlbXVsYXRpb25cbiAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG5cbiAgICAgICAgICBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYXNlICovXG4gICAgICAgICAgICBkaXN0ID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEJDE7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRCQxO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzX3dpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIG9wIC09IHduZXh0O1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovXG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpO1xuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRCQxO1xuICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICBjb250aW51ZSBkb2xlbjtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRSQxO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRCQxO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgfVxuICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpO1xuXG4gIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqL1xuICBsZW4gPSBiaXRzID4+IDM7XG4gIF9pbiAtPSBsZW47XG4gIGJpdHMgLT0gbGVuIDw8IDM7XG4gIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxO1xuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovXG4gIHN0cm0ubmV4dF9pbiA9IF9pbjtcbiAgc3RybS5uZXh0X291dCA9IF9vdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSAoX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpKTtcbiAgc3RybS5hdmFpbF9vdXQgPSAoX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKSk7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgcmV0dXJuO1xufVxuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TJDEgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTJDEgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKTtcblxudmFyIENPREVTJDEgPSAwO1xudmFyIExFTlMkMSA9IDE7XG52YXIgRElTVFMkMSA9IDI7XG5cbnZhciBsYmFzZSA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi9cbiAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSxcbiAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDBcbl07XG5cbnZhciBsZXh0ID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsXG4gIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCA3MiwgNzhcbl07XG5cbnZhciBkYmFzZSA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqL1xuICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsXG4gIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSxcbiAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMFxuXTtcblxudmFyIGRleHQgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsIDIyLFxuICAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNyxcbiAgMjgsIDI4LCAyOSwgMjksIDY0LCA2NFxuXTtcblxuZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKSB7XG4gIHZhciBiaXRzID0gb3B0cy5iaXRzO1xuICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqL1xuICB2YXIgc3ltID0gMDsgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLFxuICAgIG1heCA9IDA7IC8qIG1pbmltdW0gYW5kIG1heGltdW0gY29kZSBsZW5ndGhzICovXG4gIHZhciByb290ID0gMDsgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7IC8qIGNvZGUgYml0cyB0byBkcm9wIGZvciBzdWItdGFibGUgKi9cbiAgdmFyIGxlZnQgPSAwOyAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqL1xuICB2YXIgdXNlZCA9IDA7IC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovXG4gIHZhciBmaWxsOyAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovXG4gIHZhciBtYXNrOyAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7IC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbiAgLy8gIHZhciBzaG9leHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGVuZDsgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IEJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IEJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAvKiBubyBzeW1ib2xzIHRvIGNvZGUgYXQgYWxsICovXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0OyAgLy9oZXJlLm9wID0gKHZhciBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTsgICAvL2hlcmUuYml0cyA9ICh2YXIgY2hhcikxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwOyAgIC8vaGVyZS52YWwgPSAodmFyIHNob3J0KTA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuXG4gICAgLy90YWJsZS5vcFtvcHRzLnRhYmxlX2luZGV4XSA9IDY0O1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7XG4gICAgdGFibGVbdGFibGVfaW5kZXgrK10gPSAoMSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcblxuICAgIG9wdHMuYml0cyA9IDE7XG4gICAgcmV0dXJuIDA7IC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMkMSB8fCBtYXggIT09IDEpKSB7XG4gICAgcmV0dXJuIC0xOyAvKiBpbmNvbXBsZXRlIHNldCAqL1xuICB9XG5cbiAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi9cbiAgb2Zmc1sxXSA9IDA7XG4gIGZvciAobGVuID0gMTsgbGVuIDwgTUFYQklUUzsgbGVuKyspIHtcbiAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTtcbiAgfVxuXG4gIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi9cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBpZiAobGVuc1tsZW5zX2luZGV4ICsgc3ltXSAhPT0gMCkge1xuICAgICAgd29ya1tvZmZzW2xlbnNbbGVuc19pbmRleCArIHN5bV1dKytdID0gc3ltO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmdcbiAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmXG4gICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3BcbiAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VycixcbiAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG9cbiAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLlxuXG4gICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzXG4gICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleFxuICAgb2YgdGhlIGxvdyByb290IGJpdHMgb2YgaHVmZi4gIFRoaXMgaXMgc2F2ZWQgaW4gbG93IHRvIGNoZWNrIGZvciB3aGVuIGFcbiAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpc1xuICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLlxuXG4gICBXaGVuIGEgbmV3IHN1Yi10YWJsZSBpcyBuZWVkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb29rIGFoZWFkIGluIHRoZVxuICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGhcbiAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlXG4gICBlbnRlcmVkIGluIHRoZSB0YWJsZXMuXG5cbiAgIHVzZWQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlXG4gICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIGZvciBMRU5TIGFuZCBESVNUIHRhYmxlcyBhZ2FpbnN0XG4gICB0aGUgY29uc3RhbnRzIEVOT1VHSF9MRU5TIGFuZCBFTk9VR0hfRElTVFMgdG8gZ3VhcmQgYWdhaW5zdCBjaGFuZ2VzIGluXG4gICB0aGUgaW5pdGlhbCByb290IHRhYmxlIHNpemUgY29uc3RhbnRzLiAgU2VlIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlblxuICAgYWxsIGNvZGVzIG9mIGxlbmd0aCBtYXgsIGkuZS4gYWxsIGNvZGVzLCBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpc1xuICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxsc1xuICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLlxuICAgKi9cblxuICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqL1xuICAvLyBwb29yIG1hbiBvcHRpbWl6YXRpb24gLSB1c2UgaWYtZWxzZSBpbnN0ZWFkIG9mIHN3aXRjaCxcbiAgLy8gdG8gYXZvaWQgZGVvcHRzIGluIG9sZCB2OFxuICBpZiAodHlwZSA9PT0gQ09ERVMkMSkge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7IC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUyQxKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7IC8qIERJU1RTICovXG4gICAgYmFzZSA9IGRiYXNlO1xuICAgIGV4dHJhID0gZGV4dDtcbiAgICBlbmQgPSAtMTtcbiAgfVxuXG4gIC8qIGluaXRpYWxpemUgb3B0cyBmb3IgbG9vcCAqL1xuICBodWZmID0gMDsgLyogc3RhcnRpbmcgY29kZSAqL1xuICBzeW0gPSAwOyAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47IC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovXG4gIG5leHQgPSB0YWJsZV9pbmRleDsgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7IC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7IC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7IC8qIG1hc2sgZm9yIGNvbXBhcmluZyBsb3cgKi9cblxuICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi9cbiAgaWYgKCh0eXBlID09PSBMRU5TJDEgJiYgdXNlZCA+IEVOT1VHSF9MRU5TJDEpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTJDEgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUyQxKSkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIGNyZWF0ZSB0YWJsZSBlbnRyeSAqL1xuICAgIGhlcmVfYml0cyA9IGxlbiAtIGRyb3A7XG4gICAgaWYgKHdvcmtbc3ltXSA8IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IDA7XG4gICAgICBoZXJlX3ZhbCA9IHdvcmtbc3ltXTtcbiAgICB9IGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7IC8qIGVuZCBvZiBibG9jayAqL1xuICAgICAgaGVyZV92YWwgPSAwO1xuICAgIH1cblxuICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIGRyb3ApO1xuICAgIGZpbGwgPSAxIDw8IGN1cnI7XG4gICAgbWluID0gZmlsbDsgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8IDA7XG4gICAgfSB3aGlsZSAoZmlsbCAhPT0gMCk7XG5cbiAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSAxKTtcbiAgICB3aGlsZSAoaHVmZiAmIGluY3IpIHtcbiAgICAgIGluY3IgPj49IDE7XG4gICAgfVxuICAgIGlmIChpbmNyICE9PSAwKSB7XG4gICAgICBodWZmICY9IGluY3IgLSAxO1xuICAgICAgaHVmZiArPSBpbmNyO1xuICAgIH0gZWxzZSB7XG4gICAgICBodWZmID0gMDtcbiAgICB9XG5cbiAgICAvKiBnbyB0byBuZXh0IHN5bWJvbCwgdXBkYXRlIGNvdW50LCBsZW4gKi9cbiAgICBzeW0rKztcbiAgICBpZiAoLS1jb3VudFtsZW5dID09PSAwKSB7XG4gICAgICBpZiAobGVuID09PSBtYXgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47IC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMkMSAmJiB1c2VkID4gRU5PVUdIX0xFTlMkMSkgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTJDEgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUyQxKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgLyogcG9pbnQgZW50cnkgaW4gcm9vdCB0YWJsZSB0byBzdWItdGFibGUgKi9cbiAgICAgIGxvdyA9IGh1ZmYgJiBtYXNrO1xuICAgICAgLyp0YWJsZS5vcFtsb3ddID0gY3VycjtcbiAgICAgIHRhYmxlLmJpdHNbbG93XSA9IHJvb3Q7XG4gICAgICB0YWJsZS52YWxbbG93XSA9IG5leHQgLSBvcHRzLnRhYmxlX2luZGV4OyovXG4gICAgICB0YWJsZVtsb3ddID0gKHJvb3QgPDwgMjQpIHwgKGN1cnIgPDwgMTYpIHwgKG5leHQgLSB0YWJsZV9pbmRleCkgfCAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwgMDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG4vKiBQdWJsaWMgY29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovXG4vL3ZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xuLy92YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG4vL3ZhciBaX0ZVTExfRkxVU0ggICAgPSAzO1xudmFyIFpfRklOSVNIJDEgPSA0O1xudmFyIFpfQkxPQ0skMSA9IDU7XG52YXIgWl9UUkVFUyQxID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LJDEgPSAwO1xudmFyIFpfU1RSRUFNX0VORCQxID0gMTtcbnZhciBaX05FRURfRElDVCQxID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SJDEgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IkMSA9IC0zO1xudmFyIFpfTUVNX0VSUk9SID0gLTQ7XG52YXIgWl9CVUZfRVJST1IkMSA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQkMSA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyIEhFQUQgPSAxOyAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciBGTEFHUyA9IDI7IC8qIGk6IHdhaXRpbmcgZm9yIG1ldGhvZCBhbmQgZmxhZ3MgKGd6aXApICovXG52YXIgVElNRSA9IDM7IC8qIGk6IHdhaXRpbmcgZm9yIG1vZGlmaWNhdGlvbiB0aW1lIChnemlwKSAqL1xudmFyIE9TID0gNDsgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgRVhMRU4gPSA1OyAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgRVhUUkEgPSA2OyAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBieXRlcyAoZ3ppcCkgKi9cbnZhciBOQU1FID0gNzsgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGZpbGUgbmFtZSAoZ3ppcCkgKi9cbnZhciBDT01NRU5UID0gODsgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGNvbW1lbnQgKGd6aXApICovXG52YXIgSENSQyA9IDk7IC8qIGk6IHdhaXRpbmcgZm9yIGhlYWRlciBjcmMgKGd6aXApICovXG52YXIgRElDVElEID0gMTA7IC8qIGk6IHdhaXRpbmcgZm9yIGRpY3Rpb25hcnkgY2hlY2sgdmFsdWUgKi9cbnZhciBESUNUID0gMTE7IC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyIFRZUEUgPSAxMjsgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyIFRZUEVETyA9IDEzOyAvKiBpOiBzYW1lLCBidXQgc2tpcCBjaGVjayB0byBleGl0IGluZmxhdGUgb24gbmV3IGJsb2NrICovXG52YXIgU1RPUkVEID0gMTQ7IC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgQ09QWV8gPSAxNTsgLyogaS9vOiBzYW1lIGFzIENPUFkgYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi9cbnZhciBDT1BZID0gMTY7IC8qIGkvbzogd2FpdGluZyBmb3IgaW5wdXQgb3Igb3V0cHV0IHRvIGNvcHkgc3RvcmVkIGJsb2NrICovXG52YXIgVEFCTEUgPSAxNzsgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgTEVOTEVOUyA9IDE4OyAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciBDT0RFTEVOUyA9IDE5OyAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciBMRU5fID0gMjA7IC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgTEVOID0gMjE7IC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciBMRU5FWFQgPSAyMjsgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi9cbnZhciBESVNUID0gMjM7IC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciBESVNURVhUID0gMjQ7IC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciBNQVRDSCA9IDI1OyAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciBMSVQgPSAyNjsgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciBDSEVDSyA9IDI3OyAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciBMRU5HVEggPSAyODsgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciBET05FID0gMjk7IC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgQkFEID0gMzA7IC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBNRU0gPSAzMTsgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBTWU5DID0gMzI7IC8qIGxvb2tpbmcgZm9yIHN5bmNocm9uaXphdGlvbiBieXRlcyB0byByZXN0YXJ0IGluZmxhdGUoKSAqL1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cblxudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5MjtcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICgoKHEgPj4+IDI0KSAmIDB4ZmYpICtcbiAgICAoKHEgPj4+IDgpICYgMHhmZjAwKSArXG4gICAgKChxICYgMHhmZjAwKSA8PCA4KSArXG4gICAgKChxICYgMHhmZikgPDwgMjQpKTtcbn1cblxuXG5mdW5jdGlvbiBJbmZsYXRlU3RhdGUoKSB7XG4gIHRoaXMubW9kZSA9IDA7IC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovXG4gIHRoaXMubGFzdCA9IGZhbHNlOyAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgbGFzdCBibG9jayAqL1xuICB0aGlzLndyYXAgPSAwOyAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgLyogdHJ1ZSBpZiBkaWN0aW9uYXJ5IHByb3ZpZGVkICovXG4gIHRoaXMuZmxhZ3MgPSAwOyAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpICovXG4gIHRoaXMuZG1heCA9IDA7IC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7IC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7IC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7IC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7IC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7IC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAvKiBudW1iZXIgb2YgYml0cyBpbiBcImluXCIgKi9cblxuICAvKiBmb3Igc3RyaW5nIGFuZCBzdG9yZWQgYmxvY2sgY29weWluZyAqL1xuICB0aGlzLmxlbmd0aCA9IDA7IC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7IC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7IC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAqL1xuICB0aGlzLmxlbmJpdHMgPSAwOyAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7IC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7IC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBpbiBsZW5zW10gKi9cbiAgdGhpcy5uZXh0ID0gbnVsbDsgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyBCdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyBCdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7IC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7IC8qIGluaXRpYWwgbGVuZ3RoIG9mIG1hdGNoICovXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldEtlZXAoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7XG4gIH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbCAvKlpfTlVMTCovIDtcbiAgc3RhdGUuaG9sZCA9IDA7XG4gIHN0YXRlLmJpdHMgPSAwO1xuICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5biA9IG5ldyBCdWYzMihFTk9VR0hfTEVOUyk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5biA9IG5ldyBCdWYzMihFTk9VR0hfRElTVFMpO1xuXG4gIHN0YXRlLnNhbmUgPSAxO1xuICBzdGF0ZS5iYWNrID0gLTE7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogcmVzZXRcXG5cIikpO1xuICByZXR1cm4gWl9PSyQxO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7XG4gIH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdGF0ZS53c2l6ZSA9IDA7XG4gIHN0YXRlLndoYXZlID0gMDtcbiAgc3RhdGUud25leHQgPSAwO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKTtcblxufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHdyYXA7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBnZXQgdGhlIHN0YXRlICovXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQxO1xuICB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfSBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7XG4gIH1cbiAgaWYgKHN0YXRlLndpbmRvdyAhPT0gbnVsbCAmJiBzdGF0ZS53Yml0cyAhPT0gd2luZG93Qml0cykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJlc2V0IHRoZSByZXN0IG9mIGl0ICovXG4gIHN0YXRlLndyYXAgPSB3cmFwO1xuICBzdGF0ZS53Yml0cyA9IHdpbmRvd0JpdHM7XG4gIHJldHVybiBpbmZsYXRlUmVzZXQoc3RybSk7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVJbml0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciByZXQ7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTtcbiAgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsIC8qWl9OVUxMKi8gO1xuICByZXQgPSBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpO1xuICBpZiAocmV0ICE9PSBaX09LJDEpIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbCAvKlpfTlVMTCovIDtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbi8qXG4gUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0b1xuIGZpeGVkIGNvZGUgZGVjb2RpbmcuICBOb3JtYWxseSB0aGlzIHJldHVybnMgZml4ZWQgdGFibGVzIGZyb20gaW5mZml4ZWQuaC5cbiBJZiBCVUlMREZJWEVEIGlzIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGlzIHJvdXRpbmUgYnVpbGRzIHRoZSB0YWJsZXMgdGhlXG4gZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZFxuIHRoZXJlYWZ0ZXIuICBUaGlzIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvZGUgYnkgYWJvdXQgMksgYnl0ZXMsIGluXG4gZXhjaGFuZ2UgZm9yIGEgbGl0dGxlIGV4ZWN1dGlvbiB0aW1lLiAgSG93ZXZlciwgQlVJTERGSVhFRCBzaG91bGQgbm90IGJlXG4gdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpblxuIG1heSBub3QgYmUgdGhyZWFkLXNhZmUuXG4gKi9cbnZhciB2aXJnaW4gPSB0cnVlO1xuXG52YXIgbGVuZml4LCBkaXN0Zml4OyAvLyBXZSBoYXZlIG5vIHBvaW50ZXJzIGluIEpTLCBzbyBrZWVwIHRhYmxlcyBzZXBhcmF0ZVxuXG5mdW5jdGlvbiBmaXhlZHRhYmxlcyhzdGF0ZSkge1xuICAvKiBidWlsZCBmaXhlZCBodWZmbWFuIHRhYmxlcyBpZiBmaXJzdCBjYWxsIChtYXkgbm90IGJlIHRocmVhZCBzYWZlKSAqL1xuICBpZiAodmlyZ2luKSB7XG4gICAgdmFyIHN5bTtcblxuICAgIGxlbmZpeCA9IG5ldyBCdWYzMig1MTIpO1xuICAgIGRpc3RmaXggPSBuZXcgQnVmMzIoMzIpO1xuXG4gICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAxNDQpIHtcbiAgICAgIHN0YXRlLmxlbnNbc3ltKytdID0gODtcbiAgICB9XG4gICAgd2hpbGUgKHN5bSA8IDI1Nikge1xuICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA5O1xuICAgIH1cbiAgICB3aGlsZSAoc3ltIDwgMjgwKSB7XG4gICAgICBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7XG4gICAgfVxuICAgIHdoaWxlIChzeW0gPCAyODgpIHtcbiAgICAgIHN0YXRlLmxlbnNbc3ltKytdID0gODtcbiAgICB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAwLCBzdGF0ZS53b3JrLCB7XG4gICAgICBiaXRzOiA5XG4gICAgfSk7XG5cbiAgICAvKiBkaXN0YW5jZSB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDMyKSB7XG4gICAgICBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7XG4gICAgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgMCwgMzIsIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHtcbiAgICAgIGJpdHM6IDVcbiAgICB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyBCdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIGFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9IGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICBhcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHtcbiAgICAgICAgc3RhdGUud25leHQgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLndoYXZlIDwgc3RhdGUud3NpemUpIHtcbiAgICAgICAgc3RhdGUud2hhdmUgKz0gZGlzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUkMShzdHJtLCBmbHVzaCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBpbnB1dC9vdXRwdXQgYnVmZmVyc1xuICB2YXIgbmV4dDsgLyogbmV4dCBpbnB1dCBJTkRFWCAqL1xuICB2YXIgcHV0OyAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7IC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7IC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207IC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7IC8qIHJldHVybiBjb2RlICovXG4gIHZhciBoYnVmID0gbmV3IEJ1ZjgoNCk7IC8qIGJ1ZmZlciBmb3IgZ3ppcCBoZWFkZXIgY3JjIGNhbGN1bGF0aW9uICovXG4gIHZhciBvcHRzO1xuXG4gIHZhciBuOyAvLyB0ZW1wb3JhcnkgdmFyIGZvciBORUVEX0JJVFNcblxuICB2YXIgb3JkZXIgPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8gWzE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTVdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQxO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gIH0gLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0skMTtcblxuICBpbmZfbGVhdmU6IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgZm9yICg7Oykge1xuICAgICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgICBjYXNlIEhFQUQ6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7IC8qIGd6aXAgaGVhZGVyICovXG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSAwIC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLyA7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cblxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5mbGFncyA9IDA7IC8qIGV4cGVjdCB6bGliIGhlYWRlciAqL1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAvKiBjaGVjayBpZiB6bGliIGhlYWRlciBhbGxvd2VkICovXG4gICAgICAgICAgKCgoaG9sZCAmIDB4ZmYpIC8qQklUUyg4KSovIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaG9sZCAmIDB4MGYpIC8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEJDEpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNDtcbiAgICAgICAgYml0cyAtPSA0O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGxlbiA9IChob2xkICYgMHgwZikgLypCSVRTKDQpKi8gKyA4O1xuICAgICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS53Yml0cyA9IGxlbjtcbiAgICAgICAgfSBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgd2luZG93IHNpemUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxIC8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovIDtcbiAgICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRkxBR1M6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7XG4gICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgJiAweGZmKSAhPT0gWl9ERUZMQVRFRCQxKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHhlMDAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50ZXh0ID0gKChob2xkID4+IDgpICYgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVElNRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDQsIDApO1xuICAgICAgICAgIC8vPT09XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBPUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRVhMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhMRU46XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7XG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbCAvKlpfTlVMTCovIDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRVhUUkE6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7XG4gICAgICAgICAgICBjb3B5ID0gaGF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmhlYWQuZXh0cmFfbGVuIC0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW5kIHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbmV3IEFycmF5KHN0YXRlLmhlYWQuZXh0cmFfbGVuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhcnJheVNldChcbiAgICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgICAgLy8gZXh0cmEgZmllbGQgaXMgbGltaXRlZCB0byA2NTUzNiBieXRlc1xuICAgICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgICAvKmxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA/IHN0YXRlLmhlYWQuZXh0cmFfbWF4IDogY29weSwqL1xuICAgICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvL3ptZW1jcHkoc3RhdGUuaGVhZC5leHRyYSArIGxlbiwgbmV4dCxcbiAgICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE5BTUU6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIFRPRE86IDIgb3IgMSBieXRlcz9cbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLm5hbWVfbWF4Ki8gKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPTU1FTlQ6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8gKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gSENSQztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBIQ1JDOlxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaGVhZGVyIGNyYyBtaXNtYXRjaCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBESUNUSUQ6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IERJQ1Q7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElDVDpcbiAgICAgICAgaWYgKHN0YXRlLmhhdmVkaWN0ID09PSAwKSB7XG4gICAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgICAgLy8tLS1cbiAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1QkMTtcbiAgICAgICAgfVxuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxIC8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovIDtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRTpcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLJDEgfHwgZmx1c2ggPT09IFpfVFJFRVMkMSkge1xuICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIFRZUEVETzpcbiAgICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxhc3QgPSAoaG9sZCAmIDB4MDEpIC8qQklUUygxKSovIDtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDE7XG4gICAgICAgIGJpdHMgLT0gMTtcbiAgICAgICAgLy8tLS0vL1xuXG4gICAgICAgIHN3aXRjaCAoKGhvbGQgJiAweDAzKSAvKkJJVFMoMikqLyApIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXFxuXCIsXG4gICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7XG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IExFTl87IC8qIGRlY29kZSBjb2RlcyAqL1xuICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUyQxKSB7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgLyogZHluYW1pYyBibG9jayAqL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRBQkxFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBibG9jayB0eXBlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNUT1JFRDpcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vLyAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovXG4gICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPT0gKChob2xkID4+PiAxNikgXiAweGZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcXG5cIixcbiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IENPUFlfO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMkMSkge1xuICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFlfOlxuICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBDT1BZOlxuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkge1xuICAgICAgICAgICAgY29weSA9IGhhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkge1xuICAgICAgICAgICAgY29weSA9IGxlZnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3B5ID09PSAwKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgICAgYXJyYXlTZXQob3V0cHV0LCBpbnB1dCwgbmV4dCwgY29weSwgcHV0KTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgZW5kXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUQUJMRTpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm5sZW4gPSAoaG9sZCAmIDB4MWYpIC8qQklUUyg1KSovICsgMjU3O1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg1KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNTtcbiAgICAgICAgYml0cyAtPSA1O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm5kaXN0ID0gKGhvbGQgJiAweDFmKSAvKkJJVFMoNSkqLyArIDE7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpIC8qQklUUyg0KSovICsgNDtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICAvLyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkRcbiAgICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vI2VuZGlmXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkxFTlM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOTEVOUzpcbiAgICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5uY29kZSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsgLy9CSVRTKDMpO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAgIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gNztcblxuICAgICAgICBvcHRzID0ge1xuICAgICAgICAgIGJpdHM6IHN0YXRlLmxlbmJpdHNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUubGVucywgMCwgMTksIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IENPREVMRU5TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPREVMRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07IC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaGVyZV92YWwgPT09IDE2KSB7XG4gICAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7IC8vQklUUygyKTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7IC8vQklUUygzKTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgNyk7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOyAvL0JJVFMoNyk7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSA3O1xuICAgICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY29weS0tKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBCQUQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgICBpZiAoc3RhdGUubGVuc1syNTZdID09PSAwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oXG4gICAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgICAgb3B0cyA9IHtcbiAgICAgICAgICBiaXRzOiBzdGF0ZS5sZW5iaXRzXG4gICAgICAgIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSA2O1xuICAgICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgICAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluO1xuICAgICAgICBvcHRzID0ge1xuICAgICAgICAgIGJpdHM6IHN0YXRlLmRpc3RiaXRzXG4gICAgICAgIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIHN0YXRlLm5sZW4sIHN0YXRlLm5kaXN0LCBzdGF0ZS5kaXN0Y29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgICBzdGF0ZS5kaXN0Yml0cyA9IG9wdHMuYml0cztcbiAgICAgICAgLy8gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlcyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgJ2luZmxhdGU6ICAgICAgIGNvZGVzIG9rXFxuJykpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXztcbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTJDEpIHtcbiAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgIH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5fOlxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTjpcbiAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAgIC8vLS0tIExPQUQoKSAtLS1cbiAgICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICAgIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgICAvLy0tLVxuXG4gICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuYmFjayA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAvKkJJVFMoc3RhdGUubGVuYml0cykqL1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiYgKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkgLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgICBpZiAoaGVyZV9vcCA9PT0gMCkge1xuICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5leHRyYSA9IGhlcmVfb3AgJiAxNTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5FWFQ6XG4gICAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpIC8qQklUUyhzdGF0ZS5leHRyYSkqLyA7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElTVDpcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5kaXN0Y29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDEpXTsgLypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkgLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUub2Zmc2V0ID0gaGVyZV92YWw7XG4gICAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJU1RFWFQ6XG4gICAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpIC8qQklUUyhzdGF0ZS5leHRyYSkqLyA7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICAgIH1cbiAgICAgICAgLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyNlbmRpZlxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTUFUQ0g7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTUFUQ0g6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7XG4gICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICB9XG4gICAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IGNvcHkpIHsgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgIGNvcHkgPSBzdGF0ZS5vZmZzZXQgLSBjb3B5O1xuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmFpbHRzLFxuICAgICAgICAgICAgLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4gICAgICAgICAgICAvLyAgICAgICAgICBUcmFjZSgoc3RkZXJyLCBcImluZmxhdGUuYyB0b28gZmFyXFxuXCIpKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgIGNvcHkgLT0gc3RhdGUud2hhdmU7XG4gICAgICAgICAgICAvLyAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgICAgICAvLyAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgICAgIC8vICAgICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgICAgIC8vICAgICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICAgICAgLy8gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICBvdXRwdXRbcHV0KytdID0gMDtcbiAgICAgICAgICAgIC8vICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4gICAgICAgICAgICAvLyAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbiAgICAgICAgICAgIC8vICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8jZW5kaWZcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgICAgY29weSAtPSBzdGF0ZS53bmV4dDtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gPSBzdGF0ZS53bmV4dCAtIGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmcm9tX3NvdXJjZSA9IHN0YXRlLndpbmRvdztcbiAgICAgICAgfSBlbHNlIHsgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS5vZmZzZXQ7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHtcbiAgICAgICAgICBjb3B5ID0gbGVmdDtcbiAgICAgICAgfVxuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgIH0gd2hpbGUgKC0tY29weSk7XG4gICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMSVQ6XG4gICAgICAgIGlmIChsZWZ0ID09PSAwKSB7XG4gICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGxlZnQtLTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENIRUNLOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAvLyBVc2UgJ3wnIGluc2RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgX291dCAtPSBsZWZ0O1xuICAgICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgICBpZiAoX291dCkge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgLypVUERBVEUoc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgICB9XG4gICAgICAgICAgX291dCA9IGxlZnQ7XG4gICAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGRhdGEgY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkdUSDpcbiAgICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLnRvdGFsICYgMHhmZmZmZmZmZikpIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRE9ORTpcbiAgICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EJDE7XG4gICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgIGNhc2UgQkFEOlxuICAgICAgICByZXQgPSBaX0RBVEFfRVJST1IkMTtcbiAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgY2FzZSBNRU06XG4gICAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICAgIGNhc2UgU1lOQzpcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7XG4gICAgICB9XG4gICAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgIChzdGF0ZS5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT09IFpfRklOSVNIJDEpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIDtcbiAgfVxuICBfaW4gLT0gc3RybS5hdmFpbF9pbjtcbiAgX291dCAtPSBzdHJtLmF2YWlsX291dDtcbiAgc3RybS50b3RhbF9pbiArPSBfaW47XG4gIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gIGlmIChzdGF0ZS53cmFwICYmIF9vdXQpIHtcbiAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAvKlVQREFURShzdGF0ZS5jaGVjaywgc3RybS5uZXh0X291dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAoc3RhdGUuZmxhZ3MgPyBjcmMzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSk7XG4gIH1cbiAgc3RybS5kYXRhX3R5cGUgPSBzdGF0ZS5iaXRzICsgKHN0YXRlLmxhc3QgPyA2NCA6IDApICtcbiAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApO1xuICBpZiAoKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCkgfHwgZmx1c2ggPT09IFpfRklOSVNIJDEpICYmIHJldCA9PT0gWl9PSyQxKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1IkMTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgLyp8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTAqLyApIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTtcbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS53aW5kb3cpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuICByZXR1cm4gWl9PSyQxO1xufVxuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuXG4vLyBpbXBvcnQgY29uc3RhbnRzIGZyb20gJy4vY29uc3RhbnRzJztcblxuXG4vLyB6bGliIG1vZGVzXG52YXIgTk9ORSA9IDA7XG52YXIgREVGTEFURSA9IDE7XG52YXIgSU5GTEFURSA9IDI7XG52YXIgR1pJUCA9IDM7XG52YXIgR1VOWklQID0gNDtcbnZhciBERUZMQVRFUkFXID0gNTtcbnZhciBJTkZMQVRFUkFXID0gNjtcbnZhciBVTlpJUCA9IDc7XG52YXIgWl9OT19GTFVTSD0gICAgICAgICAwLFxuICBaX1BBUlRJQUxfRkxVU0g9ICAgIDEsXG4gIFpfU1lOQ19GTFVTSD0gICAgMixcbiAgWl9GVUxMX0ZMVVNIPSAgICAgICAzLFxuICBaX0ZJTklTSD0gICAgICAgNCxcbiAgWl9CTE9DSz0gICAgICAgICAgIDUsXG4gIFpfVFJFRVM9ICAgICAgICAgICAgNixcblxuICAvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICAqL1xuICBaX09LPSAgICAgICAgICAgICAgIDAsXG4gIFpfU1RSRUFNX0VORD0gICAgICAgMSxcbiAgWl9ORUVEX0RJQ1Q9ICAgICAgMixcbiAgWl9FUlJOTz0gICAgICAgLTEsXG4gIFpfU1RSRUFNX0VSUk9SPSAgIC0yLFxuICBaX0RBVEFfRVJST1I9ICAgIC0zLFxuICAvL1pfTUVNX0VSUk9SOiAgICAgLTQsXG4gIFpfQlVGX0VSUk9SPSAgICAtNSxcbiAgLy9aX1ZFUlNJT05fRVJST1I6IC02LFxuXG4gIC8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuICBaX05PX0NPTVBSRVNTSU9OPSAgICAgICAgIDAsXG4gIFpfQkVTVF9TUEVFRD0gICAgICAgICAgICAgMSxcbiAgWl9CRVNUX0NPTVBSRVNTSU9OPSAgICAgICA5LFxuICBaX0RFRkFVTFRfQ09NUFJFU1NJT049ICAgLTEsXG5cblxuICBaX0ZJTFRFUkVEPSAgICAgICAgICAgICAgIDEsXG4gIFpfSFVGRk1BTl9PTkxZPSAgICAgICAgICAgMixcbiAgWl9STEU9ICAgICAgICAgICAgICAgICAgICAzLFxuICBaX0ZJWEVEPSAgICAgICAgICAgICAgICAgIDQsXG4gIFpfREVGQVVMVF9TVFJBVEVHWT0gICAgICAgMCxcblxuICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG4gIFpfQklOQVJZPSAgICAgICAgICAgICAgICAgMCxcbiAgWl9URVhUPSAgICAgICAgICAgICAgICAgICAxLFxuICAvL1pfQVNDSUk6ICAgICAgICAgICAgICAgIDEsIC8vID0gWl9URVhUIChkZXByZWNhdGVkKVxuICBaX1VOS05PV049ICAgICAgICAgICAgICAgIDIsXG5cbiAgLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG4gIFpfREVGTEFURUQ9ICAgICAgICAgICAgICAgODtcbmZ1bmN0aW9uIFpsaWIkMShtb2RlKSB7XG4gIGlmIChtb2RlIDwgREVGTEFURSB8fCBtb2RlID4gVU5aSVApXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIGFyZ3VtZW50Jyk7XG5cbiAgdGhpcy5tb2RlID0gbW9kZTtcbiAgdGhpcy5pbml0X2RvbmUgPSBmYWxzZTtcbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlO1xuICB0aGlzLnBlbmRpbmdfY2xvc2UgPSBmYWxzZTtcbiAgdGhpcy53aW5kb3dCaXRzID0gMDtcbiAgdGhpcy5sZXZlbCA9IDA7XG4gIHRoaXMubWVtTGV2ZWwgPSAwO1xuICB0aGlzLnN0cmF0ZWd5ID0gMDtcbiAgdGhpcy5kaWN0aW9uYXJ5ID0gbnVsbDtcbn1cblxuWmxpYiQxLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24od2luZG93Qml0cywgbGV2ZWwsIG1lbUxldmVsLCBzdHJhdGVneSwgZGljdGlvbmFyeSkge1xuICB0aGlzLndpbmRvd0JpdHMgPSB3aW5kb3dCaXRzO1xuICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIHRoaXMubWVtTGV2ZWwgPSBtZW1MZXZlbDtcbiAgdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAvLyBkaWN0aW9uYXJ5IG5vdCBzdXBwb3J0ZWQuXG5cbiAgaWYgKHRoaXMubW9kZSA9PT0gR1pJUCB8fCB0aGlzLm1vZGUgPT09IEdVTlpJUClcbiAgICB0aGlzLndpbmRvd0JpdHMgKz0gMTY7XG5cbiAgaWYgKHRoaXMubW9kZSA9PT0gVU5aSVApXG4gICAgdGhpcy53aW5kb3dCaXRzICs9IDMyO1xuXG4gIGlmICh0aGlzLm1vZGUgPT09IERFRkxBVEVSQVcgfHwgdGhpcy5tb2RlID09PSBJTkZMQVRFUkFXKVxuICAgIHRoaXMud2luZG93Qml0cyA9IC10aGlzLndpbmRvd0JpdHM7XG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdmFyIHN0YXR1cztcbiAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgY2FzZSBERUZMQVRFOlxuICBjYXNlIEdaSVA6XG4gIGNhc2UgREVGTEFURVJBVzpcbiAgICBzdGF0dXMgPSBkZWZsYXRlSW5pdDIoXG4gICAgICB0aGlzLnN0cm0sXG4gICAgICB0aGlzLmxldmVsLFxuICAgICAgWl9ERUZMQVRFRCxcbiAgICAgIHRoaXMud2luZG93Qml0cyxcbiAgICAgIHRoaXMubWVtTGV2ZWwsXG4gICAgICB0aGlzLnN0cmF0ZWd5XG4gICAgKTtcbiAgICBicmVhaztcbiAgY2FzZSBJTkZMQVRFOlxuICBjYXNlIEdVTlpJUDpcbiAgY2FzZSBJTkZMQVRFUkFXOlxuICBjYXNlIFVOWklQOlxuICAgIHN0YXR1cyAgPSBpbmZsYXRlSW5pdDIoXG4gICAgICB0aGlzLnN0cm0sXG4gICAgICB0aGlzLndpbmRvd0JpdHNcbiAgICApO1xuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtb2RlICcgKyB0aGlzLm1vZGUpO1xuICB9XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgIHRoaXMuX2Vycm9yKHN0YXR1cyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlO1xuICB0aGlzLmluaXRfZG9uZSA9IHRydWU7XG59O1xuXG5abGliJDEucHJvdG90eXBlLnBhcmFtcyA9IGZ1bmN0aW9uKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ2RlZmxhdGVQYXJhbXMgTm90IHN1cHBvcnRlZCcpO1xufTtcblxuWmxpYiQxLnByb3RvdHlwZS5fd3JpdGVDaGVjayA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuaW5pdF9kb25lKVxuICAgIHRocm93IG5ldyBFcnJvcignd3JpdGUgYmVmb3JlIGluaXQnKTtcblxuICBpZiAodGhpcy5tb2RlID09PSBOT05FKVxuICAgIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBmaW5hbGl6ZWQnKTtcblxuICBpZiAodGhpcy53cml0ZV9pbl9wcm9ncmVzcylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcblxuICBpZiAodGhpcy5wZW5kaW5nX2Nsb3NlKVxuICAgIHRocm93IG5ldyBFcnJvcignY2xvc2UgaXMgcGVuZGluZycpO1xufTtcblxuWmxpYiQxLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGZsdXNoLCBpbnB1dCwgaW5fb2ZmLCBpbl9sZW4sIG91dCwgb3V0X29mZiwgb3V0X2xlbikge1xuICB0aGlzLl93cml0ZUNoZWNrKCk7XG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSB0cnVlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgYnJvd3NlciQxLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgIHNlbGYud3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB2YXIgcmVzID0gc2VsZi5fd3JpdGUoZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKTtcbiAgICBzZWxmLmNhbGxiYWNrKHJlc1swXSwgcmVzWzFdKTtcblxuICAgIGlmIChzZWxmLnBlbmRpbmdfY2xvc2UpXG4gICAgICBzZWxmLmNsb3NlKCk7XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IG1ldGhvZCBmb3IgTm9kZSBidWZmZXJzLCB1c2VkIGJ5IHBha29cbmZ1bmN0aW9uIGJ1ZmZlclNldChkYXRhLCBvZmZzZXQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9IGRhdGFbaV07XG4gIH1cbn1cblxuWmxpYiQxLnByb3RvdHlwZS53cml0ZVN5bmMgPSBmdW5jdGlvbihmbHVzaCwgaW5wdXQsIGluX29mZiwgaW5fbGVuLCBvdXQsIG91dF9vZmYsIG91dF9sZW4pIHtcbiAgdGhpcy5fd3JpdGVDaGVjaygpO1xuICByZXR1cm4gdGhpcy5fd3JpdGUoZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKTtcbn07XG5cblpsaWIkMS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24oZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKSB7XG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSB0cnVlO1xuXG4gIGlmIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJlxuICAgICAgZmx1c2ggIT09IFpfUEFSVElBTF9GTFVTSCAmJlxuICAgICAgZmx1c2ggIT09IFpfU1lOQ19GTFVTSCAmJlxuICAgICAgZmx1c2ggIT09IFpfRlVMTF9GTFVTSCAmJlxuICAgICAgZmx1c2ggIT09IFpfRklOSVNIICYmXG4gICAgICBmbHVzaCAhPT0gWl9CTE9DSykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmbHVzaCB2YWx1ZScpO1xuICB9XG5cbiAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICBpbnB1dCA9IG5ldyBCdWZmZXIoMCk7XG4gICAgaW5fbGVuID0gMDtcbiAgICBpbl9vZmYgPSAwO1xuICB9XG5cbiAgaWYgKG91dC5fc2V0KVxuICAgIG91dC5zZXQgPSBvdXQuX3NldDtcbiAgZWxzZVxuICAgIG91dC5zZXQgPSBidWZmZXJTZXQ7XG5cbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHN0cm0uYXZhaWxfaW4gPSBpbl9sZW47XG4gIHN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgc3RybS5uZXh0X2luID0gaW5fb2ZmO1xuICBzdHJtLmF2YWlsX291dCA9IG91dF9sZW47XG4gIHN0cm0ub3V0cHV0ID0gb3V0O1xuICBzdHJtLm5leHRfb3V0ID0gb3V0X29mZjtcbiAgdmFyIHN0YXR1cztcbiAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgY2FzZSBERUZMQVRFOlxuICBjYXNlIEdaSVA6XG4gIGNhc2UgREVGTEFURVJBVzpcbiAgICBzdGF0dXMgPSBkZWZsYXRlJDEoc3RybSwgZmx1c2gpO1xuICAgIGJyZWFrO1xuICBjYXNlIFVOWklQOlxuICBjYXNlIElORkxBVEU6XG4gIGNhc2UgR1VOWklQOlxuICBjYXNlIElORkxBVEVSQVc6XG4gICAgc3RhdHVzID0gaW5mbGF0ZSQxKHN0cm0sIGZsdXNoKTtcbiAgICBicmVhaztcbiAgZGVmYXVsdDpcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbW9kZSAnICsgdGhpcy5tb2RlKTtcbiAgfVxuXG4gIGlmIChzdGF0dXMgIT09IFpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aGlzLl9lcnJvcihzdGF0dXMpO1xuICB9XG5cbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlO1xuICByZXR1cm4gW3N0cm0uYXZhaWxfaW4sIHN0cm0uYXZhaWxfb3V0XTtcbn07XG5cblpsaWIkMS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MpIHtcbiAgICB0aGlzLnBlbmRpbmdfY2xvc2UgPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMucGVuZGluZ19jbG9zZSA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLm1vZGUgPT09IERFRkxBVEUgfHwgdGhpcy5tb2RlID09PSBHWklQIHx8IHRoaXMubW9kZSA9PT0gREVGTEFURVJBVykge1xuICAgIGRlZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgfSBlbHNlIHtcbiAgICBpbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gIH1cblxuICB0aGlzLm1vZGUgPSBOT05FO1xufTtcbnZhciBzdGF0dXM7XG5abGliJDEucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gIGNhc2UgREVGTEFURTpcbiAgY2FzZSBERUZMQVRFUkFXOlxuICAgIHN0YXR1cyA9IGRlZmxhdGVSZXNldCh0aGlzLnN0cm0pO1xuICAgIGJyZWFrO1xuICBjYXNlIElORkxBVEU6XG4gIGNhc2UgSU5GTEFURVJBVzpcbiAgICBzdGF0dXMgPSBpbmZsYXRlUmVzZXQodGhpcy5zdHJtKTtcbiAgICBicmVhaztcbiAgfVxuXG4gIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICB0aGlzLl9lcnJvcihzdGF0dXMpO1xuICB9XG59O1xuXG5abGliJDEucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKHN0YXR1cykge1xuICB0aGlzLm9uZXJyb3IobXNnW3N0YXR1c10gKyAnOiAnICsgdGhpcy5zdHJtLm1zZywgc3RhdHVzKTtcblxuICB0aGlzLndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7XG4gIGlmICh0aGlzLnBlbmRpbmdfY2xvc2UpXG4gICAgdGhpcy5jbG9zZSgpO1xufTtcblxudmFyIF9iaW5kaW5nID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdERFRkxBVEU6IERFRkxBVEUsXG5cdERFRkxBVEVSQVc6IERFRkxBVEVSQVcsXG5cdEdVTlpJUDogR1VOWklQLFxuXHRHWklQOiBHWklQLFxuXHRJTkZMQVRFOiBJTkZMQVRFLFxuXHRJTkZMQVRFUkFXOiBJTkZMQVRFUkFXLFxuXHROT05FOiBOT05FLFxuXHRVTlpJUDogVU5aSVAsXG5cdFpfQkVTVF9DT01QUkVTU0lPTjogWl9CRVNUX0NPTVBSRVNTSU9OLFxuXHRaX0JFU1RfU1BFRUQ6IFpfQkVTVF9TUEVFRCxcblx0Wl9CSU5BUlk6IFpfQklOQVJZLFxuXHRaX0JMT0NLOiBaX0JMT0NLLFxuXHRaX0JVRl9FUlJPUjogWl9CVUZfRVJST1IsXG5cdFpfREFUQV9FUlJPUjogWl9EQVRBX0VSUk9SLFxuXHRaX0RFRkFVTFRfQ09NUFJFU1NJT046IFpfREVGQVVMVF9DT01QUkVTU0lPTixcblx0Wl9ERUZBVUxUX1NUUkFURUdZOiBaX0RFRkFVTFRfU1RSQVRFR1ksXG5cdFpfREVGTEFURUQ6IFpfREVGTEFURUQsXG5cdFpfRVJSTk86IFpfRVJSTk8sXG5cdFpfRklMVEVSRUQ6IFpfRklMVEVSRUQsXG5cdFpfRklOSVNIOiBaX0ZJTklTSCxcblx0Wl9GSVhFRDogWl9GSVhFRCxcblx0Wl9GVUxMX0ZMVVNIOiBaX0ZVTExfRkxVU0gsXG5cdFpfSFVGRk1BTl9PTkxZOiBaX0hVRkZNQU5fT05MWSxcblx0Wl9ORUVEX0RJQ1Q6IFpfTkVFRF9ESUNULFxuXHRaX05PX0NPTVBSRVNTSU9OOiBaX05PX0NPTVBSRVNTSU9OLFxuXHRaX05PX0ZMVVNIOiBaX05PX0ZMVVNILFxuXHRaX09LOiBaX09LLFxuXHRaX1BBUlRJQUxfRkxVU0g6IFpfUEFSVElBTF9GTFVTSCxcblx0Wl9STEU6IFpfUkxFLFxuXHRaX1NUUkVBTV9FTkQ6IFpfU1RSRUFNX0VORCxcblx0Wl9TVFJFQU1fRVJST1I6IFpfU1RSRUFNX0VSUk9SLFxuXHRaX1NZTkNfRkxVU0g6IFpfU1lOQ19GTFVTSCxcblx0Wl9URVhUOiBaX1RFWFQsXG5cdFpfVFJFRVM6IFpfVFJFRVMsXG5cdFpfVU5LTk9XTjogWl9VTktOT1dOLFxuXHRabGliOiBabGliJDFcbn0pO1xuXG5mdW5jdGlvbiBhc3NlcnQgKGEsIG1zZykge1xuICBpZiAoIWEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgfVxufVxudmFyIGJpbmRpbmcgPSB7fTtcbk9iamVjdC5rZXlzKF9iaW5kaW5nKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgYmluZGluZ1trZXldID0gX2JpbmRpbmdba2V5XTtcbn0pO1xuLy8gemxpYiBkb2Vzbid0IHByb3ZpZGUgdGhlc2UsIHNvIGtsdWRnZSB0aGVtIGluIGZvbGxvd2luZyB0aGUgc2FtZVxuLy8gY29uc3QgbmFtaW5nIHNjaGVtZSB6bGliIHVzZXMuXG5iaW5kaW5nLlpfTUlOX1dJTkRPV0JJVFMgPSA4O1xuYmluZGluZy5aX01BWF9XSU5ET1dCSVRTID0gMTU7XG5iaW5kaW5nLlpfREVGQVVMVF9XSU5ET1dCSVRTID0gMTU7XG5cbi8vIGZld2VyIHRoYW4gNjQgYnl0ZXMgcGVyIGNodW5rIGlzIHN0dXBpZC5cbi8vIHRlY2huaWNhbGx5IGl0IGNvdWxkIHdvcmsgd2l0aCBhcyBmZXcgYXMgOCwgYnV0IGV2ZW4gNjQgYnl0ZXNcbi8vIGlzIGFic3VyZGx5IGxvdy4gIFVzdWFsbHkgYSBNQiBvciBtb3JlIGlzIGJlc3QuXG5iaW5kaW5nLlpfTUlOX0NIVU5LID0gNjQ7XG5iaW5kaW5nLlpfTUFYX0NIVU5LID0gSW5maW5pdHk7XG5iaW5kaW5nLlpfREVGQVVMVF9DSFVOSyA9ICgxNiAqIDEwMjQpO1xuXG5iaW5kaW5nLlpfTUlOX01FTUxFVkVMID0gMTtcbmJpbmRpbmcuWl9NQVhfTUVNTEVWRUwgPSA5O1xuYmluZGluZy5aX0RFRkFVTFRfTUVNTEVWRUwgPSA4O1xuXG5iaW5kaW5nLlpfTUlOX0xFVkVMID0gLTE7XG5iaW5kaW5nLlpfTUFYX0xFVkVMID0gOTtcbmJpbmRpbmcuWl9ERUZBVUxUX0xFVkVMID0gYmluZGluZy5aX0RFRkFVTFRfQ09NUFJFU1NJT047XG5cblxuLy8gdHJhbnNsYXRpb24gdGFibGUgZm9yIHJldHVybiBjb2Rlcy5cbnZhciBjb2RlcyA9IHtcbiAgWl9PSzogYmluZGluZy5aX09LLFxuICBaX1NUUkVBTV9FTkQ6IGJpbmRpbmcuWl9TVFJFQU1fRU5ELFxuICBaX05FRURfRElDVDogYmluZGluZy5aX05FRURfRElDVCxcbiAgWl9FUlJOTzogYmluZGluZy5aX0VSUk5PLFxuICBaX1NUUkVBTV9FUlJPUjogYmluZGluZy5aX1NUUkVBTV9FUlJPUixcbiAgWl9EQVRBX0VSUk9SOiBiaW5kaW5nLlpfREFUQV9FUlJPUixcbiAgWl9NRU1fRVJST1I6IGJpbmRpbmcuWl9NRU1fRVJST1IsXG4gIFpfQlVGX0VSUk9SOiBiaW5kaW5nLlpfQlVGX0VSUk9SLFxuICBaX1ZFUlNJT05fRVJST1I6IGJpbmRpbmcuWl9WRVJTSU9OX0VSUk9SXG59O1xuXG5PYmplY3Qua2V5cyhjb2RlcykuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gIGNvZGVzW2NvZGVzW2tdXSA9IGs7XG59KTtcblxuZnVuY3Rpb24gY3JlYXRlRGVmbGF0ZShvKSB7XG4gIHJldHVybiBuZXcgRGVmbGF0ZShvKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW5mbGF0ZShvKSB7XG4gIHJldHVybiBuZXcgSW5mbGF0ZShvKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVmbGF0ZVJhdyhvKSB7XG4gIHJldHVybiBuZXcgRGVmbGF0ZVJhdyhvKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW5mbGF0ZVJhdyhvKSB7XG4gIHJldHVybiBuZXcgSW5mbGF0ZVJhdyhvKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlR3ppcChvKSB7XG4gIHJldHVybiBuZXcgR3ppcChvKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlR3VuemlwKG8pIHtcbiAgcmV0dXJuIG5ldyBHdW56aXAobyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVuemlwKG8pIHtcbiAgcmV0dXJuIG5ldyBVbnppcChvKTtcbn1cblxuXG4vLyBDb252ZW5pZW5jZSBtZXRob2RzLlxuLy8gY29tcHJlc3MvZGVjb21wcmVzcyBhIHN0cmluZyBvciBidWZmZXIgaW4gb25lIHN0ZXAuXG5mdW5jdGlvbiBkZWZsYXRlKGJ1ZmZlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICByZXR1cm4gemxpYkJ1ZmZlcihuZXcgRGVmbGF0ZShvcHRzKSwgYnVmZmVyLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVTeW5jKGJ1ZmZlciwgb3B0cykge1xuICByZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IERlZmxhdGUob3B0cyksIGJ1ZmZlcik7XG59XG5cbmZ1bmN0aW9uIGd6aXAoYnVmZmVyLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIHJldHVybiB6bGliQnVmZmVyKG5ldyBHemlwKG9wdHMpLCBidWZmZXIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ3ppcFN5bmMoYnVmZmVyLCBvcHRzKSB7XG4gIHJldHVybiB6bGliQnVmZmVyU3luYyhuZXcgR3ppcChvcHRzKSwgYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZVJhdyhidWZmZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgcmV0dXJuIHpsaWJCdWZmZXIobmV3IERlZmxhdGVSYXcob3B0cyksIGJ1ZmZlciwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlUmF3U3luYyhidWZmZXIsIG9wdHMpIHtcbiAgcmV0dXJuIHpsaWJCdWZmZXJTeW5jKG5ldyBEZWZsYXRlUmF3KG9wdHMpLCBidWZmZXIpO1xufVxuXG5mdW5jdGlvbiB1bnppcChidWZmZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgcmV0dXJuIHpsaWJCdWZmZXIobmV3IFVuemlwKG9wdHMpLCBidWZmZXIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gdW56aXBTeW5jKGJ1ZmZlciwgb3B0cykge1xuICByZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IFVuemlwKG9wdHMpLCBidWZmZXIpO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKGJ1ZmZlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICByZXR1cm4gemxpYkJ1ZmZlcihuZXcgSW5mbGF0ZShvcHRzKSwgYnVmZmVyLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVTeW5jKGJ1ZmZlciwgb3B0cykge1xuICByZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IEluZmxhdGUob3B0cyksIGJ1ZmZlcik7XG59XG5cbmZ1bmN0aW9uIGd1bnppcChidWZmZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgcmV0dXJuIHpsaWJCdWZmZXIobmV3IEd1bnppcChvcHRzKSwgYnVmZmVyLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGd1bnppcFN5bmMoYnVmZmVyLCBvcHRzKSB7XG4gIHJldHVybiB6bGliQnVmZmVyU3luYyhuZXcgR3VuemlwKG9wdHMpLCBidWZmZXIpO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmF3KGJ1ZmZlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICByZXR1cm4gemxpYkJ1ZmZlcihuZXcgSW5mbGF0ZVJhdyhvcHRzKSwgYnVmZmVyLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSYXdTeW5jKGJ1ZmZlciwgb3B0cykge1xuICByZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IEluZmxhdGVSYXcob3B0cyksIGJ1ZmZlcik7XG59XG5cbmZ1bmN0aW9uIHpsaWJCdWZmZXIoZW5naW5lLCBidWZmZXIsIGNhbGxiYWNrKSB7XG4gIHZhciBidWZmZXJzID0gW107XG4gIHZhciBucmVhZCA9IDA7XG5cbiAgZW5naW5lLm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICBlbmdpbmUub24oJ2VuZCcsIG9uRW5kKTtcblxuICBlbmdpbmUuZW5kKGJ1ZmZlcik7XG4gIGZsb3coKTtcblxuICBmdW5jdGlvbiBmbG93KCkge1xuICAgIHZhciBjaHVuaztcbiAgICB3aGlsZSAobnVsbCAhPT0gKGNodW5rID0gZW5naW5lLnJlYWQoKSkpIHtcbiAgICAgIGJ1ZmZlcnMucHVzaChjaHVuayk7XG4gICAgICBucmVhZCArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuICAgIGVuZ2luZS5vbmNlKCdyZWFkYWJsZScsIGZsb3cpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25FcnJvcihlcnIpIHtcbiAgICBlbmdpbmUucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uRW5kKTtcbiAgICBlbmdpbmUucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgZmxvdyk7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRW5kKCkge1xuICAgIHZhciBidWYgPSBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMsIG5yZWFkKTtcbiAgICBidWZmZXJzID0gW107XG4gICAgY2FsbGJhY2sobnVsbCwgYnVmKTtcbiAgICBlbmdpbmUuY2xvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB6bGliQnVmZmVyU3luYyhlbmdpbmUsIGJ1ZmZlcikge1xuICBpZiAodHlwZW9mIGJ1ZmZlciA9PT0gJ3N0cmluZycpXG4gICAgYnVmZmVyID0gbmV3IEJ1ZmZlcihidWZmZXIpO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWZmZXIpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vdCBhIHN0cmluZyBvciBidWZmZXInKTtcblxuICB2YXIgZmx1c2hGbGFnID0gYmluZGluZy5aX0ZJTklTSDtcblxuICByZXR1cm4gZW5naW5lLl9wcm9jZXNzQ2h1bmsoYnVmZmVyLCBmbHVzaEZsYWcpO1xufVxuXG4vLyBnZW5lcmljIHpsaWJcbi8vIG1pbmltYWwgMi1ieXRlIGhlYWRlclxuZnVuY3Rpb24gRGVmbGF0ZShvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlKSkgcmV0dXJuIG5ldyBEZWZsYXRlKG9wdHMpO1xuICBabGliLmNhbGwodGhpcywgb3B0cywgYmluZGluZy5ERUZMQVRFKTtcbn1cblxuZnVuY3Rpb24gSW5mbGF0ZShvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBJbmZsYXRlKSkgcmV0dXJuIG5ldyBJbmZsYXRlKG9wdHMpO1xuICBabGliLmNhbGwodGhpcywgb3B0cywgYmluZGluZy5JTkZMQVRFKTtcbn1cblxuXG5cbi8vIGd6aXAgLSBiaWdnZXIgaGVhZGVyLCBzYW1lIGRlZmxhdGUgY29tcHJlc3Npb25cbmZ1bmN0aW9uIEd6aXAob3B0cykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgR3ppcCkpIHJldHVybiBuZXcgR3ppcChvcHRzKTtcbiAgWmxpYi5jYWxsKHRoaXMsIG9wdHMsIGJpbmRpbmcuR1pJUCk7XG59XG5cbmZ1bmN0aW9uIEd1bnppcChvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBHdW56aXApKSByZXR1cm4gbmV3IEd1bnppcChvcHRzKTtcbiAgWmxpYi5jYWxsKHRoaXMsIG9wdHMsIGJpbmRpbmcuR1VOWklQKTtcbn1cblxuXG5cbi8vIHJhdyAtIG5vIGhlYWRlclxuZnVuY3Rpb24gRGVmbGF0ZVJhdyhvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEZWZsYXRlUmF3KSkgcmV0dXJuIG5ldyBEZWZsYXRlUmF3KG9wdHMpO1xuICBabGliLmNhbGwodGhpcywgb3B0cywgYmluZGluZy5ERUZMQVRFUkFXKTtcbn1cblxuZnVuY3Rpb24gSW5mbGF0ZVJhdyhvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBJbmZsYXRlUmF3KSkgcmV0dXJuIG5ldyBJbmZsYXRlUmF3KG9wdHMpO1xuICBabGliLmNhbGwodGhpcywgb3B0cywgYmluZGluZy5JTkZMQVRFUkFXKTtcbn1cblxuXG4vLyBhdXRvLWRldGVjdCBoZWFkZXIuXG5mdW5jdGlvbiBVbnppcChvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBVbnppcCkpIHJldHVybiBuZXcgVW56aXAob3B0cyk7XG4gIFpsaWIuY2FsbCh0aGlzLCBvcHRzLCBiaW5kaW5nLlVOWklQKTtcbn1cblxuXG4vLyB0aGUgWmxpYiBjbGFzcyB0aGV5IGFsbCBpbmhlcml0IGZyb21cbi8vIFRoaXMgdGhpbmcgbWFuYWdlcyB0aGUgcXVldWUgb2YgcmVxdWVzdHMsIGFuZCByZXR1cm5zXG4vLyB0cnVlIG9yIGZhbHNlIGlmIHRoZXJlIGlzIGFueXRoaW5nIGluIHRoZSBxdWV1ZSB3aGVuXG4vLyB5b3UgY2FsbCB0aGUgLndyaXRlKCkgbWV0aG9kLlxuXG5mdW5jdGlvbiBabGliKG9wdHMsIG1vZGUpIHtcbiAgdGhpcy5fb3B0cyA9IG9wdHMgPSBvcHRzIHx8IHt9O1xuICB0aGlzLl9jaHVua1NpemUgPSBvcHRzLmNodW5rU2l6ZSB8fCBiaW5kaW5nLlpfREVGQVVMVF9DSFVOSztcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRzKTtcblxuICBpZiAob3B0cy5mbHVzaCkge1xuICAgIGlmIChvcHRzLmZsdXNoICE9PSBiaW5kaW5nLlpfTk9fRkxVU0ggJiZcbiAgICAgICAgb3B0cy5mbHVzaCAhPT0gYmluZGluZy5aX1BBUlRJQUxfRkxVU0ggJiZcbiAgICAgICAgb3B0cy5mbHVzaCAhPT0gYmluZGluZy5aX1NZTkNfRkxVU0ggJiZcbiAgICAgICAgb3B0cy5mbHVzaCAhPT0gYmluZGluZy5aX0ZVTExfRkxVU0ggJiZcbiAgICAgICAgb3B0cy5mbHVzaCAhPT0gYmluZGluZy5aX0ZJTklTSCAmJlxuICAgICAgICBvcHRzLmZsdXNoICE9PSBiaW5kaW5nLlpfQkxPQ0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmbHVzaCBmbGFnOiAnICsgb3B0cy5mbHVzaCk7XG4gICAgfVxuICB9XG4gIHRoaXMuX2ZsdXNoRmxhZyA9IG9wdHMuZmx1c2ggfHwgYmluZGluZy5aX05PX0ZMVVNIO1xuXG4gIGlmIChvcHRzLmNodW5rU2l6ZSkge1xuICAgIGlmIChvcHRzLmNodW5rU2l6ZSA8IGJpbmRpbmcuWl9NSU5fQ0hVTksgfHxcbiAgICAgICAgb3B0cy5jaHVua1NpemUgPiBiaW5kaW5nLlpfTUFYX0NIVU5LKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2h1bmsgc2l6ZTogJyArIG9wdHMuY2h1bmtTaXplKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy53aW5kb3dCaXRzKSB7XG4gICAgaWYgKG9wdHMud2luZG93Qml0cyA8IGJpbmRpbmcuWl9NSU5fV0lORE9XQklUUyB8fFxuICAgICAgICBvcHRzLndpbmRvd0JpdHMgPiBiaW5kaW5nLlpfTUFYX1dJTkRPV0JJVFMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB3aW5kb3dCaXRzOiAnICsgb3B0cy53aW5kb3dCaXRzKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5sZXZlbCkge1xuICAgIGlmIChvcHRzLmxldmVsIDwgYmluZGluZy5aX01JTl9MRVZFTCB8fFxuICAgICAgICBvcHRzLmxldmVsID4gYmluZGluZy5aX01BWF9MRVZFTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsOiAnICsgb3B0cy5sZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMubWVtTGV2ZWwpIHtcbiAgICBpZiAob3B0cy5tZW1MZXZlbCA8IGJpbmRpbmcuWl9NSU5fTUVNTEVWRUwgfHxcbiAgICAgICAgb3B0cy5tZW1MZXZlbCA+IGJpbmRpbmcuWl9NQVhfTUVNTEVWRUwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtZW1MZXZlbDogJyArIG9wdHMubWVtTGV2ZWwpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLnN0cmF0ZWd5KSB7XG4gICAgaWYgKG9wdHMuc3RyYXRlZ3kgIT0gYmluZGluZy5aX0ZJTFRFUkVEICYmXG4gICAgICAgIG9wdHMuc3RyYXRlZ3kgIT0gYmluZGluZy5aX0hVRkZNQU5fT05MWSAmJlxuICAgICAgICBvcHRzLnN0cmF0ZWd5ICE9IGJpbmRpbmcuWl9STEUgJiZcbiAgICAgICAgb3B0cy5zdHJhdGVneSAhPSBiaW5kaW5nLlpfRklYRUQgJiZcbiAgICAgICAgb3B0cy5zdHJhdGVneSAhPSBiaW5kaW5nLlpfREVGQVVMVF9TVFJBVEVHWSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmF0ZWd5OiAnICsgb3B0cy5zdHJhdGVneSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMuZGljdGlvbmFyeSkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKG9wdHMuZGljdGlvbmFyeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkaWN0aW9uYXJ5OiBpdCBzaG91bGQgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9iaW5kaW5nID0gbmV3IGJpbmRpbmcuWmxpYihtb2RlKTtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX2hhZEVycm9yID0gZmFsc2U7XG4gIHRoaXMuX2JpbmRpbmcub25lcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGVycm5vKSB7XG4gICAgLy8gdGhlcmUgaXMgbm8gd2F5IHRvIGNsZWFubHkgcmVjb3Zlci5cbiAgICAvLyBjb250aW51aW5nIG9ubHkgb2JzY3VyZXMgcHJvYmxlbXMuXG4gICAgc2VsZi5fYmluZGluZyA9IG51bGw7XG4gICAgc2VsZi5faGFkRXJyb3IgPSB0cnVlO1xuXG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIGVycm9yLmVycm5vID0gZXJybm87XG4gICAgZXJyb3IuY29kZSA9IGJpbmRpbmcuY29kZXNbZXJybm9dO1xuICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gIH07XG5cbiAgdmFyIGxldmVsID0gYmluZGluZy5aX0RFRkFVTFRfQ09NUFJFU1NJT047XG4gIGlmICh0eXBlb2Ygb3B0cy5sZXZlbCA9PT0gJ251bWJlcicpIGxldmVsID0gb3B0cy5sZXZlbDtcblxuICB2YXIgc3RyYXRlZ3kgPSBiaW5kaW5nLlpfREVGQVVMVF9TVFJBVEVHWTtcbiAgaWYgKHR5cGVvZiBvcHRzLnN0cmF0ZWd5ID09PSAnbnVtYmVyJykgc3RyYXRlZ3kgPSBvcHRzLnN0cmF0ZWd5O1xuXG4gIHRoaXMuX2JpbmRpbmcuaW5pdChvcHRzLndpbmRvd0JpdHMgfHwgYmluZGluZy5aX0RFRkFVTFRfV0lORE9XQklUUyxcbiAgICAgICAgICAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgICAgICAgICAgb3B0cy5tZW1MZXZlbCB8fCBiaW5kaW5nLlpfREVGQVVMVF9NRU1MRVZFTCxcbiAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICAgb3B0cy5kaWN0aW9uYXJ5KTtcblxuICB0aGlzLl9idWZmZXIgPSBuZXcgQnVmZmVyKHRoaXMuX2NodW5rU2l6ZSk7XG4gIHRoaXMuX29mZnNldCA9IDA7XG4gIHRoaXMuX2Nsb3NlZCA9IGZhbHNlO1xuICB0aGlzLl9sZXZlbCA9IGxldmVsO1xuICB0aGlzLl9zdHJhdGVneSA9IHN0cmF0ZWd5O1xuXG4gIHRoaXMub25jZSgnZW5kJywgdGhpcy5jbG9zZSk7XG59XG5cbmluaGVyaXRzJDEoWmxpYiwgVHJhbnNmb3JtKTtcblxuWmxpYi5wcm90b3R5cGUucGFyYW1zID0gZnVuY3Rpb24obGV2ZWwsIHN0cmF0ZWd5LCBjYWxsYmFjaykge1xuICBpZiAobGV2ZWwgPCBiaW5kaW5nLlpfTUlOX0xFVkVMIHx8XG4gICAgICBsZXZlbCA+IGJpbmRpbmcuWl9NQVhfTEVWRUwpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBjb21wcmVzc2lvbiBsZXZlbDogJyArIGxldmVsKTtcbiAgfVxuICBpZiAoc3RyYXRlZ3kgIT0gYmluZGluZy5aX0ZJTFRFUkVEICYmXG4gICAgICBzdHJhdGVneSAhPSBiaW5kaW5nLlpfSFVGRk1BTl9PTkxZICYmXG4gICAgICBzdHJhdGVneSAhPSBiaW5kaW5nLlpfUkxFICYmXG4gICAgICBzdHJhdGVneSAhPSBiaW5kaW5nLlpfRklYRUQgJiZcbiAgICAgIHN0cmF0ZWd5ICE9IGJpbmRpbmcuWl9ERUZBVUxUX1NUUkFURUdZKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBzdHJhdGVneTogJyArIHN0cmF0ZWd5KTtcbiAgfVxuXG4gIGlmICh0aGlzLl9sZXZlbCAhPT0gbGV2ZWwgfHwgdGhpcy5fc3RyYXRlZ3kgIT09IHN0cmF0ZWd5KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZmx1c2goYmluZGluZy5aX1NZTkNfRkxVU0gsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5fYmluZGluZy5wYXJhbXMobGV2ZWwsIHN0cmF0ZWd5KTtcbiAgICAgIGlmICghc2VsZi5faGFkRXJyb3IpIHtcbiAgICAgICAgc2VsZi5fbGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgc2VsZi5fc3RyYXRlZ3kgPSBzdHJhdGVneTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJyb3dzZXIkMS5uZXh0VGljayhjYWxsYmFjayk7XG4gIH1cbn07XG5cblpsaWIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9iaW5kaW5nLnJlc2V0KCk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBfZmx1c2ggZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSB0cmFuc2Zvcm0gY2xhc3MsXG4vLyBpbnRlcm5hbGx5LCB3aGVuIHRoZSBsYXN0IGNodW5rIGhhcyBiZWVuIHdyaXR0ZW4uXG5abGliLnByb3RvdHlwZS5fZmx1c2ggPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICB0aGlzLl90cmFuc2Zvcm0obmV3IEJ1ZmZlcigwKSwgJycsIGNhbGxiYWNrKTtcbn07XG5cblpsaWIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oa2luZCwgY2FsbGJhY2spIHtcbiAgdmFyIHdzID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGtpbmQgPT09ICdmdW5jdGlvbicgfHwgKGtpbmQgPT09IHZvaWQgMCAmJiAhY2FsbGJhY2spKSB7XG4gICAgY2FsbGJhY2sgPSBraW5kO1xuICAgIGtpbmQgPSBiaW5kaW5nLlpfRlVMTF9GTFVTSDtcbiAgfVxuXG4gIGlmICh3cy5lbmRlZCkge1xuICAgIGlmIChjYWxsYmFjaylcbiAgICAgIGJyb3dzZXIkMS5uZXh0VGljayhjYWxsYmFjayk7XG4gIH0gZWxzZSBpZiAod3MuZW5kaW5nKSB7XG4gICAgaWYgKGNhbGxiYWNrKVxuICAgICAgdGhpcy5vbmNlKCdlbmQnLCBjYWxsYmFjayk7XG4gIH0gZWxzZSBpZiAod3MubmVlZERyYWluKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMub25jZSgnZHJhaW4nLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZmx1c2goY2FsbGJhY2spO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX2ZsdXNoRmxhZyA9IGtpbmQ7XG4gICAgdGhpcy53cml0ZShuZXcgQnVmZmVyKDApLCAnJywgY2FsbGJhY2spO1xuICB9XG59O1xuXG5abGliLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjaylcbiAgICBicm93c2VyJDEubmV4dFRpY2soY2FsbGJhY2spO1xuXG4gIGlmICh0aGlzLl9jbG9zZWQpXG4gICAgcmV0dXJuO1xuXG4gIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG5cbiAgdGhpcy5fYmluZGluZy5jbG9zZSgpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgYnJvd3NlciQxLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgIHNlbGYuZW1pdCgnY2xvc2UnKTtcbiAgfSk7XG59O1xuXG5abGliLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgZmx1c2hGbGFnO1xuICB2YXIgd3MgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgZW5kaW5nID0gd3MuZW5kaW5nIHx8IHdzLmVuZGVkO1xuICB2YXIgbGFzdCA9IGVuZGluZyAmJiAoIWNodW5rIHx8IHdzLmxlbmd0aCA9PT0gY2h1bmsubGVuZ3RoKTtcblxuICBpZiAoIWNodW5rID09PSBudWxsICYmICFCdWZmZXIuaXNCdWZmZXIoY2h1bmspKVxuICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ2ludmFsaWQgaW5wdXQnKSk7XG5cbiAgLy8gSWYgaXQncyB0aGUgbGFzdCBjaHVuaywgb3IgYSBmaW5hbCBmbHVzaCwgd2UgdXNlIHRoZSBaX0ZJTklTSCBmbHVzaCBmbGFnLlxuICAvLyBJZiBpdCdzIGV4cGxpY2l0bHkgZmx1c2hpbmcgYXQgc29tZSBvdGhlciB0aW1lLCB0aGVuIHdlIHVzZVxuICAvLyBaX0ZVTExfRkxVU0guIE90aGVyd2lzZSwgdXNlIFpfTk9fRkxVU0ggZm9yIG1heGltdW0gY29tcHJlc3Npb25cbiAgLy8gZ29vZG5lc3MuXG4gIGlmIChsYXN0KVxuICAgIGZsdXNoRmxhZyA9IGJpbmRpbmcuWl9GSU5JU0g7XG4gIGVsc2Uge1xuICAgIGZsdXNoRmxhZyA9IHRoaXMuX2ZsdXNoRmxhZztcbiAgICAvLyBvbmNlIHdlJ3ZlIGZsdXNoZWQgdGhlIGxhc3Qgb2YgdGhlIHF1ZXVlLCBzdG9wIGZsdXNoaW5nIGFuZFxuICAgIC8vIGdvIGJhY2sgdG8gdGhlIG5vcm1hbCBiZWhhdmlvci5cbiAgICBpZiAoY2h1bmsubGVuZ3RoID49IHdzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fZmx1c2hGbGFnID0gdGhpcy5fb3B0cy5mbHVzaCB8fCBiaW5kaW5nLlpfTk9fRkxVU0g7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5fcHJvY2Vzc0NodW5rKGNodW5rLCBmbHVzaEZsYWcsIGNiKTtcbn07XG5cblpsaWIucHJvdG90eXBlLl9wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbihjaHVuaywgZmx1c2hGbGFnLCBjYikge1xuICB2YXIgYXZhaWxJbkJlZm9yZSA9IGNodW5rICYmIGNodW5rLmxlbmd0aDtcbiAgdmFyIGF2YWlsT3V0QmVmb3JlID0gdGhpcy5fY2h1bmtTaXplIC0gdGhpcy5fb2Zmc2V0O1xuICB2YXIgaW5PZmYgPSAwO1xuXG4gIHZhciBzZWxmID0gdGhpcztcblxuICB2YXIgYXN5bmMgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbic7XG5cbiAgaWYgKCFhc3luYykge1xuICAgIHZhciBidWZmZXJzID0gW107XG4gICAgdmFyIG5yZWFkID0gMDtcblxuICAgIHZhciBlcnJvcjtcbiAgICB0aGlzLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVyKSB7XG4gICAgICBlcnJvciA9IGVyO1xuICAgIH0pO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHJlcyA9IHRoaXMuX2JpbmRpbmcud3JpdGVTeW5jKGZsdXNoRmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuaywgLy8gaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZiwgLy8gaW5fb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxJbkJlZm9yZSwgLy8gaW5fbGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyLCAvLyBvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vZmZzZXQsIC8vb3V0X29mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsT3V0QmVmb3JlKTsgLy8gb3V0X2xlblxuICAgIH0gd2hpbGUgKCF0aGlzLl9oYWRFcnJvciAmJiBjYWxsYmFjayhyZXNbMF0sIHJlc1sxXSkpO1xuXG4gICAgaWYgKHRoaXMuX2hhZEVycm9yKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICB2YXIgYnVmID0gQnVmZmVyLmNvbmNhdChidWZmZXJzLCBucmVhZCk7XG4gICAgdGhpcy5jbG9zZSgpO1xuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHZhciByZXEgPSB0aGlzLl9iaW5kaW5nLndyaXRlKGZsdXNoRmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmssIC8vIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2ZmLCAvLyBpbl9vZmZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxJbkJlZm9yZSwgLy8gaW5fbGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmZlciwgLy8gb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29mZnNldCwgLy9vdXRfb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsT3V0QmVmb3JlKTsgLy8gb3V0X2xlblxuXG4gIHJlcS5idWZmZXIgPSBjaHVuaztcbiAgcmVxLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2soYXZhaWxJbkFmdGVyLCBhdmFpbE91dEFmdGVyKSB7XG4gICAgaWYgKHNlbGYuX2hhZEVycm9yKVxuICAgICAgcmV0dXJuO1xuXG4gICAgdmFyIGhhdmUgPSBhdmFpbE91dEJlZm9yZSAtIGF2YWlsT3V0QWZ0ZXI7XG4gICAgYXNzZXJ0KGhhdmUgPj0gMCwgJ2hhdmUgc2hvdWxkIG5vdCBnbyBkb3duJyk7XG5cbiAgICBpZiAoaGF2ZSA+IDApIHtcbiAgICAgIHZhciBvdXQgPSBzZWxmLl9idWZmZXIuc2xpY2Uoc2VsZi5fb2Zmc2V0LCBzZWxmLl9vZmZzZXQgKyBoYXZlKTtcbiAgICAgIHNlbGYuX29mZnNldCArPSBoYXZlO1xuICAgICAgLy8gc2VydmUgc29tZSBvdXRwdXQgdG8gdGhlIGNvbnN1bWVyLlxuICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgIHNlbGYucHVzaChvdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVycy5wdXNoKG91dCk7XG4gICAgICAgIG5yZWFkICs9IG91dC5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXhoYXVzdGVkIHRoZSBvdXRwdXQgYnVmZmVyLCBvciB1c2VkIGFsbCB0aGUgaW5wdXQgY3JlYXRlIGEgbmV3IG9uZS5cbiAgICBpZiAoYXZhaWxPdXRBZnRlciA9PT0gMCB8fCBzZWxmLl9vZmZzZXQgPj0gc2VsZi5fY2h1bmtTaXplKSB7XG4gICAgICBhdmFpbE91dEJlZm9yZSA9IHNlbGYuX2NodW5rU2l6ZTtcbiAgICAgIHNlbGYuX29mZnNldCA9IDA7XG4gICAgICBzZWxmLl9idWZmZXIgPSBuZXcgQnVmZmVyKHNlbGYuX2NodW5rU2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKGF2YWlsT3V0QWZ0ZXIgPT09IDApIHtcbiAgICAgIC8vIE5vdCBhY3R1YWxseSBkb25lLiAgTmVlZCB0byByZXByb2Nlc3MuXG4gICAgICAvLyBBbHNvLCB1cGRhdGUgdGhlIGF2YWlsSW5CZWZvcmUgdG8gdGhlIGF2YWlsSW5BZnRlciB2YWx1ZSxcbiAgICAgIC8vIHNvIHRoYXQgaWYgd2UgaGF2ZSB0byBoaXQgaXQgYSB0aGlyZCAoZm91cnRoLCBldGMuKSB0aW1lLFxuICAgICAgLy8gaXQnbGwgaGF2ZSB0aGUgY29ycmVjdCBieXRlIGNvdW50cy5cbiAgICAgIGluT2ZmICs9IChhdmFpbEluQmVmb3JlIC0gYXZhaWxJbkFmdGVyKTtcbiAgICAgIGF2YWlsSW5CZWZvcmUgPSBhdmFpbEluQWZ0ZXI7XG5cbiAgICAgIGlmICghYXN5bmMpXG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICB2YXIgbmV3UmVxID0gc2VsZi5fYmluZGluZy53cml0ZShmbHVzaEZsYWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2ZmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxJbkJlZm9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2J1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX29mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NodW5rU2l6ZSk7XG4gICAgICBuZXdSZXEuY2FsbGJhY2sgPSBjYWxsYmFjazsgLy8gdGhpcyBzYW1lIGZ1bmN0aW9uXG4gICAgICBuZXdSZXEuYnVmZmVyID0gY2h1bms7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhc3luYylcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIC8vIGZpbmlzaGVkIHdpdGggdGhlIGNodW5rLlxuICAgIGNiKCk7XG4gIH1cbn07XG5cbmluaGVyaXRzJDEoRGVmbGF0ZSwgWmxpYik7XG5pbmhlcml0cyQxKEluZmxhdGUsIFpsaWIpO1xuaW5oZXJpdHMkMShHemlwLCBabGliKTtcbmluaGVyaXRzJDEoR3VuemlwLCBabGliKTtcbmluaGVyaXRzJDEoRGVmbGF0ZVJhdywgWmxpYik7XG5pbmhlcml0cyQxKEluZmxhdGVSYXcsIFpsaWIpO1xuaW5oZXJpdHMkMShVbnppcCwgWmxpYik7XG52YXIgX3BvbHlmaWxsTm9kZV96bGliID0ge1xuICBjb2RlczogY29kZXMsXG4gIGNyZWF0ZURlZmxhdGU6IGNyZWF0ZURlZmxhdGUsXG4gIGNyZWF0ZUluZmxhdGU6IGNyZWF0ZUluZmxhdGUsXG4gIGNyZWF0ZURlZmxhdGVSYXc6IGNyZWF0ZURlZmxhdGVSYXcsXG4gIGNyZWF0ZUluZmxhdGVSYXc6IGNyZWF0ZUluZmxhdGVSYXcsXG4gIGNyZWF0ZUd6aXA6IGNyZWF0ZUd6aXAsXG4gIGNyZWF0ZUd1bnppcDogY3JlYXRlR3VuemlwLFxuICBjcmVhdGVVbnppcDogY3JlYXRlVW56aXAsXG4gIGRlZmxhdGU6IGRlZmxhdGUsXG4gIGRlZmxhdGVTeW5jOiBkZWZsYXRlU3luYyxcbiAgZ3ppcDogZ3ppcCxcbiAgZ3ppcFN5bmM6IGd6aXBTeW5jLFxuICBkZWZsYXRlUmF3OiBkZWZsYXRlUmF3LFxuICBkZWZsYXRlUmF3U3luYzogZGVmbGF0ZVJhd1N5bmMsXG4gIHVuemlwOiB1bnppcCxcbiAgdW56aXBTeW5jOiB1bnppcFN5bmMsXG4gIGluZmxhdGU6IGluZmxhdGUsXG4gIGluZmxhdGVTeW5jOiBpbmZsYXRlU3luYyxcbiAgZ3VuemlwOiBndW56aXAsXG4gIGd1bnppcFN5bmM6IGd1bnppcFN5bmMsXG4gIGluZmxhdGVSYXc6IGluZmxhdGVSYXcsXG4gIGluZmxhdGVSYXdTeW5jOiBpbmZsYXRlUmF3U3luYyxcbiAgRGVmbGF0ZTogRGVmbGF0ZSxcbiAgSW5mbGF0ZTogSW5mbGF0ZSxcbiAgR3ppcDogR3ppcCxcbiAgR3VuemlwOiBHdW56aXAsXG4gIERlZmxhdGVSYXc6IERlZmxhdGVSYXcsXG4gIEluZmxhdGVSYXc6IEluZmxhdGVSYXcsXG4gIFVuemlwOiBVbnppcCxcbiAgWmxpYjogWmxpYlxufTtcblxudmFyIF9wb2x5ZmlsbE5vZGVfemxpYiQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdERlZmxhdGU6IERlZmxhdGUsXG5cdERlZmxhdGVSYXc6IERlZmxhdGVSYXcsXG5cdEd1bnppcDogR3VuemlwLFxuXHRHemlwOiBHemlwLFxuXHRJbmZsYXRlOiBJbmZsYXRlLFxuXHRJbmZsYXRlUmF3OiBJbmZsYXRlUmF3LFxuXHRVbnppcDogVW56aXAsXG5cdFpsaWI6IFpsaWIsXG5cdGNvZGVzOiBjb2Rlcyxcblx0Y3JlYXRlRGVmbGF0ZTogY3JlYXRlRGVmbGF0ZSxcblx0Y3JlYXRlRGVmbGF0ZVJhdzogY3JlYXRlRGVmbGF0ZVJhdyxcblx0Y3JlYXRlR3VuemlwOiBjcmVhdGVHdW56aXAsXG5cdGNyZWF0ZUd6aXA6IGNyZWF0ZUd6aXAsXG5cdGNyZWF0ZUluZmxhdGU6IGNyZWF0ZUluZmxhdGUsXG5cdGNyZWF0ZUluZmxhdGVSYXc6IGNyZWF0ZUluZmxhdGVSYXcsXG5cdGNyZWF0ZVVuemlwOiBjcmVhdGVVbnppcCxcblx0ZGVmYXVsdDogX3BvbHlmaWxsTm9kZV96bGliLFxuXHRkZWZsYXRlOiBkZWZsYXRlLFxuXHRkZWZsYXRlUmF3OiBkZWZsYXRlUmF3LFxuXHRkZWZsYXRlUmF3U3luYzogZGVmbGF0ZVJhd1N5bmMsXG5cdGRlZmxhdGVTeW5jOiBkZWZsYXRlU3luYyxcblx0Z3VuemlwOiBndW56aXAsXG5cdGd1bnppcFN5bmM6IGd1bnppcFN5bmMsXG5cdGd6aXA6IGd6aXAsXG5cdGd6aXBTeW5jOiBnemlwU3luYyxcblx0aW5mbGF0ZTogaW5mbGF0ZSxcblx0aW5mbGF0ZVJhdzogaW5mbGF0ZVJhdyxcblx0aW5mbGF0ZVJhd1N5bmM6IGluZmxhdGVSYXdTeW5jLFxuXHRpbmZsYXRlU3luYzogaW5mbGF0ZVN5bmMsXG5cdHVuemlwOiB1bnppcCxcblx0dW56aXBTeW5jOiB1bnppcFN5bmNcbn0pO1xuXG52YXIgcmVxdWlyZSQkNSA9IC8qQF9fUFVSRV9fKi9nZXRBdWdtZW50ZWROYW1lc3BhY2UoX3BvbHlmaWxsTm9kZV96bGliJDEpO1xuXG4oZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXHQoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHR9KShnbG9iYWxUaGlzLCAoKSA9PiB7XG5cdHJldHVybiAvKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG5cdC8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoW1xuXHQvKiAwICovLFxuXHQvKiAxICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5WZXJib3NpdHlMZXZlbCA9IGV4cG9ydHMuVXRpbCA9IGV4cG9ydHMuVW5rbm93bkVycm9yRXhjZXB0aW9uID0gZXhwb3J0cy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gPSBleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gZXhwb3J0cy5SZW5kZXJpbmdJbnRlbnRGbGFnID0gZXhwb3J0cy5Qcm9taXNlQ2FwYWJpbGl0eSA9IGV4cG9ydHMuUGVybWlzc2lvbkZsYWcgPSBleHBvcnRzLlBhc3N3b3JkUmVzcG9uc2VzID0gZXhwb3J0cy5QYXNzd29yZEV4Y2VwdGlvbiA9IGV4cG9ydHMuUGFnZUFjdGlvbkV2ZW50VHlwZSA9IGV4cG9ydHMuT1BTID0gZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gZXhwb3J0cy5NQVhfSU1BR0VfU0laRV9UT19DQUNIRSA9IGV4cG9ydHMuTElORV9GQUNUT1IgPSBleHBvcnRzLkxJTkVfREVTQ0VOVF9GQUNUT1IgPSBleHBvcnRzLkludmFsaWRQREZFeGNlcHRpb24gPSBleHBvcnRzLkltYWdlS2luZCA9IGV4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gZXhwb3J0cy5Gb3JtYXRFcnJvciA9IGV4cG9ydHMuRmVhdHVyZVRlc3QgPSBleHBvcnRzLkZPTlRfSURFTlRJVFlfTUFUUklYID0gZXhwb3J0cy5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IGV4cG9ydHMuQ01hcENvbXByZXNzaW9uVHlwZSA9IGV4cG9ydHMuQmFzZUV4Y2VwdGlvbiA9IGV4cG9ydHMuQkFTRUxJTkVfRkFDVE9SID0gZXhwb3J0cy5Bbm5vdGF0aW9uVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSBleHBvcnRzLkFubm90YXRpb25SZXBseVR5cGUgPSBleHBvcnRzLkFubm90YXRpb25Nb2RlID0gZXhwb3J0cy5Bbm5vdGF0aW9uTWFya2VkU3RhdGUgPSBleHBvcnRzLkFubm90YXRpb25GbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uRmllbGRGbGFnID0gZXhwb3J0cy5Bbm5vdGF0aW9uRWRpdG9yVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvclByZWZpeCA9IGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSBleHBvcnRzLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSBleHBvcnRzLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGUgPSBleHBvcnRzLkFib3J0RXhjZXB0aW9uID0gdm9pZCAwO1xuXHRleHBvcnRzLmFzc2VydCA9IGFzc2VydDtcblx0ZXhwb3J0cy5ieXRlc1RvU3RyaW5nID0gYnl0ZXNUb1N0cmluZztcblx0ZXhwb3J0cy5jcmVhdGVWYWxpZEFic29sdXRlVXJsID0gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDtcblx0ZXhwb3J0cy5nZXRNb2RpZmljYXRpb25EYXRlID0gZ2V0TW9kaWZpY2F0aW9uRGF0ZTtcblx0ZXhwb3J0cy5nZXRWZXJib3NpdHlMZXZlbCA9IGdldFZlcmJvc2l0eUxldmVsO1xuXHRleHBvcnRzLmluZm8gPSBpbmZvO1xuXHRleHBvcnRzLmlzQXJyYXlCdWZmZXIgPSBpc0FycmF5QnVmZmVyO1xuXHRleHBvcnRzLmlzQXJyYXlFcXVhbCA9IGlzQXJyYXlFcXVhbDtcblx0ZXhwb3J0cy5ub3JtYWxpemVVbmljb2RlID0gbm9ybWFsaXplVW5pY29kZTtcblx0ZXhwb3J0cy5vYmplY3RGcm9tTWFwID0gb2JqZWN0RnJvbU1hcDtcblx0ZXhwb3J0cy5vYmplY3RTaXplID0gb2JqZWN0U2l6ZTtcblx0ZXhwb3J0cy5zZXRWZXJib3NpdHlMZXZlbCA9IHNldFZlcmJvc2l0eUxldmVsO1xuXHRleHBvcnRzLnNoYWRvdyA9IHNoYWRvdztcblx0ZXhwb3J0cy5zdHJpbmczMiA9IHN0cmluZzMyO1xuXHRleHBvcnRzLnN0cmluZ1RvQnl0ZXMgPSBzdHJpbmdUb0J5dGVzO1xuXHRleHBvcnRzLnN0cmluZ1RvUERGU3RyaW5nID0gc3RyaW5nVG9QREZTdHJpbmc7XG5cdGV4cG9ydHMuc3RyaW5nVG9VVEY4U3RyaW5nID0gc3RyaW5nVG9VVEY4U3RyaW5nO1xuXHRleHBvcnRzLnVucmVhY2hhYmxlID0gdW5yZWFjaGFibGU7XG5cdGV4cG9ydHMudXRmOFN0cmluZ1RvU3RyaW5nID0gdXRmOFN0cmluZ1RvU3RyaW5nO1xuXHRleHBvcnRzLndhcm4gPSB3YXJuO1xuXHRjb25zdCBJREVOVElUWV9NQVRSSVggPSBbMSwgMCwgMCwgMSwgMCwgMF07XG5cdGV4cG9ydHMuSURFTlRJVFlfTUFUUklYID0gSURFTlRJVFlfTUFUUklYO1xuXHRjb25zdCBGT05UX0lERU5USVRZX01BVFJJWCA9IFswLjAwMSwgMCwgMCwgMC4wMDEsIDAsIDBdO1xuXHRleHBvcnRzLkZPTlRfSURFTlRJVFlfTUFUUklYID0gRk9OVF9JREVOVElUWV9NQVRSSVg7XG5cdGNvbnN0IE1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFID0gMTBlNjtcblx0ZXhwb3J0cy5NQVhfSU1BR0VfU0laRV9UT19DQUNIRSA9IE1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFO1xuXHRjb25zdCBMSU5FX0ZBQ1RPUiA9IDEuMzU7XG5cdGV4cG9ydHMuTElORV9GQUNUT1IgPSBMSU5FX0ZBQ1RPUjtcblx0Y29uc3QgTElORV9ERVNDRU5UX0ZBQ1RPUiA9IDAuMzU7XG5cdGV4cG9ydHMuTElORV9ERVNDRU5UX0ZBQ1RPUiA9IExJTkVfREVTQ0VOVF9GQUNUT1I7XG5cdGNvbnN0IEJBU0VMSU5FX0ZBQ1RPUiA9IExJTkVfREVTQ0VOVF9GQUNUT1IgLyBMSU5FX0ZBQ1RPUjtcblx0ZXhwb3J0cy5CQVNFTElORV9GQUNUT1IgPSBCQVNFTElORV9GQUNUT1I7XG5cdGNvbnN0IFJlbmRlcmluZ0ludGVudEZsYWcgPSB7XG5cdCAgQU5ZOiAweDAxLFxuXHQgIERJU1BMQVk6IDB4MDIsXG5cdCAgUFJJTlQ6IDB4MDQsXG5cdCAgU0FWRTogMHgwOCxcblx0ICBBTk5PVEFUSU9OU19GT1JNUzogMHgxMCxcblx0ICBBTk5PVEFUSU9OU19TVE9SQUdFOiAweDIwLFxuXHQgIEFOTk9UQVRJT05TX0RJU0FCTEU6IDB4NDAsXG5cdCAgT1BMSVNUOiAweDEwMFxuXHR9O1xuXHRleHBvcnRzLlJlbmRlcmluZ0ludGVudEZsYWcgPSBSZW5kZXJpbmdJbnRlbnRGbGFnO1xuXHRjb25zdCBBbm5vdGF0aW9uTW9kZSA9IHtcblx0ICBESVNBQkxFOiAwLFxuXHQgIEVOQUJMRTogMSxcblx0ICBFTkFCTEVfRk9STVM6IDIsXG5cdCAgRU5BQkxFX1NUT1JBR0U6IDNcblx0fTtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uTW9kZSA9IEFubm90YXRpb25Nb2RlO1xuXHRjb25zdCBBbm5vdGF0aW9uRWRpdG9yUHJlZml4ID0gXCJwZGZqc19pbnRlcm5hbF9lZGl0b3JfXCI7XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvclByZWZpeCA9IEFubm90YXRpb25FZGl0b3JQcmVmaXg7XG5cdGNvbnN0IEFubm90YXRpb25FZGl0b3JUeXBlID0ge1xuXHQgIERJU0FCTEU6IC0xLFxuXHQgIE5PTkU6IDAsXG5cdCAgRlJFRVRFWFQ6IDMsXG5cdCAgSU5LOiAxNVxuXHR9O1xuXHRleHBvcnRzLkFubm90YXRpb25FZGl0b3JUeXBlID0gQW5ub3RhdGlvbkVkaXRvclR5cGU7XG5cdGNvbnN0IEFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlID0ge1xuXHQgIEZSRUVURVhUX1NJWkU6IDEsXG5cdCAgRlJFRVRFWFRfQ09MT1I6IDIsXG5cdCAgRlJFRVRFWFRfT1BBQ0lUWTogMyxcblx0ICBJTktfQ09MT1I6IDExLFxuXHQgIElOS19USElDS05FU1M6IDEyLFxuXHQgIElOS19PUEFDSVRZOiAxM1xuXHR9O1xuXHRleHBvcnRzLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlID0gQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGU7XG5cdGNvbnN0IFBlcm1pc3Npb25GbGFnID0ge1xuXHQgIFBSSU5UOiAweDA0LFxuXHQgIE1PRElGWV9DT05URU5UUzogMHgwOCxcblx0ICBDT1BZOiAweDEwLFxuXHQgIE1PRElGWV9BTk5PVEFUSU9OUzogMHgyMCxcblx0ICBGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOiAweDEwMCxcblx0ICBDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOiAweDIwMCxcblx0ICBBU1NFTUJMRTogMHg0MDAsXG5cdCAgUFJJTlRfSElHSF9RVUFMSVRZOiAweDgwMFxuXHR9O1xuXHRleHBvcnRzLlBlcm1pc3Npb25GbGFnID0gUGVybWlzc2lvbkZsYWc7XG5cdGNvbnN0IFRleHRSZW5kZXJpbmdNb2RlID0ge1xuXHQgIEZJTEw6IDAsXG5cdCAgU1RST0tFOiAxLFxuXHQgIEZJTExfU1RST0tFOiAyLFxuXHQgIElOVklTSUJMRTogMyxcblx0ICBGSUxMX0FERF9UT19QQVRIOiA0LFxuXHQgIFNUUk9LRV9BRERfVE9fUEFUSDogNSxcblx0ICBGSUxMX1NUUk9LRV9BRERfVE9fUEFUSDogNixcblx0ICBBRERfVE9fUEFUSDogNyxcblx0ICBGSUxMX1NUUk9LRV9NQVNLOiAzLFxuXHQgIEFERF9UT19QQVRIX0ZMQUc6IDRcblx0fTtcblx0ZXhwb3J0cy5UZXh0UmVuZGVyaW5nTW9kZSA9IFRleHRSZW5kZXJpbmdNb2RlO1xuXHRjb25zdCBJbWFnZUtpbmQgPSB7XG5cdCAgR1JBWVNDQUxFXzFCUFA6IDEsXG5cdCAgUkdCXzI0QlBQOiAyLFxuXHQgIFJHQkFfMzJCUFA6IDNcblx0fTtcblx0ZXhwb3J0cy5JbWFnZUtpbmQgPSBJbWFnZUtpbmQ7XG5cdGNvbnN0IEFubm90YXRpb25UeXBlID0ge1xuXHQgIFRFWFQ6IDEsXG5cdCAgTElOSzogMixcblx0ICBGUkVFVEVYVDogMyxcblx0ICBMSU5FOiA0LFxuXHQgIFNRVUFSRTogNSxcblx0ICBDSVJDTEU6IDYsXG5cdCAgUE9MWUdPTjogNyxcblx0ICBQT0xZTElORTogOCxcblx0ICBISUdITElHSFQ6IDksXG5cdCAgVU5ERVJMSU5FOiAxMCxcblx0ICBTUVVJR0dMWTogMTEsXG5cdCAgU1RSSUtFT1VUOiAxMixcblx0ICBTVEFNUDogMTMsXG5cdCAgQ0FSRVQ6IDE0LFxuXHQgIElOSzogMTUsXG5cdCAgUE9QVVA6IDE2LFxuXHQgIEZJTEVBVFRBQ0hNRU5UOiAxNyxcblx0ICBTT1VORDogMTgsXG5cdCAgTU9WSUU6IDE5LFxuXHQgIFdJREdFVDogMjAsXG5cdCAgU0NSRUVOOiAyMSxcblx0ICBQUklOVEVSTUFSSzogMjIsXG5cdCAgVFJBUE5FVDogMjMsXG5cdCAgV0FURVJNQVJLOiAyNCxcblx0ICBUSFJFRUQ6IDI1LFxuXHQgIFJFREFDVDogMjZcblx0fTtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uVHlwZSA9IEFubm90YXRpb25UeXBlO1xuXHRjb25zdCBBbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgPSB7XG5cdCAgTUFSS0VEOiBcIk1hcmtlZFwiLFxuXHQgIFJFVklFVzogXCJSZXZpZXdcIlxuXHR9O1xuXHRleHBvcnRzLkFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZTtcblx0Y29uc3QgQW5ub3RhdGlvbk1hcmtlZFN0YXRlID0ge1xuXHQgIE1BUktFRDogXCJNYXJrZWRcIixcblx0ICBVTk1BUktFRDogXCJVbm1hcmtlZFwiXG5cdH07XG5cdGV4cG9ydHMuQW5ub3RhdGlvbk1hcmtlZFN0YXRlID0gQW5ub3RhdGlvbk1hcmtlZFN0YXRlO1xuXHRjb25zdCBBbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSB7XG5cdCAgQUNDRVBURUQ6IFwiQWNjZXB0ZWRcIixcblx0ICBSRUpFQ1RFRDogXCJSZWplY3RlZFwiLFxuXHQgIENBTkNFTExFRDogXCJDYW5jZWxsZWRcIixcblx0ICBDT01QTEVURUQ6IFwiQ29tcGxldGVkXCIsXG5cdCAgTk9ORTogXCJOb25lXCJcblx0fTtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uUmV2aWV3U3RhdGUgPSBBbm5vdGF0aW9uUmV2aWV3U3RhdGU7XG5cdGNvbnN0IEFubm90YXRpb25SZXBseVR5cGUgPSB7XG5cdCAgR1JPVVA6IFwiR3JvdXBcIixcblx0ICBSRVBMWTogXCJSXCJcblx0fTtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uUmVwbHlUeXBlID0gQW5ub3RhdGlvblJlcGx5VHlwZTtcblx0Y29uc3QgQW5ub3RhdGlvbkZsYWcgPSB7XG5cdCAgSU5WSVNJQkxFOiAweDAxLFxuXHQgIEhJRERFTjogMHgwMixcblx0ICBQUklOVDogMHgwNCxcblx0ICBOT1pPT006IDB4MDgsXG5cdCAgTk9ST1RBVEU6IDB4MTAsXG5cdCAgTk9WSUVXOiAweDIwLFxuXHQgIFJFQURPTkxZOiAweDQwLFxuXHQgIExPQ0tFRDogMHg4MCxcblx0ICBUT0dHTEVOT1ZJRVc6IDB4MTAwLFxuXHQgIExPQ0tFRENPTlRFTlRTOiAweDIwMFxuXHR9O1xuXHRleHBvcnRzLkFubm90YXRpb25GbGFnID0gQW5ub3RhdGlvbkZsYWc7XG5cdGNvbnN0IEFubm90YXRpb25GaWVsZEZsYWcgPSB7XG5cdCAgUkVBRE9OTFk6IDB4MDAwMDAwMSxcblx0ICBSRVFVSVJFRDogMHgwMDAwMDAyLFxuXHQgIE5PRVhQT1JUOiAweDAwMDAwMDQsXG5cdCAgTVVMVElMSU5FOiAweDAwMDEwMDAsXG5cdCAgUEFTU1dPUkQ6IDB4MDAwMjAwMCxcblx0ICBOT1RPR0dMRVRPT0ZGOiAweDAwMDQwMDAsXG5cdCAgUkFESU86IDB4MDAwODAwMCxcblx0ICBQVVNIQlVUVE9OOiAweDAwMTAwMDAsXG5cdCAgQ09NQk86IDB4MDAyMDAwMCxcblx0ICBFRElUOiAweDAwNDAwMDAsXG5cdCAgU09SVDogMHgwMDgwMDAwLFxuXHQgIEZJTEVTRUxFQ1Q6IDB4MDEwMDAwMCxcblx0ICBNVUxUSVNFTEVDVDogMHgwMjAwMDAwLFxuXHQgIERPTk9UU1BFTExDSEVDSzogMHgwNDAwMDAwLFxuXHQgIERPTk9UU0NST0xMOiAweDA4MDAwMDAsXG5cdCAgQ09NQjogMHgxMDAwMDAwLFxuXHQgIFJJQ0hURVhUOiAweDIwMDAwMDAsXG5cdCAgUkFESU9TSU5VTklTT046IDB4MjAwMDAwMCxcblx0ICBDT01NSVRPTlNFTENIQU5HRTogMHg0MDAwMDAwXG5cdH07XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkZpZWxkRmxhZyA9IEFubm90YXRpb25GaWVsZEZsYWc7XG5cdGNvbnN0IEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUgPSB7XG5cdCAgU09MSUQ6IDEsXG5cdCAgREFTSEVEOiAyLFxuXHQgIEJFVkVMRUQ6IDMsXG5cdCAgSU5TRVQ6IDQsXG5cdCAgVU5ERVJMSU5FOiA1XG5cdH07XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IEFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGU7XG5cdGNvbnN0IEFubm90YXRpb25BY3Rpb25FdmVudFR5cGUgPSB7XG5cdCAgRTogXCJNb3VzZSBFbnRlclwiLFxuXHQgIFg6IFwiTW91c2UgRXhpdFwiLFxuXHQgIEQ6IFwiTW91c2UgRG93blwiLFxuXHQgIFU6IFwiTW91c2UgVXBcIixcblx0ICBGbzogXCJGb2N1c1wiLFxuXHQgIEJsOiBcIkJsdXJcIixcblx0ICBQTzogXCJQYWdlT3BlblwiLFxuXHQgIFBDOiBcIlBhZ2VDbG9zZVwiLFxuXHQgIFBWOiBcIlBhZ2VWaXNpYmxlXCIsXG5cdCAgUEk6IFwiUGFnZUludmlzaWJsZVwiLFxuXHQgIEs6IFwiS2V5c3Ryb2tlXCIsXG5cdCAgRjogXCJGb3JtYXRcIixcblx0ICBWOiBcIlZhbGlkYXRlXCIsXG5cdCAgQzogXCJDYWxjdWxhdGVcIlxuXHR9O1xuXHRleHBvcnRzLkFubm90YXRpb25BY3Rpb25FdmVudFR5cGUgPSBBbm5vdGF0aW9uQWN0aW9uRXZlbnRUeXBlO1xuXHRjb25zdCBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IHtcblx0ICBXQzogXCJXaWxsQ2xvc2VcIixcblx0ICBXUzogXCJXaWxsU2F2ZVwiLFxuXHQgIERTOiBcIkRpZFNhdmVcIixcblx0ICBXUDogXCJXaWxsUHJpbnRcIixcblx0ICBEUDogXCJEaWRQcmludFwiXG5cdH07XG5cdGV4cG9ydHMuRG9jdW1lbnRBY3Rpb25FdmVudFR5cGUgPSBEb2N1bWVudEFjdGlvbkV2ZW50VHlwZTtcblx0Y29uc3QgUGFnZUFjdGlvbkV2ZW50VHlwZSA9IHtcblx0ICBPOiBcIlBhZ2VPcGVuXCIsXG5cdCAgQzogXCJQYWdlQ2xvc2VcIlxuXHR9O1xuXHRleHBvcnRzLlBhZ2VBY3Rpb25FdmVudFR5cGUgPSBQYWdlQWN0aW9uRXZlbnRUeXBlO1xuXHRjb25zdCBWZXJib3NpdHlMZXZlbCA9IHtcblx0ICBFUlJPUlM6IDAsXG5cdCAgV0FSTklOR1M6IDEsXG5cdCAgSU5GT1M6IDVcblx0fTtcblx0ZXhwb3J0cy5WZXJib3NpdHlMZXZlbCA9IFZlcmJvc2l0eUxldmVsO1xuXHRjb25zdCBDTWFwQ29tcHJlc3Npb25UeXBlID0ge1xuXHQgIE5PTkU6IDAsXG5cdCAgQklOQVJZOiAxXG5cdH07XG5cdGV4cG9ydHMuQ01hcENvbXByZXNzaW9uVHlwZSA9IENNYXBDb21wcmVzc2lvblR5cGU7XG5cdGNvbnN0IE9QUyA9IHtcblx0ICBkZXBlbmRlbmN5OiAxLFxuXHQgIHNldExpbmVXaWR0aDogMixcblx0ICBzZXRMaW5lQ2FwOiAzLFxuXHQgIHNldExpbmVKb2luOiA0LFxuXHQgIHNldE1pdGVyTGltaXQ6IDUsXG5cdCAgc2V0RGFzaDogNixcblx0ICBzZXRSZW5kZXJpbmdJbnRlbnQ6IDcsXG5cdCAgc2V0RmxhdG5lc3M6IDgsXG5cdCAgc2V0R1N0YXRlOiA5LFxuXHQgIHNhdmU6IDEwLFxuXHQgIHJlc3RvcmU6IDExLFxuXHQgIHRyYW5zZm9ybTogMTIsXG5cdCAgbW92ZVRvOiAxMyxcblx0ICBsaW5lVG86IDE0LFxuXHQgIGN1cnZlVG86IDE1LFxuXHQgIGN1cnZlVG8yOiAxNixcblx0ICBjdXJ2ZVRvMzogMTcsXG5cdCAgY2xvc2VQYXRoOiAxOCxcblx0ICByZWN0YW5nbGU6IDE5LFxuXHQgIHN0cm9rZTogMjAsXG5cdCAgY2xvc2VTdHJva2U6IDIxLFxuXHQgIGZpbGw6IDIyLFxuXHQgIGVvRmlsbDogMjMsXG5cdCAgZmlsbFN0cm9rZTogMjQsXG5cdCAgZW9GaWxsU3Ryb2tlOiAyNSxcblx0ICBjbG9zZUZpbGxTdHJva2U6IDI2LFxuXHQgIGNsb3NlRU9GaWxsU3Ryb2tlOiAyNyxcblx0ICBlbmRQYXRoOiAyOCxcblx0ICBjbGlwOiAyOSxcblx0ICBlb0NsaXA6IDMwLFxuXHQgIGJlZ2luVGV4dDogMzEsXG5cdCAgZW5kVGV4dDogMzIsXG5cdCAgc2V0Q2hhclNwYWNpbmc6IDMzLFxuXHQgIHNldFdvcmRTcGFjaW5nOiAzNCxcblx0ICBzZXRIU2NhbGU6IDM1LFxuXHQgIHNldExlYWRpbmc6IDM2LFxuXHQgIHNldEZvbnQ6IDM3LFxuXHQgIHNldFRleHRSZW5kZXJpbmdNb2RlOiAzOCxcblx0ICBzZXRUZXh0UmlzZTogMzksXG5cdCAgbW92ZVRleHQ6IDQwLFxuXHQgIHNldExlYWRpbmdNb3ZlVGV4dDogNDEsXG5cdCAgc2V0VGV4dE1hdHJpeDogNDIsXG5cdCAgbmV4dExpbmU6IDQzLFxuXHQgIHNob3dUZXh0OiA0NCxcblx0ICBzaG93U3BhY2VkVGV4dDogNDUsXG5cdCAgbmV4dExpbmVTaG93VGV4dDogNDYsXG5cdCAgbmV4dExpbmVTZXRTcGFjaW5nU2hvd1RleHQ6IDQ3LFxuXHQgIHNldENoYXJXaWR0aDogNDgsXG5cdCAgc2V0Q2hhcldpZHRoQW5kQm91bmRzOiA0OSxcblx0ICBzZXRTdHJva2VDb2xvclNwYWNlOiA1MCxcblx0ICBzZXRGaWxsQ29sb3JTcGFjZTogNTEsXG5cdCAgc2V0U3Ryb2tlQ29sb3I6IDUyLFxuXHQgIHNldFN0cm9rZUNvbG9yTjogNTMsXG5cdCAgc2V0RmlsbENvbG9yOiA1NCxcblx0ICBzZXRGaWxsQ29sb3JOOiA1NSxcblx0ICBzZXRTdHJva2VHcmF5OiA1Nixcblx0ICBzZXRGaWxsR3JheTogNTcsXG5cdCAgc2V0U3Ryb2tlUkdCQ29sb3I6IDU4LFxuXHQgIHNldEZpbGxSR0JDb2xvcjogNTksXG5cdCAgc2V0U3Ryb2tlQ01ZS0NvbG9yOiA2MCxcblx0ICBzZXRGaWxsQ01ZS0NvbG9yOiA2MSxcblx0ICBzaGFkaW5nRmlsbDogNjIsXG5cdCAgYmVnaW5JbmxpbmVJbWFnZTogNjMsXG5cdCAgYmVnaW5JbWFnZURhdGE6IDY0LFxuXHQgIGVuZElubGluZUltYWdlOiA2NSxcblx0ICBwYWludFhPYmplY3Q6IDY2LFxuXHQgIG1hcmtQb2ludDogNjcsXG5cdCAgbWFya1BvaW50UHJvcHM6IDY4LFxuXHQgIGJlZ2luTWFya2VkQ29udGVudDogNjksXG5cdCAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHM6IDcwLFxuXHQgIGVuZE1hcmtlZENvbnRlbnQ6IDcxLFxuXHQgIGJlZ2luQ29tcGF0OiA3Mixcblx0ICBlbmRDb21wYXQ6IDczLFxuXHQgIHBhaW50Rm9ybVhPYmplY3RCZWdpbjogNzQsXG5cdCAgcGFpbnRGb3JtWE9iamVjdEVuZDogNzUsXG5cdCAgYmVnaW5Hcm91cDogNzYsXG5cdCAgZW5kR3JvdXA6IDc3LFxuXHQgIGJlZ2luQW5ub3RhdGlvbjogODAsXG5cdCAgZW5kQW5ub3RhdGlvbjogODEsXG5cdCAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0OiA4Myxcblx0ICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cDogODQsXG5cdCAgcGFpbnRJbWFnZVhPYmplY3Q6IDg1LFxuXHQgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0OiA4Nixcblx0ICBwYWludElubGluZUltYWdlWE9iamVjdEdyb3VwOiA4Nyxcblx0ICBwYWludEltYWdlWE9iamVjdFJlcGVhdDogODgsXG5cdCAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0UmVwZWF0OiA4OSxcblx0ICBwYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6IDkwLFxuXHQgIGNvbnN0cnVjdFBhdGg6IDkxXG5cdH07XG5cdGV4cG9ydHMuT1BTID0gT1BTO1xuXHRjb25zdCBQYXNzd29yZFJlc3BvbnNlcyA9IHtcblx0ICBORUVEX1BBU1NXT1JEOiAxLFxuXHQgIElOQ09SUkVDVF9QQVNTV09SRDogMlxuXHR9O1xuXHRleHBvcnRzLlBhc3N3b3JkUmVzcG9uc2VzID0gUGFzc3dvcmRSZXNwb25zZXM7XG5cdGxldCB2ZXJib3NpdHkgPSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUztcblx0ZnVuY3Rpb24gc2V0VmVyYm9zaXR5TGV2ZWwobGV2ZWwpIHtcblx0ICBpZiAoTnVtYmVyLmlzSW50ZWdlcihsZXZlbCkpIHtcblx0ICAgIHZlcmJvc2l0eSA9IGxldmVsO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBnZXRWZXJib3NpdHlMZXZlbCgpIHtcblx0ICByZXR1cm4gdmVyYm9zaXR5O1xuXHR9XG5cdGZ1bmN0aW9uIGluZm8obXNnKSB7XG5cdCAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5JTkZPUykge1xuXHQgICAgY29uc29sZS5sb2coYEluZm86ICR7bXNnfWApO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiB3YXJuKG1zZykge1xuXHQgIGlmICh2ZXJib3NpdHkgPj0gVmVyYm9zaXR5TGV2ZWwuV0FSTklOR1MpIHtcblx0ICAgIGNvbnNvbGUubG9nKGBXYXJuaW5nOiAke21zZ31gKTtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gdW5yZWFjaGFibGUobXNnKSB7XG5cdCAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG5cdH1cblx0ZnVuY3Rpb24gYXNzZXJ0KGNvbmQsIG1zZykge1xuXHQgIGlmICghY29uZCkge1xuXHQgICAgdW5yZWFjaGFibGUobXNnKTtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gX2lzVmFsaWRQcm90b2NvbCh1cmwpIHtcblx0ICBzd2l0Y2ggKHVybD8ucHJvdG9jb2wpIHtcblx0ICAgIGNhc2UgXCJodHRwOlwiOlxuXHQgICAgY2FzZSBcImh0dHBzOlwiOlxuXHQgICAgY2FzZSBcImZ0cDpcIjpcblx0ICAgIGNhc2UgXCJtYWlsdG86XCI6XG5cdCAgICBjYXNlIFwidGVsOlwiOlxuXHQgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIGRlZmF1bHQ6XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCh1cmwsIGJhc2VVcmwgPSBudWxsLCBvcHRpb25zID0gbnVsbCkge1xuXHQgIGlmICghdXJsKSB7XG5cdCAgICByZXR1cm4gbnVsbDtcblx0ICB9XG5cdCAgdHJ5IHtcblx0ICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiB1cmwgPT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgaWYgKG9wdGlvbnMuYWRkRGVmYXVsdFByb3RvY29sICYmIHVybC5zdGFydHNXaXRoKFwid3d3LlwiKSkge1xuXHQgICAgICAgIGNvbnN0IGRvdHMgPSB1cmwubWF0Y2goL1xcLi9nKTtcblx0ICAgICAgICBpZiAoZG90cz8ubGVuZ3RoID49IDIpIHtcblx0ICAgICAgICAgIHVybCA9IGBodHRwOi8vJHt1cmx9YDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKG9wdGlvbnMudHJ5Q29udmVydEVuY29kaW5nKSB7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIHVybCA9IHN0cmluZ1RvVVRGOFN0cmluZyh1cmwpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGV4KSB7fVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBjb25zdCBhYnNvbHV0ZVVybCA9IGJhc2VVcmwgPyBuZXcgVVJMKHVybCwgYmFzZVVybCkgOiBuZXcgVVJMKHVybCk7XG5cdCAgICBpZiAoX2lzVmFsaWRQcm90b2NvbChhYnNvbHV0ZVVybCkpIHtcblx0ICAgICAgcmV0dXJuIGFic29sdXRlVXJsO1xuXHQgICAgfVxuXHQgIH0gY2F0Y2ggKGV4KSB7fVxuXHQgIHJldHVybiBudWxsO1xuXHR9XG5cdGZ1bmN0aW9uIHNoYWRvdyhvYmosIHByb3AsIHZhbHVlLCBub25TZXJpYWxpemFibGUgPSBmYWxzZSkge1xuXHQgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHtcblx0ICAgIHZhbHVlLFxuXHQgICAgZW51bWVyYWJsZTogIW5vblNlcmlhbGl6YWJsZSxcblx0ICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0ICAgIHdyaXRhYmxlOiBmYWxzZVxuXHQgIH0pO1xuXHQgIHJldHVybiB2YWx1ZTtcblx0fVxuXHRjb25zdCBCYXNlRXhjZXB0aW9uID0gZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbkNsb3N1cmUoKSB7XG5cdCAgZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihtZXNzYWdlLCBuYW1lKSB7XG5cdCAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUV4Y2VwdGlvbikge1xuXHQgICAgICB1bnJlYWNoYWJsZShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VFeGNlcHRpb24uXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0ICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgfVxuXHQgIEJhc2VFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cdCAgQmFzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciA9IEJhc2VFeGNlcHRpb247XG5cdCAgcmV0dXJuIEJhc2VFeGNlcHRpb247XG5cdH0oKTtcblx0ZXhwb3J0cy5CYXNlRXhjZXB0aW9uID0gQmFzZUV4Y2VwdGlvbjtcblx0Y2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcblx0ICBjb25zdHJ1Y3Rvcihtc2csIGNvZGUpIHtcblx0ICAgIHN1cGVyKG1zZywgXCJQYXNzd29yZEV4Y2VwdGlvblwiKTtcblx0ICAgIHRoaXMuY29kZSA9IGNvZGU7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUGFzc3dvcmRFeGNlcHRpb24gPSBQYXNzd29yZEV4Y2VwdGlvbjtcblx0Y2xhc3MgVW5rbm93bkVycm9yRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG5cdCAgY29uc3RydWN0b3IobXNnLCBkZXRhaWxzKSB7XG5cdCAgICBzdXBlcihtc2csIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCIpO1xuXHQgICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5Vbmtub3duRXJyb3JFeGNlcHRpb24gPSBVbmtub3duRXJyb3JFeGNlcHRpb247XG5cdGNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcblx0ICBjb25zdHJ1Y3Rvcihtc2cpIHtcblx0ICAgIHN1cGVyKG1zZywgXCJJbnZhbGlkUERGRXhjZXB0aW9uXCIpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkludmFsaWRQREZFeGNlcHRpb24gPSBJbnZhbGlkUERGRXhjZXB0aW9uO1xuXHRjbGFzcyBNaXNzaW5nUERGRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG5cdCAgY29uc3RydWN0b3IobXNnKSB7XG5cdCAgICBzdXBlcihtc2csIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5NaXNzaW5nUERGRXhjZXB0aW9uID0gTWlzc2luZ1BERkV4Y2VwdGlvbjtcblx0Y2xhc3MgVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG5cdCAgY29uc3RydWN0b3IobXNnLCBzdGF0dXMpIHtcblx0ICAgIHN1cGVyKG1zZywgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIik7XG5cdCAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gPSBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb247XG5cdGNsYXNzIEZvcm1hdEVycm9yIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG5cdCAgY29uc3RydWN0b3IobXNnKSB7XG5cdCAgICBzdXBlcihtc2csIFwiRm9ybWF0RXJyb3JcIik7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuRm9ybWF0RXJyb3IgPSBGb3JtYXRFcnJvcjtcblx0Y2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcblx0ICBjb25zdHJ1Y3Rvcihtc2cpIHtcblx0ICAgIHN1cGVyKG1zZywgXCJBYm9ydEV4Y2VwdGlvblwiKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5BYm9ydEV4Y2VwdGlvbiA9IEFib3J0RXhjZXB0aW9uO1xuXHRmdW5jdGlvbiBieXRlc1RvU3RyaW5nKGJ5dGVzKSB7XG5cdCAgaWYgKHR5cGVvZiBieXRlcyAhPT0gXCJvYmplY3RcIiB8fCBieXRlcz8ubGVuZ3RoID09PSB1bmRlZmluZWQpIHtcblx0ICAgIHVucmVhY2hhYmxlKFwiSW52YWxpZCBhcmd1bWVudCBmb3IgYnl0ZXNUb1N0cmluZ1wiKTtcblx0ICB9XG5cdCAgY29uc3QgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuXHQgIGNvbnN0IE1BWF9BUkdVTUVOVF9DT1VOVCA9IDgxOTI7XG5cdCAgaWYgKGxlbmd0aCA8IE1BWF9BUkdVTUVOVF9DT1VOVCkge1xuXHQgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuXHQgIH1cblx0ICBjb25zdCBzdHJCdWYgPSBbXTtcblx0ICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSBNQVhfQVJHVU1FTlRfQ09VTlQpIHtcblx0ICAgIGNvbnN0IGNodW5rRW5kID0gTWF0aC5taW4oaSArIE1BWF9BUkdVTUVOVF9DT1VOVCwgbGVuZ3RoKTtcblx0ICAgIGNvbnN0IGNodW5rID0gYnl0ZXMuc3ViYXJyYXkoaSwgY2h1bmtFbmQpO1xuXHQgICAgc3RyQnVmLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaHVuaykpO1xuXHQgIH1cblx0ICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG5cdH1cblx0ZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcblx0ICBpZiAodHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIikge1xuXHQgICAgdW5yZWFjaGFibGUoXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzXCIpO1xuXHQgIH1cblx0ICBjb25zdCBsZW5ndGggPSBzdHIubGVuZ3RoO1xuXHQgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcblx0ICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG5cdCAgICBieXRlc1tpXSA9IHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZjtcblx0ICB9XG5cdCAgcmV0dXJuIGJ5dGVzO1xuXHR9XG5cdGZ1bmN0aW9uIHN0cmluZzMyKHZhbHVlKSB7XG5cdCAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodmFsdWUgPj4gMjQgJiAweGZmLCB2YWx1ZSA+PiAxNiAmIDB4ZmYsIHZhbHVlID4+IDggJiAweGZmLCB2YWx1ZSAmIDB4ZmYpO1xuXHR9XG5cdGZ1bmN0aW9uIG9iamVjdFNpemUob2JqKSB7XG5cdCAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoO1xuXHR9XG5cdGZ1bmN0aW9uIG9iamVjdEZyb21NYXAobWFwKSB7XG5cdCAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBtYXApIHtcblx0ICAgIG9ialtrZXldID0gdmFsdWU7XG5cdCAgfVxuXHQgIHJldHVybiBvYmo7XG5cdH1cblx0ZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKSB7XG5cdCAgY29uc3QgYnVmZmVyOCA9IG5ldyBVaW50OEFycmF5KDQpO1xuXHQgIGJ1ZmZlcjhbMF0gPSAxO1xuXHQgIGNvbnN0IHZpZXczMiA9IG5ldyBVaW50MzJBcnJheShidWZmZXI4LmJ1ZmZlciwgMCwgMSk7XG5cdCAgcmV0dXJuIHZpZXczMlswXSA9PT0gMTtcblx0fVxuXHRmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKSB7XG5cdCAgdHJ5IHtcblx0ICAgIG5ldyBGdW5jdGlvbihcIlwiKTtcblx0ICAgIHJldHVybiB0cnVlO1xuXHQgIH0gY2F0Y2ggKGUpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgRmVhdHVyZVRlc3Qge1xuXHQgIHN0YXRpYyBnZXQgaXNMaXR0bGVFbmRpYW4oKSB7XG5cdCAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNMaXR0bGVFbmRpYW5cIiwgaXNMaXR0bGVFbmRpYW4oKSk7XG5cdCAgfVxuXHQgIHN0YXRpYyBnZXQgaXNFdmFsU3VwcG9ydGVkKCkge1xuXHQgICAgcmV0dXJuIHNoYWRvdyh0aGlzLCBcImlzRXZhbFN1cHBvcnRlZFwiLCBpc0V2YWxTdXBwb3J0ZWQoKSk7XG5cdCAgfVxuXHQgIHN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWRcIiwgdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gXCJ1bmRlZmluZWRcIik7XG5cdCAgfVxuXHQgIHN0YXRpYyBnZXQgcGxhdGZvcm0oKSB7XG5cdCAgICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHQgICAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicGxhdGZvcm1cIiwge1xuXHQgICAgICAgIGlzV2luOiBmYWxzZSxcblx0ICAgICAgICBpc01hYzogZmFsc2Vcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwicGxhdGZvcm1cIiwge1xuXHQgICAgICBpc1dpbjogbmF2aWdhdG9yLnBsYXRmb3JtLmluY2x1ZGVzKFwiV2luXCIpLFxuXHQgICAgICBpc01hYzogbmF2aWdhdG9yLnBsYXRmb3JtLmluY2x1ZGVzKFwiTWFjXCIpXG5cdCAgICB9KTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5GZWF0dXJlVGVzdCA9IEZlYXR1cmVUZXN0O1xuXHRjb25zdCBoZXhOdW1iZXJzID0gWy4uLkFycmF5KDI1Nikua2V5cygpXS5tYXAobiA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpO1xuXHRjbGFzcyBVdGlsIHtcblx0ICBzdGF0aWMgbWFrZUhleENvbG9yKHIsIGcsIGIpIHtcblx0ICAgIHJldHVybiBgIyR7aGV4TnVtYmVyc1tyXX0ke2hleE51bWJlcnNbZ119JHtoZXhOdW1iZXJzW2JdfWA7XG5cdCAgfVxuXHQgIHN0YXRpYyBzY2FsZU1pbk1heCh0cmFuc2Zvcm0sIG1pbk1heCkge1xuXHQgICAgbGV0IHRlbXA7XG5cdCAgICBpZiAodHJhbnNmb3JtWzBdKSB7XG5cdCAgICAgIGlmICh0cmFuc2Zvcm1bMF0gPCAwKSB7XG5cdCAgICAgICAgdGVtcCA9IG1pbk1heFswXTtcblx0ICAgICAgICBtaW5NYXhbMF0gPSBtaW5NYXhbMV07XG5cdCAgICAgICAgbWluTWF4WzFdID0gdGVtcDtcblx0ICAgICAgfVxuXHQgICAgICBtaW5NYXhbMF0gKj0gdHJhbnNmb3JtWzBdO1xuXHQgICAgICBtaW5NYXhbMV0gKj0gdHJhbnNmb3JtWzBdO1xuXHQgICAgICBpZiAodHJhbnNmb3JtWzNdIDwgMCkge1xuXHQgICAgICAgIHRlbXAgPSBtaW5NYXhbMl07XG5cdCAgICAgICAgbWluTWF4WzJdID0gbWluTWF4WzNdO1xuXHQgICAgICAgIG1pbk1heFszXSA9IHRlbXA7XG5cdCAgICAgIH1cblx0ICAgICAgbWluTWF4WzJdICo9IHRyYW5zZm9ybVszXTtcblx0ICAgICAgbWluTWF4WzNdICo9IHRyYW5zZm9ybVszXTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRlbXAgPSBtaW5NYXhbMF07XG5cdCAgICAgIG1pbk1heFswXSA9IG1pbk1heFsyXTtcblx0ICAgICAgbWluTWF4WzJdID0gdGVtcDtcblx0ICAgICAgdGVtcCA9IG1pbk1heFsxXTtcblx0ICAgICAgbWluTWF4WzFdID0gbWluTWF4WzNdO1xuXHQgICAgICBtaW5NYXhbM10gPSB0ZW1wO1xuXHQgICAgICBpZiAodHJhbnNmb3JtWzFdIDwgMCkge1xuXHQgICAgICAgIHRlbXAgPSBtaW5NYXhbMl07XG5cdCAgICAgICAgbWluTWF4WzJdID0gbWluTWF4WzNdO1xuXHQgICAgICAgIG1pbk1heFszXSA9IHRlbXA7XG5cdCAgICAgIH1cblx0ICAgICAgbWluTWF4WzJdICo9IHRyYW5zZm9ybVsxXTtcblx0ICAgICAgbWluTWF4WzNdICo9IHRyYW5zZm9ybVsxXTtcblx0ICAgICAgaWYgKHRyYW5zZm9ybVsyXSA8IDApIHtcblx0ICAgICAgICB0ZW1wID0gbWluTWF4WzBdO1xuXHQgICAgICAgIG1pbk1heFswXSA9IG1pbk1heFsxXTtcblx0ICAgICAgICBtaW5NYXhbMV0gPSB0ZW1wO1xuXHQgICAgICB9XG5cdCAgICAgIG1pbk1heFswXSAqPSB0cmFuc2Zvcm1bMl07XG5cdCAgICAgIG1pbk1heFsxXSAqPSB0cmFuc2Zvcm1bMl07XG5cdCAgICB9XG5cdCAgICBtaW5NYXhbMF0gKz0gdHJhbnNmb3JtWzRdO1xuXHQgICAgbWluTWF4WzFdICs9IHRyYW5zZm9ybVs0XTtcblx0ICAgIG1pbk1heFsyXSArPSB0cmFuc2Zvcm1bNV07XG5cdCAgICBtaW5NYXhbM10gKz0gdHJhbnNmb3JtWzVdO1xuXHQgIH1cblx0ICBzdGF0aWMgdHJhbnNmb3JtKG0xLCBtMikge1xuXHQgICAgcmV0dXJuIFttMVswXSAqIG0yWzBdICsgbTFbMl0gKiBtMlsxXSwgbTFbMV0gKiBtMlswXSArIG0xWzNdICogbTJbMV0sIG0xWzBdICogbTJbMl0gKyBtMVsyXSAqIG0yWzNdLCBtMVsxXSAqIG0yWzJdICsgbTFbM10gKiBtMlszXSwgbTFbMF0gKiBtMls0XSArIG0xWzJdICogbTJbNV0gKyBtMVs0XSwgbTFbMV0gKiBtMls0XSArIG0xWzNdICogbTJbNV0gKyBtMVs1XV07XG5cdCAgfVxuXHQgIHN0YXRpYyBhcHBseVRyYW5zZm9ybShwLCBtKSB7XG5cdCAgICBjb25zdCB4dCA9IHBbMF0gKiBtWzBdICsgcFsxXSAqIG1bMl0gKyBtWzRdO1xuXHQgICAgY29uc3QgeXQgPSBwWzBdICogbVsxXSArIHBbMV0gKiBtWzNdICsgbVs1XTtcblx0ICAgIHJldHVybiBbeHQsIHl0XTtcblx0ICB9XG5cdCAgc3RhdGljIGFwcGx5SW52ZXJzZVRyYW5zZm9ybShwLCBtKSB7XG5cdCAgICBjb25zdCBkID0gbVswXSAqIG1bM10gLSBtWzFdICogbVsyXTtcblx0ICAgIGNvbnN0IHh0ID0gKHBbMF0gKiBtWzNdIC0gcFsxXSAqIG1bMl0gKyBtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQ7XG5cdCAgICBjb25zdCB5dCA9ICgtcFswXSAqIG1bMV0gKyBwWzFdICogbVswXSArIG1bNF0gKiBtWzFdIC0gbVs1XSAqIG1bMF0pIC8gZDtcblx0ICAgIHJldHVybiBbeHQsIHl0XTtcblx0ICB9XG5cdCAgc3RhdGljIGdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KHIsIG0pIHtcblx0ICAgIGNvbnN0IHAxID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLCBtKTtcblx0ICAgIGNvbnN0IHAyID0gVXRpbC5hcHBseVRyYW5zZm9ybShyLnNsaWNlKDIsIDQpLCBtKTtcblx0ICAgIGNvbnN0IHAzID0gVXRpbC5hcHBseVRyYW5zZm9ybShbclswXSwgclszXV0sIG0pO1xuXHQgICAgY29uc3QgcDQgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzJdLCByWzFdXSwgbSk7XG5cdCAgICByZXR1cm4gW01hdGgubWluKHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5taW4ocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pLCBNYXRoLm1heChwMVswXSwgcDJbMF0sIHAzWzBdLCBwNFswXSksIE1hdGgubWF4KHAxWzFdLCBwMlsxXSwgcDNbMV0sIHA0WzFdKV07XG5cdCAgfVxuXHQgIHN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKG0pIHtcblx0ICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdO1xuXHQgICAgcmV0dXJuIFttWzNdIC8gZCwgLW1bMV0gLyBkLCAtbVsyXSAvIGQsIG1bMF0gLyBkLCAobVsyXSAqIG1bNV0gLSBtWzRdICogbVszXSkgLyBkLCAobVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkXTtcblx0ICB9XG5cdCAgc3RhdGljIHNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG0pIHtcblx0ICAgIGNvbnN0IHRyYW5zcG9zZSA9IFttWzBdLCBtWzJdLCBtWzFdLCBtWzNdXTtcblx0ICAgIGNvbnN0IGEgPSBtWzBdICogdHJhbnNwb3NlWzBdICsgbVsxXSAqIHRyYW5zcG9zZVsyXTtcblx0ICAgIGNvbnN0IGIgPSBtWzBdICogdHJhbnNwb3NlWzFdICsgbVsxXSAqIHRyYW5zcG9zZVszXTtcblx0ICAgIGNvbnN0IGMgPSBtWzJdICogdHJhbnNwb3NlWzBdICsgbVszXSAqIHRyYW5zcG9zZVsyXTtcblx0ICAgIGNvbnN0IGQgPSBtWzJdICogdHJhbnNwb3NlWzFdICsgbVszXSAqIHRyYW5zcG9zZVszXTtcblx0ICAgIGNvbnN0IGZpcnN0ID0gKGEgKyBkKSAvIDI7XG5cdCAgICBjb25zdCBzZWNvbmQgPSBNYXRoLnNxcnQoKGEgKyBkKSAqKiAyIC0gNCAqIChhICogZCAtIGMgKiBiKSkgLyAyO1xuXHQgICAgY29uc3Qgc3ggPSBmaXJzdCArIHNlY29uZCB8fCAxO1xuXHQgICAgY29uc3Qgc3kgPSBmaXJzdCAtIHNlY29uZCB8fCAxO1xuXHQgICAgcmV0dXJuIFtNYXRoLnNxcnQoc3gpLCBNYXRoLnNxcnQoc3kpXTtcblx0ICB9XG5cdCAgc3RhdGljIG5vcm1hbGl6ZVJlY3QocmVjdCkge1xuXHQgICAgY29uc3QgciA9IHJlY3Quc2xpY2UoMCk7XG5cdCAgICBpZiAocmVjdFswXSA+IHJlY3RbMl0pIHtcblx0ICAgICAgclswXSA9IHJlY3RbMl07XG5cdCAgICAgIHJbMl0gPSByZWN0WzBdO1xuXHQgICAgfVxuXHQgICAgaWYgKHJlY3RbMV0gPiByZWN0WzNdKSB7XG5cdCAgICAgIHJbMV0gPSByZWN0WzNdO1xuXHQgICAgICByWzNdID0gcmVjdFsxXTtcblx0ICAgIH1cblx0ICAgIHJldHVybiByO1xuXHQgIH1cblx0ICBzdGF0aWMgaW50ZXJzZWN0KHJlY3QxLCByZWN0Mikge1xuXHQgICAgY29uc3QgeExvdyA9IE1hdGgubWF4KE1hdGgubWluKHJlY3QxWzBdLCByZWN0MVsyXSksIE1hdGgubWluKHJlY3QyWzBdLCByZWN0MlsyXSkpO1xuXHQgICAgY29uc3QgeEhpZ2ggPSBNYXRoLm1pbihNYXRoLm1heChyZWN0MVswXSwgcmVjdDFbMl0pLCBNYXRoLm1heChyZWN0MlswXSwgcmVjdDJbMl0pKTtcblx0ICAgIGlmICh4TG93ID4geEhpZ2gpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCB5TG93ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVjdDFbMV0sIHJlY3QxWzNdKSwgTWF0aC5taW4ocmVjdDJbMV0sIHJlY3QyWzNdKSk7XG5cdCAgICBjb25zdCB5SGlnaCA9IE1hdGgubWluKE1hdGgubWF4KHJlY3QxWzFdLCByZWN0MVszXSksIE1hdGgubWF4KHJlY3QyWzFdLCByZWN0MlszXSkpO1xuXHQgICAgaWYgKHlMb3cgPiB5SGlnaCkge1xuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBbeExvdywgeUxvdywgeEhpZ2gsIHlIaWdoXTtcblx0ICB9XG5cdCAgc3RhdGljIGJlemllckJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5Mykge1xuXHQgICAgY29uc3QgdHZhbHVlcyA9IFtdLFxuXHQgICAgICBib3VuZHMgPSBbW10sIFtdXTtcblx0ICAgIGxldCBhLCBiLCBjLCB0LCB0MSwgdDIsIGIyYWMsIHNxcnRiMmFjO1xuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcblx0ICAgICAgaWYgKGkgPT09IDApIHtcblx0ICAgICAgICBiID0gNiAqIHgwIC0gMTIgKiB4MSArIDYgKiB4Mjtcblx0ICAgICAgICBhID0gLTMgKiB4MCArIDkgKiB4MSAtIDkgKiB4MiArIDMgKiB4Mztcblx0ICAgICAgICBjID0gMyAqIHgxIC0gMyAqIHgwO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGIgPSA2ICogeTAgLSAxMiAqIHkxICsgNiAqIHkyO1xuXHQgICAgICAgIGEgPSAtMyAqIHkwICsgOSAqIHkxIC0gOSAqIHkyICsgMyAqIHkzO1xuXHQgICAgICAgIGMgPSAzICogeTEgLSAzICogeTA7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKE1hdGguYWJzKGEpIDwgMWUtMTIpIHtcblx0ICAgICAgICBpZiAoTWF0aC5hYnMoYikgPCAxZS0xMikge1xuXHQgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHQgPSAtYyAvIGI7XG5cdCAgICAgICAgaWYgKDAgPCB0ICYmIHQgPCAxKSB7XG5cdCAgICAgICAgICB0dmFsdWVzLnB1c2godCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGIyYWMgPSBiICogYiAtIDQgKiBjICogYTtcblx0ICAgICAgc3FydGIyYWMgPSBNYXRoLnNxcnQoYjJhYyk7XG5cdCAgICAgIGlmIChiMmFjIDwgMCkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIHQxID0gKC1iICsgc3FydGIyYWMpIC8gKDIgKiBhKTtcblx0ICAgICAgaWYgKDAgPCB0MSAmJiB0MSA8IDEpIHtcblx0ICAgICAgICB0dmFsdWVzLnB1c2godDEpO1xuXHQgICAgICB9XG5cdCAgICAgIHQyID0gKC1iIC0gc3FydGIyYWMpIC8gKDIgKiBhKTtcblx0ICAgICAgaWYgKDAgPCB0MiAmJiB0MiA8IDEpIHtcblx0ICAgICAgICB0dmFsdWVzLnB1c2godDIpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBsZXQgaiA9IHR2YWx1ZXMubGVuZ3RoLFxuXHQgICAgICBtdDtcblx0ICAgIGNvbnN0IGpsZW4gPSBqO1xuXHQgICAgd2hpbGUgKGotLSkge1xuXHQgICAgICB0ID0gdHZhbHVlc1tqXTtcblx0ICAgICAgbXQgPSAxIC0gdDtcblx0ICAgICAgYm91bmRzWzBdW2pdID0gbXQgKiBtdCAqIG10ICogeDAgKyAzICogbXQgKiBtdCAqIHQgKiB4MSArIDMgKiBtdCAqIHQgKiB0ICogeDIgKyB0ICogdCAqIHQgKiB4Mztcblx0ICAgICAgYm91bmRzWzFdW2pdID0gbXQgKiBtdCAqIG10ICogeTAgKyAzICogbXQgKiBtdCAqIHQgKiB5MSArIDMgKiBtdCAqIHQgKiB0ICogeTIgKyB0ICogdCAqIHQgKiB5Mztcblx0ICAgIH1cblx0ICAgIGJvdW5kc1swXVtqbGVuXSA9IHgwO1xuXHQgICAgYm91bmRzWzFdW2psZW5dID0geTA7XG5cdCAgICBib3VuZHNbMF1bamxlbiArIDFdID0geDM7XG5cdCAgICBib3VuZHNbMV1bamxlbiArIDFdID0geTM7XG5cdCAgICBib3VuZHNbMF0ubGVuZ3RoID0gYm91bmRzWzFdLmxlbmd0aCA9IGpsZW4gKyAyO1xuXHQgICAgcmV0dXJuIFtNYXRoLm1pbiguLi5ib3VuZHNbMF0pLCBNYXRoLm1pbiguLi5ib3VuZHNbMV0pLCBNYXRoLm1heCguLi5ib3VuZHNbMF0pLCBNYXRoLm1heCguLi5ib3VuZHNbMV0pXTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5VdGlsID0gVXRpbDtcblx0Y29uc3QgUERGU3RyaW5nVHJhbnNsYXRlVGFibGUgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgyZDgsIDB4MmM3LCAweDJjNiwgMHgyZDksIDB4MmRkLCAweDJkYiwgMHgyZGEsIDB4MmRjLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDIwMjIsIDB4MjAyMCwgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCwgMHgyMDEzLCAweDE5MiwgMHgyMDQ0LCAweDIwMzksIDB4MjAzYSwgMHgyMjEyLCAweDIwMzAsIDB4MjAxZSwgMHgyMDFjLCAweDIwMWQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWEsIDB4MjEyMiwgMHhmYjAxLCAweGZiMDIsIDB4MTQxLCAweDE1MiwgMHgxNjAsIDB4MTc4LCAweDE3ZCwgMHgxMzEsIDB4MTQyLCAweDE1MywgMHgxNjEsIDB4MTdlLCAwLCAweDIwYWNdO1xuXHRmdW5jdGlvbiBzdHJpbmdUb1BERlN0cmluZyhzdHIpIHtcblx0ICBpZiAoc3RyWzBdID49IFwiXFx4RUZcIikge1xuXHQgICAgbGV0IGVuY29kaW5nO1xuXHQgICAgaWYgKHN0clswXSA9PT0gXCJcXHhGRVwiICYmIHN0clsxXSA9PT0gXCJcXHhGRlwiKSB7XG5cdCAgICAgIGVuY29kaW5nID0gXCJ1dGYtMTZiZVwiO1xuXHQgICAgfSBlbHNlIGlmIChzdHJbMF0gPT09IFwiXFx4RkZcIiAmJiBzdHJbMV0gPT09IFwiXFx4RkVcIikge1xuXHQgICAgICBlbmNvZGluZyA9IFwidXRmLTE2bGVcIjtcblx0ICAgIH0gZWxzZSBpZiAoc3RyWzBdID09PSBcIlxceEVGXCIgJiYgc3RyWzFdID09PSBcIlxceEJCXCIgJiYgc3RyWzJdID09PSBcIlxceEJGXCIpIHtcblx0ICAgICAgZW5jb2RpbmcgPSBcInV0Zi04XCI7XG5cdCAgICB9XG5cdCAgICBpZiAoZW5jb2RpbmcpIHtcblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nLCB7XG5cdCAgICAgICAgICBmYXRhbDogdHJ1ZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmluZ1RvQnl0ZXMoc3RyKTtcblx0ICAgICAgICByZXR1cm4gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcblx0ICAgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgICB3YXJuKGBzdHJpbmdUb1BERlN0cmluZzogXCIke2V4fVwiLmApO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgIGNvbnN0IHN0ckJ1ZiA9IFtdO1xuXHQgIGZvciAobGV0IGkgPSAwLCBpaSA9IHN0ci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdCAgICBjb25zdCBjb2RlID0gUERGU3RyaW5nVHJhbnNsYXRlVGFibGVbc3RyLmNoYXJDb2RlQXQoaSldO1xuXHQgICAgc3RyQnVmLnB1c2goY29kZSA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkgOiBzdHIuY2hhckF0KGkpKTtcblx0ICB9XG5cdCAgcmV0dXJuIHN0ckJ1Zi5qb2luKFwiXCIpO1xuXHR9XG5cdGZ1bmN0aW9uIHN0cmluZ1RvVVRGOFN0cmluZyhzdHIpIHtcblx0ICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShzdHIpKTtcblx0fVxuXHRmdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoc3RyKSB7XG5cdCAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTtcblx0fVxuXHRmdW5jdGlvbiBpc0FycmF5QnVmZmVyKHYpIHtcblx0ICByZXR1cm4gdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdj8uYnl0ZUxlbmd0aCAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQXJyYXlFcXVhbChhcnIxLCBhcnIyKSB7XG5cdCAgaWYgKGFycjEubGVuZ3RoICE9PSBhcnIyLmxlbmd0aCkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0ICBmb3IgKGxldCBpID0gMCwgaWkgPSBhcnIxLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0ICAgIGlmIChhcnIxW2ldICE9PSBhcnIyW2ldKSB7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIHRydWU7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZShkYXRlID0gbmV3IERhdGUoKSkge1xuXHQgIGNvbnN0IGJ1ZmZlciA9IFtkYXRlLmdldFVUQ0Z1bGxZZWFyKCkudG9TdHJpbmcoKSwgKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKSwgZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIildO1xuXHQgIHJldHVybiBidWZmZXIuam9pbihcIlwiKTtcblx0fVxuXHRjbGFzcyBQcm9taXNlQ2FwYWJpbGl0eSB7XG5cdCAgI3NldHRsZWQgPSBmYWxzZTtcblx0ICBjb25zdHJ1Y3RvcigpIHtcblx0ICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0ICAgICAgdGhpcy5yZXNvbHZlID0gZGF0YSA9PiB7XG5cdCAgICAgICAgdGhpcy4jc2V0dGxlZCA9IHRydWU7XG5cdCAgICAgICAgcmVzb2x2ZShkYXRhKTtcblx0ICAgICAgfTtcblx0ICAgICAgdGhpcy5yZWplY3QgPSByZWFzb24gPT4ge1xuXHQgICAgICAgIHRoaXMuI3NldHRsZWQgPSB0cnVlO1xuXHQgICAgICAgIHJlamVjdChyZWFzb24pO1xuXHQgICAgICB9O1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldCBzZXR0bGVkKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI3NldHRsZWQ7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUHJvbWlzZUNhcGFiaWxpdHkgPSBQcm9taXNlQ2FwYWJpbGl0eTtcblx0bGV0IE5vcm1hbGl6ZVJlZ2V4ID0gbnVsbDtcblx0bGV0IE5vcm1hbGl6YXRpb25NYXAgPSBudWxsO1xuXHRmdW5jdGlvbiBub3JtYWxpemVVbmljb2RlKHN0cikge1xuXHQgIGlmICghTm9ybWFsaXplUmVnZXgpIHtcblx0ICAgIE5vcm1hbGl6ZVJlZ2V4ID0gLyhbXFx1MDBhMFxcdTAwYjVcXHUwMzdlXFx1MGViM1xcdTIwMDAtXFx1MjAwYVxcdTIwMmZcXHUyMTI2XFx1ZmIwMC1cXHVmYjA0XFx1ZmIwNlxcdWZiMjAtXFx1ZmIzNlxcdWZiMzgtXFx1ZmIzY1xcdWZiM2VcXHVmYjQwLVxcdWZiNDFcXHVmYjQzLVxcdWZiNDRcXHVmYjQ2LVxcdWZiYTFcXHVmYmE0LVxcdWZiYTlcXHVmYmFlLVxcdWZiYjFcXHVmYmQzLVxcdWZiZGNcXHVmYmRlLVxcdWZiZTdcXHVmYmVhLVxcdWZiZjhcXHVmYmZjLVxcdWZiZmRcXHVmYzAwLVxcdWZjNWRcXHVmYzY0LVxcdWZjZjFcXHVmY2Y1LVxcdWZkM2RcXHVmZDg4XFx1ZmRmNFxcdWZkZmEtXFx1ZmRmYlxcdWZlNzFcXHVmZTc3XFx1ZmU3OVxcdWZlN2JcXHVmZTdkXSspfChcXHVmYjA1KykvZ3U7XG5cdCAgICBOb3JtYWxpemF0aW9uTWFwID0gbmV3IE1hcChbW1wiXHVGQjA1XCIsIFwiXHUwMTdGdFwiXV0pO1xuXHQgIH1cblx0ICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoTm9ybWFsaXplUmVnZXgsIChfLCBwMSwgcDIpID0+IHtcblx0ICAgIHJldHVybiBwMSA/IHAxLm5vcm1hbGl6ZShcIk5GS0NcIikgOiBOb3JtYWxpemF0aW9uTWFwLmdldChwMik7XG5cdCAgfSk7XG5cdH1cblxuXHQvKioqLyB9KSxcblx0LyogMiAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuYnVpbGQgPSBleHBvcnRzLlJlbmRlclRhc2sgPSBleHBvcnRzLlBERldvcmtlclV0aWwgPSBleHBvcnRzLlBERldvcmtlciA9IGV4cG9ydHMuUERGUGFnZVByb3h5ID0gZXhwb3J0cy5QREZEb2N1bWVudFByb3h5ID0gZXhwb3J0cy5QREZEb2N1bWVudExvYWRpbmdUYXNrID0gZXhwb3J0cy5QREZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBleHBvcnRzLkxvb3BiYWNrUG9ydCA9IGV4cG9ydHMuRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZXhwb3J0cy5EZWZhdWx0RmlsdGVyRmFjdG9yeSA9IGV4cG9ydHMuRGVmYXVsdENhbnZhc0ZhY3RvcnkgPSBleHBvcnRzLkRlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSA9IHZvaWQgMDtcblx0ZXhwb3J0cy5nZXREb2N1bWVudCA9IGdldERvY3VtZW50O1xuXHRleHBvcnRzLnZlcnNpb24gPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfYW5ub3RhdGlvbl9zdG9yYWdlID0gX193X3BkZmpzX3JlcXVpcmVfXygzKTtcblx0dmFyIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTtcblx0dmFyIF9mb250X2xvYWRlciA9IF9fd19wZGZqc19yZXF1aXJlX18oOSk7XG5cdHZhciBfY2FudmFzID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7XG5cdHZhciBfd29ya2VyX29wdGlvbnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTtcblx0dmFyIF9pc19ub2RlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7XG5cdHZhciBfbWVzc2FnZV9oYW5kbGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygxNSk7XG5cdHZhciBfbWV0YWRhdGEgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTtcblx0dmFyIF9vcHRpb25hbF9jb250ZW50X2NvbmZpZyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcpO1xuXHR2YXIgX3RyYW5zcG9ydF9zdHJlYW0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTtcblx0dmFyIF94ZmFfdGV4dCA9IF9fd19wZGZqc19yZXF1aXJlX18oMTkpO1xuXHRjb25zdCBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkUgPSA2NTUzNjtcblx0Y29uc3QgUkVOREVSSU5HX0NBTkNFTExFRF9USU1FT1VUID0gMTAwO1xuXHRjb25zdCBERUxBWUVEX0NMRUFOVVBfVElNRU9VVCA9IDUwMDA7XG5cdGxldCBEZWZhdWx0Q2FudmFzRmFjdG9yeSA9IF9kaXNwbGF5X3V0aWxzLkRPTUNhbnZhc0ZhY3Rvcnk7XG5cdGV4cG9ydHMuRGVmYXVsdENhbnZhc0ZhY3RvcnkgPSBEZWZhdWx0Q2FudmFzRmFjdG9yeTtcblx0bGV0IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSA9IF9kaXNwbGF5X3V0aWxzLkRPTUNNYXBSZWFkZXJGYWN0b3J5O1xuXHRleHBvcnRzLkRlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeSA9IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeTtcblx0bGV0IERlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gX2Rpc3BsYXlfdXRpbHMuRE9NRmlsdGVyRmFjdG9yeTtcblx0ZXhwb3J0cy5EZWZhdWx0RmlsdGVyRmFjdG9yeSA9IERlZmF1bHRGaWx0ZXJGYWN0b3J5O1xuXHRsZXQgRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gX2Rpc3BsYXlfdXRpbHMuRE9NU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG5cdGV4cG9ydHMuRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuXHRpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHtcblx0ICBjb25zdCB7XG5cdCAgICBOb2RlQ2FudmFzRmFjdG9yeSxcblx0ICAgIE5vZGVDTWFwUmVhZGVyRmFjdG9yeSxcblx0ICAgIE5vZGVGaWx0ZXJGYWN0b3J5LFxuXHQgICAgTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5XG5cdCAgfSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjApO1xuXHQgIGV4cG9ydHMuRGVmYXVsdENhbnZhc0ZhY3RvcnkgPSBEZWZhdWx0Q2FudmFzRmFjdG9yeSA9IE5vZGVDYW52YXNGYWN0b3J5O1xuXHQgIGV4cG9ydHMuRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gTm9kZUNNYXBSZWFkZXJGYWN0b3J5O1xuXHQgIGV4cG9ydHMuRGVmYXVsdEZpbHRlckZhY3RvcnkgPSBEZWZhdWx0RmlsdGVyRmFjdG9yeSA9IE5vZGVGaWx0ZXJGYWN0b3J5O1xuXHQgIGV4cG9ydHMuRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuXHR9XG5cdGxldCBjcmVhdGVQREZOZXR3b3JrU3RyZWFtO1xuXHR7XG5cdCAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIFBERk5vZGVTdHJlYW1cblx0ICAgIH0gPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIxKTtcblx0ICAgIGNyZWF0ZVBERk5ldHdvcmtTdHJlYW0gPSBwYXJhbXMgPT4ge1xuXHQgICAgICByZXR1cm4gbmV3IFBERk5vZGVTdHJlYW0ocGFyYW1zKTtcblx0ICAgIH07XG5cdCAgfSBlbHNlIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgUERGTmV0d29ya1N0cmVhbVxuXHQgICAgfSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjQpO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBQREZGZXRjaFN0cmVhbVxuXHQgICAgfSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjUpO1xuXHQgICAgY3JlYXRlUERGTmV0d29ya1N0cmVhbSA9IHBhcmFtcyA9PiB7XG5cdCAgICAgIHJldHVybiAoMCwgX2Rpc3BsYXlfdXRpbHMuaXNWYWxpZEZldGNoVXJsKShwYXJhbXMudXJsKSA/IG5ldyBQREZGZXRjaFN0cmVhbShwYXJhbXMpIDogbmV3IFBERk5ldHdvcmtTdHJlYW0ocGFyYW1zKTtcblx0ICAgIH07XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGdldERvY3VtZW50KHNyYykge1xuXHQgIGlmICh0eXBlb2Ygc3JjID09PSBcInN0cmluZ1wiIHx8IHNyYyBpbnN0YW5jZW9mIFVSTCkge1xuXHQgICAgc3JjID0ge1xuXHQgICAgICB1cmw6IHNyY1xuXHQgICAgfTtcblx0ICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShzcmMpKSB7XG5cdCAgICBzcmMgPSB7XG5cdCAgICAgIGRhdGE6IHNyY1xuXHQgICAgfTtcblx0ICB9XG5cdCAgaWYgKHR5cGVvZiBzcmMgIT09IFwib2JqZWN0XCIpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVyIGluIGdldERvY3VtZW50LCBuZWVkIHBhcmFtZXRlciBvYmplY3QuXCIpO1xuXHQgIH1cblx0ICBpZiAoIXNyYy51cmwgJiYgIXNyYy5kYXRhICYmICFzcmMucmFuZ2UpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVyIG9iamVjdDogbmVlZCBlaXRoZXIgLmRhdGEsIC5yYW5nZSBvciAudXJsXCIpO1xuXHQgIH1cblx0ICBjb25zdCB0YXNrID0gbmV3IFBERkRvY3VtZW50TG9hZGluZ1Rhc2soKTtcblx0ICBjb25zdCB7XG5cdCAgICBkb2NJZFxuXHQgIH0gPSB0YXNrO1xuXHQgIGNvbnN0IHVybCA9IHNyYy51cmwgPyBnZXRVcmxQcm9wKHNyYy51cmwpIDogbnVsbDtcblx0ICBjb25zdCBkYXRhID0gc3JjLmRhdGEgPyBnZXREYXRhUHJvcChzcmMuZGF0YSkgOiBudWxsO1xuXHQgIGNvbnN0IGh0dHBIZWFkZXJzID0gc3JjLmh0dHBIZWFkZXJzIHx8IG51bGw7XG5cdCAgY29uc3Qgd2l0aENyZWRlbnRpYWxzID0gc3JjLndpdGhDcmVkZW50aWFscyA9PT0gdHJ1ZTtcblx0ICBjb25zdCBwYXNzd29yZCA9IHNyYy5wYXNzd29yZCA/PyBudWxsO1xuXHQgIGNvbnN0IHJhbmdlVHJhbnNwb3J0ID0gc3JjLnJhbmdlIGluc3RhbmNlb2YgUERGRGF0YVJhbmdlVHJhbnNwb3J0ID8gc3JjLnJhbmdlIDogbnVsbDtcblx0ICBjb25zdCByYW5nZUNodW5rU2l6ZSA9IE51bWJlci5pc0ludGVnZXIoc3JjLnJhbmdlQ2h1bmtTaXplKSAmJiBzcmMucmFuZ2VDaHVua1NpemUgPiAwID8gc3JjLnJhbmdlQ2h1bmtTaXplIDogREVGQVVMVF9SQU5HRV9DSFVOS19TSVpFO1xuXHQgIGxldCB3b3JrZXIgPSBzcmMud29ya2VyIGluc3RhbmNlb2YgUERGV29ya2VyID8gc3JjLndvcmtlciA6IG51bGw7XG5cdCAgY29uc3QgdmVyYm9zaXR5ID0gc3JjLnZlcmJvc2l0eTtcblx0ICBjb25zdCBkb2NCYXNlVXJsID0gdHlwZW9mIHNyYy5kb2NCYXNlVXJsID09PSBcInN0cmluZ1wiICYmICEoMCwgX2Rpc3BsYXlfdXRpbHMuaXNEYXRhU2NoZW1lKShzcmMuZG9jQmFzZVVybCkgPyBzcmMuZG9jQmFzZVVybCA6IG51bGw7XG5cdCAgY29uc3QgY01hcFVybCA9IHR5cGVvZiBzcmMuY01hcFVybCA9PT0gXCJzdHJpbmdcIiA/IHNyYy5jTWFwVXJsIDogbnVsbDtcblx0ICBjb25zdCBjTWFwUGFja2VkID0gc3JjLmNNYXBQYWNrZWQgIT09IGZhbHNlO1xuXHQgIGNvbnN0IENNYXBSZWFkZXJGYWN0b3J5ID0gc3JjLkNNYXBSZWFkZXJGYWN0b3J5IHx8IERlZmF1bHRDTWFwUmVhZGVyRmFjdG9yeTtcblx0ICBjb25zdCBzdGFuZGFyZEZvbnREYXRhVXJsID0gdHlwZW9mIHNyYy5zdGFuZGFyZEZvbnREYXRhVXJsID09PSBcInN0cmluZ1wiID8gc3JjLnN0YW5kYXJkRm9udERhdGFVcmwgOiBudWxsO1xuXHQgIGNvbnN0IFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gc3JjLlN0YW5kYXJkRm9udERhdGFGYWN0b3J5IHx8IERlZmF1bHRTdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcblx0ICBjb25zdCBpZ25vcmVFcnJvcnMgPSBzcmMuc3RvcEF0RXJyb3JzICE9PSB0cnVlO1xuXHQgIGNvbnN0IG1heEltYWdlU2l6ZSA9IE51bWJlci5pc0ludGVnZXIoc3JjLm1heEltYWdlU2l6ZSkgJiYgc3JjLm1heEltYWdlU2l6ZSA+IC0xID8gc3JjLm1heEltYWdlU2l6ZSA6IC0xO1xuXHQgIGNvbnN0IGlzRXZhbFN1cHBvcnRlZCA9IHNyYy5pc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlO1xuXHQgIGNvbnN0IGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gdHlwZW9mIHNyYy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA9PT0gXCJib29sZWFuXCIgPyBzcmMuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgOiAhX2lzX25vZGUuaXNOb2RlSlM7XG5cdCAgY29uc3QgY2FudmFzTWF4QXJlYUluQnl0ZXMgPSBOdW1iZXIuaXNJbnRlZ2VyKHNyYy5jYW52YXNNYXhBcmVhSW5CeXRlcykgPyBzcmMuY2FudmFzTWF4QXJlYUluQnl0ZXMgOiAtMTtcblx0ICBjb25zdCBkaXNhYmxlRm9udEZhY2UgPSB0eXBlb2Ygc3JjLmRpc2FibGVGb250RmFjZSA9PT0gXCJib29sZWFuXCIgPyBzcmMuZGlzYWJsZUZvbnRGYWNlIDogX2lzX25vZGUuaXNOb2RlSlM7XG5cdCAgY29uc3QgZm9udEV4dHJhUHJvcGVydGllcyA9IHNyYy5mb250RXh0cmFQcm9wZXJ0aWVzID09PSB0cnVlO1xuXHQgIGNvbnN0IGVuYWJsZVhmYSA9IHNyYy5lbmFibGVYZmEgPT09IHRydWU7XG5cdCAgY29uc3Qgb3duZXJEb2N1bWVudCA9IHNyYy5vd25lckRvY3VtZW50IHx8IGdsb2JhbFRoaXMuZG9jdW1lbnQ7XG5cdCAgY29uc3QgZGlzYWJsZVJhbmdlID0gc3JjLmRpc2FibGVSYW5nZSA9PT0gdHJ1ZTtcblx0ICBjb25zdCBkaXNhYmxlU3RyZWFtID0gc3JjLmRpc2FibGVTdHJlYW0gPT09IHRydWU7XG5cdCAgY29uc3QgZGlzYWJsZUF1dG9GZXRjaCA9IHNyYy5kaXNhYmxlQXV0b0ZldGNoID09PSB0cnVlO1xuXHQgIGNvbnN0IHBkZkJ1ZyA9IHNyYy5wZGZCdWcgPT09IHRydWU7XG5cdCAgY29uc3QgbGVuZ3RoID0gcmFuZ2VUcmFuc3BvcnQgPyByYW5nZVRyYW5zcG9ydC5sZW5ndGggOiBzcmMubGVuZ3RoID8/IE5hTjtcblx0ICBjb25zdCB1c2VTeXN0ZW1Gb250cyA9IHR5cGVvZiBzcmMudXNlU3lzdGVtRm9udHMgPT09IFwiYm9vbGVhblwiID8gc3JjLnVzZVN5c3RlbUZvbnRzIDogIV9pc19ub2RlLmlzTm9kZUpTICYmICFkaXNhYmxlRm9udEZhY2U7XG5cdCAgY29uc3QgdXNlV29ya2VyRmV0Y2ggPSB0eXBlb2Ygc3JjLnVzZVdvcmtlckZldGNoID09PSBcImJvb2xlYW5cIiA/IHNyYy51c2VXb3JrZXJGZXRjaCA6IENNYXBSZWFkZXJGYWN0b3J5ID09PSBfZGlzcGxheV91dGlscy5ET01DTWFwUmVhZGVyRmFjdG9yeSAmJiBTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9PT0gX2Rpc3BsYXlfdXRpbHMuRE9NU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgJiYgKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkoY01hcFVybCwgZG9jdW1lbnQuYmFzZVVSSSkgJiYgKDAsIF9kaXNwbGF5X3V0aWxzLmlzVmFsaWRGZXRjaFVybCkoc3RhbmRhcmRGb250RGF0YVVybCwgZG9jdW1lbnQuYmFzZVVSSSk7XG5cdCAgY29uc3QgY2FudmFzRmFjdG9yeSA9IHNyYy5jYW52YXNGYWN0b3J5IHx8IG5ldyBEZWZhdWx0Q2FudmFzRmFjdG9yeSh7XG5cdCAgICBvd25lckRvY3VtZW50XG5cdCAgfSk7XG5cdCAgY29uc3QgZmlsdGVyRmFjdG9yeSA9IHNyYy5maWx0ZXJGYWN0b3J5IHx8IG5ldyBEZWZhdWx0RmlsdGVyRmFjdG9yeSh7XG5cdCAgICBkb2NJZCxcblx0ICAgIG93bmVyRG9jdW1lbnRcblx0ICB9KTtcblx0ICBjb25zdCBzdHlsZUVsZW1lbnQgPSBudWxsO1xuXHQgICgwLCBfdXRpbC5zZXRWZXJib3NpdHlMZXZlbCkodmVyYm9zaXR5KTtcblx0ICBjb25zdCB0cmFuc3BvcnRGYWN0b3J5ID0ge1xuXHQgICAgY2FudmFzRmFjdG9yeSxcblx0ICAgIGZpbHRlckZhY3Rvcnlcblx0ICB9O1xuXHQgIGlmICghdXNlV29ya2VyRmV0Y2gpIHtcblx0ICAgIHRyYW5zcG9ydEZhY3RvcnkuY01hcFJlYWRlckZhY3RvcnkgPSBuZXcgQ01hcFJlYWRlckZhY3Rvcnkoe1xuXHQgICAgICBiYXNlVXJsOiBjTWFwVXJsLFxuXHQgICAgICBpc0NvbXByZXNzZWQ6IGNNYXBQYWNrZWRcblx0ICAgIH0pO1xuXHQgICAgdHJhbnNwb3J0RmFjdG9yeS5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IG5ldyBTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSh7XG5cdCAgICAgIGJhc2VVcmw6IHN0YW5kYXJkRm9udERhdGFVcmxcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBpZiAoIXdvcmtlcikge1xuXHQgICAgY29uc3Qgd29ya2VyUGFyYW1zID0ge1xuXHQgICAgICB2ZXJib3NpdHksXG5cdCAgICAgIHBvcnQ6IF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclBvcnRcblx0ICAgIH07XG5cdCAgICB3b3JrZXIgPSB3b3JrZXJQYXJhbXMucG9ydCA/IFBERldvcmtlci5mcm9tUG9ydCh3b3JrZXJQYXJhbXMpIDogbmV3IFBERldvcmtlcih3b3JrZXJQYXJhbXMpO1xuXHQgICAgdGFzay5fd29ya2VyID0gd29ya2VyO1xuXHQgIH1cblx0ICBjb25zdCBmZXRjaERvY1BhcmFtcyA9IHtcblx0ICAgIGRvY0lkLFxuXHQgICAgYXBpVmVyc2lvbjogJzMuNi4xNzInLFxuXHQgICAgZGF0YSxcblx0ICAgIHBhc3N3b3JkLFxuXHQgICAgZGlzYWJsZUF1dG9GZXRjaCxcblx0ICAgIHJhbmdlQ2h1bmtTaXplLFxuXHQgICAgbGVuZ3RoLFxuXHQgICAgZG9jQmFzZVVybCxcblx0ICAgIGVuYWJsZVhmYSxcblx0ICAgIGV2YWx1YXRvck9wdGlvbnM6IHtcblx0ICAgICAgbWF4SW1hZ2VTaXplLFxuXHQgICAgICBkaXNhYmxlRm9udEZhY2UsXG5cdCAgICAgIGlnbm9yZUVycm9ycyxcblx0ICAgICAgaXNFdmFsU3VwcG9ydGVkLFxuXHQgICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCxcblx0ICAgICAgY2FudmFzTWF4QXJlYUluQnl0ZXMsXG5cdCAgICAgIGZvbnRFeHRyYVByb3BlcnRpZXMsXG5cdCAgICAgIHVzZVN5c3RlbUZvbnRzLFxuXHQgICAgICBjTWFwVXJsOiB1c2VXb3JrZXJGZXRjaCA/IGNNYXBVcmwgOiBudWxsLFxuXHQgICAgICBzdGFuZGFyZEZvbnREYXRhVXJsOiB1c2VXb3JrZXJGZXRjaCA/IHN0YW5kYXJkRm9udERhdGFVcmwgOiBudWxsXG5cdCAgICB9XG5cdCAgfTtcblx0ICBjb25zdCB0cmFuc3BvcnRQYXJhbXMgPSB7XG5cdCAgICBpZ25vcmVFcnJvcnMsXG5cdCAgICBpc0V2YWxTdXBwb3J0ZWQsXG5cdCAgICBkaXNhYmxlRm9udEZhY2UsXG5cdCAgICBmb250RXh0cmFQcm9wZXJ0aWVzLFxuXHQgICAgZW5hYmxlWGZhLFxuXHQgICAgb3duZXJEb2N1bWVudCxcblx0ICAgIGRpc2FibGVBdXRvRmV0Y2gsXG5cdCAgICBwZGZCdWcsXG5cdCAgICBzdHlsZUVsZW1lbnRcblx0ICB9O1xuXHQgIHdvcmtlci5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuXHQgICAgaWYgKHRhc2suZGVzdHJveWVkKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvYWRpbmcgYWJvcnRlZFwiKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHdvcmtlcklkUHJvbWlzZSA9IF9mZXRjaERvY3VtZW50KHdvcmtlciwgZmV0Y2hEb2NQYXJhbXMpO1xuXHQgICAgY29uc3QgbmV0d29ya1N0cmVhbVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHQgICAgICBsZXQgbmV0d29ya1N0cmVhbTtcblx0ICAgICAgaWYgKHJhbmdlVHJhbnNwb3J0KSB7XG5cdCAgICAgICAgbmV0d29ya1N0cmVhbSA9IG5ldyBfdHJhbnNwb3J0X3N0cmVhbS5QREZEYXRhVHJhbnNwb3J0U3RyZWFtKHtcblx0ICAgICAgICAgIGxlbmd0aCxcblx0ICAgICAgICAgIGluaXRpYWxEYXRhOiByYW5nZVRyYW5zcG9ydC5pbml0aWFsRGF0YSxcblx0ICAgICAgICAgIHByb2dyZXNzaXZlRG9uZTogcmFuZ2VUcmFuc3BvcnQucHJvZ3Jlc3NpdmVEb25lLFxuXHQgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU6IHJhbmdlVHJhbnNwb3J0LmNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lLFxuXHQgICAgICAgICAgZGlzYWJsZVJhbmdlLFxuXHQgICAgICAgICAgZGlzYWJsZVN0cmVhbVxuXHQgICAgICAgIH0sIHJhbmdlVHJhbnNwb3J0KTtcblx0ICAgICAgfSBlbHNlIGlmICghZGF0YSkge1xuXHQgICAgICAgIG5ldHdvcmtTdHJlYW0gPSBjcmVhdGVQREZOZXR3b3JrU3RyZWFtKHtcblx0ICAgICAgICAgIHVybCxcblx0ICAgICAgICAgIGxlbmd0aCxcblx0ICAgICAgICAgIGh0dHBIZWFkZXJzLFxuXHQgICAgICAgICAgd2l0aENyZWRlbnRpYWxzLFxuXHQgICAgICAgICAgcmFuZ2VDaHVua1NpemUsXG5cdCAgICAgICAgICBkaXNhYmxlUmFuZ2UsXG5cdCAgICAgICAgICBkaXNhYmxlU3RyZWFtXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmVzb2x2ZShuZXR3b3JrU3RyZWFtKTtcblx0ICAgIH0pO1xuXHQgICAgcmV0dXJuIFByb21pc2UuYWxsKFt3b3JrZXJJZFByb21pc2UsIG5ldHdvcmtTdHJlYW1Qcm9taXNlXSkudGhlbihmdW5jdGlvbiAoW3dvcmtlcklkLCBuZXR3b3JrU3RyZWFtXSkge1xuXHQgICAgICBpZiAodGFzay5kZXN0cm95ZWQpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkaW5nIGFib3J0ZWRcIik7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihkb2NJZCwgd29ya2VySWQsIHdvcmtlci5wb3J0KTtcblx0ICAgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFdvcmtlclRyYW5zcG9ydChtZXNzYWdlSGFuZGxlciwgdGFzaywgbmV0d29ya1N0cmVhbSwgdHJhbnNwb3J0UGFyYW1zLCB0cmFuc3BvcnRGYWN0b3J5KTtcblx0ICAgICAgdGFzay5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuXHQgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwiUmVhZHlcIiwgbnVsbCk7XG5cdCAgICB9KTtcblx0ICB9KS5jYXRjaCh0YXNrLl9jYXBhYmlsaXR5LnJlamVjdCk7XG5cdCAgcmV0dXJuIHRhc2s7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gX2ZldGNoRG9jdW1lbnQod29ya2VyLCBzb3VyY2UpIHtcblx0ICBpZiAod29ya2VyLmRlc3Ryb3llZCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIik7XG5cdCAgfVxuXHQgIGNvbnN0IHdvcmtlcklkID0gYXdhaXQgd29ya2VyLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERvY1JlcXVlc3RcIiwgc291cmNlLCBzb3VyY2UuZGF0YSA/IFtzb3VyY2UuZGF0YS5idWZmZXJdIDogbnVsbCk7XG5cdCAgaWYgKHdvcmtlci5kZXN0cm95ZWQpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpO1xuXHQgIH1cblx0ICByZXR1cm4gd29ya2VySWQ7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0VXJsUHJvcCh2YWwpIHtcblx0ICBpZiAodmFsIGluc3RhbmNlb2YgVVJMKSB7XG5cdCAgICByZXR1cm4gdmFsLmhyZWY7XG5cdCAgfVxuXHQgIHRyeSB7XG5cdCAgICByZXR1cm4gbmV3IFVSTCh2YWwsIHdpbmRvdy5sb2NhdGlvbikuaHJlZjtcblx0ICB9IGNhdGNoIChleCkge1xuXHQgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTICYmIHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgcmV0dXJuIHZhbDtcblx0ICAgIH1cblx0ICB9XG5cdCAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBQREYgdXJsIGRhdGE6IFwiICsgXCJlaXRoZXIgc3RyaW5nIG9yIFVSTC1vYmplY3QgaXMgZXhwZWN0ZWQgaW4gdGhlIHVybCBwcm9wZXJ0eS5cIik7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0RGF0YVByb3AodmFsKSB7XG5cdCAgaWYgKF9pc19ub2RlLmlzTm9kZUpTICYmIHR5cGVvZiBCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsIGluc3RhbmNlb2YgQnVmZmVyKSB7XG5cdCAgICAoMCwgX2Rpc3BsYXlfdXRpbHMuZGVwcmVjYXRlZCkoXCJQbGVhc2UgcHJvdmlkZSBiaW5hcnkgZGF0YSBhcyBgVWludDhBcnJheWAsIHJhdGhlciB0aGFuIGBCdWZmZXJgLlwiKTtcblx0ICAgIHJldHVybiBuZXcgVWludDhBcnJheSh2YWwpO1xuXHQgIH1cblx0ICBpZiAodmFsIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiB2YWwuYnl0ZUxlbmd0aCA9PT0gdmFsLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG5cdCAgICByZXR1cm4gdmFsO1xuXHQgIH1cblx0ICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKSh2YWwpO1xuXHQgIH1cblx0ICBpZiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiAhaXNOYU4odmFsPy5sZW5ndGgpIHx8ICgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKSh2YWwpKSB7XG5cdCAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsKTtcblx0ICB9XG5cdCAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBQREYgYmluYXJ5IGRhdGE6IGVpdGhlciBUeXBlZEFycmF5LCBcIiArIFwic3RyaW5nLCBvciBhcnJheS1saWtlIG9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgZGF0YSBwcm9wZXJ0eS5cIik7XG5cdH1cblx0Y2xhc3MgUERGRG9jdW1lbnRMb2FkaW5nVGFzayB7XG5cdCAgc3RhdGljICNkb2NJZCA9IDA7XG5cdCAgY29uc3RydWN0b3IoKSB7XG5cdCAgICB0aGlzLl9jYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl90cmFuc3BvcnQgPSBudWxsO1xuXHQgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcblx0ICAgIHRoaXMuZG9jSWQgPSBgZCR7UERGRG9jdW1lbnRMb2FkaW5nVGFzay4jZG9jSWQrK31gO1xuXHQgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblx0ICAgIHRoaXMub25QYXNzd29yZCA9IG51bGw7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuXHQgIH1cblx0ICBnZXQgcHJvbWlzZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIGFzeW5jIGRlc3Ryb3koKSB7XG5cdCAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG5cdCAgICBhd2FpdCB0aGlzLl90cmFuc3BvcnQ/LmRlc3Ryb3koKTtcblx0ICAgIHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7XG5cdCAgICBpZiAodGhpcy5fd29ya2VyKSB7XG5cdCAgICAgIHRoaXMuX3dvcmtlci5kZXN0cm95KCk7XG5cdCAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUERGRG9jdW1lbnRMb2FkaW5nVGFzayA9IFBERkRvY3VtZW50TG9hZGluZ1Rhc2s7XG5cdGNsYXNzIFBERkRhdGFSYW5nZVRyYW5zcG9ydCB7XG5cdCAgY29uc3RydWN0b3IobGVuZ3RoLCBpbml0aWFsRGF0YSwgcHJvZ3Jlc3NpdmVEb25lID0gZmFsc2UsIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gbnVsbCkge1xuXHQgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG5cdCAgICB0aGlzLmluaXRpYWxEYXRhID0gaW5pdGlhbERhdGE7XG5cdCAgICB0aGlzLnByb2dyZXNzaXZlRG9uZSA9IHByb2dyZXNzaXZlRG9uZTtcblx0ICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTtcblx0ICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzID0gW107XG5cdCAgICB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycyA9IFtdO1xuXHQgICAgdGhpcy5fcHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXJzID0gW107XG5cdCAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMgPSBbXTtcblx0ICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgIH1cblx0ICBhZGRSYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG5cdCAgICB0aGlzLl9yYW5nZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblx0ICB9XG5cdCAgYWRkUHJvZ3Jlc3NMaXN0ZW5lcihsaXN0ZW5lcikge1xuXHQgICAgdGhpcy5fcHJvZ3Jlc3NMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cdCAgfVxuXHQgIGFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKGxpc3RlbmVyKSB7XG5cdCAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cdCAgfVxuXHQgIGFkZFByb2dyZXNzaXZlRG9uZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG5cdCAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cdCAgfVxuXHQgIG9uRGF0YVJhbmdlKGJlZ2luLCBjaHVuaykge1xuXHQgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9yYW5nZUxpc3RlbmVycykge1xuXHQgICAgICBsaXN0ZW5lcihiZWdpbiwgY2h1bmspO1xuXHQgICAgfVxuXHQgIH1cblx0ICBvbkRhdGFQcm9ncmVzcyhsb2FkZWQsIHRvdGFsKSB7XG5cdCAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcblx0ICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycykge1xuXHQgICAgICAgIGxpc3RlbmVyKGxvYWRlZCwgdG90YWwpO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgb25EYXRhUHJvZ3Jlc3NpdmVSZWFkKGNodW5rKSB7XG5cdCAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcblx0ICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMpIHtcblx0ICAgICAgICBsaXN0ZW5lcihjaHVuayk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH1cblx0ICBvbkRhdGFQcm9ncmVzc2l2ZURvbmUoKSB7XG5cdCAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcblx0ICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9wcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcnMpIHtcblx0ICAgICAgICBsaXN0ZW5lcigpO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgdHJhbnNwb3J0UmVhZHkoKSB7XG5cdCAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgIH1cblx0ICByZXF1ZXN0RGF0YVJhbmdlKGJlZ2luLCBlbmQpIHtcblx0ICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgUERGRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2VcIik7XG5cdCAgfVxuXHQgIGFib3J0KCkge31cblx0fVxuXHRleHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydCA9IFBERkRhdGFSYW5nZVRyYW5zcG9ydDtcblx0Y2xhc3MgUERGRG9jdW1lbnRQcm94eSB7XG5cdCAgY29uc3RydWN0b3IocGRmSW5mbywgdHJhbnNwb3J0KSB7XG5cdCAgICB0aGlzLl9wZGZJbmZvID0gcGRmSW5mbztcblx0ICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcblx0ICB9XG5cdCAgZ2V0IGFubm90YXRpb25TdG9yYWdlKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5hbm5vdGF0aW9uU3RvcmFnZTtcblx0ICB9XG5cdCAgZ2V0IGZpbHRlckZhY3RvcnkoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmZpbHRlckZhY3Rvcnk7XG5cdCAgfVxuXHQgIGdldCBudW1QYWdlcygpIHtcblx0ICAgIHJldHVybiB0aGlzLl9wZGZJbmZvLm51bVBhZ2VzO1xuXHQgIH1cblx0ICBnZXQgZmluZ2VycHJpbnRzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3BkZkluZm8uZmluZ2VycHJpbnRzO1xuXHQgIH1cblx0ICBnZXQgaXNQdXJlWGZhKCkge1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiaXNQdXJlWGZhXCIsICEhdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKTtcblx0ICB9XG5cdCAgZ2V0IGFsbFhmYUh0bWwoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhO1xuXHQgIH1cblx0ICBnZXRQYWdlKHBhZ2VOdW1iZXIpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZShwYWdlTnVtYmVyKTtcblx0ICB9XG5cdCAgZ2V0UGFnZUluZGV4KHJlZikge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSW5kZXgocmVmKTtcblx0ICB9XG5cdCAgZ2V0RGVzdGluYXRpb25zKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbnMoKTtcblx0ICB9XG5cdCAgZ2V0RGVzdGluYXRpb24oaWQpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGVzdGluYXRpb24oaWQpO1xuXHQgIH1cblx0ICBnZXRQYWdlTGFiZWxzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlTGFiZWxzKCk7XG5cdCAgfVxuXHQgIGdldFBhZ2VMYXlvdXQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYXlvdXQoKTtcblx0ICB9XG5cdCAgZ2V0UGFnZU1vZGUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VNb2RlKCk7XG5cdCAgfVxuXHQgIGdldFZpZXdlclByZWZlcmVuY2VzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRWaWV3ZXJQcmVmZXJlbmNlcygpO1xuXHQgIH1cblx0ICBnZXRPcGVuQWN0aW9uKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPcGVuQWN0aW9uKCk7XG5cdCAgfVxuXHQgIGdldEF0dGFjaG1lbnRzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBdHRhY2htZW50cygpO1xuXHQgIH1cblx0ICBnZXRKYXZhU2NyaXB0KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRKYXZhU2NyaXB0KCk7XG5cdCAgfVxuXHQgIGdldEpTQWN0aW9ucygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RG9jSlNBY3Rpb25zKCk7XG5cdCAgfVxuXHQgIGdldE91dGxpbmUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE91dGxpbmUoKTtcblx0ICB9XG5cdCAgZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKTtcblx0ICB9XG5cdCAgZ2V0UGVybWlzc2lvbnMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBlcm1pc3Npb25zKCk7XG5cdCAgfVxuXHQgIGdldE1ldGFkYXRhKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNZXRhZGF0YSgpO1xuXHQgIH1cblx0ICBnZXRNYXJrSW5mbygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0TWFya0luZm8oKTtcblx0ICB9XG5cdCAgZ2V0RGF0YSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RGF0YSgpO1xuXHQgIH1cblx0ICBzYXZlRG9jdW1lbnQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnNhdmVEb2N1bWVudCgpO1xuXHQgIH1cblx0ICBnZXREb3dubG9hZEluZm8oKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucHJvbWlzZTtcblx0ICB9XG5cdCAgY2xlYW51cChrZWVwTG9hZGVkRm9udHMgPSBmYWxzZSkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zdGFydENsZWFudXAoa2VlcExvYWRlZEZvbnRzIHx8IHRoaXMuaXNQdXJlWGZhKTtcblx0ICB9XG5cdCAgZGVzdHJveSgpIHtcblx0ICAgIHJldHVybiB0aGlzLmxvYWRpbmdUYXNrLmRlc3Ryb3koKTtcblx0ICB9XG5cdCAgZ2V0IGxvYWRpbmdQYXJhbXMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmxvYWRpbmdQYXJhbXM7XG5cdCAgfVxuXHQgIGdldCBsb2FkaW5nVGFzaygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1Rhc2s7XG5cdCAgfVxuXHQgIGdldEZpZWxkT2JqZWN0cygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0RmllbGRPYmplY3RzKCk7XG5cdCAgfVxuXHQgIGhhc0pTQWN0aW9ucygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuaGFzSlNBY3Rpb25zKCk7XG5cdCAgfVxuXHQgIGdldENhbGN1bGF0aW9uT3JkZXJJZHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldENhbGN1bGF0aW9uT3JkZXJJZHMoKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5QREZEb2N1bWVudFByb3h5ID0gUERGRG9jdW1lbnRQcm94eTtcblx0Y2xhc3MgUERGUGFnZVByb3h5IHtcblx0ICAjZGVsYXllZENsZWFudXBUaW1lb3V0ID0gbnVsbDtcblx0ICAjcGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcblx0ICBjb25zdHJ1Y3RvcihwYWdlSW5kZXgsIHBhZ2VJbmZvLCB0cmFuc3BvcnQsIHBkZkJ1ZyA9IGZhbHNlKSB7XG5cdCAgICB0aGlzLl9wYWdlSW5kZXggPSBwYWdlSW5kZXg7XG5cdCAgICB0aGlzLl9wYWdlSW5mbyA9IHBhZ2VJbmZvO1xuXHQgICAgdGhpcy5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuXHQgICAgdGhpcy5fc3RhdHMgPSBwZGZCdWcgPyBuZXcgX2Rpc3BsYXlfdXRpbHMuU3RhdFRpbWVyKCkgOiBudWxsO1xuXHQgICAgdGhpcy5fcGRmQnVnID0gcGRmQnVnO1xuXHQgICAgdGhpcy5jb21tb25PYmpzID0gdHJhbnNwb3J0LmNvbW1vbk9ianM7XG5cdCAgICB0aGlzLm9ianMgPSBuZXcgUERGT2JqZWN0cygpO1xuXHQgICAgdGhpcy5fbWF5YmVDbGVhbnVwQWZ0ZXJSZW5kZXIgPSBmYWxzZTtcblx0ICAgIHRoaXMuX2ludGVudFN0YXRlcyA9IG5ldyBNYXAoKTtcblx0ICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cdCAgfVxuXHQgIGdldCBwYWdlTnVtYmVyKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmRleCArIDE7XG5cdCAgfVxuXHQgIGdldCByb3RhdGUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucm90YXRlO1xuXHQgIH1cblx0ICBnZXQgcmVmKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnJlZjtcblx0ICB9XG5cdCAgZ2V0IHVzZXJVbml0KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnVzZXJVbml0O1xuXHQgIH1cblx0ICBnZXQgdmlldygpIHtcblx0ICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby52aWV3O1xuXHQgIH1cblx0ICBnZXRWaWV3cG9ydCh7XG5cdCAgICBzY2FsZSxcblx0ICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGUsXG5cdCAgICBvZmZzZXRYID0gMCxcblx0ICAgIG9mZnNldFkgPSAwLFxuXHQgICAgZG9udEZsaXAgPSBmYWxzZVxuXHQgIH0gPSB7fSkge1xuXHQgICAgcmV0dXJuIG5ldyBfZGlzcGxheV91dGlscy5QYWdlVmlld3BvcnQoe1xuXHQgICAgICB2aWV3Qm94OiB0aGlzLnZpZXcsXG5cdCAgICAgIHNjYWxlLFxuXHQgICAgICByb3RhdGlvbixcblx0ICAgICAgb2Zmc2V0WCxcblx0ICAgICAgb2Zmc2V0WSxcblx0ICAgICAgZG9udEZsaXBcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXRBbm5vdGF0aW9ucyh7XG5cdCAgICBpbnRlbnQgPSBcImRpc3BsYXlcIlxuXHQgIH0gPSB7fSkge1xuXHQgICAgY29uc3QgaW50ZW50QXJncyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50KTtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0QW5ub3RhdGlvbnModGhpcy5fcGFnZUluZGV4LCBpbnRlbnRBcmdzLnJlbmRlcmluZ0ludGVudCk7XG5cdCAgfVxuXHQgIGdldEpTQWN0aW9ucygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUpTQWN0aW9ucyh0aGlzLl9wYWdlSW5kZXgpO1xuXHQgIH1cblx0ICBnZXQgaXNQdXJlWGZhKCkge1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiaXNQdXJlWGZhXCIsICEhdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhKTtcblx0ICB9XG5cdCAgYXN5bmMgZ2V0WGZhKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYT8uY2hpbGRyZW5bdGhpcy5fcGFnZUluZGV4XSB8fCBudWxsO1xuXHQgIH1cblx0ICByZW5kZXIoe1xuXHQgICAgY2FudmFzQ29udGV4dCxcblx0ICAgIHZpZXdwb3J0LFxuXHQgICAgaW50ZW50ID0gXCJkaXNwbGF5XCIsXG5cdCAgICBhbm5vdGF0aW9uTW9kZSA9IF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRSxcblx0ICAgIHRyYW5zZm9ybSA9IG51bGwsXG5cdCAgICBiYWNrZ3JvdW5kID0gbnVsbCxcblx0ICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBudWxsLFxuXHQgICAgYW5ub3RhdGlvbkNhbnZhc01hcCA9IG51bGwsXG5cdCAgICBwYWdlQ29sb3JzID0gbnVsbCxcblx0ICAgIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsXG5cdCAgfSkge1xuXHQgICAgaWYgKGFyZ3VtZW50c1swXT8uY2FudmFzRmFjdG9yeSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZW5kZXIgbm8gbG9uZ2VyIGFjY2VwdHMgdGhlIGBjYW52YXNGYWN0b3J5YC1vcHRpb24sIFwiICsgXCJwbGVhc2UgcGFzcyBpdCB0byB0aGUgYGdldERvY3VtZW50YC1mdW5jdGlvbiBpbnN0ZWFkLlwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiT3ZlcmFsbFwiKTtcblx0ICAgIGNvbnN0IGludGVudEFyZ3MgPSB0aGlzLl90cmFuc3BvcnQuZ2V0UmVuZGVyaW5nSW50ZW50KGludGVudCwgYW5ub3RhdGlvbk1vZGUsIHByaW50QW5ub3RhdGlvblN0b3JhZ2UpO1xuXHQgICAgdGhpcy4jcGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcblx0ICAgIHRoaXMuI2Fib3J0RGVsYXllZENsZWFudXAoKTtcblx0ICAgIGlmICghb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSkge1xuXHQgICAgICBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuXHQgICAgfVxuXHQgICAgbGV0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChpbnRlbnRBcmdzLmNhY2hlS2V5KTtcblx0ICAgIGlmICghaW50ZW50U3RhdGUpIHtcblx0ICAgICAgaW50ZW50U3RhdGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KGludGVudEFyZ3MuY2FjaGVLZXksIGludGVudFN0YXRlKTtcblx0ICAgIH1cblx0ICAgIGlmIChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KSB7XG5cdCAgICAgIGNsZWFyVGltZW91dChpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0KTtcblx0ICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCBpbnRlbnRQcmludCA9ICEhKGludGVudEFyZ3MucmVuZGVyaW5nSW50ZW50ICYgX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5QUklOVCk7XG5cdCAgICBpZiAoIWludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHkpIHtcblx0ICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QgPSB7XG5cdCAgICAgICAgZm5BcnJheTogW10sXG5cdCAgICAgICAgYXJnc0FycmF5OiBbXSxcblx0ICAgICAgICBsYXN0Q2h1bms6IGZhbHNlLFxuXHQgICAgICAgIHNlcGFyYXRlQW5ub3RzOiBudWxsXG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiUGFnZSBSZXF1ZXN0XCIpO1xuXHQgICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGludGVudEFyZ3MpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY29tcGxldGUgPSBlcnJvciA9PiB7XG5cdCAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLmRlbGV0ZShpbnRlcm5hbFJlbmRlclRhc2spO1xuXHQgICAgICBpZiAodGhpcy5fbWF5YmVDbGVhbnVwQWZ0ZXJSZW5kZXIgfHwgaW50ZW50UHJpbnQpIHtcblx0ICAgICAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy4jdHJ5Q2xlYW51cCghaW50ZW50UHJpbnQpO1xuXHQgICAgICBpZiAoZXJyb3IpIHtcblx0ICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpO1xuXHQgICAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtcblx0ICAgICAgICAgIGludGVudFN0YXRlLFxuXHQgICAgICAgICAgcmVhc29uOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoZXJyb3IpXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX3N0YXRzPy50aW1lRW5kKFwiUmVuZGVyaW5nXCIpO1xuXHQgICAgICB0aGlzLl9zdGF0cz8udGltZUVuZChcIk92ZXJhbGxcIik7XG5cdCAgICB9O1xuXHQgICAgY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrID0gbmV3IEludGVybmFsUmVuZGVyVGFzayh7XG5cdCAgICAgIGNhbGxiYWNrOiBjb21wbGV0ZSxcblx0ICAgICAgcGFyYW1zOiB7XG5cdCAgICAgICAgY2FudmFzQ29udGV4dCxcblx0ICAgICAgICB2aWV3cG9ydCxcblx0ICAgICAgICB0cmFuc2Zvcm0sXG5cdCAgICAgICAgYmFja2dyb3VuZFxuXHQgICAgICB9LFxuXHQgICAgICBvYmpzOiB0aGlzLm9ianMsXG5cdCAgICAgIGNvbW1vbk9ianM6IHRoaXMuY29tbW9uT2Jqcyxcblx0ICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcCxcblx0ICAgICAgb3BlcmF0b3JMaXN0OiBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QsXG5cdCAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuXHQgICAgICBjYW52YXNGYWN0b3J5OiB0aGlzLl90cmFuc3BvcnQuY2FudmFzRmFjdG9yeSxcblx0ICAgICAgZmlsdGVyRmFjdG9yeTogdGhpcy5fdHJhbnNwb3J0LmZpbHRlckZhY3RvcnksXG5cdCAgICAgIHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZTogIWludGVudFByaW50LFxuXHQgICAgICBwZGZCdWc6IHRoaXMuX3BkZkJ1Zyxcblx0ICAgICAgcGFnZUNvbG9yc1xuXHQgICAgfSk7XG5cdCAgICAoaW50ZW50U3RhdGUucmVuZGVyVGFza3MgfHw9IG5ldyBTZXQoKSkuYWRkKGludGVybmFsUmVuZGVyVGFzayk7XG5cdCAgICBjb25zdCByZW5kZXJUYXNrID0gaW50ZXJuYWxSZW5kZXJUYXNrLnRhc2s7XG5cdCAgICBQcm9taXNlLmFsbChbaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLCBvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlXSkudGhlbigoW3RyYW5zcGFyZW5jeSwgb3B0aW9uYWxDb250ZW50Q29uZmlnXSkgPT4ge1xuXHQgICAgICBpZiAodGhpcy4jcGVuZGluZ0NsZWFudXApIHtcblx0ICAgICAgICBjb21wbGV0ZSgpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl9zdGF0cz8udGltZShcIlJlbmRlcmluZ1wiKTtcblx0ICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmluaXRpYWxpemVHcmFwaGljcyh7XG5cdCAgICAgICAgdHJhbnNwYXJlbmN5LFxuXHQgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1xuXHQgICAgICB9KTtcblx0ICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcblx0ICAgIH0pLmNhdGNoKGNvbXBsZXRlKTtcblx0ICAgIHJldHVybiByZW5kZXJUYXNrO1xuXHQgIH1cblx0ICBnZXRPcGVyYXRvckxpc3Qoe1xuXHQgICAgaW50ZW50ID0gXCJkaXNwbGF5XCIsXG5cdCAgICBhbm5vdGF0aW9uTW9kZSA9IF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRSxcblx0ICAgIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsXG5cdCAgfSA9IHt9KSB7XG5cdCAgICBmdW5jdGlvbiBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuXHQgICAgICBpZiAoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuaykge1xuXHQgICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlc29sdmUoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0KTtcblx0ICAgICAgICBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcy5kZWxldGUob3BMaXN0VGFzayk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGNvbnN0IGludGVudEFyZ3MgPSB0aGlzLl90cmFuc3BvcnQuZ2V0UmVuZGVyaW5nSW50ZW50KGludGVudCwgYW5ub3RhdGlvbk1vZGUsIHByaW50QW5ub3RhdGlvblN0b3JhZ2UsIHRydWUpO1xuXHQgICAgbGV0IGludGVudFN0YXRlID0gdGhpcy5faW50ZW50U3RhdGVzLmdldChpbnRlbnRBcmdzLmNhY2hlS2V5KTtcblx0ICAgIGlmICghaW50ZW50U3RhdGUpIHtcblx0ICAgICAgaW50ZW50U3RhdGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuc2V0KGludGVudEFyZ3MuY2FjaGVLZXksIGludGVudFN0YXRlKTtcblx0ICAgIH1cblx0ICAgIGxldCBvcExpc3RUYXNrO1xuXHQgICAgaWYgKCFpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSkge1xuXHQgICAgICBvcExpc3RUYXNrID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICAgICAgb3BMaXN0VGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkID0gb3BlcmF0b3JMaXN0Q2hhbmdlZDtcblx0ICAgICAgaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgICAgKGludGVudFN0YXRlLnJlbmRlclRhc2tzIHx8PSBuZXcgU2V0KCkpLmFkZChvcExpc3RUYXNrKTtcblx0ICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0ID0ge1xuXHQgICAgICAgIGZuQXJyYXk6IFtdLFxuXHQgICAgICAgIGFyZ3NBcnJheTogW10sXG5cdCAgICAgICAgbGFzdENodW5rOiBmYWxzZSxcblx0ICAgICAgICBzZXBhcmF0ZUFubm90czogbnVsbFxuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLl9zdGF0cz8udGltZShcIlBhZ2UgUmVxdWVzdFwiKTtcblx0ICAgICAgdGhpcy5fcHVtcE9wZXJhdG9yTGlzdChpbnRlbnRBcmdzKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBzdHJlYW1UZXh0Q29udGVudCh7XG5cdCAgICBpbmNsdWRlTWFya2VkQ29udGVudCA9IGZhbHNlLFxuXHQgICAgZGlzYWJsZU5vcm1hbGl6YXRpb24gPSBmYWxzZVxuXHQgIH0gPSB7fSkge1xuXHQgICAgY29uc3QgVEVYVF9DT05URU5UX0NIVU5LX1NJWkUgPSAxMDA7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiR2V0VGV4dENvbnRlbnRcIiwge1xuXHQgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcblx0ICAgICAgaW5jbHVkZU1hcmtlZENvbnRlbnQ6IGluY2x1ZGVNYXJrZWRDb250ZW50ID09PSB0cnVlLFxuXHQgICAgICBkaXNhYmxlTm9ybWFsaXphdGlvbjogZGlzYWJsZU5vcm1hbGl6YXRpb24gPT09IHRydWVcblx0ICAgIH0sIHtcblx0ICAgICAgaGlnaFdhdGVyTWFyazogVEVYVF9DT05URU5UX0NIVU5LX1NJWkUsXG5cdCAgICAgIHNpemUodGV4dENvbnRlbnQpIHtcblx0ICAgICAgICByZXR1cm4gdGV4dENvbnRlbnQuaXRlbXMubGVuZ3RoO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0VGV4dENvbnRlbnQocGFyYW1zID0ge30pIHtcblx0ICAgIGlmICh0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZ2V0WGZhKCkudGhlbih4ZmEgPT4ge1xuXHQgICAgICAgIHJldHVybiBfeGZhX3RleHQuWGZhVGV4dC50ZXh0Q29udGVudCh4ZmEpO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5zdHJlYW1UZXh0Q29udGVudChwYXJhbXMpO1xuXHQgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0ICAgICAgZnVuY3Rpb24gcHVtcCgpIHtcblx0ICAgICAgICByZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHtcblx0ICAgICAgICAgIHZhbHVlLFxuXHQgICAgICAgICAgZG9uZVxuXHQgICAgICAgIH0pIHtcblx0ICAgICAgICAgIGlmIChkb25lKSB7XG5cdCAgICAgICAgICAgIHJlc29sdmUodGV4dENvbnRlbnQpO1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBPYmplY3QuYXNzaWduKHRleHRDb250ZW50LnN0eWxlcywgdmFsdWUuc3R5bGVzKTtcblx0ICAgICAgICAgIHRleHRDb250ZW50Lml0ZW1zLnB1c2goLi4udmFsdWUuaXRlbXMpO1xuXHQgICAgICAgICAgcHVtcCgpO1xuXHQgICAgICAgIH0sIHJlamVjdCk7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG5cdCAgICAgIGNvbnN0IHRleHRDb250ZW50ID0ge1xuXHQgICAgICAgIGl0ZW1zOiBbXSxcblx0ICAgICAgICBzdHlsZXM6IE9iamVjdC5jcmVhdGUobnVsbClcblx0ICAgICAgfTtcblx0ICAgICAgcHVtcCgpO1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldFN0cnVjdFRyZWUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFN0cnVjdFRyZWUodGhpcy5fcGFnZUluZGV4KTtcblx0ICB9XG5cdCAgX2Rlc3Ryb3koKSB7XG5cdCAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG5cdCAgICBjb25zdCB3YWl0T24gPSBbXTtcblx0ICAgIGZvciAoY29uc3QgaW50ZW50U3RhdGUgb2YgdGhpcy5faW50ZW50U3RhdGVzLnZhbHVlcygpKSB7XG5cdCAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtcblx0ICAgICAgICBpbnRlbnRTdGF0ZSxcblx0ICAgICAgICByZWFzb246IG5ldyBFcnJvcihcIlBhZ2Ugd2FzIGRlc3Ryb3llZC5cIiksXG5cdCAgICAgICAgZm9yY2U6IHRydWVcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGZvciAoY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrIG9mIGludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7XG5cdCAgICAgICAgd2FpdE9uLnB1c2goaW50ZXJuYWxSZW5kZXJUYXNrLmNvbXBsZXRlZCk7XG5cdCAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbCgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLm9ianMuY2xlYXIoKTtcblx0ICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gZmFsc2U7XG5cdCAgICB0aGlzLiNhYm9ydERlbGF5ZWRDbGVhbnVwKCk7XG5cdCAgICByZXR1cm4gUHJvbWlzZS5hbGwod2FpdE9uKTtcblx0ICB9XG5cdCAgY2xlYW51cChyZXNldFN0YXRzID0gZmFsc2UpIHtcblx0ICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gdHJ1ZTtcblx0ICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLiN0cnlDbGVhbnVwKGZhbHNlKTtcblx0ICAgIGlmIChyZXNldFN0YXRzICYmIHN1Y2Nlc3MpIHtcblx0ICAgICAgdGhpcy5fc3RhdHMgJiY9IG5ldyBfZGlzcGxheV91dGlscy5TdGF0VGltZXIoKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBzdWNjZXNzO1xuXHQgIH1cblx0ICAjdHJ5Q2xlYW51cChkZWxheWVkID0gZmFsc2UpIHtcblx0ICAgIHRoaXMuI2Fib3J0RGVsYXllZENsZWFudXAoKTtcblx0ICAgIGlmICghdGhpcy4jcGVuZGluZ0NsZWFudXApIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgICAgaWYgKGRlbGF5ZWQpIHtcblx0ICAgICAgdGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdCAgICAgICAgdGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLiN0cnlDbGVhbnVwKGZhbHNlKTtcblx0ICAgICAgfSwgREVMQVlFRF9DTEVBTlVQX1RJTUVPVVQpO1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IHtcblx0ICAgICAgcmVuZGVyVGFza3MsXG5cdCAgICAgIG9wZXJhdG9yTGlzdFxuXHQgICAgfSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMudmFsdWVzKCkpIHtcblx0ICAgICAgaWYgKHJlbmRlclRhc2tzLnNpemUgPiAwIHx8ICFvcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuY2xlYXIoKTtcblx0ICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuXHQgICAgdGhpcy4jcGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcblx0ICAgIHJldHVybiB0cnVlO1xuXHQgIH1cblx0ICAjYWJvcnREZWxheWVkQ2xlYW51cCgpIHtcblx0ICAgIGlmICh0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQpIHtcblx0ICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCk7XG5cdCAgICAgIHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCA9IG51bGw7XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9zdGFydFJlbmRlclBhZ2UodHJhbnNwYXJlbmN5LCBjYWNoZUtleSkge1xuXHQgICAgY29uc3QgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGNhY2hlS2V5KTtcblx0ICAgIGlmICghaW50ZW50U3RhdGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fc3RhdHM/LnRpbWVFbmQoXCJQYWdlIFJlcXVlc3RcIik7XG5cdCAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5Py5yZXNvbHZlKHRyYW5zcGFyZW5jeSk7XG5cdCAgfVxuXHQgIF9yZW5kZXJQYWdlQ2h1bmsob3BlcmF0b3JMaXN0Q2h1bmssIGludGVudFN0YXRlKSB7XG5cdCAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBvcGVyYXRvckxpc3RDaHVuay5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdCAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5mbkFycmF5LnB1c2gob3BlcmF0b3JMaXN0Q2h1bmsuZm5BcnJheVtpXSk7XG5cdCAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkucHVzaChvcGVyYXRvckxpc3RDaHVuay5hcmdzQXJyYXlbaV0pO1xuXHQgICAgfVxuXHQgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0Lmxhc3RDaHVuayA9IG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuaztcblx0ICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5zZXBhcmF0ZUFubm90cyA9IG9wZXJhdG9yTGlzdENodW5rLnNlcGFyYXRlQW5ub3RzO1xuXHQgICAgZm9yIChjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgb2YgaW50ZW50U3RhdGUucmVuZGVyVGFza3MpIHtcblx0ICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcblx0ICAgIH1cblx0ICAgIGlmIChvcGVyYXRvckxpc3RDaHVuay5sYXN0Q2h1bmspIHtcblx0ICAgICAgdGhpcy4jdHJ5Q2xlYW51cCh0cnVlKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX3B1bXBPcGVyYXRvckxpc3Qoe1xuXHQgICAgcmVuZGVyaW5nSW50ZW50LFxuXHQgICAgY2FjaGVLZXksXG5cdCAgICBhbm5vdGF0aW9uU3RvcmFnZU1hcFxuXHQgIH0pIHtcblx0ICAgIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gdGhpcy5fdHJhbnNwb3J0Lm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoU3RyZWFtKFwiR2V0T3BlcmF0b3JMaXN0XCIsIHtcblx0ICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG5cdCAgICAgIGludGVudDogcmVuZGVyaW5nSW50ZW50LFxuXHQgICAgICBjYWNoZUtleSxcblx0ICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IGFubm90YXRpb25TdG9yYWdlTWFwXG5cdCAgICB9KTtcblx0ICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlU3RyZWFtLmdldFJlYWRlcigpO1xuXHQgICAgY29uc3QgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGNhY2hlS2V5KTtcblx0ICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IHJlYWRlcjtcblx0ICAgIGNvbnN0IHB1bXAgPSAoKSA9PiB7XG5cdCAgICAgIHJlYWRlci5yZWFkKCkudGhlbigoe1xuXHQgICAgICAgIHZhbHVlLFxuXHQgICAgICAgIGRvbmVcblx0ICAgICAgfSkgPT4ge1xuXHQgICAgICAgIGlmIChkb25lKSB7XG5cdCAgICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCkge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9yZW5kZXJQYWdlQ2h1bmsodmFsdWUsIGludGVudFN0YXRlKTtcblx0ICAgICAgICBwdW1wKCk7XG5cdCAgICAgIH0sIHJlYXNvbiA9PiB7XG5cdCAgICAgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5fdHJhbnNwb3J0LmRlc3Ryb3llZCkge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0KSB7XG5cdCAgICAgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gdHJ1ZTtcblx0ICAgICAgICAgIGZvciAoY29uc3QgaW50ZXJuYWxSZW5kZXJUYXNrIG9mIGludGVudFN0YXRlLnJlbmRlclRhc2tzKSB7XG5cdCAgICAgICAgICAgIGludGVybmFsUmVuZGVyVGFzay5vcGVyYXRvckxpc3RDaGFuZ2VkKCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLiN0cnlDbGVhbnVwKHRydWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkge1xuXHQgICAgICAgICAgaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG5cdCAgICAgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhyb3cgcmVhc29uO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgcHVtcCgpO1xuXHQgIH1cblx0ICBfYWJvcnRPcGVyYXRvckxpc3Qoe1xuXHQgICAgaW50ZW50U3RhdGUsXG5cdCAgICByZWFzb24sXG5cdCAgICBmb3JjZSA9IGZhbHNlXG5cdCAgfSkge1xuXHQgICAgaWYgKCFpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpIHtcblx0ICAgICAgY2xlYXJUaW1lb3V0KGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpO1xuXHQgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIGlmICghZm9yY2UpIHtcblx0ICAgICAgaWYgKGludGVudFN0YXRlLnJlbmRlclRhc2tzLnNpemUgPiAwKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBfZGlzcGxheV91dGlscy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pIHtcblx0ICAgICAgICBsZXQgZGVsYXkgPSBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQ7XG5cdCAgICAgICAgaWYgKHJlYXNvbi5leHRyYURlbGF5ID4gMCAmJiByZWFzb24uZXh0cmFEZWxheSA8IDEwMDApIHtcblx0ICAgICAgICAgIGRlbGF5ICs9IHJlYXNvbi5leHRyYURlbGF5O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdCAgICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcblx0ICAgICAgICAgIHRoaXMuX2Fib3J0T3BlcmF0b3JMaXN0KHtcblx0ICAgICAgICAgICAgaW50ZW50U3RhdGUsXG5cdCAgICAgICAgICAgIHJlYXNvbixcblx0ICAgICAgICAgICAgZm9yY2U6IHRydWVcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sIGRlbGF5KTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlci5jYW5jZWwobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKSkuY2F0Y2goKCkgPT4ge30pO1xuXHQgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gbnVsbDtcblx0ICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgW2N1ckNhY2hlS2V5LCBjdXJJbnRlbnRTdGF0ZV0gb2YgdGhpcy5faW50ZW50U3RhdGVzKSB7XG5cdCAgICAgIGlmIChjdXJJbnRlbnRTdGF0ZSA9PT0gaW50ZW50U3RhdGUpIHtcblx0ICAgICAgICB0aGlzLl9pbnRlbnRTdGF0ZXMuZGVsZXRlKGN1ckNhY2hlS2V5KTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgdGhpcy5jbGVhbnVwKCk7XG5cdCAgfVxuXHQgIGdldCBzdGF0cygpIHtcblx0ICAgIHJldHVybiB0aGlzLl9zdGF0cztcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5QREZQYWdlUHJveHkgPSBQREZQYWdlUHJveHk7XG5cdGNsYXNzIExvb3BiYWNrUG9ydCB7XG5cdCAgI2xpc3RlbmVycyA9IG5ldyBTZXQoKTtcblx0ICAjZGVmZXJyZWQgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0ICBwb3N0TWVzc2FnZShvYmosIHRyYW5zZmVyKSB7XG5cdCAgICBjb25zdCBldmVudCA9IHtcblx0ICAgICAgZGF0YTogc3RydWN0dXJlZENsb25lKG9iaiwgdHJhbnNmZXIgPyB7XG5cdCAgICAgICAgdHJhbnNmZXJcblx0ICAgICAgfSA6IG51bGwpXG5cdCAgICB9O1xuXHQgICAgdGhpcy4jZGVmZXJyZWQudGhlbigoKSA9PiB7XG5cdCAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy4jbGlzdGVuZXJzKSB7XG5cdCAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH1cblx0ICBhZGRFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG5cdCAgICB0aGlzLiNsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcblx0ICB9XG5cdCAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikge1xuXHQgICAgdGhpcy4jbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG5cdCAgfVxuXHQgIHRlcm1pbmF0ZSgpIHtcblx0ICAgIHRoaXMuI2xpc3RlbmVycy5jbGVhcigpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkxvb3BiYWNrUG9ydCA9IExvb3BiYWNrUG9ydDtcblx0Y29uc3QgUERGV29ya2VyVXRpbCA9IHtcblx0ICBpc1dvcmtlckRpc2FibGVkOiBmYWxzZSxcblx0ICBmYWxsYmFja1dvcmtlclNyYzogbnVsbCxcblx0ICBmYWtlV29ya2VySWQ6IDBcblx0fTtcblx0ZXhwb3J0cy5QREZXb3JrZXJVdGlsID0gUERGV29ya2VyVXRpbDtcblx0e1xuXHQgIGlmIChfaXNfbm9kZS5pc05vZGVKUyAmJiB0eXBlb2YgY29tbW9uanNSZXF1aXJlID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgIFBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCA9IHRydWU7XG5cdCAgICBQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjID0gXCIuL3BkZi53b3JrZXIuanNcIjtcblx0ICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJvYmplY3RcIikge1xuXHQgICAgY29uc3QgcGRmanNGaWxlUGF0aCA9IGRvY3VtZW50Py5jdXJyZW50U2NyaXB0Py5zcmM7XG5cdCAgICBpZiAocGRmanNGaWxlUGF0aCkge1xuXHQgICAgICBQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjID0gcGRmanNGaWxlUGF0aC5yZXBsYWNlKC8oXFwuKD86bWluXFwuKT9qcykoXFw/LiopPyQvaSwgXCIud29ya2VyJDEkMlwiKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgUERGV29ya2VyVXRpbC5pc1NhbWVPcmlnaW4gPSBmdW5jdGlvbiAoYmFzZVVybCwgb3RoZXJVcmwpIHtcblx0ICAgIGxldCBiYXNlO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgYmFzZSA9IG5ldyBVUkwoYmFzZVVybCk7XG5cdCAgICAgIGlmICghYmFzZS5vcmlnaW4gfHwgYmFzZS5vcmlnaW4gPT09IFwibnVsbFwiKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IG90aGVyID0gbmV3IFVSTChvdGhlclVybCwgYmFzZSk7XG5cdCAgICByZXR1cm4gYmFzZS5vcmlnaW4gPT09IG90aGVyLm9yaWdpbjtcblx0ICB9O1xuXHQgIFBERldvcmtlclV0aWwuY3JlYXRlQ0ROV3JhcHBlciA9IGZ1bmN0aW9uICh1cmwpIHtcblx0ICAgIGNvbnN0IHdyYXBwZXIgPSBgaW1wb3J0U2NyaXB0cyhcIiR7dXJsfVwiKTtgO1xuXHQgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3dyYXBwZXJdKSk7XG5cdCAgfTtcblx0fVxuXHRjbGFzcyBQREZXb3JrZXIge1xuXHQgIHN0YXRpYyAjd29ya2VyUG9ydHMgPSBuZXcgV2Vha01hcCgpO1xuXHQgIGNvbnN0cnVjdG9yKHtcblx0ICAgIG5hbWUgPSBudWxsLFxuXHQgICAgcG9ydCA9IG51bGwsXG5cdCAgICB2ZXJib3NpdHkgPSAoMCwgX3V0aWwuZ2V0VmVyYm9zaXR5TGV2ZWwpKClcblx0ICB9ID0ge30pIHtcblx0ICAgIGlmIChwb3J0ICYmIFBERldvcmtlci4jd29ya2VyUG9ydHMuaGFzKHBvcnQpKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgbW9yZSB0aGFuIG9uZSBQREZXb3JrZXIgcGVyIHBvcnQuXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cdCAgICB0aGlzLnZlcmJvc2l0eSA9IHZlcmJvc2l0eTtcblx0ICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgdGhpcy5fcG9ydCA9IG51bGw7XG5cdCAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsO1xuXHQgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuXHQgICAgaWYgKHBvcnQpIHtcblx0ICAgICAgUERGV29ya2VyLiN3b3JrZXJQb3J0cy5zZXQocG9ydCwgdGhpcyk7XG5cdCAgICAgIHRoaXMuX2luaXRpYWxpemVGcm9tUG9ydChwb3J0KTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5faW5pdGlhbGl6ZSgpO1xuXHQgIH1cblx0ICBnZXQgcHJvbWlzZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucHJvbWlzZTtcblx0ICB9XG5cdCAgZ2V0IHBvcnQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fcG9ydDtcblx0ICB9XG5cdCAgZ2V0IG1lc3NhZ2VIYW5kbGVyKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VIYW5kbGVyO1xuXHQgIH1cblx0ICBfaW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpIHtcblx0ICAgIHRoaXMuX3BvcnQgPSBwb3J0O1xuXHQgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihcIm1haW5cIiwgXCJ3b3JrZXJcIiwgcG9ydCk7XG5cdCAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5vbihcInJlYWR5XCIsIGZ1bmN0aW9uICgpIHt9KTtcblx0ICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5zZW5kKFwiY29uZmlndXJlXCIsIHtcblx0ICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIF9pbml0aWFsaXplKCkge1xuXHQgICAgaWYgKCFQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgJiYgIVBERldvcmtlci5fbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyKSB7XG5cdCAgICAgIGxldCB7XG5cdCAgICAgICAgd29ya2VyU3JjXG5cdCAgICAgIH0gPSBQREZXb3JrZXI7XG5cdCAgICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKCFQREZXb3JrZXJVdGlsLmlzU2FtZU9yaWdpbih3aW5kb3cubG9jYXRpb24uaHJlZiwgd29ya2VyU3JjKSkge1xuXHQgICAgICAgICAgd29ya2VyU3JjID0gUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyKG5ldyBVUkwod29ya2VyU3JjLCB3aW5kb3cubG9jYXRpb24pLmhyZWYpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclNyYyk7XG5cdCAgICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihcIm1haW5cIiwgXCJ3b3JrZXJcIiwgd29ya2VyKTtcblx0ICAgICAgICBjb25zdCB0ZXJtaW5hdGVFYXJseSA9ICgpID0+IHtcblx0ICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25Xb3JrZXJFcnJvcik7XG5cdCAgICAgICAgICBtZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG5cdCAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG5cdCAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IG9uV29ya2VyRXJyb3IgPSAoKSA9PiB7XG5cdCAgICAgICAgICBpZiAoIXRoaXMuX3dlYldvcmtlcikge1xuXHQgICAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcblx0ICAgICAgICBtZXNzYWdlSGFuZGxlci5vbihcInRlc3RcIiwgZGF0YSA9PiB7XG5cdCAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuXHQgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGlmIChkYXRhKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG5cdCAgICAgICAgICAgIHRoaXMuX3BvcnQgPSB3b3JrZXI7XG5cdCAgICAgICAgICAgIHRoaXMuX3dlYldvcmtlciA9IHdvcmtlcjtcblx0ICAgICAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcImNvbmZpZ3VyZVwiLCB7XG5cdCAgICAgICAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuXHQgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG5cdCAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgICBtZXNzYWdlSGFuZGxlci5vbihcInJlYWR5XCIsIGRhdGEgPT4ge1xuXHQgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcblx0ICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgICAgICB0ZXJtaW5hdGVFYXJseSgpO1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBzZW5kVGVzdCgpO1xuXHQgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgICBjb25zdCBzZW5kVGVzdCA9ICgpID0+IHtcblx0ICAgICAgICAgIGNvbnN0IHRlc3RPYmogPSBuZXcgVWludDhBcnJheSgpO1xuXHQgICAgICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcInRlc3RcIiwgdGVzdE9iaiwgW3Rlc3RPYmouYnVmZmVyXSk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBzZW5kVGVzdCgpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgICgwLCBfdXRpbC5pbmZvKShcIlRoZSB3b3JrZXIgaGFzIGJlZW4gZGlzYWJsZWQuXCIpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLl9zZXR1cEZha2VXb3JrZXIoKTtcblx0ICB9XG5cdCAgX3NldHVwRmFrZVdvcmtlcigpIHtcblx0ICAgIGlmICghUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkKSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShcIlNldHRpbmcgdXAgZmFrZSB3b3JrZXIuXCIpO1xuXHQgICAgICBQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgUERGV29ya2VyLl9zZXR1cEZha2VXb3JrZXJHbG9iYWwudGhlbihXb3JrZXJNZXNzYWdlSGFuZGxlciA9PiB7XG5cdCAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIikpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBwb3J0ID0gbmV3IExvb3BiYWNrUG9ydCgpO1xuXHQgICAgICB0aGlzLl9wb3J0ID0gcG9ydDtcblx0ICAgICAgY29uc3QgaWQgPSBgZmFrZSR7UERGV29ya2VyVXRpbC5mYWtlV29ya2VySWQrK31gO1xuXHQgICAgICBjb25zdCB3b3JrZXJIYW5kbGVyID0gbmV3IF9tZXNzYWdlX2hhbmRsZXIuTWVzc2FnZUhhbmRsZXIoaWQgKyBcIl93b3JrZXJcIiwgaWQsIHBvcnQpO1xuXHQgICAgICBXb3JrZXJNZXNzYWdlSGFuZGxlci5zZXR1cCh3b3JrZXJIYW5kbGVyLCBwb3J0KTtcblx0ICAgICAgY29uc3QgbWVzc2FnZUhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihpZCwgaWQgKyBcIl93b3JrZXJcIiwgcG9ydCk7XG5cdCAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbWVzc2FnZUhhbmRsZXI7XG5cdCAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoXCJjb25maWd1cmVcIiwge1xuXHQgICAgICAgIHZlcmJvc2l0eTogdGhpcy52ZXJib3NpdHlcblx0ICAgICAgfSk7XG5cdCAgICB9KS5jYXRjaChyZWFzb24gPT4ge1xuXHQgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihgU2V0dGluZyB1cCBmYWtlIHdvcmtlciBmYWlsZWQ6IFwiJHtyZWFzb24ubWVzc2FnZX1cIi5gKSk7XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZGVzdHJveSgpIHtcblx0ICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcblx0ICAgIGlmICh0aGlzLl93ZWJXb3JrZXIpIHtcblx0ICAgICAgdGhpcy5fd2ViV29ya2VyLnRlcm1pbmF0ZSgpO1xuXHQgICAgICB0aGlzLl93ZWJXb3JrZXIgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgUERGV29ya2VyLiN3b3JrZXJQb3J0cy5kZWxldGUodGhpcy5fcG9ydCk7XG5cdCAgICB0aGlzLl9wb3J0ID0gbnVsbDtcblx0ICAgIGlmICh0aGlzLl9tZXNzYWdlSGFuZGxlcikge1xuXHQgICAgICB0aGlzLl9tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG5cdCAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyID0gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cdCAgc3RhdGljIGZyb21Qb3J0KHBhcmFtcykge1xuXHQgICAgaWYgKCFwYXJhbXM/LnBvcnQpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUERGV29ya2VyLmZyb21Qb3J0IC0gaW52YWxpZCBtZXRob2Qgc2lnbmF0dXJlLlwiKTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLiN3b3JrZXJQb3J0cy5oYXMocGFyYW1zLnBvcnQpKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiN3b3JrZXJQb3J0cy5nZXQocGFyYW1zLnBvcnQpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG5ldyBQREZXb3JrZXIocGFyYW1zKTtcblx0ICB9XG5cdCAgc3RhdGljIGdldCB3b3JrZXJTcmMoKSB7XG5cdCAgICBpZiAoX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjKSB7XG5cdCAgICAgIHJldHVybiBfd29ya2VyX29wdGlvbnMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmM7XG5cdCAgICB9XG5cdCAgICBpZiAoUERGV29ya2VyVXRpbC5mYWxsYmFja1dvcmtlclNyYyAhPT0gbnVsbCkge1xuXHQgICAgICBpZiAoIV9pc19ub2RlLmlzTm9kZUpTKSB7XG5cdCAgICAgICAgKDAsIF9kaXNwbGF5X3V0aWxzLmRlcHJlY2F0ZWQpKCdObyBcIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjXCIgc3BlY2lmaWVkLicpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjO1xuXHQgICAgfVxuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcIkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjXCIgc3BlY2lmaWVkLicpO1xuXHQgIH1cblx0ICBzdGF0aWMgZ2V0IF9tYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIoKSB7XG5cdCAgICB0cnkge1xuXHQgICAgICByZXR1cm4gZ2xvYmFsVGhpcy5wZGZqc1dvcmtlcj8uV29ya2VyTWVzc2FnZUhhbmRsZXIgfHwgbnVsbDtcblx0ICAgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzdGF0aWMgZ2V0IF9zZXR1cEZha2VXb3JrZXJHbG9iYWwoKSB7XG5cdCAgICBjb25zdCBsb2FkZXIgPSBhc3luYyAoKSA9PiB7XG5cdCAgICAgIGNvbnN0IG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlciA9IHRoaXMuX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcjtcblx0ICAgICAgaWYgKG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlcikge1xuXHQgICAgICAgIHJldHVybiBtYWluV29ya2VyTWVzc2FnZUhhbmRsZXI7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTICYmIHR5cGVvZiBjb21tb25qc1JlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuXHQgICAgICAgIGNvbnN0IHdvcmtlciA9IGV2YWwoXCJyZXF1aXJlXCIpKHRoaXMud29ya2VyU3JjKTtcblx0ICAgICAgICByZXR1cm4gd29ya2VyLldvcmtlck1lc3NhZ2VIYW5kbGVyO1xuXHQgICAgICB9XG5cdCAgICAgIGF3YWl0ICgwLCBfZGlzcGxheV91dGlscy5sb2FkU2NyaXB0KSh0aGlzLndvcmtlclNyYyk7XG5cdCAgICAgIHJldHVybiB3aW5kb3cucGRmanNXb3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiX3NldHVwRmFrZVdvcmtlckdsb2JhbFwiLCBsb2FkZXIoKSk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUERGV29ya2VyID0gUERGV29ya2VyO1xuXHRjbGFzcyBXb3JrZXJUcmFuc3BvcnQge1xuXHQgICNtZXRob2RQcm9taXNlcyA9IG5ldyBNYXAoKTtcblx0ICAjcGFnZUNhY2hlID0gbmV3IE1hcCgpO1xuXHQgICNwYWdlUHJvbWlzZXMgPSBuZXcgTWFwKCk7XG5cdCAgY29uc3RydWN0b3IobWVzc2FnZUhhbmRsZXIsIGxvYWRpbmdUYXNrLCBuZXR3b3JrU3RyZWFtLCBwYXJhbXMsIGZhY3RvcnkpIHtcblx0ICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjtcblx0ICAgIHRoaXMubG9hZGluZ1Rhc2sgPSBsb2FkaW5nVGFzaztcblx0ICAgIHRoaXMuY29tbW9uT2JqcyA9IG5ldyBQREZPYmplY3RzKCk7XG5cdCAgICB0aGlzLmZvbnRMb2FkZXIgPSBuZXcgX2ZvbnRfbG9hZGVyLkZvbnRMb2FkZXIoe1xuXHQgICAgICBvd25lckRvY3VtZW50OiBwYXJhbXMub3duZXJEb2N1bWVudCxcblx0ICAgICAgc3R5bGVFbGVtZW50OiBwYXJhbXMuc3R5bGVFbGVtZW50XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcblx0ICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGZhY3RvcnkuY2FudmFzRmFjdG9yeTtcblx0ICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGZhY3RvcnkuZmlsdGVyRmFjdG9yeTtcblx0ICAgIHRoaXMuY01hcFJlYWRlckZhY3RvcnkgPSBmYWN0b3J5LmNNYXBSZWFkZXJGYWN0b3J5O1xuXHQgICAgdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IGZhY3Rvcnkuc3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG5cdCAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXHQgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG51bGw7XG5cdCAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkgPSBudWxsO1xuXHQgICAgdGhpcy5fbmV0d29ya1N0cmVhbSA9IG5ldHdvcmtTdHJlYW07XG5cdCAgICB0aGlzLl9mdWxsUmVhZGVyID0gbnVsbDtcblx0ICAgIHRoaXMuX2xhc3RQcm9ncmVzcyA9IG51bGw7XG5cdCAgICB0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcigpO1xuXHQgIH1cblx0ICAjY2FjaGVTaW1wbGVNZXRob2QobmFtZSwgZGF0YSA9IG51bGwpIHtcblx0ICAgIGNvbnN0IGNhY2hlZFByb21pc2UgPSB0aGlzLiNtZXRob2RQcm9taXNlcy5nZXQobmFtZSk7XG5cdCAgICBpZiAoY2FjaGVkUHJvbWlzZSkge1xuXHQgICAgICByZXR1cm4gY2FjaGVkUHJvbWlzZTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShuYW1lLCBkYXRhKTtcblx0ICAgIHRoaXMuI21ldGhvZFByb21pc2VzLnNldChuYW1lLCBwcm9taXNlKTtcblx0ICAgIHJldHVybiBwcm9taXNlO1xuXHQgIH1cblx0ICBnZXQgYW5ub3RhdGlvblN0b3JhZ2UoKSB7XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJhbm5vdGF0aW9uU3RvcmFnZVwiLCBuZXcgX2Fubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZSgpKTtcblx0ICB9XG5cdCAgZ2V0UmVuZGVyaW5nSW50ZW50KGludGVudCwgYW5ub3RhdGlvbk1vZGUgPSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEUsIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsLCBpc09wTGlzdCA9IGZhbHNlKSB7XG5cdCAgICBsZXQgcmVuZGVyaW5nSW50ZW50ID0gX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5ESVNQTEFZO1xuXHQgICAgbGV0IGFubm90YXRpb25NYXAgPSBudWxsO1xuXHQgICAgc3dpdGNoIChpbnRlbnQpIHtcblx0ICAgICAgY2FzZSBcImFueVwiOlxuXHQgICAgICAgIHJlbmRlcmluZ0ludGVudCA9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5ZO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIFwiZGlzcGxheVwiOlxuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIFwicHJpbnRcIjpcblx0ICAgICAgICByZW5kZXJpbmdJbnRlbnQgPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0UmVuZGVyaW5nSW50ZW50IC0gaW52YWxpZCBpbnRlbnQ6ICR7aW50ZW50fWApO1xuXHQgICAgfVxuXHQgICAgc3dpdGNoIChhbm5vdGF0aW9uTW9kZSkge1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Nb2RlLkRJU0FCTEU6XG5cdCAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRElTQUJMRTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEU6XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbk1vZGUuRU5BQkxFX0ZPUk1TOlxuXHQgICAgICAgIHJlbmRlcmluZ0ludGVudCArPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX0ZPUk1TO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRV9TVE9SQUdFOlxuXHQgICAgICAgIHJlbmRlcmluZ0ludGVudCArPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkFOTk9UQVRJT05TX1NUT1JBR0U7XG5cdCAgICAgICAgY29uc3QgYW5ub3RhdGlvblN0b3JhZ2UgPSByZW5kZXJpbmdJbnRlbnQgJiBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UICYmIHByaW50QW5ub3RhdGlvblN0b3JhZ2UgaW5zdGFuY2VvZiBfYW5ub3RhdGlvbl9zdG9yYWdlLlByaW50QW5ub3RhdGlvblN0b3JhZ2UgPyBwcmludEFubm90YXRpb25TdG9yYWdlIDogdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcblx0ICAgICAgICBhbm5vdGF0aW9uTWFwID0gYW5ub3RhdGlvblN0b3JhZ2Uuc2VyaWFsaXphYmxlO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0UmVuZGVyaW5nSW50ZW50IC0gaW52YWxpZCBhbm5vdGF0aW9uTW9kZTogJHthbm5vdGF0aW9uTW9kZX1gKTtcblx0ICAgIH1cblx0ICAgIGlmIChpc09wTGlzdCkge1xuXHQgICAgICByZW5kZXJpbmdJbnRlbnQgKz0gX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5PUExJU1Q7XG5cdCAgICB9XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICByZW5kZXJpbmdJbnRlbnQsXG5cdCAgICAgIGNhY2hlS2V5OiBgJHtyZW5kZXJpbmdJbnRlbnR9XyR7X2Fubm90YXRpb25fc3RvcmFnZS5Bbm5vdGF0aW9uU3RvcmFnZS5nZXRIYXNoKGFubm90YXRpb25NYXApfWAsXG5cdCAgICAgIGFubm90YXRpb25TdG9yYWdlTWFwOiBhbm5vdGF0aW9uTWFwXG5cdCAgICB9O1xuXHQgIH1cblx0ICBkZXN0cm95KCkge1xuXHQgICAgaWYgKHRoaXMuZGVzdHJveUNhcGFiaWxpdHkpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgIH1cblx0ICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcblx0ICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIGlmICh0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkpIHtcblx0ICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZCBkdXJpbmcgb25QYXNzd29yZCBjYWxsYmFja1wiKSk7XG5cdCAgICB9XG5cdCAgICBjb25zdCB3YWl0T24gPSBbXTtcblx0ICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLiNwYWdlQ2FjaGUudmFsdWVzKCkpIHtcblx0ICAgICAgd2FpdE9uLnB1c2gocGFnZS5fZGVzdHJveSgpKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3BhZ2VDYWNoZS5jbGVhcigpO1xuXHQgICAgdGhpcy4jcGFnZVByb21pc2VzLmNsZWFyKCk7XG5cdCAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShcImFubm90YXRpb25TdG9yYWdlXCIpKSB7XG5cdCAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgdGVybWluYXRlZCA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiVGVybWluYXRlXCIsIG51bGwpO1xuXHQgICAgd2FpdE9uLnB1c2godGVybWluYXRlZCk7XG5cdCAgICBQcm9taXNlLmFsbCh3YWl0T24pLnRoZW4oKCkgPT4ge1xuXHQgICAgICB0aGlzLmNvbW1vbk9ianMuY2xlYXIoKTtcblx0ICAgICAgdGhpcy5mb250TG9hZGVyLmNsZWFyKCk7XG5cdCAgICAgIHRoaXMuI21ldGhvZFByb21pc2VzLmNsZWFyKCk7XG5cdCAgICAgIHRoaXMuZmlsdGVyRmFjdG9yeS5kZXN0cm95KCk7XG5cdCAgICAgIGlmICh0aGlzLl9uZXR3b3JrU3RyZWFtKSB7XG5cdCAgICAgICAgdGhpcy5fbmV0d29ya1N0cmVhbS5jYW5jZWxBbGxSZXF1ZXN0cyhuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oXCJXb3JrZXIgd2FzIHRlcm1pbmF0ZWQuXCIpKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5tZXNzYWdlSGFuZGxlcikge1xuXHQgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIuZGVzdHJveSgpO1xuXHQgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgICAgfSwgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5yZWplY3QpO1xuXHQgICAgcmV0dXJuIHRoaXMuZGVzdHJveUNhcGFiaWxpdHkucHJvbWlzZTtcblx0ICB9XG5cdCAgc2V0dXBNZXNzYWdlSGFuZGxlcigpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgbWVzc2FnZUhhbmRsZXIsXG5cdCAgICAgIGxvYWRpbmdUYXNrXG5cdCAgICB9ID0gdGhpcztcblx0ICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiR2V0UmVhZGVyXCIsIChkYXRhLCBzaW5rKSA9PiB7XG5cdCAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHRoaXMuX25ldHdvcmtTdHJlYW0sIFwiR2V0UmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG5cdCAgICAgIHRoaXMuX2Z1bGxSZWFkZXIgPSB0aGlzLl9uZXR3b3JrU3RyZWFtLmdldEZ1bGxSZWFkZXIoKTtcblx0ICAgICAgdGhpcy5fZnVsbFJlYWRlci5vblByb2dyZXNzID0gZXZ0ID0+IHtcblx0ICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3MgPSB7XG5cdCAgICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG5cdCAgICAgICAgICB0b3RhbDogZXZ0LnRvdGFsXG5cdCAgICAgICAgfTtcblx0ICAgICAgfTtcblx0ICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoe1xuXHQgICAgICAgICAgdmFsdWUsXG5cdCAgICAgICAgICBkb25lXG5cdCAgICAgICAgfSkge1xuXHQgICAgICAgICAgaWYgKGRvbmUpIHtcblx0ICAgICAgICAgICAgc2luay5jbG9zZSgpO1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLCBcIkdldFJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiKTtcblx0ICAgICAgICAgIHNpbmsuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSksIDEsIFt2YWx1ZV0pO1xuXHQgICAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG5cdCAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH07XG5cdCAgICAgIHNpbmsub25DYW5jZWwgPSByZWFzb24gPT4ge1xuXHQgICAgICAgIHRoaXMuX2Z1bGxSZWFkZXIuY2FuY2VsKHJlYXNvbik7XG5cdCAgICAgICAgc2luay5yZWFkeS5jYXRjaChyZWFkeVJlYXNvbiA9PiB7XG5cdCAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgdGhyb3cgcmVhZHlSZWFzb247XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH07XG5cdCAgICB9KTtcblx0ICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiUmVhZGVySGVhZGVyc1JlYWR5XCIsIGRhdGEgPT4ge1xuXHQgICAgICBjb25zdCBoZWFkZXJzQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgICBjb25zdCBmdWxsUmVhZGVyID0gdGhpcy5fZnVsbFJlYWRlcjtcblx0ICAgICAgZnVsbFJlYWRlci5oZWFkZXJzUmVhZHkudGhlbigoKSA9PiB7XG5cdCAgICAgICAgaWYgKCFmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkIHx8ICFmdWxsUmVhZGVyLmlzUmFuZ2VTdXBwb3J0ZWQpIHtcblx0ICAgICAgICAgIGlmICh0aGlzLl9sYXN0UHJvZ3Jlc3MpIHtcblx0ICAgICAgICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcz8uKHRoaXMuX2xhc3RQcm9ncmVzcyk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBmdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSBldnQgPT4ge1xuXHQgICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4oe1xuXHQgICAgICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcblx0ICAgICAgICAgICAgICB0b3RhbDogZXZ0LnRvdGFsXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaGVhZGVyc0NhcGFiaWxpdHkucmVzb2x2ZSh7XG5cdCAgICAgICAgICBpc1N0cmVhbWluZ1N1cHBvcnRlZDogZnVsbFJlYWRlci5pc1N0cmVhbWluZ1N1cHBvcnRlZCxcblx0ICAgICAgICAgIGlzUmFuZ2VTdXBwb3J0ZWQ6IGZ1bGxSZWFkZXIuaXNSYW5nZVN1cHBvcnRlZCxcblx0ICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGZ1bGxSZWFkZXIuY29udGVudExlbmd0aFxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9LCBoZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QpO1xuXHQgICAgICByZXR1cm4gaGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgIH0pO1xuXHQgICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXRSYW5nZVJlYWRlclwiLCAoZGF0YSwgc2luaykgPT4ge1xuXHQgICAgICAoMCwgX3V0aWwuYXNzZXJ0KSh0aGlzLl9uZXR3b3JrU3RyZWFtLCBcIkdldFJhbmdlUmVhZGVyIC0gbm8gYElQREZTdHJlYW1gIGluc3RhbmNlIGF2YWlsYWJsZS5cIik7XG5cdCAgICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5fbmV0d29ya1N0cmVhbS5nZXRSYW5nZVJlYWRlcihkYXRhLmJlZ2luLCBkYXRhLmVuZCk7XG5cdCAgICAgIGlmICghcmFuZ2VSZWFkZXIpIHtcblx0ICAgICAgICBzaW5rLmNsb3NlKCk7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHNpbmsub25QdWxsID0gKCkgPT4ge1xuXHQgICAgICAgIHJhbmdlUmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh7XG5cdCAgICAgICAgICB2YWx1ZSxcblx0ICAgICAgICAgIGRvbmVcblx0ICAgICAgICB9KSB7XG5cdCAgICAgICAgICBpZiAoZG9uZSkge1xuXHQgICAgICAgICAgICBzaW5rLmNsb3NlKCk7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsIFwiR2V0UmFuZ2VSZWFkZXIgLSBleHBlY3RlZCBhbiBBcnJheUJ1ZmZlci5cIik7XG5cdCAgICAgICAgICBzaW5rLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpLCAxLCBbdmFsdWVdKTtcblx0ICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4ge1xuXHQgICAgICAgICAgc2luay5lcnJvcihyZWFzb24pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9O1xuXHQgICAgICBzaW5rLm9uQ2FuY2VsID0gcmVhc29uID0+IHtcblx0ICAgICAgICByYW5nZVJlYWRlci5jYW5jZWwocmVhc29uKTtcblx0ICAgICAgICBzaW5rLnJlYWR5LmNhdGNoKHJlYWR5UmVhc29uID0+IHtcblx0ICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aHJvdyByZWFkeVJlYXNvbjtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfTtcblx0ICAgIH0pO1xuXHQgICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXREb2NcIiwgKHtcblx0ICAgICAgcGRmSW5mb1xuXHQgICAgfSkgPT4ge1xuXHQgICAgICB0aGlzLl9udW1QYWdlcyA9IHBkZkluZm8ubnVtUGFnZXM7XG5cdCAgICAgIHRoaXMuX2h0bWxGb3JYZmEgPSBwZGZJbmZvLmh0bWxGb3JYZmE7XG5cdCAgICAgIGRlbGV0ZSBwZGZJbmZvLmh0bWxGb3JYZmE7XG5cdCAgICAgIGxvYWRpbmdUYXNrLl9jYXBhYmlsaXR5LnJlc29sdmUobmV3IFBERkRvY3VtZW50UHJveHkocGRmSW5mbywgdGhpcykpO1xuXHQgICAgfSk7XG5cdCAgICBtZXNzYWdlSGFuZGxlci5vbihcIkRvY0V4Y2VwdGlvblwiLCBmdW5jdGlvbiAoZXgpIHtcblx0ICAgICAgbGV0IHJlYXNvbjtcblx0ICAgICAgc3dpdGNoIChleC5uYW1lKSB7XG5cdCAgICAgICAgY2FzZSBcIlBhc3N3b3JkRXhjZXB0aW9uXCI6XG5cdCAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuUGFzc3dvcmRFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguY29kZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiSW52YWxpZFBERkV4Y2VwdGlvblwiOlxuXHQgICAgICAgICAgcmVhc29uID0gbmV3IF91dGlsLkludmFsaWRQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiTWlzc2luZ1BERkV4Y2VwdGlvblwiOlxuXHQgICAgICAgICAgcmVhc29uID0gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oZXgubWVzc2FnZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCI6XG5cdCAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LnN0YXR1cyk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCI6XG5cdCAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKGV4Lm1lc3NhZ2UsIGV4LmRldGFpbHMpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJEb2NFeGNlcHRpb24gLSBleHBlY3RlZCBhIHZhbGlkIEVycm9yLlwiKTtcblx0ICAgICAgfVxuXHQgICAgICBsb2FkaW5nVGFzay5fY2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcblx0ICAgIH0pO1xuXHQgICAgbWVzc2FnZUhhbmRsZXIub24oXCJQYXNzd29yZFJlcXVlc3RcIiwgZXhjZXB0aW9uID0+IHtcblx0ICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICAgIGlmIChsb2FkaW5nVGFzay5vblBhc3N3b3JkKSB7XG5cdCAgICAgICAgY29uc3QgdXBkYXRlUGFzc3dvcmQgPSBwYXNzd29yZCA9PiB7XG5cdCAgICAgICAgICBpZiAocGFzc3dvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuXHQgICAgICAgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KHBhc3N3b3JkKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICAgICAgICBwYXNzd29yZFxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBsb2FkaW5nVGFzay5vblBhc3N3b3JkKHVwZGF0ZVBhc3N3b3JkLCBleGNlcHRpb24uY29kZSk7XG5cdCAgICAgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QoZXgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbihleGNlcHRpb24ubWVzc2FnZSwgZXhjZXB0aW9uLmNvZGUpKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgICB9KTtcblx0ICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRGF0YUxvYWRlZFwiLCBkYXRhID0+IHtcblx0ICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcz8uKHtcblx0ICAgICAgICBsb2FkZWQ6IGRhdGEubGVuZ3RoLFxuXHQgICAgICAgIHRvdGFsOiBkYXRhLmxlbmd0aFxuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy5kb3dubG9hZEluZm9DYXBhYmlsaXR5LnJlc29sdmUoZGF0YSk7XG5cdCAgICB9KTtcblx0ICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiU3RhcnRSZW5kZXJQYWdlXCIsIGRhdGEgPT4ge1xuXHQgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgcGFnZSA9IHRoaXMuI3BhZ2VDYWNoZS5nZXQoZGF0YS5wYWdlSW5kZXgpO1xuXHQgICAgICBwYWdlLl9zdGFydFJlbmRlclBhZ2UoZGF0YS50cmFuc3BhcmVuY3ksIGRhdGEuY2FjaGVLZXkpO1xuXHQgICAgfSk7XG5cdCAgICBtZXNzYWdlSGFuZGxlci5vbihcImNvbW1vbm9ialwiLCAoW2lkLCB0eXBlLCBleHBvcnRlZERhdGFdKSA9PiB7XG5cdCAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5jb21tb25PYmpzLmhhcyhpZCkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgc3dpdGNoICh0eXBlKSB7XG5cdCAgICAgICAgY2FzZSBcIkZvbnRcIjpcblx0ICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BhcmFtcztcblx0ICAgICAgICAgIGlmIChcImVycm9yXCIgaW4gZXhwb3J0ZWREYXRhKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IGV4cG9ydGVkRXJyb3IgPSBleHBvcnRlZERhdGEuZXJyb3I7XG5cdCAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgRXJyb3IgZHVyaW5nIGZvbnQgbG9hZGluZzogJHtleHBvcnRlZEVycm9yfWApO1xuXHQgICAgICAgICAgICB0aGlzLmNvbW1vbk9ianMucmVzb2x2ZShpZCwgZXhwb3J0ZWRFcnJvcik7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgY29uc3QgaW5zcGVjdEZvbnQgPSBwYXJhbXMucGRmQnVnICYmIGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvcj8uZW5hYmxlZCA/IChmb250LCB1cmwpID0+IGdsb2JhbFRoaXMuRm9udEluc3BlY3Rvci5mb250QWRkZWQoZm9udCwgdXJsKSA6IG51bGw7XG5cdCAgICAgICAgICBjb25zdCBmb250ID0gbmV3IF9mb250X2xvYWRlci5Gb250RmFjZU9iamVjdChleHBvcnRlZERhdGEsIHtcblx0ICAgICAgICAgICAgaXNFdmFsU3VwcG9ydGVkOiBwYXJhbXMuaXNFdmFsU3VwcG9ydGVkLFxuXHQgICAgICAgICAgICBkaXNhYmxlRm9udEZhY2U6IHBhcmFtcy5kaXNhYmxlRm9udEZhY2UsXG5cdCAgICAgICAgICAgIGlnbm9yZUVycm9yczogcGFyYW1zLmlnbm9yZUVycm9ycyxcblx0ICAgICAgICAgICAgaW5zcGVjdEZvbnRcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgdGhpcy5mb250TG9hZGVyLmJpbmQoZm9udCkuY2F0Y2gocmVhc29uID0+IHtcblx0ICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkZvbnRGYWxsYmFja1wiLCB7XG5cdCAgICAgICAgICAgICAgaWRcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcblx0ICAgICAgICAgICAgaWYgKCFwYXJhbXMuZm9udEV4dHJhUHJvcGVydGllcyAmJiBmb250LmRhdGEpIHtcblx0ICAgICAgICAgICAgICBmb250LmRhdGEgPSBudWxsO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBmb250KTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcIkZvbnRQYXRoXCI6XG5cdCAgICAgICAgY2FzZSBcIkltYWdlXCI6XG5cdCAgICAgICAgY2FzZSBcIlBhdHRlcm5cIjpcblx0ICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBleHBvcnRlZERhdGEpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR290IHVua25vd24gY29tbW9uIG9iamVjdCB0eXBlICR7dHlwZX1gKTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICBtZXNzYWdlSGFuZGxlci5vbihcIm9ialwiLCAoW2lkLCBwYWdlSW5kZXgsIHR5cGUsIGltYWdlRGF0YV0pID0+IHtcblx0ICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IHBhZ2VQcm94eSA9IHRoaXMuI3BhZ2VDYWNoZS5nZXQocGFnZUluZGV4KTtcblx0ICAgICAgaWYgKHBhZ2VQcm94eS5vYmpzLmhhcyhpZCkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgc3dpdGNoICh0eXBlKSB7XG5cdCAgICAgICAgY2FzZSBcIkltYWdlXCI6XG5cdCAgICAgICAgICBwYWdlUHJveHkub2Jqcy5yZXNvbHZlKGlkLCBpbWFnZURhdGEpO1xuXHQgICAgICAgICAgaWYgKGltYWdlRGF0YSkge1xuXHQgICAgICAgICAgICBsZXQgbGVuZ3RoO1xuXHQgICAgICAgICAgICBpZiAoaW1hZ2VEYXRhLmJpdG1hcCkge1xuXHQgICAgICAgICAgICAgIGNvbnN0IHtcblx0ICAgICAgICAgICAgICAgIHdpZHRoLFxuXHQgICAgICAgICAgICAgICAgaGVpZ2h0XG5cdCAgICAgICAgICAgICAgfSA9IGltYWdlRGF0YTtcblx0ICAgICAgICAgICAgICBsZW5ndGggPSB3aWR0aCAqIGhlaWdodCAqIDQ7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgbGVuZ3RoID0gaW1hZ2VEYXRhLmRhdGE/Lmxlbmd0aCB8fCAwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChsZW5ndGggPiBfdXRpbC5NQVhfSU1BR0VfU0laRV9UT19DQUNIRSkge1xuXHQgICAgICAgICAgICAgIHBhZ2VQcm94eS5fbWF5YmVDbGVhbnVwQWZ0ZXJSZW5kZXIgPSB0cnVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuXHQgICAgICAgICAgcGFnZVByb3h5Lm9ianMucmVzb2x2ZShpZCwgaW1hZ2VEYXRhKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCB1bmtub3duIG9iamVjdCB0eXBlICR7dHlwZX1gKTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICBtZXNzYWdlSGFuZGxlci5vbihcIkRvY1Byb2dyZXNzXCIsIGRhdGEgPT4ge1xuXHQgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgbG9hZGluZ1Rhc2sub25Qcm9ncmVzcz8uKHtcblx0ICAgICAgICBsb2FkZWQ6IGRhdGEubG9hZGVkLFxuXHQgICAgICAgIHRvdGFsOiBkYXRhLnRvdGFsXG5cdCAgICAgIH0pO1xuXHQgICAgfSk7XG5cdCAgICBtZXNzYWdlSGFuZGxlci5vbihcIkZldGNoQnVpbHRJbkNNYXBcIiwgZGF0YSA9PiB7XG5cdCAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZC5cIikpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghdGhpcy5jTWFwUmVhZGVyRmFjdG9yeSkge1xuXHQgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJDTWFwUmVhZGVyRmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQsIHNlZSB0aGUgYHVzZVdvcmtlckZldGNoYCBwYXJhbWV0ZXIuXCIpKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy5jTWFwUmVhZGVyRmFjdG9yeS5mZXRjaChkYXRhKTtcblx0ICAgIH0pO1xuXHQgICAgbWVzc2FnZUhhbmRsZXIub24oXCJGZXRjaFN0YW5kYXJkRm9udERhdGFcIiwgZGF0YSA9PiB7XG5cdCAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZC5cIikpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeSkge1xuXHQgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQsIHNlZSB0aGUgYHVzZVdvcmtlckZldGNoYCBwYXJhbWV0ZXIuXCIpKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeS5mZXRjaChkYXRhKTtcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXREYXRhKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGF0YVwiLCBudWxsKTtcblx0ICB9XG5cdCAgc2F2ZURvY3VtZW50KCkge1xuXHQgICAgaWYgKHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2l6ZSA8PSAwKSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShcInNhdmVEb2N1bWVudCBjYWxsZWQgd2hpbGUgYGFubm90YXRpb25TdG9yYWdlYCBpcyBlbXB0eSwgXCIgKyBcInBsZWFzZSB1c2UgdGhlIGdldERhdGEtbWV0aG9kIGluc3RlYWQuXCIpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiU2F2ZURvY3VtZW50XCIsIHtcblx0ICAgICAgaXNQdXJlWGZhOiAhIXRoaXMuX2h0bWxGb3JYZmEsXG5cdCAgICAgIG51bVBhZ2VzOiB0aGlzLl9udW1QYWdlcyxcblx0ICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2VyaWFsaXphYmxlLFxuXHQgICAgICBmaWxlbmFtZTogdGhpcy5fZnVsbFJlYWRlcj8uZmlsZW5hbWUgPz8gbnVsbFxuXHQgICAgfSkuZmluYWxseSgoKSA9PiB7XG5cdCAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UucmVzZXRNb2RpZmllZCgpO1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldFBhZ2UocGFnZU51bWJlcikge1xuXHQgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhZ2VOdW1iZXIpIHx8IHBhZ2VOdW1iZXIgPD0gMCB8fCBwYWdlTnVtYmVyID4gdGhpcy5fbnVtUGFnZXMpIHtcblx0ICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgcGFnZSByZXF1ZXN0LlwiKSk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBwYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMSxcblx0ICAgICAgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI3BhZ2VQcm9taXNlcy5nZXQocGFnZUluZGV4KTtcblx0ICAgIGlmIChjYWNoZWRQcm9taXNlKSB7XG5cdCAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZVwiLCB7XG5cdCAgICAgIHBhZ2VJbmRleFxuXHQgICAgfSkudGhlbihwYWdlSW5mbyA9PiB7XG5cdCAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRyYW5zcG9ydCBkZXN0cm95ZWRcIik7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgcGFnZSA9IG5ldyBQREZQYWdlUHJveHkocGFnZUluZGV4LCBwYWdlSW5mbywgdGhpcywgdGhpcy5fcGFyYW1zLnBkZkJ1Zyk7XG5cdCAgICAgIHRoaXMuI3BhZ2VDYWNoZS5zZXQocGFnZUluZGV4LCBwYWdlKTtcblx0ICAgICAgcmV0dXJuIHBhZ2U7XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuI3BhZ2VQcm9taXNlcy5zZXQocGFnZUluZGV4LCBwcm9taXNlKTtcblx0ICAgIHJldHVybiBwcm9taXNlO1xuXHQgIH1cblx0ICBnZXRQYWdlSW5kZXgocmVmKSB7XG5cdCAgICBpZiAodHlwZW9mIHJlZiAhPT0gXCJvYmplY3RcIiB8fCByZWYgPT09IG51bGwgfHwgIU51bWJlci5pc0ludGVnZXIocmVmLm51bSkgfHwgcmVmLm51bSA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIocmVmLmdlbikgfHwgcmVmLmdlbiA8IDApIHtcblx0ICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgcGFnZUluZGV4IHJlcXVlc3QuXCIpKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VJbmRleFwiLCB7XG5cdCAgICAgIG51bTogcmVmLm51bSxcblx0ICAgICAgZ2VuOiByZWYuZ2VuXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0QW5ub3RhdGlvbnMocGFnZUluZGV4LCBpbnRlbnQpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldEFubm90YXRpb25zXCIsIHtcblx0ICAgICAgcGFnZUluZGV4LFxuXHQgICAgICBpbnRlbnRcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXRGaWVsZE9iamVjdHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jY2FjaGVTaW1wbGVNZXRob2QoXCJHZXRGaWVsZE9iamVjdHNcIik7XG5cdCAgfVxuXHQgIGhhc0pTQWN0aW9ucygpIHtcblx0ICAgIHJldHVybiB0aGlzLiNjYWNoZVNpbXBsZU1ldGhvZChcIkhhc0pTQWN0aW9uc1wiKTtcblx0ICB9XG5cdCAgZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldENhbGN1bGF0aW9uT3JkZXJJZHNcIiwgbnVsbCk7XG5cdCAgfVxuXHQgIGdldERlc3RpbmF0aW9ucygpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERlc3RpbmF0aW9uc1wiLCBudWxsKTtcblx0ICB9XG5cdCAgZ2V0RGVzdGluYXRpb24oaWQpIHtcblx0ICAgIGlmICh0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgZGVzdGluYXRpb24gcmVxdWVzdC5cIikpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGVzdGluYXRpb25cIiwge1xuXHQgICAgICBpZFxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldFBhZ2VMYWJlbHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGFiZWxzXCIsIG51bGwpO1xuXHQgIH1cblx0ICBnZXRQYWdlTGF5b3V0KCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUxheW91dFwiLCBudWxsKTtcblx0ICB9XG5cdCAgZ2V0UGFnZU1vZGUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTW9kZVwiLCBudWxsKTtcblx0ICB9XG5cdCAgZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRWaWV3ZXJQcmVmZXJlbmNlc1wiLCBudWxsKTtcblx0ICB9XG5cdCAgZ2V0T3BlbkFjdGlvbigpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldE9wZW5BY3Rpb25cIiwgbnVsbCk7XG5cdCAgfVxuXHQgIGdldEF0dGFjaG1lbnRzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QXR0YWNobWVudHNcIiwgbnVsbCk7XG5cdCAgfVxuXHQgIGdldEphdmFTY3JpcHQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRKYXZhU2NyaXB0XCIsIG51bGwpO1xuXHQgIH1cblx0ICBnZXREb2NKU0FjdGlvbnMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREb2NKU0FjdGlvbnNcIiwgbnVsbCk7XG5cdCAgfVxuXHQgIGdldFBhZ2VKU0FjdGlvbnMocGFnZUluZGV4KSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlSlNBY3Rpb25zXCIsIHtcblx0ICAgICAgcGFnZUluZGV4XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0U3RydWN0VHJlZShwYWdlSW5kZXgpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFN0cnVjdFRyZWVcIiwge1xuXHQgICAgICBwYWdlSW5kZXhcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXRPdXRsaW5lKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3V0bGluZVwiLCBudWxsKTtcblx0ICB9XG5cdCAgZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3B0aW9uYWxDb250ZW50Q29uZmlnXCIsIG51bGwpLnRoZW4ocmVzdWx0cyA9PiB7XG5cdCAgICAgIHJldHVybiBuZXcgX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnLk9wdGlvbmFsQ29udGVudENvbmZpZyhyZXN1bHRzKTtcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXRQZXJtaXNzaW9ucygpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBlcm1pc3Npb25zXCIsIG51bGwpO1xuXHQgIH1cblx0ICBnZXRNZXRhZGF0YSgpIHtcblx0ICAgIGNvbnN0IG5hbWUgPSBcIkdldE1ldGFkYXRhXCIsXG5cdCAgICAgIGNhY2hlZFByb21pc2UgPSB0aGlzLiNtZXRob2RQcm9taXNlcy5nZXQobmFtZSk7XG5cdCAgICBpZiAoY2FjaGVkUHJvbWlzZSkge1xuXHQgICAgICByZXR1cm4gY2FjaGVkUHJvbWlzZTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShuYW1lLCBudWxsKS50aGVuKHJlc3VsdHMgPT4ge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGluZm86IHJlc3VsdHNbMF0sXG5cdCAgICAgICAgbWV0YWRhdGE6IHJlc3VsdHNbMV0gPyBuZXcgX21ldGFkYXRhLk1ldGFkYXRhKHJlc3VsdHNbMV0pIDogbnVsbCxcblx0ICAgICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTogdGhpcy5fZnVsbFJlYWRlcj8uZmlsZW5hbWUgPz8gbnVsbCxcblx0ICAgICAgICBjb250ZW50TGVuZ3RoOiB0aGlzLl9mdWxsUmVhZGVyPy5jb250ZW50TGVuZ3RoID8/IG51bGxcblx0ICAgICAgfTtcblx0ICAgIH0pO1xuXHQgICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuc2V0KG5hbWUsIHByb21pc2UpO1xuXHQgICAgcmV0dXJuIHByb21pc2U7XG5cdCAgfVxuXHQgIGdldE1hcmtJbmZvKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0TWFya0luZm9cIiwgbnVsbCk7XG5cdCAgfVxuXHQgIGFzeW5jIHN0YXJ0Q2xlYW51cChrZWVwTG9hZGVkRm9udHMgPSBmYWxzZSkge1xuXHQgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGF3YWl0IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiQ2xlYW51cFwiLCBudWxsKTtcblx0ICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLiNwYWdlQ2FjaGUudmFsdWVzKCkpIHtcblx0ICAgICAgY29uc3QgY2xlYW51cFN1Y2Nlc3NmdWwgPSBwYWdlLmNsZWFudXAoKTtcblx0ICAgICAgaWYgKCFjbGVhbnVwU3VjY2Vzc2Z1bCkge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RhcnRDbGVhbnVwOiBQYWdlICR7cGFnZS5wYWdlTnVtYmVyfSBpcyBjdXJyZW50bHkgcmVuZGVyaW5nLmApO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLmNvbW1vbk9ianMuY2xlYXIoKTtcblx0ICAgIGlmICgha2VlcExvYWRlZEZvbnRzKSB7XG5cdCAgICAgIHRoaXMuZm9udExvYWRlci5jbGVhcigpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuY2xlYXIoKTtcblx0ICAgIHRoaXMuZmlsdGVyRmFjdG9yeS5kZXN0cm95KHRydWUpO1xuXHQgIH1cblx0ICBnZXQgbG9hZGluZ1BhcmFtcygpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgZGlzYWJsZUF1dG9GZXRjaCxcblx0ICAgICAgZW5hYmxlWGZhXG5cdCAgICB9ID0gdGhpcy5fcGFyYW1zO1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwibG9hZGluZ1BhcmFtc1wiLCB7XG5cdCAgICAgIGRpc2FibGVBdXRvRmV0Y2gsXG5cdCAgICAgIGVuYWJsZVhmYVxuXHQgICAgfSk7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFBERk9iamVjdHMge1xuXHQgICNvYmpzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICAjZW5zdXJlT2JqKG9iaklkKSB7XG5cdCAgICBjb25zdCBvYmogPSB0aGlzLiNvYmpzW29iaklkXTtcblx0ICAgIGlmIChvYmopIHtcblx0ICAgICAgcmV0dXJuIG9iajtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLiNvYmpzW29iaklkXSA9IHtcblx0ICAgICAgY2FwYWJpbGl0eTogbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCksXG5cdCAgICAgIGRhdGE6IG51bGxcblx0ICAgIH07XG5cdCAgfVxuXHQgIGdldChvYmpJZCwgY2FsbGJhY2sgPSBudWxsKSB7XG5cdCAgICBpZiAoY2FsbGJhY2spIHtcblx0ICAgICAgY29uc3Qgb2JqID0gdGhpcy4jZW5zdXJlT2JqKG9iaklkKTtcblx0ICAgICAgb2JqLmNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IGNhbGxiYWNrKG9iai5kYXRhKSk7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgb2JqID0gdGhpcy4jb2Jqc1tvYmpJZF07XG5cdCAgICBpZiAoIW9iaj8uY2FwYWJpbGl0eS5zZXR0bGVkKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWVzdGluZyBvYmplY3QgdGhhdCBpc24ndCByZXNvbHZlZCB5ZXQgJHtvYmpJZH0uYCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gb2JqLmRhdGE7XG5cdCAgfVxuXHQgIGhhcyhvYmpJZCkge1xuXHQgICAgY29uc3Qgb2JqID0gdGhpcy4jb2Jqc1tvYmpJZF07XG5cdCAgICByZXR1cm4gb2JqPy5jYXBhYmlsaXR5LnNldHRsZWQgfHwgZmFsc2U7XG5cdCAgfVxuXHQgIHJlc29sdmUob2JqSWQsIGRhdGEgPSBudWxsKSB7XG5cdCAgICBjb25zdCBvYmogPSB0aGlzLiNlbnN1cmVPYmoob2JqSWQpO1xuXHQgICAgb2JqLmRhdGEgPSBkYXRhO1xuXHQgICAgb2JqLmNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgIH1cblx0ICBjbGVhcigpIHtcblx0ICAgIGZvciAoY29uc3Qgb2JqSWQgaW4gdGhpcy4jb2Jqcykge1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgZGF0YVxuXHQgICAgICB9ID0gdGhpcy4jb2Jqc1tvYmpJZF07XG5cdCAgICAgIGRhdGE/LmJpdG1hcD8uY2xvc2UoKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI29ianMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBSZW5kZXJUYXNrIHtcblx0ICAjaW50ZXJuYWxSZW5kZXJUYXNrID0gbnVsbDtcblx0ICBjb25zdHJ1Y3RvcihpbnRlcm5hbFJlbmRlclRhc2spIHtcblx0ICAgIHRoaXMuI2ludGVybmFsUmVuZGVyVGFzayA9IGludGVybmFsUmVuZGVyVGFzaztcblx0ICAgIHRoaXMub25Db250aW51ZSA9IG51bGw7XG5cdCAgfVxuXHQgIGdldCBwcm9taXNlKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI2ludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIGNhbmNlbChleHRyYURlbGF5ID0gMCkge1xuXHQgICAgdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrLmNhbmNlbChudWxsLCBleHRyYURlbGF5KTtcblx0ICB9XG5cdCAgZ2V0IHNlcGFyYXRlQW5ub3RzKCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBzZXBhcmF0ZUFubm90c1xuXHQgICAgfSA9IHRoaXMuI2ludGVybmFsUmVuZGVyVGFzay5vcGVyYXRvckxpc3Q7XG5cdCAgICBpZiAoIXNlcGFyYXRlQW5ub3RzKSB7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHtcblx0ICAgICAgYW5ub3RhdGlvbkNhbnZhc01hcFxuXHQgICAgfSA9IHRoaXMuI2ludGVybmFsUmVuZGVyVGFzaztcblx0ICAgIHJldHVybiBzZXBhcmF0ZUFubm90cy5mb3JtIHx8IHNlcGFyYXRlQW5ub3RzLmNhbnZhcyAmJiBhbm5vdGF0aW9uQ2FudmFzTWFwPy5zaXplID4gMDtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5SZW5kZXJUYXNrID0gUmVuZGVyVGFzaztcblx0Y2xhc3MgSW50ZXJuYWxSZW5kZXJUYXNrIHtcblx0ICBzdGF0aWMgI2NhbnZhc0luVXNlID0gbmV3IFdlYWtTZXQoKTtcblx0ICBjb25zdHJ1Y3Rvcih7XG5cdCAgICBjYWxsYmFjayxcblx0ICAgIHBhcmFtcyxcblx0ICAgIG9ianMsXG5cdCAgICBjb21tb25PYmpzLFxuXHQgICAgYW5ub3RhdGlvbkNhbnZhc01hcCxcblx0ICAgIG9wZXJhdG9yTGlzdCxcblx0ICAgIHBhZ2VJbmRleCxcblx0ICAgIGNhbnZhc0ZhY3RvcnksXG5cdCAgICBmaWx0ZXJGYWN0b3J5LFxuXHQgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZmFsc2UsXG5cdCAgICBwZGZCdWcgPSBmYWxzZSxcblx0ICAgIHBhZ2VDb2xvcnMgPSBudWxsXG5cdCAgfSkge1xuXHQgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXHQgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICB0aGlzLm9ianMgPSBvYmpzO1xuXHQgICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2Jqcztcblx0ICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCA9IGFubm90YXRpb25DYW52YXNNYXA7XG5cdCAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IG51bGw7XG5cdCAgICB0aGlzLm9wZXJhdG9yTGlzdCA9IG9wZXJhdG9yTGlzdDtcblx0ICAgIHRoaXMuX3BhZ2VJbmRleCA9IHBhZ2VJbmRleDtcblx0ICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG5cdCAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBmaWx0ZXJGYWN0b3J5O1xuXHQgICAgdGhpcy5fcGRmQnVnID0gcGRmQnVnO1xuXHQgICAgdGhpcy5wYWdlQ29sb3JzID0gcGFnZUNvbG9ycztcblx0ICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuXHQgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgPSBudWxsO1xuXHQgICAgdGhpcy5ncmFwaGljc1JlYWR5ID0gZmFsc2U7XG5cdCAgICB0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09IHRydWUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcblx0ICAgIHRoaXMuY2FuY2VsbGVkID0gZmFsc2U7XG5cdCAgICB0aGlzLmNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIHRoaXMudGFzayA9IG5ldyBSZW5kZXJUYXNrKHRoaXMpO1xuXHQgICAgdGhpcy5fY2FuY2VsQm91bmQgPSB0aGlzLmNhbmNlbC5iaW5kKHRoaXMpO1xuXHQgICAgdGhpcy5fY29udGludWVCb3VuZCA9IHRoaXMuX2NvbnRpbnVlLmJpbmQodGhpcyk7XG5cdCAgICB0aGlzLl9zY2hlZHVsZU5leHRCb3VuZCA9IHRoaXMuX3NjaGVkdWxlTmV4dC5iaW5kKHRoaXMpO1xuXHQgICAgdGhpcy5fbmV4dEJvdW5kID0gdGhpcy5fbmV4dC5iaW5kKHRoaXMpO1xuXHQgICAgdGhpcy5fY2FudmFzID0gcGFyYW1zLmNhbnZhc0NvbnRleHQuY2FudmFzO1xuXHQgIH1cblx0ICBnZXQgY29tcGxldGVkKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuY2FwYWJpbGl0eS5wcm9taXNlLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcblx0ICB9XG5cdCAgaW5pdGlhbGl6ZUdyYXBoaWNzKHtcblx0ICAgIHRyYW5zcGFyZW5jeSA9IGZhbHNlLFxuXHQgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnXG5cdCAgfSkge1xuXHQgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl9jYW52YXMpIHtcblx0ICAgICAgaWYgKEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuaGFzKHRoaXMuX2NhbnZhcykpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIHRoZSBzYW1lIGNhbnZhcyBkdXJpbmcgbXVsdGlwbGUgcmVuZGVyKCkgb3BlcmF0aW9ucy4gXCIgKyBcIlVzZSBkaWZmZXJlbnQgY2FudmFzIG9yIGVuc3VyZSBwcmV2aW91cyBvcGVyYXRpb25zIHdlcmUgXCIgKyBcImNhbmNlbGxlZCBvciBjb21wbGV0ZWQuXCIpO1xuXHQgICAgICB9XG5cdCAgICAgIEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuYWRkKHRoaXMuX2NhbnZhcyk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fcGRmQnVnICYmIGdsb2JhbFRoaXMuU3RlcHBlck1hbmFnZXI/LmVuYWJsZWQpIHtcblx0ICAgICAgdGhpcy5zdGVwcGVyID0gZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlci5jcmVhdGUodGhpcy5fcGFnZUluZGV4KTtcblx0ICAgICAgdGhpcy5zdGVwcGVyLmluaXQodGhpcy5vcGVyYXRvckxpc3QpO1xuXHQgICAgICB0aGlzLnN0ZXBwZXIubmV4dEJyZWFrUG9pbnQgPSB0aGlzLnN0ZXBwZXIuZ2V0TmV4dEJyZWFrUG9pbnQoKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHtcblx0ICAgICAgY2FudmFzQ29udGV4dCxcblx0ICAgICAgdmlld3BvcnQsXG5cdCAgICAgIHRyYW5zZm9ybSxcblx0ICAgICAgYmFja2dyb3VuZFxuXHQgICAgfSA9IHRoaXMucGFyYW1zO1xuXHQgICAgdGhpcy5nZnggPSBuZXcgX2NhbnZhcy5DYW52YXNHcmFwaGljcyhjYW52YXNDb250ZXh0LCB0aGlzLmNvbW1vbk9ianMsIHRoaXMub2JqcywgdGhpcy5jYW52YXNGYWN0b3J5LCB0aGlzLmZpbHRlckZhY3RvcnksIHtcblx0ICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnXG5cdCAgICB9LCB0aGlzLmFubm90YXRpb25DYW52YXNNYXAsIHRoaXMucGFnZUNvbG9ycyk7XG5cdCAgICB0aGlzLmdmeC5iZWdpbkRyYXdpbmcoe1xuXHQgICAgICB0cmFuc2Zvcm0sXG5cdCAgICAgIHZpZXdwb3J0LFxuXHQgICAgICB0cmFuc3BhcmVuY3ksXG5cdCAgICAgIGJhY2tncm91bmRcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5vcGVyYXRvckxpc3RJZHggPSAwO1xuXHQgICAgdGhpcy5ncmFwaGljc1JlYWR5ID0gdHJ1ZTtcblx0ICAgIHRoaXMuZ3JhcGhpY3NSZWFkeUNhbGxiYWNrPy4oKTtcblx0ICB9XG5cdCAgY2FuY2VsKGVycm9yID0gbnVsbCwgZXh0cmFEZWxheSA9IDApIHtcblx0ICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuXHQgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuXHQgICAgdGhpcy5nZng/LmVuZERyYXdpbmcoKTtcblx0ICAgIGlmICh0aGlzLl9jYW52YXMpIHtcblx0ICAgICAgSW50ZXJuYWxSZW5kZXJUYXNrLiNjYW52YXNJblVzZS5kZWxldGUodGhpcy5fY2FudmFzKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY2FsbGJhY2soZXJyb3IgfHwgbmV3IF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbihgUmVuZGVyaW5nIGNhbmNlbGxlZCwgcGFnZSAke3RoaXMuX3BhZ2VJbmRleCArIDF9YCwgXCJjYW52YXNcIiwgZXh0cmFEZWxheSkpO1xuXHQgIH1cblx0ICBvcGVyYXRvckxpc3RDaGFuZ2VkKCkge1xuXHQgICAgaWYgKCF0aGlzLmdyYXBoaWNzUmVhZHkpIHtcblx0ICAgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2sgfHw9IHRoaXMuX2NvbnRpbnVlQm91bmQ7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuc3RlcHBlcj8udXBkYXRlT3BlcmF0b3JMaXN0KHRoaXMub3BlcmF0b3JMaXN0KTtcblx0ICAgIGlmICh0aGlzLnJ1bm5pbmcpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fY29udGludWUoKTtcblx0ICB9XG5cdCAgX2NvbnRpbnVlKCkge1xuXHQgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcblx0ICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy50YXNrLm9uQ29udGludWUpIHtcblx0ICAgICAgdGhpcy50YXNrLm9uQ29udGludWUodGhpcy5fc2NoZWR1bGVOZXh0Qm91bmQpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fc2NoZWR1bGVOZXh0KCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9zY2hlZHVsZU5leHQoKSB7XG5cdCAgICBpZiAodGhpcy5fdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG5cdCAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHQgICAgICAgIHRoaXMuX25leHRCb3VuZCgpLmNhdGNoKHRoaXMuX2NhbmNlbEJvdW5kKTtcblx0ICAgICAgfSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKHRoaXMuX25leHRCb3VuZCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBhc3luYyBfbmV4dCgpIHtcblx0ICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IHRoaXMuZ2Z4LmV4ZWN1dGVPcGVyYXRvckxpc3QodGhpcy5vcGVyYXRvckxpc3QsIHRoaXMub3BlcmF0b3JMaXN0SWR4LCB0aGlzLl9jb250aW51ZUJvdW5kLCB0aGlzLnN0ZXBwZXIpO1xuXHQgICAgaWYgKHRoaXMub3BlcmF0b3JMaXN0SWR4ID09PSB0aGlzLm9wZXJhdG9yTGlzdC5hcmdzQXJyYXkubGVuZ3RoKSB7XG5cdCAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuXHQgICAgICBpZiAodGhpcy5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG5cdCAgICAgICAgdGhpcy5nZnguZW5kRHJhd2luZyh0aGlzLnBhZ2VDb2xvcnMpO1xuXHQgICAgICAgIGlmICh0aGlzLl9jYW52YXMpIHtcblx0ICAgICAgICAgIEludGVybmFsUmVuZGVyVGFzay4jY2FudmFzSW5Vc2UuZGVsZXRlKHRoaXMuX2NhbnZhcyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY2FsbGJhY2soKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRjb25zdCB2ZXJzaW9uID0gJzMuNi4xNzInO1xuXHRleHBvcnRzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXHRjb25zdCBidWlsZCA9ICc0ZDNkZmUyNTQnO1xuXHRleHBvcnRzLmJ1aWxkID0gYnVpbGQ7XG5cblx0LyoqKi8gfSksXG5cdC8qIDMgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLlByaW50QW5ub3RhdGlvblN0b3JhZ2UgPSBleHBvcnRzLkFubm90YXRpb25TdG9yYWdlID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX2VkaXRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7XG5cdHZhciBfbXVybXVyaGFzaCA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7XG5cdGNsYXNzIEFubm90YXRpb25TdG9yYWdlIHtcblx0ICAjbW9kaWZpZWQgPSBmYWxzZTtcblx0ICAjc3RvcmFnZSA9IG5ldyBNYXAoKTtcblx0ICBjb25zdHJ1Y3RvcigpIHtcblx0ICAgIHRoaXMub25TZXRNb2RpZmllZCA9IG51bGw7XG5cdCAgICB0aGlzLm9uUmVzZXRNb2RpZmllZCA9IG51bGw7XG5cdCAgICB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvciA9IG51bGw7XG5cdCAgfVxuXHQgIGdldFZhbHVlKGtleSwgZGVmYXVsdFZhbHVlKSB7XG5cdCAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI3N0b3JhZ2UuZ2V0KGtleSk7XG5cdCAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZGVmYXVsdFZhbHVlLCB2YWx1ZSk7XG5cdCAgfVxuXHQgIGdldFJhd1ZhbHVlKGtleSkge1xuXHQgICAgcmV0dXJuIHRoaXMuI3N0b3JhZ2UuZ2V0KGtleSk7XG5cdCAgfVxuXHQgIHJlbW92ZShrZXkpIHtcblx0ICAgIHRoaXMuI3N0b3JhZ2UuZGVsZXRlKGtleSk7XG5cdCAgICBpZiAodGhpcy4jc3RvcmFnZS5zaXplID09PSAwKSB7XG5cdCAgICAgIHRoaXMucmVzZXRNb2RpZmllZCgpO1xuXHQgICAgfVxuXHQgICAgaWYgKHR5cGVvZiB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy4jc3RvcmFnZS52YWx1ZXMoKSkge1xuXHQgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvcikge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvcihudWxsKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgc2V0VmFsdWUoa2V5LCB2YWx1ZSkge1xuXHQgICAgY29uc3Qgb2JqID0gdGhpcy4jc3RvcmFnZS5nZXQoa2V5KTtcblx0ICAgIGxldCBtb2RpZmllZCA9IGZhbHNlO1xuXHQgICAgaWYgKG9iaiAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIGZvciAoY29uc3QgW2VudHJ5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuXHQgICAgICAgIGlmIChvYmpbZW50cnldICE9PSB2YWwpIHtcblx0ICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcblx0ICAgICAgICAgIG9ialtlbnRyeV0gPSB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBtb2RpZmllZCA9IHRydWU7XG5cdCAgICAgIHRoaXMuI3N0b3JhZ2Uuc2V0KGtleSwgdmFsdWUpO1xuXHQgICAgfVxuXHQgICAgaWYgKG1vZGlmaWVkKSB7XG5cdCAgICAgIHRoaXMuI3NldE1vZGlmaWVkKCk7XG5cdCAgICB9XG5cdCAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBfZWRpdG9yLkFubm90YXRpb25FZGl0b3IgJiYgdHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgdGhpcy5vbkFubm90YXRpb25FZGl0b3IodmFsdWUuY29uc3RydWN0b3IuX3R5cGUpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBoYXMoa2V5KSB7XG5cdCAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5oYXMoa2V5KTtcblx0ICB9XG5cdCAgZ2V0QWxsKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI3N0b3JhZ2Uuc2l6ZSA+IDAgPyAoMCwgX3V0aWwub2JqZWN0RnJvbU1hcCkodGhpcy4jc3RvcmFnZSkgOiBudWxsO1xuXHQgIH1cblx0ICBzZXRBbGwob2JqKSB7XG5cdCAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuXHQgICAgICB0aGlzLnNldFZhbHVlKGtleSwgdmFsKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0IHNpemUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5zaXplO1xuXHQgIH1cblx0ICAjc2V0TW9kaWZpZWQoKSB7XG5cdCAgICBpZiAoIXRoaXMuI21vZGlmaWVkKSB7XG5cdCAgICAgIHRoaXMuI21vZGlmaWVkID0gdHJ1ZTtcblx0ICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uU2V0TW9kaWZpZWQgPT09IFwiZnVuY3Rpb25cIikge1xuXHQgICAgICAgIHRoaXMub25TZXRNb2RpZmllZCgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJlc2V0TW9kaWZpZWQoKSB7XG5cdCAgICBpZiAodGhpcy4jbW9kaWZpZWQpIHtcblx0ICAgICAgdGhpcy4jbW9kaWZpZWQgPSBmYWxzZTtcblx0ICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVzZXRNb2RpZmllZCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgICAgdGhpcy5vblJlc2V0TW9kaWZpZWQoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICBnZXQgcHJpbnQoKSB7XG5cdCAgICByZXR1cm4gbmV3IFByaW50QW5ub3RhdGlvblN0b3JhZ2UodGhpcyk7XG5cdCAgfVxuXHQgIGdldCBzZXJpYWxpemFibGUoKSB7XG5cdCAgICBpZiAodGhpcy4jc3RvcmFnZS5zaXplID09PSAwKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY2xvbmUgPSBuZXcgTWFwKCk7XG5cdCAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgdGhpcy4jc3RvcmFnZSkge1xuXHQgICAgICBjb25zdCBzZXJpYWxpemVkID0gdmFsIGluc3RhbmNlb2YgX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yID8gdmFsLnNlcmlhbGl6ZSgpIDogdmFsO1xuXHQgICAgICBpZiAoc2VyaWFsaXplZCkge1xuXHQgICAgICAgIGNsb25lLnNldChrZXksIHNlcmlhbGl6ZWQpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gY2xvbmU7XG5cdCAgfVxuXHQgIHN0YXRpYyBnZXRIYXNoKG1hcCkge1xuXHQgICAgaWYgKCFtYXApIHtcblx0ICAgICAgcmV0dXJuIFwiXCI7XG5cdCAgICB9XG5cdCAgICBjb25zdCBoYXNoID0gbmV3IF9tdXJtdXJoYXNoLk11cm11ckhhc2gzXzY0KCk7XG5cdCAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgbWFwKSB7XG5cdCAgICAgIGhhc2gudXBkYXRlKGAke2tleX06JHtKU09OLnN0cmluZ2lmeSh2YWwpfWApO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGhhc2guaGV4ZGlnZXN0KCk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQW5ub3RhdGlvblN0b3JhZ2UgPSBBbm5vdGF0aW9uU3RvcmFnZTtcblx0Y2xhc3MgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBleHRlbmRzIEFubm90YXRpb25TdG9yYWdlIHtcblx0ICAjc2VyaWFsaXphYmxlID0gbnVsbDtcblx0ICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcblx0ICAgIHN1cGVyKCk7XG5cdCAgICB0aGlzLiNzZXJpYWxpemFibGUgPSBzdHJ1Y3R1cmVkQ2xvbmUocGFyZW50LnNlcmlhbGl6YWJsZSk7XG5cdCAgfVxuXHQgIGdldCBwcmludCgpIHtcblx0ICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJTaG91bGQgbm90IGNhbGwgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZS5wcmludFwiKTtcblx0ICB9XG5cdCAgZ2V0IHNlcmlhbGl6YWJsZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLiNzZXJpYWxpemFibGU7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IFByaW50QW5ub3RhdGlvblN0b3JhZ2U7XG5cblx0LyoqKi8gfSksXG5cdC8qIDQgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLkFubm90YXRpb25FZGl0b3IgPSB2b2lkIDA7XG5cdHZhciBfdG9vbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHRjbGFzcyBBbm5vdGF0aW9uRWRpdG9yIHtcblx0ICAjYm91bmRGb2N1c2luID0gdGhpcy5mb2N1c2luLmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kRm9jdXNvdXQgPSB0aGlzLmZvY3Vzb3V0LmJpbmQodGhpcyk7XG5cdCAgI2hhc0JlZW5TZWxlY3RlZCA9IGZhbHNlO1xuXHQgICNpc0VkaXRpbmcgPSBmYWxzZTtcblx0ICAjaXNJbkVkaXRNb2RlID0gZmFsc2U7XG5cdCAgX3VpTWFuYWdlciA9IG51bGw7XG5cdCAgI3pJbmRleCA9IEFubm90YXRpb25FZGl0b3IuX3pJbmRleCsrO1xuXHQgIHN0YXRpYyBfY29sb3JNYW5hZ2VyID0gbmV3IF90b29scy5Db2xvck1hbmFnZXIoKTtcblx0ICBzdGF0aWMgX3pJbmRleCA9IDE7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEFubm90YXRpb25FZGl0b3IpIHtcblx0ICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEFubm90YXRpb25FZGl0b3IuXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5wYXJlbnQgPSBwYXJhbWV0ZXJzLnBhcmVudDtcblx0ICAgIHRoaXMuaWQgPSBwYXJhbWV0ZXJzLmlkO1xuXHQgICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gbnVsbDtcblx0ICAgIHRoaXMucGFnZUluZGV4ID0gcGFyYW1ldGVycy5wYXJlbnQucGFnZUluZGV4O1xuXHQgICAgdGhpcy5uYW1lID0gcGFyYW1ldGVycy5uYW1lO1xuXHQgICAgdGhpcy5kaXYgPSBudWxsO1xuXHQgICAgdGhpcy5fdWlNYW5hZ2VyID0gcGFyYW1ldGVycy51aU1hbmFnZXI7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHJvdGF0aW9uLFxuXHQgICAgICByYXdEaW1zOiB7XG5cdCAgICAgICAgcGFnZVdpZHRoLFxuXHQgICAgICAgIHBhZ2VIZWlnaHQsXG5cdCAgICAgICAgcGFnZVgsXG5cdCAgICAgICAgcGFnZVlcblx0ICAgICAgfVxuXHQgICAgfSA9IHRoaXMucGFyZW50LnZpZXdwb3J0O1xuXHQgICAgdGhpcy5yb3RhdGlvbiA9IHJvdGF0aW9uO1xuXHQgICAgdGhpcy5wYWdlUm90YXRpb24gPSAoMzYwICsgcm90YXRpb24gLSB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucm90YXRpb24pICUgMzYwO1xuXHQgICAgdGhpcy5wYWdlRGltZW5zaW9ucyA9IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdO1xuXHQgICAgdGhpcy5wYWdlVHJhbnNsYXRpb24gPSBbcGFnZVgsIHBhZ2VZXTtcblx0ICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcblx0ICAgIHRoaXMueCA9IHBhcmFtZXRlcnMueCAvIHdpZHRoO1xuXHQgICAgdGhpcy55ID0gcGFyYW1ldGVycy55IC8gaGVpZ2h0O1xuXHQgICAgdGhpcy5pc0F0dGFjaGVkVG9ET00gPSBmYWxzZTtcblx0ICB9XG5cdCAgc3RhdGljIGdldCBfZGVmYXVsdExpbmVDb2xvcigpIHtcblx0ICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCBcIl9kZWZhdWx0TGluZUNvbG9yXCIsIHRoaXMuX2NvbG9yTWFuYWdlci5nZXRIZXhDb2RlKFwiQ2FudmFzVGV4dFwiKSk7XG5cdCAgfVxuXHQgIGFkZENvbW1hbmRzKHBhcmFtcykge1xuXHQgICAgdGhpcy5fdWlNYW5hZ2VyLmFkZENvbW1hbmRzKHBhcmFtcyk7XG5cdCAgfVxuXHQgIGdldCBjdXJyZW50TGF5ZXIoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdWlNYW5hZ2VyLmN1cnJlbnRMYXllcjtcblx0ICB9XG5cdCAgc2V0SW5CYWNrZ3JvdW5kKCkge1xuXHQgICAgdGhpcy5kaXYuc3R5bGUuekluZGV4ID0gMDtcblx0ICB9XG5cdCAgc2V0SW5Gb3JlZ3JvdW5kKCkge1xuXHQgICAgdGhpcy5kaXYuc3R5bGUuekluZGV4ID0gdGhpcy4jekluZGV4O1xuXHQgIH1cblx0ICBzZXRQYXJlbnQocGFyZW50KSB7XG5cdCAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdCAgICAgIHRoaXMucGFnZUluZGV4ID0gcGFyZW50LnBhZ2VJbmRleDtcblx0ICAgICAgdGhpcy5wYWdlRGltZW5zaW9ucyA9IHBhcmVudC5wYWdlRGltZW5zaW9ucztcblx0ICAgIH1cblx0ICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXHQgIH1cblx0ICBmb2N1c2luKGV2ZW50KSB7XG5cdCAgICBpZiAoIXRoaXMuI2hhc0JlZW5TZWxlY3RlZCkge1xuXHQgICAgICB0aGlzLnBhcmVudC5zZXRTZWxlY3RlZCh0aGlzKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuI2hhc0JlZW5TZWxlY3RlZCA9IGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblx0ICBmb2N1c291dChldmVudCkge1xuXHQgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCB0YXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xuXHQgICAgaWYgKHRhcmdldD8uY2xvc2VzdChgIyR7dGhpcy5pZH1gKSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgaWYgKCF0aGlzLnBhcmVudD8uaXNNdWx0aXBsZVNlbGVjdGlvbikge1xuXHQgICAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGNvbW1pdE9yUmVtb3ZlKCkge1xuXHQgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG5cdCAgICAgIHRoaXMucmVtb3ZlKCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmNvbW1pdCgpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBjb21taXQoKSB7XG5cdCAgICB0aGlzLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKTtcblx0ICB9XG5cdCAgYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpIHtcblx0ICAgIHRoaXMuX3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKHRoaXMpO1xuXHQgIH1cblx0ICBkcmFnc3RhcnQoZXZlbnQpIHtcblx0ICAgIGNvbnN0IHJlY3QgPSB0aGlzLnBhcmVudC5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdCAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFggLSByZWN0Lng7XG5cdCAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFkgLSByZWN0Lnk7XG5cdCAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgdGhpcy5pZCk7XG5cdCAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IFwibW92ZVwiO1xuXHQgIH1cblx0ICBzZXRBdCh4LCB5LCB0eCwgdHkpIHtcblx0ICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcblx0ICAgIFt0eCwgdHldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih0eCwgdHkpO1xuXHQgICAgdGhpcy54ID0gKHggKyB0eCkgLyB3aWR0aDtcblx0ICAgIHRoaXMueSA9ICh5ICsgdHkpIC8gaGVpZ2h0O1xuXHQgICAgdGhpcy5kaXYuc3R5bGUubGVmdCA9IGAkezEwMCAqIHRoaXMueH0lYDtcblx0ICAgIHRoaXMuZGl2LnN0eWxlLnRvcCA9IGAkezEwMCAqIHRoaXMueX0lYDtcblx0ICB9XG5cdCAgdHJhbnNsYXRlKHgsIHkpIHtcblx0ICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcblx0ICAgIFt4LCB5XSA9IHRoaXMuc2NyZWVuVG9QYWdlVHJhbnNsYXRpb24oeCwgeSk7XG5cdCAgICB0aGlzLnggKz0geCAvIHdpZHRoO1xuXHQgICAgdGhpcy55ICs9IHkgLyBoZWlnaHQ7XG5cdCAgICB0aGlzLmRpdi5zdHlsZS5sZWZ0ID0gYCR7MTAwICogdGhpcy54fSVgO1xuXHQgICAgdGhpcy5kaXYuc3R5bGUudG9wID0gYCR7MTAwICogdGhpcy55fSVgO1xuXHQgIH1cblx0ICBzY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih4LCB5KSB7XG5cdCAgICBzd2l0Y2ggKHRoaXMucGFyZW50Um90YXRpb24pIHtcblx0ICAgICAgY2FzZSA5MDpcblx0ICAgICAgICByZXR1cm4gW3ksIC14XTtcblx0ICAgICAgY2FzZSAxODA6XG5cdCAgICAgICAgcmV0dXJuIFsteCwgLXldO1xuXHQgICAgICBjYXNlIDI3MDpcblx0ICAgICAgICByZXR1cm4gWy15LCB4XTtcblx0ICAgICAgZGVmYXVsdDpcblx0ICAgICAgICByZXR1cm4gW3gsIHldO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXQgcGFyZW50U2NhbGUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdWlNYW5hZ2VyLnZpZXdQYXJhbWV0ZXJzLnJlYWxTY2FsZTtcblx0ICB9XG5cdCAgZ2V0IHBhcmVudFJvdGF0aW9uKCkge1xuXHQgICAgcmV0dXJuICh0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucm90YXRpb24gKyB0aGlzLnBhZ2VSb3RhdGlvbikgJSAzNjA7XG5cdCAgfVxuXHQgIGdldCBwYXJlbnREaW1lbnNpb25zKCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICByZWFsU2NhbGVcblx0ICAgIH0gPSB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnM7XG5cdCAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IHRoaXMucGFnZURpbWVuc2lvbnM7XG5cdCAgICByZXR1cm4gW3BhZ2VXaWR0aCAqIHJlYWxTY2FsZSwgcGFnZUhlaWdodCAqIHJlYWxTY2FsZV07XG5cdCAgfVxuXHQgIHNldERpbXMod2lkdGgsIGhlaWdodCkge1xuXHQgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgdGhpcy5kaXYuc3R5bGUud2lkdGggPSBgJHsxMDAgKiB3aWR0aCAvIHBhcmVudFdpZHRofSVgO1xuXHQgICAgdGhpcy5kaXYuc3R5bGUuaGVpZ2h0ID0gYCR7MTAwICogaGVpZ2h0IC8gcGFyZW50SGVpZ2h0fSVgO1xuXHQgIH1cblx0ICBmaXhEaW1zKCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBzdHlsZVxuXHQgICAgfSA9IHRoaXMuZGl2O1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBoZWlnaHQsXG5cdCAgICAgIHdpZHRoXG5cdCAgICB9ID0gc3R5bGU7XG5cdCAgICBjb25zdCB3aWR0aFBlcmNlbnQgPSB3aWR0aC5lbmRzV2l0aChcIiVcIik7XG5cdCAgICBjb25zdCBoZWlnaHRQZXJjZW50ID0gaGVpZ2h0LmVuZHNXaXRoKFwiJVwiKTtcblx0ICAgIGlmICh3aWR0aFBlcmNlbnQgJiYgaGVpZ2h0UGVyY2VudCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG5cdCAgICBpZiAoIXdpZHRoUGVyY2VudCkge1xuXHQgICAgICBzdHlsZS53aWR0aCA9IGAkezEwMCAqIHBhcnNlRmxvYXQod2lkdGgpIC8gcGFyZW50V2lkdGh9JWA7XG5cdCAgICB9XG5cdCAgICBpZiAoIWhlaWdodFBlcmNlbnQpIHtcblx0ICAgICAgc3R5bGUuaGVpZ2h0ID0gYCR7MTAwICogcGFyc2VGbG9hdChoZWlnaHQpIC8gcGFyZW50SGVpZ2h0fSVgO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXRJbml0aWFsVHJhbnNsYXRpb24oKSB7XG5cdCAgICByZXR1cm4gWzAsIDBdO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdCAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVkaXRvci1yb3RhdGlvblwiLCAoMzYwIC0gdGhpcy5yb3RhdGlvbikgJSAzNjApO1xuXHQgICAgdGhpcy5kaXYuY2xhc3NOYW1lID0gdGhpcy5uYW1lO1xuXHQgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy5pZCk7XG5cdCAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJ0YWJJbmRleFwiLCAwKTtcblx0ICAgIHRoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7XG5cdCAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCB0aGlzLiNib3VuZEZvY3VzaW4pO1xuXHQgICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQpO1xuXHQgICAgY29uc3QgW3R4LCB0eV0gPSB0aGlzLmdldEluaXRpYWxUcmFuc2xhdGlvbigpO1xuXHQgICAgdGhpcy50cmFuc2xhdGUodHgsIHR5KTtcblx0ICAgICgwLCBfdG9vbHMuYmluZEV2ZW50cykodGhpcywgdGhpcy5kaXYsIFtcImRyYWdzdGFydFwiLCBcInBvaW50ZXJkb3duXCJdKTtcblx0ICAgIHJldHVybiB0aGlzLmRpdjtcblx0ICB9XG5cdCAgcG9pbnRlcmRvd24oZXZlbnQpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgaXNNYWNcblx0ICAgIH0gPSBfdXRpbC5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcblx0ICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuXHQgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoZXZlbnQuY3RybEtleSAmJiAhaXNNYWMgfHwgZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQubWV0YUtleSAmJiBpc01hYykge1xuXHQgICAgICB0aGlzLnBhcmVudC50b2dnbGVTZWxlY3RlZCh0aGlzKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jaGFzQmVlblNlbGVjdGVkID0gdHJ1ZTtcblx0ICB9XG5cdCAgZ2V0UmVjdCh0eCwgdHkpIHtcblx0ICAgIGNvbnN0IHNjYWxlID0gdGhpcy5wYXJlbnRTY2FsZTtcblx0ICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcblx0ICAgIGNvbnN0IFtwYWdlWCwgcGFnZVldID0gdGhpcy5wYWdlVHJhbnNsYXRpb247XG5cdCAgICBjb25zdCBzaGlmdFggPSB0eCAvIHNjYWxlO1xuXHQgICAgY29uc3Qgc2hpZnRZID0gdHkgLyBzY2FsZTtcblx0ICAgIGNvbnN0IHggPSB0aGlzLnggKiBwYWdlV2lkdGg7XG5cdCAgICBjb25zdCB5ID0gdGhpcy55ICogcGFnZUhlaWdodDtcblx0ICAgIGNvbnN0IHdpZHRoID0gdGhpcy53aWR0aCAqIHBhZ2VXaWR0aDtcblx0ICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0ICogcGFnZUhlaWdodDtcblx0ICAgIHN3aXRjaCAodGhpcy5yb3RhdGlvbikge1xuXHQgICAgICBjYXNlIDA6XG5cdCAgICAgICAgcmV0dXJuIFt4ICsgc2hpZnRYICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5IC0gc2hpZnRZIC0gaGVpZ2h0ICsgcGFnZVksIHggKyBzaGlmdFggKyB3aWR0aCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSAtIHNoaWZ0WSArIHBhZ2VZXTtcblx0ICAgICAgY2FzZSA5MDpcblx0ICAgICAgICByZXR1cm4gW3ggKyBzaGlmdFkgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgKyBzaGlmdFggKyBwYWdlWSwgeCArIHNoaWZ0WSArIGhlaWdodCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSArIHNoaWZ0WCArIHdpZHRoICsgcGFnZVldO1xuXHQgICAgICBjYXNlIDE4MDpcblx0ICAgICAgICByZXR1cm4gW3ggLSBzaGlmdFggLSB3aWR0aCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSArIHNoaWZ0WSArIHBhZ2VZLCB4IC0gc2hpZnRYICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRZICsgaGVpZ2h0ICsgcGFnZVldO1xuXHQgICAgICBjYXNlIDI3MDpcblx0ICAgICAgICByZXR1cm4gW3ggLSBzaGlmdFkgLSBoZWlnaHQgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFggLSB3aWR0aCArIHBhZ2VZLCB4IC0gc2hpZnRZICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5IC0gc2hpZnRYICsgcGFnZVldO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcm90YXRpb25cIik7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldFJlY3RJbkN1cnJlbnRDb29yZHMocmVjdCwgcGFnZUhlaWdodCkge1xuXHQgICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IHJlY3Q7XG5cdCAgICBjb25zdCB3aWR0aCA9IHgyIC0geDE7XG5cdCAgICBjb25zdCBoZWlnaHQgPSB5MiAtIHkxO1xuXHQgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG5cdCAgICAgIGNhc2UgMDpcblx0ICAgICAgICByZXR1cm4gW3gxLCBwYWdlSGVpZ2h0IC0geTIsIHdpZHRoLCBoZWlnaHRdO1xuXHQgICAgICBjYXNlIDkwOlxuXHQgICAgICAgIHJldHVybiBbeDEsIHBhZ2VIZWlnaHQgLSB5MSwgaGVpZ2h0LCB3aWR0aF07XG5cdCAgICAgIGNhc2UgMTgwOlxuXHQgICAgICAgIHJldHVybiBbeDIsIHBhZ2VIZWlnaHQgLSB5MSwgd2lkdGgsIGhlaWdodF07XG5cdCAgICAgIGNhc2UgMjcwOlxuXHQgICAgICAgIHJldHVybiBbeDIsIHBhZ2VIZWlnaHQgLSB5MiwgaGVpZ2h0LCB3aWR0aF07XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgb25jZUFkZGVkKCkge31cblx0ICBpc0VtcHR5KCkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0ICBlbmFibGVFZGl0TW9kZSgpIHtcblx0ICAgIHRoaXMuI2lzSW5FZGl0TW9kZSA9IHRydWU7XG5cdCAgfVxuXHQgIGRpc2FibGVFZGl0TW9kZSgpIHtcblx0ICAgIHRoaXMuI2lzSW5FZGl0TW9kZSA9IGZhbHNlO1xuXHQgIH1cblx0ICBpc0luRWRpdE1vZGUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jaXNJbkVkaXRNb2RlO1xuXHQgIH1cblx0ICBzaG91bGRHZXRLZXlib2FyZEV2ZW50cygpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdCAgbmVlZHNUb0JlUmVidWlsdCgpIHtcblx0ICAgIHJldHVybiB0aGlzLmRpdiAmJiAhdGhpcy5pc0F0dGFjaGVkVG9ET007XG5cdCAgfVxuXHQgIHJlYnVpbGQoKSB7XG5cdCAgICB0aGlzLmRpdj8uYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgdGhpcy4jYm91bmRGb2N1c2luKTtcblx0ICB9XG5cdCAgc2VyaWFsaXplKCkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkFuIGVkaXRvciBtdXN0IGJlIHNlcmlhbGl6YWJsZVwiKTtcblx0ICB9XG5cdCAgc3RhdGljIGRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKSB7XG5cdCAgICBjb25zdCBlZGl0b3IgPSBuZXcgdGhpcy5wcm90b3R5cGUuY29uc3RydWN0b3Ioe1xuXHQgICAgICBwYXJlbnQsXG5cdCAgICAgIGlkOiBwYXJlbnQuZ2V0TmV4dElkKCksXG5cdCAgICAgIHVpTWFuYWdlclxuXHQgICAgfSk7XG5cdCAgICBlZGl0b3Iucm90YXRpb24gPSBkYXRhLnJvdGF0aW9uO1xuXHQgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG5cdCAgICBjb25zdCBbeCwgeSwgd2lkdGgsIGhlaWdodF0gPSBlZGl0b3IuZ2V0UmVjdEluQ3VycmVudENvb3JkcyhkYXRhLnJlY3QsIHBhZ2VIZWlnaHQpO1xuXHQgICAgZWRpdG9yLnggPSB4IC8gcGFnZVdpZHRoO1xuXHQgICAgZWRpdG9yLnkgPSB5IC8gcGFnZUhlaWdodDtcblx0ICAgIGVkaXRvci53aWR0aCA9IHdpZHRoIC8gcGFnZVdpZHRoO1xuXHQgICAgZWRpdG9yLmhlaWdodCA9IGhlaWdodCAvIHBhZ2VIZWlnaHQ7XG5cdCAgICByZXR1cm4gZWRpdG9yO1xuXHQgIH1cblx0ICByZW1vdmUoKSB7XG5cdCAgICB0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCB0aGlzLiNib3VuZEZvY3VzaW4pO1xuXHQgICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIHRoaXMuI2JvdW5kRm9jdXNvdXQpO1xuXHQgICAgaWYgKCF0aGlzLmlzRW1wdHkoKSkge1xuXHQgICAgICB0aGlzLmNvbW1pdCgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO1xuXHQgIH1cblx0ICBzZWxlY3QoKSB7XG5cdCAgICB0aGlzLmRpdj8uY2xhc3NMaXN0LmFkZChcInNlbGVjdGVkRWRpdG9yXCIpO1xuXHQgIH1cblx0ICB1bnNlbGVjdCgpIHtcblx0ICAgIHRoaXMuZGl2Py5jbGFzc0xpc3QucmVtb3ZlKFwic2VsZWN0ZWRFZGl0b3JcIik7XG5cdCAgfVxuXHQgIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge31cblx0ICBkaXNhYmxlRWRpdGluZygpIHt9XG5cdCAgZW5hYmxlRWRpdGluZygpIHt9XG5cdCAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcblx0ICAgIHJldHVybiB7fTtcblx0ICB9XG5cdCAgZ2V0IGNvbnRlbnREaXYoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5kaXY7XG5cdCAgfVxuXHQgIGdldCBpc0VkaXRpbmcoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jaXNFZGl0aW5nO1xuXHQgIH1cblx0ICBzZXQgaXNFZGl0aW5nKHZhbHVlKSB7XG5cdCAgICB0aGlzLiNpc0VkaXRpbmcgPSB2YWx1ZTtcblx0ICAgIGlmICh2YWx1ZSkge1xuXHQgICAgICB0aGlzLnBhcmVudC5zZXRTZWxlY3RlZCh0aGlzKTtcblx0ICAgICAgdGhpcy5wYXJlbnQuc2V0QWN0aXZlRWRpdG9yKHRoaXMpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5wYXJlbnQuc2V0QWN0aXZlRWRpdG9yKG51bGwpO1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRleHBvcnRzLkFubm90YXRpb25FZGl0b3IgPSBBbm5vdGF0aW9uRWRpdG9yO1xuXG5cdC8qKiovIH0pLFxuXHQvKiA1ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5LZXlib2FyZE1hbmFnZXIgPSBleHBvcnRzLkNvbW1hbmRNYW5hZ2VyID0gZXhwb3J0cy5Db2xvck1hbmFnZXIgPSBleHBvcnRzLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIgPSB2b2lkIDA7XG5cdGV4cG9ydHMuYmluZEV2ZW50cyA9IGJpbmRFdmVudHM7XG5cdGV4cG9ydHMub3BhY2l0eVRvSGV4ID0gb3BhY2l0eVRvSGV4O1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHRmdW5jdGlvbiBiaW5kRXZlbnRzKG9iaiwgZWxlbWVudCwgbmFtZXMpIHtcblx0ICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcblx0ICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBvYmpbbmFtZV0uYmluZChvYmopKTtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gb3BhY2l0eVRvSGV4KG9wYWNpdHkpIHtcblx0ICByZXR1cm4gTWF0aC5yb3VuZChNYXRoLm1pbigyNTUsIE1hdGgubWF4KDEsIDI1NSAqIG9wYWNpdHkpKSkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcblx0fVxuXHRjbGFzcyBJZE1hbmFnZXIge1xuXHQgICNpZCA9IDA7XG5cdCAgZ2V0SWQoKSB7XG5cdCAgICByZXR1cm4gYCR7X3V0aWwuQW5ub3RhdGlvbkVkaXRvclByZWZpeH0ke3RoaXMuI2lkKyt9YDtcblx0ICB9XG5cdH1cblx0Y2xhc3MgQ29tbWFuZE1hbmFnZXIge1xuXHQgICNjb21tYW5kcyA9IFtdO1xuXHQgICNsb2NrZWQgPSBmYWxzZTtcblx0ICAjbWF4U2l6ZTtcblx0ICAjcG9zaXRpb24gPSAtMTtcblx0ICBjb25zdHJ1Y3RvcihtYXhTaXplID0gMTI4KSB7XG5cdCAgICB0aGlzLiNtYXhTaXplID0gbWF4U2l6ZTtcblx0ICB9XG5cdCAgYWRkKHtcblx0ICAgIGNtZCxcblx0ICAgIHVuZG8sXG5cdCAgICBtdXN0RXhlYyxcblx0ICAgIHR5cGUgPSBOYU4sXG5cdCAgICBvdmVyd3JpdGVJZlNhbWVUeXBlID0gZmFsc2UsXG5cdCAgICBrZWVwVW5kbyA9IGZhbHNlXG5cdCAgfSkge1xuXHQgICAgaWYgKG11c3RFeGVjKSB7XG5cdCAgICAgIGNtZCgpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuI2xvY2tlZCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBzYXZlID0ge1xuXHQgICAgICBjbWQsXG5cdCAgICAgIHVuZG8sXG5cdCAgICAgIHR5cGVcblx0ICAgIH07XG5cdCAgICBpZiAodGhpcy4jcG9zaXRpb24gPT09IC0xKSB7XG5cdCAgICAgIGlmICh0aGlzLiNjb21tYW5kcy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgdGhpcy4jY29tbWFuZHMubGVuZ3RoID0gMDtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLiNwb3NpdGlvbiA9IDA7XG5cdCAgICAgIHRoaXMuI2NvbW1hbmRzLnB1c2goc2F2ZSk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmIChvdmVyd3JpdGVJZlNhbWVUeXBlICYmIHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXS50eXBlID09PSB0eXBlKSB7XG5cdCAgICAgIGlmIChrZWVwVW5kbykge1xuXHQgICAgICAgIHNhdmUudW5kbyA9IHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXS51bmRvO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuI2NvbW1hbmRzW3RoaXMuI3Bvc2l0aW9uXSA9IHNhdmU7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IG5leHQgPSB0aGlzLiNwb3NpdGlvbiArIDE7XG5cdCAgICBpZiAobmV4dCA9PT0gdGhpcy4jbWF4U2l6ZSkge1xuXHQgICAgICB0aGlzLiNjb21tYW5kcy5zcGxpY2UoMCwgMSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLiNwb3NpdGlvbiA9IG5leHQ7XG5cdCAgICAgIGlmIChuZXh0IDwgdGhpcy4jY29tbWFuZHMubGVuZ3RoKSB7XG5cdCAgICAgICAgdGhpcy4jY29tbWFuZHMuc3BsaWNlKG5leHQpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLiNjb21tYW5kcy5wdXNoKHNhdmUpO1xuXHQgIH1cblx0ICB1bmRvKCkge1xuXHQgICAgaWYgKHRoaXMuI3Bvc2l0aW9uID09PSAtMSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLiNsb2NrZWQgPSB0cnVlO1xuXHQgICAgdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dLnVuZG8oKTtcblx0ICAgIHRoaXMuI2xvY2tlZCA9IGZhbHNlO1xuXHQgICAgdGhpcy4jcG9zaXRpb24gLT0gMTtcblx0ICB9XG5cdCAgcmVkbygpIHtcblx0ICAgIGlmICh0aGlzLiNwb3NpdGlvbiA8IHRoaXMuI2NvbW1hbmRzLmxlbmd0aCAtIDEpIHtcblx0ICAgICAgdGhpcy4jcG9zaXRpb24gKz0gMTtcblx0ICAgICAgdGhpcy4jbG9ja2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dLmNtZCgpO1xuXHQgICAgICB0aGlzLiNsb2NrZWQgPSBmYWxzZTtcblx0ICAgIH1cblx0ICB9XG5cdCAgaGFzU29tZXRoaW5nVG9VbmRvKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uICE9PSAtMTtcblx0ICB9XG5cdCAgaGFzU29tZXRoaW5nVG9SZWRvKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI3Bvc2l0aW9uIDwgdGhpcy4jY29tbWFuZHMubGVuZ3RoIC0gMTtcblx0ICB9XG5cdCAgZGVzdHJveSgpIHtcblx0ICAgIHRoaXMuI2NvbW1hbmRzID0gbnVsbDtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5Db21tYW5kTWFuYWdlciA9IENvbW1hbmRNYW5hZ2VyO1xuXHRjbGFzcyBLZXlib2FyZE1hbmFnZXIge1xuXHQgIGNvbnN0cnVjdG9yKGNhbGxiYWNrcykge1xuXHQgICAgdGhpcy5idWZmZXIgPSBbXTtcblx0ICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuXHQgICAgdGhpcy5hbGxLZXlzID0gbmV3IFNldCgpO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBpc01hY1xuXHQgICAgfSA9IF91dGlsLkZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuXHQgICAgZm9yIChjb25zdCBba2V5cywgY2FsbGJhY2tdIG9mIGNhbGxiYWNrcykge1xuXHQgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG5cdCAgICAgICAgY29uc3QgaXNNYWNLZXkgPSBrZXkuc3RhcnRzV2l0aChcIm1hYytcIik7XG5cdCAgICAgICAgaWYgKGlzTWFjICYmIGlzTWFjS2V5KSB7XG5cdCAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zZXQoa2V5LnNsaWNlKDQpLCBjYWxsYmFjayk7XG5cdCAgICAgICAgICB0aGlzLmFsbEtleXMuYWRkKGtleS5zcGxpdChcIitcIikuYXQoLTEpKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKCFpc01hYyAmJiAhaXNNYWNLZXkpIHtcblx0ICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldChrZXksIGNhbGxiYWNrKTtcblx0ICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQoa2V5LnNwbGl0KFwiK1wiKS5hdCgtMSkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICAjc2VyaWFsaXplKGV2ZW50KSB7XG5cdCAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG5cdCAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJhbHRcIik7XG5cdCAgICB9XG5cdCAgICBpZiAoZXZlbnQuY3RybEtleSkge1xuXHQgICAgICB0aGlzLmJ1ZmZlci5wdXNoKFwiY3RybFwiKTtcblx0ICAgIH1cblx0ICAgIGlmIChldmVudC5tZXRhS2V5KSB7XG5cdCAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJtZXRhXCIpO1xuXHQgICAgfVxuXHQgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG5cdCAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJzaGlmdFwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuYnVmZmVyLnB1c2goZXZlbnQua2V5KTtcblx0ICAgIGNvbnN0IHN0ciA9IHRoaXMuYnVmZmVyLmpvaW4oXCIrXCIpO1xuXHQgICAgdGhpcy5idWZmZXIubGVuZ3RoID0gMDtcblx0ICAgIHJldHVybiBzdHI7XG5cdCAgfVxuXHQgIGV4ZWMoc2VsZiwgZXZlbnQpIHtcblx0ICAgIGlmICghdGhpcy5hbGxLZXlzLmhhcyhldmVudC5rZXkpKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5jYWxsYmFja3MuZ2V0KHRoaXMuI3NlcmlhbGl6ZShldmVudCkpO1xuXHQgICAgaWYgKCFjYWxsYmFjaykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjYWxsYmFjay5iaW5kKHNlbGYpKCk7XG5cdCAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuS2V5Ym9hcmRNYW5hZ2VyID0gS2V5Ym9hcmRNYW5hZ2VyO1xuXHRjbGFzcyBDb2xvck1hbmFnZXIge1xuXHQgIHN0YXRpYyBfY29sb3JzTWFwcGluZyA9IG5ldyBNYXAoW1tcIkNhbnZhc1RleHRcIiwgWzAsIDAsIDBdXSwgW1wiQ2FudmFzXCIsIFsyNTUsIDI1NSwgMjU1XV1dKTtcblx0ICBnZXQgX2NvbG9ycygpIHtcblx0ICAgIGNvbnN0IGNvbG9ycyA9IG5ldyBNYXAoW1tcIkNhbnZhc1RleHRcIiwgbnVsbF0sIFtcIkNhbnZhc1wiLCBudWxsXV0pO1xuXHQgICAgKDAsIF9kaXNwbGF5X3V0aWxzLmdldENvbG9yVmFsdWVzKShjb2xvcnMpO1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiX2NvbG9yc1wiLCBjb2xvcnMpO1xuXHQgIH1cblx0ICBjb252ZXJ0KGNvbG9yKSB7XG5cdCAgICBjb25zdCByZ2IgPSAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0UkdCKShjb2xvcik7XG5cdCAgICBpZiAoIXdpbmRvdy5tYXRjaE1lZGlhKFwiKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSlcIikubWF0Y2hlcykge1xuXHQgICAgICByZXR1cm4gcmdiO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBbbmFtZSwgUkdCXSBvZiB0aGlzLl9jb2xvcnMpIHtcblx0ICAgICAgaWYgKFJHQi5ldmVyeSgoeCwgaSkgPT4geCA9PT0gcmdiW2ldKSkge1xuXHQgICAgICAgIHJldHVybiBDb2xvck1hbmFnZXIuX2NvbG9yc01hcHBpbmcuZ2V0KG5hbWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmdiO1xuXHQgIH1cblx0ICBnZXRIZXhDb2RlKG5hbWUpIHtcblx0ICAgIGNvbnN0IHJnYiA9IHRoaXMuX2NvbG9ycy5nZXQobmFtZSk7XG5cdCAgICBpZiAoIXJnYikge1xuXHQgICAgICByZXR1cm4gbmFtZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBfdXRpbC5VdGlsLm1ha2VIZXhDb2xvciguLi5yZ2IpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkNvbG9yTWFuYWdlciA9IENvbG9yTWFuYWdlcjtcblx0Y2xhc3MgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciB7XG5cdCAgI2FjdGl2ZUVkaXRvciA9IG51bGw7XG5cdCAgI2FsbEVkaXRvcnMgPSBuZXcgTWFwKCk7XG5cdCAgI2FsbExheWVycyA9IG5ldyBNYXAoKTtcblx0ICAjYW5ub3RhdGlvblN0b3JhZ2UgPSBudWxsO1xuXHQgICNjb21tYW5kTWFuYWdlciA9IG5ldyBDb21tYW5kTWFuYWdlcigpO1xuXHQgICNjdXJyZW50UGFnZUluZGV4ID0gMDtcblx0ICAjZWRpdG9yVHlwZXMgPSBudWxsO1xuXHQgICNlZGl0b3JzVG9SZXNjYWxlID0gbmV3IFNldCgpO1xuXHQgICNldmVudEJ1cyA9IG51bGw7XG5cdCAgI2lkTWFuYWdlciA9IG5ldyBJZE1hbmFnZXIoKTtcblx0ICAjaXNFbmFibGVkID0gZmFsc2U7XG5cdCAgI21vZGUgPSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FO1xuXHQgICNzZWxlY3RlZEVkaXRvcnMgPSBuZXcgU2V0KCk7XG5cdCAgI2JvdW5kQ29weSA9IHRoaXMuY29weS5iaW5kKHRoaXMpO1xuXHQgICNib3VuZEN1dCA9IHRoaXMuY3V0LmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kUGFzdGUgPSB0aGlzLnBhc3RlLmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kS2V5ZG93biA9IHRoaXMua2V5ZG93bi5iaW5kKHRoaXMpO1xuXHQgICNib3VuZE9uRWRpdGluZ0FjdGlvbiA9IHRoaXMub25FZGl0aW5nQWN0aW9uLmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kT25QYWdlQ2hhbmdpbmcgPSB0aGlzLm9uUGFnZUNoYW5naW5nLmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kT25TY2FsZUNoYW5naW5nID0gdGhpcy5vblNjYWxlQ2hhbmdpbmcuYmluZCh0aGlzKTtcblx0ICAjYm91bmRPblJvdGF0aW9uQ2hhbmdpbmcgPSB0aGlzLm9uUm90YXRpb25DaGFuZ2luZy5iaW5kKHRoaXMpO1xuXHQgICNwcmV2aW91c1N0YXRlcyA9IHtcblx0ICAgIGlzRWRpdGluZzogZmFsc2UsXG5cdCAgICBpc0VtcHR5OiB0cnVlLFxuXHQgICAgaGFzU29tZXRoaW5nVG9VbmRvOiBmYWxzZSxcblx0ICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogZmFsc2UsXG5cdCAgICBoYXNTZWxlY3RlZEVkaXRvcjogZmFsc2Vcblx0ICB9O1xuXHQgICNjb250YWluZXIgPSBudWxsO1xuXHQgIHN0YXRpYyBfa2V5Ym9hcmRNYW5hZ2VyID0gbmV3IEtleWJvYXJkTWFuYWdlcihbW1tcImN0cmwrYVwiLCBcIm1hYyttZXRhK2FcIl0sIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlLnNlbGVjdEFsbF0sIFtbXCJjdHJsK3pcIiwgXCJtYWMrbWV0YSt6XCJdLCBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLnByb3RvdHlwZS51bmRvXSwgW1tcImN0cmwreVwiLCBcImN0cmwrc2hpZnQrWlwiLCBcIm1hYyttZXRhK3NoaWZ0K1pcIl0sIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlLnJlZG9dLCBbW1wiQmFja3NwYWNlXCIsIFwiYWx0K0JhY2tzcGFjZVwiLCBcImN0cmwrQmFja3NwYWNlXCIsIFwic2hpZnQrQmFja3NwYWNlXCIsIFwibWFjK0JhY2tzcGFjZVwiLCBcIm1hYythbHQrQmFja3NwYWNlXCIsIFwibWFjK2N0cmwrQmFja3NwYWNlXCIsIFwiRGVsZXRlXCIsIFwiY3RybCtEZWxldGVcIiwgXCJzaGlmdCtEZWxldGVcIl0sIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlLmRlbGV0ZV0sIFtbXCJFc2NhcGVcIiwgXCJtYWMrRXNjYXBlXCJdLCBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLnByb3RvdHlwZS51bnNlbGVjdEFsbF1dKTtcblx0ICBjb25zdHJ1Y3Rvcihjb250YWluZXIsIGV2ZW50QnVzLCBhbm5vdGF0aW9uU3RvcmFnZSkge1xuXHQgICAgdGhpcy4jY29udGFpbmVyID0gY29udGFpbmVyO1xuXHQgICAgdGhpcy4jZXZlbnRCdXMgPSBldmVudEJ1cztcblx0ICAgIHRoaXMuI2V2ZW50QnVzLl9vbihcImVkaXRpbmdhY3Rpb25cIiwgdGhpcy4jYm91bmRPbkVkaXRpbmdBY3Rpb24pO1xuXHQgICAgdGhpcy4jZXZlbnRCdXMuX29uKFwicGFnZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25QYWdlQ2hhbmdpbmcpO1xuXHQgICAgdGhpcy4jZXZlbnRCdXMuX29uKFwic2NhbGVjaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uU2NhbGVDaGFuZ2luZyk7XG5cdCAgICB0aGlzLiNldmVudEJ1cy5fb24oXCJyb3RhdGlvbmNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25Sb3RhdGlvbkNoYW5naW5nKTtcblx0ICAgIHRoaXMuI2Fubm90YXRpb25TdG9yYWdlID0gYW5ub3RhdGlvblN0b3JhZ2U7XG5cdCAgICB0aGlzLnZpZXdQYXJhbWV0ZXJzID0ge1xuXHQgICAgICByZWFsU2NhbGU6IF9kaXNwbGF5X3V0aWxzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyxcblx0ICAgICAgcm90YXRpb246IDBcblx0ICAgIH07XG5cdCAgfVxuXHQgIGRlc3Ryb3koKSB7XG5cdCAgICB0aGlzLiNyZW1vdmVLZXlib2FyZE1hbmFnZXIoKTtcblx0ICAgIHRoaXMuI2V2ZW50QnVzLl9vZmYoXCJlZGl0aW5nYWN0aW9uXCIsIHRoaXMuI2JvdW5kT25FZGl0aW5nQWN0aW9uKTtcblx0ICAgIHRoaXMuI2V2ZW50QnVzLl9vZmYoXCJwYWdlY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblBhZ2VDaGFuZ2luZyk7XG5cdCAgICB0aGlzLiNldmVudEJ1cy5fb2ZmKFwic2NhbGVjaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uU2NhbGVDaGFuZ2luZyk7XG5cdCAgICB0aGlzLiNldmVudEJ1cy5fb2ZmKFwicm90YXRpb25jaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uUm90YXRpb25DaGFuZ2luZyk7XG5cdCAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuXHQgICAgICBsYXllci5kZXN0cm95KCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNhbGxMYXllcnMuY2xlYXIoKTtcblx0ICAgIHRoaXMuI2FsbEVkaXRvcnMuY2xlYXIoKTtcblx0ICAgIHRoaXMuI2VkaXRvcnNUb1Jlc2NhbGUuY2xlYXIoKTtcblx0ICAgIHRoaXMuI2FjdGl2ZUVkaXRvciA9IG51bGw7XG5cdCAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuY2xlYXIoKTtcblx0ICAgIHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmRlc3Ryb3koKTtcblx0ICB9XG5cdCAgb25QYWdlQ2hhbmdpbmcoe1xuXHQgICAgcGFnZU51bWJlclxuXHQgIH0pIHtcblx0ICAgIHRoaXMuI2N1cnJlbnRQYWdlSW5kZXggPSBwYWdlTnVtYmVyIC0gMTtcblx0ICB9XG5cdCAgZm9jdXNNYWluQ29udGFpbmVyKCkge1xuXHQgICAgdGhpcy4jY29udGFpbmVyLmZvY3VzKCk7XG5cdCAgfVxuXHQgIGFkZFNob3VsZFJlc2NhbGUoZWRpdG9yKSB7XG5cdCAgICB0aGlzLiNlZGl0b3JzVG9SZXNjYWxlLmFkZChlZGl0b3IpO1xuXHQgIH1cblx0ICByZW1vdmVTaG91bGRSZXNjYWxlKGVkaXRvcikge1xuXHQgICAgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZS5kZWxldGUoZWRpdG9yKTtcblx0ICB9XG5cdCAgb25TY2FsZUNoYW5naW5nKHtcblx0ICAgIHNjYWxlXG5cdCAgfSkge1xuXHQgICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuXHQgICAgdGhpcy52aWV3UGFyYW1ldGVycy5yZWFsU2NhbGUgPSBzY2FsZSAqIF9kaXNwbGF5X3V0aWxzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUztcblx0ICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnNUb1Jlc2NhbGUpIHtcblx0ICAgICAgZWRpdG9yLm9uU2NhbGVDaGFuZ2luZygpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBvblJvdGF0aW9uQ2hhbmdpbmcoe1xuXHQgICAgcGFnZXNSb3RhdGlvblxuXHQgIH0pIHtcblx0ICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcblx0ICAgIHRoaXMudmlld1BhcmFtZXRlcnMucm90YXRpb24gPSBwYWdlc1JvdGF0aW9uO1xuXHQgIH1cblx0ICBhZGRUb0Fubm90YXRpb25TdG9yYWdlKGVkaXRvcikge1xuXHQgICAgaWYgKCFlZGl0b3IuaXNFbXB0eSgpICYmIHRoaXMuI2Fubm90YXRpb25TdG9yYWdlICYmICF0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZS5oYXMoZWRpdG9yLmlkKSkge1xuXHQgICAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZShlZGl0b3IuaWQsIGVkaXRvcik7XG5cdCAgICB9XG5cdCAgfVxuXHQgICNhZGRLZXlib2FyZE1hbmFnZXIoKSB7XG5cdCAgICB0aGlzLiNjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRLZXlkb3duKTtcblx0ICB9XG5cdCAgI3JlbW92ZUtleWJvYXJkTWFuYWdlcigpIHtcblx0ICAgIHRoaXMuI2NvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleWRvd24pO1xuXHQgIH1cblx0ICAjYWRkQ29weVBhc3RlTGlzdGVuZXJzKCkge1xuXHQgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgdGhpcy4jYm91bmRDb3B5KTtcblx0ICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgdGhpcy4jYm91bmRDdXQpO1xuXHQgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBhc3RlXCIsIHRoaXMuI2JvdW5kUGFzdGUpO1xuXHQgIH1cblx0ICAjcmVtb3ZlQ29weVBhc3RlTGlzdGVuZXJzKCkge1xuXHQgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvcHlcIiwgdGhpcy4jYm91bmRDb3B5KTtcblx0ICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjdXRcIiwgdGhpcy4jYm91bmRDdXQpO1xuXHQgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhc3RlXCIsIHRoaXMuI2JvdW5kUGFzdGUpO1xuXHQgIH1cblx0ICBjb3B5KGV2ZW50KSB7XG5cdCAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgaWYgKHRoaXMuI2FjdGl2ZUVkaXRvcikge1xuXHQgICAgICB0aGlzLiNhY3RpdmVFZGl0b3IuY29tbWl0T3JSZW1vdmUoKTtcblx0ICAgIH1cblx0ICAgIGlmICghdGhpcy5oYXNTZWxlY3Rpb24pIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgZWRpdG9ycyA9IFtdO1xuXHQgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG5cdCAgICAgIGlmICghZWRpdG9yLmlzRW1wdHkoKSkge1xuXHQgICAgICAgIGVkaXRvcnMucHVzaChlZGl0b3Iuc2VyaWFsaXplKCkpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAoZWRpdG9ycy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZXZlbnQuY2xpcGJvYXJkRGF0YS5zZXREYXRhKFwiYXBwbGljYXRpb24vcGRmanNcIiwgSlNPTi5zdHJpbmdpZnkoZWRpdG9ycykpO1xuXHQgIH1cblx0ICBjdXQoZXZlbnQpIHtcblx0ICAgIHRoaXMuY29weShldmVudCk7XG5cdCAgICB0aGlzLmRlbGV0ZSgpO1xuXHQgIH1cblx0ICBwYXN0ZShldmVudCkge1xuXHQgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgIGxldCBkYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiYXBwbGljYXRpb24vcGRmanNcIik7XG5cdCAgICBpZiAoIWRhdGEpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdCAgICB9IGNhdGNoIChleCkge1xuXHQgICAgICAoMCwgX3V0aWwud2FybikoYHBhc3RlOiBcIiR7ZXgubWVzc2FnZX1cIi5gKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcblx0ICAgIGNvbnN0IGxheWVyID0gdGhpcy4jYWxsTGF5ZXJzLmdldCh0aGlzLiNjdXJyZW50UGFnZUluZGV4KTtcblx0ICAgIHRyeSB7XG5cdCAgICAgIGNvbnN0IG5ld0VkaXRvcnMgPSBbXTtcblx0ICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZGF0YSkge1xuXHQgICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZEVkaXRvciA9IGxheWVyLmRlc2VyaWFsaXplKGVkaXRvcik7XG5cdCAgICAgICAgaWYgKCFkZXNlcmlhbGl6ZWRFZGl0b3IpIHtcblx0ICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgbmV3RWRpdG9ycy5wdXNoKGRlc2VyaWFsaXplZEVkaXRvcik7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgY21kID0gKCkgPT4ge1xuXHQgICAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIG5ld0VkaXRvcnMpIHtcblx0ICAgICAgICAgIHRoaXMuI2FkZEVkaXRvclRvTGF5ZXIoZWRpdG9yKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy4jc2VsZWN0RWRpdG9ycyhuZXdFZGl0b3JzKTtcblx0ICAgICAgfTtcblx0ICAgICAgY29uc3QgdW5kbyA9ICgpID0+IHtcblx0ICAgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBuZXdFZGl0b3JzKSB7XG5cdCAgICAgICAgICBlZGl0b3IucmVtb3ZlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLmFkZENvbW1hbmRzKHtcblx0ICAgICAgICBjbWQsXG5cdCAgICAgICAgdW5kbyxcblx0ICAgICAgICBtdXN0RXhlYzogdHJ1ZVxuXHQgICAgICB9KTtcblx0ICAgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShgcGFzdGU6IFwiJHtleC5tZXNzYWdlfVwiLmApO1xuXHQgICAgfVxuXHQgIH1cblx0ICBrZXlkb3duKGV2ZW50KSB7XG5cdCAgICBpZiAoIXRoaXMuZ2V0QWN0aXZlKCk/LnNob3VsZEdldEtleWJvYXJkRXZlbnRzKCkpIHtcblx0ICAgICAgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5fa2V5Ym9hcmRNYW5hZ2VyLmV4ZWModGhpcywgZXZlbnQpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBvbkVkaXRpbmdBY3Rpb24oZGV0YWlscykge1xuXHQgICAgaWYgKFtcInVuZG9cIiwgXCJyZWRvXCIsIFwiZGVsZXRlXCIsIFwic2VsZWN0QWxsXCJdLmluY2x1ZGVzKGRldGFpbHMubmFtZSkpIHtcblx0ICAgICAgdGhpc1tkZXRhaWxzLm5hbWVdKCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgICNkaXNwYXRjaFVwZGF0ZVN0YXRlcyhkZXRhaWxzKSB7XG5cdCAgICBjb25zdCBoYXNDaGFuZ2VkID0gT2JqZWN0LmVudHJpZXMoZGV0YWlscykuc29tZSgoW2tleSwgdmFsdWVdKSA9PiB0aGlzLiNwcmV2aW91c1N0YXRlc1trZXldICE9PSB2YWx1ZSk7XG5cdCAgICBpZiAoaGFzQ2hhbmdlZCkge1xuXHQgICAgICB0aGlzLiNldmVudEJ1cy5kaXNwYXRjaChcImFubm90YXRpb25lZGl0b3JzdGF0ZXNjaGFuZ2VkXCIsIHtcblx0ICAgICAgICBzb3VyY2U6IHRoaXMsXG5cdCAgICAgICAgZGV0YWlsczogT2JqZWN0LmFzc2lnbih0aGlzLiNwcmV2aW91c1N0YXRlcywgZGV0YWlscylcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgICNkaXNwYXRjaFVwZGF0ZVVJKGRldGFpbHMpIHtcblx0ICAgIHRoaXMuI2V2ZW50QnVzLmRpc3BhdGNoKFwiYW5ub3RhdGlvbmVkaXRvcnBhcmFtc2NoYW5nZWRcIiwge1xuXHQgICAgICBzb3VyY2U6IHRoaXMsXG5cdCAgICAgIGRldGFpbHNcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBzZXRFZGl0aW5nU3RhdGUoaXNFZGl0aW5nKSB7XG5cdCAgICBpZiAoaXNFZGl0aW5nKSB7XG5cdCAgICAgIHRoaXMuI2FkZEtleWJvYXJkTWFuYWdlcigpO1xuXHQgICAgICB0aGlzLiNhZGRDb3B5UGFzdGVMaXN0ZW5lcnMoKTtcblx0ICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuXHQgICAgICAgIGlzRWRpdGluZzogdGhpcy4jbW9kZSAhPT0gX3V0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSxcblx0ICAgICAgICBpc0VtcHR5OiB0aGlzLiNpc0VtcHR5KCksXG5cdCAgICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiB0aGlzLiNjb21tYW5kTWFuYWdlci5oYXNTb21ldGhpbmdUb1VuZG8oKSxcblx0ICAgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvUmVkbygpLFxuXHQgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiBmYWxzZVxuXHQgICAgICB9KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuI3JlbW92ZUtleWJvYXJkTWFuYWdlcigpO1xuXHQgICAgICB0aGlzLiNyZW1vdmVDb3B5UGFzdGVMaXN0ZW5lcnMoKTtcblx0ICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuXHQgICAgICAgIGlzRWRpdGluZzogZmFsc2Vcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJlZ2lzdGVyRWRpdG9yVHlwZXModHlwZXMpIHtcblx0ICAgIGlmICh0aGlzLiNlZGl0b3JUeXBlcykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLiNlZGl0b3JUeXBlcyA9IHR5cGVzO1xuXHQgICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG5cdCAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yVHlwZS5kZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0SWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jaWRNYW5hZ2VyLmdldElkKCk7XG5cdCAgfVxuXHQgIGdldCBjdXJyZW50TGF5ZXIoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jYWxsTGF5ZXJzLmdldCh0aGlzLiNjdXJyZW50UGFnZUluZGV4KTtcblx0ICB9XG5cdCAgZ2V0IGN1cnJlbnRQYWdlSW5kZXgoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jY3VycmVudFBhZ2VJbmRleDtcblx0ICB9XG5cdCAgYWRkTGF5ZXIobGF5ZXIpIHtcblx0ICAgIHRoaXMuI2FsbExheWVycy5zZXQobGF5ZXIucGFnZUluZGV4LCBsYXllcik7XG5cdCAgICBpZiAodGhpcy4jaXNFbmFibGVkKSB7XG5cdCAgICAgIGxheWVyLmVuYWJsZSgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgbGF5ZXIuZGlzYWJsZSgpO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZW1vdmVMYXllcihsYXllcikge1xuXHQgICAgdGhpcy4jYWxsTGF5ZXJzLmRlbGV0ZShsYXllci5wYWdlSW5kZXgpO1xuXHQgIH1cblx0ICB1cGRhdGVNb2RlKG1vZGUpIHtcblx0ICAgIHRoaXMuI21vZGUgPSBtb2RlO1xuXHQgICAgaWYgKG1vZGUgPT09IF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpIHtcblx0ICAgICAgdGhpcy5zZXRFZGl0aW5nU3RhdGUoZmFsc2UpO1xuXHQgICAgICB0aGlzLiNkaXNhYmxlQWxsKCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLnNldEVkaXRpbmdTdGF0ZSh0cnVlKTtcblx0ICAgICAgdGhpcy4jZW5hYmxlQWxsKCk7XG5cdCAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG5cdCAgICAgICAgbGF5ZXIudXBkYXRlTW9kZShtb2RlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICB1cGRhdGVUb29sYmFyKG1vZGUpIHtcblx0ICAgIGlmIChtb2RlID09PSB0aGlzLiNtb2RlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2V2ZW50QnVzLmRpc3BhdGNoKFwic3dpdGNoYW5ub3RhdGlvbmVkaXRvcm1vZGVcIiwge1xuXHQgICAgICBzb3VyY2U6IHRoaXMsXG5cdCAgICAgIG1vZGVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHtcblx0ICAgIGlmICghdGhpcy4jZWRpdG9yVHlwZXMpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG5cdCAgICAgIGVkaXRvci51cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBlZGl0b3JUeXBlIG9mIHRoaXMuI2VkaXRvclR5cGVzKSB7XG5cdCAgICAgIGVkaXRvclR5cGUudXBkYXRlRGVmYXVsdFBhcmFtcyh0eXBlLCB2YWx1ZSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgICNlbmFibGVBbGwoKSB7XG5cdCAgICBpZiAoIXRoaXMuI2lzRW5hYmxlZCkge1xuXHQgICAgICB0aGlzLiNpc0VuYWJsZWQgPSB0cnVlO1xuXHQgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuXHQgICAgICAgIGxheWVyLmVuYWJsZSgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgICNkaXNhYmxlQWxsKCkge1xuXHQgICAgdGhpcy51bnNlbGVjdEFsbCgpO1xuXHQgICAgaWYgKHRoaXMuI2lzRW5hYmxlZCkge1xuXHQgICAgICB0aGlzLiNpc0VuYWJsZWQgPSBmYWxzZTtcblx0ICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcblx0ICAgICAgICBsYXllci5kaXNhYmxlKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0RWRpdG9ycyhwYWdlSW5kZXgpIHtcblx0ICAgIGNvbnN0IGVkaXRvcnMgPSBbXTtcblx0ICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcblx0ICAgICAgaWYgKGVkaXRvci5wYWdlSW5kZXggPT09IHBhZ2VJbmRleCkge1xuXHQgICAgICAgIGVkaXRvcnMucHVzaChlZGl0b3IpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gZWRpdG9ycztcblx0ICB9XG5cdCAgZ2V0RWRpdG9yKGlkKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jYWxsRWRpdG9ycy5nZXQoaWQpO1xuXHQgIH1cblx0ICBhZGRFZGl0b3IoZWRpdG9yKSB7XG5cdCAgICB0aGlzLiNhbGxFZGl0b3JzLnNldChlZGl0b3IuaWQsIGVkaXRvcik7XG5cdCAgfVxuXHQgIHJlbW92ZUVkaXRvcihlZGl0b3IpIHtcblx0ICAgIHRoaXMuI2FsbEVkaXRvcnMuZGVsZXRlKGVkaXRvci5pZCk7XG5cdCAgICB0aGlzLnVuc2VsZWN0KGVkaXRvcik7XG5cdCAgICB0aGlzLiNhbm5vdGF0aW9uU3RvcmFnZT8ucmVtb3ZlKGVkaXRvci5pZCk7XG5cdCAgfVxuXHQgICNhZGRFZGl0b3JUb0xheWVyKGVkaXRvcikge1xuXHQgICAgY29uc3QgbGF5ZXIgPSB0aGlzLiNhbGxMYXllcnMuZ2V0KGVkaXRvci5wYWdlSW5kZXgpO1xuXHQgICAgaWYgKGxheWVyKSB7XG5cdCAgICAgIGxheWVyLmFkZE9yUmVidWlsZChlZGl0b3IpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5hZGRFZGl0b3IoZWRpdG9yKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgc2V0QWN0aXZlRWRpdG9yKGVkaXRvcikge1xuXHQgICAgaWYgKHRoaXMuI2FjdGl2ZUVkaXRvciA9PT0gZWRpdG9yKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2FjdGl2ZUVkaXRvciA9IGVkaXRvcjtcblx0ICAgIGlmIChlZGl0b3IpIHtcblx0ICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgdG9nZ2xlU2VsZWN0ZWQoZWRpdG9yKSB7XG5cdCAgICBpZiAodGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmhhcyhlZGl0b3IpKSB7XG5cdCAgICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5kZWxldGUoZWRpdG9yKTtcblx0ICAgICAgZWRpdG9yLnVuc2VsZWN0KCk7XG5cdCAgICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcblx0ICAgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdGhpcy5oYXNTZWxlY3Rpb25cblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5hZGQoZWRpdG9yKTtcblx0ICAgIGVkaXRvci5zZWxlY3QoKTtcblx0ICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlVUkoZWRpdG9yLnByb3BlcnRpZXNUb1VwZGF0ZSk7XG5cdCAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG5cdCAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgc2V0U2VsZWN0ZWQoZWRpdG9yKSB7XG5cdCAgICBmb3IgKGNvbnN0IGVkIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuXHQgICAgICBpZiAoZWQgIT09IGVkaXRvcikge1xuXHQgICAgICAgIGVkLnVuc2VsZWN0KCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuXHQgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmFkZChlZGl0b3IpO1xuXHQgICAgZWRpdG9yLnNlbGVjdCgpO1xuXHQgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcblx0ICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcblx0ICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBpc1NlbGVjdGVkKGVkaXRvcikge1xuXHQgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5oYXMoZWRpdG9yKTtcblx0ICB9XG5cdCAgdW5zZWxlY3QoZWRpdG9yKSB7XG5cdCAgICBlZGl0b3IudW5zZWxlY3QoKTtcblx0ICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5kZWxldGUoZWRpdG9yKTtcblx0ICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcblx0ICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRoaXMuaGFzU2VsZWN0aW9uXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0IGhhc1NlbGVjdGlvbigpIHtcblx0ICAgIHJldHVybiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuc2l6ZSAhPT0gMDtcblx0ICB9XG5cdCAgdW5kbygpIHtcblx0ICAgIHRoaXMuI2NvbW1hbmRNYW5hZ2VyLnVuZG8oKTtcblx0ICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcblx0ICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiB0aGlzLiNjb21tYW5kTWFuYWdlci5oYXNTb21ldGhpbmdUb1VuZG8oKSxcblx0ICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiB0cnVlLFxuXHQgICAgICBpc0VtcHR5OiB0aGlzLiNpc0VtcHR5KClcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZWRvKCkge1xuXHQgICAgdGhpcy4jY29tbWFuZE1hbmFnZXIucmVkbygpO1xuXHQgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuXHQgICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRydWUsXG5cdCAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogdGhpcy4jY29tbWFuZE1hbmFnZXIuaGFzU29tZXRoaW5nVG9SZWRvKCksXG5cdCAgICAgIGlzRW1wdHk6IHRoaXMuI2lzRW1wdHkoKVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGFkZENvbW1hbmRzKHBhcmFtcykge1xuXHQgICAgdGhpcy4jY29tbWFuZE1hbmFnZXIuYWRkKHBhcmFtcyk7XG5cdCAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG5cdCAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogdHJ1ZSxcblx0ICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiBmYWxzZSxcblx0ICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgI2lzRW1wdHkoKSB7XG5cdCAgICBpZiAodGhpcy4jYWxsRWRpdG9ycy5zaXplID09PSAwKSB7XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuI2FsbEVkaXRvcnMuc2l6ZSA9PT0gMSkge1xuXHQgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKSB7XG5cdCAgICAgICAgcmV0dXJuIGVkaXRvci5pc0VtcHR5KCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdCAgZGVsZXRlKCkge1xuXHQgICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuXHQgICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBlZGl0b3JzID0gWy4uLnRoaXMuI3NlbGVjdGVkRWRpdG9yc107XG5cdCAgICBjb25zdCBjbWQgPSAoKSA9PiB7XG5cdCAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcblx0ICAgICAgICBlZGl0b3IucmVtb3ZlKCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuXHQgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG5cdCAgICAgICAgdGhpcy4jYWRkRWRpdG9yVG9MYXllcihlZGl0b3IpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgICAgdGhpcy5hZGRDb21tYW5kcyh7XG5cdCAgICAgIGNtZCxcblx0ICAgICAgdW5kbyxcblx0ICAgICAgbXVzdEV4ZWM6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBjb21taXRPclJlbW92ZSgpIHtcblx0ICAgIHRoaXMuI2FjdGl2ZUVkaXRvcj8uY29tbWl0T3JSZW1vdmUoKTtcblx0ICB9XG5cdCAgI3NlbGVjdEVkaXRvcnMoZWRpdG9ycykge1xuXHQgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmNsZWFyKCk7XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG5cdCAgICAgIGlmIChlZGl0b3IuaXNFbXB0eSgpKSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmFkZChlZGl0b3IpO1xuXHQgICAgICBlZGl0b3Iuc2VsZWN0KCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG5cdCAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgc2VsZWN0QWxsKCkge1xuXHQgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG5cdCAgICAgIGVkaXRvci5jb21taXQoKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3NlbGVjdEVkaXRvcnModGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSk7XG5cdCAgfVxuXHQgIHVuc2VsZWN0QWxsKCkge1xuXHQgICAgaWYgKHRoaXMuI2FjdGl2ZUVkaXRvcikge1xuXHQgICAgICB0aGlzLiNhY3RpdmVFZGl0b3IuY29tbWl0T3JSZW1vdmUoKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5zaXplID09PSAwKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI3NlbGVjdGVkRWRpdG9ycykge1xuXHQgICAgICBlZGl0b3IudW5zZWxlY3QoKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuXHQgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuXHQgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogZmFsc2Vcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBpc0FjdGl2ZShlZGl0b3IpIHtcblx0ICAgIHJldHVybiB0aGlzLiNhY3RpdmVFZGl0b3IgPT09IGVkaXRvcjtcblx0ICB9XG5cdCAgZ2V0QWN0aXZlKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI2FjdGl2ZUVkaXRvcjtcblx0ICB9XG5cdCAgZ2V0TW9kZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLiNtb2RlO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIgPSBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyO1xuXG5cdC8qKiovIH0pLFxuXHQvKiA2ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5TdGF0VGltZXIgPSBleHBvcnRzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiA9IGV4cG9ydHMuUGl4ZWxzUGVySW5jaCA9IGV4cG9ydHMuUGFnZVZpZXdwb3J0ID0gZXhwb3J0cy5QREZEYXRlU3RyaW5nID0gZXhwb3J0cy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IGV4cG9ydHMuRE9NU1ZHRmFjdG9yeSA9IGV4cG9ydHMuRE9NRmlsdGVyRmFjdG9yeSA9IGV4cG9ydHMuRE9NQ2FudmFzRmFjdG9yeSA9IGV4cG9ydHMuRE9NQ01hcFJlYWRlckZhY3RvcnkgPSBleHBvcnRzLkFubm90YXRpb25QcmVmaXggPSB2b2lkIDA7XG5cdGV4cG9ydHMuZGVwcmVjYXRlZCA9IGRlcHJlY2F0ZWQ7XG5cdGV4cG9ydHMuZ2V0Q29sb3JWYWx1ZXMgPSBnZXRDb2xvclZhbHVlcztcblx0ZXhwb3J0cy5nZXRDdXJyZW50VHJhbnNmb3JtID0gZ2V0Q3VycmVudFRyYW5zZm9ybTtcblx0ZXhwb3J0cy5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSA9IGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlO1xuXHRleHBvcnRzLmdldEZpbGVuYW1lRnJvbVVybCA9IGdldEZpbGVuYW1lRnJvbVVybDtcblx0ZXhwb3J0cy5nZXRQZGZGaWxlbmFtZUZyb21VcmwgPSBnZXRQZGZGaWxlbmFtZUZyb21Vcmw7XG5cdGV4cG9ydHMuZ2V0UkdCID0gZ2V0UkdCO1xuXHRleHBvcnRzLmdldFhmYVBhZ2VWaWV3cG9ydCA9IGdldFhmYVBhZ2VWaWV3cG9ydDtcblx0ZXhwb3J0cy5pc0RhdGFTY2hlbWUgPSBpc0RhdGFTY2hlbWU7XG5cdGV4cG9ydHMuaXNQZGZGaWxlID0gaXNQZGZGaWxlO1xuXHRleHBvcnRzLmlzVmFsaWRGZXRjaFVybCA9IGlzVmFsaWRGZXRjaFVybDtcblx0ZXhwb3J0cy5sb2FkU2NyaXB0ID0gbG9hZFNjcmlwdDtcblx0ZXhwb3J0cy5zZXRMYXllckRpbWVuc2lvbnMgPSBzZXRMYXllckRpbWVuc2lvbnM7XG5cdHZhciBfYmFzZV9mYWN0b3J5ID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0Y29uc3QgU1ZHX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuXHRjb25zdCBBbm5vdGF0aW9uUHJlZml4ID0gXCJwZGZqc19pbnRlcm5hbF9pZF9cIjtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uUHJlZml4ID0gQW5ub3RhdGlvblByZWZpeDtcblx0Y2xhc3MgUGl4ZWxzUGVySW5jaCB7XG5cdCAgc3RhdGljIENTUyA9IDk2LjA7XG5cdCAgc3RhdGljIFBERiA9IDcyLjA7XG5cdCAgc3RhdGljIFBERl9UT19DU1NfVU5JVFMgPSB0aGlzLkNTUyAvIHRoaXMuUERGO1xuXHR9XG5cdGV4cG9ydHMuUGl4ZWxzUGVySW5jaCA9IFBpeGVsc1BlckluY2g7XG5cdGNsYXNzIERPTUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBfYmFzZV9mYWN0b3J5LkJhc2VGaWx0ZXJGYWN0b3J5IHtcblx0ICAjX2NhY2hlO1xuXHQgICNfZGVmcztcblx0ICAjZG9jSWQ7XG5cdCAgI2RvY3VtZW50O1xuXHQgICNoY21GaWx0ZXI7XG5cdCAgI2hjbUtleTtcblx0ICAjaGNtVXJsO1xuXHQgICNpZCA9IDA7XG5cdCAgY29uc3RydWN0b3Ioe1xuXHQgICAgZG9jSWQsXG5cdCAgICBvd25lckRvY3VtZW50ID0gZ2xvYmFsVGhpcy5kb2N1bWVudFxuXHQgIH0gPSB7fSkge1xuXHQgICAgc3VwZXIoKTtcblx0ICAgIHRoaXMuI2RvY0lkID0gZG9jSWQ7XG5cdCAgICB0aGlzLiNkb2N1bWVudCA9IG93bmVyRG9jdW1lbnQ7XG5cdCAgfVxuXHQgIGdldCAjY2FjaGUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jX2NhY2hlIHx8PSBuZXcgTWFwKCk7XG5cdCAgfVxuXHQgIGdldCAjZGVmcygpIHtcblx0ICAgIGlmICghdGhpcy4jX2RlZnMpIHtcblx0ICAgICAgY29uc3QgZGl2ID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgICAgY29uc3Qge1xuXHQgICAgICAgIHN0eWxlXG5cdCAgICAgIH0gPSBkaXY7XG5cdCAgICAgIHN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuXHQgICAgICBzdHlsZS5jb250YWluID0gXCJzdHJpY3RcIjtcblx0ICAgICAgc3R5bGUud2lkdGggPSBzdHlsZS5oZWlnaHQgPSAwO1xuXHQgICAgICBzdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0ICAgICAgc3R5bGUudG9wID0gc3R5bGUubGVmdCA9IDA7XG5cdCAgICAgIHN0eWxlLnpJbmRleCA9IC0xO1xuXHQgICAgICBjb25zdCBzdmcgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcblx0ICAgICAgc3ZnLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIDApO1xuXHQgICAgICBzdmcuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIDApO1xuXHQgICAgICB0aGlzLiNfZGVmcyA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZGVmc1wiKTtcblx0ICAgICAgZGl2LmFwcGVuZChzdmcpO1xuXHQgICAgICBzdmcuYXBwZW5kKHRoaXMuI19kZWZzKTtcblx0ICAgICAgdGhpcy4jZG9jdW1lbnQuYm9keS5hcHBlbmQoZGl2KTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLiNfZGVmcztcblx0ICB9XG5cdCAgI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBmdW5jLCB0YWJsZSkge1xuXHQgICAgY29uc3QgZmVGdW5jID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgZnVuYyk7XG5cdCAgICBmZUZ1bmMuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImRpc2NyZXRlXCIpO1xuXHQgICAgZmVGdW5jLnNldEF0dHJpYnV0ZShcInRhYmxlVmFsdWVzXCIsIHRhYmxlKTtcblx0ICAgIGZlQ29tcG9uZW50VHJhbnNmZXIuYXBwZW5kKGZlRnVuYyk7XG5cdCAgfVxuXHQgIGFkZEZpbHRlcihtYXBzKSB7XG5cdCAgICBpZiAoIW1hcHMpIHtcblx0ICAgICAgcmV0dXJuIFwibm9uZVwiO1xuXHQgICAgfVxuXHQgICAgbGV0IHZhbHVlID0gdGhpcy4jY2FjaGUuZ2V0KG1hcHMpO1xuXHQgICAgaWYgKHZhbHVlKSB7XG5cdCAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgIH1cblx0ICAgIGxldCB0YWJsZVIsIHRhYmxlRywgdGFibGVCLCBrZXk7XG5cdCAgICBpZiAobWFwcy5sZW5ndGggPT09IDEpIHtcblx0ICAgICAgY29uc3QgbWFwUiA9IG1hcHNbMF07XG5cdCAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheSgyNTYpO1xuXHQgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG5cdCAgICAgICAgYnVmZmVyW2ldID0gbWFwUltpXSAvIDI1NTtcblx0ICAgICAgfVxuXHQgICAgICBrZXkgPSB0YWJsZVIgPSB0YWJsZUcgPSB0YWJsZUIgPSBidWZmZXIuam9pbihcIixcIik7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjb25zdCBbbWFwUiwgbWFwRywgbWFwQl0gPSBtYXBzO1xuXHQgICAgICBjb25zdCBidWZmZXJSID0gbmV3IEFycmF5KDI1Nik7XG5cdCAgICAgIGNvbnN0IGJ1ZmZlckcgPSBuZXcgQXJyYXkoMjU2KTtcblx0ICAgICAgY29uc3QgYnVmZmVyQiA9IG5ldyBBcnJheSgyNTYpO1xuXHQgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG5cdCAgICAgICAgYnVmZmVyUltpXSA9IG1hcFJbaV0gLyAyNTU7XG5cdCAgICAgICAgYnVmZmVyR1tpXSA9IG1hcEdbaV0gLyAyNTU7XG5cdCAgICAgICAgYnVmZmVyQltpXSA9IG1hcEJbaV0gLyAyNTU7XG5cdCAgICAgIH1cblx0ICAgICAgdGFibGVSID0gYnVmZmVyUi5qb2luKFwiLFwiKTtcblx0ICAgICAgdGFibGVHID0gYnVmZmVyRy5qb2luKFwiLFwiKTtcblx0ICAgICAgdGFibGVCID0gYnVmZmVyQi5qb2luKFwiLFwiKTtcblx0ICAgICAga2V5ID0gYCR7dGFibGVSfSR7dGFibGVHfSR7dGFibGVCfWA7XG5cdCAgICB9XG5cdCAgICB2YWx1ZSA9IHRoaXMuI2NhY2hlLmdldChrZXkpO1xuXHQgICAgaWYgKHZhbHVlKSB7XG5cdCAgICAgIHRoaXMuI2NhY2hlLnNldChtYXBzLCB2YWx1ZSk7XG5cdCAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1fdHJhbnNmZXJfbWFwXyR7dGhpcy4jaWQrK31gO1xuXHQgICAgY29uc3QgdXJsID0gYHVybCgjJHtpZH0pYDtcblx0ICAgIHRoaXMuI2NhY2hlLnNldChtYXBzLCB1cmwpO1xuXHQgICAgdGhpcy4jY2FjaGUuc2V0KGtleSwgdXJsKTtcblx0ICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmlsdGVyXCIsIFNWR19OUyk7XG5cdCAgICBmaWx0ZXIuc2V0QXR0cmlidXRlKFwiaWRcIiwgaWQpO1xuXHQgICAgZmlsdGVyLnNldEF0dHJpYnV0ZShcImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVyc1wiLCBcInNSR0JcIik7XG5cdCAgICBjb25zdCBmZUNvbXBvbmVudFRyYW5zZmVyID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmZUNvbXBvbmVudFRyYW5zZmVyXCIpO1xuXHQgICAgZmlsdGVyLmFwcGVuZChmZUNvbXBvbmVudFRyYW5zZmVyKTtcblx0ICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY1JcIiwgdGFibGVSKTtcblx0ICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0dcIiwgdGFibGVHKTtcblx0ICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0JcIiwgdGFibGVCKTtcblx0ICAgIHRoaXMuI2RlZnMuYXBwZW5kKGZpbHRlcik7XG5cdCAgICByZXR1cm4gdXJsO1xuXHQgIH1cblx0ICBhZGRIQ01GaWx0ZXIoZmdDb2xvciwgYmdDb2xvcikge1xuXHQgICAgY29uc3Qga2V5ID0gYCR7ZmdDb2xvcn0tJHtiZ0NvbG9yfWA7XG5cdCAgICBpZiAodGhpcy4jaGNtS2V5ID09PSBrZXkpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuI2hjbVVybDtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2hjbUtleSA9IGtleTtcblx0ICAgIHRoaXMuI2hjbVVybCA9IFwibm9uZVwiO1xuXHQgICAgdGhpcy4jaGNtRmlsdGVyPy5yZW1vdmUoKTtcblx0ICAgIGlmICghZmdDb2xvciB8fCAhYmdDb2xvcikge1xuXHQgICAgICByZXR1cm4gdGhpcy4jaGNtVXJsO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jZGVmcy5zdHlsZS5jb2xvciA9IGZnQ29sb3I7XG5cdCAgICBmZ0NvbG9yID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLiNkZWZzKS5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sb3JcIik7XG5cdCAgICBjb25zdCBmZ1JHQiA9IGdldFJHQihmZ0NvbG9yKTtcblx0ICAgIGZnQ29sb3IgPSBfdXRpbC5VdGlsLm1ha2VIZXhDb2xvciguLi5mZ1JHQik7XG5cdCAgICB0aGlzLiNkZWZzLnN0eWxlLmNvbG9yID0gYmdDb2xvcjtcblx0ICAgIGJnQ29sb3IgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuI2RlZnMpLmdldFByb3BlcnR5VmFsdWUoXCJjb2xvclwiKTtcblx0ICAgIGNvbnN0IGJnUkdCID0gZ2V0UkdCKGJnQ29sb3IpO1xuXHQgICAgYmdDb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKC4uLmJnUkdCKTtcblx0ICAgIHRoaXMuI2RlZnMuc3R5bGUuY29sb3IgPSBcIlwiO1xuXHQgICAgaWYgKGZnQ29sb3IgPT09IFwiIzAwMDAwMFwiICYmIGJnQ29sb3IgPT09IFwiI2ZmZmZmZlwiIHx8IGZnQ29sb3IgPT09IGJnQ29sb3IpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuI2hjbVVybDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IG1hcCA9IG5ldyBBcnJheSgyNTYpO1xuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMjU1OyBpKyspIHtcblx0ICAgICAgY29uc3QgeCA9IGkgLyAyNTU7XG5cdCAgICAgIG1hcFtpXSA9IHggPD0gMC4wMzkyOCA/IHggLyAxMi45MiA6ICgoeCArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQ7XG5cdCAgICB9XG5cdCAgICBjb25zdCB0YWJsZSA9IG1hcC5qb2luKFwiLFwiKTtcblx0ICAgIGNvbnN0IGlkID0gYGdfJHt0aGlzLiNkb2NJZH1faGNtX2ZpbHRlcmA7XG5cdCAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLiNoY21GaWx0ZXIgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZpbHRlclwiLCBTVkdfTlMpO1xuXHQgICAgZmlsdGVyLnNldEF0dHJpYnV0ZShcImlkXCIsIGlkKTtcblx0ICAgIGZpbHRlci5zZXRBdHRyaWJ1dGUoXCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnNcIiwgXCJzUkdCXCIpO1xuXHQgICAgbGV0IGZlQ29tcG9uZW50VHJhbnNmZXIgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29tcG9uZW50VHJhbnNmZXJcIik7XG5cdCAgICBmaWx0ZXIuYXBwZW5kKGZlQ29tcG9uZW50VHJhbnNmZXIpO1xuXHQgICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jUlwiLCB0YWJsZSk7XG5cdCAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNHXCIsIHRhYmxlKTtcblx0ICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0JcIiwgdGFibGUpO1xuXHQgICAgY29uc3QgZmVDb2xvck1hdHJpeCA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmVDb2xvck1hdHJpeFwiKTtcblx0ICAgIGZlQ29sb3JNYXRyaXguc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcIm1hdHJpeFwiKTtcblx0ICAgIGZlQ29sb3JNYXRyaXguc2V0QXR0cmlidXRlKFwidmFsdWVzXCIsIFwiMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMCAwIDAgMSAwXCIpO1xuXHQgICAgZmlsdGVyLmFwcGVuZChmZUNvbG9yTWF0cml4KTtcblx0ICAgIGZlQ29tcG9uZW50VHJhbnNmZXIgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29tcG9uZW50VHJhbnNmZXJcIik7XG5cdCAgICBmaWx0ZXIuYXBwZW5kKGZlQ29tcG9uZW50VHJhbnNmZXIpO1xuXHQgICAgY29uc3QgZ2V0U3RlcHMgPSAoYywgbikgPT4ge1xuXHQgICAgICBjb25zdCBzdGFydCA9IGZnUkdCW2NdIC8gMjU1O1xuXHQgICAgICBjb25zdCBlbmQgPSBiZ1JHQltjXSAvIDI1NTtcblx0ICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KG4gKyAxKTtcblx0ICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7XG5cdCAgICAgICAgYXJyW2ldID0gc3RhcnQgKyBpIC8gbiAqIChlbmQgLSBzdGFydCk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGFyci5qb2luKFwiLFwiKTtcblx0ICAgIH07XG5cdCAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNSXCIsIGdldFN0ZXBzKDAsIDUpKTtcblx0ICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0dcIiwgZ2V0U3RlcHMoMSwgNSkpO1xuXHQgICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jQlwiLCBnZXRTdGVwcygyLCA1KSk7XG5cdCAgICB0aGlzLiNkZWZzLmFwcGVuZChmaWx0ZXIpO1xuXHQgICAgdGhpcy4jaGNtVXJsID0gYHVybCgjJHtpZH0pYDtcblx0ICAgIHJldHVybiB0aGlzLiNoY21Vcmw7XG5cdCAgfVxuXHQgIGRlc3Ryb3koa2VlcEhDTSA9IGZhbHNlKSB7XG5cdCAgICBpZiAoa2VlcEhDTSAmJiB0aGlzLiNoY21VcmwpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuI19kZWZzKSB7XG5cdCAgICAgIHRoaXMuI19kZWZzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmUoKTtcblx0ICAgICAgdGhpcy4jX2RlZnMgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuI19jYWNoZSkge1xuXHQgICAgICB0aGlzLiNfY2FjaGUuY2xlYXIoKTtcblx0ICAgICAgdGhpcy4jX2NhY2hlID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2lkID0gMDtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5ET01GaWx0ZXJGYWN0b3J5ID0gRE9NRmlsdGVyRmFjdG9yeTtcblx0Y2xhc3MgRE9NQ2FudmFzRmFjdG9yeSBleHRlbmRzIF9iYXNlX2ZhY3RvcnkuQmFzZUNhbnZhc0ZhY3Rvcnkge1xuXHQgIGNvbnN0cnVjdG9yKHtcblx0ICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50XG5cdCAgfSA9IHt9KSB7XG5cdCAgICBzdXBlcigpO1xuXHQgICAgdGhpcy5fZG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuXHQgIH1cblx0ICBfY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcblx0ICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG5cdCAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcblx0ICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cdCAgICByZXR1cm4gY2FudmFzO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkRPTUNhbnZhc0ZhY3RvcnkgPSBET01DYW52YXNGYWN0b3J5O1xuXHRhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEodXJsLCBhc1R5cGVkQXJyYXkgPSBmYWxzZSkge1xuXHQgIGlmIChpc1ZhbGlkRmV0Y2hVcmwodXJsLCBkb2N1bWVudC5iYXNlVVJJKSkge1xuXHQgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuXHQgICAgaWYgKCFyZXNwb25zZS5vaykge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gYXNUeXBlZEFycmF5ID8gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSkgOiAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoYXdhaXQgcmVzcG9uc2UudGV4dCgpKTtcblx0ICB9XG5cdCAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0ICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0ICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCB1cmwsIHRydWUpO1xuXHQgICAgaWYgKGFzVHlwZWRBcnJheSkge1xuXHQgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcblx0ICAgIH1cblx0ICAgIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuXHQgICAgICBpZiAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSBYTUxIdHRwUmVxdWVzdC5ET05FKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwIHx8IHJlcXVlc3Quc3RhdHVzID09PSAwKSB7XG5cdCAgICAgICAgbGV0IGRhdGE7XG5cdCAgICAgICAgaWYgKGFzVHlwZWRBcnJheSAmJiByZXF1ZXN0LnJlc3BvbnNlKSB7XG5cdCAgICAgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkocmVxdWVzdC5yZXNwb25zZSk7XG5cdCAgICAgICAgfSBlbHNlIGlmICghYXNUeXBlZEFycmF5ICYmIHJlcXVlc3QucmVzcG9uc2VUZXh0KSB7XG5cdCAgICAgICAgICBkYXRhID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGRhdGEpIHtcblx0ICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJlamVjdChuZXcgRXJyb3IocmVxdWVzdC5zdGF0dXNUZXh0KSk7XG5cdCAgICB9O1xuXHQgICAgcmVxdWVzdC5zZW5kKG51bGwpO1xuXHQgIH0pO1xuXHR9XG5cdGNsYXNzIERPTUNNYXBSZWFkZXJGYWN0b3J5IGV4dGVuZHMgX2Jhc2VfZmFjdG9yeS5CYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuXHQgIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHtcblx0ICAgIHJldHVybiBmZXRjaERhdGEodXJsLCB0aGlzLmlzQ29tcHJlc3NlZCkudGhlbihkYXRhID0+IHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICBjTWFwRGF0YTogZGF0YSxcblx0ICAgICAgICBjb21wcmVzc2lvblR5cGVcblx0ICAgICAgfTtcblx0ICAgIH0pO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkRPTUNNYXBSZWFkZXJGYWN0b3J5ID0gRE9NQ01hcFJlYWRlckZhY3Rvcnk7XG5cdGNsYXNzIERPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IGV4dGVuZHMgX2Jhc2VfZmFjdG9yeS5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuXHQgIF9mZXRjaERhdGEodXJsKSB7XG5cdCAgICByZXR1cm4gZmV0Y2hEYXRhKHVybCwgdHJ1ZSk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuRE9NU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcblx0Y2xhc3MgRE9NU1ZHRmFjdG9yeSBleHRlbmRzIF9iYXNlX2ZhY3RvcnkuQmFzZVNWR0ZhY3Rvcnkge1xuXHQgIF9jcmVhdGVTVkcodHlwZSkge1xuXHQgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIHR5cGUpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkRPTVNWR0ZhY3RvcnkgPSBET01TVkdGYWN0b3J5O1xuXHRjbGFzcyBQYWdlVmlld3BvcnQge1xuXHQgIGNvbnN0cnVjdG9yKHtcblx0ICAgIHZpZXdCb3gsXG5cdCAgICBzY2FsZSxcblx0ICAgIHJvdGF0aW9uLFxuXHQgICAgb2Zmc2V0WCA9IDAsXG5cdCAgICBvZmZzZXRZID0gMCxcblx0ICAgIGRvbnRGbGlwID0gZmFsc2Vcblx0ICB9KSB7XG5cdCAgICB0aGlzLnZpZXdCb3ggPSB2aWV3Qm94O1xuXHQgICAgdGhpcy5zY2FsZSA9IHNjYWxlO1xuXHQgICAgdGhpcy5yb3RhdGlvbiA9IHJvdGF0aW9uO1xuXHQgICAgdGhpcy5vZmZzZXRYID0gb2Zmc2V0WDtcblx0ICAgIHRoaXMub2Zmc2V0WSA9IG9mZnNldFk7XG5cdCAgICBjb25zdCBjZW50ZXJYID0gKHZpZXdCb3hbMl0gKyB2aWV3Qm94WzBdKSAvIDI7XG5cdCAgICBjb25zdCBjZW50ZXJZID0gKHZpZXdCb3hbM10gKyB2aWV3Qm94WzFdKSAvIDI7XG5cdCAgICBsZXQgcm90YXRlQSwgcm90YXRlQiwgcm90YXRlQywgcm90YXRlRDtcblx0ICAgIHJvdGF0aW9uICU9IDM2MDtcblx0ICAgIGlmIChyb3RhdGlvbiA8IDApIHtcblx0ICAgICAgcm90YXRpb24gKz0gMzYwO1xuXHQgICAgfVxuXHQgICAgc3dpdGNoIChyb3RhdGlvbikge1xuXHQgICAgICBjYXNlIDE4MDpcblx0ICAgICAgICByb3RhdGVBID0gLTE7XG5cdCAgICAgICAgcm90YXRlQiA9IDA7XG5cdCAgICAgICAgcm90YXRlQyA9IDA7XG5cdCAgICAgICAgcm90YXRlRCA9IDE7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgOTA6XG5cdCAgICAgICAgcm90YXRlQSA9IDA7XG5cdCAgICAgICAgcm90YXRlQiA9IDE7XG5cdCAgICAgICAgcm90YXRlQyA9IDE7XG5cdCAgICAgICAgcm90YXRlRCA9IDA7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgMjcwOlxuXHQgICAgICAgIHJvdGF0ZUEgPSAwO1xuXHQgICAgICAgIHJvdGF0ZUIgPSAtMTtcblx0ICAgICAgICByb3RhdGVDID0gLTE7XG5cdCAgICAgICAgcm90YXRlRCA9IDA7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgMDpcblx0ICAgICAgICByb3RhdGVBID0gMTtcblx0ICAgICAgICByb3RhdGVCID0gMDtcblx0ICAgICAgICByb3RhdGVDID0gMDtcblx0ICAgICAgICByb3RhdGVEID0gLTE7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFnZVZpZXdwb3J0OiBJbnZhbGlkIHJvdGF0aW9uLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOTAgZGVncmVlcy5cIik7XG5cdCAgICB9XG5cdCAgICBpZiAoZG9udEZsaXApIHtcblx0ICAgICAgcm90YXRlQyA9IC1yb3RhdGVDO1xuXHQgICAgICByb3RhdGVEID0gLXJvdGF0ZUQ7XG5cdCAgICB9XG5cdCAgICBsZXQgb2Zmc2V0Q2FudmFzWCwgb2Zmc2V0Q2FudmFzWTtcblx0ICAgIGxldCB3aWR0aCwgaGVpZ2h0O1xuXHQgICAgaWYgKHJvdGF0ZUEgPT09IDApIHtcblx0ICAgICAgb2Zmc2V0Q2FudmFzWCA9IE1hdGguYWJzKGNlbnRlclkgLSB2aWV3Qm94WzFdKSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0ICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclggLSB2aWV3Qm94WzBdKSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0ICAgICAgd2lkdGggPSAodmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG5cdCAgICAgIGhlaWdodCA9ICh2aWV3Qm94WzJdIC0gdmlld0JveFswXSkgKiBzY2FsZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIG9mZnNldENhbnZhc1ggPSBNYXRoLmFicyhjZW50ZXJYIC0gdmlld0JveFswXSkgKiBzY2FsZSArIG9mZnNldFg7XG5cdCAgICAgIG9mZnNldENhbnZhc1kgPSBNYXRoLmFicyhjZW50ZXJZIC0gdmlld0JveFsxXSkgKiBzY2FsZSArIG9mZnNldFk7XG5cdCAgICAgIHdpZHRoID0gKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlO1xuXHQgICAgICBoZWlnaHQgPSAodmlld0JveFszXSAtIHZpZXdCb3hbMV0pICogc2NhbGU7XG5cdCAgICB9XG5cdCAgICB0aGlzLnRyYW5zZm9ybSA9IFtyb3RhdGVBICogc2NhbGUsIHJvdGF0ZUIgKiBzY2FsZSwgcm90YXRlQyAqIHNjYWxlLCByb3RhdGVEICogc2NhbGUsIG9mZnNldENhbnZhc1ggLSByb3RhdGVBICogc2NhbGUgKiBjZW50ZXJYIC0gcm90YXRlQyAqIHNjYWxlICogY2VudGVyWSwgb2Zmc2V0Q2FudmFzWSAtIHJvdGF0ZUIgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVEICogc2NhbGUgKiBjZW50ZXJZXTtcblx0ICAgIHRoaXMud2lkdGggPSB3aWR0aDtcblx0ICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXHQgIH1cblx0ICBnZXQgcmF3RGltcygpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgdmlld0JveFxuXHQgICAgfSA9IHRoaXM7XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJyYXdEaW1zXCIsIHtcblx0ICAgICAgcGFnZVdpZHRoOiB2aWV3Qm94WzJdIC0gdmlld0JveFswXSxcblx0ICAgICAgcGFnZUhlaWdodDogdmlld0JveFszXSAtIHZpZXdCb3hbMV0sXG5cdCAgICAgIHBhZ2VYOiB2aWV3Qm94WzBdLFxuXHQgICAgICBwYWdlWTogdmlld0JveFsxXVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGNsb25lKHtcblx0ICAgIHNjYWxlID0gdGhpcy5zY2FsZSxcblx0ICAgIHJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbixcblx0ICAgIG9mZnNldFggPSB0aGlzLm9mZnNldFgsXG5cdCAgICBvZmZzZXRZID0gdGhpcy5vZmZzZXRZLFxuXHQgICAgZG9udEZsaXAgPSBmYWxzZVxuXHQgIH0gPSB7fSkge1xuXHQgICAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe1xuXHQgICAgICB2aWV3Qm94OiB0aGlzLnZpZXdCb3guc2xpY2UoKSxcblx0ICAgICAgc2NhbGUsXG5cdCAgICAgIHJvdGF0aW9uLFxuXHQgICAgICBvZmZzZXRYLFxuXHQgICAgICBvZmZzZXRZLFxuXHQgICAgICBkb250RmxpcFxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGNvbnZlcnRUb1ZpZXdwb3J0UG9pbnQoeCwgeSkge1xuXHQgICAgcmV0dXJuIF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7XG5cdCAgfVxuXHQgIGNvbnZlcnRUb1ZpZXdwb3J0UmVjdGFuZ2xlKHJlY3QpIHtcblx0ICAgIGNvbnN0IHRvcExlZnQgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzBdLCByZWN0WzFdXSwgdGhpcy50cmFuc2Zvcm0pO1xuXHQgICAgY29uc3QgYm90dG9tUmlnaHQgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFtyZWN0WzJdLCByZWN0WzNdXSwgdGhpcy50cmFuc2Zvcm0pO1xuXHQgICAgcmV0dXJuIFt0b3BMZWZ0WzBdLCB0b3BMZWZ0WzFdLCBib3R0b21SaWdodFswXSwgYm90dG9tUmlnaHRbMV1dO1xuXHQgIH1cblx0ICBjb252ZXJ0VG9QZGZQb2ludCh4LCB5KSB7XG5cdCAgICByZXR1cm4gX3V0aWwuVXRpbC5hcHBseUludmVyc2VUcmFuc2Zvcm0oW3gsIHldLCB0aGlzLnRyYW5zZm9ybSk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUGFnZVZpZXdwb3J0ID0gUGFnZVZpZXdwb3J0O1xuXHRjbGFzcyBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24gZXh0ZW5kcyBfdXRpbC5CYXNlRXhjZXB0aW9uIHtcblx0ICBjb25zdHJ1Y3Rvcihtc2csIHR5cGUsIGV4dHJhRGVsYXkgPSAwKSB7XG5cdCAgICBzdXBlcihtc2csIFwiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uXCIpO1xuXHQgICAgdGhpcy50eXBlID0gdHlwZTtcblx0ICAgIHRoaXMuZXh0cmFEZWxheSA9IGV4dHJhRGVsYXk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uO1xuXHRmdW5jdGlvbiBpc0RhdGFTY2hlbWUodXJsKSB7XG5cdCAgY29uc3QgaWkgPSB1cmwubGVuZ3RoO1xuXHQgIGxldCBpID0gMDtcblx0ICB3aGlsZSAoaSA8IGlpICYmIHVybFtpXS50cmltKCkgPT09IFwiXCIpIHtcblx0ICAgIGkrKztcblx0ICB9XG5cdCAgcmV0dXJuIHVybC5zdWJzdHJpbmcoaSwgaSArIDUpLnRvTG93ZXJDYXNlKCkgPT09IFwiZGF0YTpcIjtcblx0fVxuXHRmdW5jdGlvbiBpc1BkZkZpbGUoZmlsZW5hbWUpIHtcblx0ICByZXR1cm4gdHlwZW9mIGZpbGVuYW1lID09PSBcInN0cmluZ1wiICYmIC9cXC5wZGYkL2kudGVzdChmaWxlbmFtZSk7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tVXJsKHVybCwgb25seVN0cmlwUGF0aCA9IGZhbHNlKSB7XG5cdCAgaWYgKCFvbmx5U3RyaXBQYXRoKSB7XG5cdCAgICBbdXJsXSA9IHVybC5zcGxpdCgvWyM/XS8sIDEpO1xuXHQgIH1cblx0ICByZXR1cm4gdXJsLnN1YnN0cmluZyh1cmwubGFzdEluZGV4T2YoXCIvXCIpICsgMSk7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0UGRmRmlsZW5hbWVGcm9tVXJsKHVybCwgZGVmYXVsdEZpbGVuYW1lID0gXCJkb2N1bWVudC5wZGZcIikge1xuXHQgIGlmICh0eXBlb2YgdXJsICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lO1xuXHQgIH1cblx0ICBpZiAoaXNEYXRhU2NoZW1lKHVybCkpIHtcblx0ICAgICgwLCBfdXRpbC53YXJuKSgnZ2V0UGRmRmlsZW5hbWVGcm9tVXJsOiBpZ25vcmUgXCJkYXRhOlwiLVVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nKTtcblx0ICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7XG5cdCAgfVxuXHQgIGNvbnN0IHJlVVJJID0gL14oPzooPzpbXjpdKzopP1xcL1xcL1teL10rKT8oW14/I10qKShcXD9bXiNdKik/KCMuKik/JC87XG5cdCAgY29uc3QgcmVGaWxlbmFtZSA9IC9bXi8/Iz1dK1xcLnBkZlxcYig/IS4qXFwucGRmXFxiKS9pO1xuXHQgIGNvbnN0IHNwbGl0VVJJID0gcmVVUkkuZXhlYyh1cmwpO1xuXHQgIGxldCBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVsxXSkgfHwgcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzJdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbM10pO1xuXHQgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZSkge1xuXHQgICAgc3VnZ2VzdGVkRmlsZW5hbWUgPSBzdWdnZXN0ZWRGaWxlbmFtZVswXTtcblx0ICAgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZS5pbmNsdWRlcyhcIiVcIikpIHtcblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhkZWNvZGVVUklDb21wb25lbnQoc3VnZ2VzdGVkRmlsZW5hbWUpKVswXTtcblx0ICAgICAgfSBjYXRjaCAoZXgpIHt9XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiBzdWdnZXN0ZWRGaWxlbmFtZSB8fCBkZWZhdWx0RmlsZW5hbWU7XG5cdH1cblx0Y2xhc3MgU3RhdFRpbWVyIHtcblx0ICBzdGFydGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICB0aW1lcyA9IFtdO1xuXHQgIHRpbWUobmFtZSkge1xuXHQgICAgaWYgKG5hbWUgaW4gdGhpcy5zdGFydGVkKSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShgVGltZXIgaXMgYWxyZWFkeSBydW5uaW5nIGZvciAke25hbWV9YCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLnN0YXJ0ZWRbbmFtZV0gPSBEYXRlLm5vdygpO1xuXHQgIH1cblx0ICB0aW1lRW5kKG5hbWUpIHtcblx0ICAgIGlmICghKG5hbWUgaW4gdGhpcy5zdGFydGVkKSkge1xuXHQgICAgICAoMCwgX3V0aWwud2FybikoYFRpbWVyIGhhcyBub3QgYmVlbiBzdGFydGVkIGZvciAke25hbWV9YCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLnRpbWVzLnB1c2goe1xuXHQgICAgICBuYW1lLFxuXHQgICAgICBzdGFydDogdGhpcy5zdGFydGVkW25hbWVdLFxuXHQgICAgICBlbmQ6IERhdGUubm93KClcblx0ICAgIH0pO1xuXHQgICAgZGVsZXRlIHRoaXMuc3RhcnRlZFtuYW1lXTtcblx0ICB9XG5cdCAgdG9TdHJpbmcoKSB7XG5cdCAgICBjb25zdCBvdXRCdWYgPSBbXTtcblx0ICAgIGxldCBsb25nZXN0ID0gMDtcblx0ICAgIGZvciAoY29uc3Qge1xuXHQgICAgICBuYW1lXG5cdCAgICB9IG9mIHRoaXMudGltZXMpIHtcblx0ICAgICAgbG9uZ2VzdCA9IE1hdGgubWF4KG5hbWUubGVuZ3RoLCBsb25nZXN0KTtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3Qge1xuXHQgICAgICBuYW1lLFxuXHQgICAgICBzdGFydCxcblx0ICAgICAgZW5kXG5cdCAgICB9IG9mIHRoaXMudGltZXMpIHtcblx0ICAgICAgb3V0QnVmLnB1c2goYCR7bmFtZS5wYWRFbmQobG9uZ2VzdCl9ICR7ZW5kIC0gc3RhcnR9bXNcXG5gKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBvdXRCdWYuam9pbihcIlwiKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5TdGF0VGltZXIgPSBTdGF0VGltZXI7XG5cdGZ1bmN0aW9uIGlzVmFsaWRGZXRjaFVybCh1cmwsIGJhc2VVcmwpIHtcblx0ICB0cnkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBwcm90b2NvbFxuXHQgICAgfSA9IGJhc2VVcmwgPyBuZXcgVVJMKHVybCwgYmFzZVVybCkgOiBuZXcgVVJMKHVybCk7XG5cdCAgICByZXR1cm4gcHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCBwcm90b2NvbCA9PT0gXCJodHRwczpcIjtcblx0ICB9IGNhdGNoIChleCkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBsb2FkU2NyaXB0KHNyYywgcmVtb3ZlU2NyaXB0RWxlbWVudCA9IGZhbHNlKSB7XG5cdCAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0ICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG5cdCAgICBzY3JpcHQuc3JjID0gc3JjO1xuXHQgICAgc2NyaXB0Lm9ubG9hZCA9IGZ1bmN0aW9uIChldnQpIHtcblx0ICAgICAgaWYgKHJlbW92ZVNjcmlwdEVsZW1lbnQpIHtcblx0ICAgICAgICBzY3JpcHQucmVtb3ZlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgcmVzb2x2ZShldnQpO1xuXHQgICAgfTtcblx0ICAgIHNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICByZWplY3QobmV3IEVycm9yKGBDYW5ub3QgbG9hZCBzY3JpcHQgYXQ6ICR7c2NyaXB0LnNyY31gKSk7XG5cdCAgICB9O1xuXHQgICAgKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmQoc2NyaXB0KTtcblx0ICB9KTtcblx0fVxuXHRmdW5jdGlvbiBkZXByZWNhdGVkKGRldGFpbHMpIHtcblx0ICBjb25zb2xlLmxvZyhcIkRlcHJlY2F0ZWQgQVBJIHVzYWdlOiBcIiArIGRldGFpbHMpO1xuXHR9XG5cdGxldCBwZGZEYXRlU3RyaW5nUmVnZXg7XG5cdGNsYXNzIFBERkRhdGVTdHJpbmcge1xuXHQgIHN0YXRpYyB0b0RhdGVPYmplY3QoaW5wdXQpIHtcblx0ICAgIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgaWYgKCFwZGZEYXRlU3RyaW5nUmVnZXgpIHtcblx0ICAgICAgcGRmRGF0ZVN0cmluZ1JlZ2V4ID0gbmV3IFJlZ0V4cChcIl5EOlwiICsgXCIoXFxcXGR7NH0pXCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihcXFxcZHsyfSk/XCIgKyBcIihbWnwrfC1dKT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiJz9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiJz9cIik7XG5cdCAgICB9XG5cdCAgICBjb25zdCBtYXRjaGVzID0gcGRmRGF0ZVN0cmluZ1JlZ2V4LmV4ZWMoaW5wdXQpO1xuXHQgICAgaWYgKCFtYXRjaGVzKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgeWVhciA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKTtcblx0ICAgIGxldCBtb250aCA9IHBhcnNlSW50KG1hdGNoZXNbMl0sIDEwKTtcblx0ICAgIG1vbnRoID0gbW9udGggPj0gMSAmJiBtb250aCA8PSAxMiA/IG1vbnRoIC0gMSA6IDA7XG5cdCAgICBsZXQgZGF5ID0gcGFyc2VJbnQobWF0Y2hlc1szXSwgMTApO1xuXHQgICAgZGF5ID0gZGF5ID49IDEgJiYgZGF5IDw9IDMxID8gZGF5IDogMTtcblx0ICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hlc1s0XSwgMTApO1xuXHQgICAgaG91ciA9IGhvdXIgPj0gMCAmJiBob3VyIDw9IDIzID8gaG91ciA6IDA7XG5cdCAgICBsZXQgbWludXRlID0gcGFyc2VJbnQobWF0Y2hlc1s1XSwgMTApO1xuXHQgICAgbWludXRlID0gbWludXRlID49IDAgJiYgbWludXRlIDw9IDU5ID8gbWludXRlIDogMDtcblx0ICAgIGxldCBzZWNvbmQgPSBwYXJzZUludChtYXRjaGVzWzZdLCAxMCk7XG5cdCAgICBzZWNvbmQgPSBzZWNvbmQgPj0gMCAmJiBzZWNvbmQgPD0gNTkgPyBzZWNvbmQgOiAwO1xuXHQgICAgY29uc3QgdW5pdmVyc2FsVGltZVJlbGF0aW9uID0gbWF0Y2hlc1s3XSB8fCBcIlpcIjtcblx0ICAgIGxldCBvZmZzZXRIb3VyID0gcGFyc2VJbnQobWF0Y2hlc1s4XSwgMTApO1xuXHQgICAgb2Zmc2V0SG91ciA9IG9mZnNldEhvdXIgPj0gMCAmJiBvZmZzZXRIb3VyIDw9IDIzID8gb2Zmc2V0SG91ciA6IDA7XG5cdCAgICBsZXQgb2Zmc2V0TWludXRlID0gcGFyc2VJbnQobWF0Y2hlc1s5XSwgMTApIHx8IDA7XG5cdCAgICBvZmZzZXRNaW51dGUgPSBvZmZzZXRNaW51dGUgPj0gMCAmJiBvZmZzZXRNaW51dGUgPD0gNTkgPyBvZmZzZXRNaW51dGUgOiAwO1xuXHQgICAgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gXCItXCIpIHtcblx0ICAgICAgaG91ciArPSBvZmZzZXRIb3VyO1xuXHQgICAgICBtaW51dGUgKz0gb2Zmc2V0TWludXRlO1xuXHQgICAgfSBlbHNlIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09IFwiK1wiKSB7XG5cdCAgICAgIGhvdXIgLT0gb2Zmc2V0SG91cjtcblx0ICAgICAgbWludXRlIC09IG9mZnNldE1pbnV0ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlBERkRhdGVTdHJpbmcgPSBQREZEYXRlU3RyaW5nO1xuXHRmdW5jdGlvbiBnZXRYZmFQYWdlVmlld3BvcnQoeGZhUGFnZSwge1xuXHQgIHNjYWxlID0gMSxcblx0ICByb3RhdGlvbiA9IDBcblx0fSkge1xuXHQgIGNvbnN0IHtcblx0ICAgIHdpZHRoLFxuXHQgICAgaGVpZ2h0XG5cdCAgfSA9IHhmYVBhZ2UuYXR0cmlidXRlcy5zdHlsZTtcblx0ICBjb25zdCB2aWV3Qm94ID0gWzAsIDAsIHBhcnNlSW50KHdpZHRoKSwgcGFyc2VJbnQoaGVpZ2h0KV07XG5cdCAgcmV0dXJuIG5ldyBQYWdlVmlld3BvcnQoe1xuXHQgICAgdmlld0JveCxcblx0ICAgIHNjYWxlLFxuXHQgICAgcm90YXRpb25cblx0ICB9KTtcblx0fVxuXHRmdW5jdGlvbiBnZXRSR0IoY29sb3IpIHtcblx0ICBpZiAoY29sb3Iuc3RhcnRzV2l0aChcIiNcIikpIHtcblx0ICAgIGNvbnN0IGNvbG9yUkdCID0gcGFyc2VJbnQoY29sb3Iuc2xpY2UoMSksIDE2KTtcblx0ICAgIHJldHVybiBbKGNvbG9yUkdCICYgMHhmZjAwMDApID4+IDE2LCAoY29sb3JSR0IgJiAweDAwZmYwMCkgPj4gOCwgY29sb3JSR0IgJiAweDAwMDBmZl07XG5cdCAgfVxuXHQgIGlmIChjb2xvci5zdGFydHNXaXRoKFwicmdiKFwiKSkge1xuXHQgICAgcmV0dXJuIGNvbG9yLnNsaWNlKDQsIC0xKS5zcGxpdChcIixcIikubWFwKHggPT4gcGFyc2VJbnQoeCkpO1xuXHQgIH1cblx0ICBpZiAoY29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG5cdCAgICByZXR1cm4gY29sb3Iuc2xpY2UoNSwgLTEpLnNwbGl0KFwiLFwiKS5tYXAoeCA9PiBwYXJzZUludCh4KSkuc2xpY2UoMCwgMyk7XG5cdCAgfVxuXHQgICgwLCBfdXRpbC53YXJuKShgTm90IGEgdmFsaWQgY29sb3IgZm9ybWF0OiBcIiR7Y29sb3J9XCJgKTtcblx0ICByZXR1cm4gWzAsIDAsIDBdO1xuXHR9XG5cdGZ1bmN0aW9uIGdldENvbG9yVmFsdWVzKGNvbG9ycykge1xuXHQgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcblx0ICBzcGFuLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuXHQgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHNwYW4pO1xuXHQgIGZvciAoY29uc3QgbmFtZSBvZiBjb2xvcnMua2V5cygpKSB7XG5cdCAgICBzcGFuLnN0eWxlLmNvbG9yID0gbmFtZTtcblx0ICAgIGNvbnN0IGNvbXB1dGVkQ29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShzcGFuKS5jb2xvcjtcblx0ICAgIGNvbG9ycy5zZXQobmFtZSwgZ2V0UkdCKGNvbXB1dGVkQ29sb3IpKTtcblx0ICB9XG5cdCAgc3Bhbi5yZW1vdmUoKTtcblx0fVxuXHRmdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtKGN0eCkge1xuXHQgIGNvbnN0IHtcblx0ICAgIGEsXG5cdCAgICBiLFxuXHQgICAgYyxcblx0ICAgIGQsXG5cdCAgICBlLFxuXHQgICAgZlxuXHQgIH0gPSBjdHguZ2V0VHJhbnNmb3JtKCk7XG5cdCAgcmV0dXJuIFthLCBiLCBjLCBkLCBlLCBmXTtcblx0fVxuXHRmdW5jdGlvbiBnZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZShjdHgpIHtcblx0ICBjb25zdCB7XG5cdCAgICBhLFxuXHQgICAgYixcblx0ICAgIGMsXG5cdCAgICBkLFxuXHQgICAgZSxcblx0ICAgIGZcblx0ICB9ID0gY3R4LmdldFRyYW5zZm9ybSgpLmludmVydFNlbGYoKTtcblx0ICByZXR1cm4gW2EsIGIsIGMsIGQsIGUsIGZdO1xuXHR9XG5cdGZ1bmN0aW9uIHNldExheWVyRGltZW5zaW9ucyhkaXYsIHZpZXdwb3J0LCBtdXN0RmxpcCA9IGZhbHNlLCBtdXN0Um90YXRlID0gdHJ1ZSkge1xuXHQgIGlmICh2aWV3cG9ydCBpbnN0YW5jZW9mIFBhZ2VWaWV3cG9ydCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBwYWdlV2lkdGgsXG5cdCAgICAgIHBhZ2VIZWlnaHRcblx0ICAgIH0gPSB2aWV3cG9ydC5yYXdEaW1zO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBzdHlsZVxuXHQgICAgfSA9IGRpdjtcblx0ICAgIGNvbnN0IHdpZHRoU3RyID0gYGNhbGModmFyKC0tc2NhbGUtZmFjdG9yKSAqICR7cGFnZVdpZHRofXB4KWA7XG5cdCAgICBjb25zdCBoZWlnaHRTdHIgPSBgY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpICogJHtwYWdlSGVpZ2h0fXB4KWA7XG5cdCAgICBpZiAoIW11c3RGbGlwIHx8IHZpZXdwb3J0LnJvdGF0aW9uICUgMTgwID09PSAwKSB7XG5cdCAgICAgIHN0eWxlLndpZHRoID0gd2lkdGhTdHI7XG5cdCAgICAgIHN0eWxlLmhlaWdodCA9IGhlaWdodFN0cjtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHN0eWxlLndpZHRoID0gaGVpZ2h0U3RyO1xuXHQgICAgICBzdHlsZS5oZWlnaHQgPSB3aWR0aFN0cjtcblx0ICAgIH1cblx0ICB9XG5cdCAgaWYgKG11c3RSb3RhdGUpIHtcblx0ICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1haW4tcm90YXRpb25cIiwgdmlld3BvcnQucm90YXRpb24pO1xuXHQgIH1cblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiA3ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBleHBvcnRzLkJhc2VTVkdGYWN0b3J5ID0gZXhwb3J0cy5CYXNlRmlsdGVyRmFjdG9yeSA9IGV4cG9ydHMuQmFzZUNhbnZhc0ZhY3RvcnkgPSBleHBvcnRzLkJhc2VDTWFwUmVhZGVyRmFjdG9yeSA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0Y2xhc3MgQmFzZUZpbHRlckZhY3Rvcnkge1xuXHQgIGNvbnN0cnVjdG9yKCkge1xuXHQgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VGaWx0ZXJGYWN0b3J5KSB7XG5cdCAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlRmlsdGVyRmFjdG9yeS5cIik7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGFkZEZpbHRlcihtYXBzKSB7XG5cdCAgICByZXR1cm4gXCJub25lXCI7XG5cdCAgfVxuXHQgIGFkZEhDTUZpbHRlcihmZ0NvbG9yLCBiZ0NvbG9yKSB7XG5cdCAgICByZXR1cm4gXCJub25lXCI7XG5cdCAgfVxuXHQgIGRlc3Ryb3koa2VlcEhDTSA9IGZhbHNlKSB7fVxuXHR9XG5cdGV4cG9ydHMuQmFzZUZpbHRlckZhY3RvcnkgPSBCYXNlRmlsdGVyRmFjdG9yeTtcblx0Y2xhc3MgQmFzZUNhbnZhc0ZhY3Rvcnkge1xuXHQgIGNvbnN0cnVjdG9yKCkge1xuXHQgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VDYW52YXNGYWN0b3J5KSB7XG5cdCAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ2FudmFzRmFjdG9yeS5cIik7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGNyZWF0ZSh3aWR0aCwgaGVpZ2h0KSB7XG5cdCAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY2FudmFzID0gdGhpcy5fY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2FudmFzLFxuXHQgICAgICBjb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpXG5cdCAgICB9O1xuXHQgIH1cblx0ICByZXNldChjYW52YXNBbmRDb250ZXh0LCB3aWR0aCwgaGVpZ2h0KSB7XG5cdCAgICBpZiAoIWNhbnZhc0FuZENvbnRleHQuY2FudmFzKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkXCIpO1xuXHQgICAgfVxuXHQgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjYW52YXMgc2l6ZVwiKTtcblx0ICAgIH1cblx0ICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLndpZHRoID0gd2lkdGg7XG5cdCAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cdCAgfVxuXHQgIGRlc3Ryb3koY2FudmFzQW5kQ29udGV4dCkge1xuXHQgICAgaWYgKCFjYW52YXNBbmRDb250ZXh0LmNhbnZhcykge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW52YXMgaXMgbm90IHNwZWNpZmllZFwiKTtcblx0ICAgIH1cblx0ICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLndpZHRoID0gMDtcblx0ICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IDA7XG5cdCAgICBjYW52YXNBbmRDb250ZXh0LmNhbnZhcyA9IG51bGw7XG5cdCAgICBjYW52YXNBbmRDb250ZXh0LmNvbnRleHQgPSBudWxsO1xuXHQgIH1cblx0ICBfY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcblx0ICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYF9jcmVhdGVDYW52YXNgIGNhbGxlZC5cIik7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQmFzZUNhbnZhc0ZhY3RvcnkgPSBCYXNlQ2FudmFzRmFjdG9yeTtcblx0Y2xhc3MgQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcblx0ICBjb25zdHJ1Y3Rvcih7XG5cdCAgICBiYXNlVXJsID0gbnVsbCxcblx0ICAgIGlzQ29tcHJlc3NlZCA9IHRydWVcblx0ICB9KSB7XG5cdCAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNNYXBSZWFkZXJGYWN0b3J5KSB7XG5cdCAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlQ01hcFJlYWRlckZhY3RvcnkuXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcblx0ICAgIHRoaXMuaXNDb21wcmVzc2VkID0gaXNDb21wcmVzc2VkO1xuXHQgIH1cblx0ICBhc3luYyBmZXRjaCh7XG5cdCAgICBuYW1lXG5cdCAgfSkge1xuXHQgICAgaWYgKCF0aGlzLmJhc2VVcmwpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQ01hcCBcImJhc2VVcmxcIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0ICcgKyAndGhlIFwiY01hcFVybFwiIGFuZCBcImNNYXBQYWNrZWRcIiBBUEkgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQuJyk7XG5cdCAgICB9XG5cdCAgICBpZiAoIW5hbWUpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ01hcCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLlwiKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybCArIG5hbWUgKyAodGhpcy5pc0NvbXByZXNzZWQgPyBcIi5iY21hcFwiIDogXCJcIik7XG5cdCAgICBjb25zdCBjb21wcmVzc2lvblR5cGUgPSB0aGlzLmlzQ29tcHJlc3NlZCA/IF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGUuQklOQVJZIDogX3V0aWwuQ01hcENvbXByZXNzaW9uVHlwZS5OT05FO1xuXHQgICAgcmV0dXJuIHRoaXMuX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkuY2F0Y2gocmVhc29uID0+IHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9hZCAke3RoaXMuaXNDb21wcmVzc2VkID8gXCJiaW5hcnkgXCIgOiBcIlwifUNNYXAgYXQ6ICR7dXJsfWApO1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIF9mZXRjaERhdGEodXJsLCBjb21wcmVzc2lvblR5cGUpIHtcblx0ICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYF9mZXRjaERhdGFgIGNhbGxlZC5cIik7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQmFzZUNNYXBSZWFkZXJGYWN0b3J5ID0gQmFzZUNNYXBSZWFkZXJGYWN0b3J5O1xuXHRjbGFzcyBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuXHQgIGNvbnN0cnVjdG9yKHtcblx0ICAgIGJhc2VVcmwgPSBudWxsXG5cdCAgfSkge1xuXHQgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSkge1xuXHQgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5LlwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG5cdCAgfVxuXHQgIGFzeW5jIGZldGNoKHtcblx0ICAgIGZpbGVuYW1lXG5cdCAgfSkge1xuXHQgICAgaWYgKCF0aGlzLmJhc2VVcmwpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3RhbmRhcmQgZm9udCBcImJhc2VVcmxcIiBwYXJhbWV0ZXIgbXVzdCBiZSBzcGVjaWZpZWQsIGVuc3VyZSB0aGF0ICcgKyAndGhlIFwic3RhbmRhcmRGb250RGF0YVVybFwiIEFQSSBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQuJyk7XG5cdCAgICB9XG5cdCAgICBpZiAoIWZpbGVuYW1lKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIkZvbnQgZmlsZW5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgdXJsID0gYCR7dGhpcy5iYXNlVXJsfSR7ZmlsZW5hbWV9YDtcblx0ICAgIHJldHVybiB0aGlzLl9mZXRjaERhdGEodXJsKS5jYXRjaChyZWFzb24gPT4ge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkIGZvbnQgZGF0YSBhdDogJHt1cmx9YCk7XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgX2ZldGNoRGF0YSh1cmwpIHtcblx0ICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYF9mZXRjaERhdGFgIGNhbGxlZC5cIik7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuXHRjbGFzcyBCYXNlU1ZHRmFjdG9yeSB7XG5cdCAgY29uc3RydWN0b3IoKSB7XG5cdCAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVNWR0ZhY3RvcnkpIHtcblx0ICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VTVkdGYWN0b3J5LlwiKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHNraXBEaW1lbnNpb25zID0gZmFsc2UpIHtcblx0ICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgU1ZHIGRpbWVuc2lvbnNcIik7XG5cdCAgICB9XG5cdCAgICBjb25zdCBzdmcgPSB0aGlzLl9jcmVhdGVTVkcoXCJzdmc6c3ZnXCIpO1xuXHQgICAgc3ZnLnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG5cdCAgICBpZiAoIXNraXBEaW1lbnNpb25zKSB7XG5cdCAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1weGApO1xuXHQgICAgICBzdmcuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1weGApO1xuXHQgICAgfVxuXHQgICAgc3ZnLnNldEF0dHJpYnV0ZShcInByZXNlcnZlQXNwZWN0UmF0aW9cIiwgXCJub25lXCIpO1xuXHQgICAgc3ZnLnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgYDAgMCAke3dpZHRofSAke2hlaWdodH1gKTtcblx0ICAgIHJldHVybiBzdmc7XG5cdCAgfVxuXHQgIGNyZWF0ZUVsZW1lbnQodHlwZSkge1xuXHQgICAgaWYgKHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgU1ZHIGVsZW1lbnQgdHlwZVwiKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLl9jcmVhdGVTVkcodHlwZSk7XG5cdCAgfVxuXHQgIF9jcmVhdGVTVkcodHlwZSkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2NyZWF0ZVNWR2AgY2FsbGVkLlwiKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5CYXNlU1ZHRmFjdG9yeSA9IEJhc2VTVkdGYWN0b3J5O1xuXG5cdC8qKiovIH0pLFxuXHQvKiA4ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5NdXJtdXJIYXNoM182NCA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0Y29uc3QgU0VFRCA9IDB4YzNkMmUxZjA7XG5cdGNvbnN0IE1BU0tfSElHSCA9IDB4ZmZmZjAwMDA7XG5cdGNvbnN0IE1BU0tfTE9XID0gMHhmZmZmO1xuXHRjbGFzcyBNdXJtdXJIYXNoM182NCB7XG5cdCAgY29uc3RydWN0b3Ioc2VlZCkge1xuXHQgICAgdGhpcy5oMSA9IHNlZWQgPyBzZWVkICYgMHhmZmZmZmZmZiA6IFNFRUQ7XG5cdCAgICB0aGlzLmgyID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDtcblx0ICB9XG5cdCAgdXBkYXRlKGlucHV0KSB7XG5cdCAgICBsZXQgZGF0YSwgbGVuZ3RoO1xuXHQgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuXHQgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoICogMik7XG5cdCAgICAgIGxlbmd0aCA9IDA7XG5cdCAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGlucHV0Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0ICAgICAgICBjb25zdCBjb2RlID0gaW5wdXQuY2hhckNvZGVBdChpKTtcblx0ICAgICAgICBpZiAoY29kZSA8PSAweGZmKSB7XG5cdCAgICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IGNvZGU7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSA+Pj4gODtcblx0ICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZSAmIDB4ZmY7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbC5pc0FycmF5QnVmZmVyKShpbnB1dCkpIHtcblx0ICAgICAgZGF0YSA9IGlucHV0LnNsaWNlKCk7XG5cdCAgICAgIGxlbmd0aCA9IGRhdGEuYnl0ZUxlbmd0aDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIldyb25nIGRhdGEgZm9ybWF0IGluIE11cm11ckhhc2gzXzY0X3VwZGF0ZS4gXCIgKyBcIklucHV0IG11c3QgYmUgYSBzdHJpbmcgb3IgYXJyYXkuXCIpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgYmxvY2tDb3VudHMgPSBsZW5ndGggPj4gMjtcblx0ICAgIGNvbnN0IHRhaWxMZW5ndGggPSBsZW5ndGggLSBibG9ja0NvdW50cyAqIDQ7XG5cdCAgICBjb25zdCBkYXRhVWludDMyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyLCAwLCBibG9ja0NvdW50cyk7XG5cdCAgICBsZXQgazEgPSAwLFxuXHQgICAgICBrMiA9IDA7XG5cdCAgICBsZXQgaDEgPSB0aGlzLmgxLFxuXHQgICAgICBoMiA9IHRoaXMuaDI7XG5cdCAgICBjb25zdCBDMSA9IDB4Y2M5ZTJkNTEsXG5cdCAgICAgIEMyID0gMHgxYjg3MzU5Mztcblx0ICAgIGNvbnN0IEMxX0xPVyA9IEMxICYgTUFTS19MT1csXG5cdCAgICAgIEMyX0xPVyA9IEMyICYgTUFTS19MT1c7XG5cdCAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2NrQ291bnRzOyBpKyspIHtcblx0ICAgICAgaWYgKGkgJiAxKSB7XG5cdCAgICAgICAgazEgPSBkYXRhVWludDMyW2ldO1xuXHQgICAgICAgIGsxID0gazEgKiBDMSAmIE1BU0tfSElHSCB8IGsxICogQzFfTE9XICYgTUFTS19MT1c7XG5cdCAgICAgICAgazEgPSBrMSA8PCAxNSB8IGsxID4+PiAxNztcblx0ICAgICAgICBrMSA9IGsxICogQzIgJiBNQVNLX0hJR0ggfCBrMSAqIEMyX0xPVyAmIE1BU0tfTE9XO1xuXHQgICAgICAgIGgxIF49IGsxO1xuXHQgICAgICAgIGgxID0gaDEgPDwgMTMgfCBoMSA+Pj4gMTk7XG5cdCAgICAgICAgaDEgPSBoMSAqIDUgKyAweGU2NTQ2YjY0O1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGsyID0gZGF0YVVpbnQzMltpXTtcblx0ICAgICAgICBrMiA9IGsyICogQzEgJiBNQVNLX0hJR0ggfCBrMiAqIEMxX0xPVyAmIE1BU0tfTE9XO1xuXHQgICAgICAgIGsyID0gazIgPDwgMTUgfCBrMiA+Pj4gMTc7XG5cdCAgICAgICAgazIgPSBrMiAqIEMyICYgTUFTS19ISUdIIHwgazIgKiBDMl9MT1cgJiBNQVNLX0xPVztcblx0ICAgICAgICBoMiBePSBrMjtcblx0ICAgICAgICBoMiA9IGgyIDw8IDEzIHwgaDIgPj4+IDE5O1xuXHQgICAgICAgIGgyID0gaDIgKiA1ICsgMHhlNjU0NmI2NDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgazEgPSAwO1xuXHQgICAgc3dpdGNoICh0YWlsTGVuZ3RoKSB7XG5cdCAgICAgIGNhc2UgMzpcblx0ICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDJdIDw8IDE2O1xuXHQgICAgICBjYXNlIDI6XG5cdCAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDQgKyAxXSA8PCA4O1xuXHQgICAgICBjYXNlIDE6XG5cdCAgICAgICAgazEgXj0gZGF0YVtibG9ja0NvdW50cyAqIDRdO1xuXHQgICAgICAgIGsxID0gazEgKiBDMSAmIE1BU0tfSElHSCB8IGsxICogQzFfTE9XICYgTUFTS19MT1c7XG5cdCAgICAgICAgazEgPSBrMSA8PCAxNSB8IGsxID4+PiAxNztcblx0ICAgICAgICBrMSA9IGsxICogQzIgJiBNQVNLX0hJR0ggfCBrMSAqIEMyX0xPVyAmIE1BU0tfTE9XO1xuXHQgICAgICAgIGlmIChibG9ja0NvdW50cyAmIDEpIHtcblx0ICAgICAgICAgIGgxIF49IGsxO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBoMiBePSBrMTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLmgxID0gaDE7XG5cdCAgICB0aGlzLmgyID0gaDI7XG5cdCAgfVxuXHQgIGhleGRpZ2VzdCgpIHtcblx0ICAgIGxldCBoMSA9IHRoaXMuaDEsXG5cdCAgICAgIGgyID0gdGhpcy5oMjtcblx0ICAgIGgxIF49IGgyID4+PiAxO1xuXHQgICAgaDEgPSBoMSAqIDB4ZWQ1NThjY2QgJiBNQVNLX0hJR0ggfCBoMSAqIDB4OGNjZCAmIE1BU0tfTE9XO1xuXHQgICAgaDIgPSBoMiAqIDB4ZmY1MWFmZDcgJiBNQVNLX0hJR0ggfCAoKGgyIDw8IDE2IHwgaDEgPj4+IDE2KSAqIDB4YWZkN2VkNTUgJiBNQVNLX0hJR0gpID4+PiAxNjtcblx0ICAgIGgxIF49IGgyID4+PiAxO1xuXHQgICAgaDEgPSBoMSAqIDB4MWE4NWVjNTMgJiBNQVNLX0hJR0ggfCBoMSAqIDB4ZWM1MyAmIE1BU0tfTE9XO1xuXHQgICAgaDIgPSBoMiAqIDB4YzRjZWI5ZmUgJiBNQVNLX0hJR0ggfCAoKGgyIDw8IDE2IHwgaDEgPj4+IDE2KSAqIDB4YjlmZTFhODUgJiBNQVNLX0hJR0gpID4+PiAxNjtcblx0ICAgIGgxIF49IGgyID4+PiAxO1xuXHQgICAgcmV0dXJuIChoMSA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsIFwiMFwiKSArIChoMiA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsIFwiMFwiKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5NdXJtdXJIYXNoM182NCA9IE11cm11ckhhc2gzXzY0O1xuXG5cdC8qKiovIH0pLFxuXHQvKiA5ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5Gb250TG9hZGVyID0gZXhwb3J0cy5Gb250RmFjZU9iamVjdCA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9pc19ub2RlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7XG5cdGNsYXNzIEZvbnRMb2FkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHtcblx0ICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50LFxuXHQgICAgc3R5bGVFbGVtZW50ID0gbnVsbFxuXHQgIH0pIHtcblx0ICAgIHRoaXMuX2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcblx0ICAgIHRoaXMubmF0aXZlRm9udEZhY2VzID0gW107XG5cdCAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7XG5cdCAgICB0aGlzLmxvYWRpbmdSZXF1ZXN0cyA9IFtdO1xuXHQgICAgdGhpcy5sb2FkVGVzdEZvbnRJZCA9IDA7XG5cdCAgfVxuXHQgIGFkZE5hdGl2ZUZvbnRGYWNlKG5hdGl2ZUZvbnRGYWNlKSB7XG5cdCAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5wdXNoKG5hdGl2ZUZvbnRGYWNlKTtcblx0ICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmFkZChuYXRpdmVGb250RmFjZSk7XG5cdCAgfVxuXHQgIGluc2VydFJ1bGUocnVsZSkge1xuXHQgICAgaWYgKCF0aGlzLnN0eWxlRWxlbWVudCkge1xuXHQgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0ICAgICAgdGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXS5hcHBlbmQodGhpcy5zdHlsZUVsZW1lbnQpO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgc3R5bGVTaGVldCA9IHRoaXMuc3R5bGVFbGVtZW50LnNoZWV0O1xuXHQgICAgc3R5bGVTaGVldC5pbnNlcnRSdWxlKHJ1bGUsIHN0eWxlU2hlZXQuY3NzUnVsZXMubGVuZ3RoKTtcblx0ICB9XG5cdCAgY2xlYXIoKSB7XG5cdCAgICBmb3IgKGNvbnN0IG5hdGl2ZUZvbnRGYWNlIG9mIHRoaXMubmF0aXZlRm9udEZhY2VzKSB7XG5cdCAgICAgIHRoaXMuX2RvY3VtZW50LmZvbnRzLmRlbGV0ZShuYXRpdmVGb250RmFjZSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLm5hdGl2ZUZvbnRGYWNlcy5sZW5ndGggPSAwO1xuXHQgICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG5cdCAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnJlbW92ZSgpO1xuXHQgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IG51bGw7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGFzeW5jIGJpbmQoZm9udCkge1xuXHQgICAgaWYgKGZvbnQuYXR0YWNoZWQgfHwgZm9udC5taXNzaW5nRmlsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBmb250LmF0dGFjaGVkID0gdHJ1ZTtcblx0ICAgIGlmICh0aGlzLmlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQpIHtcblx0ICAgICAgY29uc3QgbmF0aXZlRm9udEZhY2UgPSBmb250LmNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCk7XG5cdCAgICAgIGlmIChuYXRpdmVGb250RmFjZSkge1xuXHQgICAgICAgIHRoaXMuYWRkTmF0aXZlRm9udEZhY2UobmF0aXZlRm9udEZhY2UpO1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBhd2FpdCBuYXRpdmVGb250RmFjZS5sb2FkZWQ7XG5cdCAgICAgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgRmFpbGVkIHRvIGxvYWQgZm9udCAnJHtuYXRpdmVGb250RmFjZS5mYW1pbHl9JzogJyR7ZXh9Jy5gKTtcblx0ICAgICAgICAgIGZvbnQuZGlzYWJsZUZvbnRGYWNlID0gdHJ1ZTtcblx0ICAgICAgICAgIHRocm93IGV4O1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBydWxlID0gZm9udC5jcmVhdGVGb250RmFjZVJ1bGUoKTtcblx0ICAgIGlmIChydWxlKSB7XG5cdCAgICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlKTtcblx0ICAgICAgaWYgKHRoaXMuaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWQpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdCAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKHJlc29sdmUpO1xuXHQgICAgICAgIHRoaXMuX3ByZXBhcmVGb250TG9hZEV2ZW50KGZvbnQsIHJlcXVlc3QpO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0IGlzRm9udExvYWRpbmdBUElTdXBwb3J0ZWQoKSB7XG5cdCAgICBjb25zdCBoYXNGb250cyA9ICEhdGhpcy5fZG9jdW1lbnQ/LmZvbnRzO1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZFwiLCBoYXNGb250cyk7XG5cdCAgfVxuXHQgIGdldCBpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCgpIHtcblx0ICAgIGxldCBzdXBwb3J0ZWQgPSBmYWxzZTtcblx0ICAgIGlmIChfaXNfbm9kZS5pc05vZGVKUykge1xuXHQgICAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuXHQgICAgfSBlbHNlIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIC9Nb3ppbGxhXFwvNS4wLio/cnY6XFxkKy4qPyBHZWNrby8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSkge1xuXHQgICAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiaXNTeW5jRm9udExvYWRpbmdTdXBwb3J0ZWRcIiwgc3VwcG9ydGVkKTtcblx0ICB9XG5cdCAgX3F1ZXVlTG9hZGluZ0NhbGxiYWNrKGNhbGxiYWNrKSB7XG5cdCAgICBmdW5jdGlvbiBjb21wbGV0ZVJlcXVlc3QoKSB7XG5cdCAgICAgICgwLCBfdXRpbC5hc3NlcnQpKCFyZXF1ZXN0LmRvbmUsIFwiY29tcGxldGVSZXF1ZXN0KCkgY2Fubm90IGJlIGNhbGxlZCB0d2ljZS5cIik7XG5cdCAgICAgIHJlcXVlc3QuZG9uZSA9IHRydWU7XG5cdCAgICAgIHdoaWxlIChsb2FkaW5nUmVxdWVzdHMubGVuZ3RoID4gMCAmJiBsb2FkaW5nUmVxdWVzdHNbMF0uZG9uZSkge1xuXHQgICAgICAgIGNvbnN0IG90aGVyUmVxdWVzdCA9IGxvYWRpbmdSZXF1ZXN0cy5zaGlmdCgpO1xuXHQgICAgICAgIHNldFRpbWVvdXQob3RoZXJSZXF1ZXN0LmNhbGxiYWNrLCAwKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgY29uc3Qge1xuXHQgICAgICBsb2FkaW5nUmVxdWVzdHNcblx0ICAgIH0gPSB0aGlzO1xuXHQgICAgY29uc3QgcmVxdWVzdCA9IHtcblx0ICAgICAgZG9uZTogZmFsc2UsXG5cdCAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZVJlcXVlc3QsXG5cdCAgICAgIGNhbGxiYWNrXG5cdCAgICB9O1xuXHQgICAgbG9hZGluZ1JlcXVlc3RzLnB1c2gocmVxdWVzdCk7XG5cdCAgICByZXR1cm4gcmVxdWVzdDtcblx0ICB9XG5cdCAgZ2V0IF9sb2FkVGVzdEZvbnQoKSB7XG5cdCAgICBjb25zdCB0ZXN0Rm9udCA9IGF0b2IoXCJUMVJVVHdBTEFJQUFBd0F3UTBaR0lESHRaZzRBQUFPWUFBQUFnVVpHVkUxbGt6WndBQUFFSEFBQUFCeEhSRVZHQUJRQVwiICsgXCJGUUFBQkRnQUFBQWVUMU12TWxZTll3a0FBQUVnQUFBQVlHTnRZWEFCRFFMVUFBQUNOQUFBQVVKb1pXRmsveFZGRFFBQVwiICsgXCJBTHdBQUFBMmFHaGxZUWRrQStvQUFBRDBBQUFBSkdodGRIZ0Q2QUFBQUFBRVdBQUFBQVp0WVhod0FBSlFBQUFBQVJnQVwiICsgXCJBQUFHYm1GdFpWam1kSDRBQUFHQUFBQUFzWEJ2YzNUL2hnQXpBQUFEZUFBQUFDQUFBUUFBQUFFQUFMWlJGc1JmRHp6MVwiICsgXCJBQXNENkFBQUFBRE9CT1RMQUFBQUFNNEtIRHdBQUFBQUErZ0RJUUFBQUFnQUFnQUFBQUFBQUFBQkFBQURJUUFBQUZvRFwiICsgXCI2QUFBQUFBRDZBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFVQUFBQWdBQUFBUUQ2QUgwQUFVQUFBS0tBcndBQUFDTVwiICsgXCJBb29DdkFBQUFlQUFNUUVDQUFBQ0FBWUpBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUZCbVJXUUF3QUF1QUM0RFwiICsgXCJJUDg0QUZvRElRQUFBQUFBQVFBQUFBQUFBQUFBQUNBQUlBQUJBQUFBRGdDdUFBRUFBQUFBQUFBQUFRQUFBQUVBQUFBQVwiICsgXCJBQUVBQVFBQUFBRUFBQUFBQUFJQUFRQUFBQUVBQUFBQUFBTUFBUUFBQUFFQUFBQUFBQVFBQVFBQUFBRUFBQUFBQUFVQVwiICsgXCJBUUFBQUFFQUFBQUFBQVlBQVFBQUFBTUFBUVFKQUFBQUFnQUJBQU1BQVFRSkFBRUFBZ0FCQUFNQUFRUUpBQUlBQWdBQlwiICsgXCJBQU1BQVFRSkFBTUFBZ0FCQUFNQUFRUUpBQVFBQWdBQkFBTUFBUVFKQUFVQUFnQUJBQU1BQVFRSkFBWUFBZ0FCV0FCWVwiICsgXCJBQUFBQUFBQUF3QUFBQU1BQUFBY0FBRUFBQUFBQUR3QUF3QUJBQUFBSEFBRUFDQUFBQUFFQUFRQUFRQUFBQzcvL3dBQVwiICsgXCJBQzcvLy8vVEFBRUFBQUFBQUFBQkJnQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNQUFBQUFBQUQvZ3dBeUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQVwiICsgXCJBQUFCQUFRRUFBRUJBUUpZQUFFQkFTSDREd0Q0R3dIRUF2Z2NBL2dYQkl3TUFZdUwrbno1dFFYa0Q1ajNDQkxuRVFBQ1wiICsgXCJBUUVCSVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlBQUFCQVFBQUR3QUNBUUVFRS90M1wiICsgXCJEb3Y2ZkFINmZBVCtmUHA4K253SERvc01Ddm0xQ3ZtMURBejZmQlFBQUFBQUFBQUJBQUFBQU1tSmJ6RUFBQUFBemdUalwiICsgXCJGUUFBQUFET0JPUXBBQUVBQUFBQUFBQUFEQUFVQUFRQUFBQUJBQUFBQWdBQkFBQUFBQUFBQUFBRDZBQUFBQUFBQUE9PVwiKTtcblx0ICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCBcIl9sb2FkVGVzdEZvbnRcIiwgdGVzdEZvbnQpO1xuXHQgIH1cblx0ICBfcHJlcGFyZUZvbnRMb2FkRXZlbnQoZm9udCwgcmVxdWVzdCkge1xuXHQgICAgZnVuY3Rpb24gaW50MzIoZGF0YSwgb2Zmc2V0KSB7XG5cdCAgICAgIHJldHVybiBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0KSA8PCAyNCB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAxKSA8PCAxNiB8IGRhdGEuY2hhckNvZGVBdChvZmZzZXQgKyAyKSA8PCA4IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDMpICYgMHhmZjtcblx0ICAgIH1cblx0ICAgIGZ1bmN0aW9uIHNwbGljZVN0cmluZyhzLCBvZmZzZXQsIHJlbW92ZSwgaW5zZXJ0KSB7XG5cdCAgICAgIGNvbnN0IGNodW5rMSA9IHMuc3Vic3RyaW5nKDAsIG9mZnNldCk7XG5cdCAgICAgIGNvbnN0IGNodW5rMiA9IHMuc3Vic3RyaW5nKG9mZnNldCArIHJlbW92ZSk7XG5cdCAgICAgIHJldHVybiBjaHVuazEgKyBpbnNlcnQgKyBjaHVuazI7XG5cdCAgICB9XG5cdCAgICBsZXQgaSwgaWk7XG5cdCAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuXHQgICAgY2FudmFzLndpZHRoID0gMTtcblx0ICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuXHQgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblx0ICAgIGxldCBjYWxsZWQgPSAwO1xuXHQgICAgZnVuY3Rpb24gaXNGb250UmVhZHkobmFtZSwgY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKCsrY2FsbGVkID4gMzApIHtcblx0ICAgICAgICAoMCwgX3V0aWwud2FybikoXCJMb2FkIHRlc3QgZm9udCBuZXZlciBsb2FkZWQuXCIpO1xuXHQgICAgICAgIGNhbGxiYWNrKCk7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGN0eC5mb250ID0gXCIzMHB4IFwiICsgbmFtZTtcblx0ICAgICAgY3R4LmZpbGxUZXh0KFwiLlwiLCAwLCAyMCk7XG5cdCAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSk7XG5cdCAgICAgIGlmIChpbWFnZURhdGEuZGF0YVszXSA+IDApIHtcblx0ICAgICAgICBjYWxsYmFjaygpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBzZXRUaW1lb3V0KGlzRm9udFJlYWR5LmJpbmQobnVsbCwgbmFtZSwgY2FsbGJhY2spKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGxvYWRUZXN0Rm9udElkID0gYGx0JHtEYXRlLm5vdygpfSR7dGhpcy5sb2FkVGVzdEZvbnRJZCsrfWA7XG5cdCAgICBsZXQgZGF0YSA9IHRoaXMuX2xvYWRUZXN0Rm9udDtcblx0ICAgIGNvbnN0IENPTU1FTlRfT0ZGU0VUID0gOTc2O1xuXHQgICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDT01NRU5UX09GRlNFVCwgbG9hZFRlc3RGb250SWQubGVuZ3RoLCBsb2FkVGVzdEZvbnRJZCk7XG5cdCAgICBjb25zdCBDRkZfQ0hFQ0tTVU1fT0ZGU0VUID0gMTY7XG5cdCAgICBjb25zdCBYWFhYX1ZBTFVFID0gMHg1ODU4NTg1ODtcblx0ICAgIGxldCBjaGVja3N1bSA9IGludDMyKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQpO1xuXHQgICAgZm9yIChpID0gMCwgaWkgPSBsb2FkVGVzdEZvbnRJZC5sZW5ndGggLSAzOyBpIDwgaWk7IGkgKz0gNCkge1xuXHQgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtIC0gWFhYWF9WQUxVRSArIGludDMyKGxvYWRUZXN0Rm9udElkLCBpKSB8IDA7XG5cdCAgICB9XG5cdCAgICBpZiAoaSA8IGxvYWRUZXN0Rm9udElkLmxlbmd0aCkge1xuXHQgICAgICBjaGVja3N1bSA9IGNoZWNrc3VtIC0gWFhYWF9WQUxVRSArIGludDMyKGxvYWRUZXN0Rm9udElkICsgXCJYWFhcIiwgaSkgfCAwO1xuXHQgICAgfVxuXHQgICAgZGF0YSA9IHNwbGljZVN0cmluZyhkYXRhLCBDRkZfQ0hFQ0tTVU1fT0ZGU0VULCA0LCAoMCwgX3V0aWwuc3RyaW5nMzIpKGNoZWNrc3VtKSk7XG5cdCAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6Zm9udC9vcGVudHlwZTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDtcblx0ICAgIGNvbnN0IHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke2xvYWRUZXN0Rm9udElkfVwiO3NyYzoke3VybH19YDtcblx0ICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlKTtcblx0ICAgIGNvbnN0IGRpdiA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdCAgICBkaXYuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG5cdCAgICBkaXYuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUuaGVpZ2h0ID0gXCIxMHB4XCI7XG5cdCAgICBkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdCAgICBkaXYuc3R5bGUudG9wID0gZGl2LnN0eWxlLmxlZnQgPSBcIjBweFwiO1xuXHQgICAgZm9yIChjb25zdCBuYW1lIG9mIFtmb250LmxvYWRlZE5hbWUsIGxvYWRUZXN0Rm9udElkXSkge1xuXHQgICAgICBjb25zdCBzcGFuID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdCAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBcIkhpXCI7XG5cdCAgICAgIHNwYW4uc3R5bGUuZm9udEZhbWlseSA9IG5hbWU7XG5cdCAgICAgIGRpdi5hcHBlbmQoc3Bhbik7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZChkaXYpO1xuXHQgICAgaXNGb250UmVhZHkobG9hZFRlc3RGb250SWQsICgpID0+IHtcblx0ICAgICAgZGl2LnJlbW92ZSgpO1xuXHQgICAgICByZXF1ZXN0LmNvbXBsZXRlKCk7XG5cdCAgICB9KTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5Gb250TG9hZGVyID0gRm9udExvYWRlcjtcblx0Y2xhc3MgRm9udEZhY2VPYmplY3Qge1xuXHQgIGNvbnN0cnVjdG9yKHRyYW5zbGF0ZWREYXRhLCB7XG5cdCAgICBpc0V2YWxTdXBwb3J0ZWQgPSB0cnVlLFxuXHQgICAgZGlzYWJsZUZvbnRGYWNlID0gZmFsc2UsXG5cdCAgICBpZ25vcmVFcnJvcnMgPSBmYWxzZSxcblx0ICAgIGluc3BlY3RGb250ID0gbnVsbFxuXHQgIH0pIHtcblx0ICAgIHRoaXMuY29tcGlsZWRHbHlwaHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgICAgZm9yIChjb25zdCBpIGluIHRyYW5zbGF0ZWREYXRhKSB7XG5cdCAgICAgIHRoaXNbaV0gPSB0cmFuc2xhdGVkRGF0YVtpXTtcblx0ICAgIH1cblx0ICAgIHRoaXMuaXNFdmFsU3VwcG9ydGVkID0gaXNFdmFsU3VwcG9ydGVkICE9PSBmYWxzZTtcblx0ICAgIHRoaXMuZGlzYWJsZUZvbnRGYWNlID0gZGlzYWJsZUZvbnRGYWNlID09PSB0cnVlO1xuXHQgICAgdGhpcy5pZ25vcmVFcnJvcnMgPSBpZ25vcmVFcnJvcnMgPT09IHRydWU7XG5cdCAgICB0aGlzLl9pbnNwZWN0Rm9udCA9IGluc3BlY3RGb250O1xuXHQgIH1cblx0ICBjcmVhdGVOYXRpdmVGb250RmFjZSgpIHtcblx0ICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgbGV0IG5hdGl2ZUZvbnRGYWNlO1xuXHQgICAgaWYgKCF0aGlzLmNzc0ZvbnRJbmZvKSB7XG5cdCAgICAgIG5hdGl2ZUZvbnRGYWNlID0gbmV3IEZvbnRGYWNlKHRoaXMubG9hZGVkTmFtZSwgdGhpcy5kYXRhLCB7fSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjb25zdCBjc3MgPSB7XG5cdCAgICAgICAgd2VpZ2h0OiB0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHRcblx0ICAgICAgfTtcblx0ICAgICAgaWYgKHRoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUpIHtcblx0ICAgICAgICBjc3Muc3R5bGUgPSBgb2JsaXF1ZSAke3RoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGV9ZGVnYDtcblx0ICAgICAgfVxuXHQgICAgICBuYXRpdmVGb250RmFjZSA9IG5ldyBGb250RmFjZSh0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHksIHRoaXMuZGF0YSwgY3NzKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2luc3BlY3RGb250Py4odGhpcyk7XG5cdCAgICByZXR1cm4gbmF0aXZlRm9udEZhY2U7XG5cdCAgfVxuXHQgIGNyZWF0ZUZvbnRGYWNlUnVsZSgpIHtcblx0ICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGlzYWJsZUZvbnRGYWNlKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgZGF0YSA9ICgwLCBfdXRpbC5ieXRlc1RvU3RyaW5nKSh0aGlzLmRhdGEpO1xuXHQgICAgY29uc3QgdXJsID0gYHVybChkYXRhOiR7dGhpcy5taW1ldHlwZX07YmFzZTY0LCR7YnRvYShkYXRhKX0pO2A7XG5cdCAgICBsZXQgcnVsZTtcblx0ICAgIGlmICghdGhpcy5jc3NGb250SW5mbykge1xuXHQgICAgICBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OlwiJHt0aGlzLmxvYWRlZE5hbWV9XCI7c3JjOiR7dXJsfX1gO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgbGV0IGNzcyA9IGBmb250LXdlaWdodDogJHt0aGlzLmNzc0ZvbnRJbmZvLmZvbnRXZWlnaHR9O2A7XG5cdCAgICAgIGlmICh0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlKSB7XG5cdCAgICAgICAgY3NzICs9IGBmb250LXN0eWxlOiBvYmxpcXVlICR7dGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZX1kZWc7YDtcblx0ICAgICAgfVxuXHQgICAgICBydWxlID0gYEBmb250LWZhY2Uge2ZvbnQtZmFtaWx5OlwiJHt0aGlzLmNzc0ZvbnRJbmZvLmZvbnRGYW1pbHl9XCI7JHtjc3N9c3JjOiR7dXJsfX1gO1xuXHQgICAgfVxuXHQgICAgdGhpcy5faW5zcGVjdEZvbnQ/Lih0aGlzLCB1cmwpO1xuXHQgICAgcmV0dXJuIHJ1bGU7XG5cdCAgfVxuXHQgIGdldFBhdGhHZW5lcmF0b3Iob2JqcywgY2hhcmFjdGVyKSB7XG5cdCAgICBpZiAodGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRHbHlwaHNbY2hhcmFjdGVyXTtcblx0ICAgIH1cblx0ICAgIGxldCBjbWRzO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgY21kcyA9IG9ianMuZ2V0KHRoaXMubG9hZGVkTmFtZSArIFwiX3BhdGhfXCIgKyBjaGFyYWN0ZXIpO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgaWYgKCF0aGlzLmlnbm9yZUVycm9ycykge1xuXHQgICAgICAgIHRocm93IGV4O1xuXHQgICAgICB9XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShgZ2V0UGF0aEdlbmVyYXRvciAtIGlnbm9yaW5nIGNoYXJhY3RlcjogXCIke2V4fVwiLmApO1xuXHQgICAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gZnVuY3Rpb24gKGMsIHNpemUpIHt9O1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuaXNFdmFsU3VwcG9ydGVkICYmIF91dGlsLkZlYXR1cmVUZXN0LmlzRXZhbFN1cHBvcnRlZCkge1xuXHQgICAgICBjb25zdCBqc0J1ZiA9IFtdO1xuXHQgICAgICBmb3IgKGNvbnN0IGN1cnJlbnQgb2YgY21kcykge1xuXHQgICAgICAgIGNvbnN0IGFyZ3MgPSBjdXJyZW50LmFyZ3MgIT09IHVuZGVmaW5lZCA/IGN1cnJlbnQuYXJncy5qb2luKFwiLFwiKSA6IFwiXCI7XG5cdCAgICAgICAganNCdWYucHVzaChcImMuXCIsIGN1cnJlbnQuY21kLCBcIihcIiwgYXJncywgXCIpO1xcblwiKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gbmV3IEZ1bmN0aW9uKFwiY1wiLCBcInNpemVcIiwganNCdWYuam9pbihcIlwiKSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdID0gZnVuY3Rpb24gKGMsIHNpemUpIHtcblx0ICAgICAgZm9yIChjb25zdCBjdXJyZW50IG9mIGNtZHMpIHtcblx0ICAgICAgICBpZiAoY3VycmVudC5jbWQgPT09IFwic2NhbGVcIikge1xuXHQgICAgICAgICAgY3VycmVudC5hcmdzID0gW3NpemUsIC1zaXplXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY1tjdXJyZW50LmNtZF0uYXBwbHkoYywgY3VycmVudC5hcmdzKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5Gb250RmFjZU9iamVjdCA9IEZvbnRGYWNlT2JqZWN0O1xuXG5cdC8qKiovIH0pLFxuXHQvKiAxMCAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuaXNOb2RlSlMgPSB2b2lkIDA7XG5cdGNvbnN0IGlzTm9kZUpTID0gdHlwZW9mIGJyb3dzZXIkMSA9PT0gXCJvYmplY3RcIiAmJiBicm93c2VyJDEgKyBcIlwiID09PSBcIltvYmplY3QgcHJvY2Vzc11cIiAmJiAhYnJvd3NlciQxLnZlcnNpb25zLm53ICYmICEoYnJvd3NlciQxLnZlcnNpb25zLmVsZWN0cm9uICYmIGJyb3dzZXIkMS50eXBlICYmIGJyb3dzZXIkMS50eXBlICE9PSBcImJyb3dzZXJcIik7XG5cdGV4cG9ydHMuaXNOb2RlSlMgPSBpc05vZGVKUztcblxuXHQvKioqLyB9KSxcblx0LyogMTEgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLkNhbnZhc0dyYXBoaWNzID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHR2YXIgX3BhdHRlcm5faGVscGVyID0gX193X3BkZmpzX3JlcXVpcmVfXygxMik7XG5cdHZhciBfaW1hZ2VfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEzKTtcblx0dmFyIF9pc19ub2RlID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7XG5cdGNvbnN0IE1JTl9GT05UX1NJWkUgPSAxNjtcblx0Y29uc3QgTUFYX0ZPTlRfU0laRSA9IDEwMDtcblx0Y29uc3QgTUFYX0dST1VQX1NJWkUgPSA0MDk2O1xuXHRjb25zdCBFWEVDVVRJT05fVElNRSA9IDE1O1xuXHRjb25zdCBFWEVDVVRJT05fU1RFUFMgPSAxMDtcblx0Y29uc3QgTUFYX1NJWkVfVE9fQ09NUElMRSA9IDEwMDA7XG5cdGNvbnN0IEZVTExfQ0hVTktfSEVJR0hUID0gMTY7XG5cdGZ1bmN0aW9uIG1pcnJvckNvbnRleHRPcGVyYXRpb25zKGN0eCwgZGVzdEN0eCkge1xuXHQgIGlmIChjdHguX3JlbW92ZU1pcnJvcmluZykge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBpcyBhbHJlYWR5IGZvcndhcmRpbmcgb3BlcmF0aW9ucy5cIik7XG5cdCAgfVxuXHQgIGN0eC5fX29yaWdpbmFsU2F2ZSA9IGN0eC5zYXZlO1xuXHQgIGN0eC5fX29yaWdpbmFsUmVzdG9yZSA9IGN0eC5yZXN0b3JlO1xuXHQgIGN0eC5fX29yaWdpbmFsUm90YXRlID0gY3R4LnJvdGF0ZTtcblx0ICBjdHguX19vcmlnaW5hbFNjYWxlID0gY3R4LnNjYWxlO1xuXHQgIGN0eC5fX29yaWdpbmFsVHJhbnNsYXRlID0gY3R4LnRyYW5zbGF0ZTtcblx0ICBjdHguX19vcmlnaW5hbFRyYW5zZm9ybSA9IGN0eC50cmFuc2Zvcm07XG5cdCAgY3R4Ll9fb3JpZ2luYWxTZXRUcmFuc2Zvcm0gPSBjdHguc2V0VHJhbnNmb3JtO1xuXHQgIGN0eC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm0gPSBjdHgucmVzZXRUcmFuc2Zvcm07XG5cdCAgY3R4Ll9fb3JpZ2luYWxDbGlwID0gY3R4LmNsaXA7XG5cdCAgY3R4Ll9fb3JpZ2luYWxNb3ZlVG8gPSBjdHgubW92ZVRvO1xuXHQgIGN0eC5fX29yaWdpbmFsTGluZVRvID0gY3R4LmxpbmVUbztcblx0ICBjdHguX19vcmlnaW5hbEJlemllckN1cnZlVG8gPSBjdHguYmV6aWVyQ3VydmVUbztcblx0ICBjdHguX19vcmlnaW5hbFJlY3QgPSBjdHgucmVjdDtcblx0ICBjdHguX19vcmlnaW5hbENsb3NlUGF0aCA9IGN0eC5jbG9zZVBhdGg7XG5cdCAgY3R4Ll9fb3JpZ2luYWxCZWdpblBhdGggPSBjdHguYmVnaW5QYXRoO1xuXHQgIGN0eC5fcmVtb3ZlTWlycm9yaW5nID0gKCkgPT4ge1xuXHQgICAgY3R4LnNhdmUgPSBjdHguX19vcmlnaW5hbFNhdmU7XG5cdCAgICBjdHgucmVzdG9yZSA9IGN0eC5fX29yaWdpbmFsUmVzdG9yZTtcblx0ICAgIGN0eC5yb3RhdGUgPSBjdHguX19vcmlnaW5hbFJvdGF0ZTtcblx0ICAgIGN0eC5zY2FsZSA9IGN0eC5fX29yaWdpbmFsU2NhbGU7XG5cdCAgICBjdHgudHJhbnNsYXRlID0gY3R4Ll9fb3JpZ2luYWxUcmFuc2xhdGU7XG5cdCAgICBjdHgudHJhbnNmb3JtID0gY3R4Ll9fb3JpZ2luYWxUcmFuc2Zvcm07XG5cdCAgICBjdHguc2V0VHJhbnNmb3JtID0gY3R4Ll9fb3JpZ2luYWxTZXRUcmFuc2Zvcm07XG5cdCAgICBjdHgucmVzZXRUcmFuc2Zvcm0gPSBjdHguX19vcmlnaW5hbFJlc2V0VHJhbnNmb3JtO1xuXHQgICAgY3R4LmNsaXAgPSBjdHguX19vcmlnaW5hbENsaXA7XG5cdCAgICBjdHgubW92ZVRvID0gY3R4Ll9fb3JpZ2luYWxNb3ZlVG87XG5cdCAgICBjdHgubGluZVRvID0gY3R4Ll9fb3JpZ2luYWxMaW5lVG87XG5cdCAgICBjdHguYmV6aWVyQ3VydmVUbyA9IGN0eC5fX29yaWdpbmFsQmV6aWVyQ3VydmVUbztcblx0ICAgIGN0eC5yZWN0ID0gY3R4Ll9fb3JpZ2luYWxSZWN0O1xuXHQgICAgY3R4LmNsb3NlUGF0aCA9IGN0eC5fX29yaWdpbmFsQ2xvc2VQYXRoO1xuXHQgICAgY3R4LmJlZ2luUGF0aCA9IGN0eC5fX29yaWdpbmFsQmVnaW5QYXRoO1xuXHQgICAgZGVsZXRlIGN0eC5fcmVtb3ZlTWlycm9yaW5nO1xuXHQgIH07XG5cdCAgY3R4LnNhdmUgPSBmdW5jdGlvbiBjdHhTYXZlKCkge1xuXHQgICAgZGVzdEN0eC5zYXZlKCk7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxTYXZlKCk7XG5cdCAgfTtcblx0ICBjdHgucmVzdG9yZSA9IGZ1bmN0aW9uIGN0eFJlc3RvcmUoKSB7XG5cdCAgICBkZXN0Q3R4LnJlc3RvcmUoKTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbFJlc3RvcmUoKTtcblx0ICB9O1xuXHQgIGN0eC50cmFuc2xhdGUgPSBmdW5jdGlvbiBjdHhUcmFuc2xhdGUoeCwgeSkge1xuXHQgICAgZGVzdEN0eC50cmFuc2xhdGUoeCwgeSk7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2xhdGUoeCwgeSk7XG5cdCAgfTtcblx0ICBjdHguc2NhbGUgPSBmdW5jdGlvbiBjdHhTY2FsZSh4LCB5KSB7XG5cdCAgICBkZXN0Q3R4LnNjYWxlKHgsIHkpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsU2NhbGUoeCwgeSk7XG5cdCAgfTtcblx0ICBjdHgudHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcblx0ICAgIGRlc3RDdHgudHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsVHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuXHQgIH07XG5cdCAgY3R4LnNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7XG5cdCAgICBkZXN0Q3R4LnNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbFNldFRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcblx0ICB9O1xuXHQgIGN0eC5yZXNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uIGN0eFJlc2V0VHJhbnNmb3JtKCkge1xuXHQgICAgZGVzdEN0eC5yZXNldFRyYW5zZm9ybSgpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm0oKTtcblx0ICB9O1xuXHQgIGN0eC5yb3RhdGUgPSBmdW5jdGlvbiBjdHhSb3RhdGUoYW5nbGUpIHtcblx0ICAgIGRlc3RDdHgucm90YXRlKGFuZ2xlKTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbFJvdGF0ZShhbmdsZSk7XG5cdCAgfTtcblx0ICBjdHguY2xpcCA9IGZ1bmN0aW9uIGN0eFJvdGF0ZShydWxlKSB7XG5cdCAgICBkZXN0Q3R4LmNsaXAocnVsZSk7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxDbGlwKHJ1bGUpO1xuXHQgIH07XG5cdCAgY3R4Lm1vdmVUbyA9IGZ1bmN0aW9uICh4LCB5KSB7XG5cdCAgICBkZXN0Q3R4Lm1vdmVUbyh4LCB5KTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbE1vdmVUbyh4LCB5KTtcblx0ICB9O1xuXHQgIGN0eC5saW5lVG8gPSBmdW5jdGlvbiAoeCwgeSkge1xuXHQgICAgZGVzdEN0eC5saW5lVG8oeCwgeSk7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxMaW5lVG8oeCwgeSk7XG5cdCAgfTtcblx0ICBjdHguYmV6aWVyQ3VydmVUbyA9IGZ1bmN0aW9uIChjcDF4LCBjcDF5LCBjcDJ4LCBjcDJ5LCB4LCB5KSB7XG5cdCAgICBkZXN0Q3R4LmJlemllckN1cnZlVG8oY3AxeCwgY3AxeSwgY3AyeCwgY3AyeSwgeCwgeSk7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvKGNwMXgsIGNwMXksIGNwMngsIGNwMnksIHgsIHkpO1xuXHQgIH07XG5cdCAgY3R4LnJlY3QgPSBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuXHQgICAgZGVzdEN0eC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcblx0ICB9O1xuXHQgIGN0eC5jbG9zZVBhdGggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBkZXN0Q3R4LmNsb3NlUGF0aCgpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsQ2xvc2VQYXRoKCk7XG5cdCAgfTtcblx0ICBjdHguYmVnaW5QYXRoID0gZnVuY3Rpb24gKCkge1xuXHQgICAgZGVzdEN0eC5iZWdpblBhdGgoKTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbEJlZ2luUGF0aCgpO1xuXHQgIH07XG5cdH1cblx0Y2xhc3MgQ2FjaGVkQ2FudmFzZXMge1xuXHQgIGNvbnN0cnVjdG9yKGNhbnZhc0ZhY3RvcnkpIHtcblx0ICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG5cdCAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICB9XG5cdCAgZ2V0Q2FudmFzKGlkLCB3aWR0aCwgaGVpZ2h0KSB7XG5cdCAgICBsZXQgY2FudmFzRW50cnk7XG5cdCAgICBpZiAodGhpcy5jYWNoZVtpZF0gIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdO1xuXHQgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkucmVzZXQoY2FudmFzRW50cnksIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY2FudmFzRW50cnkgPSB0aGlzLmNhbnZhc0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgICB0aGlzLmNhY2hlW2lkXSA9IGNhbnZhc0VudHJ5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGNhbnZhc0VudHJ5O1xuXHQgIH1cblx0ICBkZWxldGUoaWQpIHtcblx0ICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcblx0ICB9XG5cdCAgY2xlYXIoKSB7XG5cdCAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuY2FjaGUpIHtcblx0ICAgICAgY29uc3QgY2FudmFzRW50cnkgPSB0aGlzLmNhY2hlW2lkXTtcblx0ICAgICAgdGhpcy5jYW52YXNGYWN0b3J5LmRlc3Ryb3koY2FudmFzRW50cnkpO1xuXHQgICAgICBkZWxldGUgdGhpcy5jYWNoZVtpZF07XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgZGVzdFgsIGRlc3RZLCBkZXN0VywgZGVzdEgpIHtcblx0ICBjb25zdCBbYSwgYiwgYywgZCwgdHgsIHR5XSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpO1xuXHQgIGlmIChiID09PSAwICYmIGMgPT09IDApIHtcblx0ICAgIGNvbnN0IHRsWCA9IGRlc3RYICogYSArIHR4O1xuXHQgICAgY29uc3QgclRsWCA9IE1hdGgucm91bmQodGxYKTtcblx0ICAgIGNvbnN0IHRsWSA9IGRlc3RZICogZCArIHR5O1xuXHQgICAgY29uc3QgclRsWSA9IE1hdGgucm91bmQodGxZKTtcblx0ICAgIGNvbnN0IGJyWCA9IChkZXN0WCArIGRlc3RXKSAqIGEgKyB0eDtcblx0ICAgIGNvbnN0IHJXaWR0aCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJYKSAtIHJUbFgpIHx8IDE7XG5cdCAgICBjb25zdCBiclkgPSAoZGVzdFkgKyBkZXN0SCkgKiBkICsgdHk7XG5cdCAgICBjb25zdCBySGVpZ2h0ID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclkpIC0gclRsWSkgfHwgMTtcblx0ICAgIGN0eC5zZXRUcmFuc2Zvcm0oTWF0aC5zaWduKGEpLCAwLCAwLCBNYXRoLnNpZ24oZCksIHJUbFgsIHJUbFkpO1xuXHQgICAgY3R4LmRyYXdJbWFnZShzcmNJbWcsIHNyY1gsIHNyY1ksIHNyY1csIHNyY0gsIDAsIDAsIHJXaWR0aCwgckhlaWdodCk7XG5cdCAgICBjdHguc2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIHR4LCB0eSk7XG5cdCAgICByZXR1cm4gW3JXaWR0aCwgckhlaWdodF07XG5cdCAgfVxuXHQgIGlmIChhID09PSAwICYmIGQgPT09IDApIHtcblx0ICAgIGNvbnN0IHRsWCA9IGRlc3RZICogYyArIHR4O1xuXHQgICAgY29uc3QgclRsWCA9IE1hdGgucm91bmQodGxYKTtcblx0ICAgIGNvbnN0IHRsWSA9IGRlc3RYICogYiArIHR5O1xuXHQgICAgY29uc3QgclRsWSA9IE1hdGgucm91bmQodGxZKTtcblx0ICAgIGNvbnN0IGJyWCA9IChkZXN0WSArIGRlc3RIKSAqIGMgKyB0eDtcblx0ICAgIGNvbnN0IHJXaWR0aCA9IE1hdGguYWJzKE1hdGgucm91bmQoYnJYKSAtIHJUbFgpIHx8IDE7XG5cdCAgICBjb25zdCBiclkgPSAoZGVzdFggKyBkZXN0VykgKiBiICsgdHk7XG5cdCAgICBjb25zdCBySGVpZ2h0ID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclkpIC0gclRsWSkgfHwgMTtcblx0ICAgIGN0eC5zZXRUcmFuc2Zvcm0oMCwgTWF0aC5zaWduKGIpLCBNYXRoLnNpZ24oYyksIDAsIHJUbFgsIHJUbFkpO1xuXHQgICAgY3R4LmRyYXdJbWFnZShzcmNJbWcsIHNyY1gsIHNyY1ksIHNyY1csIHNyY0gsIDAsIDAsIHJIZWlnaHQsIHJXaWR0aCk7XG5cdCAgICBjdHguc2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIHR4LCB0eSk7XG5cdCAgICByZXR1cm4gW3JIZWlnaHQsIHJXaWR0aF07XG5cdCAgfVxuXHQgIGN0eC5kcmF3SW1hZ2Uoc3JjSW1nLCBzcmNYLCBzcmNZLCBzcmNXLCBzcmNILCBkZXN0WCwgZGVzdFksIGRlc3RXLCBkZXN0SCk7XG5cdCAgY29uc3Qgc2NhbGVYID0gTWF0aC5oeXBvdChhLCBiKTtcblx0ICBjb25zdCBzY2FsZVkgPSBNYXRoLmh5cG90KGMsIGQpO1xuXHQgIHJldHVybiBbc2NhbGVYICogZGVzdFcsIHNjYWxlWSAqIGRlc3RIXTtcblx0fVxuXHRmdW5jdGlvbiBjb21waWxlVHlwZTNHbHlwaChpbWdEYXRhKSB7XG5cdCAgY29uc3Qge1xuXHQgICAgd2lkdGgsXG5cdCAgICBoZWlnaHRcblx0ICB9ID0gaW1nRGF0YTtcblx0ICBpZiAod2lkdGggPiBNQVhfU0laRV9UT19DT01QSUxFIHx8IGhlaWdodCA+IE1BWF9TSVpFX1RPX0NPTVBJTEUpIHtcblx0ICAgIHJldHVybiBudWxsO1xuXHQgIH1cblx0ICBjb25zdCBQT0lOVF9UT19QUk9DRVNTX0xJTUlUID0gMTAwMDtcblx0ICBjb25zdCBQT0lOVF9UWVBFUyA9IG5ldyBVaW50OEFycmF5KFswLCAyLCA0LCAwLCAxLCAwLCA1LCA0LCA4LCAxMCwgMCwgOCwgMCwgMiwgMSwgMF0pO1xuXHQgIGNvbnN0IHdpZHRoMSA9IHdpZHRoICsgMTtcblx0ICBsZXQgcG9pbnRzID0gbmV3IFVpbnQ4QXJyYXkod2lkdGgxICogKGhlaWdodCArIDEpKTtcblx0ICBsZXQgaSwgaiwgajA7XG5cdCAgY29uc3QgbGluZVNpemUgPSB3aWR0aCArIDcgJiB+Nztcblx0ICBsZXQgZGF0YSA9IG5ldyBVaW50OEFycmF5KGxpbmVTaXplICogaGVpZ2h0KSxcblx0ICAgIHBvcyA9IDA7XG5cdCAgZm9yIChjb25zdCBlbGVtIG9mIGltZ0RhdGEuZGF0YSkge1xuXHQgICAgbGV0IG1hc2sgPSAxMjg7XG5cdCAgICB3aGlsZSAobWFzayA+IDApIHtcblx0ICAgICAgZGF0YVtwb3MrK10gPSBlbGVtICYgbWFzayA/IDAgOiAyNTU7XG5cdCAgICAgIG1hc2sgPj49IDE7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGxldCBjb3VudCA9IDA7XG5cdCAgcG9zID0gMDtcblx0ICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG5cdCAgICBwb2ludHNbMF0gPSAxO1xuXHQgICAgKytjb3VudDtcblx0ICB9XG5cdCAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHtcblx0ICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcblx0ICAgICAgcG9pbnRzW2pdID0gZGF0YVtwb3NdID8gMiA6IDE7XG5cdCAgICAgICsrY291bnQ7XG5cdCAgICB9XG5cdCAgICBwb3MrKztcblx0ICB9XG5cdCAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuXHQgICAgcG9pbnRzW2pdID0gMjtcblx0ICAgICsrY291bnQ7XG5cdCAgfVxuXHQgIGZvciAoaSA9IDE7IGkgPCBoZWlnaHQ7IGkrKykge1xuXHQgICAgcG9zID0gaSAqIGxpbmVTaXplO1xuXHQgICAgajAgPSBpICogd2lkdGgxO1xuXHQgICAgaWYgKGRhdGFbcG9zIC0gbGluZVNpemVdICE9PSBkYXRhW3Bvc10pIHtcblx0ICAgICAgcG9pbnRzW2owXSA9IGRhdGFbcG9zXSA/IDEgOiA4O1xuXHQgICAgICArK2NvdW50O1xuXHQgICAgfVxuXHQgICAgbGV0IHN1bSA9IChkYXRhW3Bvc10gPyA0IDogMCkgKyAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gPyA4IDogMCk7XG5cdCAgICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuXHQgICAgICBzdW0gPSAoc3VtID4+IDIpICsgKGRhdGFbcG9zICsgMV0gPyA0IDogMCkgKyAoZGF0YVtwb3MgLSBsaW5lU2l6ZSArIDFdID8gOCA6IDApO1xuXHQgICAgICBpZiAoUE9JTlRfVFlQRVNbc3VtXSkge1xuXHQgICAgICAgIHBvaW50c1tqMCArIGpdID0gUE9JTlRfVFlQRVNbc3VtXTtcblx0ICAgICAgICArK2NvdW50O1xuXHQgICAgICB9XG5cdCAgICAgIHBvcysrO1xuXHQgICAgfVxuXHQgICAgaWYgKGRhdGFbcG9zIC0gbGluZVNpemVdICE9PSBkYXRhW3Bvc10pIHtcblx0ICAgICAgcG9pbnRzW2owICsgal0gPSBkYXRhW3Bvc10gPyAyIDogNDtcblx0ICAgICAgKytjb3VudDtcblx0ICAgIH1cblx0ICAgIGlmIChjb3VudCA+IFBPSU5UX1RPX1BST0NFU1NfTElNSVQpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHBvcyA9IGxpbmVTaXplICogKGhlaWdodCAtIDEpO1xuXHQgIGowID0gaSAqIHdpZHRoMTtcblx0ICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG5cdCAgICBwb2ludHNbajBdID0gODtcblx0ICAgICsrY291bnQ7XG5cdCAgfVxuXHQgIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7XG5cdCAgICBpZiAoZGF0YVtwb3NdICE9PSBkYXRhW3BvcyArIDFdKSB7XG5cdCAgICAgIHBvaW50c1tqMCArIGpdID0gZGF0YVtwb3NdID8gNCA6IDg7XG5cdCAgICAgICsrY291bnQ7XG5cdCAgICB9XG5cdCAgICBwb3MrKztcblx0ICB9XG5cdCAgaWYgKGRhdGFbcG9zXSAhPT0gMCkge1xuXHQgICAgcG9pbnRzW2owICsgal0gPSA0O1xuXHQgICAgKytjb3VudDtcblx0ICB9XG5cdCAgaWYgKGNvdW50ID4gUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCkge1xuXHQgICAgcmV0dXJuIG51bGw7XG5cdCAgfVxuXHQgIGNvbnN0IHN0ZXBzID0gbmV3IEludDMyQXJyYXkoWzAsIHdpZHRoMSwgLTEsIDAsIC13aWR0aDEsIDAsIDAsIDAsIDFdKTtcblx0ICBjb25zdCBwYXRoID0gbmV3IFBhdGgyRCgpO1xuXHQgIGZvciAoaSA9IDA7IGNvdW50ICYmIGkgPD0gaGVpZ2h0OyBpKyspIHtcblx0ICAgIGxldCBwID0gaSAqIHdpZHRoMTtcblx0ICAgIGNvbnN0IGVuZCA9IHAgKyB3aWR0aDtcblx0ICAgIHdoaWxlIChwIDwgZW5kICYmICFwb2ludHNbcF0pIHtcblx0ICAgICAgcCsrO1xuXHQgICAgfVxuXHQgICAgaWYgKHAgPT09IGVuZCkge1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIHBhdGgubW92ZVRvKHAgJSB3aWR0aDEsIGkpO1xuXHQgICAgY29uc3QgcDAgPSBwO1xuXHQgICAgbGV0IHR5cGUgPSBwb2ludHNbcF07XG5cdCAgICBkbyB7XG5cdCAgICAgIGNvbnN0IHN0ZXAgPSBzdGVwc1t0eXBlXTtcblx0ICAgICAgZG8ge1xuXHQgICAgICAgIHAgKz0gc3RlcDtcblx0ICAgICAgfSB3aGlsZSAoIXBvaW50c1twXSk7XG5cdCAgICAgIGNvbnN0IHBwID0gcG9pbnRzW3BdO1xuXHQgICAgICBpZiAocHAgIT09IDUgJiYgcHAgIT09IDEwKSB7XG5cdCAgICAgICAgdHlwZSA9IHBwO1xuXHQgICAgICAgIHBvaW50c1twXSA9IDA7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdHlwZSA9IHBwICYgMHgzMyAqIHR5cGUgPj4gNDtcblx0ICAgICAgICBwb2ludHNbcF0gJj0gdHlwZSA+PiAyIHwgdHlwZSA8PCAyO1xuXHQgICAgICB9XG5cdCAgICAgIHBhdGgubGluZVRvKHAgJSB3aWR0aDEsIHAgLyB3aWR0aDEgfCAwKTtcblx0ICAgICAgaWYgKCFwb2ludHNbcF0pIHtcblx0ICAgICAgICAtLWNvdW50O1xuXHQgICAgICB9XG5cdCAgICB9IHdoaWxlIChwMCAhPT0gcCk7XG5cdCAgICAtLWk7XG5cdCAgfVxuXHQgIGRhdGEgPSBudWxsO1xuXHQgIHBvaW50cyA9IG51bGw7XG5cdCAgY29uc3QgZHJhd091dGxpbmUgPSBmdW5jdGlvbiAoYykge1xuXHQgICAgYy5zYXZlKCk7XG5cdCAgICBjLnNjYWxlKDEgLyB3aWR0aCwgLTEgLyBoZWlnaHQpO1xuXHQgICAgYy50cmFuc2xhdGUoMCwgLWhlaWdodCk7XG5cdCAgICBjLmZpbGwocGF0aCk7XG5cdCAgICBjLmJlZ2luUGF0aCgpO1xuXHQgICAgYy5yZXN0b3JlKCk7XG5cdCAgfTtcblx0ICByZXR1cm4gZHJhd091dGxpbmU7XG5cdH1cblx0Y2xhc3MgQ2FudmFzRXh0cmFTdGF0ZSB7XG5cdCAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCkge1xuXHQgICAgdGhpcy5hbHBoYUlzU2hhcGUgPSBmYWxzZTtcblx0ICAgIHRoaXMuZm9udFNpemUgPSAwO1xuXHQgICAgdGhpcy5mb250U2l6ZVNjYWxlID0gMTtcblx0ICAgIHRoaXMudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDtcblx0ICAgIHRoaXMudGV4dE1hdHJpeFNjYWxlID0gMTtcblx0ICAgIHRoaXMuZm9udE1hdHJpeCA9IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYO1xuXHQgICAgdGhpcy5sZWFkaW5nID0gMDtcblx0ICAgIHRoaXMueCA9IDA7XG5cdCAgICB0aGlzLnkgPSAwO1xuXHQgICAgdGhpcy5saW5lWCA9IDA7XG5cdCAgICB0aGlzLmxpbmVZID0gMDtcblx0ICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwO1xuXHQgICAgdGhpcy53b3JkU3BhY2luZyA9IDA7XG5cdCAgICB0aGlzLnRleHRIU2NhbGUgPSAxO1xuXHQgICAgdGhpcy50ZXh0UmVuZGVyaW5nTW9kZSA9IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEw7XG5cdCAgICB0aGlzLnRleHRSaXNlID0gMDtcblx0ICAgIHRoaXMuZmlsbENvbG9yID0gXCIjMDAwMDAwXCI7XG5cdCAgICB0aGlzLnN0cm9rZUNvbG9yID0gXCIjMDAwMDAwXCI7XG5cdCAgICB0aGlzLnBhdHRlcm5GaWxsID0gZmFsc2U7XG5cdCAgICB0aGlzLmZpbGxBbHBoYSA9IDE7XG5cdCAgICB0aGlzLnN0cm9rZUFscGhhID0gMTtcblx0ICAgIHRoaXMubGluZVdpZHRoID0gMTtcblx0ICAgIHRoaXMuYWN0aXZlU01hc2sgPSBudWxsO1xuXHQgICAgdGhpcy50cmFuc2Zlck1hcHMgPSBcIm5vbmVcIjtcblx0ICAgIHRoaXMuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChbMCwgMCwgd2lkdGgsIGhlaWdodF0pO1xuXHQgIH1cblx0ICBjbG9uZSgpIHtcblx0ICAgIGNvbnN0IGNsb25lID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcblx0ICAgIGNsb25lLmNsaXBCb3ggPSB0aGlzLmNsaXBCb3guc2xpY2UoKTtcblx0ICAgIHJldHVybiBjbG9uZTtcblx0ICB9XG5cdCAgc2V0Q3VycmVudFBvaW50KHgsIHkpIHtcblx0ICAgIHRoaXMueCA9IHg7XG5cdCAgICB0aGlzLnkgPSB5O1xuXHQgIH1cblx0ICB1cGRhdGVQYXRoTWluTWF4KHRyYW5zZm9ybSwgeCwgeSkge1xuXHQgICAgW3gsIHldID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbeCwgeV0sIHRyYW5zZm9ybSk7XG5cdCAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIHgpO1xuXHQgICAgdGhpcy5taW5ZID0gTWF0aC5taW4odGhpcy5taW5ZLCB5KTtcblx0ICAgIHRoaXMubWF4WCA9IE1hdGgubWF4KHRoaXMubWF4WCwgeCk7XG5cdCAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIHkpO1xuXHQgIH1cblx0ICB1cGRhdGVSZWN0TWluTWF4KHRyYW5zZm9ybSwgcmVjdCkge1xuXHQgICAgY29uc3QgcDEgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKHJlY3QsIHRyYW5zZm9ybSk7XG5cdCAgICBjb25zdCBwMiA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0ocmVjdC5zbGljZSgyKSwgdHJhbnNmb3JtKTtcblx0ICAgIHRoaXMubWluWCA9IE1hdGgubWluKHRoaXMubWluWCwgcDFbMF0sIHAyWzBdKTtcblx0ICAgIHRoaXMubWluWSA9IE1hdGgubWluKHRoaXMubWluWSwgcDFbMV0sIHAyWzFdKTtcblx0ICAgIHRoaXMubWF4WCA9IE1hdGgubWF4KHRoaXMubWF4WCwgcDFbMF0sIHAyWzBdKTtcblx0ICAgIHRoaXMubWF4WSA9IE1hdGgubWF4KHRoaXMubWF4WSwgcDFbMV0sIHAyWzFdKTtcblx0ICB9XG5cdCAgdXBkYXRlU2NhbGluZ1BhdGhNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpIHtcblx0ICAgIF91dGlsLlV0aWwuc2NhbGVNaW5NYXgodHJhbnNmb3JtLCBtaW5NYXgpO1xuXHQgICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBtaW5NYXhbMF0pO1xuXHQgICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCBtaW5NYXhbMV0pO1xuXHQgICAgdGhpcy5taW5ZID0gTWF0aC5taW4odGhpcy5taW5ZLCBtaW5NYXhbMl0pO1xuXHQgICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBtaW5NYXhbM10pO1xuXHQgIH1cblx0ICB1cGRhdGVDdXJ2ZVBhdGhNaW5NYXgodHJhbnNmb3JtLCB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIG1pbk1heCkge1xuXHQgICAgY29uc3QgYm94ID0gX3V0aWwuVXRpbC5iZXppZXJCb3VuZGluZ0JveCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpO1xuXHQgICAgaWYgKG1pbk1heCkge1xuXHQgICAgICBtaW5NYXhbMF0gPSBNYXRoLm1pbihtaW5NYXhbMF0sIGJveFswXSwgYm94WzJdKTtcblx0ICAgICAgbWluTWF4WzFdID0gTWF0aC5tYXgobWluTWF4WzFdLCBib3hbMF0sIGJveFsyXSk7XG5cdCAgICAgIG1pbk1heFsyXSA9IE1hdGgubWluKG1pbk1heFsyXSwgYm94WzFdLCBib3hbM10pO1xuXHQgICAgICBtaW5NYXhbM10gPSBNYXRoLm1heChtaW5NYXhbM10sIGJveFsxXSwgYm94WzNdKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy51cGRhdGVSZWN0TWluTWF4KHRyYW5zZm9ybSwgYm94KTtcblx0ICB9XG5cdCAgZ2V0UGF0aEJvdW5kaW5nQm94KHBhdGhUeXBlID0gX3BhdHRlcm5faGVscGVyLlBhdGhUeXBlLkZJTEwsIHRyYW5zZm9ybSA9IG51bGwpIHtcblx0ICAgIGNvbnN0IGJveCA9IFt0aGlzLm1pblgsIHRoaXMubWluWSwgdGhpcy5tYXhYLCB0aGlzLm1heFldO1xuXHQgICAgaWYgKHBhdGhUeXBlID09PSBfcGF0dGVybl9oZWxwZXIuUGF0aFR5cGUuU1RST0tFKSB7XG5cdCAgICAgIGlmICghdHJhbnNmb3JtKSB7XG5cdCAgICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIlN0cm9rZSBib3VuZGluZyBib3ggbXVzdCBpbmNsdWRlIHRyYW5zZm9ybS5cIik7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3Qgc2NhbGUgPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRyYW5zZm9ybSk7XG5cdCAgICAgIGNvbnN0IHhTdHJva2VQYWQgPSBzY2FsZVswXSAqIHRoaXMubGluZVdpZHRoIC8gMjtcblx0ICAgICAgY29uc3QgeVN0cm9rZVBhZCA9IHNjYWxlWzFdICogdGhpcy5saW5lV2lkdGggLyAyO1xuXHQgICAgICBib3hbMF0gLT0geFN0cm9rZVBhZDtcblx0ICAgICAgYm94WzFdIC09IHlTdHJva2VQYWQ7XG5cdCAgICAgIGJveFsyXSArPSB4U3Ryb2tlUGFkO1xuXHQgICAgICBib3hbM10gKz0geVN0cm9rZVBhZDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBib3g7XG5cdCAgfVxuXHQgIHVwZGF0ZUNsaXBGcm9tUGF0aCgpIHtcblx0ICAgIGNvbnN0IGludGVyc2VjdCA9IF91dGlsLlV0aWwuaW50ZXJzZWN0KHRoaXMuY2xpcEJveCwgdGhpcy5nZXRQYXRoQm91bmRpbmdCb3goKSk7XG5cdCAgICB0aGlzLnN0YXJ0TmV3UGF0aEFuZENsaXBCb3goaW50ZXJzZWN0IHx8IFswLCAwLCAwLCAwXSk7XG5cdCAgfVxuXHQgIGlzRW1wdHlDbGlwKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWluWCA9PT0gSW5maW5pdHk7XG5cdCAgfVxuXHQgIHN0YXJ0TmV3UGF0aEFuZENsaXBCb3goYm94KSB7XG5cdCAgICB0aGlzLmNsaXBCb3ggPSBib3g7XG5cdCAgICB0aGlzLm1pblggPSBJbmZpbml0eTtcblx0ICAgIHRoaXMubWluWSA9IEluZmluaXR5O1xuXHQgICAgdGhpcy5tYXhYID0gMDtcblx0ICAgIHRoaXMubWF4WSA9IDA7XG5cdCAgfVxuXHQgIGdldENsaXBwZWRQYXRoQm91bmRpbmdCb3gocGF0aFR5cGUgPSBfcGF0dGVybl9oZWxwZXIuUGF0aFR5cGUuRklMTCwgdHJhbnNmb3JtID0gbnVsbCkge1xuXHQgICAgcmV0dXJuIF91dGlsLlV0aWwuaW50ZXJzZWN0KHRoaXMuY2xpcEJveCwgdGhpcy5nZXRQYXRoQm91bmRpbmdCb3gocGF0aFR5cGUsIHRyYW5zZm9ybSkpO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBwdXRCaW5hcnlJbWFnZURhdGEoY3R4LCBpbWdEYXRhKSB7XG5cdCAgaWYgKHR5cGVvZiBJbWFnZURhdGEgIT09IFwidW5kZWZpbmVkXCIgJiYgaW1nRGF0YSBpbnN0YW5jZW9mIEltYWdlRGF0YSkge1xuXHQgICAgY3R4LnB1dEltYWdlRGF0YShpbWdEYXRhLCAwLCAwKTtcblx0ICAgIHJldHVybjtcblx0ICB9XG5cdCAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQsXG5cdCAgICB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG5cdCAgY29uc3QgcGFydGlhbENodW5rSGVpZ2h0ID0gaGVpZ2h0ICUgRlVMTF9DSFVOS19IRUlHSFQ7XG5cdCAgY29uc3QgZnVsbENodW5rcyA9IChoZWlnaHQgLSBwYXJ0aWFsQ2h1bmtIZWlnaHQpIC8gRlVMTF9DSFVOS19IRUlHSFQ7XG5cdCAgY29uc3QgdG90YWxDaHVua3MgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQgPT09IDAgPyBmdWxsQ2h1bmtzIDogZnVsbENodW5rcyArIDE7XG5cdCAgY29uc3QgY2h1bmtJbWdEYXRhID0gY3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgRlVMTF9DSFVOS19IRUlHSFQpO1xuXHQgIGxldCBzcmNQb3MgPSAwLFxuXHQgICAgZGVzdFBvcztcblx0ICBjb25zdCBzcmMgPSBpbWdEYXRhLmRhdGE7XG5cdCAgY29uc3QgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhO1xuXHQgIGxldCBpLCBqLCB0aGlzQ2h1bmtIZWlnaHQsIGVsZW1zSW5UaGlzQ2h1bms7XG5cdCAgaWYgKGltZ0RhdGEua2luZCA9PT0gX3V0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQKSB7XG5cdCAgICBjb25zdCBzcmNMZW5ndGggPSBzcmMuYnl0ZUxlbmd0aDtcblx0ICAgIGNvbnN0IGRlc3QzMiA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlciwgMCwgZGVzdC5ieXRlTGVuZ3RoID4+IDIpO1xuXHQgICAgY29uc3QgZGVzdDMyRGF0YUxlbmd0aCA9IGRlc3QzMi5sZW5ndGg7XG5cdCAgICBjb25zdCBmdWxsU3JjRGlmZiA9IHdpZHRoICsgNyA+PiAzO1xuXHQgICAgY29uc3Qgd2hpdGUgPSAweGZmZmZmZmZmO1xuXHQgICAgY29uc3QgYmxhY2sgPSBfdXRpbC5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmO1xuXHQgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHtcblx0ICAgICAgdGhpc0NodW5rSGVpZ2h0ID0gaSA8IGZ1bGxDaHVua3MgPyBGVUxMX0NIVU5LX0hFSUdIVCA6IHBhcnRpYWxDaHVua0hlaWdodDtcblx0ICAgICAgZGVzdFBvcyA9IDA7XG5cdCAgICAgIGZvciAoaiA9IDA7IGogPCB0aGlzQ2h1bmtIZWlnaHQ7IGorKykge1xuXHQgICAgICAgIGNvbnN0IHNyY0RpZmYgPSBzcmNMZW5ndGggLSBzcmNQb3M7XG5cdCAgICAgICAgbGV0IGsgPSAwO1xuXHQgICAgICAgIGNvbnN0IGtFbmQgPSBzcmNEaWZmID4gZnVsbFNyY0RpZmYgPyB3aWR0aCA6IHNyY0RpZmYgKiA4IC0gNztcblx0ICAgICAgICBjb25zdCBrRW5kVW5yb2xsZWQgPSBrRW5kICYgfjc7XG5cdCAgICAgICAgbGV0IG1hc2sgPSAwO1xuXHQgICAgICAgIGxldCBzcmNCeXRlID0gMDtcblx0ICAgICAgICBmb3IgKDsgayA8IGtFbmRVbnJvbGxlZDsgayArPSA4KSB7XG5cdCAgICAgICAgICBzcmNCeXRlID0gc3JjW3NyY1BvcysrXTtcblx0ICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEyOCA/IHdoaXRlIDogYmxhY2s7XG5cdCAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA2NCA/IHdoaXRlIDogYmxhY2s7XG5cdCAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAzMiA/IHdoaXRlIDogYmxhY2s7XG5cdCAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxNiA/IHdoaXRlIDogYmxhY2s7XG5cdCAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiA4ID8gd2hpdGUgOiBibGFjaztcblx0ICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDQgPyB3aGl0ZSA6IGJsYWNrO1xuXHQgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMiA/IHdoaXRlIDogYmxhY2s7XG5cdCAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAxID8gd2hpdGUgOiBibGFjaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgZm9yICg7IGsgPCBrRW5kOyBrKyspIHtcblx0ICAgICAgICAgIGlmIChtYXNrID09PSAwKSB7XG5cdCAgICAgICAgICAgIHNyY0J5dGUgPSBzcmNbc3JjUG9zKytdO1xuXHQgICAgICAgICAgICBtYXNrID0gMTI4O1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgbWFzayA/IHdoaXRlIDogYmxhY2s7XG5cdCAgICAgICAgICBtYXNrID4+PSAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICB3aGlsZSAoZGVzdFBvcyA8IGRlc3QzMkRhdGFMZW5ndGgpIHtcblx0ICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IDA7XG5cdCAgICAgIH1cblx0ICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGkgKiBGVUxMX0NIVU5LX0hFSUdIVCk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIGlmIChpbWdEYXRhLmtpbmQgPT09IF91dGlsLkltYWdlS2luZC5SR0JBXzMyQlBQKSB7XG5cdCAgICBqID0gMDtcblx0ICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIEZVTExfQ0hVTktfSEVJR0hUICogNDtcblx0ICAgIGZvciAoaSA9IDA7IGkgPCBmdWxsQ2h1bmtzOyBpKyspIHtcblx0ICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY1Bvcywgc3JjUG9zICsgZWxlbXNJblRoaXNDaHVuaykpO1xuXHQgICAgICBzcmNQb3MgKz0gZWxlbXNJblRoaXNDaHVuaztcblx0ICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGopO1xuXHQgICAgICBqICs9IEZVTExfQ0hVTktfSEVJR0hUO1xuXHQgICAgfVxuXHQgICAgaWYgKGkgPCB0b3RhbENodW5rcykge1xuXHQgICAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiBwYXJ0aWFsQ2h1bmtIZWlnaHQgKiA0O1xuXHQgICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjUG9zLCBzcmNQb3MgKyBlbGVtc0luVGhpc0NodW5rKSk7XG5cdCAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBqKTtcblx0ICAgIH1cblx0ICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gX3V0aWwuSW1hZ2VLaW5kLlJHQl8yNEJQUCkge1xuXHQgICAgdGhpc0NodW5rSGVpZ2h0ID0gRlVMTF9DSFVOS19IRUlHSFQ7XG5cdCAgICBlbGVtc0luVGhpc0NodW5rID0gd2lkdGggKiB0aGlzQ2h1bmtIZWlnaHQ7XG5cdCAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuXHQgICAgICBpZiAoaSA+PSBmdWxsQ2h1bmtzKSB7XG5cdCAgICAgICAgdGhpc0NodW5rSGVpZ2h0ID0gcGFydGlhbENodW5rSGVpZ2h0O1xuXHQgICAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHRoaXNDaHVua0hlaWdodDtcblx0ICAgICAgfVxuXHQgICAgICBkZXN0UG9zID0gMDtcblx0ICAgICAgZm9yIChqID0gZWxlbXNJblRoaXNDaHVuazsgai0tOykge1xuXHQgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG5cdCAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTtcblx0ICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuXHQgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IDI1NTtcblx0ICAgICAgfVxuXHQgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKGBiYWQgaW1hZ2Uga2luZDogJHtpbWdEYXRhLmtpbmR9YCk7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIHB1dEJpbmFyeUltYWdlTWFzayhjdHgsIGltZ0RhdGEpIHtcblx0ICBpZiAoaW1nRGF0YS5iaXRtYXApIHtcblx0ICAgIGN0eC5kcmF3SW1hZ2UoaW1nRGF0YS5iaXRtYXAsIDAsIDApO1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblx0ICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodCxcblx0ICAgIHdpZHRoID0gaW1nRGF0YS53aWR0aDtcblx0ICBjb25zdCBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDtcblx0ICBjb25zdCBmdWxsQ2h1bmtzID0gKGhlaWdodCAtIHBhcnRpYWxDaHVua0hlaWdodCkgLyBGVUxMX0NIVU5LX0hFSUdIVDtcblx0ICBjb25zdCB0b3RhbENodW5rcyA9IHBhcnRpYWxDaHVua0hlaWdodCA9PT0gMCA/IGZ1bGxDaHVua3MgOiBmdWxsQ2h1bmtzICsgMTtcblx0ICBjb25zdCBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7XG5cdCAgbGV0IHNyY1BvcyA9IDA7XG5cdCAgY29uc3Qgc3JjID0gaW1nRGF0YS5kYXRhO1xuXHQgIGNvbnN0IGRlc3QgPSBjaHVua0ltZ0RhdGEuZGF0YTtcblx0ICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsQ2h1bmtzOyBpKyspIHtcblx0ICAgIGNvbnN0IHRoaXNDaHVua0hlaWdodCA9IGkgPCBmdWxsQ2h1bmtzID8gRlVMTF9DSFVOS19IRUlHSFQgOiBwYXJ0aWFsQ2h1bmtIZWlnaHQ7XG5cdCAgICAoe1xuXHQgICAgICBzcmNQb3Ncblx0ICAgIH0gPSAoMCwgX2ltYWdlX3V0aWxzLmNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKSh7XG5cdCAgICAgIHNyYyxcblx0ICAgICAgc3JjUG9zLFxuXHQgICAgICBkZXN0LFxuXHQgICAgICB3aWR0aCxcblx0ICAgICAgaGVpZ2h0OiB0aGlzQ2h1bmtIZWlnaHQsXG5cdCAgICAgIG5vbkJsYWNrQ29sb3I6IDBcblx0ICAgIH0pKTtcblx0ICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBjb3B5Q3R4U3RhdGUoc291cmNlQ3R4LCBkZXN0Q3R4KSB7XG5cdCAgY29uc3QgcHJvcGVydGllcyA9IFtcInN0cm9rZVN0eWxlXCIsIFwiZmlsbFN0eWxlXCIsIFwiZmlsbFJ1bGVcIiwgXCJnbG9iYWxBbHBoYVwiLCBcImxpbmVXaWR0aFwiLCBcImxpbmVDYXBcIiwgXCJsaW5lSm9pblwiLCBcIm1pdGVyTGltaXRcIiwgXCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb25cIiwgXCJmb250XCIsIFwiZmlsdGVyXCJdO1xuXHQgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuXHQgICAgaWYgKHNvdXJjZUN0eFtwcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICBkZXN0Q3R4W3Byb3BlcnR5XSA9IHNvdXJjZUN0eFtwcm9wZXJ0eV07XG5cdCAgICB9XG5cdCAgfVxuXHQgIGlmIChzb3VyY2VDdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkge1xuXHQgICAgZGVzdEN0eC5zZXRMaW5lRGFzaChzb3VyY2VDdHguZ2V0TGluZURhc2goKSk7XG5cdCAgICBkZXN0Q3R4LmxpbmVEYXNoT2Zmc2V0ID0gc291cmNlQ3R4LmxpbmVEYXNoT2Zmc2V0O1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiByZXNldEN0eFRvRGVmYXVsdChjdHgpIHtcblx0ICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlID0gXCIjMDAwMDAwXCI7XG5cdCAgY3R4LmZpbGxSdWxlID0gXCJub256ZXJvXCI7XG5cdCAgY3R4Lmdsb2JhbEFscGhhID0gMTtcblx0ICBjdHgubGluZVdpZHRoID0gMTtcblx0ICBjdHgubGluZUNhcCA9IFwiYnV0dFwiO1xuXHQgIGN0eC5saW5lSm9pbiA9IFwibWl0ZXJcIjtcblx0ICBjdHgubWl0ZXJMaW1pdCA9IDEwO1xuXHQgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1vdmVyXCI7XG5cdCAgY3R4LmZvbnQgPSBcIjEwcHggc2Fucy1zZXJpZlwiO1xuXHQgIGlmIChjdHguc2V0TGluZURhc2ggIT09IHVuZGVmaW5lZCkge1xuXHQgICAgY3R4LnNldExpbmVEYXNoKFtdKTtcblx0ICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IDA7XG5cdCAgfVxuXHQgIGlmICghX2lzX25vZGUuaXNOb2RlSlMpIHtcblx0ICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gY29tcG9zZVNNYXNrQmFja2Ryb3AoYnl0ZXMsIHIwLCBnMCwgYjApIHtcblx0ICBjb25zdCBsZW5ndGggPSBieXRlcy5sZW5ndGg7XG5cdCAgZm9yIChsZXQgaSA9IDM7IGkgPCBsZW5ndGg7IGkgKz0gNCkge1xuXHQgICAgY29uc3QgYWxwaGEgPSBieXRlc1tpXTtcblx0ICAgIGlmIChhbHBoYSA9PT0gMCkge1xuXHQgICAgICBieXRlc1tpIC0gM10gPSByMDtcblx0ICAgICAgYnl0ZXNbaSAtIDJdID0gZzA7XG5cdCAgICAgIGJ5dGVzW2kgLSAxXSA9IGIwO1xuXHQgICAgfSBlbHNlIGlmIChhbHBoYSA8IDI1NSkge1xuXHQgICAgICBjb25zdCBhbHBoYV8gPSAyNTUgLSBhbHBoYTtcblx0ICAgICAgYnl0ZXNbaSAtIDNdID0gYnl0ZXNbaSAtIDNdICogYWxwaGEgKyByMCAqIGFscGhhXyA+PiA4O1xuXHQgICAgICBieXRlc1tpIC0gMl0gPSBieXRlc1tpIC0gMl0gKiBhbHBoYSArIGcwICogYWxwaGFfID4+IDg7XG5cdCAgICAgIGJ5dGVzW2kgLSAxXSA9IGJ5dGVzW2kgLSAxXSAqIGFscGhhICsgYjAgKiBhbHBoYV8gPj4gODtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gY29tcG9zZVNNYXNrQWxwaGEobWFza0RhdGEsIGxheWVyRGF0YSwgdHJhbnNmZXJNYXApIHtcblx0ICBjb25zdCBsZW5ndGggPSBtYXNrRGF0YS5sZW5ndGg7XG5cdCAgY29uc3Qgc2NhbGUgPSAxIC8gMjU1O1xuXHQgIGZvciAobGV0IGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcblx0ICAgIGNvbnN0IGFscGhhID0gdHJhbnNmZXJNYXAgPyB0cmFuc2Zlck1hcFttYXNrRGF0YVtpXV0gOiBtYXNrRGF0YVtpXTtcblx0ICAgIGxheWVyRGF0YVtpXSA9IGxheWVyRGF0YVtpXSAqIGFscGhhICogc2NhbGUgfCAwO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBjb21wb3NlU01hc2tMdW1pbm9zaXR5KG1hc2tEYXRhLCBsYXllckRhdGEsIHRyYW5zZmVyTWFwKSB7XG5cdCAgY29uc3QgbGVuZ3RoID0gbWFza0RhdGEubGVuZ3RoO1xuXHQgIGZvciAobGV0IGkgPSAzOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcblx0ICAgIGNvbnN0IHkgPSBtYXNrRGF0YVtpIC0gM10gKiA3NyArIG1hc2tEYXRhW2kgLSAyXSAqIDE1MiArIG1hc2tEYXRhW2kgLSAxXSAqIDI4O1xuXHQgICAgbGF5ZXJEYXRhW2ldID0gdHJhbnNmZXJNYXAgPyBsYXllckRhdGFbaV0gKiB0cmFuc2Zlck1hcFt5ID4+IDhdID4+IDggOiBsYXllckRhdGFbaV0gKiB5ID4+IDE2O1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBnZW5lcmljQ29tcG9zZVNNYXNrKG1hc2tDdHgsIGxheWVyQ3R4LCB3aWR0aCwgaGVpZ2h0LCBzdWJ0eXBlLCBiYWNrZHJvcCwgdHJhbnNmZXJNYXAsIGxheWVyT2Zmc2V0WCwgbGF5ZXJPZmZzZXRZLCBtYXNrT2Zmc2V0WCwgbWFza09mZnNldFkpIHtcblx0ICBjb25zdCBoYXNCYWNrZHJvcCA9ICEhYmFja2Ryb3A7XG5cdCAgY29uc3QgcjAgPSBoYXNCYWNrZHJvcCA/IGJhY2tkcm9wWzBdIDogMDtcblx0ICBjb25zdCBnMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMV0gOiAwO1xuXHQgIGNvbnN0IGIwID0gaGFzQmFja2Ryb3AgPyBiYWNrZHJvcFsyXSA6IDA7XG5cdCAgbGV0IGNvbXBvc2VGbjtcblx0ICBpZiAoc3VidHlwZSA9PT0gXCJMdW1pbm9zaXR5XCIpIHtcblx0ICAgIGNvbXBvc2VGbiA9IGNvbXBvc2VTTWFza0x1bWlub3NpdHk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGNvbXBvc2VGbiA9IGNvbXBvc2VTTWFza0FscGhhO1xuXHQgIH1cblx0ICBjb25zdCBQSVhFTFNfVE9fUFJPQ0VTUyA9IDEwNDg1NzY7XG5cdCAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5taW4oaGVpZ2h0LCBNYXRoLmNlaWwoUElYRUxTX1RPX1BST0NFU1MgLyB3aWR0aCkpO1xuXHQgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICs9IGNodW5rU2l6ZSkge1xuXHQgICAgY29uc3QgY2h1bmtIZWlnaHQgPSBNYXRoLm1pbihjaHVua1NpemUsIGhlaWdodCAtIHJvdyk7XG5cdCAgICBjb25zdCBtYXNrRGF0YSA9IG1hc2tDdHguZ2V0SW1hZ2VEYXRhKGxheWVyT2Zmc2V0WCAtIG1hc2tPZmZzZXRYLCByb3cgKyAobGF5ZXJPZmZzZXRZIC0gbWFza09mZnNldFkpLCB3aWR0aCwgY2h1bmtIZWlnaHQpO1xuXHQgICAgY29uc3QgbGF5ZXJEYXRhID0gbGF5ZXJDdHguZ2V0SW1hZ2VEYXRhKGxheWVyT2Zmc2V0WCwgcm93ICsgbGF5ZXJPZmZzZXRZLCB3aWR0aCwgY2h1bmtIZWlnaHQpO1xuXHQgICAgaWYgKGhhc0JhY2tkcm9wKSB7XG5cdCAgICAgIGNvbXBvc2VTTWFza0JhY2tkcm9wKG1hc2tEYXRhLmRhdGEsIHIwLCBnMCwgYjApO1xuXHQgICAgfVxuXHQgICAgY29tcG9zZUZuKG1hc2tEYXRhLmRhdGEsIGxheWVyRGF0YS5kYXRhLCB0cmFuc2Zlck1hcCk7XG5cdCAgICBsYXllckN0eC5wdXRJbWFnZURhdGEobGF5ZXJEYXRhLCBsYXllck9mZnNldFgsIHJvdyArIGxheWVyT2Zmc2V0WSk7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGNvbXBvc2VTTWFzayhjdHgsIHNtYXNrLCBsYXllckN0eCwgbGF5ZXJCb3gpIHtcblx0ICBjb25zdCBsYXllck9mZnNldFggPSBsYXllckJveFswXTtcblx0ICBjb25zdCBsYXllck9mZnNldFkgPSBsYXllckJveFsxXTtcblx0ICBjb25zdCBsYXllcldpZHRoID0gbGF5ZXJCb3hbMl0gLSBsYXllck9mZnNldFg7XG5cdCAgY29uc3QgbGF5ZXJIZWlnaHQgPSBsYXllckJveFszXSAtIGxheWVyT2Zmc2V0WTtcblx0ICBpZiAobGF5ZXJXaWR0aCA9PT0gMCB8fCBsYXllckhlaWdodCA9PT0gMCkge1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblx0ICBnZW5lcmljQ29tcG9zZVNNYXNrKHNtYXNrLmNvbnRleHQsIGxheWVyQ3R4LCBsYXllcldpZHRoLCBsYXllckhlaWdodCwgc21hc2suc3VidHlwZSwgc21hc2suYmFja2Ryb3AsIHNtYXNrLnRyYW5zZmVyTWFwLCBsYXllck9mZnNldFgsIGxheWVyT2Zmc2V0WSwgc21hc2sub2Zmc2V0WCwgc21hc2sub2Zmc2V0WSk7XG5cdCAgY3R4LnNhdmUoKTtcblx0ICBjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXHQgIGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1vdmVyXCI7XG5cdCAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcblx0ICBjdHguZHJhd0ltYWdlKGxheWVyQ3R4LmNhbnZhcywgMCwgMCk7XG5cdCAgY3R4LnJlc3RvcmUoKTtcblx0fVxuXHRmdW5jdGlvbiBnZXRJbWFnZVNtb290aGluZ0VuYWJsZWQodHJhbnNmb3JtLCBpbnRlcnBvbGF0ZSkge1xuXHQgIGNvbnN0IHNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0cmFuc2Zvcm0pO1xuXHQgIHNjYWxlWzBdID0gTWF0aC5mcm91bmQoc2NhbGVbMF0pO1xuXHQgIHNjYWxlWzFdID0gTWF0aC5mcm91bmQoc2NhbGVbMV0pO1xuXHQgIGNvbnN0IGFjdHVhbFNjYWxlID0gTWF0aC5mcm91bmQoKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAqIF9kaXNwbGF5X3V0aWxzLlBpeGVsc1BlckluY2guUERGX1RPX0NTU19VTklUUyk7XG5cdCAgaWYgKGludGVycG9sYXRlICE9PSB1bmRlZmluZWQpIHtcblx0ICAgIHJldHVybiBpbnRlcnBvbGF0ZTtcblx0ICB9IGVsc2UgaWYgKHNjYWxlWzBdIDw9IGFjdHVhbFNjYWxlIHx8IHNjYWxlWzFdIDw9IGFjdHVhbFNjYWxlKSB7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cdCAgcmV0dXJuIGZhbHNlO1xuXHR9XG5cdGNvbnN0IExJTkVfQ0FQX1NUWUxFUyA9IFtcImJ1dHRcIiwgXCJyb3VuZFwiLCBcInNxdWFyZVwiXTtcblx0Y29uc3QgTElORV9KT0lOX1NUWUxFUyA9IFtcIm1pdGVyXCIsIFwicm91bmRcIiwgXCJiZXZlbFwiXTtcblx0Y29uc3QgTk9STUFMX0NMSVAgPSB7fTtcblx0Y29uc3QgRU9fQ0xJUCA9IHt9O1xuXHRjbGFzcyBDYW52YXNHcmFwaGljcyB7XG5cdCAgY29uc3RydWN0b3IoY2FudmFzQ3R4LCBjb21tb25PYmpzLCBvYmpzLCBjYW52YXNGYWN0b3J5LCBmaWx0ZXJGYWN0b3J5LCB7XG5cdCAgICBvcHRpb25hbENvbnRlbnRDb25maWcsXG5cdCAgICBtYXJrZWRDb250ZW50U3RhY2sgPSBudWxsXG5cdCAgfSwgYW5ub3RhdGlvbkNhbnZhc01hcCwgcGFnZUNvbG9ycykge1xuXHQgICAgdGhpcy5jdHggPSBjYW52YXNDdHg7XG5cdCAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSh0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuXHQgICAgdGhpcy5zdGF0ZVN0YWNrID0gW107XG5cdCAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcblx0ICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlO1xuXHQgICAgdGhpcy5yZXMgPSBudWxsO1xuXHQgICAgdGhpcy54b2JqcyA9IG51bGw7XG5cdCAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzO1xuXHQgICAgdGhpcy5vYmpzID0gb2Jqcztcblx0ICAgIHRoaXMuY2FudmFzRmFjdG9yeSA9IGNhbnZhc0ZhY3Rvcnk7XG5cdCAgICB0aGlzLmZpbHRlckZhY3RvcnkgPSBmaWx0ZXJGYWN0b3J5O1xuXHQgICAgdGhpcy5ncm91cFN0YWNrID0gW107XG5cdCAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7XG5cdCAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSBudWxsO1xuXHQgICAgdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sgPSBbXTtcblx0ICAgIHRoaXMuZ3JvdXBMZXZlbCA9IDA7XG5cdCAgICB0aGlzLnNtYXNrU3RhY2sgPSBbXTtcblx0ICAgIHRoaXMuc21hc2tDb3VudGVyID0gMDtcblx0ICAgIHRoaXMudGVtcFNNYXNrID0gbnVsbDtcblx0ICAgIHRoaXMuc3VzcGVuZGVkQ3R4ID0gbnVsbDtcblx0ICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0cnVlO1xuXHQgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sgPSBtYXJrZWRDb250ZW50U3RhY2sgfHwgW107XG5cdCAgICB0aGlzLm9wdGlvbmFsQ29udGVudENvbmZpZyA9IG9wdGlvbmFsQ29udGVudENvbmZpZztcblx0ICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMgPSBuZXcgQ2FjaGVkQ2FudmFzZXModGhpcy5jYW52YXNGYWN0b3J5KTtcblx0ICAgIHRoaXMuY2FjaGVkUGF0dGVybnMgPSBuZXcgTWFwKCk7XG5cdCAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAgPSBhbm5vdGF0aW9uQ2FudmFzTWFwO1xuXHQgICAgdGhpcy52aWV3cG9ydFNjYWxlID0gMTtcblx0ICAgIHRoaXMub3V0cHV0U2NhbGVYID0gMTtcblx0ICAgIHRoaXMub3V0cHV0U2NhbGVZID0gMTtcblx0ICAgIHRoaXMucGFnZUNvbG9ycyA9IHBhZ2VDb2xvcnM7XG5cdCAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nID0gbnVsbDtcblx0ICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuXHQgICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcCA9IG5ldyBNYXAoKTtcblx0ICB9XG5cdCAgZ2V0T2JqZWN0KGRhdGEsIGZhbGxiYWNrID0gbnVsbCkge1xuXHQgICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgIHJldHVybiBkYXRhLnN0YXJ0c1dpdGgoXCJnX1wiKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQoZGF0YSkgOiB0aGlzLm9ianMuZ2V0KGRhdGEpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGZhbGxiYWNrO1xuXHQgIH1cblx0ICBiZWdpbkRyYXdpbmcoe1xuXHQgICAgdHJhbnNmb3JtLFxuXHQgICAgdmlld3BvcnQsXG5cdCAgICB0cmFuc3BhcmVuY3kgPSBmYWxzZSxcblx0ICAgIGJhY2tncm91bmQgPSBudWxsXG5cdCAgfSkge1xuXHQgICAgY29uc3Qgd2lkdGggPSB0aGlzLmN0eC5jYW52YXMud2lkdGg7XG5cdCAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0O1xuXHQgICAgY29uc3Qgc2F2ZWRGaWxsU3R5bGUgPSB0aGlzLmN0eC5maWxsU3R5bGU7XG5cdCAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kIHx8IFwiI2ZmZmZmZlwiO1xuXHQgICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBzYXZlZEZpbGxTdHlsZTtcblx0ICAgIGlmICh0cmFuc3BhcmVuY3kpIHtcblx0ICAgICAgY29uc3QgdHJhbnNwYXJlbnRDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcInRyYW5zcGFyZW50XCIsIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgICB0aGlzLmNvbXBvc2l0ZUN0eCA9IHRoaXMuY3R4O1xuXHQgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gdHJhbnNwYXJlbnRDYW52YXMuY2FudmFzO1xuXHQgICAgICB0aGlzLmN0eCA9IHRyYW5zcGFyZW50Q2FudmFzLmNvbnRleHQ7XG5cdCAgICAgIHRoaXMuY3R4LnNhdmUoKTtcblx0ICAgICAgdGhpcy5jdHgudHJhbnNmb3JtKC4uLigwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmNvbXBvc2l0ZUN0eCkpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jdHguc2F2ZSgpO1xuXHQgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuXHQgICAgaWYgKHRyYW5zZm9ybSkge1xuXHQgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4udHJhbnNmb3JtKTtcblx0ICAgICAgdGhpcy5vdXRwdXRTY2FsZVggPSB0cmFuc2Zvcm1bMF07XG5cdCAgICAgIHRoaXMub3V0cHV0U2NhbGVZID0gdHJhbnNmb3JtWzBdO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jdHgudHJhbnNmb3JtKC4uLnZpZXdwb3J0LnRyYW5zZm9ybSk7XG5cdCAgICB0aGlzLnZpZXdwb3J0U2NhbGUgPSB2aWV3cG9ydC5zY2FsZTtcblx0ICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG5cdCAgfVxuXHQgIGV4ZWN1dGVPcGVyYXRvckxpc3Qob3BlcmF0b3JMaXN0LCBleGVjdXRpb25TdGFydElkeCwgY29udGludWVDYWxsYmFjaywgc3RlcHBlcikge1xuXHQgICAgY29uc3QgYXJnc0FycmF5ID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheTtcblx0ICAgIGNvbnN0IGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTtcblx0ICAgIGxldCBpID0gZXhlY3V0aW9uU3RhcnRJZHggfHwgMDtcblx0ICAgIGNvbnN0IGFyZ3NBcnJheUxlbiA9IGFyZ3NBcnJheS5sZW5ndGg7XG5cdCAgICBpZiAoYXJnc0FycmF5TGVuID09PSBpKSB7XG5cdCAgICAgIHJldHVybiBpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY2h1bmtPcGVyYXRpb25zID0gYXJnc0FycmF5TGVuIC0gaSA+IEVYRUNVVElPTl9TVEVQUyAmJiB0eXBlb2YgY29udGludWVDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiO1xuXHQgICAgY29uc3QgZW5kVGltZSA9IGNodW5rT3BlcmF0aW9ucyA/IERhdGUubm93KCkgKyBFWEVDVVRJT05fVElNRSA6IDA7XG5cdCAgICBsZXQgc3RlcHMgPSAwO1xuXHQgICAgY29uc3QgY29tbW9uT2JqcyA9IHRoaXMuY29tbW9uT2Jqcztcblx0ICAgIGNvbnN0IG9ianMgPSB0aGlzLm9ianM7XG5cdCAgICBsZXQgZm5JZDtcblx0ICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgIGlmIChzdGVwcGVyICE9PSB1bmRlZmluZWQgJiYgaSA9PT0gc3RlcHBlci5uZXh0QnJlYWtQb2ludCkge1xuXHQgICAgICAgIHN0ZXBwZXIuYnJlYWtJdChpLCBjb250aW51ZUNhbGxiYWNrKTtcblx0ICAgICAgICByZXR1cm4gaTtcblx0ICAgICAgfVxuXHQgICAgICBmbklkID0gZm5BcnJheVtpXTtcblx0ICAgICAgaWYgKGZuSWQgIT09IF91dGlsLk9QUy5kZXBlbmRlbmN5KSB7XG5cdCAgICAgICAgdGhpc1tmbklkXS5hcHBseSh0aGlzLCBhcmdzQXJyYXlbaV0pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGZvciAoY29uc3QgZGVwT2JqSWQgb2YgYXJnc0FycmF5W2ldKSB7XG5cdCAgICAgICAgICBjb25zdCBvYmpzUG9vbCA9IGRlcE9iaklkLnN0YXJ0c1dpdGgoXCJnX1wiKSA/IGNvbW1vbk9ianMgOiBvYmpzO1xuXHQgICAgICAgICAgaWYgKCFvYmpzUG9vbC5oYXMoZGVwT2JqSWQpKSB7XG5cdCAgICAgICAgICAgIG9ianNQb29sLmdldChkZXBPYmpJZCwgY29udGludWVDYWxsYmFjayk7XG5cdCAgICAgICAgICAgIHJldHVybiBpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBpKys7XG5cdCAgICAgIGlmIChpID09PSBhcmdzQXJyYXlMZW4pIHtcblx0ICAgICAgICByZXR1cm4gaTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoY2h1bmtPcGVyYXRpb25zICYmICsrc3RlcHMgPiBFWEVDVVRJT05fU1RFUFMpIHtcblx0ICAgICAgICBpZiAoRGF0ZS5ub3coKSA+IGVuZFRpbWUpIHtcblx0ICAgICAgICAgIGNvbnRpbnVlQ2FsbGJhY2soKTtcblx0ICAgICAgICAgIHJldHVybiBpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGVwcyA9IDA7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgI3Jlc3RvcmVJbml0aWFsU3RhdGUoKSB7XG5cdCAgICB3aGlsZSAodGhpcy5zdGF0ZVN0YWNrLmxlbmd0aCB8fCB0aGlzLmluU01hc2tNb2RlKSB7XG5cdCAgICAgIHRoaXMucmVzdG9yZSgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuXHQgICAgaWYgKHRoaXMudHJhbnNwYXJlbnRDYW52YXMpIHtcblx0ICAgICAgdGhpcy5jdHggPSB0aGlzLmNvbXBvc2l0ZUN0eDtcblx0ICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuXHQgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG5cdCAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnRyYW5zcGFyZW50Q2FudmFzLCAwLCAwKTtcblx0ICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuXHQgICAgICB0aGlzLnRyYW5zcGFyZW50Q2FudmFzID0gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cdCAgZW5kRHJhd2luZygpIHtcblx0ICAgIHRoaXMuI3Jlc3RvcmVJbml0aWFsU3RhdGUoKTtcblx0ICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMuY2xlYXIoKTtcblx0ICAgIHRoaXMuY2FjaGVkUGF0dGVybnMuY2xlYXIoKTtcblx0ICAgIGZvciAoY29uc3QgY2FjaGUgb2YgdGhpcy5fY2FjaGVkQml0bWFwc01hcC52YWx1ZXMoKSkge1xuXHQgICAgICBmb3IgKGNvbnN0IGNhbnZhcyBvZiBjYWNoZS52YWx1ZXMoKSkge1xuXHQgICAgICAgIGlmICh0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpIHtcblx0ICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBjYWNoZS5jbGVhcigpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcC5jbGVhcigpO1xuXHQgICAgdGhpcy4jZHJhd0ZpbHRlcigpO1xuXHQgIH1cblx0ICAjZHJhd0ZpbHRlcigpIHtcblx0ICAgIGlmICh0aGlzLnBhZ2VDb2xvcnMpIHtcblx0ICAgICAgY29uc3QgaGNtRmlsdGVySWQgPSB0aGlzLmZpbHRlckZhY3RvcnkuYWRkSENNRmlsdGVyKHRoaXMucGFnZUNvbG9ycy5mb3JlZ3JvdW5kLCB0aGlzLnBhZ2VDb2xvcnMuYmFja2dyb3VuZCk7XG5cdCAgICAgIGlmIChoY21GaWx0ZXJJZCAhPT0gXCJub25lXCIpIHtcblx0ICAgICAgICBjb25zdCBzYXZlZEZpbHRlciA9IHRoaXMuY3R4LmZpbHRlcjtcblx0ICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSBoY21GaWx0ZXJJZDtcblx0ICAgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UodGhpcy5jdHguY2FudmFzLCAwLCAwKTtcblx0ICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSBzYXZlZEZpbHRlcjtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICBfc2NhbGVJbWFnZShpbWcsIGludmVyc2VUcmFuc2Zvcm0pIHtcblx0ICAgIGNvbnN0IHdpZHRoID0gaW1nLndpZHRoO1xuXHQgICAgY29uc3QgaGVpZ2h0ID0gaW1nLmhlaWdodDtcblx0ICAgIGxldCB3aWR0aFNjYWxlID0gTWF0aC5tYXgoTWF0aC5oeXBvdChpbnZlcnNlVHJhbnNmb3JtWzBdLCBpbnZlcnNlVHJhbnNmb3JtWzFdKSwgMSk7XG5cdCAgICBsZXQgaGVpZ2h0U2NhbGUgPSBNYXRoLm1heChNYXRoLmh5cG90KGludmVyc2VUcmFuc2Zvcm1bMl0sIGludmVyc2VUcmFuc2Zvcm1bM10pLCAxKTtcblx0ICAgIGxldCBwYWludFdpZHRoID0gd2lkdGgsXG5cdCAgICAgIHBhaW50SGVpZ2h0ID0gaGVpZ2h0O1xuXHQgICAgbGV0IHRtcENhbnZhc0lkID0gXCJwcmVzY2FsZTFcIjtcblx0ICAgIGxldCB0bXBDYW52YXMsIHRtcEN0eDtcblx0ICAgIHdoaWxlICh3aWR0aFNjYWxlID4gMiAmJiBwYWludFdpZHRoID4gMSB8fCBoZWlnaHRTY2FsZSA+IDIgJiYgcGFpbnRIZWlnaHQgPiAxKSB7XG5cdCAgICAgIGxldCBuZXdXaWR0aCA9IHBhaW50V2lkdGgsXG5cdCAgICAgICAgbmV3SGVpZ2h0ID0gcGFpbnRIZWlnaHQ7XG5cdCAgICAgIGlmICh3aWR0aFNjYWxlID4gMiAmJiBwYWludFdpZHRoID4gMSkge1xuXHQgICAgICAgIG5ld1dpZHRoID0gcGFpbnRXaWR0aCA+PSAxNjM4NCA/IE1hdGguZmxvb3IocGFpbnRXaWR0aCAvIDIpIC0gMSB8fCAxIDogTWF0aC5jZWlsKHBhaW50V2lkdGggLyAyKTtcblx0ICAgICAgICB3aWR0aFNjYWxlIC89IHBhaW50V2lkdGggLyBuZXdXaWR0aDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoaGVpZ2h0U2NhbGUgPiAyICYmIHBhaW50SGVpZ2h0ID4gMSkge1xuXHQgICAgICAgIG5ld0hlaWdodCA9IHBhaW50SGVpZ2h0ID49IDE2Mzg0ID8gTWF0aC5mbG9vcihwYWludEhlaWdodCAvIDIpIC0gMSB8fCAxIDogTWF0aC5jZWlsKHBhaW50SGVpZ2h0KSAvIDI7XG5cdCAgICAgICAgaGVpZ2h0U2NhbGUgLz0gcGFpbnRIZWlnaHQgLyBuZXdIZWlnaHQ7XG5cdCAgICAgIH1cblx0ICAgICAgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXModG1wQ2FudmFzSWQsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuXHQgICAgICB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcblx0ICAgICAgdG1wQ3R4LmNsZWFyUmVjdCgwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcblx0ICAgICAgdG1wQ3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIHBhaW50V2lkdGgsIHBhaW50SGVpZ2h0LCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcblx0ICAgICAgaW1nID0gdG1wQ2FudmFzLmNhbnZhcztcblx0ICAgICAgcGFpbnRXaWR0aCA9IG5ld1dpZHRoO1xuXHQgICAgICBwYWludEhlaWdodCA9IG5ld0hlaWdodDtcblx0ICAgICAgdG1wQ2FudmFzSWQgPSB0bXBDYW52YXNJZCA9PT0gXCJwcmVzY2FsZTFcIiA/IFwicHJlc2NhbGUyXCIgOiBcInByZXNjYWxlMVwiO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW1nLFxuXHQgICAgICBwYWludFdpZHRoLFxuXHQgICAgICBwYWludEhlaWdodFxuXHQgICAgfTtcblx0ICB9XG5cdCAgX2NyZWF0ZU1hc2tDYW52YXMoaW1nKSB7XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgd2lkdGgsXG5cdCAgICAgIGhlaWdodFxuXHQgICAgfSA9IGltZztcblx0ICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG5cdCAgICBjb25zdCBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuXHQgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpO1xuXHQgICAgbGV0IGNhY2hlLCBjYWNoZUtleSwgc2NhbGVkLCBtYXNrQ2FudmFzO1xuXHQgICAgaWYgKChpbWcuYml0bWFwIHx8IGltZy5kYXRhKSAmJiBpbWcuY291bnQgPiAxKSB7XG5cdCAgICAgIGNvbnN0IG1haW5LZXkgPSBpbWcuYml0bWFwIHx8IGltZy5kYXRhLmJ1ZmZlcjtcblx0ICAgICAgY2FjaGVLZXkgPSBKU09OLnN0cmluZ2lmeShpc1BhdHRlcm5GaWxsID8gY3VycmVudFRyYW5zZm9ybSA6IFtjdXJyZW50VHJhbnNmb3JtLnNsaWNlKDAsIDQpLCBmaWxsQ29sb3JdKTtcblx0ICAgICAgY2FjaGUgPSB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLmdldChtYWluS2V5KTtcblx0ICAgICAgaWYgKCFjYWNoZSkge1xuXHQgICAgICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuXHQgICAgICAgIHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAuc2V0KG1haW5LZXksIGNhY2hlKTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBjYWNoZWRJbWFnZSA9IGNhY2hlLmdldChjYWNoZUtleSk7XG5cdCAgICAgIGlmIChjYWNoZWRJbWFnZSAmJiAhaXNQYXR0ZXJuRmlsbCkge1xuXHQgICAgICAgIGNvbnN0IG9mZnNldFggPSBNYXRoLnJvdW5kKE1hdGgubWluKGN1cnJlbnRUcmFuc2Zvcm1bMF0sIGN1cnJlbnRUcmFuc2Zvcm1bMl0pICsgY3VycmVudFRyYW5zZm9ybVs0XSk7XG5cdCAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IE1hdGgucm91bmQoTWF0aC5taW4oY3VycmVudFRyYW5zZm9ybVsxXSwgY3VycmVudFRyYW5zZm9ybVszXSkgKyBjdXJyZW50VHJhbnNmb3JtWzVdKTtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgY2FudmFzOiBjYWNoZWRJbWFnZSxcblx0ICAgICAgICAgIG9mZnNldFgsXG5cdCAgICAgICAgICBvZmZzZXRZXG5cdCAgICAgICAgfTtcblx0ICAgICAgfVxuXHQgICAgICBzY2FsZWQgPSBjYWNoZWRJbWFnZTtcblx0ICAgIH1cblx0ICAgIGlmICghc2NhbGVkKSB7XG5cdCAgICAgIG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1hc2tDYW52YXNcIiwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ2FudmFzLmNvbnRleHQsIGltZyk7XG5cdCAgICB9XG5cdCAgICBsZXQgbWFza1RvQ2FudmFzID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0oY3VycmVudFRyYW5zZm9ybSwgWzEgLyB3aWR0aCwgMCwgMCwgLTEgLyBoZWlnaHQsIDAsIDBdKTtcblx0ICAgIG1hc2tUb0NhbnZhcyA9IF91dGlsLlV0aWwudHJhbnNmb3JtKG1hc2tUb0NhbnZhcywgWzEsIDAsIDAsIDEsIDAsIC1oZWlnaHRdKTtcblx0ICAgIGNvbnN0IGNvcmQxID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIG1hc2tUb0NhbnZhcyk7XG5cdCAgICBjb25zdCBjb3JkMiA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCBoZWlnaHRdLCBtYXNrVG9DYW52YXMpO1xuXHQgICAgY29uc3QgcmVjdCA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChbY29yZDFbMF0sIGNvcmQxWzFdLCBjb3JkMlswXSwgY29yZDJbMV1dKTtcblx0ICAgIGNvbnN0IGRyYXduV2lkdGggPSBNYXRoLnJvdW5kKHJlY3RbMl0gLSByZWN0WzBdKSB8fCAxO1xuXHQgICAgY29uc3QgZHJhd25IZWlnaHQgPSBNYXRoLnJvdW5kKHJlY3RbM10gLSByZWN0WzFdKSB8fCAxO1xuXHQgICAgY29uc3QgZmlsbENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiZmlsbENhbnZhc1wiLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCk7XG5cdCAgICBjb25zdCBmaWxsQ3R4ID0gZmlsbENhbnZhcy5jb250ZXh0O1xuXHQgICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGgubWluKGNvcmQxWzBdLCBjb3JkMlswXSk7XG5cdCAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5taW4oY29yZDFbMV0sIGNvcmQyWzFdKTtcblx0ICAgIGZpbGxDdHgudHJhbnNsYXRlKC1vZmZzZXRYLCAtb2Zmc2V0WSk7XG5cdCAgICBmaWxsQ3R4LnRyYW5zZm9ybSguLi5tYXNrVG9DYW52YXMpO1xuXHQgICAgaWYgKCFzY2FsZWQpIHtcblx0ICAgICAgc2NhbGVkID0gdGhpcy5fc2NhbGVJbWFnZShtYXNrQ2FudmFzLmNhbnZhcywgKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShmaWxsQ3R4KSk7XG5cdCAgICAgIHNjYWxlZCA9IHNjYWxlZC5pbWc7XG5cdCAgICAgIGlmIChjYWNoZSAmJiBpc1BhdHRlcm5GaWxsKSB7XG5cdCAgICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBzY2FsZWQpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBmaWxsQ3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGdldEltYWdlU21vb3RoaW5nRW5hYmxlZCgoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoZmlsbEN0eCksIGltZy5pbnRlcnBvbGF0ZSk7XG5cdCAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoZmlsbEN0eCwgc2NhbGVkLCAwLCAwLCBzY2FsZWQud2lkdGgsIHNjYWxlZC5oZWlnaHQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgZmlsbEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBcInNvdXJjZS1pblwiO1xuXHQgICAgY29uc3QgaW52ZXJzZSA9IF91dGlsLlV0aWwudHJhbnNmb3JtKCgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoZmlsbEN0eCksIFsxLCAwLCAwLCAxLCAtb2Zmc2V0WCwgLW9mZnNldFldKTtcblx0ICAgIGZpbGxDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbCA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgaW52ZXJzZSwgX3BhdHRlcm5faGVscGVyLlBhdGhUeXBlLkZJTEwpIDogZmlsbENvbG9yO1xuXHQgICAgZmlsbEN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblx0ICAgIGlmIChjYWNoZSAmJiAhaXNQYXR0ZXJuRmlsbCkge1xuXHQgICAgICB0aGlzLmNhY2hlZENhbnZhc2VzLmRlbGV0ZShcImZpbGxDYW52YXNcIik7XG5cdCAgICAgIGNhY2hlLnNldChjYWNoZUtleSwgZmlsbENhbnZhcy5jYW52YXMpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2FudmFzOiBmaWxsQ2FudmFzLmNhbnZhcyxcblx0ICAgICAgb2Zmc2V0WDogTWF0aC5yb3VuZChvZmZzZXRYKSxcblx0ICAgICAgb2Zmc2V0WTogTWF0aC5yb3VuZChvZmZzZXRZKVxuXHQgICAgfTtcblx0ICB9XG5cdCAgc2V0TGluZVdpZHRoKHdpZHRoKSB7XG5cdCAgICBpZiAod2lkdGggIT09IHRoaXMuY3VycmVudC5saW5lV2lkdGgpIHtcblx0ICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZyA9IG51bGw7XG5cdCAgICB9XG5cdCAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gd2lkdGg7XG5cdCAgICB0aGlzLmN0eC5saW5lV2lkdGggPSB3aWR0aDtcblx0ICB9XG5cdCAgc2V0TGluZUNhcChzdHlsZSkge1xuXHQgICAgdGhpcy5jdHgubGluZUNhcCA9IExJTkVfQ0FQX1NUWUxFU1tzdHlsZV07XG5cdCAgfVxuXHQgIHNldExpbmVKb2luKHN0eWxlKSB7XG5cdCAgICB0aGlzLmN0eC5saW5lSm9pbiA9IExJTkVfSk9JTl9TVFlMRVNbc3R5bGVdO1xuXHQgIH1cblx0ICBzZXRNaXRlckxpbWl0KGxpbWl0KSB7XG5cdCAgICB0aGlzLmN0eC5taXRlckxpbWl0ID0gbGltaXQ7XG5cdCAgfVxuXHQgIHNldERhc2goZGFzaEFycmF5LCBkYXNoUGhhc2UpIHtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIGN0eC5zZXRMaW5lRGFzaChkYXNoQXJyYXkpO1xuXHQgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBkYXNoUGhhc2U7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHNldFJlbmRlcmluZ0ludGVudChpbnRlbnQpIHt9XG5cdCAgc2V0RmxhdG5lc3MoZmxhdG5lc3MpIHt9XG5cdCAgc2V0R1N0YXRlKHN0YXRlcykge1xuXHQgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3RhdGVzKSB7XG5cdCAgICAgIHN3aXRjaCAoa2V5KSB7XG5cdCAgICAgICAgY2FzZSBcIkxXXCI6XG5cdCAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aCh2YWx1ZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiTENcIjpcblx0ICAgICAgICAgIHRoaXMuc2V0TGluZUNhcCh2YWx1ZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiTEpcIjpcblx0ICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4odmFsdWUpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcIk1MXCI6XG5cdCAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQodmFsdWUpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcIkRcIjpcblx0ICAgICAgICAgIHRoaXMuc2V0RGFzaCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcIlJJXCI6XG5cdCAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudCh2YWx1ZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiRkxcIjpcblx0ICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3ModmFsdWUpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcIkZvbnRcIjpcblx0ICAgICAgICAgIHRoaXMuc2V0Rm9udCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcIkNBXCI6XG5cdCAgICAgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSB2YWx1ZTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJjYVwiOlxuXHQgICAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSA9IHZhbHVlO1xuXHQgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQWxwaGEgPSB2YWx1ZTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJCTVwiOlxuXHQgICAgICAgICAgdGhpcy5jdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gdmFsdWU7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiU01hc2tcIjpcblx0ICAgICAgICAgIHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayA9IHZhbHVlID8gdGhpcy50ZW1wU01hc2sgOiBudWxsO1xuXHQgICAgICAgICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuXHQgICAgICAgICAgdGhpcy5jaGVja1NNYXNrU3RhdGUoKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJUUlwiOlxuXHQgICAgICAgICAgdGhpcy5jdHguZmlsdGVyID0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRGaWx0ZXIodmFsdWUpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0IGluU01hc2tNb2RlKCkge1xuXHQgICAgcmV0dXJuICEhdGhpcy5zdXNwZW5kZWRDdHg7XG5cdCAgfVxuXHQgIGNoZWNrU01hc2tTdGF0ZSgpIHtcblx0ICAgIGNvbnN0IGluU01hc2tNb2RlID0gdGhpcy5pblNNYXNrTW9kZTtcblx0ICAgIGlmICh0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgJiYgIWluU01hc2tNb2RlKSB7XG5cdCAgICAgIHRoaXMuYmVnaW5TTWFza01vZGUoKTtcblx0ICAgIH0gZWxzZSBpZiAoIXRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAmJiBpblNNYXNrTW9kZSkge1xuXHQgICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBiZWdpblNNYXNrTW9kZSgpIHtcblx0ICAgIGlmICh0aGlzLmluU01hc2tNb2RlKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcImJlZ2luU01hc2tNb2RlIGNhbGxlZCB3aGlsZSBhbHJlYWR5IGluIHNtYXNrIG1vZGVcIik7XG5cdCAgICB9XG5cdCAgICBjb25zdCBkcmF3bldpZHRoID0gdGhpcy5jdHguY2FudmFzLndpZHRoO1xuXHQgICAgY29uc3QgZHJhd25IZWlnaHQgPSB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0O1xuXHQgICAgY29uc3QgY2FjaGVJZCA9IFwic21hc2tHcm91cEF0XCIgKyB0aGlzLmdyb3VwTGV2ZWw7XG5cdCAgICBjb25zdCBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoY2FjaGVJZCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQpO1xuXHQgICAgdGhpcy5zdXNwZW5kZWRDdHggPSB0aGlzLmN0eDtcblx0ICAgIHRoaXMuY3R4ID0gc2NyYXRjaENhbnZhcy5jb250ZXh0O1xuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBjdHguc2V0VHJhbnNmb3JtKC4uLigwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLnN1c3BlbmRlZEN0eCkpO1xuXHQgICAgY29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LCBjdHgpO1xuXHQgICAgbWlycm9yQ29udGV4dE9wZXJhdGlvbnMoY3R4LCB0aGlzLnN1c3BlbmRlZEN0eCk7XG5cdCAgICB0aGlzLnNldEdTdGF0ZShbW1wiQk1cIiwgXCJzb3VyY2Utb3ZlclwiXSwgW1wiY2FcIiwgMV0sIFtcIkNBXCIsIDFdXSk7XG5cdCAgfVxuXHQgIGVuZFNNYXNrTW9kZSgpIHtcblx0ICAgIGlmICghdGhpcy5pblNNYXNrTW9kZSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbmRTTWFza01vZGUgY2FsbGVkIHdoaWxlIG5vdCBpbiBzbWFzayBtb2RlXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jdHguX3JlbW92ZU1pcnJvcmluZygpO1xuXHQgICAgY29weUN0eFN0YXRlKHRoaXMuY3R4LCB0aGlzLnN1c3BlbmRlZEN0eCk7XG5cdCAgICB0aGlzLmN0eCA9IHRoaXMuc3VzcGVuZGVkQ3R4O1xuXHQgICAgdGhpcy5zdXNwZW5kZWRDdHggPSBudWxsO1xuXHQgIH1cblx0ICBjb21wb3NlKGRpcnR5Qm94KSB7XG5cdCAgICBpZiAoIXRoaXMuY3VycmVudC5hY3RpdmVTTWFzaykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoIWRpcnR5Qm94KSB7XG5cdCAgICAgIGRpcnR5Qm94ID0gWzAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodF07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBkaXJ0eUJveFswXSA9IE1hdGguZmxvb3IoZGlydHlCb3hbMF0pO1xuXHQgICAgICBkaXJ0eUJveFsxXSA9IE1hdGguZmxvb3IoZGlydHlCb3hbMV0pO1xuXHQgICAgICBkaXJ0eUJveFsyXSA9IE1hdGguY2VpbChkaXJ0eUJveFsyXSk7XG5cdCAgICAgIGRpcnR5Qm94WzNdID0gTWF0aC5jZWlsKGRpcnR5Qm94WzNdKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHNtYXNrID0gdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrO1xuXHQgICAgY29uc3Qgc3VzcGVuZGVkQ3R4ID0gdGhpcy5zdXNwZW5kZWRDdHg7XG5cdCAgICBjb21wb3NlU01hc2soc3VzcGVuZGVkQ3R4LCBzbWFzaywgdGhpcy5jdHgsIGRpcnR5Qm94KTtcblx0ICAgIHRoaXMuY3R4LnNhdmUoKTtcblx0ICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcblx0ICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuXHQgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuXHQgIH1cblx0ICBzYXZlKCkge1xuXHQgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcblx0ICAgICAgY29weUN0eFN0YXRlKHRoaXMuY3R4LCB0aGlzLnN1c3BlbmRlZEN0eCk7XG5cdCAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4LnNhdmUoKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuY3R4LnNhdmUoKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IG9sZCA9IHRoaXMuY3VycmVudDtcblx0ICAgIHRoaXMuc3RhdGVTdGFjay5wdXNoKG9sZCk7XG5cdCAgICB0aGlzLmN1cnJlbnQgPSBvbGQuY2xvbmUoKTtcblx0ICB9XG5cdCAgcmVzdG9yZSgpIHtcblx0ICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoID09PSAwICYmIHRoaXMuaW5TTWFza01vZGUpIHtcblx0ICAgICAgdGhpcy5lbmRTTWFza01vZGUoKTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoICE9PSAwKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuc3RhdGVTdGFjay5wb3AoKTtcblx0ICAgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcblx0ICAgICAgICB0aGlzLnN1c3BlbmRlZEN0eC5yZXN0b3JlKCk7XG5cdCAgICAgICAgY29weUN0eFN0YXRlKHRoaXMuc3VzcGVuZGVkQ3R4LCB0aGlzLmN0eCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuY2hlY2tTTWFza1N0YXRlKCk7XG5cdCAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuXHQgICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nID0gbnVsbDtcblx0ICAgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKSB7XG5cdCAgICB0aGlzLmN0eC50cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG5cdCAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nID0gbnVsbDtcblx0ICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuXHQgIH1cblx0ICBjb25zdHJ1Y3RQYXRoKG9wcywgYXJncywgbWluTWF4KSB7XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICBsZXQgeCA9IGN1cnJlbnQueCxcblx0ICAgICAgeSA9IGN1cnJlbnQueTtcblx0ICAgIGxldCBzdGFydFgsIHN0YXJ0WTtcblx0ICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3R4KTtcblx0ICAgIGNvbnN0IGlzU2NhbGluZ01hdHJpeCA9IGN1cnJlbnRUcmFuc2Zvcm1bMF0gPT09IDAgJiYgY3VycmVudFRyYW5zZm9ybVszXSA9PT0gMCB8fCBjdXJyZW50VHJhbnNmb3JtWzFdID09PSAwICYmIGN1cnJlbnRUcmFuc2Zvcm1bMl0gPT09IDA7XG5cdCAgICBjb25zdCBtaW5NYXhGb3JCZXppZXIgPSBpc1NjYWxpbmdNYXRyaXggPyBtaW5NYXguc2xpY2UoMCkgOiBudWxsO1xuXHQgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpaSA9IG9wcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdCAgICAgIHN3aXRjaCAob3BzW2ldIHwgMCkge1xuXHQgICAgICAgIGNhc2UgX3V0aWwuT1BTLnJlY3RhbmdsZTpcblx0ICAgICAgICAgIHggPSBhcmdzW2orK107XG5cdCAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuXHQgICAgICAgICAgY29uc3Qgd2lkdGggPSBhcmdzW2orK107XG5cdCAgICAgICAgICBjb25zdCBoZWlnaHQgPSBhcmdzW2orK107XG5cdCAgICAgICAgICBjb25zdCB4dyA9IHggKyB3aWR0aDtcblx0ICAgICAgICAgIGNvbnN0IHloID0geSArIGhlaWdodDtcblx0ICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG5cdCAgICAgICAgICBpZiAod2lkdGggPT09IDAgfHwgaGVpZ2h0ID09PSAwKSB7XG5cdCAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHloKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHkpO1xuXHQgICAgICAgICAgICBjdHgubGluZVRvKHh3LCB5aCk7XG5cdCAgICAgICAgICAgIGN0eC5saW5lVG8oeCwgeWgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKCFpc1NjYWxpbmdNYXRyaXgpIHtcblx0ICAgICAgICAgICAgY3VycmVudC51cGRhdGVSZWN0TWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIFt4LCB5LCB4dywgeWhdKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1vdmVUbzpcblx0ICAgICAgICAgIHggPSBhcmdzW2orK107XG5cdCAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuXHQgICAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTtcblx0ICAgICAgICAgIGlmICghaXNTY2FsaW5nTWF0cml4KSB7XG5cdCAgICAgICAgICAgIGN1cnJlbnQudXBkYXRlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCB4LCB5KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuT1BTLmxpbmVUbzpcblx0ICAgICAgICAgIHggPSBhcmdzW2orK107XG5cdCAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuXHQgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTtcblx0ICAgICAgICAgIGlmICghaXNTY2FsaW5nTWF0cml4KSB7XG5cdCAgICAgICAgICAgIGN1cnJlbnQudXBkYXRlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCB4LCB5KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG86XG5cdCAgICAgICAgICBzdGFydFggPSB4O1xuXHQgICAgICAgICAgc3RhcnRZID0geTtcblx0ICAgICAgICAgIHggPSBhcmdzW2ogKyA0XTtcblx0ICAgICAgICAgIHkgPSBhcmdzW2ogKyA1XTtcblx0ICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCBhcmdzW2ogKyAyXSwgYXJnc1tqICsgM10sIHgsIHkpO1xuXHQgICAgICAgICAgY3VycmVudC51cGRhdGVDdXJ2ZVBhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgc3RhcnRYLCBzdGFydFksIGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCBhcmdzW2ogKyAyXSwgYXJnc1tqICsgM10sIHgsIHksIG1pbk1heEZvckJlemllcik7XG5cdCAgICAgICAgICBqICs9IDY7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIF91dGlsLk9QUy5jdXJ2ZVRvMjpcblx0ICAgICAgICAgIHN0YXJ0WCA9IHg7XG5cdCAgICAgICAgICBzdGFydFkgPSB5O1xuXHQgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oeCwgeSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSk7XG5cdCAgICAgICAgICBjdXJyZW50LnVwZGF0ZUN1cnZlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBzdGFydFgsIHN0YXJ0WSwgeCwgeSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSwgbWluTWF4Rm9yQmV6aWVyKTtcblx0ICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcblx0ICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcblx0ICAgICAgICAgIGogKz0gNDtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8zOlxuXHQgICAgICAgICAgc3RhcnRYID0geDtcblx0ICAgICAgICAgIHN0YXJ0WSA9IHk7XG5cdCAgICAgICAgICB4ID0gYXJnc1tqICsgMl07XG5cdCAgICAgICAgICB5ID0gYXJnc1tqICsgM107XG5cdCAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyhhcmdzW2pdLCBhcmdzW2ogKyAxXSwgeCwgeSwgeCwgeSk7XG5cdCAgICAgICAgICBjdXJyZW50LnVwZGF0ZUN1cnZlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBzdGFydFgsIHN0YXJ0WSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIHgsIHksIHgsIHksIG1pbk1heEZvckJlemllcik7XG5cdCAgICAgICAgICBqICs9IDQ7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZVBhdGg6XG5cdCAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKGlzU2NhbGluZ01hdHJpeCkge1xuXHQgICAgICBjdXJyZW50LnVwZGF0ZVNjYWxpbmdQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIG1pbk1heEZvckJlemllcik7XG5cdCAgICB9XG5cdCAgICBjdXJyZW50LnNldEN1cnJlbnRQb2ludCh4LCB5KTtcblx0ICB9XG5cdCAgY2xvc2VQYXRoKCkge1xuXHQgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG5cdCAgfVxuXHQgIHN0cm9rZShjb25zdW1lUGF0aCA9IHRydWUpIHtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgY29uc3Qgc3Ryb2tlQ29sb3IgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3I7XG5cdCAgICBjdHguZ2xvYmFsQWxwaGEgPSB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGE7XG5cdCAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICBpZiAodHlwZW9mIHN0cm9rZUNvbG9yID09PSBcIm9iamVjdFwiICYmIHN0cm9rZUNvbG9yPy5nZXRQYXR0ZXJuKSB7XG5cdCAgICAgICAgY3R4LnNhdmUoKTtcblx0ICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShjdHgpLCBfcGF0dGVybl9oZWxwZXIuUGF0aFR5cGUuU1RST0tFKTtcblx0ICAgICAgICB0aGlzLnJlc2NhbGVBbmRTdHJva2UoZmFsc2UpO1xuXHQgICAgICAgIGN0eC5yZXN0b3JlKCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5yZXNjYWxlQW5kU3Ryb2tlKHRydWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAoY29uc3VtZVBhdGgpIHtcblx0ICAgICAgdGhpcy5jb25zdW1lUGF0aCh0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpKTtcblx0ICAgIH1cblx0ICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5maWxsQWxwaGE7XG5cdCAgfVxuXHQgIGNsb3NlU3Ryb2tlKCkge1xuXHQgICAgdGhpcy5jbG9zZVBhdGgoKTtcblx0ICAgIHRoaXMuc3Ryb2tlKCk7XG5cdCAgfVxuXHQgIGZpbGwoY29uc3VtZVBhdGggPSB0cnVlKSB7XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG5cdCAgICBjb25zdCBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuXHQgICAgbGV0IG5lZWRSZXN0b3JlID0gZmFsc2U7XG5cdCAgICBpZiAoaXNQYXR0ZXJuRmlsbCkge1xuXHQgICAgICBjdHguc2F2ZSgpO1xuXHQgICAgICBjdHguZmlsbFN0eWxlID0gZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGN0eCksIF9wYXR0ZXJuX2hlbHBlci5QYXRoVHlwZS5GSUxMKTtcblx0ICAgICAgbmVlZFJlc3RvcmUgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgY29uc3QgaW50ZXJzZWN0ID0gdGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKTtcblx0ICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlICYmIGludGVyc2VjdCAhPT0gbnVsbCkge1xuXHQgICAgICBpZiAodGhpcy5wZW5kaW5nRU9GaWxsKSB7XG5cdCAgICAgICAgY3R4LmZpbGwoXCJldmVub2RkXCIpO1xuXHQgICAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGN0eC5maWxsKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChuZWVkUmVzdG9yZSkge1xuXHQgICAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgfVxuXHQgICAgaWYgKGNvbnN1bWVQYXRoKSB7XG5cdCAgICAgIHRoaXMuY29uc3VtZVBhdGgoaW50ZXJzZWN0KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZW9GaWxsKCkge1xuXHQgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcblx0ICAgIHRoaXMuZmlsbCgpO1xuXHQgIH1cblx0ICBmaWxsU3Ryb2tlKCkge1xuXHQgICAgdGhpcy5maWxsKGZhbHNlKTtcblx0ICAgIHRoaXMuc3Ryb2tlKGZhbHNlKTtcblx0ICAgIHRoaXMuY29uc3VtZVBhdGgoKTtcblx0ICB9XG5cdCAgZW9GaWxsU3Ryb2tlKCkge1xuXHQgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcblx0ICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuXHQgIH1cblx0ICBjbG9zZUZpbGxTdHJva2UoKSB7XG5cdCAgICB0aGlzLmNsb3NlUGF0aCgpO1xuXHQgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG5cdCAgfVxuXHQgIGNsb3NlRU9GaWxsU3Ryb2tlKCkge1xuXHQgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gdHJ1ZTtcblx0ICAgIHRoaXMuY2xvc2VQYXRoKCk7XG5cdCAgICB0aGlzLmZpbGxTdHJva2UoKTtcblx0ICB9XG5cdCAgZW5kUGF0aCgpIHtcblx0ICAgIHRoaXMuY29uc3VtZVBhdGgoKTtcblx0ICB9XG5cdCAgY2xpcCgpIHtcblx0ICAgIHRoaXMucGVuZGluZ0NsaXAgPSBOT1JNQUxfQ0xJUDtcblx0ICB9XG5cdCAgZW9DbGlwKCkge1xuXHQgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IEVPX0NMSVA7XG5cdCAgfVxuXHQgIGJlZ2luVGV4dCgpIHtcblx0ICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYO1xuXHQgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IDE7XG5cdCAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7XG5cdCAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG5cdCAgfVxuXHQgIGVuZFRleHQoKSB7XG5cdCAgICBjb25zdCBwYXRocyA9IHRoaXMucGVuZGluZ1RleHRQYXRocztcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjdHguc2F2ZSgpO1xuXHQgICAgY3R4LmJlZ2luUGF0aCgpO1xuXHQgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG5cdCAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oLi4ucGF0aC50cmFuc2Zvcm0pO1xuXHQgICAgICBjdHgudHJhbnNsYXRlKHBhdGgueCwgcGF0aC55KTtcblx0ICAgICAgcGF0aC5hZGRUb1BhdGgoY3R4LCBwYXRoLmZvbnRTaXplKTtcblx0ICAgIH1cblx0ICAgIGN0eC5yZXN0b3JlKCk7XG5cdCAgICBjdHguY2xpcCgpO1xuXHQgICAgY3R4LmJlZ2luUGF0aCgpO1xuXHQgICAgZGVsZXRlIHRoaXMucGVuZGluZ1RleHRQYXRocztcblx0ICB9XG5cdCAgc2V0Q2hhclNwYWNpbmcoc3BhY2luZykge1xuXHQgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gc3BhY2luZztcblx0ICB9XG5cdCAgc2V0V29yZFNwYWNpbmcoc3BhY2luZykge1xuXHQgICAgdGhpcy5jdXJyZW50LndvcmRTcGFjaW5nID0gc3BhY2luZztcblx0ICB9XG5cdCAgc2V0SFNjYWxlKHNjYWxlKSB7XG5cdCAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHNjYWxlIC8gMTAwO1xuXHQgIH1cblx0ICBzZXRMZWFkaW5nKGxlYWRpbmcpIHtcblx0ICAgIHRoaXMuY3VycmVudC5sZWFkaW5nID0gLWxlYWRpbmc7XG5cdCAgfVxuXHQgIHNldEZvbnQoZm9udFJlZk5hbWUsIHNpemUpIHtcblx0ICAgIGNvbnN0IGZvbnRPYmogPSB0aGlzLmNvbW1vbk9ianMuZ2V0KGZvbnRSZWZOYW1lKTtcblx0ICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICBpZiAoIWZvbnRPYmopIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBmaW5kIGZvbnQgZm9yICR7Zm9udFJlZk5hbWV9YCk7XG5cdCAgICB9XG5cdCAgICBjdXJyZW50LmZvbnRNYXRyaXggPSBmb250T2JqLmZvbnRNYXRyaXggfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7XG5cdCAgICBpZiAoY3VycmVudC5mb250TWF0cml4WzBdID09PSAwIHx8IGN1cnJlbnQuZm9udE1hdHJpeFszXSA9PT0gMCkge1xuXHQgICAgICAoMCwgX3V0aWwud2FybikoXCJJbnZhbGlkIGZvbnQgbWF0cml4IGZvciBmb250IFwiICsgZm9udFJlZk5hbWUpO1xuXHQgICAgfVxuXHQgICAgaWYgKHNpemUgPCAwKSB7XG5cdCAgICAgIHNpemUgPSAtc2l6ZTtcblx0ICAgICAgY3VycmVudC5mb250RGlyZWN0aW9uID0gLTE7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAxO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jdXJyZW50LmZvbnQgPSBmb250T2JqO1xuXHQgICAgdGhpcy5jdXJyZW50LmZvbnRTaXplID0gc2l6ZTtcblx0ICAgIGlmIChmb250T2JqLmlzVHlwZTNGb250KSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IG5hbWUgPSBmb250T2JqLmxvYWRlZE5hbWUgfHwgXCJzYW5zLXNlcmlmXCI7XG5cdCAgICBsZXQgYm9sZCA9IFwibm9ybWFsXCI7XG5cdCAgICBpZiAoZm9udE9iai5ibGFjaykge1xuXHQgICAgICBib2xkID0gXCI5MDBcIjtcblx0ICAgIH0gZWxzZSBpZiAoZm9udE9iai5ib2xkKSB7XG5cdCAgICAgIGJvbGQgPSBcImJvbGRcIjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGl0YWxpYyA9IGZvbnRPYmouaXRhbGljID8gXCJpdGFsaWNcIiA6IFwibm9ybWFsXCI7XG5cdCAgICBjb25zdCB0eXBlZmFjZSA9IGBcIiR7bmFtZX1cIiwgJHtmb250T2JqLmZhbGxiYWNrTmFtZX1gO1xuXHQgICAgbGV0IGJyb3dzZXJGb250U2l6ZSA9IHNpemU7XG5cdCAgICBpZiAoc2l6ZSA8IE1JTl9GT05UX1NJWkUpIHtcblx0ICAgICAgYnJvd3NlckZvbnRTaXplID0gTUlOX0ZPTlRfU0laRTtcblx0ICAgIH0gZWxzZSBpZiAoc2l6ZSA+IE1BWF9GT05UX1NJWkUpIHtcblx0ICAgICAgYnJvd3NlckZvbnRTaXplID0gTUFYX0ZPTlRfU0laRTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY3VycmVudC5mb250U2l6ZVNjYWxlID0gc2l6ZSAvIGJyb3dzZXJGb250U2l6ZTtcblx0ICAgIHRoaXMuY3R4LmZvbnQgPSBgJHtpdGFsaWN9ICR7Ym9sZH0gJHticm93c2VyRm9udFNpemV9cHggJHt0eXBlZmFjZX1gO1xuXHQgIH1cblx0ICBzZXRUZXh0UmVuZGVyaW5nTW9kZShtb2RlKSB7XG5cdCAgICB0aGlzLmN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPSBtb2RlO1xuXHQgIH1cblx0ICBzZXRUZXh0UmlzZShyaXNlKSB7XG5cdCAgICB0aGlzLmN1cnJlbnQudGV4dFJpc2UgPSByaXNlO1xuXHQgIH1cblx0ICBtb3ZlVGV4dCh4LCB5KSB7XG5cdCAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCArPSB4O1xuXHQgICAgdGhpcy5jdXJyZW50LnkgPSB0aGlzLmN1cnJlbnQubGluZVkgKz0geTtcblx0ICB9XG5cdCAgc2V0TGVhZGluZ01vdmVUZXh0KHgsIHkpIHtcblx0ICAgIHRoaXMuc2V0TGVhZGluZygteSk7XG5cdCAgICB0aGlzLm1vdmVUZXh0KHgsIHkpO1xuXHQgIH1cblx0ICBzZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHtcblx0ICAgIHRoaXMuY3VycmVudC50ZXh0TWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuXHQgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IE1hdGguaHlwb3QoYSwgYik7XG5cdCAgICB0aGlzLmN1cnJlbnQueCA9IHRoaXMuY3VycmVudC5saW5lWCA9IDA7XG5cdCAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSA9IDA7XG5cdCAgfVxuXHQgIG5leHRMaW5lKCkge1xuXHQgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG5cdCAgfVxuXHQgIHBhaW50Q2hhcihjaGFyYWN0ZXIsIHgsIHksIHBhdHRlcm5UcmFuc2Zvcm0pIHtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgIGNvbnN0IGZvbnQgPSBjdXJyZW50LmZvbnQ7XG5cdCAgICBjb25zdCB0ZXh0UmVuZGVyaW5nTW9kZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGU7XG5cdCAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemUgLyBjdXJyZW50LmZvbnRTaXplU2NhbGU7XG5cdCAgICBjb25zdCBmaWxsU3Ryb2tlTW9kZSA9IHRleHRSZW5kZXJpbmdNb2RlICYgX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcblx0ICAgIGNvbnN0IGlzQWRkVG9QYXRoU2V0ID0gISEodGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHKTtcblx0ICAgIGNvbnN0IHBhdHRlcm5GaWxsID0gY3VycmVudC5wYXR0ZXJuRmlsbCAmJiAhZm9udC5taXNzaW5nRmlsZTtcblx0ICAgIGxldCBhZGRUb1BhdGg7XG5cdCAgICBpZiAoZm9udC5kaXNhYmxlRm9udEZhY2UgfHwgaXNBZGRUb1BhdGhTZXQgfHwgcGF0dGVybkZpbGwpIHtcblx0ICAgICAgYWRkVG9QYXRoID0gZm9udC5nZXRQYXRoR2VuZXJhdG9yKHRoaXMuY29tbW9uT2JqcywgY2hhcmFjdGVyKTtcblx0ICAgIH1cblx0ICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBwYXR0ZXJuRmlsbCkge1xuXHQgICAgICBjdHguc2F2ZSgpO1xuXHQgICAgICBjdHgudHJhbnNsYXRlKHgsIHkpO1xuXHQgICAgICBjdHguYmVnaW5QYXRoKCk7XG5cdCAgICAgIGFkZFRvUGF0aChjdHgsIGZvbnRTaXplKTtcblx0ICAgICAgaWYgKHBhdHRlcm5UcmFuc2Zvcm0pIHtcblx0ICAgICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLnBhdHRlcm5UcmFuc2Zvcm0pO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcblx0ICAgICAgICBjdHguZmlsbCgpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuXHQgICAgICAgIGN0eC5zdHJva2UoKTtcblx0ICAgICAgfVxuXHQgICAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuXHQgICAgICAgIGN0eC5maWxsVGV4dChjaGFyYWN0ZXIsIHgsIHkpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuU1RST0tFIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuXHQgICAgICAgIGN0eC5zdHJva2VUZXh0KGNoYXJhY3RlciwgeCwgeSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChpc0FkZFRvUGF0aFNldCkge1xuXHQgICAgICBjb25zdCBwYXRocyA9IHRoaXMucGVuZGluZ1RleHRQYXRocyB8fCAodGhpcy5wZW5kaW5nVGV4dFBhdGhzID0gW10pO1xuXHQgICAgICBwYXRocy5wdXNoKHtcblx0ICAgICAgICB0cmFuc2Zvcm06ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpLFxuXHQgICAgICAgIHgsXG5cdCAgICAgICAgeSxcblx0ICAgICAgICBmb250U2l6ZSxcblx0ICAgICAgICBhZGRUb1BhdGhcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldCBpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCgpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgY29udGV4dDogY3R4XG5cdCAgICB9ID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZFwiLCAxMCwgMTApO1xuXHQgICAgY3R4LnNjYWxlKDEuNSwgMSk7XG5cdCAgICBjdHguZmlsbFRleHQoXCJJXCIsIDAsIDEwKTtcblx0ICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIDEwLCAxMCkuZGF0YTtcblx0ICAgIGxldCBlbmFibGVkID0gZmFsc2U7XG5cdCAgICBmb3IgKGxldCBpID0gMzsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcblx0ICAgICAgaWYgKGRhdGFbaV0gPiAwICYmIGRhdGFbaV0gPCAyNTUpIHtcblx0ICAgICAgICBlbmFibGVkID0gdHJ1ZTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiaXNGb250U3VicGl4ZWxBQUVuYWJsZWRcIiwgZW5hYmxlZCk7XG5cdCAgfVxuXHQgIHNob3dUZXh0KGdseXBocykge1xuXHQgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgIGNvbnN0IGZvbnQgPSBjdXJyZW50LmZvbnQ7XG5cdCAgICBpZiAoZm9udC5pc1R5cGUzRm9udCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5zaG93VHlwZTNUZXh0KGdseXBocyk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7XG5cdCAgICBpZiAoZm9udFNpemUgPT09IDApIHtcblx0ICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgY29uc3QgZm9udFNpemVTY2FsZSA9IGN1cnJlbnQuZm9udFNpemVTY2FsZTtcblx0ICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZztcblx0ICAgIGNvbnN0IHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZztcblx0ICAgIGNvbnN0IGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247XG5cdCAgICBjb25zdCB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjtcblx0ICAgIGNvbnN0IGdseXBoc0xlbmd0aCA9IGdseXBocy5sZW5ndGg7XG5cdCAgICBjb25zdCB2ZXJ0aWNhbCA9IGZvbnQudmVydGljYWw7XG5cdCAgICBjb25zdCBzcGFjaW5nRGlyID0gdmVydGljYWwgPyAxIDogLTE7XG5cdCAgICBjb25zdCBkZWZhdWx0Vk1ldHJpY3MgPSBmb250LmRlZmF1bHRWTWV0cmljcztcblx0ICAgIGNvbnN0IHdpZHRoQWR2YW5jZVNjYWxlID0gZm9udFNpemUgKiBjdXJyZW50LmZvbnRNYXRyaXhbMF07XG5cdCAgICBjb25zdCBzaW1wbGVGaWxsVGV4dCA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgJiYgIWZvbnQuZGlzYWJsZUZvbnRGYWNlICYmICFjdXJyZW50LnBhdHRlcm5GaWxsO1xuXHQgICAgY3R4LnNhdmUoKTtcblx0ICAgIGN0eC50cmFuc2Zvcm0oLi4uY3VycmVudC50ZXh0TWF0cml4KTtcblx0ICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkgKyBjdXJyZW50LnRleHRSaXNlKTtcblx0ICAgIGlmIChmb250RGlyZWN0aW9uID4gMCkge1xuXHQgICAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgLTEpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIDEpO1xuXHQgICAgfVxuXHQgICAgbGV0IHBhdHRlcm5UcmFuc2Zvcm07XG5cdCAgICBpZiAoY3VycmVudC5wYXR0ZXJuRmlsbCkge1xuXHQgICAgICBjdHguc2F2ZSgpO1xuXHQgICAgICBjb25zdCBwYXR0ZXJuID0gY3VycmVudC5maWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMsICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoY3R4KSwgX3BhdHRlcm5faGVscGVyLlBhdGhUeXBlLkZJTEwpO1xuXHQgICAgICBwYXR0ZXJuVHJhbnNmb3JtID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCk7XG5cdCAgICAgIGN0eC5yZXN0b3JlKCk7XG5cdCAgICAgIGN0eC5maWxsU3R5bGUgPSBwYXR0ZXJuO1xuXHQgICAgfVxuXHQgICAgbGV0IGxpbmVXaWR0aCA9IGN1cnJlbnQubGluZVdpZHRoO1xuXHQgICAgY29uc3Qgc2NhbGUgPSBjdXJyZW50LnRleHRNYXRyaXhTY2FsZTtcblx0ICAgIGlmIChzY2FsZSA9PT0gMCB8fCBsaW5lV2lkdGggPT09IDApIHtcblx0ICAgICAgY29uc3QgZmlsbFN0cm9rZU1vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcblx0ICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG5cdCAgICAgICAgbGluZVdpZHRoID0gdGhpcy5nZXRTaW5nbGVQaXhlbFdpZHRoKCk7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGxpbmVXaWR0aCAvPSBzY2FsZTtcblx0ICAgIH1cblx0ICAgIGlmIChmb250U2l6ZVNjYWxlICE9PSAxLjApIHtcblx0ICAgICAgY3R4LnNjYWxlKGZvbnRTaXplU2NhbGUsIGZvbnRTaXplU2NhbGUpO1xuXHQgICAgICBsaW5lV2lkdGggLz0gZm9udFNpemVTY2FsZTtcblx0ICAgIH1cblx0ICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG5cdCAgICBpZiAoZm9udC5pc0ludmFsaWRQREZqc0ZvbnQpIHtcblx0ICAgICAgY29uc3QgY2hhcnMgPSBbXTtcblx0ICAgICAgbGV0IHdpZHRoID0gMDtcblx0ICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHtcblx0ICAgICAgICBjaGFycy5wdXNoKGdseXBoLnVuaWNvZGUpO1xuXHQgICAgICAgIHdpZHRoICs9IGdseXBoLndpZHRoO1xuXHQgICAgICB9XG5cdCAgICAgIGN0eC5maWxsVGV4dChjaGFycy5qb2luKFwiXCIpLCAwLCAwKTtcblx0ICAgICAgY3VycmVudC54ICs9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgKiB0ZXh0SFNjYWxlO1xuXHQgICAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgICB0aGlzLmNvbXBvc2UoKTtcblx0ICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblx0ICAgIH1cblx0ICAgIGxldCB4ID0gMCxcblx0ICAgICAgaTtcblx0ICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHNMZW5ndGg7ICsraSkge1xuXHQgICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tpXTtcblx0ICAgICAgaWYgKHR5cGVvZiBnbHlwaCA9PT0gXCJudW1iZXJcIikge1xuXHQgICAgICAgIHggKz0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwO1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGxldCByZXN0b3JlTmVlZGVkID0gZmFsc2U7XG5cdCAgICAgIGNvbnN0IHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZztcblx0ICAgICAgY29uc3QgY2hhcmFjdGVyID0gZ2x5cGguZm9udENoYXI7XG5cdCAgICAgIGNvbnN0IGFjY2VudCA9IGdseXBoLmFjY2VudDtcblx0ICAgICAgbGV0IHNjYWxlZFgsIHNjYWxlZFk7XG5cdCAgICAgIGxldCB3aWR0aCA9IGdseXBoLndpZHRoO1xuXHQgICAgICBpZiAodmVydGljYWwpIHtcblx0ICAgICAgICBjb25zdCB2bWV0cmljID0gZ2x5cGgudm1ldHJpYyB8fCBkZWZhdWx0Vk1ldHJpY3M7XG5cdCAgICAgICAgY29uc3QgdnggPSAtKGdseXBoLnZtZXRyaWMgPyB2bWV0cmljWzFdIDogd2lkdGggKiAwLjUpICogd2lkdGhBZHZhbmNlU2NhbGU7XG5cdCAgICAgICAgY29uc3QgdnkgPSB2bWV0cmljWzJdICogd2lkdGhBZHZhbmNlU2NhbGU7XG5cdCAgICAgICAgd2lkdGggPSB2bWV0cmljID8gLXZtZXRyaWNbMF0gOiB3aWR0aDtcblx0ICAgICAgICBzY2FsZWRYID0gdnggLyBmb250U2l6ZVNjYWxlO1xuXHQgICAgICAgIHNjYWxlZFkgPSAoeCArIHZ5KSAvIGZvbnRTaXplU2NhbGU7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgc2NhbGVkWCA9IHggLyBmb250U2l6ZVNjYWxlO1xuXHQgICAgICAgIHNjYWxlZFkgPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChmb250LnJlbWVhc3VyZSAmJiB3aWR0aCA+IDApIHtcblx0ICAgICAgICBjb25zdCBtZWFzdXJlZFdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGNoYXJhY3Rlcikud2lkdGggKiAxMDAwIC8gZm9udFNpemUgKiBmb250U2l6ZVNjYWxlO1xuXHQgICAgICAgIGlmICh3aWR0aCA8IG1lYXN1cmVkV2lkdGggJiYgdGhpcy5pc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZCkge1xuXHQgICAgICAgICAgY29uc3QgY2hhcmFjdGVyU2NhbGVYID0gd2lkdGggLyBtZWFzdXJlZFdpZHRoO1xuXHQgICAgICAgICAgcmVzdG9yZU5lZWRlZCA9IHRydWU7XG5cdCAgICAgICAgICBjdHguc2F2ZSgpO1xuXHQgICAgICAgICAgY3R4LnNjYWxlKGNoYXJhY3RlclNjYWxlWCwgMSk7XG5cdCAgICAgICAgICBzY2FsZWRYIC89IGNoYXJhY3RlclNjYWxlWDtcblx0ICAgICAgICB9IGVsc2UgaWYgKHdpZHRoICE9PSBtZWFzdXJlZFdpZHRoKSB7XG5cdCAgICAgICAgICBzY2FsZWRYICs9ICh3aWR0aCAtIG1lYXN1cmVkV2lkdGgpIC8gMjAwMCAqIGZvbnRTaXplIC8gZm9udFNpemVTY2FsZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUgJiYgKGdseXBoLmlzSW5Gb250IHx8IGZvbnQubWlzc2luZ0ZpbGUpKSB7XG5cdCAgICAgICAgaWYgKHNpbXBsZUZpbGxUZXh0ICYmICFhY2NlbnQpIHtcblx0ICAgICAgICAgIGN0eC5maWxsVGV4dChjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFkpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnBhaW50Q2hhcihjaGFyYWN0ZXIsIHNjYWxlZFgsIHNjYWxlZFksIHBhdHRlcm5UcmFuc2Zvcm0pO1xuXHQgICAgICAgICAgaWYgKGFjY2VudCkge1xuXHQgICAgICAgICAgICBjb25zdCBzY2FsZWRBY2NlbnRYID0gc2NhbGVkWCArIGZvbnRTaXplICogYWNjZW50Lm9mZnNldC54IC8gZm9udFNpemVTY2FsZTtcblx0ICAgICAgICAgICAgY29uc3Qgc2NhbGVkQWNjZW50WSA9IHNjYWxlZFkgLSBmb250U2l6ZSAqIGFjY2VudC5vZmZzZXQueSAvIGZvbnRTaXplU2NhbGU7XG5cdCAgICAgICAgICAgIHRoaXMucGFpbnRDaGFyKGFjY2VudC5mb250Q2hhciwgc2NhbGVkQWNjZW50WCwgc2NhbGVkQWNjZW50WSwgcGF0dGVyblRyYW5zZm9ybSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIGxldCBjaGFyV2lkdGg7XG5cdCAgICAgIGlmICh2ZXJ0aWNhbCkge1xuXHQgICAgICAgIGNoYXJXaWR0aCA9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgLSBzcGFjaW5nICogZm9udERpcmVjdGlvbjtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICsgc3BhY2luZyAqIGZvbnREaXJlY3Rpb247XG5cdCAgICAgIH1cblx0ICAgICAgeCArPSBjaGFyV2lkdGg7XG5cdCAgICAgIGlmIChyZXN0b3JlTmVlZGVkKSB7XG5cdCAgICAgICAgY3R4LnJlc3RvcmUoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKHZlcnRpY2FsKSB7XG5cdCAgICAgIGN1cnJlbnQueSAtPSB4O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY3VycmVudC54ICs9IHggKiB0ZXh0SFNjYWxlO1xuXHQgICAgfVxuXHQgICAgY3R4LnJlc3RvcmUoKTtcblx0ICAgIHRoaXMuY29tcG9zZSgpO1xuXHQgICAgcmV0dXJuIHVuZGVmaW5lZDtcblx0ICB9XG5cdCAgc2hvd1R5cGUzVGV4dChnbHlwaHMpIHtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgIGNvbnN0IGZvbnQgPSBjdXJyZW50LmZvbnQ7XG5cdCAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7XG5cdCAgICBjb25zdCBmb250RGlyZWN0aW9uID0gY3VycmVudC5mb250RGlyZWN0aW9uO1xuXHQgICAgY29uc3Qgc3BhY2luZ0RpciA9IGZvbnQudmVydGljYWwgPyAxIDogLTE7XG5cdCAgICBjb25zdCBjaGFyU3BhY2luZyA9IGN1cnJlbnQuY2hhclNwYWNpbmc7XG5cdCAgICBjb25zdCB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7XG5cdCAgICBjb25zdCB0ZXh0SFNjYWxlID0gY3VycmVudC50ZXh0SFNjYWxlICogZm9udERpcmVjdGlvbjtcblx0ICAgIGNvbnN0IGZvbnRNYXRyaXggPSBjdXJyZW50LmZvbnRNYXRyaXggfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7XG5cdCAgICBjb25zdCBnbHlwaHNMZW5ndGggPSBnbHlwaHMubGVuZ3RoO1xuXHQgICAgY29uc3QgaXNUZXh0SW52aXNpYmxlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuSU5WSVNJQkxFO1xuXHQgICAgbGV0IGksIGdseXBoLCB3aWR0aCwgc3BhY2luZ0xlbmd0aDtcblx0ICAgIGlmIChpc1RleHRJbnZpc2libGUgfHwgZm9udFNpemUgPT09IDApIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZyA9IG51bGw7XG5cdCAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcblx0ICAgIGN0eC5zYXZlKCk7XG5cdCAgICBjdHgudHJhbnNmb3JtKC4uLmN1cnJlbnQudGV4dE1hdHJpeCk7XG5cdCAgICBjdHgudHJhbnNsYXRlKGN1cnJlbnQueCwgY3VycmVudC55KTtcblx0ICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCBmb250RGlyZWN0aW9uKTtcblx0ICAgIGZvciAoaSA9IDA7IGkgPCBnbHlwaHNMZW5ndGg7ICsraSkge1xuXHQgICAgICBnbHlwaCA9IGdseXBoc1tpXTtcblx0ICAgICAgaWYgKHR5cGVvZiBnbHlwaCA9PT0gXCJudW1iZXJcIikge1xuXHQgICAgICAgIHNwYWNpbmdMZW5ndGggPSBzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSAvIDEwMDA7XG5cdCAgICAgICAgdGhpcy5jdHgudHJhbnNsYXRlKHNwYWNpbmdMZW5ndGgsIDApO1xuXHQgICAgICAgIGN1cnJlbnQueCArPSBzcGFjaW5nTGVuZ3RoICogdGV4dEhTY2FsZTtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBzcGFjaW5nID0gKGdseXBoLmlzU3BhY2UgPyB3b3JkU3BhY2luZyA6IDApICsgY2hhclNwYWNpbmc7XG5cdCAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IGZvbnQuY2hhclByb2NPcGVyYXRvckxpc3RbZ2x5cGgub3BlcmF0b3JMaXN0SWRdO1xuXHQgICAgICBpZiAoIW9wZXJhdG9yTGlzdCkge1xuXHQgICAgICAgICgwLCBfdXRpbC53YXJuKShgVHlwZTMgY2hhcmFjdGVyIFwiJHtnbHlwaC5vcGVyYXRvckxpc3RJZH1cIiBpcyBub3QgYXZhaWxhYmxlLmApO1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBnbHlwaDtcblx0ICAgICAgICB0aGlzLnNhdmUoKTtcblx0ICAgICAgICBjdHguc2NhbGUoZm9udFNpemUsIGZvbnRTaXplKTtcblx0ICAgICAgICBjdHgudHJhbnNmb3JtKC4uLmZvbnRNYXRyaXgpO1xuXHQgICAgICAgIHRoaXMuZXhlY3V0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QpO1xuXHQgICAgICAgIHRoaXMucmVzdG9yZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbZ2x5cGgud2lkdGgsIDBdLCBmb250TWF0cml4KTtcblx0ICAgICAgd2lkdGggPSB0cmFuc2Zvcm1lZFswXSAqIGZvbnRTaXplICsgc3BhY2luZztcblx0ICAgICAgY3R4LnRyYW5zbGF0ZSh3aWR0aCwgMCk7XG5cdCAgICAgIGN1cnJlbnQueCArPSB3aWR0aCAqIHRleHRIU2NhbGU7XG5cdCAgICB9XG5cdCAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgdGhpcy5wcm9jZXNzaW5nVHlwZTMgPSBudWxsO1xuXHQgIH1cblx0ICBzZXRDaGFyV2lkdGgoeFdpZHRoLCB5V2lkdGgpIHt9XG5cdCAgc2V0Q2hhcldpZHRoQW5kQm91bmRzKHhXaWR0aCwgeVdpZHRoLCBsbHgsIGxseSwgdXJ4LCB1cnkpIHtcblx0ICAgIHRoaXMuY3R4LnJlY3QobGx4LCBsbHksIHVyeCAtIGxseCwgdXJ5IC0gbGx5KTtcblx0ICAgIHRoaXMuY3R4LmNsaXAoKTtcblx0ICAgIHRoaXMuZW5kUGF0aCgpO1xuXHQgIH1cblx0ICBnZXRDb2xvck5fUGF0dGVybihJUikge1xuXHQgICAgbGV0IHBhdHRlcm47XG5cdCAgICBpZiAoSVJbMF0gPT09IFwiVGlsaW5nUGF0dGVyblwiKSB7XG5cdCAgICAgIGNvbnN0IGNvbG9yID0gSVJbMV07XG5cdCAgICAgIGNvbnN0IGJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm0gfHwgKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcblx0ICAgICAgY29uc3QgY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0ge1xuXHQgICAgICAgIGNyZWF0ZUNhbnZhc0dyYXBoaWNzOiBjdHggPT4ge1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBDYW52YXNHcmFwaGljcyhjdHgsIHRoaXMuY29tbW9uT2JqcywgdGhpcy5vYmpzLCB0aGlzLmNhbnZhc0ZhY3RvcnksIHRoaXMuZmlsdGVyRmFjdG9yeSwge1xuXHQgICAgICAgICAgICBvcHRpb25hbENvbnRlbnRDb25maWc6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLFxuXHQgICAgICAgICAgICBtYXJrZWRDb250ZW50U3RhY2s6IHRoaXMubWFya2VkQ29udGVudFN0YWNrXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIHBhdHRlcm4gPSBuZXcgX3BhdHRlcm5faGVscGVyLlRpbGluZ1BhdHRlcm4oSVIsIGNvbG9yLCB0aGlzLmN0eCwgY2FudmFzR3JhcGhpY3NGYWN0b3J5LCBiYXNlVHJhbnNmb3JtKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHBhdHRlcm4gPSB0aGlzLl9nZXRQYXR0ZXJuKElSWzFdLCBJUlsyXSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcGF0dGVybjtcblx0ICB9XG5cdCAgc2V0U3Ryb2tlQ29sb3JOKCkge1xuXHQgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gdGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpO1xuXHQgIH1cblx0ICBzZXRGaWxsQ29sb3JOKCkge1xuXHQgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IHRoaXMuZ2V0Q29sb3JOX1BhdHRlcm4oYXJndW1lbnRzKTtcblx0ICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IHRydWU7XG5cdCAgfVxuXHQgIHNldFN0cm9rZVJHQkNvbG9yKHIsIGcsIGIpIHtcblx0ICAgIGNvbnN0IGNvbG9yID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IociwgZywgYik7XG5cdCAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXHQgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gY29sb3I7XG5cdCAgfVxuXHQgIHNldEZpbGxSR0JDb2xvcihyLCBnLCBiKSB7XG5cdCAgICBjb25zdCBjb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKHIsIGcsIGIpO1xuXHQgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gY29sb3I7XG5cdCAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gY29sb3I7XG5cdCAgICB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGwgPSBmYWxzZTtcblx0ICB9XG5cdCAgX2dldFBhdHRlcm4ob2JqSWQsIG1hdHJpeCA9IG51bGwpIHtcblx0ICAgIGxldCBwYXR0ZXJuO1xuXHQgICAgaWYgKHRoaXMuY2FjaGVkUGF0dGVybnMuaGFzKG9iaklkKSkge1xuXHQgICAgICBwYXR0ZXJuID0gdGhpcy5jYWNoZWRQYXR0ZXJucy5nZXQob2JqSWQpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcGF0dGVybiA9ICgwLCBfcGF0dGVybl9oZWxwZXIuZ2V0U2hhZGluZ1BhdHRlcm4pKHRoaXMuZ2V0T2JqZWN0KG9iaklkKSk7XG5cdCAgICAgIHRoaXMuY2FjaGVkUGF0dGVybnMuc2V0KG9iaklkLCBwYXR0ZXJuKTtcblx0ICAgIH1cblx0ICAgIGlmIChtYXRyaXgpIHtcblx0ICAgICAgcGF0dGVybi5tYXRyaXggPSBtYXRyaXg7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcGF0dGVybjtcblx0ICB9XG5cdCAgc2hhZGluZ0ZpbGwob2JqSWQpIHtcblx0ICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIHRoaXMuc2F2ZSgpO1xuXHQgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuX2dldFBhdHRlcm4ob2JqSWQpO1xuXHQgICAgY3R4LmZpbGxTdHlsZSA9IHBhdHRlcm4uZ2V0UGF0dGVybihjdHgsIHRoaXMsICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoY3R4KSwgX3BhdHRlcm5faGVscGVyLlBhdGhUeXBlLlNIQURJTkcpO1xuXHQgICAgY29uc3QgaW52ID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShjdHgpO1xuXHQgICAgaWYgKGludikge1xuXHQgICAgICBjb25zdCBjYW52YXMgPSBjdHguY2FudmFzO1xuXHQgICAgICBjb25zdCB3aWR0aCA9IGNhbnZhcy53aWR0aDtcblx0ICAgICAgY29uc3QgaGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcblx0ICAgICAgY29uc3QgYmwgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFswLCAwXSwgaW52KTtcblx0ICAgICAgY29uc3QgYnIgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFswLCBoZWlnaHRdLCBpbnYpO1xuXHQgICAgICBjb25zdCB1bCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCAwXSwgaW52KTtcblx0ICAgICAgY29uc3QgdXIgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt3aWR0aCwgaGVpZ2h0XSwgaW52KTtcblx0ICAgICAgY29uc3QgeDAgPSBNYXRoLm1pbihibFswXSwgYnJbMF0sIHVsWzBdLCB1clswXSk7XG5cdCAgICAgIGNvbnN0IHkwID0gTWF0aC5taW4oYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pO1xuXHQgICAgICBjb25zdCB4MSA9IE1hdGgubWF4KGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTtcblx0ICAgICAgY29uc3QgeTEgPSBNYXRoLm1heChibFsxXSwgYnJbMV0sIHVsWzFdLCB1clsxXSk7XG5cdCAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmN0eC5maWxsUmVjdCgtMWUxMCwgLTFlMTAsIDJlMTAsIDJlMTApO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jb21wb3NlKHRoaXMuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCkpO1xuXHQgICAgdGhpcy5yZXN0b3JlKCk7XG5cdCAgfVxuXHQgIGJlZ2luSW5saW5lSW1hZ2UoKSB7XG5cdCAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiU2hvdWxkIG5vdCBjYWxsIGJlZ2luSW5saW5lSW1hZ2VcIik7XG5cdCAgfVxuXHQgIGJlZ2luSW1hZ2VEYXRhKCkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBiZWdpbkltYWdlRGF0YVwiKTtcblx0ICB9XG5cdCAgcGFpbnRGb3JtWE9iamVjdEJlZ2luKG1hdHJpeCwgYmJveCkge1xuXHQgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuc2F2ZSgpO1xuXHQgICAgdGhpcy5iYXNlVHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLmJhc2VUcmFuc2Zvcm0pO1xuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkobWF0cml4KSAmJiBtYXRyaXgubGVuZ3RoID09PSA2KSB7XG5cdCAgICAgIHRoaXMudHJhbnNmb3JtKC4uLm1hdHJpeCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpO1xuXHQgICAgaWYgKGJib3gpIHtcblx0ICAgICAgY29uc3Qgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTtcblx0ICAgICAgY29uc3QgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07XG5cdCAgICAgIHRoaXMuY3R4LnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICAgIHRoaXMuY3VycmVudC51cGRhdGVSZWN0TWluTWF4KCgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCksIGJib3gpO1xuXHQgICAgICB0aGlzLmNsaXAoKTtcblx0ICAgICAgdGhpcy5lbmRQYXRoKCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7XG5cdCAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5yZXN0b3JlKCk7XG5cdCAgICB0aGlzLmJhc2VUcmFuc2Zvcm0gPSB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wb3AoKTtcblx0ICB9XG5cdCAgYmVnaW5Hcm91cChncm91cCkge1xuXHQgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuc2F2ZSgpO1xuXHQgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcblx0ICAgICAgdGhpcy5lbmRTTWFza01vZGUoKTtcblx0ICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGN1cnJlbnRDdHggPSB0aGlzLmN0eDtcblx0ICAgIGlmICghZ3JvdXAuaXNvbGF0ZWQpIHtcblx0ICAgICAgKDAsIF91dGlsLmluZm8pKFwiVE9ETzogU3VwcG9ydCBub24taXNvbGF0ZWQgZ3JvdXBzLlwiKTtcblx0ICAgIH1cblx0ICAgIGlmIChncm91cC5rbm9ja291dCkge1xuXHQgICAgICAoMCwgX3V0aWwud2FybikoXCJLbm9ja291dCBncm91cHMgbm90IHN1cHBvcnRlZC5cIik7XG5cdCAgICB9XG5cdCAgICBjb25zdCBjdXJyZW50VHJhbnNmb3JtID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN1cnJlbnRDdHgpO1xuXHQgICAgaWYgKGdyb3VwLm1hdHJpeCkge1xuXHQgICAgICBjdXJyZW50Q3R4LnRyYW5zZm9ybSguLi5ncm91cC5tYXRyaXgpO1xuXHQgICAgfVxuXHQgICAgaWYgKCFncm91cC5iYm94KSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIkJvdW5kaW5nIGJveCBpcyByZXF1aXJlZC5cIik7XG5cdCAgICB9XG5cdCAgICBsZXQgYm91bmRzID0gX3V0aWwuVXRpbC5nZXRBeGlhbEFsaWduZWRCb3VuZGluZ0JveChncm91cC5iYm94LCAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3VycmVudEN0eCkpO1xuXHQgICAgY29uc3QgY2FudmFzQm91bmRzID0gWzAsIDAsIGN1cnJlbnRDdHguY2FudmFzLndpZHRoLCBjdXJyZW50Q3R4LmNhbnZhcy5oZWlnaHRdO1xuXHQgICAgYm91bmRzID0gX3V0aWwuVXRpbC5pbnRlcnNlY3QoYm91bmRzLCBjYW52YXNCb3VuZHMpIHx8IFswLCAwLCAwLCAwXTtcblx0ICAgIGNvbnN0IG9mZnNldFggPSBNYXRoLmZsb29yKGJvdW5kc1swXSk7XG5cdCAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcihib3VuZHNbMV0pO1xuXHQgICAgbGV0IGRyYXduV2lkdGggPSBNYXRoLm1heChNYXRoLmNlaWwoYm91bmRzWzJdKSAtIG9mZnNldFgsIDEpO1xuXHQgICAgbGV0IGRyYXduSGVpZ2h0ID0gTWF0aC5tYXgoTWF0aC5jZWlsKGJvdW5kc1szXSkgLSBvZmZzZXRZLCAxKTtcblx0ICAgIGxldCBzY2FsZVggPSAxLFxuXHQgICAgICBzY2FsZVkgPSAxO1xuXHQgICAgaWYgKGRyYXduV2lkdGggPiBNQVhfR1JPVVBfU0laRSkge1xuXHQgICAgICBzY2FsZVggPSBkcmF3bldpZHRoIC8gTUFYX0dST1VQX1NJWkU7XG5cdCAgICAgIGRyYXduV2lkdGggPSBNQVhfR1JPVVBfU0laRTtcblx0ICAgIH1cblx0ICAgIGlmIChkcmF3bkhlaWdodCA+IE1BWF9HUk9VUF9TSVpFKSB7XG5cdCAgICAgIHNjYWxlWSA9IGRyYXduSGVpZ2h0IC8gTUFYX0dST1VQX1NJWkU7XG5cdCAgICAgIGRyYXduSGVpZ2h0ID0gTUFYX0dST1VQX1NJWkU7XG5cdCAgICB9XG5cdCAgICB0aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChbMCwgMCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHRdKTtcblx0ICAgIGxldCBjYWNoZUlkID0gXCJncm91cEF0XCIgKyB0aGlzLmdyb3VwTGV2ZWw7XG5cdCAgICBpZiAoZ3JvdXAuc21hc2spIHtcblx0ICAgICAgY2FjaGVJZCArPSBcIl9zbWFza19cIiArIHRoaXMuc21hc2tDb3VudGVyKysgJSAyO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgc2NyYXRjaENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKGNhY2hlSWQsIGRyYXduV2lkdGgsIGRyYXduSGVpZ2h0KTtcblx0ICAgIGNvbnN0IGdyb3VwQ3R4ID0gc2NyYXRjaENhbnZhcy5jb250ZXh0O1xuXHQgICAgZ3JvdXBDdHguc2NhbGUoMSAvIHNjYWxlWCwgMSAvIHNjYWxlWSk7XG5cdCAgICBncm91cEN0eC50cmFuc2xhdGUoLW9mZnNldFgsIC1vZmZzZXRZKTtcblx0ICAgIGdyb3VwQ3R4LnRyYW5zZm9ybSguLi5jdXJyZW50VHJhbnNmb3JtKTtcblx0ICAgIGlmIChncm91cC5zbWFzaykge1xuXHQgICAgICB0aGlzLnNtYXNrU3RhY2sucHVzaCh7XG5cdCAgICAgICAgY2FudmFzOiBzY3JhdGNoQ2FudmFzLmNhbnZhcyxcblx0ICAgICAgICBjb250ZXh0OiBncm91cEN0eCxcblx0ICAgICAgICBvZmZzZXRYLFxuXHQgICAgICAgIG9mZnNldFksXG5cdCAgICAgICAgc2NhbGVYLFxuXHQgICAgICAgIHNjYWxlWSxcblx0ICAgICAgICBzdWJ0eXBlOiBncm91cC5zbWFzay5zdWJ0eXBlLFxuXHQgICAgICAgIGJhY2tkcm9wOiBncm91cC5zbWFzay5iYWNrZHJvcCxcblx0ICAgICAgICB0cmFuc2Zlck1hcDogZ3JvdXAuc21hc2sudHJhbnNmZXJNYXAgfHwgbnVsbCxcblx0ICAgICAgICBzdGFydFRyYW5zZm9ybUludmVyc2U6IG51bGxcblx0ICAgICAgfSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjdXJyZW50Q3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcblx0ICAgICAgY3VycmVudEN0eC50cmFuc2xhdGUob2Zmc2V0WCwgb2Zmc2V0WSk7XG5cdCAgICAgIGN1cnJlbnRDdHguc2NhbGUoc2NhbGVYLCBzY2FsZVkpO1xuXHQgICAgICBjdXJyZW50Q3R4LnNhdmUoKTtcblx0ICAgIH1cblx0ICAgIGNvcHlDdHhTdGF0ZShjdXJyZW50Q3R4LCBncm91cEN0eCk7XG5cdCAgICB0aGlzLmN0eCA9IGdyb3VwQ3R4O1xuXHQgICAgdGhpcy5zZXRHU3RhdGUoW1tcIkJNXCIsIFwic291cmNlLW92ZXJcIl0sIFtcImNhXCIsIDFdLCBbXCJDQVwiLCAxXV0pO1xuXHQgICAgdGhpcy5ncm91cFN0YWNrLnB1c2goY3VycmVudEN0eCk7XG5cdCAgICB0aGlzLmdyb3VwTGV2ZWwrKztcblx0ICB9XG5cdCAgZW5kR3JvdXAoZ3JvdXApIHtcblx0ICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLmdyb3VwTGV2ZWwtLTtcblx0ICAgIGNvbnN0IGdyb3VwQ3R4ID0gdGhpcy5jdHg7XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmdyb3VwU3RhY2sucG9wKCk7XG5cdCAgICB0aGlzLmN0eCA9IGN0eDtcblx0ICAgIHRoaXMuY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXHQgICAgaWYgKGdyb3VwLnNtYXNrKSB7XG5cdCAgICAgIHRoaXMudGVtcFNNYXNrID0gdGhpcy5zbWFza1N0YWNrLnBvcCgpO1xuXHQgICAgICB0aGlzLnJlc3RvcmUoKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcblx0ICAgICAgY29uc3QgY3VycmVudE10eCA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG5cdCAgICAgIHRoaXMucmVzdG9yZSgpO1xuXHQgICAgICB0aGlzLmN0eC5zYXZlKCk7XG5cdCAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSguLi5jdXJyZW50TXR4KTtcblx0ICAgICAgY29uc3QgZGlydHlCb3ggPSBfdXRpbC5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KFswLCAwLCBncm91cEN0eC5jYW52YXMud2lkdGgsIGdyb3VwQ3R4LmNhbnZhcy5oZWlnaHRdLCBjdXJyZW50TXR4KTtcblx0ICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKGdyb3VwQ3R4LmNhbnZhcywgMCwgMCk7XG5cdCAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcblx0ICAgICAgdGhpcy5jb21wb3NlKGRpcnR5Qm94KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgYmVnaW5Bbm5vdGF0aW9uKGlkLCByZWN0LCB0cmFuc2Zvcm0sIG1hdHJpeCwgaGFzT3duQ2FudmFzKSB7XG5cdCAgICB0aGlzLiNyZXN0b3JlSW5pdGlhbFN0YXRlKCk7XG5cdCAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG5cdCAgICB0aGlzLmN0eC5zYXZlKCk7XG5cdCAgICB0aGlzLnNhdmUoKTtcblx0ICAgIGlmICh0aGlzLmJhc2VUcmFuc2Zvcm0pIHtcblx0ICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKC4uLnRoaXMuYmFzZVRyYW5zZm9ybSk7XG5cdCAgICB9XG5cdCAgICBpZiAoQXJyYXkuaXNBcnJheShyZWN0KSAmJiByZWN0Lmxlbmd0aCA9PT0gNCkge1xuXHQgICAgICBjb25zdCB3aWR0aCA9IHJlY3RbMl0gLSByZWN0WzBdO1xuXHQgICAgICBjb25zdCBoZWlnaHQgPSByZWN0WzNdIC0gcmVjdFsxXTtcblx0ICAgICAgaWYgKGhhc093bkNhbnZhcyAmJiB0aGlzLmFubm90YXRpb25DYW52YXNNYXApIHtcblx0ICAgICAgICB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm0uc2xpY2UoKTtcblx0ICAgICAgICB0cmFuc2Zvcm1bNF0gLT0gcmVjdFswXTtcblx0ICAgICAgICB0cmFuc2Zvcm1bNV0gLT0gcmVjdFsxXTtcblx0ICAgICAgICByZWN0ID0gcmVjdC5zbGljZSgpO1xuXHQgICAgICAgIHJlY3RbMF0gPSByZWN0WzFdID0gMDtcblx0ICAgICAgICByZWN0WzJdID0gd2lkdGg7XG5cdCAgICAgICAgcmVjdFszXSA9IGhlaWdodDtcblx0ICAgICAgICBjb25zdCBbc2NhbGVYLCBzY2FsZVldID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSgoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpKTtcblx0ICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICB2aWV3cG9ydFNjYWxlXG5cdCAgICAgICAgfSA9IHRoaXM7XG5cdCAgICAgICAgY29uc3QgY2FudmFzV2lkdGggPSBNYXRoLmNlaWwod2lkdGggKiB0aGlzLm91dHB1dFNjYWxlWCAqIHZpZXdwb3J0U2NhbGUpO1xuXHQgICAgICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IE1hdGguY2VpbChoZWlnaHQgKiB0aGlzLm91dHB1dFNjYWxlWSAqIHZpZXdwb3J0U2NhbGUpO1xuXHQgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhcyA9IHRoaXMuY2FudmFzRmFjdG9yeS5jcmVhdGUoY2FudmFzV2lkdGgsIGNhbnZhc0hlaWdodCk7XG5cdCAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgY2FudmFzLFxuXHQgICAgICAgICAgY29udGV4dFxuXHQgICAgICAgIH0gPSB0aGlzLmFubm90YXRpb25DYW52YXM7XG5cdCAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwLnNldChpZCwgY2FudmFzKTtcblx0ICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXMuc2F2ZWRDdHggPSB0aGlzLmN0eDtcblx0ICAgICAgICB0aGlzLmN0eCA9IGNvbnRleHQ7XG5cdCAgICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuXHQgICAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybShzY2FsZVgsIDAsIDAsIC1zY2FsZVksIDAsIGhlaWdodCAqIHNjYWxlWSk7XG5cdCAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcblx0ICAgICAgICB0aGlzLmN0eC5yZWN0KHJlY3RbMF0sIHJlY3RbMV0sIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgICAgIHRoaXMuY3R4LmNsaXAoKTtcblx0ICAgICAgICB0aGlzLmVuZFBhdGgoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgdGhpcy5jdXJyZW50ID0gbmV3IENhbnZhc0V4dHJhU3RhdGUodGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtcblx0ICAgIHRoaXMudHJhbnNmb3JtKC4uLnRyYW5zZm9ybSk7XG5cdCAgICB0aGlzLnRyYW5zZm9ybSguLi5tYXRyaXgpO1xuXHQgIH1cblx0ICBlbmRBbm5vdGF0aW9uKCkge1xuXHQgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkNhbnZhcykge1xuXHQgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG5cdCAgICAgIHRoaXMuI2RyYXdGaWx0ZXIoKTtcblx0ICAgICAgdGhpcy5jdHggPSB0aGlzLmFubm90YXRpb25DYW52YXMuc2F2ZWRDdHg7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLmFubm90YXRpb25DYW52YXMuc2F2ZWRDdHg7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLmFubm90YXRpb25DYW52YXM7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHBhaW50SW1hZ2VNYXNrWE9iamVjdChpbWcpIHtcblx0ICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBjb3VudCA9IGltZy5jb3VudDtcblx0ICAgIGltZyA9IHRoaXMuZ2V0T2JqZWN0KGltZy5kYXRhLCBpbWcpO1xuXHQgICAgaW1nLmNvdW50ID0gY291bnQ7XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIGNvbnN0IGdseXBoID0gdGhpcy5wcm9jZXNzaW5nVHlwZTM7XG5cdCAgICBpZiAoZ2x5cGgpIHtcblx0ICAgICAgaWYgKGdseXBoLmNvbXBpbGVkID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICBnbHlwaC5jb21waWxlZCA9IGNvbXBpbGVUeXBlM0dseXBoKGltZyk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGdseXBoLmNvbXBpbGVkKSB7XG5cdCAgICAgICAgZ2x5cGguY29tcGlsZWQoY3R4KTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGNvbnN0IG1hc2sgPSB0aGlzLl9jcmVhdGVNYXNrQ2FudmFzKGltZyk7XG5cdCAgICBjb25zdCBtYXNrQ2FudmFzID0gbWFzay5jYW52YXM7XG5cdCAgICBjdHguc2F2ZSgpO1xuXHQgICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcblx0ICAgIGN0eC5kcmF3SW1hZ2UobWFza0NhbnZhcywgbWFzay5vZmZzZXRYLCBtYXNrLm9mZnNldFkpO1xuXHQgICAgY3R4LnJlc3RvcmUoKTtcblx0ICAgIHRoaXMuY29tcG9zZSgpO1xuXHQgIH1cblx0ICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQoaW1nLCBzY2FsZVgsIHNrZXdYID0gMCwgc2tld1kgPSAwLCBzY2FsZVksIHBvc2l0aW9ucykge1xuXHQgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGltZyA9IHRoaXMuZ2V0T2JqZWN0KGltZy5kYXRhLCBpbWcpO1xuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBjdHguc2F2ZSgpO1xuXHQgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpO1xuXHQgICAgY3R4LnRyYW5zZm9ybShzY2FsZVgsIHNrZXdYLCBza2V3WSwgc2NhbGVZLCAwLCAwKTtcblx0ICAgIGNvbnN0IG1hc2sgPSB0aGlzLl9jcmVhdGVNYXNrQ2FudmFzKGltZyk7XG5cdCAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIG1hc2sub2Zmc2V0WCAtIGN1cnJlbnRUcmFuc2Zvcm1bNF0sIG1hc2sub2Zmc2V0WSAtIGN1cnJlbnRUcmFuc2Zvcm1bNV0pO1xuXHQgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcblx0ICAgICAgY29uc3QgdHJhbnMgPSBfdXRpbC5VdGlsLnRyYW5zZm9ybShjdXJyZW50VHJhbnNmb3JtLCBbc2NhbGVYLCBza2V3WCwgc2tld1ksIHNjYWxlWSwgcG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdXSk7XG5cdCAgICAgIGNvbnN0IFt4LCB5XSA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCB0cmFucyk7XG5cdCAgICAgIGN0eC5kcmF3SW1hZ2UobWFzay5jYW52YXMsIHgsIHkpO1xuXHQgICAgfVxuXHQgICAgY3R4LnJlc3RvcmUoKTtcblx0ICAgIHRoaXMuY29tcG9zZSgpO1xuXHQgIH1cblx0ICBwYWludEltYWdlTWFza1hPYmplY3RHcm91cChpbWFnZXMpIHtcblx0ICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG5cdCAgICBjb25zdCBpc1BhdHRlcm5GaWxsID0gdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsO1xuXHQgICAgZm9yIChjb25zdCBpbWFnZSBvZiBpbWFnZXMpIHtcblx0ICAgICAgY29uc3Qge1xuXHQgICAgICAgIGRhdGEsXG5cdCAgICAgICAgd2lkdGgsXG5cdCAgICAgICAgaGVpZ2h0LFxuXHQgICAgICAgIHRyYW5zZm9ybVxuXHQgICAgICB9ID0gaW1hZ2U7XG5cdCAgICAgIGNvbnN0IG1hc2tDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcIm1hc2tDYW52YXNcIiwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICAgIGNvbnN0IG1hc2tDdHggPSBtYXNrQ2FudmFzLmNvbnRleHQ7XG5cdCAgICAgIG1hc2tDdHguc2F2ZSgpO1xuXHQgICAgICBjb25zdCBpbWcgPSB0aGlzLmdldE9iamVjdChkYXRhLCBpbWFnZSk7XG5cdCAgICAgIHB1dEJpbmFyeUltYWdlTWFzayhtYXNrQ3R4LCBpbWcpO1xuXHQgICAgICBtYXNrQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLWluXCI7XG5cdCAgICAgIG1hc2tDdHguZmlsbFN0eWxlID0gaXNQYXR0ZXJuRmlsbCA/IGZpbGxDb2xvci5nZXRQYXR0ZXJuKG1hc2tDdHgsIHRoaXMsICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoY3R4KSwgX3BhdHRlcm5faGVscGVyLlBhdGhUeXBlLkZJTEwpIDogZmlsbENvbG9yO1xuXHQgICAgICBtYXNrQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgICBtYXNrQ3R4LnJlc3RvcmUoKTtcblx0ICAgICAgY3R4LnNhdmUoKTtcblx0ICAgICAgY3R4LnRyYW5zZm9ybSguLi50cmFuc2Zvcm0pO1xuXHQgICAgICBjdHguc2NhbGUoMSwgLTEpO1xuXHQgICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBtYXNrQ2FudmFzLmNhbnZhcywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgLTEsIDEsIDEpO1xuXHQgICAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jb21wb3NlKCk7XG5cdCAgfVxuXHQgIHBhaW50SW1hZ2VYT2JqZWN0KG9iaklkKSB7XG5cdCAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgaW1nRGF0YSA9IHRoaXMuZ2V0T2JqZWN0KG9iaklkKTtcblx0ICAgIGlmICghaW1nRGF0YSkge1xuXHQgICAgICAoMCwgX3V0aWwud2FybikoXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpO1xuXHQgIH1cblx0ICBwYWludEltYWdlWE9iamVjdFJlcGVhdChvYmpJZCwgc2NhbGVYLCBzY2FsZVksIHBvc2l0aW9ucykge1xuXHQgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGltZ0RhdGEgPSB0aGlzLmdldE9iamVjdChvYmpJZCk7XG5cdCAgICBpZiAoIWltZ0RhdGEpIHtcblx0ICAgICAgKDAsIF91dGlsLndhcm4pKFwiRGVwZW5kZW50IGltYWdlIGlzbid0IHJlYWR5IHlldFwiKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuXHQgICAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG5cdCAgICBjb25zdCBtYXAgPSBbXTtcblx0ICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpaTsgaSArPSAyKSB7XG5cdCAgICAgIG1hcC5wdXNoKHtcblx0ICAgICAgICB0cmFuc2Zvcm06IFtzY2FsZVgsIDAsIDAsIHNjYWxlWSwgcG9zaXRpb25zW2ldLCBwb3NpdGlvbnNbaSArIDFdXSxcblx0ICAgICAgICB4OiAwLFxuXHQgICAgICAgIHk6IDAsXG5cdCAgICAgICAgdzogd2lkdGgsXG5cdCAgICAgICAgaDogaGVpZ2h0XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdEdyb3VwKGltZ0RhdGEsIG1hcCk7XG5cdCAgfVxuXHQgIGFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXMoY3R4KSB7XG5cdCAgICBpZiAodGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcyAhPT0gXCJub25lXCIpIHtcblx0ICAgICAgY3R4LmZpbHRlciA9IHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHM7XG5cdCAgICAgIGN0eC5kcmF3SW1hZ2UoY3R4LmNhbnZhcywgMCwgMCk7XG5cdCAgICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBjdHguY2FudmFzO1xuXHQgIH1cblx0ICBhcHBseVRyYW5zZmVyTWFwc1RvQml0bWFwKGltZ0RhdGEpIHtcblx0ICAgIGlmICh0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzID09PSBcIm5vbmVcIikge1xuXHQgICAgICByZXR1cm4gaW1nRGF0YS5iaXRtYXA7XG5cdCAgICB9XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGJpdG1hcCxcblx0ICAgICAgd2lkdGgsXG5cdCAgICAgIGhlaWdodFxuXHQgICAgfSA9IGltZ0RhdGE7XG5cdCAgICBjb25zdCB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG5cdCAgICB0bXBDdHguZmlsdGVyID0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcztcblx0ICAgIHRtcEN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTtcblx0ICAgIHRtcEN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcblx0ICAgIHJldHVybiB0bXBDYW52YXMuY2FudmFzO1xuXHQgIH1cblx0ICBwYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKSB7XG5cdCAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuXHQgICAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIHRoaXMuc2F2ZSgpO1xuXHQgICAgaWYgKCFfaXNfbm9kZS5pc05vZGVKUykge1xuXHQgICAgICBjdHguZmlsdGVyID0gXCJub25lXCI7XG5cdCAgICB9XG5cdCAgICBjdHguc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7XG5cdCAgICBsZXQgaW1nVG9QYWludDtcblx0ICAgIGlmIChpbWdEYXRhLmJpdG1hcCkge1xuXHQgICAgICBpbWdUb1BhaW50ID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQml0bWFwKGltZ0RhdGEpO1xuXHQgICAgfSBlbHNlIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIiAmJiBpbWdEYXRhIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgIWltZ0RhdGEuZGF0YSkge1xuXHQgICAgICBpbWdUb1BhaW50ID0gaW1nRGF0YTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuXHQgICAgICBwdXRCaW5hcnlJbWFnZURhdGEodG1wQ3R4LCBpbWdEYXRhKTtcblx0ICAgICAgaW1nVG9QYWludCA9IHRoaXMuYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyh0bXBDdHgpO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgc2NhbGVkID0gdGhpcy5fc2NhbGVJbWFnZShpbWdUb1BhaW50LCAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGN0eCkpO1xuXHQgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGdldEltYWdlU21vb3RoaW5nRW5hYmxlZCgoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3R4KSwgaW1nRGF0YS5pbnRlcnBvbGF0ZSk7XG5cdCAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBzY2FsZWQuaW1nLCAwLCAwLCBzY2FsZWQucGFpbnRXaWR0aCwgc2NhbGVkLnBhaW50SGVpZ2h0LCAwLCAtaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTtcblx0ICAgIHRoaXMuY29tcG9zZSgpO1xuXHQgICAgdGhpcy5yZXN0b3JlKCk7XG5cdCAgfVxuXHQgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAoaW1nRGF0YSwgbWFwKSB7XG5cdCAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBsZXQgaW1nVG9QYWludDtcblx0ICAgIGlmIChpbWdEYXRhLmJpdG1hcCkge1xuXHQgICAgICBpbWdUb1BhaW50ID0gaW1nRGF0YS5iaXRtYXA7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjb25zdCB3ID0gaW1nRGF0YS53aWR0aDtcblx0ICAgICAgY29uc3QgaCA9IGltZ0RhdGEuaGVpZ2h0O1xuXHQgICAgICBjb25zdCB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlubGluZUltYWdlXCIsIHcsIGgpO1xuXHQgICAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcblx0ICAgICAgcHV0QmluYXJ5SW1hZ2VEYXRhKHRtcEN0eCwgaW1nRGF0YSk7XG5cdCAgICAgIGltZ1RvUGFpbnQgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9DYW52YXModG1wQ3R4KTtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgZW50cnkgb2YgbWFwKSB7XG5cdCAgICAgIGN0eC5zYXZlKCk7XG5cdCAgICAgIGN0eC50cmFuc2Zvcm0oLi4uZW50cnkudHJhbnNmb3JtKTtcblx0ICAgICAgY3R4LnNjYWxlKDEsIC0xKTtcblx0ICAgICAgZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKGN0eCwgaW1nVG9QYWludCwgZW50cnkueCwgZW50cnkueSwgZW50cnkudywgZW50cnkuaCwgMCwgLTEsIDEsIDEpO1xuXHQgICAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jb21wb3NlKCk7XG5cdCAgfVxuXHQgIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpIHtcblx0ICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTtcblx0ICAgIHRoaXMuY29tcG9zZSgpO1xuXHQgIH1cblx0ICBtYXJrUG9pbnQodGFnKSB7fVxuXHQgIG1hcmtQb2ludFByb3BzKHRhZywgcHJvcGVydGllcykge31cblx0ICBiZWdpbk1hcmtlZENvbnRlbnQodGFnKSB7XG5cdCAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wdXNoKHtcblx0ICAgICAgdmlzaWJsZTogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGJlZ2luTWFya2VkQ29udGVudFByb3BzKHRhZywgcHJvcGVydGllcykge1xuXHQgICAgaWYgKHRhZyA9PT0gXCJPQ1wiKSB7XG5cdCAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuXHQgICAgICAgIHZpc2libGU6IHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnLmlzVmlzaWJsZShwcm9wZXJ0aWVzKVxuXHQgICAgICB9KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuXHQgICAgICAgIHZpc2libGU6IHRydWVcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmNvbnRlbnRWaXNpYmxlID0gdGhpcy5pc0NvbnRlbnRWaXNpYmxlKCk7XG5cdCAgfVxuXHQgIGVuZE1hcmtlZENvbnRlbnQoKSB7XG5cdCAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjay5wb3AoKTtcblx0ICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcblx0ICB9XG5cdCAgYmVnaW5Db21wYXQoKSB7fVxuXHQgIGVuZENvbXBhdCgpIHt9XG5cdCAgY29uc3VtZVBhdGgoY2xpcEJveCkge1xuXHQgICAgY29uc3QgaXNFbXB0eSA9IHRoaXMuY3VycmVudC5pc0VtcHR5Q2xpcCgpO1xuXHQgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LnVwZGF0ZUNsaXBGcm9tUGF0aCgpO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0aGlzLnBlbmRpbmdDbGlwKSB7XG5cdCAgICAgIHRoaXMuY29tcG9zZShjbGlwQm94KTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcblx0ICAgICAgaWYgKCFpc0VtcHR5KSB7XG5cdCAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXAgPT09IEVPX0NMSVApIHtcblx0ICAgICAgICAgIGN0eC5jbGlwKFwiZXZlbm9kZFwiKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgY3R4LmNsaXAoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICB0aGlzLmN1cnJlbnQuc3RhcnROZXdQYXRoQW5kQ2xpcEJveCh0aGlzLmN1cnJlbnQuY2xpcEJveCk7XG5cdCAgICBjdHguYmVnaW5QYXRoKCk7XG5cdCAgfVxuXHQgIGdldFNpbmdsZVBpeGVsV2lkdGgoKSB7XG5cdCAgICBpZiAoIXRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGgpIHtcblx0ICAgICAgY29uc3QgbSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG5cdCAgICAgIGlmIChtWzFdID09PSAwICYmIG1bMl0gPT09IDApIHtcblx0ICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gMSAvIE1hdGgubWluKE1hdGguYWJzKG1bMF0pLCBNYXRoLmFicyhtWzNdKSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgY29uc3QgYWJzRGV0ID0gTWF0aC5hYnMobVswXSAqIG1bM10gLSBtWzJdICogbVsxXSk7XG5cdCAgICAgICAgY29uc3Qgbm9ybVggPSBNYXRoLmh5cG90KG1bMF0sIG1bMl0pO1xuXHQgICAgICAgIGNvbnN0IG5vcm1ZID0gTWF0aC5oeXBvdChtWzFdLCBtWzNdKTtcblx0ICAgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gTWF0aC5tYXgobm9ybVgsIG5vcm1ZKSAvIGFic0RldDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGg7XG5cdCAgfVxuXHQgIGdldFNjYWxlRm9yU3Ryb2tpbmcoKSB7XG5cdCAgICBpZiAoIXRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmcpIHtcblx0ICAgICAgY29uc3Qge1xuXHQgICAgICAgIGxpbmVXaWR0aFxuXHQgICAgICB9ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICBjb25zdCBtID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcblx0ICAgICAgbGV0IHNjYWxlWCwgc2NhbGVZO1xuXHQgICAgICBpZiAobVsxXSA9PT0gMCAmJiBtWzJdID09PSAwKSB7XG5cdCAgICAgICAgY29uc3Qgbm9ybVggPSBNYXRoLmFicyhtWzBdKTtcblx0ICAgICAgICBjb25zdCBub3JtWSA9IE1hdGguYWJzKG1bM10pO1xuXHQgICAgICAgIGlmIChsaW5lV2lkdGggPT09IDApIHtcblx0ICAgICAgICAgIHNjYWxlWCA9IDEgLyBub3JtWDtcblx0ICAgICAgICAgIHNjYWxlWSA9IDEgLyBub3JtWTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgY29uc3Qgc2NhbGVkWExpbmVXaWR0aCA9IG5vcm1YICogbGluZVdpZHRoO1xuXHQgICAgICAgICAgY29uc3Qgc2NhbGVkWUxpbmVXaWR0aCA9IG5vcm1ZICogbGluZVdpZHRoO1xuXHQgICAgICAgICAgc2NhbGVYID0gc2NhbGVkWExpbmVXaWR0aCA8IDEgPyAxIC8gc2NhbGVkWExpbmVXaWR0aCA6IDE7XG5cdCAgICAgICAgICBzY2FsZVkgPSBzY2FsZWRZTGluZVdpZHRoIDwgMSA/IDEgLyBzY2FsZWRZTGluZVdpZHRoIDogMTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgY29uc3QgYWJzRGV0ID0gTWF0aC5hYnMobVswXSAqIG1bM10gLSBtWzJdICogbVsxXSk7XG5cdCAgICAgICAgY29uc3Qgbm9ybVggPSBNYXRoLmh5cG90KG1bMF0sIG1bMV0pO1xuXHQgICAgICAgIGNvbnN0IG5vcm1ZID0gTWF0aC5oeXBvdChtWzJdLCBtWzNdKTtcblx0ICAgICAgICBpZiAobGluZVdpZHRoID09PSAwKSB7XG5cdCAgICAgICAgICBzY2FsZVggPSBub3JtWSAvIGFic0RldDtcblx0ICAgICAgICAgIHNjYWxlWSA9IG5vcm1YIC8gYWJzRGV0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBjb25zdCBiYXNlQXJlYSA9IGxpbmVXaWR0aCAqIGFic0RldDtcblx0ICAgICAgICAgIHNjYWxlWCA9IG5vcm1ZID4gYmFzZUFyZWEgPyBub3JtWSAvIGJhc2VBcmVhIDogMTtcblx0ICAgICAgICAgIHNjYWxlWSA9IG5vcm1YID4gYmFzZUFyZWEgPyBub3JtWCAvIGJhc2VBcmVhIDogMTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZyA9IFtzY2FsZVgsIHNjYWxlWV07XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZztcblx0ICB9XG5cdCAgcmVzY2FsZUFuZFN0cm9rZShzYXZlUmVzdG9yZSkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBjdHhcblx0ICAgIH0gPSB0aGlzO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBsaW5lV2lkdGhcblx0ICAgIH0gPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICBjb25zdCBbc2NhbGVYLCBzY2FsZVldID0gdGhpcy5nZXRTY2FsZUZvclN0cm9raW5nKCk7XG5cdCAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoIHx8IDE7XG5cdCAgICBpZiAoc2NhbGVYID09PSAxICYmIHNjYWxlWSA9PT0gMSkge1xuXHQgICAgICBjdHguc3Ryb2tlKCk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGxldCBzYXZlZE1hdHJpeCwgc2F2ZWREYXNoZXMsIHNhdmVkRGFzaE9mZnNldDtcblx0ICAgIGlmIChzYXZlUmVzdG9yZSkge1xuXHQgICAgICBzYXZlZE1hdHJpeCA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpO1xuXHQgICAgICBzYXZlZERhc2hlcyA9IGN0eC5nZXRMaW5lRGFzaCgpLnNsaWNlKCk7XG5cdCAgICAgIHNhdmVkRGFzaE9mZnNldCA9IGN0eC5saW5lRGFzaE9mZnNldDtcblx0ICAgIH1cblx0ICAgIGN0eC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG5cdCAgICBjb25zdCBzY2FsZSA9IE1hdGgubWF4KHNjYWxlWCwgc2NhbGVZKTtcblx0ICAgIGN0eC5zZXRMaW5lRGFzaChjdHguZ2V0TGluZURhc2goKS5tYXAoeCA9PiB4IC8gc2NhbGUpKTtcblx0ICAgIGN0eC5saW5lRGFzaE9mZnNldCAvPSBzY2FsZTtcblx0ICAgIGN0eC5zdHJva2UoKTtcblx0ICAgIGlmIChzYXZlUmVzdG9yZSkge1xuXHQgICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLnNhdmVkTWF0cml4KTtcblx0ICAgICAgY3R4LnNldExpbmVEYXNoKHNhdmVkRGFzaGVzKTtcblx0ICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gc2F2ZWREYXNoT2Zmc2V0O1xuXHQgICAgfVxuXHQgIH1cblx0ICBpc0NvbnRlbnRWaXNpYmxlKCkge1xuXHQgICAgZm9yIChsZXQgaSA9IHRoaXMubWFya2VkQ29udGVudFN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdCAgICAgIGlmICghdGhpcy5tYXJrZWRDb250ZW50U3RhY2tbaV0udmlzaWJsZSkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQ2FudmFzR3JhcGhpY3MgPSBDYW52YXNHcmFwaGljcztcblx0Zm9yIChjb25zdCBvcCBpbiBfdXRpbC5PUFMpIHtcblx0ICBpZiAoQ2FudmFzR3JhcGhpY3MucHJvdG90eXBlW29wXSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbX3V0aWwuT1BTW29wXV0gPSBDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbb3BdO1xuXHQgIH1cblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiAxMiAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuVGlsaW5nUGF0dGVybiA9IGV4cG9ydHMuUGF0aFR5cGUgPSB2b2lkIDA7XG5cdGV4cG9ydHMuZ2V0U2hhZGluZ1BhdHRlcm4gPSBnZXRTaGFkaW5nUGF0dGVybjtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTtcblx0Y29uc3QgUGF0aFR5cGUgPSB7XG5cdCAgRklMTDogXCJGaWxsXCIsXG5cdCAgU1RST0tFOiBcIlN0cm9rZVwiLFxuXHQgIFNIQURJTkc6IFwiU2hhZGluZ1wiXG5cdH07XG5cdGV4cG9ydHMuUGF0aFR5cGUgPSBQYXRoVHlwZTtcblx0ZnVuY3Rpb24gYXBwbHlCb3VuZGluZ0JveChjdHgsIGJib3gpIHtcblx0ICBpZiAoIWJib3gpIHtcblx0ICAgIHJldHVybjtcblx0ICB9XG5cdCAgY29uc3Qgd2lkdGggPSBiYm94WzJdIC0gYmJveFswXTtcblx0ICBjb25zdCBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTtcblx0ICBjb25zdCByZWdpb24gPSBuZXcgUGF0aDJEKCk7XG5cdCAgcmVnaW9uLnJlY3QoYmJveFswXSwgYmJveFsxXSwgd2lkdGgsIGhlaWdodCk7XG5cdCAgY3R4LmNsaXAocmVnaW9uKTtcblx0fVxuXHRjbGFzcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuXHQgIGNvbnN0cnVjdG9yKCkge1xuXHQgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VTaGFkaW5nUGF0dGVybikge1xuXHQgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNoYWRpbmdQYXR0ZXJuLlwiKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0UGF0dGVybigpIHtcblx0ICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYGdldFBhdHRlcm5gIGNhbGxlZC5cIik7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFJhZGlhbEF4aWFsU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuXHQgIGNvbnN0cnVjdG9yKElSKSB7XG5cdCAgICBzdXBlcigpO1xuXHQgICAgdGhpcy5fdHlwZSA9IElSWzFdO1xuXHQgICAgdGhpcy5fYmJveCA9IElSWzJdO1xuXHQgICAgdGhpcy5fY29sb3JTdG9wcyA9IElSWzNdO1xuXHQgICAgdGhpcy5fcDAgPSBJUls0XTtcblx0ICAgIHRoaXMuX3AxID0gSVJbNV07XG5cdCAgICB0aGlzLl9yMCA9IElSWzZdO1xuXHQgICAgdGhpcy5fcjEgPSBJUls3XTtcblx0ICAgIHRoaXMubWF0cml4ID0gbnVsbDtcblx0ICB9XG5cdCAgX2NyZWF0ZUdyYWRpZW50KGN0eCkge1xuXHQgICAgbGV0IGdyYWQ7XG5cdCAgICBpZiAodGhpcy5fdHlwZSA9PT0gXCJheGlhbFwiKSB7XG5cdCAgICAgIGdyYWQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQodGhpcy5fcDBbMF0sIHRoaXMuX3AwWzFdLCB0aGlzLl9wMVswXSwgdGhpcy5fcDFbMV0pO1xuXHQgICAgfSBlbHNlIGlmICh0aGlzLl90eXBlID09PSBcInJhZGlhbFwiKSB7XG5cdCAgICAgIGdyYWQgPSBjdHguY3JlYXRlUmFkaWFsR3JhZGllbnQodGhpcy5fcDBbMF0sIHRoaXMuX3AwWzFdLCB0aGlzLl9yMCwgdGhpcy5fcDFbMF0sIHRoaXMuX3AxWzFdLCB0aGlzLl9yMSk7XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IGNvbG9yU3RvcCBvZiB0aGlzLl9jb2xvclN0b3BzKSB7XG5cdCAgICAgIGdyYWQuYWRkQ29sb3JTdG9wKGNvbG9yU3RvcFswXSwgY29sb3JTdG9wWzFdKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBncmFkO1xuXHQgIH1cblx0ICBnZXRQYXR0ZXJuKGN0eCwgb3duZXIsIGludmVyc2UsIHBhdGhUeXBlKSB7XG5cdCAgICBsZXQgcGF0dGVybjtcblx0ICAgIGlmIChwYXRoVHlwZSA9PT0gUGF0aFR5cGUuU1RST0tFIHx8IHBhdGhUeXBlID09PSBQYXRoVHlwZS5GSUxMKSB7XG5cdCAgICAgIGNvbnN0IG93bmVyQkJveCA9IG93bmVyLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveChwYXRoVHlwZSwgKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCkpIHx8IFswLCAwLCAwLCAwXTtcblx0ICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLmNlaWwob3duZXJCQm94WzJdIC0gb3duZXJCQm94WzBdKSB8fCAxO1xuXHQgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmNlaWwob3duZXJCQm94WzNdIC0gb3duZXJCQm94WzFdKSB8fCAxO1xuXHQgICAgICBjb25zdCB0bXBDYW52YXMgPSBvd25lci5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuXHQgICAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcblx0ICAgICAgdG1wQ3R4LmNsZWFyUmVjdCgwLCAwLCB0bXBDdHguY2FudmFzLndpZHRoLCB0bXBDdHguY2FudmFzLmhlaWdodCk7XG5cdCAgICAgIHRtcEN0eC5iZWdpblBhdGgoKTtcblx0ICAgICAgdG1wQ3R4LnJlY3QoMCwgMCwgdG1wQ3R4LmNhbnZhcy53aWR0aCwgdG1wQ3R4LmNhbnZhcy5oZWlnaHQpO1xuXHQgICAgICB0bXBDdHgudHJhbnNsYXRlKC1vd25lckJCb3hbMF0sIC1vd25lckJCb3hbMV0pO1xuXHQgICAgICBpbnZlcnNlID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0oaW52ZXJzZSwgWzEsIDAsIDAsIDEsIG93bmVyQkJveFswXSwgb3duZXJCQm94WzFdXSk7XG5cdCAgICAgIHRtcEN0eC50cmFuc2Zvcm0oLi4ub3duZXIuYmFzZVRyYW5zZm9ybSk7XG5cdCAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuXHQgICAgICAgIHRtcEN0eC50cmFuc2Zvcm0oLi4udGhpcy5tYXRyaXgpO1xuXHQgICAgICB9XG5cdCAgICAgIGFwcGx5Qm91bmRpbmdCb3godG1wQ3R4LCB0aGlzLl9iYm94KTtcblx0ICAgICAgdG1wQ3R4LmZpbGxTdHlsZSA9IHRoaXMuX2NyZWF0ZUdyYWRpZW50KHRtcEN0eCk7XG5cdCAgICAgIHRtcEN0eC5maWxsKCk7XG5cdCAgICAgIHBhdHRlcm4gPSBjdHguY3JlYXRlUGF0dGVybih0bXBDYW52YXMuY2FudmFzLCBcIm5vLXJlcGVhdFwiKTtcblx0ICAgICAgY29uc3QgZG9tTWF0cml4ID0gbmV3IERPTU1hdHJpeChpbnZlcnNlKTtcblx0ICAgICAgcGF0dGVybi5zZXRUcmFuc2Zvcm0oZG9tTWF0cml4KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGFwcGx5Qm91bmRpbmdCb3goY3R4LCB0aGlzLl9iYm94KTtcblx0ICAgICAgcGF0dGVybiA9IHRoaXMuX2NyZWF0ZUdyYWRpZW50KGN0eCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcGF0dGVybjtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHAxLCBwMiwgcDMsIGMxLCBjMiwgYzMpIHtcblx0ICBjb25zdCBjb29yZHMgPSBjb250ZXh0LmNvb3Jkcyxcblx0ICAgIGNvbG9ycyA9IGNvbnRleHQuY29sb3JzO1xuXHQgIGNvbnN0IGJ5dGVzID0gZGF0YS5kYXRhLFxuXHQgICAgcm93U2l6ZSA9IGRhdGEud2lkdGggKiA0O1xuXHQgIGxldCB0bXA7XG5cdCAgaWYgKGNvb3Jkc1twMSArIDFdID4gY29vcmRzW3AyICsgMV0pIHtcblx0ICAgIHRtcCA9IHAxO1xuXHQgICAgcDEgPSBwMjtcblx0ICAgIHAyID0gdG1wO1xuXHQgICAgdG1wID0gYzE7XG5cdCAgICBjMSA9IGMyO1xuXHQgICAgYzIgPSB0bXA7XG5cdCAgfVxuXHQgIGlmIChjb29yZHNbcDIgKyAxXSA+IGNvb3Jkc1twMyArIDFdKSB7XG5cdCAgICB0bXAgPSBwMjtcblx0ICAgIHAyID0gcDM7XG5cdCAgICBwMyA9IHRtcDtcblx0ICAgIHRtcCA9IGMyO1xuXHQgICAgYzIgPSBjMztcblx0ICAgIGMzID0gdG1wO1xuXHQgIH1cblx0ICBpZiAoY29vcmRzW3AxICsgMV0gPiBjb29yZHNbcDIgKyAxXSkge1xuXHQgICAgdG1wID0gcDE7XG5cdCAgICBwMSA9IHAyO1xuXHQgICAgcDIgPSB0bXA7XG5cdCAgICB0bXAgPSBjMTtcblx0ICAgIGMxID0gYzI7XG5cdCAgICBjMiA9IHRtcDtcblx0ICB9XG5cdCAgY29uc3QgeDEgPSAoY29vcmRzW3AxXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDtcblx0ICBjb25zdCB5MSA9IChjb29yZHNbcDEgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTtcblx0ICBjb25zdCB4MiA9IChjb29yZHNbcDJdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYO1xuXHQgIGNvbnN0IHkyID0gKGNvb3Jkc1twMiArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZO1xuXHQgIGNvbnN0IHgzID0gKGNvb3Jkc1twM10gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7XG5cdCAgY29uc3QgeTMgPSAoY29vcmRzW3AzICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7XG5cdCAgaWYgKHkxID49IHkzKSB7XG5cdCAgICByZXR1cm47XG5cdCAgfVxuXHQgIGNvbnN0IGMxciA9IGNvbG9yc1tjMV0sXG5cdCAgICBjMWcgPSBjb2xvcnNbYzEgKyAxXSxcblx0ICAgIGMxYiA9IGNvbG9yc1tjMSArIDJdO1xuXHQgIGNvbnN0IGMyciA9IGNvbG9yc1tjMl0sXG5cdCAgICBjMmcgPSBjb2xvcnNbYzIgKyAxXSxcblx0ICAgIGMyYiA9IGNvbG9yc1tjMiArIDJdO1xuXHQgIGNvbnN0IGMzciA9IGNvbG9yc1tjM10sXG5cdCAgICBjM2cgPSBjb2xvcnNbYzMgKyAxXSxcblx0ICAgIGMzYiA9IGNvbG9yc1tjMyArIDJdO1xuXHQgIGNvbnN0IG1pblkgPSBNYXRoLnJvdW5kKHkxKSxcblx0ICAgIG1heFkgPSBNYXRoLnJvdW5kKHkzKTtcblx0ICBsZXQgeGEsIGNhciwgY2FnLCBjYWI7XG5cdCAgbGV0IHhiLCBjYnIsIGNiZywgY2JiO1xuXHQgIGZvciAobGV0IHkgPSBtaW5ZOyB5IDw9IG1heFk7IHkrKykge1xuXHQgICAgaWYgKHkgPCB5Mikge1xuXHQgICAgICBsZXQgaztcblx0ICAgICAgaWYgKHkgPCB5MSkge1xuXHQgICAgICAgIGsgPSAwO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGsgPSAoeTEgLSB5KSAvICh5MSAtIHkyKTtcblx0ICAgICAgfVxuXHQgICAgICB4YSA9IHgxIC0gKHgxIC0geDIpICogaztcblx0ICAgICAgY2FyID0gYzFyIC0gKGMxciAtIGMycikgKiBrO1xuXHQgICAgICBjYWcgPSBjMWcgLSAoYzFnIC0gYzJnKSAqIGs7XG5cdCAgICAgIGNhYiA9IGMxYiAtIChjMWIgLSBjMmIpICogaztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGxldCBrO1xuXHQgICAgICBpZiAoeSA+IHkzKSB7XG5cdCAgICAgICAgayA9IDE7XG5cdCAgICAgIH0gZWxzZSBpZiAoeTIgPT09IHkzKSB7XG5cdCAgICAgICAgayA9IDA7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgayA9ICh5MiAtIHkpIC8gKHkyIC0geTMpO1xuXHQgICAgICB9XG5cdCAgICAgIHhhID0geDIgLSAoeDIgLSB4MykgKiBrO1xuXHQgICAgICBjYXIgPSBjMnIgLSAoYzJyIC0gYzNyKSAqIGs7XG5cdCAgICAgIGNhZyA9IGMyZyAtIChjMmcgLSBjM2cpICogaztcblx0ICAgICAgY2FiID0gYzJiIC0gKGMyYiAtIGMzYikgKiBrO1xuXHQgICAgfVxuXHQgICAgbGV0IGs7XG5cdCAgICBpZiAoeSA8IHkxKSB7XG5cdCAgICAgIGsgPSAwO1xuXHQgICAgfSBlbHNlIGlmICh5ID4geTMpIHtcblx0ICAgICAgayA9IDE7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBrID0gKHkxIC0geSkgLyAoeTEgLSB5Myk7XG5cdCAgICB9XG5cdCAgICB4YiA9IHgxIC0gKHgxIC0geDMpICogaztcblx0ICAgIGNiciA9IGMxciAtIChjMXIgLSBjM3IpICogaztcblx0ICAgIGNiZyA9IGMxZyAtIChjMWcgLSBjM2cpICogaztcblx0ICAgIGNiYiA9IGMxYiAtIChjMWIgLSBjM2IpICogaztcblx0ICAgIGNvbnN0IHgxXyA9IE1hdGgucm91bmQoTWF0aC5taW4oeGEsIHhiKSk7XG5cdCAgICBjb25zdCB4Ml8gPSBNYXRoLnJvdW5kKE1hdGgubWF4KHhhLCB4YikpO1xuXHQgICAgbGV0IGogPSByb3dTaXplICogeSArIHgxXyAqIDQ7XG5cdCAgICBmb3IgKGxldCB4ID0geDFfOyB4IDw9IHgyXzsgeCsrKSB7XG5cdCAgICAgIGsgPSAoeGEgLSB4KSAvICh4YSAtIHhiKTtcblx0ICAgICAgaWYgKGsgPCAwKSB7XG5cdCAgICAgICAgayA9IDA7XG5cdCAgICAgIH0gZWxzZSBpZiAoayA+IDEpIHtcblx0ICAgICAgICBrID0gMTtcblx0ICAgICAgfVxuXHQgICAgICBieXRlc1tqKytdID0gY2FyIC0gKGNhciAtIGNicikgKiBrIHwgMDtcblx0ICAgICAgYnl0ZXNbaisrXSA9IGNhZyAtIChjYWcgLSBjYmcpICogayB8IDA7XG5cdCAgICAgIGJ5dGVzW2orK10gPSBjYWIgLSAoY2FiIC0gY2JiKSAqIGsgfCAwO1xuXHQgICAgICBieXRlc1tqKytdID0gMjU1O1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBkcmF3RmlndXJlKGRhdGEsIGZpZ3VyZSwgY29udGV4dCkge1xuXHQgIGNvbnN0IHBzID0gZmlndXJlLmNvb3Jkcztcblx0ICBjb25zdCBjcyA9IGZpZ3VyZS5jb2xvcnM7XG5cdCAgbGV0IGksIGlpO1xuXHQgIHN3aXRjaCAoZmlndXJlLnR5cGUpIHtcblx0ICAgIGNhc2UgXCJsYXR0aWNlXCI6XG5cdCAgICAgIGNvbnN0IHZlcnRpY2VzUGVyUm93ID0gZmlndXJlLnZlcnRpY2VzUGVyUm93O1xuXHQgICAgICBjb25zdCByb3dzID0gTWF0aC5mbG9vcihwcy5sZW5ndGggLyB2ZXJ0aWNlc1BlclJvdykgLSAxO1xuXHQgICAgICBjb25zdCBjb2xzID0gdmVydGljZXNQZXJSb3cgLSAxO1xuXHQgICAgICBmb3IgKGkgPSAwOyBpIDwgcm93czsgaSsrKSB7XG5cdCAgICAgICAgbGV0IHEgPSBpICogdmVydGljZXNQZXJSb3c7XG5cdCAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyssIHErKykge1xuXHQgICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3FdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3FdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pO1xuXHQgICAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBwc1txICsgMV0sIHBzW3EgKyB2ZXJ0aWNlc1BlclJvd10sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvdyArIDFdLCBjc1txICsgMV0sIGNzW3EgKyB2ZXJ0aWNlc1BlclJvd10pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBicmVhaztcblx0ICAgIGNhc2UgXCJ0cmlhbmdsZXNcIjpcblx0ICAgICAgZm9yIChpID0gMCwgaWkgPSBwcy5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7XG5cdCAgICAgICAgZHJhd1RyaWFuZ2xlKGRhdGEsIGNvbnRleHQsIHBzW2ldLCBwc1tpICsgMV0sIHBzW2kgKyAyXSwgY3NbaV0sIGNzW2kgKyAxXSwgY3NbaSArIDJdKTtcblx0ICAgICAgfVxuXHQgICAgICBicmVhaztcblx0ICAgIGRlZmF1bHQ6XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgZmlndXJlXCIpO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBNZXNoU2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuXHQgIGNvbnN0cnVjdG9yKElSKSB7XG5cdCAgICBzdXBlcigpO1xuXHQgICAgdGhpcy5fY29vcmRzID0gSVJbMl07XG5cdCAgICB0aGlzLl9jb2xvcnMgPSBJUlszXTtcblx0ICAgIHRoaXMuX2ZpZ3VyZXMgPSBJUls0XTtcblx0ICAgIHRoaXMuX2JvdW5kcyA9IElSWzVdO1xuXHQgICAgdGhpcy5fYmJveCA9IElSWzddO1xuXHQgICAgdGhpcy5fYmFja2dyb3VuZCA9IElSWzhdO1xuXHQgICAgdGhpcy5tYXRyaXggPSBudWxsO1xuXHQgIH1cblx0ICBfY3JlYXRlTWVzaENhbnZhcyhjb21iaW5lZFNjYWxlLCBiYWNrZ3JvdW5kQ29sb3IsIGNhY2hlZENhbnZhc2VzKSB7XG5cdCAgICBjb25zdCBFWFBFQ1RFRF9TQ0FMRSA9IDEuMTtcblx0ICAgIGNvbnN0IE1BWF9QQVRURVJOX1NJWkUgPSAzMDAwO1xuXHQgICAgY29uc3QgQk9SREVSX1NJWkUgPSAyO1xuXHQgICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGguZmxvb3IodGhpcy5fYm91bmRzWzBdKTtcblx0ICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLmZsb29yKHRoaXMuX2JvdW5kc1sxXSk7XG5cdCAgICBjb25zdCBib3VuZHNXaWR0aCA9IE1hdGguY2VpbCh0aGlzLl9ib3VuZHNbMl0pIC0gb2Zmc2V0WDtcblx0ICAgIGNvbnN0IGJvdW5kc0hlaWdodCA9IE1hdGguY2VpbCh0aGlzLl9ib3VuZHNbM10pIC0gb2Zmc2V0WTtcblx0ICAgIGNvbnN0IHdpZHRoID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGJvdW5kc1dpZHRoICogY29tYmluZWRTY2FsZVswXSAqIEVYUEVDVEVEX1NDQUxFKSksIE1BWF9QQVRURVJOX1NJWkUpO1xuXHQgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5taW4oTWF0aC5jZWlsKE1hdGguYWJzKGJvdW5kc0hlaWdodCAqIGNvbWJpbmVkU2NhbGVbMV0gKiBFWFBFQ1RFRF9TQ0FMRSkpLCBNQVhfUEFUVEVSTl9TSVpFKTtcblx0ICAgIGNvbnN0IHNjYWxlWCA9IGJvdW5kc1dpZHRoIC8gd2lkdGg7XG5cdCAgICBjb25zdCBzY2FsZVkgPSBib3VuZHNIZWlnaHQgLyBoZWlnaHQ7XG5cdCAgICBjb25zdCBjb250ZXh0ID0ge1xuXHQgICAgICBjb29yZHM6IHRoaXMuX2Nvb3Jkcyxcblx0ICAgICAgY29sb3JzOiB0aGlzLl9jb2xvcnMsXG5cdCAgICAgIG9mZnNldFg6IC1vZmZzZXRYLFxuXHQgICAgICBvZmZzZXRZOiAtb2Zmc2V0WSxcblx0ICAgICAgc2NhbGVYOiAxIC8gc2NhbGVYLFxuXHQgICAgICBzY2FsZVk6IDEgLyBzY2FsZVlcblx0ICAgIH07XG5cdCAgICBjb25zdCBwYWRkZWRXaWR0aCA9IHdpZHRoICsgQk9SREVSX1NJWkUgKiAyO1xuXHQgICAgY29uc3QgcGFkZGVkSGVpZ2h0ID0gaGVpZ2h0ICsgQk9SREVSX1NJWkUgKiAyO1xuXHQgICAgY29uc3QgdG1wQ2FudmFzID0gY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWVzaFwiLCBwYWRkZWRXaWR0aCwgcGFkZGVkSGVpZ2h0LCBmYWxzZSk7XG5cdCAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcblx0ICAgIGNvbnN0IGRhdGEgPSB0bXBDdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgaWYgKGJhY2tncm91bmRDb2xvcikge1xuXHQgICAgICBjb25zdCBieXRlcyA9IGRhdGEuZGF0YTtcblx0ICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYnl0ZXMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkge1xuXHQgICAgICAgIGJ5dGVzW2ldID0gYmFja2dyb3VuZENvbG9yWzBdO1xuXHQgICAgICAgIGJ5dGVzW2kgKyAxXSA9IGJhY2tncm91bmRDb2xvclsxXTtcblx0ICAgICAgICBieXRlc1tpICsgMl0gPSBiYWNrZ3JvdW5kQ29sb3JbMl07XG5cdCAgICAgICAgYnl0ZXNbaSArIDNdID0gMjU1O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IGZpZ3VyZSBvZiB0aGlzLl9maWd1cmVzKSB7XG5cdCAgICAgIGRyYXdGaWd1cmUoZGF0YSwgZmlndXJlLCBjb250ZXh0KTtcblx0ICAgIH1cblx0ICAgIHRtcEN0eC5wdXRJbWFnZURhdGEoZGF0YSwgQk9SREVSX1NJWkUsIEJPUkRFUl9TSVpFKTtcblx0ICAgIGNvbnN0IGNhbnZhcyA9IHRtcENhbnZhcy5jYW52YXM7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjYW52YXMsXG5cdCAgICAgIG9mZnNldFg6IG9mZnNldFggLSBCT1JERVJfU0laRSAqIHNjYWxlWCxcblx0ICAgICAgb2Zmc2V0WTogb2Zmc2V0WSAtIEJPUkRFUl9TSVpFICogc2NhbGVZLFxuXHQgICAgICBzY2FsZVgsXG5cdCAgICAgIHNjYWxlWVxuXHQgICAgfTtcblx0ICB9XG5cdCAgZ2V0UGF0dGVybihjdHgsIG93bmVyLCBpbnZlcnNlLCBwYXRoVHlwZSkge1xuXHQgICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIHRoaXMuX2Jib3gpO1xuXHQgICAgbGV0IHNjYWxlO1xuXHQgICAgaWYgKHBhdGhUeXBlID09PSBQYXRoVHlwZS5TSEFESU5HKSB7XG5cdCAgICAgIHNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSgoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3R4KSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBzY2FsZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUob3duZXIuYmFzZVRyYW5zZm9ybSk7XG5cdCAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuXHQgICAgICAgIGNvbnN0IG1hdHJpeFNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7XG5cdCAgICAgICAgc2NhbGUgPSBbc2NhbGVbMF0gKiBtYXRyaXhTY2FsZVswXSwgc2NhbGVbMV0gKiBtYXRyaXhTY2FsZVsxXV07XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGNvbnN0IHRlbXBvcmFyeVBhdHRlcm5DYW52YXMgPSB0aGlzLl9jcmVhdGVNZXNoQ2FudmFzKHNjYWxlLCBwYXRoVHlwZSA9PT0gUGF0aFR5cGUuU0hBRElORyA/IG51bGwgOiB0aGlzLl9iYWNrZ3JvdW5kLCBvd25lci5jYWNoZWRDYW52YXNlcyk7XG5cdCAgICBpZiAocGF0aFR5cGUgIT09IFBhdGhUeXBlLlNIQURJTkcpIHtcblx0ICAgICAgY3R4LnNldFRyYW5zZm9ybSguLi5vd25lci5iYXNlVHJhbnNmb3JtKTtcblx0ICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG5cdCAgICAgICAgY3R4LnRyYW5zZm9ybSguLi50aGlzLm1hdHJpeCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGN0eC50cmFuc2xhdGUodGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFkpO1xuXHQgICAgY3R4LnNjYWxlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWSk7XG5cdCAgICByZXR1cm4gY3R4LmNyZWF0ZVBhdHRlcm4odGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5jYW52YXMsIFwibm8tcmVwZWF0XCIpO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBEdW1teVNoYWRpbmdQYXR0ZXJuIGV4dGVuZHMgQmFzZVNoYWRpbmdQYXR0ZXJuIHtcblx0ICBnZXRQYXR0ZXJuKCkge1xuXHQgICAgcmV0dXJuIFwiaG90cGlua1wiO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBnZXRTaGFkaW5nUGF0dGVybihJUikge1xuXHQgIHN3aXRjaCAoSVJbMF0pIHtcblx0ICAgIGNhc2UgXCJSYWRpYWxBeGlhbFwiOlxuXHQgICAgICByZXR1cm4gbmV3IFJhZGlhbEF4aWFsU2hhZGluZ1BhdHRlcm4oSVIpO1xuXHQgICAgY2FzZSBcIk1lc2hcIjpcblx0ICAgICAgcmV0dXJuIG5ldyBNZXNoU2hhZGluZ1BhdHRlcm4oSVIpO1xuXHQgICAgY2FzZSBcIkR1bW15XCI6XG5cdCAgICAgIHJldHVybiBuZXcgRHVtbXlTaGFkaW5nUGF0dGVybigpO1xuXHQgIH1cblx0ICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSVIgdHlwZTogJHtJUlswXX1gKTtcblx0fVxuXHRjb25zdCBQYWludFR5cGUgPSB7XG5cdCAgQ09MT1JFRDogMSxcblx0ICBVTkNPTE9SRUQ6IDJcblx0fTtcblx0Y2xhc3MgVGlsaW5nUGF0dGVybiB7XG5cdCAgc3RhdGljIE1BWF9QQVRURVJOX1NJWkUgPSAzMDAwO1xuXHQgIGNvbnN0cnVjdG9yKElSLCBjb2xvciwgY3R4LCBjYW52YXNHcmFwaGljc0ZhY3RvcnksIGJhc2VUcmFuc2Zvcm0pIHtcblx0ICAgIHRoaXMub3BlcmF0b3JMaXN0ID0gSVJbMl07XG5cdCAgICB0aGlzLm1hdHJpeCA9IElSWzNdIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcblx0ICAgIHRoaXMuYmJveCA9IElSWzRdO1xuXHQgICAgdGhpcy54c3RlcCA9IElSWzVdO1xuXHQgICAgdGhpcy55c3RlcCA9IElSWzZdO1xuXHQgICAgdGhpcy5wYWludFR5cGUgPSBJUls3XTtcblx0ICAgIHRoaXMudGlsaW5nVHlwZSA9IElSWzhdO1xuXHQgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuXHQgICAgdGhpcy5jdHggPSBjdHg7XG5cdCAgICB0aGlzLmNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IGNhbnZhc0dyYXBoaWNzRmFjdG9yeTtcblx0ICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IGJhc2VUcmFuc2Zvcm07XG5cdCAgfVxuXHQgIGNyZWF0ZVBhdHRlcm5DYW52YXMob3duZXIpIHtcblx0ICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IHRoaXMub3BlcmF0b3JMaXN0O1xuXHQgICAgY29uc3QgYmJveCA9IHRoaXMuYmJveDtcblx0ICAgIGNvbnN0IHhzdGVwID0gdGhpcy54c3RlcDtcblx0ICAgIGNvbnN0IHlzdGVwID0gdGhpcy55c3RlcDtcblx0ICAgIGNvbnN0IHBhaW50VHlwZSA9IHRoaXMucGFpbnRUeXBlO1xuXHQgICAgY29uc3QgdGlsaW5nVHlwZSA9IHRoaXMudGlsaW5nVHlwZTtcblx0ICAgIGNvbnN0IGNvbG9yID0gdGhpcy5jb2xvcjtcblx0ICAgIGNvbnN0IGNhbnZhc0dyYXBoaWNzRmFjdG9yeSA9IHRoaXMuY2FudmFzR3JhcGhpY3NGYWN0b3J5O1xuXHQgICAgKDAsIF91dGlsLmluZm8pKFwiVGlsaW5nVHlwZTogXCIgKyB0aWxpbmdUeXBlKTtcblx0ICAgIGNvbnN0IHgwID0gYmJveFswXSxcblx0ICAgICAgeTAgPSBiYm94WzFdLFxuXHQgICAgICB4MSA9IGJib3hbMl0sXG5cdCAgICAgIHkxID0gYmJveFszXTtcblx0ICAgIGNvbnN0IG1hdHJpeFNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLm1hdHJpeCk7XG5cdCAgICBjb25zdCBjdXJNYXRyaXhTY2FsZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodGhpcy5iYXNlVHJhbnNmb3JtKTtcblx0ICAgIGNvbnN0IGNvbWJpbmVkU2NhbGUgPSBbbWF0cml4U2NhbGVbMF0gKiBjdXJNYXRyaXhTY2FsZVswXSwgbWF0cml4U2NhbGVbMV0gKiBjdXJNYXRyaXhTY2FsZVsxXV07XG5cdCAgICBjb25zdCBkaW14ID0gdGhpcy5nZXRTaXplQW5kU2NhbGUoeHN0ZXAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgY29tYmluZWRTY2FsZVswXSk7XG5cdCAgICBjb25zdCBkaW15ID0gdGhpcy5nZXRTaXplQW5kU2NhbGUoeXN0ZXAsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQsIGNvbWJpbmVkU2NhbGVbMV0pO1xuXHQgICAgY29uc3QgdG1wQ2FudmFzID0gb3duZXIuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwicGF0dGVyblwiLCBkaW14LnNpemUsIGRpbXkuc2l6ZSwgdHJ1ZSk7XG5cdCAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcblx0ICAgIGNvbnN0IGdyYXBoaWNzID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5LmNyZWF0ZUNhbnZhc0dyYXBoaWNzKHRtcEN0eCk7XG5cdCAgICBncmFwaGljcy5ncm91cExldmVsID0gb3duZXIuZ3JvdXBMZXZlbDtcblx0ICAgIHRoaXMuc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KGdyYXBoaWNzLCBwYWludFR5cGUsIGNvbG9yKTtcblx0ICAgIGxldCBhZGp1c3RlZFgwID0geDA7XG5cdCAgICBsZXQgYWRqdXN0ZWRZMCA9IHkwO1xuXHQgICAgbGV0IGFkanVzdGVkWDEgPSB4MTtcblx0ICAgIGxldCBhZGp1c3RlZFkxID0geTE7XG5cdCAgICBpZiAoeDAgPCAwKSB7XG5cdCAgICAgIGFkanVzdGVkWDAgPSAwO1xuXHQgICAgICBhZGp1c3RlZFgxICs9IE1hdGguYWJzKHgwKTtcblx0ICAgIH1cblx0ICAgIGlmICh5MCA8IDApIHtcblx0ICAgICAgYWRqdXN0ZWRZMCA9IDA7XG5cdCAgICAgIGFkanVzdGVkWTEgKz0gTWF0aC5hYnMoeTApO1xuXHQgICAgfVxuXHQgICAgdG1wQ3R4LnRyYW5zbGF0ZSgtKGRpbXguc2NhbGUgKiBhZGp1c3RlZFgwKSwgLShkaW15LnNjYWxlICogYWRqdXN0ZWRZMCkpO1xuXHQgICAgZ3JhcGhpY3MudHJhbnNmb3JtKGRpbXguc2NhbGUsIDAsIDAsIGRpbXkuc2NhbGUsIDAsIDApO1xuXHQgICAgdG1wQ3R4LnNhdmUoKTtcblx0ICAgIHRoaXMuY2xpcEJib3goZ3JhcGhpY3MsIGFkanVzdGVkWDAsIGFkanVzdGVkWTAsIGFkanVzdGVkWDEsIGFkanVzdGVkWTEpO1xuXHQgICAgZ3JhcGhpY3MuYmFzZVRyYW5zZm9ybSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShncmFwaGljcy5jdHgpO1xuXHQgICAgZ3JhcGhpY3MuZXhlY3V0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QpO1xuXHQgICAgZ3JhcGhpY3MuZW5kRHJhd2luZygpO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2FudmFzOiB0bXBDYW52YXMuY2FudmFzLFxuXHQgICAgICBzY2FsZVg6IGRpbXguc2NhbGUsXG5cdCAgICAgIHNjYWxlWTogZGlteS5zY2FsZSxcblx0ICAgICAgb2Zmc2V0WDogYWRqdXN0ZWRYMCxcblx0ICAgICAgb2Zmc2V0WTogYWRqdXN0ZWRZMFxuXHQgICAgfTtcblx0ICB9XG5cdCAgZ2V0U2l6ZUFuZFNjYWxlKHN0ZXAsIHJlYWxPdXRwdXRTaXplLCBzY2FsZSkge1xuXHQgICAgc3RlcCA9IE1hdGguYWJzKHN0ZXApO1xuXHQgICAgY29uc3QgbWF4U2l6ZSA9IE1hdGgubWF4KFRpbGluZ1BhdHRlcm4uTUFYX1BBVFRFUk5fU0laRSwgcmVhbE91dHB1dFNpemUpO1xuXHQgICAgbGV0IHNpemUgPSBNYXRoLmNlaWwoc3RlcCAqIHNjYWxlKTtcblx0ICAgIGlmIChzaXplID49IG1heFNpemUpIHtcblx0ICAgICAgc2l6ZSA9IG1heFNpemU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBzY2FsZSA9IHNpemUgLyBzdGVwO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgc2NhbGUsXG5cdCAgICAgIHNpemVcblx0ICAgIH07XG5cdCAgfVxuXHQgIGNsaXBCYm94KGdyYXBoaWNzLCB4MCwgeTAsIHgxLCB5MSkge1xuXHQgICAgY29uc3QgYmJveFdpZHRoID0geDEgLSB4MDtcblx0ICAgIGNvbnN0IGJib3hIZWlnaHQgPSB5MSAtIHkwO1xuXHQgICAgZ3JhcGhpY3MuY3R4LnJlY3QoeDAsIHkwLCBiYm94V2lkdGgsIGJib3hIZWlnaHQpO1xuXHQgICAgZ3JhcGhpY3MuY3VycmVudC51cGRhdGVSZWN0TWluTWF4KCgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShncmFwaGljcy5jdHgpLCBbeDAsIHkwLCB4MSwgeTFdKTtcblx0ICAgIGdyYXBoaWNzLmNsaXAoKTtcblx0ICAgIGdyYXBoaWNzLmVuZFBhdGgoKTtcblx0ICB9XG5cdCAgc2V0RmlsbEFuZFN0cm9rZVN0eWxlVG9Db250ZXh0KGdyYXBoaWNzLCBwYWludFR5cGUsIGNvbG9yKSB7XG5cdCAgICBjb25zdCBjb250ZXh0ID0gZ3JhcGhpY3MuY3R4LFxuXHQgICAgICBjdXJyZW50ID0gZ3JhcGhpY3MuY3VycmVudDtcblx0ICAgIHN3aXRjaCAocGFpbnRUeXBlKSB7XG5cdCAgICAgIGNhc2UgUGFpbnRUeXBlLkNPTE9SRUQ6XG5cdCAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuXHQgICAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBjdHguc3Ryb2tlU3R5bGU7XG5cdCAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjdHguZmlsbFN0eWxlO1xuXHQgICAgICAgIGN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjdHguc3Ryb2tlU3R5bGU7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgUGFpbnRUeXBlLlVOQ09MT1JFRDpcblx0ICAgICAgICBjb25zdCBjc3NDb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuXHQgICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY3NzQ29sb3I7XG5cdCAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGNzc0NvbG9yO1xuXHQgICAgICAgIGN1cnJlbnQuZmlsbENvbG9yID0gY3NzQ29sb3I7XG5cdCAgICAgICAgY3VycmVudC5zdHJva2VDb2xvciA9IGNzc0NvbG9yO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIHRocm93IG5ldyBfdXRpbC5Gb3JtYXRFcnJvcihgVW5zdXBwb3J0ZWQgcGFpbnQgdHlwZTogJHtwYWludFR5cGV9YCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldFBhdHRlcm4oY3R4LCBvd25lciwgaW52ZXJzZSwgcGF0aFR5cGUpIHtcblx0ICAgIGxldCBtYXRyaXggPSBpbnZlcnNlO1xuXHQgICAgaWYgKHBhdGhUeXBlICE9PSBQYXRoVHlwZS5TSEFESU5HKSB7XG5cdCAgICAgIG1hdHJpeCA9IF91dGlsLlV0aWwudHJhbnNmb3JtKG1hdHJpeCwgb3duZXIuYmFzZVRyYW5zZm9ybSk7XG5cdCAgICAgIGlmICh0aGlzLm1hdHJpeCkge1xuXHQgICAgICAgIG1hdHJpeCA9IF91dGlsLlV0aWwudHJhbnNmb3JtKG1hdHJpeCwgdGhpcy5tYXRyaXgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBjb25zdCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzID0gdGhpcy5jcmVhdGVQYXR0ZXJuQ2FudmFzKG93bmVyKTtcblx0ICAgIGxldCBkb21NYXRyaXggPSBuZXcgRE9NTWF0cml4KG1hdHJpeCk7XG5cdCAgICBkb21NYXRyaXggPSBkb21NYXRyaXgudHJhbnNsYXRlKHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WCwgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRZKTtcblx0ICAgIGRvbU1hdHJpeCA9IGRvbU1hdHJpeC5zY2FsZSgxIC8gdGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVgsIDEgLyB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWSk7XG5cdCAgICBjb25zdCBwYXR0ZXJuID0gY3R4LmNyZWF0ZVBhdHRlcm4odGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5jYW52YXMsIFwicmVwZWF0XCIpO1xuXHQgICAgcGF0dGVybi5zZXRUcmFuc2Zvcm0oZG9tTWF0cml4KTtcblx0ICAgIHJldHVybiBwYXR0ZXJuO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlRpbGluZ1BhdHRlcm4gPSBUaWxpbmdQYXR0ZXJuO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAxMyAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEgPSBjb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQTtcblx0ZXhwb3J0cy5jb252ZXJ0VG9SR0JBID0gY29udmVydFRvUkdCQTtcblx0ZXhwb3J0cy5ncmF5VG9SR0JBID0gZ3JheVRvUkdCQTtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0ZnVuY3Rpb24gY29udmVydFRvUkdCQShwYXJhbXMpIHtcblx0ICBzd2l0Y2ggKHBhcmFtcy5raW5kKSB7XG5cdCAgICBjYXNlIF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDpcblx0ICAgICAgcmV0dXJuIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHBhcmFtcyk7XG5cdCAgICBjYXNlIF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA6XG5cdCAgICAgIHJldHVybiBjb252ZXJ0UkdCVG9SR0JBKHBhcmFtcyk7XG5cdCAgfVxuXHQgIHJldHVybiBudWxsO1xuXHR9XG5cdGZ1bmN0aW9uIGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBKHtcblx0ICBzcmMsXG5cdCAgc3JjUG9zID0gMCxcblx0ICBkZXN0LFxuXHQgIHdpZHRoLFxuXHQgIGhlaWdodCxcblx0ICBub25CbGFja0NvbG9yID0gMHhmZmZmZmZmZixcblx0ICBpbnZlcnNlRGVjb2RlID0gZmFsc2Vcblx0fSkge1xuXHQgIGNvbnN0IGJsYWNrID0gX3V0aWwuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4gPyAweGZmMDAwMDAwIDogMHgwMDAwMDBmZjtcblx0ICBjb25zdCBbemVyb01hcHBpbmcsIG9uZU1hcHBpbmddID0gaW52ZXJzZURlY29kZSA/IFtub25CbGFja0NvbG9yLCBibGFja10gOiBbYmxhY2ssIG5vbkJsYWNrQ29sb3JdO1xuXHQgIGNvbnN0IHdpZHRoSW5Tb3VyY2UgPSB3aWR0aCA+PiAzO1xuXHQgIGNvbnN0IHdpZHRoUmVtYWluZGVyID0gd2lkdGggJiA3O1xuXHQgIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5sZW5ndGg7XG5cdCAgZGVzdCA9IG5ldyBVaW50MzJBcnJheShkZXN0LmJ1ZmZlcik7XG5cdCAgbGV0IGRlc3RQb3MgPSAwO1xuXHQgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcblx0ICAgIGZvciAoY29uc3QgbWF4ID0gc3JjUG9zICsgd2lkdGhJblNvdXJjZTsgc3JjUG9zIDwgbWF4OyBzcmNQb3MrKykge1xuXHQgICAgICBjb25zdCBlbGVtID0gc3JjUG9zIDwgc3JjTGVuZ3RoID8gc3JjW3NyY1Bvc10gOiAyNTU7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMGIxID8gb25lTWFwcGluZyA6IHplcm9NYXBwaW5nO1xuXHQgICAgfVxuXHQgICAgaWYgKHdpZHRoUmVtYWluZGVyID09PSAwKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgY29uc3QgZWxlbSA9IHNyY1BvcyA8IHNyY0xlbmd0aCA/IHNyY1tzcmNQb3MrK10gOiAyNTU7XG5cdCAgICBmb3IgKGxldCBqID0gMDsgaiA8IHdpZHRoUmVtYWluZGVyOyBqKyspIHtcblx0ICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDEgPDwgNyAtIGogPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiB7XG5cdCAgICBzcmNQb3MsXG5cdCAgICBkZXN0UG9zXG5cdCAgfTtcblx0fVxuXHRmdW5jdGlvbiBjb252ZXJ0UkdCVG9SR0JBKHtcblx0ICBzcmMsXG5cdCAgc3JjUG9zID0gMCxcblx0ICBkZXN0LFxuXHQgIGRlc3RQb3MgPSAwLFxuXHQgIHdpZHRoLFxuXHQgIGhlaWdodFxuXHR9KSB7XG5cdCAgbGV0IGkgPSAwO1xuXHQgIGNvbnN0IGxlbjMyID0gc3JjLmxlbmd0aCA+PiAyO1xuXHQgIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNyYy5idWZmZXIsIHNyY1BvcywgbGVuMzIpO1xuXHQgIGlmIChfdXRpbC5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbikge1xuXHQgICAgZm9yICg7IGkgPCBsZW4zMiAtIDI7IGkgKz0gMywgZGVzdFBvcyArPSA0KSB7XG5cdCAgICAgIGNvbnN0IHMxID0gc3JjMzJbaV07XG5cdCAgICAgIGNvbnN0IHMyID0gc3JjMzJbaSArIDFdO1xuXHQgICAgICBjb25zdCBzMyA9IHNyYzMyW2kgKyAyXTtcblx0ICAgICAgZGVzdFtkZXN0UG9zXSA9IHMxIHwgMHhmZjAwMDAwMDtcblx0ICAgICAgZGVzdFtkZXN0UG9zICsgMV0gPSBzMSA+Pj4gMjQgfCBzMiA8PCA4IHwgMHhmZjAwMDAwMDtcblx0ICAgICAgZGVzdFtkZXN0UG9zICsgMl0gPSBzMiA+Pj4gMTYgfCBzMyA8PCAxNiB8IDB4ZmYwMDAwMDA7XG5cdCAgICAgIGRlc3RbZGVzdFBvcyArIDNdID0gczMgPj4+IDggfCAweGZmMDAwMDAwO1xuXHQgICAgfVxuXHQgICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyYy5sZW5ndGg7IGogPCBqajsgaiArPSAzKSB7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tqXSB8IHNyY1tqICsgMV0gPDwgOCB8IHNyY1tqICsgMl0gPDwgMTYgfCAweGZmMDAwMDAwO1xuXHQgICAgfVxuXHQgIH0gZWxzZSB7XG5cdCAgICBmb3IgKDsgaSA8IGxlbjMyIC0gMjsgaSArPSAzLCBkZXN0UG9zICs9IDQpIHtcblx0ICAgICAgY29uc3QgczEgPSBzcmMzMltpXTtcblx0ICAgICAgY29uc3QgczIgPSBzcmMzMltpICsgMV07XG5cdCAgICAgIGNvbnN0IHMzID0gc3JjMzJbaSArIDJdO1xuXHQgICAgICBkZXN0W2Rlc3RQb3NdID0gczEgfCAweGZmO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MgKyAxXSA9IHMxIDw8IDI0IHwgczIgPj4+IDggfCAweGZmO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MgKyAyXSA9IHMyIDw8IDE2IHwgczMgPj4+IDE2IHwgMHhmZjtcblx0ICAgICAgZGVzdFtkZXN0UG9zICsgM10gPSBzMyA8PCA4IHwgMHhmZjtcblx0ICAgIH1cblx0ICAgIGZvciAobGV0IGogPSBpICogNCwgamogPSBzcmMubGVuZ3RoOyBqIDwgamo7IGogKz0gMykge1xuXHQgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbal0gPDwgMjQgfCBzcmNbaiArIDFdIDw8IDE2IHwgc3JjW2ogKyAyXSA8PCA4IHwgMHhmZjtcblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIHtcblx0ICAgIHNyY1Bvcyxcblx0ICAgIGRlc3RQb3Ncblx0ICB9O1xuXHR9XG5cdGZ1bmN0aW9uIGdyYXlUb1JHQkEoc3JjLCBkZXN0KSB7XG5cdCAgaWYgKF91dGlsLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7XG5cdCAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBzcmMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuXHQgICAgICBkZXN0W2ldID0gc3JjW2ldICogMHgxMDEwMSB8IDB4ZmYwMDAwMDA7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdCAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxMDAgfCAweDAwMDAwMGZmO1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiAxNCAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuR2xvYmFsV29ya2VyT3B0aW9ucyA9IHZvaWQgMDtcblx0Y29uc3QgR2xvYmFsV29ya2VyT3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdGV4cG9ydHMuR2xvYmFsV29ya2VyT3B0aW9ucyA9IEdsb2JhbFdvcmtlck9wdGlvbnM7XG5cdEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyUG9ydCA9IG51bGw7XG5cdEdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gXCJcIjtcblxuXHQvKioqLyB9KSxcblx0LyogMTUgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLk1lc3NhZ2VIYW5kbGVyID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHRjb25zdCBDYWxsYmFja0tpbmQgPSB7XG5cdCAgVU5LTk9XTjogMCxcblx0ICBEQVRBOiAxLFxuXHQgIEVSUk9SOiAyXG5cdH07XG5cdGNvbnN0IFN0cmVhbUtpbmQgPSB7XG5cdCAgVU5LTk9XTjogMCxcblx0ICBDQU5DRUw6IDEsXG5cdCAgQ0FOQ0VMX0NPTVBMRVRFOiAyLFxuXHQgIENMT1NFOiAzLFxuXHQgIEVOUVVFVUU6IDQsXG5cdCAgRVJST1I6IDUsXG5cdCAgUFVMTDogNixcblx0ICBQVUxMX0NPTVBMRVRFOiA3LFxuXHQgIFNUQVJUX0NPTVBMRVRFOiA4XG5cdH07XG5cdGZ1bmN0aW9uIHdyYXBSZWFzb24ocmVhc29uKSB7XG5cdCAgaWYgKCEocmVhc29uIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIHJlYXNvbiA9PT0gXCJvYmplY3RcIiAmJiByZWFzb24gIT09IG51bGwpKSB7XG5cdCAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKCd3cmFwUmVhc29uOiBFeHBlY3RlZCBcInJlYXNvblwiIHRvIGJlIGEgKHBvc3NpYmx5IGNsb25lZCkgRXJyb3IuJyk7XG5cdCAgfVxuXHQgIHN3aXRjaCAocmVhc29uLm5hbWUpIHtcblx0ICAgIGNhc2UgXCJBYm9ydEV4Y2VwdGlvblwiOlxuXHQgICAgICByZXR1cm4gbmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTtcblx0ICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG5cdCAgICAgIHJldHVybiBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSk7XG5cdCAgICBjYXNlIFwiUGFzc3dvcmRFeGNlcHRpb25cIjpcblx0ICAgICAgcmV0dXJuIG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmNvZGUpO1xuXHQgICAgY2FzZSBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiOlxuXHQgICAgICByZXR1cm4gbmV3IF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnN0YXR1cyk7XG5cdCAgICBjYXNlIFwiVW5rbm93bkVycm9yRXhjZXB0aW9uXCI6XG5cdCAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uZGV0YWlscyk7XG5cdCAgICBkZWZhdWx0OlxuXHQgICAgICByZXR1cm4gbmV3IF91dGlsLlVua25vd25FcnJvckV4Y2VwdGlvbihyZWFzb24ubWVzc2FnZSwgcmVhc29uLnRvU3RyaW5nKCkpO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBNZXNzYWdlSGFuZGxlciB7XG5cdCAgY29uc3RydWN0b3Ioc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgY29tT2JqKSB7XG5cdCAgICB0aGlzLnNvdXJjZU5hbWUgPSBzb3VyY2VOYW1lO1xuXHQgICAgdGhpcy50YXJnZXROYW1lID0gdGFyZ2V0TmFtZTtcblx0ICAgIHRoaXMuY29tT2JqID0gY29tT2JqO1xuXHQgICAgdGhpcy5jYWxsYmFja0lkID0gMTtcblx0ICAgIHRoaXMuc3RyZWFtSWQgPSAxO1xuXHQgICAgdGhpcy5zdHJlYW1TaW5rcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICAgIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICAgIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlID0gZXZlbnQgPT4ge1xuXHQgICAgICBjb25zdCBkYXRhID0gZXZlbnQuZGF0YTtcblx0ICAgICAgaWYgKGRhdGEudGFyZ2V0TmFtZSAhPT0gdGhpcy5zb3VyY2VOYW1lKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChkYXRhLnN0cmVhbSkge1xuXHQgICAgICAgIHRoaXMuI3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoZGF0YS5jYWxsYmFjaykge1xuXHQgICAgICAgIGNvbnN0IGNhbGxiYWNrSWQgPSBkYXRhLmNhbGxiYWNrSWQ7XG5cdCAgICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07XG5cdCAgICAgICAgaWYgKCFjYXBhYmlsaXR5KSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIGNhbGxiYWNrICR7Y2FsbGJhY2tJZH1gKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tDYXBhYmlsaXRpZXNbY2FsbGJhY2tJZF07XG5cdCAgICAgICAgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5EQVRBKSB7XG5cdCAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoZGF0YS5kYXRhKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGRhdGEuY2FsbGJhY2sgPT09IENhbGxiYWNrS2luZC5FUlJPUikge1xuXHQgICAgICAgICAgY2FwYWJpbGl0eS5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGNhbGxiYWNrIGNhc2VcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbkhhbmRsZXJbZGF0YS5hY3Rpb25dO1xuXHQgICAgICBpZiAoIWFjdGlvbikge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhY3Rpb24gZnJvbSB3b3JrZXI6ICR7ZGF0YS5hY3Rpb259YCk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGRhdGEuY2FsbGJhY2tJZCkge1xuXHQgICAgICAgIGNvbnN0IGNiU291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZTtcblx0ICAgICAgICBjb25zdCBjYlRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWU7XG5cdCAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0ICAgICAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSkpO1xuXHQgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuXHQgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLFxuXHQgICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG5cdCAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuREFUQSxcblx0ICAgICAgICAgICAgY2FsbGJhY2tJZDogZGF0YS5jYWxsYmFja0lkLFxuXHQgICAgICAgICAgICBkYXRhOiByZXN1bHRcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcblx0ICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICAgIHNvdXJjZU5hbWU6IGNiU291cmNlTmFtZSxcblx0ICAgICAgICAgICAgdGFyZ2V0TmFtZTogY2JUYXJnZXROYW1lLFxuXHQgICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2tLaW5kLkVSUk9SLFxuXHQgICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsXG5cdCAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGRhdGEuc3RyZWFtSWQpIHtcblx0ICAgICAgICB0aGlzLiNjcmVhdGVTdHJlYW1TaW5rKGRhdGEpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBhY3Rpb24oZGF0YS5kYXRhKTtcblx0ICAgIH07XG5cdCAgICBjb21PYmouYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuXHQgIH1cblx0ICBvbihhY3Rpb25OYW1lLCBoYW5kbGVyKSB7XG5cdCAgICBjb25zdCBhaCA9IHRoaXMuYWN0aW9uSGFuZGxlcjtcblx0ICAgIGlmIChhaFthY3Rpb25OYW1lXSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aW9uTmFtZSBjYWxsZWQgXCIke2FjdGlvbk5hbWV9XCJgKTtcblx0ICAgIH1cblx0ICAgIGFoW2FjdGlvbk5hbWVdID0gaGFuZGxlcjtcblx0ICB9XG5cdCAgc2VuZChhY3Rpb25OYW1lLCBkYXRhLCB0cmFuc2ZlcnMpIHtcblx0ICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLFxuXHQgICAgICB0YXJnZXROYW1lOiB0aGlzLnRhcmdldE5hbWUsXG5cdCAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcblx0ICAgICAgZGF0YVxuXHQgICAgfSwgdHJhbnNmZXJzKTtcblx0ICB9XG5cdCAgc2VuZFdpdGhQcm9taXNlKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykge1xuXHQgICAgY29uc3QgY2FsbGJhY2tJZCA9IHRoaXMuY2FsbGJhY2tJZCsrO1xuXHQgICAgY29uc3QgY2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXSA9IGNhcGFiaWxpdHk7XG5cdCAgICB0cnkge1xuXHQgICAgICB0aGlzLmNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgc291cmNlTmFtZTogdGhpcy5zb3VyY2VOYW1lLFxuXHQgICAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcblx0ICAgICAgICBhY3Rpb246IGFjdGlvbk5hbWUsXG5cdCAgICAgICAgY2FsbGJhY2tJZCxcblx0ICAgICAgICBkYXRhXG5cdCAgICAgIH0sIHRyYW5zZmVycyk7XG5cdCAgICB9IGNhdGNoIChleCkge1xuXHQgICAgICBjYXBhYmlsaXR5LnJlamVjdChleCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBzZW5kV2l0aFN0cmVhbShhY3Rpb25OYW1lLCBkYXRhLCBxdWV1ZWluZ1N0cmF0ZWd5LCB0cmFuc2ZlcnMpIHtcblx0ICAgIGNvbnN0IHN0cmVhbUlkID0gdGhpcy5zdHJlYW1JZCsrLFxuXHQgICAgICBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lLFxuXHQgICAgICB0YXJnZXROYW1lID0gdGhpcy50YXJnZXROYW1lLFxuXHQgICAgICBjb21PYmogPSB0aGlzLmNvbU9iajtcblx0ICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuXHQgICAgICBzdGFydDogY29udHJvbGxlciA9PiB7XG5cdCAgICAgICAgY29uc3Qgc3RhcnRDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0gPSB7XG5cdCAgICAgICAgICBjb250cm9sbGVyLFxuXHQgICAgICAgICAgc3RhcnRDYWxsOiBzdGFydENhcGFiaWxpdHksXG5cdCAgICAgICAgICBwdWxsQ2FsbDogbnVsbCxcblx0ICAgICAgICAgIGNhbmNlbENhbGw6IG51bGwsXG5cdCAgICAgICAgICBpc0Nsb3NlZDogZmFsc2Vcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcblx0ICAgICAgICAgIHN0cmVhbUlkLFxuXHQgICAgICAgICAgZGF0YSxcblx0ICAgICAgICAgIGRlc2lyZWRTaXplOiBjb250cm9sbGVyLmRlc2lyZWRTaXplXG5cdCAgICAgICAgfSwgdHJhbnNmZXJzKTtcblx0ICAgICAgICByZXR1cm4gc3RhcnRDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgICAgIH0sXG5cdCAgICAgIHB1bGw6IGNvbnRyb2xsZXIgPT4ge1xuXHQgICAgICAgIGNvbnN0IHB1bGxDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0ucHVsbENhbGwgPSBwdWxsQ2FwYWJpbGl0eTtcblx0ICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICAgICAgc291cmNlTmFtZSxcblx0ICAgICAgICAgIHRhcmdldE5hbWUsXG5cdCAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTCxcblx0ICAgICAgICAgIHN0cmVhbUlkLFxuXHQgICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemVcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gcHVsbENhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgICAgfSxcblx0ICAgICAgY2FuY2VsOiByZWFzb24gPT4ge1xuXHQgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yLCBcImNhbmNlbCBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG5cdCAgICAgICAgY29uc3QgY2FuY2VsQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmNhbmNlbENhbGwgPSBjYW5jZWxDYXBhYmlsaXR5O1xuXHQgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdLmlzQ2xvc2VkID0gdHJ1ZTtcblx0ICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICAgICAgc291cmNlTmFtZSxcblx0ICAgICAgICAgIHRhcmdldE5hbWUsXG5cdCAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMLFxuXHQgICAgICAgICAgc3RyZWFtSWQsXG5cdCAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBjYW5jZWxDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgICAgIH1cblx0ICAgIH0sIHF1ZXVlaW5nU3RyYXRlZ3kpO1xuXHQgIH1cblx0ICAjY3JlYXRlU3RyZWFtU2luayhkYXRhKSB7XG5cdCAgICBjb25zdCBzdHJlYW1JZCA9IGRhdGEuc3RyZWFtSWQsXG5cdCAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsXG5cdCAgICAgIHRhcmdldE5hbWUgPSBkYXRhLnNvdXJjZU5hbWUsXG5cdCAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuXHQgICAgY29uc3Qgc2VsZiA9IHRoaXMsXG5cdCAgICAgIGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07XG5cdCAgICBjb25zdCBzdHJlYW1TaW5rID0ge1xuXHQgICAgICBlbnF1ZXVlKGNodW5rLCBzaXplID0gMSwgdHJhbnNmZXJzKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcblx0ICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3QgbGFzdERlc2lyZWRTaXplID0gdGhpcy5kZXNpcmVkU2l6ZTtcblx0ICAgICAgICB0aGlzLmRlc2lyZWRTaXplIC09IHNpemU7XG5cdCAgICAgICAgaWYgKGxhc3REZXNpcmVkU2l6ZSA+IDAgJiYgdGhpcy5kZXNpcmVkU2l6ZSA8PSAwKSB7XG5cdCAgICAgICAgICB0aGlzLnNpbmtDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICAgICAgICB0aGlzLnJlYWR5ID0gdGhpcy5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICAgICAgc291cmNlTmFtZSxcblx0ICAgICAgICAgIHRhcmdldE5hbWUsXG5cdCAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuRU5RVUVVRSxcblx0ICAgICAgICAgIHN0cmVhbUlkLFxuXHQgICAgICAgICAgY2h1bmtcblx0ICAgICAgICB9LCB0cmFuc2ZlcnMpO1xuXHQgICAgICB9LFxuXHQgICAgICBjbG9zZSgpIHtcblx0ICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcblx0ICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICAgICAgc291cmNlTmFtZSxcblx0ICAgICAgICAgIHRhcmdldE5hbWUsXG5cdCAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0xPU0UsXG5cdCAgICAgICAgICBzdHJlYW1JZFxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGRlbGV0ZSBzZWxmLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTtcblx0ICAgICAgfSxcblx0ICAgICAgZXJyb3IocmVhc29uKSB7XG5cdCAgICAgICAgKDAsIF91dGlsLmFzc2VydCkocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsIFwiZXJyb3IgbXVzdCBoYXZlIGEgdmFsaWQgcmVhc29uXCIpO1xuXHQgICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuXHQgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FUlJPUixcblx0ICAgICAgICAgIHN0cmVhbUlkLFxuXHQgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSxcblx0ICAgICAgc2lua0NhcGFiaWxpdHk6IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpLFxuXHQgICAgICBvblB1bGw6IG51bGwsXG5cdCAgICAgIG9uQ2FuY2VsOiBudWxsLFxuXHQgICAgICBpc0NhbmNlbGxlZDogZmFsc2UsXG5cdCAgICAgIGRlc2lyZWRTaXplOiBkYXRhLmRlc2lyZWRTaXplLFxuXHQgICAgICByZWFkeTogbnVsbFxuXHQgICAgfTtcblx0ICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgICAgc3RyZWFtU2luay5yZWFkeSA9IHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdID0gc3RyZWFtU2luaztcblx0ICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdCAgICAgIHJlc29sdmUoYWN0aW9uKGRhdGEuZGF0YSwgc3RyZWFtU2luaykpO1xuXHQgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdCAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgc291cmNlTmFtZSxcblx0ICAgICAgICB0YXJnZXROYW1lLFxuXHQgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcblx0ICAgICAgICBzdHJlYW1JZCxcblx0ICAgICAgICBzdWNjZXNzOiB0cnVlXG5cdCAgICAgIH0pO1xuXHQgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuXHQgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICAgIHNvdXJjZU5hbWUsXG5cdCAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEUsXG5cdCAgICAgICAgc3RyZWFtSWQsXG5cdCAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcblx0ICAgICAgfSk7XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgI3Byb2Nlc3NTdHJlYW1NZXNzYWdlKGRhdGEpIHtcblx0ICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZCxcblx0ICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSxcblx0ICAgICAgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZSxcblx0ICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7XG5cdCAgICBjb25zdCBzdHJlYW1Db250cm9sbGVyID0gdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0sXG5cdCAgICAgIHN0cmVhbVNpbmsgPSB0aGlzLnN0cmVhbVNpbmtzW3N0cmVhbUlkXTtcblx0ICAgIHN3aXRjaCAoZGF0YS5zdHJlYW0pIHtcblx0ICAgICAgY2FzZSBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFOlxuXHQgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcblx0ICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsLnJlc29sdmUoKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFOlxuXHQgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcblx0ICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGwucmVzb2x2ZSgpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsLnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIFN0cmVhbUtpbmQuUFVMTDpcblx0ICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHtcblx0ICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICAgIHNvdXJjZU5hbWUsXG5cdCAgICAgICAgICAgIHRhcmdldE5hbWUsXG5cdCAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuXHQgICAgICAgICAgICBzdHJlYW1JZCxcblx0ICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHN0cmVhbVNpbmsuZGVzaXJlZFNpemUgPD0gMCAmJiBkYXRhLmRlc2lyZWRTaXplID4gMCkge1xuXHQgICAgICAgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHN0cmVhbVNpbmsuZGVzaXJlZFNpemUgPSBkYXRhLmRlc2lyZWRTaXplO1xuXHQgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdCAgICAgICAgICByZXNvbHZlKHN0cmVhbVNpbmsub25QdWxsPy4oKSk7XG5cdCAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgICAgICB0YXJnZXROYW1lLFxuXHQgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuUFVMTF9DT01QTEVURSxcblx0ICAgICAgICAgICAgc3RyZWFtSWQsXG5cdCAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcblx0ICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICAgIHNvdXJjZU5hbWUsXG5cdCAgICAgICAgICAgIHRhcmdldE5hbWUsXG5cdCAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuXHQgICAgICAgICAgICBzdHJlYW1JZCxcblx0ICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIFN0cmVhbUtpbmQuRU5RVUVVRTpcblx0ICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShzdHJlYW1Db250cm9sbGVyLCBcImVucXVldWUgc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG5cdCAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQpIHtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZW5xdWV1ZShkYXRhLmNodW5rKTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBTdHJlYW1LaW5kLkNMT1NFOlxuXHQgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHN0cmVhbUNvbnRyb2xsZXIsIFwiY2xvc2Ugc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG5cdCAgICAgICAgaWYgKHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQpIHtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdHJlYW1Db250cm9sbGVyLmlzQ2xvc2VkID0gdHJ1ZTtcblx0ICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuY2xvc2UoKTtcblx0ICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBTdHJlYW1LaW5kLkVSUk9SOlxuXHQgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHN0cmVhbUNvbnRyb2xsZXIsIFwiZXJyb3Igc2hvdWxkIGhhdmUgc3RyZWFtIGNvbnRyb2xsZXJcIik7XG5cdCAgICAgICAgc3RyZWFtQ29udHJvbGxlci5jb250cm9sbGVyLmVycm9yKHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcblx0ICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURTpcblx0ICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG5cdCAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGwucmVzb2x2ZSgpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy4jZGVsZXRlU3RyZWFtQ29udHJvbGxlcihzdHJlYW1Db250cm9sbGVyLCBzdHJlYW1JZCk7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgU3RyZWFtS2luZC5DQU5DRUw6XG5cdCAgICAgICAgaWYgKCFzdHJlYW1TaW5rKSB7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0ICAgICAgICAgIHJlc29sdmUoc3RyZWFtU2luay5vbkNhbmNlbD8uKHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKSk7XG5cdCAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgICAgICB0YXJnZXROYW1lLFxuXHQgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLFxuXHQgICAgICAgICAgICBzdHJlYW1JZCxcblx0ICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuXHQgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgICAgICAgc291cmNlTmFtZSxcblx0ICAgICAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkNBTkNFTF9DT01QTEVURSxcblx0ICAgICAgICAgICAgc3RyZWFtSWQsXG5cdCAgICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG5cdCAgICAgICAgc3RyZWFtU2luay5pc0NhbmNlbGxlZCA9IHRydWU7XG5cdCAgICAgICAgZGVsZXRlIHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgc3RyZWFtIGNhc2VcIik7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGFzeW5jICNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKSB7XG5cdCAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW3N0cmVhbUNvbnRyb2xsZXIuc3RhcnRDYWxsPy5wcm9taXNlLCBzdHJlYW1Db250cm9sbGVyLnB1bGxDYWxsPy5wcm9taXNlLCBzdHJlYW1Db250cm9sbGVyLmNhbmNlbENhbGw/LnByb21pc2VdKTtcblx0ICAgIGRlbGV0ZSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXTtcblx0ICB9XG5cdCAgZGVzdHJveSgpIHtcblx0ICAgIHRoaXMuY29tT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMuX29uQ29tT2JqT25NZXNzYWdlKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5NZXNzYWdlSGFuZGxlciA9IE1lc3NhZ2VIYW5kbGVyO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAxNiAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuTWV0YWRhdGEgPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdGNsYXNzIE1ldGFkYXRhIHtcblx0ICAjbWV0YWRhdGFNYXA7XG5cdCAgI2RhdGE7XG5cdCAgY29uc3RydWN0b3Ioe1xuXHQgICAgcGFyc2VkRGF0YSxcblx0ICAgIHJhd0RhdGFcblx0ICB9KSB7XG5cdCAgICB0aGlzLiNtZXRhZGF0YU1hcCA9IHBhcnNlZERhdGE7XG5cdCAgICB0aGlzLiNkYXRhID0gcmF3RGF0YTtcblx0ICB9XG5cdCAgZ2V0UmF3KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI2RhdGE7XG5cdCAgfVxuXHQgIGdldChuYW1lKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jbWV0YWRhdGFNYXAuZ2V0KG5hbWUpID8/IG51bGw7XG5cdCAgfVxuXHQgIGdldEFsbCgpIHtcblx0ICAgIHJldHVybiAoMCwgX3V0aWwub2JqZWN0RnJvbU1hcCkodGhpcy4jbWV0YWRhdGFNYXApO1xuXHQgIH1cblx0ICBoYXMobmFtZSkge1xuXHQgICAgcmV0dXJuIHRoaXMuI21ldGFkYXRhTWFwLmhhcyhuYW1lKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5NZXRhZGF0YSA9IE1ldGFkYXRhO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAxNyAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuT3B0aW9uYWxDb250ZW50Q29uZmlnID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX211cm11cmhhc2ggPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpO1xuXHRjb25zdCBJTlRFUk5BTCA9IFN5bWJvbChcIklOVEVSTkFMXCIpO1xuXHRjbGFzcyBPcHRpb25hbENvbnRlbnRHcm91cCB7XG5cdCAgI3Zpc2libGUgPSB0cnVlO1xuXHQgIGNvbnN0cnVjdG9yKG5hbWUsIGludGVudCkge1xuXHQgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIHRoaXMuaW50ZW50ID0gaW50ZW50O1xuXHQgIH1cblx0ICBnZXQgdmlzaWJsZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLiN2aXNpYmxlO1xuXHQgIH1cblx0ICBfc2V0VmlzaWJsZShpbnRlcm5hbCwgdmlzaWJsZSkge1xuXHQgICAgaWYgKGludGVybmFsICE9PSBJTlRFUk5BTCkge1xuXHQgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiSW50ZXJuYWwgbWV0aG9kIGBfc2V0VmlzaWJsZWAgY2FsbGVkLlwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3Zpc2libGUgPSB2aXNpYmxlO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBPcHRpb25hbENvbnRlbnRDb25maWcge1xuXHQgICNjYWNoZWRHZXRIYXNoID0gbnVsbDtcblx0ICAjZ3JvdXBzID0gbmV3IE1hcCgpO1xuXHQgICNpbml0aWFsSGFzaCA9IG51bGw7XG5cdCAgI29yZGVyID0gbnVsbDtcblx0ICBjb25zdHJ1Y3RvcihkYXRhKSB7XG5cdCAgICB0aGlzLm5hbWUgPSBudWxsO1xuXHQgICAgdGhpcy5jcmVhdG9yID0gbnVsbDtcblx0ICAgIGlmIChkYXRhID09PSBudWxsKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcblx0ICAgIHRoaXMuY3JlYXRvciA9IGRhdGEuY3JlYXRvcjtcblx0ICAgIHRoaXMuI29yZGVyID0gZGF0YS5vcmRlcjtcblx0ICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZGF0YS5ncm91cHMpIHtcblx0ICAgICAgdGhpcy4jZ3JvdXBzLnNldChncm91cC5pZCwgbmV3IE9wdGlvbmFsQ29udGVudEdyb3VwKGdyb3VwLm5hbWUsIGdyb3VwLmludGVudCkpO1xuXHQgICAgfVxuXHQgICAgaWYgKGRhdGEuYmFzZVN0YXRlID09PSBcIk9GRlwiKSB7XG5cdCAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy4jZ3JvdXBzLnZhbHVlcygpKSB7XG5cdCAgICAgICAgZ3JvdXAuX3NldFZpc2libGUoSU5URVJOQUwsIGZhbHNlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBvbiBvZiBkYXRhLm9uKSB7XG5cdCAgICAgIHRoaXMuI2dyb3Vwcy5nZXQob24pLl9zZXRWaXNpYmxlKElOVEVSTkFMLCB0cnVlKTtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3Qgb2ZmIG9mIGRhdGEub2ZmKSB7XG5cdCAgICAgIHRoaXMuI2dyb3Vwcy5nZXQob2ZmKS5fc2V0VmlzaWJsZShJTlRFUk5BTCwgZmFsc2UpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jaW5pdGlhbEhhc2ggPSB0aGlzLmdldEhhc2goKTtcblx0ICB9XG5cdCAgI2V2YWx1YXRlVmlzaWJpbGl0eUV4cHJlc3Npb24oYXJyYXkpIHtcblx0ICAgIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0ICAgIGlmIChsZW5ndGggPCAyKSB7XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgb3BlcmF0b3IgPSBhcnJheVswXTtcblx0ICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0ICAgICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2ldO1xuXHQgICAgICBsZXQgc3RhdGU7XG5cdCAgICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG5cdCAgICAgICAgc3RhdGUgPSB0aGlzLiNldmFsdWF0ZVZpc2liaWxpdHlFeHByZXNzaW9uKGVsZW1lbnQpO1xuXHQgICAgICB9IGVsc2UgaWYgKHRoaXMuI2dyb3Vwcy5oYXMoZWxlbWVudCkpIHtcblx0ICAgICAgICBzdGF0ZSA9IHRoaXMuI2dyb3Vwcy5nZXQoZWxlbWVudCkudmlzaWJsZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2VsZW1lbnR9YCk7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuXHQgICAgICAgIGNhc2UgXCJBbmRcIjpcblx0ICAgICAgICAgIGlmICghc3RhdGUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcIk9yXCI6XG5cdCAgICAgICAgICBpZiAoc3RhdGUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiTm90XCI6XG5cdCAgICAgICAgICByZXR1cm4gIXN0YXRlO1xuXHQgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIG9wZXJhdG9yID09PSBcIkFuZFwiO1xuXHQgIH1cblx0ICBpc1Zpc2libGUoZ3JvdXApIHtcblx0ICAgIGlmICh0aGlzLiNncm91cHMuc2l6ZSA9PT0gMCkge1xuXHQgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIGlmICghZ3JvdXApIHtcblx0ICAgICAgKDAsIF91dGlsLndhcm4pKFwiT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZGVmaW5lZC5cIik7XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKGdyb3VwLnR5cGUgPT09IFwiT0NHXCIpIHtcblx0ICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGdyb3VwLmlkKSkge1xuXHQgICAgICAgICgwLCBfdXRpbC53YXJuKShgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7Z3JvdXAuaWR9YCk7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHRoaXMuI2dyb3Vwcy5nZXQoZ3JvdXAuaWQpLnZpc2libGU7XG5cdCAgICB9IGVsc2UgaWYgKGdyb3VwLnR5cGUgPT09IFwiT0NNRFwiKSB7XG5cdCAgICAgIGlmIChncm91cC5leHByZXNzaW9uKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuI2V2YWx1YXRlVmlzaWJpbGl0eUV4cHJlc3Npb24oZ3JvdXAuZXhwcmVzc2lvbik7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCFncm91cC5wb2xpY3kgfHwgZ3JvdXAucG9saWN5ID09PSBcIkFueU9uXCIpIHtcblx0ICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuXHQgICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuXHQgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGlmICh0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSBcIkFsbE9uXCIpIHtcblx0ICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuXHQgICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuXHQgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9IGVsc2UgaWYgKGdyb3VwLnBvbGljeSA9PT0gXCJBbnlPZmZcIikge1xuXHQgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG5cdCAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG5cdCAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSBcIkFsbE9mZlwiKSB7XG5cdCAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcblx0ICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmhhcyhpZCkpIHtcblx0ICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBpZiAodGhpcy4jZ3JvdXBzLmdldChpZCkudmlzaWJsZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShgVW5rbm93biBvcHRpb25hbCBjb250ZW50IHBvbGljeSAke2dyb3VwLnBvbGljeX0uYCk7XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHQgICAgKDAsIF91dGlsLndhcm4pKGBVbmtub3duIGdyb3VwIHR5cGUgJHtncm91cC50eXBlfS5gKTtcblx0ICAgIHJldHVybiB0cnVlO1xuXHQgIH1cblx0ICBzZXRWaXNpYmlsaXR5KGlkLCB2aXNpYmxlID0gdHJ1ZSkge1xuXHQgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuXHQgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLiNncm91cHMuZ2V0KGlkKS5fc2V0VmlzaWJsZShJTlRFUk5BTCwgISF2aXNpYmxlKTtcblx0ICAgIHRoaXMuI2NhY2hlZEdldEhhc2ggPSBudWxsO1xuXHQgIH1cblx0ICBnZXQgaGFzSW5pdGlhbFZpc2liaWxpdHkoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5nZXRIYXNoKCkgPT09IHRoaXMuI2luaXRpYWxIYXNoO1xuXHQgIH1cblx0ICBnZXRPcmRlcigpIHtcblx0ICAgIGlmICghdGhpcy4jZ3JvdXBzLnNpemUpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy4jb3JkZXIpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuI29yZGVyLnNsaWNlKCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gWy4uLnRoaXMuI2dyb3Vwcy5rZXlzKCldO1xuXHQgIH1cblx0ICBnZXRHcm91cHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jZ3JvdXBzLnNpemUgPiAwID8gKDAsIF91dGlsLm9iamVjdEZyb21NYXApKHRoaXMuI2dyb3VwcykgOiBudWxsO1xuXHQgIH1cblx0ICBnZXRHcm91cChpZCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI2dyb3Vwcy5nZXQoaWQpIHx8IG51bGw7XG5cdCAgfVxuXHQgIGdldEhhc2goKSB7XG5cdCAgICBpZiAodGhpcy4jY2FjaGVkR2V0SGFzaCAhPT0gbnVsbCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4jY2FjaGVkR2V0SGFzaDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGhhc2ggPSBuZXcgX211cm11cmhhc2guTXVybXVySGFzaDNfNjQoKTtcblx0ICAgIGZvciAoY29uc3QgW2lkLCBncm91cF0gb2YgdGhpcy4jZ3JvdXBzKSB7XG5cdCAgICAgIGhhc2gudXBkYXRlKGAke2lkfToke2dyb3VwLnZpc2libGV9YCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy4jY2FjaGVkR2V0SGFzaCA9IGhhc2guaGV4ZGlnZXN0KCk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuT3B0aW9uYWxDb250ZW50Q29uZmlnID0gT3B0aW9uYWxDb250ZW50Q29uZmlnO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAxOCAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuUERGRGF0YVRyYW5zcG9ydFN0cmVhbSA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTtcblx0Y2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbSB7XG5cdCAgY29uc3RydWN0b3Ioe1xuXHQgICAgbGVuZ3RoLFxuXHQgICAgaW5pdGlhbERhdGEsXG5cdCAgICBwcm9ncmVzc2l2ZURvbmUgPSBmYWxzZSxcblx0ICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gbnVsbCxcblx0ICAgIGRpc2FibGVSYW5nZSA9IGZhbHNlLFxuXHQgICAgZGlzYWJsZVN0cmVhbSA9IGZhbHNlXG5cdCAgfSwgcGRmRGF0YVJhbmdlVHJhbnNwb3J0KSB7XG5cdCAgICAoMCwgX3V0aWwuYXNzZXJ0KShwZGZEYXRhUmFuZ2VUcmFuc3BvcnQsICdQREZEYXRhVHJhbnNwb3J0U3RyZWFtIC0gbWlzc2luZyByZXF1aXJlZCBcInBkZkRhdGFSYW5nZVRyYW5zcG9ydFwiIGFyZ3VtZW50LicpO1xuXHQgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gW107XG5cdCAgICB0aGlzLl9wcm9ncmVzc2l2ZURvbmUgPSBwcm9ncmVzc2l2ZURvbmU7XG5cdCAgICB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lO1xuXHQgICAgaWYgKGluaXRpYWxEYXRhPy5sZW5ndGggPiAwKSB7XG5cdCAgICAgIGNvbnN0IGJ1ZmZlciA9IGluaXRpYWxEYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBpbml0aWFsRGF0YS5ieXRlTGVuZ3RoID09PSBpbml0aWFsRGF0YS5idWZmZXIuYnl0ZUxlbmd0aCA/IGluaXRpYWxEYXRhLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KGluaXRpYWxEYXRhKS5idWZmZXI7XG5cdCAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQgPSBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQ7XG5cdCAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFkaXNhYmxlU3RyZWFtO1xuXHQgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFkaXNhYmxlUmFuZ2U7XG5cdCAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gbGVuZ3RoO1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuXHQgICAgdGhpcy5fcmFuZ2VSZWFkZXJzID0gW107XG5cdCAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUmFuZ2VMaXN0ZW5lcigoYmVnaW4sIGNodW5rKSA9PiB7XG5cdCAgICAgIHRoaXMuX29uUmVjZWl2ZURhdGEoe1xuXHQgICAgICAgIGJlZ2luLFxuXHQgICAgICAgIGNodW5rXG5cdCAgICAgIH0pO1xuXHQgICAgfSk7XG5cdCAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NMaXN0ZW5lcigobG9hZGVkLCB0b3RhbCkgPT4ge1xuXHQgICAgICB0aGlzLl9vblByb2dyZXNzKHtcblx0ICAgICAgICBsb2FkZWQsXG5cdCAgICAgICAgdG90YWxcblx0ICAgICAgfSk7XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcihjaHVuayA9PiB7XG5cdCAgICAgIHRoaXMuX29uUmVjZWl2ZURhdGEoe1xuXHQgICAgICAgIGNodW5rXG5cdCAgICAgIH0pO1xuXHQgICAgfSk7XG5cdCAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQuYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIoKCkgPT4ge1xuXHQgICAgICB0aGlzLl9vblByb2dyZXNzaXZlRG9uZSgpO1xuXHQgICAgfSk7XG5cdCAgICB0aGlzLl9wZGZEYXRhUmFuZ2VUcmFuc3BvcnQudHJhbnNwb3J0UmVhZHkoKTtcblx0ICB9XG5cdCAgX29uUmVjZWl2ZURhdGEoe1xuXHQgICAgYmVnaW4sXG5cdCAgICBjaHVua1xuXHQgIH0pIHtcblx0ICAgIGNvbnN0IGJ1ZmZlciA9IGNodW5rIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBjaHVuay5ieXRlTGVuZ3RoID09PSBjaHVuay5idWZmZXIuYnl0ZUxlbmd0aCA/IGNodW5rLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7XG5cdCAgICBpZiAoYmVnaW4gPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICBpZiAodGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIpIHtcblx0ICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlci5fZW5xdWV1ZShidWZmZXIpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGJ1ZmZlcik7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5fcmFuZ2VSZWFkZXJzLnNvbWUoZnVuY3Rpb24gKHJhbmdlUmVhZGVyKSB7XG5cdCAgICAgICAgaWYgKHJhbmdlUmVhZGVyLl9iZWdpbiAhPT0gYmVnaW4pIHtcblx0ICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmFuZ2VSZWFkZXIuX2VucXVldWUoYnVmZmVyKTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfSk7XG5cdCAgICAgICgwLCBfdXRpbC5hc3NlcnQpKGZvdW5kLCBcIl9vblJlY2VpdmVEYXRhIC0gbm8gYFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcmAgaW5zdGFuY2UgZm91bmQuXCIpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uX2xvYWRlZCA/PyAwO1xuXHQgIH1cblx0ICBfb25Qcm9ncmVzcyhldnQpIHtcblx0ICAgIGlmIChldnQudG90YWwgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICB0aGlzLl9yYW5nZVJlYWRlcnNbMF0/Lm9uUHJvZ3Jlc3M/Lih7XG5cdCAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkXG5cdCAgICAgIH0pO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/Lm9uUHJvZ3Jlc3M/Lih7XG5cdCAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuXHQgICAgICAgIHRvdGFsOiBldnQudG90YWxcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9vblByb2dyZXNzaXZlRG9uZSgpIHtcblx0ICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5wcm9ncmVzc2l2ZURvbmUoKTtcblx0ICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHRydWU7XG5cdCAgfVxuXHQgIF9yZW1vdmVSYW5nZVJlYWRlcihyZWFkZXIpIHtcblx0ICAgIGNvbnN0IGkgPSB0aGlzLl9yYW5nZVJlYWRlcnMuaW5kZXhPZihyZWFkZXIpO1xuXHQgICAgaWYgKGkgPj0gMCkge1xuXHQgICAgICB0aGlzLl9yYW5nZVJlYWRlcnMuc3BsaWNlKGksIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXRGdWxsUmVhZGVyKCkge1xuXHQgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERkRhdGFUcmFuc3BvcnRTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG5cdCAgICBjb25zdCBxdWV1ZWRDaHVua3MgPSB0aGlzLl9xdWV1ZWRDaHVua3M7XG5cdCAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBudWxsO1xuXHQgICAgcmV0dXJuIG5ldyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyKHRoaXMsIHF1ZXVlZENodW5rcywgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lLCB0aGlzLl9jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSk7XG5cdCAgfVxuXHQgIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcblx0ICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcmVhZGVyID0gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBiZWdpbiwgZW5kKTtcblx0ICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5yZXF1ZXN0RGF0YVJhbmdlKGJlZ2luLCBlbmQpO1xuXHQgICAgdGhpcy5fcmFuZ2VSZWFkZXJzLnB1c2gocmVhZGVyKTtcblx0ICAgIHJldHVybiByZWFkZXI7XG5cdCAgfVxuXHQgIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuXHQgICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZWFkZXJzLnNsaWNlKDApKSB7XG5cdCAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hYm9ydCgpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlBERkRhdGFUcmFuc3BvcnRTdHJlYW0gPSBQREZEYXRhVHJhbnNwb3J0U3RyZWFtO1xuXHRjbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihzdHJlYW0sIHF1ZXVlZENodW5rcywgcHJvZ3Jlc3NpdmVEb25lID0gZmFsc2UsIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gbnVsbCkge1xuXHQgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuXHQgICAgdGhpcy5fZG9uZSA9IHByb2dyZXNzaXZlRG9uZSB8fCBmYWxzZTtcblx0ICAgIHRoaXMuX2ZpbGVuYW1lID0gKDAsIF9kaXNwbGF5X3V0aWxzLmlzUGRmRmlsZSkoY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUpID8gY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgOiBudWxsO1xuXHQgICAgdGhpcy5fcXVldWVkQ2h1bmtzID0gcXVldWVkQ2h1bmtzIHx8IFtdO1xuXHQgICAgdGhpcy5fbG9hZGVkID0gMDtcblx0ICAgIGZvciAoY29uc3QgY2h1bmsgb2YgdGhpcy5fcXVldWVkQ2h1bmtzKSB7XG5cdCAgICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcblx0ICAgIHRoaXMuX2hlYWRlcnNSZWFkeSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHQgICAgc3RyZWFtLl9mdWxsUmVxdWVzdFJlYWRlciA9IHRoaXM7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuXHQgIH1cblx0ICBfZW5xdWV1ZShjaHVuaykge1xuXHQgICAgaWYgKHRoaXMuX2RvbmUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuXHQgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICB2YWx1ZTogY2h1bmssXG5cdCAgICAgICAgZG9uZTogZmFsc2Vcblx0ICAgICAgfSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLl9xdWV1ZWRDaHVua3MucHVzaChjaHVuayk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcblx0ICB9XG5cdCAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9oZWFkZXJzUmVhZHk7XG5cdCAgfVxuXHQgIGdldCBmaWxlbmFtZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcblx0ICB9XG5cdCAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1JhbmdlU3VwcG9ydGVkO1xuXHQgIH1cblx0ICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcblx0ICB9XG5cdCAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fc3RyZWFtLl9jb250ZW50TGVuZ3RoO1xuXHQgIH1cblx0ICBhc3luYyByZWFkKCkge1xuXHQgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rcy5sZW5ndGggPiAwKSB7XG5cdCAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bmtzLnNoaWZ0KCk7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdmFsdWU6IGNodW5rLFxuXHQgICAgICAgIGRvbmU6IGZhbHNlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fZG9uZSkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuXHQgICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIGNhbmNlbChyZWFzb24pIHtcblx0ICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuXHQgICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuXHQgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuXHQgICAgICAgIGRvbmU6IHRydWVcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuXHQgIH1cblx0ICBwcm9ncmVzc2l2ZURvbmUoKSB7XG5cdCAgICBpZiAodGhpcy5fZG9uZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLl9kb25lID0gdHJ1ZTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihzdHJlYW0sIGJlZ2luLCBlbmQpIHtcblx0ICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcblx0ICAgIHRoaXMuX2JlZ2luID0gYmVnaW47XG5cdCAgICB0aGlzLl9lbmQgPSBlbmQ7XG5cdCAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG5cdCAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuXHQgICAgdGhpcy5fZG9uZSA9IGZhbHNlO1xuXHQgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcblx0ICB9XG5cdCAgX2VucXVldWUoY2h1bmspIHtcblx0ICAgIGlmICh0aGlzLl9kb25lKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBjaHVuaztcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IHJlcXVlc3RzQ2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG5cdCAgICAgIHJlcXVlc3RzQ2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICB2YWx1ZTogY2h1bmssXG5cdCAgICAgICAgZG9uZTogZmFsc2Vcblx0ICAgICAgfSk7XG5cdCAgICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcblx0ICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgICBkb25lOiB0cnVlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuXHQgICAgdGhpcy5fc3RyZWFtLl9yZW1vdmVSYW5nZVJlYWRlcih0aGlzKTtcblx0ICB9XG5cdCAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0ICBhc3luYyByZWFkKCkge1xuXHQgICAgaWYgKHRoaXMuX3F1ZXVlZENodW5rKSB7XG5cdCAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fcXVldWVkQ2h1bms7XG5cdCAgICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICB2YWx1ZTogY2h1bmssXG5cdCAgICAgICAgZG9uZTogZmFsc2Vcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl9kb25lKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcblx0ICAgICAgICBkb25lOiB0cnVlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG5cdCAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcblx0ICB9XG5cdCAgY2FuY2VsKHJlYXNvbikge1xuXHQgICAgdGhpcy5fZG9uZSA9IHRydWU7XG5cdCAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG5cdCAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG5cdCAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuXHQgIH1cblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiAxOSAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuWGZhVGV4dCA9IHZvaWQgMDtcblx0Y2xhc3MgWGZhVGV4dCB7XG5cdCAgc3RhdGljIHRleHRDb250ZW50KHhmYSkge1xuXHQgICAgY29uc3QgaXRlbXMgPSBbXTtcblx0ICAgIGNvbnN0IG91dHB1dCA9IHtcblx0ICAgICAgaXRlbXMsXG5cdCAgICAgIHN0eWxlczogT2JqZWN0LmNyZWF0ZShudWxsKVxuXHQgICAgfTtcblx0ICAgIGZ1bmN0aW9uIHdhbGsobm9kZSkge1xuXHQgICAgICBpZiAoIW5vZGUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgbGV0IHN0ciA9IG51bGw7XG5cdCAgICAgIGNvbnN0IG5hbWUgPSBub2RlLm5hbWU7XG5cdCAgICAgIGlmIChuYW1lID09PSBcIiN0ZXh0XCIpIHtcblx0ICAgICAgICBzdHIgPSBub2RlLnZhbHVlO1xuXHQgICAgICB9IGVsc2UgaWYgKCFYZmFUZXh0LnNob3VsZEJ1aWxkVGV4dChuYW1lKSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfSBlbHNlIGlmIChub2RlPy5hdHRyaWJ1dGVzPy50ZXh0Q29udGVudCkge1xuXHQgICAgICAgIHN0ciA9IG5vZGUuYXR0cmlidXRlcy50ZXh0Q29udGVudDtcblx0ICAgICAgfSBlbHNlIGlmIChub2RlLnZhbHVlKSB7XG5cdCAgICAgICAgc3RyID0gbm9kZS52YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoc3RyICE9PSBudWxsKSB7XG5cdCAgICAgICAgaXRlbXMucHVzaCh7XG5cdCAgICAgICAgICBzdHJcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG5cdCAgICAgICAgd2FsayhjaGlsZCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHdhbGsoeGZhKTtcblx0ICAgIHJldHVybiBvdXRwdXQ7XG5cdCAgfVxuXHQgIHN0YXRpYyBzaG91bGRCdWlsZFRleHQobmFtZSkge1xuXHQgICAgcmV0dXJuICEobmFtZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcIm9wdGlvblwiIHx8IG5hbWUgPT09IFwic2VsZWN0XCIpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlhmYVRleHQgPSBYZmFUZXh0O1xuXG5cdC8qKiovIH0pLFxuXHQvKiAyMCAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZXhwb3J0cy5Ob2RlRmlsdGVyRmFjdG9yeSA9IGV4cG9ydHMuTm9kZUNhbnZhc0ZhY3RvcnkgPSBleHBvcnRzLk5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IHZvaWQgMDtcblx0dmFyIF9iYXNlX2ZhY3RvcnkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpO1xuXHRjb25zdCBmZXRjaERhdGEgPSBmdW5jdGlvbiAodXJsKSB7XG5cdCAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0ICAgIGNvbnN0IGZzID0gcmVxdWlyZSQkMDtcblx0ICAgIGZzLnJlYWRGaWxlKHVybCwgKGVycm9yLCBkYXRhKSA9PiB7XG5cdCAgICAgIGlmIChlcnJvciB8fCAhZGF0YSkge1xuXHQgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShkYXRhKSk7XG5cdCAgICB9KTtcblx0ICB9KTtcblx0fTtcblx0Y2xhc3MgTm9kZUZpbHRlckZhY3RvcnkgZXh0ZW5kcyBfYmFzZV9mYWN0b3J5LkJhc2VGaWx0ZXJGYWN0b3J5IHt9XG5cdGV4cG9ydHMuTm9kZUZpbHRlckZhY3RvcnkgPSBOb2RlRmlsdGVyRmFjdG9yeTtcblx0Y2xhc3MgTm9kZUNhbnZhc0ZhY3RvcnkgZXh0ZW5kcyBfYmFzZV9mYWN0b3J5LkJhc2VDYW52YXNGYWN0b3J5IHtcblx0ICBfY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpIHtcblx0ICAgIGNvbnN0IENhbnZhcyA9IHJlcXVpcmUkJDE7XG5cdCAgICByZXR1cm4gQ2FudmFzLmNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5Ob2RlQ2FudmFzRmFjdG9yeSA9IE5vZGVDYW52YXNGYWN0b3J5O1xuXHRjbGFzcyBOb2RlQ01hcFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBfYmFzZV9mYWN0b3J5LkJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG5cdCAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuXHQgICAgcmV0dXJuIGZldGNoRGF0YSh1cmwpLnRoZW4oZGF0YSA9PiB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgY01hcERhdGE6IGRhdGEsXG5cdCAgICAgICAgY29tcHJlc3Npb25UeXBlXG5cdCAgICAgIH07XG5cdCAgICB9KTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5Ob2RlQ01hcFJlYWRlckZhY3RvcnkgPSBOb2RlQ01hcFJlYWRlckZhY3Rvcnk7XG5cdGNsYXNzIE5vZGVTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSBleHRlbmRzIF9iYXNlX2ZhY3RvcnkuQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IHtcblx0ICBfZmV0Y2hEYXRhKHVybCkge1xuXHQgICAgcmV0dXJuIGZldGNoRGF0YSh1cmwpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLk5vZGVTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IE5vZGVTdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcblxuXHQvKioqLyB9KSxcblx0LyogMjEgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLlBERk5vZGVTdHJlYW0gPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfbmV0d29ya191dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpO1xuXHRjb25zdCBmcyA9IHJlcXVpcmUkJDA7XG5cdGNvbnN0IGh0dHAgPSByZXF1aXJlJCQyO1xuXHRjb25zdCBodHRwcyA9IHJlcXVpcmUkJDM7XG5cdGNvbnN0IHVybCA9IHJlcXVpcmUkJDQ7XG5cdGNvbnN0IGZpbGVVcmlSZWdleCA9IC9eZmlsZTpcXC9cXC9cXC9bYS16QS1aXTpcXC8vO1xuXHRmdW5jdGlvbiBwYXJzZVVybChzb3VyY2VVcmwpIHtcblx0ICBjb25zdCBwYXJzZWRVcmwgPSB1cmwucGFyc2Uoc291cmNlVXJsKTtcblx0ICBpZiAocGFyc2VkVXJsLnByb3RvY29sID09PSBcImZpbGU6XCIgfHwgcGFyc2VkVXJsLmhvc3QpIHtcblx0ICAgIHJldHVybiBwYXJzZWRVcmw7XG5cdCAgfVxuXHQgIGlmICgvXlthLXpdOlsvXFxcXF0vaS50ZXN0KHNvdXJjZVVybCkpIHtcblx0ICAgIHJldHVybiB1cmwucGFyc2UoYGZpbGU6Ly8vJHtzb3VyY2VVcmx9YCk7XG5cdCAgfVxuXHQgIGlmICghcGFyc2VkVXJsLmhvc3QpIHtcblx0ICAgIHBhcnNlZFVybC5wcm90b2NvbCA9IFwiZmlsZTpcIjtcblx0ICB9XG5cdCAgcmV0dXJuIHBhcnNlZFVybDtcblx0fVxuXHRjbGFzcyBQREZOb2RlU3RyZWFtIHtcblx0ICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcblx0ICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgdGhpcy51cmwgPSBwYXJzZVVybChzb3VyY2UudXJsKTtcblx0ICAgIHRoaXMuaXNIdHRwID0gdGhpcy51cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIiB8fCB0aGlzLnVybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcblx0ICAgIHRoaXMuaXNGc1VybCA9IHRoaXMudXJsLnByb3RvY29sID09PSBcImZpbGU6XCI7XG5cdCAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgc291cmNlLmh0dHBIZWFkZXJzIHx8IHt9O1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuXHQgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdO1xuXHQgIH1cblx0ICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uX2xvYWRlZCA/PyAwO1xuXHQgIH1cblx0ICBnZXRGdWxsUmVhZGVyKCkge1xuXHQgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERk5vZGVTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG5cdCAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IHRoaXMuaXNGc1VybCA/IG5ldyBQREZOb2RlU3RyZWFtRnNGdWxsUmVhZGVyKHRoaXMpIDogbmV3IFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyKHRoaXMpO1xuXHQgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuXHQgIH1cblx0ICBnZXRSYW5nZVJlYWRlcihzdGFydCwgZW5kKSB7XG5cdCAgICBpZiAoZW5kIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHJhbmdlUmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc1JhbmdlUmVhZGVyKHRoaXMsIHN0YXJ0LCBlbmQpIDogbmV3IFBERk5vZGVTdHJlYW1SYW5nZVJlYWRlcih0aGlzLCBzdGFydCwgZW5kKTtcblx0ICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyYW5nZVJlYWRlcik7XG5cdCAgICByZXR1cm4gcmFuZ2VSZWFkZXI7XG5cdCAgfVxuXHQgIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuXHQgICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkge1xuXHQgICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUERGTm9kZVN0cmVhbSA9IFBERk5vZGVTdHJlYW07XG5cdGNsYXNzIEJhc2VGdWxsUmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcblx0ICAgIHRoaXMuX3VybCA9IHN0cmVhbS51cmw7XG5cdCAgICB0aGlzLl9kb25lID0gZmFsc2U7XG5cdCAgICB0aGlzLl9zdG9yZWRFcnJvciA9IG51bGw7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuXHQgICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcblx0ICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXHQgICAgdGhpcy5fbG9hZGVkID0gMDtcblx0ICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcblx0ICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7XG5cdCAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcblx0ICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuXHQgICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG5cdCAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7XG5cdCAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IG51bGw7XG5cdCAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICB9XG5cdCAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBnZXQgZmlsZW5hbWUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG5cdCAgfVxuXHQgIGdldCBjb250ZW50TGVuZ3RoKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG5cdCAgfVxuXHQgIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG5cdCAgfVxuXHQgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcblx0ICB9XG5cdCAgYXN5bmMgcmVhZCgpIHtcblx0ICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgICBpZiAodGhpcy5fZG9uZSkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG5cdCAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG5cdCAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcblx0ICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgICAgcmV0dXJuIHRoaXMucmVhZCgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcblx0ICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcblx0ICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsXG5cdCAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoXG5cdCAgICB9KTtcblx0ICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGNodW5rKS5idWZmZXI7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWx1ZTogYnVmZmVyLFxuXHQgICAgICBkb25lOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9XG5cdCAgY2FuY2VsKHJlYXNvbikge1xuXHQgICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0cmVhbSkge1xuXHQgICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHJlYXNvbik7XG5cdCAgfVxuXHQgIF9lcnJvcihyZWFzb24pIHtcblx0ICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuXHQgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgIH1cblx0ICBfc2V0UmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0pIHtcblx0ICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gcmVhZGFibGVTdHJlYW07XG5cdCAgICByZWFkYWJsZVN0cmVhbS5vbihcInJlYWRhYmxlXCIsICgpID0+IHtcblx0ICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgICAgfSk7XG5cdCAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG5cdCAgICAgIHJlYWRhYmxlU3RyZWFtLmRlc3Ryb3koKTtcblx0ICAgICAgdGhpcy5fZG9uZSA9IHRydWU7XG5cdCAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgIH0pO1xuXHQgICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuXHQgICAgICB0aGlzLl9lcnJvcihyZWFzb24pO1xuXHQgICAgfSk7XG5cdCAgICBpZiAoIXRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkICYmIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcblx0ICAgICAgdGhpcy5fZXJyb3IobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKFwic3RyZWFtaW5nIGlzIGRpc2FibGVkXCIpKTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuXHQgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0Y2xhc3MgQmFzZVJhbmdlUmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcblx0ICAgIHRoaXMuX3VybCA9IHN0cmVhbS51cmw7XG5cdCAgICB0aGlzLl9kb25lID0gZmFsc2U7XG5cdCAgICB0aGlzLl9zdG9yZWRFcnJvciA9IG51bGw7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuXHQgICAgdGhpcy5fbG9hZGVkID0gMDtcblx0ICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gbnVsbDtcblx0ICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuXHQgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG5cdCAgfVxuXHQgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcblx0ICB9XG5cdCAgYXN5bmMgcmVhZCgpIHtcblx0ICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgICBpZiAodGhpcy5fZG9uZSkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG5cdCAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZVN0cmVhbS5yZWFkKCk7XG5cdCAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcblx0ICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgICAgcmV0dXJuIHRoaXMucmVhZCgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcblx0ICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcblx0ICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWRcblx0ICAgIH0pO1xuXHQgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHZhbHVlOiBidWZmZXIsXG5cdCAgICAgIGRvbmU6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH1cblx0ICBjYW5jZWwocmVhc29uKSB7XG5cdCAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RyZWFtKSB7XG5cdCAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTtcblx0ICB9XG5cdCAgX2Vycm9yKHJlYXNvbikge1xuXHQgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG5cdCAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgfVxuXHQgIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkge1xuXHQgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTtcblx0ICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuXHQgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICB9KTtcblx0ICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcblx0ICAgICAgcmVhZGFibGVTdHJlYW0uZGVzdHJveSgpO1xuXHQgICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgICAgfSk7XG5cdCAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG5cdCAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG5cdCAgICB9KTtcblx0ICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuXHQgICAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbS5kZXN0cm95KHRoaXMuX3N0b3JlZEVycm9yKTtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gY3JlYXRlUmVxdWVzdE9wdGlvbnMocGFyc2VkVXJsLCBoZWFkZXJzKSB7XG5cdCAgcmV0dXJuIHtcblx0ICAgIHByb3RvY29sOiBwYXJzZWRVcmwucHJvdG9jb2wsXG5cdCAgICBhdXRoOiBwYXJzZWRVcmwuYXV0aCxcblx0ICAgIGhvc3Q6IHBhcnNlZFVybC5ob3N0bmFtZSxcblx0ICAgIHBvcnQ6IHBhcnNlZFVybC5wb3J0LFxuXHQgICAgcGF0aDogcGFyc2VkVXJsLnBhdGgsXG5cdCAgICBtZXRob2Q6IFwiR0VUXCIsXG5cdCAgICBoZWFkZXJzXG5cdCAgfTtcblx0fVxuXHRjbGFzcyBQREZOb2RlU3RyZWFtRnVsbFJlYWRlciBleHRlbmRzIEJhc2VGdWxsUmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcblx0ICAgIHN1cGVyKHN0cmVhbSk7XG5cdCAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHJlc3BvbnNlID0+IHtcblx0ICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuXHQgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHt0aGlzLl91cmx9XCIuYCk7XG5cdCAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBlcnJvcjtcblx0ICAgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QoZXJyb3IpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKHJlc3BvbnNlKTtcblx0ICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdHJlYW0uaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xuXHQgICAgICB9O1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuXHQgICAgICAgIHN1Z2dlc3RlZExlbmd0aFxuXHQgICAgICB9ID0gKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7XG5cdCAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsXG5cdCAgICAgICAgaXNIdHRwOiBzdHJlYW0uaXNIdHRwLFxuXHQgICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcblx0ICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGFsbG93UmFuZ2VSZXF1ZXN0cztcblx0ICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuXHQgICAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG5cdCAgICB9O1xuXHQgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG5cdCAgICBpZiAodGhpcy5fdXJsLnByb3RvY29sID09PSBcImh0dHA6XCIpIHtcblx0ICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHN0cmVhbS5odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fcmVxdWVzdC5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG5cdCAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gcmVhc29uO1xuXHQgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5fcmVxdWVzdC5lbmQoKTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyIGV4dGVuZHMgQmFzZVJhbmdlUmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihzdHJlYW0sIHN0YXJ0LCBlbmQpIHtcblx0ICAgIHN1cGVyKHN0cmVhbSk7XG5cdCAgICB0aGlzLl9odHRwSGVhZGVycyA9IHt9O1xuXHQgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBzdHJlYW0uaHR0cEhlYWRlcnMpIHtcblx0ICAgICAgY29uc3QgdmFsdWUgPSBzdHJlYW0uaHR0cEhlYWRlcnNbcHJvcGVydHldO1xuXHQgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2h0dHBIZWFkZXJzW3Byb3BlcnR5XSA9IHZhbHVlO1xuXHQgICAgfVxuXHQgICAgdGhpcy5faHR0cEhlYWRlcnMuUmFuZ2UgPSBgYnl0ZXM9JHtzdGFydH0tJHtlbmQgLSAxfWA7XG5cdCAgICBjb25zdCBoYW5kbGVSZXNwb25zZSA9IHJlc3BvbnNlID0+IHtcblx0ICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuXHQgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHt0aGlzLl91cmx9XCIuYCk7XG5cdCAgICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSBlcnJvcjtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0ocmVzcG9uc2UpO1xuXHQgICAgfTtcblx0ICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuXHQgICAgaWYgKHRoaXMuX3VybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiKSB7XG5cdCAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuX3JlcXVlc3QgPSBodHRwcy5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgdGhpcy5faHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9yZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcblx0ICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuX3JlcXVlc3QuZW5kKCk7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIgZXh0ZW5kcyBCYXNlRnVsbFJlYWRlciB7XG5cdCAgY29uc3RydWN0b3Ioc3RyZWFtKSB7XG5cdCAgICBzdXBlcihzdHJlYW0pO1xuXHQgICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuXHQgICAgaWYgKGZpbGVVcmlSZWdleC50ZXN0KHRoaXMuX3VybC5ocmVmKSkge1xuXHQgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG5cdCAgICB9XG5cdCAgICBmcy5sc3RhdChwYXRoLCAoZXJyb3IsIHN0YXQpID0+IHtcblx0ICAgICAgaWYgKGVycm9yKSB7XG5cdCAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIpIHtcblx0ICAgICAgICAgIGVycm9yID0gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oYE1pc3NpbmcgUERGIFwiJHtwYXRofVwiLmApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuXHQgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzdGF0LnNpemU7XG5cdCAgICAgIHRoaXMuX3NldFJlYWRhYmxlU3RyZWFtKGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aCkpO1xuXHQgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICB9KTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHN0cmVhbSwgc3RhcnQsIGVuZCkge1xuXHQgICAgc3VwZXIoc3RyZWFtKTtcblx0ICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuX3VybC5wYXRoKTtcblx0ICAgIGlmIChmaWxlVXJpUmVnZXgudGVzdCh0aGlzLl91cmwuaHJlZikpIHtcblx0ICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0oZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLCB7XG5cdCAgICAgIHN0YXJ0LFxuXHQgICAgICBlbmQ6IGVuZCAtIDFcblx0ICAgIH0pKTtcblx0ICB9XG5cdH1cblxuXHQvKioqLyB9KSxcblx0LyogMjIgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IgPSBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yO1xuXHRleHBvcnRzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIgPSBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyO1xuXHRleHBvcnRzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzID0gdmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXM7XG5cdGV4cG9ydHMudmFsaWRhdGVSZXNwb25zZVN0YXR1cyA9IHZhbGlkYXRlUmVzcG9uc2VTdGF0dXM7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfY29udGVudF9kaXNwb3NpdGlvbiA9IF9fd19wZGZqc19yZXF1aXJlX18oMjMpO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHRmdW5jdGlvbiB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcyh7XG5cdCAgZ2V0UmVzcG9uc2VIZWFkZXIsXG5cdCAgaXNIdHRwLFxuXHQgIHJhbmdlQ2h1bmtTaXplLFxuXHQgIGRpc2FibGVSYW5nZVxuXHR9KSB7XG5cdCAgY29uc3QgcmV0dXJuVmFsdWVzID0ge1xuXHQgICAgYWxsb3dSYW5nZVJlcXVlc3RzOiBmYWxzZSxcblx0ICAgIHN1Z2dlc3RlZExlbmd0aDogdW5kZWZpbmVkXG5cdCAgfTtcblx0ICBjb25zdCBsZW5ndGggPSBwYXJzZUludChnZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtTGVuZ3RoXCIpLCAxMCk7XG5cdCAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGxlbmd0aCkpIHtcblx0ICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG5cdCAgfVxuXHQgIHJldHVyblZhbHVlcy5zdWdnZXN0ZWRMZW5ndGggPSBsZW5ndGg7XG5cdCAgaWYgKGxlbmd0aCA8PSAyICogcmFuZ2VDaHVua1NpemUpIHtcblx0ICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG5cdCAgfVxuXHQgIGlmIChkaXNhYmxlUmFuZ2UgfHwgIWlzSHR0cCkge1xuXHQgICAgcmV0dXJuIHJldHVyblZhbHVlcztcblx0ICB9XG5cdCAgaWYgKGdldFJlc3BvbnNlSGVhZGVyKFwiQWNjZXB0LVJhbmdlc1wiKSAhPT0gXCJieXRlc1wiKSB7XG5cdCAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuXHQgIH1cblx0ICBjb25zdCBjb250ZW50RW5jb2RpbmcgPSBnZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtRW5jb2RpbmdcIikgfHwgXCJpZGVudGl0eVwiO1xuXHQgIGlmIChjb250ZW50RW5jb2RpbmcgIT09IFwiaWRlbnRpdHlcIikge1xuXHQgICAgcmV0dXJuIHJldHVyblZhbHVlcztcblx0ICB9XG5cdCAgcmV0dXJuVmFsdWVzLmFsbG93UmFuZ2VSZXF1ZXN0cyA9IHRydWU7XG5cdCAgcmV0dXJuIHJldHVyblZhbHVlcztcblx0fVxuXHRmdW5jdGlvbiBleHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKGdldFJlc3BvbnNlSGVhZGVyKSB7XG5cdCAgY29uc3QgY29udGVudERpc3Bvc2l0aW9uID0gZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIpO1xuXHQgIGlmIChjb250ZW50RGlzcG9zaXRpb24pIHtcblx0ICAgIGxldCBmaWxlbmFtZSA9ICgwLCBfY29udGVudF9kaXNwb3NpdGlvbi5nZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIpKGNvbnRlbnREaXNwb3NpdGlvbik7XG5cdCAgICBpZiAoZmlsZW5hbWUuaW5jbHVkZXMoXCIlXCIpKSB7XG5cdCAgICAgIHRyeSB7XG5cdCAgICAgICAgZmlsZW5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpO1xuXHQgICAgICB9IGNhdGNoIChleCkge31cblx0ICAgIH1cblx0ICAgIGlmICgoMCwgX2Rpc3BsYXlfdXRpbHMuaXNQZGZGaWxlKShmaWxlbmFtZSkpIHtcblx0ICAgICAgcmV0dXJuIGZpbGVuYW1lO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gbnVsbDtcblx0fVxuXHRmdW5jdGlvbiBjcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKHN0YXR1cywgdXJsKSB7XG5cdCAgaWYgKHN0YXR1cyA9PT0gNDA0IHx8IHN0YXR1cyA9PT0gMCAmJiB1cmwuc3RhcnRzV2l0aChcImZpbGU6XCIpKSB7XG5cdCAgICByZXR1cm4gbmV3IF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb24oJ01pc3NpbmcgUERGIFwiJyArIHVybCArICdcIi4nKTtcblx0ICB9XG5cdCAgcmV0dXJuIG5ldyBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oYFVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlICgke3N0YXR1c30pIHdoaWxlIHJldHJpZXZpbmcgUERGIFwiJHt1cmx9XCIuYCwgc3RhdHVzKTtcblx0fVxuXHRmdW5jdGlvbiB2YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKHN0YXR1cykge1xuXHQgIHJldHVybiBzdGF0dXMgPT09IDIwMCB8fCBzdGF0dXMgPT09IDIwNjtcblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiAyMyAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyID0gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uSGVhZGVyO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHRmdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIoY29udGVudERpc3Bvc2l0aW9uKSB7XG5cdCAgbGV0IG5lZWRzRW5jb2RpbmdGaXh1cCA9IHRydWU7XG5cdCAgbGV0IHRtcCA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVxcXFwqXCIsIFwiaVwiKS5leGVjKGNvbnRlbnREaXNwb3NpdGlvbik7XG5cdCAgaWYgKHRtcCkge1xuXHQgICAgdG1wID0gdG1wWzFdO1xuXHQgICAgbGV0IGZpbGVuYW1lID0gcmZjMjYxNnVucXVvdGUodG1wKTtcblx0ICAgIGZpbGVuYW1lID0gdW5lc2NhcGUoZmlsZW5hbWUpO1xuXHQgICAgZmlsZW5hbWUgPSByZmM1OTg3ZGVjb2RlKGZpbGVuYW1lKTtcblx0ICAgIGZpbGVuYW1lID0gcmZjMjA0N2RlY29kZShmaWxlbmFtZSk7XG5cdCAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG5cdCAgfVxuXHQgIHRtcCA9IHJmYzIyMzFnZXRwYXJhbShjb250ZW50RGlzcG9zaXRpb24pO1xuXHQgIGlmICh0bXApIHtcblx0ICAgIGNvbnN0IGZpbGVuYW1lID0gcmZjMjA0N2RlY29kZSh0bXApO1xuXHQgICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoZmlsZW5hbWUpO1xuXHQgIH1cblx0ICB0bXAgPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcIiwgXCJpXCIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcblx0ICBpZiAodG1wKSB7XG5cdCAgICB0bXAgPSB0bXBbMV07XG5cdCAgICBsZXQgZmlsZW5hbWUgPSByZmMyNjE2dW5xdW90ZSh0bXApO1xuXHQgICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTtcblx0ICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTtcblx0ICB9XG5cdCAgZnVuY3Rpb24gdG9QYXJhbVJlZ0V4cChhdHRyaWJ1dGVQYXR0ZXJuLCBmbGFncykge1xuXHQgICAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoPzpefDspXFxcXHMqXCIgKyBhdHRyaWJ1dGVQYXR0ZXJuICsgXCJcXFxccyo9XFxcXHMqXCIgKyBcIihcIiArICdbXlwiO1xcXFxzXVteO1xcXFxzXSonICsgXCJ8XCIgKyAnXCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcXCI/KStcIj8nICsgXCIpXCIsIGZsYWdzKTtcblx0ICB9XG5cdCAgZnVuY3Rpb24gdGV4dGRlY29kZShlbmNvZGluZywgdmFsdWUpIHtcblx0ICAgIGlmIChlbmNvZGluZykge1xuXHQgICAgICBpZiAoIS9eW1xceDAwLVxceEZGXSskLy50ZXN0KHZhbHVlKSkge1xuXHQgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgICB0cnkge1xuXHQgICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcsIHtcblx0ICAgICAgICAgIGZhdGFsOiB0cnVlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgY29uc3QgYnVmZmVyID0gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHZhbHVlKTtcblx0ICAgICAgICB2YWx1ZSA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlcik7XG5cdCAgICAgICAgbmVlZHNFbmNvZGluZ0ZpeHVwID0gZmFsc2U7XG5cdCAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfVxuXHQgIGZ1bmN0aW9uIGZpeHVwRW5jb2RpbmcodmFsdWUpIHtcblx0ICAgIGlmIChuZWVkc0VuY29kaW5nRml4dXAgJiYgL1tcXHg4MC1cXHhmZl0vLnRlc3QodmFsdWUpKSB7XG5cdCAgICAgIHZhbHVlID0gdGV4dGRlY29kZShcInV0Zi04XCIsIHZhbHVlKTtcblx0ICAgICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCkge1xuXHQgICAgICAgIHZhbHVlID0gdGV4dGRlY29kZShcImlzby04ODU5LTFcIiwgdmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfVxuXHQgIGZ1bmN0aW9uIHJmYzIyMzFnZXRwYXJhbShjb250ZW50RGlzcG9zaXRpb25TdHIpIHtcblx0ICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcblx0ICAgIGxldCBtYXRjaDtcblx0ICAgIGNvbnN0IGl0ZXIgPSB0b1BhcmFtUmVnRXhwKFwiZmlsZW5hbWVcXFxcKigoPyEwXFxcXGQpXFxcXGQrKShcXFxcKj8pXCIsIFwiaWdcIik7XG5cdCAgICB3aGlsZSAoKG1hdGNoID0gaXRlci5leGVjKGNvbnRlbnREaXNwb3NpdGlvblN0cikpICE9PSBudWxsKSB7XG5cdCAgICAgIGxldCBbLCBuLCBxdW90LCBwYXJ0XSA9IG1hdGNoO1xuXHQgICAgICBuID0gcGFyc2VJbnQobiwgMTApO1xuXHQgICAgICBpZiAobiBpbiBtYXRjaGVzKSB7XG5cdCAgICAgICAgaWYgKG4gPT09IDApIHtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBtYXRjaGVzW25dID0gW3F1b3QsIHBhcnRdO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcGFydHMgPSBbXTtcblx0ICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbWF0Y2hlcy5sZW5ndGg7ICsrbikge1xuXHQgICAgICBpZiAoIShuIGluIG1hdGNoZXMpKSB7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblx0ICAgICAgbGV0IFtxdW90LCBwYXJ0XSA9IG1hdGNoZXNbbl07XG5cdCAgICAgIHBhcnQgPSByZmMyNjE2dW5xdW90ZShwYXJ0KTtcblx0ICAgICAgaWYgKHF1b3QpIHtcblx0ICAgICAgICBwYXJ0ID0gdW5lc2NhcGUocGFydCk7XG5cdCAgICAgICAgaWYgKG4gPT09IDApIHtcblx0ICAgICAgICAgIHBhcnQgPSByZmM1OTg3ZGVjb2RlKHBhcnQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBwYXJ0cy5wdXNoKHBhcnQpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHBhcnRzLmpvaW4oXCJcIik7XG5cdCAgfVxuXHQgIGZ1bmN0aW9uIHJmYzI2MTZ1bnF1b3RlKHZhbHVlKSB7XG5cdCAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuXHQgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNsaWNlKDEpLnNwbGl0KCdcXFxcXCInKTtcblx0ICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuXHQgICAgICAgIGNvbnN0IHF1b3RpbmRleCA9IHBhcnRzW2ldLmluZGV4T2YoJ1wiJyk7XG5cdCAgICAgICAgaWYgKHF1b3RpbmRleCAhPT0gLTEpIHtcblx0ICAgICAgICAgIHBhcnRzW2ldID0gcGFydHNbaV0uc2xpY2UoMCwgcXVvdGluZGV4KTtcblx0ICAgICAgICAgIHBhcnRzLmxlbmd0aCA9IGkgKyAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBwYXJ0c1tpXSA9IHBhcnRzW2ldLnJlcGxhY2VBbGwoL1xcXFwoLikvZywgXCIkMVwiKTtcblx0ICAgICAgfVxuXHQgICAgICB2YWx1ZSA9IHBhcnRzLmpvaW4oJ1wiJyk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdmFsdWU7XG5cdCAgfVxuXHQgIGZ1bmN0aW9uIHJmYzU5ODdkZWNvZGUoZXh0dmFsdWUpIHtcblx0ICAgIGNvbnN0IGVuY29kaW5nZW5kID0gZXh0dmFsdWUuaW5kZXhPZihcIidcIik7XG5cdCAgICBpZiAoZW5jb2RpbmdlbmQgPT09IC0xKSB7XG5cdCAgICAgIHJldHVybiBleHR2YWx1ZTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGVuY29kaW5nID0gZXh0dmFsdWUuc2xpY2UoMCwgZW5jb2RpbmdlbmQpO1xuXHQgICAgY29uc3QgbGFuZ3ZhbHVlID0gZXh0dmFsdWUuc2xpY2UoZW5jb2RpbmdlbmQgKyAxKTtcblx0ICAgIGNvbnN0IHZhbHVlID0gbGFuZ3ZhbHVlLnJlcGxhY2UoL15bXiddKicvLCBcIlwiKTtcblx0ICAgIHJldHVybiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSk7XG5cdCAgfVxuXHQgIGZ1bmN0aW9uIHJmYzIwNDdkZWNvZGUodmFsdWUpIHtcblx0ICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChcIj0/XCIpIHx8IC9bXFx4MDAtXFx4MTlcXHg4MC1cXHhmZl0vLnRlc3QodmFsdWUpKSB7XG5cdCAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC89XFw/KFtcXHctXSopXFw/KFtRcUJiXSlcXD8oKD86W14/XXxcXD8oPyE9KSkqKVxcPz0vZywgZnVuY3Rpb24gKG1hdGNoZXMsIGNoYXJzZXQsIGVuY29kaW5nLCB0ZXh0KSB7XG5cdCAgICAgIGlmIChlbmNvZGluZyA9PT0gXCJxXCIgfHwgZW5jb2RpbmcgPT09IFwiUVwiKSB7XG5cdCAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbChcIl9cIiwgXCIgXCIpO1xuXHQgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoLz0oWzAtOWEtZkEtRl17Mn0pL2csIGZ1bmN0aW9uIChtYXRjaCwgaGV4KSB7XG5cdCAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIHRleHRkZWNvZGUoY2hhcnNldCwgdGV4dCk7XG5cdCAgICAgIH1cblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICB0ZXh0ID0gYXRvYih0ZXh0KTtcblx0ICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgcmV0dXJuIHRleHRkZWNvZGUoY2hhcnNldCwgdGV4dCk7XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmV0dXJuIFwiXCI7XG5cdH1cblxuXHQvKioqLyB9KSxcblx0LyogMjQgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLlBERk5ldHdvcmtTdHJlYW0gPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfbmV0d29ya191dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpO1xuXHRjb25zdCBPS19SRVNQT05TRSA9IDIwMDtcblx0Y29uc3QgUEFSVElBTF9DT05URU5UX1JFU1BPTlNFID0gMjA2O1xuXHRmdW5jdGlvbiBnZXRBcnJheUJ1ZmZlcih4aHIpIHtcblx0ICBjb25zdCBkYXRhID0geGhyLnJlc3BvbnNlO1xuXHQgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuXHQgICAgcmV0dXJuIGRhdGE7XG5cdCAgfVxuXHQgIHJldHVybiAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykoZGF0YSkuYnVmZmVyO1xuXHR9XG5cdGNsYXNzIE5ldHdvcmtNYW5hZ2VyIHtcblx0ICBjb25zdHJ1Y3Rvcih1cmwsIGFyZ3MgPSB7fSkge1xuXHQgICAgdGhpcy51cmwgPSB1cmw7XG5cdCAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3QodXJsKTtcblx0ICAgIHRoaXMuaHR0cEhlYWRlcnMgPSB0aGlzLmlzSHR0cCAmJiBhcmdzLmh0dHBIZWFkZXJzIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IGFyZ3Mud2l0aENyZWRlbnRpYWxzIHx8IGZhbHNlO1xuXHQgICAgdGhpcy5jdXJyWGhySWQgPSAwO1xuXHQgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgIH1cblx0ICByZXF1ZXN0UmFuZ2UoYmVnaW4sIGVuZCwgbGlzdGVuZXJzKSB7XG5cdCAgICBjb25zdCBhcmdzID0ge1xuXHQgICAgICBiZWdpbixcblx0ICAgICAgZW5kXG5cdCAgICB9O1xuXHQgICAgZm9yIChjb25zdCBwcm9wIGluIGxpc3RlbmVycykge1xuXHQgICAgICBhcmdzW3Byb3BdID0gbGlzdGVuZXJzW3Byb3BdO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMucmVxdWVzdChhcmdzKTtcblx0ICB9XG5cdCAgcmVxdWVzdEZ1bGwobGlzdGVuZXJzKSB7XG5cdCAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGxpc3RlbmVycyk7XG5cdCAgfVxuXHQgIHJlcXVlc3QoYXJncykge1xuXHQgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cdCAgICBjb25zdCB4aHJJZCA9IHRoaXMuY3VyclhocklkKys7XG5cdCAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXSA9IHtcblx0ICAgICAgeGhyXG5cdCAgICB9O1xuXHQgICAgeGhyLm9wZW4oXCJHRVRcIiwgdGhpcy51cmwpO1xuXHQgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzO1xuXHQgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmh0dHBIZWFkZXJzKSB7XG5cdCAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5odHRwSGVhZGVyc1twcm9wZXJ0eV07XG5cdCAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIocHJvcGVydHksIHZhbHVlKTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLmlzSHR0cCAmJiBcImJlZ2luXCIgaW4gYXJncyAmJiBcImVuZFwiIGluIGFyZ3MpIHtcblx0ICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLCBgYnl0ZXM9JHthcmdzLmJlZ2lufS0ke2FyZ3MuZW5kIC0gMX1gKTtcblx0ICAgICAgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0U7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9IE9LX1JFU1BPTlNFO1xuXHQgICAgfVxuXHQgICAgeGhyLnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcblx0ICAgIGlmIChhcmdzLm9uRXJyb3IpIHtcblx0ICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXZ0KSB7XG5cdCAgICAgICAgYXJncy5vbkVycm9yKHhoci5zdGF0dXMpO1xuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMsIHhocklkKTtcblx0ICAgIHhoci5vbnByb2dyZXNzID0gdGhpcy5vblByb2dyZXNzLmJpbmQodGhpcywgeGhySWQpO1xuXHQgICAgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQgPSBhcmdzLm9uSGVhZGVyc1JlY2VpdmVkO1xuXHQgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lID0gYXJncy5vbkRvbmU7XG5cdCAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yID0gYXJncy5vbkVycm9yO1xuXHQgICAgcGVuZGluZ1JlcXVlc3Qub25Qcm9ncmVzcyA9IGFyZ3Mub25Qcm9ncmVzcztcblx0ICAgIHhoci5zZW5kKG51bGwpO1xuXHQgICAgcmV0dXJuIHhocklkO1xuXHQgIH1cblx0ICBvblByb2dyZXNzKHhocklkLCBldnQpIHtcblx0ICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuXHQgICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzPy4oZXZ0KTtcblx0ICB9XG5cdCAgb25TdGF0ZUNoYW5nZSh4aHJJZCwgZXZ0KSB7XG5cdCAgICBjb25zdCBwZW5kaW5nUmVxdWVzdCA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXTtcblx0ICAgIGlmICghcGVuZGluZ1JlcXVlc3QpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgeGhyID0gcGVuZGluZ1JlcXVlc3QueGhyO1xuXHQgICAgaWYgKHhoci5yZWFkeVN0YXRlID49IDIgJiYgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQpIHtcblx0ICAgICAgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQoKTtcblx0ICAgICAgZGVsZXRlIHBlbmRpbmdSZXF1ZXN0Lm9uSGVhZGVyc1JlY2VpdmVkO1xuXHQgICAgfVxuXHQgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9PSA0KSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICghKHhocklkIGluIHRoaXMucGVuZGluZ1JlcXVlc3RzKSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuXHQgICAgaWYgKHhoci5zdGF0dXMgPT09IDAgJiYgdGhpcy5pc0h0dHApIHtcblx0ICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcj8uKHhoci5zdGF0dXMpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCB4aHJTdGF0dXMgPSB4aHIuc3RhdHVzIHx8IE9LX1JFU1BPTlNFO1xuXHQgICAgY29uc3Qgb2tfcmVzcG9uc2Vfb25fcmFuZ2VfcmVxdWVzdCA9IHhoclN0YXR1cyA9PT0gT0tfUkVTUE9OU0UgJiYgcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMgPT09IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRTtcblx0ICAgIGlmICghb2tfcmVzcG9uc2Vfb25fcmFuZ2VfcmVxdWVzdCAmJiB4aHJTdGF0dXMgIT09IHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzKSB7XG5cdCAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3I/Lih4aHIuc3RhdHVzKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY2h1bmsgPSBnZXRBcnJheUJ1ZmZlcih4aHIpO1xuXHQgICAgaWYgKHhoclN0YXR1cyA9PT0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFKSB7XG5cdCAgICAgIGNvbnN0IHJhbmdlSGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1SYW5nZVwiKTtcblx0ICAgICAgY29uc3QgbWF0Y2hlcyA9IC9ieXRlcyAoXFxkKyktKFxcZCspXFwvKFxcZCspLy5leGVjKHJhbmdlSGVhZGVyKTtcblx0ICAgICAgcGVuZGluZ1JlcXVlc3Qub25Eb25lKHtcblx0ICAgICAgICBiZWdpbjogcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApLFxuXHQgICAgICAgIGNodW5rXG5cdCAgICAgIH0pO1xuXHQgICAgfSBlbHNlIGlmIChjaHVuaykge1xuXHQgICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUoe1xuXHQgICAgICAgIGJlZ2luOiAwLFxuXHQgICAgICAgIGNodW5rXG5cdCAgICAgIH0pO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcj8uKHhoci5zdGF0dXMpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXRSZXF1ZXN0WGhyKHhocklkKSB7XG5cdCAgICByZXR1cm4gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdLnhocjtcblx0ICB9XG5cdCAgaXNQZW5kaW5nUmVxdWVzdCh4aHJJZCkge1xuXHQgICAgcmV0dXJuIHhocklkIGluIHRoaXMucGVuZGluZ1JlcXVlc3RzO1xuXHQgIH1cblx0ICBhYm9ydFJlcXVlc3QoeGhySWQpIHtcblx0ICAgIGNvbnN0IHhociA9IHRoaXMucGVuZGluZ1JlcXVlc3RzW3hocklkXS54aHI7XG5cdCAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuXHQgICAgeGhyLmFib3J0KCk7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFBERk5ldHdvcmtTdHJlYW0ge1xuXHQgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuXHQgICAgdGhpcy5fc291cmNlID0gc291cmNlO1xuXHQgICAgdGhpcy5fbWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcihzb3VyY2UudXJsLCB7XG5cdCAgICAgIGh0dHBIZWFkZXJzOiBzb3VyY2UuaHR0cEhlYWRlcnMsXG5cdCAgICAgIHdpdGhDcmVkZW50aWFsczogc291cmNlLndpdGhDcmVkZW50aWFsc1xuXHQgICAgfSk7XG5cdCAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcblx0ICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcblx0ICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcblx0ICB9XG5cdCAgX29uUmFuZ2VSZXF1ZXN0UmVhZGVyQ2xvc2VkKHJlYWRlcikge1xuXHQgICAgY29uc3QgaSA9IHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuaW5kZXhPZihyZWFkZXIpO1xuXHQgICAgaWYgKGkgPj0gMCkge1xuXHQgICAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNwbGljZShpLCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0RnVsbFJlYWRlcigpIHtcblx0ICAgICgwLCBfdXRpbC5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZOZXR3b3JrU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyKHRoaXMuX21hbmFnZXIsIHRoaXMuX3NvdXJjZSk7XG5cdCAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG5cdCAgfVxuXHQgIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcblx0ICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyKHRoaXMuX21hbmFnZXIsIGJlZ2luLCBlbmQpO1xuXHQgICAgcmVhZGVyLm9uQ2xvc2VkID0gdGhpcy5fb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQuYmluZCh0aGlzKTtcblx0ICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMucHVzaChyZWFkZXIpO1xuXHQgICAgcmV0dXJuIHJlYWRlcjtcblx0ICB9XG5cdCAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG5cdCAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG5cdCAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSB7XG5cdCAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5QREZOZXR3b3JrU3RyZWFtID0gUERGTmV0d29ya1N0cmVhbTtcblx0Y2xhc3MgUERGTmV0d29ya1N0cmVhbUZ1bGxSZXF1ZXN0UmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBzb3VyY2UpIHtcblx0ICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuXHQgICAgY29uc3QgYXJncyA9IHtcblx0ICAgICAgb25IZWFkZXJzUmVjZWl2ZWQ6IHRoaXMuX29uSGVhZGVyc1JlY2VpdmVkLmJpbmQodGhpcyksXG5cdCAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG5cdCAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxcblx0ICAgICAgb25Qcm9ncmVzczogdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpXG5cdCAgICB9O1xuXHQgICAgdGhpcy5fdXJsID0gc291cmNlLnVybDtcblx0ICAgIHRoaXMuX2Z1bGxSZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RGdWxsKGFyZ3MpO1xuXHQgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTtcblx0ICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXHQgICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG5cdCAgICBpZiAoIXRoaXMuX3JhbmdlQ2h1bmtTaXplICYmICF0aGlzLl9kaXNhYmxlUmFuZ2UpIHtcblx0ICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gZmFsc2U7XG5cdCAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gZmFsc2U7XG5cdCAgICB0aGlzLl9jYWNoZWRDaHVua3MgPSBbXTtcblx0ICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG5cdCAgICB0aGlzLl9kb25lID0gZmFsc2U7XG5cdCAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcblx0ICAgIHRoaXMuX2ZpbGVuYW1lID0gbnVsbDtcblx0ICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cdCAgfVxuXHQgIF9vbkhlYWRlcnNSZWNlaXZlZCgpIHtcblx0ICAgIGNvbnN0IGZ1bGxSZXF1ZXN0WGhySWQgPSB0aGlzLl9mdWxsUmVxdWVzdElkO1xuXHQgICAgY29uc3QgZnVsbFJlcXVlc3RYaHIgPSB0aGlzLl9tYW5hZ2VyLmdldFJlcXVlc3RYaHIoZnVsbFJlcXVlc3RYaHJJZCk7XG5cdCAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4ge1xuXHQgICAgICByZXR1cm4gZnVsbFJlcXVlc3RYaHIuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7XG5cdCAgICB9O1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBhbGxvd1JhbmdlUmVxdWVzdHMsXG5cdCAgICAgIHN1Z2dlc3RlZExlbmd0aFxuXHQgICAgfSA9ICgwLCBfbmV0d29ya191dGlscy52YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcykoe1xuXHQgICAgICBnZXRSZXNwb25zZUhlYWRlcixcblx0ICAgICAgaXNIdHRwOiB0aGlzLl9tYW5hZ2VyLmlzSHR0cCxcblx0ICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuXHQgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuXHQgICAgfSk7XG5cdCAgICBpZiAoYWxsb3dSYW5nZVJlcXVlc3RzKSB7XG5cdCAgICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuXHQgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgX25ldHdvcmtfdXRpbHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlcikoZ2V0UmVzcG9uc2VIZWFkZXIpO1xuXHQgICAgaWYgKHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQpIHtcblx0ICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QoZnVsbFJlcXVlc3RYaHJJZCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICB9XG5cdCAgX29uRG9uZShkYXRhKSB7XG5cdCAgICBpZiAoZGF0YSkge1xuXHQgICAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcblx0ICAgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICAgIHZhbHVlOiBkYXRhLmNodW5rLFxuXHQgICAgICAgICAgZG9uZTogZmFsc2Vcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLl9jYWNoZWRDaHVua3MucHVzaChkYXRhLmNodW5rKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgdGhpcy5fZG9uZSA9IHRydWU7XG5cdCAgICBpZiAodGhpcy5fY2FjaGVkQ2h1bmtzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuXHQgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuXHQgICAgICAgIGRvbmU6IHRydWVcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuXHQgIH1cblx0ICBfb25FcnJvcihzdGF0dXMpIHtcblx0ICAgIHRoaXMuX3N0b3JlZEVycm9yID0gKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHN0YXR1cywgdGhpcy5fdXJsKTtcblx0ICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtcblx0ICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcblx0ICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG5cdCAgICB0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID0gMDtcblx0ICB9XG5cdCAgX29uUHJvZ3Jlc3MoZXZ0KSB7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG5cdCAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcblx0ICAgICAgdG90YWw6IGV2dC5sZW5ndGhDb21wdXRhYmxlID8gZXZ0LnRvdGFsIDogdGhpcy5fY29udGVudExlbmd0aFxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldCBmaWxlbmFtZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcblx0ICB9XG5cdCAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcblx0ICB9XG5cdCAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuXHQgIH1cblx0ICBnZXQgY29udGVudExlbmd0aCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9jb250ZW50TGVuZ3RoO1xuXHQgIH1cblx0ICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucHJvbWlzZTtcblx0ICB9XG5cdCAgYXN5bmMgcmVhZCgpIHtcblx0ICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuXHQgICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuXHQgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NhY2hlZENodW5rcy5zaGlmdCgpO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHZhbHVlOiBjaHVuayxcblx0ICAgICAgICBkb25lOiBmYWxzZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX2RvbmUpIHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuXHQgICAgICAgIGRvbmU6IHRydWVcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcblx0ICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBjYW5jZWwocmVhc29uKSB7XG5cdCAgICB0aGlzLl9kb25lID0gdHJ1ZTtcblx0ICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVqZWN0KHJlYXNvbik7XG5cdCAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG5cdCAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG5cdCAgICBpZiAodGhpcy5fbWFuYWdlci5pc1BlbmRpbmdSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpKSB7XG5cdCAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX2Z1bGxSZXF1ZXN0SWQpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBQREZOZXR3b3JrU3RyZWFtUmFuZ2VSZXF1ZXN0UmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihtYW5hZ2VyLCBiZWdpbiwgZW5kKSB7XG5cdCAgICB0aGlzLl9tYW5hZ2VyID0gbWFuYWdlcjtcblx0ICAgIGNvbnN0IGFyZ3MgPSB7XG5cdCAgICAgIG9uRG9uZTogdGhpcy5fb25Eb25lLmJpbmQodGhpcyksXG5cdCAgICAgIG9uRXJyb3I6IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKSxcblx0ICAgICAgb25Qcm9ncmVzczogdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpXG5cdCAgICB9O1xuXHQgICAgdGhpcy5fdXJsID0gbWFuYWdlci51cmw7XG5cdCAgICB0aGlzLl9yZXF1ZXN0SWQgPSBtYW5hZ2VyLnJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBhcmdzKTtcblx0ICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG5cdCAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG5cdCAgICB0aGlzLl9kb25lID0gZmFsc2U7XG5cdCAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHVuZGVmaW5lZDtcblx0ICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cdCAgICB0aGlzLm9uQ2xvc2VkID0gbnVsbDtcblx0ICB9XG5cdCAgX2Nsb3NlKCkge1xuXHQgICAgdGhpcy5vbkNsb3NlZD8uKHRoaXMpO1xuXHQgIH1cblx0ICBfb25Eb25lKGRhdGEpIHtcblx0ICAgIGNvbnN0IGNodW5rID0gZGF0YS5jaHVuaztcblx0ICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG5cdCAgICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcblx0ICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG5cdCAgICAgICAgdmFsdWU6IGNodW5rLFxuXHQgICAgICAgIGRvbmU6IGZhbHNlXG5cdCAgICAgIH0pO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBjaHVuaztcblx0ICAgIH1cblx0ICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuXHQgICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuXHQgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuXHQgICAgICAgIGRvbmU6IHRydWVcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuXHQgICAgdGhpcy5fY2xvc2UoKTtcblx0ICB9XG5cdCAgX29uRXJyb3Ioc3RhdHVzKSB7XG5cdCAgICB0aGlzLl9zdG9yZWRFcnJvciA9ICgwLCBfbmV0d29ya191dGlscy5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKShzdGF0dXMsIHRoaXMuX3VybCk7XG5cdCAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG5cdCAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlamVjdCh0aGlzLl9zdG9yZWRFcnJvcik7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuXHQgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuXHQgIH1cblx0ICBfb25Qcm9ncmVzcyhldnQpIHtcblx0ICAgIGlmICghdGhpcy5pc1N0cmVhbWluZ1N1cHBvcnRlZCkge1xuXHQgICAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG5cdCAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkXG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXHQgIGFzeW5jIHJlYWQoKSB7XG5cdCAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcblx0ICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmsgIT09IG51bGwpIHtcblx0ICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVuaztcblx0ICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHZhbHVlOiBjaHVuayxcblx0ICAgICAgICBkb25lOiBmYWxzZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX2RvbmUpIHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuXHQgICAgICAgIGRvbmU6IHRydWVcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcblx0ICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBjYW5jZWwocmVhc29uKSB7XG5cdCAgICB0aGlzLl9kb25lID0gdHJ1ZTtcblx0ICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcblx0ICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG5cdCAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcblx0ICAgICAgICBkb25lOiB0cnVlXG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcblx0ICAgIGlmICh0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fcmVxdWVzdElkKSkge1xuXHQgICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fY2xvc2UoKTtcblx0ICB9XG5cdH1cblxuXHQvKioqLyB9KSxcblx0LyogMjUgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLlBERkZldGNoU3RyZWFtID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX25ldHdvcmtfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIyKTtcblx0ZnVuY3Rpb24gY3JlYXRlRmV0Y2hPcHRpb25zKGhlYWRlcnMsIHdpdGhDcmVkZW50aWFscywgYWJvcnRDb250cm9sbGVyKSB7XG5cdCAgcmV0dXJuIHtcblx0ICAgIG1ldGhvZDogXCJHRVRcIixcblx0ICAgIGhlYWRlcnMsXG5cdCAgICBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwsXG5cdCAgICBtb2RlOiBcImNvcnNcIixcblx0ICAgIGNyZWRlbnRpYWxzOiB3aXRoQ3JlZGVudGlhbHMgPyBcImluY2x1ZGVcIiA6IFwic2FtZS1vcmlnaW5cIixcblx0ICAgIHJlZGlyZWN0OiBcImZvbGxvd1wiXG5cdCAgfTtcblx0fVxuXHRmdW5jdGlvbiBjcmVhdGVIZWFkZXJzKGh0dHBIZWFkZXJzKSB7XG5cdCAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG5cdCAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBodHRwSGVhZGVycykge1xuXHQgICAgY29uc3QgdmFsdWUgPSBodHRwSGVhZGVyc1twcm9wZXJ0eV07XG5cdCAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICBjb250aW51ZTtcblx0ICAgIH1cblx0ICAgIGhlYWRlcnMuYXBwZW5kKHByb3BlcnR5LCB2YWx1ZSk7XG5cdCAgfVxuXHQgIHJldHVybiBoZWFkZXJzO1xuXHR9XG5cdGZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKHZhbCkge1xuXHQgIGlmICh2YWwgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG5cdCAgICByZXR1cm4gdmFsLmJ1ZmZlcjtcblx0ICB9XG5cdCAgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG5cdCAgICByZXR1cm4gdmFsO1xuXHQgIH1cblx0ICAoMCwgX3V0aWwud2FybikoYGdldEFycmF5QnVmZmVyIC0gdW5leHBlY3RlZCBkYXRhIGZvcm1hdDogJHt2YWx9YCk7XG5cdCAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbCkuYnVmZmVyO1xuXHR9XG5cdGNsYXNzIFBERkZldGNoU3RyZWFtIHtcblx0ICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHtcblx0ICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgdGhpcy5pc0h0dHAgPSAvXmh0dHBzPzovaS50ZXN0KHNvdXJjZS51cmwpO1xuXHQgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIHNvdXJjZS5odHRwSGVhZGVycyB8fCB7fTtcblx0ICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbnVsbDtcblx0ICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMgPSBbXTtcblx0ICB9XG5cdCAgZ2V0IF9wcm9ncmVzc2l2ZURhdGFMZW5ndGgoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/Ll9sb2FkZWQgPz8gMDtcblx0ICB9XG5cdCAgZ2V0RnVsbFJlYWRlcigpIHtcblx0ICAgICgwLCBfdXRpbC5hc3NlcnQpKCF0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciwgXCJQREZGZXRjaFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcblx0ICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gbmV3IFBERkZldGNoU3RyZWFtUmVhZGVyKHRoaXMpO1xuXHQgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyO1xuXHQgIH1cblx0ICBnZXRSYW5nZVJlYWRlcihiZWdpbiwgZW5kKSB7XG5cdCAgICBpZiAoZW5kIDw9IHRoaXMuX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCkge1xuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHJlYWRlciA9IG5ldyBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIGJlZ2luLCBlbmQpO1xuXHQgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7XG5cdCAgICByZXR1cm4gcmVhZGVyO1xuXHQgIH1cblx0ICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcblx0ICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwocmVhc29uKTtcblx0ICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkpIHtcblx0ICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRleHBvcnRzLlBERkZldGNoU3RyZWFtID0gUERGRmV0Y2hTdHJlYW07XG5cdGNsYXNzIFBERkZldGNoU3RyZWFtUmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcblx0ICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcblx0ICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG5cdCAgICB0aGlzLl9sb2FkZWQgPSAwO1xuXHQgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuXHQgICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcblx0ICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG5cdCAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblx0ICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuXHQgICAgdGhpcy5fcmFuZ2VDaHVua1NpemUgPSBzb3VyY2UucmFuZ2VDaHVua1NpemU7XG5cdCAgICBpZiAoIXRoaXMuX3JhbmdlQ2h1bmtTaXplICYmICF0aGlzLl9kaXNhYmxlUmFuZ2UpIHtcblx0ICAgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblx0ICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlU3RyZWFtO1xuXHQgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVJhbmdlO1xuXHQgICAgdGhpcy5faGVhZGVycyA9IGNyZWF0ZUhlYWRlcnModGhpcy5fc3RyZWFtLmh0dHBIZWFkZXJzKTtcblx0ICAgIGNvbnN0IHVybCA9IHNvdXJjZS51cmw7XG5cdCAgICBmZXRjaCh1cmwsIGNyZWF0ZUZldGNoT3B0aW9ucyh0aGlzLl9oZWFkZXJzLCB0aGlzLl93aXRoQ3JlZGVudGlhbHMsIHRoaXMuX2Fib3J0Q29udHJvbGxlcikpLnRoZW4ocmVzcG9uc2UgPT4ge1xuXHQgICAgICBpZiAoISgwLCBfbmV0d29ya191dGlscy52YWxpZGF0ZVJlc3BvbnNlU3RhdHVzKShyZXNwb25zZS5zdGF0dXMpKSB7XG5cdCAgICAgICAgdGhyb3cgKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHJlc3BvbnNlLnN0YXR1cywgdXJsKTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl9yZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuXHQgICAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmhlYWRlcnMuZ2V0KG5hbWUpO1xuXHQgICAgICB9O1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgYWxsb3dSYW5nZVJlcXVlc3RzLFxuXHQgICAgICAgIHN1Z2dlc3RlZExlbmd0aFxuXHQgICAgICB9ID0gKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7XG5cdCAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXIsXG5cdCAgICAgICAgaXNIdHRwOiB0aGlzLl9zdHJlYW0uaXNIdHRwLFxuXHQgICAgICAgIHJhbmdlQ2h1bmtTaXplOiB0aGlzLl9yYW5nZUNodW5rU2l6ZSxcblx0ICAgICAgICBkaXNhYmxlUmFuZ2U6IHRoaXMuX2Rpc2FibGVSYW5nZVxuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IGFsbG93UmFuZ2VSZXF1ZXN0cztcblx0ICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN1Z2dlc3RlZExlbmd0aCB8fCB0aGlzLl9jb250ZW50TGVuZ3RoO1xuXHQgICAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG5cdCAgICAgIGlmICghdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCkge1xuXHQgICAgICAgIHRoaXMuY2FuY2VsKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbihcIlN0cmVhbWluZyBpcyBkaXNhYmxlZC5cIikpO1xuXHQgICAgICB9XG5cdCAgICB9KS5jYXRjaCh0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5yZWplY3QpO1xuXHQgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcblx0ICB9XG5cdCAgZ2V0IGhlYWRlcnNSZWFkeSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBnZXQgZmlsZW5hbWUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fZmlsZW5hbWU7XG5cdCAgfVxuXHQgIGdldCBjb250ZW50TGVuZ3RoKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG5cdCAgfVxuXHQgIGdldCBpc1JhbmdlU3VwcG9ydGVkKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQ7XG5cdCAgfVxuXHQgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcblx0ICB9XG5cdCAgYXN5bmMgcmVhZCgpIHtcblx0ICAgIGF3YWl0IHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHZhbHVlLFxuXHQgICAgICBkb25lXG5cdCAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcblx0ICAgIGlmIChkb25lKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdmFsdWUsXG5cdCAgICAgICAgZG9uZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG5cdCAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkLFxuXHQgICAgICB0b3RhbDogdGhpcy5fY29udGVudExlbmd0aFxuXHQgICAgfSk7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWx1ZTogZ2V0QXJyYXlCdWZmZXIodmFsdWUpLFxuXHQgICAgICBkb25lOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9XG5cdCAgY2FuY2VsKHJlYXNvbikge1xuXHQgICAgdGhpcy5fcmVhZGVyPy5jYW5jZWwocmVhc29uKTtcblx0ICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBQREZGZXRjaFN0cmVhbVJhbmdlUmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihzdHJlYW0sIGJlZ2luLCBlbmQpIHtcblx0ICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcblx0ICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG5cdCAgICB0aGlzLl9sb2FkZWQgPSAwO1xuXHQgICAgY29uc3Qgc291cmNlID0gc3RyZWFtLnNvdXJjZTtcblx0ICAgIHRoaXMuX3dpdGhDcmVkZW50aWFscyA9IHNvdXJjZS53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG5cdCAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG5cdCAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cdCAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpO1xuXHQgICAgdGhpcy5faGVhZGVycy5hcHBlbmQoXCJSYW5nZVwiLCBgYnl0ZXM9JHtiZWdpbn0tJHtlbmQgLSAxfWApO1xuXHQgICAgY29uc3QgdXJsID0gc291cmNlLnVybDtcblx0ICAgIGZldGNoKHVybCwgY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsIHRoaXMuX3dpdGhDcmVkZW50aWFscywgdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbihyZXNwb25zZSA9PiB7XG5cdCAgICAgIGlmICghKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHJlc3BvbnNlLnN0YXR1cykpIHtcblx0ICAgICAgICB0aHJvdyAoMCwgX25ldHdvcmtfdXRpbHMuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikocmVzcG9uc2Uuc3RhdHVzLCB1cmwpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgICAgdGhpcy5fcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcblx0ICAgIH0pLmNhdGNoKHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlamVjdCk7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuXHQgIH1cblx0ICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG5cdCAgfVxuXHQgIGFzeW5jIHJlYWQoKSB7XG5cdCAgICBhd2FpdCB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICB2YWx1ZSxcblx0ICAgICAgZG9uZVxuXHQgICAgfSA9IGF3YWl0IHRoaXMuX3JlYWRlci5yZWFkKCk7XG5cdCAgICBpZiAoZG9uZSkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHZhbHVlLFxuXHQgICAgICAgIGRvbmVcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2xvYWRlZCArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuXHQgICAgdGhpcy5vblByb2dyZXNzPy4oe1xuXHQgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZFxuXHQgICAgfSk7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWx1ZTogZ2V0QXJyYXlCdWZmZXIodmFsdWUpLFxuXHQgICAgICBkb25lOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9XG5cdCAgY2FuY2VsKHJlYXNvbikge1xuXHQgICAgdGhpcy5fcmVhZGVyPy5jYW5jZWwocmVhc29uKTtcblx0ICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuXHQgIH1cblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiAyNiAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuVGV4dExheWVyUmVuZGVyVGFzayA9IHZvaWQgMDtcblx0ZXhwb3J0cy5yZW5kZXJUZXh0TGF5ZXIgPSByZW5kZXJUZXh0TGF5ZXI7XG5cdGV4cG9ydHMudXBkYXRlVGV4dExheWVyID0gdXBkYXRlVGV4dExheWVyO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHRjb25zdCBNQVhfVEVYVF9ESVZTX1RPX1JFTkRFUiA9IDEwMDAwMDtcblx0Y29uc3QgREVGQVVMVF9GT05UX1NJWkUgPSAzMDtcblx0Y29uc3QgREVGQVVMVF9GT05UX0FTQ0VOVCA9IDAuODtcblx0Y29uc3QgYXNjZW50Q2FjaGUgPSBuZXcgTWFwKCk7XG5cdGZ1bmN0aW9uIGdldEN0eChzaXplLCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkge1xuXHQgIGxldCBjdHg7XG5cdCAgaWYgKGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkICYmIF91dGlsLkZlYXR1cmVUZXN0LmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7XG5cdCAgICBjdHggPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKHNpemUsIHNpemUpLmdldENvbnRleHQoXCIyZFwiLCB7XG5cdCAgICAgIGFscGhhOiBmYWxzZVxuXHQgICAgfSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG5cdCAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gc2l6ZTtcblx0ICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiwge1xuXHQgICAgICBhbHBoYTogZmFsc2Vcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZXR1cm4gY3R4O1xuXHR9XG5cdGZ1bmN0aW9uIGdldEFzY2VudChmb250RmFtaWx5LCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCkge1xuXHQgIGNvbnN0IGNhY2hlZEFzY2VudCA9IGFzY2VudENhY2hlLmdldChmb250RmFtaWx5KTtcblx0ICBpZiAoY2FjaGVkQXNjZW50KSB7XG5cdCAgICByZXR1cm4gY2FjaGVkQXNjZW50O1xuXHQgIH1cblx0ICBjb25zdCBjdHggPSBnZXRDdHgoREVGQVVMVF9GT05UX1NJWkUsIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTtcblx0ICBjdHguZm9udCA9IGAke0RFRkFVTFRfRk9OVF9TSVpFfXB4ICR7Zm9udEZhbWlseX1gO1xuXHQgIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQoXCJcIik7XG5cdCAgbGV0IGFzY2VudCA9IG1ldHJpY3MuZm9udEJvdW5kaW5nQm94QXNjZW50O1xuXHQgIGxldCBkZXNjZW50ID0gTWF0aC5hYnMobWV0cmljcy5mb250Qm91bmRpbmdCb3hEZXNjZW50KTtcblx0ICBpZiAoYXNjZW50KSB7XG5cdCAgICBjb25zdCByYXRpbyA9IGFzY2VudCAvIChhc2NlbnQgKyBkZXNjZW50KTtcblx0ICAgIGFzY2VudENhY2hlLnNldChmb250RmFtaWx5LCByYXRpbyk7XG5cdCAgICBjdHguY2FudmFzLndpZHRoID0gY3R4LmNhbnZhcy5oZWlnaHQgPSAwO1xuXHQgICAgcmV0dXJuIHJhdGlvO1xuXHQgIH1cblx0ICBjdHguc3Ryb2tlU3R5bGUgPSBcInJlZFwiO1xuXHQgIGN0eC5jbGVhclJlY3QoMCwgMCwgREVGQVVMVF9GT05UX1NJWkUsIERFRkFVTFRfRk9OVF9TSVpFKTtcblx0ICBjdHguc3Ryb2tlVGV4dChcImdcIiwgMCwgMCk7XG5cdCAgbGV0IHBpeGVscyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgREVGQVVMVF9GT05UX1NJWkUsIERFRkFVTFRfRk9OVF9TSVpFKS5kYXRhO1xuXHQgIGRlc2NlbnQgPSAwO1xuXHQgIGZvciAobGV0IGkgPSBwaXhlbHMubGVuZ3RoIC0gMSAtIDM7IGkgPj0gMDsgaSAtPSA0KSB7XG5cdCAgICBpZiAocGl4ZWxzW2ldID4gMCkge1xuXHQgICAgICBkZXNjZW50ID0gTWF0aC5jZWlsKGkgLyA0IC8gREVGQVVMVF9GT05UX1NJWkUpO1xuXHQgICAgICBicmVhaztcblx0ICAgIH1cblx0ICB9XG5cdCAgY3R4LmNsZWFyUmVjdCgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpO1xuXHQgIGN0eC5zdHJva2VUZXh0KFwiQVwiLCAwLCBERUZBVUxUX0ZPTlRfU0laRSk7XG5cdCAgcGl4ZWxzID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpLmRhdGE7XG5cdCAgYXNjZW50ID0gMDtcblx0ICBmb3IgKGxldCBpID0gMCwgaWkgPSBwaXhlbHMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNCkge1xuXHQgICAgaWYgKHBpeGVsc1tpXSA+IDApIHtcblx0ICAgICAgYXNjZW50ID0gREVGQVVMVF9GT05UX1NJWkUgLSBNYXRoLmZsb29yKGkgLyA0IC8gREVGQVVMVF9GT05UX1NJWkUpO1xuXHQgICAgICBicmVhaztcblx0ICAgIH1cblx0ICB9XG5cdCAgY3R4LmNhbnZhcy53aWR0aCA9IGN0eC5jYW52YXMuaGVpZ2h0ID0gMDtcblx0ICBpZiAoYXNjZW50KSB7XG5cdCAgICBjb25zdCByYXRpbyA9IGFzY2VudCAvIChhc2NlbnQgKyBkZXNjZW50KTtcblx0ICAgIGFzY2VudENhY2hlLnNldChmb250RmFtaWx5LCByYXRpbyk7XG5cdCAgICByZXR1cm4gcmF0aW87XG5cdCAgfVxuXHQgIGFzY2VudENhY2hlLnNldChmb250RmFtaWx5LCBERUZBVUxUX0ZPTlRfQVNDRU5UKTtcblx0ICByZXR1cm4gREVGQVVMVF9GT05UX0FTQ0VOVDtcblx0fVxuXHRmdW5jdGlvbiBhcHBlbmRUZXh0KHRhc2ssIGdlb20sIHN0eWxlcykge1xuXHQgIGNvbnN0IHRleHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcblx0ICBjb25zdCB0ZXh0RGl2UHJvcGVydGllcyA9IHtcblx0ICAgIGFuZ2xlOiAwLFxuXHQgICAgY2FudmFzV2lkdGg6IDAsXG5cdCAgICBoYXNUZXh0OiBnZW9tLnN0ciAhPT0gXCJcIixcblx0ICAgIGhhc0VPTDogZ2VvbS5oYXNFT0wsXG5cdCAgICBmb250U2l6ZTogMFxuXHQgIH07XG5cdCAgdGFzay5fdGV4dERpdnMucHVzaCh0ZXh0RGl2KTtcblx0ICBjb25zdCB0eCA9IF91dGlsLlV0aWwudHJhbnNmb3JtKHRhc2suX3RyYW5zZm9ybSwgZ2VvbS50cmFuc2Zvcm0pO1xuXHQgIGxldCBhbmdsZSA9IE1hdGguYXRhbjIodHhbMV0sIHR4WzBdKTtcblx0ICBjb25zdCBzdHlsZSA9IHN0eWxlc1tnZW9tLmZvbnROYW1lXTtcblx0ICBpZiAoc3R5bGUudmVydGljYWwpIHtcblx0ICAgIGFuZ2xlICs9IE1hdGguUEkgLyAyO1xuXHQgIH1cblx0ICBjb25zdCBmb250SGVpZ2h0ID0gTWF0aC5oeXBvdCh0eFsyXSwgdHhbM10pO1xuXHQgIGNvbnN0IGZvbnRBc2NlbnQgPSBmb250SGVpZ2h0ICogZ2V0QXNjZW50KHN0eWxlLmZvbnRGYW1pbHksIHRhc2suX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTtcblx0ICBsZXQgbGVmdCwgdG9wO1xuXHQgIGlmIChhbmdsZSA9PT0gMCkge1xuXHQgICAgbGVmdCA9IHR4WzRdO1xuXHQgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50O1xuXHQgIH0gZWxzZSB7XG5cdCAgICBsZWZ0ID0gdHhbNF0gKyBmb250QXNjZW50ICogTWF0aC5zaW4oYW5nbGUpO1xuXHQgICAgdG9wID0gdHhbNV0gLSBmb250QXNjZW50ICogTWF0aC5jb3MoYW5nbGUpO1xuXHQgIH1cblx0ICBjb25zdCBzY2FsZUZhY3RvclN0ciA9IFwiY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpKlwiO1xuXHQgIGNvbnN0IGRpdlN0eWxlID0gdGV4dERpdi5zdHlsZTtcblx0ICBpZiAodGFzay5fY29udGFpbmVyID09PSB0YXNrLl9yb290Q29udGFpbmVyKSB7XG5cdCAgICBkaXZTdHlsZS5sZWZ0ID0gYCR7KDEwMCAqIGxlZnQgLyB0YXNrLl9wYWdlV2lkdGgpLnRvRml4ZWQoMil9JWA7XG5cdCAgICBkaXZTdHlsZS50b3AgPSBgJHsoMTAwICogdG9wIC8gdGFzay5fcGFnZUhlaWdodCkudG9GaXhlZCgyKX0lYDtcblx0ICB9IGVsc2Uge1xuXHQgICAgZGl2U3R5bGUubGVmdCA9IGAke3NjYWxlRmFjdG9yU3RyfSR7bGVmdC50b0ZpeGVkKDIpfXB4KWA7XG5cdCAgICBkaXZTdHlsZS50b3AgPSBgJHtzY2FsZUZhY3RvclN0cn0ke3RvcC50b0ZpeGVkKDIpfXB4KWA7XG5cdCAgfVxuXHQgIGRpdlN0eWxlLmZvbnRTaXplID0gYCR7c2NhbGVGYWN0b3JTdHJ9JHtmb250SGVpZ2h0LnRvRml4ZWQoMil9cHgpYDtcblx0ICBkaXZTdHlsZS5mb250RmFtaWx5ID0gc3R5bGUuZm9udEZhbWlseTtcblx0ICB0ZXh0RGl2UHJvcGVydGllcy5mb250U2l6ZSA9IGZvbnRIZWlnaHQ7XG5cdCAgdGV4dERpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicHJlc2VudGF0aW9uXCIpO1xuXHQgIHRleHREaXYudGV4dENvbnRlbnQgPSBnZW9tLnN0cjtcblx0ICB0ZXh0RGl2LmRpciA9IGdlb20uZGlyO1xuXHQgIGlmICh0YXNrLl9mb250SW5zcGVjdG9yRW5hYmxlZCkge1xuXHQgICAgdGV4dERpdi5kYXRhc2V0LmZvbnROYW1lID0gZ2VvbS5mb250TmFtZTtcblx0ICB9XG5cdCAgaWYgKGFuZ2xlICE9PSAwKSB7XG5cdCAgICB0ZXh0RGl2UHJvcGVydGllcy5hbmdsZSA9IGFuZ2xlICogKDE4MCAvIE1hdGguUEkpO1xuXHQgIH1cblx0ICBsZXQgc2hvdWxkU2NhbGVUZXh0ID0gZmFsc2U7XG5cdCAgaWYgKGdlb20uc3RyLmxlbmd0aCA+IDEpIHtcblx0ICAgIHNob3VsZFNjYWxlVGV4dCA9IHRydWU7XG5cdCAgfSBlbHNlIGlmIChnZW9tLnN0ciAhPT0gXCIgXCIgJiYgZ2VvbS50cmFuc2Zvcm1bMF0gIT09IGdlb20udHJhbnNmb3JtWzNdKSB7XG5cdCAgICBjb25zdCBhYnNTY2FsZVggPSBNYXRoLmFicyhnZW9tLnRyYW5zZm9ybVswXSksXG5cdCAgICAgIGFic1NjYWxlWSA9IE1hdGguYWJzKGdlb20udHJhbnNmb3JtWzNdKTtcblx0ICAgIGlmIChhYnNTY2FsZVggIT09IGFic1NjYWxlWSAmJiBNYXRoLm1heChhYnNTY2FsZVgsIGFic1NjYWxlWSkgLyBNYXRoLm1pbihhYnNTY2FsZVgsIGFic1NjYWxlWSkgPiAxLjUpIHtcblx0ICAgICAgc2hvdWxkU2NhbGVUZXh0ID0gdHJ1ZTtcblx0ICAgIH1cblx0ICB9XG5cdCAgaWYgKHNob3VsZFNjYWxlVGV4dCkge1xuXHQgICAgdGV4dERpdlByb3BlcnRpZXMuY2FudmFzV2lkdGggPSBzdHlsZS52ZXJ0aWNhbCA/IGdlb20uaGVpZ2h0IDogZ2VvbS53aWR0aDtcblx0ICB9XG5cdCAgdGFzay5fdGV4dERpdlByb3BlcnRpZXMuc2V0KHRleHREaXYsIHRleHREaXZQcm9wZXJ0aWVzKTtcblx0ICBpZiAodGFzay5faXNSZWFkYWJsZVN0cmVhbSkge1xuXHQgICAgdGFzay5fbGF5b3V0VGV4dCh0ZXh0RGl2KTtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gbGF5b3V0KHBhcmFtcykge1xuXHQgIGNvbnN0IHtcblx0ICAgIGRpdixcblx0ICAgIHNjYWxlLFxuXHQgICAgcHJvcGVydGllcyxcblx0ICAgIGN0eCxcblx0ICAgIHByZXZGb250U2l6ZSxcblx0ICAgIHByZXZGb250RmFtaWx5XG5cdCAgfSA9IHBhcmFtcztcblx0ICBjb25zdCB7XG5cdCAgICBzdHlsZVxuXHQgIH0gPSBkaXY7XG5cdCAgbGV0IHRyYW5zZm9ybSA9IFwiXCI7XG5cdCAgaWYgKHByb3BlcnRpZXMuY2FudmFzV2lkdGggIT09IDAgJiYgcHJvcGVydGllcy5oYXNUZXh0KSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGZvbnRGYW1pbHlcblx0ICAgIH0gPSBzdHlsZTtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgY2FudmFzV2lkdGgsXG5cdCAgICAgIGZvbnRTaXplXG5cdCAgICB9ID0gcHJvcGVydGllcztcblx0ICAgIGlmIChwcmV2Rm9udFNpemUgIT09IGZvbnRTaXplIHx8IHByZXZGb250RmFtaWx5ICE9PSBmb250RmFtaWx5KSB7XG5cdCAgICAgIGN0eC5mb250ID0gYCR7Zm9udFNpemUgKiBzY2FsZX1weCAke2ZvbnRGYW1pbHl9YDtcblx0ICAgICAgcGFyYW1zLnByZXZGb250U2l6ZSA9IGZvbnRTaXplO1xuXHQgICAgICBwYXJhbXMucHJldkZvbnRGYW1pbHkgPSBmb250RmFtaWx5O1xuXHQgICAgfVxuXHQgICAgY29uc3Qge1xuXHQgICAgICB3aWR0aFxuXHQgICAgfSA9IGN0eC5tZWFzdXJlVGV4dChkaXYudGV4dENvbnRlbnQpO1xuXHQgICAgaWYgKHdpZHRoID4gMCkge1xuXHQgICAgICB0cmFuc2Zvcm0gPSBgc2NhbGVYKCR7Y2FudmFzV2lkdGggKiBzY2FsZSAvIHdpZHRofSlgO1xuXHQgICAgfVxuXHQgIH1cblx0ICBpZiAocHJvcGVydGllcy5hbmdsZSAhPT0gMCkge1xuXHQgICAgdHJhbnNmb3JtID0gYHJvdGF0ZSgke3Byb3BlcnRpZXMuYW5nbGV9ZGVnKSAke3RyYW5zZm9ybX1gO1xuXHQgIH1cblx0ICBpZiAodHJhbnNmb3JtLmxlbmd0aCA+IDApIHtcblx0ICAgIHN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gcmVuZGVyKHRhc2spIHtcblx0ICBpZiAodGFzay5fY2FuY2VsZWQpIHtcblx0ICAgIHJldHVybjtcblx0ICB9XG5cdCAgY29uc3QgdGV4dERpdnMgPSB0YXNrLl90ZXh0RGl2cztcblx0ICBjb25zdCBjYXBhYmlsaXR5ID0gdGFzay5fY2FwYWJpbGl0eTtcblx0ICBjb25zdCB0ZXh0RGl2c0xlbmd0aCA9IHRleHREaXZzLmxlbmd0aDtcblx0ICBpZiAodGV4dERpdnNMZW5ndGggPiBNQVhfVEVYVF9ESVZTX1RPX1JFTkRFUikge1xuXHQgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICByZXR1cm47XG5cdCAgfVxuXHQgIGlmICghdGFzay5faXNSZWFkYWJsZVN0cmVhbSkge1xuXHQgICAgZm9yIChjb25zdCB0ZXh0RGl2IG9mIHRleHREaXZzKSB7XG5cdCAgICAgIHRhc2suX2xheW91dFRleHQodGV4dERpdik7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHR9XG5cdGNsYXNzIFRleHRMYXllclJlbmRlclRhc2sge1xuXHQgIGNvbnN0cnVjdG9yKHtcblx0ICAgIHRleHRDb250ZW50U291cmNlLFxuXHQgICAgY29udGFpbmVyLFxuXHQgICAgdmlld3BvcnQsXG5cdCAgICB0ZXh0RGl2cyxcblx0ICAgIHRleHREaXZQcm9wZXJ0aWVzLFxuXHQgICAgdGV4dENvbnRlbnRJdGVtc1N0cixcblx0ICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkXG5cdCAgfSkge1xuXHQgICAgdGhpcy5fdGV4dENvbnRlbnRTb3VyY2UgPSB0ZXh0Q29udGVudFNvdXJjZTtcblx0ICAgIHRoaXMuX2lzUmVhZGFibGVTdHJlYW0gPSB0ZXh0Q29udGVudFNvdXJjZSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtO1xuXHQgICAgdGhpcy5fY29udGFpbmVyID0gdGhpcy5fcm9vdENvbnRhaW5lciA9IGNvbnRhaW5lcjtcblx0ICAgIHRoaXMuX3RleHREaXZzID0gdGV4dERpdnMgfHwgW107XG5cdCAgICB0aGlzLl90ZXh0Q29udGVudEl0ZW1zU3RyID0gdGV4dENvbnRlbnRJdGVtc1N0ciB8fCBbXTtcblx0ICAgIHRoaXMuX2lzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID0gaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQ7XG5cdCAgICB0aGlzLl9mb250SW5zcGVjdG9yRW5hYmxlZCA9ICEhZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yPy5lbmFibGVkO1xuXHQgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcblx0ICAgIHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzID0gdGV4dERpdlByb3BlcnRpZXMgfHwgbmV3IFdlYWtNYXAoKTtcblx0ICAgIHRoaXMuX2NhbmNlbGVkID0gZmFsc2U7XG5cdCAgICB0aGlzLl9jYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zID0ge1xuXHQgICAgICBwcmV2Rm9udFNpemU6IG51bGwsXG5cdCAgICAgIHByZXZGb250RmFtaWx5OiBudWxsLFxuXHQgICAgICBkaXY6IG51bGwsXG5cdCAgICAgIHNjYWxlOiB2aWV3cG9ydC5zY2FsZSAqIChnbG9iYWxUaGlzLmRldmljZVBpeGVsUmF0aW8gfHwgMSksXG5cdCAgICAgIHByb3BlcnRpZXM6IG51bGwsXG5cdCAgICAgIGN0eDogZ2V0Q3R4KDAsIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKVxuXHQgICAgfTtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgcGFnZVdpZHRoLFxuXHQgICAgICBwYWdlSGVpZ2h0LFxuXHQgICAgICBwYWdlWCxcblx0ICAgICAgcGFnZVlcblx0ICAgIH0gPSB2aWV3cG9ydC5yYXdEaW1zO1xuXHQgICAgdGhpcy5fdHJhbnNmb3JtID0gWzEsIDAsIDAsIC0xLCAtcGFnZVgsIHBhZ2VZICsgcGFnZUhlaWdodF07XG5cdCAgICB0aGlzLl9wYWdlV2lkdGggPSBwYWdlV2lkdGg7XG5cdCAgICB0aGlzLl9wYWdlSGVpZ2h0ID0gcGFnZUhlaWdodDtcblx0ICAgICgwLCBfZGlzcGxheV91dGlscy5zZXRMYXllckRpbWVuc2lvbnMpKGNvbnRhaW5lciwgdmlld3BvcnQpO1xuXHQgICAgdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuXHQgICAgICB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zID0gbnVsbDtcblx0ICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcblx0ICB9XG5cdCAgZ2V0IHByb21pc2UoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fY2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBjYW5jZWwoKSB7XG5cdCAgICB0aGlzLl9jYW5jZWxlZCA9IHRydWU7XG5cdCAgICBpZiAodGhpcy5fcmVhZGVyKSB7XG5cdCAgICAgIHRoaXMuX3JlYWRlci5jYW5jZWwobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKFwiVGV4dExheWVyIHRhc2sgY2FuY2VsbGVkLlwiKSkuY2F0Y2goKCkgPT4ge30pO1xuXHQgICAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fY2FwYWJpbGl0eS5yZWplY3QobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKFwiVGV4dExheWVyIHRhc2sgY2FuY2VsbGVkLlwiKSk7XG5cdCAgfVxuXHQgIF9wcm9jZXNzSXRlbXMoaXRlbXMsIHN0eWxlQ2FjaGUpIHtcblx0ICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuXHQgICAgICBpZiAoaXRlbS5zdHIgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwiYmVnaW5NYXJrZWRDb250ZW50UHJvcHNcIiB8fCBpdGVtLnR5cGUgPT09IFwiYmVnaW5NYXJrZWRDb250ZW50XCIpIHtcblx0ICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2NvbnRhaW5lcjtcblx0ICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHQgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJtYXJrZWRDb250ZW50XCIpO1xuXHQgICAgICAgICAgaWYgKGl0ZW0uaWQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImlkXCIsIGAke2l0ZW0uaWR9YCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBwYXJlbnQuYXBwZW5kKHRoaXMuX2NvbnRhaW5lcik7XG5cdCAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiZW5kTWFya2VkQ29udGVudFwiKSB7XG5cdCAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fdGV4dENvbnRlbnRJdGVtc1N0ci5wdXNoKGl0ZW0uc3RyKTtcblx0ICAgICAgYXBwZW5kVGV4dCh0aGlzLCBpdGVtLCBzdHlsZUNhY2hlKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX2xheW91dFRleHQodGV4dERpdikge1xuXHQgICAgY29uc3QgdGV4dERpdlByb3BlcnRpZXMgPSB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zLnByb3BlcnRpZXMgPSB0aGlzLl90ZXh0RGl2UHJvcGVydGllcy5nZXQodGV4dERpdik7XG5cdCAgICB0aGlzLl9sYXlvdXRUZXh0UGFyYW1zLmRpdiA9IHRleHREaXY7XG5cdCAgICBsYXlvdXQodGhpcy5fbGF5b3V0VGV4dFBhcmFtcyk7XG5cdCAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuaGFzVGV4dCkge1xuXHQgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kKHRleHREaXYpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRleHREaXZQcm9wZXJ0aWVzLmhhc0VPTCkge1xuXHQgICAgICBjb25zdCBiciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKTtcblx0ICAgICAgYnIuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInByZXNlbnRhdGlvblwiKTtcblx0ICAgICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZChicik7XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9yZW5kZXIoKSB7XG5cdCAgICBjb25zdCBjYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICBsZXQgc3R5bGVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgICBpZiAodGhpcy5faXNSZWFkYWJsZVN0cmVhbSkge1xuXHQgICAgICBjb25zdCBwdW1wID0gKCkgPT4ge1xuXHQgICAgICAgIHRoaXMuX3JlYWRlci5yZWFkKCkudGhlbigoe1xuXHQgICAgICAgICAgdmFsdWUsXG5cdCAgICAgICAgICBkb25lXG5cdCAgICAgICAgfSkgPT4ge1xuXHQgICAgICAgICAgaWYgKGRvbmUpIHtcblx0ICAgICAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3R5bGVDYWNoZSwgdmFsdWUuc3R5bGVzKTtcblx0ICAgICAgICAgIHRoaXMuX3Byb2Nlc3NJdGVtcyh2YWx1ZS5pdGVtcywgc3R5bGVDYWNoZSk7XG5cdCAgICAgICAgICBwdW1wKCk7XG5cdCAgICAgICAgfSwgY2FwYWJpbGl0eS5yZWplY3QpO1xuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLl9yZWFkZXIgPSB0aGlzLl90ZXh0Q29udGVudFNvdXJjZS5nZXRSZWFkZXIoKTtcblx0ICAgICAgcHVtcCgpO1xuXHQgICAgfSBlbHNlIGlmICh0aGlzLl90ZXh0Q29udGVudFNvdXJjZSkge1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgaXRlbXMsXG5cdCAgICAgICAgc3R5bGVzXG5cdCAgICAgIH0gPSB0aGlzLl90ZXh0Q29udGVudFNvdXJjZTtcblx0ICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKGl0ZW1zLCBzdHlsZXMpO1xuXHQgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcignTm8gXCJ0ZXh0Q29udGVudFNvdXJjZVwiIHBhcmFtZXRlciBzcGVjaWZpZWQuJyk7XG5cdCAgICB9XG5cdCAgICBjYXBhYmlsaXR5LnByb21pc2UudGhlbigoKSA9PiB7XG5cdCAgICAgIHN0eWxlQ2FjaGUgPSBudWxsO1xuXHQgICAgICByZW5kZXIodGhpcyk7XG5cdCAgICB9LCB0aGlzLl9jYXBhYmlsaXR5LnJlamVjdCk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuVGV4dExheWVyUmVuZGVyVGFzayA9IFRleHRMYXllclJlbmRlclRhc2s7XG5cdGZ1bmN0aW9uIHJlbmRlclRleHRMYXllcihwYXJhbXMpIHtcblx0ICBpZiAoIXBhcmFtcy50ZXh0Q29udGVudFNvdXJjZSAmJiAocGFyYW1zLnRleHRDb250ZW50IHx8IHBhcmFtcy50ZXh0Q29udGVudFN0cmVhbSkpIHtcblx0ICAgICgwLCBfZGlzcGxheV91dGlscy5kZXByZWNhdGVkKShcIlRoZSBUZXh0TGF5ZXJSZW5kZXIgYHRleHRDb250ZW50YC9gdGV4dENvbnRlbnRTdHJlYW1gIHBhcmFtZXRlcnMgXCIgKyBcIndpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBwbGVhc2UgdXNlIGB0ZXh0Q29udGVudFNvdXJjZWAgaW5zdGVhZC5cIik7XG5cdCAgICBwYXJhbXMudGV4dENvbnRlbnRTb3VyY2UgPSBwYXJhbXMudGV4dENvbnRlbnQgfHwgcGFyYW1zLnRleHRDb250ZW50U3RyZWFtO1xuXHQgIH1cblx0ICBjb25zdCB7XG5cdCAgICBjb250YWluZXIsXG5cdCAgICB2aWV3cG9ydFxuXHQgIH0gPSBwYXJhbXM7XG5cdCAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG5cdCAgY29uc3QgdmlzaWJpbGl0eSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmlsaXR5XCIpO1xuXHQgIGNvbnN0IHNjYWxlRmFjdG9yID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1zY2FsZS1mYWN0b3JcIikpO1xuXHQgIGlmICh2aXNpYmlsaXR5ID09PSBcInZpc2libGVcIiAmJiAoIXNjYWxlRmFjdG9yIHx8IE1hdGguYWJzKHNjYWxlRmFjdG9yIC0gdmlld3BvcnQuc2NhbGUpID4gMWUtNSkpIHtcblx0ICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgYC0tc2NhbGUtZmFjdG9yYCBDU1MtdmFyaWFibGUgbXVzdCBiZSBzZXQsIFwiICsgXCJ0byB0aGUgc2FtZSB2YWx1ZSBhcyBgdmlld3BvcnQuc2NhbGVgLCBcIiArIFwiZWl0aGVyIG9uIHRoZSBgY29udGFpbmVyYC1lbGVtZW50IGl0c2VsZiBvciBoaWdoZXIgdXAgaW4gdGhlIERPTS5cIik7XG5cdCAgfVxuXHQgIGNvbnN0IHRhc2sgPSBuZXcgVGV4dExheWVyUmVuZGVyVGFzayhwYXJhbXMpO1xuXHQgIHRhc2suX3JlbmRlcigpO1xuXHQgIHJldHVybiB0YXNrO1xuXHR9XG5cdGZ1bmN0aW9uIHVwZGF0ZVRleHRMYXllcih7XG5cdCAgY29udGFpbmVyLFxuXHQgIHZpZXdwb3J0LFxuXHQgIHRleHREaXZzLFxuXHQgIHRleHREaXZQcm9wZXJ0aWVzLFxuXHQgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkLFxuXHQgIG11c3RSb3RhdGUgPSB0cnVlLFxuXHQgIG11c3RSZXNjYWxlID0gdHJ1ZVxuXHR9KSB7XG5cdCAgaWYgKG11c3RSb3RhdGUpIHtcblx0ICAgICgwLCBfZGlzcGxheV91dGlscy5zZXRMYXllckRpbWVuc2lvbnMpKGNvbnRhaW5lciwge1xuXHQgICAgICByb3RhdGlvbjogdmlld3BvcnQucm90YXRpb25cblx0ICAgIH0pO1xuXHQgIH1cblx0ICBpZiAobXVzdFJlc2NhbGUpIHtcblx0ICAgIGNvbnN0IGN0eCA9IGdldEN0eCgwLCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCk7XG5cdCAgICBjb25zdCBzY2FsZSA9IHZpZXdwb3J0LnNjYWxlICogKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKTtcblx0ICAgIGNvbnN0IHBhcmFtcyA9IHtcblx0ICAgICAgcHJldkZvbnRTaXplOiBudWxsLFxuXHQgICAgICBwcmV2Rm9udEZhbWlseTogbnVsbCxcblx0ICAgICAgZGl2OiBudWxsLFxuXHQgICAgICBzY2FsZSxcblx0ICAgICAgcHJvcGVydGllczogbnVsbCxcblx0ICAgICAgY3R4XG5cdCAgICB9O1xuXHQgICAgZm9yIChjb25zdCBkaXYgb2YgdGV4dERpdnMpIHtcblx0ICAgICAgcGFyYW1zLnByb3BlcnRpZXMgPSB0ZXh0RGl2UHJvcGVydGllcy5nZXQoZGl2KTtcblx0ICAgICAgcGFyYW1zLmRpdiA9IGRpdjtcblx0ICAgICAgbGF5b3V0KHBhcmFtcyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cblx0LyoqKi8gfSksXG5cdC8qIDI3ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uRWRpdG9yTGF5ZXIgPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfdG9vbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpO1xuXHR2YXIgX2ZyZWV0ZXh0ID0gX193X3BkZmpzX3JlcXVpcmVfXygyOCk7XG5cdHZhciBfaW5rID0gX193X3BkZmpzX3JlcXVpcmVfXygyOSk7XG5cdHZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7XG5cdGNsYXNzIEFubm90YXRpb25FZGl0b3JMYXllciB7XG5cdCAgI2FjY2Vzc2liaWxpdHlNYW5hZ2VyO1xuXHQgICNhbGxvd0NsaWNrID0gZmFsc2U7XG5cdCAgI2JvdW5kUG9pbnRlcnVwID0gdGhpcy5wb2ludGVydXAuYmluZCh0aGlzKTtcblx0ICAjYm91bmRQb2ludGVyZG93biA9IHRoaXMucG9pbnRlcmRvd24uYmluZCh0aGlzKTtcblx0ICAjZWRpdG9ycyA9IG5ldyBNYXAoKTtcblx0ICAjaGFkUG9pbnRlckRvd24gPSBmYWxzZTtcblx0ICAjaXNDbGVhbmluZ1VwID0gZmFsc2U7XG5cdCAgI3VpTWFuYWdlcjtcblx0ICBzdGF0aWMgX2luaXRpYWxpemVkID0gZmFsc2U7XG5cdCAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuXHQgICAgaWYgKCFBbm5vdGF0aW9uRWRpdG9yTGF5ZXIuX2luaXRpYWxpemVkKSB7XG5cdCAgICAgIEFubm90YXRpb25FZGl0b3JMYXllci5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHQgICAgICBfZnJlZXRleHQuRnJlZVRleHRFZGl0b3IuaW5pdGlhbGl6ZShvcHRpb25zLmwxMG4pO1xuXHQgICAgICBfaW5rLklua0VkaXRvci5pbml0aWFsaXplKG9wdGlvbnMubDEwbik7XG5cdCAgICB9XG5cdCAgICBvcHRpb25zLnVpTWFuYWdlci5yZWdpc3RlckVkaXRvclR5cGVzKFtfZnJlZXRleHQuRnJlZVRleHRFZGl0b3IsIF9pbmsuSW5rRWRpdG9yXSk7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIgPSBvcHRpb25zLnVpTWFuYWdlcjtcblx0ICAgIHRoaXMucGFnZUluZGV4ID0gb3B0aW9ucy5wYWdlSW5kZXg7XG5cdCAgICB0aGlzLmRpdiA9IG9wdGlvbnMuZGl2O1xuXHQgICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBvcHRpb25zLmFjY2Vzc2liaWxpdHlNYW5hZ2VyO1xuXHQgICAgdGhpcy4jdWlNYW5hZ2VyLmFkZExheWVyKHRoaXMpO1xuXHQgIH1cblx0ICBnZXQgaXNFbXB0eSgpIHtcblx0ICAgIHJldHVybiB0aGlzLiNlZGl0b3JzLnNpemUgPT09IDA7XG5cdCAgfVxuXHQgIHVwZGF0ZVRvb2xiYXIobW9kZSkge1xuXHQgICAgdGhpcy4jdWlNYW5hZ2VyLnVwZGF0ZVRvb2xiYXIobW9kZSk7XG5cdCAgfVxuXHQgIHVwZGF0ZU1vZGUobW9kZSA9IHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkpIHtcblx0ICAgIHRoaXMuI2NsZWFudXAoKTtcblx0ICAgIGlmIChtb2RlID09PSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspIHtcblx0ICAgICAgdGhpcy5hZGRJbmtFZGl0b3JJZk5lZWRlZChmYWxzZSk7XG5cdCAgICAgIHRoaXMuZGlzYWJsZUNsaWNrKCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmVuYWJsZUNsaWNrKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIudW5zZWxlY3RBbGwoKTtcblx0ICAgIGlmIChtb2RlICE9PSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FKSB7XG5cdCAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJmcmVlVGV4dEVkaXRpbmdcIiwgbW9kZSA9PT0gX3V0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQpO1xuXHQgICAgICB0aGlzLmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiaW5rRWRpdGluZ1wiLCBtb2RlID09PSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspO1xuXHQgICAgICB0aGlzLmRpdi5oaWRkZW4gPSBmYWxzZTtcblx0ICAgIH1cblx0ICB9XG5cdCAgYWRkSW5rRWRpdG9ySWZOZWVkZWQoaXNDb21taXR0aW5nKSB7XG5cdCAgICBpZiAoIWlzQ29tbWl0dGluZyAmJiB0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpICE9PSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkspIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKCFpc0NvbW1pdHRpbmcpIHtcblx0ICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuXHQgICAgICAgIGlmIChlZGl0b3IuaXNFbXB0eSgpKSB7XG5cdCAgICAgICAgICBlZGl0b3Iuc2V0SW5CYWNrZ3JvdW5kKCk7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiNjcmVhdGVBbmRBZGROZXdFZGl0b3Ioe1xuXHQgICAgICBvZmZzZXRYOiAwLFxuXHQgICAgICBvZmZzZXRZOiAwXG5cdCAgICB9KTtcblx0ICAgIGVkaXRvci5zZXRJbkJhY2tncm91bmQoKTtcblx0ICB9XG5cdCAgc2V0RWRpdGluZ1N0YXRlKGlzRWRpdGluZykge1xuXHQgICAgdGhpcy4jdWlNYW5hZ2VyLnNldEVkaXRpbmdTdGF0ZShpc0VkaXRpbmcpO1xuXHQgIH1cblx0ICBhZGRDb21tYW5kcyhwYXJhbXMpIHtcblx0ICAgIHRoaXMuI3VpTWFuYWdlci5hZGRDb21tYW5kcyhwYXJhbXMpO1xuXHQgIH1cblx0ICBlbmFibGUoKSB7XG5cdCAgICB0aGlzLmRpdi5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJhdXRvXCI7XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG5cdCAgICAgIGVkaXRvci5lbmFibGVFZGl0aW5nKCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGRpc2FibGUoKSB7XG5cdCAgICB0aGlzLmRpdi5zdHlsZS5wb2ludGVyRXZlbnRzID0gXCJub25lXCI7XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG5cdCAgICAgIGVkaXRvci5kaXNhYmxlRWRpdGluZygpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jY2xlYW51cCgpO1xuXHQgICAgaWYgKHRoaXMuaXNFbXB0eSkge1xuXHQgICAgICB0aGlzLmRpdi5oaWRkZW4gPSB0cnVlO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzZXRBY3RpdmVFZGl0b3IoZWRpdG9yKSB7XG5cdCAgICBjb25zdCBjdXJyZW50QWN0aXZlID0gdGhpcy4jdWlNYW5hZ2VyLmdldEFjdGl2ZSgpO1xuXHQgICAgaWYgKGN1cnJlbnRBY3RpdmUgPT09IGVkaXRvcikge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIuc2V0QWN0aXZlRWRpdG9yKGVkaXRvcik7XG5cdCAgfVxuXHQgIGVuYWJsZUNsaWNrKCkge1xuXHQgICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kUG9pbnRlcmRvd24pO1xuXHQgICAgdGhpcy5kaXYuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZFBvaW50ZXJ1cCk7XG5cdCAgfVxuXHQgIGRpc2FibGVDbGljaygpIHtcblx0ICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCB0aGlzLiNib3VuZFBvaW50ZXJkb3duKTtcblx0ICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgdGhpcy4jYm91bmRQb2ludGVydXApO1xuXHQgIH1cblx0ICBhdHRhY2goZWRpdG9yKSB7XG5cdCAgICB0aGlzLiNlZGl0b3JzLnNldChlZGl0b3IuaWQsIGVkaXRvcik7XG5cdCAgfVxuXHQgIGRldGFjaChlZGl0b3IpIHtcblx0ICAgIHRoaXMuI2VkaXRvcnMuZGVsZXRlKGVkaXRvci5pZCk7XG5cdCAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ucmVtb3ZlUG9pbnRlckluVGV4dExheWVyKGVkaXRvci5jb250ZW50RGl2KTtcblx0ICB9XG5cdCAgcmVtb3ZlKGVkaXRvcikge1xuXHQgICAgdGhpcy4jdWlNYW5hZ2VyLnJlbW92ZUVkaXRvcihlZGl0b3IpO1xuXHQgICAgdGhpcy5kZXRhY2goZWRpdG9yKTtcblx0ICAgIGVkaXRvci5kaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHQgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cdCAgICAgIGVkaXRvci5kaXYuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdCAgICAgIGVkaXRvci5kaXYucmVtb3ZlKCk7XG5cdCAgICAgIGVkaXRvci5pc0F0dGFjaGVkVG9ET00gPSBmYWxzZTtcblx0ICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHkpIHtcblx0ICAgICAgICB0aGlzLiN1aU1hbmFnZXIuZm9jdXNNYWluQ29udGFpbmVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sIDApO1xuXHQgICAgaWYgKCF0aGlzLiNpc0NsZWFuaW5nVXApIHtcblx0ICAgICAgdGhpcy5hZGRJbmtFZGl0b3JJZk5lZWRlZChmYWxzZSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgICNjaGFuZ2VQYXJlbnQoZWRpdG9yKSB7XG5cdCAgICBpZiAoZWRpdG9yLnBhcmVudCA9PT0gdGhpcykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLmF0dGFjaChlZGl0b3IpO1xuXHQgICAgZWRpdG9yLnBhcmVudD8uZGV0YWNoKGVkaXRvcik7XG5cdCAgICBlZGl0b3Iuc2V0UGFyZW50KHRoaXMpO1xuXHQgICAgaWYgKGVkaXRvci5kaXYgJiYgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSkge1xuXHQgICAgICBlZGl0b3IuZGl2LnJlbW92ZSgpO1xuXHQgICAgICB0aGlzLmRpdi5hcHBlbmQoZWRpdG9yLmRpdik7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGFkZChlZGl0b3IpIHtcblx0ICAgIHRoaXMuI2NoYW5nZVBhcmVudChlZGl0b3IpO1xuXHQgICAgdGhpcy4jdWlNYW5hZ2VyLmFkZEVkaXRvcihlZGl0b3IpO1xuXHQgICAgdGhpcy5hdHRhY2goZWRpdG9yKTtcblx0ICAgIGlmICghZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSkge1xuXHQgICAgICBjb25zdCBkaXYgPSBlZGl0b3IucmVuZGVyKCk7XG5cdCAgICAgIHRoaXMuZGl2LmFwcGVuZChkaXYpO1xuXHQgICAgICBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NID0gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIHRoaXMubW92ZUVkaXRvckluRE9NKGVkaXRvcik7XG5cdCAgICBlZGl0b3Iub25jZUFkZGVkKCk7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZShlZGl0b3IpO1xuXHQgIH1cblx0ICBtb3ZlRWRpdG9ySW5ET00oZWRpdG9yKSB7XG5cdCAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ubW92ZUVsZW1lbnRJbkRPTSh0aGlzLmRpdiwgZWRpdG9yLmRpdiwgZWRpdG9yLmNvbnRlbnREaXYsIHRydWUpO1xuXHQgIH1cblx0ICBhZGRPclJlYnVpbGQoZWRpdG9yKSB7XG5cdCAgICBpZiAoZWRpdG9yLm5lZWRzVG9CZVJlYnVpbHQoKSkge1xuXHQgICAgICBlZGl0b3IucmVidWlsZCgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgYWRkQU5ld0VkaXRvcihlZGl0b3IpIHtcblx0ICAgIGNvbnN0IGNtZCA9ICgpID0+IHtcblx0ICAgICAgdGhpcy5hZGRPclJlYnVpbGQoZWRpdG9yKTtcblx0ICAgIH07XG5cdCAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuXHQgICAgICBlZGl0b3IucmVtb3ZlKCk7XG5cdCAgICB9O1xuXHQgICAgdGhpcy5hZGRDb21tYW5kcyh7XG5cdCAgICAgIGNtZCxcblx0ICAgICAgdW5kbyxcblx0ICAgICAgbXVzdEV4ZWM6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBhZGRVbmRvYWJsZUVkaXRvcihlZGl0b3IpIHtcblx0ICAgIGNvbnN0IGNtZCA9ICgpID0+IHtcblx0ICAgICAgdGhpcy5hZGRPclJlYnVpbGQoZWRpdG9yKTtcblx0ICAgIH07XG5cdCAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuXHQgICAgICBlZGl0b3IucmVtb3ZlKCk7XG5cdCAgICB9O1xuXHQgICAgdGhpcy5hZGRDb21tYW5kcyh7XG5cdCAgICAgIGNtZCxcblx0ICAgICAgdW5kbyxcblx0ICAgICAgbXVzdEV4ZWM6IGZhbHNlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0TmV4dElkKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI3VpTWFuYWdlci5nZXRJZCgpO1xuXHQgIH1cblx0ICAjY3JlYXRlTmV3RWRpdG9yKHBhcmFtcykge1xuXHQgICAgc3dpdGNoICh0aGlzLiN1aU1hbmFnZXIuZ2V0TW9kZSgpKSB7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBfZnJlZXRleHQuRnJlZVRleHRFZGl0b3IocGFyYW1zKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBfaW5rLklua0VkaXRvcihwYXJhbXMpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG51bGw7XG5cdCAgfVxuXHQgIGRlc2VyaWFsaXplKGRhdGEpIHtcblx0ICAgIHN3aXRjaCAoZGF0YS5hbm5vdGF0aW9uVHlwZSkge1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLkZSRUVURVhUOlxuXHQgICAgICAgIHJldHVybiBfZnJlZXRleHQuRnJlZVRleHRFZGl0b3IuZGVzZXJpYWxpemUoZGF0YSwgdGhpcywgdGhpcy4jdWlNYW5hZ2VyKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTks6XG5cdCAgICAgICAgcmV0dXJuIF9pbmsuSW5rRWRpdG9yLmRlc2VyaWFsaXplKGRhdGEsIHRoaXMsIHRoaXMuI3VpTWFuYWdlcik7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gbnVsbDtcblx0ICB9XG5cdCAgI2NyZWF0ZUFuZEFkZE5ld0VkaXRvcihldmVudCkge1xuXHQgICAgY29uc3QgaWQgPSB0aGlzLmdldE5leHRJZCgpO1xuXHQgICAgY29uc3QgZWRpdG9yID0gdGhpcy4jY3JlYXRlTmV3RWRpdG9yKHtcblx0ICAgICAgcGFyZW50OiB0aGlzLFxuXHQgICAgICBpZCxcblx0ICAgICAgeDogZXZlbnQub2Zmc2V0WCxcblx0ICAgICAgeTogZXZlbnQub2Zmc2V0WSxcblx0ICAgICAgdWlNYW5hZ2VyOiB0aGlzLiN1aU1hbmFnZXJcblx0ICAgIH0pO1xuXHQgICAgaWYgKGVkaXRvcikge1xuXHQgICAgICB0aGlzLmFkZChlZGl0b3IpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGVkaXRvcjtcblx0ICB9XG5cdCAgc2V0U2VsZWN0ZWQoZWRpdG9yKSB7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIuc2V0U2VsZWN0ZWQoZWRpdG9yKTtcblx0ICB9XG5cdCAgdG9nZ2xlU2VsZWN0ZWQoZWRpdG9yKSB7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIudG9nZ2xlU2VsZWN0ZWQoZWRpdG9yKTtcblx0ICB9XG5cdCAgaXNTZWxlY3RlZChlZGl0b3IpIHtcblx0ICAgIHJldHVybiB0aGlzLiN1aU1hbmFnZXIuaXNTZWxlY3RlZChlZGl0b3IpO1xuXHQgIH1cblx0ICB1bnNlbGVjdChlZGl0b3IpIHtcblx0ICAgIHRoaXMuI3VpTWFuYWdlci51bnNlbGVjdChlZGl0b3IpO1xuXHQgIH1cblx0ICBwb2ludGVydXAoZXZlbnQpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgaXNNYWNcblx0ICAgIH0gPSBfdXRpbC5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcblx0ICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmRpdikge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuI2hhZFBvaW50ZXJEb3duKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2hhZFBvaW50ZXJEb3duID0gZmFsc2U7XG5cdCAgICBpZiAoIXRoaXMuI2FsbG93Q2xpY2spIHtcblx0ICAgICAgdGhpcy4jYWxsb3dDbGljayA9IHRydWU7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2NyZWF0ZUFuZEFkZE5ld0VkaXRvcihldmVudCk7XG5cdCAgfVxuXHQgIHBvaW50ZXJkb3duKGV2ZW50KSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGlzTWFjXG5cdCAgICB9ID0gX3V0aWwuRmVhdHVyZVRlc3QucGxhdGZvcm07XG5cdCAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8IGV2ZW50LmN0cmxLZXkgJiYgaXNNYWMpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaXYpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSB0cnVlO1xuXHQgICAgY29uc3QgZWRpdG9yID0gdGhpcy4jdWlNYW5hZ2VyLmdldEFjdGl2ZSgpO1xuXHQgICAgdGhpcy4jYWxsb3dDbGljayA9ICFlZGl0b3IgfHwgZWRpdG9yLmlzRW1wdHkoKTtcblx0ICB9XG5cdCAgZHJvcChldmVudCkge1xuXHQgICAgY29uc3QgaWQgPSBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7XG5cdCAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiN1aU1hbmFnZXIuZ2V0RWRpdG9yKGlkKTtcblx0ICAgIGlmICghZWRpdG9yKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwibW92ZVwiO1xuXHQgICAgdGhpcy4jY2hhbmdlUGFyZW50KGVkaXRvcik7XG5cdCAgICBjb25zdCByZWN0ID0gdGhpcy5kaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdCAgICBjb25zdCBlbmRYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QueDtcblx0ICAgIGNvbnN0IGVuZFkgPSBldmVudC5jbGllbnRZIC0gcmVjdC55O1xuXHQgICAgZWRpdG9yLnRyYW5zbGF0ZShlbmRYIC0gZWRpdG9yLnN0YXJ0WCwgZW5kWSAtIGVkaXRvci5zdGFydFkpO1xuXHQgICAgdGhpcy5tb3ZlRWRpdG9ySW5ET00oZWRpdG9yKTtcblx0ICAgIGVkaXRvci5kaXYuZm9jdXMoKTtcblx0ICB9XG5cdCAgZHJhZ292ZXIoZXZlbnQpIHtcblx0ICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgfVxuXHQgIGRlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy4jdWlNYW5hZ2VyLmdldEFjdGl2ZSgpPy5wYXJlbnQgPT09IHRoaXMpIHtcblx0ICAgICAgdGhpcy4jdWlNYW5hZ2VyLnNldEFjdGl2ZUVkaXRvcihudWxsKTtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcblx0ICAgICAgdGhpcy4jYWNjZXNzaWJpbGl0eU1hbmFnZXI/LnJlbW92ZVBvaW50ZXJJblRleHRMYXllcihlZGl0b3IuY29udGVudERpdik7XG5cdCAgICAgIGVkaXRvci5zZXRQYXJlbnQobnVsbCk7XG5cdCAgICAgIGVkaXRvci5pc0F0dGFjaGVkVG9ET00gPSBmYWxzZTtcblx0ICAgICAgZWRpdG9yLmRpdi5yZW1vdmUoKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuZGl2ID0gbnVsbDtcblx0ICAgIHRoaXMuI2VkaXRvcnMuY2xlYXIoKTtcblx0ICAgIHRoaXMuI3VpTWFuYWdlci5yZW1vdmVMYXllcih0aGlzKTtcblx0ICB9XG5cdCAgI2NsZWFudXAoKSB7XG5cdCAgICB0aGlzLiNpc0NsZWFuaW5nVXAgPSB0cnVlO1xuXHQgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuXHQgICAgICBpZiAoZWRpdG9yLmlzRW1wdHkoKSkge1xuXHQgICAgICAgIGVkaXRvci5yZW1vdmUoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgdGhpcy4jaXNDbGVhbmluZ1VwID0gZmFsc2U7XG5cdCAgfVxuXHQgIHJlbmRlcih7XG5cdCAgICB2aWV3cG9ydFxuXHQgIH0pIHtcblx0ICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcblx0ICAgICgwLCBfZGlzcGxheV91dGlscy5zZXRMYXllckRpbWVuc2lvbnMpKHRoaXMuZGl2LCB2aWV3cG9ydCk7XG5cdCAgICAoMCwgX3Rvb2xzLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJkcmFnb3ZlclwiLCBcImRyb3BcIl0pO1xuXHQgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jdWlNYW5hZ2VyLmdldEVkaXRvcnModGhpcy5wYWdlSW5kZXgpKSB7XG5cdCAgICAgIHRoaXMuYWRkKGVkaXRvcik7XG5cdCAgICB9XG5cdCAgICB0aGlzLnVwZGF0ZU1vZGUoKTtcblx0ICB9XG5cdCAgdXBkYXRlKHtcblx0ICAgIHZpZXdwb3J0XG5cdCAgfSkge1xuXHQgICAgdGhpcy4jdWlNYW5hZ2VyLmNvbW1pdE9yUmVtb3ZlKCk7XG5cdCAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG5cdCAgICAoMCwgX2Rpc3BsYXlfdXRpbHMuc2V0TGF5ZXJEaW1lbnNpb25zKSh0aGlzLmRpdiwge1xuXHQgICAgICByb3RhdGlvbjogdmlld3BvcnQucm90YXRpb25cblx0ICAgIH0pO1xuXHQgICAgdGhpcy51cGRhdGVNb2RlKCk7XG5cdCAgfVxuXHQgIGdldCBwYWdlRGltZW5zaW9ucygpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgcGFnZVdpZHRoLFxuXHQgICAgICBwYWdlSGVpZ2h0XG5cdCAgICB9ID0gdGhpcy52aWV3cG9ydC5yYXdEaW1zO1xuXHQgICAgcmV0dXJuIFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkFubm90YXRpb25FZGl0b3JMYXllciA9IEFubm90YXRpb25FZGl0b3JMYXllcjtcblxuXHQvKioqLyB9KSxcblx0LyogMjggKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLkZyZWVUZXh0RWRpdG9yID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX3Rvb2xzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTtcblx0dmFyIF9lZGl0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpO1xuXHRjbGFzcyBGcmVlVGV4dEVkaXRvciBleHRlbmRzIF9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvciB7XG5cdCAgI2JvdW5kRWRpdG9yRGl2Qmx1ciA9IHRoaXMuZWRpdG9yRGl2Qmx1ci5iaW5kKHRoaXMpO1xuXHQgICNib3VuZEVkaXRvckRpdkZvY3VzID0gdGhpcy5lZGl0b3JEaXZGb2N1cy5iaW5kKHRoaXMpO1xuXHQgICNib3VuZEVkaXRvckRpdklucHV0ID0gdGhpcy5lZGl0b3JEaXZJbnB1dC5iaW5kKHRoaXMpO1xuXHQgICNib3VuZEVkaXRvckRpdktleWRvd24gPSB0aGlzLmVkaXRvckRpdktleWRvd24uYmluZCh0aGlzKTtcblx0ICAjY29sb3I7XG5cdCAgI2NvbnRlbnQgPSBcIlwiO1xuXHQgICNlZGl0b3JEaXZJZCA9IGAke3RoaXMuaWR9LWVkaXRvcmA7XG5cdCAgI2hhc0FscmVhZHlCZWVuQ29tbWl0dGVkID0gZmFsc2U7XG5cdCAgI2ZvbnRTaXplO1xuXHQgIHN0YXRpYyBfZnJlZVRleHREZWZhdWx0Q29udGVudCA9IFwiXCI7XG5cdCAgc3RhdGljIF9sMTBuUHJvbWlzZTtcblx0ICBzdGF0aWMgX2ludGVybmFsUGFkZGluZyA9IDA7XG5cdCAgc3RhdGljIF9kZWZhdWx0Q29sb3IgPSBudWxsO1xuXHQgIHN0YXRpYyBfZGVmYXVsdEZvbnRTaXplID0gMTA7XG5cdCAgc3RhdGljIF9rZXlib2FyZE1hbmFnZXIgPSBuZXcgX3Rvb2xzLktleWJvYXJkTWFuYWdlcihbW1tcImN0cmwrRW50ZXJcIiwgXCJtYWMrbWV0YStFbnRlclwiLCBcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIEZyZWVUZXh0RWRpdG9yLnByb3RvdHlwZS5jb21taXRPclJlbW92ZV1dKTtcblx0ICBzdGF0aWMgX3R5cGUgPSBcImZyZWV0ZXh0XCI7XG5cdCAgY29uc3RydWN0b3IocGFyYW1zKSB7XG5cdCAgICBzdXBlcih7XG5cdCAgICAgIC4uLnBhcmFtcyxcblx0ICAgICAgbmFtZTogXCJmcmVlVGV4dEVkaXRvclwiXG5cdCAgICB9KTtcblx0ICAgIHRoaXMuI2NvbG9yID0gcGFyYW1zLmNvbG9yIHx8IEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yO1xuXHQgICAgdGhpcy4jZm9udFNpemUgPSBwYXJhbXMuZm9udFNpemUgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRGb250U2l6ZTtcblx0ICB9XG5cdCAgc3RhdGljIGluaXRpYWxpemUobDEwbikge1xuXHQgICAgdGhpcy5fbDEwblByb21pc2UgPSBuZXcgTWFwKFtcImZyZWVfdGV4dDJfZGVmYXVsdF9jb250ZW50XCIsIFwiZWRpdG9yX2ZyZWVfdGV4dDJfYXJpYV9sYWJlbFwiXS5tYXAoc3RyID0+IFtzdHIsIGwxMG4uZ2V0KHN0cildKSk7XG5cdCAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcblx0ICAgIHRoaXMuX2ludGVybmFsUGFkZGluZyA9IHBhcnNlRmxvYXQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcIi0tZnJlZXRleHQtcGFkZGluZ1wiKSk7XG5cdCAgfVxuXHQgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHR5cGUsIHZhbHVlKSB7XG5cdCAgICBzd2l0Y2ggKHR5cGUpIHtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFOlxuXHQgICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemUgPSB2YWx1ZTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUjpcblx0ICAgICAgICBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdENvbG9yID0gdmFsdWU7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuXHQgICAgc3dpdGNoICh0eXBlKSB7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRTpcblx0ICAgICAgICB0aGlzLiN1cGRhdGVGb250U2l6ZSh2YWx1ZSk7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1I6XG5cdCAgICAgICAgdGhpcy4jdXBkYXRlQ29sb3IodmFsdWUpO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG5cdCAgICByZXR1cm4gW1tfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplXSwgW191dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SLCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdENvbG9yIHx8IF9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcl1dO1xuXHQgIH1cblx0ICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuXHQgICAgcmV0dXJuIFtbX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfU0laRSwgdGhpcy4jZm9udFNpemVdLCBbX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1IsIHRoaXMuI2NvbG9yXV07XG5cdCAgfVxuXHQgICN1cGRhdGVGb250U2l6ZShmb250U2l6ZSkge1xuXHQgICAgY29uc3Qgc2V0Rm9udHNpemUgPSBzaXplID0+IHtcblx0ICAgICAgdGhpcy5lZGl0b3JEaXYuc3R5bGUuZm9udFNpemUgPSBgY2FsYygke3NpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG5cdCAgICAgIHRoaXMudHJhbnNsYXRlKDAsIC0oc2l6ZSAtIHRoaXMuI2ZvbnRTaXplKSAqIHRoaXMucGFyZW50U2NhbGUpO1xuXHQgICAgICB0aGlzLiNmb250U2l6ZSA9IHNpemU7XG5cdCAgICAgIHRoaXMuI3NldEVkaXRvckRpbWVuc2lvbnMoKTtcblx0ICAgIH07XG5cdCAgICBjb25zdCBzYXZlZEZvbnRzaXplID0gdGhpcy4jZm9udFNpemU7XG5cdCAgICB0aGlzLmFkZENvbW1hbmRzKHtcblx0ICAgICAgY21kOiAoKSA9PiB7XG5cdCAgICAgICAgc2V0Rm9udHNpemUoZm9udFNpemUpO1xuXHQgICAgICB9LFxuXHQgICAgICB1bmRvOiAoKSA9PiB7XG5cdCAgICAgICAgc2V0Rm9udHNpemUoc2F2ZWRGb250c2l6ZSk7XG5cdCAgICAgIH0sXG5cdCAgICAgIG11c3RFeGVjOiB0cnVlLFxuXHQgICAgICB0eXBlOiBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLFxuXHQgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuXHQgICAgICBrZWVwVW5kbzogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgICN1cGRhdGVDb2xvcihjb2xvcikge1xuXHQgICAgY29uc3Qgc2F2ZWRDb2xvciA9IHRoaXMuI2NvbG9yO1xuXHQgICAgdGhpcy5hZGRDb21tYW5kcyh7XG5cdCAgICAgIGNtZDogKCkgPT4ge1xuXHQgICAgICAgIHRoaXMuI2NvbG9yID0gdGhpcy5lZGl0b3JEaXYuc3R5bGUuY29sb3IgPSBjb2xvcjtcblx0ICAgICAgfSxcblx0ICAgICAgdW5kbzogKCkgPT4ge1xuXHQgICAgICAgIHRoaXMuI2NvbG9yID0gdGhpcy5lZGl0b3JEaXYuc3R5bGUuY29sb3IgPSBzYXZlZENvbG9yO1xuXHQgICAgICB9LFxuXHQgICAgICBtdXN0RXhlYzogdHJ1ZSxcblx0ICAgICAgdHlwZTogX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1IsXG5cdCAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG5cdCAgICAgIGtlZXBVbmRvOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCkge1xuXHQgICAgY29uc3Qgc2NhbGUgPSB0aGlzLnBhcmVudFNjYWxlO1xuXHQgICAgcmV0dXJuIFstRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyAqIHNjYWxlLCAtKEZyZWVUZXh0RWRpdG9yLl9pbnRlcm5hbFBhZGRpbmcgKyB0aGlzLiNmb250U2l6ZSkgKiBzY2FsZV07XG5cdCAgfVxuXHQgIHJlYnVpbGQoKSB7XG5cdCAgICBzdXBlci5yZWJ1aWxkKCk7XG5cdCAgICBpZiAodGhpcy5kaXYgPT09IG51bGwpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuXHQgICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGVuYWJsZUVkaXRNb2RlKCkge1xuXHQgICAgaWYgKHRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5wYXJlbnQuc2V0RWRpdGluZ1N0YXRlKGZhbHNlKTtcblx0ICAgIHRoaXMucGFyZW50LnVwZGF0ZVRvb2xiYXIoX3V0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQpO1xuXHQgICAgc3VwZXIuZW5hYmxlRWRpdE1vZGUoKTtcblx0ICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QucmVtb3ZlKFwiZW5hYmxlZFwiKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG5cdCAgICB0aGlzLmRpdi5kcmFnZ2FibGUgPSBmYWxzZTtcblx0ICAgIHRoaXMuZGl2LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2S2V5ZG93bik7XG5cdCAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZGb2N1cyk7XG5cdCAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCB0aGlzLiNib3VuZEVkaXRvckRpdkJsdXIpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2SW5wdXQpO1xuXHQgIH1cblx0ICBkaXNhYmxlRWRpdE1vZGUoKSB7XG5cdCAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5wYXJlbnQuc2V0RWRpdGluZ1N0YXRlKHRydWUpO1xuXHQgICAgc3VwZXIuZGlzYWJsZUVkaXRNb2RlKCk7XG5cdCAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LmFkZChcImVuYWJsZWRcIik7XG5cdCAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcblx0ICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCB0aGlzLiNlZGl0b3JEaXZJZCk7XG5cdCAgICB0aGlzLmRpdi5kcmFnZ2FibGUgPSB0cnVlO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZLZXlkb3duKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEVkaXRvckRpdkZvY3VzKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Qmx1cik7XG5cdCAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZJbnB1dCk7XG5cdCAgICB0aGlzLmRpdi5mb2N1cyh7XG5cdCAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcblx0ICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZVRleHRFZGl0aW5nXCIpO1xuXHQgIH1cblx0ICBmb2N1c2luKGV2ZW50KSB7XG5cdCAgICBzdXBlci5mb2N1c2luKGV2ZW50KTtcblx0ICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuZWRpdG9yRGl2KSB7XG5cdCAgICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIG9uY2VBZGRlZCgpIHtcblx0ICAgIGlmICh0aGlzLndpZHRoKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG5cdCAgfVxuXHQgIGlzRW1wdHkoKSB7XG5cdCAgICByZXR1cm4gIXRoaXMuZWRpdG9yRGl2IHx8IHRoaXMuZWRpdG9yRGl2LmlubmVyVGV4dC50cmltKCkgPT09IFwiXCI7XG5cdCAgfVxuXHQgIHJlbW92ZSgpIHtcblx0ICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG5cdCAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUodHJ1ZSk7XG5cdCAgICB0aGlzLnBhcmVudC5kaXYuY2xhc3NMaXN0LmFkZChcImZyZWVUZXh0RWRpdGluZ1wiKTtcblx0ICAgIHN1cGVyLnJlbW92ZSgpO1xuXHQgIH1cblx0ICAjZXh0cmFjdFRleHQoKSB7XG5cdCAgICBjb25zdCBkaXZzID0gdGhpcy5lZGl0b3JEaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJkaXZcIik7XG5cdCAgICBpZiAoZGl2cy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yRGl2LmlubmVyVGV4dDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGJ1ZmZlciA9IFtdO1xuXHQgICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykge1xuXHQgICAgICBidWZmZXIucHVzaChkaXYuaW5uZXJUZXh0LnJlcGxhY2UoL1xcclxcbj98XFxuLywgXCJcIikpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiXFxuXCIpO1xuXHQgIH1cblx0ICAjc2V0RWRpdG9yRGltZW5zaW9ucygpIHtcblx0ICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcblx0ICAgIGxldCByZWN0O1xuXHQgICAgaWYgKHRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG5cdCAgICAgIHJlY3QgPSB0aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBjdXJyZW50TGF5ZXIsXG5cdCAgICAgICAgZGl2XG5cdCAgICAgIH0gPSB0aGlzO1xuXHQgICAgICBjb25zdCBzYXZlZERpc3BsYXkgPSBkaXYuc3R5bGUuZGlzcGxheTtcblx0ICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSBcImhpZGRlblwiO1xuXHQgICAgICBjdXJyZW50TGF5ZXIuZGl2LmFwcGVuZCh0aGlzLmRpdik7XG5cdCAgICAgIHJlY3QgPSBkaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdCAgICAgIGRpdi5yZW1vdmUoKTtcblx0ICAgICAgZGl2LnN0eWxlLmRpc3BsYXkgPSBzYXZlZERpc3BsYXk7XG5cdCAgICB9XG5cdCAgICB0aGlzLndpZHRoID0gcmVjdC53aWR0aCAvIHBhcmVudFdpZHRoO1xuXHQgICAgdGhpcy5oZWlnaHQgPSByZWN0LmhlaWdodCAvIHBhcmVudEhlaWdodDtcblx0ICB9XG5cdCAgY29tbWl0KCkge1xuXHQgICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHN1cGVyLmNvbW1pdCgpO1xuXHQgICAgaWYgKCF0aGlzLiNoYXNBbHJlYWR5QmVlbkNvbW1pdHRlZCkge1xuXHQgICAgICB0aGlzLiNoYXNBbHJlYWR5QmVlbkNvbW1pdHRlZCA9IHRydWU7XG5cdCAgICAgIHRoaXMucGFyZW50LmFkZFVuZG9hYmxlRWRpdG9yKHRoaXMpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5kaXNhYmxlRWRpdE1vZGUoKTtcblx0ICAgIHRoaXMuI2NvbnRlbnQgPSB0aGlzLiNleHRyYWN0VGV4dCgpLnRyaW1FbmQoKTtcblx0ICAgIHRoaXMuI3NldEVkaXRvckRpbWVuc2lvbnMoKTtcblx0ICB9XG5cdCAgc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5pc0luRWRpdE1vZGUoKTtcblx0ICB9XG5cdCAgZGJsY2xpY2soZXZlbnQpIHtcblx0ICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LmZvY3VzKCk7XG5cdCAgfVxuXHQgIGtleWRvd24oZXZlbnQpIHtcblx0ICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuZGl2ICYmIGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG5cdCAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcblx0ICAgICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZWRpdG9yRGl2S2V5ZG93bihldmVudCkge1xuXHQgICAgRnJlZVRleHRFZGl0b3IuX2tleWJvYXJkTWFuYWdlci5leGVjKHRoaXMsIGV2ZW50KTtcblx0ICB9XG5cdCAgZWRpdG9yRGl2Rm9jdXMoZXZlbnQpIHtcblx0ICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcblx0ICB9XG5cdCAgZWRpdG9yRGl2Qmx1cihldmVudCkge1xuXHQgICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcblx0ICB9XG5cdCAgZWRpdG9yRGl2SW5wdXQoZXZlbnQpIHtcblx0ICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QudG9nZ2xlKFwiZnJlZVRleHRFZGl0aW5nXCIsIHRoaXMuaXNFbXB0eSgpKTtcblx0ICB9XG5cdCAgZGlzYWJsZUVkaXRpbmcoKSB7XG5cdCAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwiY29tbWVudFwiKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIpO1xuXHQgIH1cblx0ICBlbmFibGVFZGl0aW5nKCkge1xuXHQgICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcInRleHRib3hcIik7XG5cdCAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJhcmlhLW11bHRpbGluZVwiLCB0cnVlKTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgaWYgKHRoaXMuZGl2KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmRpdjtcblx0ICAgIH1cblx0ICAgIGxldCBiYXNlWCwgYmFzZVk7XG5cdCAgICBpZiAodGhpcy53aWR0aCkge1xuXHQgICAgICBiYXNlWCA9IHRoaXMueDtcblx0ICAgICAgYmFzZVkgPSB0aGlzLnk7XG5cdCAgICB9XG5cdCAgICBzdXBlci5yZW5kZXIoKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LmNsYXNzTmFtZSA9IFwiaW50ZXJuYWxcIjtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImlkXCIsIHRoaXMuI2VkaXRvckRpdklkKTtcblx0ICAgIHRoaXMuZW5hYmxlRWRpdGluZygpO1xuXHQgICAgRnJlZVRleHRFZGl0b3IuX2wxMG5Qcm9taXNlLmdldChcImVkaXRvcl9mcmVlX3RleHQyX2FyaWFfbGFiZWxcIikudGhlbihtc2cgPT4gdGhpcy5lZGl0b3JEaXY/LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKSk7XG5cdCAgICBGcmVlVGV4dEVkaXRvci5fbDEwblByb21pc2UuZ2V0KFwiZnJlZV90ZXh0Ml9kZWZhdWx0X2NvbnRlbnRcIikudGhlbihtc2cgPT4gdGhpcy5lZGl0b3JEaXY/LnNldEF0dHJpYnV0ZShcImRlZmF1bHQtY29udGVudFwiLCBtc2cpKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHN0eWxlXG5cdCAgICB9ID0gdGhpcy5lZGl0b3JEaXY7XG5cdCAgICBzdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7dGhpcy4jZm9udFNpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG5cdCAgICBzdHlsZS5jb2xvciA9IHRoaXMuI2NvbG9yO1xuXHQgICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMuZWRpdG9yRGl2KTtcblx0ICAgIHRoaXMub3ZlcmxheURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdCAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LmFkZChcIm92ZXJsYXlcIiwgXCJlbmFibGVkXCIpO1xuXHQgICAgdGhpcy5kaXYuYXBwZW5kKHRoaXMub3ZlcmxheURpdik7XG5cdCAgICAoMCwgX3Rvb2xzLmJpbmRFdmVudHMpKHRoaXMsIHRoaXMuZGl2LCBbXCJkYmxjbGlja1wiLCBcImtleWRvd25cIl0pO1xuXHQgICAgaWYgKHRoaXMud2lkdGgpIHtcblx0ICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgICB0aGlzLnNldEF0KGJhc2VYICogcGFyZW50V2lkdGgsIGJhc2VZICogcGFyZW50SGVpZ2h0LCB0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcblx0ICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMuI2NvbnRlbnQuc3BsaXQoXCJcXG5cIikpIHtcblx0ICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgICAgIGRpdi5hcHBlbmQobGluZSA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpKTtcblx0ICAgICAgICB0aGlzLmVkaXRvckRpdi5hcHBlbmQoZGl2KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmRpdi5kcmFnZ2FibGUgPSB0cnVlO1xuXHQgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmVkaXRvckRpdi5jb250ZW50RWRpdGFibGUgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMuZGl2O1xuXHQgIH1cblx0ICBnZXQgY29udGVudERpdigpIHtcblx0ICAgIHJldHVybiB0aGlzLmVkaXRvckRpdjtcblx0ICB9XG5cdCAgc3RhdGljIGRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKSB7XG5cdCAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG5cdCAgICBlZGl0b3IuI2ZvbnRTaXplID0gZGF0YS5mb250U2l6ZTtcblx0ICAgIGVkaXRvci4jY29sb3IgPSBfdXRpbC5VdGlsLm1ha2VIZXhDb2xvciguLi5kYXRhLmNvbG9yKTtcblx0ICAgIGVkaXRvci4jY29udGVudCA9IGRhdGEudmFsdWU7XG5cdCAgICByZXR1cm4gZWRpdG9yO1xuXHQgIH1cblx0ICBzZXJpYWxpemUoKSB7XG5cdCAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCBwYWRkaW5nID0gRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyAqIHRoaXMucGFyZW50U2NhbGU7XG5cdCAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRSZWN0KHBhZGRpbmcsIHBhZGRpbmcpO1xuXHQgICAgY29uc3QgY29sb3IgPSBfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuX2NvbG9yTWFuYWdlci5jb252ZXJ0KHRoaXMuaXNBdHRhY2hlZFRvRE9NID8gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVkaXRvckRpdikuY29sb3IgOiB0aGlzLiNjb2xvcik7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhbm5vdGF0aW9uVHlwZTogX3V0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQsXG5cdCAgICAgIGNvbG9yLFxuXHQgICAgICBmb250U2l6ZTogdGhpcy4jZm9udFNpemUsXG5cdCAgICAgIHZhbHVlOiB0aGlzLiNjb250ZW50LFxuXHQgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuXHQgICAgICByZWN0LFxuXHQgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvblxuXHQgICAgfTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5GcmVlVGV4dEVkaXRvciA9IEZyZWVUZXh0RWRpdG9yO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAyOSAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuSW5rRWRpdG9yID0gdm9pZCAwO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmaXRDdXJ2ZVwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3BkZmpzRml0Q3VydmUuZml0Q3VydmU7XG5cdCAgfVxuXHR9KSk7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfZWRpdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTtcblx0dmFyIF9wZGZqc0ZpdEN1cnZlID0gX193X3BkZmpzX3JlcXVpcmVfXygzMCk7XG5cdHZhciBfdG9vbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpO1xuXHRjb25zdCBSRVNJWkVSX1NJWkUgPSAxNjtcblx0Y2xhc3MgSW5rRWRpdG9yIGV4dGVuZHMgX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yIHtcblx0ICAjYXNwZWN0UmF0aW8gPSAwO1xuXHQgICNiYXNlSGVpZ2h0ID0gMDtcblx0ICAjYmFzZVdpZHRoID0gMDtcblx0ICAjYm91bmRDYW52YXNQb2ludGVybW92ZSA9IHRoaXMuY2FudmFzUG9pbnRlcm1vdmUuYmluZCh0aGlzKTtcblx0ICAjYm91bmRDYW52YXNQb2ludGVybGVhdmUgPSB0aGlzLmNhbnZhc1BvaW50ZXJsZWF2ZS5iaW5kKHRoaXMpO1xuXHQgICNib3VuZENhbnZhc1BvaW50ZXJ1cCA9IHRoaXMuY2FudmFzUG9pbnRlcnVwLmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24gPSB0aGlzLmNhbnZhc1BvaW50ZXJkb3duLmJpbmQodGhpcyk7XG5cdCAgI2Rpc2FibGVFZGl0aW5nID0gZmFsc2U7XG5cdCAgI2lzQ2FudmFzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0ICAjbGFzdFBvaW50ID0gbnVsbDtcblx0ICAjb2JzZXJ2ZXIgPSBudWxsO1xuXHQgICNyZWFsV2lkdGggPSAwO1xuXHQgICNyZWFsSGVpZ2h0ID0gMDtcblx0ICAjcmVxdWVzdEZyYW1lQ2FsbGJhY2sgPSBudWxsO1xuXHQgIHN0YXRpYyBfZGVmYXVsdENvbG9yID0gbnVsbDtcblx0ICBzdGF0aWMgX2RlZmF1bHRPcGFjaXR5ID0gMTtcblx0ICBzdGF0aWMgX2RlZmF1bHRUaGlja25lc3MgPSAxO1xuXHQgIHN0YXRpYyBfbDEwblByb21pc2U7XG5cdCAgc3RhdGljIF90eXBlID0gXCJpbmtcIjtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcblx0ICAgIHN1cGVyKHtcblx0ICAgICAgLi4ucGFyYW1zLFxuXHQgICAgICBuYW1lOiBcImlua0VkaXRvclwiXG5cdCAgICB9KTtcblx0ICAgIHRoaXMuY29sb3IgPSBwYXJhbXMuY29sb3IgfHwgbnVsbDtcblx0ICAgIHRoaXMudGhpY2tuZXNzID0gcGFyYW1zLnRoaWNrbmVzcyB8fCBudWxsO1xuXHQgICAgdGhpcy5vcGFjaXR5ID0gcGFyYW1zLm9wYWNpdHkgfHwgbnVsbDtcblx0ICAgIHRoaXMucGF0aHMgPSBbXTtcblx0ICAgIHRoaXMuYmV6aWVyUGF0aDJEID0gW107XG5cdCAgICB0aGlzLmN1cnJlbnRQYXRoID0gW107XG5cdCAgICB0aGlzLnNjYWxlRmFjdG9yID0gMTtcblx0ICAgIHRoaXMudHJhbnNsYXRpb25YID0gdGhpcy50cmFuc2xhdGlvblkgPSAwO1xuXHQgICAgdGhpcy54ID0gMDtcblx0ICAgIHRoaXMueSA9IDA7XG5cdCAgfVxuXHQgIHN0YXRpYyBpbml0aWFsaXplKGwxMG4pIHtcblx0ICAgIHRoaXMuX2wxMG5Qcm9taXNlID0gbmV3IE1hcChbXCJlZGl0b3JfaW5rX2NhbnZhc19hcmlhX2xhYmVsXCIsIFwiZWRpdG9yX2luazJfYXJpYV9sYWJlbFwiXS5tYXAoc3RyID0+IFtzdHIsIGwxMG4uZ2V0KHN0cildKSk7XG5cdCAgfVxuXHQgIHN0YXRpYyB1cGRhdGVEZWZhdWx0UGFyYW1zKHR5cGUsIHZhbHVlKSB7XG5cdCAgICBzd2l0Y2ggKHR5cGUpIHtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTOlxuXHQgICAgICAgIElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzcyA9IHZhbHVlO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUjpcblx0ICAgICAgICBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciA9IHZhbHVlO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZOlxuXHQgICAgICAgIElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkgPSB2YWx1ZSAvIDEwMDtcblx0ICAgICAgICBicmVhaztcblx0ICAgIH1cblx0ICB9XG5cdCAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7XG5cdCAgICBzd2l0Y2ggKHR5cGUpIHtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTOlxuXHQgICAgICAgIHRoaXMuI3VwZGF0ZVRoaWNrbmVzcyh2YWx1ZSk7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SOlxuXHQgICAgICAgIHRoaXMuI3VwZGF0ZUNvbG9yKHZhbHVlKTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWTpcblx0ICAgICAgICB0aGlzLiN1cGRhdGVPcGFjaXR5KHZhbHVlKTtcblx0ICAgICAgICBicmVhaztcblx0ICAgIH1cblx0ICB9XG5cdCAgc3RhdGljIGdldCBkZWZhdWx0UHJvcGVydGllc1RvVXBkYXRlKCkge1xuXHQgICAgcmV0dXJuIFtbX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX1RISUNLTkVTUywgSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzXSwgW191dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUiwgSW5rRWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXSwgW191dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLCBNYXRoLnJvdW5kKElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkgKiAxMDApXV07XG5cdCAgfVxuXHQgIGdldCBwcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG5cdCAgICByZXR1cm4gW1tfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCB0aGlzLnRoaWNrbmVzcyB8fCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SLCB0aGlzLmNvbG9yIHx8IElua0VkaXRvci5fZGVmYXVsdENvbG9yIHx8IF9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5fZGVmYXVsdExpbmVDb2xvcl0sIFtfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfT1BBQ0lUWSwgTWF0aC5yb3VuZCgxMDAgKiAodGhpcy5vcGFjaXR5ID8/IElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHkpKV1dO1xuXHQgIH1cblx0ICAjdXBkYXRlVGhpY2tuZXNzKHRoaWNrbmVzcykge1xuXHQgICAgY29uc3Qgc2F2ZWRUaGlja25lc3MgPSB0aGlzLnRoaWNrbmVzcztcblx0ICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuXHQgICAgICBjbWQ6ICgpID0+IHtcblx0ICAgICAgICB0aGlzLnRoaWNrbmVzcyA9IHRoaWNrbmVzcztcblx0ICAgICAgICB0aGlzLiNmaXRUb0NvbnRlbnQoKTtcblx0ICAgICAgfSxcblx0ICAgICAgdW5kbzogKCkgPT4ge1xuXHQgICAgICAgIHRoaXMudGhpY2tuZXNzID0gc2F2ZWRUaGlja25lc3M7XG5cdCAgICAgICAgdGhpcy4jZml0VG9Db250ZW50KCk7XG5cdCAgICAgIH0sXG5cdCAgICAgIG11c3RFeGVjOiB0cnVlLFxuXHQgICAgICB0eXBlOiBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLFxuXHQgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuXHQgICAgICBrZWVwVW5kbzogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgICN1cGRhdGVDb2xvcihjb2xvcikge1xuXHQgICAgY29uc3Qgc2F2ZWRDb2xvciA9IHRoaXMuY29sb3I7XG5cdCAgICB0aGlzLmFkZENvbW1hbmRzKHtcblx0ICAgICAgY21kOiAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuXHQgICAgICAgIHRoaXMuI3JlZHJhdygpO1xuXHQgICAgICB9LFxuXHQgICAgICB1bmRvOiAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy5jb2xvciA9IHNhdmVkQ29sb3I7XG5cdCAgICAgICAgdGhpcy4jcmVkcmF3KCk7XG5cdCAgICAgIH0sXG5cdCAgICAgIG11c3RFeGVjOiB0cnVlLFxuXHQgICAgICB0eXBlOiBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsXG5cdCAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG5cdCAgICAgIGtlZXBVbmRvOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgI3VwZGF0ZU9wYWNpdHkob3BhY2l0eSkge1xuXHQgICAgb3BhY2l0eSAvPSAxMDA7XG5cdCAgICBjb25zdCBzYXZlZE9wYWNpdHkgPSB0aGlzLm9wYWNpdHk7XG5cdCAgICB0aGlzLmFkZENvbW1hbmRzKHtcblx0ICAgICAgY21kOiAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy5vcGFjaXR5ID0gb3BhY2l0eTtcblx0ICAgICAgICB0aGlzLiNyZWRyYXcoKTtcblx0ICAgICAgfSxcblx0ICAgICAgdW5kbzogKCkgPT4ge1xuXHQgICAgICAgIHRoaXMub3BhY2l0eSA9IHNhdmVkT3BhY2l0eTtcblx0ICAgICAgICB0aGlzLiNyZWRyYXcoKTtcblx0ICAgICAgfSxcblx0ICAgICAgbXVzdEV4ZWM6IHRydWUsXG5cdCAgICAgIHR5cGU6IF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLFxuXHQgICAgICBvdmVyd3JpdGVJZlNhbWVUeXBlOiB0cnVlLFxuXHQgICAgICBrZWVwVW5kbzogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlYnVpbGQoKSB7XG5cdCAgICBzdXBlci5yZWJ1aWxkKCk7XG5cdCAgICBpZiAodGhpcy5kaXYgPT09IG51bGwpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuXHQgICAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcblx0ICAgICAgdGhpcy4jY3JlYXRlT2JzZXJ2ZXIoKTtcblx0ICAgIH1cblx0ICAgIGlmICghdGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcblx0ICAgICAgdGhpcy5wYXJlbnQuYWRkKHRoaXMpO1xuXHQgICAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNmaXRUb0NvbnRlbnQoKTtcblx0ICB9XG5cdCAgcmVtb3ZlKCkge1xuXHQgICAgaWYgKHRoaXMuY2FudmFzID09PSBudWxsKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICghdGhpcy5pc0VtcHR5KCkpIHtcblx0ICAgICAgdGhpcy5jb21taXQoKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5jYW52YXMuaGVpZ2h0ID0gMDtcblx0ICAgIHRoaXMuY2FudmFzLnJlbW92ZSgpO1xuXHQgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuXHQgICAgdGhpcy4jb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuXHQgICAgdGhpcy4jb2JzZXJ2ZXIgPSBudWxsO1xuXHQgICAgc3VwZXIucmVtb3ZlKCk7XG5cdCAgfVxuXHQgIHNldFBhcmVudChwYXJlbnQpIHtcblx0ICAgIGlmICghdGhpcy5wYXJlbnQgJiYgcGFyZW50KSB7XG5cdCAgICAgIHRoaXMuX3VpTWFuYWdlci5yZW1vdmVTaG91bGRSZXNjYWxlKHRoaXMpO1xuXHQgICAgfSBlbHNlIGlmICh0aGlzLnBhcmVudCAmJiBwYXJlbnQgPT09IG51bGwpIHtcblx0ICAgICAgdGhpcy5fdWlNYW5hZ2VyLmFkZFNob3VsZFJlc2NhbGUodGhpcyk7XG5cdCAgICB9XG5cdCAgICBzdXBlci5zZXRQYXJlbnQocGFyZW50KTtcblx0ICB9XG5cdCAgb25TY2FsZUNoYW5naW5nKCkge1xuXHQgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoICogcGFyZW50V2lkdGg7XG5cdCAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodDtcblx0ICAgIHRoaXMuc2V0RGltZW5zaW9ucyh3aWR0aCwgaGVpZ2h0KTtcblx0ICB9XG5cdCAgZW5hYmxlRWRpdE1vZGUoKSB7XG5cdCAgICBpZiAodGhpcy4jZGlzYWJsZUVkaXRpbmcgfHwgdGhpcy5jYW52YXMgPT09IG51bGwpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgc3VwZXIuZW5hYmxlRWRpdE1vZGUoKTtcblx0ICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9IGZhbHNlO1xuXHQgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24pO1xuXHQgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJ1cCk7XG5cdCAgfVxuXHQgIGRpc2FibGVFZGl0TW9kZSgpIHtcblx0ICAgIGlmICghdGhpcy5pc0luRWRpdE1vZGUoKSB8fCB0aGlzLmNhbnZhcyA9PT0gbnVsbCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBzdXBlci5kaXNhYmxlRWRpdE1vZGUoKTtcblx0ICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICF0aGlzLmlzRW1wdHkoKTtcblx0ICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJlZGl0aW5nXCIpO1xuXHQgICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmRvd24pO1xuXHQgICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJ1cCk7XG5cdCAgfVxuXHQgIG9uY2VBZGRlZCgpIHtcblx0ICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9ICF0aGlzLmlzRW1wdHkoKTtcblx0ICB9XG5cdCAgaXNFbXB0eSgpIHtcblx0ICAgIHJldHVybiB0aGlzLnBhdGhzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLnBhdGhzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnBhdGhzWzBdLmxlbmd0aCA9PT0gMDtcblx0ICB9XG5cdCAgI2dldEluaXRpYWxCQm94KCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBwYXJlbnRSb3RhdGlvbixcblx0ICAgICAgcGFyZW50RGltZW5zaW9uczogW3dpZHRoLCBoZWlnaHRdXG5cdCAgICB9ID0gdGhpcztcblx0ICAgIHN3aXRjaCAocGFyZW50Um90YXRpb24pIHtcblx0ICAgICAgY2FzZSA5MDpcblx0ICAgICAgICByZXR1cm4gWzAsIGhlaWdodCwgaGVpZ2h0LCB3aWR0aF07XG5cdCAgICAgIGNhc2UgMTgwOlxuXHQgICAgICAgIHJldHVybiBbd2lkdGgsIGhlaWdodCwgd2lkdGgsIGhlaWdodF07XG5cdCAgICAgIGNhc2UgMjcwOlxuXHQgICAgICAgIHJldHVybiBbd2lkdGgsIDAsIGhlaWdodCwgd2lkdGhdO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIHJldHVybiBbMCwgMCwgd2lkdGgsIGhlaWdodF07XG5cdCAgICB9XG5cdCAgfVxuXHQgICNzZXRTdHJva2UoKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGN0eCxcblx0ICAgICAgY29sb3IsXG5cdCAgICAgIG9wYWNpdHksXG5cdCAgICAgIHRoaWNrbmVzcyxcblx0ICAgICAgcGFyZW50U2NhbGUsXG5cdCAgICAgIHNjYWxlRmFjdG9yXG5cdCAgICB9ID0gdGhpcztcblx0ICAgIGN0eC5saW5lV2lkdGggPSB0aGlja25lc3MgKiBwYXJlbnRTY2FsZSAvIHNjYWxlRmFjdG9yO1xuXHQgICAgY3R4LmxpbmVDYXAgPSBcInJvdW5kXCI7XG5cdCAgICBjdHgubGluZUpvaW4gPSBcInJvdW5kXCI7XG5cdCAgICBjdHgubWl0ZXJMaW1pdCA9IDEwO1xuXHQgICAgY3R4LnN0cm9rZVN0eWxlID0gYCR7Y29sb3J9JHsoMCwgX3Rvb2xzLm9wYWNpdHlUb0hleCkob3BhY2l0eSl9YDtcblx0ICB9XG5cdCAgI3N0YXJ0RHJhd2luZyh4LCB5KSB7XG5cdCAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG5cdCAgICBpZiAoIXRoaXMuI2lzQ2FudmFzSW5pdGlhbGl6ZWQpIHtcblx0ICAgICAgdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCA9IHRydWU7XG5cdCAgICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcblx0ICAgICAgdGhpcy50aGlja25lc3MgfHw9IElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzcztcblx0ICAgICAgdGhpcy5jb2xvciB8fD0gSW5rRWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yO1xuXHQgICAgICB0aGlzLm9wYWNpdHkgPz89IElua0VkaXRvci5fZGVmYXVsdE9wYWNpdHk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmN1cnJlbnRQYXRoLnB1c2goW3gsIHldKTtcblx0ICAgIHRoaXMuI2xhc3RQb2ludCA9IG51bGw7XG5cdCAgICB0aGlzLiNzZXRTdHJva2UoKTtcblx0ICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuXHQgICAgdGhpcy5jdHgubW92ZVRvKHgsIHkpO1xuXHQgICAgdGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2sgPSAoKSA9PiB7XG5cdCAgICAgIGlmICghdGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2spIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuI2xhc3RQb2ludCkge1xuXHQgICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuXHQgICAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuXHQgICAgICAgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzLndpZHRoLCB0aGlzLmNhbnZhcy5oZWlnaHQpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLiNyZWRyYXcoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jdHgubGluZVRvKC4uLnRoaXMuI2xhc3RQb2ludCk7XG5cdCAgICAgICAgdGhpcy4jbGFzdFBvaW50ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmN0eC5zdHJva2UoKTtcblx0ICAgICAgfVxuXHQgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrKTtcblx0ICAgIH07XG5cdCAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuI3JlcXVlc3RGcmFtZUNhbGxiYWNrKTtcblx0ICB9XG5cdCAgI2RyYXcoeCwgeSkge1xuXHQgICAgY29uc3QgW2xhc3RYLCBsYXN0WV0gPSB0aGlzLmN1cnJlbnRQYXRoLmF0KC0xKTtcblx0ICAgIGlmICh4ID09PSBsYXN0WCAmJiB5ID09PSBsYXN0WSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLmN1cnJlbnRQYXRoLnB1c2goW3gsIHldKTtcblx0ICAgIHRoaXMuI2xhc3RQb2ludCA9IFt4LCB5XTtcblx0ICB9XG5cdCAgI3N0b3BEcmF3aW5nKHgsIHkpIHtcblx0ICAgIHRoaXMuY3R4LmNsb3NlUGF0aCgpO1xuXHQgICAgdGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2sgPSBudWxsO1xuXHQgICAgeCA9IE1hdGgubWluKE1hdGgubWF4KHgsIDApLCB0aGlzLmNhbnZhcy53aWR0aCk7XG5cdCAgICB5ID0gTWF0aC5taW4oTWF0aC5tYXgoeSwgMCksIHRoaXMuY2FudmFzLmhlaWdodCk7XG5cdCAgICBjb25zdCBbbGFzdFgsIGxhc3RZXSA9IHRoaXMuY3VycmVudFBhdGguYXQoLTEpO1xuXHQgICAgaWYgKHggIT09IGxhc3RYIHx8IHkgIT09IGxhc3RZKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudFBhdGgucHVzaChbeCwgeV0pO1xuXHQgICAgfVxuXHQgICAgbGV0IGJlemllcjtcblx0ICAgIGlmICh0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCAhPT0gMSkge1xuXHQgICAgICBiZXppZXIgPSAoMCwgX3BkZmpzRml0Q3VydmUuZml0Q3VydmUpKHRoaXMuY3VycmVudFBhdGgsIDMwLCBudWxsKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IHh5ID0gW3gsIHldO1xuXHQgICAgICBiZXppZXIgPSBbW3h5LCB4eS5zbGljZSgpLCB4eS5zbGljZSgpLCB4eV1dO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcGF0aDJEID0gSW5rRWRpdG9yLiNidWlsZFBhdGgyRChiZXppZXIpO1xuXHQgICAgdGhpcy5jdXJyZW50UGF0aC5sZW5ndGggPSAwO1xuXHQgICAgY29uc3QgY21kID0gKCkgPT4ge1xuXHQgICAgICB0aGlzLnBhdGhzLnB1c2goYmV6aWVyKTtcblx0ICAgICAgdGhpcy5iZXppZXJQYXRoMkQucHVzaChwYXRoMkQpO1xuXHQgICAgICB0aGlzLnJlYnVpbGQoKTtcblx0ICAgIH07XG5cdCAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuXHQgICAgICB0aGlzLnBhdGhzLnBvcCgpO1xuXHQgICAgICB0aGlzLmJlemllclBhdGgyRC5wb3AoKTtcblx0ICAgICAgaWYgKHRoaXMucGF0aHMubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgdGhpcy5yZW1vdmUoKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBpZiAoIXRoaXMuY2FudmFzKSB7XG5cdCAgICAgICAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcblx0ICAgICAgICAgIHRoaXMuI2NyZWF0ZU9ic2VydmVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuI2ZpdFRvQ29udGVudCgpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgICAgdGhpcy5hZGRDb21tYW5kcyh7XG5cdCAgICAgIGNtZCxcblx0ICAgICAgdW5kbyxcblx0ICAgICAgbXVzdEV4ZWM6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICAjcmVkcmF3KCkge1xuXHQgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG5cdCAgICAgIHRoaXMuI3VwZGF0ZVRyYW5zZm9ybSgpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLiNzZXRTdHJva2UoKTtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgY2FudmFzLFxuXHQgICAgICBjdHhcblx0ICAgIH0gPSB0aGlzO1xuXHQgICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcblx0ICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblx0ICAgIHRoaXMuI3VwZGF0ZVRyYW5zZm9ybSgpO1xuXHQgICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMuYmV6aWVyUGF0aDJEKSB7XG5cdCAgICAgIGN0eC5zdHJva2UocGF0aCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGNvbW1pdCgpIHtcblx0ICAgIGlmICh0aGlzLiNkaXNhYmxlRWRpdGluZykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBzdXBlci5jb21taXQoKTtcblx0ICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG5cdCAgICB0aGlzLmRpc2FibGVFZGl0TW9kZSgpO1xuXHQgICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcblx0ICAgIHRoaXMuI2Rpc2FibGVFZGl0aW5nID0gdHJ1ZTtcblx0ICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZFwiKTtcblx0ICAgIHRoaXMuI2ZpdFRvQ29udGVudCh0cnVlKTtcblx0ICAgIHRoaXMucGFyZW50LmFkZElua0VkaXRvcklmTmVlZGVkKHRydWUpO1xuXHQgICAgdGhpcy5wYXJlbnQubW92ZUVkaXRvckluRE9NKHRoaXMpO1xuXHQgICAgdGhpcy5kaXYuZm9jdXMoe1xuXHQgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZm9jdXNpbihldmVudCkge1xuXHQgICAgc3VwZXIuZm9jdXNpbihldmVudCk7XG5cdCAgICB0aGlzLmVuYWJsZUVkaXRNb2RlKCk7XG5cdCAgfVxuXHQgIGNhbnZhc1BvaW50ZXJkb3duKGV2ZW50KSB7XG5cdCAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwIHx8ICF0aGlzLmlzSW5FZGl0TW9kZSgpIHx8IHRoaXMuI2Rpc2FibGVFZGl0aW5nKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuc2V0SW5Gb3JlZ3JvdW5kKCk7XG5cdCAgICBpZiAoZXZlbnQudHlwZSAhPT0gXCJtb3VzZVwiKSB7XG5cdCAgICAgIHRoaXMuZGl2LmZvY3VzKCk7XG5cdCAgICB9XG5cdCAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgIHRoaXMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybGVhdmVcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVybGVhdmUpO1xuXHQgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcm1vdmUpO1xuXHQgICAgdGhpcy4jc3RhcnREcmF3aW5nKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuXHQgIH1cblx0ICBjYW52YXNQb2ludGVybW92ZShldmVudCkge1xuXHQgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICB0aGlzLiNkcmF3KGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuXHQgIH1cblx0ICBjYW52YXNQb2ludGVydXAoZXZlbnQpIHtcblx0ICAgIGlmIChldmVudC5idXR0b24gIT09IDApIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuaXNJbkVkaXRNb2RlKCkgJiYgdGhpcy5jdXJyZW50UGF0aC5sZW5ndGggIT09IDApIHtcblx0ICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgIHRoaXMuI2VuZERyYXdpbmcoZXZlbnQpO1xuXHQgICAgICB0aGlzLnNldEluQmFja2dyb3VuZCgpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBjYW52YXNQb2ludGVybGVhdmUoZXZlbnQpIHtcblx0ICAgIHRoaXMuI2VuZERyYXdpbmcoZXZlbnQpO1xuXHQgICAgdGhpcy5zZXRJbkJhY2tncm91bmQoKTtcblx0ICB9XG5cdCAgI2VuZERyYXdpbmcoZXZlbnQpIHtcblx0ICAgIHRoaXMuI3N0b3BEcmF3aW5nKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuXHQgICAgdGhpcy5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJsZWF2ZSk7XG5cdCAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVybW92ZSk7XG5cdCAgICB0aGlzLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoKTtcblx0ICB9XG5cdCAgI2NyZWF0ZUNhbnZhcygpIHtcblx0ICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblx0ICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5jYW52YXMuaGVpZ2h0ID0gMDtcblx0ICAgIHRoaXMuY2FudmFzLmNsYXNzTmFtZSA9IFwiaW5rRWRpdG9yQ2FudmFzXCI7XG5cdCAgICBJbmtFZGl0b3IuX2wxMG5Qcm9taXNlLmdldChcImVkaXRvcl9pbmtfY2FudmFzX2FyaWFfbGFiZWxcIikudGhlbihtc2cgPT4gdGhpcy5jYW52YXM/LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKSk7XG5cdCAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5jYW52YXMpO1xuXHQgICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cdCAgfVxuXHQgICNjcmVhdGVPYnNlcnZlcigpIHtcblx0ICAgIHRoaXMuI29ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuXHQgICAgICBjb25zdCByZWN0ID0gZW50cmllc1swXS5jb250ZW50UmVjdDtcblx0ICAgICAgaWYgKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpIHtcblx0ICAgICAgICB0aGlzLnNldERpbWVuc2lvbnMocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuI29ic2VydmVyLm9ic2VydmUodGhpcy5kaXYpO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICBpZiAodGhpcy5kaXYpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuXHQgICAgfVxuXHQgICAgbGV0IGJhc2VYLCBiYXNlWTtcblx0ICAgIGlmICh0aGlzLndpZHRoKSB7XG5cdCAgICAgIGJhc2VYID0gdGhpcy54O1xuXHQgICAgICBiYXNlWSA9IHRoaXMueTtcblx0ICAgIH1cblx0ICAgIHN1cGVyLnJlbmRlcigpO1xuXHQgICAgSW5rRWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoXCJlZGl0b3JfaW5rMl9hcmlhX2xhYmVsXCIpLnRoZW4obXNnID0+IHRoaXMuZGl2Py5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZykpO1xuXHQgICAgY29uc3QgW3gsIHksIHcsIGhdID0gdGhpcy4jZ2V0SW5pdGlhbEJCb3goKTtcblx0ICAgIHRoaXMuc2V0QXQoeCwgeSwgMCwgMCk7XG5cdCAgICB0aGlzLnNldERpbXModywgaCk7XG5cdCAgICB0aGlzLiNjcmVhdGVDYW52YXMoKTtcblx0ICAgIGlmICh0aGlzLndpZHRoKSB7XG5cdCAgICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcblx0ICAgICAgdGhpcy5zZXRBdChiYXNlWCAqIHBhcmVudFdpZHRoLCBiYXNlWSAqIHBhcmVudEhlaWdodCwgdGhpcy53aWR0aCAqIHBhcmVudFdpZHRoLCB0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG5cdCAgICAgIHRoaXMuI2lzQ2FudmFzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHQgICAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG5cdCAgICAgIHRoaXMuc2V0RGltcyh0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcblx0ICAgICAgdGhpcy4jcmVkcmF3KCk7XG5cdCAgICAgIHRoaXMuI3NldE1pbkRpbXMoKTtcblx0ICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImVkaXRpbmdcIik7XG5cdCAgICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2NyZWF0ZU9ic2VydmVyKCk7XG5cdCAgICByZXR1cm4gdGhpcy5kaXY7XG5cdCAgfVxuXHQgICNzZXRDYW52YXNEaW1zKCkge1xuXHQgICAgaWYgKCF0aGlzLiNpc0NhbnZhc0luaXRpYWxpemVkKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcblx0ICAgIHRoaXMuY2FudmFzLndpZHRoID0gTWF0aC5jZWlsKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCk7XG5cdCAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBNYXRoLmNlaWwodGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuXHQgICAgdGhpcy4jdXBkYXRlVHJhbnNmb3JtKCk7XG5cdCAgfVxuXHQgIHNldERpbWVuc2lvbnMod2lkdGgsIGhlaWdodCkge1xuXHQgICAgY29uc3Qgcm91bmRlZFdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCk7XG5cdCAgICBjb25zdCByb3VuZGVkSGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuXHQgICAgaWYgKHRoaXMuI3JlYWxXaWR0aCA9PT0gcm91bmRlZFdpZHRoICYmIHRoaXMuI3JlYWxIZWlnaHQgPT09IHJvdW5kZWRIZWlnaHQpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jcmVhbFdpZHRoID0gcm91bmRlZFdpZHRoO1xuXHQgICAgdGhpcy4jcmVhbEhlaWdodCA9IHJvdW5kZWRIZWlnaHQ7XG5cdCAgICB0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcblx0ICAgIGlmICh0aGlzLiNhc3BlY3RSYXRpbyAmJiBNYXRoLmFicyh0aGlzLiNhc3BlY3RSYXRpbyAtIHdpZHRoIC8gaGVpZ2h0KSA+IDFlLTIpIHtcblx0ICAgICAgaGVpZ2h0ID0gTWF0aC5jZWlsKHdpZHRoIC8gdGhpcy4jYXNwZWN0UmF0aW8pO1xuXHQgICAgICB0aGlzLnNldERpbXMod2lkdGgsIGhlaWdodCk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG5cdCAgICB0aGlzLndpZHRoID0gd2lkdGggLyBwYXJlbnRXaWR0aDtcblx0ICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0IC8gcGFyZW50SGVpZ2h0O1xuXHQgICAgaWYgKHRoaXMuI2Rpc2FibGVFZGl0aW5nKSB7XG5cdCAgICAgIHRoaXMuI3NldFNjYWxlRmFjdG9yKHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuXHQgICAgdGhpcy4jcmVkcmF3KCk7XG5cdCAgICB0aGlzLmNhbnZhcy5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG5cdCAgICB0aGlzLmZpeERpbXMoKTtcblx0ICB9XG5cdCAgI3NldFNjYWxlRmFjdG9yKHdpZHRoLCBoZWlnaHQpIHtcblx0ICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLiNnZXRQYWRkaW5nKCk7XG5cdCAgICBjb25zdCBzY2FsZUZhY3RvclcgPSAod2lkdGggLSBwYWRkaW5nKSAvIHRoaXMuI2Jhc2VXaWR0aDtcblx0ICAgIGNvbnN0IHNjYWxlRmFjdG9ySCA9IChoZWlnaHQgLSBwYWRkaW5nKSAvIHRoaXMuI2Jhc2VIZWlnaHQ7XG5cdCAgICB0aGlzLnNjYWxlRmFjdG9yID0gTWF0aC5taW4oc2NhbGVGYWN0b3JXLCBzY2FsZUZhY3RvckgpO1xuXHQgIH1cblx0ICAjdXBkYXRlVHJhbnNmb3JtKCkge1xuXHQgICAgY29uc3QgcGFkZGluZyA9IHRoaXMuI2dldFBhZGRpbmcoKSAvIDI7XG5cdCAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0odGhpcy5zY2FsZUZhY3RvciwgMCwgMCwgdGhpcy5zY2FsZUZhY3RvciwgdGhpcy50cmFuc2xhdGlvblggKiB0aGlzLnNjYWxlRmFjdG9yICsgcGFkZGluZywgdGhpcy50cmFuc2xhdGlvblkgKiB0aGlzLnNjYWxlRmFjdG9yICsgcGFkZGluZyk7XG5cdCAgfVxuXHQgIHN0YXRpYyAjYnVpbGRQYXRoMkQoYmV6aWVyKSB7XG5cdCAgICBjb25zdCBwYXRoMkQgPSBuZXcgUGF0aDJEKCk7XG5cdCAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBiZXppZXIubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuXHQgICAgICBjb25zdCBbZmlyc3QsIGNvbnRyb2wxLCBjb250cm9sMiwgc2Vjb25kXSA9IGJlemllcltpXTtcblx0ICAgICAgaWYgKGkgPT09IDApIHtcblx0ICAgICAgICBwYXRoMkQubW92ZVRvKC4uLmZpcnN0KTtcblx0ICAgICAgfVxuXHQgICAgICBwYXRoMkQuYmV6aWVyQ3VydmVUbyhjb250cm9sMVswXSwgY29udHJvbDFbMV0sIGNvbnRyb2wyWzBdLCBjb250cm9sMlsxXSwgc2Vjb25kWzBdLCBzZWNvbmRbMV0pO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHBhdGgyRDtcblx0ICB9XG5cdCAgI3NlcmlhbGl6ZVBhdGhzKHMsIHR4LCB0eSwgaCkge1xuXHQgICAgY29uc3QgTlVNQkVSX09GX1BPSU5UU19PTl9CRVpJRVJfQ1VSVkUgPSA0O1xuXHQgICAgY29uc3QgcGF0aHMgPSBbXTtcblx0ICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLnRoaWNrbmVzcyAvIDI7XG5cdCAgICBsZXQgYnVmZmVyLCBwb2ludHM7XG5cdCAgICBmb3IgKGNvbnN0IGJlemllciBvZiB0aGlzLnBhdGhzKSB7XG5cdCAgICAgIGJ1ZmZlciA9IFtdO1xuXHQgICAgICBwb2ludHMgPSBbXTtcblx0ICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gYmV6aWVyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0ICAgICAgICBjb25zdCBbZmlyc3QsIGNvbnRyb2wxLCBjb250cm9sMiwgc2Vjb25kXSA9IGJlemllcltpXTtcblx0ICAgICAgICBjb25zdCBwMTAgPSBzICogKGZpcnN0WzBdICsgdHgpICsgcGFkZGluZztcblx0ICAgICAgICBjb25zdCBwMTEgPSBoIC0gcyAqIChmaXJzdFsxXSArIHR5KSAtIHBhZGRpbmc7XG5cdCAgICAgICAgY29uc3QgcDIwID0gcyAqIChjb250cm9sMVswXSArIHR4KSArIHBhZGRpbmc7XG5cdCAgICAgICAgY29uc3QgcDIxID0gaCAtIHMgKiAoY29udHJvbDFbMV0gKyB0eSkgLSBwYWRkaW5nO1xuXHQgICAgICAgIGNvbnN0IHAzMCA9IHMgKiAoY29udHJvbDJbMF0gKyB0eCkgKyBwYWRkaW5nO1xuXHQgICAgICAgIGNvbnN0IHAzMSA9IGggLSBzICogKGNvbnRyb2wyWzFdICsgdHkpIC0gcGFkZGluZztcblx0ICAgICAgICBjb25zdCBwNDAgPSBzICogKHNlY29uZFswXSArIHR4KSArIHBhZGRpbmc7XG5cdCAgICAgICAgY29uc3QgcDQxID0gaCAtIHMgKiAoc2Vjb25kWzFdICsgdHkpIC0gcGFkZGluZztcblx0ICAgICAgICBpZiAoaSA9PT0gMCkge1xuXHQgICAgICAgICAgYnVmZmVyLnB1c2gocDEwLCBwMTEpO1xuXHQgICAgICAgICAgcG9pbnRzLnB1c2gocDEwLCBwMTEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBidWZmZXIucHVzaChwMjAsIHAyMSwgcDMwLCBwMzEsIHA0MCwgcDQxKTtcblx0ICAgICAgICB0aGlzLiNleHRyYWN0UG9pbnRzT25CZXppZXIocDEwLCBwMTEsIHAyMCwgcDIxLCBwMzAsIHAzMSwgcDQwLCBwNDEsIE5VTUJFUl9PRl9QT0lOVFNfT05fQkVaSUVSX0NVUlZFLCBwb2ludHMpO1xuXHQgICAgICB9XG5cdCAgICAgIHBhdGhzLnB1c2goe1xuXHQgICAgICAgIGJlemllcjogYnVmZmVyLFxuXHQgICAgICAgIHBvaW50c1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBwYXRocztcblx0ICB9XG5cdCAgI2V4dHJhY3RQb2ludHNPbkJlemllcihwMTAsIHAxMSwgcDIwLCBwMjEsIHAzMCwgcDMxLCBwNDAsIHA0MSwgbiwgcG9pbnRzKSB7XG5cdCAgICBpZiAodGhpcy4jaXNBbG1vc3RGbGF0KHAxMCwgcDExLCBwMjAsIHAyMSwgcDMwLCBwMzEsIHA0MCwgcDQxKSkge1xuXHQgICAgICBwb2ludHMucHVzaChwNDAsIHA0MSk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbiAtIDE7IGkrKykge1xuXHQgICAgICBjb25zdCB0ID0gaSAvIG47XG5cdCAgICAgIGNvbnN0IG10ID0gMSAtIHQ7XG5cdCAgICAgIGxldCBxMTAgPSB0ICogcDEwICsgbXQgKiBwMjA7XG5cdCAgICAgIGxldCBxMTEgPSB0ICogcDExICsgbXQgKiBwMjE7XG5cdCAgICAgIGxldCBxMjAgPSB0ICogcDIwICsgbXQgKiBwMzA7XG5cdCAgICAgIGxldCBxMjEgPSB0ICogcDIxICsgbXQgKiBwMzE7XG5cdCAgICAgIGNvbnN0IHEzMCA9IHQgKiBwMzAgKyBtdCAqIHA0MDtcblx0ICAgICAgY29uc3QgcTMxID0gdCAqIHAzMSArIG10ICogcDQxO1xuXHQgICAgICBxMTAgPSB0ICogcTEwICsgbXQgKiBxMjA7XG5cdCAgICAgIHExMSA9IHQgKiBxMTEgKyBtdCAqIHEyMTtcblx0ICAgICAgcTIwID0gdCAqIHEyMCArIG10ICogcTMwO1xuXHQgICAgICBxMjEgPSB0ICogcTIxICsgbXQgKiBxMzE7XG5cdCAgICAgIHExMCA9IHQgKiBxMTAgKyBtdCAqIHEyMDtcblx0ICAgICAgcTExID0gdCAqIHExMSArIG10ICogcTIxO1xuXHQgICAgICBwb2ludHMucHVzaChxMTAsIHExMSk7XG5cdCAgICB9XG5cdCAgICBwb2ludHMucHVzaChwNDAsIHA0MSk7XG5cdCAgfVxuXHQgICNpc0FsbW9zdEZsYXQocDEwLCBwMTEsIHAyMCwgcDIxLCBwMzAsIHAzMSwgcDQwLCBwNDEpIHtcblx0ICAgIGNvbnN0IHRvbCA9IDEwO1xuXHQgICAgY29uc3QgYXggPSAoMyAqIHAyMCAtIDIgKiBwMTAgLSBwNDApICoqIDI7XG5cdCAgICBjb25zdCBheSA9ICgzICogcDIxIC0gMiAqIHAxMSAtIHA0MSkgKiogMjtcblx0ICAgIGNvbnN0IGJ4ID0gKDMgKiBwMzAgLSBwMTAgLSAyICogcDQwKSAqKiAyO1xuXHQgICAgY29uc3QgYnkgPSAoMyAqIHAzMSAtIHAxMSAtIDIgKiBwNDEpICoqIDI7XG5cdCAgICByZXR1cm4gTWF0aC5tYXgoYXgsIGJ4KSArIE1hdGgubWF4KGF5LCBieSkgPD0gdG9sO1xuXHQgIH1cblx0ICAjZ2V0QmJveCgpIHtcblx0ICAgIGxldCB4TWluID0gSW5maW5pdHk7XG5cdCAgICBsZXQgeE1heCA9IC1JbmZpbml0eTtcblx0ICAgIGxldCB5TWluID0gSW5maW5pdHk7XG5cdCAgICBsZXQgeU1heCA9IC1JbmZpbml0eTtcblx0ICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLnBhdGhzKSB7XG5cdCAgICAgIGZvciAoY29uc3QgW2ZpcnN0LCBjb250cm9sMSwgY29udHJvbDIsIHNlY29uZF0gb2YgcGF0aCkge1xuXHQgICAgICAgIGNvbnN0IGJib3ggPSBfdXRpbC5VdGlsLmJlemllckJvdW5kaW5nQm94KC4uLmZpcnN0LCAuLi5jb250cm9sMSwgLi4uY29udHJvbDIsIC4uLnNlY29uZCk7XG5cdCAgICAgICAgeE1pbiA9IE1hdGgubWluKHhNaW4sIGJib3hbMF0pO1xuXHQgICAgICAgIHlNaW4gPSBNYXRoLm1pbih5TWluLCBiYm94WzFdKTtcblx0ICAgICAgICB4TWF4ID0gTWF0aC5tYXgoeE1heCwgYmJveFsyXSk7XG5cdCAgICAgICAgeU1heCA9IE1hdGgubWF4KHlNYXgsIGJib3hbM10pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gW3hNaW4sIHlNaW4sIHhNYXgsIHlNYXhdO1xuXHQgIH1cblx0ICAjZ2V0UGFkZGluZygpIHtcblx0ICAgIHJldHVybiB0aGlzLiNkaXNhYmxlRWRpdGluZyA/IE1hdGguY2VpbCh0aGlzLnRoaWNrbmVzcyAqIHRoaXMucGFyZW50U2NhbGUpIDogMDtcblx0ICB9XG5cdCAgI2ZpdFRvQ29udGVudChmaXJzdFRpbWUgPSBmYWxzZSkge1xuXHQgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICghdGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcblx0ICAgICAgdGhpcy4jcmVkcmF3KCk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGJib3ggPSB0aGlzLiNnZXRCYm94KCk7XG5cdCAgICBjb25zdCBwYWRkaW5nID0gdGhpcy4jZ2V0UGFkZGluZygpO1xuXHQgICAgdGhpcy4jYmFzZVdpZHRoID0gTWF0aC5tYXgoUkVTSVpFUl9TSVpFLCBiYm94WzJdIC0gYmJveFswXSk7XG5cdCAgICB0aGlzLiNiYXNlSGVpZ2h0ID0gTWF0aC5tYXgoUkVTSVpFUl9TSVpFLCBiYm94WzNdIC0gYmJveFsxXSk7XG5cdCAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy4jYmFzZVdpZHRoICogdGhpcy5zY2FsZUZhY3Rvcik7XG5cdCAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmNlaWwocGFkZGluZyArIHRoaXMuI2Jhc2VIZWlnaHQgKiB0aGlzLnNjYWxlRmFjdG9yKTtcblx0ICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcblx0ICAgIHRoaXMud2lkdGggPSB3aWR0aCAvIHBhcmVudFdpZHRoO1xuXHQgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgLyBwYXJlbnRIZWlnaHQ7XG5cdCAgICB0aGlzLiNhc3BlY3RSYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xuXHQgICAgdGhpcy4jc2V0TWluRGltcygpO1xuXHQgICAgY29uc3QgcHJldlRyYW5zbGF0aW9uWCA9IHRoaXMudHJhbnNsYXRpb25YO1xuXHQgICAgY29uc3QgcHJldlRyYW5zbGF0aW9uWSA9IHRoaXMudHJhbnNsYXRpb25ZO1xuXHQgICAgdGhpcy50cmFuc2xhdGlvblggPSAtYmJveFswXTtcblx0ICAgIHRoaXMudHJhbnNsYXRpb25ZID0gLWJib3hbMV07XG5cdCAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG5cdCAgICB0aGlzLiNyZWRyYXcoKTtcblx0ICAgIHRoaXMuI3JlYWxXaWR0aCA9IHdpZHRoO1xuXHQgICAgdGhpcy4jcmVhbEhlaWdodCA9IGhlaWdodDtcblx0ICAgIHRoaXMuc2V0RGltcyh3aWR0aCwgaGVpZ2h0KTtcblx0ICAgIGNvbnN0IHVuc2NhbGVkUGFkZGluZyA9IGZpcnN0VGltZSA/IHBhZGRpbmcgLyB0aGlzLnNjYWxlRmFjdG9yIC8gMiA6IDA7XG5cdCAgICB0aGlzLnRyYW5zbGF0ZShwcmV2VHJhbnNsYXRpb25YIC0gdGhpcy50cmFuc2xhdGlvblggLSB1bnNjYWxlZFBhZGRpbmcsIHByZXZUcmFuc2xhdGlvblkgLSB0aGlzLnRyYW5zbGF0aW9uWSAtIHVuc2NhbGVkUGFkZGluZyk7XG5cdCAgfVxuXHQgICNzZXRNaW5EaW1zKCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBzdHlsZVxuXHQgICAgfSA9IHRoaXMuZGl2O1xuXHQgICAgaWYgKHRoaXMuI2FzcGVjdFJhdGlvID49IDEpIHtcblx0ICAgICAgc3R5bGUubWluSGVpZ2h0ID0gYCR7UkVTSVpFUl9TSVpFfXB4YDtcblx0ICAgICAgc3R5bGUubWluV2lkdGggPSBgJHtNYXRoLnJvdW5kKHRoaXMuI2FzcGVjdFJhdGlvICogUkVTSVpFUl9TSVpFKX1weGA7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBzdHlsZS5taW5XaWR0aCA9IGAke1JFU0laRVJfU0laRX1weGA7XG5cdCAgICAgIHN0eWxlLm1pbkhlaWdodCA9IGAke01hdGgucm91bmQoUkVTSVpFUl9TSVpFIC8gdGhpcy4jYXNwZWN0UmF0aW8pfXB4YDtcblx0ICAgIH1cblx0ICB9XG5cdCAgc3RhdGljIGRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKSB7XG5cdCAgICBjb25zdCBlZGl0b3IgPSBzdXBlci5kZXNlcmlhbGl6ZShkYXRhLCBwYXJlbnQsIHVpTWFuYWdlcik7XG5cdCAgICBlZGl0b3IudGhpY2tuZXNzID0gZGF0YS50aGlja25lc3M7XG5cdCAgICBlZGl0b3IuY29sb3IgPSBfdXRpbC5VdGlsLm1ha2VIZXhDb2xvciguLi5kYXRhLmNvbG9yKTtcblx0ICAgIGVkaXRvci5vcGFjaXR5ID0gZGF0YS5vcGFjaXR5O1xuXHQgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSBlZGl0b3IucGFnZURpbWVuc2lvbnM7XG5cdCAgICBjb25zdCB3aWR0aCA9IGVkaXRvci53aWR0aCAqIHBhZ2VXaWR0aDtcblx0ICAgIGNvbnN0IGhlaWdodCA9IGVkaXRvci5oZWlnaHQgKiBwYWdlSGVpZ2h0O1xuXHQgICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBlZGl0b3IucGFyZW50U2NhbGU7XG5cdCAgICBjb25zdCBwYWRkaW5nID0gZGF0YS50aGlja25lc3MgLyAyO1xuXHQgICAgZWRpdG9yLiNhc3BlY3RSYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xuXHQgICAgZWRpdG9yLiNkaXNhYmxlRWRpdGluZyA9IHRydWU7XG5cdCAgICBlZGl0b3IuI3JlYWxXaWR0aCA9IE1hdGgucm91bmQod2lkdGgpO1xuXHQgICAgZWRpdG9yLiNyZWFsSGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQpO1xuXHQgICAgZm9yIChjb25zdCB7XG5cdCAgICAgIGJlemllclxuXHQgICAgfSBvZiBkYXRhLnBhdGhzKSB7XG5cdCAgICAgIGNvbnN0IHBhdGggPSBbXTtcblx0ICAgICAgZWRpdG9yLnBhdGhzLnB1c2gocGF0aCk7XG5cdCAgICAgIGxldCBwMCA9IHNjYWxlRmFjdG9yICogKGJlemllclswXSAtIHBhZGRpbmcpO1xuXHQgICAgICBsZXQgcDEgPSBzY2FsZUZhY3RvciAqIChoZWlnaHQgLSBiZXppZXJbMV0gLSBwYWRkaW5nKTtcblx0ICAgICAgZm9yIChsZXQgaSA9IDIsIGlpID0gYmV6aWVyLmxlbmd0aDsgaSA8IGlpOyBpICs9IDYpIHtcblx0ICAgICAgICBjb25zdCBwMTAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaV0gLSBwYWRkaW5nKTtcblx0ICAgICAgICBjb25zdCBwMTEgPSBzY2FsZUZhY3RvciAqIChoZWlnaHQgLSBiZXppZXJbaSArIDFdIC0gcGFkZGluZyk7XG5cdCAgICAgICAgY29uc3QgcDIwID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyW2kgKyAyXSAtIHBhZGRpbmcpO1xuXHQgICAgICAgIGNvbnN0IHAyMSA9IHNjYWxlRmFjdG9yICogKGhlaWdodCAtIGJlemllcltpICsgM10gLSBwYWRkaW5nKTtcblx0ICAgICAgICBjb25zdCBwMzAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDRdIC0gcGFkZGluZyk7XG5cdCAgICAgICAgY29uc3QgcDMxID0gc2NhbGVGYWN0b3IgKiAoaGVpZ2h0IC0gYmV6aWVyW2kgKyA1XSAtIHBhZGRpbmcpO1xuXHQgICAgICAgIHBhdGgucHVzaChbW3AwLCBwMV0sIFtwMTAsIHAxMV0sIFtwMjAsIHAyMV0sIFtwMzAsIHAzMV1dKTtcblx0ICAgICAgICBwMCA9IHAzMDtcblx0ICAgICAgICBwMSA9IHAzMTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBwYXRoMkQgPSB0aGlzLiNidWlsZFBhdGgyRChwYXRoKTtcblx0ICAgICAgZWRpdG9yLmJlemllclBhdGgyRC5wdXNoKHBhdGgyRCk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBiYm94ID0gZWRpdG9yLiNnZXRCYm94KCk7XG5cdCAgICBlZGl0b3IuI2Jhc2VXaWR0aCA9IE1hdGgubWF4KFJFU0laRVJfU0laRSwgYmJveFsyXSAtIGJib3hbMF0pO1xuXHQgICAgZWRpdG9yLiNiYXNlSGVpZ2h0ID0gTWF0aC5tYXgoUkVTSVpFUl9TSVpFLCBiYm94WzNdIC0gYmJveFsxXSk7XG5cdCAgICBlZGl0b3IuI3NldFNjYWxlRmFjdG9yKHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgcmV0dXJuIGVkaXRvcjtcblx0ICB9XG5cdCAgc2VyaWFsaXplKCkge1xuXHQgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0UmVjdCgwLCAwKTtcblx0ICAgIGNvbnN0IGhlaWdodCA9IHRoaXMucm90YXRpb24gJSAxODAgPT09IDAgPyByZWN0WzNdIC0gcmVjdFsxXSA6IHJlY3RbMl0gLSByZWN0WzBdO1xuXHQgICAgY29uc3QgY29sb3IgPSBfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuX2NvbG9yTWFuYWdlci5jb252ZXJ0KHRoaXMuY3R4LnN0cm9rZVN0eWxlKTtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFubm90YXRpb25UeXBlOiBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5JTkssXG5cdCAgICAgIGNvbG9yLFxuXHQgICAgICB0aGlja25lc3M6IHRoaXMudGhpY2tuZXNzLFxuXHQgICAgICBvcGFjaXR5OiB0aGlzLm9wYWNpdHksXG5cdCAgICAgIHBhdGhzOiB0aGlzLiNzZXJpYWxpemVQYXRocyh0aGlzLnNjYWxlRmFjdG9yIC8gdGhpcy5wYXJlbnRTY2FsZSwgdGhpcy50cmFuc2xhdGlvblgsIHRoaXMudHJhbnNsYXRpb25ZLCBoZWlnaHQpLFxuXHQgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuXHQgICAgICByZWN0LFxuXHQgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvblxuXHQgICAgfTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5JbmtFZGl0b3IgPSBJbmtFZGl0b3I7XG5cblx0LyoqKi8gfSksXG5cdC8qIDMwICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5maXRDdXJ2ZSA9IHZvaWQgMDtcblx0Y29uc3QgZml0Q3VydmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMxKTtcblx0ZXhwb3J0cy5maXRDdXJ2ZSA9IGZpdEN1cnZlO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAzMSAqL1xuXHQvKioqLyAoKG1vZHVsZSkgPT4ge1xuXG5cblxuXHRmdW5jdGlvbiBmaXRDdXJ2ZShwb2ludHMsIG1heEVycm9yLCBwcm9ncmVzc0NhbGxiYWNrKSB7XG5cdCAgaWYgKCFBcnJheS5pc0FycmF5KHBvaW50cykpIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXlcIik7XG5cdCAgfVxuXHQgIHBvaW50cy5mb3JFYWNoKHBvaW50ID0+IHtcblx0ICAgIGlmICghQXJyYXkuaXNBcnJheShwb2ludCkgfHwgcG9pbnQuc29tZShpdGVtID0+IHR5cGVvZiBpdGVtICE9PSAnbnVtYmVyJykgfHwgcG9pbnQubGVuZ3RoICE9PSBwb2ludHNbMF0ubGVuZ3RoKSB7XG5cdCAgICAgIHRocm93IEVycm9yKFwiRWFjaCBwb2ludCBzaG91bGQgYmUgYW4gYXJyYXkgb2YgbnVtYmVycy4gRWFjaCBwb2ludCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBhbW91bnQgb2YgbnVtYmVycy5cIik7XG5cdCAgICB9XG5cdCAgfSk7XG5cdCAgcG9pbnRzID0gcG9pbnRzLmZpbHRlcigocG9pbnQsIGkpID0+IGkgPT09IDAgfHwgIXBvaW50LmV2ZXJ5KCh2YWwsIGopID0+IHZhbCA9PT0gcG9pbnRzW2kgLSAxXVtqXSkpO1xuXHQgIGlmIChwb2ludHMubGVuZ3RoIDwgMikge1xuXHQgICAgcmV0dXJuIFtdO1xuXHQgIH1cblx0ICBjb25zdCBsZW4gPSBwb2ludHMubGVuZ3RoO1xuXHQgIGNvbnN0IGxlZnRUYW5nZW50ID0gY3JlYXRlVGFuZ2VudChwb2ludHNbMV0sIHBvaW50c1swXSk7XG5cdCAgY29uc3QgcmlnaHRUYW5nZW50ID0gY3JlYXRlVGFuZ2VudChwb2ludHNbbGVuIC0gMl0sIHBvaW50c1tsZW4gLSAxXSk7XG5cdCAgcmV0dXJuIGZpdEN1YmljKHBvaW50cywgbGVmdFRhbmdlbnQsIHJpZ2h0VGFuZ2VudCwgbWF4RXJyb3IsIHByb2dyZXNzQ2FsbGJhY2spO1xuXHR9XG5cdGZ1bmN0aW9uIGZpdEN1YmljKHBvaW50cywgbGVmdFRhbmdlbnQsIHJpZ2h0VGFuZ2VudCwgZXJyb3IsIHByb2dyZXNzQ2FsbGJhY2spIHtcblx0ICBjb25zdCBNYXhJdGVyYXRpb25zID0gMjA7XG5cdCAgdmFyIGJlekN1cnZlLCB1LCB1UHJpbWUsIG1heEVycm9yLCBwcmV2RXJyLCBzcGxpdFBvaW50LCBwcmV2U3BsaXQsIGNlbnRlclZlY3RvciwgdG9DZW50ZXJUYW5nZW50LCBmcm9tQ2VudGVyVGFuZ2VudCwgYmV6aWVycywgZGlzdCwgaTtcblx0ICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMikge1xuXHQgICAgZGlzdCA9IG1hdGhzLnZlY3RvckxlbihtYXRocy5zdWJ0cmFjdChwb2ludHNbMF0sIHBvaW50c1sxXSkpIC8gMy4wO1xuXHQgICAgYmV6Q3VydmUgPSBbcG9pbnRzWzBdLCBtYXRocy5hZGRBcnJheXMocG9pbnRzWzBdLCBtYXRocy5tdWxJdGVtcyhsZWZ0VGFuZ2VudCwgZGlzdCkpLCBtYXRocy5hZGRBcnJheXMocG9pbnRzWzFdLCBtYXRocy5tdWxJdGVtcyhyaWdodFRhbmdlbnQsIGRpc3QpKSwgcG9pbnRzWzFdXTtcblx0ICAgIHJldHVybiBbYmV6Q3VydmVdO1xuXHQgIH1cblx0ICB1ID0gY2hvcmRMZW5ndGhQYXJhbWV0ZXJpemUocG9pbnRzKTtcblx0ICBbYmV6Q3VydmUsIG1heEVycm9yLCBzcGxpdFBvaW50XSA9IGdlbmVyYXRlQW5kUmVwb3J0KHBvaW50cywgdSwgdSwgbGVmdFRhbmdlbnQsIHJpZ2h0VGFuZ2VudCwgcHJvZ3Jlc3NDYWxsYmFjayk7XG5cdCAgaWYgKG1heEVycm9yID09PSAwIHx8IG1heEVycm9yIDwgZXJyb3IpIHtcblx0ICAgIHJldHVybiBbYmV6Q3VydmVdO1xuXHQgIH1cblx0ICBpZiAobWF4RXJyb3IgPCBlcnJvciAqIGVycm9yKSB7XG5cdCAgICB1UHJpbWUgPSB1O1xuXHQgICAgcHJldkVyciA9IG1heEVycm9yO1xuXHQgICAgcHJldlNwbGl0ID0gc3BsaXRQb2ludDtcblx0ICAgIGZvciAoaSA9IDA7IGkgPCBNYXhJdGVyYXRpb25zOyBpKyspIHtcblx0ICAgICAgdVByaW1lID0gcmVwYXJhbWV0ZXJpemUoYmV6Q3VydmUsIHBvaW50cywgdVByaW1lKTtcblx0ICAgICAgW2JlekN1cnZlLCBtYXhFcnJvciwgc3BsaXRQb2ludF0gPSBnZW5lcmF0ZUFuZFJlcG9ydChwb2ludHMsIHUsIHVQcmltZSwgbGVmdFRhbmdlbnQsIHJpZ2h0VGFuZ2VudCwgcHJvZ3Jlc3NDYWxsYmFjayk7XG5cdCAgICAgIGlmIChtYXhFcnJvciA8IGVycm9yKSB7XG5cdCAgICAgICAgcmV0dXJuIFtiZXpDdXJ2ZV07XG5cdCAgICAgIH0gZWxzZSBpZiAoc3BsaXRQb2ludCA9PT0gcHJldlNwbGl0KSB7XG5cdCAgICAgICAgbGV0IGVyckNoYW5nZSA9IG1heEVycm9yIC8gcHJldkVycjtcblx0ICAgICAgICBpZiAoZXJyQ2hhbmdlID4gLjk5OTkgJiYgZXJyQ2hhbmdlIDwgMS4wMDAxKSB7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcHJldkVyciA9IG1heEVycm9yO1xuXHQgICAgICBwcmV2U3BsaXQgPSBzcGxpdFBvaW50O1xuXHQgICAgfVxuXHQgIH1cblx0ICBiZXppZXJzID0gW107XG5cdCAgY2VudGVyVmVjdG9yID0gbWF0aHMuc3VidHJhY3QocG9pbnRzW3NwbGl0UG9pbnQgLSAxXSwgcG9pbnRzW3NwbGl0UG9pbnQgKyAxXSk7XG5cdCAgaWYgKGNlbnRlclZlY3Rvci5ldmVyeSh2YWwgPT4gdmFsID09PSAwKSkge1xuXHQgICAgY2VudGVyVmVjdG9yID0gbWF0aHMuc3VidHJhY3QocG9pbnRzW3NwbGl0UG9pbnQgLSAxXSwgcG9pbnRzW3NwbGl0UG9pbnRdKTtcblx0ICAgIFtjZW50ZXJWZWN0b3JbMF0sIGNlbnRlclZlY3RvclsxXV0gPSBbLWNlbnRlclZlY3RvclsxXSwgY2VudGVyVmVjdG9yWzBdXTtcblx0ICB9XG5cdCAgdG9DZW50ZXJUYW5nZW50ID0gbWF0aHMubm9ybWFsaXplKGNlbnRlclZlY3Rvcik7XG5cdCAgZnJvbUNlbnRlclRhbmdlbnQgPSBtYXRocy5tdWxJdGVtcyh0b0NlbnRlclRhbmdlbnQsIC0xKTtcblx0ICBiZXppZXJzID0gYmV6aWVycy5jb25jYXQoZml0Q3ViaWMocG9pbnRzLnNsaWNlKDAsIHNwbGl0UG9pbnQgKyAxKSwgbGVmdFRhbmdlbnQsIHRvQ2VudGVyVGFuZ2VudCwgZXJyb3IsIHByb2dyZXNzQ2FsbGJhY2spKTtcblx0ICBiZXppZXJzID0gYmV6aWVycy5jb25jYXQoZml0Q3ViaWMocG9pbnRzLnNsaWNlKHNwbGl0UG9pbnQpLCBmcm9tQ2VudGVyVGFuZ2VudCwgcmlnaHRUYW5nZW50LCBlcnJvciwgcHJvZ3Jlc3NDYWxsYmFjaykpO1xuXHQgIHJldHVybiBiZXppZXJzO1xuXHR9XG5cdGZ1bmN0aW9uIGdlbmVyYXRlQW5kUmVwb3J0KHBvaW50cywgcGFyYW1zT3JpZywgcGFyYW1zUHJpbWUsIGxlZnRUYW5nZW50LCByaWdodFRhbmdlbnQsIHByb2dyZXNzQ2FsbGJhY2spIHtcblx0ICB2YXIgYmV6Q3VydmUsIG1heEVycm9yLCBzcGxpdFBvaW50O1xuXHQgIGJlekN1cnZlID0gZ2VuZXJhdGVCZXppZXIocG9pbnRzLCBwYXJhbXNQcmltZSwgbGVmdFRhbmdlbnQsIHJpZ2h0VGFuZ2VudCk7XG5cdCAgW21heEVycm9yLCBzcGxpdFBvaW50XSA9IGNvbXB1dGVNYXhFcnJvcihwb2ludHMsIGJlekN1cnZlLCBwYXJhbXNPcmlnKTtcblx0ICBpZiAocHJvZ3Jlc3NDYWxsYmFjaykge1xuXHQgICAgcHJvZ3Jlc3NDYWxsYmFjayh7XG5cdCAgICAgIGJlejogYmV6Q3VydmUsXG5cdCAgICAgIHBvaW50czogcG9pbnRzLFxuXHQgICAgICBwYXJhbXM6IHBhcmFtc09yaWcsXG5cdCAgICAgIG1heEVycjogbWF4RXJyb3IsXG5cdCAgICAgIG1heFBvaW50OiBzcGxpdFBvaW50XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmV0dXJuIFtiZXpDdXJ2ZSwgbWF4RXJyb3IsIHNwbGl0UG9pbnRdO1xuXHR9XG5cdGZ1bmN0aW9uIGdlbmVyYXRlQmV6aWVyKHBvaW50cywgcGFyYW1ldGVycywgbGVmdFRhbmdlbnQsIHJpZ2h0VGFuZ2VudCkge1xuXHQgIHZhciBiZXpDdXJ2ZSxcblx0ICAgIEEsXG5cdCAgICBhLFxuXHQgICAgQyxcblx0ICAgIFgsXG5cdCAgICBkZXRfQzBfQzEsXG5cdCAgICBkZXRfQzBfWCxcblx0ICAgIGRldF9YX0MxLFxuXHQgICAgYWxwaGFfbCxcblx0ICAgIGFscGhhX3IsXG5cdCAgICBlcHNpbG9uLFxuXHQgICAgc2VnTGVuZ3RoLFxuXHQgICAgaSxcblx0ICAgIGxlbixcblx0ICAgIHRtcCxcblx0ICAgIHUsXG5cdCAgICB1eCxcblx0ICAgIGZpcnN0UG9pbnQgPSBwb2ludHNbMF0sXG5cdCAgICBsYXN0UG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuXHQgIGJlekN1cnZlID0gW2ZpcnN0UG9pbnQsIG51bGwsIG51bGwsIGxhc3RQb2ludF07XG5cdCAgQSA9IG1hdGhzLnplcm9zX1h4MngyKHBhcmFtZXRlcnMubGVuZ3RoKTtcblx0ICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJhbWV0ZXJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICB1ID0gcGFyYW1ldGVyc1tpXTtcblx0ICAgIHV4ID0gMSAtIHU7XG5cdCAgICBhID0gQVtpXTtcblx0ICAgIGFbMF0gPSBtYXRocy5tdWxJdGVtcyhsZWZ0VGFuZ2VudCwgMyAqIHUgKiAodXggKiB1eCkpO1xuXHQgICAgYVsxXSA9IG1hdGhzLm11bEl0ZW1zKHJpZ2h0VGFuZ2VudCwgMyAqIHV4ICogKHUgKiB1KSk7XG5cdCAgfVxuXHQgIEMgPSBbWzAsIDBdLCBbMCwgMF1dO1xuXHQgIFggPSBbMCwgMF07XG5cdCAgZm9yIChpID0gMCwgbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICB1ID0gcGFyYW1ldGVyc1tpXTtcblx0ICAgIGEgPSBBW2ldO1xuXHQgICAgQ1swXVswXSArPSBtYXRocy5kb3QoYVswXSwgYVswXSk7XG5cdCAgICBDWzBdWzFdICs9IG1hdGhzLmRvdChhWzBdLCBhWzFdKTtcblx0ICAgIENbMV1bMF0gKz0gbWF0aHMuZG90KGFbMF0sIGFbMV0pO1xuXHQgICAgQ1sxXVsxXSArPSBtYXRocy5kb3QoYVsxXSwgYVsxXSk7XG5cdCAgICB0bXAgPSBtYXRocy5zdWJ0cmFjdChwb2ludHNbaV0sIGJlemllci5xKFtmaXJzdFBvaW50LCBmaXJzdFBvaW50LCBsYXN0UG9pbnQsIGxhc3RQb2ludF0sIHUpKTtcblx0ICAgIFhbMF0gKz0gbWF0aHMuZG90KGFbMF0sIHRtcCk7XG5cdCAgICBYWzFdICs9IG1hdGhzLmRvdChhWzFdLCB0bXApO1xuXHQgIH1cblx0ICBkZXRfQzBfQzEgPSBDWzBdWzBdICogQ1sxXVsxXSAtIENbMV1bMF0gKiBDWzBdWzFdO1xuXHQgIGRldF9DMF9YID0gQ1swXVswXSAqIFhbMV0gLSBDWzFdWzBdICogWFswXTtcblx0ICBkZXRfWF9DMSA9IFhbMF0gKiBDWzFdWzFdIC0gWFsxXSAqIENbMF1bMV07XG5cdCAgYWxwaGFfbCA9IGRldF9DMF9DMSA9PT0gMCA/IDAgOiBkZXRfWF9DMSAvIGRldF9DMF9DMTtcblx0ICBhbHBoYV9yID0gZGV0X0MwX0MxID09PSAwID8gMCA6IGRldF9DMF9YIC8gZGV0X0MwX0MxO1xuXHQgIHNlZ0xlbmd0aCA9IG1hdGhzLnZlY3RvckxlbihtYXRocy5zdWJ0cmFjdChmaXJzdFBvaW50LCBsYXN0UG9pbnQpKTtcblx0ICBlcHNpbG9uID0gMS4wZS02ICogc2VnTGVuZ3RoO1xuXHQgIGlmIChhbHBoYV9sIDwgZXBzaWxvbiB8fCBhbHBoYV9yIDwgZXBzaWxvbikge1xuXHQgICAgYmV6Q3VydmVbMV0gPSBtYXRocy5hZGRBcnJheXMoZmlyc3RQb2ludCwgbWF0aHMubXVsSXRlbXMobGVmdFRhbmdlbnQsIHNlZ0xlbmd0aCAvIDMuMCkpO1xuXHQgICAgYmV6Q3VydmVbMl0gPSBtYXRocy5hZGRBcnJheXMobGFzdFBvaW50LCBtYXRocy5tdWxJdGVtcyhyaWdodFRhbmdlbnQsIHNlZ0xlbmd0aCAvIDMuMCkpO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBiZXpDdXJ2ZVsxXSA9IG1hdGhzLmFkZEFycmF5cyhmaXJzdFBvaW50LCBtYXRocy5tdWxJdGVtcyhsZWZ0VGFuZ2VudCwgYWxwaGFfbCkpO1xuXHQgICAgYmV6Q3VydmVbMl0gPSBtYXRocy5hZGRBcnJheXMobGFzdFBvaW50LCBtYXRocy5tdWxJdGVtcyhyaWdodFRhbmdlbnQsIGFscGhhX3IpKTtcblx0ICB9XG5cdCAgcmV0dXJuIGJlekN1cnZlO1xuXHR9XG5cdGZ1bmN0aW9uIHJlcGFyYW1ldGVyaXplKGJlemllciwgcG9pbnRzLCBwYXJhbWV0ZXJzKSB7XG5cdCAgcmV0dXJuIHBhcmFtZXRlcnMubWFwKChwLCBpKSA9PiBuZXd0b25SYXBoc29uUm9vdEZpbmQoYmV6aWVyLCBwb2ludHNbaV0sIHApKTtcblx0fVxuXHRmdW5jdGlvbiBuZXd0b25SYXBoc29uUm9vdEZpbmQoYmV6LCBwb2ludCwgdSkge1xuXHQgIHZhciBkID0gbWF0aHMuc3VidHJhY3QoYmV6aWVyLnEoYmV6LCB1KSwgcG9pbnQpLFxuXHQgICAgcXByaW1lID0gYmV6aWVyLnFwcmltZShiZXosIHUpLFxuXHQgICAgbnVtZXJhdG9yID0gbWF0aHMubXVsTWF0cml4KGQsIHFwcmltZSksXG5cdCAgICBkZW5vbWluYXRvciA9IG1hdGhzLnN1bShtYXRocy5zcXVhcmVJdGVtcyhxcHJpbWUpKSArIDIgKiBtYXRocy5tdWxNYXRyaXgoZCwgYmV6aWVyLnFwcmltZXByaW1lKGJleiwgdSkpO1xuXHQgIGlmIChkZW5vbWluYXRvciA9PT0gMCkge1xuXHQgICAgcmV0dXJuIHU7XG5cdCAgfSBlbHNlIHtcblx0ICAgIHJldHVybiB1IC0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGNob3JkTGVuZ3RoUGFyYW1ldGVyaXplKHBvaW50cykge1xuXHQgIHZhciB1ID0gW10sXG5cdCAgICBjdXJyVSxcblx0ICAgIHByZXZVLFxuXHQgICAgcHJldlA7XG5cdCAgcG9pbnRzLmZvckVhY2goKHAsIGkpID0+IHtcblx0ICAgIGN1cnJVID0gaSA/IHByZXZVICsgbWF0aHMudmVjdG9yTGVuKG1hdGhzLnN1YnRyYWN0KHAsIHByZXZQKSkgOiAwO1xuXHQgICAgdS5wdXNoKGN1cnJVKTtcblx0ICAgIHByZXZVID0gY3VyclU7XG5cdCAgICBwcmV2UCA9IHA7XG5cdCAgfSk7XG5cdCAgdSA9IHUubWFwKHggPT4geCAvIHByZXZVKTtcblx0ICByZXR1cm4gdTtcblx0fVxuXHRmdW5jdGlvbiBjb21wdXRlTWF4RXJyb3IocG9pbnRzLCBiZXosIHBhcmFtZXRlcnMpIHtcblx0ICB2YXIgZGlzdCwgbWF4RGlzdCwgc3BsaXRQb2ludCwgdiwgaSwgY291bnQsIHBvaW50LCB0O1xuXHQgIG1heERpc3QgPSAwO1xuXHQgIHNwbGl0UG9pbnQgPSBNYXRoLmZsb29yKHBvaW50cy5sZW5ndGggLyAyKTtcblx0ICBjb25zdCB0X2Rpc3RNYXAgPSBtYXBUdG9SZWxhdGl2ZURpc3RhbmNlcyhiZXosIDEwKTtcblx0ICBmb3IgKGkgPSAwLCBjb3VudCA9IHBvaW50cy5sZW5ndGg7IGkgPCBjb3VudDsgaSsrKSB7XG5cdCAgICBwb2ludCA9IHBvaW50c1tpXTtcblx0ICAgIHQgPSBmaW5kX3QoYmV6LCBwYXJhbWV0ZXJzW2ldLCB0X2Rpc3RNYXAsIDEwKTtcblx0ICAgIHYgPSBtYXRocy5zdWJ0cmFjdChiZXppZXIucShiZXosIHQpLCBwb2ludCk7XG5cdCAgICBkaXN0ID0gdlswXSAqIHZbMF0gKyB2WzFdICogdlsxXTtcblx0ICAgIGlmIChkaXN0ID4gbWF4RGlzdCkge1xuXHQgICAgICBtYXhEaXN0ID0gZGlzdDtcblx0ICAgICAgc3BsaXRQb2ludCA9IGk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiBbbWF4RGlzdCwgc3BsaXRQb2ludF07XG5cdH1cblx0dmFyIG1hcFR0b1JlbGF0aXZlRGlzdGFuY2VzID0gZnVuY3Rpb24gKGJleiwgQl9wYXJ0cykge1xuXHQgIHZhciBCX3RfY3Vycjtcblx0ICB2YXIgQl90X2Rpc3QgPSBbMF07XG5cdCAgdmFyIEJfdF9wcmV2ID0gYmV6WzBdO1xuXHQgIHZhciBzdW1MZW4gPSAwO1xuXHQgIGZvciAodmFyIGkgPSAxOyBpIDw9IEJfcGFydHM7IGkrKykge1xuXHQgICAgQl90X2N1cnIgPSBiZXppZXIucShiZXosIGkgLyBCX3BhcnRzKTtcblx0ICAgIHN1bUxlbiArPSBtYXRocy52ZWN0b3JMZW4obWF0aHMuc3VidHJhY3QoQl90X2N1cnIsIEJfdF9wcmV2KSk7XG5cdCAgICBCX3RfZGlzdC5wdXNoKHN1bUxlbik7XG5cdCAgICBCX3RfcHJldiA9IEJfdF9jdXJyO1xuXHQgIH1cblx0ICBCX3RfZGlzdCA9IEJfdF9kaXN0Lm1hcCh4ID0+IHggLyBzdW1MZW4pO1xuXHQgIHJldHVybiBCX3RfZGlzdDtcblx0fTtcblx0ZnVuY3Rpb24gZmluZF90KGJleiwgcGFyYW0sIHRfZGlzdE1hcCwgQl9wYXJ0cykge1xuXHQgIGlmIChwYXJhbSA8IDApIHtcblx0ICAgIHJldHVybiAwO1xuXHQgIH1cblx0ICBpZiAocGFyYW0gPiAxKSB7XG5cdCAgICByZXR1cm4gMTtcblx0ICB9XG5cdCAgdmFyIGxlbk1heCwgbGVuTWluLCB0TWF4LCB0TWluLCB0O1xuXHQgIGZvciAodmFyIGkgPSAxOyBpIDw9IEJfcGFydHM7IGkrKykge1xuXHQgICAgaWYgKHBhcmFtIDw9IHRfZGlzdE1hcFtpXSkge1xuXHQgICAgICB0TWluID0gKGkgLSAxKSAvIEJfcGFydHM7XG5cdCAgICAgIHRNYXggPSBpIC8gQl9wYXJ0cztcblx0ICAgICAgbGVuTWluID0gdF9kaXN0TWFwW2kgLSAxXTtcblx0ICAgICAgbGVuTWF4ID0gdF9kaXN0TWFwW2ldO1xuXHQgICAgICB0ID0gKHBhcmFtIC0gbGVuTWluKSAvIChsZW5NYXggLSBsZW5NaW4pICogKHRNYXggLSB0TWluKSArIHRNaW47XG5cdCAgICAgIGJyZWFrO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gdDtcblx0fVxuXHRmdW5jdGlvbiBjcmVhdGVUYW5nZW50KHBvaW50QSwgcG9pbnRCKSB7XG5cdCAgcmV0dXJuIG1hdGhzLm5vcm1hbGl6ZShtYXRocy5zdWJ0cmFjdChwb2ludEEsIHBvaW50QikpO1xuXHR9XG5cdGNsYXNzIG1hdGhzIHtcblx0ICBzdGF0aWMgemVyb3NfWHgyeDIoeCkge1xuXHQgICAgdmFyIHpzID0gW107XG5cdCAgICB3aGlsZSAoeC0tKSB7XG5cdCAgICAgIHpzLnB1c2goWzAsIDBdKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB6cztcblx0ICB9XG5cdCAgc3RhdGljIG11bEl0ZW1zKGl0ZW1zLCBtdWx0aXBsaWVyKSB7XG5cdCAgICByZXR1cm4gaXRlbXMubWFwKHggPT4geCAqIG11bHRpcGxpZXIpO1xuXHQgIH1cblx0ICBzdGF0aWMgbXVsTWF0cml4KG0xLCBtMikge1xuXHQgICAgcmV0dXJuIG0xLnJlZHVjZSgoc3VtLCB4MSwgaSkgPT4gc3VtICsgeDEgKiBtMltpXSwgMCk7XG5cdCAgfVxuXHQgIHN0YXRpYyBzdWJ0cmFjdChhcnIxLCBhcnIyKSB7XG5cdCAgICByZXR1cm4gYXJyMS5tYXAoKHgxLCBpKSA9PiB4MSAtIGFycjJbaV0pO1xuXHQgIH1cblx0ICBzdGF0aWMgYWRkQXJyYXlzKGFycjEsIGFycjIpIHtcblx0ICAgIHJldHVybiBhcnIxLm1hcCgoeDEsIGkpID0+IHgxICsgYXJyMltpXSk7XG5cdCAgfVxuXHQgIHN0YXRpYyBhZGRJdGVtcyhpdGVtcywgYWRkaXRpb24pIHtcblx0ICAgIHJldHVybiBpdGVtcy5tYXAoeCA9PiB4ICsgYWRkaXRpb24pO1xuXHQgIH1cblx0ICBzdGF0aWMgc3VtKGl0ZW1zKSB7XG5cdCAgICByZXR1cm4gaXRlbXMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHgpO1xuXHQgIH1cblx0ICBzdGF0aWMgZG90KG0xLCBtMikge1xuXHQgICAgcmV0dXJuIG1hdGhzLm11bE1hdHJpeChtMSwgbTIpO1xuXHQgIH1cblx0ICBzdGF0aWMgdmVjdG9yTGVuKHYpIHtcblx0ICAgIHJldHVybiBNYXRoLmh5cG90KC4uLnYpO1xuXHQgIH1cblx0ICBzdGF0aWMgZGl2SXRlbXMoaXRlbXMsIGRpdmlzb3IpIHtcblx0ICAgIHJldHVybiBpdGVtcy5tYXAoeCA9PiB4IC8gZGl2aXNvcik7XG5cdCAgfVxuXHQgIHN0YXRpYyBzcXVhcmVJdGVtcyhpdGVtcykge1xuXHQgICAgcmV0dXJuIGl0ZW1zLm1hcCh4ID0+IHggKiB4KTtcblx0ICB9XG5cdCAgc3RhdGljIG5vcm1hbGl6ZSh2KSB7XG5cdCAgICByZXR1cm4gdGhpcy5kaXZJdGVtcyh2LCB0aGlzLnZlY3Rvckxlbih2KSk7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIGJlemllciB7XG5cdCAgc3RhdGljIHEoY3RybFBvbHksIHQpIHtcblx0ICAgIHZhciB0eCA9IDEuMCAtIHQ7XG5cdCAgICB2YXIgcEEgPSBtYXRocy5tdWxJdGVtcyhjdHJsUG9seVswXSwgdHggKiB0eCAqIHR4KSxcblx0ICAgICAgcEIgPSBtYXRocy5tdWxJdGVtcyhjdHJsUG9seVsxXSwgMyAqIHR4ICogdHggKiB0KSxcblx0ICAgICAgcEMgPSBtYXRocy5tdWxJdGVtcyhjdHJsUG9seVsyXSwgMyAqIHR4ICogdCAqIHQpLFxuXHQgICAgICBwRCA9IG1hdGhzLm11bEl0ZW1zKGN0cmxQb2x5WzNdLCB0ICogdCAqIHQpO1xuXHQgICAgcmV0dXJuIG1hdGhzLmFkZEFycmF5cyhtYXRocy5hZGRBcnJheXMocEEsIHBCKSwgbWF0aHMuYWRkQXJyYXlzKHBDLCBwRCkpO1xuXHQgIH1cblx0ICBzdGF0aWMgcXByaW1lKGN0cmxQb2x5LCB0KSB7XG5cdCAgICB2YXIgdHggPSAxLjAgLSB0O1xuXHQgICAgdmFyIHBBID0gbWF0aHMubXVsSXRlbXMobWF0aHMuc3VidHJhY3QoY3RybFBvbHlbMV0sIGN0cmxQb2x5WzBdKSwgMyAqIHR4ICogdHgpLFxuXHQgICAgICBwQiA9IG1hdGhzLm11bEl0ZW1zKG1hdGhzLnN1YnRyYWN0KGN0cmxQb2x5WzJdLCBjdHJsUG9seVsxXSksIDYgKiB0eCAqIHQpLFxuXHQgICAgICBwQyA9IG1hdGhzLm11bEl0ZW1zKG1hdGhzLnN1YnRyYWN0KGN0cmxQb2x5WzNdLCBjdHJsUG9seVsyXSksIDMgKiB0ICogdCk7XG5cdCAgICByZXR1cm4gbWF0aHMuYWRkQXJyYXlzKG1hdGhzLmFkZEFycmF5cyhwQSwgcEIpLCBwQyk7XG5cdCAgfVxuXHQgIHN0YXRpYyBxcHJpbWVwcmltZShjdHJsUG9seSwgdCkge1xuXHQgICAgcmV0dXJuIG1hdGhzLmFkZEFycmF5cyhtYXRocy5tdWxJdGVtcyhtYXRocy5hZGRBcnJheXMobWF0aHMuc3VidHJhY3QoY3RybFBvbHlbMl0sIG1hdGhzLm11bEl0ZW1zKGN0cmxQb2x5WzFdLCAyKSksIGN0cmxQb2x5WzBdKSwgNiAqICgxLjAgLSB0KSksIG1hdGhzLm11bEl0ZW1zKG1hdGhzLmFkZEFycmF5cyhtYXRocy5zdWJ0cmFjdChjdHJsUG9seVszXSwgbWF0aHMubXVsSXRlbXMoY3RybFBvbHlbMl0sIDIpKSwgY3RybFBvbHlbMV0pLCA2ICogdCkpO1xuXHQgIH1cblx0fVxuXHRtb2R1bGUuZXhwb3J0cyA9IGZpdEN1cnZlO1xuXHRtb2R1bGUuZXhwb3J0cy5maXRDdWJpYyA9IGZpdEN1YmljO1xuXHRtb2R1bGUuZXhwb3J0cy5jcmVhdGVUYW5nZW50ID0gY3JlYXRlVGFuZ2VudDtcblxuXHQvKioqLyB9KSxcblx0LyogMzIgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLkFubm90YXRpb25MYXllciA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTtcblx0dmFyIF9hbm5vdGF0aW9uX3N0b3JhZ2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpO1xuXHR2YXIgX3NjcmlwdGluZ191dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMzMpO1xuXHR2YXIgX3hmYV9sYXllciA9IF9fd19wZGZqc19yZXF1aXJlX18oMzQpO1xuXHRjb25zdCBERUZBVUxUX1RBQl9JTkRFWCA9IDEwMDA7XG5cdGNvbnN0IERFRkFVTFRfRk9OVF9TSVpFID0gOTtcblx0Y29uc3QgR2V0RWxlbWVudHNCeU5hbWVTZXQgPSBuZXcgV2Vha1NldCgpO1xuXHRmdW5jdGlvbiBnZXRSZWN0RGltcyhyZWN0KSB7XG5cdCAgcmV0dXJuIHtcblx0ICAgIHdpZHRoOiByZWN0WzJdIC0gcmVjdFswXSxcblx0ICAgIGhlaWdodDogcmVjdFszXSAtIHJlY3RbMV1cblx0ICB9O1xuXHR9XG5cdGNsYXNzIEFubm90YXRpb25FbGVtZW50RmFjdG9yeSB7XG5cdCAgc3RhdGljIGNyZWF0ZShwYXJhbWV0ZXJzKSB7XG5cdCAgICBjb25zdCBzdWJ0eXBlID0gcGFyYW1ldGVycy5kYXRhLmFubm90YXRpb25UeXBlO1xuXHQgICAgc3dpdGNoIChzdWJ0eXBlKSB7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuTElOSzpcblx0ICAgICAgICByZXR1cm4gbmV3IExpbmtBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5URVhUOlxuXHQgICAgICAgIHJldHVybiBuZXcgVGV4dEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLldJREdFVDpcblx0ICAgICAgICBjb25zdCBmaWVsZFR5cGUgPSBwYXJhbWV0ZXJzLmRhdGEuZmllbGRUeXBlO1xuXHQgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XG5cdCAgICAgICAgICBjYXNlIFwiVHhcIjpcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgICAgICBjYXNlIFwiQnRuXCI6XG5cdCAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmRhdGEucmFkaW9CdXR0b24pIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhZGlvQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycy5kYXRhLmNoZWNrQm94KSB7XG5cdCAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGVja2JveFdpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgUHVzaEJ1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICAgICAgY2FzZSBcIkNoXCI6XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBuZXcgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9QVVA6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBQb3B1cEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkZSRUVURVhUOlxuXHQgICAgICAgIHJldHVybiBuZXcgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5FOlxuXHQgICAgICAgIHJldHVybiBuZXcgTGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlNRVUFSRTpcblx0ICAgICAgICByZXR1cm4gbmV3IFNxdWFyZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkNJUkNMRTpcblx0ICAgICAgICByZXR1cm4gbmV3IENpcmNsZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlBPTFlMSU5FOlxuXHQgICAgICAgIHJldHVybiBuZXcgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5DQVJFVDpcblx0ICAgICAgICByZXR1cm4gbmV3IENhcmV0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuSU5LOlxuXHQgICAgICAgIHJldHVybiBuZXcgSW5rQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9MWUdPTjpcblx0ICAgICAgICByZXR1cm4gbmV3IFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5ISUdITElHSFQ6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5VTkRFUkxJTkU6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TUVVJR0dMWTpcblx0ICAgICAgICByZXR1cm4gbmV3IFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuU1RSSUtFT1VUOlxuXHQgICAgICAgIHJldHVybiBuZXcgU3RyaWtlT3V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuU1RBTVA6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBTdGFtcEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkZJTEVBVFRBQ0hNRU5UOlxuXHQgICAgICAgIHJldHVybiBuZXcgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgZGVmYXVsdDpcblx0ICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRjbGFzcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycywge1xuXHQgICAgaXNSZW5kZXJhYmxlID0gZmFsc2UsXG5cdCAgICBpZ25vcmVCb3JkZXIgPSBmYWxzZSxcblx0ICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzID0gZmFsc2Vcblx0ICB9ID0ge30pIHtcblx0ICAgIHRoaXMuaXNSZW5kZXJhYmxlID0gaXNSZW5kZXJhYmxlO1xuXHQgICAgdGhpcy5kYXRhID0gcGFyYW1ldGVycy5kYXRhO1xuXHQgICAgdGhpcy5sYXllciA9IHBhcmFtZXRlcnMubGF5ZXI7XG5cdCAgICB0aGlzLnBhZ2UgPSBwYXJhbWV0ZXJzLnBhZ2U7XG5cdCAgICB0aGlzLnZpZXdwb3J0ID0gcGFyYW1ldGVycy52aWV3cG9ydDtcblx0ICAgIHRoaXMubGlua1NlcnZpY2UgPSBwYXJhbWV0ZXJzLmxpbmtTZXJ2aWNlO1xuXHQgICAgdGhpcy5kb3dubG9hZE1hbmFnZXIgPSBwYXJhbWV0ZXJzLmRvd25sb2FkTWFuYWdlcjtcblx0ICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gcGFyYW1ldGVycy5pbWFnZVJlc291cmNlc1BhdGg7XG5cdCAgICB0aGlzLnJlbmRlckZvcm1zID0gcGFyYW1ldGVycy5yZW5kZXJGb3Jtcztcblx0ICAgIHRoaXMuc3ZnRmFjdG9yeSA9IHBhcmFtZXRlcnMuc3ZnRmFjdG9yeTtcblx0ICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UgPSBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlO1xuXHQgICAgdGhpcy5lbmFibGVTY3JpcHRpbmcgPSBwYXJhbWV0ZXJzLmVuYWJsZVNjcmlwdGluZztcblx0ICAgIHRoaXMuaGFzSlNBY3Rpb25zID0gcGFyYW1ldGVycy5oYXNKU0FjdGlvbnM7XG5cdCAgICB0aGlzLl9maWVsZE9iamVjdHMgPSBwYXJhbWV0ZXJzLmZpZWxkT2JqZWN0cztcblx0ICAgIGlmIChpc1JlbmRlcmFibGUpIHtcblx0ICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLl9jcmVhdGVDb250YWluZXIoaWdub3JlQm9yZGVyKTtcblx0ICAgIH1cblx0ICAgIGlmIChjcmVhdGVRdWFkcmlsYXRlcmFscykge1xuXHQgICAgICB0aGlzLnF1YWRyaWxhdGVyYWxzID0gdGhpcy5fY3JlYXRlUXVhZHJpbGF0ZXJhbHMoaWdub3JlQm9yZGVyKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIgPSBmYWxzZSkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBkYXRhLFxuXHQgICAgICBwYWdlLFxuXHQgICAgICB2aWV3cG9ydFxuXHQgICAgfSA9IHRoaXM7XG5cdCAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VjdGlvblwiKTtcblx0ICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFubm90YXRpb24taWRcIiwgZGF0YS5pZCk7XG5cdCAgICBpZiAoZGF0YS5ub1JvdGF0ZSkge1xuXHQgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm5vcm90YXRlXCIpO1xuXHQgICAgfVxuXHQgICAgY29uc3Qge1xuXHQgICAgICBwYWdlV2lkdGgsXG5cdCAgICAgIHBhZ2VIZWlnaHQsXG5cdCAgICAgIHBhZ2VYLFxuXHQgICAgICBwYWdlWVxuXHQgICAgfSA9IHZpZXdwb3J0LnJhd0RpbXM7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHdpZHRoLFxuXHQgICAgICBoZWlnaHRcblx0ICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuXHQgICAgY29uc3QgcmVjdCA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChbZGF0YS5yZWN0WzBdLCBwYWdlLnZpZXdbM10gLSBkYXRhLnJlY3RbMV0gKyBwYWdlLnZpZXdbMV0sIGRhdGEucmVjdFsyXSwgcGFnZS52aWV3WzNdIC0gZGF0YS5yZWN0WzNdICsgcGFnZS52aWV3WzFdXSk7XG5cdCAgICBpZiAoIWlnbm9yZUJvcmRlciAmJiBkYXRhLmJvcmRlclN0eWxlLndpZHRoID4gMCkge1xuXHQgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyV2lkdGggPSBgJHtkYXRhLmJvcmRlclN0eWxlLndpZHRofXB4YDtcblx0ICAgICAgY29uc3QgaG9yaXpvbnRhbFJhZGl1cyA9IGRhdGEuYm9yZGVyU3R5bGUuaG9yaXpvbnRhbENvcm5lclJhZGl1cztcblx0ICAgICAgY29uc3QgdmVydGljYWxSYWRpdXMgPSBkYXRhLmJvcmRlclN0eWxlLnZlcnRpY2FsQ29ybmVyUmFkaXVzO1xuXHQgICAgICBpZiAoaG9yaXpvbnRhbFJhZGl1cyA+IDAgfHwgdmVydGljYWxSYWRpdXMgPiAwKSB7XG5cdCAgICAgICAgY29uc3QgcmFkaXVzID0gYGNhbGMoJHtob3Jpem9udGFsUmFkaXVzfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSkgLyBjYWxjKCR7dmVydGljYWxSYWRpdXN9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG5cdCAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclJhZGl1cyA9IHJhZGl1cztcblx0ICAgICAgfSBlbHNlIGlmICh0aGlzIGluc3RhbmNlb2YgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCkge1xuXHQgICAgICAgIGNvbnN0IHJhZGl1cyA9IGBjYWxjKCR7d2lkdGh9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoJHtoZWlnaHR9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG5cdCAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclJhZGl1cyA9IHJhZGl1cztcblx0ICAgICAgfVxuXHQgICAgICBzd2l0Y2ggKGRhdGEuYm9yZGVyU3R5bGUuc3R5bGUpIHtcblx0ICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuU09MSUQ6XG5cdCAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyU3R5bGUgPSBcInNvbGlkXCI7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuREFTSEVEOlxuXHQgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlclN0eWxlID0gXCJkYXNoZWRcIjtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5CRVZFTEVEOlxuXHQgICAgICAgICAgKDAsIF91dGlsLndhcm4pKFwiVW5pbXBsZW1lbnRlZCBib3JkZXIgc3R5bGU6IGJldmVsZWRcIik7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuSU5TRVQ6XG5cdCAgICAgICAgICAoMCwgX3V0aWwud2FybikoXCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogaW5zZXRcIik7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Cb3JkZXJTdHlsZVR5cGUuVU5ERVJMSU5FOlxuXHQgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlckJvdHRvbVN0eWxlID0gXCJzb2xpZFwiO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSBkYXRhLmJvcmRlckNvbG9yIHx8IG51bGw7XG5cdCAgICAgIGlmIChib3JkZXJDb2xvcikge1xuXHQgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJDb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKGJvcmRlckNvbG9yWzBdIHwgMCwgYm9yZGVyQ29sb3JbMV0gfCAwLCBib3JkZXJDb2xvclsyXSB8IDApO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJXaWR0aCA9IDA7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYCR7MTAwICogKHJlY3RbMF0gLSBwYWdlWCkgLyBwYWdlV2lkdGh9JWA7XG5cdCAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7MTAwICogKHJlY3RbMV0gLSBwYWdlWSkgLyBwYWdlSGVpZ2h0fSVgO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICByb3RhdGlvblxuXHQgICAgfSA9IGRhdGE7XG5cdCAgICBpZiAoZGF0YS5oYXNPd25DYW52YXMgfHwgcm90YXRpb24gPT09IDApIHtcblx0ICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7MTAwICogd2lkdGggLyBwYWdlV2lkdGh9JWA7XG5cdCAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHsxMDAgKiBoZWlnaHQgLyBwYWdlSGVpZ2h0fSVgO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5zZXRSb3RhdGlvbihyb3RhdGlvbiwgY29udGFpbmVyKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBjb250YWluZXI7XG5cdCAgfVxuXHQgIHNldFJvdGF0aW9uKGFuZ2xlLCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcikge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBwYWdlV2lkdGgsXG5cdCAgICAgIHBhZ2VIZWlnaHRcblx0ICAgIH0gPSB0aGlzLnZpZXdwb3J0LnJhd0RpbXM7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHdpZHRoLFxuXHQgICAgICBoZWlnaHRcblx0ICAgIH0gPSBnZXRSZWN0RGltcyh0aGlzLmRhdGEucmVjdCk7XG5cdCAgICBsZXQgZWxlbWVudFdpZHRoLCBlbGVtZW50SGVpZ2h0O1xuXHQgICAgaWYgKGFuZ2xlICUgMTgwID09PSAwKSB7XG5cdCAgICAgIGVsZW1lbnRXaWR0aCA9IDEwMCAqIHdpZHRoIC8gcGFnZVdpZHRoO1xuXHQgICAgICBlbGVtZW50SGVpZ2h0ID0gMTAwICogaGVpZ2h0IC8gcGFnZUhlaWdodDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGVsZW1lbnRXaWR0aCA9IDEwMCAqIGhlaWdodCAvIHBhZ2VXaWR0aDtcblx0ICAgICAgZWxlbWVudEhlaWdodCA9IDEwMCAqIHdpZHRoIC8gcGFnZUhlaWdodDtcblx0ICAgIH1cblx0ICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke2VsZW1lbnRXaWR0aH0lYDtcblx0ICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBgJHtlbGVtZW50SGVpZ2h0fSVgO1xuXHQgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtbWFpbi1yb3RhdGlvblwiLCAoMzYwIC0gYW5nbGUpICUgMzYwKTtcblx0ICB9XG5cdCAgZ2V0IF9jb21tb25BY3Rpb25zKCkge1xuXHQgICAgY29uc3Qgc2V0Q29sb3IgPSAoanNOYW1lLCBzdHlsZU5hbWUsIGV2ZW50KSA9PiB7XG5cdCAgICAgIGNvbnN0IGNvbG9yID0gZXZlbnQuZGV0YWlsW2pzTmFtZV07XG5cdCAgICAgIGV2ZW50LnRhcmdldC5zdHlsZVtzdHlsZU5hbWVdID0gX3NjcmlwdGluZ191dGlscy5Db2xvckNvbnZlcnRlcnNbYCR7Y29sb3JbMF19X0hUTUxgXShjb2xvci5zbGljZSgxKSk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiX2NvbW1vbkFjdGlvbnNcIiwge1xuXHQgICAgICBkaXNwbGF5OiBldmVudCA9PiB7XG5cdCAgICAgICAgY29uc3QgaGlkZGVuID0gZXZlbnQuZGV0YWlsLmRpc3BsYXkgJSAyID09PSAxO1xuXHQgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBoaWRkZW4gPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCI7XG5cdCAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcblx0ICAgICAgICAgIGhpZGRlbixcblx0ICAgICAgICAgIHByaW50OiBldmVudC5kZXRhaWwuZGlzcGxheSA9PT0gMCB8fCBldmVudC5kZXRhaWwuZGlzcGxheSA9PT0gM1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9LFxuXHQgICAgICBwcmludDogZXZlbnQgPT4ge1xuXHQgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG5cdCAgICAgICAgICBwcmludDogZXZlbnQuZGV0YWlsLnByaW50XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0sXG5cdCAgICAgIGhpZGRlbjogZXZlbnQgPT4ge1xuXHQgICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBldmVudC5kZXRhaWwuaGlkZGVuID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiO1xuXHQgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG5cdCAgICAgICAgICBoaWRkZW46IGV2ZW50LmRldGFpbC5oaWRkZW5cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSxcblx0ICAgICAgZm9jdXM6IGV2ZW50ID0+IHtcblx0ICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGV2ZW50LnRhcmdldC5mb2N1cyh7XG5cdCAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiBmYWxzZVxuXHQgICAgICAgIH0pLCAwKTtcblx0ICAgICAgfSxcblx0ICAgICAgdXNlck5hbWU6IGV2ZW50ID0+IHtcblx0ICAgICAgICBldmVudC50YXJnZXQudGl0bGUgPSBldmVudC5kZXRhaWwudXNlck5hbWU7XG5cdCAgICAgIH0sXG5cdCAgICAgIHJlYWRvbmx5OiBldmVudCA9PiB7XG5cdCAgICAgICAgaWYgKGV2ZW50LmRldGFpbC5yZWFkb25seSkge1xuXHQgICAgICAgICAgZXZlbnQudGFyZ2V0LnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIFwiXCIpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBldmVudC50YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwicmVhZG9ubHlcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICByZXF1aXJlZDogZXZlbnQgPT4ge1xuXHQgICAgICAgIHRoaXMuX3NldFJlcXVpcmVkKGV2ZW50LnRhcmdldCwgZXZlbnQuZGV0YWlsLnJlcXVpcmVkKTtcblx0ICAgICAgfSxcblx0ICAgICAgYmdDb2xvcjogZXZlbnQgPT4ge1xuXHQgICAgICAgIHNldENvbG9yKFwiYmdDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCBldmVudCk7XG5cdCAgICAgIH0sXG5cdCAgICAgIGZpbGxDb2xvcjogZXZlbnQgPT4ge1xuXHQgICAgICAgIHNldENvbG9yKFwiZmlsbENvbG9yXCIsIFwiYmFja2dyb3VuZENvbG9yXCIsIGV2ZW50KTtcblx0ICAgICAgfSxcblx0ICAgICAgZmdDb2xvcjogZXZlbnQgPT4ge1xuXHQgICAgICAgIHNldENvbG9yKFwiZmdDb2xvclwiLCBcImNvbG9yXCIsIGV2ZW50KTtcblx0ICAgICAgfSxcblx0ICAgICAgdGV4dENvbG9yOiBldmVudCA9PiB7XG5cdCAgICAgICAgc2V0Q29sb3IoXCJ0ZXh0Q29sb3JcIiwgXCJjb2xvclwiLCBldmVudCk7XG5cdCAgICAgIH0sXG5cdCAgICAgIGJvcmRlckNvbG9yOiBldmVudCA9PiB7XG5cdCAgICAgICAgc2V0Q29sb3IoXCJib3JkZXJDb2xvclwiLCBcImJvcmRlckNvbG9yXCIsIGV2ZW50KTtcblx0ICAgICAgfSxcblx0ICAgICAgc3Ryb2tlQ29sb3I6IGV2ZW50ID0+IHtcblx0ICAgICAgICBzZXRDb2xvcihcInN0cm9rZUNvbG9yXCIsIFwiYm9yZGVyQ29sb3JcIiwgZXZlbnQpO1xuXHQgICAgICB9LFxuXHQgICAgICByb3RhdGlvbjogZXZlbnQgPT4ge1xuXHQgICAgICAgIGNvbnN0IGFuZ2xlID0gZXZlbnQuZGV0YWlsLnJvdGF0aW9uO1xuXHQgICAgICAgIHRoaXMuc2V0Um90YXRpb24oYW5nbGUpO1xuXHQgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JhZ2Uuc2V0VmFsdWUodGhpcy5kYXRhLmlkLCB7XG5cdCAgICAgICAgICByb3RhdGlvbjogYW5nbGVcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIF9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCkge1xuXHQgICAgY29uc3QgY29tbW9uQWN0aW9ucyA9IHRoaXMuX2NvbW1vbkFjdGlvbnM7XG5cdCAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoanNFdmVudC5kZXRhaWwpKSB7XG5cdCAgICAgIGNvbnN0IGFjdGlvbiA9IGFjdGlvbnNbbmFtZV0gfHwgY29tbW9uQWN0aW9uc1tuYW1lXTtcblx0ICAgICAgYWN0aW9uPy4oanNFdmVudCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhlbGVtZW50KSB7XG5cdCAgICBpZiAoIXRoaXMuZW5hYmxlU2NyaXB0aW5nKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHN0b3JlZERhdGEgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlLmdldFJhd1ZhbHVlKHRoaXMuZGF0YS5pZCk7XG5cdCAgICBpZiAoIXN0b3JlZERhdGEpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY29tbW9uQWN0aW9ucyA9IHRoaXMuX2NvbW1vbkFjdGlvbnM7XG5cdCAgICBmb3IgKGNvbnN0IFthY3Rpb25OYW1lLCBkZXRhaWxdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlZERhdGEpKSB7XG5cdCAgICAgIGNvbnN0IGFjdGlvbiA9IGNvbW1vbkFjdGlvbnNbYWN0aW9uTmFtZV07XG5cdCAgICAgIGlmIChhY3Rpb24pIHtcblx0ICAgICAgICBjb25zdCBldmVudFByb3h5ID0ge1xuXHQgICAgICAgICAgZGV0YWlsOiB7XG5cdCAgICAgICAgICAgIFthY3Rpb25OYW1lXTogZGV0YWlsXG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgdGFyZ2V0OiBlbGVtZW50XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBhY3Rpb24oZXZlbnRQcm94eSk7XG5cdCAgICAgICAgZGVsZXRlIHN0b3JlZERhdGFbYWN0aW9uTmFtZV07XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgX2NyZWF0ZVF1YWRyaWxhdGVyYWxzKGlnbm9yZUJvcmRlciA9IGZhbHNlKSB7XG5cdCAgICBpZiAoIXRoaXMuZGF0YS5xdWFkUG9pbnRzKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcXVhZHJpbGF0ZXJhbHMgPSBbXTtcblx0ICAgIGNvbnN0IHNhdmVkUmVjdCA9IHRoaXMuZGF0YS5yZWN0O1xuXHQgICAgZm9yIChjb25zdCBxdWFkUG9pbnQgb2YgdGhpcy5kYXRhLnF1YWRQb2ludHMpIHtcblx0ICAgICAgdGhpcy5kYXRhLnJlY3QgPSBbcXVhZFBvaW50WzJdLngsIHF1YWRQb2ludFsyXS55LCBxdWFkUG9pbnRbMV0ueCwgcXVhZFBvaW50WzFdLnldO1xuXHQgICAgICBxdWFkcmlsYXRlcmFscy5wdXNoKHRoaXMuX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIpKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuZGF0YS5yZWN0ID0gc2F2ZWRSZWN0O1xuXHQgICAgcmV0dXJuIHF1YWRyaWxhdGVyYWxzO1xuXHQgIH1cblx0ICBfY3JlYXRlUG9wdXAodHJpZ2dlciwgZGF0YSkge1xuXHQgICAgbGV0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuXHQgICAgaWYgKHRoaXMucXVhZHJpbGF0ZXJhbHMpIHtcblx0ICAgICAgdHJpZ2dlciB8fD0gdGhpcy5xdWFkcmlsYXRlcmFscztcblx0ICAgICAgY29udGFpbmVyID0gdGhpcy5xdWFkcmlsYXRlcmFsc1swXTtcblx0ICAgIH1cblx0ICAgIGlmICghdHJpZ2dlcikge1xuXHQgICAgICB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgICAgdHJpZ2dlci5jbGFzc0xpc3QuYWRkKFwicG9wdXBUcmlnZ2VyQXJlYVwiKTtcblx0ICAgICAgY29udGFpbmVyLmFwcGVuZCh0cmlnZ2VyKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHBvcHVwRWxlbWVudCA9IG5ldyBQb3B1cEVsZW1lbnQoe1xuXHQgICAgICBjb250YWluZXIsXG5cdCAgICAgIHRyaWdnZXIsXG5cdCAgICAgIGNvbG9yOiBkYXRhLmNvbG9yLFxuXHQgICAgICB0aXRsZU9iajogZGF0YS50aXRsZU9iaixcblx0ICAgICAgbW9kaWZpY2F0aW9uRGF0ZTogZGF0YS5tb2RpZmljYXRpb25EYXRlLFxuXHQgICAgICBjb250ZW50c09iajogZGF0YS5jb250ZW50c09iaixcblx0ICAgICAgcmljaFRleHQ6IGRhdGEucmljaFRleHQsXG5cdCAgICAgIGhpZGVXcmFwcGVyOiB0cnVlXG5cdCAgICB9KTtcblx0ICAgIGNvbnN0IHBvcHVwID0gcG9wdXBFbGVtZW50LnJlbmRlcigpO1xuXHQgICAgcG9wdXAuc3R5bGUubGVmdCA9IFwiMTAwJVwiO1xuXHQgICAgY29udGFpbmVyLmFwcGVuZChwb3B1cCk7XG5cdCAgfVxuXHQgIF9yZW5kZXJRdWFkcmlsYXRlcmFscyhjbGFzc05hbWUpIHtcblx0ICAgIGZvciAoY29uc3QgcXVhZHJpbGF0ZXJhbCBvZiB0aGlzLnF1YWRyaWxhdGVyYWxzKSB7XG5cdCAgICAgIHF1YWRyaWxhdGVyYWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMucXVhZHJpbGF0ZXJhbHM7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJBYnN0cmFjdCBtZXRob2QgYEFubm90YXRpb25FbGVtZW50LnJlbmRlcmAgY2FsbGVkXCIpO1xuXHQgIH1cblx0ICBfZ2V0RWxlbWVudHNCeU5hbWUobmFtZSwgc2tpcElkID0gbnVsbCkge1xuXHQgICAgY29uc3QgZmllbGRzID0gW107XG5cdCAgICBpZiAodGhpcy5fZmllbGRPYmplY3RzKSB7XG5cdCAgICAgIGNvbnN0IGZpZWxkT2JqID0gdGhpcy5fZmllbGRPYmplY3RzW25hbWVdO1xuXHQgICAgICBpZiAoZmllbGRPYmopIHtcblx0ICAgICAgICBmb3IgKGNvbnN0IHtcblx0ICAgICAgICAgIHBhZ2UsXG5cdCAgICAgICAgICBpZCxcblx0ICAgICAgICAgIGV4cG9ydFZhbHVlc1xuXHQgICAgICAgIH0gb2YgZmllbGRPYmopIHtcblx0ICAgICAgICAgIGlmIChwYWdlID09PSAtMSkge1xuXHQgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGlmIChpZCA9PT0gc2tpcElkKSB7XG5cdCAgICAgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgY29uc3QgZXhwb3J0VmFsdWUgPSB0eXBlb2YgZXhwb3J0VmFsdWVzID09PSBcInN0cmluZ1wiID8gZXhwb3J0VmFsdWVzIDogbnVsbDtcblx0ICAgICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1lbGVtZW50LWlkPVwiJHtpZH1cIl1gKTtcblx0ICAgICAgICAgIGlmIChkb21FbGVtZW50ICYmICFHZXRFbGVtZW50c0J5TmFtZVNldC5oYXMoZG9tRWxlbWVudCkpIHtcblx0ICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBfZ2V0RWxlbWVudHNCeU5hbWUgLSBlbGVtZW50IG5vdCBhbGxvd2VkOiAke2lkfWApO1xuXHQgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGZpZWxkcy5wdXNoKHtcblx0ICAgICAgICAgICAgaWQsXG5cdCAgICAgICAgICAgIGV4cG9ydFZhbHVlLFxuXHQgICAgICAgICAgICBkb21FbGVtZW50XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZpZWxkcztcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgZG9tRWxlbWVudCBvZiBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKSkge1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgZXhwb3J0VmFsdWVcblx0ICAgICAgfSA9IGRvbUVsZW1lbnQ7XG5cdCAgICAgIGNvbnN0IGlkID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIik7XG5cdCAgICAgIGlmIChpZCA9PT0gc2tpcElkKSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCFHZXRFbGVtZW50c0J5TmFtZVNldC5oYXMoZG9tRWxlbWVudCkpIHtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBmaWVsZHMucHVzaCh7XG5cdCAgICAgICAgaWQsXG5cdCAgICAgICAgZXhwb3J0VmFsdWUsXG5cdCAgICAgICAgZG9tRWxlbWVudFxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBmaWVsZHM7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIExpbmtBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzLCBvcHRpb25zID0gbnVsbCkge1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpc1JlbmRlcmFibGU6IHRydWUsXG5cdCAgICAgIGlnbm9yZUJvcmRlcjogISFvcHRpb25zPy5pZ25vcmVCb3JkZXIsXG5cdCAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG5cdCAgICB9KTtcblx0ICAgIHRoaXMuaXNUb29sdGlwT25seSA9IHBhcmFtZXRlcnMuZGF0YS5pc1Rvb2x0aXBPbmx5O1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGRhdGEsXG5cdCAgICAgIGxpbmtTZXJ2aWNlXG5cdCAgICB9ID0gdGhpcztcblx0ICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcblx0ICAgIGxpbmsuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGRhdGEuaWQpO1xuXHQgICAgbGV0IGlzQm91bmQgPSBmYWxzZTtcblx0ICAgIGlmIChkYXRhLnVybCkge1xuXHQgICAgICBsaW5rU2VydmljZS5hZGRMaW5rQXR0cmlidXRlcyhsaW5rLCBkYXRhLnVybCwgZGF0YS5uZXdXaW5kb3cpO1xuXHQgICAgICBpc0JvdW5kID0gdHJ1ZTtcblx0ICAgIH0gZWxzZSBpZiAoZGF0YS5hY3Rpb24pIHtcblx0ICAgICAgdGhpcy5fYmluZE5hbWVkQWN0aW9uKGxpbmssIGRhdGEuYWN0aW9uKTtcblx0ICAgICAgaXNCb3VuZCA9IHRydWU7XG5cdCAgICB9IGVsc2UgaWYgKGRhdGEuYXR0YWNobWVudCkge1xuXHQgICAgICB0aGlzLl9iaW5kQXR0YWNobWVudChsaW5rLCBkYXRhLmF0dGFjaG1lbnQpO1xuXHQgICAgICBpc0JvdW5kID0gdHJ1ZTtcblx0ICAgIH0gZWxzZSBpZiAoZGF0YS5zZXRPQ0dTdGF0ZSkge1xuXHQgICAgICB0aGlzLiNiaW5kU2V0T0NHU3RhdGUobGluaywgZGF0YS5zZXRPQ0dTdGF0ZSk7XG5cdCAgICAgIGlzQm91bmQgPSB0cnVlO1xuXHQgICAgfSBlbHNlIGlmIChkYXRhLmRlc3QpIHtcblx0ICAgICAgdGhpcy5fYmluZExpbmsobGluaywgZGF0YS5kZXN0KTtcblx0ICAgICAgaXNCb3VuZCA9IHRydWU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZiAoZGF0YS5hY3Rpb25zICYmIChkYXRhLmFjdGlvbnMuQWN0aW9uIHx8IGRhdGEuYWN0aW9uc1tcIk1vdXNlIFVwXCJdIHx8IGRhdGEuYWN0aW9uc1tcIk1vdXNlIERvd25cIl0pICYmIHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG5cdCAgICAgICAgdGhpcy5fYmluZEpTQWN0aW9uKGxpbmssIGRhdGEpO1xuXHQgICAgICAgIGlzQm91bmQgPSB0cnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChkYXRhLnJlc2V0Rm9ybSkge1xuXHQgICAgICAgIHRoaXMuX2JpbmRSZXNldEZvcm1BY3Rpb24obGluaywgZGF0YS5yZXNldEZvcm0pO1xuXHQgICAgICAgIGlzQm91bmQgPSB0cnVlO1xuXHQgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUb29sdGlwT25seSAmJiAhaXNCb3VuZCkge1xuXHQgICAgICAgIHRoaXMuX2JpbmRMaW5rKGxpbmssIFwiXCIpO1xuXHQgICAgICAgIGlzQm91bmQgPSB0cnVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5xdWFkcmlsYXRlcmFscykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUXVhZHJpbGF0ZXJhbHMoXCJsaW5rQW5ub3RhdGlvblwiKS5tYXAoKHF1YWRyaWxhdGVyYWwsIGluZGV4KSA9PiB7XG5cdCAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBpbmRleCA9PT0gMCA/IGxpbmsgOiBsaW5rLmNsb25lTm9kZSgpO1xuXHQgICAgICAgIHF1YWRyaWxhdGVyYWwuYXBwZW5kKGxpbmtFbGVtZW50KTtcblx0ICAgICAgICByZXR1cm4gcXVhZHJpbGF0ZXJhbDtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibGlua0Fubm90YXRpb25cIik7XG5cdCAgICBpZiAoaXNCb3VuZCkge1xuXHQgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQobGluayk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHQgICNzZXRJbnRlcm5hbExpbmsoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWludGVybmFsLWxpbmtcIiwgXCJcIik7XG5cdCAgfVxuXHQgIF9iaW5kTGluayhsaW5rLCBkZXN0aW5hdGlvbikge1xuXHQgICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXREZXN0aW5hdGlvbkhhc2goZGVzdGluYXRpb24pO1xuXHQgICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuXHQgICAgICBpZiAoZGVzdGluYXRpb24pIHtcblx0ICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmdvVG9EZXN0aW5hdGlvbihkZXN0aW5hdGlvbik7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblx0ICAgIGlmIChkZXN0aW5hdGlvbiB8fCBkZXN0aW5hdGlvbiA9PT0gXCJcIikge1xuXHQgICAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX2JpbmROYW1lZEFjdGlvbihsaW5rLCBhY3Rpb24pIHtcblx0ICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuXHQgICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuXHQgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pO1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9O1xuXHQgICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG5cdCAgfVxuXHQgIF9iaW5kQXR0YWNobWVudChsaW5rLCBhdHRhY2htZW50KSB7XG5cdCAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcblx0ICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcblx0ICAgICAgdGhpcy5kb3dubG9hZE1hbmFnZXI/Lm9wZW5PckRvd25sb2FkRGF0YSh0aGlzLmNvbnRhaW5lciwgYXR0YWNobWVudC5jb250ZW50LCBhdHRhY2htZW50LmZpbGVuYW1lKTtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblx0ICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuXHQgIH1cblx0ICAjYmluZFNldE9DR1N0YXRlKGxpbmssIGFjdGlvbikge1xuXHQgICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG5cdCAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG5cdCAgICAgIHRoaXMubGlua1NlcnZpY2UuZXhlY3V0ZVNldE9DR1N0YXRlKGFjdGlvbik7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH07XG5cdCAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcblx0ICB9XG5cdCAgX2JpbmRKU0FjdGlvbihsaW5rLCBkYXRhKSB7XG5cdCAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcblx0ICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoW1tcIkFjdGlvblwiLCBcIm9uY2xpY2tcIl0sIFtcIk1vdXNlIFVwXCIsIFwib25tb3VzZXVwXCJdLCBbXCJNb3VzZSBEb3duXCIsIFwib25tb3VzZWRvd25cIl1dKTtcblx0ICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkYXRhLmFjdGlvbnMpKSB7XG5cdCAgICAgIGNvbnN0IGpzTmFtZSA9IG1hcC5nZXQobmFtZSk7XG5cdCAgICAgIGlmICghanNOYW1lKSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgbGlua1tqc05hbWVdID0gKCkgPT4ge1xuXHQgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG5cdCAgICAgICAgICBzb3VyY2U6IHRoaXMsXG5cdCAgICAgICAgICBkZXRhaWw6IHtcblx0ICAgICAgICAgICAgaWQ6IGRhdGEuaWQsXG5cdCAgICAgICAgICAgIG5hbWVcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICBpZiAoIWxpbmsub25jbGljaykge1xuXHQgICAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiBmYWxzZTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuXHQgIH1cblx0ICBfYmluZFJlc2V0Rm9ybUFjdGlvbihsaW5rLCByZXNldEZvcm0pIHtcblx0ICAgIGNvbnN0IG90aGVyQ2xpY2tBY3Rpb24gPSBsaW5rLm9uY2xpY2s7XG5cdCAgICBpZiAoIW90aGVyQ2xpY2tBY3Rpb24pIHtcblx0ICAgICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcblx0ICAgIGlmICghdGhpcy5fZmllbGRPYmplY3RzKSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShgX2JpbmRSZXNldEZvcm1BY3Rpb24gLSBcInJlc2V0Rm9ybVwiIGFjdGlvbiBub3Qgc3VwcG9ydGVkLCBgICsgXCJlbnN1cmUgdGhhdCB0aGUgYGZpZWxkT2JqZWN0c2AgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLlwiKTtcblx0ICAgICAgaWYgKCFvdGhlckNsaWNrQWN0aW9uKSB7XG5cdCAgICAgICAgbGluay5vbmNsaWNrID0gKCkgPT4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuXHQgICAgICBvdGhlckNsaWNrQWN0aW9uPy4oKTtcblx0ICAgICAgY29uc3Qge1xuXHQgICAgICAgIGZpZWxkczogcmVzZXRGb3JtRmllbGRzLFxuXHQgICAgICAgIHJlZnM6IHJlc2V0Rm9ybVJlZnMsXG5cdCAgICAgICAgaW5jbHVkZVxuXHQgICAgICB9ID0gcmVzZXRGb3JtO1xuXHQgICAgICBjb25zdCBhbGxGaWVsZHMgPSBbXTtcblx0ICAgICAgaWYgKHJlc2V0Rm9ybUZpZWxkcy5sZW5ndGggIT09IDAgfHwgcmVzZXRGb3JtUmVmcy5sZW5ndGggIT09IDApIHtcblx0ICAgICAgICBjb25zdCBmaWVsZElkcyA9IG5ldyBTZXQocmVzZXRGb3JtUmVmcyk7XG5cdCAgICAgICAgZm9yIChjb25zdCBmaWVsZE5hbWUgb2YgcmVzZXRGb3JtRmllbGRzKSB7XG5cdCAgICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9maWVsZE9iamVjdHNbZmllbGROYW1lXSB8fCBbXTtcblx0ICAgICAgICAgIGZvciAoY29uc3Qge1xuXHQgICAgICAgICAgICBpZFxuXHQgICAgICAgICAgfSBvZiBmaWVsZHMpIHtcblx0ICAgICAgICAgICAgZmllbGRJZHMuYWRkKGlkKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZm9yIChjb25zdCBmaWVsZHMgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9maWVsZE9iamVjdHMpKSB7XG5cdCAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuXHQgICAgICAgICAgICBpZiAoZmllbGRJZHMuaGFzKGZpZWxkLmlkKSA9PT0gaW5jbHVkZSkge1xuXHQgICAgICAgICAgICAgIGFsbEZpZWxkcy5wdXNoKGZpZWxkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBmb3IgKGNvbnN0IGZpZWxkcyBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkT2JqZWN0cykpIHtcblx0ICAgICAgICAgIGFsbEZpZWxkcy5wdXNoKC4uLmZpZWxkcyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuXHQgICAgICBjb25zdCBhbGxJZHMgPSBbXTtcblx0ICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBhbGxGaWVsZHMpIHtcblx0ICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICBpZFxuXHQgICAgICAgIH0gPSBmaWVsZDtcblx0ICAgICAgICBhbGxJZHMucHVzaChpZCk7XG5cdCAgICAgICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG5cdCAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWUgfHwgXCJcIjtcblx0ICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZVxuXHQgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcblx0ICAgICAgICAgIGNhc2UgXCJyYWRpb2J1dHRvblwiOlxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5kZWZhdWx0VmFsdWUgPT09IGZpZWxkLmV4cG9ydFZhbHVlcztcblx0ICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZVxuXHQgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICBjYXNlIFwiY29tYm9ib3hcIjpcblx0ICAgICAgICAgIGNhc2UgXCJsaXN0Ym94XCI6XG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZSB8fCBcIlwiO1xuXHQgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICAgIHZhbHVlXG5cdCAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtZWxlbWVudC1pZD1cIiR7aWR9XCJdYCk7XG5cdCAgICAgICAgaWYgKCFkb21FbGVtZW50KSB7XG5cdCAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICB9IGVsc2UgaWYgKCFHZXRFbGVtZW50c0J5TmFtZVNldC5oYXMoZG9tRWxlbWVudCkpIHtcblx0ICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgX2JpbmRSZXNldEZvcm1BY3Rpb24gLSBlbGVtZW50IG5vdCBhbGxvd2VkOiAke2lkfWApO1xuXHQgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGRvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJyZXNldGZvcm1cIikpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZykge1xuXHQgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG5cdCAgICAgICAgICBzb3VyY2U6IHRoaXMsXG5cdCAgICAgICAgICBkZXRhaWw6IHtcblx0ICAgICAgICAgICAgaWQ6IFwiYXBwXCIsXG5cdCAgICAgICAgICAgIGlkczogYWxsSWRzLFxuXHQgICAgICAgICAgICBuYW1lOiBcIlJlc2V0Rm9ybVwiXG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ0ZXh0QW5ub3RhdGlvblwiKTtcblx0ICAgIGNvbnN0IGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcblx0ICAgIGltYWdlLnNyYyA9IHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoICsgXCJhbm5vdGF0aW9uLVwiICsgdGhpcy5kYXRhLm5hbWUudG9Mb3dlckNhc2UoKSArIFwiLnN2Z1wiO1xuXHQgICAgaW1hZ2UuYWx0ID0gXCJbe3t0eXBlfX0gQW5ub3RhdGlvbl1cIjtcblx0ICAgIGltYWdlLmRhdGFzZXQubDEwbklkID0gXCJ0ZXh0X2Fubm90YXRpb25fdHlwZVwiO1xuXHQgICAgaW1hZ2UuZGF0YXNldC5sMTBuQXJncyA9IEpTT04uc3RyaW5naWZ5KHtcblx0ICAgICAgdHlwZTogdGhpcy5kYXRhLm5hbWVcblx0ICAgIH0pO1xuXHQgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcblx0ICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoaW1hZ2UsIHRoaXMuZGF0YSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoaW1hZ2UpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICByZW5kZXIoKSB7XG5cdCAgICBpZiAodGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dCkge1xuXHQgICAgICB0aGlzLmNvbnRhaW5lci50aXRsZSA9IHRoaXMuZGF0YS5hbHRlcm5hdGl2ZVRleHQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHQgIHNob3dFbGVtZW50QW5kSGlkZUNhbnZhcyhlbGVtZW50KSB7XG5cdCAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuXHQgICAgICBpZiAoZWxlbWVudC5wcmV2aW91c1NpYmxpbmc/Lm5vZGVOYW1lID09PSBcIkNBTlZBU1wiKSB7XG5cdCAgICAgICAgZWxlbWVudC5wcmV2aW91c1NpYmxpbmcuaGlkZGVuID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgICBlbGVtZW50LmhpZGRlbiA9IGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblx0ICBfZ2V0S2V5TW9kaWZpZXIoZXZlbnQpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgaXNXaW4sXG5cdCAgICAgIGlzTWFjXG5cdCAgICB9ID0gX3V0aWwuRmVhdHVyZVRlc3QucGxhdGZvcm07XG5cdCAgICByZXR1cm4gaXNXaW4gJiYgZXZlbnQuY3RybEtleSB8fCBpc01hYyAmJiBldmVudC5tZXRhS2V5O1xuXHQgIH1cblx0ICBfc2V0RXZlbnRMaXN0ZW5lcihlbGVtZW50LCBiYXNlTmFtZSwgZXZlbnROYW1lLCB2YWx1ZUdldHRlcikge1xuXHQgICAgaWYgKGJhc2VOYW1lLmluY2x1ZGVzKFwibW91c2VcIikpIHtcblx0ICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJhc2VOYW1lLCBldmVudCA9PiB7XG5cdCAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcblx0ICAgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICAgIGRldGFpbDoge1xuXHQgICAgICAgICAgICBpZDogdGhpcy5kYXRhLmlkLFxuXHQgICAgICAgICAgICBuYW1lOiBldmVudE5hbWUsXG5cdCAgICAgICAgICAgIHZhbHVlOiB2YWx1ZUdldHRlcihldmVudCksXG5cdCAgICAgICAgICAgIHNoaWZ0OiBldmVudC5zaGlmdEtleSxcblx0ICAgICAgICAgICAgbW9kaWZpZXI6IHRoaXMuX2dldEtleU1vZGlmaWVyKGV2ZW50KVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihiYXNlTmFtZSwgZXZlbnQgPT4ge1xuXHQgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG5cdCAgICAgICAgICBzb3VyY2U6IHRoaXMsXG5cdCAgICAgICAgICBkZXRhaWw6IHtcblx0ICAgICAgICAgICAgaWQ6IHRoaXMuZGF0YS5pZCxcblx0ICAgICAgICAgICAgbmFtZTogZXZlbnROYW1lLFxuXHQgICAgICAgICAgICB2YWx1ZTogdmFsdWVHZXR0ZXIoZXZlbnQpXG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH1cblx0ICBfc2V0RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgbmFtZXMsIGdldHRlcikge1xuXHQgICAgZm9yIChjb25zdCBbYmFzZU5hbWUsIGV2ZW50TmFtZV0gb2YgbmFtZXMpIHtcblx0ICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gXCJBY3Rpb25cIiB8fCB0aGlzLmRhdGEuYWN0aW9ucz8uW2V2ZW50TmFtZV0pIHtcblx0ICAgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGJhc2VOYW1lLCBldmVudE5hbWUsIGdldHRlcik7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgX3NldEJhY2tncm91bmRDb2xvcihlbGVtZW50KSB7XG5cdCAgICBjb25zdCBjb2xvciA9IHRoaXMuZGF0YS5iYWNrZ3JvdW5kQ29sb3IgfHwgbnVsbDtcblx0ICAgIGVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3IgPT09IG51bGwgPyBcInRyYW5zcGFyZW50XCIgOiBfdXRpbC5VdGlsLm1ha2VIZXhDb2xvcihjb2xvclswXSwgY29sb3JbMV0sIGNvbG9yWzJdKTtcblx0ICB9XG5cdCAgX3NldFRleHRTdHlsZShlbGVtZW50KSB7XG5cdCAgICBjb25zdCBURVhUX0FMSUdOTUVOVCA9IFtcImxlZnRcIiwgXCJjZW50ZXJcIiwgXCJyaWdodFwiXTtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgZm9udENvbG9yXG5cdCAgICB9ID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YTtcblx0ICAgIGNvbnN0IGZvbnRTaXplID0gdGhpcy5kYXRhLmRlZmF1bHRBcHBlYXJhbmNlRGF0YS5mb250U2l6ZSB8fCBERUZBVUxUX0ZPTlRfU0laRTtcblx0ICAgIGNvbnN0IHN0eWxlID0gZWxlbWVudC5zdHlsZTtcblx0ICAgIGxldCBjb21wdXRlZEZvbnRTaXplO1xuXHQgICAgY29uc3QgQk9SREVSX1NJWkUgPSAyO1xuXHQgICAgY29uc3Qgcm91bmRUb09uZURlY2ltYWwgPSB4ID0+IE1hdGgucm91bmQoMTAgKiB4KSAvIDEwO1xuXHQgICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcblx0ICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnModGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXSAtIEJPUkRFUl9TSVpFKTtcblx0ICAgICAgY29uc3QgbnVtYmVyT2ZMaW5lcyA9IE1hdGgucm91bmQoaGVpZ2h0IC8gKF91dGlsLkxJTkVfRkFDVE9SICogZm9udFNpemUpKSB8fCAxO1xuXHQgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gaGVpZ2h0IC8gbnVtYmVyT2ZMaW5lcztcblx0ICAgICAgY29tcHV0ZWRGb250U2l6ZSA9IE1hdGgubWluKGZvbnRTaXplLCByb3VuZFRvT25lRGVjaW1hbChsaW5lSGVpZ2h0IC8gX3V0aWwuTElORV9GQUNUT1IpKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKHRoaXMuZGF0YS5yZWN0WzNdIC0gdGhpcy5kYXRhLnJlY3RbMV0gLSBCT1JERVJfU0laRSk7XG5cdCAgICAgIGNvbXB1dGVkRm9udFNpemUgPSBNYXRoLm1pbihmb250U2l6ZSwgcm91bmRUb09uZURlY2ltYWwoaGVpZ2h0IC8gX3V0aWwuTElORV9GQUNUT1IpKTtcblx0ICAgIH1cblx0ICAgIHN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHtjb21wdXRlZEZvbnRTaXplfXB4ICogdmFyKC0tc2NhbGUtZmFjdG9yKSlgO1xuXHQgICAgc3R5bGUuY29sb3IgPSBfdXRpbC5VdGlsLm1ha2VIZXhDb2xvcihmb250Q29sb3JbMF0sIGZvbnRDb2xvclsxXSwgZm9udENvbG9yWzJdKTtcblx0ICAgIGlmICh0aGlzLmRhdGEudGV4dEFsaWdubWVudCAhPT0gbnVsbCkge1xuXHQgICAgICBzdHlsZS50ZXh0QWxpZ24gPSBURVhUX0FMSUdOTUVOVFt0aGlzLmRhdGEudGV4dEFsaWdubWVudF07XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9zZXRSZXF1aXJlZChlbGVtZW50LCBpc1JlcXVpcmVkKSB7XG5cdCAgICBpZiAoaXNSZXF1aXJlZCkge1xuXHQgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIsIHRydWUpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKTtcblx0ICAgIH1cblx0ICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1yZXF1aXJlZFwiLCBpc1JlcXVpcmVkKTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgVGV4dFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9IHBhcmFtZXRlcnMucmVuZGVyRm9ybXMgfHwgIXBhcmFtZXRlcnMuZGF0YS5oYXNBcHBlYXJhbmNlICYmICEhcGFyYW1ldGVycy5kYXRhLmZpZWxkVmFsdWU7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHNldFByb3BlcnR5T25TaWJsaW5ncyhiYXNlLCBrZXksIHZhbHVlLCBrZXlJblN0b3JhZ2UpIHtcblx0ICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuXHQgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKGJhc2UubmFtZSwgYmFzZS5pZCkpIHtcblx0ICAgICAgaWYgKGVsZW1lbnQuZG9tRWxlbWVudCkge1xuXHQgICAgICAgIGVsZW1lbnQuZG9tRWxlbWVudFtrZXldID0gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgICAgc3RvcmFnZS5zZXRWYWx1ZShlbGVtZW50LmlkLCB7XG5cdCAgICAgICAgW2tleUluU3RvcmFnZV06IHZhbHVlXG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcblx0ICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhLmlkO1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInRleHRXaWRnZXRBbm5vdGF0aW9uXCIpO1xuXHQgICAgbGV0IGVsZW1lbnQgPSBudWxsO1xuXHQgICAgaWYgKHRoaXMucmVuZGVyRm9ybXMpIHtcblx0ICAgICAgY29uc3Qgc3RvcmVkRGF0YSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICB2YWx1ZTogdGhpcy5kYXRhLmZpZWxkVmFsdWVcblx0ICAgICAgfSk7XG5cdCAgICAgIGxldCB0ZXh0Q29udGVudCA9IHN0b3JlZERhdGEuZm9ybWF0dGVkVmFsdWUgfHwgc3RvcmVkRGF0YS52YWx1ZSB8fCBcIlwiO1xuXHQgICAgICBjb25zdCBtYXhMZW4gPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgY2hhckxpbWl0OiB0aGlzLmRhdGEubWF4TGVuXG5cdCAgICAgIH0pLmNoYXJMaW1pdDtcblx0ICAgICAgaWYgKG1heExlbiAmJiB0ZXh0Q29udGVudC5sZW5ndGggPiBtYXhMZW4pIHtcblx0ICAgICAgICB0ZXh0Q29udGVudCA9IHRleHRDb250ZW50LnNsaWNlKDAsIG1heExlbik7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgZWxlbWVudERhdGEgPSB7XG5cdCAgICAgICAgdXNlclZhbHVlOiB0ZXh0Q29udGVudCxcblx0ICAgICAgICBmb3JtYXR0ZWRWYWx1ZTogbnVsbCxcblx0ICAgICAgICBsYXN0Q29tbWl0dGVkVmFsdWU6IG51bGwsXG5cdCAgICAgICAgY29tbWl0S2V5OiAxXG5cdCAgICAgIH07XG5cdCAgICAgIGlmICh0aGlzLmRhdGEubXVsdGlMaW5lKSB7XG5cdCAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcblx0ICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7XG5cdCAgICAgICAgaWYgKHRoaXMuZGF0YS5kb05vdFNjcm9sbCkge1xuXHQgICAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBcImhpZGRlblwiO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHQgICAgICAgIGVsZW1lbnQudHlwZSA9IFwidGV4dFwiO1xuXHQgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgdGV4dENvbnRlbnQpO1xuXHQgICAgICAgIGlmICh0aGlzLmRhdGEuZG9Ob3RTY3JvbGwpIHtcblx0ICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYID0gXCJoaWRkZW5cIjtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuZGF0YS5oYXNPd25DYW52YXMpIHtcblx0ICAgICAgICBlbGVtZW50LmhpZGRlbiA9IHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKGVsZW1lbnQpO1xuXHQgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBpZCk7XG5cdCAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG5cdCAgICAgIGVsZW1lbnQubmFtZSA9IHRoaXMuZGF0YS5maWVsZE5hbWU7XG5cdCAgICAgIGVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcblx0ICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoZWxlbWVudCwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcblx0ICAgICAgaWYgKG1heExlbikge1xuXHQgICAgICAgIGVsZW1lbnQubWF4TGVuZ3RoID0gbWF4TGVuO1xuXHQgICAgICB9XG5cdCAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcblx0ICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5zZXRQcm9wZXJ0eU9uU2libGluZ3MoZWxlbWVudCwgXCJ2YWx1ZVwiLCBldmVudC50YXJnZXQudmFsdWUsIFwidmFsdWVcIik7XG5cdCAgICAgIH0pO1xuXHQgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZSA/PyBcIlwiO1xuXHQgICAgICAgIGVsZW1lbnQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG5cdCAgICAgICAgZWxlbWVudERhdGEuZm9ybWF0dGVkVmFsdWUgPSBudWxsO1xuXHQgICAgICB9KTtcblx0ICAgICAgbGV0IGJsdXJMaXN0ZW5lciA9IGV2ZW50ID0+IHtcblx0ICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZVxuXHQgICAgICAgIH0gPSBlbGVtZW50RGF0YTtcblx0ICAgICAgICBpZiAoZm9ybWF0dGVkVmFsdWUgIT09IG51bGwgJiYgZm9ybWF0dGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGV2ZW50LnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcblx0ICAgICAgfTtcblx0ICAgICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG5cdCAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICB0YXJnZXRcblx0ICAgICAgICAgIH0gPSBldmVudDtcblx0ICAgICAgICAgIGlmIChlbGVtZW50RGF0YS51c2VyVmFsdWUpIHtcblx0ICAgICAgICAgICAgdGFyZ2V0LnZhbHVlID0gZWxlbWVudERhdGEudXNlclZhbHVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xuXHQgICAgICAgICAgZWxlbWVudERhdGEuY29tbWl0S2V5ID0gMTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcblx0ICAgICAgICAgIHRoaXMuc2hvd0VsZW1lbnRBbmRIaWRlQ2FudmFzKGpzRXZlbnQudGFyZ2V0KTtcblx0ICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSB7XG5cdCAgICAgICAgICAgIHZhbHVlKGV2ZW50KSB7XG5cdCAgICAgICAgICAgICAgZWxlbWVudERhdGEudXNlclZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlID8/IFwiXCI7XG5cdCAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICAgICAgdmFsdWU6IGVsZW1lbnREYXRhLnVzZXJWYWx1ZS50b1N0cmluZygpXG5cdCAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZWxlbWVudERhdGEudXNlclZhbHVlO1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZShldmVudCkge1xuXHQgICAgICAgICAgICAgIGNvbnN0IHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlXG5cdCAgICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcblx0ICAgICAgICAgICAgICBlbGVtZW50RGF0YS5mb3JtYXR0ZWRWYWx1ZSA9IGZvcm1hdHRlZFZhbHVlO1xuXHQgICAgICAgICAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBmb3JtYXR0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LnRhcmdldCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuXHQgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlXG5cdCAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHNlbFJhbmdlKGV2ZW50KSB7XG5cdCAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKC4uLmV2ZW50LmRldGFpbC5zZWxSYW5nZSk7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGNoYXJMaW1pdDogZXZlbnQgPT4ge1xuXHQgICAgICAgICAgICAgIGNvbnN0IHtcblx0ICAgICAgICAgICAgICAgIGNoYXJMaW1pdFxuXHQgICAgICAgICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG5cdCAgICAgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICAgICAgdGFyZ2V0XG5cdCAgICAgICAgICAgICAgfSA9IGV2ZW50O1xuXHQgICAgICAgICAgICAgIGlmIChjaGFyTGltaXQgPT09IDApIHtcblx0ICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIik7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJtYXhMZW5ndGhcIiwgY2hhckxpbWl0KTtcblx0ICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG5cdCAgICAgICAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPD0gY2hhckxpbWl0KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgY2hhckxpbWl0KTtcblx0ICAgICAgICAgICAgICB0YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZVxuXHQgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG5cdCAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG5cdCAgICAgICAgICAgICAgICBkZXRhaWw6IHtcblx0ICAgICAgICAgICAgICAgICAgaWQsXG5cdCAgICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG5cdCAgICAgICAgICAgICAgICAgIHZhbHVlLFxuXHQgICAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiB0cnVlLFxuXHQgICAgICAgICAgICAgICAgICBjb21taXRLZXk6IDEsXG5cdCAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0OiB0YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG5cdCAgICAgICAgICAgICAgICAgIHNlbEVuZDogdGFyZ2V0LnNlbGVjdGlvbkVuZFxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgICAgZWxlbWVudERhdGEuY29tbWl0S2V5ID0gMTtcblx0ICAgICAgICAgIGxldCBjb21taXRLZXkgPSAtMTtcblx0ICAgICAgICAgIGlmIChldmVudC5rZXkgPT09IFwiRXNjYXBlXCIpIHtcblx0ICAgICAgICAgICAgY29tbWl0S2V5ID0gMDtcblx0ICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgJiYgIXRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcblx0ICAgICAgICAgICAgY29tbWl0S2V5ID0gMjtcblx0ICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiKSB7XG5cdCAgICAgICAgICAgIGVsZW1lbnREYXRhLmNvbW1pdEtleSA9IDM7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBpZiAoY29tbWl0S2V5ID09PSAtMSkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICAgIHZhbHVlXG5cdCAgICAgICAgICB9ID0gZXZlbnQudGFyZ2V0O1xuXHQgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSA9PT0gdmFsdWUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgICBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG5cdCAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICAgICAgZGV0YWlsOiB7XG5cdCAgICAgICAgICAgICAgaWQsXG5cdCAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcblx0ICAgICAgICAgICAgICB2YWx1ZSxcblx0ICAgICAgICAgICAgICB3aWxsQ29tbWl0OiB0cnVlLFxuXHQgICAgICAgICAgICAgIGNvbW1pdEtleSxcblx0ICAgICAgICAgICAgICBzZWxTdGFydDogZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0LFxuXHQgICAgICAgICAgICAgIHNlbEVuZDogZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZFxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICBjb25zdCBfYmx1ckxpc3RlbmVyID0gYmx1ckxpc3RlbmVyO1xuXHQgICAgICAgIGJsdXJMaXN0ZW5lciA9IG51bGw7XG5cdCAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBldmVudCA9PiB7XG5cdCAgICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICB2YWx1ZVxuXHQgICAgICAgICAgfSA9IGV2ZW50LnRhcmdldDtcblx0ICAgICAgICAgIGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmxhc3RDb21taXR0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcblx0ICAgICAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcblx0ICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG5cdCAgICAgICAgICAgICAgZGV0YWlsOiB7XG5cdCAgICAgICAgICAgICAgICBpZCxcblx0ICAgICAgICAgICAgICAgIG5hbWU6IFwiS2V5c3Ryb2tlXCIsXG5cdCAgICAgICAgICAgICAgICB2YWx1ZSxcblx0ICAgICAgICAgICAgICAgIHdpbGxDb21taXQ6IHRydWUsXG5cdCAgICAgICAgICAgICAgICBjb21taXRLZXk6IGVsZW1lbnREYXRhLmNvbW1pdEtleSxcblx0ICAgICAgICAgICAgICAgIHNlbFN0YXJ0OiBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzZWxFbmQ6IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmRcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgX2JsdXJMaXN0ZW5lcihldmVudCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgaWYgKHRoaXMuZGF0YS5hY3Rpb25zPy5LZXlzdHJva2UpIHtcblx0ICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIGV2ZW50ID0+IHtcblx0ICAgICAgICAgICAgZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID0gbnVsbDtcblx0ICAgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICAgIGRhdGEsXG5cdCAgICAgICAgICAgICAgdGFyZ2V0XG5cdCAgICAgICAgICAgIH0gPSBldmVudDtcblx0ICAgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICAgIHZhbHVlLFxuXHQgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0LFxuXHQgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZFxuXHQgICAgICAgICAgICB9ID0gdGFyZ2V0O1xuXHQgICAgICAgICAgICBsZXQgc2VsU3RhcnQgPSBzZWxlY3Rpb25TdGFydCxcblx0ICAgICAgICAgICAgICBzZWxFbmQgPSBzZWxlY3Rpb25FbmQ7XG5cdCAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuaW5wdXRUeXBlKSB7XG5cdCAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRCYWNrd2FyZFwiOlxuXHQgICAgICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1xcdypbXlxcd10qJC8pO1xuXHQgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzZWxTdGFydCAtPSBtYXRjaFswXS5sZW5ndGg7XG5cdCAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZVdvcmRGb3J3YXJkXCI6XG5cdCAgICAgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdmFsdWUuc3Vic3RyaW5nKHNlbGVjdGlvblN0YXJ0KS5tYXRjaCgvXlteXFx3XSpcXHcqLyk7XG5cdCAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHNlbEVuZCArPSBtYXRjaFswXS5sZW5ndGg7XG5cdCAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiOlxuXHQgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID09PSBzZWxlY3Rpb25FbmQpIHtcblx0ICAgICAgICAgICAgICAgICAgc2VsU3RhcnQgLT0gMTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgIGNhc2UgXCJkZWxldGVDb250ZW50Rm9yd2FyZFwiOlxuXHQgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID09PSBzZWxlY3Rpb25FbmQpIHtcblx0ICAgICAgICAgICAgICAgICAgc2VsRW5kICs9IDE7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuXHQgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICAgICAgICBkZXRhaWw6IHtcblx0ICAgICAgICAgICAgICAgIGlkLFxuXHQgICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcblx0ICAgICAgICAgICAgICAgIHZhbHVlLFxuXHQgICAgICAgICAgICAgICAgY2hhbmdlOiBkYXRhIHx8IFwiXCIsXG5cdCAgICAgICAgICAgICAgICB3aWxsQ29tbWl0OiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIHNlbFN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgc2VsRW5kXG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVycyhlbGVtZW50LCBbW1wiZm9jdXNcIiwgXCJGb2N1c1wiXSwgW1wiYmx1clwiLCBcIkJsdXJcIl0sIFtcIm1vdXNlZG93blwiLCBcIk1vdXNlIERvd25cIl0sIFtcIm1vdXNlZW50ZXJcIiwgXCJNb3VzZSBFbnRlclwiXSwgW1wibW91c2VsZWF2ZVwiLCBcIk1vdXNlIEV4aXRcIl0sIFtcIm1vdXNldXBcIiwgXCJNb3VzZSBVcFwiXV0sIGV2ZW50ID0+IGV2ZW50LnRhcmdldC52YWx1ZSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGJsdXJMaXN0ZW5lcikge1xuXHQgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgYmx1ckxpc3RlbmVyKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5kYXRhLmNvbWIpIHtcblx0ICAgICAgICBjb25zdCBmaWVsZFdpZHRoID0gdGhpcy5kYXRhLnJlY3RbMl0gLSB0aGlzLmRhdGEucmVjdFswXTtcblx0ICAgICAgICBjb25zdCBjb21iV2lkdGggPSBmaWVsZFdpZHRoIC8gbWF4TGVuO1xuXHQgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImNvbWJcIik7XG5cdCAgICAgICAgZWxlbWVudC5zdHlsZS5sZXR0ZXJTcGFjaW5nID0gYGNhbGMoJHtjb21iV2lkdGh9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpIC0gMWNoKWA7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5kYXRhLmZpZWxkVmFsdWU7XG5cdCAgICAgIGVsZW1lbnQuc3R5bGUudmVydGljYWxBbGlnbiA9IFwibWlkZGxlXCI7XG5cdCAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwidGFibGUtY2VsbFwiO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fc2V0VGV4dFN0eWxlKGVsZW1lbnQpO1xuXHQgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnQpO1xuXHQgICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoZWxlbWVudCk7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpc1JlbmRlcmFibGU6IHBhcmFtZXRlcnMucmVuZGVyRm9ybXNcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcblx0ICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG5cdCAgICBjb25zdCBpZCA9IGRhdGEuaWQ7XG5cdCAgICBsZXQgdmFsdWUgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG5cdCAgICAgIHZhbHVlOiBkYXRhLmV4cG9ydFZhbHVlID09PSBkYXRhLmZpZWxkVmFsdWVcblx0ICAgIH0pLnZhbHVlO1xuXHQgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuXHQgICAgICB2YWx1ZSA9IHZhbHVlICE9PSBcIk9mZlwiO1xuXHQgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgdmFsdWVcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiYnV0dG9uV2lkZ2V0QW5ub3RhdGlvblwiLCBcImNoZWNrQm94XCIpO1xuXHQgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcblx0ICAgIEdldEVsZW1lbnRzQnlOYW1lU2V0LmFkZChlbGVtZW50KTtcblx0ICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcblx0ICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBkYXRhLnJlYWRPbmx5O1xuXHQgICAgdGhpcy5fc2V0UmVxdWlyZWQoZWxlbWVudCwgdGhpcy5kYXRhLnJlcXVpcmVkKTtcblx0ICAgIGVsZW1lbnQudHlwZSA9IFwiY2hlY2tib3hcIjtcblx0ICAgIGVsZW1lbnQubmFtZSA9IGRhdGEuZmllbGROYW1lO1xuXHQgICAgaWYgKHZhbHVlKSB7XG5cdCAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB0cnVlKTtcblx0ICAgIH1cblx0ICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZXhwb3J0VmFsdWVcIiwgZGF0YS5leHBvcnRWYWx1ZSk7XG5cdCAgICBlbGVtZW50LnRhYkluZGV4ID0gREVGQVVMVF9UQUJfSU5ERVg7XG5cdCAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZXZlbnQgPT4ge1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgbmFtZSxcblx0ICAgICAgICBjaGVja2VkXG5cdCAgICAgIH0gPSBldmVudC50YXJnZXQ7XG5cdCAgICAgIGZvciAoY29uc3QgY2hlY2tib3ggb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUobmFtZSwgaWQpKSB7XG5cdCAgICAgICAgY29uc3QgY3VyQ2hlY2tlZCA9IGNoZWNrZWQgJiYgY2hlY2tib3guZXhwb3J0VmFsdWUgPT09IGRhdGEuZXhwb3J0VmFsdWU7XG5cdCAgICAgICAgaWYgKGNoZWNrYm94LmRvbUVsZW1lbnQpIHtcblx0ICAgICAgICAgIGNoZWNrYm94LmRvbUVsZW1lbnQuY2hlY2tlZCA9IGN1ckNoZWNrZWQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoY2hlY2tib3guaWQsIHtcblx0ICAgICAgICAgIHZhbHVlOiBjdXJDaGVja2VkXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgIHZhbHVlOiBjaGVja2VkXG5cdCAgICAgIH0pO1xuXHQgICAgfSk7XG5cdCAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuXHQgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkYXRhLmRlZmF1bHRGaWVsZFZhbHVlIHx8IFwiT2ZmXCI7XG5cdCAgICAgIGV2ZW50LnRhcmdldC5jaGVja2VkID0gZGVmYXVsdFZhbHVlID09PSBkYXRhLmV4cG9ydFZhbHVlO1xuXHQgICAgfSk7XG5cdCAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcblx0ICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwganNFdmVudCA9PiB7XG5cdCAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcblx0ICAgICAgICAgIHZhbHVlKGV2ZW50KSB7XG5cdCAgICAgICAgICAgIGV2ZW50LnRhcmdldC5jaGVja2VkID0gZXZlbnQuZGV0YWlsLnZhbHVlICE9PSBcIk9mZlwiO1xuXHQgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC5jaGVja2VkXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpO1xuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy5fc2V0RXZlbnRMaXN0ZW5lcnMoZWxlbWVudCwgW1tcImNoYW5nZVwiLCBcIlZhbGlkYXRlXCJdLCBbXCJjaGFuZ2VcIiwgXCJBY3Rpb25cIl0sIFtcImZvY3VzXCIsIFwiRm9jdXNcIl0sIFtcImJsdXJcIiwgXCJCbHVyXCJdLCBbXCJtb3VzZWRvd25cIiwgXCJNb3VzZSBEb3duXCJdLCBbXCJtb3VzZWVudGVyXCIsIFwiTW91c2UgRW50ZXJcIl0sIFtcIm1vdXNlbGVhdmVcIiwgXCJNb3VzZSBFeGl0XCJdLCBbXCJtb3VzZXVwXCIsIFwiTW91c2UgVXBcIl1dLCBldmVudCA9PiBldmVudC50YXJnZXQuY2hlY2tlZCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG5cdCAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhlbGVtZW50KTtcblx0ICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChlbGVtZW50KTtcblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZTogcGFyYW1ldGVycy5yZW5kZXJGb3Jtc1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwicmFkaW9CdXR0b25cIik7XG5cdCAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcblx0ICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG5cdCAgICBjb25zdCBpZCA9IGRhdGEuaWQ7XG5cdCAgICBsZXQgdmFsdWUgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG5cdCAgICAgIHZhbHVlOiBkYXRhLmZpZWxkVmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWVcblx0ICAgIH0pLnZhbHVlO1xuXHQgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuXHQgICAgICB2YWx1ZSA9IHZhbHVlICE9PSBkYXRhLmJ1dHRvblZhbHVlO1xuXHQgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgdmFsdWVcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHQgICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKGVsZW1lbnQpO1xuXHQgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuXHQgICAgZWxlbWVudC5kaXNhYmxlZCA9IGRhdGEucmVhZE9ubHk7XG5cdCAgICB0aGlzLl9zZXRSZXF1aXJlZChlbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuXHQgICAgZWxlbWVudC50eXBlID0gXCJyYWRpb1wiO1xuXHQgICAgZWxlbWVudC5uYW1lID0gZGF0YS5maWVsZE5hbWU7XG5cdCAgICBpZiAodmFsdWUpIHtcblx0ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuXHQgICAgfVxuXHQgICAgZWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuXHQgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGV2ZW50ID0+IHtcblx0ICAgICAgY29uc3Qge1xuXHQgICAgICAgIG5hbWUsXG5cdCAgICAgICAgY2hlY2tlZFxuXHQgICAgICB9ID0gZXZlbnQudGFyZ2V0O1xuXHQgICAgICBmb3IgKGNvbnN0IHJhZGlvIG9mIHRoaXMuX2dldEVsZW1lbnRzQnlOYW1lKG5hbWUsIGlkKSkge1xuXHQgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUocmFkaW8uaWQsIHtcblx0ICAgICAgICAgIHZhbHVlOiBmYWxzZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICB2YWx1ZTogY2hlY2tlZFxuXHQgICAgICB9KTtcblx0ICAgIH0pO1xuXHQgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicmVzZXRmb3JtXCIsIGV2ZW50ID0+IHtcblx0ICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTtcblx0ICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBkZWZhdWx0VmFsdWUgIT09IG51bGwgJiYgZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgZGVmYXVsdFZhbHVlID09PSBkYXRhLmJ1dHRvblZhbHVlO1xuXHQgICAgfSk7XG5cdCAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcblx0ICAgICAgY29uc3QgcGRmQnV0dG9uVmFsdWUgPSBkYXRhLmJ1dHRvblZhbHVlO1xuXHQgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcblx0ICAgICAgICBjb25zdCBhY3Rpb25zID0ge1xuXHQgICAgICAgICAgdmFsdWU6IGV2ZW50ID0+IHtcblx0ICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHBkZkJ1dHRvblZhbHVlID09PSBldmVudC5kZXRhaWwudmFsdWU7XG5cdCAgICAgICAgICAgIGZvciAoY29uc3QgcmFkaW8gb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoZXZlbnQudGFyZ2V0Lm5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgY29uc3QgY3VyQ2hlY2tlZCA9IGNoZWNrZWQgJiYgcmFkaW8uaWQgPT09IGlkO1xuXHQgICAgICAgICAgICAgIGlmIChyYWRpby5kb21FbGVtZW50KSB7XG5cdCAgICAgICAgICAgICAgICByYWRpby5kb21FbGVtZW50LmNoZWNrZWQgPSBjdXJDaGVja2VkO1xuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKHJhZGlvLmlkLCB7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZTogY3VyQ2hlY2tlZFxuXHQgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVycyhlbGVtZW50LCBbW1wiY2hhbmdlXCIsIFwiVmFsaWRhdGVcIl0sIFtcImNoYW5nZVwiLCBcIkFjdGlvblwiXSwgW1wiZm9jdXNcIiwgXCJGb2N1c1wiXSwgW1wiYmx1clwiLCBcIkJsdXJcIl0sIFtcIm1vdXNlZG93blwiLCBcIk1vdXNlIERvd25cIl0sIFtcIm1vdXNlZW50ZXJcIiwgXCJNb3VzZSBFbnRlclwiXSwgW1wibW91c2VsZWF2ZVwiLCBcIk1vdXNlIEV4aXRcIl0sIFtcIm1vdXNldXBcIiwgXCJNb3VzZSBVcFwiXV0sIGV2ZW50ID0+IGV2ZW50LnRhcmdldC5jaGVja2VkKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihlbGVtZW50KTtcblx0ICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGVsZW1lbnQpO1xuXHQgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBMaW5rQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaWdub3JlQm9yZGVyOiBwYXJhbWV0ZXJzLmRhdGEuaGFzQXBwZWFyYW5jZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGNvbnN0IGNvbnRhaW5lciA9IHN1cGVyLnJlbmRlcigpO1xuXHQgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwicHVzaEJ1dHRvblwiKTtcblx0ICAgIGlmICh0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KSB7XG5cdCAgICAgIGNvbnRhaW5lci50aXRsZSA9IHRoaXMuZGF0YS5hbHRlcm5hdGl2ZVRleHQ7XG5cdCAgICB9XG5cdCAgICBjb25zdCBsaW5rRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0Q2hpbGQ7XG5cdCAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMgJiYgbGlua0VsZW1lbnQpIHtcblx0ICAgICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMobGlua0VsZW1lbnQpO1xuXHQgICAgICBsaW5rRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidXBkYXRlZnJvbXNhbmRib3hcIiwganNFdmVudCA9PiB7XG5cdCAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KHt9LCBqc0V2ZW50KTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZTogcGFyYW1ldGVycy5yZW5kZXJGb3Jtc1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJjaG9pY2VXaWRnZXRBbm5vdGF0aW9uXCIpO1xuXHQgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG5cdCAgICBjb25zdCBpZCA9IHRoaXMuZGF0YS5pZDtcblx0ICAgIGNvbnN0IHN0b3JlZERhdGEgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG5cdCAgICAgIHZhbHVlOiB0aGlzLmRhdGEuZmllbGRWYWx1ZVxuXHQgICAgfSk7XG5cdCAgICBjb25zdCBzZWxlY3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcblx0ICAgIEdldEVsZW1lbnRzQnlOYW1lU2V0LmFkZChzZWxlY3RFbGVtZW50KTtcblx0ICAgIHNlbGVjdEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcblx0ICAgIHNlbGVjdEVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRhdGEucmVhZE9ubHk7XG5cdCAgICB0aGlzLl9zZXRSZXF1aXJlZChzZWxlY3RFbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuXHQgICAgc2VsZWN0RWxlbWVudC5uYW1lID0gdGhpcy5kYXRhLmZpZWxkTmFtZTtcblx0ICAgIHNlbGVjdEVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcblx0ICAgIGxldCBhZGRBbkVtcHR5RW50cnkgPSB0aGlzLmRhdGEuY29tYm8gJiYgdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoID4gMDtcblx0ICAgIGlmICghdGhpcy5kYXRhLmNvbWJvKSB7XG5cdCAgICAgIHNlbGVjdEVsZW1lbnQuc2l6ZSA9IHRoaXMuZGF0YS5vcHRpb25zLmxlbmd0aDtcblx0ICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aVNlbGVjdCkge1xuXHQgICAgICAgIHNlbGVjdEVsZW1lbnQubXVsdGlwbGUgPSB0cnVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuXHQgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGEuZGVmYXVsdEZpZWxkVmFsdWU7XG5cdCAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHNlbGVjdEVsZW1lbnQub3B0aW9ucykge1xuXHQgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IG9wdGlvbi52YWx1ZSA9PT0gZGVmYXVsdFZhbHVlO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIHRoaXMuZGF0YS5vcHRpb25zKSB7XG5cdCAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuXHQgICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gb3B0aW9uLmRpc3BsYXlWYWx1ZTtcblx0ICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IG9wdGlvbi5leHBvcnRWYWx1ZTtcblx0ICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUuaW5jbHVkZXMob3B0aW9uLmV4cG9ydFZhbHVlKSkge1xuXHQgICAgICAgIG9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgdHJ1ZSk7XG5cdCAgICAgICAgYWRkQW5FbXB0eUVudHJ5ID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmQob3B0aW9uRWxlbWVudCk7XG5cdCAgICB9XG5cdCAgICBsZXQgcmVtb3ZlRW1wdHlFbnRyeSA9IG51bGw7XG5cdCAgICBpZiAoYWRkQW5FbXB0eUVudHJ5KSB7XG5cdCAgICAgIGNvbnN0IG5vbmVPcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcblx0ICAgICAgbm9uZU9wdGlvbkVsZW1lbnQudmFsdWUgPSBcIiBcIjtcblx0ICAgICAgbm9uZU9wdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIHRydWUpO1xuXHQgICAgICBub25lT3B0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiLCB0cnVlKTtcblx0ICAgICAgc2VsZWN0RWxlbWVudC5wcmVwZW5kKG5vbmVPcHRpb25FbGVtZW50KTtcblx0ICAgICAgcmVtb3ZlRW1wdHlFbnRyeSA9ICgpID0+IHtcblx0ICAgICAgICBub25lT3B0aW9uRWxlbWVudC5yZW1vdmUoKTtcblx0ICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCByZW1vdmVFbXB0eUVudHJ5KTtcblx0ICAgICAgICByZW1vdmVFbXB0eUVudHJ5ID0gbnVsbDtcblx0ICAgICAgfTtcblx0ICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgcmVtb3ZlRW1wdHlFbnRyeSk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBnZXRWYWx1ZSA9IGlzRXhwb3J0ID0+IHtcblx0ICAgICAgY29uc3QgbmFtZSA9IGlzRXhwb3J0ID8gXCJ2YWx1ZVwiIDogXCJ0ZXh0Q29udGVudFwiO1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgb3B0aW9ucyxcblx0ICAgICAgICBtdWx0aXBsZVxuXHQgICAgICB9ID0gc2VsZWN0RWxlbWVudDtcblx0ICAgICAgaWYgKCFtdWx0aXBsZSkge1xuXHQgICAgICAgIHJldHVybiBvcHRpb25zLnNlbGVjdGVkSW5kZXggPT09IC0xID8gbnVsbCA6IG9wdGlvbnNbb3B0aW9ucy5zZWxlY3RlZEluZGV4XVtuYW1lXTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG9wdGlvbnMsIG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpLm1hcChvcHRpb24gPT4gb3B0aW9uW25hbWVdKTtcblx0ICAgIH07XG5cdCAgICBsZXQgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG5cdCAgICBjb25zdCBnZXRJdGVtcyA9IGV2ZW50ID0+IHtcblx0ICAgICAgY29uc3Qgb3B0aW9ucyA9IGV2ZW50LnRhcmdldC5vcHRpb25zO1xuXHQgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG9wdGlvbnMsIG9wdGlvbiA9PiB7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgIGRpc3BsYXlWYWx1ZTogb3B0aW9uLnRleHRDb250ZW50LFxuXHQgICAgICAgICAgZXhwb3J0VmFsdWU6IG9wdGlvbi52YWx1ZVxuXHQgICAgICAgIH07XG5cdCAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuXHQgICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcblx0ICAgICAgICBjb25zdCBhY3Rpb25zID0ge1xuXHQgICAgICAgICAgdmFsdWUoZXZlbnQpIHtcblx0ICAgICAgICAgICAgcmVtb3ZlRW1wdHlFbnRyeT8uKCk7XG5cdCAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuXHQgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBuZXcgU2V0KEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcblx0ICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2VsZWN0RWxlbWVudC5vcHRpb25zKSB7XG5cdCAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdmFsdWVzLmhhcyhvcHRpb24udmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSlcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuXHQgICAgICAgICAgfSxcblx0ICAgICAgICAgIG11bHRpcGxlU2VsZWN0aW9uKGV2ZW50KSB7XG5cdCAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQubXVsdGlwbGUgPSB0cnVlO1xuXHQgICAgICAgICAgfSxcblx0ICAgICAgICAgIHJlbW92ZShldmVudCkge1xuXHQgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZWN0RWxlbWVudC5vcHRpb25zO1xuXHQgICAgICAgICAgICBjb25zdCBpbmRleCA9IGV2ZW50LmRldGFpbC5yZW1vdmU7XG5cdCAgICAgICAgICAgIG9wdGlvbnNbaW5kZXhdLnNlbGVjdGVkID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlKGluZGV4KTtcblx0ICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgIGNvbnN0IGkgPSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4LmNhbGwob3B0aW9ucywgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG5cdCAgICAgICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zWzBdLnNlbGVjdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKSxcblx0ICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMoZXZlbnQpXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcblx0ICAgICAgICAgIH0sXG5cdCAgICAgICAgICBjbGVhcihldmVudCkge1xuXHQgICAgICAgICAgICB3aGlsZSAoc2VsZWN0RWxlbWVudC5sZW5ndGggIT09IDApIHtcblx0ICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LnJlbW92ZSgwKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgdmFsdWU6IG51bGwsXG5cdCAgICAgICAgICAgICAgaXRlbXM6IFtdXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcblx0ICAgICAgICAgIH0sXG5cdCAgICAgICAgICBpbnNlcnQoZXZlbnQpIHtcblx0ICAgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICAgIGluZGV4LFxuXHQgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSxcblx0ICAgICAgICAgICAgICBleHBvcnRWYWx1ZVxuXHQgICAgICAgICAgICB9ID0gZXZlbnQuZGV0YWlsLmluc2VydDtcblx0ICAgICAgICAgICAgY29uc3Qgc2VsZWN0Q2hpbGQgPSBzZWxlY3RFbGVtZW50LmNoaWxkcmVuW2luZGV4XTtcblx0ICAgICAgICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG5cdCAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBkaXNwbGF5VmFsdWU7XG5cdCAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBleHBvcnRWYWx1ZTtcblx0ICAgICAgICAgICAgaWYgKHNlbGVjdENoaWxkKSB7XG5cdCAgICAgICAgICAgICAgc2VsZWN0Q2hpbGQuYmVmb3JlKG9wdGlvbkVsZW1lbnQpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuYXBwZW5kKG9wdGlvbkVsZW1lbnQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSksXG5cdCAgICAgICAgICAgICAgaXRlbXM6IGdldEl0ZW1zKGV2ZW50KVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgaXRlbXMoZXZlbnQpIHtcblx0ICAgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICAgIGl0ZW1zXG5cdCAgICAgICAgICAgIH0gPSBldmVudC5kZXRhaWw7XG5cdCAgICAgICAgICAgIHdoaWxlIChzZWxlY3RFbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuXHQgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlKDApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuXHQgICAgICAgICAgICAgIGNvbnN0IHtcblx0ICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSxcblx0ICAgICAgICAgICAgICAgIGV4cG9ydFZhbHVlXG5cdCAgICAgICAgICAgICAgfSA9IGl0ZW07XG5cdCAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG5cdCAgICAgICAgICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGRpc3BsYXlWYWx1ZTtcblx0ICAgICAgICAgICAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gZXhwb3J0VmFsdWU7XG5cdCAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmQob3B0aW9uRWxlbWVudCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHNlbGVjdEVsZW1lbnQub3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5vcHRpb25zWzBdLnNlbGVjdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpLFxuXHQgICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhldmVudClcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuXHQgICAgICAgICAgfSxcblx0ICAgICAgICAgIGluZGljZXMoZXZlbnQpIHtcblx0ICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IG5ldyBTZXQoZXZlbnQuZGV0YWlsLmluZGljZXMpO1xuXHQgICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBldmVudC50YXJnZXQub3B0aW9ucykge1xuXHQgICAgICAgICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IGluZGljZXMuaGFzKG9wdGlvbi5pbmRleCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgZWRpdGFibGUoZXZlbnQpIHtcblx0ICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmRpc2FibGVkID0gIWV2ZW50LmRldGFpbC5lZGl0YWJsZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcblx0ICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IGdldFZhbHVlKHRydWUpO1xuXHQgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgIHZhbHVlOiBleHBvcnRWYWx1ZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcblx0ICAgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICAgIGRldGFpbDoge1xuXHQgICAgICAgICAgICBpZCxcblx0ICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcblx0ICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkVmFsdWVzLFxuXHQgICAgICAgICAgICBjaGFuZ2VFeDogZXhwb3J0VmFsdWUsXG5cdCAgICAgICAgICAgIHdpbGxDb21taXQ6IGZhbHNlLFxuXHQgICAgICAgICAgICBjb21taXRLZXk6IDEsXG5cdCAgICAgICAgICAgIGtleURvd246IGZhbHNlXG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVycyhzZWxlY3RFbGVtZW50LCBbW1wiZm9jdXNcIiwgXCJGb2N1c1wiXSwgW1wiYmx1clwiLCBcIkJsdXJcIl0sIFtcIm1vdXNlZG93blwiLCBcIk1vdXNlIERvd25cIl0sIFtcIm1vdXNlZW50ZXJcIiwgXCJNb3VzZSBFbnRlclwiXSwgW1wibW91c2VsZWF2ZVwiLCBcIk1vdXNlIEV4aXRcIl0sIFtcIm1vdXNldXBcIiwgXCJNb3VzZSBVcFwiXSwgW1wiaW5wdXRcIiwgXCJBY3Rpb25cIl0sIFtcImlucHV0XCIsIFwiVmFsaWRhdGVcIl1dLCBldmVudCA9PiBldmVudC50YXJnZXQudmFsdWUpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuZGF0YS5jb21ibykge1xuXHQgICAgICB0aGlzLl9zZXRUZXh0U3R5bGUoc2VsZWN0RWxlbWVudCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3Ioc2VsZWN0RWxlbWVudCk7XG5cdCAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhzZWxlY3RFbGVtZW50KTtcblx0ICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzZWxlY3RFbGVtZW50KTtcblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUG9wdXBBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICBzdGF0aWMgSUdOT1JFX1RZUEVTID0gbmV3IFNldChbXCJMaW5lXCIsIFwiU3F1YXJlXCIsIFwiQ2lyY2xlXCIsIFwiUG9seUxpbmVcIiwgXCJQb2x5Z29uXCIsIFwiSW5rXCJdKTtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGRhdGFcblx0ICAgIH0gPSBwYXJhbWV0ZXJzO1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gIVBvcHVwQW5ub3RhdGlvbkVsZW1lbnQuSUdOT1JFX1RZUEVTLmhhcyhkYXRhLnBhcmVudFR5cGUpICYmICEhKGRhdGEudGl0bGVPYmo/LnN0ciB8fCBkYXRhLmNvbnRlbnRzT2JqPy5zdHIgfHwgZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInBvcHVwQW5ub3RhdGlvblwiKTtcblx0ICAgIGNvbnN0IHBhcmVudEVsZW1lbnRzID0gdGhpcy5sYXllci5xdWVyeVNlbGVjdG9yQWxsKGBbZGF0YS1hbm5vdGF0aW9uLWlkPVwiJHt0aGlzLmRhdGEucGFyZW50SWR9XCJdYCk7XG5cdCAgICBpZiAocGFyZW50RWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHBvcHVwID0gbmV3IFBvcHVwRWxlbWVudCh7XG5cdCAgICAgIGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIsXG5cdCAgICAgIHRyaWdnZXI6IEFycmF5LmZyb20ocGFyZW50RWxlbWVudHMpLFxuXHQgICAgICBjb2xvcjogdGhpcy5kYXRhLmNvbG9yLFxuXHQgICAgICB0aXRsZU9iajogdGhpcy5kYXRhLnRpdGxlT2JqLFxuXHQgICAgICBtb2RpZmljYXRpb25EYXRlOiB0aGlzLmRhdGEubW9kaWZpY2F0aW9uRGF0ZSxcblx0ICAgICAgY29udGVudHNPYmo6IHRoaXMuZGF0YS5jb250ZW50c09iaixcblx0ICAgICAgcmljaFRleHQ6IHRoaXMuZGF0YS5yaWNoVGV4dFxuXHQgICAgfSk7XG5cdCAgICBjb25zdCBwYWdlID0gdGhpcy5wYWdlO1xuXHQgICAgY29uc3QgcmVjdCA9IF91dGlsLlV0aWwubm9ybWFsaXplUmVjdChbdGhpcy5kYXRhLnBhcmVudFJlY3RbMF0sIHBhZ2Uudmlld1szXSAtIHRoaXMuZGF0YS5wYXJlbnRSZWN0WzFdICsgcGFnZS52aWV3WzFdLCB0aGlzLmRhdGEucGFyZW50UmVjdFsyXSwgcGFnZS52aWV3WzNdIC0gdGhpcy5kYXRhLnBhcmVudFJlY3RbM10gKyBwYWdlLnZpZXdbMV1dKTtcblx0ICAgIGNvbnN0IHBvcHVwTGVmdCA9IHJlY3RbMF0gKyB0aGlzLmRhdGEucGFyZW50UmVjdFsyXSAtIHRoaXMuZGF0YS5wYXJlbnRSZWN0WzBdO1xuXHQgICAgY29uc3QgcG9wdXBUb3AgPSByZWN0WzFdO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBwYWdlV2lkdGgsXG5cdCAgICAgIHBhZ2VIZWlnaHQsXG5cdCAgICAgIHBhZ2VYLFxuXHQgICAgICBwYWdlWVxuXHQgICAgfSA9IHRoaXMudmlld3BvcnQucmF3RGltcztcblx0ICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHsxMDAgKiAocG9wdXBMZWZ0IC0gcGFnZVgpIC8gcGFnZVdpZHRofSVgO1xuXHQgICAgdGhpcy5jb250YWluZXIuc3R5bGUudG9wID0gYCR7MTAwICogKHBvcHVwVG9wIC0gcGFnZVkpIC8gcGFnZUhlaWdodH0lYDtcblx0ICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChwb3B1cC5yZW5kZXIoKSk7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFBvcHVwRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgdGhpcy5jb250YWluZXIgPSBwYXJhbWV0ZXJzLmNvbnRhaW5lcjtcblx0ICAgIHRoaXMudHJpZ2dlciA9IHBhcmFtZXRlcnMudHJpZ2dlcjtcblx0ICAgIHRoaXMuY29sb3IgPSBwYXJhbWV0ZXJzLmNvbG9yO1xuXHQgICAgdGhpcy50aXRsZU9iaiA9IHBhcmFtZXRlcnMudGl0bGVPYmo7XG5cdCAgICB0aGlzLm1vZGlmaWNhdGlvbkRhdGUgPSBwYXJhbWV0ZXJzLm1vZGlmaWNhdGlvbkRhdGU7XG5cdCAgICB0aGlzLmNvbnRlbnRzT2JqID0gcGFyYW1ldGVycy5jb250ZW50c09iajtcblx0ICAgIHRoaXMucmljaFRleHQgPSBwYXJhbWV0ZXJzLnJpY2hUZXh0O1xuXHQgICAgdGhpcy5oaWRlV3JhcHBlciA9IHBhcmFtZXRlcnMuaGlkZVdyYXBwZXIgfHwgZmFsc2U7XG5cdCAgICB0aGlzLnBpbm5lZCA9IGZhbHNlO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICBjb25zdCBCQUNLR1JPVU5EX0VOTElHSFQgPSAwLjc7XG5cdCAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZChcInBvcHVwV3JhcHBlclwiKTtcblx0ICAgIHRoaXMuaGlkZUVsZW1lbnQgPSB0aGlzLmhpZGVXcmFwcGVyID8gd3JhcHBlciA6IHRoaXMuY29udGFpbmVyO1xuXHQgICAgdGhpcy5oaWRlRWxlbWVudC5oaWRkZW4gPSB0cnVlO1xuXHQgICAgY29uc3QgcG9wdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgcG9wdXAuY2xhc3NMaXN0LmFkZChcInBvcHVwXCIpO1xuXHQgICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yO1xuXHQgICAgaWYgKGNvbG9yKSB7XG5cdCAgICAgIGNvbnN0IHIgPSBCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gY29sb3JbMF0pICsgY29sb3JbMF07XG5cdCAgICAgIGNvbnN0IGcgPSBCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gY29sb3JbMV0pICsgY29sb3JbMV07XG5cdCAgICAgIGNvbnN0IGIgPSBCQUNLR1JPVU5EX0VOTElHSFQgKiAoMjU1IC0gY29sb3JbMl0pICsgY29sb3JbMl07XG5cdCAgICAgIHBvcHVwLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKHIgfCAwLCBnIHwgMCwgYiB8IDApO1xuXHQgICAgfVxuXHQgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDFcIik7XG5cdCAgICB0aXRsZS5kaXIgPSB0aGlzLnRpdGxlT2JqLmRpcjtcblx0ICAgIHRpdGxlLnRleHRDb250ZW50ID0gdGhpcy50aXRsZU9iai5zdHI7XG5cdCAgICBwb3B1cC5hcHBlbmQodGl0bGUpO1xuXHQgICAgY29uc3QgZGF0ZU9iamVjdCA9IF9kaXNwbGF5X3V0aWxzLlBERkRhdGVTdHJpbmcudG9EYXRlT2JqZWN0KHRoaXMubW9kaWZpY2F0aW9uRGF0ZSk7XG5cdCAgICBpZiAoZGF0ZU9iamVjdCkge1xuXHQgICAgICBjb25zdCBtb2RpZmljYXRpb25EYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdCAgICAgIG1vZGlmaWNhdGlvbkRhdGUuY2xhc3NMaXN0LmFkZChcInBvcHVwRGF0ZVwiKTtcblx0ICAgICAgbW9kaWZpY2F0aW9uRGF0ZS50ZXh0Q29udGVudCA9IFwie3tkYXRlfX0sIHt7dGltZX19XCI7XG5cdCAgICAgIG1vZGlmaWNhdGlvbkRhdGUuZGF0YXNldC5sMTBuSWQgPSBcImFubm90YXRpb25fZGF0ZV9zdHJpbmdcIjtcblx0ICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5kYXRhc2V0LmwxMG5BcmdzID0gSlNPTi5zdHJpbmdpZnkoe1xuXHQgICAgICAgIGRhdGU6IGRhdGVPYmplY3QudG9Mb2NhbGVEYXRlU3RyaW5nKCksXG5cdCAgICAgICAgdGltZTogZGF0ZU9iamVjdC50b0xvY2FsZVRpbWVTdHJpbmcoKVxuXHQgICAgICB9KTtcblx0ICAgICAgcG9wdXAuYXBwZW5kKG1vZGlmaWNhdGlvbkRhdGUpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucmljaFRleHQ/LnN0ciAmJiAoIXRoaXMuY29udGVudHNPYmo/LnN0ciB8fCB0aGlzLmNvbnRlbnRzT2JqLnN0ciA9PT0gdGhpcy5yaWNoVGV4dC5zdHIpKSB7XG5cdCAgICAgIF94ZmFfbGF5ZXIuWGZhTGF5ZXIucmVuZGVyKHtcblx0ICAgICAgICB4ZmFIdG1sOiB0aGlzLnJpY2hUZXh0Lmh0bWwsXG5cdCAgICAgICAgaW50ZW50OiBcInJpY2hUZXh0XCIsXG5cdCAgICAgICAgZGl2OiBwb3B1cFxuXHQgICAgICB9KTtcblx0ICAgICAgcG9wdXAubGFzdENoaWxkLmNsYXNzTGlzdC5hZGQoXCJyaWNoVGV4dFwiLCBcInBvcHVwQ29udGVudFwiKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IGNvbnRlbnRzID0gdGhpcy5fZm9ybWF0Q29udGVudHModGhpcy5jb250ZW50c09iaik7XG5cdCAgICAgIHBvcHVwLmFwcGVuZChjb250ZW50cyk7XG5cdCAgICB9XG5cdCAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy50cmlnZ2VyKSkge1xuXHQgICAgICB0aGlzLnRyaWdnZXIgPSBbdGhpcy50cmlnZ2VyXTtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLnRyaWdnZXIpIHtcblx0ICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5fdG9nZ2xlLmJpbmQodGhpcykpO1xuXHQgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgdGhpcy5fc2hvdy5iaW5kKHRoaXMsIGZhbHNlKSk7XG5cdCAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIHRoaXMuX2hpZGUuYmluZCh0aGlzLCBmYWxzZSkpO1xuXHQgICAgfVxuXHQgICAgcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hpZGUuYmluZCh0aGlzLCB0cnVlKSk7XG5cdCAgICB3cmFwcGVyLmFwcGVuZChwb3B1cCk7XG5cdCAgICByZXR1cm4gd3JhcHBlcjtcblx0ICB9XG5cdCAgX2Zvcm1hdENvbnRlbnRzKHtcblx0ICAgIHN0cixcblx0ICAgIGRpclxuXHQgIH0pIHtcblx0ICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcblx0ICAgIHAuY2xhc3NMaXN0LmFkZChcInBvcHVwQ29udGVudFwiKTtcblx0ICAgIHAuZGlyID0gZGlyO1xuXHQgICAgY29uc3QgbGluZXMgPSBzdHIuc3BsaXQoLyg/Olxcclxcbj98XFxuKS8pO1xuXHQgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gbGluZXMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuXHQgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG5cdCAgICAgIHAuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUpKTtcblx0ICAgICAgaWYgKGkgPCBpaSAtIDEpIHtcblx0ICAgICAgICBwLmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcDtcblx0ICB9XG5cdCAgX3RvZ2dsZSgpIHtcblx0ICAgIGlmICh0aGlzLnBpbm5lZCkge1xuXHQgICAgICB0aGlzLl9oaWRlKHRydWUpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fc2hvdyh0cnVlKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX3Nob3cocGluID0gZmFsc2UpIHtcblx0ICAgIGlmIChwaW4pIHtcblx0ICAgICAgdGhpcy5waW5uZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuaGlkZUVsZW1lbnQuaGlkZGVuKSB7XG5cdCAgICAgIHRoaXMuaGlkZUVsZW1lbnQuaGlkZGVuID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IHBhcnNlSW50KHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCkgKyAxMDAwO1xuXHQgICAgfVxuXHQgIH1cblx0ICBfaGlkZSh1bnBpbiA9IHRydWUpIHtcblx0ICAgIGlmICh1bnBpbikge1xuXHQgICAgICB0aGlzLnBpbm5lZCA9IGZhbHNlO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0aGlzLmhpZGVFbGVtZW50LmhpZGRlbiAmJiAhdGhpcy5waW5uZWQpIHtcblx0ICAgICAgdGhpcy5oaWRlRWxlbWVudC5oaWRkZW4gPSB0cnVlO1xuXHQgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXggPSBwYXJzZUludCh0aGlzLmNvbnRhaW5lci5zdHlsZS56SW5kZXgpIC0gMTAwMDtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0Y2xhc3MgRnJlZVRleHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLnJpY2hUZXh0Py5zdHIpO1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpc1JlbmRlcmFibGUsXG5cdCAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgICB0aGlzLnRleHRDb250ZW50ID0gcGFyYW1ldGVycy5kYXRhLnRleHRDb250ZW50O1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZnJlZVRleHRBbm5vdGF0aW9uXCIpO1xuXHQgICAgaWYgKHRoaXMudGV4dENvbnRlbnQpIHtcblx0ICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdCAgICAgIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChcImFubm90YXRpb25UZXh0Q29udGVudFwiKTtcblx0ICAgICAgY29udGVudC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwiY29tbWVudFwiKTtcblx0ICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMudGV4dENvbnRlbnQpIHtcblx0ICAgICAgICBjb25zdCBsaW5lU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHQgICAgICAgIGxpbmVTcGFuLnRleHRDb250ZW50ID0gbGluZTtcblx0ICAgICAgICBjb250ZW50LmFwcGVuZChsaW5lU3Bhbik7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGNvbnRlbnQpO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcblx0ICAgICAgdGhpcy5fY3JlYXRlUG9wdXAobnVsbCwgdGhpcy5kYXRhKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgTGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImxpbmVBbm5vdGF0aW9uXCIpO1xuXHQgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgd2lkdGgsXG5cdCAgICAgIGhlaWdodFxuXHQgICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG5cdCAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuXHQgICAgY29uc3QgbGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmxpbmVcIik7XG5cdCAgICBsaW5lLnNldEF0dHJpYnV0ZShcIngxXCIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzBdKTtcblx0ICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieTFcIiwgZGF0YS5yZWN0WzNdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMV0pO1xuXHQgICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ4MlwiLCBkYXRhLnJlY3RbMl0gLSBkYXRhLmxpbmVDb29yZGluYXRlc1syXSk7XG5cdCAgICBsaW5lLnNldEF0dHJpYnV0ZShcInkyXCIsIGRhdGEucmVjdFszXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzNdKTtcblx0ICAgIGxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG5cdCAgICBsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuXHQgICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG5cdCAgICBzdmcuYXBwZW5kKGxpbmUpO1xuXHQgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG5cdCAgICB0aGlzLl9jcmVhdGVQb3B1cChsaW5lLCBkYXRhKTtcblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlLFxuXHQgICAgICBpZ25vcmVCb3JkZXI6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3F1YXJlQW5ub3RhdGlvblwiKTtcblx0ICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHdpZHRoLFxuXHQgICAgICBoZWlnaHRcblx0ICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuXHQgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcblx0ICAgIGNvbnN0IGJvcmRlcldpZHRoID0gZGF0YS5ib3JkZXJTdHlsZS53aWR0aDtcblx0ICAgIGNvbnN0IHNxdWFyZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG5cdCAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwieFwiLCBib3JkZXJXaWR0aCAvIDIpO1xuXHQgICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInlcIiwgYm9yZGVyV2lkdGggLyAyKTtcblx0ICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3aWR0aCAtIGJvcmRlcldpZHRoKTtcblx0ICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgaGVpZ2h0IC0gYm9yZGVyV2lkdGgpO1xuXHQgICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBib3JkZXJXaWR0aCB8fCAxKTtcblx0ICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcblx0ICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG5cdCAgICBzdmcuYXBwZW5kKHNxdWFyZSk7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcblx0ICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHNxdWFyZSwgZGF0YSk7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIENpcmNsZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNpcmNsZUFubm90YXRpb25cIik7XG5cdCAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICB3aWR0aCxcblx0ICAgICAgaGVpZ2h0XG5cdCAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcblx0ICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG5cdCAgICBjb25zdCBib3JkZXJXaWR0aCA9IGRhdGEuYm9yZGVyU3R5bGUud2lkdGg7XG5cdCAgICBjb25zdCBjaXJjbGUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzplbGxpcHNlXCIpO1xuXHQgICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcImN4XCIsIHdpZHRoIC8gMik7XG5cdCAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiY3lcIiwgaGVpZ2h0IC8gMik7XG5cdCAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwicnhcIiwgd2lkdGggLyAyIC0gYm9yZGVyV2lkdGggLyAyKTtcblx0ICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJyeVwiLCBoZWlnaHQgLyAyIC0gYm9yZGVyV2lkdGggLyAyKTtcblx0ICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgYm9yZGVyV2lkdGggfHwgMSk7XG5cdCAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG5cdCAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuXHQgICAgc3ZnLmFwcGVuZChjaXJjbGUpO1xuXHQgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG5cdCAgICB0aGlzLl9jcmVhdGVQb3B1cChjaXJjbGUsIGRhdGEpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG5cdCAgICB9KTtcblx0ICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJwb2x5bGluZUFubm90YXRpb25cIjtcblx0ICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5bGluZVwiO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lKTtcblx0ICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHdpZHRoLFxuXHQgICAgICBoZWlnaHRcblx0ICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuXHQgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcblx0ICAgIGxldCBwb2ludHMgPSBbXTtcblx0ICAgIGZvciAoY29uc3QgY29vcmRpbmF0ZSBvZiBkYXRhLnZlcnRpY2VzKSB7XG5cdCAgICAgIGNvbnN0IHggPSBjb29yZGluYXRlLnggLSBkYXRhLnJlY3RbMF07XG5cdCAgICAgIGNvbnN0IHkgPSBkYXRhLnJlY3RbM10gLSBjb29yZGluYXRlLnk7XG5cdCAgICAgIHBvaW50cy5wdXNoKHggKyBcIixcIiArIHkpO1xuXHQgICAgfVxuXHQgICAgcG9pbnRzID0gcG9pbnRzLmpvaW4oXCIgXCIpO1xuXHQgICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTtcblx0ICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBwb2ludHMpO1xuXHQgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggfHwgMSk7XG5cdCAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcblx0ICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcblx0ICAgIHN2Zy5hcHBlbmQocG9seWxpbmUpO1xuXHQgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG5cdCAgICB0aGlzLl9jcmVhdGVQb3B1cChwb2x5bGluZSwgZGF0YSk7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFBvbHlnb25Bbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMpO1xuXHQgICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcInBvbHlnb25Bbm5vdGF0aW9uXCI7XG5cdCAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gXCJzdmc6cG9seWdvblwiO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBDYXJldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNhcmV0QW5ub3RhdGlvblwiKTtcblx0ICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG5cdCAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKG51bGwsIHRoaXMuZGF0YSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIElua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG5cdCAgICB9KTtcblx0ICAgIHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lID0gXCJpbmtBbm5vdGF0aW9uXCI7XG5cdCAgICB0aGlzLnN2Z0VsZW1lbnROYW1lID0gXCJzdmc6cG9seWxpbmVcIjtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZCh0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSk7XG5cdCAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICB3aWR0aCxcblx0ICAgICAgaGVpZ2h0XG5cdCAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcblx0ICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG5cdCAgICBmb3IgKGNvbnN0IGlua0xpc3Qgb2YgZGF0YS5pbmtMaXN0cykge1xuXHQgICAgICBsZXQgcG9pbnRzID0gW107XG5cdCAgICAgIGZvciAoY29uc3QgY29vcmRpbmF0ZSBvZiBpbmtMaXN0KSB7XG5cdCAgICAgICAgY29uc3QgeCA9IGNvb3JkaW5hdGUueCAtIGRhdGEucmVjdFswXTtcblx0ICAgICAgICBjb25zdCB5ID0gZGF0YS5yZWN0WzNdIC0gY29vcmRpbmF0ZS55O1xuXHQgICAgICAgIHBvaW50cy5wdXNoKGAke3h9LCR7eX1gKTtcblx0ICAgICAgfVxuXHQgICAgICBwb2ludHMgPSBwb2ludHMuam9pbihcIiBcIik7XG5cdCAgICAgIGNvbnN0IHBvbHlsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQodGhpcy5zdmdFbGVtZW50TmFtZSk7XG5cdCAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInBvaW50c1wiLCBwb2ludHMpO1xuXHQgICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcblx0ICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG5cdCAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcblx0ICAgICAgdGhpcy5fY3JlYXRlUG9wdXAocG9seWxpbmUsIGRhdGEpO1xuXHQgICAgICBzdmcuYXBwZW5kKHBvbHlsaW5lKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBIaWdobGlnaHRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLnJpY2hUZXh0Py5zdHIpO1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpc1JlbmRlcmFibGUsXG5cdCAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZSxcblx0ICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuXHQgICAgICB0aGlzLl9jcmVhdGVQb3B1cChudWxsLCB0aGlzLmRhdGEpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucXVhZHJpbGF0ZXJhbHMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclF1YWRyaWxhdGVyYWxzKFwiaGlnaGxpZ2h0QW5ub3RhdGlvblwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJoaWdobGlnaHRBbm5vdGF0aW9uXCIpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBVbmRlcmxpbmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLnJpY2hUZXh0Py5zdHIpO1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpc1JlbmRlcmFibGUsXG5cdCAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZSxcblx0ICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuXHQgICAgICB0aGlzLl9jcmVhdGVQb3B1cChudWxsLCB0aGlzLmRhdGEpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucXVhZHJpbGF0ZXJhbHMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclF1YWRyaWxhdGVyYWxzKFwidW5kZXJsaW5lQW5ub3RhdGlvblwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ1bmRlcmxpbmVBbm5vdGF0aW9uXCIpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBTcXVpZ2dseUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuXHQgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG5cdCAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKG51bGwsIHRoaXMuZGF0YSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5xdWFkcmlsYXRlcmFscykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUXVhZHJpbGF0ZXJhbHMoXCJzcXVpZ2dseUFubm90YXRpb25cIik7XG5cdCAgICB9XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3F1aWdnbHlBbm5vdGF0aW9uXCIpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLnJpY2hUZXh0Py5zdHIpO1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpc1JlbmRlcmFibGUsXG5cdCAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZSxcblx0ICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuXHQgICAgICB0aGlzLl9jcmVhdGVQb3B1cChudWxsLCB0aGlzLmRhdGEpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucXVhZHJpbGF0ZXJhbHMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclF1YWRyaWxhdGVyYWxzKFwic3RyaWtlb3V0QW5ub3RhdGlvblwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzdHJpa2VvdXRBbm5vdGF0aW9uXCIpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBTdGFtcEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInN0YW1wQW5ub3RhdGlvblwiKTtcblx0ICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG5cdCAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKG51bGwsIHRoaXMuZGF0YSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIEZpbGVBdHRhY2htZW50QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpc1JlbmRlcmFibGU6IHRydWVcblx0ICAgIH0pO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBmaWxlbmFtZSxcblx0ICAgICAgY29udGVudFxuXHQgICAgfSA9IHRoaXMuZGF0YS5maWxlO1xuXHQgICAgdGhpcy5maWxlbmFtZSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRGaWxlbmFtZUZyb21VcmwpKGZpbGVuYW1lLCB0cnVlKTtcblx0ICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cdCAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImZpbGVhdHRhY2htZW50YW5ub3RhdGlvblwiLCB7XG5cdCAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgZmlsZW5hbWUsXG5cdCAgICAgIGNvbnRlbnRcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uXCIpO1xuXHQgICAgbGV0IHRyaWdnZXI7XG5cdCAgICBpZiAodGhpcy5kYXRhLmhhc0FwcGVhcmFuY2UpIHtcblx0ICAgICAgdHJpZ2dlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcblx0ICAgICAgdHJpZ2dlci5zcmMgPSBgJHt0aGlzLmltYWdlUmVzb3VyY2VzUGF0aH1hbm5vdGF0aW9uLSR7L3BhcGVyY2xpcC9pLnRlc3QodGhpcy5kYXRhLm5hbWUpID8gXCJwYXBlcmNsaXBcIiA6IFwicHVzaHBpblwifS5zdmdgO1xuXHQgICAgfVxuXHQgICAgdHJpZ2dlci5jbGFzc0xpc3QuYWRkKFwicG9wdXBUcmlnZ2VyQXJlYVwiKTtcblx0ICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsIHRoaXMuX2Rvd25sb2FkLmJpbmQodGhpcykpO1xuXHQgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXAgJiYgKHRoaXMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHRoaXMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHRoaXMuZGF0YS5yaWNoVGV4dCkpIHtcblx0ICAgICAgdGhpcy5fY3JlYXRlUG9wdXAodHJpZ2dlciwgdGhpcy5kYXRhKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZCh0cmlnZ2VyKTtcblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdCAgX2Rvd25sb2FkKCkge1xuXHQgICAgdGhpcy5kb3dubG9hZE1hbmFnZXI/Lm9wZW5PckRvd25sb2FkRGF0YSh0aGlzLmNvbnRhaW5lciwgdGhpcy5jb250ZW50LCB0aGlzLmZpbGVuYW1lKTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgQW5ub3RhdGlvbkxheWVyIHtcblx0ICBzdGF0aWMgI2FwcGVuZEVsZW1lbnQoZWxlbWVudCwgaWQsIGRpdiwgYWNjZXNzaWJpbGl0eU1hbmFnZXIpIHtcblx0ICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50ID0gZWxlbWVudC5maXJzdENoaWxkIHx8IGVsZW1lbnQ7XG5cdCAgICBjb250ZW50RWxlbWVudC5pZCA9IGAke19kaXNwbGF5X3V0aWxzLkFubm90YXRpb25QcmVmaXh9JHtpZH1gO1xuXHQgICAgZGl2LmFwcGVuZChlbGVtZW50KTtcblx0ICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyPy5tb3ZlRWxlbWVudEluRE9NKGRpdiwgZWxlbWVudCwgY29udGVudEVsZW1lbnQsIGZhbHNlKTtcblx0ICB9XG5cdCAgc3RhdGljIHJlbmRlcihwYXJhbXMpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgYW5ub3RhdGlvbnMsXG5cdCAgICAgIGRpdixcblx0ICAgICAgdmlld3BvcnQsXG5cdCAgICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyXG5cdCAgICB9ID0gcGFyYW1zO1xuXHQgICAgKDAsIF9kaXNwbGF5X3V0aWxzLnNldExheWVyRGltZW5zaW9ucykoZGl2LCB2aWV3cG9ydCk7XG5cdCAgICBjb25zdCBlbGVtZW50UGFyYW1zID0ge1xuXHQgICAgICBkYXRhOiBudWxsLFxuXHQgICAgICBsYXllcjogZGl2LFxuXHQgICAgICBwYWdlOiBwYXJhbXMucGFnZSxcblx0ICAgICAgdmlld3BvcnQsXG5cdCAgICAgIGxpbmtTZXJ2aWNlOiBwYXJhbXMubGlua1NlcnZpY2UsXG5cdCAgICAgIGRvd25sb2FkTWFuYWdlcjogcGFyYW1zLmRvd25sb2FkTWFuYWdlcixcblx0ICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiBwYXJhbXMuaW1hZ2VSZXNvdXJjZXNQYXRoIHx8IFwiXCIsXG5cdCAgICAgIHJlbmRlckZvcm1zOiBwYXJhbXMucmVuZGVyRm9ybXMgIT09IGZhbHNlLFxuXHQgICAgICBzdmdGYWN0b3J5OiBuZXcgX2Rpc3BsYXlfdXRpbHMuRE9NU1ZHRmFjdG9yeSgpLFxuXHQgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogcGFyYW1zLmFubm90YXRpb25TdG9yYWdlIHx8IG5ldyBfYW5ub3RhdGlvbl9zdG9yYWdlLkFubm90YXRpb25TdG9yYWdlKCksXG5cdCAgICAgIGVuYWJsZVNjcmlwdGluZzogcGFyYW1zLmVuYWJsZVNjcmlwdGluZyA9PT0gdHJ1ZSxcblx0ICAgICAgaGFzSlNBY3Rpb25zOiBwYXJhbXMuaGFzSlNBY3Rpb25zLFxuXHQgICAgICBmaWVsZE9iamVjdHM6IHBhcmFtcy5maWVsZE9iamVjdHNcblx0ICAgIH07XG5cdCAgICBsZXQgekluZGV4ID0gMDtcblx0ICAgIGZvciAoY29uc3QgZGF0YSBvZiBhbm5vdGF0aW9ucykge1xuXHQgICAgICBpZiAoZGF0YS5ub0hUTUwpIHtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoZGF0YS5hbm5vdGF0aW9uVHlwZSAhPT0gX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9QVVApIHtcblx0ICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICB3aWR0aCxcblx0ICAgICAgICAgIGhlaWdodFxuXHQgICAgICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuXHQgICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG5cdCAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgZWxlbWVudFBhcmFtcy5kYXRhID0gZGF0YTtcblx0ICAgICAgY29uc3QgZWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50RmFjdG9yeS5jcmVhdGUoZWxlbWVudFBhcmFtcyk7XG5cdCAgICAgIGlmICghZWxlbWVudC5pc1JlbmRlcmFibGUpIHtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCByZW5kZXJlZCA9IGVsZW1lbnQucmVuZGVyKCk7XG5cdCAgICAgIGlmIChkYXRhLmhpZGRlbikge1xuXHQgICAgICAgIHJlbmRlcmVkLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlbmRlcmVkKSkge1xuXHQgICAgICAgIGZvciAoY29uc3QgcmVuZGVyZWRFbGVtZW50IG9mIHJlbmRlcmVkKSB7XG5cdCAgICAgICAgICByZW5kZXJlZEVsZW1lbnQuc3R5bGUuekluZGV4ID0gekluZGV4Kys7XG5cdCAgICAgICAgICBBbm5vdGF0aW9uTGF5ZXIuI2FwcGVuZEVsZW1lbnQocmVuZGVyZWRFbGVtZW50LCBkYXRhLmlkLCBkaXYsIGFjY2Vzc2liaWxpdHlNYW5hZ2VyKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcmVuZGVyZWQuc3R5bGUuekluZGV4ID0gekluZGV4Kys7XG5cdCAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQb3B1cEFubm90YXRpb25FbGVtZW50KSB7XG5cdCAgICAgICAgICBkaXYucHJlcGVuZChyZW5kZXJlZCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIEFubm90YXRpb25MYXllci4jYXBwZW5kRWxlbWVudChyZW5kZXJlZCwgZGF0YS5pZCwgZGl2LCBhY2Nlc3NpYmlsaXR5TWFuYWdlcik7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLiNzZXRBbm5vdGF0aW9uQ2FudmFzTWFwKGRpdiwgcGFyYW1zLmFubm90YXRpb25DYW52YXNNYXApO1xuXHQgIH1cblx0ICBzdGF0aWMgdXBkYXRlKHBhcmFtcykge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwLFxuXHQgICAgICBkaXYsXG5cdCAgICAgIHZpZXdwb3J0XG5cdCAgICB9ID0gcGFyYW1zO1xuXHQgICAgKDAsIF9kaXNwbGF5X3V0aWxzLnNldExheWVyRGltZW5zaW9ucykoZGl2LCB7XG5cdCAgICAgIHJvdGF0aW9uOiB2aWV3cG9ydC5yb3RhdGlvblxuXHQgICAgfSk7XG5cdCAgICB0aGlzLiNzZXRBbm5vdGF0aW9uQ2FudmFzTWFwKGRpdiwgYW5ub3RhdGlvbkNhbnZhc01hcCk7XG5cdCAgICBkaXYuaGlkZGVuID0gZmFsc2U7XG5cdCAgfVxuXHQgIHN0YXRpYyAjc2V0QW5ub3RhdGlvbkNhbnZhc01hcChkaXYsIGFubm90YXRpb25DYW52YXNNYXApIHtcblx0ICAgIGlmICghYW5ub3RhdGlvbkNhbnZhc01hcCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IFtpZCwgY2FudmFzXSBvZiBhbm5vdGF0aW9uQ2FudmFzTWFwKSB7XG5cdCAgICAgIGNvbnN0IGVsZW1lbnQgPSBkaXYucXVlcnlTZWxlY3RvcihgW2RhdGEtYW5ub3RhdGlvbi1pZD1cIiR7aWR9XCJdYCk7XG5cdCAgICAgIGlmICghZWxlbWVudCkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBmaXJzdENoaWxkXG5cdCAgICAgIH0gPSBlbGVtZW50O1xuXHQgICAgICBpZiAoIWZpcnN0Q2hpbGQpIHtcblx0ICAgICAgICBlbGVtZW50LmFwcGVuZChjYW52YXMpO1xuXHQgICAgICB9IGVsc2UgaWYgKGZpcnN0Q2hpbGQubm9kZU5hbWUgPT09IFwiQ0FOVkFTXCIpIHtcblx0ICAgICAgICBmaXJzdENoaWxkLnJlcGxhY2VXaXRoKGNhbnZhcyk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgZmlyc3RDaGlsZC5iZWZvcmUoY2FudmFzKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgYW5ub3RhdGlvbkNhbnZhc01hcC5jbGVhcigpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkFubm90YXRpb25MYXllciA9IEFubm90YXRpb25MYXllcjtcblxuXHQvKioqLyB9KSxcblx0LyogMzMgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLkNvbG9yQ29udmVydGVycyA9IHZvaWQgMDtcblx0ZnVuY3Rpb24gbWFrZUNvbG9yQ29tcChuKSB7XG5cdCAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgbikpICogMjU1KS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpO1xuXHR9XG5cdGNsYXNzIENvbG9yQ29udmVydGVycyB7XG5cdCAgc3RhdGljIENNWUtfRyhbYywgeSwgbSwga10pIHtcblx0ICAgIHJldHVybiBbXCJHXCIsIDEgLSBNYXRoLm1pbigxLCAwLjMgKiBjICsgMC41OSAqIG0gKyAwLjExICogeSArIGspXTtcblx0ICB9XG5cdCAgc3RhdGljIEdfQ01ZSyhbZ10pIHtcblx0ICAgIHJldHVybiBbXCJDTVlLXCIsIDAsIDAsIDAsIDEgLSBnXTtcblx0ICB9XG5cdCAgc3RhdGljIEdfUkdCKFtnXSkge1xuXHQgICAgcmV0dXJuIFtcIlJHQlwiLCBnLCBnLCBnXTtcblx0ICB9XG5cdCAgc3RhdGljIEdfSFRNTChbZ10pIHtcblx0ICAgIGNvbnN0IEcgPSBtYWtlQ29sb3JDb21wKGcpO1xuXHQgICAgcmV0dXJuIGAjJHtHfSR7R30ke0d9YDtcblx0ICB9XG5cdCAgc3RhdGljIFJHQl9HKFtyLCBnLCBiXSkge1xuXHQgICAgcmV0dXJuIFtcIkdcIiwgMC4zICogciArIDAuNTkgKiBnICsgMC4xMSAqIGJdO1xuXHQgIH1cblx0ICBzdGF0aWMgUkdCX0hUTUwoW3IsIGcsIGJdKSB7XG5cdCAgICBjb25zdCBSID0gbWFrZUNvbG9yQ29tcChyKTtcblx0ICAgIGNvbnN0IEcgPSBtYWtlQ29sb3JDb21wKGcpO1xuXHQgICAgY29uc3QgQiA9IG1ha2VDb2xvckNvbXAoYik7XG5cdCAgICByZXR1cm4gYCMke1J9JHtHfSR7Qn1gO1xuXHQgIH1cblx0ICBzdGF0aWMgVF9IVE1MKCkge1xuXHQgICAgcmV0dXJuIFwiIzAwMDAwMDAwXCI7XG5cdCAgfVxuXHQgIHN0YXRpYyBDTVlLX1JHQihbYywgeSwgbSwga10pIHtcblx0ICAgIHJldHVybiBbXCJSR0JcIiwgMSAtIE1hdGgubWluKDEsIGMgKyBrKSwgMSAtIE1hdGgubWluKDEsIG0gKyBrKSwgMSAtIE1hdGgubWluKDEsIHkgKyBrKV07XG5cdCAgfVxuXHQgIHN0YXRpYyBDTVlLX0hUTUwoY29tcG9uZW50cykge1xuXHQgICAgY29uc3QgcmdiID0gdGhpcy5DTVlLX1JHQihjb21wb25lbnRzKS5zbGljZSgxKTtcblx0ICAgIHJldHVybiB0aGlzLlJHQl9IVE1MKHJnYik7XG5cdCAgfVxuXHQgIHN0YXRpYyBSR0JfQ01ZSyhbciwgZywgYl0pIHtcblx0ICAgIGNvbnN0IGMgPSAxIC0gcjtcblx0ICAgIGNvbnN0IG0gPSAxIC0gZztcblx0ICAgIGNvbnN0IHkgPSAxIC0gYjtcblx0ICAgIGNvbnN0IGsgPSBNYXRoLm1pbihjLCBtLCB5KTtcblx0ICAgIHJldHVybiBbXCJDTVlLXCIsIGMsIG0sIHksIGtdO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkNvbG9yQ29udmVydGVycyA9IENvbG9yQ29udmVydGVycztcblxuXHQvKioqLyB9KSxcblx0LyogMzQgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLlhmYUxheWVyID0gdm9pZCAwO1xuXHR2YXIgX3hmYV90ZXh0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7XG5cdGNsYXNzIFhmYUxheWVyIHtcblx0ICBzdGF0aWMgc2V0dXBTdG9yYWdlKGh0bWwsIGlkLCBlbGVtZW50LCBzdG9yYWdlLCBpbnRlbnQpIHtcblx0ICAgIGNvbnN0IHN0b3JlZERhdGEgPSBzdG9yYWdlLmdldFZhbHVlKGlkLCB7XG5cdCAgICAgIHZhbHVlOiBudWxsXG5cdCAgICB9KTtcblx0ICAgIHN3aXRjaCAoZWxlbWVudC5uYW1lKSB7XG5cdCAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuXHQgICAgICAgIGlmIChzdG9yZWREYXRhLnZhbHVlICE9PSBudWxsKSB7XG5cdCAgICAgICAgICBodG1sLnRleHRDb250ZW50ID0gc3RvcmVkRGF0YS52YWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGludGVudCA9PT0gXCJwcmludFwiKSB7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBcImlucHV0XCI6XG5cdCAgICAgICAgaWYgKGVsZW1lbnQuYXR0cmlidXRlcy50eXBlID09PSBcInJhZGlvXCIgfHwgZWxlbWVudC5hdHRyaWJ1dGVzLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuXHQgICAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgPT09IGVsZW1lbnQuYXR0cmlidXRlcy54ZmFPbikge1xuXHQgICAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgdHJ1ZSk7XG5cdCAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlZERhdGEudmFsdWUgPT09IGVsZW1lbnQuYXR0cmlidXRlcy54ZmFPZmYpIHtcblx0ICAgICAgICAgICAgaHRtbC5yZW1vdmVBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKGludGVudCA9PT0gXCJwcmludFwiKSB7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIGV2ZW50ID0+IHtcblx0ICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQuY2hlY2tlZCA/IGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ4ZmFPblwiKSA6IGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ4ZmFPZmZcIilcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBzdG9yZWREYXRhLnZhbHVlKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGlmIChpbnRlbnQgPT09IFwicHJpbnRcIikge1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGh0bWwuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIGV2ZW50ID0+IHtcblx0ICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgXCJzZWxlY3RcIjpcblx0ICAgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZSAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5jaGlsZHJlbikge1xuXHQgICAgICAgICAgICBpZiAob3B0aW9uLmF0dHJpYnV0ZXMudmFsdWUgPT09IHN0b3JlZERhdGEudmFsdWUpIHtcblx0ICAgICAgICAgICAgICBvcHRpb24uYXR0cmlidXRlcy5zZWxlY3RlZCA9IHRydWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGV2ZW50LnRhcmdldC5vcHRpb25zO1xuXHQgICAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnNlbGVjdGVkSW5kZXggPT09IC0xID8gXCJcIiA6IG9wdGlvbnNbb3B0aW9ucy5zZWxlY3RlZEluZGV4XS52YWx1ZTtcblx0ICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgdmFsdWVcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzdGF0aWMgc2V0QXR0cmlidXRlcyh7XG5cdCAgICBodG1sLFxuXHQgICAgZWxlbWVudCxcblx0ICAgIHN0b3JhZ2UgPSBudWxsLFxuXHQgICAgaW50ZW50LFxuXHQgICAgbGlua1NlcnZpY2Vcblx0ICB9KSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGF0dHJpYnV0ZXNcblx0ICAgIH0gPSBlbGVtZW50O1xuXHQgICAgY29uc3QgaXNIVE1MQW5jaG9yRWxlbWVudCA9IGh0bWwgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudDtcblx0ICAgIGlmIChhdHRyaWJ1dGVzLnR5cGUgPT09IFwicmFkaW9cIikge1xuXHQgICAgICBhdHRyaWJ1dGVzLm5hbWUgPSBgJHthdHRyaWJ1dGVzLm5hbWV9LSR7aW50ZW50fWA7XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVzKSkge1xuXHQgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIHN3aXRjaCAoa2V5KSB7XG5cdCAgICAgICAgY2FzZSBcImNsYXNzXCI6XG5cdCAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUuam9pbihcIiBcIikpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcImRhdGFJZFwiOlxuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcImlkXCI6XG5cdCAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCB2YWx1ZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwic3R5bGVcIjpcblx0ICAgICAgICAgIE9iamVjdC5hc3NpZ24oaHRtbC5zdHlsZSwgdmFsdWUpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcInRleHRDb250ZW50XCI6XG5cdCAgICAgICAgICBodG1sLnRleHRDb250ZW50ID0gdmFsdWU7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgaWYgKCFpc0hUTUxBbmNob3JFbGVtZW50IHx8IGtleSAhPT0gXCJocmVmXCIgJiYga2V5ICE9PSBcIm5ld1dpbmRvd1wiKSB7XG5cdCAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAoaXNIVE1MQW5jaG9yRWxlbWVudCkge1xuXHQgICAgICBsaW5rU2VydmljZS5hZGRMaW5rQXR0cmlidXRlcyhodG1sLCBhdHRyaWJ1dGVzLmhyZWYsIGF0dHJpYnV0ZXMubmV3V2luZG93KTtcblx0ICAgIH1cblx0ICAgIGlmIChzdG9yYWdlICYmIGF0dHJpYnV0ZXMuZGF0YUlkKSB7XG5cdCAgICAgIHRoaXMuc2V0dXBTdG9yYWdlKGh0bWwsIGF0dHJpYnV0ZXMuZGF0YUlkLCBlbGVtZW50LCBzdG9yYWdlKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgc3RhdGljIHJlbmRlcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBjb25zdCBzdG9yYWdlID0gcGFyYW1ldGVycy5hbm5vdGF0aW9uU3RvcmFnZTtcblx0ICAgIGNvbnN0IGxpbmtTZXJ2aWNlID0gcGFyYW1ldGVycy5saW5rU2VydmljZTtcblx0ICAgIGNvbnN0IHJvb3QgPSBwYXJhbWV0ZXJzLnhmYUh0bWw7XG5cdCAgICBjb25zdCBpbnRlbnQgPSBwYXJhbWV0ZXJzLmludGVudCB8fCBcImRpc3BsYXlcIjtcblx0ICAgIGNvbnN0IHJvb3RIdG1sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyb290Lm5hbWUpO1xuXHQgICAgaWYgKHJvb3QuYXR0cmlidXRlcykge1xuXHQgICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoe1xuXHQgICAgICAgIGh0bWw6IHJvb3RIdG1sLFxuXHQgICAgICAgIGVsZW1lbnQ6IHJvb3QsXG5cdCAgICAgICAgaW50ZW50LFxuXHQgICAgICAgIGxpbmtTZXJ2aWNlXG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgc3RhY2sgPSBbW3Jvb3QsIC0xLCByb290SHRtbF1dO1xuXHQgICAgY29uc3Qgcm9vdERpdiA9IHBhcmFtZXRlcnMuZGl2O1xuXHQgICAgcm9vdERpdi5hcHBlbmQocm9vdEh0bWwpO1xuXHQgICAgaWYgKHBhcmFtZXRlcnMudmlld3BvcnQpIHtcblx0ICAgICAgY29uc3QgdHJhbnNmb3JtID0gYG1hdHJpeCgke3BhcmFtZXRlcnMudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oXCIsXCIpfSlgO1xuXHQgICAgICByb290RGl2LnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcblx0ICAgIH1cblx0ICAgIGlmIChpbnRlbnQgIT09IFwicmljaFRleHRcIikge1xuXHQgICAgICByb290RGl2LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwieGZhTGF5ZXIgeGZhRm9udFwiKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHRleHREaXZzID0gW107XG5cdCAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICBjb25zdCBbcGFyZW50LCBpLCBodG1sXSA9IHN0YWNrLmF0KC0xKTtcblx0ICAgICAgaWYgKGkgKyAxID09PSBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG5cdCAgICAgICAgc3RhY2sucG9wKCk7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgY2hpbGQgPSBwYXJlbnQuY2hpbGRyZW5bKytzdGFjay5hdCgtMSlbMV1dO1xuXHQgICAgICBpZiAoY2hpbGQgPT09IG51bGwpIHtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgbmFtZVxuXHQgICAgICB9ID0gY2hpbGQ7XG5cdCAgICAgIGlmIChuYW1lID09PSBcIiN0ZXh0XCIpIHtcblx0ICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQudmFsdWUpO1xuXHQgICAgICAgIHRleHREaXZzLnB1c2gobm9kZSk7XG5cdCAgICAgICAgaHRtbC5hcHBlbmQobm9kZSk7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgbGV0IGNoaWxkSHRtbDtcblx0ICAgICAgaWYgKGNoaWxkPy5hdHRyaWJ1dGVzPy54bWxucykge1xuXHQgICAgICAgIGNoaWxkSHRtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhjaGlsZC5hdHRyaWJ1dGVzLnhtbG5zLCBuYW1lKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjaGlsZEh0bWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpO1xuXHQgICAgICB9XG5cdCAgICAgIGh0bWwuYXBwZW5kKGNoaWxkSHRtbCk7XG5cdCAgICAgIGlmIChjaGlsZC5hdHRyaWJ1dGVzKSB7XG5cdCAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVzKHtcblx0ICAgICAgICAgIGh0bWw6IGNoaWxkSHRtbCxcblx0ICAgICAgICAgIGVsZW1lbnQ6IGNoaWxkLFxuXHQgICAgICAgICAgc3RvcmFnZSxcblx0ICAgICAgICAgIGludGVudCxcblx0ICAgICAgICAgIGxpbmtTZXJ2aWNlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICBzdGFjay5wdXNoKFtjaGlsZCwgLTEsIGNoaWxkSHRtbF0pO1xuXHQgICAgICB9IGVsc2UgaWYgKGNoaWxkLnZhbHVlKSB7XG5cdCAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkLnZhbHVlKTtcblx0ICAgICAgICBpZiAoX3hmYV90ZXh0LlhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KG5hbWUpKSB7XG5cdCAgICAgICAgICB0ZXh0RGl2cy5wdXNoKG5vZGUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjaGlsZEh0bWwuYXBwZW5kKG5vZGUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IGVsIG9mIHJvb3REaXYucXVlcnlTZWxlY3RvckFsbChcIi54ZmFOb25JbnRlcmFjdGl2ZSBpbnB1dCwgLnhmYU5vbkludGVyYWN0aXZlIHRleHRhcmVhXCIpKSB7XG5cdCAgICAgIGVsLnNldEF0dHJpYnV0ZShcInJlYWRPbmx5XCIsIHRydWUpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgdGV4dERpdnNcblx0ICAgIH07XG5cdCAgfVxuXHQgIHN0YXRpYyB1cGRhdGUocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgdHJhbnNmb3JtID0gYG1hdHJpeCgke3BhcmFtZXRlcnMudmlld3BvcnQudHJhbnNmb3JtLmpvaW4oXCIsXCIpfSlgO1xuXHQgICAgcGFyYW1ldGVycy5kaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuXHQgICAgcGFyYW1ldGVycy5kaXYuaGlkZGVuID0gZmFsc2U7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuWGZhTGF5ZXIgPSBYZmFMYXllcjtcblxuXHQvKioqLyB9KSxcblx0LyogMzUgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLlNWR0dyYXBoaWNzID0gdm9pZCAwO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX2lzX25vZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTtcblx0bGV0IFNWR0dyYXBoaWNzID0gY2xhc3Mge1xuXHQgIGNvbnN0cnVjdG9yKCkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIk5vdCBpbXBsZW1lbnRlZDogU1ZHR3JhcGhpY3NcIik7XG5cdCAgfVxuXHR9O1xuXHRleHBvcnRzLlNWR0dyYXBoaWNzID0gU1ZHR3JhcGhpY3M7XG5cdHtcblx0ICBjb25zdCBTVkdfREVGQVVMVFMgPSB7XG5cdCAgICBmb250U3R5bGU6IFwibm9ybWFsXCIsXG5cdCAgICBmb250V2VpZ2h0OiBcIm5vcm1hbFwiLFxuXHQgICAgZmlsbENvbG9yOiBcIiMwMDAwMDBcIlxuXHQgIH07XG5cdCAgY29uc3QgWE1MX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIjtcblx0ICBjb25zdCBYTElOS19OUyA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiO1xuXHQgIGNvbnN0IExJTkVfQ0FQX1NUWUxFUyA9IFtcImJ1dHRcIiwgXCJyb3VuZFwiLCBcInNxdWFyZVwiXTtcblx0ICBjb25zdCBMSU5FX0pPSU5fU1RZTEVTID0gW1wibWl0ZXJcIiwgXCJyb3VuZFwiLCBcImJldmVsXCJdO1xuXHQgIGNvbnN0IGNyZWF0ZU9iamVjdFVSTCA9IGZ1bmN0aW9uIChkYXRhLCBjb250ZW50VHlwZSA9IFwiXCIsIGZvcmNlRGF0YVNjaGVtYSA9IGZhbHNlKSB7XG5cdCAgICBpZiAoVVJMLmNyZWF0ZU9iamVjdFVSTCAmJiB0eXBlb2YgQmxvYiAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhZm9yY2VEYXRhU2NoZW1hKSB7XG5cdCAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtkYXRhXSwge1xuXHQgICAgICAgIHR5cGU6IGNvbnRlbnRUeXBlXG5cdCAgICAgIH0pKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGRpZ2l0cyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIjtcblx0ICAgIGxldCBidWZmZXIgPSBgZGF0YToke2NvbnRlbnRUeXBlfTtiYXNlNjQsYDtcblx0ICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGRhdGEubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMykge1xuXHQgICAgICBjb25zdCBiMSA9IGRhdGFbaV0gJiAweGZmO1xuXHQgICAgICBjb25zdCBiMiA9IGRhdGFbaSArIDFdICYgMHhmZjtcblx0ICAgICAgY29uc3QgYjMgPSBkYXRhW2kgKyAyXSAmIDB4ZmY7XG5cdCAgICAgIGNvbnN0IGQxID0gYjEgPj4gMixcblx0ICAgICAgICBkMiA9IChiMSAmIDMpIDw8IDQgfCBiMiA+PiA0O1xuXHQgICAgICBjb25zdCBkMyA9IGkgKyAxIDwgaWkgPyAoYjIgJiAweGYpIDw8IDIgfCBiMyA+PiA2IDogNjQ7XG5cdCAgICAgIGNvbnN0IGQ0ID0gaSArIDIgPCBpaSA/IGIzICYgMHgzZiA6IDY0O1xuXHQgICAgICBidWZmZXIgKz0gZGlnaXRzW2QxXSArIGRpZ2l0c1tkMl0gKyBkaWdpdHNbZDNdICsgZGlnaXRzW2Q0XTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBidWZmZXI7XG5cdCAgfTtcblx0ICBjb25zdCBjb252ZXJ0SW1nRGF0YVRvUG5nID0gZnVuY3Rpb24gKCkge1xuXHQgICAgY29uc3QgUE5HX0hFQURFUiA9IG5ldyBVaW50OEFycmF5KFsweDg5LCAweDUwLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhXSk7XG5cdCAgICBjb25zdCBDSFVOS19XUkFQUEVSX1NJWkUgPSAxMjtcblx0ICAgIGNvbnN0IGNyY1RhYmxlID0gbmV3IEludDMyQXJyYXkoMjU2KTtcblx0ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgbGV0IGMgPSBpO1xuXHQgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IDg7IGgrKykge1xuXHQgICAgICAgIGlmIChjICYgMSkge1xuXHQgICAgICAgICAgYyA9IDB4ZWRiODgzMjAgXiBjID4+IDEgJiAweDdmZmZmZmZmO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBjID0gYyA+PiAxICYgMHg3ZmZmZmZmZjtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgY3JjVGFibGVbaV0gPSBjO1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gY3JjMzIoZGF0YSwgc3RhcnQsIGVuZCkge1xuXHQgICAgICBsZXQgY3JjID0gLTE7XG5cdCAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG5cdCAgICAgICAgY29uc3QgYSA9IChjcmMgXiBkYXRhW2ldKSAmIDB4ZmY7XG5cdCAgICAgICAgY29uc3QgYiA9IGNyY1RhYmxlW2FdO1xuXHQgICAgICAgIGNyYyA9IGNyYyA+Pj4gOCBeIGI7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGNyYyBeIC0xO1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gd3JpdGVQbmdDaHVuayh0eXBlLCBib2R5LCBkYXRhLCBvZmZzZXQpIHtcblx0ICAgICAgbGV0IHAgPSBvZmZzZXQ7XG5cdCAgICAgIGNvbnN0IGxlbiA9IGJvZHkubGVuZ3RoO1xuXHQgICAgICBkYXRhW3BdID0gbGVuID4+IDI0ICYgMHhmZjtcblx0ICAgICAgZGF0YVtwICsgMV0gPSBsZW4gPj4gMTYgJiAweGZmO1xuXHQgICAgICBkYXRhW3AgKyAyXSA9IGxlbiA+PiA4ICYgMHhmZjtcblx0ICAgICAgZGF0YVtwICsgM10gPSBsZW4gJiAweGZmO1xuXHQgICAgICBwICs9IDQ7XG5cdCAgICAgIGRhdGFbcF0gPSB0eXBlLmNoYXJDb2RlQXQoMCkgJiAweGZmO1xuXHQgICAgICBkYXRhW3AgKyAxXSA9IHR5cGUuY2hhckNvZGVBdCgxKSAmIDB4ZmY7XG5cdCAgICAgIGRhdGFbcCArIDJdID0gdHlwZS5jaGFyQ29kZUF0KDIpICYgMHhmZjtcblx0ICAgICAgZGF0YVtwICsgM10gPSB0eXBlLmNoYXJDb2RlQXQoMykgJiAweGZmO1xuXHQgICAgICBwICs9IDQ7XG5cdCAgICAgIGRhdGEuc2V0KGJvZHksIHApO1xuXHQgICAgICBwICs9IGJvZHkubGVuZ3RoO1xuXHQgICAgICBjb25zdCBjcmMgPSBjcmMzMihkYXRhLCBvZmZzZXQgKyA0LCBwKTtcblx0ICAgICAgZGF0YVtwXSA9IGNyYyA+PiAyNCAmIDB4ZmY7XG5cdCAgICAgIGRhdGFbcCArIDFdID0gY3JjID4+IDE2ICYgMHhmZjtcblx0ICAgICAgZGF0YVtwICsgMl0gPSBjcmMgPj4gOCAmIDB4ZmY7XG5cdCAgICAgIGRhdGFbcCArIDNdID0gY3JjICYgMHhmZjtcblx0ICAgIH1cblx0ICAgIGZ1bmN0aW9uIGFkbGVyMzIoZGF0YSwgc3RhcnQsIGVuZCkge1xuXHQgICAgICBsZXQgYSA9IDE7XG5cdCAgICAgIGxldCBiID0gMDtcblx0ICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcblx0ICAgICAgICBhID0gKGEgKyAoZGF0YVtpXSAmIDB4ZmYpKSAlIDY1NTIxO1xuXHQgICAgICAgIGIgPSAoYiArIGEpICUgNjU1MjE7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGIgPDwgMTYgfCBhO1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gZGVmbGF0ZVN5bmMobGl0ZXJhbHMpIHtcblx0ICAgICAgaWYgKCFfaXNfbm9kZS5pc05vZGVKUykge1xuXHQgICAgICAgIHJldHVybiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZChsaXRlcmFscyk7XG5cdCAgICAgIH1cblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICBsZXQgaW5wdXQ7XG5cdCAgICAgICAgaWYgKHBhcnNlSW50KGJyb3dzZXIkMS52ZXJzaW9ucy5ub2RlKSA+PSA4KSB7XG5cdCAgICAgICAgICBpbnB1dCA9IGxpdGVyYWxzO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBpbnB1dCA9IEJ1ZmZlci5mcm9tKGxpdGVyYWxzKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgb3V0cHV0ID0gcmVxdWlyZSQkNS5kZWZsYXRlU3luYyhpbnB1dCwge1xuXHQgICAgICAgICAgbGV2ZWw6IDlcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gb3V0cHV0IGluc3RhbmNlb2YgVWludDhBcnJheSA/IG91dHB1dCA6IG5ldyBVaW50OEFycmF5KG91dHB1dCk7XG5cdCAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICAoMCwgX3V0aWwud2FybikoXCJOb3QgY29tcHJlc3NpbmcgUE5HIGJlY2F1c2UgemxpYi5kZWZsYXRlU3luYyBpcyB1bmF2YWlsYWJsZTogXCIgKyBlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQobGl0ZXJhbHMpO1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gZGVmbGF0ZVN5bmNVbmNvbXByZXNzZWQobGl0ZXJhbHMpIHtcblx0ICAgICAgbGV0IGxlbiA9IGxpdGVyYWxzLmxlbmd0aDtcblx0ICAgICAgY29uc3QgbWF4QmxvY2tMZW5ndGggPSAweGZmZmY7XG5cdCAgICAgIGNvbnN0IGRlZmxhdGVCbG9ja3MgPSBNYXRoLmNlaWwobGVuIC8gbWF4QmxvY2tMZW5ndGgpO1xuXHQgICAgICBjb25zdCBpZGF0ID0gbmV3IFVpbnQ4QXJyYXkoMiArIGxlbiArIGRlZmxhdGVCbG9ja3MgKiA1ICsgNCk7XG5cdCAgICAgIGxldCBwaSA9IDA7XG5cdCAgICAgIGlkYXRbcGkrK10gPSAweDc4O1xuXHQgICAgICBpZGF0W3BpKytdID0gMHg5Yztcblx0ICAgICAgbGV0IHBvcyA9IDA7XG5cdCAgICAgIHdoaWxlIChsZW4gPiBtYXhCbG9ja0xlbmd0aCkge1xuXHQgICAgICAgIGlkYXRbcGkrK10gPSAweDAwO1xuXHQgICAgICAgIGlkYXRbcGkrK10gPSAweGZmO1xuXHQgICAgICAgIGlkYXRbcGkrK10gPSAweGZmO1xuXHQgICAgICAgIGlkYXRbcGkrK10gPSAweDAwO1xuXHQgICAgICAgIGlkYXRbcGkrK10gPSAweDAwO1xuXHQgICAgICAgIGlkYXQuc2V0KGxpdGVyYWxzLnN1YmFycmF5KHBvcywgcG9zICsgbWF4QmxvY2tMZW5ndGgpLCBwaSk7XG5cdCAgICAgICAgcGkgKz0gbWF4QmxvY2tMZW5ndGg7XG5cdCAgICAgICAgcG9zICs9IG1heEJsb2NrTGVuZ3RoO1xuXHQgICAgICAgIGxlbiAtPSBtYXhCbG9ja0xlbmd0aDtcblx0ICAgICAgfVxuXHQgICAgICBpZGF0W3BpKytdID0gMHgwMTtcblx0ICAgICAgaWRhdFtwaSsrXSA9IGxlbiAmIDB4ZmY7XG5cdCAgICAgIGlkYXRbcGkrK10gPSBsZW4gPj4gOCAmIDB4ZmY7XG5cdCAgICAgIGlkYXRbcGkrK10gPSB+bGVuICYgMHhmZmZmICYgMHhmZjtcblx0ICAgICAgaWRhdFtwaSsrXSA9ICh+bGVuICYgMHhmZmZmKSA+PiA4ICYgMHhmZjtcblx0ICAgICAgaWRhdC5zZXQobGl0ZXJhbHMuc3ViYXJyYXkocG9zKSwgcGkpO1xuXHQgICAgICBwaSArPSBsaXRlcmFscy5sZW5ndGggLSBwb3M7XG5cdCAgICAgIGNvbnN0IGFkbGVyID0gYWRsZXIzMihsaXRlcmFscywgMCwgbGl0ZXJhbHMubGVuZ3RoKTtcblx0ICAgICAgaWRhdFtwaSsrXSA9IGFkbGVyID4+IDI0ICYgMHhmZjtcblx0ICAgICAgaWRhdFtwaSsrXSA9IGFkbGVyID4+IDE2ICYgMHhmZjtcblx0ICAgICAgaWRhdFtwaSsrXSA9IGFkbGVyID4+IDggJiAweGZmO1xuXHQgICAgICBpZGF0W3BpKytdID0gYWRsZXIgJiAweGZmO1xuXHQgICAgICByZXR1cm4gaWRhdDtcblx0ICAgIH1cblx0ICAgIGZ1bmN0aW9uIGVuY29kZShpbWdEYXRhLCBraW5kLCBmb3JjZURhdGFTY2hlbWEsIGlzTWFzaykge1xuXHQgICAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG5cdCAgICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuXHQgICAgICBsZXQgYml0RGVwdGgsIGNvbG9yVHlwZSwgbGluZVNpemU7XG5cdCAgICAgIGNvbnN0IGJ5dGVzID0gaW1nRGF0YS5kYXRhO1xuXHQgICAgICBzd2l0Y2ggKGtpbmQpIHtcblx0ICAgICAgICBjYXNlIF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUDpcblx0ICAgICAgICAgIGNvbG9yVHlwZSA9IDA7XG5cdCAgICAgICAgICBiaXREZXB0aCA9IDE7XG5cdCAgICAgICAgICBsaW5lU2l6ZSA9IHdpZHRoICsgNyA+PiAzO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBfdXRpbC5JbWFnZUtpbmQuUkdCXzI0QlBQOlxuXHQgICAgICAgICAgY29sb3JUeXBlID0gMjtcblx0ICAgICAgICAgIGJpdERlcHRoID0gODtcblx0ICAgICAgICAgIGxpbmVTaXplID0gd2lkdGggKiAzO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBfdXRpbC5JbWFnZUtpbmQuUkdCQV8zMkJQUDpcblx0ICAgICAgICAgIGNvbG9yVHlwZSA9IDY7XG5cdCAgICAgICAgICBiaXREZXB0aCA9IDg7XG5cdCAgICAgICAgICBsaW5lU2l6ZSA9IHdpZHRoICogNDtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGZvcm1hdFwiKTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBsaXRlcmFscyA9IG5ldyBVaW50OEFycmF5KCgxICsgbGluZVNpemUpICogaGVpZ2h0KTtcblx0ICAgICAgbGV0IG9mZnNldExpdGVyYWxzID0gMCxcblx0ICAgICAgICBvZmZzZXRCeXRlcyA9IDA7XG5cdCAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHtcblx0ICAgICAgICBsaXRlcmFsc1tvZmZzZXRMaXRlcmFscysrXSA9IDA7XG5cdCAgICAgICAgbGl0ZXJhbHMuc2V0KGJ5dGVzLnN1YmFycmF5KG9mZnNldEJ5dGVzLCBvZmZzZXRCeXRlcyArIGxpbmVTaXplKSwgb2Zmc2V0TGl0ZXJhbHMpO1xuXHQgICAgICAgIG9mZnNldEJ5dGVzICs9IGxpbmVTaXplO1xuXHQgICAgICAgIG9mZnNldExpdGVyYWxzICs9IGxpbmVTaXplO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChraW5kID09PSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAgJiYgaXNNYXNrKSB7XG5cdCAgICAgICAgb2Zmc2V0TGl0ZXJhbHMgPSAwO1xuXHQgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcblx0ICAgICAgICAgIG9mZnNldExpdGVyYWxzKys7XG5cdCAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVTaXplOyBpKyspIHtcblx0ICAgICAgICAgICAgbGl0ZXJhbHNbb2Zmc2V0TGl0ZXJhbHMrK10gXj0gMHhmZjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgaWhkciA9IG5ldyBVaW50OEFycmF5KFt3aWR0aCA+PiAyNCAmIDB4ZmYsIHdpZHRoID4+IDE2ICYgMHhmZiwgd2lkdGggPj4gOCAmIDB4ZmYsIHdpZHRoICYgMHhmZiwgaGVpZ2h0ID4+IDI0ICYgMHhmZiwgaGVpZ2h0ID4+IDE2ICYgMHhmZiwgaGVpZ2h0ID4+IDggJiAweGZmLCBoZWlnaHQgJiAweGZmLCBiaXREZXB0aCwgY29sb3JUeXBlLCAweDAwLCAweDAwLCAweDAwXSk7XG5cdCAgICAgIGNvbnN0IGlkYXQgPSBkZWZsYXRlU3luYyhsaXRlcmFscyk7XG5cdCAgICAgIGNvbnN0IHBuZ0xlbmd0aCA9IFBOR19IRUFERVIubGVuZ3RoICsgQ0hVTktfV1JBUFBFUl9TSVpFICogMyArIGloZHIubGVuZ3RoICsgaWRhdC5sZW5ndGg7XG5cdCAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShwbmdMZW5ndGgpO1xuXHQgICAgICBsZXQgb2Zmc2V0ID0gMDtcblx0ICAgICAgZGF0YS5zZXQoUE5HX0hFQURFUiwgb2Zmc2V0KTtcblx0ICAgICAgb2Zmc2V0ICs9IFBOR19IRUFERVIubGVuZ3RoO1xuXHQgICAgICB3cml0ZVBuZ0NodW5rKFwiSUhEUlwiLCBpaGRyLCBkYXRhLCBvZmZzZXQpO1xuXHQgICAgICBvZmZzZXQgKz0gQ0hVTktfV1JBUFBFUl9TSVpFICsgaWhkci5sZW5ndGg7XG5cdCAgICAgIHdyaXRlUG5nQ2h1bmsoXCJJREFUQVwiLCBpZGF0LCBkYXRhLCBvZmZzZXQpO1xuXHQgICAgICBvZmZzZXQgKz0gQ0hVTktfV1JBUFBFUl9TSVpFICsgaWRhdC5sZW5ndGg7XG5cdCAgICAgIHdyaXRlUG5nQ2h1bmsoXCJJRU5EXCIsIG5ldyBVaW50OEFycmF5KDApLCBkYXRhLCBvZmZzZXQpO1xuXHQgICAgICByZXR1cm4gY3JlYXRlT2JqZWN0VVJMKGRhdGEsIFwiaW1hZ2UvcG5nXCIsIGZvcmNlRGF0YVNjaGVtYSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gY29udmVydEltZ0RhdGFUb1BuZyhpbWdEYXRhLCBmb3JjZURhdGFTY2hlbWEsIGlzTWFzaykge1xuXHQgICAgICBjb25zdCBraW5kID0gaW1nRGF0YS5raW5kID09PSB1bmRlZmluZWQgPyBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFAgOiBpbWdEYXRhLmtpbmQ7XG5cdCAgICAgIHJldHVybiBlbmNvZGUoaW1nRGF0YSwga2luZCwgZm9yY2VEYXRhU2NoZW1hLCBpc01hc2spO1xuXHQgICAgfTtcblx0ICB9KCk7XG5cdCAgY2xhc3MgU1ZHRXh0cmFTdGF0ZSB7XG5cdCAgICBjb25zdHJ1Y3RvcigpIHtcblx0ICAgICAgdGhpcy5mb250U2l6ZVNjYWxlID0gMTtcblx0ICAgICAgdGhpcy5mb250V2VpZ2h0ID0gU1ZHX0RFRkFVTFRTLmZvbnRXZWlnaHQ7XG5cdCAgICAgIHRoaXMuZm9udFNpemUgPSAwO1xuXHQgICAgICB0aGlzLnRleHRNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7XG5cdCAgICAgIHRoaXMuZm9udE1hdHJpeCA9IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYO1xuXHQgICAgICB0aGlzLmxlYWRpbmcgPSAwO1xuXHQgICAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTDtcblx0ICAgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuXHQgICAgICB0aGlzLnggPSAwO1xuXHQgICAgICB0aGlzLnkgPSAwO1xuXHQgICAgICB0aGlzLmxpbmVYID0gMDtcblx0ICAgICAgdGhpcy5saW5lWSA9IDA7XG5cdCAgICAgIHRoaXMuY2hhclNwYWNpbmcgPSAwO1xuXHQgICAgICB0aGlzLndvcmRTcGFjaW5nID0gMDtcblx0ICAgICAgdGhpcy50ZXh0SFNjYWxlID0gMTtcblx0ICAgICAgdGhpcy50ZXh0UmlzZSA9IDA7XG5cdCAgICAgIHRoaXMuZmlsbENvbG9yID0gU1ZHX0RFRkFVTFRTLmZpbGxDb2xvcjtcblx0ICAgICAgdGhpcy5zdHJva2VDb2xvciA9IFwiIzAwMDAwMFwiO1xuXHQgICAgICB0aGlzLmZpbGxBbHBoYSA9IDE7XG5cdCAgICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxO1xuXHQgICAgICB0aGlzLmxpbmVXaWR0aCA9IDE7XG5cdCAgICAgIHRoaXMubGluZUpvaW4gPSBcIlwiO1xuXHQgICAgICB0aGlzLmxpbmVDYXAgPSBcIlwiO1xuXHQgICAgICB0aGlzLm1pdGVyTGltaXQgPSAwO1xuXHQgICAgICB0aGlzLmRhc2hBcnJheSA9IFtdO1xuXHQgICAgICB0aGlzLmRhc2hQaGFzZSA9IDA7XG5cdCAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gW107XG5cdCAgICAgIHRoaXMuYWN0aXZlQ2xpcFVybCA9IG51bGw7XG5cdCAgICAgIHRoaXMuY2xpcEdyb3VwID0gbnVsbDtcblx0ICAgICAgdGhpcy5tYXNrSWQgPSBcIlwiO1xuXHQgICAgfVxuXHQgICAgY2xvbmUoKSB7XG5cdCAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKHRoaXMpO1xuXHQgICAgfVxuXHQgICAgc2V0Q3VycmVudFBvaW50KHgsIHkpIHtcblx0ICAgICAgdGhpcy54ID0geDtcblx0ICAgICAgdGhpcy55ID0geTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZnVuY3Rpb24gb3BMaXN0VG9UcmVlKG9wTGlzdCkge1xuXHQgICAgbGV0IG9wVHJlZSA9IFtdO1xuXHQgICAgY29uc3QgdG1wID0gW107XG5cdCAgICBmb3IgKGNvbnN0IG9wTGlzdEVsZW1lbnQgb2Ygb3BMaXN0KSB7XG5cdCAgICAgIGlmIChvcExpc3RFbGVtZW50LmZuID09PSBcInNhdmVcIikge1xuXHQgICAgICAgIG9wVHJlZS5wdXNoKHtcblx0ICAgICAgICAgIGZuSWQ6IDkyLFxuXHQgICAgICAgICAgZm46IFwiZ3JvdXBcIixcblx0ICAgICAgICAgIGl0ZW1zOiBbXVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHRtcC5wdXNoKG9wVHJlZSk7XG5cdCAgICAgICAgb3BUcmVlID0gb3BUcmVlLmF0KC0xKS5pdGVtcztcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAob3BMaXN0RWxlbWVudC5mbiA9PT0gXCJyZXN0b3JlXCIpIHtcblx0ICAgICAgICBvcFRyZWUgPSB0bXAucG9wKCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgb3BUcmVlLnB1c2gob3BMaXN0RWxlbWVudCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBvcFRyZWU7XG5cdCAgfVxuXHQgIGZ1bmN0aW9uIHBmKHZhbHVlKSB7XG5cdCAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcblx0ICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBzID0gdmFsdWUudG9GaXhlZCgxMCk7XG5cdCAgICBsZXQgaSA9IHMubGVuZ3RoIC0gMTtcblx0ICAgIGlmIChzW2ldICE9PSBcIjBcIikge1xuXHQgICAgICByZXR1cm4gcztcblx0ICAgIH1cblx0ICAgIGRvIHtcblx0ICAgICAgaS0tO1xuXHQgICAgfSB3aGlsZSAoc1tpXSA9PT0gXCIwXCIpO1xuXHQgICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIHNbaV0gPT09IFwiLlwiID8gaSA6IGkgKyAxKTtcblx0ICB9XG5cdCAgZnVuY3Rpb24gcG0obSkge1xuXHQgICAgaWYgKG1bNF0gPT09IDAgJiYgbVs1XSA9PT0gMCkge1xuXHQgICAgICBpZiAobVsxXSA9PT0gMCAmJiBtWzJdID09PSAwKSB7XG5cdCAgICAgICAgaWYgKG1bMF0gPT09IDEgJiYgbVszXSA9PT0gMSkge1xuXHQgICAgICAgICAgcmV0dXJuIFwiXCI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBgc2NhbGUoJHtwZihtWzBdKX0gJHtwZihtWzNdKX0pYDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAobVswXSA9PT0gbVszXSAmJiBtWzFdID09PSAtbVsyXSkge1xuXHQgICAgICAgIGNvbnN0IGEgPSBNYXRoLmFjb3MobVswXSkgKiAxODAgLyBNYXRoLlBJO1xuXHQgICAgICAgIHJldHVybiBgcm90YXRlKCR7cGYoYSl9KWA7XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGlmIChtWzBdID09PSAxICYmIG1bMV0gPT09IDAgJiYgbVsyXSA9PT0gMCAmJiBtWzNdID09PSAxKSB7XG5cdCAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtwZihtWzRdKX0gJHtwZihtWzVdKX0pYDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGBtYXRyaXgoJHtwZihtWzBdKX0gJHtwZihtWzFdKX0gJHtwZihtWzJdKX0gJHtwZihtWzNdKX0gJHtwZihtWzRdKX0gYCArIGAke3BmKG1bNV0pfSlgO1xuXHQgIH1cblx0ICBsZXQgY2xpcENvdW50ID0gMDtcblx0ICBsZXQgbWFza0NvdW50ID0gMDtcblx0ICBsZXQgc2hhZGluZ0NvdW50ID0gMDtcblx0ICBleHBvcnRzLlNWR0dyYXBoaWNzID0gU1ZHR3JhcGhpY3MgPSBjbGFzcyB7XG5cdCAgICBjb25zdHJ1Y3Rvcihjb21tb25PYmpzLCBvYmpzLCBmb3JjZURhdGFTY2hlbWEgPSBmYWxzZSkge1xuXHQgICAgICAoMCwgX2Rpc3BsYXlfdXRpbHMuZGVwcmVjYXRlZCkoXCJUaGUgU1ZHIGJhY2stZW5kIGlzIG5vIGxvbmdlciBtYWludGFpbmVkIGFuZCAqbWF5KiBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuXCIpO1xuXHQgICAgICB0aGlzLnN2Z0ZhY3RvcnkgPSBuZXcgX2Rpc3BsYXlfdXRpbHMuRE9NU1ZHRmFjdG9yeSgpO1xuXHQgICAgICB0aGlzLmN1cnJlbnQgPSBuZXcgU1ZHRXh0cmFTdGF0ZSgpO1xuXHQgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDtcblx0ICAgICAgdGhpcy50cmFuc2Zvcm1TdGFjayA9IFtdO1xuXHQgICAgICB0aGlzLmV4dHJhU3RhY2sgPSBbXTtcblx0ICAgICAgdGhpcy5jb21tb25PYmpzID0gY29tbW9uT2Jqcztcblx0ICAgICAgdGhpcy5vYmpzID0gb2Jqcztcblx0ICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG5cdCAgICAgIHRoaXMucGVuZGluZ0VPRmlsbCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmVtYmVkRm9udHMgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5lbWJlZGRlZEZvbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICAgICAgdGhpcy5jc3NTdHlsZSA9IG51bGw7XG5cdCAgICAgIHRoaXMuZm9yY2VEYXRhU2NoZW1hID0gISFmb3JjZURhdGFTY2hlbWE7XG5cdCAgICAgIHRoaXMuX29wZXJhdG9ySWRNYXBwaW5nID0gW107XG5cdCAgICAgIGZvciAoY29uc3Qgb3AgaW4gX3V0aWwuT1BTKSB7XG5cdCAgICAgICAgdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmdbX3V0aWwuT1BTW29wXV0gPSBvcDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgZ2V0T2JqZWN0KGRhdGEsIGZhbGxiYWNrID0gbnVsbCkge1xuXHQgICAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgICByZXR1cm4gZGF0YS5zdGFydHNXaXRoKFwiZ19cIikgPyB0aGlzLmNvbW1vbk9ianMuZ2V0KGRhdGEpIDogdGhpcy5vYmpzLmdldChkYXRhKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZmFsbGJhY2s7XG5cdCAgICB9XG5cdCAgICBzYXZlKCkge1xuXHQgICAgICB0aGlzLnRyYW5zZm9ybVN0YWNrLnB1c2godGhpcy50cmFuc2Zvcm1NYXRyaXgpO1xuXHQgICAgICBjb25zdCBvbGQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIHRoaXMuZXh0cmFTdGFjay5wdXNoKG9sZCk7XG5cdCAgICAgIHRoaXMuY3VycmVudCA9IG9sZC5jbG9uZSgpO1xuXHQgICAgfVxuXHQgICAgcmVzdG9yZSgpIHtcblx0ICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSB0aGlzLnRyYW5zZm9ybVN0YWNrLnBvcCgpO1xuXHQgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLmV4dHJhU3RhY2sucG9wKCk7XG5cdCAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuXHQgICAgICB0aGlzLnRncnAgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgZ3JvdXAoaXRlbXMpIHtcblx0ICAgICAgdGhpcy5zYXZlKCk7XG5cdCAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZShpdGVtcyk7XG5cdCAgICAgIHRoaXMucmVzdG9yZSgpO1xuXHQgICAgfVxuXHQgICAgbG9hZERlcGVuZGVuY2llcyhvcGVyYXRvckxpc3QpIHtcblx0ICAgICAgY29uc3QgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5O1xuXHQgICAgICBjb25zdCBhcmdzQXJyYXkgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5O1xuXHQgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBmbkFycmF5Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0ICAgICAgICBpZiAoZm5BcnJheVtpXSAhPT0gX3V0aWwuT1BTLmRlcGVuZGVuY3kpIHtcblx0ICAgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmb3IgKGNvbnN0IG9iaiBvZiBhcmdzQXJyYXlbaV0pIHtcblx0ICAgICAgICAgIGNvbnN0IG9ianNQb29sID0gb2JqLnN0YXJ0c1dpdGgoXCJnX1wiKSA/IHRoaXMuY29tbW9uT2JqcyA6IHRoaXMub2Jqcztcblx0ICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0ICAgICAgICAgICAgb2Jqc1Bvb2wuZ2V0KG9iaiwgcmVzb2x2ZSk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICAgIHRoaXMuY3VycmVudC5kZXBlbmRlbmNpZXMucHVzaChwcm9taXNlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuY3VycmVudC5kZXBlbmRlbmNpZXMpO1xuXHQgICAgfVxuXHQgICAgdHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcblx0ICAgICAgY29uc3QgdHJhbnNmb3JtTWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuXHQgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IF91dGlsLlV0aWwudHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtTWF0cml4LCB0cmFuc2Zvcm1NYXRyaXgpO1xuXHQgICAgICB0aGlzLnRncnAgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgZ2V0U1ZHKG9wZXJhdG9yTGlzdCwgdmlld3BvcnQpIHtcblx0ICAgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuXHQgICAgICBjb25zdCBzdmdFbGVtZW50ID0gdGhpcy5faW5pdGlhbGl6ZSh2aWV3cG9ydCk7XG5cdCAgICAgIHJldHVybiB0aGlzLmxvYWREZXBlbmRlbmNpZXMob3BlcmF0b3JMaXN0KS50aGVuKCgpID0+IHtcblx0ICAgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDtcblx0ICAgICAgICB0aGlzLmV4ZWN1dGVPcFRyZWUodGhpcy5jb252ZXJ0T3BMaXN0KG9wZXJhdG9yTGlzdCkpO1xuXHQgICAgICAgIHJldHVybiBzdmdFbGVtZW50O1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGNvbnZlcnRPcExpc3Qob3BlcmF0b3JMaXN0KSB7XG5cdCAgICAgIGNvbnN0IG9wZXJhdG9ySWRNYXBwaW5nID0gdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmc7XG5cdCAgICAgIGNvbnN0IGFyZ3NBcnJheSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXk7XG5cdCAgICAgIGNvbnN0IGZuQXJyYXkgPSBvcGVyYXRvckxpc3QuZm5BcnJheTtcblx0ICAgICAgY29uc3Qgb3BMaXN0ID0gW107XG5cdCAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuXHQgICAgICAgIGNvbnN0IGZuSWQgPSBmbkFycmF5W2ldO1xuXHQgICAgICAgIG9wTGlzdC5wdXNoKHtcblx0ICAgICAgICAgIGZuSWQsXG5cdCAgICAgICAgICBmbjogb3BlcmF0b3JJZE1hcHBpbmdbZm5JZF0sXG5cdCAgICAgICAgICBhcmdzOiBhcmdzQXJyYXlbaV1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gb3BMaXN0VG9UcmVlKG9wTGlzdCk7XG5cdCAgICB9XG5cdCAgICBleGVjdXRlT3BUcmVlKG9wVHJlZSkge1xuXHQgICAgICBmb3IgKGNvbnN0IG9wVHJlZUVsZW1lbnQgb2Ygb3BUcmVlKSB7XG5cdCAgICAgICAgY29uc3QgZm4gPSBvcFRyZWVFbGVtZW50LmZuO1xuXHQgICAgICAgIGNvbnN0IGZuSWQgPSBvcFRyZWVFbGVtZW50LmZuSWQ7XG5cdCAgICAgICAgY29uc3QgYXJncyA9IG9wVHJlZUVsZW1lbnQuYXJncztcblx0ICAgICAgICBzd2l0Y2ggKGZuSWQgfCAwKSB7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5iZWdpblRleHQ6XG5cdCAgICAgICAgICAgIHRoaXMuYmVnaW5UZXh0KCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZGVwZW5kZW5jeTpcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMZWFkaW5nOlxuXHQgICAgICAgICAgICB0aGlzLnNldExlYWRpbmcoYXJncyk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TGVhZGluZ01vdmVUZXh0OlxuXHQgICAgICAgICAgICB0aGlzLnNldExlYWRpbmdNb3ZlVGV4dChhcmdzWzBdLCBhcmdzWzFdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGb250OlxuXHQgICAgICAgICAgICB0aGlzLnNldEZvbnQoYXJncyk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hvd1RleHQ6XG5cdCAgICAgICAgICAgIHRoaXMuc2hvd1RleHQoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hvd1NwYWNlZFRleHQ6XG5cdCAgICAgICAgICAgIHRoaXMuc2hvd1RleHQoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW5kVGV4dDpcblx0ICAgICAgICAgICAgdGhpcy5lbmRUZXh0KCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRleHQ6XG5cdCAgICAgICAgICAgIHRoaXMubW92ZVRleHQoYXJnc1swXSwgYXJnc1sxXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0Q2hhclNwYWNpbmc6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0Q2hhclNwYWNpbmcoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0V29yZFNwYWNpbmc6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0V29yZFNwYWNpbmcoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0SFNjYWxlOlxuXHQgICAgICAgICAgICB0aGlzLnNldEhTY2FsZShhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0TWF0cml4OlxuXHQgICAgICAgICAgICB0aGlzLnNldFRleHRNYXRyaXgoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0VGV4dFJpc2U6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0VGV4dFJpc2UoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0VGV4dFJlbmRlcmluZ01vZGU6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0VGV4dFJlbmRlcmluZ01vZGUoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TGluZVdpZHRoOlxuXHQgICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aChhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMaW5lSm9pbjpcblx0ICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbihhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMaW5lQ2FwOlxuXHQgICAgICAgICAgICB0aGlzLnNldExpbmVDYXAoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0TWl0ZXJMaW1pdDpcblx0ICAgICAgICAgICAgdGhpcy5zZXRNaXRlckxpbWl0KGFyZ3NbMF0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxSR0JDb2xvcjpcblx0ICAgICAgICAgICAgdGhpcy5zZXRGaWxsUkdCQ29sb3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlUkdCQ29sb3I6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0U3Ryb2tlUkdCQ29sb3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0U3Ryb2tlQ29sb3JOOlxuXHQgICAgICAgICAgICB0aGlzLnNldFN0cm9rZUNvbG9yTihhcmdzKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGaWxsQ29sb3JOOlxuXHQgICAgICAgICAgICB0aGlzLnNldEZpbGxDb2xvck4oYXJncyk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2hhZGluZ0ZpbGw6XG5cdCAgICAgICAgICAgIHRoaXMuc2hhZGluZ0ZpbGwoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RGFzaDpcblx0ICAgICAgICAgICAgdGhpcy5zZXREYXNoKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFJlbmRlcmluZ0ludGVudDpcblx0ICAgICAgICAgICAgdGhpcy5zZXRSZW5kZXJpbmdJbnRlbnQoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmxhdG5lc3M6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3MoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0R1N0YXRlOlxuXHQgICAgICAgICAgICB0aGlzLnNldEdTdGF0ZShhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5maWxsOlxuXHQgICAgICAgICAgICB0aGlzLmZpbGwoKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lb0ZpbGw6XG5cdCAgICAgICAgICAgIHRoaXMuZW9GaWxsKCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc3Ryb2tlOlxuXHQgICAgICAgICAgICB0aGlzLnN0cm9rZSgpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmZpbGxTdHJva2U6XG5cdCAgICAgICAgICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVvRmlsbFN0cm9rZTpcblx0ICAgICAgICAgICAgdGhpcy5lb0ZpbGxTdHJva2UoKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbGlwOlxuXHQgICAgICAgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVvQ2xpcDpcblx0ICAgICAgICAgICAgdGhpcy5jbGlwKFwiZXZlbm9kZFwiKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2s6XG5cdCAgICAgICAgICAgIHRoaXMucGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbWFnZVhPYmplY3Q6XG5cdCAgICAgICAgICAgIHRoaXMucGFpbnRJbWFnZVhPYmplY3QoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6XG5cdCAgICAgICAgICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRJbWFnZU1hc2tYT2JqZWN0OlxuXHQgICAgICAgICAgICB0aGlzLnBhaW50SW1hZ2VNYXNrWE9iamVjdChhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludEZvcm1YT2JqZWN0QmVnaW46XG5cdCAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEJlZ2luKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50Rm9ybVhPYmplY3RFbmQ6XG5cdCAgICAgICAgICAgIHRoaXMucGFpbnRGb3JtWE9iamVjdEVuZCgpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlUGF0aDpcblx0ICAgICAgICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZVN0cm9rZTpcblx0ICAgICAgICAgICAgdGhpcy5jbG9zZVN0cm9rZSgpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlRmlsbFN0cm9rZTpcblx0ICAgICAgICAgICAgdGhpcy5jbG9zZUZpbGxTdHJva2UoKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZUVPRmlsbFN0cm9rZTpcblx0ICAgICAgICAgICAgdGhpcy5jbG9zZUVPRmlsbFN0cm9rZSgpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm5leHRMaW5lOlxuXHQgICAgICAgICAgICB0aGlzLm5leHRMaW5lKCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMudHJhbnNmb3JtOlxuXHQgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jb25zdHJ1Y3RQYXRoOlxuXHQgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdFBhdGgoYXJnc1swXSwgYXJnc1sxXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW5kUGF0aDpcblx0ICAgICAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSA5Mjpcblx0ICAgICAgICAgICAgdGhpcy5ncm91cChvcFRyZWVFbGVtZW50Lml0ZW1zKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFVuaW1wbGVtZW50ZWQgb3BlcmF0b3IgJHtmbn1gKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBzZXRXb3JkU3BhY2luZyh3b3JkU3BhY2luZykge1xuXHQgICAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZztcblx0ICAgIH1cblx0ICAgIHNldENoYXJTcGFjaW5nKGNoYXJTcGFjaW5nKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC5jaGFyU3BhY2luZyA9IGNoYXJTcGFjaW5nO1xuXHQgICAgfVxuXHQgICAgbmV4dExpbmUoKSB7XG5cdCAgICAgIHRoaXMubW92ZVRleHQoMCwgdGhpcy5jdXJyZW50LmxlYWRpbmcpO1xuXHQgICAgfVxuXHQgICAgc2V0VGV4dE1hdHJpeChhLCBiLCBjLCBkLCBlLCBmKSB7XG5cdCAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIGN1cnJlbnQudGV4dE1hdHJpeCA9IGN1cnJlbnQubGluZU1hdHJpeCA9IFthLCBiLCBjLCBkLCBlLCBmXTtcblx0ICAgICAgY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSBNYXRoLmh5cG90KGEsIGIpO1xuXHQgICAgICBjdXJyZW50LnggPSBjdXJyZW50LmxpbmVYID0gMDtcblx0ICAgICAgY3VycmVudC55ID0gY3VycmVudC5saW5lWSA9IDA7XG5cdCAgICAgIGN1cnJlbnQueGNvb3JkcyA9IFtdO1xuXHQgICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTtcblx0ICAgICAgY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuXHQgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1mYW1pbHlcIiwgY3VycmVudC5mb250RmFtaWx5KTtcblx0ICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc2l6ZVwiLCBgJHtwZihjdXJyZW50LmZvbnRTaXplKX1weGApO1xuXHQgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtY3VycmVudC55KSk7XG5cdCAgICAgIGN1cnJlbnQudHh0RWxlbWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRleHRcIik7XG5cdCAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5hcHBlbmQoY3VycmVudC50c3Bhbik7XG5cdCAgICB9XG5cdCAgICBiZWdpblRleHQoKSB7XG5cdCAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIGN1cnJlbnQueCA9IGN1cnJlbnQubGluZVggPSAwO1xuXHQgICAgICBjdXJyZW50LnkgPSBjdXJyZW50LmxpbmVZID0gMDtcblx0ICAgICAgY3VycmVudC50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYO1xuXHQgICAgICBjdXJyZW50LmxpbmVNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7XG5cdCAgICAgIGN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gMTtcblx0ICAgICAgY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuXHQgICAgICBjdXJyZW50LnR4dEVsZW1lbnQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0ZXh0XCIpO1xuXHQgICAgICBjdXJyZW50LnR4dGdycCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG5cdCAgICAgIGN1cnJlbnQueGNvb3JkcyA9IFtdO1xuXHQgICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTtcblx0ICAgIH1cblx0ICAgIG1vdmVUZXh0KHgsIHkpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgY3VycmVudC54ID0gY3VycmVudC5saW5lWCArPSB4O1xuXHQgICAgICBjdXJyZW50LnkgPSBjdXJyZW50LmxpbmVZICs9IHk7XG5cdCAgICAgIGN1cnJlbnQueGNvb3JkcyA9IFtdO1xuXHQgICAgICBjdXJyZW50Lnljb29yZHMgPSBbXTtcblx0ICAgICAgY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuXHQgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1mYW1pbHlcIiwgY3VycmVudC5mb250RmFtaWx5KTtcblx0ICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc2l6ZVwiLCBgJHtwZihjdXJyZW50LmZvbnRTaXplKX1weGApO1xuXHQgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtY3VycmVudC55KSk7XG5cdCAgICB9XG5cdCAgICBzaG93VGV4dChnbHlwaHMpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDtcblx0ICAgICAgY29uc3QgZm9udFNpemUgPSBjdXJyZW50LmZvbnRTaXplO1xuXHQgICAgICBpZiAoZm9udFNpemUgPT09IDApIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgZm9udFNpemVTY2FsZSA9IGN1cnJlbnQuZm9udFNpemVTY2FsZTtcblx0ICAgICAgY29uc3QgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nO1xuXHQgICAgICBjb25zdCB3b3JkU3BhY2luZyA9IGN1cnJlbnQud29yZFNwYWNpbmc7XG5cdCAgICAgIGNvbnN0IGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247XG5cdCAgICAgIGNvbnN0IHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uO1xuXHQgICAgICBjb25zdCB2ZXJ0aWNhbCA9IGZvbnQudmVydGljYWw7XG5cdCAgICAgIGNvbnN0IHNwYWNpbmdEaXIgPSB2ZXJ0aWNhbCA/IDEgOiAtMTtcblx0ICAgICAgY29uc3QgZGVmYXVsdFZNZXRyaWNzID0gZm9udC5kZWZhdWx0Vk1ldHJpY3M7XG5cdCAgICAgIGNvbnN0IHdpZHRoQWR2YW5jZVNjYWxlID0gZm9udFNpemUgKiBjdXJyZW50LmZvbnRNYXRyaXhbMF07XG5cdCAgICAgIGxldCB4ID0gMDtcblx0ICAgICAgZm9yIChjb25zdCBnbHlwaCBvZiBnbHlwaHMpIHtcblx0ICAgICAgICBpZiAoZ2x5cGggPT09IG51bGwpIHtcblx0ICAgICAgICAgIHggKz0gZm9udERpcmVjdGlvbiAqIHdvcmRTcGFjaW5nO1xuXHQgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZ2x5cGggPT09IFwibnVtYmVyXCIpIHtcblx0ICAgICAgICAgIHggKz0gc3BhY2luZ0RpciAqIGdseXBoICogZm9udFNpemUgLyAxMDAwO1xuXHQgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZztcblx0ICAgICAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbHlwaC5mb250Q2hhcjtcblx0ICAgICAgICBsZXQgc2NhbGVkWCwgc2NhbGVkWTtcblx0ICAgICAgICBsZXQgd2lkdGggPSBnbHlwaC53aWR0aDtcblx0ICAgICAgICBpZiAodmVydGljYWwpIHtcblx0ICAgICAgICAgIGxldCB2eDtcblx0ICAgICAgICAgIGNvbnN0IHZtZXRyaWMgPSBnbHlwaC52bWV0cmljIHx8IGRlZmF1bHRWTWV0cmljcztcblx0ICAgICAgICAgIHZ4ID0gZ2x5cGgudm1ldHJpYyA/IHZtZXRyaWNbMV0gOiB3aWR0aCAqIDAuNTtcblx0ICAgICAgICAgIHZ4ID0gLXZ4ICogd2lkdGhBZHZhbmNlU2NhbGU7XG5cdCAgICAgICAgICBjb25zdCB2eSA9IHZtZXRyaWNbMl0gKiB3aWR0aEFkdmFuY2VTY2FsZTtcblx0ICAgICAgICAgIHdpZHRoID0gdm1ldHJpYyA/IC12bWV0cmljWzBdIDogd2lkdGg7XG5cdCAgICAgICAgICBzY2FsZWRYID0gdnggLyBmb250U2l6ZVNjYWxlO1xuXHQgICAgICAgICAgc2NhbGVkWSA9ICh4ICsgdnkpIC8gZm9udFNpemVTY2FsZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgc2NhbGVkWCA9IHggLyBmb250U2l6ZVNjYWxlO1xuXHQgICAgICAgICAgc2NhbGVkWSA9IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChnbHlwaC5pc0luRm9udCB8fCBmb250Lm1pc3NpbmdGaWxlKSB7XG5cdCAgICAgICAgICBjdXJyZW50Lnhjb29yZHMucHVzaChjdXJyZW50LnggKyBzY2FsZWRYKTtcblx0ICAgICAgICAgIGlmICh2ZXJ0aWNhbCkge1xuXHQgICAgICAgICAgICBjdXJyZW50Lnljb29yZHMucHVzaCgtY3VycmVudC55ICsgc2NhbGVkWSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBjdXJyZW50LnRzcGFuLnRleHRDb250ZW50ICs9IGNoYXJhY3Rlcjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgbGV0IGNoYXJXaWR0aDtcblx0ICAgICAgICBpZiAodmVydGljYWwpIHtcblx0ICAgICAgICAgIGNoYXJXaWR0aCA9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgLSBzcGFjaW5nICogZm9udERpcmVjdGlvbjtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgY2hhcldpZHRoID0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSArIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB4ICs9IGNoYXJXaWR0aDtcblx0ICAgICAgfVxuXHQgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBjdXJyZW50Lnhjb29yZHMubWFwKHBmKS5qb2luKFwiIFwiKSk7XG5cdCAgICAgIGlmICh2ZXJ0aWNhbCkge1xuXHQgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIGN1cnJlbnQueWNvb3Jkcy5tYXAocGYpLmpvaW4oXCIgXCIpKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtY3VycmVudC55KSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZlcnRpY2FsKSB7XG5cdCAgICAgICAgY3VycmVudC55IC09IHg7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgY3VycmVudC54ICs9IHggKiB0ZXh0SFNjYWxlO1xuXHQgICAgICB9XG5cdCAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmb250LWZhbWlseVwiLCBjdXJyZW50LmZvbnRGYW1pbHkpO1xuXHQgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1zaXplXCIsIGAke3BmKGN1cnJlbnQuZm9udFNpemUpfXB4YCk7XG5cdCAgICAgIGlmIChjdXJyZW50LmZvbnRTdHlsZSAhPT0gU1ZHX0RFRkFVTFRTLmZvbnRTdHlsZSkge1xuXHQgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmb250LXN0eWxlXCIsIGN1cnJlbnQuZm9udFN0eWxlKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoY3VycmVudC5mb250V2VpZ2h0ICE9PSBTVkdfREVGQVVMVFMuZm9udFdlaWdodCkge1xuXHQgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmb250LXdlaWdodFwiLCBjdXJyZW50LmZvbnRXZWlnaHQpO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IGZpbGxTdHJva2VNb2RlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFX01BU0s7XG5cdCAgICAgIGlmIChmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTCB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcblx0ICAgICAgICBpZiAoY3VycmVudC5maWxsQ29sb3IgIT09IFNWR19ERUZBVUxUUy5maWxsQ29sb3IpIHtcblx0ICAgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIGN1cnJlbnQuZmlsbENvbG9yKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGN1cnJlbnQuZmlsbEFscGhhIDwgMSkge1xuXHQgICAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtb3BhY2l0eVwiLCBjdXJyZW50LmZpbGxBbHBoYSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIKSB7XG5cdCAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcIm5vbmVcIik7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG5cdCAgICAgICAgY29uc3QgbGluZVdpZHRoU2NhbGUgPSAxIC8gKGN1cnJlbnQudGV4dE1hdHJpeFNjYWxlIHx8IDEpO1xuXHQgICAgICAgIHRoaXMuX3NldFN0cm9rZUF0dHJpYnV0ZXMoY3VycmVudC50c3BhbiwgbGluZVdpZHRoU2NhbGUpO1xuXHQgICAgICB9XG5cdCAgICAgIGxldCB0ZXh0TWF0cml4ID0gY3VycmVudC50ZXh0TWF0cml4O1xuXHQgICAgICBpZiAoY3VycmVudC50ZXh0UmlzZSAhPT0gMCkge1xuXHQgICAgICAgIHRleHRNYXRyaXggPSB0ZXh0TWF0cml4LnNsaWNlKCk7XG5cdCAgICAgICAgdGV4dE1hdHJpeFs1XSArPSBjdXJyZW50LnRleHRSaXNlO1xuXHQgICAgICB9XG5cdCAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBgJHtwbSh0ZXh0TWF0cml4KX0gc2NhbGUoJHtwZih0ZXh0SFNjYWxlKX0sIC0xKWApO1xuXHQgICAgICBjdXJyZW50LnR4dEVsZW1lbnQuc2V0QXR0cmlidXRlTlMoWE1MX05TLCBcInhtbDpzcGFjZVwiLCBcInByZXNlcnZlXCIpO1xuXHQgICAgICBjdXJyZW50LnR4dEVsZW1lbnQuYXBwZW5kKGN1cnJlbnQudHNwYW4pO1xuXHQgICAgICBjdXJyZW50LnR4dGdycC5hcHBlbmQoY3VycmVudC50eHRFbGVtZW50KTtcblx0ICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQoY3VycmVudC50eHRFbGVtZW50KTtcblx0ICAgIH1cblx0ICAgIHNldExlYWRpbmdNb3ZlVGV4dCh4LCB5KSB7XG5cdCAgICAgIHRoaXMuc2V0TGVhZGluZygteSk7XG5cdCAgICAgIHRoaXMubW92ZVRleHQoeCwgeSk7XG5cdCAgICB9XG5cdCAgICBhZGRGb250U3R5bGUoZm9udE9iaikge1xuXHQgICAgICBpZiAoIWZvbnRPYmouZGF0YSkge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFkZEZvbnRTdHlsZTogTm8gZm9udCBkYXRhIGF2YWlsYWJsZSwgXCIgKyAnZW5zdXJlIHRoYXQgdGhlIFwiZm9udEV4dHJhUHJvcGVydGllc1wiIEFQSSBwYXJhbWV0ZXIgaXMgc2V0LicpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghdGhpcy5jc3NTdHlsZSkge1xuXHQgICAgICAgIHRoaXMuY3NzU3R5bGUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpzdHlsZVwiKTtcblx0ICAgICAgICB0aGlzLmNzc1N0eWxlLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHlwZVwiLCBcInRleHQvY3NzXCIpO1xuXHQgICAgICAgIHRoaXMuZGVmcy5hcHBlbmQodGhpcy5jc3NTdHlsZSk7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgdXJsID0gY3JlYXRlT2JqZWN0VVJMKGZvbnRPYmouZGF0YSwgZm9udE9iai5taW1ldHlwZSwgdGhpcy5mb3JjZURhdGFTY2hlbWEpO1xuXHQgICAgICB0aGlzLmNzc1N0eWxlLnRleHRDb250ZW50ICs9IGBAZm9udC1mYWNlIHsgZm9udC1mYW1pbHk6IFwiJHtmb250T2JqLmxvYWRlZE5hbWV9XCI7YCArIGAgc3JjOiB1cmwoJHt1cmx9KTsgfVxcbmA7XG5cdCAgICB9XG5cdCAgICBzZXRGb250KGRldGFpbHMpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgY29uc3QgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZGV0YWlsc1swXSk7XG5cdCAgICAgIGxldCBzaXplID0gZGV0YWlsc1sxXTtcblx0ICAgICAgY3VycmVudC5mb250ID0gZm9udE9iajtcblx0ICAgICAgaWYgKHRoaXMuZW1iZWRGb250cyAmJiAhZm9udE9iai5taXNzaW5nRmlsZSAmJiAhdGhpcy5lbWJlZGRlZEZvbnRzW2ZvbnRPYmoubG9hZGVkTmFtZV0pIHtcblx0ICAgICAgICB0aGlzLmFkZEZvbnRTdHlsZShmb250T2JqKTtcblx0ICAgICAgICB0aGlzLmVtYmVkZGVkRm9udHNbZm9udE9iai5sb2FkZWROYW1lXSA9IGZvbnRPYmo7XG5cdCAgICAgIH1cblx0ICAgICAgY3VycmVudC5mb250TWF0cml4ID0gZm9udE9iai5mb250TWF0cml4IHx8IF91dGlsLkZPTlRfSURFTlRJVFlfTUFUUklYO1xuXHQgICAgICBsZXQgYm9sZCA9IFwibm9ybWFsXCI7XG5cdCAgICAgIGlmIChmb250T2JqLmJsYWNrKSB7XG5cdCAgICAgICAgYm9sZCA9IFwiOTAwXCI7XG5cdCAgICAgIH0gZWxzZSBpZiAoZm9udE9iai5ib2xkKSB7XG5cdCAgICAgICAgYm9sZCA9IFwiYm9sZFwiO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IGl0YWxpYyA9IGZvbnRPYmouaXRhbGljID8gXCJpdGFsaWNcIiA6IFwibm9ybWFsXCI7XG5cdCAgICAgIGlmIChzaXplIDwgMCkge1xuXHQgICAgICAgIHNpemUgPSAtc2l6ZTtcblx0ICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAtMTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAxO1xuXHQgICAgICB9XG5cdCAgICAgIGN1cnJlbnQuZm9udFNpemUgPSBzaXplO1xuXHQgICAgICBjdXJyZW50LmZvbnRGYW1pbHkgPSBmb250T2JqLmxvYWRlZE5hbWU7XG5cdCAgICAgIGN1cnJlbnQuZm9udFdlaWdodCA9IGJvbGQ7XG5cdCAgICAgIGN1cnJlbnQuZm9udFN0eWxlID0gaXRhbGljO1xuXHQgICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG5cdCAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1jdXJyZW50LnkpKTtcblx0ICAgICAgY3VycmVudC54Y29vcmRzID0gW107XG5cdCAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdO1xuXHQgICAgfVxuXHQgICAgZW5kVGV4dCgpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgaWYgKGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5BRERfVE9fUEFUSF9GTEFHICYmIGN1cnJlbnQudHh0RWxlbWVudD8uaGFzQ2hpbGROb2RlcygpKSB7XG5cdCAgICAgICAgY3VycmVudC5lbGVtZW50ID0gY3VycmVudC50eHRFbGVtZW50O1xuXHQgICAgICAgIHRoaXMuY2xpcChcIm5vbnplcm9cIik7XG5cdCAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHNldExpbmVXaWR0aCh3aWR0aCkge1xuXHQgICAgICBpZiAod2lkdGggPiAwKSB7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50LmxpbmVXaWR0aCA9IHdpZHRoO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBzZXRMaW5lQ2FwKHN0eWxlKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC5saW5lQ2FwID0gTElORV9DQVBfU1RZTEVTW3N0eWxlXTtcblx0ICAgIH1cblx0ICAgIHNldExpbmVKb2luKHN0eWxlKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC5saW5lSm9pbiA9IExJTkVfSk9JTl9TVFlMRVNbc3R5bGVdO1xuXHQgICAgfVxuXHQgICAgc2V0TWl0ZXJMaW1pdChsaW1pdCkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQubWl0ZXJMaW1pdCA9IGxpbWl0O1xuXHQgICAgfVxuXHQgICAgc2V0U3Ryb2tlQWxwaGEoc3Ryb2tlQWxwaGEpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUFscGhhID0gc3Ryb2tlQWxwaGE7XG5cdCAgICB9XG5cdCAgICBzZXRTdHJva2VSR0JDb2xvcihyLCBnLCBiKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKHIsIGcsIGIpO1xuXHQgICAgfVxuXHQgICAgc2V0RmlsbEFscGhhKGZpbGxBbHBoYSkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gZmlsbEFscGhhO1xuXHQgICAgfVxuXHQgICAgc2V0RmlsbFJHQkNvbG9yKHIsIGcsIGIpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKHIsIGcsIGIpO1xuXHQgICAgICB0aGlzLmN1cnJlbnQudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcblx0ICAgICAgdGhpcy5jdXJyZW50Lnhjb29yZHMgPSBbXTtcblx0ICAgICAgdGhpcy5jdXJyZW50Lnljb29yZHMgPSBbXTtcblx0ICAgIH1cblx0ICAgIHNldFN0cm9rZUNvbG9yTihhcmdzKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IHRoaXMuX21ha2VDb2xvck5fUGF0dGVybihhcmdzKTtcblx0ICAgIH1cblx0ICAgIHNldEZpbGxDb2xvck4oYXJncykge1xuXHQgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKGFyZ3MpO1xuXHQgICAgfVxuXHQgICAgc2hhZGluZ0ZpbGwoYXJncykge1xuXHQgICAgICBjb25zdCB3aWR0aCA9IHRoaXMudmlld3BvcnQud2lkdGg7XG5cdCAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMudmlld3BvcnQuaGVpZ2h0O1xuXHQgICAgICBjb25zdCBpbnYgPSBfdXRpbC5VdGlsLmludmVyc2VUcmFuc2Zvcm0odGhpcy50cmFuc2Zvcm1NYXRyaXgpO1xuXHQgICAgICBjb25zdCBibCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBpbnYpO1xuXHQgICAgICBjb25zdCBiciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIGhlaWdodF0sIGludik7XG5cdCAgICAgIGNvbnN0IHVsID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIDBdLCBpbnYpO1xuXHQgICAgICBjb25zdCB1ciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCBoZWlnaHRdLCBpbnYpO1xuXHQgICAgICBjb25zdCB4MCA9IE1hdGgubWluKGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTtcblx0ICAgICAgY29uc3QgeTAgPSBNYXRoLm1pbihibFsxXSwgYnJbMV0sIHVsWzFdLCB1clsxXSk7XG5cdCAgICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoYmxbMF0sIGJyWzBdLCB1bFswXSwgdXJbMF0pO1xuXHQgICAgICBjb25zdCB5MSA9IE1hdGgubWF4KGJsWzFdLCBiclsxXSwgdWxbMV0sIHVyWzFdKTtcblx0ICAgICAgY29uc3QgcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIHgwKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgeTApO1xuXHQgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgeDEgLSB4MCk7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgeTEgLSB5MCk7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIHRoaXMuX21ha2VTaGFkaW5nUGF0dGVybihhcmdzKSk7XG5cdCAgICAgIGlmICh0aGlzLmN1cnJlbnQuZmlsbEFscGhhIDwgMSkge1xuXHQgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLW9wYWNpdHlcIiwgdGhpcy5jdXJyZW50LmZpbGxBbHBoYSk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQocmVjdCk7XG5cdCAgICB9XG5cdCAgICBfbWFrZUNvbG9yTl9QYXR0ZXJuKGFyZ3MpIHtcblx0ICAgICAgaWYgKGFyZ3NbMF0gPT09IFwiVGlsaW5nUGF0dGVyblwiKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VUaWxpbmdQYXR0ZXJuKGFyZ3MpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLl9tYWtlU2hhZGluZ1BhdHRlcm4oYXJncyk7XG5cdCAgICB9XG5cdCAgICBfbWFrZVRpbGluZ1BhdHRlcm4oYXJncykge1xuXHQgICAgICBjb25zdCBjb2xvciA9IGFyZ3NbMV07XG5cdCAgICAgIGNvbnN0IG9wZXJhdG9yTGlzdCA9IGFyZ3NbMl07XG5cdCAgICAgIGNvbnN0IG1hdHJpeCA9IGFyZ3NbM10gfHwgX3V0aWwuSURFTlRJVFlfTUFUUklYO1xuXHQgICAgICBjb25zdCBbeDAsIHkwLCB4MSwgeTFdID0gYXJnc1s0XTtcblx0ICAgICAgY29uc3QgeHN0ZXAgPSBhcmdzWzVdO1xuXHQgICAgICBjb25zdCB5c3RlcCA9IGFyZ3NbNl07XG5cdCAgICAgIGNvbnN0IHBhaW50VHlwZSA9IGFyZ3NbN107XG5cdCAgICAgIGNvbnN0IHRpbGluZ0lkID0gYHNoYWRpbmcke3NoYWRpbmdDb3VudCsrfWA7XG5cdCAgICAgIGNvbnN0IFt0eDAsIHR5MCwgdHgxLCB0eTFdID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KFsuLi5fdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt4MCwgeTBdLCBtYXRyaXgpLCAuLi5fdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt4MSwgeTFdLCBtYXRyaXgpXSk7XG5cdCAgICAgIGNvbnN0IFt4c2NhbGUsIHlzY2FsZV0gPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKG1hdHJpeCk7XG5cdCAgICAgIGNvbnN0IHR4c3RlcCA9IHhzdGVwICogeHNjYWxlO1xuXHQgICAgICBjb25zdCB0eXN0ZXAgPSB5c3RlcCAqIHlzY2FsZTtcblx0ICAgICAgY29uc3QgdGlsaW5nID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cGF0dGVyblwiKTtcblx0ICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgdGlsaW5nSWQpO1xuXHQgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJwYXR0ZXJuVW5pdHNcIiwgXCJ1c2VyU3BhY2VPblVzZVwiKTtcblx0ICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgdHhzdGVwKTtcblx0ICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIHR5c3RlcCk7XG5cdCAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgYCR7dHgwfWApO1xuXHQgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIGAke3R5MH1gKTtcblx0ICAgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmc7XG5cdCAgICAgIGNvbnN0IHRyYW5zZm9ybU1hdHJpeCA9IHRoaXMudHJhbnNmb3JtTWF0cml4O1xuXHQgICAgICBjb25zdCBmaWxsQ29sb3IgPSB0aGlzLmN1cnJlbnQuZmlsbENvbG9yO1xuXHQgICAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY3VycmVudC5zdHJva2VDb2xvcjtcblx0ICAgICAgY29uc3QgYmJveCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUodHgxIC0gdHgwLCB0eTEgLSB0eTApO1xuXHQgICAgICB0aGlzLnN2ZyA9IGJib3g7XG5cdCAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gbWF0cml4O1xuXHQgICAgICBpZiAocGFpbnRUeXBlID09PSAyKSB7XG5cdCAgICAgICAgY29uc3QgY3NzQ29sb3IgPSBfdXRpbC5VdGlsLm1ha2VIZXhDb2xvciguLi5jb2xvcik7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGNzc0NvbG9yO1xuXHQgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VDb2xvciA9IGNzc0NvbG9yO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3Qob3BlcmF0b3JMaXN0KSk7XG5cdCAgICAgIHRoaXMuc3ZnID0gc3ZnO1xuXHQgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHRyYW5zZm9ybU1hdHJpeDtcblx0ICAgICAgdGhpcy5jdXJyZW50LmZpbGxDb2xvciA9IGZpbGxDb2xvcjtcblx0ICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gc3Ryb2tlQ29sb3I7XG5cdCAgICAgIHRpbGluZy5hcHBlbmQoYmJveC5jaGlsZE5vZGVzWzBdKTtcblx0ICAgICAgdGhpcy5kZWZzLmFwcGVuZCh0aWxpbmcpO1xuXHQgICAgICByZXR1cm4gYHVybCgjJHt0aWxpbmdJZH0pYDtcblx0ICAgIH1cblx0ICAgIF9tYWtlU2hhZGluZ1BhdHRlcm4oYXJncykge1xuXHQgICAgICBpZiAodHlwZW9mIGFyZ3MgPT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgICBhcmdzID0gdGhpcy5vYmpzLmdldChhcmdzKTtcblx0ICAgICAgfVxuXHQgICAgICBzd2l0Y2ggKGFyZ3NbMF0pIHtcblx0ICAgICAgICBjYXNlIFwiUmFkaWFsQXhpYWxcIjpcblx0ICAgICAgICAgIGNvbnN0IHNoYWRpbmdJZCA9IGBzaGFkaW5nJHtzaGFkaW5nQ291bnQrK31gO1xuXHQgICAgICAgICAgY29uc3QgY29sb3JTdG9wcyA9IGFyZ3NbM107XG5cdCAgICAgICAgICBsZXQgZ3JhZGllbnQ7XG5cdCAgICAgICAgICBzd2l0Y2ggKGFyZ3NbMV0pIHtcblx0ICAgICAgICAgICAgY2FzZSBcImF4aWFsXCI6XG5cdCAgICAgICAgICAgICAgY29uc3QgcG9pbnQwID0gYXJnc1s0XTtcblx0ICAgICAgICAgICAgICBjb25zdCBwb2ludDEgPSBhcmdzWzVdO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bGluZWFyR3JhZGllbnRcIik7XG5cdCAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBzaGFkaW5nSWQpO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZ3JhZGllbnRVbml0c1wiLCBcInVzZXJTcGFjZU9uVXNlXCIpO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieDFcIiwgcG9pbnQwWzBdKTtcblx0ICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInkxXCIsIHBvaW50MFsxXSk7XG5cdCAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4MlwiLCBwb2ludDFbMF0pO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieTJcIiwgcG9pbnQxWzFdKTtcblx0ICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBcInJhZGlhbFwiOlxuXHQgICAgICAgICAgICAgIGNvbnN0IGZvY2FsUG9pbnQgPSBhcmdzWzRdO1xuXHQgICAgICAgICAgICAgIGNvbnN0IGNpcmNsZVBvaW50ID0gYXJnc1s1XTtcblx0ICAgICAgICAgICAgICBjb25zdCBmb2NhbFJhZGl1cyA9IGFyZ3NbNl07XG5cdCAgICAgICAgICAgICAgY29uc3QgY2lyY2xlUmFkaXVzID0gYXJnc1s3XTtcblx0ICAgICAgICAgICAgICBncmFkaWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJhZGlhbEdyYWRpZW50XCIpO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgc2hhZGluZ0lkKTtcblx0ICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImdyYWRpZW50VW5pdHNcIiwgXCJ1c2VyU3BhY2VPblVzZVwiKTtcblx0ICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImN4XCIsIGNpcmNsZVBvaW50WzBdKTtcblx0ICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImN5XCIsIGNpcmNsZVBvaW50WzFdKTtcblx0ICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInJcIiwgY2lyY2xlUmFkaXVzKTtcblx0ICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZ4XCIsIGZvY2FsUG9pbnRbMF0pO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZnlcIiwgZm9jYWxQb2ludFsxXSk7XG5cdCAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmclwiLCBmb2NhbFJhZGl1cyk7XG5cdCAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFJhZGlhbEF4aWFsIHR5cGU6ICR7YXJnc1sxXX1gKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGZvciAoY29uc3QgY29sb3JTdG9wIG9mIGNvbG9yU3RvcHMpIHtcblx0ICAgICAgICAgICAgY29uc3Qgc3RvcCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnN0b3BcIik7XG5cdCAgICAgICAgICAgIHN0b3Auc2V0QXR0cmlidXRlTlMobnVsbCwgXCJvZmZzZXRcIiwgY29sb3JTdG9wWzBdKTtcblx0ICAgICAgICAgICAgc3RvcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0b3AtY29sb3JcIiwgY29sb3JTdG9wWzFdKTtcblx0ICAgICAgICAgICAgZ3JhZGllbnQuYXBwZW5kKHN0b3ApO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgdGhpcy5kZWZzLmFwcGVuZChncmFkaWVudCk7XG5cdCAgICAgICAgICByZXR1cm4gYHVybCgjJHtzaGFkaW5nSWR9KWA7XG5cdCAgICAgICAgY2FzZSBcIk1lc2hcIjpcblx0ICAgICAgICAgICgwLCBfdXRpbC53YXJuKShcIlVuaW1wbGVtZW50ZWQgcGF0dGVybiBNZXNoXCIpO1xuXHQgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgY2FzZSBcIkR1bW15XCI6XG5cdCAgICAgICAgICByZXR1cm4gXCJob3RwaW5rXCI7XG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBJUiB0eXBlOiAke2FyZ3NbMF19YCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHNldERhc2goZGFzaEFycmF5LCBkYXNoUGhhc2UpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LmRhc2hBcnJheSA9IGRhc2hBcnJheTtcblx0ICAgICAgdGhpcy5jdXJyZW50LmRhc2hQaGFzZSA9IGRhc2hQaGFzZTtcblx0ICAgIH1cblx0ICAgIGNvbnN0cnVjdFBhdGgob3BzLCBhcmdzKSB7XG5cdCAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIGxldCB4ID0gY3VycmVudC54LFxuXHQgICAgICAgIHkgPSBjdXJyZW50Lnk7XG5cdCAgICAgIGxldCBkID0gW107XG5cdCAgICAgIGxldCBqID0gMDtcblx0ICAgICAgZm9yIChjb25zdCBvcCBvZiBvcHMpIHtcblx0ICAgICAgICBzd2l0Y2ggKG9wIHwgMCkge1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucmVjdGFuZ2xlOlxuXHQgICAgICAgICAgICB4ID0gYXJnc1tqKytdO1xuXHQgICAgICAgICAgICB5ID0gYXJnc1tqKytdO1xuXHQgICAgICAgICAgICBjb25zdCB3aWR0aCA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXJnc1tqKytdO1xuXHQgICAgICAgICAgICBjb25zdCB4dyA9IHggKyB3aWR0aDtcblx0ICAgICAgICAgICAgY29uc3QgeWggPSB5ICsgaGVpZ2h0O1xuXHQgICAgICAgICAgICBkLnB1c2goXCJNXCIsIHBmKHgpLCBwZih5KSwgXCJMXCIsIHBmKHh3KSwgcGYoeSksIFwiTFwiLCBwZih4dyksIHBmKHloKSwgXCJMXCIsIHBmKHgpLCBwZih5aCksIFwiWlwiKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5tb3ZlVG86XG5cdCAgICAgICAgICAgIHggPSBhcmdzW2orK107XG5cdCAgICAgICAgICAgIHkgPSBhcmdzW2orK107XG5cdCAgICAgICAgICAgIGQucHVzaChcIk1cIiwgcGYoeCksIHBmKHkpKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5saW5lVG86XG5cdCAgICAgICAgICAgIHggPSBhcmdzW2orK107XG5cdCAgICAgICAgICAgIHkgPSBhcmdzW2orK107XG5cdCAgICAgICAgICAgIGQucHVzaChcIkxcIiwgcGYoeCksIHBmKHkpKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jdXJ2ZVRvOlxuXHQgICAgICAgICAgICB4ID0gYXJnc1tqICsgNF07XG5cdCAgICAgICAgICAgIHkgPSBhcmdzW2ogKyA1XTtcblx0ICAgICAgICAgICAgZC5wdXNoKFwiQ1wiLCBwZihhcmdzW2pdKSwgcGYoYXJnc1tqICsgMV0pLCBwZihhcmdzW2ogKyAyXSksIHBmKGFyZ3NbaiArIDNdKSwgcGYoeCksIHBmKHkpKTtcblx0ICAgICAgICAgICAgaiArPSA2O1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8yOlxuXHQgICAgICAgICAgICBkLnB1c2goXCJDXCIsIHBmKHgpLCBwZih5KSwgcGYoYXJnc1tqXSksIHBmKGFyZ3NbaiArIDFdKSwgcGYoYXJnc1tqICsgMl0pLCBwZihhcmdzW2ogKyAzXSkpO1xuXHQgICAgICAgICAgICB4ID0gYXJnc1tqICsgMl07XG5cdCAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcblx0ICAgICAgICAgICAgaiArPSA0O1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8zOlxuXHQgICAgICAgICAgICB4ID0gYXJnc1tqICsgMl07XG5cdCAgICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcblx0ICAgICAgICAgICAgZC5wdXNoKFwiQ1wiLCBwZihhcmdzW2pdKSwgcGYoYXJnc1tqICsgMV0pLCBwZih4KSwgcGYoeSksIHBmKHgpLCBwZih5KSk7XG5cdCAgICAgICAgICAgIGogKz0gNDtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5jbG9zZVBhdGg6XG5cdCAgICAgICAgICAgIGQucHVzaChcIlpcIik7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBkID0gZC5qb2luKFwiIFwiKTtcblx0ICAgICAgaWYgKGN1cnJlbnQucGF0aCAmJiBvcHMubGVuZ3RoID4gMCAmJiBvcHNbMF0gIT09IF91dGlsLk9QUy5yZWN0YW5nbGUgJiYgb3BzWzBdICE9PSBfdXRpbC5PUFMubW92ZVRvKSB7XG5cdCAgICAgICAgZCA9IGN1cnJlbnQucGF0aC5nZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIikgKyBkO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGN1cnJlbnQucGF0aCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnBhdGhcIik7XG5cdCAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQoY3VycmVudC5wYXRoKTtcblx0ICAgICAgfVxuXHQgICAgICBjdXJyZW50LnBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIGQpO1xuXHQgICAgICBjdXJyZW50LnBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwibm9uZVwiKTtcblx0ICAgICAgY3VycmVudC5lbGVtZW50ID0gY3VycmVudC5wYXRoO1xuXHQgICAgICBjdXJyZW50LnNldEN1cnJlbnRQb2ludCh4LCB5KTtcblx0ICAgIH1cblx0ICAgIGVuZFBhdGgoKSB7XG5cdCAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIGN1cnJlbnQucGF0aCA9IG51bGw7XG5cdCAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2xpcCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoIWN1cnJlbnQuZWxlbWVudCkge1xuXHQgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBjbGlwSWQgPSBgY2xpcHBhdGgke2NsaXBDb3VudCsrfWA7XG5cdCAgICAgIGNvbnN0IGNsaXBQYXRoID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Y2xpcFBhdGhcIik7XG5cdCAgICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgY2xpcElkKTtcblx0ICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0cmFuc2Zvcm1cIiwgcG0odGhpcy50cmFuc2Zvcm1NYXRyaXgpKTtcblx0ICAgICAgY29uc3QgY2xpcEVsZW1lbnQgPSBjdXJyZW50LmVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuXHQgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCA9PT0gXCJldmVub2RkXCIpIHtcblx0ICAgICAgICBjbGlwRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsaXAtcnVsZVwiLCBcImV2ZW5vZGRcIik7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgY2xpcEVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXJ1bGVcIiwgXCJub256ZXJvXCIpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuXHQgICAgICBjbGlwUGF0aC5hcHBlbmQoY2xpcEVsZW1lbnQpO1xuXHQgICAgICB0aGlzLmRlZnMuYXBwZW5kKGNsaXBQYXRoKTtcblx0ICAgICAgaWYgKGN1cnJlbnQuYWN0aXZlQ2xpcFVybCkge1xuXHQgICAgICAgIGN1cnJlbnQuY2xpcEdyb3VwID0gbnVsbDtcblx0ICAgICAgICBmb3IgKGNvbnN0IHByZXYgb2YgdGhpcy5leHRyYVN0YWNrKSB7XG5cdCAgICAgICAgICBwcmV2LmNsaXBHcm91cCA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNsaXBQYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY2xpcC1wYXRoXCIsIGN1cnJlbnQuYWN0aXZlQ2xpcFVybCk7XG5cdCAgICAgIH1cblx0ICAgICAgY3VycmVudC5hY3RpdmVDbGlwVXJsID0gYHVybCgjJHtjbGlwSWR9KWA7XG5cdCAgICAgIHRoaXMudGdycCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBjbGlwKHR5cGUpIHtcblx0ICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHR5cGU7XG5cdCAgICB9XG5cdCAgICBjbG9zZVBhdGgoKSB7XG5cdCAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIGlmIChjdXJyZW50LnBhdGgpIHtcblx0ICAgICAgICBjb25zdCBkID0gYCR7Y3VycmVudC5wYXRoLmdldEF0dHJpYnV0ZU5TKG51bGwsIFwiZFwiKX1aYDtcblx0ICAgICAgICBjdXJyZW50LnBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIGQpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBzZXRMZWFkaW5nKGxlYWRpbmcpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LmxlYWRpbmcgPSAtbGVhZGluZztcblx0ICAgIH1cblx0ICAgIHNldFRleHRSaXNlKHRleHRSaXNlKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC50ZXh0UmlzZSA9IHRleHRSaXNlO1xuXHQgICAgfVxuXHQgICAgc2V0VGV4dFJlbmRlcmluZ01vZGUodGV4dFJlbmRlcmluZ01vZGUpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID0gdGV4dFJlbmRlcmluZ01vZGU7XG5cdCAgICB9XG5cdCAgICBzZXRIU2NhbGUoc2NhbGUpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LnRleHRIU2NhbGUgPSBzY2FsZSAvIDEwMDtcblx0ICAgIH1cblx0ICAgIHNldFJlbmRlcmluZ0ludGVudChpbnRlbnQpIHt9XG5cdCAgICBzZXRGbGF0bmVzcyhmbGF0bmVzcykge31cblx0ICAgIHNldEdTdGF0ZShzdGF0ZXMpIHtcblx0ICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3RhdGVzKSB7XG5cdCAgICAgICAgc3dpdGNoIChrZXkpIHtcblx0ICAgICAgICAgIGNhc2UgXCJMV1wiOlxuXHQgICAgICAgICAgICB0aGlzLnNldExpbmVXaWR0aCh2YWx1ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcIkxDXCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcCh2YWx1ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcIkxKXCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0TGluZUpvaW4odmFsdWUpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgXCJNTFwiOlxuXHQgICAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQodmFsdWUpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgXCJEXCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0RGFzaCh2YWx1ZVswXSwgdmFsdWVbMV0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgXCJSSVwiOlxuXHQgICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudCh2YWx1ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcIkZMXCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0RmxhdG5lc3ModmFsdWUpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgXCJGb250XCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh2YWx1ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcIkNBXCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0U3Ryb2tlQWxwaGEodmFsdWUpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgXCJjYVwiOlxuXHQgICAgICAgICAgICB0aGlzLnNldEZpbGxBbHBoYSh2YWx1ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBVbmltcGxlbWVudGVkIGdyYXBoaWMgc3RhdGUgb3BlcmF0b3IgJHtrZXl9YCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgZmlsbCgpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudCkge1xuXHQgICAgICAgIGN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgY3VycmVudC5maWxsQ29sb3IpO1xuXHQgICAgICAgIGN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtb3BhY2l0eVwiLCBjdXJyZW50LmZpbGxBbHBoYSk7XG5cdCAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHN0cm9rZSgpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudCkge1xuXHQgICAgICAgIHRoaXMuX3NldFN0cm9rZUF0dHJpYnV0ZXMoY3VycmVudC5lbGVtZW50KTtcblx0ICAgICAgICBjdXJyZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwibm9uZVwiKTtcblx0ICAgICAgICB0aGlzLmVuZFBhdGgoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgX3NldFN0cm9rZUF0dHJpYnV0ZXMoZWxlbWVudCwgbGluZVdpZHRoU2NhbGUgPSAxKSB7XG5cdCAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIGxldCBkYXNoQXJyYXkgPSBjdXJyZW50LmRhc2hBcnJheTtcblx0ICAgICAgaWYgKGxpbmVXaWR0aFNjYWxlICE9PSAxICYmIGRhc2hBcnJheS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgZGFzaEFycmF5ID0gZGFzaEFycmF5Lm1hcChmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICAgIHJldHVybiBsaW5lV2lkdGhTY2FsZSAqIHZhbHVlO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2VcIiwgY3VycmVudC5zdHJva2VDb2xvcik7XG5cdCAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2Utb3BhY2l0eVwiLCBjdXJyZW50LnN0cm9rZUFscGhhKTtcblx0ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1taXRlcmxpbWl0XCIsIHBmKGN1cnJlbnQubWl0ZXJMaW1pdCkpO1xuXHQgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLWxpbmVjYXBcIiwgY3VycmVudC5saW5lQ2FwKTtcblx0ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1saW5lam9pblwiLCBjdXJyZW50LmxpbmVKb2luKTtcblx0ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS13aWR0aFwiLCBwZihsaW5lV2lkdGhTY2FsZSAqIGN1cnJlbnQubGluZVdpZHRoKSArIFwicHhcIik7XG5cdCAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2UtZGFzaGFycmF5XCIsIGRhc2hBcnJheS5tYXAocGYpLmpvaW4oXCIgXCIpKTtcblx0ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1kYXNob2Zmc2V0XCIsIHBmKGxpbmVXaWR0aFNjYWxlICogY3VycmVudC5kYXNoUGhhc2UpICsgXCJweFwiKTtcblx0ICAgIH1cblx0ICAgIGVvRmlsbCgpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LmVsZW1lbnQ/LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1ydWxlXCIsIFwiZXZlbm9kZFwiKTtcblx0ICAgICAgdGhpcy5maWxsKCk7XG5cdCAgICB9XG5cdCAgICBmaWxsU3Ryb2tlKCkge1xuXHQgICAgICB0aGlzLnN0cm9rZSgpO1xuXHQgICAgICB0aGlzLmZpbGwoKTtcblx0ICAgIH1cblx0ICAgIGVvRmlsbFN0cm9rZSgpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LmVsZW1lbnQ/LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1ydWxlXCIsIFwiZXZlbm9kZFwiKTtcblx0ICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG5cdCAgICB9XG5cdCAgICBjbG9zZVN0cm9rZSgpIHtcblx0ICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcblx0ICAgICAgdGhpcy5zdHJva2UoKTtcblx0ICAgIH1cblx0ICAgIGNsb3NlRmlsbFN0cm9rZSgpIHtcblx0ICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcblx0ICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG5cdCAgICB9XG5cdCAgICBjbG9zZUVPRmlsbFN0cm9rZSgpIHtcblx0ICAgICAgdGhpcy5jbG9zZVBhdGgoKTtcblx0ICAgICAgdGhpcy5lb0ZpbGxTdHJva2UoKTtcblx0ICAgIH1cblx0ICAgIHBhaW50U29saWRDb2xvckltYWdlTWFzaygpIHtcblx0ICAgICAgY29uc3QgcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIwXCIpO1xuXHQgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgXCIxcHhcIik7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgXCIxcHhcIik7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIHRoaXMuY3VycmVudC5maWxsQ29sb3IpO1xuXHQgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChyZWN0KTtcblx0ICAgIH1cblx0ICAgIHBhaW50SW1hZ2VYT2JqZWN0KG9iaklkKSB7XG5cdCAgICAgIGNvbnN0IGltZ0RhdGEgPSB0aGlzLmdldE9iamVjdChvYmpJZCk7XG5cdCAgICAgIGlmICghaW1nRGF0YSkge1xuXHQgICAgICAgICgwLCBfdXRpbC53YXJuKShgRGVwZW5kZW50IGltYWdlIHdpdGggb2JqZWN0IElEICR7b2JqSWR9IGlzIG5vdCByZWFkeSB5ZXRgKTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhKTtcblx0ICAgIH1cblx0ICAgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEsIG1hc2spIHtcblx0ICAgICAgY29uc3Qgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuXHQgICAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcblx0ICAgICAgY29uc3QgaW1nU3JjID0gY29udmVydEltZ0RhdGFUb1BuZyhpbWdEYXRhLCB0aGlzLmZvcmNlRGF0YVNjaGVtYSwgISFtYXNrKTtcblx0ICAgICAgY29uc3QgY2xpcHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuXHQgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuXHQgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIwXCIpO1xuXHQgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKHdpZHRoKSk7XG5cdCAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIHBmKGhlaWdodCkpO1xuXHQgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudCA9IGNsaXByZWN0O1xuXHQgICAgICB0aGlzLmNsaXAoXCJub256ZXJvXCIpO1xuXHQgICAgICBjb25zdCBpbWdFbCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmltYWdlXCIpO1xuXHQgICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhYTElOS19OUywgXCJ4bGluazpocmVmXCIsIGltZ1NyYyk7XG5cdCAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjBcIik7XG5cdCAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBwZigtaGVpZ2h0KSk7XG5cdCAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYod2lkdGgpICsgXCJweFwiKTtcblx0ICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaGVpZ2h0KSArIFwicHhcIik7XG5cdCAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIGBzY2FsZSgke3BmKDEgLyB3aWR0aCl9ICR7cGYoLTEgLyBoZWlnaHQpfSlgKTtcblx0ICAgICAgaWYgKG1hc2spIHtcblx0ICAgICAgICBtYXNrLmFwcGVuZChpbWdFbCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5fZW5zdXJlVHJhbnNmb3JtR3JvdXAoKS5hcHBlbmQoaW1nRWwpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBwYWludEltYWdlTWFza1hPYmplY3QoaW1nKSB7XG5cdCAgICAgIGNvbnN0IGltZ0RhdGEgPSB0aGlzLmdldE9iamVjdChpbWcuZGF0YSwgaW1nKTtcblx0ICAgICAgaWYgKGltZ0RhdGEuYml0bWFwKSB7XG5cdCAgICAgICAgKDAsIF91dGlsLndhcm4pKFwicGFpbnRJbWFnZU1hc2tYT2JqZWN0OiBJbWFnZUJpdG1hcCBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCwgXCIgKyBcImVuc3VyZSB0aGF0IHRoZSBgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWRgIEFQSSBwYXJhbWV0ZXIgaXMgZGlzYWJsZWQuXCIpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG5cdCAgICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuXHQgICAgICBjb25zdCBmaWxsQ29sb3IgPSBjdXJyZW50LmZpbGxDb2xvcjtcblx0ICAgICAgY3VycmVudC5tYXNrSWQgPSBgbWFzayR7bWFza0NvdW50Kyt9YDtcblx0ICAgICAgY29uc3QgbWFzayA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOm1hc2tcIik7XG5cdCAgICAgIG1hc2suc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBjdXJyZW50Lm1hc2tJZCk7XG5cdCAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuXHQgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjBcIik7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMFwiKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHBmKHdpZHRoKSk7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaGVpZ2h0KSk7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIGZpbGxDb2xvcik7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJtYXNrXCIsIGB1cmwoIyR7Y3VycmVudC5tYXNrSWR9KWApO1xuXHQgICAgICB0aGlzLmRlZnMuYXBwZW5kKG1hc2spO1xuXHQgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChyZWN0KTtcblx0ICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChpbWdEYXRhLCBtYXNrKTtcblx0ICAgIH1cblx0ICAgIHBhaW50Rm9ybVhPYmplY3RCZWdpbihtYXRyaXgsIGJib3gpIHtcblx0ICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF0cml4KSAmJiBtYXRyaXgubGVuZ3RoID09PSA2KSB7XG5cdCAgICAgICAgdGhpcy50cmFuc2Zvcm0obWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFsyXSwgbWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGJib3gpIHtcblx0ICAgICAgICBjb25zdCB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdO1xuXHQgICAgICAgIGNvbnN0IGhlaWdodCA9IGJib3hbM10gLSBiYm94WzFdO1xuXHQgICAgICAgIGNvbnN0IGNsaXByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcblx0ICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgYmJveFswXSk7XG5cdCAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIGJib3hbMV0pO1xuXHQgICAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYod2lkdGgpKTtcblx0ICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihoZWlnaHQpKTtcblx0ICAgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudCA9IGNsaXByZWN0O1xuXHQgICAgICAgIHRoaXMuY2xpcChcIm5vbnplcm9cIik7XG5cdCAgICAgICAgdGhpcy5lbmRQYXRoKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHBhaW50Rm9ybVhPYmplY3RFbmQoKSB7fVxuXHQgICAgX2luaXRpYWxpemUodmlld3BvcnQpIHtcblx0ICAgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTtcblx0ICAgICAgY29uc3QgZGVmaW5pdGlvbnMgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpkZWZzXCIpO1xuXHQgICAgICBzdmcuYXBwZW5kKGRlZmluaXRpb25zKTtcblx0ICAgICAgdGhpcy5kZWZzID0gZGVmaW5pdGlvbnM7XG5cdCAgICAgIGNvbnN0IHJvb3RHcm91cCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG5cdCAgICAgIHJvb3RHcm91cC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh2aWV3cG9ydC50cmFuc2Zvcm0pKTtcblx0ICAgICAgc3ZnLmFwcGVuZChyb290R3JvdXApO1xuXHQgICAgICB0aGlzLnN2ZyA9IHJvb3RHcm91cDtcblx0ICAgICAgcmV0dXJuIHN2Zztcblx0ICAgIH1cblx0ICAgIF9lbnN1cmVDbGlwR3JvdXAoKSB7XG5cdCAgICAgIGlmICghdGhpcy5jdXJyZW50LmNsaXBHcm91cCkge1xuXHQgICAgICAgIGNvbnN0IGNsaXBHcm91cCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG5cdCAgICAgICAgY2xpcEdyb3VwLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY2xpcC1wYXRoXCIsIHRoaXMuY3VycmVudC5hY3RpdmVDbGlwVXJsKTtcblx0ICAgICAgICB0aGlzLnN2Zy5hcHBlbmQoY2xpcEdyb3VwKTtcblx0ICAgICAgICB0aGlzLmN1cnJlbnQuY2xpcEdyb3VwID0gY2xpcEdyb3VwO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQuY2xpcEdyb3VwO1xuXHQgICAgfVxuXHQgICAgX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkge1xuXHQgICAgICBpZiAoIXRoaXMudGdycCkge1xuXHQgICAgICAgIHRoaXMudGdycCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmdcIik7XG5cdCAgICAgICAgdGhpcy50Z3JwLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIHBtKHRoaXMudHJhbnNmb3JtTWF0cml4KSk7XG5cdCAgICAgICAgaWYgKHRoaXMuY3VycmVudC5hY3RpdmVDbGlwVXJsKSB7XG5cdCAgICAgICAgICB0aGlzLl9lbnN1cmVDbGlwR3JvdXAoKS5hcHBlbmQodGhpcy50Z3JwKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5zdmcuYXBwZW5kKHRoaXMudGdycCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLnRncnA7XG5cdCAgICB9XG5cdCAgfTtcblx0fVxuXG5cdC8qKiovIH0pXG5cdC8qKioqKiovIFx0XSk7XG5cdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cdC8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuXHQvKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblx0LyoqKioqKi8gXHRcblx0LyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuXHQvKioqKioqLyBcdGZ1bmN0aW9uIF9fd19wZGZqc19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0LyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHQvKioqKioqLyBcdFx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdC8qKioqKiovIFx0XHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0LyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHQvKioqKioqLyBcdFx0fVxuXHQvKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0LyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHQvKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdC8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdC8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG5cdC8qKioqKiovIFx0XHR9O1xuXHQvKioqKioqLyBcdFxuXHQvKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdC8qKioqKiovIFx0XHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKTtcblx0LyoqKioqKi8gXHRcblx0LyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdC8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG5cdC8qKioqKiovIFx0fVxuXHQvKioqKioqLyBcdFxuXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXHR2YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IHt9O1xuXHQvLyBUaGlzIGVudHJ5IG5lZWQgdG8gYmUgd3JhcHBlZCBpbiBhbiBJSUZFIGJlY2F1c2UgaXQgbmVlZCB0byBiZSBpc29sYXRlZCBhZ2FpbnN0IG90aGVyIG1vZHVsZXMgaW4gdGhlIGNodW5rLlxuXHQoKCkgPT4ge1xuXHR2YXIgZXhwb3J0cyA9IF9fd2VicGFja19leHBvcnRzX187XG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYm9ydEV4Y2VwdGlvblwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuQWJvcnRFeGNlcHRpb247XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFubm90YXRpb25FZGl0b3JMYXllclwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2Fubm90YXRpb25fZWRpdG9yX2xheWVyLkFubm90YXRpb25FZGl0b3JMYXllcjtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGVcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBbm5vdGF0aW9uRWRpdG9yVHlwZVwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGU7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXJcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF90b29scy5Bbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBbm5vdGF0aW9uTGF5ZXJcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9hbm5vdGF0aW9uX2xheWVyLkFubm90YXRpb25MYXllcjtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQW5ub3RhdGlvbk1vZGVcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLkFubm90YXRpb25Nb2RlO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDTWFwQ29tcHJlc3Npb25UeXBlXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5DTWFwQ29tcHJlc3Npb25UeXBlO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJGZWF0dXJlVGVzdFwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuRmVhdHVyZVRlc3Q7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkdsb2JhbFdvcmtlck9wdGlvbnNcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJJbnZhbGlkUERGRXhjZXB0aW9uXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5JbnZhbGlkUERGRXhjZXB0aW9uO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJPUFNcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLk9QUztcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUERGRGF0YVJhbmdlVHJhbnNwb3J0XCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfYXBpLlBERkRhdGFSYW5nZVRyYW5zcG9ydDtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUERGRGF0ZVN0cmluZ1wiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuUERGRGF0ZVN0cmluZztcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUERGV29ya2VyXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfYXBpLlBERldvcmtlcjtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUGFzc3dvcmRSZXNwb25zZXNcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLlBhc3N3b3JkUmVzcG9uc2VzO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQZXJtaXNzaW9uRmxhZ1wiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuUGVybWlzc2lvbkZsYWc7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBpeGVsc1BlckluY2hcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLlBpeGVsc1BlckluY2g7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb21pc2VDYXBhYmlsaXR5XCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eTtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfZGlzcGxheV91dGlscy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb247XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNWR0dyYXBoaWNzXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfc3ZnLlNWR0dyYXBoaWNzO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVXRpbFwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuVXRpbDtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVmVyYm9zaXR5TGV2ZWxcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLlZlcmJvc2l0eUxldmVsO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJYZmFMYXllclwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3hmYV9sYXllci5YZmFMYXllcjtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYnVpbGRcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9hcGkuYnVpbGQ7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNyZWF0ZVZhbGlkQWJzb2x1dGVVcmxcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmw7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldERvY3VtZW50XCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfYXBpLmdldERvY3VtZW50O1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZXRGaWxlbmFtZUZyb21VcmxcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLmdldEZpbGVuYW1lRnJvbVVybDtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0UGRmRmlsZW5hbWVGcm9tVXJsXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfZGlzcGxheV91dGlscy5nZXRQZGZGaWxlbmFtZUZyb21Vcmw7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldFhmYVBhZ2VWaWV3cG9ydFwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuZ2V0WGZhUGFnZVZpZXdwb3J0O1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc0RhdGFTY2hlbWVcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLmlzRGF0YVNjaGVtZTtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiaXNQZGZGaWxlXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfZGlzcGxheV91dGlscy5pc1BkZkZpbGU7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxvYWRTY3JpcHRcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLmxvYWRTY3JpcHQ7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm5vcm1hbGl6ZVVuaWNvZGVcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLm5vcm1hbGl6ZVVuaWNvZGU7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJlbmRlclRleHRMYXllclwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3RleHRfbGF5ZXIucmVuZGVyVGV4dExheWVyO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzZXRMYXllckRpbWVuc2lvbnNcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLnNldExheWVyRGltZW5zaW9ucztcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2hhZG93XCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5zaGFkb3c7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInVwZGF0ZVRleHRMYXllclwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3RleHRfbGF5ZXIudXBkYXRlVGV4dExheWVyO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ2ZXJzaW9uXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfYXBpLnZlcnNpb247XG5cdCAgfVxuXHR9KSk7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfYXBpID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTtcblx0dmFyIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTtcblx0dmFyIF90ZXh0X2xheWVyID0gX193X3BkZmpzX3JlcXVpcmVfXygyNik7XG5cdHZhciBfYW5ub3RhdGlvbl9lZGl0b3JfbGF5ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI3KTtcblx0dmFyIF90b29scyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7XG5cdHZhciBfYW5ub3RhdGlvbl9sYXllciA9IF9fd19wZGZqc19yZXF1aXJlX18oMzIpO1xuXHR2YXIgX3dvcmtlcl9vcHRpb25zID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7XG5cdHZhciBfc3ZnID0gX193X3BkZmpzX3JlcXVpcmVfXygzNSk7XG5cdHZhciBfeGZhX2xheWVyID0gX193X3BkZmpzX3JlcXVpcmVfXygzNCk7XG5cdH0pKCk7XG5cblx0LyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX2V4cG9ydHNfXztcblx0LyoqKioqKi8gfSkoKVxuXHQ7XG5cdH0pO1xuXHRcbn0gKHBkZiQyKSk7XG5cbnZhciBwZGZFeHBvcnRzID0gcGRmJDIuZXhwb3J0cztcblxuY29uc3QgcGRmID0gcGRmRXhwb3J0cztcbnZhciBwZGZfMSA9IHBkZjtcblxudmFyIHBkZiQxID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHBkZl8xKTtcblxuZXhwb3J0IHsgcGRmJDEgYXMgZGVmYXVsdCB9O1xuIiwgImV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuNDIuMCc7IC8vIHgtcmVsZWFzZS1wbGVhc2UtdmVyc2lvblxuIiwgIi8qKlxuICogRGlzY2xhaW1lcjogbW9kdWxlcyBpbiBfc2hpbXMgYXJlbid0IGludGVuZGVkIHRvIGJlIGltcG9ydGVkIGJ5IFNESyB1c2Vycy5cbiAqL1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNoaW1zIHtcbiAga2luZDogc3RyaW5nO1xuICBmZXRjaDogYW55O1xuICBSZXF1ZXN0OiBhbnk7XG4gIFJlc3BvbnNlOiBhbnk7XG4gIEhlYWRlcnM6IGFueTtcbiAgRm9ybURhdGE6IGFueTtcbiAgQmxvYjogYW55O1xuICBGaWxlOiBhbnk7XG4gIFJlYWRhYmxlU3RyZWFtOiBhbnk7XG4gIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zOiA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+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/IFtdO1xuICB9XG5cbiAgLy8gQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBgbmV4dFBhZ2VJbmZvKClgIGluc3RlYWRcbiAgbmV4dFBhZ2VQYXJhbXMoKTogUGFydGlhbDxDdXJzb3JQYWdlUGFyYW1zPiB8IG51bGwge1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLm5leHRQYWdlSW5mbygpO1xuICAgIGlmICghaW5mbykgcmV0dXJuIG51bGw7XG4gICAgaWYgKCdwYXJhbXMnIGluIGluZm8pIHJldHVybiBpbmZvLnBhcmFtcztcbiAgICBjb25zdCBwYXJhbXMgPSBPYmplY3QuZnJvbUVudHJpZXMoaW5mby51cmwuc2VhcmNoUGFyYW1zKTtcbiAgICBpZiAoIU9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgbmV4dFBhZ2VJbmZvKCk6IFBhZ2VJbmZvIHwgbnVsbCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGFnaW5hdGVkSXRlbXMoKTtcbiAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXT8uaWQ7XG4gICAgaWYgKCFpZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGFyYW1zOiB7IGFmdGVyOiBpZCB9IH07XG4gIH1cbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgdHlwZSB7IE9wZW5BSSB9IGZyb20gJy4vaW5kZXgnO1xuXG5leHBvcnQgY2xhc3MgQVBJUmVzb3VyY2Uge1xuICBwcm90ZWN0ZWQgX2NsaWVudDogT3BlbkFJO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogT3BlbkFJKSB7XG4gICAgdGhpcy5fY2xpZW50ID0gY2xpZW50O1xuICB9XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUHJvbWlzZSB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgQ2hhdENvbXBsZXRpb25zQVBJIGZyb20gXCIuL2NvbXBsZXRpb25zXCI7XG5pbXBvcnQgKiBhcyBDb21wbGV0aW9uc0FQSSBmcm9tIFwiLi4vY29tcGxldGlvbnNcIjtcbmltcG9ydCAqIGFzIFNoYXJlZCBmcm9tIFwiLi4vc2hhcmVkXCI7XG5pbXBvcnQgKiBhcyBDaGF0QVBJIGZyb20gXCIuL2NoYXRcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuLi8uLi9zdHJlYW1pbmdcIjtcblxuZXhwb3J0IGNsYXNzIENvbXBsZXRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG1vZGVsIHJlc3BvbnNlIGZvciB0aGUgZ2l2ZW4gY2hhdCBjb252ZXJzYXRpb24uXG4gICAqL1xuICBjcmVhdGUoXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8Q2hhdENvbXBsZXRpb24+O1xuICBjcmVhdGUoXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+PjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08Q2hhdENvbXBsZXRpb25DaHVuaz4gfCBDaGF0Q29tcGxldGlvbj47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4gfCBBUElQcm9taXNlPFN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2NoYXQvY29tcGxldGlvbnMnLCB7IGJvZHksIC4uLm9wdGlvbnMsIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UgfSkgYXNcbiAgICAgIHwgQVBJUHJvbWlzZTxDaGF0Q29tcGxldGlvbj5cbiAgICAgIHwgQVBJUHJvbWlzZTxTdHJlYW08Q2hhdENvbXBsZXRpb25DaHVuaz4+O1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNoYXQgY29tcGxldGlvbiByZXNwb25zZSByZXR1cm5lZCBieSBtb2RlbCwgYmFzZWQgb24gdGhlIHByb3ZpZGVkXG4gKiBpbnB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbiB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2hhdCBjb21wbGV0aW9uLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGNoYXQgY29tcGxldGlvbiBjaG9pY2VzLiBDYW4gYmUgbW9yZSB0aGFuIG9uZSBpZiBgbmAgaXMgZ3JlYXRlclxuICAgKiB0aGFuIDEuXG4gICAqL1xuICBjaG9pY2VzOiBBcnJheTxDaGF0Q29tcGxldGlvbi5DaG9pY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIG9mIHdoZW4gdGhlIGNoYXQgY29tcGxldGlvbiB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHVzZWQgZm9yIHRoZSBjaGF0IGNvbXBsZXRpb24uXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgY2hhdC5jb21wbGV0aW9uYC5cbiAgICovXG4gIG9iamVjdDogJ2NoYXQuY29tcGxldGlvbic7XG5cbiAgLyoqXG4gICAqIFRoaXMgZmluZ2VycHJpbnQgcmVwcmVzZW50cyB0aGUgYmFja2VuZCBjb25maWd1cmF0aW9uIHRoYXQgdGhlIG1vZGVsIHJ1bnMgd2l0aC5cbiAgICpcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHNlZWRgIHJlcXVlc3QgcGFyYW1ldGVyIHRvIHVuZGVyc3RhbmQgd2hlblxuICAgKiBiYWNrZW5kIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdGhhdCBtaWdodCBpbXBhY3QgZGV0ZXJtaW5pc20uXG4gICAqL1xuICBzeXN0ZW1fZmluZ2VycHJpbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzYWdlIHN0YXRpc3RpY3MgZm9yIHRoZSBjb21wbGV0aW9uIHJlcXVlc3QuXG4gICAqL1xuICB1c2FnZT86IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25Vc2FnZTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoZSBtb2RlbCBzdG9wcGVkIGdlbmVyYXRpbmcgdG9rZW5zLiBUaGlzIHdpbGwgYmUgYHN0b3BgIGlmIHRoZSBtb2RlbFxuICAgICAqIGhpdCBhIG5hdHVyYWwgc3RvcCBwb2ludCBvciBhIHByb3ZpZGVkIHN0b3Agc2VxdWVuY2UsIGBsZW5ndGhgIGlmIHRoZSBtYXhpbXVtXG4gICAgICogbnVtYmVyIG9mIHRva2VucyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIHJlYWNoZWQsIGBjb250ZW50X2ZpbHRlcmAgaWZcbiAgICAgKiBjb250ZW50IHdhcyBvbWl0dGVkIGR1ZSB0byBhIGZsYWcgZnJvbSBvdXIgY29udGVudCBmaWx0ZXJzLCBgdG9vbF9jYWxsc2AgaWYgdGhlXG4gICAgICogbW9kZWwgY2FsbGVkIGEgdG9vbCwgb3IgYGZ1bmN0aW9uX2NhbGxgIChkZXByZWNhdGVkKSBpZiB0aGUgbW9kZWwgY2FsbGVkIGFcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmaW5pc2hfcmVhc29uOiAnc3RvcCcgfCAnbGVuZ3RoJyB8ICd0b29sX2NhbGxzJyB8ICdjb250ZW50X2ZpbHRlcicgfCAnZnVuY3Rpb25fY2FsbCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNob2ljZSBpbiB0aGUgbGlzdCBvZiBjaG9pY2VzLlxuICAgICAqL1xuICAgIGluZGV4OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBMb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjaG9pY2UuXG4gICAgICovXG4gICAgbG9ncHJvYnM6IENob2ljZS5Mb2dwcm9icyB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBIGNoYXQgY29tcGxldGlvbiBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAgICovXG4gICAgbWVzc2FnZTogQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZTtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQ2hvaWNlIHtcbiAgICAvKipcbiAgICAgKiBMb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjaG9pY2UuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBMb2dwcm9icyB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBtZXNzYWdlIGNvbnRlbnQgdG9rZW5zIHdpdGggbG9nIHByb2JhYmlsaXR5IGluZm9ybWF0aW9uLlxuICAgICAgICovXG4gICAgICBjb250ZW50OiBBcnJheTxDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2I+IHwgbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYGFzc2lzdGFudGAuXG4gICAqL1xuICByb2xlOiAnYXNzaXN0YW50JztcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBhc3Npc3RhbnQgbWVzc2FnZS4gUmVxdWlyZWQgdW5sZXNzIGB0b29sX2NhbGxzYCBvclxuICAgKiBgZnVuY3Rpb25fY2FsbGAgaXMgc3BlY2lmaWVkLlxuICAgKi9cbiAgY29udGVudD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAqL1xuICBmdW5jdGlvbl9jYWxsPzogQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW0uRnVuY3Rpb25DYWxsO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcGFydGljaXBhbnQuIFByb3ZpZGVzIHRoZSBtb2RlbCBpbmZvcm1hdGlvbiB0b1xuICAgKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcGFydGljaXBhbnRzIG9mIHRoZSBzYW1lIHJvbGUuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdG9vbCBjYWxscyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLCBzdWNoIGFzIGZ1bmN0aW9uIGNhbGxzLlxuICAgKi9cbiAgdG9vbF9jYWxscz86IEFycmF5PENoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAqIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkNhbGwge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBpbiBKU09OXG4gICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICogYXJndW1lbnRzIGluIHlvdXIgY29kZSBiZWZvcmUgY2FsbGluZyB5b3VyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGFyZ3VtZW50czogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN0cmVhbWVkIGNodW5rIG9mIGEgY2hhdCBjb21wbGV0aW9uIHJlc3BvbnNlIHJldHVybmVkIGJ5IG1vZGVsLFxuICogYmFzZWQgb24gdGhlIHByb3ZpZGVkIGlucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ2h1bmsge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNoYXQgY29tcGxldGlvbi4gRWFjaCBjaHVuayBoYXMgdGhlIHNhbWUgSUQuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY2hhdCBjb21wbGV0aW9uIGNob2ljZXMuIENhbiBjb250YWluIG1vcmUgdGhhbiBvbmUgZWxlbWVudHMgaWYgYG5gIGlzXG4gICAqIGdyZWF0ZXIgdGhhbiAxLiBDYW4gYWxzbyBiZSBlbXB0eSBmb3IgdGhlIGxhc3QgY2h1bmsgaWYgeW91IHNldFxuICAgKiBgc3RyZWFtX29wdGlvbnM6IHtcImluY2x1ZGVfdXNhZ2VcIjogdHJ1ZX1gLlxuICAgKi9cbiAgY2hvaWNlczogQXJyYXk8Q2hhdENvbXBsZXRpb25DaHVuay5DaG9pY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIG9mIHdoZW4gdGhlIGNoYXQgY29tcGxldGlvbiB3YXMgY3JlYXRlZC4gRWFjaFxuICAgKiBjaHVuayBoYXMgdGhlIHNhbWUgdGltZXN0YW1wLlxuICAgKi9cbiAgY3JlYXRlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gZ2VuZXJhdGUgdGhlIGNvbXBsZXRpb24uXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgY2hhdC5jb21wbGV0aW9uLmNodW5rYC5cbiAgICovXG4gIG9iamVjdDogJ2NoYXQuY29tcGxldGlvbi5jaHVuayc7XG5cbiAgLyoqXG4gICAqIFRoaXMgZmluZ2VycHJpbnQgcmVwcmVzZW50cyB0aGUgYmFja2VuZCBjb25maWd1cmF0aW9uIHRoYXQgdGhlIG1vZGVsIHJ1bnMgd2l0aC5cbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHNlZWRgIHJlcXVlc3QgcGFyYW1ldGVyIHRvIHVuZGVyc3RhbmQgd2hlblxuICAgKiBiYWNrZW5kIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdGhhdCBtaWdodCBpbXBhY3QgZGV0ZXJtaW5pc20uXG4gICAqL1xuICBzeXN0ZW1fZmluZ2VycHJpbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGZpZWxkIHRoYXQgd2lsbCBvbmx5IGJlIHByZXNlbnQgd2hlbiB5b3Ugc2V0XG4gICAqIGBzdHJlYW1fb3B0aW9uczoge1wiaW5jbHVkZV91c2FnZVwiOiB0cnVlfWAgaW4geW91ciByZXF1ZXN0LiBXaGVuIHByZXNlbnQsIGl0XG4gICAqIGNvbnRhaW5zIGEgbnVsbCB2YWx1ZSBleGNlcHQgZm9yIHRoZSBsYXN0IGNodW5rIHdoaWNoIGNvbnRhaW5zIHRoZSB0b2tlbiB1c2FnZVxuICAgKiBzdGF0aXN0aWNzIGZvciB0aGUgZW50aXJlIHJlcXVlc3QuXG4gICAqL1xuICB1c2FnZT86IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25Vc2FnZTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbkNodW5rIHtcbiAgZXhwb3J0IGludGVyZmFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIGRlbHRhIGdlbmVyYXRlZCBieSBzdHJlYW1lZCBtb2RlbCByZXNwb25zZXMuXG4gICAgICovXG4gICAgZGVsdGE6IENob2ljZS5EZWx0YTtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gdGhlIG1vZGVsIHN0b3BwZWQgZ2VuZXJhdGluZyB0b2tlbnMuIFRoaXMgd2lsbCBiZSBgc3RvcGAgaWYgdGhlIG1vZGVsXG4gICAgICogaGl0IGEgbmF0dXJhbCBzdG9wIHBvaW50IG9yIGEgcHJvdmlkZWQgc3RvcCBzZXF1ZW5jZSwgYGxlbmd0aGAgaWYgdGhlIG1heGltdW1cbiAgICAgKiBudW1iZXIgb2YgdG9rZW5zIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgcmVhY2hlZCwgYGNvbnRlbnRfZmlsdGVyYCBpZlxuICAgICAqIGNvbnRlbnQgd2FzIG9taXR0ZWQgZHVlIHRvIGEgZmxhZyBmcm9tIG91ciBjb250ZW50IGZpbHRlcnMsIGB0b29sX2NhbGxzYCBpZiB0aGVcbiAgICAgKiBtb2RlbCBjYWxsZWQgYSB0b29sLCBvciBgZnVuY3Rpb25fY2FsbGAgKGRlcHJlY2F0ZWQpIGlmIHRoZSBtb2RlbCBjYWxsZWQgYVxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZpbmlzaF9yZWFzb246ICdzdG9wJyB8ICdsZW5ndGgnIHwgJ3Rvb2xfY2FsbHMnIHwgJ2NvbnRlbnRfZmlsdGVyJyB8ICdmdW5jdGlvbl9jYWxsJyB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNob2ljZSBpbiB0aGUgbGlzdCBvZiBjaG9pY2VzLlxuICAgICAqL1xuICAgIGluZGV4OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBMb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24gZm9yIHRoZSBjaG9pY2UuXG4gICAgICovXG4gICAgbG9ncHJvYnM/OiBDaG9pY2UuTG9ncHJvYnMgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIGRlbHRhIGdlbmVyYXRlZCBieSBzdHJlYW1lZCBtb2RlbCByZXNwb25zZXMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBEZWx0YSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjb250ZW50cyBvZiB0aGUgY2h1bmsgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgY29udGVudD86IHN0cmluZyB8IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogQGRlcHJlY2F0ZWQ6IERlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5IGB0b29sX2NhbGxzYC4gVGhlIG5hbWUgYW5kIGFyZ3VtZW50cyBvZlxuICAgICAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uX2NhbGw/OiBEZWx0YS5GdW5jdGlvbkNhbGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJvbGUgb2YgdGhlIGF1dGhvciBvZiB0aGlzIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIHJvbGU/OiAnc3lzdGVtJyB8ICd1c2VyJyB8ICdhc3Npc3RhbnQnIHwgJ3Rvb2wnO1xuXG4gICAgICB0b29sX2NhbGxzPzogQXJyYXk8RGVsdGEuVG9vbENhbGw+O1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgRGVsdGEge1xuICAgICAgLyoqXG4gICAgICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAgICAgKiBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkNhbGwge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICAgICAqIGhhbGx1Y2luYXRlIHBhcmFtZXRlcnMgbm90IGRlZmluZWQgYnkgeW91ciBmdW5jdGlvbiBzY2hlbWEuIFZhbGlkYXRlIHRoZVxuICAgICAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGludGVyZmFjZSBUb29sQ2FsbCB7XG4gICAgICAgIGluZGV4OiBudW1iZXI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgaWQ/OiBzdHJpbmc7XG5cbiAgICAgICAgZnVuY3Rpb24/OiBUb29sQ2FsbC5GdW5jdGlvbjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIEN1cnJlbnRseSwgb25seSBgZnVuY3Rpb25gIGlzIHN1cHBvcnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHR5cGU/OiAnZnVuY3Rpb24nO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgbmFtZXNwYWNlIFRvb2xDYWxsIHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgICAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgICAgICAgKiBoYWxsdWNpbmF0ZSBwYXJhbWV0ZXJzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgZnVuY3Rpb24gc2NoZW1hLiBWYWxpZGF0ZSB0aGVcbiAgICAgICAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICAgICAgICovXG4gICAgICAgICAgYXJndW1lbnRzPzogc3RyaW5nO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICAgICAgICovXG4gICAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNob2ljZS5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIExvZ3Byb2JzIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIG1lc3NhZ2UgY29udGVudCB0b2tlbnMgd2l0aCBsb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24uXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnQ6IEFycmF5PENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYj4gfCBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0ID0gQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQgfCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2U7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlIHtcbiAgaW1hZ2VfdXJsOiBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2UuSW1hZ2VVUkw7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBjb250ZW50IHBhcnQuXG4gICAqL1xuICB0eXBlOiAnaW1hZ2VfdXJsJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2Uge1xuICBleHBvcnQgaW50ZXJmYWNlIEltYWdlVVJMIHtcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSBVUkwgb2YgdGhlIGltYWdlIG9yIHRoZSBiYXNlNjQgZW5jb2RlZCBpbWFnZSBkYXRhLlxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBkZXRhaWwgbGV2ZWwgb2YgdGhlIGltYWdlLiBMZWFybiBtb3JlIGluIHRoZVxuICAgICAqIFtWaXNpb24gZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy92aXNpb24vbG93LW9yLWhpZ2gtZmlkZWxpdHktaW1hZ2UtdW5kZXJzdGFuZGluZykuXG4gICAgICovXG4gICAgZGV0YWlsPzogJ2F1dG8nIHwgJ2xvdycgfCAnaGlnaCc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBjb250ZW50LlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgY29udGVudCBwYXJ0LlxuICAgKi9cbiAgdHlwZTogJ3RleHQnO1xufVxuXG4vKipcbiAqIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHZpYSBge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9YCBmb3JjZXMgdGhlIG1vZGVsXG4gKiB0byBjYWxsIHRoYXQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb24ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgZnVuY3Rpb24gbWVzc2FnZS5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYGZ1bmN0aW9uYC5cbiAgICovXG4gIHJvbGU6ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQSBjaGF0IGNvbXBsZXRpb24gbWVzc2FnZSBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgYXV0aG9yIG9mIHRoaXMgbWVzc2FnZS5cbiAgICovXG4gIHJvbGU6ICdhc3Npc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAqIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgKi9cbiAgZnVuY3Rpb25fY2FsbD86IENoYXRDb21wbGV0aW9uTWVzc2FnZS5GdW5jdGlvbkNhbGw7XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIGNhbGxzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwsIHN1Y2ggYXMgZnVuY3Rpb24gY2FsbHMuXG4gICAqL1xuICB0b29sX2NhbGxzPzogQXJyYXk8Q2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAqIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkNhbGwge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBpbiBKU09OXG4gICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICogYXJndW1lbnRzIGluIHlvdXIgY29kZSBiZWZvcmUgY2FsbGluZyB5b3VyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGFyZ3VtZW50czogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtID1cbiAgfCBDaGF0Q29tcGxldGlvblN5c3RlbU1lc3NhZ2VQYXJhbVxuICB8IENoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbVxuICB8IENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtXG4gIHwgQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtXG4gIHwgQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbCB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IHRoZSBtb2RlbCBjYWxsZWQuXG4gICAqL1xuICBmdW5jdGlvbjogQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGwuRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSB0b29sLiBDdXJyZW50bHksIG9ubHkgYGZ1bmN0aW9uYCBpcyBzdXBwb3J0ZWQuXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IHRoZSBtb2RlbCBjYWxsZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgaW4gSlNPTlxuICAgICAqIGZvcm1hdC4gTm90ZSB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBhbHdheXMgZ2VuZXJhdGUgdmFsaWQgSlNPTiwgYW5kIG1heVxuICAgICAqIGhhbGx1Y2luYXRlIHBhcmFtZXRlcnMgbm90IGRlZmluZWQgYnkgeW91ciBmdW5jdGlvbiBzY2hlbWEuIFZhbGlkYXRlIHRoZVxuICAgICAqIGFyZ3VtZW50cyBpbiB5b3VyIGNvZGUgYmVmb3JlIGNhbGxpbmcgeW91ciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBhcmd1bWVudHM6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIFNwZWNpZmllcyBhIHRvb2wgdGhlIG1vZGVsIHNob3VsZCB1c2UuIFVzZSB0byBmb3JjZSB0aGUgbW9kZWwgdG8gY2FsbCBhIHNwZWNpZmljXG4gKiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZSB7XG4gIGZ1bmN0aW9uOiBDaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZS5GdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIEN1cnJlbnRseSwgb25seSBgZnVuY3Rpb25gIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIHR5cGU6ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2Uge1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcm9sZSBvZiB0aGUgYXV0aG9yIG9mIGEgbWVzc2FnZVxuICovXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblJvbGUgPSAnc3lzdGVtJyB8ICd1c2VyJyB8ICdhc3Npc3RhbnQnIHwgJ3Rvb2wnIHwgJ2Z1bmN0aW9uJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdHJlYW1pbmcgcmVzcG9uc2UuIE9ubHkgc2V0IHRoaXMgd2hlbiB5b3Ugc2V0IGBzdHJlYW06IHRydWVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiBzZXQsIGFuIGFkZGl0aW9uYWwgY2h1bmsgd2lsbCBiZSBzdHJlYW1lZCBiZWZvcmUgdGhlIGBkYXRhOiBbRE9ORV1gIG1lc3NhZ2UuXG4gICAqIFRoZSBgdXNhZ2VgIGZpZWxkIG9uIHRoaXMgY2h1bmsgc2hvd3MgdGhlIHRva2VuIHVzYWdlIHN0YXRpc3RpY3MgZm9yIHRoZSBlbnRpcmVcbiAgICogcmVxdWVzdCwgYW5kIHRoZSBgY2hvaWNlc2AgZmllbGQgd2lsbCBhbHdheXMgYmUgYW4gZW1wdHkgYXJyYXkuIEFsbCBvdGhlciBjaHVua3NcbiAgICogd2lsbCBhbHNvIGluY2x1ZGUgYSBgdXNhZ2VgIGZpZWxkLCBidXQgd2l0aCBhIG51bGwgdmFsdWUuXG4gICAqL1xuICBpbmNsdWRlX3VzYWdlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblN5c3RlbU1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHN5c3RlbSBtZXNzYWdlLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYHN5c3RlbWAuXG4gICAqL1xuICByb2xlOiAnc3lzdGVtJztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHBhcnRpY2lwYW50LiBQcm92aWRlcyB0aGUgbW9kZWwgaW5mb3JtYXRpb24gdG9cbiAgICogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHBhcnRpY2lwYW50cyBvZiB0aGUgc2FtZSByb2xlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYiB7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4uXG4gICAqL1xuICB0b2tlbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgaW50ZWdlcnMgcmVwcmVzZW50aW5nIHRoZSBVVEYtOCBieXRlcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdG9rZW4uXG4gICAqIFVzZWZ1bCBpbiBpbnN0YW5jZXMgd2hlcmUgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgbXVsdGlwbGUgdG9rZW5zIGFuZFxuICAgKiB0aGVpciBieXRlIHJlcHJlc2VudGF0aW9ucyBtdXN0IGJlIGNvbWJpbmVkIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IHRleHRcbiAgICogcmVwcmVzZW50YXRpb24uIENhbiBiZSBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gYnl0ZXMgcmVwcmVzZW50YXRpb24gZm9yIHRoZSB0b2tlbi5cbiAgICovXG4gIGJ5dGVzOiBBcnJheTxudW1iZXI+IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGxvZyBwcm9iYWJpbGl0eSBvZiB0aGlzIHRva2VuLCBpZiBpdCBpcyB3aXRoaW4gdGhlIHRvcCAyMCBtb3N0IGxpa2VseVxuICAgKiB0b2tlbnMuIE90aGVyd2lzZSwgdGhlIHZhbHVlIGAtOTk5OS4wYCBpcyB1c2VkIHRvIHNpZ25pZnkgdGhhdCB0aGUgdG9rZW4gaXMgdmVyeVxuICAgKiB1bmxpa2VseS5cbiAgICovXG4gIGxvZ3Byb2I6IG51bWJlcjtcblxuICAvKipcbiAgICogTGlzdCBvZiB0aGUgbW9zdCBsaWtlbHkgdG9rZW5zIGFuZCB0aGVpciBsb2cgcHJvYmFiaWxpdHksIGF0IHRoaXMgdG9rZW5cbiAgICogcG9zaXRpb24uIEluIHJhcmUgY2FzZXMsIHRoZXJlIG1heSBiZSBmZXdlciB0aGFuIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkXG4gICAqIGB0b3BfbG9ncHJvYnNgIHJldHVybmVkLlxuICAgKi9cbiAgdG9wX2xvZ3Byb2JzOiBBcnJheTxDaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYi5Ub3BMb2dwcm9iPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9wTG9ncHJvYiB7XG4gICAgLyoqXG4gICAgICogVGhlIHRva2VuLlxuICAgICAqL1xuICAgIHRva2VuOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgaW50ZWdlcnMgcmVwcmVzZW50aW5nIHRoZSBVVEYtOCBieXRlcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdG9rZW4uXG4gICAgICogVXNlZnVsIGluIGluc3RhbmNlcyB3aGVyZSBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSBtdWx0aXBsZSB0b2tlbnMgYW5kXG4gICAgICogdGhlaXIgYnl0ZSByZXByZXNlbnRhdGlvbnMgbXVzdCBiZSBjb21iaW5lZCB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCB0ZXh0XG4gICAgICogcmVwcmVzZW50YXRpb24uIENhbiBiZSBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gYnl0ZXMgcmVwcmVzZW50YXRpb24gZm9yIHRoZSB0b2tlbi5cbiAgICAgKi9cbiAgICBieXRlczogQXJyYXk8bnVtYmVyPiB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nIHByb2JhYmlsaXR5IG9mIHRoaXMgdG9rZW4sIGlmIGl0IGlzIHdpdGhpbiB0aGUgdG9wIDIwIG1vc3QgbGlrZWx5XG4gICAgICogdG9rZW5zLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBgLTk5OTkuMGAgaXMgdXNlZCB0byBzaWduaWZ5IHRoYXQgdGhlIHRva2VuIGlzIHZlcnlcbiAgICAgKiB1bmxpa2VseS5cbiAgICAgKi9cbiAgICBsb2dwcm9iOiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblRvb2wge1xuICBmdW5jdGlvbjogU2hhcmVkLkZ1bmN0aW9uRGVmaW5pdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIEN1cnJlbnRseSwgb25seSBgZnVuY3Rpb25gIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIHR5cGU6ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAqIG5vdCBjYWxsIGFueSB0b29sIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBtZWFucyB0aGUgbW9kZWwgY2FuXG4gKiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZSB0b29scy4gYHJlcXVpcmVkYCBtZWFuc1xuICogdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scy4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCB2aWFcbiAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gKiBjYWxsIHRoYXQgdG9vbC5cbiAqXG4gKiBgbm9uZWAgaXMgdGhlIGRlZmF1bHQgd2hlbiBubyB0b29scyBhcmUgcHJlc2VudC4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IGlmIHRvb2xzXG4gKiBhcmUgcHJlc2VudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uID0gJ25vbmUnIHwgJ2F1dG8nIHwgJ3JlcXVpcmVkJyB8IENoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHRvb2wgbWVzc2FnZS5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIG1lc3NhZ2VzIGF1dGhvciwgaW4gdGhpcyBjYXNlIGB0b29sYC5cbiAgICovXG4gIHJvbGU6ICd0b29sJztcblxuICAvKipcbiAgICogVG9vbCBjYWxsIHRoYXQgdGhpcyBtZXNzYWdlIGlzIHJlc3BvbmRpbmcgdG8uXG4gICAqL1xuICB0b29sX2NhbGxfaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW0ge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSB1c2VyIG1lc3NhZ2UuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmcgfCBBcnJheTxDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0PjtcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIG1lc3NhZ2VzIGF1dGhvciwgaW4gdGhpcyBjYXNlIGB1c2VyYC5cbiAgICovXG4gIHJvbGU6ICd1c2VyJztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHBhcnRpY2lwYW50LiBQcm92aWRlcyB0aGUgbW9kZWwgaW5mb3JtYXRpb24gdG9cbiAgICogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHBhcnRpY2lwYW50cyBvZiB0aGUgc2FtZSByb2xlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZUNoYXRDb21wbGV0aW9uUmVxdWVzdE1lc3NhZ2UgPSBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbTtcblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPVxuICB8IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nXG4gIHwgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBtZXNzYWdlcyBjb21wcmlzaW5nIHRoZSBjb252ZXJzYXRpb24gc28gZmFyLlxuICAgKiBbRXhhbXBsZSBQeXRob24gY29kZV0oaHR0cHM6Ly9jb29rYm9vay5vcGVuYWkuY29tL2V4YW1wbGVzL2hvd190b19mb3JtYXRfaW5wdXRzX3RvX2NoYXRncHRfbW9kZWxzKS5cbiAgICovXG4gIG1lc3NhZ2VzOiBBcnJheTxDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbT47XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFNlZSB0aGVcbiAgICogW21vZGVsIGVuZHBvaW50IGNvbXBhdGliaWxpdHldKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9tb2RlbC1lbmRwb2ludC1jb21wYXRpYmlsaXR5KVxuICAgKiB0YWJsZSBmb3IgZGV0YWlscyBvbiB3aGljaCBtb2RlbHMgd29yayB3aXRoIHRoZSBDaGF0IEFQSS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgQ2hhdEFQSS5DaGF0TW9kZWw7XG5cbiAgLyoqXG4gICAqIE51bWJlciBiZXR3ZWVuIC0yLjAgYW5kIDIuMC4gUG9zaXRpdmUgdmFsdWVzIHBlbmFsaXplIG5ldyB0b2tlbnMgYmFzZWQgb24gdGhlaXJcbiAgICogZXhpc3RpbmcgZnJlcXVlbmN5IGluIHRoZSB0ZXh0IHNvIGZhciwgZGVjcmVhc2luZyB0aGUgbW9kZWwncyBsaWtlbGlob29kIHRvXG4gICAqIHJlcGVhdCB0aGUgc2FtZSBsaW5lIHZlcmJhdGltLlxuICAgKlxuICAgKiBbU2VlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZnJlcXVlbmN5IGFuZCBwcmVzZW5jZSBwZW5hbHRpZXMuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvdGV4dC1nZW5lcmF0aW9uL3BhcmFtZXRlci1kZXRhaWxzKVxuICAgKi9cbiAgZnJlcXVlbmN5X3BlbmFsdHk/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIGB0b29sX2Nob2ljZWAuXG4gICAqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWxcbiAgICogd2lsbCBub3QgY2FsbCBhIGZ1bmN0aW9uIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBtZWFucyB0aGUgbW9kZWxcbiAgICogY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIGEgZnVuY3Rpb24uIFNwZWNpZnlpbmcgYVxuICAgKiBwYXJ0aWN1bGFyIGZ1bmN0aW9uIHZpYSBge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9YCBmb3JjZXMgdGhlIG1vZGVsIHRvIGNhbGwgdGhhdFxuICAgKiBmdW5jdGlvbi5cbiAgICpcbiAgICogYG5vbmVgIGlzIHRoZSBkZWZhdWx0IHdoZW4gbm8gZnVuY3Rpb25zIGFyZSBwcmVzZW50LiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgaWZcbiAgICogZnVuY3Rpb25zIGFyZSBwcmVzZW50LlxuICAgKi9cbiAgZnVuY3Rpb25fY2FsbD86ICdub25lJyB8ICdhdXRvJyB8IENoYXRDb21wbGV0aW9uRnVuY3Rpb25DYWxsT3B0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIGB0b29sc2AuXG4gICAqXG4gICAqIEEgbGlzdCBvZiBmdW5jdGlvbnMgdGhlIG1vZGVsIG1heSBnZW5lcmF0ZSBKU09OIGlucHV0cyBmb3IuXG4gICAqL1xuICBmdW5jdGlvbnM/OiBBcnJheTxDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcy5GdW5jdGlvbj47XG5cbiAgLyoqXG4gICAqIE1vZGlmeSB0aGUgbGlrZWxpaG9vZCBvZiBzcGVjaWZpZWQgdG9rZW5zIGFwcGVhcmluZyBpbiB0aGUgY29tcGxldGlvbi5cbiAgICpcbiAgICogQWNjZXB0cyBhIEpTT04gb2JqZWN0IHRoYXQgbWFwcyB0b2tlbnMgKHNwZWNpZmllZCBieSB0aGVpciB0b2tlbiBJRCBpbiB0aGVcbiAgICogdG9rZW5pemVyKSB0byBhbiBhc3NvY2lhdGVkIGJpYXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMC4gTWF0aGVtYXRpY2FsbHksIHRoZVxuICAgKiBiaWFzIGlzIGFkZGVkIHRvIHRoZSBsb2dpdHMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBwcmlvciB0byBzYW1wbGluZy4gVGhlIGV4YWN0XG4gICAqIGVmZmVjdCB3aWxsIHZhcnkgcGVyIG1vZGVsLCBidXQgdmFsdWVzIGJldHdlZW4gLTEgYW5kIDEgc2hvdWxkIGRlY3JlYXNlIG9yXG4gICAqIGluY3JlYXNlIGxpa2VsaWhvb2Qgb2Ygc2VsZWN0aW9uOyB2YWx1ZXMgbGlrZSAtMTAwIG9yIDEwMCBzaG91bGQgcmVzdWx0IGluIGEgYmFuXG4gICAqIG9yIGV4Y2x1c2l2ZSBzZWxlY3Rpb24gb2YgdGhlIHJlbGV2YW50IHRva2VuLlxuICAgKi9cbiAgbG9naXRfYmlhcz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJldHVybiBsb2cgcHJvYmFiaWxpdGllcyBvZiB0aGUgb3V0cHV0IHRva2VucyBvciBub3QuIElmIHRydWUsXG4gICAqIHJldHVybnMgdGhlIGxvZyBwcm9iYWJpbGl0aWVzIG9mIGVhY2ggb3V0cHV0IHRva2VuIHJldHVybmVkIGluIHRoZSBgY29udGVudGAgb2ZcbiAgICogYG1lc3NhZ2VgLlxuICAgKi9cbiAgbG9ncHJvYnM/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIFt0b2tlbnNdKC90b2tlbml6ZXIpIHRoYXQgY2FuIGJlIGdlbmVyYXRlZCBpbiB0aGUgY2hhdFxuICAgKiBjb21wbGV0aW9uLlxuICAgKlxuICAgKiBUaGUgdG90YWwgbGVuZ3RoIG9mIGlucHV0IHRva2VucyBhbmQgZ2VuZXJhdGVkIHRva2VucyBpcyBsaW1pdGVkIGJ5IHRoZSBtb2RlbCdzXG4gICAqIGNvbnRleHQgbGVuZ3RoLlxuICAgKiBbRXhhbXBsZSBQeXRob24gY29kZV0oaHR0cHM6Ly9jb29rYm9vay5vcGVuYWkuY29tL2V4YW1wbGVzL2hvd190b19jb3VudF90b2tlbnNfd2l0aF90aWt0b2tlbilcbiAgICogZm9yIGNvdW50aW5nIHRva2Vucy5cbiAgICovXG4gIG1heF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSBjaGF0IGNvbXBsZXRpb24gY2hvaWNlcyB0byBnZW5lcmF0ZSBmb3IgZWFjaCBpbnB1dCBtZXNzYWdlLiBOb3RlIHRoYXRcbiAgICogeW91IHdpbGwgYmUgY2hhcmdlZCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGdlbmVyYXRlZCB0b2tlbnMgYWNyb3NzIGFsbCBvZiB0aGVcbiAgICogY2hvaWNlcy4gS2VlcCBgbmAgYXMgYDFgIHRvIG1pbmltaXplIGNvc3RzLlxuICAgKi9cbiAgbj86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE51bWJlciBiZXR3ZWVuIC0yLjAgYW5kIDIuMC4gUG9zaXRpdmUgdmFsdWVzIHBlbmFsaXplIG5ldyB0b2tlbnMgYmFzZWQgb25cbiAgICogd2hldGhlciB0aGV5IGFwcGVhciBpbiB0aGUgdGV4dCBzbyBmYXIsIGluY3JlYXNpbmcgdGhlIG1vZGVsJ3MgbGlrZWxpaG9vZCB0b1xuICAgKiB0YWxrIGFib3V0IG5ldyB0b3BpY3MuXG4gICAqXG4gICAqIFtTZWUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmcmVxdWVuY3kgYW5kIHByZXNlbmNlIHBlbmFsdGllcy5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LWdlbmVyYXRpb24vcGFyYW1ldGVyLWRldGFpbHMpXG4gICAqL1xuICBwcmVzZW5jZV9wZW5hbHR5PzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LWFuZC1ncHQtNC10dXJibykgYW5kXG4gICAqIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBuZXdlciB0aGFuIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcy5SZXNwb25zZUZvcm1hdDtcblxuICAvKipcbiAgICogVGhpcyBmZWF0dXJlIGlzIGluIEJldGEuIElmIHNwZWNpZmllZCwgb3VyIHN5c3RlbSB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0b1xuICAgKiBzYW1wbGUgZGV0ZXJtaW5pc3RpY2FsbHksIHN1Y2ggdGhhdCByZXBlYXRlZCByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIGBzZWVkYCBhbmRcbiAgICogcGFyYW1ldGVycyBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4gRGV0ZXJtaW5pc20gaXMgbm90IGd1YXJhbnRlZWQsIGFuZCB5b3VcbiAgICogc2hvdWxkIHJlZmVyIHRvIHRoZSBgc3lzdGVtX2ZpbmdlcnByaW50YCByZXNwb25zZSBwYXJhbWV0ZXIgdG8gbW9uaXRvciBjaGFuZ2VzXG4gICAqIGluIHRoZSBiYWNrZW5kLlxuICAgKi9cbiAgc2VlZD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFVwIHRvIDQgc2VxdWVuY2VzIHdoZXJlIHRoZSBBUEkgd2lsbCBzdG9wIGdlbmVyYXRpbmcgZnVydGhlciB0b2tlbnMuXG4gICAqL1xuICBzdG9wPzogc3RyaW5nIHwgbnVsbCB8IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIElmIHNldCwgcGFydGlhbCBtZXNzYWdlIGRlbHRhcyB3aWxsIGJlIHNlbnQsIGxpa2UgaW4gQ2hhdEdQVC4gVG9rZW5zIHdpbGwgYmVcbiAgICogc2VudCBhcyBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3Igc3RyZWFtaW5nIHJlc3BvbnNlLiBPbmx5IHNldCB0aGlzIHdoZW4geW91IHNldCBgc3RyZWFtOiB0cnVlYC5cbiAgICovXG4gIHN0cmVhbV9vcHRpb25zPzogQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciBgdG9wX3BgIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2wgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIG1lYW5zIHRoZSBtb2RlbCBjYW5cbiAgICogcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmUgdG9vbHMuIGByZXF1aXJlZGAgbWVhbnNcbiAgICogdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scy4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCB2aWFcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqXG4gICAqIGBub25lYCBpcyB0aGUgZGVmYXVsdCB3aGVuIG5vIHRvb2xzIGFyZSBwcmVzZW50LiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgaWYgdG9vbHNcbiAgICogYXJlIHByZXNlbnQuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IENoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRvb2xzIHRoZSBtb2RlbCBtYXkgY2FsbC4gQ3VycmVudGx5LCBvbmx5IGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkIGFzIGFcbiAgICogdG9vbC4gVXNlIHRoaXMgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRoZSBtb2RlbCBtYXkgZ2VuZXJhdGUgSlNPTiBpbnB1dHNcbiAgICogZm9yLiBBIG1heCBvZiAxMjggZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAqL1xuICB0b29scz86IEFycmF5PENoYXRDb21wbGV0aW9uVG9vbD47XG5cbiAgLyoqXG4gICAqIEFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAyMCBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgbW9zdCBsaWtlbHkgdG9rZW5zIHRvXG4gICAqIHJldHVybiBhdCBlYWNoIHRva2VuIHBvc2l0aW9uLCBlYWNoIHdpdGggYW4gYXNzb2NpYXRlZCBsb2cgcHJvYmFiaWxpdHkuXG4gICAqIGBsb2dwcm9ic2AgbXVzdCBiZSBzZXQgdG8gYHRydWVgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIHVzZWQuXG4gICAqL1xuICB0b3BfbG9ncHJvYnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciBgdGVtcGVyYXR1cmVgIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgeW91ciBlbmQtdXNlciwgd2hpY2ggY2FuIGhlbHAgT3BlbkFJIHRvIG1vbml0b3JcbiAgICogYW5kIGRldGVjdCBhYnVzZS5cbiAgICogW0xlYXJuIG1vcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9zYWZldHktYmVzdC1wcmFjdGljZXMvZW5kLXVzZXItaWRzKS5cbiAgICovXG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIE11c3QgYmUgYS16LCBBLVosIDAtOSwgb3IgY29udGFpblxuICAgICAqIHVuZGVyc2NvcmVzIGFuZCBkYXNoZXMsIHdpdGggYSBtYXhpbXVtIGxlbmd0aCBvZiA2NC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGNob29zZSB3aGVuIGFuZFxuICAgICAqIGhvdyB0byBjYWxsIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBwYXJhbWV0ZXJzIHRoZSBmdW5jdGlvbnMgYWNjZXB0cywgZGVzY3JpYmVkIGFzIGEgSlNPTiBTY2hlbWEgb2JqZWN0LiBTZWUgdGhlXG4gICAgICogW2d1aWRlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvdGV4dC1nZW5lcmF0aW9uL2Z1bmN0aW9uLWNhbGxpbmcpXG4gICAgICogZm9yIGV4YW1wbGVzLCBhbmQgdGhlXG4gICAgICogW0pTT04gU2NoZW1hIHJlZmVyZW5jZV0oaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvdW5kZXJzdGFuZGluZy1qc29uLXNjaGVtYS8pIGZvclxuICAgICAqIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIGZvcm1hdC5cbiAgICAgKlxuICAgICAqIE9taXR0aW5nIGBwYXJhbWV0ZXJzYCBkZWZpbmVzIGEgZnVuY3Rpb24gd2l0aCBhbiBlbXB0eSBwYXJhbWV0ZXIgbGlzdC5cbiAgICAgKi9cbiAgICBwYXJhbWV0ZXJzPzogU2hhcmVkLkZ1bmN0aW9uUGFyYW1ldGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIG5ld2VyIHRoYW4gYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VGb3JtYXQge1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgb25lIG9mIGB0ZXh0YCBvciBganNvbl9vYmplY3RgLlxuICAgICAqL1xuICAgIHR5cGU/OiAndGV4dCcgfCAnanNvbl9vYmplY3QnO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPVxuICAgIENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zIGluc3RlYWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nIGV4dGVuZHMgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIHNldCwgcGFydGlhbCBtZXNzYWdlIGRlbHRhcyB3aWxsIGJlIHNlbnQsIGxpa2UgaW4gQ2hhdEdQVC4gVG9rZW5zIHdpbGwgYmVcbiAgICogc2VudCBhcyBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW0/OiBmYWxzZSB8IG51bGw7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nIGluc3RlYWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nIGV4dGVuZHMgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIHNldCwgcGFydGlhbCBtZXNzYWdlIGRlbHRhcyB3aWxsIGJlIHNlbnQsIGxpa2UgaW4gQ2hhdEdQVC4gVG9rZW5zIHdpbGwgYmVcbiAgICogc2VudCBhcyBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW06IHRydWU7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nIGluc3RlYWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuXG5leHBvcnQgbmFtZXNwYWNlIENvbXBsZXRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbiA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNodW5rID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ2h1bms7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydCA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0O1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb24gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGwgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2UgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Sb2xlID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uUm9sZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblN0cmVhbU9wdGlvbnMgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbCA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW0gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW07XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkXG4gICAqL1xuICBleHBvcnQgaW1wb3J0IENyZWF0ZUNoYXRDb21wbGV0aW9uUmVxdWVzdE1lc3NhZ2UgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ3JlYXRlQ2hhdENvbXBsZXRpb25SZXF1ZXN0TWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ2hhdENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgQ2hhdEFQSSBmcm9tIFwiLi9jaGF0XCI7XG5pbXBvcnQgKiBhcyBDb21wbGV0aW9uc0FQSSBmcm9tIFwiLi9jb21wbGV0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhdCBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zID0gbmV3IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCB0eXBlIENoYXRNb2RlbCA9XG4gIHwgJ2dwdC00LXR1cmJvJ1xuICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gIHwgJ2dwdC00J1xuICB8ICdncHQtNC0wMzE0J1xuICB8ICdncHQtNC0wNjEzJ1xuICB8ICdncHQtNC0zMmsnXG4gIHwgJ2dwdC00LTMyay0wMzE0J1xuICB8ICdncHQtNC0zMmstMDYxMydcbiAgfCAnZ3B0LTMuNS10dXJibydcbiAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gIHwgJ2dwdC0zLjUtdHVyYm8tMDMwMSdcbiAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMyc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdCB7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdE1vZGVsID0gQ2hhdEFQSS5DaGF0TW9kZWw7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbnMgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbiA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DaHVuayA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ2h1bms7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydCA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ29udGVudFBhcnQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRUZXh0ID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb24gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2UgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbCA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Sb2xlID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Sb2xlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucyA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblN5c3RlbU1lc3NhZ2VQYXJhbSA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2I7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub29sO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbiA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtO1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZFxuICAgKi9cbiAgZXhwb3J0IGltcG9ydCBDcmVhdGVDaGF0Q29tcGxldGlvblJlcXVlc3RNZXNzYWdlID0gQ29tcGxldGlvbnNBUEkuQ3JlYXRlQ2hhdENvbXBsZXRpb25SZXF1ZXN0TWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgdHlwZSBSZXNwb25zZSB9IGZyb20gXCIuLi8uLi9fc2hpbXMvaW5kZXhcIjtcbmltcG9ydCAqIGFzIFNwZWVjaEFQSSBmcm9tIFwiLi9zcGVlY2hcIjtcblxuZXhwb3J0IGNsYXNzIFNwZWVjaCBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhdWRpbyBmcm9tIHRoZSBpbnB1dCB0ZXh0LlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IFNwZWVjaENyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9hdWRpby9zcGVlY2gnLCB7IGJvZHksIC4uLm9wdGlvbnMsIF9fYmluYXJ5UmVzcG9uc2U6IHRydWUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTcGVlY2hDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHRleHQgdG8gZ2VuZXJhdGUgYXVkaW8gZm9yLiBUaGUgbWF4aW11bSBsZW5ndGggaXMgNDA5NiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgaW5wdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogT25lIG9mIHRoZSBhdmFpbGFibGUgW1RUUyBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy90dHMpOlxuICAgKiBgdHRzLTFgIG9yIGB0dHMtMS1oZGBcbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ3R0cy0xJyB8ICd0dHMtMS1oZCc7XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBhdWRpby4gU3VwcG9ydGVkIHZvaWNlcyBhcmUgYGFsbG95YCxcbiAgICogYGVjaG9gLCBgZmFibGVgLCBgb255eGAsIGBub3ZhYCwgYW5kIGBzaGltbWVyYC4gUHJldmlld3Mgb2YgdGhlIHZvaWNlcyBhcmVcbiAgICogYXZhaWxhYmxlIGluIHRoZVxuICAgKiBbVGV4dCB0byBzcGVlY2ggZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LXRvLXNwZWVjaC92b2ljZS1vcHRpb25zKS5cbiAgICovXG4gIHZvaWNlOiAnYWxsb3knIHwgJ2VjaG8nIHwgJ2ZhYmxlJyB8ICdvbnl4JyB8ICdub3ZhJyB8ICdzaGltbWVyJztcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCB0byBhdWRpbyBpbi4gU3VwcG9ydGVkIGZvcm1hdHMgYXJlIGBtcDNgLCBgb3B1c2AsIGBhYWNgLCBgZmxhY2AsXG4gICAqIGB3YXZgLCBhbmQgYHBjbWAuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiAnbXAzJyB8ICdvcHVzJyB8ICdhYWMnIHwgJ2ZsYWMnIHwgJ3dhdicgfCAncGNtJztcblxuICAvKipcbiAgICogVGhlIHNwZWVkIG9mIHRoZSBnZW5lcmF0ZWQgYXVkaW8uIFNlbGVjdCBhIHZhbHVlIGZyb20gYDAuMjVgIHRvIGA0LjBgLiBgMS4wYCBpc1xuICAgKiB0aGUgZGVmYXVsdC5cbiAgICovXG4gIHNwZWVkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFNwZWVjaCB7XG4gIGV4cG9ydCBpbXBvcnQgU3BlZWNoQ3JlYXRlUGFyYW1zID0gU3BlZWNoQVBJLlNwZWVjaENyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgVHJhbnNjcmlwdGlvbnNBUEkgZnJvbSBcIi4vdHJhbnNjcmlwdGlvbnNcIjtcbmltcG9ydCB7IHR5cGUgVXBsb2FkYWJsZSwgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFRyYW5zY3JpcHRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVHJhbnNjcmliZXMgYXVkaW8gaW50byB0aGUgaW5wdXQgbGFuZ3VhZ2UuXG4gICAqL1xuICBjcmVhdGUoYm9keTogVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VHJhbnNjcmlwdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2F1ZGlvL3RyYW5zY3JpcHRpb25zJywgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zKHsgYm9keSwgLi4ub3B0aW9ucyB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNjcmlwdGlvbiByZXNwb25zZSByZXR1cm5lZCBieSBtb2RlbCwgYmFzZWQgb24gdGhlIHByb3ZpZGVkXG4gKiBpbnB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2NyaXB0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSB0cmFuc2NyaWJlZCB0ZXh0LlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHRpb25DcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGF1ZGlvIGZpbGUgb2JqZWN0IChub3QgZmlsZSBuYW1lKSB0byB0cmFuc2NyaWJlLCBpbiBvbmUgb2YgdGhlc2UgZm9ybWF0czpcbiAgICogZmxhYywgbXAzLCBtcDQsIG1wZWcsIG1wZ2EsIG00YSwgb2dnLCB3YXYsIG9yIHdlYm0uXG4gICAqL1xuICBmaWxlOiBVcGxvYWRhYmxlO1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBPbmx5IGB3aGlzcGVyLTFgICh3aGljaCBpcyBwb3dlcmVkIGJ5IG91ciBvcGVuIHNvdXJjZVxuICAgKiBXaGlzcGVyIFYyIG1vZGVsKSBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgKi9cbiAgbW9kZWw6IChzdHJpbmcgJiB7fSkgfCAnd2hpc3Blci0xJztcblxuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIG9mIHRoZSBpbnB1dCBhdWRpby4gU3VwcGx5aW5nIHRoZSBpbnB1dCBsYW5ndWFnZSBpblxuICAgKiBbSVNPLTYzOS0xXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX0lTT182MzktMV9jb2RlcykgZm9ybWF0IHdpbGxcbiAgICogaW1wcm92ZSBhY2N1cmFjeSBhbmQgbGF0ZW5jeS5cbiAgICovXG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB0ZXh0IHRvIGd1aWRlIHRoZSBtb2RlbCdzIHN0eWxlIG9yIGNvbnRpbnVlIGEgcHJldmlvdXMgYXVkaW9cbiAgICogc2VnbWVudC4gVGhlXG4gICAqIFtwcm9tcHRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9zcGVlY2gtdG8tdGV4dC9wcm9tcHRpbmcpXG4gICAqIHNob3VsZCBtYXRjaCB0aGUgYXVkaW8gbGFuZ3VhZ2UuXG4gICAqL1xuICBwcm9tcHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgb2YgdGhlIHRyYW5zY3JpcHQgb3V0cHV0LCBpbiBvbmUgb2YgdGhlc2Ugb3B0aW9uczogYGpzb25gLCBgdGV4dGAsXG4gICAqIGBzcnRgLCBgdmVyYm9zZV9qc29uYCwgb3IgYHZ0dGAuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiAnanNvbicgfCAndGV4dCcgfCAnc3J0JyB8ICd2ZXJib3NlX2pzb24nIHwgJ3Z0dCc7XG5cbiAgLyoqXG4gICAqIFRoZSBzYW1wbGluZyB0ZW1wZXJhdHVyZSwgYmV0d2VlbiAwIGFuZCAxLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGwgbWFrZSB0aGVcbiAgICogb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmUgZm9jdXNlZCBhbmRcbiAgICogZGV0ZXJtaW5pc3RpYy4gSWYgc2V0IHRvIDAsIHRoZSBtb2RlbCB3aWxsIHVzZVxuICAgKiBbbG9nIHByb2JhYmlsaXR5XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2dfcHJvYmFiaWxpdHkpIHRvXG4gICAqIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2UgdGhlIHRlbXBlcmF0dXJlIHVudGlsIGNlcnRhaW4gdGhyZXNob2xkcyBhcmUgaGl0LlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgZ3JhbnVsYXJpdGllcyB0byBwb3B1bGF0ZSBmb3IgdGhpcyB0cmFuc2NyaXB0aW9uLlxuICAgKiBgcmVzcG9uc2VfZm9ybWF0YCBtdXN0IGJlIHNldCBgdmVyYm9zZV9qc29uYCB0byB1c2UgdGltZXN0YW1wIGdyYW51bGFyaXRpZXMuXG4gICAqIEVpdGhlciBvciBib3RoIG9mIHRoZXNlIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDogYHdvcmRgLCBvciBgc2VnbWVudGAuIE5vdGU6IFRoZXJlXG4gICAqIGlzIG5vIGFkZGl0aW9uYWwgbGF0ZW5jeSBmb3Igc2VnbWVudCB0aW1lc3RhbXBzLCBidXQgZ2VuZXJhdGluZyB3b3JkIHRpbWVzdGFtcHNcbiAgICogaW5jdXJzIGFkZGl0aW9uYWwgbGF0ZW5jeS5cbiAgICovXG4gIHRpbWVzdGFtcF9ncmFudWxhcml0aWVzPzogQXJyYXk8J3dvcmQnIHwgJ3NlZ21lbnQnPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUcmFuc2NyaXB0aW9ucyB7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbiA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25DcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0FQSSBmcm9tIFwiLi90cmFuc2xhdGlvbnNcIjtcbmltcG9ydCB7IHR5cGUgVXBsb2FkYWJsZSwgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0aW9ucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYXVkaW8gaW50byBFbmdsaXNoLlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IFRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxUcmFuc2xhdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2F1ZGlvL3RyYW5zbGF0aW9ucycsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyh7IGJvZHksIC4uLm9wdGlvbnMgfSkpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb24ge1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25DcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGF1ZGlvIGZpbGUgb2JqZWN0IChub3QgZmlsZSBuYW1lKSB0cmFuc2xhdGUsIGluIG9uZSBvZiB0aGVzZSBmb3JtYXRzOiBmbGFjLFxuICAgKiBtcDMsIG1wNCwgbXBlZywgbXBnYSwgbTRhLCBvZ2csIHdhdiwgb3Igd2VibS5cbiAgICovXG4gIGZpbGU6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIE9ubHkgYHdoaXNwZXItMWAgKHdoaWNoIGlzIHBvd2VyZWQgYnkgb3VyIG9wZW4gc291cmNlXG4gICAqIFdoaXNwZXIgVjIgbW9kZWwpIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICd3aGlzcGVyLTEnO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB0ZXh0IHRvIGd1aWRlIHRoZSBtb2RlbCdzIHN0eWxlIG9yIGNvbnRpbnVlIGEgcHJldmlvdXMgYXVkaW9cbiAgICogc2VnbWVudC4gVGhlXG4gICAqIFtwcm9tcHRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9zcGVlY2gtdG8tdGV4dC9wcm9tcHRpbmcpXG4gICAqIHNob3VsZCBiZSBpbiBFbmdsaXNoLlxuICAgKi9cbiAgcHJvbXB0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSB0cmFuc2NyaXB0IG91dHB1dCwgaW4gb25lIG9mIHRoZXNlIG9wdGlvbnM6IGBqc29uYCwgYHRleHRgLFxuICAgKiBgc3J0YCwgYHZlcmJvc2VfanNvbmAsIG9yIGB2dHRgLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2FtcGxpbmcgdGVtcGVyYXR1cmUsIGJldHdlZW4gMCBhbmQgMS4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsIG1ha2UgdGhlXG4gICAqIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlIGZvY3VzZWQgYW5kXG4gICAqIGRldGVybWluaXN0aWMuIElmIHNldCB0byAwLCB0aGUgbW9kZWwgd2lsbCB1c2VcbiAgICogW2xvZyBwcm9iYWJpbGl0eV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTG9nX3Byb2JhYmlsaXR5KSB0b1xuICAgKiBhdXRvbWF0aWNhbGx5IGluY3JlYXNlIHRoZSB0ZW1wZXJhdHVyZSB1bnRpbCBjZXJ0YWluIHRocmVzaG9sZHMgYXJlIGhpdC5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRyYW5zbGF0aW9ucyB7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb24gPSBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb25DcmVhdGVQYXJhbXMgPSBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25DcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIFNwZWVjaEFQSSBmcm9tIFwiLi9zcGVlY2hcIjtcbmltcG9ydCAqIGFzIFRyYW5zY3JpcHRpb25zQVBJIGZyb20gXCIuL3RyYW5zY3JpcHRpb25zXCI7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNBUEkgZnJvbSBcIi4vdHJhbnNsYXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBBdWRpbyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgdHJhbnNjcmlwdGlvbnM6IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25zID0gbmV3IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25zKHRoaXMuX2NsaWVudCk7XG4gIHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9ucyA9IG5ldyBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25zKHRoaXMuX2NsaWVudCk7XG4gIHNwZWVjaDogU3BlZWNoQVBJLlNwZWVjaCA9IG5ldyBTcGVlY2hBUEkuU3BlZWNoKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXVkaW8ge1xuICBleHBvcnQgaW1wb3J0IFRyYW5zY3JpcHRpb25zID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbiA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb25zID0gVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbiA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcyA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBTcGVlY2ggPSBTcGVlY2hBUEkuU3BlZWNoO1xuICBleHBvcnQgaW1wb3J0IFNwZWVjaENyZWF0ZVBhcmFtcyA9IFNwZWVjaEFQSS5TcGVlY2hDcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0ICogYXMgQmF0Y2hlc0FQSSBmcm9tIFwiLi9iYXRjaGVzXCI7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tIFwiLi4vcGFnaW5hdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgQmF0Y2hlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGV4ZWN1dGVzIGEgYmF0Y2ggZnJvbSBhbiB1cGxvYWRlZCBmaWxlIG9mIHJlcXVlc3RzXG4gICAqL1xuICBjcmVhdGUoYm9keTogQmF0Y2hDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEJhdGNoPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvYmF0Y2hlcycsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBiYXRjaC5cbiAgICovXG4gIHJldHJpZXZlKGJhdGNoSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8QmF0Y2g+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL2JhdGNoZXMvJHtiYXRjaElkfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgeW91ciBvcmdhbml6YXRpb24ncyBiYXRjaGVzLlxuICAgKi9cbiAgbGlzdChxdWVyeT86IEJhdGNoTGlzdFBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPEJhdGNoZXNQYWdlLCBCYXRjaD47XG4gIGxpc3Qob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPEJhdGNoZXNQYWdlLCBCYXRjaD47XG4gIGxpc3QoXG4gICAgcXVlcnk6IEJhdGNoTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxCYXRjaGVzUGFnZSwgQmF0Y2g+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3Qoe30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KCcvYmF0Y2hlcycsIEJhdGNoZXNQYWdlLCB7IHF1ZXJ5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYW4gaW4tcHJvZ3Jlc3MgYmF0Y2guXG4gICAqL1xuICBjYW5jZWwoYmF0Y2hJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxCYXRjaD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL2JhdGNoZXMvJHtiYXRjaElkfS9jYW5jZWxgLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmF0Y2hlc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPEJhdGNoPiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoIHtcbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRpbWUgZnJhbWUgd2l0aGluIHdoaWNoIHRoZSBiYXRjaCBzaG91bGQgYmUgcHJvY2Vzc2VkLlxuICAgKi9cbiAgY29tcGxldGlvbl93aW5kb3c6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBPcGVuQUkgQVBJIGVuZHBvaW50IHVzZWQgYnkgdGhlIGJhdGNoLlxuICAgKi9cbiAgZW5kcG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBpbnB1dCBmaWxlIGZvciB0aGUgYmF0Y2guXG4gICAqL1xuICBpbnB1dF9maWxlX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBiYXRjaGAuXG4gICAqL1xuICBvYmplY3Q6ICdiYXRjaCc7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgYmF0Y2guXG4gICAqL1xuICBzdGF0dXM6XG4gICAgfCAndmFsaWRhdGluZydcbiAgICB8ICdmYWlsZWQnXG4gICAgfCAnaW5fcHJvZ3Jlc3MnXG4gICAgfCAnZmluYWxpemluZydcbiAgICB8ICdjb21wbGV0ZWQnXG4gICAgfCAnZXhwaXJlZCdcbiAgICB8ICdjYW5jZWxsaW5nJ1xuICAgIHwgJ2NhbmNlbGxlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIHdhcyBjYW5jZWxsZWQuXG4gICAqL1xuICBjYW5jZWxsZWRfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIHN0YXJ0ZWQgY2FuY2VsbGluZy5cbiAgICovXG4gIGNhbmNlbGxpbmdfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIHdhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBjb21wbGV0ZWRfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBvdXRwdXRzIG9mIHJlcXVlc3RzIHdpdGggZXJyb3JzLlxuICAgKi9cbiAgZXJyb3JfZmlsZV9pZD86IHN0cmluZztcblxuICBlcnJvcnM/OiBCYXRjaC5FcnJvcnM7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIGV4cGlyZWQuXG4gICAqL1xuICBleHBpcmVkX2F0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBiYXRjaCB3aWxsIGV4cGlyZS5cbiAgICovXG4gIGV4cGlyZXNfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIGZhaWxlZC5cbiAgICovXG4gIGZhaWxlZF9hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggc3RhcnRlZCBmaW5hbGl6aW5nLlxuICAgKi9cbiAgZmluYWxpemluZ19hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggc3RhcnRlZCBwcm9jZXNzaW5nLlxuICAgKi9cbiAgaW5fcHJvZ3Jlc3NfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBvdXRwdXRzIG9mIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCByZXF1ZXN0cy5cbiAgICovXG4gIG91dHB1dF9maWxlX2lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBjb3VudHMgZm9yIGRpZmZlcmVudCBzdGF0dXNlcyB3aXRoaW4gdGhlIGJhdGNoLlxuICAgKi9cbiAgcmVxdWVzdF9jb3VudHM/OiBCYXRjaFJlcXVlc3RDb3VudHM7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQmF0Y2gge1xuICBleHBvcnQgaW50ZXJmYWNlIEVycm9ycyB7XG4gICAgZGF0YT86IEFycmF5PEJhdGNoZXNBUEkuQmF0Y2hFcnJvcj47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgbGlzdGAuXG4gICAgICovXG4gICAgb2JqZWN0Pzogc3RyaW5nO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hFcnJvciB7XG4gIC8qKlxuICAgKiBBbiBlcnJvciBjb2RlIGlkZW50aWZ5aW5nIHRoZSBlcnJvciB0eXBlLlxuICAgKi9cbiAgY29kZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBpbnB1dCBmaWxlIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZCwgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIGxpbmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UgcHJvdmlkaW5nIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgZXJyb3IuXG4gICAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRoYXQgY2F1c2VkIHRoZSBlcnJvciwgaWYgYXBwbGljYWJsZS5cbiAgICovXG4gIHBhcmFtPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCBjb3VudHMgZm9yIGRpZmZlcmVudCBzdGF0dXNlcyB3aXRoaW4gdGhlIGJhdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoUmVxdWVzdENvdW50cyB7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBoYXZlIGJlZW4gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIGNvbXBsZXRlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZC5cbiAgICovXG4gIGZhaWxlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgcmVxdWVzdHMgaW4gdGhlIGJhdGNoLlxuICAgKi9cbiAgdG90YWw6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaENyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgdGltZSBmcmFtZSB3aXRoaW4gd2hpY2ggdGhlIGJhdGNoIHNob3VsZCBiZSBwcm9jZXNzZWQuIEN1cnJlbnRseSBvbmx5IGAyNGhgXG4gICAqIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIGNvbXBsZXRpb25fd2luZG93OiAnMjRoJztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50IHRvIGJlIHVzZWQgZm9yIGFsbCByZXF1ZXN0cyBpbiB0aGUgYmF0Y2guIEN1cnJlbnRseVxuICAgKiBgL3YxL2NoYXQvY29tcGxldGlvbnNgIGFuZCBgL3YxL2VtYmVkZGluZ3NgIGFyZSBzdXBwb3J0ZWQuXG4gICAqL1xuICBlbmRwb2ludDogJy92MS9jaGF0L2NvbXBsZXRpb25zJyB8ICcvdjEvZW1iZWRkaW5ncyc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiBhbiB1cGxvYWRlZCBmaWxlIHRoYXQgY29udGFpbnMgcmVxdWVzdHMgZm9yIHRoZSBuZXcgYmF0Y2guXG4gICAqXG4gICAqIFNlZSBbdXBsb2FkIGZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMvY3JlYXRlKVxuICAgKiBmb3IgaG93IHRvIHVwbG9hZCBhIGZpbGUuXG4gICAqXG4gICAqIFlvdXIgaW5wdXQgZmlsZSBtdXN0IGJlIGZvcm1hdHRlZCBhcyBhXG4gICAqIFtKU09OTCBmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2JhdGNoL3JlcXVlc3RJbnB1dCksXG4gICAqIGFuZCBtdXN0IGJlIHVwbG9hZGVkIHdpdGggdGhlIHB1cnBvc2UgYGJhdGNoYC5cbiAgICovXG4gIGlucHV0X2ZpbGVfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgY3VzdG9tIG1ldGFkYXRhIGZvciB0aGUgYmF0Y2guXG4gICAqL1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge31cblxuZXhwb3J0IG5hbWVzcGFjZSBCYXRjaGVzIHtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaCA9IEJhdGNoZXNBUEkuQmF0Y2g7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hFcnJvciA9IEJhdGNoZXNBUEkuQmF0Y2hFcnJvcjtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaFJlcXVlc3RDb3VudHMgPSBCYXRjaGVzQVBJLkJhdGNoUmVxdWVzdENvdW50cztcbiAgZXhwb3J0IGltcG9ydCBCYXRjaGVzUGFnZSA9IEJhdGNoZXNBUEkuQmF0Y2hlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hDcmVhdGVQYXJhbXMgPSBCYXRjaGVzQVBJLkJhdGNoQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoTGlzdFBhcmFtcyA9IEJhdGNoZXNBUEkuQmF0Y2hMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCAqIGFzIEFzc2lzdGFudHNBUEkgZnJvbSBcIi4vYXNzaXN0YW50c1wiO1xuaW1wb3J0ICogYXMgU2hhcmVkIGZyb20gXCIuLi9zaGFyZWRcIjtcbmltcG9ydCAqIGFzIE1lc3NhZ2VzQVBJIGZyb20gXCIuL3RocmVhZHMvbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIFRocmVhZHNBUEkgZnJvbSBcIi4vdGhyZWFkcy90aHJlYWRzXCI7XG5pbXBvcnQgKiBhcyBSdW5zQVBJIGZyb20gXCIuL3RocmVhZHMvcnVucy9ydW5zXCI7XG5pbXBvcnQgKiBhcyBTdGVwc0FQSSBmcm9tIFwiLi90aHJlYWRzL3J1bnMvc3RlcHNcIjtcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gXCIuLi8uLi9wYWdpbmF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBBc3Npc3RhbnRzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGFuIGFzc2lzdGFudCB3aXRoIGEgbW9kZWwgYW5kIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBBc3Npc3RhbnRDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEFzc2lzdGFudD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2Fzc2lzdGFudHMnLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGFuIGFzc2lzdGFudC5cbiAgICovXG4gIHJldHJpZXZlKGFzc2lzdGFudElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEFzc2lzdGFudD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvYXNzaXN0YW50cy8ke2Fzc2lzdGFudElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIGFuIGFzc2lzdGFudC5cbiAgICovXG4gIHVwZGF0ZShcbiAgICBhc3Npc3RhbnRJZDogc3RyaW5nLFxuICAgIGJvZHk6IEFzc2lzdGFudFVwZGF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPEFzc2lzdGFudD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL2Fzc2lzdGFudHMvJHthc3Npc3RhbnRJZH1gLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYXNzaXN0YW50cy5cbiAgICovXG4gIGxpc3QoXG4gICAgcXVlcnk/OiBBc3Npc3RhbnRMaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEFzc2lzdGFudHNQYWdlLCBBc3Npc3RhbnQ+O1xuICBsaXN0KG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxBc3Npc3RhbnRzUGFnZSwgQXNzaXN0YW50PjtcbiAgbGlzdChcbiAgICBxdWVyeTogQXNzaXN0YW50TGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxBc3Npc3RhbnRzUGFnZSwgQXNzaXN0YW50PiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdCgnL2Fzc2lzdGFudHMnLCBBc3Npc3RhbnRzUGFnZSwge1xuICAgICAgcXVlcnksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gYXNzaXN0YW50LlxuICAgKi9cbiAgZGVsKGFzc2lzdGFudElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEFzc2lzdGFudERlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL2Fzc2lzdGFudHMvJHthc3Npc3RhbnRJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXNzaXN0YW50c1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPEFzc2lzdGFudD4ge31cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGBhc3Npc3RhbnRgIHRoYXQgY2FuIGNhbGwgdGhlIG1vZGVsIGFuZCB1c2UgdG9vbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYXNzaXN0YW50IHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFzc2lzdGFudC4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gaW5zdHJ1Y3Rpb25zIHRoYXQgdGhlIGFzc2lzdGFudCB1c2VzLiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMjU2LDAwMFxuICAgKiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YTogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFlvdSBjYW4gdXNlIHRoZVxuICAgKiBbTGlzdCBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzL2xpc3QpIEFQSSB0b1xuICAgKiBzZWUgYWxsIG9mIHlvdXIgYXZhaWxhYmxlIG1vZGVscywgb3Igc2VlIG91clxuICAgKiBbTW9kZWwgb3ZlcnZpZXddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9vdmVydmlldykgZm9yXG4gICAqIGRlc2NyaXB0aW9ucyBvZiB0aGVtLlxuICAgKi9cbiAgbW9kZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFzc2lzdGFudC4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDI1NiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYGFzc2lzdGFudGAuXG4gICAqL1xuICBvYmplY3Q6ICdhc3Npc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbCBlbmFibGVkIG9uIHRoZSBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTI4IHRvb2xzIHBlclxuICAgKiBhc3Npc3RhbnQuIFRvb2xzIGNhbiBiZSBvZiB0eXBlcyBgY29kZV9pbnRlcnByZXRlcmAsIGBmaWxlX3NlYXJjaGAsIG9yXG4gICAqIGBmdW5jdGlvbmAuXG4gICAqL1xuICB0b29sczogQXJyYXk8QXNzaXN0YW50VG9vbD47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICB0b29sX3Jlc291cmNlcz86IEFzc2lzdGFudC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEFzc2lzdGFudCB7XG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYGAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgKiB0aGUgYXNzaXN0YW50LlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnREZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ2Fzc2lzdGFudC5kZWxldGVkJztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGV2ZW50IGVtaXR0ZWQgd2hlbiBzdHJlYW1pbmcgYSBSdW4uXG4gKlxuICogRWFjaCBldmVudCBpbiBhIHNlcnZlci1zZW50IGV2ZW50cyBzdHJlYW0gaGFzIGFuIGBldmVudGAgYW5kIGBkYXRhYCBwcm9wZXJ0eTpcbiAqXG4gKiBgYGBcbiAqIGV2ZW50OiB0aHJlYWQuY3JlYXRlZFxuICogZGF0YToge1wiaWRcIjogXCJ0aHJlYWRfMTIzXCIsIFwib2JqZWN0XCI6IFwidGhyZWFkXCIsIC4uLn1cbiAqIGBgYFxuICpcbiAqIFdlIGVtaXQgZXZlbnRzIHdoZW5ldmVyIGEgbmV3IG9iamVjdCBpcyBjcmVhdGVkLCB0cmFuc2l0aW9ucyB0byBhIG5ldyBzdGF0ZSwgb3JcbiAqIGlzIGJlaW5nIHN0cmVhbWVkIGluIHBhcnRzIChkZWx0YXMpLiBGb3IgZXhhbXBsZSwgd2UgZW1pdCBgdGhyZWFkLnJ1bi5jcmVhdGVkYFxuICogd2hlbiBhIG5ldyBydW4gaXMgY3JlYXRlZCwgYHRocmVhZC5ydW4uY29tcGxldGVkYCB3aGVuIGEgcnVuIGNvbXBsZXRlcywgYW5kIHNvXG4gKiBvbi4gV2hlbiBhbiBBc3Npc3RhbnQgY2hvb3NlcyB0byBjcmVhdGUgYSBtZXNzYWdlIGR1cmluZyBhIHJ1biwgd2UgZW1pdCBhXG4gKiBgdGhyZWFkLm1lc3NhZ2UuY3JlYXRlZCBldmVudGAsIGEgYHRocmVhZC5tZXNzYWdlLmluX3Byb2dyZXNzYCBldmVudCwgbWFueVxuICogYHRocmVhZC5tZXNzYWdlLmRlbHRhYCBldmVudHMsIGFuZCBmaW5hbGx5IGEgYHRocmVhZC5tZXNzYWdlLmNvbXBsZXRlZGAgZXZlbnQuXG4gKlxuICogV2UgbWF5IGFkZCBhZGRpdGlvbmFsIGV2ZW50cyBvdmVyIHRpbWUsIHNvIHdlIHJlY29tbWVuZCBoYW5kbGluZyB1bmtub3duIGV2ZW50c1xuICogZ3JhY2VmdWxseSBpbiB5b3VyIGNvZGUuIFNlZSB0aGVcbiAqIFtBc3Npc3RhbnRzIEFQSSBxdWlja3N0YXJ0XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hc3Npc3RhbnRzL292ZXJ2aWV3KVxuICogdG8gbGVhcm4gaG93IHRvIGludGVncmF0ZSB0aGUgQXNzaXN0YW50cyBBUEkgd2l0aCBzdHJlYW1pbmcuXG4gKi9cbmV4cG9ydCB0eXBlIEFzc2lzdGFudFN0cmVhbUV2ZW50ID1cbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRDcmVhdGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuQ3JlYXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blF1ZXVlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkluUHJvZ3Jlc3NcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5SZXF1aXJlc0FjdGlvblxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkNvbXBsZXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkZhaWxlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkNhbmNlbGxpbmdcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5DYW5jZWxsZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5FeHBpcmVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENyZWF0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwSW5Qcm9ncmVzc1xuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBEZWx0YVxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBDb21wbGV0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwRmFpbGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENhbmNlbGxlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBFeHBpcmVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkTWVzc2FnZUNyZWF0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlSW5Qcm9ncmVzc1xuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VEZWx0YVxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VDb21wbGV0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlSW5jb21wbGV0ZVxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LkVycm9yRXZlbnQ7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXNzaXN0YW50U3RyZWFtRXZlbnQge1xuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBuZXdcbiAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzL29iamVjdCkgaXNcbiAgICogY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zXG4gICAgICogW21lc3NhZ2VzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBUaHJlYWRzQVBJLlRocmVhZDtcblxuICAgIGV2ZW50OiAndGhyZWFkLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgbmV3XG4gICAqIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpIGlzIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNyZWF0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYHF1ZXVlZGAgc3RhdHVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5RdWV1ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5xdWV1ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogbW92ZXMgdG8gYW4gYGluX3Byb2dyZXNzYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkluUHJvZ3Jlc3Mge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhIGByZXF1aXJlc19hY3Rpb25gIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuUmVxdWlyZXNBY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5yZXF1aXJlc19hY3Rpb24nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5Db21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogZmFpbHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkZhaWxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmZhaWxlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhIGBjYW5jZWxsaW5nYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNhbmNlbGxpbmcge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jYW5jZWxsaW5nJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIGlzIGNhbmNlbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ2FuY2VsbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGV4ZWN1dGlvbiBydW4gb24gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogUnVuc0FQSS5SdW47XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uY2FuY2VsbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIGV4cGlyZXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkV4cGlyZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5leHBpcmVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXRlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gcGFydHMgb2YgYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgYXJlXG4gICAqIGJlaW5nIHN0cmVhbWVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwRGVsdGEge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBydW4gc3RlcCBkZWx0YSBpLmUuIGFueSBjaGFuZ2VkIGZpZWxkcyBvbiBhIHJ1biBzdGVwIGR1cmluZ1xuICAgICAqIHN0cmVhbWluZy5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwRGVsdGFFdmVudDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBDb21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuY29tcGxldGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBmYWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcEZhaWxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5mYWlsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGlzXG4gICAqIGNhbmNlbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcENhbmNlbGxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jYW5jZWxsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpXG4gICAqIGV4cGlyZXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBFeHBpcmVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmV4cGlyZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBpc1xuICAgKiBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2l0aGluIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBtb3Zlc1xuICAgKiB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXRlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2l0aGluIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmluX3Byb2dyZXNzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBwYXJ0cyBvZiBhXG4gICAqIFtNZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgYXJlXG4gICAqIGJlaW5nIHN0cmVhbWVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlRGVsdGEge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIGRlbHRhIGkuZS4gYW55IGNoYW5nZWQgZmllbGRzIG9uIGEgbWVzc2FnZSBkdXJpbmdcbiAgICAgKiBzdHJlYW1pbmcuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZURlbHRhRXZlbnQ7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmRlbHRhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgaXNcbiAgICogY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlQ29tcGxldGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuY29tcGxldGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgZW5kc1xuICAgKiBiZWZvcmUgaXQgaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRNZXNzYWdlSW5jb21wbGV0ZSB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2l0aGluIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmluY29tcGxldGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFuXG4gICAqIFtlcnJvcl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2Vycm9yLWNvZGVzL2FwaS1lcnJvcnMpIG9jY3Vycy5cbiAgICogVGhpcyBjYW4gaGFwcGVuIGR1ZSB0byBhbiBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3Igb3IgYSB0aW1lb3V0LlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBFcnJvckV2ZW50IHtcbiAgICBkYXRhOiBTaGFyZWQuRXJyb3JPYmplY3Q7XG5cbiAgICBldmVudDogJ2Vycm9yJztcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBBc3Npc3RhbnRUb29sID0gQ29kZUludGVycHJldGVyVG9vbCB8IEZpbGVTZWFyY2hUb29sIHwgRnVuY3Rpb25Ub29sO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlclRvb2wge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBiZWluZyBkZWZpbmVkOiBgY29kZV9pbnRlcnByZXRlcmBcbiAgICovXG4gIHR5cGU6ICdjb2RlX2ludGVycHJldGVyJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoVG9vbCB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGJlaW5nIGRlZmluZWQ6IGBmaWxlX3NlYXJjaGBcbiAgICovXG4gIHR5cGU6ICdmaWxlX3NlYXJjaCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25Ub29sIHtcbiAgZnVuY3Rpb246IFNoYXJlZC5GdW5jdGlvbkRlZmluaXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRvb2wgYmVpbmcgZGVmaW5lZDogYGZ1bmN0aW9uYFxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBPY2N1cnMgd2hlbiBhXG4gKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGlzXG4gKiBjcmVhdGVkLlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlU3RyZWFtRXZlbnQgPVxuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlQ3JlYXRlZFxuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlSW5Qcm9ncmVzc1xuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlRGVsdGFcbiAgfCBNZXNzYWdlU3RyZWFtRXZlbnQuVGhyZWFkTWVzc2FnZUNvbXBsZXRlZFxuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlSW5jb21wbGV0ZTtcblxuZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlU3RyZWFtRXZlbnQge1xuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGlzXG4gICAqIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VDcmVhdGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuY3JlYXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIG1vdmVzXG4gICAqIHRvIGFuIGBpbl9wcm9ncmVzc2Agc3RhdGUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VJblByb2dyZXNzIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3MnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIHBhcnRzIG9mIGFcbiAgICogW01lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBhcmVcbiAgICogYmVpbmcgc3RyZWFtZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VEZWx0YSB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBtZXNzYWdlIGR1cmluZ1xuICAgICAqIHN0cmVhbWluZy5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlRGVsdGFFdmVudDtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBpc1xuICAgKiBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VDb21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBlbmRzXG4gICAqIGJlZm9yZSBpdCBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VJbmNvbXBsZXRlIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuaW5jb21wbGV0ZSc7XG4gIH1cbn1cblxuLyoqXG4gKiBPY2N1cnMgd2hlbiBhXG4gKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgaXNcbiAqIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1blN0ZXBTdHJlYW1FdmVudCA9XG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBDcmVhdGVkXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBJblByb2dyZXNzXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBEZWx0YVxuICB8IFJ1blN0ZXBTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwQ29tcGxldGVkXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBGYWlsZWRcbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENhbmNlbGxlZFxuICB8IFJ1blN0ZXBTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwRXhwaXJlZDtcblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdGVwU3RyZWFtRXZlbnQge1xuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgaXNcbiAgICogY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcENyZWF0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuY3JlYXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdClcbiAgICogbW92ZXMgdG8gYW4gYGluX3Byb2dyZXNzYCBzdGF0ZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcEluUHJvZ3Jlc3Mge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuaW5fcHJvZ3Jlc3MnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIHBhcnRzIG9mIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGFyZVxuICAgKiBiZWluZyBzdHJlYW1lZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcERlbHRhIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgcnVuIHN0ZXAgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBydW4gc3RlcCBkdXJpbmdcbiAgICAgKiBzdHJlYW1pbmcuXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcERlbHRhRXZlbnQ7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5kZWx0YSc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgaXNcbiAgICogY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwQ29tcGxldGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmNvbXBsZXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdClcbiAgICogZmFpbHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBGYWlsZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuZmFpbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjYW5jZWxsZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBDYW5jZWxsZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuY2FuY2VsbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBleHBpcmVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwRXhwaXJlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5leHBpcmVkJztcbiAgfVxufVxuXG4vKipcbiAqIE9jY3VycyB3aGVuIGEgbmV3XG4gKiBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KSBpcyBjcmVhdGVkLlxuICovXG5leHBvcnQgdHlwZSBSdW5TdHJlYW1FdmVudCA9XG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuQ3JlYXRlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1blF1ZXVlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkluUHJvZ3Jlc3NcbiAgfCBSdW5TdHJlYW1FdmVudC5UaHJlYWRSdW5SZXF1aXJlc0FjdGlvblxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkNvbXBsZXRlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkZhaWxlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkNhbmNlbGxpbmdcbiAgfCBSdW5TdHJlYW1FdmVudC5UaHJlYWRSdW5DYW5jZWxsZWRcbiAgfCBSdW5TdHJlYW1FdmVudC5UaHJlYWRSdW5FeHBpcmVkO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN0cmVhbUV2ZW50IHtcbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgbmV3XG4gICAqIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpIGlzIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNyZWF0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYHF1ZXVlZGAgc3RhdHVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5RdWV1ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5xdWV1ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogbW92ZXMgdG8gYW4gYGluX3Byb2dyZXNzYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkluUHJvZ3Jlc3Mge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhIGByZXF1aXJlc19hY3Rpb25gIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuUmVxdWlyZXNBY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5yZXF1aXJlc19hY3Rpb24nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogaXMgY29tcGxldGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5Db21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogZmFpbHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkZhaWxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmZhaWxlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhIGBjYW5jZWxsaW5nYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNhbmNlbGxpbmcge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jYW5jZWxsaW5nJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIGlzIGNhbmNlbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ2FuY2VsbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGV4ZWN1dGlvbiBydW4gb24gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogUnVuc0FQSS5SdW47XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uY2FuY2VsbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIGV4cGlyZXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkV4cGlyZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5leHBpcmVkJztcbiAgfVxufVxuXG4vKipcbiAqIE9jY3VycyB3aGVuIGEgbmV3XG4gKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMvb2JqZWN0KSBpc1xuICogY3JlYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRTdHJlYW1FdmVudCB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEgdGhyZWFkIHRoYXQgY29udGFpbnNcbiAgICogW21lc3NhZ2VzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzKS5cbiAgICovXG4gIGRhdGE6IFRocmVhZHNBUEkuVGhyZWFkO1xuXG4gIGV2ZW50OiAndGhyZWFkLmNyZWF0ZWQnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudENyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBZb3UgY2FuIHVzZSB0aGVcbiAgICogW0xpc3QgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscy9saXN0KSBBUEkgdG9cbiAgICogc2VlIGFsbCBvZiB5b3VyIGF2YWlsYWJsZSBtb2RlbHMsIG9yIHNlZSBvdXJcbiAgICogW01vZGVsIG92ZXJ2aWV3XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvb3ZlcnZpZXcpIGZvclxuICAgKiBkZXNjcmlwdGlvbnMgb2YgdGhlbS5cbiAgICovXG4gIG1vZGVsOlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhc3Npc3RhbnQuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyA1MTIgY2hhcmFjdGVycy5cbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN5c3RlbSBpbnN0cnVjdGlvbnMgdGhhdCB0aGUgYXNzaXN0YW50IHVzZXMuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAyNTYsMDAwXG4gICAqIGNoYXJhY3RlcnMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXNzaXN0YW50LiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMjU2IGNoYXJhY3RlcnMuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogQXNzaXN0YW50Q3JlYXRlUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbCBlbmFibGVkIG9uIHRoZSBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTI4IHRvb2xzIHBlclxuICAgKiBhc3Npc3RhbnQuIFRvb2xzIGNhbiBiZSBvZiB0eXBlcyBgY29kZV9pbnRlcnByZXRlcmAsIGBmaWxlX3NlYXJjaGAsIG9yXG4gICAqIGBmdW5jdGlvbmAuXG4gICAqL1xuICB0b29scz86IEFycmF5PEFzc2lzdGFudFRvb2w+O1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXNzaXN0YW50Q3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgKiB0aGUgYXNzaXN0YW50LlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIHdpdGggZmlsZV9pZHMgYW5kIGF0dGFjaCBpdCB0byB0aGlzIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxXG4gICAgICAgKiB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG8gdGhlIGFzc2lzdGFudC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3Jlcz86IEFycmF5PEZpbGVTZWFyY2guVmVjdG9yU3RvcmU+O1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgRmlsZVNlYXJjaCB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIHRvXG4gICAgICAgICAqIGFkZCB0byB0aGUgdmVjdG9yIHN0b3JlLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEwMDAwIGZpbGVzIGluIGEgdmVjdG9yXG4gICAgICAgICAqIHN0b3JlLlxuICAgICAgICAgKi9cbiAgICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgdmVjdG9yIHN0b3JlLiBUaGlzIGNhbiBiZVxuICAgICAgICAgKiB1c2VmdWwgZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVjdG9yIHN0b3JlIGluIGEgc3RydWN0dXJlZFxuICAgICAgICAgKiBmb3JtYXQuIEtleXMgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW1cbiAgICAgICAgICogb2YgNTEyIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAgICovXG4gICAgICAgIG1ldGFkYXRhPzogdW5rbm93bjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhc3Npc3RhbnQuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyA1MTIgY2hhcmFjdGVycy5cbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN5c3RlbSBpbnN0cnVjdGlvbnMgdGhhdCB0aGUgYXNzaXN0YW50IHVzZXMuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAyNTYsMDAwXG4gICAqIGNoYXJhY3RlcnMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBZb3UgY2FuIHVzZSB0aGVcbiAgICogW0xpc3QgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscy9saXN0KSBBUEkgdG9cbiAgICogc2VlIGFsbCBvZiB5b3VyIGF2YWlsYWJsZSBtb2RlbHMsIG9yIHNlZSBvdXJcbiAgICogW01vZGVsIG92ZXJ2aWV3XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvb3ZlcnZpZXcpIGZvclxuICAgKiBkZXNjcmlwdGlvbnMgb2YgdGhlbS5cbiAgICovXG4gIG1vZGVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXNzaXN0YW50LiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMjU2IGNoYXJhY3RlcnMuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogQXNzaXN0YW50VXBkYXRlUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbCBlbmFibGVkIG9uIHRoZSBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTI4IHRvb2xzIHBlclxuICAgKiBhc3Npc3RhbnQuIFRvb2xzIGNhbiBiZSBvZiB0eXBlcyBgY29kZV9pbnRlcnByZXRlcmAsIGBmaWxlX3NlYXJjaGAsIG9yXG4gICAqIGBmdW5jdGlvbmAuXG4gICAqL1xuICB0b29scz86IEFycmF5PEFzc2lzdGFudFRvb2w+O1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXNzaXN0YW50VXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIE92ZXJyaWRlcyB0aGUgbGlzdCBvZlxuICAgICAgICogW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlIGF2YWlsYWJsZVxuICAgICAgICogdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzIGFzc29jaWF0ZWRcbiAgICAgICAqIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBPdmVycmlkZXMgdGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudExpc3RQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY3Vyc29yIGZvciB1c2UgaW4gcGFnaW5hdGlvbi4gYGJlZm9yZWAgaXMgYW4gb2JqZWN0IElEIHRoYXQgZGVmaW5lcyB5b3VyIHBsYWNlXG4gICAqIGluIHRoZSBsaXN0LiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBtYWtlIGEgbGlzdCByZXF1ZXN0IGFuZCByZWNlaXZlIDEwMCBvYmplY3RzLFxuICAgKiBlbmRpbmcgd2l0aCBvYmpfZm9vLCB5b3VyIHN1YnNlcXVlbnQgY2FsbCBjYW4gaW5jbHVkZSBiZWZvcmU9b2JqX2ZvbyBpbiBvcmRlciB0b1xuICAgKiBmZXRjaCB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgbGlzdC5cbiAgICovXG4gIGJlZm9yZT86IHN0cmluZztcblxuICAvKipcbiAgICogU29ydCBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWVzdGFtcCBvZiB0aGUgb2JqZWN0cy4gYGFzY2AgZm9yIGFzY2VuZGluZ1xuICAgKiBvcmRlciBhbmQgYGRlc2NgIGZvciBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKi9cbiAgb3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBc3Npc3RhbnRzIHtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnQgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnREZWxldGVkID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnREZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRUb29sO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlclRvb2wgPSBBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVNlYXJjaFRvb2wgPSBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sO1xuICBleHBvcnQgaW1wb3J0IEZ1bmN0aW9uVG9vbCA9IEFzc2lzdGFudHNBUEkuRnVuY3Rpb25Ub29sO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuTWVzc2FnZVN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuUnVuU3RlcFN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFJ1blN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5SdW5TdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuVGhyZWFkU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50c1BhZ2UgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudENyZWF0ZVBhcmFtcyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50Q3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFVwZGF0ZVBhcmFtcyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudExpc3RQYXJhbXMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudExpc3RQYXJhbXM7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBDaGF0Q29tcGxldGlvblJ1bm5lciB9IGZyb20gJy4vQ2hhdENvbXBsZXRpb25SdW5uZXInO1xuaW1wb3J0IHsgdHlwZSBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lciB9IGZyb20gJy4vQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXInO1xuaW1wb3J0IHsgSlNPTlNjaGVtYSB9IGZyb20gJy4vanNvbnNjaGVtYSc7XG5cbnR5cGUgUHJvbWlzZU9yVmFsdWU8VD4gPSBUIHwgUHJvbWlzZTxUPjtcblxuZXhwb3J0IHR5cGUgUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgLyoqXG4gICAqIEBwYXJhbSBhcmdzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBgcGFyc2VgLlxuICAgKiBAcGFyYW0gcnVubmVyIHRoZSBydW5uZXIgZXZhbHVhdGluZyB0aGlzIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyBhIHN0cmluZyB0byBzZW5kIGJhY2sgdG8gT3BlbkFJLlxuICAgKi9cbiAgZnVuY3Rpb246IChcbiAgICBhcmdzOiBBcmdzLFxuICAgIHJ1bm5lcjogQ2hhdENvbXBsZXRpb25SdW5uZXIgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcixcbiAgKSA9PiBQcm9taXNlT3JWYWx1ZTx1bmtub3duPjtcbiAgLyoqXG4gICAqIEBwYXJhbSBpbnB1dCB0aGUgcmF3IGFyZ3MgZnJvbSB0aGUgT3BlbkFJIGZ1bmN0aW9uIGNhbGwuXG4gICAqIEByZXR1cm5zIHRoZSBwYXJzZWQgYXJndW1lbnRzIHRvIHBhc3MgdG8gYGZ1bmN0aW9uYFxuICAgKi9cbiAgcGFyc2U6IChpbnB1dDogc3RyaW5nKSA9PiBQcm9taXNlT3JWYWx1ZTxBcmdzPjtcbiAgLyoqXG4gICAqIFRoZSBwYXJhbWV0ZXJzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLCBkZXNjcmliZXMgYXMgYSBKU09OIFNjaGVtYSBvYmplY3QuXG4gICAqL1xuICBwYXJhbWV0ZXJzOiBKU09OU2NoZW1hO1xuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBmdW5jdGlvbiBkb2VzLCB1c2VkIGJ5IHRoZSBtb2RlbCB0byBjaG9vc2Ugd2hlbiBhbmQgaG93IHRvIGNhbGwgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIFdpbGwgZGVmYXVsdCB0byBmdW5jdGlvbi5uYW1lIGlmIG9taXR0ZWQuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgUnVubmFibGVGdW5jdGlvbldpdGhvdXRQYXJzZSA9IHtcbiAgLyoqXG4gICAqIEBwYXJhbSBhcmdzIHRoZSByYXcgYXJncyBmcm9tIHRoZSBPcGVuQUkgZnVuY3Rpb24gY2FsbC5cbiAgICogQHJldHVybnMgYSBzdHJpbmcgdG8gc2VuZCBiYWNrIHRvIE9wZW5BSVxuICAgKi9cbiAgZnVuY3Rpb246IChcbiAgICBhcmdzOiBzdHJpbmcsXG4gICAgcnVubmVyOiBDaGF0Q29tcGxldGlvblJ1bm5lciB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyLFxuICApID0+IFByb21pc2VPclZhbHVlPHVua25vd24+O1xuICAvKipcbiAgICogVGhlIHBhcmFtZXRlcnMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMsIGRlc2NyaWJlcyBhcyBhIEpTT04gU2NoZW1hIG9iamVjdC5cbiAgICovXG4gIHBhcmFtZXRlcnM6IEpTT05TY2hlbWE7XG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGNob29zZSB3aGVuIGFuZCBob3cgdG8gY2FsbCB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gV2lsbCBkZWZhdWx0IHRvIGZ1bmN0aW9uLm5hbWUgaWYgb21pdHRlZC5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZUZ1bmN0aW9uPEFyZ3MgZXh0ZW5kcyBvYmplY3QgfCBzdHJpbmc+ID1cbiAgQXJncyBleHRlbmRzIHN0cmluZyA/IFJ1bm5hYmxlRnVuY3Rpb25XaXRob3V0UGFyc2VcbiAgOiBBcmdzIGV4dGVuZHMgb2JqZWN0ID8gUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPlxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZVRvb2xGdW5jdGlvbjxBcmdzIGV4dGVuZHMgb2JqZWN0IHwgc3RyaW5nPiA9XG4gIEFyZ3MgZXh0ZW5kcyBzdHJpbmcgPyBSdW5uYWJsZVRvb2xGdW5jdGlvbldpdGhvdXRQYXJzZVxuICA6IEFyZ3MgZXh0ZW5kcyBvYmplY3QgPyBSdW5uYWJsZVRvb2xGdW5jdGlvbldpdGhQYXJzZTxBcmdzPlxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZVRvb2xGdW5jdGlvbldpdGhvdXRQYXJzZSA9IHtcbiAgdHlwZTogJ2Z1bmN0aW9uJztcbiAgZnVuY3Rpb246IFJ1bm5hYmxlRnVuY3Rpb25XaXRob3V0UGFyc2U7XG59O1xuZXhwb3J0IHR5cGUgUnVubmFibGVUb29sRnVuY3Rpb25XaXRoUGFyc2U8QXJncyBleHRlbmRzIG9iamVjdD4gPSB7XG4gIHR5cGU6ICdmdW5jdGlvbic7XG4gIGZ1bmN0aW9uOiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzIGV4dGVuZHMgb2JqZWN0PihcbiAgZm46IGFueSxcbik6IGZuIGlzIFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz4ge1xuICByZXR1cm4gdHlwZW9mIChmbiBhcyBhbnkpLnBhcnNlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgdHlwZSBCYXNlRnVuY3Rpb25zQXJncyA9IHJlYWRvbmx5IChvYmplY3QgfCBzdHJpbmcpW107XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4gPVxuICBbYW55W11dIGV4dGVuZHMgW0Z1bmN0aW9uc0FyZ3NdID8gcmVhZG9ubHkgUnVubmFibGVGdW5jdGlvbjxhbnk+W11cbiAgOiB7XG4gICAgICBbSW5kZXggaW4ga2V5b2YgRnVuY3Rpb25zQXJnc106IEluZGV4IGV4dGVuZHMgbnVtYmVyID8gUnVubmFibGVGdW5jdGlvbjxGdW5jdGlvbnNBcmdzW0luZGV4XT5cbiAgICAgIDogRnVuY3Rpb25zQXJnc1tJbmRleF07XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgUnVubmFibGVUb29sczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+ID1cbiAgW2FueVtdXSBleHRlbmRzIFtGdW5jdGlvbnNBcmdzXSA/IHJlYWRvbmx5IFJ1bm5hYmxlVG9vbEZ1bmN0aW9uPGFueT5bXVxuICA6IHtcbiAgICAgIFtJbmRleCBpbiBrZXlvZiBGdW5jdGlvbnNBcmdzXTogSW5kZXggZXh0ZW5kcyBudW1iZXIgPyBSdW5uYWJsZVRvb2xGdW5jdGlvbjxGdW5jdGlvbnNBcmdzW0luZGV4XT5cbiAgICAgIDogRnVuY3Rpb25zQXJnc1tJbmRleF07XG4gICAgfTtcblxuLyoqXG4gKiBUaGlzIGlzIGhlbHBlciBjbGFzcyBmb3IgcGFzc2luZyBhIGBmdW5jdGlvbmAgYW5kIGBwYXJzZWAgd2hlcmUgdGhlIGBmdW5jdGlvbmBcbiAqIGFyZ3VtZW50IHR5cGUgbWF0Y2hlcyB0aGUgYHBhcnNlYCByZXR1cm4gdHlwZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCAtIHBsZWFzZSB1c2UgUGFyc2luZ1Rvb2xGdW5jdGlvbiBpbnN0ZWFkLlxuICovXG5leHBvcnQgY2xhc3MgUGFyc2luZ0Z1bmN0aW9uPEFyZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgZnVuY3Rpb246IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5bJ2Z1bmN0aW9uJ107XG4gIHBhcnNlOiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+WydwYXJzZSddO1xuICBwYXJhbWV0ZXJzOiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+WydwYXJhbWV0ZXJzJ107XG4gIGRlc2NyaXB0aW9uOiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+WydkZXNjcmlwdGlvbiddO1xuICBuYW1lPzogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPlsnbmFtZSddO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+KSB7XG4gICAgdGhpcy5mdW5jdGlvbiA9IGlucHV0LmZ1bmN0aW9uO1xuICAgIHRoaXMucGFyc2UgPSBpbnB1dC5wYXJzZTtcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSBpbnB1dC5wYXJhbWV0ZXJzO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBpbnB1dC5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLm5hbWUgPSBpbnB1dC5uYW1lO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBpcyBoZWxwZXIgY2xhc3MgZm9yIHBhc3NpbmcgYSBgZnVuY3Rpb25gIGFuZCBgcGFyc2VgIHdoZXJlIHRoZSBgZnVuY3Rpb25gXG4gKiBhcmd1bWVudCB0eXBlIG1hdGNoZXMgdGhlIGBwYXJzZWAgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJzaW5nVG9vbEZ1bmN0aW9uPEFyZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgdHlwZTogJ2Z1bmN0aW9uJztcbiAgZnVuY3Rpb246IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz47XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz4pIHtcbiAgICB0aGlzLnR5cGUgPSAnZnVuY3Rpb24nO1xuICAgIHRoaXMuZnVuY3Rpb24gPSBpbnB1dDtcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW0sXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbSxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSxcbiAgdHlwZSBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW0sXG59IGZyb20gXCIuLi9yZXNvdXJjZXNcIjtcblxuZXhwb3J0IGNvbnN0IGlzQXNzaXN0YW50TWVzc2FnZSA9IChcbiAgbWVzc2FnZTogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogbWVzc2FnZSBpcyBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSA9PiB7XG4gIHJldHVybiBtZXNzYWdlPy5yb2xlID09PSAnYXNzaXN0YW50Jztcbn07XG5cbmV4cG9ydCBjb25zdCBpc0Z1bmN0aW9uTWVzc2FnZSA9IChcbiAgbWVzc2FnZTogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogbWVzc2FnZSBpcyBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtID0+IHtcbiAgcmV0dXJuIG1lc3NhZ2U/LnJvbGUgPT09ICdmdW5jdGlvbic7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUb29sTWVzc2FnZSA9IChcbiAgbWVzc2FnZTogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogbWVzc2FnZSBpcyBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW0gPT4ge1xuICByZXR1cm4gbWVzc2FnZT8ucm9sZSA9PT0gJ3Rvb2wnO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJlc2VudDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogb2JqIGlzIFQge1xuICByZXR1cm4gb2JqICE9IG51bGw7XG59XG4iLCAiaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgdHlwZSBDb21wbGV0aW9uVXNhZ2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2NvbXBsZXRpb25zXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbXBsZXRpb25zLFxuICB0eXBlIENoYXRDb21wbGV0aW9uLFxuICB0eXBlIENoYXRDb21wbGV0aW9uTWVzc2FnZSxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgdHlwZSBDaGF0Q29tcGxldGlvblRvb2wsXG59IGZyb20gXCIuLi9yZXNvdXJjZXMvY2hhdC9jb21wbGV0aW9uc1wiO1xuaW1wb3J0IHsgQVBJVXNlckFib3J0RXJyb3IsIE9wZW5BSUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG5pbXBvcnQge1xuICB0eXBlIFJ1bm5hYmxlRnVuY3Rpb24sXG4gIGlzUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZSxcbiAgdHlwZSBCYXNlRnVuY3Rpb25zQXJncyxcbn0gZnJvbSAnLi9SdW5uYWJsZUZ1bmN0aW9uJztcbmltcG9ydCB7IENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXMsIENoYXRDb21wbGV0aW9uVG9vbFJ1bm5lclBhcmFtcyB9IGZyb20gJy4vQ2hhdENvbXBsZXRpb25SdW5uZXInO1xuaW1wb3J0IHtcbiAgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtcyxcbiAgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zLFxufSBmcm9tICcuL0NoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyJztcbmltcG9ydCB7IGlzQXNzaXN0YW50TWVzc2FnZSwgaXNGdW5jdGlvbk1lc3NhZ2UsIGlzVG9vbE1lc3NhZ2UgfSBmcm9tICcuL2NoYXRDb21wbGV0aW9uVXRpbHMnO1xuXG5jb25zdCBERUZBVUxUX01BWF9DSEFUX0NPTVBMRVRJT05TID0gMTA7XG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5lck9wdGlvbnMgZXh0ZW5kcyBDb3JlLlJlcXVlc3RPcHRpb25zIHtcbiAgLyoqIEhvdyBtYW55IHJlcXVlc3RzIHRvIG1ha2UgYmVmb3JlIGNhbmNlbGluZy4gRGVmYXVsdCAxMC4gKi9cbiAgbWF4Q2hhdENvbXBsZXRpb25zPzogbnVtYmVyO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcjxcbiAgRXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4gPSBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzLFxuPiB7XG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAjY29ubmVjdGVkUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgI3Jlc29sdmVDb25uZWN0ZWRQcm9taXNlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICNyZWplY3RDb25uZWN0ZWRQcm9taXNlOiAoZXJyb3I6IE9wZW5BSUVycm9yKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgI2VuZFByb21pc2U6IFByb21pc2U8dm9pZD47XG4gICNyZXNvbHZlRW5kUHJvbWlzZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAjcmVqZWN0RW5kUHJvbWlzZTogKGVycm9yOiBPcGVuQUlFcnJvcikgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICNsaXN0ZW5lcnM6IHsgW0V2ZW50IGluIGtleW9mIEV2ZW50c10/OiBMaXN0ZW5lcnNGb3JFdmVudDxFdmVudHMsIEV2ZW50PiB9ID0ge307XG5cbiAgcHJvdGVjdGVkIF9jaGF0Q29tcGxldGlvbnM6IENoYXRDb21wbGV0aW9uW10gPSBbXTtcbiAgbWVzc2FnZXM6IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtW10gPSBbXTtcblxuICAjZW5kZWQgPSBmYWxzZTtcbiAgI2Vycm9yZWQgPSBmYWxzZTtcbiAgI2Fib3J0ZWQgPSBmYWxzZTtcbiAgI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiNjb25uZWN0ZWRQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy4jcmVzb2x2ZUNvbm5lY3RlZFByb21pc2UgPSByZXNvbHZlO1xuICAgICAgdGhpcy4jcmVqZWN0Q29ubmVjdGVkUHJvbWlzZSA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIHRoaXMuI2VuZFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLiNyZXNvbHZlRW5kUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLiNyZWplY3RFbmRQcm9taXNlID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgLy8gRG9uJ3QgbGV0IHRoZXNlIHByb21pc2VzIGNhdXNlIHVuaGFuZGxlZCByZWplY3Rpb24gZXJyb3JzLlxuICAgIC8vIHdlIHdpbGwgbWFudWFsbHkgY2F1c2UgYW4gdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvciBsYXRlclxuICAgIC8vIGlmIHRoZSB1c2VyIGhhc24ndCByZWdpc3RlcmVkIGFueSBlcnJvciBsaXN0ZW5lciBvciBjYWxsZWRcbiAgICAvLyBhbnkgcHJvbWlzZS1yZXR1cm5pbmcgbWV0aG9kLlxuICAgIHRoaXMuI2Nvbm5lY3RlZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMuI2VuZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9ydW4oZXhlY3V0b3I6ICgpID0+IFByb21pc2U8YW55Pikge1xuICAgIC8vIFVuZm9ydHVuYXRlbHkgaWYgd2UgY2FsbCBgZXhlY3V0b3IoKWAgaW1tZWRpYXRlbHkgd2UgZ2V0IHJ1bnRpbWUgZXJyb3JzIGFib3V0XG4gICAgLy8gcmVmZXJlbmNlcyB0byBgdGhpc2AgYmVmb3JlIHRoZSBgc3VwZXIoKWAgY29uc3RydWN0b3IgY2FsbCByZXR1cm5zLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZXhlY3V0b3IoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZW1pdEZpbmFsKCk7XG4gICAgICAgIHRoaXMuX2VtaXQoJ2VuZCcpO1xuICAgICAgfSwgdGhpcy4jaGFuZGxlRXJyb3IpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZGRDaGF0Q29tcGxldGlvbihjaGF0Q29tcGxldGlvbjogQ2hhdENvbXBsZXRpb24pOiBDaGF0Q29tcGxldGlvbiB7XG4gICAgdGhpcy5fY2hhdENvbXBsZXRpb25zLnB1c2goY2hhdENvbXBsZXRpb24pO1xuICAgIHRoaXMuX2VtaXQoJ2NoYXRDb21wbGV0aW9uJywgY2hhdENvbXBsZXRpb24pO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjaGF0Q29tcGxldGlvbi5jaG9pY2VzWzBdPy5tZXNzYWdlO1xuICAgIGlmIChtZXNzYWdlKSB0aGlzLl9hZGRNZXNzYWdlKG1lc3NhZ2UgYXMgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0pO1xuICAgIHJldHVybiBjaGF0Q29tcGxldGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBfYWRkTWVzc2FnZShtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSwgZW1pdCA9IHRydWUpIHtcbiAgICBpZiAoISgnY29udGVudCcgaW4gbWVzc2FnZSkpIG1lc3NhZ2UuY29udGVudCA9IG51bGw7XG5cbiAgICB0aGlzLm1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XG5cbiAgICBpZiAoZW1pdCkge1xuICAgICAgdGhpcy5fZW1pdCgnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgICAgaWYgKChpc0Z1bmN0aW9uTWVzc2FnZShtZXNzYWdlKSB8fCBpc1Rvb2xNZXNzYWdlKG1lc3NhZ2UpKSAmJiBtZXNzYWdlLmNvbnRlbnQpIHtcbiAgICAgICAgLy8gTm90ZSwgdGhpcyBhc3N1bWVzIHRoYXQge3JvbGU6ICd0b29sJywgY29udGVudDogXHUyMDI2fSBpcyBhbHdheXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgb2YgdG9vbCBvZiB0eXBlPWZ1bmN0aW9uLlxuICAgICAgICB0aGlzLl9lbWl0KCdmdW5jdGlvbkNhbGxSZXN1bHQnLCBtZXNzYWdlLmNvbnRlbnQgYXMgc3RyaW5nKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBc3Npc3RhbnRNZXNzYWdlKG1lc3NhZ2UpICYmIG1lc3NhZ2UuZnVuY3Rpb25fY2FsbCkge1xuICAgICAgICB0aGlzLl9lbWl0KCdmdW5jdGlvbkNhbGwnLCBtZXNzYWdlLmZ1bmN0aW9uX2NhbGwpO1xuICAgICAgfSBlbHNlIGlmIChpc0Fzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSkgJiYgbWVzc2FnZS50b29sX2NhbGxzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdG9vbF9jYWxsIG9mIG1lc3NhZ2UudG9vbF9jYWxscykge1xuICAgICAgICAgIGlmICh0b29sX2NhbGwudHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fZW1pdCgnZnVuY3Rpb25DYWxsJywgdG9vbF9jYWxsLmZ1bmN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Nvbm5lY3RlZCgpIHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuICAgIHRoaXMuI3Jlc29sdmVDb25uZWN0ZWRQcm9taXNlKCk7XG4gICAgdGhpcy5fZW1pdCgnY29ubmVjdCcpO1xuICB9XG5cbiAgZ2V0IGVuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNlbmRlZDtcbiAgfVxuXG4gIGdldCBlcnJvcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNlcnJvcmVkO1xuICB9XG5cbiAgZ2V0IGFib3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2Fib3J0ZWQ7XG4gIH1cblxuICBhYm9ydCgpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkgZm9yIHRoZSBldmVudC5cbiAgICogTm8gY2hlY2tzIGFyZSBtYWRlIHRvIHNlZSBpZiB0aGUgbGlzdGVuZXIgaGFzIGFscmVhZHkgYmVlbiBhZGRlZC4gTXVsdGlwbGUgY2FsbHMgcGFzc2luZ1xuICAgKiB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiBldmVudCBhbmQgbGlzdGVuZXIgd2lsbCByZXN1bHQgaW4gdGhlIGxpc3RlbmVyIGJlaW5nIGFkZGVkLCBhbmRcbiAgICogY2FsbGVkLCBtdWx0aXBsZSB0aW1lcy5cbiAgICogQHJldHVybnMgdGhpcyBDaGF0Q29tcGxldGlvblN0cmVhbSwgc28gdGhhdCBjYWxscyBjYW4gYmUgY2hhaW5lZFxuICAgKi9cbiAgb248RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4pOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+ID1cbiAgICAgIHRoaXMuI2xpc3RlbmVyc1tldmVudF0gfHwgKHRoaXMuI2xpc3RlbmVyc1tldmVudF0gPSBbXSk7XG4gICAgbGlzdGVuZXJzLnB1c2goeyBsaXN0ZW5lciB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgYXJyYXkgZm9yIHRoZSBldmVudC5cbiAgICogb2ZmKCkgd2lsbCByZW1vdmUsIGF0IG1vc3QsIG9uZSBpbnN0YW5jZSBvZiBhIGxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGFycmF5LiBJZiBhbnkgc2luZ2xlXG4gICAqIGxpc3RlbmVyIGhhcyBiZWVuIGFkZGVkIG11bHRpcGxlIHRpbWVzIHRvIHRoZSBsaXN0ZW5lciBhcnJheSBmb3IgdGhlIHNwZWNpZmllZCBldmVudCwgdGhlblxuICAgKiBvZmYoKSBtdXN0IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byByZW1vdmUgZWFjaCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgdGhpcyBDaGF0Q29tcGxldGlvblN0cmVhbSwgc28gdGhhdCBjYWxscyBjYW4gYmUgY2hhaW5lZFxuICAgKi9cbiAgb2ZmPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogRXZlbnQsIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+KTogdGhpcyB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy4jbGlzdGVuZXJzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuZmluZEluZGV4KChsKSA9PiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ID49IDApIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBvbmUtdGltZSBsaXN0ZW5lciBmdW5jdGlvbiBmb3IgdGhlIGV2ZW50LiBUaGUgbmV4dCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQsXG4gICAqIHRoaXMgbGlzdGVuZXIgaXMgcmVtb3ZlZCBhbmQgdGhlbiBpbnZva2VkLlxuICAgKiBAcmV0dXJucyB0aGlzIENoYXRDb21wbGV0aW9uU3RyZWFtLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkXG4gICAqL1xuICBvbmNlPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogRXZlbnQsIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+KTogdGhpcyB7XG4gICAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcnNGb3JFdmVudDxFdmVudHMsIEV2ZW50PiA9XG4gICAgICB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdIHx8ICh0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdID0gW10pO1xuICAgIGxpc3RlbmVycy5wdXNoKHsgbGlzdGVuZXIsIG9uY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGAub25jZSgpYCwgYnV0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdGhlIG5leHQgdGltZVxuICAgKiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLCBpbnN0ZWFkIG9mIGNhbGxpbmcgYSBsaXN0ZW5lciBjYWxsYmFjay5cbiAgICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdGhlIG5leHQgdGltZSBnaXZlbiBldmVudCBpcyB0cmlnZ2VyZWQsXG4gICAqIG9yIHJlamVjdHMgaWYgYW4gZXJyb3IgaXMgZW1pdHRlZC4gIChJZiB5b3UgcmVxdWVzdCB0aGUgJ2Vycm9yJyBldmVudCxcbiAgICogcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBlcnJvcikuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0cmVhbS5lbWl0dGVkKCdtZXNzYWdlJykgLy8gcmVqZWN0cyBpZiB0aGUgc3RyZWFtIGVycm9yc1xuICAgKi9cbiAgZW1pdHRlZDxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnQ6IEV2ZW50LFxuICApOiBQcm9taXNlPFxuICAgIEV2ZW50UGFyYW1ldGVyczxFdmVudHMsIEV2ZW50PiBleHRlbmRzIFtpbmZlciBQYXJhbV0gPyBQYXJhbVxuICAgIDogRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cywgRXZlbnQ+IGV4dGVuZHMgW10gPyB2b2lkXG4gICAgOiBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD5cbiAgPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgPSB0cnVlO1xuICAgICAgaWYgKGV2ZW50ICE9PSAnZXJyb3InKSB0aGlzLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIHRoaXMub25jZShldmVudCwgcmVzb2x2ZSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZG9uZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLiNjYXRjaGluZ1Byb21pc2VDcmVhdGVkID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLiNlbmRQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGZpbmFsIENoYXRDb21wbGV0aW9uLCBvciByZWplY3RzXG4gICAqIGlmIGFuIGVycm9yIG9jY3VycmVkIG9yIHRoZSBzdHJlYW0gZW5kZWQgcHJlbWF0dXJlbHkgd2l0aG91dCBwcm9kdWNpbmcgYSBDaGF0Q29tcGxldGlvbi5cbiAgICovXG4gIGFzeW5jIGZpbmFsQ2hhdENvbXBsZXRpb24oKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLl9jaGF0Q29tcGxldGlvbnNbdGhpcy5fY2hhdENvbXBsZXRpb25zLmxlbmd0aCAtIDFdO1xuICAgIGlmICghY29tcGxldGlvbikgdGhyb3cgbmV3IE9wZW5BSUVycm9yKCdzdHJlYW0gZW5kZWQgd2l0aG91dCBwcm9kdWNpbmcgYSBDaGF0Q29tcGxldGlvbicpO1xuICAgIHJldHVybiBjb21wbGV0aW9uO1xuICB9XG5cbiAgI2dldEZpbmFsQ29udGVudCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy4jZ2V0RmluYWxNZXNzYWdlKCkuY29udGVudCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIGZpbmFsIENoYXRDb21wbGV0aW9uTWVzc2FnZSwgb3IgcmVqZWN0c1xuICAgKiBpZiBhbiBlcnJvciBvY2N1cnJlZCBvciB0aGUgc3RyZWFtIGVuZGVkIHByZW1hdHVyZWx5IHdpdGhvdXQgcHJvZHVjaW5nIGEgQ2hhdENvbXBsZXRpb25NZXNzYWdlLlxuICAgKi9cbiAgYXN5bmMgZmluYWxDb250ZW50KCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuICAgIHJldHVybiB0aGlzLiNnZXRGaW5hbENvbnRlbnQoKTtcbiAgfVxuXG4gICNnZXRGaW5hbE1lc3NhZ2UoKTogQ2hhdENvbXBsZXRpb25NZXNzYWdlIHtcbiAgICBsZXQgaSA9IHRoaXMubWVzc2FnZXMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1tpXTtcbiAgICAgIGlmIChpc0Fzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgY29udGVudDogbWVzc2FnZS5jb250ZW50ID8/IG51bGwgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKCdzdHJlYW0gZW5kZWQgd2l0aG91dCBwcm9kdWNpbmcgYSBDaGF0Q29tcGxldGlvbk1lc3NhZ2Ugd2l0aCByb2xlPWFzc2lzdGFudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRoZSBmaW5hbCBhc3Npc3RhbnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlIHJlc3BvbnNlLFxuICAgKiBvciByZWplY3RzIGlmIGFuIGVycm9yIG9jY3VycmVkIG9yIHRoZSBzdHJlYW0gZW5kZWQgcHJlbWF0dXJlbHkgd2l0aG91dCBwcm9kdWNpbmcgYSBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuXG4gICAqL1xuICBhc3luYyBmaW5hbE1lc3NhZ2UoKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvbk1lc3NhZ2U+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICByZXR1cm4gdGhpcy4jZ2V0RmluYWxNZXNzYWdlKCk7XG4gIH1cblxuICAjZ2V0RmluYWxGdW5jdGlvbkNhbGwoKTogQ2hhdENvbXBsZXRpb25NZXNzYWdlLkZ1bmN0aW9uQ2FsbCB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubWVzc2FnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW2ldO1xuICAgICAgaWYgKGlzQXNzaXN0YW50TWVzc2FnZShtZXNzYWdlKSAmJiBtZXNzYWdlPy5mdW5jdGlvbl9jYWxsKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlLmZ1bmN0aW9uX2NhbGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNBc3Npc3RhbnRNZXNzYWdlKG1lc3NhZ2UpICYmIG1lc3NhZ2U/LnRvb2xfY2FsbHM/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS50b29sX2NhbGxzLmF0KC0xKT8uZnVuY3Rpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIGZpbmFsIEZ1bmN0aW9uQ2FsbCwgb3IgcmVqZWN0c1xuICAgKiBpZiBhbiBlcnJvciBvY2N1cnJlZCBvciB0aGUgc3RyZWFtIGVuZGVkIHByZW1hdHVyZWx5IHdpdGhvdXQgcHJvZHVjaW5nIGEgQ2hhdENvbXBsZXRpb25NZXNzYWdlLlxuICAgKi9cbiAgYXN5bmMgZmluYWxGdW5jdGlvbkNhbGwoKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvbk1lc3NhZ2UuRnVuY3Rpb25DYWxsIHwgdW5kZWZpbmVkPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG4gICAgcmV0dXJuIHRoaXMuI2dldEZpbmFsRnVuY3Rpb25DYWxsKCk7XG4gIH1cblxuICAjZ2V0RmluYWxGdW5jdGlvbkNhbGxSZXN1bHQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5tZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMubWVzc2FnZXNbaV07XG4gICAgICBpZiAoaXNGdW5jdGlvbk1lc3NhZ2UobWVzc2FnZSkgJiYgbWVzc2FnZS5jb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuY29udGVudDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgaXNUb29sTWVzc2FnZShtZXNzYWdlKSAmJlxuICAgICAgICBtZXNzYWdlLmNvbnRlbnQgIT0gbnVsbCAmJlxuICAgICAgICB0aGlzLm1lc3NhZ2VzLnNvbWUoXG4gICAgICAgICAgKHgpID0+XG4gICAgICAgICAgICB4LnJvbGUgPT09ICdhc3Npc3RhbnQnICYmXG4gICAgICAgICAgICB4LnRvb2xfY2FsbHM/LnNvbWUoKHkpID0+IHkudHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB5LmlkID09PSBtZXNzYWdlLnRvb2xfY2FsbF9pZCksXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGFzeW5jIGZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0KCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG4gICAgcmV0dXJuIHRoaXMuI2dldEZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0KCk7XG4gIH1cblxuICAjY2FsY3VsYXRlVG90YWxVc2FnZSgpOiBDb21wbGV0aW9uVXNhZ2Uge1xuICAgIGNvbnN0IHRvdGFsOiBDb21wbGV0aW9uVXNhZ2UgPSB7XG4gICAgICBjb21wbGV0aW9uX3Rva2VuczogMCxcbiAgICAgIHByb21wdF90b2tlbnM6IDAsXG4gICAgICB0b3RhbF90b2tlbnM6IDAsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHsgdXNhZ2UgfSBvZiB0aGlzLl9jaGF0Q29tcGxldGlvbnMpIHtcbiAgICAgIGlmICh1c2FnZSkge1xuICAgICAgICB0b3RhbC5jb21wbGV0aW9uX3Rva2VucyArPSB1c2FnZS5jb21wbGV0aW9uX3Rva2VucztcbiAgICAgICAgdG90YWwucHJvbXB0X3Rva2VucyArPSB1c2FnZS5wcm9tcHRfdG9rZW5zO1xuICAgICAgICB0b3RhbC50b3RhbF90b2tlbnMgKz0gdXNhZ2UudG90YWxfdG9rZW5zO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG90YWw7XG4gIH1cblxuICBhc3luYyB0b3RhbFVzYWdlKCk6IFByb21pc2U8Q29tcGxldGlvblVzYWdlPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG4gICAgcmV0dXJuIHRoaXMuI2NhbGN1bGF0ZVRvdGFsVXNhZ2UoKTtcbiAgfVxuXG4gIGFsbENoYXRDb21wbGV0aW9ucygpOiBDaGF0Q29tcGxldGlvbltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX2NoYXRDb21wbGV0aW9uc107XG4gIH1cblxuICAjaGFuZGxlRXJyb3IgPSAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICB0aGlzLiNlcnJvcmVkID0gdHJ1ZTtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgIGVycm9yID0gbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFQSVVzZXJBYm9ydEVycm9yKSB7XG4gICAgICB0aGlzLiNhYm9ydGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLl9lbWl0KCdhYm9ydCcsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgT3BlbkFJRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IG9wZW5BSUVycm9yOiBPcGVuQUlFcnJvciA9IG5ldyBPcGVuQUlFcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG9wZW5BSUVycm9yLmNhdXNlID0gZXJyb3I7XG4gICAgICByZXR1cm4gdGhpcy5fZW1pdCgnZXJyb3InLCBvcGVuQUlFcnJvcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9lbWl0KCdlcnJvcicsIG5ldyBPcGVuQUlFcnJvcihTdHJpbmcoZXJyb3IpKSk7XG4gIH07XG5cbiAgcHJvdGVjdGVkIF9lbWl0PEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogRXZlbnQsIC4uLmFyZ3M6IEV2ZW50UGFyYW1ldGVyczxFdmVudHMsIEV2ZW50Pikge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBlbWl0IGFueSBldmVudHMgYWZ0ZXIgZW5kXG4gICAgaWYgKHRoaXMuI2VuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnZW5kJykge1xuICAgICAgdGhpcy4jZW5kZWQgPSB0cnVlO1xuICAgICAgdGhpcy4jcmVzb2x2ZUVuZFByb21pc2UoKTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ZW5lcnM6IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+IHwgdW5kZWZpbmVkID0gdGhpcy4jbGlzdGVuZXJzW2V2ZW50XTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdID0gbGlzdGVuZXJzLmZpbHRlcigobCkgPT4gIWwub25jZSkgYXMgYW55O1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKHsgbGlzdGVuZXIgfTogYW55KSA9PiBsaXN0ZW5lciguLi5hcmdzKSk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnYWJvcnQnKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGFyZ3NbMF0gYXMgQVBJVXNlckFib3J0RXJyb3I7XG4gICAgICBpZiAoIXRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgJiYgIWxpc3RlbmVycz8ubGVuZ3RoKSB7XG4gICAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3JlamVjdENvbm5lY3RlZFByb21pc2UoZXJyb3IpO1xuICAgICAgdGhpcy4jcmVqZWN0RW5kUHJvbWlzZShlcnJvcik7XG4gICAgICB0aGlzLl9lbWl0KCdlbmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIE5PVEU6IF9lbWl0KCdlcnJvcicsIGVycm9yKSBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSAjaGFuZGxlRXJyb3IoKS5cblxuICAgICAgY29uc3QgZXJyb3IgPSBhcmdzWzBdIGFzIE9wZW5BSUVycm9yO1xuICAgICAgaWYgKCF0aGlzLiNjYXRjaGluZ1Byb21pc2VDcmVhdGVkICYmICFsaXN0ZW5lcnM/Lmxlbmd0aCkge1xuICAgICAgICAvLyBUcmlnZ2VyIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gaWYgdGhlIHVzZXIgaGFzbid0IHJlZ2lzdGVyZWQgYW55IGVycm9yIGhhbmRsZXJzLlxuICAgICAgICAvLyBJZiB5b3UgYXJlIHNlZWluZyBzdGFjayB0cmFjZXMgaGVyZSwgbWFrZSBzdXJlIHRvIGhhbmRsZSBlcnJvcnMgdmlhIGVpdGhlcjpcbiAgICAgICAgLy8gLSBydW5uZXIub24oJ2Vycm9yJywgKCkgPT4gLi4uKVxuICAgICAgICAvLyAtIGF3YWl0IHJ1bm5lci5kb25lKClcbiAgICAgICAgLy8gLSBhd2FpdCBydW5uZXIuZmluYWxDaGF0Q29tcGxldGlvbigpXG4gICAgICAgIC8vIC0gZXRjLlxuICAgICAgICBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLiNyZWplY3RDb25uZWN0ZWRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuI3JlamVjdEVuZFByb21pc2UoZXJyb3IpO1xuICAgICAgdGhpcy5fZW1pdCgnZW5kJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9lbWl0RmluYWwoKSB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMuX2NoYXRDb21wbGV0aW9uc1t0aGlzLl9jaGF0Q29tcGxldGlvbnMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGNvbXBsZXRpb24pIHRoaXMuX2VtaXQoJ2ZpbmFsQ2hhdENvbXBsZXRpb24nLCBjb21wbGV0aW9uKTtcbiAgICBjb25zdCBmaW5hbE1lc3NhZ2UgPSB0aGlzLiNnZXRGaW5hbE1lc3NhZ2UoKTtcbiAgICBpZiAoZmluYWxNZXNzYWdlKSB0aGlzLl9lbWl0KCdmaW5hbE1lc3NhZ2UnLCBmaW5hbE1lc3NhZ2UpO1xuICAgIGNvbnN0IGZpbmFsQ29udGVudCA9IHRoaXMuI2dldEZpbmFsQ29udGVudCgpO1xuICAgIGlmIChmaW5hbENvbnRlbnQpIHRoaXMuX2VtaXQoJ2ZpbmFsQ29udGVudCcsIGZpbmFsQ29udGVudCk7XG5cbiAgICBjb25zdCBmaW5hbEZ1bmN0aW9uQ2FsbCA9IHRoaXMuI2dldEZpbmFsRnVuY3Rpb25DYWxsKCk7XG4gICAgaWYgKGZpbmFsRnVuY3Rpb25DYWxsKSB0aGlzLl9lbWl0KCdmaW5hbEZ1bmN0aW9uQ2FsbCcsIGZpbmFsRnVuY3Rpb25DYWxsKTtcblxuICAgIGNvbnN0IGZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0ID0gdGhpcy4jZ2V0RmluYWxGdW5jdGlvbkNhbGxSZXN1bHQoKTtcbiAgICBpZiAoZmluYWxGdW5jdGlvbkNhbGxSZXN1bHQgIT0gbnVsbCkgdGhpcy5fZW1pdCgnZmluYWxGdW5jdGlvbkNhbGxSZXN1bHQnLCBmaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCk7XG5cbiAgICBpZiAodGhpcy5fY2hhdENvbXBsZXRpb25zLnNvbWUoKGMpID0+IGMudXNhZ2UpKSB7XG4gICAgICB0aGlzLl9lbWl0KCd0b3RhbFVzYWdlJywgdGhpcy4jY2FsY3VsYXRlVG90YWxVc2FnZSgpKTtcbiAgICB9XG4gIH1cblxuICAjdmFsaWRhdGVQYXJhbXMocGFyYW1zOiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChwYXJhbXMubiAhPSBudWxsICYmIHBhcmFtcy5uID4gMSkge1xuICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFxuICAgICAgICAnQ2hhdENvbXBsZXRpb24gY29udmVuaWVuY2UgaGVscGVycyBvbmx5IHN1cHBvcnQgbj0xIGF0IHRoaXMgdGltZS4gVG8gdXNlIG4+MSwgcGxlYXNlIHVzZSBjaGF0LmNvbXBsZXRpb25zLmNyZWF0ZSgpIGRpcmVjdGx5LicsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfY3JlYXRlQ2hhdENvbXBsZXRpb24oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8Q2hhdENvbXBsZXRpb24+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG4gICAgdGhpcy4jdmFsaWRhdGVQYXJhbXMocGFyYW1zKTtcblxuICAgIGNvbnN0IGNoYXRDb21wbGV0aW9uID0gYXdhaXQgY29tcGxldGlvbnMuY3JlYXRlKFxuICAgICAgeyAuLi5wYXJhbXMsIHN0cmVhbTogZmFsc2UgfSxcbiAgICAgIHsgLi4ub3B0aW9ucywgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgKTtcbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hhdENvbXBsZXRpb24oY2hhdENvbXBsZXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9ydW5DaGF0Q29tcGxldGlvbihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4ge1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBwYXJhbXMubWVzc2FnZXMpIHtcbiAgICAgIHRoaXMuX2FkZE1lc3NhZ2UobWVzc2FnZSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY3JlYXRlQ2hhdENvbXBsZXRpb24oY29tcGxldGlvbnMsIHBhcmFtcywgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX3J1bkZ1bmN0aW9uczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6XG4gICAgICB8IENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz5cbiAgICAgIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogUnVubmVyT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgcm9sZSA9ICdmdW5jdGlvbicgYXMgY29uc3Q7XG4gICAgY29uc3QgeyBmdW5jdGlvbl9jYWxsID0gJ2F1dG8nLCBzdHJlYW0sIC4uLnJlc3RQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBzaW5nbGVGdW5jdGlvblRvQ2FsbCA9IHR5cGVvZiBmdW5jdGlvbl9jYWxsICE9PSAnc3RyaW5nJyAmJiBmdW5jdGlvbl9jYWxsPy5uYW1lO1xuICAgIGNvbnN0IHsgbWF4Q2hhdENvbXBsZXRpb25zID0gREVGQVVMVF9NQVhfQ0hBVF9DT01QTEVUSU9OUyB9ID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uc0J5TmFtZTogUmVjb3JkPHN0cmluZywgUnVubmFibGVGdW5jdGlvbjxhbnk+PiA9IHt9O1xuICAgIGZvciAoY29uc3QgZiBvZiBwYXJhbXMuZnVuY3Rpb25zKSB7XG4gICAgICBmdW5jdGlvbnNCeU5hbWVbZi5uYW1lIHx8IGYuZnVuY3Rpb24ubmFtZV0gPSBmO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bmN0aW9uczogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMuRnVuY3Rpb25bXSA9IHBhcmFtcy5mdW5jdGlvbnMubWFwKFxuICAgICAgKGYpOiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcy5GdW5jdGlvbiA9PiAoe1xuICAgICAgICBuYW1lOiBmLm5hbWUgfHwgZi5mdW5jdGlvbi5uYW1lLFxuICAgICAgICBwYXJhbWV0ZXJzOiBmLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBmLmRlc2NyaXB0aW9uLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBwYXJhbXMubWVzc2FnZXMpIHtcbiAgICAgIHRoaXMuX2FkZE1lc3NhZ2UobWVzc2FnZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4Q2hhdENvbXBsZXRpb25zOyArK2kpIHtcbiAgICAgIGNvbnN0IGNoYXRDb21wbGV0aW9uOiBDaGF0Q29tcGxldGlvbiA9IGF3YWl0IHRoaXMuX2NyZWF0ZUNoYXRDb21wbGV0aW9uKFxuICAgICAgICBjb21wbGV0aW9ucyxcbiAgICAgICAge1xuICAgICAgICAgIC4uLnJlc3RQYXJhbXMsXG4gICAgICAgICAgZnVuY3Rpb25fY2FsbCxcbiAgICAgICAgICBmdW5jdGlvbnMsXG4gICAgICAgICAgbWVzc2FnZXM6IFsuLi50aGlzLm1lc3NhZ2VzXSxcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gY2hhdENvbXBsZXRpb24uY2hvaWNlc1swXT8ubWVzc2FnZTtcbiAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3NpbmcgbWVzc2FnZSBpbiBDaGF0Q29tcGxldGlvbiByZXNwb25zZWApO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXNzYWdlLmZ1bmN0aW9uX2NhbGwpIHJldHVybjtcbiAgICAgIGNvbnN0IHsgbmFtZSwgYXJndW1lbnRzOiBhcmdzIH0gPSBtZXNzYWdlLmZ1bmN0aW9uX2NhbGw7XG4gICAgICBjb25zdCBmbiA9IGZ1bmN0aW9uc0J5TmFtZVtuYW1lXTtcbiAgICAgIGlmICghZm4pIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGBJbnZhbGlkIGZ1bmN0aW9uX2NhbGw6ICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9LiBBdmFpbGFibGUgb3B0aW9ucyBhcmU6ICR7ZnVuY3Rpb25zXG4gICAgICAgICAgLm1hcCgoZikgPT4gSlNPTi5zdHJpbmdpZnkoZi5uYW1lKSlcbiAgICAgICAgICAuam9pbignLCAnKX0uIFBsZWFzZSB0cnkgYWdhaW5gO1xuXG4gICAgICAgIHRoaXMuX2FkZE1lc3NhZ2UoeyByb2xlLCBuYW1lLCBjb250ZW50IH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoc2luZ2xlRnVuY3Rpb25Ub0NhbGwgJiYgc2luZ2xlRnVuY3Rpb25Ub0NhbGwgIT09IG5hbWUpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGBJbnZhbGlkIGZ1bmN0aW9uX2NhbGw6ICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9LiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHNpbmdsZUZ1bmN0aW9uVG9DYWxsLFxuICAgICAgICApfSByZXF1ZXN0ZWQuIFBsZWFzZSB0cnkgYWdhaW5gO1xuXG4gICAgICAgIHRoaXMuX2FkZE1lc3NhZ2UoeyByb2xlLCBuYW1lLCBjb250ZW50IH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IHBhcnNlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZCA9IGlzUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZShmbikgPyBhd2FpdCBmbi5wYXJzZShhcmdzKSA6IGFyZ3M7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKHtcbiAgICAgICAgICByb2xlLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgY29udGVudDogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaXQgY2FuJ3QgcnVsZSBvdXQgYG5ldmVyYCB0eXBlLlxuICAgICAgY29uc3QgcmF3Q29udGVudCA9IGF3YWl0IGZuLmZ1bmN0aW9uKHBhcnNlZCwgdGhpcyk7XG4gICAgICBjb25zdCBjb250ZW50ID0gdGhpcy4jc3RyaW5naWZ5RnVuY3Rpb25DYWxsUmVzdWx0KHJhd0NvbnRlbnQpO1xuXG4gICAgICB0aGlzLl9hZGRNZXNzYWdlKHsgcm9sZSwgbmFtZSwgY29udGVudCB9KTtcblxuICAgICAgaWYgKHNpbmdsZUZ1bmN0aW9uVG9DYWxsKSByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9ydW5Ub29sczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6XG4gICAgICB8IENoYXRDb21wbGV0aW9uVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPlxuICAgICAgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IFJ1bm5lck9wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHJvbGUgPSAndG9vbCcgYXMgY29uc3Q7XG4gICAgY29uc3QgeyB0b29sX2Nob2ljZSA9ICdhdXRvJywgc3RyZWFtLCAuLi5yZXN0UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3Qgc2luZ2xlRnVuY3Rpb25Ub0NhbGwgPSB0eXBlb2YgdG9vbF9jaG9pY2UgIT09ICdzdHJpbmcnICYmIHRvb2xfY2hvaWNlPy5mdW5jdGlvbj8ubmFtZTtcbiAgICBjb25zdCB7IG1heENoYXRDb21wbGV0aW9ucyA9IERFRkFVTFRfTUFYX0NIQVRfQ09NUExFVElPTlMgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgICBjb25zdCBmdW5jdGlvbnNCeU5hbWU6IFJlY29yZDxzdHJpbmcsIFJ1bm5hYmxlRnVuY3Rpb248YW55Pj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGYgb2YgcGFyYW1zLnRvb2xzKSB7XG4gICAgICBpZiAoZi50eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZ1bmN0aW9uc0J5TmFtZVtmLmZ1bmN0aW9uLm5hbWUgfHwgZi5mdW5jdGlvbi5mdW5jdGlvbi5uYW1lXSA9IGYuZnVuY3Rpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdG9vbHM6IENoYXRDb21wbGV0aW9uVG9vbFtdID1cbiAgICAgICd0b29scycgaW4gcGFyYW1zID9cbiAgICAgICAgcGFyYW1zLnRvb2xzLm1hcCgodCkgPT5cbiAgICAgICAgICB0LnR5cGUgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgICBmdW5jdGlvbjoge1xuICAgICAgICAgICAgICAgIG5hbWU6IHQuZnVuY3Rpb24ubmFtZSB8fCB0LmZ1bmN0aW9uLmZ1bmN0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczogdC5mdW5jdGlvbi5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0LmZ1bmN0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogKHQgYXMgdW5rbm93biBhcyBDaGF0Q29tcGxldGlvblRvb2wpLFxuICAgICAgICApXG4gICAgICA6ICh1bmRlZmluZWQgYXMgYW55KTtcblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBwYXJhbXMubWVzc2FnZXMpIHtcbiAgICAgIHRoaXMuX2FkZE1lc3NhZ2UobWVzc2FnZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4Q2hhdENvbXBsZXRpb25zOyArK2kpIHtcbiAgICAgIGNvbnN0IGNoYXRDb21wbGV0aW9uOiBDaGF0Q29tcGxldGlvbiA9IGF3YWl0IHRoaXMuX2NyZWF0ZUNoYXRDb21wbGV0aW9uKFxuICAgICAgICBjb21wbGV0aW9ucyxcbiAgICAgICAge1xuICAgICAgICAgIC4uLnJlc3RQYXJhbXMsXG4gICAgICAgICAgdG9vbF9jaG9pY2UsXG4gICAgICAgICAgdG9vbHMsXG4gICAgICAgICAgbWVzc2FnZXM6IFsuLi50aGlzLm1lc3NhZ2VzXSxcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gY2hhdENvbXBsZXRpb24uY2hvaWNlc1swXT8ubWVzc2FnZTtcbiAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3NpbmcgbWVzc2FnZSBpbiBDaGF0Q29tcGxldGlvbiByZXNwb25zZWApO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXNzYWdlLnRvb2xfY2FsbHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHRvb2xfY2FsbCBvZiBtZXNzYWdlLnRvb2xfY2FsbHMpIHtcbiAgICAgICAgaWYgKHRvb2xfY2FsbC50eXBlICE9PSAnZnVuY3Rpb24nKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgdG9vbF9jYWxsX2lkID0gdG9vbF9jYWxsLmlkO1xuICAgICAgICBjb25zdCB7IG5hbWUsIGFyZ3VtZW50czogYXJncyB9ID0gdG9vbF9jYWxsLmZ1bmN0aW9uO1xuICAgICAgICBjb25zdCBmbiA9IGZ1bmN0aW9uc0J5TmFtZVtuYW1lXTtcblxuICAgICAgICBpZiAoIWZuKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGBJbnZhbGlkIHRvb2xfY2FsbDogJHtKU09OLnN0cmluZ2lmeShuYW1lKX0uIEF2YWlsYWJsZSBvcHRpb25zIGFyZTogJHt0b29sc1xuICAgICAgICAgICAgLm1hcCgoZikgPT4gSlNPTi5zdHJpbmdpZnkoZi5mdW5jdGlvbi5uYW1lKSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpfS4gUGxlYXNlIHRyeSBhZ2FpbmA7XG5cbiAgICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKHsgcm9sZSwgdG9vbF9jYWxsX2lkLCBjb250ZW50IH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHNpbmdsZUZ1bmN0aW9uVG9DYWxsICYmIHNpbmdsZUZ1bmN0aW9uVG9DYWxsICE9PSBuYW1lKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGBJbnZhbGlkIHRvb2xfY2FsbDogJHtKU09OLnN0cmluZ2lmeShuYW1lKX0uICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBzaW5nbGVGdW5jdGlvblRvQ2FsbCxcbiAgICAgICAgICApfSByZXF1ZXN0ZWQuIFBsZWFzZSB0cnkgYWdhaW5gO1xuXG4gICAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIHRvb2xfY2FsbF9pZCwgY29udGVudCB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJzZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyc2VkID0gaXNSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlKGZuKSA/IGF3YWl0IGZuLnBhcnNlKGFyZ3MpIDogYXJncztcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICAgIHRoaXMuX2FkZE1lc3NhZ2UoeyByb2xlLCB0b29sX2NhbGxfaWQsIGNvbnRlbnQgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGl0IGNhbid0IHJ1bGUgb3V0IGBuZXZlcmAgdHlwZS5cbiAgICAgICAgY29uc3QgcmF3Q29udGVudCA9IGF3YWl0IGZuLmZ1bmN0aW9uKHBhcnNlZCwgdGhpcyk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLiNzdHJpbmdpZnlGdW5jdGlvbkNhbGxSZXN1bHQocmF3Q29udGVudCk7XG4gICAgICAgIHRoaXMuX2FkZE1lc3NhZ2UoeyByb2xlLCB0b29sX2NhbGxfaWQsIGNvbnRlbnQgfSk7XG5cbiAgICAgICAgaWYgKHNpbmdsZUZ1bmN0aW9uVG9DYWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgI3N0cmluZ2lmeUZ1bmN0aW9uQ2FsbFJlc3VsdChyYXdDb250ZW50OiB1bmtub3duKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHJhd0NvbnRlbnQgPT09ICdzdHJpbmcnID8gcmF3Q29udGVudFxuICAgICAgOiByYXdDb250ZW50ID09PSB1bmRlZmluZWQgPyAndW5kZWZpbmVkJ1xuICAgICAgOiBKU09OLnN0cmluZ2lmeShyYXdDb250ZW50KVxuICAgICk7XG4gIH1cbn1cblxudHlwZSBDdXN0b21FdmVudHM8RXZlbnQgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBbayBpbiBFdmVudF06IGsgZXh0ZW5kcyBrZXlvZiBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzID8gQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50c1trXVxuICA6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbn07XG5cbnR5cGUgTGlzdGVuZXJGb3JFdmVudDxFdmVudHMgZXh0ZW5kcyBDdXN0b21FdmVudHM8YW55PiwgRXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+ID0gRXZlbnQgZXh0ZW5kcyAoXG4gIGtleW9mIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHNcbikgP1xuICBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzW0V2ZW50XVxuOiBFdmVudHNbRXZlbnRdO1xuXG50eXBlIExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cyBleHRlbmRzIEN1c3RvbUV2ZW50czxhbnk+LCBFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4gPSBBcnJheTx7XG4gIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+O1xuICBvbmNlPzogYm9vbGVhbjtcbn0+O1xudHlwZSBFdmVudFBhcmFtZXRlcnM8RXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4sIEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPiA9IFBhcmFtZXRlcnM8XG4gIExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD5cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyB7XG4gIGNvbm5lY3Q6ICgpID0+IHZvaWQ7XG4gIGZ1bmN0aW9uQ2FsbDogKGZ1bmN0aW9uQ2FsbDogQ2hhdENvbXBsZXRpb25NZXNzYWdlLkZ1bmN0aW9uQ2FsbCkgPT4gdm9pZDtcbiAgbWVzc2FnZTogKG1lc3NhZ2U6IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtKSA9PiB2b2lkO1xuICBjaGF0Q29tcGxldGlvbjogKGNvbXBsZXRpb246IENoYXRDb21wbGV0aW9uKSA9PiB2b2lkO1xuICBmaW5hbENvbnRlbnQ6IChjb250ZW50U25hcHNob3Q6IHN0cmluZykgPT4gdm9pZDtcbiAgZmluYWxNZXNzYWdlOiAobWVzc2FnZTogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0pID0+IHZvaWQ7XG4gIGZpbmFsQ2hhdENvbXBsZXRpb246IChjb21wbGV0aW9uOiBDaGF0Q29tcGxldGlvbikgPT4gdm9pZDtcbiAgZmluYWxGdW5jdGlvbkNhbGw6IChmdW5jdGlvbkNhbGw6IENoYXRDb21wbGV0aW9uTWVzc2FnZS5GdW5jdGlvbkNhbGwpID0+IHZvaWQ7XG4gIGZ1bmN0aW9uQ2FsbFJlc3VsdDogKGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZDtcbiAgZmluYWxGdW5jdGlvbkNhbGxSZXN1bHQ6IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGVycm9yOiAoZXJyb3I6IE9wZW5BSUVycm9yKSA9PiB2b2lkO1xuICBhYm9ydDogKGVycm9yOiBBUElVc2VyQWJvcnRFcnJvcikgPT4gdm9pZDtcbiAgZW5kOiAoKSA9PiB2b2lkO1xuICB0b3RhbFVzYWdlOiAodXNhZ2U6IENvbXBsZXRpb25Vc2FnZSkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge1xuICB0eXBlIENvbXBsZXRpb25zLFxuICB0eXBlIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nLFxufSBmcm9tIFwiLi4vcmVzb3VyY2VzL2NoYXQvY29tcGxldGlvbnNcIjtcbmltcG9ydCB7IHR5cGUgUnVubmFibGVGdW5jdGlvbnMsIHR5cGUgQmFzZUZ1bmN0aW9uc0FyZ3MsIFJ1bm5hYmxlVG9vbHMgfSBmcm9tICcuL1J1bm5hYmxlRnVuY3Rpb24nO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcixcbiAgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyxcbiAgUnVubmVyT3B0aW9ucyxcbn0gZnJvbSAnLi9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyJztcbmltcG9ydCB7IGlzQXNzaXN0YW50TWVzc2FnZSB9IGZyb20gJy4vY2hhdENvbXBsZXRpb25VdGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMgZXh0ZW5kcyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzIHtcbiAgY29udGVudDogKGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+ID0gT21pdDxcbiAgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsXG4gICdmdW5jdGlvbnMnXG4+ICYge1xuICBmdW5jdGlvbnM6IFJ1bm5hYmxlRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3M+O1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4gPSBPbWl0PFxuICBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyxcbiAgJ3Rvb2xzJ1xuPiAmIHtcbiAgdG9vbHM6IFJ1bm5hYmxlVG9vbHM8RnVuY3Rpb25zQXJncz47XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBsZXRpb25SdW5uZXIgZXh0ZW5kcyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyPENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzPiB7XG4gIC8qKiBAZGVwcmVjYXRlZCAtIHBsZWFzZSB1c2UgYHJ1blRvb2xzYCBpbnN0ZWFkLiAqL1xuICBzdGF0aWMgcnVuRnVuY3Rpb25zKFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6IENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXM8YW55W10+LFxuICAgIG9wdGlvbnM/OiBSdW5uZXJPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblJ1bm5lciB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IENoYXRDb21wbGV0aW9uUnVubmVyKCk7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3J1bkZ1bmN0aW9ucycgfSxcbiAgICB9O1xuICAgIHJ1bm5lci5fcnVuKCgpID0+IHJ1bm5lci5fcnVuRnVuY3Rpb25zKGNvbXBsZXRpb25zLCBwYXJhbXMsIG9wdHMpKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgc3RhdGljIHJ1blRvb2xzKFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6IENoYXRDb21wbGV0aW9uVG9vbFJ1bm5lclBhcmFtczxhbnlbXT4sXG4gICAgb3B0aW9ucz86IFJ1bm5lck9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uUnVubmVyIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQ2hhdENvbXBsZXRpb25SdW5uZXIoKTtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAncnVuVG9vbHMnIH0sXG4gICAgfTtcbiAgICBydW5uZXIuX3J1bigoKSA9PiBydW5uZXIuX3J1blRvb2xzKGNvbXBsZXRpb25zLCBwYXJhbXMsIG9wdHMpKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgb3ZlcnJpZGUgX2FkZE1lc3NhZ2UobWVzc2FnZTogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0pIHtcbiAgICBzdXBlci5fYWRkTWVzc2FnZShtZXNzYWdlKTtcbiAgICBpZiAoaXNBc3Npc3RhbnRNZXNzYWdlKG1lc3NhZ2UpICYmIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgdGhpcy5fZW1pdCgnY29udGVudCcsIG1lc3NhZ2UuY29udGVudCBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IE9wZW5BSUVycm9yLCBBUElVc2VyQWJvcnRFcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuaW1wb3J0IHtcbiAgQ29tcGxldGlvbnMsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb24sXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25DaHVuayxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2UsXG59IGZyb20gXCIuLi9yZXNvdXJjZXMvY2hhdC9jb21wbGV0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcixcbiAgdHlwZSBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzLFxufSBmcm9tICcuL0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXInO1xuaW1wb3J0IHsgdHlwZSBSZWFkYWJsZVN0cmVhbSB9IGZyb20gXCIuLi9fc2hpbXMvaW5kZXhcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuLi9zdHJlYW1pbmdcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblN0cmVhbUV2ZW50cyBleHRlbmRzIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMge1xuICBjb250ZW50OiAoY29udGVudERlbHRhOiBzdHJpbmcsIGNvbnRlbnRTbmFwc2hvdDogc3RyaW5nKSA9PiB2b2lkO1xuICBjaHVuazogKGNodW5rOiBDaGF0Q29tcGxldGlvbkNodW5rLCBzbmFwc2hvdDogQ2hhdENvbXBsZXRpb25TbmFwc2hvdCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25TdHJlYW1QYXJhbXMgPSBPbWl0PENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSwgJ3N0cmVhbSc+ICYge1xuICBzdHJlYW0/OiB0cnVlO1xufTtcblxuZXhwb3J0IGNsYXNzIENoYXRDb21wbGV0aW9uU3RyZWFtXG4gIGV4dGVuZHMgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcjxDaGF0Q29tcGxldGlvblN0cmVhbUV2ZW50cz5cbiAgaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPENoYXRDb21wbGV0aW9uQ2h1bms+XG57XG4gICNjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdDogQ2hhdENvbXBsZXRpb25TbmFwc2hvdCB8IHVuZGVmaW5lZDtcblxuICBnZXQgY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3QoKTogQ2hhdENvbXBsZXRpb25TbmFwc2hvdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuZGVkIGZvciB1c2Ugb24gdGhlIGZyb250ZW5kLCBjb25zdW1pbmcgYSBzdHJlYW0gcHJvZHVjZWQgd2l0aFxuICAgKiBgLnRvUmVhZGFibGVTdHJlYW0oKWAgb24gdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBtZXNzYWdlcyBzZW50IHRvIHRoZSBtb2RlbCBkbyBub3QgYXBwZWFyIGluIGAub24oJ21lc3NhZ2UnKWBcbiAgICogaW4gdGhpcyBjb250ZXh0LlxuICAgKi9cbiAgc3RhdGljIGZyb21SZWFkYWJsZVN0cmVhbShzdHJlYW06IFJlYWRhYmxlU3RyZWFtKTogQ2hhdENvbXBsZXRpb25TdHJlYW0ge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblN0cmVhbSgpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+IHJ1bm5lci5fZnJvbVJlYWRhYmxlU3RyZWFtKHN0cmVhbSkpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQ2hhdENvbXBsZXRpb24oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25TdHJlYW1QYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uU3RyZWFtIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQ2hhdENvbXBsZXRpb25TdHJlYW0oKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PlxuICAgICAgcnVubmVyLl9ydW5DaGF0Q29tcGxldGlvbihcbiAgICAgICAgY29tcGxldGlvbnMsXG4gICAgICAgIHsgLi4ucGFyYW1zLCBzdHJlYW06IHRydWUgfSxcbiAgICAgICAgeyAuLi5vcHRpb25zLCBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3N0cmVhbScgfSB9LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICAjYmVnaW5SZXF1ZXN0KCkge1xuICAgIGlmICh0aGlzLmVuZGVkKSByZXR1cm47XG4gICAgdGhpcy4jY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gIH1cbiAgI2FkZENodW5rKGNodW5rOiBDaGF0Q29tcGxldGlvbkNodW5rKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHJldHVybjtcbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy4jYWNjdW11bGF0ZUNoYXRDb21wbGV0aW9uKGNodW5rKTtcbiAgICB0aGlzLl9lbWl0KCdjaHVuaycsIGNodW5rLCBjb21wbGV0aW9uKTtcbiAgICBjb25zdCBkZWx0YSA9IGNodW5rLmNob2ljZXNbMF0/LmRlbHRhPy5jb250ZW50O1xuICAgIGNvbnN0IHNuYXBzaG90ID0gY29tcGxldGlvbi5jaG9pY2VzWzBdPy5tZXNzYWdlO1xuICAgIGlmIChkZWx0YSAhPSBudWxsICYmIHNuYXBzaG90Py5yb2xlID09PSAnYXNzaXN0YW50JyAmJiBzbmFwc2hvdD8uY29udGVudCkge1xuICAgICAgdGhpcy5fZW1pdCgnY29udGVudCcsIGRlbHRhLCBzbmFwc2hvdC5jb250ZW50KTtcbiAgICB9XG4gIH1cbiAgI2VuZFJlcXVlc3QoKTogQ2hhdENvbXBsZXRpb24ge1xuICAgIGlmICh0aGlzLmVuZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYHN0cmVhbSBoYXMgZW5kZWQsIHRoaXMgc2hvdWxkbid0IGhhcHBlbmApO1xuICAgIH1cbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90O1xuICAgIGlmICghc25hcHNob3QpIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgcmVxdWVzdCBlbmRlZCB3aXRob3V0IHNlbmRpbmcgYW55IGNodW5rc2ApO1xuICAgIH1cbiAgICB0aGlzLiNjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZmluYWxpemVDaGF0Q29tcGxldGlvbihzbmFwc2hvdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgX2NyZWF0ZUNoYXRDb21wbGV0aW9uKFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPENoYXRDb21wbGV0aW9uPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuICAgIHRoaXMuI2JlZ2luUmVxdWVzdCgpO1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGNvbXBsZXRpb25zLmNyZWF0ZShcbiAgICAgIHsgLi4ucGFyYW1zLCBzdHJlYW06IHRydWUgfSxcbiAgICAgIHsgLi4ub3B0aW9ucywgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgKTtcbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgdGhpcy4jYWRkQ2h1bmsoY2h1bmspO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLmNvbnRyb2xsZXIuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoYXRDb21wbGV0aW9uKHRoaXMuI2VuZFJlcXVlc3QoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX2Zyb21SZWFkYWJsZVN0cmVhbShcbiAgICByZWFkYWJsZVN0cmVhbTogUmVhZGFibGVTdHJlYW0sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8Q2hhdENvbXBsZXRpb24+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG4gICAgdGhpcy4jYmVnaW5SZXF1ZXN0KCk7XG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG4gICAgY29uc3Qgc3RyZWFtID0gU3RyZWFtLmZyb21SZWFkYWJsZVN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPihyZWFkYWJsZVN0cmVhbSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICBsZXQgY2hhdElkO1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2Ygc3RyZWFtKSB7XG4gICAgICBpZiAoY2hhdElkICYmIGNoYXRJZCAhPT0gY2h1bmsuaWQpIHtcbiAgICAgICAgLy8gQSBuZXcgcmVxdWVzdCBoYXMgYmVlbiBtYWRlLlxuICAgICAgICB0aGlzLl9hZGRDaGF0Q29tcGxldGlvbih0aGlzLiNlbmRSZXF1ZXN0KCkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiNhZGRDaHVuayhjaHVuayk7XG4gICAgICBjaGF0SWQgPSBjaHVuay5pZDtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5jb250cm9sbGVyLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hZGRDaGF0Q29tcGxldGlvbih0aGlzLiNlbmRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgI2FjY3VtdWxhdGVDaGF0Q29tcGxldGlvbihjaHVuazogQ2hhdENvbXBsZXRpb25DaHVuayk6IENoYXRDb21wbGV0aW9uU25hcHNob3Qge1xuICAgIGxldCBzbmFwc2hvdCA9IHRoaXMuI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90O1xuICAgIGNvbnN0IHsgY2hvaWNlcywgLi4ucmVzdCB9ID0gY2h1bms7XG4gICAgaWYgKCFzbmFwc2hvdCkge1xuICAgICAgc25hcHNob3QgPSB0aGlzLiNjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdCA9IHtcbiAgICAgICAgLi4ucmVzdCxcbiAgICAgICAgY2hvaWNlczogW10sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3QuYXNzaWduKHNuYXBzaG90LCByZXN0KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHsgZGVsdGEsIGZpbmlzaF9yZWFzb24sIGluZGV4LCBsb2dwcm9icyA9IG51bGwsIC4uLm90aGVyIH0gb2YgY2h1bmsuY2hvaWNlcykge1xuICAgICAgbGV0IGNob2ljZSA9IHNuYXBzaG90LmNob2ljZXNbaW5kZXhdO1xuICAgICAgaWYgKCFjaG9pY2UpIHtcbiAgICAgICAgY2hvaWNlID0gc25hcHNob3QuY2hvaWNlc1tpbmRleF0gPSB7IGZpbmlzaF9yZWFzb24sIGluZGV4LCBtZXNzYWdlOiB7fSwgbG9ncHJvYnMsIC4uLm90aGVyIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChsb2dwcm9icykge1xuICAgICAgICBpZiAoIWNob2ljZS5sb2dwcm9icykge1xuICAgICAgICAgIGNob2ljZS5sb2dwcm9icyA9IE9iamVjdC5hc3NpZ24oe30sIGxvZ3Byb2JzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB7IGNvbnRlbnQsIC4uLnJlc3QgfSA9IGxvZ3Byb2JzO1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oY2hvaWNlLmxvZ3Byb2JzLCByZXN0KTtcbiAgICAgICAgICBpZiAoY29udGVudCkge1xuICAgICAgICAgICAgY2hvaWNlLmxvZ3Byb2JzLmNvbnRlbnQgPz89IFtdO1xuICAgICAgICAgICAgY2hvaWNlLmxvZ3Byb2JzLmNvbnRlbnQucHVzaCguLi5jb250ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmlzaF9yZWFzb24pIGNob2ljZS5maW5pc2hfcmVhc29uID0gZmluaXNoX3JlYXNvbjtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2hvaWNlLCBvdGhlcik7XG5cbiAgICAgIGlmICghZGVsdGEpIGNvbnRpbnVlOyAvLyBTaG91bGRuJ3QgaGFwcGVuOyBqdXN0IGluIGNhc2UuXG4gICAgICBjb25zdCB7IGNvbnRlbnQsIGZ1bmN0aW9uX2NhbGwsIHJvbGUsIHRvb2xfY2FsbHMsIC4uLnJlc3QgfSA9IGRlbHRhO1xuICAgICAgT2JqZWN0LmFzc2lnbihjaG9pY2UubWVzc2FnZSwgcmVzdCk7XG5cbiAgICAgIGlmIChjb250ZW50KSBjaG9pY2UubWVzc2FnZS5jb250ZW50ID0gKGNob2ljZS5tZXNzYWdlLmNvbnRlbnQgfHwgJycpICsgY29udGVudDtcbiAgICAgIGlmIChyb2xlKSBjaG9pY2UubWVzc2FnZS5yb2xlID0gcm9sZTtcbiAgICAgIGlmIChmdW5jdGlvbl9jYWxsKSB7XG4gICAgICAgIGlmICghY2hvaWNlLm1lc3NhZ2UuZnVuY3Rpb25fY2FsbCkge1xuICAgICAgICAgIGNob2ljZS5tZXNzYWdlLmZ1bmN0aW9uX2NhbGwgPSBmdW5jdGlvbl9jYWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChmdW5jdGlvbl9jYWxsLm5hbWUpIGNob2ljZS5tZXNzYWdlLmZ1bmN0aW9uX2NhbGwubmFtZSA9IGZ1bmN0aW9uX2NhbGwubmFtZTtcbiAgICAgICAgICBpZiAoZnVuY3Rpb25fY2FsbC5hcmd1bWVudHMpIHtcbiAgICAgICAgICAgIGNob2ljZS5tZXNzYWdlLmZ1bmN0aW9uX2NhbGwuYXJndW1lbnRzID8/PSAnJztcbiAgICAgICAgICAgIGNob2ljZS5tZXNzYWdlLmZ1bmN0aW9uX2NhbGwuYXJndW1lbnRzICs9IGZ1bmN0aW9uX2NhbGwuYXJndW1lbnRzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRvb2xfY2FsbHMpIHtcbiAgICAgICAgaWYgKCFjaG9pY2UubWVzc2FnZS50b29sX2NhbGxzKSBjaG9pY2UubWVzc2FnZS50b29sX2NhbGxzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgeyBpbmRleCwgaWQsIHR5cGUsIGZ1bmN0aW9uOiBmbiwgLi4ucmVzdCB9IG9mIHRvb2xfY2FsbHMpIHtcbiAgICAgICAgICBjb25zdCB0b29sX2NhbGwgPSAoY2hvaWNlLm1lc3NhZ2UudG9vbF9jYWxsc1tpbmRleF0gPz89IHt9KTtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRvb2xfY2FsbCwgcmVzdCk7XG4gICAgICAgICAgaWYgKGlkKSB0b29sX2NhbGwuaWQgPSBpZDtcbiAgICAgICAgICBpZiAodHlwZSkgdG9vbF9jYWxsLnR5cGUgPSB0eXBlO1xuICAgICAgICAgIGlmIChmbikgdG9vbF9jYWxsLmZ1bmN0aW9uID8/PSB7IGFyZ3VtZW50czogJycgfTtcbiAgICAgICAgICBpZiAoZm4/Lm5hbWUpIHRvb2xfY2FsbC5mdW5jdGlvbiEubmFtZSA9IGZuLm5hbWU7XG4gICAgICAgICAgaWYgKGZuPy5hcmd1bWVudHMpIHRvb2xfY2FsbC5mdW5jdGlvbiEuYXJndW1lbnRzICs9IGZuLmFyZ3VtZW50cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmF0b3I8Q2hhdENvbXBsZXRpb25DaHVuaz4ge1xuICAgIGNvbnN0IHB1c2hRdWV1ZTogQ2hhdENvbXBsZXRpb25DaHVua1tdID0gW107XG4gICAgY29uc3QgcmVhZFF1ZXVlOiB7XG4gICAgICByZXNvbHZlOiAoY2h1bms6IENoYXRDb21wbGV0aW9uQ2h1bmsgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnI6IHVua25vd24pID0+IHZvaWQ7XG4gICAgfVtdID0gW107XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcblxuICAgIHRoaXMub24oJ2NodW5rJywgKGNodW5rKSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSByZWFkUXVldWUuc2hpZnQoKTtcbiAgICAgIGlmIChyZWFkZXIpIHtcbiAgICAgICAgcmVhZGVyLnJlc29sdmUoY2h1bmspO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaFF1ZXVlLnB1c2goY2h1bmspO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vbignZW5kJywgKCkgPT4ge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiByZWFkUXVldWUpIHtcbiAgICAgICAgcmVhZGVyLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIHJlYWRRdWV1ZS5sZW5ndGggPSAwO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignYWJvcnQnLCAoZXJyKSA9PiB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHJlYWRRdWV1ZSkge1xuICAgICAgICByZWFkZXIucmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICByZWFkUXVldWUubGVuZ3RoID0gMDtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiByZWFkUXVldWUpIHtcbiAgICAgICAgcmVhZGVyLnJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgcmVhZFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogYXN5bmMgKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8Q2hhdENvbXBsZXRpb25DaHVuaz4+ID0+IHtcbiAgICAgICAgaWYgKCFwdXNoUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPENoYXRDb21wbGV0aW9uQ2h1bmsgfCB1bmRlZmluZWQ+KChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICAgICByZWFkUXVldWUucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KSxcbiAgICAgICAgICApLnRoZW4oKGNodW5rKSA9PiAoY2h1bmsgPyB7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSA6IHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2h1bmsgPSBwdXNoUXVldWUuc2hpZnQoKSE7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfTtcbiAgICAgIH0sXG4gICAgICByZXR1cm46IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydCgpO1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICB0b1JlYWRhYmxlU3RyZWFtKCk6IFJlYWRhYmxlU3RyZWFtIHtcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKHRoaXNbU3ltYm9sLmFzeW5jSXRlcmF0b3JdLmJpbmQodGhpcyksIHRoaXMuY29udHJvbGxlcik7XG4gICAgcmV0dXJuIHN0cmVhbS50b1JlYWRhYmxlU3RyZWFtKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluYWxpemVDaGF0Q29tcGxldGlvbihzbmFwc2hvdDogQ2hhdENvbXBsZXRpb25TbmFwc2hvdCk6IENoYXRDb21wbGV0aW9uIHtcbiAgY29uc3QgeyBpZCwgY2hvaWNlcywgY3JlYXRlZCwgbW9kZWwsIHN5c3RlbV9maW5nZXJwcmludCwgLi4ucmVzdCB9ID0gc25hcHNob3Q7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdCxcbiAgICBpZCxcbiAgICBjaG9pY2VzOiBjaG9pY2VzLm1hcChcbiAgICAgICh7IG1lc3NhZ2UsIGZpbmlzaF9yZWFzb24sIGluZGV4LCBsb2dwcm9icywgLi4uY2hvaWNlUmVzdCB9KTogQ2hhdENvbXBsZXRpb24uQ2hvaWNlID0+IHtcbiAgICAgICAgaWYgKCFmaW5pc2hfcmVhc29uKSB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3NpbmcgZmluaXNoX3JlYXNvbiBmb3IgY2hvaWNlICR7aW5kZXh9YCk7XG4gICAgICAgIGNvbnN0IHsgY29udGVudCA9IG51bGwsIGZ1bmN0aW9uX2NhbGwsIHRvb2xfY2FsbHMsIC4uLm1lc3NhZ2VSZXN0IH0gPSBtZXNzYWdlO1xuICAgICAgICBjb25zdCByb2xlID0gbWVzc2FnZS5yb2xlIGFzICdhc3Npc3RhbnQnOyAvLyB0aGlzIGlzIHdoYXQgd2UgZXhwZWN0OyBpbiB0aGVvcnkgaXQgY291bGQgYmUgZGlmZmVyZW50IHdoaWNoIHdvdWxkIG1ha2Ugb3VyIHR5cGVzIGEgc2xpZ2h0IGxpZSBidXQgd291bGQgYmUgZmluZS5cbiAgICAgICAgaWYgKCFyb2xlKSB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3Npbmcgcm9sZSBmb3IgY2hvaWNlICR7aW5kZXh9YCk7XG4gICAgICAgIGlmIChmdW5jdGlvbl9jYWxsKSB7XG4gICAgICAgICAgY29uc3QgeyBhcmd1bWVudHM6IGFyZ3MsIG5hbWUgfSA9IGZ1bmN0aW9uX2NhbGw7XG4gICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBtaXNzaW5nIGZ1bmN0aW9uX2NhbGwuYXJndW1lbnRzIGZvciBjaG9pY2UgJHtpbmRleH1gKTtcbiAgICAgICAgICBpZiAoIW5hbWUpIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBmdW5jdGlvbl9jYWxsLm5hbWUgZm9yIGNob2ljZSAke2luZGV4fWApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jaG9pY2VSZXN0LFxuICAgICAgICAgICAgbWVzc2FnZTogeyBjb250ZW50LCBmdW5jdGlvbl9jYWxsOiB7IGFyZ3VtZW50czogYXJncywgbmFtZSB9LCByb2xlIH0sXG4gICAgICAgICAgICBmaW5pc2hfcmVhc29uLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBsb2dwcm9icyxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b29sX2NhbGxzKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNob2ljZVJlc3QsXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGZpbmlzaF9yZWFzb24sXG4gICAgICAgICAgICBsb2dwcm9icyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgICAgICAgLi4ubWVzc2FnZVJlc3QsXG4gICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgIHRvb2xfY2FsbHM6IHRvb2xfY2FsbHMubWFwKCh0b29sX2NhbGwsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZ1bmN0aW9uOiBmbiwgdHlwZSwgaWQsIC4uLnRvb2xSZXN0IH0gPSB0b29sX2NhbGw7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBhcmd1bWVudHM6IGFyZ3MsIG5hbWUsIC4uLmZuUmVzdCB9ID0gZm4gfHwge307XG4gICAgICAgICAgICAgICAgaWYgKGlkID09IG51bGwpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3NpbmcgY2hvaWNlc1ske2luZGV4fV0udG9vbF9jYWxsc1ske2l9XS5pZFxcbiR7c3RyKHNuYXBzaG90KX1gKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBtaXNzaW5nIGNob2ljZXNbJHtpbmRleH1dLnRvb2xfY2FsbHNbJHtpfV0udHlwZVxcbiR7c3RyKHNuYXBzaG90KX1gKTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgbWlzc2luZyBjaG9pY2VzWyR7aW5kZXh9XS50b29sX2NhbGxzWyR7aX1dLmZ1bmN0aW9uLm5hbWVcXG4ke3N0cihzbmFwc2hvdCl9YCxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYG1pc3NpbmcgY2hvaWNlc1ske2luZGV4fV0udG9vbF9jYWxsc1ske2l9XS5mdW5jdGlvbi5hcmd1bWVudHNcXG4ke3N0cihzbmFwc2hvdCl9YCxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi50b29sUmVzdCwgaWQsIHR5cGUsIGZ1bmN0aW9uOiB7IC4uLmZuUmVzdCwgbmFtZSwgYXJndW1lbnRzOiBhcmdzIH0gfTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jaG9pY2VSZXN0LFxuICAgICAgICAgIG1lc3NhZ2U6IHsgLi4ubWVzc2FnZVJlc3QsIGNvbnRlbnQsIHJvbGUgfSxcbiAgICAgICAgICBmaW5pc2hfcmVhc29uLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGxvZ3Byb2JzLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApLFxuICAgIGNyZWF0ZWQsXG4gICAgbW9kZWwsXG4gICAgb2JqZWN0OiAnY2hhdC5jb21wbGV0aW9uJyxcbiAgICAuLi4oc3lzdGVtX2ZpbmdlcnByaW50ID8geyBzeXN0ZW1fZmluZ2VycHJpbnQgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3RyKHg6IHVua25vd24pIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHgpO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdHJlYW1lZCBjaHVuayBvZiBhIGNoYXQgY29tcGxldGlvbiByZXNwb25zZSByZXR1cm5lZCBieSBtb2RlbCxcbiAqIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBpbnB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblNuYXBzaG90IHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjaGF0IGNvbXBsZXRpb24uXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY2hhdCBjb21wbGV0aW9uIGNob2ljZXMuIENhbiBiZSBtb3JlIHRoYW4gb25lIGlmIGBuYCBpcyBncmVhdGVyXG4gICAqIHRoYW4gMS5cbiAgICovXG4gIGNob2ljZXM6IEFycmF5PENoYXRDb21wbGV0aW9uU25hcHNob3QuQ2hvaWNlPjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBvZiB3aGVuIHRoZSBjaGF0IGNvbXBsZXRpb24gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byBnZW5lcmF0ZSB0aGUgY29tcGxldGlvbi5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLy8gTm90ZSB3ZSBkbyBub3QgaW5jbHVkZSBhbiBcIm9iamVjdFwiIHR5cGUgb24gdGhlIHNuYXBzaG90LFxuICAvLyBiZWNhdXNlIHRoZSBvYmplY3QgaXMgbm90IGEgdmFsaWQgXCJjaGF0LmNvbXBsZXRpb25cIiB1bnRpbCBmaW5hbGl6ZWQuXG4gIC8vIG9iamVjdDogJ2NoYXQuY29tcGxldGlvbic7XG5cbiAgLyoqXG4gICAqIFRoaXMgZmluZ2VycHJpbnQgcmVwcmVzZW50cyB0aGUgYmFja2VuZCBjb25maWd1cmF0aW9uIHRoYXQgdGhlIG1vZGVsIHJ1bnMgd2l0aC5cbiAgICpcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHNlZWRgIHJlcXVlc3QgcGFyYW1ldGVyIHRvIHVuZGVyc3RhbmQgd2hlblxuICAgKiBiYWNrZW5kIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdGhhdCBtaWdodCBpbXBhY3QgZGV0ZXJtaW5pc20uXG4gICAqL1xuICBzeXN0ZW1fZmluZ2VycHJpbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb25TbmFwc2hvdCB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlIHtcbiAgICAvKipcbiAgICAgKiBBIGNoYXQgY29tcGxldGlvbiBkZWx0YSBnZW5lcmF0ZWQgYnkgc3RyZWFtZWQgbW9kZWwgcmVzcG9uc2VzLlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IENob2ljZS5NZXNzYWdlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB0aGUgbW9kZWwgc3RvcHBlZCBnZW5lcmF0aW5nIHRva2Vucy4gVGhpcyB3aWxsIGJlIGBzdG9wYCBpZiB0aGUgbW9kZWxcbiAgICAgKiBoaXQgYSBuYXR1cmFsIHN0b3AgcG9pbnQgb3IgYSBwcm92aWRlZCBzdG9wIHNlcXVlbmNlLCBgbGVuZ3RoYCBpZiB0aGUgbWF4aW11bVxuICAgICAqIG51bWJlciBvZiB0b2tlbnMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyByZWFjaGVkLCBgY29udGVudF9maWx0ZXJgIGlmXG4gICAgICogY29udGVudCB3YXMgb21pdHRlZCBkdWUgdG8gYSBmbGFnIGZyb20gb3VyIGNvbnRlbnQgZmlsdGVycywgb3IgYGZ1bmN0aW9uX2NhbGxgXG4gICAgICogaWYgdGhlIG1vZGVsIGNhbGxlZCBhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZpbmlzaF9yZWFzb246IENoYXRDb21wbGV0aW9uLkNob2ljZVsnZmluaXNoX3JlYXNvbiddIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIExvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNob2ljZS5cbiAgICAgKi9cbiAgICBsb2dwcm9iczogQ2hhdENvbXBsZXRpb24uQ2hvaWNlLkxvZ3Byb2JzIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hvaWNlIGluIHRoZSBsaXN0IG9mIGNob2ljZXMuXG4gICAgICovXG4gICAgaW5kZXg6IG51bWJlcjtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQ2hvaWNlIHtcbiAgICAvKipcbiAgICAgKiBBIGNoYXQgY29tcGxldGlvbiBkZWx0YSBnZW5lcmF0ZWQgYnkgc3RyZWFtZWQgbW9kZWwgcmVzcG9uc2VzLlxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjb250ZW50cyBvZiB0aGUgY2h1bmsgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgY29udGVudD86IHN0cmluZyB8IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIG5hbWUgYW5kIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZVxuICAgICAgICogbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uX2NhbGw/OiBNZXNzYWdlLkZ1bmN0aW9uQ2FsbDtcblxuICAgICAgdG9vbF9jYWxscz86IEFycmF5PE1lc3NhZ2UuVG9vbENhbGw+O1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSByb2xlIG9mIHRoZSBhdXRob3Igb2YgdGhpcyBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICByb2xlPzogJ3N5c3RlbScgfCAndXNlcicgfCAnYXNzaXN0YW50JyB8ICdmdW5jdGlvbicgfCAndG9vbCc7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgVG9vbENhbGwge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgICBpZD86IHN0cmluZztcblxuICAgICAgICBmdW5jdGlvbj86IFRvb2xDYWxsLkZ1bmN0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9vbC5cbiAgICAgICAgICovXG4gICAgICAgIHR5cGU/OiAnZnVuY3Rpb24nO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgbmFtZXNwYWNlIFRvb2xDYWxsIHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgICAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgICAgICAgKiBoYWxsdWNpbmF0ZSBwYXJhbWV0ZXJzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgZnVuY3Rpb24gc2NoZW1hLiBWYWxpZGF0ZSB0aGVcbiAgICAgICAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICAgICAgICovXG4gICAgICAgICAgYXJndW1lbnRzPzogc3RyaW5nO1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICAgICAgICovXG4gICAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2YgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGVcbiAgICAgICAqIG1vZGVsLlxuICAgICAgICovXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uQ2FsbCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgaW4gSlNPTlxuICAgICAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICAgICAqIGFyZ3VtZW50cyBpbiB5b3VyIGNvZGUgYmVmb3JlIGNhbGxpbmcgeW91ciBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFyZ3VtZW50cz86IHN0cmluZztcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIENvbXBsZXRpb25zLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ2h1bmssXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG59IGZyb20gXCIuLi9yZXNvdXJjZXMvY2hhdC9jb21wbGV0aW9uc1wiO1xuaW1wb3J0IHsgUnVubmVyT3B0aW9ucywgdHlwZSBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzIH0gZnJvbSAnLi9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyJztcbmltcG9ydCB7IHR5cGUgUmVhZGFibGVTdHJlYW0gfSBmcm9tIFwiLi4vX3NoaW1zL2luZGV4XCI7XG5pbXBvcnQgeyBSdW5uYWJsZVRvb2xzLCB0eXBlIEJhc2VGdW5jdGlvbnNBcmdzLCB0eXBlIFJ1bm5hYmxlRnVuY3Rpb25zIH0gZnJvbSAnLi9SdW5uYWJsZUZ1bmN0aW9uJztcbmltcG9ydCB7IENoYXRDb21wbGV0aW9uU25hcHNob3QsIENoYXRDb21wbGV0aW9uU3RyZWFtIH0gZnJvbSAnLi9DaGF0Q29tcGxldGlvblN0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25TdHJlYW1FdmVudHMgZXh0ZW5kcyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzIHtcbiAgY29udGVudDogKGNvbnRlbnREZWx0YTogc3RyaW5nLCBjb250ZW50U25hcHNob3Q6IHN0cmluZykgPT4gdm9pZDtcbiAgY2h1bms6IChjaHVuazogQ2hhdENvbXBsZXRpb25DaHVuaywgc25hcHNob3Q6IENoYXRDb21wbGV0aW9uU25hcHNob3QpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPiA9IE9taXQ8XG4gIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nLFxuICAnZnVuY3Rpb25zJ1xuPiAmIHtcbiAgZnVuY3Rpb25zOiBSdW5uYWJsZUZ1bmN0aW9uczxGdW5jdGlvbnNBcmdzPjtcbn07XG5cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+ID0gT21pdDxcbiAgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICd0b29scydcbj4gJiB7XG4gIHRvb2xzOiBSdW5uYWJsZVRvb2xzPEZ1bmN0aW9uc0FyZ3M+O1xufTtcblxuZXhwb3J0IGNsYXNzIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyXG4gIGV4dGVuZHMgQ2hhdENvbXBsZXRpb25TdHJlYW1cbiAgaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPENoYXRDb21wbGV0aW9uQ2h1bms+XG57XG4gIHN0YXRpYyBvdmVycmlkZSBmcm9tUmVhZGFibGVTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZVN0cmVhbSk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIoKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PiBydW5uZXIuX2Zyb21SZWFkYWJsZVN0cmVhbShzdHJlYW0pKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIC0gcGxlYXNlIHVzZSBgcnVuVG9vbHNgIGluc3RlYWQuICovXG4gIHN0YXRpYyBydW5GdW5jdGlvbnM8VCBleHRlbmRzIChzdHJpbmcgfCBvYmplY3QpW10+KFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXM8VD4sXG4gICAgb3B0aW9ucz86IFJ1bm5lck9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIoKTtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAncnVuRnVuY3Rpb25zJyB9LFxuICAgIH07XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9ydW5GdW5jdGlvbnMoY29tcGxldGlvbnMsIHBhcmFtcywgb3B0cykpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBzdGF0aWMgcnVuVG9vbHM8VCBleHRlbmRzIChzdHJpbmcgfCBvYmplY3QpW10+KFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxUPixcbiAgICBvcHRpb25zPzogUnVubmVyT3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcigpO1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdydW5Ub29scycgfSxcbiAgICB9O1xuICAgIHJ1bm5lci5fcnVuKCgpID0+IHJ1bm5lci5fcnVuVG9vbHMoY29tcGxldGlvbnMsIHBhcmFtcywgb3B0cykpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25SdW5uZXIsIENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uUnVubmVyXCI7XG5leHBvcnQgeyBDaGF0Q29tcGxldGlvblJ1bm5lciwgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25SdW5uZXJcIjtcbmltcG9ydCB7XG4gIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyLFxuICBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zLFxufSBmcm9tIFwiLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyXCI7XG5leHBvcnQge1xuICBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcixcbiAgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtcyxcbn0gZnJvbSBcIi4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lclwiO1xuaW1wb3J0IHsgQmFzZUZ1bmN0aW9uc0FyZ3MgfSBmcm9tIFwiLi4vLi4vLi4vbGliL1J1bm5hYmxlRnVuY3Rpb25cIjtcbmV4cG9ydCB7XG4gIFJ1bm5hYmxlRnVuY3Rpb24sXG4gIFJ1bm5hYmxlRnVuY3Rpb25zLFxuICBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlLFxuICBSdW5uYWJsZUZ1bmN0aW9uV2l0aG91dFBhcnNlLFxuICBQYXJzaW5nRnVuY3Rpb24sXG4gIFBhcnNpbmdUb29sRnVuY3Rpb24sXG59IGZyb20gXCIuLi8uLi8uLi9saWIvUnVubmFibGVGdW5jdGlvblwiO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblJ1bm5lclwiO1xuZXhwb3J0IHsgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblJ1bm5lclwiO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lclwiO1xuZXhwb3J0IHsgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lclwiO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25TdHJlYW0sIHR5cGUgQ2hhdENvbXBsZXRpb25TdHJlYW1QYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtXCI7XG5leHBvcnQgeyBDaGF0Q29tcGxldGlvblN0cmVhbSwgdHlwZSBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25TdHJlYW1cIjtcblxuZXhwb3J0IGNsYXNzIENvbXBsZXRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgYHJ1blRvb2xzYCBpbnN0ZWFkLlxuICAgKi9cbiAgcnVuRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25SdW5uZXI7XG4gIHJ1bkZ1bmN0aW9uczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyO1xuICBydW5GdW5jdGlvbnM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBib2R5OlxuICAgICAgfCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+XG4gICAgICB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uUnVubmVyIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIge1xuICAgIGlmIChib2R5LnN0cmVhbSkge1xuICAgICAgcmV0dXJuIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyLnJ1bkZ1bmN0aW9ucyhcbiAgICAgICAgdGhpcy5fY2xpZW50LmNoYXQuY29tcGxldGlvbnMsXG4gICAgICAgIGJvZHkgYXMgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBDaGF0Q29tcGxldGlvblJ1bm5lci5ydW5GdW5jdGlvbnMoXG4gICAgICB0aGlzLl9jbGllbnQuY2hhdC5jb21wbGV0aW9ucyxcbiAgICAgIGJvZHkgYXMgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvbnZlbmllbmNlIGhlbHBlciBmb3IgdXNpbmcgdG9vbCBjYWxscyB3aXRoIHRoZSAvY2hhdC9jb21wbGV0aW9ucyBlbmRwb2ludFxuICAgKiB3aGljaCBhdXRvbWF0aWNhbGx5IGNhbGxzIHRoZSBKYXZhU2NyaXB0IGZ1bmN0aW9ucyB5b3UgcHJvdmlkZSBhbmQgc2VuZHMgdGhlaXJcbiAgICogcmVzdWx0cyBiYWNrIHRvIHRoZSAvY2hhdC9jb21wbGV0aW9ucyBlbmRwb2ludCwgbG9vcGluZyBhcyBsb25nIGFzIHRoZSBtb2RlbFxuICAgKiByZXF1ZXN0cyBmdW5jdGlvbiBjYWxscy5cbiAgICpcbiAgICogRm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMsIHNlZVxuICAgKiBbdGhlIGRvY3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYWkvb3BlbmFpLW5vZGUjYXV0b21hdGVkLWZ1bmN0aW9uLWNhbGxzKVxuICAgKi9cbiAgcnVuVG9vbHM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uUnVubmVyO1xuICBydW5Ub29sczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXI7XG4gIHJ1blRvb2xzPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgYm9keTpcbiAgICAgIHwgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+XG4gICAgICB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25SdW5uZXIgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lciB7XG4gICAgaWYgKGJvZHkuc3RyZWFtKSB7XG4gICAgICByZXR1cm4gQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIucnVuVG9vbHMoXG4gICAgICAgIHRoaXMuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLFxuICAgICAgICBib2R5IGFzIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBDaGF0Q29tcGxldGlvblJ1bm5lci5ydW5Ub29scyhcbiAgICAgIHRoaXMuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLFxuICAgICAgYm9keSBhcyBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz4sXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoYXQgY29tcGxldGlvbiBzdHJlYW1cbiAgICovXG4gIHN0cmVhbShib2R5OiBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDaGF0Q29tcGxldGlvblN0cmVhbSB7XG4gICAgcmV0dXJuIENoYXRDb21wbGV0aW9uU3RyZWFtLmNyZWF0ZUNoYXRDb21wbGV0aW9uKHRoaXMuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLCBib2R5LCBvcHRpb25zKTtcbiAgfVxufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgKiBhcyBDb21wbGV0aW9uc0FQSSBmcm9tIFwiLi9jb21wbGV0aW9uc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhdCBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zID0gbmV3IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdCB7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbnMgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9ucztcbn1cbiIsICJpbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElVc2VyQWJvcnRFcnJvciwgT3BlbkFJRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbmltcG9ydCB7IFJ1biwgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvcnVucy9ydW5zXCI7XG5pbXBvcnQgeyBSdW5DcmVhdGVQYXJhbXNCYXNlLCBSdW5zIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvcnVucy9ydW5zXCI7XG5pbXBvcnQgeyBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlLCBUaHJlYWRzIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvdGhyZWFkc1wiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBc3Npc3RhbnRTdHJlYW1SdW5uZXI8XG4gIEV2ZW50cyBleHRlbmRzIEN1c3RvbUV2ZW50czxhbnk+ID0gQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHMsXG4+IHtcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICNjb25uZWN0ZWRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAjcmVzb2x2ZUNvbm5lY3RlZFByb21pc2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgI3JlamVjdENvbm5lY3RlZFByb21pc2U6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAjZW5kUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgI3Jlc29sdmVFbmRQcm9taXNlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICNyZWplY3RFbmRQcm9taXNlOiAoZXJyb3I6IE9wZW5BSUVycm9yKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgI2xpc3RlbmVyczogeyBbRXZlbnQgaW4ga2V5b2YgRXZlbnRzXT86IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+IH0gPSB7fTtcblxuICAjZW5kZWQgPSBmYWxzZTtcbiAgI2Vycm9yZWQgPSBmYWxzZTtcbiAgI2Fib3J0ZWQgPSBmYWxzZTtcbiAgI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiNjb25uZWN0ZWRQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy4jcmVzb2x2ZUNvbm5lY3RlZFByb21pc2UgPSByZXNvbHZlO1xuICAgICAgdGhpcy4jcmVqZWN0Q29ubmVjdGVkUHJvbWlzZSA9IHJlamVjdDtcbiAgICB9KTtcblxuICAgIHRoaXMuI2VuZFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLiNyZXNvbHZlRW5kUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLiNyZWplY3RFbmRQcm9taXNlID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgLy8gRG9uJ3QgbGV0IHRoZXNlIHByb21pc2VzIGNhdXNlIHVuaGFuZGxlZCByZWplY3Rpb24gZXJyb3JzLlxuICAgIC8vIHdlIHdpbGwgbWFudWFsbHkgY2F1c2UgYW4gdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvciBsYXRlclxuICAgIC8vIGlmIHRoZSB1c2VyIGhhc24ndCByZWdpc3RlcmVkIGFueSBlcnJvciBsaXN0ZW5lciBvciBjYWxsZWRcbiAgICAvLyBhbnkgcHJvbWlzZS1yZXR1cm5pbmcgbWV0aG9kLlxuICAgIHRoaXMuI2Nvbm5lY3RlZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMuI2VuZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9ydW4oZXhlY3V0b3I6ICgpID0+IFByb21pc2U8YW55Pikge1xuICAgIC8vIFVuZm9ydHVuYXRlbHkgaWYgd2UgY2FsbCBgZXhlY3V0b3IoKWAgaW1tZWRpYXRlbHkgd2UgZ2V0IHJ1bnRpbWUgZXJyb3JzIGFib3V0XG4gICAgLy8gcmVmZXJlbmNlcyB0byBgdGhpc2AgYmVmb3JlIHRoZSBgc3VwZXIoKWAgY29uc3RydWN0b3IgY2FsbCByZXR1cm5zLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZXhlY3V0b3IoKS50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gdGhpcy5fZW1pdEZpbmFsKCk7XG4gICAgICAgIHRoaXMuX2VtaXQoJ2VuZCcpO1xuICAgICAgfSwgdGhpcy4jaGFuZGxlRXJyb3IpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZGRSdW4ocnVuOiBSdW4pOiBSdW4ge1xuICAgIHJldHVybiBydW47XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Nvbm5lY3RlZCgpIHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuICAgIHRoaXMuI3Jlc29sdmVDb25uZWN0ZWRQcm9taXNlKCk7XG4gICAgdGhpcy5fZW1pdCgnY29ubmVjdCcpO1xuICB9XG5cbiAgZ2V0IGVuZGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNlbmRlZDtcbiAgfVxuXG4gIGdldCBlcnJvcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNlcnJvcmVkO1xuICB9XG5cbiAgZ2V0IGFib3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2Fib3J0ZWQ7XG4gIH1cblxuICBhYm9ydCgpIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkgZm9yIHRoZSBldmVudC5cbiAgICogTm8gY2hlY2tzIGFyZSBtYWRlIHRvIHNlZSBpZiB0aGUgbGlzdGVuZXIgaGFzIGFscmVhZHkgYmVlbiBhZGRlZC4gTXVsdGlwbGUgY2FsbHMgcGFzc2luZ1xuICAgKiB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiBldmVudCBhbmQgbGlzdGVuZXIgd2lsbCByZXN1bHQgaW4gdGhlIGxpc3RlbmVyIGJlaW5nIGFkZGVkLCBhbmRcbiAgICogY2FsbGVkLCBtdWx0aXBsZSB0aW1lcy5cbiAgICogQHJldHVybnMgdGhpcyBDaGF0Q29tcGxldGlvblN0cmVhbSwgc28gdGhhdCBjYWxscyBjYW4gYmUgY2hhaW5lZFxuICAgKi9cbiAgb248RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4pOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+ID1cbiAgICAgIHRoaXMuI2xpc3RlbmVyc1tldmVudF0gfHwgKHRoaXMuI2xpc3RlbmVyc1tldmVudF0gPSBbXSk7XG4gICAgbGlzdGVuZXJzLnB1c2goeyBsaXN0ZW5lciB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgYXJyYXkgZm9yIHRoZSBldmVudC5cbiAgICogb2ZmKCkgd2lsbCByZW1vdmUsIGF0IG1vc3QsIG9uZSBpbnN0YW5jZSBvZiBhIGxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGFycmF5LiBJZiBhbnkgc2luZ2xlXG4gICAqIGxpc3RlbmVyIGhhcyBiZWVuIGFkZGVkIG11bHRpcGxlIHRpbWVzIHRvIHRoZSBsaXN0ZW5lciBhcnJheSBmb3IgdGhlIHNwZWNpZmllZCBldmVudCwgdGhlblxuICAgKiBvZmYoKSBtdXN0IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byByZW1vdmUgZWFjaCBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgdGhpcyBDaGF0Q29tcGxldGlvblN0cmVhbSwgc28gdGhhdCBjYWxscyBjYW4gYmUgY2hhaW5lZFxuICAgKi9cbiAgb2ZmPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogRXZlbnQsIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+KTogdGhpcyB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy4jbGlzdGVuZXJzW2V2ZW50XTtcbiAgICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIHRoaXM7XG4gICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuZmluZEluZGV4KChsKSA9PiBsLmxpc3RlbmVyID09PSBsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ID49IDApIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBvbmUtdGltZSBsaXN0ZW5lciBmdW5jdGlvbiBmb3IgdGhlIGV2ZW50LiBUaGUgbmV4dCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQsXG4gICAqIHRoaXMgbGlzdGVuZXIgaXMgcmVtb3ZlZCBhbmQgdGhlbiBpbnZva2VkLlxuICAgKiBAcmV0dXJucyB0aGlzIENoYXRDb21wbGV0aW9uU3RyZWFtLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkXG4gICAqL1xuICBvbmNlPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogRXZlbnQsIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+KTogdGhpcyB7XG4gICAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcnNGb3JFdmVudDxFdmVudHMsIEV2ZW50PiA9XG4gICAgICB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdIHx8ICh0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdID0gW10pO1xuICAgIGxpc3RlbmVycy5wdXNoKHsgbGlzdGVuZXIsIG9uY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBzaW1pbGFyIHRvIGAub25jZSgpYCwgYnV0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdGhlIG5leHQgdGltZVxuICAgKiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLCBpbnN0ZWFkIG9mIGNhbGxpbmcgYSBsaXN0ZW5lciBjYWxsYmFjay5cbiAgICogQHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdGhlIG5leHQgdGltZSBnaXZlbiBldmVudCBpcyB0cmlnZ2VyZWQsXG4gICAqIG9yIHJlamVjdHMgaWYgYW4gZXJyb3IgaXMgZW1pdHRlZC4gIChJZiB5b3UgcmVxdWVzdCB0aGUgJ2Vycm9yJyBldmVudCxcbiAgICogcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBlcnJvcikuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqXG4gICAqICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IHN0cmVhbS5lbWl0dGVkKCdtZXNzYWdlJykgLy8gcmVqZWN0cyBpZiB0aGUgc3RyZWFtIGVycm9yc1xuICAgKi9cbiAgZW1pdHRlZDxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oXG4gICAgZXZlbnQ6IEV2ZW50LFxuICApOiBQcm9taXNlPFxuICAgIEV2ZW50UGFyYW1ldGVyczxFdmVudHMsIEV2ZW50PiBleHRlbmRzIFtpbmZlciBQYXJhbV0gPyBQYXJhbVxuICAgIDogRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cywgRXZlbnQ+IGV4dGVuZHMgW10gPyB2b2lkXG4gICAgOiBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD5cbiAgPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgPSB0cnVlO1xuICAgICAgaWYgKGV2ZW50ICE9PSAnZXJyb3InKSB0aGlzLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIHRoaXMub25jZShldmVudCwgcmVzb2x2ZSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZG9uZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLiNjYXRjaGluZ1Byb21pc2VDcmVhdGVkID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLiNlbmRQcm9taXNlO1xuICB9XG5cbiAgI2hhbmRsZUVycm9yID0gKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgdGhpcy4jZXJyb3JlZCA9IHRydWU7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICBlcnJvciA9IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBUElVc2VyQWJvcnRFcnJvcikge1xuICAgICAgdGhpcy4jYWJvcnRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5fZW1pdCgnYWJvcnQnLCBlcnJvcik7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9wZW5BSUVycm9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBvcGVuQUlFcnJvcjogT3BlbkFJRXJyb3IgPSBuZXcgT3BlbkFJRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcGVuQUlFcnJvci5jYXVzZSA9IGVycm9yO1xuICAgICAgcmV0dXJuIHRoaXMuX2VtaXQoJ2Vycm9yJywgb3BlbkFJRXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZW1pdCgnZXJyb3InLCBuZXcgT3BlbkFJRXJyb3IoU3RyaW5nKGVycm9yKSkpO1xuICB9O1xuXG4gIHByb3RlY3RlZCBfZW1pdDxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEV2ZW50LCAuLi5hcmdzOiBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD4pIHtcbiAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3QgZW1pdCBhbnkgZXZlbnRzIGFmdGVyIGVuZFxuICAgIGlmICh0aGlzLiNlbmRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2VuZCcpIHtcbiAgICAgIHRoaXMuI2VuZGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3Jlc29sdmVFbmRQcm9taXNlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdGVuZXJzOiBMaXN0ZW5lcnNGb3JFdmVudDxFdmVudHMsIEV2ZW50PiB8IHVuZGVmaW5lZCA9IHRoaXMuI2xpc3RlbmVyc1tldmVudF07XG4gICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgdGhpcy4jbGlzdGVuZXJzW2V2ZW50XSA9IGxpc3RlbmVycy5maWx0ZXIoKGwpID0+ICFsLm9uY2UpIGFzIGFueTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKCh7IGxpc3RlbmVyIH06IGFueSkgPT4gbGlzdGVuZXIoLi4uYXJncykpO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2Fib3J0Jykge1xuICAgICAgY29uc3QgZXJyb3IgPSBhcmdzWzBdIGFzIEFQSVVzZXJBYm9ydEVycm9yO1xuICAgICAgaWYgKCF0aGlzLiNjYXRjaGluZ1Byb21pc2VDcmVhdGVkICYmICFsaXN0ZW5lcnM/Lmxlbmd0aCkge1xuICAgICAgICBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgICB0aGlzLiNyZWplY3RDb25uZWN0ZWRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuI3JlamVjdEVuZFByb21pc2UoZXJyb3IpO1xuICAgICAgdGhpcy5fZW1pdCgnZW5kJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnZXJyb3InKSB7XG4gICAgICAvLyBOT1RFOiBfZW1pdCgnZXJyb3InLCBlcnJvcikgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gI2hhbmRsZUVycm9yKCkuXG5cbiAgICAgIGNvbnN0IGVycm9yID0gYXJnc1swXSBhcyBPcGVuQUlFcnJvcjtcbiAgICAgIGlmICghdGhpcy4jY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCAmJiAhbGlzdGVuZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVHJpZ2dlciBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGlmIHRoZSB1c2VyIGhhc24ndCByZWdpc3RlcmVkIGFueSBlcnJvciBoYW5kbGVycy5cbiAgICAgICAgLy8gSWYgeW91IGFyZSBzZWVpbmcgc3RhY2sgdHJhY2VzIGhlcmUsIG1ha2Ugc3VyZSB0byBoYW5kbGUgZXJyb3JzIHZpYSBlaXRoZXI6XG4gICAgICAgIC8vIC0gcnVubmVyLm9uKCdlcnJvcicsICgpID0+IC4uLilcbiAgICAgICAgLy8gLSBhd2FpdCBydW5uZXIuZG9uZSgpXG4gICAgICAgIC8vIC0gYXdhaXQgcnVubmVyLmZpbmFsQ2hhdENvbXBsZXRpb24oKVxuICAgICAgICAvLyAtIGV0Yy5cbiAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy4jcmVqZWN0Q29ubmVjdGVkUHJvbWlzZShlcnJvcik7XG4gICAgICB0aGlzLiNyZWplY3RFbmRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuX2VtaXQoJ2VuZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfdGhyZWFkQXNzaXN0YW50U3RyZWFtKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsXG4gICAgdGhyZWFkOiBUaHJlYWRzLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jcmVhdGVUaHJlYWRBc3Npc3RhbnRTdHJlYW0odGhyZWFkLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfcnVuQXNzaXN0YW50U3RyZWFtKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuczogUnVucyxcbiAgICBwYXJhbXM6IFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NyZWF0ZUFzc2lzdGFudFN0cmVhbShydW5zLCB0aHJlYWRJZCwgcGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfcnVuVG9vbEFzc2lzdGFudFN0cmVhbShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgcnVuczogUnVucyxcbiAgICBwYXJhbXM6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY3JlYXRlVG9vbEFzc2lzdGFudFN0cmVhbShydW5zLCB0aHJlYWRJZCwgcnVuSWQsIHBhcmFtcywgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX2NyZWF0ZVRocmVhZEFzc2lzdGFudFN0cmVhbShcbiAgICB0aHJlYWQ6IFRocmVhZHMsXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG4gICAgLy8gdGhpcy4jdmFsaWRhdGVQYXJhbXMocGFyYW1zKTtcblxuICAgIGNvbnN0IHJ1blJlc3VsdCA9IGF3YWl0IHRocmVhZC5jcmVhdGVBbmRSdW4oXG4gICAgICB7IC4uLmJvZHksIHN0cmVhbTogZmFsc2UgfSxcbiAgICAgIHsgLi4ub3B0aW9ucywgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgKTtcbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUnVuKHJ1blJlc3VsdCBhcyBSdW4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9jcmVhdGVUb29sQXNzaXN0YW50U3RyZWFtKFxuICAgIHJ1bjogUnVucyxcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVuUmVzdWx0ID0gYXdhaXQgcnVuLnN1Ym1pdFRvb2xPdXRwdXRzKFxuICAgICAgdGhyZWFkSWQsXG4gICAgICBydW5JZCxcbiAgICAgIHsgLi4ucGFyYW1zLCBzdHJlYW06IGZhbHNlIH0sXG4gICAgICB7IC4uLm9wdGlvbnMsIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9LFxuICAgICk7XG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bihydW5SZXN1bHQgYXMgUnVuKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfY3JlYXRlQXNzaXN0YW50U3RyZWFtKFxuICAgIHJ1bjogUnVucyxcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHBhcmFtczogUnVuQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG4gICAgLy8gdGhpcy4jdmFsaWRhdGVQYXJhbXMocGFyYW1zKTtcblxuICAgIGNvbnN0IHJ1blJlc3VsdCA9IGF3YWl0IHJ1bi5jcmVhdGUoXG4gICAgICB0aHJlYWRJZCxcbiAgICAgIHsgLi4ucGFyYW1zLCBzdHJlYW06IGZhbHNlIH0sXG4gICAgICB7IC4uLm9wdGlvbnMsIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCB9LFxuICAgICk7XG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bihydW5SZXN1bHQgYXMgUnVuKTtcbiAgfVxufVxuXG50eXBlIEN1c3RvbUV2ZW50czxFdmVudCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrIGluIEV2ZW50XTogayBleHRlbmRzIGtleW9mIEFic3RyYWN0QXNzaXN0YW50UnVubmVyRXZlbnRzID8gQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHNba11cbiAgOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59O1xuXG50eXBlIExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4sIEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPiA9IEV2ZW50IGV4dGVuZHMgKFxuICBrZXlvZiBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50c1xuKSA/XG4gIEFic3RyYWN0QXNzaXN0YW50UnVubmVyRXZlbnRzW0V2ZW50XVxuOiBFdmVudHNbRXZlbnRdO1xuXG50eXBlIExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cyBleHRlbmRzIEN1c3RvbUV2ZW50czxhbnk+LCBFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4gPSBBcnJheTx7XG4gIGxpc3RlbmVyOiBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cywgRXZlbnQ+O1xuICBvbmNlPzogYm9vbGVhbjtcbn0+O1xudHlwZSBFdmVudFBhcmFtZXRlcnM8RXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4sIEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPiA9IFBhcmFtZXRlcnM8XG4gIExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD5cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWJzdHJhY3RBc3Npc3RhbnRSdW5uZXJFdmVudHMge1xuICBjb25uZWN0OiAoKSA9PiB2b2lkO1xuICBydW46IChydW46IFJ1bikgPT4gdm9pZDtcbiAgZXJyb3I6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQ7XG4gIGFib3J0OiAoZXJyb3I6IEFQSVVzZXJBYm9ydEVycm9yKSA9PiB2b2lkO1xuICBlbmQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtcbiAgVGV4dENvbnRlbnRCbG9jayxcbiAgSW1hZ2VGaWxlQ29udGVudEJsb2NrLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlQ29udGVudERlbHRhLFxuICBUZXh0LFxuICBJbWFnZUZpbGUsXG4gIFRleHREZWx0YSxcbiAgTWVzc2FnZXMsXG59IGZyb20gXCIuLi9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQge1xuICBSdW4sXG4gIFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsXG4gIFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbiAgUnVucyxcbiAgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlLFxuICBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvcnVucy9ydW5zXCI7XG5pbXBvcnQge1xuICBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50cyxcbiAgQWJzdHJhY3RBc3Npc3RhbnRTdHJlYW1SdW5uZXIsXG59IGZyb20gJy4vQWJzdHJhY3RBc3Npc3RhbnRTdHJlYW1SdW5uZXInO1xuaW1wb3J0IHsgdHlwZSBSZWFkYWJsZVN0cmVhbSB9IGZyb20gXCIuLi9fc2hpbXMvaW5kZXhcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuLi9zdHJlYW1pbmdcIjtcbmltcG9ydCB7IEFQSVVzZXJBYm9ydEVycm9yLCBPcGVuQUlFcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuaW1wb3J0IHtcbiAgQXNzaXN0YW50U3RyZWFtRXZlbnQsXG4gIE1lc3NhZ2VTdHJlYW1FdmVudCxcbiAgUnVuU3RlcFN0cmVhbUV2ZW50LFxuICBSdW5TdHJlYW1FdmVudCxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL2Fzc2lzdGFudHNcIjtcbmltcG9ydCB7IFJ1blN0ZXAsIFJ1blN0ZXBEZWx0YSwgVG9vbENhbGwsIFRvb2xDYWxsRGVsdGEgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9ydW5zL3N0ZXBzXCI7XG5pbXBvcnQgeyBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlLCBUaHJlYWRzIH0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvdGhyZWFkc1wiO1xuaW1wb3J0IE1lc3NhZ2VEZWx0YSA9IE1lc3NhZ2VzLk1lc3NhZ2VEZWx0YTtcblxuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRTdHJlYW1FdmVudHMgZXh0ZW5kcyBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50cyB7XG4gIC8vTmV3IGV2ZW50IHN0cnVjdHVyZVxuICBtZXNzYWdlQ3JlYXRlZDogKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHZvaWQ7XG4gIG1lc3NhZ2VEZWx0YTogKG1lc3NhZ2U6IE1lc3NhZ2VEZWx0YSwgc25hcHNob3Q6IE1lc3NhZ2UpID0+IHZvaWQ7XG4gIG1lc3NhZ2VEb25lOiAobWVzc2FnZTogTWVzc2FnZSkgPT4gdm9pZDtcblxuICBydW5TdGVwQ3JlYXRlZDogKHJ1blN0ZXA6IFJ1blN0ZXApID0+IHZvaWQ7XG4gIHJ1blN0ZXBEZWx0YTogKGRlbHRhOiBSdW5TdGVwRGVsdGEsIHNuYXBzaG90OiBSdW5zLlJ1blN0ZXApID0+IHZvaWQ7XG4gIHJ1blN0ZXBEb25lOiAocnVuU3RlcDogUnVucy5SdW5TdGVwLCBzbmFwc2hvdDogUnVucy5SdW5TdGVwKSA9PiB2b2lkO1xuXG4gIHRvb2xDYWxsQ3JlYXRlZDogKHRvb2xDYWxsOiBUb29sQ2FsbCkgPT4gdm9pZDtcbiAgdG9vbENhbGxEZWx0YTogKGRlbHRhOiBUb29sQ2FsbERlbHRhLCBzbmFwc2hvdDogVG9vbENhbGwpID0+IHZvaWQ7XG4gIHRvb2xDYWxsRG9uZTogKHRvb2xDYWxsOiBUb29sQ2FsbCkgPT4gdm9pZDtcblxuICB0ZXh0Q3JlYXRlZDogKGNvbnRlbnQ6IFRleHQpID0+IHZvaWQ7XG4gIHRleHREZWx0YTogKGRlbHRhOiBUZXh0RGVsdGEsIHNuYXBzaG90OiBUZXh0KSA9PiB2b2lkO1xuICB0ZXh0RG9uZTogKGNvbnRlbnQ6IFRleHQsIHNuYXBzaG90OiBNZXNzYWdlKSA9PiB2b2lkO1xuXG4gIC8vTm8gY3JlYXRlZCBvciBkZWx0YSBhcyB0aGlzIGlzIG5vdCBzdHJlYW1lZFxuICBpbWFnZUZpbGVEb25lOiAoY29udGVudDogSW1hZ2VGaWxlLCBzbmFwc2hvdDogTWVzc2FnZSkgPT4gdm9pZDtcblxuICBlbmQ6ICgpID0+IHZvaWQ7XG5cbiAgZXZlbnQ6IChldmVudDogQXNzaXN0YW50U3RyZWFtRXZlbnQpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2VTdHJlYW0gPSBPbWl0PFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsICdzdHJlYW0nPiAmIHtcbiAgc3RyZWFtPzogdHJ1ZTtcbn07XG5cbmV4cG9ydCB0eXBlIFJ1bkNyZWF0ZVBhcmFtc0Jhc2VTdHJlYW0gPSBPbWl0PFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsICdzdHJlYW0nPiAmIHtcbiAgc3RyZWFtPzogdHJ1ZTtcbn07XG5cbmV4cG9ydCB0eXBlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtID0gT21pdDxSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2UsICdzdHJlYW0nPiAmIHtcbiAgc3RyZWFtPzogdHJ1ZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBBc3Npc3RhbnRTdHJlYW1cbiAgZXh0ZW5kcyBBYnN0cmFjdEFzc2lzdGFudFN0cmVhbVJ1bm5lcjxBc3Npc3RhbnRTdHJlYW1FdmVudHM+XG4gIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxBc3Npc3RhbnRTdHJlYW1FdmVudD5cbntcbiAgLy9UcmFjayBhbGwgZXZlbnRzIGluIGEgc2luZ2xlIGxpc3QgZm9yIHJlZmVyZW5jZVxuICAjZXZlbnRzOiBBc3Npc3RhbnRTdHJlYW1FdmVudFtdID0gW107XG5cbiAgLy9Vc2VkIHRvIGFjY3VtdWxhdGUgZGVsdGFzXG4gIC8vV2UgYXJlIGFjY3VtdWxhdGluZyBtYW55IHR5cGVzIHNvIHRoZSB2YWx1ZSBoZXJlIGlzIG5vdCBzdHJpY3RcbiAgI3J1blN0ZXBTbmFwc2hvdHM6IHsgW2lkOiBzdHJpbmddOiBSdW5zLlJ1blN0ZXAgfSA9IHt9O1xuICAjbWVzc2FnZVNuYXBzaG90czogeyBbaWQ6IHN0cmluZ106IE1lc3NhZ2UgfSA9IHt9O1xuICAjbWVzc2FnZVNuYXBzaG90OiBNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAjZmluYWxSdW46IFJ1biB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRDb250ZW50SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRDb250ZW50OiBUZXh0Q29udGVudEJsb2NrIHwgSW1hZ2VGaWxlQ29udGVudEJsb2NrIHwgdW5kZWZpbmVkO1xuICAjY3VycmVudFRvb2xDYWxsSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRUb29sQ2FsbDogVG9vbENhbGwgfCB1bmRlZmluZWQ7XG5cbiAgLy9Gb3IgY3VycmVudCBzbmFwc2hvdCBtZXRob2RzXG4gICNjdXJyZW50RXZlbnQ6IEFzc2lzdGFudFN0cmVhbUV2ZW50IHwgdW5kZWZpbmVkO1xuICAjY3VycmVudFJ1blNuYXBzaG90OiBSdW4gfCB1bmRlZmluZWQ7XG4gICNjdXJyZW50UnVuU3RlcFNuYXBzaG90OiBSdW5zLlJ1blN0ZXAgfCB1bmRlZmluZWQ7XG5cbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhdG9yPEFzc2lzdGFudFN0cmVhbUV2ZW50PiB7XG4gICAgY29uc3QgcHVzaFF1ZXVlOiBBc3Npc3RhbnRTdHJlYW1FdmVudFtdID0gW107XG4gICAgY29uc3QgcmVhZFF1ZXVlOiB7XG4gICAgICByZXNvbHZlOiAoY2h1bms6IEFzc2lzdGFudFN0cmVhbUV2ZW50IHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuICAgICAgcmVqZWN0OiAoZXJyOiB1bmtub3duKSA9PiB2b2lkO1xuICAgIH1bXSA9IFtdO1xuICAgIGxldCBkb25lID0gZmFsc2U7XG5cbiAgICAvL0NhdGNoIGFsbCBmb3IgcGFzc2luZyBhbG9uZyBhbGwgZXZlbnRzXG4gICAgdGhpcy5vbignZXZlbnQnLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlYWRRdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKHJlYWRlcikge1xuICAgICAgICByZWFkZXIucmVzb2x2ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoUXVldWUucHVzaChldmVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHJlYWRRdWV1ZSkge1xuICAgICAgICByZWFkZXIucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgcmVhZFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdhYm9ydCcsIChlcnIpID0+IHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgcmVhZFF1ZXVlKSB7XG4gICAgICAgIHJlYWRlci5yZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJlYWRRdWV1ZS5sZW5ndGggPSAwO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHJlYWRRdWV1ZSkge1xuICAgICAgICByZWFkZXIucmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICByZWFkUXVldWUubGVuZ3RoID0gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBhc3luYyAoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxBc3Npc3RhbnRTdHJlYW1FdmVudD4+ID0+IHtcbiAgICAgICAgaWYgKCFwdXNoUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFzc2lzdGFudFN0cmVhbUV2ZW50IHwgdW5kZWZpbmVkPigocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgICAgICAgICAgcmVhZFF1ZXVlLnB1c2goeyByZXNvbHZlLCByZWplY3QgfSksXG4gICAgICAgICAgKS50aGVuKChjaHVuaykgPT4gKGNodW5rID8geyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH0gOiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNodW5rID0gcHVzaFF1ZXVlLnNoaWZ0KCkhO1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogY2h1bmssIGRvbmU6IGZhbHNlIH07XG4gICAgICB9LFxuICAgICAgcmV0dXJuOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZyb21SZWFkYWJsZVN0cmVhbShzdHJlYW06IFJlYWRhYmxlU3RyZWFtKTogQXNzaXN0YW50U3RyZWFtIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQXNzaXN0YW50U3RyZWFtKCk7XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9mcm9tUmVhZGFibGVTdHJlYW0oc3RyZWFtKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfZnJvbVJlYWRhYmxlU3RyZWFtKFxuICAgIHJlYWRhYmxlU3RyZWFtOiBSZWFkYWJsZVN0cmVhbSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG4gICAgY29uc3Qgc3RyZWFtID0gU3RyZWFtLmZyb21SZWFkYWJsZVN0cmVhbTxBc3Npc3RhbnRTdHJlYW1FdmVudD4ocmVhZGFibGVTdHJlYW0sIHRoaXMuY29udHJvbGxlcik7XG4gICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBzdHJlYW0pIHtcbiAgICAgIHRoaXMuI2FkZEV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5jb250cm9sbGVyLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hZGRSdW4odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgfVxuXG4gIHRvUmVhZGFibGVTdHJlYW0oKTogUmVhZGFibGVTdHJlYW0ge1xuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0odGhpc1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0uYmluZCh0aGlzKSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICByZXR1cm4gc3RyZWFtLnRvUmVhZGFibGVTdHJlYW0oKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUb29sQXNzaXN0YW50U3RyZWFtKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBydW5zOiBSdW5zLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtLFxuICAgIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQXNzaXN0YW50U3RyZWFtKCk7XG4gICAgcnVubmVyLl9ydW4oKCkgPT5cbiAgICAgIHJ1bm5lci5fcnVuVG9vbEFzc2lzdGFudFN0cmVhbSh0aHJlYWRJZCwgcnVuSWQsIHJ1bnMsIGJvZHksIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdzdHJlYW0nIH0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgX2NyZWF0ZVRvb2xBc3Npc3RhbnRTdHJlYW0oXG4gICAgcnVuOiBSdW5zLFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nID0geyAuLi5wYXJhbXMsIHN0cmVhbTogdHJ1ZSB9O1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHJ1bi5zdWJtaXRUb29sT3V0cHV0cyh0aHJlYWRJZCwgcnVuSWQsIGJvZHksIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2Ygc3RyZWFtKSB7XG4gICAgICB0aGlzLiNhZGRFdmVudChldmVudCk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uY29udHJvbGxlci5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hZGRSdW4odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVUaHJlYWRBc3Npc3RhbnRTdHJlYW0oXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZVN0cmVhbSxcbiAgICB0aHJlYWQ6IFRocmVhZHMsXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQXNzaXN0YW50U3RyZWFtKCk7XG4gICAgcnVubmVyLl9ydW4oKCkgPT5cbiAgICAgIHJ1bm5lci5fdGhyZWFkQXNzaXN0YW50U3RyZWFtKGJvZHksIHRocmVhZCwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3N0cmVhbScgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVBc3Npc3RhbnRTdHJlYW0oXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5zOiBSdW5zLFxuICAgIHBhcmFtczogUnVuQ3JlYXRlUGFyYW1zQmFzZVN0cmVhbSxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBBc3Npc3RhbnRTdHJlYW0oKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PlxuICAgICAgcnVubmVyLl9ydW5Bc3Npc3RhbnRTdHJlYW0odGhyZWFkSWQsIHJ1bnMsIHBhcmFtcywge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3N0cmVhbScgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIGN1cnJlbnRFdmVudCgpOiBBc3Npc3RhbnRTdHJlYW1FdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRFdmVudDtcbiAgfVxuXG4gIGN1cnJlbnRSdW4oKTogUnVuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudFJ1blNuYXBzaG90O1xuICB9XG5cbiAgY3VycmVudE1lc3NhZ2VTbmFwc2hvdCgpOiBNZXNzYWdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWVzc2FnZVNuYXBzaG90O1xuICB9XG5cbiAgY3VycmVudFJ1blN0ZXBTbmFwc2hvdCgpOiBSdW5zLlJ1blN0ZXAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50UnVuU3RlcFNuYXBzaG90O1xuICB9XG5cbiAgYXN5bmMgZmluYWxSdW5TdGVwcygpOiBQcm9taXNlPFJ1bnMuUnVuU3RlcFtdPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG5cbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLiNydW5TdGVwU25hcHNob3RzKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmFsTWVzc2FnZXMoKTogUHJvbWlzZTxNZXNzYWdlW10+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcblxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuI21lc3NhZ2VTbmFwc2hvdHMpO1xuICB9XG5cbiAgYXN5bmMgZmluYWxSdW4oKTogUHJvbWlzZTxSdW4+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICBpZiAoIXRoaXMuI2ZpbmFsUnVuKSB0aHJvdyBFcnJvcignRmluYWwgcnVuIHdhcyBub3QgcmVjZWl2ZWQuJyk7XG5cbiAgICByZXR1cm4gdGhpcy4jZmluYWxSdW47XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgX2NyZWF0ZVRocmVhZEFzc2lzdGFudFN0cmVhbShcbiAgICB0aHJlYWQ6IFRocmVhZHMsXG4gICAgcGFyYW1zOiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IHsgLi4ucGFyYW1zLCBzdHJlYW06IHRydWUgfTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB0aHJlYWQuY3JlYXRlQW5kUnVuKGJvZHksIHsgLi4ub3B0aW9ucywgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIHN0cmVhbSkge1xuICAgICAgdGhpcy4jYWRkRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLmNvbnRyb2xsZXIuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYWRkUnVuKHRoaXMuI2VuZFJlcXVlc3QoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgX2NyZWF0ZUFzc2lzdGFudFN0cmVhbShcbiAgICBydW46IFJ1bnMsXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keTogUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0geyAuLi5wYXJhbXMsIHN0cmVhbTogdHJ1ZSB9O1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHJ1bi5jcmVhdGUodGhyZWFkSWQsIGJvZHksIHsgLi4ub3B0aW9ucywgc2lnbmFsOiB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgdGhpcy5fY29ubmVjdGVkKCk7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIHN0cmVhbSkge1xuICAgICAgdGhpcy4jYWRkRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLmNvbnRyb2xsZXIuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYWRkUnVuKHRoaXMuI2VuZFJlcXVlc3QoKSk7XG4gIH1cblxuICAjYWRkRXZlbnQoZXZlbnQ6IEFzc2lzdGFudFN0cmVhbUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHJldHVybjtcblxuICAgIHRoaXMuI2N1cnJlbnRFdmVudCA9IGV2ZW50O1xuXG4gICAgdGhpcy4jaGFuZGxlRXZlbnQoZXZlbnQpO1xuXG4gICAgc3dpdGNoIChldmVudC5ldmVudCkge1xuICAgICAgY2FzZSAndGhyZWFkLmNyZWF0ZWQnOlxuICAgICAgICAvL05vIGFjdGlvbiBvbiB0aGlzIGV2ZW50LlxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jcmVhdGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4ucXVldWVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uaW5fcHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5yZXF1aXJlc19hY3Rpb24nOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jb21wbGV0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5mYWlsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jYW5jZWxsaW5nJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY2FuY2VsbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uZXhwaXJlZCc6XG4gICAgICAgIHRoaXMuI2hhbmRsZVJ1bihldmVudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY3JlYXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuaW5fcHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jb21wbGV0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmZhaWxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY2FuY2VsbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5leHBpcmVkJzpcbiAgICAgICAgdGhpcy4jaGFuZGxlUnVuU3RlcChldmVudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5jcmVhdGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmluX3Byb2dyZXNzJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmRlbHRhJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5pbmNvbXBsZXRlJzpcbiAgICAgICAgdGhpcy4jaGFuZGxlTWVzc2FnZShldmVudCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIC8vVGhpcyBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzLCBidXQgZXJyb3JzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIFNTRSBldmVudCBwcm9jZXNzaW5nIHNvIHRoaXMgc2hvdWxkIG5vdCBvY2N1clxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0VuY291bnRlcmVkIGFuIGVycm9yIGV2ZW50IGluIGV2ZW50IHByb2Nlc3NpbmcgLSBlcnJvcnMgc2hvdWxkIGJlIHByb2Nlc3NlZCBlYXJsaWVyJyxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAjZW5kUmVxdWVzdCgpOiBSdW4ge1xuICAgIGlmICh0aGlzLmVuZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYHN0cmVhbSBoYXMgZW5kZWQsIHRoaXMgc2hvdWxkbid0IGhhcHBlbmApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy4jZmluYWxSdW4pIHRocm93IEVycm9yKCdGaW5hbCBydW4gaGFzIG5vdCBiZWVuIHJlY2VpdmVkJyk7XG5cbiAgICByZXR1cm4gdGhpcy4jZmluYWxSdW47XG4gIH1cblxuICAjaGFuZGxlTWVzc2FnZShldmVudDogTWVzc2FnZVN0cmVhbUV2ZW50KSB7XG4gICAgY29uc3QgW2FjY3VtdWxhdGVkTWVzc2FnZSwgbmV3Q29udGVudF0gPSB0aGlzLiNhY2N1bXVsYXRlTWVzc2FnZShldmVudCwgdGhpcy4jbWVzc2FnZVNuYXBzaG90KTtcbiAgICB0aGlzLiNtZXNzYWdlU25hcHNob3QgPSBhY2N1bXVsYXRlZE1lc3NhZ2U7XG4gICAgdGhpcy4jbWVzc2FnZVNuYXBzaG90c1thY2N1bXVsYXRlZE1lc3NhZ2UuaWRdID0gYWNjdW11bGF0ZWRNZXNzYWdlO1xuXG4gICAgZm9yIChjb25zdCBjb250ZW50IG9mIG5ld0NvbnRlbnQpIHtcbiAgICAgIGNvbnN0IHNuYXBzaG90Q29udGVudCA9IGFjY3VtdWxhdGVkTWVzc2FnZS5jb250ZW50W2NvbnRlbnQuaW5kZXhdO1xuICAgICAgaWYgKHNuYXBzaG90Q29udGVudD8udHlwZSA9PSAndGV4dCcpIHtcbiAgICAgICAgdGhpcy5fZW1pdCgndGV4dENyZWF0ZWQnLCBzbmFwc2hvdENvbnRlbnQudGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChldmVudC5ldmVudCkge1xuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuY3JlYXRlZCc6XG4gICAgICAgIHRoaXMuX2VtaXQoJ21lc3NhZ2VDcmVhdGVkJywgZXZlbnQuZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5pbl9wcm9ncmVzcyc6XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5kZWx0YSc6XG4gICAgICAgIHRoaXMuX2VtaXQoJ21lc3NhZ2VEZWx0YScsIGV2ZW50LmRhdGEuZGVsdGEsIGFjY3VtdWxhdGVkTWVzc2FnZSk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGVsdGEuY29udGVudCkge1xuICAgICAgICAgIGZvciAoY29uc3QgY29udGVudCBvZiBldmVudC5kYXRhLmRlbHRhLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vSWYgaXQgaXMgdGV4dCBkZWx0YSwgZW1pdCBhIHRleHQgZGVsdGEgZXZlbnRcbiAgICAgICAgICAgIGlmIChjb250ZW50LnR5cGUgPT0gJ3RleHQnICYmIGNvbnRlbnQudGV4dCkge1xuICAgICAgICAgICAgICBsZXQgdGV4dERlbHRhID0gY29udGVudC50ZXh0O1xuICAgICAgICAgICAgICBsZXQgc25hcHNob3QgPSBhY2N1bXVsYXRlZE1lc3NhZ2UuY29udGVudFtjb250ZW50LmluZGV4XTtcbiAgICAgICAgICAgICAgaWYgKHNuYXBzaG90ICYmIHNuYXBzaG90LnR5cGUgPT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgndGV4dERlbHRhJywgdGV4dERlbHRhLCBzbmFwc2hvdC50ZXh0KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIHNuYXBzaG90IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRleHQgZGVsdGEgaXMgbm90IHRleHQgb3IgbWlzc2luZycpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4ICE9IHRoaXMuI2N1cnJlbnRDb250ZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgLy9TZWUgaWYgd2UgaGF2ZSBpbiBwcm9ncmVzcyBjb250ZW50XG4gICAgICAgICAgICAgIGlmICh0aGlzLiNjdXJyZW50Q29udGVudCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy4jY3VycmVudENvbnRlbnQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXQoJ3RleHREb25lJywgdGhpcy4jY3VycmVudENvbnRlbnQudGV4dCwgdGhpcy4jbWVzc2FnZVNuYXBzaG90KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlICdpbWFnZV9maWxlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgnaW1hZ2VGaWxlRG9uZScsIHRoaXMuI2N1cnJlbnRDb250ZW50LmltYWdlX2ZpbGUsIHRoaXMuI21lc3NhZ2VTbmFwc2hvdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRDb250ZW50SW5kZXggPSBjb250ZW50LmluZGV4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLiNjdXJyZW50Q29udGVudCA9IGFjY3VtdWxhdGVkTWVzc2FnZS5jb250ZW50W2NvbnRlbnQuaW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5jb21wbGV0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuaW5jb21wbGV0ZSc6XG4gICAgICAgIC8vV2UgZW1pdCB0aGUgbGF0ZXN0IGNvbnRlbnQgd2Ugd2VyZSB3b3JraW5nIG9uIG9uIGNvbXBsZXRpb24gKGluY2x1ZGluZyBpbmNvbXBsZXRlKVxuICAgICAgICBpZiAodGhpcy4jY3VycmVudENvbnRlbnRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudENvbnRlbnQgPSBldmVudC5kYXRhLmNvbnRlbnRbdGhpcy4jY3VycmVudENvbnRlbnRJbmRleF07XG4gICAgICAgICAgaWYgKGN1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnRDb250ZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnaW1hZ2VfZmlsZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgnaW1hZ2VGaWxlRG9uZScsIGN1cnJlbnRDb250ZW50LmltYWdlX2ZpbGUsIHRoaXMuI21lc3NhZ2VTbmFwc2hvdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXQoJ3RleHREb25lJywgY3VycmVudENvbnRlbnQudGV4dCwgdGhpcy4jbWVzc2FnZVNuYXBzaG90KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy4jbWVzc2FnZVNuYXBzaG90KSB7XG4gICAgICAgICAgdGhpcy5fZW1pdCgnbWVzc2FnZURvbmUnLCBldmVudC5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI21lc3NhZ2VTbmFwc2hvdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAjaGFuZGxlUnVuU3RlcChldmVudDogUnVuU3RlcFN0cmVhbUV2ZW50KSB7XG4gICAgY29uc3QgYWNjdW11bGF0ZWRSdW5TdGVwID0gdGhpcy4jYWNjdW11bGF0ZVJ1blN0ZXAoZXZlbnQpO1xuICAgIHRoaXMuI2N1cnJlbnRSdW5TdGVwU25hcHNob3QgPSBhY2N1bXVsYXRlZFJ1blN0ZXA7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY3JlYXRlZCc6XG4gICAgICAgIHRoaXMuX2VtaXQoJ3J1blN0ZXBDcmVhdGVkJywgZXZlbnQuZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJzpcbiAgICAgICAgY29uc3QgZGVsdGEgPSBldmVudC5kYXRhLmRlbHRhO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGVsdGEuc3RlcF9kZXRhaWxzICYmXG4gICAgICAgICAgZGVsdGEuc3RlcF9kZXRhaWxzLnR5cGUgPT0gJ3Rvb2xfY2FsbHMnICYmXG4gICAgICAgICAgZGVsdGEuc3RlcF9kZXRhaWxzLnRvb2xfY2FsbHMgJiZcbiAgICAgICAgICBhY2N1bXVsYXRlZFJ1blN0ZXAuc3RlcF9kZXRhaWxzLnR5cGUgPT0gJ3Rvb2xfY2FsbHMnXG4gICAgICAgICkge1xuICAgICAgICAgIGZvciAoY29uc3QgdG9vbENhbGwgb2YgZGVsdGEuc3RlcF9kZXRhaWxzLnRvb2xfY2FsbHMpIHtcbiAgICAgICAgICAgIGlmICh0b29sQ2FsbC5pbmRleCA9PSB0aGlzLiNjdXJyZW50VG9vbENhbGxJbmRleCkge1xuICAgICAgICAgICAgICB0aGlzLl9lbWl0KFxuICAgICAgICAgICAgICAgICd0b29sQ2FsbERlbHRhJyxcbiAgICAgICAgICAgICAgICB0b29sQ2FsbCxcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZFJ1blN0ZXAuc3RlcF9kZXRhaWxzLnRvb2xfY2FsbHNbdG9vbENhbGwuaW5kZXhdIGFzIFRvb2xDYWxsLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnRUb29sQ2FsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXQoJ3Rvb2xDYWxsRG9uZScsIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLiNjdXJyZW50VG9vbENhbGxJbmRleCA9IHRvb2xDYWxsLmluZGV4O1xuICAgICAgICAgICAgICB0aGlzLiNjdXJyZW50VG9vbENhbGwgPSBhY2N1bXVsYXRlZFJ1blN0ZXAuc3RlcF9kZXRhaWxzLnRvb2xfY2FsbHNbdG9vbENhbGwuaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAodGhpcy4jY3VycmVudFRvb2xDYWxsKSB0aGlzLl9lbWl0KCd0b29sQ2FsbENyZWF0ZWQnLCB0aGlzLiNjdXJyZW50VG9vbENhbGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VtaXQoJ3J1blN0ZXBEZWx0YScsIGV2ZW50LmRhdGEuZGVsdGEsIGFjY3VtdWxhdGVkUnVuU3RlcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZmFpbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jYW5jZWxsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmV4cGlyZWQnOlxuICAgICAgICB0aGlzLiNjdXJyZW50UnVuU3RlcFNuYXBzaG90ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBkZXRhaWxzID0gZXZlbnQuZGF0YS5zdGVwX2RldGFpbHM7XG4gICAgICAgIGlmIChkZXRhaWxzLnR5cGUgPT0gJ3Rvb2xfY2FsbHMnKSB7XG4gICAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnRUb29sQ2FsbCkge1xuICAgICAgICAgICAgdGhpcy5fZW1pdCgndG9vbENhbGxEb25lJywgdGhpcy4jY3VycmVudFRvb2xDYWxsIGFzIFRvb2xDYWxsKTtcbiAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdCgncnVuU3RlcERvbmUnLCBldmVudC5kYXRhLCBhY2N1bXVsYXRlZFJ1blN0ZXApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5pbl9wcm9ncmVzcyc6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gICNoYW5kbGVFdmVudChldmVudDogQXNzaXN0YW50U3RyZWFtRXZlbnQpIHtcbiAgICB0aGlzLiNldmVudHMucHVzaChldmVudCk7XG4gICAgdGhpcy5fZW1pdCgnZXZlbnQnLCBldmVudCk7XG4gIH1cblxuICAjYWNjdW11bGF0ZVJ1blN0ZXAoZXZlbnQ6IFJ1blN0ZXBTdHJlYW1FdmVudCk6IFJ1bnMuUnVuU3RlcCB7XG4gICAgc3dpdGNoIChldmVudC5ldmVudCkge1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNyZWF0ZWQnOlxuICAgICAgICB0aGlzLiNydW5TdGVwU25hcHNob3RzW2V2ZW50LmRhdGEuaWRdID0gZXZlbnQuZGF0YTtcbiAgICAgICAgcmV0dXJuIGV2ZW50LmRhdGE7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5kZWx0YSc6XG4gICAgICAgIGxldCBzbmFwc2hvdCA9IHRoaXMuI3J1blN0ZXBTbmFwc2hvdHNbZXZlbnQuZGF0YS5pZF0gYXMgUnVucy5SdW5TdGVwO1xuICAgICAgICBpZiAoIXNuYXBzaG90KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ1JlY2VpdmVkIGEgUnVuU3RlcERlbHRhIGJlZm9yZSBjcmVhdGlvbiBvZiBhIHNuYXBzaG90Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF0YSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgaWYgKGRhdGEuZGVsdGEpIHtcbiAgICAgICAgICBjb25zdCBhY2N1bXVsYXRlZCA9IEFzc2lzdGFudFN0cmVhbS5hY2N1bXVsYXRlRGVsdGEoc25hcHNob3QsIGRhdGEuZGVsdGEpIGFzIFJ1bnMuUnVuU3RlcDtcbiAgICAgICAgICB0aGlzLiNydW5TdGVwU25hcHNob3RzW2V2ZW50LmRhdGEuaWRdID0gYWNjdW11bGF0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSBhcyBSdW5zLlJ1blN0ZXA7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jb21wbGV0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmZhaWxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY2FuY2VsbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5leHBpcmVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5pbl9wcm9ncmVzcyc6XG4gICAgICAgIHRoaXMuI3J1blN0ZXBTbmFwc2hvdHNbZXZlbnQuZGF0YS5pZF0gPSBldmVudC5kYXRhO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSkgcmV0dXJuIHRoaXMuI3J1blN0ZXBTbmFwc2hvdHNbZXZlbnQuZGF0YS5pZF0gYXMgUnVucy5SdW5TdGVwO1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gc25hcHNob3QgYXZhaWxhYmxlJyk7XG4gIH1cblxuICAjYWNjdW11bGF0ZU1lc3NhZ2UoXG4gICAgZXZlbnQ6IEFzc2lzdGFudFN0cmVhbUV2ZW50LFxuICAgIHNuYXBzaG90OiBNZXNzYWdlIHwgdW5kZWZpbmVkLFxuICApOiBbTWVzc2FnZSwgTWVzc2FnZUNvbnRlbnREZWx0YVtdXSB7XG4gICAgbGV0IG5ld0NvbnRlbnQ6IE1lc3NhZ2VDb250ZW50RGVsdGFbXSA9IFtdO1xuXG4gICAgc3dpdGNoIChldmVudC5ldmVudCkge1xuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuY3JlYXRlZCc6XG4gICAgICAgIC8vT24gY3JlYXRpb24gdGhlIHNuYXBzaG90IGlzIGp1c3QgdGhlIGluaXRpYWwgbWVzc2FnZVxuICAgICAgICByZXR1cm4gW2V2ZW50LmRhdGEsIG5ld0NvbnRlbnRdO1xuXG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5kZWx0YSc6XG4gICAgICAgIGlmICghc25hcHNob3QpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICdSZWNlaXZlZCBhIGRlbHRhIHdpdGggbm8gZXhpc3Rpbmcgc25hcHNob3QgKHRoZXJlIHNob3VsZCBiZSBvbmUgZnJvbSBtZXNzYWdlIGNyZWF0aW9uKScsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAvL0lmIHRoaXMgZGVsdGEgZG9lcyBub3QgaGF2ZSBjb250ZW50LCBub3RoaW5nIHRvIHByb2Nlc3NcbiAgICAgICAgaWYgKGRhdGEuZGVsdGEuY29udGVudCkge1xuICAgICAgICAgIGZvciAoY29uc3QgY29udGVudEVsZW1lbnQgb2YgZGF0YS5kZWx0YS5jb250ZW50KSB7XG4gICAgICAgICAgICBpZiAoY29udGVudEVsZW1lbnQuaW5kZXggaW4gc25hcHNob3QuY29udGVudCkge1xuICAgICAgICAgICAgICBsZXQgY3VycmVudENvbnRlbnQgPSBzbmFwc2hvdC5jb250ZW50W2NvbnRlbnRFbGVtZW50LmluZGV4XTtcbiAgICAgICAgICAgICAgc25hcHNob3QuY29udGVudFtjb250ZW50RWxlbWVudC5pbmRleF0gPSB0aGlzLiNhY2N1bXVsYXRlQ29udGVudChcbiAgICAgICAgICAgICAgICBjb250ZW50RWxlbWVudCxcbiAgICAgICAgICAgICAgICBjdXJyZW50Q29udGVudCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNuYXBzaG90LmNvbnRlbnRbY29udGVudEVsZW1lbnQuaW5kZXhdID0gY29udGVudEVsZW1lbnQgYXNcbiAgICAgICAgICAgICAgICB8IFRleHRDb250ZW50QmxvY2tcbiAgICAgICAgICAgICAgICB8IEltYWdlRmlsZUNvbnRlbnRCbG9jaztcbiAgICAgICAgICAgICAgLy9UaGlzIGlzIGEgbmV3IGVsZW1lbnRcbiAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3NuYXBzaG90LCBuZXdDb250ZW50XTtcblxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmluY29tcGxldGUnOlxuICAgICAgICAvL05vIGNoYW5nZXMgb24gb3RoZXIgdGhyZWFkIGV2ZW50c1xuICAgICAgICBpZiAoc25hcHNob3QpIHtcbiAgICAgICAgICByZXR1cm4gW3NuYXBzaG90LCBuZXdDb250ZW50XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignUmVjZWl2ZWQgdGhyZWFkIG1lc3NhZ2UgZXZlbnQgd2l0aCBubyBleGlzdGluZyBzbmFwc2hvdCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IEVycm9yKCdUcmllZCB0byBhY2N1bXVsYXRlIGEgbm9uLW1lc3NhZ2UgZXZlbnQnKTtcbiAgfVxuXG4gICNhY2N1bXVsYXRlQ29udGVudChcbiAgICBjb250ZW50RWxlbWVudDogTWVzc2FnZUNvbnRlbnREZWx0YSxcbiAgICBjdXJyZW50Q29udGVudDogVGV4dENvbnRlbnRCbG9jayB8IEltYWdlRmlsZUNvbnRlbnRCbG9jayB8IHVuZGVmaW5lZCxcbiAgKTogVGV4dENvbnRlbnRCbG9jayB8IEltYWdlRmlsZUNvbnRlbnRCbG9jayB7XG4gICAgcmV0dXJuIEFzc2lzdGFudFN0cmVhbS5hY2N1bXVsYXRlRGVsdGEoY3VycmVudENvbnRlbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8YW55LCBhbnk+LCBjb250ZW50RWxlbWVudCkgYXNcbiAgICAgIHwgVGV4dENvbnRlbnRCbG9ja1xuICAgICAgfCBJbWFnZUZpbGVDb250ZW50QmxvY2s7XG4gIH1cblxuICBzdGF0aWMgYWNjdW11bGF0ZURlbHRhKGFjYzogUmVjb3JkPHN0cmluZywgYW55PiwgZGVsdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGRlbHRhVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlbHRhKSkge1xuICAgICAgaWYgKCFhY2MuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBhY2Nba2V5XSA9IGRlbHRhVmFsdWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgYWNjVmFsdWUgPSBhY2Nba2V5XTtcbiAgICAgIGlmIChhY2NWYWx1ZSA9PT0gbnVsbCB8fCBhY2NWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjY1trZXldID0gZGVsdGFWYWx1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGRvbid0IGFjY3VtdWxhdGUgdGhlc2Ugc3BlY2lhbCBwcm9wZXJ0aWVzXG4gICAgICBpZiAoa2V5ID09PSAnaW5kZXgnIHx8IGtleSA9PT0gJ3R5cGUnKSB7XG4gICAgICAgIGFjY1trZXldID0gZGVsdGFWYWx1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGUtc3BlY2lmaWMgYWNjdW11bGF0aW9uIGxvZ2ljXG4gICAgICBpZiAodHlwZW9mIGFjY1ZhbHVlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZGVsdGFWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgYWNjVmFsdWUgKz0gZGVsdGFWYWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFjY1ZhbHVlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgZGVsdGFWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgYWNjVmFsdWUgKz0gZGVsdGFWYWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoQ29yZS5pc09iaihhY2NWYWx1ZSkgJiYgQ29yZS5pc09iaihkZWx0YVZhbHVlKSkge1xuICAgICAgICBhY2NWYWx1ZSA9IHRoaXMuYWNjdW11bGF0ZURlbHRhKGFjY1ZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4sIGRlbHRhVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYWNjVmFsdWUpICYmIEFycmF5LmlzQXJyYXkoZGVsdGFWYWx1ZSkpIHtcbiAgICAgICAgaWYgKGFjY1ZhbHVlLmV2ZXJ5KCh4KSA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHggPT09ICdudW1iZXInKSkge1xuICAgICAgICAgIGFjY1ZhbHVlLnB1c2goLi4uZGVsdGFWYWx1ZSk7IC8vIFVzZSBzcHJlYWQgc3ludGF4IGZvciBlZmZpY2llbnQgYWRkaXRpb25cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYFVuaGFuZGxlZCByZWNvcmQgdHlwZTogJHtrZXl9LCBkZWx0YVZhbHVlOiAke2RlbHRhVmFsdWV9LCBhY2NWYWx1ZTogJHthY2NWYWx1ZX1gKTtcbiAgICAgIH1cbiAgICAgIGFjY1trZXldID0gYWNjVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gICNoYW5kbGVSdW4oZXZlbnQ6IFJ1blN0cmVhbUV2ZW50KSB7XG4gICAgdGhpcy4jY3VycmVudFJ1blNuYXBzaG90ID0gZXZlbnQuZGF0YTtcbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNyZWF0ZWQnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4ucXVldWVkJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmluX3Byb2dyZXNzJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnJlcXVpcmVzX2FjdGlvbic6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNhbmNlbGxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmZhaWxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmV4cGlyZWQnOlxuICAgICAgICB0aGlzLiNmaW5hbFJ1biA9IGV2ZW50LmRhdGE7XG4gICAgICAgIGlmICh0aGlzLiNjdXJyZW50VG9vbENhbGwpIHtcbiAgICAgICAgICB0aGlzLl9lbWl0KCd0b29sQ2FsbERvbmUnLCB0aGlzLiNjdXJyZW50VG9vbENhbGwpO1xuICAgICAgICAgIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY2FuY2VsbGluZyc6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCAqIGFzIE1lc3NhZ2VzQVBJIGZyb20gXCIuL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBBc3Npc3RhbnRzQVBJIGZyb20gXCIuLi9hc3Npc3RhbnRzXCI7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vcGFnaW5hdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtZXNzYWdlLlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgYm9keTogTWVzc2FnZUNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L21lc3NhZ2VzYCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGEgbWVzc2FnZS5cbiAgICovXG4gIHJldHJpZXZlKHRocmVhZElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC90aHJlYWRzLyR7dGhyZWFkSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIGEgbWVzc2FnZS5cbiAgICovXG4gIHVwZGF0ZShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIG1lc3NhZ2VJZDogc3RyaW5nLFxuICAgIGJvZHk6IE1lc3NhZ2VVcGRhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgbWVzc2FnZXMgZm9yIGEgZ2l2ZW4gdGhyZWFkLlxuICAgKi9cbiAgbGlzdChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogTWVzc2FnZUxpc3RQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8TWVzc2FnZXNQYWdlLCBNZXNzYWdlPjtcbiAgbGlzdCh0aHJlYWRJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8TWVzc2FnZXNQYWdlLCBNZXNzYWdlPjtcbiAgbGlzdChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBNZXNzYWdlTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxNZXNzYWdlc1BhZ2UsIE1lc3NhZ2U+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3QodGhyZWFkSWQsIHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdChgL3RocmVhZHMvJHt0aHJlYWRJZH0vbWVzc2FnZXNgLCBNZXNzYWdlc1BhZ2UsIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIG1lc3NhZ2UuXG4gICAqL1xuICBkZWwodGhyZWFkSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPE1lc3NhZ2VEZWxldGVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5kZWxldGUoYC90aHJlYWRzLyR7dGhyZWFkSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPE1lc3NhZ2U+IHt9XG5cbi8qKlxuICogQSBjaXRhdGlvbiB3aXRoaW4gdGhlIG1lc3NhZ2UgdGhhdCBwb2ludHMgdG8gYSBzcGVjaWZpYyBxdW90ZSBmcm9tIGEgc3BlY2lmaWNcbiAqIEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQgb3IgdGhlIG1lc3NhZ2UuIEdlbmVyYXRlZCB3aGVuIHRoZSBhc3Npc3RhbnRcbiAqIHVzZXMgdGhlIFwiZmlsZV9zZWFyY2hcIiB0b29sIHRvIHNlYXJjaCBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgQW5ub3RhdGlvbiA9IEZpbGVDaXRhdGlvbkFubm90YXRpb24gfCBGaWxlUGF0aEFubm90YXRpb247XG5cbi8qKlxuICogQSBjaXRhdGlvbiB3aXRoaW4gdGhlIG1lc3NhZ2UgdGhhdCBwb2ludHMgdG8gYSBzcGVjaWZpYyBxdW90ZSBmcm9tIGEgc3BlY2lmaWNcbiAqIEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQgb3IgdGhlIG1lc3NhZ2UuIEdlbmVyYXRlZCB3aGVuIHRoZSBhc3Npc3RhbnRcbiAqIHVzZXMgdGhlIFwiZmlsZV9zZWFyY2hcIiB0b29sIHRvIHNlYXJjaCBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgQW5ub3RhdGlvbkRlbHRhID0gRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uIHwgRmlsZVBhdGhEZWx0YUFubm90YXRpb247XG5cbi8qKlxuICogQSBjaXRhdGlvbiB3aXRoaW4gdGhlIG1lc3NhZ2UgdGhhdCBwb2ludHMgdG8gYSBzcGVjaWZpYyBxdW90ZSBmcm9tIGEgc3BlY2lmaWNcbiAqIEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQgb3IgdGhlIG1lc3NhZ2UuIEdlbmVyYXRlZCB3aGVuIHRoZSBhc3Npc3RhbnRcbiAqIHVzZXMgdGhlIFwiZmlsZV9zZWFyY2hcIiB0b29sIHRvIHNlYXJjaCBmaWxlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlQ2l0YXRpb25Bbm5vdGF0aW9uIHtcbiAgZW5kX2luZGV4OiBudW1iZXI7XG5cbiAgZmlsZV9jaXRhdGlvbjogRmlsZUNpdGF0aW9uQW5ub3RhdGlvbi5GaWxlQ2l0YXRpb247XG5cbiAgc3RhcnRfaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgaW4gdGhlIG1lc3NhZ2UgY29udGVudCB0aGF0IG5lZWRzIHRvIGJlIHJlcGxhY2VkLlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGZpbGVfY2l0YXRpb25gLlxuICAgKi9cbiAgdHlwZTogJ2ZpbGVfY2l0YXRpb24nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbGVDaXRhdGlvbkFubm90YXRpb24ge1xuICBleHBvcnQgaW50ZXJmYWNlIEZpbGVDaXRhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBzcGVjaWZpYyBGaWxlIHRoZSBjaXRhdGlvbiBpcyBmcm9tLlxuICAgICAqL1xuICAgIGZpbGVfaWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBzcGVjaWZpYyBxdW90ZSBpbiB0aGUgZmlsZS5cbiAgICAgKi9cbiAgICBxdW90ZTogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogQSBjaXRhdGlvbiB3aXRoaW4gdGhlIG1lc3NhZ2UgdGhhdCBwb2ludHMgdG8gYSBzcGVjaWZpYyBxdW90ZSBmcm9tIGEgc3BlY2lmaWNcbiAqIEZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQgb3IgdGhlIG1lc3NhZ2UuIEdlbmVyYXRlZCB3aGVuIHRoZSBhc3Npc3RhbnRcbiAqIHVzZXMgdGhlIFwiZmlsZV9zZWFyY2hcIiB0b29sIHRvIHNlYXJjaCBmaWxlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlQ2l0YXRpb25EZWx0YUFubm90YXRpb24ge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBhbm5vdGF0aW9uIGluIHRoZSB0ZXh0IGNvbnRlbnQgcGFydC5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgZmlsZV9jaXRhdGlvbmAuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9jaXRhdGlvbic7XG5cbiAgZW5kX2luZGV4PzogbnVtYmVyO1xuXG4gIGZpbGVfY2l0YXRpb24/OiBGaWxlQ2l0YXRpb25EZWx0YUFubm90YXRpb24uRmlsZUNpdGF0aW9uO1xuXG4gIHN0YXJ0X2luZGV4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBpbiB0aGUgbWVzc2FnZSBjb250ZW50IHRoYXQgbmVlZHMgdG8gYmUgcmVwbGFjZWQuXG4gICAqL1xuICB0ZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRmlsZUNpdGF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHNwZWNpZmljIEZpbGUgdGhlIGNpdGF0aW9uIGlzIGZyb20uXG4gICAgICovXG4gICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBzcGVjaWZpYyBxdW90ZSBpbiB0aGUgZmlsZS5cbiAgICAgKi9cbiAgICBxdW90ZT86IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIEEgVVJMIGZvciB0aGUgZmlsZSB0aGF0J3MgZ2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudCB1c2VkIHRoZVxuICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgdG8gZ2VuZXJhdGUgYSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVQYXRoQW5ub3RhdGlvbiB7XG4gIGVuZF9pbmRleDogbnVtYmVyO1xuXG4gIGZpbGVfcGF0aDogRmlsZVBhdGhBbm5vdGF0aW9uLkZpbGVQYXRoO1xuXG4gIHN0YXJ0X2luZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGluIHRoZSBtZXNzYWdlIGNvbnRlbnQgdGhhdCBuZWVkcyB0byBiZSByZXBsYWNlZC5cbiAgICovXG4gIHRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogQWx3YXlzIGBmaWxlX3BhdGhgLlxuICAgKi9cbiAgdHlwZTogJ2ZpbGVfcGF0aCc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZVBhdGhBbm5vdGF0aW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBGaWxlUGF0aCB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRoYXQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKi9cbiAgICBmaWxlX2lkOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBBIFVSTCBmb3IgdGhlIGZpbGUgdGhhdCdzIGdlbmVyYXRlZCB3aGVuIHRoZSBhc3Npc3RhbnQgdXNlZCB0aGVcbiAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHRvIGdlbmVyYXRlIGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlUGF0aERlbHRhQW5ub3RhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIGFubm90YXRpb24gaW4gdGhlIHRleHQgY29udGVudCBwYXJ0LlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogQWx3YXlzIGBmaWxlX3BhdGhgLlxuICAgKi9cbiAgdHlwZTogJ2ZpbGVfcGF0aCc7XG5cbiAgZW5kX2luZGV4PzogbnVtYmVyO1xuXG4gIGZpbGVfcGF0aD86IEZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uLkZpbGVQYXRoO1xuXG4gIHN0YXJ0X2luZGV4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBpbiB0aGUgbWVzc2FnZSBjb250ZW50IHRoYXQgbmVlZHMgdG8gYmUgcmVwbGFjZWQuXG4gICAqL1xuICB0ZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBGaWxlUGF0aCB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRoYXQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKi9cbiAgICBmaWxlX2lkPzogc3RyaW5nO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VGaWxlIHtcbiAgLyoqXG4gICAqIFRoZSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSUQgb2YgdGhlIGltYWdlXG4gICAqIGluIHRoZSBtZXNzYWdlIGNvbnRlbnQuXG4gICAqL1xuICBmaWxlX2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmZXJlbmNlcyBhbiBpbWFnZSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcylcbiAqIGluIHRoZSBjb250ZW50IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZUZpbGVDb250ZW50QmxvY2sge1xuICBpbWFnZV9maWxlOiBJbWFnZUZpbGU7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgaW1hZ2VfZmlsZWAuXG4gICAqL1xuICB0eXBlOiAnaW1hZ2VfZmlsZSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VGaWxlRGVsdGEge1xuICAvKipcbiAgICogVGhlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRCBvZiB0aGUgaW1hZ2VcbiAgICogaW4gdGhlIG1lc3NhZ2UgY29udGVudC5cbiAgICovXG4gIGZpbGVfaWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmZXJlbmNlcyBhbiBpbWFnZSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcylcbiAqIGluIHRoZSBjb250ZW50IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZUZpbGVEZWx0YUJsb2NrIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgY29udGVudCBwYXJ0IGluIHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogQWx3YXlzIGBpbWFnZV9maWxlYC5cbiAgICovXG4gIHR5cGU6ICdpbWFnZV9maWxlJztcblxuICBpbWFnZV9maWxlPzogSW1hZ2VGaWxlRGVsdGE7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2l0aGluIGFcbiAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIGFwcGxpY2FibGUsIHRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0aGF0XG4gICAqIGF1dGhvcmVkIHRoaXMgbWVzc2FnZS5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgd2VyZSBhZGRlZCB0by5cbiAgICovXG4gIGF0dGFjaG1lbnRzOiBBcnJheTxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgbWVzc2FnZSB3YXMgY29tcGxldGVkLlxuICAgKi9cbiAgY29tcGxldGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZSBpbiBhcnJheSBvZiB0ZXh0IGFuZC9vciBpbWFnZXMuXG4gICAqL1xuICBjb250ZW50OiBBcnJheTxNZXNzYWdlQ29udGVudD47XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIG1lc3NhZ2Ugd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIG1lc3NhZ2Ugd2FzIG1hcmtlZCBhcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgaW5jb21wbGV0ZV9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogT24gYW4gaW5jb21wbGV0ZSBtZXNzYWdlLCBkZXRhaWxzIGFib3V0IHdoeSB0aGUgbWVzc2FnZSBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgaW5jb21wbGV0ZV9kZXRhaWxzOiBNZXNzYWdlLkluY29tcGxldGVEZXRhaWxzIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE6IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdGhyZWFkLm1lc3NhZ2VgLlxuICAgKi9cbiAgb2JqZWN0OiAndGhyZWFkLm1lc3NhZ2UnO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgcHJvZHVjZWQgdGhlIG1lc3NhZ2UuIE9uZSBvZiBgdXNlcmAgb3IgYGFzc2lzdGFudGAuXG4gICAqL1xuICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMpXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3JlYXRpb24gb2YgdGhpcyBtZXNzYWdlLiBWYWx1ZSBpcyBgbnVsbGAgd2hlbiBtZXNzYWdlcyBhcmVcbiAgICogY3JlYXRlZCBtYW51YWxseSB1c2luZyB0aGUgY3JlYXRlIG1lc3NhZ2Ugb3IgY3JlYXRlIHRocmVhZCBlbmRwb2ludHMuXG4gICAqL1xuICBydW5faWQ6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIG1lc3NhZ2UsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYGluX3Byb2dyZXNzYCwgYGluY29tcGxldGVgLCBvclxuICAgKiBgY29tcGxldGVkYC5cbiAgICovXG4gIHN0YXR1czogJ2luX3Byb2dyZXNzJyB8ICdpbmNvbXBsZXRlJyB8ICdjb21wbGV0ZWQnO1xuXG4gIC8qKlxuICAgKiBUaGUgW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKSBJRCB0aGF0XG4gICAqIHRoaXMgbWVzc2FnZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgdGhyZWFkX2lkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICovXG4gICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBhbiBpbmNvbXBsZXRlIG1lc3NhZ2UsIGRldGFpbHMgYWJvdXQgd2h5IHRoZSBtZXNzYWdlIGlzIGluY29tcGxldGUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEluY29tcGxldGVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoZSBtZXNzYWdlIGlzIGluY29tcGxldGUuXG4gICAgICovXG4gICAgcmVhc29uOiAnY29udGVudF9maWx0ZXInIHwgJ21heF90b2tlbnMnIHwgJ3J1bl9jYW5jZWxsZWQnIHwgJ3J1bl9leHBpcmVkJyB8ICdydW5fZmFpbGVkJztcbiAgfVxufVxuXG4vKipcbiAqIFJlZmVyZW5jZXMgYW4gaW1hZ2UgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpXG4gKiBpbiB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VDb250ZW50ID0gSW1hZ2VGaWxlQ29udGVudEJsb2NrIHwgVGV4dENvbnRlbnRCbG9jaztcblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKVxuICogaW4gdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlQ29udGVudERlbHRhID0gSW1hZ2VGaWxlRGVsdGFCbG9jayB8IFRleHREZWx0YUJsb2NrO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VEZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ3RocmVhZC5tZXNzYWdlLmRlbGV0ZWQnO1xufVxuXG4vKipcbiAqIFRoZSBkZWx0YSBjb250YWluaW5nIHRoZSBmaWVsZHMgdGhhdCBoYXZlIGNoYW5nZWQgb24gdGhlIE1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURlbHRhIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGluIGFycmF5IG9mIHRleHQgYW5kL29yIGltYWdlcy5cbiAgICovXG4gIGNvbnRlbnQ/OiBBcnJheTxNZXNzYWdlQ29udGVudERlbHRhPjtcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0aGF0IHByb2R1Y2VkIHRoZSBtZXNzYWdlLiBPbmUgb2YgYHVzZXJgIG9yIGBhc3Npc3RhbnRgLlxuICAgKi9cbiAgcm9sZT86ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIGRlbHRhIGkuZS4gYW55IGNoYW5nZWQgZmllbGRzIG9uIGEgbWVzc2FnZSBkdXJpbmdcbiAqIHN0cmVhbWluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGVsdGFFdmVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgbWVzc2FnZSwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWx0YSBjb250YWluaW5nIHRoZSBmaWVsZHMgdGhhdCBoYXZlIGNoYW5nZWQgb24gdGhlIE1lc3NhZ2UuXG4gICAqL1xuICBkZWx0YTogTWVzc2FnZURlbHRhO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdGhyZWFkLm1lc3NhZ2UuZGVsdGFgLlxuICAgKi9cbiAgb2JqZWN0OiAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRleHQge1xuICBhbm5vdGF0aW9uczogQXJyYXk8QW5ub3RhdGlvbj47XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHRoYXQgbWFrZXMgdXAgdGhlIHRleHQuXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB0ZXh0IGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXh0Q29udGVudEJsb2NrIHtcbiAgdGV4dDogVGV4dDtcblxuICAvKipcbiAgICogQWx3YXlzIGB0ZXh0YC5cbiAgICovXG4gIHR5cGU6ICd0ZXh0Jztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0RGVsdGEge1xuICBhbm5vdGF0aW9ucz86IEFycmF5PEFubm90YXRpb25EZWx0YT47XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHRoYXQgbWFrZXMgdXAgdGhlIHRleHQuXG4gICAqL1xuICB2YWx1ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgdGV4dCBjb250ZW50IHRoYXQgaXMgcGFydCBvZiBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dERlbHRhQmxvY2sge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBjb250ZW50IHBhcnQgaW4gdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYHRleHRgLlxuICAgKi9cbiAgdHlwZTogJ3RleHQnO1xuXG4gIHRleHQ/OiBUZXh0RGVsdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgKlxuICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAqIC0gYGFzc2lzdGFudGA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2lzdGFudC4gVXNlIHRoaXNcbiAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICovXG4gIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAqL1xuICBhdHRhY2htZW50cz86IEFycmF5PE1lc3NhZ2VDcmVhdGVQYXJhbXMuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2VDcmVhdGVQYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAqL1xuICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlVXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUxpc3RQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY3Vyc29yIGZvciB1c2UgaW4gcGFnaW5hdGlvbi4gYGJlZm9yZWAgaXMgYW4gb2JqZWN0IElEIHRoYXQgZGVmaW5lcyB5b3VyIHBsYWNlXG4gICAqIGluIHRoZSBsaXN0LiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBtYWtlIGEgbGlzdCByZXF1ZXN0IGFuZCByZWNlaXZlIDEwMCBvYmplY3RzLFxuICAgKiBlbmRpbmcgd2l0aCBvYmpfZm9vLCB5b3VyIHN1YnNlcXVlbnQgY2FsbCBjYW4gaW5jbHVkZSBiZWZvcmU9b2JqX2ZvbyBpbiBvcmRlciB0b1xuICAgKiBmZXRjaCB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgbGlzdC5cbiAgICovXG4gIGJlZm9yZT86IHN0cmluZztcblxuICAvKipcbiAgICogU29ydCBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWVzdGFtcCBvZiB0aGUgb2JqZWN0cy4gYGFzY2AgZm9yIGFzY2VuZGluZ1xuICAgKiBvcmRlciBhbmQgYGRlc2NgIGZvciBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKi9cbiAgb3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcblxuICAvKipcbiAgICogRmlsdGVyIG1lc3NhZ2VzIGJ5IHRoZSBydW4gSUQgdGhhdCBnZW5lcmF0ZWQgdGhlbS5cbiAgICovXG4gIHJ1bl9pZD86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlcyB7XG4gIGV4cG9ydCBpbXBvcnQgQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQW5ub3RhdGlvbkRlbHRhID0gTWVzc2FnZXNBUEkuQW5ub3RhdGlvbkRlbHRhO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDaXRhdGlvbkFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlQ2l0YXRpb25Bbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaWxlUGF0aEFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlUGF0aEFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVBhdGhEZWx0YUFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlUGF0aERlbHRhQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGUgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGU7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlQ29udGVudEJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlQ29udGVudEJsb2NrO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRmlsZURlbHRhID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlRGVsdGFCbG9jayA9IE1lc3NhZ2VzQVBJLkltYWdlRmlsZURlbHRhQmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNvbnRlbnQgPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudDtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ29udGVudERlbHRhID0gTWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnREZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlRGVsZXRlZCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWx0YSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlRGVsdGFFdmVudCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFRleHQgPSBNZXNzYWdlc0FQSS5UZXh0O1xuICBleHBvcnQgaW1wb3J0IFRleHRDb250ZW50QmxvY2sgPSBNZXNzYWdlc0FQSS5UZXh0Q29udGVudEJsb2NrO1xuICBleHBvcnQgaW1wb3J0IFRleHREZWx0YSA9IE1lc3NhZ2VzQVBJLlRleHREZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBUZXh0RGVsdGFCbG9jayA9IE1lc3NhZ2VzQVBJLlRleHREZWx0YUJsb2NrO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VzUGFnZSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ3JlYXRlUGFyYW1zID0gTWVzc2FnZXNBUEkuTWVzc2FnZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlVXBkYXRlUGFyYW1zID0gTWVzc2FnZXNBUEkuTWVzc2FnZVVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlTGlzdFBhcmFtcyA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCAqIGFzIFN0ZXBzQVBJIGZyb20gXCIuL3N0ZXBzXCI7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vcGFnaW5hdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgU3RlcHMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBydW4gc3RlcC5cbiAgICovXG4gIHJldHJpZXZlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBzdGVwSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFJ1blN0ZXA+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3RocmVhZHMvJHt0aHJlYWRJZH0vcnVucy8ke3J1bklkfS9zdGVwcy8ke3N0ZXBJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBydW4gc3RlcHMgYmVsb25naW5nIHRvIGEgcnVuLlxuICAgKi9cbiAgbGlzdChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBTdGVwTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5TdGVwc1BhZ2UsIFJ1blN0ZXA+O1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5TdGVwc1BhZ2UsIFJ1blN0ZXA+O1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBxdWVyeTogU3RlcExpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8UnVuU3RlcHNQYWdlLCBSdW5TdGVwPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHRocmVhZElkLCBydW5JZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zLyR7cnVuSWR9L3N0ZXBzYCwgUnVuU3RlcHNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSdW5TdGVwc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPFJ1blN0ZXA+IHt9XG5cbi8qKlxuICogVGV4dCBvdXRwdXQgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgYXMgcGFydCBvZiBhIHJ1biBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlckxvZ3Mge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBvdXRwdXQgaW4gdGhlIG91dHB1dHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGxvZ3NgLlxuICAgKi9cbiAgdHlwZTogJ2xvZ3MnO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBvdXRwdXQgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwuXG4gICAqL1xuICBsb2dzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlck91dHB1dEltYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXRzIGFycmF5LlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogQWx3YXlzIGBpbWFnZWAuXG4gICAqL1xuICB0eXBlOiAnaW1hZ2UnO1xuXG4gIGltYWdlPzogQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2UuSW1hZ2U7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2Uge1xuICBleHBvcnQgaW50ZXJmYWNlIEltYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEIG9mIHRoZVxuICAgICAqIGltYWdlLlxuICAgICAqL1xuICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlclRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIGRlZmluaXRpb24uXG4gICAqL1xuICBjb2RlX2ludGVycHJldGVyOiBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbC5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRvb2wgY2FsbC4gVGhpcyBpcyBhbHdheXMgZ29pbmcgdG8gYmUgYGNvZGVfaW50ZXJwcmV0ZXJgIGZvciB0aGlzXG4gICAqIHR5cGUgb2YgdG9vbCBjYWxsLlxuICAgKi9cbiAgdHlwZTogJ2NvZGVfaW50ZXJwcmV0ZXInO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENvZGVJbnRlcnByZXRlclRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCBkZWZpbml0aW9uLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnB1dCB0byB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwuXG4gICAgICovXG4gICAgaW5wdXQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXRzIGZyb20gdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsLiBDb2RlIEludGVycHJldGVyIGNhbiBvdXRwdXQgb25lXG4gICAgICogb3IgbW9yZSBpdGVtcywgaW5jbHVkaW5nIHRleHQgKGBsb2dzYCkgb3IgaW1hZ2VzIChgaW1hZ2VgKS4gRWFjaCBvZiB0aGVzZSBhcmVcbiAgICAgKiByZXByZXNlbnRlZCBieSBhIGRpZmZlcmVudCBvYmplY3QgdHlwZS5cbiAgICAgKi9cbiAgICBvdXRwdXRzOiBBcnJheTxDb2RlSW50ZXJwcmV0ZXIuTG9ncyB8IENvZGVJbnRlcnByZXRlci5JbWFnZT47XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgLyoqXG4gICAgICogVGV4dCBvdXRwdXQgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgYXMgcGFydCBvZiBhIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9ncyB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0ZXh0IG91dHB1dCBmcm9tIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbC5cbiAgICAgICAqL1xuICAgICAgbG9nczogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIEFsd2F5cyBgbG9nc2AuXG4gICAgICAgKi9cbiAgICAgIHR5cGU6ICdsb2dzJztcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEltYWdlIHtcbiAgICAgIGltYWdlOiBJbWFnZS5JbWFnZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBBbHdheXMgYGltYWdlYC5cbiAgICAgICAqL1xuICAgICAgdHlwZTogJ2ltYWdlJztcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIEltYWdlIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRCBvZiB0aGVcbiAgICAgICAgICogaW1hZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkOiBzdHJpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbERlbHRhIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgdG9vbCBjYWxsIGluIHRoZSB0b29sIGNhbGxzIGFycmF5LlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgY29kZV9pbnRlcnByZXRlcmAgZm9yIHRoaXNcbiAgICogdHlwZSBvZiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnY29kZV9pbnRlcnByZXRlcic7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLlxuICAgKi9cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCBkZWZpbml0aW9uLlxuICAgKi9cbiAgY29kZV9pbnRlcnByZXRlcj86IENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEuQ29kZUludGVycHJldGVyO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEge1xuICAvKipcbiAgICogVGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIGRlZmluaXRpb24uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGlucHV0IHRvIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbC5cbiAgICAgKi9cbiAgICBpbnB1dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXRzIGZyb20gdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsLiBDb2RlIEludGVycHJldGVyIGNhbiBvdXRwdXQgb25lXG4gICAgICogb3IgbW9yZSBpdGVtcywgaW5jbHVkaW5nIHRleHQgKGBsb2dzYCkgb3IgaW1hZ2VzIChgaW1hZ2VgKS4gRWFjaCBvZiB0aGVzZSBhcmVcbiAgICAgKiByZXByZXNlbnRlZCBieSBhIGRpZmZlcmVudCBvYmplY3QgdHlwZS5cbiAgICAgKi9cbiAgICBvdXRwdXRzPzogQXJyYXk8U3RlcHNBUEkuQ29kZUludGVycHJldGVyTG9ncyB8IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlck91dHB1dEltYWdlPjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2hUb29sQ2FsbCB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCBvYmplY3QuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb3Igbm93LCB0aGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBhbiBlbXB0eSBvYmplY3QuXG4gICAqL1xuICBmaWxlX3NlYXJjaDogdW5rbm93bjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgZmlsZV9zZWFyY2hgIGZvciB0aGlzIHR5cGUgb2ZcbiAgICogdG9vbCBjYWxsLlxuICAgKi9cbiAgdHlwZTogJ2ZpbGVfc2VhcmNoJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoVG9vbENhbGxEZWx0YSB7XG4gIC8qKlxuICAgKiBGb3Igbm93LCB0aGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBhbiBlbXB0eSBvYmplY3QuXG4gICAqL1xuICBmaWxlX3NlYXJjaDogdW5rbm93bjtcblxuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIHRvb2wgY2FsbHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBmaWxlX3NlYXJjaGAgZm9yIHRoaXMgdHlwZSBvZlxuICAgKiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9zZWFyY2gnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCBvYmplY3QuXG4gICAqL1xuICBpZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIG9iamVjdC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBmdW5jdGlvbjogRnVuY3Rpb25Ub29sQ2FsbC5GdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgZnVuY3Rpb25gIGZvciB0aGlzIHR5cGUgb2ZcbiAgICogdG9vbCBjYWxsLlxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGdW5jdGlvblRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgYXJndW1lbnRzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24uIFRoaXMgd2lsbCBiZSBgbnVsbGAgaWYgdGhlIG91dHB1dHMgaGF2ZSBub3QgYmVlblxuICAgICAqIFtzdWJtaXR0ZWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdWJtaXRUb29sT3V0cHV0cylcbiAgICAgKiB5ZXQuXG4gICAgICovXG4gICAgb3V0cHV0OiBzdHJpbmcgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25Ub29sQ2FsbERlbHRhIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgdG9vbCBjYWxsIGluIHRoZSB0b29sIGNhbGxzIGFycmF5LlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgZnVuY3Rpb25gIGZvciB0aGlzIHR5cGUgb2ZcbiAgICogdG9vbCBjYWxsLlxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwgb2JqZWN0LlxuICAgKi9cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBmdW5jdGlvbj86IEZ1bmN0aW9uVG9vbENhbGxEZWx0YS5GdW5jdGlvbjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGdW5jdGlvblRvb2xDYWxsRGVsdGEge1xuICAvKipcbiAgICogVGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYmUgYG51bGxgIGlmIHRoZSBvdXRwdXRzIGhhdmUgbm90IGJlZW5cbiAgICAgKiBbc3VibWl0dGVkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3VibWl0VG9vbE91dHB1dHMpXG4gICAgICogeWV0LlxuICAgICAqL1xuICAgIG91dHB1dD86IHN0cmluZyB8IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBtZXNzYWdlIGNyZWF0aW9uIGJ5IHRoZSBydW4gc3RlcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscyB7XG4gIG1lc3NhZ2VfY3JlYXRpb246IE1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzLk1lc3NhZ2VDcmVhdGlvbjtcblxuICAvKipcbiAgICogQWx3YXlzIGBtZXNzYWdlX2NyZWF0aW9uYC5cbiAgICovXG4gIHR5cGU6ICdtZXNzYWdlX2NyZWF0aW9uJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUNyZWF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGlzIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIG1lc3NhZ2VfaWQ6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5TdGVwIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBydW4gc3RlcCwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKVxuICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1biBzdGVwLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biBzdGVwIHdhcyBjYW5jZWxsZWQuXG4gICAqL1xuICBjYW5jZWxsZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biBzdGVwIGNvbXBsZXRlZC5cbiAgICovXG4gIGNvbXBsZXRlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biBzdGVwIGV4cGlyZWQuIEEgc3RlcCBpc1xuICAgKiBjb25zaWRlcmVkIGV4cGlyZWQgaWYgdGhlIHBhcmVudCBydW4gaXMgZXhwaXJlZC5cbiAgICovXG4gIGV4cGlyZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biBzdGVwIGZhaWxlZC5cbiAgICovXG4gIGZhaWxlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVuIHN0ZXAuIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlIGFyZSBub1xuICAgKiBlcnJvcnMuXG4gICAqL1xuICBsYXN0X2Vycm9yOiBSdW5TdGVwLkxhc3RFcnJvciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhOiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHRocmVhZC5ydW4uc3RlcGAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQucnVuLnN0ZXAnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucykgdGhhdFxuICAgKiB0aGlzIHJ1biBzdGVwIGlzIGEgcGFydCBvZi5cbiAgICovXG4gIHJ1bl9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBydW4gc3RlcCwgd2hpY2ggY2FuIGJlIGVpdGhlciBgaW5fcHJvZ3Jlc3NgLCBgY2FuY2VsbGVkYCxcbiAgICogYGZhaWxlZGAsIGBjb21wbGV0ZWRgLCBvciBgZXhwaXJlZGAuXG4gICAqL1xuICBzdGF0dXM6ICdpbl9wcm9ncmVzcycgfCAnY2FuY2VsbGVkJyB8ICdmYWlsZWQnIHwgJ2NvbXBsZXRlZCcgfCAnZXhwaXJlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXRhaWxzIG9mIHRoZSBydW4gc3RlcC5cbiAgICovXG4gIHN0ZXBfZGV0YWlsczogTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHMgfCBUb29sQ2FsbHNTdGVwRGV0YWlscztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpXG4gICAqIHRoYXQgd2FzIHJ1bi5cbiAgICovXG4gIHRocmVhZF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBydW4gc3RlcCwgd2hpY2ggY2FuIGJlIGVpdGhlciBgbWVzc2FnZV9jcmVhdGlvbmAgb3IgYHRvb2xfY2FsbHNgLlxuICAgKi9cbiAgdHlwZTogJ21lc3NhZ2VfY3JlYXRpb24nIHwgJ3Rvb2xfY2FsbHMnO1xuXG4gIC8qKlxuICAgKiBVc2FnZSBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gdGhlIHJ1biBzdGVwLiBUaGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgIHdoaWxlIHRoZVxuICAgKiBydW4gc3RlcCdzIHN0YXR1cyBpcyBgaW5fcHJvZ3Jlc3NgLlxuICAgKi9cbiAgdXNhZ2U6IFJ1blN0ZXAuVXNhZ2UgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN0ZXAge1xuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVuIHN0ZXAuIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlIGFyZSBub1xuICAgKiBlcnJvcnMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIExhc3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogT25lIG9mIGBzZXJ2ZXJfZXJyb3JgIG9yIGByYXRlX2xpbWl0X2V4Y2VlZGVkYC5cbiAgICAgKi9cbiAgICBjb2RlOiAnc2VydmVyX2Vycm9yJyB8ICdyYXRlX2xpbWl0X2V4Y2VlZGVkJztcblxuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2FnZSBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gdGhlIHJ1biBzdGVwLiBUaGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgIHdoaWxlIHRoZVxuICAgKiBydW4gc3RlcCdzIHN0YXR1cyBpcyBgaW5fcHJvZ3Jlc3NgLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBVc2FnZSB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4gc3RlcC5cbiAgICAgKi9cbiAgICBjb21wbGV0aW9uX3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIHByb21wdF90b2tlbnM6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRvdGFsIG51bWJlciBvZiB0b2tlbnMgdXNlZCAocHJvbXB0ICsgY29tcGxldGlvbikuXG4gICAgICovXG4gICAgdG90YWxfdG9rZW5zOiBudW1iZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVsdGEgY29udGFpbmluZyB0aGUgZmllbGRzIHRoYXQgaGF2ZSBjaGFuZ2VkIG9uIHRoZSBydW4gc3RlcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5TdGVwRGVsdGEge1xuICAvKipcbiAgICogVGhlIGRldGFpbHMgb2YgdGhlIHJ1biBzdGVwLlxuICAgKi9cbiAgc3RlcF9kZXRhaWxzPzogUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhIHwgVG9vbENhbGxEZWx0YU9iamVjdDtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcnVuIHN0ZXAgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBydW4gc3RlcCBkdXJpbmdcbiAqIHN0cmVhbWluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5TdGVwRGVsdGFFdmVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcnVuIHN0ZXAsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVsdGEgY29udGFpbmluZyB0aGUgZmllbGRzIHRoYXQgaGF2ZSBjaGFuZ2VkIG9uIHRoZSBydW4gc3RlcC5cbiAgICovXG4gIGRlbHRhOiBSdW5TdGVwRGVsdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB0aHJlYWQucnVuLnN0ZXAuZGVsdGFgLlxuICAgKi9cbiAgb2JqZWN0OiAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJztcbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBtZXNzYWdlIGNyZWF0aW9uIGJ5IHRoZSBydW4gc3RlcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEge1xuICAvKipcbiAgICogQWx3YXlzIGBtZXNzYWdlX2NyZWF0aW9uYC5cbiAgICovXG4gIHR5cGU6ICdtZXNzYWdlX2NyZWF0aW9uJztcblxuICBtZXNzYWdlX2NyZWF0aW9uPzogUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhLk1lc3NhZ2VDcmVhdGlvbjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEge1xuICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VDcmVhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhpcyBydW4gc3RlcC5cbiAgICAgKi9cbiAgICBtZXNzYWdlX2lkPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi5cbiAqL1xuZXhwb3J0IHR5cGUgVG9vbENhbGwgPSBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbCB8IEZpbGVTZWFyY2hUb29sQ2FsbCB8IEZ1bmN0aW9uVG9vbENhbGw7XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi5cbiAqL1xuZXhwb3J0IHR5cGUgVG9vbENhbGxEZWx0YSA9IENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEgfCBGaWxlU2VhcmNoVG9vbENhbGxEZWx0YSB8IEZ1bmN0aW9uVG9vbENhbGxEZWx0YTtcblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSB0b29sIGNhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbENhbGxEZWx0YU9iamVjdCB7XG4gIC8qKlxuICAgKiBBbHdheXMgYHRvb2xfY2FsbHNgLlxuICAgKi9cbiAgdHlwZTogJ3Rvb2xfY2FsbHMnO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiB0b29sIGNhbGxzIHRoZSBydW4gc3RlcCB3YXMgaW52b2x2ZWQgaW4uIFRoZXNlIGNhbiBiZSBhc3NvY2lhdGVkXG4gICAqIHdpdGggb25lIG9mIHRocmVlIHR5cGVzIG9mIHRvb2xzOiBgY29kZV9pbnRlcnByZXRlcmAsIGBmaWxlX3NlYXJjaGAsIG9yXG4gICAqIGBmdW5jdGlvbmAuXG4gICAqL1xuICB0b29sX2NhbGxzPzogQXJyYXk8VG9vbENhbGxEZWx0YT47XG59XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgdG9vbCBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xDYWxsc1N0ZXBEZXRhaWxzIHtcbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHRvb2wgY2FsbHMgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi4gVGhlc2UgY2FuIGJlIGFzc29jaWF0ZWRcbiAgICogd2l0aCBvbmUgb2YgdGhyZWUgdHlwZXMgb2YgdG9vbHM6IGBjb2RlX2ludGVycHJldGVyYCwgYGZpbGVfc2VhcmNoYCwgb3JcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHRvb2xfY2FsbHM6IEFycmF5PFRvb2xDYWxsPjtcblxuICAvKipcbiAgICogQWx3YXlzIGB0b29sX2NhbGxzYC5cbiAgICovXG4gIHR5cGU6ICd0b29sX2NhbGxzJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGVwTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFN0ZXBzIHtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJMb2dzID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyTG9ncztcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJPdXRwdXRJbWFnZSA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlck91dHB1dEltYWdlO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlclRvb2xDYWxsID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVNlYXJjaFRvb2xDYWxsID0gU3RlcHNBUEkuRmlsZVNlYXJjaFRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IEZpbGVTZWFyY2hUb29sQ2FsbERlbHRhID0gU3RlcHNBUEkuRmlsZVNlYXJjaFRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25Ub29sQ2FsbCA9IFN0ZXBzQVBJLkZ1bmN0aW9uVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25Ub29sQ2FsbERlbHRhID0gU3RlcHNBUEkuRnVuY3Rpb25Ub29sQ2FsbERlbHRhO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzID0gU3RlcHNBUEkuTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcCA9IFN0ZXBzQVBJLlJ1blN0ZXA7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcERlbHRhID0gU3RlcHNBUEkuUnVuU3RlcERlbHRhO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBEZWx0YUV2ZW50ID0gU3RlcHNBUEkuUnVuU3RlcERlbHRhRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhID0gU3RlcHNBUEkuUnVuU3RlcERlbHRhTWVzc2FnZURlbHRhO1xuICBleHBvcnQgaW1wb3J0IFRvb2xDYWxsID0gU3RlcHNBUEkuVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLlRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGxEZWx0YU9iamVjdCA9IFN0ZXBzQVBJLlRvb2xDYWxsRGVsdGFPYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGxzU3RlcERldGFpbHMgPSBTdGVwc0FQSS5Ub29sQ2FsbHNTdGVwRGV0YWlscztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwc1BhZ2UgPSBTdGVwc0FQSS5SdW5TdGVwc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgU3RlcExpc3RQYXJhbXMgPSBTdGVwc0FQSS5TdGVwTGlzdFBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElQcm9taXNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFzc2lzdGFudFN0cmVhbSwgUnVuQ3JlYXRlUGFyYW1zQmFzZVN0cmVhbSB9IGZyb20gXCIuLi8uLi8uLi8uLi9saWIvQXNzaXN0YW50U3RyZWFtXCI7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gXCIuLi8uLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbSB9IGZyb20gXCIuLi8uLi8uLi8uLi9saWIvQXNzaXN0YW50U3RyZWFtXCI7XG5pbXBvcnQgKiBhcyBSdW5zQVBJIGZyb20gXCIuL3J1bnNcIjtcbmltcG9ydCAqIGFzIEFzc2lzdGFudHNBUEkgZnJvbSBcIi4uLy4uL2Fzc2lzdGFudHNcIjtcbmltcG9ydCAqIGFzIFRocmVhZHNBUEkgZnJvbSBcIi4uL3RocmVhZHNcIjtcbmltcG9ydCAqIGFzIFN0ZXBzQVBJIGZyb20gXCIuL3N0ZXBzXCI7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vcGFnaW5hdGlvblwiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3N0cmVhbWluZ1wiO1xuXG5leHBvcnQgY2xhc3MgUnVucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgc3RlcHM6IFN0ZXBzQVBJLlN0ZXBzID0gbmV3IFN0ZXBzQVBJLlN0ZXBzKHRoaXMuX2NsaWVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJ1bi5cbiAgICovXG4gIGNyZWF0ZSh0aHJlYWRJZDogc3RyaW5nLCBib2R5OiBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQVBJUHJvbWlzZTxSdW4+O1xuICBjcmVhdGUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PjtcbiAgY3JlYXRlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4gfCBSdW4+O1xuICBjcmVhdGUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8UnVuPiB8IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zYCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgICAgc3RyZWFtOiBib2R5LnN0cmVhbSA/PyBmYWxzZSxcbiAgICB9KSBhcyBBUElQcm9taXNlPFJ1bj4gfCBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj47XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgcnVuLlxuICAgKi9cbiAgcmV0cmlldmUodGhyZWFkSWQ6IHN0cmluZywgcnVuSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8UnVuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnMvJHtydW5JZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBhIHJ1bi5cbiAgICovXG4gIHVwZGF0ZShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuVXBkYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8UnVuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zLyR7cnVuSWR9YCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHJ1bnMgYmVsb25naW5nIHRvIGEgdGhyZWFkLlxuICAgKi9cbiAgbGlzdChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogUnVuTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5zUGFnZSwgUnVuPjtcbiAgbGlzdCh0aHJlYWRJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8UnVuc1BhZ2UsIFJ1bj47XG4gIGxpc3QoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBxdWVyeTogUnVuTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5zUGFnZSwgUnVuPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHRocmVhZElkLCB7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnNgLCBSdW5zUGFnZSwge1xuICAgICAgcXVlcnksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGEgcnVuIHRoYXQgaXMgYGluX3Byb2dyZXNzYC5cbiAgICovXG4gIGNhbmNlbCh0aHJlYWRJZDogc3RyaW5nLCBydW5JZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxSdW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnMvJHtydW5JZH0vY2FuY2VsYCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBoZWxwZXIgdG8gY3JlYXRlIGEgcnVuIGFuIHBvbGwgZm9yIGEgdGVybWluYWwgc3RhdGUuIE1vcmUgaW5mb3JtYXRpb24gb24gUnVuXG4gICAqIGxpZmVjeWNsZXMgY2FuIGJlIGZvdW5kIGhlcmU6XG4gICAqIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvaG93LWl0LXdvcmtzL3J1bnMtYW5kLXJ1bi1zdGVwc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQW5kUG9sbChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLmNyZWF0ZSh0aHJlYWRJZCwgYm9keSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucG9sbCh0aHJlYWRJZCwgcnVuLmlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBSdW4gc3RyZWFtXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgc3RyZWFtYCBpbnN0ZWFkXG4gICAqL1xuICBjcmVhdGVBbmRTdHJlYW0oXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5DcmVhdGVQYXJhbXNCYXNlU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBc3Npc3RhbnRTdHJlYW0ge1xuICAgIHJldHVybiBBc3Npc3RhbnRTdHJlYW0uY3JlYXRlQXNzaXN0YW50U3RyZWFtKHRocmVhZElkLCB0aGlzLl9jbGllbnQuYmV0YS50aHJlYWRzLnJ1bnMsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGVscGVyIHRvIHBvbGwgYSBydW4gc3RhdHVzIHVudGlsIGl0IHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS4gTW9yZVxuICAgKiBpbmZvcm1hdGlvbiBvbiBSdW4gbGlmZWN5Y2xlcyBjYW4gYmUgZm91bmQgaGVyZTpcbiAgICogaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXNzaXN0YW50cy9ob3ctaXQtd29ya3MvcnVucy1hbmQtcnVuLXN0ZXBzXG4gICAqL1xuICBhc3luYyBwb2xsKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtUG9sbC1IZWxwZXInOiAndHJ1ZScgfTtcblxuICAgIGlmIChvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcykge1xuICAgICAgaGVhZGVyc1snWC1TdGFpbmxlc3MtQ3VzdG9tLVBvbGwtSW50ZXJ2YWwnXSA9IG9wdGlvbnMucG9sbEludGVydmFsTXMudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkYXRhOiBydW4sIHJlc3BvbnNlIH0gPSBhd2FpdCB0aGlzLnJldHJpZXZlKHRocmVhZElkLCBydW5JZCwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsIC4uLmhlYWRlcnMgfSxcbiAgICAgIH0pLndpdGhSZXNwb25zZSgpO1xuXG4gICAgICBzd2l0Y2ggKHJ1bi5zdGF0dXMpIHtcbiAgICAgICAgLy9JZiB3ZSBhcmUgaW4gYW55IHNvcnQgb2YgaW50ZXJtZWRpYXRlIHN0YXRlIHdlIHBvbGxcbiAgICAgICAgY2FzZSAncXVldWVkJzpcbiAgICAgICAgY2FzZSAnaW5fcHJvZ3Jlc3MnOlxuICAgICAgICBjYXNlICdjYW5jZWxsaW5nJzpcbiAgICAgICAgICBsZXQgc2xlZXBJbnRlcnZhbCA9IDUwMDA7XG5cbiAgICAgICAgICBpZiAob3B0aW9ucz8ucG9sbEludGVydmFsTXMpIHtcbiAgICAgICAgICAgIHNsZWVwSW50ZXJ2YWwgPSBvcHRpb25zLnBvbGxJbnRlcnZhbE1zO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJJbnRlcnZhbCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdvcGVuYWktcG9sbC1hZnRlci1tcycpO1xuICAgICAgICAgICAgaWYgKGhlYWRlckludGVydmFsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckludGVydmFsTXMgPSBwYXJzZUludChoZWFkZXJJbnRlcnZhbCk7XG4gICAgICAgICAgICAgIGlmICghaXNOYU4oaGVhZGVySW50ZXJ2YWxNcykpIHtcbiAgICAgICAgICAgICAgICBzbGVlcEludGVydmFsID0gaGVhZGVySW50ZXJ2YWxNcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzbGVlcChzbGVlcEludGVydmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy9XZSByZXR1cm4gdGhlIHJ1biBpbiBhbnkgdGVybWluYWwgc3RhdGUuXG4gICAgICAgIGNhc2UgJ3JlcXVpcmVzX2FjdGlvbic6XG4gICAgICAgIGNhc2UgJ2NhbmNlbGxlZCc6XG4gICAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgIGNhc2UgJ2V4cGlyZWQnOlxuICAgICAgICAgIHJldHVybiBydW47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFJ1biBzdHJlYW1cbiAgICovXG4gIHN0cmVhbSh0aHJlYWRJZDogc3RyaW5nLCBib2R5OiBSdW5DcmVhdGVQYXJhbXNCYXNlU3RyZWFtLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IEFzc2lzdGFudFN0cmVhbSB7XG4gICAgcmV0dXJuIEFzc2lzdGFudFN0cmVhbS5jcmVhdGVBc3Npc3RhbnRTdHJlYW0odGhyZWFkSWQsIHRoaXMuX2NsaWVudC5iZXRhLnRocmVhZHMucnVucywgYm9keSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBhIHJ1biBoYXMgdGhlIGBzdGF0dXM6IFwicmVxdWlyZXNfYWN0aW9uXCJgIGFuZCBgcmVxdWlyZWRfYWN0aW9uLnR5cGVgIGlzXG4gICAqIGBzdWJtaXRfdG9vbF9vdXRwdXRzYCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBzdWJtaXQgdGhlIG91dHB1dHMgZnJvbSB0aGVcbiAgICogdG9vbCBjYWxscyBvbmNlIHRoZXkncmUgYWxsIGNvbXBsZXRlZC4gQWxsIG91dHB1dHMgbXVzdCBiZSBzdWJtaXR0ZWQgaW4gYSBzaW5nbGVcbiAgICogcmVxdWVzdC5cbiAgICovXG4gIHN1Ym1pdFRvb2xPdXRwdXRzKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxSdW4+O1xuICBzdWJtaXRUb29sT3V0cHV0cyhcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PjtcbiAgc3VibWl0VG9vbE91dHB1dHMoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4gfCBSdW4+O1xuICBzdWJtaXRUb29sT3V0cHV0cyhcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8UnVuPiB8IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zLyR7cnVuSWR9L3N1Ym1pdF90b29sX291dHB1dHNgLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgICBzdHJlYW06IGJvZHkuc3RyZWFtID8/IGZhbHNlLFxuICAgIH0pIGFzIEFQSVByb21pc2U8UnVuPiB8IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGhlbHBlciB0byBzdWJtaXQgYSB0b29sIG91dHB1dCB0byBhIHJ1biBhbmQgcG9sbCBmb3IgYSB0ZXJtaW5hbCBydW4gc3RhdGUuXG4gICAqIE1vcmUgaW5mb3JtYXRpb24gb24gUnVuIGxpZmVjeWNsZXMgY2FuIGJlIGZvdW5kIGhlcmU6XG4gICAqIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvaG93LWl0LXdvcmtzL3J1bnMtYW5kLXJ1bi1zdGVwc1xuICAgKi9cbiAgYXN5bmMgc3VibWl0VG9vbE91dHB1dHNBbmRQb2xsKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLnN1Ym1pdFRvb2xPdXRwdXRzKHRocmVhZElkLCBydW5JZCwgYm9keSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucG9sbCh0aHJlYWRJZCwgcnVuLmlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXQgdGhlIHRvb2wgb3V0cHV0cyBmcm9tIGEgcHJldmlvdXMgcnVuIGFuZCBzdHJlYW0gdGhlIHJ1biB0byBhIHRlcm1pbmFsXG4gICAqIHN0YXRlLiBNb3JlIGluZm9ybWF0aW9uIG9uIFJ1biBsaWZlY3ljbGVzIGNhbiBiZSBmb3VuZCBoZXJlOlxuICAgKiBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hc3Npc3RhbnRzL2hvdy1pdC13b3Jrcy9ydW5zLWFuZC1ydW4tc3RlcHNcbiAgICovXG4gIHN1Ym1pdFRvb2xPdXRwdXRzU3RyZWFtKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQXNzaXN0YW50U3RyZWFtIHtcbiAgICByZXR1cm4gQXNzaXN0YW50U3RyZWFtLmNyZWF0ZVRvb2xBc3Npc3RhbnRTdHJlYW0oXG4gICAgICB0aHJlYWRJZCxcbiAgICAgIHJ1bklkLFxuICAgICAgdGhpcy5fY2xpZW50LmJldGEudGhyZWFkcy5ydW5zLFxuICAgICAgYm9keSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUnVuc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPFJ1bj4ge31cblxuLyoqXG4gKiBUb29sIGNhbGwgb2JqZWN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbCB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbC4gVGhpcyBJRCBtdXN0IGJlIHJlZmVyZW5jZWQgd2hlbiB5b3Ugc3VibWl0IHRoZSB0b29sXG4gICAqIG91dHB1dHMgaW4gdXNpbmcgdGhlXG4gICAqIFtTdWJtaXQgdG9vbCBvdXRwdXRzIHRvIHJ1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N1Ym1pdFRvb2xPdXRwdXRzKVxuICAgKiBlbmRwb2ludC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb246IFJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbC5GdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsIHRoZSBvdXRwdXQgaXMgcmVxdWlyZWQgZm9yLiBGb3Igbm93LCB0aGlzIGlzIGFsd2F5c1xuICAgKiBgZnVuY3Rpb25gLlxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSZXF1aXJlZEFjdGlvbkZ1bmN0aW9uVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXJndW1lbnRzIHRoYXQgdGhlIG1vZGVsIGV4cGVjdHMgeW91IHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGFyZ3VtZW50czogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1biB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB1c2VkIGZvclxuICAgKiBleGVjdXRpb24gb2YgdGhpcyBydW4uXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHdhcyBjYW5jZWxsZWQuXG4gICAqL1xuICBjYW5jZWxsZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biB3YXMgY29tcGxldGVkLlxuICAgKi9cbiAgY29tcGxldGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBydW4gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biB3aWxsIGV4cGlyZS5cbiAgICovXG4gIGV4cGlyZXNfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biBmYWlsZWQuXG4gICAqL1xuICBmYWlsZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIERldGFpbHMgb24gd2h5IHRoZSBydW4gaXMgaW5jb21wbGV0ZS4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlIHJ1biBpcyBub3RcbiAgICogaW5jb21wbGV0ZS5cbiAgICovXG4gIGluY29tcGxldGVfZGV0YWlsczogUnVuLkluY29tcGxldGVEZXRhaWxzIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGluc3RydWN0aW9ucyB0aGF0IHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHVzZWQgZm9yXG4gICAqIHRoaXMgcnVuLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJ1bi4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vIGVycm9ycy5cbiAgICovXG4gIGxhc3RfZXJyb3I6IFJ1bi5MYXN0RXJyb3IgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkIHRvIGhhdmUgYmVlbiB1c2VkIG92ZXIgdGhlXG4gICAqIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyBzcGVjaWZpZWQgdG8gaGF2ZSBiZWVuIHVzZWQgb3ZlciB0aGUgY291cnNlXG4gICAqIG9mIHRoZSBydW4uXG4gICAqL1xuICBtYXhfcHJvbXB0X3Rva2VuczogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE6IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdGhhdCB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB1c2VkIGZvclxuICAgKiB0aGlzIHJ1bi5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB0aHJlYWQucnVuYC5cbiAgICovXG4gIG9iamVjdDogJ3RocmVhZC5ydW4nO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIG9uIHRoZSBhY3Rpb24gcmVxdWlyZWQgdG8gY29udGludWUgdGhlIHJ1bi4gV2lsbCBiZSBgbnVsbGAgaWYgbm8gYWN0aW9uXG4gICAqIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVxdWlyZWRfYWN0aW9uOiBSdW4uUmVxdWlyZWRBY3Rpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LWFuZC1ncHQtNC10dXJibykgYW5kXG4gICAqIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHdhcyBzdGFydGVkLlxuICAgKi9cbiAgc3RhcnRlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgcnVuLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBxdWV1ZWRgLCBgaW5fcHJvZ3Jlc3NgLFxuICAgKiBgcmVxdWlyZXNfYWN0aW9uYCwgYGNhbmNlbGxpbmdgLCBgY2FuY2VsbGVkYCwgYGZhaWxlZGAsIGBjb21wbGV0ZWRgLCBvclxuICAgKiBgZXhwaXJlZGAuXG4gICAqL1xuICBzdGF0dXM6IFJ1blN0YXR1cztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpXG4gICAqIHRoYXQgd2FzIGV4ZWN1dGVkIG9uIGFzIGEgcGFydCBvZiB0aGlzIHJ1bi5cbiAgICovXG4gIHRocmVhZF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqIGFuZCBtZWFucyB0aGUgbW9kZWwgY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlXG4gICAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAgICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICovXG4gIHRvb2xfY2hvaWNlOiBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiB0b29scyB0aGF0IHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHVzZWQgZm9yXG4gICAqIHRoaXMgcnVuLlxuICAgKi9cbiAgdG9vbHM6IEFycmF5PEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbD47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5OiBSdW4uVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcblxuICAvKipcbiAgICogVXNhZ2Ugc3RhdGlzdGljcyByZWxhdGVkIHRvIHRoZSBydW4uIFRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAgaWYgdGhlIHJ1biBpcyBub3RcbiAgICogaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoaS5lLiBgaW5fcHJvZ3Jlc3NgLCBgcXVldWVkYCwgZXRjLikuXG4gICAqL1xuICB1c2FnZTogUnVuLlVzYWdlIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNhbXBsaW5nIHRlbXBlcmF0dXJlIHVzZWQgZm9yIHRoaXMgcnVuLiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byAxLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVjbGV1cyBzYW1wbGluZyB2YWx1ZSB1c2VkIGZvciB0aGlzIHJ1bi4gSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gMS5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW4ge1xuICAvKipcbiAgICogRGV0YWlscyBvbiB3aHkgdGhlIHJ1biBpcyBpbmNvbXBsZXRlLiBXaWxsIGJlIGBudWxsYCBpZiB0aGUgcnVuIGlzIG5vdFxuICAgKiBpbmNvbXBsZXRlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBJbmNvbXBsZXRlRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB3aHkgdGhlIHJ1biBpcyBpbmNvbXBsZXRlLiBUaGlzIHdpbGwgcG9pbnQgdG8gd2hpY2ggc3BlY2lmaWMgdG9rZW5cbiAgICAgKiBsaW1pdCB3YXMgcmVhY2hlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICByZWFzb24/OiAnbWF4X2NvbXBsZXRpb25fdG9rZW5zJyB8ICdtYXhfcHJvbXB0X3Rva2Vucyc7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVuLiBXaWxsIGJlIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBMYXN0RXJyb3Ige1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiBgc2VydmVyX2Vycm9yYCwgYHJhdGVfbGltaXRfZXhjZWVkZWRgLCBvciBgaW52YWxpZF9wcm9tcHRgLlxuICAgICAqL1xuICAgIGNvZGU6ICdzZXJ2ZXJfZXJyb3InIHwgJ3JhdGVfbGltaXRfZXhjZWVkZWQnIHwgJ2ludmFsaWRfcHJvbXB0JztcblxuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhaWxzIG9uIHRoZSBhY3Rpb24gcmVxdWlyZWQgdG8gY29udGludWUgdGhlIHJ1bi4gV2lsbCBiZSBgbnVsbGAgaWYgbm8gYWN0aW9uXG4gICAqIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlZEFjdGlvbiB7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvbiB0aGUgdG9vbCBvdXRwdXRzIG5lZWRlZCBmb3IgdGhpcyBydW4gdG8gY29udGludWUuXG4gICAgICovXG4gICAgc3VibWl0X3Rvb2xfb3V0cHV0czogUmVxdWlyZWRBY3Rpb24uU3VibWl0VG9vbE91dHB1dHM7XG5cbiAgICAvKipcbiAgICAgKiBGb3Igbm93LCB0aGlzIGlzIGFsd2F5cyBgc3VibWl0X3Rvb2xfb3V0cHV0c2AuXG4gICAgICovXG4gICAgdHlwZTogJ3N1Ym1pdF90b29sX291dHB1dHMnO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBSZXF1aXJlZEFjdGlvbiB7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvbiB0aGUgdG9vbCBvdXRwdXRzIG5lZWRlZCBmb3IgdGhpcyBydW4gdG8gY29udGludWUuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBTdWJtaXRUb29sT3V0cHV0cyB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiB0aGUgcmVsZXZhbnQgdG9vbCBjYWxscy5cbiAgICAgICAqL1xuICAgICAgdG9vbF9jYWxsczogQXJyYXk8UnVuc0FQSS5SZXF1aXJlZEFjdGlvbkZ1bmN0aW9uVG9vbENhbGw+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzYWdlIHN0YXRpc3RpY3MgcmVsYXRlZCB0byB0aGUgcnVuLiBUaGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgIGlmIHRoZSBydW4gaXMgbm90XG4gICAqIGluIGEgdGVybWluYWwgc3RhdGUgKGkuZS4gYGluX3Byb2dyZXNzYCwgYHF1ZXVlZGAsIGV0Yy4pLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBVc2FnZSB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAgICovXG4gICAgY29tcGxldGlvbl90b2tlbnM6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAgICovXG4gICAgcHJvbXB0X3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIHRva2VucyB1c2VkIChwcm9tcHQgKyBjb21wbGV0aW9uKS5cbiAgICAgKi9cbiAgICB0b3RhbF90b2tlbnM6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHJ1biwgd2hpY2ggY2FuIGJlIGVpdGhlciBgcXVldWVkYCwgYGluX3Byb2dyZXNzYCxcbiAqIGByZXF1aXJlc19hY3Rpb25gLCBgY2FuY2VsbGluZ2AsIGBjYW5jZWxsZWRgLCBgZmFpbGVkYCwgYGNvbXBsZXRlZGAsIG9yXG4gKiBgZXhwaXJlZGAuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1blN0YXR1cyA9XG4gIHwgJ3F1ZXVlZCdcbiAgfCAnaW5fcHJvZ3Jlc3MnXG4gIHwgJ3JlcXVpcmVzX2FjdGlvbidcbiAgfCAnY2FuY2VsbGluZydcbiAgfCAnY2FuY2VsbGVkJ1xuICB8ICdmYWlsZWQnXG4gIHwgJ2NvbXBsZXRlZCdcbiAgfCAnZXhwaXJlZCc7XG5cbmV4cG9ydCB0eXBlIFJ1bkNyZWF0ZVBhcmFtcyA9IFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyB8IFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcblxuZXhwb3J0IGludGVyZmFjZSBSdW5DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHJ1bi4gVGhpc1xuICAgKiBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzIHdpdGhvdXQgb3ZlcnJpZGluZyBvdGhlclxuICAgKiBpbnN0cnVjdGlvbnMuXG4gICAqL1xuICBhZGRpdGlvbmFsX2luc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFkZHMgYWRkaXRpb25hbCBtZXNzYWdlcyB0byB0aGUgdGhyZWFkIGJlZm9yZSBjcmVhdGluZyB0aGUgcnVuLlxuICAgKi9cbiAgYWRkaXRpb25hbF9tZXNzYWdlcz86IEFycmF5PFJ1bkNyZWF0ZVBhcmFtcy5BZGRpdGlvbmFsTWVzc2FnZT4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlXG4gICAqIFtpbnN0cnVjdGlvbnNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cy9jcmVhdGVBc3Npc3RhbnQpXG4gICAqIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJ1xuICAgIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJldHVybnMgYSBzdHJlYW0gb2YgZXZlbnRzIHRoYXQgaGFwcGVuIGR1cmluZyB0aGUgUnVuIGFzIHNlcnZlci1zZW50XG4gICAqIGV2ZW50cywgdGVybWluYXRpbmcgd2hlbiB0aGUgUnVuIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlIHdpdGggYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKi9cbiAgc3RyZWFtPzogYm9vbGVhbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqIGFuZCBtZWFucyB0aGUgbW9kZWwgY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlXG4gICAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAgICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICovXG4gIHRvb2xfY2hvaWNlPzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRvb2xzIHRoZSBhc3Npc3RhbnQgY2FuIHVzZSBmb3IgdGhpcyBydW4uIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRUb29sPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBSdW5DcmVhdGVQYXJhbXMuVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5DcmVhdGVQYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb250ZW50OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgKi9cbiAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICAgKi9cbiAgICBhdHRhY2htZW50cz86IEFycmF5PEFkZGl0aW9uYWxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAqL1xuICAgICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVHJ1bmNhdGlvblN0cmF0ZWd5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJ1bmNhdGlvbiBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSB0aHJlYWQuIFRoZSBkZWZhdWx0IGlzIGBhdXRvYC4gSWYgc2V0IHRvXG4gICAgICogYGxhc3RfbWVzc2FnZXNgLCB0aGUgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBuIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGluXG4gICAgICogdGhlIHRocmVhZC4gV2hlbiBzZXQgdG8gYGF1dG9gLCBtZXNzYWdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0aHJlYWQgd2lsbCBiZVxuICAgICAqIGRyb3BwZWQgdG8gZml0IHRoZSBjb250ZXh0IGxlbmd0aCBvZiB0aGUgbW9kZWwsIGBtYXhfcHJvbXB0X3Rva2Vuc2AuXG4gICAgICovXG4gICAgdHlwZTogJ2F1dG8nIHwgJ2xhc3RfbWVzc2FnZXMnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBtZXNzYWdlcyBmcm9tIHRoZSB0aHJlYWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNvbnRleHRcbiAgICAgKiBmb3IgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBsYXN0X21lc3NhZ2VzPzogbnVtYmVyIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgdHlwZSBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgZXh0ZW5kcyBSdW5DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW0/OiBmYWxzZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nIGV4dGVuZHMgUnVuQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJldHVybnMgYSBzdHJlYW0gb2YgZXZlbnRzIHRoYXQgaGFwcGVuIGR1cmluZyB0aGUgUnVuIGFzIHNlcnZlci1zZW50XG4gICAqIGV2ZW50cywgdGVybWluYXRpbmcgd2hlbiB0aGUgUnVuIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlIHdpdGggYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKi9cbiAgc3RyZWFtOiB0cnVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkxpc3RQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY3Vyc29yIGZvciB1c2UgaW4gcGFnaW5hdGlvbi4gYGJlZm9yZWAgaXMgYW4gb2JqZWN0IElEIHRoYXQgZGVmaW5lcyB5b3VyIHBsYWNlXG4gICAqIGluIHRoZSBsaXN0LiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBtYWtlIGEgbGlzdCByZXF1ZXN0IGFuZCByZWNlaXZlIDEwMCBvYmplY3RzLFxuICAgKiBlbmRpbmcgd2l0aCBvYmpfZm9vLCB5b3VyIHN1YnNlcXVlbnQgY2FsbCBjYW4gaW5jbHVkZSBiZWZvcmU9b2JqX2ZvbyBpbiBvcmRlciB0b1xuICAgKiBmZXRjaCB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgbGlzdC5cbiAgICovXG4gIGJlZm9yZT86IHN0cmluZztcblxuICAvKipcbiAgICogU29ydCBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWVzdGFtcCBvZiB0aGUgb2JqZWN0cy4gYGFzY2AgZm9yIGFzY2VuZGluZ1xuICAgKiBvcmRlciBhbmQgYGRlc2NgIGZvciBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKi9cbiAgb3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5DcmVhdGVBbmRQb2xsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHJ1bi4gVGhpc1xuICAgKiBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzIHdpdGhvdXQgb3ZlcnJpZGluZyBvdGhlclxuICAgKiBpbnN0cnVjdGlvbnMuXG4gICAqL1xuICBhZGRpdGlvbmFsX2luc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFkZHMgYWRkaXRpb25hbCBtZXNzYWdlcyB0byB0aGUgdGhyZWFkIGJlZm9yZSBjcmVhdGluZyB0aGUgcnVuLlxuICAgKi9cbiAgYWRkaXRpb25hbF9tZXNzYWdlcz86IEFycmF5PFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMuQWRkaXRpb25hbE1lc3NhZ2U+IHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZVxuICAgKiBbaW5zdHJ1Y3Rpb25zXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMvY3JlYXRlQXNzaXN0YW50KVxuICAgKiBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFRvb2w+IHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgdHJ1bmNhdGlvbl9zdHJhdGVneT86IFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMuVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5DcmVhdGVBbmRQb2xsUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICovXG4gICAgYXR0YWNobWVudHM/OiBBcnJheTxBZGRpdGlvbmFsTWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICAgKi9cbiAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgcnVuLiBUaGlzXG4gICAqIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMgd2l0aG91dCBvdmVycmlkaW5nIG90aGVyXG4gICAqIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGFkZGl0aW9uYWxfaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQWRkcyBhZGRpdGlvbmFsIG1lc3NhZ2VzIHRvIHRoZSB0aHJlYWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBydW4uXG4gICAqL1xuICBhZGRpdGlvbmFsX21lc3NhZ2VzPzogQXJyYXk8UnVuQ3JlYXRlQW5kU3RyZWFtUGFyYW1zLkFkZGl0aW9uYWxNZXNzYWdlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGVcbiAgICogW2luc3RydWN0aW9uc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzL2NyZWF0ZUFzc2lzdGFudClcbiAgICogb2YgdGhlIGFzc2lzdGFudC4gVGhpcyBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZVxuICAgKiBydW4uIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBjb21wbGV0aW9uIHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9jb21wbGV0aW9uX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAqIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIHByb21wdCB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfcHJvbXB0X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW01vZGVsXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscykgdG9cbiAgICogYmUgdXNlZCB0byBleGVjdXRlIHRoaXMgcnVuLiBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkIGhlcmUsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlXG4gICAqIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50LiBJZiBub3QsIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIGFzc2lzdGFudCB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBtb2RlbD86XG4gICAgfCAoc3RyaW5nICYge30pXG4gICAgfCAnZ3B0LTQtdHVyYm8nXG4gICAgfCAnZ3B0LTQtdHVyYm8tMjAyNC0wNC0wOSdcbiAgICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgICB8ICdncHQtNC0xMTA2LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQnXG4gICAgfCAnZ3B0LTQtMDMxNCdcbiAgICB8ICdncHQtNC0wNjEzJ1xuICAgIHwgJ2dwdC00LTMyaydcbiAgICB8ICdncHQtNC0zMmstMDMxNCdcbiAgICB8ICdncHQtNC0zMmstMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrLTA2MTMnXG4gICAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LWFuZC1ncHQtNC10dXJibykgYW5kXG4gICAqIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqIGFuZCBtZWFucyB0aGUgbW9kZWwgY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlXG4gICAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAgICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICovXG4gIHRvb2xfY2hvaWNlPzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRvb2xzIHRoZSBhc3Npc3RhbnQgY2FuIHVzZSBmb3IgdGhpcyBydW4uIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRUb29sPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBSdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXMuVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb250ZW50OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgKi9cbiAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICAgKi9cbiAgICBhdHRhY2htZW50cz86IEFycmF5PEFkZGl0aW9uYWxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAqL1xuICAgICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVHJ1bmNhdGlvblN0cmF0ZWd5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJ1bmNhdGlvbiBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSB0aHJlYWQuIFRoZSBkZWZhdWx0IGlzIGBhdXRvYC4gSWYgc2V0IHRvXG4gICAgICogYGxhc3RfbWVzc2FnZXNgLCB0aGUgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBuIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGluXG4gICAgICogdGhlIHRocmVhZC4gV2hlbiBzZXQgdG8gYGF1dG9gLCBtZXNzYWdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0aHJlYWQgd2lsbCBiZVxuICAgICAqIGRyb3BwZWQgdG8gZml0IHRoZSBjb250ZXh0IGxlbmd0aCBvZiB0aGUgbW9kZWwsIGBtYXhfcHJvbXB0X3Rva2Vuc2AuXG4gICAgICovXG4gICAgdHlwZTogJ2F1dG8nIHwgJ2xhc3RfbWVzc2FnZXMnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBtZXNzYWdlcyBmcm9tIHRoZSB0aHJlYWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNvbnRleHRcbiAgICAgKiBmb3IgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBsYXN0X21lc3NhZ2VzPzogbnVtYmVyIHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0cmVhbVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdG8gdXNlIHRvXG4gICAqIGV4ZWN1dGUgdGhpcyBydW4uXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXBwZW5kcyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBydW4uIFRoaXNcbiAgICogaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcyB3aXRob3V0IG92ZXJyaWRpbmcgb3RoZXJcbiAgICogaW5zdHJ1Y3Rpb25zLlxuICAgKi9cbiAgYWRkaXRpb25hbF9pbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFkZGl0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIHRocmVhZCBiZWZvcmUgY3JlYXRpbmcgdGhlIHJ1bi5cbiAgICovXG4gIGFkZGl0aW9uYWxfbWVzc2FnZXM/OiBBcnJheTxSdW5TdHJlYW1QYXJhbXMuQWRkaXRpb25hbE1lc3NhZ2U+IHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZVxuICAgKiBbaW5zdHJ1Y3Rpb25zXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMvY3JlYXRlQXNzaXN0YW50KVxuICAgKiBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFRvb2w+IHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgdHJ1bmNhdGlvbl9zdHJhdGVneT86IFJ1blN0cmVhbVBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN0cmVhbVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNvbnRlbnQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgKlxuICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAqIC0gYGFzc2lzdGFudGA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2lzdGFudC4gVXNlIHRoaXNcbiAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAqL1xuICAgIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAqL1xuICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8QWRkaXRpb25hbE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICovXG4gICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zID1cbiAgfCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZ1xuICB8IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbHMgZm9yIHdoaWNoIHRoZSBvdXRwdXRzIGFyZSBiZWluZyBzdWJtaXR0ZWQuXG4gICAqL1xuICB0b29sX291dHB1dHM6IEFycmF5PFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zLlRvb2xPdXRwdXQ+O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJldHVybnMgYSBzdHJlYW0gb2YgZXZlbnRzIHRoYXQgaGFwcGVuIGR1cmluZyB0aGUgUnVuIGFzIHNlcnZlci1zZW50XG4gICAqIGV2ZW50cywgdGVybWluYXRpbmcgd2hlbiB0aGUgUnVuIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlIHdpdGggYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKi9cbiAgc3RyZWFtPzogYm9vbGVhbiB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xPdXRwdXQge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIHRvb2wgY2FsbCB0byBiZSBzdWJtaXR0ZWQgdG8gY29udGludWUgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBvdXRwdXQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCBpbiB0aGUgYHJlcXVpcmVkX2FjdGlvbmAgb2JqZWN0IHdpdGhpbiB0aGUgcnVuIG9iamVjdFxuICAgICAqIHRoZSBvdXRwdXQgaXMgYmVpbmcgc3VibWl0dGVkIGZvci5cbiAgICAgKi9cbiAgICB0b29sX2NhbGxfaWQ/OiBzdHJpbmc7XG4gIH1cblxuICBleHBvcnQgdHlwZSBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCB0eXBlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZyBleHRlbmRzIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJldHVybnMgYSBzdHJlYW0gb2YgZXZlbnRzIHRoYXQgaGFwcGVuIGR1cmluZyB0aGUgUnVuIGFzIHNlcnZlci1zZW50XG4gICAqIGV2ZW50cywgdGVybWluYXRpbmcgd2hlbiB0aGUgUnVuIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlIHdpdGggYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKi9cbiAgc3RyZWFtPzogZmFsc2UgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nIGV4dGVuZHMgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW06IHRydWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNBbmRQb2xsUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0b29scyBmb3Igd2hpY2ggdGhlIG91dHB1dHMgYXJlIGJlaW5nIHN1Ym1pdHRlZC5cbiAgICovXG4gIHRvb2xfb3V0cHV0czogQXJyYXk8UnVuU3VibWl0VG9vbE91dHB1dHNBbmRQb2xsUGFyYW1zLlRvb2xPdXRwdXQ+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzQW5kUG9sbFBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbE91dHB1dCB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBvZiB0aGUgdG9vbCBjYWxsIHRvIGJlIHN1Ym1pdHRlZCB0byBjb250aW51ZSB0aGUgcnVuLlxuICAgICAqL1xuICAgIG91dHB1dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIGluIHRoZSBgcmVxdWlyZWRfYWN0aW9uYCBvYmplY3Qgd2l0aGluIHRoZSBydW4gb2JqZWN0XG4gICAgICogdGhlIG91dHB1dCBpcyBiZWluZyBzdWJtaXR0ZWQgZm9yLlxuICAgICAqL1xuICAgIHRvb2xfY2FsbF9pZD86IHN0cmluZztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzU3RyZWFtUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0b29scyBmb3Igd2hpY2ggdGhlIG91dHB1dHMgYXJlIGJlaW5nIHN1Ym1pdHRlZC5cbiAgICovXG4gIHRvb2xfb3V0cHV0czogQXJyYXk8UnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXMuVG9vbE91dHB1dD47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xPdXRwdXQge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIHRvb2wgY2FsbCB0byBiZSBzdWJtaXR0ZWQgdG8gY29udGludWUgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBvdXRwdXQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCBpbiB0aGUgYHJlcXVpcmVkX2FjdGlvbmAgb2JqZWN0IHdpdGhpbiB0aGUgcnVuIG9iamVjdFxuICAgICAqIHRoZSBvdXRwdXQgaXMgYmVpbmcgc3VibWl0dGVkIGZvci5cbiAgICAgKi9cbiAgICB0b29sX2NhbGxfaWQ/OiBzdHJpbmc7XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5zIHtcbiAgZXhwb3J0IGltcG9ydCBSZXF1aXJlZEFjdGlvbkZ1bmN0aW9uVG9vbENhbGwgPSBSdW5zQVBJLlJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBSdW4gPSBSdW5zQVBJLlJ1bjtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGF0dXMgPSBSdW5zQVBJLlJ1blN0YXR1cztcbiAgZXhwb3J0IGltcG9ydCBSdW5zUGFnZSA9IFJ1bnNBUEkuUnVuc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlUGFyYW1zID0gUnVuc0FQSS5SdW5DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgUnVuVXBkYXRlUGFyYW1zID0gUnVuc0FQSS5SdW5VcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuTGlzdFBhcmFtcyA9IFJ1bnNBUEkuUnVuTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVBbmRQb2xsUGFyYW1zID0gUnVuc0FQSS5SdW5DcmVhdGVBbmRQb2xsUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcyA9IFJ1bnNBUEkuUnVuQ3JlYXRlQW5kU3RyZWFtUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0cmVhbVBhcmFtcyA9IFJ1bnNBUEkuUnVuU3RyZWFtUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmcgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzQW5kUG9sbFBhcmFtcyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNBbmRQb2xsUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzU3RyZWFtUGFyYW1zID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1N0cmVhbVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBTdGVwcyA9IFN0ZXBzQVBJLlN0ZXBzO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlckxvZ3MgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJMb2dzO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlck91dHB1dEltYWdlID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyVG9vbENhbGwgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbERlbHRhID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBGaWxlU2VhcmNoVG9vbENhbGwgPSBTdGVwc0FQSS5GaWxlU2VhcmNoVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVNlYXJjaFRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5GaWxlU2VhcmNoVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblRvb2xDYWxsID0gU3RlcHNBUEkuRnVuY3Rpb25Ub29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5GdW5jdGlvblRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHMgPSBTdGVwc0FQSS5NZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwID0gU3RlcHNBUEkuUnVuU3RlcDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwRGVsdGEgPSBTdGVwc0FQSS5SdW5TdGVwRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcERlbHRhRXZlbnQgPSBTdGVwc0FQSS5SdW5TdGVwRGVsdGFFdmVudDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEgPSBTdGVwc0FQSS5SdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGwgPSBTdGVwc0FQSS5Ub29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbERlbHRhID0gU3RlcHNBUEkuVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbERlbHRhT2JqZWN0ID0gU3RlcHNBUEkuVG9vbENhbGxEZWx0YU9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbHNTdGVwRGV0YWlscyA9IFN0ZXBzQVBJLlRvb2xDYWxsc1N0ZXBEZXRhaWxzO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBzUGFnZSA9IFN0ZXBzQVBJLlJ1blN0ZXBzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBTdGVwTGlzdFBhcmFtcyA9IFN0ZXBzQVBJLlN0ZXBMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVByb21pc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQXNzaXN0YW50U3RyZWFtLCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlU3RyZWFtIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9Bc3Npc3RhbnRTdHJlYW1cIjtcbmltcG9ydCAqIGFzIFRocmVhZHNBUEkgZnJvbSBcIi4vdGhyZWFkc1wiO1xuaW1wb3J0ICogYXMgQXNzaXN0YW50c0FQSSBmcm9tIFwiLi4vYXNzaXN0YW50c1wiO1xuaW1wb3J0ICogYXMgTWVzc2FnZXNBUEkgZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIFJ1bnNBUEkgZnJvbSBcIi4vcnVucy9ydW5zXCI7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tIFwiLi4vLi4vLi4vc3RyZWFtaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBUaHJlYWRzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBydW5zOiBSdW5zQVBJLlJ1bnMgPSBuZXcgUnVuc0FQSS5SdW5zKHRoaXMuX2NsaWVudCk7XG4gIG1lc3NhZ2VzOiBNZXNzYWdlc0FQSS5NZXNzYWdlcyA9IG5ldyBNZXNzYWdlc0FQSS5NZXNzYWdlcyh0aGlzLl9jbGllbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0aHJlYWQuXG4gICAqL1xuICBjcmVhdGUoYm9keT86IFRocmVhZENyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VGhyZWFkPjtcbiAgY3JlYXRlKG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRocmVhZD47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxUaHJlYWQ+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhib2R5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHt9LCBib2R5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvdGhyZWFkcycsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB0aHJlYWQuXG4gICAqL1xuICByZXRyaWV2ZSh0aHJlYWRJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxUaHJlYWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3RocmVhZHMvJHt0aHJlYWRJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBhIHRocmVhZC5cbiAgICovXG4gIHVwZGF0ZSh0aHJlYWRJZDogc3RyaW5nLCBib2R5OiBUaHJlYWRVcGRhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRocmVhZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3RocmVhZHMvJHt0aHJlYWRJZH1gLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgdGhyZWFkLlxuICAgKi9cbiAgZGVsKHRocmVhZElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRocmVhZERlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL3RocmVhZHMvJHt0aHJlYWRJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0aHJlYWQgYW5kIHJ1biBpdCBpbiBvbmUgcmVxdWVzdC5cbiAgICovXG4gIGNyZWF0ZUFuZFJ1bihcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8UnVuc0FQSS5SdW4+O1xuICBjcmVhdGVBbmRSdW4oXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj47XG4gIGNyZWF0ZUFuZFJ1bihcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50PiB8IFJ1bnNBUEkuUnVuPjtcbiAgY3JlYXRlQW5kUnVuKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxSdW5zQVBJLlJ1bj4gfCBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL3RocmVhZHMvcnVucycsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UsXG4gICAgfSkgYXMgQVBJUHJvbWlzZTxSdW5zQVBJLlJ1bj4gfCBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50Pj47XG4gIH1cblxuICAvKipcbiAgICogQSBoZWxwZXIgdG8gY3JlYXRlIGEgdGhyZWFkLCBzdGFydCBhIHJ1biBhbmQgdGhlbiBwb2xsIGZvciBhIHRlcm1pbmFsIHN0YXRlLlxuICAgKiBNb3JlIGluZm9ybWF0aW9uIG9uIFJ1biBsaWZlY3ljbGVzIGNhbiBiZSBmb3VuZCBoZXJlOlxuICAgKiBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hc3Npc3RhbnRzL2hvdy1pdC13b3Jrcy9ydW5zLWFuZC1ydW4tc3RlcHNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFuZFJ1blBvbGwoXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFRocmVhZHMuUnVuPiB7XG4gICAgY29uc3QgcnVuID0gYXdhaXQgdGhpcy5jcmVhdGVBbmRSdW4oYm9keSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVucy5wb2xsKHJ1bi50aHJlYWRfaWQsIHJ1bi5pZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdGhyZWFkIGFuZCBzdHJlYW0gdGhlIHJ1biBiYWNrXG4gICAqL1xuICBjcmVhdGVBbmRSdW5TdHJlYW0oXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZVN0cmVhbSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQXNzaXN0YW50U3RyZWFtIHtcbiAgICByZXR1cm4gQXNzaXN0YW50U3RyZWFtLmNyZWF0ZVRocmVhZEFzc2lzdGFudFN0cmVhbShib2R5LCB0aGlzLl9jbGllbnQuYmV0YS50aHJlYWRzLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSBleHBlY3RlZCBvdXRwdXQgb2YgdGhlIG1vZGVsLiBJZiBganNvbl9vYmplY3RgIG9ubHlcbiAqIGBmdW5jdGlvbmAgdHlwZSBgdG9vbHNgIGFyZSBhbGxvd2VkIHRvIGJlIHBhc3NlZCB0byB0aGUgUnVuLiBJZiBgdGV4dGAgdGhlIG1vZGVsXG4gKiBjYW4gcmV0dXJuIHRleHQgb3IgYW55IHZhbHVlIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdCB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIG9uZSBvZiBgdGV4dGAgb3IgYGpzb25fb2JqZWN0YC5cbiAgICovXG4gIHR5cGU/OiAndGV4dCcgfCAnanNvbl9vYmplY3QnO1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LWFuZC1ncHQtNC10dXJibykgYW5kXG4gKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gKlxuICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gKlxuICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICovXG5leHBvcnQgdHlwZSBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiA9ICdub25lJyB8ICdhdXRvJyB8IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0O1xuXG4vKipcbiAqIFNwZWNpZmllcyBhIHRvb2wgdGhlIG1vZGVsIHNob3VsZCB1c2UuIFVzZSB0byBmb3JjZSB0aGUgbW9kZWwgdG8gY2FsbCBhIHNwZWNpZmljXG4gKiB0b29sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudFRvb2xDaG9pY2Uge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIElmIHR5cGUgaXMgYGZ1bmN0aW9uYCwgdGhlIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBzZXRcbiAgICovXG4gIHR5cGU6ICdmdW5jdGlvbicgfCAnY29kZV9pbnRlcnByZXRlcicgfCAnZmlsZV9zZWFyY2gnO1xuXG4gIGZ1bmN0aW9uPzogQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudFRvb2xDaG9pY2VGdW5jdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gKiBjYWxsIHRoYXQgdG9vbC5cbiAqL1xuZXhwb3J0IHR5cGUgQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiA9ICdub25lJyB8ICdhdXRvJyB8ICdyZXF1aXJlZCcgfCBBc3Npc3RhbnRUb29sQ2hvaWNlO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0aHJlYWQgdGhhdCBjb250YWluc1xuICogW21lc3NhZ2VzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJlYWQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSB0aHJlYWQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhOiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHRocmVhZGAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQnO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzOiBUaHJlYWQuVG9vbFJlc291cmNlcyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkIHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkRGVsZXRlZCB7XG4gIGlkOiBzdHJpbmc7XG5cbiAgZGVsZXRlZDogYm9vbGVhbjtcblxuICBvYmplY3Q6ICd0aHJlYWQuZGVsZXRlZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpIHRvXG4gICAqIHN0YXJ0IHRoZSB0aHJlYWQgd2l0aC5cbiAgICovXG4gIG1lc3NhZ2VzPzogQXJyYXk8VGhyZWFkQ3JlYXRlUGFyYW1zLk1lc3NhZ2U+O1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkQ3JlYXRlUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZENyZWF0ZVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICovXG4gICAgYXR0YWNobWVudHM/OiBBcnJheTxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICovXG4gICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSB0aHJlYWQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAvKipcbiAgICAgICAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogd2l0aCBmaWxlX2lkcyBhbmQgYXR0YWNoIGl0IHRvIHRoaXMgdGhyZWFkLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yXG4gICAgICAgKiBzdG9yZSBhdHRhY2hlZCB0byB0aGUgdGhyZWFkLlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVzPzogQXJyYXk8RmlsZVNlYXJjaC5WZWN0b3JTdG9yZT47XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmUge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICogYWRkIHRvIHRoZSB2ZWN0b3Igc3RvcmUuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTAwMDAgZmlsZXMgaW4gYSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAqIHVzZWZ1bCBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZWN0b3Igc3RvcmUgaW4gYSBzdHJ1Y3R1cmVkXG4gICAgICAgICAqIGZvcm1hdC4gS2V5cyBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bVxuICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgKi9cbiAgICAgICAgbWV0YWRhdGE/OiB1bmtub3duO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZFVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkVXBkYXRlUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZFVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSB0aHJlYWQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMgPVxuICB8IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZ1xuICB8IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZztcblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBzeXN0ZW0gbWVzc2FnZSBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIG5vIHRocmVhZCBpcyBwcm92aWRlZCwgYW4gZW1wdHkgdGhyZWFkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHRocmVhZD86IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcy5UaHJlYWQ7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxcbiAgICBBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sIHwgQXNzaXN0YW50c0FQSS5GdW5jdGlvblRvb2xcbiAgPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMuVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMge1xuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWQge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpIHRvXG4gICAgICogc3RhcnQgdGhlIHRocmVhZCB3aXRoLlxuICAgICAqL1xuICAgIG1lc3NhZ2VzPzogQXJyYXk8VGhyZWFkLk1lc3NhZ2U+O1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICB0b29sX3Jlc291cmNlcz86IFRocmVhZC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgY29udGVudDogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgICAqXG4gICAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgICAqL1xuICAgICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAgICovXG4gICAgICBhdHRhY2htZW50cz86IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAqL1xuICAgICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAgICovXG4gICAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGVcbiAgICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiB3aXRoIGZpbGVfaWRzIGFuZCBhdHRhY2ggaXQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUgYXR0YWNoZWQgdG8gdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZXM/OiBBcnJheTxGaWxlU2VhcmNoLlZlY3RvclN0b3JlPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICAgKiBhZGQgdG8gdGhlIHZlY3RvciBzdG9yZS4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMDAwMCBmaWxlcyBpbiBhIHZlY3RvclxuICAgICAgICAgICAqIHN0b3JlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAgICogdXNlZnVsIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlY3RvciBzdG9yZSBpbiBhIHN0cnVjdHVyZWRcbiAgICAgICAgICAgKiBmb3JtYXQuIEtleXMgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW1cbiAgICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1ldGFkYXRhPzogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCB0eXBlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZyBleHRlbmRzIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbT86IGZhbHNlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmcgZXh0ZW5kcyBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW06IHRydWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdG8gdXNlIHRvXG4gICAqIGV4ZWN1dGUgdGhpcyBydW4uXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgc3lzdGVtIG1lc3NhZ2Ugb2YgdGhlIGFzc2lzdGFudC4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZVxuICAgKiBydW4uIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBjb21wbGV0aW9uIHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9jb21wbGV0aW9uX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAqIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIHByb21wdCB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfcHJvbXB0X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW01vZGVsXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscykgdG9cbiAgICogYmUgdXNlZCB0byBleGVjdXRlIHRoaXMgcnVuLiBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkIGhlcmUsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlXG4gICAqIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50LiBJZiBub3QsIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIGFzc2lzdGFudCB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBtb2RlbD86XG4gICAgfCAoc3RyaW5nICYge30pXG4gICAgfCAnZ3B0LTQtdHVyYm8nXG4gICAgfCAnZ3B0LTQtdHVyYm8tMjAyNC0wNC0wOSdcbiAgICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgICB8ICdncHQtNC0xMTA2LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQnXG4gICAgfCAnZ3B0LTQtMDMxNCdcbiAgICB8ICdncHQtNC0wNjEzJ1xuICAgIHwgJ2dwdC00LTMyaydcbiAgICB8ICdncHQtNC0zMmstMDMxNCdcbiAgICB8ICdncHQtNC0zMmstMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrLTA2MTMnXG4gICAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LWFuZC1ncHQtNC10dXJibykgYW5kXG4gICAqIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgdGhyZWFkPzogVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcy5UaHJlYWQ7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcy5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRvb2xzIHRoZSBhc3Npc3RhbnQgY2FuIHVzZSBmb3IgdGhpcyBydW4uIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8XG4gICAgQXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbCB8IEFzc2lzdGFudHNBUEkuRnVuY3Rpb25Ub29sXG4gID4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBvbGxQYXJhbXMge1xuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWQge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpIHRvXG4gICAgICogc3RhcnQgdGhlIHRocmVhZCB3aXRoLlxuICAgICAqL1xuICAgIG1lc3NhZ2VzPzogQXJyYXk8VGhyZWFkLk1lc3NhZ2U+O1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICB0b29sX3Jlc291cmNlcz86IFRocmVhZC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgY29udGVudDogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgICAqXG4gICAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgICAqL1xuICAgICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAgICovXG4gICAgICBhdHRhY2htZW50cz86IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAqL1xuICAgICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAgICovXG4gICAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGVcbiAgICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiB3aXRoIGZpbGVfaWRzIGFuZCBhdHRhY2ggaXQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUgYXR0YWNoZWQgdG8gdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZXM/OiBBcnJheTxGaWxlU2VhcmNoLlZlY3RvclN0b3JlPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICAgKiBhZGQgdG8gdGhlIHZlY3RvciBzdG9yZS4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMDAwMCBmaWxlcyBpbiBhIHZlY3RvclxuICAgICAgICAgICAqIHN0b3JlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAgICogdXNlZnVsIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlY3RvciBzdG9yZSBpbiBhIHN0cnVjdHVyZWRcbiAgICAgICAgICAgKiBmb3JtYXQuIEtleXMgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW1cbiAgICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1ldGFkYXRhPzogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBzeXN0ZW0gbWVzc2FnZSBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJZiBubyB0aHJlYWQgaXMgcHJvdmlkZWQsIGFuIGVtcHR5IHRocmVhZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICB0aHJlYWQ/OiBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMuVGhyZWFkO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqIGFuZCBtZWFucyB0aGUgbW9kZWwgY2FuIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlXG4gICAqIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zIHRoZSBtb2RlbCBtdXN0IGNhbGwgb25lIG9yIG1vcmUgdG9vbHMgYmVmb3JlIHJlc3BvbmRpbmdcbiAgICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICovXG4gIHRvb2xfY2hvaWNlPzogQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICB0b29sX3Jlc291cmNlcz86IFRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcy5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRvb2xzIHRoZSBhc3Npc3RhbnQgY2FuIHVzZSBmb3IgdGhpcyBydW4uIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8XG4gICAgQXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbCB8IEFzc2lzdGFudHNBUEkuRnVuY3Rpb25Ub29sXG4gID4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zLlRydW5jYXRpb25TdHJhdGVneSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zIHtcbiAgLyoqXG4gICAqIElmIG5vIHRocmVhZCBpcyBwcm92aWRlZCwgYW4gZW1wdHkgdGhyZWFkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgW21lc3NhZ2VzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzKSB0b1xuICAgICAqIHN0YXJ0IHRoZSB0aHJlYWQgd2l0aC5cbiAgICAgKi9cbiAgICBtZXNzYWdlcz86IEFycmF5PFRocmVhZC5NZXNzYWdlPjtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAgICovXG4gICAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWQuVG9vbFJlc291cmNlcyB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRocmVhZCB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnQ6IHN0cmluZztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAgICAgKlxuICAgICAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgICAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICAgICAqIC0gYGFzc2lzdGFudGA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2lzdGFudC4gVXNlIHRoaXNcbiAgICAgICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICAgKi9cbiAgICAgIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICAgICAqL1xuICAgICAgYXR0YWNobWVudHM/OiBBcnJheTxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICAgKi9cbiAgICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICAgICAqL1xuICAgICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgICAqIHRocmVhZC4gVGhlIHJlc291cmNlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZVxuICAgICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICAgKi9cbiAgICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlXG4gICAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgdGhyZWFkLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgICAqIHRoZSB0aHJlYWQuXG4gICAgICAgICAqL1xuICAgICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBoZWxwZXIgdG8gY3JlYXRlIGFcbiAgICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAgICogd2l0aCBmaWxlX2lkcyBhbmQgYXR0YWNoIGl0IHRvIHRoaXMgdGhyZWFkLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yXG4gICAgICAgICAqIHN0b3JlIGF0dGFjaGVkIHRvIHRoZSB0aHJlYWQuXG4gICAgICAgICAqL1xuICAgICAgICB2ZWN0b3Jfc3RvcmVzPzogQXJyYXk8RmlsZVNlYXJjaC5WZWN0b3JTdG9yZT47XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBuYW1lc3BhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAgIGV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmUge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIHRvXG4gICAgICAgICAgICogYWRkIHRvIHRoZSB2ZWN0b3Igc3RvcmUuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTAwMDAgZmlsZXMgaW4gYSB2ZWN0b3JcbiAgICAgICAgICAgKiBzdG9yZS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgdmVjdG9yIHN0b3JlLiBUaGlzIGNhbiBiZVxuICAgICAgICAgICAqIHVzZWZ1bCBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZWN0b3Igc3RvcmUgaW4gYSBzdHJ1Y3R1cmVkXG4gICAgICAgICAgICogZm9ybWF0LiBLZXlzIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtXG4gICAgICAgICAgICogb2YgNTEyIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBtZXRhZGF0YT86IHVua25vd247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgKiB0aGUgYXNzaXN0YW50LlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVHJ1bmNhdGlvblN0cmF0ZWd5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJ1bmNhdGlvbiBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSB0aHJlYWQuIFRoZSBkZWZhdWx0IGlzIGBhdXRvYC4gSWYgc2V0IHRvXG4gICAgICogYGxhc3RfbWVzc2FnZXNgLCB0aGUgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBuIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGluXG4gICAgICogdGhlIHRocmVhZC4gV2hlbiBzZXQgdG8gYGF1dG9gLCBtZXNzYWdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0aHJlYWQgd2lsbCBiZVxuICAgICAqIGRyb3BwZWQgdG8gZml0IHRoZSBjb250ZXh0IGxlbmd0aCBvZiB0aGUgbW9kZWwsIGBtYXhfcHJvbXB0X3Rva2Vuc2AuXG4gICAgICovXG4gICAgdHlwZTogJ2F1dG8nIHwgJ2xhc3RfbWVzc2FnZXMnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBtZXNzYWdlcyBmcm9tIHRoZSB0aHJlYWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNvbnRleHRcbiAgICAgKiBmb3IgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBsYXN0X21lc3NhZ2VzPzogbnVtYmVyIHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZHMge1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0ID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiA9IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VG9vbENob2ljZSA9IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sQ2hvaWNlRnVuY3Rpb24gPSBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VGdW5jdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZCA9IFRocmVhZHNBUEkuVGhyZWFkO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZERlbGV0ZWQgPSBUaHJlYWRzQVBJLlRocmVhZERlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkVXBkYXRlUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5zID0gUnVuc0FQSS5SdW5zO1xuICBleHBvcnQgaW1wb3J0IFJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbCA9IFJ1bnNBUEkuUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IFJ1biA9IFJ1bnNBUEkuUnVuO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0YXR1cyA9IFJ1bnNBUEkuUnVuU3RhdHVzO1xuICBleHBvcnQgaW1wb3J0IFJ1bnNQYWdlID0gUnVuc0FQSS5SdW5zUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5VcGRhdGVQYXJhbXMgPSBSdW5zQVBJLlJ1blVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5MaXN0UGFyYW1zID0gUnVuc0FQSS5SdW5MaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlQW5kU3RyZWFtUGFyYW1zID0gUnVuc0FQSS5SdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RyZWFtUGFyYW1zID0gUnVuc0FQSS5SdW5TdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNBbmRQb2xsUGFyYW1zID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzU3RyZWFtUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VzID0gTWVzc2FnZXNBUEkuTWVzc2FnZXM7XG4gIGV4cG9ydCBpbXBvcnQgQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQW5ub3RhdGlvbkRlbHRhID0gTWVzc2FnZXNBUEkuQW5ub3RhdGlvbkRlbHRhO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDaXRhdGlvbkFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlQ2l0YXRpb25Bbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaWxlUGF0aEFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlUGF0aEFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVBhdGhEZWx0YUFubm90YXRpb24gPSBNZXNzYWdlc0FQSS5GaWxlUGF0aERlbHRhQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGUgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGU7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlQ29udGVudEJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlQ29udGVudEJsb2NrO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRmlsZURlbHRhID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlRGVsdGFCbG9jayA9IE1lc3NhZ2VzQVBJLkltYWdlRmlsZURlbHRhQmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNvbnRlbnQgPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudDtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ29udGVudERlbHRhID0gTWVzc2FnZXNBUEkuTWVzc2FnZUNvbnRlbnREZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlRGVsZXRlZCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWx0YSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlRGVsdGFFdmVudCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFRleHQgPSBNZXNzYWdlc0FQSS5UZXh0O1xuICBleHBvcnQgaW1wb3J0IFRleHRDb250ZW50QmxvY2sgPSBNZXNzYWdlc0FQSS5UZXh0Q29udGVudEJsb2NrO1xuICBleHBvcnQgaW1wb3J0IFRleHREZWx0YSA9IE1lc3NhZ2VzQVBJLlRleHREZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBUZXh0RGVsdGFCbG9jayA9IE1lc3NhZ2VzQVBJLlRleHREZWx0YUJsb2NrO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VzUGFnZSA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ3JlYXRlUGFyYW1zID0gTWVzc2FnZXNBUEkuTWVzc2FnZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlVXBkYXRlUGFyYW1zID0gTWVzc2FnZXNBUEkuTWVzc2FnZVVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlTGlzdFBhcmFtcyA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VMaXN0UGFyYW1zO1xufVxuIiwgIi8qKlxuICogTGlrZSBgUHJvbWlzZS5hbGxTZXR0bGVkKClgIGJ1dCB0aHJvd3MgYW4gZXJyb3IgaWYgYW55IHByb21pc2VzIGFyZSByZWplY3RlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsbFNldHRsZWRXaXRoVGhyb3cgPSBhc3luYyA8Uj4ocHJvbWlzZXM6IFByb21pc2U8Uj5bXSk6IFByb21pc2U8UltdPiA9PiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuICBjb25zdCByZWplY3RlZCA9IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpOiByZXN1bHQgaXMgUHJvbWlzZVJlamVjdGVkUmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpO1xuICBpZiAocmVqZWN0ZWQubGVuZ3RoKSB7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVqZWN0ZWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocmVzdWx0LnJlYXNvbik7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3JlamVjdGVkLmxlbmd0aH0gcHJvbWlzZShzKSBmYWlsZWQgLSBzZWUgdGhlIGFib3ZlIGVycm9yc2ApO1xuICB9XG5cbiAgLy8gTm90ZTogVFMgd2FzIGNvbXBsYWluaW5nIGFib3V0IHVzaW5nIGAuZmlsdGVyKCkubWFwKClgIGhlcmUgZm9yIHNvbWUgcmVhc29uXG4gIGNvbnN0IHZhbHVlczogUltdID0gW107XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZXM7XG59O1xuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IHNsZWVwLCBVcGxvYWRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCAqIGFzIEZpbGVzQVBJIGZyb20gXCIuL2ZpbGVzXCI7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vcGFnaW5hdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgRmlsZXMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSB2ZWN0b3Igc3RvcmUgZmlsZSBieSBhdHRhY2hpbmcgYVxuICAgKiBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgdG8gYVxuICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KS5cbiAgICovXG4gIGNyZWF0ZShcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYm9keTogRmlsZUNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlRmlsZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfS9maWxlc2AsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB2ZWN0b3Igc3RvcmUgZmlsZS5cbiAgICovXG4gIHJldHJpZXZlKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBmaWxlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlRmlsZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVzLyR7ZmlsZUlkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBmaWxlcy5cbiAgICovXG4gIGxpc3QoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogRmlsZUxpc3RQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVGaWxlc1BhZ2UsIFZlY3RvclN0b3JlRmlsZT47XG4gIGxpc3QoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3JlRmlsZXNQYWdlLCBWZWN0b3JTdG9yZUZpbGU+O1xuICBsaXN0KFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBxdWVyeTogRmlsZUxpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVGaWxlc1BhZ2UsIFZlY3RvclN0b3JlRmlsZT4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh2ZWN0b3JTdG9yZUlkLCB7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZXNgLCBWZWN0b3JTdG9yZUZpbGVzUGFnZSwge1xuICAgICAgcXVlcnksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSB2ZWN0b3Igc3RvcmUgZmlsZS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSB2ZWN0b3Igc3RvcmUgYnV0XG4gICAqIHRoZSBmaWxlIGl0c2VsZiB3aWxsIG5vdCBiZSBkZWxldGVkLiBUbyBkZWxldGUgdGhlIGZpbGUsIHVzZSB0aGVcbiAgICogW2RlbGV0ZSBmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzL2RlbGV0ZSlcbiAgICogZW5kcG9pbnQuXG4gICAqL1xuICBkZWwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGZpbGVJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVGaWxlRGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVzLyR7ZmlsZUlkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIGZpbGUgdG8gdGhlIGdpdmVuIHZlY3RvciBzdG9yZSBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgcHJvY2Vzc2VkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQW5kUG9sbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYm9keTogRmlsZUNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGU+IHtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgdGhpcy5jcmVhdGUodmVjdG9yU3RvcmVJZCwgYm9keSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucG9sbCh2ZWN0b3JTdG9yZUlkLCBmaWxlLmlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IGZvciB0aGUgdmVjdG9yIHN0b3JlIGZpbGUgdG8gZmluaXNoIHByb2Nlc3NpbmcuXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgd2lsbCByZXR1cm4gZXZlbiBpZiB0aGUgZmlsZSBmYWlsZWQgdG8gcHJvY2VzcywgeW91IG5lZWQgdG8gY2hlY2tcbiAgICogZmlsZS5sYXN0X2Vycm9yIGFuZCBmaWxlLnN0YXR1cyB0byBoYW5kbGUgdGhlc2UgY2FzZXNcbiAgICovXG4gIGFzeW5jIHBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGZpbGVJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFZlY3RvclN0b3JlRmlsZT4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1Qb2xsLUhlbHBlcic6ICd0cnVlJyB9O1xuICAgIGlmIChvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcykge1xuICAgICAgaGVhZGVyc1snWC1TdGFpbmxlc3MtQ3VzdG9tLVBvbGwtSW50ZXJ2YWwnXSA9IG9wdGlvbnMucG9sbEludGVydmFsTXMudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGZpbGVSZXNwb25zZSA9IGF3YWl0IHRoaXMucmV0cmlldmUodmVjdG9yU3RvcmVJZCwgZmlsZUlkLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICB9KS53aXRoUmVzcG9uc2UoKTtcblxuICAgICAgY29uc3QgZmlsZSA9IGZpbGVSZXNwb25zZS5kYXRhO1xuXG4gICAgICBzd2l0Y2ggKGZpbGUuc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJ2luX3Byb2dyZXNzJzpcbiAgICAgICAgICBsZXQgc2xlZXBJbnRlcnZhbCA9IDUwMDA7XG5cbiAgICAgICAgICBpZiAob3B0aW9ucz8ucG9sbEludGVydmFsTXMpIHtcbiAgICAgICAgICAgIHNsZWVwSW50ZXJ2YWwgPSBvcHRpb25zLnBvbGxJbnRlcnZhbE1zO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJJbnRlcnZhbCA9IGZpbGVSZXNwb25zZS5yZXNwb25zZS5oZWFkZXJzLmdldCgnb3BlbmFpLXBvbGwtYWZ0ZXItbXMnKTtcbiAgICAgICAgICAgIGlmIChoZWFkZXJJbnRlcnZhbCkge1xuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJJbnRlcnZhbE1zID0gcGFyc2VJbnQoaGVhZGVySW50ZXJ2YWwpO1xuICAgICAgICAgICAgICBpZiAoIWlzTmFOKGhlYWRlckludGVydmFsTXMpKSB7XG4gICAgICAgICAgICAgICAgc2xlZXBJbnRlcnZhbCA9IGhlYWRlckludGVydmFsTXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBJbnRlcnZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBhIGZpbGUgdG8gdGhlIGBmaWxlc2AgQVBJIGFuZCB0aGVuIGF0dGFjaCBpdCB0byB0aGUgZ2l2ZW4gdmVjdG9yIHN0b3JlLlxuICAgKlxuICAgKiBOb3RlIHRoZSBmaWxlIHdpbGwgYmUgYXN5bmNocm9ub3VzbHkgcHJvY2Vzc2VkICh5b3UgY2FuIHVzZSB0aGUgYWx0ZXJuYXRpdmVcbiAgICogcG9sbGluZyBoZWxwZXIgbWV0aG9kIHRvIHdhaXQgZm9yIHByb2Nlc3NpbmcgdG8gY29tcGxldGUpLlxuICAgKi9cbiAgYXN5bmMgdXBsb2FkKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBmaWxlOiBVcGxvYWRhYmxlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFZlY3RvclN0b3JlRmlsZT4ge1xuICAgIGNvbnN0IGZpbGVJbmZvID0gYXdhaXQgdGhpcy5fY2xpZW50LmZpbGVzLmNyZWF0ZSh7IGZpbGU6IGZpbGUsIHB1cnBvc2U6ICdhc3Npc3RhbnRzJyB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUodmVjdG9yU3RvcmVJZCwgeyBmaWxlX2lkOiBmaWxlSW5mby5pZCB9LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBmaWxlIHRvIGEgdmVjdG9yIHN0b3JlIGFuZCBwb2xsIHVudGlsIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuXG4gICAqL1xuICBhc3luYyB1cGxvYWRBbmRQb2xsKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBmaWxlOiBVcGxvYWRhYmxlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFZlY3RvclN0b3JlRmlsZT4ge1xuICAgIGNvbnN0IGZpbGVJbmZvID0gYXdhaXQgdGhpcy51cGxvYWQodmVjdG9yU3RvcmVJZCwgZmlsZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucG9sbCh2ZWN0b3JTdG9yZUlkLCBmaWxlSW5mby5pZCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZlY3RvclN0b3JlRmlsZXNQYWdlIGV4dGVuZHMgQ3Vyc29yUGFnZTxWZWN0b3JTdG9yZUZpbGU+IHt9XG5cbi8qKlxuICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIGEgdmVjdG9yIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlRmlsZSB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHZlY3RvciBzdG9yZSBmaWxlIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyB2ZWN0b3Igc3RvcmUgZmlsZS4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlcmVcbiAgICogYXJlIG5vIGVycm9ycy5cbiAgICovXG4gIGxhc3RfZXJyb3I6IFZlY3RvclN0b3JlRmlsZS5MYXN0RXJyb3IgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdmVjdG9yX3N0b3JlLmZpbGVgLlxuICAgKi9cbiAgb2JqZWN0OiAndmVjdG9yX3N0b3JlLmZpbGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSB2ZWN0b3Igc3RvcmUgZmlsZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBgaW5fcHJvZ3Jlc3NgLFxuICAgKiBgY29tcGxldGVkYCwgYGNhbmNlbGxlZGAsIG9yIGBmYWlsZWRgLiBUaGUgc3RhdHVzIGBjb21wbGV0ZWRgIGluZGljYXRlcyB0aGF0IHRoZVxuICAgKiB2ZWN0b3Igc3RvcmUgZmlsZSBpcyByZWFkeSBmb3IgdXNlLlxuICAgKi9cbiAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnIHwgJ2NvbXBsZXRlZCcgfCAnY2FuY2VsbGVkJyB8ICdmYWlsZWQnO1xuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgdmVjdG9yIHN0b3JlIHVzYWdlIGluIGJ5dGVzLiBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlXG4gICAqIG9yaWdpbmFsIGZpbGUgc2l6ZS5cbiAgICovXG4gIHVzYWdlX2J5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICogdGhhdCB0aGUgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIGlzXG4gICAqIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgdmVjdG9yX3N0b3JlX2lkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVmVjdG9yU3RvcmVGaWxlIHtcbiAgLyoqXG4gICAqIFRoZSBsYXN0IGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZlY3RvciBzdG9yZSBmaWxlLiBXaWxsIGJlIGBudWxsYCBpZiB0aGVyZVxuICAgKiBhcmUgbm8gZXJyb3JzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBMYXN0RXJyb3Ige1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiBgc2VydmVyX2Vycm9yYCBvciBgcmF0ZV9saW1pdF9leGNlZWRlZGAuXG4gICAgICovXG4gICAgY29kZTogJ2ludGVybmFsX2Vycm9yJyB8ICdmaWxlX25vdF9mb3VuZCcgfCAncGFyc2luZ19lcnJvcicgfCAndW5oYW5kbGVkX21pbWVfdHlwZSc7XG5cbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci5cbiAgICAgKi9cbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZUZpbGVEZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ3ZlY3Rvcl9zdG9yZS5maWxlLmRlbGV0ZWQnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSUQgdGhhdCB0aGVcbiAgICogdmVjdG9yIHN0b3JlIHNob3VsZCB1c2UuIFVzZWZ1bCBmb3IgdG9vbHMgbGlrZSBgZmlsZV9zZWFyY2hgIHRoYXQgY2FuIGFjY2Vzc1xuICAgKiBmaWxlcy5cbiAgICovXG4gIGZpbGVfaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgZmlsZSBzdGF0dXMuIE9uZSBvZiBgaW5fcHJvZ3Jlc3NgLCBgY29tcGxldGVkYCwgYGZhaWxlZGAsIGBjYW5jZWxsZWRgLlxuICAgKi9cbiAgZmlsdGVyPzogJ2luX3Byb2dyZXNzJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJztcblxuICAvKipcbiAgICogU29ydCBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWVzdGFtcCBvZiB0aGUgb2JqZWN0cy4gYGFzY2AgZm9yIGFzY2VuZGluZ1xuICAgKiBvcmRlciBhbmQgYGRlc2NgIGZvciBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKi9cbiAgb3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWxlcyB7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlID0gRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZURlbGV0ZWQgPSBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGVEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZXNQYWdlID0gRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNyZWF0ZVBhcmFtcyA9IEZpbGVzQVBJLkZpbGVDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUxpc3RQYXJhbXMgPSBGaWxlc0FQSS5GaWxlTGlzdFBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBVcGxvYWRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IGFsbFNldHRsZWRXaXRoVGhyb3cgfSBmcm9tIFwiLi4vLi4vLi4vbGliL1V0aWxcIjtcbmltcG9ydCAqIGFzIEZpbGVCYXRjaGVzQVBJIGZyb20gXCIuL2ZpbGUtYmF0Y2hlc1wiO1xuaW1wb3J0ICogYXMgRmlsZXNBUEkgZnJvbSBcIi4vZmlsZXNcIjtcbmltcG9ydCB7IFZlY3RvclN0b3JlRmlsZXNQYWdlIH0gZnJvbSBcIi4vZmlsZXNcIjtcbmltcG9ydCB7IHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9wYWdpbmF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBGaWxlQmF0Y2hlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZlY3RvciBzdG9yZSBmaWxlIGJhdGNoLlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBib2R5OiBGaWxlQmF0Y2hDcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfS9maWxlX2JhdGNoZXNgLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgdmVjdG9yIHN0b3JlIGZpbGUgYmF0Y2guXG4gICAqL1xuICByZXRyaWV2ZShcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYmF0Y2hJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVGaWxlQmF0Y2g+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfS9maWxlX2JhdGNoZXMvJHtiYXRjaElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhIHZlY3RvciBzdG9yZSBmaWxlIGJhdGNoLiBUaGlzIGF0dGVtcHRzIHRvIGNhbmNlbCB0aGUgcHJvY2Vzc2luZyBvZlxuICAgKiBmaWxlcyBpbiB0aGlzIGJhdGNoIGFzIHNvb24gYXMgcG9zc2libGUuXG4gICAqL1xuICBjYW5jZWwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJhdGNoSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlRmlsZUJhdGNoPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVfYmF0Y2hlcy8ke2JhdGNoSWR9L2NhbmNlbGAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZlY3RvciBzdG9yZSBiYXRjaCBhbmQgcG9sbCB1bnRpbCBhbGwgZmlsZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFuZFBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJvZHk6IEZpbGVCYXRjaENyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIGNvbnN0IGJhdGNoID0gYXdhaXQgdGhpcy5jcmVhdGUodmVjdG9yU3RvcmVJZCwgYm9keSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucG9sbCh2ZWN0b3JTdG9yZUlkLCBiYXRjaC5pZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIGZpbGVzIGluIGEgYmF0Y2guXG4gICAqL1xuICBsaXN0RmlsZXMoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJhdGNoSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IEZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlPjtcbiAgbGlzdEZpbGVzKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBiYXRjaElkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVGaWxlc1BhZ2UsIEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZT47XG4gIGxpc3RGaWxlcyhcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYmF0Y2hJZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBGaWxlQmF0Y2hMaXN0RmlsZXNQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVGaWxlc1BhZ2UsIEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZT4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdEZpbGVzKHZlY3RvclN0b3JlSWQsIGJhdGNoSWQsIHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdChcbiAgICAgIGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVfYmF0Y2hlcy8ke2JhdGNoSWR9L2ZpbGVzYCxcbiAgICAgIFZlY3RvclN0b3JlRmlsZXNQYWdlLFxuICAgICAgeyBxdWVyeSwgLi4ub3B0aW9ucywgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGdpdmVuIGZpbGUgYmF0Y2ggdG8gYmUgcHJvY2Vzc2VkLlxuICAgKlxuICAgKiBOb3RlOiB0aGlzIHdpbGwgcmV0dXJuIGV2ZW4gaWYgb25lIG9mIHRoZSBmaWxlcyBmYWlsZWQgdG8gcHJvY2VzcywgeW91IG5lZWQgdG9cbiAgICogY2hlY2sgYmF0Y2guZmlsZV9jb3VudHMuZmFpbGVkX2NvdW50IHRvIGhhbmRsZSB0aGlzIGNhc2UuXG4gICAqL1xuICBhc3luYyBwb2xsKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBiYXRjaElkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8VmVjdG9yU3RvcmVGaWxlQmF0Y2g+IHtcbiAgICBjb25zdCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtUG9sbC1IZWxwZXInOiAndHJ1ZScgfTtcbiAgICBpZiAob3B0aW9ucz8ucG9sbEludGVydmFsTXMpIHtcbiAgICAgIGhlYWRlcnNbJ1gtU3RhaW5sZXNzLUN1c3RvbS1Qb2xsLUludGVydmFsJ10gPSBvcHRpb25zLnBvbGxJbnRlcnZhbE1zLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHsgZGF0YTogYmF0Y2gsIHJlc3BvbnNlIH0gPSBhd2FpdCB0aGlzLnJldHJpZXZlKHZlY3RvclN0b3JlSWQsIGJhdGNoSWQsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgIH0pLndpdGhSZXNwb25zZSgpO1xuXG4gICAgICBzd2l0Y2ggKGJhdGNoLnN0YXR1cykge1xuICAgICAgICBjYXNlICdpbl9wcm9ncmVzcyc6XG4gICAgICAgICAgbGV0IHNsZWVwSW50ZXJ2YWwgPSA1MDAwO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zKSB7XG4gICAgICAgICAgICBzbGVlcEludGVydmFsID0gb3B0aW9ucy5wb2xsSW50ZXJ2YWxNcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVySW50ZXJ2YWwgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnb3BlbmFpLXBvbGwtYWZ0ZXItbXMnKTtcbiAgICAgICAgICAgIGlmIChoZWFkZXJJbnRlcnZhbCkge1xuICAgICAgICAgICAgICBjb25zdCBoZWFkZXJJbnRlcnZhbE1zID0gcGFyc2VJbnQoaGVhZGVySW50ZXJ2YWwpO1xuICAgICAgICAgICAgICBpZiAoIWlzTmFOKGhlYWRlckludGVydmFsTXMpKSB7XG4gICAgICAgICAgICAgICAgc2xlZXBJbnRlcnZhbCA9IGhlYWRlckludGVydmFsTXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBJbnRlcnZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgICAgcmV0dXJuIGJhdGNoO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIHRoZSBnaXZlbiBmaWxlcyBjb25jdXJyZW50bHkgYW5kIHRoZW4gY3JlYXRlcyBhIHZlY3RvciBzdG9yZSBmaWxlIGJhdGNoLlxuICAgKlxuICAgKiBUaGUgY29uY3VycmVuY3kgbGltaXQgaXMgY29uZmlndXJhYmxlIHVzaW5nIHRoZSBgbWF4Q29uY3VycmVuY3lgIHBhcmFtZXRlci5cbiAgICovXG4gIGFzeW5jIHVwbG9hZEFuZFBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIHsgZmlsZXMsIGZpbGVJZHMgPSBbXSB9OiB7IGZpbGVzOiBVcGxvYWRhYmxlW107IGZpbGVJZHM/OiBzdHJpbmdbXSB9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlcjsgbWF4Q29uY3VycmVuY3k/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIGlmIChmaWxlcyA9PT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBmaWxlcyBwcm92aWRlZCB0byBwcm9jZXNzLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ3VyZWRDb25jdXJyZW5jeSA9IG9wdGlvbnM/Lm1heENvbmN1cnJlbmN5ID8/IDU7XG4gICAgLy9XZSBjYXAgdGhlIG51bWJlciBvZiB3b3JrZXJzIGF0IHRoZSBudW1iZXIgb2YgZmlsZXMgKHNvIHdlIGRvbid0IHN0YXJ0IGFueSB1bm5lY2Vzc2FyeSB3b3JrZXJzKVxuICAgIGNvbnN0IGNvbmN1cnJlbmN5TGltaXQgPSBNYXRoLm1pbihjb25maWd1cmVkQ29uY3VycmVuY3ksIGZpbGVzLmxlbmd0aCk7XG5cbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLl9jbGllbnQ7XG4gICAgY29uc3QgZmlsZUl0ZXJhdG9yID0gZmlsZXMudmFsdWVzKCk7XG4gICAgY29uc3QgYWxsRmlsZUlkczogc3RyaW5nW10gPSBbLi4uZmlsZUlkc107XG5cbiAgICAvL1RoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGlzIGRlc2lnbi4gVGhlIGxpYnJhcmllcyBkb24ndCBhY2NvbW1vZGF0ZSBvdXIgZW52aXJvbm1lbnQgbGltaXRzLlxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwNjM5NDMyL3doYXQtaXMtdGhlLWJlc3Qtd2F5LXRvLWxpbWl0LWNvbmN1cnJlbmN5LXdoZW4tdXNpbmctZXM2cy1wcm9taXNlLWFsbFxuICAgIGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGaWxlcyhpdGVyYXRvcjogSXRlcmFibGVJdGVyYXRvcjxVcGxvYWRhYmxlPikge1xuICAgICAgZm9yIChsZXQgaXRlbSBvZiBpdGVyYXRvcikge1xuICAgICAgICBjb25zdCBmaWxlT2JqID0gYXdhaXQgY2xpZW50LmZpbGVzLmNyZWF0ZSh7IGZpbGU6IGl0ZW0sIHB1cnBvc2U6ICdhc3Npc3RhbnRzJyB9LCBvcHRpb25zKTtcbiAgICAgICAgYWxsRmlsZUlkcy5wdXNoKGZpbGVPYmouaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vU3RhcnQgd29ya2VycyB0byBwcm9jZXNzIHJlc3VsdHNcbiAgICBjb25zdCB3b3JrZXJzID0gQXJyYXkoY29uY3VycmVuY3lMaW1pdCkuZmlsbChmaWxlSXRlcmF0b3IpLm1hcChwcm9jZXNzRmlsZXMpO1xuXG4gICAgLy9XYWl0IGZvciBhbGwgcHJvY2Vzc2luZyB0byBjb21wbGV0ZS5cbiAgICBhd2FpdCBhbGxTZXR0bGVkV2l0aFRocm93KHdvcmtlcnMpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQW5kUG9sbCh2ZWN0b3JTdG9yZUlkLCB7XG4gICAgICBmaWxlX2lkczogYWxsRmlsZUlkcyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgYmF0Y2ggb2YgZmlsZXMgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVGaWxlQmF0Y2gge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSB2ZWN0b3Igc3RvcmUgZmlsZXMgYmF0Y2ggd2FzXG4gICAqIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgZmlsZV9jb3VudHM6IFZlY3RvclN0b3JlRmlsZUJhdGNoLkZpbGVDb3VudHM7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB2ZWN0b3Jfc3RvcmUuZmlsZV9iYXRjaGAuXG4gICAqL1xuICBvYmplY3Q6ICd2ZWN0b3Jfc3RvcmUuZmlsZXNfYmF0Y2gnO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSB2ZWN0b3Igc3RvcmUgZmlsZXMgYmF0Y2gsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYGluX3Byb2dyZXNzYCxcbiAgICogYGNvbXBsZXRlZGAsIGBjYW5jZWxsZWRgIG9yIGBmYWlsZWRgLlxuICAgKi9cbiAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnIHwgJ2NvbXBsZXRlZCcgfCAnY2FuY2VsbGVkJyB8ICdmYWlsZWQnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAqIHRoYXQgdGhlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBpc1xuICAgKiBhdHRhY2hlZCB0by5cbiAgICovXG4gIHZlY3Rvcl9zdG9yZV9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFZlY3RvclN0b3JlRmlsZUJhdGNoIHtcbiAgZXhwb3J0IGludGVyZmFjZSBGaWxlQ291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgd2hlcmUgY2FuY2VsbGVkLlxuICAgICAqL1xuICAgIGNhbmNlbGxlZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgY29tcGxldGVkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgaGF2ZSBmYWlsZWQgdG8gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBmYWlsZWQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBpbl9wcm9ncmVzczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcy5cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUJhdGNoQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIHRoYXRcbiAgICogdGhlIHZlY3RvciBzdG9yZSBzaG91bGQgdXNlLiBVc2VmdWwgZm9yIHRvb2xzIGxpa2UgYGZpbGVfc2VhcmNoYCB0aGF0IGNhbiBhY2Nlc3NcbiAgICogZmlsZXMuXG4gICAqL1xuICBmaWxlX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQmF0Y2hMaXN0RmlsZXNQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY3Vyc29yIGZvciB1c2UgaW4gcGFnaW5hdGlvbi4gYGJlZm9yZWAgaXMgYW4gb2JqZWN0IElEIHRoYXQgZGVmaW5lcyB5b3VyIHBsYWNlXG4gICAqIGluIHRoZSBsaXN0LiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBtYWtlIGEgbGlzdCByZXF1ZXN0IGFuZCByZWNlaXZlIDEwMCBvYmplY3RzLFxuICAgKiBlbmRpbmcgd2l0aCBvYmpfZm9vLCB5b3VyIHN1YnNlcXVlbnQgY2FsbCBjYW4gaW5jbHVkZSBiZWZvcmU9b2JqX2ZvbyBpbiBvcmRlciB0b1xuICAgKiBmZXRjaCB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgbGlzdC5cbiAgICovXG4gIGJlZm9yZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGZpbGUgc3RhdHVzLiBPbmUgb2YgYGluX3Byb2dyZXNzYCwgYGNvbXBsZXRlZGAsIGBmYWlsZWRgLCBgY2FuY2VsbGVkYC5cbiAgICovXG4gIGZpbHRlcj86ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgb2YgdGhlIG9iamVjdHMuIGBhc2NgIGZvciBhc2NlbmRpbmdcbiAgICogb3JkZXIgYW5kIGBkZXNjYCBmb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZUJhdGNoZXMge1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZUJhdGNoID0gRmlsZUJhdGNoZXNBUEkuVmVjdG9yU3RvcmVGaWxlQmF0Y2g7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUJhdGNoQ3JlYXRlUGFyYW1zID0gRmlsZUJhdGNoZXNBUEkuRmlsZUJhdGNoQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcyA9IEZpbGVCYXRjaGVzQVBJLkZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcztcbn1cblxuZXhwb3J0IHsgVmVjdG9yU3RvcmVGaWxlc1BhZ2UgfTtcbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgKiBhcyBWZWN0b3JTdG9yZXNBUEkgZnJvbSBcIi4vdmVjdG9yLXN0b3Jlc1wiO1xuaW1wb3J0ICogYXMgRmlsZUJhdGNoZXNBUEkgZnJvbSBcIi4vZmlsZS1iYXRjaGVzXCI7XG5pbXBvcnQgKiBhcyBGaWxlc0FQSSBmcm9tIFwiLi9maWxlc1wiO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL3BhZ2luYXRpb25cIjtcblxuZXhwb3J0IGNsYXNzIFZlY3RvclN0b3JlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgZmlsZXM6IEZpbGVzQVBJLkZpbGVzID0gbmV3IEZpbGVzQVBJLkZpbGVzKHRoaXMuX2NsaWVudCk7XG4gIGZpbGVCYXRjaGVzOiBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hlcyA9IG5ldyBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hlcyh0aGlzLl9jbGllbnQpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBjcmVhdGUoYm9keTogVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvdmVjdG9yX3N0b3JlcycsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICByZXRyaWV2ZSh2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RpZmllcyBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIHVwZGF0ZShcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYm9keTogVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfWAsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVzLlxuICAgKi9cbiAgbGlzdChcbiAgICBxdWVyeT86IFZlY3RvclN0b3JlTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZXNQYWdlLCBWZWN0b3JTdG9yZT47XG4gIGxpc3Qob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3Jlc1BhZ2UsIFZlY3RvclN0b3JlPjtcbiAgbGlzdChcbiAgICBxdWVyeTogVmVjdG9yU3RvcmVMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3Jlc1BhZ2UsIFZlY3RvclN0b3JlPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdCgnL3ZlY3Rvcl9zdG9yZXMnLCBWZWN0b3JTdG9yZXNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGRlbCh2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlRGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZlY3RvclN0b3Jlc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPFZlY3RvclN0b3JlPiB7fVxuXG4vKipcbiAqIEEgdmVjdG9yIHN0b3JlIGlzIGEgY29sbGVjdGlvbiBvZiBwcm9jZXNzZWQgZmlsZXMgY2FuIGJlIHVzZWQgYnkgdGhlXG4gKiBgZmlsZV9zZWFyY2hgIHRvb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmUge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSB2ZWN0b3Igc3RvcmUgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgZmlsZV9jb3VudHM6IFZlY3RvclN0b3JlLkZpbGVDb3VudHM7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHZlY3RvciBzdG9yZSB3YXMgbGFzdCBhY3RpdmUuXG4gICAqL1xuICBsYXN0X2FjdGl2ZV9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE6IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdmVjdG9yX3N0b3JlYC5cbiAgICovXG4gIG9iamVjdDogJ3ZlY3Rvcl9zdG9yZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHZlY3RvciBzdG9yZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBgZXhwaXJlZGAsIGBpbl9wcm9ncmVzc2AsIG9yXG4gICAqIGBjb21wbGV0ZWRgLiBBIHN0YXR1cyBvZiBgY29tcGxldGVkYCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmVjdG9yIHN0b3JlIGlzIHJlYWR5XG4gICAqIGZvciB1c2UuXG4gICAqL1xuICBzdGF0dXM6ICdleHBpcmVkJyB8ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJztcblxuICAvKipcbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB1c2VkIGJ5IHRoZSBmaWxlcyBpbiB0aGUgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgdXNhZ2VfYnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGV4cGlyYXRpb24gcG9saWN5IGZvciBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGV4cGlyZXNfYWZ0ZXI/OiBWZWN0b3JTdG9yZS5FeHBpcmVzQWZ0ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHZlY3RvciBzdG9yZSB3aWxsIGV4cGlyZS5cbiAgICovXG4gIGV4cGlyZXNfYXQ/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFZlY3RvclN0b3JlIHtcbiAgZXhwb3J0IGludGVyZmFjZSBGaWxlQ291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgd2VyZSBjYW5jZWxsZWQuXG4gICAgICovXG4gICAgY2FuY2VsbGVkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgY29tcGxldGVkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgaGF2ZSBmYWlsZWQgdG8gcHJvY2Vzcy5cbiAgICAgKi9cbiAgICBmYWlsZWQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBpbl9wcm9ncmVzczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlcy5cbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBleHBpcmF0aW9uIHBvbGljeSBmb3IgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEV4cGlyZXNBZnRlciB7XG4gICAgLyoqXG4gICAgICogQW5jaG9yIHRpbWVzdGFtcCBhZnRlciB3aGljaCB0aGUgZXhwaXJhdGlvbiBwb2xpY3kgYXBwbGllcy4gU3VwcG9ydGVkIGFuY2hvcnM6XG4gICAgICogYGxhc3RfYWN0aXZlX2F0YC5cbiAgICAgKi9cbiAgICBhbmNob3I6ICdsYXN0X2FjdGl2ZV9hdCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgYWZ0ZXIgdGhlIGFuY2hvciB0aW1lIHRoYXQgdGhlIHZlY3RvciBzdG9yZSB3aWxsIGV4cGlyZS5cbiAgICAgKi9cbiAgICBkYXlzOiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZURlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiAndmVjdG9yX3N0b3JlLmRlbGV0ZWQnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBleHBpcmF0aW9uIHBvbGljeSBmb3IgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBleHBpcmVzX2FmdGVyPzogVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMuRXhwaXJlc0FmdGVyO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyB0aGF0XG4gICAqIHRoZSB2ZWN0b3Igc3RvcmUgc2hvdWxkIHVzZS4gVXNlZnVsIGZvciB0b29scyBsaWtlIGBmaWxlX3NlYXJjaGAgdGhhdCBjYW4gYWNjZXNzXG4gICAqIGZpbGVzLlxuICAgKi9cbiAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBWZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZXhwaXJhdGlvbiBwb2xpY3kgZm9yIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBFeHBpcmVzQWZ0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuY2hvciB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGV4cGlyYXRpb24gcG9saWN5IGFwcGxpZXMuIFN1cHBvcnRlZCBhbmNob3JzOlxuICAgICAqIGBsYXN0X2FjdGl2ZV9hdGAuXG4gICAgICovXG4gICAgYW5jaG9yOiAnbGFzdF9hY3RpdmVfYXQnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIGFmdGVyIHRoZSBhbmNob3IgdGltZSB0aGF0IHRoZSB2ZWN0b3Igc3RvcmUgd2lsbCBleHBpcmUuXG4gICAgICovXG4gICAgZGF5czogbnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGV4cGlyYXRpb24gcG9saWN5IGZvciBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGV4cGlyZXNfYWZ0ZXI/OiBWZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcy5FeHBpcmVzQWZ0ZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGV4cGlyYXRpb24gcG9saWN5IGZvciBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRXhwaXJlc0FmdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbmNob3IgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBleHBpcmF0aW9uIHBvbGljeSBhcHBsaWVzLiBTdXBwb3J0ZWQgYW5jaG9yczpcbiAgICAgKiBgbGFzdF9hY3RpdmVfYXRgLlxuICAgICAqL1xuICAgIGFuY2hvcjogJ2xhc3RfYWN0aXZlX2F0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBhZnRlciB0aGUgYW5jaG9yIHRpbWUgdGhhdCB0aGUgdmVjdG9yIHN0b3JlIHdpbGwgZXhwaXJlLlxuICAgICAqL1xuICAgIGRheXM6IG51bWJlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFZlY3RvclN0b3JlcyB7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmUgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmU7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVEZWxldGVkID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZXNQYWdlID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3Jlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVMaXN0UGFyYW1zID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlcyA9IEZpbGVzQVBJLkZpbGVzO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZSA9IEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZTtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGVEZWxldGVkID0gRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGVzUGFnZSA9IEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZXNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDcmVhdGVQYXJhbXMgPSBGaWxlc0FQSS5GaWxlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVMaXN0UGFyYW1zID0gRmlsZXNBUEkuRmlsZUxpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUJhdGNoZXMgPSBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hlcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGVCYXRjaCA9IEZpbGVCYXRjaGVzQVBJLlZlY3RvclN0b3JlRmlsZUJhdGNoO1xuICBleHBvcnQgaW1wb3J0IEZpbGVCYXRjaENyZWF0ZVBhcmFtcyA9IEZpbGVCYXRjaGVzQVBJLkZpbGVCYXRjaENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlQmF0Y2hMaXN0RmlsZXNQYXJhbXMgPSBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hMaXN0RmlsZXNQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIEFzc2lzdGFudHNBUEkgZnJvbSBcIi4vYXNzaXN0YW50c1wiO1xuaW1wb3J0ICogYXMgQ2hhdEFQSSBmcm9tIFwiLi9jaGF0L2NoYXRcIjtcbmltcG9ydCAqIGFzIFRocmVhZHNBUEkgZnJvbSBcIi4vdGhyZWFkcy90aHJlYWRzXCI7XG5pbXBvcnQgKiBhcyBWZWN0b3JTdG9yZXNBUEkgZnJvbSBcIi4vdmVjdG9yLXN0b3Jlcy92ZWN0b3Itc3RvcmVzXCI7XG5cbmV4cG9ydCBjbGFzcyBCZXRhIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICB2ZWN0b3JTdG9yZXM6IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZXMgPSBuZXcgVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3Jlcyh0aGlzLl9jbGllbnQpO1xuICBjaGF0OiBDaGF0QVBJLkNoYXQgPSBuZXcgQ2hhdEFQSS5DaGF0KHRoaXMuX2NsaWVudCk7XG4gIGFzc2lzdGFudHM6IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50cyA9IG5ldyBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudHModGhpcy5fY2xpZW50KTtcbiAgdGhyZWFkczogVGhyZWFkc0FQSS5UaHJlYWRzID0gbmV3IFRocmVhZHNBUEkuVGhyZWFkcyh0aGlzLl9jbGllbnQpO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEJldGEge1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlcyA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmUgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmU7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVEZWxldGVkID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZXNQYWdlID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3Jlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVMaXN0UGFyYW1zID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDaGF0ID0gQ2hhdEFQSS5DaGF0O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudHMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudHM7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50ID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50RGVsZXRlZCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50RGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VG9vbCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbDtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJUb29sID0gQXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sO1xuICBleHBvcnQgaW1wb3J0IEZpbGVTZWFyY2hUb29sID0gQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblRvb2wgPSBBc3Npc3RhbnRzQVBJLkZ1bmN0aW9uVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLk1lc3NhZ2VTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLlJ1blN0ZXBTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuUnVuU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLlRocmVhZFN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudHNQYWdlID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRDcmVhdGVQYXJhbXMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRVcGRhdGVQYXJhbXMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRMaXN0UGFyYW1zID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRMaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZHMgPSBUaHJlYWRzQVBJLlRocmVhZHM7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50UmVzcG9uc2VGb3JtYXQgPSBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sQ2hvaWNlID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2VGdW5jdGlvbiA9IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gPSBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkID0gVGhyZWFkc0FQSS5UaHJlYWQ7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkRGVsZXRlZCA9IFRocmVhZHNBUEkuVGhyZWFkRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRVcGRhdGVQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZFVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVByb21pc2UgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gXCIuL2NvbXBsZXRpb25zXCI7XG5pbXBvcnQgKiBhcyBDaGF0Q29tcGxldGlvbnNBUEkgZnJvbSBcIi4vY2hhdC9jb21wbGV0aW9uc1wiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbWluZ1wiO1xuXG5leHBvcnQgY2xhc3MgQ29tcGxldGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29tcGxldGlvbiBmb3IgdGhlIHByb3ZpZGVkIHByb21wdCBhbmQgcGFyYW1ldGVycy5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IEFQSVByb21pc2U8Q29tcGxldGlvbj47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxDb21wbGV0aW9uPj47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08Q29tcGxldGlvbj4gfCBDb21wbGV0aW9uPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENvbXBsZXRpb25DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8Q29tcGxldGlvbj4gfCBBUElQcm9taXNlPFN0cmVhbTxDb21wbGV0aW9uPj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2NvbXBsZXRpb25zJywgeyBib2R5LCAuLi5vcHRpb25zLCBzdHJlYW06IGJvZHkuc3RyZWFtID8/IGZhbHNlIH0pIGFzXG4gICAgICB8IEFQSVByb21pc2U8Q29tcGxldGlvbj5cbiAgICAgIHwgQVBJUHJvbWlzZTxTdHJlYW08Q29tcGxldGlvbj4+O1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNvbXBsZXRpb24gcmVzcG9uc2UgZnJvbSB0aGUgQVBJLiBOb3RlOiBib3RoIHRoZSBzdHJlYW1lZCBhbmRcbiAqIG5vbi1zdHJlYW1lZCByZXNwb25zZSBvYmplY3RzIHNoYXJlIHRoZSBzYW1lIHNoYXBlICh1bmxpa2UgdGhlIGNoYXQgZW5kcG9pbnQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb24ge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBsZXRpb24uXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBjb21wbGV0aW9uIGNob2ljZXMgdGhlIG1vZGVsIGdlbmVyYXRlZCBmb3IgdGhlIGlucHV0IHByb21wdC5cbiAgICovXG4gIGNob2ljZXM6IEFycmF5PENvbXBsZXRpb25DaG9pY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIG9mIHdoZW4gdGhlIGNvbXBsZXRpb24gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB1c2VkIGZvciBjb21wbGV0aW9uLlxuICAgKi9cbiAgbW9kZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgXCJ0ZXh0X2NvbXBsZXRpb25cIlxuICAgKi9cbiAgb2JqZWN0OiAndGV4dF9jb21wbGV0aW9uJztcblxuICAvKipcbiAgICogVGhpcyBmaW5nZXJwcmludCByZXByZXNlbnRzIHRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgbW9kZWwgcnVucyB3aXRoLlxuICAgKlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgc2VlZGAgcmVxdWVzdCBwYXJhbWV0ZXIgdG8gdW5kZXJzdGFuZCB3aGVuXG4gICAqIGJhY2tlbmQgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0aGF0IG1pZ2h0IGltcGFjdCBkZXRlcm1pbmlzbS5cbiAgICovXG4gIHN5c3RlbV9maW5nZXJwcmludD86IHN0cmluZztcblxuICAvKipcbiAgICogVXNhZ2Ugc3RhdGlzdGljcyBmb3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdC5cbiAgICovXG4gIHVzYWdlPzogQ29tcGxldGlvblVzYWdlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb25DaG9pY2Uge1xuICAvKipcbiAgICogVGhlIHJlYXNvbiB0aGUgbW9kZWwgc3RvcHBlZCBnZW5lcmF0aW5nIHRva2Vucy4gVGhpcyB3aWxsIGJlIGBzdG9wYCBpZiB0aGUgbW9kZWxcbiAgICogaGl0IGEgbmF0dXJhbCBzdG9wIHBvaW50IG9yIGEgcHJvdmlkZWQgc3RvcCBzZXF1ZW5jZSwgYGxlbmd0aGAgaWYgdGhlIG1heGltdW1cbiAgICogbnVtYmVyIG9mIHRva2VucyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIHJlYWNoZWQsIG9yIGBjb250ZW50X2ZpbHRlcmAgaWZcbiAgICogY29udGVudCB3YXMgb21pdHRlZCBkdWUgdG8gYSBmbGFnIGZyb20gb3VyIGNvbnRlbnQgZmlsdGVycy5cbiAgICovXG4gIGZpbmlzaF9yZWFzb246ICdzdG9wJyB8ICdsZW5ndGgnIHwgJ2NvbnRlbnRfZmlsdGVyJztcblxuICBpbmRleDogbnVtYmVyO1xuXG4gIGxvZ3Byb2JzOiBDb21wbGV0aW9uQ2hvaWNlLkxvZ3Byb2JzIHwgbnVsbDtcblxuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29tcGxldGlvbkNob2ljZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTG9ncHJvYnMge1xuICAgIHRleHRfb2Zmc2V0PzogQXJyYXk8bnVtYmVyPjtcblxuICAgIHRva2VuX2xvZ3Byb2JzPzogQXJyYXk8bnVtYmVyPjtcblxuICAgIHRva2Vucz86IEFycmF5PHN0cmluZz47XG5cbiAgICB0b3BfbG9ncHJvYnM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcbiAgfVxufVxuXG4vKipcbiAqIFVzYWdlIHN0YXRpc3RpY3MgZm9yIHRoZSBjb21wbGV0aW9uIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvblVzYWdlIHtcbiAgLyoqXG4gICAqIE51bWJlciBvZiB0b2tlbnMgaW4gdGhlIGdlbmVyYXRlZCBjb21wbGV0aW9uLlxuICAgKi9cbiAgY29tcGxldGlvbl90b2tlbnM6IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHRva2VucyBpbiB0aGUgcHJvbXB0LlxuICAgKi9cbiAgcHJvbXB0X3Rva2VuczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgdG9rZW5zIHVzZWQgaW4gdGhlIHJlcXVlc3QgKHByb21wdCArIGNvbXBsZXRpb24pLlxuICAgKi9cbiAgdG90YWxfdG9rZW5zOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nIHwgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBZb3UgY2FuIHVzZSB0aGVcbiAgICogW0xpc3QgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscy9saXN0KSBBUEkgdG9cbiAgICogc2VlIGFsbCBvZiB5b3VyIGF2YWlsYWJsZSBtb2RlbHMsIG9yIHNlZSBvdXJcbiAgICogW01vZGVsIG92ZXJ2aWV3XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvb3ZlcnZpZXcpIGZvclxuICAgKiBkZXNjcmlwdGlvbnMgb2YgdGhlbS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ2dwdC0zLjUtdHVyYm8taW5zdHJ1Y3QnIHwgJ2RhdmluY2ktMDAyJyB8ICdiYWJiYWdlLTAwMic7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9tcHQocykgdG8gZ2VuZXJhdGUgY29tcGxldGlvbnMgZm9yLCBlbmNvZGVkIGFzIGEgc3RyaW5nLCBhcnJheSBvZlxuICAgKiBzdHJpbmdzLCBhcnJheSBvZiB0b2tlbnMsIG9yIGFycmF5IG9mIHRva2VuIGFycmF5cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IDx8ZW5kb2Z0ZXh0fD4gaXMgdGhlIGRvY3VtZW50IHNlcGFyYXRvciB0aGF0IHRoZSBtb2RlbCBzZWVzIGR1cmluZ1xuICAgKiB0cmFpbmluZywgc28gaWYgYSBwcm9tcHQgaXMgbm90IHNwZWNpZmllZCB0aGUgbW9kZWwgd2lsbCBnZW5lcmF0ZSBhcyBpZiBmcm9tIHRoZVxuICAgKiBiZWdpbm5pbmcgb2YgYSBuZXcgZG9jdW1lbnQuXG4gICAqL1xuICBwcm9tcHQ6IHN0cmluZyB8IEFycmF5PHN0cmluZz4gfCBBcnJheTxudW1iZXI+IHwgQXJyYXk8QXJyYXk8bnVtYmVyPj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYGJlc3Rfb2ZgIGNvbXBsZXRpb25zIHNlcnZlci1zaWRlIGFuZCByZXR1cm5zIHRoZSBcImJlc3RcIiAodGhlIG9uZSB3aXRoXG4gICAqIHRoZSBoaWdoZXN0IGxvZyBwcm9iYWJpbGl0eSBwZXIgdG9rZW4pLiBSZXN1bHRzIGNhbm5vdCBiZSBzdHJlYW1lZC5cbiAgICpcbiAgICogV2hlbiB1c2VkIHdpdGggYG5gLCBgYmVzdF9vZmAgY29udHJvbHMgdGhlIG51bWJlciBvZiBjYW5kaWRhdGUgY29tcGxldGlvbnMgYW5kXG4gICAqIGBuYCBzcGVjaWZpZXMgaG93IG1hbnkgdG8gcmV0dXJuIFx1MjAxMyBgYmVzdF9vZmAgbXVzdCBiZSBncmVhdGVyIHRoYW4gYG5gLlxuICAgKlxuICAgKiAqKk5vdGU6KiogQmVjYXVzZSB0aGlzIHBhcmFtZXRlciBnZW5lcmF0ZXMgbWFueSBjb21wbGV0aW9ucywgaXQgY2FuIHF1aWNrbHlcbiAgICogY29uc3VtZSB5b3VyIHRva2VuIHF1b3RhLiBVc2UgY2FyZWZ1bGx5IGFuZCBlbnN1cmUgdGhhdCB5b3UgaGF2ZSByZWFzb25hYmxlXG4gICAqIHNldHRpbmdzIGZvciBgbWF4X3Rva2Vuc2AgYW5kIGBzdG9wYC5cbiAgICovXG4gIGJlc3Rfb2Y/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBFY2hvIGJhY2sgdGhlIHByb21wdCBpbiBhZGRpdGlvbiB0byB0aGUgY29tcGxldGlvblxuICAgKi9cbiAgZWNobz86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgYmV0d2VlbiAtMi4wIGFuZCAyLjAuIFBvc2l0aXZlIHZhbHVlcyBwZW5hbGl6ZSBuZXcgdG9rZW5zIGJhc2VkIG9uIHRoZWlyXG4gICAqIGV4aXN0aW5nIGZyZXF1ZW5jeSBpbiB0aGUgdGV4dCBzbyBmYXIsIGRlY3JlYXNpbmcgdGhlIG1vZGVsJ3MgbGlrZWxpaG9vZCB0b1xuICAgKiByZXBlYXQgdGhlIHNhbWUgbGluZSB2ZXJiYXRpbS5cbiAgICpcbiAgICogW1NlZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZyZXF1ZW5jeSBhbmQgcHJlc2VuY2UgcGVuYWx0aWVzLl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3RleHQtZ2VuZXJhdGlvbi9wYXJhbWV0ZXItZGV0YWlscylcbiAgICovXG4gIGZyZXF1ZW5jeV9wZW5hbHR5PzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogTW9kaWZ5IHRoZSBsaWtlbGlob29kIG9mIHNwZWNpZmllZCB0b2tlbnMgYXBwZWFyaW5nIGluIHRoZSBjb21wbGV0aW9uLlxuICAgKlxuICAgKiBBY2NlcHRzIGEgSlNPTiBvYmplY3QgdGhhdCBtYXBzIHRva2VucyAoc3BlY2lmaWVkIGJ5IHRoZWlyIHRva2VuIElEIGluIHRoZSBHUFRcbiAgICogdG9rZW5pemVyKSB0byBhbiBhc3NvY2lhdGVkIGJpYXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMC4gWW91IGNhbiB1c2UgdGhpc1xuICAgKiBbdG9rZW5pemVyIHRvb2xdKC90b2tlbml6ZXI/dmlldz1icGUpIHRvIGNvbnZlcnQgdGV4dCB0byB0b2tlbiBJRHMuXG4gICAqIE1hdGhlbWF0aWNhbGx5LCB0aGUgYmlhcyBpcyBhZGRlZCB0byB0aGUgbG9naXRzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgcHJpb3IgdG9cbiAgICogc2FtcGxpbmcuIFRoZSBleGFjdCBlZmZlY3Qgd2lsbCB2YXJ5IHBlciBtb2RlbCwgYnV0IHZhbHVlcyBiZXR3ZWVuIC0xIGFuZCAxXG4gICAqIHNob3VsZCBkZWNyZWFzZSBvciBpbmNyZWFzZSBsaWtlbGlob29kIG9mIHNlbGVjdGlvbjsgdmFsdWVzIGxpa2UgLTEwMCBvciAxMDBcbiAgICogc2hvdWxkIHJlc3VsdCBpbiBhIGJhbiBvciBleGNsdXNpdmUgc2VsZWN0aW9uIG9mIHRoZSByZWxldmFudCB0b2tlbi5cbiAgICpcbiAgICogQXMgYW4gZXhhbXBsZSwgeW91IGNhbiBwYXNzIGB7XCI1MDI1NlwiOiAtMTAwfWAgdG8gcHJldmVudCB0aGUgPHxlbmRvZnRleHR8PiB0b2tlblxuICAgKiBmcm9tIGJlaW5nIGdlbmVyYXRlZC5cbiAgICovXG4gIGxvZ2l0X2JpYXM/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHwgbnVsbDtcblxuICAvKipcbiAgICogSW5jbHVkZSB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb24gdGhlIGBsb2dwcm9ic2AgbW9zdCBsaWtlbHkgb3V0cHV0IHRva2VucywgYXNcbiAgICogd2VsbCB0aGUgY2hvc2VuIHRva2Vucy4gRm9yIGV4YW1wbGUsIGlmIGBsb2dwcm9ic2AgaXMgNSwgdGhlIEFQSSB3aWxsIHJldHVybiBhXG4gICAqIGxpc3Qgb2YgdGhlIDUgbW9zdCBsaWtlbHkgdG9rZW5zLiBUaGUgQVBJIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgYGxvZ3Byb2JgIG9mXG4gICAqIHRoZSBzYW1wbGVkIHRva2VuLCBzbyB0aGVyZSBtYXkgYmUgdXAgdG8gYGxvZ3Byb2JzKzFgIGVsZW1lbnRzIGluIHRoZSByZXNwb25zZS5cbiAgICpcbiAgICogVGhlIG1heGltdW0gdmFsdWUgZm9yIGBsb2dwcm9ic2AgaXMgNS5cbiAgICovXG4gIGxvZ3Byb2JzPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIFt0b2tlbnNdKC90b2tlbml6ZXIpIHRoYXQgY2FuIGJlIGdlbmVyYXRlZCBpbiB0aGVcbiAgICogY29tcGxldGlvbi5cbiAgICpcbiAgICogVGhlIHRva2VuIGNvdW50IG9mIHlvdXIgcHJvbXB0IHBsdXMgYG1heF90b2tlbnNgIGNhbm5vdCBleGNlZWQgdGhlIG1vZGVsJ3NcbiAgICogY29udGV4dCBsZW5ndGguXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX2NvdW50X3Rva2Vuc193aXRoX3Rpa3Rva2VuKVxuICAgKiBmb3IgY291bnRpbmcgdG9rZW5zLlxuICAgKi9cbiAgbWF4X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IGNvbXBsZXRpb25zIHRvIGdlbmVyYXRlIGZvciBlYWNoIHByb21wdC5cbiAgICpcbiAgICogKipOb3RlOioqIEJlY2F1c2UgdGhpcyBwYXJhbWV0ZXIgZ2VuZXJhdGVzIG1hbnkgY29tcGxldGlvbnMsIGl0IGNhbiBxdWlja2x5XG4gICAqIGNvbnN1bWUgeW91ciB0b2tlbiBxdW90YS4gVXNlIGNhcmVmdWxseSBhbmQgZW5zdXJlIHRoYXQgeW91IGhhdmUgcmVhc29uYWJsZVxuICAgKiBzZXR0aW5ncyBmb3IgYG1heF90b2tlbnNgIGFuZCBgc3RvcGAuXG4gICAqL1xuICBuPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogTnVtYmVyIGJldHdlZW4gLTIuMCBhbmQgMi4wLiBQb3NpdGl2ZSB2YWx1ZXMgcGVuYWxpemUgbmV3IHRva2VucyBiYXNlZCBvblxuICAgKiB3aGV0aGVyIHRoZXkgYXBwZWFyIGluIHRoZSB0ZXh0IHNvIGZhciwgaW5jcmVhc2luZyB0aGUgbW9kZWwncyBsaWtlbGlob29kIHRvXG4gICAqIHRhbGsgYWJvdXQgbmV3IHRvcGljcy5cbiAgICpcbiAgICogW1NlZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZyZXF1ZW5jeSBhbmQgcHJlc2VuY2UgcGVuYWx0aWVzLl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3RleHQtZ2VuZXJhdGlvbi9wYXJhbWV0ZXItZGV0YWlscylcbiAgICovXG4gIHByZXNlbmNlX3BlbmFsdHk/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJZiBzcGVjaWZpZWQsIG91ciBzeXN0ZW0gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gc2FtcGxlIGRldGVybWluaXN0aWNhbGx5LFxuICAgKiBzdWNoIHRoYXQgcmVwZWF0ZWQgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSBgc2VlZGAgYW5kIHBhcmFtZXRlcnMgc2hvdWxkIHJldHVyblxuICAgKiB0aGUgc2FtZSByZXN1bHQuXG4gICAqXG4gICAqIERldGVybWluaXNtIGlzIG5vdCBndWFyYW50ZWVkLCBhbmQgeW91IHNob3VsZCByZWZlciB0byB0aGUgYHN5c3RlbV9maW5nZXJwcmludGBcbiAgICogcmVzcG9uc2UgcGFyYW1ldGVyIHRvIG1vbml0b3IgY2hhbmdlcyBpbiB0aGUgYmFja2VuZC5cbiAgICovXG4gIHNlZWQ/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBVcCB0byA0IHNlcXVlbmNlcyB3aGVyZSB0aGUgQVBJIHdpbGwgc3RvcCBnZW5lcmF0aW5nIGZ1cnRoZXIgdG9rZW5zLiBUaGVcbiAgICogcmV0dXJuZWQgdGV4dCB3aWxsIG5vdCBjb250YWluIHRoZSBzdG9wIHNlcXVlbmNlLlxuICAgKi9cbiAgc3RvcD86IHN0cmluZyB8IG51bGwgfCBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0cmVhbSBiYWNrIHBhcnRpYWwgcHJvZ3Jlc3MuIElmIHNldCwgdG9rZW5zIHdpbGwgYmUgc2VudCBhc1xuICAgKiBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3Igc3RyZWFtaW5nIHJlc3BvbnNlLiBPbmx5IHNldCB0aGlzIHdoZW4geW91IHNldCBgc3RyZWFtOiB0cnVlYC5cbiAgICovXG4gIHN0cmVhbV9vcHRpb25zPzogQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzdWZmaXggdGhhdCBjb21lcyBhZnRlciBhIGNvbXBsZXRpb24gb2YgaW5zZXJ0ZWQgdGV4dC5cbiAgICpcbiAgICogVGhpcyBwYXJhbWV0ZXIgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGBncHQtMy41LXR1cmJvLWluc3RydWN0YC5cbiAgICovXG4gIHN1ZmZpeD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgYHRvcF9wYCBidXQgbm90IGJvdGguXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIGB0ZW1wZXJhdHVyZWAgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG8gbW9uaXRvclxuICAgKiBhbmQgZGV0ZWN0IGFidXNlLlxuICAgKiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHMpLlxuICAgKi9cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zIHtcbiAgZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCB0eXBlIENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgZXh0ZW5kcyBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0cmVhbSBiYWNrIHBhcnRpYWwgcHJvZ3Jlc3MuIElmIHNldCwgdG9rZW5zIHdpbGwgYmUgc2VudCBhc1xuICAgKiBkYXRhLW9ubHlcbiAgICogW3NlcnZlci1zZW50IGV2ZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdClcbiAgICogYXMgdGhleSBiZWNvbWUgYXZhaWxhYmxlLCB3aXRoIHRoZSBzdHJlYW0gdGVybWluYXRlZCBieSBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX3N0cmVhbV9jb21wbGV0aW9ucykuXG4gICAqL1xuICBzdHJlYW0/OiBmYWxzZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyBleHRlbmRzIENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RyZWFtIGJhY2sgcGFydGlhbCBwcm9ncmVzcy4gSWYgc2V0LCB0b2tlbnMgd2lsbCBiZSBzZW50IGFzXG4gICAqIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb21wbGV0aW9ucyB7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbiA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNob2ljZSA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvblVzYWdlID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvblVzYWdlO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uL3Jlc291cmNlXCI7XG5pbXBvcnQgKiBhcyBFbWJlZGRpbmdzQVBJIGZyb20gXCIuL2VtYmVkZGluZ3NcIjtcblxuZXhwb3J0IGNsYXNzIEVtYmVkZGluZ3MgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtYmVkZGluZyB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBpbnB1dCB0ZXh0LlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGJvZHk6IEVtYmVkZGluZ0NyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvZW1iZWRkaW5ncycsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVtYmVkZGluZ3MgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICovXG4gIGRhdGE6IEFycmF5PEVtYmVkZGluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbWJlZGRpbmcuXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBcImxpc3RcIi5cbiAgICovXG4gIG9iamVjdDogJ2xpc3QnO1xuXG4gIC8qKlxuICAgKiBUaGUgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgdXNhZ2U6IENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlLlVzYWdlO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFRoZSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFVzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRva2VucyB1c2VkIGJ5IHRoZSBwcm9tcHQuXG4gICAgICovXG4gICAgcHJvbXB0X3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgdXNlZCBieSB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICB0b3RhbF90b2tlbnM6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZW1iZWRkaW5nIHZlY3RvciByZXR1cm5lZCBieSBlbWJlZGRpbmcgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkaW5nIHtcbiAgLyoqXG4gICAqIFRoZSBlbWJlZGRpbmcgdmVjdG9yLCB3aGljaCBpcyBhIGxpc3Qgb2YgZmxvYXRzLiBUaGUgbGVuZ3RoIG9mIHZlY3RvciBkZXBlbmRzIG9uXG4gICAqIHRoZSBtb2RlbCBhcyBsaXN0ZWQgaW4gdGhlXG4gICAqIFtlbWJlZGRpbmcgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9lbWJlZGRpbmdzKS5cbiAgICovXG4gIGVtYmVkZGluZzogQXJyYXk8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBlbWJlZGRpbmcgaW4gdGhlIGxpc3Qgb2YgZW1iZWRkaW5ncy5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIFwiZW1iZWRkaW5nXCIuXG4gICAqL1xuICBvYmplY3Q6ICdlbWJlZGRpbmcnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ0NyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBJbnB1dCB0ZXh0IHRvIGVtYmVkLCBlbmNvZGVkIGFzIGEgc3RyaW5nIG9yIGFycmF5IG9mIHRva2Vucy4gVG8gZW1iZWQgbXVsdGlwbGVcbiAgICogaW5wdXRzIGluIGEgc2luZ2xlIHJlcXVlc3QsIHBhc3MgYW4gYXJyYXkgb2Ygc3RyaW5ncyBvciBhcnJheSBvZiB0b2tlbiBhcnJheXMuXG4gICAqIFRoZSBpbnB1dCBtdXN0IG5vdCBleGNlZWQgdGhlIG1heCBpbnB1dCB0b2tlbnMgZm9yIHRoZSBtb2RlbCAoODE5MiB0b2tlbnMgZm9yXG4gICAqIGB0ZXh0LWVtYmVkZGluZy1hZGEtMDAyYCksIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcsIGFuZCBhbnkgYXJyYXkgbXVzdCBiZSAyMDQ4XG4gICAqIGRpbWVuc2lvbnMgb3IgbGVzcy5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fY291bnRfdG9rZW5zX3dpdGhfdGlrdG9rZW4pXG4gICAqIGZvciBjb3VudGluZyB0b2tlbnMuXG4gICAqL1xuICBpbnB1dDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPiB8IEFycmF5PG51bWJlcj4gfCBBcnJheTxBcnJheTxudW1iZXI+PjtcblxuICAvKipcbiAgICogSUQgb2YgdGhlIG1vZGVsIHRvIHVzZS4gWW91IGNhbiB1c2UgdGhlXG4gICAqIFtMaXN0IG1vZGVsc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMvbGlzdCkgQVBJIHRvXG4gICAqIHNlZSBhbGwgb2YgeW91ciBhdmFpbGFibGUgbW9kZWxzLCBvciBzZWUgb3VyXG4gICAqIFtNb2RlbCBvdmVydmlld10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL292ZXJ2aWV3KSBmb3JcbiAgICogZGVzY3JpcHRpb25zIG9mIHRoZW0uXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICd0ZXh0LWVtYmVkZGluZy1hZGEtMDAyJyB8ICd0ZXh0LWVtYmVkZGluZy0zLXNtYWxsJyB8ICd0ZXh0LWVtYmVkZGluZy0zLWxhcmdlJztcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkaW1lbnNpb25zIHRoZSByZXN1bHRpbmcgb3V0cHV0IGVtYmVkZGluZ3Mgc2hvdWxkIGhhdmUuIE9ubHlcbiAgICogc3VwcG9ydGVkIGluIGB0ZXh0LWVtYmVkZGluZy0zYCBhbmQgbGF0ZXIgbW9kZWxzLlxuICAgKi9cbiAgZGltZW5zaW9ucz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCB0byByZXR1cm4gdGhlIGVtYmVkZGluZ3MgaW4uIENhbiBiZSBlaXRoZXIgYGZsb2F0YCBvclxuICAgKiBbYGJhc2U2NGBdKGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9weWJhc2U2NC8pLlxuICAgKi9cbiAgZW5jb2RpbmdfZm9ybWF0PzogJ2Zsb2F0JyB8ICdiYXNlNjQnO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG8gbW9uaXRvclxuICAgKiBhbmQgZGV0ZWN0IGFidXNlLlxuICAgKiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHMpLlxuICAgKi9cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBFbWJlZGRpbmdzIHtcbiAgZXhwb3J0IGltcG9ydCBDcmVhdGVFbWJlZGRpbmdSZXNwb25zZSA9IEVtYmVkZGluZ3NBUEkuQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2U7XG4gIGV4cG9ydCBpbXBvcnQgRW1iZWRkaW5nID0gRW1iZWRkaW5nc0FQSS5FbWJlZGRpbmc7XG4gIGV4cG9ydCBpbXBvcnQgRW1iZWRkaW5nQ3JlYXRlUGFyYW1zID0gRW1iZWRkaW5nc0FQSS5FbWJlZGRpbmdDcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgdHlwZSBSZXNwb25zZSB9IGZyb20gXCIuLi9fc2hpbXMvaW5kZXhcIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbmltcG9ydCAqIGFzIEZpbGVzQVBJIGZyb20gXCIuL2ZpbGVzXCI7XG5pbXBvcnQgeyB0eXBlIFVwbG9hZGFibGUsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSBcIi4uL3BhZ2luYXRpb25cIjtcblxuZXhwb3J0IGNsYXNzIEZpbGVzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVXBsb2FkIGEgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGFjcm9zcyB2YXJpb3VzIGVuZHBvaW50cy4gVGhlIHNpemUgb2YgYWxsIHRoZVxuICAgKiBmaWxlcyB1cGxvYWRlZCBieSBvbmUgb3JnYW5pemF0aW9uIGNhbiBiZSB1cCB0byAxMDAgR0IuXG4gICAqXG4gICAqIFRoZSBzaXplIG9mIGluZGl2aWR1YWwgZmlsZXMgY2FuIGJlIGEgbWF4aW11bSBvZiA1MTIgTUIgb3IgMiBtaWxsaW9uIHRva2VucyBmb3JcbiAgICogQXNzaXN0YW50cy4gU2VlIHRoZVxuICAgKiBbQXNzaXN0YW50cyBUb29scyBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXNzaXN0YW50cy90b29scykgdG9cbiAgICogbGVhcm4gbW9yZSBhYm91dCB0aGUgdHlwZXMgb2YgZmlsZXMgc3VwcG9ydGVkLiBUaGUgRmluZS10dW5pbmcgQVBJIG9ubHkgc3VwcG9ydHNcbiAgICogYC5qc29ubGAgZmlsZXMuXG4gICAqXG4gICAqIFBsZWFzZSBbY29udGFjdCB1c10oaHR0cHM6Ly9oZWxwLm9wZW5haS5jb20vKSBpZiB5b3UgbmVlZCB0byBpbmNyZWFzZSB0aGVzZVxuICAgKiBzdG9yYWdlIGxpbWl0cy5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBGaWxlQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxGaWxlT2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvZmlsZXMnLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMoeyBib2R5LCAuLi5vcHRpb25zIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgZmlsZS5cbiAgICovXG4gIHJldHJpZXZlKGZpbGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxGaWxlT2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC9maWxlcy8ke2ZpbGVJZH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBmaWxlcyB0aGF0IGJlbG9uZyB0byB0aGUgdXNlcidzIG9yZ2FuaXphdGlvbi5cbiAgICovXG4gIGxpc3QocXVlcnk/OiBGaWxlTGlzdFBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPEZpbGVPYmplY3RzUGFnZSwgRmlsZU9iamVjdD47XG4gIGxpc3Qob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPEZpbGVPYmplY3RzUGFnZSwgRmlsZU9iamVjdD47XG4gIGxpc3QoXG4gICAgcXVlcnk6IEZpbGVMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbGVPYmplY3RzUGFnZSwgRmlsZU9iamVjdD4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoJy9maWxlcycsIEZpbGVPYmplY3RzUGFnZSwgeyBxdWVyeSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBmaWxlLlxuICAgKi9cbiAgZGVsKGZpbGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxGaWxlRGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvZmlsZXMvJHtmaWxlSWR9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWxlLlxuICAgKi9cbiAgY29udGVudChmaWxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL2ZpbGVzLyR7ZmlsZUlkfS9jb250ZW50YCwgeyAuLi5vcHRpb25zLCBfX2JpbmFyeVJlc3BvbnNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVGhlIGAuY29udGVudCgpYCBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZFxuICAgKi9cbiAgcmV0cmlldmVDb250ZW50KGZpbGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL2ZpbGVzLyR7ZmlsZUlkfS9jb250ZW50YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGdpdmVuIGZpbGUgdG8gYmUgcHJvY2Vzc2VkLCBkZWZhdWx0IHRpbWVvdXQgaXMgMzAgbWlucy5cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JQcm9jZXNzaW5nKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgeyBwb2xsSW50ZXJ2YWwgPSA1MDAwLCBtYXhXYWl0ID0gMzAgKiA2MCAqIDEwMDAgfTogeyBwb2xsSW50ZXJ2YWw/OiBudW1iZXI7IG1heFdhaXQ/OiBudW1iZXIgfSA9IHt9LFxuICApOiBQcm9taXNlPEZpbGVPYmplY3Q+IHtcbiAgICBjb25zdCBURVJNSU5BTF9TVEFURVMgPSBuZXcgU2V0KFsncHJvY2Vzc2VkJywgJ2Vycm9yJywgJ2RlbGV0ZWQnXSk7XG5cbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgbGV0IGZpbGUgPSBhd2FpdCB0aGlzLnJldHJpZXZlKGlkKTtcblxuICAgIHdoaWxlICghZmlsZS5zdGF0dXMgfHwgIVRFUk1JTkFMX1NUQVRFUy5oYXMoZmlsZS5zdGF0dXMpKSB7XG4gICAgICBhd2FpdCBzbGVlcChwb2xsSW50ZXJ2YWwpO1xuXG4gICAgICBmaWxlID0gYXdhaXQgdGhpcy5yZXRyaWV2ZShpZCk7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ID4gbWF4V2FpdCkge1xuICAgICAgICB0aHJvdyBuZXcgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcih7XG4gICAgICAgICAgbWVzc2FnZTogYEdpdmluZyB1cCBvbiB3YWl0aW5nIGZvciBmaWxlICR7aWR9IHRvIGZpbmlzaCBwcm9jZXNzaW5nIGFmdGVyICR7bWF4V2FpdH0gbWlsbGlzZWNvbmRzLmAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWxlO1xuICB9XG59XG5cbi8qKlxuICogTm90ZTogbm8gcGFnaW5hdGlvbiBhY3R1YWxseSBvY2N1cnMgeWV0LCB0aGlzIGlzIGZvciBmb3J3YXJkcy1jb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgY2xhc3MgRmlsZU9iamVjdHNQYWdlIGV4dGVuZHMgUGFnZTxGaWxlT2JqZWN0PiB7fVxuXG5leHBvcnQgdHlwZSBGaWxlQ29udGVudCA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlRGVsZXRlZCB7XG4gIGlkOiBzdHJpbmc7XG5cbiAgZGVsZXRlZDogYm9vbGVhbjtcblxuICBvYmplY3Q6ICdmaWxlJztcbn1cblxuLyoqXG4gKiBUaGUgYEZpbGVgIG9iamVjdCByZXByZXNlbnRzIGEgZG9jdW1lbnQgdGhhdCBoYXMgYmVlbiB1cGxvYWRlZCB0byBPcGVuQUkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZU9iamVjdCB7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBmaWxlLCBpbiBieXRlcy5cbiAgICovXG4gIGJ5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGZpbGUgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgZmlsZW5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYGZpbGVgLlxuICAgKi9cbiAgb2JqZWN0OiAnZmlsZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlbmRlZCBwdXJwb3NlIG9mIHRoZSBmaWxlLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSBgZmluZS10dW5lYCxcbiAgICogYGZpbmUtdHVuZS1yZXN1bHRzYCwgYGFzc2lzdGFudHNgLCBhbmQgYGFzc2lzdGFudHNfb3V0cHV0YC5cbiAgICovXG4gIHB1cnBvc2U6ICdmaW5lLXR1bmUnIHwgJ2ZpbmUtdHVuZS1yZXN1bHRzJyB8ICdhc3Npc3RhbnRzJyB8ICdhc3Npc3RhbnRzX291dHB1dCc7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkLiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGZpbGUsIHdoaWNoIGNhbiBiZSBlaXRoZXJcbiAgICogYHVwbG9hZGVkYCwgYHByb2Nlc3NlZGAsIG9yIGBlcnJvcmAuXG4gICAqL1xuICBzdGF0dXM6ICd1cGxvYWRlZCcgfCAncHJvY2Vzc2VkJyB8ICdlcnJvcic7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkLiBGb3IgZGV0YWlscyBvbiB3aHkgYSBmaW5lLXR1bmluZyB0cmFpbmluZyBmaWxlIGZhaWxlZFxuICAgKiB2YWxpZGF0aW9uLCBzZWUgdGhlIGBlcnJvcmAgZmllbGQgb24gYGZpbmVfdHVuaW5nLmpvYmAuXG4gICAqL1xuICBzdGF0dXNfZGV0YWlscz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBGaWxlIG9iamVjdCAobm90IGZpbGUgbmFtZSkgdG8gYmUgdXBsb2FkZWQuXG4gICAqL1xuICBmaWxlOiBVcGxvYWRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZW5kZWQgcHVycG9zZSBvZiB0aGUgdXBsb2FkZWQgZmlsZS5cbiAgICpcbiAgICogVXNlIFwiZmluZS10dW5lXCIgZm9yXG4gICAqIFtGaW5lLXR1bmluZ10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maW5lLXR1bmluZykgYW5kXG4gICAqIFwiYXNzaXN0YW50c1wiIGZvclxuICAgKiBbQXNzaXN0YW50c10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSBhbmRcbiAgICogW01lc3NhZ2VzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzKS4gVGhpcyBhbGxvd3NcbiAgICogdXMgdG8gdmFsaWRhdGUgdGhlIGZvcm1hdCBvZiB0aGUgdXBsb2FkZWQgZmlsZSBpcyBjb3JyZWN0IGZvciBmaW5lLXR1bmluZy5cbiAgICovXG4gIHB1cnBvc2U6ICdmaW5lLXR1bmUnIHwgJ2Fzc2lzdGFudHMnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVMaXN0UGFyYW1zIHtcbiAgLyoqXG4gICAqIE9ubHkgcmV0dXJuIGZpbGVzIHdpdGggdGhlIGdpdmVuIHB1cnBvc2UuXG4gICAqL1xuICBwdXJwb3NlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbGVzIHtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQ29udGVudCA9IEZpbGVzQVBJLkZpbGVDb250ZW50O1xuICBleHBvcnQgaW1wb3J0IEZpbGVEZWxldGVkID0gRmlsZXNBUEkuRmlsZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZU9iamVjdCA9IEZpbGVzQVBJLkZpbGVPYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZU9iamVjdHNQYWdlID0gRmlsZXNBUEkuRmlsZU9iamVjdHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDcmVhdGVQYXJhbXMgPSBGaWxlc0FQSS5GaWxlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVMaXN0UGFyYW1zID0gRmlsZXNBUEkuRmlsZUxpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0ICogYXMgQ2hlY2twb2ludHNBUEkgZnJvbSBcIi4vY2hlY2twb2ludHNcIjtcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9wYWdpbmF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGVja3BvaW50cyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIExpc3QgY2hlY2twb2ludHMgZm9yIGEgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgbGlzdChcbiAgICBmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IENoZWNrcG9pbnRMaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JDaGVja3BvaW50PjtcbiAgbGlzdChcbiAgICBmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlLCBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludD47XG4gIGxpc3QoXG4gICAgZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsXG4gICAgcXVlcnk6IENoZWNrcG9pbnRMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JDaGVja3BvaW50PiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KGZpbmVUdW5pbmdKb2JJZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KFxuICAgICAgYC9maW5lX3R1bmluZy9qb2JzLyR7ZmluZVR1bmluZ0pvYklkfS9jaGVja3BvaW50c2AsXG4gICAgICBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlLFxuICAgICAgeyBxdWVyeSwgLi4ub3B0aW9ucyB9LFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPEZpbmVUdW5pbmdKb2JDaGVja3BvaW50PiB7fVxuXG4vKipcbiAqIFRoZSBgZmluZV90dW5pbmcuam9iLmNoZWNrcG9pbnRgIG9iamVjdCByZXByZXNlbnRzIGEgbW9kZWwgY2hlY2twb2ludCBmb3IgYVxuICogZmluZS10dW5pbmcgam9iIHRoYXQgaXMgcmVhZHkgdG8gdXNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmVUdW5pbmdKb2JDaGVja3BvaW50IHtcbiAgLyoqXG4gICAqIFRoZSBjaGVja3BvaW50IGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIHRoZSBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbmUtdHVuZWQgY2hlY2twb2ludCBtb2RlbCB0aGF0IGlzIGNyZWF0ZWQuXG4gICAqL1xuICBmaW5lX3R1bmVkX21vZGVsX2NoZWNrcG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbmUtdHVuaW5nIGpvYiB0aGF0IHRoaXMgY2hlY2twb2ludCB3YXMgY3JlYXRlZCBmcm9tLlxuICAgKi9cbiAgZmluZV90dW5pbmdfam9iX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1ldHJpY3MgYXQgdGhlIHN0ZXAgbnVtYmVyIGR1cmluZyB0aGUgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgbWV0cmljczogRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQuTWV0cmljcztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgXCJmaW5lX3R1bmluZy5qb2IuY2hlY2twb2ludFwiLlxuICAgKi9cbiAgb2JqZWN0OiAnZmluZV90dW5pbmcuam9iLmNoZWNrcG9pbnQnO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RlcCBudW1iZXIgdGhhdCB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZCBhdC5cbiAgICovXG4gIHN0ZXBfbnVtYmVyOiBudW1iZXI7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQge1xuICAvKipcbiAgICogTWV0cmljcyBhdCB0aGUgc3RlcCBudW1iZXIgZHVyaW5nIHRoZSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIE1ldHJpY3Mge1xuICAgIGZ1bGxfdmFsaWRfbG9zcz86IG51bWJlcjtcblxuICAgIGZ1bGxfdmFsaWRfbWVhbl90b2tlbl9hY2N1cmFjeT86IG51bWJlcjtcblxuICAgIHN0ZXA/OiBudW1iZXI7XG5cbiAgICB0cmFpbl9sb3NzPzogbnVtYmVyO1xuXG4gICAgdHJhaW5fbWVhbl90b2tlbl9hY2N1cmFjeT86IG51bWJlcjtcblxuICAgIHZhbGlkX2xvc3M/OiBudW1iZXI7XG5cbiAgICB2YWxpZF9tZWFuX3Rva2VuX2FjY3VyYWN5PzogbnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2twb2ludExpc3RQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHt9XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hlY2twb2ludHMge1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JDaGVja3BvaW50ID0gQ2hlY2twb2ludHNBUEkuRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSA9IENoZWNrcG9pbnRzQVBJLkZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hlY2twb2ludExpc3RQYXJhbXMgPSBDaGVja3BvaW50c0FQSS5DaGVja3BvaW50TGlzdFBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgKiBhcyBKb2JzQVBJIGZyb20gXCIuL2pvYnNcIjtcbmltcG9ydCAqIGFzIENoZWNrcG9pbnRzQVBJIGZyb20gXCIuL2NoZWNrcG9pbnRzXCI7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vcGFnaW5hdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgSm9icyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgY2hlY2twb2ludHM6IENoZWNrcG9pbnRzQVBJLkNoZWNrcG9pbnRzID0gbmV3IENoZWNrcG9pbnRzQVBJLkNoZWNrcG9pbnRzKHRoaXMuX2NsaWVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmaW5lLXR1bmluZyBqb2Igd2hpY2ggYmVnaW5zIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGEgbmV3IG1vZGVsIGZyb21cbiAgICogYSBnaXZlbiBkYXRhc2V0LlxuICAgKlxuICAgKiBSZXNwb25zZSBpbmNsdWRlcyBkZXRhaWxzIG9mIHRoZSBlbnF1ZXVlZCBqb2IgaW5jbHVkaW5nIGpvYiBzdGF0dXMgYW5kIHRoZSBuYW1lXG4gICAqIG9mIHRoZSBmaW5lLXR1bmVkIG1vZGVscyBvbmNlIGNvbXBsZXRlLlxuICAgKlxuICAgKiBbTGVhcm4gbW9yZSBhYm91dCBmaW5lLXR1bmluZ10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2ZpbmUtdHVuaW5nKVxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IEpvYkNyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8RmluZVR1bmluZ0pvYj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2ZpbmVfdHVuaW5nL2pvYnMnLCB7IGJvZHksIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGluZm8gYWJvdXQgYSBmaW5lLXR1bmluZyBqb2IuXG4gICAqXG4gICAqIFtMZWFybiBtb3JlIGFib3V0IGZpbmUtdHVuaW5nXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZmluZS10dW5pbmcpXG4gICAqL1xuICByZXRyaWV2ZShmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8RmluZVR1bmluZ0pvYj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvZmluZV90dW5pbmcvam9icy8ke2ZpbmVUdW5pbmdKb2JJZH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHlvdXIgb3JnYW5pemF0aW9uJ3MgZmluZS10dW5pbmcgam9ic1xuICAgKi9cbiAgbGlzdChcbiAgICBxdWVyeT86IEpvYkxpc3RQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYnNQYWdlLCBGaW5lVHVuaW5nSm9iPjtcbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYnNQYWdlLCBGaW5lVHVuaW5nSm9iPjtcbiAgbGlzdChcbiAgICBxdWVyeTogSm9iTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9ic1BhZ2UsIEZpbmVUdW5pbmdKb2I+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3Qoe30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KCcvZmluZV90dW5pbmcvam9icycsIEZpbmVUdW5pbmdKb2JzUGFnZSwgeyBxdWVyeSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbW1lZGlhdGVseSBjYW5jZWwgYSBmaW5lLXR1bmUgam9iLlxuICAgKi9cbiAgY2FuY2VsKGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxGaW5lVHVuaW5nSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvZmluZV90dW5pbmcvam9icy8ke2ZpbmVUdW5pbmdKb2JJZH0vY2FuY2VsYCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0YXR1cyB1cGRhdGVzIGZvciBhIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGxpc3RFdmVudHMoXG4gICAgZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBKb2JMaXN0RXZlbnRzUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JFdmVudHNQYWdlLCBGaW5lVHVuaW5nSm9iRXZlbnQ+O1xuICBsaXN0RXZlbnRzKFxuICAgIGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JFdmVudHNQYWdlLCBGaW5lVHVuaW5nSm9iRXZlbnQ+O1xuICBsaXN0RXZlbnRzKFxuICAgIGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBKb2JMaXN0RXZlbnRzUGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JFdmVudHNQYWdlLCBGaW5lVHVuaW5nSm9iRXZlbnQ+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3RFdmVudHMoZmluZVR1bmluZ0pvYklkLCB7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoYC9maW5lX3R1bmluZy9qb2JzLyR7ZmluZVR1bmluZ0pvYklkfS9ldmVudHNgLCBGaW5lVHVuaW5nSm9iRXZlbnRzUGFnZSwge1xuICAgICAgcXVlcnksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGaW5lVHVuaW5nSm9ic1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPEZpbmVUdW5pbmdKb2I+IHt9XG5cbmV4cG9ydCBjbGFzcyBGaW5lVHVuaW5nSm9iRXZlbnRzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8RmluZVR1bmluZ0pvYkV2ZW50PiB7fVxuXG4vKipcbiAqIFRoZSBgZmluZV90dW5pbmcuam9iYCBvYmplY3QgcmVwcmVzZW50cyBhIGZpbmUtdHVuaW5nIGpvYiB0aGF0IGhhcyBiZWVuIGNyZWF0ZWRcbiAqIHRocm91Z2ggdGhlIEFQSS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5lVHVuaW5nSm9iIHtcbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gdGhlIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBmaW5lLXR1bmluZyBqb2Igd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZvciBmaW5lLXR1bmluZyBqb2JzIHRoYXQgaGF2ZSBgZmFpbGVkYCwgdGhpcyB3aWxsIGNvbnRhaW4gbW9yZSBpbmZvcm1hdGlvbiBvblxuICAgKiB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUuXG4gICAqL1xuICBlcnJvcjogRmluZVR1bmluZ0pvYi5FcnJvciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaW5lLXR1bmVkIG1vZGVsIHRoYXQgaXMgYmVpbmcgY3JlYXRlZC4gVGhlIHZhbHVlIHdpbGwgYmUgbnVsbFxuICAgKiBpZiB0aGUgZmluZS10dW5pbmcgam9iIGlzIHN0aWxsIHJ1bm5pbmcuXG4gICAqL1xuICBmaW5lX3R1bmVkX21vZGVsOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBmaW5lLXR1bmluZyBqb2Igd2FzIGZpbmlzaGVkLiBUaGVcbiAgICogdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoZSBmaW5lLXR1bmluZyBqb2IgaXMgc3RpbGwgcnVubmluZy5cbiAgICovXG4gIGZpbmlzaGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgaHlwZXJwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBmaW5lLXR1bmluZyBqb2IuIFNlZSB0aGVcbiAgICogW2ZpbmUtdHVuaW5nIGd1aWRlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZmluZS10dW5pbmcpIGZvclxuICAgKiBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBoeXBlcnBhcmFtZXRlcnM6IEZpbmVUdW5pbmdKb2IuSHlwZXJwYXJhbWV0ZXJzO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBtb2RlbCB0aGF0IGlzIGJlaW5nIGZpbmUtdHVuZWQuXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBcImZpbmVfdHVuaW5nLmpvYlwiLlxuICAgKi9cbiAgb2JqZWN0OiAnZmluZV90dW5pbmcuam9iJztcblxuICAvKipcbiAgICogVGhlIG9yZ2FuaXphdGlvbiB0aGF0IG93bnMgdGhlIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIG9yZ2FuaXphdGlvbl9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tcGlsZWQgcmVzdWx0cyBmaWxlIElEKHMpIGZvciB0aGUgZmluZS10dW5pbmcgam9iLiBZb3UgY2FuIHJldHJpZXZlIHRoZVxuICAgKiByZXN1bHRzIHdpdGggdGhlXG4gICAqIFtGaWxlcyBBUEldKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMvcmV0cmlldmUtY29udGVudHMpLlxuICAgKi9cbiAgcmVzdWx0X2ZpbGVzOiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2VlZCB1c2VkIGZvciB0aGUgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgc2VlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGZpbmUtdHVuaW5nIGpvYiwgd2hpY2ggY2FuIGJlIGVpdGhlclxuICAgKiBgdmFsaWRhdGluZ19maWxlc2AsIGBxdWV1ZWRgLCBgcnVubmluZ2AsIGBzdWNjZWVkZWRgLCBgZmFpbGVkYCwgb3IgYGNhbmNlbGxlZGAuXG4gICAqL1xuICBzdGF0dXM6ICd2YWxpZGF0aW5nX2ZpbGVzJyB8ICdxdWV1ZWQnIHwgJ3J1bm5pbmcnIHwgJ3N1Y2NlZWRlZCcgfCAnZmFpbGVkJyB8ICdjYW5jZWxsZWQnO1xuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGJpbGxhYmxlIHRva2VucyBwcm9jZXNzZWQgYnkgdGhpcyBmaW5lLXR1bmluZyBqb2IuIFRoZSB2YWx1ZVxuICAgKiB3aWxsIGJlIG51bGwgaWYgdGhlIGZpbmUtdHVuaW5nIGpvYiBpcyBzdGlsbCBydW5uaW5nLlxuICAgKi9cbiAgdHJhaW5lZF90b2tlbnM6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIElEIHVzZWQgZm9yIHRyYWluaW5nLiBZb3UgY2FuIHJldHJpZXZlIHRoZSB0cmFpbmluZyBkYXRhIHdpdGggdGhlXG4gICAqIFtGaWxlcyBBUEldKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMvcmV0cmlldmUtY29udGVudHMpLlxuICAgKi9cbiAgdHJhaW5pbmdfZmlsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSBJRCB1c2VkIGZvciB2YWxpZGF0aW9uLiBZb3UgY2FuIHJldHJpZXZlIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMgd2l0aFxuICAgKiB0aGVcbiAgICogW0ZpbGVzIEFQSV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcy9yZXRyaWV2ZS1jb250ZW50cykuXG4gICAqL1xuICB2YWxpZGF0aW9uX2ZpbGU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGZpbmUtdHVuaW5nIGpvYiBpcyBlc3RpbWF0ZWQgdG9cbiAgICogZmluaXNoLiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsIGlmIHRoZSBmaW5lLXR1bmluZyBqb2IgaXMgbm90IHJ1bm5pbmcuXG4gICAqL1xuICBlc3RpbWF0ZWRfZmluaXNoPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGludGVncmF0aW9ucyB0byBlbmFibGUgZm9yIHRoaXMgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgaW50ZWdyYXRpb25zPzogQXJyYXk8RmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb25PYmplY3Q+IHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaW5lVHVuaW5nSm9iIHtcbiAgLyoqXG4gICAqIEZvciBmaW5lLXR1bmluZyBqb2JzIHRoYXQgaGF2ZSBgZmFpbGVkYCwgdGhpcyB3aWxsIGNvbnRhaW4gbW9yZSBpbmZvcm1hdGlvbiBvblxuICAgKiB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBBIG1hY2hpbmUtcmVhZGFibGUgZXJyb3IgY29kZS5cbiAgICAgKi9cbiAgICBjb2RlOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gICAgICovXG4gICAgbWVzc2FnZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBhcmFtZXRlciB0aGF0IHdhcyBpbnZhbGlkLCB1c3VhbGx5IGB0cmFpbmluZ19maWxlYCBvciBgdmFsaWRhdGlvbl9maWxlYC5cbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBpZiB0aGUgZmFpbHVyZSB3YXMgbm90IHBhcmFtZXRlci1zcGVjaWZpYy5cbiAgICAgKi9cbiAgICBwYXJhbTogc3RyaW5nIHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaHlwZXJwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBmaW5lLXR1bmluZyBqb2IuIFNlZSB0aGVcbiAgICogW2ZpbmUtdHVuaW5nIGd1aWRlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZmluZS10dW5pbmcpIGZvclxuICAgKiBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEh5cGVycGFyYW1ldGVycyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBlcG9jaHMgdG8gdHJhaW4gdGhlIG1vZGVsIGZvci4gQW4gZXBvY2ggcmVmZXJzIHRvIG9uZSBmdWxsIGN5Y2xlXG4gICAgICogdGhyb3VnaCB0aGUgdHJhaW5pbmcgZGF0YXNldC4gXCJhdXRvXCIgZGVjaWRlcyB0aGUgb3B0aW1hbCBudW1iZXIgb2YgZXBvY2hzIGJhc2VkXG4gICAgICogb24gdGhlIHNpemUgb2YgdGhlIGRhdGFzZXQuIElmIHNldHRpbmcgdGhlIG51bWJlciBtYW51YWxseSwgd2Ugc3VwcG9ydCBhbnlcbiAgICAgKiBudW1iZXIgYmV0d2VlbiAxIGFuZCA1MCBlcG9jaHMuXG4gICAgICovXG4gICAgbl9lcG9jaHM6ICdhdXRvJyB8IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmUtdHVuaW5nIGpvYiBldmVudCBvYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5lVHVuaW5nSm9iRXZlbnQge1xuICBpZDogc3RyaW5nO1xuXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICBsZXZlbDogJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJztcblxuICBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgb2JqZWN0OiAnZmluZV90dW5pbmcuam9iLmV2ZW50Jztcbn1cblxuZXhwb3J0IHR5cGUgRmluZVR1bmluZ0pvYkludGVncmF0aW9uID0gRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb25PYmplY3Q7XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIGZvciB5b3VyIGludGVncmF0aW9uIHdpdGggV2VpZ2h0cyBhbmQgQmlhc2VzLiBUaGlzIHBheWxvYWRcbiAqIHNwZWNpZmllcyB0aGUgcHJvamVjdCB0aGF0IG1ldHJpY3Mgd2lsbCBiZSBzZW50IHRvLiBPcHRpb25hbGx5LCB5b3UgY2FuIHNldCBhblxuICogZXhwbGljaXQgZGlzcGxheSBuYW1lIGZvciB5b3VyIHJ1biwgYWRkIHRhZ3MgdG8geW91ciBydW4sIGFuZCBzZXQgYSBkZWZhdWx0XG4gKiBlbnRpdHkgKHRlYW0sIHVzZXJuYW1lLCBldGMpIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoZSBuZXcgcnVuIHdpbGwgYmUgY3JlYXRlZCB1bmRlci5cbiAgICovXG4gIHByb2plY3Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVudGl0eSB0byB1c2UgZm9yIHRoZSBydW4uIFRoaXMgYWxsb3dzIHlvdSB0byBzZXQgdGhlIHRlYW0gb3IgdXNlcm5hbWUgb2ZcbiAgICogdGhlIFdhbmRCIHVzZXIgdGhhdCB5b3Ugd291bGQgbGlrZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1bi4gSWYgbm90IHNldCwgdGhlXG4gICAqIGRlZmF1bHQgZW50aXR5IGZvciB0aGUgcmVnaXN0ZXJlZCBXYW5kQiBBUEkga2V5IGlzIHVzZWQuXG4gICAqL1xuICBlbnRpdHk/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGRpc3BsYXkgbmFtZSB0byBzZXQgZm9yIHRoZSBydW4uIElmIG5vdCBzZXQsIHdlIHdpbGwgdXNlIHRoZSBKb2IgSUQgYXMgdGhlXG4gICAqIG5hbWUuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRhZ3MgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgcnVuLiBUaGVzZSB0YWdzIGFyZSBwYXNzZWRcbiAgICogdGhyb3VnaCBkaXJlY3RseSB0byBXYW5kQi4gU29tZSBkZWZhdWx0IHRhZ3MgYXJlIGdlbmVyYXRlZCBieSBPcGVuQUk6XG4gICAqIFwib3BlbmFpL2ZpbmV0dW5lXCIsIFwib3BlbmFpL3tiYXNlLW1vZGVsfVwiLCBcIm9wZW5haS97ZnRqb2ItYWJjZGVmfVwiLlxuICAgKi9cbiAgdGFncz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb25PYmplY3Qge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGludGVncmF0aW9uIGJlaW5nIGVuYWJsZWQgZm9yIHRoZSBmaW5lLXR1bmluZyBqb2JcbiAgICovXG4gIHR5cGU6ICd3YW5kYic7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBmb3IgeW91ciBpbnRlZ3JhdGlvbiB3aXRoIFdlaWdodHMgYW5kIEJpYXNlcy4gVGhpcyBwYXlsb2FkXG4gICAqIHNwZWNpZmllcyB0aGUgcHJvamVjdCB0aGF0IG1ldHJpY3Mgd2lsbCBiZSBzZW50IHRvLiBPcHRpb25hbGx5LCB5b3UgY2FuIHNldCBhblxuICAgKiBleHBsaWNpdCBkaXNwbGF5IG5hbWUgZm9yIHlvdXIgcnVuLCBhZGQgdGFncyB0byB5b3VyIHJ1biwgYW5kIHNldCBhIGRlZmF1bHRcbiAgICogZW50aXR5ICh0ZWFtLCB1c2VybmFtZSwgZXRjKSB0byBiZSBhc3NvY2lhdGVkIHdpdGggeW91ciBydW4uXG4gICAqL1xuICB3YW5kYjogRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSm9iQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtb2RlbCB0byBmaW5lLXR1bmUuIFlvdSBjYW4gc2VsZWN0IG9uZSBvZiB0aGVcbiAgICogW3N1cHBvcnRlZCBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZy93aGF0LW1vZGVscy1jYW4tYmUtZmluZS10dW5lZCkuXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICdiYWJiYWdlLTAwMicgfCAnZGF2aW5jaS0wMDInIHwgJ2dwdC0zLjUtdHVyYm8nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgYW4gdXBsb2FkZWQgZmlsZSB0aGF0IGNvbnRhaW5zIHRyYWluaW5nIGRhdGEuXG4gICAqXG4gICAqIFNlZSBbdXBsb2FkIGZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMvY3JlYXRlKVxuICAgKiBmb3IgaG93IHRvIHVwbG9hZCBhIGZpbGUuXG4gICAqXG4gICAqIFlvdXIgZGF0YXNldCBtdXN0IGJlIGZvcm1hdHRlZCBhcyBhIEpTT05MIGZpbGUuIEFkZGl0aW9uYWxseSwgeW91IG11c3QgdXBsb2FkXG4gICAqIHlvdXIgZmlsZSB3aXRoIHRoZSBwdXJwb3NlIGBmaW5lLXR1bmVgLlxuICAgKlxuICAgKiBTZWUgdGhlIFtmaW5lLXR1bmluZyBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2ZpbmUtdHVuaW5nKVxuICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgdHJhaW5pbmdfZmlsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaHlwZXJwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBoeXBlcnBhcmFtZXRlcnM/OiBKb2JDcmVhdGVQYXJhbXMuSHlwZXJwYXJhbWV0ZXJzO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgaW50ZWdyYXRpb25zIHRvIGVuYWJsZSBmb3IgeW91ciBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBpbnRlZ3JhdGlvbnM/OiBBcnJheTxKb2JDcmVhdGVQYXJhbXMuSW50ZWdyYXRpb24+IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNlZWQgY29udHJvbHMgdGhlIHJlcHJvZHVjaWJpbGl0eSBvZiB0aGUgam9iLiBQYXNzaW5nIGluIHRoZSBzYW1lIHNlZWQgYW5kXG4gICAqIGpvYiBwYXJhbWV0ZXJzIHNob3VsZCBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdHMsIGJ1dCBtYXkgZGlmZmVyIGluIHJhcmUgY2FzZXMuIElmXG4gICAqIGEgc2VlZCBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHlvdS5cbiAgICovXG4gIHNlZWQ/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyBvZiB1cCB0byAxOCBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB5b3VyIGZpbmUtdHVuZWQgbW9kZWxcbiAgICogbmFtZS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGEgYHN1ZmZpeGAgb2YgXCJjdXN0b20tbW9kZWwtbmFtZVwiIHdvdWxkIHByb2R1Y2UgYSBtb2RlbCBuYW1lIGxpa2VcbiAgICogYGZ0OmdwdC0zLjUtdHVyYm86b3BlbmFpOmN1c3RvbS1tb2RlbC1uYW1lOjdwNGxVUmVsYC5cbiAgICovXG4gIHN1ZmZpeD86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiBhbiB1cGxvYWRlZCBmaWxlIHRoYXQgY29udGFpbnMgdmFsaWRhdGlvbiBkYXRhLlxuICAgKlxuICAgKiBJZiB5b3UgcHJvdmlkZSB0aGlzIGZpbGUsIHRoZSBkYXRhIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdmFsaWRhdGlvbiBtZXRyaWNzXG4gICAqIHBlcmlvZGljYWxseSBkdXJpbmcgZmluZS10dW5pbmcuIFRoZXNlIG1ldHJpY3MgY2FuIGJlIHZpZXdlZCBpbiB0aGUgZmluZS10dW5pbmdcbiAgICogcmVzdWx0cyBmaWxlLiBUaGUgc2FtZSBkYXRhIHNob3VsZCBub3QgYmUgcHJlc2VudCBpbiBib3RoIHRyYWluIGFuZCB2YWxpZGF0aW9uXG4gICAqIGZpbGVzLlxuICAgKlxuICAgKiBZb3VyIGRhdGFzZXQgbXVzdCBiZSBmb3JtYXR0ZWQgYXMgYSBKU09OTCBmaWxlLiBZb3UgbXVzdCB1cGxvYWQgeW91ciBmaWxlIHdpdGhcbiAgICogdGhlIHB1cnBvc2UgYGZpbmUtdHVuZWAuXG4gICAqXG4gICAqIFNlZSB0aGUgW2ZpbmUtdHVuaW5nIGd1aWRlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZmluZS10dW5pbmcpXG4gICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICB2YWxpZGF0aW9uX2ZpbGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEpvYkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgaHlwZXJwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEh5cGVycGFyYW1ldGVycyB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGV4YW1wbGVzIGluIGVhY2ggYmF0Y2guIEEgbGFyZ2VyIGJhdGNoIHNpemUgbWVhbnMgdGhhdCBtb2RlbFxuICAgICAqIHBhcmFtZXRlcnMgYXJlIHVwZGF0ZWQgbGVzcyBmcmVxdWVudGx5LCBidXQgd2l0aCBsb3dlciB2YXJpYW5jZS5cbiAgICAgKi9cbiAgICBiYXRjaF9zaXplPzogJ2F1dG8nIHwgbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogU2NhbGluZyBmYWN0b3IgZm9yIHRoZSBsZWFybmluZyByYXRlLiBBIHNtYWxsZXIgbGVhcm5pbmcgcmF0ZSBtYXkgYmUgdXNlZnVsIHRvXG4gICAgICogYXZvaWQgb3ZlcmZpdHRpbmcuXG4gICAgICovXG4gICAgbGVhcm5pbmdfcmF0ZV9tdWx0aXBsaWVyPzogJ2F1dG8nIHwgbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBlcG9jaHMgdG8gdHJhaW4gdGhlIG1vZGVsIGZvci4gQW4gZXBvY2ggcmVmZXJzIHRvIG9uZSBmdWxsIGN5Y2xlXG4gICAgICogdGhyb3VnaCB0aGUgdHJhaW5pbmcgZGF0YXNldC5cbiAgICAgKi9cbiAgICBuX2Vwb2Nocz86ICdhdXRvJyB8IG51bWJlcjtcbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgSW50ZWdyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGludGVncmF0aW9uIHRvIGVuYWJsZS4gQ3VycmVudGx5LCBvbmx5IFwid2FuZGJcIiAoV2VpZ2h0cyBhbmQgQmlhc2VzKVxuICAgICAqIGlzIHN1cHBvcnRlZC5cbiAgICAgKi9cbiAgICB0eXBlOiAnd2FuZGInO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNldHRpbmdzIGZvciB5b3VyIGludGVncmF0aW9uIHdpdGggV2VpZ2h0cyBhbmQgQmlhc2VzLiBUaGlzIHBheWxvYWRcbiAgICAgKiBzcGVjaWZpZXMgdGhlIHByb2plY3QgdGhhdCBtZXRyaWNzIHdpbGwgYmUgc2VudCB0by4gT3B0aW9uYWxseSwgeW91IGNhbiBzZXQgYW5cbiAgICAgKiBleHBsaWNpdCBkaXNwbGF5IG5hbWUgZm9yIHlvdXIgcnVuLCBhZGQgdGFncyB0byB5b3VyIHJ1biwgYW5kIHNldCBhIGRlZmF1bHRcbiAgICAgKiBlbnRpdHkgKHRlYW0sIHVzZXJuYW1lLCBldGMpIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIHJ1bi5cbiAgICAgKi9cbiAgICB3YW5kYjogSW50ZWdyYXRpb24uV2FuZGI7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIEludGVncmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGluZ3MgZm9yIHlvdXIgaW50ZWdyYXRpb24gd2l0aCBXZWlnaHRzIGFuZCBCaWFzZXMuIFRoaXMgcGF5bG9hZFxuICAgICAqIHNwZWNpZmllcyB0aGUgcHJvamVjdCB0aGF0IG1ldHJpY3Mgd2lsbCBiZSBzZW50IHRvLiBPcHRpb25hbGx5LCB5b3UgY2FuIHNldCBhblxuICAgICAqIGV4cGxpY2l0IGRpc3BsYXkgbmFtZSBmb3IgeW91ciBydW4sIGFkZCB0YWdzIHRvIHlvdXIgcnVuLCBhbmQgc2V0IGEgZGVmYXVsdFxuICAgICAqIGVudGl0eSAodGVhbSwgdXNlcm5hbWUsIGV0YykgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHlvdXIgcnVuLlxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgV2FuZGIge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoZSBuZXcgcnVuIHdpbGwgYmUgY3JlYXRlZCB1bmRlci5cbiAgICAgICAqL1xuICAgICAgcHJvamVjdDogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBlbnRpdHkgdG8gdXNlIGZvciB0aGUgcnVuLiBUaGlzIGFsbG93cyB5b3UgdG8gc2V0IHRoZSB0ZWFtIG9yIHVzZXJuYW1lIG9mXG4gICAgICAgKiB0aGUgV2FuZEIgdXNlciB0aGF0IHlvdSB3b3VsZCBsaWtlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVuLiBJZiBub3Qgc2V0LCB0aGVcbiAgICAgICAqIGRlZmF1bHQgZW50aXR5IGZvciB0aGUgcmVnaXN0ZXJlZCBXYW5kQiBBUEkga2V5IGlzIHVzZWQuXG4gICAgICAgKi9cbiAgICAgIGVudGl0eT86IHN0cmluZyB8IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBkaXNwbGF5IG5hbWUgdG8gc2V0IGZvciB0aGUgcnVuLiBJZiBub3Qgc2V0LCB3ZSB3aWxsIHVzZSB0aGUgSm9iIElEIGFzIHRoZVxuICAgICAgICogbmFtZS5cbiAgICAgICAqL1xuICAgICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIHRhZ3MgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgcnVuLiBUaGVzZSB0YWdzIGFyZSBwYXNzZWRcbiAgICAgICAqIHRocm91Z2ggZGlyZWN0bHkgdG8gV2FuZEIuIFNvbWUgZGVmYXVsdCB0YWdzIGFyZSBnZW5lcmF0ZWQgYnkgT3BlbkFJOlxuICAgICAgICogXCJvcGVuYWkvZmluZXR1bmVcIiwgXCJvcGVuYWkve2Jhc2UtbW9kZWx9XCIsIFwib3BlbmFpL3tmdGpvYi1hYmNkZWZ9XCIuXG4gICAgICAgKi9cbiAgICAgIHRhZ3M/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpvYkxpc3RQYXJhbXMgZXh0ZW5kcyBDdXJzb3JQYWdlUGFyYW1zIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSm9iTGlzdEV2ZW50c1BhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge31cblxuZXhwb3J0IG5hbWVzcGFjZSBKb2JzIHtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JFdmVudCA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYkV2ZW50O1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JJbnRlZ3JhdGlvbiA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYkludGVncmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdCA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb25PYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYnNQYWdlID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9ic1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JFdmVudHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEpvYkNyZWF0ZVBhcmFtcyA9IEpvYnNBUEkuSm9iQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEpvYkxpc3RQYXJhbXMgPSBKb2JzQVBJLkpvYkxpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSm9iTGlzdEV2ZW50c1BhcmFtcyA9IEpvYnNBUEkuSm9iTGlzdEV2ZW50c1BhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDaGVja3BvaW50cyA9IENoZWNrcG9pbnRzQVBJLkNoZWNrcG9pbnRzO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JDaGVja3BvaW50ID0gQ2hlY2twb2ludHNBUEkuRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSA9IENoZWNrcG9pbnRzQVBJLkZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hlY2twb2ludExpc3RQYXJhbXMgPSBDaGVja3BvaW50c0FQSS5DaGVja3BvaW50TGlzdFBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgSm9ic0FQSSBmcm9tIFwiLi9qb2JzL2pvYnNcIjtcblxuZXhwb3J0IGNsYXNzIEZpbmVUdW5pbmcgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIGpvYnM6IEpvYnNBUEkuSm9icyA9IG5ldyBKb2JzQVBJLkpvYnModGhpcy5fY2xpZW50KTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaW5lVHVuaW5nIHtcbiAgZXhwb3J0IGltcG9ydCBKb2JzID0gSm9ic0FQSS5Kb2JzO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2IgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2I7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkV2ZW50ID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkludGVncmF0aW9uID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iSW50ZWdyYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb24gPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uT2JqZWN0ID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9ic1BhZ2UgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iRXZlbnRzUGFnZSA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYkV2ZW50c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgSm9iQ3JlYXRlUGFyYW1zID0gSm9ic0FQSS5Kb2JDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSm9iTGlzdFBhcmFtcyA9IEpvYnNBUEkuSm9iTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBKb2JMaXN0RXZlbnRzUGFyYW1zID0gSm9ic0FQSS5Kb2JMaXN0RXZlbnRzUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uL3Jlc291cmNlXCI7XG5pbXBvcnQgKiBhcyBJbWFnZXNBUEkgZnJvbSBcIi4vaW1hZ2VzXCI7XG5pbXBvcnQgeyB0eXBlIFVwbG9hZGFibGUsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi9jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZXMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdmFyaWF0aW9uIG9mIGEgZ2l2ZW4gaW1hZ2UuXG4gICAqL1xuICBjcmVhdGVWYXJpYXRpb24oXG4gICAgYm9keTogSW1hZ2VDcmVhdGVWYXJpYXRpb25QYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxJbWFnZXNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2ltYWdlcy92YXJpYXRpb25zJywgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zKHsgYm9keSwgLi4ub3B0aW9ucyB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlZGl0ZWQgb3IgZXh0ZW5kZWQgaW1hZ2UgZ2l2ZW4gYW4gb3JpZ2luYWwgaW1hZ2UgYW5kIGEgcHJvbXB0LlxuICAgKi9cbiAgZWRpdChib2R5OiBJbWFnZUVkaXRQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEltYWdlc1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvaW1hZ2VzL2VkaXRzJywgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zKHsgYm9keSwgLi4ub3B0aW9ucyB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbWFnZSBnaXZlbiBhIHByb21wdC5cbiAgICovXG4gIGdlbmVyYXRlKGJvZHk6IEltYWdlR2VuZXJhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEltYWdlc1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvaW1hZ2VzL2dlbmVyYXRpb25zJywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdXJsIG9yIHRoZSBjb250ZW50IG9mIGFuIGltYWdlIGdlbmVyYXRlZCBieSB0aGUgT3BlbkFJIEFQSS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZSB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZTY0LWVuY29kZWQgSlNPTiBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlLCBpZiBgcmVzcG9uc2VfZm9ybWF0YCBpc1xuICAgKiBgYjY0X2pzb25gLlxuICAgKi9cbiAgYjY0X2pzb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9tcHQgdGhhdCB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgaW1hZ2UsIGlmIHRoZXJlIHdhcyBhbnkgcmV2aXNpb24gdG8gdGhlXG4gICAqIHByb21wdC5cbiAgICovXG4gIHJldmlzZWRfcHJvbXB0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UsIGlmIGByZXNwb25zZV9mb3JtYXRgIGlzIGB1cmxgIChkZWZhdWx0KS5cbiAgICovXG4gIHVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZXNSZXNwb25zZSB7XG4gIGNyZWF0ZWQ6IG51bWJlcjtcblxuICBkYXRhOiBBcnJheTxJbWFnZT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VDcmVhdGVWYXJpYXRpb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIGltYWdlIHRvIHVzZSBhcyB0aGUgYmFzaXMgZm9yIHRoZSB2YXJpYXRpb24ocykuIE11c3QgYmUgYSB2YWxpZCBQTkcgZmlsZSxcbiAgICogbGVzcyB0aGFuIDRNQiwgYW5kIHNxdWFyZS5cbiAgICovXG4gIGltYWdlOiBVcGxvYWRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdG8gdXNlIGZvciBpbWFnZSBnZW5lcmF0aW9uLiBPbmx5IGBkYWxsLWUtMmAgaXMgc3VwcG9ydGVkIGF0IHRoaXNcbiAgICogdGltZS5cbiAgICovXG4gIG1vZGVsPzogKHN0cmluZyAmIHt9KSB8ICdkYWxsLWUtMicgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGltYWdlcyB0byBnZW5lcmF0ZS4gTXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwLiBGb3IgYGRhbGwtZS0zYCwgb25seVxuICAgKiBgbj0xYCBpcyBzdXBwb3J0ZWQuXG4gICAqL1xuICBuPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIGltYWdlcyBhcmUgcmV0dXJuZWQuIE11c3QgYmUgb25lIG9mIGB1cmxgIG9yXG4gICAqIGBiNjRfanNvbmAuIFVSTHMgYXJlIG9ubHkgdmFsaWQgZm9yIDYwIG1pbnV0ZXMgYWZ0ZXIgdGhlIGltYWdlIGhhcyBiZWVuXG4gICAqIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86ICd1cmwnIHwgJ2I2NF9qc29uJyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzLiBNdXN0IGJlIG9uZSBvZiBgMjU2eDI1NmAsIGA1MTJ4NTEyYCwgb3JcbiAgICogYDEwMjR4MTAyNGAuXG4gICAqL1xuICBzaXplPzogJzI1NngyNTYnIHwgJzUxMng1MTInIHwgJzEwMjR4MTAyNCcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG8gbW9uaXRvclxuICAgKiBhbmQgZGV0ZWN0IGFidXNlLlxuICAgKiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHMpLlxuICAgKi9cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUVkaXRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGltYWdlIHRvIGVkaXQuIE11c3QgYmUgYSB2YWxpZCBQTkcgZmlsZSwgbGVzcyB0aGFuIDRNQiwgYW5kIHNxdWFyZS4gSWYgbWFza1xuICAgKiBpcyBub3QgcHJvdmlkZWQsIGltYWdlIG11c3QgaGF2ZSB0cmFuc3BhcmVuY3ksIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyB0aGUgbWFzay5cbiAgICovXG4gIGltYWdlOiBVcGxvYWRhYmxlO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGRlc2lyZWQgaW1hZ2UocykuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAxMDAwXG4gICAqIGNoYXJhY3RlcnMuXG4gICAqL1xuICBwcm9tcHQ6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gYWRkaXRpb25hbCBpbWFnZSB3aG9zZSBmdWxseSB0cmFuc3BhcmVudCBhcmVhcyAoZS5nLiB3aGVyZSBhbHBoYSBpcyB6ZXJvKVxuICAgKiBpbmRpY2F0ZSB3aGVyZSBgaW1hZ2VgIHNob3VsZCBiZSBlZGl0ZWQuIE11c3QgYmUgYSB2YWxpZCBQTkcgZmlsZSwgbGVzcyB0aGFuXG4gICAqIDRNQiwgYW5kIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyBgaW1hZ2VgLlxuICAgKi9cbiAgbWFzaz86IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byB1c2UgZm9yIGltYWdlIGdlbmVyYXRpb24uIE9ubHkgYGRhbGwtZS0yYCBpcyBzdXBwb3J0ZWQgYXQgdGhpc1xuICAgKiB0aW1lLlxuICAgKi9cbiAgbW9kZWw/OiAoc3RyaW5nICYge30pIHwgJ2RhbGwtZS0yJyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaW1hZ2VzIHRvIGdlbmVyYXRlLiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAuXG4gICAqL1xuICBuPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIGltYWdlcyBhcmUgcmV0dXJuZWQuIE11c3QgYmUgb25lIG9mIGB1cmxgIG9yXG4gICAqIGBiNjRfanNvbmAuIFVSTHMgYXJlIG9ubHkgdmFsaWQgZm9yIDYwIG1pbnV0ZXMgYWZ0ZXIgdGhlIGltYWdlIGhhcyBiZWVuXG4gICAqIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86ICd1cmwnIHwgJ2I2NF9qc29uJyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzLiBNdXN0IGJlIG9uZSBvZiBgMjU2eDI1NmAsIGA1MTJ4NTEyYCwgb3JcbiAgICogYDEwMjR4MTAyNGAuXG4gICAqL1xuICBzaXplPzogJzI1NngyNTYnIHwgJzUxMng1MTInIHwgJzEwMjR4MTAyNCcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG8gbW9uaXRvclxuICAgKiBhbmQgZGV0ZWN0IGFidXNlLlxuICAgKiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHMpLlxuICAgKi9cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUdlbmVyYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgZGVzaXJlZCBpbWFnZShzKS4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDEwMDBcbiAgICogY2hhcmFjdGVycyBmb3IgYGRhbGwtZS0yYCBhbmQgNDAwMCBjaGFyYWN0ZXJzIGZvciBgZGFsbC1lLTNgLlxuICAgKi9cbiAgcHJvbXB0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byB1c2UgZm9yIGltYWdlIGdlbmVyYXRpb24uXG4gICAqL1xuICBtb2RlbD86IChzdHJpbmcgJiB7fSkgfCAnZGFsbC1lLTInIHwgJ2RhbGwtZS0zJyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaW1hZ2VzIHRvIGdlbmVyYXRlLiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAuIEZvciBgZGFsbC1lLTNgLCBvbmx5XG4gICAqIGBuPTFgIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIG4/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgcXVhbGl0eSBvZiB0aGUgaW1hZ2UgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZC4gYGhkYCBjcmVhdGVzIGltYWdlcyB3aXRoIGZpbmVyXG4gICAqIGRldGFpbHMgYW5kIGdyZWF0ZXIgY29uc2lzdGVuY3kgYWNyb3NzIHRoZSBpbWFnZS4gVGhpcyBwYXJhbSBpcyBvbmx5IHN1cHBvcnRlZFxuICAgKiBmb3IgYGRhbGwtZS0zYC5cbiAgICovXG4gIHF1YWxpdHk/OiAnc3RhbmRhcmQnIHwgJ2hkJztcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIGltYWdlcyBhcmUgcmV0dXJuZWQuIE11c3QgYmUgb25lIG9mIGB1cmxgIG9yXG4gICAqIGBiNjRfanNvbmAuIFVSTHMgYXJlIG9ubHkgdmFsaWQgZm9yIDYwIG1pbnV0ZXMgYWZ0ZXIgdGhlIGltYWdlIGhhcyBiZWVuXG4gICAqIGdlbmVyYXRlZC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86ICd1cmwnIHwgJ2I2NF9qc29uJyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzLiBNdXN0IGJlIG9uZSBvZiBgMjU2eDI1NmAsIGA1MTJ4NTEyYCwgb3JcbiAgICogYDEwMjR4MTAyNGAgZm9yIGBkYWxsLWUtMmAuIE11c3QgYmUgb25lIG9mIGAxMDI0eDEwMjRgLCBgMTc5MngxMDI0YCwgb3JcbiAgICogYDEwMjR4MTc5MmAgZm9yIGBkYWxsLWUtM2AgbW9kZWxzLlxuICAgKi9cbiAgc2l6ZT86ICcyNTZ4MjU2JyB8ICc1MTJ4NTEyJyB8ICcxMDI0eDEwMjQnIHwgJzE3OTJ4MTAyNCcgfCAnMTAyNHgxNzkyJyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHlsZSBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlcy4gTXVzdCBiZSBvbmUgb2YgYHZpdmlkYCBvciBgbmF0dXJhbGAuIFZpdmlkXG4gICAqIGNhdXNlcyB0aGUgbW9kZWwgdG8gbGVhbiB0b3dhcmRzIGdlbmVyYXRpbmcgaHlwZXItcmVhbCBhbmQgZHJhbWF0aWMgaW1hZ2VzLlxuICAgKiBOYXR1cmFsIGNhdXNlcyB0aGUgbW9kZWwgdG8gcHJvZHVjZSBtb3JlIG5hdHVyYWwsIGxlc3MgaHlwZXItcmVhbCBsb29raW5nXG4gICAqIGltYWdlcy4gVGhpcyBwYXJhbSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgYGRhbGwtZS0zYC5cbiAgICovXG4gIHN0eWxlPzogJ3ZpdmlkJyB8ICduYXR1cmFsJyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0byBtb25pdG9yXG4gICAqIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAqIFtMZWFybiBtb3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkcykuXG4gICAqL1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEltYWdlcyB7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2UgPSBJbWFnZXNBUEkuSW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VzUmVzcG9uc2UgPSBJbWFnZXNBUEkuSW1hZ2VzUmVzcG9uc2U7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VDcmVhdGVWYXJpYXRpb25QYXJhbXMgPSBJbWFnZXNBUEkuSW1hZ2VDcmVhdGVWYXJpYXRpb25QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VFZGl0UGFyYW1zID0gSW1hZ2VzQVBJLkltYWdlRWRpdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUdlbmVyYXRlUGFyYW1zID0gSW1hZ2VzQVBJLkltYWdlR2VuZXJhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIE1vZGVsc0FQSSBmcm9tIFwiLi9tb2RlbHNcIjtcbmltcG9ydCB7IFBhZ2UgfSBmcm9tIFwiLi4vcGFnaW5hdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgTW9kZWxzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UsIHByb3ZpZGluZyBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kZWwgc3VjaCBhc1xuICAgKiB0aGUgb3duZXIgYW5kIHBlcm1pc3Npb25pbmcuXG4gICAqL1xuICByZXRyaWV2ZShtb2RlbDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvbW9kZWxzLyR7bW9kZWx9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgbW9kZWxzLCBhbmQgcHJvdmlkZXMgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaFxuICAgKiBvbmUgc3VjaCBhcyB0aGUgb3duZXIgYW5kIGF2YWlsYWJpbGl0eS5cbiAgICovXG4gIGxpc3Qob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPE1vZGVsc1BhZ2UsIE1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KCcvbW9kZWxzJywgTW9kZWxzUGFnZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgZmluZS10dW5lZCBtb2RlbC4gWW91IG11c3QgaGF2ZSB0aGUgT3duZXIgcm9sZSBpbiB5b3VyIG9yZ2FuaXphdGlvbiB0b1xuICAgKiBkZWxldGUgYSBtb2RlbC5cbiAgICovXG4gIGRlbChtb2RlbDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxNb2RlbERlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL21vZGVscy8ke21vZGVsfWAsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogTm90ZTogbm8gcGFnaW5hdGlvbiBhY3R1YWxseSBvY2N1cnMgeWV0LCB0aGlzIGlzIGZvciBmb3J3YXJkcy1jb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxzUGFnZSBleHRlbmRzIFBhZ2U8TW9kZWw+IHt9XG5cbi8qKlxuICogRGVzY3JpYmVzIGFuIE9wZW5BSSBtb2RlbCBvZmZlcmluZyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIEFQSS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbCB7XG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gdGhlIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIHdoZW4gdGhlIG1vZGVsIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBcIm1vZGVsXCIuXG4gICAqL1xuICBvYmplY3Q6ICdtb2RlbCc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmdhbml6YXRpb24gdGhhdCBvd25zIHRoZSBtb2RlbC5cbiAgICovXG4gIG93bmVkX2J5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxEZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1vZGVscyB7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWwgPSBNb2RlbHNBUEkuTW9kZWw7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWxEZWxldGVkID0gTW9kZWxzQVBJLk1vZGVsRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbHNQYWdlID0gTW9kZWxzQVBJLk1vZGVsc1BhZ2U7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIE1vZGVyYXRpb25zQVBJIGZyb20gXCIuL21vZGVyYXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBNb2RlcmF0aW9ucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENsYXNzaWZpZXMgaWYgdGV4dCBpcyBwb3RlbnRpYWxseSBoYXJtZnVsLlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGJvZHk6IE1vZGVyYXRpb25DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxNb2RlcmF0aW9uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9tb2RlcmF0aW9ucycsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVyYXRpb24ge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHRoZSBjYXRlZ29yaWVzLCBhbmQgd2hldGhlciB0aGV5IGFyZSBmbGFnZ2VkIG9yIG5vdC5cbiAgICovXG4gIGNhdGVnb3JpZXM6IE1vZGVyYXRpb24uQ2F0ZWdvcmllcztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRoZSBjYXRlZ29yaWVzIGFsb25nIHdpdGggdGhlaXIgc2NvcmVzIGFzIHByZWRpY3RlZCBieSBtb2RlbC5cbiAgICovXG4gIGNhdGVnb3J5X3Njb3JlczogTW9kZXJhdGlvbi5DYXRlZ29yeVNjb3JlcztcblxuICAvKipcbiAgICogV2hldGhlciBhbnkgb2YgdGhlIGJlbG93IGNhdGVnb3JpZXMgYXJlIGZsYWdnZWQuXG4gICAqL1xuICBmbGFnZ2VkOiBib29sZWFuO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1vZGVyYXRpb24ge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHRoZSBjYXRlZ29yaWVzLCBhbmQgd2hldGhlciB0aGV5IGFyZSBmbGFnZ2VkIG9yIG5vdC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcmllcyB7XG4gICAgLyoqXG4gICAgICogQ29udGVudCB0aGF0IGV4cHJlc3NlcywgaW5jaXRlcywgb3IgcHJvbW90ZXMgaGFyYXNzaW5nIGxhbmd1YWdlIHRvd2FyZHMgYW55XG4gICAgICogdGFyZ2V0LlxuICAgICAqL1xuICAgIGhhcmFzc21lbnQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBIYXJhc3NtZW50IGNvbnRlbnQgdGhhdCBhbHNvIGluY2x1ZGVzIHZpb2xlbmNlIG9yIHNlcmlvdXMgaGFybSB0b3dhcmRzIGFueVxuICAgICAqIHRhcmdldC5cbiAgICAgKi9cbiAgICAnaGFyYXNzbWVudC90aHJlYXRlbmluZyc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IHRoYXQgZXhwcmVzc2VzLCBpbmNpdGVzLCBvciBwcm9tb3RlcyBoYXRlIGJhc2VkIG9uIHJhY2UsIGdlbmRlcixcbiAgICAgKiBldGhuaWNpdHksIHJlbGlnaW9uLCBuYXRpb25hbGl0eSwgc2V4dWFsIG9yaWVudGF0aW9uLCBkaXNhYmlsaXR5IHN0YXR1cywgb3JcbiAgICAgKiBjYXN0ZS4gSGF0ZWZ1bCBjb250ZW50IGFpbWVkIGF0IG5vbi1wcm90ZWN0ZWQgZ3JvdXBzIChlLmcuLCBjaGVzcyBwbGF5ZXJzKSBpc1xuICAgICAqIGhhcmFzc21lbnQuXG4gICAgICovXG4gICAgaGF0ZTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEhhdGVmdWwgY29udGVudCB0aGF0IGFsc28gaW5jbHVkZXMgdmlvbGVuY2Ugb3Igc2VyaW91cyBoYXJtIHRvd2FyZHMgdGhlIHRhcmdldGVkXG4gICAgICogZ3JvdXAgYmFzZWQgb24gcmFjZSwgZ2VuZGVyLCBldGhuaWNpdHksIHJlbGlnaW9uLCBuYXRpb25hbGl0eSwgc2V4dWFsXG4gICAgICogb3JpZW50YXRpb24sIGRpc2FiaWxpdHkgc3RhdHVzLCBvciBjYXN0ZS5cbiAgICAgKi9cbiAgICAnaGF0ZS90aHJlYXRlbmluZyc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IHRoYXQgcHJvbW90ZXMsIGVuY291cmFnZXMsIG9yIGRlcGljdHMgYWN0cyBvZiBzZWxmLWhhcm0sIHN1Y2ggYXNcbiAgICAgKiBzdWljaWRlLCBjdXR0aW5nLCBhbmQgZWF0aW5nIGRpc29yZGVycy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtJzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgdGhhdCBlbmNvdXJhZ2VzIHBlcmZvcm1pbmcgYWN0cyBvZiBzZWxmLWhhcm0sIHN1Y2ggYXMgc3VpY2lkZSwgY3V0dGluZyxcbiAgICAgKiBhbmQgZWF0aW5nIGRpc29yZGVycywgb3IgdGhhdCBnaXZlcyBpbnN0cnVjdGlvbnMgb3IgYWR2aWNlIG9uIGhvdyB0byBjb21taXQgc3VjaFxuICAgICAqIGFjdHMuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybS9pbnN0cnVjdGlvbnMnOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCB3aGVyZSB0aGUgc3BlYWtlciBleHByZXNzZXMgdGhhdCB0aGV5IGFyZSBlbmdhZ2luZyBvciBpbnRlbmQgdG8gZW5nYWdlXG4gICAgICogaW4gYWN0cyBvZiBzZWxmLWhhcm0sIHN1Y2ggYXMgc3VpY2lkZSwgY3V0dGluZywgYW5kIGVhdGluZyBkaXNvcmRlcnMuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybS9pbnRlbnQnOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCBtZWFudCB0byBhcm91c2Ugc2V4dWFsIGV4Y2l0ZW1lbnQsIHN1Y2ggYXMgdGhlIGRlc2NyaXB0aW9uIG9mIHNleHVhbFxuICAgICAqIGFjdGl2aXR5LCBvciB0aGF0IHByb21vdGVzIHNleHVhbCBzZXJ2aWNlcyAoZXhjbHVkaW5nIHNleCBlZHVjYXRpb24gYW5kXG4gICAgICogd2VsbG5lc3MpLlxuICAgICAqL1xuICAgIHNleHVhbDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNleHVhbCBjb250ZW50IHRoYXQgaW5jbHVkZXMgYW4gaW5kaXZpZHVhbCB3aG8gaXMgdW5kZXIgMTggeWVhcnMgb2xkLlxuICAgICAqL1xuICAgICdzZXh1YWwvbWlub3JzJzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgdGhhdCBkZXBpY3RzIGRlYXRoLCB2aW9sZW5jZSwgb3IgcGh5c2ljYWwgaW5qdXJ5LlxuICAgICAqL1xuICAgIHZpb2xlbmNlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCB0aGF0IGRlcGljdHMgZGVhdGgsIHZpb2xlbmNlLCBvciBwaHlzaWNhbCBpbmp1cnkgaW4gZ3JhcGhpYyBkZXRhaWwuXG4gICAgICovXG4gICAgJ3Zpb2xlbmNlL2dyYXBoaWMnOiBib29sZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0aGUgY2F0ZWdvcmllcyBhbG9uZyB3aXRoIHRoZWlyIHNjb3JlcyBhcyBwcmVkaWN0ZWQgYnkgbW9kZWwuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5U2NvcmVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnaGFyYXNzbWVudCcuXG4gICAgICovXG4gICAgaGFyYXNzbWVudDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ2hhcmFzc21lbnQvdGhyZWF0ZW5pbmcnLlxuICAgICAqL1xuICAgICdoYXJhc3NtZW50L3RocmVhdGVuaW5nJzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ2hhdGUnLlxuICAgICAqL1xuICAgIGhhdGU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdoYXRlL3RocmVhdGVuaW5nJy5cbiAgICAgKi9cbiAgICAnaGF0ZS90aHJlYXRlbmluZyc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZWxmLWhhcm0nLlxuICAgICAqL1xuICAgICdzZWxmLWhhcm0nOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnc2VsZi1oYXJtL2luc3RydWN0aW9ucycuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybS9pbnN0cnVjdGlvbnMnOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnc2VsZi1oYXJtL2ludGVudCcuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybS9pbnRlbnQnOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnc2V4dWFsJy5cbiAgICAgKi9cbiAgICBzZXh1YWw6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZXh1YWwvbWlub3JzJy5cbiAgICAgKi9cbiAgICAnc2V4dWFsL21pbm9ycyc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICd2aW9sZW5jZScuXG4gICAgICovXG4gICAgdmlvbGVuY2U6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICd2aW9sZW5jZS9ncmFwaGljJy5cbiAgICAgKi9cbiAgICAndmlvbGVuY2UvZ3JhcGhpYyc6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgaWYgYSBnaXZlbiB0ZXh0IGlucHV0IGlzIHBvdGVudGlhbGx5IGhhcm1mdWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZXJhdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1vZGVyYXRpb24gcmVxdWVzdC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtb2RlcmF0aW9uIHJlc3VsdHMuXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgbW9kZXJhdGlvbiBvYmplY3RzLlxuICAgKi9cbiAgcmVzdWx0czogQXJyYXk8TW9kZXJhdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZXJhdGlvbkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdGV4dCB0byBjbGFzc2lmeVxuICAgKi9cbiAgaW5wdXQ6IHN0cmluZyB8IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFR3byBjb250ZW50IG1vZGVyYXRpb25zIG1vZGVscyBhcmUgYXZhaWxhYmxlOiBgdGV4dC1tb2RlcmF0aW9uLXN0YWJsZWAgYW5kXG4gICAqIGB0ZXh0LW1vZGVyYXRpb24tbGF0ZXN0YC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgaXMgYHRleHQtbW9kZXJhdGlvbi1sYXRlc3RgIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGdyYWRlZFxuICAgKiBvdmVyIHRpbWUuIFRoaXMgZW5zdXJlcyB5b3UgYXJlIGFsd2F5cyB1c2luZyBvdXIgbW9zdCBhY2N1cmF0ZSBtb2RlbC4gSWYgeW91IHVzZVxuICAgKiBgdGV4dC1tb2RlcmF0aW9uLXN0YWJsZWAsIHdlIHdpbGwgcHJvdmlkZSBhZHZhbmNlZCBub3RpY2UgYmVmb3JlIHVwZGF0aW5nIHRoZVxuICAgKiBtb2RlbC4gQWNjdXJhY3kgb2YgYHRleHQtbW9kZXJhdGlvbi1zdGFibGVgIG1heSBiZSBzbGlnaHRseSBsb3dlciB0aGFuIGZvclxuICAgKiBgdGV4dC1tb2RlcmF0aW9uLWxhdGVzdGAuXG4gICAqL1xuICBtb2RlbD86IChzdHJpbmcgJiB7fSkgfCAndGV4dC1tb2RlcmF0aW9uLWxhdGVzdCcgfCAndGV4dC1tb2RlcmF0aW9uLXN0YWJsZSc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9kZXJhdGlvbnMge1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb24gPSBNb2RlcmF0aW9uc0FQSS5Nb2RlcmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb25DcmVhdGVSZXNwb25zZSA9IE1vZGVyYXRpb25zQVBJLk1vZGVyYXRpb25DcmVhdGVSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBNb2RlcmF0aW9uQ3JlYXRlUGFyYW1zID0gTW9kZXJhdGlvbnNBUEkuTW9kZXJhdGlvbkNyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gJy4vY29yZSc7XG5pbXBvcnQgKiBhcyBFcnJvcnMgZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgeyB0eXBlIEFnZW50LCB0eXBlIFJlcXVlc3RJbml0IH0gZnJvbSAnLi9fc2hpbXMvaW5kZXgnO1xuaW1wb3J0ICogYXMgVXBsb2FkcyBmcm9tICcuL3VwbG9hZHMnO1xuaW1wb3J0ICogYXMgUGFnaW5hdGlvbiBmcm9tIFwiLi9wYWdpbmF0aW9uXCI7XG5pbXBvcnQgKiBhcyBBUEkgZnJvbSBcIi4vcmVzb3VyY2VzL2luZGV4XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0cyB0byBwcm9jZXNzLmVudlsnT1BFTkFJX0FQSV9LRVknXS5cbiAgICovXG4gIGFwaUtleT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ09QRU5BSV9PUkdfSUQnXS5cbiAgICovXG4gIG9yZ2FuaXphdGlvbj86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIERlZmF1bHRzIHRvIHByb2Nlc3MuZW52WydPUEVOQUlfUFJPSkVDVF9JRCddLlxuICAgKi9cbiAgcHJvamVjdD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJhc2UgVVJMIGZvciB0aGUgQVBJLCBlLmcuLCBcImh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3YyL1wiXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHByb2Nlc3MuZW52WydPUEVOQUlfQkFTRV9VUkwnXS5cbiAgICovXG4gIGJhc2VVUkw/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0aGF0IHRoZSBjbGllbnQgc2hvdWxkIHdhaXQgZm9yIGEgcmVzcG9uc2VcbiAgICogZnJvbSB0aGUgc2VydmVyIGJlZm9yZSB0aW1pbmcgb3V0IGEgc2luZ2xlIHJlcXVlc3QuXG4gICAqXG4gICAqIE5vdGUgdGhhdCByZXF1ZXN0IHRpbWVvdXRzIGFyZSByZXRyaWVkIGJ5IGRlZmF1bHQsIHNvIGluIGEgd29yc3QtY2FzZSBzY2VuYXJpbyB5b3UgbWF5IHdhaXRcbiAgICogbXVjaCBsb25nZXIgdGhhbiB0aGlzIHRpbWVvdXQgYmVmb3JlIHRoZSBwcm9taXNlIHN1Y2NlZWRzIG9yIGZhaWxzLlxuICAgKi9cbiAgdGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gSFRUUCBhZ2VudCB1c2VkIHRvIG1hbmFnZSBIVFRQKFMpIGNvbm5lY3Rpb25zLlxuICAgKlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGFuIGFnZW50IHdpbGwgYmUgY29uc3RydWN0ZWQgYnkgZGVmYXVsdCBpbiB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCxcbiAgICogb3RoZXJ3aXNlIG5vIGFnZW50IGlzIHVzZWQuXG4gICAqL1xuICBodHRwQWdlbnQ/OiBBZ2VudDtcblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBgZmV0Y2hgIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgKlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHdlIHVzZSBgbm9kZS1mZXRjaGAgb24gTm9kZS5qcyBhbmQgb3RoZXJ3aXNlIGV4cGVjdCB0aGF0IGBmZXRjaGAgaXNcbiAgICogZGVmaW5lZCBnbG9iYWxseS5cbiAgICovXG4gIGZldGNoPzogQ29yZS5GZXRjaCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIGNsaWVudCB3aWxsIHJldHJ5IGEgcmVxdWVzdCBpbiBjYXNlIG9mIGFcbiAgICogdGVtcG9yYXJ5IGZhaWx1cmUsIGxpa2UgYSBuZXR3b3JrIGVycm9yIG9yIGEgNVhYIGVycm9yIGZyb20gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQGRlZmF1bHQgMlxuICAgKi9cbiAgbWF4UmV0cmllcz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBoZWFkZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqXG4gICAqIFRoZXNlIGNhbiBiZSByZW1vdmVkIGluIGluZGl2aWR1YWwgcmVxdWVzdHMgYnkgZXhwbGljaXRseSBzZXR0aW5nIHRoZVxuICAgKiBoZWFkZXIgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRIZWFkZXJzPzogQ29yZS5IZWFkZXJzO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICpcbiAgICogVGhlc2UgY2FuIGJlIHJlbW92ZWQgaW4gaW5kaXZpZHVhbCByZXF1ZXN0cyBieSBleHBsaWNpdGx5IHNldHRpbmcgdGhlXG4gICAqIHBhcmFtIHRvIGB1bmRlZmluZWRgIGluIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRRdWVyeT86IENvcmUuRGVmYXVsdFF1ZXJ5O1xuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBjbGllbnQtc2lkZSB1c2Ugb2YgdGhpcyBsaWJyYXJ5IGlzIG5vdCBhbGxvd2VkLCBhcyBpdCByaXNrcyBleHBvc2luZyB5b3VyIHNlY3JldCBBUEkgY3JlZGVudGlhbHMgdG8gYXR0YWNrZXJzLlxuICAgKiBPbmx5IHNldCB0aGlzIG9wdGlvbiB0byBgdHJ1ZWAgaWYgeW91IHVuZGVyc3RhbmQgdGhlIHJpc2tzIGFuZCBoYXZlIGFwcHJvcHJpYXRlIG1pdGlnYXRpb25zIGluIHBsYWNlLlxuICAgKi9cbiAgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXI/OiBib29sZWFuO1xufVxuXG4vKiogQVBJIENsaWVudCBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgT3BlbkFJIEFQSS4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuQUkgZXh0ZW5kcyBDb3JlLkFQSUNsaWVudCB7XG4gIGFwaUtleTogc3RyaW5nO1xuICBvcmdhbml6YXRpb246IHN0cmluZyB8IG51bGw7XG4gIHByb2plY3Q6IHN0cmluZyB8IG51bGw7XG5cbiAgcHJpdmF0ZSBfb3B0aW9uczogQ2xpZW50T3B0aW9ucztcblxuICAvKipcbiAgICogQVBJIENsaWVudCBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgT3BlbkFJIEFQSS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IFtvcHRzLmFwaUtleT1wcm9jZXNzLmVudlsnT1BFTkFJX0FQSV9LRVknXSA/PyB1bmRlZmluZWRdXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gW29wdHMub3JnYW5pemF0aW9uPXByb2Nlc3MuZW52WydPUEVOQUlfT1JHX0lEJ10gPz8gbnVsbF1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0cy5wcm9qZWN0PXByb2Nlc3MuZW52WydPUEVOQUlfUFJPSkVDVF9JRCddID8/IG51bGxdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5iYXNlVVJMPXByb2Nlc3MuZW52WydPUEVOQUlfQkFTRV9VUkwnXSA/PyBodHRwczovL2FwaS5vcGVuYWkuY29tL3YxXSAtIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJhc2UgVVJMIGZvciB0aGUgQVBJLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMudGltZW91dD0xMCBtaW51dGVzXSAtIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRoZSBjbGllbnQgd2lsbCB3YWl0IGZvciBhIHJlc3BvbnNlIGJlZm9yZSB0aW1pbmcgb3V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaHR0cEFnZW50XSAtIEFuIEhUVFAgYWdlbnQgdXNlZCB0byBtYW5hZ2UgSFRUUChzKSBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtDb3JlLkZldGNofSBbb3B0cy5mZXRjaF0gLSBTcGVjaWZ5IGEgY3VzdG9tIGBmZXRjaGAgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5tYXhSZXRyaWVzPTJdIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBjbGllbnQgd2lsbCByZXRyeSBhIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7Q29yZS5IZWFkZXJzfSBvcHRzLmRlZmF1bHRIZWFkZXJzIC0gRGVmYXVsdCBoZWFkZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7Q29yZS5EZWZhdWx0UXVlcnl9IG9wdHMuZGVmYXVsdFF1ZXJ5IC0gRGVmYXVsdCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXI9ZmFsc2VdIC0gQnkgZGVmYXVsdCwgY2xpZW50LXNpZGUgdXNlIG9mIHRoaXMgbGlicmFyeSBpcyBub3QgYWxsb3dlZCwgYXMgaXQgcmlza3MgZXhwb3NpbmcgeW91ciBzZWNyZXQgQVBJIGNyZWRlbnRpYWxzIHRvIGF0dGFja2Vycy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYXNlVVJMID0gQ29yZS5yZWFkRW52KCdPUEVOQUlfQkFTRV9VUkwnKSxcbiAgICBhcGlLZXkgPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9BUElfS0VZJyksXG4gICAgb3JnYW5pemF0aW9uID0gQ29yZS5yZWFkRW52KCdPUEVOQUlfT1JHX0lEJykgPz8gbnVsbCxcbiAgICBwcm9qZWN0ID0gQ29yZS5yZWFkRW52KCdPUEVOQUlfUFJPSkVDVF9JRCcpID8/IG51bGwsXG4gICAgLi4ub3B0c1xuICB9OiBDbGllbnRPcHRpb25zID0ge30pIHtcbiAgICBpZiAoYXBpS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgIFwiVGhlIE9QRU5BSV9BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG1pc3Npbmcgb3IgZW1wdHk7IGVpdGhlciBwcm92aWRlIGl0LCBvciBpbnN0YW50aWF0ZSB0aGUgT3BlbkFJIGNsaWVudCB3aXRoIGFuIGFwaUtleSBvcHRpb24sIGxpa2UgbmV3IE9wZW5BSSh7IGFwaUtleTogJ015IEFQSSBLZXknIH0pLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBDbGllbnRPcHRpb25zID0ge1xuICAgICAgYXBpS2V5LFxuICAgICAgb3JnYW5pemF0aW9uLFxuICAgICAgcHJvamVjdCxcbiAgICAgIC4uLm9wdHMsXG4gICAgICBiYXNlVVJMOiBiYXNlVVJMIHx8IGBodHRwczovL2FwaS5vcGVuYWkuY29tL3YxYCxcbiAgICB9O1xuXG4gICAgaWYgKCFvcHRpb25zLmRhbmdlcm91c2x5QWxsb3dCcm93c2VyICYmIENvcmUuaXNSdW5uaW5nSW5Ccm93c2VyKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgIFwiSXQgbG9va3MgbGlrZSB5b3UncmUgcnVubmluZyBpbiBhIGJyb3dzZXItbGlrZSBlbnZpcm9ubWVudC5cXG5cXG5UaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGFzIGl0IHJpc2tzIGV4cG9zaW5nIHlvdXIgc2VjcmV0IEFQSSBjcmVkZW50aWFscyB0byBhdHRhY2tlcnMuXFxuSWYgeW91IHVuZGVyc3RhbmQgdGhlIHJpc2tzIGFuZCBoYXZlIGFwcHJvcHJpYXRlIG1pdGlnYXRpb25zIGluIHBsYWNlLFxcbnlvdSBjYW4gc2V0IHRoZSBgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXJgIG9wdGlvbiB0byBgdHJ1ZWAsIGUuZy4sXFxuXFxubmV3IE9wZW5BSSh7IGFwaUtleSwgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXI6IHRydWUgfSk7XFxuXFxuaHR0cHM6Ly9oZWxwLm9wZW5haS5jb20vZW4vYXJ0aWNsZXMvNTExMjU5NS1iZXN0LXByYWN0aWNlcy1mb3ItYXBpLWtleS1zYWZldHlcXG5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3VwZXIoe1xuICAgICAgYmFzZVVSTDogb3B0aW9ucy5iYXNlVVJMISxcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnMudGltZW91dCA/PyA2MDAwMDAgLyogMTAgbWludXRlcyAqLyxcbiAgICAgIGh0dHBBZ2VudDogb3B0aW9ucy5odHRwQWdlbnQsXG4gICAgICBtYXhSZXRyaWVzOiBvcHRpb25zLm1heFJldHJpZXMsXG4gICAgICBmZXRjaDogb3B0aW9ucy5mZXRjaCxcbiAgICB9KTtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcblxuICAgIHRoaXMuYXBpS2V5ID0gYXBpS2V5O1xuICAgIHRoaXMub3JnYW5pemF0aW9uID0gb3JnYW5pemF0aW9uO1xuICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gIH1cblxuICBjb21wbGV0aW9uczogQVBJLkNvbXBsZXRpb25zID0gbmV3IEFQSS5Db21wbGV0aW9ucyh0aGlzKTtcbiAgY2hhdDogQVBJLkNoYXQgPSBuZXcgQVBJLkNoYXQodGhpcyk7XG4gIGVtYmVkZGluZ3M6IEFQSS5FbWJlZGRpbmdzID0gbmV3IEFQSS5FbWJlZGRpbmdzKHRoaXMpO1xuICBmaWxlczogQVBJLkZpbGVzID0gbmV3IEFQSS5GaWxlcyh0aGlzKTtcbiAgaW1hZ2VzOiBBUEkuSW1hZ2VzID0gbmV3IEFQSS5JbWFnZXModGhpcyk7XG4gIGF1ZGlvOiBBUEkuQXVkaW8gPSBuZXcgQVBJLkF1ZGlvKHRoaXMpO1xuICBtb2RlcmF0aW9uczogQVBJLk1vZGVyYXRpb25zID0gbmV3IEFQSS5Nb2RlcmF0aW9ucyh0aGlzKTtcbiAgbW9kZWxzOiBBUEkuTW9kZWxzID0gbmV3IEFQSS5Nb2RlbHModGhpcyk7XG4gIGZpbmVUdW5pbmc6IEFQSS5GaW5lVHVuaW5nID0gbmV3IEFQSS5GaW5lVHVuaW5nKHRoaXMpO1xuICBiZXRhOiBBUEkuQmV0YSA9IG5ldyBBUEkuQmV0YSh0aGlzKTtcbiAgYmF0Y2hlczogQVBJLkJhdGNoZXMgPSBuZXcgQVBJLkJhdGNoZXModGhpcyk7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGRlZmF1bHRRdWVyeSgpOiBDb3JlLkRlZmF1bHRRdWVyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuZGVmYXVsdFF1ZXJ5O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGRlZmF1bHRIZWFkZXJzKG9wdHM6IENvcmUuRmluYWxSZXF1ZXN0T3B0aW9ucyk6IENvcmUuSGVhZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmRlZmF1bHRIZWFkZXJzKG9wdHMpLFxuICAgICAgJ09wZW5BSS1Pcmdhbml6YXRpb24nOiB0aGlzLm9yZ2FuaXphdGlvbixcbiAgICAgICdPcGVuQUktUHJvamVjdCc6IHRoaXMucHJvamVjdCxcbiAgICAgIC4uLnRoaXMuX29wdGlvbnMuZGVmYXVsdEhlYWRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhdXRoSGVhZGVycyhvcHRzOiBDb3JlLkZpbmFsUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkhlYWRlcnMge1xuICAgIHJldHVybiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmFwaUtleX1gIH07XG4gIH1cblxuICBzdGF0aWMgT3BlbkFJID0gdGhpcztcblxuICBzdGF0aWMgT3BlbkFJRXJyb3IgPSBFcnJvcnMuT3BlbkFJRXJyb3I7XG4gIHN0YXRpYyBBUElFcnJvciA9IEVycm9ycy5BUElFcnJvcjtcbiAgc3RhdGljIEFQSUNvbm5lY3Rpb25FcnJvciA9IEVycm9ycy5BUElDb25uZWN0aW9uRXJyb3I7XG4gIHN0YXRpYyBBUElDb25uZWN0aW9uVGltZW91dEVycm9yID0gRXJyb3JzLkFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3I7XG4gIHN0YXRpYyBBUElVc2VyQWJvcnRFcnJvciA9IEVycm9ycy5BUElVc2VyQWJvcnRFcnJvcjtcbiAgc3RhdGljIE5vdEZvdW5kRXJyb3IgPSBFcnJvcnMuTm90Rm91bmRFcnJvcjtcbiAgc3RhdGljIENvbmZsaWN0RXJyb3IgPSBFcnJvcnMuQ29uZmxpY3RFcnJvcjtcbiAgc3RhdGljIFJhdGVMaW1pdEVycm9yID0gRXJyb3JzLlJhdGVMaW1pdEVycm9yO1xuICBzdGF0aWMgQmFkUmVxdWVzdEVycm9yID0gRXJyb3JzLkJhZFJlcXVlc3RFcnJvcjtcbiAgc3RhdGljIEF1dGhlbnRpY2F0aW9uRXJyb3IgPSBFcnJvcnMuQXV0aGVudGljYXRpb25FcnJvcjtcbiAgc3RhdGljIEludGVybmFsU2VydmVyRXJyb3IgPSBFcnJvcnMuSW50ZXJuYWxTZXJ2ZXJFcnJvcjtcbiAgc3RhdGljIFBlcm1pc3Npb25EZW5pZWRFcnJvciA9IEVycm9ycy5QZXJtaXNzaW9uRGVuaWVkRXJyb3I7XG4gIHN0YXRpYyBVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IgPSBFcnJvcnMuVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yO1xuXG4gIHN0YXRpYyB0b0ZpbGUgPSBVcGxvYWRzLnRvRmlsZTtcbiAgc3RhdGljIGZpbGVGcm9tUGF0aCA9IFVwbG9hZHMuZmlsZUZyb21QYXRoO1xufVxuXG5leHBvcnQgY29uc3Qge1xuICBPcGVuQUlFcnJvcixcbiAgQVBJRXJyb3IsXG4gIEFQSUNvbm5lY3Rpb25FcnJvcixcbiAgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcixcbiAgQVBJVXNlckFib3J0RXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIFJhdGVMaW1pdEVycm9yLFxuICBCYWRSZXF1ZXN0RXJyb3IsXG4gIEF1dGhlbnRpY2F0aW9uRXJyb3IsXG4gIEludGVybmFsU2VydmVyRXJyb3IsXG4gIFBlcm1pc3Npb25EZW5pZWRFcnJvcixcbiAgVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yLFxufSA9IEVycm9ycztcblxuZXhwb3J0IGltcG9ydCB0b0ZpbGUgPSBVcGxvYWRzLnRvRmlsZTtcbmV4cG9ydCBpbXBvcnQgZmlsZUZyb21QYXRoID0gVXBsb2Fkcy5maWxlRnJvbVBhdGg7XG5cbmV4cG9ydCBuYW1lc3BhY2UgT3BlbkFJIHtcbiAgZXhwb3J0IGltcG9ydCBSZXF1ZXN0T3B0aW9ucyA9IENvcmUuUmVxdWVzdE9wdGlvbnM7XG5cbiAgZXhwb3J0IGltcG9ydCBQYWdlID0gUGFnaW5hdGlvbi5QYWdlO1xuICBleHBvcnQgaW1wb3J0IFBhZ2VSZXNwb25zZSA9IFBhZ2luYXRpb24uUGFnZVJlc3BvbnNlO1xuXG4gIGV4cG9ydCBpbXBvcnQgQ3Vyc29yUGFnZSA9IFBhZ2luYXRpb24uQ3Vyc29yUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBDdXJzb3JQYWdlUGFyYW1zID0gUGFnaW5hdGlvbi5DdXJzb3JQYWdlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEN1cnNvclBhZ2VSZXNwb25zZSA9IFBhZ2luYXRpb24uQ3Vyc29yUGFnZVJlc3BvbnNlO1xuXG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbnMgPSBBUEkuQ29tcGxldGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbiA9IEFQSS5Db21wbGV0aW9uO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DaG9pY2UgPSBBUEkuQ29tcGxldGlvbkNob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uVXNhZ2UgPSBBUEkuQ29tcGxldGlvblVzYWdlO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IEFQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuXG4gIGV4cG9ydCBpbXBvcnQgQ2hhdCA9IEFQSS5DaGF0O1xuICBleHBvcnQgaW1wb3J0IENoYXRNb2RlbCA9IEFQSS5DaGF0TW9kZWw7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb24gPSBBUEkuQ2hhdENvbXBsZXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW0gPSBBUEkuQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DaHVuayA9IEFQSS5DaGF0Q29tcGxldGlvbkNodW5rO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnQgPSBBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2UgPSBBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRUZXh0ID0gQVBJLkNoYXRDb21wbGV0aW9uQ29udGVudFBhcnRUZXh0O1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uRnVuY3Rpb25DYWxsT3B0aW9uID0gQVBJLkNoYXRDb21wbGV0aW9uRnVuY3Rpb25DYWxsT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW0gPSBBUEkuQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2UgPSBBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtID0gQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsID0gQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlID0gQVBJLkNoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uUm9sZSA9IEFQSS5DaGF0Q29tcGxldGlvblJvbGU7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zID0gQVBJLkNoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblN5c3RlbU1lc3NhZ2VQYXJhbSA9IEFQSS5DaGF0Q29tcGxldGlvblN5c3RlbU1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYiA9IEFQSS5DaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2wgPSBBUEkuQ2hhdENvbXBsZXRpb25Ub29sO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbiA9IEFQSS5DaGF0Q29tcGxldGlvblRvb2xDaG9pY2VPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtID0gQVBJLkNoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW0gPSBBUEkuQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuXG4gIGV4cG9ydCBpbXBvcnQgRW1iZWRkaW5ncyA9IEFQSS5FbWJlZGRpbmdzO1xuICBleHBvcnQgaW1wb3J0IENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlID0gQVBJLkNyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlO1xuICBleHBvcnQgaW1wb3J0IEVtYmVkZGluZyA9IEFQSS5FbWJlZGRpbmc7XG4gIGV4cG9ydCBpbXBvcnQgRW1iZWRkaW5nQ3JlYXRlUGFyYW1zID0gQVBJLkVtYmVkZGluZ0NyZWF0ZVBhcmFtcztcblxuICBleHBvcnQgaW1wb3J0IEZpbGVzID0gQVBJLkZpbGVzO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDb250ZW50ID0gQVBJLkZpbGVDb250ZW50O1xuICBleHBvcnQgaW1wb3J0IEZpbGVEZWxldGVkID0gQVBJLkZpbGVEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IEZpbGVPYmplY3QgPSBBUEkuRmlsZU9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlT2JqZWN0c1BhZ2UgPSBBUEkuRmlsZU9iamVjdHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEZpbGVDcmVhdGVQYXJhbXMgPSBBUEkuRmlsZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlTGlzdFBhcmFtcyA9IEFQSS5GaWxlTGlzdFBhcmFtcztcblxuICBleHBvcnQgaW1wb3J0IEltYWdlcyA9IEFQSS5JbWFnZXM7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2UgPSBBUEkuSW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VzUmVzcG9uc2UgPSBBUEkuSW1hZ2VzUmVzcG9uc2U7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VDcmVhdGVWYXJpYXRpb25QYXJhbXMgPSBBUEkuSW1hZ2VDcmVhdGVWYXJpYXRpb25QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VFZGl0UGFyYW1zID0gQVBJLkltYWdlRWRpdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUdlbmVyYXRlUGFyYW1zID0gQVBJLkltYWdlR2VuZXJhdGVQYXJhbXM7XG5cbiAgZXhwb3J0IGltcG9ydCBBdWRpbyA9IEFQSS5BdWRpbztcblxuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb25zID0gQVBJLk1vZGVyYXRpb25zO1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb24gPSBBUEkuTW9kZXJhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBNb2RlcmF0aW9uQ3JlYXRlUmVzcG9uc2UgPSBBUEkuTW9kZXJhdGlvbkNyZWF0ZVJlc3BvbnNlO1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb25DcmVhdGVQYXJhbXMgPSBBUEkuTW9kZXJhdGlvbkNyZWF0ZVBhcmFtcztcblxuICBleHBvcnQgaW1wb3J0IE1vZGVscyA9IEFQSS5Nb2RlbHM7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWwgPSBBUEkuTW9kZWw7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWxEZWxldGVkID0gQVBJLk1vZGVsRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbHNQYWdlID0gQVBJLk1vZGVsc1BhZ2U7XG5cbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nID0gQVBJLkZpbmVUdW5pbmc7XG5cbiAgZXhwb3J0IGltcG9ydCBCZXRhID0gQVBJLkJldGE7XG5cbiAgZXhwb3J0IGltcG9ydCBCYXRjaGVzID0gQVBJLkJhdGNoZXM7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2ggPSBBUEkuQmF0Y2g7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hFcnJvciA9IEFQSS5CYXRjaEVycm9yO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoUmVxdWVzdENvdW50cyA9IEFQSS5CYXRjaFJlcXVlc3RDb3VudHM7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hlc1BhZ2UgPSBBUEkuQmF0Y2hlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hDcmVhdGVQYXJhbXMgPSBBUEkuQmF0Y2hDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hMaXN0UGFyYW1zID0gQVBJLkJhdGNoTGlzdFBhcmFtcztcblxuICBleHBvcnQgaW1wb3J0IEVycm9yT2JqZWN0ID0gQVBJLkVycm9yT2JqZWN0O1xuICBleHBvcnQgaW1wb3J0IEZ1bmN0aW9uRGVmaW5pdGlvbiA9IEFQSS5GdW5jdGlvbkRlZmluaXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25QYXJhbWV0ZXJzID0gQVBJLkZ1bmN0aW9uUGFyYW1ldGVycztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBenVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBBUEkgQ2xpZW50IGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZSBBenVyZSBPcGVuQUkgQVBJLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBenVyZUNsaWVudE9wdGlvbnMgZXh0ZW5kcyBDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmF1bHRzIHRvIHByb2Nlc3MuZW52WydPUEVOQUlfQVBJX1ZFUlNJT04nXS5cbiAgICovXG4gIGFwaVZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFlvdXIgQXp1cmUgZW5kcG9pbnQsIGluY2x1ZGluZyB0aGUgcmVzb3VyY2UsIGUuZy4gYGh0dHBzOi8vZXhhbXBsZS1yZXNvdXJjZS5henVyZS5vcGVuYWkuY29tL2BcbiAgICovXG4gIGVuZHBvaW50Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIG1vZGVsIGRlcGxveW1lbnQsIGlmIGdpdmVuLCBzZXRzIHRoZSBiYXNlIGNsaWVudCBVUkwgdG8gaW5jbHVkZSBgL2RlcGxveW1lbnRzL3tkZXBsb3ltZW50fWAuXG4gICAqIE5vdGU6IHRoaXMgbWVhbnMgeW91IHdvbid0IGJlIGFibGUgdG8gdXNlIG5vbi1kZXBsb3ltZW50IGVuZHBvaW50cy4gTm90IHN1cHBvcnRlZCB3aXRoIEFzc2lzdGFudHMgQVBJcy5cbiAgICovXG4gIGRlcGxveW1lbnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIERlZmF1bHRzIHRvIHByb2Nlc3MuZW52WydBWlVSRV9PUEVOQUlfQVBJX0tFWSddLlxuICAgKi9cbiAgYXBpS2V5Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBhY2Nlc3MgdG9rZW4gZm9yIE1pY3Jvc29mdCBFbnRyYSAoZm9ybWVybHkga25vd24gYXMgQXp1cmUgQWN0aXZlIERpcmVjdG9yeSksXG4gICAqIHdoaWNoIHdpbGwgYmUgaW52b2tlZCBvbiBldmVyeSByZXF1ZXN0LlxuICAgKi9cbiAgYXp1cmVBRFRva2VuUHJvdmlkZXI/OiAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIEFQSSBDbGllbnQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIEF6dXJlIE9wZW5BSSBBUEkuICovXG5leHBvcnQgY2xhc3MgQXp1cmVPcGVuQUkgZXh0ZW5kcyBPcGVuQUkge1xuICBwcml2YXRlIF9henVyZUFEVG9rZW5Qcm92aWRlcjogKCgpID0+IFByb21pc2U8c3RyaW5nPikgfCB1bmRlZmluZWQ7XG4gIGFwaVZlcnNpb246IHN0cmluZyA9ICcnO1xuICAvKipcbiAgICogQVBJIENsaWVudCBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgQXp1cmUgT3BlbkFJIEFQSS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IFtvcHRzLmFwaVZlcnNpb249cHJvY2Vzcy5lbnZbJ09QRU5BSV9BUElfVkVSU0lPTiddID8/IHVuZGVmaW5lZF1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IFtvcHRzLmVuZHBvaW50PXByb2Nlc3MuZW52WydBWlVSRV9PUEVOQUlfRU5EUE9JTlQnXSA/PyB1bmRlZmluZWRdIC0gWW91ciBBenVyZSBlbmRwb2ludCwgaW5jbHVkaW5nIHRoZSByZXNvdXJjZSwgZS5nLiBgaHR0cHM6Ly9leGFtcGxlLXJlc291cmNlLmF6dXJlLm9wZW5haS5jb20vYFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW29wdHMuYXBpS2V5PXByb2Nlc3MuZW52WydBWlVSRV9PUEVOQUlfQVBJX0tFWSddID8/IHVuZGVmaW5lZF1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IG9wdHMuZGVwbG95bWVudCAtIEEgbW9kZWwgZGVwbG95bWVudCwgaWYgZ2l2ZW4sIHNldHMgdGhlIGJhc2UgY2xpZW50IFVSTCB0byBpbmNsdWRlIGAvZGVwbG95bWVudHMve2RlcGxveW1lbnR9YC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0cy5vcmdhbml6YXRpb249cHJvY2Vzcy5lbnZbJ09QRU5BSV9PUkdfSUQnXSA/PyBudWxsXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuYmFzZVVSTD1wcm9jZXNzLmVudlsnT1BFTkFJX0JBU0VfVVJMJ11dIC0gU2V0cyB0aGUgYmFzZSBVUkwgZm9yIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lb3V0PTEwIG1pbnV0ZXNdIC0gVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlIGNsaWVudCB3aWxsIHdhaXQgZm9yIGEgcmVzcG9uc2UgYmVmb3JlIHRpbWluZyBvdXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5odHRwQWdlbnRdIC0gQW4gSFRUUCBhZ2VudCB1c2VkIHRvIG1hbmFnZSBIVFRQKHMpIGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0ge0NvcmUuRmV0Y2h9IFtvcHRzLmZldGNoXSAtIFNwZWNpZnkgYSBjdXN0b20gYGZldGNoYCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLm1heFJldHJpZXM9Ml0gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNsaWVudCB3aWxsIHJldHJ5IGEgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtDb3JlLkhlYWRlcnN9IG9wdHMuZGVmYXVsdEhlYWRlcnMgLSBEZWZhdWx0IGhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtDb3JlLkRlZmF1bHRRdWVyeX0gb3B0cy5kZWZhdWx0UXVlcnkgLSBEZWZhdWx0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5kYW5nZXJvdXNseUFsbG93QnJvd3Nlcj1mYWxzZV0gLSBCeSBkZWZhdWx0LCBjbGllbnQtc2lkZSB1c2Ugb2YgdGhpcyBsaWJyYXJ5IGlzIG5vdCBhbGxvd2VkLCBhcyBpdCByaXNrcyBleHBvc2luZyB5b3VyIHNlY3JldCBBUEkgY3JlZGVudGlhbHMgdG8gYXR0YWNrZXJzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe1xuICAgIGJhc2VVUkwgPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9CQVNFX1VSTCcpLFxuICAgIGFwaUtleSA9IENvcmUucmVhZEVudignQVpVUkVfT1BFTkFJX0FQSV9LRVknKSxcbiAgICBhcGlWZXJzaW9uID0gQ29yZS5yZWFkRW52KCdPUEVOQUlfQVBJX1ZFUlNJT04nKSxcbiAgICBlbmRwb2ludCxcbiAgICBkZXBsb3ltZW50LFxuICAgIGF6dXJlQURUb2tlblByb3ZpZGVyLFxuICAgIGRhbmdlcm91c2x5QWxsb3dCcm93c2VyLFxuICAgIC4uLm9wdHNcbiAgfTogQXp1cmVDbGllbnRPcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWFwaVZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgIFwiVGhlIE9QRU5BSV9BUElfVkVSU0lPTiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBtaXNzaW5nIG9yIGVtcHR5OyBlaXRoZXIgcHJvdmlkZSBpdCwgb3IgaW5zdGFudGlhdGUgdGhlIEF6dXJlT3BlbkFJIGNsaWVudCB3aXRoIGFuIGFwaVZlcnNpb24gb3B0aW9uLCBsaWtlIG5ldyBBenVyZU9wZW5BSSh7IGFwaVZlcnNpb246ICdNeSBBUEkgVmVyc2lvbicgfSkuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXp1cmVBRFRva2VuUHJvdmlkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRhbmdlcm91c2x5QWxsb3dCcm93c2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWF6dXJlQURUb2tlblByb3ZpZGVyICYmICFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgICdNaXNzaW5nIGNyZWRlbnRpYWxzLiBQbGVhc2UgcGFzcyBvbmUgb2YgYGFwaUtleWAgYW5kIGBhenVyZUFEVG9rZW5Qcm92aWRlcmAsIG9yIHNldCB0aGUgYEFaVVJFX09QRU5BSV9BUElfS0VZYCBlbnZpcm9ubWVudCB2YXJpYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXp1cmVBRFRva2VuUHJvdmlkZXIgJiYgYXBpS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKFxuICAgICAgICAnVGhlIGBhcGlLZXlgIGFuZCBgYXp1cmVBRFRva2VuUHJvdmlkZXJgIGFyZ3VtZW50cyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlOyBvbmx5IG9uZSBjYW4gYmUgcGFzc2VkIGF0IGEgdGltZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBkZWZpbmUgYSBzZW50aW5lbCB2YWx1ZSB0byBhdm9pZCBhbnkgdHlwaW5nIGlzc3Vlc1xuICAgIGFwaUtleSA/Pz0gQVBJX0tFWV9TRU5USU5FTDtcblxuICAgIG9wdHMuZGVmYXVsdFF1ZXJ5ID0geyAuLi5vcHRzLmRlZmF1bHRRdWVyeSwgJ2FwaS12ZXJzaW9uJzogYXBpVmVyc2lvbiB9O1xuXG4gICAgaWYgKCFiYXNlVVJMKSB7XG4gICAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICAgIGVuZHBvaW50ID0gcHJvY2Vzcy5lbnZbJ0FaVVJFX09QRU5BSV9FTkRQT0lOVCddO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgICAgJ011c3QgcHJvdmlkZSBvbmUgb2YgdGhlIGBiYXNlVVJMYCBvciBgZW5kcG9pbnRgIGFyZ3VtZW50cywgb3IgdGhlIGBBWlVSRV9PUEVOQUlfRU5EUE9JTlRgIGVudmlyb25tZW50IHZhcmlhYmxlJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlcGxveW1lbnQpIHtcbiAgICAgICAgYmFzZVVSTCA9IGAke2VuZHBvaW50fS9vcGVuYWkvZGVwbG95bWVudHMvJHtkZXBsb3ltZW50fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlVVJMID0gYCR7ZW5kcG9pbnR9L29wZW5haWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbmRwb2ludCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKCdiYXNlVVJMIGFuZCBlbmRwb2ludCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIoe1xuICAgICAgYXBpS2V5LFxuICAgICAgYmFzZVVSTCxcbiAgICAgIC4uLm9wdHMsXG4gICAgICAuLi4oZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXIgIT09IHVuZGVmaW5lZCA/IHsgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXIgfSA6IHt9KSxcbiAgICB9KTtcblxuICAgIHRoaXMuX2F6dXJlQURUb2tlblByb3ZpZGVyID0gYXp1cmVBRFRva2VuUHJvdmlkZXI7XG4gICAgdGhpcy5hcGlWZXJzaW9uID0gYXBpVmVyc2lvbjtcbiAgfVxuXG4gIG92ZXJyaWRlIGJ1aWxkUmVxdWVzdChvcHRpb25zOiBDb3JlLkZpbmFsUmVxdWVzdE9wdGlvbnM8dW5rbm93bj4pOiB7XG4gICAgcmVxOiBSZXF1ZXN0SW5pdDtcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aW1lb3V0OiBudW1iZXI7XG4gIH0ge1xuICAgIGlmIChfZGVwbG95bWVudHNfZW5kcG9pbnRzLmhhcyhvcHRpb25zLnBhdGgpICYmIG9wdGlvbnMubWV0aG9kID09PSAncG9zdCcgJiYgb3B0aW9ucy5ib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQ29yZS5pc09iaihvcHRpb25zLmJvZHkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVxdWVzdCBib2R5IHRvIGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgbW9kZWwgPSBvcHRpb25zLmJvZHlbJ21vZGVsJ107XG4gICAgICBkZWxldGUgb3B0aW9ucy5ib2R5Wydtb2RlbCddO1xuICAgICAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuYmFzZVVSTC5pbmNsdWRlcygnL2RlcGxveW1lbnRzJykpIHtcbiAgICAgICAgb3B0aW9ucy5wYXRoID0gYC9kZXBsb3ltZW50cy8ke21vZGVsfSR7b3B0aW9ucy5wYXRofWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5idWlsZFJlcXVlc3Qob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9nZXRBenVyZUFEVG9rZW4oKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2F6dXJlQURUb2tlblByb3ZpZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuX2F6dXJlQURUb2tlblByb3ZpZGVyKCk7XG4gICAgICBpZiAoIXRva2VuIHx8IHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgJ2F6dXJlQURUb2tlblByb3ZpZGVyJyBhcmd1bWVudCB0byByZXR1cm4gYSBzdHJpbmcgYnV0IGl0IHJldHVybmVkICR7dG9rZW59YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhdXRoSGVhZGVycyhvcHRzOiBDb3JlLkZpbmFsUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkhlYWRlcnMge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwcmVwYXJlT3B0aW9ucyhvcHRzOiBDb3JlLkZpbmFsUmVxdWVzdE9wdGlvbnM8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0cy5oZWFkZXJzPy5bJ0F1dGhvcml6YXRpb24nXSB8fCBvcHRzLmhlYWRlcnM/LlsnYXBpLWtleSddKSB7XG4gICAgICByZXR1cm4gc3VwZXIucHJlcGFyZU9wdGlvbnMob3B0cyk7XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5fZ2V0QXp1cmVBRFRva2VuKCk7XG4gICAgb3B0cy5oZWFkZXJzID8/PSB7fTtcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIG9wdHMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFwaUtleSAhPT0gQVBJX0tFWV9TRU5USU5FTCkge1xuICAgICAgb3B0cy5oZWFkZXJzWydhcGkta2V5J10gPSB0aGlzLmFwaUtleTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcignVW5hYmxlIHRvIGhhbmRsZSBhdXRoJyk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5wcmVwYXJlT3B0aW9ucyhvcHRzKTtcbiAgfVxufVxuXG5jb25zdCBfZGVwbG95bWVudHNfZW5kcG9pbnRzID0gbmV3IFNldChbXG4gICcvY29tcGxldGlvbnMnLFxuICAnL2NoYXQvY29tcGxldGlvbnMnLFxuICAnL2VtYmVkZGluZ3MnLFxuICAnL2F1ZGlvL3RyYW5zY3JpcHRpb25zJyxcbiAgJy9hdWRpby90cmFuc2xhdGlvbnMnLFxuICAnL2F1ZGlvL3NwZWVjaCcsXG4gICcvaW1hZ2VzL2dlbmVyYXRpb25zJyxcbl0pO1xuXG5jb25zdCBBUElfS0VZX1NFTlRJTkVMID0gJzxNaXNzaW5nIEtleT4nO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBBenVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBkZWZhdWx0IE9wZW5BSTtcbiIsICJleHBvcnQgY29uc3QgVkVSU0lPTiA9ICcwLjMuMyc7IC8vIHgtcmVsZWFzZS1wbGVhc2UtdmVyc2lvblxuIiwgIi8qKlxuICogRGlzY2xhaW1lcjogbW9kdWxlcyBpbiBfc2hpbXMgYXJlbid0IGludGVuZGVkIHRvIGJlIGltcG9ydGVkIGJ5IFNESyB1c2Vycy5cbiAqL1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNoaW1zIHtcbiAga2luZDogc3RyaW5nO1xuICBmZXRjaDogYW55O1xuICBSZXF1ZXN0OiBhbnk7XG4gIFJlc3BvbnNlOiBhbnk7XG4gIEhlYWRlcnM6IGFueTtcbiAgRm9ybURhdGE6IGFueTtcbiAgQmxvYjogYW55O1xuICBGaWxlOiBhbnk7XG4gIFJlYWRhYmxlU3RyZWFtOiBhbnk7XG4gIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zOiA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICBmb3JtOiBTaGltc1snRm9ybURhdGEnXSxcbiAgICBvcHRzOiBSZXF1ZXN0T3B0aW9uczxUPixcbiAgKSA9PiBQcm9taXNlPFJlcXVlc3RPcHRpb25zPFQ+PjtcbiAgZ2V0RGVmYXVsdEFnZW50OiAodXJsOiBzdHJpbmcpID0+IGFueTtcbiAgZmlsZUZyb21QYXRoOlxuICAgIHwgKChwYXRoOiBzdHJpbmcsIGZpbGVuYW1lPzogc3RyaW5nLCBvcHRpb25zPzoge30pID0+IFByb21pc2U8U2hpbXNbJ0ZpbGUnXT4pXG4gICAgfCAoKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHt9KSA9PiBQcm9taXNlPFNoaW1zWydGaWxlJ10+KTtcbiAgaXNGc1JlYWRTdHJlYW06ICh2YWx1ZTogYW55KSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgbGV0IGF1dG8gPSBmYWxzZTtcbmV4cG9ydCBsZXQga2luZDogU2hpbXNbJ2tpbmQnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgZmV0Y2g6IFNoaW1zWydmZXRjaCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBSZXF1ZXN0OiBTaGltc1snUmVxdWVzdCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBSZXNwb25zZTogU2hpbXNbJ1Jlc3BvbnNlJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IEhlYWRlcnM6IFNoaW1zWydIZWFkZXJzJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IEZvcm1EYXRhOiBTaGltc1snRm9ybURhdGEnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgQmxvYjogU2hpbXNbJ0Jsb2InXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgRmlsZTogU2hpbXNbJ0ZpbGUnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgUmVhZGFibGVTdHJlYW06IFNoaW1zWydSZWFkYWJsZVN0cmVhbSddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9uczogU2hpbXNbJ2dldE11bHRpcGFydFJlcXVlc3RPcHRpb25zJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IGdldERlZmF1bHRBZ2VudDogU2hpbXNbJ2dldERlZmF1bHRBZ2VudCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBmaWxlRnJvbVBhdGg6IFNoaW1zWydmaWxlRnJvbVBhdGgnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgaXNGc1JlYWRTdHJlYW06IFNoaW1zWydpc0ZzUmVhZFN0cmVhbSddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0U2hpbXMoc2hpbXM6IFNoaW1zLCBvcHRpb25zOiB7IGF1dG86IGJvb2xlYW4gfSA9IHsgYXV0bzogZmFsc2UgfSkge1xuICBpZiAoYXV0bykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB5b3UgbXVzdCBcXGBpbXBvcnQgJ2dyb3Etc2RrL3NoaW1zLyR7c2hpbXMua2luZH0nXFxgIGJlZm9yZSBpbXBvcnRpbmcgYW55dGhpbmcgZWxzZSBmcm9tIGdyb3Etc2RrYCxcbiAgICApO1xuICB9XG4gIGlmIChraW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGNhbid0IFxcYGltcG9ydCAnZ3JvcS1zZGsvc2hpbXMvJHtzaGltcy5raW5kfSdcXGAgYWZ0ZXIgXFxgaW1wb3J0ICdncm9xLXNkay9zaGltcy8ke2tpbmR9J1xcYGAsXG4gICAgKTtcbiAgfVxuICBhdXRvID0gb3B0aW9ucy5hdXRvO1xuICBraW5kID0gc2hpbXMua2luZDtcbiAgZmV0Y2ggPSBzaGltcy5mZXRjaDtcbiAgUmVxdWVzdCA9IHNoaW1zLlJlcXVlc3Q7XG4gIFJlc3BvbnNlID0gc2hpbXMuUmVzcG9uc2U7XG4gIEhlYWRlcnMgPSBzaGltcy5IZWFkZXJzO1xuICBGb3JtRGF0YSA9IHNoaW1zLkZvcm1EYXRhO1xuICBCbG9iID0gc2hpbXMuQmxvYjtcbiAgRmlsZSA9IHNoaW1zLkZpbGU7XG4gIFJlYWRhYmxlU3RyZWFtID0gc2hpbXMuUmVhZGFibGVTdHJlYW07XG4gIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zID0gc2hpbXMuZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnM7XG4gIGdldERlZmF1bHRBZ2VudCA9IHNoaW1zLmdldERlZmF1bHRBZ2VudDtcbiAgZmlsZUZyb21QYXRoID0gc2hpbXMuZmlsZUZyb21QYXRoO1xuICBpc0ZzUmVhZFN0cmVhbSA9IHNoaW1zLmlzRnNSZWFkU3RyZWFtO1xufVxuIiwgIi8qKlxuICogRGlzY2xhaW1lcjogbW9kdWxlcyBpbiBfc2hpbXMgYXJlbid0IGludGVuZGVkIHRvIGJlIGltcG9ydGVkIGJ5IFNESyB1c2Vycy5cbiAqL1xuZXhwb3J0IGNsYXNzIE11bHRpcGFydEJvZHkge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYm9keTogYW55KSB7fVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ011bHRpcGFydEJvZHknO1xuICB9XG59XG4iLCAiLyoqXG4gKiBEaXNjbGFpbWVyOiBtb2R1bGVzIGluIF9zaGltcyBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgaW1wb3J0ZWQgYnkgU0RLIHVzZXJzLlxuICovXG5pbXBvcnQgeyBNdWx0aXBhcnRCb2R5IH0gZnJvbSAnLi9NdWx0aXBhcnRCb2R5JztcbmltcG9ydCB7IHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IHR5cGUgU2hpbXMgfSBmcm9tICcuL3JlZ2lzdHJ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bnRpbWUoeyBtYW51YWxseUltcG9ydGVkIH06IHsgbWFudWFsbHlJbXBvcnRlZD86IGJvb2xlYW4gfSA9IHt9KTogU2hpbXMge1xuICBjb25zdCByZWNvbW1lbmRhdGlvbiA9XG4gICAgbWFudWFsbHlJbXBvcnRlZCA/XG4gICAgICBgWW91IG1heSBuZWVkIHRvIHVzZSBwb2x5ZmlsbHNgXG4gICAgOiBgQWRkIG9uZSBvZiB0aGVzZSBpbXBvcnRzIGJlZm9yZSB5b3VyIGZpcnN0IFxcYGltcG9ydCBcdTIwMjYgZnJvbSAnZ3JvcS1zZGsnXFxgOlxuLSBcXGBpbXBvcnQgJ2dyb3Etc2RrL3NoaW1zL25vZGUnXFxgIChpZiB5b3UncmUgcnVubmluZyBvbiBOb2RlKVxuLSBcXGBpbXBvcnQgJ2dyb3Etc2RrL3NoaW1zL3dlYidcXGAgKG90aGVyd2lzZSlcbmA7XG5cbiAgbGV0IF9mZXRjaCwgX1JlcXVlc3QsIF9SZXNwb25zZSwgX0hlYWRlcnM7XG4gIHRyeSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF9mZXRjaCA9IGZldGNoO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBfUmVxdWVzdCA9IFJlcXVlc3Q7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF9SZXNwb25zZSA9IFJlc3BvbnNlO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBfSGVhZGVycyA9IEhlYWRlcnM7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHRoaXMgZW52aXJvbm1lbnQgaXMgbWlzc2luZyB0aGUgZm9sbG93aW5nIFdlYiBGZXRjaCBBUEkgdHlwZTogJHtcbiAgICAgICAgKGVycm9yIGFzIGFueSkubWVzc2FnZVxuICAgICAgfS4gJHtyZWNvbW1lbmRhdGlvbn1gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGtpbmQ6ICd3ZWInLFxuICAgIGZldGNoOiBfZmV0Y2gsXG4gICAgUmVxdWVzdDogX1JlcXVlc3QsXG4gICAgUmVzcG9uc2U6IF9SZXNwb25zZSxcbiAgICBIZWFkZXJzOiBfSGVhZGVycyxcbiAgICBGb3JtRGF0YTpcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgPyBGb3JtRGF0YSA6IChcbiAgICAgICAgY2xhc3MgRm9ybURhdGEge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGZpbGUgdXBsb2FkcyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgeWV0IGFzICdGb3JtRGF0YScgaXMgdW5kZWZpbmVkLiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICBCbG9iOlxuICAgICAgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnID8gQmxvYiA6IChcbiAgICAgICAgY2xhc3MgQmxvYiB7XG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBmaWxlIHVwbG9hZHMgYXJlbid0IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IHlldCBhcyAnQmxvYicgaXMgdW5kZWZpbmVkLiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICBGaWxlOlxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdHlwZW9mIEZpbGUgIT09ICd1bmRlZmluZWQnID8gRmlsZSA6IChcbiAgICAgICAgY2xhc3MgRmlsZSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZmlsZSB1cGxvYWRzIGFyZW4ndCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCB5ZXQgYXMgJ0ZpbGUnIGlzIHVuZGVmaW5lZC4gJHtyZWNvbW1lbmRhdGlvbn1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgUmVhZGFibGVTdHJlYW06XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09ICd1bmRlZmluZWQnID8gUmVhZGFibGVTdHJlYW0gOiAoXG4gICAgICAgIGNsYXNzIFJlYWRhYmxlU3RyZWFtIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBzdHJlYW1pbmcgaXNuJ3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgeWV0IGFzICdSZWFkYWJsZVN0cmVhbScgaXMgdW5kZWZpbmVkLiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9uczogYXN5bmMgPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JtOiBGb3JtRGF0YSxcbiAgICAgIG9wdHM6IFJlcXVlc3RPcHRpb25zPFQ+LFxuICAgICk6IFByb21pc2U8UmVxdWVzdE9wdGlvbnM8VD4+ID0+ICh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgYm9keTogbmV3IE11bHRpcGFydEJvZHkoZm9ybSkgYXMgYW55LFxuICAgIH0pLFxuICAgIGdldERlZmF1bHRBZ2VudDogKHVybDogc3RyaW5nKSA9PiB1bmRlZmluZWQsXG4gICAgZmlsZUZyb21QYXRoOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgYGZpbGVGcm9tUGF0aGAgZnVuY3Rpb24gaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS4gU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlsczogaHR0cHM6Ly93d3cuZ2l0aHViLmNvbS9ncm9xL2dyb3EtdHlwZXNjcmlwdCNmaWxlLXVwbG9hZHMnLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGlzRnNSZWFkU3RyZWFtOiAodmFsdWU6IGFueSkgPT4gZmFsc2UsXG4gIH07XG59XG4iLCAiLyoqXG4gKiBEaXNjbGFpbWVyOiBtb2R1bGVzIGluIF9zaGltcyBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgaW1wb3J0ZWQgYnkgU0RLIHVzZXJzLlxuICovXG5pbXBvcnQgKiBhcyBzaGltcyBmcm9tICcuL3JlZ2lzdHJ5Lm1qcyc7XG5pbXBvcnQgKiBhcyBhdXRvIGZyb20gJ2dyb3Etc2RrL19zaGltcy9hdXRvL3J1bnRpbWUnO1xuaWYgKCFzaGltcy5raW5kKSBzaGltcy5zZXRTaGltcyhhdXRvLmdldFJ1bnRpbWUoKSwgeyBhdXRvOiB0cnVlIH0pO1xuZXhwb3J0ICogZnJvbSAnLi9yZWdpc3RyeS5tanMnO1xuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuXG5cbmltcG9ydCB7IGNhc3RUb0Vycm9yLCBIZWFkZXJzIH0gZnJvbSAnLi9jb3JlJztcblxuZXhwb3J0IGNsYXNzIEdyb3FFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCBjbGFzcyBBUElFcnJvciBleHRlbmRzIEdyb3FFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBlcnJvcjogT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGVycm9yOiBPYmplY3QgfCB1bmRlZmluZWQsXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGhlYWRlcnM6IEhlYWRlcnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIHN1cGVyKGAke0FQSUVycm9yLm1ha2VNZXNzYWdlKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UpfWApO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgdGhpcy5lcnJvciA9IGVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFrZU1lc3NhZ2Uoc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQsIGVycm9yOiBhbnksIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG1zZyA9XG4gICAgICBlcnJvcj8ubWVzc2FnZSA/XG4gICAgICAgIHR5cGVvZiBlcnJvci5tZXNzYWdlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgZXJyb3IubWVzc2FnZVxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KGVycm9yLm1lc3NhZ2UpXG4gICAgICA6IGVycm9yID8gSlNPTi5zdHJpbmdpZnkoZXJyb3IpXG4gICAgICA6IG1lc3NhZ2U7XG5cbiAgICBpZiAoc3RhdHVzICYmIG1zZykge1xuICAgICAgcmV0dXJuIGAke3N0YXR1c30gJHttc2d9YDtcbiAgICB9XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgcmV0dXJuIGAke3N0YXR1c30gc3RhdHVzIGNvZGUgKG5vIGJvZHkpYDtcbiAgICB9XG4gICAgaWYgKG1zZykge1xuICAgICAgcmV0dXJuIG1zZztcbiAgICB9XG4gICAgcmV0dXJuICcobm8gc3RhdHVzIGNvZGUgb3IgYm9keSknO1xuICB9XG5cbiAgc3RhdGljIGdlbmVyYXRlKFxuICAgIHN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGVycm9yUmVzcG9uc2U6IE9iamVjdCB8IHVuZGVmaW5lZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgIHJldHVybiBuZXcgQVBJQ29ubmVjdGlvbkVycm9yKHsgY2F1c2U6IGNhc3RUb0Vycm9yKGVycm9yUmVzcG9uc2UpIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gZXJyb3JSZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICByZXR1cm4gbmV3IEJhZFJlcXVlc3RFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIHJldHVybiBuZXcgQXV0aGVudGljYXRpb25FcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MDMpIHtcbiAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvbkRlbmllZEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQwNCkge1xuICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQwOSkge1xuICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQyMikge1xuICAgICAgcmV0dXJuIG5ldyBVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICByZXR1cm4gbmV3IFJhdGVMaW1pdEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICByZXR1cm4gbmV3IEludGVybmFsU2VydmVyRXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBUElFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQVBJVXNlckFib3J0RXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgc3VwZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIG1lc3NhZ2UgfHwgJ1JlcXVlc3Qgd2FzIGFib3J0ZWQuJywgdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQVBJQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UsIGNhdXNlIH06IHsgbWVzc2FnZT86IHN0cmluZzsgY2F1c2U/OiBFcnJvciB8IHVuZGVmaW5lZCB9KSB7XG4gICAgc3VwZXIodW5kZWZpbmVkLCB1bmRlZmluZWQsIG1lc3NhZ2UgfHwgJ0Nvbm5lY3Rpb24gZXJyb3IuJywgdW5kZWZpbmVkKTtcbiAgICAvLyBpbiBzb21lIGVudmlyb25tZW50cyB0aGUgJ2NhdXNlJyBwcm9wZXJ0eSBpcyBhbHJlYWR5IGRlY2xhcmVkXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChjYXVzZSkgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBUElDb25uZWN0aW9uVGltZW91dEVycm9yIGV4dGVuZHMgQVBJQ29ubmVjdGlvbkVycm9yIHtcbiAgY29uc3RydWN0b3IoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBzdXBlcih7IG1lc3NhZ2U6IG1lc3NhZ2UgPz8gJ1JlcXVlc3QgdGltZWQgb3V0LicgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJhZFJlcXVlc3RFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MDAgPSA0MDA7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvbkVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQwMSA9IDQwMTtcbn1cblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25EZW5pZWRFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MDMgPSA0MDM7XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RGb3VuZEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQwNCA9IDQwNDtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZsaWN0RXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDA5ID0gNDA5O1xufVxuXG5leHBvcnQgY2xhc3MgVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQyMiA9IDQyMjtcbn1cblxuZXhwb3J0IGNsYXNzIFJhdGVMaW1pdEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQyOSA9IDQyOTtcbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsU2VydmVyRXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7fVxuIiwgImltcG9ydCB7IFJlYWRhYmxlU3RyZWFtLCB0eXBlIFJlc3BvbnNlIH0gZnJvbSBcIi4uL19zaGltcy9pbmRleFwiO1xuaW1wb3J0IHsgR3JvcUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG5cbmltcG9ydCB7IEFQSUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG5cbnR5cGUgQnl0ZXMgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkgfCBCdWZmZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgdHlwZSBTZXJ2ZXJTZW50RXZlbnQgPSB7XG4gIGV2ZW50OiBzdHJpbmcgfCBudWxsO1xuICBkYXRhOiBzdHJpbmc7XG4gIHJhdzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgY2xhc3MgU3RyZWFtPEl0ZW0+IGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxJdGVtPiB7XG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGl0ZXJhdG9yOiAoKSA9PiBBc3luY0l0ZXJhdG9yPEl0ZW0+LFxuICAgIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgKSB7XG4gICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tU1NFUmVzcG9uc2U8SXRlbT4ocmVzcG9uc2U6IFJlc3BvbnNlLCBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBsZXQgY29uc3VtZWQgPSBmYWxzZTtcbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFNTRURlY29kZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBpdGVyTWVzc2FnZXMoKTogQXN5bmNHZW5lcmF0b3I8U2VydmVyU2VudEV2ZW50LCB2b2lkLCB1bmtub3duPiB7XG4gICAgICBpZiAoIXJlc3BvbnNlLmJvZHkpIHtcbiAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB0aHJvdyBuZXcgR3JvcUVycm9yKGBBdHRlbXB0ZWQgdG8gaXRlcmF0ZSBvdmVyIGEgcmVzcG9uc2Ugd2l0aCBubyBib2R5YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmVEZWNvZGVyID0gbmV3IExpbmVEZWNvZGVyKCk7XG5cbiAgICAgIGNvbnN0IGl0ZXIgPSByZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmFibGU8Qnl0ZXM+KHJlc3BvbnNlLmJvZHkpO1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBpdGVyKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lRGVjb2Rlci5kZWNvZGUoY2h1bmspKSB7XG4gICAgICAgICAgY29uc3Qgc3NlID0gZGVjb2Rlci5kZWNvZGUobGluZSk7XG4gICAgICAgICAgaWYgKHNzZSkgeWllbGQgc3NlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lRGVjb2Rlci5mbHVzaCgpKSB7XG4gICAgICAgIGNvbnN0IHNzZSA9IGRlY29kZXIuZGVjb2RlKGxpbmUpO1xuICAgICAgICBpZiAoc3NlKSB5aWVsZCBzc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGl0ZXJhdG9yKCk6IEFzeW5jSXRlcmF0b3I8SXRlbSwgYW55LCB1bmRlZmluZWQ+IHtcbiAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpdGVyYXRlIG92ZXIgYSBjb25zdW1lZCBzdHJlYW0sIHVzZSBgLnRlZSgpYCB0byBzcGxpdCB0aGUgc3RyZWFtLicpO1xuICAgICAgfVxuICAgICAgY29uc3VtZWQgPSB0cnVlO1xuICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3Qgc3NlIG9mIGl0ZXJNZXNzYWdlcygpKSB7XG4gICAgICAgICAgaWYgKGRvbmUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgaWYgKHNzZS5kYXRhLnN0YXJ0c1dpdGgoJ1tET05FXScpKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzc2UuZXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBkYXRhO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShzc2UuZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBwYXJzZSBtZXNzYWdlIGludG8gSlNPTjpgLCBzc2UuZGF0YSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZyb20gY2h1bms6YCwgc3NlLnJhdyk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKHVuZGVmaW5lZCwgZGF0YS5lcnJvciwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB5aWVsZCBkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgY2FsbHMgYHN0cmVhbS5jb250cm9sbGVyLmFib3J0KClgLCB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IHRocm93aW5nLlxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBJZiB0aGUgdXNlciBgYnJlYWtgcywgYWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdC5cbiAgICAgICAgaWYgKCFkb25lKSBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTdHJlYW0oaXRlcmF0b3IsIGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFN0cmVhbSBmcm9tIGEgbmV3bGluZS1zZXBhcmF0ZWQgUmVhZGFibGVTdHJlYW1cbiAgICogd2hlcmUgZWFjaCBpdGVtIGlzIGEgSlNPTiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBmcm9tUmVhZGFibGVTdHJlYW08SXRlbT4ocmVhZGFibGVTdHJlYW06IFJlYWRhYmxlU3RyZWFtLCBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBsZXQgY29uc3VtZWQgPSBmYWxzZTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBpdGVyTGluZXMoKTogQXN5bmNHZW5lcmF0b3I8c3RyaW5nLCB2b2lkLCB1bmtub3duPiB7XG4gICAgICBjb25zdCBsaW5lRGVjb2RlciA9IG5ldyBMaW5lRGVjb2RlcigpO1xuXG4gICAgICBjb25zdCBpdGVyID0gcmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhYmxlPEJ5dGVzPihyZWFkYWJsZVN0cmVhbSk7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGl0ZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVEZWNvZGVyLmRlY29kZShjaHVuaykpIHtcbiAgICAgICAgICB5aWVsZCBsaW5lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lRGVjb2Rlci5mbHVzaCgpKSB7XG4gICAgICAgIHlpZWxkIGxpbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGl0ZXJhdG9yKCk6IEFzeW5jSXRlcmF0b3I8SXRlbSwgYW55LCB1bmRlZmluZWQ+IHtcbiAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpdGVyYXRlIG92ZXIgYSBjb25zdW1lZCBzdHJlYW0sIHVzZSBgLnRlZSgpYCB0byBzcGxpdCB0aGUgc3RyZWFtLicpO1xuICAgICAgfVxuICAgICAgY29uc3VtZWQgPSB0cnVlO1xuICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBpdGVyTGluZXMoKSkge1xuICAgICAgICAgIGlmIChkb25lKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAobGluZSkgeWllbGQgSlNPTi5wYXJzZShsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgY2FsbHMgYHN0cmVhbS5jb250cm9sbGVyLmFib3J0KClgLCB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IHRocm93aW5nLlxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBJZiB0aGUgdXNlciBgYnJlYWtgcywgYWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdC5cbiAgICAgICAgaWYgKCFkb25lKSBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTdHJlYW0oaXRlcmF0b3IsIGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhdG9yPEl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyB0aGUgc3RyZWFtIGludG8gdHdvIHN0cmVhbXMgd2hpY2ggY2FuIGJlXG4gICAqIGluZGVwZW5kZW50bHkgcmVhZCBmcm9tIGF0IGRpZmZlcmVudCBzcGVlZHMuXG4gICAqL1xuICB0ZWUoKTogW1N0cmVhbTxJdGVtPiwgU3RyZWFtPEl0ZW0+XSB7XG4gICAgY29uc3QgbGVmdDogQXJyYXk8UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxJdGVtPj4+ID0gW107XG4gICAgY29uc3QgcmlnaHQ6IEFycmF5PFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8SXRlbT4+PiA9IFtdO1xuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcigpO1xuXG4gICAgY29uc3QgdGVlSXRlcmF0b3IgPSAocXVldWU6IEFycmF5PFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8SXRlbT4+Pik6IEFzeW5jSXRlcmF0b3I8SXRlbT4gPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGxlZnQucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgcmlnaHQucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcXVldWUuc2hpZnQoKSE7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gW1xuICAgICAgbmV3IFN0cmVhbSgoKSA9PiB0ZWVJdGVyYXRvcihsZWZ0KSwgdGhpcy5jb250cm9sbGVyKSxcbiAgICAgIG5ldyBTdHJlYW0oKCkgPT4gdGVlSXRlcmF0b3IocmlnaHQpLCB0aGlzLmNvbnRyb2xsZXIpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhpcyBzdHJlYW0gdG8gYSBuZXdsaW5lLXNlcGFyYXRlZCBSZWFkYWJsZVN0cmVhbSBvZlxuICAgKiBKU09OIHN0cmluZ2lmaWVkIHZhbHVlcyBpbiB0aGUgc3RyZWFtXG4gICAqIHdoaWNoIGNhbiBiZSB0dXJuZWQgYmFjayBpbnRvIGEgU3RyZWFtIHdpdGggYFN0cmVhbS5mcm9tUmVhZGFibGVTdHJlYW0oKWAuXG4gICAqL1xuICB0b1JlYWRhYmxlU3RyZWFtKCk6IFJlYWRhYmxlU3RyZWFtIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBsZXQgaXRlcjogQXN5bmNJdGVyYXRvcjxJdGVtPjtcbiAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5cbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgIGFzeW5jIHN0YXJ0KCkge1xuICAgICAgICBpdGVyID0gc2VsZltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsKGN0cmwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuIGN0cmwuY2xvc2UoKTtcblxuICAgICAgICAgIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ1xcbicpO1xuXG4gICAgICAgICAgY3RybC5lbnF1ZXVlKGJ5dGVzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY3RybC5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgY2FuY2VsKCkge1xuICAgICAgICBhd2FpdCBpdGVyLnJldHVybj8uKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIFNTRURlY29kZXIge1xuICBwcml2YXRlIGRhdGE6IHN0cmluZ1tdO1xuICBwcml2YXRlIGV2ZW50OiBzdHJpbmcgfCBudWxsO1xuICBwcml2YXRlIGNodW5rczogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5ldmVudCA9IG51bGw7XG4gICAgdGhpcy5kYXRhID0gW107XG4gICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgfVxuXG4gIGRlY29kZShsaW5lOiBzdHJpbmcpIHtcbiAgICBpZiAobGluZS5lbmRzV2l0aCgnXFxyJykpIHtcbiAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIGlmICghbGluZSkge1xuICAgICAgLy8gZW1wdHkgbGluZSBhbmQgd2UgZGlkbid0IHByZXZpb3VzbHkgZW5jb3VudGVyIGFueSBtZXNzYWdlc1xuICAgICAgaWYgKCF0aGlzLmV2ZW50ICYmICF0aGlzLmRhdGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3Qgc3NlOiBTZXJ2ZXJTZW50RXZlbnQgPSB7XG4gICAgICAgIGV2ZW50OiB0aGlzLmV2ZW50LFxuICAgICAgICBkYXRhOiB0aGlzLmRhdGEuam9pbignXFxuJyksXG4gICAgICAgIHJhdzogdGhpcy5jaHVua3MsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmV2ZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgdGhpcy5jaHVua3MgPSBbXTtcblxuICAgICAgcmV0dXJuIHNzZTtcbiAgICB9XG5cbiAgICB0aGlzLmNodW5rcy5wdXNoKGxpbmUpO1xuXG4gICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgW2ZpZWxkbmFtZSwgXywgdmFsdWVdID0gcGFydGl0aW9uKGxpbmUsICc6Jyk7XG5cbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnICcpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGRuYW1lID09PSAnZXZlbnQnKSB7XG4gICAgICB0aGlzLmV2ZW50ID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZG5hbWUgPT09ICdkYXRhJykge1xuICAgICAgdGhpcy5kYXRhLnB1c2godmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQSByZS1pbXBsZW1lbnRhdGlvbiBvZiBodHRweCdzIGBMaW5lRGVjb2RlcmAgaW4gUHl0aG9uIHRoYXQgaGFuZGxlcyBpbmNyZW1lbnRhbGx5XG4gKiByZWFkaW5nIGxpbmVzIGZyb20gdGV4dC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5jb2RlL2h0dHB4L2Jsb2IvOTIwMzMzZWE5ODExOGU5Y2Y2MTdmMjQ2OTA1ZDdiMjAyNTEwOTQxYy9odHRweC9fZGVjb2RlcnMucHkjTDI1OFxuICovXG5jbGFzcyBMaW5lRGVjb2RlciB7XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBzdGF0aWMgTkVXTElORV9DSEFSUyA9IG5ldyBTZXQoWydcXG4nLCAnXFxyJywgJ1xceDBiJywgJ1xceDBjJywgJ1xceDFjJywgJ1xceDFkJywgJ1xceDFlJywgJ1xceDg1JywgJ1xcdTIwMjgnLCAnXFx1MjAyOSddKTtcbiAgc3RhdGljIE5FV0xJTkVfUkVHRVhQID0gL1xcclxcbnxbXFxuXFxyXFx4MGJcXHgwY1xceDFjXFx4MWRcXHgxZVxceDg1XFx1MjAyOFxcdTIwMjldL2c7XG5cbiAgYnVmZmVyOiBzdHJpbmdbXTtcbiAgdHJhaWxpbmdDUjogYm9vbGVhbjtcbiAgdGV4dERlY29kZXI6IGFueTsgLy8gVGV4dERlY29kZXIgZm91bmQgaW4gYnJvd3NlcnM7IG5vdCB0eXBlZCB0byBhdm9pZCBwdWxsaW5nIGluIGVpdGhlciBcImRvbVwiIG9yIFwibm9kZVwiIHR5cGVzLlxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgdGhpcy50cmFpbGluZ0NSID0gZmFsc2U7XG4gIH1cblxuICBkZWNvZGUoY2h1bms6IEJ5dGVzKTogc3RyaW5nW10ge1xuICAgIGxldCB0ZXh0ID0gdGhpcy5kZWNvZGVUZXh0KGNodW5rKTtcblxuICAgIGlmICh0aGlzLnRyYWlsaW5nQ1IpIHtcbiAgICAgIHRleHQgPSAnXFxyJyArIHRleHQ7XG4gICAgICB0aGlzLnRyYWlsaW5nQ1IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRleHQuZW5kc1dpdGgoJ1xccicpKSB7XG4gICAgICB0aGlzLnRyYWlsaW5nQ1IgPSB0cnVlO1xuICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgLTEpO1xuICAgIH1cblxuICAgIGlmICghdGV4dCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWlsaW5nTmV3bGluZSA9IExpbmVEZWNvZGVyLk5FV0xJTkVfQ0hBUlMuaGFzKHRleHRbdGV4dC5sZW5ndGggLSAxXSB8fCAnJyk7XG4gICAgbGV0IGxpbmVzID0gdGV4dC5zcGxpdChMaW5lRGVjb2Rlci5ORVdMSU5FX1JFR0VYUCk7XG5cbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAxICYmICF0cmFpbGluZ05ld2xpbmUpIHtcbiAgICAgIHRoaXMuYnVmZmVyLnB1c2gobGluZXNbMF0hKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMgPSBbdGhpcy5idWZmZXIuam9pbignJykgKyBsaW5lc1swXSwgLi4ubGluZXMuc2xpY2UoMSldO1xuICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoIXRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgdGhpcy5idWZmZXIgPSBbbGluZXMucG9wKCkgfHwgJyddO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIGRlY29kZVRleHQoYnl0ZXM6IEJ5dGVzKTogc3RyaW5nIHtcbiAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgcmV0dXJuICcnO1xuICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSByZXR1cm4gYnl0ZXM7XG5cbiAgICAvLyBOb2RlOlxuICAgIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGJ5dGVzIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBieXRlcy50b1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYnl0ZXMpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBHcm9xRXJyb3IoXG4gICAgICAgIGBVbmV4cGVjdGVkOiByZWNlaXZlZCBub24tVWludDhBcnJheSAoJHtieXRlcy5jb25zdHJ1Y3Rvci5uYW1lfSkgc3RyZWFtIGNodW5rIGluIGFuIGVudmlyb25tZW50IHdpdGggYSBnbG9iYWwgXCJCdWZmZXJcIiBkZWZpbmVkLCB3aGljaCB0aGlzIGxpYnJhcnkgYXNzdW1lcyB0byBiZSBOb2RlLiBQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQnJvd3NlclxuICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoYnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IGJ5dGVzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgdGhpcy50ZXh0RGVjb2RlciA/Pz0gbmV3IFRleHREZWNvZGVyKCd1dGY4Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBHcm9xRXJyb3IoXG4gICAgICAgIGBVbmV4cGVjdGVkOiByZWNlaXZlZCBub24tVWludDhBcnJheS9BcnJheUJ1ZmZlciAoJHtcbiAgICAgICAgICAoYnl0ZXMgYXMgYW55KS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIH0pIGluIGEgd2ViIHBsYXRmb3JtLiBQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEdyb3FFcnJvcihcbiAgICAgIGBVbmV4cGVjdGVkOiBuZWl0aGVyIEJ1ZmZlciBub3IgVGV4dERlY29kZXIgYXJlIGF2YWlsYWJsZSBhcyBnbG9iYWxzLiBQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IuYCxcbiAgICApO1xuICB9XG5cbiAgZmx1c2goKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5idWZmZXIubGVuZ3RoICYmICF0aGlzLnRyYWlsaW5nQ1IpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IFt0aGlzLmJ1ZmZlci5qb2luKCcnKV07XG4gICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB0aGlzLnRyYWlsaW5nQ1IgPSBmYWxzZTtcbiAgICByZXR1cm4gbGluZXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFydGl0aW9uKHN0cjogc3RyaW5nLCBkZWxpbWl0ZXI6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSB7XG4gIGNvbnN0IGluZGV4ID0gc3RyLmluZGV4T2YoZGVsaW1pdGVyKTtcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIHJldHVybiBbc3RyLnN1YnN0cmluZygwLCBpbmRleCksIGRlbGltaXRlciwgc3RyLnN1YnN0cmluZyhpbmRleCArIGRlbGltaXRlci5sZW5ndGgpXTtcbiAgfVxuXG4gIHJldHVybiBbc3RyLCAnJywgJyddO1xufVxuXG4vKipcbiAqIE1vc3QgYnJvd3NlcnMgZG9uJ3QgeWV0IGhhdmUgYXN5bmMgaXRlcmFibGUgc3VwcG9ydCBmb3IgUmVhZGFibGVTdHJlYW0sXG4gKiBhbmQgTm9kZSBoYXMgYSB2ZXJ5IGRpZmZlcmVudCB3YXkgb2YgcmVhZGluZyBieXRlcyBmcm9tIGl0cyBcIlJlYWRhYmxlU3RyZWFtXCIuXG4gKlxuICogVGhpcyBwb2x5ZmlsbCB3YXMgcHVsbGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01hdHRpYXNCdWVsZW5zL3dlYi1zdHJlYW1zLXBvbHlmaWxsL3B1bGwvMTIyI2lzc3VlY29tbWVudC0xNjI3MzU0NDkwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmFibGU8VD4oc3RyZWFtOiBhbnkpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICBpZiAoc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkgcmV0dXJuIHN0cmVhbTtcblxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgICAgIGlmIChyZXN1bHQ/LmRvbmUpIHJlYWRlci5yZWxlYXNlTG9jaygpOyAvLyByZWxlYXNlIGxvY2sgd2hlbiBzdHJlYW0gYmVjb21lcyBjbG9zZWRcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7IC8vIHJlbGVhc2UgbG9jayB3aGVuIHN0cmVhbSBiZWNvbWVzIGVycm9yZWRcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHJldHVybigpIHtcbiAgICAgIGNvbnN0IGNhbmNlbFByb21pc2UgPSByZWFkZXIuY2FuY2VsKCk7XG4gICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgIGF3YWl0IGNhbmNlbFByb21pc2U7XG4gICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyB0eXBlIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1EYXRhLFxuICBGaWxlLFxuICB0eXBlIEJsb2IsXG4gIHR5cGUgRmlsZVByb3BlcnR5QmFnLFxuICBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucyxcbiAgdHlwZSBGc1JlYWRTdHJlYW0sXG4gIGlzRnNSZWFkU3RyZWFtLFxufSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5pbXBvcnQgeyBNdWx0aXBhcnRCb2R5IH0gZnJvbSAnLi9fc2hpbXMvTXVsdGlwYXJ0Qm9keSc7XG5leHBvcnQgeyBmaWxlRnJvbVBhdGggfSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5cbnR5cGUgQmxvYkxpa2VQYXJ0ID0gc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBBcnJheUJ1ZmZlclZpZXcgfCBCbG9iTGlrZSB8IFVpbnQ4QXJyYXkgfCBEYXRhVmlldztcbmV4cG9ydCB0eXBlIEJsb2JQYXJ0ID0gc3RyaW5nIHwgQXJyYXlCdWZmZXIgfCBBcnJheUJ1ZmZlclZpZXcgfCBCbG9iIHwgVWludDhBcnJheSB8IERhdGFWaWV3O1xuXG4vKipcbiAqIFR5cGljYWxseSwgdGhpcyBpcyBhIG5hdGl2ZSBcIkZpbGVcIiBjbGFzcy5cbiAqXG4gKiBXZSBwcm92aWRlIHRoZSB7QGxpbmsgdG9GaWxlfSB1dGlsaXR5IHRvIGNvbnZlcnQgYSB2YXJpZXR5IG9mIG9iamVjdHNcbiAqIGludG8gdGhlIEZpbGUgY2xhc3MuXG4gKlxuICogRm9yIGNvbnZlbmllbmNlLCB5b3UgY2FuIGFsc28gcGFzcyBhIGZldGNoIFJlc3BvbnNlLCBvciBpbiBOb2RlLFxuICogdGhlIHJlc3VsdCBvZiBmcy5jcmVhdGVSZWFkU3RyZWFtKCkuXG4gKi9cbmV4cG9ydCB0eXBlIFVwbG9hZGFibGUgPSBGaWxlTGlrZSB8IFJlc3BvbnNlTGlrZSB8IEZzUmVhZFN0cmVhbTtcblxuLyoqXG4gKiBJbnRlbmRlZCB0byBtYXRjaCB3ZWIuQmxvYiwgbm9kZS5CbG9iLCBub2RlLWZldGNoLkJsb2IsIGV0Yy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCbG9iTGlrZSB7XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0Jsb2Ivc2l6ZSkgKi9cbiAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9CbG9iL3R5cGUpICovXG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvQmxvYi90ZXh0KSAqL1xuICB0ZXh0KCk6IFByb21pc2U8c3RyaW5nPjtcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvQmxvYi9zbGljZSkgKi9cbiAgc2xpY2Uoc3RhcnQ/OiBudW1iZXIsIGVuZD86IG51bWJlcik6IEJsb2JMaWtlO1xuICAvLyB1bmZvcnR1bmF0ZWx5IEB0eXBlcy9ub2RlLWZldGNoQF4yLjYuNCBkb2Vzbid0IHR5cGUgdGhlIGFycmF5QnVmZmVyIG1ldGhvZFxufVxuXG4vKipcbiAqIEludGVuZGVkIHRvIG1hdGNoIHdlYi5GaWxlLCBub2RlLkZpbGUsIG5vZGUtZmV0Y2guRmlsZSwgZXRjLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVMaWtlIGV4dGVuZHMgQmxvYkxpa2Uge1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9GaWxlL2xhc3RNb2RpZmllZCkgKi9cbiAgcmVhZG9ubHkgbGFzdE1vZGlmaWVkOiBudW1iZXI7XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0ZpbGUvbmFtZSkgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEludGVuZGVkIHRvIG1hdGNoIHdlYi5SZXNwb25zZSwgbm9kZS5SZXNwb25zZSwgbm9kZS1mZXRjaC5SZXNwb25zZSwgZXRjLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlTGlrZSB7XG4gIHVybDogc3RyaW5nO1xuICBibG9iKCk6IFByb21pc2U8QmxvYkxpa2U+O1xufVxuXG5leHBvcnQgY29uc3QgaXNSZXNwb25zZUxpa2UgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIFJlc3BvbnNlTGlrZSA9PlxuICB2YWx1ZSAhPSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdHlwZW9mIHZhbHVlLnVybCA9PT0gJ3N0cmluZycgJiZcbiAgdHlwZW9mIHZhbHVlLmJsb2IgPT09ICdmdW5jdGlvbic7XG5cbmV4cG9ydCBjb25zdCBpc0ZpbGVMaWtlID0gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBGaWxlTGlrZSA9PlxuICB2YWx1ZSAhPSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdHlwZW9mIHZhbHVlLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gIHR5cGVvZiB2YWx1ZS5sYXN0TW9kaWZpZWQgPT09ICdudW1iZXInICYmXG4gIGlzQmxvYkxpa2UodmFsdWUpO1xuXG4vKipcbiAqIFRoZSBCbG9iTGlrZSB0eXBlIG9taXRzIGFycmF5QnVmZmVyKCkgYmVjYXVzZSBAdHlwZXMvbm9kZS1mZXRjaEBeMi42LjQgbGFja3MgaXQ7IGJ1dCB0aGlzIGNoZWNrXG4gKiBhZGRzIHRoZSBhcnJheUJ1ZmZlcigpIG1ldGhvZCB0eXBlIGJlY2F1c2UgaXQgaXMgYXZhaWxhYmxlIGFuZCB1c2VkIGF0IHJ1bnRpbWVcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQmxvYkxpa2UgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIEJsb2JMaWtlICYgeyBhcnJheUJ1ZmZlcigpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB9ID0+XG4gIHZhbHVlICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB0eXBlb2YgdmFsdWUuc2l6ZSA9PT0gJ251bWJlcicgJiZcbiAgdHlwZW9mIHZhbHVlLnR5cGUgPT09ICdzdHJpbmcnICYmXG4gIHR5cGVvZiB2YWx1ZS50ZXh0ID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiB2YWx1ZS5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2YgdmFsdWUuYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbic7XG5cbmV4cG9ydCBjb25zdCBpc1VwbG9hZGFibGUgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIFVwbG9hZGFibGUgPT4ge1xuICByZXR1cm4gaXNGaWxlTGlrZSh2YWx1ZSkgfHwgaXNSZXNwb25zZUxpa2UodmFsdWUpIHx8IGlzRnNSZWFkU3RyZWFtKHZhbHVlKTtcbn07XG5cbmV4cG9ydCB0eXBlIFRvRmlsZUlucHV0ID0gVXBsb2FkYWJsZSB8IEV4Y2x1ZGU8QmxvYkxpa2VQYXJ0LCBzdHJpbmc+IHwgQXN5bmNJdGVyYWJsZTxCbG9iTGlrZVBhcnQ+O1xuXG4vKipcbiAqIEhlbHBlciBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgRmlsZX0gdG8gcGFzcyB0byBhbiBTREsgdXBsb2FkIG1ldGhvZCBmcm9tIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgZGF0YSBmb3JtYXRzXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHJhdyBjb250ZW50IG9mIHRoZSBmaWxlLiAgQ2FuIGJlIGFuIHtAbGluayBVcGxvYWRhYmxlfSwge0BsaW5rIEJsb2JMaWtlUGFydH0sIG9yIHtAbGluayBBc3luY0l0ZXJhYmxlfSBvZiB7QGxpbmsgQmxvYkxpa2VQYXJ0fXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gSWYgb21pdHRlZCwgdG9GaWxlIHdpbGwgdHJ5IHRvIGRldGVybWluZSBhIGZpbGUgbmFtZSBmcm9tIGJpdHMgaWYgcG9zc2libGVcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0aW9ucy50eXBlIHRoZSBNSU1FIHR5cGUgb2YgdGhlIGNvbnRlbnRcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0aW9ucy5sYXN0TW9kaWZpZWQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wXG4gKiBAcmV0dXJucyBhIHtAbGluayBGaWxlfSB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b0ZpbGUoXG4gIHZhbHVlOiBUb0ZpbGVJbnB1dCB8IFByb21pc2VMaWtlPFRvRmlsZUlucHV0PixcbiAgbmFtZT86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IEZpbGVQcm9wZXJ0eUJhZyB8IHVuZGVmaW5lZCA9IHt9LFxuKTogUHJvbWlzZTxGaWxlTGlrZT4ge1xuICAvLyBJZiBpdCdzIGEgcHJvbWlzZSwgcmVzb2x2ZSBpdC5cbiAgdmFsdWUgPSBhd2FpdCB2YWx1ZTtcblxuICBpZiAoaXNSZXNwb25zZUxpa2UodmFsdWUpKSB7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHZhbHVlLmJsb2IoKTtcbiAgICBuYW1lIHx8PSBuZXcgVVJMKHZhbHVlLnVybCkucGF0aG5hbWUuc3BsaXQoL1tcXFxcL10vKS5wb3AoKSA/PyAndW5rbm93bl9maWxlJztcblxuICAgIHJldHVybiBuZXcgRmlsZShbYmxvYiBhcyBhbnldLCBuYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIGNvbnN0IGJpdHMgPSBhd2FpdCBnZXRCeXRlcyh2YWx1ZSk7XG5cbiAgbmFtZSB8fD0gZ2V0TmFtZSh2YWx1ZSkgPz8gJ3Vua25vd25fZmlsZSc7XG5cbiAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICBjb25zdCB0eXBlID0gKGJpdHNbMF0gYXMgYW55KT8udHlwZTtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCB0eXBlIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBGaWxlKGJpdHMsIG5hbWUsIG9wdGlvbnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRCeXRlcyh2YWx1ZTogVG9GaWxlSW5wdXQpOiBQcm9taXNlPEFycmF5PEJsb2JQYXJ0Pj4ge1xuICBsZXQgcGFydHM6IEFycmF5PEJsb2JQYXJ0PiA9IFtdO1xuICBpZiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgIEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkgfHwgLy8gaW5jbHVkZXMgVWludDhBcnJheSwgQnVmZmVyLCBldGMuXG4gICAgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlclxuICApIHtcbiAgICBwYXJ0cy5wdXNoKHZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgIHBhcnRzLnB1c2goYXdhaXQgdmFsdWUuYXJyYXlCdWZmZXIoKSk7XG4gIH0gZWxzZSBpZiAoXG4gICAgaXNBc3luY0l0ZXJhYmxlSXRlcmF0b3IodmFsdWUpIC8vIGluY2x1ZGVzIFJlYWRhYmxlLCBSZWFkYWJsZVN0cmVhbSwgZXRjLlxuICApIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHZhbHVlKSB7XG4gICAgICBwYXJ0cy5wdXNoKGNodW5rIGFzIEJsb2JQYXJ0KTsgLy8gVE9ETywgY29uc2lkZXIgdmFsaWRhdGluZz9cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQgZGF0YSB0eXBlOiAke3R5cGVvZiB2YWx1ZX07IGNvbnN0cnVjdG9yOiAke3ZhbHVlPy5jb25zdHJ1Y3RvclxuICAgICAgICA/Lm5hbWV9OyBwcm9wczogJHtwcm9wc0ZvckVycm9yKHZhbHVlKX1gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbmZ1bmN0aW9uIHByb3BzRm9yRXJyb3IodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gIGNvbnN0IHByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICByZXR1cm4gYFske3Byb3BzLm1hcCgocCkgPT4gYFwiJHtwfVwiYCkuam9pbignLCAnKX1dYDtcbn1cblxuZnVuY3Rpb24gZ2V0TmFtZSh2YWx1ZTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIChcbiAgICBnZXRTdHJpbmdGcm9tTWF5YmVCdWZmZXIodmFsdWUubmFtZSkgfHxcbiAgICBnZXRTdHJpbmdGcm9tTWF5YmVCdWZmZXIodmFsdWUuZmlsZW5hbWUpIHx8XG4gICAgLy8gRm9yIGZzLlJlYWRTdHJlYW1cbiAgICBnZXRTdHJpbmdGcm9tTWF5YmVCdWZmZXIodmFsdWUucGF0aCk/LnNwbGl0KC9bXFxcXC9dLykucG9wKClcbiAgKTtcbn1cblxuY29uc3QgZ2V0U3RyaW5nRnJvbU1heWJlQnVmZmVyID0gKHg6IHN0cmluZyB8IEJ1ZmZlciB8IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZW9mIHggPT09ICdzdHJpbmcnKSByZXR1cm4geDtcbiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBCdWZmZXIpIHJldHVybiBTdHJpbmcoeCk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBpc0FzeW5jSXRlcmFibGVJdGVyYXRvciA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPHVua25vd24+ID0+XG4gIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xuXG5leHBvcnQgY29uc3QgaXNNdWx0aXBhcnRCb2R5ID0gKGJvZHk6IGFueSk6IGJvZHkgaXMgTXVsdGlwYXJ0Qm9keSA9PlxuICBib2R5ICYmIHR5cGVvZiBib2R5ID09PSAnb2JqZWN0JyAmJiBib2R5LmJvZHkgJiYgYm9keVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTXVsdGlwYXJ0Qm9keSc7XG5cbi8qKlxuICogUmV0dXJucyBhIG11bHRpcGFydC9mb3JtLWRhdGEgcmVxdWVzdCBpZiBhbnkgcGFydCBvZiB0aGUgZ2l2ZW4gcmVxdWVzdCBib2R5IGNvbnRhaW5zIGEgRmlsZSAvIEJsb2IgdmFsdWUuXG4gKiBPdGhlcndpc2UgcmV0dXJucyB0aGUgcmVxdWVzdCBhcyBpcy5cbiAqL1xuZXhwb3J0IGNvbnN0IG1heWJlTXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zID0gYXN5bmMgPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIG9wdHM6IFJlcXVlc3RPcHRpb25zPFQ+LFxuKTogUHJvbWlzZTxSZXF1ZXN0T3B0aW9uczxUIHwgTXVsdGlwYXJ0Qm9keT4+ID0+IHtcbiAgaWYgKCFoYXNVcGxvYWRhYmxlVmFsdWUob3B0cy5ib2R5KSkgcmV0dXJuIG9wdHM7XG5cbiAgY29uc3QgZm9ybSA9IGF3YWl0IGNyZWF0ZUZvcm0ob3B0cy5ib2R5KTtcbiAgcmV0dXJuIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zKGZvcm0sIG9wdHMpO1xufTtcblxuZXhwb3J0IGNvbnN0IG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyA9IGFzeW5jIDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvcHRzOiBSZXF1ZXN0T3B0aW9uczxUPixcbik6IFByb21pc2U8UmVxdWVzdE9wdGlvbnM8VCB8IE11bHRpcGFydEJvZHk+PiA9PiB7XG4gIGNvbnN0IGZvcm0gPSBhd2FpdCBjcmVhdGVGb3JtKG9wdHMuYm9keSk7XG4gIHJldHVybiBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucyhmb3JtLCBvcHRzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVGb3JtID0gYXN5bmMgPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oYm9keTogVCB8IHVuZGVmaW5lZCk6IFByb21pc2U8Rm9ybURhdGE+ID0+IHtcbiAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICBhd2FpdCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhib2R5IHx8IHt9KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYWRkRm9ybVZhbHVlKGZvcm0sIGtleSwgdmFsdWUpKSk7XG4gIHJldHVybiBmb3JtO1xufTtcblxuY29uc3QgaGFzVXBsb2FkYWJsZVZhbHVlID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGlmIChpc1VwbG9hZGFibGUodmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZShoYXNVcGxvYWRhYmxlVmFsdWUpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3QgayBpbiB2YWx1ZSkge1xuICAgICAgaWYgKGhhc1VwbG9hZGFibGVWYWx1ZSgodmFsdWUgYXMgYW55KVtrXSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBhZGRGb3JtVmFsdWUgPSBhc3luYyAoZm9ybTogRm9ybURhdGEsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgUmVjZWl2ZWQgbnVsbCBmb3IgXCIke2tleX1cIjsgdG8gcGFzcyBudWxsIGluIEZvcm1EYXRhLCB5b3UgbXVzdCB1c2UgdGhlIHN0cmluZyAnbnVsbCdgLFxuICAgICk7XG4gIH1cblxuICAvLyBUT0RPOiBtYWtlIG5lc3RlZCBmb3JtYXRzIGNvbmZpZ3VyYWJsZVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgZm9ybS5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKTtcbiAgfSBlbHNlIGlmIChpc1VwbG9hZGFibGUodmFsdWUpKSB7XG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IHRvRmlsZSh2YWx1ZSk7XG4gICAgZm9ybS5hcHBlbmQoa2V5LCBmaWxlIGFzIEZpbGUpO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodmFsdWUubWFwKChlbnRyeSkgPT4gYWRkRm9ybVZhbHVlKGZvcm0sIGtleSArICdbXScsIGVudHJ5KSkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtuYW1lLCBwcm9wXSkgPT4gYWRkRm9ybVZhbHVlKGZvcm0sIGAke2tleX1bJHtuYW1lfV1gLCBwcm9wKSksXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgYEludmFsaWQgdmFsdWUgZ2l2ZW4gdG8gZm9ybSwgZXhwZWN0ZWQgYSBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwgb2JqZWN0LCBBcnJheSwgRmlsZSBvciBCbG9iIGJ1dCBnb3QgJHt2YWx1ZX0gaW5zdGVhZGAsXG4gICAgKTtcbiAgfVxufTtcbiIsICJpbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi92ZXJzaW9uJztcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gJy4vbGliL3N0cmVhbWluZyc7XG5pbXBvcnQge1xuICBHcm9xRXJyb3IsXG4gIEFQSUVycm9yLFxuICBBUElDb25uZWN0aW9uRXJyb3IsXG4gIEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IsXG4gIEFQSVVzZXJBYm9ydEVycm9yLFxufSBmcm9tICcuL2Vycm9yJztcbmltcG9ydCB7XG4gIGtpbmQgYXMgc2hpbXNLaW5kLFxuICB0eXBlIFJlYWRhYmxlLFxuICBnZXREZWZhdWx0QWdlbnQsXG4gIHR5cGUgQWdlbnQsXG4gIGZldGNoLFxuICB0eXBlIFJlcXVlc3RJbmZvLFxuICB0eXBlIFJlcXVlc3RJbml0LFxuICB0eXBlIFJlc3BvbnNlLFxuICB0eXBlIEhlYWRlcnNJbml0LFxufSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5leHBvcnQgeyB0eXBlIFJlc3BvbnNlIH07XG5pbXBvcnQgeyBpc011bHRpcGFydEJvZHkgfSBmcm9tICcuL3VwbG9hZHMnO1xuZXhwb3J0IHtcbiAgbWF5YmVNdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMsXG4gIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyxcbiAgY3JlYXRlRm9ybSxcbiAgdHlwZSBVcGxvYWRhYmxlLFxufSBmcm9tICcuL3VwbG9hZHMnO1xuXG5leHBvcnQgdHlwZSBGZXRjaCA9ICh1cmw6IFJlcXVlc3RJbmZvLCBpbml0PzogUmVxdWVzdEluaXQpID0+IFByb21pc2U8UmVzcG9uc2U+O1xuXG50eXBlIFByb21pc2VPclZhbHVlPFQ+ID0gVCB8IFByb21pc2U8VD47XG5cbnR5cGUgQVBJUmVzcG9uc2VQcm9wcyA9IHtcbiAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zO1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBkZWZhdWx0UGFyc2VSZXNwb25zZTxUPihwcm9wczogQVBJUmVzcG9uc2VQcm9wcyk6IFByb21pc2U8VD4ge1xuICBjb25zdCB7IHJlc3BvbnNlIH0gPSBwcm9wcztcbiAgaWYgKHByb3BzLm9wdGlvbnMuc3RyZWFtKSB7XG4gICAgZGVidWcoJ3Jlc3BvbnNlJywgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS51cmwsIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3BvbnNlLmJvZHkpO1xuXG4gICAgLy8gTm90ZTogdGhlcmUgaXMgYW4gaW52YXJpYW50IGhlcmUgdGhhdCBpc24ndCByZXByZXNlbnRlZCBpbiB0aGUgdHlwZSBzeXN0ZW1cbiAgICAvLyB0aGF0IGlmIHlvdSBzZXQgYHN0cmVhbTogdHJ1ZWAgdGhlIHJlc3BvbnNlIHR5cGUgbXVzdCBhbHNvIGJlIGBTdHJlYW08VD5gXG5cbiAgICBpZiAocHJvcHMub3B0aW9ucy5fX3N0cmVhbUNsYXNzKSB7XG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9ucy5fX3N0cmVhbUNsYXNzLmZyb21TU0VSZXNwb25zZShyZXNwb25zZSwgcHJvcHMuY29udHJvbGxlcikgYXMgYW55O1xuICAgIH1cblxuICAgIHJldHVybiBTdHJlYW0uZnJvbVNTRVJlc3BvbnNlKHJlc3BvbnNlLCBwcm9wcy5jb250cm9sbGVyKSBhcyBhbnk7XG4gIH1cblxuICAvLyBmZXRjaCByZWZ1c2VzIHRvIHJlYWQgdGhlIGJvZHkgd2hlbiB0aGUgc3RhdHVzIGNvZGUgaXMgMjA0LlxuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQpIHtcbiAgICByZXR1cm4gbnVsbCBhcyBUO1xuICB9XG5cbiAgaWYgKHByb3BzLm9wdGlvbnMuX19iaW5hcnlSZXNwb25zZSkge1xuICAgIHJldHVybiByZXNwb25zZSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgY29uc3QgaXNKU09OID1cbiAgICBjb250ZW50VHlwZT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSB8fCBjb250ZW50VHlwZT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL3ZuZC5hcGkranNvbicpO1xuICBpZiAoaXNKU09OKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGRlYnVnKCdyZXNwb25zZScsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UudXJsLCByZXNwb25zZS5oZWFkZXJzLCBqc29uKTtcblxuICAgIHJldHVybiBqc29uIGFzIFQ7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICBkZWJ1ZygncmVzcG9uc2UnLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnVybCwgcmVzcG9uc2UuaGVhZGVycywgdGV4dCk7XG5cbiAgLy8gVE9ETyBoYW5kbGUgYmxvYiwgYXJyYXlidWZmZXIsIG90aGVyIGNvbnRlbnQgdHlwZXMsIGV0Yy5cbiAgcmV0dXJuIHRleHQgYXMgdW5rbm93biBhcyBUO1xufVxuXG4vKipcbiAqIEEgc3ViY2xhc3Mgb2YgYFByb21pc2VgIHByb3ZpZGluZyBhZGRpdGlvbmFsIGhlbHBlciBtZXRob2RzXG4gKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgU0RLLlxuICovXG5leHBvcnQgY2xhc3MgQVBJUHJvbWlzZTxUPiBleHRlbmRzIFByb21pc2U8VD4ge1xuICBwcml2YXRlIHBhcnNlZFByb21pc2U6IFByb21pc2U8VD4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZXNwb25zZVByb21pc2U6IFByb21pc2U8QVBJUmVzcG9uc2VQcm9wcz4sXG4gICAgcHJpdmF0ZSBwYXJzZVJlc3BvbnNlOiAocHJvcHM6IEFQSVJlc3BvbnNlUHJvcHMpID0+IFByb21pc2VPclZhbHVlPFQ+ID0gZGVmYXVsdFBhcnNlUmVzcG9uc2UsXG4gICkge1xuICAgIHN1cGVyKChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyB0aGlzIGlzIG1heWJlIGEgYml0IHdlaXJkIGJ1dCB0aGlzIGhhcyB0byBiZSBhIG5vLW9wIHRvIG5vdCBpbXBsaWNpdGx5XG4gICAgICAvLyBwYXJzZSB0aGUgcmVzcG9uc2UgYm9keTsgaW5zdGVhZCAudGhlbiwgLmNhdGNoLCAuZmluYWxseSBhcmUgb3ZlcnJpZGRlblxuICAgICAgLy8gdG8gcGFyc2UgdGhlIHJlc3BvbnNlXG4gICAgICByZXNvbHZlKG51bGwgYXMgYW55KTtcbiAgICB9KTtcbiAgfVxuXG4gIF90aGVuVW53cmFwPFU+KHRyYW5zZm9ybTogKGRhdGE6IFQpID0+IFUpOiBBUElQcm9taXNlPFU+IHtcbiAgICByZXR1cm4gbmV3IEFQSVByb21pc2UodGhpcy5yZXNwb25zZVByb21pc2UsIGFzeW5jIChwcm9wcykgPT4gdHJhbnNmb3JtKGF3YWl0IHRoaXMucGFyc2VSZXNwb25zZShwcm9wcykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByYXcgYFJlc3BvbnNlYCBpbnN0YW5jZSBpbnN0ZWFkIG9mIHBhcnNpbmcgdGhlIHJlc3BvbnNlXG4gICAqIGRhdGEuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIHBhcnNlIHRoZSByZXNwb25zZSBib2R5IGJ1dCBzdGlsbCBnZXQgdGhlIGBSZXNwb25zZWBcbiAgICogaW5zdGFuY2UsIHlvdSBjYW4gdXNlIHtAbGluayB3aXRoUmVzcG9uc2UoKX0uXG4gICAqXG4gICAqIFx1RDgzRFx1REM0QiBHZXR0aW5nIHRoZSB3cm9uZyBUeXBlU2NyaXB0IHR5cGUgZm9yIGBSZXNwb25zZWA/XG4gICAqIFRyeSBzZXR0aW5nIGBcIm1vZHVsZVJlc29sdXRpb25cIjogXCJOb2RlTmV4dFwiYCBpZiB5b3UgY2FuLFxuICAgKiBvciBhZGQgb25lIG9mIHRoZXNlIGltcG9ydHMgYmVmb3JlIHlvdXIgZmlyc3QgYGltcG9ydCBcdTIwMjYgZnJvbSAnZ3JvcS1zZGsnYDpcbiAgICogLSBgaW1wb3J0ICdncm9xLXNkay9zaGltcy9ub2RlJ2AgKGlmIHlvdSdyZSBydW5uaW5nIG9uIE5vZGUpXG4gICAqIC0gYGltcG9ydCAnZ3JvcS1zZGsvc2hpbXMvd2ViJ2AgKG90aGVyd2lzZSlcbiAgICovXG4gIGFzUmVzcG9uc2UoKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlUHJvbWlzZS50aGVuKChwKSA9PiBwLnJlc3BvbnNlKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgcGFyc2VkIHJlc3BvbnNlIGRhdGEgYW5kIHRoZSByYXcgYFJlc3BvbnNlYCBpbnN0YW5jZS5cbiAgICpcbiAgICogSWYgeW91IGp1c3Qgd2FudCB0byBnZXQgdGhlIHJhdyBgUmVzcG9uc2VgIGluc3RhbmNlIHdpdGhvdXQgcGFyc2luZyBpdCxcbiAgICogeW91IGNhbiB1c2Uge0BsaW5rIGFzUmVzcG9uc2UoKX0uXG4gICAqXG4gICAqXG4gICAqIFx1RDgzRFx1REM0QiBHZXR0aW5nIHRoZSB3cm9uZyBUeXBlU2NyaXB0IHR5cGUgZm9yIGBSZXNwb25zZWA/XG4gICAqIFRyeSBzZXR0aW5nIGBcIm1vZHVsZVJlc29sdXRpb25cIjogXCJOb2RlTmV4dFwiYCBpZiB5b3UgY2FuLFxuICAgKiBvciBhZGQgb25lIG9mIHRoZXNlIGltcG9ydHMgYmVmb3JlIHlvdXIgZmlyc3QgYGltcG9ydCBcdTIwMjYgZnJvbSAnZ3JvcS1zZGsnYDpcbiAgICogLSBgaW1wb3J0ICdncm9xLXNkay9zaGltcy9ub2RlJ2AgKGlmIHlvdSdyZSBydW5uaW5nIG9uIE5vZGUpXG4gICAqIC0gYGltcG9ydCAnZ3JvcS1zZGsvc2hpbXMvd2ViJ2AgKG90aGVyd2lzZSlcbiAgICovXG4gIGFzeW5jIHdpdGhSZXNwb25zZSgpOiBQcm9taXNlPHsgZGF0YTogVDsgcmVzcG9uc2U6IFJlc3BvbnNlIH0+IHtcbiAgICBjb25zdCBbZGF0YSwgcmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMucGFyc2UoKSwgdGhpcy5hc1Jlc3BvbnNlKCldKTtcbiAgICByZXR1cm4geyBkYXRhLCByZXNwb25zZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZSgpOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIXRoaXMucGFyc2VkUHJvbWlzZSkge1xuICAgICAgdGhpcy5wYXJzZWRQcm9taXNlID0gdGhpcy5yZXNwb25zZVByb21pc2UudGhlbih0aGlzLnBhcnNlUmVzcG9uc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZWRQcm9taXNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQgfCBQcm9taXNlTGlrZTxUUmVzdWx0PikgfCB1bmRlZmluZWQgfCBudWxsLFxuICApOiBQcm9taXNlPFQgfCBUUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKS5jYXRjaChvbnJlamVjdGVkKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKCkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBUElDbGllbnQge1xuICBiYXNlVVJMOiBzdHJpbmc7XG4gIG1heFJldHJpZXM6IG51bWJlcjtcbiAgdGltZW91dDogbnVtYmVyO1xuICBodHRwQWdlbnQ6IEFnZW50IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgZmV0Y2g6IEZldGNoO1xuICBwcm90ZWN0ZWQgaWRlbXBvdGVuY3lIZWFkZXI/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGJhc2VVUkwsXG4gICAgbWF4UmV0cmllcyA9IDIsXG4gICAgdGltZW91dCA9IDYwMDAwLCAvLyAxIG1pbnV0ZVxuICAgIGh0dHBBZ2VudCxcbiAgICBmZXRjaDogb3ZlcnJpZGVuRmV0Y2gsXG4gIH06IHtcbiAgICBiYXNlVVJMOiBzdHJpbmc7XG4gICAgbWF4UmV0cmllcz86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICB0aW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgaHR0cEFnZW50OiBBZ2VudCB8IHVuZGVmaW5lZDtcbiAgICBmZXRjaDogRmV0Y2ggfCB1bmRlZmluZWQ7XG4gIH0pIHtcbiAgICB0aGlzLmJhc2VVUkwgPSBiYXNlVVJMO1xuICAgIHRoaXMubWF4UmV0cmllcyA9IHZhbGlkYXRlUG9zaXRpdmVJbnRlZ2VyKCdtYXhSZXRyaWVzJywgbWF4UmV0cmllcyk7XG4gICAgdGhpcy50aW1lb3V0ID0gdmFsaWRhdGVQb3NpdGl2ZUludGVnZXIoJ3RpbWVvdXQnLCB0aW1lb3V0KTtcbiAgICB0aGlzLmh0dHBBZ2VudCA9IGh0dHBBZ2VudDtcblxuICAgIHRoaXMuZmV0Y2ggPSBvdmVycmlkZW5GZXRjaCA/PyBmZXRjaDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhdXRoSGVhZGVycyhvcHRzOiBGaW5hbFJlcXVlc3RPcHRpb25zKTogSGVhZGVycyB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoaXMgdG8gYWRkIHlvdXIgb3duIGRlZmF1bHQgaGVhZGVycywgZm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB7XG4gICAqICAgIC4uLnN1cGVyLmRlZmF1bHRIZWFkZXJzKCksXG4gICAqICAgIEF1dGhvcml6YXRpb246ICdCZWFyZXIgMTIzJyxcbiAgICogIH1cbiAgICovXG4gIHByb3RlY3RlZCBkZWZhdWx0SGVhZGVycyhvcHRzOiBGaW5hbFJlcXVlc3RPcHRpb25zKTogSGVhZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdVc2VyLUFnZW50JzogdGhpcy5nZXRVc2VyQWdlbnQoKSxcbiAgICAgIC4uLmdldFBsYXRmb3JtSGVhZGVycygpLFxuICAgICAgLi4udGhpcy5hdXRoSGVhZGVycyhvcHRzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGRlZmF1bHRRdWVyeSgpOiBEZWZhdWx0UXVlcnkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoaXMgdG8gYWRkIHlvdXIgb3duIGhlYWRlcnMgdmFsaWRhdGlvbjpcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUhlYWRlcnMoaGVhZGVyczogSGVhZGVycywgY3VzdG9tSGVhZGVyczogSGVhZGVycykge31cblxuICBwcm90ZWN0ZWQgZGVmYXVsdElkZW1wb3RlbmN5S2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBzdGFpbmxlc3Mtbm9kZS1yZXRyeS0ke3V1aWQ0KCl9YDtcbiAgfVxuXG4gIGdldDxSZXEsIFJzcD4ocGF0aDogc3RyaW5nLCBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4pOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZFJlcXVlc3QoJ2dldCcsIHBhdGgsIG9wdHMpO1xuICB9XG5cbiAgcG9zdDxSZXEsIFJzcD4ocGF0aDogc3RyaW5nLCBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4pOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZFJlcXVlc3QoJ3Bvc3QnLCBwYXRoLCBvcHRzKTtcbiAgfVxuXG4gIHBhdGNoPFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgncGF0Y2gnLCBwYXRoLCBvcHRzKTtcbiAgfVxuXG4gIHB1dDxSZXEsIFJzcD4ocGF0aDogc3RyaW5nLCBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4pOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZFJlcXVlc3QoJ3B1dCcsIHBhdGgsIG9wdHMpO1xuICB9XG5cbiAgZGVsZXRlPFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgnZGVsZXRlJywgcGF0aCwgb3B0cyk7XG4gIH1cblxuICBwcml2YXRlIG1ldGhvZFJlcXVlc3Q8UmVxLCBSc3A+KFxuICAgIG1ldGhvZDogSFRUUE1ldGhvZCxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0cz86IFByb21pc2VPclZhbHVlPFJlcXVlc3RPcHRpb25zPFJlcT4+LFxuICApOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoUHJvbWlzZS5yZXNvbHZlKG9wdHMpLnRoZW4oKG9wdHMpID0+ICh7IG1ldGhvZCwgcGF0aCwgLi4ub3B0cyB9KSkpO1xuICB9XG5cbiAgZ2V0QVBJTGlzdDxJdGVtLCBQYWdlQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdFBhZ2U8SXRlbT4gPSBBYnN0cmFjdFBhZ2U8SXRlbT4+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBQYWdlOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBQYWdlQ2xhc3MsXG4gICAgb3B0cz86IFJlcXVlc3RPcHRpb25zPGFueT4sXG4gICk6IFBhZ2VQcm9taXNlPFBhZ2VDbGFzcywgSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RBUElMaXN0KFBhZ2UsIHsgbWV0aG9kOiAnZ2V0JywgcGF0aCwgLi4ub3B0cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQ29udGVudExlbmd0aChib2R5OiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChib2R5LCAndXRmOCcpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZXIuZW5jb2RlKGJvZHkpO1xuICAgICAgICByZXR1cm4gZW5jb2RlZC5sZW5ndGgudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGJ1aWxkUmVxdWVzdDxSZXE+KG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnM8UmVxPik6IHsgcmVxOiBSZXF1ZXN0SW5pdDsgdXJsOiBzdHJpbmc7IHRpbWVvdXQ6IG51bWJlciB9IHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCwgcXVlcnksIGhlYWRlcnM6IGhlYWRlcnMgPSB7fSB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGJvZHkgPVxuICAgICAgaXNNdWx0aXBhcnRCb2R5KG9wdGlvbnMuYm9keSkgPyBvcHRpb25zLmJvZHkuYm9keVxuICAgICAgOiBvcHRpb25zLmJvZHkgPyBKU09OLnN0cmluZ2lmeShvcHRpb25zLmJvZHksIG51bGwsIDIpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IHRoaXMuY2FsY3VsYXRlQ29udGVudExlbmd0aChib2R5KTtcblxuICAgIGNvbnN0IHVybCA9IHRoaXMuYnVpbGRVUkwocGF0aCEsIHF1ZXJ5KTtcbiAgICBpZiAoJ3RpbWVvdXQnIGluIG9wdGlvbnMpIHZhbGlkYXRlUG9zaXRpdmVJbnRlZ2VyKCd0aW1lb3V0Jywgb3B0aW9ucy50aW1lb3V0KTtcbiAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMudGltZW91dDtcbiAgICBjb25zdCBodHRwQWdlbnQgPSBvcHRpb25zLmh0dHBBZ2VudCA/PyB0aGlzLmh0dHBBZ2VudCA/PyBnZXREZWZhdWx0QWdlbnQodXJsKTtcbiAgICBjb25zdCBtaW5BZ2VudFRpbWVvdXQgPSB0aW1lb3V0ICsgMTAwMDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgKGh0dHBBZ2VudCBhcyBhbnkpPy5vcHRpb25zPy50aW1lb3V0ID09PSAnbnVtYmVyJyAmJlxuICAgICAgbWluQWdlbnRUaW1lb3V0ID4gKChodHRwQWdlbnQgYXMgYW55KS5vcHRpb25zLnRpbWVvdXQgPz8gMClcbiAgICApIHtcbiAgICAgIC8vIEFsbG93IGFueSBnaXZlbiByZXF1ZXN0IHRvIGJ1bXAgb3VyIGFnZW50IGFjdGl2ZSBzb2NrZXQgdGltZW91dC5cbiAgICAgIC8vIFRoaXMgbWF5IHNlZW0gc3RyYW5nZSwgYnV0IGxlYWtpbmcgYWN0aXZlIHNvY2tldHMgc2hvdWxkIGJlIHJhcmUgYW5kIG5vdCBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMsXG4gICAgICAvLyBhbmQgd2l0aG91dCBtdXRhdGluZyBhZ2VudCB3ZSB3b3VsZCBuZWVkIHRvIGNyZWF0ZSBtb3JlIG9mIHRoZW0uXG4gICAgICAvLyBUaGlzIHRyYWRlb2ZmIG9wdGltaXplcyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgICAoaHR0cEFnZW50IGFzIGFueSkub3B0aW9ucy50aW1lb3V0ID0gbWluQWdlbnRUaW1lb3V0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlkZW1wb3RlbmN5SGVhZGVyICYmIG1ldGhvZCAhPT0gJ2dldCcpIHtcbiAgICAgIGlmICghb3B0aW9ucy5pZGVtcG90ZW5jeUtleSkgb3B0aW9ucy5pZGVtcG90ZW5jeUtleSA9IHRoaXMuZGVmYXVsdElkZW1wb3RlbmN5S2V5KCk7XG4gICAgICBoZWFkZXJzW3RoaXMuaWRlbXBvdGVuY3lIZWFkZXJdID0gb3B0aW9ucy5pZGVtcG90ZW5jeUtleTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoeyBvcHRpb25zLCBoZWFkZXJzLCBjb250ZW50TGVuZ3RoIH0pO1xuXG4gICAgY29uc3QgcmVxOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIC4uLihib2R5ICYmIHsgYm9keTogYm9keSBhcyBhbnkgfSksXG4gICAgICBoZWFkZXJzOiByZXFIZWFkZXJzLFxuICAgICAgLi4uKGh0dHBBZ2VudCAmJiB7IGFnZW50OiBodHRwQWdlbnQgfSksXG4gICAgICAvLyBAdHMtaWdub3JlIG5vZGUtZmV0Y2ggdXNlcyBhIGN1c3RvbSBBYm9ydFNpZ25hbCB0eXBlIHRoYXQgaXNcbiAgICAgIC8vIG5vdCBjb21wYXRpYmxlIHdpdGggc3RhbmRhcmQgd2ViIHR5cGVzXG4gICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsID8/IG51bGwsXG4gICAgfTtcblxuICAgIHJldHVybiB7IHJlcSwgdXJsLCB0aW1lb3V0IH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSGVhZGVycyh7XG4gICAgb3B0aW9ucyxcbiAgICBoZWFkZXJzLFxuICAgIGNvbnRlbnRMZW5ndGgsXG4gIH06IHtcbiAgICBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zO1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+O1xuICAgIGNvbnRlbnRMZW5ndGg6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByZXFIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgaWYgKGNvbnRlbnRMZW5ndGgpIHtcbiAgICAgIHJlcUhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPSBjb250ZW50TGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycyhvcHRpb25zKTtcbiAgICBhcHBseUhlYWRlcnNNdXQocmVxSGVhZGVycywgZGVmYXVsdEhlYWRlcnMpO1xuICAgIGFwcGx5SGVhZGVyc011dChyZXFIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIC8vIGxldCBidWlsdGluIGZldGNoIHNldCB0aGUgQ29udGVudC1UeXBlIGZvciBtdWx0aXBhcnQgYm9kaWVzXG4gICAgaWYgKGlzTXVsdGlwYXJ0Qm9keShvcHRpb25zLmJvZHkpICYmIHNoaW1zS2luZCAhPT0gJ25vZGUnKSB7XG4gICAgICBkZWxldGUgcmVxSGVhZGVyc1snY29udGVudC10eXBlJ107XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZUhlYWRlcnMocmVxSGVhZGVycywgaGVhZGVycyk7XG5cbiAgICByZXR1cm4gcmVxSGVhZGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgZm9yIG11dGF0aW5nIHRoZSBnaXZlbiBgRmluYWxSZXF1ZXN0T3B0aW9uc2Agb2JqZWN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVPcHRpb25zKG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqXG4gICAqIFVzZWQgYXMgYSBjYWxsYmFjayBmb3IgbXV0YXRpbmcgdGhlIGdpdmVuIGBSZXF1ZXN0SW5pdGAgb2JqZWN0LlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmUgeW91IHdhbnQgdG8gYWRkIGNlcnRhaW4gaGVhZGVycyBiYXNlZCBvZmYgb2ZcbiAgICogdGhlIHJlcXVlc3QgcHJvcGVydGllcywgZS5nLiBgbWV0aG9kYCBvciBgdXJsYC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBwcmVwYXJlUmVxdWVzdChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5pdCxcbiAgICB7IHVybCwgb3B0aW9ucyB9OiB7IHVybDogc3RyaW5nOyBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge31cblxuICBwcm90ZWN0ZWQgcGFyc2VIZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnNJbml0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiAoXG4gICAgICAhaGVhZGVycyA/IHt9XG4gICAgICA6IFN5bWJvbC5pdGVyYXRvciBpbiBoZWFkZXJzID9cbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKEFycmF5LmZyb20oaGVhZGVycyBhcyBJdGVyYWJsZTxzdHJpbmdbXT4pLm1hcCgoaGVhZGVyKSA9PiBbLi4uaGVhZGVyXSkpXG4gICAgICA6IHsgLi4uaGVhZGVycyB9XG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYWtlU3RhdHVzRXJyb3IoXG4gICAgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZXJyb3I6IE9iamVjdCB8IHVuZGVmaW5lZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgcmV0dXJuIEFQSUVycm9yLmdlbmVyYXRlKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICB9XG5cbiAgcmVxdWVzdDxSZXEsIFJzcD4oXG4gICAgb3B0aW9uczogUHJvbWlzZU9yVmFsdWU8RmluYWxSZXF1ZXN0T3B0aW9uczxSZXE+PixcbiAgICByZW1haW5pbmdSZXRyaWVzOiBudW1iZXIgfCBudWxsID0gbnVsbCxcbiAgKTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gbmV3IEFQSVByb21pc2UodGhpcy5tYWtlUmVxdWVzdChvcHRpb25zLCByZW1haW5pbmdSZXRyaWVzKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1ha2VSZXF1ZXN0PFJlcT4oXG4gICAgb3B0aW9uc0lucHV0OiBQcm9taXNlT3JWYWx1ZTxGaW5hbFJlcXVlc3RPcHRpb25zPFJlcT4+LFxuICAgIHJldHJpZXNSZW1haW5pbmc6IG51bWJlciB8IG51bGwsXG4gICk6IFByb21pc2U8QVBJUmVzcG9uc2VQcm9wcz4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCBvcHRpb25zSW5wdXQ7XG4gICAgaWYgKHJldHJpZXNSZW1haW5pbmcgPT0gbnVsbCkge1xuICAgICAgcmV0cmllc1JlbWFpbmluZyA9IG9wdGlvbnMubWF4UmV0cmllcyA/PyB0aGlzLm1heFJldHJpZXM7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIGNvbnN0IHsgcmVxLCB1cmwsIHRpbWVvdXQgfSA9IHRoaXMuYnVpbGRSZXF1ZXN0KG9wdGlvbnMpO1xuXG4gICAgYXdhaXQgdGhpcy5wcmVwYXJlUmVxdWVzdChyZXEsIHsgdXJsLCBvcHRpb25zIH0pO1xuXG4gICAgZGVidWcoJ3JlcXVlc3QnLCB1cmwsIG9wdGlvbnMsIHJlcS5oZWFkZXJzKTtcblxuICAgIGlmIChvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hXaXRoVGltZW91dCh1cmwsIHJlcSwgdGltZW91dCwgY29udHJvbGxlcikuY2F0Y2goY2FzdFRvRXJyb3IpO1xuXG4gICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmIChvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXRyaWVzUmVtYWluaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHJ5UmVxdWVzdChvcHRpb25zLCByZXRyaWVzUmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwb25zZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBBUElDb25uZWN0aW9uRXJyb3IoeyBjYXVzZTogcmVzcG9uc2UgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gY3JlYXRlUmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgaWYgKHJldHJpZXNSZW1haW5pbmcgJiYgdGhpcy5zaG91bGRSZXRyeShyZXNwb25zZSkpIHtcbiAgICAgICAgY29uc3QgcmV0cnlNZXNzYWdlID0gYHJldHJ5aW5nLCAke3JldHJpZXNSZW1haW5pbmd9IGF0dGVtcHRzIHJlbWFpbmluZ2A7XG4gICAgICAgIGRlYnVnKGByZXNwb25zZSAoZXJyb3I7ICR7cmV0cnlNZXNzYWdlfSlgLCByZXNwb25zZS5zdGF0dXMsIHVybCwgcmVzcG9uc2VIZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlSZXF1ZXN0KG9wdGlvbnMsIHJldHJpZXNSZW1haW5pbmcsIHJlc3BvbnNlSGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVyclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKGUpID0+IGNhc3RUb0Vycm9yKGUpLm1lc3NhZ2UpO1xuICAgICAgY29uc3QgZXJySlNPTiA9IHNhZmVKU09OKGVyclRleHQpO1xuICAgICAgY29uc3QgZXJyTWVzc2FnZSA9IGVyckpTT04gPyB1bmRlZmluZWQgOiBlcnJUZXh0O1xuICAgICAgY29uc3QgcmV0cnlNZXNzYWdlID0gcmV0cmllc1JlbWFpbmluZyA/IGAoZXJyb3I7IG5vIG1vcmUgcmV0cmllcyBsZWZ0KWAgOiBgKGVycm9yOyBub3QgcmV0cnlhYmxlKWA7XG5cbiAgICAgIGRlYnVnKGByZXNwb25zZSAoZXJyb3I7ICR7cmV0cnlNZXNzYWdlfSlgLCByZXNwb25zZS5zdGF0dXMsIHVybCwgcmVzcG9uc2VIZWFkZXJzLCBlcnJNZXNzYWdlKTtcblxuICAgICAgY29uc3QgZXJyID0gdGhpcy5tYWtlU3RhdHVzRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCBlcnJKU09OLCBlcnJNZXNzYWdlLCByZXNwb25zZUhlYWRlcnMpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJlc3BvbnNlLCBvcHRpb25zLCBjb250cm9sbGVyIH07XG4gIH1cblxuICByZXF1ZXN0QVBJTGlzdDxJdGVtID0gdW5rbm93biwgUGFnZUNsYXNzIGV4dGVuZHMgQWJzdHJhY3RQYWdlPEl0ZW0+ID0gQWJzdHJhY3RQYWdlPEl0ZW0+PihcbiAgICBQYWdlOiBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgQWJzdHJhY3RQYWdlPikgPT4gUGFnZUNsYXNzLFxuICAgIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMsXG4gICk6IFBhZ2VQcm9taXNlPFBhZ2VDbGFzcywgSXRlbT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLm1ha2VSZXF1ZXN0KG9wdGlvbnMsIG51bGwpO1xuICAgIHJldHVybiBuZXcgUGFnZVByb21pc2U8UGFnZUNsYXNzLCBJdGVtPih0aGlzLCByZXF1ZXN0LCBQYWdlKTtcbiAgfVxuXG4gIGJ1aWxkVVJMPFJlcT4ocGF0aDogc3RyaW5nLCBxdWVyeTogUmVxIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsID1cbiAgICAgIGlzQWJzb2x1dGVVUkwocGF0aCkgP1xuICAgICAgICBuZXcgVVJMKHBhdGgpXG4gICAgICA6IG5ldyBVUkwodGhpcy5iYXNlVVJMICsgKHRoaXMuYmFzZVVSTC5lbmRzV2l0aCgnLycpICYmIHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aC5zbGljZSgxKSA6IHBhdGgpKTtcblxuICAgIGNvbnN0IGRlZmF1bHRRdWVyeSA9IHRoaXMuZGVmYXVsdFF1ZXJ5KCk7XG4gICAgaWYgKCFpc0VtcHR5T2JqKGRlZmF1bHRRdWVyeSkpIHtcbiAgICAgIHF1ZXJ5ID0geyAuLi5kZWZhdWx0UXVlcnksIC4uLnF1ZXJ5IH0gYXMgUmVxO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnICYmIHF1ZXJ5ICYmICFBcnJheS5pc0FycmF5KHF1ZXJ5KSkge1xuICAgICAgdXJsLnNlYXJjaCA9IHRoaXMuc3RyaW5naWZ5UXVlcnkocXVlcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdHJpbmdpZnlRdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhxdWVyeSlcbiAgICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHJldHVybiBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsdWUpfWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT1gO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBHcm9xRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBzdHJpbmdpZnkgdHlwZSAke3R5cGVvZiB2YWx1ZX07IEV4cGVjdGVkIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvciBudWxsLiBJZiB5b3UgbmVlZCB0byBwYXNzIG5lc3RlZCBxdWVyeSBwYXJhbWV0ZXJzLCB5b3UgY2FuIG1hbnVhbGx5IGVuY29kZSB0aGVtLCBlLmcuIHsgcXVlcnk6IHsgJ2Zvb1trZXkxXSc6IHZhbHVlMSwgJ2Zvb1trZXkyXSc6IHZhbHVlMiB9IH0sIGFuZCBwbGVhc2Ugb3BlbiBhIEdpdEh1YiBpc3N1ZSByZXF1ZXN0aW5nIGJldHRlciBzdXBwb3J0IGZvciB5b3VyIHVzZSBjYXNlLmAsXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoV2l0aFRpbWVvdXQoXG4gICAgdXJsOiBSZXF1ZXN0SW5mbyxcbiAgICBpbml0OiBSZXF1ZXN0SW5pdCB8IHVuZGVmaW5lZCxcbiAgICBtczogbnVtYmVyLFxuICAgIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgc2lnbmFsLCAuLi5vcHRpb25zIH0gPSBpbml0IHx8IHt9O1xuICAgIGlmIChzaWduYWwpIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG5cbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIG1zKTtcblxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmdldFJlcXVlc3RDbGllbnQoKVxuICAgICAgICAvLyB1c2UgdW5kZWZpbmVkIHRoaXMgYmluZGluZzsgZmV0Y2ggZXJyb3JzIGlmIGJvdW5kIHRvIHNvbWV0aGluZyBlbHNlIGluIGJyb3dzZXIvY2xvdWRmbGFyZVxuICAgICAgICAuZmV0Y2guY2FsbCh1bmRlZmluZWQsIHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIGFzIGFueSwgLi4ub3B0aW9ucyB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0UmVxdWVzdENsaWVudCgpOiBSZXF1ZXN0Q2xpZW50IHtcbiAgICByZXR1cm4geyBmZXRjaDogdGhpcy5mZXRjaCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZXRyeShyZXNwb25zZTogUmVzcG9uc2UpOiBib29sZWFuIHtcbiAgICAvLyBOb3RlIHRoaXMgaXMgbm90IGEgc3RhbmRhcmQgaGVhZGVyLlxuICAgIGNvbnN0IHNob3VsZFJldHJ5SGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtc2hvdWxkLXJldHJ5Jyk7XG5cbiAgICAvLyBJZiB0aGUgc2VydmVyIGV4cGxpY2l0bHkgc2F5cyB3aGV0aGVyIG9yIG5vdCB0byByZXRyeSwgb2JleS5cbiAgICBpZiAoc2hvdWxkUmV0cnlIZWFkZXIgPT09ICd0cnVlJykgcmV0dXJuIHRydWU7XG4gICAgaWYgKHNob3VsZFJldHJ5SGVhZGVyID09PSAnZmFsc2UnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZXRyeSBvbiByZXF1ZXN0IHRpbWVvdXRzLlxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwOCkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBSZXRyeSBvbiBsb2NrIHRpbWVvdXRzLlxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwOSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBSZXRyeSBvbiByYXRlIGxpbWl0cy5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MjkpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gUmV0cnkgaW50ZXJuYWwgZXJyb3JzLlxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gNTAwKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmV0cnlSZXF1ZXN0KFxuICAgIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMsXG4gICAgcmV0cmllc1JlbWFpbmluZzogbnVtYmVyLFxuICAgIHJlc3BvbnNlSGVhZGVycz86IEhlYWRlcnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8QVBJUmVzcG9uc2VQcm9wcz4ge1xuICAgIGxldCB0aW1lb3V0TWlsbGlzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBOb3RlIHRoZSBgcmV0cnktYWZ0ZXItbXNgIGhlYWRlciBtYXkgbm90IGJlIHN0YW5kYXJkLCBidXQgaXMgYSBnb29kIGlkZWEgYW5kIHdlJ2QgbGlrZSBwcm9hY3RpdmUgc3VwcG9ydCBmb3IgaXQuXG4gICAgY29uc3QgcmV0cnlBZnRlck1pbGxpc0hlYWRlciA9IHJlc3BvbnNlSGVhZGVycz8uWydyZXRyeS1hZnRlci1tcyddO1xuICAgIGlmIChyZXRyeUFmdGVyTWlsbGlzSGVhZGVyKSB7XG4gICAgICBjb25zdCB0aW1lb3V0TXMgPSBwYXJzZUZsb2F0KHJldHJ5QWZ0ZXJNaWxsaXNIZWFkZXIpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4odGltZW91dE1zKSkge1xuICAgICAgICB0aW1lb3V0TWlsbGlzID0gdGltZW91dE1zO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFib3V0IHRoZSBSZXRyeS1BZnRlciBoZWFkZXI6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9SZXRyeS1BZnRlclxuICAgIGNvbnN0IHJldHJ5QWZ0ZXJIZWFkZXIgPSByZXNwb25zZUhlYWRlcnM/LlsncmV0cnktYWZ0ZXInXTtcbiAgICBpZiAocmV0cnlBZnRlckhlYWRlciAmJiAhdGltZW91dE1pbGxpcykge1xuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBwYXJzZUZsb2F0KHJldHJ5QWZ0ZXJIZWFkZXIpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4odGltZW91dFNlY29uZHMpKSB7XG4gICAgICAgIHRpbWVvdXRNaWxsaXMgPSB0aW1lb3V0U2Vjb25kcyAqIDEwMDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0TWlsbGlzID0gRGF0ZS5wYXJzZShyZXRyeUFmdGVySGVhZGVyKSAtIERhdGUubm93KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIEFQSSBhc2tzIHVzIHRvIHdhaXQgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lIChhbmQgaXQncyBhIHJlYXNvbmFibGUgYW1vdW50KSxcbiAgICAvLyBqdXN0IGRvIHdoYXQgaXQgc2F5cywgYnV0IG90aGVyd2lzZSBjYWxjdWxhdGUgYSBkZWZhdWx0XG4gICAgaWYgKCEodGltZW91dE1pbGxpcyAmJiAwIDw9IHRpbWVvdXRNaWxsaXMgJiYgdGltZW91dE1pbGxpcyA8IDYwICogMTAwMCkpIHtcbiAgICAgIGNvbnN0IG1heFJldHJpZXMgPSBvcHRpb25zLm1heFJldHJpZXMgPz8gdGhpcy5tYXhSZXRyaWVzO1xuICAgICAgdGltZW91dE1pbGxpcyA9IHRoaXMuY2FsY3VsYXRlRGVmYXVsdFJldHJ5VGltZW91dE1pbGxpcyhyZXRyaWVzUmVtYWluaW5nLCBtYXhSZXRyaWVzKTtcbiAgICB9XG4gICAgYXdhaXQgc2xlZXAodGltZW91dE1pbGxpcyk7XG5cbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChvcHRpb25zLCByZXRyaWVzUmVtYWluaW5nIC0gMSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZURlZmF1bHRSZXRyeVRpbWVvdXRNaWxsaXMocmV0cmllc1JlbWFpbmluZzogbnVtYmVyLCBtYXhSZXRyaWVzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGluaXRpYWxSZXRyeURlbGF5ID0gMC41O1xuICAgIGNvbnN0IG1heFJldHJ5RGVsYXkgPSA4LjA7XG5cbiAgICBjb25zdCBudW1SZXRyaWVzID0gbWF4UmV0cmllcyAtIHJldHJpZXNSZW1haW5pbmc7XG5cbiAgICAvLyBBcHBseSBleHBvbmVudGlhbCBiYWNrb2ZmLCBidXQgbm90IG1vcmUgdGhhbiB0aGUgbWF4LlxuICAgIGNvbnN0IHNsZWVwU2Vjb25kcyA9IE1hdGgubWluKGluaXRpYWxSZXRyeURlbGF5ICogTWF0aC5wb3coMiwgbnVtUmV0cmllcyksIG1heFJldHJ5RGVsYXkpO1xuXG4gICAgLy8gQXBwbHkgc29tZSBqaXR0ZXIsIHRha2UgdXAgdG8gYXQgbW9zdCAyNSBwZXJjZW50IG9mIHRoZSByZXRyeSB0aW1lLlxuICAgIGNvbnN0IGppdHRlciA9IDEgLSBNYXRoLnJhbmRvbSgpICogMC4yNTtcblxuICAgIHJldHVybiBzbGVlcFNlY29uZHMgKiBqaXR0ZXIgKiAxMDAwO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyQWdlbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS9KUyAke1ZFUlNJT059YDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBQYWdlSW5mbyA9IHsgdXJsOiBVUkwgfSB8IHsgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFnZTxJdGVtPiBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8SXRlbT4ge1xuICAjY2xpZW50OiBBUElDbGllbnQ7XG4gIHByb3RlY3RlZCBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zO1xuXG4gIHByb3RlY3RlZCByZXNwb25zZTogUmVzcG9uc2U7XG4gIHByb3RlY3RlZCBib2R5OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQVBJQ2xpZW50LCByZXNwb25zZTogUmVzcG9uc2UsIGJvZHk6IHVua25vd24sIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMpIHtcbiAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbmV4dFBhZ2VJbmZvIGluc3RlYWRcbiAgICovXG4gIGFic3RyYWN0IG5leHRQYWdlUGFyYW1zKCk6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgbnVsbDtcbiAgYWJzdHJhY3QgbmV4dFBhZ2VJbmZvKCk6IFBhZ2VJbmZvIHwgbnVsbDtcblxuICBhYnN0cmFjdCBnZXRQYWdpbmF0ZWRJdGVtcygpOiBJdGVtW107XG5cbiAgaGFzTmV4dFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldFBhZ2luYXRlZEl0ZW1zKCk7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5uZXh0UGFnZUluZm8oKSAhPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgZ2V0TmV4dFBhZ2UoKTogUHJvbWlzZTx0aGlzPiB7XG4gICAgY29uc3QgbmV4dEluZm8gPSB0aGlzLm5leHRQYWdlSW5mbygpO1xuICAgIGlmICghbmV4dEluZm8pIHtcbiAgICAgIHRocm93IG5ldyBHcm9xRXJyb3IoXG4gICAgICAgICdObyBuZXh0IHBhZ2UgZXhwZWN0ZWQ7IHBsZWFzZSBjaGVjayBgLmhhc05leHRQYWdlKClgIGJlZm9yZSBjYWxsaW5nIGAuZ2V0TmV4dFBhZ2UoKWAuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG5leHRPcHRpb25zID0geyAuLi50aGlzLm9wdGlvbnMgfTtcbiAgICBpZiAoJ3BhcmFtcycgaW4gbmV4dEluZm8gJiYgdHlwZW9mIG5leHRPcHRpb25zLnF1ZXJ5ID09PSAnb2JqZWN0Jykge1xuICAgICAgbmV4dE9wdGlvbnMucXVlcnkgPSB7IC4uLm5leHRPcHRpb25zLnF1ZXJ5LCAuLi5uZXh0SW5mby5wYXJhbXMgfTtcbiAgICB9IGVsc2UgaWYgKCd1cmwnIGluIG5leHRJbmZvKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBbLi4uT2JqZWN0LmVudHJpZXMobmV4dE9wdGlvbnMucXVlcnkgfHwge30pLCAuLi5uZXh0SW5mby51cmwuc2VhcmNoUGFyYW1zLmVudHJpZXMoKV07XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBwYXJhbXMpIHtcbiAgICAgICAgbmV4dEluZm8udXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSBhcyBhbnkpO1xuICAgICAgfVxuICAgICAgbmV4dE9wdGlvbnMucXVlcnkgPSB1bmRlZmluZWQ7XG4gICAgICBuZXh0T3B0aW9ucy5wYXRoID0gbmV4dEluZm8udXJsLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQucmVxdWVzdEFQSUxpc3QodGhpcy5jb25zdHJ1Y3RvciBhcyBhbnksIG5leHRPcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jICppdGVyUGFnZXMoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgbGV0IHBhZ2U6IEFic3RyYWN0UGFnZTxJdGVtPiA9IHRoaXM7XG4gICAgeWllbGQgcGFnZTtcbiAgICB3aGlsZSAocGFnZS5oYXNOZXh0UGFnZSgpKSB7XG4gICAgICBwYWdlID0gYXdhaXQgcGFnZS5nZXROZXh0UGFnZSgpO1xuICAgICAgeWllbGQgcGFnZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHBhZ2Ugb2YgdGhpcy5pdGVyUGFnZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhZ2UuZ2V0UGFnaW5hdGVkSXRlbXMoKSkge1xuICAgICAgICB5aWVsZCBpdGVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgc3ViY2xhc3Mgb2YgUHJvbWlzZSB3aWxsIHJlc29sdmUgdG8gYW4gaW5zdGFudGlhdGVkIFBhZ2Ugb25jZSB0aGUgcmVxdWVzdCBjb21wbGV0ZXMuXG4gKlxuICogSXQgYWxzbyBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGUgdG8gYWxsb3cgYXV0by1wYWdpbmF0aW5nIGl0ZXJhdGlvbiBvbiBhbiB1bmF3YWl0ZWQgbGlzdCBjYWxsLCBlZzpcbiAqXG4gKiAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgY2xpZW50Lml0ZW1zLmxpc3QoKSkge1xuICogICAgICBjb25zb2xlLmxvZyhpdGVtKVxuICogICAgfVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVByb21pc2U8XG4gICAgUGFnZUNsYXNzIGV4dGVuZHMgQWJzdHJhY3RQYWdlPEl0ZW0+LFxuICAgIEl0ZW0gPSBSZXR1cm5UeXBlPFBhZ2VDbGFzc1snZ2V0UGFnaW5hdGVkSXRlbXMnXT5bbnVtYmVyXSxcbiAgPlxuICBleHRlbmRzIEFQSVByb21pc2U8UGFnZUNsYXNzPlxuICBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8SXRlbT5cbntcbiAgY29uc3RydWN0b3IoXG4gICAgY2xpZW50OiBBUElDbGllbnQsXG4gICAgcmVxdWVzdDogUHJvbWlzZTxBUElSZXNwb25zZVByb3BzPixcbiAgICBQYWdlOiBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgQWJzdHJhY3RQYWdlPikgPT4gUGFnZUNsYXNzLFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIHJlcXVlc3QsXG4gICAgICBhc3luYyAocHJvcHMpID0+IG5ldyBQYWdlKGNsaWVudCwgcHJvcHMucmVzcG9uc2UsIGF3YWl0IGRlZmF1bHRQYXJzZVJlc3BvbnNlKHByb3BzKSwgcHJvcHMub3B0aW9ucyksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBhdXRvLXBhZ2luYXRpbmcgaXRlcmF0aW9uIG9uIGFuIHVuYXdhaXRlZCBsaXN0IGNhbGwsIGVnOlxuICAgKlxuICAgKiAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgY2xpZW50Lml0ZW1zLmxpc3QoKSkge1xuICAgKiAgICAgIGNvbnNvbGUubG9nKGl0ZW0pXG4gICAqICAgIH1cbiAgICovXG4gIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzO1xuICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBwYWdlKSB7XG4gICAgICB5aWVsZCBpdGVtO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVzcG9uc2VIZWFkZXJzID0gKFxuICBoZWFkZXJzOiBBd2FpdGVkPFJldHVyblR5cGU8RmV0Y2g+PlsnaGVhZGVycyddLFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJveHkoXG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgaGVhZGVycy5lbnRyaWVzKCksXG4gICAgKSxcbiAgICB7XG4gICAgICBnZXQodGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG5hbWUudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtrZXkudG9Mb3dlckNhc2UoKV0gfHwgdGFyZ2V0W2tleV07XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG59O1xuXG50eXBlIEhUVFBNZXRob2QgPSAnZ2V0JyB8ICdwb3N0JyB8ICdwdXQnIHwgJ3BhdGNoJyB8ICdkZWxldGUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0Q2xpZW50ID0geyBmZXRjaDogRmV0Y2ggfTtcbmV4cG9ydCB0eXBlIEhlYWRlcnMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPjtcbmV4cG9ydCB0eXBlIERlZmF1bHRRdWVyeSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5leHBvcnQgdHlwZSBLZXlzRW51bTxUPiA9IHsgW1AgaW4ga2V5b2YgUmVxdWlyZWQ8VD5dOiB0cnVlIH07XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RPcHRpb25zPFJlcSA9IHVua25vd24gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFJlYWRhYmxlPiA9IHtcbiAgbWV0aG9kPzogSFRUUE1ldGhvZDtcbiAgcGF0aD86IHN0cmluZztcbiAgcXVlcnk/OiBSZXEgfCB1bmRlZmluZWQ7XG4gIGJvZHk/OiBSZXEgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBoZWFkZXJzPzogSGVhZGVycyB8IHVuZGVmaW5lZDtcblxuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICBzdHJlYW0/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBodHRwQWdlbnQ/OiBBZ2VudDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQgfCBudWxsO1xuICBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcblxuICBfX2JpbmFyeVJlc3BvbnNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgX19zdHJlYW1DbGFzcz86IHR5cGVvZiBTdHJlYW07XG59O1xuXG4vLyBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBpZiBhIGdpdmVuIG9iamVjdCBtYXRjaGVzIHRoZSBSZXF1ZXN0T3B0aW9uc1xuLy8gdHlwZSBhdCBydW50aW1lLiBXaGlsZSB0aGlzIHJlcXVpcmVzIGR1cGxpY2F0aW9uLCBpdCBpcyBlbmZvcmNlZCBieSB0aGUgVHlwZVNjcmlwdFxuLy8gY29tcGlsZXIgc3VjaCB0aGF0IGFueSBtaXNzaW5nIC8gZXh0cmFuZW91cyBrZXlzIHdpbGwgY2F1c2UgYW4gZXJyb3IuXG5jb25zdCByZXF1ZXN0T3B0aW9uc0tleXM6IEtleXNFbnVtPFJlcXVlc3RPcHRpb25zPiA9IHtcbiAgbWV0aG9kOiB0cnVlLFxuICBwYXRoOiB0cnVlLFxuICBxdWVyeTogdHJ1ZSxcbiAgYm9keTogdHJ1ZSxcbiAgaGVhZGVyczogdHJ1ZSxcblxuICBtYXhSZXRyaWVzOiB0cnVlLFxuICBzdHJlYW06IHRydWUsXG4gIHRpbWVvdXQ6IHRydWUsXG4gIGh0dHBBZ2VudDogdHJ1ZSxcbiAgc2lnbmFsOiB0cnVlLFxuICBpZGVtcG90ZW5jeUtleTogdHJ1ZSxcblxuICBfX2JpbmFyeVJlc3BvbnNlOiB0cnVlLFxuICBfX3N0cmVhbUNsYXNzOiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVxdWVzdE9wdGlvbnMgPSAob2JqOiB1bmtub3duKTogb2JqIGlzIFJlcXVlc3RPcHRpb25zID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJlxuICAgIG9iaiAhPT0gbnVsbCAmJlxuICAgICFpc0VtcHR5T2JqKG9iaikgJiZcbiAgICBPYmplY3Qua2V5cyhvYmopLmV2ZXJ5KChrKSA9PiBoYXNPd24ocmVxdWVzdE9wdGlvbnNLZXlzLCBrKSlcbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbmFsUmVxdWVzdE9wdGlvbnM8UmVxID0gdW5rbm93biB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgUmVhZGFibGU+ID0gUmVxdWVzdE9wdGlvbnM8UmVxPiAmIHtcbiAgbWV0aG9kOiBIVFRQTWV0aG9kO1xuICBwYXRoOiBzdHJpbmc7XG59O1xuXG5kZWNsYXJlIGNvbnN0IERlbm86IGFueTtcbmRlY2xhcmUgY29uc3QgRWRnZVJ1bnRpbWU6IGFueTtcbnR5cGUgQXJjaCA9ICd4MzInIHwgJ3g2NCcgfCAnYXJtJyB8ICdhcm02NCcgfCBgb3RoZXI6JHtzdHJpbmd9YCB8ICd1bmtub3duJztcbnR5cGUgUGxhdGZvcm1OYW1lID1cbiAgfCAnTWFjT1MnXG4gIHwgJ0xpbnV4J1xuICB8ICdXaW5kb3dzJ1xuICB8ICdGcmVlQlNEJ1xuICB8ICdPcGVuQlNEJ1xuICB8ICdpT1MnXG4gIHwgJ0FuZHJvaWQnXG4gIHwgYE90aGVyOiR7c3RyaW5nfWBcbiAgfCAnVW5rbm93bic7XG50eXBlIEJyb3dzZXIgPSAnaWUnIHwgJ2VkZ2UnIHwgJ2Nocm9tZScgfCAnZmlyZWZveCcgfCAnc2FmYXJpJztcbnR5cGUgUGxhdGZvcm1Qcm9wZXJ0aWVzID0ge1xuICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcyc7XG4gICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBzdHJpbmc7XG4gICdYLVN0YWlubGVzcy1PUyc6IFBsYXRmb3JtTmFtZTtcbiAgJ1gtU3RhaW5sZXNzLUFyY2gnOiBBcmNoO1xuICAnWC1TdGFpbmxlc3MtUnVudGltZSc6ICdub2RlJyB8ICdkZW5vJyB8ICdlZGdlJyB8IGBicm93c2VyOiR7QnJvd3Nlcn1gIHwgJ3Vua25vd24nO1xuICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzogc3RyaW5nO1xufTtcbmNvbnN0IGdldFBsYXRmb3JtUHJvcGVydGllcyA9ICgpOiBQbGF0Zm9ybVByb3BlcnRpZXMgPT4ge1xuICBpZiAodHlwZW9mIERlbm8gIT09ICd1bmRlZmluZWQnICYmIERlbm8uYnVpbGQgIT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcycsXG4gICAgICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogVkVSU0lPTixcbiAgICAgICdYLVN0YWlubGVzcy1PUyc6IG5vcm1hbGl6ZVBsYXRmb3JtKERlbm8uYnVpbGQub3MpLFxuICAgICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiBub3JtYWxpemVBcmNoKERlbm8uYnVpbGQuYXJjaCksXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZSc6ICdkZW5vJyxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lLVZlcnNpb24nOiBEZW5vLnZlcnNpb24sXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZW9mIEVkZ2VSdW50aW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB7XG4gICAgICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcycsXG4gICAgICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogVkVSU0lPTixcbiAgICAgICdYLVN0YWlubGVzcy1PUyc6ICdVbmtub3duJyxcbiAgICAgICdYLVN0YWlubGVzcy1BcmNoJzogYG90aGVyOiR7RWRnZVJ1bnRpbWV9YCxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lJzogJ2VkZ2UnLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6IHByb2Nlc3MudmVyc2lvbixcbiAgICB9O1xuICB9XG4gIC8vIENoZWNrIGlmIE5vZGUuanNcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzIDogMCkgPT09ICdbb2JqZWN0IHByb2Nlc3NdJykge1xuICAgIHJldHVybiB7XG4gICAgICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcycsXG4gICAgICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogVkVSU0lPTixcbiAgICAgICdYLVN0YWlubGVzcy1PUyc6IG5vcm1hbGl6ZVBsYXRmb3JtKHByb2Nlc3MucGxhdGZvcm0pLFxuICAgICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiBub3JtYWxpemVBcmNoKHByb2Nlc3MuYXJjaCksXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZSc6ICdub2RlJyxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lLVZlcnNpb24nOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGJyb3dzZXJJbmZvID0gZ2V0QnJvd3NlckluZm8oKTtcbiAgaWYgKGJyb3dzZXJJbmZvKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICAgJ1gtU3RhaW5sZXNzLU9TJzogJ1Vua25vd24nLFxuICAgICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiAndW5rbm93bicsXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZSc6IGBicm93c2VyOiR7YnJvd3NlckluZm8uYnJvd3Nlcn1gLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6IGJyb3dzZXJJbmZvLnZlcnNpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRPRE8gYWRkIHN1cHBvcnQgZm9yIENsb3VkZmxhcmUgd29ya2VycywgZXRjLlxuICByZXR1cm4ge1xuICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogVkVSU0lPTixcbiAgICAnWC1TdGFpbmxlc3MtT1MnOiAnVW5rbm93bicsXG4gICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiAndW5rbm93bicsXG4gICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUnOiAndW5rbm93bicsXG4gICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6ICd1bmtub3duJyxcbiAgfTtcbn07XG5cbnR5cGUgQnJvd3NlckluZm8gPSB7XG4gIGJyb3dzZXI6IEJyb3dzZXI7XG4gIHZlcnNpb246IHN0cmluZztcbn07XG5cbmRlY2xhcmUgY29uc3QgbmF2aWdhdG9yOiB7IHVzZXJBZ2VudDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5cbi8vIE5vdGU6IG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0pTLURldlRvb2xzL2hvc3QtZW52aXJvbm1lbnQvYmxvYi9iMWFiNzllY2RlMzdkYjVkNmUxNjNjMDUwZTU0ZmU3ZDI4N2Q3YzkyL3NyYy9pc29tb3JwaGljLmJyb3dzZXIudHNcbmZ1bmN0aW9uIGdldEJyb3dzZXJJbmZvKCk6IEJyb3dzZXJJbmZvIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAhbmF2aWdhdG9yKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBOT1RFOiBUaGUgb3JkZXIgbWF0dGVycyBoZXJlIVxuICBjb25zdCBicm93c2VyUGF0dGVybnMgPSBbXG4gICAgeyBrZXk6ICdlZGdlJyBhcyBjb25zdCwgcGF0dGVybjogL0VkZ2UoPzpcXFcrKFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPy8gfSxcbiAgICB7IGtleTogJ2llJyBhcyBjb25zdCwgcGF0dGVybjogL01TSUUoPzpcXFcrKFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPy8gfSxcbiAgICB7IGtleTogJ2llJyBhcyBjb25zdCwgcGF0dGVybjogL1RyaWRlbnQoPzouKnJ2XFw6KFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPy8gfSxcbiAgICB7IGtleTogJ2Nocm9tZScgYXMgY29uc3QsIHBhdHRlcm46IC9DaHJvbWUoPzpcXFcrKFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPy8gfSxcbiAgICB7IGtleTogJ2ZpcmVmb3gnIGFzIGNvbnN0LCBwYXR0ZXJuOiAvRmlyZWZveCg/OlxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnc2FmYXJpJyBhcyBjb25zdCwgcGF0dGVybjogLyg/OlZlcnNpb25cXFcrKFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPyg/OlxcVytNb2JpbGVcXFMqKT9cXFcrU2FmYXJpLyB9LFxuICBdO1xuXG4gIC8vIEZpbmQgdGhlIEZJUlNUIG1hdGNoaW5nIGJyb3dzZXJcbiAgZm9yIChjb25zdCB7IGtleSwgcGF0dGVybiB9IG9mIGJyb3dzZXJQYXR0ZXJucykge1xuICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgbWFqb3IgPSBtYXRjaFsxXSB8fCAwO1xuICAgICAgY29uc3QgbWlub3IgPSBtYXRjaFsyXSB8fCAwO1xuICAgICAgY29uc3QgcGF0Y2ggPSBtYXRjaFszXSB8fCAwO1xuXG4gICAgICByZXR1cm4geyBicm93c2VyOiBrZXksIHZlcnNpb246IGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofWAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3Qgbm9ybWFsaXplQXJjaCA9IChhcmNoOiBzdHJpbmcpOiBBcmNoID0+IHtcbiAgLy8gTm9kZSBkb2NzOlxuICAvLyAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NhcmNoXG4gIC8vIERlbm8gZG9jczpcbiAgLy8gLSBodHRwczovL2RvYy5kZW5vLmxhbmQvZGVuby9zdGFibGUvfi9EZW5vLmJ1aWxkXG4gIGlmIChhcmNoID09PSAneDMyJykgcmV0dXJuICd4MzInO1xuICBpZiAoYXJjaCA9PT0gJ3g4Nl82NCcgfHwgYXJjaCA9PT0gJ3g2NCcpIHJldHVybiAneDY0JztcbiAgaWYgKGFyY2ggPT09ICdhcm0nKSByZXR1cm4gJ2FybSc7XG4gIGlmIChhcmNoID09PSAnYWFyY2g2NCcgfHwgYXJjaCA9PT0gJ2FybTY0JykgcmV0dXJuICdhcm02NCc7XG4gIGlmIChhcmNoKSByZXR1cm4gYG90aGVyOiR7YXJjaH1gO1xuICByZXR1cm4gJ3Vua25vd24nO1xufTtcblxuY29uc3Qgbm9ybWFsaXplUGxhdGZvcm0gPSAocGxhdGZvcm06IHN0cmluZyk6IFBsYXRmb3JtTmFtZSA9PiB7XG4gIC8vIE5vZGUgcGxhdGZvcm1zOlxuICAvLyAtIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NwbGF0Zm9ybVxuICAvLyBEZW5vIHBsYXRmb3JtczpcbiAgLy8gLSBodHRwczovL2RvYy5kZW5vLmxhbmQvZGVuby9zdGFibGUvfi9EZW5vLmJ1aWxkXG4gIC8vIC0gaHR0cHM6Ly9naXRodWIuY29tL2Rlbm9sYW5kL2Rlbm8vaXNzdWVzLzE0Nzk5XG5cbiAgcGxhdGZvcm0gPSBwbGF0Zm9ybS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIE5PVEU6IHRoaXMgaU9TIGNoZWNrIGlzIHVudGVzdGVkIGFuZCBtYXkgbm90IHdvcmtcbiAgLy8gTm9kZSBkb2VzIG5vdCB3b3JrIG5hdGl2ZWx5IG9uIElPUywgdGhlcmUgaXMgYSBmb3JrIGF0XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMtbW9iaWxlL25vZGVqcy1tb2JpbGVcbiAgLy8gaG93ZXZlciBpdCBpcyB1bmtub3duIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcgaG93IHRvIGRldGVjdCBpZiBpdCBpcyBydW5uaW5nXG4gIGlmIChwbGF0Zm9ybS5pbmNsdWRlcygnaW9zJykpIHJldHVybiAnaU9TJztcbiAgaWYgKHBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHJldHVybiAnQW5kcm9pZCc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHJldHVybiAnTWFjT1MnO1xuICBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicpIHJldHVybiAnV2luZG93cyc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ2ZyZWVic2QnKSByZXR1cm4gJ0ZyZWVCU0QnO1xuICBpZiAocGxhdGZvcm0gPT09ICdvcGVuYnNkJykgcmV0dXJuICdPcGVuQlNEJztcbiAgaWYgKHBsYXRmb3JtID09PSAnbGludXgnKSByZXR1cm4gJ0xpbnV4JztcbiAgaWYgKHBsYXRmb3JtKSByZXR1cm4gYE90aGVyOiR7cGxhdGZvcm19YDtcbiAgcmV0dXJuICdVbmtub3duJztcbn07XG5cbmxldCBfcGxhdGZvcm1IZWFkZXJzOiBQbGF0Zm9ybVByb3BlcnRpZXM7XG5jb25zdCBnZXRQbGF0Zm9ybUhlYWRlcnMgPSAoKSA9PiB7XG4gIHJldHVybiAoX3BsYXRmb3JtSGVhZGVycyA/Pz0gZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNhZmVKU09OID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59O1xuXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTk3MDk4NDZcbmNvbnN0IHN0YXJ0c1dpdGhTY2hlbWVSZWdleHAgPSBuZXcgUmVnRXhwKCdeKD86W2Etel0rOik/Ly8nLCAnaScpO1xuY29uc3QgaXNBYnNvbHV0ZVVSTCA9ICh1cmw6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gc3RhcnRzV2l0aFNjaGVtZVJlZ2V4cC50ZXN0KHVybCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcblxuY29uc3QgdmFsaWRhdGVQb3NpdGl2ZUludGVnZXIgPSAobmFtZTogc3RyaW5nLCBuOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihuKSkge1xuICAgIHRocm93IG5ldyBHcm9xRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhbiBpbnRlZ2VyYCk7XG4gIH1cbiAgaWYgKG4gPCAwKSB7XG4gICAgdGhyb3cgbmV3IEdyb3FFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIHJldHVybiBuO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhc3RUb0Vycm9yID0gKGVycjogYW55KTogRXJyb3IgPT4ge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBlcnI7XG4gIHJldHVybiBuZXcgRXJyb3IoZXJyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbnN1cmVQcmVzZW50ID0gPFQ+KHZhbHVlOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFQgPT4ge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IEdyb3FFcnJvcihgRXhwZWN0ZWQgYSB2YWx1ZSB0byBiZSBnaXZlbiBidXQgcmVjZWl2ZWQgJHt2YWx1ZX0gaW5zdGVhZC5gKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBSZWFkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIFRyaW1zIGJlZ2lubmluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAqXG4gKiBXaWxsIHJldHVybiB1bmRlZmluZWQgaWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2Fubm90IGJlIGFjY2Vzc2VkLlxuICovXG5leHBvcnQgY29uc3QgcmVhZEVudiA9IChlbnY6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnY/LltlbnZdPy50cmltKCkgPz8gdW5kZWZpbmVkO1xuICB9XG4gIGlmICh0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gRGVuby5lbnY/LmdldD8uKGVudik/LnRyaW0oKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvZXJjZUludGVnZXIgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIE1hdGgucm91bmQodmFsdWUpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG5cbiAgdGhyb3cgbmV3IEdyb3FFcnJvcihgQ291bGQgbm90IGNvZXJjZSAke3ZhbHVlfSAodHlwZTogJHt0eXBlb2YgdmFsdWV9KSBpbnRvIGEgbnVtYmVyYCk7XG59O1xuXG5leHBvcnQgY29uc3QgY29lcmNlRmxvYXQgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gIHRocm93IG5ldyBHcm9xRXJyb3IoYENvdWxkIG5vdCBjb2VyY2UgJHt2YWx1ZX0gKHR5cGU6ICR7dHlwZW9mIHZhbHVlfSkgaW50byBhIG51bWJlcmApO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvZXJjZUJvb2xlYW4gPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlQ29lcmNlSW50ZWdlciA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY29lcmNlSW50ZWdlcih2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbWF5YmVDb2VyY2VGbG9hdCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY29lcmNlRmxvYXQodmFsdWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heWJlQ29lcmNlQm9vbGVhbiA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNvZXJjZUJvb2xlYW4odmFsdWUpO1xufTtcblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM0NDkxMjg3XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eU9iaihvYmo6IE9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFvYmopIHJldHVybiB0cnVlO1xuICBmb3IgKGNvbnN0IF9rIGluIG9iaikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gaHR0cHM6Ly9lc2xpbnQub3JnL2RvY3MvbGF0ZXN0L3J1bGVzL25vLXByb3RvdHlwZS1idWlsdGluc1xuZXhwb3J0IGZ1bmN0aW9uIGhhc093bihvYmo6IE9iamVjdCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbi8qKlxuICogQ29waWVzIGhlYWRlcnMgZnJvbSBcIm5ld0hlYWRlcnNcIiBvbnRvIFwidGFyZ2V0SGVhZGVyc1wiLFxuICogdXNpbmcgbG93ZXItY2FzZSBmb3IgYWxsIHByb3BlcnRpZXMsXG4gKiBpZ25vcmluZyBhbnkga2V5cyB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMsXG4gKiBhbmQgZGVsZXRpbmcgYW55IGtleXMgd2l0aCBudWxsIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlIZWFkZXJzTXV0KHRhcmdldEhlYWRlcnM6IEhlYWRlcnMsIG5ld0hlYWRlcnM6IEhlYWRlcnMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrIGluIG5ld0hlYWRlcnMpIHtcbiAgICBpZiAoIWhhc093bihuZXdIZWFkZXJzLCBrKSkgY29udGludWU7XG4gICAgY29uc3QgbG93ZXJLZXkgPSBrLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFsb3dlcktleSkgY29udGludWU7XG5cbiAgICBjb25zdCB2YWwgPSBuZXdIZWFkZXJzW2tdO1xuXG4gICAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgZGVsZXRlIHRhcmdldEhlYWRlcnNbbG93ZXJLZXldO1xuICAgIH0gZWxzZSBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldEhlYWRlcnNbbG93ZXJLZXldID0gdmFsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVidWcoYWN0aW9uOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnZbJ0RFQlVHJ10gPT09ICd0cnVlJykge1xuICAgIGNvbnNvbGUubG9nKGBHcm9xOkRFQlVHOiR7YWN0aW9ufWAsIC4uLmFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIxMTc1MjNcbiAqL1xuY29uc3QgdXVpZDQgPSAoKSA9PiB7XG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUnVubmluZ0luQnJvd3NlciA9ICgpID0+IHtcbiAgcmV0dXJuIChcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyc1Byb3RvY29sIHtcbiAgZ2V0OiAoaGVhZGVyOiBzdHJpbmcpID0+IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG59XG5leHBvcnQgdHlwZSBIZWFkZXJzTGlrZSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB8IEhlYWRlcnNQcm90b2NvbDtcblxuZXhwb3J0IGNvbnN0IGlzSGVhZGVyc1Byb3RvY29sID0gKGhlYWRlcnM6IGFueSk6IGhlYWRlcnMgaXMgSGVhZGVyc1Byb3RvY29sID0+IHtcbiAgcmV0dXJuIHR5cGVvZiBoZWFkZXJzPy5nZXQgPT09ICdmdW5jdGlvbic7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVxdWlyZWRIZWFkZXIgPSAoaGVhZGVyczogSGVhZGVyc0xpa2UsIGhlYWRlcjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbG93ZXJDYXNlZEhlYWRlciA9IGhlYWRlci50b0xvd2VyQ2FzZSgpO1xuICBpZiAoaXNIZWFkZXJzUHJvdG9jb2woaGVhZGVycykpIHtcbiAgICAvLyB0byBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgdGhlIGhlYWRlciBsb29rcyBsaWtlIFN0YWlubGVzcy1FdmVudC1JZFxuICAgIGNvbnN0IGludGVyY2Fwc0hlYWRlciA9XG4gICAgICBoZWFkZXJbMF0/LnRvVXBwZXJDYXNlKCkgK1xuICAgICAgaGVhZGVyLnN1YnN0cmluZygxKS5yZXBsYWNlKC8oW15cXHddKShcXHcpL2csIChfbSwgZzEsIGcyKSA9PiBnMSArIGcyLnRvVXBwZXJDYXNlKCkpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIFtoZWFkZXIsIGxvd2VyQ2FzZWRIZWFkZXIsIGhlYWRlci50b1VwcGVyQ2FzZSgpLCBpbnRlcmNhcHNIZWFkZXJdKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGhlYWRlcnMuZ2V0KGtleSk7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSBsb3dlckNhc2VkSGVhZGVyKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8PSAxKSByZXR1cm4gdmFsdWVbMF07XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVjZWl2ZWQgJHt2YWx1ZS5sZW5ndGh9IGVudHJpZXMgZm9yIHRoZSAke2hlYWRlcn0gaGVhZGVyLCB1c2luZyB0aGUgZmlyc3QgZW50cnkuYCk7XG4gICAgICAgIHJldHVybiB2YWx1ZVswXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kICR7aGVhZGVyfSBoZWFkZXJgKTtcbn07XG5cbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyB0byBCYXNlNjQgZm9ybWF0LlxuICovXG5leHBvcnQgY29uc3QgdG9CYXNlNjQgPSAoc3RyOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBidG9hICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBidG9hKHN0cik7XG4gIH1cblxuICB0aHJvdyBuZXcgR3JvcUVycm9yKCdDYW5ub3QgZ2VuZXJhdGUgYjY0IHN0cmluZzsgRXhwZWN0ZWQgYEJ1ZmZlcmAgb3IgYGJ0b2FgIHRvIGJlIGRlZmluZWQnKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iaihvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLlxuXG5pbXBvcnQgdHlwZSB7IEdyb3EgfSBmcm9tICcuL2luZGV4JztcblxuZXhwb3J0IGNsYXNzIEFQSVJlc291cmNlIHtcbiAgcHJvdGVjdGVkIF9jbGllbnQ6IEdyb3E7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBHcm9xKSB7XG4gICAgdGhpcy5fY2xpZW50ID0gY2xpZW50O1xuICB9XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gXCIuL2NvbXBsZXRpb25zXCI7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tIFwiLi4vLi4vbGliL3N0cmVhbWluZ1wiO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25DaHVuayB9IGZyb20gXCIuLi8uLi9saWIvY2hhdF9jb21wbGV0aW9uc19leHRcIjtcblxuZXhwb3J0IGNsYXNzIENvbXBsZXRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNvbXBsZXRpb24gZm9yIGEgY2hhdCBwcm9tcHRcbiAgICovXG4gIGNyZWF0ZShcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPENoYXRDb21wbGV0aW9uPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8U3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+PjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPiB8IENoYXRDb21wbGV0aW9uPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8Q2hhdENvbXBsZXRpb24+IHwgQ29yZS5BUElQcm9taXNlPFN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL29wZW5haS92MS9jaGF0L2NvbXBsZXRpb25zJywgeyBib2R5LCAuLi5vcHRpb25zLCBzdHJlYW06IGJvZHkuc3RyZWFtID8/IGZhbHNlIH0pIGFzXG4gICAgICB8IENvcmUuQVBJUHJvbWlzZTxDaGF0Q29tcGxldGlvbj5cbiAgICAgIHwgQ29yZS5BUElQcm9taXNlPFN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPj47XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbiB7XG4gIGNob2ljZXM6IEFycmF5PENoYXRDb21wbGV0aW9uLkNob2ljZT47XG5cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgY3JlYXRlZD86IG51bWJlcjtcblxuICBtb2RlbD86IHN0cmluZztcblxuICBvYmplY3Q/OiBzdHJpbmc7XG5cbiAgc3lzdGVtX2ZpbmdlcnByaW50Pzogc3RyaW5nO1xuXG4gIHVzYWdlPzogQ2hhdENvbXBsZXRpb24uVXNhZ2U7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb24ge1xuICBleHBvcnQgaW50ZXJmYWNlIENob2ljZSB7XG4gICAgZmluaXNoX3JlYXNvbjogc3RyaW5nO1xuXG4gICAgaW5kZXg6IG51bWJlcjtcblxuICAgIGxvZ3Byb2JzOiBDaG9pY2UuTG9ncHJvYnM7XG5cbiAgICBtZXNzYWdlOiBDaG9pY2UuTWVzc2FnZTtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQ2hvaWNlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIExvZ3Byb2JzIHtcbiAgICAgIGNvbnRlbnQ/OiBBcnJheTxMb2dwcm9icy5Db250ZW50PjtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIExvZ3Byb2JzIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29udGVudCB7XG4gICAgICAgIHRva2VuPzogc3RyaW5nO1xuXG4gICAgICAgIGJ5dGVzPzogQXJyYXk8bnVtYmVyPjtcblxuICAgICAgICBsb2dwcm9iPzogbnVtYmVyO1xuXG4gICAgICAgIHRvcF9sb2dwcm9icz86IEFycmF5PENvbnRlbnQuVG9wTG9ncHJvYj47XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBuYW1lc3BhY2UgQ29udGVudCB7XG4gICAgICAgIGV4cG9ydCBpbnRlcmZhY2UgVG9wTG9ncHJvYiB7XG4gICAgICAgICAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgICAgICAgICBieXRlcz86IEFycmF5PG51bWJlcj47XG5cbiAgICAgICAgICBsb2dwcm9iPzogbnVtYmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgICAgIGNvbnRlbnQ6IHN0cmluZztcblxuICAgICAgcm9sZTogc3RyaW5nO1xuXG4gICAgICB0b29sX2NhbGxzPzogQXJyYXk8TWVzc2FnZS5Ub29sQ2FsbD47XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgVG9vbENhbGwge1xuICAgICAgICBpZD86IHN0cmluZztcblxuICAgICAgICBmdW5jdGlvbj86IFRvb2xDYWxsLkZ1bmN0aW9uO1xuXG4gICAgICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBuYW1lc3BhY2UgVG9vbENhbGwge1xuICAgICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAgICAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBVc2FnZSB7XG4gICAgY29tcGxldGlvbl90aW1lPzogbnVtYmVyO1xuXG4gICAgY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXI7XG5cbiAgICBwcm9tcHRfdGltZT86IG51bWJlcjtcblxuICAgIHByb21wdF90b2tlbnM/OiBudW1iZXI7XG5cbiAgICBxdWV1ZV90aW1lPzogbnVtYmVyO1xuXG4gICAgdG90YWxfdGltZT86IG51bWJlcjtcblxuICAgIHRvdGFsX3Rva2Vucz86IG51bWJlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIG1lc3NhZ2VzOiBBcnJheTxDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLk1lc3NhZ2U+O1xuXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgZnJlcXVlbmN5X3BlbmFsdHk/OiBudW1iZXI7XG5cbiAgbG9naXRfYmlhcz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG5cbiAgbG9ncHJvYnM/OiBib29sZWFuO1xuXG4gIG1heF90b2tlbnM/OiBudW1iZXI7XG5cbiAgbj86IG51bWJlcjtcblxuICBwcmVzZW5jZV9wZW5hbHR5PzogbnVtYmVyO1xuXG4gIHJlc3BvbnNlX2Zvcm1hdD86IENvbXBsZXRpb25DcmVhdGVQYXJhbXMuUmVzcG9uc2VGb3JtYXQ7XG5cbiAgc2VlZD86IG51bWJlcjtcblxuICAvKipcbiAgICogVXAgdG8gNCBzZXF1ZW5jZXMgd2hlcmUgdGhlIEFQSSB3aWxsIHN0b3AgZ2VuZXJhdGluZyBmdXJ0aGVyIHRva2Vucy4gVGhlXG4gICAqIHJldHVybmVkIHRleHQgd2lsbCBub3QgY29udGFpbiB0aGUgc3RvcCBzZXF1ZW5jZS5cbiAgICovXG4gIHN0b3A/OiBzdHJpbmcgfCBudWxsIHwgQXJyYXk8c3RyaW5nPjtcblxuICBzdHJlYW0/OiBib29sZWFuO1xuXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuXG4gIHRvb2xfY2hvaWNlPzogQ29tcGxldGlvbkNyZWF0ZVBhcmFtcy5Ub29sQ2hvaWNlO1xuXG4gIHRvb2xzPzogQXJyYXk8Q29tcGxldGlvbkNyZWF0ZVBhcmFtcy5Ub29sPjtcblxuICB0b3BfbG9ncHJvYnM/OiBudW1iZXI7XG5cbiAgdG9wX3A/OiBudW1iZXI7XG5cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgICBjb250ZW50OiBzdHJpbmc7XG5cbiAgICByb2xlOiBzdHJpbmc7XG5cbiAgICBuYW1lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVG9vbE1lc3NhZ2UgRmllbGRzXG4gICAgICovXG4gICAgdG9vbF9jYWxsX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQXNzaXN0YW50TWVzc2FnZSBGaWVsZHNcbiAgICAgKi9cbiAgICB0b29sX2NhbGxzPzogQXJyYXk8TWVzc2FnZS5Ub29sQ2FsbD47XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgVG9vbENhbGwge1xuICAgICAgaWQ/OiBzdHJpbmc7XG5cbiAgICAgIGZ1bmN0aW9uPzogVG9vbENhbGwuRnVuY3Rpb247XG5cbiAgICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBUb29sQ2FsbCB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAgICAgYXJndW1lbnRzPzogc3RyaW5nO1xuXG4gICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUZvcm1hdCB7XG4gICAgdHlwZT86IHN0cmluZztcbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbENob2ljZSB7XG4gICAgc3RyaW5nPzogc3RyaW5nO1xuXG4gICAgdG9vbENob2ljZT86IFRvb2xDaG9pY2UuVG9vbENob2ljZTtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbENob2ljZSB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBUb29sQ2hvaWNlIHtcbiAgICAgIGZ1bmN0aW9uPzogVG9vbENob2ljZS5GdW5jdGlvbjtcblxuICAgICAgdHlwZT86IHN0cmluZztcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIFRvb2xDaG9pY2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XG4gICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sIHtcbiAgICBmdW5jdGlvbj86IFRvb2wuRnVuY3Rpb247XG5cbiAgICB0eXBlPzogc3RyaW5nO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgICBuYW1lPzogc3RyaW5nO1xuXG4gICAgICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29tcGxldGlvbnMge1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgZXh0ZW5kcyBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICBzdHJlYW0/OiBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyBleHRlbmRzIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPVxuICB8IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nXG4gIHwgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy5cblxuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gXCIuL2NvbXBsZXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGF0IGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBjb21wbGV0aW9uczogQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnMgPSBuZXcgQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnModGhpcy5fY2xpZW50KTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0IHtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9ucyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIE1vZGVsc0FQSSBmcm9tIFwiLi9tb2RlbHNcIjtcblxuZXhwb3J0IGNsYXNzIE1vZGVscyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIEdldCBhIHNwZWNpZmljIG1vZGVsXG4gICAqL1xuICByZXRyaWV2ZShtb2RlbDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvb3BlbmFpL3YxL21vZGVscy8ke21vZGVsfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBhbGwgYXZhaWxhYmxlIG1vZGVsc1xuICAgKi9cbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxNb2RlbExpc3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldCgnL29wZW5haS92MS9tb2RlbHMnLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBtb2RlbFxuICAgKi9cbiAgZGVsZXRlKG1vZGVsOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL29wZW5haS92MS9tb2RlbHMvJHttb2RlbH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICcqLyonLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2RlbCB7XG4gIGlkPzogc3RyaW5nO1xuXG4gIGNyZWF0ZWQ/OiBudW1iZXI7XG5cbiAgb2JqZWN0Pzogc3RyaW5nO1xuXG4gIG93bmVkX2J5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsTGlzdCB7XG4gIGRhdGE/OiBBcnJheTxNb2RlbD47XG5cbiAgb2JqZWN0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1vZGVscyB7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWwgPSBNb2RlbHNBUEkuTW9kZWw7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWxMaXN0ID0gTW9kZWxzQVBJLk1vZGVsTGlzdDtcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgVHJhbnNjcmlwdGlvbnNBUEkgZnJvbSBcIi4vdHJhbnNjcmlwdGlvbnNcIjtcbmltcG9ydCB7IHR5cGUgVXBsb2FkYWJsZSwgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFRyYW5zY3JpcHRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVHJhbnNjcmliZXMgYXVkaW8gaW50byB0aGUgaW5wdXQgbGFuZ3VhZ2UuXG4gICAqL1xuICBjcmVhdGUoYm9keTogVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VHJhbnNjcmlwdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChcbiAgICAgICcvb3BlbmFpL3YxL2F1ZGlvL3RyYW5zY3JpcHRpb25zJyxcbiAgICAgIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyh7IGJvZHksIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0cmFuc2NyaXB0aW9uIHJlc3BvbnNlIHJldHVybmVkIGJ5IG1vZGVsLCBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIGlucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHRpb24ge1xuICAvKipcbiAgICogVGhlIHRyYW5zY3JpYmVkIHRleHQuXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXVkaW8gZmlsZSBvYmplY3QgKG5vdCBmaWxlIG5hbWUpIHRvIHRyYW5zY3JpYmUsIGluIG9uZSBvZiB0aGVzZSBmb3JtYXRzOlxuICAgKiBmbGFjLCBtcDMsIG1wNCwgbXBlZywgbXBnYSwgbTRhLCBvZ2csIHdhdiwgb3Igd2VibS5cbiAgICovXG4gIGZpbGU6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIE9ubHkgYHdoaXNwZXItbGFyZ2UtdjNgIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICd3aGlzcGVyLWxhcmdlLXYzJztcblxuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIG9mIHRoZSBpbnB1dCBhdWRpby4gU3VwcGx5aW5nIHRoZSBpbnB1dCBsYW5ndWFnZSBpblxuICAgKiBbSVNPLTYzOS0xXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX0lTT182MzktMV9jb2RlcykgZm9ybWF0IHdpbGxcbiAgICogaW1wcm92ZSBhY2N1cmFjeSBhbmQgbGF0ZW5jeS5cbiAgICovXG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB0ZXh0IHRvIGd1aWRlIHRoZSBtb2RlbCdzIHN0eWxlIG9yIGNvbnRpbnVlIGEgcHJldmlvdXMgYXVkaW9cbiAgICogc2VnbWVudC4gVGhlIFtwcm9tcHRdKC9kb2NzL2d1aWRlcy9zcGVlY2gtdG8tdGV4dC9wcm9tcHRpbmcpIHNob3VsZCBtYXRjaCB0aGVcbiAgICogYXVkaW8gbGFuZ3VhZ2UuXG4gICAqL1xuICBwcm9tcHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgb2YgdGhlIHRyYW5zY3JpcHQgb3V0cHV0LCBpbiBvbmUgb2YgdGhlc2Ugb3B0aW9uczogYGpzb25gLCBgdGV4dGAsXG4gICAqIGBzcnRgLCBgdmVyYm9zZV9qc29uYCwgb3IgYHZ0dGAuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiAnanNvbicgfCAndGV4dCcgfCAnc3J0JyB8ICd2ZXJib3NlX2pzb24nIHwgJ3Z0dCc7XG5cbiAgLyoqXG4gICAqIFRoZSBzYW1wbGluZyB0ZW1wZXJhdHVyZSwgYmV0d2VlbiAwIGFuZCAxLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGwgbWFrZSB0aGVcbiAgICogb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmUgZm9jdXNlZCBhbmRcbiAgICogZGV0ZXJtaW5pc3RpYy4gSWYgc2V0IHRvIDAsIHRoZSBtb2RlbCB3aWxsIHVzZVxuICAgKiBbbG9nIHByb2JhYmlsaXR5XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2dfcHJvYmFiaWxpdHkpIHRvXG4gICAqIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2UgdGhlIHRlbXBlcmF0dXJlIHVudGlsIGNlcnRhaW4gdGhyZXNob2xkcyBhcmUgaGl0LlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgZ3JhbnVsYXJpdGllcyB0byBwb3B1bGF0ZSBmb3IgdGhpcyB0cmFuc2NyaXB0aW9uLlxuICAgKiBgcmVzcG9uc2VfZm9ybWF0YCBtdXN0IGJlIHNldCBgdmVyYm9zZV9qc29uYCB0byB1c2UgdGltZXN0YW1wIGdyYW51bGFyaXRpZXMuXG4gICAqIEVpdGhlciBvciBib3RoIG9mIHRoZXNlIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDogYHdvcmRgLCBvciBgc2VnbWVudGAuIE5vdGU6IFRoZXJlXG4gICAqIGlzIG5vIGFkZGl0aW9uYWwgbGF0ZW5jeSBmb3Igc2VnbWVudCB0aW1lc3RhbXBzLCBidXQgZ2VuZXJhdGluZyB3b3JkIHRpbWVzdGFtcHNcbiAgICogaW5jdXJzIGFkZGl0aW9uYWwgbGF0ZW5jeS5cbiAgICovXG4gIHRpbWVzdGFtcF9ncmFudWxhcml0aWVzPzogQXJyYXk8J3dvcmQnIHwgJ3NlZ21lbnQnPjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUcmFuc2NyaXB0aW9ucyB7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbiA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25DcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0FQSSBmcm9tIFwiLi90cmFuc2xhdGlvbnNcIjtcbmltcG9ydCAqIGFzIEF1ZGlvQVBJIGZyb20gXCIuL2F1ZGlvXCI7XG5pbXBvcnQgeyB0eXBlIFVwbG9hZGFibGUsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi8uLi9jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUcmFuc2xhdGVzIGF1ZGlvIGludG8gRW5nbGlzaC5cbiAgICovXG4gIGNyZWF0ZShcbiAgICBib2R5OiBUcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPEF1ZGlvQVBJLlRyYW5zbGF0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KFxuICAgICAgJy9vcGVuYWkvdjEvYXVkaW8vdHJhbnNsYXRpb25zJyxcbiAgICAgIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyh7IGJvZHksIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhdWRpbyBmaWxlIG9iamVjdCAobm90IGZpbGUgbmFtZSkgdHJhbnNsYXRlLCBpbiBvbmUgb2YgdGhlc2UgZm9ybWF0czogZmxhYyxcbiAgICogbXAzLCBtcDQsIG1wZWcsIG1wZ2EsIG00YSwgb2dnLCB3YXYsIG9yIHdlYm0uXG4gICAqL1xuICBmaWxlOiBVcGxvYWRhYmxlO1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBPbmx5IGB3aGlzcGVyLWxhcmdlLXYzYCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgKi9cbiAgbW9kZWw6IChzdHJpbmcgJiB7fSkgfCAnd2hpc3Blci1sYXJnZS12Myc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHRleHQgdG8gZ3VpZGUgdGhlIG1vZGVsJ3Mgc3R5bGUgb3IgY29udGludWUgYSBwcmV2aW91cyBhdWRpb1xuICAgKiBzZWdtZW50LiBUaGUgW3Byb21wdF0oL2RvY3MvZ3VpZGVzL3NwZWVjaC10by10ZXh0L3Byb21wdGluZykgc2hvdWxkIGJlIGluXG4gICAqIEVuZ2xpc2guXG4gICAqL1xuICBwcm9tcHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgb2YgdGhlIHRyYW5zY3JpcHQgb3V0cHV0LCBpbiBvbmUgb2YgdGhlc2Ugb3B0aW9uczogYGpzb25gLCBgdGV4dGAsXG4gICAqIGBzcnRgLCBgdmVyYm9zZV9qc29uYCwgb3IgYHZ0dGAuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzYW1wbGluZyB0ZW1wZXJhdHVyZSwgYmV0d2VlbiAwIGFuZCAxLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGwgbWFrZSB0aGVcbiAgICogb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmUgZm9jdXNlZCBhbmRcbiAgICogZGV0ZXJtaW5pc3RpYy4gSWYgc2V0IHRvIDAsIHRoZSBtb2RlbCB3aWxsIHVzZVxuICAgKiBbbG9nIHByb2JhYmlsaXR5XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2dfcHJvYmFiaWxpdHkpIHRvXG4gICAqIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2UgdGhlIHRlbXBlcmF0dXJlIHVudGlsIGNlcnRhaW4gdGhyZXNob2xkcyBhcmUgaGl0LlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVHJhbnNsYXRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcyA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLlxuXG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgQXVkaW9BUEkgZnJvbSBcIi4vYXVkaW9cIjtcbmltcG9ydCAqIGFzIFRyYW5zY3JpcHRpb25zQVBJIGZyb20gXCIuL3RyYW5zY3JpcHRpb25zXCI7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnNBUEkgZnJvbSBcIi4vdHJhbnNsYXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBBdWRpbyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgdHJhbnNjcmlwdGlvbnM6IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25zID0gbmV3IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25zKHRoaXMuX2NsaWVudCk7XG4gIHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9ucyA9IG5ldyBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25zKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb24ge1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXVkaW8ge1xuICBleHBvcnQgaW1wb3J0IFRyYW5zbGF0aW9uID0gQXVkaW9BUEkuVHJhbnNsYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbnMgPSBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbnMgPSBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25zO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zID0gVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi9jb3JlJztcbmltcG9ydCAqIGFzIEVycm9ycyBmcm9tICcuL2Vycm9yJztcbmltcG9ydCB7IHR5cGUgQWdlbnQgfSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5pbXBvcnQgKiBhcyBVcGxvYWRzIGZyb20gJy4vdXBsb2Fkcyc7XG5pbXBvcnQgKiBhcyBBUEkgZnJvbSBcIi4vcmVzb3VyY2VzL2luZGV4XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0cyB0byBwcm9jZXNzLmVudlsnR1JPUV9BUElfS0VZJ10uXG4gICAqL1xuICBhcGlLZXk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJhc2UgVVJMIGZvciB0aGUgQVBJLCBlLmcuLCBcImh0dHBzOi8vYXBpLmV4YW1wbGUuY29tL3YyL1wiXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHByb2Nlc3MuZW52WydHUk9RX0JBU0VfVVJMJ10uXG4gICAqL1xuICBiYXNlVVJMPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhhdCB0aGUgY2xpZW50IHNob3VsZCB3YWl0IGZvciBhIHJlc3BvbnNlXG4gICAqIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgdGltaW5nIG91dCBhIHNpbmdsZSByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgcmVxdWVzdCB0aW1lb3V0cyBhcmUgcmV0cmllZCBieSBkZWZhdWx0LCBzbyBpbiBhIHdvcnN0LWNhc2Ugc2NlbmFyaW8geW91IG1heSB3YWl0XG4gICAqIG11Y2ggbG9uZ2VyIHRoYW4gdGhpcyB0aW1lb3V0IGJlZm9yZSB0aGUgcHJvbWlzZSBzdWNjZWVkcyBvciBmYWlscy5cbiAgICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFuIEhUVFAgYWdlbnQgdXNlZCB0byBtYW5hZ2UgSFRUUChTKSBjb25uZWN0aW9ucy5cbiAgICpcbiAgICogSWYgbm90IHByb3ZpZGVkLCBhbiBhZ2VudCB3aWxsIGJlIGNvbnN0cnVjdGVkIGJ5IGRlZmF1bHQgaW4gdGhlIE5vZGUuanMgZW52aXJvbm1lbnQsXG4gICAqIG90aGVyd2lzZSBubyBhZ2VudCBpcyB1c2VkLlxuICAgKi9cbiAgaHR0cEFnZW50PzogQWdlbnQ7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBjdXN0b20gYGZldGNoYCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogSWYgbm90IHByb3ZpZGVkLCB3ZSB1c2UgYG5vZGUtZmV0Y2hgIG9uIE5vZGUuanMgYW5kIG90aGVyd2lzZSBleHBlY3QgdGhhdCBgZmV0Y2hgIGlzXG4gICAqIGRlZmluZWQgZ2xvYmFsbHkuXG4gICAqL1xuICBmZXRjaD86IENvcmUuRmV0Y2ggfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBjbGllbnQgd2lsbCByZXRyeSBhIHJlcXVlc3QgaW4gY2FzZSBvZiBhXG4gICAqIHRlbXBvcmFyeSBmYWlsdXJlLCBsaWtlIGEgbmV0d29yayBlcnJvciBvciBhIDVYWCBlcnJvciBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaGVhZGVycyB0byBpbmNsdWRlIHdpdGggZXZlcnkgcmVxdWVzdCB0byB0aGUgQVBJLlxuICAgKlxuICAgKiBUaGVzZSBjYW4gYmUgcmVtb3ZlZCBpbiBpbmRpdmlkdWFsIHJlcXVlc3RzIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGVcbiAgICogaGVhZGVyIHRvIGB1bmRlZmluZWRgIG9yIGBudWxsYCBpbiByZXF1ZXN0IG9wdGlvbnMuXG4gICAqL1xuICBkZWZhdWx0SGVhZGVycz86IENvcmUuSGVhZGVycztcblxuICAvKipcbiAgICogRGVmYXVsdCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqXG4gICAqIFRoZXNlIGNhbiBiZSByZW1vdmVkIGluIGluZGl2aWR1YWwgcmVxdWVzdHMgYnkgZXhwbGljaXRseSBzZXR0aW5nIHRoZVxuICAgKiBwYXJhbSB0byBgdW5kZWZpbmVkYCBpbiByZXF1ZXN0IG9wdGlvbnMuXG4gICAqL1xuICBkZWZhdWx0UXVlcnk/OiBDb3JlLkRlZmF1bHRRdWVyeTtcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgY2xpZW50LXNpZGUgdXNlIG9mIHRoaXMgbGlicmFyeSBpcyBub3QgYWxsb3dlZCwgYXMgaXQgcmlza3MgZXhwb3NpbmcgeW91ciBzZWNyZXQgQVBJIGNyZWRlbnRpYWxzIHRvIGF0dGFja2Vycy5cbiAgICogT25seSBzZXQgdGhpcyBvcHRpb24gdG8gYHRydWVgIGlmIHlvdSB1bmRlcnN0YW5kIHRoZSByaXNrcyBhbmQgaGF2ZSBhcHByb3ByaWF0ZSBtaXRpZ2F0aW9ucyBpbiBwbGFjZS5cbiAgICovXG4gIGRhbmdlcm91c2x5QWxsb3dCcm93c2VyPzogYm9vbGVhbjtcbn1cblxuLyoqIEFQSSBDbGllbnQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIEdyb3EgQVBJLiAqL1xuZXhwb3J0IGNsYXNzIEdyb3EgZXh0ZW5kcyBDb3JlLkFQSUNsaWVudCB7XG4gIGFwaUtleTogc3RyaW5nO1xuXG4gIHByaXZhdGUgX29wdGlvbnM6IENsaWVudE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEFQSSBDbGllbnQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIEdyb3EgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW29wdHMuYXBpS2V5PXByb2Nlc3MuZW52WydHUk9RX0FQSV9LRVknXSA/PyB1bmRlZmluZWRdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5iYXNlVVJMPXByb2Nlc3MuZW52WydHUk9RX0JBU0VfVVJMJ10gPz8gaHR0cHM6Ly9hcGkuZ3JvcS5jb21dIC0gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmFzZSBVUkwgZm9yIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lb3V0PTEgbWludXRlXSAtIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRoZSBjbGllbnQgd2lsbCB3YWl0IGZvciBhIHJlc3BvbnNlIGJlZm9yZSB0aW1pbmcgb3V0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaHR0cEFnZW50XSAtIEFuIEhUVFAgYWdlbnQgdXNlZCB0byBtYW5hZ2UgSFRUUChzKSBjb25uZWN0aW9ucy5cbiAgICogQHBhcmFtIHtDb3JlLkZldGNofSBbb3B0cy5mZXRjaF0gLSBTcGVjaWZ5IGEgY3VzdG9tIGBmZXRjaGAgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5tYXhSZXRyaWVzPTJdIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBjbGllbnQgd2lsbCByZXRyeSBhIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7Q29yZS5IZWFkZXJzfSBvcHRzLmRlZmF1bHRIZWFkZXJzIC0gRGVmYXVsdCBoZWFkZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7Q29yZS5EZWZhdWx0UXVlcnl9IG9wdHMuZGVmYXVsdFF1ZXJ5IC0gRGVmYXVsdCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXI9ZmFsc2VdIC0gQnkgZGVmYXVsdCwgY2xpZW50LXNpZGUgdXNlIG9mIHRoaXMgbGlicmFyeSBpcyBub3QgYWxsb3dlZCwgYXMgaXQgcmlza3MgZXhwb3NpbmcgeW91ciBzZWNyZXQgQVBJIGNyZWRlbnRpYWxzIHRvIGF0dGFja2Vycy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBiYXNlVVJMID0gQ29yZS5yZWFkRW52KCdHUk9RX0JBU0VfVVJMJyksXG4gICAgYXBpS2V5ID0gQ29yZS5yZWFkRW52KCdHUk9RX0FQSV9LRVknKSxcbiAgICAuLi5vcHRzXG4gIH06IENsaWVudE9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChhcGlLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5Hcm9xRXJyb3IoXG4gICAgICAgIFwiVGhlIEdST1FfQVBJX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBtaXNzaW5nIG9yIGVtcHR5OyBlaXRoZXIgcHJvdmlkZSBpdCwgb3IgaW5zdGFudGlhdGUgdGhlIEdyb3EgY2xpZW50IHdpdGggYW4gYXBpS2V5IG9wdGlvbiwgbGlrZSBuZXcgR3JvcSh7IGFwaUtleTogJ015IEFQSSBLZXknIH0pLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBDbGllbnRPcHRpb25zID0ge1xuICAgICAgYXBpS2V5LFxuICAgICAgLi4ub3B0cyxcbiAgICAgIGJhc2VVUkw6IGJhc2VVUkwgfHwgYGh0dHBzOi8vYXBpLmdyb3EuY29tYCxcbiAgICB9O1xuXG4gICAgaWYgKCFvcHRpb25zLmRhbmdlcm91c2x5QWxsb3dCcm93c2VyICYmIENvcmUuaXNSdW5uaW5nSW5Ccm93c2VyKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcnMuR3JvcUVycm9yKFxuICAgICAgICAnVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBhcyBpdCByaXNrcyBleHBvc2luZyB5b3VyIHNlY3JldCBBUEkgY3JlZGVudGlhbHMgdG8gYXR0YWNrZXJzLlxcbklmIHlvdSB1bmRlcnN0YW5kIHRoZSByaXNrcyBhbmQgaGF2ZSBhcHByb3ByaWF0ZSBtaXRpZ2F0aW9ucyBpbiBwbGFjZSxcXG55b3UgY2FuIHNldCB0aGUgYGRhbmdlcm91c2x5QWxsb3dCcm93c2VyYCBvcHRpb24gdG8gYHRydWVgLCBlLmcuLFxcblxcbm5ldyBHcm9xKHsgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXI6IHRydWUgfSknLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzdXBlcih7XG4gICAgICBiYXNlVVJMOiBvcHRpb25zLmJhc2VVUkwhLFxuICAgICAgdGltZW91dDogb3B0aW9ucy50aW1lb3V0ID8/IDYwMDAwIC8qIDEgbWludXRlICovLFxuICAgICAgaHR0cEFnZW50OiBvcHRpb25zLmh0dHBBZ2VudCxcbiAgICAgIG1heFJldHJpZXM6IG9wdGlvbnMubWF4UmV0cmllcyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoLFxuICAgIH0pO1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5hcGlLZXkgPSBhcGlLZXk7XG4gIH1cblxuICBjaGF0OiBBUEkuQ2hhdCA9IG5ldyBBUEkuQ2hhdCh0aGlzKTtcbiAgYXVkaW86IEFQSS5BdWRpbyA9IG5ldyBBUEkuQXVkaW8odGhpcyk7XG4gIG1vZGVsczogQVBJLk1vZGVscyA9IG5ldyBBUEkuTW9kZWxzKHRoaXMpO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBkZWZhdWx0UXVlcnkoKTogQ29yZS5EZWZhdWx0UXVlcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmRlZmF1bHRRdWVyeTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBkZWZhdWx0SGVhZGVycyhvcHRzOiBDb3JlLkZpbmFsUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkhlYWRlcnMge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5kZWZhdWx0SGVhZGVycyhvcHRzKSxcbiAgICAgIC4uLnRoaXMuX29wdGlvbnMuZGVmYXVsdEhlYWRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhdXRoSGVhZGVycyhvcHRzOiBDb3JlLkZpbmFsUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkhlYWRlcnMge1xuICAgIHJldHVybiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmFwaUtleX1gIH07XG4gIH1cblxuICBzdGF0aWMgR3JvcSA9IHRoaXM7XG5cbiAgc3RhdGljIEdyb3FFcnJvciA9IEVycm9ycy5Hcm9xRXJyb3I7XG4gIHN0YXRpYyBBUElFcnJvciA9IEVycm9ycy5BUElFcnJvcjtcbiAgc3RhdGljIEFQSUNvbm5lY3Rpb25FcnJvciA9IEVycm9ycy5BUElDb25uZWN0aW9uRXJyb3I7XG4gIHN0YXRpYyBBUElDb25uZWN0aW9uVGltZW91dEVycm9yID0gRXJyb3JzLkFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3I7XG4gIHN0YXRpYyBBUElVc2VyQWJvcnRFcnJvciA9IEVycm9ycy5BUElVc2VyQWJvcnRFcnJvcjtcbiAgc3RhdGljIE5vdEZvdW5kRXJyb3IgPSBFcnJvcnMuTm90Rm91bmRFcnJvcjtcbiAgc3RhdGljIENvbmZsaWN0RXJyb3IgPSBFcnJvcnMuQ29uZmxpY3RFcnJvcjtcbiAgc3RhdGljIFJhdGVMaW1pdEVycm9yID0gRXJyb3JzLlJhdGVMaW1pdEVycm9yO1xuICBzdGF0aWMgQmFkUmVxdWVzdEVycm9yID0gRXJyb3JzLkJhZFJlcXVlc3RFcnJvcjtcbiAgc3RhdGljIEF1dGhlbnRpY2F0aW9uRXJyb3IgPSBFcnJvcnMuQXV0aGVudGljYXRpb25FcnJvcjtcbiAgc3RhdGljIEludGVybmFsU2VydmVyRXJyb3IgPSBFcnJvcnMuSW50ZXJuYWxTZXJ2ZXJFcnJvcjtcbiAgc3RhdGljIFBlcm1pc3Npb25EZW5pZWRFcnJvciA9IEVycm9ycy5QZXJtaXNzaW9uRGVuaWVkRXJyb3I7XG4gIHN0YXRpYyBVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IgPSBFcnJvcnMuVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yO1xufVxuXG5leHBvcnQgY29uc3Qge1xuICBHcm9xRXJyb3IsXG4gIEFQSUVycm9yLFxuICBBUElDb25uZWN0aW9uRXJyb3IsXG4gIEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IsXG4gIEFQSVVzZXJBYm9ydEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBSYXRlTGltaXRFcnJvcixcbiAgQmFkUmVxdWVzdEVycm9yLFxuICBBdXRoZW50aWNhdGlvbkVycm9yLFxuICBJbnRlcm5hbFNlcnZlckVycm9yLFxuICBQZXJtaXNzaW9uRGVuaWVkRXJyb3IsXG4gIFVucHJvY2Vzc2FibGVFbnRpdHlFcnJvcixcbn0gPSBFcnJvcnM7XG5cbmV4cG9ydCBpbXBvcnQgdG9GaWxlID0gVXBsb2Fkcy50b0ZpbGU7XG5leHBvcnQgaW1wb3J0IGZpbGVGcm9tUGF0aCA9IFVwbG9hZHMuZmlsZUZyb21QYXRoO1xuXG5leHBvcnQgbmFtZXNwYWNlIEdyb3Ege1xuICAvLyBIZWxwZXIgZnVuY3Rpb25zXG4gIGV4cG9ydCBpbXBvcnQgdG9GaWxlID0gVXBsb2Fkcy50b0ZpbGU7XG4gIGV4cG9ydCBpbXBvcnQgZmlsZUZyb21QYXRoID0gVXBsb2Fkcy5maWxlRnJvbVBhdGg7XG5cbiAgZXhwb3J0IGltcG9ydCBSZXF1ZXN0T3B0aW9ucyA9IENvcmUuUmVxdWVzdE9wdGlvbnM7XG5cbiAgZXhwb3J0IGltcG9ydCBDaGF0ID0gQVBJLkNoYXQ7XG5cbiAgZXhwb3J0IGltcG9ydCBBdWRpbyA9IEFQSS5BdWRpbztcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbiA9IEFQSS5UcmFuc2xhdGlvbjtcblxuICBleHBvcnQgaW1wb3J0IE1vZGVscyA9IEFQSS5Nb2RlbHM7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWwgPSBBUEkuTW9kZWw7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZWxMaXN0ID0gQVBJLk1vZGVsTGlzdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgR3JvcTtcbiIsICJmdW5jdGlvbiBhcm91bmQob2JqLCBmYWN0b3JpZXMpIHtcbiAgY29uc3QgcmVtb3ZlcnMgPSBPYmplY3Qua2V5cyhmYWN0b3JpZXMpLm1hcCgoa2V5KSA9PiBhcm91bmQxKG9iaiwga2V5LCBmYWN0b3JpZXNba2V5XSkpO1xuICByZXR1cm4gcmVtb3ZlcnMubGVuZ3RoID09PSAxID8gcmVtb3ZlcnNbMF0gOiBmdW5jdGlvbigpIHtcbiAgICByZW1vdmVycy5mb3JFYWNoKChyKSA9PiByKCkpO1xuICB9O1xufVxuZnVuY3Rpb24gYXJvdW5kMShvYmosIG1ldGhvZCwgY3JlYXRlV3JhcHBlcikge1xuICBjb25zdCBpbmhlcml0ZWQgPSBvYmpbbWV0aG9kXSwgaGFkT3duID0gb2JqLmhhc093blByb3BlcnR5KG1ldGhvZCksIG9yaWdpbmFsID0gaGFkT3duID8gaW5oZXJpdGVkIDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopW21ldGhvZF0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgbGV0IGN1cnJlbnQgPSBjcmVhdGVXcmFwcGVyKG9yaWdpbmFsKTtcbiAgaWYgKGluaGVyaXRlZClcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoY3VycmVudCwgaW5oZXJpdGVkKTtcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHdyYXBwZXIsIGN1cnJlbnQpO1xuICBvYmpbbWV0aG9kXSA9IHdyYXBwZXI7XG4gIHJldHVybiByZW1vdmU7XG4gIGZ1bmN0aW9uIHdyYXBwZXIoLi4uYXJncykge1xuICAgIGlmIChjdXJyZW50ID09PSBvcmlnaW5hbCAmJiBvYmpbbWV0aG9kXSA9PT0gd3JhcHBlcilcbiAgICAgIHJlbW92ZSgpO1xuICAgIHJldHVybiBjdXJyZW50LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG4gIGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICBpZiAob2JqW21ldGhvZF0gPT09IHdyYXBwZXIpIHtcbiAgICAgIGlmIChoYWRPd24pXG4gICAgICAgIG9ialttZXRob2RdID0gb3JpZ2luYWw7XG4gICAgICBlbHNlXG4gICAgICAgIGRlbGV0ZSBvYmpbbWV0aG9kXTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQgPT09IG9yaWdpbmFsKVxuICAgICAgcmV0dXJuO1xuICAgIGN1cnJlbnQgPSBvcmlnaW5hbDtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yod3JhcHBlciwgaW5oZXJpdGVkIHx8IEZ1bmN0aW9uKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVkdXBlKGtleSwgb2xkRm4sIG5ld0ZuKSB7XG4gIGNoZWNrW2tleV0gPSBrZXk7XG4gIHJldHVybiBjaGVjaztcbiAgZnVuY3Rpb24gY2hlY2soLi4uYXJncykge1xuICAgIHJldHVybiAob2xkRm5ba2V5XSA9PT0ga2V5ID8gb2xkRm4gOiBuZXdGbikuYXBwbHkodGhpcywgYXJncyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGFmdGVyKHByb21pc2UsIGNiKSB7XG4gIHJldHVybiBwcm9taXNlLnRoZW4oY2IsIGNiKTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZShhc3luY0Z1bmN0aW9uKSB7XG4gIGxldCBsYXN0UnVuID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIGZ1bmN0aW9uIHdyYXBwZXIoLi4uYXJncykge1xuICAgIHJldHVybiBsYXN0UnVuID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICBhZnRlcihsYXN0UnVuLCAoKSA9PiB7XG4gICAgICAgIGFzeW5jRnVuY3Rpb24uYXBwbHkodGhpcywgYXJncykudGhlbihyZXMsIHJlaik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICB3cmFwcGVyLmFmdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGxhc3RSdW4gPSBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIGFmdGVyKGxhc3RSdW4sIHJlcyk7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG5leHBvcnQgeyBhZnRlciwgYXJvdW5kLCBkZWR1cGUsIHNlcmlhbGl6ZSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQSxxQ0FBQUEsVUFBQUMsU0FBQTtBQUFBLElBQUFBLFFBQUE7QUFBQSxNQUNFLE1BQVE7QUFBQSxNQUNSLFNBQVc7QUFBQSxNQUNYLGFBQWU7QUFBQSxNQUNmLE1BQVE7QUFBQSxNQUNSLE9BQVM7QUFBQSxNQUNULFNBQVc7QUFBQSxRQUNULEtBQUs7QUFBQSxVQUNILE9BQVM7QUFBQSxVQUNULFNBQVc7QUFBQSxVQUNYLFNBQVc7QUFBQSxRQUNiO0FBQUEsUUFDQSxZQUFZO0FBQUEsUUFDWixl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O0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFDQSxJQUFJLGlCQUFpQjtBQUFBLEVBQ25CLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQTtBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUE7QUFBQSxFQUNMLEtBQUs7QUFBQTtBQUFBLEVBQ0wsS0FBSztBQUFBO0FBQUEsRUFDTCxLQUFLO0FBQUE7QUFBQSxFQUNMLEtBQUs7QUFBQTtBQUFBLEVBQ0wsS0FBSztBQUFBO0FBQUEsRUFDTCxLQUFLO0FBQUE7QUFBQSxF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LEtBQUssS0FBSyxZQUFZLE1BQU0scUJBQXFCO0FBQ2pELDRCQUFrQjtBQUdsQixjQUFJLENBQUMsS0FBSyxLQUFLLFlBQVksY0FBYyxVQUFVLFNBQVMsV0FBVyxHQUFHO0FBQ3RFLGlCQUFLLElBQUksVUFBVSxXQUFXLElBQUk7QUFBQSxVQUN0QztBQUFBLFFBQ0o7QUFBQSxNQUNKLENBQUM7QUFHRCxVQUFJLENBQUMsaUJBQWlCO0FBQ2xCLGNBQU0sS0FBSyxJQUFJLFVBQVUsUUFBUSxJQUFJLEVBQUUsYUFBYTtBQUFBLFVBQ2hELE1BQU07QUFBQSxVQUNOLFFBQVE7QUFBQSxRQUNaLENBQUM7QUFBQSxNQUVMO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRUEsV0FBVztBQUFBLEVBQUM7QUFBQSxFQUVaLE1BQU0sZUFBZTtBQUNqQixTQUFLLFdBQVcsT0FBTyxPQUFPLENBQUMsR0FBRyxrQkFBa0IsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQzdFO0FBQUEsRUFFQSxNQUFNLGVBQWU7QUFDakIsVUFBTSxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUEsRUFDckM7QUFDSjsiLAogICJuYW1lcyI6IFsiZXhwb3J0cyIsICJtb2R1bGUiLCAiZXhwb3J0cyIsICJtb2R1bGUiLCAidmVyc2lvbiIsICJwYXJzZSIsICJlcnIiLCAia2V5cyIsICJlcnJvciIsICJkZWJ1ZyIsICJwYXRoIiwgImNvbmZpZyIsICJhIiwgIkJ1ZmZlciIsICJmaWxsIiwgInRvU3RyaW5nIiwgInN0ciIsICJjb21wYXJlIiwgInJlYWQiLCAiaSIsICJ3cml0ZSIsICJieXRlTGVuZ3RoIiwgImUiLCAidmVyc2lvbiIsICJpbmhlcml0cyIsICJpbnNwZWN0IiwgIngiLCAibXNnIiwgImtleXMiLCAiYmFzZSIsICJzZWxmIiwgImxpc3RlbmVycyIsICJlbWl0IiwgImRvbWFpbiIsICJlcnIiLCAiYWRkTGlzdGVuZXIiLCAib25jZSIsICJyZW1vdmVMaXN0ZW5lciIsICJyZW1vdmVBbGxMaXN0ZW5lcnMiLCAiY29weSIsICJwcmVwZW5kTGlzdGVuZXIiLCAib25lbmQiLCAiaW5kZXhPZiIsICJ4aHIiLCAiaGVhZGVyIiwgInN0YXR1cyIsICJyYW5rIiwgImZyb20iLCAiY29kZXMiLCAiZmxvdyIsICJlcnJvciIsICJraW5kIiwgIl9fdW51c2VkX3dlYnBhY2tfbW9kdWxlIiwgImV4cG9ydHMiLCAiYXNzZXJ0IiwgIkJhc2VFeGNlcHRpb24iLCAibWFwIiwgIl9hIiwgIndvcmtlciIsICJfYiIsICJkb25lIiwgImZvbnQiLCAib2JqIiwgIl9fd19wZGZqc19yZXF1aXJlX18iLCAiX3V0aWwiLCAiX2Rpc3BsYXlfdXRpbHMiLCAicmVxdWVzdCIsICJfaXNfbm9kZSIsICJkYXRhIiwgIm9mZnNldFgiLCAib2Zmc2V0WSIsICJrIiwgImVsZW0iLCAib24iLCAib2ZmIiwgImVkaXRvciIsICJtb2R1bGUiLCAiYmV6aWVyIiwgInRNYXgiLCAidE1pbiIsICJfYW5ub3RhdGlvbl9zdG9yYWdlIiwgImNoZWNrZWQiLCAidGl0bGUiLCAiX3hmYV90ZXh0IiwgImNyY1RhYmxlIiwgImNyYzMyIiwgImFkbGVyMzIiLCAiZGVmbGF0ZVN5bmMiLCAiZW5jb2RlIiwgImNvbnZlcnRJbWdEYXRhVG9QbmciLCAiX3dvcmtlcl9vcHRpb25zIiwgImZldGNoIiwgIlJlcXVlc3QiLCAiUmVzcG9uc2UiLCAiSGVhZGVycyIsICJGb3JtRGF0YSIsICJCbG9iIiwgIkZpbGUiLCAiUmVhZGFibGVTdHJlYW0iLCAiZXJyb3IiLCAic3RhdHVzIiwgImVycm9yIiwgIm1zZyIsICJTdHJlYW0iLCAiZG9uZSIsICJxdWV1ZSIsICJzZWxmIiwgIlJlYWRhYmxlU3RyZWFtIiwgImVyciIsICJfYSIsICJzdHIiLCAiZGVsaW1pdGVyIiwgIl9hIiwgIkZpbGUiLCAiRm9ybURhdGEiLCAiZGVidWciLCAiU3RyZWFtIiwgImZldGNoIiwgIm9wdHMiLCAiUGFnZSIsICJfYSIsICJyZXF1ZXN0IiwgInN0YXR1cyIsICJlcnJvciIsICJyZXRyeU1lc3NhZ2UiLCAiZXJyIiwgImluaXQiLCAicGxhdGZvcm0iLCAiZW52IiwgIl9hIiwgImRlYnVnIiwgIl9hIiwgIl9hIiwgIl9hIiwgIkNvbXBsZXRpb25zIiwgIkNoYXQiLCAiU3BlZWNoIiwgIlRyYW5zY3JpcHRpb25zIiwgIlRyYW5zbGF0aW9ucyIsICJBdWRpbyIsICJCYXRjaGVzIiwgIkFzc2lzdGFudHMiLCAiZXJyb3IiLCAiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgIl9hIiwgImVtaXQiLCAibGlzdGVuZXJzIiwgImNvbnRlbnQiLCAiX0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJfZ2V0RmluYWxNZXNzYWdlIiwgIl9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyX2dldEZpbmFsRnVuY3Rpb25DYWxsIiwgIl9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyX2dldEZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0IiwgIl9BYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyX2NhbGN1bGF0ZVRvdGFsVXNhZ2UiLCAiX0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJfdmFsaWRhdGVQYXJhbXMiLCAiX0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJfc3RyaW5naWZ5RnVuY3Rpb25DYWxsUmVzdWx0IiwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCAiX2EiLCAiU3RyZWFtIiwgIl9DaGF0Q29tcGxldGlvblN0cmVhbV9iZWdpblJlcXVlc3QiLCAiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsICJfQ2hhdENvbXBsZXRpb25TdHJlYW1fYWRkQ2h1bmsiLCAiX0NoYXRDb21wbGV0aW9uU3RyZWFtX2VuZFJlcXVlc3QiLCAiX0NoYXRDb21wbGV0aW9uU3RyZWFtX2FjY3VtdWxhdGVDaGF0Q29tcGxldGlvbiIsICJjb250ZW50IiwgInJlc3QiLCAiX2IiLCAiaW5kZXgiLCAiX2MiLCAiZG9uZSIsICJlcnIiLCAiY2h1bmsiLCAiaWQiLCAiQ29tcGxldGlvbnMiLCAiQ2hhdCIsICJDb21wbGV0aW9ucyIsICJlcnJvciIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCAibGlzdGVuZXJzIiwgImRvbmUiLCAiZXJyIiwgImNodW5rIiwgIlN0cmVhbSIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgIl9hIiwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCAiX0Fzc2lzdGFudFN0cmVhbV9lbmRSZXF1ZXN0IiwgIl9Bc3Npc3RhbnRTdHJlYW1faGFuZGxlTWVzc2FnZSIsICJfQXNzaXN0YW50U3RyZWFtX2hhbmRsZVJ1blN0ZXAiLCAiX0Fzc2lzdGFudFN0cmVhbV9oYW5kbGVFdmVudCIsICJfQXNzaXN0YW50U3RyZWFtX2FjY3VtdWxhdGVSdW5TdGVwIiwgIl9Bc3Npc3RhbnRTdHJlYW1fYWNjdW11bGF0ZU1lc3NhZ2UiLCAiX0Fzc2lzdGFudFN0cmVhbV9hY2N1bXVsYXRlQ29udGVudCIsICJfQXNzaXN0YW50U3RyZWFtX2hhbmRsZVJ1biIsICJNZXNzYWdlcyIsICJTdGVwcyIsICJfYSIsICJSdW5zIiwgIl9hIiwgIlRocmVhZHMiLCAiRmlsZXMiLCAiX2EiLCAiRmlsZUJhdGNoZXMiLCAiVmVjdG9yU3RvcmVzIiwgIkNoYXQiLCAiQmV0YSIsICJDb21wbGV0aW9ucyIsICJfYSIsICJFbWJlZGRpbmdzIiwgIkZpbGVzIiwgIkNoZWNrcG9pbnRzIiwgIkpvYnMiLCAiRmluZVR1bmluZyIsICJJbWFnZXMiLCAiTW9kZWxzIiwgIk1vZGVyYXRpb25zIiwgIl9hIiwgIkNvbXBsZXRpb25zIiwgIkZpbGVzIiwgIk9wZW5BSUVycm9yIiwgIkFQSUVycm9yIiwgIkFQSUNvbm5lY3Rpb25FcnJvciIsICJBUElDb25uZWN0aW9uVGltZW91dEVycm9yIiwgIkFQSVVzZXJBYm9ydEVycm9yIiwgIk5vdEZvdW5kRXJyb3IiLCAiQ29uZmxpY3RFcnJvciIsICJSYXRlTGltaXRFcnJvciIsICJCYWRSZXF1ZXN0RXJyb3IiLCAiQXV0aGVudGljYXRpb25FcnJvciIsICJJbnRlcm5hbFNlcnZlckVycm9yIiwgIlBlcm1pc3Npb25EZW5pZWRFcnJvciIsICJVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IiLCAiT3BlbkFJIiwgIkNvbXBsZXRpb25zIiwgIkZpbGVzIiwgIlZFUlNJT04iLCAiYXV0byIsICJraW5kIiwgImZldGNoIiwgIlJlcXVlc3QiLCAiUmVzcG9uc2UiLCAiSGVhZGVycyIsICJGb3JtRGF0YSIsICJCbG9iIiwgIkZpbGUiLCAiUmVhZGFibGVTdHJlYW0iLCAiZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMiLCAiZ2V0RGVmYXVsdEFnZW50IiwgImZpbGVGcm9tUGF0aCIsICJpc0ZzUmVhZFN0cmVhbSIsICJzZXRTaGltcyIsICJNdWx0aXBhcnRCb2R5IiwgImdldFJ1bnRpbWUiLCAiZXJyb3IiLCAiTXVsdGlwYXJ0Qm9keSIsICJraW5kIiwgInNldFNoaW1zIiwgImdldFJ1bnRpbWUiLCAiZXJyb3JfZXhwb3J0cyIsICJBUElDb25uZWN0aW9uRXJyb3IiLCAiQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvciIsICJBUElFcnJvciIsICJBUElVc2VyQWJvcnRFcnJvciIsICJBdXRoZW50aWNhdGlvbkVycm9yIiwgIkJhZFJlcXVlc3RFcnJvciIsICJDb25mbGljdEVycm9yIiwgIkludGVybmFsU2VydmVyRXJyb3IiLCAiTm90Rm91bmRFcnJvciIsICJQZXJtaXNzaW9uRGVuaWVkRXJyb3IiLCAiUmF0ZUxpbWl0RXJyb3IiLCAiVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yIiwgIkFQSUVycm9yIiwgInN0YXR1cyIsICJlcnJvciIsICJtc2ciLCAiQVBJQ29ubmVjdGlvbkVycm9yIiwgImNhc3RUb0Vycm9yIiwgIkJhZFJlcXVlc3RFcnJvciIsICJBdXRoZW50aWNhdGlvbkVycm9yIiwgIlBlcm1pc3Npb25EZW5pZWRFcnJvciIsICJOb3RGb3VuZEVycm9yIiwgIkNvbmZsaWN0RXJyb3IiLCAiVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yIiwgIlJhdGVMaW1pdEVycm9yIiwgIkludGVybmFsU2VydmVyRXJyb3IiLCAiQVBJVXNlckFib3J0RXJyb3IiLCAiQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvciIsICJTdHJlYW0iLCAiU1NFRGVjb2RlciIsICJMaW5lRGVjb2RlciIsICJyZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmFibGUiLCAiZG9uZSIsICJBUElFcnJvciIsICJxdWV1ZSIsICJzZWxmIiwgIlJlYWRhYmxlU3RyZWFtIiwgImVyciIsICJfYSIsICJwYXJ0aXRpb24iLCAic3RyIiwgImRlbGltaXRlciIsICJpc1Jlc3BvbnNlTGlrZSIsICJpc0ZpbGVMaWtlIiwgImlzQmxvYkxpa2UiLCAiaXNVcGxvYWRhYmxlIiwgImlzRnNSZWFkU3RyZWFtIiwgInRvRmlsZSIsICJfYSIsICJGaWxlIiwgImdldEJ5dGVzIiwgImdldE5hbWUiLCAiaXNBc3luY0l0ZXJhYmxlSXRlcmF0b3IiLCAicHJvcHNGb3JFcnJvciIsICJnZXRTdHJpbmdGcm9tTWF5YmVCdWZmZXIiLCAiaXNNdWx0aXBhcnRCb2R5IiwgIm11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyIsICJjcmVhdGVGb3JtIiwgImdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zIiwgIkZvcm1EYXRhIiwgImFkZEZvcm1WYWx1ZSIsICJhZGRGb3JtVmFsdWUiLCAiaXNVcGxvYWRhYmxlIiwgInRvRmlsZSIsICJkZWZhdWx0UGFyc2VSZXNwb25zZSIsICJkZWJ1ZyIsICJTdHJlYW0iLCAiQVBJUHJvbWlzZSIsICJBUElDbGllbnQiLCAidmFsaWRhdGVQb3NpdGl2ZUludGVnZXIiLCAiZmV0Y2giLCAiZ2V0UGxhdGZvcm1IZWFkZXJzIiwgInV1aWQ0IiwgIm9wdHMiLCAiUGFnZSIsICJpc011bHRpcGFydEJvZHkiLCAiX2EiLCAiZ2V0RGVmYXVsdEFnZW50IiwgImFwcGx5SGVhZGVyc011dCIsICJraW5kIiwgInJlcXVlc3QiLCAic3RhdHVzIiwgImVycm9yIiwgIkFQSUVycm9yIiwgIkFQSVVzZXJBYm9ydEVycm9yIiwgImNhc3RUb0Vycm9yIiwgIkFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IiLCAiQVBJQ29ubmVjdGlvbkVycm9yIiwgImNyZWF0ZVJlc3BvbnNlSGVhZGVycyIsICJyZXRyeU1lc3NhZ2UiLCAic2FmZUpTT04iLCAiZXJyIiwgIlBhZ2VQcm9taXNlIiwgImlzQWJzb2x1dGVVUkwiLCAiaXNFbXB0eU9iaiIsICJpbml0IiwgInNsZWVwIiwgIlZFUlNJT04iLCAiQWJzdHJhY3RQYWdlIiwgIl9BYnN0cmFjdFBhZ2VfY2xpZW50IiwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZEdldCIsICJnZXRQbGF0Zm9ybVByb3BlcnRpZXMiLCAiVkVSU0lPTiIsICJub3JtYWxpemVQbGF0Zm9ybSIsICJub3JtYWxpemVBcmNoIiwgImdldEJyb3dzZXJJbmZvIiwgInBsYXRmb3JtIiwgIl9wbGF0Zm9ybUhlYWRlcnMiLCAiZ2V0UGxhdGZvcm1IZWFkZXJzIiwgInNhZmVKU09OIiwgImVyciIsICJzdGFydHNXaXRoU2NoZW1lUmVnZXhwIiwgImlzQWJzb2x1dGVVUkwiLCAic2xlZXAiLCAidmFsaWRhdGVQb3NpdGl2ZUludGVnZXIiLCAiY2FzdFRvRXJyb3IiLCAicmVhZEVudiIsICJlbnYiLCAiX2EiLCAiaXNFbXB0eU9iaiIsICJoYXNPd24iLCAiYXBwbHlIZWFkZXJzTXV0IiwgImRlYnVnIiwgInV1aWQ0IiwgImlzUnVubmluZ0luQnJvd3NlciIsICJBUElSZXNvdXJjZSIsICJDb21wbGV0aW9ucyIsICJBUElSZXNvdXJjZSIsICJfYSIsICJDaGF0IiwgIkFQSVJlc291cmNlIiwgIkNvbXBsZXRpb25zIiwgIk1vZGVscyIsICJBUElSZXNvdXJjZSIsICJUcmFuc2NyaXB0aW9ucyIsICJBUElSZXNvdXJjZSIsICJtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMiLCAiVHJhbnNsYXRpb25zIiwgIkFQSVJlc291cmNlIiwgIm11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyIsICJBdWRpbyIsICJBUElSZXNvdXJjZSIsICJUcmFuc2NyaXB0aW9ucyIsICJUcmFuc2xhdGlvbnMiLCAiQVBJQ2xpZW50IiwgInJlYWRFbnYiLCAiX2EiLCAiaXNSdW5uaW5nSW5Ccm93c2VyIiwgIkNoYXQiLCAiQXVkaW8iLCAiTW9kZWxzIiwgIkFQSUVycm9yIiwgIkFQSUNvbm5lY3Rpb25FcnJvciIsICJBUElDb25uZWN0aW9uVGltZW91dEVycm9yIiwgIkFQSVVzZXJBYm9ydEVycm9yIiwgIk5vdEZvdW5kRXJyb3IiLCAiQ29uZmxpY3RFcnJvciIsICJSYXRlTGltaXRFcnJvciIsICJCYWRSZXF1ZXN0RXJyb3IiLCAiQXV0aGVudGljYXRpb25FcnJvciIsICJJbnRlcm5hbFNlcnZlckVycm9yIiwgIlBlcm1pc3Npb25EZW5pZWRFcnJvciIsICJVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IiLCAiR3JvcUVycm9yIiwgImVycm9yX2V4cG9ydHMiLCAiR3JvcSIsICJ0b0ZpbGUiLCAiZmlsZUZyb21QYXRoIiwgIkNoYXQiLCAiQXVkaW8iLCAiTW9kZWxzIiwgIl9hIiwgImRhdGEiLCAiZXJyb3IiLCAibW9kZWwiLCAibm9kZSIsICJmaWxlX3BhdGgiLCAiZXJyIiwgInF1ZXVlIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL2RvdGVudi9wYWNrYWdlLmpzb24iLCAibm9kZV9tb2R1bGVzL2RvdGVudi9saWIvbWFpbi5qcyIsICJtYWluLnRzIiwgIm5vZGVfbW9kdWxlcy9AYnVuZGxlZC1lcy1tb2R1bGVzL3BkZmpzLWRpc3QvYnVpbGQvcGRmLmpzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3ZlcnNpb24udHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvX3NoaW1zL3JlZ2lzdHJ5LnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL19zaGltcy9NdWx0aXBhcnRCb2R5LnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL19zaGltcy93ZWItcnVudGltZS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL19zaGltcy9pbmRleC5tanMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvZXJyb3IudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvc3RyZWFtaW5nLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3VwbG9hZHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvY29yZS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9wYWdpbmF0aW9uLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9jaGF0L2NvbXBsZXRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9jaGF0L2NoYXQudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2F1ZGlvL3NwZWVjaC50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYXVkaW8vdHJhbnNjcmlwdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2F1ZGlvL3RyYW5zbGF0aW9ucy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYXVkaW8vYXVkaW8udHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JhdGNoZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvYXNzaXN0YW50cy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvUnVubmFibGVGdW5jdGlvbi50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvY2hhdENvbXBsZXRpb25VdGlscy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lci50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvQ2hhdENvbXBsZXRpb25SdW5uZXIudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lci50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS9jaGF0L2NvbXBsZXRpb25zLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL2NoYXQvY2hhdC50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9saWIvQWJzdHJhY3RBc3Npc3RhbnRTdHJlYW1SdW5uZXIudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL0Fzc2lzdGFudFN0cmVhbS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL21lc3NhZ2VzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvcnVucy9zdGVwcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL3J1bnMvcnVucy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL3RocmVhZHMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvbGliL1V0aWwudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvdmVjdG9yLXN0b3Jlcy9maWxlcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS92ZWN0b3Itc3RvcmVzL2ZpbGUtYmF0Y2hlcy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvYmV0YS92ZWN0b3Itc3RvcmVzL3ZlY3Rvci1zdG9yZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2JldGEvYmV0YS50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvY29tcGxldGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2VtYmVkZGluZ3MudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2ZpbGVzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9maW5lLXR1bmluZy9qb2JzL2NoZWNrcG9pbnRzLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9maW5lLXR1bmluZy9qb2JzL2pvYnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL2ZpbmUtdHVuaW5nL2ZpbmUtdHVuaW5nLnRzIiwgIm5vZGVfbW9kdWxlcy9vcGVuYWkvc3JjL3Jlc291cmNlcy9pbWFnZXMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvcmVzb3VyY2VzL21vZGVscy50cyIsICJub2RlX21vZHVsZXMvb3BlbmFpL3NyYy9yZXNvdXJjZXMvbW9kZXJhdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL29wZW5haS9zcmMvaW5kZXgudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy92ZXJzaW9uLnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvX3NoaW1zL3JlZ2lzdHJ5LnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvX3NoaW1zL011bHRpcGFydEJvZHkudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9fc2hpbXMvd2ViLXJ1bnRpbWUudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL19zaGltcy9pbmRleC5tanMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9lcnJvci50cyIsICJub2RlX21vZHVsZXMvZ3JvcS1zZGsvc3JjL2xpYi9zdHJlYW1pbmcudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy91cGxvYWRzLnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvY29yZS50cyIsICJub2RlX21vZHVsZXMvZ3JvcS1zZGsvc3JjL3Jlc291cmNlLnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvcmVzb3VyY2VzL2NoYXQvY29tcGxldGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9yZXNvdXJjZXMvY2hhdC9jaGF0LnRzIiwgIm5vZGVfbW9kdWxlcy9ncm9xLXNkay9zcmMvcmVzb3VyY2VzL21vZGVscy50cyIsICJub2RlX21vZHVsZXMvZ3JvcS1zZGsvc3JjL3Jlc291cmNlcy9hdWRpby90cmFuc2NyaXB0aW9ucy50cyIsICJub2RlX21vZHVsZXMvZ3JvcS1zZGsvc3JjL3Jlc291cmNlcy9hdWRpby90cmFuc2xhdGlvbnMudHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9yZXNvdXJjZXMvYXVkaW8vYXVkaW8udHMiLCAibm9kZV9tb2R1bGVzL2dyb3Etc2RrL3NyYy9pbmRleC50cyIsICJub2RlX21vZHVsZXMvbW9ua2V5LWFyb3VuZC9kaXN0L2luZGV4Lm1qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsie1xuICBcIm5hbWVcIjogXCJkb3RlbnZcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMTYuNC41XCIsXG4gIFwiZGVzY3JpcHRpb25cIjogXCJMb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVcIixcbiAgXCJtYWluXCI6IFwibGliL21haW4uanNcIixcbiAgXCJ0eXBlc1wiOiBcImxpYi9tYWluLmQudHNcIixcbiAgXCJleHBvcnRzXCI6IHtcbiAgICBcIi5cIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vbGliL21haW4uZC50c1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9saWIvbWFpbi5qc1wiLFxuICAgICAgXCJkZWZhdWx0XCI6IFwiLi9saWIvbWFpbi5qc1wiXG4gICAgfSxcbiAgICBcIi4vY29uZmlnXCI6IFwiLi9jb25maWcuanNcIixcbiAgICBcIi4vY29uZmlnLmpzXCI6IFwiLi9jb25maWcuanNcIixcbiAgICBcIi4vbGliL2Vudi1vcHRpb25zXCI6IFwiLi9saWIvZW52LW9wdGlvbnMuanNcIixcbiAgICBcIi4vbGliL2Vudi1vcHRpb25zLmpzXCI6IFwiLi9saWIvZW52LW9wdGlvbnMuanNcIixcbiAgICBcIi4vbGliL2NsaS1vcHRpb25zXCI6IFwiLi9saWIvY2xpLW9wdGlvbnMuanNcIixcbiAgICBcIi4vbGliL2NsaS1vcHRpb25zLmpzXCI6IFwiLi9saWIvY2xpLW9wdGlvbnMuanNcIixcbiAgICBcIi4vcGFja2FnZS5qc29uXCI6IFwiLi9wYWNrYWdlLmpzb25cIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwiZHRzLWNoZWNrXCI6IFwidHNjIC0tcHJvamVjdCB0ZXN0cy90eXBlcy90c2NvbmZpZy5qc29uXCIsXG4gICAgXCJsaW50XCI6IFwic3RhbmRhcmRcIixcbiAgICBcImxpbnQtcmVhZG1lXCI6IFwic3RhbmRhcmQtbWFya2Rvd25cIixcbiAgICBcInByZXRlc3RcIjogXCJucG0gcnVuIGxpbnQgJiYgbnBtIHJ1biBkdHMtY2hlY2tcIixcbiAgICBcInRlc3RcIjogXCJ0YXAgdGVzdHMvKi5qcyAtLTEwMCAtUnNwZWNcIixcbiAgICBcInRlc3Q6Y292ZXJhZ2VcIjogXCJ0YXAgLS1jb3ZlcmFnZS1yZXBvcnQ9bGNvdlwiLFxuICAgIFwicHJlcmVsZWFzZVwiOiBcIm5wbSB0ZXN0XCIsXG4gICAgXCJyZWxlYXNlXCI6IFwic3RhbmRhcmQtdmVyc2lvblwiXG4gIH0sXG4gIFwicmVwb3NpdG9yeVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiZ2l0XCIsXG4gICAgXCJ1cmxcIjogXCJnaXQ6Ly9naXRodWIuY29tL21vdGRvdGxhL2RvdGVudi5naXRcIlxuICB9LFxuICBcImZ1bmRpbmdcIjogXCJodHRwczovL2RvdGVudnguY29tXCIsXG4gIFwia2V5d29yZHNcIjogW1xuICAgIFwiZG90ZW52XCIsXG4gICAgXCJlbnZcIixcbiAgICBcIi5lbnZcIixcbiAgICBcImVudmlyb25tZW50XCIsXG4gICAgXCJ2YXJpYWJsZXNcIixcbiAgICBcImNvbmZpZ1wiLFxuICAgIFwic2V0dGluZ3NcIlxuICBdLFxuICBcInJlYWRtZUZpbGVuYW1lXCI6IFwiUkVBRE1FLm1kXCIsXG4gIFwibGljZW5zZVwiOiBcIkJTRC0yLUNsYXVzZVwiLFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAZGVmaW5pdGVseXR5cGVkL2R0c2xpbnRcIjogXCJeMC4wLjEzM1wiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMTguMTEuM1wiLFxuICAgIFwiZGVjYWNoZVwiOiBcIl40LjYuMVwiLFxuICAgIFwic2lub25cIjogXCJeMTQuMC4xXCIsXG4gICAgXCJzdGFuZGFyZFwiOiBcIl4xNy4wLjBcIixcbiAgICBcInN0YW5kYXJkLW1hcmtkb3duXCI6IFwiXjcuMS4wXCIsXG4gICAgXCJzdGFuZGFyZC12ZXJzaW9uXCI6IFwiXjkuNS4wXCIsXG4gICAgXCJ0YXBcIjogXCJeMTYuMy4wXCIsXG4gICAgXCJ0YXJcIjogXCJeNi4xLjExXCIsXG4gICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjQuOC40XCJcbiAgfSxcbiAgXCJlbmdpbmVzXCI6IHtcbiAgICBcIm5vZGVcIjogXCI+PTEyXCJcbiAgfSxcbiAgXCJicm93c2VyXCI6IHtcbiAgICBcImZzXCI6IGZhbHNlXG4gIH1cbn1cbiIsICJjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKVxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbmNvbnN0IHBhY2thZ2VKc29uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJylcblxuY29uc3QgdmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb25cblxuY29uc3QgTElORSA9IC8oPzpefF4pXFxzKig/OmV4cG9ydFxccyspPyhbXFx3Li1dKykoPzpcXHMqPVxccyo/fDpcXHMrPykoXFxzKicoPzpcXFxcJ3xbXiddKSonfFxccypcIig/OlxcXFxcInxbXlwiXSkqXCJ8XFxzKmAoPzpcXFxcYHxbXmBdKSpgfFteI1xcclxcbl0rKT9cXHMqKD86Iy4qKT8oPzokfCQpL21nXG5cbi8vIFBhcnNlIHNyYyBpbnRvIGFuIE9iamVjdFxuZnVuY3Rpb24gcGFyc2UgKHNyYykge1xuICBjb25zdCBvYmogPSB7fVxuXG4gIC8vIENvbnZlcnQgYnVmZmVyIHRvIHN0cmluZ1xuICBsZXQgbGluZXMgPSBzcmMudG9TdHJpbmcoKVxuXG4gIC8vIENvbnZlcnQgbGluZSBicmVha3MgdG8gc2FtZSBmb3JtYXRcbiAgbGluZXMgPSBsaW5lcy5yZXBsYWNlKC9cXHJcXG4/L21nLCAnXFxuJylcblxuICBsZXQgbWF0Y2hcbiAgd2hpbGUgKChtYXRjaCA9IExJTkUuZXhlYyhsaW5lcykpICE9IG51bGwpIHtcbiAgICBjb25zdCBrZXkgPSBtYXRjaFsxXVxuXG4gICAgLy8gRGVmYXVsdCB1bmRlZmluZWQgb3IgbnVsbCB0byBlbXB0eSBzdHJpbmdcbiAgICBsZXQgdmFsdWUgPSAobWF0Y2hbMl0gfHwgJycpXG5cbiAgICAvLyBSZW1vdmUgd2hpdGVzcGFjZVxuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpXG5cbiAgICAvLyBDaGVjayBpZiBkb3VibGUgcXVvdGVkXG4gICAgY29uc3QgbWF5YmVRdW90ZSA9IHZhbHVlWzBdXG5cbiAgICAvLyBSZW1vdmUgc3Vycm91bmRpbmcgcXVvdGVzXG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eKFsnXCJgXSkoW1xcc1xcU10qKVxcMSQvbWcsICckMicpXG5cbiAgICAvLyBFeHBhbmQgbmV3bGluZXMgaWYgZG91YmxlIHF1b3RlZFxuICAgIGlmIChtYXliZVF1b3RlID09PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXFxcci9nLCAnXFxyJylcbiAgICB9XG5cbiAgICAvLyBBZGQgdG8gb2JqZWN0XG4gICAgb2JqW2tleV0gPSB2YWx1ZVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5mdW5jdGlvbiBfcGFyc2VWYXVsdCAob3B0aW9ucykge1xuICBjb25zdCB2YXVsdFBhdGggPSBfdmF1bHRQYXRoKG9wdGlvbnMpXG5cbiAgLy8gUGFyc2UgLmVudi52YXVsdFxuICBjb25zdCByZXN1bHQgPSBEb3RlbnZNb2R1bGUuY29uZmlnRG90ZW52KHsgcGF0aDogdmF1bHRQYXRoIH0pXG4gIGlmICghcmVzdWx0LnBhcnNlZCkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgTUlTU0lOR19EQVRBOiBDYW5ub3QgcGFyc2UgJHt2YXVsdFBhdGh9IGZvciBhbiB1bmtub3duIHJlYXNvbmApXG4gICAgZXJyLmNvZGUgPSAnTUlTU0lOR19EQVRBJ1xuICAgIHRocm93IGVyclxuICB9XG5cbiAgLy8gaGFuZGxlIHNjZW5hcmlvIGZvciBjb21tYSBzZXBhcmF0ZWQga2V5cyAtIGZvciB1c2Ugd2l0aCBrZXkgcm90YXRpb25cbiAgLy8gZXhhbXBsZTogRE9URU5WX0tFWT1cImRvdGVudjovLzprZXlfMTIzNEBkb3RlbnZ4LmNvbS92YXVsdC8uZW52LnZhdWx0P2Vudmlyb25tZW50PXByb2QsZG90ZW52Oi8vOmtleV83ODkwQGRvdGVudnguY29tL3ZhdWx0Ly5lbnYudmF1bHQ/ZW52aXJvbm1lbnQ9cHJvZFwiXG4gIGNvbnN0IGtleXMgPSBfZG90ZW52S2V5KG9wdGlvbnMpLnNwbGl0KCcsJylcbiAgY29uc3QgbGVuZ3RoID0ga2V5cy5sZW5ndGhcblxuICBsZXQgZGVjcnlwdGVkXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGZ1bGwga2V5XG4gICAgICBjb25zdCBrZXkgPSBrZXlzW2ldLnRyaW0oKVxuXG4gICAgICAvLyBHZXQgaW5zdHJ1Y3Rpb25zIGZvciBkZWNyeXB0XG4gICAgICBjb25zdCBhdHRycyA9IF9pbnN0cnVjdGlvbnMocmVzdWx0LCBrZXkpXG5cbiAgICAgIC8vIERlY3J5cHRcbiAgICAgIGRlY3J5cHRlZCA9IERvdGVudk1vZHVsZS5kZWNyeXB0KGF0dHJzLmNpcGhlcnRleHQsIGF0dHJzLmtleSlcblxuICAgICAgYnJlYWtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gbGFzdCBrZXlcbiAgICAgIGlmIChpICsgMSA+PSBsZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICAgIC8vIHRyeSBuZXh0IGtleVxuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlIGRlY3J5cHRlZCAuZW52IHN0cmluZ1xuICByZXR1cm4gRG90ZW52TW9kdWxlLnBhcnNlKGRlY3J5cHRlZClcbn1cblxuZnVuY3Rpb24gX2xvZyAobWVzc2FnZSkge1xuICBjb25zb2xlLmxvZyhgW2RvdGVudkAke3ZlcnNpb259XVtJTkZPXSAke21lc3NhZ2V9YClcbn1cblxuZnVuY3Rpb24gX3dhcm4gKG1lc3NhZ2UpIHtcbiAgY29uc29sZS5sb2coYFtkb3RlbnZAJHt2ZXJzaW9ufV1bV0FSTl0gJHttZXNzYWdlfWApXG59XG5cbmZ1bmN0aW9uIF9kZWJ1ZyAobWVzc2FnZSkge1xuICBjb25zb2xlLmxvZyhgW2RvdGVudkAke3ZlcnNpb259XVtERUJVR10gJHttZXNzYWdlfWApXG59XG5cbmZ1bmN0aW9uIF9kb3RlbnZLZXkgKG9wdGlvbnMpIHtcbiAgLy8gcHJpb3JpdGl6ZSBkZXZlbG9wZXIgZGlyZWN0bHkgc2V0dGluZyBvcHRpb25zLkRPVEVOVl9LRVlcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5ET1RFTlZfS0VZICYmIG9wdGlvbnMuRE9URU5WX0tFWS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuRE9URU5WX0tFWVxuICB9XG5cbiAgLy8gc2Vjb25kYXJ5IGluZnJhIGFscmVhZHkgY29udGFpbnMgYSBET1RFTlZfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlXG4gIGlmIChwcm9jZXNzLmVudi5ET1RFTlZfS0VZICYmIHByb2Nlc3MuZW52LkRPVEVOVl9LRVkubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5ET1RFTlZfS0VZXG4gIH1cblxuICAvLyBmYWxsYmFjayB0byBlbXB0eSBzdHJpbmdcbiAgcmV0dXJuICcnXG59XG5cbmZ1bmN0aW9uIF9pbnN0cnVjdGlvbnMgKHJlc3VsdCwgZG90ZW52S2V5KSB7XG4gIC8vIFBhcnNlIERPVEVOVl9LRVkuIEZvcm1hdCBpcyBhIFVSSVxuICBsZXQgdXJpXG4gIHRyeSB7XG4gICAgdXJpID0gbmV3IFVSTChkb3RlbnZLZXkpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yLmNvZGUgPT09ICdFUlJfSU5WQUxJRF9VUkwnKSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0lOVkFMSURfRE9URU5WX0tFWTogV3JvbmcgZm9ybWF0LiBNdXN0IGJlIGluIHZhbGlkIHVyaSBmb3JtYXQgbGlrZSBkb3RlbnY6Ly86a2V5XzEyMzRAZG90ZW52eC5jb20vdmF1bHQvLmVudi52YXVsdD9lbnZpcm9ubWVudD1kZXZlbG9wbWVudCcpXG4gICAgICBlcnIuY29kZSA9ICdJTlZBTElEX0RPVEVOVl9LRVknXG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgLy8gR2V0IGRlY3J5cHQga2V5XG4gIGNvbnN0IGtleSA9IHVyaS5wYXNzd29yZFxuICBpZiAoIWtleSkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignSU5WQUxJRF9ET1RFTlZfS0VZOiBNaXNzaW5nIGtleSBwYXJ0JylcbiAgICBlcnIuY29kZSA9ICdJTlZBTElEX0RPVEVOVl9LRVknXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICAvLyBHZXQgZW52aXJvbm1lbnRcbiAgY29uc3QgZW52aXJvbm1lbnQgPSB1cmkuc2VhcmNoUGFyYW1zLmdldCgnZW52aXJvbm1lbnQnKVxuICBpZiAoIWVudmlyb25tZW50KSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKCdJTlZBTElEX0RPVEVOVl9LRVk6IE1pc3NpbmcgZW52aXJvbm1lbnQgcGFydCcpXG4gICAgZXJyLmNvZGUgPSAnSU5WQUxJRF9ET1RFTlZfS0VZJ1xuICAgIHRocm93IGVyclxuICB9XG5cbiAgLy8gR2V0IGNpcGhlcnRleHQgcGF5bG9hZFxuICBjb25zdCBlbnZpcm9ubWVudEtleSA9IGBET1RFTlZfVkFVTFRfJHtlbnZpcm9ubWVudC50b1VwcGVyQ2FzZSgpfWBcbiAgY29uc3QgY2lwaGVydGV4dCA9IHJlc3VsdC5wYXJzZWRbZW52aXJvbm1lbnRLZXldIC8vIERPVEVOVl9WQVVMVF9QUk9EVUNUSU9OXG4gIGlmICghY2lwaGVydGV4dCkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgTk9UX0ZPVU5EX0RPVEVOVl9FTlZJUk9OTUVOVDogQ2Fubm90IGxvY2F0ZSBlbnZpcm9ubWVudCAke2Vudmlyb25tZW50S2V5fSBpbiB5b3VyIC5lbnYudmF1bHQgZmlsZS5gKVxuICAgIGVyci5jb2RlID0gJ05PVF9GT1VORF9ET1RFTlZfRU5WSVJPTk1FTlQnXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICByZXR1cm4geyBjaXBoZXJ0ZXh0LCBrZXkgfVxufVxuXG5mdW5jdGlvbiBfdmF1bHRQYXRoIChvcHRpb25zKSB7XG4gIGxldCBwb3NzaWJsZVZhdWx0UGF0aCA9IG51bGxcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnBhdGggJiYgb3B0aW9ucy5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnBhdGgpKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpbGVwYXRoIG9mIG9wdGlvbnMucGF0aCkge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlcGF0aCkpIHtcbiAgICAgICAgICBwb3NzaWJsZVZhdWx0UGF0aCA9IGZpbGVwYXRoLmVuZHNXaXRoKCcudmF1bHQnKSA/IGZpbGVwYXRoIDogYCR7ZmlsZXBhdGh9LnZhdWx0YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvc3NpYmxlVmF1bHRQYXRoID0gb3B0aW9ucy5wYXRoLmVuZHNXaXRoKCcudmF1bHQnKSA/IG9wdGlvbnMucGF0aCA6IGAke29wdGlvbnMucGF0aH0udmF1bHRgXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBvc3NpYmxlVmF1bHRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52LnZhdWx0JylcbiAgfVxuXG4gIGlmIChmcy5leGlzdHNTeW5jKHBvc3NpYmxlVmF1bHRQYXRoKSkge1xuICAgIHJldHVybiBwb3NzaWJsZVZhdWx0UGF0aFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVIb21lIChlbnZQYXRoKSB7XG4gIHJldHVybiBlbnZQYXRoWzBdID09PSAnficgPyBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCBlbnZQYXRoLnNsaWNlKDEpKSA6IGVudlBhdGhcbn1cblxuZnVuY3Rpb24gX2NvbmZpZ1ZhdWx0IChvcHRpb25zKSB7XG4gIF9sb2coJ0xvYWRpbmcgZW52IGZyb20gZW5jcnlwdGVkIC5lbnYudmF1bHQnKVxuXG4gIGNvbnN0IHBhcnNlZCA9IERvdGVudk1vZHVsZS5fcGFyc2VWYXVsdChvcHRpb25zKVxuXG4gIGxldCBwcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnZcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wcm9jZXNzRW52ICE9IG51bGwpIHtcbiAgICBwcm9jZXNzRW52ID0gb3B0aW9ucy5wcm9jZXNzRW52XG4gIH1cblxuICBEb3RlbnZNb2R1bGUucG9wdWxhdGUocHJvY2Vzc0VudiwgcGFyc2VkLCBvcHRpb25zKVxuXG4gIHJldHVybiB7IHBhcnNlZCB9XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ0RvdGVudiAob3B0aW9ucykge1xuICBjb25zdCBkb3RlbnZQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52JylcbiAgbGV0IGVuY29kaW5nID0gJ3V0ZjgnXG4gIGNvbnN0IGRlYnVnID0gQm9vbGVhbihvcHRpb25zICYmIG9wdGlvbnMuZGVidWcpXG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGluZykge1xuICAgIGVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZ1xuICB9IGVsc2Uge1xuICAgIGlmIChkZWJ1Zykge1xuICAgICAgX2RlYnVnKCdObyBlbmNvZGluZyBpcyBzcGVjaWZpZWQuIFVURi04IGlzIHVzZWQgYnkgZGVmYXVsdCcpXG4gICAgfVxuICB9XG5cbiAgbGV0IG9wdGlvblBhdGhzID0gW2RvdGVudlBhdGhdIC8vIGRlZmF1bHQsIGxvb2sgZm9yIC5lbnZcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wYXRoKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMucGF0aCkpIHtcbiAgICAgIG9wdGlvblBhdGhzID0gW19yZXNvbHZlSG9tZShvcHRpb25zLnBhdGgpXVxuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25QYXRocyA9IFtdIC8vIHJlc2V0IGRlZmF1bHRcbiAgICAgIGZvciAoY29uc3QgZmlsZXBhdGggb2Ygb3B0aW9ucy5wYXRoKSB7XG4gICAgICAgIG9wdGlvblBhdGhzLnB1c2goX3Jlc29sdmVIb21lKGZpbGVwYXRoKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCB0aGUgcGFyc2VkIGRhdGEgaW4gYSB0ZW1wb3Jhcnkgb2JqZWN0IChiZWNhdXNlIHdlIG5lZWQgdG8gcmV0dXJuIGl0KS4gIE9uY2Ugd2UgaGF2ZSB0aGUgZmluYWxcbiAgLy8gcGFyc2VkIGRhdGEsIHdlIHdpbGwgY29tYmluZSBpdCB3aXRoIHByb2Nlc3MuZW52IChvciBvcHRpb25zLnByb2Nlc3NFbnYgaWYgcHJvdmlkZWQpLlxuICBsZXQgbGFzdEVycm9yXG4gIGNvbnN0IHBhcnNlZEFsbCA9IHt9XG4gIGZvciAoY29uc3QgcGF0aCBvZiBvcHRpb25QYXRocykge1xuICAgIHRyeSB7XG4gICAgICAvLyBTcGVjaWZ5aW5nIGFuIGVuY29kaW5nIHJldHVybnMgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGJ1ZmZlclxuICAgICAgY29uc3QgcGFyc2VkID0gRG90ZW52TW9kdWxlLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLCB7IGVuY29kaW5nIH0pKVxuXG4gICAgICBEb3RlbnZNb2R1bGUucG9wdWxhdGUocGFyc2VkQWxsLCBwYXJzZWQsIG9wdGlvbnMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIF9kZWJ1ZyhgRmFpbGVkIHRvIGxvYWQgJHtwYXRofSAke2UubWVzc2FnZX1gKVxuICAgICAgfVxuICAgICAgbGFzdEVycm9yID0gZVxuICAgIH1cbiAgfVxuXG4gIGxldCBwcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnZcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wcm9jZXNzRW52ICE9IG51bGwpIHtcbiAgICBwcm9jZXNzRW52ID0gb3B0aW9ucy5wcm9jZXNzRW52XG4gIH1cblxuICBEb3RlbnZNb2R1bGUucG9wdWxhdGUocHJvY2Vzc0VudiwgcGFyc2VkQWxsLCBvcHRpb25zKVxuXG4gIGlmIChsYXN0RXJyb3IpIHtcbiAgICByZXR1cm4geyBwYXJzZWQ6IHBhcnNlZEFsbCwgZXJyb3I6IGxhc3RFcnJvciB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgcGFyc2VkOiBwYXJzZWRBbGwgfVxuICB9XG59XG5cbi8vIFBvcHVsYXRlcyBwcm9jZXNzLmVudiBmcm9tIC5lbnYgZmlsZVxuZnVuY3Rpb24gY29uZmlnIChvcHRpb25zKSB7XG4gIC8vIGZhbGxiYWNrIHRvIG9yaWdpbmFsIGRvdGVudiBpZiBET1RFTlZfS0VZIGlzIG5vdCBzZXRcbiAgaWYgKF9kb3RlbnZLZXkob3B0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIERvdGVudk1vZHVsZS5jb25maWdEb3RlbnYob3B0aW9ucylcbiAgfVxuXG4gIGNvbnN0IHZhdWx0UGF0aCA9IF92YXVsdFBhdGgob3B0aW9ucylcblxuICAvLyBkb3RlbnZLZXkgZXhpc3RzIGJ1dCAuZW52LnZhdWx0IGZpbGUgZG9lcyBub3QgZXhpc3RcbiAgaWYgKCF2YXVsdFBhdGgpIHtcbiAgICBfd2FybihgWW91IHNldCBET1RFTlZfS0VZIGJ1dCB5b3UgYXJlIG1pc3NpbmcgYSAuZW52LnZhdWx0IGZpbGUgYXQgJHt2YXVsdFBhdGh9LiBEaWQgeW91IGZvcmdldCB0byBidWlsZCBpdD9gKVxuXG4gICAgcmV0dXJuIERvdGVudk1vZHVsZS5jb25maWdEb3RlbnYob3B0aW9ucylcbiAgfVxuXG4gIHJldHVybiBEb3RlbnZNb2R1bGUuX2NvbmZpZ1ZhdWx0KG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGRlY3J5cHQgKGVuY3J5cHRlZCwga2V5U3RyKSB7XG4gIGNvbnN0IGtleSA9IEJ1ZmZlci5mcm9tKGtleVN0ci5zbGljZSgtNjQpLCAnaGV4JylcbiAgbGV0IGNpcGhlcnRleHQgPSBCdWZmZXIuZnJvbShlbmNyeXB0ZWQsICdiYXNlNjQnKVxuXG4gIGNvbnN0IG5vbmNlID0gY2lwaGVydGV4dC5zdWJhcnJheSgwLCAxMilcbiAgY29uc3QgYXV0aFRhZyA9IGNpcGhlcnRleHQuc3ViYXJyYXkoLTE2KVxuICBjaXBoZXJ0ZXh0ID0gY2lwaGVydGV4dC5zdWJhcnJheSgxMiwgLTE2KVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYWVzZ2NtID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0yNTYtZ2NtJywga2V5LCBub25jZSlcbiAgICBhZXNnY20uc2V0QXV0aFRhZyhhdXRoVGFnKVxuICAgIHJldHVybiBgJHthZXNnY20udXBkYXRlKGNpcGhlcnRleHQpfSR7YWVzZ2NtLmZpbmFsKCl9YFxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGlzUmFuZ2UgPSBlcnJvciBpbnN0YW5jZW9mIFJhbmdlRXJyb3JcbiAgICBjb25zdCBpbnZhbGlkS2V5TGVuZ3RoID0gZXJyb3IubWVzc2FnZSA9PT0gJ0ludmFsaWQga2V5IGxlbmd0aCdcbiAgICBjb25zdCBkZWNyeXB0aW9uRmFpbGVkID0gZXJyb3IubWVzc2FnZSA9PT0gJ1Vuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YSdcblxuICAgIGlmIChpc1JhbmdlIHx8IGludmFsaWRLZXlMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignSU5WQUxJRF9ET1RFTlZfS0VZOiBJdCBtdXN0IGJlIDY0IGNoYXJhY3RlcnMgbG9uZyAob3IgbW9yZSknKVxuICAgICAgZXJyLmNvZGUgPSAnSU5WQUxJRF9ET1RFTlZfS0VZJ1xuICAgICAgdGhyb3cgZXJyXG4gICAgfSBlbHNlIGlmIChkZWNyeXB0aW9uRmFpbGVkKSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0RFQ1JZUFRJT05fRkFJTEVEOiBQbGVhc2UgY2hlY2sgeW91ciBET1RFTlZfS0VZJylcbiAgICAgIGVyci5jb2RlID0gJ0RFQ1JZUFRJT05fRkFJTEVEJ1xuICAgICAgdGhyb3cgZXJyXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG59XG5cbi8vIFBvcHVsYXRlIHByb2Nlc3MuZW52IHdpdGggcGFyc2VkIHZhbHVlc1xuZnVuY3Rpb24gcG9wdWxhdGUgKHByb2Nlc3NFbnYsIHBhcnNlZCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGRlYnVnID0gQm9vbGVhbihvcHRpb25zICYmIG9wdGlvbnMuZGVidWcpXG4gIGNvbnN0IG92ZXJyaWRlID0gQm9vbGVhbihvcHRpb25zICYmIG9wdGlvbnMub3ZlcnJpZGUpXG5cbiAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKCdPQkpFQ1RfUkVRVUlSRUQ6IFBsZWFzZSBjaGVjayB0aGUgcHJvY2Vzc0VudiBhcmd1bWVudCBiZWluZyBwYXNzZWQgdG8gcG9wdWxhdGUnKVxuICAgIGVyci5jb2RlID0gJ09CSkVDVF9SRVFVSVJFRCdcbiAgICB0aHJvdyBlcnJcbiAgfVxuXG4gIC8vIFNldCBwcm9jZXNzLmVudlxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXJzZWQpKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9jZXNzRW52LCBrZXkpKSB7XG4gICAgICBpZiAob3ZlcnJpZGUgPT09IHRydWUpIHtcbiAgICAgICAgcHJvY2Vzc0VudltrZXldID0gcGFyc2VkW2tleV1cbiAgICAgIH1cblxuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGlmIChvdmVycmlkZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIF9kZWJ1ZyhgXCIke2tleX1cIiBpcyBhbHJlYWR5IGRlZmluZWQgYW5kIFdBUyBvdmVyd3JpdHRlbmApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2RlYnVnKGBcIiR7a2V5fVwiIGlzIGFscmVhZHkgZGVmaW5lZCBhbmQgd2FzIE5PVCBvdmVyd3JpdHRlbmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0VudltrZXldID0gcGFyc2VkW2tleV1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgRG90ZW52TW9kdWxlID0ge1xuICBjb25maWdEb3RlbnYsXG4gIF9jb25maWdWYXVsdCxcbiAgX3BhcnNlVmF1bHQsXG4gIGNvbmZpZyxcbiAgZGVjcnlwdCxcbiAgcGFyc2UsXG4gIHBvcHVsYXRlXG59XG5cbm1vZHVsZS5leHBvcnRzLmNvbmZpZ0RvdGVudiA9IERvdGVudk1vZHVsZS5jb25maWdEb3RlbnZcbm1vZHVsZS5leHBvcnRzLl9jb25maWdWYXVsdCA9IERvdGVudk1vZHVsZS5fY29uZmlnVmF1bHRcbm1vZHVsZS5leHBvcnRzLl9wYXJzZVZhdWx0ID0gRG90ZW52TW9kdWxlLl9wYXJzZVZhdWx0XG5tb2R1bGUuZXhwb3J0cy5jb25maWcgPSBEb3RlbnZNb2R1bGUuY29uZmlnXG5tb2R1bGUuZXhwb3J0cy5kZWNyeXB0ID0gRG90ZW52TW9kdWxlLmRlY3J5cHRcbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gRG90ZW52TW9kdWxlLnBhcnNlXG5tb2R1bGUuZXhwb3J0cy5wb3B1bGF0ZSA9IERvdGVudk1vZHVsZS5wb3B1bGF0ZVxuXG5tb2R1bGUuZXhwb3J0cyA9IERvdGVudk1vZHVsZVxuIiwgImltcG9ydCBwZGZqcyBmcm9tIFwiQGJ1bmRsZWQtZXMtbW9kdWxlcy9wZGZqcy1kaXN0L2J1aWxkL3BkZlwiO1xuaW1wb3J0IHZpZXdlciBmcm9tIFwiQGJ1bmRsZWQtZXMtbW9kdWxlcy9wZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyXCI7XG5pbXBvcnQgT3BlbkFJIGZyb20gXCJvcGVuYWlcIjtcbmltcG9ydCBHcm9xIGZyb20gXCJncm9xLXNka1wiO1xuaW1wb3J0IHsgYXJvdW5kIH0gZnJvbSBcIm1vbmtleS1hcm91bmRcIjtcbmltcG9ydCB7IENhbnZhcywgVmlld3BvcnROb2RlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gICAgQXBwLFxuICAgIEVkaXRvcixcbiAgICBNYXJrZG93blZpZXcsXG4gICAgTW9kYWwsXG4gICAgTm90aWNlLFxuICAgIFBsdWdpbixcbiAgICBQbHVnaW5TZXR0aW5nVGFiLFxuICAgIFNldHRpbmcsXG4gICAgSXRlbVZpZXcsXG4gICAgV29ya3NwYWNlTGVhZixcbiAgICBzZXRUb29sdGlwLFxuICAgIHNldEljb24sXG4gICAgVmlldyxcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge1xuICAgIE5vZGVTaWRlLFxuICAgIEVkZ2VFbmQsXG4gICAgQ2FudmFzQ29sb3IsXG4gICAgQ2FudmFzRGF0YSxcbiAgICBDYW52YXNFZGdlRGF0YSxcbiAgICBDYW52YXNGaWxlRGF0YSxcbiAgICBDYW52YXNHcm91cERhdGEsXG4gICAgQ2FudmFzTGlua0RhdGEsXG4gICAgQ2FudmFzTm9kZURhdGEsXG4gICAgQ2FudmFzVGV4dERhdGEsXG4gICAgQWxsQ2FudmFzTm9kZURhdGEsXG59IGZyb20gXCJvYnNpZGlhbi9jYW52YXNcIjtcbmltcG9ydCB7IHN5bnRheFRyZWUgfSBmcm9tIFwiQGNvZGVtaXJyb3IvbGFuZ3VhZ2VcIjtcbmltcG9ydCB7IEV4dGVuc2lvbiwgUmFuZ2VTZXRCdWlsZGVyLCBTdGF0ZUZpZWxkLCBUcmFuc2FjdGlvbiB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiwgRGVjb3JhdGlvblNldCwgRWRpdG9yVmlldywgV2lkZ2V0VHlwZSB9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQgKiBhcyBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuLy8gZG90ZW52LmNvbmZpZyh7IGRlYnVnOiB0cnVlfVxuXG5jb25zdCBiYXNlUGF0aCA9IFwiL1VzZXJzL2phY29iY29sbGluZy9Eb2N1bWVudHMvYWNjZWxlcmF0ZS9hY2NlbGVyYXRlL1wiO1xuXG5kb3RlbnYuY29uZmlnKHtcbiAgICBwYXRoOiBgJHtiYXNlUGF0aH0vLm9ic2lkaWFuL3BsdWdpbnMvY2FyZXQvLmVudmAsXG59KTtcblxuY29uc3QgZ3JvcV9hcGlfa2V5ID0gcHJvY2Vzcy5lbnYuR1JPUV9BUElfS0VZO1xuY29uc3Qgb3BlbmFpX2tleSA9IHByb2Nlc3MuZW52Lk9QRU5BSV9LRVk7XG5jb25zdCBncm9xID0gbmV3IEdyb3EoeyBhcGlLZXk6IGdyb3FfYXBpX2tleSwgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXI6IHRydWUgfSk7XG5jb25zdCBvcGVuYWkgPSBuZXcgT3BlbkFJKHsgYXBpS2V5OiBvcGVuYWlfa2V5LCBkYW5nZXJvdXNseUFsbG93QnJvd3NlcjogdHJ1ZSB9KTtcblxuLy8gU3RhcnQgb2Ygbm9kZSBhbmQgZWRnZSBmdW5jdGlvbnNcbmludGVyZmFjZSBlZGdlVCB7XG4gICAgZnJvbU9yVG86IHN0cmluZztcbiAgICBzaWRlOiBzdHJpbmc7XG4gICAgbm9kZTogQ2FudmFzTm9kZURhdGE7XG59XG5cbmludGVyZmFjZSBUcmVlTm9kZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjaGlsZHJlbjogVHJlZU5vZGVbXTtcbn1cblxuaW50ZXJmYWNlIE5vZGUge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBFZGdlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGZyb21Ob2RlOiBzdHJpbmc7XG4gICAgZnJvbVNpZGU6IHN0cmluZztcbiAgICB0b05vZGU6IHN0cmluZztcbiAgICB0b1NpZGU6IHN0cmluZztcbn1cbmV4cG9ydCBjbGFzcyBDTURKTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgcmVzdWx0OiBzdHJpbmc7XG4gICAgc2VsZWN0ZWRUZXh0OiBzdHJpbmc7XG4gICAgc3RhcnRJbmRleDogbnVtYmVyO1xuICAgIGVuZEluZGV4OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgc2VsZWN0ZWRUZXh0OiBzdHJpbmcsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcikge1xuICAgICAgICBzdXBlcihhcHApO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGV4dCA9IHNlbGVjdGVkVGV4dDtcbiAgICAgICAgdGhpcy5zdGFydEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICAgICAgdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4O1xuICAgIH1cblxuICAgIG9uT3BlbigpIHtcbiAgICAgICAgY29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHRleHREaXNwbGF5ID0gY29udGVudEVsLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMuc2VsZWN0ZWRUZXh0LFxuICAgICAgICB9KTtcbiAgICAgICAgdGV4dERpc3BsYXkuc3R5bGUuaGVpZ2h0ID0gXCI2MHB4XCI7XG4gICAgICAgIHRleHREaXNwbGF5LnN0eWxlLm92ZXJmbG93ID0gXCJzY3JvbGxcIjtcblxuICAgICAgICBjb250ZW50RWwuY3JlYXRlRWwoXCJiclwiKTsgLy8gTGluZSBicmVha1xuXG4gICAgICAgIGNvbnN0IHRleHRBcmVhID0gY29udGVudEVsLmNyZWF0ZUVsKFwidGV4dGFyZWFcIiwge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiVHlwZSBoZXJlLi4uXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0ZXh0QXJlYS5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5taW5IZWlnaHQgPSBcIjEwMHB4XCI7XG4gICAgICAgIHRleHRBcmVhLnN0eWxlLnJlc2l6ZSA9IFwibm9uZVwiO1xuICAgICAgICB0ZXh0QXJlYS5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuaGVpZ2h0ID0gXCJcIjsgLy8gUmVzZXQgdGhlIGhlaWdodFxuICAgICAgICAgICAgdGV4dEFyZWEuc3R5bGUuaGVpZ2h0ID0gYCR7dGV4dEFyZWEuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBidXR0b25Db250YWluZXIgPSBjb250ZW50RWwuY3JlYXRlRWwoXCJkaXZcIiwgeyBjbHM6IFwiYnV0dG9uLWNvbnRhaW5lclwiIH0pO1xuICAgICAgICAvLyBidXR0b25Db250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwiZmxleFwiO1xuICAgICAgICAvLyBidXR0b25Db250YWluZXIuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSBcInNwYWNlLWJldHdlZW5cIjsgLy8gVGhpcyB3aWxsIHNwYWNlIHRoZSBidXR0b25zIGV2ZW5seVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgXCJBcHBlbmQgT3V0cHV0XCIgYnV0dG9uXG4gICAgICAgIG5ldyBTZXR0aW5nKGJ1dHRvbkNvbnRhaW5lcilcbiAgICAgICAgICAgIC5hZGRCdXR0b24oKGJ0bikgPT5cbiAgICAgICAgICAgICAgICBidG5cbiAgICAgICAgICAgICAgICAgICAgLnNldEJ1dHRvblRleHQoXCJBcHBlbmQgT3V0cHV0XCIpXG5cbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB0ZXh0QXJlYS52YWx1ZTsgLy8gQ2FwdHVyZSB0aGUgdmFsdWUgZnJvbSB0aGUgdGV4dGFyZWFcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuc3VibWl0X2VkaXQodGhpcy5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnRfcmVzcG9uc2UoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkQnV0dG9uKChidG4pID0+XG4gICAgICAgICAgICAgICAgYnRuXG4gICAgICAgICAgICAgICAgICAgIC5zZXRCdXR0b25UZXh0KFwiUmVwbGFjZVwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB0ZXh0QXJlYS52YWx1ZTsgLy8gQ2FwdHVyZSB0aGUgdmFsdWUgZnJvbSB0aGUgdGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnN1Ym1pdF9lZGl0KHRoaXMucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlfZGVsZXRlKHRoaXMucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0X3Jlc3BvbnNlKGNvbnRlbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXRfZWRpdChyZXN1bHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IGBcblBsZWFzZSBhcHBseSB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB0byB0aGUgYmVsb3cgY29udGVudDpcblxuSW5zdHJ1Y3Rpb25zOlxuJHt0aGlzLnJlc3VsdH1cblxuQ29udGVudDpcbiR7dGhpcy5zZWxlY3RlZFRleHR9XG5cbiMjIFJ1bGVzOlxuLSBKdXN0IHJldHVybiB0aGUgcmVwb25zZSB0aGF0IGZvbGxvd3MgdGhlIGluc3RydWN0aW9ucy4gTm8gbmVlZCB0byBpbmNsdWRlIGEgcHJlYW1wbGUgb3IgYW55dGhpbmdcblxuIyMgTWFya2Rvd24gRm9ybWF0dGluZzogXG5BbHdheXMgYXBwbHkgbWFya2Rvd24gZm9ybWF0dGluZy4gRm9yIGtleXdvcmRzIHVzZSB0aGUgZm9sbG93aW5nOlxuXHR0b2RvcyAtIFByZXBlbmQgdG9kbyBsaW5lcyB3aXRoOlxuXHQtIFsgXSBcbmAudHJpbSgpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IG1lc3NhZ2UgfTtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKFwiaHR0cDovL2xvY2FsaG9zdDo4MDAwL3NpbmdsZS10dXJuXCIsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgcmV0dXJuIG91dHB1dC5jb250ZW50O1xuICAgIH1cblxuICAgIGluc2VydF9yZXNwb25zZShyZXNwb25zZTogc3RyaW5nLCByZXBsYWNlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZWRpdG9yO1xuICAgICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmVuZEluZGV4O1xuICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IGVkaXRvci5vZmZzZXRUb1BvcyhpbmRleCk7XG4gICAgICAgICAgICBlZGl0b3IucmVwbGFjZVJhbmdlKGBcXG58KyR7cmVzcG9uc2V9K3xgLCBwb3MpO1xuICAgICAgICAgICAgZWRpdG9yLnNldEN1cnNvcihwb3MpOyAvLyBPcHRpb25hbGx5IHNldCB0aGUgY3Vyc29yIGFmdGVyIHRoZSBpbnNlcnRlZCB0ZXh0XG4gICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTsgLy8gRm9jdXMgdGhlIGVkaXRvciBhZnRlciBpbnNlcnRpbmcgdGV4dFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlfZGVsZXRlKHRleHQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5lZGl0b3I7XG4gICAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VsZWN0ZWRUZXh0KTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVUZXh0ID0gY29udGVudC5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyVGV4dCA9IGNvbnRlbnQuc3Vic3RyaW5nKGluZGV4ICsgdGhpcy5zZWxlY3RlZFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdUZXh0ID0gYmVmb3JlVGV4dCArIGB8LSR7dGhpcy5zZWxlY3RlZFRleHR9LXxgICsgYWZ0ZXJUZXh0O1xuICAgICAgICAgICAgICAgIGVkaXRvci5zZXRWYWx1ZShuZXdUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgIGxldCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVkQmFja2dyb3VuZEZpZWxkID0gU3RhdGVGaWVsZC5kZWZpbmU8RGVjb3JhdGlvblNldD4oe1xuICAgIGNyZWF0ZShzdGF0ZSk6IERlY29yYXRpb25TZXQge1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi5ub25lO1xuICAgIH0sXG4gICAgdXBkYXRlKG9sZFN0YXRlOiBEZWNvcmF0aW9uU2V0LCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiBEZWNvcmF0aW9uU2V0IHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBSYW5nZVNldEJ1aWxkZXI8RGVjb3JhdGlvbj4oKTtcbiAgICAgICAgY29uc3QgZG9jVGV4dCA9IHRyYW5zYWN0aW9uLnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBkZWxldGVfcmVnZXggPSAvXFx8LSguKj8pLVxcfC9nczsgLy8gQ2hhbmdlZCB0byBtYXRjaCBhY3Jvc3MgbGluZXNcbiAgICAgICAgY29uc3QgYWRkX3JlZ2V4ID0gL1xcfFxcKyguKj8pXFwrXFx8L2dzOyAvLyBDaGFuZ2VkIHRvIG1hdGNoIGFjcm9zcyBsaW5lc1xuICAgICAgICBsZXQgZGVsZXRlX21hdGNoO1xuICAgICAgICBsZXQgYWRkX21hdGNoO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG5cbiAgICAgICAgd2hpbGUgKChkZWxldGVfbWF0Y2ggPSBkZWxldGVfcmVnZXguZXhlYyhkb2NUZXh0KSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gZGVsZXRlX21hdGNoLmluZGV4O1xuICAgICAgICAgICAgY29uc3QgZW5kID0gZGVsZXRlX3JlZ2V4Lmxhc3RJbmRleDtcbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHsgc3RhcnQsIGVuZCwgc3R5bGU6IFwiYmFja2dyb3VuZC1jb2xvcjogI2Y1NmM2MjtcIiB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlICgoYWRkX21hdGNoID0gYWRkX3JlZ2V4LmV4ZWMoZG9jVGV4dCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGFkZF9tYXRjaC5pbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IGFkZF9yZWdleC5sYXN0SW5kZXg7XG4gICAgICAgICAgICByYW5nZXMucHVzaCh7IHN0YXJ0LCBlbmQsIHN0eWxlOiBcImJhY2tncm91bmQtY29sb3I6ICM2NGY1NjI7XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydCByYW5nZXMgYnkgc3RhcnQgcG9zaXRpb25cbiAgICAgICAgcmFuZ2VzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnQgLSBiLnN0YXJ0KTtcblxuICAgICAgICAvLyBBZGQgc29ydGVkIHJhbmdlcyB0byB0aGUgYnVpbGRlclxuICAgICAgICByYW5nZXMuZm9yRWFjaCgocmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGJ1aWxkZXIuYWRkKFxuICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgIHJhbmdlLmVuZCxcbiAgICAgICAgICAgICAgICBEZWNvcmF0aW9uLm1hcmsoe1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7IHN0eWxlOiByYW5nZS5zdHlsZSB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goKTtcbiAgICB9LFxuICAgIHByb3ZpZGUoZmllbGQ6IFN0YXRlRmllbGQ8RGVjb3JhdGlvblNldD4pOiBFeHRlbnNpb24ge1xuICAgICAgICByZXR1cm4gRWRpdG9yVmlldy5kZWNvcmF0aW9ucy5mcm9tKGZpZWxkKTtcbiAgICB9LFxufSk7XG4vLyBSZW1lbWJlciB0byByZW5hbWUgdGhlc2UgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyFcblxuaW50ZXJmYWNlIE15UGx1Z2luU2V0dGluZ3Mge1xuICAgIG15U2V0dGluZzogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBNeVBsdWdpblNldHRpbmdzID0ge1xuICAgIG15U2V0dGluZzogXCJkZWZhdWx0XCIsXG59O1xuXG5leHBvcnQgY29uc3QgVklFV19OQU1FX1NJREVCQVJfQ0hBVCA9IFwic2lkZWJhci1jYXJldFwiO1xuY2xhc3MgU2lkZWJhckNoYXQgZXh0ZW5kcyBJdGVtVmlldyB7XG4gICAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZikge1xuICAgICAgICBzdXBlcihsZWFmKTtcbiAgICB9XG4gICAgdGV4dEJveDogSFRNTFRleHRBcmVhRWxlbWVudDtcbiAgICBtZXNzYWdlc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7IC8vIENvbnRhaW5lciBmb3IgbWVzc2FnZXNcblxuICAgIGdldFZpZXdUeXBlKCkge1xuICAgICAgICByZXR1cm4gVklFV19OQU1FX1NJREVCQVJfQ0hBVDtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5VGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIFZJRVdfTkFNRV9TSURFQkFSX0NIQVQ7XG4gICAgfVxuXG4gICAgYXN5bmMgb25PcGVuKCkge1xuICAgICAgICBjb25zdCBtZXRhY29udGFpbmVyID0gdGhpcy5jb250YWluZXJFbC5jaGlsZHJlblsxXTtcbiAgICAgICAgbWV0YWNvbnRhaW5lci5lbXB0eSgpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBtZXRhY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsczogXCJjb250YWluZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGFjb250YWluZXIucHJlcGVuZChjb250YWluZXIpO1xuICAgICAgICAvLyB0aGlzLmNvbnRhaW5lckVsLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGZvciBtZXNzYWdlc1xuICAgICAgICB0aGlzLm1lc3NhZ2VzQ29udGFpbmVyID0gY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsczogXCJtZXNzYWdlcy1jb250YWluZXJcIixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIGEgXCJIZWxsbyBXb3JsZFwiIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKFwiTUxYIFRlc3RpbmdcIiwgXCJzeXN0ZW1cIik7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2hhdElucHV0QXJlYShjb250YWluZXIpO1xuICAgIH1cbiAgICBjcmVhdGVDaGF0SW5wdXRBcmVhKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgY29udGFpbmVyIGZvciB0aGUgdGV4dCBib3ggYW5kIHRoZSBzdWJtaXQgYnV0dG9uXG4gICAgICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsczogXCJjaGF0LWlucHV0LWNvbnRhaW5lclwiLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHRleHQgYm94IHdpdGhpbiB0aGUgaW5wdXQgY29udGFpbmVyXG4gICAgICAgIHRoaXMudGV4dEJveCA9IGlucHV0Q29udGFpbmVyLmNyZWF0ZUVsKFwidGV4dGFyZWFcIiwge1xuICAgICAgICAgICAgY2xzOiBcImZ1bGxfd2lkdGhfdGV4dF9jb250YWluZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGV4dEJveC5wbGFjZWhvbGRlciA9IFwiVHlwZSBzb21ldGhpbmcuLi5cIjtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHN1Ym1pdCBidXR0b24gd2l0aGluIHRoZSBpbnB1dCBjb250YWluZXJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gaW5wdXRDb250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIik7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IFwiU3VibWl0XCI7XG4gICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRNZXNzYWdlKHRoaXMudGV4dEJveC52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnRleHRCb3gudmFsdWUgPSBcIlwiOyAvLyBDbGVhciB0aGUgdGV4dCBib3ggYWZ0ZXIgc2VuZGluZ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRNZXNzYWdlKHRleHQ6IHN0cmluZywgc2VuZGVyOiBcInVzZXJcIiB8IFwic3lzdGVtXCIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZURpdiA9IHRoaXMubWVzc2FnZXNDb250YWluZXIuY3JlYXRlRWwoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xzOiBgbWVzc2FnZSAke3NlbmRlcn1gLFxuICAgICAgICB9KTtcbiAgICAgICAgbWVzc2FnZURpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgfVxuXG4gICAgc3VibWl0TWVzc2FnZSh1c2VyTWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjdXJyZW50X3BhZ2VfY29udGVudCA9IFwiXCI7XG4gICAgICAgIGlmICh1c2VyTWVzc2FnZS5pbmNsdWRlcyhcIkBjdXJyZW50XCIpKSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBNYXJrZG93blZpZXcgdGhhdCBpcyBvcGVuIGluIHRoZSB3b3Jrc3BhY2VcbiAgICAgICAgICAgIGNvbnN0IG1hcmtkb3duVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZVxuICAgICAgICAgICAgICAgIC5nZXRMZWF2ZXNPZlR5cGUoXCJtYXJrZG93blwiKVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAuZmluZCgobGVhZikgPT4gbGVhZi52aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3ICYmIGxlYWYud2lkdGggPiAwKT8udmlldyBhcyBNYXJrZG93blZpZXc7XG4gICAgICAgICAgICBpZiAobWFya2Rvd25WaWV3ICYmIG1hcmtkb3duVmlldy5lZGl0b3IpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50X3BhZ2VfY29udGVudCA9IG1hcmtkb3duVmlldy5lZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZE1lc3NhZ2UodXNlck1lc3NhZ2UsIFwidXNlclwiKTsgLy8gRGlzcGxheSB0aGUgdXNlciBtZXNzYWdlIGltbWVkaWF0ZWx5XG5cbiAgICAgICAgY29uc3QgY3VycmVudF9wYWdlX21lc3NhZ2UgPSBgXG5cdFx0JHt1c2VyTWVzc2FnZX1cblxuXHRcdC0tLS0tLSBOb3RlIGZvciBNb2RlbCAtLS0gXG5cdFx0V2hlbiBJIGFtIHJlZmVycmluZyB0byBAY3VycmVudCwgSSBtZWFudCB0aGUgZm9sbG93aW5nOlxuXG5cdFx0JHtjdXJyZW50X3BhZ2VfY29udGVudH1cblx0XHRgO1xuXG4gICAgICAgIGxldCBmaW5hbF9tZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICAgIGlmIChjdXJyZW50X3BhZ2VfY29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmaW5hbF9tZXNzYWdlID0gY3VycmVudF9wYWdlX21lc3NhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0geyBtZXNzYWdlOiBmaW5hbF9tZXNzYWdlIH07XG4gICAgICAgIGZldGNoKFwiaHR0cDovL2xvY2FsaG9zdDo4MDAwL2NvbnZlcnNhdGlvblwiLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkTWVzc2FnZShkYXRhLnJlc3BvbnNlLCBcInN5c3RlbVwiKTsgLy8gRGlzcGxheSB0aGUgcmVzcG9uc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOlwiLCBlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkNsb3NlKCkge1xuICAgICAgICAvLyBDbGVhbnVwIGxvZ2ljIGlmIG5lY2Vzc2FyeVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFZJRVdfTkFNRV9NQUlOX0NIQVQgPSBcIm1haW4tY2FyZXRcIjtcbmNsYXNzIE1haW5DaGF0IGV4dGVuZHMgSXRlbVZpZXcge1xuICAgIGNoYXRfaWQ6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgbGVhZjogV29ya3NwYWNlTGVhZixcbiAgICAgICAgY2hhdF9pZD86IHN0cmluZyxcbiAgICAgICAgY29udmVyc2F0aW9uOiB7IGNvbnRlbnQ6IHN0cmluZzsgcm9sZTogXCJ1c2VyXCIgfCBcInN5c3RlbVwiIH1bXSA9IFtdXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGxlYWYpO1xuICAgICAgICB0aGlzLmNoYXRfaWQgPSBjaGF0X2lkIHx8IHRoaXMuZ2VuZXJhdGVSYW5kb21JRCg1KTtcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb24gPSBjb252ZXJzYXRpb247IC8vIEluaXRpYWxpemUgY29udmVyc2F0aW9uIGxpc3Qgd2l0aCBkZWZhdWx0IG9yIHBhc3NlZCB2YWx1ZVxuICAgIH1cbiAgICB0ZXh0Qm94OiBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgIG1lc3NhZ2VzQ29udGFpbmVyOiBIVE1MRWxlbWVudDsgLy8gQ29udGFpbmVyIGZvciBtZXNzYWdlc1xuICAgIGNvbnZlcnNhdGlvbjogeyBjb250ZW50OiBzdHJpbmc7IHJvbGU6IFwidXNlclwiIHwgXCJzeXN0ZW1cIiB9W107IC8vIExpc3QgdG8gc3RvcmUgY29udmVyc2F0aW9uIG1lc3NhZ2VzXG5cbiAgICBnZXRWaWV3VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIFZJRVdfTkFNRV9NQUlOX0NIQVQ7XG4gICAgfVxuXG4gICAgZ2V0RGlzcGxheVRleHQoKSB7XG4gICAgICAgIHJldHVybiBgTUxYIExvY2FsIENoYXQ6ICR7dGhpcy5jaGF0X2lkfWA7XG4gICAgfVxuXG4gICAgYXN5bmMgb25PcGVuKCkge1xuICAgICAgICBjb25zdCBtZXRhY29udGFpbmVyID0gdGhpcy5jb250YWluZXJFbC5jaGlsZHJlblsxXTtcbiAgICAgICAgbWV0YWNvbnRhaW5lci5lbXB0eSgpO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBtZXRhY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsczogXCJjb250YWluZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGFjb250YWluZXIucHJlcGVuZChjb250YWluZXIpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgbWVzc2FnZXNcbiAgICAgICAgdGhpcy5tZXNzYWdlc0NvbnRhaW5lciA9IGNvbnRhaW5lci5jcmVhdGVFbChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbHM6IFwibWVzc2FnZXMtY29udGFpbmVyXCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlbmRlciBpbml0aWFsIGNvbnZlcnNhdGlvblxuICAgICAgICB0aGlzLnJlbmRlckNvbnZlcnNhdGlvbigpO1xuICAgICAgICB0aGlzLmNyZWF0ZUNoYXRJbnB1dEFyZWEoY29udGFpbmVyKTtcbiAgICB9XG4gICAgY3JlYXRlQ2hhdElucHV0QXJlYShjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgdGhlIHRleHQgYm94XG4gICAgICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gY29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIsIHt9KTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHRleHQgYm94IHdpdGhpbiB0aGUgaW5wdXQgY29udGFpbmVyXG4gICAgICAgIHRoaXMudGV4dEJveCA9IGlucHV0Q29udGFpbmVyLmNyZWF0ZUVsKFwidGV4dGFyZWFcIiwge1xuICAgICAgICAgICAgY2xzOiBcImZ1bGxfd2lkdGhfdGV4dF9jb250YWluZXJcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGV4dEJveC5wbGFjZWhvbGRlciA9IFwiVHlwZSBzb21ldGhpbmcuLi5cIjtcblxuICAgICAgICAvLyBDcmVhdGUgYSBzZXBhcmF0ZSBjb250YWluZXIgZm9yIGJ1dHRvbnMgd2l0aGluIHRoZSBpbnB1dCBjb250YWluZXJcbiAgICAgICAgY29uc3QgYnV0dG9uQ29udGFpbmVyID0gaW5wdXRDb250YWluZXIuY3JlYXRlRWwoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xzOiBcImJ1dHRvbi1jb250YWluZXJcIixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBzYXZlIGJ1dHRvbiB3aXRoaW4gdGhlIGJ1dHRvbiBjb250YWluZXJcbiAgICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IGJ1dHRvbkNvbnRhaW5lci5jcmVhdGVFbChcImJ1dHRvblwiKTtcbiAgICAgICAgc2F2ZUJ1dHRvbi50ZXh0Q29udGVudCA9IFwiU2F2ZSBDaGF0XCI7XG4gICAgICAgIHNhdmVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNoYXQoKTsgLy8gQ2FsbCB0aGUgc2F2ZUNoYXQgZnVuY3Rpb24gdG8gc2F2ZSB0aGUgY29udmVyc2F0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgc3VibWl0IGJ1dHRvbiB3aXRoaW4gdGhlIGJ1dHRvbiBjb250YWluZXJcbiAgICAgICAgY29uc3Qgc3VibWl0QnV0dG9uID0gYnV0dG9uQ29udGFpbmVyLmNyZWF0ZUVsKFwiYnV0dG9uXCIpO1xuICAgICAgICBzdWJtaXRCdXR0b24udGV4dENvbnRlbnQgPSBcIlN1Ym1pdFwiO1xuICAgICAgICBzdWJtaXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0TWVzc2FnZSh0aGlzLnRleHRCb3gudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy50ZXh0Qm94LnZhbHVlID0gXCJcIjsgLy8gQ2xlYXIgdGhlIHRleHQgYm94IGFmdGVyIHNlbmRpbmdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkTWVzc2FnZSh0ZXh0OiBzdHJpbmcsIHNlbmRlcjogXCJ1c2VyXCIgfCBcInN5c3RlbVwiKSB7XG4gICAgICAgIC8vIEFkZCBtZXNzYWdlIHRvIHRoZSBjb252ZXJzYXRpb24gYXJyYXlcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb24ucHVzaCh7IGNvbnRlbnQ6IHRleHQsIHJvbGU6IHNlbmRlciB9KTtcbiAgICAgICAgLy8gUmUtcmVuZGVyIHRoZSBjb252ZXJzYXRpb24gaW4gdGhlIEhUTUxcbiAgICAgICAgdGhpcy5yZW5kZXJDb252ZXJzYXRpb24oKTtcbiAgICB9XG5cbiAgICByZW5kZXJDb252ZXJzYXRpb24oKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBjdXJyZW50IG1lc3NhZ2VzXG4gICAgICAgIHRoaXMubWVzc2FnZXNDb250YWluZXIuZW1wdHkoKTtcblxuICAgICAgICAvLyBBZGQgZWFjaCBtZXNzYWdlIGluIHRoZSBjb252ZXJzYXRpb24gdG8gdGhlIG1lc3NhZ2VzIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbi5mb3JFYWNoKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlRGl2ID0gdGhpcy5tZXNzYWdlc0NvbnRhaW5lci5jcmVhdGVFbChcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgY2xzOiBgbWVzc2FnZSAke21lc3NhZ2Uucm9sZX1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtZXNzYWdlRGl2LnRleHRDb250ZW50ID0gbWVzc2FnZS5jb250ZW50O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBzdWJtaXRNZXNzYWdlKHVzZXJNZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKHVzZXJNZXNzYWdlLCBcInVzZXJcIik7IC8vIERpc3BsYXkgdGhlIHVzZXIgbWVzc2FnZSBpbW1lZGlhdGVseVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBjb252ZXJzYXRpb246IHRoaXMuY29udmVyc2F0aW9uLFxuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9jb252ZXJzYXRpb25cIiwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2Uob3V0cHV0LnJlc3BvbnNlLCBcInN5c3RlbVwiKTsgLy8gRGlzcGxheSB0aGUgcmVzcG9uc2VcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNhdmVDaGF0KCkge1xuICAgICAgICBjb25zdCBjaGF0X2ZvbGRlcl9wYXRoID0gXCJjaGF0cy9cIjtcbiAgICAgICAgY29uc3QgZmlsZV9uYW1lID0gYCR7dGhpcy5jaGF0X2lkfS5tZGA7XG4gICAgICAgIGNvbnN0IGZpbGVfcGF0aCA9IGNoYXRfZm9sZGVyX3BhdGggKyBmaWxlX25hbWU7XG5cbiAgICAgICAgbGV0IGZpbGVfY29udGVudCA9IGBcXGBcXGBcXGB4bWxcblx0XHQ8bWV0YWRhdGE+XFxuPGlkPiR7dGhpcy5jaGF0X2lkfTwvaWQ+XFxuPC9tZXRhZGF0YT5cblx0XHRgO1xuXG4gICAgICAgIGxldCBtZXNzYWdlcyA9IGBgO1xuXG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VfeG1sID0gYFxuXHRcdFx0PG1lc3NhZ2U+XG5cdFx0XHRcdDxyb2xlPiR7bWVzc2FnZS5yb2xlfTwvcm9sZT5cblx0XHRcdFx0PGNvbnRlbnQ+JHttZXNzYWdlLmNvbnRlbnR9PC9jb250ZW50PlxuXHRcdFx0PC9tZXNzYWdlPlxuXHRcdFx0YC50cmltKCk7XG4gICAgICAgICAgICBtZXNzYWdlcyArPSBtZXNzYWdlX3htbDtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjb252ZXJzYXRpb24gPSBgPGNvbnZlcnNhdGlvbj5cXG4ke21lc3NhZ2VzfTwvY29udmVyc2F0aW9uPlxcYFxcYFxcYGA7XG4gICAgICAgIGZpbGVfY29udGVudCArPSBjb252ZXJzYXRpb247XG4gICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5nZXRGaWxlQnlQYXRoKGZpbGVfcGF0aCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQubW9kaWZ5KGZpbGUsIGZpbGVfY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNyZWF0ZShmaWxlX3BhdGgsIGZpbGVfY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNhdmUgY2hhdDpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVSYW5kb21JRChsZW5ndGg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBjaGFycyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhc3luYyBvbkNsb3NlKCkge1xuICAgICAgICAvLyBDbGVhbnVwIGxvZ2ljIGlmIG5lY2Vzc2FyeVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICAgIHNldHRpbmdzOiBNeVBsdWdpblNldHRpbmdzO1xuICAgIGNhbnZhc19wYXRjaGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgc2VsZWN0ZWRfbm9kZV9jb2xvcnM6IGFueSA9IHt9O1xuICAgIGNvbG9yX3BpY2tlcl9vcGVuX29uX2xhc3RfY2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGFzeW5jIG9ubG9hZCgpIHtcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcInBhdGNoLW1lbnVcIixcbiAgICAgICAgICAgIG5hbWU6IFwiUGF0Y2ggTWVudVwiLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGNoQ2FudmFzTWVudSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtY2hhbmdlXCIsICgpID0+IHt9KSk7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudChcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbihcImFjdGl2ZS1sZWFmLWNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TGVhZj8udmlldy5nZXRWaWV3VHlwZSgpID09PSBcImNhbnZhc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGN1cnJlbnRMZWFmLnZpZXc7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXRjaENhbnZhc01lbnUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24oW3JlZEJhY2tncm91bmRGaWVsZF0pO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBzaWRlYmFyIGljb25cbiAgICAgICAgdGhpcy5hZGRTaWRlYmFyVGFiKCk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImNhcmV0LWxvZ1wiLFxuICAgICAgICAgICAgbmFtZTogXCJMb2dcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudExlYWY/LnZpZXcuZ2V0Vmlld1R5cGUoKSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52YXNWaWV3ID0gY3VycmVudExlYWYudmlldztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gKGNhbnZhc1ZpZXcgYXMgYW55KS5jYW52YXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNhbnZhcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0Tm9kZXMgPSBjYW52YXMuZ2V0Vmlld3BvcnROb2RlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJjYW52YXMtcHJvbXB0XCIsXG4gICAgICAgICAgICBuYW1lOiBcIkNhbnZhcyBQcm9tcHRcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudExlYWY/LnZpZXcuZ2V0Vmlld1R5cGUoKSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52YXNWaWV3ID0gY3VycmVudExlYWYudmlldztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gKGNhbnZhc1ZpZXcgYXMgYW55KS5jYW52YXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNhbnZhcy5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIGxldCBhdmVyYWdlX3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXZlcmFnZV9oZWlnaHQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXZlcmFnZV93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXhfeCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbF95ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsX2hlaWdodCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbF93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbGxfdGV4dCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb2JqIG9mIHNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4LCB5LCBoZWlnaHQsIHdpZHRoIH0gPSBvYmo7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhfeCA9IE1hdGgubWF4KG1heF94LCB4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3kgKz0geTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2hlaWdodCArPSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF93aWR0aCArPSB3aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJ0ZXh0XCIgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0ZXh0IH0gPSBvYmo7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfdGV4dCArPSB0ZXh0ICsgXCJcXG5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJmaWxlUGF0aFwiIGluIG9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB7IGZpbGVQYXRoIH0gPSBvYmo7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5yZWFkKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlX3RleHQgPSBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlOiAke2ZpbGVQYXRoLnJlcGxhY2UoXCIubWRcIiwgXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4dH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYC50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF90ZXh0ICs9IGZpbGVfdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXZlcmFnZV95ID0gY291bnQgPiAwID8gdG90YWxfeSAvIGNvdW50IDogMDtcbiAgICAgICAgICAgICAgICAgICAgYXZlcmFnZV9oZWlnaHQgPSBjb3VudCA+IDAgPyB0b3RhbF9oZWlnaHQgLyBjb3VudCA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2Vfd2lkdGggPSBjb3VudCA+IDAgPyB0b3RhbF93aWR0aCAvIGNvdW50IDogMDtcblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIG1vZGVsIC0tLVxuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBtb2RhbCB3aXRoIGEgdGV4dCBpbnB1dCBhbmQgYSBzdWJtaXQgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsID0gbmV3IE1vZGFsKHRoaXMuYXBwKTtcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwuY29udGVudEVsLmNyZWF0ZUVsKFwiaDFcIiwgeyB0ZXh0OiBcIkNhbnZhcyBQcm9tcHRcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gbW9kYWwuY29udGVudEVsLmNyZWF0ZURpdih7IGNsczogXCJmbGV4LWNvbFwiIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0QXJlYSA9IGNvbnRhaW5lci5jcmVhdGVFbChcInRleHRhcmVhXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBcInctZnVsbCBtYi0yXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJtaXRCdXR0b24gPSBjb250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwgeyB0ZXh0OiBcIlN1Ym1pdFwiIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b24ub25jbGljayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHQgPSBgXG4gICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgZG8gdGhlIGZvbGxvd2luZzpcbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4dEFyZWEudmFsdWV9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIEdpdmVuIHRoaXMgY29udGVudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICR7YWxsX3RleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgb25lX3Nob3QocHJvbXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvczogeyB4OiBtYXhfeCArIDUwLCB5OiBhdmVyYWdlX3kgfSwgLy8gUG9zaXRpb24gb24gdGhlIGNhbnZhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHsgd2lkdGg6IGF2ZXJhZ2Vfd2lkdGgsIGhlaWdodDogYXZlcmFnZV9oZWlnaHQgfSwgLy8gU2l6ZSBvZiB0aGUgdGV4dCBib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJjZW50ZXJcIiwgLy8gVGhpcyBtaWdodCByZWxhdGUgdG8gdGV4dCBhbGlnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjb250ZW50LCAvLyBUZXh0IGNvbnRlbnQgZnJvbSBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmU6IHRydWUsIC8vIFNhdmUgdGhpcyBub2RlJ3Mgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1czogdHJ1ZSwgLy8gRm9jdXMgYW5kIHN0YXJ0IGVkaXRpbmcgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgdGV4dCBub2RlIG9uIHRoZSBjYW52YXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjYW52YXMuY3JlYXRlVGV4dE5vZGUodGV4dE5vZGVDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZV9pZCA9IG5vZGUuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvbG9yID0gXCI2XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnpvb21Ub1NlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBtb2RhbC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImNyZWF0ZS1jaGlsZFwiLFxuICAgICAgICAgICAgbmFtZTogXCJDcmVhdGUgQ2hpbGRcIixcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZjtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudExlYWY/LnZpZXcuZ2V0Vmlld1R5cGUoKSA9PT0gXCJjYW52YXNcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52YXNWaWV3ID0gY3VycmVudExlYWYudmlldztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gKGNhbnZhc1ZpZXcgYXMgYW55KS5jYW52YXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNhbnZhcy5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkl0ZXJhdG9yID0gc2VsZWN0aW9uLnZhbHVlcygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gc2VsZWN0aW9uSXRlcmF0b3IubmV4dCgpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUoY2FudmFzLCBub2RlLCBub2RlLnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJvcGVuLWNtZGotbW9kYWxcIixcbiAgICAgICAgICAgIG5hbWU6IFwiT3BlbiBDTUQrSiBNb2RhbFwiLFxuICAgICAgICAgICAgaG90a2V5czogW3sgbW9kaWZpZXJzOiBbXCJNb2RcIl0sIGtleTogXCJqXCIgfV0sXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgICAgICAgICAgICAgIGlmIChhY3RpdmVWaWV3ICYmIGFjdGl2ZVZpZXcuZWRpdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IGFjdGl2ZVZpZXcuZWRpdG9yLmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYWN0aXZlVmlldy5lZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGNvbnRlbnQuaW5kZXhPZihzZWxlY3RlZFRleHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBzZWxlY3RlZFRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBuZXcgQ01ESk1vZGFsKHRoaXMuYXBwLCBzZWxlY3RlZFRleHQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5vcGVuKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIk5vIGFjdGl2ZSBtYXJrZG93biBlZGl0b3Igb3Igbm8gdGV4dCBzZWxlY3RlZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGN1c3RvbSB2aWV3XG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KFZJRVdfTkFNRV9TSURFQkFSX0NIQVQsIChsZWFmKSA9PiBuZXcgU2lkZWJhckNoYXQobGVhZikpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyVmlldyhWSUVXX05BTUVfTUFJTl9DSEFULCAobGVhZikgPT4gbmV3IE1haW5DaGF0KGxlYWYpKTtcbiAgICAgICAgLy8gRGVmaW5lIGEgY29tbWFuZCB0byBpbnNlcnQgdGV4dCBpbnRvIHRoZSBzaWRlYmFyXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJpbnNlcnQtdGV4dC1pbnRvLXNpZGViYXJcIixcbiAgICAgICAgICAgIG5hbWU6IFwiSW5zZXJ0IFRleHQgaW50byBTaWRlYmFyXCIsXG4gICAgICAgICAgICBob3RrZXlzOiBbeyBtb2RpZmllcnM6IFtcIk1vZFwiXSwga2V5OiBcImxcIiB9XSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmO1xuICAgICAgICAgICAgICAgIGlmIChhY3RpdmVMZWFmKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGFjdGl2ZUxlYWYudmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldyA/IGFjdGl2ZUxlYWYudmlldy5lZGl0b3IgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluc2VydFRleHRJbnRvU2lkZWJhcihzZWxlY3RlZFRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGVmaW5lIGEgY29tbWFuZCB0byBjbGVhciB0ZXh0IGZyb20gdGhlIHNpZGViYXJcbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiBcImNsZWFyLXRleHQtaW4tc2lkZWJhclwiLFxuICAgICAgICAgICAgbmFtZTogXCJDbGVhciBUZXh0IGluIFNpZGViYXJcIixcbiAgICAgICAgICAgIGhvdGtleXM6IFt7IG1vZGlmaWVyczogW1wiTW9kXCJdLCBrZXk6IFwiO1wiIH1dLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGV4dEluU2lkZWJhcigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gb25lX3Nob3QobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgICAgICBsZXQgbW9kZWwgPSBcIm9wZW5haS1ncHQtNFwiO1xuICAgICAgICAgICAgaWYgKG1vZGVsID09PSBcImxvY2FsXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0geyBtZXNzYWdlIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKFwiaHR0cDovL2xvY2FsaG9zdDo4MDAwL3NpbmdsZS10dXJuXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQuY29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKG1vZGVsID09PSBcIm9wZW5haS1ncHQtNFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcl9tZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICByb2xlOiBcInVzZXJcIixcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gXCJncHQtNC0xMTA2LXByZXZpZXdcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBbdXNlcl9tZXNzYWdlXSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJDYWxsaW5nIEdQVC00IVwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGF0X2NvbXBsZXRpb246IE9wZW5BSS5DaGF0LkNoYXRDb21wbGV0aW9uID0gYXdhaXQgb3BlbmFpLmNoYXQuY29tcGxldGlvbnMuY3JlYXRlKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIk1lc3NhZ2UgYmFjayBmcm9tIEdQVC00IVwiKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjaGF0X2NvbXBsZXRpb246IE9wZW5BSS5DaGF0LkNoYXRDb21wbGV0aW9uID0gYXdhaXQgZ3JvcS5jaGF0LmNvbXBsZXRpb25zLmNyZWF0ZShwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjaGF0X2NvbXBsZXRpb24uY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgLy8gbm9kZV9jb250ZW50ID0gYDxyb2xlPmFzc2lzdGFudDwvcm9sZT5cXG4ke2NvbnRlbnR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJvcGVuLWNoYXRcIixcbiAgICAgICAgICAgIG5hbWU6IFwiT3BlbiBDaGF0XCIsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk/LmVkaXRvcjtcbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXCJgYGB4bWxcIiwgXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKFwiYGBgXCIsIFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1sID0gcGFyc2VDdXN0b21YTUwoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZvX2lkID0geG1sLm1ldGFkYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHhtbC5jb252ZXJzYXRpb24ubWVzc2FnZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnZvX2lkICYmIG1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGF0VmlldyA9IG5ldyBNYWluQ2hhdChsZWFmLCBjb252b19pZCwgbWVzc2FnZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgbGVhZi5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHR5cGU6IFZJRVdfTkFNRV9NQUlOX0NIQVQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RhdGU6IHsgY2hhdElkOiBjb252b19pZCwgbWVzc2FnZXM6IG1lc3NhZ2VzIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWFmLm9wZW4oY2hhdFZpZXcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLnJldmVhbExlYWYobGVhZik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiTm8gdmFsaWQgY2hhdCBkYXRhIGZvdW5kIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJObyBhY3RpdmUgbWFya2Rvd24gZWRpdG9yIGZvdW5kLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwiYXBwbHktZGlmZnNcIixcbiAgICAgICAgICAgIG5hbWU6IFwiQXBwbHkgRGlmZnNcIixcbiAgICAgICAgICAgIGhvdGtleXM6IFt7IG1vZGlmaWVyczogW1wiTW9kXCJdLCBrZXk6IFwiZFwiIH1dLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpPy5lZGl0b3I7XG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWdleCB0byBmaW5kIHwtY29udGVudC18XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZVJlZ2V4ID0gL1xcfC0oLio/KS1cXHwvZ3M7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZ2V4IHRvIGZpbmQgfCtjb250ZW50K3xcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgfC1jb250ZW50LXwgd2l0aCBlbXB0eSBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShkZWxldGVSZWdleCwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiB8K2NvbnRlbnQrfCB3aXRoIGVtcHR5IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoXCJ8K1wiLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKFwiK3xcIiwgXCJcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBtb2RpZmllZCBjb250ZW50IGJhY2sgdG8gdGhlIGVkaXRvclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0VmFsdWUoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJEaXBzIGFwcGxpZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiTm8gYWN0aXZlIG1hcmtkb3duIGVkaXRvciBmb3VuZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgaGlnaGxpZ2h0X2xpbmVhZ2UoKSB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMCkpOyAvLyBTbGVlcCBmb3IgMjAwIG1pbGxpc2Vjb25kc1xuICAgICAgICBjb25zb2xlLmxvZyhcIlJ1bm5pbmcgaGlnaGxpZ2h0IGxpbmVhZ2VcIik7XG5cbiAgICAgICAgY29uc3QgY2FudmFzX3ZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFwiY2FudmFzXCIpLmZpcnN0KCk/LnZpZXc7XG4gICAgICAgIGlmICghY2FudmFzX3ZpZXcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW52YXMgPSAoY2FudmFzX3ZpZXcgYXMgYW55KS5jYW52YXM7IC8vIEFzc3VtaW5nIGNhbnZhcyBpcyBhIHByb3BlcnR5IG9mIHRoZSB2aWV3XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gY2FudmFzLnNlbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uX2l0ZXJhdG9yID0gc2VsZWN0aW9uLnZhbHVlcygpO1xuICAgICAgICBjb25zdCBub2RlID0gc2VsZWN0aW9uX2l0ZXJhdG9yLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZXNfaXRlcmF0b3IgPSBjYW52YXMubm9kZXMudmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IG5vZGVzX2FycmF5ID0gQXJyYXkuZnJvbShub2Rlc19pdGVyYXRvcik7XG4gICAgICAgIGNvbnN0IGNhbnZhc19kYXRhID0gY2FudmFzLmdldERhdGEoKTtcbiAgICAgICAgY29uc3QgeyBlZGdlcywgbm9kZXMgfSA9IGNhbnZhc19kYXRhO1xuICAgICAgICBjb25zdCBsb25nZXN0X2xpbmVhZ2UgPSBhd2FpdCB0aGlzLmdldExvbmdlc3RMaW5lYWdlKG5vZGVzLCBlZGdlcywgbm9kZS5pZCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgc2V0IHRvIHRyYWNrIGxpbmVhZ2Ugbm9kZSBJRHMgZm9yIGNvbXBhcmlzb25cbiAgICAgICAgY29uc3QgbGluZWFnZV9ub2RlX2lkcyA9IG5ldyBTZXQobG9uZ2VzdF9saW5lYWdlLm1hcCgobm9kZSkgPT4gbm9kZS5pZCkpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgbm9kZXMgaW4gdGhlIGxvbmdlc3QgbGluZWFnZVxuICAgICAgICBmb3IgKGNvbnN0IGxpbmVhZ2Vfbm9kZSBvZiBsb25nZXN0X2xpbmVhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVhZ2VfaWQgPSBsaW5lYWdlX25vZGUuaWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lYWdlX2NvbG9yID0gbGluZWFnZV9ub2RlLmNvbG9yO1xuICAgICAgICAgICAgLy8gT25seSBzdG9yZSBhbmQgY2hhbmdlIHRoZSBjb2xvciBpZiBpdCdzIG5vdCBhbHJlYWR5IHN0b3JlZFxuICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkX25vZGVfY29sb3JzLmhhc093blByb3BlcnR5KGxpbmVhZ2VfaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZF9ub2RlX2NvbG9yc1tsaW5lYWdlX2lkXSA9IGxpbmVhZ2VfY29sb3I7IC8vIFN0b3JlIHRoZSBjdXJyZW50IGNvbG9yIHdpdGggbm9kZSdzIGlkIGFzIGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkX25vZGVzID0gbm9kZXNfYXJyYXkuZmlsdGVyKChub2RlKSA9PiBub2RlLmlkID09PSBsaW5lYWdlX2lkKTtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZF9ub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuY29sb3IgPSBcIjRcIjsgLy8gUmVzZXQgdGhlIG5vZGUgY29sb3IgdG8gaXRzIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgIG5vZGUucmVuZGVyKCk7IC8vIFJlLXJlbmRlciB0aGUgbm9kZSB0byBhcHBseSB0aGUgY29sb3IgY2hhbmdlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCBhbmQgcmVtb3ZlIG5vZGVzIG5vdCBpbiB0aGUgY3VycmVudCBsaW5lYWdlXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRfbm9kZV9jb2xvcnMpLmZvckVhY2goKG5vZGVfaWQpID0+IHtcbiAgICAgICAgICAgIGlmICghbGluZWFnZV9ub2RlX2lkcy5oYXMobm9kZV9pZCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbF9jb2xvciA9IHRoaXMuc2VsZWN0ZWRfbm9kZV9jb2xvcnNbbm9kZV9pZF07XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRfbm9kZXMgPSBub2Rlc19hcnJheS5maWx0ZXIoKG5vZGUpID0+IG5vZGUuaWQgPT09IG5vZGVfaWQpO1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkX25vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb2xvciA9IG9yaWdpbmFsX2NvbG9yOyAvLyBSZXNldCB0aGUgbm9kZSBjb2xvciB0byBpdHMgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW5kZXIoKTsgLy8gUmUtcmVuZGVyIHRoZSBub2RlIHRvIGFwcGx5IHRoZSBjb2xvciBjaGFuZ2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zZWxlY3RlZF9ub2RlX2NvbG9yc1tub2RlX2lkXTsgLy8gUmVtb3ZlIGZyb20gdHJhY2tpbmcgb2JqZWN0XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRfbm9kZV9jb2xvcnMpOyAvLyBMb2cgb3V0IHRoZSBzdG9yZWQgY29sb3JzXG4gICAgfVxuICAgIGFzeW5jIHVuaGlnaGxpZ2h0X2xpbmVhZ2UoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBjYW52YXNfdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXCJjYW52YXNcIikuZmlyc3QoKT8udmlldztcbiAgICAgICAgaWYgKCFjYW52YXNfdmlldykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUnVubmluZyBpbiB1bmhpZ2hsaWdodF9saW5lYWdlXCIpO1xuICAgICAgICBjb25zdCBjYW52YXMgPSAoY2FudmFzX3ZpZXcgYXMgYW55KS5jYW52YXM7XG4gICAgICAgIGNvbnN0IG5vZGVzX2l0ZXJhdG9yID0gY2FudmFzLm5vZGVzLnZhbHVlcygpO1xuICAgICAgICBjb25zdCBub2Rlc19hcnJheSA9IEFycmF5LmZyb20obm9kZXNfaXRlcmF0b3IpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgbm9kZV9pZCBpbiB0aGlzLnNlbGVjdGVkX25vZGVfY29sb3JzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlc2V0dGluZyBjb2xvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkX25vZGVzID0gbm9kZXNfYXJyYXkuZmlsdGVyKChub2RlKSA9PiBub2RlLmlkID09PSBub2RlX2lkKTtcbiAgICAgICAgICAgIGZpbHRlcmVkX25vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBub2RlLmNvbG9yID0gdGhpcy5zZWxlY3RlZF9ub2RlX2NvbG9yc1tub2RlX2lkXTsgLy8gUmVzZXQgdGhlIG5vZGUgY29sb3IgdG8gaXRzIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgbm9kZS5yZW5kZXIoKTsgLy8gUmUtcmVuZGVyIHRoZSBub2RlIHRvIGFwcGx5IHRoZSBjb2xvciBjaGFuZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRfbm9kZV9jb2xvcnMgPSB7fTsgLy8gQ2xlYXIgdGhlIHN0b3JlZCBjb2xvcnMgYWZ0ZXIgcmVzZXR0aW5nXG4gICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgfVxuICAgIHBhdGNoQ2FudmFzTWVudSgpIHtcbiAgICAgICAgY29uc3QgY2FudmFzVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXCJjYW52YXNcIikuZmlyc3QoKT8udmlldztcbiAgICAgICAgaWYgKCFjYW52YXNWaWV3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FudmFzID0gY2FudmFzVmlldy5jYW52YXM7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGNhbnZhcyk7XG5cbiAgICAgICAgY29uc3QgbWVudSA9IGNhbnZhcy5tZW51O1xuICAgICAgICBpZiAoIW1lbnUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBtZW51IGZvdW5kIG9uIHRoZSBjYW52YXNcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7IC8vIENhcHR1cmUgdGhlIGNvcnJlY3QgJ3RoaXMnIGNvbnRleHQuXG4gICAgICAgIGNvbnN0IG1lbnVVbmluc3RhbGxlciA9IGFyb3VuZChtZW51LmNvbnN0cnVjdG9yLnByb3RvdHlwZSwge1xuICAgICAgICAgICAgcmVuZGVyOiAobmV4dDogYW55KSA9PlxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICguLi5hcmdzOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV4dC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB0aGF0LmFkZEdyYXBoQnV0dG9uSWZOZWVkZWQodGhpcy5tZW51RWwpO1xuICAgICAgICAgICAgICAgICAgICB0aGF0LmFkZEFJQnV0dG9uSWZOZWVkZWQodGhpcy5tZW51RWwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIobWVudVVuaW5zdGFsbGVyKTtcbiAgICAgICAgaWYgKCF0aGlzLmNhbnZhc19wYXRjaGVkKSB7XG4gICAgICAgICAgICAvLyBEZWZpbmUgdGhlIGZ1bmN0aW9ucyB0byBiZSBwYXRjaGVkXG4gICAgICAgICAgICBjb25zdCBmdW5jdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgb25Eb3VibGVDbGljazogKG5leHQ6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uUG9pbnRlcmRvd246IChuZXh0OiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNOb2RlID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoXCIuY2FudmFzLW5vZGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52YXNfY29sb3JfcGlja2VyX2l0ZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuY2xpY2thYmxlLWljb24gYnV0dG9uW2FyaWEtbGFiZWw9XCJTZXQgQ29sb3JcIl0nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5oaWdobGlnaHRfbGluZWFnZShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQudW5oaWdobGlnaHRfbGluZWFnZShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZG91YmxlQ2xpY2tQYXRjaGVyID0gYXJvdW5kKGNhbnZhcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGZ1bmN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGRvdWJsZUNsaWNrUGF0Y2hlcik7XG4gICAgICAgIH1cblxuICAgICAgICBjYW52YXNWaWV3LnNjb3BlPy5yZWdpc3RlcihbXCJNb2RcIiwgXCJTaGlmdFwiXSwgXCJBcnJvd1VwXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoYXQuY3JlYXRlX2RpcmVjdGlvbmFsX25vZGUoY2FudmFzLCBcInRvcFwiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FudmFzVmlldy5zY29wZT8ucmVnaXN0ZXIoW1wiTW9kXCJdLCBcIkFycm93VXBcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5uYXZpZ2F0ZShjYW52YXMsIFwidG9wXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2FudmFzVmlldy5zY29wZT8ucmVnaXN0ZXIoW1wiTW9kXCJdLCBcIkFycm93RG93blwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGF0Lm5hdmlnYXRlKGNhbnZhcywgXCJib3R0b21cIik7XG4gICAgICAgIH0pO1xuICAgICAgICBjYW52YXNWaWV3LnNjb3BlPy5yZWdpc3RlcihbXCJNb2RcIl0sIFwiQXJyb3dMZWZ0XCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoYXQubmF2aWdhdGUoY2FudmFzLCBcImxlZnRcIik7XG4gICAgICAgIH0pO1xuICAgICAgICBjYW52YXNWaWV3LnNjb3BlPy5yZWdpc3RlcihbXCJNb2RcIl0sIFwiQXJyb3dSaWdodFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGF0Lm5hdmlnYXRlKGNhbnZhcywgXCJyaWdodFwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbnZhc1ZpZXcuc2NvcGU/LnJlZ2lzdGVyKFtcIk1vZFwiXSwgXCJFbnRlclwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGF0LnN0YXJ0X2VkaXRpbmdfbm9kZShjYW52YXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjYW52YXNWaWV3LnNjb3BlPy5yZWdpc3RlcihbXCJNb2RcIiwgXCJTaGlmdFwiXSwgXCJBcnJvd1VwXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoYXQuY3JlYXRlX2RpcmVjdGlvbmFsX25vZGUoY2FudmFzLCBcInRvcFwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbnZhc1ZpZXcuc2NvcGU/LnJlZ2lzdGVyKFtcIk1vZFwiLCBcIlNoaWZ0XCJdLCBcIkFycm93RG93blwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGF0LmNyZWF0ZV9kaXJlY3Rpb25hbF9ub2RlKGNhbnZhcywgXCJib3R0b21cIik7XG4gICAgICAgIH0pO1xuICAgICAgICBjYW52YXNWaWV3LnNjb3BlPy5yZWdpc3RlcihbXCJNb2RcIiwgXCJTaGlmdFwiXSwgXCJBcnJvd0xlZnRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5jcmVhdGVfZGlyZWN0aW9uYWxfbm9kZShjYW52YXMsIFwibGVmdFwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhbnZhc1ZpZXcuc2NvcGU/LnJlZ2lzdGVyKFtcIk1vZFwiLCBcIlNoaWZ0XCJdLCBcIkFycm93UmlnaHRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhhdC5jcmVhdGVfZGlyZWN0aW9uYWxfbm9kZShjYW52YXMsIFwicmlnaHRcIik7XG4gICAgICAgIH0pO1xuICAgICAgICBjYW52YXNWaWV3LnNjb3BlPy5yZWdpc3RlcihbXCJNb2RcIiwgXCJTaGlmdFwiXSwgXCJFbnRlclwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGF0LnJ1bl9ncmFwaF9jaGF0KGNhbnZhcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5jYW52YXNfcGF0Y2hlZCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FudmFzVmlldy5sZWFmLnJlYnVpbGRWaWV3KCk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhc19wYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmOiBXb3Jrc3BhY2VMZWFmKSA9PiB7XG4gICAgICAgIC8vICAgICBpZiAobGVhZi52aWV3LmdldFZpZXdUeXBlKCkgIT09IFwiY2FudmFzXCIpIHJldHVybjtcbiAgICAgICAgLy8gICAgIGNvbnN0IGNhbnZhc1ZpZXcgPSBsZWFmLnZpZXcgYXMgQ2FudmFzVmlldztcbiAgICAgICAgLy8gICAgIC8vIEB0cy1pZ25vcmVcblxuICAgICAgICAvLyAgICAgY2FudmFzVmlldy5sZWFmLnJlYnVpbGRWaWV3KCk7XG4gICAgICAgIC8vIH0pO1xuICAgIH1cbiAgICBjcmVhdGVfZGlyZWN0aW9uYWxfbm9kZShjYW52YXM6IGFueSwgZGlyZWN0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gY2FudmFzLnNlbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24udmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBzZWxlY3Rpb25JdGVyYXRvci5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlzRWRpdGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudF9ub2RlX3ggPSBub2RlLng7XG4gICAgICAgIGNvbnN0IHBhcmVudF9ub2RlX3kgPSBub2RlLnk7XG4gICAgICAgIGNvbnN0IHBhcmVudF93aWR0aCA9IG5vZGUud2lkdGg7XG4gICAgICAgIGNvbnN0IHBhcmVudF9oZWlnaHQgPSBub2RlLmhlaWdodDtcblxuICAgICAgICBsZXQgeDogbnVtYmVyO1xuICAgICAgICBsZXQgeTogbnVtYmVyO1xuICAgICAgICBsZXQgZnJvbV9zaWRlOiBzdHJpbmc7XG4gICAgICAgIGxldCB0b19zaWRlOiBzdHJpbmc7XG5cbiAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCJsZWZ0XCI6XG4gICAgICAgICAgICAgICAgeCA9IHBhcmVudF9ub2RlX3ggLSBwYXJlbnRfd2lkdGggLSAyMDA7XG4gICAgICAgICAgICAgICAgeSA9IHBhcmVudF9ub2RlX3k7XG4gICAgICAgICAgICAgICAgZnJvbV9zaWRlID0gXCJsZWZ0XCI7XG4gICAgICAgICAgICAgICAgdG9fc2lkZSA9IFwicmlnaHRcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgICAgICAgICAgIHggPSBwYXJlbnRfbm9kZV94ICsgcGFyZW50X3dpZHRoICsgMjAwO1xuICAgICAgICAgICAgICAgIHkgPSBwYXJlbnRfbm9kZV95O1xuICAgICAgICAgICAgICAgIGZyb21fc2lkZSA9IFwicmlnaHRcIjtcbiAgICAgICAgICAgICAgICB0b19zaWRlID0gXCJsZWZ0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidG9wXCI6XG4gICAgICAgICAgICAgICAgeCA9IHBhcmVudF9ub2RlX3g7XG4gICAgICAgICAgICAgICAgeSA9IHBhcmVudF9ub2RlX3kgLSBwYXJlbnRfaGVpZ2h0IC0gMjAwO1xuICAgICAgICAgICAgICAgIGZyb21fc2lkZSA9IFwidG9wXCI7XG4gICAgICAgICAgICAgICAgdG9fc2lkZSA9IFwiYm90dG9tXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYm90dG9tXCI6XG4gICAgICAgICAgICAgICAgeCA9IHBhcmVudF9ub2RlX3g7XG4gICAgICAgICAgICAgICAgeSA9IHBhcmVudF9ub2RlX3kgKyBwYXJlbnRfaGVpZ2h0ICsgMjAwO1xuICAgICAgICAgICAgICAgIGZyb21fc2lkZSA9IFwiYm90dG9tXCI7XG4gICAgICAgICAgICAgICAgdG9fc2lkZSA9IFwidG9wXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIGRpcmVjdGlvbiBwcm92aWRlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoaWxkTm9kZShjYW52YXMsIG5vZGUsIHgsIHksIFwiPHJvbGU+dXNlcjwvcm9sZT5cIiwgZnJvbV9zaWRlLCB0b19zaWRlKTtcbiAgICB9XG4gICAgc3RhcnRfZWRpdGluZ19ub2RlKGNhbnZhcykge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBjYW52YXMuc2VsZWN0aW9uO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi52YWx1ZXMoKTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3Qgbm9kZV9pZCA9IG5vZGUuaWQ7XG4gICAgICAgIG5vZGUuaXNFZGl0aW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZWRpdEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYW52YXMtbWVudSBidXR0b25bYXJpYS1sYWJlbD1cIkVkaXRcIl0nKTtcbiAgICAgICAgaWYgKGVkaXRCdXR0b24pIHtcbiAgICAgICAgICAgIGVkaXRCdXR0b24uY2xpY2soKTsgLy8gU2ltdWxhdGUgdGhlIGNsaWNrIG9uIHRoZSBlZGl0IGJ1dHRvblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVkaXQgYnV0dG9uIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBydW5fZ3JhcGhfY2hhdChjYW52YXM6IENhbnZhcykge1xuICAgICAgICBjYW52YXMucmVxdWVzdFNhdmUoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gY2FudmFzLnNlbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24udmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBzZWxlY3Rpb25JdGVyYXRvci5uZXh0KCkudmFsdWU7XG4gICAgICAgIGNvbnN0IG5vZGVfaWQgPSBub2RlLmlkO1xuXG4gICAgICAgIGNvbnN0IGVkaXRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2FudmFzLW1lbnUgYnV0dG9uW2FyaWEtbGFiZWw9XCJTcGFya2xlXCJdJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgICAgIGlmIChlZGl0QnV0dG9uKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBlZGl0QnV0dG9uLmNsaWNrKCk7IC8vIFNpbXVsYXRlIHRoZSBjbGljayBvbiB0aGUgZWRpdCBidXR0b24gYWZ0ZXIgMjAwIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFZGl0IGJ1dHRvbiBub3QgZm91bmRcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmF2aWdhdGUoY2FudmFzLCBkaXJlY3Rpb246IHN0cmluZykge1xuICAgICAgICAvLyBjb25zdCBjYW52YXMgPSBjYW52YXNWaWV3LmNhbnZhcztcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gY2FudmFzLnNlbGVjdGlvbjtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24udmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBzZWxlY3Rpb25JdGVyYXRvci5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlzRWRpdGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGVfaWQgPSBub2RlLmlkO1xuICAgICAgICBjb25zdCBjYW52YXNfZGF0YSA9IGNhbnZhcy5nZXREYXRhKCk7XG5cbiAgICAgICAgLy8gQXNzdW1pbmcgZGlyZWN0aW9uIGNhbiBiZSAnbmV4dCcgb3IgJ3ByZXZpb3VzJyBmb3Igc2ltcGxpY2l0eVxuICAgICAgICBjb25zdCBlZGdlcyA9IGNhbnZhc19kYXRhLmVkZ2VzO1xuICAgICAgICBjb25zdCBub2RlcyA9IGNhbnZhc19kYXRhLm5vZGVzO1xuICAgICAgICBsZXQgdGFyZ2V0Tm9kZUlEOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGJvdGggJ2Zyb20nIGFuZCAndG8nIGNhc2VzIGZvciAncmlnaHQnXG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZVJpZ2h0RnJvbSA9IGVkZ2VzLmZpbmQoKGVkZ2UpID0+IGVkZ2UuZnJvbU5vZGUgPT09IG5vZGVfaWQgJiYgZWRnZS5mcm9tU2lkZSA9PT0gXCJyaWdodFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZVJpZ2h0RnJvbSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlSUQgPSBlZGdlUmlnaHRGcm9tLnRvTm9kZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGdlUmlnaHRUbyA9IGVkZ2VzLmZpbmQoKGVkZ2UpID0+IGVkZ2UudG9Ob2RlID09PSBub2RlX2lkICYmIGVkZ2UudG9TaWRlID09PSBcInJpZ2h0XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWRnZVJpZ2h0VG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGVJRCA9IGVkZ2VSaWdodFRvLmZyb21Ob2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgYm90aCAnZnJvbScgYW5kICd0bycgY2FzZXMgZm9yICdsZWZ0J1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VMZWZ0RnJvbSA9IGVkZ2VzLmZpbmQoKGVkZ2UpID0+IGVkZ2UuZnJvbU5vZGUgPT09IG5vZGVfaWQgJiYgZWRnZS5mcm9tU2lkZSA9PT0gXCJsZWZ0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChlZGdlTGVmdEZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlEID0gZWRnZUxlZnRGcm9tLnRvTm9kZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGdlTGVmdFRvID0gZWRnZXMuZmluZCgoZWRnZSkgPT4gZWRnZS50b05vZGUgPT09IG5vZGVfaWQgJiYgZWRnZS50b1NpZGUgPT09IFwibGVmdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkZ2VMZWZ0VG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGVJRCA9IGVkZ2VMZWZ0VG8uZnJvbU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidG9wXCI6XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGJvdGggJ2Zyb20nIGFuZCAndG8nIGNhc2VzIGZvciAndG9wJ1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VUb3BGcm9tID0gZWRnZXMuZmluZCgoZWRnZSkgPT4gZWRnZS5mcm9tTm9kZSA9PT0gbm9kZV9pZCAmJiBlZGdlLmZyb21TaWRlID09PSBcInRvcFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZVRvcEZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlEID0gZWRnZVRvcEZyb20udG9Ob2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VUb3BUbyA9IGVkZ2VzLmZpbmQoKGVkZ2UpID0+IGVkZ2UudG9Ob2RlID09PSBub2RlX2lkICYmIGVkZ2UudG9TaWRlID09PSBcInRvcFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkZ2VUb3BUbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZUlEID0gZWRnZVRvcFRvLmZyb21Ob2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImJvdHRvbVwiOlxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBib3RoICdmcm9tJyBhbmQgJ3RvJyBjYXNlcyBmb3IgJ2JvdHRvbSdcbiAgICAgICAgICAgICAgICBjb25zdCBlZGdlQm90dG9tRnJvbSA9IGVkZ2VzLmZpbmQoKGVkZ2UpID0+IGVkZ2UuZnJvbU5vZGUgPT09IG5vZGVfaWQgJiYgZWRnZS5mcm9tU2lkZSA9PT0gXCJib3R0b21cIik7XG4gICAgICAgICAgICAgICAgaWYgKGVkZ2VCb3R0b21Gcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGVJRCA9IGVkZ2VCb3R0b21Gcm9tLnRvTm9kZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGdlQm90dG9tVG8gPSBlZGdlcy5maW5kKChlZGdlKSA9PiBlZGdlLnRvTm9kZSA9PT0gbm9kZV9pZCAmJiBlZGdlLnRvU2lkZSA9PT0gXCJib3R0b21cIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGdlQm90dG9tVG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGVJRCA9IGVkZ2VCb3R0b21Uby5mcm9tTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zdCB2aWV3cG9ydE5vZGVzID0gY2FudmFzLmdldFZpZXdwb3J0Tm9kZXMoKTtcbiAgICAgICAgbGV0IHZpZXdwb3J0X25vZGVzOiBWaWV3cG9ydE5vZGVbXSA9IFtdO1xuICAgICAgICBsZXQgaW5pdGlhbF92aWV3cG9ydF9jaGlsZHJlbiA9IGNhbnZhcy5ub2RlSW5kZXguZGF0YS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKGluaXRpYWxfdmlld3BvcnRfY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGV0IHR5cGVfbm9kZXMgPSBcIm5vZGVzXCI7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgY2hpbGRlbiB0aGVuIHVzZSB0aGlzIHBhdGguXG4gICAgICAgICAgICBpZiAoaW5pdGlhbF92aWV3cG9ydF9jaGlsZHJlblswXSAmJiBcImNoaWxkcmVuXCIgaW4gaW5pdGlhbF92aWV3cG9ydF9jaGlsZHJlblswXSkge1xuICAgICAgICAgICAgICAgIHR5cGVfbm9kZXMgPSBcImNoaWxkcmVuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZV9ub2RlcyA9PT0gXCJjaGlsZHJlblwiKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbml0aWFsX3ZpZXdwb3J0X2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzX2xpc3QgPSBpbml0aWFsX3ZpZXdwb3J0X2NoaWxkcmVuW2ldLmNoaWxkcmVuO1xuXG4gICAgICAgICAgICAgICAgICAgIG5vZGVzX2xpc3QuZm9yRWFjaCgobm9kZTogVmlld3BvcnROb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydF9ub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZV9ub2RlcyA9PT0gXCJub2Rlc1wiKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbml0aWFsX3ZpZXdwb3J0X2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0X25vZGUgPSBpbml0aWFsX3ZpZXdwb3J0X2NoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydF9ub2Rlcy5wdXNoKHZpZXdwb3J0X25vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXROb2RlSUQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldF9ub2RlID0gdmlld3BvcnRfbm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5pZCA9PT0gdGFyZ2V0Tm9kZUlEKTtcblxuICAgICAgICAgICAgY2FudmFzLnNlbGVjdE9ubHkodGFyZ2V0X25vZGUpO1xuICAgICAgICAgICAgY2FudmFzLnpvb21Ub1NlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0X2xpbmVhZ2UoKTtcbiAgICB9XG4gICAgcGFyc2VDdXN0b21YTUwoeG1sU3RyaW5nOiBzdHJpbmcsIHRhZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiSW4gcGFyc2UgY3VzdG9tXCIpO1xuICAgICAgICBjb25zb2xlLmxvZyh7IHRhZ3MsIHhtbFN0cmluZyB9KTtcbiAgICAgICAgLy8gRnVuY3Rpb24gdG8gZXh0cmFjdCBjb250ZW50IGJldHdlZW4gdGFnc1xuICAgICAgICBmdW5jdGlvbiBnZXRDb250ZW50KHRhZzogc3RyaW5nLCBzdHJpbmc6IHN0cmluZykge1xuICAgICAgICAgICAgY29uc3Qgb3BlblRhZyA9IGA8JHt0YWd9PmA7XG4gICAgICAgICAgICBjb25zdCBjbG9zZVRhZyA9IGA8LyR7dGFnfT5gO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdHJpbmcuaW5kZXhPZihvcGVuVGFnKSArIG9wZW5UYWcubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gc3RyaW5nLmluZGV4T2YoY2xvc2VUYWcpO1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVzdWx0IG9iamVjdFxuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgICAgICAvLyBFeHRyYWN0IGNvbnRlbnQgZm9yIGVhY2ggdGFnIHByb3ZpZGVkXG4gICAgICAgIHRhZ3MuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZ2V0Q29udGVudCh0YWcsIHhtbFN0cmluZyk7XG4gICAgICAgICAgICByZXN1bHRbdGFnXSA9IGNvbnRlbnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGV4dHJhY3RUZXh0RnJvbVBERihmaWxlX25hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIC8vIHBkZmpzLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gXCJwZGYud29ya2VyLmpzXCI7XG4gICAgICAgIC8vIEFzc3VtaW5nIHRoaXMgY29kZSBpcyBpbnNpZGUgYSBtZXRob2Qgb2YgeW91ciBwbHVnaW4gY2xhc3NcblxuICAgICAgICBwZGZqcy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmdldFJlc291cmNlUGF0aCh7XG4gICAgICAgICAgICBwYXRoOiBcIi5vYnNpZGlhbi9wbHVnaW5zL2NhcmV0L3BkZi53b3JrZXIuanNcIixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnN0IGZpbGVfcGF0aCA9IGAvVXNlcnMvamFjb2Jjb2xsaW5nL0RvY3VtZW50cy9hY2NlbGVyYXRlL2FjY2VsZXJhdGUvQXR0ZW50aW9uIGlzIEFsbCBZb3VyIE5lZWQucGRmYDtcbiAgICAgICAgLy8gY29uc3QgZG9jdW1lbnQgPSBhd2FpdCBnZXREb2N1bWVudChmaWxlX3BhdGgpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGZpbGVfcGF0aCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmdldFJlc291cmNlUGF0aCh7XG4gICAgICAgICAgICBwYXRoOiBmaWxlX25hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBsb2FkQW5kRXh0cmFjdFRleHQoZmlsZV9wYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBhd2FpdCBwZGZqcy5nZXREb2N1bWVudChmaWxlX3BhdGgpLnByb21pc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtUGFnZXMgPSBkb2MubnVtUGFnZXM7XG5cbiAgICAgICAgICAgICAgICAvLyBMb2FkIG1ldGFkYXRhXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBkb2MuZ2V0TWV0YWRhdGEoKTtcblxuICAgICAgICAgICAgICAgIGxldCBmdWxsVGV4dCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtUGFnZXM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgZG9jLmdldFBhZ2UoaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh7IHNjYWxlOiAxLjAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHBhZ2UuZ2V0VGV4dENvbnRlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZVRleHQgPSBjb250ZW50Lml0ZW1zLm1hcCgoaXRlbTogeyBzdHI6IHN0cmluZyB9KSA9PiBpdGVtLnN0cikuam9pbihcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgIGZ1bGxUZXh0ICs9IHBhZ2VUZXh0ICsgXCIgXCI7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSBwYWdlIHJlc291cmNlcy5cbiAgICAgICAgICAgICAgICAgICAgcGFnZS5jbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmdWxsVGV4dDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogXCIgKyBlcnIpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZ1bGxEb2N1bWVudFRleHQgPSBhd2FpdCBsb2FkQW5kRXh0cmFjdFRleHQoZmlsZV9wYXRoKTtcbiAgICAgICAgcmV0dXJuIGZ1bGxEb2N1bWVudFRleHQ7XG4gICAgfVxuICAgIGFkZEdyYXBoQnV0dG9uSWZOZWVkZWQobWVudUVsOiBIVE1MRWxlbWVudCkge1xuICAgICAgICBpZiAoIW1lbnVFbC5xdWVyeVNlbGVjdG9yKFwiLmdyYXBoLW1lbnUtaXRlbVwiKSkge1xuICAgICAgICAgICAgY29uc3QgZ3JhcGhCdXR0b25FbCA9IGNyZWF0ZUVsKFwiYnV0dG9uXCIsIFwiY2xpY2thYmxlLWljb24gZ3JhcGgtbWVudS1pdGVtXCIpO1xuICAgICAgICAgICAgc2V0VG9vbHRpcChncmFwaEJ1dHRvbkVsLCBcIkNyZWF0ZSBOb2RlXCIsIHsgcGxhY2VtZW50OiBcInRvcFwiIH0pO1xuICAgICAgICAgICAgc2V0SWNvbihncmFwaEJ1dHRvbkVsLCBcImx1Y2lkZS13b3JrZmxvd1wiKTtcbiAgICAgICAgICAgIGdyYXBoQnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBBc3N1bWluZyBjYW52YXNWaWV3IGlzIGFjY2Vzc2libGUgaGVyZSwgb3IgeW91IG5lZWQgdG8gcGFzcyBpdCBzaW1pbGFybHlcbiAgICAgICAgICAgICAgICBjb25zdCBjYW52YXNWaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShcImNhbnZhc1wiKS5maXJzdCgpPy52aWV3O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gY2FudmFzVmlldy5jYW52YXM7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gY2FudmFzLnNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi52YWx1ZXMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gc2VsZWN0aW9uSXRlcmF0b3IubmV4dCgpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBub2RlLnggKyBub2RlLndpZHRoICsgMjAwO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2RlKGNhbnZhcywgbm9kZSwgeCwgbm9kZS55LCBcIjxyb2xlPnVzZXI8L3JvbGU+XCIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtZW51RWwuYXBwZW5kQ2hpbGQoZ3JhcGhCdXR0b25FbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRfYW5jZXN0b3JzKG5vZGVzOiBOb2RlW10sIGVkZ2VzOiBFZGdlW10sIG5vZGVJZDogc3RyaW5nKTogTm9kZVtdIHtcbiAgICAgICAgbGV0IGFuY2VzdG9yczogTm9kZVtdID0gW107XG4gICAgICAgIGxldCBjdXJyZW50SWQ6IHN0cmluZyA9IG5vZGVJZDtcbiAgICAgICAgbGV0IHByb2Nlc3NlZE5vZGVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgaW5jb21pbmdFZGdlczogRWRnZVtdID0gZWRnZXMuZmlsdGVyKChlZGdlKSA9PiBlZGdlLnRvTm9kZSA9PT0gY3VycmVudElkKTtcbiAgICAgICAgICAgIGlmIChpbmNvbWluZ0VkZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBObyBtb3JlIGFuY2VzdG9yc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50SWQgPSBpbmNvbWluZ0VkZ2VzWzBdLmZyb21Ob2RlO1xuICAgICAgICAgICAgaWYgKHByb2Nlc3NlZE5vZGVzLmhhcyhjdXJyZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIEF2b2lkIGluZmluaXRlIGxvb3BzIGluIGN5Y2xpYyBncmFwaHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2Nlc3NlZE5vZGVzLmFkZChjdXJyZW50SWQpO1xuXG4gICAgICAgICAgICBjb25zdCBhbmNlc3RvcjogTm9kZSB8IHVuZGVmaW5lZCA9IG5vZGVzLmZpbmQoKG5vZGUpID0+IG5vZGUuaWQgPT09IGN1cnJlbnRJZCk7XG4gICAgICAgICAgICBpZiAoYW5jZXN0b3IpIHtcbiAgICAgICAgICAgICAgICBhbmNlc3RvcnMucHVzaChhbmNlc3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYW5jZXN0b3JzO1xuICAgIH1cbiAgICBnZXRBbGxBbmNlc3Rvck5vZGVzKG5vZGVzOiBOb2RlW10sIGVkZ2VzOiBFZGdlW10sIG5vZGVJZDogc3RyaW5nKTogTm9kZVtdIHtcbiAgICAgICAgbGV0IGFuY2VzdG9yczogTm9kZVtdID0gW107XG4gICAgICAgIGxldCBxdWV1ZTogc3RyaW5nW10gPSBbbm9kZUlkXTtcbiAgICAgICAgbGV0IHByb2Nlc3NlZE5vZGVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRJZCA9IHF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRJZCB8fCBwcm9jZXNzZWROb2Rlcy5oYXMoY3VycmVudElkKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIHByb2Nlc3NlZE5vZGVzLmFkZChjdXJyZW50SWQpO1xuICAgICAgICAgICAgY29uc3QgaW5jb21pbmdFZGdlczogRWRnZVtdID0gZWRnZXMuZmlsdGVyKChlZGdlKSA9PiBlZGdlLnRvTm9kZSA9PT0gY3VycmVudElkKTtcbiAgICAgICAgICAgIGluY29taW5nRWRnZXMuZm9yRWFjaCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gbm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5pZCA9PT0gZWRnZS5mcm9tTm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yICYmICFwcm9jZXNzZWROb2Rlcy5oYXMoYW5jZXN0b3IuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2VzdG9ycy5wdXNoKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChhbmNlc3Rvci5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYW5jZXN0b3JzO1xuICAgIH1cbiAgICBnZXRMb25nZXN0TGluZWFnZShub2RlczogTm9kZVtdLCBlZGdlczogRWRnZVtdLCBub2RlSWQ6IHN0cmluZyk6IE5vZGVbXSB7XG4gICAgICAgIGxldCBsb25nZXN0TGluZWFnZTogTm9kZVtdID0gW107XG5cbiAgICAgICAgZnVuY3Rpb24gZmluZExvbmdlc3RQYXRoKGN1cnJlbnRJZDogc3RyaW5nLCBwYXRoOiBOb2RlW10pOiB2b2lkIHtcbiAgICAgICAgICAgIGNvbnN0IGluY29taW5nRWRnZXM6IEVkZ2VbXSA9IGVkZ2VzLmZpbHRlcigoZWRnZSkgPT4gZWRnZS50b05vZGUgPT09IGN1cnJlbnRJZCk7XG4gICAgICAgICAgICBpZiAoaW5jb21pbmdFZGdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY3VycmVudCBwYXRoIGlzIHRoZSBsb25nZXN0IHdlJ3ZlIGVuY291bnRlcmVkXG4gICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID4gbG9uZ2VzdExpbmVhZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvbmdlc3RMaW5lYWdlID0gcGF0aC5zbGljZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluY29taW5nRWRnZXMuZm9yRWFjaCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gbm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5pZCA9PT0gZWRnZS5mcm9tTm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhbmNlc3RvciBpcyB0aGUgZGlyZWN0IGFuY2VzdG9yIChpbmRleCAxKSBhbmQgaGFzICdjb250ZXh0JyBpbiBpdHMgY29udGVudFxuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDEgJiYgYW5jZXN0b3IudHlwZSA9PT0gXCJ0ZXh0XCIgJiYgYW5jZXN0b3IudGV4dC5pbmNsdWRlcyhcIjxjb250ZXh0PlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBTa2lwIHRoaXMgbGluZWFnZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmRMb25nZXN0UGF0aChhbmNlc3Rvci5pZCwgcGF0aC5jb25jYXQoYW5jZXN0b3IpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHdpdGggdGhlIGdpdmVuIG5vZGVcbiAgICAgICAgY29uc3Qgc3RhcnROb2RlID0gbm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5pZCA9PT0gbm9kZUlkKTtcbiAgICAgICAgaWYgKHN0YXJ0Tm9kZSkge1xuICAgICAgICAgICAgZmluZExvbmdlc3RQYXRoKG5vZGVJZCwgW3N0YXJ0Tm9kZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxvbmdlc3RMaW5lYWdlO1xuICAgIH1cbiAgICBnZXREaXJlY3RBbmNlc3RvcnNXaXRoQ29udGV4dChub2RlczogTm9kZVtdLCBlZGdlczogRWRnZVtdLCBub2RlSWQ6IHN0cmluZyk6IE5vZGVbXSB7XG4gICAgICAgIGxldCBkaXJlY3RBbmNlc3RvcnNXaXRoQ29udGV4dDogTm9kZVtdID0gW107XG5cbiAgICAgICAgY29uc3Qgc3RhcnROb2RlID0gbm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5pZCA9PT0gbm9kZUlkKTtcbiAgICAgICAgaWYgKCFzdGFydE5vZGUpIHJldHVybiBbXTtcblxuICAgICAgICBjb25zdCBpbmNvbWluZ0VkZ2VzOiBFZGdlW10gPSBlZGdlcy5maWx0ZXIoKGVkZ2UpID0+IGVkZ2UudG9Ob2RlID09PSBub2RlSWQpO1xuICAgICAgICBpbmNvbWluZ0VkZ2VzLmZvckVhY2goKGVkZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gbm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5pZCA9PT0gZWRnZS5mcm9tTm9kZSk7XG4gICAgICAgICAgICBpZiAoYW5jZXN0b3IgJiYgYW5jZXN0b3IudHlwZSA9PT0gXCJ0ZXh0XCIgJiYgYW5jZXN0b3IudGV4dC5pbmNsdWRlcyhcIjxjb250ZXh0PlwiKSkge1xuICAgICAgICAgICAgICAgIGRpcmVjdEFuY2VzdG9yc1dpdGhDb250ZXh0LnB1c2goYW5jZXN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGlyZWN0QW5jZXN0b3JzV2l0aENvbnRleHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0X3JlZl9ibG9ja3NfY29udGVudChub2RlOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlJ1bm5pbmcgaW4gcmVmIGJsb2Nrcy4gVGhpcyBpcyB0aGUgbm9kZVwiKTtcbiAgICAgICAgY29uc29sZS5sb2coeyBub2RlIH0pO1xuICAgICAgICBsZXQgcmVwX2Jsb2NrX2NvbnRlbnQgPSBcIlwiO1xuICAgICAgICBjb25zb2xlLmxvZyhub2RlLnRleHQpO1xuICAgICAgICBsZXQgcmVmX2Jsb2NrcztcbiAgICAgICAgaWYgKCFub2RlLnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWZfYmxvY2tzID0gbm9kZS50ZXh0Lm1hdGNoKC9cXFtcXFsuKj9cXF1cXF0vZykgfHwgW107XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG5vZGUpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihub2RlLnRleHQpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbm5lcl90ZXh0cyA9IHJlZl9ibG9ja3MubWFwKChibG9jazogc3RyaW5nKSA9PiBibG9jay5zbGljZSgyLCAtMikpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlX25hbWUgb2YgaW5uZXJfdGV4dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kRmlsZSA9IGZpbGVzLmZpbmQoKGZpbGUpID0+IGZpbGUuYmFzZW5hbWUgPT09IGZpbGVfbmFtZSk7XG4gICAgICAgICAgICBpZiAoZm91bmRGaWxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNhY2hlZFJlYWQoZm91bmRGaWxlKTtcbiAgICAgICAgICAgICAgICByZXBfYmxvY2tfY29udGVudCArPSBgVGl0bGU6ICR7ZmlsZV9uYW1lfVxcbiR7dGV4dH1cXG5cXG5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmlsZSBub3QgZm91bmQgZm9yOlwiLCBmaWxlX25hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcF9ibG9ja19jb250ZW50ID0gcmVwX2Jsb2NrX2NvbnRlbnQudHJpbSgpO1xuICAgICAgICByZXR1cm4gcmVwX2Jsb2NrX2NvbnRlbnQ7XG4gICAgfVxuXG4gICAgYXN5bmMgc3BhcmtsZShub2RlX2lkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY2FudmFzX3ZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFwiY2FudmFzXCIpLmZpcnN0KCk/LnZpZXc7XG4gICAgICAgIGlmICghY2FudmFzX3ZpZXcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBjYW52YXMgdmlldyBmb3VuZC5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FudmFzID0gY2FudmFzX3ZpZXcuY2FudmFzO1xuXG4gICAgICAgIGF3YWl0IGNhbnZhcy5yZXF1ZXN0U2F2ZSh0cnVlKTtcbiAgICAgICAgY29uc3QgY2FudmFzX2RhdGEgPSBjYW52YXMuZ2V0RGF0YSgpO1xuICAgICAgICBjb25zdCB7IGVkZ2VzLCBub2RlcyB9ID0gY2FudmFzX2RhdGE7XG4gICAgICAgIGNvbnN0IG5vZGVzX2l0ZXJhdG9yID0gY2FudmFzLm5vZGVzLnZhbHVlcygpO1xuICAgICAgICBsZXQgbm9kZSA9IG51bGw7XG4gICAgICAgIGNvbnNvbGUubG9nKG5vZGVfaWQpO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGVfb2JqcyBvZiBub2Rlc19pdGVyYXRvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobm9kZV9vYmpzKTtcbiAgICAgICAgICAgIGlmIChub2RlX29ianMuaWQgPT09IG5vZGVfaWQpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZV9vYmpzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vZGUgbm90IGZvdW5kIHdpdGggSUQ6XCIsIG5vZGVfaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udGludWUgd2l0aCBvcGVyYXRpb25zIG9uIGB0YXJnZXRfbm9kZWBcbiAgICAgICAgY29uc29sZS5sb2coXCJGb3VuZCBub2RlOlwiKTtcbiAgICAgICAgY29uc29sZS5sb2cobm9kZSk7XG4gICAgICAgIGlmIChub2RlLmhhc093blByb3BlcnR5KFwiZmlsZVwiKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJOb2RlIGhhcyBhICdmaWxlJyBhdHRyaWJ1dGUuXCIpO1xuICAgICAgICAgICAgY29uc3QgZmlsZV9wYXRoID0gbm9kZS5maWxlLnBhdGg7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZpbGVfcGF0aCk7XG4gICAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGZpbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aHJlZSBkYXNoZXMgaW5kaWNhdGluZyB0aGUgc3RhcnQgb2YgdGhlIGZyb250IG1hdHRlclxuICAgICAgICAgICAgICAgIGNvbnN0IGZyb250X21hdHRlcl9tYXRjaCA9IHRleHQubWF0Y2goL14tLS1cXHMqXihbXFxzXFxTXSo/KV4tLS0vbSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb250X21hdHRlcl9tYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcm9udF9tYXR0ZXJfY29udGVudCA9IGZyb250X21hdHRlcl9tYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJGcm9udCBtYXR0ZXIgY29udGVudCBleHRyYWN0ZWQ6XCIsIGZyb250X21hdHRlcl9jb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIGEgY2FyZXQgcHJvbXB0XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmV0X3Byb21wdF9tYXRjaCA9IGZyb250X21hdHRlcl9jb250ZW50Lm1hdGNoKC9jYXJldF9wcm9tcHQ6XFxzKihcXHcrKS8pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FyZXRfcHJvbXB0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb21wdF90YWdzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZXRfcHJvbXB0X21hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXJldF9wcm9tcHQgPSBjYXJldF9wcm9tcHRfbWF0Y2hbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC8vIEV4dHJhY3QgdGhlIHByb21wdHMgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBwcm9tcHRzX21hdGNoID0gZnJvbnRfbWF0dGVyX2NvbnRlbnQubWF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgL3Byb21wdHM6XFxzKlxcblxccyotXFxzKiguKj8pXFxuXFxzKi1cXHMqKC4qPylcXG5cXHMqLVxccyooLio/KShcXG58JCkvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZnJvbnRfbWF0dGVyX2NvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeyBwcm9tcHRzX21hdGNoIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHByb21wdHNfbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhwcm9tcHRzX21hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwcm9tcHRfdGFncyA9IFtwcm9tcHRzX21hdGNoWzFdLCBwcm9tcHRzX21hdGNoWzJdLCBwcm9tcHRzX21hdGNoWzNdXS5tYXAoKHMpID0+IHMudHJpbSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcIlByb21wdHMgZXh0cmFjdGVkOlwiLCBwcm9tcHRfdGFncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTcGxpdCB0aGUgZnJvbnQgbWF0dGVyIGNvbnRlbnQgaW50byBsaW5lc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBmcm9udF9tYXR0ZXJfY29udGVudC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyAncHJvbXB0cydcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdHNJbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobGluZSkgPT4gbGluZS50cmltKCkuc3RhcnRzV2l0aChcInByb21wdHM6XCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgJ3Byb21wdHMnIHdhcyBmb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21wdHNJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2xsZWN0IGFsbCBzdWJzZXF1ZW50IGxpbmVzIHRoYXQgc3RhcnQgd2l0aCBhIGRhc2ggJy0nIGluZGljYXRpbmcgbGlzdCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBwcm9tcHRzSW5kZXggKyAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdF90YWdzLnB1c2gobGluZS5zdWJzdHJpbmcoMSkudHJpbSgpKTsgLy8gUmVtb3ZlIHRoZSBkYXNoIGFuZCB0cmltIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBTdG9wIGlmIHdlIHJlYWNoIGEgbGluZSB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIGRhc2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlByb21wdHMgZXh0cmFjdGVkOlwiLCBwcm9tcHRfdGFncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmV0X3Byb21wdCA9PT0gXCJtdWx0aXByb21wdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gdGhpcy5wYXJzZUN1c3RvbVhNTCh0ZXh0LCBwcm9tcHRfdGFncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzX2tleXMgPSBPYmplY3Qua2V5cyhwcm9tcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsX3Byb21wdHMgPSBwcm9tcHRzX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FyZF9oZWlnaHQgPSBub2RlLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pZGRsZV9pbmRleCA9IE1hdGguZmxvb3IodG90YWxfcHJvbXB0cyAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaGVzdF95ID0gbm9kZS55IC0gbWlkZGxlX2luZGV4ICogKDEwMCArIGNhcmRfaGVpZ2h0KTsgLy8gQ2FsY3VsYXRlIHRoZSBoaWdoZXN0IHkgYmFzZWQgb24gdGhlIG1pZGRsZSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BhcmtsZVByb21pc2VzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb21wdHNfa2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21wdCA9IHByb21wdHNbcHJvbXB0c19rZXlzW2ldXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh7IHByb21wdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeCA9IG5vZGUueCArIG5vZGUud2lkdGggKyAyMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBoaWdoZXN0X3kgKyBpICogKDEwMCArIGNhcmRfaGVpZ2h0KTsgLy8gSW5jcmVtZW50IHkgZm9yIGVhY2ggcHJvbXB0IHRvIGRpc3RyaWJ1dGUgdGhlbSB2ZXJ0aWNhbGx5IGluY2x1ZGluZyBjYXJkIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld19ub2RlX2NvbnRlbnQgPSBgPHJvbGU+dXNlcjwvcm9sZT5cXG4ke3Byb21wdH1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVfb3V0cHV0ID0gYXdhaXQgdGhpcy5jaGlsZE5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X25vZGVfY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJncm9xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXJrbGVQcm9taXNlcy5wdXNoKHRoaXMuc3BhcmtsZShub2RlX291dHB1dC5pZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoc3BhcmtsZVByb21pc2VzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmlsZSBub3QgZm91bmQgb3IgaXMgbm90IGEgcmVhZGFibGUgZmlsZTpcIiwgZmlsZV9wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcIlJ1bm5pbmcganVzdCBhIG5vcm1hbCBub2RlPz8gVGhpcyBwcmludCAzIHRpbWVzXCIpO1xuXG4gICAgICAgIC8vIGNvbnN0IGFuY2VzdG9ycyA9IHRoaXMuZ2V0X2FuY2VzdG9ycyhub2RlcywgZWRnZXMsIG5vZGUuaWQpO1xuICAgICAgICAvLyBjb25zdCBhbGxfYW5jZXN0b3JzID0gdGhpcy5nZXRBbGxBbmNlc3Rvck5vZGVzKG5vZGVzLCBlZGdlcywgbm9kZS5pZCk7XG4gICAgICAgIGNvbnN0IGxvbmdlc3RfbGluZWFnZSA9IHRoaXMuZ2V0TG9uZ2VzdExpbmVhZ2Uobm9kZXMsIGVkZ2VzLCBub2RlLmlkKTtcblxuICAgICAgICBjb25zdCBhbmNlc3RvcnNfd2l0aF9jb250ZXh0ID0gdGhpcy5nZXREaXJlY3RBbmNlc3RvcnNXaXRoQ29udGV4dChub2RlcywgZWRnZXMsIG5vZGUuaWQpO1xuICAgICAgICAvLyBUT0RPIC0gVGhpcyBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLiBOb3Qgc3VyZSB3aGF0J3MgZ29pbmcgb24gd2l0aCB0aGlzXG4gICAgICAgIC8vIEkgd291bGQgdGhpbmsgaXQgc2hvdWRsIGJlIHBsdXJhbC4gQnV0IGl0OydzIG9ubHkgY2hlY2tpbmcgb25lIG5vZGU/XG4gICAgICAgIGNvbnN0IHJlZl9ibG9ja3MgPSBhd2FpdCB0aGlzLmdldF9yZWZfYmxvY2tzX2NvbnRlbnQobm9kZSk7XG4gICAgICAgIGxldCBhZGRlZF9jb250ZXh0ID0gYGA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5jZXN0b3JzX3dpdGhfY29udGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGFuY2VzdG9yc193aXRoX2NvbnRleHRbaV07XG4gICAgICAgICAgICBhZGRlZF9jb250ZXh0ICs9IG5vZGUudGV4dCArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZl9ibG9ja3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgYWRkZWRfY29udGV4dCArPSBgXFxuICR7cmVmX2Jsb2Nrc31gO1xuICAgICAgICB9XG4gICAgICAgIGFkZGVkX2NvbnRleHQgPSBhZGRlZF9jb250ZXh0LnRyaW0oKTtcbiAgICAgICAgbGV0IGNvbnZlcnNhdGlvbiA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9uZ2VzdF9saW5lYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gbG9uZ2VzdF9saW5lYWdlW2ldO1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gbm9kZS50ZXh0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09IFwiZmlsZVwiICYmIG5vZGUuZmlsZS5pbmNsdWRlcyhcIi5wZGZcIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlX25hbWUgPSBub2RlLmZpbGU7XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5nZXRGaWxlcygpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGZvdW5kRmlsZSA9IGZpbGVzLmZpbmQoKGZpbGUpID0+IGZpbGUuYmFzZW5hbWUgPT09IGZpbGVfbmFtZSk7XG4gICAgICAgICAgICAgICAgdGV4dCA9IGF3YWl0IHRoaXMuZXh0cmFjdFRleHRGcm9tUERGKGZpbGVfbmFtZSk7XG4gICAgICAgICAgICAgICAgYWRkZWRfY29udGV4dCArPSB0ZXh0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBcImFzc2lzdGFudFwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb252ZXJzYXRpb24ucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdXNlclJlZ2V4ID0gLzxyb2xlPlVzZXI8XFwvcm9sZT4vaTtcbiAgICAgICAgICAgIGNvbnN0IGFzc2lzdGFudFJlZ2V4ID0gLzxyb2xlPmFzc2lzdGFudDxcXC9yb2xlPi9pO1xuXG4gICAgICAgICAgICBpZiAodXNlclJlZ2V4LnRlc3QodGV4dCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGxpdF90ZXh0ID0gdGV4dC5zcGxpdCh1c2VyUmVnZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBcInVzZXJcIjtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IHNwbGl0X3RleHRbMV0udHJpbSgpO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgZm9yIHRoZSBmaXJzdCBub2RlXG4gICAgICAgICAgICAgICAgaWYgKGFkZGVkX2NvbnRleHQubGVuZ3RoID4gMSAmJiBpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYFxcbiR7YWRkZWRfY29udGV4dH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udmVyc2F0aW9uLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXNzaXN0YW50UmVnZXgudGVzdCh0ZXh0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0X3RleHQgPSB0ZXh0LnNwbGl0KGFzc2lzdGFudFJlZ2V4KTtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gXCJhc3Npc3RhbnRcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gc3BsaXRfdGV4dFsxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbi5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnZlcnNhdGlvbi5yZXZlcnNlKCk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdG90YWxfY29udmVyc2F0aW9uX2xlbmd0aCA9IGNvbnZlcnNhdGlvbi5yZWR1Y2UoKHRvdGFsLCBtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdG90YWwgKyBtZXNzYWdlLmNvbnRlbnQuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgY29uc29sZS5sb2coYFRvdGFsIHdvcmQgY291bnQgaW4gY29udmVyc2F0aW9uOiAke3RvdGFsX2NvbnZlcnNhdGlvbl9sZW5ndGh9YCk7XG4gICAgICAgIGxldCBtb2RlbF9jaG9pY2UgPSBcImdyb3FcIjtcbiAgICAgICAgLy8gVE9ETyAtIFJlZmFjdG9yIHRoaXMgb3V0XG4gICAgICAgIGlmICh0b3RhbF9jb252ZXJzYXRpb25fbGVuZ3RoID4gMTAwMDApIHtcbiAgICAgICAgICAgIG1vZGVsX2Nob2ljZSA9IFwib3BlbmFpLWdwdC00XCI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5vZGVfY29udGVudCA9IFwiXCI7XG4gICAgICAgIGlmIChtb2RlbF9jaG9pY2UgPT09IFwibG9jYWxcIikge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgbG9jYWxcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9jb252ZXJzYXRpb25cIiwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZV9jb250ZW50ID0gYDxyb2xlPmFzc2lzdGFudDwvcm9sZT5cXG4ke291dHB1dC5yZXNwb25zZX1gO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCB4ID0gbm9kZS54ICsgbm9kZS53aWR0aCArIDIwMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5jaGlsZE5vZGUoY2FudmFzLCBub2RlLCB4LCBub2RlLnksIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOlwiLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kZWxfY2hvaWNlID09PSBcImdyb3FcIikge1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBcImxsYW1hMy03MGItODE5MlwiO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZXM6IGNvbnZlcnNhdGlvbixcbiAgICAgICAgICAgICAgICBtb2RlbDogbW9kZWwsXG4gICAgICAgICAgICAgICAgLy8gdG9vbHM6IHRvb2xzLFxuICAgICAgICAgICAgICAgIC8vIHRvb2xfY2hvaWNlOiB0b29sX2Nob2ljZSxcbiAgICAgICAgICAgICAgICBtYXhfdG9rZW5zOiAxMjAwMCxcbiAgICAgICAgICAgICAgICBzdG9wOiBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJDYWxsaW5nIEdyb3EhXCIpO1xuICAgICAgICAgICAgZ3JvcS5jaGF0LmNvbXBsZXRpb25zXG4gICAgICAgICAgICAgICAgLmNyZWF0ZShwYXJhbXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGNoYXRfY29tcGxldGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiTWVzc2FnZSBiYWNrIGZyb20gR3JvcSFcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjaGF0X2NvbXBsZXRpb24uY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVfY29udGVudCA9IGA8cm9sZT5hc3Npc3RhbnQ8L3JvbGU+XFxuJHtjb250ZW50fWA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHggPSBub2RlLnggKyBub2RlLndpZHRoICsgMjAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZShjYW52YXMsIG5vZGUsIHgsIG5vZGUueSwgbm9kZV9jb250ZW50LCBcInJpZ2h0XCIsIFwibGVmdFwiLCBcImdyb3FcIik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBjaGF0IGNvbXBsZXRpb24gZnJvbSBHcm9xOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGVsX2Nob2ljZSA9PT0gXCJvcGVuYWktZ3B0LTRcIikge1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBcImdwdC00LTExMDYtcHJldmlld1wiO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBjb252ZXJzYXRpb24sXG4gICAgICAgICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJDYWxsaW5nIEdQVC00IVwiKTtcbiAgICAgICAgICAgIG9wZW5haS5jaGF0LmNvbXBsZXRpb25zXG4gICAgICAgICAgICAgICAgLmNyZWF0ZShwYXJhbXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGNoYXRfY29tcGxldGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKFwiTWVzc2FnZSBiYWNrIGZyb20gR1BULTQhXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gY2hhdF9jb21wbGV0aW9uLmNob2ljZXNbMF0ubWVzc2FnZS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlX2NvbnRlbnQgPSBgPHJvbGU+YXNzaXN0YW50PC9yb2xlPlxcbiR7Y29udGVudH1gO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gbm9kZS54ICsgbm9kZS53aWR0aCArIDIwMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGUoY2FudmFzLCBub2RlLCB4LCBub2RlLnksIG5vZGVfY29udGVudCwgXCJyaWdodFwiLCBcImxlZnRcIiwgXCJncm9xXCIpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgY2hhdCBjb21wbGV0aW9uOlwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc3QgeCA9IG5vZGUueCArIG5vZGUud2lkdGggKyAyMDA7XG4gICAgICAgIC8vIHRoaXMuY2hpbGROb2RlKGNhbnZhcywgbm9kZSwgeCwgbm9kZS55LCBub2RlX2NvbnRlbnQsIFwicmlnaHRcIiwgXCJsZWZ0XCIsIFwiZ3JvcVwiKTtcbiAgICB9XG5cbiAgICBhZGRBSUJ1dHRvbklmTmVlZGVkKG1lbnVFbDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFtZW51RWwucXVlcnlTZWxlY3RvcihcIi5ncHQtbWVudS1pdGVtXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBidXR0b25FbCA9IGNyZWF0ZUVsKFwiYnV0dG9uXCIsIFwiY2xpY2thYmxlLWljb24gZ3B0LW1lbnUtaXRlbVwiKTtcbiAgICAgICAgICAgIHNldFRvb2x0aXAoYnV0dG9uRWwsIFwiU3BhcmtsZVwiLCB7IHBsYWNlbWVudDogXCJ0b3BcIiB9KTtcbiAgICAgICAgICAgIHNldEljb24oYnV0dG9uRWwsIFwibHVjaWRlLXNwYXJrbGVzXCIpO1xuICAgICAgICAgICAgYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW52YXNWaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShcImNhbnZhc1wiKS5maXJzdCgpPy52aWV3O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGNhbnZhc1ZpZXcuY2FudmFzO1xuICAgICAgICAgICAgICAgIGF3YWl0IGNhbnZhcy5yZXF1ZXN0U2F2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjYW52YXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGNhbnZhcy5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24udmFsdWVzKCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlX2lkID0gbm9kZS5pZDtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNwYXJrbGUobm9kZV9pZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1lbnVFbC5hcHBlbmRDaGlsZChidXR0b25FbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGlsZE5vZGUgPSBhc3luYyAoXG4gICAgICAgIGNhbnZhczogQ2FudmFzLFxuICAgICAgICBwYXJlbnROb2RlOiBDYW52YXNOb2RlRGF0YSxcbiAgICAgICAgeDogbnVtYmVyLFxuICAgICAgICB5OiBudW1iZXIsXG4gICAgICAgIGNvbnRlbnQ6IHN0cmluZyA9IFwiXCIsXG4gICAgICAgIGZyb21fc2lkZTogc3RyaW5nID0gXCJyaWdodFwiLFxuICAgICAgICB0b19zaWRlOiBzdHJpbmcgPSBcImxlZnRcIixcbiAgICAgICAgb3JpZ2luOiBzdHJpbmcgPSBcImlnbm9yZVwiXG4gICAgKSA9PiB7XG4gICAgICAgIGxldCB0ZW1wQ2hpbGROb2RlID0gdGhpcy5hZGROb2RlKGNhbnZhcywgdGhpcy5yYW5kb20oMTYpLCB7XG4gICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgeTogeSxcbiAgICAgICAgICAgIHdpZHRoOiBwYXJlbnROb2RlLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBwYXJlbnROb2RlLmhlaWdodCxcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRWRnZShwYXJlbnROb2RlLCB0ZW1wQ2hpbGROb2RlLCBjYW52YXMsIGZyb21fc2lkZSwgdG9fc2lkZSk7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IGNhbnZhcy5ub2Rlcz8uZ2V0KHRlbXBDaGlsZE5vZGU/LmlkISk7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGNhbnZhcy5zZWxlY3RPbmx5KG5vZGUpO1xuXG4gICAgICAgIGNhbnZhcy5yZXF1ZXN0U2F2ZSgpO1xuXG4gICAgICAgIHJldHVybiB0ZW1wQ2hpbGROb2RlO1xuICAgIH07XG5cbiAgICBhZGROb2RlID0gKFxuICAgICAgICBjYW52YXM6IENhbnZhcyxcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAge1xuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIHksXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgc3VicGF0aCxcbiAgICAgICAgfToge1xuICAgICAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICAgICAgeTogbnVtYmVyO1xuICAgICAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIgfCBcImZpbGVcIjtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgICAgIHN1YnBhdGg/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICApID0+IHtcbiAgICAgICAgaWYgKCFjYW52YXMpIHJldHVybjtcblxuICAgICAgICBjb25zdCBkYXRhID0gY2FudmFzLmdldERhdGEoKTtcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgbm9kZTogUGFydGlhbDxDYW52YXNUZXh0RGF0YSB8IENhbnZhc0ZpbGVEYXRhPiA9IHtcbiAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5LFxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICBub2RlLnRleHQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgICAgICAgICBub2RlLmZpbGUgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIGlmIChzdWJwYXRoKSBub2RlLnN1YnBhdGggPSBzdWJwYXRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FudmFzLmltcG9ydERhdGEoPENhbnZhc0RhdGE+e1xuICAgICAgICAgICAgbm9kZXM6IFsuLi5kYXRhLm5vZGVzLCBub2RlXSxcbiAgICAgICAgICAgIGVkZ2VzOiBkYXRhLmVkZ2VzLFxuICAgICAgICB9KTtcblxuICAgICAgICBjYW52YXMucmVxdWVzdEZyYW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfTtcbiAgICBjcmVhdGVFZGdlID0gYXN5bmMgKG5vZGUxOiBhbnksIG5vZGUyOiBhbnksIGNhbnZhczogYW55LCBmcm9tX3NpZGU6IHN0cmluZyA9IFwicmlnaHRcIiwgdG9fc2lkZTogc3RyaW5nID0gXCJsZWZ0XCIpID0+IHtcbiAgICAgICAgdGhpcy5hZGRFZGdlKFxuICAgICAgICAgICAgY2FudmFzLFxuICAgICAgICAgICAgdGhpcy5yYW5kb20oMTYpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb21PclRvOiBcImZyb21cIixcbiAgICAgICAgICAgICAgICBzaWRlOiBmcm9tX3NpZGUsXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZTEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb21PclRvOiBcInRvXCIsXG4gICAgICAgICAgICAgICAgc2lkZTogdG9fc2lkZSxcbiAgICAgICAgICAgICAgICBub2RlOiBub2RlMixcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9O1xuICAgIC8vIFRPRE8gLSBDaGFuZ2UgdGhpc1xuICAgIHJhbmRvbSA9IChlOiBudW1iZXIpID0+IHtcbiAgICAgICAgbGV0IHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBlOyBuKyspIHtcbiAgICAgICAgICAgIHQucHVzaCgoKDE2ICogTWF0aC5yYW5kb20oKSkgfCAwKS50b1N0cmluZygxNikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0LmpvaW4oXCJcIik7XG4gICAgfTtcbiAgICBhZGRFZGdlID0gKGNhbnZhczogYW55LCBlZGdlSUQ6IHN0cmluZywgZnJvbUVkZ2U6IGVkZ2VULCB0b0VkZ2U6IGVkZ2VUKSA9PiB7XG4gICAgICAgIGlmICghY2FudmFzKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IGNhbnZhcy5nZXREYXRhKCk7XG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIGNhbnZhcy5pbXBvcnREYXRhKHtcbiAgICAgICAgICAgIGVkZ2VzOiBbXG4gICAgICAgICAgICAgICAgLi4uZGF0YS5lZGdlcyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlZGdlSUQsXG4gICAgICAgICAgICAgICAgICAgIGZyb21Ob2RlOiBmcm9tRWRnZS5ub2RlLmlkLFxuICAgICAgICAgICAgICAgICAgICBmcm9tU2lkZTogZnJvbUVkZ2Uuc2lkZSxcbiAgICAgICAgICAgICAgICAgICAgdG9Ob2RlOiB0b0VkZ2Uubm9kZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgdG9TaWRlOiB0b0VkZ2Uuc2lkZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG5vZGVzOiBkYXRhLm5vZGVzLFxuICAgICAgICB9KTtcblxuICAgICAgICBjYW52YXMucmVxdWVzdEZyYW1lKCk7XG4gICAgfTtcblxuICAgIC8vIE1ldGhvZCB0byBpbnNlcnQgdGV4dCBpbnRvIHRoZSBzaWRlYmFyXG4gICAgaW5zZXJ0VGV4dEludG9TaWRlYmFyKHRleHQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCB0cmltbWVkX3RleHQgPSB0ZXh0LnRyaW0oKTtcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcbiAgICAgICAgICAgIGlmIChsZWFmLnZpZXcuZ2V0Vmlld1R5cGUoKSA9PT0gVklFV19OQU1FX1NJREVCQVJfQ0hBVCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBsZWFmLnZpZXcgYXMgU2lkZWJhckNoYXQ7XG4gICAgICAgICAgICAgICAgaWYgKHZpZXcudGV4dEJveCkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnRleHRCb3gudmFsdWUgKz0gdHJpbW1lZF90ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTWV0aG9kIHRvIGNsZWFyIHRleHQgZnJvbSB0aGUgc2lkZWJhclxuICAgIGNsZWFyVGV4dEluU2lkZWJhcigpIHtcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcbiAgICAgICAgICAgIGlmIChsZWFmLnZpZXcuZ2V0Vmlld1R5cGUoKSA9PT0gVklFV19OQU1FX1NJREVCQVJfQ0hBVCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBsZWFmLnZpZXcgYXMgU2lkZWJhckNoYXQ7XG4gICAgICAgICAgICAgICAgaWYgKHZpZXcudGV4dEJveCkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnRleHRCb3gudmFsdWUgPSBcIlwiOyAvLyBDbGVhciB0aGUgdGV4dCBib3hcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZpZXcubWVzc2FnZXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5tZXNzYWdlc0NvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiOyAvLyBDbGVhciB0aGUgbWVzc2FnZXMgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkU2lkZWJhclRhYigpIHtcbiAgICAgICAgdGhpcy5hZGRSaWJib25JY29uKFwiZG9jdW1lbnRcIiwgXCJPcGVuIENhcmV0XCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB2aWV3IGlzIGFscmVhZHkgcHJlc2VudCBpbiBhbnkgbGVhZlxuXG4gICAgICAgICAgICAvLyBUaGlzIGNyZWF0ZXMgdGhlIHZpZXcgaW4gdGhlIHNpZGViYXJcbiAgICAgICAgICAgIC8vIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gdGhpcy5hcHAud29ya3NwYWNlLml0ZXJhdGVBbGxMZWF2ZXMoKGxlYWYpID0+IHtcbiAgICAgICAgICAgIC8vICAgICBpZiAobGVhZi52aWV3LmdldFZpZXdUeXBlKCkgPT09IFZJRVdfTkFNRV9TSURFQkFSX0NIQVQpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gICAgICAgICAvLyBJZiB0aGUgdmlldyBpcyBub3QgdGhlIGFjdGl2ZSB2aWV3LCBicmluZyBpdCBpbnRvIGZvY3VzXG4gICAgICAgICAgICAvLyAgICAgICAgIGlmICghbGVhZi52aWV3LmNvbnRhaW5lckVsLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiaXMtYWN0aXZlXCIpKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UucmV2ZWFsTGVhZihsZWFmKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vIH0pO1xuXG4gICAgICAgICAgICAvLyAvLyBJZiB0aGUgdmlldyB3YXMgbm90IGZvdW5kLCBjcmVhdGUgaXQgaW4gdGhlIHJpZ2h0IHNpZGViYXJcbiAgICAgICAgICAgIC8vIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIC8vICAgICBhd2FpdCB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgLy8gICAgICAgICB0eXBlOiBWSUVXX05BTUVfU0lERUJBUl9DSEFULFxuICAgICAgICAgICAgLy8gICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5hcHAud29ya3NwYWNlLnJldmVhbExlYWYodGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSkpO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBsZXQgbWFpbl9jaGF0X2ZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UuaXRlcmF0ZUFsbExlYXZlcygobGVhZikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChsZWFmLnZpZXcuZ2V0Vmlld1R5cGUoKSA9PT0gVklFV19OQU1FX01BSU5fQ0hBVCkge1xuICAgICAgICAgICAgICAgICAgICBtYWluX2NoYXRfZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmlldyBpcyBub3QgdGhlIGFjdGl2ZSB2aWV3LCBicmluZyBpdCBpbnRvIGZvY3VzXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsZWFmLnZpZXcuY29udGFpbmVyRWwucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJpcy1hY3RpdmVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5yZXZlYWxMZWFmKGxlYWYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSB2aWV3IHdhcyBub3QgZm91bmQsIGNyZWF0ZSBpdCBpbiB0aGUgcmlnaHQgc2lkZWJhclxuICAgICAgICAgICAgaWYgKCFtYWluX2NoYXRfZm91bmQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhZih0cnVlKS5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBWSUVXX05BTUVfTUFJTl9DSEFULFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5hcHAud29ya3NwYWNlLnJldmVhbExlYWYodGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYodHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbnVubG9hZCgpIHt9XG5cbiAgICBhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcbiAgICB9XG59XG5cbmNsYXNzIFNhbXBsZVNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgICBwbHVnaW46IE15UGx1Z2luO1xuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogTXlQbHVnaW4pIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICB9XG5cbiAgICBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZShcIlNldHRpbmcgIzFcIilcbiAgICAgICAgICAgIC5zZXREZXNjKFwiSXQncyBhIHNlY3JldFwiKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0UGxhY2Vob2xkZXIoXCJFbnRlciB5b3VyIHNlY3JldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MubXlTZXR0aW5nKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5teVNldHRpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICB9XG59XG4iLCAiZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxuZnVuY3Rpb24gZ2V0QXVnbWVudGVkTmFtZXNwYWNlKG4pIHtcbiAgaWYgKG4uX19lc01vZHVsZSkgcmV0dXJuIG47XG4gIHZhciBmID0gbi5kZWZhdWx0O1xuXHRpZiAodHlwZW9mIGYgPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0dmFyIGEgPSBmdW5jdGlvbiBhICgpIHtcblx0XHRcdGlmICh0aGlzIGluc3RhbmNlb2YgYSkge1xuXHRcdFx0XHR2YXIgYXJncyA9IFtudWxsXTtcblx0XHRcdFx0YXJncy5wdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdHZhciBDdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShmLCBhcmdzKTtcblx0XHRcdFx0cmV0dXJuIG5ldyBDdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdH07XG5cdFx0YS5wcm90b3R5cGUgPSBmLnByb3RvdHlwZTtcbiAgfSBlbHNlIGEgPSB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsICdfX2VzTW9kdWxlJywge3ZhbHVlOiB0cnVlfSk7XG5cdE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0XHR2YXIgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobiwgayk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIGssIGQuZ2V0ID8gZCA6IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG5ba107XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xuXHRyZXR1cm4gYTtcbn1cblxudmFyIGdsb2JhbCQxID0gKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOlxuICB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOlxuICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pO1xuXG52YXIgbG9va3VwID0gW107XG52YXIgcmV2TG9va3VwID0gW107XG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5O1xudmFyIGluaXRlZCA9IGZhbHNlO1xuZnVuY3Rpb24gaW5pdCAoKSB7XG4gIGluaXRlZCA9IHRydWU7XG4gIHZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGxvb2t1cFtpXSA9IGNvZGVbaV07XG4gICAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpO1xuICB9XG5cbiAgcmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyO1xuICByZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjM7XG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgaWYgKCFpbml0ZWQpIHtcbiAgICBpbml0KCk7XG4gIH1cbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnI7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoO1xuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICBwbGFjZUhvbGRlcnMgPSBiNjRbbGVuIC0gMl0gPT09ICc9JyA/IDIgOiBiNjRbbGVuIC0gMV0gPT09ICc9JyA/IDEgOiAwO1xuXG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKTtcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gbGVuIC0gNCA6IGxlbjtcblxuICB2YXIgTCA9IDA7XG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXTtcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRjtcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGO1xuICAgIGFycltMKytdID0gdG1wICYgMHhGRjtcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KTtcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkY7XG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpO1xuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkY7XG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXA7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pO1xuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIGlmICghaW5pdGVkKSB7XG4gICAgaW5pdCgpO1xuICB9XG4gIHZhciB0bXA7XG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGg7XG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMzsgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIG91dHB1dCA9ICcnO1xuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODM7IC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpO1xuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdO1xuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdO1xuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdO1xuICAgIG91dHB1dCArPSAnPT0nO1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pO1xuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXTtcbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXTtcbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXTtcbiAgICBvdXRwdXQgKz0gJz0nO1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpO1xuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiByZWFkIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIG5CaXRzID0gLTc7XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDA7XG4gIHZhciBkID0gaXNMRSA/IC0xIDogMTtcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV07XG5cbiAgaSArPSBkO1xuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpO1xuICBzID4+PSAoLW5CaXRzKTtcbiAgbkJpdHMgKz0gZUxlbjtcbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKTtcbiAgZSA+Pj0gKC1uQml0cyk7XG4gIG5CaXRzICs9IG1MZW47XG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzO1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pO1xuICAgIGUgPSBlIC0gZUJpYXM7XG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZnVuY3Rpb24gd3JpdGUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKTtcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKTtcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xO1xuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMDtcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKTtcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMDtcbiAgICBlID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMik7XG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tO1xuICAgICAgYyAqPSAyO1xuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IGUgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pO1xuICAgICAgZSA9IDA7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtO1xuICBlTGVuICs9IG1MZW47XG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjg7XG59XG5cbnZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG52YXIgaXNBcnJheSQyID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxudmFyIElOU1BFQ1RfTUFYX0JZVEVTID0gNTA7XG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsJDEuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsJDEuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHRydWU7XG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmtNYXhMZW5ndGgoKTtcblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpO1xuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MjsgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gIHJldHVybiBhcnJcbn07XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufTtcblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGU7XG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5O1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikgO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSk7XG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn07XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSk7XG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApO1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59O1xuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufTtcblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwO1xuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aCk7XG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZyk7XG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpO1xuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMDtcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1O1xuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoOyAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpO1xuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheTtcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKGludGVybmFsSXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMDtcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbik7XG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKTtcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5JDIob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5CdWZmZXIuaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbmZ1bmN0aW9uIGludGVybmFsSXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihhKSB8fCAhaW50ZXJuYWxJc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59O1xuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufTtcblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheSQyKGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpO1xuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpO1xuICB2YXIgcG9zID0gMDtcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXTtcbiAgICBpZiAoIWludGVybmFsSXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpO1xuICAgIHBvcyArPSBidWYubGVuZ3RoO1xuICB9XG4gIHJldHVybiBidWZmZXJcbn07XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKGludGVybmFsSXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nO1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGg7XG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlO1xuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7XG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2U7XG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMDtcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDA7XG4gIHN0YXJ0ID4+Pj0gMDtcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4JztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWU7XG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dO1xuICBiW25dID0gYlttXTtcbiAgYlttXSA9IGk7XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoO1xuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpO1xuICB9XG4gIHJldHVybiB0aGlzXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKTtcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMik7XG4gIH1cbiAgcmV0dXJuIHRoaXNcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoO1xuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpO1xuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KTtcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSk7XG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpO1xuICB9XG4gIHJldHVybiB0aGlzXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwO1xuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJyc7XG4gIHZhciBtYXggPSBJTlNQRUNUX01BWF9CWVRFUztcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICc7XG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMDtcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMDtcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwO1xuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGg7XG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwO1xuICBlbmQgPj4+PSAwO1xuICB0aGlzU3RhcnQgPj4+PSAwO1xuICB0aGlzRW5kID4+Pj0gMDtcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydDtcbiAgdmFyIHkgPSBlbmQgLSBzdGFydDtcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpO1xuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKTtcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldO1xuICAgICAgeSA9IHRhcmdldENvcHlbaV07XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn07XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldDtcbiAgICBieXRlT2Zmc2V0ID0gMDtcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmO1xuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMDtcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQ7ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldDtcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxO1xuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDA7XG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZyk7XG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoaW50ZXJuYWxJc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkY7IC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDE7XG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aDtcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDI7XG4gICAgICBhcnJMZW5ndGggLz0gMjtcbiAgICAgIHZhbExlbmd0aCAvPSAyO1xuICAgICAgYnl0ZU9mZnNldCAvPSAyO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaTtcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTE7XG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGk7XG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleDtcbiAgICAgICAgZm91bmRJbmRleCA9IC0xO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aDtcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufTtcblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwO1xuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aCk7XG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoO1xuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDI7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpO1xuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZDtcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBvZmZzZXQgPSAwO1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0O1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIG9mZnNldCA9IDA7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDA7XG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoO1xuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXQ7XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZztcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4JztcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZTtcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufTtcblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpO1xuICB2YXIgcmVzID0gW107XG5cbiAgdmFyIGkgPSBzdGFydDtcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldO1xuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsO1xuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMTtcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnQ7XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdO1xuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRik7XG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdO1xuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRik7XG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdO1xuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdO1xuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRik7XG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEO1xuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDE7XG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRjtcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpO1xuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZTtcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMDtcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aDtcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJyc7XG4gIHZhciBpID0gMDtcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJztcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKTtcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpO1xuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJyc7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZCk7XG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pO1xuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aDtcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwO1xuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuO1xuXG4gIHZhciBvdXQgPSAnJztcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKTtcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKTtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aDtcbiAgc3RhcnQgPSB+fnN0YXJ0O1xuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kO1xuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW47XG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwO1xuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW47XG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW47XG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDA7XG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuO1xuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydDtcblxuICB2YXIgbmV3QnVmO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlO1xuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0O1xuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufTtcblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdO1xuICB2YXIgbXVsID0gMTtcbiAgdmFyIGkgPSAwO1xuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsO1xuICB9XG5cbiAgcmV0dXJuIHZhbFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF07XG4gIHZhciBtdWwgPSAxO1xuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsO1xuICB9XG5cbiAgcmV0dXJuIHZhbFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aCk7XG4gIHJldHVybiB0aGlzW29mZnNldF1cbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpO1xuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpO1xuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF07XG4gIHZhciBtdWwgPSAxO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWw7XG4gIH1cbiAgbXVsICo9IDB4ODA7XG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCk7XG5cbiAgcmV0dXJuIHZhbFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKTtcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGg7XG4gIHZhciBtdWwgPSAxO1xuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldO1xuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsO1xuICB9XG4gIG11bCAqPSAweDgwO1xuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpO1xuXG4gIHJldHVybiB2YWxcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKTtcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKTtcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpO1xuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aCk7XG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KTtcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpO1xuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aCk7XG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuIHJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuIHJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKTtcbiAgcmV0dXJuIHJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpO1xuICByZXR1cm4gcmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn07XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxO1xuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKTtcbiAgfVxuXG4gIHZhciBtdWwgPSAxO1xuICB2YXIgaSA9IDA7XG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRjtcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkY7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMTtcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMCk7XG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxO1xuICB2YXIgbXVsID0gMTtcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRjtcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKTtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKTtcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZik7XG4gIHJldHVybiBvZmZzZXQgKyAxXG59O1xuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDE7XG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4O1xuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKTtcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMCk7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOCk7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufTtcblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMTtcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmY7XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApO1xuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNCk7XG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpO1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpO1xuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMCk7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KTtcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KTtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZik7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpO1xuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSk7XG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdCk7XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIHZhciBtdWwgPSAxO1xuICB2YXIgc3ViID0gMDtcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGO1xuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxO1xuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGO1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKTtcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KTtcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDE7XG4gIHZhciBtdWwgPSAxO1xuICB2YXIgc3ViID0gMDtcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRjtcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDE7XG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkY7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MCk7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMTtcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZik7XG4gIHJldHVybiBvZmZzZXQgKyAxXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMCk7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpO1xuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWU7XG4gIG9mZnNldCA9IG9mZnNldCB8IDA7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMCk7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOCk7XG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKTtcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlO1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwO1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCk7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KTtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNCk7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn07XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMDtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApO1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDE7XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpO1xuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KTtcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KTtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZik7XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpO1xuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59O1xuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0KTtcbiAgfVxuICB3cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpO1xuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59O1xuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufTtcblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCk7XG4gIH1cbiAgd3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KTtcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufTtcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn07XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwO1xuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoO1xuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoO1xuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDA7XG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydDtcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGg7XG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0O1xuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0O1xuICB2YXIgaTtcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF07XG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGxlblxufTtcblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0O1xuICAgICAgc3RhcnQgPSAwO1xuICAgICAgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmQ7XG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aDtcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMCk7XG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NTtcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMDtcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMDtcblxuICBpZiAoIXZhbCkgdmFsID0gMDtcblxuICB2YXIgaTtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gaW50ZXJuYWxJc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpO1xuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59O1xuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZztcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKTtcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nO1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5O1xuICB2YXIgY29kZVBvaW50O1xuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsO1xuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50O1xuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50O1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbDtcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpO1xuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpO1xuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsbztcbiAgdmFyIGJ5dGVBcnJheSA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGhpID0gYyA+PiA4O1xuICAgIGxvID0gYyAlIDI1NjtcbiAgICBieXRlQXJyYXkucHVzaChsbyk7XG4gICAgYnl0ZUFycmF5LnB1c2goaGkpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gdG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldO1xuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG5cblxuLy8gdGhlIGZvbGxvd2luZyBpcyBmcm9tIGlzLWJ1ZmZlciwgYWxzbyBieSBGZXJvc3MgQWJvdWtoYWRpamVoIGFuZCB3aXRoIHNhbWUgbGlzZW5jZVxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxuZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoISFvYmouX2lzQnVmZmVyIHx8IGlzRmFzdEJ1ZmZlcihvYmopIHx8IGlzU2xvd0J1ZmZlcihvYmopKVxufVxuXG5mdW5jdGlvbiBpc0Zhc3RCdWZmZXIgKG9iaikge1xuICByZXR1cm4gISFvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKVxufVxuXG4vLyBGb3IgTm9kZSB2MC4xMCBzdXBwb3J0LiBSZW1vdmUgdGhpcyBldmVudHVhbGx5LlxuZnVuY3Rpb24gaXNTbG93QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmoucmVhZEZsb2F0TEUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0Zhc3RCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuXG4vLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbi8vIGJhc2VkIG9mZiBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qc1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbnZhciBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuaWYgKHR5cGVvZiBnbG9iYWwkMS5zZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG59XG5pZiAodHlwZW9mIGdsb2JhbCQxLmNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbn1cblxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuZnVuY3Rpb24gbmV4dFRpY2soZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn1cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG52YXIgdGl0bGUgPSAnYnJvd3Nlcic7XG52YXIgcGxhdGZvcm0gPSAnYnJvd3Nlcic7XG52YXIgYnJvd3NlciA9IHRydWU7XG52YXIgZW52ID0ge307XG52YXIgYXJndiA9IFtdO1xudmFyIHZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnZhciB2ZXJzaW9ucyA9IHt9O1xudmFyIHJlbGVhc2UgPSB7fTtcbnZhciBjb25maWcgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBvbiA9IG5vb3A7XG52YXIgYWRkTGlzdGVuZXIgPSBub29wO1xudmFyIG9uY2UgPSBub29wO1xudmFyIG9mZiA9IG5vb3A7XG52YXIgcmVtb3ZlTGlzdGVuZXIgPSBub29wO1xudmFyIHJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG52YXIgZW1pdCA9IG5vb3A7XG5cbmZ1bmN0aW9uIGJpbmRpbmckMShuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufVxuXG5mdW5jdGlvbiBjd2QgKCkgeyByZXR1cm4gJy8nIH1cbmZ1bmN0aW9uIGNoZGlyIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufWZ1bmN0aW9uIHVtYXNrKCkgeyByZXR1cm4gMDsgfVxuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rdW1hdmlzL2Jyb3dzZXItcHJvY2Vzcy1ocnRpbWUvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbCQxLnBlcmZvcm1hbmNlIHx8IHt9O1xudmFyIHBlcmZvcm1hbmNlTm93ID1cbiAgcGVyZm9ybWFuY2Uubm93ICAgICAgICB8fFxuICBwZXJmb3JtYW5jZS5tb3pOb3cgICAgIHx8XG4gIHBlcmZvcm1hbmNlLm1zTm93ICAgICAgfHxcbiAgcGVyZm9ybWFuY2Uub05vdyAgICAgICB8fFxuICBwZXJmb3JtYW5jZS53ZWJraXROb3cgIHx8XG4gIGZ1bmN0aW9uKCl7IHJldHVybiAobmV3IERhdGUoKSkuZ2V0VGltZSgpIH07XG5cbi8vIGdlbmVyYXRlIHRpbWVzdGFtcCBvciBkZWx0YVxuLy8gc2VlIGh0dHA6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc19wcm9jZXNzX2hydGltZVxuZnVuY3Rpb24gaHJ0aW1lKHByZXZpb3VzVGltZXN0YW1wKXtcbiAgdmFyIGNsb2NrdGltZSA9IHBlcmZvcm1hbmNlTm93LmNhbGwocGVyZm9ybWFuY2UpKjFlLTM7XG4gIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihjbG9ja3RpbWUpO1xuICB2YXIgbmFub3NlY29uZHMgPSBNYXRoLmZsb29yKChjbG9ja3RpbWUlMSkqMWU5KTtcbiAgaWYgKHByZXZpb3VzVGltZXN0YW1wKSB7XG4gICAgc2Vjb25kcyA9IHNlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFswXTtcbiAgICBuYW5vc2Vjb25kcyA9IG5hbm9zZWNvbmRzIC0gcHJldmlvdXNUaW1lc3RhbXBbMV07XG4gICAgaWYgKG5hbm9zZWNvbmRzPDApIHtcbiAgICAgIHNlY29uZHMtLTtcbiAgICAgIG5hbm9zZWNvbmRzICs9IDFlOTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtzZWNvbmRzLG5hbm9zZWNvbmRzXVxufVxuXG52YXIgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbmZ1bmN0aW9uIHVwdGltZSgpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKTtcbiAgdmFyIGRpZiA9IGN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lO1xuICByZXR1cm4gZGlmIC8gMTAwMDtcbn1cblxudmFyIGJyb3dzZXIkMSA9IHtcbiAgbmV4dFRpY2s6IG5leHRUaWNrLFxuICB0aXRsZTogdGl0bGUsXG4gIGJyb3dzZXI6IGJyb3dzZXIsXG4gIGVudjogZW52LFxuICBhcmd2OiBhcmd2LFxuICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICB2ZXJzaW9uczogdmVyc2lvbnMsXG4gIG9uOiBvbixcbiAgYWRkTGlzdGVuZXI6IGFkZExpc3RlbmVyLFxuICBvbmNlOiBvbmNlLFxuICBvZmY6IG9mZixcbiAgcmVtb3ZlTGlzdGVuZXI6IHJlbW92ZUxpc3RlbmVyLFxuICByZW1vdmVBbGxMaXN0ZW5lcnM6IHJlbW92ZUFsbExpc3RlbmVycyxcbiAgZW1pdDogZW1pdCxcbiAgYmluZGluZzogYmluZGluZyQxLFxuICBjd2Q6IGN3ZCxcbiAgY2hkaXI6IGNoZGlyLFxuICB1bWFzazogdW1hc2ssXG4gIGhydGltZTogaHJ0aW1lLFxuICBwbGF0Zm9ybTogcGxhdGZvcm0sXG4gIHJlbGVhc2U6IHJlbGVhc2UsXG4gIGNvbmZpZzogY29uZmlnLFxuICB1cHRpbWU6IHVwdGltZVxufTtcblxuZnVuY3Rpb24gY29tbW9uanNSZXF1aXJlKHBhdGgpIHtcblx0dGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZHluYW1pY2FsbHkgcmVxdWlyZSBcIicgKyBwYXRoICsgJ1wiLiBQbGVhc2UgY29uZmlndXJlIHRoZSBkeW5hbWljUmVxdWlyZVRhcmdldHMgb3IvYW5kIGlnbm9yZUR5bmFtaWNSZXF1aXJlcyBvcHRpb24gb2YgQHJvbGx1cC9wbHVnaW4tY29tbW9uanMgYXBwcm9wcmlhdGVseSBmb3IgdGhpcyByZXF1aXJlIGNhbGwgdG8gd29yay4nKTtcbn1cblxudmFyIHBkZiQyID0ge2V4cG9ydHM6IHt9fTtcblxudmFyIF9wb2x5ZmlsbE5vZGVfZnMgPSB7fTtcblxudmFyIF9wb2x5ZmlsbE5vZGVfZnMkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRkZWZhdWx0OiBfcG9seWZpbGxOb2RlX2ZzXG59KTtcblxudmFyIHJlcXVpcmUkJDAgPSAvKkBfX1BVUkVfXyovZ2V0QXVnbWVudGVkTmFtZXNwYWNlKF9wb2x5ZmlsbE5vZGVfZnMkMSk7XG5cbnZhciBfbm9kZVJlc29sdmVfZW1wdHkgPSB7fTtcblxudmFyIF9ub2RlUmVzb2x2ZV9lbXB0eSQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdGRlZmF1bHQ6IF9ub2RlUmVzb2x2ZV9lbXB0eVxufSk7XG5cbnZhciByZXF1aXJlJCQxID0gLypAX19QVVJFX18qL2dldEF1Z21lbnRlZE5hbWVzcGFjZShfbm9kZVJlc29sdmVfZW1wdHkkMSk7XG5cbnZhciBoYXNGZXRjaCA9IGlzRnVuY3Rpb24kMShnbG9iYWwkMS5mZXRjaCkgJiYgaXNGdW5jdGlvbiQxKGdsb2JhbCQxLlJlYWRhYmxlU3RyZWFtKTtcblxudmFyIF9ibG9iQ29uc3RydWN0b3I7XG5mdW5jdGlvbiBibG9iQ29uc3RydWN0b3IoKSB7XG4gIGlmICh0eXBlb2YgX2Jsb2JDb25zdHJ1Y3RvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gX2Jsb2JDb25zdHJ1Y3RvcjtcbiAgfVxuICB0cnkge1xuICAgIG5ldyBnbG9iYWwkMS5CbG9iKFtuZXcgQXJyYXlCdWZmZXIoMSldKTtcbiAgICBfYmxvYkNvbnN0cnVjdG9yID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIF9ibG9iQ29uc3RydWN0b3IgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gX2Jsb2JDb25zdHJ1Y3RvclxufVxudmFyIHhocjtcblxuZnVuY3Rpb24gY2hlY2tUeXBlU3VwcG9ydCh0eXBlKSB7XG4gIGlmICgheGhyKSB7XG4gICAgeGhyID0gbmV3IGdsb2JhbCQxLlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgLy8gSWYgbG9jYXRpb24uaG9zdCBpcyBlbXB0eSwgZS5nLiBpZiB0aGlzIHBhZ2Uvd29ya2VyIHdhcyBsb2FkZWRcbiAgICAvLyBmcm9tIGEgQmxvYiwgdGhlbiB1c2UgZXhhbXBsZS5jb20gdG8gYXZvaWQgYW4gZXJyb3JcbiAgICB4aHIub3BlbignR0VUJywgZ2xvYmFsJDEubG9jYXRpb24uaG9zdCA/ICcvJyA6ICdodHRwczovL2V4YW1wbGUuY29tJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gdHlwZTtcbiAgICByZXR1cm4geGhyLnJlc3BvbnNlVHlwZSA9PT0gdHlwZVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxufVxuXG4vLyBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgU2FmYXJpIDcuMCByZXBvcnRzIHR5cGVvZiBnbG9iYWwuQXJyYXlCdWZmZXIgPT09ICdvYmplY3QnLlxuLy8gU2FmYXJpIDcuMSBhcHBlYXJzIHRvIGhhdmUgZml4ZWQgdGhpcyBidWcuXG52YXIgaGF2ZUFycmF5QnVmZmVyID0gdHlwZW9mIGdsb2JhbCQxLkFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJztcbnZhciBoYXZlU2xpY2UgPSBoYXZlQXJyYXlCdWZmZXIgJiYgaXNGdW5jdGlvbiQxKGdsb2JhbCQxLkFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSk7XG5cbnZhciBhcnJheWJ1ZmZlciA9IGhhdmVBcnJheUJ1ZmZlciAmJiBjaGVja1R5cGVTdXBwb3J0KCdhcnJheWJ1ZmZlcicpO1xuICAvLyBUaGVzZSBuZXh0IHR3byB0ZXN0cyB1bmF2b2lkYWJseSBzaG93IHdhcm5pbmdzIGluIENocm9tZS4gU2luY2UgZmV0Y2ggd2lsbCBhbHdheXNcbiAgLy8gYmUgdXNlZCBpZiBpdCdzIGF2YWlsYWJsZSwganVzdCByZXR1cm4gZmFsc2UgZm9yIHRoZXNlIHRvIGF2b2lkIHRoZSB3YXJuaW5ncy5cbnZhciBtc3N0cmVhbSA9ICFoYXNGZXRjaCAmJiBoYXZlU2xpY2UgJiYgY2hlY2tUeXBlU3VwcG9ydCgnbXMtc3RyZWFtJyk7XG52YXIgbW96Y2h1bmtlZGFycmF5YnVmZmVyID0gIWhhc0ZldGNoICYmIGhhdmVBcnJheUJ1ZmZlciAmJlxuICBjaGVja1R5cGVTdXBwb3J0KCdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcicpO1xudmFyIG92ZXJyaWRlTWltZVR5cGUgPSBpc0Z1bmN0aW9uJDEoeGhyLm92ZXJyaWRlTWltZVR5cGUpO1xudmFyIHZiQXJyYXkgPSBpc0Z1bmN0aW9uJDEoZ2xvYmFsJDEuVkJBcnJheSk7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24kMSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG59XG5cbnhociA9IG51bGw7IC8vIEhlbHAgZ2NcblxudmFyIGluaGVyaXRzO1xuaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKXtcbiAgaW5oZXJpdHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIGluaGVyaXRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge307XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpO1xuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjtcbiAgfTtcbn1cbnZhciBpbmhlcml0cyQxID0gaW5oZXJpdHM7XG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZnVuY3Rpb24gZm9ybWF0JDEoZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5mdW5jdGlvbiBkZXByZWNhdGUoZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsJDEucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChicm93c2VyJDEubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGJyb3dzZXIkMS50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChicm93c2VyJDEudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufVxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZnVuY3Rpb24gZGVidWdsb2coc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IGJyb3dzZXIkMS5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSAwO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGZvcm1hdCQxLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59XG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBfZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkkMSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSQxKHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5JDEodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSA7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkkMShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cbmZ1bmN0aW9uIF9leHRlbmQob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn1cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5JDEob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxudmFyIGRvbWFpbjtcblxuLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIHN0b3JlIGV2ZW50IGhhbmRsZXJzLiBJbnN0YW50aWF0aW5nIHRoaXMgaXNcbi8vIGZhc3RlciB0aGFuIGV4cGxpY2l0bHkgY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgdG8gZ2V0IGEgXCJjbGVhblwiIGVtcHR5XG4vLyBvYmplY3QgKHRlc3RlZCB3aXRoIHY4IHY0LjkpLlxuZnVuY3Rpb24gRXZlbnRIYW5kbGVycygpIHt9XG5FdmVudEhhbmRsZXJzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cblxuLy8gbm9kZWpzIG9kZGl0eVxuLy8gcmVxdWlyZSgnZXZlbnRzJykgPT09IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlclxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnVzaW5nRG9tYWlucyA9IGZhbHNlO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmRvbWFpbiA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kb21haW4gPSBudWxsO1xuICBpZiAoRXZlbnRFbWl0dGVyLnVzaW5nRG9tYWlucykge1xuICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkb21haW4sIHRoZW4gYXR0YWNoIHRvIGl0LlxuICAgIGlmIChkb21haW4uYWN0aXZlICkgO1xuICB9XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJuXCIgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uICRnZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuICRnZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG4vLyBUaGVzZSBzdGFuZGFsb25lIGVtaXQqIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBvcHRpbWl6ZSBjYWxsaW5nIG9mIGV2ZW50XG4vLyBoYW5kbGVycyBmb3IgZmFzdCBjYXNlcyBiZWNhdXNlIGVtaXQoKSBpdHNlbGYgb2Z0ZW4gaGFzIGEgdmFyaWFibGUgbnVtYmVyIG9mXG4vLyBhcmd1bWVudHMgYW5kIGNhbiBiZSBkZW9wdGltaXplZCBiZWNhdXNlIG9mIHRoYXQuIFRoZXNlIGZ1bmN0aW9ucyBhbHdheXMgaGF2ZVxuLy8gdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgdGh1cyBkbyBub3QgZ2V0IGRlb3B0aW1pemVkLCBzbyB0aGUgY29kZVxuLy8gaW5zaWRlIHRoZW0gY2FuIGV4ZWN1dGUgZmFzdGVyLlxuZnVuY3Rpb24gZW1pdE5vbmUoaGFuZGxlciwgaXNGbiwgc2VsZikge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmNhbGwoc2VsZik7XG4gIGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmKTtcbiAgfVxufVxuZnVuY3Rpb24gZW1pdE9uZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEpO1xuICB9XG59XG5mdW5jdGlvbiBlbWl0VHdvKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEsIGFyZzIpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEsIGFyZzIpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSwgYXJnMik7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRUaHJlZShoYW5kbGVyLCBpc0ZuLCBzZWxmLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRNYW55KGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZ3MpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5hcHBseShzZWxmLCBhcmdzKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseShzZWxmLCBhcmdzKTtcbiAgfVxufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGV2ZW50cywgZG9tYWluO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PSBudWxsKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGRvbWFpbiA9IHRoaXMuZG9tYWluO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICBpZiAoZG9tYWluKSB7XG4gICAgICBpZiAoIWVyKVxuICAgICAgICBlciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudCcpO1xuICAgICAgZXIuZG9tYWluRW1pdHRlciA9IHRoaXM7XG4gICAgICBlci5kb21haW4gPSBkb21haW47XG4gICAgICBlci5kb21haW5UaHJvd24gPSBmYWxzZTtcbiAgICAgIGRvbWFpbi5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICB9IGVsc2UgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKCFoYW5kbGVyKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgaXNGbiA9IHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nO1xuICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICBzd2l0Y2ggKGxlbikge1xuICAgIC8vIGZhc3QgY2FzZXNcbiAgICBjYXNlIDE6XG4gICAgICBlbWl0Tm9uZShoYW5kbGVyLCBpc0ZuLCB0aGlzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIGVtaXRPbmUoaGFuZGxlciwgaXNGbiwgdGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIGVtaXRUd28oaGFuZGxlciwgaXNGbiwgdGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgZW1pdFRocmVlKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdLCBhcmd1bWVudHNbM10pO1xuICAgICAgYnJlYWs7XG4gICAgLy8gc2xvd2VyXG4gICAgZGVmYXVsdDpcbiAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspXG4gICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgZW1pdE1hbnkoaGFuZGxlciwgaXNGbiwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmICghZXZlbnRzKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgICAgaWYgKHByZXBlbmQpIHtcbiAgICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIGlmICghZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBtID0gJGdldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgICAgaWYgKG0gJiYgbSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSkge1xuICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyB0eXBlICsgJyBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgICBlbWl0V2FybmluZyh3KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZW1pdFdhcm5pbmcoZSkge1xuICB0eXBlb2YgY29uc29sZS53YXJuID09PSAnZnVuY3Rpb24nID8gY29uc29sZS53YXJuKGUpIDogY29uc29sZS5sb2coZSk7XG59XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBnKCkge1xuICAgIHRhcmdldC5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgcmV0dXJuIGc7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKCFldmVudHMpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKCFsaXN0KVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IChsaXN0Lmxpc3RlbmVyICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbGlzdFswXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgXG4vLyBBbGlhcyBmb3IgcmVtb3ZlTGlzdGVuZXIgYWRkZWQgaW4gTm9kZUpTIDEwLjBcbi8vIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvZXZlbnRzLmh0bWwjZXZlbnRzX2VtaXR0ZXJfb2ZmX2V2ZW50bmFtZV9saXN0ZW5lclxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcil7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHM7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmICghZXZlbnRzKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKCFldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgICAgICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudHNbdHlwZV0pIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBrZXk7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgIC8vIExJRk8gb3JkZXJcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gICAgICAgIH0gd2hpbGUgKGxpc3RlbmVyc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpIHtcbiAgdmFyIGV2bGlzdGVuZXI7XG4gIHZhciByZXQ7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKCFldmVudHMpXG4gICAgcmV0ID0gW107XG4gIGVsc2Uge1xuICAgIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG4gICAgaWYgKCFldmxpc3RlbmVyKVxuICAgICAgcmV0ID0gW107XG4gICAgZWxzZSBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICByZXQgPSBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXTtcbiAgICBlbHNlXG4gICAgICByZXQgPSB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudCQxLmNhbGwoZW1pdHRlciwgdHlwZSk7XG4gIH1cbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQkMTtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQkMSh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cykge1xuICAgIHZhciBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2UgaWYgKGV2bGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgcmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50ID4gMCA/IFJlZmxlY3Qub3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG4vLyBBYm91dCAxLjV4IGZhc3RlciB0aGFuIHRoZSB0d28tYXJnIHZlcnNpb24gb2YgQXJyYXkjc3BsaWNlKCkuXG5mdW5jdGlvbiBzcGxpY2VPbmUobGlzdCwgaW5kZXgpIHtcbiAgZm9yICh2YXIgaSA9IGluZGV4LCBrID0gaSArIDEsIG4gPSBsaXN0Lmxlbmd0aDsgayA8IG47IGkgKz0gMSwgayArPSAxKVxuICAgIGxpc3RbaV0gPSBsaXN0W2tdO1xuICBsaXN0LnBvcCgpO1xufVxuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgaSkge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSlcbiAgICBjb3B5W2ldID0gYXJyW2ldO1xuICByZXR1cm4gY29weTtcbn1cblxuZnVuY3Rpb24gdW53cmFwTGlzdGVuZXJzKGFycikge1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJldC5sZW5ndGg7ICsraSkge1xuICAgIHJldFtpXSA9IGFycltpXS5saXN0ZW5lciB8fCBhcnJbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgdGhpcy5oZWFkID0gbnVsbDtcbiAgdGhpcy50YWlsID0gbnVsbDtcbiAgdGhpcy5sZW5ndGggPSAwO1xufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiBudWxsIH07XG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgdGhpcy50YWlsID0gZW50cnk7XG4gICsrdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiB0aGlzLmhlYWQgfTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgdGhpcy5oZWFkID0gZW50cnk7XG4gICsrdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO2Vsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQ7XG4gIC0tdGhpcy5sZW5ndGg7XG4gIHJldHVybiByZXQ7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgdGhpcy5sZW5ndGggPSAwO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChzKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHJldCArPSBzICsgcC5kYXRhO1xuICB9cmV0dXJuIHJldDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy5oZWFkLmRhdGE7XG4gIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gIHZhciBwID0gdGhpcy5oZWFkO1xuICB2YXIgaSA9IDA7XG4gIHdoaWxlIChwKSB7XG4gICAgcC5kYXRhLmNvcHkocmV0LCBpKTtcbiAgICBpICs9IHAuZGF0YS5sZW5ndGg7XG4gICAgcCA9IHAubmV4dDtcbiAgfVxuICByZXR1cm4gcmV0O1xufTtcblxuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBpc0J1ZmZlckVuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmdcbiAgfHwgZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAgICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgIGNhc2UgJ2hleCc6IGNhc2UgJ3V0ZjgnOiBjYXNlICd1dGYtOCc6IGNhc2UgJ2FzY2lpJzogY2FzZSAnYmluYXJ5JzogY2FzZSAnYmFzZTY0JzogY2FzZSAndWNzMic6IGNhc2UgJ3Vjcy0yJzogY2FzZSAndXRmMTZsZSc6IGNhc2UgJ3V0Zi0xNmxlJzogY2FzZSAncmF3JzogcmV0dXJuIHRydWU7XG4gICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgICB9O1xuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxuZnVuY3Rpb24gU3RyaW5nRGVjb2RlcihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn1cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIGRlYnVnID0gZGVidWdsb2coJ3N0cmVhbScpO1xuaW5oZXJpdHMkMShSZWFkYWJsZSwgRXZlbnRFbWl0dGVyKTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lcihldmVudCwgZm4pO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgICAvLyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgTm9kZS5qcyB0aGF0IGRvIG5vdCBpbmNsdWRlXG4gICAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICAgIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKVxuICAgICAgZW1pdHRlci5vbihldmVudCwgZm4pO1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkpXG4gICAgICBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO1xuICAgIGVsc2VcbiAgICAgIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xuICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5lckNvdW50IChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgLy8gQSBsaW5rZWQgbGlzdCBpcyB1c2VkIHRvIHN0b3JlIGRhdGEgY2h1bmtzIGluc3RlYWQgb2YgYW4gYXJyYXkgYmVjYXVzZSB0aGVcbiAgLy8gbGlua2VkIGxpc3QgY2FuIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBiZWdpbm5pbmcgZmFzdGVyIHRoYW5cbiAgLy8gYXJyYXkuc2hpZnQoKVxuICB0aGlzLmJ1ZmZlciA9IG5ldyBCdWZmZXJMaXN0KCk7XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgdGhpcy5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gIH1cbn1cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcblxuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbn1cblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGVuY29kaW5nIHx8IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcbiAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgX2UgPSBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50Jyk7XG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBfZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBza2lwQWRkO1xuICAgICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIWFkZFRvRnJvbnQgJiYgIWVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gc3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgICAgIHNraXBBZGQgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBjaHVuay5sZW5ndGggPT09IDA7XG4gICAgICB9XG5cbiAgICAgIGlmICghYWRkVG9Gcm9udCkgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuXG4gICAgICAvLyBEb24ndCBhZGQgdG8gdGhlIGJ1ZmZlciBpZiB3ZSd2ZSBkZWNvZGVkIHRvIGFuIGVtcHR5IHN0cmluZyBjaHVuayBhbmRcbiAgICAgIC8vIHdlJ3JlIG5vdCBpbiBvYmplY3QgbW9kZVxuICAgICAgaWYgKCFza2lwQWRkKSB7XG4gICAgICAgIC8vIGlmIHdlIHdhbnQgdGhlIGRhdGEgbm93LCBqdXN0IGVtaXQgaXQuXG4gICAgICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuc3luYykge1xuICAgICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICAgIHN0cmVhbS5yZWFkKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgYnVmZmVyIGluZm8uXG4gICAgICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgICAgICAgIGlmIChhZGRUb0Zyb250KSBzdGF0ZS5idWZmZXIudW5zaGlmdChjaHVuayk7ZWxzZSBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG5cbiAgICAgICAgICBpZiAoc3RhdGUubmVlZFJlYWRhYmxlKSBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghYWRkVG9Gcm9udCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBuZWVkTW9yZURhdGEoc3RhdGUpO1xufVxuXG4vLyBpZiBpdCdzIHBhc3QgdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2UgY2FuIHB1c2ggaW4gc29tZSBtb3JlLlxuLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWVcbi8vIG1vcmUgYnl0ZXMuICBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGNhc2VzIHdoZXJlIGh3bT0wLFxuLy8gc3VjaCBhcyB0aGUgcmVwbC4gIEFsc28sIGlmIHRoZSBwdXNoKCkgdHJpZ2dlcmVkIGFcbi8vIHJlYWRhYmxlIGV2ZW50LCBhbmQgdGhlIHVzZXIgY2FsbGVkIHJlYWQobGFyZ2VOdW1iZXIpIHN1Y2ggdGhhdFxuLy8gbmVlZFJlYWRhYmxlIHdhcyBzZXQsIHRoZW4gd2Ugb3VnaHQgdG8gcHVzaCBtb3JlLCBzbyB0aGF0IGFub3RoZXJcbi8vICdyZWFkYWJsZScgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5mdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpIHtcbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubmVlZFJlYWRhYmxlIHx8IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUubGVuZ3RoID09PSAwKTtcbn1cblxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG5SZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbiAoZW5jKSB7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKGVuYyk7XG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gRG9uJ3QgcmFpc2UgdGhlIGh3bSA+IDhNQlxudmFyIE1BWF9IV00gPSAweDgwMDAwMDtcbmZ1bmN0aW9uIGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pIHtcbiAgaWYgKG4gPj0gTUFYX0hXTSkge1xuICAgIG4gPSBNQVhfSFdNO1xuICB9IGVsc2Uge1xuICAgIC8vIEdldCB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIgdG8gcHJldmVudCBpbmNyZWFzaW5nIGh3bSBleGNlc3NpdmVseSBpblxuICAgIC8vIHRpbnkgYW1vdW50c1xuICAgIG4tLTtcbiAgICBuIHw9IG4gPj4+IDE7XG4gICAgbiB8PSBuID4+PiAyO1xuICAgIG4gfD0gbiA+Pj4gNDtcbiAgICBuIHw9IG4gPj4+IDg7XG4gICAgbiB8PSBuID4+PiAxNjtcbiAgICBuKys7XG4gIH1cbiAgcmV0dXJuIG47XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAobiA8PSAwIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgcmV0dXJuIDA7XG4gIGlmIChzdGF0ZS5vYmplY3RNb2RlKSByZXR1cm4gMTtcbiAgaWYgKG4gIT09IG4pIHtcbiAgICAvLyBPbmx5IGZsb3cgb25lIGJ1ZmZlciBhdCBhIHRpbWVcbiAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDtlbHNlIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgLy8gSWYgd2UncmUgYXNraW5nIGZvciBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgaHdtLCB0aGVuIHJhaXNlIHRoZSBod20uXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO1xuICBpZiAobiA8PSBzdGF0ZS5sZW5ndGgpIHJldHVybiBuO1xuICAvLyBEb24ndCBoYXZlIGVub3VnaFxuICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gc3RhdGUubGVuZ3RoO1xufVxuXG4vLyB5b3UgY2FuIG92ZXJyaWRlIGVpdGhlciB0aGlzIG1ldGhvZCwgb3IgdGhlIGFzeW5jIF9yZWFkKG4pIGJlbG93LlxuUmVhZGFibGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAobikge1xuICBkZWJ1ZygncmVhZCcsIG4pO1xuICBuID0gcGFyc2VJbnQobiwgMTApO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgbk9yaWcgPSBuO1xuXG4gIGlmIChuICE9PSAwKSBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcblxuICAvLyBpZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG4gIGlmIChuID09PSAwICYmIHN0YXRlLm5lZWRSZWFkYWJsZSAmJiAoc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgfHwgc3RhdGUuZW5kZWQpKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpO1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO2Vsc2UgZW1pdFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbiA9IGhvd011Y2hUb1JlYWQobiwgc3RhdGUpO1xuXG4gIC8vIGlmIHdlJ3ZlIGVuZGVkLCBhbmQgd2UncmUgbm93IGNsZWFyLCB0aGVuIGZpbmlzaCBpdCB1cC5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUuZW5kZWQpIHtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICB2YXIgZG9SZWFkID0gc3RhdGUubmVlZFJlYWRhYmxlO1xuICBkZWJ1ZygnbmVlZCByZWFkYWJsZScsIGRvUmVhZCk7XG5cbiAgLy8gaWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgfHwgc3RhdGUubGVuZ3RoIC0gbiA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkb1JlYWQgPSB0cnVlO1xuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZCk7XG4gIH1cblxuICAvLyBob3dldmVyLCBpZiB3ZSd2ZSBlbmRlZCwgdGhlbiB0aGVyZSdzIG5vIHBvaW50LCBhbmQgaWYgd2UncmUgYWxyZWFkeVxuICAvLyByZWFkaW5nLCB0aGVuIGl0J3MgdW5uZWNlc3NhcnkuXG4gIGlmIChzdGF0ZS5lbmRlZCB8fCBzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZG9SZWFkID0gZmFsc2U7XG4gICAgZGVidWcoJ3JlYWRpbmcgb3IgZW5kZWQnLCBkb1JlYWQpO1xuICB9IGVsc2UgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJyk7XG4gICAgc3RhdGUucmVhZGluZyA9IHRydWU7XG4gICAgc3RhdGUuc3luYyA9IHRydWU7XG4gICAgLy8gaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIC8vIGNhbGwgaW50ZXJuYWwgcmVhZCBtZXRob2RcbiAgICB0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspO1xuICAgIHN0YXRlLnN5bmMgPSBmYWxzZTtcbiAgICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG4gIH1cblxuICB2YXIgcmV0O1xuICBpZiAobiA+IDApIHJldCA9IGZyb21MaXN0KG4sIHN0YXRlKTtlbHNlIHJldCA9IG51bGw7XG5cbiAgaWYgKHJldCA9PT0gbnVsbCkge1xuICAgIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgbiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgc3RhdGUubGVuZ3RoIC09IG47XG4gIH1cblxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gICAgLy8gYXMgc29vbiBhcyB3ZSAqZG8qIGdldCBzb21ldGhpbmcgaW50byB0aGUgYnVmZmVyLlxuICAgIGlmICghc3RhdGUuZW5kZWQpIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgICAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG4gICAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtcbiAgfVxuXG4gIGlmIChyZXQgIT09IG51bGwpIHRoaXMuZW1pdCgnZGF0YScsIHJldCk7XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyID0gbnVsbDtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBuZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgbmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO2Vsc2UgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKTtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIG5leHRUaWNrKGVuZEZuKTtlbHNlIHNyYy5vbmNlKCdlbmQnLCBlbmRGbik7XG5cbiAgZGVzdC5vbigndW5waXBlJywgb251bnBpcGUpO1xuICBmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSkge1xuICAgIGRlYnVnKCdvbnVucGlwZScpO1xuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBjbGVhbnVwKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuXG4gICAgY2xlYW5lZFVwID0gdHJ1ZTtcblxuICAgIC8vIGlmIHRoZSByZWFkZXIgaXMgd2FpdGluZyBmb3IgYSBkcmFpbiBldmVudCBmcm9tIHRoaXNcbiAgICAvLyBzcGVjaWZpYyB3cml0ZXIsIHRoZW4gaXQgd291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgc3RhcnRcbiAgICAvLyBmbG93aW5nIGFnYWluLlxuICAgIC8vIFNvLCBpZiB0aGlzIGlzIGF3YWl0aW5nIGEgZHJhaW4sIHRoZW4gd2UganVzdCBjYWxsIGl0IG5vdy5cbiAgICAvLyBJZiB3ZSBkb24ndCBrbm93LCB0aGVuIGFzc3VtZSB0aGF0IHdlIGFyZSB3YWl0aW5nIGZvciBvbmUuXG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gJiYgKCFkZXN0Ll93cml0YWJsZVN0YXRlIHx8IGRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSkgb25kcmFpbigpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHVzZXIgcHVzaGVzIG1vcmUgZGF0YSB3aGlsZSB3ZSdyZSB3cml0aW5nIHRvIGRlc3QgdGhlbiB3ZSdsbCBlbmQgdXBcbiAgLy8gaW4gb25kYXRhIGFnYWluLiBIb3dldmVyLCB3ZSBvbmx5IHdhbnQgdG8gaW5jcmVhc2UgYXdhaXREcmFpbiBvbmNlIGJlY2F1c2VcbiAgLy8gZGVzdCB3aWxsIG9ubHkgZW1pdCBvbmUgJ2RyYWluJyBldmVudCBmb3IgdGhlIG11bHRpcGxlIHdyaXRlcy5cbiAgLy8gPT4gSW50cm9kdWNlIGEgZ3VhcmQgb24gaW5jcmVhc2luZyBhd2FpdERyYWluLlxuICB2YXIgaW5jcmVhc2VkQXdhaXREcmFpbiA9IGZhbHNlO1xuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpO1xuICBmdW5jdGlvbiBvbmRhdGEoY2h1bmspIHtcbiAgICBkZWJ1Zygnb25kYXRhJyk7XG4gICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IGZhbHNlO1xuICAgIHZhciByZXQgPSBkZXN0LndyaXRlKGNodW5rKTtcbiAgICBpZiAoZmFsc2UgPT09IHJldCAmJiAhaW5jcmVhc2VkQXdhaXREcmFpbikge1xuICAgICAgLy8gSWYgdGhlIHVzZXIgdW5waXBlZCBkdXJpbmcgYGRlc3Qud3JpdGUoKWAsIGl0IGlzIHBvc3NpYmxlXG4gICAgICAvLyB0byBnZXQgc3R1Y2sgaW4gYSBwZXJtYW5lbnRseSBwYXVzZWQgc3RhdGUgaWYgdGhhdCB3cml0ZVxuICAgICAgLy8gYWxzbyByZXR1cm5lZCBmYWxzZS5cbiAgICAgIC8vID0+IENoZWNrIHdoZXRoZXIgYGRlc3RgIGlzIHN0aWxsIGEgcGlwaW5nIGRlc3RpbmF0aW9uLlxuICAgICAgaWYgKChzdGF0ZS5waXBlc0NvdW50ID09PSAxICYmIHN0YXRlLnBpcGVzID09PSBkZXN0IHx8IHN0YXRlLnBpcGVzQ291bnQgPiAxICYmIGluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpICE9PSAtMSkgJiYgIWNsZWFuZWRVcCkge1xuICAgICAgICBkZWJ1ZygnZmFsc2Ugd3JpdGUgcmVzcG9uc2UsIHBhdXNlJywgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4pO1xuICAgICAgICBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbisrO1xuICAgICAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSB1c2VybGFuZCBvbmVzLlxuICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIHNyYy5saXN0ZW5lcnMoJ2RhdGEnKS5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgZGVzdHNbX2ldLmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIH1yZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHRyeSB0byBmaW5kIHRoZSByaWdodCBvbmUuXG4gIHZhciBpID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGksIDEpO1xuICBzdGF0ZS5waXBlc0NvdW50IC09IDE7XG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSBzdGF0ZS5waXBlcyA9IHN0YXRlLnBpcGVzWzBdO1xuXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgdXAgZGF0YSBldmVudHMgaWYgdGhleSBhcmUgYXNrZWQgZm9yXG4vLyBFbnN1cmUgcmVhZGFibGUgbGlzdGVuZXJzIGV2ZW50dWFsbHkgZ2V0IHNvbWV0aGluZ1xuUmVhZGFibGUucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKGV2LCBmbikge1xuICB2YXIgcmVzID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsIGV2LCBmbik7XG5cbiAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAvLyBTdGFydCBmbG93aW5nIG9uIG5leHQgdGljayBpZiBzdHJlYW0gaXNuJ3QgZXhwbGljaXRseSBwYXVzZWRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nICE9PSBmYWxzZSkgdGhpcy5yZXN1bWUoKTtcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmICFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgICAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgbmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiByZXN1bWUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlc3VtZVNjaGVkdWxlZCkge1xuICAgIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgbmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWRcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhO2Vsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpO1xuICAgIHN0YXRlLmJ1ZmZlci5jbGVhcigpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQgcGFydCBvZiBsaXN0XG4gICAgcmV0ID0gZnJvbUxpc3RQYXJ0aWFsKG4sIHN0YXRlLmJ1ZmZlciwgc3RhdGUuZGVjb2Rlcik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBFeHRyYWN0cyBvbmx5IGVub3VnaCBidWZmZXJlZCBkYXRhIHRvIHNhdGlzZnkgdGhlIGFtb3VudCByZXF1ZXN0ZWQuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0UGFydGlhbChuLCBsaXN0LCBoYXNTdHJpbmdzKSB7XG4gIHZhciByZXQ7XG4gIGlmIChuIDwgbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3NcbiAgICByZXQgPSBsaXN0LmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICBsaXN0LmhlYWQuZGF0YSA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKG4pO1xuICB9IGVsc2UgaWYgKG4gPT09IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIGZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXJcbiAgICByZXQgPSBoYXNTdHJpbmdzID8gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkgOiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhXG4vLyBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIHtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgdmFyIHJldCA9IHAuZGF0YTtcbiAgbiAtPSByZXQubGVuZ3RoO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBzdHIgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHJldCArPSBzdHI7ZWxzZSByZXQgKz0gc3RyLnNsaWNlKDAsIG4pO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YSBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpIHtcbiAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKTtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgcC5kYXRhLmNvcHkocmV0KTtcbiAgbiAtPSBwLmRhdGEubGVuZ3RoO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBidWYgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IGJ1Zi5sZW5ndGggPyBidWYubGVuZ3RoIDogbjtcbiAgICBidWYuY29weShyZXQsIHJldC5sZW5ndGggLSBuLCAwLCBuYik7XG4gICAgbiAtPSBuYjtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBidWYubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuYik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgKytjO1xuICB9XG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ1wiZW5kUmVhZGFibGUoKVwiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIG5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuaW5oZXJpdHMkMShXcml0YWJsZSwgRXZlbnRFbWl0dGVyKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2J1ZmZlcicsIHtcbiAgICBnZXQ6IGRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicpXG4gIH0pO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gYWxsb2NhdGUgdGhlIGZpcnN0IENvcmtlZFJlcXVlc3QsIHRoZXJlIGlzIGFsd2F5c1xuICAvLyBvbmUgYWxsb2NhdGVkIGFuZCBmcmVlIHRvIHVzZSwgYW5kIHdlIG1haW50YWluIGF0IG1vc3QgdHdvXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVHZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdGhvdWdoIHRoZXkncmUgbm90XG4gIC8vIGluc3RhbmNlb2YgV3JpdGFibGUsIHRoZXkncmUgaW5zdGFuY2VvZiBSZWFkYWJsZS5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdyaXRhYmxlKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSByZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcbiAgfVxuXG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xufVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZScpKTtcbn07XG5cbmZ1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLCBjYikge1xuICB2YXIgZXIgPSBuZXcgRXJyb3IoJ3dyaXRlIGFmdGVyIGVuZCcpO1xuICAvLyBUT0RPOiBkZWZlciBlcnJvciBldmVudHMgY29uc2lzdGVudGx5IGV2ZXJ5d2hlcmUsIG5vdCBqdXN0IHRoZSBjYlxuICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIG5leHRUaWNrKGNiLCBlcik7XG59XG5cbi8vIElmIHdlIGdldCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBidWZmZXIsIHN0cmluZywgbnVsbCwgb3IgdW5kZWZpbmVkLFxuLy8gYW5kIHdlJ3JlIG5vdCBpbiBvYmplY3RNb2RlLCB0aGVuIHRoYXQncyBhbiBlcnJvci5cbi8vIE90aGVyd2lzZSBzdHJlYW0gY2h1bmtzIGFyZSBhbGwgY29uc2lkZXJlZCB0byBiZSBvZiBsZW5ndGg9MSwgYW5kIHRoZVxuLy8gd2F0ZXJtYXJrcyBkZXRlcm1pbmUgaG93IG1hbnkgb2JqZWN0cyB0byBrZWVwIGluIHRoZSBidWZmZXIsIHJhdGhlciB0aGFuXG4vLyBob3cgbWFueSBieXRlcyBvciBjaGFyYWN0ZXJzLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGVyID0gZmFsc2U7XG4gIC8vIEFsd2F5cyB0aHJvdyBlcnJvciBpZiBhIG51bGwgaXMgd3JpdHRlblxuICAvLyBpZiB3ZSBhcmUgbm90IGluIG9iamVjdCBtb2RlIHRoZW4gdGhyb3dcbiAgLy8gaWYgaXQgaXMgbm90IGEgYnVmZmVyLCBzdHJpbmcsIG9yIHVuZGVmaW5lZC5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO1xuICB9IGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBuZXh0VGljayhjYiwgZXIpO1xuICAgIHZhbGlkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuICB2YXIgcmV0ID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7ZWxzZSBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZztcblxuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcDtcblxuICBpZiAoc3RhdGUuZW5kZWQpIHdyaXRlQWZ0ZXJFbmQodGhpcywgY2IpO2Vsc2UgaWYgKHZhbGlkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBjYikpIHtcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICByZXQgPSB3cml0ZU9yQnVmZmVyKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBzdGF0ZS5jb3JrZWQrKztcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cbiAgcmV0dXJuIGNodW5rO1xufVxuXG4vLyBpZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICBzdGF0ZS5sZW5ndGggKz0gbGVuO1xuXG4gIHZhciByZXQgPSBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrO1xuICAvLyB3ZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWU7XG5cbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkKSB7XG4gICAgdmFyIGxhc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBuZXcgV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIGxhc3QubmV4dCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ICs9IDE7XG4gIH0gZWxzZSB7XG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgd3JpdGV2LCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgc3RhdGUud3JpdGVsZW4gPSBsZW47XG4gIHN0YXRlLndyaXRlY2IgPSBjYjtcbiAgc3RhdGUud3JpdGluZyA9IHRydWU7XG4gIHN0YXRlLnN5bmMgPSB0cnVlO1xuICBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSk7ZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSk7XG4gIHN0YXRlLnN5bmMgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYikge1xuICAtLXN0YXRlLnBlbmRpbmdjYjtcbiAgaWYgKHN5bmMpIG5leHRUaWNrKGNiLCBlcik7ZWxzZSBjYihlcik7XG5cbiAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgLyo8cmVwbGFjZW1lbnQ+Ki9cbiAgICAgICAgbmV4dFRpY2soYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIC8qPC9yZXBsYWNlbWVudD4qL1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cbi8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG5cbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsbW9zdCBhbHdheXMgYXN5bmMsIGRlZmVyIHRoZXNlIHRvIHNhdmUgYSBiaXQgb2YgdGltZVxuICAgIC8vIGFzIHRoZSBob3QgcGF0aCBlbmRzIHdpdGggZG9Xcml0ZVxuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICAgIGlmIChob2xkZXIubmV4dCkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgICBob2xkZXIubmV4dCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gU2xvdyBjYXNlLCB3cml0ZSBjaHVua3Mgb25lLWJ5LW9uZVxuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNodW5rID0gZW50cnkuY2h1bms7XG4gICAgICB2YXIgZW5jb2RpbmcgPSBlbnRyeS5lbmNvZGluZztcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIH1cblxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9IGVudHJ5O1xuICBzdGF0ZS5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ID0gbnVsbDtcblxuV3JpdGFibGUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2h1bms7XG4gICAgY2h1bmsgPSBudWxsO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkKSB0aGlzLndyaXRlKGNodW5rLCBlbmNvZGluZyk7XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3NcbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZCA9IDE7XG4gICAgdGhpcy51bmNvcmsoKTtcbiAgfVxuXG4gIC8vIGlnbm9yZSB1bm5lY2Vzc2FyeSBlbmQoKSBjYWxscy5cbiAgaWYgKCFzdGF0ZS5lbmRpbmcgJiYgIXN0YXRlLmZpbmlzaGVkKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuXG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkKSB7XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgICAgc3RhdGUuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZWVkO1xufVxuXG5mdW5jdGlvbiBlbmRXcml0YWJsZShzdHJlYW0sIHN0YXRlLCBjYikge1xuICBzdGF0ZS5lbmRpbmcgPSB0cnVlO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgaWYgKGNiKSB7XG4gICAgaWYgKHN0YXRlLmZpbmlzaGVkKSBuZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG5cbiAgdGhpcy5maW5pc2ggPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGVudHJ5ID0gX3RoaXMuZW50cnk7XG4gICAgX3RoaXMuZW50cnkgPSBudWxsO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICBzdGF0ZS5wZW5kaW5nY2ItLTtcbiAgICAgIGNiKGVycik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gX3RoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IF90aGlzO1xuICAgIH1cbiAgfTtcbn1cblxuaW5oZXJpdHMkMShEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBPYmplY3Qua2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG59XG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBuZXh0VGljayhvbkVuZE5ULCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gb25FbmROVChzZWxmKSB7XG4gIHNlbGYuZW5kKCk7XG59XG5cbi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuaW5oZXJpdHMkMShUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtcblxuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKTtcblxuICAvLyB3aGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHZhciBzdHJlYW0gPSB0aGlzO1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICB0aGlzLm9uY2UoJ3ByZWZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaChmdW5jdGlvbiAoZXIpIHtcbiAgICAgIGRvbmUoc3RyZWFtLCBlcik7XG4gICAgfSk7ZWxzZSBkb25lKHN0cmVhbSk7XG4gIH0pO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbn07XG5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHRzID0gdGhpcy5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLndyaXRlY2IgPSBjYjtcbiAgdHMud3JpdGVjaHVuayA9IGNodW5rO1xuICB0cy53cml0ZWVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIGlmICghdHMudHJhbnNmb3JtaW5nKSB7XG4gICAgdmFyIHJzID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAodHMubmVlZFRyYW5zZm9ybSB8fCBycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufTtcblxuLy8gRG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYXJncyBhcmUgaGVyZS5cbi8vIF90cmFuc2Zvcm0gZG9lcyBhbGwgdGhlIHdvcmsuXG4vLyBUaGF0IHdlIGdvdCBoZXJlIG1lYW5zIHRoYXQgdGhlIHJlYWRhYmxlIHNpZGUgd2FudHMgbW9yZSBkYXRhLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh0cy53cml0ZWNodW5rICE9PSBudWxsICYmIHRzLndyaXRlY2IgJiYgIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHRzLnRyYW5zZm9ybWluZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhbnNmb3JtKHRzLndyaXRlY2h1bmssIHRzLndyaXRlZW5jb2RpbmcsIHRzLmFmdGVyVHJhbnNmb3JtKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBtYXJrIHRoYXQgd2UgbmVlZCBhIHRyYW5zZm9ybSwgc28gdGhhdCBhbnkgZGF0YSB0aGF0IGNvbWVzIGluXG4gICAgLy8gd2lsbCBnZXQgcHJvY2Vzc2VkLCBub3cgdGhhdCB3ZSd2ZSBhc2tlZCBmb3IgaXQuXG4gICAgdHMubmVlZFRyYW5zZm9ybSA9IHRydWU7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGRvbmUoc3RyZWFtLCBlcikge1xuICBpZiAoZXIpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh3cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwJyk7XG5cbiAgaWYgKHRzLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufVxuXG5pbmhlcml0cyQxKFBhc3NUaHJvdWdoLCBUcmFuc2Zvcm0pO1xuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07XG5cbmluaGVyaXRzJDEoU3RyZWFtLCBFdmVudEVtaXR0ZXIpO1xuU3RyZWFtLlJlYWRhYmxlID0gUmVhZGFibGU7XG5TdHJlYW0uV3JpdGFibGUgPSBXcml0YWJsZTtcblN0cmVhbS5EdXBsZXggPSBEdXBsZXg7XG5TdHJlYW0uVHJhbnNmb3JtID0gVHJhbnNmb3JtO1xuU3RyZWFtLlBhc3NUaHJvdWdoID0gUGFzc1Rocm91Z2g7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuXG4vLyBvbGQtc3R5bGUgc3RyZWFtcy4gIE5vdGUgdGhhdCB0aGUgcGlwZSBtZXRob2QgKHRoZSBvbmx5IHJlbGV2YW50XG4vLyBwYXJ0IG9mIHRoaXMgY2xhc3MpIGlzIG92ZXJyaWRkZW4gaW4gdGhlIFJlYWRhYmxlIGNsYXNzLlxuXG5mdW5jdGlvbiBTdHJlYW0oKSB7XG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGlmIChkZXN0LndyaXRhYmxlKSB7XG4gICAgICBpZiAoZmFsc2UgPT09IGRlc3Qud3JpdGUoY2h1bmspICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgICBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgaWYgKHNvdXJjZS5yZWFkYWJsZSAmJiBzb3VyY2UucmVzdW1lKSB7XG4gICAgICBzb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2Uub24oJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH1cblxuICB2YXIgZGlkT25FbmQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBkb24ndCBsZWF2ZSBkYW5nbGluZyBwaXBlcyB3aGVuIHRoZXJlIGFyZSBlcnJvcnMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKEV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkIHN0cmVhbSBlcnJvciBpbiBwaXBlLlxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgZGVzdC5vbignZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyByZW1vdmUgYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkLlxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbGVhbnVwKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuICB9XG5cbiAgc291cmNlLm9uKCdlbmQnLCBjbGVhbnVwKTtcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKTtcblxuICAvLyBBbGxvdyBmb3IgdW5peC1saWtlIHVzYWdlOiBBLnBpcGUoQikucGlwZShDKVxuICByZXR1cm4gZGVzdDtcbn07XG5cbnZhciByU3RhdGVzID0ge1xuICBVTlNFTlQ6IDAsXG4gIE9QRU5FRDogMSxcbiAgSEVBREVSU19SRUNFSVZFRDogMixcbiAgTE9BRElORzogMyxcbiAgRE9ORTogNFxufTtcbmZ1bmN0aW9uIEluY29taW5nTWVzc2FnZSh4aHIsIHJlc3BvbnNlLCBtb2RlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgUmVhZGFibGUuY2FsbChzZWxmKTtcblxuICBzZWxmLl9tb2RlID0gbW9kZTtcbiAgc2VsZi5oZWFkZXJzID0ge307XG4gIHNlbGYucmF3SGVhZGVycyA9IFtdO1xuICBzZWxmLnRyYWlsZXJzID0ge307XG4gIHNlbGYucmF3VHJhaWxlcnMgPSBbXTtcblxuICAvLyBGYWtlIHRoZSAnY2xvc2UnIGV2ZW50LCBidXQgb25seSBvbmNlICdlbmQnIGZpcmVzXG4gIHNlbGYub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRoZSBuZXh0VGljayBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgJ3JlcXVlc3QnIG1vZHVsZSBmcm9tIGNhdXNpbmcgYW4gaW5maW5pdGUgbG9vcFxuICAgIGJyb3dzZXIkMS5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZW1pdCgnY2xvc2UnKTtcbiAgICB9KTtcbiAgfSk7XG4gIHZhciByZWFkO1xuICBpZiAobW9kZSA9PT0gJ2ZldGNoJykge1xuICAgIHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZTtcblxuICAgIHNlbGYudXJsID0gcmVzcG9uc2UudXJsO1xuICAgIHNlbGYuc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICBzZWxmLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdGlibGUgdmVyc2lvbiBvZiBmb3IgKDxpdGVtPiBvZiA8aXRlcmFibGU+KTpcbiAgICAgIC8vIGZvciAodmFyIDxpdGVtPixfaSxfaXQgPSA8aXRlcmFibGU+W1N5bWJvbC5pdGVyYXRvcl0oKTsgPGl0ZW0+ID0gKF9pID0gX2l0Lm5leHQoKSkudmFsdWUsIV9pLmRvbmU7KVxuICAgIGZvciAodmFyIGhlYWRlciwgX2ksIF9pdCA9IHJlc3BvbnNlLmhlYWRlcnNbU3ltYm9sLml0ZXJhdG9yXSgpOyBoZWFkZXIgPSAoX2kgPSBfaXQubmV4dCgpKS52YWx1ZSwgIV9pLmRvbmU7KSB7XG4gICAgICBzZWxmLmhlYWRlcnNbaGVhZGVyWzBdLnRvTG93ZXJDYXNlKCldID0gaGVhZGVyWzFdO1xuICAgICAgc2VsZi5yYXdIZWFkZXJzLnB1c2goaGVhZGVyWzBdLCBoZWFkZXJbMV0pO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHRoaXMgZG9lc24ndCByZXNwZWN0IGJhY2twcmVzc3VyZS4gT25jZSBXcml0YWJsZVN0cmVhbSBpcyBhdmFpbGFibGUsIHRoaXMgY2FuIGJlIGZpeGVkXG4gICAgdmFyIHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG5cbiAgICByZWFkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICBpZiAoc2VsZi5fZGVzdHJveWVkKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5wdXNoKG5ldyBCdWZmZXIocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgIHJlYWQoKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmVhZCgpO1xuXG4gIH0gZWxzZSB7XG4gICAgc2VsZi5feGhyID0geGhyO1xuICAgIHNlbGYuX3BvcyA9IDA7XG5cbiAgICBzZWxmLnVybCA9IHhoci5yZXNwb25zZVVSTDtcbiAgICBzZWxmLnN0YXR1c0NvZGUgPSB4aHIuc3RhdHVzO1xuICAgIHNlbGYuc3RhdHVzTWVzc2FnZSA9IHhoci5zdGF0dXNUZXh0O1xuICAgIHZhciBoZWFkZXJzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgdmFyIG1hdGNoZXMgPSBoZWFkZXIubWF0Y2goL14oW146XSspOlxccyooLiopLyk7XG4gICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICB2YXIga2V5ID0gbWF0Y2hlc1sxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgICBpZiAoc2VsZi5oZWFkZXJzW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2VsZi5oZWFkZXJzW2tleV0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5oZWFkZXJzW2tleV0ucHVzaChtYXRjaGVzWzJdKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLmhlYWRlcnNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2VsZi5oZWFkZXJzW2tleV0gKz0gJywgJyArIG1hdGNoZXNbMl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5oZWFkZXJzW2tleV0gPSBtYXRjaGVzWzJdO1xuICAgICAgICB9XG4gICAgICAgIHNlbGYucmF3SGVhZGVycy5wdXNoKG1hdGNoZXNbMV0sIG1hdGNoZXNbMl0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2VsZi5fY2hhcnNldCA9ICd4LXVzZXItZGVmaW5lZCc7XG4gICAgaWYgKCFvdmVycmlkZU1pbWVUeXBlKSB7XG4gICAgICB2YXIgbWltZVR5cGUgPSBzZWxmLnJhd0hlYWRlcnNbJ21pbWUtdHlwZSddO1xuICAgICAgaWYgKG1pbWVUeXBlKSB7XG4gICAgICAgIHZhciBjaGFyc2V0TWF0Y2ggPSBtaW1lVHlwZS5tYXRjaCgvO1xccypjaGFyc2V0PShbXjtdKSg7fCQpLyk7XG4gICAgICAgIGlmIChjaGFyc2V0TWF0Y2gpIHtcbiAgICAgICAgICBzZWxmLl9jaGFyc2V0ID0gY2hhcnNldE1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc2VsZi5fY2hhcnNldClcbiAgICAgICAgc2VsZi5fY2hhcnNldCA9ICd1dGYtOCc7IC8vIGJlc3QgZ3Vlc3NcbiAgICB9XG4gIH1cbn1cblxuaW5oZXJpdHMkMShJbmNvbWluZ01lc3NhZ2UsIFJlYWRhYmxlKTtcblxuSW5jb21pbmdNZXNzYWdlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKCkge307XG5cbkluY29taW5nTWVzc2FnZS5wcm90b3R5cGUuX29uWEhSUHJvZ3Jlc3MgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHZhciB4aHIgPSBzZWxmLl94aHI7XG5cbiAgdmFyIHJlc3BvbnNlID0gbnVsbDtcbiAgc3dpdGNoIChzZWxmLl9tb2RlKSB7XG4gIGNhc2UgJ3RleHQ6dmJhcnJheSc6IC8vIEZvciBJRTlcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuRE9ORSlcbiAgICAgIGJyZWFrXG4gICAgdHJ5IHtcbiAgICAgIC8vIFRoaXMgZmFpbHMgaW4gSUU4XG4gICAgICByZXNwb25zZSA9IG5ldyBnbG9iYWwkMS5WQkFycmF5KHhoci5yZXNwb25zZUJvZHkpLnRvQXJyYXkoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBwYXNzXG4gICAgfVxuICAgIGlmIChyZXNwb25zZSAhPT0gbnVsbCkge1xuICAgICAgc2VsZi5wdXNoKG5ldyBCdWZmZXIocmVzcG9uc2UpKTtcbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIC8vIEZhbGxzIHRocm91Z2ggaW4gSUU4XG4gIGNhc2UgJ3RleHQnOlxuICAgIHRyeSB7IC8vIFRoaXMgd2lsbCBmYWlsIHdoZW4gcmVhZHlTdGF0ZSA9IDMgaW4gSUU5LiBTd2l0Y2ggbW9kZSBhbmQgd2FpdCBmb3IgcmVhZHlTdGF0ZSA9IDRcbiAgICAgIHJlc3BvbnNlID0geGhyLnJlc3BvbnNlVGV4dDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZWxmLl9tb2RlID0gJ3RleHQ6dmJhcnJheSc7XG4gICAgICBicmVha1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2UubGVuZ3RoID4gc2VsZi5fcG9zKSB7XG4gICAgICB2YXIgbmV3RGF0YSA9IHJlc3BvbnNlLnN1YnN0cihzZWxmLl9wb3MpO1xuICAgICAgaWYgKHNlbGYuX2NoYXJzZXQgPT09ICd4LXVzZXItZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCdWZmZXIobmV3RGF0YS5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0RhdGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgYnVmZmVyW2ldID0gbmV3RGF0YS5jaGFyQ29kZUF0KGkpICYgMHhmZjtcblxuICAgICAgICBzZWxmLnB1c2goYnVmZmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYucHVzaChuZXdEYXRhLCBzZWxmLl9jaGFyc2V0KTtcbiAgICAgIH1cbiAgICAgIHNlbGYuX3BvcyA9IHJlc3BvbnNlLmxlbmd0aDtcbiAgICB9XG4gICAgYnJlYWtcbiAgY2FzZSAnYXJyYXlidWZmZXInOlxuICAgIGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gclN0YXRlcy5ET05FIHx8ICF4aHIucmVzcG9uc2UpXG4gICAgICBicmVha1xuICAgIHJlc3BvbnNlID0geGhyLnJlc3BvbnNlO1xuICAgIHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSkpO1xuICAgIGJyZWFrXG4gIGNhc2UgJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJzogLy8gdGFrZSB3aG9sZVxuICAgIHJlc3BvbnNlID0geGhyLnJlc3BvbnNlO1xuICAgIGlmICh4aHIucmVhZHlTdGF0ZSAhPT0gclN0YXRlcy5MT0FESU5HIHx8ICFyZXNwb25zZSlcbiAgICAgIGJyZWFrXG4gICAgc2VsZi5wdXNoKG5ldyBCdWZmZXIobmV3IFVpbnQ4QXJyYXkocmVzcG9uc2UpKSk7XG4gICAgYnJlYWtcbiAgY2FzZSAnbXMtc3RyZWFtJzpcbiAgICByZXNwb25zZSA9IHhoci5yZXNwb25zZTtcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IHJTdGF0ZXMuTE9BRElORylcbiAgICAgIGJyZWFrXG4gICAgdmFyIHJlYWRlciA9IG5ldyBnbG9iYWwkMS5NU1N0cmVhbVJlYWRlcigpO1xuICAgIHJlYWRlci5vbnByb2dyZXNzID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAocmVhZGVyLnJlc3VsdC5ieXRlTGVuZ3RoID4gc2VsZi5fcG9zKSB7XG4gICAgICAgIHNlbGYucHVzaChuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KHJlYWRlci5yZXN1bHQuc2xpY2Uoc2VsZi5fcG9zKSkpKTtcbiAgICAgICAgc2VsZi5fcG9zID0gcmVhZGVyLnJlc3VsdC5ieXRlTGVuZ3RoO1xuICAgICAgfVxuICAgIH07XG4gICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5wdXNoKG51bGwpO1xuICAgIH07XG4gICAgICAvLyByZWFkZXIub25lcnJvciA9ID8/PyAvLyBUT0RPOiB0aGlzXG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHJlc3BvbnNlKTtcbiAgICBicmVha1xuICB9XG5cbiAgLy8gVGhlIG1zLXN0cmVhbSBjYXNlIGhhbmRsZXMgZW5kIHNlcGFyYXRlbHkgaW4gcmVhZGVyLm9ubG9hZCgpXG4gIGlmIChzZWxmLl94aHIucmVhZHlTdGF0ZSA9PT0gclN0YXRlcy5ET05FICYmIHNlbGYuX21vZGUgIT09ICdtcy1zdHJlYW0nKSB7XG4gICAgc2VsZi5wdXNoKG51bGwpO1xuICB9XG59O1xuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qaGllc2V5L3RvLWFycmF5YnVmZmVyL2Jsb2IvNjUwMmQ5ODUwZTcwYmE3OTM1YTdkZjRhZDg2YjM1OGZjMjE2ZjlmMC9pbmRleC5qc1xuXG5mdW5jdGlvbiB0b0FycmF5QnVmZmVyIChidWYpIHtcbiAgLy8gSWYgdGhlIGJ1ZmZlciBpcyBiYWNrZWQgYnkgYSBVaW50OEFycmF5LCBhIGZhc3RlciB2ZXJzaW9uIHdpbGwgd29ya1xuICBpZiAoYnVmIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIC8vIElmIHRoZSBidWZmZXIgaXNuJ3QgYSBzdWJhcnJheSwgcmV0dXJuIHRoZSB1bmRlcmx5aW5nIEFycmF5QnVmZmVyXG4gICAgaWYgKGJ1Zi5ieXRlT2Zmc2V0ID09PSAwICYmIGJ1Zi5ieXRlTGVuZ3RoID09PSBidWYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgIHJldHVybiBidWYuYnVmZmVyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYnVmLmJ1ZmZlci5zbGljZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gZ2V0IGEgcHJvcGVyIGNvcHlcbiAgICAgIHJldHVybiBidWYuYnVmZmVyLnNsaWNlKGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZU9mZnNldCArIGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIH1cbiAgfVxuXG4gIGlmIChpc0J1ZmZlcihidWYpKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2xvdyB2ZXJzaW9uIHRoYXQgd2lsbCB3b3JrIHdpdGggYW55IEJ1ZmZlclxuICAgIC8vIGltcGxlbWVudGF0aW9uIChldmVuIGluIG9sZCBicm93c2VycylcbiAgICB2YXIgYXJyYXlDb3B5ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLmxlbmd0aCk7XG4gICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJyYXlDb3B5W2ldID0gYnVmW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlDb3B5LmJ1ZmZlclxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjaWRlTW9kZShwcmVmZXJCaW5hcnksIHVzZUZldGNoKSB7XG4gIGlmIChoYXNGZXRjaCAmJiB1c2VGZXRjaCkge1xuICAgIHJldHVybiAnZmV0Y2gnXG4gIH0gZWxzZSBpZiAobW96Y2h1bmtlZGFycmF5YnVmZmVyKSB7XG4gICAgcmV0dXJuICdtb3otY2h1bmtlZC1hcnJheWJ1ZmZlcidcbiAgfSBlbHNlIGlmIChtc3N0cmVhbSkge1xuICAgIHJldHVybiAnbXMtc3RyZWFtJ1xuICB9IGVsc2UgaWYgKGFycmF5YnVmZmVyICYmIHByZWZlckJpbmFyeSkge1xuICAgIHJldHVybiAnYXJyYXlidWZmZXInXG4gIH0gZWxzZSBpZiAodmJBcnJheSAmJiBwcmVmZXJCaW5hcnkpIHtcbiAgICByZXR1cm4gJ3RleHQ6dmJhcnJheSdcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJ3RleHQnXG4gIH1cbn1cblxuZnVuY3Rpb24gQ2xpZW50UmVxdWVzdChvcHRzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgV3JpdGFibGUuY2FsbChzZWxmKTtcblxuICBzZWxmLl9vcHRzID0gb3B0cztcbiAgc2VsZi5fYm9keSA9IFtdO1xuICBzZWxmLl9oZWFkZXJzID0ge307XG4gIGlmIChvcHRzLmF1dGgpXG4gICAgc2VsZi5zZXRIZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIG5ldyBCdWZmZXIob3B0cy5hdXRoKS50b1N0cmluZygnYmFzZTY0JykpO1xuICBPYmplY3Qua2V5cyhvcHRzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgIHNlbGYuc2V0SGVhZGVyKG5hbWUsIG9wdHMuaGVhZGVyc1tuYW1lXSk7XG4gIH0pO1xuXG4gIHZhciBwcmVmZXJCaW5hcnk7XG4gIHZhciB1c2VGZXRjaCA9IHRydWU7XG4gIGlmIChvcHRzLm1vZGUgPT09ICdkaXNhYmxlLWZldGNoJykge1xuICAgIC8vIElmIHRoZSB1c2Ugb2YgWEhSIHNob3VsZCBiZSBwcmVmZXJyZWQgYW5kIGluY2x1ZGVzIHByZXNlcnZpbmcgdGhlICdjb250ZW50LXR5cGUnIGhlYWRlclxuICAgIHVzZUZldGNoID0gZmFsc2U7XG4gICAgcHJlZmVyQmluYXJ5ID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChvcHRzLm1vZGUgPT09ICdwcmVmZXItc3RyZWFtaW5nJykge1xuICAgIC8vIElmIHN0cmVhbWluZyBpcyBhIGhpZ2ggcHJpb3JpdHkgYnV0IGJpbmFyeSBjb21wYXRpYmlsaXR5IGFuZFxuICAgIC8vIHRoZSBhY2N1cmFjeSBvZiB0aGUgJ2NvbnRlbnQtdHlwZScgaGVhZGVyIGFyZW4ndFxuICAgIHByZWZlckJpbmFyeSA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKG9wdHMubW9kZSA9PT0gJ2FsbG93LXdyb25nLWNvbnRlbnQtdHlwZScpIHtcbiAgICAvLyBJZiBzdHJlYW1pbmcgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBwcmVzZXJ2aW5nIHRoZSAnY29udGVudC10eXBlJyBoZWFkZXJcbiAgICBwcmVmZXJCaW5hcnkgPSAhb3ZlcnJpZGVNaW1lVHlwZTtcbiAgfSBlbHNlIGlmICghb3B0cy5tb2RlIHx8IG9wdHMubW9kZSA9PT0gJ2RlZmF1bHQnIHx8IG9wdHMubW9kZSA9PT0gJ3ByZWZlci1mYXN0Jykge1xuICAgIC8vIFVzZSBiaW5hcnkgaWYgdGV4dCBzdHJlYW1pbmcgbWF5IGNvcnJ1cHQgZGF0YSBvciB0aGUgY29udGVudC10eXBlIGhlYWRlciwgb3IgZm9yIHNwZWVkXG4gICAgcHJlZmVyQmluYXJ5ID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIG9wdHMubW9kZScpXG4gIH1cbiAgc2VsZi5fbW9kZSA9IGRlY2lkZU1vZGUocHJlZmVyQmluYXJ5LCB1c2VGZXRjaCk7XG5cbiAgc2VsZi5vbignZmluaXNoJywgZnVuY3Rpb24oKSB7XG4gICAgc2VsZi5fb25GaW5pc2goKTtcbiAgfSk7XG59XG5cbmluaGVyaXRzJDEoQ2xpZW50UmVxdWVzdCwgV3JpdGFibGUpO1xuLy8gVGFrZW4gZnJvbSBodHRwOi8vd3d3LnczLm9yZy9UUi9YTUxIdHRwUmVxdWVzdC8jdGhlLXNldHJlcXVlc3RoZWFkZXIlMjglMjktbWV0aG9kXG52YXIgdW5zYWZlSGVhZGVycyA9IFtcbiAgJ2FjY2VwdC1jaGFyc2V0JyxcbiAgJ2FjY2VwdC1lbmNvZGluZycsXG4gICdhY2Nlc3MtY29udHJvbC1yZXF1ZXN0LWhlYWRlcnMnLFxuICAnYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1tZXRob2QnLFxuICAnY29ubmVjdGlvbicsXG4gICdjb250ZW50LWxlbmd0aCcsXG4gICdjb29raWUnLFxuICAnY29va2llMicsXG4gICdkYXRlJyxcbiAgJ2RudCcsXG4gICdleHBlY3QnLFxuICAnaG9zdCcsXG4gICdrZWVwLWFsaXZlJyxcbiAgJ29yaWdpbicsXG4gICdyZWZlcmVyJyxcbiAgJ3RlJyxcbiAgJ3RyYWlsZXInLFxuICAndHJhbnNmZXItZW5jb2RpbmcnLFxuICAndXBncmFkZScsXG4gICd1c2VyLWFnZW50JyxcbiAgJ3ZpYSdcbl07XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXRIZWFkZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gVGhpcyBjaGVjayBpcyBub3QgbmVjZXNzYXJ5LCBidXQgaXQgcHJldmVudHMgd2FybmluZ3MgZnJvbSBicm93c2VycyBhYm91dCBzZXR0aW5nIHVuc2FmZVxuICAgIC8vIGhlYWRlcnMuIFRvIGJlIGhvbmVzdCBJJ20gbm90IGVudGlyZWx5IHN1cmUgaGlkaW5nIHRoZXNlIHdhcm5pbmdzIGlzIGEgZ29vZCB0aGluZywgYnV0XG4gICAgLy8gaHR0cC1icm93c2VyaWZ5IGRpZCBpdCwgc28gSSB3aWxsIHRvby5cbiAgaWYgKHVuc2FmZUhlYWRlcnMuaW5kZXhPZihsb3dlck5hbWUpICE9PSAtMSlcbiAgICByZXR1cm5cblxuICBzZWxmLl9oZWFkZXJzW2xvd2VyTmFtZV0gPSB7XG4gICAgbmFtZTogbmFtZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLmdldEhlYWRlciA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICByZXR1cm4gc2VsZi5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldLnZhbHVlXG59O1xuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5yZW1vdmVIZWFkZXIgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgZGVsZXRlIHNlbGYuX2hlYWRlcnNbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbn07XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl9vbkZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKHNlbGYuX2Rlc3Ryb3llZClcbiAgICByZXR1cm5cbiAgdmFyIG9wdHMgPSBzZWxmLl9vcHRzO1xuXG4gIHZhciBoZWFkZXJzT2JqID0gc2VsZi5faGVhZGVycztcbiAgdmFyIGJvZHk7XG4gIGlmIChvcHRzLm1ldGhvZCA9PT0gJ1BPU1QnIHx8IG9wdHMubWV0aG9kID09PSAnUFVUJyB8fCBvcHRzLm1ldGhvZCA9PT0gJ1BBVENIJykge1xuICAgIGlmIChibG9iQ29uc3RydWN0b3IoKSkge1xuICAgICAgYm9keSA9IG5ldyBnbG9iYWwkMS5CbG9iKHNlbGYuX2JvZHkubWFwKGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gdG9BcnJheUJ1ZmZlcihidWZmZXIpXG4gICAgICB9KSwge1xuICAgICAgICB0eXBlOiAoaGVhZGVyc09ialsnY29udGVudC10eXBlJ10gfHwge30pLnZhbHVlIHx8ICcnXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZ2V0IHV0Zjggc3RyaW5nXG4gICAgICBib2R5ID0gQnVmZmVyLmNvbmNhdChzZWxmLl9ib2R5KS50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzZWxmLl9tb2RlID09PSAnZmV0Y2gnKSB7XG4gICAgdmFyIGhlYWRlcnMgPSBPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5tYXAoZnVuY3Rpb24obmFtZSkge1xuICAgICAgcmV0dXJuIFtoZWFkZXJzT2JqW25hbWVdLm5hbWUsIGhlYWRlcnNPYmpbbmFtZV0udmFsdWVdXG4gICAgfSk7XG5cbiAgICBnbG9iYWwkMS5mZXRjaChzZWxmLl9vcHRzLnVybCwge1xuICAgICAgbWV0aG9kOiBzZWxmLl9vcHRzLm1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBib2R5OiBib2R5LFxuICAgICAgbW9kZTogJ2NvcnMnLFxuICAgICAgY3JlZGVudGlhbHM6IG9wdHMud2l0aENyZWRlbnRpYWxzID8gJ2luY2x1ZGUnIDogJ3NhbWUtb3JpZ2luJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIHNlbGYuX2ZldGNoUmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgIHNlbGYuX2Nvbm5lY3QoKTtcbiAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCByZWFzb24pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZhciB4aHIgPSBzZWxmLl94aHIgPSBuZXcgZ2xvYmFsJDEuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB0cnkge1xuICAgICAgeGhyLm9wZW4oc2VsZi5fb3B0cy5tZXRob2QsIHNlbGYuX29wdHMudXJsLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGJyb3dzZXIkMS5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIENhbid0IHNldCByZXNwb25zZVR5cGUgb24gcmVhbGx5IG9sZCBicm93c2Vyc1xuICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIpXG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gc2VsZi5fbW9kZS5zcGxpdCgnOicpWzBdO1xuXG4gICAgaWYgKCd3aXRoQ3JlZGVudGlhbHMnIGluIHhocilcbiAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSAhIW9wdHMud2l0aENyZWRlbnRpYWxzO1xuXG4gICAgaWYgKHNlbGYuX21vZGUgPT09ICd0ZXh0JyAmJiAnb3ZlcnJpZGVNaW1lVHlwZScgaW4geGhyKVxuICAgICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQnKTtcblxuICAgIE9iamVjdC5rZXlzKGhlYWRlcnNPYmopLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyc09ialtuYW1lXS5uYW1lLCBoZWFkZXJzT2JqW25hbWVdLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIHNlbGYuX3Jlc3BvbnNlID0gbnVsbDtcbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICBzd2l0Y2ggKHhoci5yZWFkeVN0YXRlKSB7XG4gICAgICBjYXNlIHJTdGF0ZXMuTE9BRElORzpcbiAgICAgIGNhc2UgclN0YXRlcy5ET05FOlxuICAgICAgICBzZWxmLl9vblhIUlByb2dyZXNzKCk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfTtcbiAgICAgIC8vIE5lY2Vzc2FyeSBmb3Igc3RyZWFtaW5nIGluIEZpcmVmb3gsIHNpbmNlIHhoci5yZXNwb25zZSBpcyBPTkxZIGRlZmluZWRcbiAgICAgIC8vIGluIG9ucHJvZ3Jlc3MsIG5vdCBpbiBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aCB4aHIucmVhZHlTdGF0ZSA9IDNcbiAgICBpZiAoc2VsZi5fbW9kZSA9PT0gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJykge1xuICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5fb25YSFJQcm9ncmVzcygpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuX2Rlc3Ryb3llZClcbiAgICAgICAgcmV0dXJuXG4gICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdYSFIgZXJyb3InKSk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICB4aHIuc2VuZChib2R5KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGJyb3dzZXIkMS5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICB9KTtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgeGhyLnN0YXR1cyBpcyByZWFkYWJsZSBhbmQgbm9uLXplcm8sIGluZGljYXRpbmcgbm8gZXJyb3IuXG4gKiBFdmVuIHRob3VnaCB0aGUgc3BlYyBzYXlzIGl0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gcmVhZHlTdGF0ZSAzLFxuICogYWNjZXNzaW5nIGl0IHRocm93cyBhbiBleGNlcHRpb24gaW4gSUU4XG4gKi9cbmZ1bmN0aW9uIHN0YXR1c1ZhbGlkKHhocikge1xuICB0cnkge1xuICAgIHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzO1xuICAgIHJldHVybiAoc3RhdHVzICE9PSBudWxsICYmIHN0YXR1cyAhPT0gMClcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl9vblhIUlByb2dyZXNzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBpZiAoIXN0YXR1c1ZhbGlkKHNlbGYuX3hocikgfHwgc2VsZi5fZGVzdHJveWVkKVxuICAgIHJldHVyblxuXG4gIGlmICghc2VsZi5fcmVzcG9uc2UpXG4gICAgc2VsZi5fY29ubmVjdCgpO1xuXG4gIHNlbGYuX3Jlc3BvbnNlLl9vblhIUlByb2dyZXNzKCk7XG59O1xuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fY29ubmVjdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKHNlbGYuX2Rlc3Ryb3llZClcbiAgICByZXR1cm5cblxuICBzZWxmLl9yZXNwb25zZSA9IG5ldyBJbmNvbWluZ01lc3NhZ2Uoc2VsZi5feGhyLCBzZWxmLl9mZXRjaFJlc3BvbnNlLCBzZWxmLl9tb2RlKTtcbiAgc2VsZi5lbWl0KCdyZXNwb25zZScsIHNlbGYuX3Jlc3BvbnNlKTtcbn07XG5cbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuX2JvZHkucHVzaChjaHVuayk7XG4gIGNiKCk7XG59O1xuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5hYm9ydCA9IENsaWVudFJlcXVlc3QucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLl9kZXN0cm95ZWQgPSB0cnVlO1xuICBpZiAoc2VsZi5fcmVzcG9uc2UpXG4gICAgc2VsZi5fcmVzcG9uc2UuX2Rlc3Ryb3llZCA9IHRydWU7XG4gIGlmIChzZWxmLl94aHIpXG4gICAgc2VsZi5feGhyLmFib3J0KCk7XG4gICAgLy8gQ3VycmVudGx5LCB0aGVyZSBpc24ndCBhIHdheSB0byB0cnVseSBhYm9ydCBhIGZldGNoLlxuICAgIC8vIElmIHlvdSBsaWtlIGJpa2VzaGVkZGluZywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzI3XG59O1xuXG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihkYXRhLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGRhdGE7XG4gICAgZGF0YSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIFdyaXRhYmxlLnByb3RvdHlwZS5lbmQuY2FsbChzZWxmLCBkYXRhLCBlbmNvZGluZywgY2IpO1xufTtcblxuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZmx1c2hIZWFkZXJzID0gZnVuY3Rpb24oKSB7fTtcbkNsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHt9O1xuQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0Tm9EZWxheSA9IGZ1bmN0aW9uKCkge307XG5DbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5zZXRTb2NrZXRLZWVwQWxpdmUgPSBmdW5jdGlvbigpIHt9O1xuXG4vKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuXG5cbi8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cbnZhciBtYXhJbnQgPSAyMTQ3NDgzNjQ3OyAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cbi8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cbnZhciBiYXNlID0gMzY7XG52YXIgdE1pbiA9IDE7XG52YXIgdE1heCA9IDI2O1xudmFyIHNrZXcgPSAzODtcbnZhciBkYW1wID0gNzAwO1xudmFyIGluaXRpYWxCaWFzID0gNzI7XG52YXIgaW5pdGlhbE4gPSAxMjg7IC8vIDB4ODBcbnZhciBkZWxpbWl0ZXIgPSAnLSc7IC8vICdcXHgyRCdcbnZhciByZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLzsgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcbnZhciByZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nOyAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cbi8qKiBFcnJvciBtZXNzYWdlcyAqL1xudmFyIGVycm9ycyA9IHtcbiAgJ292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcbiAgJ25vdC1iYXNpYyc6ICdJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpJyxcbiAgJ2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcbn07XG5cbi8qKiBDb252ZW5pZW5jZSBzaG9ydGN1dHMgKi9cbnZhciBiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW47XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBlcnJvciB1dGlsaXR5IGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuICogQHJldHVybnMge0Vycm9yfSBUaHJvd3MgYSBgUmFuZ2VFcnJvcmAgd2l0aCB0aGUgYXBwbGljYWJsZSBlcnJvciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBlcnJvcih0eXBlKSB7XG4gIHRocm93IG5ldyBSYW5nZUVycm9yKGVycm9yc1t0eXBlXSk7XG59XG5cbi8qKlxuICogQSBnZW5lcmljIGBBcnJheSNtYXBgIHV0aWxpdHkgZnVuY3Rpb24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeSBhcnJheVxuICogaXRlbS5cbiAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwJDEoYXJyYXksIGZuKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgcmVzdWx0W2xlbmd0aF0gPSBmbihhcnJheVtsZW5ndGhdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEEgc2ltcGxlIGBBcnJheSNtYXBgLWxpa2Ugd3JhcHBlciB0byB3b3JrIHdpdGggZG9tYWluIG5hbWUgc3RyaW5ncyBvciBlbWFpbFxuICogYWRkcmVzc2VzLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcbiAqIGNoYXJhY3Rlci5cbiAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwRG9tYWluKHN0cmluZywgZm4pIHtcbiAgdmFyIHBhcnRzID0gc3RyaW5nLnNwbGl0KCdAJyk7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBJbiBlbWFpbCBhZGRyZXNzZXMsIG9ubHkgdGhlIGRvbWFpbiBuYW1lIHNob3VsZCBiZSBwdW55Y29kZWQuIExlYXZlXG4gICAgLy8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cbiAgICByZXN1bHQgPSBwYXJ0c1swXSArICdAJztcbiAgICBzdHJpbmcgPSBwYXJ0c1sxXTtcbiAgfVxuICAvLyBBdm9pZCBgc3BsaXQocmVnZXgpYCBmb3IgSUU4IGNvbXBhdGliaWxpdHkuIFNlZSAjMTcuXG4gIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xceDJFJyk7XG4gIHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcbiAgdmFyIGVuY29kZWQgPSBtYXAkMShsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG4gIHJldHVybiByZXN1bHQgKyBlbmNvZGVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcbiAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG4gKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcbiAqIG1hdGNoaW5nIFVURi0xNi5cbiAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG4gKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuICogQG5hbWUgZGVjb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxuICogQHJldHVybnMge0FycmF5fSBUaGUgbmV3IGFycmF5IG9mIGNvZGUgcG9pbnRzLlxuICovXG5mdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuICB2YXIgb3V0cHV0ID0gW10sXG4gICAgY291bnRlciA9IDAsXG4gICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcbiAgICB2YWx1ZSxcbiAgICBleHRyYTtcbiAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG4gICAgaWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuICAgICAgLy8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG4gICAgICBleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG4gICAgICBpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gbG93IHN1cnJvZ2F0ZVxuICAgICAgICBvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlIG5leHRcbiAgICAgICAgLy8gY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICAgIG91dHB1dC5wdXNoKHZhbHVlKTtcbiAgICAgICAgY291bnRlci0tO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LlxuICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IGRpZ2l0IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG4gKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGlzIGBkaWdpdGAsIHdoaWNoIG5lZWRzIHRvIGJlIGluIHRoZSByYW5nZVxuICogYDBgIHRvIGBiYXNlIC0gMWAuIElmIGBmbGFnYCBpcyBub24temVybywgdGhlIHVwcGVyY2FzZSBmb3JtIGlzXG4gKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuICogaWYgYGZsYWdgIGlzIG5vbi16ZXJvIGFuZCBgZGlnaXRgIGhhcyBubyB1cHBlcmNhc2UgZm9ybS5cbiAqL1xuZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG4gIC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG4gIC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuICByZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xufVxuXG4vKipcbiAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzQ5MiNzZWN0aW9uLTMuNFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRhcHQoZGVsdGEsIG51bVBvaW50cywgZmlyc3RUaW1lKSB7XG4gIHZhciBrID0gMDtcbiAgZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcbiAgZGVsdGEgKz0gZmxvb3IoZGVsdGEgLyBudW1Qb2ludHMpO1xuICBmb3IgKCAvKiBubyBpbml0aWFsaXphdGlvbiAqLyA7IGRlbHRhID4gYmFzZU1pbnVzVE1pbiAqIHRNYXggPj4gMTsgayArPSBiYXNlKSB7XG4gICAgZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuICB9XG4gIHJldHVybiBmbG9vcihrICsgKGJhc2VNaW51c1RNaW4gKyAxKSAqIGRlbHRhIC8gKGRlbHRhICsgc2tldykpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG4gKiBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuICB2YXIgbixcbiAgICBkZWx0YSxcbiAgICBoYW5kbGVkQ1BDb3VudCxcbiAgICBiYXNpY0xlbmd0aCxcbiAgICBiaWFzLFxuICAgIGosXG4gICAgbSxcbiAgICBxLFxuICAgIGssXG4gICAgdCxcbiAgICBjdXJyZW50VmFsdWUsXG4gICAgb3V0cHV0ID0gW10sXG4gICAgLyoqIGBpbnB1dExlbmd0aGAgd2lsbCBob2xkIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgaW4gYGlucHV0YC4gKi9cbiAgICBpbnB1dExlbmd0aCxcbiAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cbiAgICBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsXG4gICAgYmFzZU1pbnVzVCxcbiAgICBxTWludXNUO1xuXG4gIC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcbiAgaW5wdXQgPSB1Y3MyZGVjb2RlKGlucHV0KTtcblxuICAvLyBDYWNoZSB0aGUgbGVuZ3RoXG4gIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlXG4gIG4gPSBpbml0aWFsTjtcbiAgZGVsdGEgPSAwO1xuICBiaWFzID0gaW5pdGlhbEJpYXM7XG5cbiAgLy8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50c1xuICBmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuICAgIGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG4gICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cbiAgLy8gYGhhbmRsZWRDUENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG4gIC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuICAvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcbiAgaWYgKGJhc2ljTGVuZ3RoKSB7XG4gICAgb3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcbiAgfVxuXG4gIC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcbiAgd2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuICAgIC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcbiAgICAvLyBsYXJnZXIgb25lOlxuICAgIGZvciAobSA9IG1heEludCwgaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG4gICAgICBjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG4gICAgICAgIG0gPSBjdXJyZW50VmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuICAgIC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG4gICAgaGFuZGxlZENQQ291bnRQbHVzT25lID0gaGFuZGxlZENQQ291bnQgKyAxO1xuICAgIGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG4gICAgICBlcnJvcignb3ZlcmZsb3cnKTtcbiAgICB9XG5cbiAgICBkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuICAgIG4gPSBtO1xuXG4gICAgZm9yIChqID0gMDsgaiA8IGlucHV0TGVuZ3RoOyArK2opIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXG4gICAgICBpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG4gICAgICAgIGVycm9yKCdvdmVyZmxvdycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudFZhbHVlID09IG4pIHtcbiAgICAgICAgLy8gUmVwcmVzZW50IGRlbHRhIGFzIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXJcbiAgICAgICAgZm9yIChxID0gZGVsdGEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi8gOyBrICs9IGJhc2UpIHtcbiAgICAgICAgICB0ID0gayA8PSBiaWFzID8gdE1pbiA6IChrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzKTtcbiAgICAgICAgICBpZiAocSA8IHQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxTWludXNUID0gcSAtIHQ7XG4gICAgICAgICAgYmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuICAgICAgICAgIG91dHB1dC5wdXNoKFxuICAgICAgICAgICAgc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QsIDApKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcSA9IGZsb29yKHFNaW51c1QgLyBiYXNlTWludXNUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcbiAgICAgICAgYmlhcyA9IGFkYXB0KGRlbHRhLCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUsIGhhbmRsZWRDUENvdW50ID09IGJhc2ljTGVuZ3RoKTtcbiAgICAgICAgZGVsdGEgPSAwO1xuICAgICAgICArK2hhbmRsZWRDUENvdW50O1xuICAgICAgfVxuICAgIH1cblxuICAgICsrZGVsdGE7XG4gICAgKytuO1xuXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3MgdG9cbiAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuICogaS5lLiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQncyBhbHJlYWR5IGluXG4gKiBBU0NJSS5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvIGNvbnZlcnQsIGFzIGFcbiAqIFVuaWNvZGUgc3RyaW5nLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuICogZW1haWwgYWRkcmVzcy5cbiAqL1xuZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuICByZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZykgP1xuICAgICAgJ3huLS0nICsgZW5jb2RlKHN0cmluZykgOlxuICAgICAgc3RyaW5nO1xuICB9KTtcbn1cblxuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuZnVuY3Rpb24gc3RyaW5naWZ5UHJpbWl0aXZlKHYpIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5IChvYmosIHNlcCwgZXEsIG5hbWUpIHtcbiAgc2VwID0gc2VwIHx8ICcmJztcbiAgZXEgPSBlcSB8fCAnPSc7XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICBvYmogPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbWFwKG9iamVjdEtleXMob2JqKSwgZnVuY3Rpb24oaykge1xuICAgICAgdmFyIGtzID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShrKSkgKyBlcTtcbiAgICAgIGlmIChpc0FycmF5KG9ialtrXSkpIHtcbiAgICAgICAgcmV0dXJuIG1hcChvYmpba10sIGZ1bmN0aW9uKHYpIHtcbiAgICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKHYpKTtcbiAgICAgICAgfSkuam9pbihzZXApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmpba10pKTtcbiAgICAgIH1cbiAgICB9KS5qb2luKHNlcCk7XG5cbiAgfVxuXG4gIGlmICghbmFtZSkgcmV0dXJuICcnO1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShuYW1lKSkgKyBlcSArXG4gICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9iaikpO1xufVxuZnVuY3Rpb24gbWFwICh4cywgZikge1xuICBpZiAoeHMubWFwKSByZXR1cm4geHMubWFwKGYpO1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBwYXJzZSQxKHFzLCBzZXAsIGVxLCBvcHRpb25zKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICB2YXIgb2JqID0ge307XG5cbiAgaWYgKHR5cGVvZiBxcyAhPT0gJ3N0cmluZycgfHwgcXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHZhciByZWdleHAgPSAvXFwrL2c7XG4gIHFzID0gcXMuc3BsaXQoc2VwKTtcblxuICB2YXIgbWF4S2V5cyA9IDEwMDA7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm1heEtleXMgPT09ICdudW1iZXInKSB7XG4gICAgbWF4S2V5cyA9IG9wdGlvbnMubWF4S2V5cztcbiAgfVxuXG4gIHZhciBsZW4gPSBxcy5sZW5ndGg7XG4gIC8vIG1heEtleXMgPD0gMCBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbGltaXQga2V5cyBjb3VudFxuICBpZiAobWF4S2V5cyA+IDAgJiYgbGVuID4gbWF4S2V5cykge1xuICAgIGxlbiA9IG1heEtleXM7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHggPSBxc1tpXS5yZXBsYWNlKHJlZ2V4cCwgJyUyMCcpLFxuICAgICAgICBpZHggPSB4LmluZGV4T2YoZXEpLFxuICAgICAgICBrc3RyLCB2c3RyLCBrLCB2O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBrc3RyID0geC5zdWJzdHIoMCwgaWR4KTtcbiAgICAgIHZzdHIgPSB4LnN1YnN0cihpZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3N0ciA9IHg7XG4gICAgICB2c3RyID0gJyc7XG4gICAgfVxuXG4gICAgayA9IGRlY29kZVVSSUNvbXBvbmVudChrc3RyKTtcbiAgICB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KHZzdHIpO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShvYmosIGspKSB7XG4gICAgICBvYmpba10gPSB2O1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICBvYmpba10ucHVzaCh2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tdID0gW29ialtrXSwgdl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLy8gV0hBVFdHIEFQSVxuY29uc3QgVVJMJDEgPSBnbG9iYWwkMS5VUkw7XG5jb25zdCBVUkxTZWFyY2hQYXJhbXMgPSBnbG9iYWwkMS5VUkxTZWFyY2hQYXJhbXM7XG52YXIgX3BvbHlmaWxsTm9kZV91cmwgPSB7XG4gIHBhcnNlOiB1cmxQYXJzZSxcbiAgcmVzb2x2ZTogdXJsUmVzb2x2ZSxcbiAgcmVzb2x2ZU9iamVjdDogdXJsUmVzb2x2ZU9iamVjdCxcbiAgZmlsZVVSTFRvUGF0aDogdXJsRmlsZVVSTFRvUGF0aCxcbiAgZm9ybWF0OiB1cmxGb3JtYXQsXG4gIFVybDogVXJsLFxuXG4gIC8vIFdIQVRXRyBBUElcbiAgVVJMOiBVUkwkMSxcbiAgVVJMU2VhcmNoUGFyYW1zLCAgXG59O1xuZnVuY3Rpb24gVXJsKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbDtcbiAgdGhpcy5zbGFzaGVzID0gbnVsbDtcbiAgdGhpcy5hdXRoID0gbnVsbDtcbiAgdGhpcy5ob3N0ID0gbnVsbDtcbiAgdGhpcy5wb3J0ID0gbnVsbDtcbiAgdGhpcy5ob3N0bmFtZSA9IG51bGw7XG4gIHRoaXMuaGFzaCA9IG51bGw7XG4gIHRoaXMuc2VhcmNoID0gbnVsbDtcbiAgdGhpcy5xdWVyeSA9IG51bGw7XG4gIHRoaXMucGF0aG5hbWUgPSBudWxsO1xuICB0aGlzLnBhdGggPSBudWxsO1xuICB0aGlzLmhyZWYgPSBudWxsO1xufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLy8gZGVmaW5lIHRoZXNlIGhlcmUgc28gYXQgbGVhc3QgdGhleSBvbmx5IGhhdmUgdG8gYmVcbi8vIGNvbXBpbGVkIG9uY2Ugb24gdGhlIGZpcnN0IG1vZHVsZSBsb2FkLlxudmFyIHByb3RvY29sUGF0dGVybiA9IC9eKFthLXowLTkuKy1dKzopL2ksXG4gIHBvcnRQYXR0ZXJuID0gLzpbMC05XSokLyxcblxuICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG4gIHNpbXBsZVBhdGhQYXR0ZXJuID0gL14oXFwvXFwvPyg/IVxcLylbXlxcP1xcc10qKShcXD9bXlxcc10qKT8kLyxcblxuICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyByZXNlcnZlZCBmb3IgZGVsaW1pdGluZyBVUkxzLlxuICAvLyBXZSBhY3R1YWxseSBqdXN0IGF1dG8tZXNjYXBlIHRoZXNlLlxuICBkZWxpbXMgPSBbJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXSxcblxuICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyBub3QgYWxsb3dlZCBmb3IgdmFyaW91cyByZWFzb25zLlxuICB1bndpc2UgPSBbJ3snLCAnfScsICd8JywgJ1xcXFwnLCAnXicsICdgJ10uY29uY2F0KGRlbGltcyksXG5cbiAgLy8gQWxsb3dlZCBieSBSRkNzLCBidXQgY2F1c2Ugb2YgWFNTIGF0dGFja3MuICBBbHdheXMgZXNjYXBlIHRoZXNlLlxuICBhdXRvRXNjYXBlID0gWydcXCcnXS5jb25jYXQodW53aXNlKSxcbiAgLy8gQ2hhcmFjdGVycyB0aGF0IGFyZSBuZXZlciBldmVyIGFsbG93ZWQgaW4gYSBob3N0bmFtZS5cbiAgLy8gTm90ZSB0aGF0IGFueSBpbnZhbGlkIGNoYXJzIGFyZSBhbHNvIGhhbmRsZWQsIGJ1dCB0aGVzZVxuICAvLyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgKmV4cGVjdGVkKiB0byBiZSBzZWVuLCBzbyB3ZSBmYXN0LXBhdGhcbiAgLy8gdGhlbS5cbiAgbm9uSG9zdENoYXJzID0gWyclJywgJy8nLCAnPycsICc7JywgJyMnXS5jb25jYXQoYXV0b0VzY2FwZSksXG4gIGhvc3RFbmRpbmdDaGFycyA9IFsnLycsICc/JywgJyMnXSxcbiAgaG9zdG5hbWVNYXhMZW4gPSAyNTUsXG4gIGhvc3RuYW1lUGFydFBhdHRlcm4gPSAvXlsrYS16MC05QS1aXy1dezAsNjN9JC8sXG4gIGhvc3RuYW1lUGFydFN0YXJ0ID0gL14oWythLXowLTlBLVpfLV17MCw2M30pKC4qKSQvLFxuICAvLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbiAgdW5zYWZlUHJvdG9jb2wgPSB7XG4gICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgfSxcbiAgLy8gcHJvdG9jb2xzIHRoYXQgbmV2ZXIgaGF2ZSBhIGhvc3RuYW1lLlxuICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gIH0sXG4gIC8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuICBzbGFzaGVkUHJvdG9jb2wgPSB7XG4gICAgJ2h0dHAnOiB0cnVlLFxuICAgICdodHRwcyc6IHRydWUsXG4gICAgJ2Z0cCc6IHRydWUsXG4gICAgJ2dvcGhlcic6IHRydWUsXG4gICAgJ2ZpbGUnOiB0cnVlLFxuICAgICdodHRwOic6IHRydWUsXG4gICAgJ2h0dHBzOic6IHRydWUsXG4gICAgJ2Z0cDonOiB0cnVlLFxuICAgICdnb3BoZXI6JzogdHJ1ZSxcbiAgICAnZmlsZTonOiB0cnVlXG4gIH07XG5cbmZ1bmN0aW9uIHVybFBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiBpc09iamVjdCh1cmwpICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybDtcblxuICB2YXIgdSA9IG5ldyBVcmw7XG4gIHUucGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCk7XG4gIHJldHVybiB1O1xufVxuVXJsLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgcmV0dXJuIHBhcnNlKHRoaXMsIHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpO1xufTtcblxuZnVuY3Rpb24gcGFyc2Uoc2VsZiwgdXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAoIWlzU3RyaW5nKHVybCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXJhbWV0ZXIgXFwndXJsXFwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCAnICsgdHlwZW9mIHVybCk7XG4gIH1cblxuICAvLyBDb3B5IGNocm9tZSwgSUUsIG9wZXJhIGJhY2tzbGFzaC1oYW5kbGluZyBiZWhhdmlvci5cbiAgLy8gQmFjayBzbGFzaGVzIGJlZm9yZSB0aGUgcXVlcnkgc3RyaW5nIGdldCBjb252ZXJ0ZWQgdG8gZm9yd2FyZCBzbGFzaGVzXG4gIC8vIFNlZTogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTI1OTE2XG4gIHZhciBxdWVyeUluZGV4ID0gdXJsLmluZGV4T2YoJz8nKSxcbiAgICBzcGxpdHRlciA9XG4gICAgKHF1ZXJ5SW5kZXggIT09IC0xICYmIHF1ZXJ5SW5kZXggPCB1cmwuaW5kZXhPZignIycpKSA/ICc/JyA6ICcjJyxcbiAgICB1U3BsaXQgPSB1cmwuc3BsaXQoc3BsaXR0ZXIpLFxuICAgIHNsYXNoUmVnZXggPSAvXFxcXC9nO1xuICB1U3BsaXRbMF0gPSB1U3BsaXRbMF0ucmVwbGFjZShzbGFzaFJlZ2V4LCAnLycpO1xuICB1cmwgPSB1U3BsaXQuam9pbihzcGxpdHRlcik7XG5cbiAgdmFyIHJlc3QgPSB1cmw7XG5cbiAgLy8gdHJpbSBiZWZvcmUgcHJvY2VlZGluZy5cbiAgLy8gVGhpcyBpcyB0byBzdXBwb3J0IHBhcnNlIHN0dWZmIGxpa2UgXCIgIGh0dHA6Ly9mb28uY29tICBcXG5cIlxuICByZXN0ID0gcmVzdC50cmltKCk7XG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIHZhciBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgICBpZiAoc2ltcGxlUGF0aCkge1xuICAgICAgc2VsZi5wYXRoID0gcmVzdDtcbiAgICAgIHNlbGYuaHJlZiA9IHJlc3Q7XG4gICAgICBzZWxmLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXTtcbiAgICAgIGlmIChzaW1wbGVQYXRoWzJdKSB7XG4gICAgICAgIHNlbGYuc2VhcmNoID0gc2ltcGxlUGF0aFsyXTtcbiAgICAgICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICBzZWxmLnF1ZXJ5ID0gcGFyc2UkMShzZWxmLnNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYucXVlcnkgPSBzZWxmLnNlYXJjaC5zdWJzdHIoMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICBzZWxmLnNlYXJjaCA9ICcnO1xuICAgICAgICBzZWxmLnF1ZXJ5ID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvdG8gPSBwcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXTtcbiAgICB2YXIgbG93ZXJQcm90byA9IHByb3RvLnRvTG93ZXJDYXNlKCk7XG4gICAgc2VsZi5wcm90b2NvbCA9IGxvd2VyUHJvdG87XG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHZhciBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLyc7XG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnN1YnN0cigyKTtcbiAgICAgIHNlbGYuc2xhc2hlcyA9IHRydWU7XG4gICAgfVxuICB9XG4gIHZhciBpLCBoZWMsIGwsIHA7XG4gIGlmICghaG9zdGxlc3NQcm90b2NvbFtwcm90b10gJiZcbiAgICAoc2xhc2hlcyB8fCAocHJvdG8gJiYgIXNsYXNoZWRQcm90b2NvbFtwcm90b10pKSkge1xuXG4gICAgLy8gdGhlcmUncyBhIGhvc3RuYW1lLlxuICAgIC8vIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAvLCA/LCA7LCBvciAjIGVuZHMgdGhlIGhvc3QuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBAIGluIHRoZSBob3N0bmFtZSwgdGhlbiBub24taG9zdCBjaGFycyAqYXJlKiBhbGxvd2VkXG4gICAgLy8gdG8gdGhlIGxlZnQgb2YgdGhlIGxhc3QgQCBzaWduLCB1bmxlc3Mgc29tZSBob3N0LWVuZGluZyBjaGFyYWN0ZXJcbiAgICAvLyBjb21lcyAqYmVmb3JlKiB0aGUgQC1zaWduLlxuICAgIC8vIFVSTHMgYXJlIG9ibm94aW91cy5cbiAgICAvL1xuICAgIC8vIGV4OlxuICAgIC8vIGh0dHA6Ly9hQGJAYy8gPT4gdXNlcjphQGIgaG9zdDpjXG4gICAgLy8gaHR0cDovL2FAYj9AYyA9PiB1c2VyOmEgaG9zdDpjIHBhdGg6Lz9AY1xuXG4gICAgLy8gdjAuMTIgVE9ETyhpc2FhY3MpOiBUaGlzIGlzIG5vdCBxdWl0ZSBob3cgQ2hyb21lIGRvZXMgdGhpbmdzLlxuICAgIC8vIFJldmlldyBvdXIgdGVzdCBjYXNlIGFnYWluc3QgYnJvd3NlcnMgbW9yZSBjb21wcmVoZW5zaXZlbHkuXG5cbiAgICAvLyBmaW5kIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhbnkgaG9zdEVuZGluZ0NoYXJzXG4gICAgdmFyIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgaG9zdEVuZGluZ0NoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoZWMgPSByZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAvLyBhdXRoIHBvcnRpb24gY2Fubm90IGdvIHBhc3QsIG9yIHRoZSBsYXN0IEAgY2hhciBpcyB0aGUgZGVjaWRlci5cbiAgICB2YXIgYXV0aCwgYXRTaWduO1xuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAvLyBQdWxsIHRoYXQgb2ZmLlxuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICBzZWxmLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbm9uSG9zdENoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSlcbiAgICAgIGhvc3RFbmQgPSByZXN0Lmxlbmd0aDtcblxuICAgIHNlbGYuaG9zdCA9IHJlc3Quc2xpY2UoMCwgaG9zdEVuZCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZCk7XG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHBhcnNlSG9zdChzZWxmKTtcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICBzZWxmLmhvc3RuYW1lID0gc2VsZi5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgdmFyIGlwdjZIb3N0bmFtZSA9IHNlbGYuaG9zdG5hbWVbMF0gPT09ICdbJyAmJlxuICAgICAgc2VsZi5ob3N0bmFtZVtzZWxmLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSc7XG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgdmFyIGhvc3RwYXJ0cyA9IHNlbGYuaG9zdG5hbWUuc3BsaXQoL1xcLi8pO1xuICAgICAgZm9yIChpID0gMCwgbCA9IGhvc3RwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnQgPSBob3N0cGFydHNbaV07XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvLyB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAvLyBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gJ3gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRQYXJ0cyA9IGhvc3RwYXJ0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIHZhciBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHZhciBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSk7XG4gICAgICAgICAgICAgIG5vdEhvc3QudW5zaGlmdChiaXRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSAnLycgKyBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2VsZi5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgc2VsZi5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgc2VsZi5ob3N0bmFtZSA9IHNlbGYuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgc2VsZi5ob3N0bmFtZSA9IHRvQVNDSUkoc2VsZi5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgcCA9IHNlbGYucG9ydCA/ICc6JyArIHNlbGYucG9ydCA6ICcnO1xuICAgIHZhciBoID0gc2VsZi5ob3N0bmFtZSB8fCAnJztcbiAgICBzZWxmLmhvc3QgPSBoICsgcDtcbiAgICBzZWxmLmhyZWYgKz0gc2VsZi5ob3N0O1xuXG4gICAgLy8gc3RyaXAgWyBhbmQgXSBmcm9tIHRoZSBob3N0bmFtZVxuICAgIC8vIHRoZSBob3N0IGZpZWxkIHN0aWxsIHJldGFpbnMgdGhlbSwgdGhvdWdoXG4gICAgaWYgKGlwdjZIb3N0bmFtZSkge1xuICAgICAgc2VsZi5ob3N0bmFtZSA9IHNlbGYuaG9zdG5hbWUuc3Vic3RyKDEsIHNlbGYuaG9zdG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBpZiAocmVzdFswXSAhPT0gJy8nKSB7XG4gICAgICAgIHJlc3QgPSAnLycgKyByZXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vdyByZXN0IGlzIHNldCB0byB0aGUgcG9zdC1ob3N0IHN0dWZmLlxuICAvLyBjaG9wIG9mZiBhbnkgZGVsaW0gY2hhcnMuXG4gIGlmICghdW5zYWZlUHJvdG9jb2xbbG93ZXJQcm90b10pIHtcblxuICAgIC8vIEZpcnN0LCBtYWtlIDEwMCUgc3VyZSB0aGF0IGFueSBcImF1dG9Fc2NhcGVcIiBjaGFycyBnZXRcbiAgICAvLyBlc2NhcGVkLCBldmVuIGlmIGVuY29kZVVSSUNvbXBvbmVudCBkb2Vzbid0IHRoaW5rIHRoZXlcbiAgICAvLyBuZWVkIHRvIGJlLlxuICAgIGZvciAoaSA9IDAsIGwgPSBhdXRvRXNjYXBlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGFlID0gYXV0b0VzY2FwZVtpXTtcbiAgICAgIGlmIChyZXN0LmluZGV4T2YoYWUpID09PSAtMSlcbiAgICAgICAgY29udGludWU7XG4gICAgICB2YXIgZXNjID0gZW5jb2RlVVJJQ29tcG9uZW50KGFlKTtcbiAgICAgIGlmIChlc2MgPT09IGFlKSB7XG4gICAgICAgIGVzYyA9IGVzY2FwZShhZSk7XG4gICAgICB9XG4gICAgICByZXN0ID0gcmVzdC5zcGxpdChhZSkuam9pbihlc2MpO1xuICAgIH1cbiAgfVxuXG5cbiAgLy8gY2hvcCBvZmYgZnJvbSB0aGUgdGFpbCBmaXJzdC5cbiAgdmFyIGhhc2ggPSByZXN0LmluZGV4T2YoJyMnKTtcbiAgaWYgKGhhc2ggIT09IC0xKSB7XG4gICAgLy8gZ290IGEgZnJhZ21lbnQgc3RyaW5nLlxuICAgIHNlbGYuaGFzaCA9IHJlc3Quc3Vic3RyKGhhc2gpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIGhhc2gpO1xuICB9XG4gIHZhciBxbSA9IHJlc3QuaW5kZXhPZignPycpO1xuICBpZiAocW0gIT09IC0xKSB7XG4gICAgc2VsZi5zZWFyY2ggPSByZXN0LnN1YnN0cihxbSk7XG4gICAgc2VsZi5xdWVyeSA9IHJlc3Quc3Vic3RyKHFtICsgMSk7XG4gICAgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgIHNlbGYucXVlcnkgPSBwYXJzZSQxKHNlbGYucXVlcnkpO1xuICAgIH1cbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSk7XG4gIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgIC8vIG5vIHF1ZXJ5IHN0cmluZywgYnV0IHBhcnNlUXVlcnlTdHJpbmcgc3RpbGwgcmVxdWVzdGVkXG4gICAgc2VsZi5zZWFyY2ggPSAnJztcbiAgICBzZWxmLnF1ZXJ5ID0ge307XG4gIH1cbiAgaWYgKHJlc3QpIHNlbGYucGF0aG5hbWUgPSByZXN0O1xuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmXG4gICAgc2VsZi5ob3N0bmFtZSAmJiAhc2VsZi5wYXRobmFtZSkge1xuICAgIHNlbGYucGF0aG5hbWUgPSAnLyc7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gIGlmIChzZWxmLnBhdGhuYW1lIHx8IHNlbGYuc2VhcmNoKSB7XG4gICAgcCA9IHNlbGYucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSBzZWxmLnNlYXJjaCB8fCAnJztcbiAgICBzZWxmLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICBzZWxmLmhyZWYgPSBmb3JtYXQoc2VsZik7XG4gIHJldHVybiBzZWxmO1xufVxuXG5mdW5jdGlvbiB1cmxGaWxlVVJMVG9QYXRoKHBhdGgpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJylcbiAgICBwYXRoID0gbmV3IFVybCgpLnBhcnNlKHBhdGgpO1xuICBlbHNlIGlmICghKHBhdGggaW5zdGFuY2VvZiBVcmwpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInBhdGhcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIGFuIGluc3RhbmNlIG9mIFVSTC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiBwYXRoKSArIFN0cmluZyhwYXRoKSk7XG4gIGlmIChwYXRoLnByb3RvY29sICE9PSAnZmlsZTonKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBVUkwgbXVzdCBiZSBvZiBzY2hlbWUgZmlsZScpO1xuICByZXR1cm4gZ2V0UGF0aEZyb21VUkxQb3NpeChwYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGF0aEZyb21VUkxQb3NpeCh1cmwpIHtcbiAgY29uc3QgcGF0aG5hbWUgPSB1cmwucGF0aG5hbWU7XG4gIGZvciAobGV0IG4gPSAwOyBuIDwgcGF0aG5hbWUubGVuZ3RoOyBuKyspIHtcbiAgICBpZiAocGF0aG5hbWVbbl0gPT09ICclJykge1xuICAgICAgY29uc3QgdGhpcmQgPSBwYXRobmFtZS5jb2RlUG9pbnRBdChuICsgMikgfCAweDIwO1xuICAgICAgaWYgKHBhdGhuYW1lW24gKyAxXSA9PT0gJzInICYmIHRoaXJkID09PSAxMDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnbXVzdCBub3QgaW5jbHVkZSBlbmNvZGVkIC8gY2hhcmFjdGVycydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwYXRobmFtZSk7XG59XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLy8gZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgLy8gSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgLy8gdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAvLyB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICBpZiAoaXNTdHJpbmcob2JqKSkgb2JqID0gcGFyc2Uoe30sIG9iaik7XG4gIHJldHVybiBmb3JtYXQob2JqKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0KHNlbGYpIHtcbiAgdmFyIGF1dGggPSBzZWxmLmF1dGggfHwgJyc7XG4gIGlmIChhdXRoKSB7XG4gICAgYXV0aCA9IGVuY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICBhdXRoID0gYXV0aC5yZXBsYWNlKC8lM0EvaSwgJzonKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHNlbGYucHJvdG9jb2wgfHwgJycsXG4gICAgcGF0aG5hbWUgPSBzZWxmLnBhdGhuYW1lIHx8ICcnLFxuICAgIGhhc2ggPSBzZWxmLmhhc2ggfHwgJycsXG4gICAgaG9zdCA9IGZhbHNlLFxuICAgIHF1ZXJ5ID0gJyc7XG5cbiAgaWYgKHNlbGYuaG9zdCkge1xuICAgIGhvc3QgPSBhdXRoICsgc2VsZi5ob3N0O1xuICB9IGVsc2UgaWYgKHNlbGYuaG9zdG5hbWUpIHtcbiAgICBob3N0ID0gYXV0aCArIChzZWxmLmhvc3RuYW1lLmluZGV4T2YoJzonKSA9PT0gLTEgP1xuICAgICAgc2VsZi5ob3N0bmFtZSA6XG4gICAgICAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAoc2VsZi5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHNlbGYucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAoc2VsZi5xdWVyeSAmJlxuICAgIGlzT2JqZWN0KHNlbGYucXVlcnkpICYmXG4gICAgT2JqZWN0LmtleXMoc2VsZi5xdWVyeSkubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSBzdHJpbmdpZnkoc2VsZi5xdWVyeSk7XG4gIH1cblxuICB2YXIgc2VhcmNoID0gc2VsZi5zZWFyY2ggfHwgKHF1ZXJ5ICYmICgnPycgKyBxdWVyeSkpIHx8ICcnO1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHByb3RvY29sICs9ICc6JztcblxuICAvLyBvbmx5IHRoZSBzbGFzaGVkUHJvdG9jb2xzIGdldCB0aGUgLy8uICBOb3QgbWFpbHRvOiwgeG1wcDosIGV0Yy5cbiAgLy8gdW5sZXNzIHRoZXkgaGFkIHRoZW0gdG8gYmVnaW4gd2l0aC5cbiAgaWYgKHNlbGYuc2xhc2hlcyB8fFxuICAgICghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpIHtcbiAgICBob3N0ID0gJy8vJyArIChob3N0IHx8ICcnKTtcbiAgICBpZiAocGF0aG5hbWUgJiYgcGF0aG5hbWUuY2hhckF0KDApICE9PSAnLycpIHBhdGhuYW1lID0gJy8nICsgcGF0aG5hbWU7XG4gIH0gZWxzZSBpZiAoIWhvc3QpIHtcbiAgICBob3N0ID0gJyc7XG4gIH1cblxuICBpZiAoaGFzaCAmJiBoYXNoLmNoYXJBdCgwKSAhPT0gJyMnKSBoYXNoID0gJyMnICsgaGFzaDtcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2guY2hhckF0KDApICE9PSAnPycpIHNlYXJjaCA9ICc/JyArIHNlYXJjaDtcblxuICBwYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KG1hdGNoKTtcbiAgfSk7XG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIHJldHVybiBwcm90b2NvbCArIGhvc3QgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2g7XG59XG5cblVybC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBmb3JtYXQodGhpcyk7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmUocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICByZXR1cm4gdGhpcy5yZXNvbHZlT2JqZWN0KHVybFBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSkpLmZvcm1hdCgpO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZU9iamVjdChzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIGlmICghc291cmNlKSByZXR1cm4gcmVsYXRpdmU7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlT2JqZWN0KHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0ID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgaWYgKGlzU3RyaW5nKHJlbGF0aXZlKSkge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICB2YXIgdGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgZm9yICh2YXIgdGsgPSAwOyB0ayA8IHRrZXlzLmxlbmd0aDsgdGsrKykge1xuICAgIHZhciB0a2V5ID0gdGtleXNbdGtdO1xuICAgIHJlc3VsdFt0a2V5XSA9IHRoaXNbdGtleV07XG4gIH1cblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTtcbiAgICB9XG5cbiAgICAvL3VybFBhcnNlIGFwcGVuZHMgdHJhaWxpbmcgLyB0byB1cmxzIGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbVxuICAgIGlmIChzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXSAmJlxuICAgICAgcmVzdWx0Lmhvc3RuYW1lICYmICFyZXN1bHQucGF0aG5hbWUpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gcmVzdWx0LnBhdGhuYW1lID0gJy8nO1xuICAgIH1cblxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgdmFyIHJlbFBhdGg7XG4gIGlmIChyZWxhdGl2ZS5wcm90b2NvbCAmJiByZWxhdGl2ZS5wcm90b2NvbCAhPT0gcmVzdWx0LnByb3RvY29sKSB7XG4gICAgLy8gaWYgaXQncyBhIGtub3duIHVybCBwcm90b2NvbCwgdGhlbiBjaGFuZ2luZ1xuICAgIC8vIHRoZSBwcm90b2NvbCBkb2VzIHdlaXJkIHRoaW5nc1xuICAgIC8vIGZpcnN0LCBpZiBpdCdzIG5vdCBmaWxlOiwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBob3N0LFxuICAgIC8vIGFuZCBpZiB0aGVyZSB3YXMgYSBwYXRoXG4gICAgLy8gdG8gYmVnaW4gd2l0aCwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBwYXRoLlxuICAgIC8vIGlmIGl0IGlzIGZpbGU6LCB0aGVuIHRoZSBob3N0IGlzIGRyb3BwZWQsXG4gICAgLy8gYmVjYXVzZSB0aGF0J3Mga25vd24gdG8gYmUgaG9zdGxlc3MuXG4gICAgLy8gYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlLlxuICAgIGlmICghc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW3ZdO1xuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiYgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICByZWxQYXRoID0gKHJlbGF0aXZlLnBhdGhuYW1lIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgICAgd2hpbGUgKHJlbFBhdGgubGVuZ3RoICYmICEocmVsYXRpdmUuaG9zdCA9IHJlbFBhdGguc2hpZnQoKSkpO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0KSByZWxhdGl2ZS5ob3N0ID0gJyc7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3RuYW1lKSByZWxhdGl2ZS5ob3N0bmFtZSA9ICcnO1xuICAgICAgaWYgKHJlbFBhdGhbMF0gIT09ICcnKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgaWYgKHJlbFBhdGgubGVuZ3RoIDwgMikgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbFBhdGguam9pbignLycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxhdGl2ZS5wYXRobmFtZTtcbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICByZXN1bHQuaG9zdCA9IHJlbGF0aXZlLmhvc3QgfHwgJyc7XG4gICAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoO1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3Q7XG4gICAgcmVzdWx0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgIC8vIHRvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSB8fCByZXN1bHQuc2VhcmNoKSB7XG4gICAgICB2YXIgcCA9IHJlc3VsdC5wYXRobmFtZSB8fCAnJztcbiAgICAgIHZhciBzID0gcmVzdWx0LnNlYXJjaCB8fCAnJztcbiAgICAgIHJlc3VsdC5wYXRoID0gcCArIHM7XG4gICAgfVxuICAgIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdmFyIGlzU291cmNlQWJzID0gKHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpLFxuICAgIGlzUmVsQWJzID0gKFxuICAgICAgcmVsYXRpdmUuaG9zdCB8fFxuICAgICAgcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLydcbiAgICApLFxuICAgIG11c3RFbmRBYnMgPSAoaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHxcbiAgICAgIChyZXN1bHQuaG9zdCAmJiByZWxhdGl2ZS5wYXRobmFtZSkpLFxuICAgIHJlbW92ZUFsbERvdHMgPSBtdXN0RW5kQWJzLFxuICAgIHNyY1BhdGggPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgcHN5Y2hvdGljID0gcmVzdWx0LnByb3RvY29sICYmICFzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXTtcbiAgcmVsUGF0aCA9IHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW107XG4gIC8vIGlmIHRoZSB1cmwgaXMgYSBub24tc2xhc2hlZCB1cmwsIHRoZW4gcmVsYXRpdmVcbiAgLy8gbGlua3MgbGlrZSAuLi8uLiBzaG91bGQgYmUgYWJsZVxuICAvLyB0byBjcmF3bCB1cCB0byB0aGUgaG9zdG5hbWUsIGFzIHdlbGwuICBUaGlzIGlzIHN0cmFuZ2UuXG4gIC8vIHJlc3VsdC5wcm90b2NvbCBoYXMgYWxyZWFkeSBiZWVuIHNldCBieSBub3cuXG4gIC8vIExhdGVyIG9uLCBwdXQgdGhlIGZpcnN0IHBhdGggcGFydCBpbnRvIHRoZSBob3N0IGZpZWxkLlxuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gJyc7XG4gICAgcmVzdWx0LnBvcnQgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuaG9zdCkge1xuICAgICAgaWYgKHNyY1BhdGhbMF0gPT09ICcnKSBzcmNQYXRoWzBdID0gcmVzdWx0Lmhvc3Q7XG4gICAgICBlbHNlIHNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCk7XG4gICAgfVxuICAgIHJlc3VsdC5ob3N0ID0gJyc7XG4gICAgaWYgKHJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgICByZWxhdGl2ZS5ob3N0bmFtZSA9IG51bGw7XG4gICAgICByZWxhdGl2ZS5wb3J0ID0gbnVsbDtcbiAgICAgIGlmIChyZWxhdGl2ZS5ob3N0KSB7XG4gICAgICAgIGlmIChyZWxQYXRoWzBdID09PSAnJykgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7XG4gICAgICAgIGVsc2UgcmVsUGF0aC51bnNoaWZ0KHJlbGF0aXZlLmhvc3QpO1xuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cbiAgdmFyIGF1dGhJbkhvc3Q7XG4gIGlmIChpc1JlbEFicykge1xuICAgIC8vIGl0J3MgYWJzb2x1dGUuXG4gICAgcmVzdWx0Lmhvc3QgPSAocmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJykgP1xuICAgICAgcmVsYXRpdmUuaG9zdCA6IHJlc3VsdC5ob3N0O1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IChyZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycpID9cbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lIDogcmVzdWx0Lmhvc3RuYW1lO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgc3JjUGF0aCA9IHJlbFBhdGg7XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIHRoZSBkb3QtaGFuZGxpbmcgYmVsb3cuXG4gIH0gZWxzZSBpZiAocmVsUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBpdCdzIHJlbGF0aXZlXG4gICAgLy8gdGhyb3cgYXdheSB0aGUgZXhpc3RpbmcgZmlsZSwgYW5kIHRha2UgdGhlIG5ldyBwYXRoIGluc3RlYWQuXG4gICAgaWYgKCFzcmNQYXRoKSBzcmNQYXRoID0gW107XG4gICAgc3JjUGF0aC5wb3AoKTtcbiAgICBzcmNQYXRoID0gc3JjUGF0aC5jb25jYXQocmVsUGF0aCk7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgfSBlbHNlIGlmICghaXNOdWxsT3JVbmRlZmluZWQocmVsYXRpdmUuc2VhcmNoKSkge1xuICAgIC8vIGp1c3QgcHVsbCBvdXQgdGhlIHNlYXJjaC5cbiAgICAvLyBsaWtlIGhyZWY9Jz9mb28nLlxuICAgIC8vIFB1dCB0aGlzIGFmdGVyIHRoZSBvdGhlciB0d28gY2FzZXMgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoZSBib29sZWFuc1xuICAgIGlmIChwc3ljaG90aWMpIHtcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gc3JjUGF0aC5zaGlmdCgpO1xuICAgICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgP1xuICAgICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmICghaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIWlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIC8vIG5vIHBhdGggYXQgYWxsLiAgZWFzeS5cbiAgICAvLyB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIG90aGVyIHN0dWZmIGFib3ZlLlxuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQuc2VhcmNoKSB7XG4gICAgICByZXN1bHQucGF0aCA9ICcvJyArIHJlc3VsdC5zZWFyY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGlmIGEgdXJsIEVORHMgaW4gLiBvciAuLiwgdGhlbiBpdCBtdXN0IGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICAvLyBob3dldmVyLCBpZiBpdCBlbmRzIGluIGFueXRoaW5nIGVsc2Ugbm9uLXNsYXNoeSxcbiAgLy8gdGhlbiBpdCBtdXN0IE5PVCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgdmFyIGxhc3QgPSBzcmNQYXRoLnNsaWNlKC0xKVswXTtcbiAgdmFyIGhhc1RyYWlsaW5nU2xhc2ggPSAoXG4gICAgKHJlc3VsdC5ob3N0IHx8IHJlbGF0aXZlLmhvc3QgfHwgc3JjUGF0aC5sZW5ndGggPiAxKSAmJlxuICAgIChsYXN0ID09PSAnLicgfHwgbGFzdCA9PT0gJy4uJykgfHwgbGFzdCA9PT0gJycpO1xuXG4gIC8vIHN0cmlwIHNpbmdsZSBkb3RzLCByZXNvbHZlIGRvdWJsZSBkb3RzIHRvIHBhcmVudCBkaXJcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHNyY1BhdGgubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgIGxhc3QgPSBzcmNQYXRoW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmICghbXVzdEVuZEFicyAmJiAhcmVtb3ZlQWxsRG90cykge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgc3JjUGF0aC51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtdXN0RW5kQWJzICYmIHNyY1BhdGhbMF0gIT09ICcnICYmXG4gICAgKCFzcmNQYXRoWzBdIHx8IHNyY1BhdGhbMF0uY2hhckF0KDApICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmIChoYXNUcmFpbGluZ1NsYXNoICYmIChzcmNQYXRoLmpvaW4oJy8nKS5zdWJzdHIoLTEpICE9PSAnLycpKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHxcbiAgICAoc3JjUGF0aFswXSAmJiBzcmNQYXRoWzBdLmNoYXJBdCgwKSA9PT0gJy8nKTtcblxuICAvLyBwdXQgdGhlIGhvc3QgYmFja1xuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3QgPSBpc0Fic29sdXRlID8gJycgOlxuICAgICAgc3JjUGF0aC5sZW5ndGggPyBzcmNQYXRoLnNoaWZ0KCkgOiAnJztcbiAgICAvL29jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/XG4gICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgfVxuICB9XG5cbiAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHNyY1BhdGgubGVuZ3RoKTtcblxuICBpZiAobXVzdEVuZEFicyAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnBhdGhuYW1lID0gc3JjUGF0aC5qb2luKCcvJyk7XG4gIH1cblxuICAvL3RvIHN1cHBvcnQgcmVxdWVzdC5odHRwXG4gIGlmICghaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIWlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHBhcnNlSG9zdCh0aGlzKTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlSG9zdChzZWxmKSB7XG4gIHZhciBob3N0ID0gc2VsZi5ob3N0O1xuICB2YXIgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7XG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF07XG4gICAgaWYgKHBvcnQgIT09ICc6Jykge1xuICAgICAgc2VsZi5wb3J0ID0gcG9ydC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgc2VsZi5ob3N0bmFtZSA9IGhvc3Q7XG59XG5cbnZhciBfcG9seWZpbGxOb2RlX3VybCQxID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFVSTDogVVJMJDEsXG5cdFVSTFNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zLFxuXHRVcmw6IFVybCxcblx0ZGVmYXVsdDogX3BvbHlmaWxsTm9kZV91cmwsXG5cdGZpbGVVUkxUb1BhdGg6IHVybEZpbGVVUkxUb1BhdGgsXG5cdGZvcm1hdDogdXJsRm9ybWF0LFxuXHRwYXJzZTogdXJsUGFyc2UsXG5cdHJlc29sdmU6IHVybFJlc29sdmUsXG5cdHJlc29sdmVPYmplY3Q6IHVybFJlc29sdmVPYmplY3Rcbn0pO1xuXG5mdW5jdGlvbiByZXF1ZXN0JDEob3B0cywgY2IpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnc3RyaW5nJylcbiAgICBvcHRzID0gdXJsUGFyc2Uob3B0cyk7XG5cblxuICAvLyBOb3JtYWxseSwgdGhlIHBhZ2UgaXMgbG9hZGVkIGZyb20gaHR0cCBvciBodHRwcywgc28gbm90IHNwZWNpZnlpbmcgYSBwcm90b2NvbFxuICAvLyB3aWxsIHJlc3VsdCBpbiBhICh2YWxpZCkgcHJvdG9jb2wtcmVsYXRpdmUgdXJsLiBIb3dldmVyLCB0aGlzIHdvbid0IHdvcmsgaWZcbiAgLy8gdGhlIHByb3RvY29sIGlzIHNvbWV0aGluZyBlbHNlLCBsaWtlICdmaWxlOidcbiAgdmFyIGRlZmF1bHRQcm90b2NvbCA9IGdsb2JhbCQxLmxvY2F0aW9uLnByb3RvY29sLnNlYXJjaCgvXmh0dHBzPzokLykgPT09IC0xID8gJ2h0dHA6JyA6ICcnO1xuXG4gIHZhciBwcm90b2NvbCA9IG9wdHMucHJvdG9jb2wgfHwgZGVmYXVsdFByb3RvY29sO1xuICB2YXIgaG9zdCA9IG9wdHMuaG9zdG5hbWUgfHwgb3B0cy5ob3N0O1xuICB2YXIgcG9ydCA9IG9wdHMucG9ydDtcbiAgdmFyIHBhdGggPSBvcHRzLnBhdGggfHwgJy8nO1xuXG4gIC8vIE5lY2Vzc2FyeSBmb3IgSVB2NiBhZGRyZXNzZXNcbiAgaWYgKGhvc3QgJiYgaG9zdC5pbmRleE9mKCc6JykgIT09IC0xKVxuICAgIGhvc3QgPSAnWycgKyBob3N0ICsgJ10nO1xuXG4gIC8vIFRoaXMgbWF5IGJlIGEgcmVsYXRpdmUgdXJsLiBUaGUgYnJvd3NlciBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gaW50ZXJwcmV0IGl0IGNvcnJlY3RseS5cbiAgb3B0cy51cmwgPSAoaG9zdCA/IChwcm90b2NvbCArICcvLycgKyBob3N0KSA6ICcnKSArIChwb3J0ID8gJzonICsgcG9ydCA6ICcnKSArIHBhdGg7XG4gIG9wdHMubWV0aG9kID0gKG9wdHMubWV0aG9kIHx8ICdHRVQnKS50b1VwcGVyQ2FzZSgpO1xuICBvcHRzLmhlYWRlcnMgPSBvcHRzLmhlYWRlcnMgfHwge307XG5cbiAgLy8gQWxzbyB2YWxpZCBvcHRzLmF1dGgsIG9wdHMubW9kZVxuXG4gIHZhciByZXEgPSBuZXcgQ2xpZW50UmVxdWVzdChvcHRzKTtcbiAgaWYgKGNiKVxuICAgIHJlcS5vbigncmVzcG9uc2UnLCBjYik7XG4gIHJldHVybiByZXFcbn1cblxuZnVuY3Rpb24gZ2V0JDEob3B0cywgY2IpIHtcbiAgdmFyIHJlcSA9IHJlcXVlc3QkMShvcHRzLCBjYik7XG4gIHJlcS5lbmQoKTtcbiAgcmV0dXJuIHJlcVxufVxuXG5mdW5jdGlvbiBBZ2VudCQxKCkge31cbkFnZW50JDEuZGVmYXVsdE1heFNvY2tldHMgPSA0O1xuXG52YXIgTUVUSE9EUyQxID0gW1xuICAnQ0hFQ0tPVVQnLFxuICAnQ09OTkVDVCcsXG4gICdDT1BZJyxcbiAgJ0RFTEVURScsXG4gICdHRVQnLFxuICAnSEVBRCcsXG4gICdMT0NLJyxcbiAgJ00tU0VBUkNIJyxcbiAgJ01FUkdFJyxcbiAgJ01LQUNUSVZJVFknLFxuICAnTUtDT0wnLFxuICAnTU9WRScsXG4gICdOT1RJRlknLFxuICAnT1BUSU9OUycsXG4gICdQQVRDSCcsXG4gICdQT1NUJyxcbiAgJ1BST1BGSU5EJyxcbiAgJ1BST1BQQVRDSCcsXG4gICdQVVJHRScsXG4gICdQVVQnLFxuICAnUkVQT1JUJyxcbiAgJ1NFQVJDSCcsXG4gICdTVUJTQ1JJQkUnLFxuICAnVFJBQ0UnLFxuICAnVU5MT0NLJyxcbiAgJ1VOU1VCU0NSSUJFJ1xuXTtcbnZhciBTVEFUVVNfQ09ERVMkMSA9IHtcbiAgMTAwOiAnQ29udGludWUnLFxuICAxMDE6ICdTd2l0Y2hpbmcgUHJvdG9jb2xzJyxcbiAgMTAyOiAnUHJvY2Vzc2luZycsIC8vIFJGQyAyNTE4LCBvYnNvbGV0ZWQgYnkgUkZDIDQ5MThcbiAgMjAwOiAnT0snLFxuICAyMDE6ICdDcmVhdGVkJyxcbiAgMjAyOiAnQWNjZXB0ZWQnLFxuICAyMDM6ICdOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbicsXG4gIDIwNDogJ05vIENvbnRlbnQnLFxuICAyMDU6ICdSZXNldCBDb250ZW50JyxcbiAgMjA2OiAnUGFydGlhbCBDb250ZW50JyxcbiAgMjA3OiAnTXVsdGktU3RhdHVzJywgLy8gUkZDIDQ5MThcbiAgMzAwOiAnTXVsdGlwbGUgQ2hvaWNlcycsXG4gIDMwMTogJ01vdmVkIFBlcm1hbmVudGx5JyxcbiAgMzAyOiAnTW92ZWQgVGVtcG9yYXJpbHknLFxuICAzMDM6ICdTZWUgT3RoZXInLFxuICAzMDQ6ICdOb3QgTW9kaWZpZWQnLFxuICAzMDU6ICdVc2UgUHJveHknLFxuICAzMDc6ICdUZW1wb3JhcnkgUmVkaXJlY3QnLFxuICA0MDA6ICdCYWQgUmVxdWVzdCcsXG4gIDQwMTogJ1VuYXV0aG9yaXplZCcsXG4gIDQwMjogJ1BheW1lbnQgUmVxdWlyZWQnLFxuICA0MDM6ICdGb3JiaWRkZW4nLFxuICA0MDQ6ICdOb3QgRm91bmQnLFxuICA0MDU6ICdNZXRob2QgTm90IEFsbG93ZWQnLFxuICA0MDY6ICdOb3QgQWNjZXB0YWJsZScsXG4gIDQwNzogJ1Byb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbiAgNDA4OiAnUmVxdWVzdCBUaW1lLW91dCcsXG4gIDQwOTogJ0NvbmZsaWN0JyxcbiAgNDEwOiAnR29uZScsXG4gIDQxMTogJ0xlbmd0aCBSZXF1aXJlZCcsXG4gIDQxMjogJ1ByZWNvbmRpdGlvbiBGYWlsZWQnLFxuICA0MTM6ICdSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UnLFxuICA0MTQ6ICdSZXF1ZXN0LVVSSSBUb28gTGFyZ2UnLFxuICA0MTU6ICdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlJyxcbiAgNDE2OiAnUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZScsXG4gIDQxNzogJ0V4cGVjdGF0aW9uIEZhaWxlZCcsXG4gIDQxODogJ0lcXCdtIGEgdGVhcG90JywgLy8gUkZDIDIzMjRcbiAgNDIyOiAnVW5wcm9jZXNzYWJsZSBFbnRpdHknLCAvLyBSRkMgNDkxOFxuICA0MjM6ICdMb2NrZWQnLCAvLyBSRkMgNDkxOFxuICA0MjQ6ICdGYWlsZWQgRGVwZW5kZW5jeScsIC8vIFJGQyA0OTE4XG4gIDQyNTogJ1Vub3JkZXJlZCBDb2xsZWN0aW9uJywgLy8gUkZDIDQ5MThcbiAgNDI2OiAnVXBncmFkZSBSZXF1aXJlZCcsIC8vIFJGQyAyODE3XG4gIDQyODogJ1ByZWNvbmRpdGlvbiBSZXF1aXJlZCcsIC8vIFJGQyA2NTg1XG4gIDQyOTogJ1RvbyBNYW55IFJlcXVlc3RzJywgLy8gUkZDIDY1ODVcbiAgNDMxOiAnUmVxdWVzdCBIZWFkZXIgRmllbGRzIFRvbyBMYXJnZScsIC8vIFJGQyA2NTg1XG4gIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gIDUwMTogJ05vdCBJbXBsZW1lbnRlZCcsXG4gIDUwMjogJ0JhZCBHYXRld2F5JyxcbiAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZScsXG4gIDUwNDogJ0dhdGV3YXkgVGltZS1vdXQnLFxuICA1MDU6ICdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsXG4gIDUwNjogJ1ZhcmlhbnQgQWxzbyBOZWdvdGlhdGVzJywgLy8gUkZDIDIyOTVcbiAgNTA3OiAnSW5zdWZmaWNpZW50IFN0b3JhZ2UnLCAvLyBSRkMgNDkxOFxuICA1MDk6ICdCYW5kd2lkdGggTGltaXQgRXhjZWVkZWQnLFxuICA1MTA6ICdOb3QgRXh0ZW5kZWQnLCAvLyBSRkMgMjc3NFxuICA1MTE6ICdOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyAvLyBSRkMgNjU4NVxufTtcblxudmFyIF9wb2x5ZmlsbE5vZGVfaHR0cCA9IHtcbiAgcmVxdWVzdDogcmVxdWVzdCQxLFxuICBnZXQ6IGdldCQxLFxuICBBZ2VudDogQWdlbnQkMSxcbiAgTUVUSE9EUzogTUVUSE9EUyQxLFxuICBTVEFUVVNfQ09ERVM6IFNUQVRVU19DT0RFUyQxXG59O1xuXG52YXIgX3BvbHlmaWxsTm9kZV9odHRwJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0QWdlbnQ6IEFnZW50JDEsXG5cdE1FVEhPRFM6IE1FVEhPRFMkMSxcblx0U1RBVFVTX0NPREVTOiBTVEFUVVNfQ09ERVMkMSxcblx0ZGVmYXVsdDogX3BvbHlmaWxsTm9kZV9odHRwLFxuXHRnZXQ6IGdldCQxLFxuXHRyZXF1ZXN0OiByZXF1ZXN0JDFcbn0pO1xuXG52YXIgcmVxdWlyZSQkMiA9IC8qQF9fUFVSRV9fKi9nZXRBdWdtZW50ZWROYW1lc3BhY2UoX3BvbHlmaWxsTm9kZV9odHRwJDEpO1xuXG5mdW5jdGlvbiByZXF1ZXN0KG9wdHMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ3N0cmluZycpXG4gICAgb3B0cyA9IHVybFBhcnNlKG9wdHMpO1xuXG5cbiAgLy8gTm9ybWFsbHksIHRoZSBwYWdlIGlzIGxvYWRlZCBmcm9tIGh0dHAgb3IgaHR0cHMsIHNvIG5vdCBzcGVjaWZ5aW5nIGEgcHJvdG9jb2xcbiAgLy8gd2lsbCByZXN1bHQgaW4gYSAodmFsaWQpIHByb3RvY29sLXJlbGF0aXZlIHVybC4gSG93ZXZlciwgdGhpcyB3b24ndCB3b3JrIGlmXG4gIC8vIHRoZSBwcm90b2NvbCBpcyBzb21ldGhpbmcgZWxzZSwgbGlrZSAnZmlsZTonXG4gIHZhciBkZWZhdWx0UHJvdG9jb2wgPSBnbG9iYWwkMS5sb2NhdGlvbi5wcm90b2NvbC5zZWFyY2goL15odHRwcz86JC8pID09PSAtMSA/ICdodHRwOicgOiAnJztcblxuICB2YXIgcHJvdG9jb2wgPSBvcHRzLnByb3RvY29sIHx8IGRlZmF1bHRQcm90b2NvbDtcbiAgdmFyIGhvc3QgPSBvcHRzLmhvc3RuYW1lIHx8IG9wdHMuaG9zdDtcbiAgdmFyIHBvcnQgPSBvcHRzLnBvcnQ7XG4gIHZhciBwYXRoID0gb3B0cy5wYXRoIHx8ICcvJztcblxuICAvLyBOZWNlc3NhcnkgZm9yIElQdjYgYWRkcmVzc2VzXG4gIGlmIChob3N0ICYmIGhvc3QuaW5kZXhPZignOicpICE9PSAtMSlcbiAgICBob3N0ID0gJ1snICsgaG9zdCArICddJztcblxuICAvLyBUaGlzIG1heSBiZSBhIHJlbGF0aXZlIHVybC4gVGhlIGJyb3dzZXIgc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGludGVycHJldCBpdCBjb3JyZWN0bHkuXG4gIG9wdHMudXJsID0gKGhvc3QgPyAocHJvdG9jb2wgKyAnLy8nICsgaG9zdCkgOiAnJykgKyAocG9ydCA/ICc6JyArIHBvcnQgOiAnJykgKyBwYXRoO1xuICBvcHRzLm1ldGhvZCA9IChvcHRzLm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKTtcbiAgb3B0cy5oZWFkZXJzID0gb3B0cy5oZWFkZXJzIHx8IHt9O1xuXG4gIC8vIEFsc28gdmFsaWQgb3B0cy5hdXRoLCBvcHRzLm1vZGVcblxuICB2YXIgcmVxID0gbmV3IENsaWVudFJlcXVlc3Qob3B0cyk7XG4gIGlmIChjYilcbiAgICByZXEub24oJ3Jlc3BvbnNlJywgY2IpO1xuICByZXR1cm4gcmVxXG59XG5cbmZ1bmN0aW9uIGdldChvcHRzLCBjYikge1xuICB2YXIgcmVxID0gcmVxdWVzdChvcHRzLCBjYik7XG4gIHJlcS5lbmQoKTtcbiAgcmV0dXJuIHJlcVxufVxuXG5mdW5jdGlvbiBBZ2VudCgpIHt9XG5BZ2VudC5kZWZhdWx0TWF4U29ja2V0cyA9IDQ7XG5cbnZhciBNRVRIT0RTID0gW1xuICAnQ0hFQ0tPVVQnLFxuICAnQ09OTkVDVCcsXG4gICdDT1BZJyxcbiAgJ0RFTEVURScsXG4gICdHRVQnLFxuICAnSEVBRCcsXG4gICdMT0NLJyxcbiAgJ00tU0VBUkNIJyxcbiAgJ01FUkdFJyxcbiAgJ01LQUNUSVZJVFknLFxuICAnTUtDT0wnLFxuICAnTU9WRScsXG4gICdOT1RJRlknLFxuICAnT1BUSU9OUycsXG4gICdQQVRDSCcsXG4gICdQT1NUJyxcbiAgJ1BST1BGSU5EJyxcbiAgJ1BST1BQQVRDSCcsXG4gICdQVVJHRScsXG4gICdQVVQnLFxuICAnUkVQT1JUJyxcbiAgJ1NFQVJDSCcsXG4gICdTVUJTQ1JJQkUnLFxuICAnVFJBQ0UnLFxuICAnVU5MT0NLJyxcbiAgJ1VOU1VCU0NSSUJFJ1xuXTtcbnZhciBTVEFUVVNfQ09ERVMgPSB7XG4gIDEwMDogJ0NvbnRpbnVlJyxcbiAgMTAxOiAnU3dpdGNoaW5nIFByb3RvY29scycsXG4gIDEwMjogJ1Byb2Nlc3NpbmcnLCAvLyBSRkMgMjUxOCwgb2Jzb2xldGVkIGJ5IFJGQyA0OTE4XG4gIDIwMDogJ09LJyxcbiAgMjAxOiAnQ3JlYXRlZCcsXG4gIDIwMjogJ0FjY2VwdGVkJyxcbiAgMjAzOiAnTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24nLFxuICAyMDQ6ICdObyBDb250ZW50JyxcbiAgMjA1OiAnUmVzZXQgQ29udGVudCcsXG4gIDIwNjogJ1BhcnRpYWwgQ29udGVudCcsXG4gIDIwNzogJ011bHRpLVN0YXR1cycsIC8vIFJGQyA0OTE4XG4gIDMwMDogJ011bHRpcGxlIENob2ljZXMnLFxuICAzMDE6ICdNb3ZlZCBQZXJtYW5lbnRseScsXG4gIDMwMjogJ01vdmVkIFRlbXBvcmFyaWx5JyxcbiAgMzAzOiAnU2VlIE90aGVyJyxcbiAgMzA0OiAnTm90IE1vZGlmaWVkJyxcbiAgMzA1OiAnVXNlIFByb3h5JyxcbiAgMzA3OiAnVGVtcG9yYXJ5IFJlZGlyZWN0JyxcbiAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICA0MDE6ICdVbmF1dGhvcml6ZWQnLFxuICA0MDI6ICdQYXltZW50IFJlcXVpcmVkJyxcbiAgNDAzOiAnRm9yYmlkZGVuJyxcbiAgNDA0OiAnTm90IEZvdW5kJyxcbiAgNDA1OiAnTWV0aG9kIE5vdCBBbGxvd2VkJyxcbiAgNDA2OiAnTm90IEFjY2VwdGFibGUnLFxuICA0MDc6ICdQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcsXG4gIDQwODogJ1JlcXVlc3QgVGltZS1vdXQnLFxuICA0MDk6ICdDb25mbGljdCcsXG4gIDQxMDogJ0dvbmUnLFxuICA0MTE6ICdMZW5ndGggUmVxdWlyZWQnLFxuICA0MTI6ICdQcmVjb25kaXRpb24gRmFpbGVkJyxcbiAgNDEzOiAnUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlJyxcbiAgNDE0OiAnUmVxdWVzdC1VUkkgVG9vIExhcmdlJyxcbiAgNDE1OiAnVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZScsXG4gIDQxNjogJ1JlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGUnLFxuICA0MTc6ICdFeHBlY3RhdGlvbiBGYWlsZWQnLFxuICA0MTg6ICdJXFwnbSBhIHRlYXBvdCcsIC8vIFJGQyAyMzI0XG4gIDQyMjogJ1VucHJvY2Vzc2FibGUgRW50aXR5JywgLy8gUkZDIDQ5MThcbiAgNDIzOiAnTG9ja2VkJywgLy8gUkZDIDQ5MThcbiAgNDI0OiAnRmFpbGVkIERlcGVuZGVuY3knLCAvLyBSRkMgNDkxOFxuICA0MjU6ICdVbm9yZGVyZWQgQ29sbGVjdGlvbicsIC8vIFJGQyA0OTE4XG4gIDQyNjogJ1VwZ3JhZGUgUmVxdWlyZWQnLCAvLyBSRkMgMjgxN1xuICA0Mjg6ICdQcmVjb25kaXRpb24gUmVxdWlyZWQnLCAvLyBSRkMgNjU4NVxuICA0Mjk6ICdUb28gTWFueSBSZXF1ZXN0cycsIC8vIFJGQyA2NTg1XG4gIDQzMTogJ1JlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnLCAvLyBSRkMgNjU4NVxuICA1MDA6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICA1MDE6ICdOb3QgSW1wbGVtZW50ZWQnLFxuICA1MDI6ICdCYWQgR2F0ZXdheScsXG4gIDUwMzogJ1NlcnZpY2UgVW5hdmFpbGFibGUnLFxuICA1MDQ6ICdHYXRld2F5IFRpbWUtb3V0JyxcbiAgNTA1OiAnSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWQnLFxuICA1MDY6ICdWYXJpYW50IEFsc28gTmVnb3RpYXRlcycsIC8vIFJGQyAyMjk1XG4gIDUwNzogJ0luc3VmZmljaWVudCBTdG9yYWdlJywgLy8gUkZDIDQ5MThcbiAgNTA5OiAnQmFuZHdpZHRoIExpbWl0IEV4Y2VlZGVkJyxcbiAgNTEwOiAnTm90IEV4dGVuZGVkJywgLy8gUkZDIDI3NzRcbiAgNTExOiAnTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcgLy8gUkZDIDY1ODVcbn07XG5cbnZhciBfcG9seWZpbGxOb2RlX2h0dHBzID0ge1xuICByZXF1ZXN0LFxuICBnZXQsXG4gIEFnZW50LFxuICBNRVRIT0RTLFxuICBTVEFUVVNfQ09ERVNcbn07XG5cbnZhciBfcG9seWZpbGxOb2RlX2h0dHBzJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0QWdlbnQ6IEFnZW50LFxuXHRNRVRIT0RTOiBNRVRIT0RTLFxuXHRTVEFUVVNfQ09ERVM6IFNUQVRVU19DT0RFUyxcblx0ZGVmYXVsdDogX3BvbHlmaWxsTm9kZV9odHRwcyxcblx0Z2V0OiBnZXQsXG5cdHJlcXVlc3Q6IHJlcXVlc3Rcbn0pO1xuXG52YXIgcmVxdWlyZSQkMyA9IC8qQF9fUFVSRV9fKi9nZXRBdWdtZW50ZWROYW1lc3BhY2UoX3BvbHlmaWxsTm9kZV9odHRwcyQxKTtcblxudmFyIHJlcXVpcmUkJDQgPSAvKkBfX1BVUkVfXyovZ2V0QXVnbWVudGVkTmFtZXNwYWNlKF9wb2x5ZmlsbE5vZGVfdXJsJDEpO1xuXG52YXIgbXNnID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxuZnVuY3Rpb24gYXJyYXlTZXQoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgaWYgKHNyYy5zdWJhcnJheSAmJiBkZXN0LnN1YmFycmF5KSB7XG4gICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gIH1cbn1cblxuXG52YXIgQnVmOCA9IFVpbnQ4QXJyYXk7XG52YXIgQnVmMTYgPSBVaW50MTZBcnJheTtcbnZhciBCdWYzMiA9IEludDMyQXJyYXk7XG4vLyBFbmFibGUvRGlzYWJsZSB0eXBlZCBhcnJheXMgdXNlLCBmb3IgdGVzdGluZ1xuLy9cblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLy92YXIgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0hVRkZNQU5fT05MWSAgICAgID0gMjtcbi8vdmFyIFpfUkxFICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQkMiA9IDQ7XG4vL3ZhciBaX0RFRkFVTFRfU1RSQVRFR1kgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xudmFyIFpfQklOQVJZJDEgPSAwO1xudmFyIFpfVEVYVCQxID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiQyID0gMjtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5mdW5jdGlvbiB6ZXJvJDEoYnVmKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoO1xuICB3aGlsZSAoLS1sZW4gPj0gMCkge1xuICAgIGJ1ZltsZW5dID0gMDtcbiAgfVxufVxuXG4vLyBGcm9tIHp1dGlsLmhcblxudmFyIFNUT1JFRF9CTE9DSyA9IDA7XG52YXIgU1RBVElDX1RSRUVTID0gMTtcbnZhciBEWU5fVFJFRVMgPSAyO1xuLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi9cblxudmFyIE1JTl9NQVRDSCQxID0gMztcbnZhciBNQVhfTUFUQ0gkMSA9IDI1ODtcbi8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi9cblxuLy8gRnJvbSBkZWZsYXRlLmhcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuXG4gKi9cblxudmFyIExFTkdUSF9DT0RFUyQxID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIExJVEVSQUxTJDEgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cblxudmFyIExfQ09ERVMkMSA9IExJVEVSQUxTJDEgKyAxICsgTEVOR1RIX0NPREVTJDE7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIERfQ09ERVMkMSA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG5cbnZhciBCTF9DT0RFUyQxID0gMTk7XG4vKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi9cblxudmFyIEhFQVBfU0laRSQxID0gMiAqIExfQ09ERVMkMSArIDE7XG4vKiBtYXhpbXVtIGhlYXAgc2l6ZSAqL1xuXG52YXIgTUFYX0JJVFMkMSA9IDE1O1xuLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovXG5cbnZhciBCdWZfc2l6ZSA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIE1BWF9CTF9CSVRTID0gNztcbi8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi9cblxudmFyIEVORF9CTE9DSyA9IDI1Njtcbi8qIGVuZCBvZiBibG9jayBsaXRlcmFsIGNvZGUgKi9cblxudmFyIFJFUF8zXzYgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfM18xMCA9IDE3O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovXG5cbnZhciBSRVBaXzExXzEzOCA9IDE4O1xuLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxuLyogZXNsaW50LWRpc2FibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cbnZhciBleHRyYV9sYml0cyA9IC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggbGVuZ3RoIGNvZGUgKi8gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDBdO1xuXG52YXIgZXh0cmFfZGJpdHMgPSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGRpc3RhbmNlIGNvZGUgKi8gWzAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxM107XG5cbnZhciBleHRyYV9ibGJpdHMgPSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqLyBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgN107XG5cbnZhciBibF9vcmRlciA9IFsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1XTtcbi8qIGVzbGludC1lbmFibGUgY29tbWEtc3BhY2luZyxhcnJheS1icmFja2V0LXNwYWNpbmcgKi9cblxuLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZ1xuICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuXG4gKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBMb2NhbCBkYXRhLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlLlxuICovXG5cbi8vIFdlIHByZS1maWxsIGFycmF5cyB3aXRoIDAgdG8gYXZvaWQgdW5pbml0aWFsaXplZCBnYXBzXG5cbnZhciBESVNUX0NPREVfTEVOID0gNTEyOyAvKiBzZWUgZGVmaW5pdGlvbiBvZiBhcnJheSBkaXN0X2NvZGUgYmVsb3cgKi9cblxuLy8gISEhISBVc2UgZmxhdCBhcnJheSBpbnNkZWFkIG9mIHN0cnVjdHVyZSwgRnJlcSA9IGkqMiwgTGVuID0gaSoyKzFcbnZhciBzdGF0aWNfbHRyZWUgPSBuZXcgQXJyYXkoKExfQ09ERVMkMSArIDIpICogMik7XG56ZXJvJDEoc3RhdGljX2x0cmVlKTtcbi8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vXG4gKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlclxuICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIF90cl9pbml0XG4gKiBiZWxvdykuXG4gKi9cblxudmFyIHN0YXRpY19kdHJlZSA9IG5ldyBBcnJheShEX0NPREVTJDEgKiAyKTtcbnplcm8kMShzdGF0aWNfZHRyZWUpO1xuLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlLiAoQWN0dWFsbHkgYSB0cml2aWFsIHRyZWUgc2luY2UgYWxsIGNvZGVzIHVzZVxuICogNSBiaXRzLilcbiAqL1xuXG52YXIgX2Rpc3RfY29kZSA9IG5ldyBBcnJheShESVNUX0NPREVfTEVOKTtcbnplcm8kMShfZGlzdF9jb2RlKTtcbi8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXNcbiAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2ZcbiAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLlxuICovXG5cbnZhciBfbGVuZ3RoX2NvZGUgPSBuZXcgQXJyYXkoTUFYX01BVENIJDEgLSBNSU5fTUFUQ0gkMSArIDEpO1xuemVybyQxKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2xlbmd0aCA9IG5ldyBBcnJheShMRU5HVEhfQ09ERVMkMSk7XG56ZXJvJDEoYmFzZV9sZW5ndGgpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBsZW5ndGggZm9yIGVhY2ggY29kZSAoMCA9IE1JTl9NQVRDSCkgKi9cblxudmFyIGJhc2VfZGlzdCA9IG5ldyBBcnJheShEX0NPREVTJDEpO1xuemVybyQxKGJhc2VfZGlzdCk7XG4vKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqL1xuXG5cbmZ1bmN0aW9uIFN0YXRpY1RyZWVEZXNjKHN0YXRpY190cmVlLCBleHRyYV9iaXRzLCBleHRyYV9iYXNlLCBlbGVtcywgbWF4X2xlbmd0aCkge1xuXG4gIHRoaXMuc3RhdGljX3RyZWUgPSBzdGF0aWNfdHJlZTsgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgPSBleHRyYV9iaXRzOyAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGNvZGUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2Jhc2UgPSBleHRyYV9iYXNlOyAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovXG4gIHRoaXMuZWxlbXMgPSBlbGVtczsgLyogbWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHJlZSAqL1xuICB0aGlzLm1heF9sZW5ndGggPSBtYXhfbGVuZ3RoOyAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovXG5cbiAgLy8gc2hvdyBpZiBgc3RhdGljX3RyZWVgIGhhcyBkYXRhIG9yIGR1bW15IC0gbmVlZGVkIGZvciBtb25vbW9ycGhpYyBvYmplY3RzXG4gIHRoaXMuaGFzX3N0cmVlID0gc3RhdGljX3RyZWUgJiYgc3RhdGljX3RyZWUubGVuZ3RoO1xufVxuXG5cbnZhciBzdGF0aWNfbF9kZXNjO1xudmFyIHN0YXRpY19kX2Rlc2M7XG52YXIgc3RhdGljX2JsX2Rlc2M7XG5cblxuZnVuY3Rpb24gVHJlZURlc2MoZHluX3RyZWUsIHN0YXRfZGVzYykge1xuICB0aGlzLmR5bl90cmVlID0gZHluX3RyZWU7IC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7IC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB0aGlzLnN0YXRfZGVzYyA9IHN0YXRfZGVzYzsgLyogdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgKi9cbn1cblxuXG5cbmZ1bmN0aW9uIGRfY29kZShkaXN0KSB7XG4gIHJldHVybiBkaXN0IDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2ICsgKGRpc3QgPj4+IDcpXTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIE91dHB1dCBhIHNob3J0IExTQiBmaXJzdCBvbiB0aGUgc3RyZWFtLlxuICogSU4gYXNzZXJ0aW9uOiB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiBwZW5kaW5nQnVmLlxuICovXG5mdW5jdGlvbiBwdXRfc2hvcnQocywgdykge1xuICAvLyAgICBwdXRfYnl0ZShzLCAodWNoKSgodykgJiAweGZmKSk7XG4gIC8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdIC8qLkNvZGUqLyAsIHRyZWVbYyAqIDIgKyAxXSAvKi5MZW4qLyApO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmV2ZXJzZSB0aGUgZmlyc3QgbGVuIGJpdHMgb2YgYSBjb2RlLCB1c2luZyBzdHJhaWdodGZvcndhcmQgY29kZSAoYSBmYXN0ZXJcbiAqIG1ldGhvZCB3b3VsZCB1c2UgYSB0YWJsZSlcbiAqIElOIGFzc2VydGlvbjogMSA8PSBsZW4gPD0gMTVcbiAqL1xuZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLCBsZW4pIHtcbiAgdmFyIHJlcyA9IDA7XG4gIGRvIHtcbiAgICByZXMgfD0gY29kZSAmIDE7XG4gICAgY29kZSA+Pj49IDE7XG4gICAgcmVzIDw8PSAxO1xuICB9IHdoaWxlICgtLWxlbiA+IDApO1xuICByZXR1cm4gcmVzID4+PiAxO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIGJpX2ZsdXNoKHMpIHtcbiAgaWYgKHMuYmlfdmFsaWQgPT09IDE2KSB7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IDA7XG4gICAgcy5iaV92YWxpZCA9IDA7XG5cbiAgfSBlbHNlIGlmIChzLmJpX3ZhbGlkID49IDgpIHtcbiAgICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IHMuYmlfYnVmICYgMHhmZjtcbiAgICBzLmJpX2J1ZiA+Pj0gODtcbiAgICBzLmJpX3ZhbGlkIC09IDg7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoXG4gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suXG4gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZFxuICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGVcbiAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC5cbiAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXNcbiAqICAgICBub3QgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2VuX2JpdGxlbihzLCBkZXNjKSB7XG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG4gIHZhciB0cmVlID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIG1heF9jb2RlID0gZGVzYy5tYXhfY29kZTtcbiAgdmFyIHN0cmVlID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIHZhciBoYXNfc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7XG4gIHZhciBleHRyYSA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2JpdHM7XG4gIHZhciBiYXNlID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYmFzZTtcbiAgdmFyIG1heF9sZW5ndGggPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO1xuICB2YXIgaDsgLyogaGVhcCBpbmRleCAqL1xuICB2YXIgbiwgbTsgLyogaXRlcmF0ZSBvdmVyIHRoZSB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBiaXRzOyAvKiBiaXQgbGVuZ3RoICovXG4gIHZhciB4Yml0czsgLyogZXh0cmEgYml0cyAqL1xuICB2YXIgZjsgLyogZnJlcXVlbmN5ICovXG4gIHZhciBvdmVyZmxvdyA9IDA7IC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovXG5cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUyQxOyBiaXRzKyspIHtcbiAgICBzLmJsX2NvdW50W2JpdHNdID0gMDtcbiAgfVxuXG4gIC8qIEluIGEgZmlyc3QgcGFzcywgY29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyAod2hpY2ggbWF5XG4gICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLlxuICAgKi9cbiAgdHJlZVtzLmhlYXBbcy5oZWFwX21heF0gKiAyICsgMV0gLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkUkMTsgaCsrKSB7XG4gICAgbiA9IHMuaGVhcFtoXTtcbiAgICBiaXRzID0gdHJlZVt0cmVlW24gKiAyICsgMV0gLyouRGFkKi8gKiAyICsgMV0gLyouTGVuKi8gKyAxO1xuICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkge1xuICAgICAgYml0cyA9IG1heF9sZW5ndGg7XG4gICAgICBvdmVyZmxvdysrO1xuICAgIH1cbiAgICB0cmVlW24gKiAyICsgMV0gLyouTGVuKi8gPSBiaXRzO1xuICAgIC8qIFdlIG92ZXJ3cml0ZSB0cmVlW25dLkRhZCB3aGljaCBpcyBubyBsb25nZXIgbmVlZGVkICovXG5cbiAgICBpZiAobiA+IG1heF9jb2RlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8qIG5vdCBhIGxlYWYgbm9kZSAqL1xuXG4gICAgcy5ibF9jb3VudFtiaXRzXSsrO1xuICAgIHhiaXRzID0gMDtcbiAgICBpZiAobiA+PSBiYXNlKSB7XG4gICAgICB4Yml0cyA9IGV4dHJhW24gLSBiYXNlXTtcbiAgICB9XG4gICAgZiA9IHRyZWVbbiAqIDJdIC8qLkZyZXEqLyA7XG4gICAgcy5vcHRfbGVuICs9IGYgKiAoYml0cyArIHhiaXRzKTtcbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gKz0gZiAqIChzdHJlZVtuICogMiArIDFdIC8qLkxlbiovICsgeGJpdHMpO1xuICAgIH1cbiAgfVxuICBpZiAob3ZlcmZsb3cgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUcmFjZSgoc3RkZXJyLFwiXFxuYml0IGxlbmd0aCBvdmVyZmxvd1xcblwiKSk7XG4gIC8qIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBvbiBvYmoyIGFuZCBwaWMgb2YgdGhlIENhbGdhcnkgY29ycHVzICovXG5cbiAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi9cbiAgZG8ge1xuICAgIGJpdHMgPSBtYXhfbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAocy5ibF9jb3VudFtiaXRzXSA9PT0gMCkge1xuICAgICAgYml0cy0tO1xuICAgIH1cbiAgICBzLmJsX2NvdW50W2JpdHNdLS07IC8qIG1vdmUgb25lIGxlYWYgZG93biB0aGUgdHJlZSAqL1xuICAgIHMuYmxfY291bnRbYml0cyArIDFdICs9IDI7IC8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi9cbiAgICBzLmJsX2NvdW50W21heF9sZW5ndGhdLS07XG4gICAgLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCxcbiAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF1cbiAgICAgKi9cbiAgICBvdmVyZmxvdyAtPSAyO1xuICB9IHdoaWxlIChvdmVyZmxvdyA+IDApO1xuXG4gIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS5cbiAgICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbFxuICAgKiBsZW5ndGhzIGluc3RlYWQgb2YgZml4aW5nIG9ubHkgdGhlIHdyb25nIG9uZXMuIFRoaXMgaWRlYSBpcyB0YWtlblxuICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLilcbiAgICovXG4gIGZvciAoYml0cyA9IG1heF9sZW5ndGg7IGJpdHMgIT09IDA7IGJpdHMtLSkge1xuICAgIG4gPSBzLmJsX2NvdW50W2JpdHNdO1xuICAgIHdoaWxlIChuICE9PSAwKSB7XG4gICAgICBtID0gcy5oZWFwWy0taF07XG4gICAgICBpZiAobSA+IG1heF9jb2RlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXSAvKi5MZW4qLyAhPT0gYml0cykge1xuICAgICAgICAvLyBUcmFjZSgoc3RkZXJyLFwiY29kZSAlZCBiaXRzICVkLT4lZFxcblwiLCBtLCB0cmVlW21dLkxlbiwgYml0cykpO1xuICAgICAgICBzLm9wdF9sZW4gKz0gKGJpdHMgLSB0cmVlW20gKiAyICsgMV0gLyouTGVuKi8gKSAqIHRyZWVbbSAqIDJdIC8qLkZyZXEqLyA7XG4gICAgICAgIHRyZWVbbSAqIDIgKyAxXSAvKi5MZW4qLyA9IGJpdHM7XG4gICAgICB9XG4gICAgICBuLS07XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmVcbiAqIG9wdGltYWwpLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3JcbiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vblxuICogICAgIHplcm8gY29kZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpIHtcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgICAgICAgICAgIC8qIHRoZSB0cmVlIHRvIGRlY29yYXRlICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgICAgICAgICAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbi8vICAgIHVzaGYgKmJsX2NvdW50OyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggKi9cblxuICB2YXIgbmV4dF9jb2RlID0gbmV3IEFycmF5KE1BWF9CSVRTJDEgKyAxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi9cbiAgdmFyIGJpdHM7IC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgLyogY29kZSBpbmRleCAqL1xuXG4gIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlc1xuICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC5cbiAgICovXG4gIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFMkMTsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICB9XG4gIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGVcbiAgICogbXVzdCBiZSBhbGwgb25lcy5cbiAgICovXG4gIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLFxuICAvLyAgICAgICAgXCJpbmNvbnNpc3RlbnQgYml0IGNvdW50c1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgXCIsIG1heF9jb2RlKSk7XG5cbiAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgdmFyIGxlbiA9IHRyZWVbbiAqIDIgKyAxXSAvKi5MZW4qLyA7XG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovXG4gICAgdHJlZVtuICogMl0gLyouQ29kZSovID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pO1xuXG4gICAgLy9UcmFjZWN2KHRyZWUgIT0gc3RhdGljX2x0cmVlLCAoc3RkZXJyLFwiXFxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSBcIixcbiAgICAvLyAgICAgbiwgKGlzZ3JhcGgobikgPyBuIDogJyAnKSwgbGVuLCB0cmVlW25dLkNvZGUsIG5leHRfY29kZVtsZW5dLTEpKTtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyAnY29uc3RhbnQnIHRhYmxlcy5cbiAqL1xuZnVuY3Rpb24gdHJfc3RhdGljX2luaXQoKSB7XG4gIHZhciBuOyAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7IC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7IC8qIGxlbmd0aCB2YWx1ZSAqL1xuICB2YXIgY29kZTsgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgLyogZGlzdGFuY2UgaW5kZXggKi9cbiAgdmFyIGJsX2NvdW50ID0gbmV3IEFycmF5KE1BWF9CSVRTJDEgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy8gZG8gY2hlY2sgaW4gX3RyX2luaXQoKVxuICAvL2lmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47XG5cbiAgLyogRm9yIHNvbWUgZW1iZWRkZWQgdGFyZ2V0cywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm90IGluaXRpYWxpemVkOiAqL1xuICAvKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICAgIHN0YXRpY19sX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfbHRyZWU7XG4gICAgc3RhdGljX2xfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfbGJpdHM7XG4gICAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgICBzdGF0aWNfZF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9kYml0cztcbiAgICBzdGF0aWNfYmxfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfYmxiaXRzO1xuICAjZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyQxIC0gMTsgY29kZSsrKSB7XG4gICAgYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfbGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGxlbmd0aCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGxlbmd0aCAhPSAyNTZcIik7XG4gIC8qIE5vdGUgdGhhdCB0aGUgbGVuZ3RoIDI1NSAobWF0Y2ggbGVuZ3RoIDI1OCkgY2FuIGJlIHJlcHJlc2VudGVkXG4gICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlXG4gICAqIG92ZXJ3cml0ZSBsZW5ndGhfY29kZVsyNTVdIHRvIHVzZSB0aGUgYmVzdCBlbmNvZGluZzpcbiAgICovXG4gIF9sZW5ndGhfY29kZVtsZW5ndGggLSAxXSA9IGNvZGU7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBkaXN0ICgwLi4zMkspIC0+IGRpc3QgY29kZSAoMC4uMjkpICovXG4gIGRpc3QgPSAwO1xuICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgMTY7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7XG4gICAgZm9yIChuID0gMDsgbiA8ICgxIDw8IGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7XG4gICAgICBfZGlzdF9jb2RlW2Rpc3QrK10gPSBjb2RlO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZGlzdCA9PSAyNTYsIFwidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2XCIpO1xuICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi9cbiAgZm9yICg7IGNvZGUgPCBEX0NPREVTJDE7IGNvZGUrKykge1xuICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNztcbiAgICBmb3IgKG4gPSAwOyBuIDwgKDEgPDwgKGV4dHJhX2RiaXRzW2NvZGVdIC0gNykpOyBuKyspIHtcbiAgICAgIF9kaXN0X2NvZGVbMjU2ICsgZGlzdCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChkaXN0ID09IDI1NiwgXCJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyXCIpO1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgY29kZXMgb2YgdGhlIHN0YXRpYyBsaXRlcmFsIHRyZWUgKi9cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUyQxOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIHdoaWxlIChuIDw9IDI1NSkge1xuICAgIHN0YXRpY19sdHJlZVtuICogMiArIDFdIC8qLkxlbiovID0gOTtcbiAgICBuKys7XG4gICAgYmxfY291bnRbOV0rKztcbiAgfVxuICB3aGlsZSAobiA8PSAyNzkpIHtcbiAgICBzdGF0aWNfbHRyZWVbbiAqIDIgKyAxXSAvKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0gLyouTGVuKi8gPSA4O1xuICAgIG4rKztcbiAgICBibF9jb3VudFs4XSsrO1xuICB9XG4gIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZVxuICAgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGVcbiAgICogYWxsIG9uZXMpXG4gICAqL1xuICBnZW5fY29kZXMoc3RhdGljX2x0cmVlLCBMX0NPREVTJDEgKyAxLCBibF9jb3VudCk7XG5cbiAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovXG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTJDE7IG4rKykge1xuICAgIHN0YXRpY19kdHJlZVtuICogMiArIDFdIC8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDJdIC8qLkNvZGUqLyA9IGJpX3JldmVyc2UobiwgNSk7XG4gIH1cblxuICAvLyBOb3cgZGF0YSByZWFkeSBhbmQgd2UgY2FuIGluaXQgc3RhdGljIHRyZWVzXG4gIHN0YXRpY19sX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMkMSArIDEsIExfQ09ERVMkMSwgTUFYX0JJVFMkMSk7XG4gIHN0YXRpY19kX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgRF9DT0RFUyQxLCBNQVhfQklUUyQxKTtcbiAgc3RhdGljX2JsX2Rlc2MgPSBuZXcgU3RhdGljVHJlZURlc2MobmV3IEFycmF5KDApLCBleHRyYV9ibGJpdHMsIDAsIEJMX0NPREVTJDEsIE1BWF9CTF9CSVRTKTtcblxuICAvL3N0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSBhIG5ldyBibG9jay5cbiAqL1xuZnVuY3Rpb24gaW5pdF9ibG9jayhzKSB7XG4gIHZhciBuOyAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi9cblxuICAvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8IExfQ09ERVMkMTsgbisrKSB7XG4gICAgcy5keW5fbHRyZWVbbiAqIDJdIC8qLkZyZXEqLyA9IDA7XG4gIH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVMkMTsgbisrKSB7XG4gICAgcy5keW5fZHRyZWVbbiAqIDJdIC8qLkZyZXEqLyA9IDA7XG4gIH1cbiAgZm9yIChuID0gMDsgbiA8IEJMX0NPREVTJDE7IG4rKykge1xuICAgIHMuYmxfdHJlZVtuICogMl0gLyouRnJlcSovID0gMDtcbiAgfVxuXG4gIHMuZHluX2x0cmVlW0VORF9CTE9DSyAqIDJdIC8qLkZyZXEqLyA9IDE7XG4gIHMub3B0X2xlbiA9IHMuc3RhdGljX2xlbiA9IDA7XG4gIHMubGFzdF9saXQgPSBzLm1hdGNoZXMgPSAwO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5XG4gKi9cbmZ1bmN0aW9uIGJpX3dpbmR1cChzKSB7XG4gIGlmIChzLmJpX3ZhbGlkID4gOCkge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHtcbiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjtcbiAgfVxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzXG4gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKSB7XG4vL0RlZmxhdGVTdGF0ZSAqcztcbi8vY2hhcmYgICAgKmJ1ZjsgICAgLyogdGhlIGlucHV0IGRhdGEgKi9cbi8vdW5zaWduZWQgbGVuOyAgICAgLyogaXRzIGxlbmd0aCAqL1xuLy9pbnQgICAgICBoZWFkZXI7ICAvKiB0cnVlIGlmIGJsb2NrIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gKi9cblxuICBiaV93aW5kdXAocyk7IC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi9cblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcHV0X3Nob3J0KHMsIGxlbik7XG4gICAgcHV0X3Nob3J0KHMsIH5sZW4pO1xuICB9XG4gIC8vICB3aGlsZSAobGVuLS0pIHtcbiAgLy8gICAgcHV0X2J5dGUocywgKmJ1ZisrKTtcbiAgLy8gIH1cbiAgYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuLCBzLnBlbmRpbmcpO1xuICBzLnBlbmRpbmcgKz0gbGVuO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkge1xuICB2YXIgX24yID0gbiAqIDI7XG4gIHZhciBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0gLyouRnJlcSovIDwgdHJlZVtfbTJdIC8qLkZyZXEqLyB8fFxuICAgICh0cmVlW19uMl0gLyouRnJlcSovID09PSB0cmVlW19tMl0gLyouRnJlcSovICYmIGRlcHRoW25dIDw9IGRlcHRoW21dKSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVzdG9yZSB0aGUgaGVhcCBwcm9wZXJ0eSBieSBtb3ZpbmcgZG93biB0aGUgdHJlZSBzdGFydGluZyBhdCBub2RlIGssXG4gKiBleGNoYW5naW5nIGEgbm9kZSB3aXRoIHRoZSBzbWFsbGVzdCBvZiBpdHMgdHdvIHNvbnMgaWYgbmVjZXNzYXJ5LCBzdG9wcGluZ1xuICogd2hlbiB0aGUgaGVhcCBwcm9wZXJ0eSBpcyByZS1lc3RhYmxpc2hlZCAoZWFjaCBmYXRoZXIgc21hbGxlciB0aGFuIGl0c1xuICogdHdvIHNvbnMpLlxuICovXG5mdW5jdGlvbiBwcWRvd25oZWFwKHMsIHRyZWUsIGspXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY3RfZGF0YSAqdHJlZTsgIC8qIHRoZSB0cmVlIHRvIHJlc3RvcmUgKi9cbi8vICAgIGludCBrOyAgICAgICAgICAgICAgIC8qIG5vZGUgdG8gbW92ZSBkb3duICovXG57XG4gIHZhciB2ID0gcy5oZWFwW2tdO1xuICB2YXIgaiA9IGsgPDwgMTsgLyogbGVmdCBzb24gb2YgayAqL1xuICB3aGlsZSAoaiA8PSBzLmhlYXBfbGVuKSB7XG4gICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi9cbiAgICBpZiAoaiA8IHMuaGVhcF9sZW4gJiZcbiAgICAgIHNtYWxsZXIodHJlZSwgcy5oZWFwW2ogKyAxXSwgcy5oZWFwW2pdLCBzLmRlcHRoKSkge1xuICAgICAgaisrO1xuICAgIH1cbiAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqL1xuICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMuaGVhcFtqXSwgcy5kZXB0aCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovXG4gICAgcy5oZWFwW2tdID0gcy5oZWFwW2pdO1xuICAgIGsgPSBqO1xuXG4gICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqL1xuICAgIGogPDw9IDE7XG4gIH1cbiAgcy5oZWFwW2tdID0gdjtcbn1cblxuXG4vLyBpbmxpbmVkIG1hbnVhbGx5XG4vLyB2YXIgU01BTExFU1QgPSAxO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlc1xuICovXG5mdW5jdGlvbiBjb21wcmVzc19ibG9jayhzLCBsdHJlZSwgZHRyZWUpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgY29uc3QgY3RfZGF0YSAqbHRyZWU7IC8qIGxpdGVyYWwgdHJlZSAqL1xuLy8gICAgY29uc3QgY3RfZGF0YSAqZHRyZWU7IC8qIGRpc3RhbmNlIHRyZWUgKi9cbntcbiAgdmFyIGRpc3Q7IC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsYzsgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovXG4gIHZhciBseCA9IDA7IC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cbiAgdmFyIGNvZGU7IC8qIHRoZSBjb2RlIHRvIHNlbmQgKi9cbiAgdmFyIGV4dHJhOyAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovXG5cbiAgaWYgKHMubGFzdF9saXQgIT09IDApIHtcbiAgICBkbyB7XG4gICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV0pO1xuICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07XG4gICAgICBseCsrO1xuXG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMkMSArIDEsIGx0cmVlKTsgLyogc2VuZCB0aGUgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7IC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovXG4gICAgICAgIH1cbiAgICAgICAgZGlzdC0tOyAvKiBkaXN0IGlzIG5vdyB0aGUgbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7XG4gICAgICAgIC8vQXNzZXJ0IChjb2RlIDwgRF9DT0RFUywgXCJiYWQgZF9jb2RlXCIpO1xuXG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlLCBkdHJlZSk7IC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTtcbiAgICAgICAgaWYgKGV4dHJhICE9PSAwKSB7XG4gICAgICAgICAgZGlzdCAtPSBiYXNlX2Rpc3RbY29kZV07XG4gICAgICAgICAgc2VuZF9iaXRzKHMsIGRpc3QsIGV4dHJhKTsgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlID0gZGVzYy5keW5fdHJlZTtcbiAgdmFyIHN0cmVlID0gZGVzYy5zdGF0X2Rlc2Muc3RhdGljX3RyZWU7XG4gIHZhciBoYXNfc3RyZWUgPSBkZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWU7XG4gIHZhciBlbGVtcyA9IGRlc2Muc3RhdF9kZXNjLmVsZW1zO1xuICB2YXIgbiwgbTsgLyogaXRlcmF0ZSBvdmVyIGhlYXAgZWxlbWVudHMgKi9cbiAgdmFyIG1heF9jb2RlID0gLTE7IC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xuICB2YXIgbm9kZTsgLyogbmV3IG5vZGUgYmVpbmcgY3JlYXRlZCAqL1xuXG4gIC8qIENvbnN0cnVjdCB0aGUgaW5pdGlhbCBoZWFwLCB3aXRoIGxlYXN0IGZyZXF1ZW50IGVsZW1lbnQgaW5cbiAgICogaGVhcFtTTUFMTEVTVF0uIFRoZSBzb25zIG9mIGhlYXBbbl0gYXJlIGhlYXBbMipuXSBhbmQgaGVhcFsyKm4rMV0uXG4gICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuXG4gICAqL1xuICBzLmhlYXBfbGVuID0gMDtcbiAgcy5oZWFwX21heCA9IEhFQVBfU0laRSQxO1xuXG4gIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7XG4gICAgaWYgKHRyZWVbbiAqIDJdIC8qLkZyZXEqLyAhPT0gMCkge1xuICAgICAgcy5oZWFwWysrcy5oZWFwX2xlbl0gPSBtYXhfY29kZSA9IG47XG4gICAgICBzLmRlcHRoW25dID0gMDtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0cmVlW24gKiAyICsgMV0gLyouTGVuKi8gPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsXG4gICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZVxuICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdFxuICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LlxuICAgKi9cbiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7XG4gICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTtcbiAgICB0cmVlW25vZGUgKiAyXSAvKi5GcmVxKi8gPSAxO1xuICAgIHMuZGVwdGhbbm9kZV0gPSAwO1xuICAgIHMub3B0X2xlbi0tO1xuXG4gICAgaWYgKGhhc19zdHJlZSkge1xuICAgICAgcy5zdGF0aWNfbGVuIC09IHN0cmVlW25vZGUgKiAyICsgMV0gLyouTGVuKi8gO1xuICAgIH1cbiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi9cbiAgfVxuICBkZXNjLm1heF9jb2RlID0gbWF4X2NvZGU7XG5cbiAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLFxuICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczpcbiAgICovXG4gIGZvciAobiA9IChzLmhlYXBfbGVuID4+IDEgLyppbnQgLzIqLyApOyBuID49IDE7IG4tLSkge1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgbik7XG4gIH1cblxuICAvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvXG4gICAqIGZyZXF1ZW50IG5vZGVzLlxuICAgKi9cbiAgbm9kZSA9IGVsZW1zOyAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi9cbiAgZG8ge1xuICAgIC8vcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi9cbiAgICAvKioqIHBxcmVtb3ZlICoqKi9cbiAgICBuID0gcy5oZWFwWzEgLypTTUFMTEVTVCovIF07XG4gICAgcy5oZWFwWzEgLypTTUFMTEVTVCovIF0gPSBzLmhlYXBbcy5oZWFwX2xlbi0tXTtcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEgLypTTUFMTEVTVCovICk7XG4gICAgLyoqKi9cblxuICAgIG0gPSBzLmhlYXBbMSAvKlNNQUxMRVNUKi8gXTsgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi9cblxuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbjsgLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqL1xuICAgIHMuaGVhcFstLXMuaGVhcF9tYXhdID0gbTtcblxuICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlIGZhdGhlciBvZiBuIGFuZCBtICovXG4gICAgdHJlZVtub2RlICogMl0gLyouRnJlcSovID0gdHJlZVtuICogMl0gLyouRnJlcSovICsgdHJlZVttICogMl0gLyouRnJlcSovIDtcbiAgICBzLmRlcHRoW25vZGVdID0gKHMuZGVwdGhbbl0gPj0gcy5kZXB0aFttXSA/IHMuZGVwdGhbbl0gOiBzLmRlcHRoW21dKSArIDE7XG4gICAgdHJlZVtuICogMiArIDFdIC8qLkRhZCovID0gdHJlZVttICogMiArIDFdIC8qLkRhZCovID0gbm9kZTtcblxuICAgIC8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovXG4gICAgcy5oZWFwWzEgLypTTUFMTEVTVCovIF0gPSBub2RlKys7XG4gICAgcHFkb3duaGVhcChzLCB0cmVlLCAxIC8qU01BTExFU1QqLyApO1xuXG4gIH0gd2hpbGUgKHMuaGVhcF9sZW4gPj0gMik7XG5cbiAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMSAvKlNNQUxMRVNUKi8gXTtcblxuICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LiBXZSBjYW4gbm93XG4gICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy5cbiAgICovXG4gIGdlbl9iaXRsZW4ocywgZGVzYyk7XG5cbiAgLyogVGhlIGZpZWxkIGxlbiBpcyBub3cgc2V0LCB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGJpdCBjb2RlcyAqL1xuICBnZW5fY29kZXModHJlZSwgbWF4X2NvZGUsIHMuYmxfY291bnQpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2Rlc1xuICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS5cbiAqL1xuZnVuY3Rpb24gc2Nhbl90cmVlKHMsIHRyZWUsIG1heF9jb2RlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAgLyogdGhlIHRyZWUgdG8gYmUgc2Nhbm5lZCAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi9cbntcbiAgdmFyIG47IC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0gLyouTGVuKi8gOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovXG5cbiAgdmFyIGNvdW50ID0gMDsgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi9cbiAgdmFyIG1heF9jb3VudCA9IDc7IC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7IC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgIG1heF9jb3VudCA9IDEzODtcbiAgICBtaW5fY291bnQgPSAzO1xuICB9XG4gIHRyZWVbKG1heF9jb2RlICsgMSkgKiAyICsgMV0gLyouTGVuKi8gPSAweGZmZmY7IC8qIGd1YXJkICovXG5cbiAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7XG4gICAgY3VybGVuID0gbmV4dGxlbjtcbiAgICBuZXh0bGVuID0gdHJlZVsobiArIDEpICogMiArIDFdIC8qLkxlbiovIDtcblxuICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgY29udGludWU7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7XG4gICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0gLyouRnJlcSovICs9IGNvdW50O1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gIT09IDApIHtcblxuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzLmJsX3RyZWVbY3VybGVuICogMl0gLyouRnJlcSovICsrO1xuICAgICAgfVxuICAgICAgcy5ibF90cmVlW1JFUF8zXzYgKiAyXSAvKi5GcmVxKi8gKys7XG5cbiAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7XG4gICAgICBzLmJsX3RyZWVbUkVQWl8zXzEwICogMl0gLyouRnJlcSovICsrO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdIC8qLkZyZXEqLyArKztcbiAgICB9XG5cbiAgICBjb3VudCA9IDA7XG4gICAgcHJldmxlbiA9IGN1cmxlbjtcblxuICAgIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIGlmIChjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIG1heF9jb3VudCA9IDY7XG4gICAgICBtaW5fY291bnQgPSAzO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIG1heF9jb3VudCA9IDc7XG4gICAgICBtaW5fY291bnQgPSA0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSBpbiBjb21wcmVzc2VkIGZvcm0sIHVzaW5nIHRoZSBjb2RlcyBpblxuICogYmxfdHJlZS5cbiAqL1xuZnVuY3Rpb24gc2VuZF90cmVlKHMsIHRyZWUsIG1heF9jb2RlKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7IC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7IC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdIC8qLkxlbiovIDsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7IC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAvKiBtaW4gcmVwZWF0IGNvdW50ICovXG5cbiAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi9cbiAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXSAvKi5MZW4qLyA7XG5cbiAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT09IG5leHRsZW4pIHtcbiAgICAgIGNvbnRpbnVlO1xuXG4gICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkge1xuICAgICAgZG8ge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqL1xuXG4gIC8qIERldGVybWluZSB0aGUgYml0IGxlbmd0aCBmcmVxdWVuY2llcyBmb3IgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi9cbiAgc2Nhbl90cmVlKHMsIHMuZHluX2x0cmVlLCBzLmxfZGVzYy5tYXhfY29kZSk7XG4gIHNjYW5fdHJlZShzLCBzLmR5bl9kdHJlZSwgcy5kX2Rlc2MubWF4X2NvZGUpO1xuXG4gIC8qIEJ1aWxkIHRoZSBiaXQgbGVuZ3RoIHRyZWU6ICovXG4gIGJ1aWxkX3RyZWUocywgcy5ibF9kZXNjKTtcbiAgLyogb3B0X2xlbiBub3cgaW5jbHVkZXMgdGhlIGxlbmd0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMsIGV4Y2VwdFxuICAgKiB0aGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aHMgY29kZXMgYW5kIHRoZSA1KzUrNCBiaXRzIGZvciB0aGUgY291bnRzLlxuICAgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBiaXQgbGVuZ3RoIGNvZGVzIHRvIHNlbmQuIFRoZSBwa3ppcCBmb3JtYXRcbiAgICogcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXNcbiAgICogMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKVxuICAgKi9cbiAgZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTJDEgLSAxOyBtYXhfYmxpbmRleCA+PSAzOyBtYXhfYmxpbmRleC0tKSB7XG4gICAgaWYgKHMuYmxfdHJlZVtibF9vcmRlclttYXhfYmxpbmRleF0gKiAyICsgMV0gLyouTGVuKi8gIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICAvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqL1xuICBzLm9wdF9sZW4gKz0gMyAqIChtYXhfYmxpbmRleCArIDEpICsgNSArIDUgKyA0O1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmR5biB0cmVlczogZHluICVsZCwgc3RhdCAlbGRcIixcbiAgLy8gICAgICAgIHMtPm9wdF9sZW4sIHMtPnN0YXRpY19sZW4pKTtcblxuICByZXR1cm4gbWF4X2JsaW5kZXg7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGVcbiAqIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMsIHRoZSBsaXRlcmFsIHRyZWUgYW5kIHRoZSBkaXN0YW5jZSB0cmVlLlxuICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxjb2RlcyA+PSA0LlxuICovXG5mdW5jdGlvbiBzZW5kX2FsbF90cmVlcyhzLCBsY29kZXMsIGRjb2RlcywgYmxjb2Rlcylcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBpbnQgbGNvZGVzLCBkY29kZXMsIGJsY29kZXM7IC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovXG57XG4gIHZhciByYW5rOyAvKiBpbmRleCBpbiBibF9vcmRlciAqL1xuXG4gIC8vQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgXCJub3QgZW5vdWdoIGNvZGVzXCIpO1xuICAvL0Fzc2VydCAobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUyxcbiAgLy8gICAgICAgIFwidG9vIG1hbnkgY29kZXNcIik7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiXFxuYmwgY291bnRzOiBcIikpO1xuICBzZW5kX2JpdHMocywgbGNvZGVzIC0gMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIHNlbmRfYml0cyhzLCBkY29kZXMgLSAxLCA1KTtcbiAgc2VuZF9iaXRzKHMsIGJsY29kZXMgLSA0LCA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqL1xuICBmb3IgKHJhbmsgPSAwOyByYW5rIDwgYmxjb2RlczsgcmFuaysrKSB7XG4gICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb2RlICUyZCBcIiwgYmxfb3JkZXJbcmFua10pKTtcbiAgICBzZW5kX2JpdHMocywgcy5ibF90cmVlW2JsX29yZGVyW3JhbmtdICogMiArIDFdIC8qLkxlbiovICwgMyk7XG4gIH1cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOyAvKiBsaXRlcmFsIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuICogMl0gLyouRnJlcSovICE9PSAwKSkge1xuICAgICAgcmV0dXJuIFpfQklOQVJZJDE7XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKFwid2hpdGUtbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBpZiAocy5keW5fbHRyZWVbOSAqIDJdIC8qLkZyZXEqLyAhPT0gMCB8fCBzLmR5bl9sdHJlZVsxMCAqIDJdIC8qLkZyZXEqLyAhPT0gMCB8fFxuICAgIHMuZHluX2x0cmVlWzEzICogMl0gLyouRnJlcSovICE9PSAwKSB7XG4gICAgcmV0dXJuIFpfVEVYVCQxO1xuICB9XG4gIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFMkMTsgbisrKSB7XG4gICAgaWYgKHMuZHluX2x0cmVlW24gKiAyXSAvKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHJldHVybiBaX1RFWFQkMTtcbiAgICB9XG4gIH1cblxuICAvKiBUaGVyZSBhcmUgbm8gXCJibGFjay1saXN0ZWRcIiBvciBcIndoaXRlLWxpc3RlZFwiIGJ5dGVzOlxuICAgKiB0aGlzIHN0cmVhbSBlaXRoZXIgaXMgZW1wdHkgb3IgaGFzIHRvbGVyYXRlZCAoXCJncmF5LWxpc3RlZFwiKSBieXRlcyBvbmx5LlxuICAgKi9cbiAgcmV0dXJuIFpfQklOQVJZJDE7XG59XG5cblxudmFyIHN0YXRpY19pbml0X2RvbmUgPSBmYWxzZTtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIF90cl9pbml0KHMpIHtcblxuICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHtcbiAgICB0cl9zdGF0aWNfaW5pdCgpO1xuICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xuICB9XG5cbiAgcy5sX2Rlc2MgPSBuZXcgVHJlZURlc2Mocy5keW5fbHRyZWUsIHN0YXRpY19sX2Rlc2MpO1xuICBzLmRfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSwgc3RhdGljX2RfZGVzYyk7XG4gIHMuYmxfZGVzYyA9IG5ldyBUcmVlRGVzYyhzLmJsX3RyZWUsIHN0YXRpY19ibF9kZXNjKTtcblxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqL1xuICBpbml0X2Jsb2NrKHMpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBhIHN0b3JlZCBibG9ja1xuICovXG5mdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jayAqL1xuLy91bGcgc3RvcmVkX2xlbjsgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi9cbi8vaW50IGxhc3Q7ICAgICAgICAgLyogb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqL1xue1xuICBzZW5kX2JpdHMocywgKFNUT1JFRF9CTE9DSyA8PCAxKSArIChsYXN0ID8gMSA6IDApLCAzKTsgLyogc2VuZCBibG9jayB0eXBlICovXG4gIGNvcHlfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCB0cnVlKTsgLyogd2l0aCBoZWFkZXIgKi9cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuXG4gKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX3RyX2FsaWduKHMpIHtcbiAgc2VuZF9iaXRzKHMsIFNUQVRJQ19UUkVFUyA8PCAxLCAzKTtcbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgc3RhdGljX2x0cmVlKTtcbiAgYmlfZmx1c2gocyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLCBzdGF0aWNcbiAqIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZS5cbiAqL1xuZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsIGJ1Ziwgc3RvcmVkX2xlbiwgbGFzdClcbi8vRGVmbGF0ZVN0YXRlICpzO1xuLy9jaGFyZiAqYnVmOyAgICAgICAvKiBpbnB1dCBibG9jaywgb3IgTlVMTCBpZiB0b28gb2xkICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHZhciBvcHRfbGVuYiwgc3RhdGljX2xlbmI7IC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgdmFyIG1heF9ibGluZGV4ID0gMDsgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqL1xuXG4gIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi9cbiAgaWYgKHMubGV2ZWwgPiAwKSB7XG5cbiAgICAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBiaW5hcnkgb3IgdGV4dCAqL1xuICAgIGlmIChzLnN0cm0uZGF0YV90eXBlID09PSBaX1VOS05PV04kMikge1xuICAgICAgcy5zdHJtLmRhdGFfdHlwZSA9IGRldGVjdF9kYXRhX3R5cGUocyk7XG4gICAgfVxuXG4gICAgLyogQ29uc3RydWN0IHRoZSBsaXRlcmFsIGFuZCBkaXN0YW5jZSB0cmVlcyAqL1xuICAgIGJ1aWxkX3RyZWUocywgcy5sX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZFwiLCBzLT5vcHRfbGVuLFxuICAgIC8vICAgICAgICBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgICBidWlsZF90cmVlKHMsIHMuZF9kZXNjKTtcbiAgICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJcXG5kaXN0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcbiAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2ZcbiAgICAgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuXG4gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXhcbiAgICAgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7XG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgdGhlIGJsb2NrIGxlbmd0aHMgaW4gYnl0ZXMuICovXG4gICAgb3B0X2xlbmIgPSAocy5vcHRfbGVuICsgMyArIDcpID4+PiAzO1xuICAgIHN0YXRpY19sZW5iID0gKHMuc3RhdGljX2xlbiArIDMgKyA3KSA+Pj4gMztcblxuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbm9wdCAlbHUoJWx1KSBzdGF0ICVsdSglbHUpIHN0b3JlZCAlbHUgbGl0ICV1IFwiLFxuICAgIC8vICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sXG4gICAgLy8gICAgICAgIHMtPmxhc3RfbGl0KSk7XG5cbiAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIHtcbiAgICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7XG4gICAgfVxuXG4gIH0gZWxzZSB7XG4gICAgLy8gQXNzZXJ0KGJ1ZiAhPSAoY2hhciopMCwgXCJsb3N0IGJ1ZlwiKTtcbiAgICBvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovXG4gIH1cblxuICBpZiAoKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iKSAmJiAoYnVmICE9PSAtMSkpIHtcbiAgICAvKiA0OiB0d28gd29yZHMgZm9yIHRoZSBsZW5ndGhzICovXG5cbiAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLlxuICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2VcbiAgICAgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG9cbiAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLlxuICAgICAqL1xuICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTtcblxuICB9IGVsc2UgaWYgKHMuc3RyYXRlZ3kgPT09IFpfRklYRUQkMiB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHMuZHluX2x0cmVlLCBzLmR5bl9kdHJlZSk7XG4gIH1cbiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsIFwiYmFkIGNvbXByZXNzZWQgc2l6ZVwiKTtcbiAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUJcbiAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuXG4gICAqL1xuICBpbml0X2Jsb2NrKHMpO1xuXG4gIGlmIChsYXN0KSB7XG4gICAgYmlfd2luZHVwKHMpO1xuICB9XG4gIC8vIFRyYWNldigoc3RkZXJyLFwiXFxuY29tcHJsZW4gJWx1KCVsdSkgXCIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLFxuICAvLyAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWZcbiAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gX3RyX3RhbGx5KHMsIGRpc3QsIGxjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG57XG4gIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdID0gKGRpc3QgPj4+IDgpICYgMHhmZjtcbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDIgKyAxXSA9IGRpc3QgJiAweGZmO1xuXG4gIHMucGVuZGluZ19idWZbcy5sX2J1ZiArIHMubGFzdF9saXRdID0gbGMgJiAweGZmO1xuICBzLmxhc3RfbGl0Kys7XG5cbiAgaWYgKGRpc3QgPT09IDApIHtcbiAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi9cbiAgICBzLmR5bl9sdHJlZVtsYyAqIDJdIC8qLkZyZXEqLyArKztcbiAgfSBlbHNlIHtcbiAgICBzLm1hdGNoZXMrKztcbiAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovXG4gICAgZGlzdC0tOyAvKiBkaXN0ID0gbWF0Y2ggZGlzdGFuY2UgLSAxICovXG4gICAgLy9Bc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJlxuICAgIC8vICAgICAgICh1c2gpbGMgPD0gKHVzaCkoTUFYX01BVENILU1JTl9NQVRDSCkgJiZcbiAgICAvLyAgICAgICAodXNoKWRfY29kZShkaXN0KSA8ICh1c2gpRF9DT0RFUywgIFwiX3RyX3RhbGx5OiBiYWQgbWF0Y2hcIik7XG5cbiAgICBzLmR5bl9sdHJlZVsoX2xlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTJDEgKyAxKSAqIDJdIC8qLkZyZXEqLyArKztcbiAgICBzLmR5bl9kdHJlZVtkX2NvZGUoZGlzdCkgKiAyXSAvKi5GcmVxKi8gKys7XG4gIH1cblxuICAvLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmFpbHRzLFxuICAvLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG5cbiAgLy8jaWZkZWYgVFJVTkNBVEVfQkxPQ0tcbiAgLy8gIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqL1xuICAvLyAgaWYgKChzLmxhc3RfbGl0ICYgMHgxZmZmKSA9PT0gMCAmJiBzLmxldmVsID4gMikge1xuICAvLyAgICAvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi9cbiAgLy8gICAgb3V0X2xlbmd0aCA9IHMubGFzdF9saXQqODtcbiAgLy8gICAgaW5fbGVuZ3RoID0gcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQ7XG4gIC8vXG4gIC8vICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHtcbiAgLy8gICAgICBvdXRfbGVuZ3RoICs9IHMuZHluX2R0cmVlW2Rjb2RlKjJdLyouRnJlcSovICogKDUgKyBleHRyYV9kYml0c1tkY29kZV0pO1xuICAvLyAgICB9XG4gIC8vICAgIG91dF9sZW5ndGggPj4+PSAzO1xuICAvLyAgICAvL1RyYWNldigoc3RkZXJyLFwiXFxubGFzdF9saXQgJXUsIGluICVsZCwgb3V0IH4lbGQoJWxkJSUpIFwiLFxuICAvLyAgICAvLyAgICAgICBzLT5sYXN0X2xpdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLFxuICAvLyAgICAvLyAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpO1xuICAvLyAgICBpZiAocy5tYXRjaGVzIDwgKHMubGFzdF9saXQ+PjEpLyppbnQgLzIqLyAmJiBvdXRfbGVuZ3RoIDwgKGluX2xlbmd0aD4+MSkvKmludCAvMiovKSB7XG4gIC8vICAgICAgcmV0dXJuIHRydWU7XG4gIC8vICAgIH1cbiAgLy8gIH1cbiAgLy8jZW5kaWZcblxuICByZXR1cm4gKHMubGFzdF9saXQgPT09IHMubGl0X2J1ZnNpemUgLSAxKTtcbiAgLyogV2UgYXZvaWQgZXF1YWxpdHkgd2l0aCBsaXRfYnVmc2l6ZSBiZWNhdXNlIG9mIHdyYXBhcm91bmQgYXQgNjRLXG4gICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvXG4gICAqIDY0Sy0xIGJ5dGVzLlxuICAgKi9cbn1cblxuLy8gTm90ZTogYWRsZXIzMiB0YWtlcyAxMiUgZm9yIGxldmVsIDAgYW5kIDIlIGZvciBsZXZlbCA2LlxuLy8gSXQgZG9lc24ndCB3b3J0aCB0byBtYWtlIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9uYSBhcyBpbiBvcmlnaW5hbC5cbi8vIFNtYWxsIHNpemUgaXMgcHJlZmVyYWJsZS5cblxuZnVuY3Rpb24gYWRsZXIzMihhZGxlciwgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgczEgPSAoYWRsZXIgJiAweGZmZmYpIHwwLFxuICAgICAgczIgPSAoKGFkbGVyID4+PiAxNikgJiAweGZmZmYpIHwwLFxuICAgICAgbiA9IDA7XG5cbiAgd2hpbGUgKGxlbiAhPT0gMCkge1xuICAgIC8vIFNldCBsaW1pdCB+IHR3aWNlIGxlc3MgdGhhbiA1NTUyLCB0byBrZWVwXG4gICAgLy8gczIgaW4gMzEtYml0cywgYmVjYXVzZSB3ZSBmb3JjZSBzaWduZWQgaW50cy5cbiAgICAvLyBpbiBvdGhlciBjYXNlICU9IHdpbGwgZmFpbC5cbiAgICBuID0gbGVuID4gMjAwMCA/IDIwMDAgOiBsZW47XG4gICAgbGVuIC09IG47XG5cbiAgICBkbyB7XG4gICAgICBzMSA9IChzMSArIGJ1Zltwb3MrK10pIHwwO1xuICAgICAgczIgPSAoczIgKyBzMSkgfDA7XG4gICAgfSB3aGlsZSAoLS1uKTtcblxuICAgIHMxICU9IDY1NTIxO1xuICAgIHMyICU9IDY1NTIxO1xuICB9XG5cbiAgcmV0dXJuIChzMSB8IChzMiA8PCAxNikpIHwwO1xufVxuXG4vLyBOb3RlOiB3ZSBjYW4ndCBnZXQgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QgaGVyZS5cbi8vIFNvIHdyaXRlIGNvZGUgdG8gbWluaW1pemUgc2l6ZSAtIG5vIHByZWdlbmVyYXRlZCB0YWJsZXNcbi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuXG5cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCAyNTY7IG4rKykge1xuICAgIGMgPSBuO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICBjID0gKChjICYgMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgIH1cbiAgICB0YWJsZVtuXSA9IGM7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHQgPSBjcmNUYWJsZSxcbiAgICAgIGVuZCA9IHBvcyArIGxlbjtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrKSB7XG4gICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gIH1cblxuICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0gkMSA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIJDEgPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbnZhciBaX0ZVTExfRkxVU0gkMSA9IDM7XG52YXIgWl9GSU5JU0gkMiA9IDQ7XG52YXIgWl9CTE9DSyQyID0gNTtcbi8vdmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyQyID0gMDtcbnZhciBaX1NUUkVBTV9FTkQkMiA9IDE7XG4vL3ZhciBaX05FRURfRElDVCAgICAgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IkMiA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiQyID0gLTM7XG4vL3ZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiQyID0gLTU7XG4vL3ZhciBaX1ZFUlNJT05fRVJST1IgPSAtNjtcblxuXG4vKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbi8vdmFyIFpfTk9fQ09NUFJFU1NJT04gICAgICA9IDA7XG4vL3ZhciBaX0JFU1RfU1BFRUQgICAgICAgICAgPSAxO1xuLy92YXIgWl9CRVNUX0NPTVBSRVNTSU9OICAgID0gOTtcbnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04kMSA9IC0xO1xuXG5cbnZhciBaX0ZJTFRFUkVEJDEgPSAxO1xudmFyIFpfSFVGRk1BTl9PTkxZJDEgPSAyO1xudmFyIFpfUkxFJDEgPSAzO1xudmFyIFpfRklYRUQkMSA9IDQ7XG5cbi8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbi8vdmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG4vL3ZhciBaX1RFWFQgICAgICAgICAgICAgICAgPSAxO1xuLy92YXIgWl9BU0NJSSAgICAgICAgICAgICAgID0gMTsgLy8gPSBaX1RFWFRcbnZhciBaX1VOS05PV04kMSA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCQyID0gODtcblxuLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgTUFYX01FTV9MRVZFTCA9IDk7XG5cblxudmFyIExFTkdUSF9DT0RFUyA9IDI5O1xuLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovXG52YXIgTElURVJBTFMgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgPSAxOTtcbi8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqL1xudmFyIEhFQVBfU0laRSA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgTUlOX01BVENIID0gMztcbnZhciBNQVhfTUFUQ0ggPSAyNTg7XG52YXIgTUlOX0xPT0tBSEVBRCA9IChNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKTtcblxudmFyIFBSRVNFVF9ESUNUID0gMHgyMDtcblxudmFyIElOSVRfU1RBVEUgPSA0MjtcbnZhciBFWFRSQV9TVEFURSA9IDY5O1xudmFyIE5BTUVfU1RBVEUgPSA3MztcbnZhciBDT01NRU5UX1NUQVRFID0gOTE7XG52YXIgSENSQ19TVEFURSA9IDEwMztcbnZhciBCVVNZX1NUQVRFID0gMTEzO1xudmFyIEZJTklTSF9TVEFURSA9IDY2NjtcblxudmFyIEJTX05FRURfTU9SRSA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgPSAyOyAvKiBibG9jayBmbHVzaCBwZXJmb3JtZWQgKi9cbnZhciBCU19GSU5JU0hfU1RBUlRFRCA9IDM7IC8qIGZpbmlzaCBzdGFydGVkLCBuZWVkIG9ubHkgbW9yZSBvdXRwdXQgYXQgbmV4dCBkZWZsYXRlICovXG52YXIgQlNfRklOSVNIX0RPTkUgPSA0OyAvKiBmaW5pc2ggZG9uZSwgYWNjZXB0IG5vIG1vcmUgaW5wdXQgb3Igb3V0cHV0ICovXG5cbnZhciBPU19DT0RFID0gMHgwMzsgLy8gVW5peCA6KSAuIERvbid0IGRldGVjdCwgdXNlIHRoaXMgZGVmYXVsdC5cblxuZnVuY3Rpb24gZXJyKHN0cm0sIGVycm9yQ29kZSkge1xuICBzdHJtLm1zZyA9IG1zZ1tlcnJvckNvZGVdO1xuICByZXR1cm4gZXJyb3JDb2RlO1xufVxuXG5mdW5jdGlvbiByYW5rKGYpIHtcbiAgcmV0dXJuICgoZikgPDwgMSkgLSAoKGYpID4gNCA/IDkgOiAwKTtcbn1cblxuZnVuY3Rpb24gemVybyhidWYpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG4gIHdoaWxlICgtLWxlbiA+PSAwKSB7XG4gICAgYnVmW2xlbl0gPSAwO1xuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmx1c2ggYXMgbXVjaCBwZW5kaW5nIG91dHB1dCBhcyBwb3NzaWJsZS4gQWxsIGRlZmxhdGUoKSBvdXRwdXQgZ29lc1xuICogdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIHNvIHNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIG1vZGlmeSBpdFxuICogdG8gYXZvaWQgYWxsb2NhdGluZyBhIGxhcmdlIHN0cm0tPm91dHB1dCBidWZmZXIgYW5kIGNvcHlpbmcgaW50byBpdC5cbiAqIChTZWUgYWxzbyByZWFkX2J1ZigpKS5cbiAqL1xuZnVuY3Rpb24gZmx1c2hfcGVuZGluZyhzdHJtKSB7XG4gIHZhciBzID0gc3RybS5zdGF0ZTtcblxuICAvL190cl9mbHVzaF9iaXRzKHMpO1xuICB2YXIgbGVuID0gcy5wZW5kaW5nO1xuICBpZiAobGVuID4gc3RybS5hdmFpbF9vdXQpIHtcbiAgICBsZW4gPSBzdHJtLmF2YWlsX291dDtcbiAgfVxuICBpZiAobGVuID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXJyYXlTZXQoc3RybS5vdXRwdXQsIHMucGVuZGluZ19idWYsIHMucGVuZGluZ19vdXQsIGxlbiwgc3RybS5uZXh0X291dCk7XG4gIHN0cm0ubmV4dF9vdXQgKz0gbGVuO1xuICBzLnBlbmRpbmdfb3V0ICs9IGxlbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gbGVuO1xuICBzdHJtLmF2YWlsX291dCAtPSBsZW47XG4gIHMucGVuZGluZyAtPSBsZW47XG4gIGlmIChzLnBlbmRpbmcgPT09IDApIHtcbiAgICBzLnBlbmRpbmdfb3V0ID0gMDtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocywgbGFzdCkge1xuICBfdHJfZmx1c2hfYmxvY2socywgKHMuYmxvY2tfc3RhcnQgPj0gMCA/IHMuYmxvY2tfc3RhcnQgOiAtMSksIHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0LCBsYXN0KTtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIGZsdXNoX3BlbmRpbmcocy5zdHJtKTtcbn1cblxuXG5mdW5jdGlvbiBwdXRfYnl0ZShzLCBiKSB7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBQdXQgYSBzaG9ydCBpbiB0aGUgcGVuZGluZyBidWZmZXIuIFRoZSAxNi1iaXQgdmFsdWUgaXMgcHV0IGluIE1TQiBvcmRlci5cbiAqIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzdGF0ZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpblxuICogcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsIGIpIHtcbiAgLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbiAgLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiICYgMHhmZikpO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IChiID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gYiAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyXG4gKiBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaFxuICogdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQgdG8gYXZvaWRcbiAqIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5pbnB1dCBidWZmZXIgYW5kIGNvcHlpbmcgZnJvbSBpdC5cbiAqIChTZWUgYWxzbyBmbHVzaF9wZW5kaW5nKCkpLlxuICovXG5mdW5jdGlvbiByZWFkX2J1ZihzdHJtLCBidWYsIHN0YXJ0LCBzaXplKSB7XG4gIHZhciBsZW4gPSBzdHJtLmF2YWlsX2luO1xuXG4gIGlmIChsZW4gPiBzaXplKSB7XG4gICAgbGVuID0gc2l6ZTtcbiAgfVxuICBpZiAobGVuID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfSBlbHNlIGlmIChzdHJtLnN0YXRlLndyYXAgPT09IDIpIHtcbiAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIHN0cm0ubmV4dF9pbiArPSBsZW47XG4gIHN0cm0udG90YWxfaW4gKz0gbGVuO1xuXG4gIHJldHVybiBsZW47XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmRcbiAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCxcbiAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXNcbiAqIGdhcmJhZ2UuXG4gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50XG4gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLlxuICovXG5mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsIGN1cl9tYXRjaCkge1xuICB2YXIgY2hhaW5fbGVuZ3RoID0gcy5tYXhfY2hhaW5fbGVuZ3RoOyAvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi9cbiAgdmFyIHNjYW4gPSBzLnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqL1xuICB2YXIgbWF0Y2g7IC8qIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsZW47IC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovXG4gIHZhciBiZXN0X2xlbiA9IHMucHJldl9sZW5ndGg7IC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqL1xuICB2YXIgbmljZV9tYXRjaCA9IHMubmljZV9tYXRjaDsgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqL1xuICB2YXIgbGltaXQgPSAocy5zdHJzdGFydCA+IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSA/XG4gICAgcy5zdHJzdGFydCAtIChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIDogMCAvKk5JTCovIDtcblxuICB2YXIgX3dpbiA9IHMud2luZG93OyAvLyBzaG9ydGN1dFxuXG4gIHZhciB3bWFzayA9IHMud19tYXNrO1xuICB2YXIgcHJldiA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSA9IF93aW5bc2NhbiArIGJlc3RfbGVuIC0gMV07XG4gIHZhciBzY2FuX2VuZCA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHtcbiAgICBuaWNlX21hdGNoID0gcy5sb29rYWhlYWQ7XG4gIH1cblxuICAvLyBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFELCBcIm5lZWQgbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICAvLyBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsIFwibm8gZnV0dXJlXCIpO1xuICAgIG1hdGNoID0gY3VyX21hdGNoO1xuXG4gICAgLyogU2tpcCB0byBuZXh0IG1hdGNoIGlmIHRoZSBtYXRjaCBsZW5ndGggY2Fubm90IGluY3JlYXNlXG4gICAgICogb3IgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBsZXNzIHRoYW4gMi4gIE5vdGUgdGhhdCB0aGUgY2hlY2tzIGJlbG93XG4gICAgICogZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBvY2N1ciBvY2Nhc2lvbmFsbHkgZm9yIHBlcmZvcm1hbmNlXG4gICAgICogcmVhc29ucy4gIFRoZXJlZm9yZSB1bmluaXRpYWxpemVkIG1lbW9yeSB3aWxsIGJlIGFjY2Vzc2VkLCBhbmRcbiAgICAgKiBjb25kaXRpb25hbCBqdW1wcyB3aWxsIGJlIG1hZGUgdGhhdCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzLlxuICAgICAqIEhvd2V2ZXIgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaXMgbGltaXRlZCB0byB0aGUgbG9va2FoZWFkLCBzb1xuICAgICAqIHRoZSBvdXRwdXQgb2YgZGVmbGF0ZSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLlxuICAgICAqL1xuXG4gICAgaWYgKF93aW5bbWF0Y2ggKyBiZXN0X2xlbl0gIT09IHNjYW5fZW5kIHx8XG4gICAgICBfd2luW21hdGNoICsgYmVzdF9sZW4gLSAxXSAhPT0gc2Nhbl9lbmQxIHx8XG4gICAgICBfd2luW21hdGNoXSAhPT0gX3dpbltzY2FuXSB8fFxuICAgICAgX3dpblsrK21hdGNoXSAhPT0gX3dpbltzY2FuICsgMV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlXG4gICAgICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLilcbiAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleVxuICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXRcbiAgICAgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC5cbiAgICAgKi9cbiAgICBzY2FuICs9IDI7XG4gICAgbWF0Y2grKztcbiAgICAvLyBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCBcIm1hdGNoWzJdP1wiKTtcblxuICAgIC8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247XG4gICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguXG4gICAgICovXG4gICAgZG8ge1xuICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgfSB3aGlsZSAoX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgc2NhbiA8IHN0cmVuZCk7XG5cbiAgICAvLyBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG5cbiAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoc3RyZW5kIC0gc2Nhbik7XG4gICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDtcblxuICAgIGlmIChsZW4gPiBiZXN0X2xlbikge1xuICAgICAgcy5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDtcbiAgICAgIGJlc3RfbGVuID0gbGVuO1xuICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2Nhbl9lbmQxID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kID0gX3dpbltzY2FuICsgYmVzdF9sZW5dO1xuICAgIH1cbiAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0ICYmIC0tY2hhaW5fbGVuZ3RoICE9PSAwKTtcblxuICBpZiAoYmVzdF9sZW4gPD0gcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gYmVzdF9sZW47XG4gIH1cbiAgcmV0dXJuIHMubG9va2FoZWFkO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRmlsbCB0aGUgd2luZG93IHdoZW4gdGhlIGxvb2thaGVhZCBiZWNvbWVzIGluc3VmZmljaWVudC5cbiAqIFVwZGF0ZXMgc3Ryc3RhcnQgYW5kIGxvb2thaGVhZC5cbiAqXG4gKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQURcbiAqIE9VVCBhc3NlcnRpb25zOiBzdHJzdGFydCA8PSB3aW5kb3dfc2l6ZS1NSU5fTE9PS0FIRUFEXG4gKiAgICBBdCBsZWFzdCBvbmUgYnl0ZSBoYXMgYmVlbiByZWFkLCBvciBhdmFpbF9pbiA9PSAwOyByZWFkcyBhcmVcbiAqICAgIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlIHppcCB0cmFuc2xhdGVfZW9sXG4gKiAgICBvcHRpb24gLS0gbm90IHN1cHBvcnRlZCBoZXJlKS5cbiAqL1xuZnVuY3Rpb24gZmlsbF93aW5kb3cocykge1xuICB2YXIgX3dfc2l6ZSA9IHMud19zaXplO1xuICB2YXIgcCwgbiwgbSwgbW9yZSwgc3RyO1xuXG4gIC8vQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsIFwiYWxyZWFkeSBlbm91Z2ggbG9va2FoZWFkXCIpO1xuXG4gIGRvIHtcbiAgICBtb3JlID0gcy53aW5kb3dfc2l6ZSAtIHMubG9va2FoZWFkIC0gcy5zdHJzdGFydDtcblxuICAgIC8vIEpTIGludHMgaGF2ZSAzMiBiaXQsIGJsb2NrIGJlbG93IG5vdCBuZWVkZWRcbiAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqL1xuICAgIC8vaWYgKHNpemVvZihpbnQpIDw9IDIpIHtcbiAgICAvLyAgICBpZiAobW9yZSA9PSAwICYmIHMtPnN0cnN0YXJ0ID09IDAgJiYgcy0+bG9va2FoZWFkID09IDApIHtcbiAgICAvLyAgICAgICAgbW9yZSA9IHdzaXplO1xuICAgIC8vXG4gICAgLy8gIH0gZWxzZSBpZiAobW9yZSA9PSAodW5zaWduZWQpKC0xKSkge1xuICAgIC8vICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWZcbiAgICAvLyAgICAgICAgICogc3Ryc3RhcnQgPT0gMCAmJiBsb29rYWhlYWQgPT0gMSAoaW5wdXQgZG9uZSBhIGJ5dGUgYXQgdGltZSlcbiAgICAvLyAgICAgICAgICovXG4gICAgLy8gICAgICAgIG1vcmUtLTtcbiAgICAvLyAgICB9XG4gICAgLy99XG5cblxuICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsXG4gICAgICogbW92ZSB0aGUgdXBwZXIgaGFsZiB0byB0aGUgbG93ZXIgb25lIHRvIG1ha2Ugcm9vbSBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCA+PSBfd19zaXplICsgKF93X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkge1xuXG4gICAgICBhcnJheVNldChzLndpbmRvdywgcy53aW5kb3csIF93X3NpemUsIF93X3NpemUsIDApO1xuICAgICAgcy5tYXRjaF9zdGFydCAtPSBfd19zaXplO1xuICAgICAgcy5zdHJzdGFydCAtPSBfd19zaXplO1xuICAgICAgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi9cbiAgICAgIHMuYmxvY2tfc3RhcnQgLT0gX3dfc2l6ZTtcblxuICAgICAgLyogU2xpZGUgdGhlIGhhc2ggdGFibGUgKGNvdWxkIGJlIGF2b2lkZWQgd2l0aCAzMiBiaXQgdmFsdWVzXG4gICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDBcbiAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwXG4gICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mXG4gICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLilcbiAgICAgICAqL1xuXG4gICAgICBuID0gcy5oYXNoX3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMuaGVhZFstLXBdO1xuICAgICAgICBzLmhlYWRbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICAgIG4gPSBfd19zaXplO1xuICAgICAgcCA9IG47XG4gICAgICBkbyB7XG4gICAgICAgIG0gPSBzLnByZXZbLS1wXTtcbiAgICAgICAgcy5wcmV2W3BdID0gKG0gPj0gX3dfc2l6ZSA/IG0gLSBfd19zaXplIDogMCk7XG4gICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0XG4gICAgICAgICAqIGl0cyB2YWx1ZSB3aWxsIG5ldmVyIGJlIHVzZWQuXG4gICAgICAgICAqL1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbW9yZSArPSBfd19zaXplO1xuICAgIH1cbiAgICBpZiAocy5zdHJtLmF2YWlsX2luID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzpcbiAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJlxuICAgICAqICAgIG1vcmUgPT0gd2luZG93X3NpemUgLSBsb29rYWhlYWQgLSBzdHJzdGFydFxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKVxuICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMlxuICAgICAqIEluIHRoZSBCSUdfTUVNIG9yIE1NQVAgY2FzZSAobm90IHlldCBzdXBwb3J0ZWQpLFxuICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmXG4gICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC5cbiAgICAgKiBPdGhlcndpc2UsIHdpbmRvd19zaXplID09IDIqV1NJWkUgc28gbW9yZSA+PSAyLlxuICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi5cbiAgICAgKi9cbiAgICAvL0Fzc2VydChtb3JlID49IDIsIFwibW9yZSA8IDJcIik7XG4gICAgbiA9IHJlYWRfYnVmKHMuc3RybSwgcy53aW5kb3csIHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCwgbW9yZSk7XG4gICAgcy5sb29rYWhlYWQgKz0gbjtcblxuICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCArIHMuaW5zZXJ0ID49IE1JTl9NQVRDSCkge1xuICAgICAgc3RyID0gcy5zdHJzdGFydCAtIHMuaW5zZXJ0O1xuICAgICAgcy5pbnNfaCA9IHMud2luZG93W3N0cl07XG5cbiAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICAvLyNpZiBNSU5fTUFUQ0ggIT0gM1xuICAgICAgLy8gICAgICAgIENhbGwgdXBkYXRlX2hhc2goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4gICAgICAvLyNlbmRpZlxuICAgICAgd2hpbGUgKHMuaW5zZXJ0KSB7XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgTUlOX01BVENILTFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgICBzdHIrKztcbiAgICAgICAgcy5pbnNlcnQtLTtcbiAgICAgICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPCBNSU5fTUFUQ0gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsXG4gICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLlxuICAgICAqL1xuXG4gIH0gd2hpbGUgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBzLnN0cm0uYXZhaWxfaW4gIT09IDApO1xuXG4gIC8qIElmIHRoZSBXSU5fSU5JVCBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGRhdGEgaGF2ZSBuZXZlciBiZWVuXG4gICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZlxuICAgKiB0aGUgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgKG9yIHVuaW5pdGlhbGlzZWQgYXMgSnVsaWFuIHdyaXRlcykgYnl0ZXMgYnlcbiAgICogdGhlIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMuICBVcGRhdGUgdGhlIGhpZ2ggd2F0ZXIgbWFyayBmb3IgdGhlIG5leHRcbiAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAqIHJvdXRpbmVzIGFsbG93IHNjYW5uaW5nIHRvIHN0cnN0YXJ0ICsgTUFYX01BVENILCBpZ25vcmluZyBsb29rYWhlYWQuXG4gICAqL1xuICAvLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbiAgLy8gICAgdmFyIGN1cnIgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQ7XG4gIC8vICAgIHZhciBpbml0ID0gMDtcbiAgLy9cbiAgLy8gICAgaWYgKHMuaGlnaF93YXRlciA8IGN1cnIpIHtcbiAgLy8gICAgICAvKiBQcmV2aW91cyBoaWdoIHdhdGVyIG1hcmsgYmVsb3cgY3VycmVudCBkYXRhIC0tIHplcm8gV0lOX0lOSVRcbiAgLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbiAgLy8gICAgICAgKi9cbiAgLy8gICAgICBpbml0ID0gcy53aW5kb3dfc2l6ZSAtIGN1cnI7XG4gIC8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbiAgLy8gICAgICAgIGluaXQgPSBXSU5fSU5JVDtcbiAgLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBjdXJyLCAodW5zaWduZWQpaW5pdCk7XG4gIC8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuICAvLyAgICB9XG4gIC8vICAgIGVsc2UgaWYgKHMtPmhpZ2hfd2F0ZXIgPCAodWxnKWN1cnIgKyBXSU5fSU5JVCkge1xuICAvLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbiAgLy8gICAgICAgKiBwbHVzIFdJTl9JTklUIC0tIHplcm8gb3V0IHRvIGN1cnJlbnQgZGF0YSBwbHVzIFdJTl9JTklULCBvciB1cFxuICAvLyAgICAgICAqIHRvIGVuZCBvZiB3aW5kb3csIHdoaWNoZXZlciBpcyBsZXNzLlxuICAvLyAgICAgICAqL1xuICAvLyAgICAgIGluaXQgPSAodWxnKWN1cnIgKyBXSU5fSU5JVCAtIHMtPmhpZ2hfd2F0ZXI7XG4gIC8vICAgICAgaWYgKGluaXQgPiBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXIpXG4gIC8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuICAvLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIHMtPmhpZ2hfd2F0ZXIsICh1bnNpZ25lZClpbml0KTtcbiAgLy8gICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7XG4gIC8vICAgIH1cbiAgLy8gIH1cbiAgLy9cbiAgLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbiAgLy8gICAgXCJub3QgZW5vdWdoIHJvb20gZm9yIHNlYXJjaFwiKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb3B5IHdpdGhvdXQgY29tcHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVyblxuICogdGhlIGN1cnJlbnQgYmxvY2sgc3RhdGUuXG4gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZVxuICogdW5jb21wcmVzc2libGUgZGF0YSBpcyBwcm9iYWJseSBub3QgdXNlZnVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWRcbiAqIG9ubHkgZm9yIHRoZSBsZXZlbD0wIGNvbXByZXNzaW9uIG9wdGlvbi5cbiAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb21cbiAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gpIHtcbiAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWRcbiAgICogdG8gcGVuZGluZ19idWZfc2l6ZSwgYW5kIGVhY2ggc3RvcmVkIGJsb2NrIGhhcyBhIDUgYnl0ZSBoZWFkZXI6XG4gICAqL1xuICB2YXIgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7XG5cbiAgaWYgKG1heF9ibG9ja19zaXplID4gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNSkge1xuICAgIG1heF9ibG9ja19zaXplID0gcy5wZW5kaW5nX2J1Zl9zaXplIC0gNTtcbiAgfVxuXG4gIC8qIENvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIGlucHV0IHRvIG91dHB1dDogKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIEZpbGwgdGhlIHdpbmRvdyBhcyBtdWNoIGFzIHBvc3NpYmxlOiAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8PSAxKSB7XG5cbiAgICAgIC8vQXNzZXJ0KHMtPnN0cnN0YXJ0IDwgcy0+d19zaXplK01BWF9ESVNUKHMpIHx8XG4gICAgICAvLyAgcy0+YmxvY2tfc3RhcnQgPj0gKGxvbmcpcy0+d19zaXplLCBcInNsaWRlIHRvbyBsYXRlXCIpO1xuICAgICAgLy8gICAgICBpZiAoIShzLnN0cnN0YXJ0IDwgcy53X3NpemUgKyAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSB8fFxuICAgICAgLy8gICAgICAgIHMuYmxvY2tfc3RhcnQgPj0gcy53X3NpemUpKSB7XG4gICAgICAvLyAgICAgICAgdGhyb3cgIG5ldyBFcnJvcihcInNsaWRlIHRvbyBsYXRlXCIpO1xuICAgICAgLy8gICAgICB9XG5cbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwICYmIGZsdXNoID09PSBaX05PX0ZMVVNIJDEpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cblxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG4gICAgLy9Bc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsIFwiYmxvY2sgZ29uZVwiKTtcbiAgICAvLyAgICBpZiAocy5ibG9ja19zdGFydCA8IDApIHRocm93IG5ldyBFcnJvcihcImJsb2NrIGdvbmVcIik7XG5cbiAgICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICAgIHMubG9va2FoZWFkID0gMDtcblxuICAgIC8qIEVtaXQgYSBzdG9yZWQgYmxvY2sgaWYgcGVuZGluZ19idWYgd2lsbCBiZSBmdWxsOiAqL1xuICAgIHZhciBtYXhfc3RhcnQgPSBzLmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7XG5cbiAgICBpZiAocy5zdHJzdGFydCA9PT0gMCB8fCBzLnN0cnN0YXJ0ID49IG1heF9zdGFydCkge1xuICAgICAgLyogc3Ryc3RhcnQgPT0gMCBpcyBwb3NzaWJsZSB3aGVuIHdyYXBhcm91bmQgb24gMTYtYml0IG1hY2hpbmUgKi9cbiAgICAgIHMubG9va2FoZWFkID0gcy5zdHJzdGFydCAtIG1heF9zdGFydDtcbiAgICAgIHMuc3Ryc3RhcnQgPSBtYXhfc3RhcnQ7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuXG5cbiAgICB9XG4gICAgLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lXG4gICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZTpcbiAgICAgKi9cbiAgICBpZiAocy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQgPj0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG5cbiAgcy5pbnNlcnQgPSAwO1xuXG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG5cbiAgaWYgKHMuc3Ryc3RhcnQgPiBzLmJsb2NrX3N0YXJ0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX05FRURfTU9SRTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb21wcmVzcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgcmV0dXJuIHRoZSBjdXJyZW50XG4gKiBibG9jayBzdGF0ZS5cbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBhbmQgaW5zZXJ0c1xuICogbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgb25seSBmb3IgdW5tYXRjaGVkIHN0cmluZ3Mgb3IgZm9yIHNob3J0XG4gKiBtYXRjaGVzLiBJdCBpcyB1c2VkIG9ubHkgZm9yIHRoZSBmYXN0IGNvbXByZXNzaW9uIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfZmFzdChzLCBmbHVzaCkge1xuICB2YXIgaGFzaF9oZWFkOyAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7IC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIJDEpIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMCAvKk5JTCovIDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMCAvKk5JTCovICYmICgocy5zdHJzdGFydCAtIGhhc2hfaGVhZCkgPD0gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cbiAgICB9XG4gICAgaWYgKHMubWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkge1xuICAgICAgLy8gY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGgpOyAvLyBmb3IgZGVidWcgb25seVxuXG4gICAgICAvKioqIF90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCBzLnN0cnN0YXJ0IC0gcy5tYXRjaF9zdGFydCwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuXG4gICAgICBzLmxvb2thaGVhZCAtPSBzLm1hdGNoX2xlbmd0aDtcblxuICAgICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgICogaXMgbm90IHRvbyBsYXJnZS4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IHMubWF4X2xhenlfbWF0Y2ggLyptYXhfaW5zZXJ0X2xlbmd0aCovICYmIHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgICBzLm1hdGNoX2xlbmd0aC0tOyAvKiBzdHJpbmcgYXQgc3Ryc3RhcnQgYWxyZWFkeSBpbiB0YWJsZSAqL1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAgICAgLyoqKi9cbiAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlXG4gICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgfSB3aGlsZSAoLS1zLm1hdGNoX2xlbmd0aCAhPT0gMCk7XG4gICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMuc3Ryc3RhcnQgKz0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICAgICAgcy5pbnNfaCA9IHMud2luZG93W3Muc3Ryc3RhcnRdO1xuICAgICAgICAvKiBVUERBVEVfSEFTSChzLCBzLmluc19oLCBzLndpbmRvd1tzLnN0cnN0YXJ0KzFdKTsgKi9cbiAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIDFdKSAmIHMuaGFzaF9tYXNrO1xuXG4gICAgICAgIC8vI2lmIE1JTl9NQVRDSCAhPSAzXG4gICAgICAgIC8vICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzXG4gICAgICAgIC8vI2VuZGlmXG4gICAgICAgIC8qIElmIGxvb2thaGVhZCA8IE1JTl9NQVRDSCwgaW5zX2ggaXMgZ2FyYmFnZSwgYnV0IGl0IGRvZXMgbm90XG4gICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMud2luZG93W3Muc3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gKChzLnN0cnN0YXJ0IDwgKE1JTl9NQVRDSCAtIDEpKSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxKTtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCQyKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7IC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICB2YXIgbWF4X2luc2VydDtcblxuICAvKiBQcm9jZXNzIHRoZSBpbnB1dCBibG9jay4gKi9cbiAgZm9yICg7Oykge1xuICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdFxuICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzXG4gICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlXG4gICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gkMSkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwIC8qTklMKi8gO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG4gICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAvKioqL1xuICAgIH1cblxuICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguXG4gICAgICovXG4gICAgcy5wcmV2X2xlbmd0aCA9IHMubWF0Y2hfbGVuZ3RoO1xuICAgIHMucHJldl9tYXRjaCA9IHMubWF0Y2hfc3RhcnQ7XG4gICAgcy5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMCAvKk5JTCovICYmIHMucHJldl9sZW5ndGggPCBzLm1heF9sYXp5X21hdGNoICYmXG4gICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpIC8qTUFYX0RJU1QocykqLyApIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gNSAmJlxuICAgICAgICAocy5zdHJhdGVneSA9PT0gWl9GSUxURVJFRCQxIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5NiAvKlRPT19GQVIqLyApKSkge1xuXG4gICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2VcbiAgICAgICAgICogYnV0IHdlIHdpbGwgaWdub3JlIHRoZSBjdXJyZW50IG1hdGNoIGFueXdheS5cbiAgICAgICAgICovXG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHN0ZXAgYW5kIHRoZSBjdXJyZW50XG4gICAgICogbWF0Y2ggaXMgbm90IGJldHRlciwgb3V0cHV0IHRoZSBwcmV2aW91cyBtYXRjaDpcbiAgICAgKi9cbiAgICBpZiAocy5wcmV2X2xlbmd0aCA+PSBNSU5fTUFUQ0ggJiYgcy5tYXRjaF9sZW5ndGggPD0gcy5wcmV2X2xlbmd0aCkge1xuICAgICAgbWF4X2luc2VydCA9IHMuc3Ryc3RhcnQgKyBzLmxvb2thaGVhZCAtIE1JTl9NQVRDSDtcbiAgICAgIC8qIERvIG5vdCBpbnNlcnQgc3RyaW5ncyBpbiBoYXNoIHRhYmxlIGJleW9uZCB0aGlzLiAqL1xuXG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQtMSwgcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoKTtcblxuICAgICAgLyoqKl90cl90YWxseV9kaXN0KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLFxuICAgICAgICAgICAgICAgICAgICAgcy5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsqKiovXG4gICAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgcy5zdHJzdGFydCAtIDEgLSBzLnByZXZfbWF0Y2gsIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gpO1xuICAgICAgLyogSW5zZXJ0IGluIGhhc2ggdGFibGUgYWxsIHN0cmluZ3MgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2guXG4gICAgICAgKiBzdHJzdGFydC0xIGFuZCBzdHJzdGFydCBhcmUgYWxyZWFkeSBpbnNlcnRlZC4gSWYgdGhlcmUgaXMgbm90XG4gICAgICAgKiBlbm91Z2ggbG9va2FoZWFkLCB0aGUgbGFzdCB0d28gc3RyaW5ncyBhcmUgbm90IGluc2VydGVkIGluXG4gICAgICAgKiB0aGUgaGFzaCB0YWJsZS5cbiAgICAgICAqL1xuICAgICAgcy5sb29rYWhlYWQgLT0gcy5wcmV2X2xlbmd0aCAtIDE7XG4gICAgICBzLnByZXZfbGVuZ3RoIC09IDI7XG4gICAgICBkbyB7XG4gICAgICAgIGlmICgrK3Muc3Ryc3RhcnQgPD0gbWF4X2luc2VydCkge1xuICAgICAgICAgIC8qKiogSU5TRVJUX1NUUklORyhzLCBzLnN0cnN0YXJ0LCBoYXNoX2hlYWQpOyAqKiovXG4gICAgICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICAgIHMuaGVhZFtzLmluc19oXSA9IHMuc3Ryc3RhcnQ7XG4gICAgICAgICAgLyoqKi9cbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoLS1zLnByZXZfbGVuZ3RoICE9PSAwKTtcbiAgICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqKi9cbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBtYXRjaCBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb24sIG91dHB1dCBhXG4gICAgICAgKiBzaW5nbGUgbGl0ZXJhbC4gSWYgdGhlcmUgd2FzIGEgbWF0Y2ggYnV0IHRoZSBjdXJyZW50IG1hdGNoXG4gICAgICAgKiBpcyBsb25nZXIsIHRydW5jYXRlIHRoZSBwcmV2aW91cyBtYXRjaCB0byBhIHNpbmdsZSBsaXRlcmFsLlxuICAgICAgICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0IC0gMV0pO1xuXG4gICAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAgIC8qKiogRkxVU0hfQkxPQ0tfT05MWShzLCAwKSAqKiovXG4gICAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgICAvKioqL1xuICAgICAgfVxuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3JcbiAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLlxuICAgICAgICovXG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICBzLmxvb2thaGVhZC0tO1xuICAgIH1cbiAgfVxuICAvL0Fzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgXCJubyBmbHVzaD9cIik7XG4gIGlmIChzLm1hdGNoX2F2YWlsYWJsZSkge1xuICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0LTFdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnQtMV0sIGJmbHVzaCk7ICoqKi9cbiAgICBiZmx1c2ggPSBfdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgIHMubWF0Y2hfYXZhaWxhYmxlID0gMDtcbiAgfVxuICBzLmluc2VydCA9IHMuc3Ryc3RhcnQgPCBNSU5fTUFUQ0ggLSAxID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDE7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG5cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGb3IgWl9STEUsIHNpbXBseSBsb29rIGZvciBydW5zIG9mIGJ5dGVzLCBnZW5lcmF0ZSBtYXRjaGVzIG9ubHkgb2YgZGlzdGFuY2VcbiAqIG9uZS4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuICAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZlxuICogZGVmbGF0ZSBzd2l0Y2hlcyBhd2F5IGZyb20gWl9STEUuKVxuICovXG5mdW5jdGlvbiBkZWZsYXRlX3JsZShzLCBmbHVzaCkge1xuICB2YXIgYmZsdXNoOyAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cbiAgdmFyIHByZXY7IC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovXG4gIHZhciBzY2FuLCBzdHJlbmQ7IC8qIHNjYW4gZ29lcyB1cCB0byBzdHJlbmQgZm9yIGxlbmd0aCBvZiBydW4gKi9cblxuICB2YXIgX3dpbiA9IHMud2luZG93O1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbG9uZ2VzdCBydW4sIHBsdXMgb25lIGZvciB0aGUgdW5yb2xsZWQgbG9vcC5cbiAgICAgKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIKSB7XG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA8PSBNQVhfTUFUQ0ggJiYgZmx1c2ggPT09IFpfTk9fRkxVU0gkMSkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cblxuICAgIC8qIFNlZSBob3cgbWFueSB0aW1lcyB0aGUgcHJldmlvdXMgYnl0ZSByZXBlYXRzICovXG4gICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIGlmIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy5zdHJzdGFydCA+IDApIHtcbiAgICAgIHNjYW4gPSBzLnN0cnN0YXJ0IC0gMTtcbiAgICAgIHByZXYgPSBfd2luW3NjYW5dO1xuICAgICAgaWYgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dKSB7XG4gICAgICAgIHN0cmVuZCA9IHMuc3Ryc3RhcnQgKyBNQVhfTUFUQ0g7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvKmpzaGludCBub2VtcHR5OmZhbHNlKi9cbiAgICAgICAgfSB3aGlsZSAocHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgIHNjYW4gPCBzdHJlbmQpO1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoID4gcy5sb29rYWhlYWQpIHtcbiAgICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IHMubG9va2FoZWFkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL0Fzc2VydChzY2FuIDw9IHMtPndpbmRvdysodUludCkocy0+d2luZG93X3NpemUtMSksIFwid2lsZCBzY2FuXCIpO1xuICAgIH1cblxuICAgIC8qIEVtaXQgbWF0Y2ggaWYgaGF2ZSBydW4gb2YgTUlOX01BVENIIG9yIGxvbmdlciwgZWxzZSBlbWl0IGxpdGVyYWwgKi9cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvL2NoZWNrX21hdGNoKHMsIHMuc3Ryc3RhcnQsIHMuc3Ryc3RhcnQgLSAxLCBzLm1hdGNoX2xlbmd0aCk7XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3QocywgMSwgcy5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgICAvKioqIF90cl90YWxseV9saXQocywgcy53aW5kb3dbcy5zdHJzdGFydF0sIGJmbHVzaCk7ICoqKi9cbiAgICAgIGJmbHVzaCA9IF90cl90YWxseShzLCAwLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSk7XG5cbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgfVxuICAgIGlmIChiZmx1c2gpIHtcbiAgICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgIH1cbiAgICAgIC8qKiovXG4gICAgfVxuICB9XG4gIHMuaW5zZXJ0ID0gMDtcbiAgaWYgKGZsdXNoID09PSBaX0ZJTklTSCQyKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7IC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCQxKSB7XG4gICAgICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICAgICAgfVxuICAgICAgICBicmVhazsgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gkMikge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMSk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIHRydWUpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfRklOSVNIX1NUQVJURUQ7XG4gICAgfVxuICAgIC8qKiovXG4gICAgcmV0dXJuIEJTX0ZJTklTSF9ET05FO1xuICB9XG4gIGlmIChzLmxhc3RfbGl0KSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgZmFsc2UpO1xuICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgIH1cbiAgICAvKioqL1xuICB9XG4gIHJldHVybiBCU19CTE9DS19ET05FO1xufVxuXG4vKiBWYWx1ZXMgZm9yIG1heF9sYXp5X21hdGNoLCBnb29kX21hdGNoIGFuZCBtYXhfY2hhaW5fbGVuZ3RoLCBkZXBlbmRpbmcgb25cbiAqIHRoZSBkZXNpcmVkIHBhY2sgbGV2ZWwgKDAuLjkpLiBUaGUgdmFsdWVzIGdpdmVuIGJlbG93IGhhdmUgYmVlbiB0dW5lZCB0b1xuICogZXhjbHVkZSB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIGZvciBwYXRob2xvZ2ljYWwgZmlsZXMuIEJldHRlciB2YWx1ZXMgbWF5IGJlXG4gKiBmb3VuZCBmb3Igc3BlY2lmaWMgZmlsZXMuXG4gKi9cbmZ1bmN0aW9uIENvbmZpZyhnb29kX2xlbmd0aCwgbWF4X2xhenksIG5pY2VfbGVuZ3RoLCBtYXhfY2hhaW4sIGZ1bmMpIHtcbiAgdGhpcy5nb29kX2xlbmd0aCA9IGdvb2RfbGVuZ3RoO1xuICB0aGlzLm1heF9sYXp5ID0gbWF4X2xhenk7XG4gIHRoaXMubmljZV9sZW5ndGggPSBuaWNlX2xlbmd0aDtcbiAgdGhpcy5tYXhfY2hhaW4gPSBtYXhfY2hhaW47XG4gIHRoaXMuZnVuYyA9IGZ1bmM7XG59XG5cbnZhciBjb25maWd1cmF0aW9uX3RhYmxlO1xuXG5jb25maWd1cmF0aW9uX3RhYmxlID0gW1xuICAvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovXG4gIG5ldyBDb25maWcoMCwgMCwgMCwgMCwgZGVmbGF0ZV9zdG9yZWQpLCAvKiAwIHN0b3JlIG9ubHkgKi9cbiAgbmV3IENvbmZpZyg0LCA0LCA4LCA0LCBkZWZsYXRlX2Zhc3QpLCAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksIC8qIDIgKi9cbiAgbmV3IENvbmZpZyg0LCA2LCAzMiwgMzIsIGRlZmxhdGVfZmFzdCksIC8qIDMgKi9cblxuICBuZXcgQ29uZmlnKDQsIDQsIDE2LCAxNiwgZGVmbGF0ZV9zbG93KSwgLyogNCBsYXp5IG1hdGNoZXMgKi9cbiAgbmV3IENvbmZpZyg4LCAxNiwgMzIsIDMyLCBkZWZsYXRlX3Nsb3cpLCAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpIC8qIDkgbWF4IGNvbXByZXNzaW9uICovXG5dO1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5pdGlhbGl6ZSB0aGUgXCJsb25nZXN0IG1hdGNoXCIgcm91dGluZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtXG4gKi9cbmZ1bmN0aW9uIGxtX2luaXQocykge1xuICBzLndpbmRvd19zaXplID0gMiAqIHMud19zaXplO1xuXG4gIC8qKiogQ0xFQVJfSEFTSChzKTsgKioqL1xuICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczpcbiAgICovXG4gIHMubWF4X2xhenlfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9sYXp5O1xuICBzLmdvb2RfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmdvb2RfbGVuZ3RoO1xuICBzLm5pY2VfbWF0Y2ggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm5pY2VfbGVuZ3RoO1xuICBzLm1heF9jaGFpbl9sZW5ndGggPSBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLm1heF9jaGFpbjtcblxuICBzLnN0cnN0YXJ0ID0gMDtcbiAgcy5ibG9ja19zdGFydCA9IDA7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5pbnNlcnQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHMuaW5zX2ggPSAwO1xufVxuXG5cbmZ1bmN0aW9uIERlZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5zdHJtID0gbnVsbDsgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAvKiBhcyB0aGUgbmFtZSBpbXBsaWVzICovXG4gIHRoaXMucGVuZGluZ19idWYgPSBudWxsOyAvKiBvdXRwdXQgc3RpbGwgcGVuZGluZyAqL1xuICB0aGlzLnBlbmRpbmdfYnVmX3NpemUgPSAwOyAvKiBzaXplIG9mIHBlbmRpbmdfYnVmICovXG4gIHRoaXMucGVuZGluZ19vdXQgPSAwOyAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqL1xuICB0aGlzLnBlbmRpbmcgPSAwOyAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqL1xuICB0aGlzLmd6aGVhZCA9IG51bGw7IC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7IC8qIHdoZXJlIGluIGV4dHJhLCBuYW1lLCBvciBjb21tZW50ICovXG4gIHRoaXMubWV0aG9kID0gWl9ERUZMQVRFRCQyOyAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqL1xuICB0aGlzLmxhc3RfZmx1c2ggPSAtMTsgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqL1xuXG4gIHRoaXMud19zaXplID0gMDsgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovXG4gIHRoaXMud19iaXRzID0gMDsgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgLyogd19zaXplIC0gMSAqL1xuXG4gIHRoaXMud2luZG93ID0gbnVsbDtcbiAgLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csXG4gICAqIGFuZCBtb3ZlIHRvIHRoZSBmaXJzdCBoYWxmIGxhdGVyIHRvIGtlZXAgYSBkaWN0aW9uYXJ5IG9mIGF0IGxlYXN0IHdTaXplXG4gICAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2ZcbiAgICogd1NpemUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzXG4gICAqIHBlcmZvcm1lZCB3aXRoIGEgbGVuZ3RoIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLlxuICAgKi9cblxuICB0aGlzLndpbmRvd19zaXplID0gMDtcbiAgLyogQWN0dWFsIHNpemUgb2Ygd2luZG93OiAyKndTaXplLCBleGNlcHQgd2hlbiB0aGUgdXNlciBpbnB1dCBidWZmZXJcbiAgICogaXMgZGlyZWN0bHkgdXNlZCBhcyBzbGlkaW5nIHdpbmRvdy5cbiAgICovXG5cbiAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXNcbiAgICogYXJyYXkgdG8gNjRLLCB0aGlzIGxpbmsgaXMgbWFpbnRhaW5lZCBvbmx5IGZvciB0aGUgbGFzdCAzMksgc3RyaW5ncy5cbiAgICogQW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyB0aHVzIGEgd2luZG93IGluZGV4IG1vZHVsbyAzMksuXG4gICAqL1xuXG4gIHRoaXMuaGVhZCA9IG51bGw7IC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7IC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhc2ggdGFibGUgKi9cbiAgdGhpcy5oYXNoX2JpdHMgPSAwOyAvKiBsb2cyKGhhc2hfc2l6ZSkgKi9cbiAgdGhpcy5oYXNoX21hc2sgPSAwOyAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi9cbiAgdGhpcy5wcmV2X21hdGNoID0gMDsgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovXG4gIHRoaXMuc3Ryc3RhcnQgPSAwOyAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovXG4gIHRoaXMubWF0Y2hfc3RhcnQgPSAwOyAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi9cbiAgdGhpcy5sb29rYWhlYWQgPSAwOyAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovXG5cbiAgdGhpcy5wcmV2X2xlbmd0aCA9IDA7XG4gIC8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpc1xuICAgKiBhcmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbi5cbiAgICovXG5cbiAgdGhpcy5tYXhfY2hhaW5fbGVuZ3RoID0gMDtcbiAgLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlucyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXNcbiAgICogbGVuZ3RoLiAgQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZVxuICAgKiBzcGVlZC5cbiAgICovXG5cbiAgdGhpcy5tYXhfbGF6eV9tYXRjaCA9IDA7XG4gIC8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHlcbiAgICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb25cbiAgICogbGV2ZWxzID49IDQuXG4gICAqL1xuICAvLyBUaGF0J3MgYWxpYXMgdG8gbWF4X2xhenlfbWF0Y2gsIGRvbid0IHVzZSBkaXJlY3RseVxuICAvL3RoaXMubWF4X2luc2VydF9sZW5ndGggPSAwO1xuICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdFxuICAgKiBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uXG4gICAqIG1heF9pbnNlcnRfbGVuZ3RoIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDw9IDMuXG4gICAqL1xuXG4gIHRoaXMubGV2ZWwgPSAwOyAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi9cbiAgdGhpcy5zdHJhdGVneSA9IDA7IC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgLyogdXNlZCBieSBjOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlID0gbmV3IEJ1ZjE2KEhFQVBfU0laRSAqIDIpO1xuICB0aGlzLmR5bl9kdHJlZSA9IG5ldyBCdWYxNigoMiAqIERfQ09ERVMgKyAxKSAqIDIpO1xuICB0aGlzLmJsX3RyZWUgPSBuZXcgQnVmMTYoKDIgKiBCTF9DT0RFUyArIDEpICogMik7XG4gIHplcm8odGhpcy5keW5fbHRyZWUpO1xuICB6ZXJvKHRoaXMuZHluX2R0cmVlKTtcbiAgemVybyh0aGlzLmJsX3RyZWUpO1xuXG4gIHRoaXMubF9kZXNjID0gbnVsbDsgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyA9IG51bGw7IC8qIGRlc2MuIGZvciBkaXN0YW5jZSB0cmVlICovXG4gIHRoaXMuYmxfZGVzYyA9IG51bGw7IC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi9cblxuICAvL3VzaCBibF9jb3VudFtNQVhfQklUUysxXTtcbiAgdGhpcy5ibF9jb3VudCA9IG5ldyBCdWYxNihNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvL2ludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi9cbiAgdGhpcy5oZWFwID0gbmV3IEJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqL1xuICB6ZXJvKHRoaXMuaGVhcCk7XG5cbiAgdGhpcy5oZWFwX2xlbiA9IDA7IC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqL1xuICB0aGlzLmhlYXBfbWF4ID0gMDsgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsXG4gICAqL1xuXG4gIHRoaXMuZGVwdGggPSBuZXcgQnVmMTYoMiAqIExfQ09ERVMgKyAxKTsgLy91Y2ggZGVwdGhbMipMX0NPREVTKzFdO1xuICB6ZXJvKHRoaXMuZGVwdGgpO1xuICAvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5XG4gICAqL1xuXG4gIHRoaXMubF9idWYgPSAwOyAvKiBidWZmZXIgaW5kZXggZm9yIGxpdGVyYWxzIG9yIGxlbmd0aHMgKi9cblxuICB0aGlzLmxpdF9idWZzaXplID0gMDtcbiAgLyogU2l6ZSBvZiBtYXRjaCBidWZmZXIgZm9yIGxpdGVyYWxzL2xlbmd0aHMuICBUaGVyZSBhcmUgNCByZWFzb25zIGZvclxuICAgKiBsaW1pdGluZyBsaXRfYnVmc2l6ZSB0byA2NEs6XG4gICAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnNcbiAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciB0aGUgZmlyc3QgYmxvY2ssIGFsbCBpbnB1dFxuICAgKiAgICAgZGF0YSBpcyBzdGlsbCBpbiB0aGUgd2luZG93IHNvIHdlIGNhbiBzdGlsbCBlbWl0IGEgc3RvcmVkIGJsb2NrIGV2ZW5cbiAgICogICAgIHdoZW4gaW5wdXQgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yXG4gICAqICAgICBhbGwgYmxvY2tzIGlmIGxpdF9idWZzaXplIGlzIG5vdCBncmVhdGVyIHRoYW4gMzJLLilcbiAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciBhIGZpbGUgc21hbGxlciB0aGFuIDY0Sywgd2UgY2FuXG4gICAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuXG4gICAqICAgICBUaGlzIGlzIGFwcGxpY2FibGUgb25seSBmb3IgemlwIChub3QgZ3ppcCBvciB6bGliKS5cbiAgICogICAtIGNyZWF0aW5nIG5ldyBIdWZmbWFuIHRyZWVzIGxlc3MgZnJlcXVlbnRseSBtYXkgbm90IHByb3ZpZGUgZmFzdFxuICAgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvclxuICAgKiAgICAgZXhhbXBsZSBhIGJpbmFyeSBmaWxlIHdpdGggcG9vcmx5IGNvbXByZXNzaWJsZSBjb2RlIGZvbGxvd2VkIGJ5XG4gICAqICAgICBhIGhpZ2hseSBjb21wcmVzc2libGUgc3RyaW5nIHRhYmxlLikgU21hbGxlciBidWZmZXIgc2l6ZXMgZ2l2ZVxuICAgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nXG4gICAqICAgICB0cmVlcyBtb3JlIGZyZXF1ZW50bHkuXG4gICAqICAgLSBJIGNhbid0IGNvdW50IGFib3ZlIDRcbiAgICovXG5cbiAgdGhpcy5sYXN0X2xpdCA9IDA7IC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7IC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7IC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgLyogYnl0ZXMgYXQgZW5kIG9mIHdpbmRvdyBsZWZ0IHRvIGluc2VydCAqL1xuXG5cbiAgdGhpcy5iaV9idWYgPSAwO1xuICAvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdFxuICAgKiBzaWduaWZpY2FudCBiaXRzKS5cbiAgICovXG4gIHRoaXMuYmlfdmFsaWQgPSAwO1xuICAvKiBOdW1iZXIgb2YgdmFsaWQgYml0cyBpbiBiaV9idWYuICBBbGwgYml0cyBhYm92ZSB0aGUgbGFzdCB2YWxpZCBiaXRcbiAgICogYXJlIGFsd2F5cyB6ZXJvLlxuICAgKi9cblxuICAvLyBVc2VkIGZvciB3aW5kb3cgbWVtb3J5IGluaXQuIFdlIHNhZmVseSBpZ25vcmUgaXQgZm9yIEpTLiBUaGF0IG1ha2VzXG4gIC8vIHNlbnNlIG9ubHkgZm9yIHBvaW50ZXJzIGFuZCBtZW1vcnkgY2hlY2sgdG9vbHMuXG4gIC8vdGhpcy5oaWdoX3dhdGVyID0gMDtcbiAgLyogSGlnaCB3YXRlciBtYXJrIG9mZnNldCBpbiB3aW5kb3cgZm9yIGluaXRpYWxpemVkIGJ5dGVzIC0tIGJ5dGVzIGFib3ZlXG4gICAqIHRoaXMgYXJlIHNldCB0byB6ZXJvIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayB3YXJuaW5ncyB3aGVuXG4gICAqIGxvbmdlc3QgbWF0Y2ggcm91dGluZXMgYWNjZXNzIGJ5dGVzIHBhc3QgdGhlIGlucHV0LiAgVGhpcyBpcyB0aGVuXG4gICAqIHVwZGF0ZWQgdG8gdGhlIG5ldyBoaWdoIHdhdGVyIG1hcmsuXG4gICAqL1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVSZXNldEtlZXAoc3RybSkge1xuICB2YXIgcztcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHtcbiAgICByZXR1cm4gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SJDIpO1xuICB9XG5cbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gMDtcbiAgc3RybS5kYXRhX3R5cGUgPSBaX1VOS05PV04kMTtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgLy8gY3JjMzIoMCwgWl9OVUxMLCAwKVxuICAgIDpcbiAgICAxOyAvLyBhZGxlcjMyKDAsIFpfTlVMTCwgMClcbiAgcy5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSCQxO1xuICBfdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0skMjtcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgcmV0ID0gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTtcbiAgaWYgKHJldCA9PT0gWl9PSyQyKSB7XG4gICAgbG1faW5pdChzdHJtLnN0YXRlKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGVJbml0MihzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3kpIHtcbiAgaWYgKCFzdHJtKSB7IC8vID09PSBaX05VTExcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMjtcbiAgfVxuICB2YXIgd3JhcCA9IDE7XG5cbiAgaWYgKGxldmVsID09PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04kMSkge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH0gZWxzZSBpZiAod2luZG93Qml0cyA+IDE1KSB7XG4gICAgd3JhcCA9IDI7IC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEJDIgfHxcbiAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fFxuICAgIHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQkMSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IkMik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IEJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIGRlZmxhdGUkMShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLJDIgfHwgZmx1c2ggPCAwKSB7XG4gICAgcmV0dXJuIHN0cm0gPyBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IkMikgOiBaX1NUUkVBTV9FUlJPUiQyO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICghc3RybS5pbnB1dCAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB8fFxuICAgIChzLnN0YXR1cyA9PT0gRklOSVNIX1NUQVRFICYmIGZsdXNoICE9PSBaX0ZJTklTSCQyKSkge1xuICAgIHJldHVybiBlcnIoc3RybSwgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSA/IFpfQlVGX0VSUk9SJDIgOiBaX1NUUkVBTV9FUlJPUiQyKTtcbiAgfVxuXG4gIHMuc3RybSA9IHN0cm07IC8qIGp1c3QgaW4gY2FzZSAqL1xuICBvbGRfZmx1c2ggPSBzLmxhc3RfZmx1c2g7XG4gIHMubGFzdF9mbHVzaCA9IGZsdXNoO1xuXG4gIC8qIFdyaXRlIHRoZSBoZWFkZXIgKi9cbiAgaWYgKHMuc3RhdHVzID09PSBJTklUX1NUQVRFKSB7XG4gICAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgICAgLy8gR1pJUCBoZWFkZXJcbiAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZJDEgfHwgcy5sZXZlbCA8IDIgP1xuICAgICAgICAgICAgNCA6IDApKTtcbiAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAocy5nemhlYWQuaGNyYyA/IDIgOiAwKSArXG4gICAgICAgICAgKCFzLmd6aGVhZC5leHRyYSA/IDAgOiA0KSArXG4gICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAoIXMuZ3poZWFkLmNvbW1lbnQgPyAwIDogMTYpXG4gICAgICAgICk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMTYpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgKHMuc3RyYXRlZ3kgPj0gWl9IVUZGTUFOX09OTFkkMSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9IGVsc2UgLy8gREVGTEFURSBoZWFkZXJcbiAgICB7XG4gICAgICB2YXIgaGVhZGVyID0gKFpfREVGTEFURUQkMiArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSQxIHx8IHMubGV2ZWwgPCAyKSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMztcbiAgICAgIH1cbiAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7XG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkge1xuICAgICAgICBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7XG4gICAgICB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuICAvLyNpZmRlZiBHWklQXG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEgLyogIT0gWl9OVUxMKi8gKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7IC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IE5BTUVfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQubmFtZSAvKiAhPSBaX05VTEwqLyApIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQgLyogIT0gWl9OVUxMKi8gKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7IC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5jb21tZW50LmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuICAvLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LJDI7XG4gICAgfVxuXG4gICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBkbyBhbmQgYXZvaWQgZHVwbGljYXRlIGNvbnNlY3V0aXZlXG4gICAgICogZmx1c2hlcy4gRm9yIHJlcGVhdGVkIGFuZCB1c2VsZXNzIGNhbGxzIHdpdGggWl9GSU5JU0gsIHdlIGtlZXBcbiAgICAgKiByZXR1cm5pbmcgWl9TVFJFQU1fRU5EIGluc3RlYWQgb2YgWl9CVUZfRVJST1IuXG4gICAgICovXG4gIH0gZWxzZSBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiByYW5rKGZsdXNoKSA8PSByYW5rKG9sZF9mbHVzaCkgJiZcbiAgICBmbHVzaCAhPT0gWl9GSU5JU0gkMikge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IkMik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUiQyKTtcbiAgfVxuXG4gIC8qIFN0YXJ0IGEgbmV3IGJsb2NrIG9yIGNvbnRpbnVlIHRoZSBjdXJyZW50IG9uZS5cbiAgICovXG4gIGlmIChzdHJtLmF2YWlsX2luICE9PSAwIHx8IHMubG9va2FoZWFkICE9PSAwIHx8XG4gICAgKGZsdXNoICE9PSBaX05PX0ZMVVNIJDEgJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZJDEpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUkMSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6XG4gICAgICAgIGNvbmZpZ3VyYXRpb25fdGFibGVbcy5sZXZlbF0uZnVuYyhzLCBmbHVzaCkpO1xuXG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfRE9ORSkge1xuICAgICAgcy5zdGF0dXMgPSBGSU5JU0hfU1RBVEU7XG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX05FRURfTU9SRSB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEKSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICAgIC8qIGF2b2lkIEJVRl9FUlJPUiBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIFpfT0skMjtcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCQxKSB7XG4gICAgICAgIF90cl9hbGlnbihzKTtcbiAgICAgIH0gZWxzZSBpZiAoZmx1c2ggIT09IFpfQkxPQ0skMikgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICBfdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIJDEpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgICAgICAvKiBmb3JnZXQgaGlzdG9yeSAqL1xuICAgICAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcblxuICAgICAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCkge1xuICAgICAgICAgICAgcy5zdHJzdGFydCA9IDA7XG4gICAgICAgICAgICBzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuaW5zZXJ0ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqL1xuICAgICAgICByZXR1cm4gWl9PSyQyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCQyKSB7XG4gICAgcmV0dXJuIFpfT0skMjtcbiAgfVxuICBpZiAocy53cmFwIDw9IDApIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRU5EJDI7XG4gIH1cblxuICAvKiBXcml0ZSB0aGUgdHJhaWxlciAqL1xuICBpZiAocy53cmFwID09PSAyKSB7XG4gICAgcHV0X2J5dGUocywgc3RybS5hZGxlciAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gMjQpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgc3RybS50b3RhbF9pbiAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDgpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMTYpICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gMjQpICYgMHhmZik7XG4gIH0gZWxzZSB7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgJiAweGZmZmYpO1xuICB9XG5cbiAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpblxuICAgKiB0byBmbHVzaCB0aGUgcmVzdC5cbiAgICovXG4gIGlmIChzLndyYXAgPiAwKSB7XG4gICAgcy53cmFwID0gLXMud3JhcDtcbiAgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LJDIgOiBaX1NUUkVBTV9FTkQkMjtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZUVuZChzdHJtKSB7XG4gIHZhciBzdGF0dXM7XG5cbiAgaWYgKCFzdHJtIC8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUgLyo9PSBaX05VTEwqLyApIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IkMik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUiQyKSA6IFpfT0skMjtcbn1cblxuLyogTm90IGltcGxlbWVudGVkXG5leHBvcnRzLmRlZmxhdGVCb3VuZCA9IGRlZmxhdGVCb3VuZDtcbmV4cG9ydHMuZGVmbGF0ZUNvcHkgPSBkZWZsYXRlQ29weTtcbmV4cG9ydHMuZGVmbGF0ZVBhcmFtcyA9IGRlZmxhdGVQYXJhbXM7XG5leHBvcnRzLmRlZmxhdGVQZW5kaW5nID0gZGVmbGF0ZVBlbmRpbmc7XG5leHBvcnRzLmRlZmxhdGVQcmltZSA9IGRlZmxhdGVQcmltZTtcbmV4cG9ydHMuZGVmbGF0ZVR1bmUgPSBkZWZsYXRlVHVuZTtcbiovXG5cbi8vIFNlZSBzdGF0ZSBkZWZzIGZyb20gaW5mbGF0ZS5qc1xudmFyIEJBRCQxID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFJDEgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQkMTtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEJDE7XG4gICAgICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICAgICAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmFpbHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTtcbi8vICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCA+IHdoYXZlKTtcbi8vICAgICAgICAgICAgICAgIGlmIChvcCA9PT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnJvbSA9IDA7IC8vIHdpbmRvdyBpbmRleFxuICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93O1xuICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gMDtcbiAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0O1xuICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi9cbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICAgICAgY29udGludWUgZG9kaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEJDE7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFJDE7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEJDE7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICB9XG4gIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7XG5cbiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovXG4gIGxlbiA9IGJpdHMgPj4gMztcbiAgX2luIC09IGxlbjtcbiAgYml0cyAtPSBsZW4gPDwgMztcbiAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi9cbiAgc3RybS5uZXh0X2luID0gX2luO1xuICBzdHJtLm5leHRfb3V0ID0gX291dDtcbiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpO1xuICBzdHJtLmF2YWlsX291dCA9IChfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpKTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICByZXR1cm47XG59XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMkMSA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMkMSA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMkMSA9IDA7XG52YXIgTEVOUyQxID0gMTtcbnZhciBESVNUUyQxID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5mdW5jdGlvbiBpbmZsYXRlX3RhYmxlKHR5cGUsIGxlbnMsIGxlbnNfaW5kZXgsIGNvZGVzLCB0YWJsZSwgdGFibGVfaW5kZXgsIHdvcmssIG9wdHMpIHtcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7IC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi9cbiAgdmFyIG1pbiA9IDAsXG4gICAgbWF4ID0gMDsgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7IC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovXG4gIHZhciBkcm9wID0gMDsgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7IC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAvKiBIdWZmbWFuIGNvZGUgKi9cbiAgdmFyIGluY3I7IC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7IC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7IC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7IC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7IC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi9cbiAgdmFyIGJhc2VfaW5kZXggPSAwO1xuICAvLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7IC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gLyogb3Zlci1zdWJzY3JpYmVkICovXG4gIH1cbiAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09PSBDT0RFUyQxIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7IC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUyQxKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TJDEpIHtcbiAgICBiYXNlID0gbGJhc2U7XG4gICAgYmFzZV9pbmRleCAtPSAyNTc7XG4gICAgZXh0cmEgPSBsZXh0O1xuICAgIGV4dHJhX2luZGV4IC09IDI1NztcbiAgICBlbmQgPSAyNTY7XG5cbiAgfSBlbHNlIHsgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7IC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7IC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMkMSAmJiB1c2VkID4gRU5PVUdIX0xFTlMkMSkgfHxcbiAgICAodHlwZSA9PT0gRElTVFMkMSAmJiB1c2VkID4gRU5PVUdIX0RJU1RTJDEpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH0gZWxzZSBpZiAod29ya1tzeW1dID4gZW5kKSB7XG4gICAgICBoZXJlX29wID0gZXh0cmFbZXh0cmFfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgICAgaGVyZV92YWwgPSBiYXNlW2Jhc2VfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwgMDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGxlbiA9IGxlbnNbbGVuc19pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuXG4gICAgLyogY3JlYXRlIG5ldyBzdWItdGFibGUgaWYgbmVlZGVkICovXG4gICAgaWYgKGxlbiA+IHJvb3QgJiYgKGh1ZmYgJiBtYXNrKSAhPT0gbG93KSB7XG4gICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi9cbiAgICAgIGlmIChkcm9wID09PSAwKSB7XG4gICAgICAgIGRyb3AgPSByb290O1xuICAgICAgfVxuXG4gICAgICAvKiBpbmNyZW1lbnQgcGFzdCBsYXN0IHRhYmxlICovXG4gICAgICBuZXh0ICs9IG1pbjsgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY3VycisrO1xuICAgICAgICBsZWZ0IDw8PSAxO1xuICAgICAgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovXG4gICAgICB1c2VkICs9IDEgPDwgY3VycjtcbiAgICAgIGlmICgodHlwZSA9PT0gTEVOUyQxICYmIHVzZWQgPiBFTk9VR0hfTEVOUyQxKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMkMSAmJiB1c2VkID4gRU5PVUdIX0RJU1RTJDEpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8IDA7XG4gICAgfVxuICB9XG5cbiAgLyogZmlsbCBpbiByZW1haW5pbmcgdGFibGUgZW50cnkgaWYgY29kZSBpcyBpbmNvbXBsZXRlIChndWFyYW50ZWVkIHRvIGhhdmVcbiAgIGF0IG1vc3Qgb25lIHJlbWFpbmluZyBlbnRyeSwgc2luY2UgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlXG4gICBtYXhpbXVtIGNvZGUgbGVuZ3RoIHRoYXQgd2FzIGFsbG93ZWQgdG8gZ2V0IHRoaXMgZmFyIGlzIG9uZSBiaXQpICovXG4gIGlmIChodWZmICE9PSAwKSB7XG4gICAgLy90YWJsZS5vcFtuZXh0ICsgaHVmZl0gPSA2NDsgICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovXG4gICAgLy90YWJsZS5iaXRzW25leHQgKyBodWZmXSA9IGxlbiAtIGRyb3A7XG4gICAgLy90YWJsZS52YWxbbmV4dCArIGh1ZmZdID0gMDtcbiAgICB0YWJsZVtuZXh0ICsgaHVmZl0gPSAoKGxlbiAtIGRyb3ApIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn1cblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0gkMSA9IDQ7XG52YXIgWl9CTE9DSyQxID0gNTtcbnZhciBaX1RSRUVTJDEgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0skMSA9IDA7XG52YXIgWl9TVFJFQU1fRU5EJDEgPSAxO1xudmFyIFpfTkVFRF9ESUNUJDEgPSAyO1xuLy92YXIgWl9FUlJOTyAgICAgICAgID0gLTE7XG52YXIgWl9TVFJFQU1fRVJST1IkMSA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiQxID0gLTM7XG52YXIgWl9NRU1fRVJST1IgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiQxID0gLTU7XG4vL3ZhciBaX1ZFUlNJT05fRVJST1IgPSAtNjtcblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCQxID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgSEVBRCA9IDE7IC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyIEZMQUdTID0gMjsgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciBUSU1FID0gMzsgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgT1MgPSA0OyAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBmbGFncyBhbmQgb3BlcmF0aW5nIHN5c3RlbSAoZ3ppcCkgKi9cbnZhciBFWExFTiA9IDU7IC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciBFWFRSQSA9IDY7IC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyIE5BTUUgPSA3OyAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyIENPTU1FTlQgPSA4OyAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciBIQ1JDID0gOTsgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciBESUNUSUQgPSAxMDsgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyIERJQ1QgPSAxMTsgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsICovXG52YXIgVFlQRSA9IDEyOyAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG52YXIgVFlQRURPID0gMTM7IC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciBTVE9SRUQgPSAxNDsgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciBDT1BZXyA9IDE1OyAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyIENPUFkgPSAxNjsgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciBUQUJMRSA9IDE3OyAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi9cbnZhciBMRU5MRU5TID0gMTg7IC8qIGk6IHdhaXRpbmcgZm9yIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xudmFyIENPREVMRU5TID0gMTk7IC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyIExFTl8gPSAyMDsgLyogaTogc2FtZSBhcyBMRU4gYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi9cbnZhciBMRU4gPSAyMTsgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyIExFTkVYVCA9IDIyOyAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyIERJU1QgPSAyMzsgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyIERJU1RFWFQgPSAyNDsgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgZXh0cmEgYml0cyAqL1xudmFyIE1BVENIID0gMjU7IC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqL1xudmFyIExJVCA9IDI2OyAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyIENIRUNLID0gMjc7IC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBjaGVjayB2YWx1ZSAqL1xudmFyIExFTkdUSCA9IDI4OyAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqL1xudmFyIERPTkUgPSAyOTsgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBCQUQgPSAzMDsgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIE1FTSA9IDMxOyAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIFNZTkMgPSAzMjsgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuXG5cbmZ1bmN0aW9uIHpzd2FwMzIocSkge1xuICByZXR1cm4gKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7IC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7IC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7IC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7IC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7IC8qIHdoZXJlIHRvIHNhdmUgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gKi9cblxuICAvKiBzbGlkaW5nIHdpbmRvdyAqL1xuICB0aGlzLndiaXRzID0gMDsgLyogbG9nIGJhc2UgMiBvZiByZXF1ZXN0ZWQgd2luZG93IHNpemUgKi9cbiAgdGhpcy53c2l6ZSA9IDA7IC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB0aGlzLndoYXZlID0gMDsgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB0aGlzLnduZXh0ID0gMDsgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIHRoaXMud2luZG93ID0gbnVsbDsgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgLyogaW5wdXQgYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuYml0cyA9IDA7IC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovXG4gIHRoaXMub2Zmc2V0ID0gMDsgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7IC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7IC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7IC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAvKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5kaXN0ID0gMDsgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLmhhdmUgPSAwOyAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IEJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IEJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyBCdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAvKiBkeW5hbWljIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuZGlzdGR5biA9IG51bGw7IC8qIGR5bmFtaWMgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5zYW5lID0gMDsgLyogaWYgZmFsc2UsIGFsbG93IGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciAqL1xuICB0aGlzLmJhY2sgPSAwOyAvKiBiaXRzIGJhY2sgb2YgbGFzdCB1bnByb2Nlc3NlZCBsZW5ndGgvbGl0ICovXG4gIHRoaXMud2FzID0gMDsgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTtcbiAgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0cm0udG90YWxfaW4gPSBzdHJtLnRvdGFsX291dCA9IHN0YXRlLnRvdGFsID0gMDtcbiAgc3RybS5tc2cgPSAnJzsgLypaX05VTEwqL1xuICBpZiAoc3RhdGUud3JhcCkgeyAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovXG4gICAgc3RybS5hZGxlciA9IHN0YXRlLndyYXAgJiAxO1xuICB9XG4gIHN0YXRlLm1vZGUgPSBIRUFEO1xuICBzdGF0ZS5sYXN0ID0gMDtcbiAgc3RhdGUuaGF2ZWRpY3QgPSAwO1xuICBzdGF0ZS5kbWF4ID0gMzI3Njg7XG4gIHN0YXRlLmhlYWQgPSBudWxsIC8qWl9OVUxMKi8gO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IEJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IEJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LJDE7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTtcbiAgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7XG4gIH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIC8qIGV4dHJhY3Qgd3JhcCByZXF1ZXN0IGZyb20gd2luZG93Qml0cyBwYXJhbWV0ZXIgKi9cbiAgaWYgKHdpbmRvd0JpdHMgPCAwKSB7XG4gICAgd3JhcCA9IDA7XG4gICAgd2luZG93Qml0cyA9IC13aW5kb3dCaXRzO1xuICB9IGVsc2Uge1xuICAgIHdyYXAgPSAod2luZG93Qml0cyA+PiA0KSArIDE7XG4gICAgaWYgKHdpbmRvd0JpdHMgPCA0OCkge1xuICAgICAgd2luZG93Qml0cyAmPSAxNTtcbiAgICB9XG4gIH1cblxuICAvKiBzZXQgbnVtYmVyIG9mIHdpbmRvdyBiaXRzLCBmcmVlIHdpbmRvdyBpZiBkaWZmZXJlbnQgKi9cbiAgaWYgKHdpbmRvd0JpdHMgJiYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQxO1xuICB9XG4gIC8vc3RybS5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqL1xuXG4gIHN0YXRlID0gbmV3IEluZmxhdGVTdGF0ZSgpO1xuXG4gIC8vaWYgKHN0YXRlID09PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiBhbGxvY2F0ZWRcXG5cIikpO1xuICBzdHJtLnN0YXRlID0gc3RhdGU7XG4gIHN0YXRlLndpbmRvdyA9IG51bGwgLypaX05VTEwqLyA7XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0skMSkge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsIC8qWl9OVUxMKi8gO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IEJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyBCdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkge1xuICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA4O1xuICAgIH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7XG4gICAgICBzdGF0ZS5sZW5zW3N5bSsrXSA9IDk7XG4gICAgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHtcbiAgICAgIHN0YXRlLmxlbnNbc3ltKytdID0gNztcbiAgICB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkge1xuICAgICAgc3RhdGUubGVuc1tzeW0rK10gPSA4O1xuICAgIH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsIDAsIHN0YXRlLndvcmssIHtcbiAgICAgIGJpdHM6IDlcbiAgICB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHtcbiAgICAgIHN0YXRlLmxlbnNbc3ltKytdID0gNTtcbiAgICB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgZGlzdGZpeCwgMCwgc3RhdGUud29yaywge1xuICAgICAgYml0czogNVxuICAgIH0pO1xuXG4gICAgLyogZG8gdGhpcyBqdXN0IG9uY2UgKi9cbiAgICB2aXJnaW4gPSBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmxlbmNvZGUgPSBsZW5maXg7XG4gIHN0YXRlLmxlbmJpdHMgPSA5O1xuICBzdGF0ZS5kaXN0Y29kZSA9IGRpc3RmaXg7XG4gIHN0YXRlLmRpc3RiaXRzID0gNTtcbn1cblxuXG4vKlxuIFVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3Qgd3NpemUgKG5vcm1hbGx5IDMySykgYnl0ZXMgd3JpdHRlbiBiZWZvcmVcbiByZXR1cm5pbmcuICBJZiB3aW5kb3cgZG9lcyBub3QgZXhpc3QgeWV0LCBjcmVhdGUgaXQuICBUaGlzIGlzIG9ubHkgY2FsbGVkXG4gd2hlbiBhIHdpbmRvdyBpcyBhbHJlYWR5IGluIHVzZSwgb3Igd2hlbiBvdXRwdXQgaGFzIGJlZW4gd3JpdHRlbiBkdXJpbmcgdGhpc1xuIGluZmxhdGUgY2FsbCwgYnV0IHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUgc3RyZWFtIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC5cbiBJdCBpcyBhbHNvIGNhbGxlZCB0byBjcmVhdGUgYSB3aW5kb3cgZm9yIGRpY3Rpb25hcnkgZGF0YSB3aGVuIGEgZGljdGlvbmFyeVxuIGlzIGxvYWRlZC5cblxuIFByb3ZpZGluZyBvdXRwdXQgYnVmZmVycyBsYXJnZXIgdGhhbiAzMksgdG8gaW5mbGF0ZSgpIHNob3VsZCBwcm92aWRlIGEgc3BlZWRcbiBhZHZhbnRhZ2UsIHNpbmNlIG9ubHkgdGhlIGxhc3QgMzJLIG9mIG91dHB1dCBpcyBjb3BpZWQgdG8gdGhlIHNsaWRpbmcgd2luZG93XG4gdXBvbiByZXR1cm4gZnJvbSBpbmZsYXRlKCksIGFuZCBzaW5jZSBhbGwgZGlzdGFuY2VzIGFmdGVyIHRoZSBmaXJzdCAzMksgb2ZcbiBvdXRwdXQgd2lsbCBmYWxsIGluIHRoZSBvdXRwdXQgZGF0YSwgbWFraW5nIG1hdGNoIGNvcGllcyBzaW1wbGVyIGFuZCBmYXN0ZXIuXG4gVGhlIGFkdmFudGFnZSBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZSBwcm9jZXNzb3IncyBkYXRhIGNhY2hlcy5cbiAqL1xuZnVuY3Rpb24gdXBkYXRld2luZG93KHN0cm0sIHNyYywgZW5kLCBjb3B5KSB7XG4gIHZhciBkaXN0O1xuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuXG4gIC8qIGlmIGl0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeSwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3aW5kb3cgKi9cbiAgaWYgKHN0YXRlLndpbmRvdyA9PT0gbnVsbCkge1xuICAgIHN0YXRlLndzaXplID0gMSA8PCBzdGF0ZS53Yml0cztcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSAwO1xuXG4gICAgc3RhdGUud2luZG93ID0gbmV3IEJ1Zjgoc3RhdGUud3NpemUpO1xuICB9XG5cbiAgLyogY29weSBzdGF0ZS0+d3NpemUgb3IgbGVzcyBvdXRwdXQgYnl0ZXMgaW50byB0aGUgY2lyY3VsYXIgd2luZG93ICovXG4gIGlmIChjb3B5ID49IHN0YXRlLndzaXplKSB7XG4gICAgYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIHN0YXRlLndzaXplLCBzdGF0ZS53c2l6ZSwgMCk7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gIH0gZWxzZSB7XG4gICAgZGlzdCA9IHN0YXRlLndzaXplIC0gc3RhdGUud25leHQ7XG4gICAgaWYgKGRpc3QgPiBjb3B5KSB7XG4gICAgICBkaXN0ID0gY29weTtcbiAgICB9XG4gICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d25leHQsIGVuZCAtIGNvcHksIGRpc3QpO1xuICAgIGFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBkaXN0LCBzdGF0ZS53bmV4dCk7XG4gICAgY29weSAtPSBkaXN0O1xuICAgIGlmIChjb3B5KSB7XG4gICAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdywgZW5kIC0gY29weSwgY29weSk7XG4gICAgICBhcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgY29weSwgMCk7XG4gICAgICBzdGF0ZS53bmV4dCA9IGNvcHk7XG4gICAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkge1xuICAgICAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkge1xuICAgICAgICBzdGF0ZS53aGF2ZSArPSBkaXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZSQxKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7IC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7IC8qIHNhdmUgc3RhcnRpbmcgYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGNvcHk7IC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgZnJvbTsgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcbiAgdmFyIGhlcmUgPSAwOyAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47IC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi9cbiAgdmFyIHJldDsgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgQnVmOCg0KTsgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqLyBbMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNV07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SJDE7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7XG4gICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgfSAvKiBza2lwIGNoZWNrICovXG5cblxuICAvLy0tLSBMT0FEKCkgLS0tXG4gIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gIG5leHQgPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgLy8tLS1cblxuICBfaW4gPSBoYXZlO1xuICBfb3V0ID0gbGVmdDtcbiAgcmV0ID0gWl9PSyQxO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgICBmb3IgKDs7KSB7XG4gICAgICBzd2l0Y2ggKHN0YXRlLm1vZGUpIHtcbiAgICAgIGNhc2UgSEVBRDpcbiAgICAgICAgaWYgKHN0YXRlLndyYXAgPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRURPO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoKHN0YXRlLndyYXAgJiAyKSAmJiBob2xkID09PSAweDhiMWYpIHsgLyogZ3ppcCBoZWFkZXIgKi9cbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IDAgLypjcmMzMigwTCwgWl9OVUxMLCAwKSovIDtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuXG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IEZMQUdTO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZsYWdzID0gMDsgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8IC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgICAoKChob2xkICYgMHhmZikgLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChob2xkICYgMHgwZikgLypCSVRTKDQpKi8gIT09IFpfREVGTEFURUQkMSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgICBiaXRzIC09IDQ7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgbGVuID0gKGhvbGQgJiAweDBmKSAvKkJJVFMoNCkqLyArIDg7XG4gICAgICAgIGlmIChzdGF0ZS53Yml0cyA9PT0gMCkge1xuICAgICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IHN0YXRlLndiaXRzKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBsZW47XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICB6bGliIGhlYWRlciBva1xcblwiKSk7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEgLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi8gO1xuICAgICAgICBzdGF0ZS5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTtcbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGTEFHUzpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmZsYWdzID0gaG9sZDtcbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEJDEpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUSU1FOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzNdID0gKGhvbGQgPj4+IDI0KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgICAgLy89PT1cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE9TOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgICAgc3RhdGUuaGVhZC5vcyA9IChob2xkID4+IDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWExFTjpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZDtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsIC8qWl9OVUxMKi8gO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWFRSQTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHtcbiAgICAgICAgICAgIGNvcHkgPSBoYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB1bnR5cGVkIGFycmF5IGZvciBtb3JlIGNvbnZlbmllbmQgcHJvY2Vzc2luZyBsYXRlclxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGFycmF5U2V0KFxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgICBjb3B5LFxuICAgICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuIDogY29weSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IE5BTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTkFNRTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwODAwKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29weSA9IDA7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLyApKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IENPTU1FTlQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgxMDAwKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29weSA9IDA7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQuY29tbV9tYXgqLyApKSB7XG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIEhDUkM6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUuY2hlY2sgJiAweGZmZmYpKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7XG4gICAgICAgICAgc3RhdGUuaGVhZC5kb25lID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIERJQ1RJRDpcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElDVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESUNUOlxuICAgICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDApIHtcbiAgICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgICAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgICAvLy0tLVxuICAgICAgICAgIHJldHVybiBaX05FRURfRElDVCQxO1xuICAgICAgICB9XG4gICAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEgLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi8gO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUWVBFOlxuICAgICAgICBpZiAoZmx1c2ggPT09IFpfQkxPQ0skMSB8fCBmbHVzaCA9PT0gWl9UUkVFUyQxKSB7XG4gICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRURPOlxuICAgICAgICBpZiAoc3RhdGUubGFzdCkge1xuICAgICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkgLypCSVRTKDEpKi8gO1xuICAgICAgICAvLy0tLSBEUk9QQklUUygxKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMTtcbiAgICAgICAgYml0cyAtPSAxO1xuICAgICAgICAvLy0tLS8vXG5cbiAgICAgICAgc3dpdGNoICgoaG9sZCAmIDB4MDMpIC8qQklUUygyKSovICkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcXG5cIixcbiAgICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAvKiBmaXhlZCBibG9jayAqL1xuICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTJDEpIHtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU1RPUkVEOlxuICAgICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi9cbiAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9PSAoKGhvbGQgPj4+IDE2KSBeIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQgJiAweGZmZmY7XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09QWV87XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUyQxKSB7XG4gICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09QWV86XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFk6XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7XG4gICAgICAgICAgICBjb3B5ID0gaGF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7XG4gICAgICAgICAgICBjb3B5ID0gbGVmdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gem1lbWNweShwdXQsIG5leHQsIGNvcHkpOyAtLS1cbiAgICAgICAgICBhcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgICBwdXQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRBQkxFOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikgLypCSVRTKDUpKi8gKyAyNTc7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpIC8qQklUUyg1KSovICsgMTtcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDU7XG4gICAgICAgIGJpdHMgLT0gNTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5uY29kZSA9IChob2xkICYgMHgwZikgLypCSVRTKDQpKi8gKyA0O1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNDtcbiAgICAgICAgYml0cyAtPSA0O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIC8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORFxuICAgICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8jZW5kaWZcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5MRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAoaG9sZCAmIDB4MDcpOyAvL0JJVFMoMyk7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvL3N0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW47XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICAgIG9wdHMgPSB7XG4gICAgICAgICAgYml0czogc3RhdGUubGVuYml0c1xuICAgICAgICB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmhhdmUgPSAwO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09ERUxFTlM6XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGVyZV92YWwgPCAxNikge1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAyO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDAzKTsgLy9CSVRTKDIpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhlcmVfdmFsID09PSAxNykge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDA3KTsgLy9CSVRTKDMpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAxMSArIChob2xkICYgMHg3Zik7IC8vQklUUyg3KTtcbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoNykgLS0tLy9cbiAgICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi9cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovXG4gICAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzXG4gICAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gOTtcblxuICAgICAgICBvcHRzID0ge1xuICAgICAgICAgIGJpdHM6IHN0YXRlLmxlbmJpdHNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS5sZW5zLCAwLCBzdGF0ZS5ubGVuLCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAgIC8vc3RhdGUuZGlzdGNvZGUuY29weShzdGF0ZS5jb2Rlcyk7XG4gICAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICAgIG9wdHMgPSB7XG4gICAgICAgICAgYml0czogc3RhdGUuZGlzdGJpdHNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMkMSkge1xuICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTl86XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOOlxuICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7XG4gICAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgICAgLy8tLS1cbiAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgX291dCk7XG4gICAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgICAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gICAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgICAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICAgICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICAgIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAgICAgICAgIC8vLS0tXG5cbiAgICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07IC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKSAvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgc3RhdGUubGVuZ3RoID0gaGVyZV92YWw7XG4gICAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkgLypCSVRTKHN0YXRlLmV4dHJhKSovIDtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5tb2RlID0gRElTVDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBESVNUOlxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOyAvKkJJVFMoc3RhdGUuZGlzdGJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKSAvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgICAgc3RhdGUubW9kZSA9IERJU1RFWFQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElTVEVYVDpcbiAgICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUub2Zmc2V0ICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkgLypCSVRTKHN0YXRlLmV4dHJhKSovIDtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgfVxuICAgICAgICAvLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gc3RhdGUuZG1heCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vI2VuZGlmXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgc3RhdGUub2Zmc2V0KSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBNQVRDSDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHtcbiAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgIH1cbiAgICAgICAgY29weSA9IF9vdXQgLSBsZWZ0O1xuICAgICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAvKiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4gICAgICAgICAgICAvLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAvLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbiAgICAgICAgICAgIC8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbiAgICAgICAgICAgIC8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgICAgIC8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgICAgICAgLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgICAgICAgLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgICAvLyAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuICAgICAgICAgICAgLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgICAgICAgIC8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgICAgICAgLy8gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyNlbmRpZlxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLnduZXh0KSB7XG4gICAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgICB9IGVsc2UgeyAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gbGVmdCkge1xuICAgICAgICAgIGNvcHkgPSBsZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBvdXRwdXRbcHV0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExJVDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHtcbiAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgbGVmdC0tO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ0hFQ0s6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIC8vIFVzZSAnfCcgaW5zZGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgICAgaG9sZCB8PSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICAgICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICAgIH1cbiAgICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICAgIGlmICgoc3RhdGUuZmxhZ3MgPyBob2xkIDogenN3YXAzMihob2xkKSkgIT09IHN0YXRlLmNoZWNrKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgZGF0YSBjaGVjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBjaGVjayBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5HVEg7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVOR1RIOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRE9ORTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBET05FOlxuICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQkMTtcbiAgICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgICAgY2FzZSBCQUQ6XG4gICAgICAgIHJldCA9IFpfREFUQV9FUlJPUiQxO1xuICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICBjYXNlIE1FTTpcbiAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgICAgY2FzZSBTWU5DOlxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1IkMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgLy8gaW5mX2xlYXZlIDwtIGhlcmUgaXMgcmVhbCBwbGFjZSBmb3IgXCJnb3RvIGluZl9sZWF2ZVwiLCBlbXVsYXRlZCB2aWEgXCJicmVhayBpbmZfbGVhdmVcIlxuXG4gIC8qXG4gICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLlxuICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyXG4gICAgIGVycm9yLiAgQ2FsbCB1cGRhdGV3aW5kb3coKSB0byBjcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgd2luZG93IHN0YXRlLlxuICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuXG4gICAqL1xuXG4gIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgc3RybS5uZXh0X291dCA9IHB1dDtcbiAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmF2YWlsX2luID0gaGF2ZTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAvLy0tLVxuXG4gIGlmIChzdGF0ZS53c2l6ZSB8fCAoX291dCAhPT0gc3RybS5hdmFpbF9vdXQgJiYgc3RhdGUubW9kZSA8IEJBRCAmJlxuICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gkMSkpKSB7XG4gICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkgO1xuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgK1xuICAgIChzdGF0ZS5tb2RlID09PSBMRU5fIHx8IHN0YXRlLm1vZGUgPT09IENPUFlfID8gMjU2IDogMCk7XG4gIGlmICgoKF9pbiA9PT0gMCAmJiBfb3V0ID09PSAwKSB8fCBmbHVzaCA9PT0gWl9GSU5JU0gkMSkgJiYgcmV0ID09PSBaX09LJDEpIHtcbiAgICByZXQgPSBaX0JVRl9FUlJPUiQxO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVFbmQoc3RybSkge1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSAvKnx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCovICkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUiQxO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKHN0YXRlLndpbmRvdykge1xuICAgIHN0YXRlLndpbmRvdyA9IG51bGw7XG4gIH1cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG4gIHJldHVybiBaX09LJDE7XG59XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5O1xuZXhwb3J0cy5pbmZsYXRlR2V0RGljdGlvbmFyeSA9IGluZmxhdGVHZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xuZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJpbWU7XG5leHBvcnRzLmluZmxhdGVTeW5jID0gaW5mbGF0ZVN5bmM7XG5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xuZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVuZGVybWluZTtcbiovXG5cbi8vIGltcG9ydCBjb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMnO1xuXG5cbi8vIHpsaWIgbW9kZXNcbnZhciBOT05FID0gMDtcbnZhciBERUZMQVRFID0gMTtcbnZhciBJTkZMQVRFID0gMjtcbnZhciBHWklQID0gMztcbnZhciBHVU5aSVAgPSA0O1xudmFyIERFRkxBVEVSQVcgPSA1O1xudmFyIElORkxBVEVSQVcgPSA2O1xudmFyIFVOWklQID0gNztcbnZhciBaX05PX0ZMVVNIPSAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSD0gICAgMSxcbiAgWl9TWU5DX0ZMVVNIPSAgICAyLFxuICBaX0ZVTExfRkxVU0g9ICAgICAgIDMsXG4gIFpfRklOSVNIPSAgICAgICA0LFxuICBaX0JMT0NLPSAgICAgICAgICAgNSxcbiAgWl9UUkVFUz0gICAgICAgICAgICA2LFxuXG4gIC8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAgKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gICovXG4gIFpfT0s9ICAgICAgICAgICAgICAgMCxcbiAgWl9TVFJFQU1fRU5EPSAgICAgICAxLFxuICBaX05FRURfRElDVD0gICAgICAyLFxuICBaX0VSUk5PPSAgICAgICAtMSxcbiAgWl9TVFJFQU1fRVJST1I9ICAgLTIsXG4gIFpfREFUQV9FUlJPUj0gICAgLTMsXG4gIC8vWl9NRU1fRVJST1I6ICAgICAtNCxcbiAgWl9CVUZfRVJST1I9ICAgIC01LFxuICAvL1pfVkVSU0lPTl9FUlJPUjogLTYsXG5cbiAgLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4gIFpfTk9fQ09NUFJFU1NJT049ICAgICAgICAgMCxcbiAgWl9CRVNUX1NQRUVEPSAgICAgICAgICAgICAxLFxuICBaX0JFU1RfQ09NUFJFU1NJT049ICAgICAgIDksXG4gIFpfREVGQVVMVF9DT01QUkVTU0lPTj0gICAtMSxcblxuXG4gIFpfRklMVEVSRUQ9ICAgICAgICAgICAgICAgMSxcbiAgWl9IVUZGTUFOX09OTFk9ICAgICAgICAgICAyLFxuICBaX1JMRT0gICAgICAgICAgICAgICAgICAgIDMsXG4gIFpfRklYRUQ9ICAgICAgICAgICAgICAgICAgNCxcbiAgWl9ERUZBVUxUX1NUUkFURUdZPSAgICAgICAwLFxuXG4gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi9cbiAgWl9CSU5BUlk9ICAgICAgICAgICAgICAgICAwLFxuICBaX1RFWFQ9ICAgICAgICAgICAgICAgICAgIDEsXG4gIC8vWl9BU0NJSTogICAgICAgICAgICAgICAgMSwgLy8gPSBaX1RFWFQgKGRlcHJlY2F0ZWQpXG4gIFpfVU5LTk9XTj0gICAgICAgICAgICAgICAgMixcblxuICAvKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbiAgWl9ERUZMQVRFRD0gICAgICAgICAgICAgICA4O1xuZnVuY3Rpb24gWmxpYiQxKG1vZGUpIHtcbiAgaWYgKG1vZGUgPCBERUZMQVRFIHx8IG1vZGUgPiBVTlpJUClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYWQgYXJndW1lbnQnKTtcblxuICB0aGlzLm1vZGUgPSBtb2RlO1xuICB0aGlzLmluaXRfZG9uZSA9IGZhbHNlO1xuICB0aGlzLndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7XG4gIHRoaXMucGVuZGluZ19jbG9zZSA9IGZhbHNlO1xuICB0aGlzLndpbmRvd0JpdHMgPSAwO1xuICB0aGlzLmxldmVsID0gMDtcbiAgdGhpcy5tZW1MZXZlbCA9IDA7XG4gIHRoaXMuc3RyYXRlZ3kgPSAwO1xuICB0aGlzLmRpY3Rpb25hcnkgPSBudWxsO1xufVxuXG5abGliJDEucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbih3aW5kb3dCaXRzLCBsZXZlbCwgbWVtTGV2ZWwsIHN0cmF0ZWd5LCBkaWN0aW9uYXJ5KSB7XG4gIHRoaXMud2luZG93Qml0cyA9IHdpbmRvd0JpdHM7XG4gIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgdGhpcy5tZW1MZXZlbCA9IG1lbUxldmVsO1xuICB0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gIC8vIGRpY3Rpb25hcnkgbm90IHN1cHBvcnRlZC5cblxuICBpZiAodGhpcy5tb2RlID09PSBHWklQIHx8IHRoaXMubW9kZSA9PT0gR1VOWklQKVxuICAgIHRoaXMud2luZG93Qml0cyArPSAxNjtcblxuICBpZiAodGhpcy5tb2RlID09PSBVTlpJUClcbiAgICB0aGlzLndpbmRvd0JpdHMgKz0gMzI7XG5cbiAgaWYgKHRoaXMubW9kZSA9PT0gREVGTEFURVJBVyB8fCB0aGlzLm1vZGUgPT09IElORkxBVEVSQVcpXG4gICAgdGhpcy53aW5kb3dCaXRzID0gLXRoaXMud2luZG93Qml0cztcblxuICB0aGlzLnN0cm0gPSBuZXcgWlN0cmVhbSgpO1xuICB2YXIgc3RhdHVzO1xuICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICBjYXNlIERFRkxBVEU6XG4gIGNhc2UgR1pJUDpcbiAgY2FzZSBERUZMQVRFUkFXOlxuICAgIHN0YXR1cyA9IGRlZmxhdGVJbml0MihcbiAgICAgIHRoaXMuc3RybSxcbiAgICAgIHRoaXMubGV2ZWwsXG4gICAgICBaX0RFRkxBVEVELFxuICAgICAgdGhpcy53aW5kb3dCaXRzLFxuICAgICAgdGhpcy5tZW1MZXZlbCxcbiAgICAgIHRoaXMuc3RyYXRlZ3lcbiAgICApO1xuICAgIGJyZWFrO1xuICBjYXNlIElORkxBVEU6XG4gIGNhc2UgR1VOWklQOlxuICBjYXNlIElORkxBVEVSQVc6XG4gIGNhc2UgVU5aSVA6XG4gICAgc3RhdHVzICA9IGluZmxhdGVJbml0MihcbiAgICAgIHRoaXMuc3RybSxcbiAgICAgIHRoaXMud2luZG93Qml0c1xuICAgICk7XG4gICAgYnJlYWs7XG4gIGRlZmF1bHQ6XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGUgJyArIHRoaXMubW9kZSk7XG4gIH1cblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhpcy5fZXJyb3Ioc3RhdHVzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7XG4gIHRoaXMuaW5pdF9kb25lID0gdHJ1ZTtcbn07XG5cblpsaWIkMS5wcm90b3R5cGUucGFyYW1zID0gZnVuY3Rpb24oKSB7XG4gIHRocm93IG5ldyBFcnJvcignZGVmbGF0ZVBhcmFtcyBOb3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5abGliJDEucHJvdG90eXBlLl93cml0ZUNoZWNrID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5pbml0X2RvbmUpXG4gICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZSBiZWZvcmUgaW5pdCcpO1xuXG4gIGlmICh0aGlzLm1vZGUgPT09IE5PTkUpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdhbHJlYWR5IGZpbmFsaXplZCcpO1xuXG4gIGlmICh0aGlzLndyaXRlX2luX3Byb2dyZXNzKVxuICAgIHRocm93IG5ldyBFcnJvcignd3JpdGUgYWxyZWFkeSBpbiBwcm9ncmVzcycpO1xuXG4gIGlmICh0aGlzLnBlbmRpbmdfY2xvc2UpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbG9zZSBpcyBwZW5kaW5nJyk7XG59O1xuXG5abGliJDEucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZmx1c2gsIGlucHV0LCBpbl9vZmYsIGluX2xlbiwgb3V0LCBvdXRfb2ZmLCBvdXRfbGVuKSB7XG4gIHRoaXMuX3dyaXRlQ2hlY2soKTtcbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IHRydWU7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBicm93c2VyJDEubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgc2VsZi53cml0ZV9pbl9wcm9ncmVzcyA9IGZhbHNlO1xuICAgIHZhciByZXMgPSBzZWxmLl93cml0ZShmbHVzaCwgaW5wdXQsIGluX29mZiwgaW5fbGVuLCBvdXQsIG91dF9vZmYsIG91dF9sZW4pO1xuICAgIHNlbGYuY2FsbGJhY2socmVzWzBdLCByZXNbMV0pO1xuXG4gICAgaWYgKHNlbGYucGVuZGluZ19jbG9zZSlcbiAgICAgIHNlbGYuY2xvc2UoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBzZXQgbWV0aG9kIGZvciBOb2RlIGJ1ZmZlcnMsIHVzZWQgYnkgcGFrb1xuZnVuY3Rpb24gYnVmZmVyU2V0KGRhdGEsIG9mZnNldCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gZGF0YVtpXTtcbiAgfVxufVxuXG5abGliJDEucHJvdG90eXBlLndyaXRlU3luYyA9IGZ1bmN0aW9uKGZsdXNoLCBpbnB1dCwgaW5fb2ZmLCBpbl9sZW4sIG91dCwgb3V0X29mZiwgb3V0X2xlbikge1xuICB0aGlzLl93cml0ZUNoZWNrKCk7XG4gIHJldHVybiB0aGlzLl93cml0ZShmbHVzaCwgaW5wdXQsIGluX29mZiwgaW5fbGVuLCBvdXQsIG91dF9vZmYsIG91dF9sZW4pO1xufTtcblxuWmxpYiQxLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihmbHVzaCwgaW5wdXQsIGluX29mZiwgaW5fbGVuLCBvdXQsIG91dF9vZmYsIG91dF9sZW4pIHtcbiAgdGhpcy53cml0ZV9pbl9wcm9ncmVzcyA9IHRydWU7XG5cbiAgaWYgKGZsdXNoICE9PSBaX05PX0ZMVVNIICYmXG4gICAgICBmbHVzaCAhPT0gWl9QQVJUSUFMX0ZMVVNIICYmXG4gICAgICBmbHVzaCAhPT0gWl9TWU5DX0ZMVVNIICYmXG4gICAgICBmbHVzaCAhPT0gWl9GVUxMX0ZMVVNIICYmXG4gICAgICBmbHVzaCAhPT0gWl9GSU5JU0ggJiZcbiAgICAgIGZsdXNoICE9PSBaX0JMT0NLKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZsdXNoIHZhbHVlJyk7XG4gIH1cblxuICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgIGlucHV0ID0gbmV3IEJ1ZmZlcigwKTtcbiAgICBpbl9sZW4gPSAwO1xuICAgIGluX29mZiA9IDA7XG4gIH1cblxuICBpZiAob3V0Ll9zZXQpXG4gICAgb3V0LnNldCA9IG91dC5fc2V0O1xuICBlbHNlXG4gICAgb3V0LnNldCA9IGJ1ZmZlclNldDtcblxuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgc3RybS5hdmFpbF9pbiA9IGluX2xlbjtcbiAgc3RybS5pbnB1dCA9IGlucHV0O1xuICBzdHJtLm5leHRfaW4gPSBpbl9vZmY7XG4gIHN0cm0uYXZhaWxfb3V0ID0gb3V0X2xlbjtcbiAgc3RybS5vdXRwdXQgPSBvdXQ7XG4gIHN0cm0ubmV4dF9vdXQgPSBvdXRfb2ZmO1xuICB2YXIgc3RhdHVzO1xuICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICBjYXNlIERFRkxBVEU6XG4gIGNhc2UgR1pJUDpcbiAgY2FzZSBERUZMQVRFUkFXOlxuICAgIHN0YXR1cyA9IGRlZmxhdGUkMShzdHJtLCBmbHVzaCk7XG4gICAgYnJlYWs7XG4gIGNhc2UgVU5aSVA6XG4gIGNhc2UgSU5GTEFURTpcbiAgY2FzZSBHVU5aSVA6XG4gIGNhc2UgSU5GTEFURVJBVzpcbiAgICBzdGF0dXMgPSBpbmZsYXRlJDEoc3RybSwgZmx1c2gpO1xuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBtb2RlICcgKyB0aGlzLm1vZGUpO1xuICB9XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gWl9PSykge1xuICAgIHRoaXMuX2Vycm9yKHN0YXR1cyk7XG4gIH1cblxuICB0aGlzLndyaXRlX2luX3Byb2dyZXNzID0gZmFsc2U7XG4gIHJldHVybiBbc3RybS5hdmFpbF9pbiwgc3RybS5hdmFpbF9vdXRdO1xufTtcblxuWmxpYiQxLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy53cml0ZV9pbl9wcm9ncmVzcykge1xuICAgIHRoaXMucGVuZGluZ19jbG9zZSA9IHRydWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5wZW5kaW5nX2Nsb3NlID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMubW9kZSA9PT0gREVGTEFURSB8fCB0aGlzLm1vZGUgPT09IEdaSVAgfHwgdGhpcy5tb2RlID09PSBERUZMQVRFUkFXKSB7XG4gICAgZGVmbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICB9IGVsc2Uge1xuICAgIGluZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgfVxuXG4gIHRoaXMubW9kZSA9IE5PTkU7XG59O1xudmFyIHN0YXR1cztcblpsaWIkMS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgY2FzZSBERUZMQVRFOlxuICBjYXNlIERFRkxBVEVSQVc6XG4gICAgc3RhdHVzID0gZGVmbGF0ZVJlc2V0KHRoaXMuc3RybSk7XG4gICAgYnJlYWs7XG4gIGNhc2UgSU5GTEFURTpcbiAgY2FzZSBJTkZMQVRFUkFXOlxuICAgIHN0YXR1cyA9IGluZmxhdGVSZXNldCh0aGlzLnN0cm0pO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKHN0YXR1cyAhPT0gWl9PSykge1xuICAgIHRoaXMuX2Vycm9yKHN0YXR1cyk7XG4gIH1cbn07XG5cblpsaWIkMS5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24oc3RhdHVzKSB7XG4gIHRoaXMub25lcnJvcihtc2dbc3RhdHVzXSArICc6ICcgKyB0aGlzLnN0cm0ubXNnLCBzdGF0dXMpO1xuXG4gIHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MgPSBmYWxzZTtcbiAgaWYgKHRoaXMucGVuZGluZ19jbG9zZSlcbiAgICB0aGlzLmNsb3NlKCk7XG59O1xuXG52YXIgX2JpbmRpbmcgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0REVGTEFURTogREVGTEFURSxcblx0REVGTEFURVJBVzogREVGTEFURVJBVyxcblx0R1VOWklQOiBHVU5aSVAsXG5cdEdaSVA6IEdaSVAsXG5cdElORkxBVEU6IElORkxBVEUsXG5cdElORkxBVEVSQVc6IElORkxBVEVSQVcsXG5cdE5PTkU6IE5PTkUsXG5cdFVOWklQOiBVTlpJUCxcblx0Wl9CRVNUX0NPTVBSRVNTSU9OOiBaX0JFU1RfQ09NUFJFU1NJT04sXG5cdFpfQkVTVF9TUEVFRDogWl9CRVNUX1NQRUVELFxuXHRaX0JJTkFSWTogWl9CSU5BUlksXG5cdFpfQkxPQ0s6IFpfQkxPQ0ssXG5cdFpfQlVGX0VSUk9SOiBaX0JVRl9FUlJPUixcblx0Wl9EQVRBX0VSUk9SOiBaX0RBVEFfRVJST1IsXG5cdFpfREVGQVVMVF9DT01QUkVTU0lPTjogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuXHRaX0RFRkFVTFRfU1RSQVRFR1k6IFpfREVGQVVMVF9TVFJBVEVHWSxcblx0Wl9ERUZMQVRFRDogWl9ERUZMQVRFRCxcblx0Wl9FUlJOTzogWl9FUlJOTyxcblx0Wl9GSUxURVJFRDogWl9GSUxURVJFRCxcblx0Wl9GSU5JU0g6IFpfRklOSVNILFxuXHRaX0ZJWEVEOiBaX0ZJWEVELFxuXHRaX0ZVTExfRkxVU0g6IFpfRlVMTF9GTFVTSCxcblx0Wl9IVUZGTUFOX09OTFk6IFpfSFVGRk1BTl9PTkxZLFxuXHRaX05FRURfRElDVDogWl9ORUVEX0RJQ1QsXG5cdFpfTk9fQ09NUFJFU1NJT046IFpfTk9fQ09NUFJFU1NJT04sXG5cdFpfTk9fRkxVU0g6IFpfTk9fRkxVU0gsXG5cdFpfT0s6IFpfT0ssXG5cdFpfUEFSVElBTF9GTFVTSDogWl9QQVJUSUFMX0ZMVVNILFxuXHRaX1JMRTogWl9STEUsXG5cdFpfU1RSRUFNX0VORDogWl9TVFJFQU1fRU5ELFxuXHRaX1NUUkVBTV9FUlJPUjogWl9TVFJFQU1fRVJST1IsXG5cdFpfU1lOQ19GTFVTSDogWl9TWU5DX0ZMVVNILFxuXHRaX1RFWFQ6IFpfVEVYVCxcblx0Wl9UUkVFUzogWl9UUkVFUyxcblx0Wl9VTktOT1dOOiBaX1VOS05PV04sXG5cdFpsaWI6IFpsaWIkMVxufSk7XG5cbmZ1bmN0aW9uIGFzc2VydCAoYSwgbXNnKSB7XG4gIGlmICghYSkge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICB9XG59XG52YXIgYmluZGluZyA9IHt9O1xuT2JqZWN0LmtleXMoX2JpbmRpbmcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBiaW5kaW5nW2tleV0gPSBfYmluZGluZ1trZXldO1xufSk7XG4vLyB6bGliIGRvZXNuJ3QgcHJvdmlkZSB0aGVzZSwgc28ga2x1ZGdlIHRoZW0gaW4gZm9sbG93aW5nIHRoZSBzYW1lXG4vLyBjb25zdCBuYW1pbmcgc2NoZW1lIHpsaWIgdXNlcy5cbmJpbmRpbmcuWl9NSU5fV0lORE9XQklUUyA9IDg7XG5iaW5kaW5nLlpfTUFYX1dJTkRPV0JJVFMgPSAxNTtcbmJpbmRpbmcuWl9ERUZBVUxUX1dJTkRPV0JJVFMgPSAxNTtcblxuLy8gZmV3ZXIgdGhhbiA2NCBieXRlcyBwZXIgY2h1bmsgaXMgc3R1cGlkLlxuLy8gdGVjaG5pY2FsbHkgaXQgY291bGQgd29yayB3aXRoIGFzIGZldyBhcyA4LCBidXQgZXZlbiA2NCBieXRlc1xuLy8gaXMgYWJzdXJkbHkgbG93LiAgVXN1YWxseSBhIE1CIG9yIG1vcmUgaXMgYmVzdC5cbmJpbmRpbmcuWl9NSU5fQ0hVTksgPSA2NDtcbmJpbmRpbmcuWl9NQVhfQ0hVTksgPSBJbmZpbml0eTtcbmJpbmRpbmcuWl9ERUZBVUxUX0NIVU5LID0gKDE2ICogMTAyNCk7XG5cbmJpbmRpbmcuWl9NSU5fTUVNTEVWRUwgPSAxO1xuYmluZGluZy5aX01BWF9NRU1MRVZFTCA9IDk7XG5iaW5kaW5nLlpfREVGQVVMVF9NRU1MRVZFTCA9IDg7XG5cbmJpbmRpbmcuWl9NSU5fTEVWRUwgPSAtMTtcbmJpbmRpbmcuWl9NQVhfTEVWRUwgPSA5O1xuYmluZGluZy5aX0RFRkFVTFRfTEVWRUwgPSBiaW5kaW5nLlpfREVGQVVMVF9DT01QUkVTU0lPTjtcblxuXG4vLyB0cmFuc2xhdGlvbiB0YWJsZSBmb3IgcmV0dXJuIGNvZGVzLlxudmFyIGNvZGVzID0ge1xuICBaX09LOiBiaW5kaW5nLlpfT0ssXG4gIFpfU1RSRUFNX0VORDogYmluZGluZy5aX1NUUkVBTV9FTkQsXG4gIFpfTkVFRF9ESUNUOiBiaW5kaW5nLlpfTkVFRF9ESUNULFxuICBaX0VSUk5POiBiaW5kaW5nLlpfRVJSTk8sXG4gIFpfU1RSRUFNX0VSUk9SOiBiaW5kaW5nLlpfU1RSRUFNX0VSUk9SLFxuICBaX0RBVEFfRVJST1I6IGJpbmRpbmcuWl9EQVRBX0VSUk9SLFxuICBaX01FTV9FUlJPUjogYmluZGluZy5aX01FTV9FUlJPUixcbiAgWl9CVUZfRVJST1I6IGJpbmRpbmcuWl9CVUZfRVJST1IsXG4gIFpfVkVSU0lPTl9FUlJPUjogYmluZGluZy5aX1ZFUlNJT05fRVJST1Jcbn07XG5cbk9iamVjdC5rZXlzKGNvZGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgY29kZXNbY29kZXNba11dID0gaztcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVEZWZsYXRlKG8pIHtcbiAgcmV0dXJuIG5ldyBEZWZsYXRlKG8pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbmZsYXRlKG8pIHtcbiAgcmV0dXJuIG5ldyBJbmZsYXRlKG8pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZWZsYXRlUmF3KG8pIHtcbiAgcmV0dXJuIG5ldyBEZWZsYXRlUmF3KG8pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbmZsYXRlUmF3KG8pIHtcbiAgcmV0dXJuIG5ldyBJbmZsYXRlUmF3KG8pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHemlwKG8pIHtcbiAgcmV0dXJuIG5ldyBHemlwKG8pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHdW56aXAobykge1xuICByZXR1cm4gbmV3IEd1bnppcChvKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVW56aXAobykge1xuICByZXR1cm4gbmV3IFVuemlwKG8pO1xufVxuXG5cbi8vIENvbnZlbmllbmNlIG1ldGhvZHMuXG4vLyBjb21wcmVzcy9kZWNvbXByZXNzIGEgc3RyaW5nIG9yIGJ1ZmZlciBpbiBvbmUgc3RlcC5cbmZ1bmN0aW9uIGRlZmxhdGUoYnVmZmVyLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIHJldHVybiB6bGliQnVmZmVyKG5ldyBEZWZsYXRlKG9wdHMpLCBidWZmZXIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZGVmbGF0ZVN5bmMoYnVmZmVyLCBvcHRzKSB7XG4gIHJldHVybiB6bGliQnVmZmVyU3luYyhuZXcgRGVmbGF0ZShvcHRzKSwgYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gZ3ppcChidWZmZXIsIG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0cztcbiAgICBvcHRzID0ge307XG4gIH1cbiAgcmV0dXJuIHpsaWJCdWZmZXIobmV3IEd6aXAob3B0cyksIGJ1ZmZlciwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBnemlwU3luYyhidWZmZXIsIG9wdHMpIHtcbiAgcmV0dXJuIHpsaWJCdWZmZXJTeW5jKG5ldyBHemlwKG9wdHMpLCBidWZmZXIpO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGJ1ZmZlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICByZXR1cm4gemxpYkJ1ZmZlcihuZXcgRGVmbGF0ZVJhdyhvcHRzKSwgYnVmZmVyLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVSYXdTeW5jKGJ1ZmZlciwgb3B0cykge1xuICByZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IERlZmxhdGVSYXcob3B0cyksIGJ1ZmZlcik7XG59XG5cbmZ1bmN0aW9uIHVuemlwKGJ1ZmZlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICByZXR1cm4gemxpYkJ1ZmZlcihuZXcgVW56aXAob3B0cyksIGJ1ZmZlciwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiB1bnppcFN5bmMoYnVmZmVyLCBvcHRzKSB7XG4gIHJldHVybiB6bGliQnVmZmVyU3luYyhuZXcgVW56aXAob3B0cyksIGJ1ZmZlcik7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoYnVmZmVyLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIHJldHVybiB6bGliQnVmZmVyKG5ldyBJbmZsYXRlKG9wdHMpLCBidWZmZXIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVN5bmMoYnVmZmVyLCBvcHRzKSB7XG4gIHJldHVybiB6bGliQnVmZmVyU3luYyhuZXcgSW5mbGF0ZShvcHRzKSwgYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gZ3VuemlwKGJ1ZmZlciwgb3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRzO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuICByZXR1cm4gemxpYkJ1ZmZlcihuZXcgR3VuemlwKG9wdHMpLCBidWZmZXIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ3VuemlwU3luYyhidWZmZXIsIG9wdHMpIHtcbiAgcmV0dXJuIHpsaWJCdWZmZXJTeW5jKG5ldyBHdW56aXAob3B0cyksIGJ1ZmZlcik7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSYXcoYnVmZmVyLCBvcHRzLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdHM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG4gIHJldHVybiB6bGliQnVmZmVyKG5ldyBJbmZsYXRlUmF3KG9wdHMpLCBidWZmZXIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJhd1N5bmMoYnVmZmVyLCBvcHRzKSB7XG4gIHJldHVybiB6bGliQnVmZmVyU3luYyhuZXcgSW5mbGF0ZVJhdyhvcHRzKSwgYnVmZmVyKTtcbn1cblxuZnVuY3Rpb24gemxpYkJ1ZmZlcihlbmdpbmUsIGJ1ZmZlciwgY2FsbGJhY2spIHtcbiAgdmFyIGJ1ZmZlcnMgPSBbXTtcbiAgdmFyIG5yZWFkID0gMDtcblxuICBlbmdpbmUub24oJ2Vycm9yJywgb25FcnJvcik7XG4gIGVuZ2luZS5vbignZW5kJywgb25FbmQpO1xuXG4gIGVuZ2luZS5lbmQoYnVmZmVyKTtcbiAgZmxvdygpO1xuXG4gIGZ1bmN0aW9uIGZsb3coKSB7XG4gICAgdmFyIGNodW5rO1xuICAgIHdoaWxlIChudWxsICE9PSAoY2h1bmsgPSBlbmdpbmUucmVhZCgpKSkge1xuICAgICAgYnVmZmVycy5wdXNoKGNodW5rKTtcbiAgICAgIG5yZWFkICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gICAgZW5naW5lLm9uY2UoJ3JlYWRhYmxlJywgZmxvdyk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkVycm9yKGVycikge1xuICAgIGVuZ2luZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25FbmQpO1xuICAgIGVuZ2luZS5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCBmbG93KTtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25FbmQoKSB7XG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycywgbnJlYWQpO1xuICAgIGJ1ZmZlcnMgPSBbXTtcbiAgICBjYWxsYmFjayhudWxsLCBidWYpO1xuICAgIGVuZ2luZS5jbG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHpsaWJCdWZmZXJTeW5jKGVuZ2luZSwgYnVmZmVyKSB7XG4gIGlmICh0eXBlb2YgYnVmZmVyID09PSAnc3RyaW5nJylcbiAgICBidWZmZXIgPSBuZXcgQnVmZmVyKGJ1ZmZlcik7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZmZlcikpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTm90IGEgc3RyaW5nIG9yIGJ1ZmZlcicpO1xuXG4gIHZhciBmbHVzaEZsYWcgPSBiaW5kaW5nLlpfRklOSVNIO1xuXG4gIHJldHVybiBlbmdpbmUuX3Byb2Nlc3NDaHVuayhidWZmZXIsIGZsdXNoRmxhZyk7XG59XG5cbi8vIGdlbmVyaWMgemxpYlxuLy8gbWluaW1hbCAyLWJ5dGUgaGVhZGVyXG5mdW5jdGlvbiBEZWZsYXRlKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0cyk7XG4gIFpsaWIuY2FsbCh0aGlzLCBvcHRzLCBiaW5kaW5nLkRFRkxBVEUpO1xufVxuXG5mdW5jdGlvbiBJbmZsYXRlKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKSByZXR1cm4gbmV3IEluZmxhdGUob3B0cyk7XG4gIFpsaWIuY2FsbCh0aGlzLCBvcHRzLCBiaW5kaW5nLklORkxBVEUpO1xufVxuXG5cblxuLy8gZ3ppcCAtIGJpZ2dlciBoZWFkZXIsIHNhbWUgZGVmbGF0ZSBjb21wcmVzc2lvblxuZnVuY3Rpb24gR3ppcChvcHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBHemlwKSkgcmV0dXJuIG5ldyBHemlwKG9wdHMpO1xuICBabGliLmNhbGwodGhpcywgb3B0cywgYmluZGluZy5HWklQKTtcbn1cblxuZnVuY3Rpb24gR3VuemlwKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEd1bnppcCkpIHJldHVybiBuZXcgR3VuemlwKG9wdHMpO1xuICBabGliLmNhbGwodGhpcywgb3B0cywgYmluZGluZy5HVU5aSVApO1xufVxuXG5cblxuLy8gcmF3IC0gbm8gaGVhZGVyXG5mdW5jdGlvbiBEZWZsYXRlUmF3KG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGVSYXcpKSByZXR1cm4gbmV3IERlZmxhdGVSYXcob3B0cyk7XG4gIFpsaWIuY2FsbCh0aGlzLCBvcHRzLCBiaW5kaW5nLkRFRkxBVEVSQVcpO1xufVxuXG5mdW5jdGlvbiBJbmZsYXRlUmF3KG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGVSYXcpKSByZXR1cm4gbmV3IEluZmxhdGVSYXcob3B0cyk7XG4gIFpsaWIuY2FsbCh0aGlzLCBvcHRzLCBiaW5kaW5nLklORkxBVEVSQVcpO1xufVxuXG5cbi8vIGF1dG8tZGV0ZWN0IGhlYWRlci5cbmZ1bmN0aW9uIFVuemlwKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFVuemlwKSkgcmV0dXJuIG5ldyBVbnppcChvcHRzKTtcbiAgWmxpYi5jYWxsKHRoaXMsIG9wdHMsIGJpbmRpbmcuVU5aSVApO1xufVxuXG5cbi8vIHRoZSBabGliIGNsYXNzIHRoZXkgYWxsIGluaGVyaXQgZnJvbVxuLy8gVGhpcyB0aGluZyBtYW5hZ2VzIHRoZSBxdWV1ZSBvZiByZXF1ZXN0cywgYW5kIHJldHVybnNcbi8vIHRydWUgb3IgZmFsc2UgaWYgdGhlcmUgaXMgYW55dGhpbmcgaW4gdGhlIHF1ZXVlIHdoZW5cbi8vIHlvdSBjYWxsIHRoZSAud3JpdGUoKSBtZXRob2QuXG5cbmZ1bmN0aW9uIFpsaWIob3B0cywgbW9kZSkge1xuICB0aGlzLl9vcHRzID0gb3B0cyA9IG9wdHMgfHwge307XG4gIHRoaXMuX2NodW5rU2l6ZSA9IG9wdHMuY2h1bmtTaXplIHx8IGJpbmRpbmcuWl9ERUZBVUxUX0NIVU5LO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdHMpO1xuXG4gIGlmIChvcHRzLmZsdXNoKSB7XG4gICAgaWYgKG9wdHMuZmx1c2ggIT09IGJpbmRpbmcuWl9OT19GTFVTSCAmJlxuICAgICAgICBvcHRzLmZsdXNoICE9PSBiaW5kaW5nLlpfUEFSVElBTF9GTFVTSCAmJlxuICAgICAgICBvcHRzLmZsdXNoICE9PSBiaW5kaW5nLlpfU1lOQ19GTFVTSCAmJlxuICAgICAgICBvcHRzLmZsdXNoICE9PSBiaW5kaW5nLlpfRlVMTF9GTFVTSCAmJlxuICAgICAgICBvcHRzLmZsdXNoICE9PSBiaW5kaW5nLlpfRklOSVNIICYmXG4gICAgICAgIG9wdHMuZmx1c2ggIT09IGJpbmRpbmcuWl9CTE9DSykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZsdXNoIGZsYWc6ICcgKyBvcHRzLmZsdXNoKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5fZmx1c2hGbGFnID0gb3B0cy5mbHVzaCB8fCBiaW5kaW5nLlpfTk9fRkxVU0g7XG5cbiAgaWYgKG9wdHMuY2h1bmtTaXplKSB7XG4gICAgaWYgKG9wdHMuY2h1bmtTaXplIDwgYmluZGluZy5aX01JTl9DSFVOSyB8fFxuICAgICAgICBvcHRzLmNodW5rU2l6ZSA+IGJpbmRpbmcuWl9NQVhfQ0hVTkspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaHVuayBzaXplOiAnICsgb3B0cy5jaHVua1NpemUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLndpbmRvd0JpdHMpIHtcbiAgICBpZiAob3B0cy53aW5kb3dCaXRzIDwgYmluZGluZy5aX01JTl9XSU5ET1dCSVRTIHx8XG4gICAgICAgIG9wdHMud2luZG93Qml0cyA+IGJpbmRpbmcuWl9NQVhfV0lORE9XQklUUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHdpbmRvd0JpdHM6ICcgKyBvcHRzLndpbmRvd0JpdHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLmxldmVsKSB7XG4gICAgaWYgKG9wdHMubGV2ZWwgPCBiaW5kaW5nLlpfTUlOX0xFVkVMIHx8XG4gICAgICAgIG9wdHMubGV2ZWwgPiBiaW5kaW5nLlpfTUFYX0xFVkVMKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29tcHJlc3Npb24gbGV2ZWw6ICcgKyBvcHRzLmxldmVsKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5tZW1MZXZlbCkge1xuICAgIGlmIChvcHRzLm1lbUxldmVsIDwgYmluZGluZy5aX01JTl9NRU1MRVZFTCB8fFxuICAgICAgICBvcHRzLm1lbUxldmVsID4gYmluZGluZy5aX01BWF9NRU1MRVZFTCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lbUxldmVsOiAnICsgb3B0cy5tZW1MZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMuc3RyYXRlZ3kpIHtcbiAgICBpZiAob3B0cy5zdHJhdGVneSAhPSBiaW5kaW5nLlpfRklMVEVSRUQgJiZcbiAgICAgICAgb3B0cy5zdHJhdGVneSAhPSBiaW5kaW5nLlpfSFVGRk1BTl9PTkxZICYmXG4gICAgICAgIG9wdHMuc3RyYXRlZ3kgIT0gYmluZGluZy5aX1JMRSAmJlxuICAgICAgICBvcHRzLnN0cmF0ZWd5ICE9IGJpbmRpbmcuWl9GSVhFRCAmJlxuICAgICAgICBvcHRzLnN0cmF0ZWd5ICE9IGJpbmRpbmcuWl9ERUZBVUxUX1NUUkFURUdZKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyYXRlZ3k6ICcgKyBvcHRzLnN0cmF0ZWd5KTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5kaWN0aW9uYXJ5KSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIob3B0cy5kaWN0aW9uYXJ5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRpY3Rpb25hcnk6IGl0IHNob3VsZCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuX2JpbmRpbmcgPSBuZXcgYmluZGluZy5abGliKG1vZGUpO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5faGFkRXJyb3IgPSBmYWxzZTtcbiAgdGhpcy5fYmluZGluZy5vbmVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgZXJybm8pIHtcbiAgICAvLyB0aGVyZSBpcyBubyB3YXkgdG8gY2xlYW5seSByZWNvdmVyLlxuICAgIC8vIGNvbnRpbnVpbmcgb25seSBvYnNjdXJlcyBwcm9ibGVtcy5cbiAgICBzZWxmLl9iaW5kaW5nID0gbnVsbDtcbiAgICBzZWxmLl9oYWRFcnJvciA9IHRydWU7XG5cbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IuZXJybm8gPSBlcnJubztcbiAgICBlcnJvci5jb2RlID0gYmluZGluZy5jb2Rlc1tlcnJub107XG4gICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgfTtcblxuICB2YXIgbGV2ZWwgPSBiaW5kaW5nLlpfREVGQVVMVF9DT01QUkVTU0lPTjtcbiAgaWYgKHR5cGVvZiBvcHRzLmxldmVsID09PSAnbnVtYmVyJykgbGV2ZWwgPSBvcHRzLmxldmVsO1xuXG4gIHZhciBzdHJhdGVneSA9IGJpbmRpbmcuWl9ERUZBVUxUX1NUUkFURUdZO1xuICBpZiAodHlwZW9mIG9wdHMuc3RyYXRlZ3kgPT09ICdudW1iZXInKSBzdHJhdGVneSA9IG9wdHMuc3RyYXRlZ3k7XG5cbiAgdGhpcy5fYmluZGluZy5pbml0KG9wdHMud2luZG93Qml0cyB8fCBiaW5kaW5nLlpfREVGQVVMVF9XSU5ET1dCSVRTLFxuICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICBvcHRzLm1lbUxldmVsIHx8IGJpbmRpbmcuWl9ERUZBVUxUX01FTUxFVkVMLFxuICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgICAgICAgICAgICAgICBvcHRzLmRpY3Rpb25hcnkpO1xuXG4gIHRoaXMuX2J1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5fY2h1bmtTaXplKTtcbiAgdGhpcy5fb2Zmc2V0ID0gMDtcbiAgdGhpcy5fY2xvc2VkID0gZmFsc2U7XG4gIHRoaXMuX2xldmVsID0gbGV2ZWw7XG4gIHRoaXMuX3N0cmF0ZWd5ID0gc3RyYXRlZ3k7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCB0aGlzLmNsb3NlKTtcbn1cblxuaW5oZXJpdHMkMShabGliLCBUcmFuc2Zvcm0pO1xuXG5abGliLnByb3RvdHlwZS5wYXJhbXMgPSBmdW5jdGlvbihsZXZlbCwgc3RyYXRlZ3ksIGNhbGxiYWNrKSB7XG4gIGlmIChsZXZlbCA8IGJpbmRpbmcuWl9NSU5fTEVWRUwgfHxcbiAgICAgIGxldmVsID4gYmluZGluZy5aX01BWF9MRVZFTCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsOiAnICsgbGV2ZWwpO1xuICB9XG4gIGlmIChzdHJhdGVneSAhPSBiaW5kaW5nLlpfRklMVEVSRUQgJiZcbiAgICAgIHN0cmF0ZWd5ICE9IGJpbmRpbmcuWl9IVUZGTUFOX09OTFkgJiZcbiAgICAgIHN0cmF0ZWd5ICE9IGJpbmRpbmcuWl9STEUgJiZcbiAgICAgIHN0cmF0ZWd5ICE9IGJpbmRpbmcuWl9GSVhFRCAmJlxuICAgICAgc3RyYXRlZ3kgIT0gYmluZGluZy5aX0RFRkFVTFRfU1RSQVRFR1kpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHN0cmF0ZWd5OiAnICsgc3RyYXRlZ3kpO1xuICB9XG5cbiAgaWYgKHRoaXMuX2xldmVsICE9PSBsZXZlbCB8fCB0aGlzLl9zdHJhdGVneSAhPT0gc3RyYXRlZ3kpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5mbHVzaChiaW5kaW5nLlpfU1lOQ19GTFVTSCwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLl9iaW5kaW5nLnBhcmFtcyhsZXZlbCwgc3RyYXRlZ3kpO1xuICAgICAgaWYgKCFzZWxmLl9oYWRFcnJvcikge1xuICAgICAgICBzZWxmLl9sZXZlbCA9IGxldmVsO1xuICAgICAgICBzZWxmLl9zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgYnJvd3NlciQxLm5leHRUaWNrKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuWmxpYi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2JpbmRpbmcucmVzZXQoKTtcbn07XG5cbi8vIFRoaXMgaXMgdGhlIF9mbHVzaCBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRyYW5zZm9ybSBjbGFzcyxcbi8vIGludGVybmFsbHksIHdoZW4gdGhlIGxhc3QgY2h1bmsgaGFzIGJlZW4gd3JpdHRlbi5cblpsaWIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHRoaXMuX3RyYW5zZm9ybShuZXcgQnVmZmVyKDApLCAnJywgY2FsbGJhY2spO1xufTtcblxuWmxpYi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbihraW5kLCBjYWxsYmFjaykge1xuICB2YXIgd3MgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2Yga2luZCA9PT0gJ2Z1bmN0aW9uJyB8fCAoa2luZCA9PT0gdm9pZCAwICYmICFjYWxsYmFjaykpIHtcbiAgICBjYWxsYmFjayA9IGtpbmQ7XG4gICAga2luZCA9IGJpbmRpbmcuWl9GVUxMX0ZMVVNIO1xuICB9XG5cbiAgaWYgKHdzLmVuZGVkKSB7XG4gICAgaWYgKGNhbGxiYWNrKVxuICAgICAgYnJvd3NlciQxLm5leHRUaWNrKGNhbGxiYWNrKTtcbiAgfSBlbHNlIGlmICh3cy5lbmRpbmcpIHtcbiAgICBpZiAoY2FsbGJhY2spXG4gICAgICB0aGlzLm9uY2UoJ2VuZCcsIGNhbGxiYWNrKTtcbiAgfSBlbHNlIGlmICh3cy5uZWVkRHJhaW4pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5vbmNlKCdkcmFpbicsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5mbHVzaChjYWxsYmFjayk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fZmx1c2hGbGFnID0ga2luZDtcbiAgICB0aGlzLndyaXRlKG5ldyBCdWZmZXIoMCksICcnLCBjYWxsYmFjayk7XG4gIH1cbn07XG5cblpsaWIucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrKVxuICAgIGJyb3dzZXIkMS5uZXh0VGljayhjYWxsYmFjayk7XG5cbiAgaWYgKHRoaXMuX2Nsb3NlZClcbiAgICByZXR1cm47XG5cbiAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcblxuICB0aGlzLl9iaW5kaW5nLmNsb3NlKCk7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBicm93c2VyJDEubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgc2VsZi5lbWl0KCdjbG9zZScpO1xuICB9KTtcbn07XG5cblpsaWIucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBmbHVzaEZsYWc7XG4gIHZhciB3cyA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBlbmRpbmcgPSB3cy5lbmRpbmcgfHwgd3MuZW5kZWQ7XG4gIHZhciBsYXN0ID0gZW5kaW5nICYmICghY2h1bmsgfHwgd3MubGVuZ3RoID09PSBjaHVuay5sZW5ndGgpO1xuXG4gIGlmICghY2h1bmsgPT09IG51bGwgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpXG4gICAgcmV0dXJuIGNiKG5ldyBFcnJvcignaW52YWxpZCBpbnB1dCcpKTtcblxuICAvLyBJZiBpdCdzIHRoZSBsYXN0IGNodW5rLCBvciBhIGZpbmFsIGZsdXNoLCB3ZSB1c2UgdGhlIFpfRklOSVNIIGZsdXNoIGZsYWcuXG4gIC8vIElmIGl0J3MgZXhwbGljaXRseSBmbHVzaGluZyBhdCBzb21lIG90aGVyIHRpbWUsIHRoZW4gd2UgdXNlXG4gIC8vIFpfRlVMTF9GTFVTSC4gT3RoZXJ3aXNlLCB1c2UgWl9OT19GTFVTSCBmb3IgbWF4aW11bSBjb21wcmVzc2lvblxuICAvLyBnb29kbmVzcy5cbiAgaWYgKGxhc3QpXG4gICAgZmx1c2hGbGFnID0gYmluZGluZy5aX0ZJTklTSDtcbiAgZWxzZSB7XG4gICAgZmx1c2hGbGFnID0gdGhpcy5fZmx1c2hGbGFnO1xuICAgIC8vIG9uY2Ugd2UndmUgZmx1c2hlZCB0aGUgbGFzdCBvZiB0aGUgcXVldWUsIHN0b3AgZmx1c2hpbmcgYW5kXG4gICAgLy8gZ28gYmFjayB0byB0aGUgbm9ybWFsIGJlaGF2aW9yLlxuICAgIGlmIChjaHVuay5sZW5ndGggPj0gd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9mbHVzaEZsYWcgPSB0aGlzLl9vcHRzLmZsdXNoIHx8IGJpbmRpbmcuWl9OT19GTFVTSDtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9wcm9jZXNzQ2h1bmsoY2h1bmssIGZsdXNoRmxhZywgY2IpO1xufTtcblxuWmxpYi5wcm90b3R5cGUuX3Byb2Nlc3NDaHVuayA9IGZ1bmN0aW9uKGNodW5rLCBmbHVzaEZsYWcsIGNiKSB7XG4gIHZhciBhdmFpbEluQmVmb3JlID0gY2h1bmsgJiYgY2h1bmsubGVuZ3RoO1xuICB2YXIgYXZhaWxPdXRCZWZvcmUgPSB0aGlzLl9jaHVua1NpemUgLSB0aGlzLl9vZmZzZXQ7XG4gIHZhciBpbk9mZiA9IDA7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHZhciBhc3luYyA9IHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJztcblxuICBpZiAoIWFzeW5jKSB7XG4gICAgdmFyIGJ1ZmZlcnMgPSBbXTtcbiAgICB2YXIgbnJlYWQgPSAwO1xuXG4gICAgdmFyIGVycm9yO1xuICAgIHRoaXMub24oJ2Vycm9yJywgZnVuY3Rpb24oZXIpIHtcbiAgICAgIGVycm9yID0gZXI7XG4gICAgfSk7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5fYmluZGluZy53cml0ZVN5bmMoZmx1c2hGbGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLCAvLyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2ZmLCAvLyBpbl9vZmZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbEluQmVmb3JlLCAvLyBpbl9sZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9idWZmZXIsIC8vIG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29mZnNldCwgLy9vdXRfb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxPdXRCZWZvcmUpOyAvLyBvdXRfbGVuXG4gICAgfSB3aGlsZSAoIXRoaXMuX2hhZEVycm9yICYmIGNhbGxiYWNrKHJlc1swXSwgcmVzWzFdKSk7XG5cbiAgICBpZiAodGhpcy5faGFkRXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHZhciBidWYgPSBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMsIG5yZWFkKTtcbiAgICB0aGlzLmNsb3NlKCk7XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgdmFyIHJlcSA9IHRoaXMuX2JpbmRpbmcud3JpdGUoZmx1c2hGbGFnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuaywgLy8gaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmYsIC8vIGluX29mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbEluQmVmb3JlLCAvLyBpbl9sZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyLCAvLyBvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb2Zmc2V0LCAvL291dF9vZmZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxPdXRCZWZvcmUpOyAvLyBvdXRfbGVuXG5cbiAgcmVxLmJ1ZmZlciA9IGNodW5rO1xuICByZXEuY2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICBmdW5jdGlvbiBjYWxsYmFjayhhdmFpbEluQWZ0ZXIsIGF2YWlsT3V0QWZ0ZXIpIHtcbiAgICBpZiAoc2VsZi5faGFkRXJyb3IpXG4gICAgICByZXR1cm47XG5cbiAgICB2YXIgaGF2ZSA9IGF2YWlsT3V0QmVmb3JlIC0gYXZhaWxPdXRBZnRlcjtcbiAgICBhc3NlcnQoaGF2ZSA+PSAwLCAnaGF2ZSBzaG91bGQgbm90IGdvIGRvd24nKTtcblxuICAgIGlmIChoYXZlID4gMCkge1xuICAgICAgdmFyIG91dCA9IHNlbGYuX2J1ZmZlci5zbGljZShzZWxmLl9vZmZzZXQsIHNlbGYuX29mZnNldCArIGhhdmUpO1xuICAgICAgc2VsZi5fb2Zmc2V0ICs9IGhhdmU7XG4gICAgICAvLyBzZXJ2ZSBzb21lIG91dHB1dCB0byB0aGUgY29uc3VtZXIuXG4gICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgc2VsZi5wdXNoKG91dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWZmZXJzLnB1c2gob3V0KTtcbiAgICAgICAgbnJlYWQgKz0gb3V0Lmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleGhhdXN0ZWQgdGhlIG91dHB1dCBidWZmZXIsIG9yIHVzZWQgYWxsIHRoZSBpbnB1dCBjcmVhdGUgYSBuZXcgb25lLlxuICAgIGlmIChhdmFpbE91dEFmdGVyID09PSAwIHx8IHNlbGYuX29mZnNldCA+PSBzZWxmLl9jaHVua1NpemUpIHtcbiAgICAgIGF2YWlsT3V0QmVmb3JlID0gc2VsZi5fY2h1bmtTaXplO1xuICAgICAgc2VsZi5fb2Zmc2V0ID0gMDtcbiAgICAgIHNlbGYuX2J1ZmZlciA9IG5ldyBCdWZmZXIoc2VsZi5fY2h1bmtTaXplKTtcbiAgICB9XG5cbiAgICBpZiAoYXZhaWxPdXRBZnRlciA9PT0gMCkge1xuICAgICAgLy8gTm90IGFjdHVhbGx5IGRvbmUuICBOZWVkIHRvIHJlcHJvY2Vzcy5cbiAgICAgIC8vIEFsc28sIHVwZGF0ZSB0aGUgYXZhaWxJbkJlZm9yZSB0byB0aGUgYXZhaWxJbkFmdGVyIHZhbHVlLFxuICAgICAgLy8gc28gdGhhdCBpZiB3ZSBoYXZlIHRvIGhpdCBpdCBhIHRoaXJkIChmb3VydGgsIGV0Yy4pIHRpbWUsXG4gICAgICAvLyBpdCdsbCBoYXZlIHRoZSBjb3JyZWN0IGJ5dGUgY291bnRzLlxuICAgICAgaW5PZmYgKz0gKGF2YWlsSW5CZWZvcmUgLSBhdmFpbEluQWZ0ZXIpO1xuICAgICAgYXZhaWxJbkJlZm9yZSA9IGF2YWlsSW5BZnRlcjtcblxuICAgICAgaWYgKCFhc3luYylcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgIHZhciBuZXdSZXEgPSBzZWxmLl9iaW5kaW5nLndyaXRlKGZsdXNoRmxhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbEluQmVmb3JlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2h1bmtTaXplKTtcbiAgICAgIG5ld1JlcS5jYWxsYmFjayA9IGNhbGxiYWNrOyAvLyB0aGlzIHNhbWUgZnVuY3Rpb25cbiAgICAgIG5ld1JlcS5idWZmZXIgPSBjaHVuaztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWFzeW5jKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gZmluaXNoZWQgd2l0aCB0aGUgY2h1bmsuXG4gICAgY2IoKTtcbiAgfVxufTtcblxuaW5oZXJpdHMkMShEZWZsYXRlLCBabGliKTtcbmluaGVyaXRzJDEoSW5mbGF0ZSwgWmxpYik7XG5pbmhlcml0cyQxKEd6aXAsIFpsaWIpO1xuaW5oZXJpdHMkMShHdW56aXAsIFpsaWIpO1xuaW5oZXJpdHMkMShEZWZsYXRlUmF3LCBabGliKTtcbmluaGVyaXRzJDEoSW5mbGF0ZVJhdywgWmxpYik7XG5pbmhlcml0cyQxKFVuemlwLCBabGliKTtcbnZhciBfcG9seWZpbGxOb2RlX3psaWIgPSB7XG4gIGNvZGVzOiBjb2RlcyxcbiAgY3JlYXRlRGVmbGF0ZTogY3JlYXRlRGVmbGF0ZSxcbiAgY3JlYXRlSW5mbGF0ZTogY3JlYXRlSW5mbGF0ZSxcbiAgY3JlYXRlRGVmbGF0ZVJhdzogY3JlYXRlRGVmbGF0ZVJhdyxcbiAgY3JlYXRlSW5mbGF0ZVJhdzogY3JlYXRlSW5mbGF0ZVJhdyxcbiAgY3JlYXRlR3ppcDogY3JlYXRlR3ppcCxcbiAgY3JlYXRlR3VuemlwOiBjcmVhdGVHdW56aXAsXG4gIGNyZWF0ZVVuemlwOiBjcmVhdGVVbnppcCxcbiAgZGVmbGF0ZTogZGVmbGF0ZSxcbiAgZGVmbGF0ZVN5bmM6IGRlZmxhdGVTeW5jLFxuICBnemlwOiBnemlwLFxuICBnemlwU3luYzogZ3ppcFN5bmMsXG4gIGRlZmxhdGVSYXc6IGRlZmxhdGVSYXcsXG4gIGRlZmxhdGVSYXdTeW5jOiBkZWZsYXRlUmF3U3luYyxcbiAgdW56aXA6IHVuemlwLFxuICB1bnppcFN5bmM6IHVuemlwU3luYyxcbiAgaW5mbGF0ZTogaW5mbGF0ZSxcbiAgaW5mbGF0ZVN5bmM6IGluZmxhdGVTeW5jLFxuICBndW56aXA6IGd1bnppcCxcbiAgZ3VuemlwU3luYzogZ3VuemlwU3luYyxcbiAgaW5mbGF0ZVJhdzogaW5mbGF0ZVJhdyxcbiAgaW5mbGF0ZVJhd1N5bmM6IGluZmxhdGVSYXdTeW5jLFxuICBEZWZsYXRlOiBEZWZsYXRlLFxuICBJbmZsYXRlOiBJbmZsYXRlLFxuICBHemlwOiBHemlwLFxuICBHdW56aXA6IEd1bnppcCxcbiAgRGVmbGF0ZVJhdzogRGVmbGF0ZVJhdyxcbiAgSW5mbGF0ZVJhdzogSW5mbGF0ZVJhdyxcbiAgVW56aXA6IFVuemlwLFxuICBabGliOiBabGliXG59O1xuXG52YXIgX3BvbHlmaWxsTm9kZV96bGliJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0RGVmbGF0ZTogRGVmbGF0ZSxcblx0RGVmbGF0ZVJhdzogRGVmbGF0ZVJhdyxcblx0R3VuemlwOiBHdW56aXAsXG5cdEd6aXA6IEd6aXAsXG5cdEluZmxhdGU6IEluZmxhdGUsXG5cdEluZmxhdGVSYXc6IEluZmxhdGVSYXcsXG5cdFVuemlwOiBVbnppcCxcblx0WmxpYjogWmxpYixcblx0Y29kZXM6IGNvZGVzLFxuXHRjcmVhdGVEZWZsYXRlOiBjcmVhdGVEZWZsYXRlLFxuXHRjcmVhdGVEZWZsYXRlUmF3OiBjcmVhdGVEZWZsYXRlUmF3LFxuXHRjcmVhdGVHdW56aXA6IGNyZWF0ZUd1bnppcCxcblx0Y3JlYXRlR3ppcDogY3JlYXRlR3ppcCxcblx0Y3JlYXRlSW5mbGF0ZTogY3JlYXRlSW5mbGF0ZSxcblx0Y3JlYXRlSW5mbGF0ZVJhdzogY3JlYXRlSW5mbGF0ZVJhdyxcblx0Y3JlYXRlVW56aXA6IGNyZWF0ZVVuemlwLFxuXHRkZWZhdWx0OiBfcG9seWZpbGxOb2RlX3psaWIsXG5cdGRlZmxhdGU6IGRlZmxhdGUsXG5cdGRlZmxhdGVSYXc6IGRlZmxhdGVSYXcsXG5cdGRlZmxhdGVSYXdTeW5jOiBkZWZsYXRlUmF3U3luYyxcblx0ZGVmbGF0ZVN5bmM6IGRlZmxhdGVTeW5jLFxuXHRndW56aXA6IGd1bnppcCxcblx0Z3VuemlwU3luYzogZ3VuemlwU3luYyxcblx0Z3ppcDogZ3ppcCxcblx0Z3ppcFN5bmM6IGd6aXBTeW5jLFxuXHRpbmZsYXRlOiBpbmZsYXRlLFxuXHRpbmZsYXRlUmF3OiBpbmZsYXRlUmF3LFxuXHRpbmZsYXRlUmF3U3luYzogaW5mbGF0ZVJhd1N5bmMsXG5cdGluZmxhdGVTeW5jOiBpbmZsYXRlU3luYyxcblx0dW56aXA6IHVuemlwLFxuXHR1bnppcFN5bmM6IHVuemlwU3luY1xufSk7XG5cbnZhciByZXF1aXJlJCQ1ID0gLypAX19QVVJFX18qL2dldEF1Z21lbnRlZE5hbWVzcGFjZShfcG9seWZpbGxOb2RlX3psaWIkMSk7XG5cbihmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cdChmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdH0pKGdsb2JhbFRoaXMsICgpID0+IHtcblx0cmV0dXJuIC8qKioqKiovICgoKSA9PiB7IC8vIHdlYnBhY2tCb290c3RyYXBcblx0LyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9IChbXG5cdC8qIDAgKi8sXG5cdC8qIDEgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLlZlcmJvc2l0eUxldmVsID0gZXhwb3J0cy5VdGlsID0gZXhwb3J0cy5Vbmtub3duRXJyb3JFeGNlcHRpb24gPSBleHBvcnRzLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IGV4cG9ydHMuVGV4dFJlbmRlcmluZ01vZGUgPSBleHBvcnRzLlJlbmRlcmluZ0ludGVudEZsYWcgPSBleHBvcnRzLlByb21pc2VDYXBhYmlsaXR5ID0gZXhwb3J0cy5QZXJtaXNzaW9uRmxhZyA9IGV4cG9ydHMuUGFzc3dvcmRSZXNwb25zZXMgPSBleHBvcnRzLlBhc3N3b3JkRXhjZXB0aW9uID0gZXhwb3J0cy5QYWdlQWN0aW9uRXZlbnRUeXBlID0gZXhwb3J0cy5PUFMgPSBleHBvcnRzLk1pc3NpbmdQREZFeGNlcHRpb24gPSBleHBvcnRzLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFID0gZXhwb3J0cy5MSU5FX0ZBQ1RPUiA9IGV4cG9ydHMuTElORV9ERVNDRU5UX0ZBQ1RPUiA9IGV4cG9ydHMuSW52YWxpZFBERkV4Y2VwdGlvbiA9IGV4cG9ydHMuSW1hZ2VLaW5kID0gZXhwb3J0cy5JREVOVElUWV9NQVRSSVggPSBleHBvcnRzLkZvcm1hdEVycm9yID0gZXhwb3J0cy5GZWF0dXJlVGVzdCA9IGV4cG9ydHMuRk9OVF9JREVOVElUWV9NQVRSSVggPSBleHBvcnRzLkRvY3VtZW50QWN0aW9uRXZlbnRUeXBlID0gZXhwb3J0cy5DTWFwQ29tcHJlc3Npb25UeXBlID0gZXhwb3J0cy5CYXNlRXhjZXB0aW9uID0gZXhwb3J0cy5CQVNFTElORV9GQUNUT1IgPSBleHBvcnRzLkFubm90YXRpb25UeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uU3RhdGVNb2RlbFR5cGUgPSBleHBvcnRzLkFubm90YXRpb25SZXZpZXdTdGF0ZSA9IGV4cG9ydHMuQW5ub3RhdGlvblJlcGx5VHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvbk1vZGUgPSBleHBvcnRzLkFubm90YXRpb25NYXJrZWRTdGF0ZSA9IGV4cG9ydHMuQW5ub3RhdGlvbkZsYWcgPSBleHBvcnRzLkFubm90YXRpb25GaWVsZEZsYWcgPSBleHBvcnRzLkFubm90YXRpb25FZGl0b3JUeXBlID0gZXhwb3J0cy5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4ID0gZXhwb3J0cy5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IGV4cG9ydHMuQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZSA9IGV4cG9ydHMuQWJvcnRFeGNlcHRpb24gPSB2b2lkIDA7XG5cdGV4cG9ydHMuYXNzZXJ0ID0gYXNzZXJ0O1xuXHRleHBvcnRzLmJ5dGVzVG9TdHJpbmcgPSBieXRlc1RvU3RyaW5nO1xuXHRleHBvcnRzLmNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwgPSBjcmVhdGVWYWxpZEFic29sdXRlVXJsO1xuXHRleHBvcnRzLmdldE1vZGlmaWNhdGlvbkRhdGUgPSBnZXRNb2RpZmljYXRpb25EYXRlO1xuXHRleHBvcnRzLmdldFZlcmJvc2l0eUxldmVsID0gZ2V0VmVyYm9zaXR5TGV2ZWw7XG5cdGV4cG9ydHMuaW5mbyA9IGluZm87XG5cdGV4cG9ydHMuaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG5cdGV4cG9ydHMuaXNBcnJheUVxdWFsID0gaXNBcnJheUVxdWFsO1xuXHRleHBvcnRzLm5vcm1hbGl6ZVVuaWNvZGUgPSBub3JtYWxpemVVbmljb2RlO1xuXHRleHBvcnRzLm9iamVjdEZyb21NYXAgPSBvYmplY3RGcm9tTWFwO1xuXHRleHBvcnRzLm9iamVjdFNpemUgPSBvYmplY3RTaXplO1xuXHRleHBvcnRzLnNldFZlcmJvc2l0eUxldmVsID0gc2V0VmVyYm9zaXR5TGV2ZWw7XG5cdGV4cG9ydHMuc2hhZG93ID0gc2hhZG93O1xuXHRleHBvcnRzLnN0cmluZzMyID0gc3RyaW5nMzI7XG5cdGV4cG9ydHMuc3RyaW5nVG9CeXRlcyA9IHN0cmluZ1RvQnl0ZXM7XG5cdGV4cG9ydHMuc3RyaW5nVG9QREZTdHJpbmcgPSBzdHJpbmdUb1BERlN0cmluZztcblx0ZXhwb3J0cy5zdHJpbmdUb1VURjhTdHJpbmcgPSBzdHJpbmdUb1VURjhTdHJpbmc7XG5cdGV4cG9ydHMudW5yZWFjaGFibGUgPSB1bnJlYWNoYWJsZTtcblx0ZXhwb3J0cy51dGY4U3RyaW5nVG9TdHJpbmcgPSB1dGY4U3RyaW5nVG9TdHJpbmc7XG5cdGV4cG9ydHMud2FybiA9IHdhcm47XG5cdGNvbnN0IElERU5USVRZX01BVFJJWCA9IFsxLCAwLCAwLCAxLCAwLCAwXTtcblx0ZXhwb3J0cy5JREVOVElUWV9NQVRSSVggPSBJREVOVElUWV9NQVRSSVg7XG5cdGNvbnN0IEZPTlRfSURFTlRJVFlfTUFUUklYID0gWzAuMDAxLCAwLCAwLCAwLjAwMSwgMCwgMF07XG5cdGV4cG9ydHMuRk9OVF9JREVOVElUWV9NQVRSSVggPSBGT05UX0lERU5USVRZX01BVFJJWDtcblx0Y29uc3QgTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEUgPSAxMGU2O1xuXHRleHBvcnRzLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFID0gTUFYX0lNQUdFX1NJWkVfVE9fQ0FDSEU7XG5cdGNvbnN0IExJTkVfRkFDVE9SID0gMS4zNTtcblx0ZXhwb3J0cy5MSU5FX0ZBQ1RPUiA9IExJTkVfRkFDVE9SO1xuXHRjb25zdCBMSU5FX0RFU0NFTlRfRkFDVE9SID0gMC4zNTtcblx0ZXhwb3J0cy5MSU5FX0RFU0NFTlRfRkFDVE9SID0gTElORV9ERVNDRU5UX0ZBQ1RPUjtcblx0Y29uc3QgQkFTRUxJTkVfRkFDVE9SID0gTElORV9ERVNDRU5UX0ZBQ1RPUiAvIExJTkVfRkFDVE9SO1xuXHRleHBvcnRzLkJBU0VMSU5FX0ZBQ1RPUiA9IEJBU0VMSU5FX0ZBQ1RPUjtcblx0Y29uc3QgUmVuZGVyaW5nSW50ZW50RmxhZyA9IHtcblx0ICBBTlk6IDB4MDEsXG5cdCAgRElTUExBWTogMHgwMixcblx0ICBQUklOVDogMHgwNCxcblx0ICBTQVZFOiAweDA4LFxuXHQgIEFOTk9UQVRJT05TX0ZPUk1TOiAweDEwLFxuXHQgIEFOTk9UQVRJT05TX1NUT1JBR0U6IDB4MjAsXG5cdCAgQU5OT1RBVElPTlNfRElTQUJMRTogMHg0MCxcblx0ICBPUExJU1Q6IDB4MTAwXG5cdH07XG5cdGV4cG9ydHMuUmVuZGVyaW5nSW50ZW50RmxhZyA9IFJlbmRlcmluZ0ludGVudEZsYWc7XG5cdGNvbnN0IEFubm90YXRpb25Nb2RlID0ge1xuXHQgIERJU0FCTEU6IDAsXG5cdCAgRU5BQkxFOiAxLFxuXHQgIEVOQUJMRV9GT1JNUzogMixcblx0ICBFTkFCTEVfU1RPUkFHRTogM1xuXHR9O1xuXHRleHBvcnRzLkFubm90YXRpb25Nb2RlID0gQW5ub3RhdGlvbk1vZGU7XG5cdGNvbnN0IEFubm90YXRpb25FZGl0b3JQcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2VkaXRvcl9cIjtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4ID0gQW5ub3RhdGlvbkVkaXRvclByZWZpeDtcblx0Y29uc3QgQW5ub3RhdGlvbkVkaXRvclR5cGUgPSB7XG5cdCAgRElTQUJMRTogLTEsXG5cdCAgTk9ORTogMCxcblx0ICBGUkVFVEVYVDogMyxcblx0ICBJTks6IDE1XG5cdH07XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvclR5cGUgPSBBbm5vdGF0aW9uRWRpdG9yVHlwZTtcblx0Y29uc3QgQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSB7XG5cdCAgRlJFRVRFWFRfU0laRTogMSxcblx0ICBGUkVFVEVYVF9DT0xPUjogMixcblx0ICBGUkVFVEVYVF9PUEFDSVRZOiAzLFxuXHQgIElOS19DT0xPUjogMTEsXG5cdCAgSU5LX1RISUNLTkVTUzogMTIsXG5cdCAgSU5LX09QQUNJVFk6IDEzXG5cdH07XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUgPSBBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZTtcblx0Y29uc3QgUGVybWlzc2lvbkZsYWcgPSB7XG5cdCAgUFJJTlQ6IDB4MDQsXG5cdCAgTU9ESUZZX0NPTlRFTlRTOiAweDA4LFxuXHQgIENPUFk6IDB4MTAsXG5cdCAgTU9ESUZZX0FOTk9UQVRJT05TOiAweDIwLFxuXHQgIEZJTExfSU5URVJBQ1RJVkVfRk9STVM6IDB4MTAwLFxuXHQgIENPUFlfRk9SX0FDQ0VTU0lCSUxJVFk6IDB4MjAwLFxuXHQgIEFTU0VNQkxFOiAweDQwMCxcblx0ICBQUklOVF9ISUdIX1FVQUxJVFk6IDB4ODAwXG5cdH07XG5cdGV4cG9ydHMuUGVybWlzc2lvbkZsYWcgPSBQZXJtaXNzaW9uRmxhZztcblx0Y29uc3QgVGV4dFJlbmRlcmluZ01vZGUgPSB7XG5cdCAgRklMTDogMCxcblx0ICBTVFJPS0U6IDEsXG5cdCAgRklMTF9TVFJPS0U6IDIsXG5cdCAgSU5WSVNJQkxFOiAzLFxuXHQgIEZJTExfQUREX1RPX1BBVEg6IDQsXG5cdCAgU1RST0tFX0FERF9UT19QQVRIOiA1LFxuXHQgIEZJTExfU1RST0tFX0FERF9UT19QQVRIOiA2LFxuXHQgIEFERF9UT19QQVRIOiA3LFxuXHQgIEZJTExfU1RST0tFX01BU0s6IDMsXG5cdCAgQUREX1RPX1BBVEhfRkxBRzogNFxuXHR9O1xuXHRleHBvcnRzLlRleHRSZW5kZXJpbmdNb2RlID0gVGV4dFJlbmRlcmluZ01vZGU7XG5cdGNvbnN0IEltYWdlS2luZCA9IHtcblx0ICBHUkFZU0NBTEVfMUJQUDogMSxcblx0ICBSR0JfMjRCUFA6IDIsXG5cdCAgUkdCQV8zMkJQUDogM1xuXHR9O1xuXHRleHBvcnRzLkltYWdlS2luZCA9IEltYWdlS2luZDtcblx0Y29uc3QgQW5ub3RhdGlvblR5cGUgPSB7XG5cdCAgVEVYVDogMSxcblx0ICBMSU5LOiAyLFxuXHQgIEZSRUVURVhUOiAzLFxuXHQgIExJTkU6IDQsXG5cdCAgU1FVQVJFOiA1LFxuXHQgIENJUkNMRTogNixcblx0ICBQT0xZR09OOiA3LFxuXHQgIFBPTFlMSU5FOiA4LFxuXHQgIEhJR0hMSUdIVDogOSxcblx0ICBVTkRFUkxJTkU6IDEwLFxuXHQgIFNRVUlHR0xZOiAxMSxcblx0ICBTVFJJS0VPVVQ6IDEyLFxuXHQgIFNUQU1QOiAxMyxcblx0ICBDQVJFVDogMTQsXG5cdCAgSU5LOiAxNSxcblx0ICBQT1BVUDogMTYsXG5cdCAgRklMRUFUVEFDSE1FTlQ6IDE3LFxuXHQgIFNPVU5EOiAxOCxcblx0ICBNT1ZJRTogMTksXG5cdCAgV0lER0VUOiAyMCxcblx0ICBTQ1JFRU46IDIxLFxuXHQgIFBSSU5URVJNQVJLOiAyMixcblx0ICBUUkFQTkVUOiAyMyxcblx0ICBXQVRFUk1BUks6IDI0LFxuXHQgIFRIUkVFRDogMjUsXG5cdCAgUkVEQUNUOiAyNlxuXHR9O1xuXHRleHBvcnRzLkFubm90YXRpb25UeXBlID0gQW5ub3RhdGlvblR5cGU7XG5cdGNvbnN0IEFubm90YXRpb25TdGF0ZU1vZGVsVHlwZSA9IHtcblx0ICBNQVJLRUQ6IFwiTWFya2VkXCIsXG5cdCAgUkVWSUVXOiBcIlJldmlld1wiXG5cdH07XG5cdGV4cG9ydHMuQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlID0gQW5ub3RhdGlvblN0YXRlTW9kZWxUeXBlO1xuXHRjb25zdCBBbm5vdGF0aW9uTWFya2VkU3RhdGUgPSB7XG5cdCAgTUFSS0VEOiBcIk1hcmtlZFwiLFxuXHQgIFVOTUFSS0VEOiBcIlVubWFya2VkXCJcblx0fTtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uTWFya2VkU3RhdGUgPSBBbm5vdGF0aW9uTWFya2VkU3RhdGU7XG5cdGNvbnN0IEFubm90YXRpb25SZXZpZXdTdGF0ZSA9IHtcblx0ICBBQ0NFUFRFRDogXCJBY2NlcHRlZFwiLFxuXHQgIFJFSkVDVEVEOiBcIlJlamVjdGVkXCIsXG5cdCAgQ0FOQ0VMTEVEOiBcIkNhbmNlbGxlZFwiLFxuXHQgIENPTVBMRVRFRDogXCJDb21wbGV0ZWRcIixcblx0ICBOT05FOiBcIk5vbmVcIlxuXHR9O1xuXHRleHBvcnRzLkFubm90YXRpb25SZXZpZXdTdGF0ZSA9IEFubm90YXRpb25SZXZpZXdTdGF0ZTtcblx0Y29uc3QgQW5ub3RhdGlvblJlcGx5VHlwZSA9IHtcblx0ICBHUk9VUDogXCJHcm91cFwiLFxuXHQgIFJFUExZOiBcIlJcIlxuXHR9O1xuXHRleHBvcnRzLkFubm90YXRpb25SZXBseVR5cGUgPSBBbm5vdGF0aW9uUmVwbHlUeXBlO1xuXHRjb25zdCBBbm5vdGF0aW9uRmxhZyA9IHtcblx0ICBJTlZJU0lCTEU6IDB4MDEsXG5cdCAgSElEREVOOiAweDAyLFxuXHQgIFBSSU5UOiAweDA0LFxuXHQgIE5PWk9PTTogMHgwOCxcblx0ICBOT1JPVEFURTogMHgxMCxcblx0ICBOT1ZJRVc6IDB4MjAsXG5cdCAgUkVBRE9OTFk6IDB4NDAsXG5cdCAgTE9DS0VEOiAweDgwLFxuXHQgIFRPR0dMRU5PVklFVzogMHgxMDAsXG5cdCAgTE9DS0VEQ09OVEVOVFM6IDB4MjAwXG5cdH07XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkZsYWcgPSBBbm5vdGF0aW9uRmxhZztcblx0Y29uc3QgQW5ub3RhdGlvbkZpZWxkRmxhZyA9IHtcblx0ICBSRUFET05MWTogMHgwMDAwMDAxLFxuXHQgIFJFUVVJUkVEOiAweDAwMDAwMDIsXG5cdCAgTk9FWFBPUlQ6IDB4MDAwMDAwNCxcblx0ICBNVUxUSUxJTkU6IDB4MDAwMTAwMCxcblx0ICBQQVNTV09SRDogMHgwMDAyMDAwLFxuXHQgIE5PVE9HR0xFVE9PRkY6IDB4MDAwNDAwMCxcblx0ICBSQURJTzogMHgwMDA4MDAwLFxuXHQgIFBVU0hCVVRUT046IDB4MDAxMDAwMCxcblx0ICBDT01CTzogMHgwMDIwMDAwLFxuXHQgIEVESVQ6IDB4MDA0MDAwMCxcblx0ICBTT1JUOiAweDAwODAwMDAsXG5cdCAgRklMRVNFTEVDVDogMHgwMTAwMDAwLFxuXHQgIE1VTFRJU0VMRUNUOiAweDAyMDAwMDAsXG5cdCAgRE9OT1RTUEVMTENIRUNLOiAweDA0MDAwMDAsXG5cdCAgRE9OT1RTQ1JPTEw6IDB4MDgwMDAwMCxcblx0ICBDT01COiAweDEwMDAwMDAsXG5cdCAgUklDSFRFWFQ6IDB4MjAwMDAwMCxcblx0ICBSQURJT1NJTlVOSVNPTjogMHgyMDAwMDAwLFxuXHQgIENPTU1JVE9OU0VMQ0hBTkdFOiAweDQwMDAwMDBcblx0fTtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uRmllbGRGbGFnID0gQW5ub3RhdGlvbkZpZWxkRmxhZztcblx0Y29uc3QgQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZSA9IHtcblx0ICBTT0xJRDogMSxcblx0ICBEQVNIRUQ6IDIsXG5cdCAgQkVWRUxFRDogMyxcblx0ICBJTlNFVDogNCxcblx0ICBVTkRFUkxJTkU6IDVcblx0fTtcblx0ZXhwb3J0cy5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlID0gQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZTtcblx0Y29uc3QgQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZSA9IHtcblx0ICBFOiBcIk1vdXNlIEVudGVyXCIsXG5cdCAgWDogXCJNb3VzZSBFeGl0XCIsXG5cdCAgRDogXCJNb3VzZSBEb3duXCIsXG5cdCAgVTogXCJNb3VzZSBVcFwiLFxuXHQgIEZvOiBcIkZvY3VzXCIsXG5cdCAgQmw6IFwiQmx1clwiLFxuXHQgIFBPOiBcIlBhZ2VPcGVuXCIsXG5cdCAgUEM6IFwiUGFnZUNsb3NlXCIsXG5cdCAgUFY6IFwiUGFnZVZpc2libGVcIixcblx0ICBQSTogXCJQYWdlSW52aXNpYmxlXCIsXG5cdCAgSzogXCJLZXlzdHJva2VcIixcblx0ICBGOiBcIkZvcm1hdFwiLFxuXHQgIFY6IFwiVmFsaWRhdGVcIixcblx0ICBDOiBcIkNhbGN1bGF0ZVwiXG5cdH07XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkFjdGlvbkV2ZW50VHlwZSA9IEFubm90YXRpb25BY3Rpb25FdmVudFR5cGU7XG5cdGNvbnN0IERvY3VtZW50QWN0aW9uRXZlbnRUeXBlID0ge1xuXHQgIFdDOiBcIldpbGxDbG9zZVwiLFxuXHQgIFdTOiBcIldpbGxTYXZlXCIsXG5cdCAgRFM6IFwiRGlkU2F2ZVwiLFxuXHQgIFdQOiBcIldpbGxQcmludFwiLFxuXHQgIERQOiBcIkRpZFByaW50XCJcblx0fTtcblx0ZXhwb3J0cy5Eb2N1bWVudEFjdGlvbkV2ZW50VHlwZSA9IERvY3VtZW50QWN0aW9uRXZlbnRUeXBlO1xuXHRjb25zdCBQYWdlQWN0aW9uRXZlbnRUeXBlID0ge1xuXHQgIE86IFwiUGFnZU9wZW5cIixcblx0ICBDOiBcIlBhZ2VDbG9zZVwiXG5cdH07XG5cdGV4cG9ydHMuUGFnZUFjdGlvbkV2ZW50VHlwZSA9IFBhZ2VBY3Rpb25FdmVudFR5cGU7XG5cdGNvbnN0IFZlcmJvc2l0eUxldmVsID0ge1xuXHQgIEVSUk9SUzogMCxcblx0ICBXQVJOSU5HUzogMSxcblx0ICBJTkZPUzogNVxuXHR9O1xuXHRleHBvcnRzLlZlcmJvc2l0eUxldmVsID0gVmVyYm9zaXR5TGV2ZWw7XG5cdGNvbnN0IENNYXBDb21wcmVzc2lvblR5cGUgPSB7XG5cdCAgTk9ORTogMCxcblx0ICBCSU5BUlk6IDFcblx0fTtcblx0ZXhwb3J0cy5DTWFwQ29tcHJlc3Npb25UeXBlID0gQ01hcENvbXByZXNzaW9uVHlwZTtcblx0Y29uc3QgT1BTID0ge1xuXHQgIGRlcGVuZGVuY3k6IDEsXG5cdCAgc2V0TGluZVdpZHRoOiAyLFxuXHQgIHNldExpbmVDYXA6IDMsXG5cdCAgc2V0TGluZUpvaW46IDQsXG5cdCAgc2V0TWl0ZXJMaW1pdDogNSxcblx0ICBzZXREYXNoOiA2LFxuXHQgIHNldFJlbmRlcmluZ0ludGVudDogNyxcblx0ICBzZXRGbGF0bmVzczogOCxcblx0ICBzZXRHU3RhdGU6IDksXG5cdCAgc2F2ZTogMTAsXG5cdCAgcmVzdG9yZTogMTEsXG5cdCAgdHJhbnNmb3JtOiAxMixcblx0ICBtb3ZlVG86IDEzLFxuXHQgIGxpbmVUbzogMTQsXG5cdCAgY3VydmVUbzogMTUsXG5cdCAgY3VydmVUbzI6IDE2LFxuXHQgIGN1cnZlVG8zOiAxNyxcblx0ICBjbG9zZVBhdGg6IDE4LFxuXHQgIHJlY3RhbmdsZTogMTksXG5cdCAgc3Ryb2tlOiAyMCxcblx0ICBjbG9zZVN0cm9rZTogMjEsXG5cdCAgZmlsbDogMjIsXG5cdCAgZW9GaWxsOiAyMyxcblx0ICBmaWxsU3Ryb2tlOiAyNCxcblx0ICBlb0ZpbGxTdHJva2U6IDI1LFxuXHQgIGNsb3NlRmlsbFN0cm9rZTogMjYsXG5cdCAgY2xvc2VFT0ZpbGxTdHJva2U6IDI3LFxuXHQgIGVuZFBhdGg6IDI4LFxuXHQgIGNsaXA6IDI5LFxuXHQgIGVvQ2xpcDogMzAsXG5cdCAgYmVnaW5UZXh0OiAzMSxcblx0ICBlbmRUZXh0OiAzMixcblx0ICBzZXRDaGFyU3BhY2luZzogMzMsXG5cdCAgc2V0V29yZFNwYWNpbmc6IDM0LFxuXHQgIHNldEhTY2FsZTogMzUsXG5cdCAgc2V0TGVhZGluZzogMzYsXG5cdCAgc2V0Rm9udDogMzcsXG5cdCAgc2V0VGV4dFJlbmRlcmluZ01vZGU6IDM4LFxuXHQgIHNldFRleHRSaXNlOiAzOSxcblx0ICBtb3ZlVGV4dDogNDAsXG5cdCAgc2V0TGVhZGluZ01vdmVUZXh0OiA0MSxcblx0ICBzZXRUZXh0TWF0cml4OiA0Mixcblx0ICBuZXh0TGluZTogNDMsXG5cdCAgc2hvd1RleHQ6IDQ0LFxuXHQgIHNob3dTcGFjZWRUZXh0OiA0NSxcblx0ICBuZXh0TGluZVNob3dUZXh0OiA0Nixcblx0ICBuZXh0TGluZVNldFNwYWNpbmdTaG93VGV4dDogNDcsXG5cdCAgc2V0Q2hhcldpZHRoOiA0OCxcblx0ICBzZXRDaGFyV2lkdGhBbmRCb3VuZHM6IDQ5LFxuXHQgIHNldFN0cm9rZUNvbG9yU3BhY2U6IDUwLFxuXHQgIHNldEZpbGxDb2xvclNwYWNlOiA1MSxcblx0ICBzZXRTdHJva2VDb2xvcjogNTIsXG5cdCAgc2V0U3Ryb2tlQ29sb3JOOiA1Myxcblx0ICBzZXRGaWxsQ29sb3I6IDU0LFxuXHQgIHNldEZpbGxDb2xvck46IDU1LFxuXHQgIHNldFN0cm9rZUdyYXk6IDU2LFxuXHQgIHNldEZpbGxHcmF5OiA1Nyxcblx0ICBzZXRTdHJva2VSR0JDb2xvcjogNTgsXG5cdCAgc2V0RmlsbFJHQkNvbG9yOiA1OSxcblx0ICBzZXRTdHJva2VDTVlLQ29sb3I6IDYwLFxuXHQgIHNldEZpbGxDTVlLQ29sb3I6IDYxLFxuXHQgIHNoYWRpbmdGaWxsOiA2Mixcblx0ICBiZWdpbklubGluZUltYWdlOiA2Myxcblx0ICBiZWdpbkltYWdlRGF0YTogNjQsXG5cdCAgZW5kSW5saW5lSW1hZ2U6IDY1LFxuXHQgIHBhaW50WE9iamVjdDogNjYsXG5cdCAgbWFya1BvaW50OiA2Nyxcblx0ICBtYXJrUG9pbnRQcm9wczogNjgsXG5cdCAgYmVnaW5NYXJrZWRDb250ZW50OiA2OSxcblx0ICBiZWdpbk1hcmtlZENvbnRlbnRQcm9wczogNzAsXG5cdCAgZW5kTWFya2VkQ29udGVudDogNzEsXG5cdCAgYmVnaW5Db21wYXQ6IDcyLFxuXHQgIGVuZENvbXBhdDogNzMsXG5cdCAgcGFpbnRGb3JtWE9iamVjdEJlZ2luOiA3NCxcblx0ICBwYWludEZvcm1YT2JqZWN0RW5kOiA3NSxcblx0ICBiZWdpbkdyb3VwOiA3Nixcblx0ICBlbmRHcm91cDogNzcsXG5cdCAgYmVnaW5Bbm5vdGF0aW9uOiA4MCxcblx0ICBlbmRBbm5vdGF0aW9uOiA4MSxcblx0ICBwYWludEltYWdlTWFza1hPYmplY3Q6IDgzLFxuXHQgIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwOiA4NCxcblx0ICBwYWludEltYWdlWE9iamVjdDogODUsXG5cdCAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3Q6IDg2LFxuXHQgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXA6IDg3LFxuXHQgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0OiA4OCxcblx0ICBwYWludEltYWdlTWFza1hPYmplY3RSZXBlYXQ6IDg5LFxuXHQgIHBhaW50U29saWRDb2xvckltYWdlTWFzazogOTAsXG5cdCAgY29uc3RydWN0UGF0aDogOTFcblx0fTtcblx0ZXhwb3J0cy5PUFMgPSBPUFM7XG5cdGNvbnN0IFBhc3N3b3JkUmVzcG9uc2VzID0ge1xuXHQgIE5FRURfUEFTU1dPUkQ6IDEsXG5cdCAgSU5DT1JSRUNUX1BBU1NXT1JEOiAyXG5cdH07XG5cdGV4cG9ydHMuUGFzc3dvcmRSZXNwb25zZXMgPSBQYXNzd29yZFJlc3BvbnNlcztcblx0bGV0IHZlcmJvc2l0eSA9IFZlcmJvc2l0eUxldmVsLldBUk5JTkdTO1xuXHRmdW5jdGlvbiBzZXRWZXJib3NpdHlMZXZlbChsZXZlbCkge1xuXHQgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGxldmVsKSkge1xuXHQgICAgdmVyYm9zaXR5ID0gbGV2ZWw7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGdldFZlcmJvc2l0eUxldmVsKCkge1xuXHQgIHJldHVybiB2ZXJib3NpdHk7XG5cdH1cblx0ZnVuY3Rpb24gaW5mbyhtc2cpIHtcblx0ICBpZiAodmVyYm9zaXR5ID49IFZlcmJvc2l0eUxldmVsLklORk9TKSB7XG5cdCAgICBjb25zb2xlLmxvZyhgSW5mbzogJHttc2d9YCk7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIHdhcm4obXNnKSB7XG5cdCAgaWYgKHZlcmJvc2l0eSA+PSBWZXJib3NpdHlMZXZlbC5XQVJOSU5HUykge1xuXHQgICAgY29uc29sZS5sb2coYFdhcm5pbmc6ICR7bXNnfWApO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiB1bnJlYWNoYWJsZShtc2cpIHtcblx0ICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblx0fVxuXHRmdW5jdGlvbiBhc3NlcnQoY29uZCwgbXNnKSB7XG5cdCAgaWYgKCFjb25kKSB7XG5cdCAgICB1bnJlYWNoYWJsZShtc2cpO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBfaXNWYWxpZFByb3RvY29sKHVybCkge1xuXHQgIHN3aXRjaCAodXJsPy5wcm90b2NvbCkge1xuXHQgICAgY2FzZSBcImh0dHA6XCI6XG5cdCAgICBjYXNlIFwiaHR0cHM6XCI6XG5cdCAgICBjYXNlIFwiZnRwOlwiOlxuXHQgICAgY2FzZSBcIm1haWx0bzpcIjpcblx0ICAgIGNhc2UgXCJ0ZWw6XCI6XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgZGVmYXVsdDpcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBjcmVhdGVWYWxpZEFic29sdXRlVXJsKHVybCwgYmFzZVVybCA9IG51bGwsIG9wdGlvbnMgPSBudWxsKSB7XG5cdCAgaWYgKCF1cmwpIHtcblx0ICAgIHJldHVybiBudWxsO1xuXHQgIH1cblx0ICB0cnkge1xuXHQgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIHVybCA9PT0gXCJzdHJpbmdcIikge1xuXHQgICAgICBpZiAob3B0aW9ucy5hZGREZWZhdWx0UHJvdG9jb2wgJiYgdXJsLnN0YXJ0c1dpdGgoXCJ3d3cuXCIpKSB7XG5cdCAgICAgICAgY29uc3QgZG90cyA9IHVybC5tYXRjaCgvXFwuL2cpO1xuXHQgICAgICAgIGlmIChkb3RzPy5sZW5ndGggPj0gMikge1xuXHQgICAgICAgICAgdXJsID0gYGh0dHA6Ly8ke3VybH1gO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBpZiAob3B0aW9ucy50cnlDb252ZXJ0RW5jb2RpbmcpIHtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgdXJsID0gc3RyaW5nVG9VVEY4U3RyaW5nKHVybCk7XG5cdCAgICAgICAgfSBjYXRjaCAoZXgpIHt9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGNvbnN0IGFic29sdXRlVXJsID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcblx0ICAgIGlmIChfaXNWYWxpZFByb3RvY29sKGFic29sdXRlVXJsKSkge1xuXHQgICAgICByZXR1cm4gYWJzb2x1dGVVcmw7XG5cdCAgICB9XG5cdCAgfSBjYXRjaCAoZXgpIHt9XG5cdCAgcmV0dXJuIG51bGw7XG5cdH1cblx0ZnVuY3Rpb24gc2hhZG93KG9iaiwgcHJvcCwgdmFsdWUsIG5vblNlcmlhbGl6YWJsZSA9IGZhbHNlKSB7XG5cdCAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwge1xuXHQgICAgdmFsdWUsXG5cdCAgICBlbnVtZXJhYmxlOiAhbm9uU2VyaWFsaXphYmxlLFxuXHQgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuXHQgICAgd3JpdGFibGU6IGZhbHNlXG5cdCAgfSk7XG5cdCAgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdGNvbnN0IEJhc2VFeGNlcHRpb24gPSBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uQ2xvc3VyZSgpIHtcblx0ICBmdW5jdGlvbiBCYXNlRXhjZXB0aW9uKG1lc3NhZ2UsIG5hbWUpIHtcblx0ICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRXhjZXB0aW9uKSB7XG5cdCAgICAgIHVucmVhY2hhYmxlKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZUV4Y2VwdGlvbi5cIik7XG5cdCAgICB9XG5cdCAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXHQgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICB9XG5cdCAgQmFzZUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcblx0ICBCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yID0gQmFzZUV4Y2VwdGlvbjtcblx0ICByZXR1cm4gQmFzZUV4Y2VwdGlvbjtcblx0fSgpO1xuXHRleHBvcnRzLkJhc2VFeGNlcHRpb24gPSBCYXNlRXhjZXB0aW9uO1xuXHRjbGFzcyBQYXNzd29yZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuXHQgIGNvbnN0cnVjdG9yKG1zZywgY29kZSkge1xuXHQgICAgc3VwZXIobXNnLCBcIlBhc3N3b3JkRXhjZXB0aW9uXCIpO1xuXHQgICAgdGhpcy5jb2RlID0gY29kZTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5QYXNzd29yZEV4Y2VwdGlvbiA9IFBhc3N3b3JkRXhjZXB0aW9uO1xuXHRjbGFzcyBVbmtub3duRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcblx0ICBjb25zdHJ1Y3Rvcihtc2csIGRldGFpbHMpIHtcblx0ICAgIHN1cGVyKG1zZywgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIik7XG5cdCAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlVua25vd25FcnJvckV4Y2VwdGlvbiA9IFVua25vd25FcnJvckV4Y2VwdGlvbjtcblx0Y2xhc3MgSW52YWxpZFBERkV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuXHQgIGNvbnN0cnVjdG9yKG1zZykge1xuXHQgICAgc3VwZXIobXNnLCBcIkludmFsaWRQREZFeGNlcHRpb25cIik7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuSW52YWxpZFBERkV4Y2VwdGlvbiA9IEludmFsaWRQREZFeGNlcHRpb247XG5cdGNsYXNzIE1pc3NpbmdQREZFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcblx0ICBjb25zdHJ1Y3Rvcihtc2cpIHtcblx0ICAgIHN1cGVyKG1zZywgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCIpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLk1pc3NpbmdQREZFeGNlcHRpb24gPSBNaXNzaW5nUERGRXhjZXB0aW9uO1xuXHRjbGFzcyBVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcblx0ICBjb25zdHJ1Y3Rvcihtc2csIHN0YXR1cykge1xuXHQgICAgc3VwZXIobXNnLCBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiKTtcblx0ICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbiA9IFVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbjtcblx0Y2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcblx0ICBjb25zdHJ1Y3Rvcihtc2cpIHtcblx0ICAgIHN1cGVyKG1zZywgXCJGb3JtYXRFcnJvclwiKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5Gb3JtYXRFcnJvciA9IEZvcm1hdEVycm9yO1xuXHRjbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuXHQgIGNvbnN0cnVjdG9yKG1zZykge1xuXHQgICAgc3VwZXIobXNnLCBcIkFib3J0RXhjZXB0aW9uXCIpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkFib3J0RXhjZXB0aW9uID0gQWJvcnRFeGNlcHRpb247XG5cdGZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoYnl0ZXMpIHtcblx0ICBpZiAodHlwZW9mIGJ5dGVzICE9PSBcIm9iamVjdFwiIHx8IGJ5dGVzPy5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xuXHQgICAgdW5yZWFjaGFibGUoXCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nXCIpO1xuXHQgIH1cblx0ICBjb25zdCBsZW5ndGggPSBieXRlcy5sZW5ndGg7XG5cdCAgY29uc3QgTUFYX0FSR1VNRU5UX0NPVU5UID0gODE5Mjtcblx0ICBpZiAobGVuZ3RoIDwgTUFYX0FSR1VNRU5UX0NPVU5UKSB7XG5cdCAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7XG5cdCAgfVxuXHQgIGNvbnN0IHN0ckJ1ZiA9IFtdO1xuXHQgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IE1BWF9BUkdVTUVOVF9DT1VOVCkge1xuXHQgICAgY29uc3QgY2h1bmtFbmQgPSBNYXRoLm1pbihpICsgTUFYX0FSR1VNRU5UX0NPVU5ULCBsZW5ndGgpO1xuXHQgICAgY29uc3QgY2h1bmsgPSBieXRlcy5zdWJhcnJheShpLCBjaHVua0VuZCk7XG5cdCAgICBzdHJCdWYucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7XG5cdCAgfVxuXHQgIHJldHVybiBzdHJCdWYuam9pbihcIlwiKTtcblx0fVxuXHRmdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuXHQgIGlmICh0eXBlb2Ygc3RyICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgICB1bnJlYWNoYWJsZShcIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZ1RvQnl0ZXNcIik7XG5cdCAgfVxuXHQgIGNvbnN0IGxlbmd0aCA9IHN0ci5sZW5ndGg7XG5cdCAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuXHQgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0ICAgIGJ5dGVzW2ldID0gc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuXHQgIH1cblx0ICByZXR1cm4gYnl0ZXM7XG5cdH1cblx0ZnVuY3Rpb24gc3RyaW5nMzIodmFsdWUpIHtcblx0ICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZSA+PiAyNCAmIDB4ZmYsIHZhbHVlID4+IDE2ICYgMHhmZiwgdmFsdWUgPj4gOCAmIDB4ZmYsIHZhbHVlICYgMHhmZik7XG5cdH1cblx0ZnVuY3Rpb24gb2JqZWN0U2l6ZShvYmopIHtcblx0ICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGg7XG5cdH1cblx0ZnVuY3Rpb24gb2JqZWN0RnJvbU1hcChtYXApIHtcblx0ICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG1hcCkge1xuXHQgICAgb2JqW2tleV0gPSB2YWx1ZTtcblx0ICB9XG5cdCAgcmV0dXJuIG9iajtcblx0fVxuXHRmdW5jdGlvbiBpc0xpdHRsZUVuZGlhbigpIHtcblx0ICBjb25zdCBidWZmZXI4ID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG5cdCAgYnVmZmVyOFswXSA9IDE7XG5cdCAgY29uc3QgdmlldzMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcjguYnVmZmVyLCAwLCAxKTtcblx0ICByZXR1cm4gdmlldzMyWzBdID09PSAxO1xuXHR9XG5cdGZ1bmN0aW9uIGlzRXZhbFN1cHBvcnRlZCgpIHtcblx0ICB0cnkge1xuXHQgICAgbmV3IEZ1bmN0aW9uKFwiXCIpO1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfSBjYXRjaCAoZSkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBGZWF0dXJlVGVzdCB7XG5cdCAgc3RhdGljIGdldCBpc0xpdHRsZUVuZGlhbigpIHtcblx0ICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc0xpdHRsZUVuZGlhblwiLCBpc0xpdHRsZUVuZGlhbigpKTtcblx0ICB9XG5cdCAgc3RhdGljIGdldCBpc0V2YWxTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gc2hhZG93KHRoaXMsIFwiaXNFdmFsU3VwcG9ydGVkXCIsIGlzRXZhbFN1cHBvcnRlZCgpKTtcblx0ICB9XG5cdCAgc3RhdGljIGdldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpIHtcblx0ICAgIHJldHVybiBzaGFkb3codGhpcywgXCJpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZFwiLCB0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSBcInVuZGVmaW5lZFwiKTtcblx0ICB9XG5cdCAgc3RhdGljIGdldCBwbGF0Zm9ybSgpIHtcblx0ICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdCAgICAgIHJldHVybiBzaGFkb3codGhpcywgXCJwbGF0Zm9ybVwiLCB7XG5cdCAgICAgICAgaXNXaW46IGZhbHNlLFxuXHQgICAgICAgIGlzTWFjOiBmYWxzZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBzaGFkb3codGhpcywgXCJwbGF0Zm9ybVwiLCB7XG5cdCAgICAgIGlzV2luOiBuYXZpZ2F0b3IucGxhdGZvcm0uaW5jbHVkZXMoXCJXaW5cIiksXG5cdCAgICAgIGlzTWFjOiBuYXZpZ2F0b3IucGxhdGZvcm0uaW5jbHVkZXMoXCJNYWNcIilcblx0ICAgIH0pO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkZlYXR1cmVUZXN0ID0gRmVhdHVyZVRlc3Q7XG5cdGNvbnN0IGhleE51bWJlcnMgPSBbLi4uQXJyYXkoMjU2KS5rZXlzKCldLm1hcChuID0+IG4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSk7XG5cdGNsYXNzIFV0aWwge1xuXHQgIHN0YXRpYyBtYWtlSGV4Q29sb3IociwgZywgYikge1xuXHQgICAgcmV0dXJuIGAjJHtoZXhOdW1iZXJzW3JdfSR7aGV4TnVtYmVyc1tnXX0ke2hleE51bWJlcnNbYl19YDtcblx0ICB9XG5cdCAgc3RhdGljIHNjYWxlTWluTWF4KHRyYW5zZm9ybSwgbWluTWF4KSB7XG5cdCAgICBsZXQgdGVtcDtcblx0ICAgIGlmICh0cmFuc2Zvcm1bMF0pIHtcblx0ICAgICAgaWYgKHRyYW5zZm9ybVswXSA8IDApIHtcblx0ICAgICAgICB0ZW1wID0gbWluTWF4WzBdO1xuXHQgICAgICAgIG1pbk1heFswXSA9IG1pbk1heFsxXTtcblx0ICAgICAgICBtaW5NYXhbMV0gPSB0ZW1wO1xuXHQgICAgICB9XG5cdCAgICAgIG1pbk1heFswXSAqPSB0cmFuc2Zvcm1bMF07XG5cdCAgICAgIG1pbk1heFsxXSAqPSB0cmFuc2Zvcm1bMF07XG5cdCAgICAgIGlmICh0cmFuc2Zvcm1bM10gPCAwKSB7XG5cdCAgICAgICAgdGVtcCA9IG1pbk1heFsyXTtcblx0ICAgICAgICBtaW5NYXhbMl0gPSBtaW5NYXhbM107XG5cdCAgICAgICAgbWluTWF4WzNdID0gdGVtcDtcblx0ICAgICAgfVxuXHQgICAgICBtaW5NYXhbMl0gKj0gdHJhbnNmb3JtWzNdO1xuXHQgICAgICBtaW5NYXhbM10gKj0gdHJhbnNmb3JtWzNdO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGVtcCA9IG1pbk1heFswXTtcblx0ICAgICAgbWluTWF4WzBdID0gbWluTWF4WzJdO1xuXHQgICAgICBtaW5NYXhbMl0gPSB0ZW1wO1xuXHQgICAgICB0ZW1wID0gbWluTWF4WzFdO1xuXHQgICAgICBtaW5NYXhbMV0gPSBtaW5NYXhbM107XG5cdCAgICAgIG1pbk1heFszXSA9IHRlbXA7XG5cdCAgICAgIGlmICh0cmFuc2Zvcm1bMV0gPCAwKSB7XG5cdCAgICAgICAgdGVtcCA9IG1pbk1heFsyXTtcblx0ICAgICAgICBtaW5NYXhbMl0gPSBtaW5NYXhbM107XG5cdCAgICAgICAgbWluTWF4WzNdID0gdGVtcDtcblx0ICAgICAgfVxuXHQgICAgICBtaW5NYXhbMl0gKj0gdHJhbnNmb3JtWzFdO1xuXHQgICAgICBtaW5NYXhbM10gKj0gdHJhbnNmb3JtWzFdO1xuXHQgICAgICBpZiAodHJhbnNmb3JtWzJdIDwgMCkge1xuXHQgICAgICAgIHRlbXAgPSBtaW5NYXhbMF07XG5cdCAgICAgICAgbWluTWF4WzBdID0gbWluTWF4WzFdO1xuXHQgICAgICAgIG1pbk1heFsxXSA9IHRlbXA7XG5cdCAgICAgIH1cblx0ICAgICAgbWluTWF4WzBdICo9IHRyYW5zZm9ybVsyXTtcblx0ICAgICAgbWluTWF4WzFdICo9IHRyYW5zZm9ybVsyXTtcblx0ICAgIH1cblx0ICAgIG1pbk1heFswXSArPSB0cmFuc2Zvcm1bNF07XG5cdCAgICBtaW5NYXhbMV0gKz0gdHJhbnNmb3JtWzRdO1xuXHQgICAgbWluTWF4WzJdICs9IHRyYW5zZm9ybVs1XTtcblx0ICAgIG1pbk1heFszXSArPSB0cmFuc2Zvcm1bNV07XG5cdCAgfVxuXHQgIHN0YXRpYyB0cmFuc2Zvcm0obTEsIG0yKSB7XG5cdCAgICByZXR1cm4gW20xWzBdICogbTJbMF0gKyBtMVsyXSAqIG0yWzFdLCBtMVsxXSAqIG0yWzBdICsgbTFbM10gKiBtMlsxXSwgbTFbMF0gKiBtMlsyXSArIG0xWzJdICogbTJbM10sIG0xWzFdICogbTJbMl0gKyBtMVszXSAqIG0yWzNdLCBtMVswXSAqIG0yWzRdICsgbTFbMl0gKiBtMls1XSArIG0xWzRdLCBtMVsxXSAqIG0yWzRdICsgbTFbM10gKiBtMls1XSArIG0xWzVdXTtcblx0ICB9XG5cdCAgc3RhdGljIGFwcGx5VHJhbnNmb3JtKHAsIG0pIHtcblx0ICAgIGNvbnN0IHh0ID0gcFswXSAqIG1bMF0gKyBwWzFdICogbVsyXSArIG1bNF07XG5cdCAgICBjb25zdCB5dCA9IHBbMF0gKiBtWzFdICsgcFsxXSAqIG1bM10gKyBtWzVdO1xuXHQgICAgcmV0dXJuIFt4dCwgeXRdO1xuXHQgIH1cblx0ICBzdGF0aWMgYXBwbHlJbnZlcnNlVHJhbnNmb3JtKHAsIG0pIHtcblx0ICAgIGNvbnN0IGQgPSBtWzBdICogbVszXSAtIG1bMV0gKiBtWzJdO1xuXHQgICAgY29uc3QgeHQgPSAocFswXSAqIG1bM10gLSBwWzFdICogbVsyXSArIG1bMl0gKiBtWzVdIC0gbVs0XSAqIG1bM10pIC8gZDtcblx0ICAgIGNvbnN0IHl0ID0gKC1wWzBdICogbVsxXSArIHBbMV0gKiBtWzBdICsgbVs0XSAqIG1bMV0gLSBtWzVdICogbVswXSkgLyBkO1xuXHQgICAgcmV0dXJuIFt4dCwgeXRdO1xuXHQgIH1cblx0ICBzdGF0aWMgZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3gociwgbSkge1xuXHQgICAgY29uc3QgcDEgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHIsIG0pO1xuXHQgICAgY29uc3QgcDIgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKHIuc2xpY2UoMiwgNCksIG0pO1xuXHQgICAgY29uc3QgcDMgPSBVdGlsLmFwcGx5VHJhbnNmb3JtKFtyWzBdLCByWzNdXSwgbSk7XG5cdCAgICBjb25zdCBwNCA9IFV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JbMl0sIHJbMV1dLCBtKTtcblx0ICAgIHJldHVybiBbTWF0aC5taW4ocDFbMF0sIHAyWzBdLCBwM1swXSwgcDRbMF0pLCBNYXRoLm1pbihwMVsxXSwgcDJbMV0sIHAzWzFdLCBwNFsxXSksIE1hdGgubWF4KHAxWzBdLCBwMlswXSwgcDNbMF0sIHA0WzBdKSwgTWF0aC5tYXgocDFbMV0sIHAyWzFdLCBwM1sxXSwgcDRbMV0pXTtcblx0ICB9XG5cdCAgc3RhdGljIGludmVyc2VUcmFuc2Zvcm0obSkge1xuXHQgICAgY29uc3QgZCA9IG1bMF0gKiBtWzNdIC0gbVsxXSAqIG1bMl07XG5cdCAgICByZXR1cm4gW21bM10gLyBkLCAtbVsxXSAvIGQsIC1tWzJdIC8gZCwgbVswXSAvIGQsIChtWzJdICogbVs1XSAtIG1bNF0gKiBtWzNdKSAvIGQsIChtWzRdICogbVsxXSAtIG1bNV0gKiBtWzBdKSAvIGRdO1xuXHQgIH1cblx0ICBzdGF0aWMgc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobSkge1xuXHQgICAgY29uc3QgdHJhbnNwb3NlID0gW21bMF0sIG1bMl0sIG1bMV0sIG1bM11dO1xuXHQgICAgY29uc3QgYSA9IG1bMF0gKiB0cmFuc3Bvc2VbMF0gKyBtWzFdICogdHJhbnNwb3NlWzJdO1xuXHQgICAgY29uc3QgYiA9IG1bMF0gKiB0cmFuc3Bvc2VbMV0gKyBtWzFdICogdHJhbnNwb3NlWzNdO1xuXHQgICAgY29uc3QgYyA9IG1bMl0gKiB0cmFuc3Bvc2VbMF0gKyBtWzNdICogdHJhbnNwb3NlWzJdO1xuXHQgICAgY29uc3QgZCA9IG1bMl0gKiB0cmFuc3Bvc2VbMV0gKyBtWzNdICogdHJhbnNwb3NlWzNdO1xuXHQgICAgY29uc3QgZmlyc3QgPSAoYSArIGQpIC8gMjtcblx0ICAgIGNvbnN0IHNlY29uZCA9IE1hdGguc3FydCgoYSArIGQpICoqIDIgLSA0ICogKGEgKiBkIC0gYyAqIGIpKSAvIDI7XG5cdCAgICBjb25zdCBzeCA9IGZpcnN0ICsgc2Vjb25kIHx8IDE7XG5cdCAgICBjb25zdCBzeSA9IGZpcnN0IC0gc2Vjb25kIHx8IDE7XG5cdCAgICByZXR1cm4gW01hdGguc3FydChzeCksIE1hdGguc3FydChzeSldO1xuXHQgIH1cblx0ICBzdGF0aWMgbm9ybWFsaXplUmVjdChyZWN0KSB7XG5cdCAgICBjb25zdCByID0gcmVjdC5zbGljZSgwKTtcblx0ICAgIGlmIChyZWN0WzBdID4gcmVjdFsyXSkge1xuXHQgICAgICByWzBdID0gcmVjdFsyXTtcblx0ICAgICAgclsyXSA9IHJlY3RbMF07XG5cdCAgICB9XG5cdCAgICBpZiAocmVjdFsxXSA+IHJlY3RbM10pIHtcblx0ICAgICAgclsxXSA9IHJlY3RbM107XG5cdCAgICAgIHJbM10gPSByZWN0WzFdO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHI7XG5cdCAgfVxuXHQgIHN0YXRpYyBpbnRlcnNlY3QocmVjdDEsIHJlY3QyKSB7XG5cdCAgICBjb25zdCB4TG93ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVjdDFbMF0sIHJlY3QxWzJdKSwgTWF0aC5taW4ocmVjdDJbMF0sIHJlY3QyWzJdKSk7XG5cdCAgICBjb25zdCB4SGlnaCA9IE1hdGgubWluKE1hdGgubWF4KHJlY3QxWzBdLCByZWN0MVsyXSksIE1hdGgubWF4KHJlY3QyWzBdLCByZWN0MlsyXSkpO1xuXHQgICAgaWYgKHhMb3cgPiB4SGlnaCkge1xuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHlMb3cgPSBNYXRoLm1heChNYXRoLm1pbihyZWN0MVsxXSwgcmVjdDFbM10pLCBNYXRoLm1pbihyZWN0MlsxXSwgcmVjdDJbM10pKTtcblx0ICAgIGNvbnN0IHlIaWdoID0gTWF0aC5taW4oTWF0aC5tYXgocmVjdDFbMV0sIHJlY3QxWzNdKSwgTWF0aC5tYXgocmVjdDJbMV0sIHJlY3QyWzNdKSk7XG5cdCAgICBpZiAoeUxvdyA+IHlIaWdoKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFt4TG93LCB5TG93LCB4SGlnaCwgeUhpZ2hdO1xuXHQgIH1cblx0ICBzdGF0aWMgYmV6aWVyQm91bmRpbmdCb3goeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7XG5cdCAgICBjb25zdCB0dmFsdWVzID0gW10sXG5cdCAgICAgIGJvdW5kcyA9IFtbXSwgW11dO1xuXHQgICAgbGV0IGEsIGIsIGMsIHQsIHQxLCB0MiwgYjJhYywgc3FydGIyYWM7XG5cdCAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuXHQgICAgICBpZiAoaSA9PT0gMCkge1xuXHQgICAgICAgIGIgPSA2ICogeDAgLSAxMiAqIHgxICsgNiAqIHgyO1xuXHQgICAgICAgIGEgPSAtMyAqIHgwICsgOSAqIHgxIC0gOSAqIHgyICsgMyAqIHgzO1xuXHQgICAgICAgIGMgPSAzICogeDEgLSAzICogeDA7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgYiA9IDYgKiB5MCAtIDEyICogeTEgKyA2ICogeTI7XG5cdCAgICAgICAgYSA9IC0zICogeTAgKyA5ICogeTEgLSA5ICogeTIgKyAzICogeTM7XG5cdCAgICAgICAgYyA9IDMgKiB5MSAtIDMgKiB5MDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoTWF0aC5hYnMoYSkgPCAxZS0xMikge1xuXHQgICAgICAgIGlmIChNYXRoLmFicyhiKSA8IDFlLTEyKSB7XG5cdCAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdCA9IC1jIC8gYjtcblx0ICAgICAgICBpZiAoMCA8IHQgJiYgdCA8IDEpIHtcblx0ICAgICAgICAgIHR2YWx1ZXMucHVzaCh0KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgYjJhYyA9IGIgKiBiIC0gNCAqIGMgKiBhO1xuXHQgICAgICBzcXJ0YjJhYyA9IE1hdGguc3FydChiMmFjKTtcblx0ICAgICAgaWYgKGIyYWMgPCAwKSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgdDEgPSAoLWIgKyBzcXJ0YjJhYykgLyAoMiAqIGEpO1xuXHQgICAgICBpZiAoMCA8IHQxICYmIHQxIDwgMSkge1xuXHQgICAgICAgIHR2YWx1ZXMucHVzaCh0MSk7XG5cdCAgICAgIH1cblx0ICAgICAgdDIgPSAoLWIgLSBzcXJ0YjJhYykgLyAoMiAqIGEpO1xuXHQgICAgICBpZiAoMCA8IHQyICYmIHQyIDwgMSkge1xuXHQgICAgICAgIHR2YWx1ZXMucHVzaCh0Mik7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGxldCBqID0gdHZhbHVlcy5sZW5ndGgsXG5cdCAgICAgIG10O1xuXHQgICAgY29uc3QgamxlbiA9IGo7XG5cdCAgICB3aGlsZSAoai0tKSB7XG5cdCAgICAgIHQgPSB0dmFsdWVzW2pdO1xuXHQgICAgICBtdCA9IDEgLSB0O1xuXHQgICAgICBib3VuZHNbMF1bal0gPSBtdCAqIG10ICogbXQgKiB4MCArIDMgKiBtdCAqIG10ICogdCAqIHgxICsgMyAqIG10ICogdCAqIHQgKiB4MiArIHQgKiB0ICogdCAqIHgzO1xuXHQgICAgICBib3VuZHNbMV1bal0gPSBtdCAqIG10ICogbXQgKiB5MCArIDMgKiBtdCAqIG10ICogdCAqIHkxICsgMyAqIG10ICogdCAqIHQgKiB5MiArIHQgKiB0ICogdCAqIHkzO1xuXHQgICAgfVxuXHQgICAgYm91bmRzWzBdW2psZW5dID0geDA7XG5cdCAgICBib3VuZHNbMV1bamxlbl0gPSB5MDtcblx0ICAgIGJvdW5kc1swXVtqbGVuICsgMV0gPSB4Mztcblx0ICAgIGJvdW5kc1sxXVtqbGVuICsgMV0gPSB5Mztcblx0ICAgIGJvdW5kc1swXS5sZW5ndGggPSBib3VuZHNbMV0ubGVuZ3RoID0gamxlbiArIDI7XG5cdCAgICByZXR1cm4gW01hdGgubWluKC4uLmJvdW5kc1swXSksIE1hdGgubWluKC4uLmJvdW5kc1sxXSksIE1hdGgubWF4KC4uLmJvdW5kc1swXSksIE1hdGgubWF4KC4uLmJvdW5kc1sxXSldO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlV0aWwgPSBVdGlsO1xuXHRjb25zdCBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZSA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDJkOCwgMHgyYzcsIDB4MmM2LCAweDJkOSwgMHgyZGQsIDB4MmRiLCAweDJkYSwgMHgyZGMsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MTkyLCAweDIwNDQsIDB4MjAzOSwgMHgyMDNhLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFlLCAweDIwMWMsIDB4MjAxZCwgMHgyMDE4LCAweDIwMTksIDB4MjAxYSwgMHgyMTIyLCAweGZiMDEsIDB4ZmIwMiwgMHgxNDEsIDB4MTUyLCAweDE2MCwgMHgxNzgsIDB4MTdkLCAweDEzMSwgMHgxNDIsIDB4MTUzLCAweDE2MSwgMHgxN2UsIDAsIDB4MjBhY107XG5cdGZ1bmN0aW9uIHN0cmluZ1RvUERGU3RyaW5nKHN0cikge1xuXHQgIGlmIChzdHJbMF0gPj0gXCJcXHhFRlwiKSB7XG5cdCAgICBsZXQgZW5jb2Rpbmc7XG5cdCAgICBpZiAoc3RyWzBdID09PSBcIlxceEZFXCIgJiYgc3RyWzFdID09PSBcIlxceEZGXCIpIHtcblx0ICAgICAgZW5jb2RpbmcgPSBcInV0Zi0xNmJlXCI7XG5cdCAgICB9IGVsc2UgaWYgKHN0clswXSA9PT0gXCJcXHhGRlwiICYmIHN0clsxXSA9PT0gXCJcXHhGRVwiKSB7XG5cdCAgICAgIGVuY29kaW5nID0gXCJ1dGYtMTZsZVwiO1xuXHQgICAgfSBlbHNlIGlmIChzdHJbMF0gPT09IFwiXFx4RUZcIiAmJiBzdHJbMV0gPT09IFwiXFx4QkJcIiAmJiBzdHJbMl0gPT09IFwiXFx4QkZcIikge1xuXHQgICAgICBlbmNvZGluZyA9IFwidXRmLThcIjtcblx0ICAgIH1cblx0ICAgIGlmIChlbmNvZGluZykge1xuXHQgICAgICB0cnkge1xuXHQgICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcsIHtcblx0ICAgICAgICAgIGZhdGFsOiB0cnVlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyaW5nVG9CeXRlcyhzdHIpO1xuXHQgICAgICAgIHJldHVybiBkZWNvZGVyLmRlY29kZShidWZmZXIpO1xuXHQgICAgICB9IGNhdGNoIChleCkge1xuXHQgICAgICAgIHdhcm4oYHN0cmluZ1RvUERGU3RyaW5nOiBcIiR7ZXh9XCIuYCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgY29uc3Qgc3RyQnVmID0gW107XG5cdCAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3RyLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0ICAgIGNvbnN0IGNvZGUgPSBQREZTdHJpbmdUcmFuc2xhdGVUYWJsZVtzdHIuY2hhckNvZGVBdChpKV07XG5cdCAgICBzdHJCdWYucHVzaChjb2RlID8gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSA6IHN0ci5jaGFyQXQoaSkpO1xuXHQgIH1cblx0ICByZXR1cm4gc3RyQnVmLmpvaW4oXCJcIik7XG5cdH1cblx0ZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKHN0cikge1xuXHQgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHN0cikpO1xuXHR9XG5cdGZ1bmN0aW9uIHV0ZjhTdHJpbmdUb1N0cmluZyhzdHIpIHtcblx0ICByZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpO1xuXHR9XG5cdGZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodikge1xuXHQgIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2Py5ieXRlTGVuZ3RoICE9PSB1bmRlZmluZWQ7XG5cdH1cblx0ZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycjEsIGFycjIpIHtcblx0ICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXHQgIGZvciAobGV0IGkgPSAwLCBpaSA9IGFycjEubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuXHQgICAgaWYgKGFycjFbaV0gIT09IGFycjJbaV0pIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gdHJ1ZTtcblx0fVxuXHRmdW5jdGlvbiBnZXRNb2RpZmljYXRpb25EYXRlKGRhdGUgPSBuZXcgRGF0ZSgpKSB7XG5cdCAgY29uc3QgYnVmZmVyID0gW2RhdGUuZ2V0VVRDRnVsbFllYXIoKS50b1N0cmluZygpLCAoZGF0ZS5nZXRVVENNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksIGRhdGUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIiksIGRhdGUuZ2V0VVRDTWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpLCBkYXRlLmdldFVUQ1NlY29uZHMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKV07XG5cdCAgcmV0dXJuIGJ1ZmZlci5qb2luKFwiXCIpO1xuXHR9XG5cdGNsYXNzIFByb21pc2VDYXBhYmlsaXR5IHtcblx0ICAjc2V0dGxlZCA9IGZhbHNlO1xuXHQgIGNvbnN0cnVjdG9yKCkge1xuXHQgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHQgICAgICB0aGlzLnJlc29sdmUgPSBkYXRhID0+IHtcblx0ICAgICAgICB0aGlzLiNzZXR0bGVkID0gdHJ1ZTtcblx0ICAgICAgICByZXNvbHZlKGRhdGEpO1xuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLnJlamVjdCA9IHJlYXNvbiA9PiB7XG5cdCAgICAgICAgdGhpcy4jc2V0dGxlZCA9IHRydWU7XG5cdCAgICAgICAgcmVqZWN0KHJlYXNvbik7XG5cdCAgICAgIH07XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0IHNldHRsZWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jc2V0dGxlZDtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5Qcm9taXNlQ2FwYWJpbGl0eSA9IFByb21pc2VDYXBhYmlsaXR5O1xuXHRsZXQgTm9ybWFsaXplUmVnZXggPSBudWxsO1xuXHRsZXQgTm9ybWFsaXphdGlvbk1hcCA9IG51bGw7XG5cdGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaWNvZGUoc3RyKSB7XG5cdCAgaWYgKCFOb3JtYWxpemVSZWdleCkge1xuXHQgICAgTm9ybWFsaXplUmVnZXggPSAvKFtcXHUwMGEwXFx1MDBiNVxcdTAzN2VcXHUwZWIzXFx1MjAwMC1cXHUyMDBhXFx1MjAyZlxcdTIxMjZcXHVmYjAwLVxcdWZiMDRcXHVmYjA2XFx1ZmIyMC1cXHVmYjM2XFx1ZmIzOC1cXHVmYjNjXFx1ZmIzZVxcdWZiNDAtXFx1ZmI0MVxcdWZiNDMtXFx1ZmI0NFxcdWZiNDYtXFx1ZmJhMVxcdWZiYTQtXFx1ZmJhOVxcdWZiYWUtXFx1ZmJiMVxcdWZiZDMtXFx1ZmJkY1xcdWZiZGUtXFx1ZmJlN1xcdWZiZWEtXFx1ZmJmOFxcdWZiZmMtXFx1ZmJmZFxcdWZjMDAtXFx1ZmM1ZFxcdWZjNjQtXFx1ZmNmMVxcdWZjZjUtXFx1ZmQzZFxcdWZkODhcXHVmZGY0XFx1ZmRmYS1cXHVmZGZiXFx1ZmU3MVxcdWZlNzdcXHVmZTc5XFx1ZmU3YlxcdWZlN2RdKyl8KFxcdWZiMDUrKS9ndTtcblx0ICAgIE5vcm1hbGl6YXRpb25NYXAgPSBuZXcgTWFwKFtbXCJcdUZCMDVcIiwgXCJcdTAxN0Z0XCJdXSk7XG5cdCAgfVxuXHQgIHJldHVybiBzdHIucmVwbGFjZUFsbChOb3JtYWxpemVSZWdleCwgKF8sIHAxLCBwMikgPT4ge1xuXHQgICAgcmV0dXJuIHAxID8gcDEubm9ybWFsaXplKFwiTkZLQ1wiKSA6IE5vcm1hbGl6YXRpb25NYXAuZ2V0KHAyKTtcblx0ICB9KTtcblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiAyICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5idWlsZCA9IGV4cG9ydHMuUmVuZGVyVGFzayA9IGV4cG9ydHMuUERGV29ya2VyVXRpbCA9IGV4cG9ydHMuUERGV29ya2VyID0gZXhwb3J0cy5QREZQYWdlUHJveHkgPSBleHBvcnRzLlBERkRvY3VtZW50UHJveHkgPSBleHBvcnRzLlBERkRvY3VtZW50TG9hZGluZ1Rhc2sgPSBleHBvcnRzLlBERkRhdGFSYW5nZVRyYW5zcG9ydCA9IGV4cG9ydHMuTG9vcGJhY2tQb3J0ID0gZXhwb3J0cy5EZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBleHBvcnRzLkRlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gZXhwb3J0cy5EZWZhdWx0Q2FudmFzRmFjdG9yeSA9IGV4cG9ydHMuRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gdm9pZCAwO1xuXHRleHBvcnRzLmdldERvY3VtZW50ID0gZ2V0RG9jdW1lbnQ7XG5cdGV4cG9ydHMudmVyc2lvbiA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9hbm5vdGF0aW9uX3N0b3JhZ2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHR2YXIgX2ZvbnRfbG9hZGVyID0gX193X3BkZmpzX3JlcXVpcmVfXyg5KTtcblx0dmFyIF9jYW52YXMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDExKTtcblx0dmFyIF93b3JrZXJfb3B0aW9ucyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTQpO1xuXHR2YXIgX2lzX25vZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTtcblx0dmFyIF9tZXNzYWdlX2hhbmRsZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE1KTtcblx0dmFyIF9tZXRhZGF0YSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpO1xuXHR2YXIgX29wdGlvbmFsX2NvbnRlbnRfY29uZmlnID0gX193X3BkZmpzX3JlcXVpcmVfXygxNyk7XG5cdHZhciBfdHJhbnNwb3J0X3N0cmVhbSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTgpO1xuXHR2YXIgX3hmYV90ZXh0ID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7XG5cdGNvbnN0IERFRkFVTFRfUkFOR0VfQ0hVTktfU0laRSA9IDY1NTM2O1xuXHRjb25zdCBSRU5ERVJJTkdfQ0FOQ0VMTEVEX1RJTUVPVVQgPSAxMDA7XG5cdGNvbnN0IERFTEFZRURfQ0xFQU5VUF9USU1FT1VUID0gNTAwMDtcblx0bGV0IERlZmF1bHRDYW52YXNGYWN0b3J5ID0gX2Rpc3BsYXlfdXRpbHMuRE9NQ2FudmFzRmFjdG9yeTtcblx0ZXhwb3J0cy5EZWZhdWx0Q2FudmFzRmFjdG9yeSA9IERlZmF1bHRDYW52YXNGYWN0b3J5O1xuXHRsZXQgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gX2Rpc3BsYXlfdXRpbHMuRE9NQ01hcFJlYWRlckZhY3Rvcnk7XG5cdGV4cG9ydHMuRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5ID0gRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O1xuXHRsZXQgRGVmYXVsdEZpbHRlckZhY3RvcnkgPSBfZGlzcGxheV91dGlscy5ET01GaWx0ZXJGYWN0b3J5O1xuXHRleHBvcnRzLkRlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gRGVmYXVsdEZpbHRlckZhY3Rvcnk7XG5cdGxldCBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBfZGlzcGxheV91dGlscy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcblx0ZXhwb3J0cy5EZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG5cdGlmIChfaXNfbm9kZS5pc05vZGVKUykge1xuXHQgIGNvbnN0IHtcblx0ICAgIE5vZGVDYW52YXNGYWN0b3J5LFxuXHQgICAgTm9kZUNNYXBSZWFkZXJGYWN0b3J5LFxuXHQgICAgTm9kZUZpbHRlckZhY3RvcnksXG5cdCAgICBOb2RlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnlcblx0ICB9ID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7XG5cdCAgZXhwb3J0cy5EZWZhdWx0Q2FudmFzRmFjdG9yeSA9IERlZmF1bHRDYW52YXNGYWN0b3J5ID0gTm9kZUNhbnZhc0ZhY3Rvcnk7XG5cdCAgZXhwb3J0cy5EZWZhdWx0Q01hcFJlYWRlckZhY3RvcnkgPSBEZWZhdWx0Q01hcFJlYWRlckZhY3RvcnkgPSBOb2RlQ01hcFJlYWRlckZhY3Rvcnk7XG5cdCAgZXhwb3J0cy5EZWZhdWx0RmlsdGVyRmFjdG9yeSA9IERlZmF1bHRGaWx0ZXJGYWN0b3J5ID0gTm9kZUZpbHRlckZhY3Rvcnk7XG5cdCAgZXhwb3J0cy5EZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBEZWZhdWx0U3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBOb2RlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG5cdH1cblx0bGV0IGNyZWF0ZVBERk5ldHdvcmtTdHJlYW07XG5cdHtcblx0ICBpZiAoX2lzX25vZGUuaXNOb2RlSlMpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgUERGTm9kZVN0cmVhbVxuXHQgICAgfSA9IF9fd19wZGZqc19yZXF1aXJlX18oMjEpO1xuXHQgICAgY3JlYXRlUERGTmV0d29ya1N0cmVhbSA9IHBhcmFtcyA9PiB7XG5cdCAgICAgIHJldHVybiBuZXcgUERGTm9kZVN0cmVhbShwYXJhbXMpO1xuXHQgICAgfTtcblx0ICB9IGVsc2Uge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBQREZOZXR3b3JrU3RyZWFtXG5cdCAgICB9ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNCk7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIFBERkZldGNoU3RyZWFtXG5cdCAgICB9ID0gX193X3BkZmpzX3JlcXVpcmVfXygyNSk7XG5cdCAgICBjcmVhdGVQREZOZXR3b3JrU3RyZWFtID0gcGFyYW1zID0+IHtcblx0ICAgICAgcmV0dXJuICgwLCBfZGlzcGxheV91dGlscy5pc1ZhbGlkRmV0Y2hVcmwpKHBhcmFtcy51cmwpID8gbmV3IFBERkZldGNoU3RyZWFtKHBhcmFtcykgOiBuZXcgUERGTmV0d29ya1N0cmVhbShwYXJhbXMpO1xuXHQgICAgfTtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gZ2V0RG9jdW1lbnQoc3JjKSB7XG5cdCAgaWYgKHR5cGVvZiBzcmMgPT09IFwic3RyaW5nXCIgfHwgc3JjIGluc3RhbmNlb2YgVVJMKSB7XG5cdCAgICBzcmMgPSB7XG5cdCAgICAgIHVybDogc3JjXG5cdCAgICB9O1xuXHQgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKHNyYykpIHtcblx0ICAgIHNyYyA9IHtcblx0ICAgICAgZGF0YTogc3JjXG5cdCAgICB9O1xuXHQgIH1cblx0ICBpZiAodHlwZW9mIHNyYyAhPT0gXCJvYmplY3RcIikge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXIgaW4gZ2V0RG9jdW1lbnQsIG5lZWQgcGFyYW1ldGVyIG9iamVjdC5cIik7XG5cdCAgfVxuXHQgIGlmICghc3JjLnVybCAmJiAhc3JjLmRhdGEgJiYgIXNyYy5yYW5nZSkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXIgb2JqZWN0OiBuZWVkIGVpdGhlciAuZGF0YSwgLnJhbmdlIG9yIC51cmxcIik7XG5cdCAgfVxuXHQgIGNvbnN0IHRhc2sgPSBuZXcgUERGRG9jdW1lbnRMb2FkaW5nVGFzaygpO1xuXHQgIGNvbnN0IHtcblx0ICAgIGRvY0lkXG5cdCAgfSA9IHRhc2s7XG5cdCAgY29uc3QgdXJsID0gc3JjLnVybCA/IGdldFVybFByb3Aoc3JjLnVybCkgOiBudWxsO1xuXHQgIGNvbnN0IGRhdGEgPSBzcmMuZGF0YSA/IGdldERhdGFQcm9wKHNyYy5kYXRhKSA6IG51bGw7XG5cdCAgY29uc3QgaHR0cEhlYWRlcnMgPSBzcmMuaHR0cEhlYWRlcnMgfHwgbnVsbDtcblx0ICBjb25zdCB3aXRoQ3JlZGVudGlhbHMgPSBzcmMud2l0aENyZWRlbnRpYWxzID09PSB0cnVlO1xuXHQgIGNvbnN0IHBhc3N3b3JkID0gc3JjLnBhc3N3b3JkID8/IG51bGw7XG5cdCAgY29uc3QgcmFuZ2VUcmFuc3BvcnQgPSBzcmMucmFuZ2UgaW5zdGFuY2VvZiBQREZEYXRhUmFuZ2VUcmFuc3BvcnQgPyBzcmMucmFuZ2UgOiBudWxsO1xuXHQgIGNvbnN0IHJhbmdlQ2h1bmtTaXplID0gTnVtYmVyLmlzSW50ZWdlcihzcmMucmFuZ2VDaHVua1NpemUpICYmIHNyYy5yYW5nZUNodW5rU2l6ZSA+IDAgPyBzcmMucmFuZ2VDaHVua1NpemUgOiBERUZBVUxUX1JBTkdFX0NIVU5LX1NJWkU7XG5cdCAgbGV0IHdvcmtlciA9IHNyYy53b3JrZXIgaW5zdGFuY2VvZiBQREZXb3JrZXIgPyBzcmMud29ya2VyIDogbnVsbDtcblx0ICBjb25zdCB2ZXJib3NpdHkgPSBzcmMudmVyYm9zaXR5O1xuXHQgIGNvbnN0IGRvY0Jhc2VVcmwgPSB0eXBlb2Ygc3JjLmRvY0Jhc2VVcmwgPT09IFwic3RyaW5nXCIgJiYgISgwLCBfZGlzcGxheV91dGlscy5pc0RhdGFTY2hlbWUpKHNyYy5kb2NCYXNlVXJsKSA/IHNyYy5kb2NCYXNlVXJsIDogbnVsbDtcblx0ICBjb25zdCBjTWFwVXJsID0gdHlwZW9mIHNyYy5jTWFwVXJsID09PSBcInN0cmluZ1wiID8gc3JjLmNNYXBVcmwgOiBudWxsO1xuXHQgIGNvbnN0IGNNYXBQYWNrZWQgPSBzcmMuY01hcFBhY2tlZCAhPT0gZmFsc2U7XG5cdCAgY29uc3QgQ01hcFJlYWRlckZhY3RvcnkgPSBzcmMuQ01hcFJlYWRlckZhY3RvcnkgfHwgRGVmYXVsdENNYXBSZWFkZXJGYWN0b3J5O1xuXHQgIGNvbnN0IHN0YW5kYXJkRm9udERhdGFVcmwgPSB0eXBlb2Ygc3JjLnN0YW5kYXJkRm9udERhdGFVcmwgPT09IFwic3RyaW5nXCIgPyBzcmMuc3RhbmRhcmRGb250RGF0YVVybCA6IG51bGw7XG5cdCAgY29uc3QgU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBzcmMuU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgfHwgRGVmYXVsdFN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuXHQgIGNvbnN0IGlnbm9yZUVycm9ycyA9IHNyYy5zdG9wQXRFcnJvcnMgIT09IHRydWU7XG5cdCAgY29uc3QgbWF4SW1hZ2VTaXplID0gTnVtYmVyLmlzSW50ZWdlcihzcmMubWF4SW1hZ2VTaXplKSAmJiBzcmMubWF4SW1hZ2VTaXplID4gLTEgPyBzcmMubWF4SW1hZ2VTaXplIDogLTE7XG5cdCAgY29uc3QgaXNFdmFsU3VwcG9ydGVkID0gc3JjLmlzRXZhbFN1cHBvcnRlZCAhPT0gZmFsc2U7XG5cdCAgY29uc3QgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSB0eXBlb2Ygc3JjLmlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkID09PSBcImJvb2xlYW5cIiA/IHNyYy5pc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCA6ICFfaXNfbm9kZS5pc05vZGVKUztcblx0ICBjb25zdCBjYW52YXNNYXhBcmVhSW5CeXRlcyA9IE51bWJlci5pc0ludGVnZXIoc3JjLmNhbnZhc01heEFyZWFJbkJ5dGVzKSA/IHNyYy5jYW52YXNNYXhBcmVhSW5CeXRlcyA6IC0xO1xuXHQgIGNvbnN0IGRpc2FibGVGb250RmFjZSA9IHR5cGVvZiBzcmMuZGlzYWJsZUZvbnRGYWNlID09PSBcImJvb2xlYW5cIiA/IHNyYy5kaXNhYmxlRm9udEZhY2UgOiBfaXNfbm9kZS5pc05vZGVKUztcblx0ICBjb25zdCBmb250RXh0cmFQcm9wZXJ0aWVzID0gc3JjLmZvbnRFeHRyYVByb3BlcnRpZXMgPT09IHRydWU7XG5cdCAgY29uc3QgZW5hYmxlWGZhID0gc3JjLmVuYWJsZVhmYSA9PT0gdHJ1ZTtcblx0ICBjb25zdCBvd25lckRvY3VtZW50ID0gc3JjLm93bmVyRG9jdW1lbnQgfHwgZ2xvYmFsVGhpcy5kb2N1bWVudDtcblx0ICBjb25zdCBkaXNhYmxlUmFuZ2UgPSBzcmMuZGlzYWJsZVJhbmdlID09PSB0cnVlO1xuXHQgIGNvbnN0IGRpc2FibGVTdHJlYW0gPSBzcmMuZGlzYWJsZVN0cmVhbSA9PT0gdHJ1ZTtcblx0ICBjb25zdCBkaXNhYmxlQXV0b0ZldGNoID0gc3JjLmRpc2FibGVBdXRvRmV0Y2ggPT09IHRydWU7XG5cdCAgY29uc3QgcGRmQnVnID0gc3JjLnBkZkJ1ZyA9PT0gdHJ1ZTtcblx0ICBjb25zdCBsZW5ndGggPSByYW5nZVRyYW5zcG9ydCA/IHJhbmdlVHJhbnNwb3J0Lmxlbmd0aCA6IHNyYy5sZW5ndGggPz8gTmFOO1xuXHQgIGNvbnN0IHVzZVN5c3RlbUZvbnRzID0gdHlwZW9mIHNyYy51c2VTeXN0ZW1Gb250cyA9PT0gXCJib29sZWFuXCIgPyBzcmMudXNlU3lzdGVtRm9udHMgOiAhX2lzX25vZGUuaXNOb2RlSlMgJiYgIWRpc2FibGVGb250RmFjZTtcblx0ICBjb25zdCB1c2VXb3JrZXJGZXRjaCA9IHR5cGVvZiBzcmMudXNlV29ya2VyRmV0Y2ggPT09IFwiYm9vbGVhblwiID8gc3JjLnVzZVdvcmtlckZldGNoIDogQ01hcFJlYWRlckZhY3RvcnkgPT09IF9kaXNwbGF5X3V0aWxzLkRPTUNNYXBSZWFkZXJGYWN0b3J5ICYmIFN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID09PSBfZGlzcGxheV91dGlscy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSAmJiAoMCwgX2Rpc3BsYXlfdXRpbHMuaXNWYWxpZEZldGNoVXJsKShjTWFwVXJsLCBkb2N1bWVudC5iYXNlVVJJKSAmJiAoMCwgX2Rpc3BsYXlfdXRpbHMuaXNWYWxpZEZldGNoVXJsKShzdGFuZGFyZEZvbnREYXRhVXJsLCBkb2N1bWVudC5iYXNlVVJJKTtcblx0ICBjb25zdCBjYW52YXNGYWN0b3J5ID0gc3JjLmNhbnZhc0ZhY3RvcnkgfHwgbmV3IERlZmF1bHRDYW52YXNGYWN0b3J5KHtcblx0ICAgIG93bmVyRG9jdW1lbnRcblx0ICB9KTtcblx0ICBjb25zdCBmaWx0ZXJGYWN0b3J5ID0gc3JjLmZpbHRlckZhY3RvcnkgfHwgbmV3IERlZmF1bHRGaWx0ZXJGYWN0b3J5KHtcblx0ICAgIGRvY0lkLFxuXHQgICAgb3duZXJEb2N1bWVudFxuXHQgIH0pO1xuXHQgIGNvbnN0IHN0eWxlRWxlbWVudCA9IG51bGw7XG5cdCAgKDAsIF91dGlsLnNldFZlcmJvc2l0eUxldmVsKSh2ZXJib3NpdHkpO1xuXHQgIGNvbnN0IHRyYW5zcG9ydEZhY3RvcnkgPSB7XG5cdCAgICBjYW52YXNGYWN0b3J5LFxuXHQgICAgZmlsdGVyRmFjdG9yeVxuXHQgIH07XG5cdCAgaWYgKCF1c2VXb3JrZXJGZXRjaCkge1xuXHQgICAgdHJhbnNwb3J0RmFjdG9yeS5jTWFwUmVhZGVyRmFjdG9yeSA9IG5ldyBDTWFwUmVhZGVyRmFjdG9yeSh7XG5cdCAgICAgIGJhc2VVcmw6IGNNYXBVcmwsXG5cdCAgICAgIGlzQ29tcHJlc3NlZDogY01hcFBhY2tlZFxuXHQgICAgfSk7XG5cdCAgICB0cmFuc3BvcnRGYWN0b3J5LnN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gbmV3IFN0YW5kYXJkRm9udERhdGFGYWN0b3J5KHtcblx0ICAgICAgYmFzZVVybDogc3RhbmRhcmRGb250RGF0YVVybFxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGlmICghd29ya2VyKSB7XG5cdCAgICBjb25zdCB3b3JrZXJQYXJhbXMgPSB7XG5cdCAgICAgIHZlcmJvc2l0eSxcblx0ICAgICAgcG9ydDogX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyUG9ydFxuXHQgICAgfTtcblx0ICAgIHdvcmtlciA9IHdvcmtlclBhcmFtcy5wb3J0ID8gUERGV29ya2VyLmZyb21Qb3J0KHdvcmtlclBhcmFtcykgOiBuZXcgUERGV29ya2VyKHdvcmtlclBhcmFtcyk7XG5cdCAgICB0YXNrLl93b3JrZXIgPSB3b3JrZXI7XG5cdCAgfVxuXHQgIGNvbnN0IGZldGNoRG9jUGFyYW1zID0ge1xuXHQgICAgZG9jSWQsXG5cdCAgICBhcGlWZXJzaW9uOiAnMy42LjE3MicsXG5cdCAgICBkYXRhLFxuXHQgICAgcGFzc3dvcmQsXG5cdCAgICBkaXNhYmxlQXV0b0ZldGNoLFxuXHQgICAgcmFuZ2VDaHVua1NpemUsXG5cdCAgICBsZW5ndGgsXG5cdCAgICBkb2NCYXNlVXJsLFxuXHQgICAgZW5hYmxlWGZhLFxuXHQgICAgZXZhbHVhdG9yT3B0aW9uczoge1xuXHQgICAgICBtYXhJbWFnZVNpemUsXG5cdCAgICAgIGRpc2FibGVGb250RmFjZSxcblx0ICAgICAgaWdub3JlRXJyb3JzLFxuXHQgICAgICBpc0V2YWxTdXBwb3J0ZWQsXG5cdCAgICAgIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkLFxuXHQgICAgICBjYW52YXNNYXhBcmVhSW5CeXRlcyxcblx0ICAgICAgZm9udEV4dHJhUHJvcGVydGllcyxcblx0ICAgICAgdXNlU3lzdGVtRm9udHMsXG5cdCAgICAgIGNNYXBVcmw6IHVzZVdvcmtlckZldGNoID8gY01hcFVybCA6IG51bGwsXG5cdCAgICAgIHN0YW5kYXJkRm9udERhdGFVcmw6IHVzZVdvcmtlckZldGNoID8gc3RhbmRhcmRGb250RGF0YVVybCA6IG51bGxcblx0ICAgIH1cblx0ICB9O1xuXHQgIGNvbnN0IHRyYW5zcG9ydFBhcmFtcyA9IHtcblx0ICAgIGlnbm9yZUVycm9ycyxcblx0ICAgIGlzRXZhbFN1cHBvcnRlZCxcblx0ICAgIGRpc2FibGVGb250RmFjZSxcblx0ICAgIGZvbnRFeHRyYVByb3BlcnRpZXMsXG5cdCAgICBlbmFibGVYZmEsXG5cdCAgICBvd25lckRvY3VtZW50LFxuXHQgICAgZGlzYWJsZUF1dG9GZXRjaCxcblx0ICAgIHBkZkJ1Zyxcblx0ICAgIHN0eWxlRWxlbWVudFxuXHQgIH07XG5cdCAgd29ya2VyLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG5cdCAgICBpZiAodGFzay5kZXN0cm95ZWQpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9hZGluZyBhYm9ydGVkXCIpO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgd29ya2VySWRQcm9taXNlID0gX2ZldGNoRG9jdW1lbnQod29ya2VyLCBmZXRjaERvY1BhcmFtcyk7XG5cdCAgICBjb25zdCBuZXR3b3JrU3RyZWFtUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdCAgICAgIGxldCBuZXR3b3JrU3RyZWFtO1xuXHQgICAgICBpZiAocmFuZ2VUcmFuc3BvcnQpIHtcblx0ICAgICAgICBuZXR3b3JrU3RyZWFtID0gbmV3IF90cmFuc3BvcnRfc3RyZWFtLlBERkRhdGFUcmFuc3BvcnRTdHJlYW0oe1xuXHQgICAgICAgICAgbGVuZ3RoLFxuXHQgICAgICAgICAgaW5pdGlhbERhdGE6IHJhbmdlVHJhbnNwb3J0LmluaXRpYWxEYXRhLFxuXHQgICAgICAgICAgcHJvZ3Jlc3NpdmVEb25lOiByYW5nZVRyYW5zcG9ydC5wcm9ncmVzc2l2ZURvbmUsXG5cdCAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZTogcmFuZ2VUcmFuc3BvcnQuY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUsXG5cdCAgICAgICAgICBkaXNhYmxlUmFuZ2UsXG5cdCAgICAgICAgICBkaXNhYmxlU3RyZWFtXG5cdCAgICAgICAgfSwgcmFuZ2VUcmFuc3BvcnQpO1xuXHQgICAgICB9IGVsc2UgaWYgKCFkYXRhKSB7XG5cdCAgICAgICAgbmV0d29ya1N0cmVhbSA9IGNyZWF0ZVBERk5ldHdvcmtTdHJlYW0oe1xuXHQgICAgICAgICAgdXJsLFxuXHQgICAgICAgICAgbGVuZ3RoLFxuXHQgICAgICAgICAgaHR0cEhlYWRlcnMsXG5cdCAgICAgICAgICB3aXRoQ3JlZGVudGlhbHMsXG5cdCAgICAgICAgICByYW5nZUNodW5rU2l6ZSxcblx0ICAgICAgICAgIGRpc2FibGVSYW5nZSxcblx0ICAgICAgICAgIGRpc2FibGVTdHJlYW1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICByZXNvbHZlKG5ldHdvcmtTdHJlYW0pO1xuXHQgICAgfSk7XG5cdCAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3dvcmtlcklkUHJvbWlzZSwgbmV0d29ya1N0cmVhbVByb21pc2VdKS50aGVuKGZ1bmN0aW9uIChbd29ya2VySWQsIG5ldHdvcmtTdHJlYW1dKSB7XG5cdCAgICAgIGlmICh0YXNrLmRlc3Ryb3llZCkge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkxvYWRpbmcgYWJvcnRlZFwiKTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKGRvY0lkLCB3b3JrZXJJZCwgd29ya2VyLnBvcnQpO1xuXHQgICAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgV29ya2VyVHJhbnNwb3J0KG1lc3NhZ2VIYW5kbGVyLCB0YXNrLCBuZXR3b3JrU3RyZWFtLCB0cmFuc3BvcnRQYXJhbXMsIHRyYW5zcG9ydEZhY3RvcnkpO1xuXHQgICAgICB0YXNrLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG5cdCAgICAgIG1lc3NhZ2VIYW5kbGVyLnNlbmQoXCJSZWFkeVwiLCBudWxsKTtcblx0ICAgIH0pO1xuXHQgIH0pLmNhdGNoKHRhc2suX2NhcGFiaWxpdHkucmVqZWN0KTtcblx0ICByZXR1cm4gdGFzaztcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBfZmV0Y2hEb2N1bWVudCh3b3JrZXIsIHNvdXJjZSkge1xuXHQgIGlmICh3b3JrZXIuZGVzdHJveWVkKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKTtcblx0ICB9XG5cdCAgY29uc3Qgd29ya2VySWQgPSBhd2FpdCB3b3JrZXIubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RG9jUmVxdWVzdFwiLCBzb3VyY2UsIHNvdXJjZS5kYXRhID8gW3NvdXJjZS5kYXRhLmJ1ZmZlcl0gOiBudWxsKTtcblx0ICBpZiAod29ya2VyLmRlc3Ryb3llZCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2VyIHdhcyBkZXN0cm95ZWRcIik7XG5cdCAgfVxuXHQgIHJldHVybiB3b3JrZXJJZDtcblx0fVxuXHRmdW5jdGlvbiBnZXRVcmxQcm9wKHZhbCkge1xuXHQgIGlmICh2YWwgaW5zdGFuY2VvZiBVUkwpIHtcblx0ICAgIHJldHVybiB2YWwuaHJlZjtcblx0ICB9XG5cdCAgdHJ5IHtcblx0ICAgIHJldHVybiBuZXcgVVJMKHZhbCwgd2luZG93LmxvY2F0aW9uKS5ocmVmO1xuXHQgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMgJiYgdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuXHQgICAgICByZXR1cm4gdmFsO1xuXHQgICAgfVxuXHQgIH1cblx0ICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFBERiB1cmwgZGF0YTogXCIgKyBcImVpdGhlciBzdHJpbmcgb3IgVVJMLW9iamVjdCBpcyBleHBlY3RlZCBpbiB0aGUgdXJsIHByb3BlcnR5LlwiKTtcblx0fVxuXHRmdW5jdGlvbiBnZXREYXRhUHJvcCh2YWwpIHtcblx0ICBpZiAoX2lzX25vZGUuaXNOb2RlSlMgJiYgdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWwgaW5zdGFuY2VvZiBCdWZmZXIpIHtcblx0ICAgICgwLCBfZGlzcGxheV91dGlscy5kZXByZWNhdGVkKShcIlBsZWFzZSBwcm92aWRlIGJpbmFyeSBkYXRhIGFzIGBVaW50OEFycmF5YCwgcmF0aGVyIHRoYW4gYEJ1ZmZlcmAuXCIpO1xuXHQgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZhbCk7XG5cdCAgfVxuXHQgIGlmICh2YWwgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIHZhbC5ieXRlTGVuZ3RoID09PSB2YWwuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcblx0ICAgIHJldHVybiB2YWw7XG5cdCAgfVxuXHQgIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnN0cmluZ1RvQnl0ZXMpKHZhbCk7XG5cdCAgfVxuXHQgIGlmICh0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiICYmICFpc05hTih2YWw/Lmxlbmd0aCkgfHwgKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKHZhbCkpIHtcblx0ICAgIHJldHVybiBuZXcgVWludDhBcnJheSh2YWwpO1xuXHQgIH1cblx0ICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFBERiBiaW5hcnkgZGF0YTogZWl0aGVyIFR5cGVkQXJyYXksIFwiICsgXCJzdHJpbmcsIG9yIGFycmF5LWxpa2Ugb2JqZWN0IGlzIGV4cGVjdGVkIGluIHRoZSBkYXRhIHByb3BlcnR5LlwiKTtcblx0fVxuXHRjbGFzcyBQREZEb2N1bWVudExvYWRpbmdUYXNrIHtcblx0ICBzdGF0aWMgI2RvY0lkID0gMDtcblx0ICBjb25zdHJ1Y3RvcigpIHtcblx0ICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIHRoaXMuX3RyYW5zcG9ydCA9IG51bGw7XG5cdCAgICB0aGlzLl93b3JrZXIgPSBudWxsO1xuXHQgICAgdGhpcy5kb2NJZCA9IGBkJHtQREZEb2N1bWVudExvYWRpbmdUYXNrLiNkb2NJZCsrfWA7XG5cdCAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXHQgICAgdGhpcy5vblBhc3N3b3JkID0gbnVsbDtcblx0ICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cdCAgfVxuXHQgIGdldCBwcm9taXNlKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2NhcGFiaWxpdHkucHJvbWlzZTtcblx0ICB9XG5cdCAgYXN5bmMgZGVzdHJveSgpIHtcblx0ICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcblx0ICAgIGF3YWl0IHRoaXMuX3RyYW5zcG9ydD8uZGVzdHJveSgpO1xuXHQgICAgdGhpcy5fdHJhbnNwb3J0ID0gbnVsbDtcblx0ICAgIGlmICh0aGlzLl93b3JrZXIpIHtcblx0ICAgICAgdGhpcy5fd29ya2VyLmRlc3Ryb3koKTtcblx0ICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5QREZEb2N1bWVudExvYWRpbmdUYXNrID0gUERGRG9jdW1lbnRMb2FkaW5nVGFzaztcblx0Y2xhc3MgUERGRGF0YVJhbmdlVHJhbnNwb3J0IHtcblx0ICBjb25zdHJ1Y3RvcihsZW5ndGgsIGluaXRpYWxEYXRhLCBwcm9ncmVzc2l2ZURvbmUgPSBmYWxzZSwgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBudWxsKSB7XG5cdCAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcblx0ICAgIHRoaXMuaW5pdGlhbERhdGEgPSBpbml0aWFsRGF0YTtcblx0ICAgIHRoaXMucHJvZ3Jlc3NpdmVEb25lID0gcHJvZ3Jlc3NpdmVEb25lO1xuXHQgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA9IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lO1xuXHQgICAgdGhpcy5fcmFuZ2VMaXN0ZW5lcnMgPSBbXTtcblx0ICAgIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzID0gW107XG5cdCAgICB0aGlzLl9wcm9ncmVzc2l2ZVJlYWRMaXN0ZW5lcnMgPSBbXTtcblx0ICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycyA9IFtdO1xuXHQgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgfVxuXHQgIGFkZFJhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHtcblx0ICAgIHRoaXMuX3JhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXHQgIH1cblx0ICBhZGRQcm9ncmVzc0xpc3RlbmVyKGxpc3RlbmVyKSB7XG5cdCAgICB0aGlzLl9wcm9ncmVzc0xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblx0ICB9XG5cdCAgYWRkUHJvZ3Jlc3NpdmVSZWFkTGlzdGVuZXIobGlzdGVuZXIpIHtcblx0ICAgIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblx0ICB9XG5cdCAgYWRkUHJvZ3Jlc3NpdmVEb25lTGlzdGVuZXIobGlzdGVuZXIpIHtcblx0ICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblx0ICB9XG5cdCAgb25EYXRhUmFuZ2UoYmVnaW4sIGNodW5rKSB7XG5cdCAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3JhbmdlTGlzdGVuZXJzKSB7XG5cdCAgICAgIGxpc3RlbmVyKGJlZ2luLCBjaHVuayk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIG9uRGF0YVByb2dyZXNzKGxvYWRlZCwgdG90YWwpIHtcblx0ICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuXHQgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzTGlzdGVuZXJzKSB7XG5cdCAgICAgICAgbGlzdGVuZXIobG9hZGVkLCB0b3RhbCk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH1cblx0ICBvbkRhdGFQcm9ncmVzc2l2ZVJlYWQoY2h1bmspIHtcblx0ICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuXHQgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzaXZlUmVhZExpc3RlbmVycykge1xuXHQgICAgICAgIGxpc3RlbmVyKGNodW5rKTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIG9uRGF0YVByb2dyZXNzaXZlRG9uZSgpIHtcblx0ICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4ge1xuXHQgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX3Byb2dyZXNzaXZlRG9uZUxpc3RlbmVycykge1xuXHQgICAgICAgIGxpc3RlbmVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH1cblx0ICB0cmFuc3BvcnRSZWFkeSgpIHtcblx0ICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgfVxuXHQgIHJlcXVlc3REYXRhUmFuZ2UoYmVnaW4sIGVuZCkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBQREZEYXRhUmFuZ2VUcmFuc3BvcnQucmVxdWVzdERhdGFSYW5nZVwiKTtcblx0ICB9XG5cdCAgYWJvcnQoKSB7fVxuXHR9XG5cdGV4cG9ydHMuUERGRGF0YVJhbmdlVHJhbnNwb3J0ID0gUERGRGF0YVJhbmdlVHJhbnNwb3J0O1xuXHRjbGFzcyBQREZEb2N1bWVudFByb3h5IHtcblx0ICBjb25zdHJ1Y3RvcihwZGZJbmZvLCB0cmFuc3BvcnQpIHtcblx0ICAgIHRoaXMuX3BkZkluZm8gPSBwZGZJbmZvO1xuXHQgICAgdGhpcy5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0O1xuXHQgIH1cblx0ICBnZXQgYW5ub3RhdGlvblN0b3JhZ2UoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmFubm90YXRpb25TdG9yYWdlO1xuXHQgIH1cblx0ICBnZXQgZmlsdGVyRmFjdG9yeSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeTtcblx0ICB9XG5cdCAgZ2V0IG51bVBhZ2VzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3BkZkluZm8ubnVtUGFnZXM7XG5cdCAgfVxuXHQgIGdldCBmaW5nZXJwcmludHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fcGRmSW5mby5maW5nZXJwcmludHM7XG5cdCAgfVxuXHQgIGdldCBpc1B1cmVYZmEoKSB7XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJpc1B1cmVYZmFcIiwgISF0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpO1xuXHQgIH1cblx0ICBnZXQgYWxsWGZhSHRtbCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmE7XG5cdCAgfVxuXHQgIGdldFBhZ2UocGFnZU51bWJlcikge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlKHBhZ2VOdW1iZXIpO1xuXHQgIH1cblx0ICBnZXRQYWdlSW5kZXgocmVmKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VJbmRleChyZWYpO1xuXHQgIH1cblx0ICBnZXREZXN0aW5hdGlvbnMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldERlc3RpbmF0aW9ucygpO1xuXHQgIH1cblx0ICBnZXREZXN0aW5hdGlvbihpZCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREZXN0aW5hdGlvbihpZCk7XG5cdCAgfVxuXHQgIGdldFBhZ2VMYWJlbHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFBhZ2VMYWJlbHMoKTtcblx0ICB9XG5cdCAgZ2V0UGFnZUxheW91dCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZUxheW91dCgpO1xuXHQgIH1cblx0ICBnZXRQYWdlTW9kZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGFnZU1vZGUoKTtcblx0ICB9XG5cdCAgZ2V0Vmlld2VyUHJlZmVyZW5jZXMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldFZpZXdlclByZWZlcmVuY2VzKCk7XG5cdCAgfVxuXHQgIGdldE9wZW5BY3Rpb24oKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wZW5BY3Rpb24oKTtcblx0ICB9XG5cdCAgZ2V0QXR0YWNobWVudHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEF0dGFjaG1lbnRzKCk7XG5cdCAgfVxuXHQgIGdldEphdmFTY3JpcHQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldEphdmFTY3JpcHQoKTtcblx0ICB9XG5cdCAgZ2V0SlNBY3Rpb25zKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREb2NKU0FjdGlvbnMoKTtcblx0ICB9XG5cdCAgZ2V0T3V0bGluZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0T3V0bGluZSgpO1xuXHQgIH1cblx0ICBnZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuXHQgIH1cblx0ICBnZXRQZXJtaXNzaW9ucygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0UGVybWlzc2lvbnMoKTtcblx0ICB9XG5cdCAgZ2V0TWV0YWRhdGEoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LmdldE1ldGFkYXRhKCk7XG5cdCAgfVxuXHQgIGdldE1hcmtJbmZvKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRNYXJrSW5mbygpO1xuXHQgIH1cblx0ICBnZXREYXRhKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXREYXRhKCk7XG5cdCAgfVxuXHQgIHNhdmVEb2N1bWVudCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuc2F2ZURvY3VtZW50KCk7XG5cdCAgfVxuXHQgIGdldERvd25sb2FkSW5mbygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBjbGVhbnVwKGtlZXBMb2FkZWRGb250cyA9IGZhbHNlKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0LnN0YXJ0Q2xlYW51cChrZWVwTG9hZGVkRm9udHMgfHwgdGhpcy5pc1B1cmVYZmEpO1xuXHQgIH1cblx0ICBkZXN0cm95KCkge1xuXHQgICAgcmV0dXJuIHRoaXMubG9hZGluZ1Rhc2suZGVzdHJveSgpO1xuXHQgIH1cblx0ICBnZXQgbG9hZGluZ1BhcmFtcygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubG9hZGluZ1BhcmFtcztcblx0ICB9XG5cdCAgZ2V0IGxvYWRpbmdUYXNrKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5sb2FkaW5nVGFzaztcblx0ICB9XG5cdCAgZ2V0RmllbGRPYmplY3RzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRGaWVsZE9iamVjdHMoKTtcblx0ICB9XG5cdCAgaGFzSlNBY3Rpb25zKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5oYXNKU0FjdGlvbnMoKTtcblx0ICB9XG5cdCAgZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0Q2FsY3VsYXRpb25PcmRlcklkcygpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlBERkRvY3VtZW50UHJveHkgPSBQREZEb2N1bWVudFByb3h5O1xuXHRjbGFzcyBQREZQYWdlUHJveHkge1xuXHQgICNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBudWxsO1xuXHQgICNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuXHQgIGNvbnN0cnVjdG9yKHBhZ2VJbmRleCwgcGFnZUluZm8sIHRyYW5zcG9ydCwgcGRmQnVnID0gZmFsc2UpIHtcblx0ICAgIHRoaXMuX3BhZ2VJbmRleCA9IHBhZ2VJbmRleDtcblx0ICAgIHRoaXMuX3BhZ2VJbmZvID0gcGFnZUluZm87XG5cdCAgICB0aGlzLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG5cdCAgICB0aGlzLl9zdGF0cyA9IHBkZkJ1ZyA/IG5ldyBfZGlzcGxheV91dGlscy5TdGF0VGltZXIoKSA6IG51bGw7XG5cdCAgICB0aGlzLl9wZGZCdWcgPSBwZGZCdWc7XG5cdCAgICB0aGlzLmNvbW1vbk9ianMgPSB0cmFuc3BvcnQuY29tbW9uT2Jqcztcblx0ICAgIHRoaXMub2JqcyA9IG5ldyBQREZPYmplY3RzKCk7XG5cdCAgICB0aGlzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlciA9IGZhbHNlO1xuXHQgICAgdGhpcy5faW50ZW50U3RhdGVzID0gbmV3IE1hcCgpO1xuXHQgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblx0ICB9XG5cdCAgZ2V0IHBhZ2VOdW1iZXIoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fcGFnZUluZGV4ICsgMTtcblx0ICB9XG5cdCAgZ2V0IHJvdGF0ZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9wYWdlSW5mby5yb3RhdGU7XG5cdCAgfVxuXHQgIGdldCByZWYoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8ucmVmO1xuXHQgIH1cblx0ICBnZXQgdXNlclVuaXQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fcGFnZUluZm8udXNlclVuaXQ7XG5cdCAgfVxuXHQgIGdldCB2aWV3KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3BhZ2VJbmZvLnZpZXc7XG5cdCAgfVxuXHQgIGdldFZpZXdwb3J0KHtcblx0ICAgIHNjYWxlLFxuXHQgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0ZSxcblx0ICAgIG9mZnNldFggPSAwLFxuXHQgICAgb2Zmc2V0WSA9IDAsXG5cdCAgICBkb250RmxpcCA9IGZhbHNlXG5cdCAgfSA9IHt9KSB7XG5cdCAgICByZXR1cm4gbmV3IF9kaXNwbGF5X3V0aWxzLlBhZ2VWaWV3cG9ydCh7XG5cdCAgICAgIHZpZXdCb3g6IHRoaXMudmlldyxcblx0ICAgICAgc2NhbGUsXG5cdCAgICAgIHJvdGF0aW9uLFxuXHQgICAgICBvZmZzZXRYLFxuXHQgICAgICBvZmZzZXRZLFxuXHQgICAgICBkb250RmxpcFxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldEFubm90YXRpb25zKHtcblx0ICAgIGludGVudCA9IFwiZGlzcGxheVwiXG5cdCAgfSA9IHt9KSB7XG5cdCAgICBjb25zdCBpbnRlbnRBcmdzID0gdGhpcy5fdHJhbnNwb3J0LmdldFJlbmRlcmluZ0ludGVudChpbnRlbnQpO1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRBbm5vdGF0aW9ucyh0aGlzLl9wYWdlSW5kZXgsIGludGVudEFyZ3MucmVuZGVyaW5nSW50ZW50KTtcblx0ICB9XG5cdCAgZ2V0SlNBY3Rpb25zKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5nZXRQYWdlSlNBY3Rpb25zKHRoaXMuX3BhZ2VJbmRleCk7XG5cdCAgfVxuXHQgIGdldCBpc1B1cmVYZmEoKSB7XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJpc1B1cmVYZmFcIiwgISF0aGlzLl90cmFuc3BvcnQuX2h0bWxGb3JYZmEpO1xuXHQgIH1cblx0ICBhc3luYyBnZXRYZmEoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdHJhbnNwb3J0Ll9odG1sRm9yWGZhPy5jaGlsZHJlblt0aGlzLl9wYWdlSW5kZXhdIHx8IG51bGw7XG5cdCAgfVxuXHQgIHJlbmRlcih7XG5cdCAgICBjYW52YXNDb250ZXh0LFxuXHQgICAgdmlld3BvcnQsXG5cdCAgICBpbnRlbnQgPSBcImRpc3BsYXlcIixcblx0ICAgIGFubm90YXRpb25Nb2RlID0gX3V0aWwuQW5ub3RhdGlvbk1vZGUuRU5BQkxFLFxuXHQgICAgdHJhbnNmb3JtID0gbnVsbCxcblx0ICAgIGJhY2tncm91bmQgPSBudWxsLFxuXHQgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGwsXG5cdCAgICBhbm5vdGF0aW9uQ2FudmFzTWFwID0gbnVsbCxcblx0ICAgIHBhZ2VDb2xvcnMgPSBudWxsLFxuXHQgICAgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IG51bGxcblx0ICB9KSB7XG5cdCAgICBpZiAoYXJndW1lbnRzWzBdPy5jYW52YXNGYWN0b3J5KSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcInJlbmRlciBubyBsb25nZXIgYWNjZXB0cyB0aGUgYGNhbnZhc0ZhY3RvcnlgLW9wdGlvbiwgXCIgKyBcInBsZWFzZSBwYXNzIGl0IHRvIHRoZSBgZ2V0RG9jdW1lbnRgLWZ1bmN0aW9uIGluc3RlYWQuXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJPdmVyYWxsXCIpO1xuXHQgICAgY29uc3QgaW50ZW50QXJncyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50LCBhbm5vdGF0aW9uTW9kZSwgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSk7XG5cdCAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuXHQgICAgdGhpcy4jYWJvcnREZWxheWVkQ2xlYW51cCgpO1xuXHQgICAgaWYgKCFvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7XG5cdCAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSB0aGlzLl90cmFuc3BvcnQuZ2V0T3B0aW9uYWxDb250ZW50Q29uZmlnKCk7XG5cdCAgICB9XG5cdCAgICBsZXQgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGludGVudEFyZ3MuY2FjaGVLZXkpO1xuXHQgICAgaWYgKCFpbnRlbnRTdGF0ZSkge1xuXHQgICAgICBpbnRlbnRTdGF0ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5zZXQoaW50ZW50QXJncy5jYWNoZUtleSwgaW50ZW50U3RhdGUpO1xuXHQgICAgfVxuXHQgICAgaWYgKGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpIHtcblx0ICAgICAgY2xlYXJUaW1lb3V0KGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQpO1xuXHQgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXJDYW5jZWxUaW1lb3V0ID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGludGVudFByaW50ID0gISEoaW50ZW50QXJncy5yZW5kZXJpbmdJbnRlbnQgJiBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLlBSSU5UKTtcblx0ICAgIGlmICghaW50ZW50U3RhdGUuZGlzcGxheVJlYWR5Q2FwYWJpbGl0eSkge1xuXHQgICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCA9IHtcblx0ICAgICAgICBmbkFycmF5OiBbXSxcblx0ICAgICAgICBhcmdzQXJyYXk6IFtdLFxuXHQgICAgICAgIGxhc3RDaHVuazogZmFsc2UsXG5cdCAgICAgICAgc2VwYXJhdGVBbm5vdHM6IG51bGxcblx0ICAgICAgfTtcblx0ICAgICAgdGhpcy5fc3RhdHM/LnRpbWUoXCJQYWdlIFJlcXVlc3RcIik7XG5cdCAgICAgIHRoaXMuX3B1bXBPcGVyYXRvckxpc3QoaW50ZW50QXJncyk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBjb21wbGV0ZSA9IGVycm9yID0+IHtcblx0ICAgICAgaW50ZW50U3RhdGUucmVuZGVyVGFza3MuZGVsZXRlKGludGVybmFsUmVuZGVyVGFzayk7XG5cdCAgICAgIGlmICh0aGlzLl9tYXliZUNsZWFudXBBZnRlclJlbmRlciB8fCBpbnRlbnRQcmludCkge1xuXHQgICAgICAgIHRoaXMuI3BlbmRpbmdDbGVhbnVwID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLiN0cnlDbGVhbnVwKCFpbnRlbnRQcmludCk7XG5cdCAgICAgIGlmIChlcnJvcikge1xuXHQgICAgICAgIGludGVybmFsUmVuZGVyVGFzay5jYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG5cdCAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuXHQgICAgICAgICAgaW50ZW50U3RhdGUsXG5cdCAgICAgICAgICByZWFzb246IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihlcnJvcilcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fc3RhdHM/LnRpbWVFbmQoXCJSZW5kZXJpbmdcIik7XG5cdCAgICAgIHRoaXMuX3N0YXRzPy50aW1lRW5kKFwiT3ZlcmFsbFwiKTtcblx0ICAgIH07XG5cdCAgICBjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgPSBuZXcgSW50ZXJuYWxSZW5kZXJUYXNrKHtcblx0ICAgICAgY2FsbGJhY2s6IGNvbXBsZXRlLFxuXHQgICAgICBwYXJhbXM6IHtcblx0ICAgICAgICBjYW52YXNDb250ZXh0LFxuXHQgICAgICAgIHZpZXdwb3J0LFxuXHQgICAgICAgIHRyYW5zZm9ybSxcblx0ICAgICAgICBiYWNrZ3JvdW5kXG5cdCAgICAgIH0sXG5cdCAgICAgIG9ianM6IHRoaXMub2Jqcyxcblx0ICAgICAgY29tbW9uT2JqczogdGhpcy5jb21tb25PYmpzLFxuXHQgICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwLFxuXHQgICAgICBvcGVyYXRvckxpc3Q6IGludGVudFN0YXRlLm9wZXJhdG9yTGlzdCxcblx0ICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5kZXgsXG5cdCAgICAgIGNhbnZhc0ZhY3Rvcnk6IHRoaXMuX3RyYW5zcG9ydC5jYW52YXNGYWN0b3J5LFxuXHQgICAgICBmaWx0ZXJGYWN0b3J5OiB0aGlzLl90cmFuc3BvcnQuZmlsdGVyRmFjdG9yeSxcblx0ICAgICAgdXNlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOiAhaW50ZW50UHJpbnQsXG5cdCAgICAgIHBkZkJ1ZzogdGhpcy5fcGRmQnVnLFxuXHQgICAgICBwYWdlQ29sb3JzXG5cdCAgICB9KTtcblx0ICAgIChpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcyB8fD0gbmV3IFNldCgpKS5hZGQoaW50ZXJuYWxSZW5kZXJUYXNrKTtcblx0ICAgIGNvbnN0IHJlbmRlclRhc2sgPSBpbnRlcm5hbFJlbmRlclRhc2sudGFzaztcblx0ICAgIFByb21pc2UuYWxsKFtpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnByb21pc2UsIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2VdKS50aGVuKChbdHJhbnNwYXJlbmN5LCBvcHRpb25hbENvbnRlbnRDb25maWddKSA9PiB7XG5cdCAgICAgIGlmICh0aGlzLiNwZW5kaW5nQ2xlYW51cCkge1xuXHQgICAgICAgIGNvbXBsZXRlKCk7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiUmVuZGVyaW5nXCIpO1xuXHQgICAgICBpbnRlcm5hbFJlbmRlclRhc2suaW5pdGlhbGl6ZUdyYXBoaWNzKHtcblx0ICAgICAgICB0cmFuc3BhcmVuY3ksXG5cdCAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnXG5cdCAgICAgIH0pO1xuXHQgICAgICBpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuXHQgICAgfSkuY2F0Y2goY29tcGxldGUpO1xuXHQgICAgcmV0dXJuIHJlbmRlclRhc2s7XG5cdCAgfVxuXHQgIGdldE9wZXJhdG9yTGlzdCh7XG5cdCAgICBpbnRlbnQgPSBcImRpc3BsYXlcIixcblx0ICAgIGFubm90YXRpb25Nb2RlID0gX3V0aWwuQW5ub3RhdGlvbk1vZGUuRU5BQkxFLFxuXHQgICAgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IG51bGxcblx0ICB9ID0ge30pIHtcblx0ICAgIGZ1bmN0aW9uIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7XG5cdCAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rKSB7XG5cdCAgICAgICAgaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkucmVzb2x2ZShpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QpO1xuXHQgICAgICAgIGludGVudFN0YXRlLnJlbmRlclRhc2tzLmRlbGV0ZShvcExpc3RUYXNrKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgY29uc3QgaW50ZW50QXJncyA9IHRoaXMuX3RyYW5zcG9ydC5nZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50LCBhbm5vdGF0aW9uTW9kZSwgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSwgdHJ1ZSk7XG5cdCAgICBsZXQgaW50ZW50U3RhdGUgPSB0aGlzLl9pbnRlbnRTdGF0ZXMuZ2V0KGludGVudEFyZ3MuY2FjaGVLZXkpO1xuXHQgICAgaWYgKCFpbnRlbnRTdGF0ZSkge1xuXHQgICAgICBpbnRlbnRTdGF0ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5zZXQoaW50ZW50QXJncy5jYWNoZUtleSwgaW50ZW50U3RhdGUpO1xuXHQgICAgfVxuXHQgICAgbGV0IG9wTGlzdFRhc2s7XG5cdCAgICBpZiAoIWludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG5cdCAgICAgIG9wTGlzdFRhc2sgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgICAgICBvcExpc3RUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQgPSBvcGVyYXRvckxpc3RDaGFuZ2VkO1xuXHQgICAgICBpbnRlbnRTdGF0ZS5vcExpc3RSZWFkQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgICAoaW50ZW50U3RhdGUucmVuZGVyVGFza3MgfHw9IG5ldyBTZXQoKSkuYWRkKG9wTGlzdFRhc2spO1xuXHQgICAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QgPSB7XG5cdCAgICAgICAgZm5BcnJheTogW10sXG5cdCAgICAgICAgYXJnc0FycmF5OiBbXSxcblx0ICAgICAgICBsYXN0Q2h1bms6IGZhbHNlLFxuXHQgICAgICAgIHNlcGFyYXRlQW5ub3RzOiBudWxsXG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuX3N0YXRzPy50aW1lKFwiUGFnZSBSZXF1ZXN0XCIpO1xuXHQgICAgICB0aGlzLl9wdW1wT3BlcmF0b3JMaXN0KGludGVudEFyZ3MpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIHN0cmVhbVRleHRDb250ZW50KHtcblx0ICAgIGluY2x1ZGVNYXJrZWRDb250ZW50ID0gZmFsc2UsXG5cdCAgICBkaXNhYmxlTm9ybWFsaXphdGlvbiA9IGZhbHNlXG5cdCAgfSA9IHt9KSB7XG5cdCAgICBjb25zdCBURVhUX0NPTlRFTlRfQ0hVTktfU0laRSA9IDEwMDtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRUZXh0Q29udGVudFwiLCB7XG5cdCAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZGV4LFxuXHQgICAgICBpbmNsdWRlTWFya2VkQ29udGVudDogaW5jbHVkZU1hcmtlZENvbnRlbnQgPT09IHRydWUsXG5cdCAgICAgIGRpc2FibGVOb3JtYWxpemF0aW9uOiBkaXNhYmxlTm9ybWFsaXphdGlvbiA9PT0gdHJ1ZVxuXHQgICAgfSwge1xuXHQgICAgICBoaWdoV2F0ZXJNYXJrOiBURVhUX0NPTlRFTlRfQ0hVTktfU0laRSxcblx0ICAgICAgc2l6ZSh0ZXh0Q29udGVudCkge1xuXHQgICAgICAgIHJldHVybiB0ZXh0Q29udGVudC5pdGVtcy5sZW5ndGg7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXRUZXh0Q29udGVudChwYXJhbXMgPSB7fSkge1xuXHQgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5faHRtbEZvclhmYSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5nZXRYZmEoKS50aGVuKHhmYSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIF94ZmFfdGV4dC5YZmFUZXh0LnRleHRDb250ZW50KHhmYSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLnN0cmVhbVRleHRDb250ZW50KHBhcmFtcyk7XG5cdCAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHQgICAgICBmdW5jdGlvbiBwdW1wKCkge1xuXHQgICAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoe1xuXHQgICAgICAgICAgdmFsdWUsXG5cdCAgICAgICAgICBkb25lXG5cdCAgICAgICAgfSkge1xuXHQgICAgICAgICAgaWYgKGRvbmUpIHtcblx0ICAgICAgICAgICAgcmVzb2x2ZSh0ZXh0Q29udGVudCk7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIE9iamVjdC5hc3NpZ24odGV4dENvbnRlbnQuc3R5bGVzLCB2YWx1ZS5zdHlsZXMpO1xuXHQgICAgICAgICAgdGV4dENvbnRlbnQuaXRlbXMucHVzaCguLi52YWx1ZS5pdGVtcyk7XG5cdCAgICAgICAgICBwdW1wKCk7XG5cdCAgICAgICAgfSwgcmVqZWN0KTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZVN0cmVhbS5nZXRSZWFkZXIoKTtcblx0ICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSB7XG5cdCAgICAgICAgaXRlbXM6IFtdLFxuXHQgICAgICAgIHN0eWxlczogT2JqZWN0LmNyZWF0ZShudWxsKVxuXHQgICAgICB9O1xuXHQgICAgICBwdW1wKCk7XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0U3RydWN0VHJlZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQuZ2V0U3RydWN0VHJlZSh0aGlzLl9wYWdlSW5kZXgpO1xuXHQgIH1cblx0ICBfZGVzdHJveSgpIHtcblx0ICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcblx0ICAgIGNvbnN0IHdhaXRPbiA9IFtdO1xuXHQgICAgZm9yIChjb25zdCBpbnRlbnRTdGF0ZSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMudmFsdWVzKCkpIHtcblx0ICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuXHQgICAgICAgIGludGVudFN0YXRlLFxuXHQgICAgICAgIHJlYXNvbjogbmV3IEVycm9yKFwiUGFnZSB3YXMgZGVzdHJveWVkLlwiKSxcblx0ICAgICAgICBmb3JjZTogdHJ1ZVxuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5KSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgZm9yIChjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgb2YgaW50ZW50U3RhdGUucmVuZGVyVGFza3MpIHtcblx0ICAgICAgICB3YWl0T24ucHVzaChpbnRlcm5hbFJlbmRlclRhc2suY29tcGxldGVkKTtcblx0ICAgICAgICBpbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMub2Jqcy5jbGVhcigpO1xuXHQgICAgdGhpcy4jcGVuZGluZ0NsZWFudXAgPSBmYWxzZTtcblx0ICAgIHRoaXMuI2Fib3J0RGVsYXllZENsZWFudXAoKTtcblx0ICAgIHJldHVybiBQcm9taXNlLmFsbCh3YWl0T24pO1xuXHQgIH1cblx0ICBjbGVhbnVwKHJlc2V0U3RhdHMgPSBmYWxzZSkge1xuXHQgICAgdGhpcy4jcGVuZGluZ0NsZWFudXAgPSB0cnVlO1xuXHQgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuI3RyeUNsZWFudXAoZmFsc2UpO1xuXHQgICAgaWYgKHJlc2V0U3RhdHMgJiYgc3VjY2Vzcykge1xuXHQgICAgICB0aGlzLl9zdGF0cyAmJj0gbmV3IF9kaXNwbGF5X3V0aWxzLlN0YXRUaW1lcigpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHN1Y2Nlc3M7XG5cdCAgfVxuXHQgICN0cnlDbGVhbnVwKGRlbGF5ZWQgPSBmYWxzZSkge1xuXHQgICAgdGhpcy4jYWJvcnREZWxheWVkQ2xlYW51cCgpO1xuXHQgICAgaWYgKCF0aGlzLiNwZW5kaW5nQ2xlYW51cCkge1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgICBpZiAoZGVsYXllZCkge1xuXHQgICAgICB0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0ICAgICAgICB0aGlzLiNkZWxheWVkQ2xlYW51cFRpbWVvdXQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuI3RyeUNsZWFudXAoZmFsc2UpO1xuXHQgICAgICB9LCBERUxBWUVEX0NMRUFOVVBfVElNRU9VVCk7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3Qge1xuXHQgICAgICByZW5kZXJUYXNrcyxcblx0ICAgICAgb3BlcmF0b3JMaXN0XG5cdCAgICB9IG9mIHRoaXMuX2ludGVudFN0YXRlcy52YWx1ZXMoKSkge1xuXHQgICAgICBpZiAocmVuZGVyVGFza3Muc2l6ZSA+IDAgfHwgIW9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuX2ludGVudFN0YXRlcy5jbGVhcigpO1xuXHQgICAgdGhpcy5vYmpzLmNsZWFyKCk7XG5cdCAgICB0aGlzLiNwZW5kaW5nQ2xlYW51cCA9IGZhbHNlO1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHQgICNhYm9ydERlbGF5ZWRDbGVhbnVwKCkge1xuXHQgICAgaWYgKHRoaXMuI2RlbGF5ZWRDbGVhbnVwVGltZW91dCkge1xuXHQgICAgICBjbGVhclRpbWVvdXQodGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0KTtcblx0ICAgICAgdGhpcy4jZGVsYXllZENsZWFudXBUaW1lb3V0ID0gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cdCAgX3N0YXJ0UmVuZGVyUGFnZSh0cmFuc3BhcmVuY3ksIGNhY2hlS2V5KSB7XG5cdCAgICBjb25zdCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoY2FjaGVLZXkpO1xuXHQgICAgaWYgKCFpbnRlbnRTdGF0ZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLl9zdGF0cz8udGltZUVuZChcIlBhZ2UgUmVxdWVzdFwiKTtcblx0ICAgIGludGVudFN0YXRlLmRpc3BsYXlSZWFkeUNhcGFiaWxpdHk/LnJlc29sdmUodHJhbnNwYXJlbmN5KTtcblx0ICB9XG5cdCAgX3JlbmRlclBhZ2VDaHVuayhvcGVyYXRvckxpc3RDaHVuaywgaW50ZW50U3RhdGUpIHtcblx0ICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IG9wZXJhdG9yTGlzdENodW5rLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0ICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LmZuQXJyYXkucHVzaChvcGVyYXRvckxpc3RDaHVuay5mbkFycmF5W2ldKTtcblx0ICAgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5wdXNoKG9wZXJhdG9yTGlzdENodW5rLmFyZ3NBcnJheVtpXSk7XG5cdCAgICB9XG5cdCAgICBpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QubGFzdENodW5rID0gb3BlcmF0b3JMaXN0Q2h1bmsubGFzdENodW5rO1xuXHQgICAgaW50ZW50U3RhdGUub3BlcmF0b3JMaXN0LnNlcGFyYXRlQW5ub3RzID0gb3BlcmF0b3JMaXN0Q2h1bmsuc2VwYXJhdGVBbm5vdHM7XG5cdCAgICBmb3IgKGNvbnN0IGludGVybmFsUmVuZGVyVGFzayBvZiBpbnRlbnRTdGF0ZS5yZW5kZXJUYXNrcykge1xuXHQgICAgICBpbnRlcm5hbFJlbmRlclRhc2sub3BlcmF0b3JMaXN0Q2hhbmdlZCgpO1xuXHQgICAgfVxuXHQgICAgaWYgKG9wZXJhdG9yTGlzdENodW5rLmxhc3RDaHVuaykge1xuXHQgICAgICB0aGlzLiN0cnlDbGVhbnVwKHRydWUpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBfcHVtcE9wZXJhdG9yTGlzdCh7XG5cdCAgICByZW5kZXJpbmdJbnRlbnQsXG5cdCAgICBjYWNoZUtleSxcblx0ICAgIGFubm90YXRpb25TdG9yYWdlTWFwXG5cdCAgfSkge1xuXHQgICAgY29uc3QgcmVhZGFibGVTdHJlYW0gPSB0aGlzLl90cmFuc3BvcnQubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhTdHJlYW0oXCJHZXRPcGVyYXRvckxpc3RcIiwge1xuXHQgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmRleCxcblx0ICAgICAgaW50ZW50OiByZW5kZXJpbmdJbnRlbnQsXG5cdCAgICAgIGNhY2hlS2V5LFxuXHQgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogYW5ub3RhdGlvblN0b3JhZ2VNYXBcblx0ICAgIH0pO1xuXHQgICAgY29uc3QgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG5cdCAgICBjb25zdCBpbnRlbnRTdGF0ZSA9IHRoaXMuX2ludGVudFN0YXRlcy5nZXQoY2FjaGVLZXkpO1xuXHQgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyID0gcmVhZGVyO1xuXHQgICAgY29uc3QgcHVtcCA9ICgpID0+IHtcblx0ICAgICAgcmVhZGVyLnJlYWQoKS50aGVuKCh7XG5cdCAgICAgICAgdmFsdWUsXG5cdCAgICAgICAgZG9uZVxuXHQgICAgICB9KSA9PiB7XG5cdCAgICAgICAgaWYgKGRvbmUpIHtcblx0ICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlciA9IG51bGw7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX3JlbmRlclBhZ2VDaHVuayh2YWx1ZSwgaW50ZW50U3RhdGUpO1xuXHQgICAgICAgIHB1bXAoKTtcblx0ICAgICAgfSwgcmVhc29uID0+IHtcblx0ICAgICAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuXHQgICAgICAgIGlmICh0aGlzLl90cmFuc3BvcnQuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChpbnRlbnRTdGF0ZS5vcGVyYXRvckxpc3QpIHtcblx0ICAgICAgICAgIGludGVudFN0YXRlLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmsgPSB0cnVlO1xuXHQgICAgICAgICAgZm9yIChjb25zdCBpbnRlcm5hbFJlbmRlclRhc2sgb2YgaW50ZW50U3RhdGUucmVuZGVyVGFza3MpIHtcblx0ICAgICAgICAgICAgaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdENoYW5nZWQoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuI3RyeUNsZWFudXAodHJ1ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5KSB7XG5cdCAgICAgICAgICBpbnRlbnRTdGF0ZS5kaXNwbGF5UmVhZHlDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoaW50ZW50U3RhdGUub3BMaXN0UmVhZENhcGFiaWxpdHkpIHtcblx0ICAgICAgICAgIGludGVudFN0YXRlLm9wTGlzdFJlYWRDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aHJvdyByZWFzb247XG5cdCAgICAgICAgfVxuXHQgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICBwdW1wKCk7XG5cdCAgfVxuXHQgIF9hYm9ydE9wZXJhdG9yTGlzdCh7XG5cdCAgICBpbnRlbnRTdGF0ZSxcblx0ICAgIHJlYXNvbixcblx0ICAgIGZvcmNlID0gZmFsc2Vcblx0ICB9KSB7XG5cdCAgICBpZiAoIWludGVudFN0YXRlLnN0cmVhbVJlYWRlcikge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCkge1xuXHQgICAgICBjbGVhclRpbWVvdXQoaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyQ2FuY2VsVGltZW91dCk7XG5cdCAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgaWYgKCFmb3JjZSkge1xuXHQgICAgICBpZiAoaW50ZW50U3RhdGUucmVuZGVyVGFza3Muc2l6ZSA+IDApIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbikge1xuXHQgICAgICAgIGxldCBkZWxheSA9IFJFTkRFUklOR19DQU5DRUxMRURfVElNRU9VVDtcblx0ICAgICAgICBpZiAocmVhc29uLmV4dHJhRGVsYXkgPiAwICYmIHJlYXNvbi5leHRyYURlbGF5IDwgMTAwMCkge1xuXHQgICAgICAgICAgZGVsYXkgKz0gcmVhc29uLmV4dHJhRGVsYXk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0ICAgICAgICAgIGludGVudFN0YXRlLnN0cmVhbVJlYWRlckNhbmNlbFRpbWVvdXQgPSBudWxsO1xuXHQgICAgICAgICAgdGhpcy5fYWJvcnRPcGVyYXRvckxpc3Qoe1xuXHQgICAgICAgICAgICBpbnRlbnRTdGF0ZSxcblx0ICAgICAgICAgICAgcmVhc29uLFxuXHQgICAgICAgICAgICBmb3JjZTogdHJ1ZVxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSwgZGVsYXkpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaW50ZW50U3RhdGUuc3RyZWFtUmVhZGVyLmNhbmNlbChuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpKS5jYXRjaCgoKSA9PiB7fSk7XG5cdCAgICBpbnRlbnRTdGF0ZS5zdHJlYW1SZWFkZXIgPSBudWxsO1xuXHQgICAgaWYgKHRoaXMuX3RyYW5zcG9ydC5kZXN0cm95ZWQpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBbY3VyQ2FjaGVLZXksIGN1ckludGVudFN0YXRlXSBvZiB0aGlzLl9pbnRlbnRTdGF0ZXMpIHtcblx0ICAgICAgaWYgKGN1ckludGVudFN0YXRlID09PSBpbnRlbnRTdGF0ZSkge1xuXHQgICAgICAgIHRoaXMuX2ludGVudFN0YXRlcy5kZWxldGUoY3VyQ2FjaGVLZXkpO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLmNsZWFudXAoKTtcblx0ICB9XG5cdCAgZ2V0IHN0YXRzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3N0YXRzO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlBERlBhZ2VQcm94eSA9IFBERlBhZ2VQcm94eTtcblx0Y2xhc3MgTG9vcGJhY2tQb3J0IHtcblx0ICAjbGlzdGVuZXJzID0gbmV3IFNldCgpO1xuXHQgICNkZWZlcnJlZCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHQgIHBvc3RNZXNzYWdlKG9iaiwgdHJhbnNmZXIpIHtcblx0ICAgIGNvbnN0IGV2ZW50ID0ge1xuXHQgICAgICBkYXRhOiBzdHJ1Y3R1cmVkQ2xvbmUob2JqLCB0cmFuc2ZlciA/IHtcblx0ICAgICAgICB0cmFuc2ZlclxuXHQgICAgICB9IDogbnVsbClcblx0ICAgIH07XG5cdCAgICB0aGlzLiNkZWZlcnJlZC50aGVuKCgpID0+IHtcblx0ICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLiNsaXN0ZW5lcnMpIHtcblx0ICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGFkZEV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpIHtcblx0ICAgIHRoaXMuI2xpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuXHQgIH1cblx0ICByZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG5cdCAgICB0aGlzLiNsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcblx0ICB9XG5cdCAgdGVybWluYXRlKCkge1xuXHQgICAgdGhpcy4jbGlzdGVuZXJzLmNsZWFyKCk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuTG9vcGJhY2tQb3J0ID0gTG9vcGJhY2tQb3J0O1xuXHRjb25zdCBQREZXb3JrZXJVdGlsID0ge1xuXHQgIGlzV29ya2VyRGlzYWJsZWQ6IGZhbHNlLFxuXHQgIGZhbGxiYWNrV29ya2VyU3JjOiBudWxsLFxuXHQgIGZha2VXb3JrZXJJZDogMFxuXHR9O1xuXHRleHBvcnRzLlBERldvcmtlclV0aWwgPSBQREZXb3JrZXJVdGlsO1xuXHR7XG5cdCAgaWYgKF9pc19ub2RlLmlzTm9kZUpTICYmIHR5cGVvZiBjb21tb25qc1JlcXVpcmUgPT09IFwiZnVuY3Rpb25cIikge1xuXHQgICAgUERGV29ya2VyVXRpbC5pc1dvcmtlckRpc2FibGVkID0gdHJ1ZTtcblx0ICAgIFBERldvcmtlclV0aWwuZmFsbGJhY2tXb3JrZXJTcmMgPSBcIi4vcGRmLndvcmtlci5qc1wiO1xuXHQgIH0gZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcIm9iamVjdFwiKSB7XG5cdCAgICBjb25zdCBwZGZqc0ZpbGVQYXRoID0gZG9jdW1lbnQ/LmN1cnJlbnRTY3JpcHQ/LnNyYztcblx0ICAgIGlmIChwZGZqc0ZpbGVQYXRoKSB7XG5cdCAgICAgIFBERldvcmtlclV0aWwuZmFsbGJhY2tXb3JrZXJTcmMgPSBwZGZqc0ZpbGVQYXRoLnJlcGxhY2UoLyhcXC4oPzptaW5cXC4pP2pzKShcXD8uKik/JC9pLCBcIi53b3JrZXIkMSQyXCIpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBQREZXb3JrZXJVdGlsLmlzU2FtZU9yaWdpbiA9IGZ1bmN0aW9uIChiYXNlVXJsLCBvdGhlclVybCkge1xuXHQgICAgbGV0IGJhc2U7XG5cdCAgICB0cnkge1xuXHQgICAgICBiYXNlID0gbmV3IFVSTChiYXNlVXJsKTtcblx0ICAgICAgaWYgKCFiYXNlLm9yaWdpbiB8fCBiYXNlLm9yaWdpbiA9PT0gXCJudWxsXCIpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgb3RoZXIgPSBuZXcgVVJMKG90aGVyVXJsLCBiYXNlKTtcblx0ICAgIHJldHVybiBiYXNlLm9yaWdpbiA9PT0gb3RoZXIub3JpZ2luO1xuXHQgIH07XG5cdCAgUERGV29ya2VyVXRpbC5jcmVhdGVDRE5XcmFwcGVyID0gZnVuY3Rpb24gKHVybCkge1xuXHQgICAgY29uc3Qgd3JhcHBlciA9IGBpbXBvcnRTY3JpcHRzKFwiJHt1cmx9XCIpO2A7XG5cdCAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbd3JhcHBlcl0pKTtcblx0ICB9O1xuXHR9XG5cdGNsYXNzIFBERldvcmtlciB7XG5cdCAgc3RhdGljICN3b3JrZXJQb3J0cyA9IG5ldyBXZWFrTWFwKCk7XG5cdCAgY29uc3RydWN0b3Ioe1xuXHQgICAgbmFtZSA9IG51bGwsXG5cdCAgICBwb3J0ID0gbnVsbCxcblx0ICAgIHZlcmJvc2l0eSA9ICgwLCBfdXRpbC5nZXRWZXJib3NpdHlMZXZlbCkoKVxuXHQgIH0gPSB7fSkge1xuXHQgICAgaWYgKHBvcnQgJiYgUERGV29ya2VyLiN3b3JrZXJQb3J0cy5oYXMocG9ydCkpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVzZSBtb3JlIHRoYW4gb25lIFBERldvcmtlciBwZXIgcG9ydC5cIik7XG5cdCAgICB9XG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblx0ICAgIHRoaXMudmVyYm9zaXR5ID0gdmVyYm9zaXR5O1xuXHQgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl9wb3J0ID0gbnVsbDtcblx0ICAgIHRoaXMuX3dlYldvcmtlciA9IG51bGw7XG5cdCAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG51bGw7XG5cdCAgICBpZiAocG9ydCkge1xuXHQgICAgICBQREZXb3JrZXIuI3dvcmtlclBvcnRzLnNldChwb3J0LCB0aGlzKTtcblx0ICAgICAgdGhpcy5faW5pdGlhbGl6ZUZyb21Qb3J0KHBvcnQpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cdCAgfVxuXHQgIGdldCBwcm9taXNlKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBnZXQgcG9ydCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9wb3J0O1xuXHQgIH1cblx0ICBnZXQgbWVzc2FnZUhhbmRsZXIoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fbWVzc2FnZUhhbmRsZXI7XG5cdCAgfVxuXHQgIF9pbml0aWFsaXplRnJvbVBvcnQocG9ydCkge1xuXHQgICAgdGhpcy5fcG9ydCA9IHBvcnQ7XG5cdCAgICB0aGlzLl9tZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKFwibWFpblwiLCBcIndvcmtlclwiLCBwb3J0KTtcblx0ICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLm9uKFwicmVhZHlcIiwgZnVuY3Rpb24gKCkge30pO1xuXHQgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLnNlbmQoXCJjb25maWd1cmVcIiwge1xuXHQgICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgX2luaXRpYWxpemUoKSB7XG5cdCAgICBpZiAoIVBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCAmJiAhUERGV29ya2VyLl9tYWluVGhyZWFkV29ya2VyTWVzc2FnZUhhbmRsZXIpIHtcblx0ICAgICAgbGV0IHtcblx0ICAgICAgICB3b3JrZXJTcmNcblx0ICAgICAgfSA9IFBERldvcmtlcjtcblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICBpZiAoIVBERldvcmtlclV0aWwuaXNTYW1lT3JpZ2luKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCB3b3JrZXJTcmMpKSB7XG5cdCAgICAgICAgICB3b3JrZXJTcmMgPSBQREZXb3JrZXJVdGlsLmNyZWF0ZUNETldyYXBwZXIobmV3IFVSTCh3b3JrZXJTcmMsIHdpbmRvdy5sb2NhdGlvbikuaHJlZik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyU3JjKTtcblx0ICAgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKFwibWFpblwiLCBcIndvcmtlclwiLCB3b3JrZXIpO1xuXHQgICAgICAgIGNvbnN0IHRlcm1pbmF0ZUVhcmx5ID0gKCkgPT4ge1xuXHQgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbldvcmtlckVycm9yKTtcblx0ICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTtcblx0ICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcblx0ICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkXCIpKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3Qgb25Xb3JrZXJFcnJvciA9ICgpID0+IHtcblx0ICAgICAgICAgIGlmICghdGhpcy5fd2ViV29ya2VyKSB7XG5cdCAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuXHQgICAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwidGVzdFwiLCBkYXRhID0+IHtcblx0ICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25Xb3JrZXJFcnJvcik7XG5cdCAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcblx0ICAgICAgICAgICAgdGVybWluYXRlRWFybHkoKTtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKGRhdGEpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjtcblx0ICAgICAgICAgICAgdGhpcy5fcG9ydCA9IHdvcmtlcjtcblx0ICAgICAgICAgICAgdGhpcy5fd2ViV29ya2VyID0gd29ya2VyO1xuXHQgICAgICAgICAgICB0aGlzLl9yZWFkeUNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgICAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwiY29uZmlndXJlXCIsIHtcblx0ICAgICAgICAgICAgICB2ZXJib3NpdHk6IHRoaXMudmVyYm9zaXR5XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5fc2V0dXBGYWtlV29ya2VyKCk7XG5cdCAgICAgICAgICAgIG1lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTtcblx0ICAgICAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwicmVhZHlcIiwgZGF0YSA9PiB7XG5cdCAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uV29ya2VyRXJyb3IpO1xuXHQgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgICAgIHRlcm1pbmF0ZUVhcmx5KCk7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIHNlbmRUZXN0KCk7XG5cdCAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGNvbnN0IHNlbmRUZXN0ID0gKCkgPT4ge1xuXHQgICAgICAgICAgY29uc3QgdGVzdE9iaiA9IG5ldyBVaW50OEFycmF5KCk7XG5cdCAgICAgICAgICBtZXNzYWdlSGFuZGxlci5zZW5kKFwidGVzdFwiLCB0ZXN0T2JqLCBbdGVzdE9iai5idWZmZXJdKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHNlbmRUZXN0KCk7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgKDAsIF91dGlsLmluZm8pKFwiVGhlIHdvcmtlciBoYXMgYmVlbiBkaXNhYmxlZC5cIik7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuX3NldHVwRmFrZVdvcmtlcigpO1xuXHQgIH1cblx0ICBfc2V0dXBGYWtlV29ya2VyKCkge1xuXHQgICAgaWYgKCFQREZXb3JrZXJVdGlsLmlzV29ya2VyRGlzYWJsZWQpIHtcblx0ICAgICAgKDAsIF91dGlsLndhcm4pKFwiU2V0dGluZyB1cCBmYWtlIHdvcmtlci5cIik7XG5cdCAgICAgIFBERldvcmtlclV0aWwuaXNXb3JrZXJEaXNhYmxlZCA9IHRydWU7XG5cdCAgICB9XG5cdCAgICBQREZXb3JrZXIuX3NldHVwRmFrZVdvcmtlckdsb2JhbC50aGVuKFdvcmtlck1lc3NhZ2VIYW5kbGVyID0+IHtcblx0ICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlamVjdChuZXcgRXJyb3IoXCJXb3JrZXIgd2FzIGRlc3Ryb3llZFwiKSk7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IHBvcnQgPSBuZXcgTG9vcGJhY2tQb3J0KCk7XG5cdCAgICAgIHRoaXMuX3BvcnQgPSBwb3J0O1xuXHQgICAgICBjb25zdCBpZCA9IGBmYWtlJHtQREZXb3JrZXJVdGlsLmZha2VXb3JrZXJJZCsrfWA7XG5cdCAgICAgIGNvbnN0IHdvcmtlckhhbmRsZXIgPSBuZXcgX21lc3NhZ2VfaGFuZGxlci5NZXNzYWdlSGFuZGxlcihpZCArIFwiX3dvcmtlclwiLCBpZCwgcG9ydCk7XG5cdCAgICAgIFdvcmtlck1lc3NhZ2VIYW5kbGVyLnNldHVwKHdvcmtlckhhbmRsZXIsIHBvcnQpO1xuXHQgICAgICBjb25zdCBtZXNzYWdlSGFuZGxlciA9IG5ldyBfbWVzc2FnZV9oYW5kbGVyLk1lc3NhZ2VIYW5kbGVyKGlkLCBpZCArIFwiX3dvcmtlclwiLCBwb3J0KTtcblx0ICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBtZXNzYWdlSGFuZGxlcjtcblx0ICAgICAgdGhpcy5fcmVhZHlDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgICAgbWVzc2FnZUhhbmRsZXIuc2VuZChcImNvbmZpZ3VyZVwiLCB7XG5cdCAgICAgICAgdmVyYm9zaXR5OiB0aGlzLnZlcmJvc2l0eVxuXHQgICAgICB9KTtcblx0ICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG5cdCAgICAgIHRoaXMuX3JlYWR5Q2FwYWJpbGl0eS5yZWplY3QobmV3IEVycm9yKGBTZXR0aW5nIHVwIGZha2Ugd29ya2VyIGZhaWxlZDogXCIke3JlYXNvbi5tZXNzYWdlfVwiLmApKTtcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBkZXN0cm95KCkge1xuXHQgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuX3dlYldvcmtlcikge1xuXHQgICAgICB0aGlzLl93ZWJXb3JrZXIudGVybWluYXRlKCk7XG5cdCAgICAgIHRoaXMuX3dlYldvcmtlciA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBQREZXb3JrZXIuI3dvcmtlclBvcnRzLmRlbGV0ZSh0aGlzLl9wb3J0KTtcblx0ICAgIHRoaXMuX3BvcnQgPSBudWxsO1xuXHQgICAgaWYgKHRoaXMuX21lc3NhZ2VIYW5kbGVyKSB7XG5cdCAgICAgIHRoaXMuX21lc3NhZ2VIYW5kbGVyLmRlc3Ryb3koKTtcblx0ICAgICAgdGhpcy5fbWVzc2FnZUhhbmRsZXIgPSBudWxsO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzdGF0aWMgZnJvbVBvcnQocGFyYW1zKSB7XG5cdCAgICBpZiAoIXBhcmFtcz8ucG9ydCkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQREZXb3JrZXIuZnJvbVBvcnQgLSBpbnZhbGlkIG1ldGhvZCBzaWduYXR1cmUuXCIpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuI3dvcmtlclBvcnRzLmhhcyhwYXJhbXMucG9ydCkpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuI3dvcmtlclBvcnRzLmdldChwYXJhbXMucG9ydCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gbmV3IFBERldvcmtlcihwYXJhbXMpO1xuXHQgIH1cblx0ICBzdGF0aWMgZ2V0IHdvcmtlclNyYygpIHtcblx0ICAgIGlmIChfd29ya2VyX29wdGlvbnMuR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMpIHtcblx0ICAgICAgcmV0dXJuIF93b3JrZXJfb3B0aW9ucy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYztcblx0ICAgIH1cblx0ICAgIGlmIChQREZXb3JrZXJVdGlsLmZhbGxiYWNrV29ya2VyU3JjICE9PSBudWxsKSB7XG5cdCAgICAgIGlmICghX2lzX25vZGUuaXNOb2RlSlMpIHtcblx0ICAgICAgICAoMCwgX2Rpc3BsYXlfdXRpbHMuZGVwcmVjYXRlZCkoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIFBERldvcmtlclV0aWwuZmFsbGJhY2tXb3JrZXJTcmM7XG5cdCAgICB9XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFwiR2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmNcIiBzcGVjaWZpZWQuJyk7XG5cdCAgfVxuXHQgIHN0YXRpYyBnZXQgX21haW5UaHJlYWRXb3JrZXJNZXNzYWdlSGFuZGxlcigpIHtcblx0ICAgIHRyeSB7XG5cdCAgICAgIHJldHVybiBnbG9iYWxUaGlzLnBkZmpzV29ya2VyPy5Xb3JrZXJNZXNzYWdlSGFuZGxlciB8fCBudWxsO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHN0YXRpYyBnZXQgX3NldHVwRmFrZVdvcmtlckdsb2JhbCgpIHtcblx0ICAgIGNvbnN0IGxvYWRlciA9IGFzeW5jICgpID0+IHtcblx0ICAgICAgY29uc3QgbWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyID0gdGhpcy5fbWFpblRocmVhZFdvcmtlck1lc3NhZ2VIYW5kbGVyO1xuXHQgICAgICBpZiAobWFpbldvcmtlck1lc3NhZ2VIYW5kbGVyKSB7XG5cdCAgICAgICAgcmV0dXJuIG1haW5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoX2lzX25vZGUuaXNOb2RlSlMgJiYgdHlwZW9mIGNvbW1vbmpzUmVxdWlyZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgICAgY29uc3Qgd29ya2VyID0gZXZhbChcInJlcXVpcmVcIikodGhpcy53b3JrZXJTcmMpO1xuXHQgICAgICAgIHJldHVybiB3b3JrZXIuV29ya2VyTWVzc2FnZUhhbmRsZXI7XG5cdCAgICAgIH1cblx0ICAgICAgYXdhaXQgKDAsIF9kaXNwbGF5X3V0aWxzLmxvYWRTY3JpcHQpKHRoaXMud29ya2VyU3JjKTtcblx0ICAgICAgcmV0dXJuIHdpbmRvdy5wZGZqc1dvcmtlci5Xb3JrZXJNZXNzYWdlSGFuZGxlcjtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJfc2V0dXBGYWtlV29ya2VyR2xvYmFsXCIsIGxvYWRlcigpKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5QREZXb3JrZXIgPSBQREZXb3JrZXI7XG5cdGNsYXNzIFdvcmtlclRyYW5zcG9ydCB7XG5cdCAgI21ldGhvZFByb21pc2VzID0gbmV3IE1hcCgpO1xuXHQgICNwYWdlQ2FjaGUgPSBuZXcgTWFwKCk7XG5cdCAgI3BhZ2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcblx0ICBjb25zdHJ1Y3RvcihtZXNzYWdlSGFuZGxlciwgbG9hZGluZ1Rhc2ssIG5ldHdvcmtTdHJlYW0sIHBhcmFtcywgZmFjdG9yeSkge1xuXHQgICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG1lc3NhZ2VIYW5kbGVyO1xuXHQgICAgdGhpcy5sb2FkaW5nVGFzayA9IGxvYWRpbmdUYXNrO1xuXHQgICAgdGhpcy5jb21tb25PYmpzID0gbmV3IFBERk9iamVjdHMoKTtcblx0ICAgIHRoaXMuZm9udExvYWRlciA9IG5ldyBfZm9udF9sb2FkZXIuRm9udExvYWRlcih7XG5cdCAgICAgIG93bmVyRG9jdW1lbnQ6IHBhcmFtcy5vd25lckRvY3VtZW50LFxuXHQgICAgICBzdHlsZUVsZW1lbnQ6IHBhcmFtcy5zdHlsZUVsZW1lbnRcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuXHQgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gZmFjdG9yeS5jYW52YXNGYWN0b3J5O1xuXHQgICAgdGhpcy5maWx0ZXJGYWN0b3J5ID0gZmFjdG9yeS5maWx0ZXJGYWN0b3J5O1xuXHQgICAgdGhpcy5jTWFwUmVhZGVyRmFjdG9yeSA9IGZhY3RvcnkuY01hcFJlYWRlckZhY3Rvcnk7XG5cdCAgICB0aGlzLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZmFjdG9yeS5zdGFuZGFyZEZvbnREYXRhRmFjdG9yeTtcblx0ICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cdCAgICB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5ID0gbnVsbDtcblx0ICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eSA9IG51bGw7XG5cdCAgICB0aGlzLl9uZXR3b3JrU3RyZWFtID0gbmV0d29ya1N0cmVhbTtcblx0ICAgIHRoaXMuX2Z1bGxSZWFkZXIgPSBudWxsO1xuXHQgICAgdGhpcy5fbGFzdFByb2dyZXNzID0gbnVsbDtcblx0ICAgIHRoaXMuZG93bmxvYWRJbmZvQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgdGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVyKCk7XG5cdCAgfVxuXHQgICNjYWNoZVNpbXBsZU1ldGhvZChuYW1lLCBkYXRhID0gbnVsbCkge1xuXHQgICAgY29uc3QgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI21ldGhvZFByb21pc2VzLmdldChuYW1lKTtcblx0ICAgIGlmIChjYWNoZWRQcm9taXNlKSB7XG5cdCAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKG5hbWUsIGRhdGEpO1xuXHQgICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuc2V0KG5hbWUsIHByb21pc2UpO1xuXHQgICAgcmV0dXJuIHByb21pc2U7XG5cdCAgfVxuXHQgIGdldCBhbm5vdGF0aW9uU3RvcmFnZSgpIHtcblx0ICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCBcImFubm90YXRpb25TdG9yYWdlXCIsIG5ldyBfYW5ub3RhdGlvbl9zdG9yYWdlLkFubm90YXRpb25TdG9yYWdlKCkpO1xuXHQgIH1cblx0ICBnZXRSZW5kZXJpbmdJbnRlbnQoaW50ZW50LCBhbm5vdGF0aW9uTW9kZSA9IF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRSwgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IG51bGwsIGlzT3BMaXN0ID0gZmFsc2UpIHtcblx0ICAgIGxldCByZW5kZXJpbmdJbnRlbnQgPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLkRJU1BMQVk7XG5cdCAgICBsZXQgYW5ub3RhdGlvbk1hcCA9IG51bGw7XG5cdCAgICBzd2l0Y2ggKGludGVudCkge1xuXHQgICAgICBjYXNlIFwiYW55XCI6XG5cdCAgICAgICAgcmVuZGVyaW5nSW50ZW50ID0gX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5BTlk7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgXCJkaXNwbGF5XCI6XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgXCJwcmludFwiOlxuXHQgICAgICAgIHJlbmRlcmluZ0ludGVudCA9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQ7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRSZW5kZXJpbmdJbnRlbnQgLSBpbnZhbGlkIGludGVudDogJHtpbnRlbnR9YCk7XG5cdCAgICB9XG5cdCAgICBzd2l0Y2ggKGFubm90YXRpb25Nb2RlKSB7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbk1vZGUuRElTQUJMRTpcblx0ICAgICAgICByZW5kZXJpbmdJbnRlbnQgKz0gX3V0aWwuUmVuZGVyaW5nSW50ZW50RmxhZy5BTk5PVEFUSU9OU19ESVNBQkxFO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25Nb2RlLkVOQUJMRTpcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uTW9kZS5FTkFCTEVfRk9STVM6XG5cdCAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfRk9STVM7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbk1vZGUuRU5BQkxFX1NUT1JBR0U6XG5cdCAgICAgICAgcmVuZGVyaW5nSW50ZW50ICs9IF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuQU5OT1RBVElPTlNfU1RPUkFHRTtcblx0ICAgICAgICBjb25zdCBhbm5vdGF0aW9uU3RvcmFnZSA9IHJlbmRlcmluZ0ludGVudCAmIF91dGlsLlJlbmRlcmluZ0ludGVudEZsYWcuUFJJTlQgJiYgcHJpbnRBbm5vdGF0aW9uU3RvcmFnZSBpbnN0YW5jZW9mIF9hbm5vdGF0aW9uX3N0b3JhZ2UuUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA/IHByaW50QW5ub3RhdGlvblN0b3JhZ2UgOiB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuXHQgICAgICAgIGFubm90YXRpb25NYXAgPSBhbm5vdGF0aW9uU3RvcmFnZS5zZXJpYWxpemFibGU7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRSZW5kZXJpbmdJbnRlbnQgLSBpbnZhbGlkIGFubm90YXRpb25Nb2RlOiAke2Fubm90YXRpb25Nb2RlfWApO1xuXHQgICAgfVxuXHQgICAgaWYgKGlzT3BMaXN0KSB7XG5cdCAgICAgIHJlbmRlcmluZ0ludGVudCArPSBfdXRpbC5SZW5kZXJpbmdJbnRlbnRGbGFnLk9QTElTVDtcblx0ICAgIH1cblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHJlbmRlcmluZ0ludGVudCxcblx0ICAgICAgY2FjaGVLZXk6IGAke3JlbmRlcmluZ0ludGVudH1fJHtfYW5ub3RhdGlvbl9zdG9yYWdlLkFubm90YXRpb25TdG9yYWdlLmdldEhhc2goYW5ub3RhdGlvbk1hcCl9YCxcblx0ICAgICAgYW5ub3RhdGlvblN0b3JhZ2VNYXA6IGFubm90YXRpb25NYXBcblx0ICAgIH07XG5cdCAgfVxuXHQgIGRlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5kZXN0cm95Q2FwYWJpbGl0eSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgICAgfVxuXHQgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuXHQgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgaWYgKHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eSkge1xuXHQgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkIGR1cmluZyBvblBhc3N3b3JkIGNhbGxiYWNrXCIpKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHdhaXRPbiA9IFtdO1xuXHQgICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMuI3BhZ2VDYWNoZS52YWx1ZXMoKSkge1xuXHQgICAgICB3YWl0T24ucHVzaChwYWdlLl9kZXN0cm95KCkpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jcGFnZUNhY2hlLmNsZWFyKCk7XG5cdCAgICB0aGlzLiNwYWdlUHJvbWlzZXMuY2xlYXIoKTtcblx0ICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KFwiYW5ub3RhdGlvblN0b3JhZ2VcIikpIHtcblx0ICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5yZXNldE1vZGlmaWVkKCk7XG5cdCAgICB9XG5cdCAgICBjb25zdCB0ZXJtaW5hdGVkID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJUZXJtaW5hdGVcIiwgbnVsbCk7XG5cdCAgICB3YWl0T24ucHVzaCh0ZXJtaW5hdGVkKTtcblx0ICAgIFByb21pc2UuYWxsKHdhaXRPbikudGhlbigoKSA9PiB7XG5cdCAgICAgIHRoaXMuY29tbW9uT2Jqcy5jbGVhcigpO1xuXHQgICAgICB0aGlzLmZvbnRMb2FkZXIuY2xlYXIoKTtcblx0ICAgICAgdGhpcy4jbWV0aG9kUHJvbWlzZXMuY2xlYXIoKTtcblx0ICAgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3koKTtcblx0ICAgICAgaWYgKHRoaXMuX25ldHdvcmtTdHJlYW0pIHtcblx0ICAgICAgICB0aGlzLl9uZXR3b3JrU3RyZWFtLmNhbmNlbEFsbFJlcXVlc3RzKG5ldyBfdXRpbC5BYm9ydEV4Y2VwdGlvbihcIldvcmtlciB3YXMgdGVybWluYXRlZC5cIikpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdCAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlci5kZXN0cm95KCk7XG5cdCAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IG51bGw7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICB9LCB0aGlzLmRlc3Ryb3lDYXBhYmlsaXR5LnJlamVjdCk7XG5cdCAgICByZXR1cm4gdGhpcy5kZXN0cm95Q2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBzZXR1cE1lc3NhZ2VIYW5kbGVyKCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBtZXNzYWdlSGFuZGxlcixcblx0ICAgICAgbG9hZGluZ1Rhc2tcblx0ICAgIH0gPSB0aGlzO1xuXHQgICAgbWVzc2FnZUhhbmRsZXIub24oXCJHZXRSZWFkZXJcIiwgKGRhdGEsIHNpbmspID0+IHtcblx0ICAgICAgKDAsIF91dGlsLmFzc2VydCkodGhpcy5fbmV0d29ya1N0cmVhbSwgXCJHZXRSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLlwiKTtcblx0ICAgICAgdGhpcy5fZnVsbFJlYWRlciA9IHRoaXMuX25ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlcigpO1xuXHQgICAgICB0aGlzLl9mdWxsUmVhZGVyLm9uUHJvZ3Jlc3MgPSBldnQgPT4ge1xuXHQgICAgICAgIHRoaXMuX2xhc3RQcm9ncmVzcyA9IHtcblx0ICAgICAgICAgIGxvYWRlZDogZXZ0LmxvYWRlZCxcblx0ICAgICAgICAgIHRvdGFsOiBldnQudG90YWxcblx0ICAgICAgICB9O1xuXHQgICAgICB9O1xuXHQgICAgICBzaW5rLm9uUHVsbCA9ICgpID0+IHtcblx0ICAgICAgICB0aGlzLl9mdWxsUmVhZGVyLnJlYWQoKS50aGVuKGZ1bmN0aW9uICh7XG5cdCAgICAgICAgICB2YWx1ZSxcblx0ICAgICAgICAgIGRvbmVcblx0ICAgICAgICB9KSB7XG5cdCAgICAgICAgICBpZiAoZG9uZSkge1xuXHQgICAgICAgICAgICBzaW5rLmNsb3NlKCk7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsIFwiR2V0UmVhZGVyIC0gZXhwZWN0ZWQgYW4gQXJyYXlCdWZmZXIuXCIpO1xuXHQgICAgICAgICAgc2luay5lbnF1ZXVlKG5ldyBVaW50OEFycmF5KHZhbHVlKSwgMSwgW3ZhbHVlXSk7XG5cdCAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHtcblx0ICAgICAgICAgIHNpbmsuZXJyb3IocmVhc29uKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfTtcblx0ICAgICAgc2luay5vbkNhbmNlbCA9IHJlYXNvbiA9PiB7XG5cdCAgICAgICAgdGhpcy5fZnVsbFJlYWRlci5jYW5jZWwocmVhc29uKTtcblx0ICAgICAgICBzaW5rLnJlYWR5LmNhdGNoKHJlYWR5UmVhc29uID0+IHtcblx0ICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aHJvdyByZWFkeVJlYXNvbjtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfTtcblx0ICAgIH0pO1xuXHQgICAgbWVzc2FnZUhhbmRsZXIub24oXCJSZWFkZXJIZWFkZXJzUmVhZHlcIiwgZGF0YSA9PiB7XG5cdCAgICAgIGNvbnN0IGhlYWRlcnNDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICAgIGNvbnN0IGZ1bGxSZWFkZXIgPSB0aGlzLl9mdWxsUmVhZGVyO1xuXHQgICAgICBmdWxsUmVhZGVyLmhlYWRlcnNSZWFkeS50aGVuKCgpID0+IHtcblx0ICAgICAgICBpZiAoIWZ1bGxSZWFkZXIuaXNTdHJlYW1pbmdTdXBwb3J0ZWQgfHwgIWZ1bGxSZWFkZXIuaXNSYW5nZVN1cHBvcnRlZCkge1xuXHQgICAgICAgICAgaWYgKHRoaXMuX2xhc3RQcm9ncmVzcykge1xuXHQgICAgICAgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4odGhpcy5fbGFzdFByb2dyZXNzKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGZ1bGxSZWFkZXIub25Qcm9ncmVzcyA9IGV2dCA9PiB7XG5cdCAgICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUHJvZ3Jlc3M/Lih7XG5cdCAgICAgICAgICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuXHQgICAgICAgICAgICAgIHRvdGFsOiBldnQudG90YWxcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBoZWFkZXJzQ2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICAgIGlzU3RyZWFtaW5nU3VwcG9ydGVkOiBmdWxsUmVhZGVyLmlzU3RyZWFtaW5nU3VwcG9ydGVkLFxuXHQgICAgICAgICAgaXNSYW5nZVN1cHBvcnRlZDogZnVsbFJlYWRlci5pc1JhbmdlU3VwcG9ydGVkLFxuXHQgICAgICAgICAgY29udGVudExlbmd0aDogZnVsbFJlYWRlci5jb250ZW50TGVuZ3RoXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0sIGhlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7XG5cdCAgICAgIHJldHVybiBoZWFkZXJzQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgICAgfSk7XG5cdCAgICBtZXNzYWdlSGFuZGxlci5vbihcIkdldFJhbmdlUmVhZGVyXCIsIChkYXRhLCBzaW5rKSA9PiB7XG5cdCAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHRoaXMuX25ldHdvcmtTdHJlYW0sIFwiR2V0UmFuZ2VSZWFkZXIgLSBubyBgSVBERlN0cmVhbWAgaW5zdGFuY2UgYXZhaWxhYmxlLlwiKTtcblx0ICAgICAgY29uc3QgcmFuZ2VSZWFkZXIgPSB0aGlzLl9uZXR3b3JrU3RyZWFtLmdldFJhbmdlUmVhZGVyKGRhdGEuYmVnaW4sIGRhdGEuZW5kKTtcblx0ICAgICAgaWYgKCFyYW5nZVJlYWRlcikge1xuXHQgICAgICAgIHNpbmsuY2xvc2UoKTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgc2luay5vblB1bGwgPSAoKSA9PiB7XG5cdCAgICAgICAgcmFuZ2VSZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKHtcblx0ICAgICAgICAgIHZhbHVlLFxuXHQgICAgICAgICAgZG9uZVxuXHQgICAgICAgIH0pIHtcblx0ICAgICAgICAgIGlmIChkb25lKSB7XG5cdCAgICAgICAgICAgIHNpbmsuY2xvc2UoKTtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgKDAsIF91dGlsLmFzc2VydCkodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciwgXCJHZXRSYW5nZVJlYWRlciAtIGV4cGVjdGVkIGFuIEFycmF5QnVmZmVyLlwiKTtcblx0ICAgICAgICAgIHNpbmsuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSksIDEsIFt2YWx1ZV0pO1xuXHQgICAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG5cdCAgICAgICAgICBzaW5rLmVycm9yKHJlYXNvbik7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH07XG5cdCAgICAgIHNpbmsub25DYW5jZWwgPSByZWFzb24gPT4ge1xuXHQgICAgICAgIHJhbmdlUmVhZGVyLmNhbmNlbChyZWFzb24pO1xuXHQgICAgICAgIHNpbmsucmVhZHkuY2F0Y2gocmVhZHlSZWFzb24gPT4ge1xuXHQgICAgICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRocm93IHJlYWR5UmVhc29uO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9O1xuXHQgICAgfSk7XG5cdCAgICBtZXNzYWdlSGFuZGxlci5vbihcIkdldERvY1wiLCAoe1xuXHQgICAgICBwZGZJbmZvXG5cdCAgICB9KSA9PiB7XG5cdCAgICAgIHRoaXMuX251bVBhZ2VzID0gcGRmSW5mby5udW1QYWdlcztcblx0ICAgICAgdGhpcy5faHRtbEZvclhmYSA9IHBkZkluZm8uaHRtbEZvclhmYTtcblx0ICAgICAgZGVsZXRlIHBkZkluZm8uaHRtbEZvclhmYTtcblx0ICAgICAgbG9hZGluZ1Rhc2suX2NhcGFiaWxpdHkucmVzb2x2ZShuZXcgUERGRG9jdW1lbnRQcm94eShwZGZJbmZvLCB0aGlzKSk7XG5cdCAgICB9KTtcblx0ICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRG9jRXhjZXB0aW9uXCIsIGZ1bmN0aW9uIChleCkge1xuXHQgICAgICBsZXQgcmVhc29uO1xuXHQgICAgICBzd2l0Y2ggKGV4Lm5hbWUpIHtcblx0ICAgICAgICBjYXNlIFwiUGFzc3dvcmRFeGNlcHRpb25cIjpcblx0ICAgICAgICAgIHJlYXNvbiA9IG5ldyBfdXRpbC5QYXNzd29yZEV4Y2VwdGlvbihleC5tZXNzYWdlLCBleC5jb2RlKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJJbnZhbGlkUERGRXhjZXB0aW9uXCI6XG5cdCAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuSW52YWxpZFBERkV4Y2VwdGlvbihleC5tZXNzYWdlKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJNaXNzaW5nUERGRXhjZXB0aW9uXCI6XG5cdCAgICAgICAgICByZWFzb24gPSBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbihleC5tZXNzYWdlKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJVbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb25cIjpcblx0ICAgICAgICAgIHJlYXNvbiA9IG5ldyBfdXRpbC5VbmV4cGVjdGVkUmVzcG9uc2VFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguc3RhdHVzKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcblx0ICAgICAgICAgIHJlYXNvbiA9IG5ldyBfdXRpbC5Vbmtub3duRXJyb3JFeGNlcHRpb24oZXgubWVzc2FnZSwgZXguZGV0YWlscyk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkRvY0V4Y2VwdGlvbiAtIGV4cGVjdGVkIGEgdmFsaWQgRXJyb3IuXCIpO1xuXHQgICAgICB9XG5cdCAgICAgIGxvYWRpbmdUYXNrLl9jYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuXHQgICAgfSk7XG5cdCAgICBtZXNzYWdlSGFuZGxlci5vbihcIlBhc3N3b3JkUmVxdWVzdFwiLCBleGNlcHRpb24gPT4ge1xuXHQgICAgICB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgICAgaWYgKGxvYWRpbmdUYXNrLm9uUGFzc3dvcmQpIHtcblx0ICAgICAgICBjb25zdCB1cGRhdGVQYXNzd29yZCA9IHBhc3N3b3JkID0+IHtcblx0ICAgICAgICAgIGlmIChwYXNzd29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QocGFzc3dvcmQpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgICAgICAgIHBhc3N3b3JkXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIGxvYWRpbmdUYXNrLm9uUGFzc3dvcmQodXBkYXRlUGFzc3dvcmQsIGV4Y2VwdGlvbi5jb2RlKTtcblx0ICAgICAgICB9IGNhdGNoIChleCkge1xuXHQgICAgICAgICAgdGhpcy5fcGFzc3dvcmRDYXBhYmlsaXR5LnJlamVjdChleCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuX3Bhc3N3b3JkQ2FwYWJpbGl0eS5yZWplY3QobmV3IF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlLCBleGNlcHRpb24uY29kZSkpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLl9wYXNzd29yZENhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgIH0pO1xuXHQgICAgbWVzc2FnZUhhbmRsZXIub24oXCJEYXRhTG9hZGVkXCIsIGRhdGEgPT4ge1xuXHQgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4oe1xuXHQgICAgICAgIGxvYWRlZDogZGF0YS5sZW5ndGgsXG5cdCAgICAgICAgdG90YWw6IGRhdGEubGVuZ3RoXG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLmRvd25sb2FkSW5mb0NhcGFiaWxpdHkucmVzb2x2ZShkYXRhKTtcblx0ICAgIH0pO1xuXHQgICAgbWVzc2FnZUhhbmRsZXIub24oXCJTdGFydFJlbmRlclBhZ2VcIiwgZGF0YSA9PiB7XG5cdCAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBwYWdlID0gdGhpcy4jcGFnZUNhY2hlLmdldChkYXRhLnBhZ2VJbmRleCk7XG5cdCAgICAgIHBhZ2UuX3N0YXJ0UmVuZGVyUGFnZShkYXRhLnRyYW5zcGFyZW5jeSwgZGF0YS5jYWNoZUtleSk7XG5cdCAgICB9KTtcblx0ICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiY29tbW9ub2JqXCIsIChbaWQsIHR5cGUsIGV4cG9ydGVkRGF0YV0pID0+IHtcblx0ICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLmNvbW1vbk9ianMuaGFzKGlkKSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBzd2l0Y2ggKHR5cGUpIHtcblx0ICAgICAgICBjYXNlIFwiRm9udFwiOlxuXHQgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5fcGFyYW1zO1xuXHQgICAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiBleHBvcnRlZERhdGEpIHtcblx0ICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRFcnJvciA9IGV4cG9ydGVkRGF0YS5lcnJvcjtcblx0ICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBFcnJvciBkdXJpbmcgZm9udCBsb2FkaW5nOiAke2V4cG9ydGVkRXJyb3J9YCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29tbW9uT2Jqcy5yZXNvbHZlKGlkLCBleHBvcnRlZEVycm9yKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBjb25zdCBpbnNwZWN0Rm9udCA9IHBhcmFtcy5wZGZCdWcgJiYgZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yPy5lbmFibGVkID8gKGZvbnQsIHVybCkgPT4gZ2xvYmFsVGhpcy5Gb250SW5zcGVjdG9yLmZvbnRBZGRlZChmb250LCB1cmwpIDogbnVsbDtcblx0ICAgICAgICAgIGNvbnN0IGZvbnQgPSBuZXcgX2ZvbnRfbG9hZGVyLkZvbnRGYWNlT2JqZWN0KGV4cG9ydGVkRGF0YSwge1xuXHQgICAgICAgICAgICBpc0V2YWxTdXBwb3J0ZWQ6IHBhcmFtcy5pc0V2YWxTdXBwb3J0ZWQsXG5cdCAgICAgICAgICAgIGRpc2FibGVGb250RmFjZTogcGFyYW1zLmRpc2FibGVGb250RmFjZSxcblx0ICAgICAgICAgICAgaWdub3JlRXJyb3JzOiBwYXJhbXMuaWdub3JlRXJyb3JzLFxuXHQgICAgICAgICAgICBpbnNwZWN0Rm9udFxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB0aGlzLmZvbnRMb2FkZXIuYmluZChmb250KS5jYXRjaChyZWFzb24gPT4ge1xuXHQgICAgICAgICAgICByZXR1cm4gbWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiRm9udEZhbGxiYWNrXCIsIHtcblx0ICAgICAgICAgICAgICBpZFxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuXHQgICAgICAgICAgICBpZiAoIXBhcmFtcy5mb250RXh0cmFQcm9wZXJ0aWVzICYmIGZvbnQuZGF0YSkge1xuXHQgICAgICAgICAgICAgIGZvbnQuZGF0YSA9IG51bGw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGZvbnQpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiRm9udFBhdGhcIjpcblx0ICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcblx0ICAgICAgICBjYXNlIFwiUGF0dGVyblwiOlxuXHQgICAgICAgICAgdGhpcy5jb21tb25PYmpzLnJlc29sdmUoaWQsIGV4cG9ydGVkRGF0YSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHb3QgdW5rbm93biBjb21tb24gb2JqZWN0IHR5cGUgJHt0eXBlfWApO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwib2JqXCIsIChbaWQsIHBhZ2VJbmRleCwgdHlwZSwgaW1hZ2VEYXRhXSkgPT4ge1xuXHQgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgcGFnZVByb3h5ID0gdGhpcy4jcGFnZUNhY2hlLmdldChwYWdlSW5kZXgpO1xuXHQgICAgICBpZiAocGFnZVByb3h5Lm9ianMuaGFzKGlkKSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBzd2l0Y2ggKHR5cGUpIHtcblx0ICAgICAgICBjYXNlIFwiSW1hZ2VcIjpcblx0ICAgICAgICAgIHBhZ2VQcm94eS5vYmpzLnJlc29sdmUoaWQsIGltYWdlRGF0YSk7XG5cdCAgICAgICAgICBpZiAoaW1hZ2VEYXRhKSB7XG5cdCAgICAgICAgICAgIGxldCBsZW5ndGg7XG5cdCAgICAgICAgICAgIGlmIChpbWFnZURhdGEuYml0bWFwKSB7XG5cdCAgICAgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICAgICAgd2lkdGgsXG5cdCAgICAgICAgICAgICAgICBoZWlnaHRcblx0ICAgICAgICAgICAgICB9ID0gaW1hZ2VEYXRhO1xuXHQgICAgICAgICAgICAgIGxlbmd0aCA9IHdpZHRoICogaGVpZ2h0ICogNDtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICBsZW5ndGggPSBpbWFnZURhdGEuZGF0YT8ubGVuZ3RoIHx8IDA7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGxlbmd0aCA+IF91dGlsLk1BWF9JTUFHRV9TSVpFX1RPX0NBQ0hFKSB7XG5cdCAgICAgICAgICAgICAgcGFnZVByb3h5Ll9tYXliZUNsZWFudXBBZnRlclJlbmRlciA9IHRydWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJQYXR0ZXJuXCI6XG5cdCAgICAgICAgICBwYWdlUHJveHkub2Jqcy5yZXNvbHZlKGlkLCBpbWFnZURhdGEpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR290IHVua25vd24gb2JqZWN0IHR5cGUgJHt0eXBlfWApO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRG9jUHJvZ3Jlc3NcIiwgZGF0YSA9PiB7XG5cdCAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBsb2FkaW5nVGFzay5vblByb2dyZXNzPy4oe1xuXHQgICAgICAgIGxvYWRlZDogZGF0YS5sb2FkZWQsXG5cdCAgICAgICAgdG90YWw6IGRhdGEudG90YWxcblx0ICAgICAgfSk7XG5cdCAgICB9KTtcblx0ICAgIG1lc3NhZ2VIYW5kbGVyLm9uKFwiRmV0Y2hCdWlsdEluQ01hcFwiLCBkYXRhID0+IHtcblx0ICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCF0aGlzLmNNYXBSZWFkZXJGYWN0b3J5KSB7XG5cdCAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNNYXBSZWFkZXJGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLmNNYXBSZWFkZXJGYWN0b3J5LmZldGNoKGRhdGEpO1xuXHQgICAgfSk7XG5cdCAgICBtZXNzYWdlSGFuZGxlci5vbihcIkZldGNoU3RhbmRhcmRGb250RGF0YVwiLCBkYXRhID0+IHtcblx0ICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIldvcmtlciB3YXMgZGVzdHJveWVkLlwiKSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCF0aGlzLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5KSB7XG5cdCAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlN0YW5kYXJkRm9udERhdGFGYWN0b3J5IG5vdCBpbml0aWFsaXplZCwgc2VlIHRoZSBgdXNlV29ya2VyRmV0Y2hgIHBhcmFtZXRlci5cIikpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLnN0YW5kYXJkRm9udERhdGFGYWN0b3J5LmZldGNoKGRhdGEpO1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldERhdGEoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREYXRhXCIsIG51bGwpO1xuXHQgIH1cblx0ICBzYXZlRG9jdW1lbnQoKSB7XG5cdCAgICBpZiAodGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zaXplIDw9IDApIHtcblx0ICAgICAgKDAsIF91dGlsLndhcm4pKFwic2F2ZURvY3VtZW50IGNhbGxlZCB3aGlsZSBgYW5ub3RhdGlvblN0b3JhZ2VgIGlzIGVtcHR5LCBcIiArIFwicGxlYXNlIHVzZSB0aGUgZ2V0RGF0YS1tZXRob2QgaW5zdGVhZC5cIik7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJTYXZlRG9jdW1lbnRcIiwge1xuXHQgICAgICBpc1B1cmVYZmE6ICEhdGhpcy5faHRtbEZvclhmYSxcblx0ICAgICAgbnVtUGFnZXM6IHRoaXMuX251bVBhZ2VzLFxuXHQgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXJpYWxpemFibGUsXG5cdCAgICAgIGZpbGVuYW1lOiB0aGlzLl9mdWxsUmVhZGVyPy5maWxlbmFtZSA/PyBudWxsXG5cdCAgICB9KS5maW5hbGx5KCgpID0+IHtcblx0ICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5yZXNldE1vZGlmaWVkKCk7XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0UGFnZShwYWdlTnVtYmVyKSB7XG5cdCAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFnZU51bWJlcikgfHwgcGFnZU51bWJlciA8PSAwIHx8IHBhZ2VOdW1iZXIgPiB0aGlzLl9udW1QYWdlcykge1xuXHQgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlIHJlcXVlc3QuXCIpKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxLFxuXHQgICAgICBjYWNoZWRQcm9taXNlID0gdGhpcy4jcGFnZVByb21pc2VzLmdldChwYWdlSW5kZXgpO1xuXHQgICAgaWYgKGNhY2hlZFByb21pc2UpIHtcblx0ICAgICAgcmV0dXJuIGNhY2hlZFByb21pc2U7XG5cdCAgICB9XG5cdCAgICBjb25zdCBwcm9taXNlID0gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlXCIsIHtcblx0ICAgICAgcGFnZUluZGV4XG5cdCAgICB9KS50aGVuKHBhZ2VJbmZvID0+IHtcblx0ICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNwb3J0IGRlc3Ryb3llZFwiKTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBwYWdlID0gbmV3IFBERlBhZ2VQcm94eShwYWdlSW5kZXgsIHBhZ2VJbmZvLCB0aGlzLCB0aGlzLl9wYXJhbXMucGRmQnVnKTtcblx0ICAgICAgdGhpcy4jcGFnZUNhY2hlLnNldChwYWdlSW5kZXgsIHBhZ2UpO1xuXHQgICAgICByZXR1cm4gcGFnZTtcblx0ICAgIH0pO1xuXHQgICAgdGhpcy4jcGFnZVByb21pc2VzLnNldChwYWdlSW5kZXgsIHByb21pc2UpO1xuXHQgICAgcmV0dXJuIHByb21pc2U7XG5cdCAgfVxuXHQgIGdldFBhZ2VJbmRleChyZWYpIHtcblx0ICAgIGlmICh0eXBlb2YgcmVmICE9PSBcIm9iamVjdFwiIHx8IHJlZiA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzSW50ZWdlcihyZWYubnVtKSB8fCByZWYubnVtIDwgMCB8fCAhTnVtYmVyLmlzSW50ZWdlcihyZWYuZ2VuKSB8fCByZWYuZ2VuIDwgMCkge1xuXHQgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBwYWdlSW5kZXggcmVxdWVzdC5cIikpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGFnZUluZGV4XCIsIHtcblx0ICAgICAgbnVtOiByZWYubnVtLFxuXHQgICAgICBnZW46IHJlZi5nZW5cblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXRBbm5vdGF0aW9ucyhwYWdlSW5kZXgsIGludGVudCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0QW5ub3RhdGlvbnNcIiwge1xuXHQgICAgICBwYWdlSW5kZXgsXG5cdCAgICAgIGludGVudFxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldEZpZWxkT2JqZWN0cygpIHtcblx0ICAgIHJldHVybiB0aGlzLiNjYWNoZVNpbXBsZU1ldGhvZChcIkdldEZpZWxkT2JqZWN0c1wiKTtcblx0ICB9XG5cdCAgaGFzSlNBY3Rpb25zKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI2NhY2hlU2ltcGxlTWV0aG9kKFwiSGFzSlNBY3Rpb25zXCIpO1xuXHQgIH1cblx0ICBnZXRDYWxjdWxhdGlvbk9yZGVySWRzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0Q2FsY3VsYXRpb25PcmRlcklkc1wiLCBudWxsKTtcblx0ICB9XG5cdCAgZ2V0RGVzdGluYXRpb25zKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0RGVzdGluYXRpb25zXCIsIG51bGwpO1xuXHQgIH1cblx0ICBnZXREZXN0aW5hdGlvbihpZCkge1xuXHQgICAgaWYgKHR5cGVvZiBpZCAhPT0gXCJzdHJpbmdcIikge1xuXHQgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBkZXN0aW5hdGlvbiByZXF1ZXN0LlwiKSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXREZXN0aW5hdGlvblwiLCB7XG5cdCAgICAgIGlkXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0UGFnZUxhYmVscygpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VMYWJlbHNcIiwgbnVsbCk7XG5cdCAgfVxuXHQgIGdldFBhZ2VMYXlvdXQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRQYWdlTGF5b3V0XCIsIG51bGwpO1xuXHQgIH1cblx0ICBnZXRQYWdlTW9kZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VNb2RlXCIsIG51bGwpO1xuXHQgIH1cblx0ICBnZXRWaWV3ZXJQcmVmZXJlbmNlcygpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFZpZXdlclByZWZlcmVuY2VzXCIsIG51bGwpO1xuXHQgIH1cblx0ICBnZXRPcGVuQWN0aW9uKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0T3BlbkFjdGlvblwiLCBudWxsKTtcblx0ICB9XG5cdCAgZ2V0QXR0YWNobWVudHMoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRBdHRhY2htZW50c1wiLCBudWxsKTtcblx0ICB9XG5cdCAgZ2V0SmF2YVNjcmlwdCgpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldEphdmFTY3JpcHRcIiwgbnVsbCk7XG5cdCAgfVxuXHQgIGdldERvY0pTQWN0aW9ucygpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldERvY0pTQWN0aW9uc1wiLCBudWxsKTtcblx0ICB9XG5cdCAgZ2V0UGFnZUpTQWN0aW9ucyhwYWdlSW5kZXgpIHtcblx0ICAgIHJldHVybiB0aGlzLm1lc3NhZ2VIYW5kbGVyLnNlbmRXaXRoUHJvbWlzZShcIkdldFBhZ2VKU0FjdGlvbnNcIiwge1xuXHQgICAgICBwYWdlSW5kZXhcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXRTdHJ1Y3RUcmVlKHBhZ2VJbmRleCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0U3RydWN0VHJlZVwiLCB7XG5cdCAgICAgIHBhZ2VJbmRleFxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldE91dGxpbmUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRPdXRsaW5lXCIsIG51bGwpO1xuXHQgIH1cblx0ICBnZXRPcHRpb25hbENvbnRlbnRDb25maWcoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRPcHRpb25hbENvbnRlbnRDb25maWdcIiwgbnVsbCkudGhlbihyZXN1bHRzID0+IHtcblx0ICAgICAgcmV0dXJuIG5ldyBfb3B0aW9uYWxfY29udGVudF9jb25maWcuT3B0aW9uYWxDb250ZW50Q29uZmlnKHJlc3VsdHMpO1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGdldFBlcm1pc3Npb25zKCkge1xuXHQgICAgcmV0dXJuIHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKFwiR2V0UGVybWlzc2lvbnNcIiwgbnVsbCk7XG5cdCAgfVxuXHQgIGdldE1ldGFkYXRhKCkge1xuXHQgICAgY29uc3QgbmFtZSA9IFwiR2V0TWV0YWRhdGFcIixcblx0ICAgICAgY2FjaGVkUHJvbWlzZSA9IHRoaXMuI21ldGhvZFByb21pc2VzLmdldChuYW1lKTtcblx0ICAgIGlmIChjYWNoZWRQcm9taXNlKSB7XG5cdCAgICAgIHJldHVybiBjYWNoZWRQcm9taXNlO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMubWVzc2FnZUhhbmRsZXIuc2VuZFdpdGhQcm9taXNlKG5hbWUsIG51bGwpLnRoZW4ocmVzdWx0cyA9PiB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgaW5mbzogcmVzdWx0c1swXSxcblx0ICAgICAgICBtZXRhZGF0YTogcmVzdWx0c1sxXSA/IG5ldyBfbWV0YWRhdGEuTWV0YWRhdGEocmVzdWx0c1sxXSkgOiBudWxsLFxuXHQgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOiB0aGlzLl9mdWxsUmVhZGVyPy5maWxlbmFtZSA/PyBudWxsLFxuXHQgICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2Z1bGxSZWFkZXI/LmNvbnRlbnRMZW5ndGggPz8gbnVsbFxuXHQgICAgICB9O1xuXHQgICAgfSk7XG5cdCAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5zZXQobmFtZSwgcHJvbWlzZSk7XG5cdCAgICByZXR1cm4gcHJvbWlzZTtcblx0ICB9XG5cdCAgZ2V0TWFya0luZm8oKSB7XG5cdCAgICByZXR1cm4gdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJHZXRNYXJrSW5mb1wiLCBudWxsKTtcblx0ICB9XG5cdCAgYXN5bmMgc3RhcnRDbGVhbnVwKGtlZXBMb2FkZWRGb250cyA9IGZhbHNlKSB7XG5cdCAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgYXdhaXQgdGhpcy5tZXNzYWdlSGFuZGxlci5zZW5kV2l0aFByb21pc2UoXCJDbGVhbnVwXCIsIG51bGwpO1xuXHQgICAgZm9yIChjb25zdCBwYWdlIG9mIHRoaXMuI3BhZ2VDYWNoZS52YWx1ZXMoKSkge1xuXHQgICAgICBjb25zdCBjbGVhbnVwU3VjY2Vzc2Z1bCA9IHBhZ2UuY2xlYW51cCgpO1xuXHQgICAgICBpZiAoIWNsZWFudXBTdWNjZXNzZnVsKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdGFydENsZWFudXA6IFBhZ2UgJHtwYWdlLnBhZ2VOdW1iZXJ9IGlzIGN1cnJlbnRseSByZW5kZXJpbmcuYCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuY29tbW9uT2Jqcy5jbGVhcigpO1xuXHQgICAgaWYgKCFrZWVwTG9hZGVkRm9udHMpIHtcblx0ICAgICAgdGhpcy5mb250TG9hZGVyLmNsZWFyKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNtZXRob2RQcm9taXNlcy5jbGVhcigpO1xuXHQgICAgdGhpcy5maWx0ZXJGYWN0b3J5LmRlc3Ryb3kodHJ1ZSk7XG5cdCAgfVxuXHQgIGdldCBsb2FkaW5nUGFyYW1zKCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBkaXNhYmxlQXV0b0ZldGNoLFxuXHQgICAgICBlbmFibGVYZmFcblx0ICAgIH0gPSB0aGlzLl9wYXJhbXM7XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJsb2FkaW5nUGFyYW1zXCIsIHtcblx0ICAgICAgZGlzYWJsZUF1dG9GZXRjaCxcblx0ICAgICAgZW5hYmxlWGZhXG5cdCAgICB9KTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUERGT2JqZWN0cyB7XG5cdCAgI29ianMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgICNlbnN1cmVPYmoob2JqSWQpIHtcblx0ICAgIGNvbnN0IG9iaiA9IHRoaXMuI29ianNbb2JqSWRdO1xuXHQgICAgaWYgKG9iaikge1xuXHQgICAgICByZXR1cm4gb2JqO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMuI29ianNbb2JqSWRdID0ge1xuXHQgICAgICBjYXBhYmlsaXR5OiBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKSxcblx0ICAgICAgZGF0YTogbnVsbFxuXHQgICAgfTtcblx0ICB9XG5cdCAgZ2V0KG9iaklkLCBjYWxsYmFjayA9IG51bGwpIHtcblx0ICAgIGlmIChjYWxsYmFjaykge1xuXHQgICAgICBjb25zdCBvYmogPSB0aGlzLiNlbnN1cmVPYmoob2JqSWQpO1xuXHQgICAgICBvYmouY2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oKCkgPT4gY2FsbGJhY2sob2JqLmRhdGEpKTtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCBvYmogPSB0aGlzLiNvYmpzW29iaklkXTtcblx0ICAgIGlmICghb2JqPy5jYXBhYmlsaXR5LnNldHRsZWQpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1ZXN0aW5nIG9iamVjdCB0aGF0IGlzbid0IHJlc29sdmVkIHlldCAke29iaklkfS5gKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBvYmouZGF0YTtcblx0ICB9XG5cdCAgaGFzKG9iaklkKSB7XG5cdCAgICBjb25zdCBvYmogPSB0aGlzLiNvYmpzW29iaklkXTtcblx0ICAgIHJldHVybiBvYmo/LmNhcGFiaWxpdHkuc2V0dGxlZCB8fCBmYWxzZTtcblx0ICB9XG5cdCAgcmVzb2x2ZShvYmpJZCwgZGF0YSA9IG51bGwpIHtcblx0ICAgIGNvbnN0IG9iaiA9IHRoaXMuI2Vuc3VyZU9iaihvYmpJZCk7XG5cdCAgICBvYmouZGF0YSA9IGRhdGE7XG5cdCAgICBvYmouY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgfVxuXHQgIGNsZWFyKCkge1xuXHQgICAgZm9yIChjb25zdCBvYmpJZCBpbiB0aGlzLiNvYmpzKSB7XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBkYXRhXG5cdCAgICAgIH0gPSB0aGlzLiNvYmpzW29iaklkXTtcblx0ICAgICAgZGF0YT8uYml0bWFwPy5jbG9zZSgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jb2JqcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFJlbmRlclRhc2sge1xuXHQgICNpbnRlcm5hbFJlbmRlclRhc2sgPSBudWxsO1xuXHQgIGNvbnN0cnVjdG9yKGludGVybmFsUmVuZGVyVGFzaykge1xuXHQgICAgdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrID0gaW50ZXJuYWxSZW5kZXJUYXNrO1xuXHQgICAgdGhpcy5vbkNvbnRpbnVlID0gbnVsbDtcblx0ICB9XG5cdCAgZ2V0IHByb21pc2UoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrLmNhcGFiaWxpdHkucHJvbWlzZTtcblx0ICB9XG5cdCAgY2FuY2VsKGV4dHJhRGVsYXkgPSAwKSB7XG5cdCAgICB0aGlzLiNpbnRlcm5hbFJlbmRlclRhc2suY2FuY2VsKG51bGwsIGV4dHJhRGVsYXkpO1xuXHQgIH1cblx0ICBnZXQgc2VwYXJhdGVBbm5vdHMoKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHNlcGFyYXRlQW5ub3RzXG5cdCAgICB9ID0gdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrLm9wZXJhdG9yTGlzdDtcblx0ICAgIGlmICghc2VwYXJhdGVBbm5vdHMpIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgICAgY29uc3Qge1xuXHQgICAgICBhbm5vdGF0aW9uQ2FudmFzTWFwXG5cdCAgICB9ID0gdGhpcy4jaW50ZXJuYWxSZW5kZXJUYXNrO1xuXHQgICAgcmV0dXJuIHNlcGFyYXRlQW5ub3RzLmZvcm0gfHwgc2VwYXJhdGVBbm5vdHMuY2FudmFzICYmIGFubm90YXRpb25DYW52YXNNYXA/LnNpemUgPiAwO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlJlbmRlclRhc2sgPSBSZW5kZXJUYXNrO1xuXHRjbGFzcyBJbnRlcm5hbFJlbmRlclRhc2sge1xuXHQgIHN0YXRpYyAjY2FudmFzSW5Vc2UgPSBuZXcgV2Vha1NldCgpO1xuXHQgIGNvbnN0cnVjdG9yKHtcblx0ICAgIGNhbGxiYWNrLFxuXHQgICAgcGFyYW1zLFxuXHQgICAgb2Jqcyxcblx0ICAgIGNvbW1vbk9ianMsXG5cdCAgICBhbm5vdGF0aW9uQ2FudmFzTWFwLFxuXHQgICAgb3BlcmF0b3JMaXN0LFxuXHQgICAgcGFnZUluZGV4LFxuXHQgICAgY2FudmFzRmFjdG9yeSxcblx0ICAgIGZpbHRlckZhY3RvcnksXG5cdCAgICB1c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmYWxzZSxcblx0ICAgIHBkZkJ1ZyA9IGZhbHNlLFxuXHQgICAgcGFnZUNvbG9ycyA9IG51bGxcblx0ICB9KSB7XG5cdCAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG5cdCAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblx0ICAgIHRoaXMub2JqcyA9IG9ianM7XG5cdCAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzO1xuXHQgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzTWFwID0gYW5ub3RhdGlvbkNhbnZhc01hcDtcblx0ICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gbnVsbDtcblx0ICAgIHRoaXMub3BlcmF0b3JMaXN0ID0gb3BlcmF0b3JMaXN0O1xuXHQgICAgdGhpcy5fcGFnZUluZGV4ID0gcGFnZUluZGV4O1xuXHQgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcblx0ICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGZpbHRlckZhY3Rvcnk7XG5cdCAgICB0aGlzLl9wZGZCdWcgPSBwZGZCdWc7XG5cdCAgICB0aGlzLnBhZ2VDb2xvcnMgPSBwYWdlQ29sb3JzO1xuXHQgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cdCAgICB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayA9IG51bGw7XG5cdCAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSBmYWxzZTtcblx0ICAgIHRoaXMuX3VzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHVzZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gdHJ1ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuXHQgICAgdGhpcy5jYW5jZWxsZWQgPSBmYWxzZTtcblx0ICAgIHRoaXMuY2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgdGhpcy50YXNrID0gbmV3IFJlbmRlclRhc2sodGhpcyk7XG5cdCAgICB0aGlzLl9jYW5jZWxCb3VuZCA9IHRoaXMuY2FuY2VsLmJpbmQodGhpcyk7XG5cdCAgICB0aGlzLl9jb250aW51ZUJvdW5kID0gdGhpcy5fY29udGludWUuYmluZCh0aGlzKTtcblx0ICAgIHRoaXMuX3NjaGVkdWxlTmV4dEJvdW5kID0gdGhpcy5fc2NoZWR1bGVOZXh0LmJpbmQodGhpcyk7XG5cdCAgICB0aGlzLl9uZXh0Qm91bmQgPSB0aGlzLl9uZXh0LmJpbmQodGhpcyk7XG5cdCAgICB0aGlzLl9jYW52YXMgPSBwYXJhbXMuY2FudmFzQ29udGV4dC5jYW52YXM7XG5cdCAgfVxuXHQgIGdldCBjb21wbGV0ZWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5jYXBhYmlsaXR5LnByb21pc2UuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuXHQgIH1cblx0ICBpbml0aWFsaXplR3JhcGhpY3Moe1xuXHQgICAgdHJhbnNwYXJlbmN5ID0gZmFsc2UsXG5cdCAgICBvcHRpb25hbENvbnRlbnRDb25maWdcblx0ICB9KSB7XG5cdCAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX2NhbnZhcykge1xuXHQgICAgICBpZiAoSW50ZXJuYWxSZW5kZXJUYXNrLiNjYW52YXNJblVzZS5oYXModGhpcy5fY2FudmFzKSkge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgdGhlIHNhbWUgY2FudmFzIGR1cmluZyBtdWx0aXBsZSByZW5kZXIoKSBvcGVyYXRpb25zLiBcIiArIFwiVXNlIGRpZmZlcmVudCBjYW52YXMgb3IgZW5zdXJlIHByZXZpb3VzIG9wZXJhdGlvbnMgd2VyZSBcIiArIFwiY2FuY2VsbGVkIG9yIGNvbXBsZXRlZC5cIik7XG5cdCAgICAgIH1cblx0ICAgICAgSW50ZXJuYWxSZW5kZXJUYXNrLiNjYW52YXNJblVzZS5hZGQodGhpcy5fY2FudmFzKTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl9wZGZCdWcgJiYgZ2xvYmFsVGhpcy5TdGVwcGVyTWFuYWdlcj8uZW5hYmxlZCkge1xuXHQgICAgICB0aGlzLnN0ZXBwZXIgPSBnbG9iYWxUaGlzLlN0ZXBwZXJNYW5hZ2VyLmNyZWF0ZSh0aGlzLl9wYWdlSW5kZXgpO1xuXHQgICAgICB0aGlzLnN0ZXBwZXIuaW5pdCh0aGlzLm9wZXJhdG9yTGlzdCk7XG5cdCAgICAgIHRoaXMuc3RlcHBlci5uZXh0QnJlYWtQb2ludCA9IHRoaXMuc3RlcHBlci5nZXROZXh0QnJlYWtQb2ludCgpO1xuXHQgICAgfVxuXHQgICAgY29uc3Qge1xuXHQgICAgICBjYW52YXNDb250ZXh0LFxuXHQgICAgICB2aWV3cG9ydCxcblx0ICAgICAgdHJhbnNmb3JtLFxuXHQgICAgICBiYWNrZ3JvdW5kXG5cdCAgICB9ID0gdGhpcy5wYXJhbXM7XG5cdCAgICB0aGlzLmdmeCA9IG5ldyBfY2FudmFzLkNhbnZhc0dyYXBoaWNzKGNhbnZhc0NvbnRleHQsIHRoaXMuY29tbW9uT2JqcywgdGhpcy5vYmpzLCB0aGlzLmNhbnZhc0ZhY3RvcnksIHRoaXMuZmlsdGVyRmFjdG9yeSwge1xuXHQgICAgICBvcHRpb25hbENvbnRlbnRDb25maWdcblx0ICAgIH0sIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCwgdGhpcy5wYWdlQ29sb3JzKTtcblx0ICAgIHRoaXMuZ2Z4LmJlZ2luRHJhd2luZyh7XG5cdCAgICAgIHRyYW5zZm9ybSxcblx0ICAgICAgdmlld3BvcnQsXG5cdCAgICAgIHRyYW5zcGFyZW5jeSxcblx0ICAgICAgYmFja2dyb3VuZFxuXHQgICAgfSk7XG5cdCAgICB0aGlzLm9wZXJhdG9yTGlzdElkeCA9IDA7XG5cdCAgICB0aGlzLmdyYXBoaWNzUmVhZHkgPSB0cnVlO1xuXHQgICAgdGhpcy5ncmFwaGljc1JlYWR5Q2FsbGJhY2s/LigpO1xuXHQgIH1cblx0ICBjYW5jZWwoZXJyb3IgPSBudWxsLCBleHRyYURlbGF5ID0gMCkge1xuXHQgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cdCAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG5cdCAgICB0aGlzLmdmeD8uZW5kRHJhd2luZygpO1xuXHQgICAgaWYgKHRoaXMuX2NhbnZhcykge1xuXHQgICAgICBJbnRlcm5hbFJlbmRlclRhc2suI2NhbnZhc0luVXNlLmRlbGV0ZSh0aGlzLl9jYW52YXMpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jYWxsYmFjayhlcnJvciB8fCBuZXcgX2Rpc3BsYXlfdXRpbHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uKGBSZW5kZXJpbmcgY2FuY2VsbGVkLCBwYWdlICR7dGhpcy5fcGFnZUluZGV4ICsgMX1gLCBcImNhbnZhc1wiLCBleHRyYURlbGF5KSk7XG5cdCAgfVxuXHQgIG9wZXJhdG9yTGlzdENoYW5nZWQoKSB7XG5cdCAgICBpZiAoIXRoaXMuZ3JhcGhpY3NSZWFkeSkge1xuXHQgICAgICB0aGlzLmdyYXBoaWNzUmVhZHlDYWxsYmFjayB8fD0gdGhpcy5fY29udGludWVCb3VuZDtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5zdGVwcGVyPy51cGRhdGVPcGVyYXRvckxpc3QodGhpcy5vcGVyYXRvckxpc3QpO1xuXHQgICAgaWYgKHRoaXMucnVubmluZykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLl9jb250aW51ZSgpO1xuXHQgIH1cblx0ICBfY29udGludWUoKSB7XG5cdCAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLnRhc2sub25Db250aW51ZSkge1xuXHQgICAgICB0aGlzLnRhc2sub25Db250aW51ZSh0aGlzLl9zY2hlZHVsZU5leHRCb3VuZCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLl9zY2hlZHVsZU5leHQoKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX3NjaGVkdWxlTmV4dCgpIHtcblx0ICAgIGlmICh0aGlzLl91c2VSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcblx0ICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG5cdCAgICAgICAgdGhpcy5fbmV4dEJvdW5kKCkuY2F0Y2godGhpcy5fY2FuY2VsQm91bmQpO1xuXHQgICAgICB9KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4odGhpcy5fbmV4dEJvdW5kKS5jYXRjaCh0aGlzLl9jYW5jZWxCb3VuZCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGFzeW5jIF9uZXh0KCkge1xuXHQgICAgaWYgKHRoaXMuY2FuY2VsbGVkKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMub3BlcmF0b3JMaXN0SWR4ID0gdGhpcy5nZnguZXhlY3V0ZU9wZXJhdG9yTGlzdCh0aGlzLm9wZXJhdG9yTGlzdCwgdGhpcy5vcGVyYXRvckxpc3RJZHgsIHRoaXMuX2NvbnRpbnVlQm91bmQsIHRoaXMuc3RlcHBlcik7XG5cdCAgICBpZiAodGhpcy5vcGVyYXRvckxpc3RJZHggPT09IHRoaXMub3BlcmF0b3JMaXN0LmFyZ3NBcnJheS5sZW5ndGgpIHtcblx0ICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XG5cdCAgICAgIGlmICh0aGlzLm9wZXJhdG9yTGlzdC5sYXN0Q2h1bmspIHtcblx0ICAgICAgICB0aGlzLmdmeC5lbmREcmF3aW5nKHRoaXMucGFnZUNvbG9ycyk7XG5cdCAgICAgICAgaWYgKHRoaXMuX2NhbnZhcykge1xuXHQgICAgICAgICAgSW50ZXJuYWxSZW5kZXJUYXNrLiNjYW52YXNJblVzZS5kZWxldGUodGhpcy5fY2FudmFzKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jYWxsYmFjaygpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdGNvbnN0IHZlcnNpb24gPSAnMy42LjE3Mic7XG5cdGV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb247XG5cdGNvbnN0IGJ1aWxkID0gJzRkM2RmZTI1NCc7XG5cdGV4cG9ydHMuYnVpbGQgPSBidWlsZDtcblxuXHQvKioqLyB9KSxcblx0LyogMyAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSA9IGV4cG9ydHMuQW5ub3RhdGlvblN0b3JhZ2UgPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfZWRpdG9yID0gX193X3BkZmpzX3JlcXVpcmVfXyg0KTtcblx0dmFyIF9tdXJtdXJoYXNoID0gX193X3BkZmpzX3JlcXVpcmVfXyg4KTtcblx0Y2xhc3MgQW5ub3RhdGlvblN0b3JhZ2Uge1xuXHQgICNtb2RpZmllZCA9IGZhbHNlO1xuXHQgICNzdG9yYWdlID0gbmV3IE1hcCgpO1xuXHQgIGNvbnN0cnVjdG9yKCkge1xuXHQgICAgdGhpcy5vblNldE1vZGlmaWVkID0gbnVsbDtcblx0ICAgIHRoaXMub25SZXNldE1vZGlmaWVkID0gbnVsbDtcblx0ICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID0gbnVsbDtcblx0ICB9XG5cdCAgZ2V0VmFsdWUoa2V5LCBkZWZhdWx0VmFsdWUpIHtcblx0ICAgIGNvbnN0IHZhbHVlID0gdGhpcy4jc3RvcmFnZS5nZXQoa2V5KTtcblx0ICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0VmFsdWUsIHZhbHVlKTtcblx0ICB9XG5cdCAgZ2V0UmF3VmFsdWUoa2V5KSB7XG5cdCAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5nZXQoa2V5KTtcblx0ICB9XG5cdCAgcmVtb3ZlKGtleSkge1xuXHQgICAgdGhpcy4jc3RvcmFnZS5kZWxldGUoa2V5KTtcblx0ICAgIGlmICh0aGlzLiNzdG9yYWdlLnNpemUgPT09IDApIHtcblx0ICAgICAgdGhpcy5yZXNldE1vZGlmaWVkKCk7XG5cdCAgICB9XG5cdCAgICBpZiAodHlwZW9mIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLiNzdG9yYWdlLnZhbHVlcygpKSB7XG5cdCAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHRoaXMub25Bbm5vdGF0aW9uRWRpdG9yKG51bGwpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzZXRWYWx1ZShrZXksIHZhbHVlKSB7XG5cdCAgICBjb25zdCBvYmogPSB0aGlzLiNzdG9yYWdlLmdldChrZXkpO1xuXHQgICAgbGV0IG1vZGlmaWVkID0gZmFsc2U7XG5cdCAgICBpZiAob2JqICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgZm9yIChjb25zdCBbZW50cnksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG5cdCAgICAgICAgaWYgKG9ialtlbnRyeV0gIT09IHZhbCkge1xuXHQgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlO1xuXHQgICAgICAgICAgb2JqW2VudHJ5XSA9IHZhbDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIG1vZGlmaWVkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy4jc3RvcmFnZS5zZXQoa2V5LCB2YWx1ZSk7XG5cdCAgICB9XG5cdCAgICBpZiAobW9kaWZpZWQpIHtcblx0ICAgICAgdGhpcy4jc2V0TW9kaWZpZWQoKTtcblx0ICAgIH1cblx0ICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIF9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvciAmJiB0eXBlb2YgdGhpcy5vbkFubm90YXRpb25FZGl0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuXHQgICAgICB0aGlzLm9uQW5ub3RhdGlvbkVkaXRvcih2YWx1ZS5jb25zdHJ1Y3Rvci5fdHlwZSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGhhcyhrZXkpIHtcblx0ICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLmhhcyhrZXkpO1xuXHQgIH1cblx0ICBnZXRBbGwoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jc3RvcmFnZS5zaXplID4gMCA/ICgwLCBfdXRpbC5vYmplY3RGcm9tTWFwKSh0aGlzLiNzdG9yYWdlKSA6IG51bGw7XG5cdCAgfVxuXHQgIHNldEFsbChvYmopIHtcblx0ICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG5cdCAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCB2YWwpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXQgc2l6ZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLiNzdG9yYWdlLnNpemU7XG5cdCAgfVxuXHQgICNzZXRNb2RpZmllZCgpIHtcblx0ICAgIGlmICghdGhpcy4jbW9kaWZpZWQpIHtcblx0ICAgICAgdGhpcy4jbW9kaWZpZWQgPSB0cnVlO1xuXHQgICAgICBpZiAodHlwZW9mIHRoaXMub25TZXRNb2RpZmllZCA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgICAgdGhpcy5vblNldE1vZGlmaWVkKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgcmVzZXRNb2RpZmllZCgpIHtcblx0ICAgIGlmICh0aGlzLiNtb2RpZmllZCkge1xuXHQgICAgICB0aGlzLiNtb2RpZmllZCA9IGZhbHNlO1xuXHQgICAgICBpZiAodHlwZW9mIHRoaXMub25SZXNldE1vZGlmaWVkID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgICB0aGlzLm9uUmVzZXRNb2RpZmllZCgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldCBwcmludCgpIHtcblx0ICAgIHJldHVybiBuZXcgUHJpbnRBbm5vdGF0aW9uU3RvcmFnZSh0aGlzKTtcblx0ICB9XG5cdCAgZ2V0IHNlcmlhbGl6YWJsZSgpIHtcblx0ICAgIGlmICh0aGlzLiNzdG9yYWdlLnNpemUgPT09IDApIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCBjbG9uZSA9IG5ldyBNYXAoKTtcblx0ICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzLiNzdG9yYWdlKSB7XG5cdCAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB2YWwgaW5zdGFuY2VvZiBfZWRpdG9yLkFubm90YXRpb25FZGl0b3IgPyB2YWwuc2VyaWFsaXplKCkgOiB2YWw7XG5cdCAgICAgIGlmIChzZXJpYWxpemVkKSB7XG5cdCAgICAgICAgY2xvbmUuc2V0KGtleSwgc2VyaWFsaXplZCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBjbG9uZTtcblx0ICB9XG5cdCAgc3RhdGljIGdldEhhc2gobWFwKSB7XG5cdCAgICBpZiAoIW1hcCkge1xuXHQgICAgICByZXR1cm4gXCJcIjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGhhc2ggPSBuZXcgX211cm11cmhhc2guTXVybXVySGFzaDNfNjQoKTtcblx0ICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBtYXApIHtcblx0ICAgICAgaGFzaC51cGRhdGUoYCR7a2V5fToke0pTT04uc3RyaW5naWZ5KHZhbCl9YCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gaGFzaC5oZXhkaWdlc3QoKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5Bbm5vdGF0aW9uU3RvcmFnZSA9IEFubm90YXRpb25TdG9yYWdlO1xuXHRjbGFzcyBQcmludEFubm90YXRpb25TdG9yYWdlIGV4dGVuZHMgQW5ub3RhdGlvblN0b3JhZ2Uge1xuXHQgICNzZXJpYWxpemFibGUgPSBudWxsO1xuXHQgIGNvbnN0cnVjdG9yKHBhcmVudCkge1xuXHQgICAgc3VwZXIoKTtcblx0ICAgIHRoaXMuI3NlcmlhbGl6YWJsZSA9IHN0cnVjdHVyZWRDbG9uZShwYXJlbnQuc2VyaWFsaXphYmxlKTtcblx0ICB9XG5cdCAgZ2V0IHByaW50KCkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIlNob3VsZCBub3QgY2FsbCBQcmludEFubm90YXRpb25TdG9yYWdlLnByaW50XCIpO1xuXHQgIH1cblx0ICBnZXQgc2VyaWFsaXphYmxlKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI3NlcmlhbGl6YWJsZTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5QcmludEFubm90YXRpb25TdG9yYWdlID0gUHJpbnRBbm5vdGF0aW9uU3RvcmFnZTtcblxuXHQvKioqLyB9KSxcblx0LyogNCAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvciA9IHZvaWQgMDtcblx0dmFyIF90b29scyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdGNsYXNzIEFubm90YXRpb25FZGl0b3Ige1xuXHQgICNib3VuZEZvY3VzaW4gPSB0aGlzLmZvY3VzaW4uYmluZCh0aGlzKTtcblx0ICAjYm91bmRGb2N1c291dCA9IHRoaXMuZm9jdXNvdXQuYmluZCh0aGlzKTtcblx0ICAjaGFzQmVlblNlbGVjdGVkID0gZmFsc2U7XG5cdCAgI2lzRWRpdGluZyA9IGZhbHNlO1xuXHQgICNpc0luRWRpdE1vZGUgPSBmYWxzZTtcblx0ICBfdWlNYW5hZ2VyID0gbnVsbDtcblx0ICAjekluZGV4ID0gQW5ub3RhdGlvbkVkaXRvci5fekluZGV4Kys7XG5cdCAgc3RhdGljIF9jb2xvck1hbmFnZXIgPSBuZXcgX3Rvb2xzLkNvbG9yTWFuYWdlcigpO1xuXHQgIHN0YXRpYyBfekluZGV4ID0gMTtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQW5ub3RhdGlvbkVkaXRvcikge1xuXHQgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQW5ub3RhdGlvbkVkaXRvci5cIik7XG5cdCAgICB9XG5cdCAgICB0aGlzLnBhcmVudCA9IHBhcmFtZXRlcnMucGFyZW50O1xuXHQgICAgdGhpcy5pZCA9IHBhcmFtZXRlcnMuaWQ7XG5cdCAgICB0aGlzLndpZHRoID0gdGhpcy5oZWlnaHQgPSBudWxsO1xuXHQgICAgdGhpcy5wYWdlSW5kZXggPSBwYXJhbWV0ZXJzLnBhcmVudC5wYWdlSW5kZXg7XG5cdCAgICB0aGlzLm5hbWUgPSBwYXJhbWV0ZXJzLm5hbWU7XG5cdCAgICB0aGlzLmRpdiA9IG51bGw7XG5cdCAgICB0aGlzLl91aU1hbmFnZXIgPSBwYXJhbWV0ZXJzLnVpTWFuYWdlcjtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgcm90YXRpb24sXG5cdCAgICAgIHJhd0RpbXM6IHtcblx0ICAgICAgICBwYWdlV2lkdGgsXG5cdCAgICAgICAgcGFnZUhlaWdodCxcblx0ICAgICAgICBwYWdlWCxcblx0ICAgICAgICBwYWdlWVxuXHQgICAgICB9XG5cdCAgICB9ID0gdGhpcy5wYXJlbnQudmlld3BvcnQ7XG5cdCAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG5cdCAgICB0aGlzLnBhZ2VSb3RhdGlvbiA9ICgzNjAgKyByb3RhdGlvbiAtIHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yb3RhdGlvbikgJSAzNjA7XG5cdCAgICB0aGlzLnBhZ2VEaW1lbnNpb25zID0gW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF07XG5cdCAgICB0aGlzLnBhZ2VUcmFuc2xhdGlvbiA9IFtwYWdlWCwgcGFnZVldO1xuXHQgICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgdGhpcy54ID0gcGFyYW1ldGVycy54IC8gd2lkdGg7XG5cdCAgICB0aGlzLnkgPSBwYXJhbWV0ZXJzLnkgLyBoZWlnaHQ7XG5cdCAgICB0aGlzLmlzQXR0YWNoZWRUb0RPTSA9IGZhbHNlO1xuXHQgIH1cblx0ICBzdGF0aWMgZ2V0IF9kZWZhdWx0TGluZUNvbG9yKCkge1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiX2RlZmF1bHRMaW5lQ29sb3JcIiwgdGhpcy5fY29sb3JNYW5hZ2VyLmdldEhleENvZGUoXCJDYW52YXNUZXh0XCIpKTtcblx0ICB9XG5cdCAgYWRkQ29tbWFuZHMocGFyYW1zKSB7XG5cdCAgICB0aGlzLl91aU1hbmFnZXIuYWRkQ29tbWFuZHMocGFyYW1zKTtcblx0ICB9XG5cdCAgZ2V0IGN1cnJlbnRMYXllcigpIHtcblx0ICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIuY3VycmVudExheWVyO1xuXHQgIH1cblx0ICBzZXRJbkJhY2tncm91bmQoKSB7XG5cdCAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSAwO1xuXHQgIH1cblx0ICBzZXRJbkZvcmVncm91bmQoKSB7XG5cdCAgICB0aGlzLmRpdi5zdHlsZS56SW5kZXggPSB0aGlzLiN6SW5kZXg7XG5cdCAgfVxuXHQgIHNldFBhcmVudChwYXJlbnQpIHtcblx0ICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHtcblx0ICAgICAgdGhpcy5wYWdlSW5kZXggPSBwYXJlbnQucGFnZUluZGV4O1xuXHQgICAgICB0aGlzLnBhZ2VEaW1lbnNpb25zID0gcGFyZW50LnBhZ2VEaW1lbnNpb25zO1xuXHQgICAgfVxuXHQgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cdCAgfVxuXHQgIGZvY3VzaW4oZXZlbnQpIHtcblx0ICAgIGlmICghdGhpcy4jaGFzQmVlblNlbGVjdGVkKSB7XG5cdCAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy4jaGFzQmVlblNlbGVjdGVkID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGZvY3Vzb3V0KGV2ZW50KSB7XG5cdCAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG5cdCAgICBpZiAodGFyZ2V0Py5jbG9zZXN0KGAjJHt0aGlzLmlkfWApKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICBpZiAoIXRoaXMucGFyZW50Py5pc011bHRpcGxlU2VsZWN0aW9uKSB7XG5cdCAgICAgIHRoaXMuY29tbWl0T3JSZW1vdmUoKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgY29tbWl0T3JSZW1vdmUoKSB7XG5cdCAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcblx0ICAgICAgdGhpcy5yZW1vdmUoKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuY29tbWl0KCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGNvbW1pdCgpIHtcblx0ICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuXHQgIH1cblx0ICBhZGRUb0Fubm90YXRpb25TdG9yYWdlKCkge1xuXHQgICAgdGhpcy5fdWlNYW5hZ2VyLmFkZFRvQW5ub3RhdGlvblN0b3JhZ2UodGhpcyk7XG5cdCAgfVxuXHQgIGRyYWdzdGFydChldmVudCkge1xuXHQgICAgY29uc3QgcmVjdCA9IHRoaXMucGFyZW50LmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0ICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QueDtcblx0ICAgIHRoaXMuc3RhcnRZID0gZXZlbnQuY2xpZW50WSAtIHJlY3QueTtcblx0ICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0aGlzLmlkKTtcblx0ICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJtb3ZlXCI7XG5cdCAgfVxuXHQgIHNldEF0KHgsIHksIHR4LCB0eSkge1xuXHQgICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgW3R4LCB0eV0gPSB0aGlzLnNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKHR4LCB0eSk7XG5cdCAgICB0aGlzLnggPSAoeCArIHR4KSAvIHdpZHRoO1xuXHQgICAgdGhpcy55ID0gKHkgKyB0eSkgLyBoZWlnaHQ7XG5cdCAgICB0aGlzLmRpdi5zdHlsZS5sZWZ0ID0gYCR7MTAwICogdGhpcy54fSVgO1xuXHQgICAgdGhpcy5kaXYuc3R5bGUudG9wID0gYCR7MTAwICogdGhpcy55fSVgO1xuXHQgIH1cblx0ICB0cmFuc2xhdGUoeCwgeSkge1xuXHQgICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgW3gsIHldID0gdGhpcy5zY3JlZW5Ub1BhZ2VUcmFuc2xhdGlvbih4LCB5KTtcblx0ICAgIHRoaXMueCArPSB4IC8gd2lkdGg7XG5cdCAgICB0aGlzLnkgKz0geSAvIGhlaWdodDtcblx0ICAgIHRoaXMuZGl2LnN0eWxlLmxlZnQgPSBgJHsxMDAgKiB0aGlzLnh9JWA7XG5cdCAgICB0aGlzLmRpdi5zdHlsZS50b3AgPSBgJHsxMDAgKiB0aGlzLnl9JWA7XG5cdCAgfVxuXHQgIHNjcmVlblRvUGFnZVRyYW5zbGF0aW9uKHgsIHkpIHtcblx0ICAgIHN3aXRjaCAodGhpcy5wYXJlbnRSb3RhdGlvbikge1xuXHQgICAgICBjYXNlIDkwOlxuXHQgICAgICAgIHJldHVybiBbeSwgLXhdO1xuXHQgICAgICBjYXNlIDE4MDpcblx0ICAgICAgICByZXR1cm4gWy14LCAteV07XG5cdCAgICAgIGNhc2UgMjcwOlxuXHQgICAgICAgIHJldHVybiBbLXksIHhdO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIHJldHVybiBbeCwgeV07XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldCBwYXJlbnRTY2FsZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl91aU1hbmFnZXIudmlld1BhcmFtZXRlcnMucmVhbFNjYWxlO1xuXHQgIH1cblx0ICBnZXQgcGFyZW50Um90YXRpb24oKSB7XG5cdCAgICByZXR1cm4gKHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycy5yb3RhdGlvbiArIHRoaXMucGFnZVJvdGF0aW9uKSAlIDM2MDtcblx0ICB9XG5cdCAgZ2V0IHBhcmVudERpbWVuc2lvbnMoKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHJlYWxTY2FsZVxuXHQgICAgfSA9IHRoaXMuX3VpTWFuYWdlci52aWV3UGFyYW1ldGVycztcblx0ICAgIGNvbnN0IFtwYWdlV2lkdGgsIHBhZ2VIZWlnaHRdID0gdGhpcy5wYWdlRGltZW5zaW9ucztcblx0ICAgIHJldHVybiBbcGFnZVdpZHRoICogcmVhbFNjYWxlLCBwYWdlSGVpZ2h0ICogcmVhbFNjYWxlXTtcblx0ICB9XG5cdCAgc2V0RGltcyh3aWR0aCwgaGVpZ2h0KSB7XG5cdCAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG5cdCAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IGAkezEwMCAqIHdpZHRoIC8gcGFyZW50V2lkdGh9JWA7XG5cdCAgICB0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSBgJHsxMDAgKiBoZWlnaHQgLyBwYXJlbnRIZWlnaHR9JWA7XG5cdCAgfVxuXHQgIGZpeERpbXMoKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHN0eWxlXG5cdCAgICB9ID0gdGhpcy5kaXY7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGhlaWdodCxcblx0ICAgICAgd2lkdGhcblx0ICAgIH0gPSBzdHlsZTtcblx0ICAgIGNvbnN0IHdpZHRoUGVyY2VudCA9IHdpZHRoLmVuZHNXaXRoKFwiJVwiKTtcblx0ICAgIGNvbnN0IGhlaWdodFBlcmNlbnQgPSBoZWlnaHQuZW5kc1dpdGgoXCIlXCIpO1xuXHQgICAgaWYgKHdpZHRoUGVyY2VudCAmJiBoZWlnaHRQZXJjZW50KSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcblx0ICAgIGlmICghd2lkdGhQZXJjZW50KSB7XG5cdCAgICAgIHN0eWxlLndpZHRoID0gYCR7MTAwICogcGFyc2VGbG9hdCh3aWR0aCkgLyBwYXJlbnRXaWR0aH0lYDtcblx0ICAgIH1cblx0ICAgIGlmICghaGVpZ2h0UGVyY2VudCkge1xuXHQgICAgICBzdHlsZS5oZWlnaHQgPSBgJHsxMDAgKiBwYXJzZUZsb2F0KGhlaWdodCkgLyBwYXJlbnRIZWlnaHR9JWA7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldEluaXRpYWxUcmFuc2xhdGlvbigpIHtcblx0ICAgIHJldHVybiBbMCwgMF07XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtZWRpdG9yLXJvdGF0aW9uXCIsICgzNjAgLSB0aGlzLnJvdGF0aW9uKSAlIDM2MCk7XG5cdCAgICB0aGlzLmRpdi5jbGFzc05hbWUgPSB0aGlzLm5hbWU7XG5cdCAgICB0aGlzLmRpdi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmlkKTtcblx0ICAgIHRoaXMuZGl2LnNldEF0dHJpYnV0ZShcInRhYkluZGV4XCIsIDApO1xuXHQgICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcblx0ICAgIHRoaXMuZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2JvdW5kRm9jdXNpbik7XG5cdCAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jYm91bmRGb2N1c291dCk7XG5cdCAgICBjb25zdCBbdHgsIHR5XSA9IHRoaXMuZ2V0SW5pdGlhbFRyYW5zbGF0aW9uKCk7XG5cdCAgICB0aGlzLnRyYW5zbGF0ZSh0eCwgdHkpO1xuXHQgICAgKDAsIF90b29scy5iaW5kRXZlbnRzKSh0aGlzLCB0aGlzLmRpdiwgW1wiZHJhZ3N0YXJ0XCIsIFwicG9pbnRlcmRvd25cIl0pO1xuXHQgICAgcmV0dXJuIHRoaXMuZGl2O1xuXHQgIH1cblx0ICBwb2ludGVyZG93bihldmVudCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBpc01hY1xuXHQgICAgfSA9IF91dGlsLkZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuXHQgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG5cdCAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmIChldmVudC5jdHJsS2V5ICYmICFpc01hYyB8fCBldmVudC5zaGlmdEtleSB8fCBldmVudC5tZXRhS2V5ICYmIGlzTWFjKSB7XG5cdCAgICAgIHRoaXMucGFyZW50LnRvZ2dsZVNlbGVjdGVkKHRoaXMpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5wYXJlbnQuc2V0U2VsZWN0ZWQodGhpcyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNoYXNCZWVuU2VsZWN0ZWQgPSB0cnVlO1xuXHQgIH1cblx0ICBnZXRSZWN0KHR4LCB0eSkge1xuXHQgICAgY29uc3Qgc2NhbGUgPSB0aGlzLnBhcmVudFNjYWxlO1xuXHQgICAgY29uc3QgW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF0gPSB0aGlzLnBhZ2VEaW1lbnNpb25zO1xuXHQgICAgY29uc3QgW3BhZ2VYLCBwYWdlWV0gPSB0aGlzLnBhZ2VUcmFuc2xhdGlvbjtcblx0ICAgIGNvbnN0IHNoaWZ0WCA9IHR4IC8gc2NhbGU7XG5cdCAgICBjb25zdCBzaGlmdFkgPSB0eSAvIHNjYWxlO1xuXHQgICAgY29uc3QgeCA9IHRoaXMueCAqIHBhZ2VXaWR0aDtcblx0ICAgIGNvbnN0IHkgPSB0aGlzLnkgKiBwYWdlSGVpZ2h0O1xuXHQgICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoICogcGFnZVdpZHRoO1xuXHQgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKiBwYWdlSGVpZ2h0O1xuXHQgICAgc3dpdGNoICh0aGlzLnJvdGF0aW9uKSB7XG5cdCAgICAgIGNhc2UgMDpcblx0ICAgICAgICByZXR1cm4gW3ggKyBzaGlmdFggKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFkgLSBoZWlnaHQgKyBwYWdlWSwgeCArIHNoaWZ0WCArIHdpZHRoICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5IC0gc2hpZnRZICsgcGFnZVldO1xuXHQgICAgICBjYXNlIDkwOlxuXHQgICAgICAgIHJldHVybiBbeCArIHNoaWZ0WSArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSArIHNoaWZ0WCArIHBhZ2VZLCB4ICsgc2hpZnRZICsgaGVpZ2h0ICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRYICsgd2lkdGggKyBwYWdlWV07XG5cdCAgICAgIGNhc2UgMTgwOlxuXHQgICAgICAgIHJldHVybiBbeCAtIHNoaWZ0WCAtIHdpZHRoICsgcGFnZVgsIHBhZ2VIZWlnaHQgLSB5ICsgc2hpZnRZICsgcGFnZVksIHggLSBzaGlmdFggKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgKyBzaGlmdFkgKyBoZWlnaHQgKyBwYWdlWV07XG5cdCAgICAgIGNhc2UgMjcwOlxuXHQgICAgICAgIHJldHVybiBbeCAtIHNoaWZ0WSAtIGhlaWdodCArIHBhZ2VYLCBwYWdlSGVpZ2h0IC0geSAtIHNoaWZ0WCAtIHdpZHRoICsgcGFnZVksIHggLSBzaGlmdFkgKyBwYWdlWCwgcGFnZUhlaWdodCAtIHkgLSBzaGlmdFggKyBwYWdlWV07XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCByb3RhdGlvblwiKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0UmVjdEluQ3VycmVudENvb3JkcyhyZWN0LCBwYWdlSGVpZ2h0KSB7XG5cdCAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gcmVjdDtcblx0ICAgIGNvbnN0IHdpZHRoID0geDIgLSB4MTtcblx0ICAgIGNvbnN0IGhlaWdodCA9IHkyIC0geTE7XG5cdCAgICBzd2l0Y2ggKHRoaXMucm90YXRpb24pIHtcblx0ICAgICAgY2FzZSAwOlxuXHQgICAgICAgIHJldHVybiBbeDEsIHBhZ2VIZWlnaHQgLSB5Miwgd2lkdGgsIGhlaWdodF07XG5cdCAgICAgIGNhc2UgOTA6XG5cdCAgICAgICAgcmV0dXJuIFt4MSwgcGFnZUhlaWdodCAtIHkxLCBoZWlnaHQsIHdpZHRoXTtcblx0ICAgICAgY2FzZSAxODA6XG5cdCAgICAgICAgcmV0dXJuIFt4MiwgcGFnZUhlaWdodCAtIHkxLCB3aWR0aCwgaGVpZ2h0XTtcblx0ICAgICAgY2FzZSAyNzA6XG5cdCAgICAgICAgcmV0dXJuIFt4MiwgcGFnZUhlaWdodCAtIHkyLCBoZWlnaHQsIHdpZHRoXTtcblx0ICAgICAgZGVmYXVsdDpcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJvdGF0aW9uXCIpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBvbmNlQWRkZWQoKSB7fVxuXHQgIGlzRW1wdHkoKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXHQgIGVuYWJsZUVkaXRNb2RlKCkge1xuXHQgICAgdGhpcy4jaXNJbkVkaXRNb2RlID0gdHJ1ZTtcblx0ICB9XG5cdCAgZGlzYWJsZUVkaXRNb2RlKCkge1xuXHQgICAgdGhpcy4jaXNJbkVkaXRNb2RlID0gZmFsc2U7XG5cdCAgfVxuXHQgIGlzSW5FZGl0TW9kZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLiNpc0luRWRpdE1vZGU7XG5cdCAgfVxuXHQgIHNob3VsZEdldEtleWJvYXJkRXZlbnRzKCkge1xuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0ICBuZWVkc1RvQmVSZWJ1aWx0KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuZGl2ICYmICF0aGlzLmlzQXR0YWNoZWRUb0RPTTtcblx0ICB9XG5cdCAgcmVidWlsZCgpIHtcblx0ICAgIHRoaXMuZGl2Py5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCB0aGlzLiNib3VuZEZvY3VzaW4pO1xuXHQgIH1cblx0ICBzZXJpYWxpemUoKSB7XG5cdCAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiQW4gZWRpdG9yIG11c3QgYmUgc2VyaWFsaXphYmxlXCIpO1xuXHQgIH1cblx0ICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcblx0ICAgIGNvbnN0IGVkaXRvciA9IG5ldyB0aGlzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcih7XG5cdCAgICAgIHBhcmVudCxcblx0ICAgICAgaWQ6IHBhcmVudC5nZXROZXh0SWQoKSxcblx0ICAgICAgdWlNYW5hZ2VyXG5cdCAgICB9KTtcblx0ICAgIGVkaXRvci5yb3RhdGlvbiA9IGRhdGEucm90YXRpb247XG5cdCAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IGVkaXRvci5wYWdlRGltZW5zaW9ucztcblx0ICAgIGNvbnN0IFt4LCB5LCB3aWR0aCwgaGVpZ2h0XSA9IGVkaXRvci5nZXRSZWN0SW5DdXJyZW50Q29vcmRzKGRhdGEucmVjdCwgcGFnZUhlaWdodCk7XG5cdCAgICBlZGl0b3IueCA9IHggLyBwYWdlV2lkdGg7XG5cdCAgICBlZGl0b3IueSA9IHkgLyBwYWdlSGVpZ2h0O1xuXHQgICAgZWRpdG9yLndpZHRoID0gd2lkdGggLyBwYWdlV2lkdGg7XG5cdCAgICBlZGl0b3IuaGVpZ2h0ID0gaGVpZ2h0IC8gcGFnZUhlaWdodDtcblx0ICAgIHJldHVybiBlZGl0b3I7XG5cdCAgfVxuXHQgIHJlbW92ZSgpIHtcblx0ICAgIHRoaXMuZGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIHRoaXMuI2JvdW5kRm9jdXNpbik7XG5cdCAgICB0aGlzLmRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jYm91bmRGb2N1c291dCk7XG5cdCAgICBpZiAoIXRoaXMuaXNFbXB0eSgpKSB7XG5cdCAgICAgIHRoaXMuY29tbWl0KCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLnBhcmVudC5yZW1vdmUodGhpcyk7XG5cdCAgfVxuXHQgIHNlbGVjdCgpIHtcblx0ICAgIHRoaXMuZGl2Py5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRFZGl0b3JcIik7XG5cdCAgfVxuXHQgIHVuc2VsZWN0KCkge1xuXHQgICAgdGhpcy5kaXY/LmNsYXNzTGlzdC5yZW1vdmUoXCJzZWxlY3RlZEVkaXRvclwiKTtcblx0ICB9XG5cdCAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7fVxuXHQgIGRpc2FibGVFZGl0aW5nKCkge31cblx0ICBlbmFibGVFZGl0aW5nKCkge31cblx0ICBnZXQgcHJvcGVydGllc1RvVXBkYXRlKCkge1xuXHQgICAgcmV0dXJuIHt9O1xuXHQgIH1cblx0ICBnZXQgY29udGVudERpdigpIHtcblx0ICAgIHJldHVybiB0aGlzLmRpdjtcblx0ICB9XG5cdCAgZ2V0IGlzRWRpdGluZygpIHtcblx0ICAgIHJldHVybiB0aGlzLiNpc0VkaXRpbmc7XG5cdCAgfVxuXHQgIHNldCBpc0VkaXRpbmcodmFsdWUpIHtcblx0ICAgIHRoaXMuI2lzRWRpdGluZyA9IHZhbHVlO1xuXHQgICAgaWYgKHZhbHVlKSB7XG5cdCAgICAgIHRoaXMucGFyZW50LnNldFNlbGVjdGVkKHRoaXMpO1xuXHQgICAgICB0aGlzLnBhcmVudC5zZXRBY3RpdmVFZGl0b3IodGhpcyk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLnBhcmVudC5zZXRBY3RpdmVFZGl0b3IobnVsbCk7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvciA9IEFubm90YXRpb25FZGl0b3I7XG5cblx0LyoqKi8gfSksXG5cdC8qIDUgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLktleWJvYXJkTWFuYWdlciA9IGV4cG9ydHMuQ29tbWFuZE1hbmFnZXIgPSBleHBvcnRzLkNvbG9yTWFuYWdlciA9IGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciA9IHZvaWQgMDtcblx0ZXhwb3J0cy5iaW5kRXZlbnRzID0gYmluZEV2ZW50cztcblx0ZXhwb3J0cy5vcGFjaXR5VG9IZXggPSBvcGFjaXR5VG9IZXg7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7XG5cdGZ1bmN0aW9uIGJpbmRFdmVudHMob2JqLCBlbGVtZW50LCBuYW1lcykge1xuXHQgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuXHQgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIG9ialtuYW1lXS5iaW5kKG9iaikpO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBvcGFjaXR5VG9IZXgob3BhY2l0eSkge1xuXHQgIHJldHVybiBNYXRoLnJvdW5kKE1hdGgubWluKDI1NSwgTWF0aC5tYXgoMSwgMjU1ICogb3BhY2l0eSkpKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpO1xuXHR9XG5cdGNsYXNzIElkTWFuYWdlciB7XG5cdCAgI2lkID0gMDtcblx0ICBnZXRJZCgpIHtcblx0ICAgIHJldHVybiBgJHtfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUHJlZml4fSR7dGhpcy4jaWQrK31gO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBDb21tYW5kTWFuYWdlciB7XG5cdCAgI2NvbW1hbmRzID0gW107XG5cdCAgI2xvY2tlZCA9IGZhbHNlO1xuXHQgICNtYXhTaXplO1xuXHQgICNwb3NpdGlvbiA9IC0xO1xuXHQgIGNvbnN0cnVjdG9yKG1heFNpemUgPSAxMjgpIHtcblx0ICAgIHRoaXMuI21heFNpemUgPSBtYXhTaXplO1xuXHQgIH1cblx0ICBhZGQoe1xuXHQgICAgY21kLFxuXHQgICAgdW5kbyxcblx0ICAgIG11c3RFeGVjLFxuXHQgICAgdHlwZSA9IE5hTixcblx0ICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGUgPSBmYWxzZSxcblx0ICAgIGtlZXBVbmRvID0gZmFsc2Vcblx0ICB9KSB7XG5cdCAgICBpZiAobXVzdEV4ZWMpIHtcblx0ICAgICAgY21kKCk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy4jbG9ja2VkKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHNhdmUgPSB7XG5cdCAgICAgIGNtZCxcblx0ICAgICAgdW5kbyxcblx0ICAgICAgdHlwZVxuXHQgICAgfTtcblx0ICAgIGlmICh0aGlzLiNwb3NpdGlvbiA9PT0gLTEpIHtcblx0ICAgICAgaWYgKHRoaXMuI2NvbW1hbmRzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICB0aGlzLiNjb21tYW5kcy5sZW5ndGggPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuI3Bvc2l0aW9uID0gMDtcblx0ICAgICAgdGhpcy4jY29tbWFuZHMucHVzaChzYXZlKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKG92ZXJ3cml0ZUlmU2FtZVR5cGUgJiYgdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dLnR5cGUgPT09IHR5cGUpIHtcblx0ICAgICAgaWYgKGtlZXBVbmRvKSB7XG5cdCAgICAgICAgc2F2ZS51bmRvID0gdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dLnVuZG87XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy4jY29tbWFuZHNbdGhpcy4jcG9zaXRpb25dID0gc2F2ZTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgbmV4dCA9IHRoaXMuI3Bvc2l0aW9uICsgMTtcblx0ICAgIGlmIChuZXh0ID09PSB0aGlzLiNtYXhTaXplKSB7XG5cdCAgICAgIHRoaXMuI2NvbW1hbmRzLnNwbGljZSgwLCAxKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuI3Bvc2l0aW9uID0gbmV4dDtcblx0ICAgICAgaWYgKG5leHQgPCB0aGlzLiNjb21tYW5kcy5sZW5ndGgpIHtcblx0ICAgICAgICB0aGlzLiNjb21tYW5kcy5zcGxpY2UobmV4dCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuI2NvbW1hbmRzLnB1c2goc2F2ZSk7XG5cdCAgfVxuXHQgIHVuZG8oKSB7XG5cdCAgICBpZiAodGhpcy4jcG9zaXRpb24gPT09IC0xKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2xvY2tlZCA9IHRydWU7XG5cdCAgICB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl0udW5kbygpO1xuXHQgICAgdGhpcy4jbG9ja2VkID0gZmFsc2U7XG5cdCAgICB0aGlzLiNwb3NpdGlvbiAtPSAxO1xuXHQgIH1cblx0ICByZWRvKCkge1xuXHQgICAgaWYgKHRoaXMuI3Bvc2l0aW9uIDwgdGhpcy4jY29tbWFuZHMubGVuZ3RoIC0gMSkge1xuXHQgICAgICB0aGlzLiNwb3NpdGlvbiArPSAxO1xuXHQgICAgICB0aGlzLiNsb2NrZWQgPSB0cnVlO1xuXHQgICAgICB0aGlzLiNjb21tYW5kc1t0aGlzLiNwb3NpdGlvbl0uY21kKCk7XG5cdCAgICAgIHRoaXMuI2xvY2tlZCA9IGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblx0ICBoYXNTb21ldGhpbmdUb1VuZG8oKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jcG9zaXRpb24gIT09IC0xO1xuXHQgIH1cblx0ICBoYXNTb21ldGhpbmdUb1JlZG8oKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jcG9zaXRpb24gPCB0aGlzLiNjb21tYW5kcy5sZW5ndGggLSAxO1xuXHQgIH1cblx0ICBkZXN0cm95KCkge1xuXHQgICAgdGhpcy4jY29tbWFuZHMgPSBudWxsO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkNvbW1hbmRNYW5hZ2VyID0gQ29tbWFuZE1hbmFnZXI7XG5cdGNsYXNzIEtleWJvYXJkTWFuYWdlciB7XG5cdCAgY29uc3RydWN0b3IoY2FsbGJhY2tzKSB7XG5cdCAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuXHQgICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgTWFwKCk7XG5cdCAgICB0aGlzLmFsbEtleXMgPSBuZXcgU2V0KCk7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGlzTWFjXG5cdCAgICB9ID0gX3V0aWwuRmVhdHVyZVRlc3QucGxhdGZvcm07XG5cdCAgICBmb3IgKGNvbnN0IFtrZXlzLCBjYWxsYmFja10gb2YgY2FsbGJhY2tzKSB7XG5cdCAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcblx0ICAgICAgICBjb25zdCBpc01hY0tleSA9IGtleS5zdGFydHNXaXRoKFwibWFjK1wiKTtcblx0ICAgICAgICBpZiAoaXNNYWMgJiYgaXNNYWNLZXkpIHtcblx0ICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldChrZXkuc2xpY2UoNCksIGNhbGxiYWNrKTtcblx0ICAgICAgICAgIHRoaXMuYWxsS2V5cy5hZGQoa2V5LnNwbGl0KFwiK1wiKS5hdCgtMSkpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoIWlzTWFjICYmICFpc01hY0tleSkge1xuXHQgICAgICAgICAgdGhpcy5jYWxsYmFja3Muc2V0KGtleSwgY2FsbGJhY2spO1xuXHQgICAgICAgICAgdGhpcy5hbGxLZXlzLmFkZChrZXkuc3BsaXQoXCIrXCIpLmF0KC0xKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgICNzZXJpYWxpemUoZXZlbnQpIHtcblx0ICAgIGlmIChldmVudC5hbHRLZXkpIHtcblx0ICAgICAgdGhpcy5idWZmZXIucHVzaChcImFsdFwiKTtcblx0ICAgIH1cblx0ICAgIGlmIChldmVudC5jdHJsS2V5KSB7XG5cdCAgICAgIHRoaXMuYnVmZmVyLnB1c2goXCJjdHJsXCIpO1xuXHQgICAgfVxuXHQgICAgaWYgKGV2ZW50Lm1ldGFLZXkpIHtcblx0ICAgICAgdGhpcy5idWZmZXIucHVzaChcIm1ldGFcIik7XG5cdCAgICB9XG5cdCAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcblx0ICAgICAgdGhpcy5idWZmZXIucHVzaChcInNoaWZ0XCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5idWZmZXIucHVzaChldmVudC5rZXkpO1xuXHQgICAgY29uc3Qgc3RyID0gdGhpcy5idWZmZXIuam9pbihcIitcIik7XG5cdCAgICB0aGlzLmJ1ZmZlci5sZW5ndGggPSAwO1xuXHQgICAgcmV0dXJuIHN0cjtcblx0ICB9XG5cdCAgZXhlYyhzZWxmLCBldmVudCkge1xuXHQgICAgaWYgKCF0aGlzLmFsbEtleXMuaGFzKGV2ZW50LmtleSkpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrcy5nZXQodGhpcy4jc2VyaWFsaXplKGV2ZW50KSk7XG5cdCAgICBpZiAoIWNhbGxiYWNrKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNhbGxiYWNrLmJpbmQoc2VsZikoKTtcblx0ICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5LZXlib2FyZE1hbmFnZXIgPSBLZXlib2FyZE1hbmFnZXI7XG5cdGNsYXNzIENvbG9yTWFuYWdlciB7XG5cdCAgc3RhdGljIF9jb2xvcnNNYXBwaW5nID0gbmV3IE1hcChbW1wiQ2FudmFzVGV4dFwiLCBbMCwgMCwgMF1dLCBbXCJDYW52YXNcIiwgWzI1NSwgMjU1LCAyNTVdXV0pO1xuXHQgIGdldCBfY29sb3JzKCkge1xuXHQgICAgY29uc3QgY29sb3JzID0gbmV3IE1hcChbW1wiQ2FudmFzVGV4dFwiLCBudWxsXSwgW1wiQ2FudmFzXCIsIG51bGxdXSk7XG5cdCAgICAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q29sb3JWYWx1ZXMpKGNvbG9ycyk7XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJfY29sb3JzXCIsIGNvbG9ycyk7XG5cdCAgfVxuXHQgIGNvbnZlcnQoY29sb3IpIHtcblx0ICAgIGNvbnN0IHJnYiA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRSR0IpKGNvbG9yKTtcblx0ICAgIGlmICghd2luZG93Lm1hdGNoTWVkaWEoXCIoZm9yY2VkLWNvbG9yczogYWN0aXZlKVwiKS5tYXRjaGVzKSB7XG5cdCAgICAgIHJldHVybiByZ2I7XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IFtuYW1lLCBSR0JdIG9mIHRoaXMuX2NvbG9ycykge1xuXHQgICAgICBpZiAoUkdCLmV2ZXJ5KCh4LCBpKSA9PiB4ID09PSByZ2JbaV0pKSB7XG5cdCAgICAgICAgcmV0dXJuIENvbG9yTWFuYWdlci5fY29sb3JzTWFwcGluZy5nZXQobmFtZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiByZ2I7XG5cdCAgfVxuXHQgIGdldEhleENvZGUobmFtZSkge1xuXHQgICAgY29uc3QgcmdiID0gdGhpcy5fY29sb3JzLmdldChuYW1lKTtcblx0ICAgIGlmICghcmdiKSB7XG5cdCAgICAgIHJldHVybiBuYW1lO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIF91dGlsLlV0aWwubWFrZUhleENvbG9yKC4uLnJnYik7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQ29sb3JNYW5hZ2VyID0gQ29sb3JNYW5hZ2VyO1xuXHRjbGFzcyBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyIHtcblx0ICAjYWN0aXZlRWRpdG9yID0gbnVsbDtcblx0ICAjYWxsRWRpdG9ycyA9IG5ldyBNYXAoKTtcblx0ICAjYWxsTGF5ZXJzID0gbmV3IE1hcCgpO1xuXHQgICNhbm5vdGF0aW9uU3RvcmFnZSA9IG51bGw7XG5cdCAgI2NvbW1hbmRNYW5hZ2VyID0gbmV3IENvbW1hbmRNYW5hZ2VyKCk7XG5cdCAgI2N1cnJlbnRQYWdlSW5kZXggPSAwO1xuXHQgICNlZGl0b3JUeXBlcyA9IG51bGw7XG5cdCAgI2VkaXRvcnNUb1Jlc2NhbGUgPSBuZXcgU2V0KCk7XG5cdCAgI2V2ZW50QnVzID0gbnVsbDtcblx0ICAjaWRNYW5hZ2VyID0gbmV3IElkTWFuYWdlcigpO1xuXHQgICNpc0VuYWJsZWQgPSBmYWxzZTtcblx0ICAjbW9kZSA9IF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLk5PTkU7XG5cdCAgI3NlbGVjdGVkRWRpdG9ycyA9IG5ldyBTZXQoKTtcblx0ICAjYm91bmRDb3B5ID0gdGhpcy5jb3B5LmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kQ3V0ID0gdGhpcy5jdXQuYmluZCh0aGlzKTtcblx0ICAjYm91bmRQYXN0ZSA9IHRoaXMucGFzdGUuYmluZCh0aGlzKTtcblx0ICAjYm91bmRLZXlkb3duID0gdGhpcy5rZXlkb3duLmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kT25FZGl0aW5nQWN0aW9uID0gdGhpcy5vbkVkaXRpbmdBY3Rpb24uYmluZCh0aGlzKTtcblx0ICAjYm91bmRPblBhZ2VDaGFuZ2luZyA9IHRoaXMub25QYWdlQ2hhbmdpbmcuYmluZCh0aGlzKTtcblx0ICAjYm91bmRPblNjYWxlQ2hhbmdpbmcgPSB0aGlzLm9uU2NhbGVDaGFuZ2luZy5iaW5kKHRoaXMpO1xuXHQgICNib3VuZE9uUm90YXRpb25DaGFuZ2luZyA9IHRoaXMub25Sb3RhdGlvbkNoYW5naW5nLmJpbmQodGhpcyk7XG5cdCAgI3ByZXZpb3VzU3RhdGVzID0ge1xuXHQgICAgaXNFZGl0aW5nOiBmYWxzZSxcblx0ICAgIGlzRW1wdHk6IHRydWUsXG5cdCAgICBoYXNTb21ldGhpbmdUb1VuZG86IGZhbHNlLFxuXHQgICAgaGFzU29tZXRoaW5nVG9SZWRvOiBmYWxzZSxcblx0ICAgIGhhc1NlbGVjdGVkRWRpdG9yOiBmYWxzZVxuXHQgIH07XG5cdCAgI2NvbnRhaW5lciA9IG51bGw7XG5cdCAgc3RhdGljIF9rZXlib2FyZE1hbmFnZXIgPSBuZXcgS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiY3RybCthXCIsIFwibWFjK21ldGErYVwiXSwgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5wcm90b3R5cGUuc2VsZWN0QWxsXSwgW1tcImN0cmwrelwiLCBcIm1hYyttZXRhK3pcIl0sIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlLnVuZG9dLCBbW1wiY3RybCt5XCIsIFwiY3RybCtzaGlmdCtaXCIsIFwibWFjK21ldGErc2hpZnQrWlwiXSwgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5wcm90b3R5cGUucmVkb10sIFtbXCJCYWNrc3BhY2VcIiwgXCJhbHQrQmFja3NwYWNlXCIsIFwiY3RybCtCYWNrc3BhY2VcIiwgXCJzaGlmdCtCYWNrc3BhY2VcIiwgXCJtYWMrQmFja3NwYWNlXCIsIFwibWFjK2FsdCtCYWNrc3BhY2VcIiwgXCJtYWMrY3RybCtCYWNrc3BhY2VcIiwgXCJEZWxldGVcIiwgXCJjdHJsK0RlbGV0ZVwiLCBcInNoaWZ0K0RlbGV0ZVwiXSwgQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlci5wcm90b3R5cGUuZGVsZXRlXSwgW1tcIkVzY2FwZVwiLCBcIm1hYytFc2NhcGVcIl0sIEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXIucHJvdG90eXBlLnVuc2VsZWN0QWxsXV0pO1xuXHQgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgZXZlbnRCdXMsIGFubm90YXRpb25TdG9yYWdlKSB7XG5cdCAgICB0aGlzLiNjb250YWluZXIgPSBjb250YWluZXI7XG5cdCAgICB0aGlzLiNldmVudEJ1cyA9IGV2ZW50QnVzO1xuXHQgICAgdGhpcy4jZXZlbnRCdXMuX29uKFwiZWRpdGluZ2FjdGlvblwiLCB0aGlzLiNib3VuZE9uRWRpdGluZ0FjdGlvbik7XG5cdCAgICB0aGlzLiNldmVudEJ1cy5fb24oXCJwYWdlY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblBhZ2VDaGFuZ2luZyk7XG5cdCAgICB0aGlzLiNldmVudEJ1cy5fb24oXCJzY2FsZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25TY2FsZUNoYW5naW5nKTtcblx0ICAgIHRoaXMuI2V2ZW50QnVzLl9vbihcInJvdGF0aW9uY2hhbmdpbmdcIiwgdGhpcy4jYm91bmRPblJvdGF0aW9uQ2hhbmdpbmcpO1xuXHQgICAgdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2UgPSBhbm5vdGF0aW9uU3RvcmFnZTtcblx0ICAgIHRoaXMudmlld1BhcmFtZXRlcnMgPSB7XG5cdCAgICAgIHJlYWxTY2FsZTogX2Rpc3BsYXlfdXRpbHMuUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTLFxuXHQgICAgICByb3RhdGlvbjogMFxuXHQgICAgfTtcblx0ICB9XG5cdCAgZGVzdHJveSgpIHtcblx0ICAgIHRoaXMuI3JlbW92ZUtleWJvYXJkTWFuYWdlcigpO1xuXHQgICAgdGhpcy4jZXZlbnRCdXMuX29mZihcImVkaXRpbmdhY3Rpb25cIiwgdGhpcy4jYm91bmRPbkVkaXRpbmdBY3Rpb24pO1xuXHQgICAgdGhpcy4jZXZlbnRCdXMuX29mZihcInBhZ2VjaGFuZ2luZ1wiLCB0aGlzLiNib3VuZE9uUGFnZUNoYW5naW5nKTtcblx0ICAgIHRoaXMuI2V2ZW50QnVzLl9vZmYoXCJzY2FsZWNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25TY2FsZUNoYW5naW5nKTtcblx0ICAgIHRoaXMuI2V2ZW50QnVzLl9vZmYoXCJyb3RhdGlvbmNoYW5naW5nXCIsIHRoaXMuI2JvdW5kT25Sb3RhdGlvbkNoYW5naW5nKTtcblx0ICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG5cdCAgICAgIGxheWVyLmRlc3Ryb3koKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2FsbExheWVycy5jbGVhcigpO1xuXHQgICAgdGhpcy4jYWxsRWRpdG9ycy5jbGVhcigpO1xuXHQgICAgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZS5jbGVhcigpO1xuXHQgICAgdGhpcy4jYWN0aXZlRWRpdG9yID0gbnVsbDtcblx0ICAgIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5jbGVhcigpO1xuXHQgICAgdGhpcy4jY29tbWFuZE1hbmFnZXIuZGVzdHJveSgpO1xuXHQgIH1cblx0ICBvblBhZ2VDaGFuZ2luZyh7XG5cdCAgICBwYWdlTnVtYmVyXG5cdCAgfSkge1xuXHQgICAgdGhpcy4jY3VycmVudFBhZ2VJbmRleCA9IHBhZ2VOdW1iZXIgLSAxO1xuXHQgIH1cblx0ICBmb2N1c01haW5Db250YWluZXIoKSB7XG5cdCAgICB0aGlzLiNjb250YWluZXIuZm9jdXMoKTtcblx0ICB9XG5cdCAgYWRkU2hvdWxkUmVzY2FsZShlZGl0b3IpIHtcblx0ICAgIHRoaXMuI2VkaXRvcnNUb1Jlc2NhbGUuYWRkKGVkaXRvcik7XG5cdCAgfVxuXHQgIHJlbW92ZVNob3VsZFJlc2NhbGUoZWRpdG9yKSB7XG5cdCAgICB0aGlzLiNlZGl0b3JzVG9SZXNjYWxlLmRlbGV0ZShlZGl0b3IpO1xuXHQgIH1cblx0ICBvblNjYWxlQ2hhbmdpbmcoe1xuXHQgICAgc2NhbGVcblx0ICB9KSB7XG5cdCAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG5cdCAgICB0aGlzLnZpZXdQYXJhbWV0ZXJzLnJlYWxTY2FsZSA9IHNjYWxlICogX2Rpc3BsYXlfdXRpbHMuUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTO1xuXHQgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9yc1RvUmVzY2FsZSkge1xuXHQgICAgICBlZGl0b3Iub25TY2FsZUNoYW5naW5nKCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIG9uUm90YXRpb25DaGFuZ2luZyh7XG5cdCAgICBwYWdlc1JvdGF0aW9uXG5cdCAgfSkge1xuXHQgICAgdGhpcy5jb21taXRPclJlbW92ZSgpO1xuXHQgICAgdGhpcy52aWV3UGFyYW1ldGVycy5yb3RhdGlvbiA9IHBhZ2VzUm90YXRpb247XG5cdCAgfVxuXHQgIGFkZFRvQW5ub3RhdGlvblN0b3JhZ2UoZWRpdG9yKSB7XG5cdCAgICBpZiAoIWVkaXRvci5pc0VtcHR5KCkgJiYgdGhpcy4jYW5ub3RhdGlvblN0b3JhZ2UgJiYgIXRoaXMuI2Fubm90YXRpb25TdG9yYWdlLmhhcyhlZGl0b3IuaWQpKSB7XG5cdCAgICAgIHRoaXMuI2Fubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKGVkaXRvci5pZCwgZWRpdG9yKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgI2FkZEtleWJvYXJkTWFuYWdlcigpIHtcblx0ICAgIHRoaXMuI2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEtleWRvd24pO1xuXHQgIH1cblx0ICAjcmVtb3ZlS2V5Ym9hcmRNYW5hZ2VyKCkge1xuXHQgICAgdGhpcy4jY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuI2JvdW5kS2V5ZG93bik7XG5cdCAgfVxuXHQgICNhZGRDb3B5UGFzdGVMaXN0ZW5lcnMoKSB7XG5cdCAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29weVwiLCB0aGlzLiNib3VuZENvcHkpO1xuXHQgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImN1dFwiLCB0aGlzLiNib3VuZEN1dCk7XG5cdCAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy4jYm91bmRQYXN0ZSk7XG5cdCAgfVxuXHQgICNyZW1vdmVDb3B5UGFzdGVMaXN0ZW5lcnMoKSB7XG5cdCAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29weVwiLCB0aGlzLiNib3VuZENvcHkpO1xuXHQgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImN1dFwiLCB0aGlzLiNib3VuZEN1dCk7XG5cdCAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy4jYm91bmRQYXN0ZSk7XG5cdCAgfVxuXHQgIGNvcHkoZXZlbnQpIHtcblx0ICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICBpZiAodGhpcy4jYWN0aXZlRWRpdG9yKSB7XG5cdCAgICAgIHRoaXMuI2FjdGl2ZUVkaXRvci5jb21taXRPclJlbW92ZSgpO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBlZGl0b3JzID0gW107XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcblx0ICAgICAgaWYgKCFlZGl0b3IuaXNFbXB0eSgpKSB7XG5cdCAgICAgICAgZWRpdG9ycy5wdXNoKGVkaXRvci5zZXJpYWxpemUoKSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChlZGl0b3JzLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoXCJhcHBsaWNhdGlvbi9wZGZqc1wiLCBKU09OLnN0cmluZ2lmeShlZGl0b3JzKSk7XG5cdCAgfVxuXHQgIGN1dChldmVudCkge1xuXHQgICAgdGhpcy5jb3B5KGV2ZW50KTtcblx0ICAgIHRoaXMuZGVsZXRlKCk7XG5cdCAgfVxuXHQgIHBhc3RlKGV2ZW50KSB7XG5cdCAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgbGV0IGRhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEoXCJhcHBsaWNhdGlvbi9wZGZqc1wiKTtcblx0ICAgIGlmICghZGF0YSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0cnkge1xuXHQgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblx0ICAgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShgcGFzdGU6IFwiJHtleC5tZXNzYWdlfVwiLmApO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy51bnNlbGVjdEFsbCgpO1xuXHQgICAgY29uc3QgbGF5ZXIgPSB0aGlzLiNhbGxMYXllcnMuZ2V0KHRoaXMuI2N1cnJlbnRQYWdlSW5kZXgpO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgY29uc3QgbmV3RWRpdG9ycyA9IFtdO1xuXHQgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBkYXRhKSB7XG5cdCAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkRWRpdG9yID0gbGF5ZXIuZGVzZXJpYWxpemUoZWRpdG9yKTtcblx0ICAgICAgICBpZiAoIWRlc2VyaWFsaXplZEVkaXRvcikge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBuZXdFZGl0b3JzLnB1c2goZGVzZXJpYWxpemVkRWRpdG9yKTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBjbWQgPSAoKSA9PiB7XG5cdCAgICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgbmV3RWRpdG9ycykge1xuXHQgICAgICAgICAgdGhpcy4jYWRkRWRpdG9yVG9MYXllcihlZGl0b3IpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLiNzZWxlY3RFZGl0b3JzKG5ld0VkaXRvcnMpO1xuXHQgICAgICB9O1xuXHQgICAgICBjb25zdCB1bmRvID0gKCkgPT4ge1xuXHQgICAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIG5ld0VkaXRvcnMpIHtcblx0ICAgICAgICAgIGVkaXRvci5yZW1vdmUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuXHQgICAgICAgIGNtZCxcblx0ICAgICAgICB1bmRvLFxuXHQgICAgICAgIG11c3RFeGVjOiB0cnVlXG5cdCAgICAgIH0pO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgKDAsIF91dGlsLndhcm4pKGBwYXN0ZTogXCIke2V4Lm1lc3NhZ2V9XCIuYCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGtleWRvd24oZXZlbnQpIHtcblx0ICAgIGlmICghdGhpcy5nZXRBY3RpdmUoKT8uc2hvdWxkR2V0S2V5Ym9hcmRFdmVudHMoKSkge1xuXHQgICAgICBBbm5vdGF0aW9uRWRpdG9yVUlNYW5hZ2VyLl9rZXlib2FyZE1hbmFnZXIuZXhlYyh0aGlzLCBldmVudCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIG9uRWRpdGluZ0FjdGlvbihkZXRhaWxzKSB7XG5cdCAgICBpZiAoW1widW5kb1wiLCBcInJlZG9cIiwgXCJkZWxldGVcIiwgXCJzZWxlY3RBbGxcIl0uaW5jbHVkZXMoZGV0YWlscy5uYW1lKSkge1xuXHQgICAgICB0aGlzW2RldGFpbHMubmFtZV0oKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKGRldGFpbHMpIHtcblx0ICAgIGNvbnN0IGhhc0NoYW5nZWQgPSBPYmplY3QuZW50cmllcyhkZXRhaWxzKS5zb21lKChba2V5LCB2YWx1ZV0pID0+IHRoaXMuI3ByZXZpb3VzU3RhdGVzW2tleV0gIT09IHZhbHVlKTtcblx0ICAgIGlmIChoYXNDaGFuZ2VkKSB7XG5cdCAgICAgIHRoaXMuI2V2ZW50QnVzLmRpc3BhdGNoKFwiYW5ub3RhdGlvbmVkaXRvcnN0YXRlc2NoYW5nZWRcIiwge1xuXHQgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICBkZXRhaWxzOiBPYmplY3QuYXNzaWduKHRoaXMuI3ByZXZpb3VzU3RhdGVzLCBkZXRhaWxzKVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgI2Rpc3BhdGNoVXBkYXRlVUkoZGV0YWlscykge1xuXHQgICAgdGhpcy4jZXZlbnRCdXMuZGlzcGF0Y2goXCJhbm5vdGF0aW9uZWRpdG9ycGFyYW1zY2hhbmdlZFwiLCB7XG5cdCAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgZGV0YWlsc1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHNldEVkaXRpbmdTdGF0ZShpc0VkaXRpbmcpIHtcblx0ICAgIGlmIChpc0VkaXRpbmcpIHtcblx0ICAgICAgdGhpcy4jYWRkS2V5Ym9hcmRNYW5hZ2VyKCk7XG5cdCAgICAgIHRoaXMuI2FkZENvcHlQYXN0ZUxpc3RlbmVycygpO1xuXHQgICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG5cdCAgICAgICAgaXNFZGl0aW5nOiB0aGlzLiNtb2RlICE9PSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5OT05FLFxuXHQgICAgICAgIGlzRW1wdHk6IHRoaXMuI2lzRW1wdHkoKSxcblx0ICAgICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvVW5kbygpLFxuXHQgICAgICAgIGhhc1NvbWV0aGluZ1RvUmVkbzogdGhpcy4jY29tbWFuZE1hbmFnZXIuaGFzU29tZXRoaW5nVG9SZWRvKCksXG5cdCAgICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IGZhbHNlXG5cdCAgICAgIH0pO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy4jcmVtb3ZlS2V5Ym9hcmRNYW5hZ2VyKCk7XG5cdCAgICAgIHRoaXMuI3JlbW92ZUNvcHlQYXN0ZUxpc3RlbmVycygpO1xuXHQgICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG5cdCAgICAgICAgaXNFZGl0aW5nOiBmYWxzZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgcmVnaXN0ZXJFZGl0b3JUeXBlcyh0eXBlcykge1xuXHQgICAgaWYgKHRoaXMuI2VkaXRvclR5cGVzKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2VkaXRvclR5cGVzID0gdHlwZXM7XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcblx0ICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3JUeXBlLmRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXRJZCgpIHtcblx0ICAgIHJldHVybiB0aGlzLiNpZE1hbmFnZXIuZ2V0SWQoKTtcblx0ICB9XG5cdCAgZ2V0IGN1cnJlbnRMYXllcigpIHtcblx0ICAgIHJldHVybiB0aGlzLiNhbGxMYXllcnMuZ2V0KHRoaXMuI2N1cnJlbnRQYWdlSW5kZXgpO1xuXHQgIH1cblx0ICBnZXQgY3VycmVudFBhZ2VJbmRleCgpIHtcblx0ICAgIHJldHVybiB0aGlzLiNjdXJyZW50UGFnZUluZGV4O1xuXHQgIH1cblx0ICBhZGRMYXllcihsYXllcikge1xuXHQgICAgdGhpcy4jYWxsTGF5ZXJzLnNldChsYXllci5wYWdlSW5kZXgsIGxheWVyKTtcblx0ICAgIGlmICh0aGlzLiNpc0VuYWJsZWQpIHtcblx0ICAgICAgbGF5ZXIuZW5hYmxlKCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBsYXllci5kaXNhYmxlKCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJlbW92ZUxheWVyKGxheWVyKSB7XG5cdCAgICB0aGlzLiNhbGxMYXllcnMuZGVsZXRlKGxheWVyLnBhZ2VJbmRleCk7XG5cdCAgfVxuXHQgIHVwZGF0ZU1vZGUobW9kZSkge1xuXHQgICAgdGhpcy4jbW9kZSA9IG1vZGU7XG5cdCAgICBpZiAobW9kZSA9PT0gX3V0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuTk9ORSkge1xuXHQgICAgICB0aGlzLnNldEVkaXRpbmdTdGF0ZShmYWxzZSk7XG5cdCAgICAgIHRoaXMuI2Rpc2FibGVBbGwoKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuc2V0RWRpdGluZ1N0YXRlKHRydWUpO1xuXHQgICAgICB0aGlzLiNlbmFibGVBbGwoKTtcblx0ICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLiNhbGxMYXllcnMudmFsdWVzKCkpIHtcblx0ICAgICAgICBsYXllci51cGRhdGVNb2RlKG1vZGUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgIHVwZGF0ZVRvb2xiYXIobW9kZSkge1xuXHQgICAgaWYgKG1vZGUgPT09IHRoaXMuI21vZGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jZXZlbnRCdXMuZGlzcGF0Y2goXCJzd2l0Y2hhbm5vdGF0aW9uZWRpdG9ybW9kZVwiLCB7XG5cdCAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgbW9kZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSkge1xuXHQgICAgaWYgKCF0aGlzLiNlZGl0b3JUeXBlcykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcblx0ICAgICAgZWRpdG9yLnVwZGF0ZVBhcmFtcyh0eXBlLCB2YWx1ZSk7XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvclR5cGUgb2YgdGhpcy4jZWRpdG9yVHlwZXMpIHtcblx0ICAgICAgZWRpdG9yVHlwZS51cGRhdGVEZWZhdWx0UGFyYW1zKHR5cGUsIHZhbHVlKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgI2VuYWJsZUFsbCgpIHtcblx0ICAgIGlmICghdGhpcy4jaXNFbmFibGVkKSB7XG5cdCAgICAgIHRoaXMuI2lzRW5hYmxlZCA9IHRydWU7XG5cdCAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy4jYWxsTGF5ZXJzLnZhbHVlcygpKSB7XG5cdCAgICAgICAgbGF5ZXIuZW5hYmxlKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdCAgI2Rpc2FibGVBbGwoKSB7XG5cdCAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XG5cdCAgICBpZiAodGhpcy4jaXNFbmFibGVkKSB7XG5cdCAgICAgIHRoaXMuI2lzRW5hYmxlZCA9IGZhbHNlO1xuXHQgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuI2FsbExheWVycy52YWx1ZXMoKSkge1xuXHQgICAgICAgIGxheWVyLmRpc2FibGUoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICBnZXRFZGl0b3JzKHBhZ2VJbmRleCkge1xuXHQgICAgY29uc3QgZWRpdG9ycyA9IFtdO1xuXHQgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jYWxsRWRpdG9ycy52YWx1ZXMoKSkge1xuXHQgICAgICBpZiAoZWRpdG9yLnBhZ2VJbmRleCA9PT0gcGFnZUluZGV4KSB7XG5cdCAgICAgICAgZWRpdG9ycy5wdXNoKGVkaXRvcik7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBlZGl0b3JzO1xuXHQgIH1cblx0ICBnZXRFZGl0b3IoaWQpIHtcblx0ICAgIHJldHVybiB0aGlzLiNhbGxFZGl0b3JzLmdldChpZCk7XG5cdCAgfVxuXHQgIGFkZEVkaXRvcihlZGl0b3IpIHtcblx0ICAgIHRoaXMuI2FsbEVkaXRvcnMuc2V0KGVkaXRvci5pZCwgZWRpdG9yKTtcblx0ICB9XG5cdCAgcmVtb3ZlRWRpdG9yKGVkaXRvcikge1xuXHQgICAgdGhpcy4jYWxsRWRpdG9ycy5kZWxldGUoZWRpdG9yLmlkKTtcblx0ICAgIHRoaXMudW5zZWxlY3QoZWRpdG9yKTtcblx0ICAgIHRoaXMuI2Fubm90YXRpb25TdG9yYWdlPy5yZW1vdmUoZWRpdG9yLmlkKTtcblx0ICB9XG5cdCAgI2FkZEVkaXRvclRvTGF5ZXIoZWRpdG9yKSB7XG5cdCAgICBjb25zdCBsYXllciA9IHRoaXMuI2FsbExheWVycy5nZXQoZWRpdG9yLnBhZ2VJbmRleCk7XG5cdCAgICBpZiAobGF5ZXIpIHtcblx0ICAgICAgbGF5ZXIuYWRkT3JSZWJ1aWxkKGVkaXRvcik7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmFkZEVkaXRvcihlZGl0b3IpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzZXRBY3RpdmVFZGl0b3IoZWRpdG9yKSB7XG5cdCAgICBpZiAodGhpcy4jYWN0aXZlRWRpdG9yID09PSBlZGl0b3IpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jYWN0aXZlRWRpdG9yID0gZWRpdG9yO1xuXHQgICAgaWYgKGVkaXRvcikge1xuXHQgICAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvci5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuXHQgICAgfVxuXHQgIH1cblx0ICB0b2dnbGVTZWxlY3RlZChlZGl0b3IpIHtcblx0ICAgIGlmICh0aGlzLiNzZWxlY3RlZEVkaXRvcnMuaGFzKGVkaXRvcikpIHtcblx0ICAgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmRlbGV0ZShlZGl0b3IpO1xuXHQgICAgICBlZGl0b3IudW5zZWxlY3QoKTtcblx0ICAgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuXHQgICAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiB0aGlzLmhhc1NlbGVjdGlvblxuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmFkZChlZGl0b3IpO1xuXHQgICAgZWRpdG9yLnNlbGVjdCgpO1xuXHQgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVVSShlZGl0b3IucHJvcGVydGllc1RvVXBkYXRlKTtcblx0ICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcblx0ICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBzZXRTZWxlY3RlZChlZGl0b3IpIHtcblx0ICAgIGZvciAoY29uc3QgZWQgb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG5cdCAgICAgIGlmIChlZCAhPT0gZWRpdG9yKSB7XG5cdCAgICAgICAgZWQudW5zZWxlY3QoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmNsZWFyKCk7XG5cdCAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuYWRkKGVkaXRvcik7XG5cdCAgICBlZGl0b3Iuc2VsZWN0KCk7XG5cdCAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVVJKGVkaXRvci5wcm9wZXJ0aWVzVG9VcGRhdGUpO1xuXHQgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuXHQgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGlzU2VsZWN0ZWQoZWRpdG9yKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmhhcyhlZGl0b3IpO1xuXHQgIH1cblx0ICB1bnNlbGVjdChlZGl0b3IpIHtcblx0ICAgIGVkaXRvci51bnNlbGVjdCgpO1xuXHQgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmRlbGV0ZShlZGl0b3IpO1xuXHQgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuXHQgICAgICBoYXNTZWxlY3RlZEVkaXRvcjogdGhpcy5oYXNTZWxlY3Rpb25cblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXQgaGFzU2VsZWN0aW9uKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI3NlbGVjdGVkRWRpdG9ycy5zaXplICE9PSAwO1xuXHQgIH1cblx0ICB1bmRvKCkge1xuXHQgICAgdGhpcy4jY29tbWFuZE1hbmFnZXIudW5kbygpO1xuXHQgICAgdGhpcy4jZGlzcGF0Y2hVcGRhdGVTdGF0ZXMoe1xuXHQgICAgICBoYXNTb21ldGhpbmdUb1VuZG86IHRoaXMuI2NvbW1hbmRNYW5hZ2VyLmhhc1NvbWV0aGluZ1RvVW5kbygpLFxuXHQgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IHRydWUsXG5cdCAgICAgIGlzRW1wdHk6IHRoaXMuI2lzRW1wdHkoKVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlZG8oKSB7XG5cdCAgICB0aGlzLiNjb21tYW5kTWFuYWdlci5yZWRvKCk7XG5cdCAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG5cdCAgICAgIGhhc1NvbWV0aGluZ1RvVW5kbzogdHJ1ZSxcblx0ICAgICAgaGFzU29tZXRoaW5nVG9SZWRvOiB0aGlzLiNjb21tYW5kTWFuYWdlci5oYXNTb21ldGhpbmdUb1JlZG8oKSxcblx0ICAgICAgaXNFbXB0eTogdGhpcy4jaXNFbXB0eSgpXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgYWRkQ29tbWFuZHMocGFyYW1zKSB7XG5cdCAgICB0aGlzLiNjb21tYW5kTWFuYWdlci5hZGQocGFyYW1zKTtcblx0ICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcblx0ICAgICAgaGFzU29tZXRoaW5nVG9VbmRvOiB0cnVlLFxuXHQgICAgICBoYXNTb21ldGhpbmdUb1JlZG86IGZhbHNlLFxuXHQgICAgICBpc0VtcHR5OiB0aGlzLiNpc0VtcHR5KClcblx0ICAgIH0pO1xuXHQgIH1cblx0ICAjaXNFbXB0eSgpIHtcblx0ICAgIGlmICh0aGlzLiNhbGxFZGl0b3JzLnNpemUgPT09IDApIHtcblx0ICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy4jYWxsRWRpdG9ycy5zaXplID09PSAxKSB7XG5cdCAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2FsbEVkaXRvcnMudmFsdWVzKCkpIHtcblx0ICAgICAgICByZXR1cm4gZWRpdG9yLmlzRW1wdHkoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGZhbHNlO1xuXHQgIH1cblx0ICBkZWxldGUoKSB7XG5cdCAgICB0aGlzLmNvbW1pdE9yUmVtb3ZlKCk7XG5cdCAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGVkaXRvcnMgPSBbLi4udGhpcy4jc2VsZWN0ZWRFZGl0b3JzXTtcblx0ICAgIGNvbnN0IGNtZCA9ICgpID0+IHtcblx0ICAgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgZWRpdG9ycykge1xuXHQgICAgICAgIGVkaXRvci5yZW1vdmUoKTtcblx0ICAgICAgfVxuXHQgICAgfTtcblx0ICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG5cdCAgICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcblx0ICAgICAgICB0aGlzLiNhZGRFZGl0b3JUb0xheWVyKGVkaXRvcik7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICB0aGlzLmFkZENvbW1hbmRzKHtcblx0ICAgICAgY21kLFxuXHQgICAgICB1bmRvLFxuXHQgICAgICBtdXN0RXhlYzogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGNvbW1pdE9yUmVtb3ZlKCkge1xuXHQgICAgdGhpcy4jYWN0aXZlRWRpdG9yPy5jb21taXRPclJlbW92ZSgpO1xuXHQgIH1cblx0ICAjc2VsZWN0RWRpdG9ycyhlZGl0b3JzKSB7XG5cdCAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuY2xlYXIoKTtcblx0ICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIGVkaXRvcnMpIHtcblx0ICAgICAgaWYgKGVkaXRvci5pc0VtcHR5KCkpIHtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLiNzZWxlY3RlZEVkaXRvcnMuYWRkKGVkaXRvcik7XG5cdCAgICAgIGVkaXRvci5zZWxlY3QoKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2Rpc3BhdGNoVXBkYXRlU3RhdGVzKHtcblx0ICAgICAgaGFzU2VsZWN0ZWRFZGl0b3I6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBzZWxlY3RBbGwoKSB7XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNzZWxlY3RlZEVkaXRvcnMpIHtcblx0ICAgICAgZWRpdG9yLmNvbW1pdCgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jc2VsZWN0RWRpdG9ycyh0aGlzLiNhbGxFZGl0b3JzLnZhbHVlcygpKTtcblx0ICB9XG5cdCAgdW5zZWxlY3RBbGwoKSB7XG5cdCAgICBpZiAodGhpcy4jYWN0aXZlRWRpdG9yKSB7XG5cdCAgICAgIHRoaXMuI2FjdGl2ZUVkaXRvci5jb21taXRPclJlbW92ZSgpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy4jc2VsZWN0ZWRFZGl0b3JzLnNpemUgPT09IDApIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzKSB7XG5cdCAgICAgIGVkaXRvci51bnNlbGVjdCgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jc2VsZWN0ZWRFZGl0b3JzLmNsZWFyKCk7XG5cdCAgICB0aGlzLiNkaXNwYXRjaFVwZGF0ZVN0YXRlcyh7XG5cdCAgICAgIGhhc1NlbGVjdGVkRWRpdG9yOiBmYWxzZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGlzQWN0aXZlKGVkaXRvcikge1xuXHQgICAgcmV0dXJuIHRoaXMuI2FjdGl2ZUVkaXRvciA9PT0gZWRpdG9yO1xuXHQgIH1cblx0ICBnZXRBY3RpdmUoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jYWN0aXZlRWRpdG9yO1xuXHQgIH1cblx0ICBnZXRNb2RlKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI21vZGU7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlciA9IEFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI7XG5cblx0LyoqKi8gfSksXG5cdC8qIDYgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLlN0YXRUaW1lciA9IGV4cG9ydHMuUmVuZGVyaW5nQ2FuY2VsbGVkRXhjZXB0aW9uID0gZXhwb3J0cy5QaXhlbHNQZXJJbmNoID0gZXhwb3J0cy5QYWdlVmlld3BvcnQgPSBleHBvcnRzLlBERkRhdGVTdHJpbmcgPSBleHBvcnRzLkRPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gZXhwb3J0cy5ET01TVkdGYWN0b3J5ID0gZXhwb3J0cy5ET01GaWx0ZXJGYWN0b3J5ID0gZXhwb3J0cy5ET01DYW52YXNGYWN0b3J5ID0gZXhwb3J0cy5ET01DTWFwUmVhZGVyRmFjdG9yeSA9IGV4cG9ydHMuQW5ub3RhdGlvblByZWZpeCA9IHZvaWQgMDtcblx0ZXhwb3J0cy5kZXByZWNhdGVkID0gZGVwcmVjYXRlZDtcblx0ZXhwb3J0cy5nZXRDb2xvclZhbHVlcyA9IGdldENvbG9yVmFsdWVzO1xuXHRleHBvcnRzLmdldEN1cnJlbnRUcmFuc2Zvcm0gPSBnZXRDdXJyZW50VHJhbnNmb3JtO1xuXHRleHBvcnRzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlID0gZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2U7XG5cdGV4cG9ydHMuZ2V0RmlsZW5hbWVGcm9tVXJsID0gZ2V0RmlsZW5hbWVGcm9tVXJsO1xuXHRleHBvcnRzLmdldFBkZkZpbGVuYW1lRnJvbVVybCA9IGdldFBkZkZpbGVuYW1lRnJvbVVybDtcblx0ZXhwb3J0cy5nZXRSR0IgPSBnZXRSR0I7XG5cdGV4cG9ydHMuZ2V0WGZhUGFnZVZpZXdwb3J0ID0gZ2V0WGZhUGFnZVZpZXdwb3J0O1xuXHRleHBvcnRzLmlzRGF0YVNjaGVtZSA9IGlzRGF0YVNjaGVtZTtcblx0ZXhwb3J0cy5pc1BkZkZpbGUgPSBpc1BkZkZpbGU7XG5cdGV4cG9ydHMuaXNWYWxpZEZldGNoVXJsID0gaXNWYWxpZEZldGNoVXJsO1xuXHRleHBvcnRzLmxvYWRTY3JpcHQgPSBsb2FkU2NyaXB0O1xuXHRleHBvcnRzLnNldExheWVyRGltZW5zaW9ucyA9IHNldExheWVyRGltZW5zaW9ucztcblx0dmFyIF9iYXNlX2ZhY3RvcnkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHRjb25zdCBTVkdfTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7XG5cdGNvbnN0IEFubm90YXRpb25QcmVmaXggPSBcInBkZmpzX2ludGVybmFsX2lkX1wiO1xuXHRleHBvcnRzLkFubm90YXRpb25QcmVmaXggPSBBbm5vdGF0aW9uUHJlZml4O1xuXHRjbGFzcyBQaXhlbHNQZXJJbmNoIHtcblx0ICBzdGF0aWMgQ1NTID0gOTYuMDtcblx0ICBzdGF0aWMgUERGID0gNzIuMDtcblx0ICBzdGF0aWMgUERGX1RPX0NTU19VTklUUyA9IHRoaXMuQ1NTIC8gdGhpcy5QREY7XG5cdH1cblx0ZXhwb3J0cy5QaXhlbHNQZXJJbmNoID0gUGl4ZWxzUGVySW5jaDtcblx0Y2xhc3MgRE9NRmlsdGVyRmFjdG9yeSBleHRlbmRzIF9iYXNlX2ZhY3RvcnkuQmFzZUZpbHRlckZhY3Rvcnkge1xuXHQgICNfY2FjaGU7XG5cdCAgI19kZWZzO1xuXHQgICNkb2NJZDtcblx0ICAjZG9jdW1lbnQ7XG5cdCAgI2hjbUZpbHRlcjtcblx0ICAjaGNtS2V5O1xuXHQgICNoY21Vcmw7XG5cdCAgI2lkID0gMDtcblx0ICBjb25zdHJ1Y3Rvcih7XG5cdCAgICBkb2NJZCxcblx0ICAgIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxUaGlzLmRvY3VtZW50XG5cdCAgfSA9IHt9KSB7XG5cdCAgICBzdXBlcigpO1xuXHQgICAgdGhpcy4jZG9jSWQgPSBkb2NJZDtcblx0ICAgIHRoaXMuI2RvY3VtZW50ID0gb3duZXJEb2N1bWVudDtcblx0ICB9XG5cdCAgZ2V0ICNjYWNoZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLiNfY2FjaGUgfHw9IG5ldyBNYXAoKTtcblx0ICB9XG5cdCAgZ2V0ICNkZWZzKCkge1xuXHQgICAgaWYgKCF0aGlzLiNfZGVmcykge1xuXHQgICAgICBjb25zdCBkaXYgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgc3R5bGVcblx0ICAgICAgfSA9IGRpdjtcblx0ICAgICAgc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG5cdCAgICAgIHN0eWxlLmNvbnRhaW4gPSBcInN0cmljdFwiO1xuXHQgICAgICBzdHlsZS53aWR0aCA9IHN0eWxlLmhlaWdodCA9IDA7XG5cdCAgICAgIHN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXHQgICAgICBzdHlsZS50b3AgPSBzdHlsZS5sZWZ0ID0gMDtcblx0ICAgICAgc3R5bGUuekluZGV4ID0gLTE7XG5cdCAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuXHQgICAgICBzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgMCk7XG5cdCAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgMCk7XG5cdCAgICAgIHRoaXMuI19kZWZzID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJkZWZzXCIpO1xuXHQgICAgICBkaXYuYXBwZW5kKHN2Zyk7XG5cdCAgICAgIHN2Zy5hcHBlbmQodGhpcy4jX2RlZnMpO1xuXHQgICAgICB0aGlzLiNkb2N1bWVudC5ib2R5LmFwcGVuZChkaXYpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMuI19kZWZzO1xuXHQgIH1cblx0ICAjYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIGZ1bmMsIHRhYmxlKSB7XG5cdCAgICBjb25zdCBmZUZ1bmMgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBmdW5jKTtcblx0ICAgIGZlRnVuYy5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZGlzY3JldGVcIik7XG5cdCAgICBmZUZ1bmMuc2V0QXR0cmlidXRlKFwidGFibGVWYWx1ZXNcIiwgdGFibGUpO1xuXHQgICAgZmVDb21wb25lbnRUcmFuc2Zlci5hcHBlbmQoZmVGdW5jKTtcblx0ICB9XG5cdCAgYWRkRmlsdGVyKG1hcHMpIHtcblx0ICAgIGlmICghbWFwcykge1xuXHQgICAgICByZXR1cm4gXCJub25lXCI7XG5cdCAgICB9XG5cdCAgICBsZXQgdmFsdWUgPSB0aGlzLiNjYWNoZS5nZXQobWFwcyk7XG5cdCAgICBpZiAodmFsdWUpIHtcblx0ICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgfVxuXHQgICAgbGV0IHRhYmxlUiwgdGFibGVHLCB0YWJsZUIsIGtleTtcblx0ICAgIGlmIChtYXBzLmxlbmd0aCA9PT0gMSkge1xuXHQgICAgICBjb25zdCBtYXBSID0gbWFwc1swXTtcblx0ICAgICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5KDI1Nik7XG5cdCAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgICBidWZmZXJbaV0gPSBtYXBSW2ldIC8gMjU1O1xuXHQgICAgICB9XG5cdCAgICAgIGtleSA9IHRhYmxlUiA9IHRhYmxlRyA9IHRhYmxlQiA9IGJ1ZmZlci5qb2luKFwiLFwiKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IFttYXBSLCBtYXBHLCBtYXBCXSA9IG1hcHM7XG5cdCAgICAgIGNvbnN0IGJ1ZmZlclIgPSBuZXcgQXJyYXkoMjU2KTtcblx0ICAgICAgY29uc3QgYnVmZmVyRyA9IG5ldyBBcnJheSgyNTYpO1xuXHQgICAgICBjb25zdCBidWZmZXJCID0gbmV3IEFycmF5KDI1Nik7XG5cdCAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHtcblx0ICAgICAgICBidWZmZXJSW2ldID0gbWFwUltpXSAvIDI1NTtcblx0ICAgICAgICBidWZmZXJHW2ldID0gbWFwR1tpXSAvIDI1NTtcblx0ICAgICAgICBidWZmZXJCW2ldID0gbWFwQltpXSAvIDI1NTtcblx0ICAgICAgfVxuXHQgICAgICB0YWJsZVIgPSBidWZmZXJSLmpvaW4oXCIsXCIpO1xuXHQgICAgICB0YWJsZUcgPSBidWZmZXJHLmpvaW4oXCIsXCIpO1xuXHQgICAgICB0YWJsZUIgPSBidWZmZXJCLmpvaW4oXCIsXCIpO1xuXHQgICAgICBrZXkgPSBgJHt0YWJsZVJ9JHt0YWJsZUd9JHt0YWJsZUJ9YDtcblx0ICAgIH1cblx0ICAgIHZhbHVlID0gdGhpcy4jY2FjaGUuZ2V0KGtleSk7XG5cdCAgICBpZiAodmFsdWUpIHtcblx0ICAgICAgdGhpcy4jY2FjaGUuc2V0KG1hcHMsIHZhbHVlKTtcblx0ICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgfVxuXHQgICAgY29uc3QgaWQgPSBgZ18ke3RoaXMuI2RvY0lkfV90cmFuc2Zlcl9tYXBfJHt0aGlzLiNpZCsrfWA7XG5cdCAgICBjb25zdCB1cmwgPSBgdXJsKCMke2lkfSlgO1xuXHQgICAgdGhpcy4jY2FjaGUuc2V0KG1hcHMsIHVybCk7XG5cdCAgICB0aGlzLiNjYWNoZS5zZXQoa2V5LCB1cmwpO1xuXHQgICAgY29uc3QgZmlsdGVyID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmaWx0ZXJcIiwgU1ZHX05TKTtcblx0ICAgIGZpbHRlci5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBpZCk7XG5cdCAgICBmaWx0ZXIuc2V0QXR0cmlidXRlKFwiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzXCIsIFwic1JHQlwiKTtcblx0ICAgIGNvbnN0IGZlQ29tcG9uZW50VHJhbnNmZXIgPSB0aGlzLiNkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcImZlQ29tcG9uZW50VHJhbnNmZXJcIik7XG5cdCAgICBmaWx0ZXIuYXBwZW5kKGZlQ29tcG9uZW50VHJhbnNmZXIpO1xuXHQgICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jUlwiLCB0YWJsZVIpO1xuXHQgICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jR1wiLCB0YWJsZUcpO1xuXHQgICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jQlwiLCB0YWJsZUIpO1xuXHQgICAgdGhpcy4jZGVmcy5hcHBlbmQoZmlsdGVyKTtcblx0ICAgIHJldHVybiB1cmw7XG5cdCAgfVxuXHQgIGFkZEhDTUZpbHRlcihmZ0NvbG9yLCBiZ0NvbG9yKSB7XG5cdCAgICBjb25zdCBrZXkgPSBgJHtmZ0NvbG9yfS0ke2JnQ29sb3J9YDtcblx0ICAgIGlmICh0aGlzLiNoY21LZXkgPT09IGtleSkge1xuXHQgICAgICByZXR1cm4gdGhpcy4jaGNtVXJsO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jaGNtS2V5ID0ga2V5O1xuXHQgICAgdGhpcy4jaGNtVXJsID0gXCJub25lXCI7XG5cdCAgICB0aGlzLiNoY21GaWx0ZXI/LnJlbW92ZSgpO1xuXHQgICAgaWYgKCFmZ0NvbG9yIHx8ICFiZ0NvbG9yKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiNoY21Vcmw7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNkZWZzLnN0eWxlLmNvbG9yID0gZmdDb2xvcjtcblx0ICAgIGZnQ29sb3IgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuI2RlZnMpLmdldFByb3BlcnR5VmFsdWUoXCJjb2xvclwiKTtcblx0ICAgIGNvbnN0IGZnUkdCID0gZ2V0UkdCKGZnQ29sb3IpO1xuXHQgICAgZmdDb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKC4uLmZnUkdCKTtcblx0ICAgIHRoaXMuI2RlZnMuc3R5bGUuY29sb3IgPSBiZ0NvbG9yO1xuXHQgICAgYmdDb2xvciA9IGdldENvbXB1dGVkU3R5bGUodGhpcy4jZGVmcykuZ2V0UHJvcGVydHlWYWx1ZShcImNvbG9yXCIpO1xuXHQgICAgY29uc3QgYmdSR0IgPSBnZXRSR0IoYmdDb2xvcik7XG5cdCAgICBiZ0NvbG9yID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IoLi4uYmdSR0IpO1xuXHQgICAgdGhpcy4jZGVmcy5zdHlsZS5jb2xvciA9IFwiXCI7XG5cdCAgICBpZiAoZmdDb2xvciA9PT0gXCIjMDAwMDAwXCIgJiYgYmdDb2xvciA9PT0gXCIjZmZmZmZmXCIgfHwgZmdDb2xvciA9PT0gYmdDb2xvcikge1xuXHQgICAgICByZXR1cm4gdGhpcy4jaGNtVXJsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgbWFwID0gbmV3IEFycmF5KDI1Nik7XG5cdCAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAyNTU7IGkrKykge1xuXHQgICAgICBjb25zdCB4ID0gaSAvIDI1NTtcblx0ICAgICAgbWFwW2ldID0geCA8PSAwLjAzOTI4ID8geCAvIDEyLjkyIDogKCh4ICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHRhYmxlID0gbWFwLmpvaW4oXCIsXCIpO1xuXHQgICAgY29uc3QgaWQgPSBgZ18ke3RoaXMuI2RvY0lkfV9oY21fZmlsdGVyYDtcblx0ICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuI2hjbUZpbHRlciA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmlsdGVyXCIsIFNWR19OUyk7XG5cdCAgICBmaWx0ZXIuc2V0QXR0cmlidXRlKFwiaWRcIiwgaWQpO1xuXHQgICAgZmlsdGVyLnNldEF0dHJpYnV0ZShcImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVyc1wiLCBcInNSR0JcIik7XG5cdCAgICBsZXQgZmVDb21wb25lbnRUcmFuc2ZlciA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmVDb21wb25lbnRUcmFuc2ZlclwiKTtcblx0ICAgIGZpbHRlci5hcHBlbmQoZmVDb21wb25lbnRUcmFuc2Zlcik7XG5cdCAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNSXCIsIHRhYmxlKTtcblx0ICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY0dcIiwgdGFibGUpO1xuXHQgICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jQlwiLCB0YWJsZSk7XG5cdCAgICBjb25zdCBmZUNvbG9yTWF0cml4ID0gdGhpcy4jZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJmZUNvbG9yTWF0cml4XCIpO1xuXHQgICAgZmVDb2xvck1hdHJpeC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwibWF0cml4XCIpO1xuXHQgICAgZmVDb2xvck1hdHJpeC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZXNcIiwgXCIwLjIxMjYgMC43MTUyIDAuMDcyMiAwIDAgMC4yMTI2IDAuNzE1MiAwLjA3MjIgMCAwIDAuMjEyNiAwLjcxNTIgMC4wNzIyIDAgMCAwIDAgMCAxIDBcIik7XG5cdCAgICBmaWx0ZXIuYXBwZW5kKGZlQ29sb3JNYXRyaXgpO1xuXHQgICAgZmVDb21wb25lbnRUcmFuc2ZlciA9IHRoaXMuI2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwiZmVDb21wb25lbnRUcmFuc2ZlclwiKTtcblx0ICAgIGZpbHRlci5hcHBlbmQoZmVDb21wb25lbnRUcmFuc2Zlcik7XG5cdCAgICBjb25zdCBnZXRTdGVwcyA9IChjLCBuKSA9PiB7XG5cdCAgICAgIGNvbnN0IHN0YXJ0ID0gZmdSR0JbY10gLyAyNTU7XG5cdCAgICAgIGNvbnN0IGVuZCA9IGJnUkdCW2NdIC8gMjU1O1xuXHQgICAgICBjb25zdCBhcnIgPSBuZXcgQXJyYXkobiArIDEpO1xuXHQgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBuOyBpKyspIHtcblx0ICAgICAgICBhcnJbaV0gPSBzdGFydCArIGkgLyBuICogKGVuZCAtIHN0YXJ0KTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYXJyLmpvaW4oXCIsXCIpO1xuXHQgICAgfTtcblx0ICAgIHRoaXMuI2FwcGVuZEZlRnVuYyhmZUNvbXBvbmVudFRyYW5zZmVyLCBcImZlRnVuY1JcIiwgZ2V0U3RlcHMoMCwgNSkpO1xuXHQgICAgdGhpcy4jYXBwZW5kRmVGdW5jKGZlQ29tcG9uZW50VHJhbnNmZXIsIFwiZmVGdW5jR1wiLCBnZXRTdGVwcygxLCA1KSk7XG5cdCAgICB0aGlzLiNhcHBlbmRGZUZ1bmMoZmVDb21wb25lbnRUcmFuc2ZlciwgXCJmZUZ1bmNCXCIsIGdldFN0ZXBzKDIsIDUpKTtcblx0ICAgIHRoaXMuI2RlZnMuYXBwZW5kKGZpbHRlcik7XG5cdCAgICB0aGlzLiNoY21VcmwgPSBgdXJsKCMke2lkfSlgO1xuXHQgICAgcmV0dXJuIHRoaXMuI2hjbVVybDtcblx0ICB9XG5cdCAgZGVzdHJveShrZWVwSENNID0gZmFsc2UpIHtcblx0ICAgIGlmIChrZWVwSENNICYmIHRoaXMuI2hjbVVybCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy4jX2RlZnMpIHtcblx0ICAgICAgdGhpcy4jX2RlZnMucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZSgpO1xuXHQgICAgICB0aGlzLiNfZGVmcyA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy4jX2NhY2hlKSB7XG5cdCAgICAgIHRoaXMuI19jYWNoZS5jbGVhcigpO1xuXHQgICAgICB0aGlzLiNfY2FjaGUgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jaWQgPSAwO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkRPTUZpbHRlckZhY3RvcnkgPSBET01GaWx0ZXJGYWN0b3J5O1xuXHRjbGFzcyBET01DYW52YXNGYWN0b3J5IGV4dGVuZHMgX2Jhc2VfZmFjdG9yeS5CYXNlQ2FudmFzRmFjdG9yeSB7XG5cdCAgY29uc3RydWN0b3Ioe1xuXHQgICAgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnRcblx0ICB9ID0ge30pIHtcblx0ICAgIHN1cGVyKCk7XG5cdCAgICB0aGlzLl9kb2N1bWVudCA9IG93bmVyRG9jdW1lbnQ7XG5cdCAgfVxuXHQgIF9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCkge1xuXHQgICAgY29uc3QgY2FudmFzID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblx0ICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuXHQgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcblx0ICAgIHJldHVybiBjYW52YXM7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuRE9NQ2FudmFzRmFjdG9yeSA9IERPTUNhbnZhc0ZhY3Rvcnk7XG5cdGFzeW5jIGZ1bmN0aW9uIGZldGNoRGF0YSh1cmwsIGFzVHlwZWRBcnJheSA9IGZhbHNlKSB7XG5cdCAgaWYgKGlzVmFsaWRGZXRjaFVybCh1cmwsIGRvY3VtZW50LmJhc2VVUkkpKSB7XG5cdCAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG5cdCAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBhc1R5cGVkQXJyYXkgPyBuZXcgVWludDhBcnJheShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKSA6ICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuXHQgIH1cblx0ICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHQgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXHQgICAgcmVxdWVzdC5vcGVuKFwiR0VUXCIsIHVybCwgdHJ1ZSk7XG5cdCAgICBpZiAoYXNUeXBlZEFycmF5KSB7XG5cdCAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuXHQgICAgfVxuXHQgICAgcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG5cdCAgICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzID09PSAyMDAgfHwgcmVxdWVzdC5zdGF0dXMgPT09IDApIHtcblx0ICAgICAgICBsZXQgZGF0YTtcblx0ICAgICAgICBpZiAoYXNUeXBlZEFycmF5ICYmIHJlcXVlc3QucmVzcG9uc2UpIHtcblx0ICAgICAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShyZXF1ZXN0LnJlc3BvbnNlKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKCFhc1R5cGVkQXJyYXkgJiYgcmVxdWVzdC5yZXNwb25zZVRleHQpIHtcblx0ICAgICAgICAgIGRhdGEgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoZGF0YSkge1xuXHQgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcblx0ICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmVqZWN0KG5ldyBFcnJvcihyZXF1ZXN0LnN0YXR1c1RleHQpKTtcblx0ICAgIH07XG5cdCAgICByZXF1ZXN0LnNlbmQobnVsbCk7XG5cdCAgfSk7XG5cdH1cblx0Y2xhc3MgRE9NQ01hcFJlYWRlckZhY3RvcnkgZXh0ZW5kcyBfYmFzZV9mYWN0b3J5LkJhc2VDTWFwUmVhZGVyRmFjdG9yeSB7XG5cdCAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuXHQgICAgcmV0dXJuIGZldGNoRGF0YSh1cmwsIHRoaXMuaXNDb21wcmVzc2VkKS50aGVuKGRhdGEgPT4ge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGNNYXBEYXRhOiBkYXRhLFxuXHQgICAgICAgIGNvbXByZXNzaW9uVHlwZVxuXHQgICAgICB9O1xuXHQgICAgfSk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuRE9NQ01hcFJlYWRlckZhY3RvcnkgPSBET01DTWFwUmVhZGVyRmFjdG9yeTtcblx0Y2xhc3MgRE9NU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgZXh0ZW5kcyBfYmFzZV9mYWN0b3J5LkJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG5cdCAgX2ZldGNoRGF0YSh1cmwpIHtcblx0ICAgIHJldHVybiBmZXRjaERhdGEodXJsLCB0cnVlKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5ET01TdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IERPTVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuXHRjbGFzcyBET01TVkdGYWN0b3J5IGV4dGVuZHMgX2Jhc2VfZmFjdG9yeS5CYXNlU1ZHRmFjdG9yeSB7XG5cdCAgX2NyZWF0ZVNWRyh0eXBlKSB7XG5cdCAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgdHlwZSk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuRE9NU1ZHRmFjdG9yeSA9IERPTVNWR0ZhY3Rvcnk7XG5cdGNsYXNzIFBhZ2VWaWV3cG9ydCB7XG5cdCAgY29uc3RydWN0b3Ioe1xuXHQgICAgdmlld0JveCxcblx0ICAgIHNjYWxlLFxuXHQgICAgcm90YXRpb24sXG5cdCAgICBvZmZzZXRYID0gMCxcblx0ICAgIG9mZnNldFkgPSAwLFxuXHQgICAgZG9udEZsaXAgPSBmYWxzZVxuXHQgIH0pIHtcblx0ICAgIHRoaXMudmlld0JveCA9IHZpZXdCb3g7XG5cdCAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG5cdCAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG5cdCAgICB0aGlzLm9mZnNldFggPSBvZmZzZXRYO1xuXHQgICAgdGhpcy5vZmZzZXRZID0gb2Zmc2V0WTtcblx0ICAgIGNvbnN0IGNlbnRlclggPSAodmlld0JveFsyXSArIHZpZXdCb3hbMF0pIC8gMjtcblx0ICAgIGNvbnN0IGNlbnRlclkgPSAodmlld0JveFszXSArIHZpZXdCb3hbMV0pIC8gMjtcblx0ICAgIGxldCByb3RhdGVBLCByb3RhdGVCLCByb3RhdGVDLCByb3RhdGVEO1xuXHQgICAgcm90YXRpb24gJT0gMzYwO1xuXHQgICAgaWYgKHJvdGF0aW9uIDwgMCkge1xuXHQgICAgICByb3RhdGlvbiArPSAzNjA7XG5cdCAgICB9XG5cdCAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG5cdCAgICAgIGNhc2UgMTgwOlxuXHQgICAgICAgIHJvdGF0ZUEgPSAtMTtcblx0ICAgICAgICByb3RhdGVCID0gMDtcblx0ICAgICAgICByb3RhdGVDID0gMDtcblx0ICAgICAgICByb3RhdGVEID0gMTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSA5MDpcblx0ICAgICAgICByb3RhdGVBID0gMDtcblx0ICAgICAgICByb3RhdGVCID0gMTtcblx0ICAgICAgICByb3RhdGVDID0gMTtcblx0ICAgICAgICByb3RhdGVEID0gMDtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSAyNzA6XG5cdCAgICAgICAgcm90YXRlQSA9IDA7XG5cdCAgICAgICAgcm90YXRlQiA9IC0xO1xuXHQgICAgICAgIHJvdGF0ZUMgPSAtMTtcblx0ICAgICAgICByb3RhdGVEID0gMDtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSAwOlxuXHQgICAgICAgIHJvdGF0ZUEgPSAxO1xuXHQgICAgICAgIHJvdGF0ZUIgPSAwO1xuXHQgICAgICAgIHJvdGF0ZUMgPSAwO1xuXHQgICAgICAgIHJvdGF0ZUQgPSAtMTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgZGVmYXVsdDpcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYWdlVmlld3BvcnQ6IEludmFsaWQgcm90YXRpb24sIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA5MCBkZWdyZWVzLlwiKTtcblx0ICAgIH1cblx0ICAgIGlmIChkb250RmxpcCkge1xuXHQgICAgICByb3RhdGVDID0gLXJvdGF0ZUM7XG5cdCAgICAgIHJvdGF0ZUQgPSAtcm90YXRlRDtcblx0ICAgIH1cblx0ICAgIGxldCBvZmZzZXRDYW52YXNYLCBvZmZzZXRDYW52YXNZO1xuXHQgICAgbGV0IHdpZHRoLCBoZWlnaHQ7XG5cdCAgICBpZiAocm90YXRlQSA9PT0gMCkge1xuXHQgICAgICBvZmZzZXRDYW52YXNYID0gTWF0aC5hYnMoY2VudGVyWSAtIHZpZXdCb3hbMV0pICogc2NhbGUgKyBvZmZzZXRYO1xuXHQgICAgICBvZmZzZXRDYW52YXNZID0gTWF0aC5hYnMoY2VudGVyWCAtIHZpZXdCb3hbMF0pICogc2NhbGUgKyBvZmZzZXRZO1xuXHQgICAgICB3aWR0aCA9ICh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTtcblx0ICAgICAgaGVpZ2h0ID0gKHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdKSAqIHNjYWxlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgb2Zmc2V0Q2FudmFzWCA9IE1hdGguYWJzKGNlbnRlclggLSB2aWV3Qm94WzBdKSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0ICAgICAgb2Zmc2V0Q2FudmFzWSA9IE1hdGguYWJzKGNlbnRlclkgLSB2aWV3Qm94WzFdKSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0ICAgICAgd2lkdGggPSAodmlld0JveFsyXSAtIHZpZXdCb3hbMF0pICogc2NhbGU7XG5cdCAgICAgIGhlaWdodCA9ICh2aWV3Qm94WzNdIC0gdmlld0JveFsxXSkgKiBzY2FsZTtcblx0ICAgIH1cblx0ICAgIHRoaXMudHJhbnNmb3JtID0gW3JvdGF0ZUEgKiBzY2FsZSwgcm90YXRlQiAqIHNjYWxlLCByb3RhdGVDICogc2NhbGUsIHJvdGF0ZUQgKiBzY2FsZSwgb2Zmc2V0Q2FudmFzWCAtIHJvdGF0ZUEgKiBzY2FsZSAqIGNlbnRlclggLSByb3RhdGVDICogc2NhbGUgKiBjZW50ZXJZLCBvZmZzZXRDYW52YXNZIC0gcm90YXRlQiAqIHNjYWxlICogY2VudGVyWCAtIHJvdGF0ZUQgKiBzY2FsZSAqIGNlbnRlclldO1xuXHQgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuXHQgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cdCAgfVxuXHQgIGdldCByYXdEaW1zKCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICB2aWV3Qm94XG5cdCAgICB9ID0gdGhpcztcblx0ICAgIHJldHVybiAoMCwgX3V0aWwuc2hhZG93KSh0aGlzLCBcInJhd0RpbXNcIiwge1xuXHQgICAgICBwYWdlV2lkdGg6IHZpZXdCb3hbMl0gLSB2aWV3Qm94WzBdLFxuXHQgICAgICBwYWdlSGVpZ2h0OiB2aWV3Qm94WzNdIC0gdmlld0JveFsxXSxcblx0ICAgICAgcGFnZVg6IHZpZXdCb3hbMF0sXG5cdCAgICAgIHBhZ2VZOiB2aWV3Qm94WzFdXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgY2xvbmUoe1xuXHQgICAgc2NhbGUgPSB0aGlzLnNjYWxlLFxuXHQgICAgcm90YXRpb24gPSB0aGlzLnJvdGF0aW9uLFxuXHQgICAgb2Zmc2V0WCA9IHRoaXMub2Zmc2V0WCxcblx0ICAgIG9mZnNldFkgPSB0aGlzLm9mZnNldFksXG5cdCAgICBkb250RmxpcCA9IGZhbHNlXG5cdCAgfSA9IHt9KSB7XG5cdCAgICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG5cdCAgICAgIHZpZXdCb3g6IHRoaXMudmlld0JveC5zbGljZSgpLFxuXHQgICAgICBzY2FsZSxcblx0ICAgICAgcm90YXRpb24sXG5cdCAgICAgIG9mZnNldFgsXG5cdCAgICAgIG9mZnNldFksXG5cdCAgICAgIGRvbnRGbGlwXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgY29udmVydFRvVmlld3BvcnRQb2ludCh4LCB5KSB7XG5cdCAgICByZXR1cm4gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbeCwgeV0sIHRoaXMudHJhbnNmb3JtKTtcblx0ICB9XG5cdCAgY29udmVydFRvVmlld3BvcnRSZWN0YW5nbGUocmVjdCkge1xuXHQgICAgY29uc3QgdG9wTGVmdCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMF0sIHJlY3RbMV1dLCB0aGlzLnRyYW5zZm9ybSk7XG5cdCAgICBjb25zdCBib3R0b21SaWdodCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3JlY3RbMl0sIHJlY3RbM11dLCB0aGlzLnRyYW5zZm9ybSk7XG5cdCAgICByZXR1cm4gW3RvcExlZnRbMF0sIHRvcExlZnRbMV0sIGJvdHRvbVJpZ2h0WzBdLCBib3R0b21SaWdodFsxXV07XG5cdCAgfVxuXHQgIGNvbnZlcnRUb1BkZlBvaW50KHgsIHkpIHtcblx0ICAgIHJldHVybiBfdXRpbC5VdGlsLmFwcGx5SW52ZXJzZVRyYW5zZm9ybShbeCwgeV0sIHRoaXMudHJhbnNmb3JtKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5QYWdlVmlld3BvcnQgPSBQYWdlVmlld3BvcnQ7XG5cdGNsYXNzIFJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbiBleHRlbmRzIF91dGlsLkJhc2VFeGNlcHRpb24ge1xuXHQgIGNvbnN0cnVjdG9yKG1zZywgdHlwZSwgZXh0cmFEZWxheSA9IDApIHtcblx0ICAgIHN1cGVyKG1zZywgXCJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb25cIik7XG5cdCAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXHQgICAgdGhpcy5leHRyYURlbGF5ID0gZXh0cmFEZWxheTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24gPSBSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb247XG5cdGZ1bmN0aW9uIGlzRGF0YVNjaGVtZSh1cmwpIHtcblx0ICBjb25zdCBpaSA9IHVybC5sZW5ndGg7XG5cdCAgbGV0IGkgPSAwO1xuXHQgIHdoaWxlIChpIDwgaWkgJiYgdXJsW2ldLnRyaW0oKSA9PT0gXCJcIikge1xuXHQgICAgaSsrO1xuXHQgIH1cblx0ICByZXR1cm4gdXJsLnN1YnN0cmluZyhpLCBpICsgNSkudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhOlwiO1xuXHR9XG5cdGZ1bmN0aW9uIGlzUGRmRmlsZShmaWxlbmFtZSkge1xuXHQgIHJldHVybiB0eXBlb2YgZmlsZW5hbWUgPT09IFwic3RyaW5nXCIgJiYgL1xcLnBkZiQvaS50ZXN0KGZpbGVuYW1lKTtcblx0fVxuXHRmdW5jdGlvbiBnZXRGaWxlbmFtZUZyb21VcmwodXJsLCBvbmx5U3RyaXBQYXRoID0gZmFsc2UpIHtcblx0ICBpZiAoIW9ubHlTdHJpcFBhdGgpIHtcblx0ICAgIFt1cmxdID0gdXJsLnNwbGl0KC9bIz9dLywgMSk7XG5cdCAgfVxuXHQgIHJldHVybiB1cmwuc3Vic3RyaW5nKHVybC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcblx0fVxuXHRmdW5jdGlvbiBnZXRQZGZGaWxlbmFtZUZyb21VcmwodXJsLCBkZWZhdWx0RmlsZW5hbWUgPSBcImRvY3VtZW50LnBkZlwiKSB7XG5cdCAgaWYgKHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIpIHtcblx0ICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7XG5cdCAgfVxuXHQgIGlmIChpc0RhdGFTY2hlbWUodXJsKSkge1xuXHQgICAgKDAsIF91dGlsLndhcm4pKCdnZXRQZGZGaWxlbmFtZUZyb21Vcmw6IGlnbm9yZSBcImRhdGE6XCItVVJMIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLicpO1xuXHQgICAgcmV0dXJuIGRlZmF1bHRGaWxlbmFtZTtcblx0ICB9XG5cdCAgY29uc3QgcmVVUkkgPSAvXig/Oig/OlteOl0rOik/XFwvXFwvW14vXSspPyhbXj8jXSopKFxcP1teI10qKT8oIy4qKT8kLztcblx0ICBjb25zdCByZUZpbGVuYW1lID0gL1teLz8jPV0rXFwucGRmXFxiKD8hLipcXC5wZGZcXGIpL2k7XG5cdCAgY29uc3Qgc3BsaXRVUkkgPSByZVVSSS5leGVjKHVybCk7XG5cdCAgbGV0IHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzFdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbMl0pIHx8IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVszXSk7XG5cdCAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lKSB7XG5cdCAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHN1Z2dlc3RlZEZpbGVuYW1lWzBdO1xuXHQgICAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lLmluY2x1ZGVzKFwiJVwiKSkge1xuXHQgICAgICB0cnkge1xuXHQgICAgICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKGRlY29kZVVSSUNvbXBvbmVudChzdWdnZXN0ZWRGaWxlbmFtZSkpWzBdO1xuXHQgICAgICB9IGNhdGNoIChleCkge31cblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIHN1Z2dlc3RlZEZpbGVuYW1lIHx8IGRlZmF1bHRGaWxlbmFtZTtcblx0fVxuXHRjbGFzcyBTdGF0VGltZXIge1xuXHQgIHN0YXJ0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgIHRpbWVzID0gW107XG5cdCAgdGltZShuYW1lKSB7XG5cdCAgICBpZiAobmFtZSBpbiB0aGlzLnN0YXJ0ZWQpIHtcblx0ICAgICAgKDAsIF91dGlsLndhcm4pKGBUaW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcgZm9yICR7bmFtZX1gKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuc3RhcnRlZFtuYW1lXSA9IERhdGUubm93KCk7XG5cdCAgfVxuXHQgIHRpbWVFbmQobmFtZSkge1xuXHQgICAgaWYgKCEobmFtZSBpbiB0aGlzLnN0YXJ0ZWQpKSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShgVGltZXIgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgZm9yICR7bmFtZX1gKTtcblx0ICAgIH1cblx0ICAgIHRoaXMudGltZXMucHVzaCh7XG5cdCAgICAgIG5hbWUsXG5cdCAgICAgIHN0YXJ0OiB0aGlzLnN0YXJ0ZWRbbmFtZV0sXG5cdCAgICAgIGVuZDogRGF0ZS5ub3coKVxuXHQgICAgfSk7XG5cdCAgICBkZWxldGUgdGhpcy5zdGFydGVkW25hbWVdO1xuXHQgIH1cblx0ICB0b1N0cmluZygpIHtcblx0ICAgIGNvbnN0IG91dEJ1ZiA9IFtdO1xuXHQgICAgbGV0IGxvbmdlc3QgPSAwO1xuXHQgICAgZm9yIChjb25zdCB7XG5cdCAgICAgIG5hbWVcblx0ICAgIH0gb2YgdGhpcy50aW1lcykge1xuXHQgICAgICBsb25nZXN0ID0gTWF0aC5tYXgobmFtZS5sZW5ndGgsIGxvbmdlc3QpO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCB7XG5cdCAgICAgIG5hbWUsXG5cdCAgICAgIHN0YXJ0LFxuXHQgICAgICBlbmRcblx0ICAgIH0gb2YgdGhpcy50aW1lcykge1xuXHQgICAgICBvdXRCdWYucHVzaChgJHtuYW1lLnBhZEVuZChsb25nZXN0KX0gJHtlbmQgLSBzdGFydH1tc1xcbmApO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG91dEJ1Zi5qb2luKFwiXCIpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLlN0YXRUaW1lciA9IFN0YXRUaW1lcjtcblx0ZnVuY3Rpb24gaXNWYWxpZEZldGNoVXJsKHVybCwgYmFzZVVybCkge1xuXHQgIHRyeSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHByb3RvY29sXG5cdCAgICB9ID0gYmFzZVVybCA/IG5ldyBVUkwodXJsLCBiYXNlVXJsKSA6IG5ldyBVUkwodXJsKTtcblx0ICAgIHJldHVybiBwcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHByb3RvY29sID09PSBcImh0dHBzOlwiO1xuXHQgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGxvYWRTY3JpcHQoc3JjLCByZW1vdmVTY3JpcHRFbGVtZW50ID0gZmFsc2UpIHtcblx0ICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHQgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcblx0ICAgIHNjcmlwdC5zcmMgPSBzcmM7XG5cdCAgICBzY3JpcHQub25sb2FkID0gZnVuY3Rpb24gKGV2dCkge1xuXHQgICAgICBpZiAocmVtb3ZlU2NyaXB0RWxlbWVudCkge1xuXHQgICAgICAgIHNjcmlwdC5yZW1vdmUoKTtcblx0ICAgICAgfVxuXHQgICAgICByZXNvbHZlKGV2dCk7XG5cdCAgICB9O1xuXHQgICAgc2NyaXB0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHJlamVjdChuZXcgRXJyb3IoYENhbm5vdCBsb2FkIHNjcmlwdCBhdDogJHtzY3JpcHQuc3JjfWApKTtcblx0ICAgIH07XG5cdCAgICAoZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZChzY3JpcHQpO1xuXHQgIH0pO1xuXHR9XG5cdGZ1bmN0aW9uIGRlcHJlY2F0ZWQoZGV0YWlscykge1xuXHQgIGNvbnNvbGUubG9nKFwiRGVwcmVjYXRlZCBBUEkgdXNhZ2U6IFwiICsgZGV0YWlscyk7XG5cdH1cblx0bGV0IHBkZkRhdGVTdHJpbmdSZWdleDtcblx0Y2xhc3MgUERGRGF0ZVN0cmluZyB7XG5cdCAgc3RhdGljIHRvRGF0ZU9iamVjdChpbnB1dCkge1xuXHQgICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBpZiAoIXBkZkRhdGVTdHJpbmdSZWdleCkge1xuXHQgICAgICBwZGZEYXRlU3RyaW5nUmVnZXggPSBuZXcgUmVnRXhwKFwiXkQ6XCIgKyBcIihcXFxcZHs0fSlcIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFxcXFxkezJ9KT9cIiArIFwiKFtafCt8LV0pP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCInP1wiICsgXCIoXFxcXGR7Mn0pP1wiICsgXCInP1wiKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IG1hdGNoZXMgPSBwZGZEYXRlU3RyaW5nUmVnZXguZXhlYyhpbnB1dCk7XG5cdCAgICBpZiAoIW1hdGNoZXMpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQobWF0Y2hlc1sxXSwgMTApO1xuXHQgICAgbGV0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hlc1syXSwgMTApO1xuXHQgICAgbW9udGggPSBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyID8gbW9udGggLSAxIDogMDtcblx0ICAgIGxldCBkYXkgPSBwYXJzZUludChtYXRjaGVzWzNdLCAxMCk7XG5cdCAgICBkYXkgPSBkYXkgPj0gMSAmJiBkYXkgPD0gMzEgPyBkYXkgOiAxO1xuXHQgICAgbGV0IGhvdXIgPSBwYXJzZUludChtYXRjaGVzWzRdLCAxMCk7XG5cdCAgICBob3VyID0gaG91ciA+PSAwICYmIGhvdXIgPD0gMjMgPyBob3VyIDogMDtcblx0ICAgIGxldCBtaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzVdLCAxMCk7XG5cdCAgICBtaW51dGUgPSBtaW51dGUgPj0gMCAmJiBtaW51dGUgPD0gNTkgPyBtaW51dGUgOiAwO1xuXHQgICAgbGV0IHNlY29uZCA9IHBhcnNlSW50KG1hdGNoZXNbNl0sIDEwKTtcblx0ICAgIHNlY29uZCA9IHNlY29uZCA+PSAwICYmIHNlY29uZCA8PSA1OSA/IHNlY29uZCA6IDA7XG5cdCAgICBjb25zdCB1bml2ZXJzYWxUaW1lUmVsYXRpb24gPSBtYXRjaGVzWzddIHx8IFwiWlwiO1xuXHQgICAgbGV0IG9mZnNldEhvdXIgPSBwYXJzZUludChtYXRjaGVzWzhdLCAxMCk7XG5cdCAgICBvZmZzZXRIb3VyID0gb2Zmc2V0SG91ciA+PSAwICYmIG9mZnNldEhvdXIgPD0gMjMgPyBvZmZzZXRIb3VyIDogMDtcblx0ICAgIGxldCBvZmZzZXRNaW51dGUgPSBwYXJzZUludChtYXRjaGVzWzldLCAxMCkgfHwgMDtcblx0ICAgIG9mZnNldE1pbnV0ZSA9IG9mZnNldE1pbnV0ZSA+PSAwICYmIG9mZnNldE1pbnV0ZSA8PSA1OSA/IG9mZnNldE1pbnV0ZSA6IDA7XG5cdCAgICBpZiAodW5pdmVyc2FsVGltZVJlbGF0aW9uID09PSBcIi1cIikge1xuXHQgICAgICBob3VyICs9IG9mZnNldEhvdXI7XG5cdCAgICAgIG1pbnV0ZSArPSBvZmZzZXRNaW51dGU7XG5cdCAgICB9IGVsc2UgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gXCIrXCIpIHtcblx0ICAgICAgaG91ciAtPSBvZmZzZXRIb3VyO1xuXHQgICAgICBtaW51dGUgLT0gb2Zmc2V0TWludXRlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUERGRGF0ZVN0cmluZyA9IFBERkRhdGVTdHJpbmc7XG5cdGZ1bmN0aW9uIGdldFhmYVBhZ2VWaWV3cG9ydCh4ZmFQYWdlLCB7XG5cdCAgc2NhbGUgPSAxLFxuXHQgIHJvdGF0aW9uID0gMFxuXHR9KSB7XG5cdCAgY29uc3Qge1xuXHQgICAgd2lkdGgsXG5cdCAgICBoZWlnaHRcblx0ICB9ID0geGZhUGFnZS5hdHRyaWJ1dGVzLnN0eWxlO1xuXHQgIGNvbnN0IHZpZXdCb3ggPSBbMCwgMCwgcGFyc2VJbnQod2lkdGgpLCBwYXJzZUludChoZWlnaHQpXTtcblx0ICByZXR1cm4gbmV3IFBhZ2VWaWV3cG9ydCh7XG5cdCAgICB2aWV3Qm94LFxuXHQgICAgc2NhbGUsXG5cdCAgICByb3RhdGlvblxuXHQgIH0pO1xuXHR9XG5cdGZ1bmN0aW9uIGdldFJHQihjb2xvcikge1xuXHQgIGlmIChjb2xvci5zdGFydHNXaXRoKFwiI1wiKSkge1xuXHQgICAgY29uc3QgY29sb3JSR0IgPSBwYXJzZUludChjb2xvci5zbGljZSgxKSwgMTYpO1xuXHQgICAgcmV0dXJuIFsoY29sb3JSR0IgJiAweGZmMDAwMCkgPj4gMTYsIChjb2xvclJHQiAmIDB4MDBmZjAwKSA+PiA4LCBjb2xvclJHQiAmIDB4MDAwMGZmXTtcblx0ICB9XG5cdCAgaWYgKGNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG5cdCAgICByZXR1cm4gY29sb3Iuc2xpY2UoNCwgLTEpLnNwbGl0KFwiLFwiKS5tYXAoeCA9PiBwYXJzZUludCh4KSk7XG5cdCAgfVxuXHQgIGlmIChjb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcblx0ICAgIHJldHVybiBjb2xvci5zbGljZSg1LCAtMSkuc3BsaXQoXCIsXCIpLm1hcCh4ID0+IHBhcnNlSW50KHgpKS5zbGljZSgwLCAzKTtcblx0ICB9XG5cdCAgKDAsIF91dGlsLndhcm4pKGBOb3QgYSB2YWxpZCBjb2xvciBmb3JtYXQ6IFwiJHtjb2xvcn1cImApO1xuXHQgIHJldHVybiBbMCwgMCwgMF07XG5cdH1cblx0ZnVuY3Rpb24gZ2V0Q29sb3JWYWx1ZXMoY29sb3JzKSB7XG5cdCAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHQgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG5cdCAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc3Bhbik7XG5cdCAgZm9yIChjb25zdCBuYW1lIG9mIGNvbG9ycy5rZXlzKCkpIHtcblx0ICAgIHNwYW4uc3R5bGUuY29sb3IgPSBuYW1lO1xuXHQgICAgY29uc3QgY29tcHV0ZWRDb2xvciA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNwYW4pLmNvbG9yO1xuXHQgICAgY29sb3JzLnNldChuYW1lLCBnZXRSR0IoY29tcHV0ZWRDb2xvcikpO1xuXHQgIH1cblx0ICBzcGFuLnJlbW92ZSgpO1xuXHR9XG5cdGZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm0oY3R4KSB7XG5cdCAgY29uc3Qge1xuXHQgICAgYSxcblx0ICAgIGIsXG5cdCAgICBjLFxuXHQgICAgZCxcblx0ICAgIGUsXG5cdCAgICBmXG5cdCAgfSA9IGN0eC5nZXRUcmFuc2Zvcm0oKTtcblx0ICByZXR1cm4gW2EsIGIsIGMsIGQsIGUsIGZdO1xuXHR9XG5cdGZ1bmN0aW9uIGdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKGN0eCkge1xuXHQgIGNvbnN0IHtcblx0ICAgIGEsXG5cdCAgICBiLFxuXHQgICAgYyxcblx0ICAgIGQsXG5cdCAgICBlLFxuXHQgICAgZlxuXHQgIH0gPSBjdHguZ2V0VHJhbnNmb3JtKCkuaW52ZXJ0U2VsZigpO1xuXHQgIHJldHVybiBbYSwgYiwgYywgZCwgZSwgZl07XG5cdH1cblx0ZnVuY3Rpb24gc2V0TGF5ZXJEaW1lbnNpb25zKGRpdiwgdmlld3BvcnQsIG11c3RGbGlwID0gZmFsc2UsIG11c3RSb3RhdGUgPSB0cnVlKSB7XG5cdCAgaWYgKHZpZXdwb3J0IGluc3RhbmNlb2YgUGFnZVZpZXdwb3J0KSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHBhZ2VXaWR0aCxcblx0ICAgICAgcGFnZUhlaWdodFxuXHQgICAgfSA9IHZpZXdwb3J0LnJhd0RpbXM7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHN0eWxlXG5cdCAgICB9ID0gZGl2O1xuXHQgICAgY29uc3Qgd2lkdGhTdHIgPSBgY2FsYyh2YXIoLS1zY2FsZS1mYWN0b3IpICogJHtwYWdlV2lkdGh9cHgpYDtcblx0ICAgIGNvbnN0IGhlaWdodFN0ciA9IGBjYWxjKHZhcigtLXNjYWxlLWZhY3RvcikgKiAke3BhZ2VIZWlnaHR9cHgpYDtcblx0ICAgIGlmICghbXVzdEZsaXAgfHwgdmlld3BvcnQucm90YXRpb24gJSAxODAgPT09IDApIHtcblx0ICAgICAgc3R5bGUud2lkdGggPSB3aWR0aFN0cjtcblx0ICAgICAgc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0U3RyO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgc3R5bGUud2lkdGggPSBoZWlnaHRTdHI7XG5cdCAgICAgIHN0eWxlLmhlaWdodCA9IHdpZHRoU3RyO1xuXHQgICAgfVxuXHQgIH1cblx0ICBpZiAobXVzdFJvdGF0ZSkge1xuXHQgICAgZGl2LnNldEF0dHJpYnV0ZShcImRhdGEtbWFpbi1yb3RhdGlvblwiLCB2aWV3cG9ydC5yb3RhdGlvbik7XG5cdCAgfVxuXHR9XG5cblx0LyoqKi8gfSksXG5cdC8qIDcgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLkJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSA9IGV4cG9ydHMuQmFzZVNWR0ZhY3RvcnkgPSBleHBvcnRzLkJhc2VGaWx0ZXJGYWN0b3J5ID0gZXhwb3J0cy5CYXNlQ2FudmFzRmFjdG9yeSA9IGV4cG9ydHMuQmFzZUNNYXBSZWFkZXJGYWN0b3J5ID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHRjbGFzcyBCYXNlRmlsdGVyRmFjdG9yeSB7XG5cdCAgY29uc3RydWN0b3IoKSB7XG5cdCAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUZpbHRlckZhY3RvcnkpIHtcblx0ICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VGaWx0ZXJGYWN0b3J5LlwiKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgYWRkRmlsdGVyKG1hcHMpIHtcblx0ICAgIHJldHVybiBcIm5vbmVcIjtcblx0ICB9XG5cdCAgYWRkSENNRmlsdGVyKGZnQ29sb3IsIGJnQ29sb3IpIHtcblx0ICAgIHJldHVybiBcIm5vbmVcIjtcblx0ICB9XG5cdCAgZGVzdHJveShrZWVwSENNID0gZmFsc2UpIHt9XG5cdH1cblx0ZXhwb3J0cy5CYXNlRmlsdGVyRmFjdG9yeSA9IEJhc2VGaWx0ZXJGYWN0b3J5O1xuXHRjbGFzcyBCYXNlQ2FudmFzRmFjdG9yeSB7XG5cdCAgY29uc3RydWN0b3IoKSB7XG5cdCAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNhbnZhc0ZhY3RvcnkpIHtcblx0ICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDYW52YXNGYWN0b3J5LlwiKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgY3JlYXRlKHdpZHRoLCBoZWlnaHQpIHtcblx0ICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FudmFzIHNpemVcIik7XG5cdCAgICB9XG5cdCAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjYW52YXMsXG5cdCAgICAgIGNvbnRleHQ6IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIilcblx0ICAgIH07XG5cdCAgfVxuXHQgIHJlc2V0KGNhbnZhc0FuZENvbnRleHQsIHdpZHRoLCBoZWlnaHQpIHtcblx0ICAgIGlmICghY2FudmFzQW5kQ29udGV4dC5jYW52YXMpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGlzIG5vdCBzcGVjaWZpZWRcIik7XG5cdCAgICB9XG5cdCAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNhbnZhcyBzaXplXCIpO1xuXHQgICAgfVxuXHQgICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSB3aWR0aDtcblx0ICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzLmhlaWdodCA9IGhlaWdodDtcblx0ICB9XG5cdCAgZGVzdHJveShjYW52YXNBbmRDb250ZXh0KSB7XG5cdCAgICBpZiAoIWNhbnZhc0FuZENvbnRleHQuY2FudmFzKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbnZhcyBpcyBub3Qgc3BlY2lmaWVkXCIpO1xuXHQgICAgfVxuXHQgICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMud2lkdGggPSAwO1xuXHQgICAgY2FudmFzQW5kQ29udGV4dC5jYW52YXMuaGVpZ2h0ID0gMDtcblx0ICAgIGNhbnZhc0FuZENvbnRleHQuY2FudmFzID0gbnVsbDtcblx0ICAgIGNhbnZhc0FuZENvbnRleHQuY29udGV4dCA9IG51bGw7XG5cdCAgfVxuXHQgIF9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2NyZWF0ZUNhbnZhc2AgY2FsbGVkLlwiKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5CYXNlQ2FudmFzRmFjdG9yeSA9IEJhc2VDYW52YXNGYWN0b3J5O1xuXHRjbGFzcyBCYXNlQ01hcFJlYWRlckZhY3Rvcnkge1xuXHQgIGNvbnN0cnVjdG9yKHtcblx0ICAgIGJhc2VVcmwgPSBudWxsLFxuXHQgICAgaXNDb21wcmVzc2VkID0gdHJ1ZVxuXHQgIH0pIHtcblx0ICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQ01hcFJlYWRlckZhY3RvcnkpIHtcblx0ICAgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VDTWFwUmVhZGVyRmFjdG9yeS5cIik7XG5cdCAgICB9XG5cdCAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuXHQgICAgdGhpcy5pc0NvbXByZXNzZWQgPSBpc0NvbXByZXNzZWQ7XG5cdCAgfVxuXHQgIGFzeW5jIGZldGNoKHtcblx0ICAgIG5hbWVcblx0ICB9KSB7XG5cdCAgICBpZiAoIXRoaXMuYmFzZVVybCkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBDTWFwIFwiYmFzZVVybFwiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCwgZW5zdXJlIHRoYXQgJyArICd0aGUgXCJjTWFwVXJsXCIgYW5kIFwiY01hcFBhY2tlZFwiIEFQSSBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4nKTtcblx0ICAgIH1cblx0ICAgIGlmICghbmFtZSkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDTWFwIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuXCIpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlVXJsICsgbmFtZSArICh0aGlzLmlzQ29tcHJlc3NlZCA/IFwiLmJjbWFwXCIgOiBcIlwiKTtcblx0ICAgIGNvbnN0IGNvbXByZXNzaW9uVHlwZSA9IHRoaXMuaXNDb21wcmVzc2VkID8gX3V0aWwuQ01hcENvbXByZXNzaW9uVHlwZS5CSU5BUlkgOiBfdXRpbC5DTWFwQ29tcHJlc3Npb25UeXBlLk5PTkU7XG5cdCAgICByZXR1cm4gdGhpcy5fZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKS5jYXRjaChyZWFzb24gPT4ge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2FkICR7dGhpcy5pc0NvbXByZXNzZWQgPyBcImJpbmFyeSBcIiA6IFwiXCJ9Q01hcCBhdDogJHt1cmx9YCk7XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgX2ZldGNoRGF0YSh1cmwsIGNvbXByZXNzaW9uVHlwZSkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5CYXNlQ01hcFJlYWRlckZhY3RvcnkgPSBCYXNlQ01hcFJlYWRlckZhY3Rvcnk7XG5cdGNsYXNzIEJhc2VTdGFuZGFyZEZvbnREYXRhRmFjdG9yeSB7XG5cdCAgY29uc3RydWN0b3Ioe1xuXHQgICAgYmFzZVVybCA9IG51bGxcblx0ICB9KSB7XG5cdCAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5KSB7XG5cdCAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkuXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybDtcblx0ICB9XG5cdCAgYXN5bmMgZmV0Y2goe1xuXHQgICAgZmlsZW5hbWVcblx0ICB9KSB7XG5cdCAgICBpZiAoIXRoaXMuYmFzZVVybCkge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzdGFuZGFyZCBmb250IFwiYmFzZVVybFwiIHBhcmFtZXRlciBtdXN0IGJlIHNwZWNpZmllZCwgZW5zdXJlIHRoYXQgJyArICd0aGUgXCJzdGFuZGFyZEZvbnREYXRhVXJsXCIgQVBJIHBhcmFtZXRlciBpcyBwcm92aWRlZC4nKTtcblx0ICAgIH1cblx0ICAgIGlmICghZmlsZW5hbWUpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRm9udCBmaWxlbmFtZSBtdXN0IGJlIHNwZWNpZmllZC5cIik7XG5cdCAgICB9XG5cdCAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmJhc2VVcmx9JHtmaWxlbmFtZX1gO1xuXHQgICAgcmV0dXJuIHRoaXMuX2ZldGNoRGF0YSh1cmwpLmNhdGNoKHJlYXNvbiA9PiB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgZm9udCBkYXRhIGF0OiAke3VybH1gKTtcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBfZmV0Y2hEYXRhKHVybCkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgX2ZldGNoRGF0YWAgY2FsbGVkLlwiKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBCYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnk7XG5cdGNsYXNzIEJhc2VTVkdGYWN0b3J5IHtcblx0ICBjb25zdHJ1Y3RvcigpIHtcblx0ICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlU1ZHRmFjdG9yeSkge1xuXHQgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiQ2Fubm90IGluaXRpYWxpemUgQmFzZVNWR0ZhY3RvcnkuXCIpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBjcmVhdGUod2lkdGgsIGhlaWdodCwgc2tpcERpbWVuc2lvbnMgPSBmYWxzZSkge1xuXHQgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBTVkcgZGltZW5zaW9uc1wiKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHN2ZyA9IHRoaXMuX2NyZWF0ZVNWRyhcInN2ZzpzdmdcIik7XG5cdCAgICBzdmcuc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLCBcIjEuMVwiKTtcblx0ICAgIGlmICghc2tpcERpbWVuc2lvbnMpIHtcblx0ICAgICAgc3ZnLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofXB4YCk7XG5cdCAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0fXB4YCk7XG5cdCAgICB9XG5cdCAgICBzdmcuc2V0QXR0cmlidXRlKFwicHJlc2VydmVBc3BlY3RSYXRpb1wiLCBcIm5vbmVcIik7XG5cdCAgICBzdmcuc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuXHQgICAgcmV0dXJuIHN2Zztcblx0ICB9XG5cdCAgY3JlYXRlRWxlbWVudCh0eXBlKSB7XG5cdCAgICBpZiAodHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBTVkcgZWxlbWVudCB0eXBlXCIpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVNWRyh0eXBlKTtcblx0ICB9XG5cdCAgX2NyZWF0ZVNWRyh0eXBlKSB7XG5cdCAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiQWJzdHJhY3QgbWV0aG9kIGBfY3JlYXRlU1ZHYCBjYWxsZWQuXCIpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkJhc2VTVkdGYWN0b3J5ID0gQmFzZVNWR0ZhY3Rvcnk7XG5cblx0LyoqKi8gfSksXG5cdC8qIDggKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLk11cm11ckhhc2gzXzY0ID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHRjb25zdCBTRUVEID0gMHhjM2QyZTFmMDtcblx0Y29uc3QgTUFTS19ISUdIID0gMHhmZmZmMDAwMDtcblx0Y29uc3QgTUFTS19MT1cgPSAweGZmZmY7XG5cdGNsYXNzIE11cm11ckhhc2gzXzY0IHtcblx0ICBjb25zdHJ1Y3RvcihzZWVkKSB7XG5cdCAgICB0aGlzLmgxID0gc2VlZCA/IHNlZWQgJiAweGZmZmZmZmZmIDogU0VFRDtcblx0ICAgIHRoaXMuaDIgPSBzZWVkID8gc2VlZCAmIDB4ZmZmZmZmZmYgOiBTRUVEO1xuXHQgIH1cblx0ICB1cGRhdGUoaW5wdXQpIHtcblx0ICAgIGxldCBkYXRhLCBsZW5ndGg7XG5cdCAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGggKiAyKTtcblx0ICAgICAgbGVuZ3RoID0gMDtcblx0ICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gaW5wdXQubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuXHQgICAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuXHQgICAgICAgIGlmIChjb2RlIDw9IDB4ZmYpIHtcblx0ICAgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gY29kZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlID4+PiA4O1xuXHQgICAgICAgICAgZGF0YVtsZW5ndGgrK10gPSBjb2RlICYgMHhmZjtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAoKDAsIF91dGlsLmlzQXJyYXlCdWZmZXIpKGlucHV0KSkge1xuXHQgICAgICBkYXRhID0gaW5wdXQuc2xpY2UoKTtcblx0ICAgICAgbGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgZGF0YSBmb3JtYXQgaW4gTXVybXVySGFzaDNfNjRfdXBkYXRlLiBcIiArIFwiSW5wdXQgbXVzdCBiZSBhIHN0cmluZyBvciBhcnJheS5cIik7XG5cdCAgICB9XG5cdCAgICBjb25zdCBibG9ja0NvdW50cyA9IGxlbmd0aCA+PiAyO1xuXHQgICAgY29uc3QgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGJsb2NrQ291bnRzICogNDtcblx0ICAgIGNvbnN0IGRhdGFVaW50MzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIDAsIGJsb2NrQ291bnRzKTtcblx0ICAgIGxldCBrMSA9IDAsXG5cdCAgICAgIGsyID0gMDtcblx0ICAgIGxldCBoMSA9IHRoaXMuaDEsXG5cdCAgICAgIGgyID0gdGhpcy5oMjtcblx0ICAgIGNvbnN0IEMxID0gMHhjYzllMmQ1MSxcblx0ICAgICAgQzIgPSAweDFiODczNTkzO1xuXHQgICAgY29uc3QgQzFfTE9XID0gQzEgJiBNQVNLX0xPVyxcblx0ICAgICAgQzJfTE9XID0gQzIgJiBNQVNLX0xPVztcblx0ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tDb3VudHM7IGkrKykge1xuXHQgICAgICBpZiAoaSAmIDEpIHtcblx0ICAgICAgICBrMSA9IGRhdGFVaW50MzJbaV07XG5cdCAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVztcblx0ICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3O1xuXHQgICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7XG5cdCAgICAgICAgaDEgXj0gazE7XG5cdCAgICAgICAgaDEgPSBoMSA8PCAxMyB8IGgxID4+PiAxOTtcblx0ICAgICAgICBoMSA9IGgxICogNSArIDB4ZTY1NDZiNjQ7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgazIgPSBkYXRhVWludDMyW2ldO1xuXHQgICAgICAgIGsyID0gazIgKiBDMSAmIE1BU0tfSElHSCB8IGsyICogQzFfTE9XICYgTUFTS19MT1c7XG5cdCAgICAgICAgazIgPSBrMiA8PCAxNSB8IGsyID4+PiAxNztcblx0ICAgICAgICBrMiA9IGsyICogQzIgJiBNQVNLX0hJR0ggfCBrMiAqIEMyX0xPVyAmIE1BU0tfTE9XO1xuXHQgICAgICAgIGgyIF49IGsyO1xuXHQgICAgICAgIGgyID0gaDIgPDwgMTMgfCBoMiA+Pj4gMTk7XG5cdCAgICAgICAgaDIgPSBoMiAqIDUgKyAweGU2NTQ2YjY0O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBrMSA9IDA7XG5cdCAgICBzd2l0Y2ggKHRhaWxMZW5ndGgpIHtcblx0ICAgICAgY2FzZSAzOlxuXHQgICAgICAgIGsxIF49IGRhdGFbYmxvY2tDb3VudHMgKiA0ICsgMl0gPDwgMTY7XG5cdCAgICAgIGNhc2UgMjpcblx0ICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNCArIDFdIDw8IDg7XG5cdCAgICAgIGNhc2UgMTpcblx0ICAgICAgICBrMSBePSBkYXRhW2Jsb2NrQ291bnRzICogNF07XG5cdCAgICAgICAgazEgPSBrMSAqIEMxICYgTUFTS19ISUdIIHwgazEgKiBDMV9MT1cgJiBNQVNLX0xPVztcblx0ICAgICAgICBrMSA9IGsxIDw8IDE1IHwgazEgPj4+IDE3O1xuXHQgICAgICAgIGsxID0gazEgKiBDMiAmIE1BU0tfSElHSCB8IGsxICogQzJfTE9XICYgTUFTS19MT1c7XG5cdCAgICAgICAgaWYgKGJsb2NrQ291bnRzICYgMSkge1xuXHQgICAgICAgICAgaDEgXj0gazE7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGgyIF49IGsxO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuaDEgPSBoMTtcblx0ICAgIHRoaXMuaDIgPSBoMjtcblx0ICB9XG5cdCAgaGV4ZGlnZXN0KCkge1xuXHQgICAgbGV0IGgxID0gdGhpcy5oMSxcblx0ICAgICAgaDIgPSB0aGlzLmgyO1xuXHQgICAgaDEgXj0gaDIgPj4+IDE7XG5cdCAgICBoMSA9IGgxICogMHhlZDU1OGNjZCAmIE1BU0tfSElHSCB8IGgxICogMHg4Y2NkICYgTUFTS19MT1c7XG5cdCAgICBoMiA9IGgyICogMHhmZjUxYWZkNyAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhhZmQ3ZWQ1NSAmIE1BU0tfSElHSCkgPj4+IDE2O1xuXHQgICAgaDEgXj0gaDIgPj4+IDE7XG5cdCAgICBoMSA9IGgxICogMHgxYTg1ZWM1MyAmIE1BU0tfSElHSCB8IGgxICogMHhlYzUzICYgTUFTS19MT1c7XG5cdCAgICBoMiA9IGgyICogMHhjNGNlYjlmZSAmIE1BU0tfSElHSCB8ICgoaDIgPDwgMTYgfCBoMSA+Pj4gMTYpICogMHhiOWZlMWE4NSAmIE1BU0tfSElHSCkgPj4+IDE2O1xuXHQgICAgaDEgXj0gaDIgPj4+IDE7XG5cdCAgICByZXR1cm4gKGgxID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgXCIwXCIpICsgKGgyID4+PiAwKS50b1N0cmluZygxNikucGFkU3RhcnQoOCwgXCIwXCIpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLk11cm11ckhhc2gzXzY0ID0gTXVybXVySGFzaDNfNjQ7XG5cblx0LyoqKi8gfSksXG5cdC8qIDkgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLkZvbnRMb2FkZXIgPSBleHBvcnRzLkZvbnRGYWNlT2JqZWN0ID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX2lzX25vZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTtcblx0Y2xhc3MgRm9udExvYWRlciB7XG5cdCAgY29uc3RydWN0b3Ioe1xuXHQgICAgb3duZXJEb2N1bWVudCA9IGdsb2JhbFRoaXMuZG9jdW1lbnQsXG5cdCAgICBzdHlsZUVsZW1lbnQgPSBudWxsXG5cdCAgfSkge1xuXHQgICAgdGhpcy5fZG9jdW1lbnQgPSBvd25lckRvY3VtZW50O1xuXHQgICAgdGhpcy5uYXRpdmVGb250RmFjZXMgPSBbXTtcblx0ICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcblx0ICAgIHRoaXMubG9hZGluZ1JlcXVlc3RzID0gW107XG5cdCAgICB0aGlzLmxvYWRUZXN0Rm9udElkID0gMDtcblx0ICB9XG5cdCAgYWRkTmF0aXZlRm9udEZhY2UobmF0aXZlRm9udEZhY2UpIHtcblx0ICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLnB1c2gobmF0aXZlRm9udEZhY2UpO1xuXHQgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuYWRkKG5hdGl2ZUZvbnRGYWNlKTtcblx0ICB9XG5cdCAgaW5zZXJ0UnVsZShydWxlKSB7XG5cdCAgICBpZiAoIXRoaXMuc3R5bGVFbGVtZW50KSB7XG5cdCAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHQgICAgICB0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdLmFwcGVuZCh0aGlzLnN0eWxlRWxlbWVudCk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBzdHlsZVNoZWV0ID0gdGhpcy5zdHlsZUVsZW1lbnQuc2hlZXQ7XG5cdCAgICBzdHlsZVNoZWV0Lmluc2VydFJ1bGUocnVsZSwgc3R5bGVTaGVldC5jc3NSdWxlcy5sZW5ndGgpO1xuXHQgIH1cblx0ICBjbGVhcigpIHtcblx0ICAgIGZvciAoY29uc3QgbmF0aXZlRm9udEZhY2Ugb2YgdGhpcy5uYXRpdmVGb250RmFjZXMpIHtcblx0ICAgICAgdGhpcy5fZG9jdW1lbnQuZm9udHMuZGVsZXRlKG5hdGl2ZUZvbnRGYWNlKTtcblx0ICAgIH1cblx0ICAgIHRoaXMubmF0aXZlRm9udEZhY2VzLmxlbmd0aCA9IDA7XG5cdCAgICBpZiAodGhpcy5zdHlsZUVsZW1lbnQpIHtcblx0ICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7XG5cdCAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cdCAgYXN5bmMgYmluZChmb250KSB7XG5cdCAgICBpZiAoZm9udC5hdHRhY2hlZCB8fCBmb250Lm1pc3NpbmdGaWxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGZvbnQuYXR0YWNoZWQgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCkge1xuXHQgICAgICBjb25zdCBuYXRpdmVGb250RmFjZSA9IGZvbnQuY3JlYXRlTmF0aXZlRm9udEZhY2UoKTtcblx0ICAgICAgaWYgKG5hdGl2ZUZvbnRGYWNlKSB7XG5cdCAgICAgICAgdGhpcy5hZGROYXRpdmVGb250RmFjZShuYXRpdmVGb250RmFjZSk7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIGF3YWl0IG5hdGl2ZUZvbnRGYWNlLmxvYWRlZDtcblx0ICAgICAgICB9IGNhdGNoIChleCkge1xuXHQgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBGYWlsZWQgdG8gbG9hZCBmb250ICcke25hdGl2ZUZvbnRGYWNlLmZhbWlseX0nOiAnJHtleH0nLmApO1xuXHQgICAgICAgICAgZm9udC5kaXNhYmxlRm9udEZhY2UgPSB0cnVlO1xuXHQgICAgICAgICAgdGhyb3cgZXg7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHJ1bGUgPSBmb250LmNyZWF0ZUZvbnRGYWNlUnVsZSgpO1xuXHQgICAgaWYgKHJ1bGUpIHtcblx0ICAgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpO1xuXHQgICAgICBpZiAodGhpcy5pc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0ICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fcXVldWVMb2FkaW5nQ2FsbGJhY2socmVzb2x2ZSk7XG5cdCAgICAgICAgdGhpcy5fcHJlcGFyZUZvbnRMb2FkRXZlbnQoZm9udCwgcmVxdWVzdCk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXQgaXNGb250TG9hZGluZ0FQSVN1cHBvcnRlZCgpIHtcblx0ICAgIGNvbnN0IGhhc0ZvbnRzID0gISF0aGlzLl9kb2N1bWVudD8uZm9udHM7XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJpc0ZvbnRMb2FkaW5nQVBJU3VwcG9ydGVkXCIsIGhhc0ZvbnRzKTtcblx0ICB9XG5cdCAgZ2V0IGlzU3luY0ZvbnRMb2FkaW5nU3VwcG9ydGVkKCkge1xuXHQgICAgbGV0IHN1cHBvcnRlZCA9IGZhbHNlO1xuXHQgICAgaWYgKF9pc19ub2RlLmlzTm9kZUpTKSB7XG5cdCAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG5cdCAgICB9IGVsc2UgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgL01vemlsbGFcXC81LjAuKj9ydjpcXGQrLio/IEdlY2tvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG5cdCAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJpc1N5bmNGb250TG9hZGluZ1N1cHBvcnRlZFwiLCBzdXBwb3J0ZWQpO1xuXHQgIH1cblx0ICBfcXVldWVMb2FkaW5nQ2FsbGJhY2soY2FsbGJhY2spIHtcblx0ICAgIGZ1bmN0aW9uIGNvbXBsZXRlUmVxdWVzdCgpIHtcblx0ICAgICAgKDAsIF91dGlsLmFzc2VydCkoIXJlcXVlc3QuZG9uZSwgXCJjb21wbGV0ZVJlcXVlc3QoKSBjYW5ub3QgYmUgY2FsbGVkIHR3aWNlLlwiKTtcblx0ICAgICAgcmVxdWVzdC5kb25lID0gdHJ1ZTtcblx0ICAgICAgd2hpbGUgKGxvYWRpbmdSZXF1ZXN0cy5sZW5ndGggPiAwICYmIGxvYWRpbmdSZXF1ZXN0c1swXS5kb25lKSB7XG5cdCAgICAgICAgY29uc3Qgb3RoZXJSZXF1ZXN0ID0gbG9hZGluZ1JlcXVlc3RzLnNoaWZ0KCk7XG5cdCAgICAgICAgc2V0VGltZW91dChvdGhlclJlcXVlc3QuY2FsbGJhY2ssIDApO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGxvYWRpbmdSZXF1ZXN0c1xuXHQgICAgfSA9IHRoaXM7XG5cdCAgICBjb25zdCByZXF1ZXN0ID0ge1xuXHQgICAgICBkb25lOiBmYWxzZSxcblx0ICAgICAgY29tcGxldGU6IGNvbXBsZXRlUmVxdWVzdCxcblx0ICAgICAgY2FsbGJhY2tcblx0ICAgIH07XG5cdCAgICBsb2FkaW5nUmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcblx0ICAgIHJldHVybiByZXF1ZXN0O1xuXHQgIH1cblx0ICBnZXQgX2xvYWRUZXN0Rm9udCgpIHtcblx0ICAgIGNvbnN0IHRlc3RGb250ID0gYXRvYihcIlQxUlVUd0FMQUlBQUF3QXdRMFpHSURIdFpnNEFBQU9ZQUFBQWdVWkdWRTFsa3pad0FBQUVIQUFBQUJ4SFJFVkdBQlFBXCIgKyBcIkZRQUFCRGdBQUFBZVQxTXZNbFlOWXdrQUFBRWdBQUFBWUdOdFlYQUJEUUxVQUFBQ05BQUFBVUpvWldGay94VkZEUUFBXCIgKyBcIkFMd0FBQUEyYUdobFlRZGtBK29BQUFEMEFBQUFKR2h0ZEhnRDZBQUFBQUFFV0FBQUFBWnRZWGh3QUFKUUFBQUFBUmdBXCIgKyBcIkFBQUdibUZ0WlZqbWRINEFBQUdBQUFBQXNYQnZjM1QvaGdBekFBQURlQUFBQUNBQUFRQUFBQUVBQUxaUkZzUmZEenoxXCIgKyBcIkFBc0Q2QUFBQUFET0JPVExBQUFBQU00S0hEd0FBQUFBQStnRElRQUFBQWdBQWdBQUFBQUFBQUFCQUFBRElRQUFBRm9EXCIgKyBcIjZBQUFBQUFENkFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQVVBQUFBZ0FBQUFRRDZBSDBBQVVBQUFLS0Fyd0FBQUNNXCIgKyBcIkFvb0N2QUFBQWVBQU1RRUNBQUFDQUFZSkFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBRkJtUldRQXdBQXVBQzREXCIgKyBcIklQODRBRm9ESVFBQUFBQUFBUUFBQUFBQUFBQUFBQ0FBSUFBQkFBQUFEZ0N1QUFFQUFBQUFBQUFBQVFBQUFBRUFBQUFBXCIgKyBcIkFBRUFBUUFBQUFFQUFBQUFBQUlBQVFBQUFBRUFBQUFBQUFNQUFRQUFBQUVBQUFBQUFBUUFBUUFBQUFFQUFBQUFBQVVBXCIgKyBcIkFRQUFBQUVBQUFBQUFBWUFBUUFBQUFNQUFRUUpBQUFBQWdBQkFBTUFBUVFKQUFFQUFnQUJBQU1BQVFRSkFBSUFBZ0FCXCIgKyBcIkFBTUFBUVFKQUFNQUFnQUJBQU1BQVFRSkFBUUFBZ0FCQUFNQUFRUUpBQVVBQWdBQkFBTUFBUVFKQUFZQUFnQUJXQUJZXCIgKyBcIkFBQUFBQUFBQXdBQUFBTUFBQUFjQUFFQUFBQUFBRHdBQXdBQkFBQUFIQUFFQUNBQUFBQUVBQVFBQVFBQUFDNy8vd0FBXCIgKyBcIkFDNy8vLy9UQUFFQUFBQUFBQUFCQmdBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1BQUFBQUFBRC9nd0F5QUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBXCIgKyBcIkFBQUJBQVFFQUFFQkFRSllBQUVCQVNINER3RDRHd0hFQXZnY0EvZ1hCSXdNQVl1TCtuejV0UVhrRDVqM0NCTG5FUUFDXCIgKyBcIkFRRUJJVmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWUFBQUJBUUFBRHdBQ0FRRUVFL3QzXCIgKyBcIkRvdjZmQUg2ZkFUK2ZQcDgrbndIRG9zTUN2bTFDdm0xREF6NmZCUUFBQUFBQUFBQkFBQUFBTW1KYnpFQUFBQUF6Z1RqXCIgKyBcIkZRQUFBQURPQk9RcEFBRUFBQUFBQUFBQURBQVVBQVFBQUFBQkFBQUFBZ0FCQUFBQUFBQUFBQUFENkFBQUFBQUFBQT09XCIpO1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5zaGFkb3cpKHRoaXMsIFwiX2xvYWRUZXN0Rm9udFwiLCB0ZXN0Rm9udCk7XG5cdCAgfVxuXHQgIF9wcmVwYXJlRm9udExvYWRFdmVudChmb250LCByZXF1ZXN0KSB7XG5cdCAgICBmdW5jdGlvbiBpbnQzMihkYXRhLCBvZmZzZXQpIHtcblx0ICAgICAgcmV0dXJuIGRhdGEuY2hhckNvZGVBdChvZmZzZXQpIDw8IDI0IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2IHwgZGF0YS5jaGFyQ29kZUF0KG9mZnNldCArIDIpIDw8IDggfCBkYXRhLmNoYXJDb2RlQXQob2Zmc2V0ICsgMykgJiAweGZmO1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gc3BsaWNlU3RyaW5nKHMsIG9mZnNldCwgcmVtb3ZlLCBpbnNlcnQpIHtcblx0ICAgICAgY29uc3QgY2h1bmsxID0gcy5zdWJzdHJpbmcoMCwgb2Zmc2V0KTtcblx0ICAgICAgY29uc3QgY2h1bmsyID0gcy5zdWJzdHJpbmcob2Zmc2V0ICsgcmVtb3ZlKTtcblx0ICAgICAgcmV0dXJuIGNodW5rMSArIGluc2VydCArIGNodW5rMjtcblx0ICAgIH1cblx0ICAgIGxldCBpLCBpaTtcblx0ICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG5cdCAgICBjYW52YXMud2lkdGggPSAxO1xuXHQgICAgY2FudmFzLmhlaWdodCA9IDE7XG5cdCAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXHQgICAgbGV0IGNhbGxlZCA9IDA7XG5cdCAgICBmdW5jdGlvbiBpc0ZvbnRSZWFkeShuYW1lLCBjYWxsYmFjaykge1xuXHQgICAgICBpZiAoKytjYWxsZWQgPiAzMCkge1xuXHQgICAgICAgICgwLCBfdXRpbC53YXJuKShcIkxvYWQgdGVzdCBmb250IG5ldmVyIGxvYWRlZC5cIik7XG5cdCAgICAgICAgY2FsbGJhY2soKTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgY3R4LmZvbnQgPSBcIjMwcHggXCIgKyBuYW1lO1xuXHQgICAgICBjdHguZmlsbFRleHQoXCIuXCIsIDAsIDIwKTtcblx0ICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcblx0ICAgICAgaWYgKGltYWdlRGF0YS5kYXRhWzNdID4gMCkge1xuXHQgICAgICAgIGNhbGxiYWNrKCk7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHNldFRpbWVvdXQoaXNGb250UmVhZHkuYmluZChudWxsLCBuYW1lLCBjYWxsYmFjaykpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgbG9hZFRlc3RGb250SWQgPSBgbHQke0RhdGUubm93KCl9JHt0aGlzLmxvYWRUZXN0Rm9udElkKyt9YDtcblx0ICAgIGxldCBkYXRhID0gdGhpcy5fbG9hZFRlc3RGb250O1xuXHQgICAgY29uc3QgQ09NTUVOVF9PRkZTRVQgPSA5NzY7XG5cdCAgICBkYXRhID0gc3BsaWNlU3RyaW5nKGRhdGEsIENPTU1FTlRfT0ZGU0VULCBsb2FkVGVzdEZvbnRJZC5sZW5ndGgsIGxvYWRUZXN0Rm9udElkKTtcblx0ICAgIGNvbnN0IENGRl9DSEVDS1NVTV9PRkZTRVQgPSAxNjtcblx0ICAgIGNvbnN0IFhYWFhfVkFMVUUgPSAweDU4NTg1ODU4O1xuXHQgICAgbGV0IGNoZWNrc3VtID0gaW50MzIoZGF0YSwgQ0ZGX0NIRUNLU1VNX09GRlNFVCk7XG5cdCAgICBmb3IgKGkgPSAwLCBpaSA9IGxvYWRUZXN0Rm9udElkLmxlbmd0aCAtIDM7IGkgPCBpaTsgaSArPSA0KSB7XG5cdCAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQsIGkpIHwgMDtcblx0ICAgIH1cblx0ICAgIGlmIChpIDwgbG9hZFRlc3RGb250SWQubGVuZ3RoKSB7XG5cdCAgICAgIGNoZWNrc3VtID0gY2hlY2tzdW0gLSBYWFhYX1ZBTFVFICsgaW50MzIobG9hZFRlc3RGb250SWQgKyBcIlhYWFwiLCBpKSB8IDA7XG5cdCAgICB9XG5cdCAgICBkYXRhID0gc3BsaWNlU3RyaW5nKGRhdGEsIENGRl9DSEVDS1NVTV9PRkZTRVQsIDQsICgwLCBfdXRpbC5zdHJpbmczMikoY2hlY2tzdW0pKTtcblx0ICAgIGNvbnN0IHVybCA9IGB1cmwoZGF0YTpmb250L29wZW50eXBlO2Jhc2U2NCwke2J0b2EoZGF0YSl9KTtgO1xuXHQgICAgY29uc3QgcnVsZSA9IGBAZm9udC1mYWNlIHtmb250LWZhbWlseTpcIiR7bG9hZFRlc3RGb250SWR9XCI7c3JjOiR7dXJsfX1gO1xuXHQgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpO1xuXHQgICAgY29uc3QgZGl2ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgIGRpdi5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcblx0ICAgIGRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5oZWlnaHQgPSBcIjEwcHhcIjtcblx0ICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0ICAgIGRpdi5zdHlsZS50b3AgPSBkaXYuc3R5bGUubGVmdCA9IFwiMHB4XCI7XG5cdCAgICBmb3IgKGNvbnN0IG5hbWUgb2YgW2ZvbnQubG9hZGVkTmFtZSwgbG9hZFRlc3RGb250SWRdKSB7XG5cdCAgICAgIGNvbnN0IHNwYW4gPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcblx0ICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IFwiSGlcIjtcblx0ICAgICAgc3Bhbi5zdHlsZS5mb250RmFtaWx5ID0gbmFtZTtcblx0ICAgICAgZGl2LmFwcGVuZChzcGFuKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kKGRpdik7XG5cdCAgICBpc0ZvbnRSZWFkeShsb2FkVGVzdEZvbnRJZCwgKCkgPT4ge1xuXHQgICAgICBkaXYucmVtb3ZlKCk7XG5cdCAgICAgIHJlcXVlc3QuY29tcGxldGUoKTtcblx0ICAgIH0pO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkZvbnRMb2FkZXIgPSBGb250TG9hZGVyO1xuXHRjbGFzcyBGb250RmFjZU9iamVjdCB7XG5cdCAgY29uc3RydWN0b3IodHJhbnNsYXRlZERhdGEsIHtcblx0ICAgIGlzRXZhbFN1cHBvcnRlZCA9IHRydWUsXG5cdCAgICBkaXNhYmxlRm9udEZhY2UgPSBmYWxzZSxcblx0ICAgIGlnbm9yZUVycm9ycyA9IGZhbHNlLFxuXHQgICAgaW5zcGVjdEZvbnQgPSBudWxsXG5cdCAgfSkge1xuXHQgICAgdGhpcy5jb21waWxlZEdseXBocyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgICBmb3IgKGNvbnN0IGkgaW4gdHJhbnNsYXRlZERhdGEpIHtcblx0ICAgICAgdGhpc1tpXSA9IHRyYW5zbGF0ZWREYXRhW2ldO1xuXHQgICAgfVxuXHQgICAgdGhpcy5pc0V2YWxTdXBwb3J0ZWQgPSBpc0V2YWxTdXBwb3J0ZWQgIT09IGZhbHNlO1xuXHQgICAgdGhpcy5kaXNhYmxlRm9udEZhY2UgPSBkaXNhYmxlRm9udEZhY2UgPT09IHRydWU7XG5cdCAgICB0aGlzLmlnbm9yZUVycm9ycyA9IGlnbm9yZUVycm9ycyA9PT0gdHJ1ZTtcblx0ICAgIHRoaXMuX2luc3BlY3RGb250ID0gaW5zcGVjdEZvbnQ7XG5cdCAgfVxuXHQgIGNyZWF0ZU5hdGl2ZUZvbnRGYWNlKCkge1xuXHQgICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kaXNhYmxlRm9udEZhY2UpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBsZXQgbmF0aXZlRm9udEZhY2U7XG5cdCAgICBpZiAoIXRoaXMuY3NzRm9udEluZm8pIHtcblx0ICAgICAgbmF0aXZlRm9udEZhY2UgPSBuZXcgRm9udEZhY2UodGhpcy5sb2FkZWROYW1lLCB0aGlzLmRhdGEsIHt9KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IGNzcyA9IHtcblx0ICAgICAgICB3ZWlnaHQ6IHRoaXMuY3NzRm9udEluZm8uZm9udFdlaWdodFxuXHQgICAgICB9O1xuXHQgICAgICBpZiAodGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZSkge1xuXHQgICAgICAgIGNzcy5zdHlsZSA9IGBvYmxpcXVlICR7dGhpcy5jc3NGb250SW5mby5pdGFsaWNBbmdsZX1kZWdgO1xuXHQgICAgICB9XG5cdCAgICAgIG5hdGl2ZUZvbnRGYWNlID0gbmV3IEZvbnRGYWNlKHRoaXMuY3NzRm9udEluZm8uZm9udEZhbWlseSwgdGhpcy5kYXRhLCBjc3MpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5faW5zcGVjdEZvbnQ/Lih0aGlzKTtcblx0ICAgIHJldHVybiBuYXRpdmVGb250RmFjZTtcblx0ICB9XG5cdCAgY3JlYXRlRm9udEZhY2VSdWxlKCkge1xuXHQgICAgaWYgKCF0aGlzLmRhdGEgfHwgdGhpcy5kaXNhYmxlRm9udEZhY2UpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCBkYXRhID0gKDAsIF91dGlsLmJ5dGVzVG9TdHJpbmcpKHRoaXMuZGF0YSk7XG5cdCAgICBjb25zdCB1cmwgPSBgdXJsKGRhdGE6JHt0aGlzLm1pbWV0eXBlfTtiYXNlNjQsJHtidG9hKGRhdGEpfSk7YDtcblx0ICAgIGxldCBydWxlO1xuXHQgICAgaWYgKCF0aGlzLmNzc0ZvbnRJbmZvKSB7XG5cdCAgICAgIHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke3RoaXMubG9hZGVkTmFtZX1cIjtzcmM6JHt1cmx9fWA7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBsZXQgY3NzID0gYGZvbnQtd2VpZ2h0OiAke3RoaXMuY3NzRm9udEluZm8uZm9udFdlaWdodH07YDtcblx0ICAgICAgaWYgKHRoaXMuY3NzRm9udEluZm8uaXRhbGljQW5nbGUpIHtcblx0ICAgICAgICBjc3MgKz0gYGZvbnQtc3R5bGU6IG9ibGlxdWUgJHt0aGlzLmNzc0ZvbnRJbmZvLml0YWxpY0FuZ2xlfWRlZztgO1xuXHQgICAgICB9XG5cdCAgICAgIHJ1bGUgPSBgQGZvbnQtZmFjZSB7Zm9udC1mYW1pbHk6XCIke3RoaXMuY3NzRm9udEluZm8uZm9udEZhbWlseX1cIjske2Nzc31zcmM6JHt1cmx9fWA7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9pbnNwZWN0Rm9udD8uKHRoaXMsIHVybCk7XG5cdCAgICByZXR1cm4gcnVsZTtcblx0ICB9XG5cdCAgZ2V0UGF0aEdlbmVyYXRvcihvYmpzLCBjaGFyYWN0ZXIpIHtcblx0ICAgIGlmICh0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5jb21waWxlZEdseXBoc1tjaGFyYWN0ZXJdO1xuXHQgICAgfVxuXHQgICAgbGV0IGNtZHM7XG5cdCAgICB0cnkge1xuXHQgICAgICBjbWRzID0gb2Jqcy5nZXQodGhpcy5sb2FkZWROYW1lICsgXCJfcGF0aF9cIiArIGNoYXJhY3Rlcik7XG5cdCAgICB9IGNhdGNoIChleCkge1xuXHQgICAgICBpZiAoIXRoaXMuaWdub3JlRXJyb3JzKSB7XG5cdCAgICAgICAgdGhyb3cgZXg7XG5cdCAgICAgIH1cblx0ICAgICAgKDAsIF91dGlsLndhcm4pKGBnZXRQYXRoR2VuZXJhdG9yIC0gaWdub3JpbmcgY2hhcmFjdGVyOiBcIiR7ZXh9XCIuYCk7XG5cdCAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkge307XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5pc0V2YWxTdXBwb3J0ZWQgJiYgX3V0aWwuRmVhdHVyZVRlc3QuaXNFdmFsU3VwcG9ydGVkKSB7XG5cdCAgICAgIGNvbnN0IGpzQnVmID0gW107XG5cdCAgICAgIGZvciAoY29uc3QgY3VycmVudCBvZiBjbWRzKSB7XG5cdCAgICAgICAgY29uc3QgYXJncyA9IGN1cnJlbnQuYXJncyAhPT0gdW5kZWZpbmVkID8gY3VycmVudC5hcmdzLmpvaW4oXCIsXCIpIDogXCJcIjtcblx0ICAgICAgICBqc0J1Zi5wdXNoKFwiYy5cIiwgY3VycmVudC5jbWQsIFwiKFwiLCBhcmdzLCBcIik7XFxuXCIpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBuZXcgRnVuY3Rpb24oXCJjXCIsIFwic2l6ZVwiLCBqc0J1Zi5qb2luKFwiXCIpKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLmNvbXBpbGVkR2x5cGhzW2NoYXJhY3Rlcl0gPSBmdW5jdGlvbiAoYywgc2l6ZSkge1xuXHQgICAgICBmb3IgKGNvbnN0IGN1cnJlbnQgb2YgY21kcykge1xuXHQgICAgICAgIGlmIChjdXJyZW50LmNtZCA9PT0gXCJzY2FsZVwiKSB7XG5cdCAgICAgICAgICBjdXJyZW50LmFyZ3MgPSBbc2l6ZSwgLXNpemVdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjW2N1cnJlbnQuY21kXS5hcHBseShjLCBjdXJyZW50LmFyZ3MpO1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkZvbnRGYWNlT2JqZWN0ID0gRm9udEZhY2VPYmplY3Q7XG5cblx0LyoqKi8gfSksXG5cdC8qIDEwICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5pc05vZGVKUyA9IHZvaWQgMDtcblx0Y29uc3QgaXNOb2RlSlMgPSB0eXBlb2YgYnJvd3NlciQxID09PSBcIm9iamVjdFwiICYmIGJyb3dzZXIkMSArIFwiXCIgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiICYmICFicm93c2VyJDEudmVyc2lvbnMubncgJiYgIShicm93c2VyJDEudmVyc2lvbnMuZWxlY3Ryb24gJiYgYnJvd3NlciQxLnR5cGUgJiYgYnJvd3NlciQxLnR5cGUgIT09IFwiYnJvd3NlclwiKTtcblx0ZXhwb3J0cy5pc05vZGVKUyA9IGlzTm9kZUpTO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAxMSAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuQ2FudmFzR3JhcGhpY3MgPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7XG5cdHZhciBfcGF0dGVybl9oZWxwZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEyKTtcblx0dmFyIF9pbWFnZV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpO1xuXHR2YXIgX2lzX25vZGUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEwKTtcblx0Y29uc3QgTUlOX0ZPTlRfU0laRSA9IDE2O1xuXHRjb25zdCBNQVhfRk9OVF9TSVpFID0gMTAwO1xuXHRjb25zdCBNQVhfR1JPVVBfU0laRSA9IDQwOTY7XG5cdGNvbnN0IEVYRUNVVElPTl9USU1FID0gMTU7XG5cdGNvbnN0IEVYRUNVVElPTl9TVEVQUyA9IDEwO1xuXHRjb25zdCBNQVhfU0laRV9UT19DT01QSUxFID0gMTAwMDtcblx0Y29uc3QgRlVMTF9DSFVOS19IRUlHSFQgPSAxNjtcblx0ZnVuY3Rpb24gbWlycm9yQ29udGV4dE9wZXJhdGlvbnMoY3R4LCBkZXN0Q3R4KSB7XG5cdCAgaWYgKGN0eC5fcmVtb3ZlTWlycm9yaW5nKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IGlzIGFscmVhZHkgZm9yd2FyZGluZyBvcGVyYXRpb25zLlwiKTtcblx0ICB9XG5cdCAgY3R4Ll9fb3JpZ2luYWxTYXZlID0gY3R4LnNhdmU7XG5cdCAgY3R4Ll9fb3JpZ2luYWxSZXN0b3JlID0gY3R4LnJlc3RvcmU7XG5cdCAgY3R4Ll9fb3JpZ2luYWxSb3RhdGUgPSBjdHgucm90YXRlO1xuXHQgIGN0eC5fX29yaWdpbmFsU2NhbGUgPSBjdHguc2NhbGU7XG5cdCAgY3R4Ll9fb3JpZ2luYWxUcmFuc2xhdGUgPSBjdHgudHJhbnNsYXRlO1xuXHQgIGN0eC5fX29yaWdpbmFsVHJhbnNmb3JtID0gY3R4LnRyYW5zZm9ybTtcblx0ICBjdHguX19vcmlnaW5hbFNldFRyYW5zZm9ybSA9IGN0eC5zZXRUcmFuc2Zvcm07XG5cdCAgY3R4Ll9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybSA9IGN0eC5yZXNldFRyYW5zZm9ybTtcblx0ICBjdHguX19vcmlnaW5hbENsaXAgPSBjdHguY2xpcDtcblx0ICBjdHguX19vcmlnaW5hbE1vdmVUbyA9IGN0eC5tb3ZlVG87XG5cdCAgY3R4Ll9fb3JpZ2luYWxMaW5lVG8gPSBjdHgubGluZVRvO1xuXHQgIGN0eC5fX29yaWdpbmFsQmV6aWVyQ3VydmVUbyA9IGN0eC5iZXppZXJDdXJ2ZVRvO1xuXHQgIGN0eC5fX29yaWdpbmFsUmVjdCA9IGN0eC5yZWN0O1xuXHQgIGN0eC5fX29yaWdpbmFsQ2xvc2VQYXRoID0gY3R4LmNsb3NlUGF0aDtcblx0ICBjdHguX19vcmlnaW5hbEJlZ2luUGF0aCA9IGN0eC5iZWdpblBhdGg7XG5cdCAgY3R4Ll9yZW1vdmVNaXJyb3JpbmcgPSAoKSA9PiB7XG5cdCAgICBjdHguc2F2ZSA9IGN0eC5fX29yaWdpbmFsU2F2ZTtcblx0ICAgIGN0eC5yZXN0b3JlID0gY3R4Ll9fb3JpZ2luYWxSZXN0b3JlO1xuXHQgICAgY3R4LnJvdGF0ZSA9IGN0eC5fX29yaWdpbmFsUm90YXRlO1xuXHQgICAgY3R4LnNjYWxlID0gY3R4Ll9fb3JpZ2luYWxTY2FsZTtcblx0ICAgIGN0eC50cmFuc2xhdGUgPSBjdHguX19vcmlnaW5hbFRyYW5zbGF0ZTtcblx0ICAgIGN0eC50cmFuc2Zvcm0gPSBjdHguX19vcmlnaW5hbFRyYW5zZm9ybTtcblx0ICAgIGN0eC5zZXRUcmFuc2Zvcm0gPSBjdHguX19vcmlnaW5hbFNldFRyYW5zZm9ybTtcblx0ICAgIGN0eC5yZXNldFRyYW5zZm9ybSA9IGN0eC5fX29yaWdpbmFsUmVzZXRUcmFuc2Zvcm07XG5cdCAgICBjdHguY2xpcCA9IGN0eC5fX29yaWdpbmFsQ2xpcDtcblx0ICAgIGN0eC5tb3ZlVG8gPSBjdHguX19vcmlnaW5hbE1vdmVUbztcblx0ICAgIGN0eC5saW5lVG8gPSBjdHguX19vcmlnaW5hbExpbmVUbztcblx0ICAgIGN0eC5iZXppZXJDdXJ2ZVRvID0gY3R4Ll9fb3JpZ2luYWxCZXppZXJDdXJ2ZVRvO1xuXHQgICAgY3R4LnJlY3QgPSBjdHguX19vcmlnaW5hbFJlY3Q7XG5cdCAgICBjdHguY2xvc2VQYXRoID0gY3R4Ll9fb3JpZ2luYWxDbG9zZVBhdGg7XG5cdCAgICBjdHguYmVnaW5QYXRoID0gY3R4Ll9fb3JpZ2luYWxCZWdpblBhdGg7XG5cdCAgICBkZWxldGUgY3R4Ll9yZW1vdmVNaXJyb3Jpbmc7XG5cdCAgfTtcblx0ICBjdHguc2F2ZSA9IGZ1bmN0aW9uIGN0eFNhdmUoKSB7XG5cdCAgICBkZXN0Q3R4LnNhdmUoKTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbFNhdmUoKTtcblx0ICB9O1xuXHQgIGN0eC5yZXN0b3JlID0gZnVuY3Rpb24gY3R4UmVzdG9yZSgpIHtcblx0ICAgIGRlc3RDdHgucmVzdG9yZSgpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsUmVzdG9yZSgpO1xuXHQgIH07XG5cdCAgY3R4LnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIGN0eFRyYW5zbGF0ZSh4LCB5KSB7XG5cdCAgICBkZXN0Q3R4LnRyYW5zbGF0ZSh4LCB5KTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbFRyYW5zbGF0ZSh4LCB5KTtcblx0ICB9O1xuXHQgIGN0eC5zY2FsZSA9IGZ1bmN0aW9uIGN0eFNjYWxlKHgsIHkpIHtcblx0ICAgIGRlc3RDdHguc2NhbGUoeCwgeSk7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxTY2FsZSh4LCB5KTtcblx0ICB9O1xuXHQgIGN0eC50cmFuc2Zvcm0gPSBmdW5jdGlvbiBjdHhUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuXHQgICAgZGVzdEN0eC50cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxUcmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZik7XG5cdCAgfTtcblx0ICBjdHguc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4U2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcblx0ICAgIGRlc3RDdHguc2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsU2V0VHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpO1xuXHQgIH07XG5cdCAgY3R4LnJlc2V0VHJhbnNmb3JtID0gZnVuY3Rpb24gY3R4UmVzZXRUcmFuc2Zvcm0oKSB7XG5cdCAgICBkZXN0Q3R4LnJlc2V0VHJhbnNmb3JtKCk7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxSZXNldFRyYW5zZm9ybSgpO1xuXHQgIH07XG5cdCAgY3R4LnJvdGF0ZSA9IGZ1bmN0aW9uIGN0eFJvdGF0ZShhbmdsZSkge1xuXHQgICAgZGVzdEN0eC5yb3RhdGUoYW5nbGUpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsUm90YXRlKGFuZ2xlKTtcblx0ICB9O1xuXHQgIGN0eC5jbGlwID0gZnVuY3Rpb24gY3R4Um90YXRlKHJ1bGUpIHtcblx0ICAgIGRlc3RDdHguY2xpcChydWxlKTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbENsaXAocnVsZSk7XG5cdCAgfTtcblx0ICBjdHgubW92ZVRvID0gZnVuY3Rpb24gKHgsIHkpIHtcblx0ICAgIGRlc3RDdHgubW92ZVRvKHgsIHkpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsTW92ZVRvKHgsIHkpO1xuXHQgIH07XG5cdCAgY3R4LmxpbmVUbyA9IGZ1bmN0aW9uICh4LCB5KSB7XG5cdCAgICBkZXN0Q3R4LmxpbmVUbyh4LCB5KTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbExpbmVUbyh4LCB5KTtcblx0ICB9O1xuXHQgIGN0eC5iZXppZXJDdXJ2ZVRvID0gZnVuY3Rpb24gKGNwMXgsIGNwMXksIGNwMngsIGNwMnksIHgsIHkpIHtcblx0ICAgIGRlc3RDdHguYmV6aWVyQ3VydmVUbyhjcDF4LCBjcDF5LCBjcDJ4LCBjcDJ5LCB4LCB5KTtcblx0ICAgIHRoaXMuX19vcmlnaW5hbEJlemllckN1cnZlVG8oY3AxeCwgY3AxeSwgY3AyeCwgY3AyeSwgeCwgeSk7XG5cdCAgfTtcblx0ICBjdHgucmVjdCA9IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG5cdCAgICBkZXN0Q3R4LnJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuXHQgIH07XG5cdCAgY3R4LmNsb3NlUGF0aCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGRlc3RDdHguY2xvc2VQYXRoKCk7XG5cdCAgICB0aGlzLl9fb3JpZ2luYWxDbG9zZVBhdGgoKTtcblx0ICB9O1xuXHQgIGN0eC5iZWdpblBhdGggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBkZXN0Q3R4LmJlZ2luUGF0aCgpO1xuXHQgICAgdGhpcy5fX29yaWdpbmFsQmVnaW5QYXRoKCk7XG5cdCAgfTtcblx0fVxuXHRjbGFzcyBDYWNoZWRDYW52YXNlcyB7XG5cdCAgY29uc3RydWN0b3IoY2FudmFzRmFjdG9yeSkge1xuXHQgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcblx0ICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgIH1cblx0ICBnZXRDYW52YXMoaWQsIHdpZHRoLCBoZWlnaHQpIHtcblx0ICAgIGxldCBjYW52YXNFbnRyeTtcblx0ICAgIGlmICh0aGlzLmNhY2hlW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIGNhbnZhc0VudHJ5ID0gdGhpcy5jYWNoZVtpZF07XG5cdCAgICAgIHRoaXMuY2FudmFzRmFjdG9yeS5yZXNldChjYW52YXNFbnRyeSwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjYW52YXNFbnRyeSA9IHRoaXMuY2FudmFzRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCk7XG5cdCAgICAgIHRoaXMuY2FjaGVbaWRdID0gY2FudmFzRW50cnk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gY2FudmFzRW50cnk7XG5cdCAgfVxuXHQgIGRlbGV0ZShpZCkge1xuXHQgICAgZGVsZXRlIHRoaXMuY2FjaGVbaWRdO1xuXHQgIH1cblx0ICBjbGVhcigpIHtcblx0ICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5jYWNoZSkge1xuXHQgICAgICBjb25zdCBjYW52YXNFbnRyeSA9IHRoaXMuY2FjaGVbaWRdO1xuXHQgICAgICB0aGlzLmNhbnZhc0ZhY3RvcnkuZGVzdHJveShjYW52YXNFbnRyeSk7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gZHJhd0ltYWdlQXRJbnRlZ2VyQ29vcmRzKGN0eCwgc3JjSW1nLCBzcmNYLCBzcmNZLCBzcmNXLCBzcmNILCBkZXN0WCwgZGVzdFksIGRlc3RXLCBkZXN0SCkge1xuXHQgIGNvbnN0IFthLCBiLCBjLCBkLCB0eCwgdHldID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCk7XG5cdCAgaWYgKGIgPT09IDAgJiYgYyA9PT0gMCkge1xuXHQgICAgY29uc3QgdGxYID0gZGVzdFggKiBhICsgdHg7XG5cdCAgICBjb25zdCByVGxYID0gTWF0aC5yb3VuZCh0bFgpO1xuXHQgICAgY29uc3QgdGxZID0gZGVzdFkgKiBkICsgdHk7XG5cdCAgICBjb25zdCByVGxZID0gTWF0aC5yb3VuZCh0bFkpO1xuXHQgICAgY29uc3QgYnJYID0gKGRlc3RYICsgZGVzdFcpICogYSArIHR4O1xuXHQgICAgY29uc3QgcldpZHRoID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclgpIC0gclRsWCkgfHwgMTtcblx0ICAgIGNvbnN0IGJyWSA9IChkZXN0WSArIGRlc3RIKSAqIGQgKyB0eTtcblx0ICAgIGNvbnN0IHJIZWlnaHQgPSBNYXRoLmFicyhNYXRoLnJvdW5kKGJyWSkgLSByVGxZKSB8fCAxO1xuXHQgICAgY3R4LnNldFRyYW5zZm9ybShNYXRoLnNpZ24oYSksIDAsIDAsIE1hdGguc2lnbihkKSwgclRsWCwgclRsWSk7XG5cdCAgICBjdHguZHJhd0ltYWdlKHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgMCwgMCwgcldpZHRoLCBySGVpZ2h0KTtcblx0ICAgIGN0eC5zZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgdHgsIHR5KTtcblx0ICAgIHJldHVybiBbcldpZHRoLCBySGVpZ2h0XTtcblx0ICB9XG5cdCAgaWYgKGEgPT09IDAgJiYgZCA9PT0gMCkge1xuXHQgICAgY29uc3QgdGxYID0gZGVzdFkgKiBjICsgdHg7XG5cdCAgICBjb25zdCByVGxYID0gTWF0aC5yb3VuZCh0bFgpO1xuXHQgICAgY29uc3QgdGxZID0gZGVzdFggKiBiICsgdHk7XG5cdCAgICBjb25zdCByVGxZID0gTWF0aC5yb3VuZCh0bFkpO1xuXHQgICAgY29uc3QgYnJYID0gKGRlc3RZICsgZGVzdEgpICogYyArIHR4O1xuXHQgICAgY29uc3QgcldpZHRoID0gTWF0aC5hYnMoTWF0aC5yb3VuZChiclgpIC0gclRsWCkgfHwgMTtcblx0ICAgIGNvbnN0IGJyWSA9IChkZXN0WCArIGRlc3RXKSAqIGIgKyB0eTtcblx0ICAgIGNvbnN0IHJIZWlnaHQgPSBNYXRoLmFicyhNYXRoLnJvdW5kKGJyWSkgLSByVGxZKSB8fCAxO1xuXHQgICAgY3R4LnNldFRyYW5zZm9ybSgwLCBNYXRoLnNpZ24oYiksIE1hdGguc2lnbihjKSwgMCwgclRsWCwgclRsWSk7XG5cdCAgICBjdHguZHJhd0ltYWdlKHNyY0ltZywgc3JjWCwgc3JjWSwgc3JjVywgc3JjSCwgMCwgMCwgckhlaWdodCwgcldpZHRoKTtcblx0ICAgIGN0eC5zZXRUcmFuc2Zvcm0oYSwgYiwgYywgZCwgdHgsIHR5KTtcblx0ICAgIHJldHVybiBbckhlaWdodCwgcldpZHRoXTtcblx0ICB9XG5cdCAgY3R4LmRyYXdJbWFnZShzcmNJbWcsIHNyY1gsIHNyY1ksIHNyY1csIHNyY0gsIGRlc3RYLCBkZXN0WSwgZGVzdFcsIGRlc3RIKTtcblx0ICBjb25zdCBzY2FsZVggPSBNYXRoLmh5cG90KGEsIGIpO1xuXHQgIGNvbnN0IHNjYWxlWSA9IE1hdGguaHlwb3QoYywgZCk7XG5cdCAgcmV0dXJuIFtzY2FsZVggKiBkZXN0Vywgc2NhbGVZICogZGVzdEhdO1xuXHR9XG5cdGZ1bmN0aW9uIGNvbXBpbGVUeXBlM0dseXBoKGltZ0RhdGEpIHtcblx0ICBjb25zdCB7XG5cdCAgICB3aWR0aCxcblx0ICAgIGhlaWdodFxuXHQgIH0gPSBpbWdEYXRhO1xuXHQgIGlmICh3aWR0aCA+IE1BWF9TSVpFX1RPX0NPTVBJTEUgfHwgaGVpZ2h0ID4gTUFYX1NJWkVfVE9fQ09NUElMRSkge1xuXHQgICAgcmV0dXJuIG51bGw7XG5cdCAgfVxuXHQgIGNvbnN0IFBPSU5UX1RPX1BST0NFU1NfTElNSVQgPSAxMDAwO1xuXHQgIGNvbnN0IFBPSU5UX1RZUEVTID0gbmV3IFVpbnQ4QXJyYXkoWzAsIDIsIDQsIDAsIDEsIDAsIDUsIDQsIDgsIDEwLCAwLCA4LCAwLCAyLCAxLCAwXSk7XG5cdCAgY29uc3Qgd2lkdGgxID0gd2lkdGggKyAxO1xuXHQgIGxldCBwb2ludHMgPSBuZXcgVWludDhBcnJheSh3aWR0aDEgKiAoaGVpZ2h0ICsgMSkpO1xuXHQgIGxldCBpLCBqLCBqMDtcblx0ICBjb25zdCBsaW5lU2l6ZSA9IHdpZHRoICsgNyAmIH43O1xuXHQgIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkobGluZVNpemUgKiBoZWlnaHQpLFxuXHQgICAgcG9zID0gMDtcblx0ICBmb3IgKGNvbnN0IGVsZW0gb2YgaW1nRGF0YS5kYXRhKSB7XG5cdCAgICBsZXQgbWFzayA9IDEyODtcblx0ICAgIHdoaWxlIChtYXNrID4gMCkge1xuXHQgICAgICBkYXRhW3BvcysrXSA9IGVsZW0gJiBtYXNrID8gMCA6IDI1NTtcblx0ICAgICAgbWFzayA+Pj0gMTtcblx0ICAgIH1cblx0ICB9XG5cdCAgbGV0IGNvdW50ID0gMDtcblx0ICBwb3MgPSAwO1xuXHQgIGlmIChkYXRhW3Bvc10gIT09IDApIHtcblx0ICAgIHBvaW50c1swXSA9IDE7XG5cdCAgICArK2NvdW50O1xuXHQgIH1cblx0ICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykge1xuXHQgICAgaWYgKGRhdGFbcG9zXSAhPT0gZGF0YVtwb3MgKyAxXSkge1xuXHQgICAgICBwb2ludHNbal0gPSBkYXRhW3Bvc10gPyAyIDogMTtcblx0ICAgICAgKytjb3VudDtcblx0ICAgIH1cblx0ICAgIHBvcysrO1xuXHQgIH1cblx0ICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG5cdCAgICBwb2ludHNbal0gPSAyO1xuXHQgICAgKytjb3VudDtcblx0ICB9XG5cdCAgZm9yIChpID0gMTsgaSA8IGhlaWdodDsgaSsrKSB7XG5cdCAgICBwb3MgPSBpICogbGluZVNpemU7XG5cdCAgICBqMCA9IGkgKiB3aWR0aDE7XG5cdCAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkge1xuXHQgICAgICBwb2ludHNbajBdID0gZGF0YVtwb3NdID8gMSA6IDg7XG5cdCAgICAgICsrY291bnQ7XG5cdCAgICB9XG5cdCAgICBsZXQgc3VtID0gKGRhdGFbcG9zXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplXSA/IDggOiAwKTtcblx0ICAgIGZvciAoaiA9IDE7IGogPCB3aWR0aDsgaisrKSB7XG5cdCAgICAgIHN1bSA9IChzdW0gPj4gMikgKyAoZGF0YVtwb3MgKyAxXSA/IDQgOiAwKSArIChkYXRhW3BvcyAtIGxpbmVTaXplICsgMV0gPyA4IDogMCk7XG5cdCAgICAgIGlmIChQT0lOVF9UWVBFU1tzdW1dKSB7XG5cdCAgICAgICAgcG9pbnRzW2owICsgal0gPSBQT0lOVF9UWVBFU1tzdW1dO1xuXHQgICAgICAgICsrY291bnQ7XG5cdCAgICAgIH1cblx0ICAgICAgcG9zKys7XG5cdCAgICB9XG5cdCAgICBpZiAoZGF0YVtwb3MgLSBsaW5lU2l6ZV0gIT09IGRhdGFbcG9zXSkge1xuXHQgICAgICBwb2ludHNbajAgKyBqXSA9IGRhdGFbcG9zXSA/IDIgOiA0O1xuXHQgICAgICArK2NvdW50O1xuXHQgICAgfVxuXHQgICAgaWYgKGNvdW50ID4gUE9JTlRfVE9fUFJPQ0VTU19MSU1JVCkge1xuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cdCAgcG9zID0gbGluZVNpemUgKiAoaGVpZ2h0IC0gMSk7XG5cdCAgajAgPSBpICogd2lkdGgxO1xuXHQgIGlmIChkYXRhW3Bvc10gIT09IDApIHtcblx0ICAgIHBvaW50c1tqMF0gPSA4O1xuXHQgICAgKytjb3VudDtcblx0ICB9XG5cdCAgZm9yIChqID0gMTsgaiA8IHdpZHRoOyBqKyspIHtcblx0ICAgIGlmIChkYXRhW3Bvc10gIT09IGRhdGFbcG9zICsgMV0pIHtcblx0ICAgICAgcG9pbnRzW2owICsgal0gPSBkYXRhW3Bvc10gPyA0IDogODtcblx0ICAgICAgKytjb3VudDtcblx0ICAgIH1cblx0ICAgIHBvcysrO1xuXHQgIH1cblx0ICBpZiAoZGF0YVtwb3NdICE9PSAwKSB7XG5cdCAgICBwb2ludHNbajAgKyBqXSA9IDQ7XG5cdCAgICArK2NvdW50O1xuXHQgIH1cblx0ICBpZiAoY291bnQgPiBQT0lOVF9UT19QUk9DRVNTX0xJTUlUKSB7XG5cdCAgICByZXR1cm4gbnVsbDtcblx0ICB9XG5cdCAgY29uc3Qgc3RlcHMgPSBuZXcgSW50MzJBcnJheShbMCwgd2lkdGgxLCAtMSwgMCwgLXdpZHRoMSwgMCwgMCwgMCwgMV0pO1xuXHQgIGNvbnN0IHBhdGggPSBuZXcgUGF0aDJEKCk7XG5cdCAgZm9yIChpID0gMDsgY291bnQgJiYgaSA8PSBoZWlnaHQ7IGkrKykge1xuXHQgICAgbGV0IHAgPSBpICogd2lkdGgxO1xuXHQgICAgY29uc3QgZW5kID0gcCArIHdpZHRoO1xuXHQgICAgd2hpbGUgKHAgPCBlbmQgJiYgIXBvaW50c1twXSkge1xuXHQgICAgICBwKys7XG5cdCAgICB9XG5cdCAgICBpZiAocCA9PT0gZW5kKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgcGF0aC5tb3ZlVG8ocCAlIHdpZHRoMSwgaSk7XG5cdCAgICBjb25zdCBwMCA9IHA7XG5cdCAgICBsZXQgdHlwZSA9IHBvaW50c1twXTtcblx0ICAgIGRvIHtcblx0ICAgICAgY29uc3Qgc3RlcCA9IHN0ZXBzW3R5cGVdO1xuXHQgICAgICBkbyB7XG5cdCAgICAgICAgcCArPSBzdGVwO1xuXHQgICAgICB9IHdoaWxlICghcG9pbnRzW3BdKTtcblx0ICAgICAgY29uc3QgcHAgPSBwb2ludHNbcF07XG5cdCAgICAgIGlmIChwcCAhPT0gNSAmJiBwcCAhPT0gMTApIHtcblx0ICAgICAgICB0eXBlID0gcHA7XG5cdCAgICAgICAgcG9pbnRzW3BdID0gMDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0eXBlID0gcHAgJiAweDMzICogdHlwZSA+PiA0O1xuXHQgICAgICAgIHBvaW50c1twXSAmPSB0eXBlID4+IDIgfCB0eXBlIDw8IDI7XG5cdCAgICAgIH1cblx0ICAgICAgcGF0aC5saW5lVG8ocCAlIHdpZHRoMSwgcCAvIHdpZHRoMSB8IDApO1xuXHQgICAgICBpZiAoIXBvaW50c1twXSkge1xuXHQgICAgICAgIC0tY291bnQ7XG5cdCAgICAgIH1cblx0ICAgIH0gd2hpbGUgKHAwICE9PSBwKTtcblx0ICAgIC0taTtcblx0ICB9XG5cdCAgZGF0YSA9IG51bGw7XG5cdCAgcG9pbnRzID0gbnVsbDtcblx0ICBjb25zdCBkcmF3T3V0bGluZSA9IGZ1bmN0aW9uIChjKSB7XG5cdCAgICBjLnNhdmUoKTtcblx0ICAgIGMuc2NhbGUoMSAvIHdpZHRoLCAtMSAvIGhlaWdodCk7XG5cdCAgICBjLnRyYW5zbGF0ZSgwLCAtaGVpZ2h0KTtcblx0ICAgIGMuZmlsbChwYXRoKTtcblx0ICAgIGMuYmVnaW5QYXRoKCk7XG5cdCAgICBjLnJlc3RvcmUoKTtcblx0ICB9O1xuXHQgIHJldHVybiBkcmF3T3V0bGluZTtcblx0fVxuXHRjbGFzcyBDYW52YXNFeHRyYVN0YXRlIHtcblx0ICBjb25zdHJ1Y3Rvcih3aWR0aCwgaGVpZ2h0KSB7XG5cdCAgICB0aGlzLmFscGhhSXNTaGFwZSA9IGZhbHNlO1xuXHQgICAgdGhpcy5mb250U2l6ZSA9IDA7XG5cdCAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuXHQgICAgdGhpcy50ZXh0TWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYO1xuXHQgICAgdGhpcy50ZXh0TWF0cml4U2NhbGUgPSAxO1xuXHQgICAgdGhpcy5mb250TWF0cml4ID0gX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7XG5cdCAgICB0aGlzLmxlYWRpbmcgPSAwO1xuXHQgICAgdGhpcy54ID0gMDtcblx0ICAgIHRoaXMueSA9IDA7XG5cdCAgICB0aGlzLmxpbmVYID0gMDtcblx0ICAgIHRoaXMubGluZVkgPSAwO1xuXHQgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7XG5cdCAgICB0aGlzLndvcmRTcGFjaW5nID0gMDtcblx0ICAgIHRoaXMudGV4dEhTY2FsZSA9IDE7XG5cdCAgICB0aGlzLnRleHRSZW5kZXJpbmdNb2RlID0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTDtcblx0ICAgIHRoaXMudGV4dFJpc2UgPSAwO1xuXHQgICAgdGhpcy5maWxsQ29sb3IgPSBcIiMwMDAwMDBcIjtcblx0ICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSBcIiMwMDAwMDBcIjtcblx0ICAgIHRoaXMucGF0dGVybkZpbGwgPSBmYWxzZTtcblx0ICAgIHRoaXMuZmlsbEFscGhhID0gMTtcblx0ICAgIHRoaXMuc3Ryb2tlQWxwaGEgPSAxO1xuXHQgICAgdGhpcy5saW5lV2lkdGggPSAxO1xuXHQgICAgdGhpcy5hY3RpdmVTTWFzayA9IG51bGw7XG5cdCAgICB0aGlzLnRyYW5zZmVyTWFwcyA9IFwibm9uZVwiO1xuXHQgICAgdGhpcy5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCB3aWR0aCwgaGVpZ2h0XSk7XG5cdCAgfVxuXHQgIGNsb25lKCkge1xuXHQgICAgY29uc3QgY2xvbmUgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuXHQgICAgY2xvbmUuY2xpcEJveCA9IHRoaXMuY2xpcEJveC5zbGljZSgpO1xuXHQgICAgcmV0dXJuIGNsb25lO1xuXHQgIH1cblx0ICBzZXRDdXJyZW50UG9pbnQoeCwgeSkge1xuXHQgICAgdGhpcy54ID0geDtcblx0ICAgIHRoaXMueSA9IHk7XG5cdCAgfVxuXHQgIHVwZGF0ZVBhdGhNaW5NYXgodHJhbnNmb3JtLCB4LCB5KSB7XG5cdCAgICBbeCwgeV0gPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt4LCB5XSwgdHJhbnNmb3JtKTtcblx0ICAgIHRoaXMubWluWCA9IE1hdGgubWluKHRoaXMubWluWCwgeCk7XG5cdCAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIHkpO1xuXHQgICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCB4KTtcblx0ICAgIHRoaXMubWF4WSA9IE1hdGgubWF4KHRoaXMubWF4WSwgeSk7XG5cdCAgfVxuXHQgIHVwZGF0ZVJlY3RNaW5NYXgodHJhbnNmb3JtLCByZWN0KSB7XG5cdCAgICBjb25zdCBwMSA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0ocmVjdCwgdHJhbnNmb3JtKTtcblx0ICAgIGNvbnN0IHAyID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShyZWN0LnNsaWNlKDIpLCB0cmFuc2Zvcm0pO1xuXHQgICAgdGhpcy5taW5YID0gTWF0aC5taW4odGhpcy5taW5YLCBwMVswXSwgcDJbMF0pO1xuXHQgICAgdGhpcy5taW5ZID0gTWF0aC5taW4odGhpcy5taW5ZLCBwMVsxXSwgcDJbMV0pO1xuXHQgICAgdGhpcy5tYXhYID0gTWF0aC5tYXgodGhpcy5tYXhYLCBwMVswXSwgcDJbMF0pO1xuXHQgICAgdGhpcy5tYXhZID0gTWF0aC5tYXgodGhpcy5tYXhZLCBwMVsxXSwgcDJbMV0pO1xuXHQgIH1cblx0ICB1cGRhdGVTY2FsaW5nUGF0aE1pbk1heCh0cmFuc2Zvcm0sIG1pbk1heCkge1xuXHQgICAgX3V0aWwuVXRpbC5zY2FsZU1pbk1heCh0cmFuc2Zvcm0sIG1pbk1heCk7XG5cdCAgICB0aGlzLm1pblggPSBNYXRoLm1pbih0aGlzLm1pblgsIG1pbk1heFswXSk7XG5cdCAgICB0aGlzLm1heFggPSBNYXRoLm1heCh0aGlzLm1heFgsIG1pbk1heFsxXSk7XG5cdCAgICB0aGlzLm1pblkgPSBNYXRoLm1pbih0aGlzLm1pblksIG1pbk1heFsyXSk7XG5cdCAgICB0aGlzLm1heFkgPSBNYXRoLm1heCh0aGlzLm1heFksIG1pbk1heFszXSk7XG5cdCAgfVxuXHQgIHVwZGF0ZUN1cnZlUGF0aE1pbk1heCh0cmFuc2Zvcm0sIHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgbWluTWF4KSB7XG5cdCAgICBjb25zdCBib3ggPSBfdXRpbC5VdGlsLmJlemllckJvdW5kaW5nQm94KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5Myk7XG5cdCAgICBpZiAobWluTWF4KSB7XG5cdCAgICAgIG1pbk1heFswXSA9IE1hdGgubWluKG1pbk1heFswXSwgYm94WzBdLCBib3hbMl0pO1xuXHQgICAgICBtaW5NYXhbMV0gPSBNYXRoLm1heChtaW5NYXhbMV0sIGJveFswXSwgYm94WzJdKTtcblx0ICAgICAgbWluTWF4WzJdID0gTWF0aC5taW4obWluTWF4WzJdLCBib3hbMV0sIGJveFszXSk7XG5cdCAgICAgIG1pbk1heFszXSA9IE1hdGgubWF4KG1pbk1heFszXSwgYm94WzFdLCBib3hbM10pO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLnVwZGF0ZVJlY3RNaW5NYXgodHJhbnNmb3JtLCBib3gpO1xuXHQgIH1cblx0ICBnZXRQYXRoQm91bmRpbmdCb3gocGF0aFR5cGUgPSBfcGF0dGVybl9oZWxwZXIuUGF0aFR5cGUuRklMTCwgdHJhbnNmb3JtID0gbnVsbCkge1xuXHQgICAgY29uc3QgYm94ID0gW3RoaXMubWluWCwgdGhpcy5taW5ZLCB0aGlzLm1heFgsIHRoaXMubWF4WV07XG5cdCAgICBpZiAocGF0aFR5cGUgPT09IF9wYXR0ZXJuX2hlbHBlci5QYXRoVHlwZS5TVFJPS0UpIHtcblx0ICAgICAgaWYgKCF0cmFuc2Zvcm0pIHtcblx0ICAgICAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiU3Ryb2tlIGJvdW5kaW5nIGJveCBtdXN0IGluY2x1ZGUgdHJhbnNmb3JtLlwiKTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBzY2FsZSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUodHJhbnNmb3JtKTtcblx0ICAgICAgY29uc3QgeFN0cm9rZVBhZCA9IHNjYWxlWzBdICogdGhpcy5saW5lV2lkdGggLyAyO1xuXHQgICAgICBjb25zdCB5U3Ryb2tlUGFkID0gc2NhbGVbMV0gKiB0aGlzLmxpbmVXaWR0aCAvIDI7XG5cdCAgICAgIGJveFswXSAtPSB4U3Ryb2tlUGFkO1xuXHQgICAgICBib3hbMV0gLT0geVN0cm9rZVBhZDtcblx0ICAgICAgYm94WzJdICs9IHhTdHJva2VQYWQ7XG5cdCAgICAgIGJveFszXSArPSB5U3Ryb2tlUGFkO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGJveDtcblx0ICB9XG5cdCAgdXBkYXRlQ2xpcEZyb21QYXRoKCkge1xuXHQgICAgY29uc3QgaW50ZXJzZWN0ID0gX3V0aWwuVXRpbC5pbnRlcnNlY3QodGhpcy5jbGlwQm94LCB0aGlzLmdldFBhdGhCb3VuZGluZ0JveCgpKTtcblx0ICAgIHRoaXMuc3RhcnROZXdQYXRoQW5kQ2xpcEJveChpbnRlcnNlY3QgfHwgWzAsIDAsIDAsIDBdKTtcblx0ICB9XG5cdCAgaXNFbXB0eUNsaXAoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5taW5YID09PSBJbmZpbml0eTtcblx0ICB9XG5cdCAgc3RhcnROZXdQYXRoQW5kQ2xpcEJveChib3gpIHtcblx0ICAgIHRoaXMuY2xpcEJveCA9IGJveDtcblx0ICAgIHRoaXMubWluWCA9IEluZmluaXR5O1xuXHQgICAgdGhpcy5taW5ZID0gSW5maW5pdHk7XG5cdCAgICB0aGlzLm1heFggPSAwO1xuXHQgICAgdGhpcy5tYXhZID0gMDtcblx0ICB9XG5cdCAgZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveChwYXRoVHlwZSA9IF9wYXR0ZXJuX2hlbHBlci5QYXRoVHlwZS5GSUxMLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuVXRpbC5pbnRlcnNlY3QodGhpcy5jbGlwQm94LCB0aGlzLmdldFBhdGhCb3VuZGluZ0JveChwYXRoVHlwZSwgdHJhbnNmb3JtKSk7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIHB1dEJpbmFyeUltYWdlRGF0YShjdHgsIGltZ0RhdGEpIHtcblx0ICBpZiAodHlwZW9mIEltYWdlRGF0YSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpbWdEYXRhIGluc3RhbmNlb2YgSW1hZ2VEYXRhKSB7XG5cdCAgICBjdHgucHV0SW1hZ2VEYXRhKGltZ0RhdGEsIDAsIDApO1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblx0ICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodCxcblx0ICAgIHdpZHRoID0gaW1nRGF0YS53aWR0aDtcblx0ICBjb25zdCBwYXJ0aWFsQ2h1bmtIZWlnaHQgPSBoZWlnaHQgJSBGVUxMX0NIVU5LX0hFSUdIVDtcblx0ICBjb25zdCBmdWxsQ2h1bmtzID0gKGhlaWdodCAtIHBhcnRpYWxDaHVua0hlaWdodCkgLyBGVUxMX0NIVU5LX0hFSUdIVDtcblx0ICBjb25zdCB0b3RhbENodW5rcyA9IHBhcnRpYWxDaHVua0hlaWdodCA9PT0gMCA/IGZ1bGxDaHVua3MgOiBmdWxsQ2h1bmtzICsgMTtcblx0ICBjb25zdCBjaHVua0ltZ0RhdGEgPSBjdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBGVUxMX0NIVU5LX0hFSUdIVCk7XG5cdCAgbGV0IHNyY1BvcyA9IDAsXG5cdCAgICBkZXN0UG9zO1xuXHQgIGNvbnN0IHNyYyA9IGltZ0RhdGEuZGF0YTtcblx0ICBjb25zdCBkZXN0ID0gY2h1bmtJbWdEYXRhLmRhdGE7XG5cdCAgbGV0IGksIGosIHRoaXNDaHVua0hlaWdodCwgZWxlbXNJblRoaXNDaHVuaztcblx0ICBpZiAoaW1nRGF0YS5raW5kID09PSBfdXRpbC5JbWFnZUtpbmQuR1JBWVNDQUxFXzFCUFApIHtcblx0ICAgIGNvbnN0IHNyY0xlbmd0aCA9IHNyYy5ieXRlTGVuZ3RoO1xuXHQgICAgY29uc3QgZGVzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyLCAwLCBkZXN0LmJ5dGVMZW5ndGggPj4gMik7XG5cdCAgICBjb25zdCBkZXN0MzJEYXRhTGVuZ3RoID0gZGVzdDMyLmxlbmd0aDtcblx0ICAgIGNvbnN0IGZ1bGxTcmNEaWZmID0gd2lkdGggKyA3ID4+IDM7XG5cdCAgICBjb25zdCB3aGl0ZSA9IDB4ZmZmZmZmZmY7XG5cdCAgICBjb25zdCBibGFjayA9IF91dGlsLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuID8gMHhmZjAwMDAwMCA6IDB4MDAwMDAwZmY7XG5cdCAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuXHQgICAgICB0aGlzQ2h1bmtIZWlnaHQgPSBpIDwgZnVsbENodW5rcyA/IEZVTExfQ0hVTktfSEVJR0hUIDogcGFydGlhbENodW5rSGVpZ2h0O1xuXHQgICAgICBkZXN0UG9zID0gMDtcblx0ICAgICAgZm9yIChqID0gMDsgaiA8IHRoaXNDaHVua0hlaWdodDsgaisrKSB7XG5cdCAgICAgICAgY29uc3Qgc3JjRGlmZiA9IHNyY0xlbmd0aCAtIHNyY1Bvcztcblx0ICAgICAgICBsZXQgayA9IDA7XG5cdCAgICAgICAgY29uc3Qga0VuZCA9IHNyY0RpZmYgPiBmdWxsU3JjRGlmZiA/IHdpZHRoIDogc3JjRGlmZiAqIDggLSA3O1xuXHQgICAgICAgIGNvbnN0IGtFbmRVbnJvbGxlZCA9IGtFbmQgJiB+Nztcblx0ICAgICAgICBsZXQgbWFzayA9IDA7XG5cdCAgICAgICAgbGV0IHNyY0J5dGUgPSAwO1xuXHQgICAgICAgIGZvciAoOyBrIDwga0VuZFVucm9sbGVkOyBrICs9IDgpIHtcblx0ICAgICAgICAgIHNyY0J5dGUgPSBzcmNbc3JjUG9zKytdO1xuXHQgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgMTI4ID8gd2hpdGUgOiBibGFjaztcblx0ICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDY0ID8gd2hpdGUgOiBibGFjaztcblx0ICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDMyID8gd2hpdGUgOiBibGFjaztcblx0ICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDE2ID8gd2hpdGUgOiBibGFjaztcblx0ICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDggPyB3aGl0ZSA6IGJsYWNrO1xuXHQgICAgICAgICAgZGVzdDMyW2Rlc3RQb3MrK10gPSBzcmNCeXRlICYgNCA/IHdoaXRlIDogYmxhY2s7XG5cdCAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiAyID8gd2hpdGUgOiBibGFjaztcblx0ICAgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gc3JjQnl0ZSAmIDEgPyB3aGl0ZSA6IGJsYWNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmb3IgKDsgayA8IGtFbmQ7IGsrKykge1xuXHQgICAgICAgICAgaWYgKG1hc2sgPT09IDApIHtcblx0ICAgICAgICAgICAgc3JjQnl0ZSA9IHNyY1tzcmNQb3MrK107XG5cdCAgICAgICAgICAgIG1hc2sgPSAxMjg7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBkZXN0MzJbZGVzdFBvcysrXSA9IHNyY0J5dGUgJiBtYXNrID8gd2hpdGUgOiBibGFjaztcblx0ICAgICAgICAgIG1hc2sgPj49IDE7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHdoaWxlIChkZXN0UG9zIDwgZGVzdDMyRGF0YUxlbmd0aCkge1xuXHQgICAgICAgIGRlc3QzMltkZXN0UG9zKytdID0gMDtcblx0ICAgICAgfVxuXHQgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaSAqIEZVTExfQ0hVTktfSEVJR0hUKTtcblx0ICAgIH1cblx0ICB9IGVsc2UgaWYgKGltZ0RhdGEua2luZCA9PT0gX3V0aWwuSW1hZ2VLaW5kLlJHQkFfMzJCUFApIHtcblx0ICAgIGogPSAwO1xuXHQgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogRlVMTF9DSFVOS19IRUlHSFQgKiA0O1xuXHQgICAgZm9yIChpID0gMDsgaSA8IGZ1bGxDaHVua3M7IGkrKykge1xuXHQgICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjUG9zLCBzcmNQb3MgKyBlbGVtc0luVGhpc0NodW5rKSk7XG5cdCAgICAgIHNyY1BvcyArPSBlbGVtc0luVGhpc0NodW5rO1xuXHQgICAgICBjdHgucHV0SW1hZ2VEYXRhKGNodW5rSW1nRGF0YSwgMCwgaik7XG5cdCAgICAgIGogKz0gRlVMTF9DSFVOS19IRUlHSFQ7XG5cdCAgICB9XG5cdCAgICBpZiAoaSA8IHRvdGFsQ2h1bmtzKSB7XG5cdCAgICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHBhcnRpYWxDaHVua0hlaWdodCAqIDQ7XG5cdCAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNQb3MsIHNyY1BvcyArIGVsZW1zSW5UaGlzQ2h1bmspKTtcblx0ICAgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGopO1xuXHQgICAgfVxuXHQgIH0gZWxzZSBpZiAoaW1nRGF0YS5raW5kID09PSBfdXRpbC5JbWFnZUtpbmQuUkdCXzI0QlBQKSB7XG5cdCAgICB0aGlzQ2h1bmtIZWlnaHQgPSBGVUxMX0NIVU5LX0hFSUdIVDtcblx0ICAgIGVsZW1zSW5UaGlzQ2h1bmsgPSB3aWR0aCAqIHRoaXNDaHVua0hlaWdodDtcblx0ICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbENodW5rczsgaSsrKSB7XG5cdCAgICAgIGlmIChpID49IGZ1bGxDaHVua3MpIHtcblx0ICAgICAgICB0aGlzQ2h1bmtIZWlnaHQgPSBwYXJ0aWFsQ2h1bmtIZWlnaHQ7XG5cdCAgICAgICAgZWxlbXNJblRoaXNDaHVuayA9IHdpZHRoICogdGhpc0NodW5rSGVpZ2h0O1xuXHQgICAgICB9XG5cdCAgICAgIGRlc3RQb3MgPSAwO1xuXHQgICAgICBmb3IgKGogPSBlbGVtc0luVGhpc0NodW5rOyBqLS07KSB7XG5cdCAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW3NyY1BvcysrXTtcblx0ICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuXHQgICAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tzcmNQb3MrK107XG5cdCAgICAgICAgZGVzdFtkZXN0UG9zKytdID0gMjU1O1xuXHQgICAgICB9XG5cdCAgICAgIGN0eC5wdXRJbWFnZURhdGEoY2h1bmtJbWdEYXRhLCAwLCBpICogRlVMTF9DSFVOS19IRUlHSFQpO1xuXHQgICAgfVxuXHQgIH0gZWxzZSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoYGJhZCBpbWFnZSBraW5kOiAke2ltZ0RhdGEua2luZH1gKTtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gcHV0QmluYXJ5SW1hZ2VNYXNrKGN0eCwgaW1nRGF0YSkge1xuXHQgIGlmIChpbWdEYXRhLmJpdG1hcCkge1xuXHQgICAgY3R4LmRyYXdJbWFnZShpbWdEYXRhLmJpdG1hcCwgMCwgMCk7XG5cdCAgICByZXR1cm47XG5cdCAgfVxuXHQgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0LFxuXHQgICAgd2lkdGggPSBpbWdEYXRhLndpZHRoO1xuXHQgIGNvbnN0IHBhcnRpYWxDaHVua0hlaWdodCA9IGhlaWdodCAlIEZVTExfQ0hVTktfSEVJR0hUO1xuXHQgIGNvbnN0IGZ1bGxDaHVua3MgPSAoaGVpZ2h0IC0gcGFydGlhbENodW5rSGVpZ2h0KSAvIEZVTExfQ0hVTktfSEVJR0hUO1xuXHQgIGNvbnN0IHRvdGFsQ2h1bmtzID0gcGFydGlhbENodW5rSGVpZ2h0ID09PSAwID8gZnVsbENodW5rcyA6IGZ1bGxDaHVua3MgKyAxO1xuXHQgIGNvbnN0IGNodW5rSW1nRGF0YSA9IGN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIEZVTExfQ0hVTktfSEVJR0hUKTtcblx0ICBsZXQgc3JjUG9zID0gMDtcblx0ICBjb25zdCBzcmMgPSBpbWdEYXRhLmRhdGE7XG5cdCAgY29uc3QgZGVzdCA9IGNodW5rSW1nRGF0YS5kYXRhO1xuXHQgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxDaHVua3M7IGkrKykge1xuXHQgICAgY29uc3QgdGhpc0NodW5rSGVpZ2h0ID0gaSA8IGZ1bGxDaHVua3MgPyBGVUxMX0NIVU5LX0hFSUdIVCA6IHBhcnRpYWxDaHVua0hlaWdodDtcblx0ICAgICh7XG5cdCAgICAgIHNyY1Bvc1xuXHQgICAgfSA9ICgwLCBfaW1hZ2VfdXRpbHMuY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEpKHtcblx0ICAgICAgc3JjLFxuXHQgICAgICBzcmNQb3MsXG5cdCAgICAgIGRlc3QsXG5cdCAgICAgIHdpZHRoLFxuXHQgICAgICBoZWlnaHQ6IHRoaXNDaHVua0hlaWdodCxcblx0ICAgICAgbm9uQmxhY2tDb2xvcjogMFxuXHQgICAgfSkpO1xuXHQgICAgY3R4LnB1dEltYWdlRGF0YShjaHVua0ltZ0RhdGEsIDAsIGkgKiBGVUxMX0NIVU5LX0hFSUdIVCk7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGNvcHlDdHhTdGF0ZShzb3VyY2VDdHgsIGRlc3RDdHgpIHtcblx0ICBjb25zdCBwcm9wZXJ0aWVzID0gW1wic3Ryb2tlU3R5bGVcIiwgXCJmaWxsU3R5bGVcIiwgXCJmaWxsUnVsZVwiLCBcImdsb2JhbEFscGhhXCIsIFwibGluZVdpZHRoXCIsIFwibGluZUNhcFwiLCBcImxpbmVKb2luXCIsIFwibWl0ZXJMaW1pdFwiLCBcImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvblwiLCBcImZvbnRcIiwgXCJmaWx0ZXJcIl07XG5cdCAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzKSB7XG5cdCAgICBpZiAoc291cmNlQ3R4W3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIGRlc3RDdHhbcHJvcGVydHldID0gc291cmNlQ3R4W3Byb3BlcnR5XTtcblx0ICAgIH1cblx0ICB9XG5cdCAgaWYgKHNvdXJjZUN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICBkZXN0Q3R4LnNldExpbmVEYXNoKHNvdXJjZUN0eC5nZXRMaW5lRGFzaCgpKTtcblx0ICAgIGRlc3RDdHgubGluZURhc2hPZmZzZXQgPSBzb3VyY2VDdHgubGluZURhc2hPZmZzZXQ7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIHJlc2V0Q3R4VG9EZWZhdWx0KGN0eCkge1xuXHQgIGN0eC5zdHJva2VTdHlsZSA9IGN0eC5maWxsU3R5bGUgPSBcIiMwMDAwMDBcIjtcblx0ICBjdHguZmlsbFJ1bGUgPSBcIm5vbnplcm9cIjtcblx0ICBjdHguZ2xvYmFsQWxwaGEgPSAxO1xuXHQgIGN0eC5saW5lV2lkdGggPSAxO1xuXHQgIGN0eC5saW5lQ2FwID0gXCJidXR0XCI7XG5cdCAgY3R4LmxpbmVKb2luID0gXCJtaXRlclwiO1xuXHQgIGN0eC5taXRlckxpbWl0ID0gMTA7XG5cdCAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcblx0ICBjdHguZm9udCA9IFwiMTBweCBzYW5zLXNlcmlmXCI7XG5cdCAgaWYgKGN0eC5zZXRMaW5lRGFzaCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICBjdHguc2V0TGluZURhc2goW10pO1xuXHQgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gMDtcblx0ICB9XG5cdCAgaWYgKCFfaXNfbm9kZS5pc05vZGVKUykge1xuXHQgICAgY3R4LmZpbHRlciA9IFwibm9uZVwiO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBjb21wb3NlU01hc2tCYWNrZHJvcChieXRlcywgcjAsIGcwLCBiMCkge1xuXHQgIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcblx0ICBmb3IgKGxldCBpID0gMzsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG5cdCAgICBjb25zdCBhbHBoYSA9IGJ5dGVzW2ldO1xuXHQgICAgaWYgKGFscGhhID09PSAwKSB7XG5cdCAgICAgIGJ5dGVzW2kgLSAzXSA9IHIwO1xuXHQgICAgICBieXRlc1tpIC0gMl0gPSBnMDtcblx0ICAgICAgYnl0ZXNbaSAtIDFdID0gYjA7XG5cdCAgICB9IGVsc2UgaWYgKGFscGhhIDwgMjU1KSB7XG5cdCAgICAgIGNvbnN0IGFscGhhXyA9IDI1NSAtIGFscGhhO1xuXHQgICAgICBieXRlc1tpIC0gM10gPSBieXRlc1tpIC0gM10gKiBhbHBoYSArIHIwICogYWxwaGFfID4+IDg7XG5cdCAgICAgIGJ5dGVzW2kgLSAyXSA9IGJ5dGVzW2kgLSAyXSAqIGFscGhhICsgZzAgKiBhbHBoYV8gPj4gODtcblx0ICAgICAgYnl0ZXNbaSAtIDFdID0gYnl0ZXNbaSAtIDFdICogYWxwaGEgKyBiMCAqIGFscGhhXyA+PiA4O1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBjb21wb3NlU01hc2tBbHBoYShtYXNrRGF0YSwgbGF5ZXJEYXRhLCB0cmFuc2Zlck1hcCkge1xuXHQgIGNvbnN0IGxlbmd0aCA9IG1hc2tEYXRhLmxlbmd0aDtcblx0ICBjb25zdCBzY2FsZSA9IDEgLyAyNTU7XG5cdCAgZm9yIChsZXQgaSA9IDM7IGkgPCBsZW5ndGg7IGkgKz0gNCkge1xuXHQgICAgY29uc3QgYWxwaGEgPSB0cmFuc2Zlck1hcCA/IHRyYW5zZmVyTWFwW21hc2tEYXRhW2ldXSA6IG1hc2tEYXRhW2ldO1xuXHQgICAgbGF5ZXJEYXRhW2ldID0gbGF5ZXJEYXRhW2ldICogYWxwaGEgKiBzY2FsZSB8IDA7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGNvbXBvc2VTTWFza0x1bWlub3NpdHkobWFza0RhdGEsIGxheWVyRGF0YSwgdHJhbnNmZXJNYXApIHtcblx0ICBjb25zdCBsZW5ndGggPSBtYXNrRGF0YS5sZW5ndGg7XG5cdCAgZm9yIChsZXQgaSA9IDM7IGkgPCBsZW5ndGg7IGkgKz0gNCkge1xuXHQgICAgY29uc3QgeSA9IG1hc2tEYXRhW2kgLSAzXSAqIDc3ICsgbWFza0RhdGFbaSAtIDJdICogMTUyICsgbWFza0RhdGFbaSAtIDFdICogMjg7XG5cdCAgICBsYXllckRhdGFbaV0gPSB0cmFuc2Zlck1hcCA/IGxheWVyRGF0YVtpXSAqIHRyYW5zZmVyTWFwW3kgPj4gOF0gPj4gOCA6IGxheWVyRGF0YVtpXSAqIHkgPj4gMTY7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGdlbmVyaWNDb21wb3NlU01hc2sobWFza0N0eCwgbGF5ZXJDdHgsIHdpZHRoLCBoZWlnaHQsIHN1YnR5cGUsIGJhY2tkcm9wLCB0cmFuc2Zlck1hcCwgbGF5ZXJPZmZzZXRYLCBsYXllck9mZnNldFksIG1hc2tPZmZzZXRYLCBtYXNrT2Zmc2V0WSkge1xuXHQgIGNvbnN0IGhhc0JhY2tkcm9wID0gISFiYWNrZHJvcDtcblx0ICBjb25zdCByMCA9IGhhc0JhY2tkcm9wID8gYmFja2Ryb3BbMF0gOiAwO1xuXHQgIGNvbnN0IGcwID0gaGFzQmFja2Ryb3AgPyBiYWNrZHJvcFsxXSA6IDA7XG5cdCAgY29uc3QgYjAgPSBoYXNCYWNrZHJvcCA/IGJhY2tkcm9wWzJdIDogMDtcblx0ICBsZXQgY29tcG9zZUZuO1xuXHQgIGlmIChzdWJ0eXBlID09PSBcIkx1bWlub3NpdHlcIikge1xuXHQgICAgY29tcG9zZUZuID0gY29tcG9zZVNNYXNrTHVtaW5vc2l0eTtcblx0ICB9IGVsc2Uge1xuXHQgICAgY29tcG9zZUZuID0gY29tcG9zZVNNYXNrQWxwaGE7XG5cdCAgfVxuXHQgIGNvbnN0IFBJWEVMU19UT19QUk9DRVNTID0gMTA0ODU3Njtcblx0ICBjb25zdCBjaHVua1NpemUgPSBNYXRoLm1pbihoZWlnaHQsIE1hdGguY2VpbChQSVhFTFNfVE9fUFJPQ0VTUyAvIHdpZHRoKSk7XG5cdCAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKz0gY2h1bmtTaXplKSB7XG5cdCAgICBjb25zdCBjaHVua0hlaWdodCA9IE1hdGgubWluKGNodW5rU2l6ZSwgaGVpZ2h0IC0gcm93KTtcblx0ICAgIGNvbnN0IG1hc2tEYXRhID0gbWFza0N0eC5nZXRJbWFnZURhdGEobGF5ZXJPZmZzZXRYIC0gbWFza09mZnNldFgsIHJvdyArIChsYXllck9mZnNldFkgLSBtYXNrT2Zmc2V0WSksIHdpZHRoLCBjaHVua0hlaWdodCk7XG5cdCAgICBjb25zdCBsYXllckRhdGEgPSBsYXllckN0eC5nZXRJbWFnZURhdGEobGF5ZXJPZmZzZXRYLCByb3cgKyBsYXllck9mZnNldFksIHdpZHRoLCBjaHVua0hlaWdodCk7XG5cdCAgICBpZiAoaGFzQmFja2Ryb3ApIHtcblx0ICAgICAgY29tcG9zZVNNYXNrQmFja2Ryb3AobWFza0RhdGEuZGF0YSwgcjAsIGcwLCBiMCk7XG5cdCAgICB9XG5cdCAgICBjb21wb3NlRm4obWFza0RhdGEuZGF0YSwgbGF5ZXJEYXRhLmRhdGEsIHRyYW5zZmVyTWFwKTtcblx0ICAgIGxheWVyQ3R4LnB1dEltYWdlRGF0YShsYXllckRhdGEsIGxheWVyT2Zmc2V0WCwgcm93ICsgbGF5ZXJPZmZzZXRZKTtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gY29tcG9zZVNNYXNrKGN0eCwgc21hc2ssIGxheWVyQ3R4LCBsYXllckJveCkge1xuXHQgIGNvbnN0IGxheWVyT2Zmc2V0WCA9IGxheWVyQm94WzBdO1xuXHQgIGNvbnN0IGxheWVyT2Zmc2V0WSA9IGxheWVyQm94WzFdO1xuXHQgIGNvbnN0IGxheWVyV2lkdGggPSBsYXllckJveFsyXSAtIGxheWVyT2Zmc2V0WDtcblx0ICBjb25zdCBsYXllckhlaWdodCA9IGxheWVyQm94WzNdIC0gbGF5ZXJPZmZzZXRZO1xuXHQgIGlmIChsYXllcldpZHRoID09PSAwIHx8IGxheWVySGVpZ2h0ID09PSAwKSB7XG5cdCAgICByZXR1cm47XG5cdCAgfVxuXHQgIGdlbmVyaWNDb21wb3NlU01hc2soc21hc2suY29udGV4dCwgbGF5ZXJDdHgsIGxheWVyV2lkdGgsIGxheWVySGVpZ2h0LCBzbWFzay5zdWJ0eXBlLCBzbWFzay5iYWNrZHJvcCwgc21hc2sudHJhbnNmZXJNYXAsIGxheWVyT2Zmc2V0WCwgbGF5ZXJPZmZzZXRZLCBzbWFzay5vZmZzZXRYLCBzbWFzay5vZmZzZXRZKTtcblx0ICBjdHguc2F2ZSgpO1xuXHQgIGN0eC5nbG9iYWxBbHBoYSA9IDE7XG5cdCAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLW92ZXJcIjtcblx0ICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuXHQgIGN0eC5kcmF3SW1hZ2UobGF5ZXJDdHguY2FudmFzLCAwLCAwKTtcblx0ICBjdHgucmVzdG9yZSgpO1xuXHR9XG5cdGZ1bmN0aW9uIGdldEltYWdlU21vb3RoaW5nRW5hYmxlZCh0cmFuc2Zvcm0sIGludGVycG9sYXRlKSB7XG5cdCAgY29uc3Qgc2NhbGUgPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRyYW5zZm9ybSk7XG5cdCAgc2NhbGVbMF0gPSBNYXRoLmZyb3VuZChzY2FsZVswXSk7XG5cdCAgc2NhbGVbMV0gPSBNYXRoLmZyb3VuZChzY2FsZVsxXSk7XG5cdCAgY29uc3QgYWN0dWFsU2NhbGUgPSBNYXRoLmZyb3VuZCgoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpICogX2Rpc3BsYXlfdXRpbHMuUGl4ZWxzUGVySW5jaC5QREZfVE9fQ1NTX1VOSVRTKTtcblx0ICBpZiAoaW50ZXJwb2xhdGUgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgcmV0dXJuIGludGVycG9sYXRlO1xuXHQgIH0gZWxzZSBpZiAoc2NhbGVbMF0gPD0gYWN0dWFsU2NhbGUgfHwgc2NhbGVbMV0gPD0gYWN0dWFsU2NhbGUpIHtcblx0ICAgIHJldHVybiB0cnVlO1xuXHQgIH1cblx0ICByZXR1cm4gZmFsc2U7XG5cdH1cblx0Y29uc3QgTElORV9DQVBfU1RZTEVTID0gW1wiYnV0dFwiLCBcInJvdW5kXCIsIFwic3F1YXJlXCJdO1xuXHRjb25zdCBMSU5FX0pPSU5fU1RZTEVTID0gW1wibWl0ZXJcIiwgXCJyb3VuZFwiLCBcImJldmVsXCJdO1xuXHRjb25zdCBOT1JNQUxfQ0xJUCA9IHt9O1xuXHRjb25zdCBFT19DTElQID0ge307XG5cdGNsYXNzIENhbnZhc0dyYXBoaWNzIHtcblx0ICBjb25zdHJ1Y3RvcihjYW52YXNDdHgsIGNvbW1vbk9ianMsIG9ianMsIGNhbnZhc0ZhY3RvcnksIGZpbHRlckZhY3RvcnksIHtcblx0ICAgIG9wdGlvbmFsQ29udGVudENvbmZpZyxcblx0ICAgIG1hcmtlZENvbnRlbnRTdGFjayA9IG51bGxcblx0ICB9LCBhbm5vdGF0aW9uQ2FudmFzTWFwLCBwYWdlQ29sb3JzKSB7XG5cdCAgICB0aGlzLmN0eCA9IGNhbnZhc0N0eDtcblx0ICAgIHRoaXMuY3VycmVudCA9IG5ldyBDYW52YXNFeHRyYVN0YXRlKHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG5cdCAgICB0aGlzLnN0YXRlU3RhY2sgPSBbXTtcblx0ICAgIHRoaXMucGVuZGluZ0NsaXAgPSBudWxsO1xuXHQgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gZmFsc2U7XG5cdCAgICB0aGlzLnJlcyA9IG51bGw7XG5cdCAgICB0aGlzLnhvYmpzID0gbnVsbDtcblx0ICAgIHRoaXMuY29tbW9uT2JqcyA9IGNvbW1vbk9ianM7XG5cdCAgICB0aGlzLm9ianMgPSBvYmpzO1xuXHQgICAgdGhpcy5jYW52YXNGYWN0b3J5ID0gY2FudmFzRmFjdG9yeTtcblx0ICAgIHRoaXMuZmlsdGVyRmFjdG9yeSA9IGZpbHRlckZhY3Rvcnk7XG5cdCAgICB0aGlzLmdyb3VwU3RhY2sgPSBbXTtcblx0ICAgIHRoaXMucHJvY2Vzc2luZ1R5cGUzID0gbnVsbDtcblx0ICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IG51bGw7XG5cdCAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjayA9IFtdO1xuXHQgICAgdGhpcy5ncm91cExldmVsID0gMDtcblx0ICAgIHRoaXMuc21hc2tTdGFjayA9IFtdO1xuXHQgICAgdGhpcy5zbWFza0NvdW50ZXIgPSAwO1xuXHQgICAgdGhpcy50ZW1wU01hc2sgPSBudWxsO1xuXHQgICAgdGhpcy5zdXNwZW5kZWRDdHggPSBudWxsO1xuXHQgICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRydWU7XG5cdCAgICB0aGlzLm1hcmtlZENvbnRlbnRTdGFjayA9IG1hcmtlZENvbnRlbnRTdGFjayB8fCBbXTtcblx0ICAgIHRoaXMub3B0aW9uYWxDb250ZW50Q29uZmlnID0gb3B0aW9uYWxDb250ZW50Q29uZmlnO1xuXHQgICAgdGhpcy5jYWNoZWRDYW52YXNlcyA9IG5ldyBDYWNoZWRDYW52YXNlcyh0aGlzLmNhbnZhc0ZhY3RvcnkpO1xuXHQgICAgdGhpcy5jYWNoZWRQYXR0ZXJucyA9IG5ldyBNYXAoKTtcblx0ICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCA9IGFubm90YXRpb25DYW52YXNNYXA7XG5cdCAgICB0aGlzLnZpZXdwb3J0U2NhbGUgPSAxO1xuXHQgICAgdGhpcy5vdXRwdXRTY2FsZVggPSAxO1xuXHQgICAgdGhpcy5vdXRwdXRTY2FsZVkgPSAxO1xuXHQgICAgdGhpcy5wYWdlQ29sb3JzID0gcGFnZUNvbG9ycztcblx0ICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmcgPSBudWxsO1xuXHQgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG5cdCAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwID0gbmV3IE1hcCgpO1xuXHQgIH1cblx0ICBnZXRPYmplY3QoZGF0YSwgZmFsbGJhY2sgPSBudWxsKSB7XG5cdCAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHtcblx0ICAgICAgcmV0dXJuIGRhdGEuc3RhcnRzV2l0aChcImdfXCIpID8gdGhpcy5jb21tb25PYmpzLmdldChkYXRhKSA6IHRoaXMub2Jqcy5nZXQoZGF0YSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gZmFsbGJhY2s7XG5cdCAgfVxuXHQgIGJlZ2luRHJhd2luZyh7XG5cdCAgICB0cmFuc2Zvcm0sXG5cdCAgICB2aWV3cG9ydCxcblx0ICAgIHRyYW5zcGFyZW5jeSA9IGZhbHNlLFxuXHQgICAgYmFja2dyb3VuZCA9IG51bGxcblx0ICB9KSB7XG5cdCAgICBjb25zdCB3aWR0aCA9IHRoaXMuY3R4LmNhbnZhcy53aWR0aDtcblx0ICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQ7XG5cdCAgICBjb25zdCBzYXZlZEZpbGxTdHlsZSA9IHRoaXMuY3R4LmZpbGxTdHlsZTtcblx0ICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmQgfHwgXCIjZmZmZmZmXCI7XG5cdCAgICB0aGlzLmN0eC5maWxsUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcblx0ICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IHNhdmVkRmlsbFN0eWxlO1xuXHQgICAgaWYgKHRyYW5zcGFyZW5jeSkge1xuXHQgICAgICBjb25zdCB0cmFuc3BhcmVudENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwidHJhbnNwYXJlbnRcIiwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICAgIHRoaXMuY29tcG9zaXRlQ3R4ID0gdGhpcy5jdHg7XG5cdCAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSB0cmFuc3BhcmVudENhbnZhcy5jYW52YXM7XG5cdCAgICAgIHRoaXMuY3R4ID0gdHJhbnNwYXJlbnRDYW52YXMuY29udGV4dDtcblx0ICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuXHQgICAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4uKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY29tcG9zaXRlQ3R4KSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmN0eC5zYXZlKCk7XG5cdCAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG5cdCAgICBpZiAodHJhbnNmb3JtKSB7XG5cdCAgICAgIHRoaXMuY3R4LnRyYW5zZm9ybSguLi50cmFuc2Zvcm0pO1xuXHQgICAgICB0aGlzLm91dHB1dFNjYWxlWCA9IHRyYW5zZm9ybVswXTtcblx0ICAgICAgdGhpcy5vdXRwdXRTY2FsZVkgPSB0cmFuc2Zvcm1bMF07XG5cdCAgICB9XG5cdCAgICB0aGlzLmN0eC50cmFuc2Zvcm0oLi4udmlld3BvcnQudHJhbnNmb3JtKTtcblx0ICAgIHRoaXMudmlld3BvcnRTY2FsZSA9IHZpZXdwb3J0LnNjYWxlO1xuXHQgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcblx0ICB9XG5cdCAgZXhlY3V0ZU9wZXJhdG9yTGlzdChvcGVyYXRvckxpc3QsIGV4ZWN1dGlvblN0YXJ0SWR4LCBjb250aW51ZUNhbGxiYWNrLCBzdGVwcGVyKSB7XG5cdCAgICBjb25zdCBhcmdzQXJyYXkgPSBvcGVyYXRvckxpc3QuYXJnc0FycmF5O1xuXHQgICAgY29uc3QgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5O1xuXHQgICAgbGV0IGkgPSBleGVjdXRpb25TdGFydElkeCB8fCAwO1xuXHQgICAgY29uc3QgYXJnc0FycmF5TGVuID0gYXJnc0FycmF5Lmxlbmd0aDtcblx0ICAgIGlmIChhcmdzQXJyYXlMZW4gPT09IGkpIHtcblx0ICAgICAgcmV0dXJuIGk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBjaHVua09wZXJhdGlvbnMgPSBhcmdzQXJyYXlMZW4gLSBpID4gRVhFQ1VUSU9OX1NURVBTICYmIHR5cGVvZiBjb250aW51ZUNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCI7XG5cdCAgICBjb25zdCBlbmRUaW1lID0gY2h1bmtPcGVyYXRpb25zID8gRGF0ZS5ub3coKSArIEVYRUNVVElPTl9USU1FIDogMDtcblx0ICAgIGxldCBzdGVwcyA9IDA7XG5cdCAgICBjb25zdCBjb21tb25PYmpzID0gdGhpcy5jb21tb25PYmpzO1xuXHQgICAgY29uc3Qgb2JqcyA9IHRoaXMub2Jqcztcblx0ICAgIGxldCBmbklkO1xuXHQgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgaWYgKHN0ZXBwZXIgIT09IHVuZGVmaW5lZCAmJiBpID09PSBzdGVwcGVyLm5leHRCcmVha1BvaW50KSB7XG5cdCAgICAgICAgc3RlcHBlci5icmVha0l0KGksIGNvbnRpbnVlQ2FsbGJhY2spO1xuXHQgICAgICAgIHJldHVybiBpO1xuXHQgICAgICB9XG5cdCAgICAgIGZuSWQgPSBmbkFycmF5W2ldO1xuXHQgICAgICBpZiAoZm5JZCAhPT0gX3V0aWwuT1BTLmRlcGVuZGVuY3kpIHtcblx0ICAgICAgICB0aGlzW2ZuSWRdLmFwcGx5KHRoaXMsIGFyZ3NBcnJheVtpXSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgZm9yIChjb25zdCBkZXBPYmpJZCBvZiBhcmdzQXJyYXlbaV0pIHtcblx0ICAgICAgICAgIGNvbnN0IG9ianNQb29sID0gZGVwT2JqSWQuc3RhcnRzV2l0aChcImdfXCIpID8gY29tbW9uT2JqcyA6IG9ianM7XG5cdCAgICAgICAgICBpZiAoIW9ianNQb29sLmhhcyhkZXBPYmpJZCkpIHtcblx0ICAgICAgICAgICAgb2Jqc1Bvb2wuZ2V0KGRlcE9iaklkLCBjb250aW51ZUNhbGxiYWNrKTtcblx0ICAgICAgICAgICAgcmV0dXJuIGk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIGkrKztcblx0ICAgICAgaWYgKGkgPT09IGFyZ3NBcnJheUxlbikge1xuXHQgICAgICAgIHJldHVybiBpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChjaHVua09wZXJhdGlvbnMgJiYgKytzdGVwcyA+IEVYRUNVVElPTl9TVEVQUykge1xuXHQgICAgICAgIGlmIChEYXRlLm5vdygpID4gZW5kVGltZSkge1xuXHQgICAgICAgICAgY29udGludWVDYWxsYmFjaygpO1xuXHQgICAgICAgICAgcmV0dXJuIGk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHN0ZXBzID0gMDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICAjcmVzdG9yZUluaXRpYWxTdGF0ZSgpIHtcblx0ICAgIHdoaWxlICh0aGlzLnN0YXRlU3RhY2subGVuZ3RoIHx8IHRoaXMuaW5TTWFza01vZGUpIHtcblx0ICAgICAgdGhpcy5yZXN0b3JlKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG5cdCAgICBpZiAodGhpcy50cmFuc3BhcmVudENhbnZhcykge1xuXHQgICAgICB0aGlzLmN0eCA9IHRoaXMuY29tcG9zaXRlQ3R4O1xuXHQgICAgICB0aGlzLmN0eC5zYXZlKCk7XG5cdCAgICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcblx0ICAgICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMudHJhbnNwYXJlbnRDYW52YXMsIDAsIDApO1xuXHQgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG5cdCAgICAgIHRoaXMudHJhbnNwYXJlbnRDYW52YXMgPSBudWxsO1xuXHQgICAgfVxuXHQgIH1cblx0ICBlbmREcmF3aW5nKCkge1xuXHQgICAgdGhpcy4jcmVzdG9yZUluaXRpYWxTdGF0ZSgpO1xuXHQgICAgdGhpcy5jYWNoZWRDYW52YXNlcy5jbGVhcigpO1xuXHQgICAgdGhpcy5jYWNoZWRQYXR0ZXJucy5jbGVhcigpO1xuXHQgICAgZm9yIChjb25zdCBjYWNoZSBvZiB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLnZhbHVlcygpKSB7XG5cdCAgICAgIGZvciAoY29uc3QgY2FudmFzIG9mIGNhY2hlLnZhbHVlcygpKSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjYW52YXMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkge1xuXHQgICAgICAgICAgY2FudmFzLndpZHRoID0gY2FudmFzLmhlaWdodCA9IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIGNhY2hlLmNsZWFyKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9jYWNoZWRCaXRtYXBzTWFwLmNsZWFyKCk7XG5cdCAgICB0aGlzLiNkcmF3RmlsdGVyKCk7XG5cdCAgfVxuXHQgICNkcmF3RmlsdGVyKCkge1xuXHQgICAgaWYgKHRoaXMucGFnZUNvbG9ycykge1xuXHQgICAgICBjb25zdCBoY21GaWx0ZXJJZCA9IHRoaXMuZmlsdGVyRmFjdG9yeS5hZGRIQ01GaWx0ZXIodGhpcy5wYWdlQ29sb3JzLmZvcmVncm91bmQsIHRoaXMucGFnZUNvbG9ycy5iYWNrZ3JvdW5kKTtcblx0ICAgICAgaWYgKGhjbUZpbHRlcklkICE9PSBcIm5vbmVcIikge1xuXHQgICAgICAgIGNvbnN0IHNhdmVkRmlsdGVyID0gdGhpcy5jdHguZmlsdGVyO1xuXHQgICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IGhjbUZpbHRlcklkO1xuXHQgICAgICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLmN0eC5jYW52YXMsIDAsIDApO1xuXHQgICAgICAgIHRoaXMuY3R4LmZpbHRlciA9IHNhdmVkRmlsdGVyO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9zY2FsZUltYWdlKGltZywgaW52ZXJzZVRyYW5zZm9ybSkge1xuXHQgICAgY29uc3Qgd2lkdGggPSBpbWcud2lkdGg7XG5cdCAgICBjb25zdCBoZWlnaHQgPSBpbWcuaGVpZ2h0O1xuXHQgICAgbGV0IHdpZHRoU2NhbGUgPSBNYXRoLm1heChNYXRoLmh5cG90KGludmVyc2VUcmFuc2Zvcm1bMF0sIGludmVyc2VUcmFuc2Zvcm1bMV0pLCAxKTtcblx0ICAgIGxldCBoZWlnaHRTY2FsZSA9IE1hdGgubWF4KE1hdGguaHlwb3QoaW52ZXJzZVRyYW5zZm9ybVsyXSwgaW52ZXJzZVRyYW5zZm9ybVszXSksIDEpO1xuXHQgICAgbGV0IHBhaW50V2lkdGggPSB3aWR0aCxcblx0ICAgICAgcGFpbnRIZWlnaHQgPSBoZWlnaHQ7XG5cdCAgICBsZXQgdG1wQ2FudmFzSWQgPSBcInByZXNjYWxlMVwiO1xuXHQgICAgbGV0IHRtcENhbnZhcywgdG1wQ3R4O1xuXHQgICAgd2hpbGUgKHdpZHRoU2NhbGUgPiAyICYmIHBhaW50V2lkdGggPiAxIHx8IGhlaWdodFNjYWxlID4gMiAmJiBwYWludEhlaWdodCA+IDEpIHtcblx0ICAgICAgbGV0IG5ld1dpZHRoID0gcGFpbnRXaWR0aCxcblx0ICAgICAgICBuZXdIZWlnaHQgPSBwYWludEhlaWdodDtcblx0ICAgICAgaWYgKHdpZHRoU2NhbGUgPiAyICYmIHBhaW50V2lkdGggPiAxKSB7XG5cdCAgICAgICAgbmV3V2lkdGggPSBwYWludFdpZHRoID49IDE2Mzg0ID8gTWF0aC5mbG9vcihwYWludFdpZHRoIC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwocGFpbnRXaWR0aCAvIDIpO1xuXHQgICAgICAgIHdpZHRoU2NhbGUgLz0gcGFpbnRXaWR0aCAvIG5ld1dpZHRoO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChoZWlnaHRTY2FsZSA+IDIgJiYgcGFpbnRIZWlnaHQgPiAxKSB7XG5cdCAgICAgICAgbmV3SGVpZ2h0ID0gcGFpbnRIZWlnaHQgPj0gMTYzODQgPyBNYXRoLmZsb29yKHBhaW50SGVpZ2h0IC8gMikgLSAxIHx8IDEgOiBNYXRoLmNlaWwocGFpbnRIZWlnaHQpIC8gMjtcblx0ICAgICAgICBoZWlnaHRTY2FsZSAvPSBwYWludEhlaWdodCAvIG5ld0hlaWdodDtcblx0ICAgICAgfVxuXHQgICAgICB0bXBDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyh0bXBDYW52YXNJZCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XG5cdCAgICAgIHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuXHQgICAgICB0bXBDdHguY2xlYXJSZWN0KDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuXHQgICAgICB0bXBDdHguZHJhd0ltYWdlKGltZywgMCwgMCwgcGFpbnRXaWR0aCwgcGFpbnRIZWlnaHQsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuXHQgICAgICBpbWcgPSB0bXBDYW52YXMuY2FudmFzO1xuXHQgICAgICBwYWludFdpZHRoID0gbmV3V2lkdGg7XG5cdCAgICAgIHBhaW50SGVpZ2h0ID0gbmV3SGVpZ2h0O1xuXHQgICAgICB0bXBDYW52YXNJZCA9IHRtcENhbnZhc0lkID09PSBcInByZXNjYWxlMVwiID8gXCJwcmVzY2FsZTJcIiA6IFwicHJlc2NhbGUxXCI7XG5cdCAgICB9XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpbWcsXG5cdCAgICAgIHBhaW50V2lkdGgsXG5cdCAgICAgIHBhaW50SGVpZ2h0XG5cdCAgICB9O1xuXHQgIH1cblx0ICBfY3JlYXRlTWFza0NhbnZhcyhpbWcpIHtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgY29uc3Qge1xuXHQgICAgICB3aWR0aCxcblx0ICAgICAgaGVpZ2h0XG5cdCAgICB9ID0gaW1nO1xuXHQgICAgY29uc3QgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjtcblx0ICAgIGNvbnN0IGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG5cdCAgICBjb25zdCBjdXJyZW50VHJhbnNmb3JtID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCk7XG5cdCAgICBsZXQgY2FjaGUsIGNhY2hlS2V5LCBzY2FsZWQsIG1hc2tDYW52YXM7XG5cdCAgICBpZiAoKGltZy5iaXRtYXAgfHwgaW1nLmRhdGEpICYmIGltZy5jb3VudCA+IDEpIHtcblx0ICAgICAgY29uc3QgbWFpbktleSA9IGltZy5iaXRtYXAgfHwgaW1nLmRhdGEuYnVmZmVyO1xuXHQgICAgICBjYWNoZUtleSA9IEpTT04uc3RyaW5naWZ5KGlzUGF0dGVybkZpbGwgPyBjdXJyZW50VHJhbnNmb3JtIDogW2N1cnJlbnRUcmFuc2Zvcm0uc2xpY2UoMCwgNCksIGZpbGxDb2xvcl0pO1xuXHQgICAgICBjYWNoZSA9IHRoaXMuX2NhY2hlZEJpdG1hcHNNYXAuZ2V0KG1haW5LZXkpO1xuXHQgICAgICBpZiAoIWNhY2hlKSB7XG5cdCAgICAgICAgY2FjaGUgPSBuZXcgTWFwKCk7XG5cdCAgICAgICAgdGhpcy5fY2FjaGVkQml0bWFwc01hcC5zZXQobWFpbktleSwgY2FjaGUpO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IGNhY2hlZEltYWdlID0gY2FjaGUuZ2V0KGNhY2hlS2V5KTtcblx0ICAgICAgaWYgKGNhY2hlZEltYWdlICYmICFpc1BhdHRlcm5GaWxsKSB7XG5cdCAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGgucm91bmQoTWF0aC5taW4oY3VycmVudFRyYW5zZm9ybVswXSwgY3VycmVudFRyYW5zZm9ybVsyXSkgKyBjdXJyZW50VHJhbnNmb3JtWzRdKTtcblx0ICAgICAgICBjb25zdCBvZmZzZXRZID0gTWF0aC5yb3VuZChNYXRoLm1pbihjdXJyZW50VHJhbnNmb3JtWzFdLCBjdXJyZW50VHJhbnNmb3JtWzNdKSArIGN1cnJlbnRUcmFuc2Zvcm1bNV0pO1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICBjYW52YXM6IGNhY2hlZEltYWdlLFxuXHQgICAgICAgICAgb2Zmc2V0WCxcblx0ICAgICAgICAgIG9mZnNldFlcblx0ICAgICAgICB9O1xuXHQgICAgICB9XG5cdCAgICAgIHNjYWxlZCA9IGNhY2hlZEltYWdlO1xuXHQgICAgfVxuXHQgICAgaWYgKCFzY2FsZWQpIHtcblx0ICAgICAgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWFza0NhbnZhc1wiLCB3aWR0aCwgaGVpZ2h0KTtcblx0ICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDYW52YXMuY29udGV4dCwgaW1nKTtcblx0ICAgIH1cblx0ICAgIGxldCBtYXNrVG9DYW52YXMgPSBfdXRpbC5VdGlsLnRyYW5zZm9ybShjdXJyZW50VHJhbnNmb3JtLCBbMSAvIHdpZHRoLCAwLCAwLCAtMSAvIGhlaWdodCwgMCwgMF0pO1xuXHQgICAgbWFza1RvQ2FudmFzID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0obWFza1RvQ2FudmFzLCBbMSwgMCwgMCwgMSwgMCwgLWhlaWdodF0pO1xuXHQgICAgY29uc3QgY29yZDEgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFswLCAwXSwgbWFza1RvQ2FudmFzKTtcblx0ICAgIGNvbnN0IGNvcmQyID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIGhlaWdodF0sIG1hc2tUb0NhbnZhcyk7XG5cdCAgICBjb25zdCByZWN0ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KFtjb3JkMVswXSwgY29yZDFbMV0sIGNvcmQyWzBdLCBjb3JkMlsxXV0pO1xuXHQgICAgY29uc3QgZHJhd25XaWR0aCA9IE1hdGgucm91bmQocmVjdFsyXSAtIHJlY3RbMF0pIHx8IDE7XG5cdCAgICBjb25zdCBkcmF3bkhlaWdodCA9IE1hdGgucm91bmQocmVjdFszXSAtIHJlY3RbMV0pIHx8IDE7XG5cdCAgICBjb25zdCBmaWxsQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJmaWxsQ2FudmFzXCIsIGRyYXduV2lkdGgsIGRyYXduSGVpZ2h0KTtcblx0ICAgIGNvbnN0IGZpbGxDdHggPSBmaWxsQ2FudmFzLmNvbnRleHQ7XG5cdCAgICBjb25zdCBvZmZzZXRYID0gTWF0aC5taW4oY29yZDFbMF0sIGNvcmQyWzBdKTtcblx0ICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLm1pbihjb3JkMVsxXSwgY29yZDJbMV0pO1xuXHQgICAgZmlsbEN0eC50cmFuc2xhdGUoLW9mZnNldFgsIC1vZmZzZXRZKTtcblx0ICAgIGZpbGxDdHgudHJhbnNmb3JtKC4uLm1hc2tUb0NhbnZhcyk7XG5cdCAgICBpZiAoIXNjYWxlZCkge1xuXHQgICAgICBzY2FsZWQgPSB0aGlzLl9zY2FsZUltYWdlKG1hc2tDYW52YXMuY2FudmFzLCAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGZpbGxDdHgpKTtcblx0ICAgICAgc2NhbGVkID0gc2NhbGVkLmltZztcblx0ICAgICAgaWYgKGNhY2hlICYmIGlzUGF0dGVybkZpbGwpIHtcblx0ICAgICAgICBjYWNoZS5zZXQoY2FjaGVLZXksIHNjYWxlZCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGZpbGxDdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKCgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShmaWxsQ3R4KSwgaW1nLmludGVycG9sYXRlKTtcblx0ICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhmaWxsQ3R4LCBzY2FsZWQsIDAsIDAsIHNjYWxlZC53aWR0aCwgc2NhbGVkLmhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICBmaWxsQ3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IFwic291cmNlLWluXCI7XG5cdCAgICBjb25zdCBpbnZlcnNlID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0oKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShmaWxsQ3R4KSwgWzEsIDAsIDAsIDEsIC1vZmZzZXRYLCAtb2Zmc2V0WV0pO1xuXHQgICAgZmlsbEN0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCBpbnZlcnNlLCBfcGF0dGVybl9oZWxwZXIuUGF0aFR5cGUuRklMTCkgOiBmaWxsQ29sb3I7XG5cdCAgICBmaWxsQ3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgaWYgKGNhY2hlICYmICFpc1BhdHRlcm5GaWxsKSB7XG5cdCAgICAgIHRoaXMuY2FjaGVkQ2FudmFzZXMuZGVsZXRlKFwiZmlsbENhbnZhc1wiKTtcblx0ICAgICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBmaWxsQ2FudmFzLmNhbnZhcyk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjYW52YXM6IGZpbGxDYW52YXMuY2FudmFzLFxuXHQgICAgICBvZmZzZXRYOiBNYXRoLnJvdW5kKG9mZnNldFgpLFxuXHQgICAgICBvZmZzZXRZOiBNYXRoLnJvdW5kKG9mZnNldFkpXG5cdCAgICB9O1xuXHQgIH1cblx0ICBzZXRMaW5lV2lkdGgod2lkdGgpIHtcblx0ICAgIGlmICh3aWR0aCAhPT0gdGhpcy5jdXJyZW50LmxpbmVXaWR0aCkge1xuXHQgICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIHRoaXMuY3VycmVudC5saW5lV2lkdGggPSB3aWR0aDtcblx0ICAgIHRoaXMuY3R4LmxpbmVXaWR0aCA9IHdpZHRoO1xuXHQgIH1cblx0ICBzZXRMaW5lQ2FwKHN0eWxlKSB7XG5cdCAgICB0aGlzLmN0eC5saW5lQ2FwID0gTElORV9DQVBfU1RZTEVTW3N0eWxlXTtcblx0ICB9XG5cdCAgc2V0TGluZUpvaW4oc3R5bGUpIHtcblx0ICAgIHRoaXMuY3R4LmxpbmVKb2luID0gTElORV9KT0lOX1NUWUxFU1tzdHlsZV07XG5cdCAgfVxuXHQgIHNldE1pdGVyTGltaXQobGltaXQpIHtcblx0ICAgIHRoaXMuY3R4Lm1pdGVyTGltaXQgPSBsaW1pdDtcblx0ICB9XG5cdCAgc2V0RGFzaChkYXNoQXJyYXksIGRhc2hQaGFzZSkge1xuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBpZiAoY3R4LnNldExpbmVEYXNoICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgY3R4LnNldExpbmVEYXNoKGRhc2hBcnJheSk7XG5cdCAgICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IGRhc2hQaGFzZTtcblx0ICAgIH1cblx0ICB9XG5cdCAgc2V0UmVuZGVyaW5nSW50ZW50KGludGVudCkge31cblx0ICBzZXRGbGF0bmVzcyhmbGF0bmVzcykge31cblx0ICBzZXRHU3RhdGUoc3RhdGVzKSB7XG5cdCAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzdGF0ZXMpIHtcblx0ICAgICAgc3dpdGNoIChrZXkpIHtcblx0ICAgICAgICBjYXNlIFwiTFdcIjpcblx0ICAgICAgICAgIHRoaXMuc2V0TGluZVdpZHRoKHZhbHVlKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJMQ1wiOlxuXHQgICAgICAgICAgdGhpcy5zZXRMaW5lQ2FwKHZhbHVlKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJMSlwiOlxuXHQgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbih2YWx1ZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiTUxcIjpcblx0ICAgICAgICAgIHRoaXMuc2V0TWl0ZXJMaW1pdCh2YWx1ZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiRFwiOlxuXHQgICAgICAgICAgdGhpcy5zZXREYXNoKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiUklcIjpcblx0ICAgICAgICAgIHRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KHZhbHVlKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJGTFwiOlxuXHQgICAgICAgICAgdGhpcy5zZXRGbGF0bmVzcyh2YWx1ZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiRm9udFwiOlxuXHQgICAgICAgICAgdGhpcy5zZXRGb250KHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiQ0FcIjpcblx0ICAgICAgICAgIHRoaXMuY3VycmVudC5zdHJva2VBbHBoYSA9IHZhbHVlO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcImNhXCI6XG5cdCAgICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbEFscGhhID0gdmFsdWU7XG5cdCAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxBbHBoYSA9IHZhbHVlO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcIkJNXCI6XG5cdCAgICAgICAgICB0aGlzLmN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSB2YWx1ZTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJTTWFza1wiOlxuXHQgICAgICAgICAgdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrID0gdmFsdWUgPyB0aGlzLnRlbXBTTWFzayA6IG51bGw7XG5cdCAgICAgICAgICB0aGlzLnRlbXBTTWFzayA9IG51bGw7XG5cdCAgICAgICAgICB0aGlzLmNoZWNrU01hc2tTdGF0ZSgpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBcIlRSXCI6XG5cdCAgICAgICAgICB0aGlzLmN0eC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzID0gdGhpcy5maWx0ZXJGYWN0b3J5LmFkZEZpbHRlcih2YWx1ZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICBnZXQgaW5TTWFza01vZGUoKSB7XG5cdCAgICByZXR1cm4gISF0aGlzLnN1c3BlbmRlZEN0eDtcblx0ICB9XG5cdCAgY2hlY2tTTWFza1N0YXRlKCkge1xuXHQgICAgY29uc3QgaW5TTWFza01vZGUgPSB0aGlzLmluU01hc2tNb2RlO1xuXHQgICAgaWYgKHRoaXMuY3VycmVudC5hY3RpdmVTTWFzayAmJiAhaW5TTWFza01vZGUpIHtcblx0ICAgICAgdGhpcy5iZWdpblNNYXNrTW9kZSgpO1xuXHQgICAgfSBlbHNlIGlmICghdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrICYmIGluU01hc2tNb2RlKSB7XG5cdCAgICAgIHRoaXMuZW5kU01hc2tNb2RlKCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGJlZ2luU01hc2tNb2RlKCkge1xuXHQgICAgaWYgKHRoaXMuaW5TTWFza01vZGUpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmVnaW5TTWFza01vZGUgY2FsbGVkIHdoaWxlIGFscmVhZHkgaW4gc21hc2sgbW9kZVwiKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGRyYXduV2lkdGggPSB0aGlzLmN0eC5jYW52YXMud2lkdGg7XG5cdCAgICBjb25zdCBkcmF3bkhlaWdodCA9IHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQ7XG5cdCAgICBjb25zdCBjYWNoZUlkID0gXCJzbWFza0dyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcblx0ICAgIGNvbnN0IHNjcmF0Y2hDYW52YXMgPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhjYWNoZUlkLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodCk7XG5cdCAgICB0aGlzLnN1c3BlbmRlZEN0eCA9IHRoaXMuY3R4O1xuXHQgICAgdGhpcy5jdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIGN0eC5zZXRUcmFuc2Zvcm0oLi4uKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuc3VzcGVuZGVkQ3R4KSk7XG5cdCAgICBjb3B5Q3R4U3RhdGUodGhpcy5zdXNwZW5kZWRDdHgsIGN0eCk7XG5cdCAgICBtaXJyb3JDb250ZXh0T3BlcmF0aW9ucyhjdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcblx0ICAgIHRoaXMuc2V0R1N0YXRlKFtbXCJCTVwiLCBcInNvdXJjZS1vdmVyXCJdLCBbXCJjYVwiLCAxXSwgW1wiQ0FcIiwgMV1dKTtcblx0ICB9XG5cdCAgZW5kU01hc2tNb2RlKCkge1xuXHQgICAgaWYgKCF0aGlzLmluU01hc2tNb2RlKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihcImVuZFNNYXNrTW9kZSBjYWxsZWQgd2hpbGUgbm90IGluIHNtYXNrIG1vZGVcIik7XG5cdCAgICB9XG5cdCAgICB0aGlzLmN0eC5fcmVtb3ZlTWlycm9yaW5nKCk7XG5cdCAgICBjb3B5Q3R4U3RhdGUodGhpcy5jdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcblx0ICAgIHRoaXMuY3R4ID0gdGhpcy5zdXNwZW5kZWRDdHg7XG5cdCAgICB0aGlzLnN1c3BlbmRlZEN0eCA9IG51bGw7XG5cdCAgfVxuXHQgIGNvbXBvc2UoZGlydHlCb3gpIHtcblx0ICAgIGlmICghdGhpcy5jdXJyZW50LmFjdGl2ZVNNYXNrKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICghZGlydHlCb3gpIHtcblx0ICAgICAgZGlydHlCb3ggPSBbMCwgMCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCB0aGlzLmN0eC5jYW52YXMuaGVpZ2h0XTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGRpcnR5Qm94WzBdID0gTWF0aC5mbG9vcihkaXJ0eUJveFswXSk7XG5cdCAgICAgIGRpcnR5Qm94WzFdID0gTWF0aC5mbG9vcihkaXJ0eUJveFsxXSk7XG5cdCAgICAgIGRpcnR5Qm94WzJdID0gTWF0aC5jZWlsKGRpcnR5Qm94WzJdKTtcblx0ICAgICAgZGlydHlCb3hbM10gPSBNYXRoLmNlaWwoZGlydHlCb3hbM10pO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgc21hc2sgPSB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2s7XG5cdCAgICBjb25zdCBzdXNwZW5kZWRDdHggPSB0aGlzLnN1c3BlbmRlZEN0eDtcblx0ICAgIGNvbXBvc2VTTWFzayhzdXNwZW5kZWRDdHgsIHNtYXNrLCB0aGlzLmN0eCwgZGlydHlCb3gpO1xuXHQgICAgdGhpcy5jdHguc2F2ZSgpO1xuXHQgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuXHQgICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuY3R4LmNhbnZhcy53aWR0aCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCk7XG5cdCAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG5cdCAgfVxuXHQgIHNhdmUoKSB7XG5cdCAgICBpZiAodGhpcy5pblNNYXNrTW9kZSkge1xuXHQgICAgICBjb3B5Q3R4U3RhdGUodGhpcy5jdHgsIHRoaXMuc3VzcGVuZGVkQ3R4KTtcblx0ICAgICAgdGhpcy5zdXNwZW5kZWRDdHguc2F2ZSgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5jdHguc2F2ZSgpO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgb2xkID0gdGhpcy5jdXJyZW50O1xuXHQgICAgdGhpcy5zdGF0ZVN0YWNrLnB1c2gob2xkKTtcblx0ICAgIHRoaXMuY3VycmVudCA9IG9sZC5jbG9uZSgpO1xuXHQgIH1cblx0ICByZXN0b3JlKCkge1xuXHQgICAgaWYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggPT09IDAgJiYgdGhpcy5pblNNYXNrTW9kZSkge1xuXHQgICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuc3RhdGVTdGFjay5sZW5ndGggIT09IDApIHtcblx0ICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zdGF0ZVN0YWNrLnBvcCgpO1xuXHQgICAgICBpZiAodGhpcy5pblNNYXNrTW9kZSkge1xuXHQgICAgICAgIHRoaXMuc3VzcGVuZGVkQ3R4LnJlc3RvcmUoKTtcblx0ICAgICAgICBjb3B5Q3R4U3RhdGUodGhpcy5zdXNwZW5kZWRDdHgsIHRoaXMuY3R4KTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jaGVja1NNYXNrU3RhdGUoKTtcblx0ICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG5cdCAgICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmcgPSBudWxsO1xuXHQgICAgICB0aGlzLl9jYWNoZWRHZXRTaW5nbGVQaXhlbFdpZHRoID0gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cdCAgdHJhbnNmb3JtKGEsIGIsIGMsIGQsIGUsIGYpIHtcblx0ICAgIHRoaXMuY3R4LnRyYW5zZm9ybShhLCBiLCBjLCBkLCBlLCBmKTtcblx0ICAgIHRoaXMuX2NhY2hlZFNjYWxlRm9yU3Ryb2tpbmcgPSBudWxsO1xuXHQgICAgdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCA9IG51bGw7XG5cdCAgfVxuXHQgIGNvbnN0cnVjdFBhdGgob3BzLCBhcmdzLCBtaW5NYXgpIHtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgIGxldCB4ID0gY3VycmVudC54LFxuXHQgICAgICB5ID0gY3VycmVudC55O1xuXHQgICAgbGV0IHN0YXJ0WCwgc3RhcnRZO1xuXHQgICAgY29uc3QgY3VycmVudFRyYW5zZm9ybSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpO1xuXHQgICAgY29uc3QgaXNTY2FsaW5nTWF0cml4ID0gY3VycmVudFRyYW5zZm9ybVswXSA9PT0gMCAmJiBjdXJyZW50VHJhbnNmb3JtWzNdID09PSAwIHx8IGN1cnJlbnRUcmFuc2Zvcm1bMV0gPT09IDAgJiYgY3VycmVudFRyYW5zZm9ybVsyXSA9PT0gMDtcblx0ICAgIGNvbnN0IG1pbk1heEZvckJlemllciA9IGlzU2NhbGluZ01hdHJpeCA/IG1pbk1heC5zbGljZSgwKSA6IG51bGw7XG5cdCAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlpID0gb3BzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0ICAgICAgc3dpdGNoIChvcHNbaV0gfCAwKSB7XG5cdCAgICAgICAgY2FzZSBfdXRpbC5PUFMucmVjdGFuZ2xlOlxuXHQgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgIHkgPSBhcmdzW2orK107XG5cdCAgICAgICAgICBjb25zdCB3aWR0aCA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgIGNvbnN0IHh3ID0geCArIHdpZHRoO1xuXHQgICAgICAgICAgY29uc3QgeWggPSB5ICsgaGVpZ2h0O1xuXHQgICAgICAgICAgY3R4Lm1vdmVUbyh4LCB5KTtcblx0ICAgICAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcblx0ICAgICAgICAgICAgY3R4LmxpbmVUbyh4dywgeWgpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgY3R4LmxpbmVUbyh4dywgeSk7XG5cdCAgICAgICAgICAgIGN0eC5saW5lVG8oeHcsIHloKTtcblx0ICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5aCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBpZiAoIWlzU2NhbGluZ01hdHJpeCkge1xuXHQgICAgICAgICAgICBjdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgW3gsIHksIHh3LCB5aF0pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBfdXRpbC5PUFMubW92ZVRvOlxuXHQgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgIHkgPSBhcmdzW2orK107XG5cdCAgICAgICAgICBjdHgubW92ZVRvKHgsIHkpO1xuXHQgICAgICAgICAgaWYgKCFpc1NjYWxpbmdNYXRyaXgpIHtcblx0ICAgICAgICAgICAgY3VycmVudC51cGRhdGVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHgsIHkpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBfdXRpbC5PUFMubGluZVRvOlxuXHQgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgIHkgPSBhcmdzW2orK107XG5cdCAgICAgICAgICBjdHgubGluZVRvKHgsIHkpO1xuXHQgICAgICAgICAgaWYgKCFpc1NjYWxpbmdNYXRyaXgpIHtcblx0ICAgICAgICAgICAgY3VycmVudC51cGRhdGVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHgsIHkpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzpcblx0ICAgICAgICAgIHN0YXJ0WCA9IHg7XG5cdCAgICAgICAgICBzdGFydFkgPSB5O1xuXHQgICAgICAgICAgeCA9IGFyZ3NbaiArIDRdO1xuXHQgICAgICAgICAgeSA9IGFyZ3NbaiArIDVdO1xuXHQgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSwgeCwgeSk7XG5cdCAgICAgICAgICBjdXJyZW50LnVwZGF0ZUN1cnZlUGF0aE1pbk1heChjdXJyZW50VHJhbnNmb3JtLCBzdGFydFgsIHN0YXJ0WSwgYXJnc1tqXSwgYXJnc1tqICsgMV0sIGFyZ3NbaiArIDJdLCBhcmdzW2ogKyAzXSwgeCwgeSwgbWluTWF4Rm9yQmV6aWVyKTtcblx0ICAgICAgICAgIGogKz0gNjtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG8yOlxuXHQgICAgICAgICAgc3RhcnRYID0geDtcblx0ICAgICAgICAgIHN0YXJ0WSA9IHk7XG5cdCAgICAgICAgICBjdHguYmV6aWVyQ3VydmVUbyh4LCB5LCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdKTtcblx0ICAgICAgICAgIGN1cnJlbnQudXBkYXRlQ3VydmVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHN0YXJ0WCwgc3RhcnRZLCB4LCB5LCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgYXJnc1tqICsgMl0sIGFyZ3NbaiArIDNdLCBtaW5NYXhGb3JCZXppZXIpO1xuXHQgICAgICAgICAgeCA9IGFyZ3NbaiArIDJdO1xuXHQgICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuXHQgICAgICAgICAgaiArPSA0O1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzM6XG5cdCAgICAgICAgICBzdGFydFggPSB4O1xuXHQgICAgICAgICAgc3RhcnRZID0geTtcblx0ICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcblx0ICAgICAgICAgIHkgPSBhcmdzW2ogKyAzXTtcblx0ICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGFyZ3Nbal0sIGFyZ3NbaiArIDFdLCB4LCB5LCB4LCB5KTtcblx0ICAgICAgICAgIGN1cnJlbnQudXBkYXRlQ3VydmVQYXRoTWluTWF4KGN1cnJlbnRUcmFuc2Zvcm0sIHN0YXJ0WCwgc3RhcnRZLCBhcmdzW2pdLCBhcmdzW2ogKyAxXSwgeCwgeSwgeCwgeSwgbWluTWF4Rm9yQmV6aWVyKTtcblx0ICAgICAgICAgIGogKz0gNDtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlUGF0aDpcblx0ICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAoaXNTY2FsaW5nTWF0cml4KSB7XG5cdCAgICAgIGN1cnJlbnQudXBkYXRlU2NhbGluZ1BhdGhNaW5NYXgoY3VycmVudFRyYW5zZm9ybSwgbWluTWF4Rm9yQmV6aWVyKTtcblx0ICAgIH1cblx0ICAgIGN1cnJlbnQuc2V0Q3VycmVudFBvaW50KHgsIHkpO1xuXHQgIH1cblx0ICBjbG9zZVBhdGgoKSB7XG5cdCAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTtcblx0ICB9XG5cdCAgc3Ryb2tlKGNvbnN1bWVQYXRoID0gdHJ1ZSkge1xuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBjb25zdCBzdHJva2VDb2xvciA9IHRoaXMuY3VycmVudC5zdHJva2VDb2xvcjtcblx0ICAgIGN0eC5nbG9iYWxBbHBoYSA9IHRoaXMuY3VycmVudC5zdHJva2VBbHBoYTtcblx0ICAgIGlmICh0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIGlmICh0eXBlb2Ygc3Ryb2tlQ29sb3IgPT09IFwib2JqZWN0XCIgJiYgc3Ryb2tlQ29sb3I/LmdldFBhdHRlcm4pIHtcblx0ICAgICAgICBjdHguc2F2ZSgpO1xuXHQgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHN0cm9rZUNvbG9yLmdldFBhdHRlcm4oY3R4LCB0aGlzLCAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGN0eCksIF9wYXR0ZXJuX2hlbHBlci5QYXRoVHlwZS5TVFJPS0UpO1xuXHQgICAgICAgIHRoaXMucmVzY2FsZUFuZFN0cm9rZShmYWxzZSk7XG5cdCAgICAgICAgY3R4LnJlc3RvcmUoKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLnJlc2NhbGVBbmRTdHJva2UodHJ1ZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChjb25zdW1lUGF0aCkge1xuXHQgICAgICB0aGlzLmNvbnN1bWVQYXRoKHRoaXMuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KCkpO1xuXHQgICAgfVxuXHQgICAgY3R4Lmdsb2JhbEFscGhhID0gdGhpcy5jdXJyZW50LmZpbGxBbHBoYTtcblx0ICB9XG5cdCAgY2xvc2VTdHJva2UoKSB7XG5cdCAgICB0aGlzLmNsb3NlUGF0aCgpO1xuXHQgICAgdGhpcy5zdHJva2UoKTtcblx0ICB9XG5cdCAgZmlsbChjb25zdW1lUGF0aCA9IHRydWUpIHtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgY29uc3QgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjtcblx0ICAgIGNvbnN0IGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG5cdCAgICBsZXQgbmVlZFJlc3RvcmUgPSBmYWxzZTtcblx0ICAgIGlmIChpc1BhdHRlcm5GaWxsKSB7XG5cdCAgICAgIGN0eC5zYXZlKCk7XG5cdCAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsQ29sb3IuZ2V0UGF0dGVybihjdHgsIHRoaXMsICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoY3R4KSwgX3BhdHRlcm5faGVscGVyLlBhdGhUeXBlLkZJTEwpO1xuXHQgICAgICBuZWVkUmVzdG9yZSA9IHRydWU7XG5cdCAgICB9XG5cdCAgICBjb25zdCBpbnRlcnNlY3QgPSB0aGlzLmN1cnJlbnQuZ2V0Q2xpcHBlZFBhdGhCb3VuZGluZ0JveCgpO1xuXHQgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUgJiYgaW50ZXJzZWN0ICE9PSBudWxsKSB7XG5cdCAgICAgIGlmICh0aGlzLnBlbmRpbmdFT0ZpbGwpIHtcblx0ICAgICAgICBjdHguZmlsbChcImV2ZW5vZGRcIik7XG5cdCAgICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gZmFsc2U7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgY3R4LmZpbGwoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKG5lZWRSZXN0b3JlKSB7XG5cdCAgICAgIGN0eC5yZXN0b3JlKCk7XG5cdCAgICB9XG5cdCAgICBpZiAoY29uc3VtZVBhdGgpIHtcblx0ICAgICAgdGhpcy5jb25zdW1lUGF0aChpbnRlcnNlY3QpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBlb0ZpbGwoKSB7XG5cdCAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlO1xuXHQgICAgdGhpcy5maWxsKCk7XG5cdCAgfVxuXHQgIGZpbGxTdHJva2UoKSB7XG5cdCAgICB0aGlzLmZpbGwoZmFsc2UpO1xuXHQgICAgdGhpcy5zdHJva2UoZmFsc2UpO1xuXHQgICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuXHQgIH1cblx0ICBlb0ZpbGxTdHJva2UoKSB7XG5cdCAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlO1xuXHQgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG5cdCAgfVxuXHQgIGNsb3NlRmlsbFN0cm9rZSgpIHtcblx0ICAgIHRoaXMuY2xvc2VQYXRoKCk7XG5cdCAgICB0aGlzLmZpbGxTdHJva2UoKTtcblx0ICB9XG5cdCAgY2xvc2VFT0ZpbGxTdHJva2UoKSB7XG5cdCAgICB0aGlzLnBlbmRpbmdFT0ZpbGwgPSB0cnVlO1xuXHQgICAgdGhpcy5jbG9zZVBhdGgoKTtcblx0ICAgIHRoaXMuZmlsbFN0cm9rZSgpO1xuXHQgIH1cblx0ICBlbmRQYXRoKCkge1xuXHQgICAgdGhpcy5jb25zdW1lUGF0aCgpO1xuXHQgIH1cblx0ICBjbGlwKCkge1xuXHQgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IE5PUk1BTF9DTElQO1xuXHQgIH1cblx0ICBlb0NsaXAoKSB7XG5cdCAgICB0aGlzLnBlbmRpbmdDbGlwID0gRU9fQ0xJUDtcblx0ICB9XG5cdCAgYmVnaW5UZXh0KCkge1xuXHQgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7XG5cdCAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gMTtcblx0ICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcblx0ICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZID0gMDtcblx0ICB9XG5cdCAgZW5kVGV4dCgpIHtcblx0ICAgIGNvbnN0IHBhdGhzID0gdGhpcy5wZW5kaW5nVGV4dFBhdGhzO1xuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBpZiAocGF0aHMgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICBjdHguYmVnaW5QYXRoKCk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGN0eC5zYXZlKCk7XG5cdCAgICBjdHguYmVnaW5QYXRoKCk7XG5cdCAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcblx0ICAgICAgY3R4LnNldFRyYW5zZm9ybSguLi5wYXRoLnRyYW5zZm9ybSk7XG5cdCAgICAgIGN0eC50cmFuc2xhdGUocGF0aC54LCBwYXRoLnkpO1xuXHQgICAgICBwYXRoLmFkZFRvUGF0aChjdHgsIHBhdGguZm9udFNpemUpO1xuXHQgICAgfVxuXHQgICAgY3R4LnJlc3RvcmUoKTtcblx0ICAgIGN0eC5jbGlwKCk7XG5cdCAgICBjdHguYmVnaW5QYXRoKCk7XG5cdCAgICBkZWxldGUgdGhpcy5wZW5kaW5nVGV4dFBhdGhzO1xuXHQgIH1cblx0ICBzZXRDaGFyU3BhY2luZyhzcGFjaW5nKSB7XG5cdCAgICB0aGlzLmN1cnJlbnQuY2hhclNwYWNpbmcgPSBzcGFjaW5nO1xuXHQgIH1cblx0ICBzZXRXb3JkU3BhY2luZyhzcGFjaW5nKSB7XG5cdCAgICB0aGlzLmN1cnJlbnQud29yZFNwYWNpbmcgPSBzcGFjaW5nO1xuXHQgIH1cblx0ICBzZXRIU2NhbGUoc2NhbGUpIHtcblx0ICAgIHRoaXMuY3VycmVudC50ZXh0SFNjYWxlID0gc2NhbGUgLyAxMDA7XG5cdCAgfVxuXHQgIHNldExlYWRpbmcobGVhZGluZykge1xuXHQgICAgdGhpcy5jdXJyZW50LmxlYWRpbmcgPSAtbGVhZGluZztcblx0ICB9XG5cdCAgc2V0Rm9udChmb250UmVmTmFtZSwgc2l6ZSkge1xuXHQgICAgY29uc3QgZm9udE9iaiA9IHRoaXMuY29tbW9uT2Jqcy5nZXQoZm9udFJlZk5hbWUpO1xuXHQgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgIGlmICghZm9udE9iaikge1xuXHQgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGZpbmQgZm9udCBmb3IgJHtmb250UmVmTmFtZX1gKTtcblx0ICAgIH1cblx0ICAgIGN1cnJlbnQuZm9udE1hdHJpeCA9IGZvbnRPYmouZm9udE1hdHJpeCB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWDtcblx0ICAgIGlmIChjdXJyZW50LmZvbnRNYXRyaXhbMF0gPT09IDAgfHwgY3VycmVudC5mb250TWF0cml4WzNdID09PSAwKSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShcIkludmFsaWQgZm9udCBtYXRyaXggZm9yIGZvbnQgXCIgKyBmb250UmVmTmFtZSk7XG5cdCAgICB9XG5cdCAgICBpZiAoc2l6ZSA8IDApIHtcblx0ICAgICAgc2l6ZSA9IC1zaXplO1xuXHQgICAgICBjdXJyZW50LmZvbnREaXJlY3Rpb24gPSAtMTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IDE7XG5cdCAgICB9XG5cdCAgICB0aGlzLmN1cnJlbnQuZm9udCA9IGZvbnRPYmo7XG5cdCAgICB0aGlzLmN1cnJlbnQuZm9udFNpemUgPSBzaXplO1xuXHQgICAgaWYgKGZvbnRPYmouaXNUeXBlM0ZvbnQpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgbmFtZSA9IGZvbnRPYmoubG9hZGVkTmFtZSB8fCBcInNhbnMtc2VyaWZcIjtcblx0ICAgIGxldCBib2xkID0gXCJub3JtYWxcIjtcblx0ICAgIGlmIChmb250T2JqLmJsYWNrKSB7XG5cdCAgICAgIGJvbGQgPSBcIjkwMFwiO1xuXHQgICAgfSBlbHNlIGlmIChmb250T2JqLmJvbGQpIHtcblx0ICAgICAgYm9sZCA9IFwiYm9sZFwiO1xuXHQgICAgfVxuXHQgICAgY29uc3QgaXRhbGljID0gZm9udE9iai5pdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcblx0ICAgIGNvbnN0IHR5cGVmYWNlID0gYFwiJHtuYW1lfVwiLCAke2ZvbnRPYmouZmFsbGJhY2tOYW1lfWA7XG5cdCAgICBsZXQgYnJvd3NlckZvbnRTaXplID0gc2l6ZTtcblx0ICAgIGlmIChzaXplIDwgTUlOX0ZPTlRfU0laRSkge1xuXHQgICAgICBicm93c2VyRm9udFNpemUgPSBNSU5fRk9OVF9TSVpFO1xuXHQgICAgfSBlbHNlIGlmIChzaXplID4gTUFYX0ZPTlRfU0laRSkge1xuXHQgICAgICBicm93c2VyRm9udFNpemUgPSBNQVhfRk9OVF9TSVpFO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jdXJyZW50LmZvbnRTaXplU2NhbGUgPSBzaXplIC8gYnJvd3NlckZvbnRTaXplO1xuXHQgICAgdGhpcy5jdHguZm9udCA9IGAke2l0YWxpY30gJHtib2xkfSAke2Jyb3dzZXJGb250U2l6ZX1weCAke3R5cGVmYWNlfWA7XG5cdCAgfVxuXHQgIHNldFRleHRSZW5kZXJpbmdNb2RlKG1vZGUpIHtcblx0ICAgIHRoaXMuY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9IG1vZGU7XG5cdCAgfVxuXHQgIHNldFRleHRSaXNlKHJpc2UpIHtcblx0ICAgIHRoaXMuY3VycmVudC50ZXh0UmlzZSA9IHJpc2U7XG5cdCAgfVxuXHQgIG1vdmVUZXh0KHgsIHkpIHtcblx0ICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYICs9IHg7XG5cdCAgICB0aGlzLmN1cnJlbnQueSA9IHRoaXMuY3VycmVudC5saW5lWSArPSB5O1xuXHQgIH1cblx0ICBzZXRMZWFkaW5nTW92ZVRleHQoeCwgeSkge1xuXHQgICAgdGhpcy5zZXRMZWFkaW5nKC15KTtcblx0ICAgIHRoaXMubW92ZVRleHQoeCwgeSk7XG5cdCAgfVxuXHQgIHNldFRleHRNYXRyaXgoYSwgYiwgYywgZCwgZSwgZikge1xuXHQgICAgdGhpcy5jdXJyZW50LnRleHRNYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07XG5cdCAgICB0aGlzLmN1cnJlbnQudGV4dE1hdHJpeFNjYWxlID0gTWF0aC5oeXBvdChhLCBiKTtcblx0ICAgIHRoaXMuY3VycmVudC54ID0gdGhpcy5jdXJyZW50LmxpbmVYID0gMDtcblx0ICAgIHRoaXMuY3VycmVudC55ID0gdGhpcy5jdXJyZW50LmxpbmVZID0gMDtcblx0ICB9XG5cdCAgbmV4dExpbmUoKSB7XG5cdCAgICB0aGlzLm1vdmVUZXh0KDAsIHRoaXMuY3VycmVudC5sZWFkaW5nKTtcblx0ICB9XG5cdCAgcGFpbnRDaGFyKGNoYXJhY3RlciwgeCwgeSwgcGF0dGVyblRyYW5zZm9ybSkge1xuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDtcblx0ICAgIGNvbnN0IHRleHRSZW5kZXJpbmdNb2RlID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZTtcblx0ICAgIGNvbnN0IGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZSAvIGN1cnJlbnQuZm9udFNpemVTY2FsZTtcblx0ICAgIGNvbnN0IGZpbGxTdHJva2VNb2RlID0gdGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO1xuXHQgICAgY29uc3QgaXNBZGRUb1BhdGhTZXQgPSAhISh0ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcpO1xuXHQgICAgY29uc3QgcGF0dGVybkZpbGwgPSBjdXJyZW50LnBhdHRlcm5GaWxsICYmICFmb250Lm1pc3NpbmdGaWxlO1xuXHQgICAgbGV0IGFkZFRvUGF0aDtcblx0ICAgIGlmIChmb250LmRpc2FibGVGb250RmFjZSB8fCBpc0FkZFRvUGF0aFNldCB8fCBwYXR0ZXJuRmlsbCkge1xuXHQgICAgICBhZGRUb1BhdGggPSBmb250LmdldFBhdGhHZW5lcmF0b3IodGhpcy5jb21tb25PYmpzLCBjaGFyYWN0ZXIpO1xuXHQgICAgfVxuXHQgICAgaWYgKGZvbnQuZGlzYWJsZUZvbnRGYWNlIHx8IHBhdHRlcm5GaWxsKSB7XG5cdCAgICAgIGN0eC5zYXZlKCk7XG5cdCAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XG5cdCAgICAgIGN0eC5iZWdpblBhdGgoKTtcblx0ICAgICAgYWRkVG9QYXRoKGN0eCwgZm9udFNpemUpO1xuXHQgICAgICBpZiAocGF0dGVyblRyYW5zZm9ybSkge1xuXHQgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oLi4ucGF0dGVyblRyYW5zZm9ybSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuXHQgICAgICAgIGN0eC5maWxsKCk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG5cdCAgICAgICAgY3R4LnN0cm9rZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIGN0eC5yZXN0b3JlKCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTEwgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG5cdCAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXJhY3RlciwgeCwgeSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5TVFJPS0UgfHwgZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkZJTExfU1RST0tFKSB7XG5cdCAgICAgICAgY3R4LnN0cm9rZVRleHQoY2hhcmFjdGVyLCB4LCB5KTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgaWYgKGlzQWRkVG9QYXRoU2V0KSB7XG5cdCAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy5wZW5kaW5nVGV4dFBhdGhzIHx8ICh0aGlzLnBlbmRpbmdUZXh0UGF0aHMgPSBbXSk7XG5cdCAgICAgIHBhdGhzLnB1c2goe1xuXHQgICAgICAgIHRyYW5zZm9ybTogKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCksXG5cdCAgICAgICAgeCxcblx0ICAgICAgICB5LFxuXHQgICAgICAgIGZvbnRTaXplLFxuXHQgICAgICAgIGFkZFRvUGF0aFxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0IGlzRm9udFN1YnBpeGVsQUFFbmFibGVkKCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBjb250ZXh0OiBjdHhcblx0ICAgIH0gPSB0aGlzLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcImlzRm9udFN1YnBpeGVsQUFFbmFibGVkXCIsIDEwLCAxMCk7XG5cdCAgICBjdHguc2NhbGUoMS41LCAxKTtcblx0ICAgIGN0eC5maWxsVGV4dChcIklcIiwgMCwgMTApO1xuXHQgICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMTAsIDEwKS5kYXRhO1xuXHQgICAgbGV0IGVuYWJsZWQgPSBmYWxzZTtcblx0ICAgIGZvciAobGV0IGkgPSAzOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuXHQgICAgICBpZiAoZGF0YVtpXSA+IDAgJiYgZGF0YVtpXSA8IDI1NSkge1xuXHQgICAgICAgIGVuYWJsZWQgPSB0cnVlO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJpc0ZvbnRTdWJwaXhlbEFBRW5hYmxlZFwiLCBlbmFibGVkKTtcblx0ICB9XG5cdCAgc2hvd1RleHQoZ2x5cGhzKSB7XG5cdCAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDtcblx0ICAgIGlmIChmb250LmlzVHlwZTNGb250KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnNob3dUeXBlM1RleHQoZ2x5cGhzKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTtcblx0ICAgIGlmIChmb250U2l6ZSA9PT0gMCkge1xuXHQgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBjb25zdCBmb250U2l6ZVNjYWxlID0gY3VycmVudC5mb250U2l6ZVNjYWxlO1xuXHQgICAgY29uc3QgY2hhclNwYWNpbmcgPSBjdXJyZW50LmNoYXJTcGFjaW5nO1xuXHQgICAgY29uc3Qgd29yZFNwYWNpbmcgPSBjdXJyZW50LndvcmRTcGFjaW5nO1xuXHQgICAgY29uc3QgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjtcblx0ICAgIGNvbnN0IHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uO1xuXHQgICAgY29uc3QgZ2x5cGhzTGVuZ3RoID0gZ2x5cGhzLmxlbmd0aDtcblx0ICAgIGNvbnN0IHZlcnRpY2FsID0gZm9udC52ZXJ0aWNhbDtcblx0ICAgIGNvbnN0IHNwYWNpbmdEaXIgPSB2ZXJ0aWNhbCA/IDEgOiAtMTtcblx0ICAgIGNvbnN0IGRlZmF1bHRWTWV0cmljcyA9IGZvbnQuZGVmYXVsdFZNZXRyaWNzO1xuXHQgICAgY29uc3Qgd2lkdGhBZHZhbmNlU2NhbGUgPSBmb250U2l6ZSAqIGN1cnJlbnQuZm9udE1hdHJpeFswXTtcblx0ICAgIGNvbnN0IHNpbXBsZUZpbGxUZXh0ID0gY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTCAmJiAhZm9udC5kaXNhYmxlRm9udEZhY2UgJiYgIWN1cnJlbnQucGF0dGVybkZpbGw7XG5cdCAgICBjdHguc2F2ZSgpO1xuXHQgICAgY3R4LnRyYW5zZm9ybSguLi5jdXJyZW50LnRleHRNYXRyaXgpO1xuXHQgICAgY3R4LnRyYW5zbGF0ZShjdXJyZW50LngsIGN1cnJlbnQueSArIGN1cnJlbnQudGV4dFJpc2UpO1xuXHQgICAgaWYgKGZvbnREaXJlY3Rpb24gPiAwKSB7XG5cdCAgICAgIGN0eC5zY2FsZSh0ZXh0SFNjYWxlLCAtMSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjdHguc2NhbGUodGV4dEhTY2FsZSwgMSk7XG5cdCAgICB9XG5cdCAgICBsZXQgcGF0dGVyblRyYW5zZm9ybTtcblx0ICAgIGlmIChjdXJyZW50LnBhdHRlcm5GaWxsKSB7XG5cdCAgICAgIGN0eC5zYXZlKCk7XG5cdCAgICAgIGNvbnN0IHBhdHRlcm4gPSBjdXJyZW50LmZpbGxDb2xvci5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShjdHgpLCBfcGF0dGVybl9oZWxwZXIuUGF0aFR5cGUuRklMTCk7XG5cdCAgICAgIHBhdHRlcm5UcmFuc2Zvcm0gPSAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3R4KTtcblx0ICAgICAgY3R4LnJlc3RvcmUoKTtcblx0ICAgICAgY3R4LmZpbGxTdHlsZSA9IHBhdHRlcm47XG5cdCAgICB9XG5cdCAgICBsZXQgbGluZVdpZHRoID0gY3VycmVudC5saW5lV2lkdGg7XG5cdCAgICBjb25zdCBzY2FsZSA9IGN1cnJlbnQudGV4dE1hdHJpeFNjYWxlO1xuXHQgICAgaWYgKHNjYWxlID09PSAwIHx8IGxpbmVXaWR0aCA9PT0gMCkge1xuXHQgICAgICBjb25zdCBmaWxsU3Ryb2tlTW9kZSA9IGN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgJiBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRV9NQVNLO1xuXHQgICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcblx0ICAgICAgICBsaW5lV2lkdGggPSB0aGlzLmdldFNpbmdsZVBpeGVsV2lkdGgoKTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgbGluZVdpZHRoIC89IHNjYWxlO1xuXHQgICAgfVxuXHQgICAgaWYgKGZvbnRTaXplU2NhbGUgIT09IDEuMCkge1xuXHQgICAgICBjdHguc2NhbGUoZm9udFNpemVTY2FsZSwgZm9udFNpemVTY2FsZSk7XG5cdCAgICAgIGxpbmVXaWR0aCAvPSBmb250U2l6ZVNjYWxlO1xuXHQgICAgfVxuXHQgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcblx0ICAgIGlmIChmb250LmlzSW52YWxpZFBERmpzRm9udCkge1xuXHQgICAgICBjb25zdCBjaGFycyA9IFtdO1xuXHQgICAgICBsZXQgd2lkdGggPSAwO1xuXHQgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykge1xuXHQgICAgICAgIGNoYXJzLnB1c2goZ2x5cGgudW5pY29kZSk7XG5cdCAgICAgICAgd2lkdGggKz0gZ2x5cGgud2lkdGg7XG5cdCAgICAgIH1cblx0ICAgICAgY3R4LmZpbGxUZXh0KGNoYXJzLmpvaW4oXCJcIiksIDAsIDApO1xuXHQgICAgICBjdXJyZW50LnggKz0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSAqIHRleHRIU2NhbGU7XG5cdCAgICAgIGN0eC5yZXN0b3JlKCk7XG5cdCAgICAgIHRoaXMuY29tcG9zZSgpO1xuXHQgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXHQgICAgfVxuXHQgICAgbGV0IHggPSAwLFxuXHQgICAgICBpO1xuXHQgICAgZm9yIChpID0gMDsgaSA8IGdseXBoc0xlbmd0aDsgKytpKSB7XG5cdCAgICAgIGNvbnN0IGdseXBoID0gZ2x5cGhzW2ldO1xuXHQgICAgICBpZiAodHlwZW9mIGdseXBoID09PSBcIm51bWJlclwiKSB7XG5cdCAgICAgICAgeCArPSBzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSAvIDEwMDA7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgbGV0IHJlc3RvcmVOZWVkZWQgPSBmYWxzZTtcblx0ICAgICAgY29uc3Qgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nO1xuXHQgICAgICBjb25zdCBjaGFyYWN0ZXIgPSBnbHlwaC5mb250Q2hhcjtcblx0ICAgICAgY29uc3QgYWNjZW50ID0gZ2x5cGguYWNjZW50O1xuXHQgICAgICBsZXQgc2NhbGVkWCwgc2NhbGVkWTtcblx0ICAgICAgbGV0IHdpZHRoID0gZ2x5cGgud2lkdGg7XG5cdCAgICAgIGlmICh2ZXJ0aWNhbCkge1xuXHQgICAgICAgIGNvbnN0IHZtZXRyaWMgPSBnbHlwaC52bWV0cmljIHx8IGRlZmF1bHRWTWV0cmljcztcblx0ICAgICAgICBjb25zdCB2eCA9IC0oZ2x5cGgudm1ldHJpYyA/IHZtZXRyaWNbMV0gOiB3aWR0aCAqIDAuNSkgKiB3aWR0aEFkdmFuY2VTY2FsZTtcblx0ICAgICAgICBjb25zdCB2eSA9IHZtZXRyaWNbMl0gKiB3aWR0aEFkdmFuY2VTY2FsZTtcblx0ICAgICAgICB3aWR0aCA9IHZtZXRyaWMgPyAtdm1ldHJpY1swXSA6IHdpZHRoO1xuXHQgICAgICAgIHNjYWxlZFggPSB2eCAvIGZvbnRTaXplU2NhbGU7XG5cdCAgICAgICAgc2NhbGVkWSA9ICh4ICsgdnkpIC8gZm9udFNpemVTY2FsZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBzY2FsZWRYID0geCAvIGZvbnRTaXplU2NhbGU7XG5cdCAgICAgICAgc2NhbGVkWSA9IDA7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGZvbnQucmVtZWFzdXJlICYmIHdpZHRoID4gMCkge1xuXHQgICAgICAgIGNvbnN0IG1lYXN1cmVkV2lkdGggPSBjdHgubWVhc3VyZVRleHQoY2hhcmFjdGVyKS53aWR0aCAqIDEwMDAgLyBmb250U2l6ZSAqIGZvbnRTaXplU2NhbGU7XG5cdCAgICAgICAgaWYgKHdpZHRoIDwgbWVhc3VyZWRXaWR0aCAmJiB0aGlzLmlzRm9udFN1YnBpeGVsQUFFbmFibGVkKSB7XG5cdCAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJTY2FsZVggPSB3aWR0aCAvIG1lYXN1cmVkV2lkdGg7XG5cdCAgICAgICAgICByZXN0b3JlTmVlZGVkID0gdHJ1ZTtcblx0ICAgICAgICAgIGN0eC5zYXZlKCk7XG5cdCAgICAgICAgICBjdHguc2NhbGUoY2hhcmFjdGVyU2NhbGVYLCAxKTtcblx0ICAgICAgICAgIHNjYWxlZFggLz0gY2hhcmFjdGVyU2NhbGVYO1xuXHQgICAgICAgIH0gZWxzZSBpZiAod2lkdGggIT09IG1lYXN1cmVkV2lkdGgpIHtcblx0ICAgICAgICAgIHNjYWxlZFggKz0gKHdpZHRoIC0gbWVhc3VyZWRXaWR0aCkgLyAyMDAwICogZm9udFNpemUgLyBmb250U2l6ZVNjYWxlO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5jb250ZW50VmlzaWJsZSAmJiAoZ2x5cGguaXNJbkZvbnQgfHwgZm9udC5taXNzaW5nRmlsZSkpIHtcblx0ICAgICAgICBpZiAoc2ltcGxlRmlsbFRleHQgJiYgIWFjY2VudCkge1xuXHQgICAgICAgICAgY3R4LmZpbGxUZXh0KGNoYXJhY3Rlciwgc2NhbGVkWCwgc2NhbGVkWSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMucGFpbnRDaGFyKGNoYXJhY3Rlciwgc2NhbGVkWCwgc2NhbGVkWSwgcGF0dGVyblRyYW5zZm9ybSk7XG5cdCAgICAgICAgICBpZiAoYWNjZW50KSB7XG5cdCAgICAgICAgICAgIGNvbnN0IHNjYWxlZEFjY2VudFggPSBzY2FsZWRYICsgZm9udFNpemUgKiBhY2NlbnQub2Zmc2V0LnggLyBmb250U2l6ZVNjYWxlO1xuXHQgICAgICAgICAgICBjb25zdCBzY2FsZWRBY2NlbnRZID0gc2NhbGVkWSAtIGZvbnRTaXplICogYWNjZW50Lm9mZnNldC55IC8gZm9udFNpemVTY2FsZTtcblx0ICAgICAgICAgICAgdGhpcy5wYWludENoYXIoYWNjZW50LmZvbnRDaGFyLCBzY2FsZWRBY2NlbnRYLCBzY2FsZWRBY2NlbnRZLCBwYXR0ZXJuVHJhbnNmb3JtKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgbGV0IGNoYXJXaWR0aDtcblx0ICAgICAgaWYgKHZlcnRpY2FsKSB7XG5cdCAgICAgICAgY2hhcldpZHRoID0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSAtIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGNoYXJXaWR0aCA9IHdpZHRoICogd2lkdGhBZHZhbmNlU2NhbGUgKyBzcGFjaW5nICogZm9udERpcmVjdGlvbjtcblx0ICAgICAgfVxuXHQgICAgICB4ICs9IGNoYXJXaWR0aDtcblx0ICAgICAgaWYgKHJlc3RvcmVOZWVkZWQpIHtcblx0ICAgICAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodmVydGljYWwpIHtcblx0ICAgICAgY3VycmVudC55IC09IHg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBjdXJyZW50LnggKz0geCAqIHRleHRIU2NhbGU7XG5cdCAgICB9XG5cdCAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgdGhpcy5jb21wb3NlKCk7XG5cdCAgICByZXR1cm4gdW5kZWZpbmVkO1xuXHQgIH1cblx0ICBzaG93VHlwZTNUZXh0KGdseXBocykge1xuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgY29uc3QgZm9udCA9IGN1cnJlbnQuZm9udDtcblx0ICAgIGNvbnN0IGZvbnRTaXplID0gY3VycmVudC5mb250U2l6ZTtcblx0ICAgIGNvbnN0IGZvbnREaXJlY3Rpb24gPSBjdXJyZW50LmZvbnREaXJlY3Rpb247XG5cdCAgICBjb25zdCBzcGFjaW5nRGlyID0gZm9udC52ZXJ0aWNhbCA/IDEgOiAtMTtcblx0ICAgIGNvbnN0IGNoYXJTcGFjaW5nID0gY3VycmVudC5jaGFyU3BhY2luZztcblx0ICAgIGNvbnN0IHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZztcblx0ICAgIGNvbnN0IHRleHRIU2NhbGUgPSBjdXJyZW50LnRleHRIU2NhbGUgKiBmb250RGlyZWN0aW9uO1xuXHQgICAgY29uc3QgZm9udE1hdHJpeCA9IGN1cnJlbnQuZm9udE1hdHJpeCB8fCBfdXRpbC5GT05UX0lERU5USVRZX01BVFJJWDtcblx0ICAgIGNvbnN0IGdseXBoc0xlbmd0aCA9IGdseXBocy5sZW5ndGg7XG5cdCAgICBjb25zdCBpc1RleHRJbnZpc2libGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5JTlZJU0lCTEU7XG5cdCAgICBsZXQgaSwgZ2x5cGgsIHdpZHRoLCBzcGFjaW5nTGVuZ3RoO1xuXHQgICAgaWYgKGlzVGV4dEludmlzaWJsZSB8fCBmb250U2l6ZSA9PT0gMCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nID0gbnVsbDtcblx0ICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBudWxsO1xuXHQgICAgY3R4LnNhdmUoKTtcblx0ICAgIGN0eC50cmFuc2Zvcm0oLi4uY3VycmVudC50ZXh0TWF0cml4KTtcblx0ICAgIGN0eC50cmFuc2xhdGUoY3VycmVudC54LCBjdXJyZW50LnkpO1xuXHQgICAgY3R4LnNjYWxlKHRleHRIU2NhbGUsIGZvbnREaXJlY3Rpb24pO1xuXHQgICAgZm9yIChpID0gMDsgaSA8IGdseXBoc0xlbmd0aDsgKytpKSB7XG5cdCAgICAgIGdseXBoID0gZ2x5cGhzW2ldO1xuXHQgICAgICBpZiAodHlwZW9mIGdseXBoID09PSBcIm51bWJlclwiKSB7XG5cdCAgICAgICAgc3BhY2luZ0xlbmd0aCA9IHNwYWNpbmdEaXIgKiBnbHlwaCAqIGZvbnRTaXplIC8gMTAwMDtcblx0ICAgICAgICB0aGlzLmN0eC50cmFuc2xhdGUoc3BhY2luZ0xlbmd0aCwgMCk7XG5cdCAgICAgICAgY3VycmVudC54ICs9IHNwYWNpbmdMZW5ndGggKiB0ZXh0SFNjYWxlO1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IHNwYWNpbmcgPSAoZ2x5cGguaXNTcGFjZSA/IHdvcmRTcGFjaW5nIDogMCkgKyBjaGFyU3BhY2luZztcblx0ICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gZm9udC5jaGFyUHJvY09wZXJhdG9yTGlzdFtnbHlwaC5vcGVyYXRvckxpc3RJZF07XG5cdCAgICAgIGlmICghb3BlcmF0b3JMaXN0KSB7XG5cdCAgICAgICAgKDAsIF91dGlsLndhcm4pKGBUeXBlMyBjaGFyYWN0ZXIgXCIke2dseXBoLm9wZXJhdG9yTGlzdElkfVwiIGlzIG5vdCBhdmFpbGFibGUuYCk7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuY29udGVudFZpc2libGUpIHtcblx0ICAgICAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IGdseXBoO1xuXHQgICAgICAgIHRoaXMuc2F2ZSgpO1xuXHQgICAgICAgIGN0eC5zY2FsZShmb250U2l6ZSwgZm9udFNpemUpO1xuXHQgICAgICAgIGN0eC50cmFuc2Zvcm0oLi4uZm9udE1hdHJpeCk7XG5cdCAgICAgICAgdGhpcy5leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7XG5cdCAgICAgICAgdGhpcy5yZXN0b3JlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFtnbHlwaC53aWR0aCwgMF0sIGZvbnRNYXRyaXgpO1xuXHQgICAgICB3aWR0aCA9IHRyYW5zZm9ybWVkWzBdICogZm9udFNpemUgKyBzcGFjaW5nO1xuXHQgICAgICBjdHgudHJhbnNsYXRlKHdpZHRoLCAwKTtcblx0ICAgICAgY3VycmVudC54ICs9IHdpZHRoICogdGV4dEhTY2FsZTtcblx0ICAgIH1cblx0ICAgIGN0eC5yZXN0b3JlKCk7XG5cdCAgICB0aGlzLnByb2Nlc3NpbmdUeXBlMyA9IG51bGw7XG5cdCAgfVxuXHQgIHNldENoYXJXaWR0aCh4V2lkdGgsIHlXaWR0aCkge31cblx0ICBzZXRDaGFyV2lkdGhBbmRCb3VuZHMoeFdpZHRoLCB5V2lkdGgsIGxseCwgbGx5LCB1cngsIHVyeSkge1xuXHQgICAgdGhpcy5jdHgucmVjdChsbHgsIGxseSwgdXJ4IC0gbGx4LCB1cnkgLSBsbHkpO1xuXHQgICAgdGhpcy5jdHguY2xpcCgpO1xuXHQgICAgdGhpcy5lbmRQYXRoKCk7XG5cdCAgfVxuXHQgIGdldENvbG9yTl9QYXR0ZXJuKElSKSB7XG5cdCAgICBsZXQgcGF0dGVybjtcblx0ICAgIGlmIChJUlswXSA9PT0gXCJUaWxpbmdQYXR0ZXJuXCIpIHtcblx0ICAgICAgY29uc3QgY29sb3IgPSBJUlsxXTtcblx0ICAgICAgY29uc3QgYmFzZVRyYW5zZm9ybSA9IHRoaXMuYmFzZVRyYW5zZm9ybSB8fCAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpO1xuXHQgICAgICBjb25zdCBjYW52YXNHcmFwaGljc0ZhY3RvcnkgPSB7XG5cdCAgICAgICAgY3JlYXRlQ2FudmFzR3JhcGhpY3M6IGN0eCA9PiB7XG5cdCAgICAgICAgICByZXR1cm4gbmV3IENhbnZhc0dyYXBoaWNzKGN0eCwgdGhpcy5jb21tb25PYmpzLCB0aGlzLm9ianMsIHRoaXMuY2FudmFzRmFjdG9yeSwgdGhpcy5maWx0ZXJGYWN0b3J5LCB7XG5cdCAgICAgICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZzogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcsXG5cdCAgICAgICAgICAgIG1hcmtlZENvbnRlbnRTdGFjazogdGhpcy5tYXJrZWRDb250ZW50U3RhY2tcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgcGF0dGVybiA9IG5ldyBfcGF0dGVybl9oZWxwZXIuVGlsaW5nUGF0dGVybihJUiwgY29sb3IsIHRoaXMuY3R4LCBjYW52YXNHcmFwaGljc0ZhY3RvcnksIGJhc2VUcmFuc2Zvcm0pO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcGF0dGVybiA9IHRoaXMuX2dldFBhdHRlcm4oSVJbMV0sIElSWzJdKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBwYXR0ZXJuO1xuXHQgIH1cblx0ICBzZXRTdHJva2VDb2xvck4oKSB7XG5cdCAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSB0aGlzLmdldENvbG9yTl9QYXR0ZXJuKGFyZ3VtZW50cyk7XG5cdCAgfVxuXHQgIHNldEZpbGxDb2xvck4oKSB7XG5cdCAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gdGhpcy5nZXRDb2xvck5fUGF0dGVybihhcmd1bWVudHMpO1xuXHQgICAgdGhpcy5jdXJyZW50LnBhdHRlcm5GaWxsID0gdHJ1ZTtcblx0ICB9XG5cdCAgc2V0U3Ryb2tlUkdCQ29sb3IociwgZywgYikge1xuXHQgICAgY29uc3QgY29sb3IgPSBfdXRpbC5VdGlsLm1ha2VIZXhDb2xvcihyLCBnLCBiKTtcblx0ICAgIHRoaXMuY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG5cdCAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBjb2xvcjtcblx0ICB9XG5cdCAgc2V0RmlsbFJHQkNvbG9yKHIsIGcsIGIpIHtcblx0ICAgIGNvbnN0IGNvbG9yID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IociwgZywgYik7XG5cdCAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvcjtcblx0ICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSBjb2xvcjtcblx0ICAgIHRoaXMuY3VycmVudC5wYXR0ZXJuRmlsbCA9IGZhbHNlO1xuXHQgIH1cblx0ICBfZ2V0UGF0dGVybihvYmpJZCwgbWF0cml4ID0gbnVsbCkge1xuXHQgICAgbGV0IHBhdHRlcm47XG5cdCAgICBpZiAodGhpcy5jYWNoZWRQYXR0ZXJucy5oYXMob2JqSWQpKSB7XG5cdCAgICAgIHBhdHRlcm4gPSB0aGlzLmNhY2hlZFBhdHRlcm5zLmdldChvYmpJZCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBwYXR0ZXJuID0gKDAsIF9wYXR0ZXJuX2hlbHBlci5nZXRTaGFkaW5nUGF0dGVybikodGhpcy5nZXRPYmplY3Qob2JqSWQpKTtcblx0ICAgICAgdGhpcy5jYWNoZWRQYXR0ZXJucy5zZXQob2JqSWQsIHBhdHRlcm4pO1xuXHQgICAgfVxuXHQgICAgaWYgKG1hdHJpeCkge1xuXHQgICAgICBwYXR0ZXJuLm1hdHJpeCA9IG1hdHJpeDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBwYXR0ZXJuO1xuXHQgIH1cblx0ICBzaGFkaW5nRmlsbChvYmpJZCkge1xuXHQgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgdGhpcy5zYXZlKCk7XG5cdCAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5fZ2V0UGF0dGVybihvYmpJZCk7XG5cdCAgICBjdHguZmlsbFN0eWxlID0gcGF0dGVybi5nZXRQYXR0ZXJuKGN0eCwgdGhpcywgKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShjdHgpLCBfcGF0dGVybl9oZWxwZXIuUGF0aFR5cGUuU0hBRElORyk7XG5cdCAgICBjb25zdCBpbnYgPSAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybUludmVyc2UpKGN0eCk7XG5cdCAgICBpZiAoaW52KSB7XG5cdCAgICAgIGNvbnN0IGNhbnZhcyA9IGN0eC5jYW52YXM7XG5cdCAgICAgIGNvbnN0IHdpZHRoID0gY2FudmFzLndpZHRoO1xuXHQgICAgICBjb25zdCBoZWlnaHQgPSBjYW52YXMuaGVpZ2h0O1xuXHQgICAgICBjb25zdCBibCA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIDBdLCBpbnYpO1xuXHQgICAgICBjb25zdCBiciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oWzAsIGhlaWdodF0sIGludik7XG5cdCAgICAgIGNvbnN0IHVsID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIDBdLCBpbnYpO1xuXHQgICAgICBjb25zdCB1ciA9IF91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3dpZHRoLCBoZWlnaHRdLCBpbnYpO1xuXHQgICAgICBjb25zdCB4MCA9IE1hdGgubWluKGJsWzBdLCBiclswXSwgdWxbMF0sIHVyWzBdKTtcblx0ICAgICAgY29uc3QgeTAgPSBNYXRoLm1pbihibFsxXSwgYnJbMV0sIHVsWzFdLCB1clsxXSk7XG5cdCAgICAgIGNvbnN0IHgxID0gTWF0aC5tYXgoYmxbMF0sIGJyWzBdLCB1bFswXSwgdXJbMF0pO1xuXHQgICAgICBjb25zdCB5MSA9IE1hdGgubWF4KGJsWzFdLCBiclsxXSwgdWxbMV0sIHVyWzFdKTtcblx0ICAgICAgdGhpcy5jdHguZmlsbFJlY3QoeDAsIHkwLCB4MSAtIHgwLCB5MSAtIHkwKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuY3R4LmZpbGxSZWN0KC0xZTEwLCAtMWUxMCwgMmUxMCwgMmUxMCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmNvbXBvc2UodGhpcy5jdXJyZW50LmdldENsaXBwZWRQYXRoQm91bmRpbmdCb3goKSk7XG5cdCAgICB0aGlzLnJlc3RvcmUoKTtcblx0ICB9XG5cdCAgYmVnaW5JbmxpbmVJbWFnZSgpIHtcblx0ICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJTaG91bGQgbm90IGNhbGwgYmVnaW5JbmxpbmVJbWFnZVwiKTtcblx0ICB9XG5cdCAgYmVnaW5JbWFnZURhdGEoKSB7XG5cdCAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiU2hvdWxkIG5vdCBjYWxsIGJlZ2luSW1hZ2VEYXRhXCIpO1xuXHQgIH1cblx0ICBwYWludEZvcm1YT2JqZWN0QmVnaW4obWF0cml4LCBiYm94KSB7XG5cdCAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5zYXZlKCk7XG5cdCAgICB0aGlzLmJhc2VUcmFuc2Zvcm1TdGFjay5wdXNoKHRoaXMuYmFzZVRyYW5zZm9ybSk7XG5cdCAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRyaXgpICYmIG1hdHJpeC5sZW5ndGggPT09IDYpIHtcblx0ICAgICAgdGhpcy50cmFuc2Zvcm0oLi4ubWF0cml4KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9ICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCk7XG5cdCAgICBpZiAoYmJveCkge1xuXHQgICAgICBjb25zdCB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdO1xuXHQgICAgICBjb25zdCBoZWlnaHQgPSBiYm94WzNdIC0gYmJveFsxXTtcblx0ICAgICAgdGhpcy5jdHgucmVjdChiYm94WzBdLCBiYm94WzFdLCB3aWR0aCwgaGVpZ2h0KTtcblx0ICAgICAgdGhpcy5jdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KSwgYmJveCk7XG5cdCAgICAgIHRoaXMuY2xpcCgpO1xuXHQgICAgICB0aGlzLmVuZFBhdGgoKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgcGFpbnRGb3JtWE9iamVjdEVuZCgpIHtcblx0ICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLnJlc3RvcmUoKTtcblx0ICAgIHRoaXMuYmFzZVRyYW5zZm9ybSA9IHRoaXMuYmFzZVRyYW5zZm9ybVN0YWNrLnBvcCgpO1xuXHQgIH1cblx0ICBiZWdpbkdyb3VwKGdyb3VwKSB7XG5cdCAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5zYXZlKCk7XG5cdCAgICBpZiAodGhpcy5pblNNYXNrTW9kZSkge1xuXHQgICAgICB0aGlzLmVuZFNNYXNrTW9kZSgpO1xuXHQgICAgICB0aGlzLmN1cnJlbnQuYWN0aXZlU01hc2sgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY3VycmVudEN0eCA9IHRoaXMuY3R4O1xuXHQgICAgaWYgKCFncm91cC5pc29sYXRlZCkge1xuXHQgICAgICAoMCwgX3V0aWwuaW5mbykoXCJUT0RPOiBTdXBwb3J0IG5vbi1pc29sYXRlZCBncm91cHMuXCIpO1xuXHQgICAgfVxuXHQgICAgaWYgKGdyb3VwLmtub2Nrb3V0KSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShcIktub2Nrb3V0IGdyb3VwcyBub3Qgc3VwcG9ydGVkLlwiKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGN1cnJlbnRUcmFuc2Zvcm0gPSAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3VycmVudEN0eCk7XG5cdCAgICBpZiAoZ3JvdXAubWF0cml4KSB7XG5cdCAgICAgIGN1cnJlbnRDdHgudHJhbnNmb3JtKC4uLmdyb3VwLm1hdHJpeCk7XG5cdCAgICB9XG5cdCAgICBpZiAoIWdyb3VwLmJib3gpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRpbmcgYm94IGlzIHJlcXVpcmVkLlwiKTtcblx0ICAgIH1cblx0ICAgIGxldCBib3VuZHMgPSBfdXRpbC5VdGlsLmdldEF4aWFsQWxpZ25lZEJvdW5kaW5nQm94KGdyb3VwLmJib3gsICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdXJyZW50Q3R4KSk7XG5cdCAgICBjb25zdCBjYW52YXNCb3VuZHMgPSBbMCwgMCwgY3VycmVudEN0eC5jYW52YXMud2lkdGgsIGN1cnJlbnRDdHguY2FudmFzLmhlaWdodF07XG5cdCAgICBib3VuZHMgPSBfdXRpbC5VdGlsLmludGVyc2VjdChib3VuZHMsIGNhbnZhc0JvdW5kcykgfHwgWzAsIDAsIDAsIDBdO1xuXHQgICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGguZmxvb3IoYm91bmRzWzBdKTtcblx0ICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLmZsb29yKGJvdW5kc1sxXSk7XG5cdCAgICBsZXQgZHJhd25XaWR0aCA9IE1hdGgubWF4KE1hdGguY2VpbChib3VuZHNbMl0pIC0gb2Zmc2V0WCwgMSk7XG5cdCAgICBsZXQgZHJhd25IZWlnaHQgPSBNYXRoLm1heChNYXRoLmNlaWwoYm91bmRzWzNdKSAtIG9mZnNldFksIDEpO1xuXHQgICAgbGV0IHNjYWxlWCA9IDEsXG5cdCAgICAgIHNjYWxlWSA9IDE7XG5cdCAgICBpZiAoZHJhd25XaWR0aCA+IE1BWF9HUk9VUF9TSVpFKSB7XG5cdCAgICAgIHNjYWxlWCA9IGRyYXduV2lkdGggLyBNQVhfR1JPVVBfU0laRTtcblx0ICAgICAgZHJhd25XaWR0aCA9IE1BWF9HUk9VUF9TSVpFO1xuXHQgICAgfVxuXHQgICAgaWYgKGRyYXduSGVpZ2h0ID4gTUFYX0dST1VQX1NJWkUpIHtcblx0ICAgICAgc2NhbGVZID0gZHJhd25IZWlnaHQgLyBNQVhfR1JPVVBfU0laRTtcblx0ICAgICAgZHJhd25IZWlnaHQgPSBNQVhfR1JPVVBfU0laRTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY3VycmVudC5zdGFydE5ld1BhdGhBbmRDbGlwQm94KFswLCAwLCBkcmF3bldpZHRoLCBkcmF3bkhlaWdodF0pO1xuXHQgICAgbGV0IGNhY2hlSWQgPSBcImdyb3VwQXRcIiArIHRoaXMuZ3JvdXBMZXZlbDtcblx0ICAgIGlmIChncm91cC5zbWFzaykge1xuXHQgICAgICBjYWNoZUlkICs9IFwiX3NtYXNrX1wiICsgdGhpcy5zbWFza0NvdW50ZXIrKyAlIDI7XG5cdCAgICB9XG5cdCAgICBjb25zdCBzY3JhdGNoQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoY2FjaGVJZCwgZHJhd25XaWR0aCwgZHJhd25IZWlnaHQpO1xuXHQgICAgY29uc3QgZ3JvdXBDdHggPSBzY3JhdGNoQ2FudmFzLmNvbnRleHQ7XG5cdCAgICBncm91cEN0eC5zY2FsZSgxIC8gc2NhbGVYLCAxIC8gc2NhbGVZKTtcblx0ICAgIGdyb3VwQ3R4LnRyYW5zbGF0ZSgtb2Zmc2V0WCwgLW9mZnNldFkpO1xuXHQgICAgZ3JvdXBDdHgudHJhbnNmb3JtKC4uLmN1cnJlbnRUcmFuc2Zvcm0pO1xuXHQgICAgaWYgKGdyb3VwLnNtYXNrKSB7XG5cdCAgICAgIHRoaXMuc21hc2tTdGFjay5wdXNoKHtcblx0ICAgICAgICBjYW52YXM6IHNjcmF0Y2hDYW52YXMuY2FudmFzLFxuXHQgICAgICAgIGNvbnRleHQ6IGdyb3VwQ3R4LFxuXHQgICAgICAgIG9mZnNldFgsXG5cdCAgICAgICAgb2Zmc2V0WSxcblx0ICAgICAgICBzY2FsZVgsXG5cdCAgICAgICAgc2NhbGVZLFxuXHQgICAgICAgIHN1YnR5cGU6IGdyb3VwLnNtYXNrLnN1YnR5cGUsXG5cdCAgICAgICAgYmFja2Ryb3A6IGdyb3VwLnNtYXNrLmJhY2tkcm9wLFxuXHQgICAgICAgIHRyYW5zZmVyTWFwOiBncm91cC5zbWFzay50cmFuc2Zlck1hcCB8fCBudWxsLFxuXHQgICAgICAgIHN0YXJ0VHJhbnNmb3JtSW52ZXJzZTogbnVsbFxuXHQgICAgICB9KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGN1cnJlbnRDdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuXHQgICAgICBjdXJyZW50Q3R4LnRyYW5zbGF0ZShvZmZzZXRYLCBvZmZzZXRZKTtcblx0ICAgICAgY3VycmVudEN0eC5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG5cdCAgICAgIGN1cnJlbnRDdHguc2F2ZSgpO1xuXHQgICAgfVxuXHQgICAgY29weUN0eFN0YXRlKGN1cnJlbnRDdHgsIGdyb3VwQ3R4KTtcblx0ICAgIHRoaXMuY3R4ID0gZ3JvdXBDdHg7XG5cdCAgICB0aGlzLnNldEdTdGF0ZShbW1wiQk1cIiwgXCJzb3VyY2Utb3ZlclwiXSwgW1wiY2FcIiwgMV0sIFtcIkNBXCIsIDFdXSk7XG5cdCAgICB0aGlzLmdyb3VwU3RhY2sucHVzaChjdXJyZW50Q3R4KTtcblx0ICAgIHRoaXMuZ3JvdXBMZXZlbCsrO1xuXHQgIH1cblx0ICBlbmRHcm91cChncm91cCkge1xuXHQgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuZ3JvdXBMZXZlbC0tO1xuXHQgICAgY29uc3QgZ3JvdXBDdHggPSB0aGlzLmN0eDtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuZ3JvdXBTdGFjay5wb3AoKTtcblx0ICAgIHRoaXMuY3R4ID0gY3R4O1xuXHQgICAgdGhpcy5jdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG5cdCAgICBpZiAoZ3JvdXAuc21hc2spIHtcblx0ICAgICAgdGhpcy50ZW1wU01hc2sgPSB0aGlzLnNtYXNrU3RhY2sucG9wKCk7XG5cdCAgICAgIHRoaXMucmVzdG9yZSgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuXHQgICAgICBjb25zdCBjdXJyZW50TXR4ID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcblx0ICAgICAgdGhpcy5yZXN0b3JlKCk7XG5cdCAgICAgIHRoaXMuY3R4LnNhdmUoKTtcblx0ICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKC4uLmN1cnJlbnRNdHgpO1xuXHQgICAgICBjb25zdCBkaXJ0eUJveCA9IF91dGlsLlV0aWwuZ2V0QXhpYWxBbGlnbmVkQm91bmRpbmdCb3goWzAsIDAsIGdyb3VwQ3R4LmNhbnZhcy53aWR0aCwgZ3JvdXBDdHguY2FudmFzLmhlaWdodF0sIGN1cnJlbnRNdHgpO1xuXHQgICAgICB0aGlzLmN0eC5kcmF3SW1hZ2UoZ3JvdXBDdHguY2FudmFzLCAwLCAwKTtcblx0ICAgICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuXHQgICAgICB0aGlzLmNvbXBvc2UoZGlydHlCb3gpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBiZWdpbkFubm90YXRpb24oaWQsIHJlY3QsIHRyYW5zZm9ybSwgbWF0cml4LCBoYXNPd25DYW52YXMpIHtcblx0ICAgIHRoaXMuI3Jlc3RvcmVJbml0aWFsU3RhdGUoKTtcblx0ICAgIHJlc2V0Q3R4VG9EZWZhdWx0KHRoaXMuY3R4KTtcblx0ICAgIHRoaXMuY3R4LnNhdmUoKTtcblx0ICAgIHRoaXMuc2F2ZSgpO1xuXHQgICAgaWYgKHRoaXMuYmFzZVRyYW5zZm9ybSkge1xuXHQgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oLi4udGhpcy5iYXNlVHJhbnNmb3JtKTtcblx0ICAgIH1cblx0ICAgIGlmIChBcnJheS5pc0FycmF5KHJlY3QpICYmIHJlY3QubGVuZ3RoID09PSA0KSB7XG5cdCAgICAgIGNvbnN0IHdpZHRoID0gcmVjdFsyXSAtIHJlY3RbMF07XG5cdCAgICAgIGNvbnN0IGhlaWdodCA9IHJlY3RbM10gLSByZWN0WzFdO1xuXHQgICAgICBpZiAoaGFzT3duQ2FudmFzICYmIHRoaXMuYW5ub3RhdGlvbkNhbnZhc01hcCkge1xuXHQgICAgICAgIHRyYW5zZm9ybSA9IHRyYW5zZm9ybS5zbGljZSgpO1xuXHQgICAgICAgIHRyYW5zZm9ybVs0XSAtPSByZWN0WzBdO1xuXHQgICAgICAgIHRyYW5zZm9ybVs1XSAtPSByZWN0WzFdO1xuXHQgICAgICAgIHJlY3QgPSByZWN0LnNsaWNlKCk7XG5cdCAgICAgICAgcmVjdFswXSA9IHJlY3RbMV0gPSAwO1xuXHQgICAgICAgIHJlY3RbMl0gPSB3aWR0aDtcblx0ICAgICAgICByZWN0WzNdID0gaGVpZ2h0O1xuXHQgICAgICAgIGNvbnN0IFtzY2FsZVgsIHNjYWxlWV0gPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKCgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKSh0aGlzLmN0eCkpO1xuXHQgICAgICAgIGNvbnN0IHtcblx0ICAgICAgICAgIHZpZXdwb3J0U2NhbGVcblx0ICAgICAgICB9ID0gdGhpcztcblx0ICAgICAgICBjb25zdCBjYW52YXNXaWR0aCA9IE1hdGguY2VpbCh3aWR0aCAqIHRoaXMub3V0cHV0U2NhbGVYICogdmlld3BvcnRTY2FsZSk7XG5cdCAgICAgICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gTWF0aC5jZWlsKGhlaWdodCAqIHRoaXMub3V0cHV0U2NhbGVZICogdmlld3BvcnRTY2FsZSk7XG5cdCAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FudmFzID0gdGhpcy5jYW52YXNGYWN0b3J5LmNyZWF0ZShjYW52YXNXaWR0aCwgY2FudmFzSGVpZ2h0KTtcblx0ICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICBjYW52YXMsXG5cdCAgICAgICAgICBjb250ZXh0XG5cdCAgICAgICAgfSA9IHRoaXMuYW5ub3RhdGlvbkNhbnZhcztcblx0ICAgICAgICB0aGlzLmFubm90YXRpb25DYW52YXNNYXAuc2V0KGlkLCBjYW52YXMpO1xuXHQgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eCA9IHRoaXMuY3R4O1xuXHQgICAgICAgIHRoaXMuY3R4ID0gY29udGV4dDtcblx0ICAgICAgICB0aGlzLmN0eC5zYXZlKCk7XG5cdCAgICAgICAgdGhpcy5jdHguc2V0VHJhbnNmb3JtKHNjYWxlWCwgMCwgMCwgLXNjYWxlWSwgMCwgaGVpZ2h0ICogc2NhbGVZKTtcblx0ICAgICAgICByZXNldEN0eFRvRGVmYXVsdCh0aGlzLmN0eCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcmVzZXRDdHhUb0RlZmF1bHQodGhpcy5jdHgpO1xuXHQgICAgICAgIHRoaXMuY3R4LnJlY3QocmVjdFswXSwgcmVjdFsxXSwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICAgICAgdGhpcy5jdHguY2xpcCgpO1xuXHQgICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLmN1cnJlbnQgPSBuZXcgQ2FudmFzRXh0cmFTdGF0ZSh0aGlzLmN0eC5jYW52YXMud2lkdGgsIHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpO1xuXHQgICAgdGhpcy50cmFuc2Zvcm0oLi4udHJhbnNmb3JtKTtcblx0ICAgIHRoaXMudHJhbnNmb3JtKC4uLm1hdHJpeCk7XG5cdCAgfVxuXHQgIGVuZEFubm90YXRpb24oKSB7XG5cdCAgICBpZiAodGhpcy5hbm5vdGF0aW9uQ2FudmFzKSB7XG5cdCAgICAgIHRoaXMuY3R4LnJlc3RvcmUoKTtcblx0ICAgICAgdGhpcy4jZHJhd0ZpbHRlcigpO1xuXHQgICAgICB0aGlzLmN0eCA9IHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eDtcblx0ICAgICAgZGVsZXRlIHRoaXMuYW5ub3RhdGlvbkNhbnZhcy5zYXZlZEN0eDtcblx0ICAgICAgZGVsZXRlIHRoaXMuYW5ub3RhdGlvbkNhbnZhcztcblx0ICAgIH1cblx0ICB9XG5cdCAgcGFpbnRJbWFnZU1hc2tYT2JqZWN0KGltZykge1xuXHQgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGNvdW50ID0gaW1nLmNvdW50O1xuXHQgICAgaW1nID0gdGhpcy5nZXRPYmplY3QoaW1nLmRhdGEsIGltZyk7XG5cdCAgICBpbWcuY291bnQgPSBjb3VudDtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgY29uc3QgZ2x5cGggPSB0aGlzLnByb2Nlc3NpbmdUeXBlMztcblx0ICAgIGlmIChnbHlwaCkge1xuXHQgICAgICBpZiAoZ2x5cGguY29tcGlsZWQgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGdseXBoLmNvbXBpbGVkID0gY29tcGlsZVR5cGUzR2x5cGgoaW1nKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoZ2x5cGguY29tcGlsZWQpIHtcblx0ICAgICAgICBnbHlwaC5jb21waWxlZChjdHgpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgY29uc3QgbWFzayA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXMoaW1nKTtcblx0ICAgIGNvbnN0IG1hc2tDYW52YXMgPSBtYXNrLmNhbnZhcztcblx0ICAgIGN0eC5zYXZlKCk7XG5cdCAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuXHQgICAgY3R4LmRyYXdJbWFnZShtYXNrQ2FudmFzLCBtYXNrLm9mZnNldFgsIG1hc2sub2Zmc2V0WSk7XG5cdCAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgdGhpcy5jb21wb3NlKCk7XG5cdCAgfVxuXHQgIHBhaW50SW1hZ2VNYXNrWE9iamVjdFJlcGVhdChpbWcsIHNjYWxlWCwgc2tld1ggPSAwLCBza2V3WSA9IDAsIHNjYWxlWSwgcG9zaXRpb25zKSB7XG5cdCAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaW1nID0gdGhpcy5nZXRPYmplY3QoaW1nLmRhdGEsIGltZyk7XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIGN0eC5zYXZlKCk7XG5cdCAgICBjb25zdCBjdXJyZW50VHJhbnNmb3JtID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCk7XG5cdCAgICBjdHgudHJhbnNmb3JtKHNjYWxlWCwgc2tld1gsIHNrZXdZLCBzY2FsZVksIDAsIDApO1xuXHQgICAgY29uc3QgbWFzayA9IHRoaXMuX2NyZWF0ZU1hc2tDYW52YXMoaW1nKTtcblx0ICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgbWFzay5vZmZzZXRYIC0gY3VycmVudFRyYW5zZm9ybVs0XSwgbWFzay5vZmZzZXRZIC0gY3VycmVudFRyYW5zZm9ybVs1XSk7XG5cdCAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWk7IGkgKz0gMikge1xuXHQgICAgICBjb25zdCB0cmFucyA9IF91dGlsLlV0aWwudHJhbnNmb3JtKGN1cnJlbnRUcmFuc2Zvcm0sIFtzY2FsZVgsIHNrZXdYLCBza2V3WSwgc2NhbGVZLCBwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV1dKTtcblx0ICAgICAgY29uc3QgW3gsIHldID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIHRyYW5zKTtcblx0ICAgICAgY3R4LmRyYXdJbWFnZShtYXNrLmNhbnZhcywgeCwgeSk7XG5cdCAgICB9XG5cdCAgICBjdHgucmVzdG9yZSgpO1xuXHQgICAgdGhpcy5jb21wb3NlKCk7XG5cdCAgfVxuXHQgIHBhaW50SW1hZ2VNYXNrWE9iamVjdEdyb3VwKGltYWdlcykge1xuXHQgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgY29uc3QgZmlsbENvbG9yID0gdGhpcy5jdXJyZW50LmZpbGxDb2xvcjtcblx0ICAgIGNvbnN0IGlzUGF0dGVybkZpbGwgPSB0aGlzLmN1cnJlbnQucGF0dGVybkZpbGw7XG5cdCAgICBmb3IgKGNvbnN0IGltYWdlIG9mIGltYWdlcykge1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgZGF0YSxcblx0ICAgICAgICB3aWR0aCxcblx0ICAgICAgICBoZWlnaHQsXG5cdCAgICAgICAgdHJhbnNmb3JtXG5cdCAgICAgIH0gPSBpbWFnZTtcblx0ICAgICAgY29uc3QgbWFza0NhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwibWFza0NhbnZhc1wiLCB3aWR0aCwgaGVpZ2h0KTtcblx0ICAgICAgY29uc3QgbWFza0N0eCA9IG1hc2tDYW52YXMuY29udGV4dDtcblx0ICAgICAgbWFza0N0eC5zYXZlKCk7XG5cdCAgICAgIGNvbnN0IGltZyA9IHRoaXMuZ2V0T2JqZWN0KGRhdGEsIGltYWdlKTtcblx0ICAgICAgcHV0QmluYXJ5SW1hZ2VNYXNrKG1hc2tDdHgsIGltZyk7XG5cdCAgICAgIG1hc2tDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gXCJzb3VyY2UtaW5cIjtcblx0ICAgICAgbWFza0N0eC5maWxsU3R5bGUgPSBpc1BhdHRlcm5GaWxsID8gZmlsbENvbG9yLmdldFBhdHRlcm4obWFza0N0eCwgdGhpcywgKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm1JbnZlcnNlKShjdHgpLCBfcGF0dGVybl9oZWxwZXIuUGF0aFR5cGUuRklMTCkgOiBmaWxsQ29sb3I7XG5cdCAgICAgIG1hc2tDdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICAgIG1hc2tDdHgucmVzdG9yZSgpO1xuXHQgICAgICBjdHguc2F2ZSgpO1xuXHQgICAgICBjdHgudHJhbnNmb3JtKC4uLnRyYW5zZm9ybSk7XG5cdCAgICAgIGN0eC5zY2FsZSgxLCAtMSk7XG5cdCAgICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIG1hc2tDYW52YXMuY2FudmFzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSwgMSk7XG5cdCAgICAgIGN0eC5yZXN0b3JlKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmNvbXBvc2UoKTtcblx0ICB9XG5cdCAgcGFpbnRJbWFnZVhPYmplY3Qob2JqSWQpIHtcblx0ICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBpbWdEYXRhID0gdGhpcy5nZXRPYmplY3Qob2JqSWQpO1xuXHQgICAgaWYgKCFpbWdEYXRhKSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShcIkRlcGVuZGVudCBpbWFnZSBpc24ndCByZWFkeSB5ZXRcIik7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMucGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSk7XG5cdCAgfVxuXHQgIHBhaW50SW1hZ2VYT2JqZWN0UmVwZWF0KG9iaklkLCBzY2FsZVgsIHNjYWxlWSwgcG9zaXRpb25zKSB7XG5cdCAgICBpZiAoIXRoaXMuY29udGVudFZpc2libGUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgaW1nRGF0YSA9IHRoaXMuZ2V0T2JqZWN0KG9iaklkKTtcblx0ICAgIGlmICghaW1nRGF0YSkge1xuXHQgICAgICAoMCwgX3V0aWwud2FybikoXCJEZXBlbmRlbnQgaW1hZ2UgaXNuJ3QgcmVhZHkgeWV0XCIpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG5cdCAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcblx0ICAgIGNvbnN0IG1hcCA9IFtdO1xuXHQgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlpOyBpICs9IDIpIHtcblx0ICAgICAgbWFwLnB1c2goe1xuXHQgICAgICAgIHRyYW5zZm9ybTogW3NjYWxlWCwgMCwgMCwgc2NhbGVZLCBwb3NpdGlvbnNbaV0sIHBvc2l0aW9uc1tpICsgMV1dLFxuXHQgICAgICAgIHg6IDAsXG5cdCAgICAgICAgeTogMCxcblx0ICAgICAgICB3OiB3aWR0aCxcblx0ICAgICAgICBoOiBoZWlnaHRcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0R3JvdXAoaW1nRGF0YSwgbWFwKTtcblx0ICB9XG5cdCAgYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyhjdHgpIHtcblx0ICAgIGlmICh0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzICE9PSBcIm5vbmVcIikge1xuXHQgICAgICBjdHguZmlsdGVyID0gdGhpcy5jdXJyZW50LnRyYW5zZmVyTWFwcztcblx0ICAgICAgY3R4LmRyYXdJbWFnZShjdHguY2FudmFzLCAwLCAwKTtcblx0ICAgICAgY3R4LmZpbHRlciA9IFwibm9uZVwiO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGN0eC5jYW52YXM7XG5cdCAgfVxuXHQgIGFwcGx5VHJhbnNmZXJNYXBzVG9CaXRtYXAoaW1nRGF0YSkge1xuXHQgICAgaWYgKHRoaXMuY3VycmVudC50cmFuc2Zlck1hcHMgPT09IFwibm9uZVwiKSB7XG5cdCAgICAgIHJldHVybiBpbWdEYXRhLmJpdG1hcDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHtcblx0ICAgICAgYml0bWFwLFxuXHQgICAgICB3aWR0aCxcblx0ICAgICAgaGVpZ2h0XG5cdCAgICB9ID0gaW1nRGF0YTtcblx0ICAgIGNvbnN0IHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgd2lkdGgsIGhlaWdodCk7XG5cdCAgICBjb25zdCB0bXBDdHggPSB0bXBDYW52YXMuY29udGV4dDtcblx0ICAgIHRtcEN0eC5maWx0ZXIgPSB0aGlzLmN1cnJlbnQudHJhbnNmZXJNYXBzO1xuXHQgICAgdG1wQ3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApO1xuXHQgICAgdG1wQ3R4LmZpbHRlciA9IFwibm9uZVwiO1xuXHQgICAgcmV0dXJuIHRtcENhbnZhcy5jYW52YXM7XG5cdCAgfVxuXHQgIHBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpIHtcblx0ICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG5cdCAgICBjb25zdCBoZWlnaHQgPSBpbWdEYXRhLmhlaWdodDtcblx0ICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuXHQgICAgdGhpcy5zYXZlKCk7XG5cdCAgICBpZiAoIV9pc19ub2RlLmlzTm9kZUpTKSB7XG5cdCAgICAgIGN0eC5maWx0ZXIgPSBcIm5vbmVcIjtcblx0ICAgIH1cblx0ICAgIGN0eC5zY2FsZSgxIC8gd2lkdGgsIC0xIC8gaGVpZ2h0KTtcblx0ICAgIGxldCBpbWdUb1BhaW50O1xuXHQgICAgaWYgKGltZ0RhdGEuYml0bWFwKSB7XG5cdCAgICAgIGltZ1RvUGFpbnQgPSB0aGlzLmFwcGx5VHJhbnNmZXJNYXBzVG9CaXRtYXAoaW1nRGF0YSk7XG5cdCAgICB9IGVsc2UgaWYgKHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIGltZ0RhdGEgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCAhaW1nRGF0YS5kYXRhKSB7XG5cdCAgICAgIGltZ1RvUGFpbnQgPSBpbWdEYXRhO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc3QgdG1wQ2FudmFzID0gdGhpcy5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJpbmxpbmVJbWFnZVwiLCB3aWR0aCwgaGVpZ2h0KTtcblx0ICAgICAgY29uc3QgdG1wQ3R4ID0gdG1wQ2FudmFzLmNvbnRleHQ7XG5cdCAgICAgIHB1dEJpbmFyeUltYWdlRGF0YSh0bXBDdHgsIGltZ0RhdGEpO1xuXHQgICAgICBpbWdUb1BhaW50ID0gdGhpcy5hcHBseVRyYW5zZmVyTWFwc1RvQ2FudmFzKHRtcEN0eCk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBzY2FsZWQgPSB0aGlzLl9zY2FsZUltYWdlKGltZ1RvUGFpbnQsICgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtSW52ZXJzZSkoY3R4KSk7XG5cdCAgICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZ2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKCgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpLCBpbWdEYXRhLmludGVycG9sYXRlKTtcblx0ICAgIGRyYXdJbWFnZUF0SW50ZWdlckNvb3JkcyhjdHgsIHNjYWxlZC5pbWcsIDAsIDAsIHNjYWxlZC5wYWludFdpZHRoLCBzY2FsZWQucGFpbnRIZWlnaHQsIDAsIC1oZWlnaHQsIHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgdGhpcy5jb21wb3NlKCk7XG5cdCAgICB0aGlzLnJlc3RvcmUoKTtcblx0ICB9XG5cdCAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3RHcm91cChpbWdEYXRhLCBtYXApIHtcblx0ICAgIGlmICghdGhpcy5jb250ZW50VmlzaWJsZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgIGxldCBpbWdUb1BhaW50O1xuXHQgICAgaWYgKGltZ0RhdGEuYml0bWFwKSB7XG5cdCAgICAgIGltZ1RvUGFpbnQgPSBpbWdEYXRhLmJpdG1hcDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGNvbnN0IHcgPSBpbWdEYXRhLndpZHRoO1xuXHQgICAgICBjb25zdCBoID0gaW1nRGF0YS5oZWlnaHQ7XG5cdCAgICAgIGNvbnN0IHRtcENhbnZhcyA9IHRoaXMuY2FjaGVkQ2FudmFzZXMuZ2V0Q2FudmFzKFwiaW5saW5lSW1hZ2VcIiwgdywgaCk7XG5cdCAgICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuXHQgICAgICBwdXRCaW5hcnlJbWFnZURhdGEodG1wQ3R4LCBpbWdEYXRhKTtcblx0ICAgICAgaW1nVG9QYWludCA9IHRoaXMuYXBwbHlUcmFuc2Zlck1hcHNUb0NhbnZhcyh0bXBDdHgpO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBlbnRyeSBvZiBtYXApIHtcblx0ICAgICAgY3R4LnNhdmUoKTtcblx0ICAgICAgY3R4LnRyYW5zZm9ybSguLi5lbnRyeS50cmFuc2Zvcm0pO1xuXHQgICAgICBjdHguc2NhbGUoMSwgLTEpO1xuXHQgICAgICBkcmF3SW1hZ2VBdEludGVnZXJDb29yZHMoY3R4LCBpbWdUb1BhaW50LCBlbnRyeS54LCBlbnRyeS55LCBlbnRyeS53LCBlbnRyeS5oLCAwLCAtMSwgMSwgMSk7XG5cdCAgICAgIGN0eC5yZXN0b3JlKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmNvbXBvc2UoKTtcblx0ICB9XG5cdCAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCkge1xuXHQgICAgaWYgKCF0aGlzLmNvbnRlbnRWaXNpYmxlKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuXHQgICAgdGhpcy5jb21wb3NlKCk7XG5cdCAgfVxuXHQgIG1hcmtQb2ludCh0YWcpIHt9XG5cdCAgbWFya1BvaW50UHJvcHModGFnLCBwcm9wZXJ0aWVzKSB7fVxuXHQgIGJlZ2luTWFya2VkQ29udGVudCh0YWcpIHtcblx0ICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnB1c2goe1xuXHQgICAgICB2aXNpYmxlOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgYmVnaW5NYXJrZWRDb250ZW50UHJvcHModGFnLCBwcm9wZXJ0aWVzKSB7XG5cdCAgICBpZiAodGFnID09PSBcIk9DXCIpIHtcblx0ICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG5cdCAgICAgICAgdmlzaWJsZTogdGhpcy5vcHRpb25hbENvbnRlbnRDb25maWcuaXNWaXNpYmxlKHByb3BlcnRpZXMpXG5cdCAgICAgIH0pO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5tYXJrZWRDb250ZW50U3RhY2sucHVzaCh7XG5cdCAgICAgICAgdmlzaWJsZTogdHJ1ZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGVudFZpc2libGUgPSB0aGlzLmlzQ29udGVudFZpc2libGUoKTtcblx0ICB9XG5cdCAgZW5kTWFya2VkQ29udGVudCgpIHtcblx0ICAgIHRoaXMubWFya2VkQ29udGVudFN0YWNrLnBvcCgpO1xuXHQgICAgdGhpcy5jb250ZW50VmlzaWJsZSA9IHRoaXMuaXNDb250ZW50VmlzaWJsZSgpO1xuXHQgIH1cblx0ICBiZWdpbkNvbXBhdCgpIHt9XG5cdCAgZW5kQ29tcGF0KCkge31cblx0ICBjb25zdW1lUGF0aChjbGlwQm94KSB7XG5cdCAgICBjb25zdCBpc0VtcHR5ID0gdGhpcy5jdXJyZW50LmlzRW1wdHlDbGlwKCk7XG5cdCAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQudXBkYXRlQ2xpcEZyb21QYXRoKCk7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMucGVuZGluZ0NsaXApIHtcblx0ICAgICAgdGhpcy5jb21wb3NlKGNsaXBCb3gpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG5cdCAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuXHQgICAgICBpZiAoIWlzRW1wdHkpIHtcblx0ICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCA9PT0gRU9fQ0xJUCkge1xuXHQgICAgICAgICAgY3R4LmNsaXAoXCJldmVub2RkXCIpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBjdHguY2xpcCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIHRoaXMuY3VycmVudC5zdGFydE5ld1BhdGhBbmRDbGlwQm94KHRoaXMuY3VycmVudC5jbGlwQm94KTtcblx0ICAgIGN0eC5iZWdpblBhdGgoKTtcblx0ICB9XG5cdCAgZ2V0U2luZ2xlUGl4ZWxXaWR0aCgpIHtcblx0ICAgIGlmICghdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aCkge1xuXHQgICAgICBjb25zdCBtID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKHRoaXMuY3R4KTtcblx0ICAgICAgaWYgKG1bMV0gPT09IDAgJiYgbVsyXSA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSAxIC8gTWF0aC5taW4oTWF0aC5hYnMobVswXSksIE1hdGguYWJzKG1bM10pKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjb25zdCBhYnNEZXQgPSBNYXRoLmFicyhtWzBdICogbVszXSAtIG1bMl0gKiBtWzFdKTtcblx0ICAgICAgICBjb25zdCBub3JtWCA9IE1hdGguaHlwb3QobVswXSwgbVsyXSk7XG5cdCAgICAgICAgY29uc3Qgbm9ybVkgPSBNYXRoLmh5cG90KG1bMV0sIG1bM10pO1xuXHQgICAgICAgIHRoaXMuX2NhY2hlZEdldFNpbmdsZVBpeGVsV2lkdGggPSBNYXRoLm1heChub3JtWCwgbm9ybVkpIC8gYWJzRGV0O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5fY2FjaGVkR2V0U2luZ2xlUGl4ZWxXaWR0aDtcblx0ICB9XG5cdCAgZ2V0U2NhbGVGb3JTdHJva2luZygpIHtcblx0ICAgIGlmICghdGhpcy5fY2FjaGVkU2NhbGVGb3JTdHJva2luZykge1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgbGluZVdpZHRoXG5cdCAgICAgIH0gPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIGNvbnN0IG0gPSAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkodGhpcy5jdHgpO1xuXHQgICAgICBsZXQgc2NhbGVYLCBzY2FsZVk7XG5cdCAgICAgIGlmIChtWzFdID09PSAwICYmIG1bMl0gPT09IDApIHtcblx0ICAgICAgICBjb25zdCBub3JtWCA9IE1hdGguYWJzKG1bMF0pO1xuXHQgICAgICAgIGNvbnN0IG5vcm1ZID0gTWF0aC5hYnMobVszXSk7XG5cdCAgICAgICAgaWYgKGxpbmVXaWR0aCA9PT0gMCkge1xuXHQgICAgICAgICAgc2NhbGVYID0gMSAvIG5vcm1YO1xuXHQgICAgICAgICAgc2NhbGVZID0gMSAvIG5vcm1ZO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBjb25zdCBzY2FsZWRYTGluZVdpZHRoID0gbm9ybVggKiBsaW5lV2lkdGg7XG5cdCAgICAgICAgICBjb25zdCBzY2FsZWRZTGluZVdpZHRoID0gbm9ybVkgKiBsaW5lV2lkdGg7XG5cdCAgICAgICAgICBzY2FsZVggPSBzY2FsZWRYTGluZVdpZHRoIDwgMSA/IDEgLyBzY2FsZWRYTGluZVdpZHRoIDogMTtcblx0ICAgICAgICAgIHNjYWxlWSA9IHNjYWxlZFlMaW5lV2lkdGggPCAxID8gMSAvIHNjYWxlZFlMaW5lV2lkdGggOiAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjb25zdCBhYnNEZXQgPSBNYXRoLmFicyhtWzBdICogbVszXSAtIG1bMl0gKiBtWzFdKTtcblx0ICAgICAgICBjb25zdCBub3JtWCA9IE1hdGguaHlwb3QobVswXSwgbVsxXSk7XG5cdCAgICAgICAgY29uc3Qgbm9ybVkgPSBNYXRoLmh5cG90KG1bMl0sIG1bM10pO1xuXHQgICAgICAgIGlmIChsaW5lV2lkdGggPT09IDApIHtcblx0ICAgICAgICAgIHNjYWxlWCA9IG5vcm1ZIC8gYWJzRGV0O1xuXHQgICAgICAgICAgc2NhbGVZID0gbm9ybVggLyBhYnNEZXQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGNvbnN0IGJhc2VBcmVhID0gbGluZVdpZHRoICogYWJzRGV0O1xuXHQgICAgICAgICAgc2NhbGVYID0gbm9ybVkgPiBiYXNlQXJlYSA/IG5vcm1ZIC8gYmFzZUFyZWEgOiAxO1xuXHQgICAgICAgICAgc2NhbGVZID0gbm9ybVggPiBiYXNlQXJlYSA/IG5vcm1YIC8gYmFzZUFyZWEgOiAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nID0gW3NjYWxlWCwgc2NhbGVZXTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLl9jYWNoZWRTY2FsZUZvclN0cm9raW5nO1xuXHQgIH1cblx0ICByZXNjYWxlQW5kU3Ryb2tlKHNhdmVSZXN0b3JlKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGN0eFxuXHQgICAgfSA9IHRoaXM7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGxpbmVXaWR0aFxuXHQgICAgfSA9IHRoaXMuY3VycmVudDtcblx0ICAgIGNvbnN0IFtzY2FsZVgsIHNjYWxlWV0gPSB0aGlzLmdldFNjYWxlRm9yU3Ryb2tpbmcoKTtcblx0ICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGggfHwgMTtcblx0ICAgIGlmIChzY2FsZVggPT09IDEgJiYgc2NhbGVZID09PSAxKSB7XG5cdCAgICAgIGN0eC5zdHJva2UoKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgbGV0IHNhdmVkTWF0cml4LCBzYXZlZERhc2hlcywgc2F2ZWREYXNoT2Zmc2V0O1xuXHQgICAgaWYgKHNhdmVSZXN0b3JlKSB7XG5cdCAgICAgIHNhdmVkTWF0cml4ID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGN0eCk7XG5cdCAgICAgIHNhdmVkRGFzaGVzID0gY3R4LmdldExpbmVEYXNoKCkuc2xpY2UoKTtcblx0ICAgICAgc2F2ZWREYXNoT2Zmc2V0ID0gY3R4LmxpbmVEYXNoT2Zmc2V0O1xuXHQgICAgfVxuXHQgICAgY3R4LnNjYWxlKHNjYWxlWCwgc2NhbGVZKTtcblx0ICAgIGNvbnN0IHNjYWxlID0gTWF0aC5tYXgoc2NhbGVYLCBzY2FsZVkpO1xuXHQgICAgY3R4LnNldExpbmVEYXNoKGN0eC5nZXRMaW5lRGFzaCgpLm1hcCh4ID0+IHggLyBzY2FsZSkpO1xuXHQgICAgY3R4LmxpbmVEYXNoT2Zmc2V0IC89IHNjYWxlO1xuXHQgICAgY3R4LnN0cm9rZSgpO1xuXHQgICAgaWYgKHNhdmVSZXN0b3JlKSB7XG5cdCAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oLi4uc2F2ZWRNYXRyaXgpO1xuXHQgICAgICBjdHguc2V0TGluZURhc2goc2F2ZWREYXNoZXMpO1xuXHQgICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBzYXZlZERhc2hPZmZzZXQ7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGlzQ29udGVudFZpc2libGUoKSB7XG5cdCAgICBmb3IgKGxldCBpID0gdGhpcy5tYXJrZWRDb250ZW50U3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0ICAgICAgaWYgKCF0aGlzLm1hcmtlZENvbnRlbnRTdGFja1tpXS52aXNpYmxlKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5DYW52YXNHcmFwaGljcyA9IENhbnZhc0dyYXBoaWNzO1xuXHRmb3IgKGNvbnN0IG9wIGluIF91dGlsLk9QUykge1xuXHQgIGlmIChDYW52YXNHcmFwaGljcy5wcm90b3R5cGVbb3BdICE9PSB1bmRlZmluZWQpIHtcblx0ICAgIENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtfdXRpbC5PUFNbb3BdXSA9IENhbnZhc0dyYXBoaWNzLnByb3RvdHlwZVtvcF07XG5cdCAgfVxuXHR9XG5cblx0LyoqKi8gfSksXG5cdC8qIDEyICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5UaWxpbmdQYXR0ZXJuID0gZXhwb3J0cy5QYXRoVHlwZSA9IHZvaWQgMDtcblx0ZXhwb3J0cy5nZXRTaGFkaW5nUGF0dGVybiA9IGdldFNoYWRpbmdQYXR0ZXJuO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHRjb25zdCBQYXRoVHlwZSA9IHtcblx0ICBGSUxMOiBcIkZpbGxcIixcblx0ICBTVFJPS0U6IFwiU3Ryb2tlXCIsXG5cdCAgU0hBRElORzogXCJTaGFkaW5nXCJcblx0fTtcblx0ZXhwb3J0cy5QYXRoVHlwZSA9IFBhdGhUeXBlO1xuXHRmdW5jdGlvbiBhcHBseUJvdW5kaW5nQm94KGN0eCwgYmJveCkge1xuXHQgIGlmICghYmJveCkge1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblx0ICBjb25zdCB3aWR0aCA9IGJib3hbMl0gLSBiYm94WzBdO1xuXHQgIGNvbnN0IGhlaWdodCA9IGJib3hbM10gLSBiYm94WzFdO1xuXHQgIGNvbnN0IHJlZ2lvbiA9IG5ldyBQYXRoMkQoKTtcblx0ICByZWdpb24ucmVjdChiYm94WzBdLCBiYm94WzFdLCB3aWR0aCwgaGVpZ2h0KTtcblx0ICBjdHguY2xpcChyZWdpb24pO1xuXHR9XG5cdGNsYXNzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG5cdCAgY29uc3RydWN0b3IoKSB7XG5cdCAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZVNoYWRpbmdQYXR0ZXJuKSB7XG5cdCAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJDYW5ub3QgaW5pdGlhbGl6ZSBCYXNlU2hhZGluZ1BhdHRlcm4uXCIpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXRQYXR0ZXJuKCkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgZ2V0UGF0dGVybmAgY2FsbGVkLlwiKTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG5cdCAgY29uc3RydWN0b3IoSVIpIHtcblx0ICAgIHN1cGVyKCk7XG5cdCAgICB0aGlzLl90eXBlID0gSVJbMV07XG5cdCAgICB0aGlzLl9iYm94ID0gSVJbMl07XG5cdCAgICB0aGlzLl9jb2xvclN0b3BzID0gSVJbM107XG5cdCAgICB0aGlzLl9wMCA9IElSWzRdO1xuXHQgICAgdGhpcy5fcDEgPSBJUls1XTtcblx0ICAgIHRoaXMuX3IwID0gSVJbNl07XG5cdCAgICB0aGlzLl9yMSA9IElSWzddO1xuXHQgICAgdGhpcy5tYXRyaXggPSBudWxsO1xuXHQgIH1cblx0ICBfY3JlYXRlR3JhZGllbnQoY3R4KSB7XG5cdCAgICBsZXQgZ3JhZDtcblx0ICAgIGlmICh0aGlzLl90eXBlID09PSBcImF4aWFsXCIpIHtcblx0ICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3AxWzBdLCB0aGlzLl9wMVsxXSk7XG5cdCAgICB9IGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFwicmFkaWFsXCIpIHtcblx0ICAgICAgZ3JhZCA9IGN0eC5jcmVhdGVSYWRpYWxHcmFkaWVudCh0aGlzLl9wMFswXSwgdGhpcy5fcDBbMV0sIHRoaXMuX3IwLCB0aGlzLl9wMVswXSwgdGhpcy5fcDFbMV0sIHRoaXMuX3IxKTtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgY29sb3JTdG9wIG9mIHRoaXMuX2NvbG9yU3RvcHMpIHtcblx0ICAgICAgZ3JhZC5hZGRDb2xvclN0b3AoY29sb3JTdG9wWzBdLCBjb2xvclN0b3BbMV0pO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGdyYWQ7XG5cdCAgfVxuXHQgIGdldFBhdHRlcm4oY3R4LCBvd25lciwgaW52ZXJzZSwgcGF0aFR5cGUpIHtcblx0ICAgIGxldCBwYXR0ZXJuO1xuXHQgICAgaWYgKHBhdGhUeXBlID09PSBQYXRoVHlwZS5TVFJPS0UgfHwgcGF0aFR5cGUgPT09IFBhdGhUeXBlLkZJTEwpIHtcblx0ICAgICAgY29uc3Qgb3duZXJCQm94ID0gb3duZXIuY3VycmVudC5nZXRDbGlwcGVkUGF0aEJvdW5kaW5nQm94KHBhdGhUeXBlLCAoMCwgX2Rpc3BsYXlfdXRpbHMuZ2V0Q3VycmVudFRyYW5zZm9ybSkoY3R4KSkgfHwgWzAsIDAsIDAsIDBdO1xuXHQgICAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChvd25lckJCb3hbMl0gLSBvd25lckJCb3hbMF0pIHx8IDE7XG5cdCAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguY2VpbChvd25lckJCb3hbM10gLSBvd25lckJCb3hbMV0pIHx8IDE7XG5cdCAgICAgIGNvbnN0IHRtcENhbnZhcyA9IG93bmVyLmNhY2hlZENhbnZhc2VzLmdldENhbnZhcyhcInBhdHRlcm5cIiwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG5cdCAgICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuXHQgICAgICB0bXBDdHguY2xlYXJSZWN0KDAsIDAsIHRtcEN0eC5jYW52YXMud2lkdGgsIHRtcEN0eC5jYW52YXMuaGVpZ2h0KTtcblx0ICAgICAgdG1wQ3R4LmJlZ2luUGF0aCgpO1xuXHQgICAgICB0bXBDdHgucmVjdCgwLCAwLCB0bXBDdHguY2FudmFzLndpZHRoLCB0bXBDdHguY2FudmFzLmhlaWdodCk7XG5cdCAgICAgIHRtcEN0eC50cmFuc2xhdGUoLW93bmVyQkJveFswXSwgLW93bmVyQkJveFsxXSk7XG5cdCAgICAgIGludmVyc2UgPSBfdXRpbC5VdGlsLnRyYW5zZm9ybShpbnZlcnNlLCBbMSwgMCwgMCwgMSwgb3duZXJCQm94WzBdLCBvd25lckJCb3hbMV1dKTtcblx0ICAgICAgdG1wQ3R4LnRyYW5zZm9ybSguLi5vd25lci5iYXNlVHJhbnNmb3JtKTtcblx0ICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG5cdCAgICAgICAgdG1wQ3R4LnRyYW5zZm9ybSguLi50aGlzLm1hdHJpeCk7XG5cdCAgICAgIH1cblx0ICAgICAgYXBwbHlCb3VuZGluZ0JveCh0bXBDdHgsIHRoaXMuX2Jib3gpO1xuXHQgICAgICB0bXBDdHguZmlsbFN0eWxlID0gdGhpcy5fY3JlYXRlR3JhZGllbnQodG1wQ3R4KTtcblx0ICAgICAgdG1wQ3R4LmZpbGwoKTtcblx0ICAgICAgcGF0dGVybiA9IGN0eC5jcmVhdGVQYXR0ZXJuKHRtcENhbnZhcy5jYW52YXMsIFwibm8tcmVwZWF0XCIpO1xuXHQgICAgICBjb25zdCBkb21NYXRyaXggPSBuZXcgRE9NTWF0cml4KGludmVyc2UpO1xuXHQgICAgICBwYXR0ZXJuLnNldFRyYW5zZm9ybShkb21NYXRyaXgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgYXBwbHlCb3VuZGluZ0JveChjdHgsIHRoaXMuX2Jib3gpO1xuXHQgICAgICBwYXR0ZXJuID0gdGhpcy5fY3JlYXRlR3JhZGllbnQoY3R4KTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBwYXR0ZXJuO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcDEsIHAyLCBwMywgYzEsIGMyLCBjMykge1xuXHQgIGNvbnN0IGNvb3JkcyA9IGNvbnRleHQuY29vcmRzLFxuXHQgICAgY29sb3JzID0gY29udGV4dC5jb2xvcnM7XG5cdCAgY29uc3QgYnl0ZXMgPSBkYXRhLmRhdGEsXG5cdCAgICByb3dTaXplID0gZGF0YS53aWR0aCAqIDQ7XG5cdCAgbGV0IHRtcDtcblx0ICBpZiAoY29vcmRzW3AxICsgMV0gPiBjb29yZHNbcDIgKyAxXSkge1xuXHQgICAgdG1wID0gcDE7XG5cdCAgICBwMSA9IHAyO1xuXHQgICAgcDIgPSB0bXA7XG5cdCAgICB0bXAgPSBjMTtcblx0ICAgIGMxID0gYzI7XG5cdCAgICBjMiA9IHRtcDtcblx0ICB9XG5cdCAgaWYgKGNvb3Jkc1twMiArIDFdID4gY29vcmRzW3AzICsgMV0pIHtcblx0ICAgIHRtcCA9IHAyO1xuXHQgICAgcDIgPSBwMztcblx0ICAgIHAzID0gdG1wO1xuXHQgICAgdG1wID0gYzI7XG5cdCAgICBjMiA9IGMzO1xuXHQgICAgYzMgPSB0bXA7XG5cdCAgfVxuXHQgIGlmIChjb29yZHNbcDEgKyAxXSA+IGNvb3Jkc1twMiArIDFdKSB7XG5cdCAgICB0bXAgPSBwMTtcblx0ICAgIHAxID0gcDI7XG5cdCAgICBwMiA9IHRtcDtcblx0ICAgIHRtcCA9IGMxO1xuXHQgICAgYzEgPSBjMjtcblx0ICAgIGMyID0gdG1wO1xuXHQgIH1cblx0ICBjb25zdCB4MSA9IChjb29yZHNbcDFdICsgY29udGV4dC5vZmZzZXRYKSAqIGNvbnRleHQuc2NhbGVYO1xuXHQgIGNvbnN0IHkxID0gKGNvb3Jkc1twMSArIDFdICsgY29udGV4dC5vZmZzZXRZKSAqIGNvbnRleHQuc2NhbGVZO1xuXHQgIGNvbnN0IHgyID0gKGNvb3Jkc1twMl0gKyBjb250ZXh0Lm9mZnNldFgpICogY29udGV4dC5zY2FsZVg7XG5cdCAgY29uc3QgeTIgPSAoY29vcmRzW3AyICsgMV0gKyBjb250ZXh0Lm9mZnNldFkpICogY29udGV4dC5zY2FsZVk7XG5cdCAgY29uc3QgeDMgPSAoY29vcmRzW3AzXSArIGNvbnRleHQub2Zmc2V0WCkgKiBjb250ZXh0LnNjYWxlWDtcblx0ICBjb25zdCB5MyA9IChjb29yZHNbcDMgKyAxXSArIGNvbnRleHQub2Zmc2V0WSkgKiBjb250ZXh0LnNjYWxlWTtcblx0ICBpZiAoeTEgPj0geTMpIHtcblx0ICAgIHJldHVybjtcblx0ICB9XG5cdCAgY29uc3QgYzFyID0gY29sb3JzW2MxXSxcblx0ICAgIGMxZyA9IGNvbG9yc1tjMSArIDFdLFxuXHQgICAgYzFiID0gY29sb3JzW2MxICsgMl07XG5cdCAgY29uc3QgYzJyID0gY29sb3JzW2MyXSxcblx0ICAgIGMyZyA9IGNvbG9yc1tjMiArIDFdLFxuXHQgICAgYzJiID0gY29sb3JzW2MyICsgMl07XG5cdCAgY29uc3QgYzNyID0gY29sb3JzW2MzXSxcblx0ICAgIGMzZyA9IGNvbG9yc1tjMyArIDFdLFxuXHQgICAgYzNiID0gY29sb3JzW2MzICsgMl07XG5cdCAgY29uc3QgbWluWSA9IE1hdGgucm91bmQoeTEpLFxuXHQgICAgbWF4WSA9IE1hdGgucm91bmQoeTMpO1xuXHQgIGxldCB4YSwgY2FyLCBjYWcsIGNhYjtcblx0ICBsZXQgeGIsIGNiciwgY2JnLCBjYmI7XG5cdCAgZm9yIChsZXQgeSA9IG1pblk7IHkgPD0gbWF4WTsgeSsrKSB7XG5cdCAgICBpZiAoeSA8IHkyKSB7XG5cdCAgICAgIGxldCBrO1xuXHQgICAgICBpZiAoeSA8IHkxKSB7XG5cdCAgICAgICAgayA9IDA7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgayA9ICh5MSAtIHkpIC8gKHkxIC0geTIpO1xuXHQgICAgICB9XG5cdCAgICAgIHhhID0geDEgLSAoeDEgLSB4MikgKiBrO1xuXHQgICAgICBjYXIgPSBjMXIgLSAoYzFyIC0gYzJyKSAqIGs7XG5cdCAgICAgIGNhZyA9IGMxZyAtIChjMWcgLSBjMmcpICogaztcblx0ICAgICAgY2FiID0gYzFiIC0gKGMxYiAtIGMyYikgKiBrO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgbGV0IGs7XG5cdCAgICAgIGlmICh5ID4geTMpIHtcblx0ICAgICAgICBrID0gMTtcblx0ICAgICAgfSBlbHNlIGlmICh5MiA9PT0geTMpIHtcblx0ICAgICAgICBrID0gMDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBrID0gKHkyIC0geSkgLyAoeTIgLSB5Myk7XG5cdCAgICAgIH1cblx0ICAgICAgeGEgPSB4MiAtICh4MiAtIHgzKSAqIGs7XG5cdCAgICAgIGNhciA9IGMyciAtIChjMnIgLSBjM3IpICogaztcblx0ICAgICAgY2FnID0gYzJnIC0gKGMyZyAtIGMzZykgKiBrO1xuXHQgICAgICBjYWIgPSBjMmIgLSAoYzJiIC0gYzNiKSAqIGs7XG5cdCAgICB9XG5cdCAgICBsZXQgaztcblx0ICAgIGlmICh5IDwgeTEpIHtcblx0ICAgICAgayA9IDA7XG5cdCAgICB9IGVsc2UgaWYgKHkgPiB5Mykge1xuXHQgICAgICBrID0gMTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGsgPSAoeTEgLSB5KSAvICh5MSAtIHkzKTtcblx0ICAgIH1cblx0ICAgIHhiID0geDEgLSAoeDEgLSB4MykgKiBrO1xuXHQgICAgY2JyID0gYzFyIC0gKGMxciAtIGMzcikgKiBrO1xuXHQgICAgY2JnID0gYzFnIC0gKGMxZyAtIGMzZykgKiBrO1xuXHQgICAgY2JiID0gYzFiIC0gKGMxYiAtIGMzYikgKiBrO1xuXHQgICAgY29uc3QgeDFfID0gTWF0aC5yb3VuZChNYXRoLm1pbih4YSwgeGIpKTtcblx0ICAgIGNvbnN0IHgyXyA9IE1hdGgucm91bmQoTWF0aC5tYXgoeGEsIHhiKSk7XG5cdCAgICBsZXQgaiA9IHJvd1NpemUgKiB5ICsgeDFfICogNDtcblx0ICAgIGZvciAobGV0IHggPSB4MV87IHggPD0geDJfOyB4KyspIHtcblx0ICAgICAgayA9ICh4YSAtIHgpIC8gKHhhIC0geGIpO1xuXHQgICAgICBpZiAoayA8IDApIHtcblx0ICAgICAgICBrID0gMDtcblx0ICAgICAgfSBlbHNlIGlmIChrID4gMSkge1xuXHQgICAgICAgIGsgPSAxO1xuXHQgICAgICB9XG5cdCAgICAgIGJ5dGVzW2orK10gPSBjYXIgLSAoY2FyIC0gY2JyKSAqIGsgfCAwO1xuXHQgICAgICBieXRlc1tqKytdID0gY2FnIC0gKGNhZyAtIGNiZykgKiBrIHwgMDtcblx0ICAgICAgYnl0ZXNbaisrXSA9IGNhYiAtIChjYWIgLSBjYmIpICogayB8IDA7XG5cdCAgICAgIGJ5dGVzW2orK10gPSAyNTU7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGRyYXdGaWd1cmUoZGF0YSwgZmlndXJlLCBjb250ZXh0KSB7XG5cdCAgY29uc3QgcHMgPSBmaWd1cmUuY29vcmRzO1xuXHQgIGNvbnN0IGNzID0gZmlndXJlLmNvbG9ycztcblx0ICBsZXQgaSwgaWk7XG5cdCAgc3dpdGNoIChmaWd1cmUudHlwZSkge1xuXHQgICAgY2FzZSBcImxhdHRpY2VcIjpcblx0ICAgICAgY29uc3QgdmVydGljZXNQZXJSb3cgPSBmaWd1cmUudmVydGljZXNQZXJSb3c7XG5cdCAgICAgIGNvbnN0IHJvd3MgPSBNYXRoLmZsb29yKHBzLmxlbmd0aCAvIHZlcnRpY2VzUGVyUm93KSAtIDE7XG5cdCAgICAgIGNvbnN0IGNvbHMgPSB2ZXJ0aWNlc1BlclJvdyAtIDE7XG5cdCAgICAgIGZvciAoaSA9IDA7IGkgPCByb3dzOyBpKyspIHtcblx0ICAgICAgICBsZXQgcSA9IGkgKiB2ZXJ0aWNlc1BlclJvdztcblx0ICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKywgcSsrKSB7XG5cdCAgICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbcV0sIHBzW3EgKyAxXSwgcHNbcSArIHZlcnRpY2VzUGVyUm93XSwgY3NbcV0sIGNzW3EgKyAxXSwgY3NbcSArIHZlcnRpY2VzUGVyUm93XSk7XG5cdCAgICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbcSArIHZlcnRpY2VzUGVyUm93ICsgMV0sIHBzW3EgKyAxXSwgcHNbcSArIHZlcnRpY2VzUGVyUm93XSwgY3NbcSArIHZlcnRpY2VzUGVyUm93ICsgMV0sIGNzW3EgKyAxXSwgY3NbcSArIHZlcnRpY2VzUGVyUm93XSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIGJyZWFrO1xuXHQgICAgY2FzZSBcInRyaWFuZ2xlc1wiOlxuXHQgICAgICBmb3IgKGkgPSAwLCBpaSA9IHBzLmxlbmd0aDsgaSA8IGlpOyBpICs9IDMpIHtcblx0ICAgICAgICBkcmF3VHJpYW5nbGUoZGF0YSwgY29udGV4dCwgcHNbaV0sIHBzW2kgKyAxXSwgcHNbaSArIDJdLCBjc1tpXSwgY3NbaSArIDFdLCBjc1tpICsgMl0pO1xuXHQgICAgICB9XG5cdCAgICAgIGJyZWFrO1xuXHQgICAgZGVmYXVsdDpcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBmaWd1cmVcIik7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIE1lc2hTaGFkaW5nUGF0dGVybiBleHRlbmRzIEJhc2VTaGFkaW5nUGF0dGVybiB7XG5cdCAgY29uc3RydWN0b3IoSVIpIHtcblx0ICAgIHN1cGVyKCk7XG5cdCAgICB0aGlzLl9jb29yZHMgPSBJUlsyXTtcblx0ICAgIHRoaXMuX2NvbG9ycyA9IElSWzNdO1xuXHQgICAgdGhpcy5fZmlndXJlcyA9IElSWzRdO1xuXHQgICAgdGhpcy5fYm91bmRzID0gSVJbNV07XG5cdCAgICB0aGlzLl9iYm94ID0gSVJbN107XG5cdCAgICB0aGlzLl9iYWNrZ3JvdW5kID0gSVJbOF07XG5cdCAgICB0aGlzLm1hdHJpeCA9IG51bGw7XG5cdCAgfVxuXHQgIF9jcmVhdGVNZXNoQ2FudmFzKGNvbWJpbmVkU2NhbGUsIGJhY2tncm91bmRDb2xvciwgY2FjaGVkQ2FudmFzZXMpIHtcblx0ICAgIGNvbnN0IEVYUEVDVEVEX1NDQUxFID0gMS4xO1xuXHQgICAgY29uc3QgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7XG5cdCAgICBjb25zdCBCT1JERVJfU0laRSA9IDI7XG5cdCAgICBjb25zdCBvZmZzZXRYID0gTWF0aC5mbG9vcih0aGlzLl9ib3VuZHNbMF0pO1xuXHQgICAgY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IodGhpcy5fYm91bmRzWzFdKTtcblx0ICAgIGNvbnN0IGJvdW5kc1dpZHRoID0gTWF0aC5jZWlsKHRoaXMuX2JvdW5kc1syXSkgLSBvZmZzZXRYO1xuXHQgICAgY29uc3QgYm91bmRzSGVpZ2h0ID0gTWF0aC5jZWlsKHRoaXMuX2JvdW5kc1szXSkgLSBvZmZzZXRZO1xuXHQgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzV2lkdGggKiBjb21iaW5lZFNjYWxlWzBdICogRVhQRUNURURfU0NBTEUpKSwgTUFYX1BBVFRFUk5fU0laRSk7XG5cdCAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihNYXRoLmNlaWwoTWF0aC5hYnMoYm91bmRzSGVpZ2h0ICogY29tYmluZWRTY2FsZVsxXSAqIEVYUEVDVEVEX1NDQUxFKSksIE1BWF9QQVRURVJOX1NJWkUpO1xuXHQgICAgY29uc3Qgc2NhbGVYID0gYm91bmRzV2lkdGggLyB3aWR0aDtcblx0ICAgIGNvbnN0IHNjYWxlWSA9IGJvdW5kc0hlaWdodCAvIGhlaWdodDtcblx0ICAgIGNvbnN0IGNvbnRleHQgPSB7XG5cdCAgICAgIGNvb3JkczogdGhpcy5fY29vcmRzLFxuXHQgICAgICBjb2xvcnM6IHRoaXMuX2NvbG9ycyxcblx0ICAgICAgb2Zmc2V0WDogLW9mZnNldFgsXG5cdCAgICAgIG9mZnNldFk6IC1vZmZzZXRZLFxuXHQgICAgICBzY2FsZVg6IDEgLyBzY2FsZVgsXG5cdCAgICAgIHNjYWxlWTogMSAvIHNjYWxlWVxuXHQgICAgfTtcblx0ICAgIGNvbnN0IHBhZGRlZFdpZHRoID0gd2lkdGggKyBCT1JERVJfU0laRSAqIDI7XG5cdCAgICBjb25zdCBwYWRkZWRIZWlnaHQgPSBoZWlnaHQgKyBCT1JERVJfU0laRSAqIDI7XG5cdCAgICBjb25zdCB0bXBDYW52YXMgPSBjYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJtZXNoXCIsIHBhZGRlZFdpZHRoLCBwYWRkZWRIZWlnaHQsIGZhbHNlKTtcblx0ICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuXHQgICAgY29uc3QgZGF0YSA9IHRtcEN0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG5cdCAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG5cdCAgICAgIGNvbnN0IGJ5dGVzID0gZGF0YS5kYXRhO1xuXHQgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBieXRlcy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7XG5cdCAgICAgICAgYnl0ZXNbaV0gPSBiYWNrZ3JvdW5kQ29sb3JbMF07XG5cdCAgICAgICAgYnl0ZXNbaSArIDFdID0gYmFja2dyb3VuZENvbG9yWzFdO1xuXHQgICAgICAgIGJ5dGVzW2kgKyAyXSA9IGJhY2tncm91bmRDb2xvclsyXTtcblx0ICAgICAgICBieXRlc1tpICsgM10gPSAyNTU7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgZmlndXJlIG9mIHRoaXMuX2ZpZ3VyZXMpIHtcblx0ICAgICAgZHJhd0ZpZ3VyZShkYXRhLCBmaWd1cmUsIGNvbnRleHQpO1xuXHQgICAgfVxuXHQgICAgdG1wQ3R4LnB1dEltYWdlRGF0YShkYXRhLCBCT1JERVJfU0laRSwgQk9SREVSX1NJWkUpO1xuXHQgICAgY29uc3QgY2FudmFzID0gdG1wQ2FudmFzLmNhbnZhcztcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNhbnZhcyxcblx0ICAgICAgb2Zmc2V0WDogb2Zmc2V0WCAtIEJPUkRFUl9TSVpFICogc2NhbGVYLFxuXHQgICAgICBvZmZzZXRZOiBvZmZzZXRZIC0gQk9SREVSX1NJWkUgKiBzY2FsZVksXG5cdCAgICAgIHNjYWxlWCxcblx0ICAgICAgc2NhbGVZXG5cdCAgICB9O1xuXHQgIH1cblx0ICBnZXRQYXR0ZXJuKGN0eCwgb3duZXIsIGludmVyc2UsIHBhdGhUeXBlKSB7XG5cdCAgICBhcHBseUJvdW5kaW5nQm94KGN0eCwgdGhpcy5fYmJveCk7XG5cdCAgICBsZXQgc2NhbGU7XG5cdCAgICBpZiAocGF0aFR5cGUgPT09IFBhdGhUeXBlLlNIQURJTkcpIHtcblx0ICAgICAgc2NhbGUgPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKCgwLCBfZGlzcGxheV91dGlscy5nZXRDdXJyZW50VHJhbnNmb3JtKShjdHgpKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShvd25lci5iYXNlVHJhbnNmb3JtKTtcblx0ICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG5cdCAgICAgICAgY29uc3QgbWF0cml4U2NhbGUgPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMubWF0cml4KTtcblx0ICAgICAgICBzY2FsZSA9IFtzY2FsZVswXSAqIG1hdHJpeFNjYWxlWzBdLCBzY2FsZVsxXSAqIG1hdHJpeFNjYWxlWzFdXTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgY29uc3QgdGVtcG9yYXJ5UGF0dGVybkNhbnZhcyA9IHRoaXMuX2NyZWF0ZU1lc2hDYW52YXMoc2NhbGUsIHBhdGhUeXBlID09PSBQYXRoVHlwZS5TSEFESU5HID8gbnVsbCA6IHRoaXMuX2JhY2tncm91bmQsIG93bmVyLmNhY2hlZENhbnZhc2VzKTtcblx0ICAgIGlmIChwYXRoVHlwZSAhPT0gUGF0aFR5cGUuU0hBRElORykge1xuXHQgICAgICBjdHguc2V0VHJhbnNmb3JtKC4uLm93bmVyLmJhc2VUcmFuc2Zvcm0pO1xuXHQgICAgICBpZiAodGhpcy5tYXRyaXgpIHtcblx0ICAgICAgICBjdHgudHJhbnNmb3JtKC4uLnRoaXMubWF0cml4KTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgY3R4LnRyYW5zbGF0ZSh0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFgsIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMub2Zmc2V0WSk7XG5cdCAgICBjdHguc2NhbGUodGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5zY2FsZVgsIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVZKTtcblx0ICAgIHJldHVybiBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgXCJuby1yZXBlYXRcIik7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIER1bW15U2hhZGluZ1BhdHRlcm4gZXh0ZW5kcyBCYXNlU2hhZGluZ1BhdHRlcm4ge1xuXHQgIGdldFBhdHRlcm4oKSB7XG5cdCAgICByZXR1cm4gXCJob3RwaW5rXCI7XG5cdCAgfVxuXHR9XG5cdGZ1bmN0aW9uIGdldFNoYWRpbmdQYXR0ZXJuKElSKSB7XG5cdCAgc3dpdGNoIChJUlswXSkge1xuXHQgICAgY2FzZSBcIlJhZGlhbEF4aWFsXCI6XG5cdCAgICAgIHJldHVybiBuZXcgUmFkaWFsQXhpYWxTaGFkaW5nUGF0dGVybihJUik7XG5cdCAgICBjYXNlIFwiTWVzaFwiOlxuXHQgICAgICByZXR1cm4gbmV3IE1lc2hTaGFkaW5nUGF0dGVybihJUik7XG5cdCAgICBjYXNlIFwiRHVtbXlcIjpcblx0ICAgICAgcmV0dXJuIG5ldyBEdW1teVNoYWRpbmdQYXR0ZXJuKCk7XG5cdCAgfVxuXHQgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBJUiB0eXBlOiAke0lSWzBdfWApO1xuXHR9XG5cdGNvbnN0IFBhaW50VHlwZSA9IHtcblx0ICBDT0xPUkVEOiAxLFxuXHQgIFVOQ09MT1JFRDogMlxuXHR9O1xuXHRjbGFzcyBUaWxpbmdQYXR0ZXJuIHtcblx0ICBzdGF0aWMgTUFYX1BBVFRFUk5fU0laRSA9IDMwMDA7XG5cdCAgY29uc3RydWN0b3IoSVIsIGNvbG9yLCBjdHgsIGNhbnZhc0dyYXBoaWNzRmFjdG9yeSwgYmFzZVRyYW5zZm9ybSkge1xuXHQgICAgdGhpcy5vcGVyYXRvckxpc3QgPSBJUlsyXTtcblx0ICAgIHRoaXMubWF0cml4ID0gSVJbM10gfHwgWzEsIDAsIDAsIDEsIDAsIDBdO1xuXHQgICAgdGhpcy5iYm94ID0gSVJbNF07XG5cdCAgICB0aGlzLnhzdGVwID0gSVJbNV07XG5cdCAgICB0aGlzLnlzdGVwID0gSVJbNl07XG5cdCAgICB0aGlzLnBhaW50VHlwZSA9IElSWzddO1xuXHQgICAgdGhpcy50aWxpbmdUeXBlID0gSVJbOF07XG5cdCAgICB0aGlzLmNvbG9yID0gY29sb3I7XG5cdCAgICB0aGlzLmN0eCA9IGN0eDtcblx0ICAgIHRoaXMuY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0gY2FudmFzR3JhcGhpY3NGYWN0b3J5O1xuXHQgICAgdGhpcy5iYXNlVHJhbnNmb3JtID0gYmFzZVRyYW5zZm9ybTtcblx0ICB9XG5cdCAgY3JlYXRlUGF0dGVybkNhbnZhcyhvd25lcikge1xuXHQgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gdGhpcy5vcGVyYXRvckxpc3Q7XG5cdCAgICBjb25zdCBiYm94ID0gdGhpcy5iYm94O1xuXHQgICAgY29uc3QgeHN0ZXAgPSB0aGlzLnhzdGVwO1xuXHQgICAgY29uc3QgeXN0ZXAgPSB0aGlzLnlzdGVwO1xuXHQgICAgY29uc3QgcGFpbnRUeXBlID0gdGhpcy5wYWludFR5cGU7XG5cdCAgICBjb25zdCB0aWxpbmdUeXBlID0gdGhpcy50aWxpbmdUeXBlO1xuXHQgICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yO1xuXHQgICAgY29uc3QgY2FudmFzR3JhcGhpY3NGYWN0b3J5ID0gdGhpcy5jYW52YXNHcmFwaGljc0ZhY3Rvcnk7XG5cdCAgICAoMCwgX3V0aWwuaW5mbykoXCJUaWxpbmdUeXBlOiBcIiArIHRpbGluZ1R5cGUpO1xuXHQgICAgY29uc3QgeDAgPSBiYm94WzBdLFxuXHQgICAgICB5MCA9IGJib3hbMV0sXG5cdCAgICAgIHgxID0gYmJveFsyXSxcblx0ICAgICAgeTEgPSBiYm94WzNdO1xuXHQgICAgY29uc3QgbWF0cml4U2NhbGUgPSBfdXRpbC5VdGlsLnNpbmd1bGFyVmFsdWVEZWNvbXBvc2UyZFNjYWxlKHRoaXMubWF0cml4KTtcblx0ICAgIGNvbnN0IGN1ck1hdHJpeFNjYWxlID0gX3V0aWwuVXRpbC5zaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZSh0aGlzLmJhc2VUcmFuc2Zvcm0pO1xuXHQgICAgY29uc3QgY29tYmluZWRTY2FsZSA9IFttYXRyaXhTY2FsZVswXSAqIGN1ck1hdHJpeFNjYWxlWzBdLCBtYXRyaXhTY2FsZVsxXSAqIGN1ck1hdHJpeFNjYWxlWzFdXTtcblx0ICAgIGNvbnN0IGRpbXggPSB0aGlzLmdldFNpemVBbmRTY2FsZSh4c3RlcCwgdGhpcy5jdHguY2FudmFzLndpZHRoLCBjb21iaW5lZFNjYWxlWzBdKTtcblx0ICAgIGNvbnN0IGRpbXkgPSB0aGlzLmdldFNpemVBbmRTY2FsZSh5c3RlcCwgdGhpcy5jdHguY2FudmFzLmhlaWdodCwgY29tYmluZWRTY2FsZVsxXSk7XG5cdCAgICBjb25zdCB0bXBDYW52YXMgPSBvd25lci5jYWNoZWRDYW52YXNlcy5nZXRDYW52YXMoXCJwYXR0ZXJuXCIsIGRpbXguc2l6ZSwgZGlteS5zaXplLCB0cnVlKTtcblx0ICAgIGNvbnN0IHRtcEN0eCA9IHRtcENhbnZhcy5jb250ZXh0O1xuXHQgICAgY29uc3QgZ3JhcGhpY3MgPSBjYW52YXNHcmFwaGljc0ZhY3RvcnkuY3JlYXRlQ2FudmFzR3JhcGhpY3ModG1wQ3R4KTtcblx0ICAgIGdyYXBoaWNzLmdyb3VwTGV2ZWwgPSBvd25lci5ncm91cExldmVsO1xuXHQgICAgdGhpcy5zZXRGaWxsQW5kU3Ryb2tlU3R5bGVUb0NvbnRleHQoZ3JhcGhpY3MsIHBhaW50VHlwZSwgY29sb3IpO1xuXHQgICAgbGV0IGFkanVzdGVkWDAgPSB4MDtcblx0ICAgIGxldCBhZGp1c3RlZFkwID0geTA7XG5cdCAgICBsZXQgYWRqdXN0ZWRYMSA9IHgxO1xuXHQgICAgbGV0IGFkanVzdGVkWTEgPSB5MTtcblx0ICAgIGlmICh4MCA8IDApIHtcblx0ICAgICAgYWRqdXN0ZWRYMCA9IDA7XG5cdCAgICAgIGFkanVzdGVkWDEgKz0gTWF0aC5hYnMoeDApO1xuXHQgICAgfVxuXHQgICAgaWYgKHkwIDwgMCkge1xuXHQgICAgICBhZGp1c3RlZFkwID0gMDtcblx0ICAgICAgYWRqdXN0ZWRZMSArPSBNYXRoLmFicyh5MCk7XG5cdCAgICB9XG5cdCAgICB0bXBDdHgudHJhbnNsYXRlKC0oZGlteC5zY2FsZSAqIGFkanVzdGVkWDApLCAtKGRpbXkuc2NhbGUgKiBhZGp1c3RlZFkwKSk7XG5cdCAgICBncmFwaGljcy50cmFuc2Zvcm0oZGlteC5zY2FsZSwgMCwgMCwgZGlteS5zY2FsZSwgMCwgMCk7XG5cdCAgICB0bXBDdHguc2F2ZSgpO1xuXHQgICAgdGhpcy5jbGlwQmJveChncmFwaGljcywgYWRqdXN0ZWRYMCwgYWRqdXN0ZWRZMCwgYWRqdXN0ZWRYMSwgYWRqdXN0ZWRZMSk7XG5cdCAgICBncmFwaGljcy5iYXNlVHJhbnNmb3JtID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGdyYXBoaWNzLmN0eCk7XG5cdCAgICBncmFwaGljcy5leGVjdXRlT3BlcmF0b3JMaXN0KG9wZXJhdG9yTGlzdCk7XG5cdCAgICBncmFwaGljcy5lbmREcmF3aW5nKCk7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjYW52YXM6IHRtcENhbnZhcy5jYW52YXMsXG5cdCAgICAgIHNjYWxlWDogZGlteC5zY2FsZSxcblx0ICAgICAgc2NhbGVZOiBkaW15LnNjYWxlLFxuXHQgICAgICBvZmZzZXRYOiBhZGp1c3RlZFgwLFxuXHQgICAgICBvZmZzZXRZOiBhZGp1c3RlZFkwXG5cdCAgICB9O1xuXHQgIH1cblx0ICBnZXRTaXplQW5kU2NhbGUoc3RlcCwgcmVhbE91dHB1dFNpemUsIHNjYWxlKSB7XG5cdCAgICBzdGVwID0gTWF0aC5hYnMoc3RlcCk7XG5cdCAgICBjb25zdCBtYXhTaXplID0gTWF0aC5tYXgoVGlsaW5nUGF0dGVybi5NQVhfUEFUVEVSTl9TSVpFLCByZWFsT3V0cHV0U2l6ZSk7XG5cdCAgICBsZXQgc2l6ZSA9IE1hdGguY2VpbChzdGVwICogc2NhbGUpO1xuXHQgICAgaWYgKHNpemUgPj0gbWF4U2l6ZSkge1xuXHQgICAgICBzaXplID0gbWF4U2l6ZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHNjYWxlID0gc2l6ZSAvIHN0ZXA7XG5cdCAgICB9XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBzY2FsZSxcblx0ICAgICAgc2l6ZVxuXHQgICAgfTtcblx0ICB9XG5cdCAgY2xpcEJib3goZ3JhcGhpY3MsIHgwLCB5MCwgeDEsIHkxKSB7XG5cdCAgICBjb25zdCBiYm94V2lkdGggPSB4MSAtIHgwO1xuXHQgICAgY29uc3QgYmJveEhlaWdodCA9IHkxIC0geTA7XG5cdCAgICBncmFwaGljcy5jdHgucmVjdCh4MCwgeTAsIGJib3hXaWR0aCwgYmJveEhlaWdodCk7XG5cdCAgICBncmFwaGljcy5jdXJyZW50LnVwZGF0ZVJlY3RNaW5NYXgoKDAsIF9kaXNwbGF5X3V0aWxzLmdldEN1cnJlbnRUcmFuc2Zvcm0pKGdyYXBoaWNzLmN0eCksIFt4MCwgeTAsIHgxLCB5MV0pO1xuXHQgICAgZ3JhcGhpY3MuY2xpcCgpO1xuXHQgICAgZ3JhcGhpY3MuZW5kUGF0aCgpO1xuXHQgIH1cblx0ICBzZXRGaWxsQW5kU3Ryb2tlU3R5bGVUb0NvbnRleHQoZ3JhcGhpY3MsIHBhaW50VHlwZSwgY29sb3IpIHtcblx0ICAgIGNvbnN0IGNvbnRleHQgPSBncmFwaGljcy5jdHgsXG5cdCAgICAgIGN1cnJlbnQgPSBncmFwaGljcy5jdXJyZW50O1xuXHQgICAgc3dpdGNoIChwYWludFR5cGUpIHtcblx0ICAgICAgY2FzZSBQYWludFR5cGUuQ09MT1JFRDpcblx0ICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblx0ICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGN0eC5maWxsU3R5bGU7XG5cdCAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IGN0eC5zdHJva2VTdHlsZTtcblx0ICAgICAgICBjdXJyZW50LmZpbGxDb2xvciA9IGN0eC5maWxsU3R5bGU7XG5cdCAgICAgICAgY3VycmVudC5zdHJva2VDb2xvciA9IGN0eC5zdHJva2VTdHlsZTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBQYWludFR5cGUuVU5DT0xPUkVEOlxuXHQgICAgICAgIGNvbnN0IGNzc0NvbG9yID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IoY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSk7XG5cdCAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBjc3NDb2xvcjtcblx0ICAgICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gY3NzQ29sb3I7XG5cdCAgICAgICAgY3VycmVudC5maWxsQ29sb3IgPSBjc3NDb2xvcjtcblx0ICAgICAgICBjdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgdGhyb3cgbmV3IF91dGlsLkZvcm1hdEVycm9yKGBVbnN1cHBvcnRlZCBwYWludCB0eXBlOiAke3BhaW50VHlwZX1gKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZ2V0UGF0dGVybihjdHgsIG93bmVyLCBpbnZlcnNlLCBwYXRoVHlwZSkge1xuXHQgICAgbGV0IG1hdHJpeCA9IGludmVyc2U7XG5cdCAgICBpZiAocGF0aFR5cGUgIT09IFBhdGhUeXBlLlNIQURJTkcpIHtcblx0ICAgICAgbWF0cml4ID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0obWF0cml4LCBvd25lci5iYXNlVHJhbnNmb3JtKTtcblx0ICAgICAgaWYgKHRoaXMubWF0cml4KSB7XG5cdCAgICAgICAgbWF0cml4ID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0obWF0cml4LCB0aGlzLm1hdHJpeCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGNvbnN0IHRlbXBvcmFyeVBhdHRlcm5DYW52YXMgPSB0aGlzLmNyZWF0ZVBhdHRlcm5DYW52YXMob3duZXIpO1xuXHQgICAgbGV0IGRvbU1hdHJpeCA9IG5ldyBET01NYXRyaXgobWF0cml4KTtcblx0ICAgIGRvbU1hdHJpeCA9IGRvbU1hdHJpeC50cmFuc2xhdGUodGVtcG9yYXJ5UGF0dGVybkNhbnZhcy5vZmZzZXRYLCB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLm9mZnNldFkpO1xuXHQgICAgZG9tTWF0cml4ID0gZG9tTWF0cml4LnNjYWxlKDEgLyB0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLnNjYWxlWCwgMSAvIHRlbXBvcmFyeVBhdHRlcm5DYW52YXMuc2NhbGVZKTtcblx0ICAgIGNvbnN0IHBhdHRlcm4gPSBjdHguY3JlYXRlUGF0dGVybih0ZW1wb3JhcnlQYXR0ZXJuQ2FudmFzLmNhbnZhcywgXCJyZXBlYXRcIik7XG5cdCAgICBwYXR0ZXJuLnNldFRyYW5zZm9ybShkb21NYXRyaXgpO1xuXHQgICAgcmV0dXJuIHBhdHRlcm47XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuVGlsaW5nUGF0dGVybiA9IFRpbGluZ1BhdHRlcm47XG5cblx0LyoqKi8gfSksXG5cdC8qIDEzICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5jb252ZXJ0QmxhY2tBbmRXaGl0ZVRvUkdCQSA9IGNvbnZlcnRCbGFja0FuZFdoaXRlVG9SR0JBO1xuXHRleHBvcnRzLmNvbnZlcnRUb1JHQkEgPSBjb252ZXJ0VG9SR0JBO1xuXHRleHBvcnRzLmdyYXlUb1JHQkEgPSBncmF5VG9SR0JBO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHRmdW5jdGlvbiBjb252ZXJ0VG9SR0JBKHBhcmFtcykge1xuXHQgIHN3aXRjaCAocGFyYW1zLmtpbmQpIHtcblx0ICAgIGNhc2UgX3V0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOlxuXHQgICAgICByZXR1cm4gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEocGFyYW1zKTtcblx0ICAgIGNhc2UgX3V0aWwuSW1hZ2VLaW5kLlJHQl8yNEJQUDpcblx0ICAgICAgcmV0dXJuIGNvbnZlcnRSR0JUb1JHQkEocGFyYW1zKTtcblx0ICB9XG5cdCAgcmV0dXJuIG51bGw7XG5cdH1cblx0ZnVuY3Rpb24gY29udmVydEJsYWNrQW5kV2hpdGVUb1JHQkEoe1xuXHQgIHNyYyxcblx0ICBzcmNQb3MgPSAwLFxuXHQgIGRlc3QsXG5cdCAgd2lkdGgsXG5cdCAgaGVpZ2h0LFxuXHQgIG5vbkJsYWNrQ29sb3IgPSAweGZmZmZmZmZmLFxuXHQgIGludmVyc2VEZWNvZGUgPSBmYWxzZVxuXHR9KSB7XG5cdCAgY29uc3QgYmxhY2sgPSBfdXRpbC5GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbiA/IDB4ZmYwMDAwMDAgOiAweDAwMDAwMGZmO1xuXHQgIGNvbnN0IFt6ZXJvTWFwcGluZywgb25lTWFwcGluZ10gPSBpbnZlcnNlRGVjb2RlID8gW25vbkJsYWNrQ29sb3IsIGJsYWNrXSA6IFtibGFjaywgbm9uQmxhY2tDb2xvcl07XG5cdCAgY29uc3Qgd2lkdGhJblNvdXJjZSA9IHdpZHRoID4+IDM7XG5cdCAgY29uc3Qgd2lkdGhSZW1haW5kZXIgPSB3aWR0aCAmIDc7XG5cdCAgY29uc3Qgc3JjTGVuZ3RoID0gc3JjLmxlbmd0aDtcblx0ICBkZXN0ID0gbmV3IFVpbnQzMkFycmF5KGRlc3QuYnVmZmVyKTtcblx0ICBsZXQgZGVzdFBvcyA9IDA7XG5cdCAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1xuXHQgICAgZm9yIChjb25zdCBtYXggPSBzcmNQb3MgKyB3aWR0aEluU291cmNlOyBzcmNQb3MgPCBtYXg7IHNyY1BvcysrKSB7XG5cdCAgICAgIGNvbnN0IGVsZW0gPSBzcmNQb3MgPCBzcmNMZW5ndGggPyBzcmNbc3JjUG9zXSA6IDI1NTtcblx0ICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcblx0ICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMDAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEwMCA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcblx0ICAgICAgZGVzdFtkZXN0UG9zKytdID0gZWxlbSAmIDBiMTAgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IGVsZW0gJiAwYjEgPyBvbmVNYXBwaW5nIDogemVyb01hcHBpbmc7XG5cdCAgICB9XG5cdCAgICBpZiAod2lkdGhSZW1haW5kZXIgPT09IDApIHtcblx0ICAgICAgY29udGludWU7XG5cdCAgICB9XG5cdCAgICBjb25zdCBlbGVtID0gc3JjUG9zIDwgc3JjTGVuZ3RoID8gc3JjW3NyY1BvcysrXSA6IDI1NTtcblx0ICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2lkdGhSZW1haW5kZXI7IGorKykge1xuXHQgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBlbGVtICYgMSA8PCA3IC0gaiA/IG9uZU1hcHBpbmcgOiB6ZXJvTWFwcGluZztcblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIHtcblx0ICAgIHNyY1Bvcyxcblx0ICAgIGRlc3RQb3Ncblx0ICB9O1xuXHR9XG5cdGZ1bmN0aW9uIGNvbnZlcnRSR0JUb1JHQkEoe1xuXHQgIHNyYyxcblx0ICBzcmNQb3MgPSAwLFxuXHQgIGRlc3QsXG5cdCAgZGVzdFBvcyA9IDAsXG5cdCAgd2lkdGgsXG5cdCAgaGVpZ2h0XG5cdH0pIHtcblx0ICBsZXQgaSA9IDA7XG5cdCAgY29uc3QgbGVuMzIgPSBzcmMubGVuZ3RoID4+IDI7XG5cdCAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoc3JjLmJ1ZmZlciwgc3JjUG9zLCBsZW4zMik7XG5cdCAgaWYgKF91dGlsLkZlYXR1cmVUZXN0LmlzTGl0dGxlRW5kaWFuKSB7XG5cdCAgICBmb3IgKDsgaSA8IGxlbjMyIC0gMjsgaSArPSAzLCBkZXN0UG9zICs9IDQpIHtcblx0ICAgICAgY29uc3QgczEgPSBzcmMzMltpXTtcblx0ICAgICAgY29uc3QgczIgPSBzcmMzMltpICsgMV07XG5cdCAgICAgIGNvbnN0IHMzID0gc3JjMzJbaSArIDJdO1xuXHQgICAgICBkZXN0W2Rlc3RQb3NdID0gczEgfCAweGZmMDAwMDAwO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MgKyAxXSA9IHMxID4+PiAyNCB8IHMyIDw8IDggfCAweGZmMDAwMDAwO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MgKyAyXSA9IHMyID4+PiAxNiB8IHMzIDw8IDE2IHwgMHhmZjAwMDAwMDtcblx0ICAgICAgZGVzdFtkZXN0UG9zICsgM10gPSBzMyA+Pj4gOCB8IDB4ZmYwMDAwMDA7XG5cdCAgICB9XG5cdCAgICBmb3IgKGxldCBqID0gaSAqIDQsIGpqID0gc3JjLmxlbmd0aDsgaiA8IGpqOyBqICs9IDMpIHtcblx0ICAgICAgZGVzdFtkZXN0UG9zKytdID0gc3JjW2pdIHwgc3JjW2ogKyAxXSA8PCA4IHwgc3JjW2ogKyAyXSA8PCAxNiB8IDB4ZmYwMDAwMDA7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIGZvciAoOyBpIDwgbGVuMzIgLSAyOyBpICs9IDMsIGRlc3RQb3MgKz0gNCkge1xuXHQgICAgICBjb25zdCBzMSA9IHNyYzMyW2ldO1xuXHQgICAgICBjb25zdCBzMiA9IHNyYzMyW2kgKyAxXTtcblx0ICAgICAgY29uc3QgczMgPSBzcmMzMltpICsgMl07XG5cdCAgICAgIGRlc3RbZGVzdFBvc10gPSBzMSB8IDB4ZmY7XG5cdCAgICAgIGRlc3RbZGVzdFBvcyArIDFdID0gczEgPDwgMjQgfCBzMiA+Pj4gOCB8IDB4ZmY7XG5cdCAgICAgIGRlc3RbZGVzdFBvcyArIDJdID0gczIgPDwgMTYgfCBzMyA+Pj4gMTYgfCAweGZmO1xuXHQgICAgICBkZXN0W2Rlc3RQb3MgKyAzXSA9IHMzIDw8IDggfCAweGZmO1xuXHQgICAgfVxuXHQgICAgZm9yIChsZXQgaiA9IGkgKiA0LCBqaiA9IHNyYy5sZW5ndGg7IGogPCBqajsgaiArPSAzKSB7XG5cdCAgICAgIGRlc3RbZGVzdFBvcysrXSA9IHNyY1tqXSA8PCAyNCB8IHNyY1tqICsgMV0gPDwgMTYgfCBzcmNbaiArIDJdIDw8IDggfCAweGZmO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4ge1xuXHQgICAgc3JjUG9zLFxuXHQgICAgZGVzdFBvc1xuXHQgIH07XG5cdH1cblx0ZnVuY3Rpb24gZ3JheVRvUkdCQShzcmMsIGRlc3QpIHtcblx0ICBpZiAoX3V0aWwuRmVhdHVyZVRlc3QuaXNMaXR0bGVFbmRpYW4pIHtcblx0ICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHNyYy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdCAgICAgIGRlc3RbaV0gPSBzcmNbaV0gKiAweDEwMTAxIHwgMHhmZjAwMDAwMDtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc3JjLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0ICAgICAgZGVzdFtpXSA9IHNyY1tpXSAqIDB4MTAxMDEwMCB8IDB4MDAwMDAwZmY7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cblx0LyoqKi8gfSksXG5cdC8qIDE0ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5HbG9iYWxXb3JrZXJPcHRpb25zID0gdm9pZCAwO1xuXHRjb25zdCBHbG9iYWxXb3JrZXJPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ZXhwb3J0cy5HbG9iYWxXb3JrZXJPcHRpb25zID0gR2xvYmFsV29ya2VyT3B0aW9ucztcblx0R2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJQb3J0ID0gbnVsbDtcblx0R2xvYmFsV29ya2VyT3B0aW9ucy53b3JrZXJTcmMgPSBcIlwiO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAxNSAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuTWVzc2FnZUhhbmRsZXIgPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdGNvbnN0IENhbGxiYWNrS2luZCA9IHtcblx0ICBVTktOT1dOOiAwLFxuXHQgIERBVEE6IDEsXG5cdCAgRVJST1I6IDJcblx0fTtcblx0Y29uc3QgU3RyZWFtS2luZCA9IHtcblx0ICBVTktOT1dOOiAwLFxuXHQgIENBTkNFTDogMSxcblx0ICBDQU5DRUxfQ09NUExFVEU6IDIsXG5cdCAgQ0xPU0U6IDMsXG5cdCAgRU5RVUVVRTogNCxcblx0ICBFUlJPUjogNSxcblx0ICBQVUxMOiA2LFxuXHQgIFBVTExfQ09NUExFVEU6IDcsXG5cdCAgU1RBUlRfQ09NUExFVEU6IDhcblx0fTtcblx0ZnVuY3Rpb24gd3JhcFJlYXNvbihyZWFzb24pIHtcblx0ICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciB8fCB0eXBlb2YgcmVhc29uID09PSBcIm9iamVjdFwiICYmIHJlYXNvbiAhPT0gbnVsbCkpIHtcblx0ICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoJ3dyYXBSZWFzb246IEV4cGVjdGVkIFwicmVhc29uXCIgdG8gYmUgYSAocG9zc2libHkgY2xvbmVkKSBFcnJvci4nKTtcblx0ICB9XG5cdCAgc3dpdGNoIChyZWFzb24ubmFtZSkge1xuXHQgICAgY2FzZSBcIkFib3J0RXhjZXB0aW9uXCI6XG5cdCAgICAgIHJldHVybiBuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UpO1xuXHQgICAgY2FzZSBcIk1pc3NpbmdQREZFeGNlcHRpb25cIjpcblx0ICAgICAgcmV0dXJuIG5ldyBfdXRpbC5NaXNzaW5nUERGRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlKTtcblx0ICAgIGNhc2UgXCJQYXNzd29yZEV4Y2VwdGlvblwiOlxuXHQgICAgICByZXR1cm4gbmV3IF91dGlsLlBhc3N3b3JkRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uY29kZSk7XG5cdCAgICBjYXNlIFwiVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uXCI6XG5cdCAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24uc3RhdHVzKTtcblx0ICAgIGNhc2UgXCJVbmtub3duRXJyb3JFeGNlcHRpb25cIjpcblx0ICAgICAgcmV0dXJuIG5ldyBfdXRpbC5Vbmtub3duRXJyb3JFeGNlcHRpb24ocmVhc29uLm1lc3NhZ2UsIHJlYXNvbi5kZXRhaWxzKTtcblx0ICAgIGRlZmF1bHQ6XG5cdCAgICAgIHJldHVybiBuZXcgX3V0aWwuVW5rbm93bkVycm9yRXhjZXB0aW9uKHJlYXNvbi5tZXNzYWdlLCByZWFzb24udG9TdHJpbmcoKSk7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIE1lc3NhZ2VIYW5kbGVyIHtcblx0ICBjb25zdHJ1Y3Rvcihzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCBjb21PYmopIHtcblx0ICAgIHRoaXMuc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7XG5cdCAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lO1xuXHQgICAgdGhpcy5jb21PYmogPSBjb21PYmo7XG5cdCAgICB0aGlzLmNhbGxiYWNrSWQgPSAxO1xuXHQgICAgdGhpcy5zdHJlYW1JZCA9IDE7XG5cdCAgICB0aGlzLnN0cmVhbVNpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgICAgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgICAgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UgPSBldmVudCA9PiB7XG5cdCAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhO1xuXHQgICAgICBpZiAoZGF0YS50YXJnZXROYW1lICE9PSB0aGlzLnNvdXJjZU5hbWUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGRhdGEuc3RyZWFtKSB7XG5cdCAgICAgICAgdGhpcy4jcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSk7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChkYXRhLmNhbGxiYWNrKSB7XG5cdCAgICAgICAgY29uc3QgY2FsbGJhY2tJZCA9IGRhdGEuY2FsbGJhY2tJZDtcblx0ICAgICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTtcblx0ICAgICAgICBpZiAoIWNhcGFiaWxpdHkpIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc29sdmUgY2FsbGJhY2sgJHtjYWxsYmFja0lkfWApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja0NhcGFiaWxpdGllc1tjYWxsYmFja0lkXTtcblx0ICAgICAgICBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkRBVEEpIHtcblx0ICAgICAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZShkYXRhLmRhdGEpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jYWxsYmFjayA9PT0gQ2FsbGJhY2tLaW5kLkVSUk9SKSB7XG5cdCAgICAgICAgICBjYXBhYmlsaXR5LnJlamVjdCh3cmFwUmVhc29uKGRhdGEucmVhc29uKSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgY2FsbGJhY2sgY2FzZVwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuYWN0aW9uSGFuZGxlcltkYXRhLmFjdGlvbl07XG5cdCAgICAgIGlmICghYWN0aW9uKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFjdGlvbiBmcm9tIHdvcmtlcjogJHtkYXRhLmFjdGlvbn1gKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoZGF0YS5jYWxsYmFja0lkKSB7XG5cdCAgICAgICAgY29uc3QgY2JTb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lO1xuXHQgICAgICAgIGNvbnN0IGNiVGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZTtcblx0ICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHQgICAgICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhKSk7XG5cdCAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG5cdCAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICAgICAgICBzb3VyY2VOYW1lOiBjYlNvdXJjZU5hbWUsXG5cdCAgICAgICAgICAgIHRhcmdldE5hbWU6IGNiVGFyZ2V0TmFtZSxcblx0ICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrS2luZC5EQVRBLFxuXHQgICAgICAgICAgICBjYWxsYmFja0lkOiBkYXRhLmNhbGxiYWNrSWQsXG5cdCAgICAgICAgICAgIGRhdGE6IHJlc3VsdFxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuXHQgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgICAgICAgc291cmNlTmFtZTogY2JTb3VyY2VOYW1lLFxuXHQgICAgICAgICAgICB0YXJnZXROYW1lOiBjYlRhcmdldE5hbWUsXG5cdCAgICAgICAgICAgIGNhbGxiYWNrOiBDYWxsYmFja0tpbmQuRVJST1IsXG5cdCAgICAgICAgICAgIGNhbGxiYWNrSWQ6IGRhdGEuY2FsbGJhY2tJZCxcblx0ICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoZGF0YS5zdHJlYW1JZCkge1xuXHQgICAgICAgIHRoaXMuI2NyZWF0ZVN0cmVhbVNpbmsoZGF0YSk7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGFjdGlvbihkYXRhLmRhdGEpO1xuXHQgICAgfTtcblx0ICAgIGNvbU9iai5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLl9vbkNvbU9iak9uTWVzc2FnZSk7XG5cdCAgfVxuXHQgIG9uKGFjdGlvbk5hbWUsIGhhbmRsZXIpIHtcblx0ICAgIGNvbnN0IGFoID0gdGhpcy5hY3Rpb25IYW5kbGVyO1xuXHQgICAgaWYgKGFoW2FjdGlvbk5hbWVdKSB7XG5cdCAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgYWxyZWFkeSBhbiBhY3Rpb25OYW1lIGNhbGxlZCBcIiR7YWN0aW9uTmFtZX1cImApO1xuXHQgICAgfVxuXHQgICAgYWhbYWN0aW9uTmFtZV0gPSBoYW5kbGVyO1xuXHQgIH1cblx0ICBzZW5kKGFjdGlvbk5hbWUsIGRhdGEsIHRyYW5zZmVycykge1xuXHQgICAgdGhpcy5jb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG5cdCAgICAgIHRhcmdldE5hbWU6IHRoaXMudGFyZ2V0TmFtZSxcblx0ICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuXHQgICAgICBkYXRhXG5cdCAgICB9LCB0cmFuc2ZlcnMpO1xuXHQgIH1cblx0ICBzZW5kV2l0aFByb21pc2UoYWN0aW9uTmFtZSwgZGF0YSwgdHJhbnNmZXJzKSB7XG5cdCAgICBjb25zdCBjYWxsYmFja0lkID0gdGhpcy5jYWxsYmFja0lkKys7XG5cdCAgICBjb25zdCBjYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLmNhbGxiYWNrQ2FwYWJpbGl0aWVzW2NhbGxiYWNrSWRdID0gY2FwYWJpbGl0eTtcblx0ICAgIHRyeSB7XG5cdCAgICAgIHRoaXMuY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgICBzb3VyY2VOYW1lOiB0aGlzLnNvdXJjZU5hbWUsXG5cdCAgICAgICAgdGFyZ2V0TmFtZTogdGhpcy50YXJnZXROYW1lLFxuXHQgICAgICAgIGFjdGlvbjogYWN0aW9uTmFtZSxcblx0ICAgICAgICBjYWxsYmFja0lkLFxuXHQgICAgICAgIGRhdGFcblx0ICAgICAgfSwgdHJhbnNmZXJzKTtcblx0ICAgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICAgIGNhcGFiaWxpdHkucmVqZWN0KGV4KTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIHNlbmRXaXRoU3RyZWFtKGFjdGlvbk5hbWUsIGRhdGEsIHF1ZXVlaW5nU3RyYXRlZ3ksIHRyYW5zZmVycykge1xuXHQgICAgY29uc3Qgc3RyZWFtSWQgPSB0aGlzLnN0cmVhbUlkKyssXG5cdCAgICAgIHNvdXJjZU5hbWUgPSB0aGlzLnNvdXJjZU5hbWUsXG5cdCAgICAgIHRhcmdldE5hbWUgPSB0aGlzLnRhcmdldE5hbWUsXG5cdCAgICAgIGNvbU9iaiA9IHRoaXMuY29tT2JqO1xuXHQgICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG5cdCAgICAgIHN0YXJ0OiBjb250cm9sbGVyID0+IHtcblx0ICAgICAgICBjb25zdCBzdGFydENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSA9IHtcblx0ICAgICAgICAgIGNvbnRyb2xsZXIsXG5cdCAgICAgICAgICBzdGFydENhbGw6IHN0YXJ0Q2FwYWJpbGl0eSxcblx0ICAgICAgICAgIHB1bGxDYWxsOiBudWxsLFxuXHQgICAgICAgICAgY2FuY2VsQ2FsbDogbnVsbCxcblx0ICAgICAgICAgIGlzQ2xvc2VkOiBmYWxzZVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgICAgIHNvdXJjZU5hbWUsXG5cdCAgICAgICAgICB0YXJnZXROYW1lLFxuXHQgICAgICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLFxuXHQgICAgICAgICAgc3RyZWFtSWQsXG5cdCAgICAgICAgICBkYXRhLFxuXHQgICAgICAgICAgZGVzaXJlZFNpemU6IGNvbnRyb2xsZXIuZGVzaXJlZFNpemVcblx0ICAgICAgICB9LCB0cmFuc2ZlcnMpO1xuXHQgICAgICAgIHJldHVybiBzdGFydENhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgICAgfSxcblx0ICAgICAgcHVsbDogY29udHJvbGxlciA9PiB7XG5cdCAgICAgICAgY29uc3QgcHVsbENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXS5wdWxsQ2FsbCA9IHB1bGxDYXBhYmlsaXR5O1xuXHQgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMLFxuXHQgICAgICAgICAgc3RyZWFtSWQsXG5cdCAgICAgICAgICBkZXNpcmVkU2l6ZTogY29udHJvbGxlci5kZXNpcmVkU2l6ZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBwdWxsQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgICAgICB9LFxuXHQgICAgICBjYW5jZWw6IHJlYXNvbiA9PiB7XG5cdCAgICAgICAgKDAsIF91dGlsLmFzc2VydCkocmVhc29uIGluc3RhbmNlb2YgRXJyb3IsIFwiY2FuY2VsIG11c3QgaGF2ZSBhIHZhbGlkIHJlYXNvblwiKTtcblx0ICAgICAgICBjb25zdCBjYW5jZWxDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uY2FuY2VsQ2FsbCA9IGNhbmNlbENhcGFiaWxpdHk7XG5cdCAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyc1tzdHJlYW1JZF0uaXNDbG9zZWQgPSB0cnVlO1xuXHQgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUwsXG5cdCAgICAgICAgICBzdHJlYW1JZCxcblx0ICAgICAgICAgIHJlYXNvbjogd3JhcFJlYXNvbihyZWFzb24pXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIGNhbmNlbENhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgICAgfVxuXHQgICAgfSwgcXVldWVpbmdTdHJhdGVneSk7XG5cdCAgfVxuXHQgICNjcmVhdGVTdHJlYW1TaW5rKGRhdGEpIHtcblx0ICAgIGNvbnN0IHN0cmVhbUlkID0gZGF0YS5zdHJlYW1JZCxcblx0ICAgICAgc291cmNlTmFtZSA9IHRoaXMuc291cmNlTmFtZSxcblx0ICAgICAgdGFyZ2V0TmFtZSA9IGRhdGEuc291cmNlTmFtZSxcblx0ICAgICAgY29tT2JqID0gdGhpcy5jb21PYmo7XG5cdCAgICBjb25zdCBzZWxmID0gdGhpcyxcblx0ICAgICAgYWN0aW9uID0gdGhpcy5hY3Rpb25IYW5kbGVyW2RhdGEuYWN0aW9uXTtcblx0ICAgIGNvbnN0IHN0cmVhbVNpbmsgPSB7XG5cdCAgICAgIGVucXVldWUoY2h1bmssIHNpemUgPSAxLCB0cmFuc2ZlcnMpIHtcblx0ICAgICAgICBpZiAodGhpcy5pc0NhbmNlbGxlZCkge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBsYXN0RGVzaXJlZFNpemUgPSB0aGlzLmRlc2lyZWRTaXplO1xuXHQgICAgICAgIHRoaXMuZGVzaXJlZFNpemUgLT0gc2l6ZTtcblx0ICAgICAgICBpZiAobGFzdERlc2lyZWRTaXplID4gMCAmJiB0aGlzLmRlc2lyZWRTaXplIDw9IDApIHtcblx0ICAgICAgICAgIHRoaXMuc2lua0NhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgICAgICAgIHRoaXMucmVhZHkgPSB0aGlzLnNpbmtDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5FTlFVRVVFLFxuXHQgICAgICAgICAgc3RyZWFtSWQsXG5cdCAgICAgICAgICBjaHVua1xuXHQgICAgICAgIH0sIHRyYW5zZmVycyk7XG5cdCAgICAgIH0sXG5cdCAgICAgIGNsb3NlKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmlzQ2FuY2VsbGVkKSB7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuaXNDYW5jZWxsZWQgPSB0cnVlO1xuXHQgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DTE9TRSxcblx0ICAgICAgICAgIHN0cmVhbUlkXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgZGVsZXRlIHNlbGYuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuXHQgICAgICB9LFxuXHQgICAgICBlcnJvcihyZWFzb24pIHtcblx0ICAgICAgICAoMCwgX3V0aWwuYXNzZXJ0KShyZWFzb24gaW5zdGFuY2VvZiBFcnJvciwgXCJlcnJvciBtdXN0IGhhdmUgYSB2YWxpZCByZWFzb25cIik7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNDYW5jZWxsZWQpIHtcblx0ICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5pc0NhbmNlbGxlZCA9IHRydWU7XG5cdCAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgICAgIHNvdXJjZU5hbWUsXG5cdCAgICAgICAgICB0YXJnZXROYW1lLFxuXHQgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLkVSUk9SLFxuXHQgICAgICAgICAgc3RyZWFtSWQsXG5cdCAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9LFxuXHQgICAgICBzaW5rQ2FwYWJpbGl0eTogbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCksXG5cdCAgICAgIG9uUHVsbDogbnVsbCxcblx0ICAgICAgb25DYW5jZWw6IG51bGwsXG5cdCAgICAgIGlzQ2FuY2VsbGVkOiBmYWxzZSxcblx0ICAgICAgZGVzaXJlZFNpemU6IGRhdGEuZGVzaXJlZFNpemUsXG5cdCAgICAgIHJlYWR5OiBudWxsXG5cdCAgICB9O1xuXHQgICAgc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICBzdHJlYW1TaW5rLnJlYWR5ID0gc3RyZWFtU2luay5zaW5rQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgICAgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF0gPSBzdHJlYW1TaW5rO1xuXHQgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0ICAgICAgcmVzb2x2ZShhY3Rpb24oZGF0YS5kYXRhLCBzdHJlYW1TaW5rKSk7XG5cdCAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgIHRhcmdldE5hbWUsXG5cdCAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlNUQVJUX0NPTVBMRVRFLFxuXHQgICAgICAgIHN0cmVhbUlkLFxuXHQgICAgICAgIHN1Y2Nlc3M6IHRydWVcblx0ICAgICAgfSk7XG5cdCAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG5cdCAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgc291cmNlTmFtZSxcblx0ICAgICAgICB0YXJnZXROYW1lLFxuXHQgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5TVEFSVF9DT01QTEVURSxcblx0ICAgICAgICBzdHJlYW1JZCxcblx0ICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuXHQgICAgICB9KTtcblx0ICAgIH0pO1xuXHQgIH1cblx0ICAjcHJvY2Vzc1N0cmVhbU1lc3NhZ2UoZGF0YSkge1xuXHQgICAgY29uc3Qgc3RyZWFtSWQgPSBkYXRhLnN0cmVhbUlkLFxuXHQgICAgICBzb3VyY2VOYW1lID0gdGhpcy5zb3VyY2VOYW1lLFxuXHQgICAgICB0YXJnZXROYW1lID0gZGF0YS5zb3VyY2VOYW1lLFxuXHQgICAgICBjb21PYmogPSB0aGlzLmNvbU9iajtcblx0ICAgIGNvbnN0IHN0cmVhbUNvbnRyb2xsZXIgPSB0aGlzLnN0cmVhbUNvbnRyb2xsZXJzW3N0cmVhbUlkXSxcblx0ICAgICAgc3RyZWFtU2luayA9IHRoaXMuc3RyZWFtU2lua3Nbc3RyZWFtSWRdO1xuXHQgICAgc3dpdGNoIChkYXRhLnN0cmVhbSkge1xuXHQgICAgICBjYXNlIFN0cmVhbUtpbmQuU1RBUlRfQ09NUExFVEU6XG5cdCAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuXHQgICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGwucmVzb2x2ZSgpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBzdHJlYW1Db250cm9sbGVyLnN0YXJ0Q2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEU6XG5cdCAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuXHQgICAgICAgICAgc3RyZWFtQ29udHJvbGxlci5wdWxsQ2FsbC5yZXNvbHZlKCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGwucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgU3RyZWFtS2luZC5QVUxMOlxuXHQgICAgICAgIGlmICghc3RyZWFtU2luaykge1xuXHQgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgICAgICAgc291cmNlTmFtZSxcblx0ICAgICAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG5cdCAgICAgICAgICAgIHN0cmVhbUlkLFxuXHQgICAgICAgICAgICBzdWNjZXNzOiB0cnVlXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoc3RyZWFtU2luay5kZXNpcmVkU2l6ZSA8PSAwICYmIGRhdGEuZGVzaXJlZFNpemUgPiAwKSB7XG5cdCAgICAgICAgICBzdHJlYW1TaW5rLnNpbmtDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgc3RyZWFtU2luay5kZXNpcmVkU2l6ZSA9IGRhdGEuZGVzaXJlZFNpemU7XG5cdCAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblx0ICAgICAgICAgIHJlc29sdmUoc3RyZWFtU2luay5vblB1bGw/LigpKTtcblx0ICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICAgIHNvdXJjZU5hbWUsXG5cdCAgICAgICAgICAgIHRhcmdldE5hbWUsXG5cdCAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5QVUxMX0NPTVBMRVRFLFxuXHQgICAgICAgICAgICBzdHJlYW1JZCxcblx0ICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuXHQgICAgICAgICAgY29tT2JqLnBvc3RNZXNzYWdlKHtcblx0ICAgICAgICAgICAgc291cmNlTmFtZSxcblx0ICAgICAgICAgICAgdGFyZ2V0TmFtZSxcblx0ICAgICAgICAgICAgc3RyZWFtOiBTdHJlYW1LaW5kLlBVTExfQ09NUExFVEUsXG5cdCAgICAgICAgICAgIHN0cmVhbUlkLFxuXHQgICAgICAgICAgICByZWFzb246IHdyYXBSZWFzb24ocmVhc29uKVxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgU3RyZWFtS2luZC5FTlFVRVVFOlxuXHQgICAgICAgICgwLCBfdXRpbC5hc3NlcnQpKHN0cmVhbUNvbnRyb2xsZXIsIFwiZW5xdWV1ZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiKTtcblx0ICAgICAgICBpZiAoc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCkge1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5lbnF1ZXVlKGRhdGEuY2h1bmspO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0xPU0U6XG5cdCAgICAgICAgKDAsIF91dGlsLmFzc2VydCkoc3RyZWFtQ29udHJvbGxlciwgXCJjbG9zZSBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiKTtcblx0ICAgICAgICBpZiAoc3RyZWFtQ29udHJvbGxlci5pc0Nsb3NlZCkge1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuaXNDbG9zZWQgPSB0cnVlO1xuXHQgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY29udHJvbGxlci5jbG9zZSgpO1xuXHQgICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIFN0cmVhbUtpbmQuRVJST1I6XG5cdCAgICAgICAgKDAsIF91dGlsLmFzc2VydCkoc3RyZWFtQ29udHJvbGxlciwgXCJlcnJvciBzaG91bGQgaGF2ZSBzdHJlYW0gY29udHJvbGxlclwiKTtcblx0ICAgICAgICBzdHJlYW1Db250cm9sbGVyLmNvbnRyb2xsZXIuZXJyb3Iod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuXHQgICAgICAgIHRoaXMuI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFOlxuXHQgICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcblx0ICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZXNvbHZlKCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbC5yZWplY3Qod3JhcFJlYXNvbihkYXRhLnJlYXNvbikpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLiNkZWxldGVTdHJlYW1Db250cm9sbGVyKHN0cmVhbUNvbnRyb2xsZXIsIHN0cmVhbUlkKTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBTdHJlYW1LaW5kLkNBTkNFTDpcblx0ICAgICAgICBpZiAoIXN0cmVhbVNpbmspIHtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHQgICAgICAgICAgcmVzb2x2ZShzdHJlYW1TaW5rLm9uQ2FuY2VsPy4od3JhcFJlYXNvbihkYXRhLnJlYXNvbikpKTtcblx0ICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIGNvbU9iai5wb3N0TWVzc2FnZSh7XG5cdCAgICAgICAgICAgIHNvdXJjZU5hbWUsXG5cdCAgICAgICAgICAgIHRhcmdldE5hbWUsXG5cdCAgICAgICAgICAgIHN0cmVhbTogU3RyZWFtS2luZC5DQU5DRUxfQ09NUExFVEUsXG5cdCAgICAgICAgICAgIHN0cmVhbUlkLFxuXHQgICAgICAgICAgICBzdWNjZXNzOiB0cnVlXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG5cdCAgICAgICAgICBjb21PYmoucG9zdE1lc3NhZ2Uoe1xuXHQgICAgICAgICAgICBzb3VyY2VOYW1lLFxuXHQgICAgICAgICAgICB0YXJnZXROYW1lLFxuXHQgICAgICAgICAgICBzdHJlYW06IFN0cmVhbUtpbmQuQ0FOQ0VMX0NPTVBMRVRFLFxuXHQgICAgICAgICAgICBzdHJlYW1JZCxcblx0ICAgICAgICAgICAgcmVhc29uOiB3cmFwUmVhc29uKHJlYXNvbilcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHN0cmVhbVNpbmsuc2lua0NhcGFiaWxpdHkucmVqZWN0KHdyYXBSZWFzb24oZGF0YS5yZWFzb24pKTtcblx0ICAgICAgICBzdHJlYW1TaW5rLmlzQ2FuY2VsbGVkID0gdHJ1ZTtcblx0ICAgICAgICBkZWxldGUgdGhpcy5zdHJlYW1TaW5rc1tzdHJlYW1JZF07XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBzdHJlYW0gY2FzZVwiKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgYXN5bmMgI2RlbGV0ZVN0cmVhbUNvbnRyb2xsZXIoc3RyZWFtQ29udHJvbGxlciwgc3RyZWFtSWQpIHtcblx0ICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbc3RyZWFtQ29udHJvbGxlci5zdGFydENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIucHVsbENhbGw/LnByb21pc2UsIHN0cmVhbUNvbnRyb2xsZXIuY2FuY2VsQ2FsbD8ucHJvbWlzZV0pO1xuXHQgICAgZGVsZXRlIHRoaXMuc3RyZWFtQ29udHJvbGxlcnNbc3RyZWFtSWRdO1xuXHQgIH1cblx0ICBkZXN0cm95KCkge1xuXHQgICAgdGhpcy5jb21PYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5fb25Db21PYmpPbk1lc3NhZ2UpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLk1lc3NhZ2VIYW5kbGVyID0gTWVzc2FnZUhhbmRsZXI7XG5cblx0LyoqKi8gfSksXG5cdC8qIDE2ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5NZXRhZGF0YSA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0Y2xhc3MgTWV0YWRhdGEge1xuXHQgICNtZXRhZGF0YU1hcDtcblx0ICAjZGF0YTtcblx0ICBjb25zdHJ1Y3Rvcih7XG5cdCAgICBwYXJzZWREYXRhLFxuXHQgICAgcmF3RGF0YVxuXHQgIH0pIHtcblx0ICAgIHRoaXMuI21ldGFkYXRhTWFwID0gcGFyc2VkRGF0YTtcblx0ICAgIHRoaXMuI2RhdGEgPSByYXdEYXRhO1xuXHQgIH1cblx0ICBnZXRSYXcoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jZGF0YTtcblx0ICB9XG5cdCAgZ2V0KG5hbWUpIHtcblx0ICAgIHJldHVybiB0aGlzLiNtZXRhZGF0YU1hcC5nZXQobmFtZSkgPz8gbnVsbDtcblx0ICB9XG5cdCAgZ2V0QWxsKCkge1xuXHQgICAgcmV0dXJuICgwLCBfdXRpbC5vYmplY3RGcm9tTWFwKSh0aGlzLiNtZXRhZGF0YU1hcCk7XG5cdCAgfVxuXHQgIGhhcyhuYW1lKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jbWV0YWRhdGFNYXAuaGFzKG5hbWUpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLk1ldGFkYXRhID0gTWV0YWRhdGE7XG5cblx0LyoqKi8gfSksXG5cdC8qIDE3ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5PcHRpb25hbENvbnRlbnRDb25maWcgPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfbXVybXVyaGFzaCA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7XG5cdGNvbnN0IElOVEVSTkFMID0gU3ltYm9sKFwiSU5URVJOQUxcIik7XG5cdGNsYXNzIE9wdGlvbmFsQ29udGVudEdyb3VwIHtcblx0ICAjdmlzaWJsZSA9IHRydWU7XG5cdCAgY29uc3RydWN0b3IobmFtZSwgaW50ZW50KSB7XG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgdGhpcy5pbnRlbnQgPSBpbnRlbnQ7XG5cdCAgfVxuXHQgIGdldCB2aXNpYmxlKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI3Zpc2libGU7XG5cdCAgfVxuXHQgIF9zZXRWaXNpYmxlKGludGVybmFsLCB2aXNpYmxlKSB7XG5cdCAgICBpZiAoaW50ZXJuYWwgIT09IElOVEVSTkFMKSB7XG5cdCAgICAgICgwLCBfdXRpbC51bnJlYWNoYWJsZSkoXCJJbnRlcm5hbCBtZXRob2QgYF9zZXRWaXNpYmxlYCBjYWxsZWQuXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jdmlzaWJsZSA9IHZpc2libGU7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIE9wdGlvbmFsQ29udGVudENvbmZpZyB7XG5cdCAgI2NhY2hlZEdldEhhc2ggPSBudWxsO1xuXHQgICNncm91cHMgPSBuZXcgTWFwKCk7XG5cdCAgI2luaXRpYWxIYXNoID0gbnVsbDtcblx0ICAjb3JkZXIgPSBudWxsO1xuXHQgIGNvbnN0cnVjdG9yKGRhdGEpIHtcblx0ICAgIHRoaXMubmFtZSA9IG51bGw7XG5cdCAgICB0aGlzLmNyZWF0b3IgPSBudWxsO1xuXHQgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuXHQgICAgdGhpcy5jcmVhdG9yID0gZGF0YS5jcmVhdG9yO1xuXHQgICAgdGhpcy4jb3JkZXIgPSBkYXRhLm9yZGVyO1xuXHQgICAgZm9yIChjb25zdCBncm91cCBvZiBkYXRhLmdyb3Vwcykge1xuXHQgICAgICB0aGlzLiNncm91cHMuc2V0KGdyb3VwLmlkLCBuZXcgT3B0aW9uYWxDb250ZW50R3JvdXAoZ3JvdXAubmFtZSwgZ3JvdXAuaW50ZW50KSk7XG5cdCAgICB9XG5cdCAgICBpZiAoZGF0YS5iYXNlU3RhdGUgPT09IFwiT0ZGXCIpIHtcblx0ICAgICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLiNncm91cHMudmFsdWVzKCkpIHtcblx0ICAgICAgICBncm91cC5fc2V0VmlzaWJsZShJTlRFUk5BTCwgZmFsc2UpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IG9uIG9mIGRhdGEub24pIHtcblx0ICAgICAgdGhpcy4jZ3JvdXBzLmdldChvbikuX3NldFZpc2libGUoSU5URVJOQUwsIHRydWUpO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBvZmYgb2YgZGF0YS5vZmYpIHtcblx0ICAgICAgdGhpcy4jZ3JvdXBzLmdldChvZmYpLl9zZXRWaXNpYmxlKElOVEVSTkFMLCBmYWxzZSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNpbml0aWFsSGFzaCA9IHRoaXMuZ2V0SGFzaCgpO1xuXHQgIH1cblx0ICAjZXZhbHVhdGVWaXNpYmlsaXR5RXhwcmVzc2lvbihhcnJheSkge1xuXHQgICAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHQgICAgaWYgKGxlbmd0aCA8IDIpIHtcblx0ICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICB9XG5cdCAgICBjb25zdCBvcGVyYXRvciA9IGFycmF5WzBdO1xuXHQgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykge1xuXHQgICAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaV07XG5cdCAgICAgIGxldCBzdGF0ZTtcblx0ICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZWxlbWVudCkpIHtcblx0ICAgICAgICBzdGF0ZSA9IHRoaXMuI2V2YWx1YXRlVmlzaWJpbGl0eUV4cHJlc3Npb24oZWxlbWVudCk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy4jZ3JvdXBzLmhhcyhlbGVtZW50KSkge1xuXHQgICAgICAgIHN0YXRlID0gdGhpcy4jZ3JvdXBzLmdldChlbGVtZW50KS52aXNpYmxlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICgwLCBfdXRpbC53YXJuKShgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7ZWxlbWVudH1gKTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG5cdCAgICAgICAgY2FzZSBcIkFuZFwiOlxuXHQgICAgICAgICAgaWYgKCFzdGF0ZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiT3JcIjpcblx0ICAgICAgICAgIGlmIChzdGF0ZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJOb3RcIjpcblx0ICAgICAgICAgIHJldHVybiAhc3RhdGU7XG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gb3BlcmF0b3IgPT09IFwiQW5kXCI7XG5cdCAgfVxuXHQgIGlzVmlzaWJsZShncm91cCkge1xuXHQgICAgaWYgKHRoaXMuI2dyb3Vwcy5zaXplID09PSAwKSB7XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKCFncm91cCkge1xuXHQgICAgICAoMCwgX3V0aWwud2FybikoXCJPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBkZWZpbmVkLlwiKTtcblx0ICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICB9XG5cdCAgICBpZiAoZ3JvdXAudHlwZSA9PT0gXCJPQ0dcIikge1xuXHQgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoZ3JvdXAuaWQpKSB7XG5cdCAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtncm91cC5pZH1gKTtcblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy4jZ3JvdXBzLmdldChncm91cC5pZCkudmlzaWJsZTtcblx0ICAgIH0gZWxzZSBpZiAoZ3JvdXAudHlwZSA9PT0gXCJPQ01EXCIpIHtcblx0ICAgICAgaWYgKGdyb3VwLmV4cHJlc3Npb24pIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy4jZXZhbHVhdGVWaXNpYmlsaXR5RXhwcmVzc2lvbihncm91cC5leHByZXNzaW9uKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoIWdyb3VwLnBvbGljeSB8fCBncm91cC5wb2xpY3kgPT09IFwiQW55T25cIikge1xuXHQgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG5cdCAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG5cdCAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKHRoaXMuI2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09IFwiQWxsT25cIikge1xuXHQgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ3JvdXAuaWRzKSB7XG5cdCAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG5cdCAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG5cdCAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH0gZWxzZSBpZiAoZ3JvdXAucG9saWN5ID09PSBcIkFueU9mZlwiKSB7XG5cdCAgICAgICAgZm9yIChjb25zdCBpZCBvZiBncm91cC5pZHMpIHtcblx0ICAgICAgICAgIGlmICghdGhpcy4jZ3JvdXBzLmhhcyhpZCkpIHtcblx0ICAgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBPcHRpb25hbCBjb250ZW50IGdyb3VwIG5vdCBmb3VuZDogJHtpZH1gKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBpZiAoIXRoaXMuI2dyb3Vwcy5nZXQoaWQpLnZpc2libGUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIGlmIChncm91cC5wb2xpY3kgPT09IFwiQWxsT2ZmXCIpIHtcblx0ICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdyb3VwLmlkcykge1xuXHQgICAgICAgICAgaWYgKCF0aGlzLiNncm91cHMuaGFzKGlkKSkge1xuXHQgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYE9wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgbm90IGZvdW5kOiAke2lkfWApO1xuXHQgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGlmICh0aGlzLiNncm91cHMuZ2V0KGlkKS52aXNpYmxlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgKDAsIF91dGlsLndhcm4pKGBVbmtub3duIG9wdGlvbmFsIGNvbnRlbnQgcG9saWN5ICR7Z3JvdXAucG9saWN5fS5gKTtcblx0ICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICB9XG5cdCAgICAoMCwgX3V0aWwud2FybikoYFVua25vd24gZ3JvdXAgdHlwZSAke2dyb3VwLnR5cGV9LmApO1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHQgIHNldFZpc2liaWxpdHkoaWQsIHZpc2libGUgPSB0cnVlKSB7XG5cdCAgICBpZiAoIXRoaXMuI2dyb3Vwcy5oYXMoaWQpKSB7XG5cdCAgICAgICgwLCBfdXRpbC53YXJuKShgT3B0aW9uYWwgY29udGVudCBncm91cCBub3QgZm91bmQ6ICR7aWR9YCk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2dyb3Vwcy5nZXQoaWQpLl9zZXRWaXNpYmxlKElOVEVSTkFMLCAhIXZpc2libGUpO1xuXHQgICAgdGhpcy4jY2FjaGVkR2V0SGFzaCA9IG51bGw7XG5cdCAgfVxuXHQgIGdldCBoYXNJbml0aWFsVmlzaWJpbGl0eSgpIHtcblx0ICAgIHJldHVybiB0aGlzLmdldEhhc2goKSA9PT0gdGhpcy4jaW5pdGlhbEhhc2g7XG5cdCAgfVxuXHQgIGdldE9yZGVyKCkge1xuXHQgICAgaWYgKCF0aGlzLiNncm91cHMuc2l6ZSkge1xuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLiNvcmRlcikge1xuXHQgICAgICByZXR1cm4gdGhpcy4jb3JkZXIuc2xpY2UoKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBbLi4udGhpcy4jZ3JvdXBzLmtleXMoKV07XG5cdCAgfVxuXHQgIGdldEdyb3VwcygpIHtcblx0ICAgIHJldHVybiB0aGlzLiNncm91cHMuc2l6ZSA+IDAgPyAoMCwgX3V0aWwub2JqZWN0RnJvbU1hcCkodGhpcy4jZ3JvdXBzKSA6IG51bGw7XG5cdCAgfVxuXHQgIGdldEdyb3VwKGlkKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jZ3JvdXBzLmdldChpZCkgfHwgbnVsbDtcblx0ICB9XG5cdCAgZ2V0SGFzaCgpIHtcblx0ICAgIGlmICh0aGlzLiNjYWNoZWRHZXRIYXNoICE9PSBudWxsKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiNjYWNoZWRHZXRIYXNoO1xuXHQgICAgfVxuXHQgICAgY29uc3QgaGFzaCA9IG5ldyBfbXVybXVyaGFzaC5NdXJtdXJIYXNoM182NCgpO1xuXHQgICAgZm9yIChjb25zdCBbaWQsIGdyb3VwXSBvZiB0aGlzLiNncm91cHMpIHtcblx0ICAgICAgaGFzaC51cGRhdGUoYCR7aWR9OiR7Z3JvdXAudmlzaWJsZX1gKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLiNjYWNoZWRHZXRIYXNoID0gaGFzaC5oZXhkaWdlc3QoKTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5PcHRpb25hbENvbnRlbnRDb25maWcgPSBPcHRpb25hbENvbnRlbnRDb25maWc7XG5cblx0LyoqKi8gfSksXG5cdC8qIDE4ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5QREZEYXRhVHJhbnNwb3J0U3RyZWFtID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHRjbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtIHtcblx0ICBjb25zdHJ1Y3Rvcih7XG5cdCAgICBsZW5ndGgsXG5cdCAgICBpbml0aWFsRGF0YSxcblx0ICAgIHByb2dyZXNzaXZlRG9uZSA9IGZhbHNlLFxuXHQgICAgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBudWxsLFxuXHQgICAgZGlzYWJsZVJhbmdlID0gZmFsc2UsXG5cdCAgICBkaXNhYmxlU3RyZWFtID0gZmFsc2Vcblx0ICB9LCBwZGZEYXRhUmFuZ2VUcmFuc3BvcnQpIHtcblx0ICAgICgwLCBfdXRpbC5hc3NlcnQpKHBkZkRhdGFSYW5nZVRyYW5zcG9ydCwgJ1BERkRhdGFUcmFuc3BvcnRTdHJlYW0gLSBtaXNzaW5nIHJlcXVpcmVkIFwicGRmRGF0YVJhbmdlVHJhbnNwb3J0XCIgYXJndW1lbnQuJyk7XG5cdCAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBbXTtcblx0ICAgIHRoaXMuX3Byb2dyZXNzaXZlRG9uZSA9IHByb2dyZXNzaXZlRG9uZTtcblx0ICAgIHRoaXMuX2NvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lID0gY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWU7XG5cdCAgICBpZiAoaW5pdGlhbERhdGE/Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgY29uc3QgYnVmZmVyID0gaW5pdGlhbERhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGluaXRpYWxEYXRhLmJ5dGVMZW5ndGggPT09IGluaXRpYWxEYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoID8gaW5pdGlhbERhdGEuYnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoaW5pdGlhbERhdGEpLmJ1ZmZlcjtcblx0ICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goYnVmZmVyKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydCA9IHBkZkRhdGFSYW5nZVRyYW5zcG9ydDtcblx0ICAgIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkID0gIWRpc2FibGVTdHJlYW07XG5cdCAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIWRpc2FibGVSYW5nZTtcblx0ICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBsZW5ndGg7XG5cdCAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG5cdCAgICB0aGlzLl9yYW5nZVJlYWRlcnMgPSBbXTtcblx0ICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRSYW5nZUxpc3RlbmVyKChiZWdpbiwgY2h1bmspID0+IHtcblx0ICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7XG5cdCAgICAgICAgYmVnaW4sXG5cdCAgICAgICAgY2h1bmtcblx0ICAgICAgfSk7XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc0xpc3RlbmVyKChsb2FkZWQsIHRvdGFsKSA9PiB7XG5cdCAgICAgIHRoaXMuX29uUHJvZ3Jlc3Moe1xuXHQgICAgICAgIGxvYWRlZCxcblx0ICAgICAgICB0b3RhbFxuXHQgICAgICB9KTtcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFkZFByb2dyZXNzaXZlUmVhZExpc3RlbmVyKGNodW5rID0+IHtcblx0ICAgICAgdGhpcy5fb25SZWNlaXZlRGF0YSh7XG5cdCAgICAgICAgY2h1bmtcblx0ICAgICAgfSk7XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC5hZGRQcm9ncmVzc2l2ZURvbmVMaXN0ZW5lcigoKSA9PiB7XG5cdCAgICAgIHRoaXMuX29uUHJvZ3Jlc3NpdmVEb25lKCk7XG5cdCAgICB9KTtcblx0ICAgIHRoaXMuX3BkZkRhdGFSYW5nZVRyYW5zcG9ydC50cmFuc3BvcnRSZWFkeSgpO1xuXHQgIH1cblx0ICBfb25SZWNlaXZlRGF0YSh7XG5cdCAgICBiZWdpbixcblx0ICAgIGNodW5rXG5cdCAgfSkge1xuXHQgICAgY29uc3QgYnVmZmVyID0gY2h1bmsgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGNodW5rLmJ5dGVMZW5ndGggPT09IGNodW5rLmJ1ZmZlci5ieXRlTGVuZ3RoID8gY2h1bmsuYnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcblx0ICAgIGlmIChiZWdpbiA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIGlmICh0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcikge1xuXHQgICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLl9lbnF1ZXVlKGJ1ZmZlcik7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5fcXVldWVkQ2h1bmtzLnB1c2goYnVmZmVyKTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc3QgZm91bmQgPSB0aGlzLl9yYW5nZVJlYWRlcnMuc29tZShmdW5jdGlvbiAocmFuZ2VSZWFkZXIpIHtcblx0ICAgICAgICBpZiAocmFuZ2VSZWFkZXIuX2JlZ2luICE9PSBiZWdpbikge1xuXHQgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByYW5nZVJlYWRlci5fZW5xdWV1ZShidWZmZXIpO1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9KTtcblx0ICAgICAgKDAsIF91dGlsLmFzc2VydCkoZm91bmQsIFwiX29uUmVjZWl2ZURhdGEgLSBubyBgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyYCBpbnN0YW5jZSBmb3VuZC5cIik7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5fbG9hZGVkID8/IDA7XG5cdCAgfVxuXHQgIF9vblByb2dyZXNzKGV2dCkge1xuXHQgICAgaWYgKGV2dC50b3RhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIHRoaXMuX3JhbmdlUmVhZGVyc1swXT8ub25Qcm9ncmVzcz8uKHtcblx0ICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWRcblx0ICAgICAgfSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8ub25Qcm9ncmVzcz8uKHtcblx0ICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWQsXG5cdCAgICAgICAgdG90YWw6IGV2dC50b3RhbFxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX29uUHJvZ3Jlc3NpdmVEb25lKCkge1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LnByb2dyZXNzaXZlRG9uZSgpO1xuXHQgICAgdGhpcy5fcHJvZ3Jlc3NpdmVEb25lID0gdHJ1ZTtcblx0ICB9XG5cdCAgX3JlbW92ZVJhbmdlUmVhZGVyKHJlYWRlcikge1xuXHQgICAgY29uc3QgaSA9IHRoaXMuX3JhbmdlUmVhZGVycy5pbmRleE9mKHJlYWRlcik7XG5cdCAgICBpZiAoaSA+PSAwKSB7XG5cdCAgICAgIHRoaXMuX3JhbmdlUmVhZGVycy5zcGxpY2UoaSwgMSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldEZ1bGxSZWFkZXIoKSB7XG5cdCAgICAoMCwgX3V0aWwuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGRGF0YVRyYW5zcG9ydFN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcblx0ICAgIGNvbnN0IHF1ZXVlZENodW5rcyA9IHRoaXMuX3F1ZXVlZENodW5rcztcblx0ICAgIHRoaXMuX3F1ZXVlZENodW5rcyA9IG51bGw7XG5cdCAgICByZXR1cm4gbmV3IFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIodGhpcywgcXVldWVkQ2h1bmtzLCB0aGlzLl9wcm9ncmVzc2l2ZURvbmUsIHRoaXMuX2NvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKTtcblx0ICB9XG5cdCAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuXHQgICAgaWYgKGVuZCA8PSB0aGlzLl9wcm9ncmVzc2l2ZURhdGFMZW5ndGgpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCByZWFkZXIgPSBuZXcgUERGRGF0YVRyYW5zcG9ydFN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIGJlZ2luLCBlbmQpO1xuXHQgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LnJlcXVlc3REYXRhUmFuZ2UoYmVnaW4sIGVuZCk7XG5cdCAgICB0aGlzLl9yYW5nZVJlYWRlcnMucHVzaChyZWFkZXIpO1xuXHQgICAgcmV0dXJuIHJlYWRlcjtcblx0ICB9XG5cdCAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG5cdCAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG5cdCAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLl9yYW5nZVJlYWRlcnMuc2xpY2UoMCkpIHtcblx0ICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fcGRmRGF0YVJhbmdlVHJhbnNwb3J0LmFib3J0KCk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUERGRGF0YVRyYW5zcG9ydFN0cmVhbSA9IFBERkRhdGFUcmFuc3BvcnRTdHJlYW07XG5cdGNsYXNzIFBERkRhdGFUcmFuc3BvcnRTdHJlYW1SZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHN0cmVhbSwgcXVldWVkQ2h1bmtzLCBwcm9ncmVzc2l2ZURvbmUgPSBmYWxzZSwgY29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUgPSBudWxsKSB7XG5cdCAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG5cdCAgICB0aGlzLl9kb25lID0gcHJvZ3Jlc3NpdmVEb25lIHx8IGZhbHNlO1xuXHQgICAgdGhpcy5fZmlsZW5hbWUgPSAoMCwgX2Rpc3BsYXlfdXRpbHMuaXNQZGZGaWxlKShjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSkgPyBjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSA6IG51bGw7XG5cdCAgICB0aGlzLl9xdWV1ZWRDaHVua3MgPSBxdWV1ZWRDaHVua3MgfHwgW107XG5cdCAgICB0aGlzLl9sb2FkZWQgPSAwO1xuXHQgICAgZm9yIChjb25zdCBjaHVuayBvZiB0aGlzLl9xdWV1ZWRDaHVua3MpIHtcblx0ICAgICAgdGhpcy5fbG9hZGVkICs9IGNodW5rLmJ5dGVMZW5ndGg7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9yZXF1ZXN0cyA9IFtdO1xuXHQgICAgdGhpcy5faGVhZGVyc1JlYWR5ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdCAgICBzdHJlYW0uX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcztcblx0ICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cdCAgfVxuXHQgIF9lbnF1ZXVlKGNodW5rKSB7XG5cdCAgICBpZiAodGhpcy5fZG9uZSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fcmVxdWVzdHMubGVuZ3RoID4gMCkge1xuXHQgICAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IHRoaXMuX3JlcXVlc3RzLnNoaWZ0KCk7XG5cdCAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgIHZhbHVlOiBjaHVuayxcblx0ICAgICAgICBkb25lOiBmYWxzZVxuXHQgICAgICB9KTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuX3F1ZXVlZENodW5rcy5wdXNoKGNodW5rKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2xvYWRlZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuXHQgIH1cblx0ICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNSZWFkeTtcblx0ICB9XG5cdCAgZ2V0IGZpbGVuYW1lKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuXHQgIH1cblx0ICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzUmFuZ2VTdXBwb3J0ZWQ7XG5cdCAgfVxuXHQgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuXHQgIH1cblx0ICBnZXQgY29udGVudExlbmd0aCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9zdHJlYW0uX2NvbnRlbnRMZW5ndGg7XG5cdCAgfVxuXHQgIGFzeW5jIHJlYWQoKSB7XG5cdCAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmtzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVua3Muc2hpZnQoKTtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICB2YWx1ZTogY2h1bmssXG5cdCAgICAgICAgZG9uZTogZmFsc2Vcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl9kb25lKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcblx0ICAgICAgICBkb25lOiB0cnVlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICBjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgdGhpcy5fcmVxdWVzdHMucHVzaChyZXF1ZXN0Q2FwYWJpbGl0eSk7XG5cdCAgICByZXR1cm4gcmVxdWVzdENhcGFiaWxpdHkucHJvbWlzZTtcblx0ICB9XG5cdCAgY2FuY2VsKHJlYXNvbikge1xuXHQgICAgdGhpcy5fZG9uZSA9IHRydWU7XG5cdCAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG5cdCAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG5cdCAgfVxuXHQgIHByb2dyZXNzaXZlRG9uZSgpIHtcblx0ICAgIGlmICh0aGlzLl9kb25lKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBQREZEYXRhVHJhbnNwb3J0U3RyZWFtUmFuZ2VSZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHN0cmVhbSwgYmVnaW4sIGVuZCkge1xuXHQgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuXHQgICAgdGhpcy5fYmVnaW4gPSBiZWdpbjtcblx0ICAgIHRoaXMuX2VuZCA9IGVuZDtcblx0ICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcblx0ICAgIHRoaXMuX3JlcXVlc3RzID0gW107XG5cdCAgICB0aGlzLl9kb25lID0gZmFsc2U7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuXHQgIH1cblx0ICBfZW5xdWV1ZShjaHVuaykge1xuXHQgICAgaWYgKHRoaXMuX2RvbmUpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IGNodW5rO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc3QgcmVxdWVzdHNDYXBhYmlsaXR5ID0gdGhpcy5fcmVxdWVzdHMuc2hpZnQoKTtcblx0ICAgICAgcmVxdWVzdHNDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgIHZhbHVlOiBjaHVuayxcblx0ICAgICAgICBkb25lOiBmYWxzZVxuXHQgICAgICB9KTtcblx0ICAgICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuXHQgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcblx0ICAgICAgICAgIGRvbmU6IHRydWVcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fZG9uZSA9IHRydWU7XG5cdCAgICB0aGlzLl9zdHJlYW0uX3JlbW92ZVJhbmdlUmVhZGVyKHRoaXMpO1xuXHQgIH1cblx0ICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gZmFsc2U7XG5cdCAgfVxuXHQgIGFzeW5jIHJlYWQoKSB7XG5cdCAgICBpZiAodGhpcy5fcXVldWVkQ2h1bmspIHtcblx0ICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9xdWV1ZWRDaHVuaztcblx0ICAgICAgdGhpcy5fcXVldWVkQ2h1bmsgPSBudWxsO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHZhbHVlOiBjaHVuayxcblx0ICAgICAgICBkb25lOiBmYWxzZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX2RvbmUpIHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuXHQgICAgICAgIGRvbmU6IHRydWVcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKHJlcXVlc3RDYXBhYmlsaXR5KTtcblx0ICAgIHJldHVybiByZXF1ZXN0Q2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBjYW5jZWwocmVhc29uKSB7XG5cdCAgICB0aGlzLl9kb25lID0gdHJ1ZTtcblx0ICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcblx0ICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG5cdCAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcblx0ICAgICAgICBkb25lOiB0cnVlXG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcblx0ICAgIHRoaXMuX3N0cmVhbS5fcmVtb3ZlUmFuZ2VSZWFkZXIodGhpcyk7XG5cdCAgfVxuXHR9XG5cblx0LyoqKi8gfSksXG5cdC8qIDE5ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMpID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5YZmFUZXh0ID0gdm9pZCAwO1xuXHRjbGFzcyBYZmFUZXh0IHtcblx0ICBzdGF0aWMgdGV4dENvbnRlbnQoeGZhKSB7XG5cdCAgICBjb25zdCBpdGVtcyA9IFtdO1xuXHQgICAgY29uc3Qgb3V0cHV0ID0ge1xuXHQgICAgICBpdGVtcyxcblx0ICAgICAgc3R5bGVzOiBPYmplY3QuY3JlYXRlKG51bGwpXG5cdCAgICB9O1xuXHQgICAgZnVuY3Rpb24gd2Fsayhub2RlKSB7XG5cdCAgICAgIGlmICghbm9kZSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBsZXQgc3RyID0gbnVsbDtcblx0ICAgICAgY29uc3QgbmFtZSA9IG5vZGUubmFtZTtcblx0ICAgICAgaWYgKG5hbWUgPT09IFwiI3RleHRcIikge1xuXHQgICAgICAgIHN0ciA9IG5vZGUudmFsdWU7XG5cdCAgICAgIH0gZWxzZSBpZiAoIVhmYVRleHQuc2hvdWxkQnVpbGRUZXh0KG5hbWUpKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9IGVsc2UgaWYgKG5vZGU/LmF0dHJpYnV0ZXM/LnRleHRDb250ZW50KSB7XG5cdCAgICAgICAgc3RyID0gbm9kZS5hdHRyaWJ1dGVzLnRleHRDb250ZW50O1xuXHQgICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUpIHtcblx0ICAgICAgICBzdHIgPSBub2RlLnZhbHVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChzdHIgIT09IG51bGwpIHtcblx0ICAgICAgICBpdGVtcy5wdXNoKHtcblx0ICAgICAgICAgIHN0clxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghbm9kZS5jaGlsZHJlbikge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcblx0ICAgICAgICB3YWxrKGNoaWxkKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgd2Fsayh4ZmEpO1xuXHQgICAgcmV0dXJuIG91dHB1dDtcblx0ICB9XG5cdCAgc3RhdGljIHNob3VsZEJ1aWxkVGV4dChuYW1lKSB7XG5cdCAgICByZXR1cm4gIShuYW1lID09PSBcInRleHRhcmVhXCIgfHwgbmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwib3B0aW9uXCIgfHwgbmFtZSA9PT0gXCJzZWxlY3RcIik7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuWGZhVGV4dCA9IFhmYVRleHQ7XG5cblx0LyoqKi8gfSksXG5cdC8qIDIwICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5Ob2RlU3RhbmRhcmRGb250RGF0YUZhY3RvcnkgPSBleHBvcnRzLk5vZGVGaWx0ZXJGYWN0b3J5ID0gZXhwb3J0cy5Ob2RlQ2FudmFzRmFjdG9yeSA9IGV4cG9ydHMuTm9kZUNNYXBSZWFkZXJGYWN0b3J5ID0gdm9pZCAwO1xuXHR2YXIgX2Jhc2VfZmFjdG9yeSA9IF9fd19wZGZqc19yZXF1aXJlX18oNyk7XG5cdGNvbnN0IGZldGNoRGF0YSA9IGZ1bmN0aW9uICh1cmwpIHtcblx0ICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHQgICAgY29uc3QgZnMgPSByZXF1aXJlJCQwO1xuXHQgICAgZnMucmVhZEZpbGUodXJsLCAoZXJyb3IsIGRhdGEpID0+IHtcblx0ICAgICAgaWYgKGVycm9yIHx8ICFkYXRhKSB7XG5cdCAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvcikpO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KGRhdGEpKTtcblx0ICAgIH0pO1xuXHQgIH0pO1xuXHR9O1xuXHRjbGFzcyBOb2RlRmlsdGVyRmFjdG9yeSBleHRlbmRzIF9iYXNlX2ZhY3RvcnkuQmFzZUZpbHRlckZhY3Rvcnkge31cblx0ZXhwb3J0cy5Ob2RlRmlsdGVyRmFjdG9yeSA9IE5vZGVGaWx0ZXJGYWN0b3J5O1xuXHRjbGFzcyBOb2RlQ2FudmFzRmFjdG9yeSBleHRlbmRzIF9iYXNlX2ZhY3RvcnkuQmFzZUNhbnZhc0ZhY3Rvcnkge1xuXHQgIF9jcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCkge1xuXHQgICAgY29uc3QgQ2FudmFzID0gcmVxdWlyZSQkMTtcblx0ICAgIHJldHVybiBDYW52YXMuY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLk5vZGVDYW52YXNGYWN0b3J5ID0gTm9kZUNhbnZhc0ZhY3Rvcnk7XG5cdGNsYXNzIE5vZGVDTWFwUmVhZGVyRmFjdG9yeSBleHRlbmRzIF9iYXNlX2ZhY3RvcnkuQmFzZUNNYXBSZWFkZXJGYWN0b3J5IHtcblx0ICBfZmV0Y2hEYXRhKHVybCwgY29tcHJlc3Npb25UeXBlKSB7XG5cdCAgICByZXR1cm4gZmV0Y2hEYXRhKHVybCkudGhlbihkYXRhID0+IHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICBjTWFwRGF0YTogZGF0YSxcblx0ICAgICAgICBjb21wcmVzc2lvblR5cGVcblx0ICAgICAgfTtcblx0ICAgIH0pO1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLk5vZGVDTWFwUmVhZGVyRmFjdG9yeSA9IE5vZGVDTWFwUmVhZGVyRmFjdG9yeTtcblx0Y2xhc3MgTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5IGV4dGVuZHMgX2Jhc2VfZmFjdG9yeS5CYXNlU3RhbmRhcmRGb250RGF0YUZhY3Rvcnkge1xuXHQgIF9mZXRjaERhdGEodXJsKSB7XG5cdCAgICByZXR1cm4gZmV0Y2hEYXRhKHVybCk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5ID0gTm9kZVN0YW5kYXJkRm9udERhdGFGYWN0b3J5O1xuXG5cdC8qKiovIH0pLFxuXHQvKiAyMSAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuUERGTm9kZVN0cmVhbSA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9uZXR3b3JrX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7XG5cdGNvbnN0IGZzID0gcmVxdWlyZSQkMDtcblx0Y29uc3QgaHR0cCA9IHJlcXVpcmUkJDI7XG5cdGNvbnN0IGh0dHBzID0gcmVxdWlyZSQkMztcblx0Y29uc3QgdXJsID0gcmVxdWlyZSQkNDtcblx0Y29uc3QgZmlsZVVyaVJlZ2V4ID0gL15maWxlOlxcL1xcL1xcL1thLXpBLVpdOlxcLy87XG5cdGZ1bmN0aW9uIHBhcnNlVXJsKHNvdXJjZVVybCkge1xuXHQgIGNvbnN0IHBhcnNlZFVybCA9IHVybC5wYXJzZShzb3VyY2VVcmwpO1xuXHQgIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09IFwiZmlsZTpcIiB8fCBwYXJzZWRVcmwuaG9zdCkge1xuXHQgICAgcmV0dXJuIHBhcnNlZFVybDtcblx0ICB9XG5cdCAgaWYgKC9eW2Etel06Wy9cXFxcXS9pLnRlc3Qoc291cmNlVXJsKSkge1xuXHQgICAgcmV0dXJuIHVybC5wYXJzZShgZmlsZTovLy8ke3NvdXJjZVVybH1gKTtcblx0ICB9XG5cdCAgaWYgKCFwYXJzZWRVcmwuaG9zdCkge1xuXHQgICAgcGFyc2VkVXJsLnByb3RvY29sID0gXCJmaWxlOlwiO1xuXHQgIH1cblx0ICByZXR1cm4gcGFyc2VkVXJsO1xuXHR9XG5cdGNsYXNzIFBERk5vZGVTdHJlYW0ge1xuXHQgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuXHQgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICB0aGlzLnVybCA9IHBhcnNlVXJsKHNvdXJjZS51cmwpO1xuXHQgICAgdGhpcy5pc0h0dHAgPSB0aGlzLnVybC5wcm90b2NvbCA9PT0gXCJodHRwOlwiIHx8IHRoaXMudXJsLnByb3RvY29sID09PSBcImh0dHBzOlwiO1xuXHQgICAgdGhpcy5pc0ZzVXJsID0gdGhpcy51cmwucHJvdG9jb2wgPT09IFwiZmlsZTpcIjtcblx0ICAgIHRoaXMuaHR0cEhlYWRlcnMgPSB0aGlzLmlzSHR0cCAmJiBzb3VyY2UuaHR0cEhlYWRlcnMgfHwge307XG5cdCAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG5cdCAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzID0gW107XG5cdCAgfVxuXHQgIGdldCBfcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5fbG9hZGVkID8/IDA7XG5cdCAgfVxuXHQgIGdldEZ1bGxSZWFkZXIoKSB7XG5cdCAgICAoMCwgX3V0aWwuYXNzZXJ0KSghdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIsIFwiUERGTm9kZVN0cmVhbS5nZXRGdWxsUmVhZGVyIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLlwiKTtcblx0ICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyID0gdGhpcy5pc0ZzVXJsID8gbmV3IFBERk5vZGVTdHJlYW1Gc0Z1bGxSZWFkZXIodGhpcykgOiBuZXcgUERGTm9kZVN0cmVhbUZ1bGxSZWFkZXIodGhpcyk7XG5cdCAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG5cdCAgfVxuXHQgIGdldFJhbmdlUmVhZGVyKHN0YXJ0LCBlbmQpIHtcblx0ICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcmFuZ2VSZWFkZXIgPSB0aGlzLmlzRnNVcmwgPyBuZXcgUERGTm9kZVN0cmVhbUZzUmFuZ2VSZWFkZXIodGhpcywgc3RhcnQsIGVuZCkgOiBuZXcgUERGTm9kZVN0cmVhbVJhbmdlUmVhZGVyKHRoaXMsIHN0YXJ0LCBlbmQpO1xuXHQgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJhbmdlUmVhZGVyKTtcblx0ICAgIHJldHVybiByYW5nZVJlYWRlcjtcblx0ICB9XG5cdCAgY2FuY2VsQWxsUmVxdWVzdHMocmVhc29uKSB7XG5cdCAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uY2FuY2VsKHJlYXNvbik7XG5cdCAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnNsaWNlKDApKSB7XG5cdCAgICAgIHJlYWRlci5jYW5jZWwocmVhc29uKTtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5QREZOb2RlU3RyZWFtID0gUERGTm9kZVN0cmVhbTtcblx0Y2xhc3MgQmFzZUZ1bGxSZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuXHQgICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDtcblx0ICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcblx0ICAgIHRoaXMuX3N0b3JlZEVycm9yID0gbnVsbDtcblx0ICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cdCAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuXHQgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cdCAgICB0aGlzLl9sb2FkZWQgPSAwO1xuXHQgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuXHQgICAgdGhpcy5fZGlzYWJsZVJhbmdlID0gc291cmNlLmRpc2FibGVSYW5nZSB8fCBmYWxzZTtcblx0ICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuXHQgICAgaWYgKCF0aGlzLl9yYW5nZUNodW5rU2l6ZSAmJiAhdGhpcy5fZGlzYWJsZVJhbmdlKSB7XG5cdCAgICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHRydWU7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcblx0ICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVSYW5nZTtcblx0ICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtID0gbnVsbDtcblx0ICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl9oZWFkZXJzQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgIH1cblx0ICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIGdldCBmaWxlbmFtZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcblx0ICB9XG5cdCAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcblx0ICB9XG5cdCAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcblx0ICB9XG5cdCAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuXHQgIH1cblx0ICBhc3luYyByZWFkKCkge1xuXHQgICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgIGlmICh0aGlzLl9kb25lKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcblx0ICAgICAgICBkb25lOiB0cnVlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcblx0ICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG5cdCAgICB9XG5cdCAgICBjb25zdCBjaHVuayA9IHRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTtcblx0ICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuXHQgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgICByZXR1cm4gdGhpcy5yZWFkKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsubGVuZ3RoO1xuXHQgICAgdGhpcy5vblByb2dyZXNzPy4oe1xuXHQgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZCxcblx0ICAgICAgdG90YWw6IHRoaXMuX2NvbnRlbnRMZW5ndGhcblx0ICAgIH0pO1xuXHQgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspLmJ1ZmZlcjtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHZhbHVlOiBidWZmZXIsXG5cdCAgICAgIGRvbmU6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH1cblx0ICBjYW5jZWwocmVhc29uKSB7XG5cdCAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RyZWFtKSB7XG5cdCAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kocmVhc29uKTtcblx0ICB9XG5cdCAgX2Vycm9yKHJlYXNvbikge1xuXHQgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG5cdCAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgfVxuXHQgIF9zZXRSZWFkYWJsZVN0cmVhbShyZWFkYWJsZVN0cmVhbSkge1xuXHQgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSByZWFkYWJsZVN0cmVhbTtcblx0ICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuXHQgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICB9KTtcblx0ICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcblx0ICAgICAgcmVhZGFibGVTdHJlYW0uZGVzdHJveSgpO1xuXHQgICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgICAgfSk7XG5cdCAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlYXNvbiA9PiB7XG5cdCAgICAgIHRoaXMuX2Vycm9yKHJlYXNvbik7XG5cdCAgICB9KTtcblx0ICAgIGlmICghdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgJiYgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCkge1xuXHQgICAgICB0aGlzLl9lcnJvcihuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oXCJzdHJlYW1pbmcgaXMgZGlzYWJsZWRcIikpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG5cdCAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodGhpcy5fc3RvcmVkRXJyb3IpO1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRjbGFzcyBCYXNlUmFuZ2VSZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuXHQgICAgdGhpcy5fdXJsID0gc3RyZWFtLnVybDtcblx0ICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcblx0ICAgIHRoaXMuX3N0b3JlZEVycm9yID0gbnVsbDtcblx0ICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cdCAgICB0aGlzLl9sb2FkZWQgPSAwO1xuXHQgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0gPSBudWxsO1xuXHQgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIGNvbnN0IHNvdXJjZSA9IHN0cmVhbS5zb3VyY2U7XG5cdCAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcblx0ICB9XG5cdCAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuXHQgIH1cblx0ICBhc3luYyByZWFkKCkge1xuXHQgICAgYXdhaXQgdGhpcy5fcmVhZENhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgIGlmICh0aGlzLl9kb25lKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcblx0ICAgICAgICBkb25lOiB0cnVlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fc3RvcmVkRXJyb3IpIHtcblx0ICAgICAgdGhyb3cgdGhpcy5fc3RvcmVkRXJyb3I7XG5cdCAgICB9XG5cdCAgICBjb25zdCBjaHVuayA9IHRoaXMuX3JlYWRhYmxlU3RyZWFtLnJlYWQoKTtcblx0ICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuXHQgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eSA9IG5ldyBfdXRpbC5Qcm9taXNlQ2FwYWJpbGl0eSgpO1xuXHQgICAgICByZXR1cm4gdGhpcy5yZWFkKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9sb2FkZWQgKz0gY2h1bmsubGVuZ3RoO1xuXHQgICAgdGhpcy5vblByb2dyZXNzPy4oe1xuXHQgICAgICBsb2FkZWQ6IHRoaXMuX2xvYWRlZFxuXHQgICAgfSk7XG5cdCAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShjaHVuaykuYnVmZmVyO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgdmFsdWU6IGJ1ZmZlcixcblx0ICAgICAgZG9uZTogZmFsc2Vcblx0ICAgIH07XG5cdCAgfVxuXHQgIGNhbmNlbChyZWFzb24pIHtcblx0ICAgIGlmICghdGhpcy5fcmVhZGFibGVTdHJlYW0pIHtcblx0ICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fcmVhZGFibGVTdHJlYW0uZGVzdHJveShyZWFzb24pO1xuXHQgIH1cblx0ICBfZXJyb3IocmVhc29uKSB7XG5cdCAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcblx0ICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICB9XG5cdCAgX3NldFJlYWRhYmxlU3RyZWFtKHJlYWRhYmxlU3RyZWFtKSB7XG5cdCAgICB0aGlzLl9yZWFkYWJsZVN0cmVhbSA9IHJlYWRhYmxlU3RyZWFtO1xuXHQgICAgcmVhZGFibGVTdHJlYW0ub24oXCJyZWFkYWJsZVwiLCAoKSA9PiB7XG5cdCAgICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgIH0pO1xuXHQgICAgcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuXHQgICAgICByZWFkYWJsZVN0cmVhbS5kZXN0cm95KCk7XG5cdCAgICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuXHQgICAgICB0aGlzLl9yZWFkQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdCAgICB9KTtcblx0ICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcblx0ICAgICAgdGhpcy5fZXJyb3IocmVhc29uKTtcblx0ICAgIH0pO1xuXHQgICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG5cdCAgICAgIHRoaXMuX3JlYWRhYmxlU3RyZWFtLmRlc3Ryb3kodGhpcy5fc3RvcmVkRXJyb3IpO1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0T3B0aW9ucyhwYXJzZWRVcmwsIGhlYWRlcnMpIHtcblx0ICByZXR1cm4ge1xuXHQgICAgcHJvdG9jb2w6IHBhcnNlZFVybC5wcm90b2NvbCxcblx0ICAgIGF1dGg6IHBhcnNlZFVybC5hdXRoLFxuXHQgICAgaG9zdDogcGFyc2VkVXJsLmhvc3RuYW1lLFxuXHQgICAgcG9ydDogcGFyc2VkVXJsLnBvcnQsXG5cdCAgICBwYXRoOiBwYXJzZWRVcmwucGF0aCxcblx0ICAgIG1ldGhvZDogXCJHRVRcIixcblx0ICAgIGhlYWRlcnNcblx0ICB9O1xuXHR9XG5cdGNsYXNzIFBERk5vZGVTdHJlYW1GdWxsUmVhZGVyIGV4dGVuZHMgQmFzZUZ1bGxSZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuXHQgICAgc3VwZXIoc3RyZWFtKTtcblx0ICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gcmVzcG9uc2UgPT4ge1xuXHQgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG5cdCAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3RoaXMuX3VybH1cIi5gKTtcblx0ICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuXHQgICAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChlcnJvcik7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0ocmVzcG9uc2UpO1xuXHQgICAgICBjb25zdCBnZXRSZXNwb25zZUhlYWRlciA9IG5hbWUgPT4ge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0cmVhbS5oZWFkZXJzW25hbWUudG9Mb3dlckNhc2UoKV07XG5cdCAgICAgIH07XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHMsXG5cdCAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoXG5cdCAgICAgIH0gPSAoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHtcblx0ICAgICAgICBnZXRSZXNwb25zZUhlYWRlcixcblx0ICAgICAgICBpc0h0dHA6IHN0cmVhbS5pc0h0dHAsXG5cdCAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuXHQgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gYWxsb3dSYW5nZVJlcXVlc3RzO1xuXHQgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG5cdCAgICAgIHRoaXMuX2ZpbGVuYW1lID0gKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGdldFJlc3BvbnNlSGVhZGVyKTtcblx0ICAgIH07XG5cdCAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcblx0ICAgIGlmICh0aGlzLl91cmwucHJvdG9jb2wgPT09IFwiaHR0cDpcIikge1xuXHQgICAgICB0aGlzLl9yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0KGNyZWF0ZVJlcXVlc3RPcHRpb25zKHRoaXMuX3VybCwgc3RyZWFtLmh0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCBzdHJlYW0uaHR0cEhlYWRlcnMpLCBoYW5kbGVSZXNwb25zZSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9yZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgcmVhc29uID0+IHtcblx0ICAgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSByZWFzb247XG5cdCAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdChyZWFzb24pO1xuXHQgICAgfSk7XG5cdCAgICB0aGlzLl9yZXF1ZXN0LmVuZCgpO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBQREZOb2RlU3RyZWFtUmFuZ2VSZWFkZXIgZXh0ZW5kcyBCYXNlUmFuZ2VSZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHN0cmVhbSwgc3RhcnQsIGVuZCkge1xuXHQgICAgc3VwZXIoc3RyZWFtKTtcblx0ICAgIHRoaXMuX2h0dHBIZWFkZXJzID0ge307XG5cdCAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHN0cmVhbS5odHRwSGVhZGVycykge1xuXHQgICAgICBjb25zdCB2YWx1ZSA9IHN0cmVhbS5odHRwSGVhZGVyc1twcm9wZXJ0eV07XG5cdCAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5faHR0cEhlYWRlcnNbcHJvcGVydHldID0gdmFsdWU7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9odHRwSGVhZGVycy5SYW5nZSA9IGBieXRlcz0ke3N0YXJ0fS0ke2VuZCAtIDF9YDtcblx0ICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gcmVzcG9uc2UgPT4ge1xuXHQgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG5cdCAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3RoaXMuX3VybH1cIi5gKTtcblx0ICAgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IGVycm9yO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShyZXNwb25zZSk7XG5cdCAgICB9O1xuXHQgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG5cdCAgICBpZiAodGhpcy5fdXJsLnByb3RvY29sID09PSBcImh0dHA6XCIpIHtcblx0ICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHAucmVxdWVzdChjcmVhdGVSZXF1ZXN0T3B0aW9ucyh0aGlzLl91cmwsIHRoaXMuX2h0dHBIZWFkZXJzKSwgaGFuZGxlUmVzcG9uc2UpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fcmVxdWVzdCA9IGh0dHBzLnJlcXVlc3QoY3JlYXRlUmVxdWVzdE9wdGlvbnModGhpcy5fdXJsLCB0aGlzLl9odHRwSGVhZGVycyksIGhhbmRsZVJlc3BvbnNlKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlcXVlc3Qub24oXCJlcnJvclwiLCByZWFzb24gPT4ge1xuXHQgICAgICB0aGlzLl9zdG9yZWRFcnJvciA9IHJlYXNvbjtcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5fcmVxdWVzdC5lbmQoKTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUERGTm9kZVN0cmVhbUZzRnVsbFJlYWRlciBleHRlbmRzIEJhc2VGdWxsUmVhZGVyIHtcblx0ICBjb25zdHJ1Y3RvcihzdHJlYW0pIHtcblx0ICAgIHN1cGVyKHN0cmVhbSk7XG5cdCAgICBsZXQgcGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLl91cmwucGF0aCk7XG5cdCAgICBpZiAoZmlsZVVyaVJlZ2V4LnRlc3QodGhpcy5fdXJsLmhyZWYpKSB7XG5cdCAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKTtcblx0ICAgIH1cblx0ICAgIGZzLmxzdGF0KHBhdGgsIChlcnJvciwgc3RhdCkgPT4ge1xuXHQgICAgICBpZiAoZXJyb3IpIHtcblx0ICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIikge1xuXHQgICAgICAgICAgZXJyb3IgPSBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbihgTWlzc2luZyBQREYgXCIke3BhdGh9XCIuYCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX3N0b3JlZEVycm9yID0gZXJyb3I7XG5cdCAgICAgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHN0YXQuc2l6ZTtcblx0ICAgICAgdGhpcy5fc2V0UmVhZGFibGVTdHJlYW0oZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoKSk7XG5cdCAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgIH0pO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBQREZOb2RlU3RyZWFtRnNSYW5nZVJlYWRlciBleHRlbmRzIEJhc2VSYW5nZVJlYWRlciB7XG5cdCAgY29uc3RydWN0b3Ioc3RyZWFtLCBzdGFydCwgZW5kKSB7XG5cdCAgICBzdXBlcihzdHJlYW0pO1xuXHQgICAgbGV0IHBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodGhpcy5fdXJsLnBhdGgpO1xuXHQgICAgaWYgKGZpbGVVcmlSZWdleC50ZXN0KHRoaXMuX3VybC5ocmVmKSkge1xuXHQgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9zZXRSZWFkYWJsZVN0cmVhbShmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgsIHtcblx0ICAgICAgc3RhcnQsXG5cdCAgICAgIGVuZDogZW5kIC0gMVxuXHQgICAgfSkpO1xuXHQgIH1cblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiAyMiAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvciA9IGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3I7XG5cdGV4cG9ydHMuZXh0cmFjdEZpbGVuYW1lRnJvbUhlYWRlciA9IGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXI7XG5cdGV4cG9ydHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMgPSB2YWxpZGF0ZVJhbmdlUmVxdWVzdENhcGFiaWxpdGllcztcblx0ZXhwb3J0cy52YWxpZGF0ZVJlc3BvbnNlU3RhdHVzID0gdmFsaWRhdGVSZXNwb25zZVN0YXR1cztcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9jb250ZW50X2Rpc3Bvc2l0aW9uID0gX193X3BkZmpzX3JlcXVpcmVfXygyMyk7XG5cdHZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7XG5cdGZ1bmN0aW9uIHZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKHtcblx0ICBnZXRSZXNwb25zZUhlYWRlcixcblx0ICBpc0h0dHAsXG5cdCAgcmFuZ2VDaHVua1NpemUsXG5cdCAgZGlzYWJsZVJhbmdlXG5cdH0pIHtcblx0ICBjb25zdCByZXR1cm5WYWx1ZXMgPSB7XG5cdCAgICBhbGxvd1JhbmdlUmVxdWVzdHM6IGZhbHNlLFxuXHQgICAgc3VnZ2VzdGVkTGVuZ3RoOiB1bmRlZmluZWRcblx0ICB9O1xuXHQgIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KGdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1MZW5ndGhcIiksIDEwKTtcblx0ICBpZiAoIU51bWJlci5pc0ludGVnZXIobGVuZ3RoKSkge1xuXHQgICAgcmV0dXJuIHJldHVyblZhbHVlcztcblx0ICB9XG5cdCAgcmV0dXJuVmFsdWVzLnN1Z2dlc3RlZExlbmd0aCA9IGxlbmd0aDtcblx0ICBpZiAobGVuZ3RoIDw9IDIgKiByYW5nZUNodW5rU2l6ZSkge1xuXHQgICAgcmV0dXJuIHJldHVyblZhbHVlcztcblx0ICB9XG5cdCAgaWYgKGRpc2FibGVSYW5nZSB8fCAhaXNIdHRwKSB7XG5cdCAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuXHQgIH1cblx0ICBpZiAoZ2V0UmVzcG9uc2VIZWFkZXIoXCJBY2NlcHQtUmFuZ2VzXCIpICE9PSBcImJ5dGVzXCIpIHtcblx0ICAgIHJldHVybiByZXR1cm5WYWx1ZXM7XG5cdCAgfVxuXHQgIGNvbnN0IGNvbnRlbnRFbmNvZGluZyA9IGdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1FbmNvZGluZ1wiKSB8fCBcImlkZW50aXR5XCI7XG5cdCAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPT0gXCJpZGVudGl0eVwiKSB7XG5cdCAgICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuXHQgIH1cblx0ICByZXR1cm5WYWx1ZXMuYWxsb3dSYW5nZVJlcXVlc3RzID0gdHJ1ZTtcblx0ICByZXR1cm4gcmV0dXJuVmFsdWVzO1xuXHR9XG5cdGZ1bmN0aW9uIGV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIoZ2V0UmVzcG9uc2VIZWFkZXIpIHtcblx0ICBjb25zdCBjb250ZW50RGlzcG9zaXRpb24gPSBnZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtRGlzcG9zaXRpb25cIik7XG5cdCAgaWYgKGNvbnRlbnREaXNwb3NpdGlvbikge1xuXHQgICAgbGV0IGZpbGVuYW1lID0gKDAsIF9jb250ZW50X2Rpc3Bvc2l0aW9uLmdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcikoY29udGVudERpc3Bvc2l0aW9uKTtcblx0ICAgIGlmIChmaWxlbmFtZS5pbmNsdWRlcyhcIiVcIikpIHtcblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICBmaWxlbmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChmaWxlbmFtZSk7XG5cdCAgICAgIH0gY2F0Y2ggKGV4KSB7fVxuXHQgICAgfVxuXHQgICAgaWYgKCgwLCBfZGlzcGxheV91dGlscy5pc1BkZkZpbGUpKGZpbGVuYW1lKSkge1xuXHQgICAgICByZXR1cm4gZmlsZW5hbWU7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiBudWxsO1xuXHR9XG5cdGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3Ioc3RhdHVzLCB1cmwpIHtcblx0ICBpZiAoc3RhdHVzID09PSA0MDQgfHwgc3RhdHVzID09PSAwICYmIHVybC5zdGFydHNXaXRoKFwiZmlsZTpcIikpIHtcblx0ICAgIHJldHVybiBuZXcgX3V0aWwuTWlzc2luZ1BERkV4Y2VwdGlvbignTWlzc2luZyBQREYgXCInICsgdXJsICsgJ1wiLicpO1xuXHQgIH1cblx0ICByZXR1cm4gbmV3IF91dGlsLlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvbihgVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UgKCR7c3RhdHVzfSkgd2hpbGUgcmV0cmlldmluZyBQREYgXCIke3VybH1cIi5gLCBzdGF0dXMpO1xuXHR9XG5cdGZ1bmN0aW9uIHZhbGlkYXRlUmVzcG9uc2VTdGF0dXMoc3RhdHVzKSB7XG5cdCAgcmV0dXJuIHN0YXR1cyA9PT0gMjAwIHx8IHN0YXR1cyA9PT0gMjA2O1xuXHR9XG5cblx0LyoqKi8gfSksXG5cdC8qIDIzICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5nZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIgPSBnZXRGaWxlbmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXI7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdGZ1bmN0aW9uIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbkhlYWRlcihjb250ZW50RGlzcG9zaXRpb24pIHtcblx0ICBsZXQgbmVlZHNFbmNvZGluZ0ZpeHVwID0gdHJ1ZTtcblx0ICBsZXQgdG1wID0gdG9QYXJhbVJlZ0V4cChcImZpbGVuYW1lXFxcXCpcIiwgXCJpXCIpLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uKTtcblx0ICBpZiAodG1wKSB7XG5cdCAgICB0bXAgPSB0bXBbMV07XG5cdCAgICBsZXQgZmlsZW5hbWUgPSByZmMyNjE2dW5xdW90ZSh0bXApO1xuXHQgICAgZmlsZW5hbWUgPSB1bmVzY2FwZShmaWxlbmFtZSk7XG5cdCAgICBmaWxlbmFtZSA9IHJmYzU5ODdkZWNvZGUoZmlsZW5hbWUpO1xuXHQgICAgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKGZpbGVuYW1lKTtcblx0ICAgIHJldHVybiBmaXh1cEVuY29kaW5nKGZpbGVuYW1lKTtcblx0ICB9XG5cdCAgdG1wID0gcmZjMjIzMWdldHBhcmFtKGNvbnRlbnREaXNwb3NpdGlvbik7XG5cdCAgaWYgKHRtcCkge1xuXHQgICAgY29uc3QgZmlsZW5hbWUgPSByZmMyMDQ3ZGVjb2RlKHRtcCk7XG5cdCAgICByZXR1cm4gZml4dXBFbmNvZGluZyhmaWxlbmFtZSk7XG5cdCAgfVxuXHQgIHRtcCA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVwiLCBcImlcIikuZXhlYyhjb250ZW50RGlzcG9zaXRpb24pO1xuXHQgIGlmICh0bXApIHtcblx0ICAgIHRtcCA9IHRtcFsxXTtcblx0ICAgIGxldCBmaWxlbmFtZSA9IHJmYzI2MTZ1bnF1b3RlKHRtcCk7XG5cdCAgICBmaWxlbmFtZSA9IHJmYzIwNDdkZWNvZGUoZmlsZW5hbWUpO1xuXHQgICAgcmV0dXJuIGZpeHVwRW5jb2RpbmcoZmlsZW5hbWUpO1xuXHQgIH1cblx0ICBmdW5jdGlvbiB0b1BhcmFtUmVnRXhwKGF0dHJpYnV0ZVBhdHRlcm4sIGZsYWdzKSB7XG5cdCAgICByZXR1cm4gbmV3IFJlZ0V4cChcIig/Ol58OylcXFxccypcIiArIGF0dHJpYnV0ZVBhdHRlcm4gKyBcIlxcXFxzKj1cXFxccypcIiArIFwiKFwiICsgJ1teXCI7XFxcXHNdW147XFxcXHNdKicgKyBcInxcIiArICdcIig/OlteXCJcXFxcXFxcXF18XFxcXFxcXFxcIj8pK1wiPycgKyBcIilcIiwgZmxhZ3MpO1xuXHQgIH1cblx0ICBmdW5jdGlvbiB0ZXh0ZGVjb2RlKGVuY29kaW5nLCB2YWx1ZSkge1xuXHQgICAgaWYgKGVuY29kaW5nKSB7XG5cdCAgICAgIGlmICghL15bXFx4MDAtXFx4RkZdKyQvLnRlc3QodmFsdWUpKSB7XG5cdCAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICB9XG5cdCAgICAgIHRyeSB7XG5cdCAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywge1xuXHQgICAgICAgICAgZmF0YWw6IHRydWVcblx0ICAgICAgICB9KTtcblx0ICAgICAgICBjb25zdCBidWZmZXIgPSAoMCwgX3V0aWwuc3RyaW5nVG9CeXRlcykodmFsdWUpO1xuXHQgICAgICAgIHZhbHVlID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyKTtcblx0ICAgICAgICBuZWVkc0VuY29kaW5nRml4dXAgPSBmYWxzZTtcblx0ICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgIH1cblx0ICAgIHJldHVybiB2YWx1ZTtcblx0ICB9XG5cdCAgZnVuY3Rpb24gZml4dXBFbmNvZGluZyh2YWx1ZSkge1xuXHQgICAgaWYgKG5lZWRzRW5jb2RpbmdGaXh1cCAmJiAvW1xceDgwLVxceGZmXS8udGVzdCh2YWx1ZSkpIHtcblx0ICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKFwidXRmLThcIiwgdmFsdWUpO1xuXHQgICAgICBpZiAobmVlZHNFbmNvZGluZ0ZpeHVwKSB7XG5cdCAgICAgICAgdmFsdWUgPSB0ZXh0ZGVjb2RlKFwiaXNvLTg4NTktMVwiLCB2YWx1ZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiB2YWx1ZTtcblx0ICB9XG5cdCAgZnVuY3Rpb24gcmZjMjIzMWdldHBhcmFtKGNvbnRlbnREaXNwb3NpdGlvblN0cikge1xuXHQgICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuXHQgICAgbGV0IG1hdGNoO1xuXHQgICAgY29uc3QgaXRlciA9IHRvUGFyYW1SZWdFeHAoXCJmaWxlbmFtZVxcXFwqKCg/ITBcXFxcZClcXFxcZCspKFxcXFwqPylcIiwgXCJpZ1wiKTtcblx0ICAgIHdoaWxlICgobWF0Y2ggPSBpdGVyLmV4ZWMoY29udGVudERpc3Bvc2l0aW9uU3RyKSkgIT09IG51bGwpIHtcblx0ICAgICAgbGV0IFssIG4sIHF1b3QsIHBhcnRdID0gbWF0Y2g7XG5cdCAgICAgIG4gPSBwYXJzZUludChuLCAxMCk7XG5cdCAgICAgIGlmIChuIGluIG1hdGNoZXMpIHtcblx0ICAgICAgICBpZiAobiA9PT0gMCkge1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIG1hdGNoZXNbbl0gPSBbcXVvdCwgcGFydF07XG5cdCAgICB9XG5cdCAgICBjb25zdCBwYXJ0cyA9IFtdO1xuXHQgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBtYXRjaGVzLmxlbmd0aDsgKytuKSB7XG5cdCAgICAgIGlmICghKG4gaW4gbWF0Y2hlcykpIHtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgICBsZXQgW3F1b3QsIHBhcnRdID0gbWF0Y2hlc1tuXTtcblx0ICAgICAgcGFydCA9IHJmYzI2MTZ1bnF1b3RlKHBhcnQpO1xuXHQgICAgICBpZiAocXVvdCkge1xuXHQgICAgICAgIHBhcnQgPSB1bmVzY2FwZShwYXJ0KTtcblx0ICAgICAgICBpZiAobiA9PT0gMCkge1xuXHQgICAgICAgICAgcGFydCA9IHJmYzU5ODdkZWNvZGUocGFydCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHBhcnRzLnB1c2gocGFydCk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcGFydHMuam9pbihcIlwiKTtcblx0ICB9XG5cdCAgZnVuY3Rpb24gcmZjMjYxNnVucXVvdGUodmFsdWUpIHtcblx0ICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpKSB7XG5cdCAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc2xpY2UoMSkuc3BsaXQoJ1xcXFxcIicpO1xuXHQgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG5cdCAgICAgICAgY29uc3QgcXVvdGluZGV4ID0gcGFydHNbaV0uaW5kZXhPZignXCInKTtcblx0ICAgICAgICBpZiAocXVvdGluZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgcGFydHNbaV0gPSBwYXJ0c1tpXS5zbGljZSgwLCBxdW90aW5kZXgpO1xuXHQgICAgICAgICAgcGFydHMubGVuZ3RoID0gaSArIDE7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHBhcnRzW2ldID0gcGFydHNbaV0ucmVwbGFjZUFsbCgvXFxcXCguKS9nLCBcIiQxXCIpO1xuXHQgICAgICB9XG5cdCAgICAgIHZhbHVlID0gcGFydHMuam9pbignXCInKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB2YWx1ZTtcblx0ICB9XG5cdCAgZnVuY3Rpb24gcmZjNTk4N2RlY29kZShleHR2YWx1ZSkge1xuXHQgICAgY29uc3QgZW5jb2RpbmdlbmQgPSBleHR2YWx1ZS5pbmRleE9mKFwiJ1wiKTtcblx0ICAgIGlmIChlbmNvZGluZ2VuZCA9PT0gLTEpIHtcblx0ICAgICAgcmV0dXJuIGV4dHZhbHVlO1xuXHQgICAgfVxuXHQgICAgY29uc3QgZW5jb2RpbmcgPSBleHR2YWx1ZS5zbGljZSgwLCBlbmNvZGluZ2VuZCk7XG5cdCAgICBjb25zdCBsYW5ndmFsdWUgPSBleHR2YWx1ZS5zbGljZShlbmNvZGluZ2VuZCArIDEpO1xuXHQgICAgY29uc3QgdmFsdWUgPSBsYW5ndmFsdWUucmVwbGFjZSgvXlteJ10qJy8sIFwiXCIpO1xuXHQgICAgcmV0dXJuIHRleHRkZWNvZGUoZW5jb2RpbmcsIHZhbHVlKTtcblx0ICB9XG5cdCAgZnVuY3Rpb24gcmZjMjA0N2RlY29kZSh2YWx1ZSkge1xuXHQgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKFwiPT9cIikgfHwgL1tcXHgwMC1cXHgxOVxceDgwLVxceGZmXS8udGVzdCh2YWx1ZSkpIHtcblx0ICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoLz1cXD8oW1xcdy1dKilcXD8oW1FxQmJdKVxcPygoPzpbXj9dfFxcPyg/IT0pKSopXFw/PS9nLCBmdW5jdGlvbiAobWF0Y2hlcywgY2hhcnNldCwgZW5jb2RpbmcsIHRleHQpIHtcblx0ICAgICAgaWYgKGVuY29kaW5nID09PSBcInFcIiB8fCBlbmNvZGluZyA9PT0gXCJRXCIpIHtcblx0ICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKFwiX1wiLCBcIiBcIik7XG5cdCAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZUFsbCgvPShbMC05YS1mQS1GXXsyfSkvZywgZnVuY3Rpb24gKG1hdGNoLCBoZXgpIHtcblx0ICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleCwgMTYpKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTtcblx0ICAgICAgfVxuXHQgICAgICB0cnkge1xuXHQgICAgICAgIHRleHQgPSBhdG9iKHRleHQpO1xuXHQgICAgICB9IGNhdGNoIChlKSB7fVxuXHQgICAgICByZXR1cm4gdGV4dGRlY29kZShjaGFyc2V0LCB0ZXh0KTtcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZXR1cm4gXCJcIjtcblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiAyNCAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuUERGTmV0d29ya1N0cmVhbSA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9uZXR3b3JrX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygyMik7XG5cdGNvbnN0IE9LX1JFU1BPTlNFID0gMjAwO1xuXHRjb25zdCBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UgPSAyMDY7XG5cdGZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKHhocikge1xuXHQgIGNvbnN0IGRhdGEgPSB4aHIucmVzcG9uc2U7XG5cdCAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgICByZXR1cm4gZGF0YTtcblx0ICB9XG5cdCAgcmV0dXJuICgwLCBfdXRpbC5zdHJpbmdUb0J5dGVzKShkYXRhKS5idWZmZXI7XG5cdH1cblx0Y2xhc3MgTmV0d29ya01hbmFnZXIge1xuXHQgIGNvbnN0cnVjdG9yKHVybCwgYXJncyA9IHt9KSB7XG5cdCAgICB0aGlzLnVybCA9IHVybDtcblx0ICAgIHRoaXMuaXNIdHRwID0gL15odHRwcz86L2kudGVzdCh1cmwpO1xuXHQgICAgdGhpcy5odHRwSGVhZGVycyA9IHRoaXMuaXNIdHRwICYmIGFyZ3MuaHR0cEhlYWRlcnMgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gYXJncy53aXRoQ3JlZGVudGlhbHMgfHwgZmFsc2U7XG5cdCAgICB0aGlzLmN1cnJYaHJJZCA9IDA7XG5cdCAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgfVxuXHQgIHJlcXVlc3RSYW5nZShiZWdpbiwgZW5kLCBsaXN0ZW5lcnMpIHtcblx0ICAgIGNvbnN0IGFyZ3MgPSB7XG5cdCAgICAgIGJlZ2luLFxuXHQgICAgICBlbmRcblx0ICAgIH07XG5cdCAgICBmb3IgKGNvbnN0IHByb3AgaW4gbGlzdGVuZXJzKSB7XG5cdCAgICAgIGFyZ3NbcHJvcF0gPSBsaXN0ZW5lcnNbcHJvcF07XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGFyZ3MpO1xuXHQgIH1cblx0ICByZXF1ZXN0RnVsbChsaXN0ZW5lcnMpIHtcblx0ICAgIHJldHVybiB0aGlzLnJlcXVlc3QobGlzdGVuZXJzKTtcblx0ICB9XG5cdCAgcmVxdWVzdChhcmdzKSB7XG5cdCAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0ICAgIGNvbnN0IHhocklkID0gdGhpcy5jdXJyWGhySWQrKztcblx0ICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdID0ge1xuXHQgICAgICB4aHJcblx0ICAgIH07XG5cdCAgICB4aHIub3BlbihcIkdFVFwiLCB0aGlzLnVybCk7XG5cdCAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG5cdCAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuaHR0cEhlYWRlcnMpIHtcblx0ICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmh0dHBIZWFkZXJzW3Byb3BlcnR5XTtcblx0ICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihwcm9wZXJ0eSwgdmFsdWUpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuaXNIdHRwICYmIFwiYmVnaW5cIiBpbiBhcmdzICYmIFwiZW5kXCIgaW4gYXJncykge1xuXHQgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlJhbmdlXCIsIGBieXRlcz0ke2FyZ3MuYmVnaW59LSR7YXJncy5lbmQgLSAxfWApO1xuXHQgICAgICBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9IFBBUlRJQUxfQ09OVEVOVF9SRVNQT05TRTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHBlbmRpbmdSZXF1ZXN0LmV4cGVjdGVkU3RhdHVzID0gT0tfUkVTUE9OU0U7XG5cdCAgICB9XG5cdCAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuXHQgICAgaWYgKGFyZ3Mub25FcnJvcikge1xuXHQgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uIChldnQpIHtcblx0ICAgICAgICBhcmdzLm9uRXJyb3IoeGhyLnN0YXR1cyk7XG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5vblN0YXRlQ2hhbmdlLmJpbmQodGhpcywgeGhySWQpO1xuXHQgICAgeGhyLm9ucHJvZ3Jlc3MgPSB0aGlzLm9uUHJvZ3Jlc3MuYmluZCh0aGlzLCB4aHJJZCk7XG5cdCAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCA9IGFyZ3Mub25IZWFkZXJzUmVjZWl2ZWQ7XG5cdCAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUgPSBhcmdzLm9uRG9uZTtcblx0ICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRXJyb3IgPSBhcmdzLm9uRXJyb3I7XG5cdCAgICBwZW5kaW5nUmVxdWVzdC5vblByb2dyZXNzID0gYXJncy5vblByb2dyZXNzO1xuXHQgICAgeGhyLnNlbmQobnVsbCk7XG5cdCAgICByZXR1cm4geGhySWQ7XG5cdCAgfVxuXHQgIG9uUHJvZ3Jlc3MoeGhySWQsIGV2dCkge1xuXHQgICAgY29uc3QgcGVuZGluZ1JlcXVlc3QgPSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG5cdCAgICBpZiAoIXBlbmRpbmdSZXF1ZXN0KSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3M/LihldnQpO1xuXHQgIH1cblx0ICBvblN0YXRlQ2hhbmdlKHhocklkLCBldnQpIHtcblx0ICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdO1xuXHQgICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCB4aHIgPSBwZW5kaW5nUmVxdWVzdC54aHI7XG5cdCAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPj0gMiAmJiBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCkge1xuXHQgICAgICBwZW5kaW5nUmVxdWVzdC5vbkhlYWRlcnNSZWNlaXZlZCgpO1xuXHQgICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3Qub25IZWFkZXJzUmVjZWl2ZWQ7XG5cdCAgICB9XG5cdCAgICBpZiAoeGhyLnJlYWR5U3RhdGUgIT09IDQpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKCEoeGhySWQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHMpKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG5cdCAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMCAmJiB0aGlzLmlzSHR0cCkge1xuXHQgICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yPy4oeGhyLnN0YXR1cyk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHhoclN0YXR1cyA9IHhoci5zdGF0dXMgfHwgT0tfUkVTUE9OU0U7XG5cdCAgICBjb25zdCBva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0ID0geGhyU3RhdHVzID09PSBPS19SRVNQT05TRSAmJiBwZW5kaW5nUmVxdWVzdC5leHBlY3RlZFN0YXR1cyA9PT0gUEFSVElBTF9DT05URU5UX1JFU1BPTlNFO1xuXHQgICAgaWYgKCFva19yZXNwb25zZV9vbl9yYW5nZV9yZXF1ZXN0ICYmIHhoclN0YXR1cyAhPT0gcGVuZGluZ1JlcXVlc3QuZXhwZWN0ZWRTdGF0dXMpIHtcblx0ICAgICAgcGVuZGluZ1JlcXVlc3Qub25FcnJvcj8uKHhoci5zdGF0dXMpO1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBjaHVuayA9IGdldEFycmF5QnVmZmVyKHhocik7XG5cdCAgICBpZiAoeGhyU3RhdHVzID09PSBQQVJUSUFMX0NPTlRFTlRfUkVTUE9OU0UpIHtcblx0ICAgICAgY29uc3QgcmFuZ2VIZWFkZXIgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDb250ZW50LVJhbmdlXCIpO1xuXHQgICAgICBjb25zdCBtYXRjaGVzID0gL2J5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKykvLmV4ZWMocmFuZ2VIZWFkZXIpO1xuXHQgICAgICBwZW5kaW5nUmVxdWVzdC5vbkRvbmUoe1xuXHQgICAgICAgIGJlZ2luOiBwYXJzZUludChtYXRjaGVzWzFdLCAxMCksXG5cdCAgICAgICAgY2h1bmtcblx0ICAgICAgfSk7XG5cdCAgICB9IGVsc2UgaWYgKGNodW5rKSB7XG5cdCAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uRG9uZSh7XG5cdCAgICAgICAgYmVnaW46IDAsXG5cdCAgICAgICAgY2h1bmtcblx0ICAgICAgfSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBwZW5kaW5nUmVxdWVzdC5vbkVycm9yPy4oeGhyLnN0YXR1cyk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldFJlcXVlc3RYaHIoeGhySWQpIHtcblx0ICAgIHJldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF0ueGhyO1xuXHQgIH1cblx0ICBpc1BlbmRpbmdSZXF1ZXN0KHhocklkKSB7XG5cdCAgICByZXR1cm4geGhySWQgaW4gdGhpcy5wZW5kaW5nUmVxdWVzdHM7XG5cdCAgfVxuXHQgIGFib3J0UmVxdWVzdCh4aHJJZCkge1xuXHQgICAgY29uc3QgeGhyID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbeGhySWRdLnhocjtcblx0ICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1t4aHJJZF07XG5cdCAgICB4aHIuYWJvcnQoKTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUERGTmV0d29ya1N0cmVhbSB7XG5cdCAgY29uc3RydWN0b3Ioc291cmNlKSB7XG5cdCAgICB0aGlzLl9zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICB0aGlzLl9tYW5hZ2VyID0gbmV3IE5ldHdvcmtNYW5hZ2VyKHNvdXJjZS51cmwsIHtcblx0ICAgICAgaHR0cEhlYWRlcnM6IHNvdXJjZS5odHRwSGVhZGVycyxcblx0ICAgICAgd2l0aENyZWRlbnRpYWxzOiBzb3VyY2Uud2l0aENyZWRlbnRpYWxzXG5cdCAgICB9KTtcblx0ICAgIHRoaXMuX3JhbmdlQ2h1bmtTaXplID0gc291cmNlLnJhbmdlQ2h1bmtTaXplO1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuXHQgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdO1xuXHQgIH1cblx0ICBfb25SYW5nZVJlcXVlc3RSZWFkZXJDbG9zZWQocmVhZGVyKSB7XG5cdCAgICBjb25zdCBpID0gdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5pbmRleE9mKHJlYWRlcik7XG5cdCAgICBpZiAoaSA+PSAwKSB7XG5cdCAgICAgIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc3BsaWNlKGksIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBnZXRGdWxsUmVhZGVyKCkge1xuXHQgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERk5ldHdvcmtTdHJlYW0uZ2V0RnVsbFJlYWRlciBjYW4gb25seSBiZSBjYWxsZWQgb25jZS5cIik7XG5cdCAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG5ldyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgdGhpcy5fc291cmNlKTtcblx0ICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcjtcblx0ICB9XG5cdCAgZ2V0UmFuZ2VSZWFkZXIoYmVnaW4sIGVuZCkge1xuXHQgICAgY29uc3QgcmVhZGVyID0gbmV3IFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIodGhpcy5fbWFuYWdlciwgYmVnaW4sIGVuZCk7XG5cdCAgICByZWFkZXIub25DbG9zZWQgPSB0aGlzLl9vblJhbmdlUmVxdWVzdFJlYWRlckNsb3NlZC5iaW5kKHRoaXMpO1xuXHQgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5wdXNoKHJlYWRlcik7XG5cdCAgICByZXR1cm4gcmVhZGVyO1xuXHQgIH1cblx0ICBjYW5jZWxBbGxSZXF1ZXN0cyhyZWFzb24pIHtcblx0ICAgIHRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyPy5jYW5jZWwocmVhc29uKTtcblx0ICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHRoaXMuX3JhbmdlUmVxdWVzdFJlYWRlcnMuc2xpY2UoMCkpIHtcblx0ICAgICAgcmVhZGVyLmNhbmNlbChyZWFzb24pO1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRleHBvcnRzLlBERk5ldHdvcmtTdHJlYW0gPSBQREZOZXR3b3JrU3RyZWFtO1xuXHRjbGFzcyBQREZOZXR3b3JrU3RyZWFtRnVsbFJlcXVlc3RSZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKG1hbmFnZXIsIHNvdXJjZSkge1xuXHQgICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG5cdCAgICBjb25zdCBhcmdzID0ge1xuXHQgICAgICBvbkhlYWRlcnNSZWNlaXZlZDogdGhpcy5fb25IZWFkZXJzUmVjZWl2ZWQuYmluZCh0aGlzKSxcblx0ICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxcblx0ICAgICAgb25FcnJvcjogdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpLFxuXHQgICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcylcblx0ICAgIH07XG5cdCAgICB0aGlzLl91cmwgPSBzb3VyY2UudXJsO1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RJZCA9IG1hbmFnZXIucmVxdWVzdEZ1bGwoYXJncyk7XG5cdCAgICB0aGlzLl9oZWFkZXJzUmVjZWl2ZWRDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSBzb3VyY2UuZGlzYWJsZVJhbmdlIHx8IGZhbHNlO1xuXHQgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cdCAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcblx0ICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuXHQgICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSBmYWxzZTtcblx0ICAgIHRoaXMuX2lzUmFuZ2VTdXBwb3J0ZWQgPSBmYWxzZTtcblx0ICAgIHRoaXMuX2NhY2hlZENodW5rcyA9IFtdO1xuXHQgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcblx0ICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcblx0ICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdW5kZWZpbmVkO1xuXHQgICAgdGhpcy5fZmlsZW5hbWUgPSBudWxsO1xuXHQgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcblx0ICB9XG5cdCAgX29uSGVhZGVyc1JlY2VpdmVkKCkge1xuXHQgICAgY29uc3QgZnVsbFJlcXVlc3RYaHJJZCA9IHRoaXMuX2Z1bGxSZXF1ZXN0SWQ7XG5cdCAgICBjb25zdCBmdWxsUmVxdWVzdFhociA9IHRoaXMuX21hbmFnZXIuZ2V0UmVxdWVzdFhocihmdWxsUmVxdWVzdFhocklkKTtcblx0ICAgIGNvbnN0IGdldFJlc3BvbnNlSGVhZGVyID0gbmFtZSA9PiB7XG5cdCAgICAgIHJldHVybiBmdWxsUmVxdWVzdFhoci5nZXRSZXNwb25zZUhlYWRlcihuYW1lKTtcblx0ICAgIH07XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGFsbG93UmFuZ2VSZXF1ZXN0cyxcblx0ICAgICAgc3VnZ2VzdGVkTGVuZ3RoXG5cdCAgICB9ID0gKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmFuZ2VSZXF1ZXN0Q2FwYWJpbGl0aWVzKSh7XG5cdCAgICAgIGdldFJlc3BvbnNlSGVhZGVyLFxuXHQgICAgICBpc0h0dHA6IHRoaXMuX21hbmFnZXIuaXNIdHRwLFxuXHQgICAgICByYW5nZUNodW5rU2l6ZTogdGhpcy5fcmFuZ2VDaHVua1NpemUsXG5cdCAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG5cdCAgICB9KTtcblx0ICAgIGlmIChhbGxvd1JhbmdlUmVxdWVzdHMpIHtcblx0ICAgICAgdGhpcy5faXNSYW5nZVN1cHBvcnRlZCA9IHRydWU7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG5cdCAgICB0aGlzLl9maWxlbmFtZSA9ICgwLCBfbmV0d29ya191dGlscy5leHRyYWN0RmlsZW5hbWVGcm9tSGVhZGVyKShnZXRSZXNwb25zZUhlYWRlcik7XG5cdCAgICBpZiAodGhpcy5faXNSYW5nZVN1cHBvcnRlZCkge1xuXHQgICAgICB0aGlzLl9tYW5hZ2VyLmFib3J0UmVxdWVzdChmdWxsUmVxdWVzdFhocklkKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX2hlYWRlcnNSZWNlaXZlZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgIH1cblx0ICBfb25Eb25lKGRhdGEpIHtcblx0ICAgIGlmIChkYXRhKSB7XG5cdCAgICAgIGlmICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuXHQgICAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgICAgdmFsdWU6IGRhdGEuY2h1bmssXG5cdCAgICAgICAgICBkb25lOiBmYWxzZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuX2NhY2hlZENodW5rcy5wdXNoKGRhdGEuY2h1bmspO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLl9kb25lID0gdHJ1ZTtcblx0ICAgIGlmICh0aGlzLl9jYWNoZWRDaHVua3MubGVuZ3RoID4gMCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG5cdCAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG5cdCAgfVxuXHQgIF9vbkVycm9yKHN0YXR1cykge1xuXHQgICAgdGhpcy5fc3RvcmVkRXJyb3IgPSAoMCwgX25ldHdvcmtfdXRpbHMuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikoc3RhdHVzLCB0aGlzLl91cmwpO1xuXHQgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QodGhpcy5fc3RvcmVkRXJyb3IpO1xuXHQgICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuXHQgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZWplY3QodGhpcy5fc3RvcmVkRXJyb3IpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcblx0ICAgIHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPSAwO1xuXHQgIH1cblx0ICBfb25Qcm9ncmVzcyhldnQpIHtcblx0ICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcblx0ICAgICAgbG9hZGVkOiBldnQubG9hZGVkLFxuXHQgICAgICB0b3RhbDogZXZ0Lmxlbmd0aENvbXB1dGFibGUgPyBldnQudG90YWwgOiB0aGlzLl9jb250ZW50TGVuZ3RoXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgZ2V0IGZpbGVuYW1lKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2ZpbGVuYW1lO1xuXHQgIH1cblx0ICBnZXQgaXNSYW5nZVN1cHBvcnRlZCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkO1xuXHQgIH1cblx0ICBnZXQgaXNTdHJlYW1pbmdTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQ7XG5cdCAgfVxuXHQgIGdldCBjb250ZW50TGVuZ3RoKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRMZW5ndGg7XG5cdCAgfVxuXHQgIGdldCBoZWFkZXJzUmVhZHkoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5wcm9taXNlO1xuXHQgIH1cblx0ICBhc3luYyByZWFkKCkge1xuXHQgICAgaWYgKHRoaXMuX3N0b3JlZEVycm9yKSB7XG5cdCAgICAgIHRocm93IHRoaXMuX3N0b3JlZEVycm9yO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuX2NhY2hlZENodW5rcy5sZW5ndGggPiAwKSB7XG5cdCAgICAgIGNvbnN0IGNodW5rID0gdGhpcy5fY2FjaGVkQ2h1bmtzLnNoaWZ0KCk7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdmFsdWU6IGNodW5rLFxuXHQgICAgICAgIGRvbmU6IGZhbHNlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fZG9uZSkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuXHQgICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIGNhbmNlbChyZWFzb24pIHtcblx0ICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuXHQgICAgdGhpcy5faGVhZGVyc1JlY2VpdmVkQ2FwYWJpbGl0eS5yZWplY3QocmVhc29uKTtcblx0ICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcblx0ICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVzb2x2ZSh7XG5cdCAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcblx0ICAgICAgICBkb25lOiB0cnVlXG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fcmVxdWVzdHMubGVuZ3RoID0gMDtcblx0ICAgIGlmICh0aGlzLl9tYW5hZ2VyLmlzUGVuZGluZ1JlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCkpIHtcblx0ICAgICAgdGhpcy5fbWFuYWdlci5hYm9ydFJlcXVlc3QodGhpcy5fZnVsbFJlcXVlc3RJZCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlciA9IG51bGw7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFBERk5ldHdvcmtTdHJlYW1SYW5nZVJlcXVlc3RSZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKG1hbmFnZXIsIGJlZ2luLCBlbmQpIHtcblx0ICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuXHQgICAgY29uc3QgYXJncyA9IHtcblx0ICAgICAgb25Eb25lOiB0aGlzLl9vbkRvbmUuYmluZCh0aGlzKSxcblx0ICAgICAgb25FcnJvcjogdGhpcy5fb25FcnJvci5iaW5kKHRoaXMpLFxuXHQgICAgICBvblByb2dyZXNzOiB0aGlzLl9vblByb2dyZXNzLmJpbmQodGhpcylcblx0ICAgIH07XG5cdCAgICB0aGlzLl91cmwgPSBtYW5hZ2VyLnVybDtcblx0ICAgIHRoaXMuX3JlcXVlc3RJZCA9IG1hbmFnZXIucmVxdWVzdFJhbmdlKGJlZ2luLCBlbmQsIGFyZ3MpO1xuXHQgICAgdGhpcy5fcmVxdWVzdHMgPSBbXTtcblx0ICAgIHRoaXMuX3F1ZXVlZENodW5rID0gbnVsbDtcblx0ICAgIHRoaXMuX2RvbmUgPSBmYWxzZTtcblx0ICAgIHRoaXMuX3N0b3JlZEVycm9yID0gdW5kZWZpbmVkO1xuXHQgICAgdGhpcy5vblByb2dyZXNzID0gbnVsbDtcblx0ICAgIHRoaXMub25DbG9zZWQgPSBudWxsO1xuXHQgIH1cblx0ICBfY2xvc2UoKSB7XG5cdCAgICB0aGlzLm9uQ2xvc2VkPy4odGhpcyk7XG5cdCAgfVxuXHQgIF9vbkRvbmUoZGF0YSkge1xuXHQgICAgY29uc3QgY2h1bmsgPSBkYXRhLmNodW5rO1xuXHQgICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSB0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpO1xuXHQgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICB2YWx1ZTogY2h1bmssXG5cdCAgICAgICAgZG9uZTogZmFsc2Vcblx0ICAgICAgfSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IGNodW5rO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fZG9uZSA9IHRydWU7XG5cdCAgICBmb3IgKGNvbnN0IHJlcXVlc3RDYXBhYmlsaXR5IG9mIHRoaXMuX3JlcXVlc3RzKSB7XG5cdCAgICAgIHJlcXVlc3RDYXBhYmlsaXR5LnJlc29sdmUoe1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG5cdCAgICB0aGlzLl9jbG9zZSgpO1xuXHQgIH1cblx0ICBfb25FcnJvcihzdGF0dXMpIHtcblx0ICAgIHRoaXMuX3N0b3JlZEVycm9yID0gKDAsIF9uZXR3b3JrX3V0aWxzLmNyZWF0ZVJlc3BvbnNlU3RhdHVzRXJyb3IpKHN0YXR1cywgdGhpcy5fdXJsKTtcblx0ICAgIGZvciAoY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgb2YgdGhpcy5fcmVxdWVzdHMpIHtcblx0ICAgICAgcmVxdWVzdENhcGFiaWxpdHkucmVqZWN0KHRoaXMuX3N0b3JlZEVycm9yKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9IDA7XG5cdCAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG5cdCAgfVxuXHQgIF9vblByb2dyZXNzKGV2dCkge1xuXHQgICAgaWYgKCF0aGlzLmlzU3RyZWFtaW5nU3VwcG9ydGVkKSB7XG5cdCAgICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcblx0ICAgICAgICBsb2FkZWQ6IGV2dC5sb2FkZWRcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdCAgYXN5bmMgcmVhZCgpIHtcblx0ICAgIGlmICh0aGlzLl9zdG9yZWRFcnJvcikge1xuXHQgICAgICB0aHJvdyB0aGlzLl9zdG9yZWRFcnJvcjtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl9xdWV1ZWRDaHVuayAhPT0gbnVsbCkge1xuXHQgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX3F1ZXVlZENodW5rO1xuXHQgICAgICB0aGlzLl9xdWV1ZWRDaHVuayA9IG51bGw7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdmFsdWU6IGNodW5rLFxuXHQgICAgICAgIGRvbmU6IGZhbHNlXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fZG9uZSkge1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG5cdCAgICAgICAgZG9uZTogdHJ1ZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgY29uc3QgcmVxdWVzdENhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdENhcGFiaWxpdHkpO1xuXHQgICAgcmV0dXJuIHJlcXVlc3RDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIGNhbmNlbChyZWFzb24pIHtcblx0ICAgIHRoaXMuX2RvbmUgPSB0cnVlO1xuXHQgICAgZm9yIChjb25zdCByZXF1ZXN0Q2FwYWJpbGl0eSBvZiB0aGlzLl9yZXF1ZXN0cykge1xuXHQgICAgICByZXF1ZXN0Q2FwYWJpbGl0eS5yZXNvbHZlKHtcblx0ICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuXHQgICAgICAgIGRvbmU6IHRydWVcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPSAwO1xuXHQgICAgaWYgKHRoaXMuX21hbmFnZXIuaXNQZW5kaW5nUmVxdWVzdCh0aGlzLl9yZXF1ZXN0SWQpKSB7XG5cdCAgICAgIHRoaXMuX21hbmFnZXIuYWJvcnRSZXF1ZXN0KHRoaXMuX3JlcXVlc3RJZCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9jbG9zZSgpO1xuXHQgIH1cblx0fVxuXG5cdC8qKiovIH0pLFxuXHQvKiAyNSAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuUERGRmV0Y2hTdHJlYW0gPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfbmV0d29ya191dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMjIpO1xuXHRmdW5jdGlvbiBjcmVhdGVGZXRjaE9wdGlvbnMoaGVhZGVycywgd2l0aENyZWRlbnRpYWxzLCBhYm9ydENvbnRyb2xsZXIpIHtcblx0ICByZXR1cm4ge1xuXHQgICAgbWV0aG9kOiBcIkdFVFwiLFxuXHQgICAgaGVhZGVycyxcblx0ICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcblx0ICAgIG1vZGU6IFwiY29yc1wiLFxuXHQgICAgY3JlZGVudGlhbHM6IHdpdGhDcmVkZW50aWFscyA/IFwiaW5jbHVkZVwiIDogXCJzYW1lLW9yaWdpblwiLFxuXHQgICAgcmVkaXJlY3Q6IFwiZm9sbG93XCJcblx0ICB9O1xuXHR9XG5cdGZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnMoaHR0cEhlYWRlcnMpIHtcblx0ICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcblx0ICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGh0dHBIZWFkZXJzKSB7XG5cdCAgICBjb25zdCB2YWx1ZSA9IGh0dHBIZWFkZXJzW3Byb3BlcnR5XTtcblx0ICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgIGNvbnRpbnVlO1xuXHQgICAgfVxuXHQgICAgaGVhZGVycy5hcHBlbmQocHJvcGVydHksIHZhbHVlKTtcblx0ICB9XG5cdCAgcmV0dXJuIGhlYWRlcnM7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0QXJyYXlCdWZmZXIodmFsKSB7XG5cdCAgaWYgKHZhbCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcblx0ICAgIHJldHVybiB2YWwuYnVmZmVyO1xuXHQgIH1cblx0ICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcblx0ICAgIHJldHVybiB2YWw7XG5cdCAgfVxuXHQgICgwLCBfdXRpbC53YXJuKShgZ2V0QXJyYXlCdWZmZXIgLSB1bmV4cGVjdGVkIGRhdGEgZm9ybWF0OiAke3ZhbH1gKTtcblx0ICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmFsKS5idWZmZXI7XG5cdH1cblx0Y2xhc3MgUERGRmV0Y2hTdHJlYW0ge1xuXHQgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuXHQgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICB0aGlzLmlzSHR0cCA9IC9eaHR0cHM/Oi9pLnRlc3Qoc291cmNlLnVybCk7XG5cdCAgICB0aGlzLmh0dHBIZWFkZXJzID0gdGhpcy5pc0h0dHAgJiYgc291cmNlLmh0dHBIZWFkZXJzIHx8IHt9O1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBudWxsO1xuXHQgICAgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycyA9IFtdO1xuXHQgIH1cblx0ICBnZXQgX3Byb2dyZXNzaXZlRGF0YUxlbmd0aCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9mdWxsUmVxdWVzdFJlYWRlcj8uX2xvYWRlZCA/PyAwO1xuXHQgIH1cblx0ICBnZXRGdWxsUmVhZGVyKCkge1xuXHQgICAgKDAsIF91dGlsLmFzc2VydCkoIXRoaXMuX2Z1bGxSZXF1ZXN0UmVhZGVyLCBcIlBERkZldGNoU3RyZWFtLmdldEZ1bGxSZWFkZXIgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuXCIpO1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXIgPSBuZXcgUERGRmV0Y2hTdHJlYW1SZWFkZXIodGhpcyk7XG5cdCAgICByZXR1cm4gdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI7XG5cdCAgfVxuXHQgIGdldFJhbmdlUmVhZGVyKGJlZ2luLCBlbmQpIHtcblx0ICAgIGlmIChlbmQgPD0gdGhpcy5fcHJvZ3Jlc3NpdmVEYXRhTGVuZ3RoKSB7XG5cdCAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcmVhZGVyID0gbmV3IFBERkZldGNoU3RyZWFtUmFuZ2VSZWFkZXIodGhpcywgYmVnaW4sIGVuZCk7XG5cdCAgICB0aGlzLl9yYW5nZVJlcXVlc3RSZWFkZXJzLnB1c2gocmVhZGVyKTtcblx0ICAgIHJldHVybiByZWFkZXI7XG5cdCAgfVxuXHQgIGNhbmNlbEFsbFJlcXVlc3RzKHJlYXNvbikge1xuXHQgICAgdGhpcy5fZnVsbFJlcXVlc3RSZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuXHQgICAgZm9yIChjb25zdCByZWFkZXIgb2YgdGhpcy5fcmFuZ2VSZXF1ZXN0UmVhZGVycy5zbGljZSgwKSkge1xuXHQgICAgICByZWFkZXIuY2FuY2VsKHJlYXNvbik7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuUERGRmV0Y2hTdHJlYW0gPSBQREZGZXRjaFN0cmVhbTtcblx0Y2xhc3MgUERGRmV0Y2hTdHJlYW1SZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuXHQgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuXHQgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcblx0ICAgIHRoaXMuX2xvYWRlZCA9IDA7XG5cdCAgICB0aGlzLl9maWxlbmFtZSA9IG51bGw7XG5cdCAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuXHQgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcblx0ICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBzb3VyY2UubGVuZ3RoO1xuXHQgICAgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIHRoaXMuX2Rpc2FibGVSYW5nZSA9IHNvdXJjZS5kaXNhYmxlUmFuZ2UgfHwgZmFsc2U7XG5cdCAgICB0aGlzLl9yYW5nZUNodW5rU2l6ZSA9IHNvdXJjZS5yYW5nZUNodW5rU2l6ZTtcblx0ICAgIGlmICghdGhpcy5fcmFuZ2VDaHVua1NpemUgJiYgIXRoaXMuX2Rpc2FibGVSYW5nZSkge1xuXHQgICAgICB0aGlzLl9kaXNhYmxlUmFuZ2UgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXHQgICAgdGhpcy5faXNTdHJlYW1pbmdTdXBwb3J0ZWQgPSAhc291cmNlLmRpc2FibGVTdHJlYW07XG5cdCAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gIXNvdXJjZS5kaXNhYmxlUmFuZ2U7XG5cdCAgICB0aGlzLl9oZWFkZXJzID0gY3JlYXRlSGVhZGVycyh0aGlzLl9zdHJlYW0uaHR0cEhlYWRlcnMpO1xuXHQgICAgY29uc3QgdXJsID0gc291cmNlLnVybDtcblx0ICAgIGZldGNoKHVybCwgY3JlYXRlRmV0Y2hPcHRpb25zKHRoaXMuX2hlYWRlcnMsIHRoaXMuX3dpdGhDcmVkZW50aWFscywgdGhpcy5fYWJvcnRDb250cm9sbGVyKSkudGhlbihyZXNwb25zZSA9PiB7XG5cdCAgICAgIGlmICghKDAsIF9uZXR3b3JrX3V0aWxzLnZhbGlkYXRlUmVzcG9uc2VTdGF0dXMpKHJlc3BvbnNlLnN0YXR1cykpIHtcblx0ICAgICAgICB0aHJvdyAoMCwgX25ldHdvcmtfdXRpbHMuY3JlYXRlUmVzcG9uc2VTdGF0dXNFcnJvcikocmVzcG9uc2Uuc3RhdHVzLCB1cmwpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX3JlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG5cdCAgICAgIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgICAgY29uc3QgZ2V0UmVzcG9uc2VIZWFkZXIgPSBuYW1lID0+IHtcblx0ICAgICAgICByZXR1cm4gcmVzcG9uc2UuaGVhZGVycy5nZXQobmFtZSk7XG5cdCAgICAgIH07XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBhbGxvd1JhbmdlUmVxdWVzdHMsXG5cdCAgICAgICAgc3VnZ2VzdGVkTGVuZ3RoXG5cdCAgICAgIH0gPSAoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSYW5nZVJlcXVlc3RDYXBhYmlsaXRpZXMpKHtcblx0ICAgICAgICBnZXRSZXNwb25zZUhlYWRlcixcblx0ICAgICAgICBpc0h0dHA6IHRoaXMuX3N0cmVhbS5pc0h0dHAsXG5cdCAgICAgICAgcmFuZ2VDaHVua1NpemU6IHRoaXMuX3JhbmdlQ2h1bmtTaXplLFxuXHQgICAgICAgIGRpc2FibGVSYW5nZTogdGhpcy5fZGlzYWJsZVJhbmdlXG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkID0gYWxsb3dSYW5nZVJlcXVlc3RzO1xuXHQgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gc3VnZ2VzdGVkTGVuZ3RoIHx8IHRoaXMuX2NvbnRlbnRMZW5ndGg7XG5cdCAgICAgIHRoaXMuX2ZpbGVuYW1lID0gKDAsIF9uZXR3b3JrX3V0aWxzLmV4dHJhY3RGaWxlbmFtZUZyb21IZWFkZXIpKGdldFJlc3BvbnNlSGVhZGVyKTtcblx0ICAgICAgaWYgKCF0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCAmJiB0aGlzLl9pc1JhbmdlU3VwcG9ydGVkKSB7XG5cdCAgICAgICAgdGhpcy5jYW5jZWwobmV3IF91dGlsLkFib3J0RXhjZXB0aW9uKFwiU3RyZWFtaW5nIGlzIGRpc2FibGVkLlwiKSk7XG5cdCAgICAgIH1cblx0ICAgIH0pLmNhdGNoKHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnJlamVjdCk7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBudWxsO1xuXHQgIH1cblx0ICBnZXQgaGVhZGVyc1JlYWR5KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIGdldCBmaWxlbmFtZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9maWxlbmFtZTtcblx0ICB9XG5cdCAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fY29udGVudExlbmd0aDtcblx0ICB9XG5cdCAgZ2V0IGlzUmFuZ2VTdXBwb3J0ZWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy5faXNSYW5nZVN1cHBvcnRlZDtcblx0ICB9XG5cdCAgZ2V0IGlzU3RyZWFtaW5nU3VwcG9ydGVkKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuX2lzU3RyZWFtaW5nU3VwcG9ydGVkO1xuXHQgIH1cblx0ICBhc3luYyByZWFkKCkge1xuXHQgICAgYXdhaXQgdGhpcy5faGVhZGVyc0NhcGFiaWxpdHkucHJvbWlzZTtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgdmFsdWUsXG5cdCAgICAgIGRvbmVcblx0ICAgIH0gPSBhd2FpdCB0aGlzLl9yZWFkZXIucmVhZCgpO1xuXHQgICAgaWYgKGRvbmUpIHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICB2YWx1ZSxcblx0ICAgICAgICBkb25lXG5cdCAgICAgIH07XG5cdCAgICB9XG5cdCAgICB0aGlzLl9sb2FkZWQgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcblx0ICAgIHRoaXMub25Qcm9ncmVzcz8uKHtcblx0ICAgICAgbG9hZGVkOiB0aGlzLl9sb2FkZWQsXG5cdCAgICAgIHRvdGFsOiB0aGlzLl9jb250ZW50TGVuZ3RoXG5cdCAgICB9KTtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih2YWx1ZSksXG5cdCAgICAgIGRvbmU6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH1cblx0ICBjYW5jZWwocmVhc29uKSB7XG5cdCAgICB0aGlzLl9yZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuXHQgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFBERkZldGNoU3RyZWFtUmFuZ2VSZWFkZXIge1xuXHQgIGNvbnN0cnVjdG9yKHN0cmVhbSwgYmVnaW4sIGVuZCkge1xuXHQgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuXHQgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcblx0ICAgIHRoaXMuX2xvYWRlZCA9IDA7XG5cdCAgICBjb25zdCBzb3VyY2UgPSBzdHJlYW0uc291cmNlO1xuXHQgICAgdGhpcy5fd2l0aENyZWRlbnRpYWxzID0gc291cmNlLndpdGhDcmVkZW50aWFscyB8fCBmYWxzZTtcblx0ICAgIHRoaXMuX3JlYWRDYXBhYmlsaXR5ID0gbmV3IF91dGlsLlByb21pc2VDYXBhYmlsaXR5KCk7XG5cdCAgICB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZCA9ICFzb3VyY2UuZGlzYWJsZVN0cmVhbTtcblx0ICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblx0ICAgIHRoaXMuX2hlYWRlcnMgPSBjcmVhdGVIZWFkZXJzKHRoaXMuX3N0cmVhbS5odHRwSGVhZGVycyk7XG5cdCAgICB0aGlzLl9oZWFkZXJzLmFwcGVuZChcIlJhbmdlXCIsIGBieXRlcz0ke2JlZ2lufS0ke2VuZCAtIDF9YCk7XG5cdCAgICBjb25zdCB1cmwgPSBzb3VyY2UudXJsO1xuXHQgICAgZmV0Y2godXJsLCBjcmVhdGVGZXRjaE9wdGlvbnModGhpcy5faGVhZGVycywgdGhpcy5fd2l0aENyZWRlbnRpYWxzLCB0aGlzLl9hYm9ydENvbnRyb2xsZXIpKS50aGVuKHJlc3BvbnNlID0+IHtcblx0ICAgICAgaWYgKCEoMCwgX25ldHdvcmtfdXRpbHMudmFsaWRhdGVSZXNwb25zZVN0YXR1cykocmVzcG9uc2Uuc3RhdHVzKSkge1xuXHQgICAgICAgIHRocm93ICgwLCBfbmV0d29ya191dGlscy5jcmVhdGVSZXNwb25zZVN0YXR1c0Vycm9yKShyZXNwb25zZS5zdGF0dXMsIHVybCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fcmVhZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgICAgICB0aGlzLl9yZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuXHQgICAgfSkuY2F0Y2godGhpcy5fcmVhZENhcGFiaWxpdHkucmVqZWN0KTtcblx0ICAgIHRoaXMub25Qcm9ncmVzcyA9IG51bGw7XG5cdCAgfVxuXHQgIGdldCBpc1N0cmVhbWluZ1N1cHBvcnRlZCgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9pc1N0cmVhbWluZ1N1cHBvcnRlZDtcblx0ICB9XG5cdCAgYXN5bmMgcmVhZCgpIHtcblx0ICAgIGF3YWl0IHRoaXMuX3JlYWRDYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHZhbHVlLFxuXHQgICAgICBkb25lXG5cdCAgICB9ID0gYXdhaXQgdGhpcy5fcmVhZGVyLnJlYWQoKTtcblx0ICAgIGlmIChkb25lKSB7XG5cdCAgICAgIHJldHVybiB7XG5cdCAgICAgICAgdmFsdWUsXG5cdCAgICAgICAgZG9uZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fbG9hZGVkICs9IHZhbHVlLmJ5dGVMZW5ndGg7XG5cdCAgICB0aGlzLm9uUHJvZ3Jlc3M/Lih7XG5cdCAgICAgIGxvYWRlZDogdGhpcy5fbG9hZGVkXG5cdCAgICB9KTtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHZhbHVlOiBnZXRBcnJheUJ1ZmZlcih2YWx1ZSksXG5cdCAgICAgIGRvbmU6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH1cblx0ICBjYW5jZWwocmVhc29uKSB7XG5cdCAgICB0aGlzLl9yZWFkZXI/LmNhbmNlbChyZWFzb24pO1xuXHQgICAgdGhpcy5fYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG5cdCAgfVxuXHR9XG5cblx0LyoqKi8gfSksXG5cdC8qIDI2ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5UZXh0TGF5ZXJSZW5kZXJUYXNrID0gdm9pZCAwO1xuXHRleHBvcnRzLnJlbmRlclRleHRMYXllciA9IHJlbmRlclRleHRMYXllcjtcblx0ZXhwb3J0cy51cGRhdGVUZXh0TGF5ZXIgPSB1cGRhdGVUZXh0TGF5ZXI7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7XG5cdGNvbnN0IE1BWF9URVhUX0RJVlNfVE9fUkVOREVSID0gMTAwMDAwO1xuXHRjb25zdCBERUZBVUxUX0ZPTlRfU0laRSA9IDMwO1xuXHRjb25zdCBERUZBVUxUX0ZPTlRfQVNDRU5UID0gMC44O1xuXHRjb25zdCBhc2NlbnRDYWNoZSA9IG5ldyBNYXAoKTtcblx0ZnVuY3Rpb24gZ2V0Q3R4KHNpemUsIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7XG5cdCAgbGV0IGN0eDtcblx0ICBpZiAoaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgJiYgX3V0aWwuRmVhdHVyZVRlc3QuaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpIHtcblx0ICAgIGN0eCA9IG5ldyBPZmZzY3JlZW5DYW52YXMoc2l6ZSwgc2l6ZSkuZ2V0Q29udGV4dChcIjJkXCIsIHtcblx0ICAgICAgYWxwaGE6IGZhbHNlXG5cdCAgICB9KTtcblx0ICB9IGVsc2Uge1xuXHQgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblx0ICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSBzaXplO1xuXHQgICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiLCB7XG5cdCAgICAgIGFscGhhOiBmYWxzZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJldHVybiBjdHg7XG5cdH1cblx0ZnVuY3Rpb24gZ2V0QXNjZW50KGZvbnRGYW1pbHksIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKSB7XG5cdCAgY29uc3QgY2FjaGVkQXNjZW50ID0gYXNjZW50Q2FjaGUuZ2V0KGZvbnRGYW1pbHkpO1xuXHQgIGlmIChjYWNoZWRBc2NlbnQpIHtcblx0ICAgIHJldHVybiBjYWNoZWRBc2NlbnQ7XG5cdCAgfVxuXHQgIGNvbnN0IGN0eCA9IGdldEN0eChERUZBVUxUX0ZPTlRfU0laRSwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpO1xuXHQgIGN0eC5mb250ID0gYCR7REVGQVVMVF9GT05UX1NJWkV9cHggJHtmb250RmFtaWx5fWA7XG5cdCAgY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChcIlwiKTtcblx0ICBsZXQgYXNjZW50ID0gbWV0cmljcy5mb250Qm91bmRpbmdCb3hBc2NlbnQ7XG5cdCAgbGV0IGRlc2NlbnQgPSBNYXRoLmFicyhtZXRyaWNzLmZvbnRCb3VuZGluZ0JveERlc2NlbnQpO1xuXHQgIGlmIChhc2NlbnQpIHtcblx0ICAgIGNvbnN0IHJhdGlvID0gYXNjZW50IC8gKGFzY2VudCArIGRlc2NlbnQpO1xuXHQgICAgYXNjZW50Q2FjaGUuc2V0KGZvbnRGYW1pbHksIHJhdGlvKTtcblx0ICAgIGN0eC5jYW52YXMud2lkdGggPSBjdHguY2FudmFzLmhlaWdodCA9IDA7XG5cdCAgICByZXR1cm4gcmF0aW87XG5cdCAgfVxuXHQgIGN0eC5zdHJva2VTdHlsZSA9IFwicmVkXCI7XG5cdCAgY3R4LmNsZWFyUmVjdCgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpO1xuXHQgIGN0eC5zdHJva2VUZXh0KFwiZ1wiLCAwLCAwKTtcblx0ICBsZXQgcGl4ZWxzID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBERUZBVUxUX0ZPTlRfU0laRSwgREVGQVVMVF9GT05UX1NJWkUpLmRhdGE7XG5cdCAgZGVzY2VudCA9IDA7XG5cdCAgZm9yIChsZXQgaSA9IHBpeGVscy5sZW5ndGggLSAxIC0gMzsgaSA+PSAwOyBpIC09IDQpIHtcblx0ICAgIGlmIChwaXhlbHNbaV0gPiAwKSB7XG5cdCAgICAgIGRlc2NlbnQgPSBNYXRoLmNlaWwoaSAvIDQgLyBERUZBVUxUX0ZPTlRfU0laRSk7XG5cdCAgICAgIGJyZWFrO1xuXHQgICAgfVxuXHQgIH1cblx0ICBjdHguY2xlYXJSZWN0KDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSk7XG5cdCAgY3R4LnN0cm9rZVRleHQoXCJBXCIsIDAsIERFRkFVTFRfRk9OVF9TSVpFKTtcblx0ICBwaXhlbHMgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX0ZPTlRfU0laRSkuZGF0YTtcblx0ICBhc2NlbnQgPSAwO1xuXHQgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBpeGVscy5sZW5ndGg7IGkgPCBpaTsgaSArPSA0KSB7XG5cdCAgICBpZiAocGl4ZWxzW2ldID4gMCkge1xuXHQgICAgICBhc2NlbnQgPSBERUZBVUxUX0ZPTlRfU0laRSAtIE1hdGguZmxvb3IoaSAvIDQgLyBERUZBVUxUX0ZPTlRfU0laRSk7XG5cdCAgICAgIGJyZWFrO1xuXHQgICAgfVxuXHQgIH1cblx0ICBjdHguY2FudmFzLndpZHRoID0gY3R4LmNhbnZhcy5oZWlnaHQgPSAwO1xuXHQgIGlmIChhc2NlbnQpIHtcblx0ICAgIGNvbnN0IHJhdGlvID0gYXNjZW50IC8gKGFzY2VudCArIGRlc2NlbnQpO1xuXHQgICAgYXNjZW50Q2FjaGUuc2V0KGZvbnRGYW1pbHksIHJhdGlvKTtcblx0ICAgIHJldHVybiByYXRpbztcblx0ICB9XG5cdCAgYXNjZW50Q2FjaGUuc2V0KGZvbnRGYW1pbHksIERFRkFVTFRfRk9OVF9BU0NFTlQpO1xuXHQgIHJldHVybiBERUZBVUxUX0ZPTlRfQVNDRU5UO1xuXHR9XG5cdGZ1bmN0aW9uIGFwcGVuZFRleHQodGFzaywgZ2VvbSwgc3R5bGVzKSB7XG5cdCAgY29uc3QgdGV4dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHQgIGNvbnN0IHRleHREaXZQcm9wZXJ0aWVzID0ge1xuXHQgICAgYW5nbGU6IDAsXG5cdCAgICBjYW52YXNXaWR0aDogMCxcblx0ICAgIGhhc1RleHQ6IGdlb20uc3RyICE9PSBcIlwiLFxuXHQgICAgaGFzRU9MOiBnZW9tLmhhc0VPTCxcblx0ICAgIGZvbnRTaXplOiAwXG5cdCAgfTtcblx0ICB0YXNrLl90ZXh0RGl2cy5wdXNoKHRleHREaXYpO1xuXHQgIGNvbnN0IHR4ID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0odGFzay5fdHJhbnNmb3JtLCBnZW9tLnRyYW5zZm9ybSk7XG5cdCAgbGV0IGFuZ2xlID0gTWF0aC5hdGFuMih0eFsxXSwgdHhbMF0pO1xuXHQgIGNvbnN0IHN0eWxlID0gc3R5bGVzW2dlb20uZm9udE5hbWVdO1xuXHQgIGlmIChzdHlsZS52ZXJ0aWNhbCkge1xuXHQgICAgYW5nbGUgKz0gTWF0aC5QSSAvIDI7XG5cdCAgfVxuXHQgIGNvbnN0IGZvbnRIZWlnaHQgPSBNYXRoLmh5cG90KHR4WzJdLCB0eFszXSk7XG5cdCAgY29uc3QgZm9udEFzY2VudCA9IGZvbnRIZWlnaHQgKiBnZXRBc2NlbnQoc3R5bGUuZm9udEZhbWlseSwgdGFzay5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpO1xuXHQgIGxldCBsZWZ0LCB0b3A7XG5cdCAgaWYgKGFuZ2xlID09PSAwKSB7XG5cdCAgICBsZWZ0ID0gdHhbNF07XG5cdCAgICB0b3AgPSB0eFs1XSAtIGZvbnRBc2NlbnQ7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGxlZnQgPSB0eFs0XSArIGZvbnRBc2NlbnQgKiBNYXRoLnNpbihhbmdsZSk7XG5cdCAgICB0b3AgPSB0eFs1XSAtIGZvbnRBc2NlbnQgKiBNYXRoLmNvcyhhbmdsZSk7XG5cdCAgfVxuXHQgIGNvbnN0IHNjYWxlRmFjdG9yU3RyID0gXCJjYWxjKHZhcigtLXNjYWxlLWZhY3RvcikqXCI7XG5cdCAgY29uc3QgZGl2U3R5bGUgPSB0ZXh0RGl2LnN0eWxlO1xuXHQgIGlmICh0YXNrLl9jb250YWluZXIgPT09IHRhc2suX3Jvb3RDb250YWluZXIpIHtcblx0ICAgIGRpdlN0eWxlLmxlZnQgPSBgJHsoMTAwICogbGVmdCAvIHRhc2suX3BhZ2VXaWR0aCkudG9GaXhlZCgyKX0lYDtcblx0ICAgIGRpdlN0eWxlLnRvcCA9IGAkeygxMDAgKiB0b3AgLyB0YXNrLl9wYWdlSGVpZ2h0KS50b0ZpeGVkKDIpfSVgO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBkaXZTdHlsZS5sZWZ0ID0gYCR7c2NhbGVGYWN0b3JTdHJ9JHtsZWZ0LnRvRml4ZWQoMil9cHgpYDtcblx0ICAgIGRpdlN0eWxlLnRvcCA9IGAke3NjYWxlRmFjdG9yU3RyfSR7dG9wLnRvRml4ZWQoMil9cHgpYDtcblx0ICB9XG5cdCAgZGl2U3R5bGUuZm9udFNpemUgPSBgJHtzY2FsZUZhY3RvclN0cn0ke2ZvbnRIZWlnaHQudG9GaXhlZCgyKX1weClgO1xuXHQgIGRpdlN0eWxlLmZvbnRGYW1pbHkgPSBzdHlsZS5mb250RmFtaWx5O1xuXHQgIHRleHREaXZQcm9wZXJ0aWVzLmZvbnRTaXplID0gZm9udEhlaWdodDtcblx0ICB0ZXh0RGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJwcmVzZW50YXRpb25cIik7XG5cdCAgdGV4dERpdi50ZXh0Q29udGVudCA9IGdlb20uc3RyO1xuXHQgIHRleHREaXYuZGlyID0gZ2VvbS5kaXI7XG5cdCAgaWYgKHRhc2suX2ZvbnRJbnNwZWN0b3JFbmFibGVkKSB7XG5cdCAgICB0ZXh0RGl2LmRhdGFzZXQuZm9udE5hbWUgPSBnZW9tLmZvbnROYW1lO1xuXHQgIH1cblx0ICBpZiAoYW5nbGUgIT09IDApIHtcblx0ICAgIHRleHREaXZQcm9wZXJ0aWVzLmFuZ2xlID0gYW5nbGUgKiAoMTgwIC8gTWF0aC5QSSk7XG5cdCAgfVxuXHQgIGxldCBzaG91bGRTY2FsZVRleHQgPSBmYWxzZTtcblx0ICBpZiAoZ2VvbS5zdHIubGVuZ3RoID4gMSkge1xuXHQgICAgc2hvdWxkU2NhbGVUZXh0ID0gdHJ1ZTtcblx0ICB9IGVsc2UgaWYgKGdlb20uc3RyICE9PSBcIiBcIiAmJiBnZW9tLnRyYW5zZm9ybVswXSAhPT0gZ2VvbS50cmFuc2Zvcm1bM10pIHtcblx0ICAgIGNvbnN0IGFic1NjYWxlWCA9IE1hdGguYWJzKGdlb20udHJhbnNmb3JtWzBdKSxcblx0ICAgICAgYWJzU2NhbGVZID0gTWF0aC5hYnMoZ2VvbS50cmFuc2Zvcm1bM10pO1xuXHQgICAgaWYgKGFic1NjYWxlWCAhPT0gYWJzU2NhbGVZICYmIE1hdGgubWF4KGFic1NjYWxlWCwgYWJzU2NhbGVZKSAvIE1hdGgubWluKGFic1NjYWxlWCwgYWJzU2NhbGVZKSA+IDEuNSkge1xuXHQgICAgICBzaG91bGRTY2FsZVRleHQgPSB0cnVlO1xuXHQgICAgfVxuXHQgIH1cblx0ICBpZiAoc2hvdWxkU2NhbGVUZXh0KSB7XG5cdCAgICB0ZXh0RGl2UHJvcGVydGllcy5jYW52YXNXaWR0aCA9IHN0eWxlLnZlcnRpY2FsID8gZ2VvbS5oZWlnaHQgOiBnZW9tLndpZHRoO1xuXHQgIH1cblx0ICB0YXNrLl90ZXh0RGl2UHJvcGVydGllcy5zZXQodGV4dERpdiwgdGV4dERpdlByb3BlcnRpZXMpO1xuXHQgIGlmICh0YXNrLl9pc1JlYWRhYmxlU3RyZWFtKSB7XG5cdCAgICB0YXNrLl9sYXlvdXRUZXh0KHRleHREaXYpO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiBsYXlvdXQocGFyYW1zKSB7XG5cdCAgY29uc3Qge1xuXHQgICAgZGl2LFxuXHQgICAgc2NhbGUsXG5cdCAgICBwcm9wZXJ0aWVzLFxuXHQgICAgY3R4LFxuXHQgICAgcHJldkZvbnRTaXplLFxuXHQgICAgcHJldkZvbnRGYW1pbHlcblx0ICB9ID0gcGFyYW1zO1xuXHQgIGNvbnN0IHtcblx0ICAgIHN0eWxlXG5cdCAgfSA9IGRpdjtcblx0ICBsZXQgdHJhbnNmb3JtID0gXCJcIjtcblx0ICBpZiAocHJvcGVydGllcy5jYW52YXNXaWR0aCAhPT0gMCAmJiBwcm9wZXJ0aWVzLmhhc1RleHQpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgZm9udEZhbWlseVxuXHQgICAgfSA9IHN0eWxlO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBjYW52YXNXaWR0aCxcblx0ICAgICAgZm9udFNpemVcblx0ICAgIH0gPSBwcm9wZXJ0aWVzO1xuXHQgICAgaWYgKHByZXZGb250U2l6ZSAhPT0gZm9udFNpemUgfHwgcHJldkZvbnRGYW1pbHkgIT09IGZvbnRGYW1pbHkpIHtcblx0ICAgICAgY3R4LmZvbnQgPSBgJHtmb250U2l6ZSAqIHNjYWxlfXB4ICR7Zm9udEZhbWlseX1gO1xuXHQgICAgICBwYXJhbXMucHJldkZvbnRTaXplID0gZm9udFNpemU7XG5cdCAgICAgIHBhcmFtcy5wcmV2Rm9udEZhbWlseSA9IGZvbnRGYW1pbHk7XG5cdCAgICB9XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHdpZHRoXG5cdCAgICB9ID0gY3R4Lm1lYXN1cmVUZXh0KGRpdi50ZXh0Q29udGVudCk7XG5cdCAgICBpZiAod2lkdGggPiAwKSB7XG5cdCAgICAgIHRyYW5zZm9ybSA9IGBzY2FsZVgoJHtjYW52YXNXaWR0aCAqIHNjYWxlIC8gd2lkdGh9KWA7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGlmIChwcm9wZXJ0aWVzLmFuZ2xlICE9PSAwKSB7XG5cdCAgICB0cmFuc2Zvcm0gPSBgcm90YXRlKCR7cHJvcGVydGllcy5hbmdsZX1kZWcpICR7dHJhbnNmb3JtfWA7XG5cdCAgfVxuXHQgIGlmICh0cmFuc2Zvcm0ubGVuZ3RoID4gMCkge1xuXHQgICAgc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuXHQgIH1cblx0fVxuXHRmdW5jdGlvbiByZW5kZXIodGFzaykge1xuXHQgIGlmICh0YXNrLl9jYW5jZWxlZCkge1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblx0ICBjb25zdCB0ZXh0RGl2cyA9IHRhc2suX3RleHREaXZzO1xuXHQgIGNvbnN0IGNhcGFiaWxpdHkgPSB0YXNrLl9jYXBhYmlsaXR5O1xuXHQgIGNvbnN0IHRleHREaXZzTGVuZ3RoID0gdGV4dERpdnMubGVuZ3RoO1xuXHQgIGlmICh0ZXh0RGl2c0xlbmd0aCA+IE1BWF9URVhUX0RJVlNfVE9fUkVOREVSKSB7XG5cdCAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgIHJldHVybjtcblx0ICB9XG5cdCAgaWYgKCF0YXNrLl9pc1JlYWRhYmxlU3RyZWFtKSB7XG5cdCAgICBmb3IgKGNvbnN0IHRleHREaXYgb2YgdGV4dERpdnMpIHtcblx0ICAgICAgdGFzay5fbGF5b3V0VGV4dCh0ZXh0RGl2KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgY2FwYWJpbGl0eS5yZXNvbHZlKCk7XG5cdH1cblx0Y2xhc3MgVGV4dExheWVyUmVuZGVyVGFzayB7XG5cdCAgY29uc3RydWN0b3Ioe1xuXHQgICAgdGV4dENvbnRlbnRTb3VyY2UsXG5cdCAgICBjb250YWluZXIsXG5cdCAgICB2aWV3cG9ydCxcblx0ICAgIHRleHREaXZzLFxuXHQgICAgdGV4dERpdlByb3BlcnRpZXMsXG5cdCAgICB0ZXh0Q29udGVudEl0ZW1zU3RyLFxuXHQgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWRcblx0ICB9KSB7XG5cdCAgICB0aGlzLl90ZXh0Q29udGVudFNvdXJjZSA9IHRleHRDb250ZW50U291cmNlO1xuXHQgICAgdGhpcy5faXNSZWFkYWJsZVN0cmVhbSA9IHRleHRDb250ZW50U291cmNlIGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW07XG5cdCAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9yb290Q29udGFpbmVyID0gY29udGFpbmVyO1xuXHQgICAgdGhpcy5fdGV4dERpdnMgPSB0ZXh0RGl2cyB8fCBbXTtcblx0ICAgIHRoaXMuX3RleHRDb250ZW50SXRlbXNTdHIgPSB0ZXh0Q29udGVudEl0ZW1zU3RyIHx8IFtdO1xuXHQgICAgdGhpcy5faXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgPSBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDtcblx0ICAgIHRoaXMuX2ZvbnRJbnNwZWN0b3JFbmFibGVkID0gISFnbG9iYWxUaGlzLkZvbnRJbnNwZWN0b3I/LmVuYWJsZWQ7XG5cdCAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuXHQgICAgdGhpcy5fdGV4dERpdlByb3BlcnRpZXMgPSB0ZXh0RGl2UHJvcGVydGllcyB8fCBuZXcgV2Vha01hcCgpO1xuXHQgICAgdGhpcy5fY2FuY2VsZWQgPSBmYWxzZTtcblx0ICAgIHRoaXMuX2NhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIHRoaXMuX2xheW91dFRleHRQYXJhbXMgPSB7XG5cdCAgICAgIHByZXZGb250U2l6ZTogbnVsbCxcblx0ICAgICAgcHJldkZvbnRGYW1pbHk6IG51bGwsXG5cdCAgICAgIGRpdjogbnVsbCxcblx0ICAgICAgc2NhbGU6IHZpZXdwb3J0LnNjYWxlICogKGdsb2JhbFRoaXMuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSxcblx0ICAgICAgcHJvcGVydGllczogbnVsbCxcblx0ICAgICAgY3R4OiBnZXRDdHgoMCwgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQpXG5cdCAgICB9O1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBwYWdlV2lkdGgsXG5cdCAgICAgIHBhZ2VIZWlnaHQsXG5cdCAgICAgIHBhZ2VYLFxuXHQgICAgICBwYWdlWVxuXHQgICAgfSA9IHZpZXdwb3J0LnJhd0RpbXM7XG5cdCAgICB0aGlzLl90cmFuc2Zvcm0gPSBbMSwgMCwgMCwgLTEsIC1wYWdlWCwgcGFnZVkgKyBwYWdlSGVpZ2h0XTtcblx0ICAgIHRoaXMuX3BhZ2VXaWR0aCA9IHBhZ2VXaWR0aDtcblx0ICAgIHRoaXMuX3BhZ2VIZWlnaHQgPSBwYWdlSGVpZ2h0O1xuXHQgICAgKDAsIF9kaXNwbGF5X3V0aWxzLnNldExheWVyRGltZW5zaW9ucykoY29udGFpbmVyLCB2aWV3cG9ydCk7XG5cdCAgICB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2UuZmluYWxseSgoKSA9PiB7XG5cdCAgICAgIHRoaXMuX2xheW91dFRleHRQYXJhbXMgPSBudWxsO1xuXHQgICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuXHQgIH1cblx0ICBnZXQgcHJvbWlzZSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9jYXBhYmlsaXR5LnByb21pc2U7XG5cdCAgfVxuXHQgIGNhbmNlbCgpIHtcblx0ICAgIHRoaXMuX2NhbmNlbGVkID0gdHJ1ZTtcblx0ICAgIGlmICh0aGlzLl9yZWFkZXIpIHtcblx0ICAgICAgdGhpcy5fcmVhZGVyLmNhbmNlbChuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oXCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuXCIpKS5jYXRjaCgoKSA9PiB7fSk7XG5cdCAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9jYXBhYmlsaXR5LnJlamVjdChuZXcgX3V0aWwuQWJvcnRFeGNlcHRpb24oXCJUZXh0TGF5ZXIgdGFzayBjYW5jZWxsZWQuXCIpKTtcblx0ICB9XG5cdCAgX3Byb2Nlc3NJdGVtcyhpdGVtcywgc3R5bGVDYWNoZSkge1xuXHQgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG5cdCAgICAgIGlmIChpdGVtLnN0ciA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJiZWdpbk1hcmtlZENvbnRlbnRQcm9wc1wiIHx8IGl0ZW0udHlwZSA9PT0gXCJiZWdpbk1hcmtlZENvbnRlbnRcIikge1xuXHQgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fY29udGFpbmVyO1xuXHQgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdCAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcmtlZENvbnRlbnRcIik7XG5cdCAgICAgICAgICBpZiAoaXRlbS5pZCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKFwiaWRcIiwgYCR7aXRlbS5pZH1gKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHBhcmVudC5hcHBlbmQodGhpcy5fY29udGFpbmVyKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJlbmRNYXJrZWRDb250ZW50XCIpIHtcblx0ICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl90ZXh0Q29udGVudEl0ZW1zU3RyLnB1c2goaXRlbS5zdHIpO1xuXHQgICAgICBhcHBlbmRUZXh0KHRoaXMsIGl0ZW0sIHN0eWxlQ2FjaGUpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBfbGF5b3V0VGV4dCh0ZXh0RGl2KSB7XG5cdCAgICBjb25zdCB0ZXh0RGl2UHJvcGVydGllcyA9IHRoaXMuX2xheW91dFRleHRQYXJhbXMucHJvcGVydGllcyA9IHRoaXMuX3RleHREaXZQcm9wZXJ0aWVzLmdldCh0ZXh0RGl2KTtcblx0ICAgIHRoaXMuX2xheW91dFRleHRQYXJhbXMuZGl2ID0gdGV4dERpdjtcblx0ICAgIGxheW91dCh0aGlzLl9sYXlvdXRUZXh0UGFyYW1zKTtcblx0ICAgIGlmICh0ZXh0RGl2UHJvcGVydGllcy5oYXNUZXh0KSB7XG5cdCAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmQodGV4dERpdik7XG5cdCAgICB9XG5cdCAgICBpZiAodGV4dERpdlByb3BlcnRpZXMuaGFzRU9MKSB7XG5cdCAgICAgIGNvbnN0IGJyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpO1xuXHQgICAgICBici5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwicHJlc2VudGF0aW9uXCIpO1xuXHQgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kKGJyKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX3JlbmRlcigpIHtcblx0ICAgIGNvbnN0IGNhcGFiaWxpdHkgPSBuZXcgX3V0aWwuUHJvbWlzZUNhcGFiaWxpdHkoKTtcblx0ICAgIGxldCBzdHlsZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICAgIGlmICh0aGlzLl9pc1JlYWRhYmxlU3RyZWFtKSB7XG5cdCAgICAgIGNvbnN0IHB1bXAgPSAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy5fcmVhZGVyLnJlYWQoKS50aGVuKCh7XG5cdCAgICAgICAgICB2YWx1ZSxcblx0ICAgICAgICAgIGRvbmVcblx0ICAgICAgICB9KSA9PiB7XG5cdCAgICAgICAgICBpZiAoZG9uZSkge1xuXHQgICAgICAgICAgICBjYXBhYmlsaXR5LnJlc29sdmUoKTtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZUNhY2hlLCB2YWx1ZS5zdHlsZXMpO1xuXHQgICAgICAgICAgdGhpcy5fcHJvY2Vzc0l0ZW1zKHZhbHVlLml0ZW1zLCBzdHlsZUNhY2hlKTtcblx0ICAgICAgICAgIHB1bXAoKTtcblx0ICAgICAgICB9LCBjYXBhYmlsaXR5LnJlamVjdCk7XG5cdCAgICAgIH07XG5cdCAgICAgIHRoaXMuX3JlYWRlciA9IHRoaXMuX3RleHRDb250ZW50U291cmNlLmdldFJlYWRlcigpO1xuXHQgICAgICBwdW1wKCk7XG5cdCAgICB9IGVsc2UgaWYgKHRoaXMuX3RleHRDb250ZW50U291cmNlKSB7XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBpdGVtcyxcblx0ICAgICAgICBzdHlsZXNcblx0ICAgICAgfSA9IHRoaXMuX3RleHRDb250ZW50U291cmNlO1xuXHQgICAgICB0aGlzLl9wcm9jZXNzSXRlbXMoaXRlbXMsIHN0eWxlcyk7XG5cdCAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcInRleHRDb250ZW50U291cmNlXCIgcGFyYW1ldGVyIHNwZWNpZmllZC4nKTtcblx0ICAgIH1cblx0ICAgIGNhcGFiaWxpdHkucHJvbWlzZS50aGVuKCgpID0+IHtcblx0ICAgICAgc3R5bGVDYWNoZSA9IG51bGw7XG5cdCAgICAgIHJlbmRlcih0aGlzKTtcblx0ICAgIH0sIHRoaXMuX2NhcGFiaWxpdHkucmVqZWN0KTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5UZXh0TGF5ZXJSZW5kZXJUYXNrID0gVGV4dExheWVyUmVuZGVyVGFzaztcblx0ZnVuY3Rpb24gcmVuZGVyVGV4dExheWVyKHBhcmFtcykge1xuXHQgIGlmICghcGFyYW1zLnRleHRDb250ZW50U291cmNlICYmIChwYXJhbXMudGV4dENvbnRlbnQgfHwgcGFyYW1zLnRleHRDb250ZW50U3RyZWFtKSkge1xuXHQgICAgKDAsIF9kaXNwbGF5X3V0aWxzLmRlcHJlY2F0ZWQpKFwiVGhlIFRleHRMYXllclJlbmRlciBgdGV4dENvbnRlbnRgL2B0ZXh0Q29udGVudFN0cmVhbWAgcGFyYW1ldGVycyBcIiArIFwid2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsIHBsZWFzZSB1c2UgYHRleHRDb250ZW50U291cmNlYCBpbnN0ZWFkLlwiKTtcblx0ICAgIHBhcmFtcy50ZXh0Q29udGVudFNvdXJjZSA9IHBhcmFtcy50ZXh0Q29udGVudCB8fCBwYXJhbXMudGV4dENvbnRlbnRTdHJlYW07XG5cdCAgfVxuXHQgIGNvbnN0IHtcblx0ICAgIGNvbnRhaW5lcixcblx0ICAgIHZpZXdwb3J0XG5cdCAgfSA9IHBhcmFtcztcblx0ICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoY29udGFpbmVyKTtcblx0ICBjb25zdCB2aXNpYmlsaXR5ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2liaWxpdHlcIik7XG5cdCAgY29uc3Qgc2NhbGVGYWN0b3IgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLXNjYWxlLWZhY3RvclwiKSk7XG5cdCAgaWYgKHZpc2liaWxpdHkgPT09IFwidmlzaWJsZVwiICYmICghc2NhbGVGYWN0b3IgfHwgTWF0aC5hYnMoc2NhbGVGYWN0b3IgLSB2aWV3cG9ydC5zY2FsZSkgPiAxZS01KSkge1xuXHQgICAgY29uc29sZS5lcnJvcihcIlRoZSBgLS1zY2FsZS1mYWN0b3JgIENTUy12YXJpYWJsZSBtdXN0IGJlIHNldCwgXCIgKyBcInRvIHRoZSBzYW1lIHZhbHVlIGFzIGB2aWV3cG9ydC5zY2FsZWAsIFwiICsgXCJlaXRoZXIgb24gdGhlIGBjb250YWluZXJgLWVsZW1lbnQgaXRzZWxmIG9yIGhpZ2hlciB1cCBpbiB0aGUgRE9NLlwiKTtcblx0ICB9XG5cdCAgY29uc3QgdGFzayA9IG5ldyBUZXh0TGF5ZXJSZW5kZXJUYXNrKHBhcmFtcyk7XG5cdCAgdGFzay5fcmVuZGVyKCk7XG5cdCAgcmV0dXJuIHRhc2s7XG5cdH1cblx0ZnVuY3Rpb24gdXBkYXRlVGV4dExheWVyKHtcblx0ICBjb250YWluZXIsXG5cdCAgdmlld3BvcnQsXG5cdCAgdGV4dERpdnMsXG5cdCAgdGV4dERpdlByb3BlcnRpZXMsXG5cdCAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQsXG5cdCAgbXVzdFJvdGF0ZSA9IHRydWUsXG5cdCAgbXVzdFJlc2NhbGUgPSB0cnVlXG5cdH0pIHtcblx0ICBpZiAobXVzdFJvdGF0ZSkge1xuXHQgICAgKDAsIF9kaXNwbGF5X3V0aWxzLnNldExheWVyRGltZW5zaW9ucykoY29udGFpbmVyLCB7XG5cdCAgICAgIHJvdGF0aW9uOiB2aWV3cG9ydC5yb3RhdGlvblxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGlmIChtdXN0UmVzY2FsZSkge1xuXHQgICAgY29uc3QgY3R4ID0gZ2V0Q3R4KDAsIGlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkKTtcblx0ICAgIGNvbnN0IHNjYWxlID0gdmlld3BvcnQuc2NhbGUgKiAoZ2xvYmFsVGhpcy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpO1xuXHQgICAgY29uc3QgcGFyYW1zID0ge1xuXHQgICAgICBwcmV2Rm9udFNpemU6IG51bGwsXG5cdCAgICAgIHByZXZGb250RmFtaWx5OiBudWxsLFxuXHQgICAgICBkaXY6IG51bGwsXG5cdCAgICAgIHNjYWxlLFxuXHQgICAgICBwcm9wZXJ0aWVzOiBudWxsLFxuXHQgICAgICBjdHhcblx0ICAgIH07XG5cdCAgICBmb3IgKGNvbnN0IGRpdiBvZiB0ZXh0RGl2cykge1xuXHQgICAgICBwYXJhbXMucHJvcGVydGllcyA9IHRleHREaXZQcm9wZXJ0aWVzLmdldChkaXYpO1xuXHQgICAgICBwYXJhbXMuZGl2ID0gZGl2O1xuXHQgICAgICBsYXlvdXQocGFyYW1zKTtcblx0ICAgIH1cblx0ICB9XG5cdH1cblxuXHQvKioqLyB9KSxcblx0LyogMjcgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLkFubm90YXRpb25FZGl0b3JMYXllciA9IHZvaWQgMDtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF90b29scyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7XG5cdHZhciBfZnJlZXRleHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI4KTtcblx0dmFyIF9pbmsgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI5KTtcblx0dmFyIF9kaXNwbGF5X3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXyg2KTtcblx0Y2xhc3MgQW5ub3RhdGlvbkVkaXRvckxheWVyIHtcblx0ICAjYWNjZXNzaWJpbGl0eU1hbmFnZXI7XG5cdCAgI2FsbG93Q2xpY2sgPSBmYWxzZTtcblx0ICAjYm91bmRQb2ludGVydXAgPSB0aGlzLnBvaW50ZXJ1cC5iaW5kKHRoaXMpO1xuXHQgICNib3VuZFBvaW50ZXJkb3duID0gdGhpcy5wb2ludGVyZG93bi5iaW5kKHRoaXMpO1xuXHQgICNlZGl0b3JzID0gbmV3IE1hcCgpO1xuXHQgICNoYWRQb2ludGVyRG93biA9IGZhbHNlO1xuXHQgICNpc0NsZWFuaW5nVXAgPSBmYWxzZTtcblx0ICAjdWlNYW5hZ2VyO1xuXHQgIHN0YXRpYyBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0ICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdCAgICBpZiAoIUFubm90YXRpb25FZGl0b3JMYXllci5faW5pdGlhbGl6ZWQpIHtcblx0ICAgICAgQW5ub3RhdGlvbkVkaXRvckxheWVyLl9pbml0aWFsaXplZCA9IHRydWU7XG5cdCAgICAgIF9mcmVldGV4dC5GcmVlVGV4dEVkaXRvci5pbml0aWFsaXplKG9wdGlvbnMubDEwbik7XG5cdCAgICAgIF9pbmsuSW5rRWRpdG9yLmluaXRpYWxpemUob3B0aW9ucy5sMTBuKTtcblx0ICAgIH1cblx0ICAgIG9wdGlvbnMudWlNYW5hZ2VyLnJlZ2lzdGVyRWRpdG9yVHlwZXMoW19mcmVldGV4dC5GcmVlVGV4dEVkaXRvciwgX2luay5JbmtFZGl0b3JdKTtcblx0ICAgIHRoaXMuI3VpTWFuYWdlciA9IG9wdGlvbnMudWlNYW5hZ2VyO1xuXHQgICAgdGhpcy5wYWdlSW5kZXggPSBvcHRpb25zLnBhZ2VJbmRleDtcblx0ICAgIHRoaXMuZGl2ID0gb3B0aW9ucy5kaXY7XG5cdCAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlciA9IG9wdGlvbnMuYWNjZXNzaWJpbGl0eU1hbmFnZXI7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIuYWRkTGF5ZXIodGhpcyk7XG5cdCAgfVxuXHQgIGdldCBpc0VtcHR5KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI2VkaXRvcnMuc2l6ZSA9PT0gMDtcblx0ICB9XG5cdCAgdXBkYXRlVG9vbGJhcihtb2RlKSB7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIudXBkYXRlVG9vbGJhcihtb2RlKTtcblx0ICB9XG5cdCAgdXBkYXRlTW9kZShtb2RlID0gdGhpcy4jdWlNYW5hZ2VyLmdldE1vZGUoKSkge1xuXHQgICAgdGhpcy4jY2xlYW51cCgpO1xuXHQgICAgaWYgKG1vZGUgPT09IF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSykge1xuXHQgICAgICB0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKGZhbHNlKTtcblx0ICAgICAgdGhpcy5kaXNhYmxlQ2xpY2soKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuZW5hYmxlQ2xpY2soKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3VpTWFuYWdlci51bnNlbGVjdEFsbCgpO1xuXHQgICAgaWYgKG1vZGUgIT09IF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLk5PTkUpIHtcblx0ICAgICAgdGhpcy5kaXYuY2xhc3NMaXN0LnRvZ2dsZShcImZyZWVUZXh0RWRpdGluZ1wiLCBtb2RlID09PSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVCk7XG5cdCAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJpbmtFZGl0aW5nXCIsIG1vZGUgPT09IF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSyk7XG5cdCAgICAgIHRoaXMuZGl2LmhpZGRlbiA9IGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblx0ICBhZGRJbmtFZGl0b3JJZk5lZWRlZChpc0NvbW1pdHRpbmcpIHtcblx0ICAgIGlmICghaXNDb21taXR0aW5nICYmIHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkgIT09IF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoIWlzQ29tbWl0dGluZykge1xuXHQgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG5cdCAgICAgICAgaWYgKGVkaXRvci5pc0VtcHR5KCkpIHtcblx0ICAgICAgICAgIGVkaXRvci5zZXRJbkJhY2tncm91bmQoKTtcblx0ICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI2NyZWF0ZUFuZEFkZE5ld0VkaXRvcih7XG5cdCAgICAgIG9mZnNldFg6IDAsXG5cdCAgICAgIG9mZnNldFk6IDBcblx0ICAgIH0pO1xuXHQgICAgZWRpdG9yLnNldEluQmFja2dyb3VuZCgpO1xuXHQgIH1cblx0ICBzZXRFZGl0aW5nU3RhdGUoaXNFZGl0aW5nKSB7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIuc2V0RWRpdGluZ1N0YXRlKGlzRWRpdGluZyk7XG5cdCAgfVxuXHQgIGFkZENvbW1hbmRzKHBhcmFtcykge1xuXHQgICAgdGhpcy4jdWlNYW5hZ2VyLmFkZENvbW1hbmRzKHBhcmFtcyk7XG5cdCAgfVxuXHQgIGVuYWJsZSgpIHtcblx0ICAgIHRoaXMuZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcImF1dG9cIjtcblx0ICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcblx0ICAgICAgZWRpdG9yLmVuYWJsZUVkaXRpbmcoKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZGlzYWJsZSgpIHtcblx0ICAgIHRoaXMuZGl2LnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcblx0ICAgIGZvciAoY29uc3QgZWRpdG9yIG9mIHRoaXMuI2VkaXRvcnMudmFsdWVzKCkpIHtcblx0ICAgICAgZWRpdG9yLmRpc2FibGVFZGl0aW5nKCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNjbGVhbnVwKCk7XG5cdCAgICBpZiAodGhpcy5pc0VtcHR5KSB7XG5cdCAgICAgIHRoaXMuZGl2LmhpZGRlbiA9IHRydWU7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHNldEFjdGl2ZUVkaXRvcihlZGl0b3IpIHtcblx0ICAgIGNvbnN0IGN1cnJlbnRBY3RpdmUgPSB0aGlzLiN1aU1hbmFnZXIuZ2V0QWN0aXZlKCk7XG5cdCAgICBpZiAoY3VycmVudEFjdGl2ZSA9PT0gZWRpdG9yKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3VpTWFuYWdlci5zZXRBY3RpdmVFZGl0b3IoZWRpdG9yKTtcblx0ICB9XG5cdCAgZW5hYmxlQ2xpY2soKSB7XG5cdCAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRQb2ludGVyZG93bik7XG5cdCAgICB0aGlzLmRpdi5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuI2JvdW5kUG9pbnRlcnVwKTtcblx0ICB9XG5cdCAgZGlzYWJsZUNsaWNrKCkge1xuXHQgICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHRoaXMuI2JvdW5kUG9pbnRlcmRvd24pO1xuXHQgICAgdGhpcy5kaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCB0aGlzLiNib3VuZFBvaW50ZXJ1cCk7XG5cdCAgfVxuXHQgIGF0dGFjaChlZGl0b3IpIHtcblx0ICAgIHRoaXMuI2VkaXRvcnMuc2V0KGVkaXRvci5pZCwgZWRpdG9yKTtcblx0ICB9XG5cdCAgZGV0YWNoKGVkaXRvcikge1xuXHQgICAgdGhpcy4jZWRpdG9ycy5kZWxldGUoZWRpdG9yLmlkKTtcblx0ICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyPy5yZW1vdmVQb2ludGVySW5UZXh0TGF5ZXIoZWRpdG9yLmNvbnRlbnREaXYpO1xuXHQgIH1cblx0ICByZW1vdmUoZWRpdG9yKSB7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIucmVtb3ZlRWRpdG9yKGVkaXRvcik7XG5cdCAgICB0aGlzLmRldGFjaChlZGl0b3IpO1xuXHQgICAgZWRpdG9yLmRpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdCAgICBzZXRUaW1lb3V0KCgpID0+IHtcblx0ICAgICAgZWRpdG9yLmRpdi5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0ICAgICAgZWRpdG9yLmRpdi5yZW1vdmUoKTtcblx0ICAgICAgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSA9IGZhbHNlO1xuXHQgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuXHQgICAgICAgIHRoaXMuI3VpTWFuYWdlci5mb2N1c01haW5Db250YWluZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSwgMCk7XG5cdCAgICBpZiAoIXRoaXMuI2lzQ2xlYW5pbmdVcCkge1xuXHQgICAgICB0aGlzLmFkZElua0VkaXRvcklmTmVlZGVkKGZhbHNlKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgI2NoYW5nZVBhcmVudChlZGl0b3IpIHtcblx0ICAgIGlmIChlZGl0b3IucGFyZW50ID09PSB0aGlzKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuYXR0YWNoKGVkaXRvcik7XG5cdCAgICBlZGl0b3IucGFyZW50Py5kZXRhY2goZWRpdG9yKTtcblx0ICAgIGVkaXRvci5zZXRQYXJlbnQodGhpcyk7XG5cdCAgICBpZiAoZWRpdG9yLmRpdiAmJiBlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG5cdCAgICAgIGVkaXRvci5kaXYucmVtb3ZlKCk7XG5cdCAgICAgIHRoaXMuZGl2LmFwcGVuZChlZGl0b3IuZGl2KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgYWRkKGVkaXRvcikge1xuXHQgICAgdGhpcy4jY2hhbmdlUGFyZW50KGVkaXRvcik7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIuYWRkRWRpdG9yKGVkaXRvcik7XG5cdCAgICB0aGlzLmF0dGFjaChlZGl0b3IpO1xuXHQgICAgaWYgKCFlZGl0b3IuaXNBdHRhY2hlZFRvRE9NKSB7XG5cdCAgICAgIGNvbnN0IGRpdiA9IGVkaXRvci5yZW5kZXIoKTtcblx0ICAgICAgdGhpcy5kaXYuYXBwZW5kKGRpdik7XG5cdCAgICAgIGVkaXRvci5pc0F0dGFjaGVkVG9ET00gPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgdGhpcy5tb3ZlRWRpdG9ySW5ET00oZWRpdG9yKTtcblx0ICAgIGVkaXRvci5vbmNlQWRkZWQoKTtcblx0ICAgIHRoaXMuI3VpTWFuYWdlci5hZGRUb0Fubm90YXRpb25TdG9yYWdlKGVkaXRvcik7XG5cdCAgfVxuXHQgIG1vdmVFZGl0b3JJbkRPTShlZGl0b3IpIHtcblx0ICAgIHRoaXMuI2FjY2Vzc2liaWxpdHlNYW5hZ2VyPy5tb3ZlRWxlbWVudEluRE9NKHRoaXMuZGl2LCBlZGl0b3IuZGl2LCBlZGl0b3IuY29udGVudERpdiwgdHJ1ZSk7XG5cdCAgfVxuXHQgIGFkZE9yUmVidWlsZChlZGl0b3IpIHtcblx0ICAgIGlmIChlZGl0b3IubmVlZHNUb0JlUmVidWlsdCgpKSB7XG5cdCAgICAgIGVkaXRvci5yZWJ1aWxkKCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmFkZChlZGl0b3IpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBhZGRBTmV3RWRpdG9yKGVkaXRvcikge1xuXHQgICAgY29uc3QgY21kID0gKCkgPT4ge1xuXHQgICAgICB0aGlzLmFkZE9yUmVidWlsZChlZGl0b3IpO1xuXHQgICAgfTtcblx0ICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG5cdCAgICAgIGVkaXRvci5yZW1vdmUoKTtcblx0ICAgIH07XG5cdCAgICB0aGlzLmFkZENvbW1hbmRzKHtcblx0ICAgICAgY21kLFxuXHQgICAgICB1bmRvLFxuXHQgICAgICBtdXN0RXhlYzogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGFkZFVuZG9hYmxlRWRpdG9yKGVkaXRvcikge1xuXHQgICAgY29uc3QgY21kID0gKCkgPT4ge1xuXHQgICAgICB0aGlzLmFkZE9yUmVidWlsZChlZGl0b3IpO1xuXHQgICAgfTtcblx0ICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG5cdCAgICAgIGVkaXRvci5yZW1vdmUoKTtcblx0ICAgIH07XG5cdCAgICB0aGlzLmFkZENvbW1hbmRzKHtcblx0ICAgICAgY21kLFxuXHQgICAgICB1bmRvLFxuXHQgICAgICBtdXN0RXhlYzogZmFsc2Vcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXROZXh0SWQoKSB7XG5cdCAgICByZXR1cm4gdGhpcy4jdWlNYW5hZ2VyLmdldElkKCk7XG5cdCAgfVxuXHQgICNjcmVhdGVOZXdFZGl0b3IocGFyYW1zKSB7XG5cdCAgICBzd2l0Y2ggKHRoaXMuI3VpTWFuYWdlci5nZXRNb2RlKCkpIHtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVDpcblx0ICAgICAgICByZXR1cm4gbmV3IF9mcmVldGV4dC5GcmVlVGV4dEVkaXRvcihwYXJhbXMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSzpcblx0ICAgICAgICByZXR1cm4gbmV3IF9pbmsuSW5rRWRpdG9yKHBhcmFtcyk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gbnVsbDtcblx0ICB9XG5cdCAgZGVzZXJpYWxpemUoZGF0YSkge1xuXHQgICAgc3dpdGNoIChkYXRhLmFubm90YXRpb25UeXBlKSB7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkVkaXRvclR5cGUuRlJFRVRFWFQ6XG5cdCAgICAgICAgcmV0dXJuIF9mcmVldGV4dC5GcmVlVGV4dEVkaXRvci5kZXNlcmlhbGl6ZShkYXRhLCB0aGlzLCB0aGlzLiN1aU1hbmFnZXIpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSzpcblx0ICAgICAgICByZXR1cm4gX2luay5JbmtFZGl0b3IuZGVzZXJpYWxpemUoZGF0YSwgdGhpcywgdGhpcy4jdWlNYW5hZ2VyKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBudWxsO1xuXHQgIH1cblx0ICAjY3JlYXRlQW5kQWRkTmV3RWRpdG9yKGV2ZW50KSB7XG5cdCAgICBjb25zdCBpZCA9IHRoaXMuZ2V0TmV4dElkKCk7XG5cdCAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiNjcmVhdGVOZXdFZGl0b3Ioe1xuXHQgICAgICBwYXJlbnQ6IHRoaXMsXG5cdCAgICAgIGlkLFxuXHQgICAgICB4OiBldmVudC5vZmZzZXRYLFxuXHQgICAgICB5OiBldmVudC5vZmZzZXRZLFxuXHQgICAgICB1aU1hbmFnZXI6IHRoaXMuI3VpTWFuYWdlclxuXHQgICAgfSk7XG5cdCAgICBpZiAoZWRpdG9yKSB7XG5cdCAgICAgIHRoaXMuYWRkKGVkaXRvcik7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gZWRpdG9yO1xuXHQgIH1cblx0ICBzZXRTZWxlY3RlZChlZGl0b3IpIHtcblx0ICAgIHRoaXMuI3VpTWFuYWdlci5zZXRTZWxlY3RlZChlZGl0b3IpO1xuXHQgIH1cblx0ICB0b2dnbGVTZWxlY3RlZChlZGl0b3IpIHtcblx0ICAgIHRoaXMuI3VpTWFuYWdlci50b2dnbGVTZWxlY3RlZChlZGl0b3IpO1xuXHQgIH1cblx0ICBpc1NlbGVjdGVkKGVkaXRvcikge1xuXHQgICAgcmV0dXJuIHRoaXMuI3VpTWFuYWdlci5pc1NlbGVjdGVkKGVkaXRvcik7XG5cdCAgfVxuXHQgIHVuc2VsZWN0KGVkaXRvcikge1xuXHQgICAgdGhpcy4jdWlNYW5hZ2VyLnVuc2VsZWN0KGVkaXRvcik7XG5cdCAgfVxuXHQgIHBvaW50ZXJ1cChldmVudCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBpc01hY1xuXHQgICAgfSA9IF91dGlsLkZlYXR1cmVUZXN0LnBsYXRmb3JtO1xuXHQgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCBldmVudC5jdHJsS2V5ICYmIGlzTWFjKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmIChldmVudC50YXJnZXQgIT09IHRoaXMuZGl2KSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICghdGhpcy4jaGFkUG9pbnRlckRvd24pIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jaGFkUG9pbnRlckRvd24gPSBmYWxzZTtcblx0ICAgIGlmICghdGhpcy4jYWxsb3dDbGljaykge1xuXHQgICAgICB0aGlzLiNhbGxvd0NsaWNrID0gdHJ1ZTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jY3JlYXRlQW5kQWRkTmV3RWRpdG9yKGV2ZW50KTtcblx0ICB9XG5cdCAgcG9pbnRlcmRvd24oZXZlbnQpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgaXNNYWNcblx0ICAgIH0gPSBfdXRpbC5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcblx0ICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgZXZlbnQuY3RybEtleSAmJiBpc01hYykge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmRpdikge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLiNoYWRQb2ludGVyRG93biA9IHRydWU7XG5cdCAgICBjb25zdCBlZGl0b3IgPSB0aGlzLiN1aU1hbmFnZXIuZ2V0QWN0aXZlKCk7XG5cdCAgICB0aGlzLiNhbGxvd0NsaWNrID0gIWVkaXRvciB8fCBlZGl0b3IuaXNFbXB0eSgpO1xuXHQgIH1cblx0ICBkcm9wKGV2ZW50KSB7XG5cdCAgICBjb25zdCBpZCA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcblx0ICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuI3VpTWFuYWdlci5nZXRFZGl0b3IoaWQpO1xuXHQgICAgaWYgKCFlZGl0b3IpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gXCJtb3ZlXCI7XG5cdCAgICB0aGlzLiNjaGFuZ2VQYXJlbnQoZWRpdG9yKTtcblx0ICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0ICAgIGNvbnN0IGVuZFggPSBldmVudC5jbGllbnRYIC0gcmVjdC54O1xuXHQgICAgY29uc3QgZW5kWSA9IGV2ZW50LmNsaWVudFkgLSByZWN0Lnk7XG5cdCAgICBlZGl0b3IudHJhbnNsYXRlKGVuZFggLSBlZGl0b3Iuc3RhcnRYLCBlbmRZIC0gZWRpdG9yLnN0YXJ0WSk7XG5cdCAgICB0aGlzLm1vdmVFZGl0b3JJbkRPTShlZGl0b3IpO1xuXHQgICAgZWRpdG9yLmRpdi5mb2N1cygpO1xuXHQgIH1cblx0ICBkcmFnb3ZlcihldmVudCkge1xuXHQgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICB9XG5cdCAgZGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLiN1aU1hbmFnZXIuZ2V0QWN0aXZlKCk/LnBhcmVudCA9PT0gdGhpcykge1xuXHQgICAgICB0aGlzLiN1aU1hbmFnZXIuc2V0QWN0aXZlRWRpdG9yKG51bGwpO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBlZGl0b3Igb2YgdGhpcy4jZWRpdG9ycy52YWx1ZXMoKSkge1xuXHQgICAgICB0aGlzLiNhY2Nlc3NpYmlsaXR5TWFuYWdlcj8ucmVtb3ZlUG9pbnRlckluVGV4dExheWVyKGVkaXRvci5jb250ZW50RGl2KTtcblx0ICAgICAgZWRpdG9yLnNldFBhcmVudChudWxsKTtcblx0ICAgICAgZWRpdG9yLmlzQXR0YWNoZWRUb0RPTSA9IGZhbHNlO1xuXHQgICAgICBlZGl0b3IuZGl2LnJlbW92ZSgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5kaXYgPSBudWxsO1xuXHQgICAgdGhpcy4jZWRpdG9ycy5jbGVhcigpO1xuXHQgICAgdGhpcy4jdWlNYW5hZ2VyLnJlbW92ZUxheWVyKHRoaXMpO1xuXHQgIH1cblx0ICAjY2xlYW51cCgpIHtcblx0ICAgIHRoaXMuI2lzQ2xlYW5pbmdVcCA9IHRydWU7XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiNlZGl0b3JzLnZhbHVlcygpKSB7XG5cdCAgICAgIGlmIChlZGl0b3IuaXNFbXB0eSgpKSB7XG5cdCAgICAgICAgZWRpdG9yLnJlbW92ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICB0aGlzLiNpc0NsZWFuaW5nVXAgPSBmYWxzZTtcblx0ICB9XG5cdCAgcmVuZGVyKHtcblx0ICAgIHZpZXdwb3J0XG5cdCAgfSkge1xuXHQgICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0O1xuXHQgICAgKDAsIF9kaXNwbGF5X3V0aWxzLnNldExheWVyRGltZW5zaW9ucykodGhpcy5kaXYsIHZpZXdwb3J0KTtcblx0ICAgICgwLCBfdG9vbHMuYmluZEV2ZW50cykodGhpcywgdGhpcy5kaXYsIFtcImRyYWdvdmVyXCIsIFwiZHJvcFwiXSk7XG5cdCAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiB0aGlzLiN1aU1hbmFnZXIuZ2V0RWRpdG9ycyh0aGlzLnBhZ2VJbmRleCkpIHtcblx0ICAgICAgdGhpcy5hZGQoZWRpdG9yKTtcblx0ICAgIH1cblx0ICAgIHRoaXMudXBkYXRlTW9kZSgpO1xuXHQgIH1cblx0ICB1cGRhdGUoe1xuXHQgICAgdmlld3BvcnRcblx0ICB9KSB7XG5cdCAgICB0aGlzLiN1aU1hbmFnZXIuY29tbWl0T3JSZW1vdmUoKTtcblx0ICAgIHRoaXMudmlld3BvcnQgPSB2aWV3cG9ydDtcblx0ICAgICgwLCBfZGlzcGxheV91dGlscy5zZXRMYXllckRpbWVuc2lvbnMpKHRoaXMuZGl2LCB7XG5cdCAgICAgIHJvdGF0aW9uOiB2aWV3cG9ydC5yb3RhdGlvblxuXHQgICAgfSk7XG5cdCAgICB0aGlzLnVwZGF0ZU1vZGUoKTtcblx0ICB9XG5cdCAgZ2V0IHBhZ2VEaW1lbnNpb25zKCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBwYWdlV2lkdGgsXG5cdCAgICAgIHBhZ2VIZWlnaHRcblx0ICAgIH0gPSB0aGlzLnZpZXdwb3J0LnJhd0RpbXM7XG5cdCAgICByZXR1cm4gW3BhZ2VXaWR0aCwgcGFnZUhlaWdodF07XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkVkaXRvckxheWVyID0gQW5ub3RhdGlvbkVkaXRvckxheWVyO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAyOCAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuRnJlZVRleHRFZGl0b3IgPSB2b2lkIDA7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfdG9vbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDUpO1xuXHR2YXIgX2VkaXRvciA9IF9fd19wZGZqc19yZXF1aXJlX18oNCk7XG5cdGNsYXNzIEZyZWVUZXh0RWRpdG9yIGV4dGVuZHMgX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yIHtcblx0ICAjYm91bmRFZGl0b3JEaXZCbHVyID0gdGhpcy5lZGl0b3JEaXZCbHVyLmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kRWRpdG9yRGl2Rm9jdXMgPSB0aGlzLmVkaXRvckRpdkZvY3VzLmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kRWRpdG9yRGl2SW5wdXQgPSB0aGlzLmVkaXRvckRpdklucHV0LmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kRWRpdG9yRGl2S2V5ZG93biA9IHRoaXMuZWRpdG9yRGl2S2V5ZG93bi5iaW5kKHRoaXMpO1xuXHQgICNjb2xvcjtcblx0ICAjY29udGVudCA9IFwiXCI7XG5cdCAgI2VkaXRvckRpdklkID0gYCR7dGhpcy5pZH0tZWRpdG9yYDtcblx0ICAjaGFzQWxyZWFkeUJlZW5Db21taXR0ZWQgPSBmYWxzZTtcblx0ICAjZm9udFNpemU7XG5cdCAgc3RhdGljIF9mcmVlVGV4dERlZmF1bHRDb250ZW50ID0gXCJcIjtcblx0ICBzdGF0aWMgX2wxMG5Qcm9taXNlO1xuXHQgIHN0YXRpYyBfaW50ZXJuYWxQYWRkaW5nID0gMDtcblx0ICBzdGF0aWMgX2RlZmF1bHRDb2xvciA9IG51bGw7XG5cdCAgc3RhdGljIF9kZWZhdWx0Rm9udFNpemUgPSAxMDtcblx0ICBzdGF0aWMgX2tleWJvYXJkTWFuYWdlciA9IG5ldyBfdG9vbHMuS2V5Ym9hcmRNYW5hZ2VyKFtbW1wiY3RybCtFbnRlclwiLCBcIm1hYyttZXRhK0VudGVyXCIsIFwiRXNjYXBlXCIsIFwibWFjK0VzY2FwZVwiXSwgRnJlZVRleHRFZGl0b3IucHJvdG90eXBlLmNvbW1pdE9yUmVtb3ZlXV0pO1xuXHQgIHN0YXRpYyBfdHlwZSA9IFwiZnJlZXRleHRcIjtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcblx0ICAgIHN1cGVyKHtcblx0ICAgICAgLi4ucGFyYW1zLFxuXHQgICAgICBuYW1lOiBcImZyZWVUZXh0RWRpdG9yXCJcblx0ICAgIH0pO1xuXHQgICAgdGhpcy4jY29sb3IgPSBwYXJhbXMuY29sb3IgfHwgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3I7XG5cdCAgICB0aGlzLiNmb250U2l6ZSA9IHBhcmFtcy5mb250U2l6ZSB8fCBGcmVlVGV4dEVkaXRvci5fZGVmYXVsdEZvbnRTaXplO1xuXHQgIH1cblx0ICBzdGF0aWMgaW5pdGlhbGl6ZShsMTBuKSB7XG5cdCAgICB0aGlzLl9sMTBuUHJvbWlzZSA9IG5ldyBNYXAoW1wiZnJlZV90ZXh0Ml9kZWZhdWx0X2NvbnRlbnRcIiwgXCJlZGl0b3JfZnJlZV90ZXh0Ml9hcmlhX2xhYmVsXCJdLm1hcChzdHIgPT4gW3N0ciwgbDEwbi5nZXQoc3RyKV0pKTtcblx0ICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuXHQgICAgdGhpcy5faW50ZXJuYWxQYWRkaW5nID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiLS1mcmVldGV4dC1wYWRkaW5nXCIpKTtcblx0ICB9XG5cdCAgc3RhdGljIHVwZGF0ZURlZmF1bHRQYXJhbXModHlwZSwgdmFsdWUpIHtcblx0ICAgIHN3aXRjaCAodHlwZSkge1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkU6XG5cdCAgICAgICAgRnJlZVRleHRFZGl0b3IuX2RlZmF1bHRGb250U2l6ZSA9IHZhbHVlO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX0NPTE9SOlxuXHQgICAgICAgIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgPSB2YWx1ZTtcblx0ICAgICAgICBicmVhaztcblx0ICAgIH1cblx0ICB9XG5cdCAgdXBkYXRlUGFyYW1zKHR5cGUsIHZhbHVlKSB7XG5cdCAgICBzd2l0Y2ggKHR5cGUpIHtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFOlxuXHQgICAgICAgIHRoaXMuI3VwZGF0ZUZvbnRTaXplKHZhbHVlKTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUjpcblx0ICAgICAgICB0aGlzLiN1cGRhdGVDb2xvcih2YWx1ZSk7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcblx0ICAgIHJldHVybiBbW191dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Rm9udFNpemVdLCBbX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuRlJFRVRFWFRfQ09MT1IsIEZyZWVUZXh0RWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXV07XG5cdCAgfVxuXHQgIGdldCBwcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG5cdCAgICByZXR1cm4gW1tfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9TSVpFLCB0aGlzLiNmb250U2l6ZV0sIFtfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUiwgdGhpcy4jY29sb3JdXTtcblx0ICB9XG5cdCAgI3VwZGF0ZUZvbnRTaXplKGZvbnRTaXplKSB7XG5cdCAgICBjb25zdCBzZXRGb250c2l6ZSA9IHNpemUgPT4ge1xuXHQgICAgICB0aGlzLmVkaXRvckRpdi5zdHlsZS5mb250U2l6ZSA9IGBjYWxjKCR7c2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcblx0ICAgICAgdGhpcy50cmFuc2xhdGUoMCwgLShzaXplIC0gdGhpcy4jZm9udFNpemUpICogdGhpcy5wYXJlbnRTY2FsZSk7XG5cdCAgICAgIHRoaXMuI2ZvbnRTaXplID0gc2l6ZTtcblx0ICAgICAgdGhpcy4jc2V0RWRpdG9yRGltZW5zaW9ucygpO1xuXHQgICAgfTtcblx0ICAgIGNvbnN0IHNhdmVkRm9udHNpemUgPSB0aGlzLiNmb250U2l6ZTtcblx0ICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuXHQgICAgICBjbWQ6ICgpID0+IHtcblx0ICAgICAgICBzZXRGb250c2l6ZShmb250U2l6ZSk7XG5cdCAgICAgIH0sXG5cdCAgICAgIHVuZG86ICgpID0+IHtcblx0ICAgICAgICBzZXRGb250c2l6ZShzYXZlZEZvbnRzaXplKTtcblx0ICAgICAgfSxcblx0ICAgICAgbXVzdEV4ZWM6IHRydWUsXG5cdCAgICAgIHR5cGU6IF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLkZSRUVURVhUX1NJWkUsXG5cdCAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG5cdCAgICAgIGtlZXBVbmRvOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgI3VwZGF0ZUNvbG9yKGNvbG9yKSB7XG5cdCAgICBjb25zdCBzYXZlZENvbG9yID0gdGhpcy4jY29sb3I7XG5cdCAgICB0aGlzLmFkZENvbW1hbmRzKHtcblx0ICAgICAgY21kOiAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy4jY29sb3IgPSB0aGlzLmVkaXRvckRpdi5zdHlsZS5jb2xvciA9IGNvbG9yO1xuXHQgICAgICB9LFxuXHQgICAgICB1bmRvOiAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy4jY29sb3IgPSB0aGlzLmVkaXRvckRpdi5zdHlsZS5jb2xvciA9IHNhdmVkQ29sb3I7XG5cdCAgICAgIH0sXG5cdCAgICAgIG11c3RFeGVjOiB0cnVlLFxuXHQgICAgICB0eXBlOiBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5GUkVFVEVYVF9DT0xPUixcblx0ICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcblx0ICAgICAga2VlcFVuZG86IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBnZXRJbml0aWFsVHJhbnNsYXRpb24oKSB7XG5cdCAgICBjb25zdCBzY2FsZSA9IHRoaXMucGFyZW50U2NhbGU7XG5cdCAgICByZXR1cm4gWy1GcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogc2NhbGUsIC0oRnJlZVRleHRFZGl0b3IuX2ludGVybmFsUGFkZGluZyArIHRoaXMuI2ZvbnRTaXplKSAqIHNjYWxlXTtcblx0ICB9XG5cdCAgcmVidWlsZCgpIHtcblx0ICAgIHN1cGVyLnJlYnVpbGQoKTtcblx0ICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZFRvRE9NKSB7XG5cdCAgICAgIHRoaXMucGFyZW50LmFkZCh0aGlzKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgZW5hYmxlRWRpdE1vZGUoKSB7XG5cdCAgICBpZiAodGhpcy5pc0luRWRpdE1vZGUoKSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUoZmFsc2UpO1xuXHQgICAgdGhpcy5wYXJlbnQudXBkYXRlVG9vbGJhcihfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVCk7XG5cdCAgICBzdXBlci5lbmFibGVFZGl0TW9kZSgpO1xuXHQgICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJlbmFibGVkXCIpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcblx0ICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9IGZhbHNlO1xuXHQgICAgdGhpcy5kaXYucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZLZXlkb3duKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCB0aGlzLiNib3VuZEVkaXRvckRpdkZvY3VzKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Qmx1cik7XG5cdCAgICB0aGlzLmVkaXRvckRpdi5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZJbnB1dCk7XG5cdCAgfVxuXHQgIGRpc2FibGVFZGl0TW9kZSgpIHtcblx0ICAgIGlmICghdGhpcy5pc0luRWRpdE1vZGUoKSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLnBhcmVudC5zZXRFZGl0aW5nU3RhdGUodHJ1ZSk7XG5cdCAgICBzdXBlci5kaXNhYmxlRWRpdE1vZGUoKTtcblx0ICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKFwiZW5hYmxlZFwiKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IGZhbHNlO1xuXHQgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIHRoaXMuI2VkaXRvckRpdklkKTtcblx0ICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9IHRydWU7XG5cdCAgICB0aGlzLmVkaXRvckRpdi5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLiNib3VuZEVkaXRvckRpdktleWRvd24pO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIHRoaXMuI2JvdW5kRWRpdG9yRGl2Rm9jdXMpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy4jYm91bmRFZGl0b3JEaXZCbHVyKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0aGlzLiNib3VuZEVkaXRvckRpdklucHV0KTtcblx0ICAgIHRoaXMuZGl2LmZvY3VzKHtcblx0ICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuXHQgICAgdGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC5hZGQoXCJmcmVlVGV4dEVkaXRpbmdcIik7XG5cdCAgfVxuXHQgIGZvY3VzaW4oZXZlbnQpIHtcblx0ICAgIHN1cGVyLmZvY3VzaW4oZXZlbnQpO1xuXHQgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5lZGl0b3JEaXYpIHtcblx0ICAgICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgb25jZUFkZGVkKCkge1xuXHQgICAgaWYgKHRoaXMud2lkdGgpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcblx0ICB9XG5cdCAgaXNFbXB0eSgpIHtcblx0ICAgIHJldHVybiAhdGhpcy5lZGl0b3JEaXYgfHwgdGhpcy5lZGl0b3JEaXYuaW5uZXJUZXh0LnRyaW0oKSA9PT0gXCJcIjtcblx0ICB9XG5cdCAgcmVtb3ZlKCkge1xuXHQgICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcblx0ICAgIHRoaXMucGFyZW50LnNldEVkaXRpbmdTdGF0ZSh0cnVlKTtcblx0ICAgIHRoaXMucGFyZW50LmRpdi5jbGFzc0xpc3QuYWRkKFwiZnJlZVRleHRFZGl0aW5nXCIpO1xuXHQgICAgc3VwZXIucmVtb3ZlKCk7XG5cdCAgfVxuXHQgICNleHRyYWN0VGV4dCgpIHtcblx0ICAgIGNvbnN0IGRpdnMgPSB0aGlzLmVkaXRvckRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcImRpdlwiKTtcblx0ICAgIGlmIChkaXZzLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5lZGl0b3JEaXYuaW5uZXJUZXh0O1xuXHQgICAgfVxuXHQgICAgY29uc3QgYnVmZmVyID0gW107XG5cdCAgICBmb3IgKGNvbnN0IGRpdiBvZiBkaXZzKSB7XG5cdCAgICAgIGJ1ZmZlci5wdXNoKGRpdi5pbm5lclRleHQucmVwbGFjZSgvXFxyXFxuP3xcXG4vLCBcIlwiKSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gYnVmZmVyLmpvaW4oXCJcXG5cIik7XG5cdCAgfVxuXHQgICNzZXRFZGl0b3JEaW1lbnNpb25zKCkge1xuXHQgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgbGV0IHJlY3Q7XG5cdCAgICBpZiAodGhpcy5pc0F0dGFjaGVkVG9ET00pIHtcblx0ICAgICAgcmVjdCA9IHRoaXMuZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc3Qge1xuXHQgICAgICAgIGN1cnJlbnRMYXllcixcblx0ICAgICAgICBkaXZcblx0ICAgICAgfSA9IHRoaXM7XG5cdCAgICAgIGNvbnN0IHNhdmVkRGlzcGxheSA9IGRpdi5zdHlsZS5kaXNwbGF5O1xuXHQgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9IFwiaGlkZGVuXCI7XG5cdCAgICAgIGN1cnJlbnRMYXllci5kaXYuYXBwZW5kKHRoaXMuZGl2KTtcblx0ICAgICAgcmVjdCA9IGRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0ICAgICAgZGl2LnJlbW92ZSgpO1xuXHQgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9IHNhdmVkRGlzcGxheTtcblx0ICAgIH1cblx0ICAgIHRoaXMud2lkdGggPSByZWN0LndpZHRoIC8gcGFyZW50V2lkdGg7XG5cdCAgICB0aGlzLmhlaWdodCA9IHJlY3QuaGVpZ2h0IC8gcGFyZW50SGVpZ2h0O1xuXHQgIH1cblx0ICBjb21taXQoKSB7XG5cdCAgICBpZiAoIXRoaXMuaXNJbkVkaXRNb2RlKCkpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgc3VwZXIuY29tbWl0KCk7XG5cdCAgICBpZiAoIXRoaXMuI2hhc0FscmVhZHlCZWVuQ29tbWl0dGVkKSB7XG5cdCAgICAgIHRoaXMuI2hhc0FscmVhZHlCZWVuQ29tbWl0dGVkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5wYXJlbnQuYWRkVW5kb2FibGVFZGl0b3IodGhpcyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLmRpc2FibGVFZGl0TW9kZSgpO1xuXHQgICAgdGhpcy4jY29udGVudCA9IHRoaXMuI2V4dHJhY3RUZXh0KCkudHJpbUVuZCgpO1xuXHQgICAgdGhpcy4jc2V0RWRpdG9yRGltZW5zaW9ucygpO1xuXHQgIH1cblx0ICBzaG91bGRHZXRLZXlib2FyZEV2ZW50cygpIHtcblx0ICAgIHJldHVybiB0aGlzLmlzSW5FZGl0TW9kZSgpO1xuXHQgIH1cblx0ICBkYmxjbGljayhldmVudCkge1xuXHQgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYuZm9jdXMoKTtcblx0ICB9XG5cdCAga2V5ZG93bihldmVudCkge1xuXHQgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5kaXYgJiYgZXZlbnQua2V5ID09PSBcIkVudGVyXCIpIHtcblx0ICAgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuXHQgICAgICB0aGlzLmVkaXRvckRpdi5mb2N1cygpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBlZGl0b3JEaXZLZXlkb3duKGV2ZW50KSB7XG5cdCAgICBGcmVlVGV4dEVkaXRvci5fa2V5Ym9hcmRNYW5hZ2VyLmV4ZWModGhpcywgZXZlbnQpO1xuXHQgIH1cblx0ICBlZGl0b3JEaXZGb2N1cyhldmVudCkge1xuXHQgICAgdGhpcy5pc0VkaXRpbmcgPSB0cnVlO1xuXHQgIH1cblx0ICBlZGl0b3JEaXZCbHVyKGV2ZW50KSB7XG5cdCAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuXHQgIH1cblx0ICBlZGl0b3JEaXZJbnB1dChldmVudCkge1xuXHQgICAgdGhpcy5wYXJlbnQuZGl2LmNsYXNzTGlzdC50b2dnbGUoXCJmcmVlVGV4dEVkaXRpbmdcIiwgdGhpcy5pc0VtcHR5KCkpO1xuXHQgIH1cblx0ICBkaXNhYmxlRWRpdGluZygpIHtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJjb21tZW50XCIpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1tdWx0aWxpbmVcIik7XG5cdCAgfVxuXHQgIGVuYWJsZUVkaXRpbmcoKSB7XG5cdCAgICB0aGlzLmVkaXRvckRpdi5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwidGV4dGJveFwiKTtcblx0ICAgIHRoaXMuZWRpdG9yRGl2LnNldEF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIsIHRydWUpO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICBpZiAodGhpcy5kaXYpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZGl2O1xuXHQgICAgfVxuXHQgICAgbGV0IGJhc2VYLCBiYXNlWTtcblx0ICAgIGlmICh0aGlzLndpZHRoKSB7XG5cdCAgICAgIGJhc2VYID0gdGhpcy54O1xuXHQgICAgICBiYXNlWSA9IHRoaXMueTtcblx0ICAgIH1cblx0ICAgIHN1cGVyLnJlbmRlcigpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYuY2xhc3NOYW1lID0gXCJpbnRlcm5hbFwiO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy4jZWRpdG9yRGl2SWQpO1xuXHQgICAgdGhpcy5lbmFibGVFZGl0aW5nKCk7XG5cdCAgICBGcmVlVGV4dEVkaXRvci5fbDEwblByb21pc2UuZ2V0KFwiZWRpdG9yX2ZyZWVfdGV4dDJfYXJpYV9sYWJlbFwiKS50aGVuKG1zZyA9PiB0aGlzLmVkaXRvckRpdj8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBtc2cpKTtcblx0ICAgIEZyZWVUZXh0RWRpdG9yLl9sMTBuUHJvbWlzZS5nZXQoXCJmcmVlX3RleHQyX2RlZmF1bHRfY29udGVudFwiKS50aGVuKG1zZyA9PiB0aGlzLmVkaXRvckRpdj8uc2V0QXR0cmlidXRlKFwiZGVmYXVsdC1jb250ZW50XCIsIG1zZykpO1xuXHQgICAgdGhpcy5lZGl0b3JEaXYuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgc3R5bGVcblx0ICAgIH0gPSB0aGlzLmVkaXRvckRpdjtcblx0ICAgIHN0eWxlLmZvbnRTaXplID0gYGNhbGMoJHt0aGlzLiNmb250U2l6ZX1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcblx0ICAgIHN0eWxlLmNvbG9yID0gdGhpcy4jY29sb3I7XG5cdCAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5lZGl0b3JEaXYpO1xuXHQgICAgdGhpcy5vdmVybGF5RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKFwib3ZlcmxheVwiLCBcImVuYWJsZWRcIik7XG5cdCAgICB0aGlzLmRpdi5hcHBlbmQodGhpcy5vdmVybGF5RGl2KTtcblx0ICAgICgwLCBfdG9vbHMuYmluZEV2ZW50cykodGhpcywgdGhpcy5kaXYsIFtcImRibGNsaWNrXCIsIFwia2V5ZG93blwiXSk7XG5cdCAgICBpZiAodGhpcy53aWR0aCkge1xuXHQgICAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG5cdCAgICAgIHRoaXMuc2V0QXQoYmFzZVggKiBwYXJlbnRXaWR0aCwgYmFzZVkgKiBwYXJlbnRIZWlnaHQsIHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuXHQgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy4jY29udGVudC5zcGxpdChcIlxcblwiKSkge1xuXHQgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdCAgICAgICAgZGl2LmFwcGVuZChsaW5lID8gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGluZSkgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIikpO1xuXHQgICAgICAgIHRoaXMuZWRpdG9yRGl2LmFwcGVuZChkaXYpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZGl2LmRyYWdnYWJsZSA9IHRydWU7XG5cdCAgICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IGZhbHNlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuZWRpdG9yRGl2LmNvbnRlbnRFZGl0YWJsZSA9IHRydWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5kaXY7XG5cdCAgfVxuXHQgIGdldCBjb250ZW50RGl2KCkge1xuXHQgICAgcmV0dXJuIHRoaXMuZWRpdG9yRGl2O1xuXHQgIH1cblx0ICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcblx0ICAgIGNvbnN0IGVkaXRvciA9IHN1cGVyLmRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKTtcblx0ICAgIGVkaXRvci4jZm9udFNpemUgPSBkYXRhLmZvbnRTaXplO1xuXHQgICAgZWRpdG9yLiNjb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKC4uLmRhdGEuY29sb3IpO1xuXHQgICAgZWRpdG9yLiNjb250ZW50ID0gZGF0YS52YWx1ZTtcblx0ICAgIHJldHVybiBlZGl0b3I7XG5cdCAgfVxuXHQgIHNlcmlhbGl6ZSgpIHtcblx0ICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHBhZGRpbmcgPSBGcmVlVGV4dEVkaXRvci5faW50ZXJuYWxQYWRkaW5nICogdGhpcy5wYXJlbnRTY2FsZTtcblx0ICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldFJlY3QocGFkZGluZywgcGFkZGluZyk7XG5cdCAgICBjb25zdCBjb2xvciA9IF9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5pc0F0dGFjaGVkVG9ET00gPyBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWRpdG9yRGl2KS5jb2xvciA6IHRoaXMuI2NvbG9yKTtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFubm90YXRpb25UeXBlOiBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZS5GUkVFVEVYVCxcblx0ICAgICAgY29sb3IsXG5cdCAgICAgIGZvbnRTaXplOiB0aGlzLiNmb250U2l6ZSxcblx0ICAgICAgdmFsdWU6IHRoaXMuI2NvbnRlbnQsXG5cdCAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG5cdCAgICAgIHJlY3QsXG5cdCAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uXG5cdCAgICB9O1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLkZyZWVUZXh0RWRpdG9yID0gRnJlZVRleHRFZGl0b3I7XG5cblx0LyoqKi8gfSksXG5cdC8qIDI5ICovXG5cdC8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pID0+IHtcblxuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCAoe1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pKTtcblx0ZXhwb3J0cy5JbmtFZGl0b3IgPSB2b2lkIDA7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZpdEN1cnZlXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfcGRmanNGaXRDdXJ2ZS5maXRDdXJ2ZTtcblx0ICB9XG5cdH0pKTtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9lZGl0b3IgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDQpO1xuXHR2YXIgX3BkZmpzRml0Q3VydmUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMwKTtcblx0dmFyIF90b29scyA9IF9fd19wZGZqc19yZXF1aXJlX18oNSk7XG5cdGNvbnN0IFJFU0laRVJfU0laRSA9IDE2O1xuXHRjbGFzcyBJbmtFZGl0b3IgZXh0ZW5kcyBfZWRpdG9yLkFubm90YXRpb25FZGl0b3Ige1xuXHQgICNhc3BlY3RSYXRpbyA9IDA7XG5cdCAgI2Jhc2VIZWlnaHQgPSAwO1xuXHQgICNiYXNlV2lkdGggPSAwO1xuXHQgICNib3VuZENhbnZhc1BvaW50ZXJtb3ZlID0gdGhpcy5jYW52YXNQb2ludGVybW92ZS5iaW5kKHRoaXMpO1xuXHQgICNib3VuZENhbnZhc1BvaW50ZXJsZWF2ZSA9IHRoaXMuY2FudmFzUG9pbnRlcmxlYXZlLmJpbmQodGhpcyk7XG5cdCAgI2JvdW5kQ2FudmFzUG9pbnRlcnVwID0gdGhpcy5jYW52YXNQb2ludGVydXAuYmluZCh0aGlzKTtcblx0ICAjYm91bmRDYW52YXNQb2ludGVyZG93biA9IHRoaXMuY2FudmFzUG9pbnRlcmRvd24uYmluZCh0aGlzKTtcblx0ICAjZGlzYWJsZUVkaXRpbmcgPSBmYWxzZTtcblx0ICAjaXNDYW52YXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXHQgICNsYXN0UG9pbnQgPSBudWxsO1xuXHQgICNvYnNlcnZlciA9IG51bGw7XG5cdCAgI3JlYWxXaWR0aCA9IDA7XG5cdCAgI3JlYWxIZWlnaHQgPSAwO1xuXHQgICNyZXF1ZXN0RnJhbWVDYWxsYmFjayA9IG51bGw7XG5cdCAgc3RhdGljIF9kZWZhdWx0Q29sb3IgPSBudWxsO1xuXHQgIHN0YXRpYyBfZGVmYXVsdE9wYWNpdHkgPSAxO1xuXHQgIHN0YXRpYyBfZGVmYXVsdFRoaWNrbmVzcyA9IDE7XG5cdCAgc3RhdGljIF9sMTBuUHJvbWlzZTtcblx0ICBzdGF0aWMgX3R5cGUgPSBcImlua1wiO1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuXHQgICAgc3VwZXIoe1xuXHQgICAgICAuLi5wYXJhbXMsXG5cdCAgICAgIG5hbWU6IFwiaW5rRWRpdG9yXCJcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5jb2xvciA9IHBhcmFtcy5jb2xvciB8fCBudWxsO1xuXHQgICAgdGhpcy50aGlja25lc3MgPSBwYXJhbXMudGhpY2tuZXNzIHx8IG51bGw7XG5cdCAgICB0aGlzLm9wYWNpdHkgPSBwYXJhbXMub3BhY2l0eSB8fCBudWxsO1xuXHQgICAgdGhpcy5wYXRocyA9IFtdO1xuXHQgICAgdGhpcy5iZXppZXJQYXRoMkQgPSBbXTtcblx0ICAgIHRoaXMuY3VycmVudFBhdGggPSBbXTtcblx0ICAgIHRoaXMuc2NhbGVGYWN0b3IgPSAxO1xuXHQgICAgdGhpcy50cmFuc2xhdGlvblggPSB0aGlzLnRyYW5zbGF0aW9uWSA9IDA7XG5cdCAgICB0aGlzLnggPSAwO1xuXHQgICAgdGhpcy55ID0gMDtcblx0ICB9XG5cdCAgc3RhdGljIGluaXRpYWxpemUobDEwbikge1xuXHQgICAgdGhpcy5fbDEwblByb21pc2UgPSBuZXcgTWFwKFtcImVkaXRvcl9pbmtfY2FudmFzX2FyaWFfbGFiZWxcIiwgXCJlZGl0b3JfaW5rMl9hcmlhX2xhYmVsXCJdLm1hcChzdHIgPT4gW3N0ciwgbDEwbi5nZXQoc3RyKV0pKTtcblx0ICB9XG5cdCAgc3RhdGljIHVwZGF0ZURlZmF1bHRQYXJhbXModHlwZSwgdmFsdWUpIHtcblx0ICAgIHN3aXRjaCAodHlwZSkge1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6XG5cdCAgICAgICAgSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzID0gdmFsdWU7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SOlxuXHQgICAgICAgIElua0VkaXRvci5fZGVmYXVsdENvbG9yID0gdmFsdWU7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFk6XG5cdCAgICAgICAgSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eSA9IHZhbHVlIC8gMTAwO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgfVxuXHQgIH1cblx0ICB1cGRhdGVQYXJhbXModHlwZSwgdmFsdWUpIHtcblx0ICAgIHN3aXRjaCAodHlwZSkge1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1M6XG5cdCAgICAgICAgdGhpcy4jdXBkYXRlVGhpY2tuZXNzKHZhbHVlKTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1I6XG5cdCAgICAgICAgdGhpcy4jdXBkYXRlQ29sb3IodmFsdWUpO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZOlxuXHQgICAgICAgIHRoaXMuI3VwZGF0ZU9wYWNpdHkodmFsdWUpO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wZXJ0aWVzVG9VcGRhdGUoKSB7XG5cdCAgICByZXR1cm4gW1tfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfVEhJQ0tORVNTLCBJbmtFZGl0b3IuX2RlZmF1bHRUaGlja25lc3NdLCBbX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX0NPTE9SLCBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3JdLCBbX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksIE1hdGgucm91bmQoSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eSAqIDEwMCldXTtcblx0ICB9XG5cdCAgZ2V0IHByb3BlcnRpZXNUb1VwZGF0ZSgpIHtcblx0ICAgIHJldHVybiBbW191dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsIHRoaXMudGhpY2tuZXNzIHx8IElua0VkaXRvci5fZGVmYXVsdFRoaWNrbmVzc10sIFtfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZS5JTktfQ09MT1IsIHRoaXMuY29sb3IgfHwgSW5rRWRpdG9yLl9kZWZhdWx0Q29sb3IgfHwgX2VkaXRvci5Bbm5vdGF0aW9uRWRpdG9yLl9kZWZhdWx0TGluZUNvbG9yXSwgW191dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19PUEFDSVRZLCBNYXRoLnJvdW5kKDEwMCAqICh0aGlzLm9wYWNpdHkgPz8gSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eSkpXV07XG5cdCAgfVxuXHQgICN1cGRhdGVUaGlja25lc3ModGhpY2tuZXNzKSB7XG5cdCAgICBjb25zdCBzYXZlZFRoaWNrbmVzcyA9IHRoaXMudGhpY2tuZXNzO1xuXHQgICAgdGhpcy5hZGRDb21tYW5kcyh7XG5cdCAgICAgIGNtZDogKCkgPT4ge1xuXHQgICAgICAgIHRoaXMudGhpY2tuZXNzID0gdGhpY2tuZXNzO1xuXHQgICAgICAgIHRoaXMuI2ZpdFRvQ29udGVudCgpO1xuXHQgICAgICB9LFxuXHQgICAgICB1bmRvOiAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy50aGlja25lc3MgPSBzYXZlZFRoaWNrbmVzcztcblx0ICAgICAgICB0aGlzLiNmaXRUb0NvbnRlbnQoKTtcblx0ICAgICAgfSxcblx0ICAgICAgbXVzdEV4ZWM6IHRydWUsXG5cdCAgICAgIHR5cGU6IF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19USElDS05FU1MsXG5cdCAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG5cdCAgICAgIGtlZXBVbmRvOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgI3VwZGF0ZUNvbG9yKGNvbG9yKSB7XG5cdCAgICBjb25zdCBzYXZlZENvbG9yID0gdGhpcy5jb2xvcjtcblx0ICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuXHQgICAgICBjbWQ6ICgpID0+IHtcblx0ICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7XG5cdCAgICAgICAgdGhpcy4jcmVkcmF3KCk7XG5cdCAgICAgIH0sXG5cdCAgICAgIHVuZG86ICgpID0+IHtcblx0ICAgICAgICB0aGlzLmNvbG9yID0gc2F2ZWRDb2xvcjtcblx0ICAgICAgICB0aGlzLiNyZWRyYXcoKTtcblx0ICAgICAgfSxcblx0ICAgICAgbXVzdEV4ZWM6IHRydWUsXG5cdCAgICAgIHR5cGU6IF91dGlsLkFubm90YXRpb25FZGl0b3JQYXJhbXNUeXBlLklOS19DT0xPUixcblx0ICAgICAgb3ZlcndyaXRlSWZTYW1lVHlwZTogdHJ1ZSxcblx0ICAgICAga2VlcFVuZG86IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICAjdXBkYXRlT3BhY2l0eShvcGFjaXR5KSB7XG5cdCAgICBvcGFjaXR5IC89IDEwMDtcblx0ICAgIGNvbnN0IHNhdmVkT3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblx0ICAgIHRoaXMuYWRkQ29tbWFuZHMoe1xuXHQgICAgICBjbWQ6ICgpID0+IHtcblx0ICAgICAgICB0aGlzLm9wYWNpdHkgPSBvcGFjaXR5O1xuXHQgICAgICAgIHRoaXMuI3JlZHJhdygpO1xuXHQgICAgICB9LFxuXHQgICAgICB1bmRvOiAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy5vcGFjaXR5ID0gc2F2ZWRPcGFjaXR5O1xuXHQgICAgICAgIHRoaXMuI3JlZHJhdygpO1xuXHQgICAgICB9LFxuXHQgICAgICBtdXN0RXhlYzogdHJ1ZSxcblx0ICAgICAgdHlwZTogX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGUuSU5LX09QQUNJVFksXG5cdCAgICAgIG92ZXJ3cml0ZUlmU2FtZVR5cGU6IHRydWUsXG5cdCAgICAgIGtlZXBVbmRvOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVidWlsZCgpIHtcblx0ICAgIHN1cGVyLnJlYnVpbGQoKTtcblx0ICAgIGlmICh0aGlzLmRpdiA9PT0gbnVsbCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuY2FudmFzKSB7XG5cdCAgICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuXHQgICAgICB0aGlzLiNjcmVhdGVPYnNlcnZlcigpO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWRUb0RPTSkge1xuXHQgICAgICB0aGlzLnBhcmVudC5hZGQodGhpcyk7XG5cdCAgICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI2ZpdFRvQ29udGVudCgpO1xuXHQgIH1cblx0ICByZW1vdmUoKSB7XG5cdCAgICBpZiAodGhpcy5jYW52YXMgPT09IG51bGwpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0aGlzLmlzRW1wdHkoKSkge1xuXHQgICAgICB0aGlzLmNvbW1pdCgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5oZWlnaHQgPSAwO1xuXHQgICAgdGhpcy5jYW52YXMucmVtb3ZlKCk7XG5cdCAgICB0aGlzLmNhbnZhcyA9IG51bGw7XG5cdCAgICB0aGlzLiNvYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cdCAgICB0aGlzLiNvYnNlcnZlciA9IG51bGw7XG5cdCAgICBzdXBlci5yZW1vdmUoKTtcblx0ICB9XG5cdCAgc2V0UGFyZW50KHBhcmVudCkge1xuXHQgICAgaWYgKCF0aGlzLnBhcmVudCAmJiBwYXJlbnQpIHtcblx0ICAgICAgdGhpcy5fdWlNYW5hZ2VyLnJlbW92ZVNob3VsZFJlc2NhbGUodGhpcyk7XG5cdCAgICB9IGVsc2UgaWYgKHRoaXMucGFyZW50ICYmIHBhcmVudCA9PT0gbnVsbCkge1xuXHQgICAgICB0aGlzLl91aU1hbmFnZXIuYWRkU2hvdWxkUmVzY2FsZSh0aGlzKTtcblx0ICAgIH1cblx0ICAgIHN1cGVyLnNldFBhcmVudChwYXJlbnQpO1xuXHQgIH1cblx0ICBvblNjYWxlQ2hhbmdpbmcoKSB7XG5cdCAgICBjb25zdCBbcGFyZW50V2lkdGgsIHBhcmVudEhlaWdodF0gPSB0aGlzLnBhcmVudERpbWVuc2lvbnM7XG5cdCAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aDtcblx0ICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0O1xuXHQgICAgdGhpcy5zZXREaW1lbnNpb25zKHdpZHRoLCBoZWlnaHQpO1xuXHQgIH1cblx0ICBlbmFibGVFZGl0TW9kZSgpIHtcblx0ICAgIGlmICh0aGlzLiNkaXNhYmxlRWRpdGluZyB8fCB0aGlzLmNhbnZhcyA9PT0gbnVsbCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBzdXBlci5lbmFibGVFZGl0TW9kZSgpO1xuXHQgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gZmFsc2U7XG5cdCAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93bik7XG5cdCAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcnVwKTtcblx0ICB9XG5cdCAgZGlzYWJsZUVkaXRNb2RlKCkge1xuXHQgICAgaWYgKCF0aGlzLmlzSW5FZGl0TW9kZSgpIHx8IHRoaXMuY2FudmFzID09PSBudWxsKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHN1cGVyLmRpc2FibGVFZGl0TW9kZSgpO1xuXHQgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuXHQgICAgdGhpcy5kaXYuY2xhc3NMaXN0LnJlbW92ZShcImVkaXRpbmdcIik7XG5cdCAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVyZG93bik7XG5cdCAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcnVwKTtcblx0ICB9XG5cdCAgb25jZUFkZGVkKCkge1xuXHQgICAgdGhpcy5kaXYuZHJhZ2dhYmxlID0gIXRoaXMuaXNFbXB0eSgpO1xuXHQgIH1cblx0ICBpc0VtcHR5KCkge1xuXHQgICAgcmV0dXJuIHRoaXMucGF0aHMubGVuZ3RoID09PSAwIHx8IHRoaXMucGF0aHMubGVuZ3RoID09PSAxICYmIHRoaXMucGF0aHNbMF0ubGVuZ3RoID09PSAwO1xuXHQgIH1cblx0ICAjZ2V0SW5pdGlhbEJCb3goKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHBhcmVudFJvdGF0aW9uLFxuXHQgICAgICBwYXJlbnREaW1lbnNpb25zOiBbd2lkdGgsIGhlaWdodF1cblx0ICAgIH0gPSB0aGlzO1xuXHQgICAgc3dpdGNoIChwYXJlbnRSb3RhdGlvbikge1xuXHQgICAgICBjYXNlIDkwOlxuXHQgICAgICAgIHJldHVybiBbMCwgaGVpZ2h0LCBoZWlnaHQsIHdpZHRoXTtcblx0ICAgICAgY2FzZSAxODA6XG5cdCAgICAgICAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0XTtcblx0ICAgICAgY2FzZSAyNzA6XG5cdCAgICAgICAgcmV0dXJuIFt3aWR0aCwgMCwgaGVpZ2h0LCB3aWR0aF07XG5cdCAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgcmV0dXJuIFswLCAwLCB3aWR0aCwgaGVpZ2h0XTtcblx0ICAgIH1cblx0ICB9XG5cdCAgI3NldFN0cm9rZSgpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgY3R4LFxuXHQgICAgICBjb2xvcixcblx0ICAgICAgb3BhY2l0eSxcblx0ICAgICAgdGhpY2tuZXNzLFxuXHQgICAgICBwYXJlbnRTY2FsZSxcblx0ICAgICAgc2NhbGVGYWN0b3Jcblx0ICAgIH0gPSB0aGlzO1xuXHQgICAgY3R4LmxpbmVXaWR0aCA9IHRoaWNrbmVzcyAqIHBhcmVudFNjYWxlIC8gc2NhbGVGYWN0b3I7XG5cdCAgICBjdHgubGluZUNhcCA9IFwicm91bmRcIjtcblx0ICAgIGN0eC5saW5lSm9pbiA9IFwicm91bmRcIjtcblx0ICAgIGN0eC5taXRlckxpbWl0ID0gMTA7XG5cdCAgICBjdHguc3Ryb2tlU3R5bGUgPSBgJHtjb2xvcn0keygwLCBfdG9vbHMub3BhY2l0eVRvSGV4KShvcGFjaXR5KX1gO1xuXHQgIH1cblx0ICAjc3RhcnREcmF3aW5nKHgsIHkpIHtcblx0ICAgIHRoaXMuaXNFZGl0aW5nID0gdHJ1ZTtcblx0ICAgIGlmICghdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCkge1xuXHQgICAgICB0aGlzLiNpc0NhbnZhc0luaXRpYWxpemVkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy4jc2V0Q2FudmFzRGltcygpO1xuXHQgICAgICB0aGlzLnRoaWNrbmVzcyB8fD0gSW5rRWRpdG9yLl9kZWZhdWx0VGhpY2tuZXNzO1xuXHQgICAgICB0aGlzLmNvbG9yIHx8PSBJbmtFZGl0b3IuX2RlZmF1bHRDb2xvciB8fCBfZWRpdG9yLkFubm90YXRpb25FZGl0b3IuX2RlZmF1bHRMaW5lQ29sb3I7XG5cdCAgICAgIHRoaXMub3BhY2l0eSA/Pz0gSW5rRWRpdG9yLl9kZWZhdWx0T3BhY2l0eTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY3VycmVudFBhdGgucHVzaChbeCwgeV0pO1xuXHQgICAgdGhpcy4jbGFzdFBvaW50ID0gbnVsbDtcblx0ICAgIHRoaXMuI3NldFN0cm9rZSgpO1xuXHQgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG5cdCAgICB0aGlzLmN0eC5tb3ZlVG8oeCwgeSk7XG5cdCAgICB0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjayA9ICgpID0+IHtcblx0ICAgICAgaWYgKCF0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjaykge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy4jbGFzdFBvaW50KSB7XG5cdCAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XG5cdCAgICAgICAgICB0aGlzLmN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG5cdCAgICAgICAgICB0aGlzLmN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuI3JlZHJhdygpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmN0eC5saW5lVG8oLi4udGhpcy4jbGFzdFBvaW50KTtcblx0ICAgICAgICB0aGlzLiNsYXN0UG9pbnQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuY3R4LnN0cm9rZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2spO1xuXHQgICAgfTtcblx0ICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy4jcmVxdWVzdEZyYW1lQ2FsbGJhY2spO1xuXHQgIH1cblx0ICAjZHJhdyh4LCB5KSB7XG5cdCAgICBjb25zdCBbbGFzdFgsIGxhc3RZXSA9IHRoaXMuY3VycmVudFBhdGguYXQoLTEpO1xuXHQgICAgaWYgKHggPT09IGxhc3RYICYmIHkgPT09IGxhc3RZKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuY3VycmVudFBhdGgucHVzaChbeCwgeV0pO1xuXHQgICAgdGhpcy4jbGFzdFBvaW50ID0gW3gsIHldO1xuXHQgIH1cblx0ICAjc3RvcERyYXdpbmcoeCwgeSkge1xuXHQgICAgdGhpcy5jdHguY2xvc2VQYXRoKCk7XG5cdCAgICB0aGlzLiNyZXF1ZXN0RnJhbWVDYWxsYmFjayA9IG51bGw7XG5cdCAgICB4ID0gTWF0aC5taW4oTWF0aC5tYXgoeCwgMCksIHRoaXMuY2FudmFzLndpZHRoKTtcblx0ICAgIHkgPSBNYXRoLm1pbihNYXRoLm1heCh5LCAwKSwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcblx0ICAgIGNvbnN0IFtsYXN0WCwgbGFzdFldID0gdGhpcy5jdXJyZW50UGF0aC5hdCgtMSk7XG5cdCAgICBpZiAoeCAhPT0gbGFzdFggfHwgeSAhPT0gbGFzdFkpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50UGF0aC5wdXNoKFt4LCB5XSk7XG5cdCAgICB9XG5cdCAgICBsZXQgYmV6aWVyO1xuXHQgICAgaWYgKHRoaXMuY3VycmVudFBhdGgubGVuZ3RoICE9PSAxKSB7XG5cdCAgICAgIGJlemllciA9ICgwLCBfcGRmanNGaXRDdXJ2ZS5maXRDdXJ2ZSkodGhpcy5jdXJyZW50UGF0aCwgMzAsIG51bGwpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc3QgeHkgPSBbeCwgeV07XG5cdCAgICAgIGJlemllciA9IFtbeHksIHh5LnNsaWNlKCksIHh5LnNsaWNlKCksIHh5XV07XG5cdCAgICB9XG5cdCAgICBjb25zdCBwYXRoMkQgPSBJbmtFZGl0b3IuI2J1aWxkUGF0aDJEKGJlemllcik7XG5cdCAgICB0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCA9IDA7XG5cdCAgICBjb25zdCBjbWQgPSAoKSA9PiB7XG5cdCAgICAgIHRoaXMucGF0aHMucHVzaChiZXppZXIpO1xuXHQgICAgICB0aGlzLmJlemllclBhdGgyRC5wdXNoKHBhdGgyRCk7XG5cdCAgICAgIHRoaXMucmVidWlsZCgpO1xuXHQgICAgfTtcblx0ICAgIGNvbnN0IHVuZG8gPSAoKSA9PiB7XG5cdCAgICAgIHRoaXMucGF0aHMucG9wKCk7XG5cdCAgICAgIHRoaXMuYmV6aWVyUGF0aDJELnBvcCgpO1xuXHQgICAgICBpZiAodGhpcy5wYXRocy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICB0aGlzLnJlbW92ZSgpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGlmICghdGhpcy5jYW52YXMpIHtcblx0ICAgICAgICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuXHQgICAgICAgICAgdGhpcy4jY3JlYXRlT2JzZXJ2ZXIoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy4jZml0VG9Db250ZW50KCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICB0aGlzLmFkZENvbW1hbmRzKHtcblx0ICAgICAgY21kLFxuXHQgICAgICB1bmRvLFxuXHQgICAgICBtdXN0RXhlYzogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgICNyZWRyYXcoKSB7XG5cdCAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcblx0ICAgICAgdGhpcy4jdXBkYXRlVHJhbnNmb3JtKCk7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3NldFN0cm9rZSgpO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBjYW52YXMsXG5cdCAgICAgIGN0eFxuXHQgICAgfSA9IHRoaXM7XG5cdCAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuXHQgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuXHQgICAgdGhpcy4jdXBkYXRlVHJhbnNmb3JtKCk7XG5cdCAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5iZXppZXJQYXRoMkQpIHtcblx0ICAgICAgY3R4LnN0cm9rZShwYXRoKTtcblx0ICAgIH1cblx0ICB9XG5cdCAgY29tbWl0KCkge1xuXHQgICAgaWYgKHRoaXMuI2Rpc2FibGVFZGl0aW5nKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHN1cGVyLmNvbW1pdCgpO1xuXHQgICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcblx0ICAgIHRoaXMuZGlzYWJsZUVkaXRNb2RlKCk7XG5cdCAgICB0aGlzLnNldEluRm9yZWdyb3VuZCgpO1xuXHQgICAgdGhpcy4jZGlzYWJsZUVkaXRpbmcgPSB0cnVlO1xuXHQgICAgdGhpcy5kaXYuY2xhc3NMaXN0LmFkZChcImRpc2FibGVkXCIpO1xuXHQgICAgdGhpcy4jZml0VG9Db250ZW50KHRydWUpO1xuXHQgICAgdGhpcy5wYXJlbnQuYWRkSW5rRWRpdG9ySWZOZWVkZWQodHJ1ZSk7XG5cdCAgICB0aGlzLnBhcmVudC5tb3ZlRWRpdG9ySW5ET00odGhpcyk7XG5cdCAgICB0aGlzLmRpdi5mb2N1cyh7XG5cdCAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICBmb2N1c2luKGV2ZW50KSB7XG5cdCAgICBzdXBlci5mb2N1c2luKGV2ZW50KTtcblx0ICAgIHRoaXMuZW5hYmxlRWRpdE1vZGUoKTtcblx0ICB9XG5cdCAgY2FudmFzUG9pbnRlcmRvd24oZXZlbnQpIHtcblx0ICAgIGlmIChldmVudC5idXR0b24gIT09IDAgfHwgIXRoaXMuaXNJbkVkaXRNb2RlKCkgfHwgdGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgdGhpcy5zZXRJbkZvcmVncm91bmQoKTtcblx0ICAgIGlmIChldmVudC50eXBlICE9PSBcIm1vdXNlXCIpIHtcblx0ICAgICAgdGhpcy5kaXYuZm9jdXMoKTtcblx0ICAgIH1cblx0ICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgdGhpcy5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJsZWF2ZSk7XG5cdCAgICB0aGlzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcm1vdmVcIiwgdGhpcy4jYm91bmRDYW52YXNQb2ludGVybW92ZSk7XG5cdCAgICB0aGlzLiNzdGFydERyYXdpbmcoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG5cdCAgfVxuXHQgIGNhbnZhc1BvaW50ZXJtb3ZlKGV2ZW50KSB7XG5cdCAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgIHRoaXMuI2RyYXcoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG5cdCAgfVxuXHQgIGNhbnZhc1BvaW50ZXJ1cChldmVudCkge1xuXHQgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5pc0luRWRpdE1vZGUoKSAmJiB0aGlzLmN1cnJlbnRQYXRoLmxlbmd0aCAhPT0gMCkge1xuXHQgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgdGhpcy4jZW5kRHJhd2luZyhldmVudCk7XG5cdCAgICAgIHRoaXMuc2V0SW5CYWNrZ3JvdW5kKCk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGNhbnZhc1BvaW50ZXJsZWF2ZShldmVudCkge1xuXHQgICAgdGhpcy4jZW5kRHJhd2luZyhldmVudCk7XG5cdCAgICB0aGlzLnNldEluQmFja2dyb3VuZCgpO1xuXHQgIH1cblx0ICAjZW5kRHJhd2luZyhldmVudCkge1xuXHQgICAgdGhpcy4jc3RvcERyYXdpbmcoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG5cdCAgICB0aGlzLmNhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmxlYXZlXCIsIHRoaXMuI2JvdW5kQ2FudmFzUG9pbnRlcmxlYXZlKTtcblx0ICAgIHRoaXMuY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCB0aGlzLiNib3VuZENhbnZhc1BvaW50ZXJtb3ZlKTtcblx0ICAgIHRoaXMuYWRkVG9Bbm5vdGF0aW9uU3RvcmFnZSgpO1xuXHQgIH1cblx0ICAjY3JlYXRlQ2FudmFzKCkge1xuXHQgICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuXHQgICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLmNhbnZhcy5oZWlnaHQgPSAwO1xuXHQgICAgdGhpcy5jYW52YXMuY2xhc3NOYW1lID0gXCJpbmtFZGl0b3JDYW52YXNcIjtcblx0ICAgIElua0VkaXRvci5fbDEwblByb21pc2UuZ2V0KFwiZWRpdG9yX2lua19jYW52YXNfYXJpYV9sYWJlbFwiKS50aGVuKG1zZyA9PiB0aGlzLmNhbnZhcz8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBtc2cpKTtcblx0ICAgIHRoaXMuZGl2LmFwcGVuZCh0aGlzLmNhbnZhcyk7XG5cdCAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcblx0ICB9XG5cdCAgI2NyZWF0ZU9ic2VydmVyKCkge1xuXHQgICAgdGhpcy4jb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG5cdCAgICAgIGNvbnN0IHJlY3QgPSBlbnRyaWVzWzBdLmNvbnRlbnRSZWN0O1xuXHQgICAgICBpZiAocmVjdC53aWR0aCAmJiByZWN0LmhlaWdodCkge1xuXHQgICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucyhyZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgdGhpcy4jb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmRpdik7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGlmICh0aGlzLmRpdikge1xuXHQgICAgICByZXR1cm4gdGhpcy5kaXY7XG5cdCAgICB9XG5cdCAgICBsZXQgYmFzZVgsIGJhc2VZO1xuXHQgICAgaWYgKHRoaXMud2lkdGgpIHtcblx0ICAgICAgYmFzZVggPSB0aGlzLng7XG5cdCAgICAgIGJhc2VZID0gdGhpcy55O1xuXHQgICAgfVxuXHQgICAgc3VwZXIucmVuZGVyKCk7XG5cdCAgICBJbmtFZGl0b3IuX2wxMG5Qcm9taXNlLmdldChcImVkaXRvcl9pbmsyX2FyaWFfbGFiZWxcIikudGhlbihtc2cgPT4gdGhpcy5kaXY/LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgbXNnKSk7XG5cdCAgICBjb25zdCBbeCwgeSwgdywgaF0gPSB0aGlzLiNnZXRJbml0aWFsQkJveCgpO1xuXHQgICAgdGhpcy5zZXRBdCh4LCB5LCAwLCAwKTtcblx0ICAgIHRoaXMuc2V0RGltcyh3LCBoKTtcblx0ICAgIHRoaXMuI2NyZWF0ZUNhbnZhcygpO1xuXHQgICAgaWYgKHRoaXMud2lkdGgpIHtcblx0ICAgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgICB0aGlzLnNldEF0KGJhc2VYICogcGFyZW50V2lkdGgsIGJhc2VZICogcGFyZW50SGVpZ2h0LCB0aGlzLndpZHRoICogcGFyZW50V2lkdGgsIHRoaXMuaGVpZ2h0ICogcGFyZW50SGVpZ2h0KTtcblx0ICAgICAgdGhpcy4jaXNDYW52YXNJbml0aWFsaXplZCA9IHRydWU7XG5cdCAgICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcblx0ICAgICAgdGhpcy5zZXREaW1zKHRoaXMud2lkdGggKiBwYXJlbnRXaWR0aCwgdGhpcy5oZWlnaHQgKiBwYXJlbnRIZWlnaHQpO1xuXHQgICAgICB0aGlzLiNyZWRyYXcoKTtcblx0ICAgICAgdGhpcy4jc2V0TWluRGltcygpO1xuXHQgICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIik7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmRpdi5jbGFzc0xpc3QuYWRkKFwiZWRpdGluZ1wiKTtcblx0ICAgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jY3JlYXRlT2JzZXJ2ZXIoKTtcblx0ICAgIHJldHVybiB0aGlzLmRpdjtcblx0ICB9XG5cdCAgI3NldENhbnZhc0RpbXMoKSB7XG5cdCAgICBpZiAoIXRoaXMuI2lzQ2FudmFzSW5pdGlhbGl6ZWQpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgdGhpcy5jYW52YXMud2lkdGggPSBNYXRoLmNlaWwodGhpcy53aWR0aCAqIHBhcmVudFdpZHRoKTtcblx0ICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IE1hdGguY2VpbCh0aGlzLmhlaWdodCAqIHBhcmVudEhlaWdodCk7XG5cdCAgICB0aGlzLiN1cGRhdGVUcmFuc2Zvcm0oKTtcblx0ICB9XG5cdCAgc2V0RGltZW5zaW9ucyh3aWR0aCwgaGVpZ2h0KSB7XG5cdCAgICBjb25zdCByb3VuZGVkV2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoKTtcblx0ICAgIGNvbnN0IHJvdW5kZWRIZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCk7XG5cdCAgICBpZiAodGhpcy4jcmVhbFdpZHRoID09PSByb3VuZGVkV2lkdGggJiYgdGhpcy4jcmVhbEhlaWdodCA9PT0gcm91bmRlZEhlaWdodCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB0aGlzLiNyZWFsV2lkdGggPSByb3VuZGVkV2lkdGg7XG5cdCAgICB0aGlzLiNyZWFsSGVpZ2h0ID0gcm91bmRlZEhlaWdodDtcblx0ICAgIHRoaXMuY2FudmFzLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuXHQgICAgaWYgKHRoaXMuI2FzcGVjdFJhdGlvICYmIE1hdGguYWJzKHRoaXMuI2FzcGVjdFJhdGlvIC0gd2lkdGggLyBoZWlnaHQpID4gMWUtMikge1xuXHQgICAgICBoZWlnaHQgPSBNYXRoLmNlaWwod2lkdGggLyB0aGlzLiNhc3BlY3RSYXRpbyk7XG5cdCAgICAgIHRoaXMuc2V0RGltcyh3aWR0aCwgaGVpZ2h0KTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IFtwYXJlbnRXaWR0aCwgcGFyZW50SGVpZ2h0XSA9IHRoaXMucGFyZW50RGltZW5zaW9ucztcblx0ICAgIHRoaXMud2lkdGggPSB3aWR0aCAvIHBhcmVudFdpZHRoO1xuXHQgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQgLyBwYXJlbnRIZWlnaHQ7XG5cdCAgICBpZiAodGhpcy4jZGlzYWJsZUVkaXRpbmcpIHtcblx0ICAgICAgdGhpcy4jc2V0U2NhbGVGYWN0b3Iod2lkdGgsIGhlaWdodCk7XG5cdCAgICB9XG5cdCAgICB0aGlzLiNzZXRDYW52YXNEaW1zKCk7XG5cdCAgICB0aGlzLiNyZWRyYXcoKTtcblx0ICAgIHRoaXMuY2FudmFzLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcblx0ICAgIHRoaXMuZml4RGltcygpO1xuXHQgIH1cblx0ICAjc2V0U2NhbGVGYWN0b3Iod2lkdGgsIGhlaWdodCkge1xuXHQgICAgY29uc3QgcGFkZGluZyA9IHRoaXMuI2dldFBhZGRpbmcoKTtcblx0ICAgIGNvbnN0IHNjYWxlRmFjdG9yVyA9ICh3aWR0aCAtIHBhZGRpbmcpIC8gdGhpcy4jYmFzZVdpZHRoO1xuXHQgICAgY29uc3Qgc2NhbGVGYWN0b3JIID0gKGhlaWdodCAtIHBhZGRpbmcpIC8gdGhpcy4jYmFzZUhlaWdodDtcblx0ICAgIHRoaXMuc2NhbGVGYWN0b3IgPSBNYXRoLm1pbihzY2FsZUZhY3RvclcsIHNjYWxlRmFjdG9ySCk7XG5cdCAgfVxuXHQgICN1cGRhdGVUcmFuc2Zvcm0oKSB7XG5cdCAgICBjb25zdCBwYWRkaW5nID0gdGhpcy4jZ2V0UGFkZGluZygpIC8gMjtcblx0ICAgIHRoaXMuY3R4LnNldFRyYW5zZm9ybSh0aGlzLnNjYWxlRmFjdG9yLCAwLCAwLCB0aGlzLnNjYWxlRmFjdG9yLCB0aGlzLnRyYW5zbGF0aW9uWCAqIHRoaXMuc2NhbGVGYWN0b3IgKyBwYWRkaW5nLCB0aGlzLnRyYW5zbGF0aW9uWSAqIHRoaXMuc2NhbGVGYWN0b3IgKyBwYWRkaW5nKTtcblx0ICB9XG5cdCAgc3RhdGljICNidWlsZFBhdGgyRChiZXppZXIpIHtcblx0ICAgIGNvbnN0IHBhdGgyRCA9IG5ldyBQYXRoMkQoKTtcblx0ICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGJlemllci5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdCAgICAgIGNvbnN0IFtmaXJzdCwgY29udHJvbDEsIGNvbnRyb2wyLCBzZWNvbmRdID0gYmV6aWVyW2ldO1xuXHQgICAgICBpZiAoaSA9PT0gMCkge1xuXHQgICAgICAgIHBhdGgyRC5tb3ZlVG8oLi4uZmlyc3QpO1xuXHQgICAgICB9XG5cdCAgICAgIHBhdGgyRC5iZXppZXJDdXJ2ZVRvKGNvbnRyb2wxWzBdLCBjb250cm9sMVsxXSwgY29udHJvbDJbMF0sIGNvbnRyb2wyWzFdLCBzZWNvbmRbMF0sIHNlY29uZFsxXSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcGF0aDJEO1xuXHQgIH1cblx0ICAjc2VyaWFsaXplUGF0aHMocywgdHgsIHR5LCBoKSB7XG5cdCAgICBjb25zdCBOVU1CRVJfT0ZfUE9JTlRTX09OX0JFWklFUl9DVVJWRSA9IDQ7XG5cdCAgICBjb25zdCBwYXRocyA9IFtdO1xuXHQgICAgY29uc3QgcGFkZGluZyA9IHRoaXMudGhpY2tuZXNzIC8gMjtcblx0ICAgIGxldCBidWZmZXIsIHBvaW50cztcblx0ICAgIGZvciAoY29uc3QgYmV6aWVyIG9mIHRoaXMucGF0aHMpIHtcblx0ICAgICAgYnVmZmVyID0gW107XG5cdCAgICAgIHBvaW50cyA9IFtdO1xuXHQgICAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBiZXppZXIubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuXHQgICAgICAgIGNvbnN0IFtmaXJzdCwgY29udHJvbDEsIGNvbnRyb2wyLCBzZWNvbmRdID0gYmV6aWVyW2ldO1xuXHQgICAgICAgIGNvbnN0IHAxMCA9IHMgKiAoZmlyc3RbMF0gKyB0eCkgKyBwYWRkaW5nO1xuXHQgICAgICAgIGNvbnN0IHAxMSA9IGggLSBzICogKGZpcnN0WzFdICsgdHkpIC0gcGFkZGluZztcblx0ICAgICAgICBjb25zdCBwMjAgPSBzICogKGNvbnRyb2wxWzBdICsgdHgpICsgcGFkZGluZztcblx0ICAgICAgICBjb25zdCBwMjEgPSBoIC0gcyAqIChjb250cm9sMVsxXSArIHR5KSAtIHBhZGRpbmc7XG5cdCAgICAgICAgY29uc3QgcDMwID0gcyAqIChjb250cm9sMlswXSArIHR4KSArIHBhZGRpbmc7XG5cdCAgICAgICAgY29uc3QgcDMxID0gaCAtIHMgKiAoY29udHJvbDJbMV0gKyB0eSkgLSBwYWRkaW5nO1xuXHQgICAgICAgIGNvbnN0IHA0MCA9IHMgKiAoc2Vjb25kWzBdICsgdHgpICsgcGFkZGluZztcblx0ICAgICAgICBjb25zdCBwNDEgPSBoIC0gcyAqIChzZWNvbmRbMV0gKyB0eSkgLSBwYWRkaW5nO1xuXHQgICAgICAgIGlmIChpID09PSAwKSB7XG5cdCAgICAgICAgICBidWZmZXIucHVzaChwMTAsIHAxMSk7XG5cdCAgICAgICAgICBwb2ludHMucHVzaChwMTAsIHAxMSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGJ1ZmZlci5wdXNoKHAyMCwgcDIxLCBwMzAsIHAzMSwgcDQwLCBwNDEpO1xuXHQgICAgICAgIHRoaXMuI2V4dHJhY3RQb2ludHNPbkJlemllcihwMTAsIHAxMSwgcDIwLCBwMjEsIHAzMCwgcDMxLCBwNDAsIHA0MSwgTlVNQkVSX09GX1BPSU5UU19PTl9CRVpJRVJfQ1VSVkUsIHBvaW50cyk7XG5cdCAgICAgIH1cblx0ICAgICAgcGF0aHMucHVzaCh7XG5cdCAgICAgICAgYmV6aWVyOiBidWZmZXIsXG5cdCAgICAgICAgcG9pbnRzXG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHBhdGhzO1xuXHQgIH1cblx0ICAjZXh0cmFjdFBvaW50c09uQmV6aWVyKHAxMCwgcDExLCBwMjAsIHAyMSwgcDMwLCBwMzEsIHA0MCwgcDQxLCBuLCBwb2ludHMpIHtcblx0ICAgIGlmICh0aGlzLiNpc0FsbW9zdEZsYXQocDEwLCBwMTEsIHAyMCwgcDIxLCBwMzAsIHAzMSwgcDQwLCBwNDEpKSB7XG5cdCAgICAgIHBvaW50cy5wdXNoKHA0MCwgcDQxKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuIC0gMTsgaSsrKSB7XG5cdCAgICAgIGNvbnN0IHQgPSBpIC8gbjtcblx0ICAgICAgY29uc3QgbXQgPSAxIC0gdDtcblx0ICAgICAgbGV0IHExMCA9IHQgKiBwMTAgKyBtdCAqIHAyMDtcblx0ICAgICAgbGV0IHExMSA9IHQgKiBwMTEgKyBtdCAqIHAyMTtcblx0ICAgICAgbGV0IHEyMCA9IHQgKiBwMjAgKyBtdCAqIHAzMDtcblx0ICAgICAgbGV0IHEyMSA9IHQgKiBwMjEgKyBtdCAqIHAzMTtcblx0ICAgICAgY29uc3QgcTMwID0gdCAqIHAzMCArIG10ICogcDQwO1xuXHQgICAgICBjb25zdCBxMzEgPSB0ICogcDMxICsgbXQgKiBwNDE7XG5cdCAgICAgIHExMCA9IHQgKiBxMTAgKyBtdCAqIHEyMDtcblx0ICAgICAgcTExID0gdCAqIHExMSArIG10ICogcTIxO1xuXHQgICAgICBxMjAgPSB0ICogcTIwICsgbXQgKiBxMzA7XG5cdCAgICAgIHEyMSA9IHQgKiBxMjEgKyBtdCAqIHEzMTtcblx0ICAgICAgcTEwID0gdCAqIHExMCArIG10ICogcTIwO1xuXHQgICAgICBxMTEgPSB0ICogcTExICsgbXQgKiBxMjE7XG5cdCAgICAgIHBvaW50cy5wdXNoKHExMCwgcTExKTtcblx0ICAgIH1cblx0ICAgIHBvaW50cy5wdXNoKHA0MCwgcDQxKTtcblx0ICB9XG5cdCAgI2lzQWxtb3N0RmxhdChwMTAsIHAxMSwgcDIwLCBwMjEsIHAzMCwgcDMxLCBwNDAsIHA0MSkge1xuXHQgICAgY29uc3QgdG9sID0gMTA7XG5cdCAgICBjb25zdCBheCA9ICgzICogcDIwIC0gMiAqIHAxMCAtIHA0MCkgKiogMjtcblx0ICAgIGNvbnN0IGF5ID0gKDMgKiBwMjEgLSAyICogcDExIC0gcDQxKSAqKiAyO1xuXHQgICAgY29uc3QgYnggPSAoMyAqIHAzMCAtIHAxMCAtIDIgKiBwNDApICoqIDI7XG5cdCAgICBjb25zdCBieSA9ICgzICogcDMxIC0gcDExIC0gMiAqIHA0MSkgKiogMjtcblx0ICAgIHJldHVybiBNYXRoLm1heChheCwgYngpICsgTWF0aC5tYXgoYXksIGJ5KSA8PSB0b2w7XG5cdCAgfVxuXHQgICNnZXRCYm94KCkge1xuXHQgICAgbGV0IHhNaW4gPSBJbmZpbml0eTtcblx0ICAgIGxldCB4TWF4ID0gLUluZmluaXR5O1xuXHQgICAgbGV0IHlNaW4gPSBJbmZpbml0eTtcblx0ICAgIGxldCB5TWF4ID0gLUluZmluaXR5O1xuXHQgICAgZm9yIChjb25zdCBwYXRoIG9mIHRoaXMucGF0aHMpIHtcblx0ICAgICAgZm9yIChjb25zdCBbZmlyc3QsIGNvbnRyb2wxLCBjb250cm9sMiwgc2Vjb25kXSBvZiBwYXRoKSB7XG5cdCAgICAgICAgY29uc3QgYmJveCA9IF91dGlsLlV0aWwuYmV6aWVyQm91bmRpbmdCb3goLi4uZmlyc3QsIC4uLmNvbnRyb2wxLCAuLi5jb250cm9sMiwgLi4uc2Vjb25kKTtcblx0ICAgICAgICB4TWluID0gTWF0aC5taW4oeE1pbiwgYmJveFswXSk7XG5cdCAgICAgICAgeU1pbiA9IE1hdGgubWluKHlNaW4sIGJib3hbMV0pO1xuXHQgICAgICAgIHhNYXggPSBNYXRoLm1heCh4TWF4LCBiYm94WzJdKTtcblx0ICAgICAgICB5TWF4ID0gTWF0aC5tYXgoeU1heCwgYmJveFszXSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBbeE1pbiwgeU1pbiwgeE1heCwgeU1heF07XG5cdCAgfVxuXHQgICNnZXRQYWRkaW5nKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuI2Rpc2FibGVFZGl0aW5nID8gTWF0aC5jZWlsKHRoaXMudGhpY2tuZXNzICogdGhpcy5wYXJlbnRTY2FsZSkgOiAwO1xuXHQgIH1cblx0ICAjZml0VG9Db250ZW50KGZpcnN0VGltZSA9IGZhbHNlKSB7XG5cdCAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0aGlzLiNkaXNhYmxlRWRpdGluZykge1xuXHQgICAgICB0aGlzLiNyZWRyYXcoKTtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgYmJveCA9IHRoaXMuI2dldEJib3goKTtcblx0ICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLiNnZXRQYWRkaW5nKCk7XG5cdCAgICB0aGlzLiNiYXNlV2lkdGggPSBNYXRoLm1heChSRVNJWkVSX1NJWkUsIGJib3hbMl0gLSBiYm94WzBdKTtcblx0ICAgIHRoaXMuI2Jhc2VIZWlnaHQgPSBNYXRoLm1heChSRVNJWkVSX1NJWkUsIGJib3hbM10gLSBiYm94WzFdKTtcblx0ICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKHBhZGRpbmcgKyB0aGlzLiNiYXNlV2lkdGggKiB0aGlzLnNjYWxlRmFjdG9yKTtcblx0ICAgIGNvbnN0IGhlaWdodCA9IE1hdGguY2VpbChwYWRkaW5nICsgdGhpcy4jYmFzZUhlaWdodCAqIHRoaXMuc2NhbGVGYWN0b3IpO1xuXHQgICAgY29uc3QgW3BhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHRdID0gdGhpcy5wYXJlbnREaW1lbnNpb25zO1xuXHQgICAgdGhpcy53aWR0aCA9IHdpZHRoIC8gcGFyZW50V2lkdGg7XG5cdCAgICB0aGlzLmhlaWdodCA9IGhlaWdodCAvIHBhcmVudEhlaWdodDtcblx0ICAgIHRoaXMuI2FzcGVjdFJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG5cdCAgICB0aGlzLiNzZXRNaW5EaW1zKCk7XG5cdCAgICBjb25zdCBwcmV2VHJhbnNsYXRpb25YID0gdGhpcy50cmFuc2xhdGlvblg7XG5cdCAgICBjb25zdCBwcmV2VHJhbnNsYXRpb25ZID0gdGhpcy50cmFuc2xhdGlvblk7XG5cdCAgICB0aGlzLnRyYW5zbGF0aW9uWCA9IC1iYm94WzBdO1xuXHQgICAgdGhpcy50cmFuc2xhdGlvblkgPSAtYmJveFsxXTtcblx0ICAgIHRoaXMuI3NldENhbnZhc0RpbXMoKTtcblx0ICAgIHRoaXMuI3JlZHJhdygpO1xuXHQgICAgdGhpcy4jcmVhbFdpZHRoID0gd2lkdGg7XG5cdCAgICB0aGlzLiNyZWFsSGVpZ2h0ID0gaGVpZ2h0O1xuXHQgICAgdGhpcy5zZXREaW1zKHdpZHRoLCBoZWlnaHQpO1xuXHQgICAgY29uc3QgdW5zY2FsZWRQYWRkaW5nID0gZmlyc3RUaW1lID8gcGFkZGluZyAvIHRoaXMuc2NhbGVGYWN0b3IgLyAyIDogMDtcblx0ICAgIHRoaXMudHJhbnNsYXRlKHByZXZUcmFuc2xhdGlvblggLSB0aGlzLnRyYW5zbGF0aW9uWCAtIHVuc2NhbGVkUGFkZGluZywgcHJldlRyYW5zbGF0aW9uWSAtIHRoaXMudHJhbnNsYXRpb25ZIC0gdW5zY2FsZWRQYWRkaW5nKTtcblx0ICB9XG5cdCAgI3NldE1pbkRpbXMoKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHN0eWxlXG5cdCAgICB9ID0gdGhpcy5kaXY7XG5cdCAgICBpZiAodGhpcy4jYXNwZWN0UmF0aW8gPj0gMSkge1xuXHQgICAgICBzdHlsZS5taW5IZWlnaHQgPSBgJHtSRVNJWkVSX1NJWkV9cHhgO1xuXHQgICAgICBzdHlsZS5taW5XaWR0aCA9IGAke01hdGgucm91bmQodGhpcy4jYXNwZWN0UmF0aW8gKiBSRVNJWkVSX1NJWkUpfXB4YDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHN0eWxlLm1pbldpZHRoID0gYCR7UkVTSVpFUl9TSVpFfXB4YDtcblx0ICAgICAgc3R5bGUubWluSGVpZ2h0ID0gYCR7TWF0aC5yb3VuZChSRVNJWkVSX1NJWkUgLyB0aGlzLiNhc3BlY3RSYXRpbyl9cHhgO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YSwgcGFyZW50LCB1aU1hbmFnZXIpIHtcblx0ICAgIGNvbnN0IGVkaXRvciA9IHN1cGVyLmRlc2VyaWFsaXplKGRhdGEsIHBhcmVudCwgdWlNYW5hZ2VyKTtcblx0ICAgIGVkaXRvci50aGlja25lc3MgPSBkYXRhLnRoaWNrbmVzcztcblx0ICAgIGVkaXRvci5jb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKC4uLmRhdGEuY29sb3IpO1xuXHQgICAgZWRpdG9yLm9wYWNpdHkgPSBkYXRhLm9wYWNpdHk7XG5cdCAgICBjb25zdCBbcGFnZVdpZHRoLCBwYWdlSGVpZ2h0XSA9IGVkaXRvci5wYWdlRGltZW5zaW9ucztcblx0ICAgIGNvbnN0IHdpZHRoID0gZWRpdG9yLndpZHRoICogcGFnZVdpZHRoO1xuXHQgICAgY29uc3QgaGVpZ2h0ID0gZWRpdG9yLmhlaWdodCAqIHBhZ2VIZWlnaHQ7XG5cdCAgICBjb25zdCBzY2FsZUZhY3RvciA9IGVkaXRvci5wYXJlbnRTY2FsZTtcblx0ICAgIGNvbnN0IHBhZGRpbmcgPSBkYXRhLnRoaWNrbmVzcyAvIDI7XG5cdCAgICBlZGl0b3IuI2FzcGVjdFJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG5cdCAgICBlZGl0b3IuI2Rpc2FibGVFZGl0aW5nID0gdHJ1ZTtcblx0ICAgIGVkaXRvci4jcmVhbFdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCk7XG5cdCAgICBlZGl0b3IuI3JlYWxIZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCk7XG5cdCAgICBmb3IgKGNvbnN0IHtcblx0ICAgICAgYmV6aWVyXG5cdCAgICB9IG9mIGRhdGEucGF0aHMpIHtcblx0ICAgICAgY29uc3QgcGF0aCA9IFtdO1xuXHQgICAgICBlZGl0b3IucGF0aHMucHVzaChwYXRoKTtcblx0ICAgICAgbGV0IHAwID0gc2NhbGVGYWN0b3IgKiAoYmV6aWVyWzBdIC0gcGFkZGluZyk7XG5cdCAgICAgIGxldCBwMSA9IHNjYWxlRmFjdG9yICogKGhlaWdodCAtIGJlemllclsxXSAtIHBhZGRpbmcpO1xuXHQgICAgICBmb3IgKGxldCBpID0gMiwgaWkgPSBiZXppZXIubGVuZ3RoOyBpIDwgaWk7IGkgKz0gNikge1xuXHQgICAgICAgIGNvbnN0IHAxMCA9IHNjYWxlRmFjdG9yICogKGJlemllcltpXSAtIHBhZGRpbmcpO1xuXHQgICAgICAgIGNvbnN0IHAxMSA9IHNjYWxlRmFjdG9yICogKGhlaWdodCAtIGJlemllcltpICsgMV0gLSBwYWRkaW5nKTtcblx0ICAgICAgICBjb25zdCBwMjAgPSBzY2FsZUZhY3RvciAqIChiZXppZXJbaSArIDJdIC0gcGFkZGluZyk7XG5cdCAgICAgICAgY29uc3QgcDIxID0gc2NhbGVGYWN0b3IgKiAoaGVpZ2h0IC0gYmV6aWVyW2kgKyAzXSAtIHBhZGRpbmcpO1xuXHQgICAgICAgIGNvbnN0IHAzMCA9IHNjYWxlRmFjdG9yICogKGJlemllcltpICsgNF0gLSBwYWRkaW5nKTtcblx0ICAgICAgICBjb25zdCBwMzEgPSBzY2FsZUZhY3RvciAqIChoZWlnaHQgLSBiZXppZXJbaSArIDVdIC0gcGFkZGluZyk7XG5cdCAgICAgICAgcGF0aC5wdXNoKFtbcDAsIHAxXSwgW3AxMCwgcDExXSwgW3AyMCwgcDIxXSwgW3AzMCwgcDMxXV0pO1xuXHQgICAgICAgIHAwID0gcDMwO1xuXHQgICAgICAgIHAxID0gcDMxO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IHBhdGgyRCA9IHRoaXMuI2J1aWxkUGF0aDJEKHBhdGgpO1xuXHQgICAgICBlZGl0b3IuYmV6aWVyUGF0aDJELnB1c2gocGF0aDJEKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGJib3ggPSBlZGl0b3IuI2dldEJib3goKTtcblx0ICAgIGVkaXRvci4jYmFzZVdpZHRoID0gTWF0aC5tYXgoUkVTSVpFUl9TSVpFLCBiYm94WzJdIC0gYmJveFswXSk7XG5cdCAgICBlZGl0b3IuI2Jhc2VIZWlnaHQgPSBNYXRoLm1heChSRVNJWkVSX1NJWkUsIGJib3hbM10gLSBiYm94WzFdKTtcblx0ICAgIGVkaXRvci4jc2V0U2NhbGVGYWN0b3Iod2lkdGgsIGhlaWdodCk7XG5cdCAgICByZXR1cm4gZWRpdG9yO1xuXHQgIH1cblx0ICBzZXJpYWxpemUoKSB7XG5cdCAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRSZWN0KDAsIDApO1xuXHQgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5yb3RhdGlvbiAlIDE4MCA9PT0gMCA/IHJlY3RbM10gLSByZWN0WzFdIDogcmVjdFsyXSAtIHJlY3RbMF07XG5cdCAgICBjb25zdCBjb2xvciA9IF9lZGl0b3IuQW5ub3RhdGlvbkVkaXRvci5fY29sb3JNYW5hZ2VyLmNvbnZlcnQodGhpcy5jdHguc3Ryb2tlU3R5bGUpO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgYW5ub3RhdGlvblR5cGU6IF91dGlsLkFubm90YXRpb25FZGl0b3JUeXBlLklOSyxcblx0ICAgICAgY29sb3IsXG5cdCAgICAgIHRoaWNrbmVzczogdGhpcy50aGlja25lc3MsXG5cdCAgICAgIG9wYWNpdHk6IHRoaXMub3BhY2l0eSxcblx0ICAgICAgcGF0aHM6IHRoaXMuI3NlcmlhbGl6ZVBhdGhzKHRoaXMuc2NhbGVGYWN0b3IgLyB0aGlzLnBhcmVudFNjYWxlLCB0aGlzLnRyYW5zbGF0aW9uWCwgdGhpcy50cmFuc2xhdGlvblksIGhlaWdodCksXG5cdCAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG5cdCAgICAgIHJlY3QsXG5cdCAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uXG5cdCAgICB9O1xuXHQgIH1cblx0fVxuXHRleHBvcnRzLklua0VkaXRvciA9IElua0VkaXRvcjtcblxuXHQvKioqLyB9KSxcblx0LyogMzAgKi9cblx0LyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykgPT4ge1xuXG5cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsICh7XG5cdCAgdmFsdWU6IHRydWVcblx0fSkpO1xuXHRleHBvcnRzLmZpdEN1cnZlID0gdm9pZCAwO1xuXHRjb25zdCBmaXRDdXJ2ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMzEpO1xuXHRleHBvcnRzLmZpdEN1cnZlID0gZml0Q3VydmU7XG5cblx0LyoqKi8gfSksXG5cdC8qIDMxICovXG5cdC8qKiovICgobW9kdWxlKSA9PiB7XG5cblxuXG5cdGZ1bmN0aW9uIGZpdEN1cnZlKHBvaW50cywgbWF4RXJyb3IsIHByb2dyZXNzQ2FsbGJhY2spIHtcblx0ICBpZiAoIUFycmF5LmlzQXJyYXkocG9pbnRzKSkge1xuXHQgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhbiBhcnJheVwiKTtcblx0ICB9XG5cdCAgcG9pbnRzLmZvckVhY2gocG9pbnQgPT4ge1xuXHQgICAgaWYgKCFBcnJheS5pc0FycmF5KHBvaW50KSB8fCBwb2ludC5zb21lKGl0ZW0gPT4gdHlwZW9mIGl0ZW0gIT09ICdudW1iZXInKSB8fCBwb2ludC5sZW5ndGggIT09IHBvaW50c1swXS5sZW5ndGgpIHtcblx0ICAgICAgdGhyb3cgRXJyb3IoXCJFYWNoIHBvaW50IHNob3VsZCBiZSBhbiBhcnJheSBvZiBudW1iZXJzLiBFYWNoIHBvaW50IHNob3VsZCBoYXZlIHRoZSBzYW1lIGFtb3VudCBvZiBudW1iZXJzLlwiKTtcblx0ICAgIH1cblx0ICB9KTtcblx0ICBwb2ludHMgPSBwb2ludHMuZmlsdGVyKChwb2ludCwgaSkgPT4gaSA9PT0gMCB8fCAhcG9pbnQuZXZlcnkoKHZhbCwgaikgPT4gdmFsID09PSBwb2ludHNbaSAtIDFdW2pdKSk7XG5cdCAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSB7XG5cdCAgICByZXR1cm4gW107XG5cdCAgfVxuXHQgIGNvbnN0IGxlbiA9IHBvaW50cy5sZW5ndGg7XG5cdCAgY29uc3QgbGVmdFRhbmdlbnQgPSBjcmVhdGVUYW5nZW50KHBvaW50c1sxXSwgcG9pbnRzWzBdKTtcblx0ICBjb25zdCByaWdodFRhbmdlbnQgPSBjcmVhdGVUYW5nZW50KHBvaW50c1tsZW4gLSAyXSwgcG9pbnRzW2xlbiAtIDFdKTtcblx0ICByZXR1cm4gZml0Q3ViaWMocG9pbnRzLCBsZWZ0VGFuZ2VudCwgcmlnaHRUYW5nZW50LCBtYXhFcnJvciwgcHJvZ3Jlc3NDYWxsYmFjayk7XG5cdH1cblx0ZnVuY3Rpb24gZml0Q3ViaWMocG9pbnRzLCBsZWZ0VGFuZ2VudCwgcmlnaHRUYW5nZW50LCBlcnJvciwgcHJvZ3Jlc3NDYWxsYmFjaykge1xuXHQgIGNvbnN0IE1heEl0ZXJhdGlvbnMgPSAyMDtcblx0ICB2YXIgYmV6Q3VydmUsIHUsIHVQcmltZSwgbWF4RXJyb3IsIHByZXZFcnIsIHNwbGl0UG9pbnQsIHByZXZTcGxpdCwgY2VudGVyVmVjdG9yLCB0b0NlbnRlclRhbmdlbnQsIGZyb21DZW50ZXJUYW5nZW50LCBiZXppZXJzLCBkaXN0LCBpO1xuXHQgIGlmIChwb2ludHMubGVuZ3RoID09PSAyKSB7XG5cdCAgICBkaXN0ID0gbWF0aHMudmVjdG9yTGVuKG1hdGhzLnN1YnRyYWN0KHBvaW50c1swXSwgcG9pbnRzWzFdKSkgLyAzLjA7XG5cdCAgICBiZXpDdXJ2ZSA9IFtwb2ludHNbMF0sIG1hdGhzLmFkZEFycmF5cyhwb2ludHNbMF0sIG1hdGhzLm11bEl0ZW1zKGxlZnRUYW5nZW50LCBkaXN0KSksIG1hdGhzLmFkZEFycmF5cyhwb2ludHNbMV0sIG1hdGhzLm11bEl0ZW1zKHJpZ2h0VGFuZ2VudCwgZGlzdCkpLCBwb2ludHNbMV1dO1xuXHQgICAgcmV0dXJuIFtiZXpDdXJ2ZV07XG5cdCAgfVxuXHQgIHUgPSBjaG9yZExlbmd0aFBhcmFtZXRlcml6ZShwb2ludHMpO1xuXHQgIFtiZXpDdXJ2ZSwgbWF4RXJyb3IsIHNwbGl0UG9pbnRdID0gZ2VuZXJhdGVBbmRSZXBvcnQocG9pbnRzLCB1LCB1LCBsZWZ0VGFuZ2VudCwgcmlnaHRUYW5nZW50LCBwcm9ncmVzc0NhbGxiYWNrKTtcblx0ICBpZiAobWF4RXJyb3IgPT09IDAgfHwgbWF4RXJyb3IgPCBlcnJvcikge1xuXHQgICAgcmV0dXJuIFtiZXpDdXJ2ZV07XG5cdCAgfVxuXHQgIGlmIChtYXhFcnJvciA8IGVycm9yICogZXJyb3IpIHtcblx0ICAgIHVQcmltZSA9IHU7XG5cdCAgICBwcmV2RXJyID0gbWF4RXJyb3I7XG5cdCAgICBwcmV2U3BsaXQgPSBzcGxpdFBvaW50O1xuXHQgICAgZm9yIChpID0gMDsgaSA8IE1heEl0ZXJhdGlvbnM7IGkrKykge1xuXHQgICAgICB1UHJpbWUgPSByZXBhcmFtZXRlcml6ZShiZXpDdXJ2ZSwgcG9pbnRzLCB1UHJpbWUpO1xuXHQgICAgICBbYmV6Q3VydmUsIG1heEVycm9yLCBzcGxpdFBvaW50XSA9IGdlbmVyYXRlQW5kUmVwb3J0KHBvaW50cywgdSwgdVByaW1lLCBsZWZ0VGFuZ2VudCwgcmlnaHRUYW5nZW50LCBwcm9ncmVzc0NhbGxiYWNrKTtcblx0ICAgICAgaWYgKG1heEVycm9yIDwgZXJyb3IpIHtcblx0ICAgICAgICByZXR1cm4gW2JlekN1cnZlXTtcblx0ICAgICAgfSBlbHNlIGlmIChzcGxpdFBvaW50ID09PSBwcmV2U3BsaXQpIHtcblx0ICAgICAgICBsZXQgZXJyQ2hhbmdlID0gbWF4RXJyb3IgLyBwcmV2RXJyO1xuXHQgICAgICAgIGlmIChlcnJDaGFuZ2UgPiAuOTk5OSAmJiBlcnJDaGFuZ2UgPCAxLjAwMDEpIHtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBwcmV2RXJyID0gbWF4RXJyb3I7XG5cdCAgICAgIHByZXZTcGxpdCA9IHNwbGl0UG9pbnQ7XG5cdCAgICB9XG5cdCAgfVxuXHQgIGJlemllcnMgPSBbXTtcblx0ICBjZW50ZXJWZWN0b3IgPSBtYXRocy5zdWJ0cmFjdChwb2ludHNbc3BsaXRQb2ludCAtIDFdLCBwb2ludHNbc3BsaXRQb2ludCArIDFdKTtcblx0ICBpZiAoY2VudGVyVmVjdG9yLmV2ZXJ5KHZhbCA9PiB2YWwgPT09IDApKSB7XG5cdCAgICBjZW50ZXJWZWN0b3IgPSBtYXRocy5zdWJ0cmFjdChwb2ludHNbc3BsaXRQb2ludCAtIDFdLCBwb2ludHNbc3BsaXRQb2ludF0pO1xuXHQgICAgW2NlbnRlclZlY3RvclswXSwgY2VudGVyVmVjdG9yWzFdXSA9IFstY2VudGVyVmVjdG9yWzFdLCBjZW50ZXJWZWN0b3JbMF1dO1xuXHQgIH1cblx0ICB0b0NlbnRlclRhbmdlbnQgPSBtYXRocy5ub3JtYWxpemUoY2VudGVyVmVjdG9yKTtcblx0ICBmcm9tQ2VudGVyVGFuZ2VudCA9IG1hdGhzLm11bEl0ZW1zKHRvQ2VudGVyVGFuZ2VudCwgLTEpO1xuXHQgIGJlemllcnMgPSBiZXppZXJzLmNvbmNhdChmaXRDdWJpYyhwb2ludHMuc2xpY2UoMCwgc3BsaXRQb2ludCArIDEpLCBsZWZ0VGFuZ2VudCwgdG9DZW50ZXJUYW5nZW50LCBlcnJvciwgcHJvZ3Jlc3NDYWxsYmFjaykpO1xuXHQgIGJlemllcnMgPSBiZXppZXJzLmNvbmNhdChmaXRDdWJpYyhwb2ludHMuc2xpY2Uoc3BsaXRQb2ludCksIGZyb21DZW50ZXJUYW5nZW50LCByaWdodFRhbmdlbnQsIGVycm9yLCBwcm9ncmVzc0NhbGxiYWNrKSk7XG5cdCAgcmV0dXJuIGJlemllcnM7XG5cdH1cblx0ZnVuY3Rpb24gZ2VuZXJhdGVBbmRSZXBvcnQocG9pbnRzLCBwYXJhbXNPcmlnLCBwYXJhbXNQcmltZSwgbGVmdFRhbmdlbnQsIHJpZ2h0VGFuZ2VudCwgcHJvZ3Jlc3NDYWxsYmFjaykge1xuXHQgIHZhciBiZXpDdXJ2ZSwgbWF4RXJyb3IsIHNwbGl0UG9pbnQ7XG5cdCAgYmV6Q3VydmUgPSBnZW5lcmF0ZUJlemllcihwb2ludHMsIHBhcmFtc1ByaW1lLCBsZWZ0VGFuZ2VudCwgcmlnaHRUYW5nZW50KTtcblx0ICBbbWF4RXJyb3IsIHNwbGl0UG9pbnRdID0gY29tcHV0ZU1heEVycm9yKHBvaW50cywgYmV6Q3VydmUsIHBhcmFtc09yaWcpO1xuXHQgIGlmIChwcm9ncmVzc0NhbGxiYWNrKSB7XG5cdCAgICBwcm9ncmVzc0NhbGxiYWNrKHtcblx0ICAgICAgYmV6OiBiZXpDdXJ2ZSxcblx0ICAgICAgcG9pbnRzOiBwb2ludHMsXG5cdCAgICAgIHBhcmFtczogcGFyYW1zT3JpZyxcblx0ICAgICAgbWF4RXJyOiBtYXhFcnJvcixcblx0ICAgICAgbWF4UG9pbnQ6IHNwbGl0UG9pbnRcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZXR1cm4gW2JlekN1cnZlLCBtYXhFcnJvciwgc3BsaXRQb2ludF07XG5cdH1cblx0ZnVuY3Rpb24gZ2VuZXJhdGVCZXppZXIocG9pbnRzLCBwYXJhbWV0ZXJzLCBsZWZ0VGFuZ2VudCwgcmlnaHRUYW5nZW50KSB7XG5cdCAgdmFyIGJlekN1cnZlLFxuXHQgICAgQSxcblx0ICAgIGEsXG5cdCAgICBDLFxuXHQgICAgWCxcblx0ICAgIGRldF9DMF9DMSxcblx0ICAgIGRldF9DMF9YLFxuXHQgICAgZGV0X1hfQzEsXG5cdCAgICBhbHBoYV9sLFxuXHQgICAgYWxwaGFfcixcblx0ICAgIGVwc2lsb24sXG5cdCAgICBzZWdMZW5ndGgsXG5cdCAgICBpLFxuXHQgICAgbGVuLFxuXHQgICAgdG1wLFxuXHQgICAgdSxcblx0ICAgIHV4LFxuXHQgICAgZmlyc3RQb2ludCA9IHBvaW50c1swXSxcblx0ICAgIGxhc3RQb2ludCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cdCAgYmV6Q3VydmUgPSBbZmlyc3RQb2ludCwgbnVsbCwgbnVsbCwgbGFzdFBvaW50XTtcblx0ICBBID0gbWF0aHMuemVyb3NfWHgyeDIocGFyYW1ldGVycy5sZW5ndGgpO1xuXHQgIGZvciAoaSA9IDAsIGxlbiA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgIHUgPSBwYXJhbWV0ZXJzW2ldO1xuXHQgICAgdXggPSAxIC0gdTtcblx0ICAgIGEgPSBBW2ldO1xuXHQgICAgYVswXSA9IG1hdGhzLm11bEl0ZW1zKGxlZnRUYW5nZW50LCAzICogdSAqICh1eCAqIHV4KSk7XG5cdCAgICBhWzFdID0gbWF0aHMubXVsSXRlbXMocmlnaHRUYW5nZW50LCAzICogdXggKiAodSAqIHUpKTtcblx0ICB9XG5cdCAgQyA9IFtbMCwgMF0sIFswLCAwXV07XG5cdCAgWCA9IFswLCAwXTtcblx0ICBmb3IgKGkgPSAwLCBsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgIHUgPSBwYXJhbWV0ZXJzW2ldO1xuXHQgICAgYSA9IEFbaV07XG5cdCAgICBDWzBdWzBdICs9IG1hdGhzLmRvdChhWzBdLCBhWzBdKTtcblx0ICAgIENbMF1bMV0gKz0gbWF0aHMuZG90KGFbMF0sIGFbMV0pO1xuXHQgICAgQ1sxXVswXSArPSBtYXRocy5kb3QoYVswXSwgYVsxXSk7XG5cdCAgICBDWzFdWzFdICs9IG1hdGhzLmRvdChhWzFdLCBhWzFdKTtcblx0ICAgIHRtcCA9IG1hdGhzLnN1YnRyYWN0KHBvaW50c1tpXSwgYmV6aWVyLnEoW2ZpcnN0UG9pbnQsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCwgbGFzdFBvaW50XSwgdSkpO1xuXHQgICAgWFswXSArPSBtYXRocy5kb3QoYVswXSwgdG1wKTtcblx0ICAgIFhbMV0gKz0gbWF0aHMuZG90KGFbMV0sIHRtcCk7XG5cdCAgfVxuXHQgIGRldF9DMF9DMSA9IENbMF1bMF0gKiBDWzFdWzFdIC0gQ1sxXVswXSAqIENbMF1bMV07XG5cdCAgZGV0X0MwX1ggPSBDWzBdWzBdICogWFsxXSAtIENbMV1bMF0gKiBYWzBdO1xuXHQgIGRldF9YX0MxID0gWFswXSAqIENbMV1bMV0gLSBYWzFdICogQ1swXVsxXTtcblx0ICBhbHBoYV9sID0gZGV0X0MwX0MxID09PSAwID8gMCA6IGRldF9YX0MxIC8gZGV0X0MwX0MxO1xuXHQgIGFscGhhX3IgPSBkZXRfQzBfQzEgPT09IDAgPyAwIDogZGV0X0MwX1ggLyBkZXRfQzBfQzE7XG5cdCAgc2VnTGVuZ3RoID0gbWF0aHMudmVjdG9yTGVuKG1hdGhzLnN1YnRyYWN0KGZpcnN0UG9pbnQsIGxhc3RQb2ludCkpO1xuXHQgIGVwc2lsb24gPSAxLjBlLTYgKiBzZWdMZW5ndGg7XG5cdCAgaWYgKGFscGhhX2wgPCBlcHNpbG9uIHx8IGFscGhhX3IgPCBlcHNpbG9uKSB7XG5cdCAgICBiZXpDdXJ2ZVsxXSA9IG1hdGhzLmFkZEFycmF5cyhmaXJzdFBvaW50LCBtYXRocy5tdWxJdGVtcyhsZWZ0VGFuZ2VudCwgc2VnTGVuZ3RoIC8gMy4wKSk7XG5cdCAgICBiZXpDdXJ2ZVsyXSA9IG1hdGhzLmFkZEFycmF5cyhsYXN0UG9pbnQsIG1hdGhzLm11bEl0ZW1zKHJpZ2h0VGFuZ2VudCwgc2VnTGVuZ3RoIC8gMy4wKSk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGJlekN1cnZlWzFdID0gbWF0aHMuYWRkQXJyYXlzKGZpcnN0UG9pbnQsIG1hdGhzLm11bEl0ZW1zKGxlZnRUYW5nZW50LCBhbHBoYV9sKSk7XG5cdCAgICBiZXpDdXJ2ZVsyXSA9IG1hdGhzLmFkZEFycmF5cyhsYXN0UG9pbnQsIG1hdGhzLm11bEl0ZW1zKHJpZ2h0VGFuZ2VudCwgYWxwaGFfcikpO1xuXHQgIH1cblx0ICByZXR1cm4gYmV6Q3VydmU7XG5cdH1cblx0ZnVuY3Rpb24gcmVwYXJhbWV0ZXJpemUoYmV6aWVyLCBwb2ludHMsIHBhcmFtZXRlcnMpIHtcblx0ICByZXR1cm4gcGFyYW1ldGVycy5tYXAoKHAsIGkpID0+IG5ld3RvblJhcGhzb25Sb290RmluZChiZXppZXIsIHBvaW50c1tpXSwgcCkpO1xuXHR9XG5cdGZ1bmN0aW9uIG5ld3RvblJhcGhzb25Sb290RmluZChiZXosIHBvaW50LCB1KSB7XG5cdCAgdmFyIGQgPSBtYXRocy5zdWJ0cmFjdChiZXppZXIucShiZXosIHUpLCBwb2ludCksXG5cdCAgICBxcHJpbWUgPSBiZXppZXIucXByaW1lKGJleiwgdSksXG5cdCAgICBudW1lcmF0b3IgPSBtYXRocy5tdWxNYXRyaXgoZCwgcXByaW1lKSxcblx0ICAgIGRlbm9taW5hdG9yID0gbWF0aHMuc3VtKG1hdGhzLnNxdWFyZUl0ZW1zKHFwcmltZSkpICsgMiAqIG1hdGhzLm11bE1hdHJpeChkLCBiZXppZXIucXByaW1lcHJpbWUoYmV6LCB1KSk7XG5cdCAgaWYgKGRlbm9taW5hdG9yID09PSAwKSB7XG5cdCAgICByZXR1cm4gdTtcblx0ICB9IGVsc2Uge1xuXHQgICAgcmV0dXJuIHUgLSBudW1lcmF0b3IgLyBkZW5vbWluYXRvcjtcblx0ICB9XG5cdH1cblx0ZnVuY3Rpb24gY2hvcmRMZW5ndGhQYXJhbWV0ZXJpemUocG9pbnRzKSB7XG5cdCAgdmFyIHUgPSBbXSxcblx0ICAgIGN1cnJVLFxuXHQgICAgcHJldlUsXG5cdCAgICBwcmV2UDtcblx0ICBwb2ludHMuZm9yRWFjaCgocCwgaSkgPT4ge1xuXHQgICAgY3VyclUgPSBpID8gcHJldlUgKyBtYXRocy52ZWN0b3JMZW4obWF0aHMuc3VidHJhY3QocCwgcHJldlApKSA6IDA7XG5cdCAgICB1LnB1c2goY3VyclUpO1xuXHQgICAgcHJldlUgPSBjdXJyVTtcblx0ICAgIHByZXZQID0gcDtcblx0ICB9KTtcblx0ICB1ID0gdS5tYXAoeCA9PiB4IC8gcHJldlUpO1xuXHQgIHJldHVybiB1O1xuXHR9XG5cdGZ1bmN0aW9uIGNvbXB1dGVNYXhFcnJvcihwb2ludHMsIGJleiwgcGFyYW1ldGVycykge1xuXHQgIHZhciBkaXN0LCBtYXhEaXN0LCBzcGxpdFBvaW50LCB2LCBpLCBjb3VudCwgcG9pbnQsIHQ7XG5cdCAgbWF4RGlzdCA9IDA7XG5cdCAgc3BsaXRQb2ludCA9IE1hdGguZmxvb3IocG9pbnRzLmxlbmd0aCAvIDIpO1xuXHQgIGNvbnN0IHRfZGlzdE1hcCA9IG1hcFR0b1JlbGF0aXZlRGlzdGFuY2VzKGJleiwgMTApO1xuXHQgIGZvciAoaSA9IDAsIGNvdW50ID0gcG9pbnRzLmxlbmd0aDsgaSA8IGNvdW50OyBpKyspIHtcblx0ICAgIHBvaW50ID0gcG9pbnRzW2ldO1xuXHQgICAgdCA9IGZpbmRfdChiZXosIHBhcmFtZXRlcnNbaV0sIHRfZGlzdE1hcCwgMTApO1xuXHQgICAgdiA9IG1hdGhzLnN1YnRyYWN0KGJlemllci5xKGJleiwgdCksIHBvaW50KTtcblx0ICAgIGRpc3QgPSB2WzBdICogdlswXSArIHZbMV0gKiB2WzFdO1xuXHQgICAgaWYgKGRpc3QgPiBtYXhEaXN0KSB7XG5cdCAgICAgIG1heERpc3QgPSBkaXN0O1xuXHQgICAgICBzcGxpdFBvaW50ID0gaTtcblx0ICAgIH1cblx0ICB9XG5cdCAgcmV0dXJuIFttYXhEaXN0LCBzcGxpdFBvaW50XTtcblx0fVxuXHR2YXIgbWFwVHRvUmVsYXRpdmVEaXN0YW5jZXMgPSBmdW5jdGlvbiAoYmV6LCBCX3BhcnRzKSB7XG5cdCAgdmFyIEJfdF9jdXJyO1xuXHQgIHZhciBCX3RfZGlzdCA9IFswXTtcblx0ICB2YXIgQl90X3ByZXYgPSBiZXpbMF07XG5cdCAgdmFyIHN1bUxlbiA9IDA7XG5cdCAgZm9yICh2YXIgaSA9IDE7IGkgPD0gQl9wYXJ0czsgaSsrKSB7XG5cdCAgICBCX3RfY3VyciA9IGJlemllci5xKGJleiwgaSAvIEJfcGFydHMpO1xuXHQgICAgc3VtTGVuICs9IG1hdGhzLnZlY3RvckxlbihtYXRocy5zdWJ0cmFjdChCX3RfY3VyciwgQl90X3ByZXYpKTtcblx0ICAgIEJfdF9kaXN0LnB1c2goc3VtTGVuKTtcblx0ICAgIEJfdF9wcmV2ID0gQl90X2N1cnI7XG5cdCAgfVxuXHQgIEJfdF9kaXN0ID0gQl90X2Rpc3QubWFwKHggPT4geCAvIHN1bUxlbik7XG5cdCAgcmV0dXJuIEJfdF9kaXN0O1xuXHR9O1xuXHRmdW5jdGlvbiBmaW5kX3QoYmV6LCBwYXJhbSwgdF9kaXN0TWFwLCBCX3BhcnRzKSB7XG5cdCAgaWYgKHBhcmFtIDwgMCkge1xuXHQgICAgcmV0dXJuIDA7XG5cdCAgfVxuXHQgIGlmIChwYXJhbSA+IDEpIHtcblx0ICAgIHJldHVybiAxO1xuXHQgIH1cblx0ICB2YXIgbGVuTWF4LCBsZW5NaW4sIHRNYXgsIHRNaW4sIHQ7XG5cdCAgZm9yICh2YXIgaSA9IDE7IGkgPD0gQl9wYXJ0czsgaSsrKSB7XG5cdCAgICBpZiAocGFyYW0gPD0gdF9kaXN0TWFwW2ldKSB7XG5cdCAgICAgIHRNaW4gPSAoaSAtIDEpIC8gQl9wYXJ0cztcblx0ICAgICAgdE1heCA9IGkgLyBCX3BhcnRzO1xuXHQgICAgICBsZW5NaW4gPSB0X2Rpc3RNYXBbaSAtIDFdO1xuXHQgICAgICBsZW5NYXggPSB0X2Rpc3RNYXBbaV07XG5cdCAgICAgIHQgPSAocGFyYW0gLSBsZW5NaW4pIC8gKGxlbk1heCAtIGxlbk1pbikgKiAodE1heCAtIHRNaW4pICsgdE1pbjtcblx0ICAgICAgYnJlYWs7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJldHVybiB0O1xuXHR9XG5cdGZ1bmN0aW9uIGNyZWF0ZVRhbmdlbnQocG9pbnRBLCBwb2ludEIpIHtcblx0ICByZXR1cm4gbWF0aHMubm9ybWFsaXplKG1hdGhzLnN1YnRyYWN0KHBvaW50QSwgcG9pbnRCKSk7XG5cdH1cblx0Y2xhc3MgbWF0aHMge1xuXHQgIHN0YXRpYyB6ZXJvc19YeDJ4Mih4KSB7XG5cdCAgICB2YXIgenMgPSBbXTtcblx0ICAgIHdoaWxlICh4LS0pIHtcblx0ICAgICAgenMucHVzaChbMCwgMF0pO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHpzO1xuXHQgIH1cblx0ICBzdGF0aWMgbXVsSXRlbXMoaXRlbXMsIG11bHRpcGxpZXIpIHtcblx0ICAgIHJldHVybiBpdGVtcy5tYXAoeCA9PiB4ICogbXVsdGlwbGllcik7XG5cdCAgfVxuXHQgIHN0YXRpYyBtdWxNYXRyaXgobTEsIG0yKSB7XG5cdCAgICByZXR1cm4gbTEucmVkdWNlKChzdW0sIHgxLCBpKSA9PiBzdW0gKyB4MSAqIG0yW2ldLCAwKTtcblx0ICB9XG5cdCAgc3RhdGljIHN1YnRyYWN0KGFycjEsIGFycjIpIHtcblx0ICAgIHJldHVybiBhcnIxLm1hcCgoeDEsIGkpID0+IHgxIC0gYXJyMltpXSk7XG5cdCAgfVxuXHQgIHN0YXRpYyBhZGRBcnJheXMoYXJyMSwgYXJyMikge1xuXHQgICAgcmV0dXJuIGFycjEubWFwKCh4MSwgaSkgPT4geDEgKyBhcnIyW2ldKTtcblx0ICB9XG5cdCAgc3RhdGljIGFkZEl0ZW1zKGl0ZW1zLCBhZGRpdGlvbikge1xuXHQgICAgcmV0dXJuIGl0ZW1zLm1hcCh4ID0+IHggKyBhZGRpdGlvbik7XG5cdCAgfVxuXHQgIHN0YXRpYyBzdW0oaXRlbXMpIHtcblx0ICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeCk7XG5cdCAgfVxuXHQgIHN0YXRpYyBkb3QobTEsIG0yKSB7XG5cdCAgICByZXR1cm4gbWF0aHMubXVsTWF0cml4KG0xLCBtMik7XG5cdCAgfVxuXHQgIHN0YXRpYyB2ZWN0b3JMZW4odikge1xuXHQgICAgcmV0dXJuIE1hdGguaHlwb3QoLi4udik7XG5cdCAgfVxuXHQgIHN0YXRpYyBkaXZJdGVtcyhpdGVtcywgZGl2aXNvcikge1xuXHQgICAgcmV0dXJuIGl0ZW1zLm1hcCh4ID0+IHggLyBkaXZpc29yKTtcblx0ICB9XG5cdCAgc3RhdGljIHNxdWFyZUl0ZW1zKGl0ZW1zKSB7XG5cdCAgICByZXR1cm4gaXRlbXMubWFwKHggPT4geCAqIHgpO1xuXHQgIH1cblx0ICBzdGF0aWMgbm9ybWFsaXplKHYpIHtcblx0ICAgIHJldHVybiB0aGlzLmRpdkl0ZW1zKHYsIHRoaXMudmVjdG9yTGVuKHYpKTtcblx0ICB9XG5cdH1cblx0Y2xhc3MgYmV6aWVyIHtcblx0ICBzdGF0aWMgcShjdHJsUG9seSwgdCkge1xuXHQgICAgdmFyIHR4ID0gMS4wIC0gdDtcblx0ICAgIHZhciBwQSA9IG1hdGhzLm11bEl0ZW1zKGN0cmxQb2x5WzBdLCB0eCAqIHR4ICogdHgpLFxuXHQgICAgICBwQiA9IG1hdGhzLm11bEl0ZW1zKGN0cmxQb2x5WzFdLCAzICogdHggKiB0eCAqIHQpLFxuXHQgICAgICBwQyA9IG1hdGhzLm11bEl0ZW1zKGN0cmxQb2x5WzJdLCAzICogdHggKiB0ICogdCksXG5cdCAgICAgIHBEID0gbWF0aHMubXVsSXRlbXMoY3RybFBvbHlbM10sIHQgKiB0ICogdCk7XG5cdCAgICByZXR1cm4gbWF0aHMuYWRkQXJyYXlzKG1hdGhzLmFkZEFycmF5cyhwQSwgcEIpLCBtYXRocy5hZGRBcnJheXMocEMsIHBEKSk7XG5cdCAgfVxuXHQgIHN0YXRpYyBxcHJpbWUoY3RybFBvbHksIHQpIHtcblx0ICAgIHZhciB0eCA9IDEuMCAtIHQ7XG5cdCAgICB2YXIgcEEgPSBtYXRocy5tdWxJdGVtcyhtYXRocy5zdWJ0cmFjdChjdHJsUG9seVsxXSwgY3RybFBvbHlbMF0pLCAzICogdHggKiB0eCksXG5cdCAgICAgIHBCID0gbWF0aHMubXVsSXRlbXMobWF0aHMuc3VidHJhY3QoY3RybFBvbHlbMl0sIGN0cmxQb2x5WzFdKSwgNiAqIHR4ICogdCksXG5cdCAgICAgIHBDID0gbWF0aHMubXVsSXRlbXMobWF0aHMuc3VidHJhY3QoY3RybFBvbHlbM10sIGN0cmxQb2x5WzJdKSwgMyAqIHQgKiB0KTtcblx0ICAgIHJldHVybiBtYXRocy5hZGRBcnJheXMobWF0aHMuYWRkQXJyYXlzKHBBLCBwQiksIHBDKTtcblx0ICB9XG5cdCAgc3RhdGljIHFwcmltZXByaW1lKGN0cmxQb2x5LCB0KSB7XG5cdCAgICByZXR1cm4gbWF0aHMuYWRkQXJyYXlzKG1hdGhzLm11bEl0ZW1zKG1hdGhzLmFkZEFycmF5cyhtYXRocy5zdWJ0cmFjdChjdHJsUG9seVsyXSwgbWF0aHMubXVsSXRlbXMoY3RybFBvbHlbMV0sIDIpKSwgY3RybFBvbHlbMF0pLCA2ICogKDEuMCAtIHQpKSwgbWF0aHMubXVsSXRlbXMobWF0aHMuYWRkQXJyYXlzKG1hdGhzLnN1YnRyYWN0KGN0cmxQb2x5WzNdLCBtYXRocy5tdWxJdGVtcyhjdHJsUG9seVsyXSwgMikpLCBjdHJsUG9seVsxXSksIDYgKiB0KSk7XG5cdCAgfVxuXHR9XG5cdG1vZHVsZS5leHBvcnRzID0gZml0Q3VydmU7XG5cdG1vZHVsZS5leHBvcnRzLmZpdEN1YmljID0gZml0Q3ViaWM7XG5cdG1vZHVsZS5leHBvcnRzLmNyZWF0ZVRhbmdlbnQgPSBjcmVhdGVUYW5nZW50O1xuXG5cdC8qKiovIH0pLFxuXHQvKiAzMiAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkxheWVyID0gdm9pZCAwO1xuXHR2YXIgX3V0aWwgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHR2YXIgX2Fubm90YXRpb25fc3RvcmFnZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7XG5cdHZhciBfc2NyaXB0aW5nX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygzMyk7XG5cdHZhciBfeGZhX2xheWVyID0gX193X3BkZmpzX3JlcXVpcmVfXygzNCk7XG5cdGNvbnN0IERFRkFVTFRfVEFCX0lOREVYID0gMTAwMDtcblx0Y29uc3QgREVGQVVMVF9GT05UX1NJWkUgPSA5O1xuXHRjb25zdCBHZXRFbGVtZW50c0J5TmFtZVNldCA9IG5ldyBXZWFrU2V0KCk7XG5cdGZ1bmN0aW9uIGdldFJlY3REaW1zKHJlY3QpIHtcblx0ICByZXR1cm4ge1xuXHQgICAgd2lkdGg6IHJlY3RbMl0gLSByZWN0WzBdLFxuXHQgICAgaGVpZ2h0OiByZWN0WzNdIC0gcmVjdFsxXVxuXHQgIH07XG5cdH1cblx0Y2xhc3MgQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5IHtcblx0ICBzdGF0aWMgY3JlYXRlKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IHN1YnR5cGUgPSBwYXJhbWV0ZXJzLmRhdGEuYW5ub3RhdGlvblR5cGU7XG5cdCAgICBzd2l0Y2ggKHN1YnR5cGUpIHtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5MSU5LOlxuXHQgICAgICAgIHJldHVybiBuZXcgTGlua0Fubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlRFWFQ6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuV0lER0VUOlxuXHQgICAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHBhcmFtZXRlcnMuZGF0YS5maWVsZFR5cGU7XG5cdCAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHtcblx0ICAgICAgICAgIGNhc2UgXCJUeFwiOlxuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRleHRXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgICAgIGNhc2UgXCJCdG5cIjpcblx0ICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGF0YS5yYWRpb0J1dHRvbikge1xuXHQgICAgICAgICAgICAgIHJldHVybiBuZXcgUmFkaW9CdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLmRhdGEuY2hlY2tCb3gpIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gbmV3IENoZWNrYm94V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBQdXNoQnV0dG9uV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgICAgICBjYXNlIFwiQ2hcIjpcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5QT1BVUDpcblx0ICAgICAgICByZXR1cm4gbmV3IFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuRlJFRVRFWFQ6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkxJTkU6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBMaW5lQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuU1FVQVJFOlxuXHQgICAgICAgIHJldHVybiBuZXcgU3F1YXJlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuQ0lSQ0xFOlxuXHQgICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuUE9MWUxJTkU6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBQb2x5bGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkNBUkVUOlxuXHQgICAgICAgIHJldHVybiBuZXcgQ2FyZXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5JTks6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBJbmtBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5QT0xZR09OOlxuXHQgICAgICAgIHJldHVybiBuZXcgUG9seWdvbkFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLkhJR0hMSUdIVDpcblx0ICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlVOREVSTElORTpcblx0ICAgICAgICByZXR1cm4gbmV3IFVuZGVybGluZUFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBjYXNlIF91dGlsLkFubm90YXRpb25UeXBlLlNRVUlHR0xZOlxuXHQgICAgICAgIHJldHVybiBuZXcgU3F1aWdnbHlBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TVFJJS0VPVVQ6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBTdHJpa2VPdXRBbm5vdGF0aW9uRWxlbWVudChwYXJhbWV0ZXJzKTtcblx0ICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5TVEFNUDpcblx0ICAgICAgICByZXR1cm4gbmV3IFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvblR5cGUuRklMRUFUVEFDSE1FTlQ6XG5cdCAgICAgICAgcmV0dXJuIG5ldyBGaWxlQXR0YWNobWVudEFubm90YXRpb25FbGVtZW50KHBhcmFtZXRlcnMpO1xuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkVsZW1lbnQocGFyYW1ldGVycyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdGNsYXNzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzLCB7XG5cdCAgICBpc1JlbmRlcmFibGUgPSBmYWxzZSxcblx0ICAgIGlnbm9yZUJvcmRlciA9IGZhbHNlLFxuXHQgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHMgPSBmYWxzZVxuXHQgIH0gPSB7fSkge1xuXHQgICAgdGhpcy5pc1JlbmRlcmFibGUgPSBpc1JlbmRlcmFibGU7XG5cdCAgICB0aGlzLmRhdGEgPSBwYXJhbWV0ZXJzLmRhdGE7XG5cdCAgICB0aGlzLmxheWVyID0gcGFyYW1ldGVycy5sYXllcjtcblx0ICAgIHRoaXMucGFnZSA9IHBhcmFtZXRlcnMucGFnZTtcblx0ICAgIHRoaXMudmlld3BvcnQgPSBwYXJhbWV0ZXJzLnZpZXdwb3J0O1xuXHQgICAgdGhpcy5saW5rU2VydmljZSA9IHBhcmFtZXRlcnMubGlua1NlcnZpY2U7XG5cdCAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IHBhcmFtZXRlcnMuZG93bmxvYWRNYW5hZ2VyO1xuXHQgICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBwYXJhbWV0ZXJzLmltYWdlUmVzb3VyY2VzUGF0aDtcblx0ICAgIHRoaXMucmVuZGVyRm9ybXMgPSBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zO1xuXHQgICAgdGhpcy5zdmdGYWN0b3J5ID0gcGFyYW1ldGVycy5zdmdGYWN0b3J5O1xuXHQgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZSA9IHBhcmFtZXRlcnMuYW5ub3RhdGlvblN0b3JhZ2U7XG5cdCAgICB0aGlzLmVuYWJsZVNjcmlwdGluZyA9IHBhcmFtZXRlcnMuZW5hYmxlU2NyaXB0aW5nO1xuXHQgICAgdGhpcy5oYXNKU0FjdGlvbnMgPSBwYXJhbWV0ZXJzLmhhc0pTQWN0aW9ucztcblx0ICAgIHRoaXMuX2ZpZWxkT2JqZWN0cyA9IHBhcmFtZXRlcnMuZmllbGRPYmplY3RzO1xuXHQgICAgaWYgKGlzUmVuZGVyYWJsZSkge1xuXHQgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuX2NyZWF0ZUNvbnRhaW5lcihpZ25vcmVCb3JkZXIpO1xuXHQgICAgfVxuXHQgICAgaWYgKGNyZWF0ZVF1YWRyaWxhdGVyYWxzKSB7XG5cdCAgICAgIHRoaXMucXVhZHJpbGF0ZXJhbHMgPSB0aGlzLl9jcmVhdGVRdWFkcmlsYXRlcmFscyhpZ25vcmVCb3JkZXIpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBfY3JlYXRlQ29udGFpbmVyKGlnbm9yZUJvcmRlciA9IGZhbHNlKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGRhdGEsXG5cdCAgICAgIHBhZ2UsXG5cdCAgICAgIHZpZXdwb3J0XG5cdCAgICB9ID0gdGhpcztcblx0ICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIpO1xuXHQgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtYW5ub3RhdGlvbi1pZFwiLCBkYXRhLmlkKTtcblx0ICAgIGlmIChkYXRhLm5vUm90YXRlKSB7XG5cdCAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibm9yb3RhdGVcIik7XG5cdCAgICB9XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHBhZ2VXaWR0aCxcblx0ICAgICAgcGFnZUhlaWdodCxcblx0ICAgICAgcGFnZVgsXG5cdCAgICAgIHBhZ2VZXG5cdCAgICB9ID0gdmlld3BvcnQucmF3RGltcztcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgd2lkdGgsXG5cdCAgICAgIGhlaWdodFxuXHQgICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG5cdCAgICBjb25zdCByZWN0ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KFtkYXRhLnJlY3RbMF0sIHBhZ2Uudmlld1szXSAtIGRhdGEucmVjdFsxXSArIHBhZ2Uudmlld1sxXSwgZGF0YS5yZWN0WzJdLCBwYWdlLnZpZXdbM10gLSBkYXRhLnJlY3RbM10gKyBwYWdlLnZpZXdbMV1dKTtcblx0ICAgIGlmICghaWdub3JlQm9yZGVyICYmIGRhdGEuYm9yZGVyU3R5bGUud2lkdGggPiAwKSB7XG5cdCAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJXaWR0aCA9IGAke2RhdGEuYm9yZGVyU3R5bGUud2lkdGh9cHhgO1xuXHQgICAgICBjb25zdCBob3Jpem9udGFsUmFkaXVzID0gZGF0YS5ib3JkZXJTdHlsZS5ob3Jpem9udGFsQ29ybmVyUmFkaXVzO1xuXHQgICAgICBjb25zdCB2ZXJ0aWNhbFJhZGl1cyA9IGRhdGEuYm9yZGVyU3R5bGUudmVydGljYWxDb3JuZXJSYWRpdXM7XG5cdCAgICAgIGlmIChob3Jpem9udGFsUmFkaXVzID4gMCB8fCB2ZXJ0aWNhbFJhZGl1cyA+IDApIHtcblx0ICAgICAgICBjb25zdCByYWRpdXMgPSBgY2FsYygke2hvcml6b250YWxSYWRpdXN9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKSAvIGNhbGMoJHt2ZXJ0aWNhbFJhZGl1c31weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcblx0ICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyUmFkaXVzID0gcmFkaXVzO1xuXHQgICAgICB9IGVsc2UgaWYgKHRoaXMgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50KSB7XG5cdCAgICAgICAgY29uc3QgcmFkaXVzID0gYGNhbGMoJHt3aWR0aH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpIC8gY2FsYygke2hlaWdodH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikpYDtcblx0ICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyUmFkaXVzID0gcmFkaXVzO1xuXHQgICAgICB9XG5cdCAgICAgIHN3aXRjaCAoZGF0YS5ib3JkZXJTdHlsZS5zdHlsZSkge1xuXHQgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5TT0xJRDpcblx0ICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJTdHlsZSA9IFwic29saWRcIjtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5EQVNIRUQ6XG5cdCAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyU3R5bGUgPSBcImRhc2hlZFwiO1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBfdXRpbC5Bbm5vdGF0aW9uQm9yZGVyU3R5bGVUeXBlLkJFVkVMRUQ6XG5cdCAgICAgICAgICAoMCwgX3V0aWwud2FybikoXCJVbmltcGxlbWVudGVkIGJvcmRlciBzdHlsZTogYmV2ZWxlZFwiKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5JTlNFVDpcblx0ICAgICAgICAgICgwLCBfdXRpbC53YXJuKShcIlVuaW1wbGVtZW50ZWQgYm9yZGVyIHN0eWxlOiBpbnNldFwiKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgX3V0aWwuQW5ub3RhdGlvbkJvcmRlclN0eWxlVHlwZS5VTkRFUkxJTkU6XG5cdCAgICAgICAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyQm90dG9tU3R5bGUgPSBcInNvbGlkXCI7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBib3JkZXJDb2xvciA9IGRhdGEuYm9yZGVyQ29sb3IgfHwgbnVsbDtcblx0ICAgICAgaWYgKGJvcmRlckNvbG9yKSB7XG5cdCAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlckNvbG9yID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IoYm9yZGVyQ29sb3JbMF0gfCAwLCBib3JkZXJDb2xvclsxXSB8IDAsIGJvcmRlckNvbG9yWzJdIHwgMCk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgY29udGFpbmVyLnN0eWxlLmJvcmRlcldpZHRoID0gMDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHsxMDAgKiAocmVjdFswXSAtIHBhZ2VYKSAvIHBhZ2VXaWR0aH0lYDtcblx0ICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHsxMDAgKiAocmVjdFsxXSAtIHBhZ2VZKSAvIHBhZ2VIZWlnaHR9JWA7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHJvdGF0aW9uXG5cdCAgICB9ID0gZGF0YTtcblx0ICAgIGlmIChkYXRhLmhhc093bkNhbnZhcyB8fCByb3RhdGlvbiA9PT0gMCkge1xuXHQgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBgJHsxMDAgKiB3aWR0aCAvIHBhZ2VXaWR0aH0lYDtcblx0ICAgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAkezEwMCAqIGhlaWdodCAvIHBhZ2VIZWlnaHR9JWA7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLnNldFJvdGF0aW9uKHJvdGF0aW9uLCBjb250YWluZXIpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGNvbnRhaW5lcjtcblx0ICB9XG5cdCAgc2V0Um90YXRpb24oYW5nbGUsIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHBhZ2VXaWR0aCxcblx0ICAgICAgcGFnZUhlaWdodFxuXHQgICAgfSA9IHRoaXMudmlld3BvcnQucmF3RGltcztcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgd2lkdGgsXG5cdCAgICAgIGhlaWdodFxuXHQgICAgfSA9IGdldFJlY3REaW1zKHRoaXMuZGF0YS5yZWN0KTtcblx0ICAgIGxldCBlbGVtZW50V2lkdGgsIGVsZW1lbnRIZWlnaHQ7XG5cdCAgICBpZiAoYW5nbGUgJSAxODAgPT09IDApIHtcblx0ICAgICAgZWxlbWVudFdpZHRoID0gMTAwICogd2lkdGggLyBwYWdlV2lkdGg7XG5cdCAgICAgIGVsZW1lbnRIZWlnaHQgPSAxMDAgKiBoZWlnaHQgLyBwYWdlSGVpZ2h0O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgZWxlbWVudFdpZHRoID0gMTAwICogaGVpZ2h0IC8gcGFnZVdpZHRoO1xuXHQgICAgICBlbGVtZW50SGVpZ2h0ID0gMTAwICogd2lkdGggLyBwYWdlSGVpZ2h0O1xuXHQgICAgfVxuXHQgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7ZWxlbWVudFdpZHRofSVgO1xuXHQgICAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke2VsZW1lbnRIZWlnaHR9JWA7XG5cdCAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1tYWluLXJvdGF0aW9uXCIsICgzNjAgLSBhbmdsZSkgJSAzNjApO1xuXHQgIH1cblx0ICBnZXQgX2NvbW1vbkFjdGlvbnMoKSB7XG5cdCAgICBjb25zdCBzZXRDb2xvciA9IChqc05hbWUsIHN0eWxlTmFtZSwgZXZlbnQpID0+IHtcblx0ICAgICAgY29uc3QgY29sb3IgPSBldmVudC5kZXRhaWxbanNOYW1lXTtcblx0ICAgICAgZXZlbnQudGFyZ2V0LnN0eWxlW3N0eWxlTmFtZV0gPSBfc2NyaXB0aW5nX3V0aWxzLkNvbG9yQ29udmVydGVyc1tgJHtjb2xvclswXX1fSFRNTGBdKGNvbG9yLnNsaWNlKDEpKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gKDAsIF91dGlsLnNoYWRvdykodGhpcywgXCJfY29tbW9uQWN0aW9uc1wiLCB7XG5cdCAgICAgIGRpc3BsYXk6IGV2ZW50ID0+IHtcblx0ICAgICAgICBjb25zdCBoaWRkZW4gPSBldmVudC5kZXRhaWwuZGlzcGxheSAlIDIgPT09IDE7XG5cdCAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IGhpZGRlbiA/IFwiaGlkZGVuXCIgOiBcInZpc2libGVcIjtcblx0ICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yYWdlLnNldFZhbHVlKHRoaXMuZGF0YS5pZCwge1xuXHQgICAgICAgICAgaGlkZGVuLFxuXHQgICAgICAgICAgcHJpbnQ6IGV2ZW50LmRldGFpbC5kaXNwbGF5ID09PSAwIHx8IGV2ZW50LmRldGFpbC5kaXNwbGF5ID09PSAzXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0sXG5cdCAgICAgIHByaW50OiBldmVudCA9PiB7XG5cdCAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcblx0ICAgICAgICAgIHByaW50OiBldmVudC5kZXRhaWwucHJpbnRcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSxcblx0ICAgICAgaGlkZGVuOiBldmVudCA9PiB7XG5cdCAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9IGV2ZW50LmRldGFpbC5oaWRkZW4gPyBcImhpZGRlblwiIDogXCJ2aXNpYmxlXCI7XG5cdCAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcblx0ICAgICAgICAgIGhpZGRlbjogZXZlbnQuZGV0YWlsLmhpZGRlblxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9LFxuXHQgICAgICBmb2N1czogZXZlbnQgPT4ge1xuXHQgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZXZlbnQudGFyZ2V0LmZvY3VzKHtcblx0ICAgICAgICAgIHByZXZlbnRTY3JvbGw6IGZhbHNlXG5cdCAgICAgICAgfSksIDApO1xuXHQgICAgICB9LFxuXHQgICAgICB1c2VyTmFtZTogZXZlbnQgPT4ge1xuXHQgICAgICAgIGV2ZW50LnRhcmdldC50aXRsZSA9IGV2ZW50LmRldGFpbC51c2VyTmFtZTtcblx0ICAgICAgfSxcblx0ICAgICAgcmVhZG9ubHk6IGV2ZW50ID0+IHtcblx0ICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLnJlYWRvbmx5KSB7XG5cdCAgICAgICAgICBldmVudC50YXJnZXQuc2V0QXR0cmlidXRlKFwicmVhZG9ubHlcIiwgXCJcIik7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGV2ZW50LnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJyZWFkb25seVwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIHJlcXVpcmVkOiBldmVudCA9PiB7XG5cdCAgICAgICAgdGhpcy5fc2V0UmVxdWlyZWQoZXZlbnQudGFyZ2V0LCBldmVudC5kZXRhaWwucmVxdWlyZWQpO1xuXHQgICAgICB9LFxuXHQgICAgICBiZ0NvbG9yOiBldmVudCA9PiB7XG5cdCAgICAgICAgc2V0Q29sb3IoXCJiZ0NvbG9yXCIsIFwiYmFja2dyb3VuZENvbG9yXCIsIGV2ZW50KTtcblx0ICAgICAgfSxcblx0ICAgICAgZmlsbENvbG9yOiBldmVudCA9PiB7XG5cdCAgICAgICAgc2V0Q29sb3IoXCJmaWxsQ29sb3JcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgZXZlbnQpO1xuXHQgICAgICB9LFxuXHQgICAgICBmZ0NvbG9yOiBldmVudCA9PiB7XG5cdCAgICAgICAgc2V0Q29sb3IoXCJmZ0NvbG9yXCIsIFwiY29sb3JcIiwgZXZlbnQpO1xuXHQgICAgICB9LFxuXHQgICAgICB0ZXh0Q29sb3I6IGV2ZW50ID0+IHtcblx0ICAgICAgICBzZXRDb2xvcihcInRleHRDb2xvclwiLCBcImNvbG9yXCIsIGV2ZW50KTtcblx0ICAgICAgfSxcblx0ICAgICAgYm9yZGVyQ29sb3I6IGV2ZW50ID0+IHtcblx0ICAgICAgICBzZXRDb2xvcihcImJvcmRlckNvbG9yXCIsIFwiYm9yZGVyQ29sb3JcIiwgZXZlbnQpO1xuXHQgICAgICB9LFxuXHQgICAgICBzdHJva2VDb2xvcjogZXZlbnQgPT4ge1xuXHQgICAgICAgIHNldENvbG9yKFwic3Ryb2tlQ29sb3JcIiwgXCJib3JkZXJDb2xvclwiLCBldmVudCk7XG5cdCAgICAgIH0sXG5cdCAgICAgIHJvdGF0aW9uOiBldmVudCA9PiB7XG5cdCAgICAgICAgY29uc3QgYW5nbGUgPSBldmVudC5kZXRhaWwucm90YXRpb247XG5cdCAgICAgICAgdGhpcy5zZXRSb3RhdGlvbihhbmdsZSk7XG5cdCAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZS5zZXRWYWx1ZSh0aGlzLmRhdGEuaWQsIHtcblx0ICAgICAgICAgIHJvdGF0aW9uOiBhbmdsZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICB9XG5cdCAgX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KSB7XG5cdCAgICBjb25zdCBjb21tb25BY3Rpb25zID0gdGhpcy5fY29tbW9uQWN0aW9ucztcblx0ICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhqc0V2ZW50LmRldGFpbCkpIHtcblx0ICAgICAgY29uc3QgYWN0aW9uID0gYWN0aW9uc1tuYW1lXSB8fCBjb21tb25BY3Rpb25zW25hbWVdO1xuXHQgICAgICBhY3Rpb24/Lihqc0V2ZW50KTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGVsZW1lbnQpIHtcblx0ICAgIGlmICghdGhpcy5lbmFibGVTY3JpcHRpbmcpIHtcblx0ICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgc3RvcmVkRGF0YSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2UuZ2V0UmF3VmFsdWUodGhpcy5kYXRhLmlkKTtcblx0ICAgIGlmICghc3RvcmVkRGF0YSkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCBjb21tb25BY3Rpb25zID0gdGhpcy5fY29tbW9uQWN0aW9ucztcblx0ICAgIGZvciAoY29uc3QgW2FjdGlvbk5hbWUsIGRldGFpbF0gb2YgT2JqZWN0LmVudHJpZXMoc3RvcmVkRGF0YSkpIHtcblx0ICAgICAgY29uc3QgYWN0aW9uID0gY29tbW9uQWN0aW9uc1thY3Rpb25OYW1lXTtcblx0ICAgICAgaWYgKGFjdGlvbikge1xuXHQgICAgICAgIGNvbnN0IGV2ZW50UHJveHkgPSB7XG5cdCAgICAgICAgICBkZXRhaWw6IHtcblx0ICAgICAgICAgICAgW2FjdGlvbk5hbWVdOiBkZXRhaWxcblx0ICAgICAgICAgIH0sXG5cdCAgICAgICAgICB0YXJnZXQ6IGVsZW1lbnRcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGFjdGlvbihldmVudFByb3h5KTtcblx0ICAgICAgICBkZWxldGUgc3RvcmVkRGF0YVthY3Rpb25OYW1lXTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICBfY3JlYXRlUXVhZHJpbGF0ZXJhbHMoaWdub3JlQm9yZGVyID0gZmFsc2UpIHtcblx0ICAgIGlmICghdGhpcy5kYXRhLnF1YWRQb2ludHMpIHtcblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgICBjb25zdCBxdWFkcmlsYXRlcmFscyA9IFtdO1xuXHQgICAgY29uc3Qgc2F2ZWRSZWN0ID0gdGhpcy5kYXRhLnJlY3Q7XG5cdCAgICBmb3IgKGNvbnN0IHF1YWRQb2ludCBvZiB0aGlzLmRhdGEucXVhZFBvaW50cykge1xuXHQgICAgICB0aGlzLmRhdGEucmVjdCA9IFtxdWFkUG9pbnRbMl0ueCwgcXVhZFBvaW50WzJdLnksIHF1YWRQb2ludFsxXS54LCBxdWFkUG9pbnRbMV0ueV07XG5cdCAgICAgIHF1YWRyaWxhdGVyYWxzLnB1c2godGhpcy5fY3JlYXRlQ29udGFpbmVyKGlnbm9yZUJvcmRlcikpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5kYXRhLnJlY3QgPSBzYXZlZFJlY3Q7XG5cdCAgICByZXR1cm4gcXVhZHJpbGF0ZXJhbHM7XG5cdCAgfVxuXHQgIF9jcmVhdGVQb3B1cCh0cmlnZ2VyLCBkYXRhKSB7XG5cdCAgICBsZXQgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG5cdCAgICBpZiAodGhpcy5xdWFkcmlsYXRlcmFscykge1xuXHQgICAgICB0cmlnZ2VyIHx8PSB0aGlzLnF1YWRyaWxhdGVyYWxzO1xuXHQgICAgICBjb250YWluZXIgPSB0aGlzLnF1YWRyaWxhdGVyYWxzWzBdO1xuXHQgICAgfVxuXHQgICAgaWYgKCF0cmlnZ2VyKSB7XG5cdCAgICAgIHRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgICB0cmlnZ2VyLmNsYXNzTGlzdC5hZGQoXCJwb3B1cFRyaWdnZXJBcmVhXCIpO1xuXHQgICAgICBjb250YWluZXIuYXBwZW5kKHRyaWdnZXIpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcG9wdXBFbGVtZW50ID0gbmV3IFBvcHVwRWxlbWVudCh7XG5cdCAgICAgIGNvbnRhaW5lcixcblx0ICAgICAgdHJpZ2dlcixcblx0ICAgICAgY29sb3I6IGRhdGEuY29sb3IsXG5cdCAgICAgIHRpdGxlT2JqOiBkYXRhLnRpdGxlT2JqLFxuXHQgICAgICBtb2RpZmljYXRpb25EYXRlOiBkYXRhLm1vZGlmaWNhdGlvbkRhdGUsXG5cdCAgICAgIGNvbnRlbnRzT2JqOiBkYXRhLmNvbnRlbnRzT2JqLFxuXHQgICAgICByaWNoVGV4dDogZGF0YS5yaWNoVGV4dCxcblx0ICAgICAgaGlkZVdyYXBwZXI6IHRydWVcblx0ICAgIH0pO1xuXHQgICAgY29uc3QgcG9wdXAgPSBwb3B1cEVsZW1lbnQucmVuZGVyKCk7XG5cdCAgICBwb3B1cC5zdHlsZS5sZWZ0ID0gXCIxMDAlXCI7XG5cdCAgICBjb250YWluZXIuYXBwZW5kKHBvcHVwKTtcblx0ICB9XG5cdCAgX3JlbmRlclF1YWRyaWxhdGVyYWxzKGNsYXNzTmFtZSkge1xuXHQgICAgZm9yIChjb25zdCBxdWFkcmlsYXRlcmFsIG9mIHRoaXMucXVhZHJpbGF0ZXJhbHMpIHtcblx0ICAgICAgcXVhZHJpbGF0ZXJhbC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gdGhpcy5xdWFkcmlsYXRlcmFscztcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgKDAsIF91dGlsLnVucmVhY2hhYmxlKShcIkFic3RyYWN0IG1ldGhvZCBgQW5ub3RhdGlvbkVsZW1lbnQucmVuZGVyYCBjYWxsZWRcIik7XG5cdCAgfVxuXHQgIF9nZXRFbGVtZW50c0J5TmFtZShuYW1lLCBza2lwSWQgPSBudWxsKSB7XG5cdCAgICBjb25zdCBmaWVsZHMgPSBbXTtcblx0ICAgIGlmICh0aGlzLl9maWVsZE9iamVjdHMpIHtcblx0ICAgICAgY29uc3QgZmllbGRPYmogPSB0aGlzLl9maWVsZE9iamVjdHNbbmFtZV07XG5cdCAgICAgIGlmIChmaWVsZE9iaikge1xuXHQgICAgICAgIGZvciAoY29uc3Qge1xuXHQgICAgICAgICAgcGFnZSxcblx0ICAgICAgICAgIGlkLFxuXHQgICAgICAgICAgZXhwb3J0VmFsdWVzXG5cdCAgICAgICAgfSBvZiBmaWVsZE9iaikge1xuXHQgICAgICAgICAgaWYgKHBhZ2UgPT09IC0xKSB7XG5cdCAgICAgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKGlkID09PSBza2lwSWQpIHtcblx0ICAgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IHR5cGVvZiBleHBvcnRWYWx1ZXMgPT09IFwic3RyaW5nXCIgPyBleHBvcnRWYWx1ZXMgOiBudWxsO1xuXHQgICAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWVsZW1lbnQtaWQ9XCIke2lkfVwiXWApO1xuXHQgICAgICAgICAgaWYgKGRvbUVsZW1lbnQgJiYgIUdldEVsZW1lbnRzQnlOYW1lU2V0Lmhhcyhkb21FbGVtZW50KSkge1xuXHQgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYF9nZXRFbGVtZW50c0J5TmFtZSAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6ICR7aWR9YCk7XG5cdCAgICAgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgZmllbGRzLnB1c2goe1xuXHQgICAgICAgICAgICBpZCxcblx0ICAgICAgICAgICAgZXhwb3J0VmFsdWUsXG5cdCAgICAgICAgICAgIGRvbUVsZW1lbnRcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZmllbGRzO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKG5hbWUpKSB7XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBleHBvcnRWYWx1ZVxuXHQgICAgICB9ID0gZG9tRWxlbWVudDtcblx0ICAgICAgY29uc3QgaWQgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiKTtcblx0ICAgICAgaWYgKGlkID09PSBza2lwSWQpIHtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoIUdldEVsZW1lbnRzQnlOYW1lU2V0Lmhhcyhkb21FbGVtZW50KSkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGZpZWxkcy5wdXNoKHtcblx0ICAgICAgICBpZCxcblx0ICAgICAgICBleHBvcnRWYWx1ZSxcblx0ICAgICAgICBkb21FbGVtZW50XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGZpZWxkcztcblx0ICB9XG5cdH1cblx0Y2xhc3MgTGlua0Fubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMsIG9wdGlvbnMgPSBudWxsKSB7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiAhIW9wdGlvbnM/Lmlnbm9yZUJvcmRlcixcblx0ICAgICAgY3JlYXRlUXVhZHJpbGF0ZXJhbHM6IHRydWVcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5pc1Rvb2x0aXBPbmx5ID0gcGFyYW1ldGVycy5kYXRhLmlzVG9vbHRpcE9ubHk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgZGF0YSxcblx0ICAgICAgbGlua1NlcnZpY2Vcblx0ICAgIH0gPSB0aGlzO1xuXHQgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuXHQgICAgbGluay5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgZGF0YS5pZCk7XG5cdCAgICBsZXQgaXNCb3VuZCA9IGZhbHNlO1xuXHQgICAgaWYgKGRhdGEudXJsKSB7XG5cdCAgICAgIGxpbmtTZXJ2aWNlLmFkZExpbmtBdHRyaWJ1dGVzKGxpbmssIGRhdGEudXJsLCBkYXRhLm5ld1dpbmRvdyk7XG5cdCAgICAgIGlzQm91bmQgPSB0cnVlO1xuXHQgICAgfSBlbHNlIGlmIChkYXRhLmFjdGlvbikge1xuXHQgICAgICB0aGlzLl9iaW5kTmFtZWRBY3Rpb24obGluaywgZGF0YS5hY3Rpb24pO1xuXHQgICAgICBpc0JvdW5kID0gdHJ1ZTtcblx0ICAgIH0gZWxzZSBpZiAoZGF0YS5hdHRhY2htZW50KSB7XG5cdCAgICAgIHRoaXMuX2JpbmRBdHRhY2htZW50KGxpbmssIGRhdGEuYXR0YWNobWVudCk7XG5cdCAgICAgIGlzQm91bmQgPSB0cnVlO1xuXHQgICAgfSBlbHNlIGlmIChkYXRhLnNldE9DR1N0YXRlKSB7XG5cdCAgICAgIHRoaXMuI2JpbmRTZXRPQ0dTdGF0ZShsaW5rLCBkYXRhLnNldE9DR1N0YXRlKTtcblx0ICAgICAgaXNCb3VuZCA9IHRydWU7XG5cdCAgICB9IGVsc2UgaWYgKGRhdGEuZGVzdCkge1xuXHQgICAgICB0aGlzLl9iaW5kTGluayhsaW5rLCBkYXRhLmRlc3QpO1xuXHQgICAgICBpc0JvdW5kID0gdHJ1ZTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGlmIChkYXRhLmFjdGlvbnMgJiYgKGRhdGEuYWN0aW9ucy5BY3Rpb24gfHwgZGF0YS5hY3Rpb25zW1wiTW91c2UgVXBcIl0gfHwgZGF0YS5hY3Rpb25zW1wiTW91c2UgRG93blwiXSkgJiYgdGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcblx0ICAgICAgICB0aGlzLl9iaW5kSlNBY3Rpb24obGluaywgZGF0YSk7XG5cdCAgICAgICAgaXNCb3VuZCA9IHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGRhdGEucmVzZXRGb3JtKSB7XG5cdCAgICAgICAgdGhpcy5fYmluZFJlc2V0Rm9ybUFjdGlvbihsaW5rLCBkYXRhLnJlc2V0Rm9ybSk7XG5cdCAgICAgICAgaXNCb3VuZCA9IHRydWU7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Rvb2x0aXBPbmx5ICYmICFpc0JvdW5kKSB7XG5cdCAgICAgICAgdGhpcy5fYmluZExpbmsobGluaywgXCJcIik7XG5cdCAgICAgICAgaXNCb3VuZCA9IHRydWU7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLnF1YWRyaWxhdGVyYWxzKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJRdWFkcmlsYXRlcmFscyhcImxpbmtBbm5vdGF0aW9uXCIpLm1hcCgocXVhZHJpbGF0ZXJhbCwgaW5kZXgpID0+IHtcblx0ICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGluZGV4ID09PSAwID8gbGluayA6IGxpbmsuY2xvbmVOb2RlKCk7XG5cdCAgICAgICAgcXVhZHJpbGF0ZXJhbC5hcHBlbmQobGlua0VsZW1lbnQpO1xuXHQgICAgICAgIHJldHVybiBxdWFkcmlsYXRlcmFsO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJsaW5rQW5ub3RhdGlvblwiKTtcblx0ICAgIGlmIChpc0JvdW5kKSB7XG5cdCAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChsaW5rKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdCAgI3NldEludGVybmFsTGluaygpIHtcblx0ICAgIHRoaXMuY29udGFpbmVyLnNldEF0dHJpYnV0ZShcImRhdGEtaW50ZXJuYWwtbGlua1wiLCBcIlwiKTtcblx0ICB9XG5cdCAgX2JpbmRMaW5rKGxpbmssIGRlc3RpbmF0aW9uKSB7XG5cdCAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldERlc3RpbmF0aW9uSGFzaChkZXN0aW5hdGlvbik7XG5cdCAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG5cdCAgICAgIGlmIChkZXN0aW5hdGlvbikge1xuXHQgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZ29Ub0Rlc3RpbmF0aW9uKGRlc3RpbmF0aW9uKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9O1xuXHQgICAgaWYgKGRlc3RpbmF0aW9uIHx8IGRlc3RpbmF0aW9uID09PSBcIlwiKSB7XG5cdCAgICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBfYmluZE5hbWVkQWN0aW9uKGxpbmssIGFjdGlvbikge1xuXHQgICAgbGluay5ocmVmID0gdGhpcy5saW5rU2VydmljZS5nZXRBbmNob3JVcmwoXCJcIik7XG5cdCAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG5cdCAgICAgIHRoaXMubGlua1NlcnZpY2UuZXhlY3V0ZU5hbWVkQWN0aW9uKGFjdGlvbik7XG5cdCAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH07XG5cdCAgICB0aGlzLiNzZXRJbnRlcm5hbExpbmsoKTtcblx0ICB9XG5cdCAgX2JpbmRBdHRhY2htZW50KGxpbmssIGF0dGFjaG1lbnQpIHtcblx0ICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuXHQgICAgbGluay5vbmNsaWNrID0gKCkgPT4ge1xuXHQgICAgICB0aGlzLmRvd25sb2FkTWFuYWdlcj8ub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGFpbmVyLCBhdHRhY2htZW50LmNvbnRlbnQsIGF0dGFjaG1lbnQuZmlsZW5hbWUpO1xuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9O1xuXHQgICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG5cdCAgfVxuXHQgICNiaW5kU2V0T0NHU3RhdGUobGluaywgYWN0aW9uKSB7XG5cdCAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcblx0ICAgIGxpbmsub25jbGljayA9ICgpID0+IHtcblx0ICAgICAgdGhpcy5saW5rU2VydmljZS5leGVjdXRlU2V0T0NHU3RhdGUoYWN0aW9uKTtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblx0ICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuXHQgIH1cblx0ICBfYmluZEpTQWN0aW9uKGxpbmssIGRhdGEpIHtcblx0ICAgIGxpbmsuaHJlZiA9IHRoaXMubGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuXHQgICAgY29uc3QgbWFwID0gbmV3IE1hcChbW1wiQWN0aW9uXCIsIFwib25jbGlja1wiXSwgW1wiTW91c2UgVXBcIiwgXCJvbm1vdXNldXBcIl0sIFtcIk1vdXNlIERvd25cIiwgXCJvbm1vdXNlZG93blwiXV0pO1xuXHQgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRhdGEuYWN0aW9ucykpIHtcblx0ICAgICAgY29uc3QganNOYW1lID0gbWFwLmdldChuYW1lKTtcblx0ICAgICAgaWYgKCFqc05hbWUpIHtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBsaW5rW2pzTmFtZV0gPSAoKSA9PiB7XG5cdCAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcblx0ICAgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICAgIGRldGFpbDoge1xuXHQgICAgICAgICAgICBpZDogZGF0YS5pZCxcblx0ICAgICAgICAgICAgbmFtZVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfTtcblx0ICAgIH1cblx0ICAgIGlmICghbGluay5vbmNsaWNrKSB7XG5cdCAgICAgIGxpbmsub25jbGljayA9ICgpID0+IGZhbHNlO1xuXHQgICAgfVxuXHQgICAgdGhpcy4jc2V0SW50ZXJuYWxMaW5rKCk7XG5cdCAgfVxuXHQgIF9iaW5kUmVzZXRGb3JtQWN0aW9uKGxpbmssIHJlc2V0Rm9ybSkge1xuXHQgICAgY29uc3Qgb3RoZXJDbGlja0FjdGlvbiA9IGxpbmsub25jbGljaztcblx0ICAgIGlmICghb3RoZXJDbGlja0FjdGlvbikge1xuXHQgICAgICBsaW5rLmhyZWYgPSB0aGlzLmxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChcIlwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuI3NldEludGVybmFsTGluaygpO1xuXHQgICAgaWYgKCF0aGlzLl9maWVsZE9iamVjdHMpIHtcblx0ICAgICAgKDAsIF91dGlsLndhcm4pKGBfYmluZFJlc2V0Rm9ybUFjdGlvbiAtIFwicmVzZXRGb3JtXCIgYWN0aW9uIG5vdCBzdXBwb3J0ZWQsIGAgKyBcImVuc3VyZSB0aGF0IHRoZSBgZmllbGRPYmplY3RzYCBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQuXCIpO1xuXHQgICAgICBpZiAoIW90aGVyQ2xpY2tBY3Rpb24pIHtcblx0ICAgICAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBsaW5rLm9uY2xpY2sgPSAoKSA9PiB7XG5cdCAgICAgIG90aGVyQ2xpY2tBY3Rpb24/LigpO1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgZmllbGRzOiByZXNldEZvcm1GaWVsZHMsXG5cdCAgICAgICAgcmVmczogcmVzZXRGb3JtUmVmcyxcblx0ICAgICAgICBpbmNsdWRlXG5cdCAgICAgIH0gPSByZXNldEZvcm07XG5cdCAgICAgIGNvbnN0IGFsbEZpZWxkcyA9IFtdO1xuXHQgICAgICBpZiAocmVzZXRGb3JtRmllbGRzLmxlbmd0aCAhPT0gMCB8fCByZXNldEZvcm1SZWZzLmxlbmd0aCAhPT0gMCkge1xuXHQgICAgICAgIGNvbnN0IGZpZWxkSWRzID0gbmV3IFNldChyZXNldEZvcm1SZWZzKTtcblx0ICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiByZXNldEZvcm1GaWVsZHMpIHtcblx0ICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuX2ZpZWxkT2JqZWN0c1tmaWVsZE5hbWVdIHx8IFtdO1xuXHQgICAgICAgICAgZm9yIChjb25zdCB7XG5cdCAgICAgICAgICAgIGlkXG5cdCAgICAgICAgICB9IG9mIGZpZWxkcykge1xuXHQgICAgICAgICAgICBmaWVsZElkcy5hZGQoaWQpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBmb3IgKGNvbnN0IGZpZWxkcyBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkT2JqZWN0cykpIHtcblx0ICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG5cdCAgICAgICAgICAgIGlmIChmaWVsZElkcy5oYXMoZmllbGQuaWQpID09PSBpbmNsdWRlKSB7XG5cdCAgICAgICAgICAgICAgYWxsRmllbGRzLnB1c2goZmllbGQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGZvciAoY29uc3QgZmllbGRzIG9mIE9iamVjdC52YWx1ZXModGhpcy5fZmllbGRPYmplY3RzKSkge1xuXHQgICAgICAgICAgYWxsRmllbGRzLnB1c2goLi4uZmllbGRzKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG5cdCAgICAgIGNvbnN0IGFsbElkcyA9IFtdO1xuXHQgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGFsbEZpZWxkcykge1xuXHQgICAgICAgIGNvbnN0IHtcblx0ICAgICAgICAgIGlkXG5cdCAgICAgICAgfSA9IGZpZWxkO1xuXHQgICAgICAgIGFsbElkcy5wdXNoKGlkKTtcblx0ICAgICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcblx0ICAgICAgICAgIGNhc2UgXCJ0ZXh0XCI6XG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZSB8fCBcIlwiO1xuXHQgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICAgIHZhbHVlXG5cdCAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuXHQgICAgICAgICAgY2FzZSBcInJhZGlvYnV0dG9uXCI6XG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZSA9PT0gZmllbGQuZXhwb3J0VmFsdWVzO1xuXHQgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICAgIHZhbHVlXG5cdCAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIGNhc2UgXCJjb21ib2JveFwiOlxuXHQgICAgICAgICAgY2FzZSBcImxpc3Rib3hcIjpcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuZGVmYXVsdFZhbHVlIHx8IFwiXCI7XG5cdCAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICAgICAgdmFsdWVcblx0ICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1lbGVtZW50LWlkPVwiJHtpZH1cIl1gKTtcblx0ICAgICAgICBpZiAoIWRvbUVsZW1lbnQpIHtcblx0ICAgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoIUdldEVsZW1lbnRzQnlOYW1lU2V0Lmhhcyhkb21FbGVtZW50KSkge1xuXHQgICAgICAgICAgKDAsIF91dGlsLndhcm4pKGBfYmluZFJlc2V0Rm9ybUFjdGlvbiAtIGVsZW1lbnQgbm90IGFsbG93ZWQ6ICR7aWR9YCk7XG5cdCAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInJlc2V0Zm9ybVwiKSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nKSB7XG5cdCAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcblx0ICAgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICAgIGRldGFpbDoge1xuXHQgICAgICAgICAgICBpZDogXCJhcHBcIixcblx0ICAgICAgICAgICAgaWRzOiBhbGxJZHMsXG5cdCAgICAgICAgICAgIG5hbWU6IFwiUmVzZXRGb3JtXCJcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9O1xuXHQgIH1cblx0fVxuXHRjbGFzcyBUZXh0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInRleHRBbm5vdGF0aW9uXCIpO1xuXHQgICAgY29uc3QgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuXHQgICAgaW1hZ2Uuc3JjID0gdGhpcy5pbWFnZVJlc291cmNlc1BhdGggKyBcImFubm90YXRpb24tXCIgKyB0aGlzLmRhdGEubmFtZS50b0xvd2VyQ2FzZSgpICsgXCIuc3ZnXCI7XG5cdCAgICBpbWFnZS5hbHQgPSBcIlt7e3R5cGV9fSBBbm5vdGF0aW9uXVwiO1xuXHQgICAgaW1hZ2UuZGF0YXNldC5sMTBuSWQgPSBcInRleHRfYW5ub3RhdGlvbl90eXBlXCI7XG5cdCAgICBpbWFnZS5kYXRhc2V0LmwxMG5BcmdzID0gSlNPTi5zdHJpbmdpZnkoe1xuXHQgICAgICB0eXBlOiB0aGlzLmRhdGEubmFtZVxuXHQgICAgfSk7XG5cdCAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuXHQgICAgICB0aGlzLl9jcmVhdGVQb3B1cChpbWFnZSwgdGhpcy5kYXRhKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChpbWFnZSk7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIHJlbmRlcigpIHtcblx0ICAgIGlmICh0aGlzLmRhdGEuYWx0ZXJuYXRpdmVUZXh0KSB7XG5cdCAgICAgIHRoaXMuY29udGFpbmVyLnRpdGxlID0gdGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dDtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdCAgc2hvd0VsZW1lbnRBbmRIaWRlQ2FudmFzKGVsZW1lbnQpIHtcblx0ICAgIGlmICh0aGlzLmRhdGEuaGFzT3duQ2FudmFzKSB7XG5cdCAgICAgIGlmIChlbGVtZW50LnByZXZpb3VzU2libGluZz8ubm9kZU5hbWUgPT09IFwiQ0FOVkFTXCIpIHtcblx0ICAgICAgICBlbGVtZW50LnByZXZpb3VzU2libGluZy5oaWRkZW4gPSB0cnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGVsZW1lbnQuaGlkZGVuID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9nZXRLZXlNb2RpZmllcihldmVudCkge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBpc1dpbixcblx0ICAgICAgaXNNYWNcblx0ICAgIH0gPSBfdXRpbC5GZWF0dXJlVGVzdC5wbGF0Zm9ybTtcblx0ICAgIHJldHVybiBpc1dpbiAmJiBldmVudC5jdHJsS2V5IHx8IGlzTWFjICYmIGV2ZW50Lm1ldGFLZXk7XG5cdCAgfVxuXHQgIF9zZXRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGJhc2VOYW1lLCBldmVudE5hbWUsIHZhbHVlR2V0dGVyKSB7XG5cdCAgICBpZiAoYmFzZU5hbWUuaW5jbHVkZXMoXCJtb3VzZVwiKSkge1xuXHQgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoYmFzZU5hbWUsIGV2ZW50ID0+IHtcblx0ICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuXHQgICAgICAgICAgc291cmNlOiB0aGlzLFxuXHQgICAgICAgICAgZGV0YWlsOiB7XG5cdCAgICAgICAgICAgIGlkOiB0aGlzLmRhdGEuaWQsXG5cdCAgICAgICAgICAgIG5hbWU6IGV2ZW50TmFtZSxcblx0ICAgICAgICAgICAgdmFsdWU6IHZhbHVlR2V0dGVyKGV2ZW50KSxcblx0ICAgICAgICAgICAgc2hpZnQ6IGV2ZW50LnNoaWZ0S2V5LFxuXHQgICAgICAgICAgICBtb2RpZmllcjogdGhpcy5fZ2V0S2V5TW9kaWZpZXIoZXZlbnQpXG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGJhc2VOYW1lLCBldmVudCA9PiB7XG5cdCAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcblx0ICAgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICAgIGRldGFpbDoge1xuXHQgICAgICAgICAgICBpZDogdGhpcy5kYXRhLmlkLFxuXHQgICAgICAgICAgICBuYW1lOiBldmVudE5hbWUsXG5cdCAgICAgICAgICAgIHZhbHVlOiB2YWx1ZUdldHRlcihldmVudClcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9zZXRFdmVudExpc3RlbmVycyhlbGVtZW50LCBuYW1lcywgZ2V0dGVyKSB7XG5cdCAgICBmb3IgKGNvbnN0IFtiYXNlTmFtZSwgZXZlbnROYW1lXSBvZiBuYW1lcykge1xuXHQgICAgICBpZiAoZXZlbnROYW1lID09PSBcIkFjdGlvblwiIHx8IHRoaXMuZGF0YS5hY3Rpb25zPy5bZXZlbnROYW1lXSkge1xuXHQgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgYmFzZU5hbWUsIGV2ZW50TmFtZSwgZ2V0dGVyKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0ICBfc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnQpIHtcblx0ICAgIGNvbnN0IGNvbG9yID0gdGhpcy5kYXRhLmJhY2tncm91bmRDb2xvciB8fCBudWxsO1xuXHQgICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvciA9PT0gbnVsbCA/IFwidHJhbnNwYXJlbnRcIiA6IF91dGlsLlV0aWwubWFrZUhleENvbG9yKGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pO1xuXHQgIH1cblx0ICBfc2V0VGV4dFN0eWxlKGVsZW1lbnQpIHtcblx0ICAgIGNvbnN0IFRFWFRfQUxJR05NRU5UID0gW1wibGVmdFwiLCBcImNlbnRlclwiLCBcInJpZ2h0XCJdO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBmb250Q29sb3Jcblx0ICAgIH0gPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhO1xuXHQgICAgY29uc3QgZm9udFNpemUgPSB0aGlzLmRhdGEuZGVmYXVsdEFwcGVhcmFuY2VEYXRhLmZvbnRTaXplIHx8IERFRkFVTFRfRk9OVF9TSVpFO1xuXHQgICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50LnN0eWxlO1xuXHQgICAgbGV0IGNvbXB1dGVkRm9udFNpemU7XG5cdCAgICBjb25zdCBCT1JERVJfU0laRSA9IDI7XG5cdCAgICBjb25zdCByb3VuZFRvT25lRGVjaW1hbCA9IHggPT4gTWF0aC5yb3VuZCgxMCAqIHgpIC8gMTA7XG5cdCAgICBpZiAodGhpcy5kYXRhLm11bHRpTGluZSkge1xuXHQgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmFicyh0aGlzLmRhdGEucmVjdFszXSAtIHRoaXMuZGF0YS5yZWN0WzFdIC0gQk9SREVSX1NJWkUpO1xuXHQgICAgICBjb25zdCBudW1iZXJPZkxpbmVzID0gTWF0aC5yb3VuZChoZWlnaHQgLyAoX3V0aWwuTElORV9GQUNUT1IgKiBmb250U2l6ZSkpIHx8IDE7XG5cdCAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBoZWlnaHQgLyBudW1iZXJPZkxpbmVzO1xuXHQgICAgICBjb21wdXRlZEZvbnRTaXplID0gTWF0aC5taW4oZm9udFNpemUsIHJvdW5kVG9PbmVEZWNpbWFsKGxpbmVIZWlnaHQgLyBfdXRpbC5MSU5FX0ZBQ1RPUikpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnModGhpcy5kYXRhLnJlY3RbM10gLSB0aGlzLmRhdGEucmVjdFsxXSAtIEJPUkRFUl9TSVpFKTtcblx0ICAgICAgY29tcHV0ZWRGb250U2l6ZSA9IE1hdGgubWluKGZvbnRTaXplLCByb3VuZFRvT25lRGVjaW1hbChoZWlnaHQgLyBfdXRpbC5MSU5FX0ZBQ1RPUikpO1xuXHQgICAgfVxuXHQgICAgc3R5bGUuZm9udFNpemUgPSBgY2FsYygke2NvbXB1dGVkRm9udFNpemV9cHggKiB2YXIoLS1zY2FsZS1mYWN0b3IpKWA7XG5cdCAgICBzdHlsZS5jb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKGZvbnRDb2xvclswXSwgZm9udENvbG9yWzFdLCBmb250Q29sb3JbMl0pO1xuXHQgICAgaWYgKHRoaXMuZGF0YS50ZXh0QWxpZ25tZW50ICE9PSBudWxsKSB7XG5cdCAgICAgIHN0eWxlLnRleHRBbGlnbiA9IFRFWFRfQUxJR05NRU5UW3RoaXMuZGF0YS50ZXh0QWxpZ25tZW50XTtcblx0ICAgIH1cblx0ICB9XG5cdCAgX3NldFJlcXVpcmVkKGVsZW1lbnQsIGlzUmVxdWlyZWQpIHtcblx0ICAgIGlmIChpc1JlcXVpcmVkKSB7XG5cdCAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwicmVxdWlyZWRcIiwgdHJ1ZSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInJlcXVpcmVkXCIpO1xuXHQgICAgfVxuXHQgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJhcmlhLXJlcXVpcmVkXCIsIGlzUmVxdWlyZWQpO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBUZXh0V2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gcGFyYW1ldGVycy5yZW5kZXJGb3JtcyB8fCAhcGFyYW1ldGVycy5kYXRhLmhhc0FwcGVhcmFuY2UgJiYgISFwYXJhbWV0ZXJzLmRhdGEuZmllbGRWYWx1ZTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgc2V0UHJvcGVydHlPblNpYmxpbmdzKGJhc2UsIGtleSwgdmFsdWUsIGtleUluU3RvcmFnZSkge1xuXHQgICAgY29uc3Qgc3RvcmFnZSA9IHRoaXMuYW5ub3RhdGlvblN0b3JhZ2U7XG5cdCAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUoYmFzZS5uYW1lLCBiYXNlLmlkKSkge1xuXHQgICAgICBpZiAoZWxlbWVudC5kb21FbGVtZW50KSB7XG5cdCAgICAgICAgZWxlbWVudC5kb21FbGVtZW50W2tleV0gPSB2YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgICBzdG9yYWdlLnNldFZhbHVlKGVsZW1lbnQuaWQsIHtcblx0ICAgICAgICBba2V5SW5TdG9yYWdlXTogdmFsdWVcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuXHQgICAgY29uc3QgaWQgPSB0aGlzLmRhdGEuaWQ7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGV4dFdpZGdldEFubm90YXRpb25cIik7XG5cdCAgICBsZXQgZWxlbWVudCA9IG51bGw7XG5cdCAgICBpZiAodGhpcy5yZW5kZXJGb3Jtcykge1xuXHQgICAgICBjb25zdCBzdG9yZWREYXRhID0gc3RvcmFnZS5nZXRWYWx1ZShpZCwge1xuXHQgICAgICAgIHZhbHVlOiB0aGlzLmRhdGEuZmllbGRWYWx1ZVxuXHQgICAgICB9KTtcblx0ICAgICAgbGV0IHRleHRDb250ZW50ID0gc3RvcmVkRGF0YS5mb3JtYXR0ZWRWYWx1ZSB8fCBzdG9yZWREYXRhLnZhbHVlIHx8IFwiXCI7XG5cdCAgICAgIGNvbnN0IG1heExlbiA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICBjaGFyTGltaXQ6IHRoaXMuZGF0YS5tYXhMZW5cblx0ICAgICAgfSkuY2hhckxpbWl0O1xuXHQgICAgICBpZiAobWF4TGVuICYmIHRleHRDb250ZW50Lmxlbmd0aCA+IG1heExlbikge1xuXHQgICAgICAgIHRleHRDb250ZW50ID0gdGV4dENvbnRlbnQuc2xpY2UoMCwgbWF4TGVuKTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBlbGVtZW50RGF0YSA9IHtcblx0ICAgICAgICB1c2VyVmFsdWU6IHRleHRDb250ZW50LFxuXHQgICAgICAgIGZvcm1hdHRlZFZhbHVlOiBudWxsLFxuXHQgICAgICAgIGxhc3RDb21taXR0ZWRWYWx1ZTogbnVsbCxcblx0ICAgICAgICBjb21taXRLZXk6IDFcblx0ICAgICAgfTtcblx0ICAgICAgaWYgKHRoaXMuZGF0YS5tdWx0aUxpbmUpIHtcblx0ICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXHQgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcblx0ICAgICAgICBpZiAodGhpcy5kYXRhLmRvTm90U2Nyb2xsKSB7XG5cdCAgICAgICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCI7XG5cdCAgICAgICAgfVxuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cdCAgICAgICAgZWxlbWVudC50eXBlID0gXCJ0ZXh0XCI7XG5cdCAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCB0ZXh0Q29udGVudCk7XG5cdCAgICAgICAgaWYgKHRoaXMuZGF0YS5kb05vdFNjcm9sbCkge1xuXHQgICAgICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBcImhpZGRlblwiO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5kYXRhLmhhc093bkNhbnZhcykge1xuXHQgICAgICAgIGVsZW1lbnQuaGlkZGVuID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgICBHZXRFbGVtZW50c0J5TmFtZVNldC5hZGQoZWxlbWVudCk7XG5cdCAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIGlkKTtcblx0ICAgICAgZWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGF0YS5yZWFkT25seTtcblx0ICAgICAgZWxlbWVudC5uYW1lID0gdGhpcy5kYXRhLmZpZWxkTmFtZTtcblx0ICAgICAgZWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuXHQgICAgICB0aGlzLl9zZXRSZXF1aXJlZChlbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuXHQgICAgICBpZiAobWF4TGVuKSB7XG5cdCAgICAgICAgZWxlbWVudC5tYXhMZW5ndGggPSBtYXhMZW47XG5cdCAgICAgIH1cblx0ICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLnNldFByb3BlcnR5T25TaWJsaW5ncyhlbGVtZW50LCBcInZhbHVlXCIsIGV2ZW50LnRhcmdldC52YWx1ZSwgXCJ2YWx1ZVwiKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCBldmVudCA9PiB7XG5cdCAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5kYXRhLmRlZmF1bHRGaWVsZFZhbHVlID8/IFwiXCI7XG5cdCAgICAgICAgZWxlbWVudC52YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcblx0ICAgICAgICBlbGVtZW50RGF0YS5mb3JtYXR0ZWRWYWx1ZSA9IG51bGw7XG5cdCAgICAgIH0pO1xuXHQgICAgICBsZXQgYmx1ckxpc3RlbmVyID0gZXZlbnQgPT4ge1xuXHQgICAgICAgIGNvbnN0IHtcblx0ICAgICAgICAgIGZvcm1hdHRlZFZhbHVlXG5cdCAgICAgICAgfSA9IGVsZW1lbnREYXRhO1xuXHQgICAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBmb3JtYXR0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZXZlbnQudGFyZ2V0LnNjcm9sbExlZnQgPSAwO1xuXHQgICAgICB9O1xuXHQgICAgICBpZiAodGhpcy5lbmFibGVTY3JpcHRpbmcgJiYgdGhpcy5oYXNKU0FjdGlvbnMpIHtcblx0ICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBldmVudCA9PiB7XG5cdCAgICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICAgIHRhcmdldFxuXHQgICAgICAgICAgfSA9IGV2ZW50O1xuXHQgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnVzZXJWYWx1ZSkge1xuXHQgICAgICAgICAgICB0YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBlbGVtZW50RGF0YS5sYXN0Q29tbWl0dGVkVmFsdWUgPSB0YXJnZXQudmFsdWU7XG5cdCAgICAgICAgICBlbGVtZW50RGF0YS5jb21taXRLZXkgPSAxO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGpzRXZlbnQgPT4ge1xuXHQgICAgICAgICAgdGhpcy5zaG93RWxlbWVudEFuZEhpZGVDYW52YXMoanNFdmVudC50YXJnZXQpO1xuXHQgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IHtcblx0ICAgICAgICAgICAgdmFsdWUoZXZlbnQpIHtcblx0ICAgICAgICAgICAgICBlbGVtZW50RGF0YS51c2VyVmFsdWUgPSBldmVudC5kZXRhaWwudmFsdWUgPz8gXCJcIjtcblx0ICAgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZTogZWxlbWVudERhdGEudXNlclZhbHVlLnRvU3RyaW5nKClcblx0ICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBlbGVtZW50RGF0YS51c2VyVmFsdWU7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGZvcm1hdHRlZFZhbHVlKGV2ZW50KSB7XG5cdCAgICAgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWVcblx0ICAgICAgICAgICAgICB9ID0gZXZlbnQuZGV0YWlsO1xuXHQgICAgICAgICAgICAgIGVsZW1lbnREYXRhLmZvcm1hdHRlZFZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG5cdCAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlZFZhbHVlICE9PSBudWxsICYmIGZvcm1hdHRlZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgZXZlbnQudGFyZ2V0ICE9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XG5cdCAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBmb3JtYXR0ZWRWYWx1ZTtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWVcblx0ICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgc2VsUmFuZ2UoZXZlbnQpIHtcblx0ICAgICAgICAgICAgICBldmVudC50YXJnZXQuc2V0U2VsZWN0aW9uUmFuZ2UoLi4uZXZlbnQuZGV0YWlsLnNlbFJhbmdlKTtcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgY2hhckxpbWl0OiBldmVudCA9PiB7XG5cdCAgICAgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICAgICAgY2hhckxpbWl0XG5cdCAgICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcblx0ICAgICAgICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICAgICAgICB0YXJnZXRcblx0ICAgICAgICAgICAgICB9ID0gZXZlbnQ7XG5cdCAgICAgICAgICAgICAgaWYgKGNoYXJMaW1pdCA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShcIm1heExlbmd0aFwiKTtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcIm1heExlbmd0aFwiLCBjaGFyTGltaXQpO1xuXHQgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZTtcblx0ICAgICAgICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA8PSBjaGFyTGltaXQpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBjaGFyTGltaXQpO1xuXHQgICAgICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICAgIHZhbHVlXG5cdCAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcblx0ICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICAgICAgICAgIGRldGFpbDoge1xuXHQgICAgICAgICAgICAgICAgICBpZCxcblx0ICAgICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcblx0ICAgICAgICAgICAgICAgICAgdmFsdWUsXG5cdCAgICAgICAgICAgICAgICAgIHdpbGxDb21taXQ6IHRydWUsXG5cdCAgICAgICAgICAgICAgICAgIGNvbW1pdEtleTogMSxcblx0ICAgICAgICAgICAgICAgICAgc2VsU3RhcnQ6IHRhcmdldC5zZWxlY3Rpb25TdGFydCxcblx0ICAgICAgICAgICAgICAgICAgc2VsRW5kOiB0YXJnZXQuc2VsZWN0aW9uRW5kXG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBldmVudCA9PiB7XG5cdCAgICAgICAgICBlbGVtZW50RGF0YS5jb21taXRLZXkgPSAxO1xuXHQgICAgICAgICAgbGV0IGNvbW1pdEtleSA9IC0xO1xuXHQgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJFc2NhcGVcIikge1xuXHQgICAgICAgICAgICBjb21taXRLZXkgPSAwO1xuXHQgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIiAmJiAhdGhpcy5kYXRhLm11bHRpTGluZSkge1xuXHQgICAgICAgICAgICBjb21taXRLZXkgPSAyO1xuXHQgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIpIHtcblx0ICAgICAgICAgICAgZWxlbWVudERhdGEuY29tbWl0S2V5ID0gMztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGlmIChjb21taXRLZXkgPT09IC0xKSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGNvbnN0IHtcblx0ICAgICAgICAgICAgdmFsdWVcblx0ICAgICAgICAgIH0gPSBldmVudC50YXJnZXQ7XG5cdCAgICAgICAgICBpZiAoZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlID09PSB2YWx1ZSkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBlbGVtZW50RGF0YS5sYXN0Q29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICAgIGVsZW1lbnREYXRhLnVzZXJWYWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgICAgdGhpcy5saW5rU2VydmljZS5ldmVudEJ1cz8uZGlzcGF0Y2goXCJkaXNwYXRjaGV2ZW50aW5zYW5kYm94XCIsIHtcblx0ICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuXHQgICAgICAgICAgICBkZXRhaWw6IHtcblx0ICAgICAgICAgICAgICBpZCxcblx0ICAgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuXHQgICAgICAgICAgICAgIHZhbHVlLFxuXHQgICAgICAgICAgICAgIHdpbGxDb21taXQ6IHRydWUsXG5cdCAgICAgICAgICAgICAgY29tbWl0S2V5LFxuXHQgICAgICAgICAgICAgIHNlbFN0YXJ0OiBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXG5cdCAgICAgICAgICAgICAgc2VsRW5kOiBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGNvbnN0IF9ibHVyTGlzdGVuZXIgPSBibHVyTGlzdGVuZXI7XG5cdCAgICAgICAgYmx1ckxpc3RlbmVyID0gbnVsbDtcblx0ICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGV2ZW50ID0+IHtcblx0ICAgICAgICAgIGlmICghZXZlbnQucmVsYXRlZFRhcmdldCkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICAgIHZhbHVlXG5cdCAgICAgICAgICB9ID0gZXZlbnQudGFyZ2V0O1xuXHQgICAgICAgICAgZWxlbWVudERhdGEudXNlclZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgICBpZiAoZWxlbWVudERhdGEubGFzdENvbW1pdHRlZFZhbHVlICE9PSB2YWx1ZSkge1xuXHQgICAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuXHQgICAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcblx0ICAgICAgICAgICAgICBkZXRhaWw6IHtcblx0ICAgICAgICAgICAgICAgIGlkLFxuXHQgICAgICAgICAgICAgICAgbmFtZTogXCJLZXlzdHJva2VcIixcblx0ICAgICAgICAgICAgICAgIHZhbHVlLFxuXHQgICAgICAgICAgICAgICAgd2lsbENvbW1pdDogdHJ1ZSxcblx0ICAgICAgICAgICAgICAgIGNvbW1pdEtleTogZWxlbWVudERhdGEuY29tbWl0S2V5LFxuXHQgICAgICAgICAgICAgICAgc2VsU3RhcnQ6IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCxcblx0ICAgICAgICAgICAgICAgIHNlbEVuZDogZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZFxuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBfYmx1ckxpc3RlbmVyKGV2ZW50KTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICBpZiAodGhpcy5kYXRhLmFjdGlvbnM/LktleXN0cm9rZSkge1xuXHQgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgICAgICBlbGVtZW50RGF0YS5sYXN0Q29tbWl0dGVkVmFsdWUgPSBudWxsO1xuXHQgICAgICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICAgICAgZGF0YSxcblx0ICAgICAgICAgICAgICB0YXJnZXRcblx0ICAgICAgICAgICAgfSA9IGV2ZW50O1xuXHQgICAgICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICAgICAgdmFsdWUsXG5cdCAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQsXG5cdCAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kXG5cdCAgICAgICAgICAgIH0gPSB0YXJnZXQ7XG5cdCAgICAgICAgICAgIGxldCBzZWxTdGFydCA9IHNlbGVjdGlvblN0YXJ0LFxuXHQgICAgICAgICAgICAgIHNlbEVuZCA9IHNlbGVjdGlvbkVuZDtcblx0ICAgICAgICAgICAgc3dpdGNoIChldmVudC5pbnB1dFR5cGUpIHtcblx0ICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlV29yZEJhY2t3YXJkXCI6XG5cdCAgICAgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdmFsdWUuc3Vic3RyaW5nKDAsIHNlbGVjdGlvblN0YXJ0KS5tYXRjaCgvXFx3KlteXFx3XSokLyk7XG5cdCAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHNlbFN0YXJ0IC09IG1hdGNoWzBdLmxlbmd0aDtcblx0ICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlV29yZEZvcndhcmRcIjpcblx0ICAgICAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB2YWx1ZS5zdWJzdHJpbmcoc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9eW15cXHddKlxcdyovKTtcblx0ICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc2VsRW5kICs9IG1hdGNoWzBdLmxlbmd0aDtcblx0ICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICBjYXNlIFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCI6XG5cdCAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT09IHNlbGVjdGlvbkVuZCkge1xuXHQgICAgICAgICAgICAgICAgICBzZWxTdGFydCAtPSAxO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZUNvbnRlbnRGb3J3YXJkXCI6XG5cdCAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPT09IHNlbGVjdGlvbkVuZCkge1xuXHQgICAgICAgICAgICAgICAgICBzZWxFbmQgKz0gMTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZGlzcGF0Y2hldmVudGluc2FuZGJveFwiLCB7XG5cdCAgICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuXHQgICAgICAgICAgICAgIGRldGFpbDoge1xuXHQgICAgICAgICAgICAgICAgaWQsXG5cdCAgICAgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuXHQgICAgICAgICAgICAgICAgdmFsdWUsXG5cdCAgICAgICAgICAgICAgICBjaGFuZ2U6IGRhdGEgfHwgXCJcIixcblx0ICAgICAgICAgICAgICAgIHdpbGxDb21taXQ6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgc2VsU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzZWxFbmRcblx0ICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LnZhbHVlKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoYmx1ckxpc3RlbmVyKSB7XG5cdCAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBibHVyTGlzdGVuZXIpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLmRhdGEuY29tYikge1xuXHQgICAgICAgIGNvbnN0IGZpZWxkV2lkdGggPSB0aGlzLmRhdGEucmVjdFsyXSAtIHRoaXMuZGF0YS5yZWN0WzBdO1xuXHQgICAgICAgIGNvbnN0IGNvbWJXaWR0aCA9IGZpZWxkV2lkdGggLyBtYXhMZW47XG5cdCAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiY29tYlwiKTtcblx0ICAgICAgICBlbGVtZW50LnN0eWxlLmxldHRlclNwYWNpbmcgPSBgY2FsYygke2NvbWJXaWR0aH1weCAqIHZhcigtLXNjYWxlLWZhY3RvcikgLSAxY2gpYDtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdCAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmRhdGEuZmllbGRWYWx1ZTtcblx0ICAgICAgZWxlbWVudC5zdHlsZS52ZXJ0aWNhbEFsaWduID0gXCJtaWRkbGVcIjtcblx0ICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJ0YWJsZS1jZWxsXCI7XG5cdCAgICB9XG5cdCAgICB0aGlzLl9zZXRUZXh0U3R5bGUoZWxlbWVudCk7XG5cdCAgICB0aGlzLl9zZXRCYWNrZ3JvdW5kQ29sb3IoZWxlbWVudCk7XG5cdCAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhlbGVtZW50KTtcblx0ICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChlbGVtZW50KTtcblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgQ2hlY2tib3hXaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIFdpZGdldEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZTogcGFyYW1ldGVycy5yZW5kZXJGb3Jtc1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuXHQgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcblx0ICAgIGNvbnN0IGlkID0gZGF0YS5pZDtcblx0ICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcblx0ICAgICAgdmFsdWU6IGRhdGEuZXhwb3J0VmFsdWUgPT09IGRhdGEuZmllbGRWYWx1ZVxuXHQgICAgfSkudmFsdWU7XG5cdCAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgIHZhbHVlID0gdmFsdWUgIT09IFwiT2ZmXCI7XG5cdCAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICB2YWx1ZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJidXR0b25XaWRnZXRBbm5vdGF0aW9uXCIsIFwiY2hlY2tCb3hcIik7XG5cdCAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHQgICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKGVsZW1lbnQpO1xuXHQgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuXHQgICAgZWxlbWVudC5kaXNhYmxlZCA9IGRhdGEucmVhZE9ubHk7XG5cdCAgICB0aGlzLl9zZXRSZXF1aXJlZChlbGVtZW50LCB0aGlzLmRhdGEucmVxdWlyZWQpO1xuXHQgICAgZWxlbWVudC50eXBlID0gXCJjaGVja2JveFwiO1xuXHQgICAgZWxlbWVudC5uYW1lID0gZGF0YS5maWVsZE5hbWU7XG5cdCAgICBpZiAodmFsdWUpIHtcblx0ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHRydWUpO1xuXHQgICAgfVxuXHQgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJleHBvcnRWYWx1ZVwiLCBkYXRhLmV4cG9ydFZhbHVlKTtcblx0ICAgIGVsZW1lbnQudGFiSW5kZXggPSBERUZBVUxUX1RBQl9JTkRFWDtcblx0ICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBldmVudCA9PiB7XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBuYW1lLFxuXHQgICAgICAgIGNoZWNrZWRcblx0ICAgICAgfSA9IGV2ZW50LnRhcmdldDtcblx0ICAgICAgZm9yIChjb25zdCBjaGVja2JveCBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShuYW1lLCBpZCkpIHtcblx0ICAgICAgICBjb25zdCBjdXJDaGVja2VkID0gY2hlY2tlZCAmJiBjaGVja2JveC5leHBvcnRWYWx1ZSA9PT0gZGF0YS5leHBvcnRWYWx1ZTtcblx0ICAgICAgICBpZiAoY2hlY2tib3guZG9tRWxlbWVudCkge1xuXHQgICAgICAgICAgY2hlY2tib3guZG9tRWxlbWVudC5jaGVja2VkID0gY3VyQ2hlY2tlZDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShjaGVja2JveC5pZCwge1xuXHQgICAgICAgICAgdmFsdWU6IGN1ckNoZWNrZWRcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgdmFsdWU6IGNoZWNrZWRcblx0ICAgICAgfSk7XG5cdCAgICB9KTtcblx0ICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCBldmVudCA9PiB7XG5cdCAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRhdGEuZGVmYXVsdEZpZWxkVmFsdWUgfHwgXCJPZmZcIjtcblx0ICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBkZWZhdWx0VmFsdWUgPT09IGRhdGEuZXhwb3J0VmFsdWU7XG5cdCAgICB9KTtcblx0ICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuXHQgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcblx0ICAgICAgICBjb25zdCBhY3Rpb25zID0ge1xuXHQgICAgICAgICAgdmFsdWUoZXZlbnQpIHtcblx0ICAgICAgICAgICAgZXZlbnQudGFyZ2V0LmNoZWNrZWQgPSBldmVudC5kZXRhaWwudmFsdWUgIT09IFwiT2ZmXCI7XG5cdCAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICB2YWx1ZTogZXZlbnQudGFyZ2V0LmNoZWNrZWRcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goYWN0aW9ucywganNFdmVudCk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLl9zZXRFdmVudExpc3RlbmVycyhlbGVtZW50LCBbW1wiY2hhbmdlXCIsIFwiVmFsaWRhdGVcIl0sIFtcImNoYW5nZVwiLCBcIkFjdGlvblwiXSwgW1wiZm9jdXNcIiwgXCJGb2N1c1wiXSwgW1wiYmx1clwiLCBcIkJsdXJcIl0sIFtcIm1vdXNlZG93blwiLCBcIk1vdXNlIERvd25cIl0sIFtcIm1vdXNlZW50ZXJcIiwgXCJNb3VzZSBFbnRlclwiXSwgW1wibW91c2VsZWF2ZVwiLCBcIk1vdXNlIEV4aXRcIl0sIFtcIm1vdXNldXBcIiwgXCJNb3VzZSBVcFwiXV0sIGV2ZW50ID0+IGV2ZW50LnRhcmdldC5jaGVja2VkKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihlbGVtZW50KTtcblx0ICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKGVsZW1lbnQpO1xuXHQgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKGVsZW1lbnQpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBSYWRpb0J1dHRvbldpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlOiBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJyYWRpb0J1dHRvblwiKTtcblx0ICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFubm90YXRpb25TdG9yYWdlO1xuXHQgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcblx0ICAgIGNvbnN0IGlkID0gZGF0YS5pZDtcblx0ICAgIGxldCB2YWx1ZSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcblx0ICAgICAgdmFsdWU6IGRhdGEuZmllbGRWYWx1ZSA9PT0gZGF0YS5idXR0b25WYWx1ZVxuXHQgICAgfSkudmFsdWU7XG5cdCAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdCAgICAgIHZhbHVlID0gdmFsdWUgIT09IGRhdGEuYnV0dG9uVmFsdWU7XG5cdCAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICB2YWx1ZVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cdCAgICBHZXRFbGVtZW50c0J5TmFtZVNldC5hZGQoZWxlbWVudCk7XG5cdCAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZWxlbWVudC1pZFwiLCBpZCk7XG5cdCAgICBlbGVtZW50LmRpc2FibGVkID0gZGF0YS5yZWFkT25seTtcblx0ICAgIHRoaXMuX3NldFJlcXVpcmVkKGVsZW1lbnQsIHRoaXMuZGF0YS5yZXF1aXJlZCk7XG5cdCAgICBlbGVtZW50LnR5cGUgPSBcInJhZGlvXCI7XG5cdCAgICBlbGVtZW50Lm5hbWUgPSBkYXRhLmZpZWxkTmFtZTtcblx0ICAgIGlmICh2YWx1ZSkge1xuXHQgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgdHJ1ZSk7XG5cdCAgICB9XG5cdCAgICBlbGVtZW50LnRhYkluZGV4ID0gREVGQVVMVF9UQUJfSU5ERVg7XG5cdCAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZXZlbnQgPT4ge1xuXHQgICAgICBjb25zdCB7XG5cdCAgICAgICAgbmFtZSxcblx0ICAgICAgICBjaGVja2VkXG5cdCAgICAgIH0gPSBldmVudC50YXJnZXQ7XG5cdCAgICAgIGZvciAoY29uc3QgcmFkaW8gb2YgdGhpcy5fZ2V0RWxlbWVudHNCeU5hbWUobmFtZSwgaWQpKSB7XG5cdCAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShyYWRpby5pZCwge1xuXHQgICAgICAgICAgdmFsdWU6IGZhbHNlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgIHZhbHVlOiBjaGVja2VkXG5cdCAgICAgIH0pO1xuXHQgICAgfSk7XG5cdCAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNldGZvcm1cIiwgZXZlbnQgPT4ge1xuXHQgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkYXRhLmRlZmF1bHRGaWVsZFZhbHVlO1xuXHQgICAgICBldmVudC50YXJnZXQuY2hlY2tlZCA9IGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0VmFsdWUgPT09IGRhdGEuYnV0dG9uVmFsdWU7XG5cdCAgICB9KTtcblx0ICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucykge1xuXHQgICAgICBjb25zdCBwZGZCdXR0b25WYWx1ZSA9IGRhdGEuYnV0dG9uVmFsdWU7XG5cdCAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGpzRXZlbnQgPT4ge1xuXHQgICAgICAgIGNvbnN0IGFjdGlvbnMgPSB7XG5cdCAgICAgICAgICB2YWx1ZTogZXZlbnQgPT4ge1xuXHQgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gcGRmQnV0dG9uVmFsdWUgPT09IGV2ZW50LmRldGFpbC52YWx1ZTtcblx0ICAgICAgICAgICAgZm9yIChjb25zdCByYWRpbyBvZiB0aGlzLl9nZXRFbGVtZW50c0J5TmFtZShldmVudC50YXJnZXQubmFtZSkpIHtcblx0ICAgICAgICAgICAgICBjb25zdCBjdXJDaGVja2VkID0gY2hlY2tlZCAmJiByYWRpby5pZCA9PT0gaWQ7XG5cdCAgICAgICAgICAgICAgaWYgKHJhZGlvLmRvbUVsZW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgIHJhZGlvLmRvbUVsZW1lbnQuY2hlY2tlZCA9IGN1ckNoZWNrZWQ7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUocmFkaW8uaWQsIHtcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiBjdXJDaGVja2VkXG5cdCAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRGcm9tU2FuZGJveChhY3Rpb25zLCBqc0V2ZW50KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKGVsZW1lbnQsIFtbXCJjaGFuZ2VcIiwgXCJWYWxpZGF0ZVwiXSwgW1wiY2hhbmdlXCIsIFwiQWN0aW9uXCJdLCBbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdXSwgZXZlbnQgPT4gZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG9yKGVsZW1lbnQpO1xuXHQgICAgdGhpcy5fc2V0RGVmYXVsdFByb3BlcnRpZXNGcm9tSlMoZWxlbWVudCk7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoZWxlbWVudCk7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFB1c2hCdXR0b25XaWRnZXRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIExpbmtBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpZ25vcmVCb3JkZXI6IHBhcmFtZXRlcnMuZGF0YS5oYXNBcHBlYXJhbmNlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgY29uc3QgY29udGFpbmVyID0gc3VwZXIucmVuZGVyKCk7XG5cdCAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChcImJ1dHRvbldpZGdldEFubm90YXRpb25cIiwgXCJwdXNoQnV0dG9uXCIpO1xuXHQgICAgaWYgKHRoaXMuZGF0YS5hbHRlcm5hdGl2ZVRleHQpIHtcblx0ICAgICAgY29udGFpbmVyLnRpdGxlID0gdGhpcy5kYXRhLmFsdGVybmF0aXZlVGV4dDtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gY29udGFpbmVyLmxhc3RDaGlsZDtcblx0ICAgIGlmICh0aGlzLmVuYWJsZVNjcmlwdGluZyAmJiB0aGlzLmhhc0pTQWN0aW9ucyAmJiBsaW5rRWxlbWVudCkge1xuXHQgICAgICB0aGlzLl9zZXREZWZhdWx0UHJvcGVydGllc0Zyb21KUyhsaW5rRWxlbWVudCk7XG5cdCAgICAgIGxpbmtFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVmcm9tc2FuZGJveFwiLCBqc0V2ZW50ID0+IHtcblx0ICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50RnJvbVNhbmRib3goe30sIGpzRXZlbnQpO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBjb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIENob2ljZVdpZGdldEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgV2lkZ2V0QW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlOiBwYXJhbWV0ZXJzLnJlbmRlckZvcm1zXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNob2ljZVdpZGdldEFubm90YXRpb25cIik7XG5cdCAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hbm5vdGF0aW9uU3RvcmFnZTtcblx0ICAgIGNvbnN0IGlkID0gdGhpcy5kYXRhLmlkO1xuXHQgICAgY29uc3Qgc3RvcmVkRGF0YSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcblx0ICAgICAgdmFsdWU6IHRoaXMuZGF0YS5maWVsZFZhbHVlXG5cdCAgICB9KTtcblx0ICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO1xuXHQgICAgR2V0RWxlbWVudHNCeU5hbWVTZXQuYWRkKHNlbGVjdEVsZW1lbnQpO1xuXHQgICAgc2VsZWN0RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWVsZW1lbnQtaWRcIiwgaWQpO1xuXHQgICAgc2VsZWN0RWxlbWVudC5kaXNhYmxlZCA9IHRoaXMuZGF0YS5yZWFkT25seTtcblx0ICAgIHRoaXMuX3NldFJlcXVpcmVkKHNlbGVjdEVsZW1lbnQsIHRoaXMuZGF0YS5yZXF1aXJlZCk7XG5cdCAgICBzZWxlY3RFbGVtZW50Lm5hbWUgPSB0aGlzLmRhdGEuZmllbGROYW1lO1xuXHQgICAgc2VsZWN0RWxlbWVudC50YWJJbmRleCA9IERFRkFVTFRfVEFCX0lOREVYO1xuXHQgICAgbGV0IGFkZEFuRW1wdHlFbnRyeSA9IHRoaXMuZGF0YS5jb21ibyAmJiB0aGlzLmRhdGEub3B0aW9ucy5sZW5ndGggPiAwO1xuXHQgICAgaWYgKCF0aGlzLmRhdGEuY29tYm8pIHtcblx0ICAgICAgc2VsZWN0RWxlbWVudC5zaXplID0gdGhpcy5kYXRhLm9wdGlvbnMubGVuZ3RoO1xuXHQgICAgICBpZiAodGhpcy5kYXRhLm11bHRpU2VsZWN0KSB7XG5cdCAgICAgICAgc2VsZWN0RWxlbWVudC5tdWx0aXBsZSA9IHRydWU7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2V0Zm9ybVwiLCBldmVudCA9PiB7XG5cdCAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YS5kZWZhdWx0RmllbGRWYWx1ZTtcblx0ICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygc2VsZWN0RWxlbWVudC5vcHRpb25zKSB7XG5cdCAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gb3B0aW9uLnZhbHVlID09PSBkZWZhdWx0VmFsdWU7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5kYXRhLm9wdGlvbnMpIHtcblx0ICAgICAgY29uc3Qgb3B0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG5cdCAgICAgIG9wdGlvbkVsZW1lbnQudGV4dENvbnRlbnQgPSBvcHRpb24uZGlzcGxheVZhbHVlO1xuXHQgICAgICBvcHRpb25FbGVtZW50LnZhbHVlID0gb3B0aW9uLmV4cG9ydFZhbHVlO1xuXHQgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZS5pbmNsdWRlcyhvcHRpb24uZXhwb3J0VmFsdWUpKSB7XG5cdCAgICAgICAgb3B0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiLCB0cnVlKTtcblx0ICAgICAgICBhZGRBbkVtcHR5RW50cnkgPSBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBzZWxlY3RFbGVtZW50LmFwcGVuZChvcHRpb25FbGVtZW50KTtcblx0ICAgIH1cblx0ICAgIGxldCByZW1vdmVFbXB0eUVudHJ5ID0gbnVsbDtcblx0ICAgIGlmIChhZGRBbkVtcHR5RW50cnkpIHtcblx0ICAgICAgY29uc3Qgbm9uZU9wdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO1xuXHQgICAgICBub25lT3B0aW9uRWxlbWVudC52YWx1ZSA9IFwiIFwiO1xuXHQgICAgICBub25lT3B0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgdHJ1ZSk7XG5cdCAgICAgIG5vbmVPcHRpb25FbGVtZW50LnNldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIsIHRydWUpO1xuXHQgICAgICBzZWxlY3RFbGVtZW50LnByZXBlbmQobm9uZU9wdGlvbkVsZW1lbnQpO1xuXHQgICAgICByZW1vdmVFbXB0eUVudHJ5ID0gKCkgPT4ge1xuXHQgICAgICAgIG5vbmVPcHRpb25FbGVtZW50LnJlbW92ZSgpO1xuXHQgICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHJlbW92ZUVtcHR5RW50cnkpO1xuXHQgICAgICAgIHJlbW92ZUVtcHR5RW50cnkgPSBudWxsO1xuXHQgICAgICB9O1xuXHQgICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCByZW1vdmVFbXB0eUVudHJ5KTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGdldFZhbHVlID0gaXNFeHBvcnQgPT4ge1xuXHQgICAgICBjb25zdCBuYW1lID0gaXNFeHBvcnQgPyBcInZhbHVlXCIgOiBcInRleHRDb250ZW50XCI7XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBvcHRpb25zLFxuXHQgICAgICAgIG11bHRpcGxlXG5cdCAgICAgIH0gPSBzZWxlY3RFbGVtZW50O1xuXHQgICAgICBpZiAoIW11bHRpcGxlKSB7XG5cdCAgICAgICAgcmV0dXJuIG9wdGlvbnMuc2VsZWN0ZWRJbmRleCA9PT0gLTEgPyBudWxsIDogb3B0aW9uc1tvcHRpb25zLnNlbGVjdGVkSW5kZXhdW25hbWVdO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwob3B0aW9ucywgb3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCkubWFwKG9wdGlvbiA9PiBvcHRpb25bbmFtZV0pO1xuXHQgICAgfTtcblx0ICAgIGxldCBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcblx0ICAgIGNvbnN0IGdldEl0ZW1zID0gZXZlbnQgPT4ge1xuXHQgICAgICBjb25zdCBvcHRpb25zID0gZXZlbnQudGFyZ2V0Lm9wdGlvbnM7XG5cdCAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwob3B0aW9ucywgb3B0aW9uID0+IHtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgZGlzcGxheVZhbHVlOiBvcHRpb24udGV4dENvbnRlbnQsXG5cdCAgICAgICAgICBleHBvcnRWYWx1ZTogb3B0aW9uLnZhbHVlXG5cdCAgICAgICAgfTtcblx0ICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgaWYgKHRoaXMuZW5hYmxlU2NyaXB0aW5nICYmIHRoaXMuaGFzSlNBY3Rpb25zKSB7XG5cdCAgICAgIHNlbGVjdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWZyb21zYW5kYm94XCIsIGpzRXZlbnQgPT4ge1xuXHQgICAgICAgIGNvbnN0IGFjdGlvbnMgPSB7XG5cdCAgICAgICAgICB2YWx1ZShldmVudCkge1xuXHQgICAgICAgICAgICByZW1vdmVFbXB0eUVudHJ5Py4oKTtcblx0ICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBldmVudC5kZXRhaWwudmFsdWU7XG5cdCAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pO1xuXHQgICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBzZWxlY3RFbGVtZW50Lm9wdGlvbnMpIHtcblx0ICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgbXVsdGlwbGVTZWxlY3Rpb24oZXZlbnQpIHtcblx0ICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5tdWx0aXBsZSA9IHRydWU7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgcmVtb3ZlKGV2ZW50KSB7XG5cdCAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBzZWxlY3RFbGVtZW50Lm9wdGlvbnM7XG5cdCAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZXZlbnQuZGV0YWlsLnJlbW92ZTtcblx0ICAgICAgICAgICAgb3B0aW9uc1tpbmRleF0uc2VsZWN0ZWQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5yZW1vdmUoaW5kZXgpO1xuXHQgICAgICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgY29uc3QgaSA9IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXguY2FsbChvcHRpb25zLCBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcblx0ICAgICAgICAgICAgICBpZiAoaSA9PT0gLTEpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpLFxuXHQgICAgICAgICAgICAgIGl0ZW1zOiBnZXRJdGVtcyhldmVudClcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuXHQgICAgICAgICAgfSxcblx0ICAgICAgICAgIGNsZWFyKGV2ZW50KSB7XG5cdCAgICAgICAgICAgIHdoaWxlIChzZWxlY3RFbGVtZW50Lmxlbmd0aCAhPT0gMCkge1xuXHQgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQucmVtb3ZlKDApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICB2YWx1ZTogbnVsbCxcblx0ICAgICAgICAgICAgICBpdGVtczogW11cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzID0gZ2V0VmFsdWUoZmFsc2UpO1xuXHQgICAgICAgICAgfSxcblx0ICAgICAgICAgIGluc2VydChldmVudCkge1xuXHQgICAgICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICAgICAgaW5kZXgsXG5cdCAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuXHQgICAgICAgICAgICAgIGV4cG9ydFZhbHVlXG5cdCAgICAgICAgICAgIH0gPSBldmVudC5kZXRhaWwuaW5zZXJ0O1xuXHQgICAgICAgICAgICBjb25zdCBzZWxlY3RDaGlsZCA9IHNlbGVjdEVsZW1lbnQuY2hpbGRyZW5baW5kZXhdO1xuXHQgICAgICAgICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcblx0ICAgICAgICAgICAgb3B0aW9uRWxlbWVudC50ZXh0Q29udGVudCA9IGRpc3BsYXlWYWx1ZTtcblx0ICAgICAgICAgICAgb3B0aW9uRWxlbWVudC52YWx1ZSA9IGV4cG9ydFZhbHVlO1xuXHQgICAgICAgICAgICBpZiAoc2VsZWN0Q2hpbGQpIHtcblx0ICAgICAgICAgICAgICBzZWxlY3RDaGlsZC5iZWZvcmUob3B0aW9uRWxlbWVudCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5hcHBlbmQob3B0aW9uRWxlbWVudCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICAgIHZhbHVlOiBnZXRWYWx1ZSh0cnVlKSxcblx0ICAgICAgICAgICAgICBpdGVtczogZ2V0SXRlbXMoZXZlbnQpXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcblx0ICAgICAgICAgIH0sXG5cdCAgICAgICAgICBpdGVtcyhldmVudCkge1xuXHQgICAgICAgICAgICBjb25zdCB7XG5cdCAgICAgICAgICAgICAgaXRlbXNcblx0ICAgICAgICAgICAgfSA9IGV2ZW50LmRldGFpbDtcblx0ICAgICAgICAgICAgd2hpbGUgKHNlbGVjdEVsZW1lbnQubGVuZ3RoICE9PSAwKSB7XG5cdCAgICAgICAgICAgICAgc2VsZWN0RWxlbWVudC5yZW1vdmUoMCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG5cdCAgICAgICAgICAgICAgY29uc3Qge1xuXHQgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuXHQgICAgICAgICAgICAgICAgZXhwb3J0VmFsdWVcblx0ICAgICAgICAgICAgICB9ID0gaXRlbTtcblx0ICAgICAgICAgICAgICBjb25zdCBvcHRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKTtcblx0ICAgICAgICAgICAgICBvcHRpb25FbGVtZW50LnRleHRDb250ZW50ID0gZGlzcGxheVZhbHVlO1xuXHQgICAgICAgICAgICAgIG9wdGlvbkVsZW1lbnQudmFsdWUgPSBleHBvcnRWYWx1ZTtcblx0ICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50LmFwcGVuZChvcHRpb25FbGVtZW50KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoc2VsZWN0RWxlbWVudC5vcHRpb25zLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICBzZWxlY3RFbGVtZW50Lm9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHN0b3JhZ2Uuc2V0VmFsdWUoaWQsIHtcblx0ICAgICAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSksXG5cdCAgICAgICAgICAgICAgaXRlbXM6IGdldEl0ZW1zKGV2ZW50KVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMgPSBnZXRWYWx1ZShmYWxzZSk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgaW5kaWNlcyhldmVudCkge1xuXHQgICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gbmV3IFNldChldmVudC5kZXRhaWwuaW5kaWNlcyk7XG5cdCAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGV2ZW50LnRhcmdldC5vcHRpb25zKSB7XG5cdCAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gaW5kaWNlcy5oYXMob3B0aW9uLmluZGV4KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgdmFsdWU6IGdldFZhbHVlKHRydWUpXG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcyA9IGdldFZhbHVlKGZhbHNlKTtcblx0ICAgICAgICAgIH0sXG5cdCAgICAgICAgICBlZGl0YWJsZShldmVudCkge1xuXHQgICAgICAgICAgICBldmVudC50YXJnZXQuZGlzYWJsZWQgPSAhZXZlbnQuZGV0YWlsLmVkaXRhYmxlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudEZyb21TYW5kYm94KGFjdGlvbnMsIGpzRXZlbnQpO1xuXHQgICAgICB9KTtcblx0ICAgICAgc2VsZWN0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgIGNvbnN0IGV4cG9ydFZhbHVlID0gZ2V0VmFsdWUodHJ1ZSk7XG5cdCAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgdmFsdWU6IGV4cG9ydFZhbHVlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLmV2ZW50QnVzPy5kaXNwYXRjaChcImRpc3BhdGNoZXZlbnRpbnNhbmRib3hcIiwge1xuXHQgICAgICAgICAgc291cmNlOiB0aGlzLFxuXHQgICAgICAgICAgZGV0YWlsOiB7XG5cdCAgICAgICAgICAgIGlkLFxuXHQgICAgICAgICAgICBuYW1lOiBcIktleXN0cm9rZVwiLFxuXHQgICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRWYWx1ZXMsXG5cdCAgICAgICAgICAgIGNoYW5nZUV4OiBleHBvcnRWYWx1ZSxcblx0ICAgICAgICAgICAgd2lsbENvbW1pdDogZmFsc2UsXG5cdCAgICAgICAgICAgIGNvbW1pdEtleTogMSxcblx0ICAgICAgICAgICAga2V5RG93bjogZmFsc2Vcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuX3NldEV2ZW50TGlzdGVuZXJzKHNlbGVjdEVsZW1lbnQsIFtbXCJmb2N1c1wiLCBcIkZvY3VzXCJdLCBbXCJibHVyXCIsIFwiQmx1clwiXSwgW1wibW91c2Vkb3duXCIsIFwiTW91c2UgRG93blwiXSwgW1wibW91c2VlbnRlclwiLCBcIk1vdXNlIEVudGVyXCJdLCBbXCJtb3VzZWxlYXZlXCIsIFwiTW91c2UgRXhpdFwiXSwgW1wibW91c2V1cFwiLCBcIk1vdXNlIFVwXCJdLCBbXCJpbnB1dFwiLCBcIkFjdGlvblwiXSwgW1wiaW5wdXRcIiwgXCJWYWxpZGF0ZVwiXV0sIGV2ZW50ID0+IGV2ZW50LnRhcmdldC52YWx1ZSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBzZWxlY3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICB2YWx1ZTogZ2V0VmFsdWUodHJ1ZSlcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5kYXRhLmNvbWJvKSB7XG5cdCAgICAgIHRoaXMuX3NldFRleHRTdHlsZShzZWxlY3RFbGVtZW50KTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvcihzZWxlY3RFbGVtZW50KTtcblx0ICAgIHRoaXMuX3NldERlZmF1bHRQcm9wZXJ0aWVzRnJvbUpTKHNlbGVjdEVsZW1lbnQpO1xuXHQgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHNlbGVjdEVsZW1lbnQpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBQb3B1cEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIHN0YXRpYyBJR05PUkVfVFlQRVMgPSBuZXcgU2V0KFtcIkxpbmVcIiwgXCJTcXVhcmVcIiwgXCJDaXJjbGVcIiwgXCJQb2x5TGluZVwiLCBcIlBvbHlnb25cIiwgXCJJbmtcIl0pO1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgZGF0YVxuXHQgICAgfSA9IHBhcmFtZXRlcnM7XG5cdCAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhUG9wdXBBbm5vdGF0aW9uRWxlbWVudC5JR05PUkVfVFlQRVMuaGFzKGRhdGEucGFyZW50VHlwZSkgJiYgISEoZGF0YS50aXRsZU9iaj8uc3RyIHx8IGRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBkYXRhLnJpY2hUZXh0Py5zdHIpO1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpc1JlbmRlcmFibGVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwicG9wdXBBbm5vdGF0aW9uXCIpO1xuXHQgICAgY29uc3QgcGFyZW50RWxlbWVudHMgPSB0aGlzLmxheWVyLnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLWFubm90YXRpb24taWQ9XCIke3RoaXMuZGF0YS5wYXJlbnRJZH1cIl1gKTtcblx0ICAgIGlmIChwYXJlbnRFbGVtZW50cy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgICAgfVxuXHQgICAgY29uc3QgcG9wdXAgPSBuZXcgUG9wdXBFbGVtZW50KHtcblx0ICAgICAgY29udGFpbmVyOiB0aGlzLmNvbnRhaW5lcixcblx0ICAgICAgdHJpZ2dlcjogQXJyYXkuZnJvbShwYXJlbnRFbGVtZW50cyksXG5cdCAgICAgIGNvbG9yOiB0aGlzLmRhdGEuY29sb3IsXG5cdCAgICAgIHRpdGxlT2JqOiB0aGlzLmRhdGEudGl0bGVPYmosXG5cdCAgICAgIG1vZGlmaWNhdGlvbkRhdGU6IHRoaXMuZGF0YS5tb2RpZmljYXRpb25EYXRlLFxuXHQgICAgICBjb250ZW50c09iajogdGhpcy5kYXRhLmNvbnRlbnRzT2JqLFxuXHQgICAgICByaWNoVGV4dDogdGhpcy5kYXRhLnJpY2hUZXh0XG5cdCAgICB9KTtcblx0ICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBhZ2U7XG5cdCAgICBjb25zdCByZWN0ID0gX3V0aWwuVXRpbC5ub3JtYWxpemVSZWN0KFt0aGlzLmRhdGEucGFyZW50UmVjdFswXSwgcGFnZS52aWV3WzNdIC0gdGhpcy5kYXRhLnBhcmVudFJlY3RbMV0gKyBwYWdlLnZpZXdbMV0sIHRoaXMuZGF0YS5wYXJlbnRSZWN0WzJdLCBwYWdlLnZpZXdbM10gLSB0aGlzLmRhdGEucGFyZW50UmVjdFszXSArIHBhZ2Uudmlld1sxXV0pO1xuXHQgICAgY29uc3QgcG9wdXBMZWZ0ID0gcmVjdFswXSArIHRoaXMuZGF0YS5wYXJlbnRSZWN0WzJdIC0gdGhpcy5kYXRhLnBhcmVudFJlY3RbMF07XG5cdCAgICBjb25zdCBwb3B1cFRvcCA9IHJlY3RbMV07XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHBhZ2VXaWR0aCxcblx0ICAgICAgcGFnZUhlaWdodCxcblx0ICAgICAgcGFnZVgsXG5cdCAgICAgIHBhZ2VZXG5cdCAgICB9ID0gdGhpcy52aWV3cG9ydC5yYXdEaW1zO1xuXHQgICAgdGhpcy5jb250YWluZXIuc3R5bGUubGVmdCA9IGAkezEwMCAqIChwb3B1cExlZnQgLSBwYWdlWCkgLyBwYWdlV2lkdGh9JWA7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHsxMDAgKiAocG9wdXBUb3AgLSBwYWdlWSkgLyBwYWdlSGVpZ2h0fSVgO1xuXHQgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHBvcHVwLnJlbmRlcigpKTtcblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUG9wdXBFbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lciA9IHBhcmFtZXRlcnMuY29udGFpbmVyO1xuXHQgICAgdGhpcy50cmlnZ2VyID0gcGFyYW1ldGVycy50cmlnZ2VyO1xuXHQgICAgdGhpcy5jb2xvciA9IHBhcmFtZXRlcnMuY29sb3I7XG5cdCAgICB0aGlzLnRpdGxlT2JqID0gcGFyYW1ldGVycy50aXRsZU9iajtcblx0ICAgIHRoaXMubW9kaWZpY2F0aW9uRGF0ZSA9IHBhcmFtZXRlcnMubW9kaWZpY2F0aW9uRGF0ZTtcblx0ICAgIHRoaXMuY29udGVudHNPYmogPSBwYXJhbWV0ZXJzLmNvbnRlbnRzT2JqO1xuXHQgICAgdGhpcy5yaWNoVGV4dCA9IHBhcmFtZXRlcnMucmljaFRleHQ7XG5cdCAgICB0aGlzLmhpZGVXcmFwcGVyID0gcGFyYW1ldGVycy5oaWRlV3JhcHBlciB8fCBmYWxzZTtcblx0ICAgIHRoaXMucGlubmVkID0gZmFsc2U7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGNvbnN0IEJBQ0tHUk9VTkRfRU5MSUdIVCA9IDAuNztcblx0ICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKFwicG9wdXBXcmFwcGVyXCIpO1xuXHQgICAgdGhpcy5oaWRlRWxlbWVudCA9IHRoaXMuaGlkZVdyYXBwZXIgPyB3cmFwcGVyIDogdGhpcy5jb250YWluZXI7XG5cdCAgICB0aGlzLmhpZGVFbGVtZW50LmhpZGRlbiA9IHRydWU7XG5cdCAgICBjb25zdCBwb3B1cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdCAgICBwb3B1cC5jbGFzc0xpc3QuYWRkKFwicG9wdXBcIik7XG5cdCAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3I7XG5cdCAgICBpZiAoY29sb3IpIHtcblx0ICAgICAgY29uc3QgciA9IEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjb2xvclswXSkgKyBjb2xvclswXTtcblx0ICAgICAgY29uc3QgZyA9IEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjb2xvclsxXSkgKyBjb2xvclsxXTtcblx0ICAgICAgY29uc3QgYiA9IEJBQ0tHUk9VTkRfRU5MSUdIVCAqICgyNTUgLSBjb2xvclsyXSkgKyBjb2xvclsyXTtcblx0ICAgICAgcG9wdXAuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IociB8IDAsIGcgfCAwLCBiIHwgMCk7XG5cdCAgICB9XG5cdCAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJoMVwiKTtcblx0ICAgIHRpdGxlLmRpciA9IHRoaXMudGl0bGVPYmouZGlyO1xuXHQgICAgdGl0bGUudGV4dENvbnRlbnQgPSB0aGlzLnRpdGxlT2JqLnN0cjtcblx0ICAgIHBvcHVwLmFwcGVuZCh0aXRsZSk7XG5cdCAgICBjb25zdCBkYXRlT2JqZWN0ID0gX2Rpc3BsYXlfdXRpbHMuUERGRGF0ZVN0cmluZy50b0RhdGVPYmplY3QodGhpcy5tb2RpZmljYXRpb25EYXRlKTtcblx0ICAgIGlmIChkYXRlT2JqZWN0KSB7XG5cdCAgICAgIGNvbnN0IG1vZGlmaWNhdGlvbkRhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcblx0ICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5jbGFzc0xpc3QuYWRkKFwicG9wdXBEYXRlXCIpO1xuXHQgICAgICBtb2RpZmljYXRpb25EYXRlLnRleHRDb250ZW50ID0gXCJ7e2RhdGV9fSwge3t0aW1lfX1cIjtcblx0ICAgICAgbW9kaWZpY2F0aW9uRGF0ZS5kYXRhc2V0LmwxMG5JZCA9IFwiYW5ub3RhdGlvbl9kYXRlX3N0cmluZ1wiO1xuXHQgICAgICBtb2RpZmljYXRpb25EYXRlLmRhdGFzZXQubDEwbkFyZ3MgPSBKU09OLnN0cmluZ2lmeSh7XG5cdCAgICAgICAgZGF0ZTogZGF0ZU9iamVjdC50b0xvY2FsZURhdGVTdHJpbmcoKSxcblx0ICAgICAgICB0aW1lOiBkYXRlT2JqZWN0LnRvTG9jYWxlVGltZVN0cmluZygpXG5cdCAgICAgIH0pO1xuXHQgICAgICBwb3B1cC5hcHBlbmQobW9kaWZpY2F0aW9uRGF0ZSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5yaWNoVGV4dD8uc3RyICYmICghdGhpcy5jb250ZW50c09iaj8uc3RyIHx8IHRoaXMuY29udGVudHNPYmouc3RyID09PSB0aGlzLnJpY2hUZXh0LnN0cikpIHtcblx0ICAgICAgX3hmYV9sYXllci5YZmFMYXllci5yZW5kZXIoe1xuXHQgICAgICAgIHhmYUh0bWw6IHRoaXMucmljaFRleHQuaHRtbCxcblx0ICAgICAgICBpbnRlbnQ6IFwicmljaFRleHRcIixcblx0ICAgICAgICBkaXY6IHBvcHVwXG5cdCAgICAgIH0pO1xuXHQgICAgICBwb3B1cC5sYXN0Q2hpbGQuY2xhc3NMaXN0LmFkZChcInJpY2hUZXh0XCIsIFwicG9wdXBDb250ZW50XCIpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc3QgY29udGVudHMgPSB0aGlzLl9mb3JtYXRDb250ZW50cyh0aGlzLmNvbnRlbnRzT2JqKTtcblx0ICAgICAgcG9wdXAuYXBwZW5kKGNvbnRlbnRzKTtcblx0ICAgIH1cblx0ICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnRyaWdnZXIpKSB7XG5cdCAgICAgIHRoaXMudHJpZ2dlciA9IFt0aGlzLnRyaWdnZXJdO1xuXHQgICAgfVxuXHQgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMudHJpZ2dlcikge1xuXHQgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLl90b2dnbGUuYmluZCh0aGlzKSk7XG5cdCAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCB0aGlzLl9zaG93LmJpbmQodGhpcywgZmFsc2UpKTtcblx0ICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgdGhpcy5faGlkZS5iaW5kKHRoaXMsIGZhbHNlKSk7XG5cdCAgICB9XG5cdCAgICBwb3B1cC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGlkZS5iaW5kKHRoaXMsIHRydWUpKTtcblx0ICAgIHdyYXBwZXIuYXBwZW5kKHBvcHVwKTtcblx0ICAgIHJldHVybiB3cmFwcGVyO1xuXHQgIH1cblx0ICBfZm9ybWF0Q29udGVudHMoe1xuXHQgICAgc3RyLFxuXHQgICAgZGlyXG5cdCAgfSkge1xuXHQgICAgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xuXHQgICAgcC5jbGFzc0xpc3QuYWRkKFwicG9wdXBDb250ZW50XCIpO1xuXHQgICAgcC5kaXIgPSBkaXI7XG5cdCAgICBjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgvKD86XFxyXFxuP3xcXG4pLyk7XG5cdCAgICBmb3IgKGxldCBpID0gMCwgaWkgPSBsaW5lcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG5cdCAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcblx0ICAgICAgcC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGluZSkpO1xuXHQgICAgICBpZiAoaSA8IGlpIC0gMSkge1xuXHQgICAgICAgIHAuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiBwO1xuXHQgIH1cblx0ICBfdG9nZ2xlKCkge1xuXHQgICAgaWYgKHRoaXMucGlubmVkKSB7XG5cdCAgICAgIHRoaXMuX2hpZGUodHJ1ZSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLl9zaG93KHRydWUpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBfc2hvdyhwaW4gPSBmYWxzZSkge1xuXHQgICAgaWYgKHBpbikge1xuXHQgICAgICB0aGlzLnBpbm5lZCA9IHRydWU7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5oaWRlRWxlbWVudC5oaWRkZW4pIHtcblx0ICAgICAgdGhpcy5oaWRlRWxlbWVudC5oaWRkZW4gPSBmYWxzZTtcblx0ICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuekluZGV4ID0gcGFyc2VJbnQodGhpcy5jb250YWluZXIuc3R5bGUuekluZGV4KSArIDEwMDA7XG5cdCAgICB9XG5cdCAgfVxuXHQgIF9oaWRlKHVucGluID0gdHJ1ZSkge1xuXHQgICAgaWYgKHVucGluKSB7XG5cdCAgICAgIHRoaXMucGlubmVkID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuaGlkZUVsZW1lbnQuaGlkZGVuICYmICF0aGlzLnBpbm5lZCkge1xuXHQgICAgICB0aGlzLmhpZGVFbGVtZW50LmhpZGRlbiA9IHRydWU7XG5cdCAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IHBhcnNlSW50KHRoaXMuY29udGFpbmVyLnN0eWxlLnpJbmRleCkgLSAxMDAwO1xuXHQgICAgfVxuXHQgIH1cblx0fVxuXHRjbGFzcyBGcmVlVGV4dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlXG5cdCAgICB9KTtcblx0ICAgIHRoaXMudGV4dENvbnRlbnQgPSBwYXJhbWV0ZXJzLmRhdGEudGV4dENvbnRlbnQ7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJmcmVlVGV4dEFubm90YXRpb25cIik7XG5cdCAgICBpZiAodGhpcy50ZXh0Q29udGVudCkge1xuXHQgICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKFwiYW5ub3RhdGlvblRleHRDb250ZW50XCIpO1xuXHQgICAgICBjb250ZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJjb21tZW50XCIpO1xuXHQgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy50ZXh0Q29udGVudCkge1xuXHQgICAgICAgIGNvbnN0IGxpbmVTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdCAgICAgICAgbGluZVNwYW4udGV4dENvbnRlbnQgPSBsaW5lO1xuXHQgICAgICAgIGNvbnRlbnQuYXBwZW5kKGxpbmVTcGFuKTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoY29udGVudCk7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCkge1xuXHQgICAgICB0aGlzLl9jcmVhdGVQb3B1cChudWxsLCB0aGlzLmRhdGEpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBMaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlLFxuXHQgICAgICBpZ25vcmVCb3JkZXI6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibGluZUFubm90YXRpb25cIik7XG5cdCAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhO1xuXHQgICAgY29uc3Qge1xuXHQgICAgICB3aWR0aCxcblx0ICAgICAgaGVpZ2h0XG5cdCAgICB9ID0gZ2V0UmVjdERpbXMoZGF0YS5yZWN0KTtcblx0ICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGUod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG5cdCAgICBjb25zdCBsaW5lID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bGluZVwiKTtcblx0ICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieDFcIiwgZGF0YS5yZWN0WzJdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbMF0pO1xuXHQgICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJ5MVwiLCBkYXRhLnJlY3RbM10gLSBkYXRhLmxpbmVDb29yZGluYXRlc1sxXSk7XG5cdCAgICBsaW5lLnNldEF0dHJpYnV0ZShcIngyXCIsIGRhdGEucmVjdFsyXSAtIGRhdGEubGluZUNvb3JkaW5hdGVzWzJdKTtcblx0ICAgIGxpbmUuc2V0QXR0cmlidXRlKFwieTJcIiwgZGF0YS5yZWN0WzNdIC0gZGF0YS5saW5lQ29vcmRpbmF0ZXNbM10pO1xuXHQgICAgbGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcblx0ICAgIGxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwidHJhbnNwYXJlbnRcIik7XG5cdCAgICBsaW5lLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcblx0ICAgIHN2Zy5hcHBlbmQobGluZSk7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcblx0ICAgIHRoaXMuX2NyZWF0ZVBvcHVwKGxpbmUsIGRhdGEpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBTcXVhcmVBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBjb25zdCBpc1JlbmRlcmFibGUgPSAhIShwYXJhbWV0ZXJzLmRhdGEuaGFzUG9wdXAgfHwgcGFyYW1ldGVycy5kYXRhLnRpdGxlT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLmNvbnRlbnRzT2JqPy5zdHIgfHwgcGFyYW1ldGVycy5kYXRhLnJpY2hUZXh0Py5zdHIpO1xuXHQgICAgc3VwZXIocGFyYW1ldGVycywge1xuXHQgICAgICBpc1JlbmRlcmFibGUsXG5cdCAgICAgIGlnbm9yZUJvcmRlcjogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzcXVhcmVBbm5vdGF0aW9uXCIpO1xuXHQgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgd2lkdGgsXG5cdCAgICAgIGhlaWdodFxuXHQgICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG5cdCAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuXHQgICAgY29uc3QgYm9yZGVyV2lkdGggPSBkYXRhLmJvcmRlclN0eWxlLndpZHRoO1xuXHQgICAgY29uc3Qgc3F1YXJlID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcblx0ICAgIHNxdWFyZS5zZXRBdHRyaWJ1dGUoXCJ4XCIsIGJvcmRlcldpZHRoIC8gMik7XG5cdCAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwieVwiLCBib3JkZXJXaWR0aCAvIDIpO1xuXHQgICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHdpZHRoIC0gYm9yZGVyV2lkdGgpO1xuXHQgICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoZWlnaHQgLSBib3JkZXJXaWR0aCk7XG5cdCAgICBzcXVhcmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGJvcmRlcldpZHRoIHx8IDEpO1xuXHQgICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuXHQgICAgc3F1YXJlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJ0cmFuc3BhcmVudFwiKTtcblx0ICAgIHN2Zy5hcHBlbmQoc3F1YXJlKTtcblx0ICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZChzdmcpO1xuXHQgICAgdGhpcy5fY3JlYXRlUG9wdXAoc3F1YXJlLCBkYXRhKTtcblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgQ2lyY2xlQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlLFxuXHQgICAgICBpZ25vcmVCb3JkZXI6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2lyY2xlQW5ub3RhdGlvblwiKTtcblx0ICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHdpZHRoLFxuXHQgICAgICBoZWlnaHRcblx0ICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuXHQgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcblx0ICAgIGNvbnN0IGJvcmRlcldpZHRoID0gZGF0YS5ib3JkZXJTdHlsZS53aWR0aDtcblx0ICAgIGNvbnN0IGNpcmNsZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmVsbGlwc2VcIik7XG5cdCAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwiY3hcIiwgd2lkdGggLyAyKTtcblx0ICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJjeVwiLCBoZWlnaHQgLyAyKTtcblx0ICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJyeFwiLCB3aWR0aCAvIDIgLSBib3JkZXJXaWR0aCAvIDIpO1xuXHQgICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInJ5XCIsIGhlaWdodCAvIDIgLSBib3JkZXJXaWR0aCAvIDIpO1xuXHQgICAgY2lyY2xlLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBib3JkZXJXaWR0aCB8fCAxKTtcblx0ICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcblx0ICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwidHJhbnNwYXJlbnRcIik7XG5cdCAgICBzdmcuYXBwZW5kKGNpcmNsZSk7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcblx0ICAgIHRoaXMuX2NyZWF0ZVBvcHVwKGNpcmNsZSwgZGF0YSk7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFBvbHlsaW5lQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlLFxuXHQgICAgICBpZ25vcmVCb3JkZXI6IHRydWVcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcInBvbHlsaW5lQW5ub3RhdGlvblwiO1xuXHQgICAgdGhpcy5zdmdFbGVtZW50TmFtZSA9IFwic3ZnOnBvbHlsaW5lXCI7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5jb250YWluZXJDbGFzc05hbWUpO1xuXHQgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YTtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgd2lkdGgsXG5cdCAgICAgIGhlaWdodFxuXHQgICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG5cdCAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuXHQgICAgbGV0IHBvaW50cyA9IFtdO1xuXHQgICAgZm9yIChjb25zdCBjb29yZGluYXRlIG9mIGRhdGEudmVydGljZXMpIHtcblx0ICAgICAgY29uc3QgeCA9IGNvb3JkaW5hdGUueCAtIGRhdGEucmVjdFswXTtcblx0ICAgICAgY29uc3QgeSA9IGRhdGEucmVjdFszXSAtIGNvb3JkaW5hdGUueTtcblx0ICAgICAgcG9pbnRzLnB1c2goeCArIFwiLFwiICsgeSk7XG5cdCAgICB9XG5cdCAgICBwb2ludHMgPSBwb2ludHMuam9pbihcIiBcIik7XG5cdCAgICBjb25zdCBwb2x5bGluZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KHRoaXMuc3ZnRWxlbWVudE5hbWUpO1xuXHQgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwicG9pbnRzXCIsIHBvaW50cyk7XG5cdCAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgZGF0YS5ib3JkZXJTdHlsZS53aWR0aCB8fCAxKTtcblx0ICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInRyYW5zcGFyZW50XCIpO1xuXHQgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuXHQgICAgc3ZnLmFwcGVuZChwb2x5bGluZSk7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmQoc3ZnKTtcblx0ICAgIHRoaXMuX2NyZWF0ZVBvcHVwKHBvbHlsaW5lLCBkYXRhKTtcblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgUG9seWdvbkFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgUG9seWxpbmVBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgc3VwZXIocGFyYW1ldGVycyk7XG5cdCAgICB0aGlzLmNvbnRhaW5lckNsYXNzTmFtZSA9IFwicG9seWdvbkFubm90YXRpb25cIjtcblx0ICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5Z29uXCI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIENhcmV0QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlLFxuXHQgICAgICBpZ25vcmVCb3JkZXI6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiY2FyZXRBbm5vdGF0aW9uXCIpO1xuXHQgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcblx0ICAgICAgdGhpcy5fY3JlYXRlUG9wdXAobnVsbCwgdGhpcy5kYXRhKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgSW5rQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlLFxuXHQgICAgICBpZ25vcmVCb3JkZXI6IHRydWVcblx0ICAgIH0pO1xuXHQgICAgdGhpcy5jb250YWluZXJDbGFzc05hbWUgPSBcImlua0Fubm90YXRpb25cIjtcblx0ICAgIHRoaXMuc3ZnRWxlbWVudE5hbWUgPSBcInN2Zzpwb2x5bGluZVwiO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHRoaXMuY29udGFpbmVyQ2xhc3NOYW1lKTtcblx0ICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIHdpZHRoLFxuXHQgICAgICBoZWlnaHRcblx0ICAgIH0gPSBnZXRSZWN0RGltcyhkYXRhLnJlY3QpO1xuXHQgICAgY29uc3Qgc3ZnID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCB0cnVlKTtcblx0ICAgIGZvciAoY29uc3QgaW5rTGlzdCBvZiBkYXRhLmlua0xpc3RzKSB7XG5cdCAgICAgIGxldCBwb2ludHMgPSBbXTtcblx0ICAgICAgZm9yIChjb25zdCBjb29yZGluYXRlIG9mIGlua0xpc3QpIHtcblx0ICAgICAgICBjb25zdCB4ID0gY29vcmRpbmF0ZS54IC0gZGF0YS5yZWN0WzBdO1xuXHQgICAgICAgIGNvbnN0IHkgPSBkYXRhLnJlY3RbM10gLSBjb29yZGluYXRlLnk7XG5cdCAgICAgICAgcG9pbnRzLnB1c2goYCR7eH0sJHt5fWApO1xuXHQgICAgICB9XG5cdCAgICAgIHBvaW50cyA9IHBvaW50cy5qb2luKFwiIFwiKTtcblx0ICAgICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudCh0aGlzLnN2Z0VsZW1lbnROYW1lKTtcblx0ICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwicG9pbnRzXCIsIHBvaW50cyk7XG5cdCAgICAgIHBvbHlsaW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBkYXRhLmJvcmRlclN0eWxlLndpZHRoIHx8IDEpO1xuXHQgICAgICBwb2x5bGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgXCJ0cmFuc3BhcmVudFwiKTtcblx0ICAgICAgcG9seWxpbmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuXHQgICAgICB0aGlzLl9jcmVhdGVQb3B1cChwb2x5bGluZSwgZGF0YSk7XG5cdCAgICAgIHN2Zy5hcHBlbmQocG9seWxpbmUpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHN2Zyk7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIEhpZ2hsaWdodEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuXHQgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG5cdCAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKG51bGwsIHRoaXMuZGF0YSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5xdWFkcmlsYXRlcmFscykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUXVhZHJpbGF0ZXJhbHMoXCJoaWdobGlnaHRBbm5vdGF0aW9uXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhpZ2hsaWdodEFubm90YXRpb25cIik7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFVuZGVybGluZUFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuXHQgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG5cdCAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKG51bGwsIHRoaXMuZGF0YSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5xdWFkcmlsYXRlcmFscykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUXVhZHJpbGF0ZXJhbHMoXCJ1bmRlcmxpbmVBbm5vdGF0aW9uXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInVuZGVybGluZUFubm90YXRpb25cIik7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFNxdWlnZ2x5QW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlLFxuXHQgICAgICBpZ25vcmVCb3JkZXI6IHRydWUsXG5cdCAgICAgIGNyZWF0ZVF1YWRyaWxhdGVyYWxzOiB0cnVlXG5cdCAgICB9KTtcblx0ICB9XG5cdCAgcmVuZGVyKCkge1xuXHQgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcblx0ICAgICAgdGhpcy5fY3JlYXRlUG9wdXAobnVsbCwgdGhpcy5kYXRhKTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLnF1YWRyaWxhdGVyYWxzKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJRdWFkcmlsYXRlcmFscyhcInNxdWlnZ2x5QW5ub3RhdGlvblwiKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJzcXVpZ2dseUFubm90YXRpb25cIik7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFN0cmlrZU91dEFubm90YXRpb25FbGVtZW50IGV4dGVuZHMgQW5ub3RhdGlvbkVsZW1lbnQge1xuXHQgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IGlzUmVuZGVyYWJsZSA9ICEhKHBhcmFtZXRlcnMuZGF0YS5oYXNQb3B1cCB8fCBwYXJhbWV0ZXJzLmRhdGEudGl0bGVPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEuY29udGVudHNPYmo/LnN0ciB8fCBwYXJhbWV0ZXJzLmRhdGEucmljaFRleHQ/LnN0cik7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZSxcblx0ICAgICAgaWdub3JlQm9yZGVyOiB0cnVlLFxuXHQgICAgICBjcmVhdGVRdWFkcmlsYXRlcmFsczogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIGlmICghdGhpcy5kYXRhLmhhc1BvcHVwKSB7XG5cdCAgICAgIHRoaXMuX2NyZWF0ZVBvcHVwKG51bGwsIHRoaXMuZGF0YSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5xdWFkcmlsYXRlcmFscykge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUXVhZHJpbGF0ZXJhbHMoXCJzdHJpa2VvdXRBbm5vdGF0aW9uXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcInN0cmlrZW91dEFubm90YXRpb25cIik7XG5cdCAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG5cdCAgfVxuXHR9XG5cdGNsYXNzIFN0YW1wQW5ub3RhdGlvbkVsZW1lbnQgZXh0ZW5kcyBBbm5vdGF0aW9uRWxlbWVudCB7XG5cdCAgY29uc3RydWN0b3IocGFyYW1ldGVycykge1xuXHQgICAgY29uc3QgaXNSZW5kZXJhYmxlID0gISEocGFyYW1ldGVycy5kYXRhLmhhc1BvcHVwIHx8IHBhcmFtZXRlcnMuZGF0YS50aXRsZU9iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5jb250ZW50c09iaj8uc3RyIHx8IHBhcmFtZXRlcnMuZGF0YS5yaWNoVGV4dD8uc3RyKTtcblx0ICAgIHN1cGVyKHBhcmFtZXRlcnMsIHtcblx0ICAgICAgaXNSZW5kZXJhYmxlLFxuXHQgICAgICBpZ25vcmVCb3JkZXI6IHRydWVcblx0ICAgIH0pO1xuXHQgIH1cblx0ICByZW5kZXIoKSB7XG5cdCAgICB0aGlzLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwic3RhbXBBbm5vdGF0aW9uXCIpO1xuXHQgICAgaWYgKCF0aGlzLmRhdGEuaGFzUG9wdXApIHtcblx0ICAgICAgdGhpcy5fY3JlYXRlUG9wdXAobnVsbCwgdGhpcy5kYXRhKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcblx0ICB9XG5cdH1cblx0Y2xhc3MgRmlsZUF0dGFjaG1lbnRBbm5vdGF0aW9uRWxlbWVudCBleHRlbmRzIEFubm90YXRpb25FbGVtZW50IHtcblx0ICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzKSB7XG5cdCAgICBzdXBlcihwYXJhbWV0ZXJzLCB7XG5cdCAgICAgIGlzUmVuZGVyYWJsZTogdHJ1ZVxuXHQgICAgfSk7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGZpbGVuYW1lLFxuXHQgICAgICBjb250ZW50XG5cdCAgICB9ID0gdGhpcy5kYXRhLmZpbGU7XG5cdCAgICB0aGlzLmZpbGVuYW1lID0gKDAsIF9kaXNwbGF5X3V0aWxzLmdldEZpbGVuYW1lRnJvbVVybCkoZmlsZW5hbWUsIHRydWUpO1xuXHQgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcblx0ICAgIHRoaXMubGlua1NlcnZpY2UuZXZlbnRCdXM/LmRpc3BhdGNoKFwiZmlsZWF0dGFjaG1lbnRhbm5vdGF0aW9uXCIsIHtcblx0ICAgICAgc291cmNlOiB0aGlzLFxuXHQgICAgICBmaWxlbmFtZSxcblx0ICAgICAgY29udGVudFxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJlbmRlcigpIHtcblx0ICAgIHRoaXMuY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJmaWxlQXR0YWNobWVudEFubm90YXRpb25cIik7XG5cdCAgICBsZXQgdHJpZ2dlcjtcblx0ICAgIGlmICh0aGlzLmRhdGEuaGFzQXBwZWFyYW5jZSkge1xuXHQgICAgICB0cmlnZ2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRyaWdnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuXHQgICAgICB0cmlnZ2VyLnNyYyA9IGAke3RoaXMuaW1hZ2VSZXNvdXJjZXNQYXRofWFubm90YXRpb24tJHsvcGFwZXJjbGlwL2kudGVzdCh0aGlzLmRhdGEubmFtZSkgPyBcInBhcGVyY2xpcFwiIDogXCJwdXNocGluXCJ9LnN2Z2A7XG5cdCAgICB9XG5cdCAgICB0cmlnZ2VyLmNsYXNzTGlzdC5hZGQoXCJwb3B1cFRyaWdnZXJBcmVhXCIpO1xuXHQgICAgdHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKFwiZGJsY2xpY2tcIiwgdGhpcy5fZG93bmxvYWQuYmluZCh0aGlzKSk7XG5cdCAgICBpZiAoIXRoaXMuZGF0YS5oYXNQb3B1cCAmJiAodGhpcy5kYXRhLnRpdGxlT2JqPy5zdHIgfHwgdGhpcy5kYXRhLmNvbnRlbnRzT2JqPy5zdHIgfHwgdGhpcy5kYXRhLnJpY2hUZXh0KSkge1xuXHQgICAgICB0aGlzLl9jcmVhdGVQb3B1cCh0cmlnZ2VyLCB0aGlzLmRhdGEpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5jb250YWluZXIuYXBwZW5kKHRyaWdnZXIpO1xuXHQgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuXHQgIH1cblx0ICBfZG93bmxvYWQoKSB7XG5cdCAgICB0aGlzLmRvd25sb2FkTWFuYWdlcj8ub3Blbk9yRG93bmxvYWREYXRhKHRoaXMuY29udGFpbmVyLCB0aGlzLmNvbnRlbnQsIHRoaXMuZmlsZW5hbWUpO1xuXHQgIH1cblx0fVxuXHRjbGFzcyBBbm5vdGF0aW9uTGF5ZXIge1xuXHQgIHN0YXRpYyAjYXBwZW5kRWxlbWVudChlbGVtZW50LCBpZCwgZGl2LCBhY2Nlc3NpYmlsaXR5TWFuYWdlcikge1xuXHQgICAgY29uc3QgY29udGVudEVsZW1lbnQgPSBlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudDtcblx0ICAgIGNvbnRlbnRFbGVtZW50LmlkID0gYCR7X2Rpc3BsYXlfdXRpbHMuQW5ub3RhdGlvblByZWZpeH0ke2lkfWA7XG5cdCAgICBkaXYuYXBwZW5kKGVsZW1lbnQpO1xuXHQgICAgYWNjZXNzaWJpbGl0eU1hbmFnZXI/Lm1vdmVFbGVtZW50SW5ET00oZGl2LCBlbGVtZW50LCBjb250ZW50RWxlbWVudCwgZmFsc2UpO1xuXHQgIH1cblx0ICBzdGF0aWMgcmVuZGVyKHBhcmFtcykge1xuXHQgICAgY29uc3Qge1xuXHQgICAgICBhbm5vdGF0aW9ucyxcblx0ICAgICAgZGl2LFxuXHQgICAgICB2aWV3cG9ydCxcblx0ICAgICAgYWNjZXNzaWJpbGl0eU1hbmFnZXJcblx0ICAgIH0gPSBwYXJhbXM7XG5cdCAgICAoMCwgX2Rpc3BsYXlfdXRpbHMuc2V0TGF5ZXJEaW1lbnNpb25zKShkaXYsIHZpZXdwb3J0KTtcblx0ICAgIGNvbnN0IGVsZW1lbnRQYXJhbXMgPSB7XG5cdCAgICAgIGRhdGE6IG51bGwsXG5cdCAgICAgIGxheWVyOiBkaXYsXG5cdCAgICAgIHBhZ2U6IHBhcmFtcy5wYWdlLFxuXHQgICAgICB2aWV3cG9ydCxcblx0ICAgICAgbGlua1NlcnZpY2U6IHBhcmFtcy5saW5rU2VydmljZSxcblx0ICAgICAgZG93bmxvYWRNYW5hZ2VyOiBwYXJhbXMuZG93bmxvYWRNYW5hZ2VyLFxuXHQgICAgICBpbWFnZVJlc291cmNlc1BhdGg6IHBhcmFtcy5pbWFnZVJlc291cmNlc1BhdGggfHwgXCJcIixcblx0ICAgICAgcmVuZGVyRm9ybXM6IHBhcmFtcy5yZW5kZXJGb3JtcyAhPT0gZmFsc2UsXG5cdCAgICAgIHN2Z0ZhY3Rvcnk6IG5ldyBfZGlzcGxheV91dGlscy5ET01TVkdGYWN0b3J5KCksXG5cdCAgICAgIGFubm90YXRpb25TdG9yYWdlOiBwYXJhbXMuYW5ub3RhdGlvblN0b3JhZ2UgfHwgbmV3IF9hbm5vdGF0aW9uX3N0b3JhZ2UuQW5ub3RhdGlvblN0b3JhZ2UoKSxcblx0ICAgICAgZW5hYmxlU2NyaXB0aW5nOiBwYXJhbXMuZW5hYmxlU2NyaXB0aW5nID09PSB0cnVlLFxuXHQgICAgICBoYXNKU0FjdGlvbnM6IHBhcmFtcy5oYXNKU0FjdGlvbnMsXG5cdCAgICAgIGZpZWxkT2JqZWN0czogcGFyYW1zLmZpZWxkT2JqZWN0c1xuXHQgICAgfTtcblx0ICAgIGxldCB6SW5kZXggPSAwO1xuXHQgICAgZm9yIChjb25zdCBkYXRhIG9mIGFubm90YXRpb25zKSB7XG5cdCAgICAgIGlmIChkYXRhLm5vSFRNTCkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChkYXRhLmFubm90YXRpb25UeXBlICE9PSBfdXRpbC5Bbm5vdGF0aW9uVHlwZS5QT1BVUCkge1xuXHQgICAgICAgIGNvbnN0IHtcblx0ICAgICAgICAgIHdpZHRoLFxuXHQgICAgICAgICAgaGVpZ2h0XG5cdCAgICAgICAgfSA9IGdldFJlY3REaW1zKGRhdGEucmVjdCk7XG5cdCAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHtcblx0ICAgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBlbGVtZW50UGFyYW1zLmRhdGEgPSBkYXRhO1xuXHQgICAgICBjb25zdCBlbGVtZW50ID0gQW5ub3RhdGlvbkVsZW1lbnRGYWN0b3J5LmNyZWF0ZShlbGVtZW50UGFyYW1zKTtcblx0ICAgICAgaWYgKCFlbGVtZW50LmlzUmVuZGVyYWJsZSkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IHJlbmRlcmVkID0gZWxlbWVudC5yZW5kZXIoKTtcblx0ICAgICAgaWYgKGRhdGEuaGlkZGVuKSB7XG5cdCAgICAgICAgcmVuZGVyZWQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVuZGVyZWQpKSB7XG5cdCAgICAgICAgZm9yIChjb25zdCByZW5kZXJlZEVsZW1lbnQgb2YgcmVuZGVyZWQpIHtcblx0ICAgICAgICAgIHJlbmRlcmVkRWxlbWVudC5zdHlsZS56SW5kZXggPSB6SW5kZXgrKztcblx0ICAgICAgICAgIEFubm90YXRpb25MYXllci4jYXBwZW5kRWxlbWVudChyZW5kZXJlZEVsZW1lbnQsIGRhdGEuaWQsIGRpdiwgYWNjZXNzaWJpbGl0eU1hbmFnZXIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICByZW5kZXJlZC5zdHlsZS56SW5kZXggPSB6SW5kZXgrKztcblx0ICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBvcHVwQW5ub3RhdGlvbkVsZW1lbnQpIHtcblx0ICAgICAgICAgIGRpdi5wcmVwZW5kKHJlbmRlcmVkKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgQW5ub3RhdGlvbkxheWVyLiNhcHBlbmRFbGVtZW50KHJlbmRlcmVkLCBkYXRhLmlkLCBkaXYsIGFjY2Vzc2liaWxpdHlNYW5hZ2VyKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuI3NldEFubm90YXRpb25DYW52YXNNYXAoZGl2LCBwYXJhbXMuYW5ub3RhdGlvbkNhbnZhc01hcCk7XG5cdCAgfVxuXHQgIHN0YXRpYyB1cGRhdGUocGFyYW1zKSB7XG5cdCAgICBjb25zdCB7XG5cdCAgICAgIGFubm90YXRpb25DYW52YXNNYXAsXG5cdCAgICAgIGRpdixcblx0ICAgICAgdmlld3BvcnRcblx0ICAgIH0gPSBwYXJhbXM7XG5cdCAgICAoMCwgX2Rpc3BsYXlfdXRpbHMuc2V0TGF5ZXJEaW1lbnNpb25zKShkaXYsIHtcblx0ICAgICAgcm90YXRpb246IHZpZXdwb3J0LnJvdGF0aW9uXG5cdCAgICB9KTtcblx0ICAgIHRoaXMuI3NldEFubm90YXRpb25DYW52YXNNYXAoZGl2LCBhbm5vdGF0aW9uQ2FudmFzTWFwKTtcblx0ICAgIGRpdi5oaWRkZW4gPSBmYWxzZTtcblx0ICB9XG5cdCAgc3RhdGljICNzZXRBbm5vdGF0aW9uQ2FudmFzTWFwKGRpdiwgYW5ub3RhdGlvbkNhbnZhc01hcCkge1xuXHQgICAgaWYgKCFhbm5vdGF0aW9uQ2FudmFzTWFwKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgW2lkLCBjYW52YXNdIG9mIGFubm90YXRpb25DYW52YXNNYXApIHtcblx0ICAgICAgY29uc3QgZWxlbWVudCA9IGRpdi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1hbm5vdGF0aW9uLWlkPVwiJHtpZH1cIl1gKTtcblx0ICAgICAgaWYgKCFlbGVtZW50KSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3Qge1xuXHQgICAgICAgIGZpcnN0Q2hpbGRcblx0ICAgICAgfSA9IGVsZW1lbnQ7XG5cdCAgICAgIGlmICghZmlyc3RDaGlsZCkge1xuXHQgICAgICAgIGVsZW1lbnQuYXBwZW5kKGNhbnZhcyk7XG5cdCAgICAgIH0gZWxzZSBpZiAoZmlyc3RDaGlsZC5ub2RlTmFtZSA9PT0gXCJDQU5WQVNcIikge1xuXHQgICAgICAgIGZpcnN0Q2hpbGQucmVwbGFjZVdpdGgoY2FudmFzKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBmaXJzdENoaWxkLmJlZm9yZShjYW52YXMpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBhbm5vdGF0aW9uQ2FudmFzTWFwLmNsZWFyKCk7XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQW5ub3RhdGlvbkxheWVyID0gQW5ub3RhdGlvbkxheWVyO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAzMyAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuQ29sb3JDb252ZXJ0ZXJzID0gdm9pZCAwO1xuXHRmdW5jdGlvbiBtYWtlQ29sb3JDb21wKG4pIHtcblx0ICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBuKSkgKiAyNTUpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIik7XG5cdH1cblx0Y2xhc3MgQ29sb3JDb252ZXJ0ZXJzIHtcblx0ICBzdGF0aWMgQ01ZS19HKFtjLCB5LCBtLCBrXSkge1xuXHQgICAgcmV0dXJuIFtcIkdcIiwgMSAtIE1hdGgubWluKDEsIDAuMyAqIGMgKyAwLjU5ICogbSArIDAuMTEgKiB5ICsgayldO1xuXHQgIH1cblx0ICBzdGF0aWMgR19DTVlLKFtnXSkge1xuXHQgICAgcmV0dXJuIFtcIkNNWUtcIiwgMCwgMCwgMCwgMSAtIGddO1xuXHQgIH1cblx0ICBzdGF0aWMgR19SR0IoW2ddKSB7XG5cdCAgICByZXR1cm4gW1wiUkdCXCIsIGcsIGcsIGddO1xuXHQgIH1cblx0ICBzdGF0aWMgR19IVE1MKFtnXSkge1xuXHQgICAgY29uc3QgRyA9IG1ha2VDb2xvckNvbXAoZyk7XG5cdCAgICByZXR1cm4gYCMke0d9JHtHfSR7R31gO1xuXHQgIH1cblx0ICBzdGF0aWMgUkdCX0coW3IsIGcsIGJdKSB7XG5cdCAgICByZXR1cm4gW1wiR1wiLCAwLjMgKiByICsgMC41OSAqIGcgKyAwLjExICogYl07XG5cdCAgfVxuXHQgIHN0YXRpYyBSR0JfSFRNTChbciwgZywgYl0pIHtcblx0ICAgIGNvbnN0IFIgPSBtYWtlQ29sb3JDb21wKHIpO1xuXHQgICAgY29uc3QgRyA9IG1ha2VDb2xvckNvbXAoZyk7XG5cdCAgICBjb25zdCBCID0gbWFrZUNvbG9yQ29tcChiKTtcblx0ICAgIHJldHVybiBgIyR7Un0ke0d9JHtCfWA7XG5cdCAgfVxuXHQgIHN0YXRpYyBUX0hUTUwoKSB7XG5cdCAgICByZXR1cm4gXCIjMDAwMDAwMDBcIjtcblx0ICB9XG5cdCAgc3RhdGljIENNWUtfUkdCKFtjLCB5LCBtLCBrXSkge1xuXHQgICAgcmV0dXJuIFtcIlJHQlwiLCAxIC0gTWF0aC5taW4oMSwgYyArIGspLCAxIC0gTWF0aC5taW4oMSwgbSArIGspLCAxIC0gTWF0aC5taW4oMSwgeSArIGspXTtcblx0ICB9XG5cdCAgc3RhdGljIENNWUtfSFRNTChjb21wb25lbnRzKSB7XG5cdCAgICBjb25zdCByZ2IgPSB0aGlzLkNNWUtfUkdCKGNvbXBvbmVudHMpLnNsaWNlKDEpO1xuXHQgICAgcmV0dXJuIHRoaXMuUkdCX0hUTUwocmdiKTtcblx0ICB9XG5cdCAgc3RhdGljIFJHQl9DTVlLKFtyLCBnLCBiXSkge1xuXHQgICAgY29uc3QgYyA9IDEgLSByO1xuXHQgICAgY29uc3QgbSA9IDEgLSBnO1xuXHQgICAgY29uc3QgeSA9IDEgLSBiO1xuXHQgICAgY29uc3QgayA9IE1hdGgubWluKGMsIG0sIHkpO1xuXHQgICAgcmV0dXJuIFtcIkNNWUtcIiwgYywgbSwgeSwga107XG5cdCAgfVxuXHR9XG5cdGV4cG9ydHMuQ29sb3JDb252ZXJ0ZXJzID0gQ29sb3JDb252ZXJ0ZXJzO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAzNCAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuWGZhTGF5ZXIgPSB2b2lkIDA7XG5cdHZhciBfeGZhX3RleHQgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTtcblx0Y2xhc3MgWGZhTGF5ZXIge1xuXHQgIHN0YXRpYyBzZXR1cFN0b3JhZ2UoaHRtbCwgaWQsIGVsZW1lbnQsIHN0b3JhZ2UsIGludGVudCkge1xuXHQgICAgY29uc3Qgc3RvcmVkRGF0YSA9IHN0b3JhZ2UuZ2V0VmFsdWUoaWQsIHtcblx0ICAgICAgdmFsdWU6IG51bGxcblx0ICAgIH0pO1xuXHQgICAgc3dpdGNoIChlbGVtZW50Lm5hbWUpIHtcblx0ICAgICAgY2FzZSBcInRleHRhcmVhXCI6XG5cdCAgICAgICAgaWYgKHN0b3JlZERhdGEudmFsdWUgIT09IG51bGwpIHtcblx0ICAgICAgICAgIGh0bWwudGV4dENvbnRlbnQgPSBzdG9yZWREYXRhLnZhbHVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoaW50ZW50ID09PSBcInByaW50XCIpIHtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG5cdCAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgIHZhbHVlOiBldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICBjYXNlIFwiaW5wdXRcIjpcblx0ICAgICAgICBpZiAoZWxlbWVudC5hdHRyaWJ1dGVzLnR5cGUgPT09IFwicmFkaW9cIiB8fCBlbGVtZW50LmF0dHJpYnV0ZXMudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG5cdCAgICAgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZSA9PT0gZWxlbWVudC5hdHRyaWJ1dGVzLnhmYU9uKSB7XG5cdCAgICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB0cnVlKTtcblx0ICAgICAgICAgIH0gZWxzZSBpZiAoc3RvcmVkRGF0YS52YWx1ZSA9PT0gZWxlbWVudC5hdHRyaWJ1dGVzLnhmYU9mZikge1xuXHQgICAgICAgICAgICBodG1sLnJlbW92ZUF0dHJpYnV0ZShcImNoZWNrZWRcIik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBpZiAoaW50ZW50ID09PSBcInByaW50XCIpIHtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC5jaGVja2VkID8gZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInhmYU9uXCIpIDogZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInhmYU9mZlwiKVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBpZiAoc3RvcmVkRGF0YS52YWx1ZSAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICBodG1sLnNldEF0dHJpYnV0ZShcInZhbHVlXCIsIHN0b3JlZERhdGEudmFsdWUpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaWYgKGludGVudCA9PT0gXCJwcmludFwiKSB7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgaHRtbC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgZXZlbnQgPT4ge1xuXHQgICAgICAgICAgICBzdG9yYWdlLnNldFZhbHVlKGlkLCB7XG5cdCAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSBcInNlbGVjdFwiOlxuXHQgICAgICAgIGlmIChzdG9yZWREYXRhLnZhbHVlICE9PSBudWxsKSB7XG5cdCAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBlbGVtZW50LmNoaWxkcmVuKSB7XG5cdCAgICAgICAgICAgIGlmIChvcHRpb24uYXR0cmlidXRlcy52YWx1ZSA9PT0gc3RvcmVkRGF0YS52YWx1ZSkge1xuXHQgICAgICAgICAgICAgIG9wdGlvbi5hdHRyaWJ1dGVzLnNlbGVjdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBodG1sLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBldmVudCA9PiB7XG5cdCAgICAgICAgICBjb25zdCBvcHRpb25zID0gZXZlbnQudGFyZ2V0Lm9wdGlvbnM7XG5cdCAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMuc2VsZWN0ZWRJbmRleCA9PT0gLTEgPyBcIlwiIDogb3B0aW9uc1tvcHRpb25zLnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuXHQgICAgICAgICAgc3RvcmFnZS5zZXRWYWx1ZShpZCwge1xuXHQgICAgICAgICAgICB2YWx1ZVxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICB9XG5cdCAgfVxuXHQgIHN0YXRpYyBzZXRBdHRyaWJ1dGVzKHtcblx0ICAgIGh0bWwsXG5cdCAgICBlbGVtZW50LFxuXHQgICAgc3RvcmFnZSA9IG51bGwsXG5cdCAgICBpbnRlbnQsXG5cdCAgICBsaW5rU2VydmljZVxuXHQgIH0pIHtcblx0ICAgIGNvbnN0IHtcblx0ICAgICAgYXR0cmlidXRlc1xuXHQgICAgfSA9IGVsZW1lbnQ7XG5cdCAgICBjb25zdCBpc0hUTUxBbmNob3JFbGVtZW50ID0gaHRtbCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50O1xuXHQgICAgaWYgKGF0dHJpYnV0ZXMudHlwZSA9PT0gXCJyYWRpb1wiKSB7XG5cdCAgICAgIGF0dHJpYnV0ZXMubmFtZSA9IGAke2F0dHJpYnV0ZXMubmFtZX0tJHtpbnRlbnR9YDtcblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG5cdCAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgY29udGludWU7XG5cdCAgICAgIH1cblx0ICAgICAgc3dpdGNoIChrZXkpIHtcblx0ICAgICAgICBjYXNlIFwiY2xhc3NcIjpcblx0ICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgpIHtcblx0ICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZS5qb2luKFwiIFwiKSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiZGF0YUlkXCI6XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwiaWRcIjpcblx0ICAgICAgICAgIGh0bWwuc2V0QXR0cmlidXRlKFwiZGF0YS1lbGVtZW50LWlkXCIsIHZhbHVlKTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UgXCJzdHlsZVwiOlxuXHQgICAgICAgICAgT2JqZWN0LmFzc2lnbihodG1sLnN0eWxlLCB2YWx1ZSk7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIFwidGV4dENvbnRlbnRcIjpcblx0ICAgICAgICAgIGh0bWwudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0ICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICBpZiAoIWlzSFRNTEFuY2hvckVsZW1lbnQgfHwga2V5ICE9PSBcImhyZWZcIiAmJiBrZXkgIT09IFwibmV3V2luZG93XCIpIHtcblx0ICAgICAgICAgICAgaHRtbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChpc0hUTUxBbmNob3JFbGVtZW50KSB7XG5cdCAgICAgIGxpbmtTZXJ2aWNlLmFkZExpbmtBdHRyaWJ1dGVzKGh0bWwsIGF0dHJpYnV0ZXMuaHJlZiwgYXR0cmlidXRlcy5uZXdXaW5kb3cpO1xuXHQgICAgfVxuXHQgICAgaWYgKHN0b3JhZ2UgJiYgYXR0cmlidXRlcy5kYXRhSWQpIHtcblx0ICAgICAgdGhpcy5zZXR1cFN0b3JhZ2UoaHRtbCwgYXR0cmlidXRlcy5kYXRhSWQsIGVsZW1lbnQsIHN0b3JhZ2UpO1xuXHQgICAgfVxuXHQgIH1cblx0ICBzdGF0aWMgcmVuZGVyKHBhcmFtZXRlcnMpIHtcblx0ICAgIGNvbnN0IHN0b3JhZ2UgPSBwYXJhbWV0ZXJzLmFubm90YXRpb25TdG9yYWdlO1xuXHQgICAgY29uc3QgbGlua1NlcnZpY2UgPSBwYXJhbWV0ZXJzLmxpbmtTZXJ2aWNlO1xuXHQgICAgY29uc3Qgcm9vdCA9IHBhcmFtZXRlcnMueGZhSHRtbDtcblx0ICAgIGNvbnN0IGludGVudCA9IHBhcmFtZXRlcnMuaW50ZW50IHx8IFwiZGlzcGxheVwiO1xuXHQgICAgY29uc3Qgcm9vdEh0bWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHJvb3QubmFtZSk7XG5cdCAgICBpZiAocm9vdC5hdHRyaWJ1dGVzKSB7XG5cdCAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyh7XG5cdCAgICAgICAgaHRtbDogcm9vdEh0bWwsXG5cdCAgICAgICAgZWxlbWVudDogcm9vdCxcblx0ICAgICAgICBpbnRlbnQsXG5cdCAgICAgICAgbGlua1NlcnZpY2Vcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBjb25zdCBzdGFjayA9IFtbcm9vdCwgLTEsIHJvb3RIdG1sXV07XG5cdCAgICBjb25zdCByb290RGl2ID0gcGFyYW1ldGVycy5kaXY7XG5cdCAgICByb290RGl2LmFwcGVuZChyb290SHRtbCk7XG5cdCAgICBpZiAocGFyYW1ldGVycy52aWV3cG9ydCkge1xuXHQgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBgbWF0cml4KCR7cGFyYW1ldGVycy52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIil9KWA7XG5cdCAgICAgIHJvb3REaXYuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuXHQgICAgfVxuXHQgICAgaWYgKGludGVudCAhPT0gXCJyaWNoVGV4dFwiKSB7XG5cdCAgICAgIHJvb3REaXYuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJ4ZmFMYXllciB4ZmFGb250XCIpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgdGV4dERpdnMgPSBbXTtcblx0ICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG5cdCAgICAgIGNvbnN0IFtwYXJlbnQsIGksIGh0bWxdID0gc3RhY2suYXQoLTEpO1xuXHQgICAgICBpZiAoaSArIDEgPT09IHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpIHtcblx0ICAgICAgICBzdGFjay5wb3AoKTtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBjaGlsZCA9IHBhcmVudC5jaGlsZHJlblsrK3N0YWNrLmF0KC0xKVsxXV07XG5cdCAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCkge1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IHtcblx0ICAgICAgICBuYW1lXG5cdCAgICAgIH0gPSBjaGlsZDtcblx0ICAgICAgaWYgKG5hbWUgPT09IFwiI3RleHRcIikge1xuXHQgICAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZC52YWx1ZSk7XG5cdCAgICAgICAgdGV4dERpdnMucHVzaChub2RlKTtcblx0ICAgICAgICBodG1sLmFwcGVuZChub2RlKTtcblx0ICAgICAgICBjb250aW51ZTtcblx0ICAgICAgfVxuXHQgICAgICBsZXQgY2hpbGRIdG1sO1xuXHQgICAgICBpZiAoY2hpbGQ/LmF0dHJpYnV0ZXM/LnhtbG5zKSB7XG5cdCAgICAgICAgY2hpbGRIdG1sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGNoaWxkLmF0dHJpYnV0ZXMueG1sbnMsIG5hbWUpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGNoaWxkSHRtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7XG5cdCAgICAgIH1cblx0ICAgICAgaHRtbC5hcHBlbmQoY2hpbGRIdG1sKTtcblx0ICAgICAgaWYgKGNoaWxkLmF0dHJpYnV0ZXMpIHtcblx0ICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoe1xuXHQgICAgICAgICAgaHRtbDogY2hpbGRIdG1sLFxuXHQgICAgICAgICAgZWxlbWVudDogY2hpbGQsXG5cdCAgICAgICAgICBzdG9yYWdlLFxuXHQgICAgICAgICAgaW50ZW50LFxuXHQgICAgICAgICAgbGlua1NlcnZpY2Vcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHQgICAgICAgIHN0YWNrLnB1c2goW2NoaWxkLCAtMSwgY2hpbGRIdG1sXSk7XG5cdCAgICAgIH0gZWxzZSBpZiAoY2hpbGQudmFsdWUpIHtcblx0ICAgICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQudmFsdWUpO1xuXHQgICAgICAgIGlmIChfeGZhX3RleHQuWGZhVGV4dC5zaG91bGRCdWlsZFRleHQobmFtZSkpIHtcblx0ICAgICAgICAgIHRleHREaXZzLnB1c2gobm9kZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNoaWxkSHRtbC5hcHBlbmQobm9kZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGZvciAoY29uc3QgZWwgb2Ygcm9vdERpdi5xdWVyeVNlbGVjdG9yQWxsKFwiLnhmYU5vbkludGVyYWN0aXZlIGlucHV0LCAueGZhTm9uSW50ZXJhY3RpdmUgdGV4dGFyZWFcIikpIHtcblx0ICAgICAgZWwuc2V0QXR0cmlidXRlKFwicmVhZE9ubHlcIiwgdHJ1ZSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB0ZXh0RGl2c1xuXHQgICAgfTtcblx0ICB9XG5cdCAgc3RhdGljIHVwZGF0ZShwYXJhbWV0ZXJzKSB7XG5cdCAgICBjb25zdCB0cmFuc2Zvcm0gPSBgbWF0cml4KCR7cGFyYW1ldGVycy52aWV3cG9ydC50cmFuc2Zvcm0uam9pbihcIixcIil9KWA7XG5cdCAgICBwYXJhbWV0ZXJzLmRpdi5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG5cdCAgICBwYXJhbWV0ZXJzLmRpdi5oaWRkZW4gPSBmYWxzZTtcblx0ICB9XG5cdH1cblx0ZXhwb3J0cy5YZmFMYXllciA9IFhmYUxheWVyO1xuXG5cdC8qKiovIH0pLFxuXHQvKiAzNSAqL1xuXHQvKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSA9PiB7XG5cblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdGV4cG9ydHMuU1ZHR3JhcGhpY3MgPSB2b2lkIDA7XG5cdHZhciBfZGlzcGxheV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oNik7XG5cdHZhciBfdXRpbCA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cdHZhciBfaXNfbm9kZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApO1xuXHRsZXQgU1ZHR3JhcGhpY3MgPSBjbGFzcyB7XG5cdCAgY29uc3RydWN0b3IoKSB7XG5cdCAgICAoMCwgX3V0aWwudW5yZWFjaGFibGUpKFwiTm90IGltcGxlbWVudGVkOiBTVkdHcmFwaGljc1wiKTtcblx0ICB9XG5cdH07XG5cdGV4cG9ydHMuU1ZHR3JhcGhpY3MgPSBTVkdHcmFwaGljcztcblx0e1xuXHQgIGNvbnN0IFNWR19ERUZBVUxUUyA9IHtcblx0ICAgIGZvbnRTdHlsZTogXCJub3JtYWxcIixcblx0ICAgIGZvbnRXZWlnaHQ6IFwibm9ybWFsXCIsXG5cdCAgICBmaWxsQ29sb3I6IFwiIzAwMDAwMFwiXG5cdCAgfTtcblx0ICBjb25zdCBYTUxfTlMgPSBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiO1xuXHQgIGNvbnN0IFhMSU5LX05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG5cdCAgY29uc3QgTElORV9DQVBfU1RZTEVTID0gW1wiYnV0dFwiLCBcInJvdW5kXCIsIFwic3F1YXJlXCJdO1xuXHQgIGNvbnN0IExJTkVfSk9JTl9TVFlMRVMgPSBbXCJtaXRlclwiLCBcInJvdW5kXCIsIFwiYmV2ZWxcIl07XG5cdCAgY29uc3QgY3JlYXRlT2JqZWN0VVJMID0gZnVuY3Rpb24gKGRhdGEsIGNvbnRlbnRUeXBlID0gXCJcIiwgZm9yY2VEYXRhU2NoZW1hID0gZmFsc2UpIHtcblx0ICAgIGlmIChVUkwuY3JlYXRlT2JqZWN0VVJMICYmIHR5cGVvZiBCbG9iICE9PSBcInVuZGVmaW5lZFwiICYmICFmb3JjZURhdGFTY2hlbWEpIHtcblx0ICAgICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2RhdGFdLCB7XG5cdCAgICAgICAgdHlwZTogY29udGVudFR5cGVcblx0ICAgICAgfSkpO1xuXHQgICAgfVxuXHQgICAgY29uc3QgZGlnaXRzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiO1xuXHQgICAgbGV0IGJ1ZmZlciA9IGBkYXRhOiR7Y29udGVudFR5cGV9O2Jhc2U2NCxgO1xuXHQgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZGF0YS5sZW5ndGg7IGkgPCBpaTsgaSArPSAzKSB7XG5cdCAgICAgIGNvbnN0IGIxID0gZGF0YVtpXSAmIDB4ZmY7XG5cdCAgICAgIGNvbnN0IGIyID0gZGF0YVtpICsgMV0gJiAweGZmO1xuXHQgICAgICBjb25zdCBiMyA9IGRhdGFbaSArIDJdICYgMHhmZjtcblx0ICAgICAgY29uc3QgZDEgPSBiMSA+PiAyLFxuXHQgICAgICAgIGQyID0gKGIxICYgMykgPDwgNCB8IGIyID4+IDQ7XG5cdCAgICAgIGNvbnN0IGQzID0gaSArIDEgPCBpaSA/IChiMiAmIDB4ZikgPDwgMiB8IGIzID4+IDYgOiA2NDtcblx0ICAgICAgY29uc3QgZDQgPSBpICsgMiA8IGlpID8gYjMgJiAweDNmIDogNjQ7XG5cdCAgICAgIGJ1ZmZlciArPSBkaWdpdHNbZDFdICsgZGlnaXRzW2QyXSArIGRpZ2l0c1tkM10gKyBkaWdpdHNbZDRdO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGJ1ZmZlcjtcblx0ICB9O1xuXHQgIGNvbnN0IGNvbnZlcnRJbWdEYXRhVG9QbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICBjb25zdCBQTkdfSEVBREVSID0gbmV3IFVpbnQ4QXJyYXkoWzB4ODksIDB4NTAsIDB4NGUsIDB4NDcsIDB4MGQsIDB4MGEsIDB4MWEsIDB4MGFdKTtcblx0ICAgIGNvbnN0IENIVU5LX1dSQVBQRVJfU0laRSA9IDEyO1xuXHQgICAgY29uc3QgY3JjVGFibGUgPSBuZXcgSW50MzJBcnJheSgyNTYpO1xuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuXHQgICAgICBsZXQgYyA9IGk7XG5cdCAgICAgIGZvciAobGV0IGggPSAwOyBoIDwgODsgaCsrKSB7XG5cdCAgICAgICAgaWYgKGMgJiAxKSB7XG5cdCAgICAgICAgICBjID0gMHhlZGI4ODMyMCBeIGMgPj4gMSAmIDB4N2ZmZmZmZmY7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGMgPSBjID4+IDEgJiAweDdmZmZmZmZmO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBjcmNUYWJsZVtpXSA9IGM7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBjcmMzMihkYXRhLCBzdGFydCwgZW5kKSB7XG5cdCAgICAgIGxldCBjcmMgPSAtMTtcblx0ICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcblx0ICAgICAgICBjb25zdCBhID0gKGNyYyBeIGRhdGFbaV0pICYgMHhmZjtcblx0ICAgICAgICBjb25zdCBiID0gY3JjVGFibGVbYV07XG5cdCAgICAgICAgY3JjID0gY3JjID4+PiA4IF4gYjtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gY3JjIF4gLTE7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiB3cml0ZVBuZ0NodW5rKHR5cGUsIGJvZHksIGRhdGEsIG9mZnNldCkge1xuXHQgICAgICBsZXQgcCA9IG9mZnNldDtcblx0ICAgICAgY29uc3QgbGVuID0gYm9keS5sZW5ndGg7XG5cdCAgICAgIGRhdGFbcF0gPSBsZW4gPj4gMjQgJiAweGZmO1xuXHQgICAgICBkYXRhW3AgKyAxXSA9IGxlbiA+PiAxNiAmIDB4ZmY7XG5cdCAgICAgIGRhdGFbcCArIDJdID0gbGVuID4+IDggJiAweGZmO1xuXHQgICAgICBkYXRhW3AgKyAzXSA9IGxlbiAmIDB4ZmY7XG5cdCAgICAgIHAgKz0gNDtcblx0ICAgICAgZGF0YVtwXSA9IHR5cGUuY2hhckNvZGVBdCgwKSAmIDB4ZmY7XG5cdCAgICAgIGRhdGFbcCArIDFdID0gdHlwZS5jaGFyQ29kZUF0KDEpICYgMHhmZjtcblx0ICAgICAgZGF0YVtwICsgMl0gPSB0eXBlLmNoYXJDb2RlQXQoMikgJiAweGZmO1xuXHQgICAgICBkYXRhW3AgKyAzXSA9IHR5cGUuY2hhckNvZGVBdCgzKSAmIDB4ZmY7XG5cdCAgICAgIHAgKz0gNDtcblx0ICAgICAgZGF0YS5zZXQoYm9keSwgcCk7XG5cdCAgICAgIHAgKz0gYm9keS5sZW5ndGg7XG5cdCAgICAgIGNvbnN0IGNyYyA9IGNyYzMyKGRhdGEsIG9mZnNldCArIDQsIHApO1xuXHQgICAgICBkYXRhW3BdID0gY3JjID4+IDI0ICYgMHhmZjtcblx0ICAgICAgZGF0YVtwICsgMV0gPSBjcmMgPj4gMTYgJiAweGZmO1xuXHQgICAgICBkYXRhW3AgKyAyXSA9IGNyYyA+PiA4ICYgMHhmZjtcblx0ICAgICAgZGF0YVtwICsgM10gPSBjcmMgJiAweGZmO1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gYWRsZXIzMihkYXRhLCBzdGFydCwgZW5kKSB7XG5cdCAgICAgIGxldCBhID0gMTtcblx0ICAgICAgbGV0IGIgPSAwO1xuXHQgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuXHQgICAgICAgIGEgPSAoYSArIChkYXRhW2ldICYgMHhmZikpICUgNjU1MjE7XG5cdCAgICAgICAgYiA9IChiICsgYSkgJSA2NTUyMTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYiA8PCAxNiB8IGE7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBkZWZsYXRlU3luYyhsaXRlcmFscykge1xuXHQgICAgICBpZiAoIV9pc19ub2RlLmlzTm9kZUpTKSB7XG5cdCAgICAgICAgcmV0dXJuIGRlZmxhdGVTeW5jVW5jb21wcmVzc2VkKGxpdGVyYWxzKTtcblx0ICAgICAgfVxuXHQgICAgICB0cnkge1xuXHQgICAgICAgIGxldCBpbnB1dDtcblx0ICAgICAgICBpZiAocGFyc2VJbnQoYnJvd3NlciQxLnZlcnNpb25zLm5vZGUpID49IDgpIHtcblx0ICAgICAgICAgIGlucHV0ID0gbGl0ZXJhbHM7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGlucHV0ID0gQnVmZmVyLmZyb20obGl0ZXJhbHMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBvdXRwdXQgPSByZXF1aXJlJCQ1LmRlZmxhdGVTeW5jKGlucHV0LCB7XG5cdCAgICAgICAgICBsZXZlbDogOVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBvdXRwdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gb3V0cHV0IDogbmV3IFVpbnQ4QXJyYXkob3V0cHV0KTtcblx0ICAgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgICgwLCBfdXRpbC53YXJuKShcIk5vdCBjb21wcmVzc2luZyBQTkcgYmVjYXVzZSB6bGliLmRlZmxhdGVTeW5jIGlzIHVuYXZhaWxhYmxlOiBcIiArIGUpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZChsaXRlcmFscyk7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBkZWZsYXRlU3luY1VuY29tcHJlc3NlZChsaXRlcmFscykge1xuXHQgICAgICBsZXQgbGVuID0gbGl0ZXJhbHMubGVuZ3RoO1xuXHQgICAgICBjb25zdCBtYXhCbG9ja0xlbmd0aCA9IDB4ZmZmZjtcblx0ICAgICAgY29uc3QgZGVmbGF0ZUJsb2NrcyA9IE1hdGguY2VpbChsZW4gLyBtYXhCbG9ja0xlbmd0aCk7XG5cdCAgICAgIGNvbnN0IGlkYXQgPSBuZXcgVWludDhBcnJheSgyICsgbGVuICsgZGVmbGF0ZUJsb2NrcyAqIDUgKyA0KTtcblx0ICAgICAgbGV0IHBpID0gMDtcblx0ICAgICAgaWRhdFtwaSsrXSA9IDB4Nzg7XG5cdCAgICAgIGlkYXRbcGkrK10gPSAweDljO1xuXHQgICAgICBsZXQgcG9zID0gMDtcblx0ICAgICAgd2hpbGUgKGxlbiA+IG1heEJsb2NrTGVuZ3RoKSB7XG5cdCAgICAgICAgaWRhdFtwaSsrXSA9IDB4MDA7XG5cdCAgICAgICAgaWRhdFtwaSsrXSA9IDB4ZmY7XG5cdCAgICAgICAgaWRhdFtwaSsrXSA9IDB4ZmY7XG5cdCAgICAgICAgaWRhdFtwaSsrXSA9IDB4MDA7XG5cdCAgICAgICAgaWRhdFtwaSsrXSA9IDB4MDA7XG5cdCAgICAgICAgaWRhdC5zZXQobGl0ZXJhbHMuc3ViYXJyYXkocG9zLCBwb3MgKyBtYXhCbG9ja0xlbmd0aCksIHBpKTtcblx0ICAgICAgICBwaSArPSBtYXhCbG9ja0xlbmd0aDtcblx0ICAgICAgICBwb3MgKz0gbWF4QmxvY2tMZW5ndGg7XG5cdCAgICAgICAgbGVuIC09IG1heEJsb2NrTGVuZ3RoO1xuXHQgICAgICB9XG5cdCAgICAgIGlkYXRbcGkrK10gPSAweDAxO1xuXHQgICAgICBpZGF0W3BpKytdID0gbGVuICYgMHhmZjtcblx0ICAgICAgaWRhdFtwaSsrXSA9IGxlbiA+PiA4ICYgMHhmZjtcblx0ICAgICAgaWRhdFtwaSsrXSA9IH5sZW4gJiAweGZmZmYgJiAweGZmO1xuXHQgICAgICBpZGF0W3BpKytdID0gKH5sZW4gJiAweGZmZmYpID4+IDggJiAweGZmO1xuXHQgICAgICBpZGF0LnNldChsaXRlcmFscy5zdWJhcnJheShwb3MpLCBwaSk7XG5cdCAgICAgIHBpICs9IGxpdGVyYWxzLmxlbmd0aCAtIHBvcztcblx0ICAgICAgY29uc3QgYWRsZXIgPSBhZGxlcjMyKGxpdGVyYWxzLCAwLCBsaXRlcmFscy5sZW5ndGgpO1xuXHQgICAgICBpZGF0W3BpKytdID0gYWRsZXIgPj4gMjQgJiAweGZmO1xuXHQgICAgICBpZGF0W3BpKytdID0gYWRsZXIgPj4gMTYgJiAweGZmO1xuXHQgICAgICBpZGF0W3BpKytdID0gYWRsZXIgPj4gOCAmIDB4ZmY7XG5cdCAgICAgIGlkYXRbcGkrK10gPSBhZGxlciAmIDB4ZmY7XG5cdCAgICAgIHJldHVybiBpZGF0O1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gZW5jb2RlKGltZ0RhdGEsIGtpbmQsIGZvcmNlRGF0YVNjaGVtYSwgaXNNYXNrKSB7XG5cdCAgICAgIGNvbnN0IHdpZHRoID0gaW1nRGF0YS53aWR0aDtcblx0ICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG5cdCAgICAgIGxldCBiaXREZXB0aCwgY29sb3JUeXBlLCBsaW5lU2l6ZTtcblx0ICAgICAgY29uc3QgYnl0ZXMgPSBpbWdEYXRhLmRhdGE7XG5cdCAgICAgIHN3aXRjaCAoa2luZCkge1xuXHQgICAgICAgIGNhc2UgX3V0aWwuSW1hZ2VLaW5kLkdSQVlTQ0FMRV8xQlBQOlxuXHQgICAgICAgICAgY29sb3JUeXBlID0gMDtcblx0ICAgICAgICAgIGJpdERlcHRoID0gMTtcblx0ICAgICAgICAgIGxpbmVTaXplID0gd2lkdGggKyA3ID4+IDM7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIF91dGlsLkltYWdlS2luZC5SR0JfMjRCUFA6XG5cdCAgICAgICAgICBjb2xvclR5cGUgPSAyO1xuXHQgICAgICAgICAgYml0RGVwdGggPSA4O1xuXHQgICAgICAgICAgbGluZVNpemUgPSB3aWR0aCAqIDM7XG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIF91dGlsLkltYWdlS2luZC5SR0JBXzMyQlBQOlxuXHQgICAgICAgICAgY29sb3JUeXBlID0gNjtcblx0ICAgICAgICAgIGJpdERlcHRoID0gODtcblx0ICAgICAgICAgIGxpbmVTaXplID0gd2lkdGggKiA0O1xuXHQgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZm9ybWF0XCIpO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IGxpdGVyYWxzID0gbmV3IFVpbnQ4QXJyYXkoKDEgKyBsaW5lU2l6ZSkgKiBoZWlnaHQpO1xuXHQgICAgICBsZXQgb2Zmc2V0TGl0ZXJhbHMgPSAwLFxuXHQgICAgICAgIG9mZnNldEJ5dGVzID0gMDtcblx0ICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkge1xuXHQgICAgICAgIGxpdGVyYWxzW29mZnNldExpdGVyYWxzKytdID0gMDtcblx0ICAgICAgICBsaXRlcmFscy5zZXQoYnl0ZXMuc3ViYXJyYXkob2Zmc2V0Qnl0ZXMsIG9mZnNldEJ5dGVzICsgbGluZVNpemUpLCBvZmZzZXRMaXRlcmFscyk7XG5cdCAgICAgICAgb2Zmc2V0Qnl0ZXMgKz0gbGluZVNpemU7XG5cdCAgICAgICAgb2Zmc2V0TGl0ZXJhbHMgKz0gbGluZVNpemU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGtpbmQgPT09IF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCAmJiBpc01hc2spIHtcblx0ICAgICAgICBvZmZzZXRMaXRlcmFscyA9IDA7XG5cdCAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuXHQgICAgICAgICAgb2Zmc2V0TGl0ZXJhbHMrKztcblx0ICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVNpemU7IGkrKykge1xuXHQgICAgICAgICAgICBsaXRlcmFsc1tvZmZzZXRMaXRlcmFscysrXSBePSAweGZmO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBpaGRyID0gbmV3IFVpbnQ4QXJyYXkoW3dpZHRoID4+IDI0ICYgMHhmZiwgd2lkdGggPj4gMTYgJiAweGZmLCB3aWR0aCA+PiA4ICYgMHhmZiwgd2lkdGggJiAweGZmLCBoZWlnaHQgPj4gMjQgJiAweGZmLCBoZWlnaHQgPj4gMTYgJiAweGZmLCBoZWlnaHQgPj4gOCAmIDB4ZmYsIGhlaWdodCAmIDB4ZmYsIGJpdERlcHRoLCBjb2xvclR5cGUsIDB4MDAsIDB4MDAsIDB4MDBdKTtcblx0ICAgICAgY29uc3QgaWRhdCA9IGRlZmxhdGVTeW5jKGxpdGVyYWxzKTtcblx0ICAgICAgY29uc3QgcG5nTGVuZ3RoID0gUE5HX0hFQURFUi5sZW5ndGggKyBDSFVOS19XUkFQUEVSX1NJWkUgKiAzICsgaWhkci5sZW5ndGggKyBpZGF0Lmxlbmd0aDtcblx0ICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHBuZ0xlbmd0aCk7XG5cdCAgICAgIGxldCBvZmZzZXQgPSAwO1xuXHQgICAgICBkYXRhLnNldChQTkdfSEVBREVSLCBvZmZzZXQpO1xuXHQgICAgICBvZmZzZXQgKz0gUE5HX0hFQURFUi5sZW5ndGg7XG5cdCAgICAgIHdyaXRlUG5nQ2h1bmsoXCJJSERSXCIsIGloZHIsIGRhdGEsIG9mZnNldCk7XG5cdCAgICAgIG9mZnNldCArPSBDSFVOS19XUkFQUEVSX1NJWkUgKyBpaGRyLmxlbmd0aDtcblx0ICAgICAgd3JpdGVQbmdDaHVuayhcIklEQVRBXCIsIGlkYXQsIGRhdGEsIG9mZnNldCk7XG5cdCAgICAgIG9mZnNldCArPSBDSFVOS19XUkFQUEVSX1NJWkUgKyBpZGF0Lmxlbmd0aDtcblx0ICAgICAgd3JpdGVQbmdDaHVuayhcIklFTkRcIiwgbmV3IFVpbnQ4QXJyYXkoMCksIGRhdGEsIG9mZnNldCk7XG5cdCAgICAgIHJldHVybiBjcmVhdGVPYmplY3RVUkwoZGF0YSwgXCJpbWFnZS9wbmdcIiwgZm9yY2VEYXRhU2NoZW1hKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBmdW5jdGlvbiBjb252ZXJ0SW1nRGF0YVRvUG5nKGltZ0RhdGEsIGZvcmNlRGF0YVNjaGVtYSwgaXNNYXNrKSB7XG5cdCAgICAgIGNvbnN0IGtpbmQgPSBpbWdEYXRhLmtpbmQgPT09IHVuZGVmaW5lZCA/IF91dGlsLkltYWdlS2luZC5HUkFZU0NBTEVfMUJQUCA6IGltZ0RhdGEua2luZDtcblx0ICAgICAgcmV0dXJuIGVuY29kZShpbWdEYXRhLCBraW5kLCBmb3JjZURhdGFTY2hlbWEsIGlzTWFzayk7XG5cdCAgICB9O1xuXHQgIH0oKTtcblx0ICBjbGFzcyBTVkdFeHRyYVN0YXRlIHtcblx0ICAgIGNvbnN0cnVjdG9yKCkge1xuXHQgICAgICB0aGlzLmZvbnRTaXplU2NhbGUgPSAxO1xuXHQgICAgICB0aGlzLmZvbnRXZWlnaHQgPSBTVkdfREVGQVVMVFMuZm9udFdlaWdodDtcblx0ICAgICAgdGhpcy5mb250U2l6ZSA9IDA7XG5cdCAgICAgIHRoaXMudGV4dE1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDtcblx0ICAgICAgdGhpcy5mb250TWF0cml4ID0gX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7XG5cdCAgICAgIHRoaXMubGVhZGluZyA9IDA7XG5cdCAgICAgIHRoaXMudGV4dFJlbmRlcmluZ01vZGUgPSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMO1xuXHQgICAgICB0aGlzLnRleHRNYXRyaXhTY2FsZSA9IDE7XG5cdCAgICAgIHRoaXMueCA9IDA7XG5cdCAgICAgIHRoaXMueSA9IDA7XG5cdCAgICAgIHRoaXMubGluZVggPSAwO1xuXHQgICAgICB0aGlzLmxpbmVZID0gMDtcblx0ICAgICAgdGhpcy5jaGFyU3BhY2luZyA9IDA7XG5cdCAgICAgIHRoaXMud29yZFNwYWNpbmcgPSAwO1xuXHQgICAgICB0aGlzLnRleHRIU2NhbGUgPSAxO1xuXHQgICAgICB0aGlzLnRleHRSaXNlID0gMDtcblx0ICAgICAgdGhpcy5maWxsQ29sb3IgPSBTVkdfREVGQVVMVFMuZmlsbENvbG9yO1xuXHQgICAgICB0aGlzLnN0cm9rZUNvbG9yID0gXCIjMDAwMDAwXCI7XG5cdCAgICAgIHRoaXMuZmlsbEFscGhhID0gMTtcblx0ICAgICAgdGhpcy5zdHJva2VBbHBoYSA9IDE7XG5cdCAgICAgIHRoaXMubGluZVdpZHRoID0gMTtcblx0ICAgICAgdGhpcy5saW5lSm9pbiA9IFwiXCI7XG5cdCAgICAgIHRoaXMubGluZUNhcCA9IFwiXCI7XG5cdCAgICAgIHRoaXMubWl0ZXJMaW1pdCA9IDA7XG5cdCAgICAgIHRoaXMuZGFzaEFycmF5ID0gW107XG5cdCAgICAgIHRoaXMuZGFzaFBoYXNlID0gMDtcblx0ICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBbXTtcblx0ICAgICAgdGhpcy5hY3RpdmVDbGlwVXJsID0gbnVsbDtcblx0ICAgICAgdGhpcy5jbGlwR3JvdXAgPSBudWxsO1xuXHQgICAgICB0aGlzLm1hc2tJZCA9IFwiXCI7XG5cdCAgICB9XG5cdCAgICBjbG9uZSgpIHtcblx0ICAgICAgcmV0dXJuIE9iamVjdC5jcmVhdGUodGhpcyk7XG5cdCAgICB9XG5cdCAgICBzZXRDdXJyZW50UG9pbnQoeCwgeSkge1xuXHQgICAgICB0aGlzLnggPSB4O1xuXHQgICAgICB0aGlzLnkgPSB5O1xuXHQgICAgfVxuXHQgIH1cblx0ICBmdW5jdGlvbiBvcExpc3RUb1RyZWUob3BMaXN0KSB7XG5cdCAgICBsZXQgb3BUcmVlID0gW107XG5cdCAgICBjb25zdCB0bXAgPSBbXTtcblx0ICAgIGZvciAoY29uc3Qgb3BMaXN0RWxlbWVudCBvZiBvcExpc3QpIHtcblx0ICAgICAgaWYgKG9wTGlzdEVsZW1lbnQuZm4gPT09IFwic2F2ZVwiKSB7XG5cdCAgICAgICAgb3BUcmVlLnB1c2goe1xuXHQgICAgICAgICAgZm5JZDogOTIsXG5cdCAgICAgICAgICBmbjogXCJncm91cFwiLFxuXHQgICAgICAgICAgaXRlbXM6IFtdXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdG1wLnB1c2gob3BUcmVlKTtcblx0ICAgICAgICBvcFRyZWUgPSBvcFRyZWUuYXQoLTEpLml0ZW1zO1xuXHQgICAgICAgIGNvbnRpbnVlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChvcExpc3RFbGVtZW50LmZuID09PSBcInJlc3RvcmVcIikge1xuXHQgICAgICAgIG9wVHJlZSA9IHRtcC5wb3AoKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBvcFRyZWUucHVzaChvcExpc3RFbGVtZW50KTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIG9wVHJlZTtcblx0ICB9XG5cdCAgZnVuY3Rpb24gcGYodmFsdWUpIHtcblx0ICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuXHQgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IHMgPSB2YWx1ZS50b0ZpeGVkKDEwKTtcblx0ICAgIGxldCBpID0gcy5sZW5ndGggLSAxO1xuXHQgICAgaWYgKHNbaV0gIT09IFwiMFwiKSB7XG5cdCAgICAgIHJldHVybiBzO1xuXHQgICAgfVxuXHQgICAgZG8ge1xuXHQgICAgICBpLS07XG5cdCAgICB9IHdoaWxlIChzW2ldID09PSBcIjBcIik7XG5cdCAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgc1tpXSA9PT0gXCIuXCIgPyBpIDogaSArIDEpO1xuXHQgIH1cblx0ICBmdW5jdGlvbiBwbShtKSB7XG5cdCAgICBpZiAobVs0XSA9PT0gMCAmJiBtWzVdID09PSAwKSB7XG5cdCAgICAgIGlmIChtWzFdID09PSAwICYmIG1bMl0gPT09IDApIHtcblx0ICAgICAgICBpZiAobVswXSA9PT0gMSAmJiBtWzNdID09PSAxKSB7XG5cdCAgICAgICAgICByZXR1cm4gXCJcIjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGBzY2FsZSgke3BmKG1bMF0pfSAke3BmKG1bM10pfSlgO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChtWzBdID09PSBtWzNdICYmIG1bMV0gPT09IC1tWzJdKSB7XG5cdCAgICAgICAgY29uc3QgYSA9IE1hdGguYWNvcyhtWzBdKSAqIDE4MCAvIE1hdGguUEk7XG5cdCAgICAgICAgcmV0dXJuIGByb3RhdGUoJHtwZihhKX0pYDtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgaWYgKG1bMF0gPT09IDEgJiYgbVsxXSA9PT0gMCAmJiBtWzJdID09PSAwICYmIG1bM10gPT09IDEpIHtcblx0ICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3BmKG1bNF0pfSAke3BmKG1bNV0pfSlgO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gYG1hdHJpeCgke3BmKG1bMF0pfSAke3BmKG1bMV0pfSAke3BmKG1bMl0pfSAke3BmKG1bM10pfSAke3BmKG1bNF0pfSBgICsgYCR7cGYobVs1XSl9KWA7XG5cdCAgfVxuXHQgIGxldCBjbGlwQ291bnQgPSAwO1xuXHQgIGxldCBtYXNrQ291bnQgPSAwO1xuXHQgIGxldCBzaGFkaW5nQ291bnQgPSAwO1xuXHQgIGV4cG9ydHMuU1ZHR3JhcGhpY3MgPSBTVkdHcmFwaGljcyA9IGNsYXNzIHtcblx0ICAgIGNvbnN0cnVjdG9yKGNvbW1vbk9ianMsIG9ianMsIGZvcmNlRGF0YVNjaGVtYSA9IGZhbHNlKSB7XG5cdCAgICAgICgwLCBfZGlzcGxheV91dGlscy5kZXByZWNhdGVkKShcIlRoZSBTVkcgYmFjay1lbmQgaXMgbm8gbG9uZ2VyIG1haW50YWluZWQgYW5kICptYXkqIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cIik7XG5cdCAgICAgIHRoaXMuc3ZnRmFjdG9yeSA9IG5ldyBfZGlzcGxheV91dGlscy5ET01TVkdGYWN0b3J5KCk7XG5cdCAgICAgIHRoaXMuY3VycmVudCA9IG5ldyBTVkdFeHRyYVN0YXRlKCk7XG5cdCAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYO1xuXHQgICAgICB0aGlzLnRyYW5zZm9ybVN0YWNrID0gW107XG5cdCAgICAgIHRoaXMuZXh0cmFTdGFjayA9IFtdO1xuXHQgICAgICB0aGlzLmNvbW1vbk9ianMgPSBjb21tb25PYmpzO1xuXHQgICAgICB0aGlzLm9ianMgPSBvYmpzO1xuXHQgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gbnVsbDtcblx0ICAgICAgdGhpcy5wZW5kaW5nRU9GaWxsID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuZW1iZWRGb250cyA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmVtYmVkZGVkRm9udHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXHQgICAgICB0aGlzLmNzc1N0eWxlID0gbnVsbDtcblx0ICAgICAgdGhpcy5mb3JjZURhdGFTY2hlbWEgPSAhIWZvcmNlRGF0YVNjaGVtYTtcblx0ICAgICAgdGhpcy5fb3BlcmF0b3JJZE1hcHBpbmcgPSBbXTtcblx0ICAgICAgZm9yIChjb25zdCBvcCBpbiBfdXRpbC5PUFMpIHtcblx0ICAgICAgICB0aGlzLl9vcGVyYXRvcklkTWFwcGluZ1tfdXRpbC5PUFNbb3BdXSA9IG9wO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBnZXRPYmplY3QoZGF0YSwgZmFsbGJhY2sgPSBudWxsKSB7XG5cdCAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuXHQgICAgICAgIHJldHVybiBkYXRhLnN0YXJ0c1dpdGgoXCJnX1wiKSA/IHRoaXMuY29tbW9uT2Jqcy5nZXQoZGF0YSkgOiB0aGlzLm9ianMuZ2V0KGRhdGEpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBmYWxsYmFjaztcblx0ICAgIH1cblx0ICAgIHNhdmUoKSB7XG5cdCAgICAgIHRoaXMudHJhbnNmb3JtU3RhY2sucHVzaCh0aGlzLnRyYW5zZm9ybU1hdHJpeCk7XG5cdCAgICAgIGNvbnN0IG9sZCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgdGhpcy5leHRyYVN0YWNrLnB1c2gob2xkKTtcblx0ICAgICAgdGhpcy5jdXJyZW50ID0gb2xkLmNsb25lKCk7XG5cdCAgICB9XG5cdCAgICByZXN0b3JlKCkge1xuXHQgICAgICB0aGlzLnRyYW5zZm9ybU1hdHJpeCA9IHRoaXMudHJhbnNmb3JtU3RhY2sucG9wKCk7XG5cdCAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZXh0cmFTdGFjay5wb3AoKTtcblx0ICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG5cdCAgICAgIHRoaXMudGdycCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBncm91cChpdGVtcykge1xuXHQgICAgICB0aGlzLnNhdmUoKTtcblx0ICAgICAgdGhpcy5leGVjdXRlT3BUcmVlKGl0ZW1zKTtcblx0ICAgICAgdGhpcy5yZXN0b3JlKCk7XG5cdCAgICB9XG5cdCAgICBsb2FkRGVwZW5kZW5jaWVzKG9wZXJhdG9yTGlzdCkge1xuXHQgICAgICBjb25zdCBmbkFycmF5ID0gb3BlcmF0b3JMaXN0LmZuQXJyYXk7XG5cdCAgICAgIGNvbnN0IGFyZ3NBcnJheSA9IG9wZXJhdG9yTGlzdC5hcmdzQXJyYXk7XG5cdCAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGZuQXJyYXkubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuXHQgICAgICAgIGlmIChmbkFycmF5W2ldICE9PSBfdXRpbC5PUFMuZGVwZW5kZW5jeSkge1xuXHQgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAoY29uc3Qgb2JqIG9mIGFyZ3NBcnJheVtpXSkge1xuXHQgICAgICAgICAgY29uc3Qgb2Jqc1Bvb2wgPSBvYmouc3RhcnRzV2l0aChcImdfXCIpID8gdGhpcy5jb21tb25PYmpzIDogdGhpcy5vYmpzO1xuXHQgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuXHQgICAgICAgICAgICBvYmpzUG9vbC5nZXQob2JqLCByZXNvbHZlKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgdGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcy5wdXNoKHByb21pc2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5jdXJyZW50LmRlcGVuZGVuY2llcyk7XG5cdCAgICB9XG5cdCAgICB0cmFuc2Zvcm0oYSwgYiwgYywgZCwgZSwgZikge1xuXHQgICAgICBjb25zdCB0cmFuc2Zvcm1NYXRyaXggPSBbYSwgYiwgYywgZCwgZSwgZl07XG5cdCAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gX3V0aWwuVXRpbC50cmFuc2Zvcm0odGhpcy50cmFuc2Zvcm1NYXRyaXgsIHRyYW5zZm9ybU1hdHJpeCk7XG5cdCAgICAgIHRoaXMudGdycCA9IG51bGw7XG5cdCAgICB9XG5cdCAgICBnZXRTVkcob3BlcmF0b3JMaXN0LCB2aWV3cG9ydCkge1xuXHQgICAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG5cdCAgICAgIGNvbnN0IHN2Z0VsZW1lbnQgPSB0aGlzLl9pbml0aWFsaXplKHZpZXdwb3J0KTtcblx0ICAgICAgcmV0dXJuIHRoaXMubG9hZERlcGVuZGVuY2llcyhvcGVyYXRvckxpc3QpLnRoZW4oKCkgPT4ge1xuXHQgICAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gX3V0aWwuSURFTlRJVFlfTUFUUklYO1xuXHQgICAgICAgIHRoaXMuZXhlY3V0ZU9wVHJlZSh0aGlzLmNvbnZlcnRPcExpc3Qob3BlcmF0b3JMaXN0KSk7XG5cdCAgICAgICAgcmV0dXJuIHN2Z0VsZW1lbnQ7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgICAgY29udmVydE9wTGlzdChvcGVyYXRvckxpc3QpIHtcblx0ICAgICAgY29uc3Qgb3BlcmF0b3JJZE1hcHBpbmcgPSB0aGlzLl9vcGVyYXRvcklkTWFwcGluZztcblx0ICAgICAgY29uc3QgYXJnc0FycmF5ID0gb3BlcmF0b3JMaXN0LmFyZ3NBcnJheTtcblx0ICAgICAgY29uc3QgZm5BcnJheSA9IG9wZXJhdG9yTGlzdC5mbkFycmF5O1xuXHQgICAgICBjb25zdCBvcExpc3QgPSBbXTtcblx0ICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gZm5BcnJheS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdCAgICAgICAgY29uc3QgZm5JZCA9IGZuQXJyYXlbaV07XG5cdCAgICAgICAgb3BMaXN0LnB1c2goe1xuXHQgICAgICAgICAgZm5JZCxcblx0ICAgICAgICAgIGZuOiBvcGVyYXRvcklkTWFwcGluZ1tmbklkXSxcblx0ICAgICAgICAgIGFyZ3M6IGFyZ3NBcnJheVtpXVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBvcExpc3RUb1RyZWUob3BMaXN0KTtcblx0ICAgIH1cblx0ICAgIGV4ZWN1dGVPcFRyZWUob3BUcmVlKSB7XG5cdCAgICAgIGZvciAoY29uc3Qgb3BUcmVlRWxlbWVudCBvZiBvcFRyZWUpIHtcblx0ICAgICAgICBjb25zdCBmbiA9IG9wVHJlZUVsZW1lbnQuZm47XG5cdCAgICAgICAgY29uc3QgZm5JZCA9IG9wVHJlZUVsZW1lbnQuZm5JZDtcblx0ICAgICAgICBjb25zdCBhcmdzID0gb3BUcmVlRWxlbWVudC5hcmdzO1xuXHQgICAgICAgIHN3aXRjaCAoZm5JZCB8IDApIHtcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmJlZ2luVGV4dDpcblx0ICAgICAgICAgICAgdGhpcy5iZWdpblRleHQoKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5kZXBlbmRlbmN5OlxuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExlYWRpbmc6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0TGVhZGluZyhhcmdzKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMZWFkaW5nTW92ZVRleHQ6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0TGVhZGluZ01vdmVUZXh0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZvbnQ6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0Rm9udChhcmdzKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93VGV4dDpcblx0ICAgICAgICAgICAgdGhpcy5zaG93VGV4dChhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaG93U3BhY2VkVGV4dDpcblx0ICAgICAgICAgICAgdGhpcy5zaG93VGV4dChhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRUZXh0OlxuXHQgICAgICAgICAgICB0aGlzLmVuZFRleHQoKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5tb3ZlVGV4dDpcblx0ICAgICAgICAgICAgdGhpcy5tb3ZlVGV4dChhcmdzWzBdLCBhcmdzWzFdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRDaGFyU3BhY2luZzpcblx0ICAgICAgICAgICAgdGhpcy5zZXRDaGFyU3BhY2luZyhhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRXb3JkU3BhY2luZzpcblx0ICAgICAgICAgICAgdGhpcy5zZXRXb3JkU3BhY2luZyhhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRIU2NhbGU6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0SFNjYWxlKGFyZ3NbMF0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldFRleHRNYXRyaXg6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0VGV4dE1hdHJpeChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0UmlzZTpcblx0ICAgICAgICAgICAgdGhpcy5zZXRUZXh0UmlzZShhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRUZXh0UmVuZGVyaW5nTW9kZTpcblx0ICAgICAgICAgICAgdGhpcy5zZXRUZXh0UmVuZGVyaW5nTW9kZShhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRMaW5lV2lkdGg6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0TGluZVdpZHRoKGFyZ3NbMF0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExpbmVKb2luOlxuXHQgICAgICAgICAgICB0aGlzLnNldExpbmVKb2luKGFyZ3NbMF0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldExpbmVDYXA6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0TGluZUNhcChhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRNaXRlckxpbWl0OlxuXHQgICAgICAgICAgICB0aGlzLnNldE1pdGVyTGltaXQoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0RmlsbFJHQkNvbG9yOlxuXHQgICAgICAgICAgICB0aGlzLnNldEZpbGxSR0JDb2xvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VSR0JDb2xvcjpcblx0ICAgICAgICAgICAgdGhpcy5zZXRTdHJva2VSR0JDb2xvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRTdHJva2VDb2xvck46XG5cdCAgICAgICAgICAgIHRoaXMuc2V0U3Ryb2tlQ29sb3JOKGFyZ3MpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnNldEZpbGxDb2xvck46XG5cdCAgICAgICAgICAgIHRoaXMuc2V0RmlsbENvbG9yTihhcmdzKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zaGFkaW5nRmlsbDpcblx0ICAgICAgICAgICAgdGhpcy5zaGFkaW5nRmlsbChhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXREYXNoOlxuXHQgICAgICAgICAgICB0aGlzLnNldERhc2goYXJnc1swXSwgYXJnc1sxXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuc2V0UmVuZGVyaW5nSW50ZW50OlxuXHQgICAgICAgICAgICB0aGlzLnNldFJlbmRlcmluZ0ludGVudChhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRGbGF0bmVzczpcblx0ICAgICAgICAgICAgdGhpcy5zZXRGbGF0bmVzcyhhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zZXRHU3RhdGU6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0R1N0YXRlKGFyZ3NbMF0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmZpbGw6XG5cdCAgICAgICAgICAgIHRoaXMuZmlsbCgpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmVvRmlsbDpcblx0ICAgICAgICAgICAgdGhpcy5lb0ZpbGwoKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5zdHJva2U6XG5cdCAgICAgICAgICAgIHRoaXMuc3Ryb2tlKCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZmlsbFN0cm9rZTpcblx0ICAgICAgICAgICAgdGhpcy5maWxsU3Ryb2tlKCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW9GaWxsU3Ryb2tlOlxuXHQgICAgICAgICAgICB0aGlzLmVvRmlsbFN0cm9rZSgpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsaXA6XG5cdCAgICAgICAgICAgIHRoaXMuY2xpcChcIm5vbnplcm9cIik7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuZW9DbGlwOlxuXHQgICAgICAgICAgICB0aGlzLmNsaXAoXCJldmVub2RkXCIpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50U29saWRDb2xvckltYWdlTWFzazpcblx0ICAgICAgICAgICAgdGhpcy5wYWludFNvbGlkQ29sb3JJbWFnZU1hc2soKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludEltYWdlWE9iamVjdDpcblx0ICAgICAgICAgICAgdGhpcy5wYWludEltYWdlWE9iamVjdChhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludElubGluZUltYWdlWE9iamVjdDpcblx0ICAgICAgICAgICAgdGhpcy5wYWludElubGluZUltYWdlWE9iamVjdChhcmdzWzBdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5wYWludEltYWdlTWFza1hPYmplY3Q6XG5cdCAgICAgICAgICAgIHRoaXMucGFpbnRJbWFnZU1hc2tYT2JqZWN0KGFyZ3NbMF0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLnBhaW50Rm9ybVhPYmplY3RCZWdpbjpcblx0ICAgICAgICAgICAgdGhpcy5wYWludEZvcm1YT2JqZWN0QmVnaW4oYXJnc1swXSwgYXJnc1sxXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMucGFpbnRGb3JtWE9iamVjdEVuZDpcblx0ICAgICAgICAgICAgdGhpcy5wYWludEZvcm1YT2JqZWN0RW5kKCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY2xvc2VQYXRoOlxuXHQgICAgICAgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlU3Ryb2tlOlxuXHQgICAgICAgICAgICB0aGlzLmNsb3NlU3Ryb2tlKCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY2xvc2VGaWxsU3Ryb2tlOlxuXHQgICAgICAgICAgICB0aGlzLmNsb3NlRmlsbFN0cm9rZSgpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlRU9GaWxsU3Ryb2tlOlxuXHQgICAgICAgICAgICB0aGlzLmNsb3NlRU9GaWxsU3Ryb2tlKCk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMubmV4dExpbmU6XG5cdCAgICAgICAgICAgIHRoaXMubmV4dExpbmUoKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy50cmFuc2Zvcm06XG5cdCAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNvbnN0cnVjdFBhdGg6XG5cdCAgICAgICAgICAgIHRoaXMuY29uc3RydWN0UGF0aChhcmdzWzBdLCBhcmdzWzFdKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5lbmRQYXRoOlxuXHQgICAgICAgICAgICB0aGlzLmVuZFBhdGgoKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIDkyOlxuXHQgICAgICAgICAgICB0aGlzLmdyb3VwKG9wVHJlZUVsZW1lbnQuaXRlbXMpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICgwLCBfdXRpbC53YXJuKShgVW5pbXBsZW1lbnRlZCBvcGVyYXRvciAke2ZufWApO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHNldFdvcmRTcGFjaW5nKHdvcmRTcGFjaW5nKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC53b3JkU3BhY2luZyA9IHdvcmRTcGFjaW5nO1xuXHQgICAgfVxuXHQgICAgc2V0Q2hhclNwYWNpbmcoY2hhclNwYWNpbmcpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LmNoYXJTcGFjaW5nID0gY2hhclNwYWNpbmc7XG5cdCAgICB9XG5cdCAgICBuZXh0TGluZSgpIHtcblx0ICAgICAgdGhpcy5tb3ZlVGV4dCgwLCB0aGlzLmN1cnJlbnQubGVhZGluZyk7XG5cdCAgICB9XG5cdCAgICBzZXRUZXh0TWF0cml4KGEsIGIsIGMsIGQsIGUsIGYpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgY3VycmVudC50ZXh0TWF0cml4ID0gY3VycmVudC5saW5lTWF0cml4ID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuXHQgICAgICBjdXJyZW50LnRleHRNYXRyaXhTY2FsZSA9IE1hdGguaHlwb3QoYSwgYik7XG5cdCAgICAgIGN1cnJlbnQueCA9IGN1cnJlbnQubGluZVggPSAwO1xuXHQgICAgICBjdXJyZW50LnkgPSBjdXJyZW50LmxpbmVZID0gMDtcblx0ICAgICAgY3VycmVudC54Y29vcmRzID0gW107XG5cdCAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdO1xuXHQgICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG5cdCAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmb250LWZhbWlseVwiLCBjdXJyZW50LmZvbnRGYW1pbHkpO1xuXHQgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1zaXplXCIsIGAke3BmKGN1cnJlbnQuZm9udFNpemUpfXB4YCk7XG5cdCAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1jdXJyZW50LnkpKTtcblx0ICAgICAgY3VycmVudC50eHRFbGVtZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dGV4dFwiKTtcblx0ICAgICAgY3VycmVudC50eHRFbGVtZW50LmFwcGVuZChjdXJyZW50LnRzcGFuKTtcblx0ICAgIH1cblx0ICAgIGJlZ2luVGV4dCgpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgY3VycmVudC54ID0gY3VycmVudC5saW5lWCA9IDA7XG5cdCAgICAgIGN1cnJlbnQueSA9IGN1cnJlbnQubGluZVkgPSAwO1xuXHQgICAgICBjdXJyZW50LnRleHRNYXRyaXggPSBfdXRpbC5JREVOVElUWV9NQVRSSVg7XG5cdCAgICAgIGN1cnJlbnQubGluZU1hdHJpeCA9IF91dGlsLklERU5USVRZX01BVFJJWDtcblx0ICAgICAgY3VycmVudC50ZXh0TWF0cml4U2NhbGUgPSAxO1xuXHQgICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG5cdCAgICAgIGN1cnJlbnQudHh0RWxlbWVudCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRleHRcIik7XG5cdCAgICAgIGN1cnJlbnQudHh0Z3JwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcblx0ICAgICAgY3VycmVudC54Y29vcmRzID0gW107XG5cdCAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdO1xuXHQgICAgfVxuXHQgICAgbW92ZVRleHQoeCwgeSkge1xuXHQgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICBjdXJyZW50LnggPSBjdXJyZW50LmxpbmVYICs9IHg7XG5cdCAgICAgIGN1cnJlbnQueSA9IGN1cnJlbnQubGluZVkgKz0geTtcblx0ICAgICAgY3VycmVudC54Y29vcmRzID0gW107XG5cdCAgICAgIGN1cnJlbnQueWNvb3JkcyA9IFtdO1xuXHQgICAgICBjdXJyZW50LnRzcGFuID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6dHNwYW5cIik7XG5cdCAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmb250LWZhbWlseVwiLCBjdXJyZW50LmZvbnRGYW1pbHkpO1xuXHQgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZm9udC1zaXplXCIsIGAke3BmKGN1cnJlbnQuZm9udFNpemUpfXB4YCk7XG5cdCAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1jdXJyZW50LnkpKTtcblx0ICAgIH1cblx0ICAgIHNob3dUZXh0KGdseXBocykge1xuXHQgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICBjb25zdCBmb250ID0gY3VycmVudC5mb250O1xuXHQgICAgICBjb25zdCBmb250U2l6ZSA9IGN1cnJlbnQuZm9udFNpemU7XG5cdCAgICAgIGlmIChmb250U2l6ZSA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCBmb250U2l6ZVNjYWxlID0gY3VycmVudC5mb250U2l6ZVNjYWxlO1xuXHQgICAgICBjb25zdCBjaGFyU3BhY2luZyA9IGN1cnJlbnQuY2hhclNwYWNpbmc7XG5cdCAgICAgIGNvbnN0IHdvcmRTcGFjaW5nID0gY3VycmVudC53b3JkU3BhY2luZztcblx0ICAgICAgY29uc3QgZm9udERpcmVjdGlvbiA9IGN1cnJlbnQuZm9udERpcmVjdGlvbjtcblx0ICAgICAgY29uc3QgdGV4dEhTY2FsZSA9IGN1cnJlbnQudGV4dEhTY2FsZSAqIGZvbnREaXJlY3Rpb247XG5cdCAgICAgIGNvbnN0IHZlcnRpY2FsID0gZm9udC52ZXJ0aWNhbDtcblx0ICAgICAgY29uc3Qgc3BhY2luZ0RpciA9IHZlcnRpY2FsID8gMSA6IC0xO1xuXHQgICAgICBjb25zdCBkZWZhdWx0Vk1ldHJpY3MgPSBmb250LmRlZmF1bHRWTWV0cmljcztcblx0ICAgICAgY29uc3Qgd2lkdGhBZHZhbmNlU2NhbGUgPSBmb250U2l6ZSAqIGN1cnJlbnQuZm9udE1hdHJpeFswXTtcblx0ICAgICAgbGV0IHggPSAwO1xuXHQgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBocykge1xuXHQgICAgICAgIGlmIChnbHlwaCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgeCArPSBmb250RGlyZWN0aW9uICogd29yZFNwYWNpbmc7XG5cdCAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBnbHlwaCA9PT0gXCJudW1iZXJcIikge1xuXHQgICAgICAgICAgeCArPSBzcGFjaW5nRGlyICogZ2x5cGggKiBmb250U2l6ZSAvIDEwMDA7XG5cdCAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgc3BhY2luZyA9IChnbHlwaC5pc1NwYWNlID8gd29yZFNwYWNpbmcgOiAwKSArIGNoYXJTcGFjaW5nO1xuXHQgICAgICAgIGNvbnN0IGNoYXJhY3RlciA9IGdseXBoLmZvbnRDaGFyO1xuXHQgICAgICAgIGxldCBzY2FsZWRYLCBzY2FsZWRZO1xuXHQgICAgICAgIGxldCB3aWR0aCA9IGdseXBoLndpZHRoO1xuXHQgICAgICAgIGlmICh2ZXJ0aWNhbCkge1xuXHQgICAgICAgICAgbGV0IHZ4O1xuXHQgICAgICAgICAgY29uc3Qgdm1ldHJpYyA9IGdseXBoLnZtZXRyaWMgfHwgZGVmYXVsdFZNZXRyaWNzO1xuXHQgICAgICAgICAgdnggPSBnbHlwaC52bWV0cmljID8gdm1ldHJpY1sxXSA6IHdpZHRoICogMC41O1xuXHQgICAgICAgICAgdnggPSAtdnggKiB3aWR0aEFkdmFuY2VTY2FsZTtcblx0ICAgICAgICAgIGNvbnN0IHZ5ID0gdm1ldHJpY1syXSAqIHdpZHRoQWR2YW5jZVNjYWxlO1xuXHQgICAgICAgICAgd2lkdGggPSB2bWV0cmljID8gLXZtZXRyaWNbMF0gOiB3aWR0aDtcblx0ICAgICAgICAgIHNjYWxlZFggPSB2eCAvIGZvbnRTaXplU2NhbGU7XG5cdCAgICAgICAgICBzY2FsZWRZID0gKHggKyB2eSkgLyBmb250U2l6ZVNjYWxlO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBzY2FsZWRYID0geCAvIGZvbnRTaXplU2NhbGU7XG5cdCAgICAgICAgICBzY2FsZWRZID0gMDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGdseXBoLmlzSW5Gb250IHx8IGZvbnQubWlzc2luZ0ZpbGUpIHtcblx0ICAgICAgICAgIGN1cnJlbnQueGNvb3Jkcy5wdXNoKGN1cnJlbnQueCArIHNjYWxlZFgpO1xuXHQgICAgICAgICAgaWYgKHZlcnRpY2FsKSB7XG5cdCAgICAgICAgICAgIGN1cnJlbnQueWNvb3Jkcy5wdXNoKC1jdXJyZW50LnkgKyBzY2FsZWRZKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGN1cnJlbnQudHNwYW4udGV4dENvbnRlbnQgKz0gY2hhcmFjdGVyO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBsZXQgY2hhcldpZHRoO1xuXHQgICAgICAgIGlmICh2ZXJ0aWNhbCkge1xuXHQgICAgICAgICAgY2hhcldpZHRoID0gd2lkdGggKiB3aWR0aEFkdmFuY2VTY2FsZSAtIHNwYWNpbmcgKiBmb250RGlyZWN0aW9uO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBjaGFyV2lkdGggPSB3aWR0aCAqIHdpZHRoQWR2YW5jZVNjYWxlICsgc3BhY2luZyAqIGZvbnREaXJlY3Rpb247XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHggKz0gY2hhcldpZHRoO1xuXHQgICAgICB9XG5cdCAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIGN1cnJlbnQueGNvb3Jkcy5tYXAocGYpLmpvaW4oXCIgXCIpKTtcblx0ICAgICAgaWYgKHZlcnRpY2FsKSB7XG5cdCAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgY3VycmVudC55Y29vcmRzLm1hcChwZikuam9pbihcIiBcIikpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1jdXJyZW50LnkpKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodmVydGljYWwpIHtcblx0ICAgICAgICBjdXJyZW50LnkgLT0geDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjdXJyZW50LnggKz0geCAqIHRleHRIU2NhbGU7XG5cdCAgICAgIH1cblx0ICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtZmFtaWx5XCIsIGN1cnJlbnQuZm9udEZhbWlseSk7XG5cdCAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmb250LXNpemVcIiwgYCR7cGYoY3VycmVudC5mb250U2l6ZSl9cHhgKTtcblx0ICAgICAgaWYgKGN1cnJlbnQuZm9udFN0eWxlICE9PSBTVkdfREVGQVVMVFMuZm9udFN0eWxlKSB7XG5cdCAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtc3R5bGVcIiwgY3VycmVudC5mb250U3R5bGUpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChjdXJyZW50LmZvbnRXZWlnaHQgIT09IFNWR19ERUZBVUxUUy5mb250V2VpZ2h0KSB7XG5cdCAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZvbnQtd2VpZ2h0XCIsIGN1cnJlbnQuZm9udFdlaWdodCk7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgZmlsbFN0cm9rZU1vZGUgPSBjdXJyZW50LnRleHRSZW5kZXJpbmdNb2RlICYgX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0VfTUFTSztcblx0ICAgICAgaWYgKGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMIHx8IGZpbGxTdHJva2VNb2RlID09PSBfdXRpbC5UZXh0UmVuZGVyaW5nTW9kZS5GSUxMX1NUUk9LRSkge1xuXHQgICAgICAgIGlmIChjdXJyZW50LmZpbGxDb2xvciAhPT0gU1ZHX0RFRkFVTFRTLmZpbGxDb2xvcikge1xuXHQgICAgICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgY3VycmVudC5maWxsQ29sb3IpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY3VycmVudC5maWxsQWxwaGEgPCAxKSB7XG5cdCAgICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1vcGFjaXR5XCIsIGN1cnJlbnQuZmlsbEFscGhhKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSBpZiAoY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuQUREX1RPX1BBVEgpIHtcblx0ICAgICAgICBjdXJyZW50LnRzcGFuLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGN1cnJlbnQudHNwYW4uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsXCIsIFwibm9uZVwiKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoZmlsbFN0cm9rZU1vZGUgPT09IF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLlNUUk9LRSB8fCBmaWxsU3Ryb2tlTW9kZSA9PT0gX3V0aWwuVGV4dFJlbmRlcmluZ01vZGUuRklMTF9TVFJPS0UpIHtcblx0ICAgICAgICBjb25zdCBsaW5lV2lkdGhTY2FsZSA9IDEgLyAoY3VycmVudC50ZXh0TWF0cml4U2NhbGUgfHwgMSk7XG5cdCAgICAgICAgdGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhjdXJyZW50LnRzcGFuLCBsaW5lV2lkdGhTY2FsZSk7XG5cdCAgICAgIH1cblx0ICAgICAgbGV0IHRleHRNYXRyaXggPSBjdXJyZW50LnRleHRNYXRyaXg7XG5cdCAgICAgIGlmIChjdXJyZW50LnRleHRSaXNlICE9PSAwKSB7XG5cdCAgICAgICAgdGV4dE1hdHJpeCA9IHRleHRNYXRyaXguc2xpY2UoKTtcblx0ICAgICAgICB0ZXh0TWF0cml4WzVdICs9IGN1cnJlbnQudGV4dFJpc2U7XG5cdCAgICAgIH1cblx0ICAgICAgY3VycmVudC50eHRFbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIGAke3BtKHRleHRNYXRyaXgpfSBzY2FsZSgke3BmKHRleHRIU2NhbGUpfSwgLTEpYCk7XG5cdCAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTlMsIFwieG1sOnNwYWNlXCIsIFwicHJlc2VydmVcIik7XG5cdCAgICAgIGN1cnJlbnQudHh0RWxlbWVudC5hcHBlbmQoY3VycmVudC50c3Bhbik7XG5cdCAgICAgIGN1cnJlbnQudHh0Z3JwLmFwcGVuZChjdXJyZW50LnR4dEVsZW1lbnQpO1xuXHQgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChjdXJyZW50LnR4dEVsZW1lbnQpO1xuXHQgICAgfVxuXHQgICAgc2V0TGVhZGluZ01vdmVUZXh0KHgsIHkpIHtcblx0ICAgICAgdGhpcy5zZXRMZWFkaW5nKC15KTtcblx0ICAgICAgdGhpcy5tb3ZlVGV4dCh4LCB5KTtcblx0ICAgIH1cblx0ICAgIGFkZEZvbnRTdHlsZShmb250T2JqKSB7XG5cdCAgICAgIGlmICghZm9udE9iai5kYXRhKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWRkRm9udFN0eWxlOiBObyBmb250IGRhdGEgYXZhaWxhYmxlLCBcIiArICdlbnN1cmUgdGhhdCB0aGUgXCJmb250RXh0cmFQcm9wZXJ0aWVzXCIgQVBJIHBhcmFtZXRlciBpcyBzZXQuJyk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKCF0aGlzLmNzc1N0eWxlKSB7XG5cdCAgICAgICAgdGhpcy5jc3NTdHlsZSA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnN0eWxlXCIpO1xuXHQgICAgICAgIHRoaXMuY3NzU3R5bGUuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0eXBlXCIsIFwidGV4dC9jc3NcIik7XG5cdCAgICAgICAgdGhpcy5kZWZzLmFwcGVuZCh0aGlzLmNzc1N0eWxlKTtcblx0ICAgICAgfVxuXHQgICAgICBjb25zdCB1cmwgPSBjcmVhdGVPYmplY3RVUkwoZm9udE9iai5kYXRhLCBmb250T2JqLm1pbWV0eXBlLCB0aGlzLmZvcmNlRGF0YVNjaGVtYSk7XG5cdCAgICAgIHRoaXMuY3NzU3R5bGUudGV4dENvbnRlbnQgKz0gYEBmb250LWZhY2UgeyBmb250LWZhbWlseTogXCIke2ZvbnRPYmoubG9hZGVkTmFtZX1cIjtgICsgYCBzcmM6IHVybCgke3VybH0pOyB9XFxuYDtcblx0ICAgIH1cblx0ICAgIHNldEZvbnQoZGV0YWlscykge1xuXHQgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICBjb25zdCBmb250T2JqID0gdGhpcy5jb21tb25PYmpzLmdldChkZXRhaWxzWzBdKTtcblx0ICAgICAgbGV0IHNpemUgPSBkZXRhaWxzWzFdO1xuXHQgICAgICBjdXJyZW50LmZvbnQgPSBmb250T2JqO1xuXHQgICAgICBpZiAodGhpcy5lbWJlZEZvbnRzICYmICFmb250T2JqLm1pc3NpbmdGaWxlICYmICF0aGlzLmVtYmVkZGVkRm9udHNbZm9udE9iai5sb2FkZWROYW1lXSkge1xuXHQgICAgICAgIHRoaXMuYWRkRm9udFN0eWxlKGZvbnRPYmopO1xuXHQgICAgICAgIHRoaXMuZW1iZWRkZWRGb250c1tmb250T2JqLmxvYWRlZE5hbWVdID0gZm9udE9iajtcblx0ICAgICAgfVxuXHQgICAgICBjdXJyZW50LmZvbnRNYXRyaXggPSBmb250T2JqLmZvbnRNYXRyaXggfHwgX3V0aWwuRk9OVF9JREVOVElUWV9NQVRSSVg7XG5cdCAgICAgIGxldCBib2xkID0gXCJub3JtYWxcIjtcblx0ICAgICAgaWYgKGZvbnRPYmouYmxhY2spIHtcblx0ICAgICAgICBib2xkID0gXCI5MDBcIjtcblx0ICAgICAgfSBlbHNlIGlmIChmb250T2JqLmJvbGQpIHtcblx0ICAgICAgICBib2xkID0gXCJib2xkXCI7XG5cdCAgICAgIH1cblx0ICAgICAgY29uc3QgaXRhbGljID0gZm9udE9iai5pdGFsaWMgPyBcIml0YWxpY1wiIDogXCJub3JtYWxcIjtcblx0ICAgICAgaWYgKHNpemUgPCAwKSB7XG5cdCAgICAgICAgc2l6ZSA9IC1zaXplO1xuXHQgICAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IC0xO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIGN1cnJlbnQuZm9udERpcmVjdGlvbiA9IDE7XG5cdCAgICAgIH1cblx0ICAgICAgY3VycmVudC5mb250U2l6ZSA9IHNpemU7XG5cdCAgICAgIGN1cnJlbnQuZm9udEZhbWlseSA9IGZvbnRPYmoubG9hZGVkTmFtZTtcblx0ICAgICAgY3VycmVudC5mb250V2VpZ2h0ID0gYm9sZDtcblx0ICAgICAgY3VycmVudC5mb250U3R5bGUgPSBpdGFsaWM7XG5cdCAgICAgIGN1cnJlbnQudHNwYW4gPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2Zzp0c3BhblwiKTtcblx0ICAgICAgY3VycmVudC50c3Bhbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgcGYoLWN1cnJlbnQueSkpO1xuXHQgICAgICBjdXJyZW50Lnhjb29yZHMgPSBbXTtcblx0ICAgICAgY3VycmVudC55Y29vcmRzID0gW107XG5cdCAgICB9XG5cdCAgICBlbmRUZXh0KCkge1xuXHQgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICBpZiAoY3VycmVudC50ZXh0UmVuZGVyaW5nTW9kZSAmIF91dGlsLlRleHRSZW5kZXJpbmdNb2RlLkFERF9UT19QQVRIX0ZMQUcgJiYgY3VycmVudC50eHRFbGVtZW50Py5oYXNDaGlsZE5vZGVzKCkpIHtcblx0ICAgICAgICBjdXJyZW50LmVsZW1lbnQgPSBjdXJyZW50LnR4dEVsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5jbGlwKFwibm9uemVyb1wiKTtcblx0ICAgICAgICB0aGlzLmVuZFBhdGgoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgc2V0TGluZVdpZHRoKHdpZHRoKSB7XG5cdCAgICAgIGlmICh3aWR0aCA+IDApIHtcblx0ICAgICAgICB0aGlzLmN1cnJlbnQubGluZVdpZHRoID0gd2lkdGg7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHNldExpbmVDYXAoc3R5bGUpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LmxpbmVDYXAgPSBMSU5FX0NBUF9TVFlMRVNbc3R5bGVdO1xuXHQgICAgfVxuXHQgICAgc2V0TGluZUpvaW4oc3R5bGUpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LmxpbmVKb2luID0gTElORV9KT0lOX1NUWUxFU1tzdHlsZV07XG5cdCAgICB9XG5cdCAgICBzZXRNaXRlckxpbWl0KGxpbWl0KSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC5taXRlckxpbWl0ID0gbGltaXQ7XG5cdCAgICB9XG5cdCAgICBzZXRTdHJva2VBbHBoYShzdHJva2VBbHBoYSkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQWxwaGEgPSBzdHJva2VBbHBoYTtcblx0ICAgIH1cblx0ICAgIHNldFN0cm9rZVJHQkNvbG9yKHIsIGcsIGIpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IociwgZywgYik7XG5cdCAgICB9XG5cdCAgICBzZXRGaWxsQWxwaGEoZmlsbEFscGhhKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC5maWxsQWxwaGEgPSBmaWxsQWxwaGE7XG5cdCAgICB9XG5cdCAgICBzZXRGaWxsUkdCQ29sb3IociwgZywgYikge1xuXHQgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gX3V0aWwuVXRpbC5tYWtlSGV4Q29sb3IociwgZywgYik7XG5cdCAgICAgIHRoaXMuY3VycmVudC50c3BhbiA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnRzcGFuXCIpO1xuXHQgICAgICB0aGlzLmN1cnJlbnQueGNvb3JkcyA9IFtdO1xuXHQgICAgICB0aGlzLmN1cnJlbnQueWNvb3JkcyA9IFtdO1xuXHQgICAgfVxuXHQgICAgc2V0U3Ryb2tlQ29sb3JOKGFyZ3MpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gdGhpcy5fbWFrZUNvbG9yTl9QYXR0ZXJuKGFyZ3MpO1xuXHQgICAgfVxuXHQgICAgc2V0RmlsbENvbG9yTihhcmdzKSB7XG5cdCAgICAgIHRoaXMuY3VycmVudC5maWxsQ29sb3IgPSB0aGlzLl9tYWtlQ29sb3JOX1BhdHRlcm4oYXJncyk7XG5cdCAgICB9XG5cdCAgICBzaGFkaW5nRmlsbChhcmdzKSB7XG5cdCAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy52aWV3cG9ydC53aWR0aDtcblx0ICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy52aWV3cG9ydC5oZWlnaHQ7XG5cdCAgICAgIGNvbnN0IGludiA9IF91dGlsLlV0aWwuaW52ZXJzZVRyYW5zZm9ybSh0aGlzLnRyYW5zZm9ybU1hdHJpeCk7XG5cdCAgICAgIGNvbnN0IGJsID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgMF0sIGludik7XG5cdCAgICAgIGNvbnN0IGJyID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbMCwgaGVpZ2h0XSwgaW52KTtcblx0ICAgICAgY29uc3QgdWwgPSBfdXRpbC5VdGlsLmFwcGx5VHJhbnNmb3JtKFt3aWR0aCwgMF0sIGludik7XG5cdCAgICAgIGNvbnN0IHVyID0gX3V0aWwuVXRpbC5hcHBseVRyYW5zZm9ybShbd2lkdGgsIGhlaWdodF0sIGludik7XG5cdCAgICAgIGNvbnN0IHgwID0gTWF0aC5taW4oYmxbMF0sIGJyWzBdLCB1bFswXSwgdXJbMF0pO1xuXHQgICAgICBjb25zdCB5MCA9IE1hdGgubWluKGJsWzFdLCBiclsxXSwgdWxbMV0sIHVyWzFdKTtcblx0ICAgICAgY29uc3QgeDEgPSBNYXRoLm1heChibFswXSwgYnJbMF0sIHVsWzBdLCB1clswXSk7XG5cdCAgICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoYmxbMV0sIGJyWzFdLCB1bFsxXSwgdXJbMV0pO1xuXHQgICAgICBjb25zdCByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgeDApO1xuXHQgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCB5MCk7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCB4MSAtIHgwKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCB5MSAtIHkwKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgdGhpcy5fbWFrZVNoYWRpbmdQYXR0ZXJuKGFyZ3MpKTtcblx0ICAgICAgaWYgKHRoaXMuY3VycmVudC5maWxsQWxwaGEgPCAxKSB7XG5cdCAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGwtb3BhY2l0eVwiLCB0aGlzLmN1cnJlbnQuZmlsbEFscGhhKTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChyZWN0KTtcblx0ICAgIH1cblx0ICAgIF9tYWtlQ29sb3JOX1BhdHRlcm4oYXJncykge1xuXHQgICAgICBpZiAoYXJnc1swXSA9PT0gXCJUaWxpbmdQYXR0ZXJuXCIpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fbWFrZVRpbGluZ1BhdHRlcm4oYXJncyk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHRoaXMuX21ha2VTaGFkaW5nUGF0dGVybihhcmdzKTtcblx0ICAgIH1cblx0ICAgIF9tYWtlVGlsaW5nUGF0dGVybihhcmdzKSB7XG5cdCAgICAgIGNvbnN0IGNvbG9yID0gYXJnc1sxXTtcblx0ICAgICAgY29uc3Qgb3BlcmF0b3JMaXN0ID0gYXJnc1syXTtcblx0ICAgICAgY29uc3QgbWF0cml4ID0gYXJnc1szXSB8fCBfdXRpbC5JREVOVElUWV9NQVRSSVg7XG5cdCAgICAgIGNvbnN0IFt4MCwgeTAsIHgxLCB5MV0gPSBhcmdzWzRdO1xuXHQgICAgICBjb25zdCB4c3RlcCA9IGFyZ3NbNV07XG5cdCAgICAgIGNvbnN0IHlzdGVwID0gYXJnc1s2XTtcblx0ICAgICAgY29uc3QgcGFpbnRUeXBlID0gYXJnc1s3XTtcblx0ICAgICAgY29uc3QgdGlsaW5nSWQgPSBgc2hhZGluZyR7c2hhZGluZ0NvdW50Kyt9YDtcblx0ICAgICAgY29uc3QgW3R4MCwgdHkwLCB0eDEsIHR5MV0gPSBfdXRpbC5VdGlsLm5vcm1hbGl6ZVJlY3QoWy4uLl91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gwLCB5MF0sIG1hdHJpeCksIC4uLl91dGlsLlV0aWwuYXBwbHlUcmFuc2Zvcm0oW3gxLCB5MV0sIG1hdHJpeCldKTtcblx0ICAgICAgY29uc3QgW3hzY2FsZSwgeXNjYWxlXSA9IF91dGlsLlV0aWwuc2luZ3VsYXJWYWx1ZURlY29tcG9zZTJkU2NhbGUobWF0cml4KTtcblx0ICAgICAgY29uc3QgdHhzdGVwID0geHN0ZXAgKiB4c2NhbGU7XG5cdCAgICAgIGNvbnN0IHR5c3RlcCA9IHlzdGVwICogeXNjYWxlO1xuXHQgICAgICBjb25zdCB0aWxpbmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpwYXR0ZXJuXCIpO1xuXHQgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCB0aWxpbmdJZCk7XG5cdCAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInBhdHRlcm5Vbml0c1wiLCBcInVzZXJTcGFjZU9uVXNlXCIpO1xuXHQgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCB0eHN0ZXApO1xuXHQgICAgICB0aWxpbmcuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgdHlzdGVwKTtcblx0ICAgICAgdGlsaW5nLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBgJHt0eDB9YCk7XG5cdCAgICAgIHRpbGluZy5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgYCR7dHkwfWApO1xuXHQgICAgICBjb25zdCBzdmcgPSB0aGlzLnN2Zztcblx0ICAgICAgY29uc3QgdHJhbnNmb3JtTWF0cml4ID0gdGhpcy50cmFuc2Zvcm1NYXRyaXg7XG5cdCAgICAgIGNvbnN0IGZpbGxDb2xvciA9IHRoaXMuY3VycmVudC5maWxsQ29sb3I7XG5cdCAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yO1xuXHQgICAgICBjb25zdCBiYm94ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZSh0eDEgLSB0eDAsIHR5MSAtIHR5MCk7XG5cdCAgICAgIHRoaXMuc3ZnID0gYmJveDtcblx0ICAgICAgdGhpcy50cmFuc2Zvcm1NYXRyaXggPSBtYXRyaXg7XG5cdCAgICAgIGlmIChwYWludFR5cGUgPT09IDIpIHtcblx0ICAgICAgICBjb25zdCBjc3NDb2xvciA9IF91dGlsLlV0aWwubWFrZUhleENvbG9yKC4uLmNvbG9yKTtcblx0ICAgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gY3NzQ29sb3I7XG5cdCAgICAgICAgdGhpcy5jdXJyZW50LnN0cm9rZUNvbG9yID0gY3NzQ29sb3I7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5leGVjdXRlT3BUcmVlKHRoaXMuY29udmVydE9wTGlzdChvcGVyYXRvckxpc3QpKTtcblx0ICAgICAgdGhpcy5zdmcgPSBzdmc7XG5cdCAgICAgIHRoaXMudHJhbnNmb3JtTWF0cml4ID0gdHJhbnNmb3JtTWF0cml4O1xuXHQgICAgICB0aGlzLmN1cnJlbnQuZmlsbENvbG9yID0gZmlsbENvbG9yO1xuXHQgICAgICB0aGlzLmN1cnJlbnQuc3Ryb2tlQ29sb3IgPSBzdHJva2VDb2xvcjtcblx0ICAgICAgdGlsaW5nLmFwcGVuZChiYm94LmNoaWxkTm9kZXNbMF0pO1xuXHQgICAgICB0aGlzLmRlZnMuYXBwZW5kKHRpbGluZyk7XG5cdCAgICAgIHJldHVybiBgdXJsKCMke3RpbGluZ0lkfSlgO1xuXHQgICAgfVxuXHQgICAgX21ha2VTaGFkaW5nUGF0dGVybihhcmdzKSB7XG5cdCAgICAgIGlmICh0eXBlb2YgYXJncyA9PT0gXCJzdHJpbmdcIikge1xuXHQgICAgICAgIGFyZ3MgPSB0aGlzLm9ianMuZ2V0KGFyZ3MpO1xuXHQgICAgICB9XG5cdCAgICAgIHN3aXRjaCAoYXJnc1swXSkge1xuXHQgICAgICAgIGNhc2UgXCJSYWRpYWxBeGlhbFwiOlxuXHQgICAgICAgICAgY29uc3Qgc2hhZGluZ0lkID0gYHNoYWRpbmcke3NoYWRpbmdDb3VudCsrfWA7XG5cdCAgICAgICAgICBjb25zdCBjb2xvclN0b3BzID0gYXJnc1szXTtcblx0ICAgICAgICAgIGxldCBncmFkaWVudDtcblx0ICAgICAgICAgIHN3aXRjaCAoYXJnc1sxXSkge1xuXHQgICAgICAgICAgICBjYXNlIFwiYXhpYWxcIjpcblx0ICAgICAgICAgICAgICBjb25zdCBwb2ludDAgPSBhcmdzWzRdO1xuXHQgICAgICAgICAgICAgIGNvbnN0IHBvaW50MSA9IGFyZ3NbNV07XG5cdCAgICAgICAgICAgICAgZ3JhZGllbnQgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpsaW5lYXJHcmFkaWVudFwiKTtcblx0ICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIHNoYWRpbmdJZCk7XG5cdCAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJncmFkaWVudFVuaXRzXCIsIFwidXNlclNwYWNlT25Vc2VcIik7XG5cdCAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4MVwiLCBwb2ludDBbMF0pO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieTFcIiwgcG9pbnQwWzFdKTtcblx0ICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIngyXCIsIHBvaW50MVswXSk7XG5cdCAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5MlwiLCBwb2ludDFbMV0pO1xuXHQgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIFwicmFkaWFsXCI6XG5cdCAgICAgICAgICAgICAgY29uc3QgZm9jYWxQb2ludCA9IGFyZ3NbNF07XG5cdCAgICAgICAgICAgICAgY29uc3QgY2lyY2xlUG9pbnQgPSBhcmdzWzVdO1xuXHQgICAgICAgICAgICAgIGNvbnN0IGZvY2FsUmFkaXVzID0gYXJnc1s2XTtcblx0ICAgICAgICAgICAgICBjb25zdCBjaXJjbGVSYWRpdXMgPSBhcmdzWzddO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmFkaWFsR3JhZGllbnRcIik7XG5cdCAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBzaGFkaW5nSWQpO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZ3JhZGllbnRVbml0c1wiLCBcInVzZXJTcGFjZU9uVXNlXCIpO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3hcIiwgY2lyY2xlUG9pbnRbMF0pO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY3lcIiwgY2lyY2xlUG9pbnRbMV0pO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiclwiLCBjaXJjbGVSYWRpdXMpO1xuXHQgICAgICAgICAgICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZnhcIiwgZm9jYWxQb2ludFswXSk7XG5cdCAgICAgICAgICAgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmeVwiLCBmb2NhbFBvaW50WzFdKTtcblx0ICAgICAgICAgICAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZyXCIsIGZvY2FsUmFkaXVzKTtcblx0ICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUmFkaWFsQXhpYWwgdHlwZTogJHthcmdzWzFdfWApO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgZm9yIChjb25zdCBjb2xvclN0b3Agb2YgY29sb3JTdG9wcykge1xuXHQgICAgICAgICAgICBjb25zdCBzdG9wID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6c3RvcFwiKTtcblx0ICAgICAgICAgICAgc3RvcC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIm9mZnNldFwiLCBjb2xvclN0b3BbMF0pO1xuXHQgICAgICAgICAgICBzdG9wLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3RvcC1jb2xvclwiLCBjb2xvclN0b3BbMV0pO1xuXHQgICAgICAgICAgICBncmFkaWVudC5hcHBlbmQoc3RvcCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLmRlZnMuYXBwZW5kKGdyYWRpZW50KTtcblx0ICAgICAgICAgIHJldHVybiBgdXJsKCMke3NoYWRpbmdJZH0pYDtcblx0ICAgICAgICBjYXNlIFwiTWVzaFwiOlxuXHQgICAgICAgICAgKDAsIF91dGlsLndhcm4pKFwiVW5pbXBsZW1lbnRlZCBwYXR0ZXJuIE1lc2hcIik7XG5cdCAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICBjYXNlIFwiRHVtbXlcIjpcblx0ICAgICAgICAgIHJldHVybiBcImhvdHBpbmtcIjtcblx0ICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIElSIHR5cGU6ICR7YXJnc1swXX1gKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgc2V0RGFzaChkYXNoQXJyYXksIGRhc2hQaGFzZSkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQuZGFzaEFycmF5ID0gZGFzaEFycmF5O1xuXHQgICAgICB0aGlzLmN1cnJlbnQuZGFzaFBoYXNlID0gZGFzaFBoYXNlO1xuXHQgICAgfVxuXHQgICAgY29uc3RydWN0UGF0aChvcHMsIGFyZ3MpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgbGV0IHggPSBjdXJyZW50LngsXG5cdCAgICAgICAgeSA9IGN1cnJlbnQueTtcblx0ICAgICAgbGV0IGQgPSBbXTtcblx0ICAgICAgbGV0IGogPSAwO1xuXHQgICAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuXHQgICAgICAgIHN3aXRjaCAob3AgfCAwKSB7XG5cdCAgICAgICAgICBjYXNlIF91dGlsLk9QUy5yZWN0YW5nbGU6XG5cdCAgICAgICAgICAgIHggPSBhcmdzW2orK107XG5cdCAgICAgICAgICAgIHkgPSBhcmdzW2orK107XG5cdCAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gYXJnc1tqKytdO1xuXHQgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBhcmdzW2orK107XG5cdCAgICAgICAgICAgIGNvbnN0IHh3ID0geCArIHdpZHRoO1xuXHQgICAgICAgICAgICBjb25zdCB5aCA9IHkgKyBoZWlnaHQ7XG5cdCAgICAgICAgICAgIGQucHVzaChcIk1cIiwgcGYoeCksIHBmKHkpLCBcIkxcIiwgcGYoeHcpLCBwZih5KSwgXCJMXCIsIHBmKHh3KSwgcGYoeWgpLCBcIkxcIiwgcGYoeCksIHBmKHloKSwgXCJaXCIpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLm1vdmVUbzpcblx0ICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgICAgeSA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgICAgZC5wdXNoKFwiTVwiLCBwZih4KSwgcGYoeSkpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmxpbmVUbzpcblx0ICAgICAgICAgICAgeCA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgICAgeSA9IGFyZ3NbaisrXTtcblx0ICAgICAgICAgICAgZC5wdXNoKFwiTFwiLCBwZih4KSwgcGYoeSkpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmN1cnZlVG86XG5cdCAgICAgICAgICAgIHggPSBhcmdzW2ogKyA0XTtcblx0ICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDVdO1xuXHQgICAgICAgICAgICBkLnB1c2goXCJDXCIsIHBmKGFyZ3Nbal0pLCBwZihhcmdzW2ogKyAxXSksIHBmKGFyZ3NbaiArIDJdKSwgcGYoYXJnc1tqICsgM10pLCBwZih4KSwgcGYoeSkpO1xuXHQgICAgICAgICAgICBqICs9IDY7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzI6XG5cdCAgICAgICAgICAgIGQucHVzaChcIkNcIiwgcGYoeCksIHBmKHkpLCBwZihhcmdzW2pdKSwgcGYoYXJnc1tqICsgMV0pLCBwZihhcmdzW2ogKyAyXSksIHBmKGFyZ3NbaiArIDNdKSk7XG5cdCAgICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcblx0ICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuXHQgICAgICAgICAgICBqICs9IDQ7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBfdXRpbC5PUFMuY3VydmVUbzM6XG5cdCAgICAgICAgICAgIHggPSBhcmdzW2ogKyAyXTtcblx0ICAgICAgICAgICAgeSA9IGFyZ3NbaiArIDNdO1xuXHQgICAgICAgICAgICBkLnB1c2goXCJDXCIsIHBmKGFyZ3Nbal0pLCBwZihhcmdzW2ogKyAxXSksIHBmKHgpLCBwZih5KSwgcGYoeCksIHBmKHkpKTtcblx0ICAgICAgICAgICAgaiArPSA0O1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgX3V0aWwuT1BTLmNsb3NlUGF0aDpcblx0ICAgICAgICAgICAgZC5wdXNoKFwiWlwiKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIGQgPSBkLmpvaW4oXCIgXCIpO1xuXHQgICAgICBpZiAoY3VycmVudC5wYXRoICYmIG9wcy5sZW5ndGggPiAwICYmIG9wc1swXSAhPT0gX3V0aWwuT1BTLnJlY3RhbmdsZSAmJiBvcHNbMF0gIT09IF91dGlsLk9QUy5tb3ZlVG8pIHtcblx0ICAgICAgICBkID0gY3VycmVudC5wYXRoLmdldEF0dHJpYnV0ZU5TKG51bGwsIFwiZFwiKSArIGQ7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgY3VycmVudC5wYXRoID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cGF0aFwiKTtcblx0ICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChjdXJyZW50LnBhdGgpO1xuXHQgICAgICB9XG5cdCAgICAgIGN1cnJlbnQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgZCk7XG5cdCAgICAgIGN1cnJlbnQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCJub25lXCIpO1xuXHQgICAgICBjdXJyZW50LmVsZW1lbnQgPSBjdXJyZW50LnBhdGg7XG5cdCAgICAgIGN1cnJlbnQuc2V0Q3VycmVudFBvaW50KHgsIHkpO1xuXHQgICAgfVxuXHQgICAgZW5kUGF0aCgpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgY3VycmVudC5wYXRoID0gbnVsbDtcblx0ICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDbGlwKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghY3VycmVudC5lbGVtZW50KSB7XG5cdCAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IGNsaXBJZCA9IGBjbGlwcGF0aCR7Y2xpcENvdW50Kyt9YDtcblx0ICAgICAgY29uc3QgY2xpcFBhdGggPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpjbGlwUGF0aFwiKTtcblx0ICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBjbGlwSWQpO1xuXHQgICAgICBjbGlwUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInRyYW5zZm9ybVwiLCBwbSh0aGlzLnRyYW5zZm9ybU1hdHJpeCkpO1xuXHQgICAgICBjb25zdCBjbGlwRWxlbWVudCA9IGN1cnJlbnQuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG5cdCAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwID09PSBcImV2ZW5vZGRcIikge1xuXHQgICAgICAgIGNsaXBFbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY2xpcC1ydWxlXCIsIFwiZXZlbm9kZFwiKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBjbGlwRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsaXAtcnVsZVwiLCBcIm5vbnplcm9cIik7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IG51bGw7XG5cdCAgICAgIGNsaXBQYXRoLmFwcGVuZChjbGlwRWxlbWVudCk7XG5cdCAgICAgIHRoaXMuZGVmcy5hcHBlbmQoY2xpcFBhdGgpO1xuXHQgICAgICBpZiAoY3VycmVudC5hY3RpdmVDbGlwVXJsKSB7XG5cdCAgICAgICAgY3VycmVudC5jbGlwR3JvdXAgPSBudWxsO1xuXHQgICAgICAgIGZvciAoY29uc3QgcHJldiBvZiB0aGlzLmV4dHJhU3RhY2spIHtcblx0ICAgICAgICAgIHByZXYuY2xpcEdyb3VwID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY2xpcFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXBhdGhcIiwgY3VycmVudC5hY3RpdmVDbGlwVXJsKTtcblx0ICAgICAgfVxuXHQgICAgICBjdXJyZW50LmFjdGl2ZUNsaXBVcmwgPSBgdXJsKCMke2NsaXBJZH0pYDtcblx0ICAgICAgdGhpcy50Z3JwID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIGNsaXAodHlwZSkge1xuXHQgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gdHlwZTtcblx0ICAgIH1cblx0ICAgIGNsb3NlUGF0aCgpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgaWYgKGN1cnJlbnQucGF0aCkge1xuXHQgICAgICAgIGNvbnN0IGQgPSBgJHtjdXJyZW50LnBhdGguZ2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIpfVpgO1xuXHQgICAgICAgIGN1cnJlbnQucGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgZCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHNldExlYWRpbmcobGVhZGluZykge1xuXHQgICAgICB0aGlzLmN1cnJlbnQubGVhZGluZyA9IC1sZWFkaW5nO1xuXHQgICAgfVxuXHQgICAgc2V0VGV4dFJpc2UodGV4dFJpc2UpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50LnRleHRSaXNlID0gdGV4dFJpc2U7XG5cdCAgICB9XG5cdCAgICBzZXRUZXh0UmVuZGVyaW5nTW9kZSh0ZXh0UmVuZGVyaW5nTW9kZSkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQudGV4dFJlbmRlcmluZ01vZGUgPSB0ZXh0UmVuZGVyaW5nTW9kZTtcblx0ICAgIH1cblx0ICAgIHNldEhTY2FsZShzY2FsZSkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQudGV4dEhTY2FsZSA9IHNjYWxlIC8gMTAwO1xuXHQgICAgfVxuXHQgICAgc2V0UmVuZGVyaW5nSW50ZW50KGludGVudCkge31cblx0ICAgIHNldEZsYXRuZXNzKGZsYXRuZXNzKSB7fVxuXHQgICAgc2V0R1N0YXRlKHN0YXRlcykge1xuXHQgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzdGF0ZXMpIHtcblx0ICAgICAgICBzd2l0Y2ggKGtleSkge1xuXHQgICAgICAgICAgY2FzZSBcIkxXXCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0TGluZVdpZHRoKHZhbHVlKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIFwiTENcIjpcblx0ICAgICAgICAgICAgdGhpcy5zZXRMaW5lQ2FwKHZhbHVlKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIFwiTEpcIjpcblx0ICAgICAgICAgICAgdGhpcy5zZXRMaW5lSm9pbih2YWx1ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcIk1MXCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0TWl0ZXJMaW1pdCh2YWx1ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcIkRcIjpcblx0ICAgICAgICAgICAgdGhpcy5zZXREYXNoKHZhbHVlWzBdLCB2YWx1ZVsxXSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcIlJJXCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0UmVuZGVyaW5nSW50ZW50KHZhbHVlKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIFwiRkxcIjpcblx0ICAgICAgICAgICAgdGhpcy5zZXRGbGF0bmVzcyh2YWx1ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcIkZvbnRcIjpcblx0ICAgICAgICAgICAgdGhpcy5zZXRGb250KHZhbHVlKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIFwiQ0FcIjpcblx0ICAgICAgICAgICAgdGhpcy5zZXRTdHJva2VBbHBoYSh2YWx1ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcImNhXCI6XG5cdCAgICAgICAgICAgIHRoaXMuc2V0RmlsbEFscGhhKHZhbHVlKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAoMCwgX3V0aWwud2FybikoYFVuaW1wbGVtZW50ZWQgZ3JhcGhpYyBzdGF0ZSBvcGVyYXRvciAke2tleX1gKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBmaWxsKCkge1xuXHQgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICBpZiAoY3VycmVudC5lbGVtZW50KSB7XG5cdCAgICAgICAgY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbFwiLCBjdXJyZW50LmZpbGxDb2xvcik7XG5cdCAgICAgICAgY3VycmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZmlsbC1vcGFjaXR5XCIsIGN1cnJlbnQuZmlsbEFscGhhKTtcblx0ICAgICAgICB0aGlzLmVuZFBhdGgoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgc3Ryb2tlKCkge1xuXHQgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jdXJyZW50O1xuXHQgICAgICBpZiAoY3VycmVudC5lbGVtZW50KSB7XG5cdCAgICAgICAgdGhpcy5fc2V0U3Ryb2tlQXR0cmlidXRlcyhjdXJyZW50LmVsZW1lbnQpO1xuXHQgICAgICAgIGN1cnJlbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgXCJub25lXCIpO1xuXHQgICAgICAgIHRoaXMuZW5kUGF0aCgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBfc2V0U3Ryb2tlQXR0cmlidXRlcyhlbGVtZW50LCBsaW5lV2lkdGhTY2FsZSA9IDEpIHtcblx0ICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudDtcblx0ICAgICAgbGV0IGRhc2hBcnJheSA9IGN1cnJlbnQuZGFzaEFycmF5O1xuXHQgICAgICBpZiAobGluZVdpZHRoU2NhbGUgIT09IDEgJiYgZGFzaEFycmF5Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICBkYXNoQXJyYXkgPSBkYXNoQXJyYXkubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgcmV0dXJuIGxpbmVXaWR0aFNjYWxlICogdmFsdWU7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZVwiLCBjdXJyZW50LnN0cm9rZUNvbG9yKTtcblx0ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1vcGFjaXR5XCIsIGN1cnJlbnQuc3Ryb2tlQWxwaGEpO1xuXHQgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLW1pdGVybGltaXRcIiwgcGYoY3VycmVudC5taXRlckxpbWl0KSk7XG5cdCAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHJva2UtbGluZWNhcFwiLCBjdXJyZW50LmxpbmVDYXApO1xuXHQgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLWxpbmVqb2luXCIsIGN1cnJlbnQubGluZUpvaW4pO1xuXHQgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLXdpZHRoXCIsIHBmKGxpbmVXaWR0aFNjYWxlICogY3VycmVudC5saW5lV2lkdGgpICsgXCJweFwiKTtcblx0ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInN0cm9rZS1kYXNoYXJyYXlcIiwgZGFzaEFycmF5Lm1hcChwZikuam9pbihcIiBcIikpO1xuXHQgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3Ryb2tlLWRhc2hvZmZzZXRcIiwgcGYobGluZVdpZHRoU2NhbGUgKiBjdXJyZW50LmRhc2hQaGFzZSkgKyBcInB4XCIpO1xuXHQgICAgfVxuXHQgICAgZW9GaWxsKCkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudD8uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuXHQgICAgICB0aGlzLmZpbGwoKTtcblx0ICAgIH1cblx0ICAgIGZpbGxTdHJva2UoKSB7XG5cdCAgICAgIHRoaXMuc3Ryb2tlKCk7XG5cdCAgICAgIHRoaXMuZmlsbCgpO1xuXHQgICAgfVxuXHQgICAgZW9GaWxsU3Ryb2tlKCkge1xuXHQgICAgICB0aGlzLmN1cnJlbnQuZWxlbWVudD8uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJmaWxsLXJ1bGVcIiwgXCJldmVub2RkXCIpO1xuXHQgICAgICB0aGlzLmZpbGxTdHJva2UoKTtcblx0ICAgIH1cblx0ICAgIGNsb3NlU3Ryb2tlKCkge1xuXHQgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuXHQgICAgICB0aGlzLnN0cm9rZSgpO1xuXHQgICAgfVxuXHQgICAgY2xvc2VGaWxsU3Ryb2tlKCkge1xuXHQgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuXHQgICAgICB0aGlzLmZpbGxTdHJva2UoKTtcblx0ICAgIH1cblx0ICAgIGNsb3NlRU9GaWxsU3Ryb2tlKCkge1xuXHQgICAgICB0aGlzLmNsb3NlUGF0aCgpO1xuXHQgICAgICB0aGlzLmVvRmlsbFN0cm9rZSgpO1xuXHQgICAgfVxuXHQgICAgcGFpbnRTb2xpZENvbG9ySW1hZ2VNYXNrKCkge1xuXHQgICAgICBjb25zdCByZWN0ID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6cmVjdFwiKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIwXCIpO1xuXHQgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjBcIik7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBcIjFweFwiKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBcIjFweFwiKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgdGhpcy5jdXJyZW50LmZpbGxDb2xvcik7XG5cdCAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKHJlY3QpO1xuXHQgICAgfVxuXHQgICAgcGFpbnRJbWFnZVhPYmplY3Qob2JqSWQpIHtcblx0ICAgICAgY29uc3QgaW1nRGF0YSA9IHRoaXMuZ2V0T2JqZWN0KG9iaklkKTtcblx0ICAgICAgaWYgKCFpbWdEYXRhKSB7XG5cdCAgICAgICAgKDAsIF91dGlsLndhcm4pKGBEZXBlbmRlbnQgaW1hZ2Ugd2l0aCBvYmplY3QgSUQgJHtvYmpJZH0gaXMgbm90IHJlYWR5IHlldGApO1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEpO1xuXHQgICAgfVxuXHQgICAgcGFpbnRJbmxpbmVJbWFnZVhPYmplY3QoaW1nRGF0YSwgbWFzaykge1xuXHQgICAgICBjb25zdCB3aWR0aCA9IGltZ0RhdGEud2lkdGg7XG5cdCAgICAgIGNvbnN0IGhlaWdodCA9IGltZ0RhdGEuaGVpZ2h0O1xuXHQgICAgICBjb25zdCBpbWdTcmMgPSBjb252ZXJ0SW1nRGF0YVRvUG5nKGltZ0RhdGEsIHRoaXMuZm9yY2VEYXRhU2NoZW1hLCAhIW1hc2spO1xuXHQgICAgICBjb25zdCBjbGlwcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG5cdCAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjBcIik7XG5cdCAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjBcIik7XG5cdCAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYod2lkdGgpKTtcblx0ICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgcGYoaGVpZ2h0KSk7XG5cdCAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50ID0gY2xpcHJlY3Q7XG5cdCAgICAgIHRoaXMuY2xpcChcIm5vbnplcm9cIik7XG5cdCAgICAgIGNvbnN0IGltZ0VsID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6aW1hZ2VcIik7XG5cdCAgICAgIGltZ0VsLnNldEF0dHJpYnV0ZU5TKFhMSU5LX05TLCBcInhsaW5rOmhyZWZcIiwgaW1nU3JjKTtcblx0ICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcblx0ICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIHBmKC1oZWlnaHQpKTtcblx0ICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBwZih3aWR0aCkgKyBcInB4XCIpO1xuXHQgICAgICBpbWdFbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihoZWlnaHQpICsgXCJweFwiKTtcblx0ICAgICAgaW1nRWwuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0cmFuc2Zvcm1cIiwgYHNjYWxlKCR7cGYoMSAvIHdpZHRoKX0gJHtwZigtMSAvIGhlaWdodCl9KWApO1xuXHQgICAgICBpZiAobWFzaykge1xuXHQgICAgICAgIG1hc2suYXBwZW5kKGltZ0VsKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLl9lbnN1cmVUcmFuc2Zvcm1Hcm91cCgpLmFwcGVuZChpbWdFbCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHBhaW50SW1hZ2VNYXNrWE9iamVjdChpbWcpIHtcblx0ICAgICAgY29uc3QgaW1nRGF0YSA9IHRoaXMuZ2V0T2JqZWN0KGltZy5kYXRhLCBpbWcpO1xuXHQgICAgICBpZiAoaW1nRGF0YS5iaXRtYXApIHtcblx0ICAgICAgICAoMCwgX3V0aWwud2FybikoXCJwYWludEltYWdlTWFza1hPYmplY3Q6IEltYWdlQml0bWFwIHN1cHBvcnQgaXMgbm90IGltcGxlbWVudGVkLCBcIiArIFwiZW5zdXJlIHRoYXQgdGhlIGBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZGAgQVBJIHBhcmFtZXRlciBpcyBkaXNhYmxlZC5cIik7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG5cdCAgICAgIGNvbnN0IHdpZHRoID0gaW1nRGF0YS53aWR0aDtcblx0ICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nRGF0YS5oZWlnaHQ7XG5cdCAgICAgIGNvbnN0IGZpbGxDb2xvciA9IGN1cnJlbnQuZmlsbENvbG9yO1xuXHQgICAgICBjdXJyZW50Lm1hc2tJZCA9IGBtYXNrJHttYXNrQ291bnQrK31gO1xuXHQgICAgICBjb25zdCBtYXNrID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6bWFza1wiKTtcblx0ICAgICAgbWFzay5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIGN1cnJlbnQubWFza0lkKTtcblx0ICAgICAgY29uc3QgcmVjdCA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOnJlY3RcIik7XG5cdCAgICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMFwiKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIwXCIpO1xuXHQgICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgcGYod2lkdGgpKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCBwZihoZWlnaHQpKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImZpbGxcIiwgZmlsbENvbG9yKTtcblx0ICAgICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIm1hc2tcIiwgYHVybCgjJHtjdXJyZW50Lm1hc2tJZH0pYCk7XG5cdCAgICAgIHRoaXMuZGVmcy5hcHBlbmQobWFzayk7XG5cdCAgICAgIHRoaXMuX2Vuc3VyZVRyYW5zZm9ybUdyb3VwKCkuYXBwZW5kKHJlY3QpO1xuXHQgICAgICB0aGlzLnBhaW50SW5saW5lSW1hZ2VYT2JqZWN0KGltZ0RhdGEsIG1hc2spO1xuXHQgICAgfVxuXHQgICAgcGFpbnRGb3JtWE9iamVjdEJlZ2luKG1hdHJpeCwgYmJveCkge1xuXHQgICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXRyaXgpICYmIG1hdHJpeC5sZW5ndGggPT09IDYpIHtcblx0ICAgICAgICB0aGlzLnRyYW5zZm9ybShtYXRyaXhbMF0sIG1hdHJpeFsxXSwgbWF0cml4WzJdLCBtYXRyaXhbM10sIG1hdHJpeFs0XSwgbWF0cml4WzVdKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoYmJveCkge1xuXHQgICAgICAgIGNvbnN0IHdpZHRoID0gYmJveFsyXSAtIGJib3hbMF07XG5cdCAgICAgICAgY29uc3QgaGVpZ2h0ID0gYmJveFszXSAtIGJib3hbMV07XG5cdCAgICAgICAgY29uc3QgY2xpcHJlY3QgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlRWxlbWVudChcInN2ZzpyZWN0XCIpO1xuXHQgICAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBiYm94WzBdKTtcblx0ICAgICAgICBjbGlwcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgYmJveFsxXSk7XG5cdCAgICAgICAgY2xpcHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBwZih3aWR0aCkpO1xuXHQgICAgICAgIGNsaXByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIHBmKGhlaWdodCkpO1xuXHQgICAgICAgIHRoaXMuY3VycmVudC5lbGVtZW50ID0gY2xpcHJlY3Q7XG5cdCAgICAgICAgdGhpcy5jbGlwKFwibm9uemVyb1wiKTtcblx0ICAgICAgICB0aGlzLmVuZFBhdGgoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgICAgcGFpbnRGb3JtWE9iamVjdEVuZCgpIHt9XG5cdCAgICBfaW5pdGlhbGl6ZSh2aWV3cG9ydCkge1xuXHQgICAgICBjb25zdCBzdmcgPSB0aGlzLnN2Z0ZhY3RvcnkuY3JlYXRlKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpO1xuXHQgICAgICBjb25zdCBkZWZpbml0aW9ucyA9IHRoaXMuc3ZnRmFjdG9yeS5jcmVhdGVFbGVtZW50KFwic3ZnOmRlZnNcIik7XG5cdCAgICAgIHN2Zy5hcHBlbmQoZGVmaW5pdGlvbnMpO1xuXHQgICAgICB0aGlzLmRlZnMgPSBkZWZpbml0aW9ucztcblx0ICAgICAgY29uc3Qgcm9vdEdyb3VwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcblx0ICAgICAgcm9vdEdyb3VwLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidHJhbnNmb3JtXCIsIHBtKHZpZXdwb3J0LnRyYW5zZm9ybSkpO1xuXHQgICAgICBzdmcuYXBwZW5kKHJvb3RHcm91cCk7XG5cdCAgICAgIHRoaXMuc3ZnID0gcm9vdEdyb3VwO1xuXHQgICAgICByZXR1cm4gc3ZnO1xuXHQgICAgfVxuXHQgICAgX2Vuc3VyZUNsaXBHcm91cCgpIHtcblx0ICAgICAgaWYgKCF0aGlzLmN1cnJlbnQuY2xpcEdyb3VwKSB7XG5cdCAgICAgICAgY29uc3QgY2xpcEdyb3VwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcblx0ICAgICAgICBjbGlwR3JvdXAuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGlwLXBhdGhcIiwgdGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpO1xuXHQgICAgICAgIHRoaXMuc3ZnLmFwcGVuZChjbGlwR3JvdXApO1xuXHQgICAgICAgIHRoaXMuY3VycmVudC5jbGlwR3JvdXAgPSBjbGlwR3JvdXA7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC5jbGlwR3JvdXA7XG5cdCAgICB9XG5cdCAgICBfZW5zdXJlVHJhbnNmb3JtR3JvdXAoKSB7XG5cdCAgICAgIGlmICghdGhpcy50Z3JwKSB7XG5cdCAgICAgICAgdGhpcy50Z3JwID0gdGhpcy5zdmdGYWN0b3J5LmNyZWF0ZUVsZW1lbnQoXCJzdmc6Z1wiKTtcblx0ICAgICAgICB0aGlzLnRncnAuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ0cmFuc2Zvcm1cIiwgcG0odGhpcy50cmFuc2Zvcm1NYXRyaXgpKTtcblx0ICAgICAgICBpZiAodGhpcy5jdXJyZW50LmFjdGl2ZUNsaXBVcmwpIHtcblx0ICAgICAgICAgIHRoaXMuX2Vuc3VyZUNsaXBHcm91cCgpLmFwcGVuZCh0aGlzLnRncnApO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnN2Zy5hcHBlbmQodGhpcy50Z3JwKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHRoaXMudGdycDtcblx0ICAgIH1cblx0ICB9O1xuXHR9XG5cblx0LyoqKi8gfSlcblx0LyoqKioqKi8gXHRdKTtcblx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblx0LyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG5cdC8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXHQvKioqKioqLyBcdFxuXHQvKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5cdC8qKioqKiovIFx0ZnVuY3Rpb24gX193X3BkZmpzX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdC8qKioqKiovIFx0XHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0LyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHQvKioqKioqLyBcdFx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdC8qKioqKiovIFx0XHR9XG5cdC8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHQvKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdC8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0LyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0LyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cblx0LyoqKioqKi8gXHRcdH07XG5cdC8qKioqKiovIFx0XG5cdC8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0LyoqKioqKi8gXHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pO1xuXHQvKioqKioqLyBcdFxuXHQvKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0LyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcblx0LyoqKioqKi8gXHR9XG5cdC8qKioqKiovIFx0XG5cdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0ge307XG5cdC8vIFRoaXMgZW50cnkgbmVlZCB0byBiZSB3cmFwcGVkIGluIGFuIElJRkUgYmVjYXVzZSBpdCBuZWVkIHRvIGJlIGlzb2xhdGVkIGFnYWluc3Qgb3RoZXIgbW9kdWxlcyBpbiB0aGUgY2h1bmsuXG5cdCgoKSA9PiB7XG5cdHZhciBleHBvcnRzID0gX193ZWJwYWNrX2V4cG9ydHNfXztcblxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgKHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFib3J0RXhjZXB0aW9uXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5BYm9ydEV4Y2VwdGlvbjtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQW5ub3RhdGlvbkVkaXRvckxheWVyXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfYW5ub3RhdGlvbl9lZGl0b3JfbGF5ZXIuQW5ub3RhdGlvbkVkaXRvckxheWVyO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBbm5vdGF0aW9uRWRpdG9yUGFyYW1zVHlwZVwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuQW5ub3RhdGlvbkVkaXRvclBhcmFtc1R5cGU7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFubm90YXRpb25FZGl0b3JUeXBlXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5Bbm5vdGF0aW9uRWRpdG9yVHlwZTtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQW5ub3RhdGlvbkVkaXRvclVJTWFuYWdlclwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3Rvb2xzLkFubm90YXRpb25FZGl0b3JVSU1hbmFnZXI7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFubm90YXRpb25MYXllclwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2Fubm90YXRpb25fbGF5ZXIuQW5ub3RhdGlvbkxheWVyO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBbm5vdGF0aW9uTW9kZVwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuQW5ub3RhdGlvbk1vZGU7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNNYXBDb21wcmVzc2lvblR5cGVcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLkNNYXBDb21wcmVzc2lvblR5cGU7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkZlYXR1cmVUZXN0XCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5GZWF0dXJlVGVzdDtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiR2xvYmFsV29ya2VyT3B0aW9uc1wiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3dvcmtlcl9vcHRpb25zLkdsb2JhbFdvcmtlck9wdGlvbnM7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkludmFsaWRQREZFeGNlcHRpb25cIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLkludmFsaWRQREZFeGNlcHRpb247XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk1pc3NpbmdQREZFeGNlcHRpb25cIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLk1pc3NpbmdQREZFeGNlcHRpb247XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk9QU1wiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuT1BTO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQREZEYXRhUmFuZ2VUcmFuc3BvcnRcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9hcGkuUERGRGF0YVJhbmdlVHJhbnNwb3J0O1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQREZEYXRlU3RyaW5nXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfZGlzcGxheV91dGlscy5QREZEYXRlU3RyaW5nO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQREZXb3JrZXJcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9hcGkuUERGV29ya2VyO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQYXNzd29yZFJlc3BvbnNlc1wiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuUGFzc3dvcmRSZXNwb25zZXM7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBlcm1pc3Npb25GbGFnXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5QZXJtaXNzaW9uRmxhZztcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUGl4ZWxzUGVySW5jaFwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuUGl4ZWxzUGVySW5jaDtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvbWlzZUNhcGFiaWxpdHlcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLlByb21pc2VDYXBhYmlsaXR5O1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb25cIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbjtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU1ZHR3JhcGhpY3NcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9zdmcuU1ZHR3JhcGhpY3M7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlVuZXhwZWN0ZWRSZXNwb25zZUV4Y2VwdGlvblwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuVW5leHBlY3RlZFJlc3BvbnNlRXhjZXB0aW9uO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJVdGlsXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdXRpbC5VdGlsO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJWZXJib3NpdHlMZXZlbFwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuVmVyYm9zaXR5TGV2ZWw7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlhmYUxheWVyXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfeGZhX2xheWVyLlhmYUxheWVyO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJidWlsZFwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2FwaS5idWlsZDtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlVmFsaWRBYnNvbHV0ZVVybFwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybDtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0RG9jdW1lbnRcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9hcGkuZ2V0RG9jdW1lbnQ7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldEZpbGVuYW1lRnJvbVVybFwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuZ2V0RmlsZW5hbWVGcm9tVXJsO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZXRQZGZGaWxlbmFtZUZyb21VcmxcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLmdldFBkZkZpbGVuYW1lRnJvbVVybDtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0WGZhUGFnZVZpZXdwb3J0XCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfZGlzcGxheV91dGlscy5nZXRYZmFQYWdlVmlld3BvcnQ7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlzRGF0YVNjaGVtZVwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuaXNEYXRhU2NoZW1lO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc1BkZkZpbGVcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9kaXNwbGF5X3V0aWxzLmlzUGRmRmlsZTtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibG9hZFNjcmlwdFwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMubG9hZFNjcmlwdDtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibm9ybWFsaXplVW5pY29kZVwiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX3V0aWwubm9ybWFsaXplVW5pY29kZTtcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmVuZGVyVGV4dExheWVyXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdGV4dF9sYXllci5yZW5kZXJUZXh0TGF5ZXI7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInNldExheWVyRGltZW5zaW9uc1wiLCAoe1xuXHQgIGVudW1lcmFibGU6IHRydWUsXG5cdCAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4gX2Rpc3BsYXlfdXRpbHMuc2V0TGF5ZXJEaW1lbnNpb25zO1xuXHQgIH1cblx0fSkpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzaGFkb3dcIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF91dGlsLnNoYWRvdztcblx0ICB9XG5cdH0pKTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidXBkYXRlVGV4dExheWVyXCIsICh7XG5cdCAgZW51bWVyYWJsZTogdHJ1ZSxcblx0ICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgIHJldHVybiBfdGV4dF9sYXllci51cGRhdGVUZXh0TGF5ZXI7XG5cdCAgfVxuXHR9KSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInZlcnNpb25cIiwgKHtcblx0ICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgcmV0dXJuIF9hcGkudmVyc2lvbjtcblx0ICB9XG5cdH0pKTtcblx0dmFyIF91dGlsID0gX193X3BkZmpzX3JlcXVpcmVfXygxKTtcblx0dmFyIF9hcGkgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpO1xuXHR2YXIgX2Rpc3BsYXlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDYpO1xuXHR2YXIgX3RleHRfbGF5ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDI2KTtcblx0dmFyIF9hbm5vdGF0aW9uX2VkaXRvcl9sYXllciA9IF9fd19wZGZqc19yZXF1aXJlX18oMjcpO1xuXHR2YXIgX3Rvb2xzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTtcblx0dmFyIF9hbm5vdGF0aW9uX2xheWVyID0gX193X3BkZmpzX3JlcXVpcmVfXygzMik7XG5cdHZhciBfd29ya2VyX29wdGlvbnMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE0KTtcblx0dmFyIF9zdmcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM1KTtcblx0dmFyIF94ZmFfbGF5ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDM0KTtcblx0fSkoKTtcblxuXHQvKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xuXHQvKioqKioqLyB9KSgpXG5cdDtcblx0fSk7XG5cdFxufSAocGRmJDIpKTtcblxudmFyIHBkZkV4cG9ydHMgPSBwZGYkMi5leHBvcnRzO1xuXG5jb25zdCBwZGYgPSBwZGZFeHBvcnRzO1xudmFyIHBkZl8xID0gcGRmO1xuXG52YXIgcGRmJDEgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMocGRmXzEpO1xuXG5leHBvcnQgeyBwZGYkMSBhcyBkZWZhdWx0IH07XG4iLCAiZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC40Mi4wJzsgLy8geC1yZWxlYXNlLXBsZWFzZS12ZXJzaW9uXG4iLCAiLyoqXG4gKiBEaXNjbGFpbWVyOiBtb2R1bGVzIGluIF9zaGltcyBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgaW1wb3J0ZWQgYnkgU0RLIHVzZXJzLlxuICovXG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hpbXMge1xuICBraW5kOiBzdHJpbmc7XG4gIGZldGNoOiBhbnk7XG4gIFJlcXVlc3Q6IGFueTtcbiAgUmVzcG9uc2U6IGFueTtcbiAgSGVhZGVyczogYW55O1xuICBGb3JtRGF0YTogYW55O1xuICBCbG9iOiBhbnk7XG4gIEZpbGU6IGFueTtcbiAgUmVhZGFibGVTdHJlYW06IGFueTtcbiAgZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnM6IDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIGZvcm06IFNoaW1zWydGb3JtRGF0YSddLFxuICAgIG9wdHM6IFJlcXVlc3RPcHRpb25zPFQ+LFxuICApID0+IFByb21pc2U8UmVxdWVzdE9wdGlvbnM8VD4+O1xuICBnZXREZWZhdWx0QWdlbnQ6ICh1cmw6IHN0cmluZykgPT4gYW55O1xuICBmaWxlRnJvbVBhdGg6XG4gICAgfCAoKHBhdGg6IHN0cmluZywgZmlsZW5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiB7fSkgPT4gUHJvbWlzZTxTaGltc1snRmlsZSddPilcbiAgICB8ICgocGF0aDogc3RyaW5nLCBvcHRpb25zPzoge30pID0+IFByb21pc2U8U2hpbXNbJ0ZpbGUnXT4pO1xuICBpc0ZzUmVhZFN0cmVhbTogKHZhbHVlOiBhbnkpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBsZXQgYXV0byA9IGZhbHNlO1xuZXhwb3J0IGxldCBraW5kOiBTaGltc1sna2luZCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBmZXRjaDogU2hpbXNbJ2ZldGNoJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IFJlcXVlc3Q6IFNoaW1zWydSZXF1ZXN0J10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IFJlc3BvbnNlOiBTaGltc1snUmVzcG9uc2UnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgSGVhZGVyczogU2hpbXNbJ0hlYWRlcnMnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgRm9ybURhdGE6IFNoaW1zWydGb3JtRGF0YSddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBCbG9iOiBTaGltc1snQmxvYiddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBGaWxlOiBTaGltc1snRmlsZSddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBSZWFkYWJsZVN0cmVhbTogU2hpbXNbJ1JlYWRhYmxlU3RyZWFtJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zOiBTaGltc1snZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgZ2V0RGVmYXVsdEFnZW50OiBTaGltc1snZ2V0RGVmYXVsdEFnZW50J10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IGZpbGVGcm9tUGF0aDogU2hpbXNbJ2ZpbGVGcm9tUGF0aCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBpc0ZzUmVhZFN0cmVhbTogU2hpbXNbJ2lzRnNSZWFkU3RyZWFtJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRTaGltcyhzaGltczogU2hpbXMsIG9wdGlvbnM6IHsgYXV0bzogYm9vbGVhbiB9ID0geyBhdXRvOiBmYWxzZSB9KSB7XG4gIGlmIChhdXRvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHlvdSBtdXN0IFxcYGltcG9ydCAnb3BlbmFpL3NoaW1zLyR7c2hpbXMua2luZH0nXFxgIGJlZm9yZSBpbXBvcnRpbmcgYW55dGhpbmcgZWxzZSBmcm9tIG9wZW5haWAsXG4gICAgKTtcbiAgfVxuICBpZiAoa2luZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3QgXFxgaW1wb3J0ICdvcGVuYWkvc2hpbXMvJHtzaGltcy5raW5kfSdcXGAgYWZ0ZXIgXFxgaW1wb3J0ICdvcGVuYWkvc2hpbXMvJHtraW5kfSdcXGBgKTtcbiAgfVxuICBhdXRvID0gb3B0aW9ucy5hdXRvO1xuICBraW5kID0gc2hpbXMua2luZDtcbiAgZmV0Y2ggPSBzaGltcy5mZXRjaDtcbiAgUmVxdWVzdCA9IHNoaW1zLlJlcXVlc3Q7XG4gIFJlc3BvbnNlID0gc2hpbXMuUmVzcG9uc2U7XG4gIEhlYWRlcnMgPSBzaGltcy5IZWFkZXJzO1xuICBGb3JtRGF0YSA9IHNoaW1zLkZvcm1EYXRhO1xuICBCbG9iID0gc2hpbXMuQmxvYjtcbiAgRmlsZSA9IHNoaW1zLkZpbGU7XG4gIFJlYWRhYmxlU3RyZWFtID0gc2hpbXMuUmVhZGFibGVTdHJlYW07XG4gIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zID0gc2hpbXMuZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnM7XG4gIGdldERlZmF1bHRBZ2VudCA9IHNoaW1zLmdldERlZmF1bHRBZ2VudDtcbiAgZmlsZUZyb21QYXRoID0gc2hpbXMuZmlsZUZyb21QYXRoO1xuICBpc0ZzUmVhZFN0cmVhbSA9IHNoaW1zLmlzRnNSZWFkU3RyZWFtO1xufVxuIiwgIi8qKlxuICogRGlzY2xhaW1lcjogbW9kdWxlcyBpbiBfc2hpbXMgYXJlbid0IGludGVuZGVkIHRvIGJlIGltcG9ydGVkIGJ5IFNESyB1c2Vycy5cbiAqL1xuZXhwb3J0IGNsYXNzIE11bHRpcGFydEJvZHkge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYm9keTogYW55KSB7fVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ011bHRpcGFydEJvZHknO1xuICB9XG59XG4iLCAiLyoqXG4gKiBEaXNjbGFpbWVyOiBtb2R1bGVzIGluIF9zaGltcyBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgaW1wb3J0ZWQgYnkgU0RLIHVzZXJzLlxuICovXG5pbXBvcnQgeyBNdWx0aXBhcnRCb2R5IH0gZnJvbSAnLi9NdWx0aXBhcnRCb2R5JztcbmltcG9ydCB7IHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IHR5cGUgU2hpbXMgfSBmcm9tICcuL3JlZ2lzdHJ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bnRpbWUoeyBtYW51YWxseUltcG9ydGVkIH06IHsgbWFudWFsbHlJbXBvcnRlZD86IGJvb2xlYW4gfSA9IHt9KTogU2hpbXMge1xuICBjb25zdCByZWNvbW1lbmRhdGlvbiA9XG4gICAgbWFudWFsbHlJbXBvcnRlZCA/XG4gICAgICBgWW91IG1heSBuZWVkIHRvIHVzZSBwb2x5ZmlsbHNgXG4gICAgOiBgQWRkIG9uZSBvZiB0aGVzZSBpbXBvcnRzIGJlZm9yZSB5b3VyIGZpcnN0IFxcYGltcG9ydCBcdTIwMjYgZnJvbSAnb3BlbmFpJ1xcYDpcbi0gXFxgaW1wb3J0ICdvcGVuYWkvc2hpbXMvbm9kZSdcXGAgKGlmIHlvdSdyZSBydW5uaW5nIG9uIE5vZGUpXG4tIFxcYGltcG9ydCAnb3BlbmFpL3NoaW1zL3dlYidcXGAgKG90aGVyd2lzZSlcbmA7XG5cbiAgbGV0IF9mZXRjaCwgX1JlcXVlc3QsIF9SZXNwb25zZSwgX0hlYWRlcnM7XG4gIHRyeSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF9mZXRjaCA9IGZldGNoO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBfUmVxdWVzdCA9IFJlcXVlc3Q7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF9SZXNwb25zZSA9IFJlc3BvbnNlO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBfSGVhZGVycyA9IEhlYWRlcnM7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHRoaXMgZW52aXJvbm1lbnQgaXMgbWlzc2luZyB0aGUgZm9sbG93aW5nIFdlYiBGZXRjaCBBUEkgdHlwZTogJHtcbiAgICAgICAgKGVycm9yIGFzIGFueSkubWVzc2FnZVxuICAgICAgfS4gJHtyZWNvbW1lbmRhdGlvbn1gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGtpbmQ6ICd3ZWInLFxuICAgIGZldGNoOiBfZmV0Y2gsXG4gICAgUmVxdWVzdDogX1JlcXVlc3QsXG4gICAgUmVzcG9uc2U6IF9SZXNwb25zZSxcbiAgICBIZWFkZXJzOiBfSGVhZGVycyxcbiAgICBGb3JtRGF0YTpcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgPyBGb3JtRGF0YSA6IChcbiAgICAgICAgY2xhc3MgRm9ybURhdGEge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGZpbGUgdXBsb2FkcyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgeWV0IGFzICdGb3JtRGF0YScgaXMgdW5kZWZpbmVkLiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICBCbG9iOlxuICAgICAgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnID8gQmxvYiA6IChcbiAgICAgICAgY2xhc3MgQmxvYiB7XG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBmaWxlIHVwbG9hZHMgYXJlbid0IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IHlldCBhcyAnQmxvYicgaXMgdW5kZWZpbmVkLiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICBGaWxlOlxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdHlwZW9mIEZpbGUgIT09ICd1bmRlZmluZWQnID8gRmlsZSA6IChcbiAgICAgICAgY2xhc3MgRmlsZSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZmlsZSB1cGxvYWRzIGFyZW4ndCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCB5ZXQgYXMgJ0ZpbGUnIGlzIHVuZGVmaW5lZC4gJHtyZWNvbW1lbmRhdGlvbn1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICksXG4gICAgUmVhZGFibGVTdHJlYW06XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0eXBlb2YgUmVhZGFibGVTdHJlYW0gIT09ICd1bmRlZmluZWQnID8gUmVhZGFibGVTdHJlYW0gOiAoXG4gICAgICAgIGNsYXNzIFJlYWRhYmxlU3RyZWFtIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBzdHJlYW1pbmcgaXNuJ3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgeWV0IGFzICdSZWFkYWJsZVN0cmVhbScgaXMgdW5kZWZpbmVkLiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICBnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9uczogYXN5bmMgPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JtOiBGb3JtRGF0YSxcbiAgICAgIG9wdHM6IFJlcXVlc3RPcHRpb25zPFQ+LFxuICAgICk6IFByb21pc2U8UmVxdWVzdE9wdGlvbnM8VD4+ID0+ICh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgYm9keTogbmV3IE11bHRpcGFydEJvZHkoZm9ybSkgYXMgYW55LFxuICAgIH0pLFxuICAgIGdldERlZmF1bHRBZ2VudDogKHVybDogc3RyaW5nKSA9PiB1bmRlZmluZWQsXG4gICAgZmlsZUZyb21QYXRoOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgYGZpbGVGcm9tUGF0aGAgZnVuY3Rpb24gaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS4gU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlsczogaHR0cHM6Ly93d3cuZ2l0aHViLmNvbS9vcGVuYWkvb3BlbmFpLW5vZGUjZmlsZS11cGxvYWRzJyxcbiAgICAgICk7XG4gICAgfSxcbiAgICBpc0ZzUmVhZFN0cmVhbTogKHZhbHVlOiBhbnkpID0+IGZhbHNlLFxuICB9O1xufVxuIiwgIi8qKlxuICogRGlzY2xhaW1lcjogbW9kdWxlcyBpbiBfc2hpbXMgYXJlbid0IGludGVuZGVkIHRvIGJlIGltcG9ydGVkIGJ5IFNESyB1c2Vycy5cbiAqL1xuaW1wb3J0ICogYXMgc2hpbXMgZnJvbSAnLi9yZWdpc3RyeS5tanMnO1xuaW1wb3J0ICogYXMgYXV0byBmcm9tICdvcGVuYWkvX3NoaW1zL2F1dG8vcnVudGltZSc7XG5pZiAoIXNoaW1zLmtpbmQpIHNoaW1zLnNldFNoaW1zKGF1dG8uZ2V0UnVudGltZSgpLCB7IGF1dG86IHRydWUgfSk7XG5leHBvcnQgKiBmcm9tICcuL3JlZ2lzdHJ5Lm1qcyc7XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0IHsgY2FzdFRvRXJyb3IsIEhlYWRlcnMgfSBmcm9tICcuL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgT3BlbkFJRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG5leHBvcnQgY2xhc3MgQVBJRXJyb3IgZXh0ZW5kcyBPcGVuQUlFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBlcnJvcjogT2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHBhcmFtOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSB0eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgcmVxdWVzdF9pZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBlcnJvcjogT2JqZWN0IHwgdW5kZWZpbmVkLFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBoZWFkZXJzOiBIZWFkZXJzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBzdXBlcihgJHtBUElFcnJvci5tYWtlTWVzc2FnZShzdGF0dXMsIGVycm9yLCBtZXNzYWdlKX1gKTtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIHRoaXMucmVxdWVzdF9pZCA9IGhlYWRlcnM/LlsneC1yZXF1ZXN0LWlkJ107XG5cbiAgICBjb25zdCBkYXRhID0gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB0aGlzLmVycm9yID0gZGF0YTtcbiAgICB0aGlzLmNvZGUgPSBkYXRhPy5bJ2NvZGUnXTtcbiAgICB0aGlzLnBhcmFtID0gZGF0YT8uWydwYXJhbSddO1xuICAgIHRoaXMudHlwZSA9IGRhdGE/LlsndHlwZSddO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFrZU1lc3NhZ2Uoc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQsIGVycm9yOiBhbnksIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG1zZyA9XG4gICAgICBlcnJvcj8ubWVzc2FnZSA/XG4gICAgICAgIHR5cGVvZiBlcnJvci5tZXNzYWdlID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgZXJyb3IubWVzc2FnZVxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KGVycm9yLm1lc3NhZ2UpXG4gICAgICA6IGVycm9yID8gSlNPTi5zdHJpbmdpZnkoZXJyb3IpXG4gICAgICA6IG1lc3NhZ2U7XG5cbiAgICBpZiAoc3RhdHVzICYmIG1zZykge1xuICAgICAgcmV0dXJuIGAke3N0YXR1c30gJHttc2d9YDtcbiAgICB9XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgcmV0dXJuIGAke3N0YXR1c30gc3RhdHVzIGNvZGUgKG5vIGJvZHkpYDtcbiAgICB9XG4gICAgaWYgKG1zZykge1xuICAgICAgcmV0dXJuIG1zZztcbiAgICB9XG4gICAgcmV0dXJuICcobm8gc3RhdHVzIGNvZGUgb3IgYm9keSknO1xuICB9XG5cbiAgc3RhdGljIGdlbmVyYXRlKFxuICAgIHN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIGVycm9yUmVzcG9uc2U6IE9iamVjdCB8IHVuZGVmaW5lZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgIHJldHVybiBuZXcgQVBJQ29ubmVjdGlvbkVycm9yKHsgY2F1c2U6IGNhc3RUb0Vycm9yKGVycm9yUmVzcG9uc2UpIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gKGVycm9yUmVzcG9uc2UgYXMgUmVjb3JkPHN0cmluZywgYW55Pik/LlsnZXJyb3InXTtcblxuICAgIGlmIChzdGF0dXMgPT09IDQwMCkge1xuICAgICAgcmV0dXJuIG5ldyBCYWRSZXF1ZXN0RXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICByZXR1cm4gbmV3IEF1dGhlbnRpY2F0aW9uRXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25EZW5pZWRFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MDQpIHtcbiAgICAgIHJldHVybiBuZXcgTm90Rm91bmRFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MDkpIHtcbiAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MjIpIHtcbiAgICAgIHJldHVybiBuZXcgVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQyOSkge1xuICAgICAgcmV0dXJuIG5ldyBSYXRlTGltaXRFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID49IDUwMCkge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcm5hbFNlcnZlckVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQVBJRXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFQSVVzZXJBYm9ydEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIHN1cGVyKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtZXNzYWdlIHx8ICdSZXF1ZXN0IHdhcyBhYm9ydGVkLicsIHVuZGVmaW5lZCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFQSUNvbm5lY3Rpb25FcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoeyBtZXNzYWdlLCBjYXVzZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmc7IGNhdXNlPzogRXJyb3IgfCB1bmRlZmluZWQgfSkge1xuICAgIHN1cGVyKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtZXNzYWdlIHx8ICdDb25uZWN0aW9uIGVycm9yLicsIHVuZGVmaW5lZCk7XG4gICAgLy8gaW4gc29tZSBlbnZpcm9ubWVudHMgdGhlICdjYXVzZScgcHJvcGVydHkgaXMgYWxyZWFkeSBkZWNsYXJlZFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoY2F1c2UpIHRoaXMuY2F1c2UgPSBjYXVzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvciBleHRlbmRzIEFQSUNvbm5lY3Rpb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSB9OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyBtZXNzYWdlOiBtZXNzYWdlID8/ICdSZXF1ZXN0IHRpbWVkIG91dC4nIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCYWRSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDAwID0gNDAwO1xufVxuXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRpb25FcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MDEgPSA0MDE7XG59XG5cbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uRGVuaWVkRXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDAzID0gNDAzO1xufVxuXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MDQgPSA0MDQ7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25mbGljdEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQwOSA9IDQwOTtcbn1cblxuZXhwb3J0IGNsYXNzIFVucHJvY2Vzc2FibGVFbnRpdHlFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MjIgPSA0MjI7XG59XG5cbmV4cG9ydCBjbGFzcyBSYXRlTGltaXRFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MjkgPSA0Mjk7XG59XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbFNlcnZlckVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige31cbiIsICJpbXBvcnQgeyBSZWFkYWJsZVN0cmVhbSwgdHlwZSBSZXNwb25zZSB9IGZyb20gJy4vX3NoaW1zL2luZGV4JztcbmltcG9ydCB7IE9wZW5BSUVycm9yIH0gZnJvbSAnLi9lcnJvcic7XG5cbmltcG9ydCB7IEFQSUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcblxudHlwZSBCeXRlcyA9IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSB8IEJ1ZmZlciB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIFNlcnZlclNlbnRFdmVudCA9IHtcbiAgZXZlbnQ6IHN0cmluZyB8IG51bGw7XG4gIGRhdGE6IHN0cmluZztcbiAgcmF3OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTdHJlYW08SXRlbT4gaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPEl0ZW0+IHtcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaXRlcmF0b3I6ICgpID0+IEFzeW5jSXRlcmF0b3I8SXRlbT4sXG4gICAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICApIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGZyb21TU0VSZXNwb25zZTxJdGVtPihyZXNwb25zZTogUmVzcG9uc2UsIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcikge1xuICAgIGxldCBjb25zdW1lZCA9IGZhbHNlO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGl0ZXJhdG9yKCk6IEFzeW5jSXRlcmF0b3I8SXRlbSwgYW55LCB1bmRlZmluZWQ+IHtcbiAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpdGVyYXRlIG92ZXIgYSBjb25zdW1lZCBzdHJlYW0sIHVzZSBgLnRlZSgpYCB0byBzcGxpdCB0aGUgc3RyZWFtLicpO1xuICAgICAgfVxuICAgICAgY29uc3VtZWQgPSB0cnVlO1xuICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3Qgc3NlIG9mIF9pdGVyU1NFTWVzc2FnZXMocmVzcG9uc2UsIGNvbnRyb2xsZXIpKSB7XG4gICAgICAgICAgaWYgKGRvbmUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgaWYgKHNzZS5kYXRhLnN0YXJ0c1dpdGgoJ1tET05FXScpKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzc2UuZXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBkYXRhO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShzc2UuZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBwYXJzZSBtZXNzYWdlIGludG8gSlNPTjpgLCBzc2UuZGF0YSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZyb20gY2h1bms6YCwgc3NlLnJhdyk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKHVuZGVmaW5lZCwgZGF0YS5lcnJvciwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB5aWVsZCBkYXRhO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHNzZS5kYXRhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IHBhcnNlIG1lc3NhZ2UgaW50byBKU09OOmAsIHNzZS5kYXRhKTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRnJvbSBjaHVuazpgLCBzc2UucmF3KTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IElzIHRoaXMgd2hlcmUgdGhlIGVycm9yIHNob3VsZCBiZSB0aHJvd24/XG4gICAgICAgICAgICBpZiAoc3NlLmV2ZW50ID09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKHVuZGVmaW5lZCwgZGF0YS5lcnJvciwgZGF0YS5tZXNzYWdlLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgeyBldmVudDogc3NlLmV2ZW50LCBkYXRhOiBkYXRhIH0gYXMgYW55O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgY2FsbHMgYHN0cmVhbS5jb250cm9sbGVyLmFib3J0KClgLCB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IHRocm93aW5nLlxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBJZiB0aGUgdXNlciBgYnJlYWtgcywgYWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdC5cbiAgICAgICAgaWYgKCFkb25lKSBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTdHJlYW0oaXRlcmF0b3IsIGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFN0cmVhbSBmcm9tIGEgbmV3bGluZS1zZXBhcmF0ZWQgUmVhZGFibGVTdHJlYW1cbiAgICogd2hlcmUgZWFjaCBpdGVtIGlzIGEgSlNPTiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBmcm9tUmVhZGFibGVTdHJlYW08SXRlbT4ocmVhZGFibGVTdHJlYW06IFJlYWRhYmxlU3RyZWFtLCBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBsZXQgY29uc3VtZWQgPSBmYWxzZTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBpdGVyTGluZXMoKTogQXN5bmNHZW5lcmF0b3I8c3RyaW5nLCB2b2lkLCB1bmtub3duPiB7XG4gICAgICBjb25zdCBsaW5lRGVjb2RlciA9IG5ldyBMaW5lRGVjb2RlcigpO1xuXG4gICAgICBjb25zdCBpdGVyID0gcmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhYmxlPEJ5dGVzPihyZWFkYWJsZVN0cmVhbSk7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGl0ZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVEZWNvZGVyLmRlY29kZShjaHVuaykpIHtcbiAgICAgICAgICB5aWVsZCBsaW5lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lRGVjb2Rlci5mbHVzaCgpKSB7XG4gICAgICAgIHlpZWxkIGxpbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGl0ZXJhdG9yKCk6IEFzeW5jSXRlcmF0b3I8SXRlbSwgYW55LCB1bmRlZmluZWQ+IHtcbiAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpdGVyYXRlIG92ZXIgYSBjb25zdW1lZCBzdHJlYW0sIHVzZSBgLnRlZSgpYCB0byBzcGxpdCB0aGUgc3RyZWFtLicpO1xuICAgICAgfVxuICAgICAgY29uc3VtZWQgPSB0cnVlO1xuICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBpdGVyTGluZXMoKSkge1xuICAgICAgICAgIGlmIChkb25lKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAobGluZSkgeWllbGQgSlNPTi5wYXJzZShsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgY2FsbHMgYHN0cmVhbS5jb250cm9sbGVyLmFib3J0KClgLCB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IHRocm93aW5nLlxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBJZiB0aGUgdXNlciBgYnJlYWtgcywgYWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdC5cbiAgICAgICAgaWYgKCFkb25lKSBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTdHJlYW0oaXRlcmF0b3IsIGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhdG9yPEl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyB0aGUgc3RyZWFtIGludG8gdHdvIHN0cmVhbXMgd2hpY2ggY2FuIGJlXG4gICAqIGluZGVwZW5kZW50bHkgcmVhZCBmcm9tIGF0IGRpZmZlcmVudCBzcGVlZHMuXG4gICAqL1xuICB0ZWUoKTogW1N0cmVhbTxJdGVtPiwgU3RyZWFtPEl0ZW0+XSB7XG4gICAgY29uc3QgbGVmdDogQXJyYXk8UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxJdGVtPj4+ID0gW107XG4gICAgY29uc3QgcmlnaHQ6IEFycmF5PFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8SXRlbT4+PiA9IFtdO1xuICAgIGNvbnN0IGl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcigpO1xuXG4gICAgY29uc3QgdGVlSXRlcmF0b3IgPSAocXVldWU6IEFycmF5PFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8SXRlbT4+Pik6IEFzeW5jSXRlcmF0b3I8SXRlbT4gPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGxlZnQucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgcmlnaHQucHVzaChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcXVldWUuc2hpZnQoKSE7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gW1xuICAgICAgbmV3IFN0cmVhbSgoKSA9PiB0ZWVJdGVyYXRvcihsZWZ0KSwgdGhpcy5jb250cm9sbGVyKSxcbiAgICAgIG5ldyBTdHJlYW0oKCkgPT4gdGVlSXRlcmF0b3IocmlnaHQpLCB0aGlzLmNvbnRyb2xsZXIpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdGhpcyBzdHJlYW0gdG8gYSBuZXdsaW5lLXNlcGFyYXRlZCBSZWFkYWJsZVN0cmVhbSBvZlxuICAgKiBKU09OIHN0cmluZ2lmaWVkIHZhbHVlcyBpbiB0aGUgc3RyZWFtXG4gICAqIHdoaWNoIGNhbiBiZSB0dXJuZWQgYmFjayBpbnRvIGEgU3RyZWFtIHdpdGggYFN0cmVhbS5mcm9tUmVhZGFibGVTdHJlYW0oKWAuXG4gICAqL1xuICB0b1JlYWRhYmxlU3RyZWFtKCk6IFJlYWRhYmxlU3RyZWFtIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBsZXQgaXRlcjogQXN5bmNJdGVyYXRvcjxJdGVtPjtcbiAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5cbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgIGFzeW5jIHN0YXJ0KCkge1xuICAgICAgICBpdGVyID0gc2VsZltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsKGN0cmw6IGFueSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm4gY3RybC5jbG9zZSgpO1xuXG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSBlbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnXFxuJyk7XG5cbiAgICAgICAgICBjdHJsLmVucXVldWUoYnl0ZXMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjdHJsLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgIGF3YWl0IGl0ZXIucmV0dXJuPy4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiBfaXRlclNTRU1lc3NhZ2VzKFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcbik6IEFzeW5jR2VuZXJhdG9yPFNlcnZlclNlbnRFdmVudCwgdm9pZCwgdW5rbm93bj4ge1xuICBpZiAoIXJlc3BvbnNlLmJvZHkpIHtcbiAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBBdHRlbXB0ZWQgdG8gaXRlcmF0ZSBvdmVyIGEgcmVzcG9uc2Ugd2l0aCBubyBib2R5YCk7XG4gIH1cblxuICBjb25zdCBzc2VEZWNvZGVyID0gbmV3IFNTRURlY29kZXIoKTtcbiAgY29uc3QgbGluZURlY29kZXIgPSBuZXcgTGluZURlY29kZXIoKTtcblxuICBjb25zdCBpdGVyID0gcmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhYmxlPEJ5dGVzPihyZXNwb25zZS5ib2R5KTtcbiAgZm9yIGF3YWl0IChjb25zdCBzc2VDaHVuayBvZiBpdGVyU1NFQ2h1bmtzKGl0ZXIpKSB7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVEZWNvZGVyLmRlY29kZShzc2VDaHVuaykpIHtcbiAgICAgIGNvbnN0IHNzZSA9IHNzZURlY29kZXIuZGVjb2RlKGxpbmUpO1xuICAgICAgaWYgKHNzZSkgeWllbGQgc3NlO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lRGVjb2Rlci5mbHVzaCgpKSB7XG4gICAgY29uc3Qgc3NlID0gc3NlRGVjb2Rlci5kZWNvZGUobGluZSk7XG4gICAgaWYgKHNzZSkgeWllbGQgc3NlO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IsIGl0ZXJhdGVzIG92ZXIgaXQgYW5kIHlpZWxkcyBmdWxsXG4gKiBTU0UgY2h1bmtzLCBpLmUuIHlpZWxkcyB3aGVuIGEgZG91YmxlIG5ldy1saW5lIGlzIGVuY291bnRlcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiogaXRlclNTRUNodW5rcyhpdGVyYXRvcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPEJ5dGVzPik6IEFzeW5jR2VuZXJhdG9yPFVpbnQ4QXJyYXk+IHtcbiAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheSgpO1xuXG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmF0b3IpIHtcbiAgICBpZiAoY2h1bmsgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgYmluYXJ5Q2h1bmsgPVxuICAgICAgY2h1bmsgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IG5ldyBVaW50OEFycmF5KGNodW5rKVxuICAgICAgOiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnID8gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKVxuICAgICAgOiBjaHVuaztcblxuICAgIGxldCBuZXdEYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGggKyBiaW5hcnlDaHVuay5sZW5ndGgpO1xuICAgIG5ld0RhdGEuc2V0KGRhdGEpO1xuICAgIG5ld0RhdGEuc2V0KGJpbmFyeUNodW5rLCBkYXRhLmxlbmd0aCk7XG4gICAgZGF0YSA9IG5ld0RhdGE7XG5cbiAgICBsZXQgcGF0dGVybkluZGV4O1xuICAgIHdoaWxlICgocGF0dGVybkluZGV4ID0gZmluZERvdWJsZU5ld2xpbmVJbmRleChkYXRhKSkgIT09IC0xKSB7XG4gICAgICB5aWVsZCBkYXRhLnNsaWNlKDAsIHBhdHRlcm5JbmRleCk7XG4gICAgICBkYXRhID0gZGF0YS5zbGljZShwYXR0ZXJuSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcbiAgICB5aWVsZCBkYXRhO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmREb3VibGVOZXdsaW5lSW5kZXgoYnVmZmVyOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgYnVmZmVyIGZvciB0aGUgZW5kIHBhdHRlcm5zIChcXHJcXHIsIFxcblxcbiwgXFxyXFxuXFxyXFxuKVxuICAvLyBhbmQgcmV0dXJucyB0aGUgaW5kZXggcmlnaHQgYWZ0ZXIgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW55IHBhdHRlcm4sXG4gIC8vIG9yIC0xIGlmIG5vbmUgb2YgdGhlIHBhdHRlcm5zIGFyZSBmb3VuZC5cbiAgY29uc3QgbmV3bGluZSA9IDB4MGE7IC8vIFxcblxuICBjb25zdCBjYXJyaWFnZSA9IDB4MGQ7IC8vIFxcclxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aCAtIDI7IGkrKykge1xuICAgIGlmIChidWZmZXJbaV0gPT09IG5ld2xpbmUgJiYgYnVmZmVyW2kgKyAxXSA9PT0gbmV3bGluZSkge1xuICAgICAgLy8gXFxuXFxuXG4gICAgICByZXR1cm4gaSArIDI7XG4gICAgfVxuICAgIGlmIChidWZmZXJbaV0gPT09IGNhcnJpYWdlICYmIGJ1ZmZlcltpICsgMV0gPT09IGNhcnJpYWdlKSB7XG4gICAgICAvLyBcXHJcXHJcbiAgICAgIHJldHVybiBpICsgMjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgYnVmZmVyW2ldID09PSBjYXJyaWFnZSAmJlxuICAgICAgYnVmZmVyW2kgKyAxXSA9PT0gbmV3bGluZSAmJlxuICAgICAgaSArIDMgPCBidWZmZXIubGVuZ3RoICYmXG4gICAgICBidWZmZXJbaSArIDJdID09PSBjYXJyaWFnZSAmJlxuICAgICAgYnVmZmVyW2kgKyAzXSA9PT0gbmV3bGluZVxuICAgICkge1xuICAgICAgLy8gXFxyXFxuXFxyXFxuXG4gICAgICByZXR1cm4gaSArIDQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG5jbGFzcyBTU0VEZWNvZGVyIHtcbiAgcHJpdmF0ZSBkYXRhOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBldmVudDogc3RyaW5nIHwgbnVsbDtcbiAgcHJpdmF0ZSBjaHVua3M6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZXZlbnQgPSBudWxsO1xuICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgIHRoaXMuY2h1bmtzID0gW107XG4gIH1cblxuICBkZWNvZGUobGluZTogc3RyaW5nKSB7XG4gICAgaWYgKGxpbmUuZW5kc1dpdGgoJ1xccicpKSB7XG4gICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICBpZiAoIWxpbmUpIHtcbiAgICAgIC8vIGVtcHR5IGxpbmUgYW5kIHdlIGRpZG4ndCBwcmV2aW91c2x5IGVuY291bnRlciBhbnkgbWVzc2FnZXNcbiAgICAgIGlmICghdGhpcy5ldmVudCAmJiAhdGhpcy5kYXRhLmxlbmd0aCkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IHNzZTogU2VydmVyU2VudEV2ZW50ID0ge1xuICAgICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgICAgZGF0YTogdGhpcy5kYXRhLmpvaW4oJ1xcbicpLFxuICAgICAgICByYXc6IHRoaXMuY2h1bmtzLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5ldmVudCA9IG51bGw7XG4gICAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICAgIHRoaXMuY2h1bmtzID0gW107XG5cbiAgICAgIHJldHVybiBzc2U7XG4gICAgfVxuXG4gICAgdGhpcy5jaHVua3MucHVzaChsaW5lKTtcblxuICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IFtmaWVsZG5hbWUsIF8sIHZhbHVlXSA9IHBhcnRpdGlvbihsaW5lLCAnOicpO1xuXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyAnKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkbmFtZSA9PT0gJ2V2ZW50Jykge1xuICAgICAgdGhpcy5ldmVudCA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZmllbGRuYW1lID09PSAnZGF0YScpIHtcbiAgICAgIHRoaXMuZGF0YS5wdXNoKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEEgcmUtaW1wbGVtZW50YXRpb24gb2YgaHR0cHgncyBgTGluZURlY29kZXJgIGluIFB5dGhvbiB0aGF0IGhhbmRsZXMgaW5jcmVtZW50YWxseVxuICogcmVhZGluZyBsaW5lcyBmcm9tIHRleHQuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuY29kZS9odHRweC9ibG9iLzkyMDMzM2VhOTgxMThlOWNmNjE3ZjI0NjkwNWQ3YjIwMjUxMDk0MWMvaHR0cHgvX2RlY29kZXJzLnB5I0wyNThcbiAqL1xuY2xhc3MgTGluZURlY29kZXIge1xuICAvLyBwcmV0dGllci1pZ25vcmVcbiAgc3RhdGljIE5FV0xJTkVfQ0hBUlMgPSBuZXcgU2V0KFsnXFxuJywgJ1xcciddKTtcbiAgc3RhdGljIE5FV0xJTkVfUkVHRVhQID0gL1xcclxcbnxbXFxuXFxyXS9nO1xuXG4gIGJ1ZmZlcjogc3RyaW5nW107XG4gIHRyYWlsaW5nQ1I6IGJvb2xlYW47XG4gIHRleHREZWNvZGVyOiBhbnk7IC8vIFRleHREZWNvZGVyIGZvdW5kIGluIGJyb3dzZXJzOyBub3QgdHlwZWQgdG8gYXZvaWQgcHVsbGluZyBpbiBlaXRoZXIgXCJkb21cIiBvciBcIm5vZGVcIiB0eXBlcy5cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgIHRoaXMudHJhaWxpbmdDUiA9IGZhbHNlO1xuICB9XG5cbiAgZGVjb2RlKGNodW5rOiBCeXRlcyk6IHN0cmluZ1tdIHtcbiAgICBsZXQgdGV4dCA9IHRoaXMuZGVjb2RlVGV4dChjaHVuayk7XG5cbiAgICBpZiAodGhpcy50cmFpbGluZ0NSKSB7XG4gICAgICB0ZXh0ID0gJ1xccicgKyB0ZXh0O1xuICAgICAgdGhpcy50cmFpbGluZ0NSID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0ZXh0LmVuZHNXaXRoKCdcXHInKSkge1xuICAgICAgdGhpcy50cmFpbGluZ0NSID0gdHJ1ZTtcbiAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIC0xKTtcbiAgICB9XG5cbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFpbGluZ05ld2xpbmUgPSBMaW5lRGVjb2Rlci5ORVdMSU5FX0NIQVJTLmhhcyh0ZXh0W3RleHQubGVuZ3RoIC0gMV0gfHwgJycpO1xuICAgIGxldCBsaW5lcyA9IHRleHQuc3BsaXQoTGluZURlY29kZXIuTkVXTElORV9SRUdFWFApO1xuXG4gICAgLy8gaWYgdGhlcmUgaXMgYSB0cmFpbGluZyBuZXcgbGluZSB0aGVuIHRoZSBsYXN0IGVudHJ5IHdpbGwgYmUgYW4gZW1wdHlcbiAgICAvLyBzdHJpbmcgd2hpY2ggd2UgZG9uJ3QgY2FyZSBhYm91dFxuICAgIGlmICh0cmFpbGluZ05ld2xpbmUpIHtcbiAgICAgIGxpbmVzLnBvcCgpO1xuICAgIH1cblxuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEgJiYgIXRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgdGhpcy5idWZmZXIucHVzaChsaW5lc1swXSEpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcyA9IFt0aGlzLmJ1ZmZlci5qb2luKCcnKSArIGxpbmVzWzBdLCAuLi5saW5lcy5zbGljZSgxKV07XG4gICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgIH1cblxuICAgIGlmICghdHJhaWxpbmdOZXdsaW5lKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IFtsaW5lcy5wb3AoKSB8fCAnJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgZGVjb2RlVGV4dChieXRlczogQnl0ZXMpOiBzdHJpbmcge1xuICAgIGlmIChieXRlcyA9PSBudWxsKSByZXR1cm4gJyc7XG4gICAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHJldHVybiBieXRlcztcblxuICAgIC8vIE5vZGU6XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoYnl0ZXMgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIGJ5dGVzLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICBpZiAoYnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShieXRlcykudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFxuICAgICAgICBgVW5leHBlY3RlZDogcmVjZWl2ZWQgbm9uLVVpbnQ4QXJyYXkgKCR7Ynl0ZXMuY29uc3RydWN0b3IubmFtZX0pIHN0cmVhbSBjaHVuayBpbiBhbiBlbnZpcm9ubWVudCB3aXRoIGEgZ2xvYmFsIFwiQnVmZmVyXCIgZGVmaW5lZCwgd2hpY2ggdGhpcyBsaWJyYXJ5IGFzc3VtZXMgdG8gYmUgTm9kZS4gUGxlYXNlIHJlcG9ydCB0aGlzIGVycm9yLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEJyb3dzZXJcbiAgICBpZiAodHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBieXRlcyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHRoaXMudGV4dERlY29kZXIgPz89IG5ldyBUZXh0RGVjb2RlcigndXRmOCcpO1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICAgIGBVbmV4cGVjdGVkOiByZWNlaXZlZCBub24tVWludDhBcnJheS9BcnJheUJ1ZmZlciAoJHtcbiAgICAgICAgICAoYnl0ZXMgYXMgYW55KS5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIH0pIGluIGEgd2ViIHBsYXRmb3JtLiBQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQ6IG5laXRoZXIgQnVmZmVyIG5vciBUZXh0RGVjb2RlciBhcmUgYXZhaWxhYmxlIGFzIGdsb2JhbHMuIFBsZWFzZSByZXBvcnQgdGhpcyBlcnJvci5gLFxuICAgICk7XG4gIH1cblxuICBmbHVzaCgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlci5sZW5ndGggJiYgIXRoaXMudHJhaWxpbmdDUikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gW3RoaXMuYnVmZmVyLmpvaW4oJycpXTtcbiAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgIHRoaXMudHJhaWxpbmdDUiA9IGZhbHNlO1xuICAgIHJldHVybiBsaW5lcztcbiAgfVxufVxuXG4vKiogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdGhhdCdzIGp1c3QgdXNlZCBmb3IgdGVzdGluZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9kZWNvZGVDaHVua3MoY2h1bmtzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBMaW5lRGVjb2RlcigpO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBsaW5lcy5wdXNoKC4uLmRlY29kZXIuZGVjb2RlKGNodW5rKSk7XG4gIH1cblxuICByZXR1cm4gbGluZXM7XG59XG5cbmZ1bmN0aW9uIHBhcnRpdGlvbihzdHI6IHN0cmluZywgZGVsaW1pdGVyOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10ge1xuICBjb25zdCBpbmRleCA9IHN0ci5pbmRleE9mKGRlbGltaXRlcik7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICByZXR1cm4gW3N0ci5zdWJzdHJpbmcoMCwgaW5kZXgpLCBkZWxpbWl0ZXIsIHN0ci5zdWJzdHJpbmcoaW5kZXggKyBkZWxpbWl0ZXIubGVuZ3RoKV07XG4gIH1cblxuICByZXR1cm4gW3N0ciwgJycsICcnXTtcbn1cblxuLyoqXG4gKiBNb3N0IGJyb3dzZXJzIGRvbid0IHlldCBoYXZlIGFzeW5jIGl0ZXJhYmxlIHN1cHBvcnQgZm9yIFJlYWRhYmxlU3RyZWFtLFxuICogYW5kIE5vZGUgaGFzIGEgdmVyeSBkaWZmZXJlbnQgd2F5IG9mIHJlYWRpbmcgYnl0ZXMgZnJvbSBpdHMgXCJSZWFkYWJsZVN0cmVhbVwiLlxuICpcbiAqIFRoaXMgcG9seWZpbGwgd2FzIHB1bGxlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9NYXR0aWFzQnVlbGVucy93ZWItc3RyZWFtcy1wb2x5ZmlsbC9wdWxsLzEyMiNpc3N1ZWNvbW1lbnQtMTYyNzM1NDQ5MFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhYmxlPFQ+KHN0cmVhbTogYW55KTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgaWYgKHN0cmVhbVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIHJldHVybiBzdHJlYW07XG5cbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICByZXR1cm4ge1xuICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAocmVzdWx0Py5kb25lKSByZWFkZXIucmVsZWFzZUxvY2soKTsgLy8gcmVsZWFzZSBsb2NrIHdoZW4gc3RyZWFtIGJlY29tZXMgY2xvc2VkXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpOyAvLyByZWxlYXNlIGxvY2sgd2hlbiBzdHJlYW0gYmVjb21lcyBlcnJvcmVkXG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyByZXR1cm4oKSB7XG4gICAgICBjb25zdCBjYW5jZWxQcm9taXNlID0gcmVhZGVyLmNhbmNlbCgpO1xuICAgICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICBhd2FpdCBjYW5jZWxQcm9taXNlO1xuICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgIH0sXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vY29yZSc7XG5pbXBvcnQge1xuICBGb3JtRGF0YSxcbiAgRmlsZSxcbiAgdHlwZSBCbG9iLFxuICB0eXBlIEZpbGVQcm9wZXJ0eUJhZyxcbiAgZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMsXG4gIHR5cGUgRnNSZWFkU3RyZWFtLFxuICBpc0ZzUmVhZFN0cmVhbSxcbn0gZnJvbSAnLi9fc2hpbXMvaW5kZXgnO1xuaW1wb3J0IHsgTXVsdGlwYXJ0Qm9keSB9IGZyb20gJy4vX3NoaW1zL011bHRpcGFydEJvZHknO1xuZXhwb3J0IHsgZmlsZUZyb21QYXRoIH0gZnJvbSAnLi9fc2hpbXMvaW5kZXgnO1xuXG50eXBlIEJsb2JMaWtlUGFydCA9IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgQXJyYXlCdWZmZXJWaWV3IHwgQmxvYkxpa2UgfCBVaW50OEFycmF5IHwgRGF0YVZpZXc7XG5leHBvcnQgdHlwZSBCbG9iUGFydCA9IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgQXJyYXlCdWZmZXJWaWV3IHwgQmxvYiB8IFVpbnQ4QXJyYXkgfCBEYXRhVmlldztcblxuLyoqXG4gKiBUeXBpY2FsbHksIHRoaXMgaXMgYSBuYXRpdmUgXCJGaWxlXCIgY2xhc3MuXG4gKlxuICogV2UgcHJvdmlkZSB0aGUge0BsaW5rIHRvRmlsZX0gdXRpbGl0eSB0byBjb252ZXJ0IGEgdmFyaWV0eSBvZiBvYmplY3RzXG4gKiBpbnRvIHRoZSBGaWxlIGNsYXNzLlxuICpcbiAqIEZvciBjb252ZW5pZW5jZSwgeW91IGNhbiBhbHNvIHBhc3MgYSBmZXRjaCBSZXNwb25zZSwgb3IgaW4gTm9kZSxcbiAqIHRoZSByZXN1bHQgb2YgZnMuY3JlYXRlUmVhZFN0cmVhbSgpLlxuICovXG5leHBvcnQgdHlwZSBVcGxvYWRhYmxlID0gRmlsZUxpa2UgfCBSZXNwb25zZUxpa2UgfCBGc1JlYWRTdHJlYW07XG5cbi8qKlxuICogSW50ZW5kZWQgdG8gbWF0Y2ggd2ViLkJsb2IsIG5vZGUuQmxvYiwgbm9kZS1mZXRjaC5CbG9iLCBldGMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmxvYkxpa2Uge1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9CbG9iL3NpemUpICovXG4gIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvQmxvYi90eXBlKSAqL1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0Jsb2IvdGV4dCkgKi9cbiAgdGV4dCgpOiBQcm9taXNlPHN0cmluZz47XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0Jsb2Ivc2xpY2UpICovXG4gIHNsaWNlKHN0YXJ0PzogbnVtYmVyLCBlbmQ/OiBudW1iZXIpOiBCbG9iTGlrZTtcbiAgLy8gdW5mb3J0dW5hdGVseSBAdHlwZXMvbm9kZS1mZXRjaEBeMi42LjQgZG9lc24ndCB0eXBlIHRoZSBhcnJheUJ1ZmZlciBtZXRob2Rcbn1cblxuLyoqXG4gKiBJbnRlbmRlZCB0byBtYXRjaCB3ZWIuRmlsZSwgbm9kZS5GaWxlLCBub2RlLWZldGNoLkZpbGUsIGV0Yy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlTGlrZSBleHRlbmRzIEJsb2JMaWtlIHtcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvRmlsZS9sYXN0TW9kaWZpZWQpICovXG4gIHJlYWRvbmx5IGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9GaWxlL25hbWUpICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnRlbmRlZCB0byBtYXRjaCB3ZWIuUmVzcG9uc2UsIG5vZGUuUmVzcG9uc2UsIG5vZGUtZmV0Y2guUmVzcG9uc2UsIGV0Yy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUxpa2Uge1xuICB1cmw6IHN0cmluZztcbiAgYmxvYigpOiBQcm9taXNlPEJsb2JMaWtlPjtcbn1cblxuZXhwb3J0IGNvbnN0IGlzUmVzcG9uc2VMaWtlID0gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBSZXNwb25zZUxpa2UgPT5cbiAgdmFsdWUgIT0gbnVsbCAmJlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHR5cGVvZiB2YWx1ZS51cmwgPT09ICdzdHJpbmcnICYmXG4gIHR5cGVvZiB2YWx1ZS5ibG9iID09PSAnZnVuY3Rpb24nO1xuXG5leHBvcnQgY29uc3QgaXNGaWxlTGlrZSA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgRmlsZUxpa2UgPT5cbiAgdmFsdWUgIT0gbnVsbCAmJlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHR5cGVvZiB2YWx1ZS5uYW1lID09PSAnc3RyaW5nJyAmJlxuICB0eXBlb2YgdmFsdWUubGFzdE1vZGlmaWVkID09PSAnbnVtYmVyJyAmJlxuICBpc0Jsb2JMaWtlKHZhbHVlKTtcblxuLyoqXG4gKiBUaGUgQmxvYkxpa2UgdHlwZSBvbWl0cyBhcnJheUJ1ZmZlcigpIGJlY2F1c2UgQHR5cGVzL25vZGUtZmV0Y2hAXjIuNi40IGxhY2tzIGl0OyBidXQgdGhpcyBjaGVja1xuICogYWRkcyB0aGUgYXJyYXlCdWZmZXIoKSBtZXRob2QgdHlwZSBiZWNhdXNlIGl0IGlzIGF2YWlsYWJsZSBhbmQgdXNlZCBhdCBydW50aW1lXG4gKi9cbmV4cG9ydCBjb25zdCBpc0Jsb2JMaWtlID0gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBCbG9iTGlrZSAmIHsgYXJyYXlCdWZmZXIoKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gfSA9PlxuICB2YWx1ZSAhPSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdHlwZW9mIHZhbHVlLnNpemUgPT09ICdudW1iZXInICYmXG4gIHR5cGVvZiB2YWx1ZS50eXBlID09PSAnc3RyaW5nJyAmJlxuICB0eXBlb2YgdmFsdWUudGV4dCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2YgdmFsdWUuc2xpY2UgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIHZhbHVlLmFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nO1xuXG5leHBvcnQgY29uc3QgaXNVcGxvYWRhYmxlID0gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBVcGxvYWRhYmxlID0+IHtcbiAgcmV0dXJuIGlzRmlsZUxpa2UodmFsdWUpIHx8IGlzUmVzcG9uc2VMaWtlKHZhbHVlKSB8fCBpc0ZzUmVhZFN0cmVhbSh2YWx1ZSk7XG59O1xuXG5leHBvcnQgdHlwZSBUb0ZpbGVJbnB1dCA9IFVwbG9hZGFibGUgfCBFeGNsdWRlPEJsb2JMaWtlUGFydCwgc3RyaW5nPiB8IEFzeW5jSXRlcmFibGU8QmxvYkxpa2VQYXJ0PjtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNyZWF0aW5nIGEge0BsaW5rIEZpbGV9IHRvIHBhc3MgdG8gYW4gU0RLIHVwbG9hZCBtZXRob2QgZnJvbSBhIHZhcmlldHkgb2YgZGlmZmVyZW50IGRhdGEgZm9ybWF0c1xuICogQHBhcmFtIHZhbHVlIHRoZSByYXcgY29udGVudCBvZiB0aGUgZmlsZS4gIENhbiBiZSBhbiB7QGxpbmsgVXBsb2FkYWJsZX0sIHtAbGluayBCbG9iTGlrZVBhcnR9LCBvciB7QGxpbmsgQXN5bmNJdGVyYWJsZX0gb2Yge0BsaW5rIEJsb2JMaWtlUGFydH1zXG4gKiBAcGFyYW0ge3N0cmluZz19IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuIElmIG9taXR0ZWQsIHRvRmlsZSB3aWxsIHRyeSB0byBkZXRlcm1pbmUgYSBmaWxlIG5hbWUgZnJvbSBiaXRzIGlmIHBvc3NpYmxlXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdGlvbnMudHlwZSB0aGUgTUlNRSB0eXBlIG9mIHRoZSBjb250ZW50XG4gKiBAcGFyYW0ge251bWJlcj19IG9wdGlvbnMubGFzdE1vZGlmaWVkIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWVzdGFtcFxuICogQHJldHVybnMgYSB7QGxpbmsgRmlsZX0gd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydGllc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9GaWxlKFxuICB2YWx1ZTogVG9GaWxlSW5wdXQgfCBQcm9taXNlTGlrZTxUb0ZpbGVJbnB1dD4sXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzogRmlsZVByb3BlcnR5QmFnIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxGaWxlTGlrZT4ge1xuICAvLyBJZiBpdCdzIGEgcHJvbWlzZSwgcmVzb2x2ZSBpdC5cbiAgdmFsdWUgPSBhd2FpdCB2YWx1ZTtcblxuICAvLyBVc2UgdGhlIGZpbGUncyBvcHRpb25zIGlmIHRoZXJlIGlzbid0IG9uZSBwcm92aWRlZFxuICBvcHRpb25zID8/PSBpc0ZpbGVMaWtlKHZhbHVlKSA/IHsgbGFzdE1vZGlmaWVkOiB2YWx1ZS5sYXN0TW9kaWZpZWQsIHR5cGU6IHZhbHVlLnR5cGUgfSA6IHt9O1xuXG4gIGlmIChpc1Jlc3BvbnNlTGlrZSh2YWx1ZSkpIHtcbiAgICBjb25zdCBibG9iID0gYXdhaXQgdmFsdWUuYmxvYigpO1xuICAgIG5hbWUgfHw9IG5ldyBVUkwodmFsdWUudXJsKS5wYXRobmFtZS5zcGxpdCgvW1xcXFwvXS8pLnBvcCgpID8/ICd1bmtub3duX2ZpbGUnO1xuXG4gICAgcmV0dXJuIG5ldyBGaWxlKFtibG9iIGFzIGFueV0sIG5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgYml0cyA9IGF3YWl0IGdldEJ5dGVzKHZhbHVlKTtcblxuICBuYW1lIHx8PSBnZXROYW1lKHZhbHVlKSA/PyAndW5rbm93bl9maWxlJztcblxuICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgIGNvbnN0IHR5cGUgPSAoYml0c1swXSBhcyBhbnkpPy50eXBlO1xuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIHR5cGUgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IEZpbGUoYml0cywgbmFtZSwgb3B0aW9ucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEJ5dGVzKHZhbHVlOiBUb0ZpbGVJbnB1dCk6IFByb21pc2U8QXJyYXk8QmxvYlBhcnQ+PiB7XG4gIGxldCBwYXJ0czogQXJyYXk8QmxvYlBhcnQ+ID0gW107XG4gIGlmIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSB8fCAvLyBpbmNsdWRlcyBVaW50OEFycmF5LCBCdWZmZXIsIGV0Yy5cbiAgICB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyXG4gICkge1xuICAgIHBhcnRzLnB1c2godmFsdWUpO1xuICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UodmFsdWUpKSB7XG4gICAgcGFydHMucHVzaChhd2FpdCB2YWx1ZS5hcnJheUJ1ZmZlcigpKTtcbiAgfSBlbHNlIGlmIChcbiAgICBpc0FzeW5jSXRlcmFibGVJdGVyYXRvcih2YWx1ZSkgLy8gaW5jbHVkZXMgUmVhZGFibGUsIFJlYWRhYmxlU3RyZWFtLCBldGMuXG4gICkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgdmFsdWUpIHtcbiAgICAgIHBhcnRzLnB1c2goY2h1bmsgYXMgQmxvYlBhcnQpOyAvLyBUT0RPLCBjb25zaWRlciB2YWxpZGF0aW5nP1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5leHBlY3RlZCBkYXRhIHR5cGU6ICR7dHlwZW9mIHZhbHVlfTsgY29uc3RydWN0b3I6ICR7dmFsdWU/LmNvbnN0cnVjdG9yXG4gICAgICAgID8ubmFtZX07IHByb3BzOiAke3Byb3BzRm9yRXJyb3IodmFsdWUpfWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuZnVuY3Rpb24gcHJvcHNGb3JFcnJvcih2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgY29uc3QgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIHJldHVybiBgWyR7cHJvcHMubWFwKChwKSA9PiBgXCIke3B9XCJgKS5qb2luKCcsICcpfV1gO1xufVxuXG5mdW5jdGlvbiBnZXROYW1lKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gKFxuICAgIGdldFN0cmluZ0Zyb21NYXliZUJ1ZmZlcih2YWx1ZS5uYW1lKSB8fFxuICAgIGdldFN0cmluZ0Zyb21NYXliZUJ1ZmZlcih2YWx1ZS5maWxlbmFtZSkgfHxcbiAgICAvLyBGb3IgZnMuUmVhZFN0cmVhbVxuICAgIGdldFN0cmluZ0Zyb21NYXliZUJ1ZmZlcih2YWx1ZS5wYXRoKT8uc3BsaXQoL1tcXFxcL10vKS5wb3AoKVxuICApO1xufVxuXG5jb25zdCBnZXRTdHJpbmdGcm9tTWF5YmVCdWZmZXIgPSAoeDogc3RyaW5nIHwgQnVmZmVyIHwgdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycpIHJldHVybiB4O1xuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgeCBpbnN0YW5jZW9mIEJ1ZmZlcikgcmV0dXJuIFN0cmluZyh4KTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGlzQXN5bmNJdGVyYWJsZUl0ZXJhdG9yID0gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8dW5rbm93bj4gPT5cbiAgdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG5cbmV4cG9ydCBjb25zdCBpc011bHRpcGFydEJvZHkgPSAoYm9keTogYW55KTogYm9keSBpcyBNdWx0aXBhcnRCb2R5ID0+XG4gIGJvZHkgJiYgdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnICYmIGJvZHkuYm9keSAmJiBib2R5W1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdNdWx0aXBhcnRCb2R5JztcblxuLyoqXG4gKiBSZXR1cm5zIGEgbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0IGlmIGFueSBwYXJ0IG9mIHRoZSBnaXZlbiByZXF1ZXN0IGJvZHkgY29udGFpbnMgYSBGaWxlIC8gQmxvYiB2YWx1ZS5cbiAqIE90aGVyd2lzZSByZXR1cm5zIHRoZSByZXF1ZXN0IGFzIGlzLlxuICovXG5leHBvcnQgY29uc3QgbWF5YmVNdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMgPSBhc3luYyA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgb3B0czogUmVxdWVzdE9wdGlvbnM8VD4sXG4pOiBQcm9taXNlPFJlcXVlc3RPcHRpb25zPFQgfCBNdWx0aXBhcnRCb2R5Pj4gPT4ge1xuICBpZiAoIWhhc1VwbG9hZGFibGVWYWx1ZShvcHRzLmJvZHkpKSByZXR1cm4gb3B0cztcblxuICBjb25zdCBmb3JtID0gYXdhaXQgY3JlYXRlRm9ybShvcHRzLmJvZHkpO1xuICByZXR1cm4gZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMoZm9ybSwgb3B0cyk7XG59O1xuXG5leHBvcnQgY29uc3QgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zID0gYXN5bmMgPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIG9wdHM6IFJlcXVlc3RPcHRpb25zPFQ+LFxuKTogUHJvbWlzZTxSZXF1ZXN0T3B0aW9uczxUIHwgTXVsdGlwYXJ0Qm9keT4+ID0+IHtcbiAgY29uc3QgZm9ybSA9IGF3YWl0IGNyZWF0ZUZvcm0ob3B0cy5ib2R5KTtcbiAgcmV0dXJuIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zKGZvcm0sIG9wdHMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUZvcm0gPSBhc3luYyA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pihib2R5OiBUIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxGb3JtRGF0YT4gPT4ge1xuICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5lbnRyaWVzKGJvZHkgfHwge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBhZGRGb3JtVmFsdWUoZm9ybSwga2V5LCB2YWx1ZSkpKTtcbiAgcmV0dXJuIGZvcm07XG59O1xuXG5jb25zdCBoYXNVcGxvYWRhYmxlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgaWYgKGlzVXBsb2FkYWJsZSh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5zb21lKGhhc1VwbG9hZGFibGVWYWx1ZSk7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgICBpZiAoaGFzVXBsb2FkYWJsZVZhbHVlKCh2YWx1ZSBhcyBhbnkpW2tdKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGFkZEZvcm1WYWx1ZSA9IGFzeW5jIChmb3JtOiBGb3JtRGF0YSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBSZWNlaXZlZCBudWxsIGZvciBcIiR7a2V5fVwiOyB0byBwYXNzIG51bGwgaW4gRm9ybURhdGEsIHlvdSBtdXN0IHVzZSB0aGUgc3RyaW5nICdudWxsJ2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IG1ha2UgbmVzdGVkIGZvcm1hdHMgY29uZmlndXJhYmxlXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICBmb3JtLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpO1xuICB9IGVsc2UgaWYgKGlzVXBsb2FkYWJsZSh2YWx1ZSkpIHtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgdG9GaWxlKHZhbHVlKTtcbiAgICBmb3JtLmFwcGVuZChrZXksIGZpbGUgYXMgRmlsZSk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh2YWx1ZS5tYXAoKGVudHJ5KSA9PiBhZGRGb3JtVmFsdWUoZm9ybSwga2V5ICsgJ1tdJywgZW50cnkpKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgT2JqZWN0LmVudHJpZXModmFsdWUpLm1hcCgoW25hbWUsIHByb3BdKSA9PiBhZGRGb3JtVmFsdWUoZm9ybSwgYCR7a2V5fVske25hbWV9XWAsIHByb3ApKSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgSW52YWxpZCB2YWx1ZSBnaXZlbiB0byBmb3JtLCBleHBlY3RlZCBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvYmplY3QsIEFycmF5LCBGaWxlIG9yIEJsb2IgYnV0IGdvdCAke3ZhbHVlfSBpbnN0ZWFkYCxcbiAgICApO1xuICB9XG59O1xuIiwgImltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW1pbmcnO1xuaW1wb3J0IHtcbiAgT3BlbkFJRXJyb3IsXG4gIEFQSUVycm9yLFxuICBBUElDb25uZWN0aW9uRXJyb3IsXG4gIEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IsXG4gIEFQSVVzZXJBYm9ydEVycm9yLFxufSBmcm9tICcuL2Vycm9yJztcbmltcG9ydCB7XG4gIGtpbmQgYXMgc2hpbXNLaW5kLFxuICB0eXBlIFJlYWRhYmxlLFxuICBnZXREZWZhdWx0QWdlbnQsXG4gIHR5cGUgQWdlbnQsXG4gIGZldGNoLFxuICB0eXBlIFJlcXVlc3RJbmZvLFxuICB0eXBlIFJlcXVlc3RJbml0LFxuICB0eXBlIFJlc3BvbnNlLFxuICB0eXBlIEhlYWRlcnNJbml0LFxufSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5leHBvcnQgeyB0eXBlIFJlc3BvbnNlIH07XG5pbXBvcnQgeyBpc011bHRpcGFydEJvZHkgfSBmcm9tICcuL3VwbG9hZHMnO1xuZXhwb3J0IHtcbiAgbWF5YmVNdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMsXG4gIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyxcbiAgY3JlYXRlRm9ybSxcbiAgdHlwZSBVcGxvYWRhYmxlLFxufSBmcm9tICcuL3VwbG9hZHMnO1xuXG5leHBvcnQgdHlwZSBGZXRjaCA9ICh1cmw6IFJlcXVlc3RJbmZvLCBpbml0PzogUmVxdWVzdEluaXQpID0+IFByb21pc2U8UmVzcG9uc2U+O1xuXG50eXBlIFByb21pc2VPclZhbHVlPFQ+ID0gVCB8IFByb21pc2U8VD47XG5cbnR5cGUgQVBJUmVzcG9uc2VQcm9wcyA9IHtcbiAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zO1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBkZWZhdWx0UGFyc2VSZXNwb25zZTxUPihwcm9wczogQVBJUmVzcG9uc2VQcm9wcyk6IFByb21pc2U8VD4ge1xuICBjb25zdCB7IHJlc3BvbnNlIH0gPSBwcm9wcztcbiAgaWYgKHByb3BzLm9wdGlvbnMuc3RyZWFtKSB7XG4gICAgZGVidWcoJ3Jlc3BvbnNlJywgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS51cmwsIHJlc3BvbnNlLmhlYWRlcnMsIHJlc3BvbnNlLmJvZHkpO1xuXG4gICAgLy8gTm90ZTogdGhlcmUgaXMgYW4gaW52YXJpYW50IGhlcmUgdGhhdCBpc24ndCByZXByZXNlbnRlZCBpbiB0aGUgdHlwZSBzeXN0ZW1cbiAgICAvLyB0aGF0IGlmIHlvdSBzZXQgYHN0cmVhbTogdHJ1ZWAgdGhlIHJlc3BvbnNlIHR5cGUgbXVzdCBhbHNvIGJlIGBTdHJlYW08VD5gXG5cbiAgICBpZiAocHJvcHMub3B0aW9ucy5fX3N0cmVhbUNsYXNzKSB7XG4gICAgICByZXR1cm4gcHJvcHMub3B0aW9ucy5fX3N0cmVhbUNsYXNzLmZyb21TU0VSZXNwb25zZShyZXNwb25zZSwgcHJvcHMuY29udHJvbGxlcikgYXMgYW55O1xuICAgIH1cblxuICAgIHJldHVybiBTdHJlYW0uZnJvbVNTRVJlc3BvbnNlKHJlc3BvbnNlLCBwcm9wcy5jb250cm9sbGVyKSBhcyBhbnk7XG4gIH1cblxuICAvLyBmZXRjaCByZWZ1c2VzIHRvIHJlYWQgdGhlIGJvZHkgd2hlbiB0aGUgc3RhdHVzIGNvZGUgaXMgMjA0LlxuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDQpIHtcbiAgICByZXR1cm4gbnVsbCBhcyBUO1xuICB9XG5cbiAgaWYgKHByb3BzLm9wdGlvbnMuX19iaW5hcnlSZXNwb25zZSkge1xuICAgIHJldHVybiByZXNwb25zZSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgY29uc3QgaXNKU09OID1cbiAgICBjb250ZW50VHlwZT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSB8fCBjb250ZW50VHlwZT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL3ZuZC5hcGkranNvbicpO1xuICBpZiAoaXNKU09OKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGRlYnVnKCdyZXNwb25zZScsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UudXJsLCByZXNwb25zZS5oZWFkZXJzLCBqc29uKTtcblxuICAgIHJldHVybiBqc29uIGFzIFQ7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICBkZWJ1ZygncmVzcG9uc2UnLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnVybCwgcmVzcG9uc2UuaGVhZGVycywgdGV4dCk7XG5cbiAgLy8gVE9ETyBoYW5kbGUgYmxvYiwgYXJyYXlidWZmZXIsIG90aGVyIGNvbnRlbnQgdHlwZXMsIGV0Yy5cbiAgcmV0dXJuIHRleHQgYXMgdW5rbm93biBhcyBUO1xufVxuXG4vKipcbiAqIEEgc3ViY2xhc3Mgb2YgYFByb21pc2VgIHByb3ZpZGluZyBhZGRpdGlvbmFsIGhlbHBlciBtZXRob2RzXG4gKiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgU0RLLlxuICovXG5leHBvcnQgY2xhc3MgQVBJUHJvbWlzZTxUPiBleHRlbmRzIFByb21pc2U8VD4ge1xuICBwcml2YXRlIHBhcnNlZFByb21pc2U6IFByb21pc2U8VD4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZXNwb25zZVByb21pc2U6IFByb21pc2U8QVBJUmVzcG9uc2VQcm9wcz4sXG4gICAgcHJpdmF0ZSBwYXJzZVJlc3BvbnNlOiAocHJvcHM6IEFQSVJlc3BvbnNlUHJvcHMpID0+IFByb21pc2VPclZhbHVlPFQ+ID0gZGVmYXVsdFBhcnNlUmVzcG9uc2UsXG4gICkge1xuICAgIHN1cGVyKChyZXNvbHZlKSA9PiB7XG4gICAgICAvLyB0aGlzIGlzIG1heWJlIGEgYml0IHdlaXJkIGJ1dCB0aGlzIGhhcyB0byBiZSBhIG5vLW9wIHRvIG5vdCBpbXBsaWNpdGx5XG4gICAgICAvLyBwYXJzZSB0aGUgcmVzcG9uc2UgYm9keTsgaW5zdGVhZCAudGhlbiwgLmNhdGNoLCAuZmluYWxseSBhcmUgb3ZlcnJpZGRlblxuICAgICAgLy8gdG8gcGFyc2UgdGhlIHJlc3BvbnNlXG4gICAgICByZXNvbHZlKG51bGwgYXMgYW55KTtcbiAgICB9KTtcbiAgfVxuXG4gIF90aGVuVW53cmFwPFU+KHRyYW5zZm9ybTogKGRhdGE6IFQpID0+IFUpOiBBUElQcm9taXNlPFU+IHtcbiAgICByZXR1cm4gbmV3IEFQSVByb21pc2UodGhpcy5yZXNwb25zZVByb21pc2UsIGFzeW5jIChwcm9wcykgPT4gdHJhbnNmb3JtKGF3YWl0IHRoaXMucGFyc2VSZXNwb25zZShwcm9wcykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByYXcgYFJlc3BvbnNlYCBpbnN0YW5jZSBpbnN0ZWFkIG9mIHBhcnNpbmcgdGhlIHJlc3BvbnNlXG4gICAqIGRhdGEuXG4gICAqXG4gICAqIElmIHlvdSB3YW50IHRvIHBhcnNlIHRoZSByZXNwb25zZSBib2R5IGJ1dCBzdGlsbCBnZXQgdGhlIGBSZXNwb25zZWBcbiAgICogaW5zdGFuY2UsIHlvdSBjYW4gdXNlIHtAbGluayB3aXRoUmVzcG9uc2UoKX0uXG4gICAqXG4gICAqIFx1RDgzRFx1REM0QiBHZXR0aW5nIHRoZSB3cm9uZyBUeXBlU2NyaXB0IHR5cGUgZm9yIGBSZXNwb25zZWA/XG4gICAqIFRyeSBzZXR0aW5nIGBcIm1vZHVsZVJlc29sdXRpb25cIjogXCJOb2RlTmV4dFwiYCBpZiB5b3UgY2FuLFxuICAgKiBvciBhZGQgb25lIG9mIHRoZXNlIGltcG9ydHMgYmVmb3JlIHlvdXIgZmlyc3QgYGltcG9ydCBcdTIwMjYgZnJvbSAnb3BlbmFpJ2A6XG4gICAqIC0gYGltcG9ydCAnb3BlbmFpL3NoaW1zL25vZGUnYCAoaWYgeW91J3JlIHJ1bm5pbmcgb24gTm9kZSlcbiAgICogLSBgaW1wb3J0ICdvcGVuYWkvc2hpbXMvd2ViJ2AgKG90aGVyd2lzZSlcbiAgICovXG4gIGFzUmVzcG9uc2UoKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlUHJvbWlzZS50aGVuKChwKSA9PiBwLnJlc3BvbnNlKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgcGFyc2VkIHJlc3BvbnNlIGRhdGEgYW5kIHRoZSByYXcgYFJlc3BvbnNlYCBpbnN0YW5jZS5cbiAgICpcbiAgICogSWYgeW91IGp1c3Qgd2FudCB0byBnZXQgdGhlIHJhdyBgUmVzcG9uc2VgIGluc3RhbmNlIHdpdGhvdXQgcGFyc2luZyBpdCxcbiAgICogeW91IGNhbiB1c2Uge0BsaW5rIGFzUmVzcG9uc2UoKX0uXG4gICAqXG4gICAqXG4gICAqIFx1RDgzRFx1REM0QiBHZXR0aW5nIHRoZSB3cm9uZyBUeXBlU2NyaXB0IHR5cGUgZm9yIGBSZXNwb25zZWA/XG4gICAqIFRyeSBzZXR0aW5nIGBcIm1vZHVsZVJlc29sdXRpb25cIjogXCJOb2RlTmV4dFwiYCBpZiB5b3UgY2FuLFxuICAgKiBvciBhZGQgb25lIG9mIHRoZXNlIGltcG9ydHMgYmVmb3JlIHlvdXIgZmlyc3QgYGltcG9ydCBcdTIwMjYgZnJvbSAnb3BlbmFpJ2A6XG4gICAqIC0gYGltcG9ydCAnb3BlbmFpL3NoaW1zL25vZGUnYCAoaWYgeW91J3JlIHJ1bm5pbmcgb24gTm9kZSlcbiAgICogLSBgaW1wb3J0ICdvcGVuYWkvc2hpbXMvd2ViJ2AgKG90aGVyd2lzZSlcbiAgICovXG4gIGFzeW5jIHdpdGhSZXNwb25zZSgpOiBQcm9taXNlPHsgZGF0YTogVDsgcmVzcG9uc2U6IFJlc3BvbnNlIH0+IHtcbiAgICBjb25zdCBbZGF0YSwgcmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMucGFyc2UoKSwgdGhpcy5hc1Jlc3BvbnNlKCldKTtcbiAgICByZXR1cm4geyBkYXRhLCByZXNwb25zZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZSgpOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIXRoaXMucGFyc2VkUHJvbWlzZSkge1xuICAgICAgdGhpcy5wYXJzZWRQcm9taXNlID0gdGhpcy5yZXNwb25zZVByb21pc2UudGhlbih0aGlzLnBhcnNlUmVzcG9uc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZWRQcm9taXNlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQgfCBQcm9taXNlTGlrZTxUUmVzdWx0PikgfCB1bmRlZmluZWQgfCBudWxsLFxuICApOiBQcm9taXNlPFQgfCBUUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKS5jYXRjaChvbnJlamVjdGVkKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZpbmFsbHkob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlKCkuZmluYWxseShvbmZpbmFsbHkpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBUElDbGllbnQge1xuICBiYXNlVVJMOiBzdHJpbmc7XG4gIG1heFJldHJpZXM6IG51bWJlcjtcbiAgdGltZW91dDogbnVtYmVyO1xuICBodHRwQWdlbnQ6IEFnZW50IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgZmV0Y2g6IEZldGNoO1xuICBwcm90ZWN0ZWQgaWRlbXBvdGVuY3lIZWFkZXI/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGJhc2VVUkwsXG4gICAgbWF4UmV0cmllcyA9IDIsXG4gICAgdGltZW91dCA9IDYwMDAwMCwgLy8gMTAgbWludXRlc1xuICAgIGh0dHBBZ2VudCxcbiAgICBmZXRjaDogb3ZlcnJpZGVuRmV0Y2gsXG4gIH06IHtcbiAgICBiYXNlVVJMOiBzdHJpbmc7XG4gICAgbWF4UmV0cmllcz86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICB0aW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgaHR0cEFnZW50OiBBZ2VudCB8IHVuZGVmaW5lZDtcbiAgICBmZXRjaDogRmV0Y2ggfCB1bmRlZmluZWQ7XG4gIH0pIHtcbiAgICB0aGlzLmJhc2VVUkwgPSBiYXNlVVJMO1xuICAgIHRoaXMubWF4UmV0cmllcyA9IHZhbGlkYXRlUG9zaXRpdmVJbnRlZ2VyKCdtYXhSZXRyaWVzJywgbWF4UmV0cmllcyk7XG4gICAgdGhpcy50aW1lb3V0ID0gdmFsaWRhdGVQb3NpdGl2ZUludGVnZXIoJ3RpbWVvdXQnLCB0aW1lb3V0KTtcbiAgICB0aGlzLmh0dHBBZ2VudCA9IGh0dHBBZ2VudDtcblxuICAgIHRoaXMuZmV0Y2ggPSBvdmVycmlkZW5GZXRjaCA/PyBmZXRjaDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhdXRoSGVhZGVycyhvcHRzOiBGaW5hbFJlcXVlc3RPcHRpb25zKTogSGVhZGVycyB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoaXMgdG8gYWRkIHlvdXIgb3duIGRlZmF1bHQgaGVhZGVycywgZm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB7XG4gICAqICAgIC4uLnN1cGVyLmRlZmF1bHRIZWFkZXJzKCksXG4gICAqICAgIEF1dGhvcml6YXRpb246ICdCZWFyZXIgMTIzJyxcbiAgICogIH1cbiAgICovXG4gIHByb3RlY3RlZCBkZWZhdWx0SGVhZGVycyhvcHRzOiBGaW5hbFJlcXVlc3RPcHRpb25zKTogSGVhZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdVc2VyLUFnZW50JzogdGhpcy5nZXRVc2VyQWdlbnQoKSxcbiAgICAgIC4uLmdldFBsYXRmb3JtSGVhZGVycygpLFxuICAgICAgLi4udGhpcy5hdXRoSGVhZGVycyhvcHRzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGRlZmF1bHRRdWVyeSgpOiBEZWZhdWx0UXVlcnkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoaXMgdG8gYWRkIHlvdXIgb3duIGhlYWRlcnMgdmFsaWRhdGlvbjpcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUhlYWRlcnMoaGVhZGVyczogSGVhZGVycywgY3VzdG9tSGVhZGVyczogSGVhZGVycykge31cblxuICBwcm90ZWN0ZWQgZGVmYXVsdElkZW1wb3RlbmN5S2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBzdGFpbmxlc3Mtbm9kZS1yZXRyeS0ke3V1aWQ0KCl9YDtcbiAgfVxuXG4gIGdldDxSZXEsIFJzcD4ocGF0aDogc3RyaW5nLCBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4pOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZFJlcXVlc3QoJ2dldCcsIHBhdGgsIG9wdHMpO1xuICB9XG5cbiAgcG9zdDxSZXEsIFJzcD4ocGF0aDogc3RyaW5nLCBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4pOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZFJlcXVlc3QoJ3Bvc3QnLCBwYXRoLCBvcHRzKTtcbiAgfVxuXG4gIHBhdGNoPFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgncGF0Y2gnLCBwYXRoLCBvcHRzKTtcbiAgfVxuXG4gIHB1dDxSZXEsIFJzcD4ocGF0aDogc3RyaW5nLCBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4pOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLm1ldGhvZFJlcXVlc3QoJ3B1dCcsIHBhdGgsIG9wdHMpO1xuICB9XG5cbiAgZGVsZXRlPFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgnZGVsZXRlJywgcGF0aCwgb3B0cyk7XG4gIH1cblxuICBwcml2YXRlIG1ldGhvZFJlcXVlc3Q8UmVxLCBSc3A+KFxuICAgIG1ldGhvZDogSFRUUE1ldGhvZCxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0cz86IFByb21pc2VPclZhbHVlPFJlcXVlc3RPcHRpb25zPFJlcT4+LFxuICApOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoUHJvbWlzZS5yZXNvbHZlKG9wdHMpLnRoZW4oKG9wdHMpID0+ICh7IG1ldGhvZCwgcGF0aCwgLi4ub3B0cyB9KSkpO1xuICB9XG5cbiAgZ2V0QVBJTGlzdDxJdGVtLCBQYWdlQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdFBhZ2U8SXRlbT4gPSBBYnN0cmFjdFBhZ2U8SXRlbT4+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBQYWdlOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBQYWdlQ2xhc3MsXG4gICAgb3B0cz86IFJlcXVlc3RPcHRpb25zPGFueT4sXG4gICk6IFBhZ2VQcm9taXNlPFBhZ2VDbGFzcywgSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RBUElMaXN0KFBhZ2UsIHsgbWV0aG9kOiAnZ2V0JywgcGF0aCwgLi4ub3B0cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQ29udGVudExlbmd0aChib2R5OiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChib2R5LCAndXRmOCcpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZXIuZW5jb2RlKGJvZHkpO1xuICAgICAgICByZXR1cm4gZW5jb2RlZC5sZW5ndGgudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGJ1aWxkUmVxdWVzdDxSZXE+KG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnM8UmVxPik6IHsgcmVxOiBSZXF1ZXN0SW5pdDsgdXJsOiBzdHJpbmc7IHRpbWVvdXQ6IG51bWJlciB9IHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCwgcXVlcnksIGhlYWRlcnM6IGhlYWRlcnMgPSB7fSB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGJvZHkgPVxuICAgICAgaXNNdWx0aXBhcnRCb2R5KG9wdGlvbnMuYm9keSkgPyBvcHRpb25zLmJvZHkuYm9keVxuICAgICAgOiBvcHRpb25zLmJvZHkgPyBKU09OLnN0cmluZ2lmeShvcHRpb25zLmJvZHksIG51bGwsIDIpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IHRoaXMuY2FsY3VsYXRlQ29udGVudExlbmd0aChib2R5KTtcblxuICAgIGNvbnN0IHVybCA9IHRoaXMuYnVpbGRVUkwocGF0aCEsIHF1ZXJ5KTtcbiAgICBpZiAoJ3RpbWVvdXQnIGluIG9wdGlvbnMpIHZhbGlkYXRlUG9zaXRpdmVJbnRlZ2VyKCd0aW1lb3V0Jywgb3B0aW9ucy50aW1lb3V0KTtcbiAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMudGltZW91dDtcbiAgICBjb25zdCBodHRwQWdlbnQgPSBvcHRpb25zLmh0dHBBZ2VudCA/PyB0aGlzLmh0dHBBZ2VudCA/PyBnZXREZWZhdWx0QWdlbnQodXJsKTtcbiAgICBjb25zdCBtaW5BZ2VudFRpbWVvdXQgPSB0aW1lb3V0ICsgMTAwMDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgKGh0dHBBZ2VudCBhcyBhbnkpPy5vcHRpb25zPy50aW1lb3V0ID09PSAnbnVtYmVyJyAmJlxuICAgICAgbWluQWdlbnRUaW1lb3V0ID4gKChodHRwQWdlbnQgYXMgYW55KS5vcHRpb25zLnRpbWVvdXQgPz8gMClcbiAgICApIHtcbiAgICAgIC8vIEFsbG93IGFueSBnaXZlbiByZXF1ZXN0IHRvIGJ1bXAgb3VyIGFnZW50IGFjdGl2ZSBzb2NrZXQgdGltZW91dC5cbiAgICAgIC8vIFRoaXMgbWF5IHNlZW0gc3RyYW5nZSwgYnV0IGxlYWtpbmcgYWN0aXZlIHNvY2tldHMgc2hvdWxkIGJlIHJhcmUgYW5kIG5vdCBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMsXG4gICAgICAvLyBhbmQgd2l0aG91dCBtdXRhdGluZyBhZ2VudCB3ZSB3b3VsZCBuZWVkIHRvIGNyZWF0ZSBtb3JlIG9mIHRoZW0uXG4gICAgICAvLyBUaGlzIHRyYWRlb2ZmIG9wdGltaXplcyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgICAoaHR0cEFnZW50IGFzIGFueSkub3B0aW9ucy50aW1lb3V0ID0gbWluQWdlbnRUaW1lb3V0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlkZW1wb3RlbmN5SGVhZGVyICYmIG1ldGhvZCAhPT0gJ2dldCcpIHtcbiAgICAgIGlmICghb3B0aW9ucy5pZGVtcG90ZW5jeUtleSkgb3B0aW9ucy5pZGVtcG90ZW5jeUtleSA9IHRoaXMuZGVmYXVsdElkZW1wb3RlbmN5S2V5KCk7XG4gICAgICBoZWFkZXJzW3RoaXMuaWRlbXBvdGVuY3lIZWFkZXJdID0gb3B0aW9ucy5pZGVtcG90ZW5jeUtleTtcbiAgICB9XG5cbiAgICBjb25zdCByZXFIZWFkZXJzID0gdGhpcy5idWlsZEhlYWRlcnMoeyBvcHRpb25zLCBoZWFkZXJzLCBjb250ZW50TGVuZ3RoIH0pO1xuXG4gICAgY29uc3QgcmVxOiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIC4uLihib2R5ICYmIHsgYm9keTogYm9keSBhcyBhbnkgfSksXG4gICAgICBoZWFkZXJzOiByZXFIZWFkZXJzLFxuICAgICAgLi4uKGh0dHBBZ2VudCAmJiB7IGFnZW50OiBodHRwQWdlbnQgfSksXG4gICAgICAvLyBAdHMtaWdub3JlIG5vZGUtZmV0Y2ggdXNlcyBhIGN1c3RvbSBBYm9ydFNpZ25hbCB0eXBlIHRoYXQgaXNcbiAgICAgIC8vIG5vdCBjb21wYXRpYmxlIHdpdGggc3RhbmRhcmQgd2ViIHR5cGVzXG4gICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsID8/IG51bGwsXG4gICAgfTtcblxuICAgIHJldHVybiB7IHJlcSwgdXJsLCB0aW1lb3V0IH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSGVhZGVycyh7XG4gICAgb3B0aW9ucyxcbiAgICBoZWFkZXJzLFxuICAgIGNvbnRlbnRMZW5ndGgsXG4gIH06IHtcbiAgICBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zO1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+O1xuICAgIGNvbnRlbnRMZW5ndGg6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIH0pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByZXFIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgaWYgKGNvbnRlbnRMZW5ndGgpIHtcbiAgICAgIHJlcUhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPSBjb250ZW50TGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycyhvcHRpb25zKTtcbiAgICBhcHBseUhlYWRlcnNNdXQocmVxSGVhZGVycywgZGVmYXVsdEhlYWRlcnMpO1xuICAgIGFwcGx5SGVhZGVyc011dChyZXFIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIC8vIGxldCBidWlsdGluIGZldGNoIHNldCB0aGUgQ29udGVudC1UeXBlIGZvciBtdWx0aXBhcnQgYm9kaWVzXG4gICAgaWYgKGlzTXVsdGlwYXJ0Qm9keShvcHRpb25zLmJvZHkpICYmIHNoaW1zS2luZCAhPT0gJ25vZGUnKSB7XG4gICAgICBkZWxldGUgcmVxSGVhZGVyc1snY29udGVudC10eXBlJ107XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZUhlYWRlcnMocmVxSGVhZGVycywgaGVhZGVycyk7XG5cbiAgICByZXR1cm4gcmVxSGVhZGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGFzIGEgY2FsbGJhY2sgZm9yIG11dGF0aW5nIHRoZSBnaXZlbiBgRmluYWxSZXF1ZXN0T3B0aW9uc2Agb2JqZWN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVPcHRpb25zKG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgLyoqXG4gICAqIFVzZWQgYXMgYSBjYWxsYmFjayBmb3IgbXV0YXRpbmcgdGhlIGdpdmVuIGBSZXF1ZXN0SW5pdGAgb2JqZWN0LlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2FzZXMgd2hlcmUgeW91IHdhbnQgdG8gYWRkIGNlcnRhaW4gaGVhZGVycyBiYXNlZCBvZmYgb2ZcbiAgICogdGhlIHJlcXVlc3QgcHJvcGVydGllcywgZS5nLiBgbWV0aG9kYCBvciBgdXJsYC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBwcmVwYXJlUmVxdWVzdChcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5pdCxcbiAgICB7IHVybCwgb3B0aW9ucyB9OiB7IHVybDogc3RyaW5nOyBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge31cblxuICBwcm90ZWN0ZWQgcGFyc2VIZWFkZXJzKGhlYWRlcnM6IEhlYWRlcnNJbml0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiAoXG4gICAgICAhaGVhZGVycyA/IHt9XG4gICAgICA6IFN5bWJvbC5pdGVyYXRvciBpbiBoZWFkZXJzID9cbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKEFycmF5LmZyb20oaGVhZGVycyBhcyBJdGVyYWJsZTxzdHJpbmdbXT4pLm1hcCgoaGVhZGVyKSA9PiBbLi4uaGVhZGVyXSkpXG4gICAgICA6IHsgLi4uaGVhZGVycyB9XG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYWtlU3RhdHVzRXJyb3IoXG4gICAgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZXJyb3I6IE9iamVjdCB8IHVuZGVmaW5lZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgcmV0dXJuIEFQSUVycm9yLmdlbmVyYXRlKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICB9XG5cbiAgcmVxdWVzdDxSZXEsIFJzcD4oXG4gICAgb3B0aW9uczogUHJvbWlzZU9yVmFsdWU8RmluYWxSZXF1ZXN0T3B0aW9uczxSZXE+PixcbiAgICByZW1haW5pbmdSZXRyaWVzOiBudW1iZXIgfCBudWxsID0gbnVsbCxcbiAgKTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gbmV3IEFQSVByb21pc2UodGhpcy5tYWtlUmVxdWVzdChvcHRpb25zLCByZW1haW5pbmdSZXRyaWVzKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1ha2VSZXF1ZXN0PFJlcT4oXG4gICAgb3B0aW9uc0lucHV0OiBQcm9taXNlT3JWYWx1ZTxGaW5hbFJlcXVlc3RPcHRpb25zPFJlcT4+LFxuICAgIHJldHJpZXNSZW1haW5pbmc6IG51bWJlciB8IG51bGwsXG4gICk6IFByb21pc2U8QVBJUmVzcG9uc2VQcm9wcz4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCBvcHRpb25zSW5wdXQ7XG4gICAgaWYgKHJldHJpZXNSZW1haW5pbmcgPT0gbnVsbCkge1xuICAgICAgcmV0cmllc1JlbWFpbmluZyA9IG9wdGlvbnMubWF4UmV0cmllcyA/PyB0aGlzLm1heFJldHJpZXM7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wcmVwYXJlT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIGNvbnN0IHsgcmVxLCB1cmwsIHRpbWVvdXQgfSA9IHRoaXMuYnVpbGRSZXF1ZXN0KG9wdGlvbnMpO1xuXG4gICAgYXdhaXQgdGhpcy5wcmVwYXJlUmVxdWVzdChyZXEsIHsgdXJsLCBvcHRpb25zIH0pO1xuXG4gICAgZGVidWcoJ3JlcXVlc3QnLCB1cmwsIG9wdGlvbnMsIHJlcS5oZWFkZXJzKTtcblxuICAgIGlmIChvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hXaXRoVGltZW91dCh1cmwsIHJlcSwgdGltZW91dCwgY29udHJvbGxlcikuY2F0Y2goY2FzdFRvRXJyb3IpO1xuXG4gICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmIChvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXRyaWVzUmVtYWluaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldHJ5UmVxdWVzdChvcHRpb25zLCByZXRyaWVzUmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwb25zZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBBUElDb25uZWN0aW9uRXJyb3IoeyBjYXVzZTogcmVzcG9uc2UgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gY3JlYXRlUmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgaWYgKHJldHJpZXNSZW1haW5pbmcgJiYgdGhpcy5zaG91bGRSZXRyeShyZXNwb25zZSkpIHtcbiAgICAgICAgY29uc3QgcmV0cnlNZXNzYWdlID0gYHJldHJ5aW5nLCAke3JldHJpZXNSZW1haW5pbmd9IGF0dGVtcHRzIHJlbWFpbmluZ2A7XG4gICAgICAgIGRlYnVnKGByZXNwb25zZSAoZXJyb3I7ICR7cmV0cnlNZXNzYWdlfSlgLCByZXNwb25zZS5zdGF0dXMsIHVybCwgcmVzcG9uc2VIZWFkZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlSZXF1ZXN0KG9wdGlvbnMsIHJldHJpZXNSZW1haW5pbmcsIHJlc3BvbnNlSGVhZGVycyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVyclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKGUpID0+IGNhc3RUb0Vycm9yKGUpLm1lc3NhZ2UpO1xuICAgICAgY29uc3QgZXJySlNPTiA9IHNhZmVKU09OKGVyclRleHQpO1xuICAgICAgY29uc3QgZXJyTWVzc2FnZSA9IGVyckpTT04gPyB1bmRlZmluZWQgOiBlcnJUZXh0O1xuICAgICAgY29uc3QgcmV0cnlNZXNzYWdlID0gcmV0cmllc1JlbWFpbmluZyA/IGAoZXJyb3I7IG5vIG1vcmUgcmV0cmllcyBsZWZ0KWAgOiBgKGVycm9yOyBub3QgcmV0cnlhYmxlKWA7XG5cbiAgICAgIGRlYnVnKGByZXNwb25zZSAoZXJyb3I7ICR7cmV0cnlNZXNzYWdlfSlgLCByZXNwb25zZS5zdGF0dXMsIHVybCwgcmVzcG9uc2VIZWFkZXJzLCBlcnJNZXNzYWdlKTtcblxuICAgICAgY29uc3QgZXJyID0gdGhpcy5tYWtlU3RhdHVzRXJyb3IocmVzcG9uc2Uuc3RhdHVzLCBlcnJKU09OLCBlcnJNZXNzYWdlLCByZXNwb25zZUhlYWRlcnMpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJlc3BvbnNlLCBvcHRpb25zLCBjb250cm9sbGVyIH07XG4gIH1cblxuICByZXF1ZXN0QVBJTGlzdDxJdGVtID0gdW5rbm93biwgUGFnZUNsYXNzIGV4dGVuZHMgQWJzdHJhY3RQYWdlPEl0ZW0+ID0gQWJzdHJhY3RQYWdlPEl0ZW0+PihcbiAgICBQYWdlOiBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgQWJzdHJhY3RQYWdlPikgPT4gUGFnZUNsYXNzLFxuICAgIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMsXG4gICk6IFBhZ2VQcm9taXNlPFBhZ2VDbGFzcywgSXRlbT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLm1ha2VSZXF1ZXN0KG9wdGlvbnMsIG51bGwpO1xuICAgIHJldHVybiBuZXcgUGFnZVByb21pc2U8UGFnZUNsYXNzLCBJdGVtPih0aGlzLCByZXF1ZXN0LCBQYWdlKTtcbiAgfVxuXG4gIGJ1aWxkVVJMPFJlcT4ocGF0aDogc3RyaW5nLCBxdWVyeTogUmVxIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsID1cbiAgICAgIGlzQWJzb2x1dGVVUkwocGF0aCkgP1xuICAgICAgICBuZXcgVVJMKHBhdGgpXG4gICAgICA6IG5ldyBVUkwodGhpcy5iYXNlVVJMICsgKHRoaXMuYmFzZVVSTC5lbmRzV2l0aCgnLycpICYmIHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aC5zbGljZSgxKSA6IHBhdGgpKTtcblxuICAgIGNvbnN0IGRlZmF1bHRRdWVyeSA9IHRoaXMuZGVmYXVsdFF1ZXJ5KCk7XG4gICAgaWYgKCFpc0VtcHR5T2JqKGRlZmF1bHRRdWVyeSkpIHtcbiAgICAgIHF1ZXJ5ID0geyAuLi5kZWZhdWx0UXVlcnksIC4uLnF1ZXJ5IH0gYXMgUmVxO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnICYmIHF1ZXJ5ICYmICFBcnJheS5pc0FycmF5KHF1ZXJ5KSkge1xuICAgICAgdXJsLnNlYXJjaCA9IHRoaXMuc3RyaW5naWZ5UXVlcnkocXVlcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdHJpbmdpZnlRdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhxdWVyeSlcbiAgICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHJldHVybiBgJHtlbmNvZGVVUklDb21wb25lbnQoa2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsdWUpfWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT1gO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHN0cmluZ2lmeSB0eXBlICR7dHlwZW9mIHZhbHVlfTsgRXhwZWN0ZWQgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG9yIG51bGwuIElmIHlvdSBuZWVkIHRvIHBhc3MgbmVzdGVkIHF1ZXJ5IHBhcmFtZXRlcnMsIHlvdSBjYW4gbWFudWFsbHkgZW5jb2RlIHRoZW0sIGUuZy4geyBxdWVyeTogeyAnZm9vW2tleTFdJzogdmFsdWUxLCAnZm9vW2tleTJdJzogdmFsdWUyIH0gfSwgYW5kIHBsZWFzZSBvcGVuIGEgR2l0SHViIGlzc3VlIHJlcXVlc3RpbmcgYmV0dGVyIHN1cHBvcnQgZm9yIHlvdXIgdXNlIGNhc2UuYCxcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAuam9pbignJicpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hXaXRoVGltZW91dChcbiAgICB1cmw6IFJlcXVlc3RJbmZvLFxuICAgIGluaXQ6IFJlcXVlc3RJbml0IHwgdW5kZWZpbmVkLFxuICAgIG1zOiBudW1iZXIsXG4gICAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBzaWduYWwsIC4uLm9wdGlvbnMgfSA9IGluaXQgfHwge307XG4gICAgaWYgKHNpZ25hbCkgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcblxuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgbXMpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZ2V0UmVxdWVzdENsaWVudCgpXG4gICAgICAgIC8vIHVzZSB1bmRlZmluZWQgdGhpcyBiaW5kaW5nOyBmZXRjaCBlcnJvcnMgaWYgYm91bmQgdG8gc29tZXRoaW5nIGVsc2UgaW4gYnJvd3Nlci9jbG91ZGZsYXJlXG4gICAgICAgIC5mZXRjaC5jYWxsKHVuZGVmaW5lZCwgdXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgYXMgYW55LCAuLi5vcHRpb25zIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZXF1ZXN0Q2xpZW50KCk6IFJlcXVlc3RDbGllbnQge1xuICAgIHJldHVybiB7IGZldGNoOiB0aGlzLmZldGNoIH07XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJldHJ5KHJlc3BvbnNlOiBSZXNwb25zZSk6IGJvb2xlYW4ge1xuICAgIC8vIE5vdGUgdGhpcyBpcyBub3QgYSBzdGFuZGFyZCBoZWFkZXIuXG4gICAgY29uc3Qgc2hvdWxkUmV0cnlIZWFkZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC1zaG91bGQtcmV0cnknKTtcblxuICAgIC8vIElmIHRoZSBzZXJ2ZXIgZXhwbGljaXRseSBzYXlzIHdoZXRoZXIgb3Igbm90IHRvIHJldHJ5LCBvYmV5LlxuICAgIGlmIChzaG91bGRSZXRyeUhlYWRlciA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoc2hvdWxkUmV0cnlIZWFkZXIgPT09ICdmYWxzZScpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJldHJ5IG9uIHJlcXVlc3QgdGltZW91dHMuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA4KSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFJldHJ5IG9uIGxvY2sgdGltZW91dHMuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA5KSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFJldHJ5IG9uIHJhdGUgbGltaXRzLlxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQyOSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBSZXRyeSBpbnRlcm5hbCBlcnJvcnMuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSA1MDApIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXRyeVJlcXVlc3QoXG4gICAgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucyxcbiAgICByZXRyaWVzUmVtYWluaW5nOiBudW1iZXIsXG4gICAgcmVzcG9uc2VIZWFkZXJzPzogSGVhZGVycyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBUElSZXNwb25zZVByb3BzPiB7XG4gICAgbGV0IHRpbWVvdXRNaWxsaXM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIC8vIE5vdGUgdGhlIGByZXRyeS1hZnRlci1tc2AgaGVhZGVyIG1heSBub3QgYmUgc3RhbmRhcmQsIGJ1dCBpcyBhIGdvb2QgaWRlYSBhbmQgd2UnZCBsaWtlIHByb2FjdGl2ZSBzdXBwb3J0IGZvciBpdC5cbiAgICBjb25zdCByZXRyeUFmdGVyTWlsbGlzSGVhZGVyID0gcmVzcG9uc2VIZWFkZXJzPy5bJ3JldHJ5LWFmdGVyLW1zJ107XG4gICAgaWYgKHJldHJ5QWZ0ZXJNaWxsaXNIZWFkZXIpIHtcbiAgICAgIGNvbnN0IHRpbWVvdXRNcyA9IHBhcnNlRmxvYXQocmV0cnlBZnRlck1pbGxpc0hlYWRlcik7XG4gICAgICBpZiAoIU51bWJlci5pc05hTih0aW1lb3V0TXMpKSB7XG4gICAgICAgIHRpbWVvdXRNaWxsaXMgPSB0aW1lb3V0TXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWJvdXQgdGhlIFJldHJ5LUFmdGVyIGhlYWRlcjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL1JldHJ5LUFmdGVyXG4gICAgY29uc3QgcmV0cnlBZnRlckhlYWRlciA9IHJlc3BvbnNlSGVhZGVycz8uWydyZXRyeS1hZnRlciddO1xuICAgIGlmIChyZXRyeUFmdGVySGVhZGVyICYmICF0aW1lb3V0TWlsbGlzKSB7XG4gICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IHBhcnNlRmxvYXQocmV0cnlBZnRlckhlYWRlcik7XG4gICAgICBpZiAoIU51bWJlci5pc05hTih0aW1lb3V0U2Vjb25kcykpIHtcbiAgICAgICAgdGltZW91dE1pbGxpcyA9IHRpbWVvdXRTZWNvbmRzICogMTAwMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVvdXRNaWxsaXMgPSBEYXRlLnBhcnNlKHJldHJ5QWZ0ZXJIZWFkZXIpIC0gRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgQVBJIGFza3MgdXMgdG8gd2FpdCBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUgKGFuZCBpdCdzIGEgcmVhc29uYWJsZSBhbW91bnQpLFxuICAgIC8vIGp1c3QgZG8gd2hhdCBpdCBzYXlzLCBidXQgb3RoZXJ3aXNlIGNhbGN1bGF0ZSBhIGRlZmF1bHRcbiAgICBpZiAoISh0aW1lb3V0TWlsbGlzICYmIDAgPD0gdGltZW91dE1pbGxpcyAmJiB0aW1lb3V0TWlsbGlzIDwgNjAgKiAxMDAwKSkge1xuICAgICAgY29uc3QgbWF4UmV0cmllcyA9IG9wdGlvbnMubWF4UmV0cmllcyA/PyB0aGlzLm1heFJldHJpZXM7XG4gICAgICB0aW1lb3V0TWlsbGlzID0gdGhpcy5jYWxjdWxhdGVEZWZhdWx0UmV0cnlUaW1lb3V0TWlsbGlzKHJldHJpZXNSZW1haW5pbmcsIG1heFJldHJpZXMpO1xuICAgIH1cbiAgICBhd2FpdCBzbGVlcCh0aW1lb3V0TWlsbGlzKTtcblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KG9wdGlvbnMsIHJldHJpZXNSZW1haW5pbmcgLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRGVmYXVsdFJldHJ5VGltZW91dE1pbGxpcyhyZXRyaWVzUmVtYWluaW5nOiBudW1iZXIsIG1heFJldHJpZXM6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaW5pdGlhbFJldHJ5RGVsYXkgPSAwLjU7XG4gICAgY29uc3QgbWF4UmV0cnlEZWxheSA9IDguMDtcblxuICAgIGNvbnN0IG51bVJldHJpZXMgPSBtYXhSZXRyaWVzIC0gcmV0cmllc1JlbWFpbmluZztcblxuICAgIC8vIEFwcGx5IGV4cG9uZW50aWFsIGJhY2tvZmYsIGJ1dCBub3QgbW9yZSB0aGFuIHRoZSBtYXguXG4gICAgY29uc3Qgc2xlZXBTZWNvbmRzID0gTWF0aC5taW4oaW5pdGlhbFJldHJ5RGVsYXkgKiBNYXRoLnBvdygyLCBudW1SZXRyaWVzKSwgbWF4UmV0cnlEZWxheSk7XG5cbiAgICAvLyBBcHBseSBzb21lIGppdHRlciwgdGFrZSB1cCB0byBhdCBtb3N0IDI1IHBlcmNlbnQgb2YgdGhlIHJldHJ5IHRpbWUuXG4gICAgY29uc3Qgaml0dGVyID0gMSAtIE1hdGgucmFuZG9tKCkgKiAwLjI1O1xuXG4gICAgcmV0dXJuIHNsZWVwU2Vjb25kcyAqIGppdHRlciAqIDEwMDA7XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJBZ2VudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9L0pTICR7VkVSU0lPTn1gO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFBhZ2VJbmZvID0geyB1cmw6IFVSTCB9IHwgeyBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB9O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYWdlPEl0ZW0+IGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxJdGVtPiB7XG4gICNjbGllbnQ6IEFQSUNsaWVudDtcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnM7XG5cbiAgcHJvdGVjdGVkIHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgcHJvdGVjdGVkIGJvZHk6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBBUElDbGllbnQsIHJlc3BvbnNlOiBSZXNwb25zZSwgYm9keTogdW5rbm93biwgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucykge1xuICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0aGlzLmJvZHkgPSBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBuZXh0UGFnZUluZm8gaW5zdGVhZFxuICAgKi9cbiAgYWJzdHJhY3QgbmV4dFBhZ2VQYXJhbXMoKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCBudWxsO1xuICBhYnN0cmFjdCBuZXh0UGFnZUluZm8oKTogUGFnZUluZm8gfCBudWxsO1xuXG4gIGFic3RyYWN0IGdldFBhZ2luYXRlZEl0ZW1zKCk6IEl0ZW1bXTtcblxuICBoYXNOZXh0UGFnZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0UGFnaW5hdGVkSXRlbXMoKTtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLm5leHRQYWdlSW5mbygpICE9IG51bGw7XG4gIH1cblxuICBhc3luYyBnZXROZXh0UGFnZSgpOiBQcm9taXNlPHRoaXM+IHtcbiAgICBjb25zdCBuZXh0SW5mbyA9IHRoaXMubmV4dFBhZ2VJbmZvKCk7XG4gICAgaWYgKCFuZXh0SW5mbykge1xuICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFxuICAgICAgICAnTm8gbmV4dCBwYWdlIGV4cGVjdGVkOyBwbGVhc2UgY2hlY2sgYC5oYXNOZXh0UGFnZSgpYCBiZWZvcmUgY2FsbGluZyBgLmdldE5leHRQYWdlKClgLicsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBuZXh0T3B0aW9ucyA9IHsgLi4udGhpcy5vcHRpb25zIH07XG4gICAgaWYgKCdwYXJhbXMnIGluIG5leHRJbmZvICYmIHR5cGVvZiBuZXh0T3B0aW9ucy5xdWVyeSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG5leHRPcHRpb25zLnF1ZXJ5ID0geyAuLi5uZXh0T3B0aW9ucy5xdWVyeSwgLi4ubmV4dEluZm8ucGFyYW1zIH07XG4gICAgfSBlbHNlIGlmICgndXJsJyBpbiBuZXh0SW5mbykge1xuICAgICAgY29uc3QgcGFyYW1zID0gWy4uLk9iamVjdC5lbnRyaWVzKG5leHRPcHRpb25zLnF1ZXJ5IHx8IHt9KSwgLi4ubmV4dEluZm8udXJsLnNlYXJjaFBhcmFtcy5lbnRyaWVzKCldO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcGFyYW1zKSB7XG4gICAgICAgIG5leHRJbmZvLnVybC5zZWFyY2hQYXJhbXMuc2V0KGtleSwgdmFsdWUgYXMgYW55KTtcbiAgICAgIH1cbiAgICAgIG5leHRPcHRpb25zLnF1ZXJ5ID0gdW5kZWZpbmVkO1xuICAgICAgbmV4dE9wdGlvbnMucGF0aCA9IG5leHRJbmZvLnVybC50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy4jY2xpZW50LnJlcXVlc3RBUElMaXN0KHRoaXMuY29uc3RydWN0b3IgYXMgYW55LCBuZXh0T3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyAqaXRlclBhZ2VzKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIGxldCBwYWdlOiBBYnN0cmFjdFBhZ2U8SXRlbT4gPSB0aGlzO1xuICAgIHlpZWxkIHBhZ2U7XG4gICAgd2hpbGUgKHBhZ2UuaGFzTmV4dFBhZ2UoKSkge1xuICAgICAgcGFnZSA9IGF3YWl0IHBhZ2UuZ2V0TmV4dFBhZ2UoKTtcbiAgICAgIHlpZWxkIHBhZ2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBwYWdlIG9mIHRoaXMuaXRlclBhZ2VzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYWdlLmdldFBhZ2luYXRlZEl0ZW1zKCkpIHtcbiAgICAgICAgeWllbGQgaXRlbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIHN1YmNsYXNzIG9mIFByb21pc2Ugd2lsbCByZXNvbHZlIHRvIGFuIGluc3RhbnRpYXRlZCBQYWdlIG9uY2UgdGhlIHJlcXVlc3QgY29tcGxldGVzLlxuICpcbiAqIEl0IGFsc28gaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlIHRvIGFsbG93IGF1dG8tcGFnaW5hdGluZyBpdGVyYXRpb24gb24gYW4gdW5hd2FpdGVkIGxpc3QgY2FsbCwgZWc6XG4gKlxuICogICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGNsaWVudC5pdGVtcy5saXN0KCkpIHtcbiAqICAgICAgY29uc29sZS5sb2coaXRlbSlcbiAqICAgIH1cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VQcm9taXNlPFxuICAgIFBhZ2VDbGFzcyBleHRlbmRzIEFic3RyYWN0UGFnZTxJdGVtPixcbiAgICBJdGVtID0gUmV0dXJuVHlwZTxQYWdlQ2xhc3NbJ2dldFBhZ2luYXRlZEl0ZW1zJ10+W251bWJlcl0sXG4gID5cbiAgZXh0ZW5kcyBBUElQcm9taXNlPFBhZ2VDbGFzcz5cbiAgaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPEl0ZW0+XG57XG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogQVBJQ2xpZW50LFxuICAgIHJlcXVlc3Q6IFByb21pc2U8QVBJUmVzcG9uc2VQcm9wcz4sXG4gICAgUGFnZTogbmV3ICguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIEFic3RyYWN0UGFnZT4pID0+IFBhZ2VDbGFzcyxcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICByZXF1ZXN0LFxuICAgICAgYXN5bmMgKHByb3BzKSA9PiBuZXcgUGFnZShjbGllbnQsIHByb3BzLnJlc3BvbnNlLCBhd2FpdCBkZWZhdWx0UGFyc2VSZXNwb25zZShwcm9wcyksIHByb3BzLm9wdGlvbnMpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgYXV0by1wYWdpbmF0aW5nIGl0ZXJhdGlvbiBvbiBhbiB1bmF3YWl0ZWQgbGlzdCBjYWxsLCBlZzpcbiAgICpcbiAgICogICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGNsaWVudC5pdGVtcy5saXN0KCkpIHtcbiAgICogICAgICBjb25zb2xlLmxvZyhpdGVtKVxuICAgKiAgICB9XG4gICAqL1xuICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICBjb25zdCBwYWdlID0gYXdhaXQgdGhpcztcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgcGFnZSkge1xuICAgICAgeWllbGQgaXRlbTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlc3BvbnNlSGVhZGVycyA9IChcbiAgaGVhZGVyczogQXdhaXRlZDxSZXR1cm5UeXBlPEZldGNoPj5bJ2hlYWRlcnMnXSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICByZXR1cm4gbmV3IFByb3h5KFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGhlYWRlcnMuZW50cmllcygpLFxuICAgICksXG4gICAge1xuICAgICAgZ2V0KHRhcmdldCwgbmFtZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBuYW1lLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB0YXJnZXRba2V5LnRvTG93ZXJDYXNlKCldIHx8IHRhcmdldFtrZXldO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xufTtcblxudHlwZSBIVFRQTWV0aG9kID0gJ2dldCcgfCAncG9zdCcgfCAncHV0JyB8ICdwYXRjaCcgfCAnZGVsZXRlJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdENsaWVudCA9IHsgZmV0Y2g6IEZldGNoIH07XG5leHBvcnQgdHlwZSBIZWFkZXJzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD47XG5leHBvcnQgdHlwZSBEZWZhdWx0UXVlcnkgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuZXhwb3J0IHR5cGUgS2V5c0VudW08VD4gPSB7IFtQIGluIGtleW9mIFJlcXVpcmVkPFQ+XTogdHJ1ZSB9O1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0T3B0aW9uczxSZXEgPSB1bmtub3duIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBSZWFkYWJsZT4gPSB7XG4gIG1ldGhvZD86IEhUVFBNZXRob2Q7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHF1ZXJ5PzogUmVxIHwgdW5kZWZpbmVkO1xuICBib2R5PzogUmVxIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgaGVhZGVycz86IEhlYWRlcnMgfCB1bmRlZmluZWQ7XG5cbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgc3RyZWFtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgaHR0cEFnZW50PzogQWdlbnQ7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmc7XG5cbiAgX19iaW5hcnlSZXNwb25zZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIF9fc3RyZWFtQ2xhc3M/OiB0eXBlb2YgU3RyZWFtO1xufTtcblxuLy8gVGhpcyBpcyByZXF1aXJlZCBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgYSBnaXZlbiBvYmplY3QgbWF0Y2hlcyB0aGUgUmVxdWVzdE9wdGlvbnNcbi8vIHR5cGUgYXQgcnVudGltZS4gV2hpbGUgdGhpcyByZXF1aXJlcyBkdXBsaWNhdGlvbiwgaXQgaXMgZW5mb3JjZWQgYnkgdGhlIFR5cGVTY3JpcHRcbi8vIGNvbXBpbGVyIHN1Y2ggdGhhdCBhbnkgbWlzc2luZyAvIGV4dHJhbmVvdXMga2V5cyB3aWxsIGNhdXNlIGFuIGVycm9yLlxuY29uc3QgcmVxdWVzdE9wdGlvbnNLZXlzOiBLZXlzRW51bTxSZXF1ZXN0T3B0aW9ucz4gPSB7XG4gIG1ldGhvZDogdHJ1ZSxcbiAgcGF0aDogdHJ1ZSxcbiAgcXVlcnk6IHRydWUsXG4gIGJvZHk6IHRydWUsXG4gIGhlYWRlcnM6IHRydWUsXG5cbiAgbWF4UmV0cmllczogdHJ1ZSxcbiAgc3RyZWFtOiB0cnVlLFxuICB0aW1lb3V0OiB0cnVlLFxuICBodHRwQWdlbnQ6IHRydWUsXG4gIHNpZ25hbDogdHJ1ZSxcbiAgaWRlbXBvdGVuY3lLZXk6IHRydWUsXG5cbiAgX19iaW5hcnlSZXNwb25zZTogdHJ1ZSxcbiAgX19zdHJlYW1DbGFzczogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBpc1JlcXVlc3RPcHRpb25zID0gKG9iajogdW5rbm93bik6IG9iaiBpcyBSZXF1ZXN0T3B0aW9ucyA9PiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICBvYmogIT09IG51bGwgJiZcbiAgICAhaXNFbXB0eU9iaihvYmopICYmXG4gICAgT2JqZWN0LmtleXMob2JqKS5ldmVyeSgoaykgPT4gaGFzT3duKHJlcXVlc3RPcHRpb25zS2V5cywgaykpXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBGaW5hbFJlcXVlc3RPcHRpb25zPFJlcSA9IHVua25vd24gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFJlYWRhYmxlPiA9IFJlcXVlc3RPcHRpb25zPFJlcT4gJiB7XG4gIG1ldGhvZDogSFRUUE1ldGhvZDtcbiAgcGF0aDogc3RyaW5nO1xufTtcblxuZGVjbGFyZSBjb25zdCBEZW5vOiBhbnk7XG5kZWNsYXJlIGNvbnN0IEVkZ2VSdW50aW1lOiBhbnk7XG50eXBlIEFyY2ggPSAneDMyJyB8ICd4NjQnIHwgJ2FybScgfCAnYXJtNjQnIHwgYG90aGVyOiR7c3RyaW5nfWAgfCAndW5rbm93bic7XG50eXBlIFBsYXRmb3JtTmFtZSA9XG4gIHwgJ01hY09TJ1xuICB8ICdMaW51eCdcbiAgfCAnV2luZG93cydcbiAgfCAnRnJlZUJTRCdcbiAgfCAnT3BlbkJTRCdcbiAgfCAnaU9TJ1xuICB8ICdBbmRyb2lkJ1xuICB8IGBPdGhlcjoke3N0cmluZ31gXG4gIHwgJ1Vua25vd24nO1xudHlwZSBCcm93c2VyID0gJ2llJyB8ICdlZGdlJyB8ICdjaHJvbWUnIHwgJ2ZpcmVmb3gnIHwgJ3NhZmFyaSc7XG50eXBlIFBsYXRmb3JtUHJvcGVydGllcyA9IHtcbiAgJ1gtU3RhaW5sZXNzLUxhbmcnOiAnanMnO1xuICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogc3RyaW5nO1xuICAnWC1TdGFpbmxlc3MtT1MnOiBQbGF0Zm9ybU5hbWU7XG4gICdYLVN0YWlubGVzcy1BcmNoJzogQXJjaDtcbiAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUnOiAnbm9kZScgfCAnZGVubycgfCAnZWRnZScgfCBgYnJvd3Nlcjoke0Jyb3dzZXJ9YCB8ICd1bmtub3duJztcbiAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6IHN0cmluZztcbn07XG5jb25zdCBnZXRQbGF0Zm9ybVByb3BlcnRpZXMgPSAoKTogUGxhdGZvcm1Qcm9wZXJ0aWVzID0+IHtcbiAgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJyAmJiBEZW5vLmJ1aWxkICE9IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ1gtU3RhaW5sZXNzLUxhbmcnOiAnanMnLFxuICAgICAgJ1gtU3RhaW5sZXNzLVBhY2thZ2UtVmVyc2lvbic6IFZFUlNJT04sXG4gICAgICAnWC1TdGFpbmxlc3MtT1MnOiBub3JtYWxpemVQbGF0Zm9ybShEZW5vLmJ1aWxkLm9zKSxcbiAgICAgICdYLVN0YWlubGVzcy1BcmNoJzogbm9ybWFsaXplQXJjaChEZW5vLmJ1aWxkLmFyY2gpLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUnOiAnZGVubycsXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzpcbiAgICAgICAgdHlwZW9mIERlbm8udmVyc2lvbiA9PT0gJ3N0cmluZycgPyBEZW5vLnZlcnNpb24gOiBEZW5vLnZlcnNpb24/LmRlbm8gPz8gJ3Vua25vd24nLFxuICAgIH07XG4gIH1cbiAgaWYgKHR5cGVvZiBFZGdlUnVudGltZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ1gtU3RhaW5sZXNzLUxhbmcnOiAnanMnLFxuICAgICAgJ1gtU3RhaW5sZXNzLVBhY2thZ2UtVmVyc2lvbic6IFZFUlNJT04sXG4gICAgICAnWC1TdGFpbmxlc3MtT1MnOiAnVW5rbm93bicsXG4gICAgICAnWC1TdGFpbmxlc3MtQXJjaCc6IGBvdGhlcjoke0VkZ2VSdW50aW1lfWAsXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZSc6ICdlZGdlJyxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lLVZlcnNpb24nOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgfTtcbiAgfVxuICAvLyBDaGVjayBpZiBOb2RlLmpzXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnID8gcHJvY2VzcyA6IDApID09PSAnW29iamVjdCBwcm9jZXNzXScpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ1gtU3RhaW5sZXNzLUxhbmcnOiAnanMnLFxuICAgICAgJ1gtU3RhaW5sZXNzLVBhY2thZ2UtVmVyc2lvbic6IFZFUlNJT04sXG4gICAgICAnWC1TdGFpbmxlc3MtT1MnOiBub3JtYWxpemVQbGF0Zm9ybShwcm9jZXNzLnBsYXRmb3JtKSxcbiAgICAgICdYLVN0YWlubGVzcy1BcmNoJzogbm9ybWFsaXplQXJjaChwcm9jZXNzLmFyY2gpLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUnOiAnbm9kZScsXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzogcHJvY2Vzcy52ZXJzaW9uLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBicm93c2VySW5mbyA9IGdldEJyb3dzZXJJbmZvKCk7XG4gIGlmIChicm93c2VySW5mbykge1xuICAgIHJldHVybiB7XG4gICAgICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcycsXG4gICAgICAnWC1TdGFpbmxlc3MtUGFja2FnZS1WZXJzaW9uJzogVkVSU0lPTixcbiAgICAgICdYLVN0YWlubGVzcy1PUyc6ICdVbmtub3duJyxcbiAgICAgICdYLVN0YWlubGVzcy1BcmNoJzogJ3Vua25vd24nLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUnOiBgYnJvd3Nlcjoke2Jyb3dzZXJJbmZvLmJyb3dzZXJ9YCxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lLVZlcnNpb24nOiBicm93c2VySW5mby52ZXJzaW9uLFxuICAgIH07XG4gIH1cblxuICAvLyBUT0RPIGFkZCBzdXBwb3J0IGZvciBDbG91ZGZsYXJlIHdvcmtlcnMsIGV0Yy5cbiAgcmV0dXJuIHtcbiAgICAnWC1TdGFpbmxlc3MtTGFuZyc6ICdqcycsXG4gICAgJ1gtU3RhaW5sZXNzLVBhY2thZ2UtVmVyc2lvbic6IFZFUlNJT04sXG4gICAgJ1gtU3RhaW5sZXNzLU9TJzogJ1Vua25vd24nLFxuICAgICdYLVN0YWlubGVzcy1BcmNoJzogJ3Vua25vd24nLFxuICAgICdYLVN0YWlubGVzcy1SdW50aW1lJzogJ3Vua25vd24nLFxuICAgICdYLVN0YWlubGVzcy1SdW50aW1lLVZlcnNpb24nOiAndW5rbm93bicsXG4gIH07XG59O1xuXG50eXBlIEJyb3dzZXJJbmZvID0ge1xuICBicm93c2VyOiBCcm93c2VyO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59O1xuXG5kZWNsYXJlIGNvbnN0IG5hdmlnYXRvcjogeyB1c2VyQWdlbnQ6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXG4vLyBOb3RlOiBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9KUy1EZXZUb29scy9ob3N0LWVudmlyb25tZW50L2Jsb2IvYjFhYjc5ZWNkZTM3ZGI1ZDZlMTYzYzA1MGU1NGZlN2QyODdkN2M5Mi9zcmMvaXNvbW9ycGhpYy5icm93c2VyLnRzXG5mdW5jdGlvbiBnZXRCcm93c2VySW5mbygpOiBCcm93c2VySW5mbyB8IG51bGwge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcgfHwgIW5hdmlnYXRvcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gTk9URTogVGhlIG9yZGVyIG1hdHRlcnMgaGVyZSFcbiAgY29uc3QgYnJvd3NlclBhdHRlcm5zID0gW1xuICAgIHsga2V5OiAnZWRnZScgYXMgY29uc3QsIHBhdHRlcm46IC9FZGdlKD86XFxXKyhcXGQrKVxcLihcXGQrKSg/OlxcLihcXGQrKSk/KT8vIH0sXG4gICAgeyBrZXk6ICdpZScgYXMgY29uc3QsIHBhdHRlcm46IC9NU0lFKD86XFxXKyhcXGQrKVxcLihcXGQrKSg/OlxcLihcXGQrKSk/KT8vIH0sXG4gICAgeyBrZXk6ICdpZScgYXMgY29uc3QsIHBhdHRlcm46IC9UcmlkZW50KD86LipydlxcOihcXGQrKVxcLihcXGQrKSg/OlxcLihcXGQrKSk/KT8vIH0sXG4gICAgeyBrZXk6ICdjaHJvbWUnIGFzIGNvbnN0LCBwYXR0ZXJuOiAvQ2hyb21lKD86XFxXKyhcXGQrKVxcLihcXGQrKSg/OlxcLihcXGQrKSk/KT8vIH0sXG4gICAgeyBrZXk6ICdmaXJlZm94JyBhcyBjb25zdCwgcGF0dGVybjogL0ZpcmVmb3goPzpcXFcrKFxcZCspXFwuKFxcZCspKD86XFwuKFxcZCspKT8pPy8gfSxcbiAgICB7IGtleTogJ3NhZmFyaScgYXMgY29uc3QsIHBhdHRlcm46IC8oPzpWZXJzaW9uXFxXKyhcXGQrKVxcLihcXGQrKSg/OlxcLihcXGQrKSk/KT8oPzpcXFcrTW9iaWxlXFxTKik/XFxXK1NhZmFyaS8gfSxcbiAgXTtcblxuICAvLyBGaW5kIHRoZSBGSVJTVCBtYXRjaGluZyBicm93c2VyXG4gIGZvciAoY29uc3QgeyBrZXksIHBhdHRlcm4gfSBvZiBicm93c2VyUGF0dGVybnMpIHtcbiAgICBjb25zdCBtYXRjaCA9IHBhdHRlcm4uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IG1ham9yID0gbWF0Y2hbMV0gfHwgMDtcbiAgICAgIGNvbnN0IG1pbm9yID0gbWF0Y2hbMl0gfHwgMDtcbiAgICAgIGNvbnN0IHBhdGNoID0gbWF0Y2hbM10gfHwgMDtcblxuICAgICAgcmV0dXJuIHsgYnJvd3Nlcjoga2V5LCB2ZXJzaW9uOiBgJHttYWpvcn0uJHttaW5vcn0uJHtwYXRjaH1gIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IG5vcm1hbGl6ZUFyY2ggPSAoYXJjaDogc3RyaW5nKTogQXJjaCA9PiB7XG4gIC8vIE5vZGUgZG9jczpcbiAgLy8gLSBodHRwczovL25vZGVqcy5vcmcvYXBpL3Byb2Nlc3MuaHRtbCNwcm9jZXNzYXJjaFxuICAvLyBEZW5vIGRvY3M6XG4gIC8vIC0gaHR0cHM6Ly9kb2MuZGVuby5sYW5kL2Rlbm8vc3RhYmxlL34vRGVuby5idWlsZFxuICBpZiAoYXJjaCA9PT0gJ3gzMicpIHJldHVybiAneDMyJztcbiAgaWYgKGFyY2ggPT09ICd4ODZfNjQnIHx8IGFyY2ggPT09ICd4NjQnKSByZXR1cm4gJ3g2NCc7XG4gIGlmIChhcmNoID09PSAnYXJtJykgcmV0dXJuICdhcm0nO1xuICBpZiAoYXJjaCA9PT0gJ2FhcmNoNjQnIHx8IGFyY2ggPT09ICdhcm02NCcpIHJldHVybiAnYXJtNjQnO1xuICBpZiAoYXJjaCkgcmV0dXJuIGBvdGhlcjoke2FyY2h9YDtcbiAgcmV0dXJuICd1bmtub3duJztcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZVBsYXRmb3JtID0gKHBsYXRmb3JtOiBzdHJpbmcpOiBQbGF0Zm9ybU5hbWUgPT4ge1xuICAvLyBOb2RlIHBsYXRmb3JtczpcbiAgLy8gLSBodHRwczovL25vZGVqcy5vcmcvYXBpL3Byb2Nlc3MuaHRtbCNwcm9jZXNzcGxhdGZvcm1cbiAgLy8gRGVubyBwbGF0Zm9ybXM6XG4gIC8vIC0gaHR0cHM6Ly9kb2MuZGVuby5sYW5kL2Rlbm8vc3RhYmxlL34vRGVuby5idWlsZFxuICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9kZW5vbGFuZC9kZW5vL2lzc3Vlcy8xNDc5OVxuXG4gIHBsYXRmb3JtID0gcGxhdGZvcm0udG9Mb3dlckNhc2UoKTtcblxuICAvLyBOT1RFOiB0aGlzIGlPUyBjaGVjayBpcyB1bnRlc3RlZCBhbmQgbWF5IG5vdCB3b3JrXG4gIC8vIE5vZGUgZG9lcyBub3Qgd29yayBuYXRpdmVseSBvbiBJT1MsIHRoZXJlIGlzIGEgZm9yayBhdFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzLW1vYmlsZS9ub2RlanMtbW9iaWxlXG4gIC8vIGhvd2V2ZXIgaXQgaXMgdW5rbm93biBhdCB0aGUgdGltZSBvZiB3cml0aW5nIGhvdyB0byBkZXRlY3QgaWYgaXQgaXMgcnVubmluZ1xuICBpZiAocGxhdGZvcm0uaW5jbHVkZXMoJ2lvcycpKSByZXR1cm4gJ2lPUyc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKSByZXR1cm4gJ0FuZHJvaWQnO1xuICBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSByZXR1cm4gJ01hY09TJztcbiAgaWYgKHBsYXRmb3JtID09PSAnd2luMzInKSByZXR1cm4gJ1dpbmRvd3MnO1xuICBpZiAocGxhdGZvcm0gPT09ICdmcmVlYnNkJykgcmV0dXJuICdGcmVlQlNEJztcbiAgaWYgKHBsYXRmb3JtID09PSAnb3BlbmJzZCcpIHJldHVybiAnT3BlbkJTRCc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ2xpbnV4JykgcmV0dXJuICdMaW51eCc7XG4gIGlmIChwbGF0Zm9ybSkgcmV0dXJuIGBPdGhlcjoke3BsYXRmb3JtfWA7XG4gIHJldHVybiAnVW5rbm93bic7XG59O1xuXG5sZXQgX3BsYXRmb3JtSGVhZGVyczogUGxhdGZvcm1Qcm9wZXJ0aWVzO1xuY29uc3QgZ2V0UGxhdGZvcm1IZWFkZXJzID0gKCkgPT4ge1xuICByZXR1cm4gKF9wbGF0Zm9ybUhlYWRlcnMgPz89IGdldFBsYXRmb3JtUHJvcGVydGllcygpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzYWZlSlNPTiA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE5NzA5ODQ2XG5jb25zdCBzdGFydHNXaXRoU2NoZW1lUmVnZXhwID0gbmV3IFJlZ0V4cCgnXig/OlthLXpdKzopPy8vJywgJ2knKTtcbmNvbnN0IGlzQWJzb2x1dGVVUkwgPSAodXJsOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIHN0YXJ0c1dpdGhTY2hlbWVSZWdleHAudGVzdCh1cmwpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbmNvbnN0IHZhbGlkYXRlUG9zaXRpdmVJbnRlZ2VyID0gKG5hbWU6IHN0cmluZywgbjogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIobikpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhbiBpbnRlZ2VyYCk7XG4gIH1cbiAgaWYgKG4gPCAwKSB7XG4gICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyYCk7XG4gIH1cbiAgcmV0dXJuIG47XG59O1xuXG5leHBvcnQgY29uc3QgY2FzdFRvRXJyb3IgPSAoZXJyOiBhbnkpOiBFcnJvciA9PiB7XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGVycjtcbiAgcmV0dXJuIG5ldyBFcnJvcihlcnIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuc3VyZVByZXNlbnQgPSA8VD4odmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogVCA9PiB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYEV4cGVjdGVkIGEgdmFsdWUgdG8gYmUgZ2l2ZW4gYnV0IHJlY2VpdmVkICR7dmFsdWV9IGluc3RlYWQuYCk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogUmVhZCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqXG4gKiBUcmltcyBiZWdpbm5pbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4gKlxuICogV2lsbCByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbm5vdCBiZSBhY2Nlc3NlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlYWRFbnYgPSAoZW52OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52Py5bZW52XT8udHJpbSgpID8/IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZW9mIERlbm8gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIERlbm8uZW52Py5nZXQ/LihlbnYpPy50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBjb25zdCBjb2VyY2VJbnRlZ2VyID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xuXG4gIHRocm93IG5ldyBPcGVuQUlFcnJvcihgQ291bGQgbm90IGNvZXJjZSAke3ZhbHVlfSAodHlwZTogJHt0eXBlb2YgdmFsdWV9KSBpbnRvIGEgbnVtYmVyYCk7XG59O1xuXG5leHBvcnQgY29uc3QgY29lcmNlRmxvYXQgPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gIHRocm93IG5ldyBPcGVuQUlFcnJvcihgQ291bGQgbm90IGNvZXJjZSAke3ZhbHVlfSAodHlwZTogJHt0eXBlb2YgdmFsdWV9KSBpbnRvIGEgbnVtYmVyYCk7XG59O1xuXG5leHBvcnQgY29uc3QgY29lcmNlQm9vbGVhbiA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICByZXR1cm4gQm9vbGVhbih2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbWF5YmVDb2VyY2VJbnRlZ2VyID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjb2VyY2VJbnRlZ2VyKHZhbHVlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBtYXliZUNvZXJjZUZsb2F0ID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjb2VyY2VGbG9hdCh2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbWF5YmVDb2VyY2VCb29sZWFuID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY29lcmNlQm9vbGVhbih2YWx1ZSk7XG59O1xuXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzQ0OTEyODdcbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5T2JqKG9iajogT2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW9iaikgcmV0dXJuIHRydWU7XG4gIGZvciAoY29uc3QgX2sgaW4gb2JqKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBodHRwczovL2VzbGludC5vcmcvZG9jcy9sYXRlc3QvcnVsZXMvbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duKG9iajogT2JqZWN0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgaGVhZGVycyBmcm9tIFwibmV3SGVhZGVyc1wiIG9udG8gXCJ0YXJnZXRIZWFkZXJzXCIsXG4gKiB1c2luZyBsb3dlci1jYXNlIGZvciBhbGwgcHJvcGVydGllcyxcbiAqIGlnbm9yaW5nIGFueSBrZXlzIHdpdGggdW5kZWZpbmVkIHZhbHVlcyxcbiAqIGFuZCBkZWxldGluZyBhbnkga2V5cyB3aXRoIG51bGwgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBhcHBseUhlYWRlcnNNdXQodGFyZ2V0SGVhZGVyczogSGVhZGVycywgbmV3SGVhZGVyczogSGVhZGVycyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGsgaW4gbmV3SGVhZGVycykge1xuICAgIGlmICghaGFzT3duKG5ld0hlYWRlcnMsIGspKSBjb250aW51ZTtcbiAgICBjb25zdCBsb3dlcktleSA9IGsudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIWxvd2VyS2V5KSBjb250aW51ZTtcblxuICAgIGNvbnN0IHZhbCA9IG5ld0hlYWRlcnNba107XG5cbiAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICBkZWxldGUgdGFyZ2V0SGVhZGVyc1tsb3dlcktleV07XG4gICAgfSBlbHNlIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0SGVhZGVyc1tsb3dlcktleV0gPSB2YWw7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1ZyhhY3Rpb246IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzPy5lbnY/LlsnREVCVUcnXSA9PT0gJ3RydWUnKSB7XG4gICAgY29uc29sZS5sb2coYE9wZW5BSTpERUJVRzoke2FjdGlvbn1gLCAuLi5hcmdzKTtcbiAgfVxufVxuXG4vKipcbiAqIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMTE3NTIzXG4gKi9cbmNvbnN0IHV1aWQ0ID0gKCkgPT4ge1xuICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7XG4gICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1J1bm5pbmdJbkJyb3dzZXIgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnXG4gICk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlcnNQcm90b2NvbCB7XG4gIGdldDogKGhlYWRlcjogc3RyaW5nKSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xufVxuZXhwb3J0IHR5cGUgSGVhZGVyc0xpa2UgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4gfCBIZWFkZXJzUHJvdG9jb2w7XG5cbmV4cG9ydCBjb25zdCBpc0hlYWRlcnNQcm90b2NvbCA9IChoZWFkZXJzOiBhbnkpOiBoZWFkZXJzIGlzIEhlYWRlcnNQcm90b2NvbCA9PiB7XG4gIHJldHVybiB0eXBlb2YgaGVhZGVycz8uZ2V0ID09PSAnZnVuY3Rpb24nO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlcXVpcmVkSGVhZGVyID0gKGhlYWRlcnM6IEhlYWRlcnNMaWtlLCBoZWFkZXI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGxvd2VyQ2FzZWRIZWFkZXIgPSBoZWFkZXIudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGlzSGVhZGVyc1Byb3RvY29sKGhlYWRlcnMpKSB7XG4gICAgLy8gdG8gZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZSBoZWFkZXIgbG9va3MgbGlrZSBTdGFpbmxlc3MtRXZlbnQtSWRcbiAgICBjb25zdCBpbnRlcmNhcHNIZWFkZXIgPVxuICAgICAgaGVhZGVyWzBdPy50b1VwcGVyQ2FzZSgpICtcbiAgICAgIGhlYWRlci5zdWJzdHJpbmcoMSkucmVwbGFjZSgvKFteXFx3XSkoXFx3KS9nLCAoX20sIGcxLCBnMikgPT4gZzEgKyBnMi50b1VwcGVyQ2FzZSgpKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbaGVhZGVyLCBsb3dlckNhc2VkSGVhZGVyLCBoZWFkZXIudG9VcHBlckNhc2UoKSwgaW50ZXJjYXBzSGVhZGVyXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXJzLmdldChrZXkpO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gbG93ZXJDYXNlZEhlYWRlcikge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPD0gMSkgcmV0dXJuIHZhbHVlWzBdO1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlY2VpdmVkICR7dmFsdWUubGVuZ3RofSBlbnRyaWVzIGZvciB0aGUgJHtoZWFkZXJ9IGhlYWRlciwgdXNpbmcgdGhlIGZpcnN0IGVudHJ5LmApO1xuICAgICAgICByZXR1cm4gdmFsdWVbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCAke2hlYWRlcn0gaGVhZGVyYCk7XG59O1xuXG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgdG8gQmFzZTY0IGZvcm1hdC5cbiAqL1xuZXhwb3J0IGNvbnN0IHRvQmFzZTY0ID0gKHN0cjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gIGlmICghc3RyKSByZXR1cm4gJyc7XG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzdHIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYnRvYSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gYnRvYShzdHIpO1xuICB9XG5cbiAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKCdDYW5ub3QgZ2VuZXJhdGUgYjY0IHN0cmluZzsgRXhwZWN0ZWQgYEJ1ZmZlcmAgb3IgYGJ0b2FgIHRvIGJlIGRlZmluZWQnKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iaihvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqKTtcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgeyBBYnN0cmFjdFBhZ2UsIFJlc3BvbnNlLCBBUElDbGllbnQsIEZpbmFsUmVxdWVzdE9wdGlvbnMsIFBhZ2VJbmZvIH0gZnJvbSAnLi9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWdlUmVzcG9uc2U8SXRlbT4ge1xuICBkYXRhOiBBcnJheTxJdGVtPjtcblxuICBvYmplY3Q6IHN0cmluZztcbn1cblxuLyoqXG4gKiBOb3RlOiBubyBwYWdpbmF0aW9uIGFjdHVhbGx5IG9jY3VycyB5ZXQsIHRoaXMgaXMgZm9yIGZvcndhcmRzLWNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlPEl0ZW0+IGV4dGVuZHMgQWJzdHJhY3RQYWdlPEl0ZW0+IGltcGxlbWVudHMgUGFnZVJlc3BvbnNlPEl0ZW0+IHtcbiAgZGF0YTogQXJyYXk8SXRlbT47XG5cbiAgb2JqZWN0OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBBUElDbGllbnQsIHJlc3BvbnNlOiBSZXNwb25zZSwgYm9keTogUGFnZVJlc3BvbnNlPEl0ZW0+LCBvcHRpb25zOiBGaW5hbFJlcXVlc3RPcHRpb25zKSB7XG4gICAgc3VwZXIoY2xpZW50LCByZXNwb25zZSwgYm9keSwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmRhdGEgPSBib2R5LmRhdGEgfHwgW107XG4gICAgdGhpcy5vYmplY3QgPSBib2R5Lm9iamVjdDtcbiAgfVxuXG4gIGdldFBhZ2luYXRlZEl0ZW1zKCk6IEl0ZW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/PyBbXTtcbiAgfVxuXG4gIC8vIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgYG5leHRQYWdlSW5mbygpYCBpbnN0ZWFkXG4gIC8qKlxuICAgKiBUaGlzIHBhZ2UgcmVwcmVzZW50cyBhIHJlc3BvbnNlIHRoYXQgaXNuJ3QgYWN0dWFsbHkgcGFnaW5hdGVkIGF0IHRoZSBBUEkgbGV2ZWxcbiAgICogc28gdGhlcmUgd2lsbCBuZXZlciBiZSBhbnkgbmV4dCBwYWdlIHBhcmFtcy5cbiAgICovXG4gIG5leHRQYWdlUGFyYW1zKCk6IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbmV4dFBhZ2VJbmZvKCk6IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Vyc29yUGFnZVJlc3BvbnNlPEl0ZW0+IHtcbiAgZGF0YTogQXJyYXk8SXRlbT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3Vyc29yUGFnZVBhcmFtcyB7XG4gIGFmdGVyPzogc3RyaW5nO1xuXG4gIGxpbWl0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQ3Vyc29yUGFnZTxJdGVtIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0+XG4gIGV4dGVuZHMgQWJzdHJhY3RQYWdlPEl0ZW0+XG4gIGltcGxlbWVudHMgQ3Vyc29yUGFnZVJlc3BvbnNlPEl0ZW0+XG57XG4gIGRhdGE6IEFycmF5PEl0ZW0+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudDogQVBJQ2xpZW50LFxuICAgIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgICBib2R5OiBDdXJzb3JQYWdlUmVzcG9uc2U8SXRlbT4sXG4gICAgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucyxcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50LCByZXNwb25zZSwgYm9keSwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmRhdGEgPSBib2R5LmRhdGEgfHwgW107XG4gIH1cblxuICBnZXRQYWdpbmF0ZWRJdGVtcygpOiBJdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPz8gW107XG4gIH1cblxuICAvLyBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIGBuZXh0UGFnZUluZm8oKWAgaW5zdGVhZFxuICBuZXh0UGFnZVBhcmFtcygpOiBQYXJ0aWFsPEN1cnNvclBhZ2VQYXJhbXM+IHwgbnVsbCB7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMubmV4dFBhZ2VJbmZvKCk7XG4gICAgaWYgKCFpbmZvKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoJ3BhcmFtcycgaW4gaW5mbykgcmV0dXJuIGluZm8ucGFyYW1zO1xuICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5mcm9tRW50cmllcyhpbmZvLnVybC5zZWFyY2hQYXJhbXMpO1xuICAgIGlmICghT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBuZXh0UGFnZUluZm8oKTogUGFnZUluZm8gfCBudWxsIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRQYWdpbmF0ZWRJdGVtcygpO1xuICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdPy5pZDtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4geyBwYXJhbXM6IHsgYWZ0ZXI6IGlkIH0gfTtcbiAgfVxufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB0eXBlIHsgT3BlbkFJIH0gZnJvbSAnLi9pbmRleCc7XG5cbmV4cG9ydCBjbGFzcyBBUElSZXNvdXJjZSB7XG4gIHByb3RlY3RlZCBfY2xpZW50OiBPcGVuQUk7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBPcGVuQUkpIHtcbiAgICB0aGlzLl9jbGllbnQgPSBjbGllbnQ7XG4gIH1cbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElQcm9taXNlIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgKiBhcyBDaGF0Q29tcGxldGlvbnNBUEkgZnJvbSBcIi4vY29tcGxldGlvbnNcIjtcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gXCIuLi9jb21wbGV0aW9uc1wiO1xuaW1wb3J0ICogYXMgU2hhcmVkIGZyb20gXCIuLi9zaGFyZWRcIjtcbmltcG9ydCAqIGFzIENoYXRBUEkgZnJvbSBcIi4vY2hhdFwiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4uLy4uL3N0cmVhbWluZ1wiO1xuXG5leHBvcnQgY2xhc3MgQ29tcGxldGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbW9kZWwgcmVzcG9uc2UgZm9yIHRoZSBnaXZlbiBjaGF0IGNvbnZlcnNhdGlvbi5cbiAgICovXG4gIGNyZWF0ZShcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxDaGF0Q29tcGxldGlvbj47XG4gIGNyZWF0ZShcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08Q2hhdENvbXBsZXRpb25DaHVuaz4+O1xuICBjcmVhdGUoXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPiB8IENoYXRDb21wbGV0aW9uPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPENoYXRDb21wbGV0aW9uPiB8IEFQSVByb21pc2U8U3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvY2hhdC9jb21wbGV0aW9ucycsIHsgYm9keSwgLi4ub3B0aW9ucywgc3RyZWFtOiBib2R5LnN0cmVhbSA/PyBmYWxzZSB9KSBhc1xuICAgICAgfCBBUElQcm9taXNlPENoYXRDb21wbGV0aW9uPlxuICAgICAgfCBBUElQcm9taXNlPFN0cmVhbTxDaGF0Q29tcGxldGlvbkNodW5rPj47XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2hhdCBjb21wbGV0aW9uIHJlc3BvbnNlIHJldHVybmVkIGJ5IG1vZGVsLCBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIGlucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjaGF0IGNvbXBsZXRpb24uXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY2hhdCBjb21wbGV0aW9uIGNob2ljZXMuIENhbiBiZSBtb3JlIHRoYW4gb25lIGlmIGBuYCBpcyBncmVhdGVyXG4gICAqIHRoYW4gMS5cbiAgICovXG4gIGNob2ljZXM6IEFycmF5PENoYXRDb21wbGV0aW9uLkNob2ljZT47XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgb2Ygd2hlbiB0aGUgY2hhdCBjb21wbGV0aW9uIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgdXNlZCBmb3IgdGhlIGNoYXQgY29tcGxldGlvbi5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBjaGF0LmNvbXBsZXRpb25gLlxuICAgKi9cbiAgb2JqZWN0OiAnY2hhdC5jb21wbGV0aW9uJztcblxuICAvKipcbiAgICogVGhpcyBmaW5nZXJwcmludCByZXByZXNlbnRzIHRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgbW9kZWwgcnVucyB3aXRoLlxuICAgKlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgc2VlZGAgcmVxdWVzdCBwYXJhbWV0ZXIgdG8gdW5kZXJzdGFuZCB3aGVuXG4gICAqIGJhY2tlbmQgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0aGF0IG1pZ2h0IGltcGFjdCBkZXRlcm1pbmlzbS5cbiAgICovXG4gIHN5c3RlbV9maW5nZXJwcmludD86IHN0cmluZztcblxuICAvKipcbiAgICogVXNhZ2Ugc3RhdGlzdGljcyBmb3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdC5cbiAgICovXG4gIHVzYWdlPzogQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvblVzYWdlO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gdGhlIG1vZGVsIHN0b3BwZWQgZ2VuZXJhdGluZyB0b2tlbnMuIFRoaXMgd2lsbCBiZSBgc3RvcGAgaWYgdGhlIG1vZGVsXG4gICAgICogaGl0IGEgbmF0dXJhbCBzdG9wIHBvaW50IG9yIGEgcHJvdmlkZWQgc3RvcCBzZXF1ZW5jZSwgYGxlbmd0aGAgaWYgdGhlIG1heGltdW1cbiAgICAgKiBudW1iZXIgb2YgdG9rZW5zIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgcmVhY2hlZCwgYGNvbnRlbnRfZmlsdGVyYCBpZlxuICAgICAqIGNvbnRlbnQgd2FzIG9taXR0ZWQgZHVlIHRvIGEgZmxhZyBmcm9tIG91ciBjb250ZW50IGZpbHRlcnMsIGB0b29sX2NhbGxzYCBpZiB0aGVcbiAgICAgKiBtb2RlbCBjYWxsZWQgYSB0b29sLCBvciBgZnVuY3Rpb25fY2FsbGAgKGRlcHJlY2F0ZWQpIGlmIHRoZSBtb2RlbCBjYWxsZWQgYVxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZpbmlzaF9yZWFzb246ICdzdG9wJyB8ICdsZW5ndGgnIHwgJ3Rvb2xfY2FsbHMnIHwgJ2NvbnRlbnRfZmlsdGVyJyB8ICdmdW5jdGlvbl9jYWxsJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hvaWNlIGluIHRoZSBsaXN0IG9mIGNob2ljZXMuXG4gICAgICovXG4gICAgaW5kZXg6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIExvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNob2ljZS5cbiAgICAgKi9cbiAgICBsb2dwcm9iczogQ2hvaWNlLkxvZ3Byb2JzIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICAgKi9cbiAgICBtZXNzYWdlOiBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIExvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNob2ljZS5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIExvZ3Byb2JzIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIG1lc3NhZ2UgY29udGVudCB0b2tlbnMgd2l0aCBsb2cgcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24uXG4gICAgICAgKi9cbiAgICAgIGNvbnRlbnQ6IEFycmF5PENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYj4gfCBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIFRoZSByb2xlIG9mIHRoZSBtZXNzYWdlcyBhdXRob3IsIGluIHRoaXMgY2FzZSBgYXNzaXN0YW50YC5cbiAgICovXG4gIHJvbGU6ICdhc3Npc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIGFzc2lzdGFudCBtZXNzYWdlLiBSZXF1aXJlZCB1bmxlc3MgYHRvb2xfY2FsbHNgIG9yXG4gICAqIGBmdW5jdGlvbl9jYWxsYCBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICBjb250ZW50Pzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQ6IERlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5IGB0b29sX2NhbGxzYC4gVGhlIG5hbWUgYW5kIGFyZ3VtZW50cyBvZlxuICAgKiBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICovXG4gIGZ1bmN0aW9uX2NhbGw/OiBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbS5GdW5jdGlvbkNhbGw7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSBwYXJ0aWNpcGFudC4gUHJvdmlkZXMgdGhlIG1vZGVsIGluZm9ybWF0aW9uIHRvXG4gICAqIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBwYXJ0aWNpcGFudHMgb2YgdGhlIHNhbWUgcm9sZS5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIGNhbGxzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwsIHN1Y2ggYXMgZnVuY3Rpb24gY2FsbHMuXG4gICAqL1xuICB0b29sX2NhbGxzPzogQXJyYXk8Q2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uQ2FsbCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgKiBoYWxsdWNpbmF0ZSBwYXJhbWV0ZXJzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgZnVuY3Rpb24gc2NoZW1hLiBWYWxpZGF0ZSB0aGVcbiAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgYXJndW1lbnRzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc3RyZWFtZWQgY2h1bmsgb2YgYSBjaGF0IGNvbXBsZXRpb24gcmVzcG9uc2UgcmV0dXJuZWQgYnkgbW9kZWwsXG4gKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DaHVuayB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2hhdCBjb21wbGV0aW9uLiBFYWNoIGNodW5rIGhhcyB0aGUgc2FtZSBJRC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjaGF0IGNvbXBsZXRpb24gY2hvaWNlcy4gQ2FuIGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBlbGVtZW50cyBpZiBgbmAgaXNcbiAgICogZ3JlYXRlciB0aGFuIDEuIENhbiBhbHNvIGJlIGVtcHR5IGZvciB0aGUgbGFzdCBjaHVuayBpZiB5b3Ugc2V0XG4gICAqIGBzdHJlYW1fb3B0aW9uczoge1wiaW5jbHVkZV91c2FnZVwiOiB0cnVlfWAuXG4gICAqL1xuICBjaG9pY2VzOiBBcnJheTxDaGF0Q29tcGxldGlvbkNodW5rLkNob2ljZT47XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgb2Ygd2hlbiB0aGUgY2hhdCBjb21wbGV0aW9uIHdhcyBjcmVhdGVkLiBFYWNoXG4gICAqIGNodW5rIGhhcyB0aGUgc2FtZSB0aW1lc3RhbXAuXG4gICAqL1xuICBjcmVhdGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byBnZW5lcmF0ZSB0aGUgY29tcGxldGlvbi5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBjaGF0LmNvbXBsZXRpb24uY2h1bmtgLlxuICAgKi9cbiAgb2JqZWN0OiAnY2hhdC5jb21wbGV0aW9uLmNodW5rJztcblxuICAvKipcbiAgICogVGhpcyBmaW5nZXJwcmludCByZXByZXNlbnRzIHRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgbW9kZWwgcnVucyB3aXRoLlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgc2VlZGAgcmVxdWVzdCBwYXJhbWV0ZXIgdG8gdW5kZXJzdGFuZCB3aGVuXG4gICAqIGJhY2tlbmQgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0aGF0IG1pZ2h0IGltcGFjdCBkZXRlcm1pbmlzbS5cbiAgICovXG4gIHN5c3RlbV9maW5nZXJwcmludD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgZmllbGQgdGhhdCB3aWxsIG9ubHkgYmUgcHJlc2VudCB3aGVuIHlvdSBzZXRcbiAgICogYHN0cmVhbV9vcHRpb25zOiB7XCJpbmNsdWRlX3VzYWdlXCI6IHRydWV9YCBpbiB5b3VyIHJlcXVlc3QuIFdoZW4gcHJlc2VudCwgaXRcbiAgICogY29udGFpbnMgYSBudWxsIHZhbHVlIGV4Y2VwdCBmb3IgdGhlIGxhc3QgY2h1bmsgd2hpY2ggY29udGFpbnMgdGhlIHRva2VuIHVzYWdlXG4gICAqIHN0YXRpc3RpY3MgZm9yIHRoZSBlbnRpcmUgcmVxdWVzdC5cbiAgICovXG4gIHVzYWdlPzogQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvblVzYWdlO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uQ2h1bmsge1xuICBleHBvcnQgaW50ZXJmYWNlIENob2ljZSB7XG4gICAgLyoqXG4gICAgICogQSBjaGF0IGNvbXBsZXRpb24gZGVsdGEgZ2VuZXJhdGVkIGJ5IHN0cmVhbWVkIG1vZGVsIHJlc3BvbnNlcy5cbiAgICAgKi9cbiAgICBkZWx0YTogQ2hvaWNlLkRlbHRhO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB0aGUgbW9kZWwgc3RvcHBlZCBnZW5lcmF0aW5nIHRva2Vucy4gVGhpcyB3aWxsIGJlIGBzdG9wYCBpZiB0aGUgbW9kZWxcbiAgICAgKiBoaXQgYSBuYXR1cmFsIHN0b3AgcG9pbnQgb3IgYSBwcm92aWRlZCBzdG9wIHNlcXVlbmNlLCBgbGVuZ3RoYCBpZiB0aGUgbWF4aW11bVxuICAgICAqIG51bWJlciBvZiB0b2tlbnMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyByZWFjaGVkLCBgY29udGVudF9maWx0ZXJgIGlmXG4gICAgICogY29udGVudCB3YXMgb21pdHRlZCBkdWUgdG8gYSBmbGFnIGZyb20gb3VyIGNvbnRlbnQgZmlsdGVycywgYHRvb2xfY2FsbHNgIGlmIHRoZVxuICAgICAqIG1vZGVsIGNhbGxlZCBhIHRvb2wsIG9yIGBmdW5jdGlvbl9jYWxsYCAoZGVwcmVjYXRlZCkgaWYgdGhlIG1vZGVsIGNhbGxlZCBhXG4gICAgICogZnVuY3Rpb24uXG4gICAgICovXG4gICAgZmluaXNoX3JlYXNvbjogJ3N0b3AnIHwgJ2xlbmd0aCcgfCAndG9vbF9jYWxscycgfCAnY29udGVudF9maWx0ZXInIHwgJ2Z1bmN0aW9uX2NhbGwnIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY2hvaWNlIGluIHRoZSBsaXN0IG9mIGNob2ljZXMuXG4gICAgICovXG4gICAgaW5kZXg6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIExvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNob2ljZS5cbiAgICAgKi9cbiAgICBsb2dwcm9icz86IENob2ljZS5Mb2dwcm9icyB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIENob2ljZSB7XG4gICAgLyoqXG4gICAgICogQSBjaGF0IGNvbXBsZXRpb24gZGVsdGEgZ2VuZXJhdGVkIGJ5IHN0cmVhbWVkIG1vZGVsIHJlc3BvbnNlcy5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIERlbHRhIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBjaHVuayBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBjb250ZW50Pzogc3RyaW5nIHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVwcmVjYXRlZDogRGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgYHRvb2xfY2FsbHNgLiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mXG4gICAgICAgKiBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb25fY2FsbD86IERlbHRhLkZ1bmN0aW9uQ2FsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgcm9sZSBvZiB0aGUgYXV0aG9yIG9mIHRoaXMgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgcm9sZT86ICdzeXN0ZW0nIHwgJ3VzZXInIHwgJ2Fzc2lzdGFudCcgfCAndG9vbCc7XG5cbiAgICAgIHRvb2xfY2FsbHM/OiBBcnJheTxEZWx0YS5Ub29sQ2FsbD47XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBEZWx0YSB7XG4gICAgICAvKipcbiAgICAgICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICAgICAqIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgICAgICovXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uQ2FsbCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgaW4gSlNPTlxuICAgICAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICAgICAqIGFyZ3VtZW50cyBpbiB5b3VyIGNvZGUgYmVmb3JlIGNhbGxpbmcgeW91ciBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFyZ3VtZW50cz86IHN0cmluZztcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgaW50ZXJmYWNlIFRvb2xDYWxsIHtcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwuXG4gICAgICAgICAqL1xuICAgICAgICBpZD86IHN0cmluZztcblxuICAgICAgICBmdW5jdGlvbj86IFRvb2xDYWxsLkZ1bmN0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9vbC4gQ3VycmVudGx5LCBvbmx5IGBmdW5jdGlvbmAgaXMgc3VwcG9ydGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdHlwZT86ICdmdW5jdGlvbic7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBuYW1lc3BhY2UgVG9vbENhbGwge1xuICAgICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgaW4gSlNPTlxuICAgICAgICAgICAqIGZvcm1hdC4gTm90ZSB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBhbHdheXMgZ2VuZXJhdGUgdmFsaWQgSlNPTiwgYW5kIG1heVxuICAgICAgICAgICAqIGhhbGx1Y2luYXRlIHBhcmFtZXRlcnMgbm90IGRlZmluZWQgYnkgeW91ciBmdW5jdGlvbiBzY2hlbWEuIFZhbGlkYXRlIHRoZVxuICAgICAgICAgICAqIGFyZ3VtZW50cyBpbiB5b3VyIGNvZGUgYmVmb3JlIGNhbGxpbmcgeW91ciBmdW5jdGlvbi5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9nIHByb2JhYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgY2hvaWNlLlxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9ncHJvYnMge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgbWVzc2FnZSBjb250ZW50IHRva2VucyB3aXRoIGxvZyBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbi5cbiAgICAgICAqL1xuICAgICAgY29udGVudDogQXJyYXk8Q2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iPiB8IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uQ29udGVudFBhcnQgPSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dCB8IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2Uge1xuICBpbWFnZV91cmw6IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZS5JbWFnZVVSTDtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGNvbnRlbnQgcGFydC5cbiAgICovXG4gIHR5cGU6ICdpbWFnZV91cmwnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VVUkwge1xuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIFVSTCBvZiB0aGUgaW1hZ2Ugb3IgdGhlIGJhc2U2NCBlbmNvZGVkIGltYWdlIGRhdGEuXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGRldGFpbCBsZXZlbCBvZiB0aGUgaW1hZ2UuIExlYXJuIG1vcmUgaW4gdGhlXG4gICAgICogW1Zpc2lvbiBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3Zpc2lvbi9sb3ctb3ItaGlnaC1maWRlbGl0eS1pbWFnZS11bmRlcnN0YW5kaW5nKS5cbiAgICAgKi9cbiAgICBkZXRhaWw/OiAnYXV0bycgfCAnbG93JyB8ICdoaWdoJztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRUZXh0IHtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGNvbnRlbnQuXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBjb250ZW50IHBhcnQuXG4gICAqL1xuICB0eXBlOiAndGV4dCc7XG59XG5cbi8qKlxuICogU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gdmlhIGB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn1gIGZvcmNlcyB0aGUgbW9kZWxcbiAqIHRvIGNhbGwgdGhhdCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW0ge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBmdW5jdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIG9mIHRoZSBtZXNzYWdlcyBhdXRob3IsIGluIHRoaXMgY2FzZSBgZnVuY3Rpb25gLlxuICAgKi9cbiAgcm9sZTogJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBBIGNoYXQgY29tcGxldGlvbiBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25NZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIG9mIHRoZSBhdXRob3Igb2YgdGhpcyBtZXNzYWdlLlxuICAgKi9cbiAgcm9sZTogJ2Fzc2lzdGFudCc7XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAqL1xuICBmdW5jdGlvbl9jYWxsPzogQ2hhdENvbXBsZXRpb25NZXNzYWdlLkZ1bmN0aW9uQ2FsbDtcblxuICAvKipcbiAgICogVGhlIHRvb2wgY2FsbHMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCwgc3VjaCBhcyBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHRvb2xfY2FsbHM/OiBBcnJheTxDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbD47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb25NZXNzYWdlIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkOiBEZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieSBgdG9vbF9jYWxsc2AuIFRoZSBuYW1lIGFuZCBhcmd1bWVudHMgb2ZcbiAgICogYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uQ2FsbCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoLCBhcyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIGluIEpTT05cbiAgICAgKiBmb3JtYXQuIE5vdGUgdGhhdCB0aGUgbW9kZWwgZG9lcyBub3QgYWx3YXlzIGdlbmVyYXRlIHZhbGlkIEpTT04sIGFuZCBtYXlcbiAgICAgKiBoYWxsdWNpbmF0ZSBwYXJhbWV0ZXJzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgZnVuY3Rpb24gc2NoZW1hLiBWYWxpZGF0ZSB0aGVcbiAgICAgKiBhcmd1bWVudHMgaW4geW91ciBjb2RlIGJlZm9yZSBjYWxsaW5nIHlvdXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgYXJndW1lbnRzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gPVxuICB8IENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtXG4gIHwgQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtXG4gIHwgQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW1cbiAgfCBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW1cbiAgfCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgdGhlIG1vZGVsIGNhbGxlZC5cbiAgICovXG4gIGZ1bmN0aW9uOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbC5GdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIHRvb2wuIEN1cnJlbnRseSwgb25seSBgZnVuY3Rpb25gIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIHR5cGU6ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgdGhlIG1vZGVsIGNhbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBpbiBKU09OXG4gICAgICogZm9ybWF0LiBOb3RlIHRoYXQgdGhlIG1vZGVsIGRvZXMgbm90IGFsd2F5cyBnZW5lcmF0ZSB2YWxpZCBKU09OLCBhbmQgbWF5XG4gICAgICogaGFsbHVjaW5hdGUgcGFyYW1ldGVycyBub3QgZGVmaW5lZCBieSB5b3VyIGZ1bmN0aW9uIHNjaGVtYS4gVmFsaWRhdGUgdGhlXG4gICAgICogYXJndW1lbnRzIGluIHlvdXIgY29kZSBiZWZvcmUgY2FsbGluZyB5b3VyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGFyZ3VtZW50czogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIGEgdG9vbCB0aGUgbW9kZWwgc2hvdWxkIHVzZS4gVXNlIHRvIGZvcmNlIHRoZSBtb2RlbCB0byBjYWxsIGEgc3BlY2lmaWNcbiAqIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlIHtcbiAgZnVuY3Rpb246IENoYXRDb21wbGV0aW9uTmFtZWRUb29sQ2hvaWNlLkZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9vbC4gQ3VycmVudGx5LCBvbmx5IGBmdW5jdGlvbmAgaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb2xlIG9mIHRoZSBhdXRob3Igb2YgYSBtZXNzYWdlXG4gKi9cbmV4cG9ydCB0eXBlIENoYXRDb21wbGV0aW9uUm9sZSA9ICdzeXN0ZW0nIHwgJ3VzZXInIHwgJ2Fzc2lzdGFudCcgfCAndG9vbCcgfCAnZnVuY3Rpb24nO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0cmVhbWluZyByZXNwb25zZS4gT25seSBzZXQgdGhpcyB3aGVuIHlvdSBzZXQgYHN0cmVhbTogdHJ1ZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHNldCwgYW4gYWRkaXRpb25hbCBjaHVuayB3aWxsIGJlIHN0cmVhbWVkIGJlZm9yZSB0aGUgYGRhdGE6IFtET05FXWAgbWVzc2FnZS5cbiAgICogVGhlIGB1c2FnZWAgZmllbGQgb24gdGhpcyBjaHVuayBzaG93cyB0aGUgdG9rZW4gdXNhZ2Ugc3RhdGlzdGljcyBmb3IgdGhlIGVudGlyZVxuICAgKiByZXF1ZXN0LCBhbmQgdGhlIGBjaG9pY2VzYCBmaWVsZCB3aWxsIGFsd2F5cyBiZSBhbiBlbXB0eSBhcnJheS4gQWxsIG90aGVyIGNodW5rc1xuICAgKiB3aWxsIGFsc28gaW5jbHVkZSBhIGB1c2FnZWAgZmllbGQsIGJ1dCB3aXRoIGEgbnVsbCB2YWx1ZS5cbiAgICovXG4gIGluY2x1ZGVfdXNhZ2U/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgc3lzdGVtIG1lc3NhZ2UuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb2xlIG9mIHRoZSBtZXNzYWdlcyBhdXRob3IsIGluIHRoaXMgY2FzZSBgc3lzdGVtYC5cbiAgICovXG4gIHJvbGU6ICdzeXN0ZW0nO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcGFydGljaXBhbnQuIFByb3ZpZGVzIHRoZSBtb2RlbCBpbmZvcm1hdGlvbiB0b1xuICAgKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcGFydGljaXBhbnRzIG9mIHRoZSBzYW1lIHJvbGUuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iIHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbi5cbiAgICovXG4gIHRva2VuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBpbnRlZ2VycyByZXByZXNlbnRpbmcgdGhlIFVURi04IGJ5dGVzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbi5cbiAgICogVXNlZnVsIGluIGluc3RhbmNlcyB3aGVyZSBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSBtdWx0aXBsZSB0b2tlbnMgYW5kXG4gICAqIHRoZWlyIGJ5dGUgcmVwcmVzZW50YXRpb25zIG11c3QgYmUgY29tYmluZWQgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgdGV4dFxuICAgKiByZXByZXNlbnRhdGlvbi4gQ2FuIGJlIGBudWxsYCBpZiB0aGVyZSBpcyBubyBieXRlcyByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHRva2VuLlxuICAgKi9cbiAgYnl0ZXM6IEFycmF5PG51bWJlcj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nIHByb2JhYmlsaXR5IG9mIHRoaXMgdG9rZW4sIGlmIGl0IGlzIHdpdGhpbiB0aGUgdG9wIDIwIG1vc3QgbGlrZWx5XG4gICAqIHRva2Vucy4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYC05OTk5LjBgIGlzIHVzZWQgdG8gc2lnbmlmeSB0aGF0IHRoZSB0b2tlbiBpcyB2ZXJ5XG4gICAqIHVubGlrZWx5LlxuICAgKi9cbiAgbG9ncHJvYjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBtb3N0IGxpa2VseSB0b2tlbnMgYW5kIHRoZWlyIGxvZyBwcm9iYWJpbGl0eSwgYXQgdGhpcyB0b2tlblxuICAgKiBwb3NpdGlvbi4gSW4gcmFyZSBjYXNlcywgdGhlcmUgbWF5IGJlIGZld2VyIHRoYW4gdGhlIG51bWJlciBvZiByZXF1ZXN0ZWRcbiAgICogYHRvcF9sb2dwcm9ic2AgcmV0dXJuZWQuXG4gICAqL1xuICB0b3BfbG9ncHJvYnM6IEFycmF5PENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iLlRvcExvZ3Byb2I+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iIHtcbiAgZXhwb3J0IGludGVyZmFjZSBUb3BMb2dwcm9iIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG9rZW4uXG4gICAgICovXG4gICAgdG9rZW46IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBpbnRlZ2VycyByZXByZXNlbnRpbmcgdGhlIFVURi04IGJ5dGVzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbi5cbiAgICAgKiBVc2VmdWwgaW4gaW5zdGFuY2VzIHdoZXJlIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IG11bHRpcGxlIHRva2VucyBhbmRcbiAgICAgKiB0aGVpciBieXRlIHJlcHJlc2VudGF0aW9ucyBtdXN0IGJlIGNvbWJpbmVkIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IHRleHRcbiAgICAgKiByZXByZXNlbnRhdGlvbi4gQ2FuIGJlIGBudWxsYCBpZiB0aGVyZSBpcyBubyBieXRlcyByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHRva2VuLlxuICAgICAqL1xuICAgIGJ5dGVzOiBBcnJheTxudW1iZXI+IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBsb2cgcHJvYmFiaWxpdHkgb2YgdGhpcyB0b2tlbiwgaWYgaXQgaXMgd2l0aGluIHRoZSB0b3AgMjAgbW9zdCBsaWtlbHlcbiAgICAgKiB0b2tlbnMuIE90aGVyd2lzZSwgdGhlIHZhbHVlIGAtOTk5OS4wYCBpcyB1c2VkIHRvIHNpZ25pZnkgdGhhdCB0aGUgdG9rZW4gaXMgdmVyeVxuICAgICAqIHVubGlrZWx5LlxuICAgICAqL1xuICAgIGxvZ3Byb2I6IG51bWJlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uVG9vbCB7XG4gIGZ1bmN0aW9uOiBTaGFyZWQuRnVuY3Rpb25EZWZpbml0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9vbC4gQ3VycmVudGx5LCBvbmx5IGBmdW5jdGlvbmAgaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICogbm90IGNhbGwgYW55IHRvb2wgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIG1lYW5zIHRoZSBtb2RlbCBjYW5cbiAqIHBpY2sgYmV0d2VlbiBnZW5lcmF0aW5nIGEgbWVzc2FnZSBvciBjYWxsaW5nIG9uZSBvciBtb3JlIHRvb2xzLiBgcmVxdWlyZWRgIG1lYW5zXG4gKiB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIHZpYVxuICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAqIGNhbGwgdGhhdCB0b29sLlxuICpcbiAqIGBub25lYCBpcyB0aGUgZGVmYXVsdCB3aGVuIG5vIHRvb2xzIGFyZSBwcmVzZW50LiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgaWYgdG9vbHNcbiAqIGFyZSBwcmVzZW50LlxuICovXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblRvb2xDaG9pY2VPcHRpb24gPSAnbm9uZScgfCAnYXV0bycgfCAncmVxdWlyZWQnIHwgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2U7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgdG9vbCBtZXNzYWdlLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYHRvb2xgLlxuICAgKi9cbiAgcm9sZTogJ3Rvb2wnO1xuXG4gIC8qKlxuICAgKiBUb29sIGNhbGwgdGhhdCB0aGlzIG1lc3NhZ2UgaXMgcmVzcG9uZGluZyB0by5cbiAgICovXG4gIHRvb2xfY2FsbF9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbSB7XG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHVzZXIgbWVzc2FnZS5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZyB8IEFycmF5PENoYXRDb21wbGV0aW9uQ29udGVudFBhcnQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgbWVzc2FnZXMgYXV0aG9yLCBpbiB0aGlzIGNhc2UgYHVzZXJgLlxuICAgKi9cbiAgcm9sZTogJ3VzZXInO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcGFydGljaXBhbnQuIFByb3ZpZGVzIHRoZSBtb2RlbCBpbmZvcm1hdGlvbiB0b1xuICAgKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcGFydGljaXBhbnRzIG9mIHRoZSBzYW1lIHJvbGUuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtIHNob3VsZCBiZSB1c2VkIGluc3RlYWRcbiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlQ2hhdENvbXBsZXRpb25SZXF1ZXN0TWVzc2FnZSA9IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtO1xuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9XG4gIHwgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmdcbiAgfCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogQSBsaXN0IG9mIG1lc3NhZ2VzIGNvbXByaXNpbmcgdGhlIGNvbnZlcnNhdGlvbiBzbyBmYXIuXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX2Zvcm1hdF9pbnB1dHNfdG9fY2hhdGdwdF9tb2RlbHMpLlxuICAgKi9cbiAgbWVzc2FnZXM6IEFycmF5PENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtPjtcblxuICAvKipcbiAgICogSUQgb2YgdGhlIG1vZGVsIHRvIHVzZS4gU2VlIHRoZVxuICAgKiBbbW9kZWwgZW5kcG9pbnQgY29tcGF0aWJpbGl0eV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL21vZGVsLWVuZHBvaW50LWNvbXBhdGliaWxpdHkpXG4gICAqIHRhYmxlIGZvciBkZXRhaWxzIG9uIHdoaWNoIG1vZGVscyB3b3JrIHdpdGggdGhlIENoYXQgQVBJLlxuICAgKi9cbiAgbW9kZWw6IChzdHJpbmcgJiB7fSkgfCBDaGF0QVBJLkNoYXRNb2RlbDtcblxuICAvKipcbiAgICogTnVtYmVyIGJldHdlZW4gLTIuMCBhbmQgMi4wLiBQb3NpdGl2ZSB2YWx1ZXMgcGVuYWxpemUgbmV3IHRva2VucyBiYXNlZCBvbiB0aGVpclxuICAgKiBleGlzdGluZyBmcmVxdWVuY3kgaW4gdGhlIHRleHQgc28gZmFyLCBkZWNyZWFzaW5nIHRoZSBtb2RlbCdzIGxpa2VsaWhvb2QgdG9cbiAgICogcmVwZWF0IHRoZSBzYW1lIGxpbmUgdmVyYmF0aW0uXG4gICAqXG4gICAqIFtTZWUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmcmVxdWVuY3kgYW5kIHByZXNlbmNlIHBlbmFsdGllcy5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LWdlbmVyYXRpb24vcGFyYW1ldGVyLWRldGFpbHMpXG4gICAqL1xuICBmcmVxdWVuY3lfcGVuYWx0eT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYHRvb2xfY2hvaWNlYC5cbiAgICpcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbFxuICAgKiB3aWxsIG5vdCBjYWxsIGEgZnVuY3Rpb24gYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIG1lYW5zIHRoZSBtb2RlbFxuICAgKiBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgYSBmdW5jdGlvbi4gU3BlY2lmeWluZyBhXG4gICAqIHBhcnRpY3VsYXIgZnVuY3Rpb24gdmlhIGB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn1gIGZvcmNlcyB0aGUgbW9kZWwgdG8gY2FsbCB0aGF0XG4gICAqIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBgbm9uZWAgaXMgdGhlIGRlZmF1bHQgd2hlbiBubyBmdW5jdGlvbnMgYXJlIHByZXNlbnQuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCBpZlxuICAgKiBmdW5jdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqL1xuICBmdW5jdGlvbl9jYWxsPzogJ25vbmUnIHwgJ2F1dG8nIHwgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb247XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYHRvb2xzYC5cbiAgICpcbiAgICogQSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGUgbW9kZWwgbWF5IGdlbmVyYXRlIEpTT04gaW5wdXRzIGZvci5cbiAgICovXG4gIGZ1bmN0aW9ucz86IEFycmF5PENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLkZ1bmN0aW9uPjtcblxuICAvKipcbiAgICogTW9kaWZ5IHRoZSBsaWtlbGlob29kIG9mIHNwZWNpZmllZCB0b2tlbnMgYXBwZWFyaW5nIGluIHRoZSBjb21wbGV0aW9uLlxuICAgKlxuICAgKiBBY2NlcHRzIGEgSlNPTiBvYmplY3QgdGhhdCBtYXBzIHRva2VucyAoc3BlY2lmaWVkIGJ5IHRoZWlyIHRva2VuIElEIGluIHRoZVxuICAgKiB0b2tlbml6ZXIpIHRvIGFuIGFzc29jaWF0ZWQgYmlhcyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwLiBNYXRoZW1hdGljYWxseSwgdGhlXG4gICAqIGJpYXMgaXMgYWRkZWQgdG8gdGhlIGxvZ2l0cyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsIHByaW9yIHRvIHNhbXBsaW5nLiBUaGUgZXhhY3RcbiAgICogZWZmZWN0IHdpbGwgdmFyeSBwZXIgbW9kZWwsIGJ1dCB2YWx1ZXMgYmV0d2VlbiAtMSBhbmQgMSBzaG91bGQgZGVjcmVhc2Ugb3JcbiAgICogaW5jcmVhc2UgbGlrZWxpaG9vZCBvZiBzZWxlY3Rpb247IHZhbHVlcyBsaWtlIC0xMDAgb3IgMTAwIHNob3VsZCByZXN1bHQgaW4gYSBiYW5cbiAgICogb3IgZXhjbHVzaXZlIHNlbGVjdGlvbiBvZiB0aGUgcmVsZXZhbnQgdG9rZW4uXG4gICAqL1xuICBsb2dpdF9iaWFzPzogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0dXJuIGxvZyBwcm9iYWJpbGl0aWVzIG9mIHRoZSBvdXRwdXQgdG9rZW5zIG9yIG5vdC4gSWYgdHJ1ZSxcbiAgICogcmV0dXJucyB0aGUgbG9nIHByb2JhYmlsaXRpZXMgb2YgZWFjaCBvdXRwdXQgdG9rZW4gcmV0dXJuZWQgaW4gdGhlIGBjb250ZW50YCBvZlxuICAgKiBgbWVzc2FnZWAuXG4gICAqL1xuICBsb2dwcm9icz86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgW3Rva2Vuc10oL3Rva2VuaXplcikgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGluIHRoZSBjaGF0XG4gICAqIGNvbXBsZXRpb24uXG4gICAqXG4gICAqIFRoZSB0b3RhbCBsZW5ndGggb2YgaW5wdXQgdG9rZW5zIGFuZCBnZW5lcmF0ZWQgdG9rZW5zIGlzIGxpbWl0ZWQgYnkgdGhlIG1vZGVsJ3NcbiAgICogY29udGV4dCBsZW5ndGguXG4gICAqIFtFeGFtcGxlIFB5dGhvbiBjb2RlXShodHRwczovL2Nvb2tib29rLm9wZW5haS5jb20vZXhhbXBsZXMvaG93X3RvX2NvdW50X3Rva2Vuc193aXRoX3Rpa3Rva2VuKVxuICAgKiBmb3IgY291bnRpbmcgdG9rZW5zLlxuICAgKi9cbiAgbWF4X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IGNoYXQgY29tcGxldGlvbiBjaG9pY2VzIHRvIGdlbmVyYXRlIGZvciBlYWNoIGlucHV0IG1lc3NhZ2UuIE5vdGUgdGhhdFxuICAgKiB5b3Ugd2lsbCBiZSBjaGFyZ2VkIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgZ2VuZXJhdGVkIHRva2VucyBhY3Jvc3MgYWxsIG9mIHRoZVxuICAgKiBjaG9pY2VzLiBLZWVwIGBuYCBhcyBgMWAgdG8gbWluaW1pemUgY29zdHMuXG4gICAqL1xuICBuPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogTnVtYmVyIGJldHdlZW4gLTIuMCBhbmQgMi4wLiBQb3NpdGl2ZSB2YWx1ZXMgcGVuYWxpemUgbmV3IHRva2VucyBiYXNlZCBvblxuICAgKiB3aGV0aGVyIHRoZXkgYXBwZWFyIGluIHRoZSB0ZXh0IHNvIGZhciwgaW5jcmVhc2luZyB0aGUgbW9kZWwncyBsaWtlbGlob29kIHRvXG4gICAqIHRhbGsgYWJvdXQgbmV3IHRvcGljcy5cbiAgICpcbiAgICogW1NlZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZyZXF1ZW5jeSBhbmQgcHJlc2VuY2UgcGVuYWx0aWVzLl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3RleHQtZ2VuZXJhdGlvbi9wYXJhbWV0ZXItZGV0YWlscylcbiAgICovXG4gIHByZXNlbmNlX3BlbmFsdHk/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIG5ld2VyIHRoYW4gYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLlJlc3BvbnNlRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgaW4gQmV0YS4gSWYgc3BlY2lmaWVkLCBvdXIgc3lzdGVtIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvXG4gICAqIHNhbXBsZSBkZXRlcm1pbmlzdGljYWxseSwgc3VjaCB0aGF0IHJlcGVhdGVkIHJlcXVlc3RzIHdpdGggdGhlIHNhbWUgYHNlZWRgIGFuZFxuICAgKiBwYXJhbWV0ZXJzIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LiBEZXRlcm1pbmlzbSBpcyBub3QgZ3VhcmFudGVlZCwgYW5kIHlvdVxuICAgKiBzaG91bGQgcmVmZXIgdG8gdGhlIGBzeXN0ZW1fZmluZ2VycHJpbnRgIHJlc3BvbnNlIHBhcmFtZXRlciB0byBtb25pdG9yIGNoYW5nZXNcbiAgICogaW4gdGhlIGJhY2tlbmQuXG4gICAqL1xuICBzZWVkPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVXAgdG8gNCBzZXF1ZW5jZXMgd2hlcmUgdGhlIEFQSSB3aWxsIHN0b3AgZ2VuZXJhdGluZyBmdXJ0aGVyIHRva2Vucy5cbiAgICovXG4gIHN0b3A/OiBzdHJpbmcgfCBudWxsIHwgQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogSWYgc2V0LCBwYXJ0aWFsIG1lc3NhZ2UgZGVsdGFzIHdpbGwgYmUgc2VudCwgbGlrZSBpbiBDaGF0R1BULiBUb2tlbnMgd2lsbCBiZVxuICAgKiBzZW50IGFzIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbT86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBzdHJlYW1pbmcgcmVzcG9uc2UuIE9ubHkgc2V0IHRoaXMgd2hlbiB5b3Ugc2V0IGBzdHJlYW06IHRydWVgLlxuICAgKi9cbiAgc3RyZWFtX29wdGlvbnM/OiBDaGF0Q29tcGxldGlvblN0cmVhbU9wdGlvbnMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIGB0b3BfcGAgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGljaCAoaWYgYW55KSB0b29sIGlzIGNhbGxlZCBieSB0aGUgbW9kZWwuIGBub25lYCBtZWFucyB0aGUgbW9kZWwgd2lsbFxuICAgKiBub3QgY2FsbCBhbnkgdG9vbCBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgbWVhbnMgdGhlIG1vZGVsIGNhblxuICAgKiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZSB0b29scy4gYHJlcXVpcmVkYCBtZWFuc1xuICAgKiB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIHZpYVxuICAgKiBge1widHlwZVwiOiBcImZ1bmN0aW9uXCIsIFwiZnVuY3Rpb25cIjoge1wibmFtZVwiOiBcIm15X2Z1bmN0aW9uXCJ9fWAgZm9yY2VzIHRoZSBtb2RlbCB0b1xuICAgKiBjYWxsIHRoYXQgdG9vbC5cbiAgICpcbiAgICogYG5vbmVgIGlzIHRoZSBkZWZhdWx0IHdoZW4gbm8gdG9vbHMgYXJlIHByZXNlbnQuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCBpZiB0b29sc1xuICAgKiBhcmUgcHJlc2VudC5cbiAgICovXG4gIHRvb2xfY2hvaWNlPzogQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdG9vbHMgdGhlIG1vZGVsIG1heSBjYWxsLiBDdXJyZW50bHksIG9ubHkgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQgYXMgYVxuICAgKiB0b29sLiBVc2UgdGhpcyB0byBwcm92aWRlIGEgbGlzdCBvZiBmdW5jdGlvbnMgdGhlIG1vZGVsIG1heSBnZW5lcmF0ZSBKU09OIGlucHV0c1xuICAgKiBmb3IuIEEgbWF4IG9mIDEyOCBmdW5jdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8Q2hhdENvbXBsZXRpb25Ub29sPjtcblxuICAvKipcbiAgICogQW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDIwIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBtb3N0IGxpa2VseSB0b2tlbnMgdG9cbiAgICogcmV0dXJuIGF0IGVhY2ggdG9rZW4gcG9zaXRpb24sIGVhY2ggd2l0aCBhbiBhc3NvY2lhdGVkIGxvZyBwcm9iYWJpbGl0eS5cbiAgICogYGxvZ3Byb2JzYCBtdXN0IGJlIHNldCB0byBgdHJ1ZWAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgdXNlZC5cbiAgICovXG4gIHRvcF9sb2dwcm9icz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIGB0ZW1wZXJhdHVyZWAgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHJlcHJlc2VudGluZyB5b3VyIGVuZC11c2VyLCB3aGljaCBjYW4gaGVscCBPcGVuQUkgdG8gbW9uaXRvclxuICAgKiBhbmQgZGV0ZWN0IGFidXNlLlxuICAgKiBbTGVhcm4gbW9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NhZmV0eS1iZXN0LXByYWN0aWNlcy9lbmQtdXNlci1pZHMpLlxuICAgKi9cbiAgdXNlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gTXVzdCBiZSBhLXosIEEtWiwgMC05LCBvciBjb250YWluXG4gICAgICogdW5kZXJzY29yZXMgYW5kIGRhc2hlcywgd2l0aCBhIG1heGltdW0gbGVuZ3RoIG9mIDY0LlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgZnVuY3Rpb24gZG9lcywgdXNlZCBieSB0aGUgbW9kZWwgdG8gY2hvb3NlIHdoZW4gYW5kXG4gICAgICogaG93IHRvIGNhbGwgdGhlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBhcmFtZXRlcnMgdGhlIGZ1bmN0aW9ucyBhY2NlcHRzLCBkZXNjcmliZWQgYXMgYSBKU09OIFNjaGVtYSBvYmplY3QuIFNlZSB0aGVcbiAgICAgKiBbZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy90ZXh0LWdlbmVyYXRpb24vZnVuY3Rpb24tY2FsbGluZylcbiAgICAgKiBmb3IgZXhhbXBsZXMsIGFuZCB0aGVcbiAgICAgKiBbSlNPTiBTY2hlbWEgcmVmZXJlbmNlXShodHRwczovL2pzb24tc2NoZW1hLm9yZy91bmRlcnN0YW5kaW5nLWpzb24tc2NoZW1hLykgZm9yXG4gICAgICogZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgZm9ybWF0LlxuICAgICAqXG4gICAgICogT21pdHRpbmcgYHBhcmFtZXRlcnNgIGRlZmluZXMgYSBmdW5jdGlvbiB3aXRoIGFuIGVtcHR5IHBhcmFtZXRlciBsaXN0LlxuICAgICAqL1xuICAgIHBhcmFtZXRlcnM/OiBTaGFyZWQuRnVuY3Rpb25QYXJhbWV0ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgbmV3ZXIgdGhhbiBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUZvcm1hdCB7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBvbmUgb2YgYHRleHRgIG9yIGBqc29uX29iamVjdGAuXG4gICAgICovXG4gICAgdHlwZT86ICd0ZXh0JyB8ICdqc29uX29iamVjdCc7XG4gIH1cblxuICBleHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9XG4gICAgQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgZXh0ZW5kcyBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgc2V0LCBwYXJ0aWFsIG1lc3NhZ2UgZGVsdGFzIHdpbGwgYmUgc2VudCwgbGlrZSBpbiBDaGF0R1BULiBUb2tlbnMgd2lsbCBiZVxuICAgKiBzZW50IGFzIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbT86IGZhbHNlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgZXh0ZW5kcyBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgc2V0LCBwYXJ0aWFsIG1lc3NhZ2UgZGVsdGFzIHdpbGwgYmUgc2VudCwgbGlrZSBpbiBDaGF0R1BULiBUb2tlbnMgd2lsbCBiZVxuICAgKiBzZW50IGFzIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29tcGxldGlvbnMge1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ2h1bmsgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DaHVuaztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0ID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ29udGVudFBhcnQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydEltYWdlID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dCA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbiA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbCA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2VUb29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblJvbGUgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Sb2xlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3RyZWFtT3B0aW9ucyA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblN0cmVhbU9wdGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25TeXN0ZW1NZXNzYWdlUGFyYW0gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TeXN0ZW1NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2IgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2I7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2xDaG9pY2VPcHRpb24gPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Vc2VyTWVzc2FnZVBhcmFtID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtIHNob3VsZCBiZSB1c2VkIGluc3RlYWRcbiAgICovXG4gIGV4cG9ydCBpbXBvcnQgQ3JlYXRlQ2hhdENvbXBsZXRpb25SZXF1ZXN0TWVzc2FnZSA9IENoYXRDb21wbGV0aW9uc0FQSS5DcmVhdGVDaGF0Q29tcGxldGlvblJlcXVlc3RNZXNzYWdlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ2hhdENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ2hhdENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENoYXRDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgKiBhcyBDaGF0QVBJIGZyb20gXCIuL2NoYXRcIjtcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gXCIuL2NvbXBsZXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGF0IGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBjb21wbGV0aW9uczogQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnMgPSBuZXcgQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnModGhpcy5fY2xpZW50KTtcbn1cblxuZXhwb3J0IHR5cGUgQ2hhdE1vZGVsID1cbiAgfCAnZ3B0LTQtdHVyYm8nXG4gIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgfCAnZ3B0LTQnXG4gIHwgJ2dwdC00LTAzMTQnXG4gIHwgJ2dwdC00LTA2MTMnXG4gIHwgJ2dwdC00LTMyaydcbiAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gIHwgJ2dwdC00LTMyay0wNjEzJ1xuICB8ICdncHQtMy41LXR1cmJvJ1xuICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgfCAnZ3B0LTMuNS10dXJiby0wMzAxJ1xuICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJztcblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0IHtcbiAgZXhwb3J0IGltcG9ydCBDaGF0TW9kZWwgPSBDaGF0QVBJLkNoYXRNb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9ucyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Bc3Npc3RhbnRNZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNodW5rID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DaHVuaztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0ID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2UgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0VGV4dDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uQ2FsbE9wdGlvbiA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uRnVuY3Rpb25DYWxsT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZSA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZVRvb2xDYWxsID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2UgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbk5hbWVkVG9vbENob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblJvbGUgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblJvbGU7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TeXN0ZW1NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub2tlbkxvZ3Byb2IgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRva2VuTG9ncHJvYjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2wgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW0gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW07XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkXG4gICAqL1xuICBleHBvcnQgaW1wb3J0IENyZWF0ZUNoYXRDb21wbGV0aW9uUmVxdWVzdE1lc3NhZ2UgPSBDb21wbGV0aW9uc0FQSS5DcmVhdGVDaGF0Q29tcGxldGlvblJlcXVlc3RNZXNzYWdlO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyB0eXBlIFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uL19zaGltcy9pbmRleFwiO1xuaW1wb3J0ICogYXMgU3BlZWNoQVBJIGZyb20gXCIuL3NwZWVjaFwiO1xuXG5leHBvcnQgY2xhc3MgU3BlZWNoIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogR2VuZXJhdGVzIGF1ZGlvIGZyb20gdGhlIGlucHV0IHRleHQuXG4gICAqL1xuICBjcmVhdGUoYm9keTogU3BlZWNoQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL2F1ZGlvL3NwZWVjaCcsIHsgYm9keSwgLi4ub3B0aW9ucywgX19iaW5hcnlSZXNwb25zZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwZWVjaENyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBnZW5lcmF0ZSBhdWRpbyBmb3IuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyA0MDk2IGNoYXJhY3RlcnMuXG4gICAqL1xuICBpbnB1dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPbmUgb2YgdGhlIGF2YWlsYWJsZSBbVFRTIG1vZGVsc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL3R0cyk6XG4gICAqIGB0dHMtMWAgb3IgYHR0cy0xLWhkYFxuICAgKi9cbiAgbW9kZWw6IChzdHJpbmcgJiB7fSkgfCAndHRzLTEnIHwgJ3R0cy0xLWhkJztcblxuICAvKipcbiAgICogVGhlIHZvaWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGF1ZGlvLiBTdXBwb3J0ZWQgdm9pY2VzIGFyZSBgYWxsb3lgLFxuICAgKiBgZWNob2AsIGBmYWJsZWAsIGBvbnl4YCwgYG5vdmFgLCBhbmQgYHNoaW1tZXJgLiBQcmV2aWV3cyBvZiB0aGUgdm9pY2VzIGFyZVxuICAgKiBhdmFpbGFibGUgaW4gdGhlXG4gICAqIFtUZXh0IHRvIHNwZWVjaCBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3RleHQtdG8tc3BlZWNoL3ZvaWNlLW9wdGlvbnMpLlxuICAgKi9cbiAgdm9pY2U6ICdhbGxveScgfCAnZWNobycgfCAnZmFibGUnIHwgJ29ueXgnIHwgJ25vdmEnIHwgJ3NoaW1tZXInO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IHRvIGF1ZGlvIGluLiBTdXBwb3J0ZWQgZm9ybWF0cyBhcmUgYG1wM2AsIGBvcHVzYCwgYGFhY2AsIGBmbGFjYCxcbiAgICogYHdhdmAsIGFuZCBgcGNtYC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86ICdtcDMnIHwgJ29wdXMnIHwgJ2FhYycgfCAnZmxhYycgfCAnd2F2JyB8ICdwY20nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3BlZWQgb2YgdGhlIGdlbmVyYXRlZCBhdWRpby4gU2VsZWN0IGEgdmFsdWUgZnJvbSBgMC4yNWAgdG8gYDQuMGAuIGAxLjBgIGlzXG4gICAqIHRoZSBkZWZhdWx0LlxuICAgKi9cbiAgc3BlZWQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3BlZWNoIHtcbiAgZXhwb3J0IGltcG9ydCBTcGVlY2hDcmVhdGVQYXJhbXMgPSBTcGVlY2hBUEkuU3BlZWNoQ3JlYXRlUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgKiBhcyBUcmFuc2NyaXB0aW9uc0FQSSBmcm9tIFwiLi90cmFuc2NyaXB0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBVcGxvYWRhYmxlLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNjcmlwdGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUcmFuc2NyaWJlcyBhdWRpbyBpbnRvIHRoZSBpbnB1dCBsYW5ndWFnZS5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxUcmFuc2NyaXB0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvYXVkaW8vdHJhbnNjcmlwdGlvbnMnLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMoeyBib2R5LCAuLi5vcHRpb25zIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0cmFuc2NyaXB0aW9uIHJlc3BvbnNlIHJldHVybmVkIGJ5IG1vZGVsLCBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIGlucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHRpb24ge1xuICAvKipcbiAgICogVGhlIHRyYW5zY3JpYmVkIHRleHQuXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXVkaW8gZmlsZSBvYmplY3QgKG5vdCBmaWxlIG5hbWUpIHRvIHRyYW5zY3JpYmUsIGluIG9uZSBvZiB0aGVzZSBmb3JtYXRzOlxuICAgKiBmbGFjLCBtcDMsIG1wNCwgbXBlZywgbXBnYSwgbTRhLCBvZ2csIHdhdiwgb3Igd2VibS5cbiAgICovXG4gIGZpbGU6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIE9ubHkgYHdoaXNwZXItMWAgKHdoaWNoIGlzIHBvd2VyZWQgYnkgb3VyIG9wZW4gc291cmNlXG4gICAqIFdoaXNwZXIgVjIgbW9kZWwpIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICd3aGlzcGVyLTEnO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGlucHV0IGF1ZGlvLiBTdXBwbHlpbmcgdGhlIGlucHV0IGxhbmd1YWdlIGluXG4gICAqIFtJU08tNjM5LTFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfSVNPXzYzOS0xX2NvZGVzKSBmb3JtYXQgd2lsbFxuICAgKiBpbXByb3ZlIGFjY3VyYWN5IGFuZCBsYXRlbmN5LlxuICAgKi9cbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHRleHQgdG8gZ3VpZGUgdGhlIG1vZGVsJ3Mgc3R5bGUgb3IgY29udGludWUgYSBwcmV2aW91cyBhdWRpb1xuICAgKiBzZWdtZW50LiBUaGVcbiAgICogW3Byb21wdF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NwZWVjaC10by10ZXh0L3Byb21wdGluZylcbiAgICogc2hvdWxkIG1hdGNoIHRoZSBhdWRpbyBsYW5ndWFnZS5cbiAgICovXG4gIHByb21wdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCBvZiB0aGUgdHJhbnNjcmlwdCBvdXRwdXQsIGluIG9uZSBvZiB0aGVzZSBvcHRpb25zOiBganNvbmAsIGB0ZXh0YCxcbiAgICogYHNydGAsIGB2ZXJib3NlX2pzb25gLCBvciBgdnR0YC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86ICdqc29uJyB8ICd0ZXh0JyB8ICdzcnQnIHwgJ3ZlcmJvc2VfanNvbicgfCAndnR0JztcblxuICAvKipcbiAgICogVGhlIHNhbXBsaW5nIHRlbXBlcmF0dXJlLCBiZXR3ZWVuIDAgYW5kIDEuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbCBtYWtlIHRoZVxuICAgKiBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZSBmb2N1c2VkIGFuZFxuICAgKiBkZXRlcm1pbmlzdGljLiBJZiBzZXQgdG8gMCwgdGhlIG1vZGVsIHdpbGwgdXNlXG4gICAqIFtsb2cgcHJvYmFiaWxpdHldKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xvZ19wcm9iYWJpbGl0eSkgdG9cbiAgICogYXV0b21hdGljYWxseSBpbmNyZWFzZSB0aGUgdGVtcGVyYXR1cmUgdW50aWwgY2VydGFpbiB0aHJlc2hvbGRzIGFyZSBoaXQuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBncmFudWxhcml0aWVzIHRvIHBvcHVsYXRlIGZvciB0aGlzIHRyYW5zY3JpcHRpb24uXG4gICAqIGByZXNwb25zZV9mb3JtYXRgIG11c3QgYmUgc2V0IGB2ZXJib3NlX2pzb25gIHRvIHVzZSB0aW1lc3RhbXAgZ3JhbnVsYXJpdGllcy5cbiAgICogRWl0aGVyIG9yIGJvdGggb2YgdGhlc2Ugb3B0aW9ucyBhcmUgc3VwcG9ydGVkOiBgd29yZGAsIG9yIGBzZWdtZW50YC4gTm90ZTogVGhlcmVcbiAgICogaXMgbm8gYWRkaXRpb25hbCBsYXRlbmN5IGZvciBzZWdtZW50IHRpbWVzdGFtcHMsIGJ1dCBnZW5lcmF0aW5nIHdvcmQgdGltZXN0YW1wc1xuICAgKiBpbmN1cnMgYWRkaXRpb25hbCBsYXRlbmN5LlxuICAgKi9cbiAgdGltZXN0YW1wX2dyYW51bGFyaXRpZXM/OiBBcnJheTwnd29yZCcgfCAnc2VnbWVudCc+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRyYW5zY3JpcHRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zQVBJIGZyb20gXCIuL3RyYW5zbGF0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBVcGxvYWRhYmxlLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNsYXRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVHJhbnNsYXRlcyBhdWRpbyBpbnRvIEVuZ2xpc2guXG4gICAqL1xuICBjcmVhdGUoYm9keTogVHJhbnNsYXRpb25DcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRyYW5zbGF0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvYXVkaW8vdHJhbnNsYXRpb25zJywgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zKHsgYm9keSwgLi4ub3B0aW9ucyB9KSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbiB7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXVkaW8gZmlsZSBvYmplY3QgKG5vdCBmaWxlIG5hbWUpIHRyYW5zbGF0ZSwgaW4gb25lIG9mIHRoZXNlIGZvcm1hdHM6IGZsYWMsXG4gICAqIG1wMywgbXA0LCBtcGVnLCBtcGdhLCBtNGEsIG9nZywgd2F2LCBvciB3ZWJtLlxuICAgKi9cbiAgZmlsZTogVXBsb2FkYWJsZTtcblxuICAvKipcbiAgICogSUQgb2YgdGhlIG1vZGVsIHRvIHVzZS4gT25seSBgd2hpc3Blci0xYCAod2hpY2ggaXMgcG93ZXJlZCBieSBvdXIgb3BlbiBzb3VyY2VcbiAgICogV2hpc3BlciBWMiBtb2RlbCkgaXMgY3VycmVudGx5IGF2YWlsYWJsZS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ3doaXNwZXItMSc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHRleHQgdG8gZ3VpZGUgdGhlIG1vZGVsJ3Mgc3R5bGUgb3IgY29udGludWUgYSBwcmV2aW91cyBhdWRpb1xuICAgKiBzZWdtZW50LiBUaGVcbiAgICogW3Byb21wdF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL3NwZWVjaC10by10ZXh0L3Byb21wdGluZylcbiAgICogc2hvdWxkIGJlIGluIEVuZ2xpc2guXG4gICAqL1xuICBwcm9tcHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgb2YgdGhlIHRyYW5zY3JpcHQgb3V0cHV0LCBpbiBvbmUgb2YgdGhlc2Ugb3B0aW9uczogYGpzb25gLCBgdGV4dGAsXG4gICAqIGBzcnRgLCBgdmVyYm9zZV9qc29uYCwgb3IgYHZ0dGAuXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzYW1wbGluZyB0ZW1wZXJhdHVyZSwgYmV0d2VlbiAwIGFuZCAxLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGwgbWFrZSB0aGVcbiAgICogb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmUgZm9jdXNlZCBhbmRcbiAgICogZGV0ZXJtaW5pc3RpYy4gSWYgc2V0IHRvIDAsIHRoZSBtb2RlbCB3aWxsIHVzZVxuICAgKiBbbG9nIHByb2JhYmlsaXR5XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Mb2dfcHJvYmFiaWxpdHkpIHRvXG4gICAqIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2UgdGhlIHRlbXBlcmF0dXJlIHVudGlsIGNlcnRhaW4gdGhyZXNob2xkcyBhcmUgaGl0LlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVHJhbnNsYXRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbiA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcyA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbkNyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgU3BlZWNoQVBJIGZyb20gXCIuL3NwZWVjaFwiO1xuaW1wb3J0ICogYXMgVHJhbnNjcmlwdGlvbnNBUEkgZnJvbSBcIi4vdHJhbnNjcmlwdGlvbnNcIjtcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0FQSSBmcm9tIFwiLi90cmFuc2xhdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICB0cmFuc2NyaXB0aW9uczogVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbnMgPSBuZXcgVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbnModGhpcy5fY2xpZW50KTtcbiAgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25zID0gbmV3IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbnModGhpcy5fY2xpZW50KTtcbiAgc3BlZWNoOiBTcGVlY2hBUEkuU3BlZWNoID0gbmV3IFNwZWVjaEFQSS5TcGVlY2godGhpcy5fY2xpZW50KTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBdWRpbyB7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNjcmlwdGlvbnMgPSBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2xhdGlvbnMgPSBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25zO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zbGF0aW9uID0gVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zID0gVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFNwZWVjaCA9IFNwZWVjaEFQSS5TcGVlY2g7XG4gIGV4cG9ydCBpbXBvcnQgU3BlZWNoQ3JlYXRlUGFyYW1zID0gU3BlZWNoQVBJLlNwZWVjaENyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgKiBhcyBCYXRjaGVzQVBJIGZyb20gXCIuL2JhdGNoZXNcIjtcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gXCIuLi9wYWdpbmF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBCYXRjaGVzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgZXhlY3V0ZXMgYSBiYXRjaCBmcm9tIGFuIHVwbG9hZGVkIGZpbGUgb2YgcmVxdWVzdHNcbiAgICovXG4gIGNyZWF0ZShib2R5OiBCYXRjaENyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8QmF0Y2g+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9iYXRjaGVzJywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIGJhdGNoLlxuICAgKi9cbiAgcmV0cmlldmUoYmF0Y2hJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxCYXRjaD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvYmF0Y2hlcy8ke2JhdGNoSWR9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB5b3VyIG9yZ2FuaXphdGlvbidzIGJhdGNoZXMuXG4gICAqL1xuICBsaXN0KHF1ZXJ5PzogQmF0Y2hMaXN0UGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8QmF0Y2hlc1BhZ2UsIEJhdGNoPjtcbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8QmF0Y2hlc1BhZ2UsIEJhdGNoPjtcbiAgbGlzdChcbiAgICBxdWVyeTogQmF0Y2hMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEJhdGNoZXNQYWdlLCBCYXRjaD4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoJy9iYXRjaGVzJywgQmF0Y2hlc1BhZ2UsIHsgcXVlcnksIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBhbiBpbi1wcm9ncmVzcyBiYXRjaC5cbiAgICovXG4gIGNhbmNlbChiYXRjaElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEJhdGNoPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvYmF0Y2hlcy8ke2JhdGNoSWR9L2NhbmNlbGAsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCYXRjaGVzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8QmF0Y2g+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2gge1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZSBmcmFtZSB3aXRoaW4gd2hpY2ggdGhlIGJhdGNoIHNob3VsZCBiZSBwcm9jZXNzZWQuXG4gICAqL1xuICBjb21wbGV0aW9uX3dpbmRvdzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBiYXRjaCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIE9wZW5BSSBBUEkgZW5kcG9pbnQgdXNlZCBieSB0aGUgYmF0Y2guXG4gICAqL1xuICBlbmRwb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIGlucHV0IGZpbGUgZm9yIHRoZSBiYXRjaC5cbiAgICovXG4gIGlucHV0X2ZpbGVfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYGJhdGNoYC5cbiAgICovXG4gIG9iamVjdDogJ2JhdGNoJztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBiYXRjaC5cbiAgICovXG4gIHN0YXR1czpcbiAgICB8ICd2YWxpZGF0aW5nJ1xuICAgIHwgJ2ZhaWxlZCdcbiAgICB8ICdpbl9wcm9ncmVzcydcbiAgICB8ICdmaW5hbGl6aW5nJ1xuICAgIHwgJ2NvbXBsZXRlZCdcbiAgICB8ICdleHBpcmVkJ1xuICAgIHwgJ2NhbmNlbGxpbmcnXG4gICAgfCAnY2FuY2VsbGVkJztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggd2FzIGNhbmNlbGxlZC5cbiAgICovXG4gIGNhbmNlbGxlZF9hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggc3RhcnRlZCBjYW5jZWxsaW5nLlxuICAgKi9cbiAgY2FuY2VsbGluZ19hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggd2FzIGNvbXBsZXRlZC5cbiAgICovXG4gIGNvbXBsZXRlZF9hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIG91dHB1dHMgb2YgcmVxdWVzdHMgd2l0aCBlcnJvcnMuXG4gICAqL1xuICBlcnJvcl9maWxlX2lkPzogc3RyaW5nO1xuXG4gIGVycm9ycz86IEJhdGNoLkVycm9ycztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggZXhwaXJlZC5cbiAgICovXG4gIGV4cGlyZWRfYXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGJhdGNoIHdpbGwgZXhwaXJlLlxuICAgKi9cbiAgZXhwaXJlc19hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgYmF0Y2ggZmFpbGVkLlxuICAgKi9cbiAgZmFpbGVkX2F0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBiYXRjaCBzdGFydGVkIGZpbmFsaXppbmcuXG4gICAqL1xuICBmaW5hbGl6aW5nX2F0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBiYXRjaCBzdGFydGVkIHByb2Nlc3NpbmcuXG4gICAqL1xuICBpbl9wcm9ncmVzc19hdD86IG51bWJlcjtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIG91dHB1dHMgb2Ygc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkIHJlcXVlc3RzLlxuICAgKi9cbiAgb3V0cHV0X2ZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGNvdW50cyBmb3IgZGlmZmVyZW50IHN0YXR1c2VzIHdpdGhpbiB0aGUgYmF0Y2guXG4gICAqL1xuICByZXF1ZXN0X2NvdW50cz86IEJhdGNoUmVxdWVzdENvdW50cztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBCYXRjaCB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRXJyb3JzIHtcbiAgICBkYXRhPzogQXJyYXk8QmF0Y2hlc0FQSS5CYXRjaEVycm9yPjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGBsaXN0YC5cbiAgICAgKi9cbiAgICBvYmplY3Q/OiBzdHJpbmc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaEVycm9yIHtcbiAgLyoqXG4gICAqIEFuIGVycm9yIGNvZGUgaWRlbnRpZnlpbmcgdGhlIGVycm9yIHR5cGUuXG4gICAqL1xuICBjb2RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBudW1iZXIgb2YgdGhlIGlucHV0IGZpbGUgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLCBpZiBhcHBsaWNhYmxlLlxuICAgKi9cbiAgbGluZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSBwcm92aWRpbmcgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBlcnJvci5cbiAgICovXG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdGhhdCBjYXVzZWQgdGhlIGVycm9yLCBpZiBhcHBsaWNhYmxlLlxuICAgKi9cbiAgcGFyYW0/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IGNvdW50cyBmb3IgZGlmZmVyZW50IHN0YXR1c2VzIHdpdGhpbiB0aGUgYmF0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hSZXF1ZXN0Q291bnRzIHtcbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGhhdmUgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgY29tcGxldGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGhhdmUgZmFpbGVkLlxuICAgKi9cbiAgZmFpbGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiByZXF1ZXN0cyBpbiB0aGUgYmF0Y2guXG4gICAqL1xuICB0b3RhbDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhdGNoQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lIGZyYW1lIHdpdGhpbiB3aGljaCB0aGUgYmF0Y2ggc2hvdWxkIGJlIHByb2Nlc3NlZC4gQ3VycmVudGx5IG9ubHkgYDI0aGBcbiAgICogaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgY29tcGxldGlvbl93aW5kb3c6ICcyNGgnO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQgdG8gYmUgdXNlZCBmb3IgYWxsIHJlcXVlc3RzIGluIHRoZSBiYXRjaC4gQ3VycmVudGx5XG4gICAqIGAvdjEvY2hhdC9jb21wbGV0aW9uc2AgYW5kIGAvdjEvZW1iZWRkaW5nc2AgYXJlIHN1cHBvcnRlZC5cbiAgICovXG4gIGVuZHBvaW50OiAnL3YxL2NoYXQvY29tcGxldGlvbnMnIHwgJy92MS9lbWJlZGRpbmdzJztcblxuICAvKipcbiAgICogVGhlIElEIG9mIGFuIHVwbG9hZGVkIGZpbGUgdGhhdCBjb250YWlucyByZXF1ZXN0cyBmb3IgdGhlIG5ldyBiYXRjaC5cbiAgICpcbiAgICogU2VlIFt1cGxvYWQgZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcy9jcmVhdGUpXG4gICAqIGZvciBob3cgdG8gdXBsb2FkIGEgZmlsZS5cbiAgICpcbiAgICogWW91ciBpbnB1dCBmaWxlIG11c3QgYmUgZm9ybWF0dGVkIGFzIGFcbiAgICogW0pTT05MIGZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYmF0Y2gvcmVxdWVzdElucHV0KSxcbiAgICogYW5kIG11c3QgYmUgdXBsb2FkZWQgd2l0aCB0aGUgcHVycG9zZSBgYmF0Y2hgLlxuICAgKi9cbiAgaW5wdXRfZmlsZV9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gbWV0YWRhdGEgZm9yIHRoZSBiYXRjaC5cbiAgICovXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7fVxuXG5leHBvcnQgbmFtZXNwYWNlIEJhdGNoZXMge1xuICBleHBvcnQgaW1wb3J0IEJhdGNoID0gQmF0Y2hlc0FQSS5CYXRjaDtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaEVycm9yID0gQmF0Y2hlc0FQSS5CYXRjaEVycm9yO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoUmVxdWVzdENvdW50cyA9IEJhdGNoZXNBUEkuQmF0Y2hSZXF1ZXN0Q291bnRzO1xuICBleHBvcnQgaW1wb3J0IEJhdGNoZXNQYWdlID0gQmF0Y2hlc0FQSS5CYXRjaGVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaENyZWF0ZVBhcmFtcyA9IEJhdGNoZXNBUEkuQmF0Y2hDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hMaXN0UGFyYW1zID0gQmF0Y2hlc0FQSS5CYXRjaExpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuaW1wb3J0ICogYXMgQXNzaXN0YW50c0FQSSBmcm9tIFwiLi9hc3Npc3RhbnRzXCI7XG5pbXBvcnQgKiBhcyBTaGFyZWQgZnJvbSBcIi4uL3NoYXJlZFwiO1xuaW1wb3J0ICogYXMgTWVzc2FnZXNBUEkgZnJvbSBcIi4vdGhyZWFkcy9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgVGhyZWFkc0FQSSBmcm9tIFwiLi90aHJlYWRzL3RocmVhZHNcIjtcbmltcG9ydCAqIGFzIFJ1bnNBUEkgZnJvbSBcIi4vdGhyZWFkcy9ydW5zL3J1bnNcIjtcbmltcG9ydCAqIGFzIFN0ZXBzQVBJIGZyb20gXCIuL3RocmVhZHMvcnVucy9zdGVwc1wiO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSBcIi4uLy4uL3BhZ2luYXRpb25cIjtcblxuZXhwb3J0IGNsYXNzIEFzc2lzdGFudHMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gYXNzaXN0YW50IHdpdGggYSBtb2RlbCBhbmQgaW5zdHJ1Y3Rpb25zLlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IEFzc2lzdGFudENyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8QXNzaXN0YW50PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvYXNzaXN0YW50cycsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYW4gYXNzaXN0YW50LlxuICAgKi9cbiAgcmV0cmlldmUoYXNzaXN0YW50SWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8QXNzaXN0YW50PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC9hc3Npc3RhbnRzLyR7YXNzaXN0YW50SWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW9kaWZpZXMgYW4gYXNzaXN0YW50LlxuICAgKi9cbiAgdXBkYXRlKFxuICAgIGFzc2lzdGFudElkOiBzdHJpbmcsXG4gICAgYm9keTogQXNzaXN0YW50VXBkYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8QXNzaXN0YW50PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvYXNzaXN0YW50cy8ke2Fzc2lzdGFudElkfWAsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhc3Npc3RhbnRzLlxuICAgKi9cbiAgbGlzdChcbiAgICBxdWVyeT86IEFzc2lzdGFudExpc3RQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8QXNzaXN0YW50c1BhZ2UsIEFzc2lzdGFudD47XG4gIGxpc3Qob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLlBhZ2VQcm9taXNlPEFzc2lzdGFudHNQYWdlLCBBc3Npc3RhbnQ+O1xuICBsaXN0KFxuICAgIHF1ZXJ5OiBBc3Npc3RhbnRMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEFzc2lzdGFudHNQYWdlLCBBc3Npc3RhbnQ+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3Qoe30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KCcvYXNzaXN0YW50cycsIEFzc2lzdGFudHNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBhc3Npc3RhbnQuXG4gICAqL1xuICBkZWwoYXNzaXN0YW50SWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8QXNzaXN0YW50RGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvYXNzaXN0YW50cy8ke2Fzc2lzdGFudElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3Npc3RhbnRzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8QXNzaXN0YW50PiB7fVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gYGFzc2lzdGFudGAgdGhhdCBjYW4gY2FsbCB0aGUgbW9kZWwgYW5kIHVzZSB0b29scy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3Npc3RhbnQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBhc3Npc3RhbnQgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYXNzaXN0YW50LiBUaGUgbWF4aW11bSBsZW5ndGggaXMgNTEyIGNoYXJhY3RlcnMuXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN5c3RlbSBpbnN0cnVjdGlvbnMgdGhhdCB0aGUgYXNzaXN0YW50IHVzZXMuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAyNTYsMDAwXG4gICAqIGNoYXJhY3RlcnMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhOiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogSUQgb2YgdGhlIG1vZGVsIHRvIHVzZS4gWW91IGNhbiB1c2UgdGhlXG4gICAqIFtMaXN0IG1vZGVsc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMvbGlzdCkgQVBJIHRvXG4gICAqIHNlZSBhbGwgb2YgeW91ciBhdmFpbGFibGUgbW9kZWxzLCBvciBzZWUgb3VyXG4gICAqIFtNb2RlbCBvdmVydmlld10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL292ZXJ2aWV3KSBmb3JcbiAgICogZGVzY3JpcHRpb25zIG9mIHRoZW0uXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXNzaXN0YW50LiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMjU2IGNoYXJhY3RlcnMuXG4gICAqL1xuICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgYXNzaXN0YW50YC5cbiAgICovXG4gIG9iamVjdDogJ2Fzc2lzdGFudCc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0b29sIGVuYWJsZWQgb24gdGhlIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMjggdG9vbHMgcGVyXG4gICAqIGFzc2lzdGFudC4gVG9vbHMgY2FuIGJlIG9mIHR5cGVzIGBjb2RlX2ludGVycHJldGVyYCwgYGZpbGVfc2VhcmNoYCwgb3JcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHRvb2xzOiBBcnJheTxBc3Npc3RhbnRUb29sPjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogQXNzaXN0YW50LlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQXNzaXN0YW50IHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudERlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiAnYXNzaXN0YW50LmRlbGV0ZWQnO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXZlbnQgZW1pdHRlZCB3aGVuIHN0cmVhbWluZyBhIFJ1bi5cbiAqXG4gKiBFYWNoIGV2ZW50IGluIGEgc2VydmVyLXNlbnQgZXZlbnRzIHN0cmVhbSBoYXMgYW4gYGV2ZW50YCBhbmQgYGRhdGFgIHByb3BlcnR5OlxuICpcbiAqIGBgYFxuICogZXZlbnQ6IHRocmVhZC5jcmVhdGVkXG4gKiBkYXRhOiB7XCJpZFwiOiBcInRocmVhZF8xMjNcIiwgXCJvYmplY3RcIjogXCJ0aHJlYWRcIiwgLi4ufVxuICogYGBgXG4gKlxuICogV2UgZW1pdCBldmVudHMgd2hlbmV2ZXIgYSBuZXcgb2JqZWN0IGlzIGNyZWF0ZWQsIHRyYW5zaXRpb25zIHRvIGEgbmV3IHN0YXRlLCBvclxuICogaXMgYmVpbmcgc3RyZWFtZWQgaW4gcGFydHMgKGRlbHRhcykuIEZvciBleGFtcGxlLCB3ZSBlbWl0IGB0aHJlYWQucnVuLmNyZWF0ZWRgXG4gKiB3aGVuIGEgbmV3IHJ1biBpcyBjcmVhdGVkLCBgdGhyZWFkLnJ1bi5jb21wbGV0ZWRgIHdoZW4gYSBydW4gY29tcGxldGVzLCBhbmQgc29cbiAqIG9uLiBXaGVuIGFuIEFzc2lzdGFudCBjaG9vc2VzIHRvIGNyZWF0ZSBhIG1lc3NhZ2UgZHVyaW5nIGEgcnVuLCB3ZSBlbWl0IGFcbiAqIGB0aHJlYWQubWVzc2FnZS5jcmVhdGVkIGV2ZW50YCwgYSBgdGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3NgIGV2ZW50LCBtYW55XG4gKiBgdGhyZWFkLm1lc3NhZ2UuZGVsdGFgIGV2ZW50cywgYW5kIGZpbmFsbHkgYSBgdGhyZWFkLm1lc3NhZ2UuY29tcGxldGVkYCBldmVudC5cbiAqXG4gKiBXZSBtYXkgYWRkIGFkZGl0aW9uYWwgZXZlbnRzIG92ZXIgdGltZSwgc28gd2UgcmVjb21tZW5kIGhhbmRsaW5nIHVua25vd24gZXZlbnRzXG4gKiBncmFjZWZ1bGx5IGluIHlvdXIgY29kZS4gU2VlIHRoZVxuICogW0Fzc2lzdGFudHMgQVBJIHF1aWNrc3RhcnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvb3ZlcnZpZXcpXG4gKiB0byBsZWFybiBob3cgdG8gaW50ZWdyYXRlIHRoZSBBc3Npc3RhbnRzIEFQSSB3aXRoIHN0cmVhbWluZy5cbiAqL1xuZXhwb3J0IHR5cGUgQXNzaXN0YW50U3RyZWFtRXZlbnQgPVxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZENyZWF0ZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5DcmVhdGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuUXVldWVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuSW5Qcm9ncmVzc1xuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blJlcXVpcmVzQWN0aW9uXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuQ29tcGxldGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuRmFpbGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuQ2FuY2VsbGluZ1xuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkNhbmNlbGxlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1bkV4cGlyZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwQ3JlYXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBJblByb2dyZXNzXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcERlbHRhXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENvbXBsZXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBGYWlsZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwQ2FuY2VsbGVkXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcEV4cGlyZWRcbiAgfCBBc3Npc3RhbnRTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlQ3JlYXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VJblByb2dyZXNzXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkTWVzc2FnZURlbHRhXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuVGhyZWFkTWVzc2FnZUNvbXBsZXRlZFxuICB8IEFzc2lzdGFudFN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VJbmNvbXBsZXRlXG4gIHwgQXNzaXN0YW50U3RyZWFtRXZlbnQuRXJyb3JFdmVudDtcblxuZXhwb3J0IG5hbWVzcGFjZSBBc3Npc3RhbnRTdHJlYW1FdmVudCB7XG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIG5ld1xuICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMvb2JqZWN0KSBpc1xuICAgKiBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgdGhyZWFkIHRoYXQgY29udGFpbnNcbiAgICAgKiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpLlxuICAgICAqL1xuICAgIGRhdGE6IFRocmVhZHNBUEkuVGhyZWFkO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQuY3JlYXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBuZXdcbiAgICogW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdCkgaXMgY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogbW92ZXMgdG8gYSBgcXVldWVkYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blF1ZXVlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnF1ZXVlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmluX3Byb2dyZXNzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYHJlcXVpcmVzX2FjdGlvbmAgc3RhdHVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5SZXF1aXJlc0FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnJlcXVpcmVzX2FjdGlvbic7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNvbXBsZXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNvbXBsZXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBmYWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuRmFpbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGV4ZWN1dGlvbiBydW4gb24gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogUnVuc0FQSS5SdW47XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uZmFpbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYGNhbmNlbGxpbmdgIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ2FuY2VsbGluZyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNhbmNlbGxpbmcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogaXMgY2FuY2VsbGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5DYW5jZWxsZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jYW5jZWxsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogZXhwaXJlcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuRXhwaXJlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmV4cGlyZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGlzXG4gICAqIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBDcmVhdGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpXG4gICAqIG1vdmVzIHRvIGFuIGBpbl9wcm9ncmVzc2Agc3RhdGUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBJblByb2dyZXNzIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmluX3Byb2dyZXNzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBwYXJ0cyBvZiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBhcmVcbiAgICogYmVpbmcgc3RyZWFtZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBEZWx0YSB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHJ1biBzdGVwIGRlbHRhIGkuZS4gYW55IGNoYW5nZWQgZmllbGRzIG9uIGEgcnVuIHN0ZXAgZHVyaW5nXG4gICAgICogc3RyZWFtaW5nLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXBEZWx0YUV2ZW50O1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuZGVsdGEnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGlzXG4gICAqIGNvbXBsZXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcENvbXBsZXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpXG4gICAqIGZhaWxzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwRmFpbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmZhaWxlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgaXNcbiAgICogY2FuY2VsbGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwQ2FuY2VsbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmNhbmNlbGxlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdClcbiAgICogZXhwaXJlcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcEV4cGlyZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuZXhwaXJlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGlzXG4gICAqIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VDcmVhdGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuY3JlYXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIG1vdmVzXG4gICAqIHRvIGFuIGBpbl9wcm9ncmVzc2Agc3RhdGUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VJblByb2dyZXNzIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3MnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIHBhcnRzIG9mIGFcbiAgICogW01lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBhcmVcbiAgICogYmVpbmcgc3RyZWFtZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VEZWx0YSB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBtZXNzYWdlIGR1cmluZ1xuICAgICAqIHN0cmVhbWluZy5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlRGVsdGFFdmVudDtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBpc1xuICAgKiBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VDb21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5jb21wbGV0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW21lc3NhZ2VdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMvb2JqZWN0KSBlbmRzXG4gICAqIGJlZm9yZSBpdCBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZE1lc3NhZ2VJbmNvbXBsZXRlIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogTWVzc2FnZXNBUEkuTWVzc2FnZTtcblxuICAgIGV2ZW50OiAndGhyZWFkLm1lc3NhZ2UuaW5jb21wbGV0ZSc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYW5cbiAgICogW2Vycm9yXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZXJyb3ItY29kZXMvYXBpLWVycm9ycykgb2NjdXJzLlxuICAgKiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGFuIGludGVybmFsIHNlcnZlciBlcnJvciBvciBhIHRpbWVvdXQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEVycm9yRXZlbnQge1xuICAgIGRhdGE6IFNoYXJlZC5FcnJvck9iamVjdDtcblxuICAgIGV2ZW50OiAnZXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEFzc2lzdGFudFRvb2wgPSBDb2RlSW50ZXJwcmV0ZXJUb29sIHwgRmlsZVNlYXJjaFRvb2wgfCBGdW5jdGlvblRvb2w7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyVG9vbCB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGJlaW5nIGRlZmluZWQ6IGBjb2RlX2ludGVycHJldGVyYFxuICAgKi9cbiAgdHlwZTogJ2NvZGVfaW50ZXJwcmV0ZXInO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2hUb29sIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRvb2wgYmVpbmcgZGVmaW5lZDogYGZpbGVfc2VhcmNoYFxuICAgKi9cbiAgdHlwZTogJ2ZpbGVfc2VhcmNoJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblRvb2wge1xuICBmdW5jdGlvbjogU2hhcmVkLkZ1bmN0aW9uRGVmaW5pdGlvbjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBiZWluZyBkZWZpbmVkOiBgZnVuY3Rpb25gXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIE9jY3VycyB3aGVuIGFcbiAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgaXNcbiAqIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VTdHJlYW1FdmVudCA9XG4gIHwgTWVzc2FnZVN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VDcmVhdGVkXG4gIHwgTWVzc2FnZVN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VJblByb2dyZXNzXG4gIHwgTWVzc2FnZVN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VEZWx0YVxuICB8IE1lc3NhZ2VTdHJlYW1FdmVudC5UaHJlYWRNZXNzYWdlQ29tcGxldGVkXG4gIHwgTWVzc2FnZVN0cmVhbUV2ZW50LlRocmVhZE1lc3NhZ2VJbmNvbXBsZXRlO1xuXG5leHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2VTdHJlYW1FdmVudCB7XG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgaXNcbiAgICogY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZUNyZWF0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFttZXNzYWdlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21lc3NhZ2VzL29iamVjdCkgbW92ZXNcbiAgICogdG8gYW4gYGluX3Byb2dyZXNzYCBzdGF0ZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZUluUHJvZ3Jlc3Mge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gcGFydHMgb2YgYVxuICAgKiBbTWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGFyZVxuICAgKiBiZWluZyBzdHJlYW1lZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZURlbHRhIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBkZWx0YSBpLmUuIGFueSBjaGFuZ2VkIGZpZWxkcyBvbiBhIG1lc3NhZ2UgZHVyaW5nXG4gICAgICogc3RyZWFtaW5nLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2VEZWx0YUV2ZW50O1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5kZWx0YSc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGlzXG4gICAqIGNvbXBsZXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZUNvbXBsZXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2l0aGluIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IE1lc3NhZ2VzQVBJLk1lc3NhZ2U7XG5cbiAgICBldmVudDogJ3RocmVhZC5tZXNzYWdlLmNvbXBsZXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYVxuICAgKiBbbWVzc2FnZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcy9vYmplY3QpIGVuZHNcbiAgICogYmVmb3JlIGl0IGlzIGNvbXBsZXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkTWVzc2FnZUluY29tcGxldGUge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHdpdGhpbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBNZXNzYWdlc0FQSS5NZXNzYWdlO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQubWVzc2FnZS5pbmNvbXBsZXRlJztcbiAgfVxufVxuXG4vKipcbiAqIE9jY3VycyB3aGVuIGFcbiAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICogY3JlYXRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUnVuU3RlcFN0cmVhbUV2ZW50ID1cbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcENyZWF0ZWRcbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcEluUHJvZ3Jlc3NcbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcERlbHRhXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBDb21wbGV0ZWRcbiAgfCBSdW5TdGVwU3RyZWFtRXZlbnQuVGhyZWFkUnVuU3RlcEZhaWxlZFxuICB8IFJ1blN0ZXBTdHJlYW1FdmVudC5UaHJlYWRSdW5TdGVwQ2FuY2VsbGVkXG4gIHwgUnVuU3RlcFN0cmVhbUV2ZW50LlRocmVhZFJ1blN0ZXBFeHBpcmVkO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN0ZXBTdHJlYW1FdmVudCB7XG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jcmVhdGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXRlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5pbl9wcm9ncmVzcyc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gcGFydHMgb2YgYVxuICAgKiBbcnVuIHN0ZXBdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdGVwLW9iamVjdCkgYXJlXG4gICAqIGJlaW5nIHN0cmVhbWVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5TdGVwRGVsdGEge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBydW4gc3RlcCBkZWx0YSBpLmUuIGFueSBjaGFuZ2VkIGZpZWxkcyBvbiBhIHJ1biBzdGVwIGR1cmluZ1xuICAgICAqIHN0cmVhbWluZy5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwRGVsdGFFdmVudDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KSBpc1xuICAgKiBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBDb21wbGV0ZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBzdGVwIGluIGV4ZWN1dGlvbiBvZiBhIHJ1bi5cbiAgICAgKi9cbiAgICBkYXRhOiBTdGVwc0FQSS5SdW5TdGVwO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnN0ZXAuY29tcGxldGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhXG4gICAqIFtydW4gc3RlcF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N0ZXAtb2JqZWN0KVxuICAgKiBmYWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcEZhaWxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5mYWlsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpIGlzXG4gICAqIGNhbmNlbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuU3RlcENhbmNlbGxlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICAgICAqL1xuICAgIGRhdGE6IFN0ZXBzQVBJLlJ1blN0ZXA7XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uc3RlcC5jYW5jZWxsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGFcbiAgICogW3J1biBzdGVwXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3RlcC1vYmplY3QpXG4gICAqIGV4cGlyZXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blN0ZXBFeHBpcmVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgc3RlcCBpbiBleGVjdXRpb24gb2YgYSBydW4uXG4gICAgICovXG4gICAgZGF0YTogU3RlcHNBUEkuUnVuU3RlcDtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5zdGVwLmV4cGlyZWQnO1xuICB9XG59XG5cbi8qKlxuICogT2NjdXJzIHdoZW4gYSBuZXdcbiAqIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpIGlzIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1blN0cmVhbUV2ZW50ID1cbiAgfCBSdW5TdHJlYW1FdmVudC5UaHJlYWRSdW5DcmVhdGVkXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuUXVldWVkXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuSW5Qcm9ncmVzc1xuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1blJlcXVpcmVzQWN0aW9uXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuQ29tcGxldGVkXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuRmFpbGVkXG4gIHwgUnVuU3RyZWFtRXZlbnQuVGhyZWFkUnVuQ2FuY2VsbGluZ1xuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkNhbmNlbGxlZFxuICB8IFJ1blN0cmVhbUV2ZW50LlRocmVhZFJ1bkV4cGlyZWQ7XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3RyZWFtRXZlbnQge1xuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBuZXdcbiAgICogW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdCkgaXMgY3JlYXRlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ3JlYXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNyZWF0ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogbW92ZXMgdG8gYSBgcXVldWVkYCBzdGF0dXMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1blF1ZXVlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnF1ZXVlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBtb3ZlcyB0byBhbiBgaW5fcHJvZ3Jlc3NgIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuSW5Qcm9ncmVzcyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmluX3Byb2dyZXNzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYHJlcXVpcmVzX2FjdGlvbmAgc3RhdHVzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5SZXF1aXJlc0FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLnJlcXVpcmVzX2FjdGlvbic7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZFJ1bkNvbXBsZXRlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNvbXBsZXRlZCc7XG4gIH1cblxuICAvKipcbiAgICogT2NjdXJzIHdoZW4gYSBbcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvb2JqZWN0KVxuICAgKiBmYWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuRmFpbGVkIHtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGFuIGV4ZWN1dGlvbiBydW4gb24gYVxuICAgICAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gICAgICovXG4gICAgZGF0YTogUnVuc0FQSS5SdW47XG5cbiAgICBldmVudDogJ3RocmVhZC5ydW4uZmFpbGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cnMgd2hlbiBhIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9vYmplY3QpXG4gICAqIG1vdmVzIHRvIGEgYGNhbmNlbGxpbmdgIHN0YXR1cy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuQ2FuY2VsbGluZyB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmNhbmNlbGxpbmcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogaXMgY2FuY2VsbGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWRSdW5DYW5jZWxsZWQge1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYW4gZXhlY3V0aW9uIHJ1biBvbiBhXG4gICAgICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAgICAgKi9cbiAgICBkYXRhOiBSdW5zQVBJLlJ1bjtcblxuICAgIGV2ZW50OiAndGhyZWFkLnJ1bi5jYW5jZWxsZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VycyB3aGVuIGEgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL29iamVjdClcbiAgICogZXhwaXJlcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkUnVuRXhwaXJlZCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAgICAgKiBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpLlxuICAgICAqL1xuICAgIGRhdGE6IFJ1bnNBUEkuUnVuO1xuXG4gICAgZXZlbnQ6ICd0aHJlYWQucnVuLmV4cGlyZWQnO1xuICB9XG59XG5cbi8qKlxuICogT2NjdXJzIHdoZW4gYSBuZXdcbiAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcy9vYmplY3QpIGlzXG4gKiBjcmVhdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZFN0cmVhbUV2ZW50IHtcbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSB0aHJlYWQgdGhhdCBjb250YWluc1xuICAgKiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpLlxuICAgKi9cbiAgZGF0YTogVGhyZWFkc0FQSS5UaHJlYWQ7XG5cbiAgZXZlbnQ6ICd0aHJlYWQuY3JlYXRlZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50Q3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFlvdSBjYW4gdXNlIHRoZVxuICAgKiBbTGlzdCBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzL2xpc3QpIEFQSSB0b1xuICAgKiBzZWUgYWxsIG9mIHlvdXIgYXZhaWxhYmxlIG1vZGVscywgb3Igc2VlIG91clxuICAgKiBbTW9kZWwgb3ZlcnZpZXddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9vdmVydmlldykgZm9yXG4gICAqIGRlc2NyaXB0aW9ucyBvZiB0aGVtLlxuICAgKi9cbiAgbW9kZWw6XG4gICAgfCAoc3RyaW5nICYge30pXG4gICAgfCAnZ3B0LTQtdHVyYm8nXG4gICAgfCAnZ3B0LTQtdHVyYm8tMjAyNC0wNC0wOSdcbiAgICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgICB8ICdncHQtNC0xMTA2LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQnXG4gICAgfCAnZ3B0LTQtMDMxNCdcbiAgICB8ICdncHQtNC0wNjEzJ1xuICAgIHwgJ2dwdC00LTMyaydcbiAgICB8ICdncHQtNC0zMmstMDMxNCdcbiAgICB8ICdncHQtNC0zMmstMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrLTA2MTMnO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFzc2lzdGFudC4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc3lzdGVtIGluc3RydWN0aW9ucyB0aGF0IHRoZSBhc3Npc3RhbnQgdXNlcy4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDI1NiwwMDBcbiAgICogY2hhcmFjdGVycy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhc3Npc3RhbnQuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAyNTYgY2hhcmFjdGVycy5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LWFuZC1ncHQtNC10dXJibykgYW5kXG4gICAqIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBBc3Npc3RhbnRDcmVhdGVQYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0b29sIGVuYWJsZWQgb24gdGhlIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMjggdG9vbHMgcGVyXG4gICAqIGFzc2lzdGFudC4gVG9vbHMgY2FuIGJlIG9mIHR5cGVzIGBjb2RlX2ludGVycHJldGVyYCwgYGZpbGVfc2VhcmNoYCwgb3JcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50VG9vbD47XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBc3Npc3RhbnRDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0b29sLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAvKipcbiAgICAgICAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogd2l0aCBmaWxlX2lkcyBhbmQgYXR0YWNoIGl0IHRvIHRoaXMgYXNzaXN0YW50LiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDFcbiAgICAgICAqIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0byB0aGUgYXNzaXN0YW50LlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVzPzogQXJyYXk8RmlsZVNlYXJjaC5WZWN0b3JTdG9yZT47XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmUge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICogYWRkIHRvIHRoZSB2ZWN0b3Igc3RvcmUuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMTAwMDAgZmlsZXMgaW4gYSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAqIHVzZWZ1bCBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZWN0b3Igc3RvcmUgaW4gYSBzdHJ1Y3R1cmVkXG4gICAgICAgICAqIGZvcm1hdC4gS2V5cyBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bVxuICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgKi9cbiAgICAgICAgbWV0YWRhdGE/OiB1bmtub3duO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudFVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGFzc2lzdGFudC4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBjaGFyYWN0ZXJzLlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc3lzdGVtIGluc3RydWN0aW9ucyB0aGF0IHRoZSBhc3Npc3RhbnQgdXNlcy4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDI1NiwwMDBcbiAgICogY2hhcmFjdGVycy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFlvdSBjYW4gdXNlIHRoZVxuICAgKiBbTGlzdCBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzL2xpc3QpIEFQSSB0b1xuICAgKiBzZWUgYWxsIG9mIHlvdXIgYXZhaWxhYmxlIG1vZGVscywgb3Igc2VlIG91clxuICAgKiBbTW9kZWwgb3ZlcnZpZXddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9vdmVydmlldykgZm9yXG4gICAqIGRlc2NyaXB0aW9ucyBvZiB0aGVtLlxuICAgKi9cbiAgbW9kZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhc3Npc3RhbnQuIFRoZSBtYXhpbXVtIGxlbmd0aCBpcyAyNTYgY2hhcmFjdGVycy5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LWFuZC1ncHQtNC10dXJibykgYW5kXG4gICAqIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBBc3Npc3RhbnRVcGRhdGVQYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0b29sIGVuYWJsZWQgb24gdGhlIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMjggdG9vbHMgcGVyXG4gICAqIGFzc2lzdGFudC4gVG9vbHMgY2FuIGJlIG9mIHR5cGVzIGBjb2RlX2ludGVycHJldGVyYCwgYGZpbGVfc2VhcmNoYCwgb3JcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50VG9vbD47XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBc3Npc3RhbnRVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgIC8qKlxuICAgICAgICogT3ZlcnJpZGVzIHRoZSBsaXN0IG9mXG4gICAgICAgKiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGUgYXZhaWxhYmxlXG4gICAgICAgKiB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXMgYXNzb2NpYXRlZFxuICAgICAgICogd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIE92ZXJyaWRlcyB0aGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIGFzc2lzdGFudC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50TGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEFzc2lzdGFudHMge1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudCA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudERlbGV0ZWQgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudERlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50U3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2wgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyVG9vbCA9IEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlU2VhcmNoVG9vbCA9IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25Ub29sID0gQXNzaXN0YW50c0FQSS5GdW5jdGlvblRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZVN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5NZXNzYWdlU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcFN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5SdW5TdGVwU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RyZWFtRXZlbnQgPSBBc3Npc3RhbnRzQVBJLlJ1blN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFRocmVhZFN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5UaHJlYWRTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRzUGFnZSA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50Q3JlYXRlUGFyYW1zID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VXBkYXRlUGFyYW1zID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRVcGRhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50TGlzdFBhcmFtcyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50TGlzdFBhcmFtcztcbn1cbiIsICJpbXBvcnQgeyB0eXBlIENoYXRDb21wbGV0aW9uUnVubmVyIH0gZnJvbSAnLi9DaGF0Q29tcGxldGlvblJ1bm5lcic7XG5pbXBvcnQgeyB0eXBlIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyIH0gZnJvbSAnLi9DaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcic7XG5pbXBvcnQgeyBKU09OU2NoZW1hIH0gZnJvbSAnLi9qc29uc2NoZW1hJztcblxudHlwZSBQcm9taXNlT3JWYWx1ZTxUPiA9IFQgfCBQcm9taXNlPFQ+O1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3MgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICAvKipcbiAgICogQHBhcmFtIGFyZ3MgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGBwYXJzZWAuXG4gICAqIEBwYXJhbSBydW5uZXIgdGhlIHJ1bm5lciBldmFsdWF0aW5nIHRoaXMgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIGEgc3RyaW5nIHRvIHNlbmQgYmFjayB0byBPcGVuQUkuXG4gICAqL1xuICBmdW5jdGlvbjogKFxuICAgIGFyZ3M6IEFyZ3MsXG4gICAgcnVubmVyOiBDaGF0Q29tcGxldGlvblJ1bm5lciB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyLFxuICApID0+IFByb21pc2VPclZhbHVlPHVua25vd24+O1xuICAvKipcbiAgICogQHBhcmFtIGlucHV0IHRoZSByYXcgYXJncyBmcm9tIHRoZSBPcGVuQUkgZnVuY3Rpb24gY2FsbC5cbiAgICogQHJldHVybnMgdGhlIHBhcnNlZCBhcmd1bWVudHMgdG8gcGFzcyB0byBgZnVuY3Rpb25gXG4gICAqL1xuICBwYXJzZTogKGlucHV0OiBzdHJpbmcpID0+IFByb21pc2VPclZhbHVlPEFyZ3M+O1xuICAvKipcbiAgICogVGhlIHBhcmFtZXRlcnMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMsIGRlc2NyaWJlcyBhcyBhIEpTT04gU2NoZW1hIG9iamVjdC5cbiAgICovXG4gIHBhcmFtZXRlcnM6IEpTT05TY2hlbWE7XG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGNob29zZSB3aGVuIGFuZCBob3cgdG8gY2FsbCB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gV2lsbCBkZWZhdWx0IHRvIGZ1bmN0aW9uLm5hbWUgaWYgb21pdHRlZC5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZUZ1bmN0aW9uV2l0aG91dFBhcnNlID0ge1xuICAvKipcbiAgICogQHBhcmFtIGFyZ3MgdGhlIHJhdyBhcmdzIGZyb20gdGhlIE9wZW5BSSBmdW5jdGlvbiBjYWxsLlxuICAgKiBAcmV0dXJucyBhIHN0cmluZyB0byBzZW5kIGJhY2sgdG8gT3BlbkFJXG4gICAqL1xuICBmdW5jdGlvbjogKFxuICAgIGFyZ3M6IHN0cmluZyxcbiAgICBydW5uZXI6IENoYXRDb21wbGV0aW9uUnVubmVyIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIsXG4gICkgPT4gUHJvbWlzZU9yVmFsdWU8dW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcGFyYW1ldGVycyB0aGUgZnVuY3Rpb24gYWNjZXB0cywgZGVzY3JpYmVzIGFzIGEgSlNPTiBTY2hlbWEgb2JqZWN0LlxuICAgKi9cbiAgcGFyYW1ldGVyczogSlNPTlNjaGVtYTtcbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgZnVuY3Rpb24gZG9lcywgdXNlZCBieSB0aGUgbW9kZWwgdG8gY2hvb3NlIHdoZW4gYW5kIGhvdyB0byBjYWxsIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiBXaWxsIGRlZmF1bHQgdG8gZnVuY3Rpb24ubmFtZSBpZiBvbWl0dGVkLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlRnVuY3Rpb248QXJncyBleHRlbmRzIG9iamVjdCB8IHN0cmluZz4gPVxuICBBcmdzIGV4dGVuZHMgc3RyaW5nID8gUnVubmFibGVGdW5jdGlvbldpdGhvdXRQYXJzZVxuICA6IEFyZ3MgZXh0ZW5kcyBvYmplY3QgPyBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+XG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlVG9vbEZ1bmN0aW9uPEFyZ3MgZXh0ZW5kcyBvYmplY3QgfCBzdHJpbmc+ID1cbiAgQXJncyBleHRlbmRzIHN0cmluZyA/IFJ1bm5hYmxlVG9vbEZ1bmN0aW9uV2l0aG91dFBhcnNlXG4gIDogQXJncyBleHRlbmRzIG9iamVjdCA/IFJ1bm5hYmxlVG9vbEZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+XG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIFJ1bm5hYmxlVG9vbEZ1bmN0aW9uV2l0aG91dFBhcnNlID0ge1xuICB0eXBlOiAnZnVuY3Rpb24nO1xuICBmdW5jdGlvbjogUnVubmFibGVGdW5jdGlvbldpdGhvdXRQYXJzZTtcbn07XG5leHBvcnQgdHlwZSBSdW5uYWJsZVRvb2xGdW5jdGlvbldpdGhQYXJzZTxBcmdzIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgdHlwZTogJ2Z1bmN0aW9uJztcbiAgZnVuY3Rpb246IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3MgZXh0ZW5kcyBvYmplY3Q+KFxuICBmbjogYW55LFxuKTogZm4gaXMgUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPiB7XG4gIHJldHVybiB0eXBlb2YgKGZuIGFzIGFueSkucGFyc2UgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCB0eXBlIEJhc2VGdW5jdGlvbnNBcmdzID0gcmVhZG9ubHkgKG9iamVjdCB8IHN0cmluZylbXTtcblxuZXhwb3J0IHR5cGUgUnVubmFibGVGdW5jdGlvbnM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPiA9XG4gIFthbnlbXV0gZXh0ZW5kcyBbRnVuY3Rpb25zQXJnc10gPyByZWFkb25seSBSdW5uYWJsZUZ1bmN0aW9uPGFueT5bXVxuICA6IHtcbiAgICAgIFtJbmRleCBpbiBrZXlvZiBGdW5jdGlvbnNBcmdzXTogSW5kZXggZXh0ZW5kcyBudW1iZXIgPyBSdW5uYWJsZUZ1bmN0aW9uPEZ1bmN0aW9uc0FyZ3NbSW5kZXhdPlxuICAgICAgOiBGdW5jdGlvbnNBcmdzW0luZGV4XTtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBSdW5uYWJsZVRvb2xzPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4gPVxuICBbYW55W11dIGV4dGVuZHMgW0Z1bmN0aW9uc0FyZ3NdID8gcmVhZG9ubHkgUnVubmFibGVUb29sRnVuY3Rpb248YW55PltdXG4gIDoge1xuICAgICAgW0luZGV4IGluIGtleW9mIEZ1bmN0aW9uc0FyZ3NdOiBJbmRleCBleHRlbmRzIG51bWJlciA/IFJ1bm5hYmxlVG9vbEZ1bmN0aW9uPEZ1bmN0aW9uc0FyZ3NbSW5kZXhdPlxuICAgICAgOiBGdW5jdGlvbnNBcmdzW0luZGV4XTtcbiAgICB9O1xuXG4vKipcbiAqIFRoaXMgaXMgaGVscGVyIGNsYXNzIGZvciBwYXNzaW5nIGEgYGZ1bmN0aW9uYCBhbmQgYHBhcnNlYCB3aGVyZSB0aGUgYGZ1bmN0aW9uYFxuICogYXJndW1lbnQgdHlwZSBtYXRjaGVzIHRoZSBgcGFyc2VgIHJldHVybiB0eXBlLlxuICpcbiAqIEBkZXByZWNhdGVkIC0gcGxlYXNlIHVzZSBQYXJzaW5nVG9vbEZ1bmN0aW9uIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJzaW5nRnVuY3Rpb248QXJncyBleHRlbmRzIG9iamVjdD4ge1xuICBmdW5jdGlvbjogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPlsnZnVuY3Rpb24nXTtcbiAgcGFyc2U6IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5bJ3BhcnNlJ107XG4gIHBhcmFtZXRlcnM6IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5bJ3BhcmFtZXRlcnMnXTtcbiAgZGVzY3JpcHRpb246IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz5bJ2Rlc2NyaXB0aW9uJ107XG4gIG5hbWU/OiBSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlPEFyZ3M+WyduYW1lJ107XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2U8QXJncz4pIHtcbiAgICB0aGlzLmZ1bmN0aW9uID0gaW5wdXQuZnVuY3Rpb247XG4gICAgdGhpcy5wYXJzZSA9IGlucHV0LnBhcnNlO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IGlucHV0LnBhcmFtZXRlcnM7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGlucHV0LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMubmFtZSA9IGlucHV0Lm5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIGhlbHBlciBjbGFzcyBmb3IgcGFzc2luZyBhIGBmdW5jdGlvbmAgYW5kIGBwYXJzZWAgd2hlcmUgdGhlIGBmdW5jdGlvbmBcbiAqIGFyZ3VtZW50IHR5cGUgbWF0Y2hlcyB0aGUgYHBhcnNlYCByZXR1cm4gdHlwZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhcnNpbmdUb29sRnVuY3Rpb248QXJncyBleHRlbmRzIG9iamVjdD4ge1xuICB0eXBlOiAnZnVuY3Rpb24nO1xuICBmdW5jdGlvbjogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPjtcblxuICBjb25zdHJ1Y3RvcihpbnB1dDogUnVubmFibGVGdW5jdGlvbldpdGhQYXJzZTxBcmdzPikge1xuICAgIHRoaXMudHlwZSA9ICdmdW5jdGlvbic7XG4gICAgdGhpcy5mdW5jdGlvbiA9IGlucHV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtLFxuICB0eXBlIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtLFxuICB0eXBlIENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSxcbn0gZnJvbSBcIi4uL3Jlc291cmNlc1wiO1xuXG5leHBvcnQgY29uc3QgaXNBc3Npc3RhbnRNZXNzYWdlID0gKFxuICBtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBtZXNzYWdlIGlzIENoYXRDb21wbGV0aW9uQXNzaXN0YW50TWVzc2FnZVBhcmFtID0+IHtcbiAgcmV0dXJuIG1lc3NhZ2U/LnJvbGUgPT09ICdhc3Npc3RhbnQnO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRnVuY3Rpb25NZXNzYWdlID0gKFxuICBtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBtZXNzYWdlIGlzIENoYXRDb21wbGV0aW9uRnVuY3Rpb25NZXNzYWdlUGFyYW0gPT4ge1xuICByZXR1cm4gbWVzc2FnZT8ucm9sZSA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmV4cG9ydCBjb25zdCBpc1Rvb2xNZXNzYWdlID0gKFxuICBtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBtZXNzYWdlIGlzIENoYXRDb21wbGV0aW9uVG9vbE1lc3NhZ2VQYXJhbSA9PiB7XG4gIHJldHVybiBtZXNzYWdlPy5yb2xlID09PSAndG9vbCc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVzZW50PFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBvYmogaXMgVCB7XG4gIHJldHVybiBvYmogIT0gbnVsbDtcbn1cbiIsICJpbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIENvbXBsZXRpb25Vc2FnZSB9IGZyb20gXCIuLi9yZXNvdXJjZXMvY29tcGxldGlvbnNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29tcGxldGlvbnMsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb24sXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25NZXNzYWdlLFxuICB0eXBlIENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICB0eXBlIENoYXRDb21wbGV0aW9uVG9vbCxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9jaGF0L2NvbXBsZXRpb25zXCI7XG5pbXBvcnQgeyBBUElVc2VyQWJvcnRFcnJvciwgT3BlbkFJRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcbmltcG9ydCB7XG4gIHR5cGUgUnVubmFibGVGdW5jdGlvbixcbiAgaXNSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlLFxuICB0eXBlIEJhc2VGdW5jdGlvbnNBcmdzLFxufSBmcm9tICcuL1J1bm5hYmxlRnVuY3Rpb24nO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtcywgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zIH0gZnJvbSAnLi9DaGF0Q29tcGxldGlvblJ1bm5lcic7XG5pbXBvcnQge1xuICBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zLFxuICBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXMsXG59IGZyb20gJy4vQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXInO1xuaW1wb3J0IHsgaXNBc3Npc3RhbnRNZXNzYWdlLCBpc0Z1bmN0aW9uTWVzc2FnZSwgaXNUb29sTWVzc2FnZSB9IGZyb20gJy4vY2hhdENvbXBsZXRpb25VdGlscyc7XG5cbmNvbnN0IERFRkFVTFRfTUFYX0NIQVRfQ09NUExFVElPTlMgPSAxMDtcbmV4cG9ydCBpbnRlcmZhY2UgUnVubmVyT3B0aW9ucyBleHRlbmRzIENvcmUuUmVxdWVzdE9wdGlvbnMge1xuICAvKiogSG93IG1hbnkgcmVxdWVzdHMgdG8gbWFrZSBiZWZvcmUgY2FuY2VsaW5nLiBEZWZhdWx0IDEwLiAqL1xuICBtYXhDaGF0Q29tcGxldGlvbnM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyPFxuICBFdmVudHMgZXh0ZW5kcyBDdXN0b21FdmVudHM8YW55PiA9IEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMsXG4+IHtcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICNjb25uZWN0ZWRQcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAjcmVzb2x2ZUNvbm5lY3RlZFByb21pc2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgI3JlamVjdENvbm5lY3RlZFByb21pc2U6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAjZW5kUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgI3Jlc29sdmVFbmRQcm9taXNlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICNyZWplY3RFbmRQcm9taXNlOiAoZXJyb3I6IE9wZW5BSUVycm9yKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgI2xpc3RlbmVyczogeyBbRXZlbnQgaW4ga2V5b2YgRXZlbnRzXT86IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+IH0gPSB7fTtcblxuICBwcm90ZWN0ZWQgX2NoYXRDb21wbGV0aW9uczogQ2hhdENvbXBsZXRpb25bXSA9IFtdO1xuICBtZXNzYWdlczogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW1bXSA9IFtdO1xuXG4gICNlbmRlZCA9IGZhbHNlO1xuICAjZXJyb3JlZCA9IGZhbHNlO1xuICAjYWJvcnRlZCA9IGZhbHNlO1xuICAjY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuI2Nvbm5lY3RlZFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLiNyZXNvbHZlQ29ubmVjdGVkUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgICB0aGlzLiNyZWplY3RDb25uZWN0ZWRQcm9taXNlID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgdGhpcy4jZW5kUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuI3Jlc29sdmVFbmRQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMuI3JlamVjdEVuZFByb21pc2UgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICAvLyBEb24ndCBsZXQgdGhlc2UgcHJvbWlzZXMgY2F1c2UgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvcnMuXG4gICAgLy8gd2Ugd2lsbCBtYW51YWxseSBjYXVzZSBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9yIGxhdGVyXG4gICAgLy8gaWYgdGhlIHVzZXIgaGFzbid0IHJlZ2lzdGVyZWQgYW55IGVycm9yIGxpc3RlbmVyIG9yIGNhbGxlZFxuICAgIC8vIGFueSBwcm9taXNlLXJldHVybmluZyBtZXRob2QuXG4gICAgdGhpcy4jY29ubmVjdGVkUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgdGhpcy4jZW5kUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3J1bihleGVjdXRvcjogKCkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgLy8gVW5mb3J0dW5hdGVseSBpZiB3ZSBjYWxsIGBleGVjdXRvcigpYCBpbW1lZGlhdGVseSB3ZSBnZXQgcnVudGltZSBlcnJvcnMgYWJvdXRcbiAgICAvLyByZWZlcmVuY2VzIHRvIGB0aGlzYCBiZWZvcmUgdGhlIGBzdXBlcigpYCBjb25zdHJ1Y3RvciBjYWxsIHJldHVybnMuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBleGVjdXRvcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9lbWl0RmluYWwoKTtcbiAgICAgICAgdGhpcy5fZW1pdCgnZW5kJyk7XG4gICAgICB9LCB0aGlzLiNoYW5kbGVFcnJvcik7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2FkZENoYXRDb21wbGV0aW9uKGNoYXRDb21wbGV0aW9uOiBDaGF0Q29tcGxldGlvbik6IENoYXRDb21wbGV0aW9uIHtcbiAgICB0aGlzLl9jaGF0Q29tcGxldGlvbnMucHVzaChjaGF0Q29tcGxldGlvbik7XG4gICAgdGhpcy5fZW1pdCgnY2hhdENvbXBsZXRpb24nLCBjaGF0Q29tcGxldGlvbik7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNoYXRDb21wbGV0aW9uLmNob2ljZXNbMF0/Lm1lc3NhZ2U7XG4gICAgaWYgKG1lc3NhZ2UpIHRoaXMuX2FkZE1lc3NhZ2UobWVzc2FnZSBhcyBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSk7XG4gICAgcmV0dXJuIGNoYXRDb21wbGV0aW9uO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9hZGRNZXNzYWdlKG1lc3NhZ2U6IENoYXRDb21wbGV0aW9uTWVzc2FnZVBhcmFtLCBlbWl0ID0gdHJ1ZSkge1xuICAgIGlmICghKCdjb250ZW50JyBpbiBtZXNzYWdlKSkgbWVzc2FnZS5jb250ZW50ID0gbnVsbDtcblxuICAgIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKTtcblxuICAgIGlmIChlbWl0KSB7XG4gICAgICB0aGlzLl9lbWl0KCdtZXNzYWdlJywgbWVzc2FnZSk7XG4gICAgICBpZiAoKGlzRnVuY3Rpb25NZXNzYWdlKG1lc3NhZ2UpIHx8IGlzVG9vbE1lc3NhZ2UobWVzc2FnZSkpICYmIG1lc3NhZ2UuY29udGVudCkge1xuICAgICAgICAvLyBOb3RlLCB0aGlzIGFzc3VtZXMgdGhhdCB7cm9sZTogJ3Rvb2wnLCBjb250ZW50OiBcdTIwMjZ9IGlzIGFsd2F5cyB0aGUgcmVzdWx0IG9mIGEgY2FsbCBvZiB0b29sIG9mIHR5cGU9ZnVuY3Rpb24uXG4gICAgICAgIHRoaXMuX2VtaXQoJ2Z1bmN0aW9uQ2FsbFJlc3VsdCcsIG1lc3NhZ2UuY29udGVudCBhcyBzdHJpbmcpO1xuICAgICAgfSBlbHNlIGlmIChpc0Fzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSkgJiYgbWVzc2FnZS5mdW5jdGlvbl9jYWxsKSB7XG4gICAgICAgIHRoaXMuX2VtaXQoJ2Z1bmN0aW9uQ2FsbCcsIG1lc3NhZ2UuZnVuY3Rpb25fY2FsbCk7XG4gICAgICB9IGVsc2UgaWYgKGlzQXNzaXN0YW50TWVzc2FnZShtZXNzYWdlKSAmJiBtZXNzYWdlLnRvb2xfY2FsbHMpIHtcbiAgICAgICAgZm9yIChjb25zdCB0b29sX2NhbGwgb2YgbWVzc2FnZS50b29sX2NhbGxzKSB7XG4gICAgICAgICAgaWYgKHRvb2xfY2FsbC50eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0KCdmdW5jdGlvbkNhbGwnLCB0b29sX2NhbGwuZnVuY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfY29ubmVjdGVkKCkge1xuICAgIGlmICh0aGlzLmVuZGVkKSByZXR1cm47XG4gICAgdGhpcy4jcmVzb2x2ZUNvbm5lY3RlZFByb21pc2UoKTtcbiAgICB0aGlzLl9lbWl0KCdjb25uZWN0Jyk7XG4gIH1cblxuICBnZXQgZW5kZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2VuZGVkO1xuICB9XG5cbiAgZ2V0IGVycm9yZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2Vycm9yZWQ7XG4gIH1cblxuICBnZXQgYWJvcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jYWJvcnRlZDtcbiAgfVxuXG4gIGFib3J0KCkge1xuICAgIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3RlbmVycyBhcnJheSBmb3IgdGhlIGV2ZW50LlxuICAgKiBObyBjaGVja3MgYXJlIG1hZGUgdG8gc2VlIGlmIHRoZSBsaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLiBNdWx0aXBsZSBjYWxscyBwYXNzaW5nXG4gICAqIHRoZSBzYW1lIGNvbWJpbmF0aW9uIG9mIGV2ZW50IGFuZCBsaXN0ZW5lciB3aWxsIHJlc3VsdCBpbiB0aGUgbGlzdGVuZXIgYmVpbmcgYWRkZWQsIGFuZFxuICAgKiBjYWxsZWQsIG11bHRpcGxlIHRpbWVzLlxuICAgKiBAcmV0dXJucyB0aGlzIENoYXRDb21wbGV0aW9uU3RyZWFtLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkXG4gICAqL1xuICBvbjxFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEV2ZW50LCBsaXN0ZW5lcjogTGlzdGVuZXJGb3JFdmVudDxFdmVudHMsIEV2ZW50Pik6IHRoaXMge1xuICAgIGNvbnN0IGxpc3RlbmVyczogTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4gPVxuICAgICAgdGhpcy4jbGlzdGVuZXJzW2V2ZW50XSB8fCAodGhpcy4jbGlzdGVuZXJzW2V2ZW50XSA9IFtdKTtcbiAgICBsaXN0ZW5lcnMucHVzaCh7IGxpc3RlbmVyIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0ZW5lciBhcnJheSBmb3IgdGhlIGV2ZW50LlxuICAgKiBvZmYoKSB3aWxsIHJlbW92ZSwgYXQgbW9zdCwgb25lIGluc3RhbmNlIG9mIGEgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgYXJyYXkuIElmIGFueSBzaW5nbGVcbiAgICogbGlzdGVuZXIgaGFzIGJlZW4gYWRkZWQgbXVsdGlwbGUgdGltZXMgdG8gdGhlIGxpc3RlbmVyIGFycmF5IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LCB0aGVuXG4gICAqIG9mZigpIG11c3QgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHJlbW92ZSBlYWNoIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB0aGlzIENoYXRDb21wbGV0aW9uU3RyZWFtLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkXG4gICAqL1xuICBvZmY8RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4pOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdO1xuICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm4gdGhpcztcbiAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5maW5kSW5kZXgoKGwpID0+IGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKTtcbiAgICBpZiAoaW5kZXggPj0gMCkgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG9uZS10aW1lIGxpc3RlbmVyIGZ1bmN0aW9uIGZvciB0aGUgZXZlbnQuIFRoZSBuZXh0IHRpbWUgdGhlIGV2ZW50IGlzIHRyaWdnZXJlZCxcbiAgICogdGhpcyBsaXN0ZW5lciBpcyByZW1vdmVkIGFuZCB0aGVuIGludm9rZWQuXG4gICAqIEByZXR1cm5zIHRoaXMgQ2hhdENvbXBsZXRpb25TdHJlYW0sIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWRcbiAgICovXG4gIG9uY2U8RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4pOiB0aGlzIHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IExpc3RlbmVyc0ZvckV2ZW50PEV2ZW50cywgRXZlbnQ+ID1cbiAgICAgIHRoaXMuI2xpc3RlbmVyc1tldmVudF0gfHwgKHRoaXMuI2xpc3RlbmVyc1tldmVudF0gPSBbXSk7XG4gICAgbGlzdGVuZXJzLnB1c2goeyBsaXN0ZW5lciwgb25jZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gYC5vbmNlKClgLCBidXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0aGUgbmV4dCB0aW1lXG4gICAqIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQsIGluc3RlYWQgb2YgY2FsbGluZyBhIGxpc3RlbmVyIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0aGUgbmV4dCB0aW1lIGdpdmVuIGV2ZW50IGlzIHRyaWdnZXJlZCxcbiAgICogb3IgcmVqZWN0cyBpZiBhbiBlcnJvciBpcyBlbWl0dGVkLiAgKElmIHlvdSByZXF1ZXN0IHRoZSAnZXJyb3InIGV2ZW50LFxuICAgKiByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGVycm9yKS5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogICBjb25zdCBtZXNzYWdlID0gYXdhaXQgc3RyZWFtLmVtaXR0ZWQoJ21lc3NhZ2UnKSAvLyByZWplY3RzIGlmIHRoZSBzdHJlYW0gZXJyb3JzXG4gICAqL1xuICBlbWl0dGVkPEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPihcbiAgICBldmVudDogRXZlbnQsXG4gICk6IFByb21pc2U8XG4gICAgRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cywgRXZlbnQ+IGV4dGVuZHMgW2luZmVyIFBhcmFtXSA/IFBhcmFtXG4gICAgOiBFdmVudFBhcmFtZXRlcnM8RXZlbnRzLCBFdmVudD4gZXh0ZW5kcyBbXSA/IHZvaWRcbiAgICA6IEV2ZW50UGFyYW1ldGVyczxFdmVudHMsIEV2ZW50PlxuICA+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy4jY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCA9IHRydWU7XG4gICAgICBpZiAoZXZlbnQgIT09ICdlcnJvcicpIHRoaXMub25jZSgnZXJyb3InLCByZWplY3QpO1xuICAgICAgdGhpcy5vbmNlKGV2ZW50LCByZXNvbHZlIGFzIGFueSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBkb25lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgPSB0cnVlO1xuICAgIGF3YWl0IHRoaXMuI2VuZFByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZmluYWwgQ2hhdENvbXBsZXRpb24sIG9yIHJlamVjdHNcbiAgICogaWYgYW4gZXJyb3Igb2NjdXJyZWQgb3IgdGhlIHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseSB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uLlxuICAgKi9cbiAgYXN5bmMgZmluYWxDaGF0Q29tcGxldGlvbigpOiBQcm9taXNlPENoYXRDb21wbGV0aW9uPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMuX2NoYXRDb21wbGV0aW9uc1t0aGlzLl9jaGF0Q29tcGxldGlvbnMubGVuZ3RoIC0gMV07XG4gICAgaWYgKCFjb21wbGV0aW9uKSB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoJ3N0cmVhbSBlbmRlZCB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uJyk7XG4gICAgcmV0dXJuIGNvbXBsZXRpb247XG4gIH1cblxuICAjZ2V0RmluYWxDb250ZW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLiNnZXRGaW5hbE1lc3NhZ2UoKS5jb250ZW50ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgZmluYWwgQ2hhdENvbXBsZXRpb25NZXNzYWdlLCBvciByZWplY3RzXG4gICAqIGlmIGFuIGVycm9yIG9jY3VycmVkIG9yIHRoZSBzdHJlYW0gZW5kZWQgcHJlbWF0dXJlbHkgd2l0aG91dCBwcm9kdWNpbmcgYSBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuXG4gICAqL1xuICBhc3luYyBmaW5hbENvbnRlbnQoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgYXdhaXQgdGhpcy5kb25lKCk7XG4gICAgcmV0dXJuIHRoaXMuI2dldEZpbmFsQ29udGVudCgpO1xuICB9XG5cbiAgI2dldEZpbmFsTWVzc2FnZSgpOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2Uge1xuICAgIGxldCBpID0gdGhpcy5tZXNzYWdlcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW2ldO1xuICAgICAgaWYgKGlzQXNzaXN0YW50TWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgICByZXR1cm4geyAuLi5tZXNzYWdlLCBjb250ZW50OiBtZXNzYWdlLmNvbnRlbnQgPz8gbnVsbCB9O1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoJ3N0cmVhbSBlbmRlZCB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uTWVzc2FnZSB3aXRoIHJvbGU9YXNzaXN0YW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdGhlIGZpbmFsIGFzc2lzdGFudCBDaGF0Q29tcGxldGlvbk1lc3NhZ2UgcmVzcG9uc2UsXG4gICAqIG9yIHJlamVjdHMgaWYgYW4gZXJyb3Igb2NjdXJyZWQgb3IgdGhlIHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseSB3aXRob3V0IHByb2R1Y2luZyBhIENoYXRDb21wbGV0aW9uTWVzc2FnZS5cbiAgICovXG4gIGFzeW5jIGZpbmFsTWVzc2FnZSgpOiBQcm9taXNlPENoYXRDb21wbGV0aW9uTWVzc2FnZT4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuICAgIHJldHVybiB0aGlzLiNnZXRGaW5hbE1lc3NhZ2UoKTtcbiAgfVxuXG4gICNnZXRGaW5hbEZ1bmN0aW9uQ2FsbCgpOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuRnVuY3Rpb25DYWxsIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5tZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMubWVzc2FnZXNbaV07XG4gICAgICBpZiAoaXNBc3Npc3RhbnRNZXNzYWdlKG1lc3NhZ2UpICYmIG1lc3NhZ2U/LmZ1bmN0aW9uX2NhbGwpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZnVuY3Rpb25fY2FsbDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Fzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSkgJiYgbWVzc2FnZT8udG9vbF9jYWxscz8ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlLnRvb2xfY2FsbHMuYXQoLTEpPy5mdW5jdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgZmluYWwgRnVuY3Rpb25DYWxsLCBvciByZWplY3RzXG4gICAqIGlmIGFuIGVycm9yIG9jY3VycmVkIG9yIHRoZSBzdHJlYW0gZW5kZWQgcHJlbWF0dXJlbHkgd2l0aG91dCBwcm9kdWNpbmcgYSBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuXG4gICAqL1xuICBhc3luYyBmaW5hbEZ1bmN0aW9uQ2FsbCgpOiBQcm9taXNlPENoYXRDb21wbGV0aW9uTWVzc2FnZS5GdW5jdGlvbkNhbGwgfCB1bmRlZmluZWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICByZXR1cm4gdGhpcy4jZ2V0RmluYWxGdW5jdGlvbkNhbGwoKTtcbiAgfVxuXG4gICNnZXRGaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1tpXTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uTWVzc2FnZShtZXNzYWdlKSAmJiBtZXNzYWdlLmNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS5jb250ZW50O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBpc1Rvb2xNZXNzYWdlKG1lc3NhZ2UpICYmXG4gICAgICAgIG1lc3NhZ2UuY29udGVudCAhPSBudWxsICYmXG4gICAgICAgIHRoaXMubWVzc2FnZXMuc29tZShcbiAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgIHgucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiZcbiAgICAgICAgICAgIHgudG9vbF9jYWxscz8uc29tZSgoeSkgPT4geS50eXBlID09PSAnZnVuY3Rpb24nICYmIHkuaWQgPT09IG1lc3NhZ2UudG9vbF9jYWxsX2lkKSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlLmNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXN5bmMgZmluYWxGdW5jdGlvbkNhbGxSZXN1bHQoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICByZXR1cm4gdGhpcy4jZ2V0RmluYWxGdW5jdGlvbkNhbGxSZXN1bHQoKTtcbiAgfVxuXG4gICNjYWxjdWxhdGVUb3RhbFVzYWdlKCk6IENvbXBsZXRpb25Vc2FnZSB7XG4gICAgY29uc3QgdG90YWw6IENvbXBsZXRpb25Vc2FnZSA9IHtcbiAgICAgIGNvbXBsZXRpb25fdG9rZW5zOiAwLFxuICAgICAgcHJvbXB0X3Rva2VuczogMCxcbiAgICAgIHRvdGFsX3Rva2VuczogMCxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgeyB1c2FnZSB9IG9mIHRoaXMuX2NoYXRDb21wbGV0aW9ucykge1xuICAgICAgaWYgKHVzYWdlKSB7XG4gICAgICAgIHRvdGFsLmNvbXBsZXRpb25fdG9rZW5zICs9IHVzYWdlLmNvbXBsZXRpb25fdG9rZW5zO1xuICAgICAgICB0b3RhbC5wcm9tcHRfdG9rZW5zICs9IHVzYWdlLnByb21wdF90b2tlbnM7XG4gICAgICAgIHRvdGFsLnRvdGFsX3Rva2VucyArPSB1c2FnZS50b3RhbF90b2tlbnM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIGFzeW5jIHRvdGFsVXNhZ2UoKTogUHJvbWlzZTxDb21wbGV0aW9uVXNhZ2U+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcbiAgICByZXR1cm4gdGhpcy4jY2FsY3VsYXRlVG90YWxVc2FnZSgpO1xuICB9XG5cbiAgYWxsQ2hhdENvbXBsZXRpb25zKCk6IENoYXRDb21wbGV0aW9uW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fY2hhdENvbXBsZXRpb25zXTtcbiAgfVxuXG4gICNoYW5kbGVFcnJvciA9IChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgIHRoaXMuI2Vycm9yZWQgPSB0cnVlO1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgZXJyb3IgPSBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQVBJVXNlckFib3J0RXJyb3IpIHtcbiAgICAgIHRoaXMuI2Fib3J0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuX2VtaXQoJ2Fib3J0JywgZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBPcGVuQUlFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMuX2VtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc3Qgb3BlbkFJRXJyb3I6IE9wZW5BSUVycm9yID0gbmV3IE9wZW5BSUVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3BlbkFJRXJyb3IuY2F1c2UgPSBlcnJvcjtcbiAgICAgIHJldHVybiB0aGlzLl9lbWl0KCdlcnJvcicsIG9wZW5BSUVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VtaXQoJ2Vycm9yJywgbmV3IE9wZW5BSUVycm9yKFN0cmluZyhlcnJvcikpKTtcbiAgfTtcblxuICBwcm90ZWN0ZWQgX2VtaXQ8RXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBFdmVudCwgLi4uYXJnczogRXZlbnRQYXJhbWV0ZXJzPEV2ZW50cywgRXZlbnQ+KSB7XG4gICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IGVtaXQgYW55IGV2ZW50cyBhZnRlciBlbmRcbiAgICBpZiAodGhpcy4jZW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdlbmQnKSB7XG4gICAgICB0aGlzLiNlbmRlZCA9IHRydWU7XG4gICAgICB0aGlzLiNyZXNvbHZlRW5kUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyczogTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD4gfCB1bmRlZmluZWQgPSB0aGlzLiNsaXN0ZW5lcnNbZXZlbnRdO1xuICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuI2xpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnMuZmlsdGVyKChsKSA9PiAhbC5vbmNlKSBhcyBhbnk7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoeyBsaXN0ZW5lciB9OiBhbnkpID0+IGxpc3RlbmVyKC4uLmFyZ3MpKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdhYm9ydCcpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXJnc1swXSBhcyBBUElVc2VyQWJvcnRFcnJvcjtcbiAgICAgIGlmICghdGhpcy4jY2F0Y2hpbmdQcm9taXNlQ3JlYXRlZCAmJiAhbGlzdGVuZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy4jcmVqZWN0Q29ubmVjdGVkUHJvbWlzZShlcnJvcik7XG4gICAgICB0aGlzLiNyZWplY3RFbmRQcm9taXNlKGVycm9yKTtcbiAgICAgIHRoaXMuX2VtaXQoJ2VuZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2Vycm9yJykge1xuICAgICAgLy8gTk9URTogX2VtaXQoJ2Vycm9yJywgZXJyb3IpIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tICNoYW5kbGVFcnJvcigpLlxuXG4gICAgICBjb25zdCBlcnJvciA9IGFyZ3NbMF0gYXMgT3BlbkFJRXJyb3I7XG4gICAgICBpZiAoIXRoaXMuI2NhdGNoaW5nUHJvbWlzZUNyZWF0ZWQgJiYgIWxpc3RlbmVycz8ubGVuZ3RoKSB7XG4gICAgICAgIC8vIFRyaWdnZXIgYW4gdW5oYW5kbGVkIHJlamVjdGlvbiBpZiB0aGUgdXNlciBoYXNuJ3QgcmVnaXN0ZXJlZCBhbnkgZXJyb3IgaGFuZGxlcnMuXG4gICAgICAgIC8vIElmIHlvdSBhcmUgc2VlaW5nIHN0YWNrIHRyYWNlcyBoZXJlLCBtYWtlIHN1cmUgdG8gaGFuZGxlIGVycm9ycyB2aWEgZWl0aGVyOlxuICAgICAgICAvLyAtIHJ1bm5lci5vbignZXJyb3InLCAoKSA9PiAuLi4pXG4gICAgICAgIC8vIC0gYXdhaXQgcnVubmVyLmRvbmUoKVxuICAgICAgICAvLyAtIGF3YWl0IHJ1bm5lci5maW5hbENoYXRDb21wbGV0aW9uKClcbiAgICAgICAgLy8gLSBldGMuXG4gICAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3JlamVjdENvbm5lY3RlZFByb21pc2UoZXJyb3IpO1xuICAgICAgdGhpcy4jcmVqZWN0RW5kUHJvbWlzZShlcnJvcik7XG4gICAgICB0aGlzLl9lbWl0KCdlbmQnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2VtaXRGaW5hbCgpIHtcbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5fY2hhdENvbXBsZXRpb25zW3RoaXMuX2NoYXRDb21wbGV0aW9ucy5sZW5ndGggLSAxXTtcbiAgICBpZiAoY29tcGxldGlvbikgdGhpcy5fZW1pdCgnZmluYWxDaGF0Q29tcGxldGlvbicsIGNvbXBsZXRpb24pO1xuICAgIGNvbnN0IGZpbmFsTWVzc2FnZSA9IHRoaXMuI2dldEZpbmFsTWVzc2FnZSgpO1xuICAgIGlmIChmaW5hbE1lc3NhZ2UpIHRoaXMuX2VtaXQoJ2ZpbmFsTWVzc2FnZScsIGZpbmFsTWVzc2FnZSk7XG4gICAgY29uc3QgZmluYWxDb250ZW50ID0gdGhpcy4jZ2V0RmluYWxDb250ZW50KCk7XG4gICAgaWYgKGZpbmFsQ29udGVudCkgdGhpcy5fZW1pdCgnZmluYWxDb250ZW50JywgZmluYWxDb250ZW50KTtcblxuICAgIGNvbnN0IGZpbmFsRnVuY3Rpb25DYWxsID0gdGhpcy4jZ2V0RmluYWxGdW5jdGlvbkNhbGwoKTtcbiAgICBpZiAoZmluYWxGdW5jdGlvbkNhbGwpIHRoaXMuX2VtaXQoJ2ZpbmFsRnVuY3Rpb25DYWxsJywgZmluYWxGdW5jdGlvbkNhbGwpO1xuXG4gICAgY29uc3QgZmluYWxGdW5jdGlvbkNhbGxSZXN1bHQgPSB0aGlzLiNnZXRGaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCgpO1xuICAgIGlmIChmaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCAhPSBudWxsKSB0aGlzLl9lbWl0KCdmaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdCcsIGZpbmFsRnVuY3Rpb25DYWxsUmVzdWx0KTtcblxuICAgIGlmICh0aGlzLl9jaGF0Q29tcGxldGlvbnMuc29tZSgoYykgPT4gYy51c2FnZSkpIHtcbiAgICAgIHRoaXMuX2VtaXQoJ3RvdGFsVXNhZ2UnLCB0aGlzLiNjYWxjdWxhdGVUb3RhbFVzYWdlKCkpO1xuICAgIH1cbiAgfVxuXG4gICN2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtcy5uICE9IG51bGwgJiYgcGFyYW1zLm4gPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICAgICdDaGF0Q29tcGxldGlvbiBjb252ZW5pZW5jZSBoZWxwZXJzIG9ubHkgc3VwcG9ydCBuPTEgYXQgdGhpcyB0aW1lLiBUbyB1c2Ugbj4xLCBwbGVhc2UgdXNlIGNoYXQuY29tcGxldGlvbnMuY3JlYXRlKCkgZGlyZWN0bHkuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9jcmVhdGVDaGF0Q29tcGxldGlvbihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cbiAgICB0aGlzLiN2YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xuXG4gICAgY29uc3QgY2hhdENvbXBsZXRpb24gPSBhd2FpdCBjb21wbGV0aW9ucy5jcmVhdGUoXG4gICAgICB7IC4uLnBhcmFtcywgc3RyZWFtOiBmYWxzZSB9LFxuICAgICAgeyAuLi5vcHRpb25zLCBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSxcbiAgICApO1xuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGF0Q29tcGxldGlvbihjaGF0Q29tcGxldGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX3J1bkNoYXRDb21wbGV0aW9uKFxuICAgIGNvbXBsZXRpb25zOiBDb21wbGV0aW9ucyxcbiAgICBwYXJhbXM6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPENoYXRDb21wbGV0aW9uPiB7XG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBhcmFtcy5tZXNzYWdlcykge1xuICAgICAgdGhpcy5fYWRkTWVzc2FnZShtZXNzYWdlLCBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jcmVhdGVDaGF0Q29tcGxldGlvbihjb21wbGV0aW9ucywgcGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfcnVuRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczpcbiAgICAgIHwgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPlxuICAgICAgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgIG9wdGlvbnM/OiBSdW5uZXJPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCByb2xlID0gJ2Z1bmN0aW9uJyBhcyBjb25zdDtcbiAgICBjb25zdCB7IGZ1bmN0aW9uX2NhbGwgPSAnYXV0bycsIHN0cmVhbSwgLi4ucmVzdFBhcmFtcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHNpbmdsZUZ1bmN0aW9uVG9DYWxsID0gdHlwZW9mIGZ1bmN0aW9uX2NhbGwgIT09ICdzdHJpbmcnICYmIGZ1bmN0aW9uX2NhbGw/Lm5hbWU7XG4gICAgY29uc3QgeyBtYXhDaGF0Q29tcGxldGlvbnMgPSBERUZBVUxUX01BWF9DSEFUX0NPTVBMRVRJT05TIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZnVuY3Rpb25zQnlOYW1lOiBSZWNvcmQ8c3RyaW5nLCBSdW5uYWJsZUZ1bmN0aW9uPGFueT4+ID0ge307XG4gICAgZm9yIChjb25zdCBmIG9mIHBhcmFtcy5mdW5jdGlvbnMpIHtcbiAgICAgIGZ1bmN0aW9uc0J5TmFtZVtmLm5hbWUgfHwgZi5mdW5jdGlvbi5uYW1lXSA9IGY7XG4gICAgfVxuXG4gICAgY29uc3QgZnVuY3Rpb25zOiBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcy5GdW5jdGlvbltdID0gcGFyYW1zLmZ1bmN0aW9ucy5tYXAoXG4gICAgICAoZik6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLkZ1bmN0aW9uID0+ICh7XG4gICAgICAgIG5hbWU6IGYubmFtZSB8fCBmLmZ1bmN0aW9uLm5hbWUsXG4gICAgICAgIHBhcmFtZXRlcnM6IGYucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgZGVzY3JpcHRpb246IGYuZGVzY3JpcHRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBhcmFtcy5tZXNzYWdlcykge1xuICAgICAgdGhpcy5fYWRkTWVzc2FnZShtZXNzYWdlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhDaGF0Q29tcGxldGlvbnM7ICsraSkge1xuICAgICAgY29uc3QgY2hhdENvbXBsZXRpb246IENoYXRDb21wbGV0aW9uID0gYXdhaXQgdGhpcy5fY3JlYXRlQ2hhdENvbXBsZXRpb24oXG4gICAgICAgIGNvbXBsZXRpb25zLFxuICAgICAgICB7XG4gICAgICAgICAgLi4ucmVzdFBhcmFtcyxcbiAgICAgICAgICBmdW5jdGlvbl9jYWxsLFxuICAgICAgICAgIGZ1bmN0aW9ucyxcbiAgICAgICAgICBtZXNzYWdlczogWy4uLnRoaXMubWVzc2FnZXNdLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjaGF0Q29tcGxldGlvbi5jaG9pY2VzWzBdPy5tZXNzYWdlO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBtZXNzYWdlIGluIENoYXRDb21wbGV0aW9uIHJlc3BvbnNlYCk7XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2UuZnVuY3Rpb25fY2FsbCkgcmV0dXJuO1xuICAgICAgY29uc3QgeyBuYW1lLCBhcmd1bWVudHM6IGFyZ3MgfSA9IG1lc3NhZ2UuZnVuY3Rpb25fY2FsbDtcbiAgICAgIGNvbnN0IGZuID0gZnVuY3Rpb25zQnlOYW1lW25hbWVdO1xuICAgICAgaWYgKCFmbikge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYEludmFsaWQgZnVuY3Rpb25fY2FsbDogJHtKU09OLnN0cmluZ2lmeShuYW1lKX0uIEF2YWlsYWJsZSBvcHRpb25zIGFyZTogJHtmdW5jdGlvbnNcbiAgICAgICAgICAubWFwKChmKSA9PiBKU09OLnN0cmluZ2lmeShmLm5hbWUpKVxuICAgICAgICAgIC5qb2luKCcsICcpfS4gUGxlYXNlIHRyeSBhZ2FpbmA7XG5cbiAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIG5hbWUsIGNvbnRlbnQgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmIChzaW5nbGVGdW5jdGlvblRvQ2FsbCAmJiBzaW5nbGVGdW5jdGlvblRvQ2FsbCAhPT0gbmFtZSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYEludmFsaWQgZnVuY3Rpb25fY2FsbDogJHtKU09OLnN0cmluZ2lmeShuYW1lKX0uICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc2luZ2xlRnVuY3Rpb25Ub0NhbGwsXG4gICAgICAgICl9IHJlcXVlc3RlZC4gUGxlYXNlIHRyeSBhZ2FpbmA7XG5cbiAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIG5hbWUsIGNvbnRlbnQgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgcGFyc2VkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkID0gaXNSdW5uYWJsZUZ1bmN0aW9uV2l0aFBhcnNlKGZuKSA/IGF3YWl0IGZuLnBhcnNlKGFyZ3MpIDogYXJncztcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2FkZE1lc3NhZ2Uoe1xuICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBjb250ZW50OiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpdCBjYW4ndCBydWxlIG91dCBgbmV2ZXJgIHR5cGUuXG4gICAgICBjb25zdCByYXdDb250ZW50ID0gYXdhaXQgZm4uZnVuY3Rpb24ocGFyc2VkLCB0aGlzKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLiNzdHJpbmdpZnlGdW5jdGlvbkNhbGxSZXN1bHQocmF3Q29udGVudCk7XG5cbiAgICAgIHRoaXMuX2FkZE1lc3NhZ2UoeyByb2xlLCBuYW1lLCBjb250ZW50IH0pO1xuXG4gICAgICBpZiAoc2luZ2xlRnVuY3Rpb25Ub0NhbGwpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgX3J1blRvb2xzPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczpcbiAgICAgIHwgQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+XG4gICAgICB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogUnVubmVyT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgcm9sZSA9ICd0b29sJyBhcyBjb25zdDtcbiAgICBjb25zdCB7IHRvb2xfY2hvaWNlID0gJ2F1dG8nLCBzdHJlYW0sIC4uLnJlc3RQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBzaW5nbGVGdW5jdGlvblRvQ2FsbCA9IHR5cGVvZiB0b29sX2Nob2ljZSAhPT0gJ3N0cmluZycgJiYgdG9vbF9jaG9pY2U/LmZ1bmN0aW9uPy5uYW1lO1xuICAgIGNvbnN0IHsgbWF4Q2hhdENvbXBsZXRpb25zID0gREVGQVVMVF9NQVhfQ0hBVF9DT01QTEVUSU9OUyB9ID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGNvbnN0IGZ1bmN0aW9uc0J5TmFtZTogUmVjb3JkPHN0cmluZywgUnVubmFibGVGdW5jdGlvbjxhbnk+PiA9IHt9O1xuICAgIGZvciAoY29uc3QgZiBvZiBwYXJhbXMudG9vbHMpIHtcbiAgICAgIGlmIChmLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZnVuY3Rpb25zQnlOYW1lW2YuZnVuY3Rpb24ubmFtZSB8fCBmLmZ1bmN0aW9uLmZ1bmN0aW9uLm5hbWVdID0gZi5mdW5jdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0b29sczogQ2hhdENvbXBsZXRpb25Ub29sW10gPVxuICAgICAgJ3Rvb2xzJyBpbiBwYXJhbXMgP1xuICAgICAgICBwYXJhbXMudG9vbHMubWFwKCh0KSA9PlxuICAgICAgICAgIHQudHlwZSA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdC5mdW5jdGlvbi5uYW1lIHx8IHQuZnVuY3Rpb24uZnVuY3Rpb24ubmFtZSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB0LmZ1bmN0aW9uLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHQuZnVuY3Rpb24uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiAodCBhcyB1bmtub3duIGFzIENoYXRDb21wbGV0aW9uVG9vbCksXG4gICAgICAgIClcbiAgICAgIDogKHVuZGVmaW5lZCBhcyBhbnkpO1xuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBhcmFtcy5tZXNzYWdlcykge1xuICAgICAgdGhpcy5fYWRkTWVzc2FnZShtZXNzYWdlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhDaGF0Q29tcGxldGlvbnM7ICsraSkge1xuICAgICAgY29uc3QgY2hhdENvbXBsZXRpb246IENoYXRDb21wbGV0aW9uID0gYXdhaXQgdGhpcy5fY3JlYXRlQ2hhdENvbXBsZXRpb24oXG4gICAgICAgIGNvbXBsZXRpb25zLFxuICAgICAgICB7XG4gICAgICAgICAgLi4ucmVzdFBhcmFtcyxcbiAgICAgICAgICB0b29sX2Nob2ljZSxcbiAgICAgICAgICB0b29scyxcbiAgICAgICAgICBtZXNzYWdlczogWy4uLnRoaXMubWVzc2FnZXNdLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjaGF0Q29tcGxldGlvbi5jaG9pY2VzWzBdPy5tZXNzYWdlO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBtZXNzYWdlIGluIENoYXRDb21wbGV0aW9uIHJlc3BvbnNlYCk7XG4gICAgICB9XG4gICAgICBpZiAoIW1lc3NhZ2UudG9vbF9jYWxscykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgdG9vbF9jYWxsIG9mIG1lc3NhZ2UudG9vbF9jYWxscykge1xuICAgICAgICBpZiAodG9vbF9jYWxsLnR5cGUgIT09ICdmdW5jdGlvbicpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB0b29sX2NhbGxfaWQgPSB0b29sX2NhbGwuaWQ7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgYXJndW1lbnRzOiBhcmdzIH0gPSB0b29sX2NhbGwuZnVuY3Rpb247XG4gICAgICAgIGNvbnN0IGZuID0gZnVuY3Rpb25zQnlOYW1lW25hbWVdO1xuXG4gICAgICAgIGlmICghZm4pIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYEludmFsaWQgdG9vbF9jYWxsOiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfS4gQXZhaWxhYmxlIG9wdGlvbnMgYXJlOiAke3Rvb2xzXG4gICAgICAgICAgICAubWFwKChmKSA9PiBKU09OLnN0cmluZ2lmeShmLmZ1bmN0aW9uLm5hbWUpKVxuICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBQbGVhc2UgdHJ5IGFnYWluYDtcblxuICAgICAgICAgIHRoaXMuX2FkZE1lc3NhZ2UoeyByb2xlLCB0b29sX2NhbGxfaWQsIGNvbnRlbnQgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc2luZ2xlRnVuY3Rpb25Ub0NhbGwgJiYgc2luZ2xlRnVuY3Rpb25Ub0NhbGwgIT09IG5hbWUpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYEludmFsaWQgdG9vbF9jYWxsOiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfS4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHNpbmdsZUZ1bmN0aW9uVG9DYWxsLFxuICAgICAgICAgICl9IHJlcXVlc3RlZC4gUGxlYXNlIHRyeSBhZ2FpbmA7XG5cbiAgICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKHsgcm9sZSwgdG9vbF9jYWxsX2lkLCBjb250ZW50IH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJzZWQgPSBpc1J1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2UoZm4pID8gYXdhaXQgZm4ucGFyc2UoYXJncykgOiBhcmdzO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIHRvb2xfY2FsbF9pZCwgY29udGVudCB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaXQgY2FuJ3QgcnVsZSBvdXQgYG5ldmVyYCB0eXBlLlxuICAgICAgICBjb25zdCByYXdDb250ZW50ID0gYXdhaXQgZm4uZnVuY3Rpb24ocGFyc2VkLCB0aGlzKTtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuI3N0cmluZ2lmeUZ1bmN0aW9uQ2FsbFJlc3VsdChyYXdDb250ZW50KTtcbiAgICAgICAgdGhpcy5fYWRkTWVzc2FnZSh7IHJvbGUsIHRvb2xfY2FsbF9pZCwgY29udGVudCB9KTtcblxuICAgICAgICBpZiAoc2luZ2xlRnVuY3Rpb25Ub0NhbGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAjc3RyaW5naWZ5RnVuY3Rpb25DYWxsUmVzdWx0KHJhd0NvbnRlbnQ6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgcmF3Q29udGVudCA9PT0gJ3N0cmluZycgPyByYXdDb250ZW50XG4gICAgICA6IHJhd0NvbnRlbnQgPT09IHVuZGVmaW5lZCA/ICd1bmRlZmluZWQnXG4gICAgICA6IEpTT04uc3RyaW5naWZ5KHJhd0NvbnRlbnQpXG4gICAgKTtcbiAgfVxufVxuXG50eXBlIEN1c3RvbUV2ZW50czxFdmVudCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrIGluIEV2ZW50XTogayBleHRlbmRzIGtleW9mIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMgPyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzW2tdXG4gIDogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xufTtcblxudHlwZSBMaXN0ZW5lckZvckV2ZW50PEV2ZW50cyBleHRlbmRzIEN1c3RvbUV2ZW50czxhbnk+LCBFdmVudCBleHRlbmRzIGtleW9mIEV2ZW50cz4gPSBFdmVudCBleHRlbmRzIChcbiAga2V5b2YgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50c1xuKSA/XG4gIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHNbRXZlbnRdXG46IEV2ZW50c1tFdmVudF07XG5cbnR5cGUgTGlzdGVuZXJzRm9yRXZlbnQ8RXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4sIEV2ZW50IGV4dGVuZHMga2V5b2YgRXZlbnRzPiA9IEFycmF5PHtcbiAgbGlzdGVuZXI6IExpc3RlbmVyRm9yRXZlbnQ8RXZlbnRzLCBFdmVudD47XG4gIG9uY2U/OiBib29sZWFuO1xufT47XG50eXBlIEV2ZW50UGFyYW1ldGVyczxFdmVudHMgZXh0ZW5kcyBDdXN0b21FdmVudHM8YW55PiwgRXZlbnQgZXh0ZW5kcyBrZXlvZiBFdmVudHM+ID0gUGFyYW1ldGVyczxcbiAgTGlzdGVuZXJGb3JFdmVudDxFdmVudHMsIEV2ZW50PlxuPjtcblxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzIHtcbiAgY29ubmVjdDogKCkgPT4gdm9pZDtcbiAgZnVuY3Rpb25DYWxsOiAoZnVuY3Rpb25DYWxsOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2UuRnVuY3Rpb25DYWxsKSA9PiB2b2lkO1xuICBtZXNzYWdlOiAobWVzc2FnZTogQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0pID0+IHZvaWQ7XG4gIGNoYXRDb21wbGV0aW9uOiAoY29tcGxldGlvbjogQ2hhdENvbXBsZXRpb24pID0+IHZvaWQ7XG4gIGZpbmFsQ29udGVudDogKGNvbnRlbnRTbmFwc2hvdDogc3RyaW5nKSA9PiB2b2lkO1xuICBmaW5hbE1lc3NhZ2U6IChtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSkgPT4gdm9pZDtcbiAgZmluYWxDaGF0Q29tcGxldGlvbjogKGNvbXBsZXRpb246IENoYXRDb21wbGV0aW9uKSA9PiB2b2lkO1xuICBmaW5hbEZ1bmN0aW9uQ2FsbDogKGZ1bmN0aW9uQ2FsbDogQ2hhdENvbXBsZXRpb25NZXNzYWdlLkZ1bmN0aW9uQ2FsbCkgPT4gdm9pZDtcbiAgZnVuY3Rpb25DYWxsUmVzdWx0OiAoY29udGVudDogc3RyaW5nKSA9PiB2b2lkO1xuICBmaW5hbEZ1bmN0aW9uQ2FsbFJlc3VsdDogKGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZDtcbiAgZXJyb3I6IChlcnJvcjogT3BlbkFJRXJyb3IpID0+IHZvaWQ7XG4gIGFib3J0OiAoZXJyb3I6IEFQSVVzZXJBYm9ydEVycm9yKSA9PiB2b2lkO1xuICBlbmQ6ICgpID0+IHZvaWQ7XG4gIHRvdGFsVXNhZ2U6ICh1c2FnZTogQ29tcGxldGlvblVzYWdlKSA9PiB2b2lkO1xufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgQ29tcGxldGlvbnMsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0sXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsXG59IGZyb20gXCIuLi9yZXNvdXJjZXMvY2hhdC9jb21wbGV0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBSdW5uYWJsZUZ1bmN0aW9ucywgdHlwZSBCYXNlRnVuY3Rpb25zQXJncywgUnVubmFibGVUb29scyB9IGZyb20gJy4vUnVubmFibGVGdW5jdGlvbic7XG5pbXBvcnQge1xuICBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyLFxuICBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyRXZlbnRzLFxuICBSdW5uZXJPcHRpb25zLFxufSBmcm9tICcuL0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXInO1xuaW1wb3J0IHsgaXNBc3Npc3RhbnRNZXNzYWdlIH0gZnJvbSAnLi9jaGF0Q29tcGxldGlvblV0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyBleHRlbmRzIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMge1xuICBjb250ZW50OiAoY29udGVudDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4gPSBPbWl0PFxuICBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyxcbiAgJ2Z1bmN0aW9ucydcbj4gJiB7XG4gIGZ1bmN0aW9uczogUnVubmFibGVGdW5jdGlvbnM8RnVuY3Rpb25zQXJncz47XG59O1xuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPiA9IE9taXQ8XG4gIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAndG9vbHMnXG4+ICYge1xuICB0b29sczogUnVubmFibGVUb29sczxGdW5jdGlvbnNBcmdzPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBDaGF0Q29tcGxldGlvblJ1bm5lciBleHRlbmRzIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXI8Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHM+IHtcbiAgLyoqIEBkZXByZWNhdGVkIC0gcGxlYXNlIHVzZSBgcnVuVG9vbHNgIGluc3RlYWQuICovXG4gIHN0YXRpYyBydW5GdW5jdGlvbnMoXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtczxhbnlbXT4sXG4gICAgb3B0aW9ucz86IFJ1bm5lck9wdGlvbnMsXG4gICk6IENoYXRDb21wbGV0aW9uUnVubmVyIHtcbiAgICBjb25zdCBydW5uZXIgPSBuZXcgQ2hhdENvbXBsZXRpb25SdW5uZXIoKTtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAncnVuRnVuY3Rpb25zJyB9LFxuICAgIH07XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9ydW5GdW5jdGlvbnMoY29tcGxldGlvbnMsIHBhcmFtcywgb3B0cykpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBzdGF0aWMgcnVuVG9vbHMoXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25Ub29sUnVubmVyUGFyYW1zPGFueVtdPixcbiAgICBvcHRpb25zPzogUnVubmVyT3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25SdW5uZXIge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblJ1bm5lcigpO1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdydW5Ub29scycgfSxcbiAgICB9O1xuICAgIHJ1bm5lci5fcnVuKCgpID0+IHJ1bm5lci5fcnVuVG9vbHMoY29tcGxldGlvbnMsIHBhcmFtcywgb3B0cykpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICBvdmVycmlkZSBfYWRkTWVzc2FnZShtZXNzYWdlOiBDaGF0Q29tcGxldGlvbk1lc3NhZ2VQYXJhbSkge1xuICAgIHN1cGVyLl9hZGRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGlmIChpc0Fzc2lzdGFudE1lc3NhZ2UobWVzc2FnZSkgJiYgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICB0aGlzLl9lbWl0KCdjb250ZW50JywgbWVzc2FnZS5jb250ZW50IGFzIHN0cmluZyk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgT3BlbkFJRXJyb3IsIEFQSVVzZXJBYm9ydEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG5pbXBvcnQge1xuICBDb21wbGV0aW9ucyxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbixcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkNodW5rLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLFxuICB0eXBlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9jaGF0L2NvbXBsZXRpb25zXCI7XG5pbXBvcnQge1xuICBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyLFxuICB0eXBlIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMsXG59IGZyb20gJy4vQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcic7XG5pbXBvcnQgeyB0eXBlIFJlYWRhYmxlU3RyZWFtIH0gZnJvbSBcIi4uL19zaGltcy9pbmRleFwiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbWluZ1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uU3RyZWFtRXZlbnRzIGV4dGVuZHMgQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lckV2ZW50cyB7XG4gIGNvbnRlbnQ6IChjb250ZW50RGVsdGE6IHN0cmluZywgY29udGVudFNuYXBzaG90OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNodW5rOiAoY2h1bms6IENoYXRDb21wbGV0aW9uQ2h1bmssIHNuYXBzaG90OiBDaGF0Q29tcGxldGlvblNuYXBzaG90KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcyA9IE9taXQ8Q2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlLCAnc3RyZWFtJz4gJiB7XG4gIHN0cmVhbT86IHRydWU7XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBsZXRpb25TdHJlYW1cbiAgZXh0ZW5kcyBBYnN0cmFjdENoYXRDb21wbGV0aW9uUnVubmVyPENoYXRDb21wbGV0aW9uU3RyZWFtRXZlbnRzPlxuICBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8Q2hhdENvbXBsZXRpb25DaHVuaz5cbntcbiAgI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90OiBDaGF0Q29tcGxldGlvblNuYXBzaG90IHwgdW5kZWZpbmVkO1xuXG4gIGdldCBjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdCgpOiBDaGF0Q29tcGxldGlvblNuYXBzaG90IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3Q7XG4gIH1cblxuICAvKipcbiAgICogSW50ZW5kZWQgZm9yIHVzZSBvbiB0aGUgZnJvbnRlbmQsIGNvbnN1bWluZyBhIHN0cmVhbSBwcm9kdWNlZCB3aXRoXG4gICAqIGAudG9SZWFkYWJsZVN0cmVhbSgpYCBvbiB0aGUgYmFja2VuZC5cbiAgICpcbiAgICogTm90ZSB0aGF0IG1lc3NhZ2VzIHNlbnQgdG8gdGhlIG1vZGVsIGRvIG5vdCBhcHBlYXIgaW4gYC5vbignbWVzc2FnZScpYFxuICAgKiBpbiB0aGlzIGNvbnRleHQuXG4gICAqL1xuICBzdGF0aWMgZnJvbVJlYWRhYmxlU3RyZWFtKHN0cmVhbTogUmVhZGFibGVTdHJlYW0pOiBDaGF0Q29tcGxldGlvblN0cmVhbSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IENoYXRDb21wbGV0aW9uU3RyZWFtKCk7XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9mcm9tUmVhZGFibGVTdHJlYW0oc3RyZWFtKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVDaGF0Q29tcGxldGlvbihcbiAgICBjb21wbGV0aW9uczogQ29tcGxldGlvbnMsXG4gICAgcGFyYW1zOiBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25TdHJlYW0ge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblN0cmVhbSgpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+XG4gICAgICBydW5uZXIuX3J1bkNoYXRDb21wbGV0aW9uKFxuICAgICAgICBjb21wbGV0aW9ucyxcbiAgICAgICAgeyAuLi5wYXJhbXMsIHN0cmVhbTogdHJ1ZSB9LFxuICAgICAgICB7IC4uLm9wdGlvbnMsIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAnc3RyZWFtJyB9IH0sXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gICNiZWdpblJlcXVlc3QoKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHJldHVybjtcbiAgICB0aGlzLiNjdXJyZW50Q2hhdENvbXBsZXRpb25TbmFwc2hvdCA9IHVuZGVmaW5lZDtcbiAgfVxuICAjYWRkQ2h1bmsoY2h1bms6IENoYXRDb21wbGV0aW9uQ2h1bmspIHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLiNhY2N1bXVsYXRlQ2hhdENvbXBsZXRpb24oY2h1bmspO1xuICAgIHRoaXMuX2VtaXQoJ2NodW5rJywgY2h1bmssIGNvbXBsZXRpb24pO1xuICAgIGNvbnN0IGRlbHRhID0gY2h1bmsuY2hvaWNlc1swXT8uZGVsdGE/LmNvbnRlbnQ7XG4gICAgY29uc3Qgc25hcHNob3QgPSBjb21wbGV0aW9uLmNob2ljZXNbMF0/Lm1lc3NhZ2U7XG4gICAgaWYgKGRlbHRhICE9IG51bGwgJiYgc25hcHNob3Q/LnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIHNuYXBzaG90Py5jb250ZW50KSB7XG4gICAgICB0aGlzLl9lbWl0KCdjb250ZW50JywgZGVsdGEsIHNuYXBzaG90LmNvbnRlbnQpO1xuICAgIH1cbiAgfVxuICAjZW5kUmVxdWVzdCgpOiBDaGF0Q29tcGxldGlvbiB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgc3RyZWFtIGhhcyBlbmRlZCwgdGhpcyBzaG91bGRuJ3QgaGFwcGVuYCk7XG4gICAgfVxuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy4jY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3Q7XG4gICAgaWYgKCFzbmFwc2hvdCkge1xuICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGByZXF1ZXN0IGVuZGVkIHdpdGhvdXQgc2VuZGluZyBhbnkgY2h1bmtzYCk7XG4gICAgfVxuICAgIHRoaXMuI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBmaW5hbGl6ZUNoYXRDb21wbGV0aW9uKHNuYXBzaG90KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBfY3JlYXRlQ2hhdENvbXBsZXRpb24oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8Q2hhdENvbXBsZXRpb24+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG4gICAgdGhpcy4jYmVnaW5SZXF1ZXN0KCk7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgY29tcGxldGlvbnMuY3JlYXRlKFxuICAgICAgeyAuLi5wYXJhbXMsIHN0cmVhbTogdHJ1ZSB9LFxuICAgICAgeyAuLi5vcHRpb25zLCBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSxcbiAgICApO1xuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2Ygc3RyZWFtKSB7XG4gICAgICB0aGlzLiNhZGRDaHVuayhjaHVuayk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uY29udHJvbGxlci5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hhdENvbXBsZXRpb24odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBfZnJvbVJlYWRhYmxlU3RyZWFtKFxuICAgIHJlYWRhYmxlU3RyZWFtOiBSZWFkYWJsZVN0cmVhbSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cbiAgICB0aGlzLiNiZWdpblJlcXVlc3QoKTtcbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICBjb25zdCBzdHJlYW0gPSBTdHJlYW0uZnJvbVJlYWRhYmxlU3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+KHJlYWRhYmxlU3RyZWFtLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIGxldCBjaGF0SWQ7XG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBzdHJlYW0pIHtcbiAgICAgIGlmIChjaGF0SWQgJiYgY2hhdElkICE9PSBjaHVuay5pZCkge1xuICAgICAgICAvLyBBIG5ldyByZXF1ZXN0IGhhcyBiZWVuIG1hZGUuXG4gICAgICAgIHRoaXMuX2FkZENoYXRDb21wbGV0aW9uKHRoaXMuI2VuZFJlcXVlc3QoKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuI2FkZENodW5rKGNodW5rKTtcbiAgICAgIGNoYXRJZCA9IGNodW5rLmlkO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLmNvbnRyb2xsZXIuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoYXRDb21wbGV0aW9uKHRoaXMuI2VuZFJlcXVlc3QoKSk7XG4gIH1cblxuICAjYWNjdW11bGF0ZUNoYXRDb21wbGV0aW9uKGNodW5rOiBDaGF0Q29tcGxldGlvbkNodW5rKTogQ2hhdENvbXBsZXRpb25TbmFwc2hvdCB7XG4gICAgbGV0IHNuYXBzaG90ID0gdGhpcy4jY3VycmVudENoYXRDb21wbGV0aW9uU25hcHNob3Q7XG4gICAgY29uc3QgeyBjaG9pY2VzLCAuLi5yZXN0IH0gPSBjaHVuaztcbiAgICBpZiAoIXNuYXBzaG90KSB7XG4gICAgICBzbmFwc2hvdCA9IHRoaXMuI2N1cnJlbnRDaGF0Q29tcGxldGlvblNuYXBzaG90ID0ge1xuICAgICAgICAuLi5yZXN0LFxuICAgICAgICBjaG9pY2VzOiBbXSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oc25hcHNob3QsIHJlc3QpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgeyBkZWx0YSwgZmluaXNoX3JlYXNvbiwgaW5kZXgsIGxvZ3Byb2JzID0gbnVsbCwgLi4ub3RoZXIgfSBvZiBjaHVuay5jaG9pY2VzKSB7XG4gICAgICBsZXQgY2hvaWNlID0gc25hcHNob3QuY2hvaWNlc1tpbmRleF07XG4gICAgICBpZiAoIWNob2ljZSkge1xuICAgICAgICBjaG9pY2UgPSBzbmFwc2hvdC5jaG9pY2VzW2luZGV4XSA9IHsgZmluaXNoX3JlYXNvbiwgaW5kZXgsIG1lc3NhZ2U6IHt9LCBsb2dwcm9icywgLi4ub3RoZXIgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ3Byb2JzKSB7XG4gICAgICAgIGlmICghY2hvaWNlLmxvZ3Byb2JzKSB7XG4gICAgICAgICAgY2hvaWNlLmxvZ3Byb2JzID0gT2JqZWN0LmFzc2lnbih7fSwgbG9ncHJvYnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHsgY29udGVudCwgLi4ucmVzdCB9ID0gbG9ncHJvYnM7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihjaG9pY2UubG9ncHJvYnMsIHJlc3QpO1xuICAgICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgICBjaG9pY2UubG9ncHJvYnMuY29udGVudCA/Pz0gW107XG4gICAgICAgICAgICBjaG9pY2UubG9ncHJvYnMuY29udGVudC5wdXNoKC4uLmNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluaXNoX3JlYXNvbikgY2hvaWNlLmZpbmlzaF9yZWFzb24gPSBmaW5pc2hfcmVhc29uO1xuICAgICAgT2JqZWN0LmFzc2lnbihjaG9pY2UsIG90aGVyKTtcblxuICAgICAgaWYgKCFkZWx0YSkgY29udGludWU7IC8vIFNob3VsZG4ndCBoYXBwZW47IGp1c3QgaW4gY2FzZS5cbiAgICAgIGNvbnN0IHsgY29udGVudCwgZnVuY3Rpb25fY2FsbCwgcm9sZSwgdG9vbF9jYWxscywgLi4ucmVzdCB9ID0gZGVsdGE7XG4gICAgICBPYmplY3QuYXNzaWduKGNob2ljZS5tZXNzYWdlLCByZXN0KTtcblxuICAgICAgaWYgKGNvbnRlbnQpIGNob2ljZS5tZXNzYWdlLmNvbnRlbnQgPSAoY2hvaWNlLm1lc3NhZ2UuY29udGVudCB8fCAnJykgKyBjb250ZW50O1xuICAgICAgaWYgKHJvbGUpIGNob2ljZS5tZXNzYWdlLnJvbGUgPSByb2xlO1xuICAgICAgaWYgKGZ1bmN0aW9uX2NhbGwpIHtcbiAgICAgICAgaWYgKCFjaG9pY2UubWVzc2FnZS5mdW5jdGlvbl9jYWxsKSB7XG4gICAgICAgICAgY2hvaWNlLm1lc3NhZ2UuZnVuY3Rpb25fY2FsbCA9IGZ1bmN0aW9uX2NhbGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZ1bmN0aW9uX2NhbGwubmFtZSkgY2hvaWNlLm1lc3NhZ2UuZnVuY3Rpb25fY2FsbC5uYW1lID0gZnVuY3Rpb25fY2FsbC5uYW1lO1xuICAgICAgICAgIGlmIChmdW5jdGlvbl9jYWxsLmFyZ3VtZW50cykge1xuICAgICAgICAgICAgY2hvaWNlLm1lc3NhZ2UuZnVuY3Rpb25fY2FsbC5hcmd1bWVudHMgPz89ICcnO1xuICAgICAgICAgICAgY2hvaWNlLm1lc3NhZ2UuZnVuY3Rpb25fY2FsbC5hcmd1bWVudHMgKz0gZnVuY3Rpb25fY2FsbC5hcmd1bWVudHM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9vbF9jYWxscykge1xuICAgICAgICBpZiAoIWNob2ljZS5tZXNzYWdlLnRvb2xfY2FsbHMpIGNob2ljZS5tZXNzYWdlLnRvb2xfY2FsbHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB7IGluZGV4LCBpZCwgdHlwZSwgZnVuY3Rpb246IGZuLCAuLi5yZXN0IH0gb2YgdG9vbF9jYWxscykge1xuICAgICAgICAgIGNvbnN0IHRvb2xfY2FsbCA9IChjaG9pY2UubWVzc2FnZS50b29sX2NhbGxzW2luZGV4XSA/Pz0ge30pO1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9vbF9jYWxsLCByZXN0KTtcbiAgICAgICAgICBpZiAoaWQpIHRvb2xfY2FsbC5pZCA9IGlkO1xuICAgICAgICAgIGlmICh0eXBlKSB0b29sX2NhbGwudHlwZSA9IHR5cGU7XG4gICAgICAgICAgaWYgKGZuKSB0b29sX2NhbGwuZnVuY3Rpb24gPz89IHsgYXJndW1lbnRzOiAnJyB9O1xuICAgICAgICAgIGlmIChmbj8ubmFtZSkgdG9vbF9jYWxsLmZ1bmN0aW9uIS5uYW1lID0gZm4ubmFtZTtcbiAgICAgICAgICBpZiAoZm4/LmFyZ3VtZW50cykgdG9vbF9jYWxsLmZ1bmN0aW9uIS5hcmd1bWVudHMgKz0gZm4uYXJndW1lbnRzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNJdGVyYXRvcjxDaGF0Q29tcGxldGlvbkNodW5rPiB7XG4gICAgY29uc3QgcHVzaFF1ZXVlOiBDaGF0Q29tcGxldGlvbkNodW5rW10gPSBbXTtcbiAgICBjb25zdCByZWFkUXVldWU6IHtcbiAgICAgIHJlc29sdmU6IChjaHVuazogQ2hhdENvbXBsZXRpb25DaHVuayB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgICAgIHJlamVjdDogKGVycjogdW5rbm93bikgPT4gdm9pZDtcbiAgICB9W10gPSBbXTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5vbignY2h1bmsnLCAoY2h1bmspID0+IHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IHJlYWRRdWV1ZS5zaGlmdCgpO1xuICAgICAgaWYgKHJlYWRlcikge1xuICAgICAgICByZWFkZXIucmVzb2x2ZShjaHVuayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoUXVldWUucHVzaChjaHVuayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHJlYWRRdWV1ZSkge1xuICAgICAgICByZWFkZXIucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgcmVhZFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdhYm9ydCcsIChlcnIpID0+IHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgcmVhZFF1ZXVlKSB7XG4gICAgICAgIHJlYWRlci5yZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJlYWRRdWV1ZS5sZW5ndGggPSAwO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcmVhZGVyIG9mIHJlYWRRdWV1ZSkge1xuICAgICAgICByZWFkZXIucmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICByZWFkUXVldWUubGVuZ3RoID0gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBhc3luYyAoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxDaGF0Q29tcGxldGlvbkNodW5rPj4gPT4ge1xuICAgICAgICBpZiAoIXB1c2hRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Q2hhdENvbXBsZXRpb25DaHVuayB8IHVuZGVmaW5lZD4oKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAgICAgIHJlYWRRdWV1ZS5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pLFxuICAgICAgICAgICkudGhlbigoY2h1bmspID0+IChjaHVuayA/IHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9IDogeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaHVuayA9IHB1c2hRdWV1ZS5zaGlmdCgpITtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGNodW5rLCBkb25lOiBmYWxzZSB9O1xuICAgICAgfSxcbiAgICAgIHJldHVybjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHRvUmVhZGFibGVTdHJlYW0oKTogUmVhZGFibGVTdHJlYW0ge1xuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0odGhpc1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0uYmluZCh0aGlzKSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICByZXR1cm4gc3RyZWFtLnRvUmVhZGFibGVTdHJlYW0oKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5hbGl6ZUNoYXRDb21wbGV0aW9uKHNuYXBzaG90OiBDaGF0Q29tcGxldGlvblNuYXBzaG90KTogQ2hhdENvbXBsZXRpb24ge1xuICBjb25zdCB7IGlkLCBjaG9pY2VzLCBjcmVhdGVkLCBtb2RlbCwgc3lzdGVtX2ZpbmdlcnByaW50LCAuLi5yZXN0IH0gPSBzbmFwc2hvdDtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN0LFxuICAgIGlkLFxuICAgIGNob2ljZXM6IGNob2ljZXMubWFwKFxuICAgICAgKHsgbWVzc2FnZSwgZmluaXNoX3JlYXNvbiwgaW5kZXgsIGxvZ3Byb2JzLCAuLi5jaG9pY2VSZXN0IH0pOiBDaGF0Q29tcGxldGlvbi5DaG9pY2UgPT4ge1xuICAgICAgICBpZiAoIWZpbmlzaF9yZWFzb24pIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBmaW5pc2hfcmVhc29uIGZvciBjaG9pY2UgJHtpbmRleH1gKTtcbiAgICAgICAgY29uc3QgeyBjb250ZW50ID0gbnVsbCwgZnVuY3Rpb25fY2FsbCwgdG9vbF9jYWxscywgLi4ubWVzc2FnZVJlc3QgfSA9IG1lc3NhZ2U7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBtZXNzYWdlLnJvbGUgYXMgJ2Fzc2lzdGFudCc7IC8vIHRoaXMgaXMgd2hhdCB3ZSBleHBlY3Q7IGluIHRoZW9yeSBpdCBjb3VsZCBiZSBkaWZmZXJlbnQgd2hpY2ggd291bGQgbWFrZSBvdXIgdHlwZXMgYSBzbGlnaHQgbGllIGJ1dCB3b3VsZCBiZSBmaW5lLlxuICAgICAgICBpZiAoIXJvbGUpIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyByb2xlIGZvciBjaG9pY2UgJHtpbmRleH1gKTtcbiAgICAgICAgaWYgKGZ1bmN0aW9uX2NhbGwpIHtcbiAgICAgICAgICBjb25zdCB7IGFyZ3VtZW50czogYXJncywgbmFtZSB9ID0gZnVuY3Rpb25fY2FsbDtcbiAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKSB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3NpbmcgZnVuY3Rpb25fY2FsbC5hcmd1bWVudHMgZm9yIGNob2ljZSAke2luZGV4fWApO1xuICAgICAgICAgIGlmICghbmFtZSkgdGhyb3cgbmV3IE9wZW5BSUVycm9yKGBtaXNzaW5nIGZ1bmN0aW9uX2NhbGwubmFtZSBmb3IgY2hvaWNlICR7aW5kZXh9YCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNob2ljZVJlc3QsXG4gICAgICAgICAgICBtZXNzYWdlOiB7IGNvbnRlbnQsIGZ1bmN0aW9uX2NhbGw6IHsgYXJndW1lbnRzOiBhcmdzLCBuYW1lIH0sIHJvbGUgfSxcbiAgICAgICAgICAgIGZpbmlzaF9yZWFzb24sXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGxvZ3Byb2JzLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvb2xfY2FsbHMpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY2hvaWNlUmVzdCxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgZmluaXNoX3JlYXNvbixcbiAgICAgICAgICAgIGxvZ3Byb2JzLFxuICAgICAgICAgICAgbWVzc2FnZToge1xuICAgICAgICAgICAgICAuLi5tZXNzYWdlUmVzdCxcbiAgICAgICAgICAgICAgcm9sZSxcbiAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgdG9vbF9jYWxsczogdG9vbF9jYWxscy5tYXAoKHRvb2xfY2FsbCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZnVuY3Rpb246IGZuLCB0eXBlLCBpZCwgLi4udG9vbFJlc3QgfSA9IHRvb2xfY2FsbDtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGFyZ3VtZW50czogYXJncywgbmFtZSwgLi4uZm5SZXN0IH0gPSBmbiB8fCB7fTtcbiAgICAgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgbWlzc2luZyBjaG9pY2VzWyR7aW5kZXh9XS50b29sX2NhbGxzWyR7aX1dLmlkXFxuJHtzdHIoc25hcHNob3QpfWApO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoYG1pc3NpbmcgY2hvaWNlc1ske2luZGV4fV0udG9vbF9jYWxsc1ske2l9XS50eXBlXFxuJHtzdHIoc25hcHNob3QpfWApO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBtaXNzaW5nIGNob2ljZXNbJHtpbmRleH1dLnRvb2xfY2FsbHNbJHtpfV0uZnVuY3Rpb24ubmFtZVxcbiR7c3RyKHNuYXBzaG90KX1gLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSUVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgbWlzc2luZyBjaG9pY2VzWyR7aW5kZXh9XS50b29sX2NhbGxzWyR7aX1dLmZ1bmN0aW9uLmFyZ3VtZW50c1xcbiR7c3RyKHNuYXBzaG90KX1gLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLnRvb2xSZXN0LCBpZCwgdHlwZSwgZnVuY3Rpb246IHsgLi4uZm5SZXN0LCBuYW1lLCBhcmd1bWVudHM6IGFyZ3MgfSB9O1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNob2ljZVJlc3QsXG4gICAgICAgICAgbWVzc2FnZTogeyAuLi5tZXNzYWdlUmVzdCwgY29udGVudCwgcm9sZSB9LFxuICAgICAgICAgIGZpbmlzaF9yZWFzb24sXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgbG9ncHJvYnMsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICksXG4gICAgY3JlYXRlZCxcbiAgICBtb2RlbCxcbiAgICBvYmplY3Q6ICdjaGF0LmNvbXBsZXRpb24nLFxuICAgIC4uLihzeXN0ZW1fZmluZ2VycHJpbnQgPyB7IHN5c3RlbV9maW5nZXJwcmludCB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdHIoeDogdW5rbm93bikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeCk7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN0cmVhbWVkIGNodW5rIG9mIGEgY2hhdCBjb21wbGV0aW9uIHJlc3BvbnNlIHJldHVybmVkIGJ5IG1vZGVsLFxuICogYmFzZWQgb24gdGhlIHByb3ZpZGVkIGlucHV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uU25hcHNob3Qge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNoYXQgY29tcGxldGlvbi5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjaGF0IGNvbXBsZXRpb24gY2hvaWNlcy4gQ2FuIGJlIG1vcmUgdGhhbiBvbmUgaWYgYG5gIGlzIGdyZWF0ZXJcbiAgICogdGhhbiAxLlxuICAgKi9cbiAgY2hvaWNlczogQXJyYXk8Q2hhdENvbXBsZXRpb25TbmFwc2hvdC5DaG9pY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIG9mIHdoZW4gdGhlIGNoYXQgY29tcGxldGlvbiB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRvIGdlbmVyYXRlIHRoZSBjb21wbGV0aW9uLlxuICAgKi9cbiAgbW9kZWw6IHN0cmluZztcblxuICAvLyBOb3RlIHdlIGRvIG5vdCBpbmNsdWRlIGFuIFwib2JqZWN0XCIgdHlwZSBvbiB0aGUgc25hcHNob3QsXG4gIC8vIGJlY2F1c2UgdGhlIG9iamVjdCBpcyBub3QgYSB2YWxpZCBcImNoYXQuY29tcGxldGlvblwiIHVudGlsIGZpbmFsaXplZC5cbiAgLy8gb2JqZWN0OiAnY2hhdC5jb21wbGV0aW9uJztcblxuICAvKipcbiAgICogVGhpcyBmaW5nZXJwcmludCByZXByZXNlbnRzIHRoZSBiYWNrZW5kIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGUgbW9kZWwgcnVucyB3aXRoLlxuICAgKlxuICAgKiBDYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgc2VlZGAgcmVxdWVzdCBwYXJhbWV0ZXIgdG8gdW5kZXJzdGFuZCB3aGVuXG4gICAqIGJhY2tlbmQgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0aGF0IG1pZ2h0IGltcGFjdCBkZXRlcm1pbmlzbS5cbiAgICovXG4gIHN5c3RlbV9maW5nZXJwcmludD86IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvblNuYXBzaG90IHtcbiAgZXhwb3J0IGludGVyZmFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIGRlbHRhIGdlbmVyYXRlZCBieSBzdHJlYW1lZCBtb2RlbCByZXNwb25zZXMuXG4gICAgICovXG4gICAgbWVzc2FnZTogQ2hvaWNlLk1lc3NhZ2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoZSBtb2RlbCBzdG9wcGVkIGdlbmVyYXRpbmcgdG9rZW5zLiBUaGlzIHdpbGwgYmUgYHN0b3BgIGlmIHRoZSBtb2RlbFxuICAgICAqIGhpdCBhIG5hdHVyYWwgc3RvcCBwb2ludCBvciBhIHByb3ZpZGVkIHN0b3Agc2VxdWVuY2UsIGBsZW5ndGhgIGlmIHRoZSBtYXhpbXVtXG4gICAgICogbnVtYmVyIG9mIHRva2VucyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIHJlYWNoZWQsIGBjb250ZW50X2ZpbHRlcmAgaWZcbiAgICAgKiBjb250ZW50IHdhcyBvbWl0dGVkIGR1ZSB0byBhIGZsYWcgZnJvbSBvdXIgY29udGVudCBmaWx0ZXJzLCBvciBgZnVuY3Rpb25fY2FsbGBcbiAgICAgKiBpZiB0aGUgbW9kZWwgY2FsbGVkIGEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZmluaXNoX3JlYXNvbjogQ2hhdENvbXBsZXRpb24uQ2hvaWNlWydmaW5pc2hfcmVhc29uJ10gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogTG9nIHByb2JhYmlsaXR5IGluZm9ybWF0aW9uIGZvciB0aGUgY2hvaWNlLlxuICAgICAqL1xuICAgIGxvZ3Byb2JzOiBDaGF0Q29tcGxldGlvbi5DaG9pY2UuTG9ncHJvYnMgfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGluZGV4IG9mIHRoZSBjaG9pY2UgaW4gdGhlIGxpc3Qgb2YgY2hvaWNlcy5cbiAgICAgKi9cbiAgICBpbmRleDogbnVtYmVyO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBDaG9pY2Uge1xuICAgIC8qKlxuICAgICAqIEEgY2hhdCBjb21wbGV0aW9uIGRlbHRhIGdlbmVyYXRlZCBieSBzdHJlYW1lZCBtb2RlbCByZXNwb25zZXMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNvbnRlbnRzIG9mIHRoZSBjaHVuayBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBjb250ZW50Pzogc3RyaW5nIHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbmFtZSBhbmQgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBhcyBnZW5lcmF0ZWQgYnkgdGhlXG4gICAgICAgKiBtb2RlbC5cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb25fY2FsbD86IE1lc3NhZ2UuRnVuY3Rpb25DYWxsO1xuXG4gICAgICB0b29sX2NhbGxzPzogQXJyYXk8TWVzc2FnZS5Ub29sQ2FsbD47XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJvbGUgb2YgdGhlIGF1dGhvciBvZiB0aGlzIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIHJvbGU/OiAnc3lzdGVtJyB8ICd1c2VyJyB8ICdhc3Npc3RhbnQnIHwgJ2Z1bmN0aW9uJyB8ICd0b29sJztcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBUb29sQ2FsbCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbC5cbiAgICAgICAgICovXG4gICAgICAgIGlkPzogc3RyaW5nO1xuXG4gICAgICAgIGZ1bmN0aW9uPzogVG9vbENhbGwuRnVuY3Rpb247XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0b29sLlxuICAgICAgICAgKi9cbiAgICAgICAgdHlwZT86ICdmdW5jdGlvbic7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBuYW1lc3BhY2UgVG9vbENhbGwge1xuICAgICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUaGUgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgsIGFzIGdlbmVyYXRlZCBieSB0aGUgbW9kZWwgaW4gSlNPTlxuICAgICAgICAgICAqIGZvcm1hdC4gTm90ZSB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBhbHdheXMgZ2VuZXJhdGUgdmFsaWQgSlNPTiwgYW5kIG1heVxuICAgICAgICAgICAqIGhhbGx1Y2luYXRlIHBhcmFtZXRlcnMgbm90IGRlZmluZWQgYnkgeW91ciBmdW5jdGlvbiBzY2hlbWEuIFZhbGlkYXRlIHRoZVxuICAgICAgICAgICAqIGFyZ3VtZW50cyBpbiB5b3VyIGNvZGUgYmVmb3JlIGNhbGxpbmcgeW91ciBmdW5jdGlvbi5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIG5hbWUgYW5kIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZVxuICAgICAgICogbW9kZWwuXG4gICAgICAgKi9cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25DYWxsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBhcmd1bWVudHMgdG8gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCwgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBpbiBKU09OXG4gICAgICAgICAqIGZvcm1hdC4gTm90ZSB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBhbHdheXMgZ2VuZXJhdGUgdmFsaWQgSlNPTiwgYW5kIG1heVxuICAgICAgICAgKiBoYWxsdWNpbmF0ZSBwYXJhbWV0ZXJzIG5vdCBkZWZpbmVkIGJ5IHlvdXIgZnVuY3Rpb24gc2NoZW1hLiBWYWxpZGF0ZSB0aGVcbiAgICAgICAgICogYXJndW1lbnRzIGluIHlvdXIgY29kZSBiZWZvcmUgY2FsbGluZyB5b3VyIGZ1bmN0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgYXJndW1lbnRzPzogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAgICAgICAgICovXG4gICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgQ29tcGxldGlvbnMsXG4gIHR5cGUgQ2hhdENvbXBsZXRpb25DaHVuayxcbiAgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9jaGF0L2NvbXBsZXRpb25zXCI7XG5pbXBvcnQgeyBSdW5uZXJPcHRpb25zLCB0eXBlIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMgfSBmcm9tICcuL0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXInO1xuaW1wb3J0IHsgdHlwZSBSZWFkYWJsZVN0cmVhbSB9IGZyb20gXCIuLi9fc2hpbXMvaW5kZXhcIjtcbmltcG9ydCB7IFJ1bm5hYmxlVG9vbHMsIHR5cGUgQmFzZUZ1bmN0aW9uc0FyZ3MsIHR5cGUgUnVubmFibGVGdW5jdGlvbnMgfSBmcm9tICcuL1J1bm5hYmxlRnVuY3Rpb24nO1xuaW1wb3J0IHsgQ2hhdENvbXBsZXRpb25TbmFwc2hvdCwgQ2hhdENvbXBsZXRpb25TdHJlYW0gfSBmcm9tICcuL0NoYXRDb21wbGV0aW9uU3RyZWFtJztcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvblN0cmVhbUV2ZW50cyBleHRlbmRzIEFic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJFdmVudHMge1xuICBjb250ZW50OiAoY29udGVudERlbHRhOiBzdHJpbmcsIGNvbnRlbnRTbmFwc2hvdDogc3RyaW5nKSA9PiB2b2lkO1xuICBjaHVuazogKGNodW5rOiBDaGF0Q29tcGxldGlvbkNodW5rLCBzbmFwc2hvdDogQ2hhdENvbXBsZXRpb25TbmFwc2hvdCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+ID0gT21pdDxcbiAgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICdmdW5jdGlvbnMnXG4+ICYge1xuICBmdW5jdGlvbnM6IFJ1bm5hYmxlRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3M+O1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4gPSBPbWl0PFxuICBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbiAgJ3Rvb2xzJ1xuPiAmIHtcbiAgdG9vbHM6IFJ1bm5hYmxlVG9vbHM8RnVuY3Rpb25zQXJncz47XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXJcbiAgZXh0ZW5kcyBDaGF0Q29tcGxldGlvblN0cmVhbVxuICBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8Q2hhdENvbXBsZXRpb25DaHVuaz5cbntcbiAgc3RhdGljIG92ZXJyaWRlIGZyb21SZWFkYWJsZVN0cmVhbShzdHJlYW06IFJlYWRhYmxlU3RyZWFtKTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcigpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+IHJ1bm5lci5fZnJvbVJlYWRhYmxlU3RyZWFtKHN0cmVhbSkpO1xuICAgIHJldHVybiBydW5uZXI7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgLSBwbGVhc2UgdXNlIGBydW5Ub29sc2AgaW5zdGVhZC4gKi9cbiAgc3RhdGljIHJ1bkZ1bmN0aW9uczxUIGV4dGVuZHMgKHN0cmluZyB8IG9iamVjdClbXT4oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtczxUPixcbiAgICBvcHRpb25zPzogUnVubmVyT3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcigpO1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAuLi5vcHRpb25zPy5oZWFkZXJzLCAnWC1TdGFpbmxlc3MtSGVscGVyLU1ldGhvZCc6ICdydW5GdW5jdGlvbnMnIH0sXG4gICAgfTtcbiAgICBydW5uZXIuX3J1bigoKSA9PiBydW5uZXIuX3J1bkZ1bmN0aW9ucyhjb21wbGV0aW9ucywgcGFyYW1zLCBvcHRzKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIHN0YXRpYyBydW5Ub29sczxUIGV4dGVuZHMgKHN0cmluZyB8IG9iamVjdClbXT4oXG4gICAgY29tcGxldGlvbnM6IENvbXBsZXRpb25zLFxuICAgIHBhcmFtczogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zPFQ+LFxuICAgIG9wdGlvbnM/OiBSdW5uZXJPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lciB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyKCk7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3J1blRvb2xzJyB9LFxuICAgIH07XG4gICAgcnVubmVyLl9ydW4oKCkgPT4gcnVubmVyLl9ydW5Ub29scyhjb21wbGV0aW9ucywgcGFyYW1zLCBvcHRzKSk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBDaGF0Q29tcGxldGlvblJ1bm5lciwgQ2hhdENvbXBsZXRpb25GdW5jdGlvblJ1bm5lclBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25SdW5uZXJcIjtcbmV4cG9ydCB7IENoYXRDb21wbGV0aW9uUnVubmVyLCBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblJ1bm5lclwiO1xuaW1wb3J0IHtcbiAgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIsXG4gIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nRnVuY3Rpb25SdW5uZXJQYXJhbXMsXG59IGZyb20gXCIuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXJcIjtcbmV4cG9ydCB7XG4gIENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyLFxuICBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zLFxufSBmcm9tIFwiLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyXCI7XG5pbXBvcnQgeyBCYXNlRnVuY3Rpb25zQXJncyB9IGZyb20gXCIuLi8uLi8uLi9saWIvUnVubmFibGVGdW5jdGlvblwiO1xuZXhwb3J0IHtcbiAgUnVubmFibGVGdW5jdGlvbixcbiAgUnVubmFibGVGdW5jdGlvbnMsXG4gIFJ1bm5hYmxlRnVuY3Rpb25XaXRoUGFyc2UsXG4gIFJ1bm5hYmxlRnVuY3Rpb25XaXRob3V0UGFyc2UsXG4gIFBhcnNpbmdGdW5jdGlvbixcbiAgUGFyc2luZ1Rvb2xGdW5jdGlvbixcbn0gZnJvbSBcIi4uLy4uLy4uL2xpYi9SdW5uYWJsZUZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uUnVubmVyXCI7XG5leHBvcnQgeyBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uUnVubmVyXCI7XG5pbXBvcnQgeyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyXCI7XG5leHBvcnQgeyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1Rvb2xSdW5uZXJQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vbGliL0NoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyXCI7XG5pbXBvcnQgeyBDaGF0Q29tcGxldGlvblN0cmVhbSwgdHlwZSBDaGF0Q29tcGxldGlvblN0cmVhbVBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9saWIvQ2hhdENvbXBsZXRpb25TdHJlYW1cIjtcbmV4cG9ydCB7IENoYXRDb21wbGV0aW9uU3RyZWFtLCB0eXBlIENoYXRDb21wbGV0aW9uU3RyZWFtUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9DaGF0Q29tcGxldGlvblN0cmVhbVwiO1xuXG5leHBvcnQgY2xhc3MgQ29tcGxldGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBgcnVuVG9vbHNgIGluc3RlYWQuXG4gICAqL1xuICBydW5GdW5jdGlvbnM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBib2R5OiBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblJ1bm5lcjtcbiAgcnVuRnVuY3Rpb25zPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXI7XG4gIHJ1bkZ1bmN0aW9uczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGJvZHk6XG4gICAgICB8IENoYXRDb21wbGV0aW9uRnVuY3Rpb25SdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz5cbiAgICAgIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdGdW5jdGlvblJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25SdW5uZXIgfCBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lciB7XG4gICAgaWYgKGJvZHkuc3RyZWFtKSB7XG4gICAgICByZXR1cm4gQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdSdW5uZXIucnVuRnVuY3Rpb25zKFxuICAgICAgICB0aGlzLl9jbGllbnQuY2hhdC5jb21wbGV0aW9ucyxcbiAgICAgICAgYm9keSBhcyBDaGF0Q29tcGxldGlvblN0cmVhbWluZ0Z1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIENoYXRDb21wbGV0aW9uUnVubmVyLnJ1bkZ1bmN0aW9ucyhcbiAgICAgIHRoaXMuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLFxuICAgICAgYm9keSBhcyBDaGF0Q29tcGxldGlvbkZ1bmN0aW9uUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY29udmVuaWVuY2UgaGVscGVyIGZvciB1c2luZyB0b29sIGNhbGxzIHdpdGggdGhlIC9jaGF0L2NvbXBsZXRpb25zIGVuZHBvaW50XG4gICAqIHdoaWNoIGF1dG9tYXRpY2FsbHkgY2FsbHMgdGhlIEphdmFTY3JpcHQgZnVuY3Rpb25zIHlvdSBwcm92aWRlIGFuZCBzZW5kcyB0aGVpclxuICAgKiByZXN1bHRzIGJhY2sgdG8gdGhlIC9jaGF0L2NvbXBsZXRpb25zIGVuZHBvaW50LCBsb29waW5nIGFzIGxvbmcgYXMgdGhlIG1vZGVsXG4gICAqIHJlcXVlc3RzIGZ1bmN0aW9uIGNhbGxzLlxuICAgKlxuICAgKiBGb3IgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcywgc2VlXG4gICAqIFt0aGUgZG9jc10oaHR0cHM6Ly9naXRodWIuY29tL29wZW5haS9vcGVuYWktbm9kZSNhdXRvbWF0ZWQtZnVuY3Rpb24tY2FsbHMpXG4gICAqL1xuICBydW5Ub29sczxGdW5jdGlvbnNBcmdzIGV4dGVuZHMgQmFzZUZ1bmN0aW9uc0FyZ3M+KFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ2hhdENvbXBsZXRpb25SdW5uZXI7XG4gIHJ1blRvb2xzPEZ1bmN0aW9uc0FyZ3MgZXh0ZW5kcyBCYXNlRnVuY3Rpb25zQXJncz4oXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lcjtcbiAgcnVuVG9vbHM8RnVuY3Rpb25zQXJncyBleHRlbmRzIEJhc2VGdW5jdGlvbnNBcmdzPihcbiAgICBib2R5OlxuICAgICAgfCBDaGF0Q29tcGxldGlvblRvb2xSdW5uZXJQYXJhbXM8RnVuY3Rpb25zQXJncz5cbiAgICAgIHwgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDaGF0Q29tcGxldGlvblJ1bm5lciB8IENoYXRDb21wbGV0aW9uU3RyZWFtaW5nUnVubmVyIHtcbiAgICBpZiAoYm9keS5zdHJlYW0pIHtcbiAgICAgIHJldHVybiBDaGF0Q29tcGxldGlvblN0cmVhbWluZ1J1bm5lci5ydW5Ub29scyhcbiAgICAgICAgdGhpcy5fY2xpZW50LmNoYXQuY29tcGxldGlvbnMsXG4gICAgICAgIGJvZHkgYXMgQ2hhdENvbXBsZXRpb25TdHJlYW1pbmdUb29sUnVubmVyUGFyYW1zPEZ1bmN0aW9uc0FyZ3M+LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIENoYXRDb21wbGV0aW9uUnVubmVyLnJ1blRvb2xzKFxuICAgICAgdGhpcy5fY2xpZW50LmNoYXQuY29tcGxldGlvbnMsXG4gICAgICBib2R5IGFzIENoYXRDb21wbGV0aW9uVG9vbFJ1bm5lclBhcmFtczxGdW5jdGlvbnNBcmdzPixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2hhdCBjb21wbGV0aW9uIHN0cmVhbVxuICAgKi9cbiAgc3RyZWFtKGJvZHk6IENoYXRDb21wbGV0aW9uU3RyZWFtUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENoYXRDb21wbGV0aW9uU3RyZWFtIHtcbiAgICByZXR1cm4gQ2hhdENvbXBsZXRpb25TdHJlYW0uY3JlYXRlQ2hhdENvbXBsZXRpb24odGhpcy5fY2xpZW50LmNoYXQuY29tcGxldGlvbnMsIGJvZHksIG9wdGlvbnMpO1xuICB9XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIENvbXBsZXRpb25zQVBJIGZyb20gXCIuL2NvbXBsZXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGF0IGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBjb21wbGV0aW9uczogQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnMgPSBuZXcgQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnModGhpcy5fY2xpZW50KTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0IHtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9ucyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25zO1xufVxuIiwgImltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVVzZXJBYm9ydEVycm9yLCBPcGVuQUlFcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuaW1wb3J0IHsgUnVuLCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9ydW5zL3J1bnNcIjtcbmltcG9ydCB7IFJ1bkNyZWF0ZVBhcmFtc0Jhc2UsIFJ1bnMgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9ydW5zL3J1bnNcIjtcbmltcG9ydCB7IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsIFRocmVhZHMgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy90aHJlYWRzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFzc2lzdGFudFN0cmVhbVJ1bm5lcjxcbiAgRXZlbnRzIGV4dGVuZHMgQ3VzdG9tRXZlbnRzPGFueT4gPSBBYnN0cmFjdEFzc2lzdGFudFJ1bm5lckV2ZW50cyxcbj4ge1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgI2Nvbm5lY3RlZFByb21pc2U6IFByb21pc2U8dm9pZD47XG4gICNyZXNvbHZlQ29ubmVjdGVkUHJvbWlzZTogKCkgPT4gdm9pZCA9ICgpID0+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+IHZvaWQ7XG4gIGVuZDogKCkgPT4gdm9pZDtcbn1cbiIsICJpbXBvcnQge1xuICBUZXh0Q29udGVudEJsb2NrLFxuICBJbWFnZUZpbGVDb250ZW50QmxvY2ssXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VDb250ZW50RGVsdGEsXG4gIFRleHQsXG4gIEltYWdlRmlsZSxcbiAgVGV4dERlbHRhLFxuICBNZXNzYWdlcyxcbn0gZnJvbSBcIi4uL3Jlc291cmNlcy9iZXRhL3RocmVhZHMvbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7XG4gIFJ1bixcbiAgUnVuQ3JlYXRlUGFyYW1zQmFzZSxcbiAgUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nLFxuICBSdW5zLFxuICBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2UsXG4gIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nLFxufSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy9ydW5zL3J1bnNcIjtcbmltcG9ydCB7XG4gIEFic3RyYWN0QXNzaXN0YW50UnVubmVyRXZlbnRzLFxuICBBYnN0cmFjdEFzc2lzdGFudFN0cmVhbVJ1bm5lcixcbn0gZnJvbSAnLi9BYnN0cmFjdEFzc2lzdGFudFN0cmVhbVJ1bm5lcic7XG5pbXBvcnQgeyB0eXBlIFJlYWRhYmxlU3RyZWFtIH0gZnJvbSBcIi4uL19zaGltcy9pbmRleFwiO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcIi4uL3N0cmVhbWluZ1wiO1xuaW1wb3J0IHsgQVBJVXNlckFib3J0RXJyb3IsIE9wZW5BSUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCI7XG5pbXBvcnQge1xuICBBc3Npc3RhbnRTdHJlYW1FdmVudCxcbiAgTWVzc2FnZVN0cmVhbUV2ZW50LFxuICBSdW5TdGVwU3RyZWFtRXZlbnQsXG4gIFJ1blN0cmVhbUV2ZW50LFxufSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvYXNzaXN0YW50c1wiO1xuaW1wb3J0IHsgUnVuU3RlcCwgUnVuU3RlcERlbHRhLCBUb29sQ2FsbCwgVG9vbENhbGxEZWx0YSB9IGZyb20gXCIuLi9yZXNvdXJjZXMvYmV0YS90aHJlYWRzL3J1bnMvc3RlcHNcIjtcbmltcG9ydCB7IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsIFRocmVhZHMgfSBmcm9tIFwiLi4vcmVzb3VyY2VzL2JldGEvdGhyZWFkcy90aHJlYWRzXCI7XG5pbXBvcnQgTWVzc2FnZURlbHRhID0gTWVzc2FnZXMuTWVzc2FnZURlbHRhO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudFN0cmVhbUV2ZW50cyBleHRlbmRzIEFic3RyYWN0QXNzaXN0YW50UnVubmVyRXZlbnRzIHtcbiAgLy9OZXcgZXZlbnQgc3RydWN0dXJlXG4gIG1lc3NhZ2VDcmVhdGVkOiAobWVzc2FnZTogTWVzc2FnZSkgPT4gdm9pZDtcbiAgbWVzc2FnZURlbHRhOiAobWVzc2FnZTogTWVzc2FnZURlbHRhLCBzbmFwc2hvdDogTWVzc2FnZSkgPT4gdm9pZDtcbiAgbWVzc2FnZURvbmU6IChtZXNzYWdlOiBNZXNzYWdlKSA9PiB2b2lkO1xuXG4gIHJ1blN0ZXBDcmVhdGVkOiAocnVuU3RlcDogUnVuU3RlcCkgPT4gdm9pZDtcbiAgcnVuU3RlcERlbHRhOiAoZGVsdGE6IFJ1blN0ZXBEZWx0YSwgc25hcHNob3Q6IFJ1bnMuUnVuU3RlcCkgPT4gdm9pZDtcbiAgcnVuU3RlcERvbmU6IChydW5TdGVwOiBSdW5zLlJ1blN0ZXAsIHNuYXBzaG90OiBSdW5zLlJ1blN0ZXApID0+IHZvaWQ7XG5cbiAgdG9vbENhbGxDcmVhdGVkOiAodG9vbENhbGw6IFRvb2xDYWxsKSA9PiB2b2lkO1xuICB0b29sQ2FsbERlbHRhOiAoZGVsdGE6IFRvb2xDYWxsRGVsdGEsIHNuYXBzaG90OiBUb29sQ2FsbCkgPT4gdm9pZDtcbiAgdG9vbENhbGxEb25lOiAodG9vbENhbGw6IFRvb2xDYWxsKSA9PiB2b2lkO1xuXG4gIHRleHRDcmVhdGVkOiAoY29udGVudDogVGV4dCkgPT4gdm9pZDtcbiAgdGV4dERlbHRhOiAoZGVsdGE6IFRleHREZWx0YSwgc25hcHNob3Q6IFRleHQpID0+IHZvaWQ7XG4gIHRleHREb25lOiAoY29udGVudDogVGV4dCwgc25hcHNob3Q6IE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgLy9ObyBjcmVhdGVkIG9yIGRlbHRhIGFzIHRoaXMgaXMgbm90IHN0cmVhbWVkXG4gIGltYWdlRmlsZURvbmU6IChjb250ZW50OiBJbWFnZUZpbGUsIHNuYXBzaG90OiBNZXNzYWdlKSA9PiB2b2lkO1xuXG4gIGVuZDogKCkgPT4gdm9pZDtcblxuICBldmVudDogKGV2ZW50OiBBc3Npc3RhbnRTdHJlYW1FdmVudCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZVN0cmVhbSA9IE9taXQ8VGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZSwgJ3N0cmVhbSc+ICYge1xuICBzdHJlYW0/OiB0cnVlO1xufTtcblxuZXhwb3J0IHR5cGUgUnVuQ3JlYXRlUGFyYW1zQmFzZVN0cmVhbSA9IE9taXQ8UnVuQ3JlYXRlUGFyYW1zQmFzZSwgJ3N0cmVhbSc+ICYge1xuICBzdHJlYW0/OiB0cnVlO1xufTtcblxuZXhwb3J0IHR5cGUgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW0gPSBPbWl0PFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zQmFzZSwgJ3N0cmVhbSc+ICYge1xuICBzdHJlYW0/OiB0cnVlO1xufTtcblxuZXhwb3J0IGNsYXNzIEFzc2lzdGFudFN0cmVhbVxuICBleHRlbmRzIEFic3RyYWN0QXNzaXN0YW50U3RyZWFtUnVubmVyPEFzc2lzdGFudFN0cmVhbUV2ZW50cz5cbiAgaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPEFzc2lzdGFudFN0cmVhbUV2ZW50Plxue1xuICAvL1RyYWNrIGFsbCBldmVudHMgaW4gYSBzaW5nbGUgbGlzdCBmb3IgcmVmZXJlbmNlXG4gICNldmVudHM6IEFzc2lzdGFudFN0cmVhbUV2ZW50W10gPSBbXTtcblxuICAvL1VzZWQgdG8gYWNjdW11bGF0ZSBkZWx0YXNcbiAgLy9XZSBhcmUgYWNjdW11bGF0aW5nIG1hbnkgdHlwZXMgc28gdGhlIHZhbHVlIGhlcmUgaXMgbm90IHN0cmljdFxuICAjcnVuU3RlcFNuYXBzaG90czogeyBbaWQ6IHN0cmluZ106IFJ1bnMuUnVuU3RlcCB9ID0ge307XG4gICNtZXNzYWdlU25hcHNob3RzOiB7IFtpZDogc3RyaW5nXTogTWVzc2FnZSB9ID0ge307XG4gICNtZXNzYWdlU25hcHNob3Q6IE1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gICNmaW5hbFJ1bjogUnVuIHwgdW5kZWZpbmVkO1xuICAjY3VycmVudENvbnRlbnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAjY3VycmVudENvbnRlbnQ6IFRleHRDb250ZW50QmxvY2sgfCBJbWFnZUZpbGVDb250ZW50QmxvY2sgfCB1bmRlZmluZWQ7XG4gICNjdXJyZW50VG9vbENhbGxJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAjY3VycmVudFRvb2xDYWxsOiBUb29sQ2FsbCB8IHVuZGVmaW5lZDtcblxuICAvL0ZvciBjdXJyZW50IHNuYXBzaG90IG1ldGhvZHNcbiAgI2N1cnJlbnRFdmVudDogQXNzaXN0YW50U3RyZWFtRXZlbnQgfCB1bmRlZmluZWQ7XG4gICNjdXJyZW50UnVuU25hcHNob3Q6IFJ1biB8IHVuZGVmaW5lZDtcbiAgI2N1cnJlbnRSdW5TdGVwU25hcHNob3Q6IFJ1bnMuUnVuU3RlcCB8IHVuZGVmaW5lZDtcblxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmF0b3I8QXNzaXN0YW50U3RyZWFtRXZlbnQ+IHtcbiAgICBjb25zdCBwdXNoUXVldWU6IEFzc2lzdGFudFN0cmVhbUV2ZW50W10gPSBbXTtcbiAgICBjb25zdCByZWFkUXVldWU6IHtcbiAgICAgIHJlc29sdmU6IChjaHVuazogQXNzaXN0YW50U3RyZWFtRXZlbnQgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnI6IHVua25vd24pID0+IHZvaWQ7XG4gICAgfVtdID0gW107XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcblxuICAgIC8vQ2F0Y2ggYWxsIGZvciBwYXNzaW5nIGFsb25nIGFsbCBldmVudHNcbiAgICB0aGlzLm9uKCdldmVudCcsIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyID0gcmVhZFF1ZXVlLnNoaWZ0KCk7XG4gICAgICBpZiAocmVhZGVyKSB7XG4gICAgICAgIHJlYWRlci5yZXNvbHZlKGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hRdWV1ZS5wdXNoKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgcmVhZFF1ZXVlKSB7XG4gICAgICAgIHJlYWRlci5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICByZWFkUXVldWUubGVuZ3RoID0gMDtcbiAgICB9KTtcblxuICAgIHRoaXMub24oJ2Fib3J0JywgKGVycikgPT4ge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IHJlYWRlciBvZiByZWFkUXVldWUpIHtcbiAgICAgICAgcmVhZGVyLnJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgcmVhZFF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCByZWFkZXIgb2YgcmVhZFF1ZXVlKSB7XG4gICAgICAgIHJlYWRlci5yZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJlYWRRdWV1ZS5sZW5ndGggPSAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGFzeW5jICgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PEFzc2lzdGFudFN0cmVhbUV2ZW50Pj4gPT4ge1xuICAgICAgICBpZiAoIXB1c2hRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8QXNzaXN0YW50U3RyZWFtRXZlbnQgfCB1bmRlZmluZWQ+KChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICAgICByZWFkUXVldWUucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KSxcbiAgICAgICAgICApLnRoZW4oKGNodW5rKSA9PiAoY2h1bmsgPyB7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfSA6IHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2h1bmsgPSBwdXNoUXVldWUuc2hpZnQoKSE7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBjaHVuaywgZG9uZTogZmFsc2UgfTtcbiAgICAgIH0sXG4gICAgICByZXR1cm46IGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydCgpO1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbVJlYWRhYmxlU3RyZWFtKHN0cmVhbTogUmVhZGFibGVTdHJlYW0pOiBBc3Npc3RhbnRTdHJlYW0ge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBBc3Npc3RhbnRTdHJlYW0oKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PiBydW5uZXIuX2Zyb21SZWFkYWJsZVN0cmVhbShzdHJlYW0pKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9mcm9tUmVhZGFibGVTdHJlYW0oXG4gICAgcmVhZGFibGVTdHJlYW06IFJlYWRhYmxlU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHRoaXMuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gdGhpcy5jb250cm9sbGVyLmFib3J0KCkpO1xuICAgIH1cbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcbiAgICBjb25zdCBzdHJlYW0gPSBTdHJlYW0uZnJvbVJlYWRhYmxlU3RyZWFtPEFzc2lzdGFudFN0cmVhbUV2ZW50PihyZWFkYWJsZVN0cmVhbSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIHN0cmVhbSkge1xuICAgICAgdGhpcy4jYWRkRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoc3RyZWFtLmNvbnRyb2xsZXIuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bih0aGlzLiNlbmRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgdG9SZWFkYWJsZVN0cmVhbSgpOiBSZWFkYWJsZVN0cmVhbSB7XG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmVhbSh0aGlzW1N5bWJvbC5hc3luY0l0ZXJhdG9yXS5iaW5kKHRoaXMpLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIHJldHVybiBzdHJlYW0udG9SZWFkYWJsZVN0cmVhbSgpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRvb2xBc3Npc3RhbnRTdHJlYW0oXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHJ1bnM6IFJ1bnMsXG4gICAgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW0sXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gICkge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBBc3Npc3RhbnRTdHJlYW0oKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PlxuICAgICAgcnVubmVyLl9ydW5Ub29sQXNzaXN0YW50U3RyZWFtKHRocmVhZElkLCBydW5JZCwgcnVucywgYm9keSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1IZWxwZXItTWV0aG9kJzogJ3N0cmVhbScgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJ1bm5lcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBfY3JlYXRlVG9vbEFzc2lzdGFudFN0cmVhbShcbiAgICBydW46IFJ1bnMsXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHBhcmFtczogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW0sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmcgPSB7IC4uLnBhcmFtcywgc3RyZWFtOiB0cnVlIH07XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgcnVuLnN1Ym1pdFRvb2xPdXRwdXRzKHRocmVhZElkLCBydW5JZCwgYm9keSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHNpZ25hbDogdGhpcy5jb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcblxuICAgIHRoaXMuX2Nvbm5lY3RlZCgpO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBzdHJlYW0pIHtcbiAgICAgIHRoaXMuI2FkZEV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKHN0cmVhbS5jb250cm9sbGVyLnNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEFQSVVzZXJBYm9ydEVycm9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2FkZFJ1bih0aGlzLiNlbmRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRocmVhZEFzc2lzdGFudFN0cmVhbShcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlU3RyZWFtLFxuICAgIHRocmVhZDogVGhyZWFkcyxcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBBc3Npc3RhbnRTdHJlYW0oKTtcbiAgICBydW5uZXIuX3J1bigoKSA9PlxuICAgICAgcnVubmVyLl90aHJlYWRBc3Npc3RhbnRTdHJlYW0oYm9keSwgdGhyZWFkLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAnc3RyZWFtJyB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUFzc2lzdGFudFN0cmVhbShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bnM6IFJ1bnMsXG4gICAgcGFyYW1zOiBSdW5DcmVhdGVQYXJhbXNCYXNlU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IEFzc2lzdGFudFN0cmVhbSgpO1xuICAgIHJ1bm5lci5fcnVuKCgpID0+XG4gICAgICBydW5uZXIuX3J1bkFzc2lzdGFudFN0cmVhbSh0aHJlYWRJZCwgcnVucywgcGFyYW1zLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLUhlbHBlci1NZXRob2QnOiAnc3RyZWFtJyB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gcnVubmVyO1xuICB9XG5cbiAgY3VycmVudEV2ZW50KCk6IEFzc2lzdGFudFN0cmVhbUV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY3VycmVudEV2ZW50O1xuICB9XG5cbiAgY3VycmVudFJ1bigpOiBSdW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNjdXJyZW50UnVuU25hcHNob3Q7XG4gIH1cblxuICBjdXJyZW50TWVzc2FnZVNuYXBzaG90KCk6IE1lc3NhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtZXNzYWdlU25hcHNob3Q7XG4gIH1cblxuICBjdXJyZW50UnVuU3RlcFNuYXBzaG90KCk6IFJ1bnMuUnVuU3RlcCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2N1cnJlbnRSdW5TdGVwU25hcHNob3Q7XG4gIH1cblxuICBhc3luYyBmaW5hbFJ1blN0ZXBzKCk6IFByb21pc2U8UnVucy5SdW5TdGVwW10+IHtcbiAgICBhd2FpdCB0aGlzLmRvbmUoKTtcblxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuI3J1blN0ZXBTbmFwc2hvdHMpO1xuICB9XG5cbiAgYXN5bmMgZmluYWxNZXNzYWdlcygpOiBQcm9taXNlPE1lc3NhZ2VbXT4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy4jbWVzc2FnZVNuYXBzaG90cyk7XG4gIH1cblxuICBhc3luYyBmaW5hbFJ1bigpOiBQcm9taXNlPFJ1bj4ge1xuICAgIGF3YWl0IHRoaXMuZG9uZSgpO1xuICAgIGlmICghdGhpcy4jZmluYWxSdW4pIHRocm93IEVycm9yKCdGaW5hbCBydW4gd2FzIG5vdCByZWNlaXZlZC4nKTtcblxuICAgIHJldHVybiB0aGlzLiNmaW5hbFJ1bjtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBfY3JlYXRlVGhyZWFkQXNzaXN0YW50U3RyZWFtKFxuICAgIHRocmVhZDogVGhyZWFkcyxcbiAgICBwYXJhbXM6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8UnVuPiB7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhpcy5jb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keTogUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0geyAuLi5wYXJhbXMsIHN0cmVhbTogdHJ1ZSB9O1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IHRocmVhZC5jcmVhdGVBbmRSdW4oYm9keSwgeyAuLi5vcHRpb25zLCBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2Ygc3RyZWFtKSB7XG4gICAgICB0aGlzLiNhZGRFdmVudChldmVudCk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uY29udHJvbGxlci5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hZGRSdW4odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBfY3JlYXRlQXNzaXN0YW50U3RyZWFtKFxuICAgIHJ1bjogUnVucyxcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHBhcmFtczogUnVuQ3JlYXRlUGFyYW1zQmFzZSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSdW4+IHtcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgaWYgKHNpZ25hbCkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aGlzLmNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5OiBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSB7IC4uLnBhcmFtcywgc3RyZWFtOiB0cnVlIH07XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgcnVuLmNyZWF0ZSh0aHJlYWRJZCwgYm9keSwgeyAuLi5vcHRpb25zLCBzaWduYWw6IHRoaXMuY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICB0aGlzLl9jb25uZWN0ZWQoKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2Ygc3RyZWFtKSB7XG4gICAgICB0aGlzLiNhZGRFdmVudChldmVudCk7XG4gICAgfVxuICAgIGlmIChzdHJlYW0uY29udHJvbGxlci5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hZGRSdW4odGhpcy4jZW5kUmVxdWVzdCgpKTtcbiAgfVxuXG4gICNhZGRFdmVudChldmVudDogQXNzaXN0YW50U3RyZWFtRXZlbnQpIHtcbiAgICBpZiAodGhpcy5lbmRlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy4jY3VycmVudEV2ZW50ID0gZXZlbnQ7XG5cbiAgICB0aGlzLiNoYW5kbGVFdmVudChldmVudCk7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQuY3JlYXRlZCc6XG4gICAgICAgIC8vTm8gYWN0aW9uIG9uIHRoaXMgZXZlbnQuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNyZWF0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5xdWV1ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5pbl9wcm9ncmVzcyc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnJlcXVpcmVzX2FjdGlvbic6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmZhaWxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLmNhbmNlbGxpbmcnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jYW5jZWxsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5leHBpcmVkJzpcbiAgICAgICAgdGhpcy4jaGFuZGxlUnVuKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jcmVhdGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5pbl9wcm9ncmVzcyc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZGVsdGEnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZmFpbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jYW5jZWxsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmV4cGlyZWQnOlxuICAgICAgICB0aGlzLiNoYW5kbGVSdW5TdGVwKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmNyZWF0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuaW5fcHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuZGVsdGEnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmluY29tcGxldGUnOlxuICAgICAgICB0aGlzLiNoYW5kbGVNZXNzYWdlKGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgLy9UaGlzIGlzIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MsIGJ1dCBlcnJvcnMgYXJlIHByb2Nlc3NlZCBpbiB0aGUgU1NFIGV2ZW50IHByb2Nlc3Npbmcgc28gdGhpcyBzaG91bGQgbm90IG9jY3VyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnRW5jb3VudGVyZWQgYW4gZXJyb3IgZXZlbnQgaW4gZXZlbnQgcHJvY2Vzc2luZyAtIGVycm9ycyBzaG91bGQgYmUgcHJvY2Vzc2VkIGVhcmxpZXInLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gICNlbmRSZXF1ZXN0KCk6IFJ1biB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBPcGVuQUlFcnJvcihgc3RyZWFtIGhhcyBlbmRlZCwgdGhpcyBzaG91bGRuJ3QgaGFwcGVuYCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLiNmaW5hbFJ1bikgdGhyb3cgRXJyb3IoJ0ZpbmFsIHJ1biBoYXMgbm90IGJlZW4gcmVjZWl2ZWQnKTtcblxuICAgIHJldHVybiB0aGlzLiNmaW5hbFJ1bjtcbiAgfVxuXG4gICNoYW5kbGVNZXNzYWdlKGV2ZW50OiBNZXNzYWdlU3RyZWFtRXZlbnQpIHtcbiAgICBjb25zdCBbYWNjdW11bGF0ZWRNZXNzYWdlLCBuZXdDb250ZW50XSA9IHRoaXMuI2FjY3VtdWxhdGVNZXNzYWdlKGV2ZW50LCB0aGlzLiNtZXNzYWdlU25hcHNob3QpO1xuICAgIHRoaXMuI21lc3NhZ2VTbmFwc2hvdCA9IGFjY3VtdWxhdGVkTWVzc2FnZTtcbiAgICB0aGlzLiNtZXNzYWdlU25hcHNob3RzW2FjY3VtdWxhdGVkTWVzc2FnZS5pZF0gPSBhY2N1bXVsYXRlZE1lc3NhZ2U7XG5cbiAgICBmb3IgKGNvbnN0IGNvbnRlbnQgb2YgbmV3Q29udGVudCkge1xuICAgICAgY29uc3Qgc25hcHNob3RDb250ZW50ID0gYWNjdW11bGF0ZWRNZXNzYWdlLmNvbnRlbnRbY29udGVudC5pbmRleF07XG4gICAgICBpZiAoc25hcHNob3RDb250ZW50Py50eXBlID09ICd0ZXh0Jykge1xuICAgICAgICB0aGlzLl9lbWl0KCd0ZXh0Q3JlYXRlZCcsIHNuYXBzaG90Q29udGVudC50ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5jcmVhdGVkJzpcbiAgICAgICAgdGhpcy5fZW1pdCgnbWVzc2FnZUNyZWF0ZWQnLCBldmVudC5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmluX3Byb2dyZXNzJzpcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmRlbHRhJzpcbiAgICAgICAgdGhpcy5fZW1pdCgnbWVzc2FnZURlbHRhJywgZXZlbnQuZGF0YS5kZWx0YSwgYWNjdW11bGF0ZWRNZXNzYWdlKTtcblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5kZWx0YS5jb250ZW50KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjb250ZW50IG9mIGV2ZW50LmRhdGEuZGVsdGEuY29udGVudCkge1xuICAgICAgICAgICAgLy9JZiBpdCBpcyB0ZXh0IGRlbHRhLCBlbWl0IGEgdGV4dCBkZWx0YSBldmVudFxuICAgICAgICAgICAgaWYgKGNvbnRlbnQudHlwZSA9PSAndGV4dCcgJiYgY29udGVudC50ZXh0KSB7XG4gICAgICAgICAgICAgIGxldCB0ZXh0RGVsdGEgPSBjb250ZW50LnRleHQ7XG4gICAgICAgICAgICAgIGxldCBzbmFwc2hvdCA9IGFjY3VtdWxhdGVkTWVzc2FnZS5jb250ZW50W2NvbnRlbnQuaW5kZXhdO1xuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgJiYgc25hcHNob3QudHlwZSA9PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0KCd0ZXh0RGVsdGEnLCB0ZXh0RGVsdGEsIHNuYXBzaG90LnRleHQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdUaGUgc25hcHNob3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGV4dCBkZWx0YSBpcyBub3QgdGV4dCBvciBtaXNzaW5nJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXggIT0gdGhpcy4jY3VycmVudENvbnRlbnRJbmRleCkge1xuICAgICAgICAgICAgICAvL1NlZSBpZiB3ZSBoYXZlIGluIHByb2dyZXNzIGNvbnRlbnRcbiAgICAgICAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLiNjdXJyZW50Q29udGVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgndGV4dERvbmUnLCB0aGlzLiNjdXJyZW50Q29udGVudC50ZXh0LCB0aGlzLiNtZXNzYWdlU25hcHNob3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2ltYWdlX2ZpbGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0KCdpbWFnZUZpbGVEb25lJywgdGhpcy4jY3VycmVudENvbnRlbnQuaW1hZ2VfZmlsZSwgdGhpcy4jbWVzc2FnZVNuYXBzaG90KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy4jY3VycmVudENvbnRlbnRJbmRleCA9IGNvbnRlbnQuaW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRDb250ZW50ID0gYWNjdW11bGF0ZWRNZXNzYWdlLmNvbnRlbnRbY29udGVudC5pbmRleF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5pbmNvbXBsZXRlJzpcbiAgICAgICAgLy9XZSBlbWl0IHRoZSBsYXRlc3QgY29udGVudCB3ZSB3ZXJlIHdvcmtpbmcgb24gb24gY29tcGxldGlvbiAoaW5jbHVkaW5nIGluY29tcGxldGUpXG4gICAgICAgIGlmICh0aGlzLiNjdXJyZW50Q29udGVudEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGV2ZW50LmRhdGEuY29udGVudFt0aGlzLiNjdXJyZW50Q29udGVudEluZGV4XTtcbiAgICAgICAgICBpZiAoY3VycmVudENvbnRlbnQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudENvbnRlbnQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdpbWFnZV9maWxlJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0KCdpbWFnZUZpbGVEb25lJywgY3VycmVudENvbnRlbnQuaW1hZ2VfZmlsZSwgdGhpcy4jbWVzc2FnZVNuYXBzaG90KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgndGV4dERvbmUnLCBjdXJyZW50Q29udGVudC50ZXh0LCB0aGlzLiNtZXNzYWdlU25hcHNob3QpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLiNtZXNzYWdlU25hcHNob3QpIHtcbiAgICAgICAgICB0aGlzLl9lbWl0KCdtZXNzYWdlRG9uZScsIGV2ZW50LmRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jbWVzc2FnZVNuYXBzaG90ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gICNoYW5kbGVSdW5TdGVwKGV2ZW50OiBSdW5TdGVwU3RyZWFtRXZlbnQpIHtcbiAgICBjb25zdCBhY2N1bXVsYXRlZFJ1blN0ZXAgPSB0aGlzLiNhY2N1bXVsYXRlUnVuU3RlcChldmVudCk7XG4gICAgdGhpcy4jY3VycmVudFJ1blN0ZXBTbmFwc2hvdCA9IGFjY3VtdWxhdGVkUnVuU3RlcDtcblxuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jcmVhdGVkJzpcbiAgICAgICAgdGhpcy5fZW1pdCgncnVuU3RlcENyZWF0ZWQnLCBldmVudC5kYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZGVsdGEnOlxuICAgICAgICBjb25zdCBkZWx0YSA9IGV2ZW50LmRhdGEuZGVsdGE7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZWx0YS5zdGVwX2RldGFpbHMgJiZcbiAgICAgICAgICBkZWx0YS5zdGVwX2RldGFpbHMudHlwZSA9PSAndG9vbF9jYWxscycgJiZcbiAgICAgICAgICBkZWx0YS5zdGVwX2RldGFpbHMudG9vbF9jYWxscyAmJlxuICAgICAgICAgIGFjY3VtdWxhdGVkUnVuU3RlcC5zdGVwX2RldGFpbHMudHlwZSA9PSAndG9vbF9jYWxscydcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9yIChjb25zdCB0b29sQ2FsbCBvZiBkZWx0YS5zdGVwX2RldGFpbHMudG9vbF9jYWxscykge1xuICAgICAgICAgICAgaWYgKHRvb2xDYWxsLmluZGV4ID09IHRoaXMuI2N1cnJlbnRUb29sQ2FsbEluZGV4KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2VtaXQoXG4gICAgICAgICAgICAgICAgJ3Rvb2xDYWxsRGVsdGEnLFxuICAgICAgICAgICAgICAgIHRvb2xDYWxsLFxuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkUnVuU3RlcC5zdGVwX2RldGFpbHMudG9vbF9jYWxsc1t0b29sQ2FsbC5pbmRleF0gYXMgVG9vbENhbGwsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAodGhpcy4jY3VycmVudFRvb2xDYWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdCgndG9vbENhbGxEb25lJywgdGhpcy4jY3VycmVudFRvb2xDYWxsKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRUb29sQ2FsbEluZGV4ID0gdG9vbENhbGwuaW5kZXg7XG4gICAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCA9IGFjY3VtdWxhdGVkUnVuU3RlcC5zdGVwX2RldGFpbHMudG9vbF9jYWxsc1t0b29sQ2FsbC5pbmRleF07XG4gICAgICAgICAgICAgIGlmICh0aGlzLiNjdXJyZW50VG9vbENhbGwpIHRoaXMuX2VtaXQoJ3Rvb2xDYWxsQ3JlYXRlZCcsIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZW1pdCgncnVuU3RlcERlbHRhJywgZXZlbnQuZGF0YS5kZWx0YSwgYWNjdW11bGF0ZWRSdW5TdGVwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5mYWlsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNhbmNlbGxlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZXhwaXJlZCc6XG4gICAgICAgIHRoaXMuI2N1cnJlbnRSdW5TdGVwU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBldmVudC5kYXRhLnN0ZXBfZGV0YWlscztcbiAgICAgICAgaWYgKGRldGFpbHMudHlwZSA9PSAndG9vbF9jYWxscycpIHtcbiAgICAgICAgICBpZiAodGhpcy4jY3VycmVudFRvb2xDYWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0KCd0b29sQ2FsbERvbmUnLCB0aGlzLiNjdXJyZW50VG9vbENhbGwgYXMgVG9vbENhbGwpO1xuICAgICAgICAgICAgdGhpcy4jY3VycmVudFRvb2xDYWxsID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbWl0KCdydW5TdGVwRG9uZScsIGV2ZW50LmRhdGEsIGFjY3VtdWxhdGVkUnVuU3RlcCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmluX3Byb2dyZXNzJzpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgI2hhbmRsZUV2ZW50KGV2ZW50OiBBc3Npc3RhbnRTdHJlYW1FdmVudCkge1xuICAgIHRoaXMuI2V2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICB0aGlzLl9lbWl0KCdldmVudCcsIGV2ZW50KTtcbiAgfVxuXG4gICNhY2N1bXVsYXRlUnVuU3RlcChldmVudDogUnVuU3RlcFN0cmVhbUV2ZW50KTogUnVucy5SdW5TdGVwIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuY3JlYXRlZCc6XG4gICAgICAgIHRoaXMuI3J1blN0ZXBTbmFwc2hvdHNbZXZlbnQuZGF0YS5pZF0gPSBldmVudC5kYXRhO1xuICAgICAgICByZXR1cm4gZXZlbnQuZGF0YTtcblxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmRlbHRhJzpcbiAgICAgICAgbGV0IHNuYXBzaG90ID0gdGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSBhcyBSdW5zLlJ1blN0ZXA7XG4gICAgICAgIGlmICghc25hcHNob3QpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignUmVjZWl2ZWQgYSBSdW5TdGVwRGVsdGEgYmVmb3JlIGNyZWF0aW9uIG9mIGEgc25hcHNob3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhID0gZXZlbnQuZGF0YTtcblxuICAgICAgICBpZiAoZGF0YS5kZWx0YSkge1xuICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkID0gQXNzaXN0YW50U3RyZWFtLmFjY3VtdWxhdGVEZWx0YShzbmFwc2hvdCwgZGF0YS5kZWx0YSkgYXMgUnVucy5SdW5TdGVwO1xuICAgICAgICAgIHRoaXMuI3J1blN0ZXBTbmFwc2hvdHNbZXZlbnQuZGF0YS5pZF0gPSBhY2N1bXVsYXRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNydW5TdGVwU25hcHNob3RzW2V2ZW50LmRhdGEuaWRdIGFzIFJ1bnMuUnVuU3RlcDtcblxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmNvbXBsZXRlZCc6XG4gICAgICBjYXNlICd0aHJlYWQucnVuLnN0ZXAuZmFpbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uc3RlcC5jYW5jZWxsZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmV4cGlyZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5zdGVwLmluX3Byb2dyZXNzJzpcbiAgICAgICAgdGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSA9IGV2ZW50LmRhdGE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLiNydW5TdGVwU25hcHNob3RzW2V2ZW50LmRhdGEuaWRdKSByZXR1cm4gdGhpcy4jcnVuU3RlcFNuYXBzaG90c1tldmVudC5kYXRhLmlkXSBhcyBSdW5zLlJ1blN0ZXA7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBzbmFwc2hvdCBhdmFpbGFibGUnKTtcbiAgfVxuXG4gICNhY2N1bXVsYXRlTWVzc2FnZShcbiAgICBldmVudDogQXNzaXN0YW50U3RyZWFtRXZlbnQsXG4gICAgc25hcHNob3Q6IE1lc3NhZ2UgfCB1bmRlZmluZWQsXG4gICk6IFtNZXNzYWdlLCBNZXNzYWdlQ29udGVudERlbHRhW11dIHtcbiAgICBsZXQgbmV3Q29udGVudDogTWVzc2FnZUNvbnRlbnREZWx0YVtdID0gW107XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50KSB7XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5jcmVhdGVkJzpcbiAgICAgICAgLy9PbiBjcmVhdGlvbiB0aGUgc25hcHNob3QgaXMganVzdCB0aGUgaW5pdGlhbCBtZXNzYWdlXG4gICAgICAgIHJldHVybiBbZXZlbnQuZGF0YSwgbmV3Q29udGVudF07XG5cbiAgICAgIGNhc2UgJ3RocmVhZC5tZXNzYWdlLmRlbHRhJzpcbiAgICAgICAgaWYgKCFzbmFwc2hvdCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgJ1JlY2VpdmVkIGEgZGVsdGEgd2l0aCBubyBleGlzdGluZyBzbmFwc2hvdCAodGhlcmUgc2hvdWxkIGJlIG9uZSBmcm9tIG1lc3NhZ2UgY3JlYXRpb24pJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGEgPSBldmVudC5kYXRhO1xuXG4gICAgICAgIC8vSWYgdGhpcyBkZWx0YSBkb2VzIG5vdCBoYXZlIGNvbnRlbnQsIG5vdGhpbmcgdG8gcHJvY2Vzc1xuICAgICAgICBpZiAoZGF0YS5kZWx0YS5jb250ZW50KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjb250ZW50RWxlbWVudCBvZiBkYXRhLmRlbHRhLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIGlmIChjb250ZW50RWxlbWVudC5pbmRleCBpbiBzbmFwc2hvdC5jb250ZW50KSB7XG4gICAgICAgICAgICAgIGxldCBjdXJyZW50Q29udGVudCA9IHNuYXBzaG90LmNvbnRlbnRbY29udGVudEVsZW1lbnQuaW5kZXhdO1xuICAgICAgICAgICAgICBzbmFwc2hvdC5jb250ZW50W2NvbnRlbnRFbGVtZW50LmluZGV4XSA9IHRoaXMuI2FjY3VtdWxhdGVDb250ZW50KFxuICAgICAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50LFxuICAgICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50LFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc25hcHNob3QuY29udGVudFtjb250ZW50RWxlbWVudC5pbmRleF0gPSBjb250ZW50RWxlbWVudCBhc1xuICAgICAgICAgICAgICAgIHwgVGV4dENvbnRlbnRCbG9ja1xuICAgICAgICAgICAgICAgIHwgSW1hZ2VGaWxlQ29udGVudEJsb2NrO1xuICAgICAgICAgICAgICAvL1RoaXMgaXMgYSBuZXcgZWxlbWVudFxuICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2goY29udGVudEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbc25hcHNob3QsIG5ld0NvbnRlbnRdO1xuXG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5pbl9wcm9ncmVzcyc6XG4gICAgICBjYXNlICd0aHJlYWQubWVzc2FnZS5jb21wbGV0ZWQnOlxuICAgICAgY2FzZSAndGhyZWFkLm1lc3NhZ2UuaW5jb21wbGV0ZSc6XG4gICAgICAgIC8vTm8gY2hhbmdlcyBvbiBvdGhlciB0aHJlYWQgZXZlbnRzXG4gICAgICAgIGlmIChzbmFwc2hvdCkge1xuICAgICAgICAgIHJldHVybiBbc25hcHNob3QsIG5ld0NvbnRlbnRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IEVycm9yKCdSZWNlaXZlZCB0aHJlYWQgbWVzc2FnZSBldmVudCB3aXRoIG5vIGV4aXN0aW5nIHNuYXBzaG90Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoJ1RyaWVkIHRvIGFjY3VtdWxhdGUgYSBub24tbWVzc2FnZSBldmVudCcpO1xuICB9XG5cbiAgI2FjY3VtdWxhdGVDb250ZW50KFxuICAgIGNvbnRlbnRFbGVtZW50OiBNZXNzYWdlQ29udGVudERlbHRhLFxuICAgIGN1cnJlbnRDb250ZW50OiBUZXh0Q29udGVudEJsb2NrIHwgSW1hZ2VGaWxlQ29udGVudEJsb2NrIHwgdW5kZWZpbmVkLFxuICApOiBUZXh0Q29udGVudEJsb2NrIHwgSW1hZ2VGaWxlQ29udGVudEJsb2NrIHtcbiAgICByZXR1cm4gQXNzaXN0YW50U3RyZWFtLmFjY3VtdWxhdGVEZWx0YShjdXJyZW50Q29udGVudCBhcyB1bmtub3duIGFzIFJlY29yZDxhbnksIGFueT4sIGNvbnRlbnRFbGVtZW50KSBhc1xuICAgICAgfCBUZXh0Q29udGVudEJsb2NrXG4gICAgICB8IEltYWdlRmlsZUNvbnRlbnRCbG9jaztcbiAgfVxuXG4gIHN0YXRpYyBhY2N1bXVsYXRlRGVsdGEoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBkZWx0YTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVsdGFWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVsdGEpKSB7XG4gICAgICBpZiAoIWFjYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGFjY1trZXldID0gZGVsdGFWYWx1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBhY2NWYWx1ZSA9IGFjY1trZXldO1xuICAgICAgaWYgKGFjY1ZhbHVlID09PSBudWxsIHx8IGFjY1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWNjW2tleV0gPSBkZWx0YVZhbHVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgZG9uJ3QgYWNjdW11bGF0ZSB0aGVzZSBzcGVjaWFsIHByb3BlcnRpZXNcbiAgICAgIGlmIChrZXkgPT09ICdpbmRleCcgfHwga2V5ID09PSAndHlwZScpIHtcbiAgICAgICAgYWNjW2tleV0gPSBkZWx0YVZhbHVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZS1zcGVjaWZpYyBhY2N1bXVsYXRpb24gbG9naWNcbiAgICAgIGlmICh0eXBlb2YgYWNjVmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBkZWx0YVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBhY2NWYWx1ZSArPSBkZWx0YVZhbHVlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWNjVmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiBkZWx0YVZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBhY2NWYWx1ZSArPSBkZWx0YVZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChDb3JlLmlzT2JqKGFjY1ZhbHVlKSAmJiBDb3JlLmlzT2JqKGRlbHRhVmFsdWUpKSB7XG4gICAgICAgIGFjY1ZhbHVlID0gdGhpcy5hY2N1bXVsYXRlRGVsdGEoYWNjVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PiwgZGVsdGFWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhY2NWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheShkZWx0YVZhbHVlKSkge1xuICAgICAgICBpZiAoYWNjVmFsdWUuZXZlcnkoKHgpID0+IHR5cGVvZiB4ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgeCA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgYWNjVmFsdWUucHVzaCguLi5kZWx0YVZhbHVlKTsgLy8gVXNlIHNwcmVhZCBzeW50YXggZm9yIGVmZmljaWVudCBhZGRpdGlvblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgVW5oYW5kbGVkIHJlY29yZCB0eXBlOiAke2tleX0sIGRlbHRhVmFsdWU6ICR7ZGVsdGFWYWx1ZX0sIGFjY1ZhbHVlOiAke2FjY1ZhbHVlfWApO1xuICAgICAgfVxuICAgICAgYWNjW2tleV0gPSBhY2NWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9XG5cbiAgI2hhbmRsZVJ1bihldmVudDogUnVuU3RyZWFtRXZlbnQpIHtcbiAgICB0aGlzLiNjdXJyZW50UnVuU25hcHNob3QgPSBldmVudC5kYXRhO1xuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY3JlYXRlZCc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5xdWV1ZWQnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uaW5fcHJvZ3Jlc3MnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4ucmVxdWlyZXNfYWN0aW9uJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY2FuY2VsbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uZmFpbGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uY29tcGxldGVkJzpcbiAgICAgIGNhc2UgJ3RocmVhZC5ydW4uZXhwaXJlZCc6XG4gICAgICAgIHRoaXMuI2ZpbmFsUnVuID0gZXZlbnQuZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuI2N1cnJlbnRUb29sQ2FsbCkge1xuICAgICAgICAgIHRoaXMuX2VtaXQoJ3Rvb2xDYWxsRG9uZScsIHRoaXMuI2N1cnJlbnRUb29sQ2FsbCk7XG4gICAgICAgICAgdGhpcy4jY3VycmVudFRvb2xDYWxsID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGhyZWFkLnJ1bi5jYW5jZWxsaW5nJzpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0ICogYXMgTWVzc2FnZXNBUEkgZnJvbSBcIi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIEFzc2lzdGFudHNBUEkgZnJvbSBcIi4uL2Fzc2lzdGFudHNcIjtcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9wYWdpbmF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1lc3NhZ2UuXG4gICAqL1xuICBjcmVhdGUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBNZXNzYWdlQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8TWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3RocmVhZHMvJHt0aHJlYWRJZH0vbWVzc2FnZXNgLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgYSBtZXNzYWdlLlxuICAgKi9cbiAgcmV0cmlldmUodGhyZWFkSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3RocmVhZHMvJHt0aHJlYWRJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTW9kaWZpZXMgYSBtZXNzYWdlLlxuICAgKi9cbiAgdXBkYXRlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgYm9keTogTWVzc2FnZVVwZGF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWAsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBtZXNzYWdlcyBmb3IgYSBnaXZlbiB0aHJlYWQuXG4gICAqL1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBNZXNzYWdlTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxNZXNzYWdlc1BhZ2UsIE1lc3NhZ2U+O1xuICBsaXN0KHRocmVhZElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxNZXNzYWdlc1BhZ2UsIE1lc3NhZ2U+O1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcXVlcnk6IE1lc3NhZ2VMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPE1lc3NhZ2VzUGFnZSwgTWVzc2FnZT4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh0aHJlYWRJZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9tZXNzYWdlc2AsIE1lc3NhZ2VzUGFnZSwge1xuICAgICAgcXVlcnksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgbWVzc2FnZS5cbiAgICovXG4gIGRlbCh0aHJlYWRJZDogc3RyaW5nLCBtZXNzYWdlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8TWVzc2FnZURlbGV0ZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmRlbGV0ZShgL3RocmVhZHMvJHt0aHJlYWRJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8TWVzc2FnZT4ge31cblxuLyoqXG4gKiBBIGNpdGF0aW9uIHdpdGhpbiB0aGUgbWVzc2FnZSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIHF1b3RlIGZyb20gYSBzcGVjaWZpY1xuICogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudCBvciB0aGUgbWVzc2FnZS4gR2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudFxuICogdXNlcyB0aGUgXCJmaWxlX3NlYXJjaFwiIHRvb2wgdG8gc2VhcmNoIGZpbGVzLlxuICovXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uID0gRmlsZUNpdGF0aW9uQW5ub3RhdGlvbiB8IEZpbGVQYXRoQW5ub3RhdGlvbjtcblxuLyoqXG4gKiBBIGNpdGF0aW9uIHdpdGhpbiB0aGUgbWVzc2FnZSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIHF1b3RlIGZyb20gYSBzcGVjaWZpY1xuICogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudCBvciB0aGUgbWVzc2FnZS4gR2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudFxuICogdXNlcyB0aGUgXCJmaWxlX3NlYXJjaFwiIHRvb2wgdG8gc2VhcmNoIGZpbGVzLlxuICovXG5leHBvcnQgdHlwZSBBbm5vdGF0aW9uRGVsdGEgPSBGaWxlQ2l0YXRpb25EZWx0YUFubm90YXRpb24gfCBGaWxlUGF0aERlbHRhQW5ub3RhdGlvbjtcblxuLyoqXG4gKiBBIGNpdGF0aW9uIHdpdGhpbiB0aGUgbWVzc2FnZSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIHF1b3RlIGZyb20gYSBzcGVjaWZpY1xuICogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudCBvciB0aGUgbWVzc2FnZS4gR2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudFxuICogdXNlcyB0aGUgXCJmaWxlX3NlYXJjaFwiIHRvb2wgdG8gc2VhcmNoIGZpbGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaXRhdGlvbkFubm90YXRpb24ge1xuICBlbmRfaW5kZXg6IG51bWJlcjtcblxuICBmaWxlX2NpdGF0aW9uOiBGaWxlQ2l0YXRpb25Bbm5vdGF0aW9uLkZpbGVDaXRhdGlvbjtcblxuICBzdGFydF9pbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBpbiB0aGUgbWVzc2FnZSBjb250ZW50IHRoYXQgbmVlZHMgdG8gYmUgcmVwbGFjZWQuXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgZmlsZV9jaXRhdGlvbmAuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9jaXRhdGlvbic7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZUNpdGF0aW9uQW5ub3RhdGlvbiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgRmlsZUNpdGF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHNwZWNpZmljIEZpbGUgdGhlIGNpdGF0aW9uIGlzIGZyb20uXG4gICAgICovXG4gICAgZmlsZV9pZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIHF1b3RlIGluIHRoZSBmaWxlLlxuICAgICAqL1xuICAgIHF1b3RlOiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNpdGF0aW9uIHdpdGhpbiB0aGUgbWVzc2FnZSB0aGF0IHBvaW50cyB0byBhIHNwZWNpZmljIHF1b3RlIGZyb20gYSBzcGVjaWZpY1xuICogRmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudCBvciB0aGUgbWVzc2FnZS4gR2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudFxuICogdXNlcyB0aGUgXCJmaWxlX3NlYXJjaFwiIHRvb2wgdG8gc2VhcmNoIGZpbGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIGFubm90YXRpb24gaW4gdGhlIHRleHQgY29udGVudCBwYXJ0LlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogQWx3YXlzIGBmaWxlX2NpdGF0aW9uYC5cbiAgICovXG4gIHR5cGU6ICdmaWxlX2NpdGF0aW9uJztcblxuICBlbmRfaW5kZXg/OiBudW1iZXI7XG5cbiAgZmlsZV9jaXRhdGlvbj86IEZpbGVDaXRhdGlvbkRlbHRhQW5ub3RhdGlvbi5GaWxlQ2l0YXRpb247XG5cbiAgc3RhcnRfaW5kZXg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGluIHRoZSBtZXNzYWdlIGNvbnRlbnQgdGhhdCBuZWVkcyB0byBiZSByZXBsYWNlZC5cbiAgICovXG4gIHRleHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uIHtcbiAgZXhwb3J0IGludGVyZmFjZSBGaWxlQ2l0YXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc3BlY2lmaWMgRmlsZSB0aGUgY2l0YXRpb24gaXMgZnJvbS5cbiAgICAgKi9cbiAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIHF1b3RlIGluIHRoZSBmaWxlLlxuICAgICAqL1xuICAgIHF1b3RlPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogQSBVUkwgZm9yIHRoZSBmaWxlIHRoYXQncyBnZW5lcmF0ZWQgd2hlbiB0aGUgYXNzaXN0YW50IHVzZWQgdGhlXG4gKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCB0byBnZW5lcmF0ZSBhIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVBhdGhBbm5vdGF0aW9uIHtcbiAgZW5kX2luZGV4OiBudW1iZXI7XG5cbiAgZmlsZV9wYXRoOiBGaWxlUGF0aEFubm90YXRpb24uRmlsZVBhdGg7XG5cbiAgc3RhcnRfaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgaW4gdGhlIG1lc3NhZ2UgY29udGVudCB0aGF0IG5lZWRzIHRvIGJlIHJlcGxhY2VkLlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGZpbGVfcGF0aGAuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9wYXRoJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWxlUGF0aEFubm90YXRpb24ge1xuICBleHBvcnQgaW50ZXJmYWNlIEZpbGVQYXRoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdGhhdCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqL1xuICAgIGZpbGVfaWQ6IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIEEgVVJMIGZvciB0aGUgZmlsZSB0aGF0J3MgZ2VuZXJhdGVkIHdoZW4gdGhlIGFzc2lzdGFudCB1c2VkIHRoZVxuICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgdG8gZ2VuZXJhdGUgYSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgYW5ub3RhdGlvbiBpbiB0aGUgdGV4dCBjb250ZW50IHBhcnQuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGZpbGVfcGF0aGAuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9wYXRoJztcblxuICBlbmRfaW5kZXg/OiBudW1iZXI7XG5cbiAgZmlsZV9wYXRoPzogRmlsZVBhdGhEZWx0YUFubm90YXRpb24uRmlsZVBhdGg7XG5cbiAgc3RhcnRfaW5kZXg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IGluIHRoZSBtZXNzYWdlIGNvbnRlbnQgdGhhdCBuZWVkcyB0byBiZSByZXBsYWNlZC5cbiAgICovXG4gIHRleHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZVBhdGhEZWx0YUFubm90YXRpb24ge1xuICBleHBvcnQgaW50ZXJmYWNlIEZpbGVQYXRoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdGhhdCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqL1xuICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUZpbGUge1xuICAvKipcbiAgICogVGhlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRCBvZiB0aGUgaW1hZ2VcbiAgICogaW4gdGhlIG1lc3NhZ2UgY29udGVudC5cbiAgICovXG4gIGZpbGVfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKVxuICogaW4gdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlRmlsZUNvbnRlbnRCbG9jayB7XG4gIGltYWdlX2ZpbGU6IEltYWdlRmlsZTtcblxuICAvKipcbiAgICogQWx3YXlzIGBpbWFnZV9maWxlYC5cbiAgICovXG4gIHR5cGU6ICdpbWFnZV9maWxlJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUZpbGVEZWx0YSB7XG4gIC8qKlxuICAgKiBUaGUgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEIG9mIHRoZSBpbWFnZVxuICAgKiBpbiB0aGUgbWVzc2FnZSBjb250ZW50LlxuICAgKi9cbiAgZmlsZV9pZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2VzIGFuIGltYWdlIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKVxuICogaW4gdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlRmlsZURlbHRhQmxvY2sge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBjb250ZW50IHBhcnQgaW4gdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGltYWdlX2ZpbGVgLlxuICAgKi9cbiAgdHlwZTogJ2ltYWdlX2ZpbGUnO1xuXG4gIGltYWdlX2ZpbGU/OiBJbWFnZUZpbGVEZWx0YTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSB3aXRoaW4gYVxuICogW3RocmVhZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS90aHJlYWRzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgYXBwbGljYWJsZSwgdGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRoYXRcbiAgICogYXV0aG9yZWQgdGhpcyBtZXNzYWdlLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSB3ZXJlIGFkZGVkIHRvLlxuICAgKi9cbiAgYXR0YWNobWVudHM6IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBtZXNzYWdlIHdhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBjb21wbGV0ZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGluIGFycmF5IG9mIHRleHQgYW5kL29yIGltYWdlcy5cbiAgICovXG4gIGNvbnRlbnQ6IEFycmF5PE1lc3NhZ2VDb250ZW50PjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgbWVzc2FnZSB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgbWVzc2FnZSB3YXMgbWFya2VkIGFzIGluY29tcGxldGUuXG4gICAqL1xuICBpbmNvbXBsZXRlX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPbiBhbiBpbmNvbXBsZXRlIG1lc3NhZ2UsIGRldGFpbHMgYWJvdXQgd2h5IHRoZSBtZXNzYWdlIGlzIGluY29tcGxldGUuXG4gICAqL1xuICBpbmNvbXBsZXRlX2RldGFpbHM6IE1lc3NhZ2UuSW5jb21wbGV0ZURldGFpbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YTogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB0aHJlYWQubWVzc2FnZWAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQubWVzc2FnZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgdGhhdCBwcm9kdWNlZCB0aGUgbWVzc2FnZS4gT25lIG9mIGB1c2VyYCBvciBgYXNzaXN0YW50YC5cbiAgICovXG4gIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtydW5dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucylcbiAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjcmVhdGlvbiBvZiB0aGlzIG1lc3NhZ2UuIFZhbHVlIGlzIGBudWxsYCB3aGVuIG1lc3NhZ2VzIGFyZVxuICAgKiBjcmVhdGVkIG1hbnVhbGx5IHVzaW5nIHRoZSBjcmVhdGUgbWVzc2FnZSBvciBjcmVhdGUgdGhyZWFkIGVuZHBvaW50cy5cbiAgICovXG4gIHJ1bl9pZDogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgbWVzc2FnZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBgaW5fcHJvZ3Jlc3NgLCBgaW5jb21wbGV0ZWAsIG9yXG4gICAqIGBjb21wbGV0ZWRgLlxuICAgKi9cbiAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnIHwgJ2luY29tcGxldGUnIHwgJ2NvbXBsZXRlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSBbdGhyZWFkXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3RocmVhZHMpIElEIHRoYXRcbiAgICogdGhpcyBtZXNzYWdlIGJlbG9uZ3MgdG8uXG4gICAqL1xuICB0aHJlYWRfaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNZXNzYWdlIHtcbiAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgKi9cbiAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIGFuIGluY29tcGxldGUgbWVzc2FnZSwgZGV0YWlscyBhYm91dCB3aHkgdGhlIG1lc3NhZ2UgaXMgaW5jb21wbGV0ZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgSW5jb21wbGV0ZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gdGhlIG1lc3NhZ2UgaXMgaW5jb21wbGV0ZS5cbiAgICAgKi9cbiAgICByZWFzb246ICdjb250ZW50X2ZpbHRlcicgfCAnbWF4X3Rva2VucycgfCAncnVuX2NhbmNlbGxlZCcgfCAncnVuX2V4cGlyZWQnIHwgJ3J1bl9mYWlsZWQnO1xuICB9XG59XG5cbi8qKlxuICogUmVmZXJlbmNlcyBhbiBpbWFnZSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcylcbiAqIGluIHRoZSBjb250ZW50IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZUNvbnRlbnQgPSBJbWFnZUZpbGVDb250ZW50QmxvY2sgfCBUZXh0Q29udGVudEJsb2NrO1xuXG4vKipcbiAqIFJlZmVyZW5jZXMgYW4gaW1hZ2UgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpXG4gKiBpbiB0aGUgY29udGVudCBvZiBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VDb250ZW50RGVsdGEgPSBJbWFnZUZpbGVEZWx0YUJsb2NrIHwgVGV4dERlbHRhQmxvY2s7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZURlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiAndGhyZWFkLm1lc3NhZ2UuZGVsZXRlZCc7XG59XG5cbi8qKlxuICogVGhlIGRlbHRhIGNvbnRhaW5pbmcgdGhlIGZpZWxkcyB0aGF0IGhhdmUgY2hhbmdlZCBvbiB0aGUgTWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlRGVsdGEge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgaW4gYXJyYXkgb2YgdGV4dCBhbmQvb3IgaW1hZ2VzLlxuICAgKi9cbiAgY29udGVudD86IEFycmF5PE1lc3NhZ2VDb250ZW50RGVsdGE+O1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRoYXQgcHJvZHVjZWQgdGhlIG1lc3NhZ2UuIE9uZSBvZiBgdXNlcmAgb3IgYGFzc2lzdGFudGAuXG4gICAqL1xuICByb2xlPzogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgZGVsdGEgaS5lLiBhbnkgY2hhbmdlZCBmaWVsZHMgb24gYSBtZXNzYWdlIGR1cmluZ1xuICogc3RyZWFtaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VEZWx0YUV2ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBtZXNzYWdlLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlbHRhIGNvbnRhaW5pbmcgdGhlIGZpZWxkcyB0aGF0IGhhdmUgY2hhbmdlZCBvbiB0aGUgTWVzc2FnZS5cbiAgICovXG4gIGRlbHRhOiBNZXNzYWdlRGVsdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB0aHJlYWQubWVzc2FnZS5kZWx0YWAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQubWVzc2FnZS5kZWx0YSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dCB7XG4gIGFubm90YXRpb25zOiBBcnJheTxBbm5vdGF0aW9uPjtcblxuICAvKipcbiAgICogVGhlIGRhdGEgdGhhdCBtYWtlcyB1cCB0aGUgdGV4dC5cbiAgICovXG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHRleHQgY29udGVudCB0aGF0IGlzIHBhcnQgb2YgYSBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRleHRDb250ZW50QmxvY2sge1xuICB0ZXh0OiBUZXh0O1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYHRleHRgLlxuICAgKi9cbiAgdHlwZTogJ3RleHQnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRleHREZWx0YSB7XG4gIGFubm90YXRpb25zPzogQXJyYXk8QW5ub3RhdGlvbkRlbHRhPjtcblxuICAvKipcbiAgICogVGhlIGRhdGEgdGhhdCBtYWtlcyB1cCB0aGUgdGV4dC5cbiAgICovXG4gIHZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB0ZXh0IGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGEgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXh0RGVsdGFCbG9jayB7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnRlbnQgcGFydCBpbiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgdGV4dGAuXG4gICAqL1xuICB0eXBlOiAndGV4dCc7XG5cbiAgdGV4dD86IFRleHREZWx0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAqXG4gICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgKi9cbiAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICovXG4gIGF0dGFjaG1lbnRzPzogQXJyYXk8TWVzc2FnZUNyZWF0ZVBhcmFtcy5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZUNyZWF0ZVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICovXG4gICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VVcGRhdGVQYXJhbXMge1xuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgbWVzc2FnZXMgYnkgdGhlIHJ1biBJRCB0aGF0IGdlbmVyYXRlZCB0aGVtLlxuICAgKi9cbiAgcnVuX2lkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2VzIHtcbiAgZXhwb3J0IGltcG9ydCBBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBbm5vdGF0aW9uRGVsdGEgPSBNZXNzYWdlc0FQSS5Bbm5vdGF0aW9uRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNpdGF0aW9uQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVDaXRhdGlvbkFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbGVQYXRoQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVQYXRoQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaWxlUGF0aERlbHRhQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRmlsZSA9IE1lc3NhZ2VzQVBJLkltYWdlRmlsZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGVDb250ZW50QmxvY2sgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGVDb250ZW50QmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlRGVsdGEgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGVEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGVEZWx0YUJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlRGVsdGFCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlID0gTWVzc2FnZXNBUEkuTWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ29udGVudCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50O1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDb250ZW50RGVsdGEgPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudERlbHRhO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWxldGVkID0gTWVzc2FnZXNBUEkuTWVzc2FnZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZURlbHRhID0gTWVzc2FnZXNBUEkuTWVzc2FnZURlbHRhO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWx0YUV2ZW50ID0gTWVzc2FnZXNBUEkuTWVzc2FnZURlbHRhRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dCA9IE1lc3NhZ2VzQVBJLlRleHQ7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dENvbnRlbnRCbG9jayA9IE1lc3NhZ2VzQVBJLlRleHRDb250ZW50QmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dERlbHRhID0gTWVzc2FnZXNBUEkuVGV4dERlbHRhO1xuICBleHBvcnQgaW1wb3J0IFRleHREZWx0YUJsb2NrID0gTWVzc2FnZXNBUEkuVGV4dERlbHRhQmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZXNQYWdlID0gTWVzc2FnZXNBUEkuTWVzc2FnZXNQYWdlO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDcmVhdGVQYXJhbXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VVcGRhdGVQYXJhbXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlVXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VMaXN0UGFyYW1zID0gTWVzc2FnZXNBUEkuTWVzc2FnZUxpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0ICogYXMgU3RlcHNBUEkgZnJvbSBcIi4vc3RlcHNcIjtcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi8uLi9wYWdpbmF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTdGVwcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHJ1biBzdGVwLlxuICAgKi9cbiAgcmV0cmlldmUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHN0ZXBJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8UnVuU3RlcD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdGhyZWFkcy8ke3RocmVhZElkfS9ydW5zLyR7cnVuSWR9L3N0ZXBzLyR7c3RlcElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHJ1biBzdGVwcyBiZWxvbmdpbmcgdG8gYSBydW4uXG4gICAqL1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IFN0ZXBMaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFJ1blN0ZXBzUGFnZSwgUnVuU3RlcD47XG4gIGxpc3QoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFJ1blN0ZXBzUGFnZSwgUnVuU3RlcD47XG4gIGxpc3QoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBTdGVwTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5TdGVwc1BhZ2UsIFJ1blN0ZXA+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3QodGhyZWFkSWQsIHJ1bklkLCB7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnMvJHtydW5JZH0vc3RlcHNgLCBSdW5TdGVwc1BhZ2UsIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJ1blN0ZXBzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8UnVuU3RlcD4ge31cblxuLyoqXG4gKiBUZXh0IG91dHB1dCBmcm9tIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCBhcyBwYXJ0IG9mIGEgcnVuIHN0ZXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyTG9ncyB7XG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCBpbiB0aGUgb3V0cHV0cyBhcnJheS5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFsd2F5cyBgbG9nc2AuXG4gICAqL1xuICB0eXBlOiAnbG9ncyc7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG91dHB1dCBmcm9tIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbC5cbiAgICovXG4gIGxvZ3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2Uge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBvdXRwdXQgaW4gdGhlIG91dHB1dHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYGltYWdlYC5cbiAgICovXG4gIHR5cGU6ICdpbWFnZSc7XG5cbiAgaW1hZ2U/OiBDb2RlSW50ZXJwcmV0ZXJPdXRwdXRJbWFnZS5JbWFnZTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb2RlSW50ZXJwcmV0ZXJPdXRwdXRJbWFnZSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSUQgb2YgdGhlXG4gICAgICogaW1hZ2UuXG4gICAgICovXG4gICAgZmlsZV9pZD86IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIHRoZSBydW4gc3RlcCB3YXMgaW52b2x2ZWQgaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgZGVmaW5pdGlvbi5cbiAgICovXG4gIGNvZGVfaW50ZXJwcmV0ZXI6IENvZGVJbnRlcnByZXRlclRvb2xDYWxsLkNvZGVJbnRlcnByZXRlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdG9vbCBjYWxsLiBUaGlzIGlzIGFsd2F5cyBnb2luZyB0byBiZSBgY29kZV9pbnRlcnByZXRlcmAgZm9yIHRoaXNcbiAgICogdHlwZSBvZiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnY29kZV9pbnRlcnByZXRlcic7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29kZUludGVycHJldGVyVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIGRlZmluaXRpb24uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGlucHV0IHRvIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbC5cbiAgICAgKi9cbiAgICBpbnB1dDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dHMgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwuIENvZGUgSW50ZXJwcmV0ZXIgY2FuIG91dHB1dCBvbmVcbiAgICAgKiBvciBtb3JlIGl0ZW1zLCBpbmNsdWRpbmcgdGV4dCAoYGxvZ3NgKSBvciBpbWFnZXMgKGBpbWFnZWApLiBFYWNoIG9mIHRoZXNlIGFyZVxuICAgICAqIHJlcHJlc2VudGVkIGJ5IGEgZGlmZmVyZW50IG9iamVjdCB0eXBlLlxuICAgICAqL1xuICAgIG91dHB1dHM6IEFycmF5PENvZGVJbnRlcnByZXRlci5Mb2dzIHwgQ29kZUludGVycHJldGVyLkltYWdlPjtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAvKipcbiAgICAgKiBUZXh0IG91dHB1dCBmcm9tIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCBhcyBwYXJ0IG9mIGEgcnVuIHN0ZXAuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBMb2dzIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRleHQgb3V0cHV0IGZyb20gdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsLlxuICAgICAgICovXG4gICAgICBsb2dzOiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogQWx3YXlzIGBsb2dzYC5cbiAgICAgICAqL1xuICAgICAgdHlwZTogJ2xvZ3MnO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSW1hZ2Uge1xuICAgICAgaW1hZ2U6IEltYWdlLkltYWdlO1xuXG4gICAgICAvKipcbiAgICAgICAqIEFsd2F5cyBgaW1hZ2VgLlxuICAgICAgICovXG4gICAgICB0eXBlOiAnaW1hZ2UnO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgSW1hZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBJbWFnZSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEIG9mIHRoZVxuICAgICAgICAgKiBpbWFnZS5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWQ6IHN0cmluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIHRvb2wgY2FsbHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBjb2RlX2ludGVycHJldGVyYCBmb3IgdGhpc1xuICAgKiB0eXBlIG9mIHRvb2wgY2FsbC5cbiAgICovXG4gIHR5cGU6ICdjb2RlX2ludGVycHJldGVyJztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwuXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsIGRlZmluaXRpb24uXG4gICAqL1xuICBjb2RlX2ludGVycHJldGVyPzogQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YS5Db2RlSW50ZXJwcmV0ZXI7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YSB7XG4gIC8qKlxuICAgKiBUaGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwgZGVmaW5pdGlvbi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5wdXQgdG8gdGhlIENvZGUgSW50ZXJwcmV0ZXIgdG9vbCBjYWxsLlxuICAgICAqL1xuICAgIGlucHV0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dHMgZnJvbSB0aGUgQ29kZSBJbnRlcnByZXRlciB0b29sIGNhbGwuIENvZGUgSW50ZXJwcmV0ZXIgY2FuIG91dHB1dCBvbmVcbiAgICAgKiBvciBtb3JlIGl0ZW1zLCBpbmNsdWRpbmcgdGV4dCAoYGxvZ3NgKSBvciBpbWFnZXMgKGBpbWFnZWApLiBFYWNoIG9mIHRoZXNlIGFyZVxuICAgICAqIHJlcHJlc2VudGVkIGJ5IGEgZGlmZmVyZW50IG9iamVjdCB0eXBlLlxuICAgICAqL1xuICAgIG91dHB1dHM/OiBBcnJheTxTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJMb2dzIHwgU3RlcHNBUEkuQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2U+O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaFRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIG9iamVjdC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZvciBub3csIHRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGFuIGVtcHR5IG9iamVjdC5cbiAgICovXG4gIGZpbGVfc2VhcmNoOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBmaWxlX3NlYXJjaGAgZm9yIHRoaXMgdHlwZSBvZlxuICAgKiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnZmlsZV9zZWFyY2gnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2hUb29sQ2FsbERlbHRhIHtcbiAgLyoqXG4gICAqIEZvciBub3csIHRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGFuIGVtcHR5IG9iamVjdC5cbiAgICovXG4gIGZpbGVfc2VhcmNoOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIHRvb2wgY2FsbCBpbiB0aGUgdG9vbCBjYWxscyBhcnJheS5cbiAgICovXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRvb2wgY2FsbC4gVGhpcyBpcyBhbHdheXMgZ29pbmcgdG8gYmUgYGZpbGVfc2VhcmNoYCBmb3IgdGhpcyB0eXBlIG9mXG4gICAqIHRvb2wgY2FsbC5cbiAgICovXG4gIHR5cGU6ICdmaWxlX3NlYXJjaCc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIG9iamVjdC5cbiAgICovXG4gIGlkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwgb2JqZWN0LlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIGZ1bmN0aW9uOiBGdW5jdGlvblRvb2xDYWxsLkZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBmdW5jdGlvbmAgZm9yIHRoaXMgdHlwZSBvZlxuICAgKiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZ1bmN0aW9uVG9vbENhbGwge1xuICAvKipcbiAgICogVGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBhcmd1bWVudHM6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbi4gVGhpcyB3aWxsIGJlIGBudWxsYCBpZiB0aGUgb3V0cHV0cyBoYXZlIG5vdCBiZWVuXG4gICAgICogW3N1Ym1pdHRlZF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zL3N1Ym1pdFRvb2xPdXRwdXRzKVxuICAgICAqIHlldC5cbiAgICAgKi9cbiAgICBvdXRwdXQ6IHN0cmluZyB8IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblRvb2xDYWxsRGVsdGEge1xuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIHRvb2wgY2FsbHMgYXJyYXkuXG4gICAqL1xuICBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwuIFRoaXMgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIGBmdW5jdGlvbmAgZm9yIHRoaXMgdHlwZSBvZlxuICAgKiB0b29sIGNhbGwuXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHRvb2wgY2FsbCBvYmplY3QuXG4gICAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9uIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIGZ1bmN0aW9uPzogRnVuY3Rpb25Ub29sQ2FsbERlbHRhLkZ1bmN0aW9uO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZ1bmN0aW9uVG9vbENhbGxEZWx0YSB7XG4gIC8qKlxuICAgKiBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgZnVuY3Rpb24gdGhhdCB3YXMgY2FsbGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGFyZ3VtZW50cz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBvZiB0aGUgZnVuY3Rpb24uIFRoaXMgd2lsbCBiZSBgbnVsbGAgaWYgdGhlIG91dHB1dHMgaGF2ZSBub3QgYmVlblxuICAgICAqIFtzdWJtaXR0ZWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvcnVucy9zdWJtaXRUb29sT3V0cHV0cylcbiAgICAgKiB5ZXQuXG4gICAgICovXG4gICAgb3V0cHV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlIG1lc3NhZ2UgY3JlYXRpb24gYnkgdGhlIHJ1biBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzIHtcbiAgbWVzc2FnZV9jcmVhdGlvbjogTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHMuTWVzc2FnZUNyZWF0aW9uO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYG1lc3NhZ2VfY3JlYXRpb25gLlxuICAgKi9cbiAgdHlwZTogJ21lc3NhZ2VfY3JlYXRpb24nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlQ3JlYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoaXMgcnVuIHN0ZXAuXG4gICAgICovXG4gICAgbWVzc2FnZV9pZDogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN0ZXAgaW4gZXhlY3V0aW9uIG9mIGEgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0ZXAge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJ1biBzdGVwLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVuIHN0ZXAuXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgd2FzIGNhbmNlbGxlZC5cbiAgICovXG4gIGNhbmNlbGxlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgY29tcGxldGVkLlxuICAgKi9cbiAgY29tcGxldGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBydW4gc3RlcCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgZXhwaXJlZC4gQSBzdGVwIGlzXG4gICAqIGNvbnNpZGVyZWQgZXhwaXJlZCBpZiB0aGUgcGFyZW50IHJ1biBpcyBleHBpcmVkLlxuICAgKi9cbiAgZXhwaXJlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHN0ZXAgZmFpbGVkLlxuICAgKi9cbiAgZmFpbGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW4gc3RlcC4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAqIGVycm9ycy5cbiAgICovXG4gIGxhc3RfZXJyb3I6IFJ1blN0ZXAuTGFzdEVycm9yIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE6IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdGhyZWFkLnJ1bi5zdGVwYC5cbiAgICovXG4gIG9iamVjdDogJ3RocmVhZC5ydW4uc3RlcCc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW3J1bl0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9ydW5zKSB0aGF0XG4gICAqIHRoaXMgcnVuIHN0ZXAgaXMgYSBwYXJ0IG9mLlxuICAgKi9cbiAgcnVuX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHJ1biBzdGVwLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBpbl9wcm9ncmVzc2AsIGBjYW5jZWxsZWRgLFxuICAgKiBgZmFpbGVkYCwgYGNvbXBsZXRlZGAsIG9yIGBleHBpcmVkYC5cbiAgICovXG4gIHN0YXR1czogJ2luX3Byb2dyZXNzJyB8ICdjYW5jZWxsZWQnIHwgJ2ZhaWxlZCcgfCAnY29tcGxldGVkJyB8ICdleHBpcmVkJztcblxuICAvKipcbiAgICogVGhlIGRldGFpbHMgb2YgdGhlIHJ1biBzdGVwLlxuICAgKi9cbiAgc3RlcF9kZXRhaWxzOiBNZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscyB8IFRvb2xDYWxsc1N0ZXBEZXRhaWxzO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcylcbiAgICogdGhhdCB3YXMgcnVuLlxuICAgKi9cbiAgdGhyZWFkX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHJ1biBzdGVwLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBtZXNzYWdlX2NyZWF0aW9uYCBvciBgdG9vbF9jYWxsc2AuXG4gICAqL1xuICB0eXBlOiAnbWVzc2FnZV9jcmVhdGlvbicgfCAndG9vbF9jYWxscyc7XG5cbiAgLyoqXG4gICAqIFVzYWdlIHN0YXRpc3RpY3MgcmVsYXRlZCB0byB0aGUgcnVuIHN0ZXAuIFRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAgd2hpbGUgdGhlXG4gICAqIHJ1biBzdGVwJ3Mgc3RhdHVzIGlzIGBpbl9wcm9ncmVzc2AuXG4gICAqL1xuICB1c2FnZTogUnVuU3RlcC5Vc2FnZSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3RlcCB7XG4gIC8qKlxuICAgKiBUaGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW4gc3RlcC4gV2lsbCBiZSBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAqIGVycm9ycy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgTGFzdEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBPbmUgb2YgYHNlcnZlcl9lcnJvcmAgb3IgYHJhdGVfbGltaXRfZXhjZWVkZWRgLlxuICAgICAqL1xuICAgIGNvZGU6ICdzZXJ2ZXJfZXJyb3InIHwgJ3JhdGVfbGltaXRfZXhjZWVkZWQnO1xuXG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICovXG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzYWdlIHN0YXRpc3RpY3MgcmVsYXRlZCB0byB0aGUgcnVuIHN0ZXAuIFRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAgd2hpbGUgdGhlXG4gICAqIHJ1biBzdGVwJ3Mgc3RhdHVzIGlzIGBpbl9wcm9ncmVzc2AuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFVzYWdlIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIGNvbXBsZXRpb25fdG9rZW5zOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgcHJvbXB0IHRva2VucyB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuIHN0ZXAuXG4gICAgICovXG4gICAgcHJvbXB0X3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIHRva2VucyB1c2VkIChwcm9tcHQgKyBjb21wbGV0aW9uKS5cbiAgICAgKi9cbiAgICB0b3RhbF90b2tlbnM6IG51bWJlcjtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWx0YSBjb250YWluaW5nIHRoZSBmaWVsZHMgdGhhdCBoYXZlIGNoYW5nZWQgb24gdGhlIHJ1biBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0ZXBEZWx0YSB7XG4gIC8qKlxuICAgKiBUaGUgZGV0YWlscyBvZiB0aGUgcnVuIHN0ZXAuXG4gICAqL1xuICBzdGVwX2RldGFpbHM/OiBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEgfCBUb29sQ2FsbERlbHRhT2JqZWN0O1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBydW4gc3RlcCBkZWx0YSBpLmUuIGFueSBjaGFuZ2VkIGZpZWxkcyBvbiBhIHJ1biBzdGVwIGR1cmluZ1xuICogc3RyZWFtaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0ZXBEZWx0YUV2ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBydW4gc3RlcCwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWx0YSBjb250YWluaW5nIHRoZSBmaWVsZHMgdGhhdCBoYXZlIGNoYW5nZWQgb24gdGhlIHJ1biBzdGVwLlxuICAgKi9cbiAgZGVsdGE6IFJ1blN0ZXBEZWx0YTtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHRocmVhZC5ydW4uc3RlcC5kZWx0YWAuXG4gICAqL1xuICBvYmplY3Q6ICd0aHJlYWQucnVuLnN0ZXAuZGVsdGEnO1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlIG1lc3NhZ2UgY3JlYXRpb24gYnkgdGhlIHJ1biBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN0ZXBEZWx0YU1lc3NhZ2VEZWx0YSB7XG4gIC8qKlxuICAgKiBBbHdheXMgYG1lc3NhZ2VfY3JlYXRpb25gLlxuICAgKi9cbiAgdHlwZTogJ21lc3NhZ2VfY3JlYXRpb24nO1xuXG4gIG1lc3NhZ2VfY3JlYXRpb24/OiBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEuTWVzc2FnZUNyZWF0aW9uO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1blN0ZXBEZWx0YU1lc3NhZ2VEZWx0YSB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUNyZWF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGlzIHJ1biBzdGVwLlxuICAgICAqL1xuICAgIG1lc3NhZ2VfaWQ/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLlxuICovXG5leHBvcnQgdHlwZSBUb29sQ2FsbCA9IENvZGVJbnRlcnByZXRlclRvb2xDYWxsIHwgRmlsZVNlYXJjaFRvb2xDYWxsIHwgRnVuY3Rpb25Ub29sQ2FsbDtcblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBDb2RlIEludGVycHJldGVyIHRvb2wgY2FsbCB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLlxuICovXG5leHBvcnQgdHlwZSBUb29sQ2FsbERlbHRhID0gQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YSB8IEZpbGVTZWFyY2hUb29sQ2FsbERlbHRhIHwgRnVuY3Rpb25Ub29sQ2FsbERlbHRhO1xuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlIHRvb2wgY2FsbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sQ2FsbERlbHRhT2JqZWN0IHtcbiAgLyoqXG4gICAqIEFsd2F5cyBgdG9vbF9jYWxsc2AuXG4gICAqL1xuICB0eXBlOiAndG9vbF9jYWxscyc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHRvb2wgY2FsbHMgdGhlIHJ1biBzdGVwIHdhcyBpbnZvbHZlZCBpbi4gVGhlc2UgY2FuIGJlIGFzc29jaWF0ZWRcbiAgICogd2l0aCBvbmUgb2YgdGhyZWUgdHlwZXMgb2YgdG9vbHM6IGBjb2RlX2ludGVycHJldGVyYCwgYGZpbGVfc2VhcmNoYCwgb3JcbiAgICogYGZ1bmN0aW9uYC5cbiAgICovXG4gIHRvb2xfY2FsbHM/OiBBcnJheTxUb29sQ2FsbERlbHRhPjtcbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSB0b29sIGNhbGwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbENhbGxzU3RlcERldGFpbHMge1xuICAvKipcbiAgICogQW4gYXJyYXkgb2YgdG9vbCBjYWxscyB0aGUgcnVuIHN0ZXAgd2FzIGludm9sdmVkIGluLiBUaGVzZSBjYW4gYmUgYXNzb2NpYXRlZFxuICAgKiB3aXRoIG9uZSBvZiB0aHJlZSB0eXBlcyBvZiB0b29sczogYGNvZGVfaW50ZXJwcmV0ZXJgLCBgZmlsZV9zZWFyY2hgLCBvclxuICAgKiBgZnVuY3Rpb25gLlxuICAgKi9cbiAgdG9vbF9jYWxsczogQXJyYXk8VG9vbENhbGw+O1xuXG4gIC8qKlxuICAgKiBBbHdheXMgYHRvb2xfY2FsbHNgLlxuICAgKi9cbiAgdHlwZTogJ3Rvb2xfY2FsbHMnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGN1cnNvciBmb3IgdXNlIGluIHBhZ2luYXRpb24uIGBiZWZvcmVgIGlzIGFuIG9iamVjdCBJRCB0aGF0IGRlZmluZXMgeW91ciBwbGFjZVxuICAgKiBpbiB0aGUgbGlzdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UgbWFrZSBhIGxpc3QgcmVxdWVzdCBhbmQgcmVjZWl2ZSAxMDAgb2JqZWN0cyxcbiAgICogZW5kaW5nIHdpdGggb2JqX2ZvbywgeW91ciBzdWJzZXF1ZW50IGNhbGwgY2FuIGluY2x1ZGUgYmVmb3JlPW9ial9mb28gaW4gb3JkZXIgdG9cbiAgICogZmV0Y2ggdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGxpc3QuXG4gICAqL1xuICBiZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgb2YgdGhlIG9iamVjdHMuIGBhc2NgIGZvciBhc2NlbmRpbmdcbiAgICogb3JkZXIgYW5kIGBkZXNjYCBmb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RlcHMge1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlckxvZ3MgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJMb2dzO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlck91dHB1dEltYWdlID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyVG9vbENhbGwgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbERlbHRhID0gU3RlcHNBUEkuQ29kZUludGVycHJldGVyVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBGaWxlU2VhcmNoVG9vbENhbGwgPSBTdGVwc0FQSS5GaWxlU2VhcmNoVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVNlYXJjaFRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5GaWxlU2VhcmNoVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblRvb2xDYWxsID0gU3RlcHNBUEkuRnVuY3Rpb25Ub29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5GdW5jdGlvblRvb2xDYWxsRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZUNyZWF0aW9uU3RlcERldGFpbHMgPSBTdGVwc0FQSS5NZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwID0gU3RlcHNBUEkuUnVuU3RlcDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwRGVsdGEgPSBTdGVwc0FQSS5SdW5TdGVwRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcERlbHRhRXZlbnQgPSBTdGVwc0FQSS5SdW5TdGVwRGVsdGFFdmVudDtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGEgPSBTdGVwc0FQSS5SdW5TdGVwRGVsdGFNZXNzYWdlRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgVG9vbENhbGwgPSBTdGVwc0FQSS5Ub29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbERlbHRhID0gU3RlcHNBUEkuVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbERlbHRhT2JqZWN0ID0gU3RlcHNBUEkuVG9vbENhbGxEZWx0YU9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbHNTdGVwRGV0YWlscyA9IFN0ZXBzQVBJLlRvb2xDYWxsc1N0ZXBEZXRhaWxzO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBzUGFnZSA9IFN0ZXBzQVBJLlJ1blN0ZXBzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBTdGVwTGlzdFBhcmFtcyA9IFN0ZXBzQVBJLlN0ZXBMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVByb21pc2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQXNzaXN0YW50U3RyZWFtLCBSdW5DcmVhdGVQYXJhbXNCYXNlU3RyZWFtIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xpYi9Bc3Npc3RhbnRTdHJlYW1cIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xpYi9Bc3Npc3RhbnRTdHJlYW1cIjtcbmltcG9ydCAqIGFzIFJ1bnNBUEkgZnJvbSBcIi4vcnVuc1wiO1xuaW1wb3J0ICogYXMgQXNzaXN0YW50c0FQSSBmcm9tIFwiLi4vLi4vYXNzaXN0YW50c1wiO1xuaW1wb3J0ICogYXMgVGhyZWFkc0FQSSBmcm9tIFwiLi4vdGhyZWFkc1wiO1xuaW1wb3J0ICogYXMgU3RlcHNBUEkgZnJvbSBcIi4vc3RlcHNcIjtcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi8uLi9wYWdpbmF0aW9uXCI7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tIFwiLi4vLi4vLi4vLi4vc3RyZWFtaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBSdW5zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBzdGVwczogU3RlcHNBUEkuU3RlcHMgPSBuZXcgU3RlcHNBUEkuU3RlcHModGhpcy5fY2xpZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgcnVuLlxuICAgKi9cbiAgY3JlYXRlKHRocmVhZElkOiBzdHJpbmcsIGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBBUElQcm9taXNlPFJ1bj47XG4gIGNyZWF0ZShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4+O1xuICBjcmVhdGUoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5DcmVhdGVQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50PiB8IFJ1bj47XG4gIGNyZWF0ZShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1bkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxSdW4+IHwgQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnNgLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgICBzdHJlYW06IGJvZHkuc3RyZWFtID8/IGZhbHNlLFxuICAgIH0pIGFzIEFQSVByb21pc2U8UnVuPiB8IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBydW4uXG4gICAqL1xuICByZXRyaWV2ZSh0aHJlYWRJZDogc3RyaW5nLCBydW5JZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxSdW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3RocmVhZHMvJHt0aHJlYWRJZH0vcnVucy8ke3J1bklkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIGEgcnVuLlxuICAgKi9cbiAgdXBkYXRlKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5VcGRhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxSdW4+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnMvJHtydW5JZH1gLCB7XG4gICAgICBib2R5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgcnVucyBiZWxvbmdpbmcgdG8gYSB0aHJlYWQuXG4gICAqL1xuICBsaXN0KFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBSdW5MaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFJ1bnNQYWdlLCBSdW4+O1xuICBsaXN0KHRocmVhZElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxSdW5zUGFnZSwgUnVuPjtcbiAgbGlzdChcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBSdW5MaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFJ1bnNQYWdlLCBSdW4+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3QodGhyZWFkSWQsIHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdChgL3RocmVhZHMvJHt0aHJlYWRJZH0vcnVuc2AsIFJ1bnNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgYSBydW4gdGhhdCBpcyBgaW5fcHJvZ3Jlc3NgLlxuICAgKi9cbiAgY2FuY2VsKHRocmVhZElkOiBzdHJpbmcsIHJ1bklkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFJ1bj4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdChgL3RocmVhZHMvJHt0aHJlYWRJZH0vcnVucy8ke3J1bklkfS9jYW5jZWxgLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYSBydW4gYW4gcG9sbCBmb3IgYSB0ZXJtaW5hbCBzdGF0ZS4gTW9yZSBpbmZvcm1hdGlvbiBvbiBSdW5cbiAgICogbGlmZWN5Y2xlcyBjYW4gYmUgZm91bmQgaGVyZTpcbiAgICogaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXNzaXN0YW50cy9ob3ctaXQtd29ya3MvcnVucy1hbmQtcnVuLXN0ZXBzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBbmRQb2xsKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHRoaXMuY3JlYXRlKHRocmVhZElkLCBib2R5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xsKHRocmVhZElkLCBydW4uaWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFJ1biBzdHJlYW1cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBzdHJlYW1gIGluc3RlYWRcbiAgICovXG4gIGNyZWF0ZUFuZFN0cmVhbShcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc0Jhc2VTdHJlYW0sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFzc2lzdGFudFN0cmVhbSB7XG4gICAgcmV0dXJuIEFzc2lzdGFudFN0cmVhbS5jcmVhdGVBc3Npc3RhbnRTdHJlYW0odGhyZWFkSWQsIHRoaXMuX2NsaWVudC5iZXRhLnRocmVhZHMucnVucywgYm9keSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQSBoZWxwZXIgdG8gcG9sbCBhIHJ1biBzdGF0dXMgdW50aWwgaXQgcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlLiBNb3JlXG4gICAqIGluZm9ybWF0aW9uIG9uIFJ1biBsaWZlY3ljbGVzIGNhbiBiZSBmb3VuZCBoZXJlOlxuICAgKiBodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hc3Npc3RhbnRzL2hvdy1pdC13b3Jrcy9ydW5zLWFuZC1ydW4tc3RlcHNcbiAgICovXG4gIGFzeW5jIHBvbGwoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1Qb2xsLUhlbHBlcic6ICd0cnVlJyB9O1xuXG4gICAgaWYgKG9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zKSB7XG4gICAgICBoZWFkZXJzWydYLVN0YWlubGVzcy1DdXN0b20tUG9sbC1JbnRlcnZhbCddID0gb3B0aW9ucy5wb2xsSW50ZXJ2YWxNcy50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB7IGRhdGE6IHJ1biwgcmVzcG9uc2UgfSA9IGF3YWl0IHRoaXMucmV0cmlldmUodGhyZWFkSWQsIHJ1bklkLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgLi4uaGVhZGVycyB9LFxuICAgICAgfSkud2l0aFJlc3BvbnNlKCk7XG5cbiAgICAgIHN3aXRjaCAocnVuLnN0YXR1cykge1xuICAgICAgICAvL0lmIHdlIGFyZSBpbiBhbnkgc29ydCBvZiBpbnRlcm1lZGlhdGUgc3RhdGUgd2UgcG9sbFxuICAgICAgICBjYXNlICdxdWV1ZWQnOlxuICAgICAgICBjYXNlICdpbl9wcm9ncmVzcyc6XG4gICAgICAgIGNhc2UgJ2NhbmNlbGxpbmcnOlxuICAgICAgICAgIGxldCBzbGVlcEludGVydmFsID0gNTAwMDtcblxuICAgICAgICAgIGlmIChvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcykge1xuICAgICAgICAgICAgc2xlZXBJbnRlcnZhbCA9IG9wdGlvbnMucG9sbEludGVydmFsTXM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlckludGVydmFsID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ29wZW5haS1wb2xsLWFmdGVyLW1zJyk7XG4gICAgICAgICAgICBpZiAoaGVhZGVySW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgY29uc3QgaGVhZGVySW50ZXJ2YWxNcyA9IHBhcnNlSW50KGhlYWRlckludGVydmFsKTtcbiAgICAgICAgICAgICAgaWYgKCFpc05hTihoZWFkZXJJbnRlcnZhbE1zKSkge1xuICAgICAgICAgICAgICAgIHNsZWVwSW50ZXJ2YWwgPSBoZWFkZXJJbnRlcnZhbE1zO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwSW50ZXJ2YWwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvL1dlIHJldHVybiB0aGUgcnVuIGluIGFueSB0ZXJtaW5hbCBzdGF0ZS5cbiAgICAgICAgY2FzZSAncmVxdWlyZXNfYWN0aW9uJzpcbiAgICAgICAgY2FzZSAnY2FuY2VsbGVkJzpcbiAgICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgY2FzZSAnZXhwaXJlZCc6XG4gICAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUnVuIHN0cmVhbVxuICAgKi9cbiAgc3RyZWFtKHRocmVhZElkOiBzdHJpbmcsIGJvZHk6IFJ1bkNyZWF0ZVBhcmFtc0Jhc2VTdHJlYW0sIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQXNzaXN0YW50U3RyZWFtIHtcbiAgICByZXR1cm4gQXNzaXN0YW50U3RyZWFtLmNyZWF0ZUFzc2lzdGFudFN0cmVhbSh0aHJlYWRJZCwgdGhpcy5fY2xpZW50LmJldGEudGhyZWFkcy5ydW5zLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGEgcnVuIGhhcyB0aGUgYHN0YXR1czogXCJyZXF1aXJlc19hY3Rpb25cImAgYW5kIGByZXF1aXJlZF9hY3Rpb24udHlwZWAgaXNcbiAgICogYHN1Ym1pdF90b29sX291dHB1dHNgLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHN1Ym1pdCB0aGUgb3V0cHV0cyBmcm9tIHRoZVxuICAgKiB0b29sIGNhbGxzIG9uY2UgdGhleSdyZSBhbGwgY29tcGxldGVkLiBBbGwgb3V0cHV0cyBtdXN0IGJlIHN1Ym1pdHRlZCBpbiBhIHNpbmdsZVxuICAgKiByZXF1ZXN0LlxuICAgKi9cbiAgc3VibWl0VG9vbE91dHB1dHMoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFJ1bj47XG4gIHN1Ym1pdFRvb2xPdXRwdXRzKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4+O1xuICBzdWJtaXRUb29sT3V0cHV0cyhcbiAgICB0aHJlYWRJZDogc3RyaW5nLFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgYm9keTogUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFN0cmVhbUV2ZW50PiB8IFJ1bj47XG4gIHN1Ym1pdFRvb2xPdXRwdXRzKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBib2R5OiBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxSdW4+IHwgQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC90aHJlYWRzLyR7dGhyZWFkSWR9L3J1bnMvJHtydW5JZH0vc3VibWl0X3Rvb2xfb3V0cHV0c2AsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UsXG4gICAgfSkgYXMgQVBJUHJvbWlzZTxSdW4+IHwgQVBJUHJvbWlzZTxTdHJlYW08QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudD4+O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGVscGVyIHRvIHN1Ym1pdCBhIHRvb2wgb3V0cHV0IHRvIGEgcnVuIGFuZCBwb2xsIGZvciBhIHRlcm1pbmFsIHJ1biBzdGF0ZS5cbiAgICogTW9yZSBpbmZvcm1hdGlvbiBvbiBSdW4gbGlmZWN5Y2xlcyBjYW4gYmUgZm91bmQgaGVyZTpcbiAgICogaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXNzaXN0YW50cy9ob3ctaXQtd29ya3MvcnVucy1hbmQtcnVuLXN0ZXBzXG4gICAqL1xuICBhc3luYyBzdWJtaXRUb29sT3V0cHV0c0FuZFBvbGwoXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFJ1bj4ge1xuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHRoaXMuc3VibWl0VG9vbE91dHB1dHModGhyZWFkSWQsIHJ1bklkLCBib2R5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xsKHRocmVhZElkLCBydW4uaWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCB0aGUgdG9vbCBvdXRwdXRzIGZyb20gYSBwcmV2aW91cyBydW4gYW5kIHN0cmVhbSB0aGUgcnVuIHRvIGEgdGVybWluYWxcbiAgICogc3RhdGUuIE1vcmUgaW5mb3JtYXRpb24gb24gUnVuIGxpZmVjeWNsZXMgY2FuIGJlIGZvdW5kIGhlcmU6XG4gICAqIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvaG93LWl0LXdvcmtzL3J1bnMtYW5kLXJ1bi1zdGVwc1xuICAgKi9cbiAgc3VibWl0VG9vbE91dHB1dHNTdHJlYW0oXG4gICAgdGhyZWFkSWQ6IHN0cmluZyxcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIGJvZHk6IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBc3Npc3RhbnRTdHJlYW0ge1xuICAgIHJldHVybiBBc3Npc3RhbnRTdHJlYW0uY3JlYXRlVG9vbEFzc2lzdGFudFN0cmVhbShcbiAgICAgIHRocmVhZElkLFxuICAgICAgcnVuSWQsXG4gICAgICB0aGlzLl9jbGllbnQuYmV0YS50aHJlYWRzLnJ1bnMsXG4gICAgICBib2R5LFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSdW5zUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8UnVuPiB7fVxuXG4vKipcbiAqIFRvb2wgY2FsbCBvYmplY3RzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsLiBUaGlzIElEIG11c3QgYmUgcmVmZXJlbmNlZCB3aGVuIHlvdSBzdWJtaXQgdGhlIHRvb2xcbiAgICogb3V0cHV0cyBpbiB1c2luZyB0aGVcbiAgICogW1N1Ym1pdCB0b29sIG91dHB1dHMgdG8gcnVuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3J1bnMvc3VibWl0VG9vbE91dHB1dHMpXG4gICAqIGVuZHBvaW50LlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uXG4gICAqL1xuICBmdW5jdGlvbjogUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsLkZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0b29sIGNhbGwgdGhlIG91dHB1dCBpcyByZXF1aXJlZCBmb3IuIEZvciBub3csIHRoaXMgaXMgYWx3YXlzXG4gICAqIGBmdW5jdGlvbmAuXG4gICAqL1xuICB0eXBlOiAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbCB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhcmd1bWVudHMgdGhhdCB0aGUgbW9kZWwgZXhwZWN0cyB5b3UgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgYXJndW1lbnRzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBleGVjdXRpb24gcnVuIG9uIGFcbiAqIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHVzZWQgZm9yXG4gICAqIGV4ZWN1dGlvbiBvZiB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBydW4gd2FzIGNhbmNlbGxlZC5cbiAgICovXG4gIGNhbmNlbGxlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHdhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBjb21wbGV0ZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHJ1biB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIHdpbGwgZXhwaXJlLlxuICAgKi9cbiAgZXhwaXJlc19hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgcnVuIGZhaWxlZC5cbiAgICovXG4gIGZhaWxlZF9hdDogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogRGV0YWlscyBvbiB3aHkgdGhlIHJ1biBpcyBpbmNvbXBsZXRlLiBXaWxsIGJlIGBudWxsYCBpZiB0aGUgcnVuIGlzIG5vdFxuICAgKiBpbmNvbXBsZXRlLlxuICAgKi9cbiAgaW5jb21wbGV0ZV9kZXRhaWxzOiBSdW4uSW5jb21wbGV0ZURldGFpbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5zdHJ1Y3Rpb25zIHRoYXQgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdXNlZCBmb3JcbiAgICogdGhpcyBydW4uXG4gICAqL1xuICBpbnN0cnVjdGlvbnM6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVuLiBXaWxsIGJlIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gZXJyb3JzLlxuICAgKi9cbiAgbGFzdF9lcnJvcjogUnVuLkxhc3RFcnJvciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyBzcGVjaWZpZWQgdG8gaGF2ZSBiZWVuIHVzZWQgb3ZlciB0aGVcbiAgICogY291cnNlIG9mIHRoZSBydW4uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCB0byBoYXZlIGJlZW4gdXNlZCBvdmVyIHRoZSBjb3Vyc2VcbiAgICogb2YgdGhlIHJ1bi5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zOiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YTogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0aGF0IHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHVzZWQgZm9yXG4gICAqIHRoaXMgcnVuLlxuICAgKi9cbiAgbW9kZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHRocmVhZC5ydW5gLlxuICAgKi9cbiAgb2JqZWN0OiAndGhyZWFkLnJ1bic7XG5cbiAgLyoqXG4gICAqIERldGFpbHMgb24gdGhlIGFjdGlvbiByZXF1aXJlZCB0byBjb250aW51ZSB0aGUgcnVuLiBXaWxsIGJlIGBudWxsYCBpZiBubyBhY3Rpb25cbiAgICogaXMgcmVxdWlyZWQuXG4gICAqL1xuICByZXF1aXJlZF9hY3Rpb246IFJ1bi5SZXF1aXJlZEFjdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ6IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBydW4gd2FzIHN0YXJ0ZWQuXG4gICAqL1xuICBzdGFydGVkX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBydW4sIHdoaWNoIGNhbiBiZSBlaXRoZXIgYHF1ZXVlZGAsIGBpbl9wcm9ncmVzc2AsXG4gICAqIGByZXF1aXJlc19hY3Rpb25gLCBgY2FuY2VsbGluZ2AsIGBjYW5jZWxsZWRgLCBgZmFpbGVkYCwgYGNvbXBsZXRlZGAsIG9yXG4gICAqIGBleHBpcmVkYC5cbiAgICovXG4gIHN0YXR1czogUnVuU3RhdHVzO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFt0aHJlYWRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdGhyZWFkcylcbiAgICogdGhhdCB3YXMgZXhlY3V0ZWQgb24gYXMgYSBwYXJ0IG9mIHRoaXMgcnVuLlxuICAgKi9cbiAgdGhyZWFkX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U6IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHRvb2xzIHRoYXQgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdXNlZCBmb3JcbiAgICogdGhpcyBydW4uXG4gICAqL1xuICB0b29sczogQXJyYXk8QXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRUb29sPjtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k6IFJ1bi5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBVc2FnZSBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gdGhlIHJ1bi4gVGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYCBpZiB0aGUgcnVuIGlzIG5vdFxuICAgKiBpbiBhIHRlcm1pbmFsIHN0YXRlIChpLmUuIGBpbl9wcm9ncmVzc2AsIGBxdWV1ZWRgLCBldGMuKS5cbiAgICovXG4gIHVzYWdlOiBSdW4uVXNhZ2UgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdXNlZCBmb3IgdGhpcyBydW4uIElmIG5vdCBzZXQsIGRlZmF1bHRzIHRvIDEuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBudWNsZXVzIHNhbXBsaW5nIHZhbHVlIHVzZWQgZm9yIHRoaXMgcnVuLiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byAxLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1biB7XG4gIC8qKlxuICAgKiBEZXRhaWxzIG9uIHdoeSB0aGUgcnVuIGlzIGluY29tcGxldGUuIFdpbGwgYmUgYG51bGxgIGlmIHRoZSBydW4gaXMgbm90XG4gICAqIGluY29tcGxldGUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEluY29tcGxldGVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHdoeSB0aGUgcnVuIGlzIGluY29tcGxldGUuIFRoaXMgd2lsbCBwb2ludCB0byB3aGljaCBzcGVjaWZpYyB0b2tlblxuICAgICAqIGxpbWl0IHdhcyByZWFjaGVkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgICAqL1xuICAgIHJlYXNvbj86ICdtYXhfY29tcGxldGlvbl90b2tlbnMnIHwgJ21heF9wcm9tcHRfdG9rZW5zJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBydW4uIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlIGFyZSBubyBlcnJvcnMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIExhc3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogT25lIG9mIGBzZXJ2ZXJfZXJyb3JgLCBgcmF0ZV9saW1pdF9leGNlZWRlZGAsIG9yIGBpbnZhbGlkX3Byb21wdGAuXG4gICAgICovXG4gICAgY29kZTogJ3NlcnZlcl9lcnJvcicgfCAncmF0ZV9saW1pdF9leGNlZWRlZCcgfCAnaW52YWxpZF9wcm9tcHQnO1xuXG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuXG4gICAgICovXG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGFpbHMgb24gdGhlIGFjdGlvbiByZXF1aXJlZCB0byBjb250aW51ZSB0aGUgcnVuLiBXaWxsIGJlIGBudWxsYCBpZiBubyBhY3Rpb25cbiAgICogaXMgcmVxdWlyZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVkQWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9uIHRoZSB0b29sIG91dHB1dHMgbmVlZGVkIGZvciB0aGlzIHJ1biB0byBjb250aW51ZS5cbiAgICAgKi9cbiAgICBzdWJtaXRfdG9vbF9vdXRwdXRzOiBSZXF1aXJlZEFjdGlvbi5TdWJtaXRUb29sT3V0cHV0cztcblxuICAgIC8qKlxuICAgICAqIEZvciBub3csIHRoaXMgaXMgYWx3YXlzIGBzdWJtaXRfdG9vbF9vdXRwdXRzYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnc3VibWl0X3Rvb2xfb3V0cHV0cyc7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFJlcXVpcmVkQWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9uIHRoZSB0b29sIG91dHB1dHMgbmVlZGVkIGZvciB0aGlzIHJ1biB0byBjb250aW51ZS5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIFN1Ym1pdFRvb2xPdXRwdXRzIHtcbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIHRoZSByZWxldmFudCB0b29sIGNhbGxzLlxuICAgICAgICovXG4gICAgICB0b29sX2NhbGxzOiBBcnJheTxSdW5zQVBJLlJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVXNhZ2Ugc3RhdGlzdGljcyByZWxhdGVkIHRvIHRoZSBydW4uIFRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAgaWYgdGhlIHJ1biBpcyBub3RcbiAgICogaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoaS5lLiBgaW5fcHJvZ3Jlc3NgLCBgcXVldWVkYCwgZXRjLikuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFVzYWdlIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBjb21wbGV0aW9uX3Rva2VuczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBwcm9tcHRfdG9rZW5zOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgdG9rZW5zIHVzZWQgKHByb21wdCArIGNvbXBsZXRpb24pLlxuICAgICAqL1xuICAgIHRvdGFsX3Rva2VuczogbnVtYmVyO1xuICB9XG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcnVuLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBxdWV1ZWRgLCBgaW5fcHJvZ3Jlc3NgLFxuICogYHJlcXVpcmVzX2FjdGlvbmAsIGBjYW5jZWxsaW5nYCwgYGNhbmNlbGxlZGAsIGBmYWlsZWRgLCBgY29tcGxldGVkYCwgb3JcbiAqIGBleHBpcmVkYC5cbiAqL1xuZXhwb3J0IHR5cGUgUnVuU3RhdHVzID1cbiAgfCAncXVldWVkJ1xuICB8ICdpbl9wcm9ncmVzcydcbiAgfCAncmVxdWlyZXNfYWN0aW9uJ1xuICB8ICdjYW5jZWxsaW5nJ1xuICB8ICdjYW5jZWxsZWQnXG4gIHwgJ2ZhaWxlZCdcbiAgfCAnY29tcGxldGVkJ1xuICB8ICdleHBpcmVkJztcblxuZXhwb3J0IHR5cGUgUnVuQ3JlYXRlUGFyYW1zID0gUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nIHwgUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgcnVuLiBUaGlzXG4gICAqIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMgd2l0aG91dCBvdmVycmlkaW5nIG90aGVyXG4gICAqIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGFkZGl0aW9uYWxfaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQWRkcyBhZGRpdGlvbmFsIG1lc3NhZ2VzIHRvIHRoZSB0aHJlYWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBydW4uXG4gICAqL1xuICBhZGRpdGlvbmFsX21lc3NhZ2VzPzogQXJyYXk8UnVuQ3JlYXRlUGFyYW1zLkFkZGl0aW9uYWxNZXNzYWdlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGVcbiAgICogW2luc3RydWN0aW9uc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzL2NyZWF0ZUFzc2lzdGFudClcbiAgICogb2YgdGhlIGFzc2lzdGFudC4gVGhpcyBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZVxuICAgKiBydW4uIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBjb21wbGV0aW9uIHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9jb21wbGV0aW9uX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zIHRoYXQgbWF5IGJlIHVzZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBydW4uXG4gICAqIFRoZSBydW4gd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gdXNlIG9ubHkgdGhlIG51bWJlciBvZiBwcm9tcHQgdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIHByb21wdCB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfcHJvbXB0X3Rva2Vucz86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgW01vZGVsXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscykgdG9cbiAgICogYmUgdXNlZCB0byBleGVjdXRlIHRoaXMgcnVuLiBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkIGhlcmUsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlXG4gICAqIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaXN0YW50LiBJZiBub3QsIHRoZSBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAqIGFzc2lzdGFudCB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBtb2RlbD86XG4gICAgfCAoc3RyaW5nICYge30pXG4gICAgfCAnZ3B0LTQtdHVyYm8nXG4gICAgfCAnZ3B0LTQtdHVyYm8tMjAyNC0wNC0wOSdcbiAgICB8ICdncHQtNC0wMTI1LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdHVyYm8tcHJldmlldydcbiAgICB8ICdncHQtNC0xMTA2LXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtdmlzaW9uLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQnXG4gICAgfCAnZ3B0LTQtMDMxNCdcbiAgICB8ICdncHQtNC0wNjEzJ1xuICAgIHwgJ2dwdC00LTMyaydcbiAgICB8ICdncHQtNC0zMmstMDMxNCdcbiAgICB8ICdncHQtNC0zMmstMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDYxMydcbiAgICB8ICdncHQtMy41LXR1cmJvLTExMDYnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wMTI1J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTZrLTA2MTMnXG4gICAgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdCB0aGF0IHRoZSBtb2RlbCBtdXN0IG91dHB1dC4gQ29tcGF0aWJsZSB3aXRoXG4gICAqIFtHUFQtNCBUdXJib10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvbW9kZWxzL2dwdC00LWFuZC1ncHQtNC10dXJibykgYW5kXG4gICAqIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAgICpcbiAgICogU2V0dGluZyB0byBgeyBcInR5cGVcIjogXCJqc29uX29iamVjdFwiIH1gIGVuYWJsZXMgSlNPTiBtb2RlLCB3aGljaCBndWFyYW50ZWVzIHRoZVxuICAgKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAgICpcbiAgICogKipJbXBvcnRhbnQ6Kiogd2hlbiB1c2luZyBKU09OIG1vZGUsIHlvdSAqKm11c3QqKiBhbHNvIGluc3RydWN0IHRoZSBtb2RlbCB0b1xuICAgKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gICAqIGdlbmVyYXRlIGFuIHVuZW5kaW5nIHN0cmVhbSBvZiB3aGl0ZXNwYWNlIHVudGlsIHRoZSBnZW5lcmF0aW9uIHJlYWNoZXMgdGhlIHRva2VuXG4gICAqIGxpbWl0LCByZXN1bHRpbmcgaW4gYSBsb25nLXJ1bm5pbmcgYW5kIHNlZW1pbmdseSBcInN0dWNrXCIgcmVxdWVzdC4gQWxzbyBub3RlIHRoYXRcbiAgICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gICAqIGluZGljYXRlcyB0aGUgZ2VuZXJhdGlvbiBleGNlZWRlZCBgbWF4X3Rva2Vuc2Agb3IgdGhlIGNvbnZlcnNhdGlvbiBleGNlZWRlZCB0aGVcbiAgICogbWF4IGNvbnRleHQgbGVuZ3RoLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFRvb2w+IHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgdHJ1bmNhdGlvbl9zdHJhdGVneT86IFJ1bkNyZWF0ZVBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bkNyZWF0ZVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNvbnRlbnQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgKlxuICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAqIC0gYGFzc2lzdGFudGA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2lzdGFudC4gVXNlIHRoaXNcbiAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAqL1xuICAgIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAqL1xuICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8QWRkaXRpb25hbE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICovXG4gICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCB0eXBlIFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyBleHRlbmRzIFJ1bkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbT86IGZhbHNlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgZXh0ZW5kcyBSdW5DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW06IHRydWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuVXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgcnVuLiBUaGlzXG4gICAqIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMgd2l0aG91dCBvdmVycmlkaW5nIG90aGVyXG4gICAqIGluc3RydWN0aW9ucy5cbiAgICovXG4gIGFkZGl0aW9uYWxfaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQWRkcyBhZGRpdGlvbmFsIG1lc3NhZ2VzIHRvIHRoZSB0aHJlYWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBydW4uXG4gICAqL1xuICBhZGRpdGlvbmFsX21lc3NhZ2VzPzogQXJyYXk8UnVuQ3JlYXRlQW5kUG9sbFBhcmFtcy5BZGRpdGlvbmFsTWVzc2FnZT4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlXG4gICAqIFtpbnN0cnVjdGlvbnNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cy9jcmVhdGVBc3Npc3RhbnQpXG4gICAqIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJ1xuICAgIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0b29scyB0aGUgYXNzaXN0YW50IGNhbiB1c2UgZm9yIHRoaXMgcnVuLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb250ZW50OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgKi9cbiAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICAgKi9cbiAgICBhdHRhY2htZW50cz86IEFycmF5PEFkZGl0aW9uYWxNZXNzYWdlLkF0dGFjaG1lbnQ+IHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZD86IHN0cmluZztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAqL1xuICAgICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVHJ1bmNhdGlvblN0cmF0ZWd5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJ1bmNhdGlvbiBzdHJhdGVneSB0byB1c2UgZm9yIHRoZSB0aHJlYWQuIFRoZSBkZWZhdWx0IGlzIGBhdXRvYC4gSWYgc2V0IHRvXG4gICAgICogYGxhc3RfbWVzc2FnZXNgLCB0aGUgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSBuIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGluXG4gICAgICogdGhlIHRocmVhZC4gV2hlbiBzZXQgdG8gYGF1dG9gLCBtZXNzYWdlcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0aHJlYWQgd2lsbCBiZVxuICAgICAqIGRyb3BwZWQgdG8gZml0IHRoZSBjb250ZXh0IGxlbmd0aCBvZiB0aGUgbW9kZWwsIGBtYXhfcHJvbXB0X3Rva2Vuc2AuXG4gICAgICovXG4gICAgdHlwZTogJ2F1dG8nIHwgJ2xhc3RfbWVzc2FnZXMnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBtZXNzYWdlcyBmcm9tIHRoZSB0aHJlYWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNvbnRleHRcbiAgICAgKiBmb3IgdGhlIHJ1bi5cbiAgICAgKi9cbiAgICBsYXN0X21lc3NhZ2VzPzogbnVtYmVyIHwgbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlXG4gICAqIFthc3Npc3RhbnRdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cykgdG8gdXNlIHRvXG4gICAqIGV4ZWN1dGUgdGhpcyBydW4uXG4gICAqL1xuICBhc3Npc3RhbnRfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQXBwZW5kcyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBydW4uIFRoaXNcbiAgICogaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcyB3aXRob3V0IG92ZXJyaWRpbmcgb3RoZXJcbiAgICogaW5zdHJ1Y3Rpb25zLlxuICAgKi9cbiAgYWRkaXRpb25hbF9pbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFkZGl0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIHRocmVhZCBiZWZvcmUgY3JlYXRpbmcgdGhlIHJ1bi5cbiAgICovXG4gIGFkZGl0aW9uYWxfbWVzc2FnZXM/OiBBcnJheTxSdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXMuQWRkaXRpb25hbE1lc3NhZ2U+IHwgbnVsbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZVxuICAgKiBbaW5zdHJ1Y3Rpb25zXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMvY3JlYXRlQXNzaXN0YW50KVxuICAgKiBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkFzc2lzdGFudFRvb2w+IHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgdHJ1bmNhdGlvbl9zdHJhdGVneT86IFJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIGNvbnRlbnQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgKlxuICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAqIC0gYGFzc2lzdGFudGA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2lzdGFudC4gVXNlIHRoaXNcbiAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAqL1xuICAgIHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnO1xuXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAqL1xuICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8QWRkaXRpb25hbE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIEFkZGl0aW9uYWxNZXNzYWdlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlIGZpbGUgdG8gYXR0YWNoIHRvIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICovXG4gICAgICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2w+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3RyZWFtUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHJ1bi4gVGhpc1xuICAgKiBpcyB1c2VmdWwgZm9yIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzIHdpdGhvdXQgb3ZlcnJpZGluZyBvdGhlclxuICAgKiBpbnN0cnVjdGlvbnMuXG4gICAqL1xuICBhZGRpdGlvbmFsX2luc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFkZHMgYWRkaXRpb25hbCBtZXNzYWdlcyB0byB0aGUgdGhyZWFkIGJlZm9yZSBjcmVhdGluZyB0aGUgcnVuLlxuICAgKi9cbiAgYWRkaXRpb25hbF9tZXNzYWdlcz86IEFycmF5PFJ1blN0cmVhbVBhcmFtcy5BZGRpdGlvbmFsTWVzc2FnZT4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlXG4gICAqIFtpbnN0cnVjdGlvbnNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvYXNzaXN0YW50cy9jcmVhdGVBc3Npc3RhbnQpXG4gICAqIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvciBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJ1xuICAgIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0b29scyB0aGUgYXNzaXN0YW50IGNhbiB1c2UgZm9yIHRoaXMgcnVuLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICB0b29scz86IEFycmF5PEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VG9vbD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBzYW1wbGluZyB3aXRoIHRlbXBlcmF0dXJlLCBjYWxsZWQgbnVjbGV1cyBzYW1wbGluZywgd2hlcmUgdGhlXG4gICAqIG1vZGVsIGNvbnNpZGVycyB0aGUgcmVzdWx0cyBvZiB0aGUgdG9rZW5zIHdpdGggdG9wX3AgcHJvYmFiaWxpdHkgbWFzcy4gU28gMC4xXG4gICAqIG1lYW5zIG9ubHkgdGhlIHRva2VucyBjb21wcmlzaW5nIHRoZSB0b3AgMTAlIHByb2JhYmlsaXR5IG1hc3MgYXJlIGNvbnNpZGVyZWQuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciB0ZW1wZXJhdHVyZSBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICB0cnVuY2F0aW9uX3N0cmF0ZWd5PzogUnVuU3RyZWFtUGFyYW1zLlRydW5jYXRpb25TdHJhdGVneSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3RyZWFtUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBBZGRpdGlvbmFsTWVzc2FnZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgY29udGVudDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAqXG4gICAgICogLSBgdXNlcmA6IEluZGljYXRlcyB0aGUgbWVzc2FnZSBpcyBzZW50IGJ5IGFuIGFjdHVhbCB1c2VyIGFuZCBzaG91bGQgYmUgdXNlZCBpblxuICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAqICAgdmFsdWUgdG8gaW5zZXJ0IG1lc3NhZ2VzIGZyb20gdGhlIGFzc2lzdGFudCBpbnRvIHRoZSBjb252ZXJzYXRpb24uXG4gICAgICovXG4gICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICovXG4gICAgYXR0YWNobWVudHM/OiBBcnJheTxBZGRpdGlvbmFsTWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgQWRkaXRpb25hbE1lc3NhZ2Uge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICAgKi9cbiAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMgPVxuICB8IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nXG4gIHwgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB0b29scyBmb3Igd2hpY2ggdGhlIG91dHB1dHMgYXJlIGJlaW5nIHN1Ym1pdHRlZC5cbiAgICovXG4gIHRvb2xfb3V0cHV0czogQXJyYXk8UnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMuVG9vbE91dHB1dD47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW0/OiBib29sZWFuIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbE91dHB1dCB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBvZiB0aGUgdG9vbCBjYWxsIHRvIGJlIHN1Ym1pdHRlZCB0byBjb250aW51ZSB0aGUgcnVuLlxuICAgICAqL1xuICAgIG91dHB1dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIGluIHRoZSBgcmVxdWlyZWRfYWN0aW9uYCBvYmplY3Qgd2l0aGluIHRoZSBydW4gb2JqZWN0XG4gICAgICogdGhlIG91dHB1dCBpcyBiZWluZyBzdWJtaXR0ZWQgZm9yLlxuICAgICAqL1xuICAgIHRvb2xfY2FsbF9pZD86IHN0cmluZztcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IHR5cGUgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmcgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nIGV4dGVuZHMgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcmV0dXJucyBhIHN0cmVhbSBvZiBldmVudHMgdGhhdCBoYXBwZW4gZHVyaW5nIHRoZSBSdW4gYXMgc2VydmVyLXNlbnRcbiAgICogZXZlbnRzLCB0ZXJtaW5hdGluZyB3aGVuIHRoZSBSdW4gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUgd2l0aCBhIGBkYXRhOiBbRE9ORV1gXG4gICAqIG1lc3NhZ2UuXG4gICAqL1xuICBzdHJlYW0/OiBmYWxzZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmcgZXh0ZW5kcyBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHRvb2xzIGZvciB3aGljaCB0aGUgb3V0cHV0cyBhcmUgYmVpbmcgc3VibWl0dGVkLlxuICAgKi9cbiAgdG9vbF9vdXRwdXRzOiBBcnJheTxSdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXMuVG9vbE91dHB1dD47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNBbmRQb2xsUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBUb29sT3V0cHV0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0cHV0IG9mIHRoZSB0b29sIGNhbGwgdG8gYmUgc3VibWl0dGVkIHRvIGNvbnRpbnVlIHRoZSBydW4uXG4gICAgICovXG4gICAgb3V0cHV0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0b29sIGNhbGwgaW4gdGhlIGByZXF1aXJlZF9hY3Rpb25gIG9iamVjdCB3aXRoaW4gdGhlIHJ1biBvYmplY3RcbiAgICAgKiB0aGUgb3V0cHV0IGlzIGJlaW5nIHN1Ym1pdHRlZCBmb3IuXG4gICAgICovXG4gICAgdG9vbF9jYWxsX2lkPzogc3RyaW5nO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHRvb2xzIGZvciB3aGljaCB0aGUgb3V0cHV0cyBhcmUgYmVpbmcgc3VibWl0dGVkLlxuICAgKi9cbiAgdG9vbF9vdXRwdXRzOiBBcnJheTxSdW5TdWJtaXRUb29sT3V0cHV0c1N0cmVhbVBhcmFtcy5Ub29sT3V0cHV0Pjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSdW5TdWJtaXRUb29sT3V0cHV0c1N0cmVhbVBhcmFtcyB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgVG9vbE91dHB1dCB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dHB1dCBvZiB0aGUgdG9vbCBjYWxsIHRvIGJlIHN1Ym1pdHRlZCB0byBjb250aW51ZSB0aGUgcnVuLlxuICAgICAqL1xuICAgIG91dHB1dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdG9vbCBjYWxsIGluIHRoZSBgcmVxdWlyZWRfYWN0aW9uYCBvYmplY3Qgd2l0aGluIHRoZSBydW4gb2JqZWN0XG4gICAgICogdGhlIG91dHB1dCBpcyBiZWluZyBzdWJtaXR0ZWQgZm9yLlxuICAgICAqL1xuICAgIHRvb2xfY2FsbF9pZD86IHN0cmluZztcbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJ1bnMge1xuICBleHBvcnQgaW1wb3J0IFJlcXVpcmVkQWN0aW9uRnVuY3Rpb25Ub29sQ2FsbCA9IFJ1bnNBUEkuUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IFJ1biA9IFJ1bnNBUEkuUnVuO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0YXR1cyA9IFJ1bnNBUEkuUnVuU3RhdHVzO1xuICBleHBvcnQgaW1wb3J0IFJ1bnNQYWdlID0gUnVuc0FQSS5SdW5zUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBSdW5zQVBJLlJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5VcGRhdGVQYXJhbXMgPSBSdW5zQVBJLlJ1blVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5MaXN0UGFyYW1zID0gUnVuc0FQSS5SdW5MaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZUFuZFBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlQW5kU3RyZWFtUGFyYW1zID0gUnVuc0FQSS5SdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RyZWFtUGFyYW1zID0gUnVuc0FQSS5SdW5TdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNTdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNBbmRQb2xsUGFyYW1zID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzU3RyZWFtUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFN0ZXBzID0gU3RlcHNBUEkuU3RlcHM7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyTG9ncyA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlckxvZ3M7XG4gIGV4cG9ydCBpbXBvcnQgQ29kZUludGVycHJldGVyT3V0cHV0SW1hZ2UgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJPdXRwdXRJbWFnZTtcbiAgZXhwb3J0IGltcG9ydCBDb2RlSW50ZXJwcmV0ZXJUb29sQ2FsbCA9IFN0ZXBzQVBJLkNvZGVJbnRlcnByZXRlclRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlclRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sQ2FsbERlbHRhO1xuICBleHBvcnQgaW1wb3J0IEZpbGVTZWFyY2hUb29sQ2FsbCA9IFN0ZXBzQVBJLkZpbGVTZWFyY2hUb29sQ2FsbDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlU2VhcmNoVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLkZpbGVTZWFyY2hUb29sQ2FsbERlbHRhO1xuICBleHBvcnQgaW1wb3J0IEZ1bmN0aW9uVG9vbENhbGwgPSBTdGVwc0FQSS5GdW5jdGlvblRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IEZ1bmN0aW9uVG9vbENhbGxEZWx0YSA9IFN0ZXBzQVBJLkZ1bmN0aW9uVG9vbENhbGxEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ3JlYXRpb25TdGVwRGV0YWlscyA9IFN0ZXBzQVBJLk1lc3NhZ2VDcmVhdGlvblN0ZXBEZXRhaWxzO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXAgPSBTdGVwc0FQSS5SdW5TdGVwO1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBEZWx0YSA9IFN0ZXBzQVBJLlJ1blN0ZXBEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBSdW5TdGVwRGVsdGFFdmVudCA9IFN0ZXBzQVBJLlJ1blN0ZXBEZWx0YUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBEZWx0YU1lc3NhZ2VEZWx0YSA9IFN0ZXBzQVBJLlJ1blN0ZXBEZWx0YU1lc3NhZ2VEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBUb29sQ2FsbCA9IFN0ZXBzQVBJLlRvb2xDYWxsO1xuICBleHBvcnQgaW1wb3J0IFRvb2xDYWxsRGVsdGEgPSBTdGVwc0FQSS5Ub29sQ2FsbERlbHRhO1xuICBleHBvcnQgaW1wb3J0IFRvb2xDYWxsRGVsdGFPYmplY3QgPSBTdGVwc0FQSS5Ub29sQ2FsbERlbHRhT2JqZWN0O1xuICBleHBvcnQgaW1wb3J0IFRvb2xDYWxsc1N0ZXBEZXRhaWxzID0gU3RlcHNBUEkuVG9vbENhbGxzU3RlcERldGFpbHM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RlcHNQYWdlID0gU3RlcHNBUEkuUnVuU3RlcHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IFN0ZXBMaXN0UGFyYW1zID0gU3RlcHNBUEkuU3RlcExpc3RQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUHJvbWlzZSB9IGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBc3Npc3RhbnRTdHJlYW0sIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2VTdHJlYW0gfSBmcm9tIFwiLi4vLi4vLi4vbGliL0Fzc2lzdGFudFN0cmVhbVwiO1xuaW1wb3J0ICogYXMgVGhyZWFkc0FQSSBmcm9tIFwiLi90aHJlYWRzXCI7XG5pbXBvcnQgKiBhcyBBc3Npc3RhbnRzQVBJIGZyb20gXCIuLi9hc3Npc3RhbnRzXCI7XG5pbXBvcnQgKiBhcyBNZXNzYWdlc0FQSSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgUnVuc0FQSSBmcm9tIFwiLi9ydW5zL3J1bnNcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuLi8uLi8uLi9zdHJlYW1pbmdcIjtcblxuZXhwb3J0IGNsYXNzIFRocmVhZHMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIHJ1bnM6IFJ1bnNBUEkuUnVucyA9IG5ldyBSdW5zQVBJLlJ1bnModGhpcy5fY2xpZW50KTtcbiAgbWVzc2FnZXM6IE1lc3NhZ2VzQVBJLk1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VzQVBJLk1lc3NhZ2VzKHRoaXMuX2NsaWVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRocmVhZC5cbiAgICovXG4gIGNyZWF0ZShib2R5PzogVGhyZWFkQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxUaHJlYWQ+O1xuICBjcmVhdGUob3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VGhyZWFkPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZVBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFRocmVhZD4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKGJvZHkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGUoe30sIGJvZHkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy90aHJlYWRzJywge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHRocmVhZC5cbiAgICovXG4gIHJldHJpZXZlKHRocmVhZElkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPFRocmVhZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdGhyZWFkcy8ke3RocmVhZElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIGEgdGhyZWFkLlxuICAgKi9cbiAgdXBkYXRlKHRocmVhZElkOiBzdHJpbmcsIGJvZHk6IFRocmVhZFVwZGF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VGhyZWFkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdGhyZWFkcy8ke3RocmVhZElkfWAsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSB0aHJlYWQuXG4gICAqL1xuICBkZWwodGhyZWFkSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VGhyZWFkRGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvdGhyZWFkcy8ke3RocmVhZElkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRocmVhZCBhbmQgcnVuIGl0IGluIG9uZSByZXF1ZXN0LlxuICAgKi9cbiAgY3JlYXRlQW5kUnVuKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxSdW5zQVBJLlJ1bj47XG4gIGNyZWF0ZUFuZFJ1bihcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PjtcbiAgY3JlYXRlQW5kUnVuKFxuICAgIGJvZHk6IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2UsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+IHwgUnVuc0FQSS5SdW4+O1xuICBjcmVhdGVBbmRSdW4oXG4gICAgYm9keTogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFJ1bnNBUEkuUnVuPiB8IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvdGhyZWFkcy9ydW5zJywge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgICAgc3RyZWFtOiBib2R5LnN0cmVhbSA/PyBmYWxzZSxcbiAgICB9KSBhcyBBUElQcm9taXNlPFJ1bnNBUEkuUnVuPiB8IEFQSVByb21pc2U8U3RyZWFtPEFzc2lzdGFudHNBUEkuQXNzaXN0YW50U3RyZWFtRXZlbnQ+PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYSB0aHJlYWQsIHN0YXJ0IGEgcnVuIGFuZCB0aGVuIHBvbGwgZm9yIGEgdGVybWluYWwgc3RhdGUuXG4gICAqIE1vcmUgaW5mb3JtYXRpb24gb24gUnVuIGxpZmVjeWNsZXMgY2FuIGJlIGZvdW5kIGhlcmU6XG4gICAqIGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2Fzc2lzdGFudHMvaG93LWl0LXdvcmtzL3J1bnMtYW5kLXJ1bi1zdGVwc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQW5kUnVuUG9sbChcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8VGhyZWFkcy5SdW4+IHtcbiAgICBjb25zdCBydW4gPSBhd2FpdCB0aGlzLmNyZWF0ZUFuZFJ1bihib2R5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5zLnBvbGwocnVuLnRocmVhZF9pZCwgcnVuLmlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0aHJlYWQgYW5kIHN0cmVhbSB0aGUgcnVuIGJhY2tcbiAgICovXG4gIGNyZWF0ZUFuZFJ1blN0cmVhbShcbiAgICBib2R5OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNCYXNlU3RyZWFtLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBc3Npc3RhbnRTdHJlYW0ge1xuICAgIHJldHVybiBBc3Npc3RhbnRTdHJlYW0uY3JlYXRlVGhyZWFkQXNzaXN0YW50U3RyZWFtKGJvZHksIHRoaXMuX2NsaWVudC5iZXRhLnRocmVhZHMsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGV4cGVjdGVkIG91dHB1dCBvZiB0aGUgbW9kZWwuIElmIGBqc29uX29iamVjdGAgb25seVxuICogYGZ1bmN0aW9uYCB0eXBlIGB0b29sc2AgYXJlIGFsbG93ZWQgdG8gYmUgcGFzc2VkIHRvIHRoZSBSdW4uIElmIGB0ZXh0YCB0aGUgbW9kZWxcbiAqIGNhbiByZXR1cm4gdGV4dCBvciBhbnkgdmFsdWUgbmVlZGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0IHtcbiAgLyoqXG4gICAqIE11c3QgYmUgb25lIG9mIGB0ZXh0YCBvciBganNvbl9vYmplY3RgLlxuICAgKi9cbiAgdHlwZT86ICd0ZXh0JyB8ICdqc29uX29iamVjdCc7XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAqIGFsbCBHUFQtMy41IFR1cmJvIG1vZGVscyBzaW5jZSBgZ3B0LTMuNS10dXJiby0xMTA2YC5cbiAqXG4gKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gKiBtZXNzYWdlIHRoZSBtb2RlbCBnZW5lcmF0ZXMgaXMgdmFsaWQgSlNPTi5cbiAqXG4gKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gKiBwcm9kdWNlIEpTT04geW91cnNlbGYgdmlhIGEgc3lzdGVtIG9yIHVzZXIgbWVzc2FnZS4gV2l0aG91dCB0aGlzLCB0aGUgbW9kZWwgbWF5XG4gKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICogdGhlIG1lc3NhZ2UgY29udGVudCBtYXkgYmUgcGFydGlhbGx5IGN1dCBvZmYgaWYgYGZpbmlzaF9yZWFzb249XCJsZW5ndGhcImAsIHdoaWNoXG4gKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gKiBtYXggY29udGV4dCBsZW5ndGguXG4gKi9cbmV4cG9ydCB0eXBlIEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uID0gJ25vbmUnIHwgJ2F1dG8nIHwgQXNzaXN0YW50UmVzcG9uc2VGb3JtYXQ7XG5cbi8qKlxuICogU3BlY2lmaWVzIGEgdG9vbCB0aGUgbW9kZWwgc2hvdWxkIHVzZS4gVXNlIHRvIGZvcmNlIHRoZSBtb2RlbCB0byBjYWxsIGEgc3BlY2lmaWNcbiAqIHRvb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50VG9vbENob2ljZSB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgdG9vbC4gSWYgdHlwZSBpcyBgZnVuY3Rpb25gLCB0aGUgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIHNldFxuICAgKi9cbiAgdHlwZTogJ2Z1bmN0aW9uJyB8ICdjb2RlX2ludGVycHJldGVyJyB8ICdmaWxlX3NlYXJjaCc7XG5cbiAgZnVuY3Rpb24/OiBBc3Npc3RhbnRUb29sQ2hvaWNlRnVuY3Rpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gKiBub3QgY2FsbCBhbnkgdG9vbHMgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIGEgbWVzc2FnZS4gYGF1dG9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlXG4gKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICogdG8gdGhlIHVzZXIuIFNwZWNpZnlpbmcgYSBwYXJ0aWN1bGFyIHRvb2wgbGlrZSBge1widHlwZVwiOiBcImZpbGVfc2VhcmNoXCJ9YCBvclxuICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAqIGNhbGwgdGhhdCB0b29sLlxuICovXG5leHBvcnQgdHlwZSBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uID0gJ25vbmUnIHwgJ2F1dG8nIHwgJ3JlcXVpcmVkJyB8IEFzc2lzdGFudFRvb2xDaG9pY2U7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zXG4gKiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHRocmVhZCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE6IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgdGhyZWFkYC5cbiAgICovXG4gIG9iamVjdDogJ3RocmVhZCc7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM6IFRocmVhZC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWQge1xuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAqIHRocmVhZC4gVGhlIHJlc291cmNlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZVxuICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZVxuICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAqIGF0dGFjaGVkIHRvIHRoaXMgdGhyZWFkLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEgdmVjdG9yIHN0b3JlIGF0dGFjaGVkIHRvXG4gICAgICAgKiB0aGUgdGhyZWFkLlxuICAgICAgICovXG4gICAgICB2ZWN0b3Jfc3RvcmVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWREZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ3RocmVhZC5kZWxldGVkJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIFttZXNzYWdlc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcykgdG9cbiAgICogc3RhcnQgdGhlIHRocmVhZCB3aXRoLlxuICAgKi9cbiAgbWVzc2FnZXM/OiBBcnJheTxUaHJlYWRDcmVhdGVQYXJhbXMuTWVzc2FnZT47XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWRDcmVhdGVQYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkQ3JlYXRlUGFyYW1zIHtcbiAgZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBjb250ZW50OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcm9sZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgY3JlYXRpbmcgdGhlIG1lc3NhZ2UuIEFsbG93ZWQgdmFsdWVzIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICogICBtb3N0IGNhc2VzIHRvIHJlcHJlc2VudCB1c2VyLWdlbmVyYXRlZCBtZXNzYWdlcy5cbiAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgKi9cbiAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSwgYW5kIHRoZSB0b29scyB0aGV5IHNob3VsZCBiZSBhZGRlZCB0by5cbiAgICAgKi9cbiAgICBhdHRhY2htZW50cz86IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHRvb2xzIHRvIGFkZCB0aGlzIGZpbGUgdG8uXG4gICAgICAgKi9cbiAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBoZWxwZXIgdG8gY3JlYXRlIGFcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiB3aXRoIGZpbGVfaWRzIGFuZCBhdHRhY2ggaXQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3JcbiAgICAgICAqIHN0b3JlIGF0dGFjaGVkIHRvIHRoZSB0aHJlYWQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZXM/OiBBcnJheTxGaWxlU2VhcmNoLlZlY3RvclN0b3JlPjtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIEZpbGVTZWFyY2gge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyB0b1xuICAgICAgICAgKiBhZGQgdG8gdGhlIHZlY3RvciBzdG9yZS4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMDAwMCBmaWxlcyBpbiBhIHZlY3RvclxuICAgICAgICAgKiBzdG9yZS5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHZlY3RvciBzdG9yZS4gVGhpcyBjYW4gYmVcbiAgICAgICAgICogdXNlZnVsIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlY3RvciBzdG9yZSBpbiBhIHN0cnVjdHVyZWRcbiAgICAgICAgICogZm9ybWF0LiBLZXlzIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtXG4gICAgICAgICAqIG9mIDUxMiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICAgICAqL1xuICAgICAgICBtZXRhZGF0YT86IHVua25vd247XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkVXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWRVcGRhdGVQYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkVXBkYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcyA9XG4gIHwgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nXG4gIHwgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHN5c3RlbSBtZXNzYWdlIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJ1xuICAgIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbT86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGF0IHNhbXBsaW5nIHRlbXBlcmF0dXJlIHRvIHVzZSwgYmV0d2VlbiAwIGFuZCAyLiBIaWdoZXIgdmFsdWVzIGxpa2UgMC44IHdpbGxcbiAgICogbWFrZSB0aGUgb3V0cHV0IG1vcmUgcmFuZG9tLCB3aGlsZSBsb3dlciB2YWx1ZXMgbGlrZSAwLjIgd2lsbCBtYWtlIGl0IG1vcmVcbiAgICogZm9jdXNlZCBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgdGhyZWFkPzogVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zLlRocmVhZDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IEFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMuVG9vbFJlc291cmNlcyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0b29scyB0aGUgYXNzaXN0YW50IGNhbiB1c2UgZm9yIHRoaXMgcnVuLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICB0b29scz86IEFycmF5PFxuICAgIEFzc2lzdGFudHNBUEkuQ29kZUludGVycHJldGVyVG9vbCB8IEFzc2lzdGFudHNBUEkuRmlsZVNlYXJjaFRvb2wgfCBBc3Npc3RhbnRzQVBJLkZ1bmN0aW9uVG9vbFxuICA+IHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgdGVtcGVyYXR1cmUgYnV0IG5vdCBib3RoLlxuICAgKi9cbiAgdG9wX3A/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgdHJ1bmNhdGlvbl9zdHJhdGVneT86IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcy5UcnVuY2F0aW9uU3RyYXRlZ3kgfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcyB7XG4gIC8qKlxuICAgKiBJZiBubyB0aHJlYWQgaXMgcHJvdmlkZWQsIGFuIGVtcHR5IHRocmVhZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZCB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFttZXNzYWdlc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcykgdG9cbiAgICAgKiBzdGFydCB0aGUgdGhyZWFkIHdpdGguXG4gICAgICovXG4gICAgbWVzc2FnZXM/OiBBcnJheTxUaHJlYWQuTWVzc2FnZT47XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgICAqIHRocmVhZC4gVGhlIHJlc291cmNlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZVxuICAgICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgICAqL1xuICAgIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWQge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBjb250ZW50OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAgICpcbiAgICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAgICovXG4gICAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICAgKi9cbiAgICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8TWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAgICovXG4gICAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZSB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICAgKi9cbiAgICAgICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICAgKiB0aGUgdGhyZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhXG4gICAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgICAqIHdpdGggZmlsZV9pZHMgYW5kIGF0dGFjaCBpdCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvclxuICAgICAgICAgKiBzdG9yZSBhdHRhY2hlZCB0byB0aGUgdGhyZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgdmVjdG9yX3N0b3Jlcz86IEFycmF5PEZpbGVTZWFyY2guVmVjdG9yU3RvcmU+O1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgbmFtZXNwYWNlIEZpbGVTZWFyY2gge1xuICAgICAgICBleHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyB0b1xuICAgICAgICAgICAqIGFkZCB0byB0aGUgdmVjdG9yIHN0b3JlLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEwMDAwIGZpbGVzIGluIGEgdmVjdG9yXG4gICAgICAgICAgICogc3RvcmUuXG4gICAgICAgICAgICovXG4gICAgICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHZlY3RvciBzdG9yZS4gVGhpcyBjYW4gYmVcbiAgICAgICAgICAgKiB1c2VmdWwgZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVjdG9yIHN0b3JlIGluIGEgc3RydWN0dXJlZFxuICAgICAgICAgICAqIGZvcm1hdC4gS2V5cyBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bVxuICAgICAgICAgICAqIG9mIDUxMiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICAgICAgICovXG4gICAgICAgICAgbWV0YWRhdGE/OiB1bmtub3duO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIGFzc2lzdGFudC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cblxuICBleHBvcnQgdHlwZSBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IHR5cGUgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nIGV4dGVuZHMgVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJldHVybnMgYSBzdHJlYW0gb2YgZXZlbnRzIHRoYXQgaGFwcGVuIGR1cmluZyB0aGUgUnVuIGFzIHNlcnZlci1zZW50XG4gICAqIGV2ZW50cywgdGVybWluYXRpbmcgd2hlbiB0aGUgUnVuIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlIHdpdGggYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKi9cbiAgc3RyZWFtPzogZmFsc2UgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZyBleHRlbmRzIFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogSWYgYHRydWVgLCByZXR1cm5zIGEgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IGhhcHBlbiBkdXJpbmcgdGhlIFJ1biBhcyBzZXJ2ZXItc2VudFxuICAgKiBldmVudHMsIHRlcm1pbmF0aW5nIHdoZW4gdGhlIFJ1biBlbnRlcnMgYSB0ZXJtaW5hbCBzdGF0ZSB3aXRoIGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICovXG4gIHN0cmVhbTogdHJ1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW2Fzc2lzdGFudF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9hc3Npc3RhbnRzKSB0byB1c2UgdG9cbiAgICogZXhlY3V0ZSB0aGlzIHJ1bi5cbiAgICovXG4gIGFzc2lzdGFudF9pZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBzeXN0ZW0gbWVzc2FnZSBvZiB0aGUgYXNzaXN0YW50LiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogbW9kaWZ5aW5nIHRoZSBiZWhhdmlvciBvbiBhIHBlci1ydW4gYmFzaXMuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlXG4gICAqIHJ1bi4gVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIGNvbXBsZXRpb24gdG9rZW5zXG4gICAqIHNwZWNpZmllZCwgYWNyb3NzIG11bHRpcGxlIHR1cm5zIG9mIHRoZSBydW4uIElmIHRoZSBydW4gZXhjZWVkcyB0aGUgbnVtYmVyIG9mXG4gICAqIGNvbXBsZXRpb24gdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X2NvbXBsZXRpb25fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHByb21wdCB0b2tlbnMgdGhhdCBtYXkgYmUgdXNlZCBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHJ1bi5cbiAgICogVGhlIHJ1biB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byB1c2Ugb25seSB0aGUgbnVtYmVyIG9mIHByb21wdCB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogcHJvbXB0IHRva2VucyBzcGVjaWZpZWQsIHRoZSBydW4gd2lsbCBlbmQgd2l0aCBzdGF0dXMgYGluY29tcGxldGVgLiBTZWVcbiAgICogYGluY29tcGxldGVfZGV0YWlsc2AgZm9yIG1vcmUgaW5mby5cbiAgICovXG4gIG1heF9wcm9tcHRfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgKiBmb3Igc3RvcmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgaW4gYSBzdHJ1Y3R1cmVkIGZvcm1hdC4gS2V5c1xuICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICogY2hhcmFjdGVycyBsb25nLlxuICAgKi9cbiAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBbTW9kZWxdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzKSB0b1xuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBydW4uIElmIGEgdmFsdWUgaXMgcHJvdmlkZWQgaGVyZSwgaXQgd2lsbCBvdmVycmlkZSB0aGVcbiAgICogbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3Npc3RhbnQuIElmIG5vdCwgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICogYXNzaXN0YW50IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIG1vZGVsPzpcbiAgICB8IChzdHJpbmcgJiB7fSlcbiAgICB8ICdncHQtNC10dXJibydcbiAgICB8ICdncHQtNC10dXJiby0yMDI0LTA0LTA5J1xuICAgIHwgJ2dwdC00LTAxMjUtcHJldmlldydcbiAgICB8ICdncHQtNC10dXJiby1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LTExMDYtcHJldmlldydcbiAgICB8ICdncHQtNC12aXNpb24tcHJldmlldydcbiAgICB8ICdncHQtNCdcbiAgICB8ICdncHQtNC0wMzE0J1xuICAgIHwgJ2dwdC00LTA2MTMnXG4gICAgfCAnZ3B0LTQtMzJrJ1xuICAgIHwgJ2dwdC00LTMyay0wMzE0J1xuICAgIHwgJ2dwdC00LTMyay0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8nXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmsnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0wNjEzJ1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMTEwNidcbiAgICB8ICdncHQtMy41LXR1cmJvLTAxMjUnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xNmstMDYxMydcbiAgICB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IHRoYXQgdGhlIG1vZGVsIG11c3Qgb3V0cHV0LiBDb21wYXRpYmxlIHdpdGhcbiAgICogW0dQVC00IFR1cmJvXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvZ3B0LTQtYW5kLWdwdC00LXR1cmJvKSBhbmRcbiAgICogYWxsIEdQVC0zLjUgVHVyYm8gbW9kZWxzIHNpbmNlIGBncHQtMy41LXR1cmJvLTExMDZgLlxuICAgKlxuICAgKiBTZXR0aW5nIHRvIGB7IFwidHlwZVwiOiBcImpzb25fb2JqZWN0XCIgfWAgZW5hYmxlcyBKU09OIG1vZGUsIHdoaWNoIGd1YXJhbnRlZXMgdGhlXG4gICAqIG1lc3NhZ2UgdGhlIG1vZGVsIGdlbmVyYXRlcyBpcyB2YWxpZCBKU09OLlxuICAgKlxuICAgKiAqKkltcG9ydGFudDoqKiB3aGVuIHVzaW5nIEpTT04gbW9kZSwgeW91ICoqbXVzdCoqIGFsc28gaW5zdHJ1Y3QgdGhlIG1vZGVsIHRvXG4gICAqIHByb2R1Y2UgSlNPTiB5b3Vyc2VsZiB2aWEgYSBzeXN0ZW0gb3IgdXNlciBtZXNzYWdlLiBXaXRob3V0IHRoaXMsIHRoZSBtb2RlbCBtYXlcbiAgICogZ2VuZXJhdGUgYW4gdW5lbmRpbmcgc3RyZWFtIG9mIHdoaXRlc3BhY2UgdW50aWwgdGhlIGdlbmVyYXRpb24gcmVhY2hlcyB0aGUgdG9rZW5cbiAgICogbGltaXQsIHJlc3VsdGluZyBpbiBhIGxvbmctcnVubmluZyBhbmQgc2VlbWluZ2x5IFwic3R1Y2tcIiByZXF1ZXN0LiBBbHNvIG5vdGUgdGhhdFxuICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IG1heSBiZSBwYXJ0aWFsbHkgY3V0IG9mZiBpZiBgZmluaXNoX3JlYXNvbj1cImxlbmd0aFwiYCwgd2hpY2hcbiAgICogaW5kaWNhdGVzIHRoZSBnZW5lcmF0aW9uIGV4Y2VlZGVkIGBtYXhfdG9rZW5zYCBvciB0aGUgY29udmVyc2F0aW9uIGV4Y2VlZGVkIHRoZVxuICAgKiBtYXggY29udGV4dCBsZW5ndGguXG4gICAqL1xuICByZXNwb25zZV9mb3JtYXQ/OiBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFdoYXQgc2FtcGxpbmcgdGVtcGVyYXR1cmUgdG8gdXNlLCBiZXR3ZWVuIDAgYW5kIDIuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbFxuICAgKiBtYWtlIHRoZSBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZVxuICAgKiBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljLlxuICAgKi9cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJZiBubyB0aHJlYWQgaXMgcHJvdmlkZWQsIGFuIGVtcHR5IHRocmVhZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICB0aHJlYWQ/OiBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zLlRocmVhZDtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hpY2ggKGlmIGFueSkgdG9vbCBpcyBjYWxsZWQgYnkgdGhlIG1vZGVsLiBgbm9uZWAgbWVhbnMgdGhlIG1vZGVsIHdpbGxcbiAgICogbm90IGNhbGwgYW55IHRvb2xzIGFuZCBpbnN0ZWFkIGdlbmVyYXRlcyBhIG1lc3NhZ2UuIGBhdXRvYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiBhbmQgbWVhbnMgdGhlIG1vZGVsIGNhbiBwaWNrIGJldHdlZW4gZ2VuZXJhdGluZyBhIG1lc3NhZ2Ugb3IgY2FsbGluZyBvbmUgb3IgbW9yZVxuICAgKiB0b29scy4gYHJlcXVpcmVkYCBtZWFucyB0aGUgbW9kZWwgbXVzdCBjYWxsIG9uZSBvciBtb3JlIHRvb2xzIGJlZm9yZSByZXNwb25kaW5nXG4gICAqIHRvIHRoZSB1c2VyLiBTcGVjaWZ5aW5nIGEgcGFydGljdWxhciB0b29sIGxpa2UgYHtcInR5cGVcIjogXCJmaWxlX3NlYXJjaFwifWAgb3JcbiAgICogYHtcInR5cGVcIjogXCJmdW5jdGlvblwiLCBcImZ1bmN0aW9uXCI6IHtcIm5hbWVcIjogXCJteV9mdW5jdGlvblwifX1gIGZvcmNlcyB0aGUgbW9kZWwgdG9cbiAgICogY2FsbCB0aGF0IHRvb2wuXG4gICAqL1xuICB0b29sX2Nob2ljZT86IEFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgdG9vbF9yZXNvdXJjZXM/OiBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxcbiAgICBBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sIHwgQXNzaXN0YW50c0FQSS5GdW5jdGlvblRvb2xcbiAgPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zLlRydW5jYXRpb25TdHJhdGVneSB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkQ3JlYXRlQW5kUnVuUG9sbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBJZiBubyB0aHJlYWQgaXMgcHJvdmlkZWQsIGFuIGVtcHR5IHRocmVhZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRocmVhZCB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFttZXNzYWdlc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tZXNzYWdlcykgdG9cbiAgICAgKiBzdGFydCB0aGUgdGhyZWFkIHdpdGguXG4gICAgICovXG4gICAgbWVzc2FnZXM/OiBBcnJheTxUaHJlYWQuTWVzc2FnZT47XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgYXNzaXN0YW50J3MgdG9vbHMgaW4gdGhpc1xuICAgICAqIHRocmVhZC4gVGhlIHJlc291cmNlcyBhcmUgc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZVxuICAgICAqIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGBcbiAgICAgKiB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgSURzLlxuICAgICAqL1xuICAgIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWQge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICovXG4gICAgICBjb250ZW50OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIHJvbGUgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGNyZWF0aW5nIHRoZSBtZXNzYWdlLiBBbGxvd2VkIHZhbHVlcyBpbmNsdWRlOlxuICAgICAgICpcbiAgICAgICAqIC0gYHVzZXJgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgc2VudCBieSBhbiBhY3R1YWwgdXNlciBhbmQgc2hvdWxkIGJlIHVzZWQgaW5cbiAgICAgICAqICAgbW9zdCBjYXNlcyB0byByZXByZXNlbnQgdXNlci1nZW5lcmF0ZWQgbWVzc2FnZXMuXG4gICAgICAgKiAtIGBhc3Npc3RhbnRgOiBJbmRpY2F0ZXMgdGhlIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBhc3Npc3RhbnQuIFVzZSB0aGlzXG4gICAgICAgKiAgIHZhbHVlIHRvIGluc2VydCBtZXNzYWdlcyBmcm9tIHRoZSBhc3Npc3RhbnQgaW50byB0aGUgY29udmVyc2F0aW9uLlxuICAgICAgICovXG4gICAgICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JztcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCB0aGUgdG9vbHMgdGhleSBzaG91bGQgYmUgYWRkZWQgdG8uXG4gICAgICAgKi9cbiAgICAgIGF0dGFjaG1lbnRzPzogQXJyYXk8TWVzc2FnZS5BdHRhY2htZW50PiB8IG51bGw7XG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICAgICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAgICovXG4gICAgICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZSB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEF0dGFjaG1lbnQge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIElEIG9mIHRoZSBmaWxlIHRvIGF0dGFjaCB0byB0aGUgbWVzc2FnZS5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWQ/OiBzdHJpbmc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0b29scyB0byBhZGQgdGhpcyBmaWxlIHRvLlxuICAgICAgICAgKi9cbiAgICAgICAgdG9vbHM/OiBBcnJheTxBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sPjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgICAgY29kZV9pbnRlcnByZXRlcj86IFRvb2xSZXNvdXJjZXMuQ29kZUludGVycHJldGVyO1xuXG4gICAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgbWFkZVxuICAgICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAgICovXG4gICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGludGVyZmFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICAgKiB0aGUgdGhyZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgaGVscGVyIHRvIGNyZWF0ZSBhXG4gICAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgICAqIHdpdGggZmlsZV9pZHMgYW5kIGF0dGFjaCBpdCB0byB0aGlzIHRocmVhZC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvclxuICAgICAgICAgKiBzdG9yZSBhdHRhY2hlZCB0byB0aGUgdGhyZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgdmVjdG9yX3N0b3Jlcz86IEFycmF5PEZpbGVTZWFyY2guVmVjdG9yU3RvcmU+O1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgbmFtZXNwYWNlIEZpbGVTZWFyY2gge1xuICAgICAgICBleHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyB0b1xuICAgICAgICAgICAqIGFkZCB0byB0aGUgdmVjdG9yIHN0b3JlLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDEwMDAwIGZpbGVzIGluIGEgdmVjdG9yXG4gICAgICAgICAgICogc3RvcmUuXG4gICAgICAgICAgICovXG4gICAgICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIHZlY3RvciBzdG9yZS4gVGhpcyBjYW4gYmVcbiAgICAgICAgICAgKiB1c2VmdWwgZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVjdG9yIHN0b3JlIGluIGEgc3RydWN0dXJlZFxuICAgICAgICAgICAqIGZvcm1hdC4gS2V5cyBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bVxuICAgICAgICAgICAqIG9mIDUxMiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAgICAgICAgICovXG4gICAgICAgICAgbWV0YWRhdGE/OiB1bmtub3duO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0IG9mIHJlc291cmNlcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhc3Npc3RhbnQncyB0b29scy4gVGhlIHJlc291cmNlcyBhcmVcbiAgICogc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgdG9vbC4gRm9yIGV4YW1wbGUsIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlc1xuICAgKiBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZVxuICAgKiBJRHMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRvb2xSZXNvdXJjZXMge1xuICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgIGZpbGVfc2VhcmNoPzogVG9vbFJlc291cmNlcy5GaWxlU2VhcmNoO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvZGVJbnRlcnByZXRlciB7XG4gICAgICAvKipcbiAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAqIGF2YWlsYWJsZSB0byB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMjAgZmlsZXNcbiAgICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9vbC5cbiAgICAgICAqL1xuICAgICAgZmlsZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJRCBvZiB0aGVcbiAgICAgICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpXG4gICAgICAgKiBhdHRhY2hlZCB0byB0aGlzIGFzc2lzdGFudC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxIHZlY3RvciBzdG9yZSBhdHRhY2hlZCB0b1xuICAgICAgICogdGhlIGFzc2lzdGFudC5cbiAgICAgICAqL1xuICAgICAgdmVjdG9yX3N0b3JlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGZvciBob3cgYSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgcHJpb3IgdG8gdGhlIHJ1bi4gVXNlIHRoaXMgdG9cbiAgICogY29udHJvbCB0aGUgaW50aWFsIGNvbnRleHQgd2luZG93IG9mIHRoZSBydW4uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIFRydW5jYXRpb25TdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRydW5jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIGZvciB0aGUgdGhyZWFkLiBUaGUgZGVmYXVsdCBpcyBgYXV0b2AuIElmIHNldCB0b1xuICAgICAqIGBsYXN0X21lc3NhZ2VzYCwgdGhlIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgbiBtb3N0IHJlY2VudCBtZXNzYWdlcyBpblxuICAgICAqIHRoZSB0aHJlYWQuIFdoZW4gc2V0IHRvIGBhdXRvYCwgbWVzc2FnZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdGhyZWFkIHdpbGwgYmVcbiAgICAgKiBkcm9wcGVkIHRvIGZpdCB0aGUgY29udGV4dCBsZW5ndGggb2YgdGhlIG1vZGVsLCBgbWF4X3Byb21wdF90b2tlbnNgLlxuICAgICAqL1xuICAgIHR5cGU6ICdhdXRvJyB8ICdsYXN0X21lc3NhZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbW9zdCByZWNlbnQgbWVzc2FnZXMgZnJvbSB0aGUgdGhyZWFkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjb250ZXh0XG4gICAgICogZm9yIHRoZSBydW4uXG4gICAgICovXG4gICAgbGFzdF9tZXNzYWdlcz86IG51bWJlciB8IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMge1xuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbYXNzaXN0YW50XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIHRvIHVzZSB0b1xuICAgKiBleGVjdXRlIHRoaXMgcnVuLlxuICAgKi9cbiAgYXNzaXN0YW50X2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHN5c3RlbSBtZXNzYWdlIG9mIHRoZSBhc3Npc3RhbnQuIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiBtb2RpZnlpbmcgdGhlIGJlaGF2aW9yIG9uIGEgcGVyLXJ1biBiYXNpcy5cbiAgICovXG4gIGluc3RydWN0aW9ucz86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb21wbGV0aW9uIHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGVcbiAgICogcnVuLiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgY29tcGxldGlvbiB0b2tlbnNcbiAgICogc3BlY2lmaWVkLCBhY3Jvc3MgbXVsdGlwbGUgdHVybnMgb2YgdGhlIHJ1bi4gSWYgdGhlIHJ1biBleGNlZWRzIHRoZSBudW1iZXIgb2ZcbiAgICogY29tcGxldGlvbiB0b2tlbnMgc3BlY2lmaWVkLCB0aGUgcnVuIHdpbGwgZW5kIHdpdGggc3RhdHVzIGBpbmNvbXBsZXRlYC4gU2VlXG4gICAqIGBpbmNvbXBsZXRlX2RldGFpbHNgIGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBtYXhfY29tcGxldGlvbl90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvbXB0IHRva2VucyB0aGF0IG1heSBiZSB1c2VkIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgcnVuLlxuICAgKiBUaGUgcnVuIHdpbGwgbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHVzZSBvbmx5IHRoZSBudW1iZXIgb2YgcHJvbXB0IHRva2Vuc1xuICAgKiBzcGVjaWZpZWQsIGFjcm9zcyBtdWx0aXBsZSB0dXJucyBvZiB0aGUgcnVuLiBJZiB0aGUgcnVuIGV4Y2VlZHMgdGhlIG51bWJlciBvZlxuICAgKiBwcm9tcHQgdG9rZW5zIHNwZWNpZmllZCwgdGhlIHJ1biB3aWxsIGVuZCB3aXRoIHN0YXR1cyBgaW5jb21wbGV0ZWAuIFNlZVxuICAgKiBgaW5jb21wbGV0ZV9kZXRhaWxzYCBmb3IgbW9yZSBpbmZvLlxuICAgKi9cbiAgbWF4X3Byb21wdF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YT86IHVua25vd24gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFtNb2RlbF0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9tb2RlbHMpIHRvXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHJ1bi4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCBpdCB3aWxsIG92ZXJyaWRlIHRoZVxuICAgKiBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lzdGFudC4gSWYgbm90LCB0aGUgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICAgKiBhc3Npc3RhbnQgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgbW9kZWw/OlxuICAgIHwgKHN0cmluZyAmIHt9KVxuICAgIHwgJ2dwdC00LXR1cmJvJ1xuICAgIHwgJ2dwdC00LXR1cmJvLTIwMjQtMDQtMDknXG4gICAgfCAnZ3B0LTQtMDEyNS1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXR1cmJvLXByZXZpZXcnXG4gICAgfCAnZ3B0LTQtMTEwNi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00LXZpc2lvbi1wcmV2aWV3J1xuICAgIHwgJ2dwdC00J1xuICAgIHwgJ2dwdC00LTAzMTQnXG4gICAgfCAnZ3B0LTQtMDYxMydcbiAgICB8ICdncHQtNC0zMmsnXG4gICAgfCAnZ3B0LTQtMzJrLTAzMTQnXG4gICAgfCAnZ3B0LTQtMzJrLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJibydcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2aydcbiAgICB8ICdncHQtMy41LXR1cmJvLTA2MTMnXG4gICAgfCAnZ3B0LTMuNS10dXJiby0xMTA2J1xuICAgIHwgJ2dwdC0zLjUtdHVyYm8tMDEyNSdcbiAgICB8ICdncHQtMy41LXR1cmJvLTE2ay0wNjEzJ1xuICAgIHwgbnVsbDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBmb3JtYXQgdGhhdCB0aGUgbW9kZWwgbXVzdCBvdXRwdXQuIENvbXBhdGlibGUgd2l0aFxuICAgKiBbR1BULTQgVHVyYm9dKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9ncHQtNC1hbmQtZ3B0LTQtdHVyYm8pIGFuZFxuICAgKiBhbGwgR1BULTMuNSBUdXJibyBtb2RlbHMgc2luY2UgYGdwdC0zLjUtdHVyYm8tMTEwNmAuXG4gICAqXG4gICAqIFNldHRpbmcgdG8gYHsgXCJ0eXBlXCI6IFwianNvbl9vYmplY3RcIiB9YCBlbmFibGVzIEpTT04gbW9kZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGVcbiAgICogbWVzc2FnZSB0aGUgbW9kZWwgZ2VuZXJhdGVzIGlzIHZhbGlkIEpTT04uXG4gICAqXG4gICAqICoqSW1wb3J0YW50OioqIHdoZW4gdXNpbmcgSlNPTiBtb2RlLCB5b3UgKiptdXN0KiogYWxzbyBpbnN0cnVjdCB0aGUgbW9kZWwgdG9cbiAgICogcHJvZHVjZSBKU09OIHlvdXJzZWxmIHZpYSBhIHN5c3RlbSBvciB1c2VyIG1lc3NhZ2UuIFdpdGhvdXQgdGhpcywgdGhlIG1vZGVsIG1heVxuICAgKiBnZW5lcmF0ZSBhbiB1bmVuZGluZyBzdHJlYW0gb2Ygd2hpdGVzcGFjZSB1bnRpbCB0aGUgZ2VuZXJhdGlvbiByZWFjaGVzIHRoZSB0b2tlblxuICAgKiBsaW1pdCwgcmVzdWx0aW5nIGluIGEgbG9uZy1ydW5uaW5nIGFuZCBzZWVtaW5nbHkgXCJzdHVja1wiIHJlcXVlc3QuIEFsc28gbm90ZSB0aGF0XG4gICAqIHRoZSBtZXNzYWdlIGNvbnRlbnQgbWF5IGJlIHBhcnRpYWxseSBjdXQgb2ZmIGlmIGBmaW5pc2hfcmVhc29uPVwibGVuZ3RoXCJgLCB3aGljaFxuICAgKiBpbmRpY2F0ZXMgdGhlIGdlbmVyYXRpb24gZXhjZWVkZWQgYG1heF90b2tlbnNgIG9yIHRoZSBjb252ZXJzYXRpb24gZXhjZWVkZWQgdGhlXG4gICAqIG1heCBjb250ZXh0IGxlbmd0aC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIG5vIHRocmVhZCBpcyBwcm92aWRlZCwgYW4gZW1wdHkgdGhyZWFkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHRocmVhZD86IFRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcy5UaHJlYWQ7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoaWNoIChpZiBhbnkpIHRvb2wgaXMgY2FsbGVkIGJ5IHRoZSBtb2RlbC4gYG5vbmVgIG1lYW5zIHRoZSBtb2RlbCB3aWxsXG4gICAqIG5vdCBjYWxsIGFueSB0b29scyBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgYSBtZXNzYWdlLiBgYXV0b2AgaXMgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICogYW5kIG1lYW5zIHRoZSBtb2RlbCBjYW4gcGljayBiZXR3ZWVuIGdlbmVyYXRpbmcgYSBtZXNzYWdlIG9yIGNhbGxpbmcgb25lIG9yIG1vcmVcbiAgICogdG9vbHMuIGByZXF1aXJlZGAgbWVhbnMgdGhlIG1vZGVsIG11c3QgY2FsbCBvbmUgb3IgbW9yZSB0b29scyBiZWZvcmUgcmVzcG9uZGluZ1xuICAgKiB0byB0aGUgdXNlci4gU3BlY2lmeWluZyBhIHBhcnRpY3VsYXIgdG9vbCBsaWtlIGB7XCJ0eXBlXCI6IFwiZmlsZV9zZWFyY2hcIn1gIG9yXG4gICAqIGB7XCJ0eXBlXCI6IFwiZnVuY3Rpb25cIiwgXCJmdW5jdGlvblwiOiB7XCJuYW1lXCI6IFwibXlfZnVuY3Rpb25cIn19YCBmb3JjZXMgdGhlIG1vZGVsIHRvXG4gICAqIGNhbGwgdGhhdCB0b29sLlxuICAgKi9cbiAgdG9vbF9jaG9pY2U/OiBBc3Npc3RhbnRUb29sQ2hvaWNlT3B0aW9uIHwgbnVsbDtcblxuICAvKipcbiAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGFzc2lzdGFudCdzIHRvb2xzLiBUaGUgcmVzb3VyY2VzIGFyZVxuICAgKiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sIHJlcXVpcmVzXG4gICAqIGEgbGlzdCBvZiBmaWxlIElEcywgd2hpbGUgdGhlIGBmaWxlX3NlYXJjaGAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlXG4gICAqIElEcy5cbiAgICovXG4gIHRvb2xfcmVzb3VyY2VzPzogVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zLlRvb2xSZXNvdXJjZXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdG9vbHMgdGhlIGFzc2lzdGFudCBjYW4gdXNlIGZvciB0aGlzIHJ1bi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gICAqIG1vZGlmeWluZyB0aGUgYmVoYXZpb3Igb24gYSBwZXItcnVuIGJhc2lzLlxuICAgKi9cbiAgdG9vbHM/OiBBcnJheTxcbiAgICBBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2wgfCBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sIHwgQXNzaXN0YW50c0FQSS5GdW5jdGlvblRvb2xcbiAgPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIHRvIHNhbXBsaW5nIHdpdGggdGVtcGVyYXR1cmUsIGNhbGxlZCBudWNsZXVzIHNhbXBsaW5nLCB3aGVyZSB0aGVcbiAgICogbW9kZWwgY29uc2lkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSB0b2tlbnMgd2l0aCB0b3BfcCBwcm9iYWJpbGl0eSBtYXNzLiBTbyAwLjFcbiAgICogbWVhbnMgb25seSB0aGUgdG9rZW5zIGNvbXByaXNpbmcgdGhlIHRvcCAxMCUgcHJvYmFiaWxpdHkgbWFzcyBhcmUgY29uc2lkZXJlZC5cbiAgICpcbiAgICogV2UgZ2VuZXJhbGx5IHJlY29tbWVuZCBhbHRlcmluZyB0aGlzIG9yIHRlbXBlcmF0dXJlIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRvcF9wPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ29udHJvbHMgZm9yIGhvdyBhIHRocmVhZCB3aWxsIGJlIHRydW5jYXRlZCBwcmlvciB0byB0aGUgcnVuLiBVc2UgdGhpcyB0b1xuICAgKiBjb250cm9sIHRoZSBpbnRpYWwgY29udGV4dCB3aW5kb3cgb2YgdGhlIHJ1bi5cbiAgICovXG4gIHRydW5jYXRpb25fc3RyYXRlZ3k/OiBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMuVHJ1bmNhdGlvblN0cmF0ZWd5IHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXMge1xuICAvKipcbiAgICogSWYgbm8gdGhyZWFkIGlzIHByb3ZpZGVkLCBhbiBlbXB0eSB0aHJlYWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUaHJlYWQge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBbbWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpIHRvXG4gICAgICogc3RhcnQgdGhlIHRocmVhZCB3aXRoLlxuICAgICAqL1xuICAgIG1lc3NhZ2VzPzogQXJyYXk8VGhyZWFkLk1lc3NhZ2U+O1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9mIDE2IGtleS12YWx1ZSBwYWlycyB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhbiBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWZ1bFxuICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAgICogY2hhcmFjdGVycyBsb25nLlxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGFzc2lzdGFudCdzIHRvb2xzIGluIHRoaXNcbiAgICAgKiB0aHJlYWQuIFRoZSByZXNvdXJjZXMgYXJlIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGVcbiAgICAgKiBgY29kZV9pbnRlcnByZXRlcmAgdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgZmlsZSBJRHMsIHdoaWxlIHRoZSBgZmlsZV9zZWFyY2hgXG4gICAgICogdG9vbCByZXF1aXJlcyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIElEcy5cbiAgICAgKi9cbiAgICB0b29sX3Jlc291cmNlcz86IFRocmVhZC5Ub29sUmVzb3VyY2VzIHwgbnVsbDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqL1xuICAgICAgY29udGVudDogc3RyaW5nO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSByb2xlIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjcmVhdGluZyB0aGUgbWVzc2FnZS4gQWxsb3dlZCB2YWx1ZXMgaW5jbHVkZTpcbiAgICAgICAqXG4gICAgICAgKiAtIGB1c2VyYDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIHNlbnQgYnkgYW4gYWN0dWFsIHVzZXIgYW5kIHNob3VsZCBiZSB1c2VkIGluXG4gICAgICAgKiAgIG1vc3QgY2FzZXMgdG8gcmVwcmVzZW50IHVzZXItZ2VuZXJhdGVkIG1lc3NhZ2VzLlxuICAgICAgICogLSBgYXNzaXN0YW50YDogSW5kaWNhdGVzIHRoZSBtZXNzYWdlIGlzIGdlbmVyYXRlZCBieSB0aGUgYXNzaXN0YW50LiBVc2UgdGhpc1xuICAgICAgICogICB2YWx1ZSB0byBpbnNlcnQgbWVzc2FnZXMgZnJvbSB0aGUgYXNzaXN0YW50IGludG8gdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgICAqL1xuICAgICAgcm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCc7XG5cbiAgICAgIC8qKlxuICAgICAgICogQSBsaXN0IG9mIGZpbGVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgdGhlIHRvb2xzIHRoZXkgc2hvdWxkIGJlIGFkZGVkIHRvLlxuICAgICAgICovXG4gICAgICBhdHRhY2htZW50cz86IEFycmF5PE1lc3NhZ2UuQXR0YWNobWVudD4gfCBudWxsO1xuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICAgICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAgICAgKiBjYW4gYmUgYSBtYXhpbXVtIG9mIDY0IGNoYXJhY3RlcnMgbG9uZyBhbmQgdmFsdWVzIGNhbiBiZSBhIG1heGl1bSBvZiA1MTJcbiAgICAgICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICAgICAqL1xuICAgICAgbWV0YWRhdGE/OiB1bmtub3duIHwgbnVsbDtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBBdHRhY2htZW50IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBJRCBvZiB0aGUgZmlsZSB0byBhdHRhY2ggdG8gdGhlIG1lc3NhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkPzogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdG9vbHMgdG8gYWRkIHRoaXMgZmlsZSB0by5cbiAgICAgICAgICovXG4gICAgICAgIHRvb2xzPzogQXJyYXk8QXNzaXN0YW50c0FQSS5Db2RlSW50ZXJwcmV0ZXJUb29sIHwgQXNzaXN0YW50c0FQSS5GaWxlU2VhcmNoVG9vbD47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBhc3Npc3RhbnQncyB0b29scyBpbiB0aGlzXG4gICAgICogdGhyZWFkLiBUaGUgcmVzb3VyY2VzIGFyZSBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiB0b29sLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAgICogYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYFxuICAgICAqIHRvb2wgcmVxdWlyZXMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZSBJRHMuXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGNvZGVfaW50ZXJwcmV0ZXI/OiBUb29sUmVzb3VyY2VzLkNvZGVJbnRlcnByZXRlcjtcblxuICAgICAgZmlsZV9zZWFyY2g/OiBUb29sUmVzb3VyY2VzLkZpbGVTZWFyY2g7XG4gICAgfVxuXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29kZUludGVycHJldGVyIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgbGlzdCBvZiBbZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIG1hZGVcbiAgICAgICAgICogYXZhaWxhYmxlIHRvIHRoZSBgY29kZV9pbnRlcnByZXRlcmAgdG9vbC4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAyMCBmaWxlc1xuICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgICAqL1xuICAgICAgICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRmlsZVNlYXJjaCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGVcbiAgICAgICAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAgICogdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGhlbHBlciB0byBjcmVhdGUgYVxuICAgICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICAgKiB3aXRoIGZpbGVfaWRzIGFuZCBhdHRhY2ggaXQgdG8gdGhpcyB0aHJlYWQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3JcbiAgICAgICAgICogc3RvcmUgYXR0YWNoZWQgdG8gdGhlIHRocmVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHZlY3Rvcl9zdG9yZXM/OiBBcnJheTxGaWxlU2VhcmNoLlZlY3RvclN0b3JlPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IG5hbWVzcGFjZSBGaWxlU2VhcmNoIHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQSBsaXN0IG9mIFtmaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdG9cbiAgICAgICAgICAgKiBhZGQgdG8gdGhlIHZlY3RvciBzdG9yZS4gVGhlcmUgY2FuIGJlIGEgbWF4aW11bSBvZiAxMDAwMCBmaWxlcyBpbiBhIHZlY3RvclxuICAgICAgICAgICAqIHN0b3JlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuIFRoaXMgY2FuIGJlXG4gICAgICAgICAgICogdXNlZnVsIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlY3RvciBzdG9yZSBpbiBhIHN0cnVjdHVyZWRcbiAgICAgICAgICAgKiBmb3JtYXQuIEtleXMgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW1cbiAgICAgICAgICAgKiBvZiA1MTIgY2hhcmFjdGVycyBsb25nLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1ldGFkYXRhPzogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldCBvZiByZXNvdXJjZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUgYXNzaXN0YW50J3MgdG9vbHMuIFRoZSByZXNvdXJjZXMgYXJlXG4gICAqIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIHRvb2wuIEZvciBleGFtcGxlLCB0aGUgYGNvZGVfaW50ZXJwcmV0ZXJgIHRvb2wgcmVxdWlyZXNcbiAgICogYSBsaXN0IG9mIGZpbGUgSURzLCB3aGlsZSB0aGUgYGZpbGVfc2VhcmNoYCB0b29sIHJlcXVpcmVzIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmVcbiAgICogSURzLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sUmVzb3VyY2VzIHtcbiAgICBjb2RlX2ludGVycHJldGVyPzogVG9vbFJlc291cmNlcy5Db2RlSW50ZXJwcmV0ZXI7XG5cbiAgICBmaWxlX3NlYXJjaD86IFRvb2xSZXNvdXJjZXMuRmlsZVNlYXJjaDtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgVG9vbFJlc291cmNlcyB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBDb2RlSW50ZXJwcmV0ZXIge1xuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgW2ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIElEcyBtYWRlXG4gICAgICAgKiBhdmFpbGFibGUgdG8gdGhlIGBjb2RlX2ludGVycHJldGVyYCB0b29sLiBUaGVyZSBjYW4gYmUgYSBtYXhpbXVtIG9mIDIwIGZpbGVzXG4gICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHRvb2wuXG4gICAgICAgKi9cbiAgICAgIGZpbGVfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIEZpbGVTZWFyY2gge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSUQgb2YgdGhlXG4gICAgICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgICAgICogYXR0YWNoZWQgdG8gdGhpcyBhc3Npc3RhbnQuIFRoZXJlIGNhbiBiZSBhIG1heGltdW0gb2YgMSB2ZWN0b3Igc3RvcmUgYXR0YWNoZWQgdG9cbiAgICAgICAqIHRoZSBhc3Npc3RhbnQuXG4gICAgICAgKi9cbiAgICAgIHZlY3Rvcl9zdG9yZV9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyBmb3IgaG93IGEgdGhyZWFkIHdpbGwgYmUgdHJ1bmNhdGVkIHByaW9yIHRvIHRoZSBydW4uIFVzZSB0aGlzIHRvXG4gICAqIGNvbnRyb2wgdGhlIGludGlhbCBjb250ZXh0IHdpbmRvdyBvZiB0aGUgcnVuLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBUcnVuY2F0aW9uU3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIFRoZSB0cnVuY2F0aW9uIHN0cmF0ZWd5IHRvIHVzZSBmb3IgdGhlIHRocmVhZC4gVGhlIGRlZmF1bHQgaXMgYGF1dG9gLiBJZiBzZXQgdG9cbiAgICAgKiBgbGFzdF9tZXNzYWdlc2AsIHRoZSB0aHJlYWQgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIG4gbW9zdCByZWNlbnQgbWVzc2FnZXMgaW5cbiAgICAgKiB0aGUgdGhyZWFkLiBXaGVuIHNldCB0byBgYXV0b2AsIG1lc3NhZ2VzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRocmVhZCB3aWxsIGJlXG4gICAgICogZHJvcHBlZCB0byBmaXQgdGhlIGNvbnRleHQgbGVuZ3RoIG9mIHRoZSBtb2RlbCwgYG1heF9wcm9tcHRfdG9rZW5zYC5cbiAgICAgKi9cbiAgICB0eXBlOiAnYXV0bycgfCAnbGFzdF9tZXNzYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIHRocmVhZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgY29udGV4dFxuICAgICAqIGZvciB0aGUgcnVuLlxuICAgICAqL1xuICAgIGxhc3RfbWVzc2FnZXM/OiBudW1iZXIgfCBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGhyZWFkcyB7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50UmVzcG9uc2VGb3JtYXQgPSBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0O1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRSZXNwb25zZUZvcm1hdE9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sQ2hvaWNlID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2VGdW5jdGlvbiA9IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb24gPSBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2VPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkID0gVGhyZWFkc0FQSS5UaHJlYWQ7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkRGVsZXRlZCA9IFRocmVhZHNBUEkuVGhyZWFkRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRVcGRhdGVQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZFVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNOb25TdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5QYXJhbXNTdHJlYW1pbmcgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5Qb2xsUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blN0cmVhbVBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bnMgPSBSdW5zQVBJLlJ1bnM7XG4gIGV4cG9ydCBpbXBvcnQgUmVxdWlyZWRBY3Rpb25GdW5jdGlvblRvb2xDYWxsID0gUnVuc0FQSS5SZXF1aXJlZEFjdGlvbkZ1bmN0aW9uVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgUnVuID0gUnVuc0FQSS5SdW47XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3RhdHVzID0gUnVuc0FQSS5SdW5TdGF0dXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuc1BhZ2UgPSBSdW5zQVBJLlJ1bnNQYWdlO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZVBhcmFtcyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1bkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IFJ1bnNBUEkuUnVuQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1blVwZGF0ZVBhcmFtcyA9IFJ1bnNBUEkuUnVuVXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFJ1bkxpc3RQYXJhbXMgPSBSdW5zQVBJLlJ1bkxpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcyA9IFJ1bnNBUEkuUnVuQ3JlYXRlQW5kUG9sbFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5DcmVhdGVBbmRTdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1bkNyZWF0ZUFuZFN0cmVhbVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdHJlYW1QYXJhbXMgPSBSdW5zQVBJLlJ1blN0cmVhbVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtcyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgUnVuU3VibWl0VG9vbE91dHB1dHNQYXJhbXNOb25TdHJlYW1pbmcgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFJ1blN1Ym1pdFRvb2xPdXRwdXRzUGFyYW1zU3RyZWFtaW5nID0gUnVuc0FQSS5SdW5TdWJtaXRUb29sT3V0cHV0c1BhcmFtc1N0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c0FuZFBvbGxQYXJhbXMgPSBSdW5zQVBJLlJ1blN1Ym1pdFRvb2xPdXRwdXRzQW5kUG9sbFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBSdW5TdWJtaXRUb29sT3V0cHV0c1N0cmVhbVBhcmFtcyA9IFJ1bnNBUEkuUnVuU3VibWl0VG9vbE91dHB1dHNTdHJlYW1QYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlcztcbiAgZXhwb3J0IGltcG9ydCBBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBBbm5vdGF0aW9uRGVsdGEgPSBNZXNzYWdlc0FQSS5Bbm5vdGF0aW9uRGVsdGE7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNpdGF0aW9uQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVDaXRhdGlvbkFubm90YXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uID0gTWVzc2FnZXNBUEkuRmlsZUNpdGF0aW9uRGVsdGFBbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbGVQYXRoQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVQYXRoQW5ub3RhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaWxlUGF0aERlbHRhQW5ub3RhdGlvbiA9IE1lc3NhZ2VzQVBJLkZpbGVQYXRoRGVsdGFBbm5vdGF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEltYWdlRmlsZSA9IE1lc3NhZ2VzQVBJLkltYWdlRmlsZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGVDb250ZW50QmxvY2sgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGVDb250ZW50QmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VGaWxlRGVsdGEgPSBNZXNzYWdlc0FQSS5JbWFnZUZpbGVEZWx0YTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUZpbGVEZWx0YUJsb2NrID0gTWVzc2FnZXNBUEkuSW1hZ2VGaWxlRGVsdGFCbG9jaztcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlID0gTWVzc2FnZXNBUEkuTWVzc2FnZTtcbiAgZXhwb3J0IGltcG9ydCBNZXNzYWdlQ29udGVudCA9IE1lc3NhZ2VzQVBJLk1lc3NhZ2VDb250ZW50O1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDb250ZW50RGVsdGEgPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ29udGVudERlbHRhO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWxldGVkID0gTWVzc2FnZXNBUEkuTWVzc2FnZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZURlbHRhID0gTWVzc2FnZXNBUEkuTWVzc2FnZURlbHRhO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VEZWx0YUV2ZW50ID0gTWVzc2FnZXNBUEkuTWVzc2FnZURlbHRhRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dCA9IE1lc3NhZ2VzQVBJLlRleHQ7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dENvbnRlbnRCbG9jayA9IE1lc3NhZ2VzQVBJLlRleHRDb250ZW50QmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgVGV4dERlbHRhID0gTWVzc2FnZXNBUEkuVGV4dERlbHRhO1xuICBleHBvcnQgaW1wb3J0IFRleHREZWx0YUJsb2NrID0gTWVzc2FnZXNBUEkuVGV4dERlbHRhQmxvY2s7XG4gIGV4cG9ydCBpbXBvcnQgTWVzc2FnZXNQYWdlID0gTWVzc2FnZXNBUEkuTWVzc2FnZXNQYWdlO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VDcmVhdGVQYXJhbXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VVcGRhdGVQYXJhbXMgPSBNZXNzYWdlc0FQSS5NZXNzYWdlVXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VMaXN0UGFyYW1zID0gTWVzc2FnZXNBUEkuTWVzc2FnZUxpc3RQYXJhbXM7XG59XG4iLCAiLyoqXG4gKiBMaWtlIGBQcm9taXNlLmFsbFNldHRsZWQoKWAgYnV0IHRocm93cyBhbiBlcnJvciBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuICovXG5leHBvcnQgY29uc3QgYWxsU2V0dGxlZFdpdGhUaHJvdyA9IGFzeW5jIDxSPihwcm9taXNlczogUHJvbWlzZTxSPltdKTogUHJvbWlzZTxSW10+ID0+IHtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwcm9taXNlcyk7XG4gIGNvbnN0IHJlamVjdGVkID0gcmVzdWx0cy5maWx0ZXIoKHJlc3VsdCk6IHJlc3VsdCBpcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJyk7XG4gIGlmIChyZWplY3RlZC5sZW5ndGgpIHtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZWplY3RlZCkge1xuICAgICAgY29uc29sZS5lcnJvcihyZXN1bHQucmVhc29uKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cmVqZWN0ZWQubGVuZ3RofSBwcm9taXNlKHMpIGZhaWxlZCAtIHNlZSB0aGUgYWJvdmUgZXJyb3JzYCk7XG4gIH1cblxuICAvLyBOb3RlOiBUUyB3YXMgY29tcGxhaW5pbmcgYWJvdXQgdXNpbmcgYC5maWx0ZXIoKS5tYXAoKWAgaGVyZSBmb3Igc29tZSByZWFzb25cbiAgY29uc3QgdmFsdWVzOiBSW10gPSBbXTtcbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgdmFsdWVzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn07XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vLi4vLi4vcmVzb3VyY2VcIjtcbmltcG9ydCB7IGlzUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgc2xlZXAsIFVwbG9hZGFibGUgfSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0ICogYXMgRmlsZXNBUEkgZnJvbSBcIi4vZmlsZXNcIjtcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9wYWdpbmF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBGaWxlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZlY3RvciBzdG9yZSBmaWxlIGJ5IGF0dGFjaGluZyBhXG4gICAqIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSB0byBhXG4gICAqIFt2ZWN0b3Igc3RvcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvdmVjdG9yLXN0b3Jlcy9vYmplY3QpLlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBib2R5OiBGaWxlQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVzYCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHZlY3RvciBzdG9yZSBmaWxlLlxuICAgKi9cbiAgcmV0cmlldmUoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGZpbGVJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZXMvJHtmaWxlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdmVjdG9yIHN0b3JlIGZpbGVzLlxuICAgKi9cbiAgbGlzdChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgcXVlcnk/OiBGaWxlTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgVmVjdG9yU3RvcmVGaWxlPjtcbiAgbGlzdChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVGaWxlc1BhZ2UsIFZlY3RvclN0b3JlRmlsZT47XG4gIGxpc3QoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBGaWxlTGlzdFBhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgVmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHZlY3RvclN0b3JlSWQsIHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfS9maWxlc2AsIFZlY3RvclN0b3JlRmlsZXNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHZlY3RvciBzdG9yZSBmaWxlLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIHZlY3RvciBzdG9yZSBidXRcbiAgICogdGhlIGZpbGUgaXRzZWxmIHdpbGwgbm90IGJlIGRlbGV0ZWQuIFRvIGRlbGV0ZSB0aGUgZmlsZSwgdXNlIHRoZVxuICAgKiBbZGVsZXRlIGZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMvZGVsZXRlKVxuICAgKiBlbmRwb2ludC5cbiAgICovXG4gIGRlbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgZmlsZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVEZWxldGVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5kZWxldGUoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZXMvJHtmaWxlSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGEgZmlsZSB0byB0aGUgZ2l2ZW4gdmVjdG9yIHN0b3JlIGFuZCB3YWl0IGZvciBpdCB0byBiZSBwcm9jZXNzZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVBbmRQb2xsKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBib2R5OiBGaWxlQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFZlY3RvclN0b3JlRmlsZT4ge1xuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmNyZWF0ZSh2ZWN0b3JTdG9yZUlkLCBib2R5LCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xsKHZlY3RvclN0b3JlSWQsIGZpbGUuaWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIHRoZSB2ZWN0b3Igc3RvcmUgZmlsZSB0byBmaW5pc2ggcHJvY2Vzc2luZy5cbiAgICpcbiAgICogTm90ZTogdGhpcyB3aWxsIHJldHVybiBldmVuIGlmIHRoZSBmaWxlIGZhaWxlZCB0byBwcm9jZXNzLCB5b3UgbmVlZCB0byBjaGVja1xuICAgKiBmaWxlLmxhc3RfZXJyb3IgYW5kIGZpbGUuc3RhdHVzIHRvIGhhbmRsZSB0aGVzZSBjYXNlc1xuICAgKi9cbiAgYXN5bmMgcG9sbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgZmlsZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgY29uc3QgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHsgLi4ub3B0aW9ucz8uaGVhZGVycywgJ1gtU3RhaW5sZXNzLVBvbGwtSGVscGVyJzogJ3RydWUnIH07XG4gICAgaWYgKG9wdGlvbnM/LnBvbGxJbnRlcnZhbE1zKSB7XG4gICAgICBoZWFkZXJzWydYLVN0YWlubGVzcy1DdXN0b20tUG9sbC1JbnRlcnZhbCddID0gb3B0aW9ucy5wb2xsSW50ZXJ2YWxNcy50b1N0cmluZygpO1xuICAgIH1cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgZmlsZVJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXRyaWV2ZSh2ZWN0b3JTdG9yZUlkLCBmaWxlSWQsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgIH0pLndpdGhSZXNwb25zZSgpO1xuXG4gICAgICBjb25zdCBmaWxlID0gZmlsZVJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIHN3aXRjaCAoZmlsZS5zdGF0dXMpIHtcbiAgICAgICAgY2FzZSAnaW5fcHJvZ3Jlc3MnOlxuICAgICAgICAgIGxldCBzbGVlcEludGVydmFsID0gNTAwMDtcblxuICAgICAgICAgIGlmIChvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcykge1xuICAgICAgICAgICAgc2xlZXBJbnRlcnZhbCA9IG9wdGlvbnMucG9sbEludGVydmFsTXM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlckludGVydmFsID0gZmlsZVJlc3BvbnNlLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdvcGVuYWktcG9sbC1hZnRlci1tcycpO1xuICAgICAgICAgICAgaWYgKGhlYWRlckludGVydmFsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckludGVydmFsTXMgPSBwYXJzZUludChoZWFkZXJJbnRlcnZhbCk7XG4gICAgICAgICAgICAgIGlmICghaXNOYU4oaGVhZGVySW50ZXJ2YWxNcykpIHtcbiAgICAgICAgICAgICAgICBzbGVlcEludGVydmFsID0gaGVhZGVySW50ZXJ2YWxNcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzbGVlcChzbGVlcEludGVydmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIGEgZmlsZSB0byB0aGUgYGZpbGVzYCBBUEkgYW5kIHRoZW4gYXR0YWNoIGl0IHRvIHRoZSBnaXZlbiB2ZWN0b3Igc3RvcmUuXG4gICAqXG4gICAqIE5vdGUgdGhlIGZpbGUgd2lsbCBiZSBhc3luY2hyb25vdXNseSBwcm9jZXNzZWQgKHlvdSBjYW4gdXNlIHRoZSBhbHRlcm5hdGl2ZVxuICAgKiBwb2xsaW5nIGhlbHBlciBtZXRob2QgdG8gd2FpdCBmb3IgcHJvY2Vzc2luZyB0byBjb21wbGV0ZSkuXG4gICAqL1xuICBhc3luYyB1cGxvYWQoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGZpbGU6IFVwbG9hZGFibGUsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgY29uc3QgZmlsZUluZm8gPSBhd2FpdCB0aGlzLl9jbGllbnQuZmlsZXMuY3JlYXRlKHsgZmlsZTogZmlsZSwgcHVycG9zZTogJ2Fzc2lzdGFudHMnIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZSh2ZWN0b3JTdG9yZUlkLCB7IGZpbGVfaWQ6IGZpbGVJbmZvLmlkIH0sIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGZpbGUgdG8gYSB2ZWN0b3Igc3RvcmUgYW5kIHBvbGwgdW50aWwgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHVwbG9hZEFuZFBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGZpbGU6IFVwbG9hZGFibGUsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyIH0sXG4gICk6IFByb21pc2U8VmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgY29uc3QgZmlsZUluZm8gPSBhd2FpdCB0aGlzLnVwbG9hZCh2ZWN0b3JTdG9yZUlkLCBmaWxlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xsKHZlY3RvclN0b3JlSWQsIGZpbGVJbmZvLmlkLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmVjdG9yU3RvcmVGaWxlc1BhZ2UgZXh0ZW5kcyBDdXJzb3JQYWdlPFZlY3RvclN0b3JlRmlsZT4ge31cblxuLyoqXG4gKiBBIGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gYSB2ZWN0b3Igc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVGaWxlIHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgdmVjdG9yIHN0b3JlIGZpbGUgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkX2F0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IGVycm9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZlY3RvciBzdG9yZSBmaWxlLiBXaWxsIGJlIGBudWxsYCBpZiB0aGVyZVxuICAgKiBhcmUgbm8gZXJyb3JzLlxuICAgKi9cbiAgbGFzdF9lcnJvcjogVmVjdG9yU3RvcmVGaWxlLkxhc3RFcnJvciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB2ZWN0b3Jfc3RvcmUuZmlsZWAuXG4gICAqL1xuICBvYmplY3Q6ICd2ZWN0b3Jfc3RvcmUuZmlsZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHZlY3RvciBzdG9yZSBmaWxlLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBpbl9wcm9ncmVzc2AsXG4gICAqIGBjb21wbGV0ZWRgLCBgY2FuY2VsbGVkYCwgb3IgYGZhaWxlZGAuIFRoZSBzdGF0dXMgYGNvbXBsZXRlZGAgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIHZlY3RvciBzdG9yZSBmaWxlIGlzIHJlYWR5IGZvciB1c2UuXG4gICAqL1xuICBzdGF0dXM6ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJyB8ICdjYW5jZWxsZWQnIHwgJ2ZhaWxlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCB2ZWN0b3Igc3RvcmUgdXNhZ2UgaW4gYnl0ZXMuIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGVcbiAgICogb3JpZ2luYWwgZmlsZSBzaXplLlxuICAgKi9cbiAgdXNhZ2VfYnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZVxuICAgKiBbdmVjdG9yIHN0b3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL3ZlY3Rvci1zdG9yZXMvb2JqZWN0KVxuICAgKiB0aGF0IHRoZSBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgaXNcbiAgICogYXR0YWNoZWQgdG8uXG4gICAqL1xuICB2ZWN0b3Jfc3RvcmVfaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBWZWN0b3JTdG9yZUZpbGUge1xuICAvKipcbiAgICogVGhlIGxhc3QgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmVjdG9yIHN0b3JlIGZpbGUuIFdpbGwgYmUgYG51bGxgIGlmIHRoZXJlXG4gICAqIGFyZSBubyBlcnJvcnMuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIExhc3RFcnJvciB7XG4gICAgLyoqXG4gICAgICogT25lIG9mIGBzZXJ2ZXJfZXJyb3JgIG9yIGByYXRlX2xpbWl0X2V4Y2VlZGVkYC5cbiAgICAgKi9cbiAgICBjb2RlOiAnaW50ZXJuYWxfZXJyb3InIHwgJ2ZpbGVfbm90X2ZvdW5kJyB8ICdwYXJzaW5nX2Vycm9yJyB8ICd1bmhhbmRsZWRfbWltZV90eXBlJztcblxuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqL1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlRmlsZURlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiAndmVjdG9yX3N0b3JlLmZpbGUuZGVsZXRlZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUNyZWF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRCB0aGF0IHRoZVxuICAgKiB2ZWN0b3Igc3RvcmUgc2hvdWxkIHVzZS4gVXNlZnVsIGZvciB0b29scyBsaWtlIGBmaWxlX3NlYXJjaGAgdGhhdCBjYW4gYWNjZXNzXG4gICAqIGZpbGVzLlxuICAgKi9cbiAgZmlsZV9pZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGN1cnNvciBmb3IgdXNlIGluIHBhZ2luYXRpb24uIGBiZWZvcmVgIGlzIGFuIG9iamVjdCBJRCB0aGF0IGRlZmluZXMgeW91ciBwbGFjZVxuICAgKiBpbiB0aGUgbGlzdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UgbWFrZSBhIGxpc3QgcmVxdWVzdCBhbmQgcmVjZWl2ZSAxMDAgb2JqZWN0cyxcbiAgICogZW5kaW5nIHdpdGggb2JqX2ZvbywgeW91ciBzdWJzZXF1ZW50IGNhbGwgY2FuIGluY2x1ZGUgYmVmb3JlPW9ial9mb28gaW4gb3JkZXIgdG9cbiAgICogZmV0Y2ggdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGxpc3QuXG4gICAqL1xuICBiZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBmaWxlIHN0YXR1cy4gT25lIG9mIGBpbl9wcm9ncmVzc2AsIGBjb21wbGV0ZWRgLCBgZmFpbGVkYCwgYGNhbmNlbGxlZGAuXG4gICAqL1xuICBmaWx0ZXI/OiAnaW5fcHJvZ3Jlc3MnIHwgJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyB8ICdjYW5jZWxsZWQnO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIG9mIHRoZSBvYmplY3RzLiBgYXNjYCBmb3IgYXNjZW5kaW5nXG4gICAqIG9yZGVyIGFuZCBgZGVzY2AgZm9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbGVzIHtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUZpbGUgPSBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGU7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlRGVsZXRlZCA9IEZpbGVzQVBJLlZlY3RvclN0b3JlRmlsZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlc1BhZ2UgPSBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQ3JlYXRlUGFyYW1zID0gRmlsZXNBUEkuRmlsZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlTGlzdFBhcmFtcyA9IEZpbGVzQVBJLkZpbGVMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IFVwbG9hZGFibGUgfSBmcm9tIFwiLi4vLi4vLi4vY29yZVwiO1xuaW1wb3J0IHsgYWxsU2V0dGxlZFdpdGhUaHJvdyB9IGZyb20gXCIuLi8uLi8uLi9saWIvVXRpbFwiO1xuaW1wb3J0ICogYXMgRmlsZUJhdGNoZXNBUEkgZnJvbSBcIi4vZmlsZS1iYXRjaGVzXCI7XG5pbXBvcnQgKiBhcyBGaWxlc0FQSSBmcm9tIFwiLi9maWxlc1wiO1xuaW1wb3J0IHsgVmVjdG9yU3RvcmVGaWxlc1BhZ2UgfSBmcm9tIFwiLi9maWxlc1wiO1xuaW1wb3J0IHsgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL3BhZ2luYXRpb25cIjtcblxuZXhwb3J0IGNsYXNzIEZpbGVCYXRjaGVzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgdmVjdG9yIHN0b3JlIGZpbGUgYmF0Y2guXG4gICAqL1xuICBjcmVhdGUoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJvZHk6IEZpbGVCYXRjaENyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlRmlsZUJhdGNoPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVfYmF0Y2hlc2AsIHtcbiAgICAgIGJvZHksXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSB2ZWN0b3Igc3RvcmUgZmlsZSBiYXRjaC5cbiAgICovXG4gIHJldHJpZXZlKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBiYXRjaElkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9L2ZpbGVfYmF0Y2hlcy8ke2JhdGNoSWR9YCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGEgdmVjdG9yIHN0b3JlIGZpbGUgYmF0Y2guIFRoaXMgYXR0ZW1wdHMgdG8gY2FuY2VsIHRoZSBwcm9jZXNzaW5nIG9mXG4gICAqIGZpbGVzIGluIHRoaXMgYmF0Y2ggYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICovXG4gIGNhbmNlbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYmF0Y2hJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVGaWxlQmF0Y2g+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZV9iYXRjaGVzLyR7YmF0Y2hJZH0vY2FuY2VsYCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdmVjdG9yIHN0b3JlIGJhdGNoIGFuZCBwb2xsIHVudGlsIGFsbCBmaWxlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQW5kUG9sbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYm9keTogRmlsZUJhdGNoQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zICYgeyBwb2xsSW50ZXJ2YWxNcz86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFZlY3RvclN0b3JlRmlsZUJhdGNoPiB7XG4gICAgY29uc3QgYmF0Y2ggPSBhd2FpdCB0aGlzLmNyZWF0ZSh2ZWN0b3JTdG9yZUlkLCBib2R5KTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wb2xsKHZlY3RvclN0b3JlSWQsIGJhdGNoLmlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB2ZWN0b3Igc3RvcmUgZmlsZXMgaW4gYSBiYXRjaC5cbiAgICovXG4gIGxpc3RGaWxlcyhcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgYmF0Y2hJZDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogRmlsZUJhdGNoTGlzdEZpbGVzUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3JlRmlsZXNQYWdlLCBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGU+O1xuICBsaXN0RmlsZXMoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJhdGNoSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlPjtcbiAgbGlzdEZpbGVzKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBiYXRjaElkOiBzdHJpbmcsXG4gICAgcXVlcnk6IEZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcyB8IENvcmUuUmVxdWVzdE9wdGlvbnMgPSB7fSxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVzUGFnZSwgRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlPiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0RmlsZXModmVjdG9yU3RvcmVJZCwgYmF0Y2hJZCwge30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KFxuICAgICAgYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH0vZmlsZV9iYXRjaGVzLyR7YmF0Y2hJZH0vZmlsZXNgLFxuICAgICAgVmVjdG9yU3RvcmVGaWxlc1BhZ2UsXG4gICAgICB7IHF1ZXJ5LCAuLi5vcHRpb25zLCBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9IH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IGZvciB0aGUgZ2l2ZW4gZmlsZSBiYXRjaCB0byBiZSBwcm9jZXNzZWQuXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgd2lsbCByZXR1cm4gZXZlbiBpZiBvbmUgb2YgdGhlIGZpbGVzIGZhaWxlZCB0byBwcm9jZXNzLCB5b3UgbmVlZCB0b1xuICAgKiBjaGVjayBiYXRjaC5maWxlX2NvdW50cy5mYWlsZWRfY291bnQgdG8gaGFuZGxlIHRoaXMgY2FzZS5cbiAgICovXG4gIGFzeW5jIHBvbGwoXG4gICAgdmVjdG9yU3RvcmVJZDogc3RyaW5nLFxuICAgIGJhdGNoSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyAmIHsgcG9sbEludGVydmFsTXM/OiBudW1iZXIgfSxcbiAgKTogUHJvbWlzZTxWZWN0b3JTdG9yZUZpbGVCYXRjaD4ge1xuICAgIGNvbnN0IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7IC4uLm9wdGlvbnM/LmhlYWRlcnMsICdYLVN0YWlubGVzcy1Qb2xsLUhlbHBlcic6ICd0cnVlJyB9O1xuICAgIGlmIChvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcykge1xuICAgICAgaGVhZGVyc1snWC1TdGFpbmxlc3MtQ3VzdG9tLVBvbGwtSW50ZXJ2YWwnXSA9IG9wdGlvbnMucG9sbEludGVydmFsTXMudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkYXRhOiBiYXRjaCwgcmVzcG9uc2UgfSA9IGF3YWl0IHRoaXMucmV0cmlldmUodmVjdG9yU3RvcmVJZCwgYmF0Y2hJZCwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgfSkud2l0aFJlc3BvbnNlKCk7XG5cbiAgICAgIHN3aXRjaCAoYmF0Y2guc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJ2luX3Byb2dyZXNzJzpcbiAgICAgICAgICBsZXQgc2xlZXBJbnRlcnZhbCA9IDUwMDA7XG5cbiAgICAgICAgICBpZiAob3B0aW9ucz8ucG9sbEludGVydmFsTXMpIHtcbiAgICAgICAgICAgIHNsZWVwSW50ZXJ2YWwgPSBvcHRpb25zLnBvbGxJbnRlcnZhbE1zO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJJbnRlcnZhbCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdvcGVuYWktcG9sbC1hZnRlci1tcycpO1xuICAgICAgICAgICAgaWYgKGhlYWRlckludGVydmFsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRlckludGVydmFsTXMgPSBwYXJzZUludChoZWFkZXJJbnRlcnZhbCk7XG4gICAgICAgICAgICAgIGlmICghaXNOYU4oaGVhZGVySW50ZXJ2YWxNcykpIHtcbiAgICAgICAgICAgICAgICBzbGVlcEludGVydmFsID0gaGVhZGVySW50ZXJ2YWxNcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBzbGVlcChzbGVlcEludGVydmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgICByZXR1cm4gYmF0Y2g7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgdGhlIGdpdmVuIGZpbGVzIGNvbmN1cnJlbnRseSBhbmQgdGhlbiBjcmVhdGVzIGEgdmVjdG9yIHN0b3JlIGZpbGUgYmF0Y2guXG4gICAqXG4gICAqIFRoZSBjb25jdXJyZW5jeSBsaW1pdCBpcyBjb25maWd1cmFibGUgdXNpbmcgdGhlIGBtYXhDb25jdXJyZW5jeWAgcGFyYW1ldGVyLlxuICAgKi9cbiAgYXN5bmMgdXBsb2FkQW5kUG9sbChcbiAgICB2ZWN0b3JTdG9yZUlkOiBzdHJpbmcsXG4gICAgeyBmaWxlcywgZmlsZUlkcyA9IFtdIH06IHsgZmlsZXM6IFVwbG9hZGFibGVbXTsgZmlsZUlkcz86IHN0cmluZ1tdIH0sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMgJiB7IHBvbGxJbnRlcnZhbE1zPzogbnVtYmVyOyBtYXhDb25jdXJyZW5jeT86IG51bWJlciB9LFxuICApOiBQcm9taXNlPFZlY3RvclN0b3JlRmlsZUJhdGNoPiB7XG4gICAgaWYgKGZpbGVzID09PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGZpbGVzIHByb3ZpZGVkIHRvIHByb2Nlc3MuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlndXJlZENvbmN1cnJlbmN5ID0gb3B0aW9ucz8ubWF4Q29uY3VycmVuY3kgPz8gNTtcbiAgICAvL1dlIGNhcCB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgYXQgdGhlIG51bWJlciBvZiBmaWxlcyAoc28gd2UgZG9uJ3Qgc3RhcnQgYW55IHVubmVjZXNzYXJ5IHdvcmtlcnMpXG4gICAgY29uc3QgY29uY3VycmVuY3lMaW1pdCA9IE1hdGgubWluKGNvbmZpZ3VyZWRDb25jdXJyZW5jeSwgZmlsZXMubGVuZ3RoKTtcblxuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuX2NsaWVudDtcbiAgICBjb25zdCBmaWxlSXRlcmF0b3IgPSBmaWxlcy52YWx1ZXMoKTtcbiAgICBjb25zdCBhbGxGaWxlSWRzOiBzdHJpbmdbXSA9IFsuLi5maWxlSWRzXTtcblxuICAgIC8vVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoaXMgZGVzaWduLiBUaGUgbGlicmFyaWVzIGRvbid0IGFjY29tbW9kYXRlIG91ciBlbnZpcm9ubWVudCBsaW1pdHMuXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDA2Mzk0MzIvd2hhdC1pcy10aGUtYmVzdC13YXktdG8tbGltaXQtY29uY3VycmVuY3ktd2hlbi11c2luZy1lczZzLXByb21pc2UtYWxsXG4gICAgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0ZpbGVzKGl0ZXJhdG9yOiBJdGVyYWJsZUl0ZXJhdG9yPFVwbG9hZGFibGU+KSB7XG4gICAgICBmb3IgKGxldCBpdGVtIG9mIGl0ZXJhdG9yKSB7XG4gICAgICAgIGNvbnN0IGZpbGVPYmogPSBhd2FpdCBjbGllbnQuZmlsZXMuY3JlYXRlKHsgZmlsZTogaXRlbSwgcHVycG9zZTogJ2Fzc2lzdGFudHMnIH0sIG9wdGlvbnMpO1xuICAgICAgICBhbGxGaWxlSWRzLnB1c2goZmlsZU9iai5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9TdGFydCB3b3JrZXJzIHRvIHByb2Nlc3MgcmVzdWx0c1xuICAgIGNvbnN0IHdvcmtlcnMgPSBBcnJheShjb25jdXJyZW5jeUxpbWl0KS5maWxsKGZpbGVJdGVyYXRvcikubWFwKHByb2Nlc3NGaWxlcyk7XG5cbiAgICAvL1dhaXQgZm9yIGFsbCBwcm9jZXNzaW5nIHRvIGNvbXBsZXRlLlxuICAgIGF3YWl0IGFsbFNldHRsZWRXaXRoVGhyb3cod29ya2Vycyk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVBbmRQb2xsKHZlY3RvclN0b3JlSWQsIHtcbiAgICAgIGZpbGVfaWRzOiBhbGxGaWxlSWRzLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBiYXRjaCBvZiBmaWxlcyBhdHRhY2hlZCB0byBhIHZlY3RvciBzdG9yZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZUZpbGVCYXRjaCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHZlY3RvciBzdG9yZSBmaWxlcyBiYXRjaCB3YXNcbiAgICogY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICBmaWxlX2NvdW50czogVmVjdG9yU3RvcmVGaWxlQmF0Y2guRmlsZUNvdW50cztcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgYHZlY3Rvcl9zdG9yZS5maWxlX2JhdGNoYC5cbiAgICovXG4gIG9iamVjdDogJ3ZlY3Rvcl9zdG9yZS5maWxlc19iYXRjaCc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIHZlY3RvciBzdG9yZSBmaWxlcyBiYXRjaCwgd2hpY2ggY2FuIGJlIGVpdGhlciBgaW5fcHJvZ3Jlc3NgLFxuICAgKiBgY29tcGxldGVkYCwgYGNhbmNlbGxlZGAgb3IgYGZhaWxlZGAuXG4gICAqL1xuICBzdGF0dXM6ICdpbl9wcm9ncmVzcycgfCAnY29tcGxldGVkJyB8ICdjYW5jZWxsZWQnIHwgJ2ZhaWxlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGVcbiAgICogW3ZlY3RvciBzdG9yZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS92ZWN0b3Itc3RvcmVzL29iamVjdClcbiAgICogdGhhdCB0aGUgW0ZpbGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvZmlsZXMpIGlzXG4gICAqIGF0dGFjaGVkIHRvLlxuICAgKi9cbiAgdmVjdG9yX3N0b3JlX2lkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVmVjdG9yU3RvcmVGaWxlQmF0Y2gge1xuICBleHBvcnQgaW50ZXJmYWNlIEZpbGVDb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCB3aGVyZSBjYW5jZWxsZWQuXG4gICAgICovXG4gICAgY2FuY2VsbGVkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBjb21wbGV0ZWQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBoYXZlIGZhaWxlZCB0byBwcm9jZXNzLlxuICAgICAqL1xuICAgIGZhaWxlZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqL1xuICAgIGluX3Byb2dyZXNzOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGZpbGVzLlxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQmF0Y2hDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIFtGaWxlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzKSBJRHMgdGhhdFxuICAgKiB0aGUgdmVjdG9yIHN0b3JlIHNob3VsZCB1c2UuIFVzZWZ1bCBmb3IgdG9vbHMgbGlrZSBgZmlsZV9zZWFyY2hgIHRoYXQgY2FuIGFjY2Vzc1xuICAgKiBmaWxlcy5cbiAgICovXG4gIGZpbGVfaWRzOiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge1xuICAvKipcbiAgICogQSBjdXJzb3IgZm9yIHVzZSBpbiBwYWdpbmF0aW9uLiBgYmVmb3JlYCBpcyBhbiBvYmplY3QgSUQgdGhhdCBkZWZpbmVzIHlvdXIgcGxhY2VcbiAgICogaW4gdGhlIGxpc3QuIEZvciBpbnN0YW5jZSwgaWYgeW91IG1ha2UgYSBsaXN0IHJlcXVlc3QgYW5kIHJlY2VpdmUgMTAwIG9iamVjdHMsXG4gICAqIGVuZGluZyB3aXRoIG9ial9mb28sIHlvdXIgc3Vic2VxdWVudCBjYWxsIGNhbiBpbmNsdWRlIGJlZm9yZT1vYmpfZm9vIGluIG9yZGVyIHRvXG4gICAqIGZldGNoIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBsaXN0LlxuICAgKi9cbiAgYmVmb3JlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgZmlsZSBzdGF0dXMuIE9uZSBvZiBgaW5fcHJvZ3Jlc3NgLCBgY29tcGxldGVkYCwgYGZhaWxlZGAsIGBjYW5jZWxsZWRgLlxuICAgKi9cbiAgZmlsdGVyPzogJ2luX3Byb2dyZXNzJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJztcblxuICAvKipcbiAgICogU29ydCBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWVzdGFtcCBvZiB0aGUgb2JqZWN0cy4gYGFzY2AgZm9yIGFzY2VuZGluZ1xuICAgKiBvcmRlciBhbmQgYGRlc2NgIGZvciBkZXNjZW5kaW5nIG9yZGVyLlxuICAgKi9cbiAgb3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaWxlQmF0Y2hlcyB7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlQmF0Y2ggPSBGaWxlQmF0Y2hlc0FQSS5WZWN0b3JTdG9yZUZpbGVCYXRjaDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlQmF0Y2hDcmVhdGVQYXJhbXMgPSBGaWxlQmF0Y2hlc0FQSS5GaWxlQmF0Y2hDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUJhdGNoTGlzdEZpbGVzUGFyYW1zID0gRmlsZUJhdGNoZXNBUEkuRmlsZUJhdGNoTGlzdEZpbGVzUGFyYW1zO1xufVxuXG5leHBvcnQgeyBWZWN0b3JTdG9yZUZpbGVzUGFnZSB9O1xuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCAqIGFzIFZlY3RvclN0b3Jlc0FQSSBmcm9tIFwiLi92ZWN0b3Itc3RvcmVzXCI7XG5pbXBvcnQgKiBhcyBGaWxlQmF0Y2hlc0FQSSBmcm9tIFwiLi9maWxlLWJhdGNoZXNcIjtcbmltcG9ydCAqIGFzIEZpbGVzQVBJIGZyb20gXCIuL2ZpbGVzXCI7XG5pbXBvcnQgeyBDdXJzb3JQYWdlLCB0eXBlIEN1cnNvclBhZ2VQYXJhbXMgfSBmcm9tIFwiLi4vLi4vLi4vcGFnaW5hdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgVmVjdG9yU3RvcmVzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBmaWxlczogRmlsZXNBUEkuRmlsZXMgPSBuZXcgRmlsZXNBUEkuRmlsZXModGhpcy5fY2xpZW50KTtcbiAgZmlsZUJhdGNoZXM6IEZpbGVCYXRjaGVzQVBJLkZpbGVCYXRjaGVzID0gbmV3IEZpbGVCYXRjaGVzQVBJLkZpbGVCYXRjaGVzKHRoaXMuX2NsaWVudCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBWZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmU+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy92ZWN0b3Jfc3RvcmVzJywge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIHJldHJpZXZlKHZlY3RvclN0b3JlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmU+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL3ZlY3Rvcl9zdG9yZXMvJHt2ZWN0b3JTdG9yZUlkfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgdXBkYXRlKFxuICAgIHZlY3RvclN0b3JlSWQ6IHN0cmluZyxcbiAgICBib2R5OiBWZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPFZlY3RvclN0b3JlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KGAvdmVjdG9yX3N0b3Jlcy8ke3ZlY3RvclN0b3JlSWR9YCwge1xuICAgICAgYm9keSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7ICdPcGVuQUktQmV0YSc6ICdhc3Npc3RhbnRzPXYyJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHZlY3RvciBzdG9yZXMuXG4gICAqL1xuICBsaXN0KFxuICAgIHF1ZXJ5PzogVmVjdG9yU3RvcmVMaXN0UGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPFZlY3RvclN0b3Jlc1BhZ2UsIFZlY3RvclN0b3JlPjtcbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVzUGFnZSwgVmVjdG9yU3RvcmU+O1xuICBsaXN0KFxuICAgIHF1ZXJ5OiBWZWN0b3JTdG9yZUxpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8VmVjdG9yU3RvcmVzUGFnZSwgVmVjdG9yU3RvcmU+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3Qoe30sIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXRBUElMaXN0KCcvdmVjdG9yX3N0b3JlcycsIFZlY3RvclN0b3Jlc1BhZ2UsIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhlYWRlcnM6IHsgJ09wZW5BSS1CZXRhJzogJ2Fzc2lzdGFudHM9djInLCAuLi5vcHRpb25zPy5oZWFkZXJzIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgZGVsKHZlY3RvclN0b3JlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8VmVjdG9yU3RvcmVEZWxldGVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5kZWxldGUoYC92ZWN0b3Jfc3RvcmVzLyR7dmVjdG9yU3RvcmVJZH1gLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyAnT3BlbkFJLUJldGEnOiAnYXNzaXN0YW50cz12MicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmVjdG9yU3RvcmVzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8VmVjdG9yU3RvcmU+IHt9XG5cbi8qKlxuICogQSB2ZWN0b3Igc3RvcmUgaXMgYSBjb2xsZWN0aW9uIG9mIHByb2Nlc3NlZCBmaWxlcyBjYW4gYmUgdXNlZCBieSB0aGVcbiAqIGBmaWxlX3NlYXJjaGAgdG9vbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZSB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIHZlY3RvciBzdG9yZSB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICBmaWxlX2NvdW50czogVmVjdG9yU3RvcmUuRmlsZUNvdW50cztcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgdmVjdG9yIHN0b3JlIHdhcyBsYXN0IGFjdGl2ZS5cbiAgICovXG4gIGxhc3RfYWN0aXZlX2F0OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgMTYga2V5LXZhbHVlIHBhaXJzIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZnVsXG4gICAqIGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBpbiBhIHN0cnVjdHVyZWQgZm9ybWF0LiBLZXlzXG4gICAqIGNhbiBiZSBhIG1heGltdW0gb2YgNjQgY2hhcmFjdGVycyBsb25nIGFuZCB2YWx1ZXMgY2FuIGJlIGEgbWF4aXVtIG9mIDUxMlxuICAgKiBjaGFyYWN0ZXJzIGxvbmcuXG4gICAqL1xuICBtZXRhZGF0YTogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIGB2ZWN0b3Jfc3RvcmVgLlxuICAgKi9cbiAgb2JqZWN0OiAndmVjdG9yX3N0b3JlJztcblxuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgdmVjdG9yIHN0b3JlLCB3aGljaCBjYW4gYmUgZWl0aGVyIGBleHBpcmVkYCwgYGluX3Byb2dyZXNzYCwgb3JcbiAgICogYGNvbXBsZXRlZGAuIEEgc3RhdHVzIG9mIGBjb21wbGV0ZWRgIGluZGljYXRlcyB0aGF0IHRoZSB2ZWN0b3Igc3RvcmUgaXMgcmVhZHlcbiAgICogZm9yIHVzZS5cbiAgICovXG4gIHN0YXR1czogJ2V4cGlyZWQnIHwgJ2luX3Byb2dyZXNzJyB8ICdjb21wbGV0ZWQnO1xuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgdGhlIGZpbGVzIGluIHRoZSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICB1c2FnZV9ieXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwaXJhdGlvbiBwb2xpY3kgZm9yIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgZXhwaXJlc19hZnRlcj86IFZlY3RvclN0b3JlLkV4cGlyZXNBZnRlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgdmVjdG9yIHN0b3JlIHdpbGwgZXhwaXJlLlxuICAgKi9cbiAgZXhwaXJlc19hdD86IG51bWJlciB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVmVjdG9yU3RvcmUge1xuICBleHBvcnQgaW50ZXJmYWNlIEZpbGVDb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCB3ZXJlIGNhbmNlbGxlZC5cbiAgICAgKi9cbiAgICBjYW5jZWxsZWQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBjb21wbGV0ZWQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBoYXZlIGZhaWxlZCB0byBwcm9jZXNzLlxuICAgICAqL1xuICAgIGZhaWxlZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqL1xuICAgIGluX3Byb2dyZXNzOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGZpbGVzLlxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGV4cGlyYXRpb24gcG9saWN5IGZvciBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRXhwaXJlc0FmdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbmNob3IgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSBleHBpcmF0aW9uIHBvbGljeSBhcHBsaWVzLiBTdXBwb3J0ZWQgYW5jaG9yczpcbiAgICAgKiBgbGFzdF9hY3RpdmVfYXRgLlxuICAgICAqL1xuICAgIGFuY2hvcjogJ2xhc3RfYWN0aXZlX2F0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBhZnRlciB0aGUgYW5jaG9yIHRpbWUgdGhhdCB0aGUgdmVjdG9yIHN0b3JlIHdpbGwgZXhwaXJlLlxuICAgICAqL1xuICAgIGRheXM6IG51bWJlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlY3RvclN0b3JlRGVsZXRlZCB7XG4gIGlkOiBzdHJpbmc7XG5cbiAgZGVsZXRlZDogYm9vbGVhbjtcblxuICBvYmplY3Q6ICd2ZWN0b3Jfc3RvcmUuZGVsZXRlZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGV4cGlyYXRpb24gcG9saWN5IGZvciBhIHZlY3RvciBzdG9yZS5cbiAgICovXG4gIGV4cGlyZXNfYWZ0ZXI/OiBWZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcy5FeHBpcmVzQWZ0ZXI7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBbRmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcykgSURzIHRoYXRcbiAgICogdGhlIHZlY3RvciBzdG9yZSBzaG91bGQgdXNlLiBVc2VmdWwgZm9yIHRvb2xzIGxpa2UgYGZpbGVfc2VhcmNoYCB0aGF0IGNhbiBhY2Nlc3NcbiAgICogZmlsZXMuXG4gICAqL1xuICBmaWxlX2lkcz86IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFZlY3RvclN0b3JlQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBleHBpcmF0aW9uIHBvbGljeSBmb3IgYSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEV4cGlyZXNBZnRlciB7XG4gICAgLyoqXG4gICAgICogQW5jaG9yIHRpbWVzdGFtcCBhZnRlciB3aGljaCB0aGUgZXhwaXJhdGlvbiBwb2xpY3kgYXBwbGllcy4gU3VwcG9ydGVkIGFuY2hvcnM6XG4gICAgICogYGxhc3RfYWN0aXZlX2F0YC5cbiAgICAgKi9cbiAgICBhbmNob3I6ICdsYXN0X2FjdGl2ZV9hdCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgYWZ0ZXIgdGhlIGFuY2hvciB0aW1lIHRoYXQgdGhlIHZlY3RvciBzdG9yZSB3aWxsIGV4cGlyZS5cbiAgICAgKi9cbiAgICBkYXlzOiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZXhwaXJhdGlvbiBwb2xpY3kgZm9yIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgZXhwaXJlc19hZnRlcj86IFZlY3RvclN0b3JlVXBkYXRlUGFyYW1zLkV4cGlyZXNBZnRlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvZiAxNiBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWxcbiAgICogZm9yIHN0b3JpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGluIGEgc3RydWN0dXJlZCBmb3JtYXQuIEtleXNcbiAgICogY2FuIGJlIGEgbWF4aW11bSBvZiA2NCBjaGFyYWN0ZXJzIGxvbmcgYW5kIHZhbHVlcyBjYW4gYmUgYSBtYXhpdW0gb2YgNTEyXG4gICAqIGNoYXJhY3RlcnMgbG9uZy5cbiAgICovXG4gIG1ldGFkYXRhPzogdW5rbm93biB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB2ZWN0b3Igc3RvcmUuXG4gICAqL1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBWZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZXhwaXJhdGlvbiBwb2xpY3kgZm9yIGEgdmVjdG9yIHN0b3JlLlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBFeHBpcmVzQWZ0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuY2hvciB0aW1lc3RhbXAgYWZ0ZXIgd2hpY2ggdGhlIGV4cGlyYXRpb24gcG9saWN5IGFwcGxpZXMuIFN1cHBvcnRlZCBhbmNob3JzOlxuICAgICAqIGBsYXN0X2FjdGl2ZV9hdGAuXG4gICAgICovXG4gICAgYW5jaG9yOiAnbGFzdF9hY3RpdmVfYXQnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIGFmdGVyIHRoZSBhbmNob3IgdGltZSB0aGF0IHRoZSB2ZWN0b3Igc3RvcmUgd2lsbCBleHBpcmUuXG4gICAgICovXG4gICAgZGF5czogbnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU3RvcmVMaXN0UGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGN1cnNvciBmb3IgdXNlIGluIHBhZ2luYXRpb24uIGBiZWZvcmVgIGlzIGFuIG9iamVjdCBJRCB0aGF0IGRlZmluZXMgeW91ciBwbGFjZVxuICAgKiBpbiB0aGUgbGlzdC4gRm9yIGluc3RhbmNlLCBpZiB5b3UgbWFrZSBhIGxpc3QgcmVxdWVzdCBhbmQgcmVjZWl2ZSAxMDAgb2JqZWN0cyxcbiAgICogZW5kaW5nIHdpdGggb2JqX2ZvbywgeW91ciBzdWJzZXF1ZW50IGNhbGwgY2FuIGluY2x1ZGUgYmVmb3JlPW9ial9mb28gaW4gb3JkZXIgdG9cbiAgICogZmV0Y2ggdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIGxpc3QuXG4gICAqL1xuICBiZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lc3RhbXAgb2YgdGhlIG9iamVjdHMuIGBhc2NgIGZvciBhc2NlbmRpbmdcbiAgICogb3JkZXIgYW5kIGBkZXNjYCBmb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogJ2FzYycgfCAnZGVzYyc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgVmVjdG9yU3RvcmVzIHtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZSA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZTtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZURlbGV0ZWQgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3Jlc1BhZ2UgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcyA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcyA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUxpc3RQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVMaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVzID0gRmlsZXNBUEkuRmlsZXM7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVGaWxlID0gRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZURlbGV0ZWQgPSBGaWxlc0FQSS5WZWN0b3JTdG9yZUZpbGVEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZXNQYWdlID0gRmlsZXNBUEkuVmVjdG9yU3RvcmVGaWxlc1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNyZWF0ZVBhcmFtcyA9IEZpbGVzQVBJLkZpbGVDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUxpc3RQYXJhbXMgPSBGaWxlc0FQSS5GaWxlTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBGaWxlQmF0Y2hlcyA9IEZpbGVCYXRjaGVzQVBJLkZpbGVCYXRjaGVzO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3JlRmlsZUJhdGNoID0gRmlsZUJhdGNoZXNBUEkuVmVjdG9yU3RvcmVGaWxlQmF0Y2g7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUJhdGNoQ3JlYXRlUGFyYW1zID0gRmlsZUJhdGNoZXNBUEkuRmlsZUJhdGNoQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcyA9IEZpbGVCYXRjaGVzQVBJLkZpbGVCYXRjaExpc3RGaWxlc1BhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgQXNzaXN0YW50c0FQSSBmcm9tIFwiLi9hc3Npc3RhbnRzXCI7XG5pbXBvcnQgKiBhcyBDaGF0QVBJIGZyb20gXCIuL2NoYXQvY2hhdFwiO1xuaW1wb3J0ICogYXMgVGhyZWFkc0FQSSBmcm9tIFwiLi90aHJlYWRzL3RocmVhZHNcIjtcbmltcG9ydCAqIGFzIFZlY3RvclN0b3Jlc0FQSSBmcm9tIFwiLi92ZWN0b3Itc3RvcmVzL3ZlY3Rvci1zdG9yZXNcIjtcblxuZXhwb3J0IGNsYXNzIEJldGEgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIHZlY3RvclN0b3JlczogVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlcyA9IG5ldyBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVzKHRoaXMuX2NsaWVudCk7XG4gIGNoYXQ6IENoYXRBUEkuQ2hhdCA9IG5ldyBDaGF0QVBJLkNoYXQodGhpcy5fY2xpZW50KTtcbiAgYXNzaXN0YW50czogQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRzID0gbmV3IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50cyh0aGlzLl9jbGllbnQpO1xuICB0aHJlYWRzOiBUaHJlYWRzQVBJLlRocmVhZHMgPSBuZXcgVGhyZWFkc0FQSS5UaHJlYWRzKHRoaXMuX2NsaWVudCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQmV0YSB7XG4gIGV4cG9ydCBpbXBvcnQgVmVjdG9yU3RvcmVzID0gVmVjdG9yU3RvcmVzQVBJLlZlY3RvclN0b3JlcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZSA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZTtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZURlbGV0ZWQgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IFZlY3RvclN0b3Jlc1BhZ2UgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcyA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZUNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcyA9IFZlY3RvclN0b3Jlc0FQSS5WZWN0b3JTdG9yZVVwZGF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBWZWN0b3JTdG9yZUxpc3RQYXJhbXMgPSBWZWN0b3JTdG9yZXNBUEkuVmVjdG9yU3RvcmVMaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENoYXQgPSBDaGF0QVBJLkNoYXQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50cyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50cztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnQgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnREZWxldGVkID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnREZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRTdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRUb29sID0gQXNzaXN0YW50c0FQSS5Bc3Npc3RhbnRUb29sO1xuICBleHBvcnQgaW1wb3J0IENvZGVJbnRlcnByZXRlclRvb2wgPSBBc3Npc3RhbnRzQVBJLkNvZGVJbnRlcnByZXRlclRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZVNlYXJjaFRvb2wgPSBBc3Npc3RhbnRzQVBJLkZpbGVTZWFyY2hUb29sO1xuICBleHBvcnQgaW1wb3J0IEZ1bmN0aW9uVG9vbCA9IEFzc2lzdGFudHNBUEkuRnVuY3Rpb25Ub29sO1xuICBleHBvcnQgaW1wb3J0IE1lc3NhZ2VTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuTWVzc2FnZVN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFJ1blN0ZXBTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuUnVuU3RlcFN0cmVhbUV2ZW50O1xuICBleHBvcnQgaW1wb3J0IFJ1blN0cmVhbUV2ZW50ID0gQXNzaXN0YW50c0FQSS5SdW5TdHJlYW1FdmVudDtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWRTdHJlYW1FdmVudCA9IEFzc2lzdGFudHNBUEkuVGhyZWFkU3RyZWFtRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50c1BhZ2UgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudHNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudENyZWF0ZVBhcmFtcyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50Q3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFVwZGF0ZVBhcmFtcyA9IEFzc2lzdGFudHNBUEkuQXNzaXN0YW50VXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudExpc3RQYXJhbXMgPSBBc3Npc3RhbnRzQVBJLkFzc2lzdGFudExpc3RQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkcyA9IFRocmVhZHNBUEkuVGhyZWFkcztcbiAgZXhwb3J0IGltcG9ydCBBc3Npc3RhbnRSZXNwb25zZUZvcm1hdCA9IFRocmVhZHNBUEkuQXNzaXN0YW50UmVzcG9uc2VGb3JtYXQ7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50UmVzcG9uc2VGb3JtYXRPcHRpb24gPSBUaHJlYWRzQVBJLkFzc2lzdGFudFJlc3BvbnNlRm9ybWF0T3B0aW9uO1xuICBleHBvcnQgaW1wb3J0IEFzc2lzdGFudFRvb2xDaG9pY2UgPSBUaHJlYWRzQVBJLkFzc2lzdGFudFRvb2xDaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VG9vbENob2ljZUZ1bmN0aW9uID0gVGhyZWFkc0FQSS5Bc3Npc3RhbnRUb29sQ2hvaWNlRnVuY3Rpb247XG4gIGV4cG9ydCBpbXBvcnQgQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbiA9IFRocmVhZHNBUEkuQXNzaXN0YW50VG9vbENob2ljZU9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWQgPSBUaHJlYWRzQVBJLlRocmVhZDtcbiAgZXhwb3J0IGltcG9ydCBUaHJlYWREZWxldGVkID0gVGhyZWFkc0FQSS5UaHJlYWREZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZVBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZFVwZGF0ZVBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkVXBkYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtcyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc05vblN0cmVhbWluZyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zTm9uU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blBhcmFtc1N0cmVhbWluZyA9IFRocmVhZHNBUEkuVGhyZWFkQ3JlYXRlQW5kUnVuUGFyYW1zU3RyZWFtaW5nO1xuICBleHBvcnQgaW1wb3J0IFRocmVhZENyZWF0ZUFuZFJ1blBvbGxQYXJhbXMgPSBUaHJlYWRzQVBJLlRocmVhZENyZWF0ZUFuZFJ1blBvbGxQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgVGhyZWFkQ3JlYXRlQW5kUnVuU3RyZWFtUGFyYW1zID0gVGhyZWFkc0FQSS5UaHJlYWRDcmVhdGVBbmRSdW5TdHJlYW1QYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUHJvbWlzZSB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgQ29tcGxldGlvbnNBUEkgZnJvbSBcIi4vY29tcGxldGlvbnNcIjtcbmltcG9ydCAqIGFzIENoYXRDb21wbGV0aW9uc0FQSSBmcm9tIFwiLi9jaGF0L2NvbXBsZXRpb25zXCI7XG5pbXBvcnQgeyBTdHJlYW0gfSBmcm9tIFwiLi4vc3RyZWFtaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBDb21wbGV0aW9ucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb21wbGV0aW9uIGZvciB0aGUgcHJvdmlkZWQgcHJvbXB0IGFuZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQVBJUHJvbWlzZTxDb21wbGV0aW9uPjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IEFQSVByb21pc2U8U3RyZWFtPENvbXBsZXRpb24+PjtcbiAgY3JlYXRlKFxuICAgIGJvZHk6IENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBBUElQcm9taXNlPFN0cmVhbTxDb21wbGV0aW9uPiB8IENvbXBsZXRpb24+O1xuICBjcmVhdGUoXG4gICAgYm9keTogQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQVBJUHJvbWlzZTxDb21wbGV0aW9uPiB8IEFQSVByb21pc2U8U3RyZWFtPENvbXBsZXRpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvY29tcGxldGlvbnMnLCB7IGJvZHksIC4uLm9wdGlvbnMsIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UgfSkgYXNcbiAgICAgIHwgQVBJUHJvbWlzZTxDb21wbGV0aW9uPlxuICAgICAgfCBBUElQcm9taXNlPFN0cmVhbTxDb21wbGV0aW9uPj47XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29tcGxldGlvbiByZXNwb25zZSBmcm9tIHRoZSBBUEkuIE5vdGU6IGJvdGggdGhlIHN0cmVhbWVkIGFuZFxuICogbm9uLXN0cmVhbWVkIHJlc3BvbnNlIG9iamVjdHMgc2hhcmUgdGhlIHNhbWUgc2hhcGUgKHVubGlrZSB0aGUgY2hhdCBlbmRwb2ludCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbiB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29tcGxldGlvbi5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGNvbXBsZXRpb24gY2hvaWNlcyB0aGUgbW9kZWwgZ2VuZXJhdGVkIGZvciB0aGUgaW5wdXQgcHJvbXB0LlxuICAgKi9cbiAgY2hvaWNlczogQXJyYXk8Q29tcGxldGlvbkNob2ljZT47XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgb2Ygd2hlbiB0aGUgY29tcGxldGlvbiB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHVzZWQgZm9yIGNvbXBsZXRpb24uXG4gICAqL1xuICBtb2RlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBcInRleHRfY29tcGxldGlvblwiXG4gICAqL1xuICBvYmplY3Q6ICd0ZXh0X2NvbXBsZXRpb24nO1xuXG4gIC8qKlxuICAgKiBUaGlzIGZpbmdlcnByaW50IHJlcHJlc2VudHMgdGhlIGJhY2tlbmQgY29uZmlndXJhdGlvbiB0aGF0IHRoZSBtb2RlbCBydW5zIHdpdGguXG4gICAqXG4gICAqIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGBzZWVkYCByZXF1ZXN0IHBhcmFtZXRlciB0byB1bmRlcnN0YW5kIHdoZW5cbiAgICogYmFja2VuZCBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRoYXQgbWlnaHQgaW1wYWN0IGRldGVybWluaXNtLlxuICAgKi9cbiAgc3lzdGVtX2ZpbmdlcnByaW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVc2FnZSBzdGF0aXN0aWNzIGZvciB0aGUgY29tcGxldGlvbiByZXF1ZXN0LlxuICAgKi9cbiAgdXNhZ2U/OiBDb21wbGV0aW9uVXNhZ2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbkNob2ljZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVhc29uIHRoZSBtb2RlbCBzdG9wcGVkIGdlbmVyYXRpbmcgdG9rZW5zLiBUaGlzIHdpbGwgYmUgYHN0b3BgIGlmIHRoZSBtb2RlbFxuICAgKiBoaXQgYSBuYXR1cmFsIHN0b3AgcG9pbnQgb3IgYSBwcm92aWRlZCBzdG9wIHNlcXVlbmNlLCBgbGVuZ3RoYCBpZiB0aGUgbWF4aW11bVxuICAgKiBudW1iZXIgb2YgdG9rZW5zIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgcmVhY2hlZCwgb3IgYGNvbnRlbnRfZmlsdGVyYCBpZlxuICAgKiBjb250ZW50IHdhcyBvbWl0dGVkIGR1ZSB0byBhIGZsYWcgZnJvbSBvdXIgY29udGVudCBmaWx0ZXJzLlxuICAgKi9cbiAgZmluaXNoX3JlYXNvbjogJ3N0b3AnIHwgJ2xlbmd0aCcgfCAnY29udGVudF9maWx0ZXInO1xuXG4gIGluZGV4OiBudW1iZXI7XG5cbiAgbG9ncHJvYnM6IENvbXBsZXRpb25DaG9pY2UuTG9ncHJvYnMgfCBudWxsO1xuXG4gIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb21wbGV0aW9uQ2hvaWNlIHtcbiAgZXhwb3J0IGludGVyZmFjZSBMb2dwcm9icyB7XG4gICAgdGV4dF9vZmZzZXQ/OiBBcnJheTxudW1iZXI+O1xuXG4gICAgdG9rZW5fbG9ncHJvYnM/OiBBcnJheTxudW1iZXI+O1xuXG4gICAgdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcblxuICAgIHRvcF9sb2dwcm9icz86IEFycmF5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+O1xuICB9XG59XG5cbi8qKlxuICogVXNhZ2Ugc3RhdGlzdGljcyBmb3IgdGhlIGNvbXBsZXRpb24gcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0aW9uVXNhZ2Uge1xuICAvKipcbiAgICogTnVtYmVyIG9mIHRva2VucyBpbiB0aGUgZ2VuZXJhdGVkIGNvbXBsZXRpb24uXG4gICAqL1xuICBjb21wbGV0aW9uX3Rva2VuczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgdG9rZW5zIGluIHRoZSBwcm9tcHQuXG4gICAqL1xuICBwcm9tcHRfdG9rZW5zOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiB0b2tlbnMgdXNlZCBpbiB0aGUgcmVxdWVzdCAocHJvbXB0ICsgY29tcGxldGlvbikuXG4gICAqL1xuICB0b3RhbF90b2tlbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgfCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIFlvdSBjYW4gdXNlIHRoZVxuICAgKiBbTGlzdCBtb2RlbHNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbW9kZWxzL2xpc3QpIEFQSSB0b1xuICAgKiBzZWUgYWxsIG9mIHlvdXIgYXZhaWxhYmxlIG1vZGVscywgb3Igc2VlIG91clxuICAgKiBbTW9kZWwgb3ZlcnZpZXddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL21vZGVscy9vdmVydmlldykgZm9yXG4gICAqIGRlc2NyaXB0aW9ucyBvZiB0aGVtLlxuICAgKi9cbiAgbW9kZWw6IChzdHJpbmcgJiB7fSkgfCAnZ3B0LTMuNS10dXJiby1pbnN0cnVjdCcgfCAnZGF2aW5jaS0wMDInIHwgJ2JhYmJhZ2UtMDAyJztcblxuICAvKipcbiAgICogVGhlIHByb21wdChzKSB0byBnZW5lcmF0ZSBjb21wbGV0aW9ucyBmb3IsIGVuY29kZWQgYXMgYSBzdHJpbmcsIGFycmF5IG9mXG4gICAqIHN0cmluZ3MsIGFycmF5IG9mIHRva2Vucywgb3IgYXJyYXkgb2YgdG9rZW4gYXJyYXlzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgPHxlbmRvZnRleHR8PiBpcyB0aGUgZG9jdW1lbnQgc2VwYXJhdG9yIHRoYXQgdGhlIG1vZGVsIHNlZXMgZHVyaW5nXG4gICAqIHRyYWluaW5nLCBzbyBpZiBhIHByb21wdCBpcyBub3Qgc3BlY2lmaWVkIHRoZSBtb2RlbCB3aWxsIGdlbmVyYXRlIGFzIGlmIGZyb20gdGhlXG4gICAqIGJlZ2lubmluZyBvZiBhIG5ldyBkb2N1bWVudC5cbiAgICovXG4gIHByb21wdDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPiB8IEFycmF5PG51bWJlcj4gfCBBcnJheTxBcnJheTxudW1iZXI+PiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBgYmVzdF9vZmAgY29tcGxldGlvbnMgc2VydmVyLXNpZGUgYW5kIHJldHVybnMgdGhlIFwiYmVzdFwiICh0aGUgb25lIHdpdGhcbiAgICogdGhlIGhpZ2hlc3QgbG9nIHByb2JhYmlsaXR5IHBlciB0b2tlbikuIFJlc3VsdHMgY2Fubm90IGJlIHN0cmVhbWVkLlxuICAgKlxuICAgKiBXaGVuIHVzZWQgd2l0aCBgbmAsIGBiZXN0X29mYCBjb250cm9scyB0aGUgbnVtYmVyIG9mIGNhbmRpZGF0ZSBjb21wbGV0aW9ucyBhbmRcbiAgICogYG5gIHNwZWNpZmllcyBob3cgbWFueSB0byByZXR1cm4gXHUyMDEzIGBiZXN0X29mYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBgbmAuXG4gICAqXG4gICAqICoqTm90ZToqKiBCZWNhdXNlIHRoaXMgcGFyYW1ldGVyIGdlbmVyYXRlcyBtYW55IGNvbXBsZXRpb25zLCBpdCBjYW4gcXVpY2tseVxuICAgKiBjb25zdW1lIHlvdXIgdG9rZW4gcXVvdGEuIFVzZSBjYXJlZnVsbHkgYW5kIGVuc3VyZSB0aGF0IHlvdSBoYXZlIHJlYXNvbmFibGVcbiAgICogc2V0dGluZ3MgZm9yIGBtYXhfdG9rZW5zYCBhbmQgYHN0b3BgLlxuICAgKi9cbiAgYmVzdF9vZj86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEVjaG8gYmFjayB0aGUgcHJvbXB0IGluIGFkZGl0aW9uIHRvIHRoZSBjb21wbGV0aW9uXG4gICAqL1xuICBlY2hvPzogYm9vbGVhbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE51bWJlciBiZXR3ZWVuIC0yLjAgYW5kIDIuMC4gUG9zaXRpdmUgdmFsdWVzIHBlbmFsaXplIG5ldyB0b2tlbnMgYmFzZWQgb24gdGhlaXJcbiAgICogZXhpc3RpbmcgZnJlcXVlbmN5IGluIHRoZSB0ZXh0IHNvIGZhciwgZGVjcmVhc2luZyB0aGUgbW9kZWwncyBsaWtlbGlob29kIHRvXG4gICAqIHJlcGVhdCB0aGUgc2FtZSBsaW5lIHZlcmJhdGltLlxuICAgKlxuICAgKiBbU2VlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZnJlcXVlbmN5IGFuZCBwcmVzZW5jZSBwZW5hbHRpZXMuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvdGV4dC1nZW5lcmF0aW9uL3BhcmFtZXRlci1kZXRhaWxzKVxuICAgKi9cbiAgZnJlcXVlbmN5X3BlbmFsdHk/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBNb2RpZnkgdGhlIGxpa2VsaWhvb2Qgb2Ygc3BlY2lmaWVkIHRva2VucyBhcHBlYXJpbmcgaW4gdGhlIGNvbXBsZXRpb24uXG4gICAqXG4gICAqIEFjY2VwdHMgYSBKU09OIG9iamVjdCB0aGF0IG1hcHMgdG9rZW5zIChzcGVjaWZpZWQgYnkgdGhlaXIgdG9rZW4gSUQgaW4gdGhlIEdQVFxuICAgKiB0b2tlbml6ZXIpIHRvIGFuIGFzc29jaWF0ZWQgYmlhcyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwLiBZb3UgY2FuIHVzZSB0aGlzXG4gICAqIFt0b2tlbml6ZXIgdG9vbF0oL3Rva2VuaXplcj92aWV3PWJwZSkgdG8gY29udmVydCB0ZXh0IHRvIHRva2VuIElEcy5cbiAgICogTWF0aGVtYXRpY2FsbHksIHRoZSBiaWFzIGlzIGFkZGVkIHRvIHRoZSBsb2dpdHMgZ2VuZXJhdGVkIGJ5IHRoZSBtb2RlbCBwcmlvciB0b1xuICAgKiBzYW1wbGluZy4gVGhlIGV4YWN0IGVmZmVjdCB3aWxsIHZhcnkgcGVyIG1vZGVsLCBidXQgdmFsdWVzIGJldHdlZW4gLTEgYW5kIDFcbiAgICogc2hvdWxkIGRlY3JlYXNlIG9yIGluY3JlYXNlIGxpa2VsaWhvb2Qgb2Ygc2VsZWN0aW9uOyB2YWx1ZXMgbGlrZSAtMTAwIG9yIDEwMFxuICAgKiBzaG91bGQgcmVzdWx0IGluIGEgYmFuIG9yIGV4Y2x1c2l2ZSBzZWxlY3Rpb24gb2YgdGhlIHJlbGV2YW50IHRva2VuLlxuICAgKlxuICAgKiBBcyBhbiBleGFtcGxlLCB5b3UgY2FuIHBhc3MgYHtcIjUwMjU2XCI6IC0xMDB9YCB0byBwcmV2ZW50IHRoZSA8fGVuZG9mdGV4dHw+IHRva2VuXG4gICAqIGZyb20gYmVpbmcgZ2VuZXJhdGVkLlxuICAgKi9cbiAgbG9naXRfYmlhcz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIHRoZSBsb2cgcHJvYmFiaWxpdGllcyBvbiB0aGUgYGxvZ3Byb2JzYCBtb3N0IGxpa2VseSBvdXRwdXQgdG9rZW5zLCBhc1xuICAgKiB3ZWxsIHRoZSBjaG9zZW4gdG9rZW5zLiBGb3IgZXhhbXBsZSwgaWYgYGxvZ3Byb2JzYCBpcyA1LCB0aGUgQVBJIHdpbGwgcmV0dXJuIGFcbiAgICogbGlzdCBvZiB0aGUgNSBtb3N0IGxpa2VseSB0b2tlbnMuIFRoZSBBUEkgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBgbG9ncHJvYmAgb2ZcbiAgICogdGhlIHNhbXBsZWQgdG9rZW4sIHNvIHRoZXJlIG1heSBiZSB1cCB0byBgbG9ncHJvYnMrMWAgZWxlbWVudHMgaW4gdGhlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgYGxvZ3Byb2JzYCBpcyA1LlxuICAgKi9cbiAgbG9ncHJvYnM/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgW3Rva2Vuc10oL3Rva2VuaXplcikgdGhhdCBjYW4gYmUgZ2VuZXJhdGVkIGluIHRoZVxuICAgKiBjb21wbGV0aW9uLlxuICAgKlxuICAgKiBUaGUgdG9rZW4gY291bnQgb2YgeW91ciBwcm9tcHQgcGx1cyBgbWF4X3Rva2Vuc2AgY2Fubm90IGV4Y2VlZCB0aGUgbW9kZWwnc1xuICAgKiBjb250ZXh0IGxlbmd0aC5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fY291bnRfdG9rZW5zX3dpdGhfdGlrdG9rZW4pXG4gICAqIGZvciBjb3VudGluZyB0b2tlbnMuXG4gICAqL1xuICBtYXhfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogSG93IG1hbnkgY29tcGxldGlvbnMgdG8gZ2VuZXJhdGUgZm9yIGVhY2ggcHJvbXB0LlxuICAgKlxuICAgKiAqKk5vdGU6KiogQmVjYXVzZSB0aGlzIHBhcmFtZXRlciBnZW5lcmF0ZXMgbWFueSBjb21wbGV0aW9ucywgaXQgY2FuIHF1aWNrbHlcbiAgICogY29uc3VtZSB5b3VyIHRva2VuIHF1b3RhLiBVc2UgY2FyZWZ1bGx5IGFuZCBlbnN1cmUgdGhhdCB5b3UgaGF2ZSByZWFzb25hYmxlXG4gICAqIHNldHRpbmdzIGZvciBgbWF4X3Rva2Vuc2AgYW5kIGBzdG9wYC5cbiAgICovXG4gIG4/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgYmV0d2VlbiAtMi4wIGFuZCAyLjAuIFBvc2l0aXZlIHZhbHVlcyBwZW5hbGl6ZSBuZXcgdG9rZW5zIGJhc2VkIG9uXG4gICAqIHdoZXRoZXIgdGhleSBhcHBlYXIgaW4gdGhlIHRleHQgc28gZmFyLCBpbmNyZWFzaW5nIHRoZSBtb2RlbCdzIGxpa2VsaWhvb2QgdG9cbiAgICogdGFsayBhYm91dCBuZXcgdG9waWNzLlxuICAgKlxuICAgKiBbU2VlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZnJlcXVlbmN5IGFuZCBwcmVzZW5jZSBwZW5hbHRpZXMuXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvdGV4dC1nZW5lcmF0aW9uL3BhcmFtZXRlci1kZXRhaWxzKVxuICAgKi9cbiAgcHJlc2VuY2VfcGVuYWx0eT86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIHNwZWNpZmllZCwgb3VyIHN5c3RlbSB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byBzYW1wbGUgZGV0ZXJtaW5pc3RpY2FsbHksXG4gICAqIHN1Y2ggdGhhdCByZXBlYXRlZCByZXF1ZXN0cyB3aXRoIHRoZSBzYW1lIGBzZWVkYCBhbmQgcGFyYW1ldGVycyBzaG91bGQgcmV0dXJuXG4gICAqIHRoZSBzYW1lIHJlc3VsdC5cbiAgICpcbiAgICogRGV0ZXJtaW5pc20gaXMgbm90IGd1YXJhbnRlZWQsIGFuZCB5b3Ugc2hvdWxkIHJlZmVyIHRvIHRoZSBgc3lzdGVtX2ZpbmdlcnByaW50YFxuICAgKiByZXNwb25zZSBwYXJhbWV0ZXIgdG8gbW9uaXRvciBjaGFuZ2VzIGluIHRoZSBiYWNrZW5kLlxuICAgKi9cbiAgc2VlZD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFVwIHRvIDQgc2VxdWVuY2VzIHdoZXJlIHRoZSBBUEkgd2lsbCBzdG9wIGdlbmVyYXRpbmcgZnVydGhlciB0b2tlbnMuIFRoZVxuICAgKiByZXR1cm5lZCB0ZXh0IHdpbGwgbm90IGNvbnRhaW4gdGhlIHN0b3Agc2VxdWVuY2UuXG4gICAqL1xuICBzdG9wPzogc3RyaW5nIHwgbnVsbCB8IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RyZWFtIGJhY2sgcGFydGlhbCBwcm9ncmVzcy4gSWYgc2V0LCB0b2tlbnMgd2lsbCBiZSBzZW50IGFzXG4gICAqIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbT86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBzdHJlYW1pbmcgcmVzcG9uc2UuIE9ubHkgc2V0IHRoaXMgd2hlbiB5b3Ugc2V0IGBzdHJlYW06IHRydWVgLlxuICAgKi9cbiAgc3RyZWFtX29wdGlvbnM/OiBDaGF0Q29tcGxldGlvbnNBUEkuQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN1ZmZpeCB0aGF0IGNvbWVzIGFmdGVyIGEgY29tcGxldGlvbiBvZiBpbnNlcnRlZCB0ZXh0LlxuICAgKlxuICAgKiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgYGdwdC0zLjUtdHVyYm8taW5zdHJ1Y3RgLlxuICAgKi9cbiAgc3VmZml4Pzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hhdCBzYW1wbGluZyB0ZW1wZXJhdHVyZSB0byB1c2UsIGJldHdlZW4gMCBhbmQgMi4gSGlnaGVyIHZhbHVlcyBsaWtlIDAuOCB3aWxsXG4gICAqIG1ha2UgdGhlIG91dHB1dCBtb3JlIHJhbmRvbSwgd2hpbGUgbG93ZXIgdmFsdWVzIGxpa2UgMC4yIHdpbGwgbWFrZSBpdCBtb3JlXG4gICAqIGZvY3VzZWQgYW5kIGRldGVybWluaXN0aWMuXG4gICAqXG4gICAqIFdlIGdlbmVyYWxseSByZWNvbW1lbmQgYWx0ZXJpbmcgdGhpcyBvciBgdG9wX3BgIGJ1dCBub3QgYm90aC5cbiAgICovXG4gIHRlbXBlcmF0dXJlPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgdG8gc2FtcGxpbmcgd2l0aCB0ZW1wZXJhdHVyZSwgY2FsbGVkIG51Y2xldXMgc2FtcGxpbmcsIHdoZXJlIHRoZVxuICAgKiBtb2RlbCBjb25zaWRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRva2VucyB3aXRoIHRvcF9wIHByb2JhYmlsaXR5IG1hc3MuIFNvIDAuMVxuICAgKiBtZWFucyBvbmx5IHRoZSB0b2tlbnMgY29tcHJpc2luZyB0aGUgdG9wIDEwJSBwcm9iYWJpbGl0eSBtYXNzIGFyZSBjb25zaWRlcmVkLlxuICAgKlxuICAgKiBXZSBnZW5lcmFsbHkgcmVjb21tZW5kIGFsdGVyaW5nIHRoaXMgb3IgYHRlbXBlcmF0dXJlYCBidXQgbm90IGJvdGguXG4gICAqL1xuICB0b3BfcD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0byBtb25pdG9yXG4gICAqIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAqIFtMZWFybiBtb3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkcykuXG4gICAqL1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENvbXBsZXRpb25DcmVhdGVQYXJhbXMge1xuICBleHBvcnQgdHlwZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyBleHRlbmRzIENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RyZWFtIGJhY2sgcGFydGlhbCBwcm9ncmVzcy4gSWYgc2V0LCB0b2tlbnMgd2lsbCBiZSBzZW50IGFzXG4gICAqIGRhdGEtb25seVxuICAgKiBbc2VydmVyLXNlbnQgZXZlbnRzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0KVxuICAgKiBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUsIHdpdGggdGhlIHN0cmVhbSB0ZXJtaW5hdGVkIGJ5IGEgYGRhdGE6IFtET05FXWBcbiAgICogbWVzc2FnZS5cbiAgICogW0V4YW1wbGUgUHl0aG9uIGNvZGVdKGh0dHBzOi8vY29va2Jvb2sub3BlbmFpLmNvbS9leGFtcGxlcy9ob3dfdG9fc3RyZWFtX2NvbXBsZXRpb25zKS5cbiAgICovXG4gIHN0cmVhbT86IGZhbHNlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nIGV4dGVuZHMgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogV2hldGhlciB0byBzdHJlYW0gYmFjayBwYXJ0aWFsIHByb2dyZXNzLiBJZiBzZXQsIHRva2VucyB3aWxsIGJlIHNlbnQgYXNcbiAgICogZGF0YS1vbmx5XG4gICAqIFtzZXJ2ZXItc2VudCBldmVudHNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TZXJ2ZXItc2VudF9ldmVudHMvVXNpbmdfc2VydmVyLXNlbnRfZXZlbnRzI0V2ZW50X3N0cmVhbV9mb3JtYXQpXG4gICAqIGFzIHRoZXkgYmVjb21lIGF2YWlsYWJsZSwgd2l0aCB0aGUgc3RyZWFtIHRlcm1pbmF0ZWQgYnkgYSBgZGF0YTogW0RPTkVdYFxuICAgKiBtZXNzYWdlLlxuICAgKiBbRXhhbXBsZSBQeXRob24gY29kZV0oaHR0cHM6Ly9jb29rYm9vay5vcGVuYWkuY29tL2V4YW1wbGVzL2hvd190b19zdHJlYW1fY29tcGxldGlvbnMpLlxuICAgKi9cbiAgc3RyZWFtOiB0cnVlO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENvbXBsZXRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ2hvaWNlID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNob2ljZTtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uVXNhZ2UgPSBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9uVXNhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZyA9IENvbXBsZXRpb25zQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIEVtYmVkZGluZ3NBUEkgZnJvbSBcIi4vZW1iZWRkaW5nc1wiO1xuXG5leHBvcnQgY2xhc3MgRW1iZWRkaW5ncyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gZW1iZWRkaW5nIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGlucHV0IHRleHQuXG4gICAqL1xuICBjcmVhdGUoXG4gICAgYm9keTogRW1iZWRkaW5nQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8Q3JlYXRlRW1iZWRkaW5nUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9lbWJlZGRpbmdzJywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2Uge1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZW1iZWRkaW5ncyBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVsLlxuICAgKi9cbiAgZGF0YTogQXJyYXk8RW1iZWRkaW5nPjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1vZGVsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGVtYmVkZGluZy5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIFwibGlzdFwiLlxuICAgKi9cbiAgb2JqZWN0OiAnbGlzdCc7XG5cbiAgLyoqXG4gICAqIFRoZSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3QuXG4gICAqL1xuICB1c2FnZTogQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2UuVXNhZ2U7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2Uge1xuICAvKipcbiAgICogVGhlIHVzYWdlIGluZm9ybWF0aW9uIGZvciB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgVXNhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdG9rZW5zIHVzZWQgYnkgdGhlIHByb21wdC5cbiAgICAgKi9cbiAgICBwcm9tcHRfdG9rZW5zOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyB1c2VkIGJ5IHRoZSByZXF1ZXN0LlxuICAgICAqL1xuICAgIHRvdGFsX3Rva2VuczogbnVtYmVyO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBlbWJlZGRpbmcgdmVjdG9yIHJldHVybmVkIGJ5IGVtYmVkZGluZyBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmcge1xuICAvKipcbiAgICogVGhlIGVtYmVkZGluZyB2ZWN0b3IsIHdoaWNoIGlzIGEgbGlzdCBvZiBmbG9hdHMuIFRoZSBsZW5ndGggb2YgdmVjdG9yIGRlcGVuZHMgb25cbiAgICogdGhlIG1vZGVsIGFzIGxpc3RlZCBpbiB0aGVcbiAgICogW2VtYmVkZGluZyBndWlkZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2VtYmVkZGluZ3MpLlxuICAgKi9cbiAgZW1iZWRkaW5nOiBBcnJheTxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZXggb2YgdGhlIGVtYmVkZGluZyBpbiB0aGUgbGlzdCBvZiBlbWJlZGRpbmdzLlxuICAgKi9cbiAgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcyBhbHdheXMgXCJlbWJlZGRpbmdcIi5cbiAgICovXG4gIG9iamVjdDogJ2VtYmVkZGluZyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkaW5nQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIElucHV0IHRleHQgdG8gZW1iZWQsIGVuY29kZWQgYXMgYSBzdHJpbmcgb3IgYXJyYXkgb2YgdG9rZW5zLiBUbyBlbWJlZCBtdWx0aXBsZVxuICAgKiBpbnB1dHMgaW4gYSBzaW5nbGUgcmVxdWVzdCwgcGFzcyBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIGFycmF5IG9mIHRva2VuIGFycmF5cy5cbiAgICogVGhlIGlucHV0IG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4IGlucHV0IHRva2VucyBmb3IgdGhlIG1vZGVsICg4MTkyIHRva2VucyBmb3JcbiAgICogYHRleHQtZW1iZWRkaW5nLWFkYS0wMDJgKSwgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZywgYW5kIGFueSBhcnJheSBtdXN0IGJlIDIwNDhcbiAgICogZGltZW5zaW9ucyBvciBsZXNzLlxuICAgKiBbRXhhbXBsZSBQeXRob24gY29kZV0oaHR0cHM6Ly9jb29rYm9vay5vcGVuYWkuY29tL2V4YW1wbGVzL2hvd190b19jb3VudF90b2tlbnNfd2l0aF90aWt0b2tlbilcbiAgICogZm9yIGNvdW50aW5nIHRva2Vucy5cbiAgICovXG4gIGlucHV0OiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHwgQXJyYXk8bnVtYmVyPiB8IEFycmF5PEFycmF5PG51bWJlcj4+O1xuXG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgbW9kZWwgdG8gdXNlLiBZb3UgY2FuIHVzZSB0aGVcbiAgICogW0xpc3QgbW9kZWxzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL21vZGVscy9saXN0KSBBUEkgdG9cbiAgICogc2VlIGFsbCBvZiB5b3VyIGF2YWlsYWJsZSBtb2RlbHMsIG9yIHNlZSBvdXJcbiAgICogW01vZGVsIG92ZXJ2aWV3XShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9tb2RlbHMvb3ZlcnZpZXcpIGZvclxuICAgKiBkZXNjcmlwdGlvbnMgb2YgdGhlbS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ3RleHQtZW1iZWRkaW5nLWFkYS0wMDInIHwgJ3RleHQtZW1iZWRkaW5nLTMtc21hbGwnIHwgJ3RleHQtZW1iZWRkaW5nLTMtbGFyZ2UnO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgdGhlIHJlc3VsdGluZyBvdXRwdXQgZW1iZWRkaW5ncyBzaG91bGQgaGF2ZS4gT25seVxuICAgKiBzdXBwb3J0ZWQgaW4gYHRleHQtZW1iZWRkaW5nLTNgIGFuZCBsYXRlciBtb2RlbHMuXG4gICAqL1xuICBkaW1lbnNpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IHRvIHJldHVybiB0aGUgZW1iZWRkaW5ncyBpbi4gQ2FuIGJlIGVpdGhlciBgZmxvYXRgIG9yXG4gICAqIFtgYmFzZTY0YF0oaHR0cHM6Ly9weXBpLm9yZy9wcm9qZWN0L3B5YmFzZTY0LykuXG4gICAqL1xuICBlbmNvZGluZ19mb3JtYXQ/OiAnZmxvYXQnIHwgJ2Jhc2U2NCc7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0byBtb25pdG9yXG4gICAqIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAqIFtMZWFybiBtb3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkcykuXG4gICAqL1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEVtYmVkZGluZ3Mge1xuICBleHBvcnQgaW1wb3J0IENyZWF0ZUVtYmVkZGluZ1Jlc3BvbnNlID0gRW1iZWRkaW5nc0FQSS5DcmVhdGVFbWJlZGRpbmdSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBFbWJlZGRpbmcgPSBFbWJlZGRpbmdzQVBJLkVtYmVkZGluZztcbiAgZXhwb3J0IGltcG9ydCBFbWJlZGRpbmdDcmVhdGVQYXJhbXMgPSBFbWJlZGRpbmdzQVBJLkVtYmVkZGluZ0NyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIFJlc3BvbnNlIH0gZnJvbSBcIi4uL19zaGltcy9pbmRleFwiO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuaW1wb3J0ICogYXMgRmlsZXNBUEkgZnJvbSBcIi4vZmlsZXNcIjtcbmltcG9ydCB7IHR5cGUgVXBsb2FkYWJsZSwgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IFBhZ2UgfSBmcm9tIFwiLi4vcGFnaW5hdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgRmlsZXMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBVcGxvYWQgYSBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgYWNyb3NzIHZhcmlvdXMgZW5kcG9pbnRzLiBUaGUgc2l6ZSBvZiBhbGwgdGhlXG4gICAqIGZpbGVzIHVwbG9hZGVkIGJ5IG9uZSBvcmdhbml6YXRpb24gY2FuIGJlIHVwIHRvIDEwMCBHQi5cbiAgICpcbiAgICogVGhlIHNpemUgb2YgaW5kaXZpZHVhbCBmaWxlcyBjYW4gYmUgYSBtYXhpbXVtIG9mIDUxMiBNQiBvciAyIG1pbGxpb24gdG9rZW5zIGZvclxuICAgKiBBc3Npc3RhbnRzLiBTZWUgdGhlXG4gICAqIFtBc3Npc3RhbnRzIFRvb2xzIGd1aWRlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hc3Npc3RhbnRzL3Rvb2xzKSB0b1xuICAgKiBsZWFybiBtb3JlIGFib3V0IHRoZSB0eXBlcyBvZiBmaWxlcyBzdXBwb3J0ZWQuIFRoZSBGaW5lLXR1bmluZyBBUEkgb25seSBzdXBwb3J0c1xuICAgKiBgLmpzb25sYCBmaWxlcy5cbiAgICpcbiAgICogUGxlYXNlIFtjb250YWN0IHVzXShodHRwczovL2hlbHAub3BlbmFpLmNvbS8pIGlmIHlvdSBuZWVkIHRvIGluY3JlYXNlIHRoZXNlXG4gICAqIHN0b3JhZ2UgbGltaXRzLlxuICAgKi9cbiAgY3JlYXRlKGJvZHk6IEZpbGVDcmVhdGVQYXJhbXMsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbGVPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9maWxlcycsIG11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyh7IGJvZHksIC4uLm9wdGlvbnMgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBmaWxlLlxuICAgKi9cbiAgcmV0cmlldmUoZmlsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbGVPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldChgL2ZpbGVzLyR7ZmlsZUlkfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGZpbGVzIHRoYXQgYmVsb25nIHRvIHRoZSB1c2VyJ3Mgb3JnYW5pemF0aW9uLlxuICAgKi9cbiAgbGlzdChxdWVyeT86IEZpbGVMaXN0UGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8RmlsZU9iamVjdHNQYWdlLCBGaWxlT2JqZWN0PjtcbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8RmlsZU9iamVjdHNQYWdlLCBGaWxlT2JqZWN0PjtcbiAgbGlzdChcbiAgICBxdWVyeTogRmlsZUxpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmlsZU9iamVjdHNQYWdlLCBGaWxlT2JqZWN0PiB7XG4gICAgaWYgKGlzUmVxdWVzdE9wdGlvbnMocXVlcnkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5saXN0KHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdCgnL2ZpbGVzJywgRmlsZU9iamVjdHNQYWdlLCB7IHF1ZXJ5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGZpbGUuXG4gICAqL1xuICBkZWwoZmlsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbGVEZWxldGVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5kZWxldGUoYC9maWxlcy8ke2ZpbGVJZH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuXG4gICAqL1xuICBjb250ZW50KGZpbGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvZmlsZXMvJHtmaWxlSWR9L2NvbnRlbnRgLCB7IC4uLm9wdGlvbnMsIF9fYmluYXJ5UmVzcG9uc2U6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBmaWxlLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgYC5jb250ZW50KClgIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkXG4gICAqL1xuICByZXRyaWV2ZUNvbnRlbnQoZmlsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KGAvZmlsZXMvJHtmaWxlSWR9L2NvbnRlbnRgLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJywgLi4ub3B0aW9ucz8uaGVhZGVycyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZ2l2ZW4gZmlsZSB0byBiZSBwcm9jZXNzZWQsIGRlZmF1bHQgdGltZW91dCBpcyAzMCBtaW5zLlxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclByb2Nlc3NpbmcoXG4gICAgaWQ6IHN0cmluZyxcbiAgICB7IHBvbGxJbnRlcnZhbCA9IDUwMDAsIG1heFdhaXQgPSAzMCAqIDYwICogMTAwMCB9OiB7IHBvbGxJbnRlcnZhbD86IG51bWJlcjsgbWF4V2FpdD86IG51bWJlciB9ID0ge30sXG4gICk6IFByb21pc2U8RmlsZU9iamVjdD4ge1xuICAgIGNvbnN0IFRFUk1JTkFMX1NUQVRFUyA9IG5ldyBTZXQoWydwcm9jZXNzZWQnLCAnZXJyb3InLCAnZGVsZXRlZCddKTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZmlsZSA9IGF3YWl0IHRoaXMucmV0cmlldmUoaWQpO1xuXG4gICAgd2hpbGUgKCFmaWxlLnN0YXR1cyB8fCAhVEVSTUlOQUxfU1RBVEVTLmhhcyhmaWxlLnN0YXR1cykpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHBvbGxJbnRlcnZhbCk7XG5cbiAgICAgIGZpbGUgPSBhd2FpdCB0aGlzLnJldHJpZXZlKGlkKTtcbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnQgPiBtYXhXYWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBBUElDb25uZWN0aW9uVGltZW91dEVycm9yKHtcbiAgICAgICAgICBtZXNzYWdlOiBgR2l2aW5nIHVwIG9uIHdhaXRpbmcgZm9yIGZpbGUgJHtpZH0gdG8gZmluaXNoIHByb2Nlc3NpbmcgYWZ0ZXIgJHttYXhXYWl0fSBtaWxsaXNlY29uZHMuYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cbn1cblxuLyoqXG4gKiBOb3RlOiBubyBwYWdpbmF0aW9uIGFjdHVhbGx5IG9jY3VycyB5ZXQsIHRoaXMgaXMgZm9yIGZvcndhcmRzLWNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlT2JqZWN0c1BhZ2UgZXh0ZW5kcyBQYWdlPEZpbGVPYmplY3Q+IHt9XG5cbmV4cG9ydCB0eXBlIEZpbGVDb250ZW50ID0gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVEZWxldGVkIHtcbiAgaWQ6IHN0cmluZztcblxuICBkZWxldGVkOiBib29sZWFuO1xuXG4gIG9iamVjdDogJ2ZpbGUnO1xufVxuXG4vKipcbiAqIFRoZSBgRmlsZWAgb2JqZWN0IHJlcHJlc2VudHMgYSBkb2N1bWVudCB0aGF0IGhhcyBiZWVuIHVwbG9hZGVkIHRvIE9wZW5BSS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlT2JqZWN0IHtcbiAgLyoqXG4gICAqIFRoZSBmaWxlIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGluIHRoZSBBUEkgZW5kcG9pbnRzLlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGZpbGUsIGluIGJ5dGVzLlxuICAgKi9cbiAgYnl0ZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgZmlsZSB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUuXG4gICAqL1xuICBmaWxlbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBgZmlsZWAuXG4gICAqL1xuICBvYmplY3Q6ICdmaWxlJztcblxuICAvKipcbiAgICogVGhlIGludGVuZGVkIHB1cnBvc2Ugb2YgdGhlIGZpbGUuIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIGBmaW5lLXR1bmVgLFxuICAgKiBgZmluZS10dW5lLXJlc3VsdHNgLCBgYXNzaXN0YW50c2AsIGFuZCBgYXNzaXN0YW50c19vdXRwdXRgLlxuICAgKi9cbiAgcHVycG9zZTogJ2ZpbmUtdHVuZScgfCAnZmluZS10dW5lLXJlc3VsdHMnIHwgJ2Fzc2lzdGFudHMnIHwgJ2Fzc2lzdGFudHNfb3V0cHV0JztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQ6IERlcHJlY2F0ZWQuIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZmlsZSwgd2hpY2ggY2FuIGJlIGVpdGhlclxuICAgKiBgdXBsb2FkZWRgLCBgcHJvY2Vzc2VkYCwgb3IgYGVycm9yYC5cbiAgICovXG4gIHN0YXR1czogJ3VwbG9hZGVkJyB8ICdwcm9jZXNzZWQnIHwgJ2Vycm9yJztcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQ6IERlcHJlY2F0ZWQuIEZvciBkZXRhaWxzIG9uIHdoeSBhIGZpbmUtdHVuaW5nIHRyYWluaW5nIGZpbGUgZmFpbGVkXG4gICAqIHZhbGlkYXRpb24sIHNlZSB0aGUgYGVycm9yYCBmaWVsZCBvbiBgZmluZV90dW5pbmcuam9iYC5cbiAgICovXG4gIHN0YXR1c19kZXRhaWxzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIEZpbGUgb2JqZWN0IChub3QgZmlsZSBuYW1lKSB0byBiZSB1cGxvYWRlZC5cbiAgICovXG4gIGZpbGU6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlbmRlZCBwdXJwb3NlIG9mIHRoZSB1cGxvYWRlZCBmaWxlLlxuICAgKlxuICAgKiBVc2UgXCJmaW5lLXR1bmVcIiBmb3JcbiAgICogW0ZpbmUtdHVuaW5nXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbmUtdHVuaW5nKSBhbmRcbiAgICogXCJhc3Npc3RhbnRzXCIgZm9yXG4gICAqIFtBc3Npc3RhbnRzXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2Fzc2lzdGFudHMpIGFuZFxuICAgKiBbTWVzc2FnZXNdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2FwaS1yZWZlcmVuY2UvbWVzc2FnZXMpLiBUaGlzIGFsbG93c1xuICAgKiB1cyB0byB2YWxpZGF0ZSB0aGUgZm9ybWF0IG9mIHRoZSB1cGxvYWRlZCBmaWxlIGlzIGNvcnJlY3QgZm9yIGZpbmUtdHVuaW5nLlxuICAgKi9cbiAgcHVycG9zZTogJ2ZpbmUtdHVuZScgfCAnYXNzaXN0YW50cyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUxpc3RQYXJhbXMge1xuICAvKipcbiAgICogT25seSByZXR1cm4gZmlsZXMgd2l0aCB0aGUgZ2l2ZW4gcHVycG9zZS5cbiAgICovXG4gIHB1cnBvc2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsZXMge1xuICBleHBvcnQgaW1wb3J0IEZpbGVDb250ZW50ID0gRmlsZXNBUEkuRmlsZUNvbnRlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZURlbGV0ZWQgPSBGaWxlc0FQSS5GaWxlRGVsZXRlZDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlT2JqZWN0ID0gRmlsZXNBUEkuRmlsZU9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBGaWxlT2JqZWN0c1BhZ2UgPSBGaWxlc0FQSS5GaWxlT2JqZWN0c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNyZWF0ZVBhcmFtcyA9IEZpbGVzQVBJLkZpbGVDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUxpc3RQYXJhbXMgPSBGaWxlc0FQSS5GaWxlTGlzdFBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgaXNSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9jb3JlXCI7XG5pbXBvcnQgKiBhcyBDaGVja3BvaW50c0FQSSBmcm9tIFwiLi9jaGVja3BvaW50c1wiO1xuaW1wb3J0IHsgQ3Vyc29yUGFnZSwgdHlwZSBDdXJzb3JQYWdlUGFyYW1zIH0gZnJvbSBcIi4uLy4uLy4uL3BhZ2luYXRpb25cIjtcblxuZXhwb3J0IGNsYXNzIENoZWNrcG9pbnRzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogTGlzdCBjaGVja3BvaW50cyBmb3IgYSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBsaXN0KFxuICAgIGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLFxuICAgIHF1ZXJ5PzogQ2hlY2twb2ludExpc3RQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSwgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQ+O1xuICBsaXN0KFxuICAgIGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JDaGVja3BvaW50PjtcbiAgbGlzdChcbiAgICBmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZyxcbiAgICBxdWVyeTogQ2hlY2twb2ludExpc3RQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSwgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQ+IHtcbiAgICBpZiAoaXNSZXF1ZXN0T3B0aW9ucyhxdWVyeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3QoZmluZVR1bmluZ0pvYklkLCB7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoXG4gICAgICBgL2ZpbmVfdHVuaW5nL2pvYnMvJHtmaW5lVHVuaW5nSm9iSWR9L2NoZWNrcG9pbnRzYCxcbiAgICAgIEZpbmVUdW5pbmdKb2JDaGVja3BvaW50c1BhZ2UsXG4gICAgICB7IHF1ZXJ5LCAuLi5vcHRpb25zIH0sXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8RmluZVR1bmluZ0pvYkNoZWNrcG9pbnQ+IHt9XG5cbi8qKlxuICogVGhlIGBmaW5lX3R1bmluZy5qb2IuY2hlY2twb2ludGAgb2JqZWN0IHJlcHJlc2VudHMgYSBtb2RlbCBjaGVja3BvaW50IGZvciBhXG4gKiBmaW5lLXR1bmluZyBqb2IgdGhhdCBpcyByZWFkeSB0byB1c2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQge1xuICAvKipcbiAgICogVGhlIGNoZWNrcG9pbnQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHJlZmVyZW5jZWQgaW4gdGhlIEFQSSBlbmRwb2ludHMuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVW5peCB0aW1lc3RhbXAgKGluIHNlY29uZHMpIGZvciB3aGVuIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmluZS10dW5lZCBjaGVja3BvaW50IG1vZGVsIHRoYXQgaXMgY3JlYXRlZC5cbiAgICovXG4gIGZpbmVfdHVuZWRfbW9kZWxfY2hlY2twb2ludDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmluZS10dW5pbmcgam9iIHRoYXQgdGhpcyBjaGVja3BvaW50IHdhcyBjcmVhdGVkIGZyb20uXG4gICAqL1xuICBmaW5lX3R1bmluZ19qb2JfaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogTWV0cmljcyBhdCB0aGUgc3RlcCBudW1iZXIgZHVyaW5nIHRoZSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBtZXRyaWNzOiBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludC5NZXRyaWNzO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHR5cGUsIHdoaWNoIGlzIGFsd2F5cyBcImZpbmVfdHVuaW5nLmpvYi5jaGVja3BvaW50XCIuXG4gICAqL1xuICBvYmplY3Q6ICdmaW5lX3R1bmluZy5qb2IuY2hlY2twb2ludCc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGVwIG51bWJlciB0aGF0IHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkIGF0LlxuICAgKi9cbiAgc3RlcF9udW1iZXI6IG51bWJlcjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludCB7XG4gIC8qKlxuICAgKiBNZXRyaWNzIGF0IHRoZSBzdGVwIG51bWJlciBkdXJpbmcgdGhlIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgTWV0cmljcyB7XG4gICAgZnVsbF92YWxpZF9sb3NzPzogbnVtYmVyO1xuXG4gICAgZnVsbF92YWxpZF9tZWFuX3Rva2VuX2FjY3VyYWN5PzogbnVtYmVyO1xuXG4gICAgc3RlcD86IG51bWJlcjtcblxuICAgIHRyYWluX2xvc3M/OiBudW1iZXI7XG5cbiAgICB0cmFpbl9tZWFuX3Rva2VuX2FjY3VyYWN5PzogbnVtYmVyO1xuXG4gICAgdmFsaWRfbG9zcz86IG51bWJlcjtcblxuICAgIHZhbGlkX21lYW5fdG9rZW5fYWNjdXJhY3k/OiBudW1iZXI7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGVja3BvaW50TGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge31cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGVja3BvaW50cyB7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQgPSBDaGVja3BvaW50c0FQSS5GaW5lVHVuaW5nSm9iQ2hlY2twb2ludDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlID0gQ2hlY2twb2ludHNBUEkuRmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGVja3BvaW50TGlzdFBhcmFtcyA9IENoZWNrcG9pbnRzQVBJLkNoZWNrcG9pbnRMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBpc1JlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL2NvcmVcIjtcbmltcG9ydCAqIGFzIEpvYnNBUEkgZnJvbSBcIi4vam9ic1wiO1xuaW1wb3J0ICogYXMgQ2hlY2twb2ludHNBUEkgZnJvbSBcIi4vY2hlY2twb2ludHNcIjtcbmltcG9ydCB7IEN1cnNvclBhZ2UsIHR5cGUgQ3Vyc29yUGFnZVBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9wYWdpbmF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBKb2JzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICBjaGVja3BvaW50czogQ2hlY2twb2ludHNBUEkuQ2hlY2twb2ludHMgPSBuZXcgQ2hlY2twb2ludHNBUEkuQ2hlY2twb2ludHModGhpcy5fY2xpZW50KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZpbmUtdHVuaW5nIGpvYiB3aGljaCBiZWdpbnMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYSBuZXcgbW9kZWwgZnJvbVxuICAgKiBhIGdpdmVuIGRhdGFzZXQuXG4gICAqXG4gICAqIFJlc3BvbnNlIGluY2x1ZGVzIGRldGFpbHMgb2YgdGhlIGVucXVldWVkIGpvYiBpbmNsdWRpbmcgam9iIHN0YXR1cyBhbmQgdGhlIG5hbWVcbiAgICogb2YgdGhlIGZpbmUtdHVuZWQgbW9kZWxzIG9uY2UgY29tcGxldGUuXG4gICAqXG4gICAqIFtMZWFybiBtb3JlIGFib3V0IGZpbmUtdHVuaW5nXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZmluZS10dW5pbmcpXG4gICAqL1xuICBjcmVhdGUoYm9keTogSm9iQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxGaW5lVHVuaW5nSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvZmluZV90dW5pbmcvam9icycsIHsgYm9keSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW5mbyBhYm91dCBhIGZpbmUtdHVuaW5nIGpvYi5cbiAgICpcbiAgICogW0xlYXJuIG1vcmUgYWJvdXQgZmluZS10dW5pbmddKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZylcbiAgICovXG4gIHJldHJpZXZlKGZpbmVUdW5pbmdKb2JJZDogc3RyaW5nLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxGaW5lVHVuaW5nSm9iPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC9maW5lX3R1bmluZy9qb2JzLyR7ZmluZVR1bmluZ0pvYklkfWAsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgeW91ciBvcmdhbml6YXRpb24ncyBmaW5lLXR1bmluZyBqb2JzXG4gICAqL1xuICBsaXN0KFxuICAgIHF1ZXJ5PzogSm9iTGlzdFBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9ic1BhZ2UsIEZpbmVUdW5pbmdKb2I+O1xuICBsaXN0KG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5QYWdlUHJvbWlzZTxGaW5lVHVuaW5nSm9ic1BhZ2UsIEZpbmVUdW5pbmdKb2I+O1xuICBsaXN0KFxuICAgIHF1ZXJ5OiBKb2JMaXN0UGFyYW1zIHwgQ29yZS5SZXF1ZXN0T3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLlBhZ2VQcm9taXNlPEZpbmVUdW5pbmdKb2JzUGFnZSwgRmluZVR1bmluZ0pvYj4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdCh7fSwgcXVlcnkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoJy9maW5lX3R1bmluZy9qb2JzJywgRmluZVR1bmluZ0pvYnNQYWdlLCB7IHF1ZXJ5LCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltbWVkaWF0ZWx5IGNhbmNlbCBhIGZpbmUtdHVuZSBqb2IuXG4gICAqL1xuICBjYW5jZWwoZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPEZpbmVUdW5pbmdKb2I+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoYC9maW5lX3R1bmluZy9qb2JzLyR7ZmluZVR1bmluZ0pvYklkfS9jYW5jZWxgLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RhdHVzIHVwZGF0ZXMgZm9yIGEgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgbGlzdEV2ZW50cyhcbiAgICBmaW5lVHVuaW5nSm9iSWQ6IHN0cmluZyxcbiAgICBxdWVyeT86IEpvYkxpc3RFdmVudHNQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JFdmVudD47XG4gIGxpc3RFdmVudHMoXG4gICAgZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JFdmVudD47XG4gIGxpc3RFdmVudHMoXG4gICAgZmluZVR1bmluZ0pvYklkOiBzdHJpbmcsXG4gICAgcXVlcnk6IEpvYkxpc3RFdmVudHNQYXJhbXMgfCBDb3JlLlJlcXVlc3RPcHRpb25zID0ge30sXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuUGFnZVByb21pc2U8RmluZVR1bmluZ0pvYkV2ZW50c1BhZ2UsIEZpbmVUdW5pbmdKb2JFdmVudD4ge1xuICAgIGlmIChpc1JlcXVlc3RPcHRpb25zKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdEV2ZW50cyhmaW5lVHVuaW5nSm9iSWQsIHt9LCBxdWVyeSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0QVBJTGlzdChgL2ZpbmVfdHVuaW5nL2pvYnMvJHtmaW5lVHVuaW5nSm9iSWR9L2V2ZW50c2AsIEZpbmVUdW5pbmdKb2JFdmVudHNQYWdlLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZpbmVUdW5pbmdKb2JzUGFnZSBleHRlbmRzIEN1cnNvclBhZ2U8RmluZVR1bmluZ0pvYj4ge31cblxuZXhwb3J0IGNsYXNzIEZpbmVUdW5pbmdKb2JFdmVudHNQYWdlIGV4dGVuZHMgQ3Vyc29yUGFnZTxGaW5lVHVuaW5nSm9iRXZlbnQ+IHt9XG5cbi8qKlxuICogVGhlIGBmaW5lX3R1bmluZy5qb2JgIG9iamVjdCByZXByZXNlbnRzIGEgZmluZS10dW5pbmcgam9iIHRoYXQgaGFzIGJlZW4gY3JlYXRlZFxuICogdGhyb3VnaCB0aGUgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmVUdW5pbmdKb2Ige1xuICAvKipcbiAgICogVGhlIG9iamVjdCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGZpbmUtdHVuaW5nIGpvYiB3YXMgY3JlYXRlZC5cbiAgICovXG4gIGNyZWF0ZWRfYXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogRm9yIGZpbmUtdHVuaW5nIGpvYnMgdGhhdCBoYXZlIGBmYWlsZWRgLCB0aGlzIHdpbGwgY29udGFpbiBtb3JlIGluZm9ybWF0aW9uIG9uXG4gICAqIHRoZSBjYXVzZSBvZiB0aGUgZmFpbHVyZS5cbiAgICovXG4gIGVycm9yOiBGaW5lVHVuaW5nSm9iLkVycm9yIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbmUtdHVuZWQgbW9kZWwgdGhhdCBpcyBiZWluZyBjcmVhdGVkLiBUaGUgdmFsdWUgd2lsbCBiZSBudWxsXG4gICAqIGlmIHRoZSBmaW5lLXR1bmluZyBqb2IgaXMgc3RpbGwgcnVubmluZy5cbiAgICovXG4gIGZpbmVfdHVuZWRfbW9kZWw6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgZm9yIHdoZW4gdGhlIGZpbmUtdHVuaW5nIGpvYiB3YXMgZmluaXNoZWQuIFRoZVxuICAgKiB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhlIGZpbmUtdHVuaW5nIGpvYiBpcyBzdGlsbCBydW5uaW5nLlxuICAgKi9cbiAgZmluaXNoZWRfYXQ6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBoeXBlcnBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi4gU2VlIHRoZVxuICAgKiBbZmluZS10dW5pbmcgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZykgZm9yXG4gICAqIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGh5cGVycGFyYW1ldGVyczogRmluZVR1bmluZ0pvYi5IeXBlcnBhcmFtZXRlcnM7XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIG1vZGVsIHRoYXQgaXMgYmVpbmcgZmluZS10dW5lZC5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIFwiZmluZV90dW5pbmcuam9iXCIuXG4gICAqL1xuICBvYmplY3Q6ICdmaW5lX3R1bmluZy5qb2InO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JnYW5pemF0aW9uIHRoYXQgb3ducyB0aGUgZmluZS10dW5pbmcgam9iLlxuICAgKi9cbiAgb3JnYW5pemF0aW9uX2lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21waWxlZCByZXN1bHRzIGZpbGUgSUQocykgZm9yIHRoZSBmaW5lLXR1bmluZyBqb2IuIFlvdSBjYW4gcmV0cmlldmUgdGhlXG4gICAqIHJlc3VsdHMgd2l0aCB0aGVcbiAgICogW0ZpbGVzIEFQSV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcy9yZXRyaWV2ZS1jb250ZW50cykuXG4gICAqL1xuICByZXN1bHRfZmlsZXM6IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBzZWVkIHVzZWQgZm9yIHRoZSBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBzZWVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZmluZS10dW5pbmcgam9iLCB3aGljaCBjYW4gYmUgZWl0aGVyXG4gICAqIGB2YWxpZGF0aW5nX2ZpbGVzYCwgYHF1ZXVlZGAsIGBydW5uaW5nYCwgYHN1Y2NlZWRlZGAsIGBmYWlsZWRgLCBvciBgY2FuY2VsbGVkYC5cbiAgICovXG4gIHN0YXR1czogJ3ZhbGlkYXRpbmdfZmlsZXMnIHwgJ3F1ZXVlZCcgfCAncnVubmluZycgfCAnc3VjY2VlZGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgYmlsbGFibGUgdG9rZW5zIHByb2Nlc3NlZCBieSB0aGlzIGZpbmUtdHVuaW5nIGpvYi4gVGhlIHZhbHVlXG4gICAqIHdpbGwgYmUgbnVsbCBpZiB0aGUgZmluZS10dW5pbmcgam9iIGlzIHN0aWxsIHJ1bm5pbmcuXG4gICAqL1xuICB0cmFpbmVkX3Rva2VuczogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIGZpbGUgSUQgdXNlZCBmb3IgdHJhaW5pbmcuIFlvdSBjYW4gcmV0cmlldmUgdGhlIHRyYWluaW5nIGRhdGEgd2l0aCB0aGVcbiAgICogW0ZpbGVzIEFQSV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcy9yZXRyaWV2ZS1jb250ZW50cykuXG4gICAqL1xuICB0cmFpbmluZ19maWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIElEIHVzZWQgZm9yIHZhbGlkYXRpb24uIFlvdSBjYW4gcmV0cmlldmUgdGhlIHZhbGlkYXRpb24gcmVzdWx0cyB3aXRoXG4gICAqIHRoZVxuICAgKiBbRmlsZXMgQVBJXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9hcGktcmVmZXJlbmNlL2ZpbGVzL3JldHJpZXZlLWNvbnRlbnRzKS5cbiAgICovXG4gIHZhbGlkYXRpb25fZmlsZTogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIFVuaXggdGltZXN0YW1wIChpbiBzZWNvbmRzKSBmb3Igd2hlbiB0aGUgZmluZS10dW5pbmcgam9iIGlzIGVzdGltYXRlZCB0b1xuICAgKiBmaW5pc2guIFRoZSB2YWx1ZSB3aWxsIGJlIG51bGwgaWYgdGhlIGZpbmUtdHVuaW5nIGpvYiBpcyBub3QgcnVubmluZy5cbiAgICovXG4gIGVzdGltYXRlZF9maW5pc2g/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgaW50ZWdyYXRpb25zIHRvIGVuYWJsZSBmb3IgdGhpcyBmaW5lLXR1bmluZyBqb2IuXG4gICAqL1xuICBpbnRlZ3JhdGlvbnM/OiBBcnJheTxGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdD4gfCBudWxsO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbmVUdW5pbmdKb2Ige1xuICAvKipcbiAgICogRm9yIGZpbmUtdHVuaW5nIGpvYnMgdGhhdCBoYXZlIGBmYWlsZWRgLCB0aGlzIHdpbGwgY29udGFpbiBtb3JlIGluZm9ybWF0aW9uIG9uXG4gICAqIHRoZSBjYXVzZSBvZiB0aGUgZmFpbHVyZS5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIEEgbWFjaGluZS1yZWFkYWJsZSBlcnJvciBjb2RlLlxuICAgICAqL1xuICAgIGNvZGU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGFyYW1ldGVyIHRoYXQgd2FzIGludmFsaWQsIHVzdWFsbHkgYHRyYWluaW5nX2ZpbGVgIG9yIGB2YWxpZGF0aW9uX2ZpbGVgLlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGlmIHRoZSBmYWlsdXJlIHdhcyBub3QgcGFyYW1ldGVyLXNwZWNpZmljLlxuICAgICAqL1xuICAgIHBhcmFtOiBzdHJpbmcgfCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBoeXBlcnBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi4gU2VlIHRoZVxuICAgKiBbZmluZS10dW5pbmcgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZykgZm9yXG4gICAqIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgSHlwZXJwYXJhbWV0ZXJzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGVwb2NocyB0byB0cmFpbiB0aGUgbW9kZWwgZm9yLiBBbiBlcG9jaCByZWZlcnMgdG8gb25lIGZ1bGwgY3ljbGVcbiAgICAgKiB0aHJvdWdoIHRoZSB0cmFpbmluZyBkYXRhc2V0LiBcImF1dG9cIiBkZWNpZGVzIHRoZSBvcHRpbWFsIG51bWJlciBvZiBlcG9jaHMgYmFzZWRcbiAgICAgKiBvbiB0aGUgc2l6ZSBvZiB0aGUgZGF0YXNldC4gSWYgc2V0dGluZyB0aGUgbnVtYmVyIG1hbnVhbGx5LCB3ZSBzdXBwb3J0IGFueVxuICAgICAqIG51bWJlciBiZXR3ZWVuIDEgYW5kIDUwIGVwb2Nocy5cbiAgICAgKi9cbiAgICBuX2Vwb2NoczogJ2F1dG8nIHwgbnVtYmVyO1xuICB9XG59XG5cbi8qKlxuICogRmluZS10dW5pbmcgam9iIGV2ZW50IG9iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmVUdW5pbmdKb2JFdmVudCB7XG4gIGlkOiBzdHJpbmc7XG5cbiAgY3JlYXRlZF9hdDogbnVtYmVyO1xuXG4gIGxldmVsOiAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InO1xuXG4gIG1lc3NhZ2U6IHN0cmluZztcblxuICBvYmplY3Q6ICdmaW5lX3R1bmluZy5qb2IuZXZlbnQnO1xufVxuXG5leHBvcnQgdHlwZSBGaW5lVHVuaW5nSm9iSW50ZWdyYXRpb24gPSBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdDtcblxuLyoqXG4gKiBUaGUgc2V0dGluZ3MgZm9yIHlvdXIgaW50ZWdyYXRpb24gd2l0aCBXZWlnaHRzIGFuZCBCaWFzZXMuIFRoaXMgcGF5bG9hZFxuICogc3BlY2lmaWVzIHRoZSBwcm9qZWN0IHRoYXQgbWV0cmljcyB3aWxsIGJlIHNlbnQgdG8uIE9wdGlvbmFsbHksIHlvdSBjYW4gc2V0IGFuXG4gKiBleHBsaWNpdCBkaXNwbGF5IG5hbWUgZm9yIHlvdXIgcnVuLCBhZGQgdGFncyB0byB5b3VyIHJ1biwgYW5kIHNldCBhIGRlZmF1bHRcbiAqIGVudGl0eSAodGVhbSwgdXNlcm5hbWUsIGV0YykgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHlvdXIgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhlIG5ldyBydW4gd2lsbCBiZSBjcmVhdGVkIHVuZGVyLlxuICAgKi9cbiAgcHJvamVjdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHRvIHVzZSBmb3IgdGhlIHJ1bi4gVGhpcyBhbGxvd3MgeW91IHRvIHNldCB0aGUgdGVhbSBvciB1c2VybmFtZSBvZlxuICAgKiB0aGUgV2FuZEIgdXNlciB0aGF0IHlvdSB3b3VsZCBsaWtlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVuLiBJZiBub3Qgc2V0LCB0aGVcbiAgICogZGVmYXVsdCBlbnRpdHkgZm9yIHRoZSByZWdpc3RlcmVkIFdhbmRCIEFQSSBrZXkgaXMgdXNlZC5cbiAgICovXG4gIGVudGl0eT86IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgZGlzcGxheSBuYW1lIHRvIHNldCBmb3IgdGhlIHJ1bi4gSWYgbm90IHNldCwgd2Ugd2lsbCB1c2UgdGhlIEpvYiBJRCBhcyB0aGVcbiAgICogbmFtZS5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdGFncyB0byBiZSBhdHRhY2hlZCB0byB0aGUgbmV3bHkgY3JlYXRlZCBydW4uIFRoZXNlIHRhZ3MgYXJlIHBhc3NlZFxuICAgKiB0aHJvdWdoIGRpcmVjdGx5IHRvIFdhbmRCLiBTb21lIGRlZmF1bHQgdGFncyBhcmUgZ2VuZXJhdGVkIGJ5IE9wZW5BSTpcbiAgICogXCJvcGVuYWkvZmluZXR1bmVcIiwgXCJvcGVuYWkve2Jhc2UtbW9kZWx9XCIsIFwib3BlbmFpL3tmdGpvYi1hYmNkZWZ9XCIuXG4gICAqL1xuICB0YWdzPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdCB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgaW50ZWdyYXRpb24gYmVpbmcgZW5hYmxlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYlxuICAgKi9cbiAgdHlwZTogJ3dhbmRiJztcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIGZvciB5b3VyIGludGVncmF0aW9uIHdpdGggV2VpZ2h0cyBhbmQgQmlhc2VzLiBUaGlzIHBheWxvYWRcbiAgICogc3BlY2lmaWVzIHRoZSBwcm9qZWN0IHRoYXQgbWV0cmljcyB3aWxsIGJlIHNlbnQgdG8uIE9wdGlvbmFsbHksIHlvdSBjYW4gc2V0IGFuXG4gICAqIGV4cGxpY2l0IGRpc3BsYXkgbmFtZSBmb3IgeW91ciBydW4sIGFkZCB0YWdzIHRvIHlvdXIgcnVuLCBhbmQgc2V0IGEgZGVmYXVsdFxuICAgKiBlbnRpdHkgKHRlYW0sIHVzZXJuYW1lLCBldGMpIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIHJ1bi5cbiAgICovXG4gIHdhbmRiOiBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKb2JDcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1vZGVsIHRvIGZpbmUtdHVuZS4gWW91IGNhbiBzZWxlY3Qgb25lIG9mIHRoZVxuICAgKiBbc3VwcG9ydGVkIG1vZGVsc10oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvZ3VpZGVzL2ZpbmUtdHVuaW5nL3doYXQtbW9kZWxzLWNhbi1iZS1maW5lLXR1bmVkKS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ2JhYmJhZ2UtMDAyJyB8ICdkYXZpbmNpLTAwMicgfCAnZ3B0LTMuNS10dXJibyc7XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiBhbiB1cGxvYWRlZCBmaWxlIHRoYXQgY29udGFpbnMgdHJhaW5pbmcgZGF0YS5cbiAgICpcbiAgICogU2VlIFt1cGxvYWQgZmlsZV0oaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvYXBpLXJlZmVyZW5jZS9maWxlcy9jcmVhdGUpXG4gICAqIGZvciBob3cgdG8gdXBsb2FkIGEgZmlsZS5cbiAgICpcbiAgICogWW91ciBkYXRhc2V0IG11c3QgYmUgZm9ybWF0dGVkIGFzIGEgSlNPTkwgZmlsZS4gQWRkaXRpb25hbGx5LCB5b3UgbXVzdCB1cGxvYWRcbiAgICogeW91ciBmaWxlIHdpdGggdGhlIHB1cnBvc2UgYGZpbmUtdHVuZWAuXG4gICAqXG4gICAqIFNlZSB0aGUgW2ZpbmUtdHVuaW5nIGd1aWRlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvZmluZS10dW5pbmcpXG4gICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICB0cmFpbmluZ19maWxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBoeXBlcnBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGh5cGVycGFyYW1ldGVycz86IEpvYkNyZWF0ZVBhcmFtcy5IeXBlcnBhcmFtZXRlcnM7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgdG8gZW5hYmxlIGZvciB5b3VyIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGludGVncmF0aW9ucz86IEFycmF5PEpvYkNyZWF0ZVBhcmFtcy5JbnRlZ3JhdGlvbj4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VlZCBjb250cm9scyB0aGUgcmVwcm9kdWNpYmlsaXR5IG9mIHRoZSBqb2IuIFBhc3NpbmcgaW4gdGhlIHNhbWUgc2VlZCBhbmRcbiAgICogam9iIHBhcmFtZXRlcnMgc2hvdWxkIHByb2R1Y2UgdGhlIHNhbWUgcmVzdWx0cywgYnV0IG1heSBkaWZmZXIgaW4gcmFyZSBjYXNlcy4gSWZcbiAgICogYSBzZWVkIGlzIG5vdCBzcGVjaWZpZWQsIG9uZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgeW91LlxuICAgKi9cbiAgc2VlZD86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIG9mIHVwIHRvIDE4IGNoYXJhY3RlcnMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHlvdXIgZmluZS10dW5lZCBtb2RlbFxuICAgKiBuYW1lLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgYSBgc3VmZml4YCBvZiBcImN1c3RvbS1tb2RlbC1uYW1lXCIgd291bGQgcHJvZHVjZSBhIG1vZGVsIG5hbWUgbGlrZVxuICAgKiBgZnQ6Z3B0LTMuNS10dXJibzpvcGVuYWk6Y3VzdG9tLW1vZGVsLW5hbWU6N3A0bFVSZWxgLlxuICAgKi9cbiAgc3VmZml4Pzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIElEIG9mIGFuIHVwbG9hZGVkIGZpbGUgdGhhdCBjb250YWlucyB2YWxpZGF0aW9uIGRhdGEuXG4gICAqXG4gICAqIElmIHlvdSBwcm92aWRlIHRoaXMgZmlsZSwgdGhlIGRhdGEgaXMgdXNlZCB0byBnZW5lcmF0ZSB2YWxpZGF0aW9uIG1ldHJpY3NcbiAgICogcGVyaW9kaWNhbGx5IGR1cmluZyBmaW5lLXR1bmluZy4gVGhlc2UgbWV0cmljcyBjYW4gYmUgdmlld2VkIGluIHRoZSBmaW5lLXR1bmluZ1xuICAgKiByZXN1bHRzIGZpbGUuIFRoZSBzYW1lIGRhdGEgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGluIGJvdGggdHJhaW4gYW5kIHZhbGlkYXRpb25cbiAgICogZmlsZXMuXG4gICAqXG4gICAqIFlvdXIgZGF0YXNldCBtdXN0IGJlIGZvcm1hdHRlZCBhcyBhIEpTT05MIGZpbGUuIFlvdSBtdXN0IHVwbG9hZCB5b3VyIGZpbGUgd2l0aFxuICAgKiB0aGUgcHVycG9zZSBgZmluZS10dW5lYC5cbiAgICpcbiAgICogU2VlIHRoZSBbZmluZS10dW5pbmcgZ3VpZGVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9maW5lLXR1bmluZylcbiAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIHZhbGlkYXRpb25fZmlsZT86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgSm9iQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBoeXBlcnBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGZpbmUtdHVuaW5nIGpvYi5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgSHlwZXJwYXJhbWV0ZXJzIHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZXhhbXBsZXMgaW4gZWFjaCBiYXRjaC4gQSBsYXJnZXIgYmF0Y2ggc2l6ZSBtZWFucyB0aGF0IG1vZGVsXG4gICAgICogcGFyYW1ldGVycyBhcmUgdXBkYXRlZCBsZXNzIGZyZXF1ZW50bHksIGJ1dCB3aXRoIGxvd2VyIHZhcmlhbmNlLlxuICAgICAqL1xuICAgIGJhdGNoX3NpemU/OiAnYXV0bycgfCBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBTY2FsaW5nIGZhY3RvciBmb3IgdGhlIGxlYXJuaW5nIHJhdGUuIEEgc21hbGxlciBsZWFybmluZyByYXRlIG1heSBiZSB1c2VmdWwgdG9cbiAgICAgKiBhdm9pZCBvdmVyZml0dGluZy5cbiAgICAgKi9cbiAgICBsZWFybmluZ19yYXRlX211bHRpcGxpZXI/OiAnYXV0bycgfCBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGVwb2NocyB0byB0cmFpbiB0aGUgbW9kZWwgZm9yLiBBbiBlcG9jaCByZWZlcnMgdG8gb25lIGZ1bGwgY3ljbGVcbiAgICAgKiB0aHJvdWdoIHRoZSB0cmFpbmluZyBkYXRhc2V0LlxuICAgICAqL1xuICAgIG5fZXBvY2hzPzogJ2F1dG8nIHwgbnVtYmVyO1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBJbnRlZ3JhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgaW50ZWdyYXRpb24gdG8gZW5hYmxlLiBDdXJyZW50bHksIG9ubHkgXCJ3YW5kYlwiIChXZWlnaHRzIGFuZCBCaWFzZXMpXG4gICAgICogaXMgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIHR5cGU6ICd3YW5kYic7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGluZ3MgZm9yIHlvdXIgaW50ZWdyYXRpb24gd2l0aCBXZWlnaHRzIGFuZCBCaWFzZXMuIFRoaXMgcGF5bG9hZFxuICAgICAqIHNwZWNpZmllcyB0aGUgcHJvamVjdCB0aGF0IG1ldHJpY3Mgd2lsbCBiZSBzZW50IHRvLiBPcHRpb25hbGx5LCB5b3UgY2FuIHNldCBhblxuICAgICAqIGV4cGxpY2l0IGRpc3BsYXkgbmFtZSBmb3IgeW91ciBydW4sIGFkZCB0YWdzIHRvIHlvdXIgcnVuLCBhbmQgc2V0IGEgZGVmYXVsdFxuICAgICAqIGVudGl0eSAodGVhbSwgdXNlcm5hbWUsIGV0YykgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHlvdXIgcnVuLlxuICAgICAqL1xuICAgIHdhbmRiOiBJbnRlZ3JhdGlvbi5XYW5kYjtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgSW50ZWdyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0aW5ncyBmb3IgeW91ciBpbnRlZ3JhdGlvbiB3aXRoIFdlaWdodHMgYW5kIEJpYXNlcy4gVGhpcyBwYXlsb2FkXG4gICAgICogc3BlY2lmaWVzIHRoZSBwcm9qZWN0IHRoYXQgbWV0cmljcyB3aWxsIGJlIHNlbnQgdG8uIE9wdGlvbmFsbHksIHlvdSBjYW4gc2V0IGFuXG4gICAgICogZXhwbGljaXQgZGlzcGxheSBuYW1lIGZvciB5b3VyIHJ1biwgYWRkIHRhZ3MgdG8geW91ciBydW4sIGFuZCBzZXQgYSBkZWZhdWx0XG4gICAgICogZW50aXR5ICh0ZWFtLCB1c2VybmFtZSwgZXRjKSB0byBiZSBhc3NvY2lhdGVkIHdpdGggeW91ciBydW4uXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBXYW5kYiB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRoYXQgdGhlIG5ldyBydW4gd2lsbCBiZSBjcmVhdGVkIHVuZGVyLlxuICAgICAgICovXG4gICAgICBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIGVudGl0eSB0byB1c2UgZm9yIHRoZSBydW4uIFRoaXMgYWxsb3dzIHlvdSB0byBzZXQgdGhlIHRlYW0gb3IgdXNlcm5hbWUgb2ZcbiAgICAgICAqIHRoZSBXYW5kQiB1c2VyIHRoYXQgeW91IHdvdWxkIGxpa2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBydW4uIElmIG5vdCBzZXQsIHRoZVxuICAgICAgICogZGVmYXVsdCBlbnRpdHkgZm9yIHRoZSByZWdpc3RlcmVkIFdhbmRCIEFQSSBrZXkgaXMgdXNlZC5cbiAgICAgICAqL1xuICAgICAgZW50aXR5Pzogc3RyaW5nIHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGRpc3BsYXkgbmFtZSB0byBzZXQgZm9yIHRoZSBydW4uIElmIG5vdCBzZXQsIHdlIHdpbGwgdXNlIHRoZSBKb2IgSUQgYXMgdGhlXG4gICAgICAgKiBuYW1lLlxuICAgICAgICovXG4gICAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGxpc3Qgb2YgdGFncyB0byBiZSBhdHRhY2hlZCB0byB0aGUgbmV3bHkgY3JlYXRlZCBydW4uIFRoZXNlIHRhZ3MgYXJlIHBhc3NlZFxuICAgICAgICogdGhyb3VnaCBkaXJlY3RseSB0byBXYW5kQi4gU29tZSBkZWZhdWx0IHRhZ3MgYXJlIGdlbmVyYXRlZCBieSBPcGVuQUk6XG4gICAgICAgKiBcIm9wZW5haS9maW5ldHVuZVwiLCBcIm9wZW5haS97YmFzZS1tb2RlbH1cIiwgXCJvcGVuYWkve2Z0am9iLWFiY2RlZn1cIi5cbiAgICAgICAqL1xuICAgICAgdGFncz86IEFycmF5PHN0cmluZz47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSm9iTGlzdFBhcmFtcyBleHRlbmRzIEN1cnNvclBhZ2VQYXJhbXMge31cblxuZXhwb3J0IGludGVyZmFjZSBKb2JMaXN0RXZlbnRzUGFyYW1zIGV4dGVuZHMgQ3Vyc29yUGFnZVBhcmFtcyB7fVxuXG5leHBvcnQgbmFtZXNwYWNlIEpvYnMge1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2IgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2I7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkV2ZW50ID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iRXZlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkludGVncmF0aW9uID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iSW50ZWdyYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb24gPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uT2JqZWN0ID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbk9iamVjdDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9ic1BhZ2UgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iRXZlbnRzUGFnZSA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYkV2ZW50c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgSm9iQ3JlYXRlUGFyYW1zID0gSm9ic0FQSS5Kb2JDcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgSm9iTGlzdFBhcmFtcyA9IEpvYnNBUEkuSm9iTGlzdFBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBKb2JMaXN0RXZlbnRzUGFyYW1zID0gSm9ic0FQSS5Kb2JMaXN0RXZlbnRzUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENoZWNrcG9pbnRzID0gQ2hlY2twb2ludHNBUEkuQ2hlY2twb2ludHM7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYkNoZWNrcG9pbnQgPSBDaGVja3BvaW50c0FQSS5GaW5lVHVuaW5nSm9iQ2hlY2twb2ludDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iQ2hlY2twb2ludHNQYWdlID0gQ2hlY2twb2ludHNBUEkuRmluZVR1bmluZ0pvYkNoZWNrcG9pbnRzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBDaGVja3BvaW50TGlzdFBhcmFtcyA9IENoZWNrcG9pbnRzQVBJLkNoZWNrcG9pbnRMaXN0UGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgKiBhcyBKb2JzQVBJIGZyb20gXCIuL2pvYnMvam9ic1wiO1xuXG5leHBvcnQgY2xhc3MgRmluZVR1bmluZyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgam9iczogSm9ic0FQSS5Kb2JzID0gbmV3IEpvYnNBUEkuSm9icyh0aGlzLl9jbGllbnQpO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZpbmVUdW5pbmcge1xuICBleHBvcnQgaW1wb3J0IEpvYnMgPSBKb2JzQVBJLkpvYnM7XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYiA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYjtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iRXZlbnQgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JFdmVudDtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iSW50ZWdyYXRpb24gPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JJbnRlZ3JhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGaW5lVHVuaW5nSm9iV2FuZGJJbnRlZ3JhdGlvbiA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgRmluZVR1bmluZ0pvYldhbmRiSW50ZWdyYXRpb25PYmplY3QgPSBKb2JzQVBJLkZpbmVUdW5pbmdKb2JXYW5kYkludGVncmF0aW9uT2JqZWN0O1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JzUGFnZSA9IEpvYnNBUEkuRmluZVR1bmluZ0pvYnNQYWdlO1xuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmdKb2JFdmVudHNQYWdlID0gSm9ic0FQSS5GaW5lVHVuaW5nSm9iRXZlbnRzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBKb2JDcmVhdGVQYXJhbXMgPSBKb2JzQVBJLkpvYkNyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBKb2JMaXN0UGFyYW1zID0gSm9ic0FQSS5Kb2JMaXN0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEpvYkxpc3RFdmVudHNQYXJhbXMgPSBKb2JzQVBJLkpvYkxpc3RFdmVudHNQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy4gU2VlIENPTlRSSUJVVElORy5tZCBmb3IgZGV0YWlscy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tIFwiLi4vY29yZVwiO1xuaW1wb3J0IHsgQVBJUmVzb3VyY2UgfSBmcm9tIFwiLi4vcmVzb3VyY2VcIjtcbmltcG9ydCAqIGFzIEltYWdlc0FQSSBmcm9tIFwiLi9pbWFnZXNcIjtcbmltcG9ydCB7IHR5cGUgVXBsb2FkYWJsZSwgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIEltYWdlcyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB2YXJpYXRpb24gb2YgYSBnaXZlbiBpbWFnZS5cbiAgICovXG4gIGNyZWF0ZVZhcmlhdGlvbihcbiAgICBib2R5OiBJbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPEltYWdlc1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvaW1hZ2VzL3ZhcmlhdGlvbnMnLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMoeyBib2R5LCAuLi5vcHRpb25zIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVkaXRlZCBvciBleHRlbmRlZCBpbWFnZSBnaXZlbiBhbiBvcmlnaW5hbCBpbWFnZSBhbmQgYSBwcm9tcHQuXG4gICAqL1xuICBlZGl0KGJvZHk6IEltYWdlRWRpdFBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8SW1hZ2VzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9pbWFnZXMvZWRpdHMnLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMoeyBib2R5LCAuLi5vcHRpb25zIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGltYWdlIGdpdmVuIGEgcHJvbXB0LlxuICAgKi9cbiAgZ2VuZXJhdGUoYm9keTogSW1hZ2VHZW5lcmF0ZVBhcmFtcywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8SW1hZ2VzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoJy9pbWFnZXMvZ2VuZXJhdGlvbnMnLCB7IGJvZHksIC4uLm9wdGlvbnMgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB1cmwgb3IgdGhlIGNvbnRlbnQgb2YgYW4gaW1hZ2UgZ2VuZXJhdGVkIGJ5IHRoZSBPcGVuQUkgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlNjQtZW5jb2RlZCBKU09OIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UsIGlmIGByZXNwb25zZV9mb3JtYXRgIGlzXG4gICAqIGBiNjRfanNvbmAuXG4gICAqL1xuICBiNjRfanNvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb21wdCB0aGF0IHdhcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBpbWFnZSwgaWYgdGhlcmUgd2FzIGFueSByZXZpc2lvbiB0byB0aGVcbiAgICogcHJvbXB0LlxuICAgKi9cbiAgcmV2aXNlZF9wcm9tcHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZSwgaWYgYHJlc3BvbnNlX2Zvcm1hdGAgaXMgYHVybGAgKGRlZmF1bHQpLlxuICAgKi9cbiAgdXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlc1Jlc3BvbnNlIHtcbiAgY3JlYXRlZDogbnVtYmVyO1xuXG4gIGRhdGE6IEFycmF5PEltYWdlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgdGhlIHZhcmlhdGlvbihzKS4gTXVzdCBiZSBhIHZhbGlkIFBORyBmaWxlLFxuICAgKiBsZXNzIHRoYW4gNE1CLCBhbmQgc3F1YXJlLlxuICAgKi9cbiAgaW1hZ2U6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlbCB0byB1c2UgZm9yIGltYWdlIGdlbmVyYXRpb24uIE9ubHkgYGRhbGwtZS0yYCBpcyBzdXBwb3J0ZWQgYXQgdGhpc1xuICAgKiB0aW1lLlxuICAgKi9cbiAgbW9kZWw/OiAoc3RyaW5nICYge30pIHwgJ2RhbGwtZS0yJyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaW1hZ2VzIHRvIGdlbmVyYXRlLiBNdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAuIEZvciBgZGFsbC1lLTNgLCBvbmx5XG4gICAqIGBuPTFgIGlzIHN1cHBvcnRlZC5cbiAgICovXG4gIG4/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzIGFyZSByZXR1cm5lZC4gTXVzdCBiZSBvbmUgb2YgYHVybGAgb3JcbiAgICogYGI2NF9qc29uYC4gVVJMcyBhcmUgb25seSB2YWxpZCBmb3IgNjAgbWludXRlcyBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW5cbiAgICogZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogJ3VybCcgfCAnYjY0X2pzb24nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZXMuIE11c3QgYmUgb25lIG9mIGAyNTZ4MjU2YCwgYDUxMng1MTJgLCBvclxuICAgKiBgMTAyNHgxMDI0YC5cbiAgICovXG4gIHNpemU/OiAnMjU2eDI1NicgfCAnNTEyeDUxMicgfCAnMTAyNHgxMDI0JyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0byBtb25pdG9yXG4gICAqIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAqIFtMZWFybiBtb3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkcykuXG4gICAqL1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlRWRpdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgdG8gZWRpdC4gTXVzdCBiZSBhIHZhbGlkIFBORyBmaWxlLCBsZXNzIHRoYW4gNE1CLCBhbmQgc3F1YXJlLiBJZiBtYXNrXG4gICAqIGlzIG5vdCBwcm92aWRlZCwgaW1hZ2UgbXVzdCBoYXZlIHRyYW5zcGFyZW5jeSwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBtYXNrLlxuICAgKi9cbiAgaW1hZ2U6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgZGVzaXJlZCBpbWFnZShzKS4gVGhlIG1heGltdW0gbGVuZ3RoIGlzIDEwMDBcbiAgICogY2hhcmFjdGVycy5cbiAgICovXG4gIHByb21wdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhZGRpdGlvbmFsIGltYWdlIHdob3NlIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWFzIChlLmcuIHdoZXJlIGFscGhhIGlzIHplcm8pXG4gICAqIGluZGljYXRlIHdoZXJlIGBpbWFnZWAgc2hvdWxkIGJlIGVkaXRlZC4gTXVzdCBiZSBhIHZhbGlkIFBORyBmaWxlLCBsZXNzIHRoYW5cbiAgICogNE1CLCBhbmQgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25zIGFzIGBpbWFnZWAuXG4gICAqL1xuICBtYXNrPzogVXBsb2FkYWJsZTtcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRvIHVzZSBmb3IgaW1hZ2UgZ2VuZXJhdGlvbi4gT25seSBgZGFsbC1lLTJgIGlzIHN1cHBvcnRlZCBhdCB0aGlzXG4gICAqIHRpbWUuXG4gICAqL1xuICBtb2RlbD86IChzdHJpbmcgJiB7fSkgfCAnZGFsbC1lLTInIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBpbWFnZXMgdG8gZ2VuZXJhdGUuIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMC5cbiAgICovXG4gIG4/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzIGFyZSByZXR1cm5lZC4gTXVzdCBiZSBvbmUgb2YgYHVybGAgb3JcbiAgICogYGI2NF9qc29uYC4gVVJMcyBhcmUgb25seSB2YWxpZCBmb3IgNjAgbWludXRlcyBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW5cbiAgICogZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogJ3VybCcgfCAnYjY0X2pzb24nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZXMuIE11c3QgYmUgb25lIG9mIGAyNTZ4MjU2YCwgYDUxMng1MTJgLCBvclxuICAgKiBgMTAyNHgxMDI0YC5cbiAgICovXG4gIHNpemU/OiAnMjU2eDI1NicgfCAnNTEyeDUxMicgfCAnMTAyNHgxMDI0JyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHlvdXIgZW5kLXVzZXIsIHdoaWNoIGNhbiBoZWxwIE9wZW5BSSB0byBtb25pdG9yXG4gICAqIGFuZCBkZXRlY3QgYWJ1c2UuXG4gICAqIFtMZWFybiBtb3JlXShodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vZG9jcy9ndWlkZXMvc2FmZXR5LWJlc3QtcHJhY3RpY2VzL2VuZC11c2VyLWlkcykuXG4gICAqL1xuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlR2VuZXJhdGVQYXJhbXMge1xuICAvKipcbiAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBkZXNpcmVkIGltYWdlKHMpLiBUaGUgbWF4aW11bSBsZW5ndGggaXMgMTAwMFxuICAgKiBjaGFyYWN0ZXJzIGZvciBgZGFsbC1lLTJgIGFuZCA0MDAwIGNoYXJhY3RlcnMgZm9yIGBkYWxsLWUtM2AuXG4gICAqL1xuICBwcm9tcHQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHRvIHVzZSBmb3IgaW1hZ2UgZ2VuZXJhdGlvbi5cbiAgICovXG4gIG1vZGVsPzogKHN0cmluZyAmIHt9KSB8ICdkYWxsLWUtMicgfCAnZGFsbC1lLTMnIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBpbWFnZXMgdG8gZ2VuZXJhdGUuIE11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMC4gRm9yIGBkYWxsLWUtM2AsIG9ubHlcbiAgICogYG49MWAgaXMgc3VwcG9ydGVkLlxuICAgKi9cbiAgbj86IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBxdWFsaXR5IG9mIHRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkLiBgaGRgIGNyZWF0ZXMgaW1hZ2VzIHdpdGggZmluZXJcbiAgICogZGV0YWlscyBhbmQgZ3JlYXRlciBjb25zaXN0ZW5jeSBhY3Jvc3MgdGhlIGltYWdlLiBUaGlzIHBhcmFtIGlzIG9ubHkgc3VwcG9ydGVkXG4gICAqIGZvciBgZGFsbC1lLTNgLlxuICAgKi9cbiAgcXVhbGl0eT86ICdzdGFuZGFyZCcgfCAnaGQnO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzIGFyZSByZXR1cm5lZC4gTXVzdCBiZSBvbmUgb2YgYHVybGAgb3JcbiAgICogYGI2NF9qc29uYC4gVVJMcyBhcmUgb25seSB2YWxpZCBmb3IgNjAgbWludXRlcyBhZnRlciB0aGUgaW1hZ2UgaGFzIGJlZW5cbiAgICogZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVzcG9uc2VfZm9ybWF0PzogJ3VybCcgfCAnYjY0X2pzb24nIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZXMuIE11c3QgYmUgb25lIG9mIGAyNTZ4MjU2YCwgYDUxMng1MTJgLCBvclxuICAgKiBgMTAyNHgxMDI0YCBmb3IgYGRhbGwtZS0yYC4gTXVzdCBiZSBvbmUgb2YgYDEwMjR4MTAyNGAsIGAxNzkyeDEwMjRgLCBvclxuICAgKiBgMTAyNHgxNzkyYCBmb3IgYGRhbGwtZS0zYCBtb2RlbHMuXG4gICAqL1xuICBzaXplPzogJzI1NngyNTYnIHwgJzUxMng1MTInIHwgJzEwMjR4MTAyNCcgfCAnMTc5MngxMDI0JyB8ICcxMDI0eDE3OTInIHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHN0eWxlIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VzLiBNdXN0IGJlIG9uZSBvZiBgdml2aWRgIG9yIGBuYXR1cmFsYC4gVml2aWRcbiAgICogY2F1c2VzIHRoZSBtb2RlbCB0byBsZWFuIHRvd2FyZHMgZ2VuZXJhdGluZyBoeXBlci1yZWFsIGFuZCBkcmFtYXRpYyBpbWFnZXMuXG4gICAqIE5hdHVyYWwgY2F1c2VzIHRoZSBtb2RlbCB0byBwcm9kdWNlIG1vcmUgbmF0dXJhbCwgbGVzcyBoeXBlci1yZWFsIGxvb2tpbmdcbiAgICogaW1hZ2VzLiBUaGlzIHBhcmFtIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBgZGFsbC1lLTNgLlxuICAgKi9cbiAgc3R5bGU/OiAndml2aWQnIHwgJ25hdHVyYWwnIHwgbnVsbDtcblxuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZmllciByZXByZXNlbnRpbmcgeW91ciBlbmQtdXNlciwgd2hpY2ggY2FuIGhlbHAgT3BlbkFJIHRvIG1vbml0b3JcbiAgICogYW5kIGRldGVjdCBhYnVzZS5cbiAgICogW0xlYXJuIG1vcmVdKGh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9kb2NzL2d1aWRlcy9zYWZldHktYmVzdC1wcmFjdGljZXMvZW5kLXVzZXItaWRzKS5cbiAgICovXG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgSW1hZ2VzIHtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZSA9IEltYWdlc0FQSS5JbWFnZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZXNSZXNwb25zZSA9IEltYWdlc0FQSS5JbWFnZXNSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcyA9IEltYWdlc0FQSS5JbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUVkaXRQYXJhbXMgPSBJbWFnZXNBUEkuSW1hZ2VFZGl0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEltYWdlR2VuZXJhdGVQYXJhbXMgPSBJbWFnZXNBUEkuSW1hZ2VHZW5lcmF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgTW9kZWxzQVBJIGZyb20gXCIuL21vZGVsc1wiO1xuaW1wb3J0IHsgUGFnZSB9IGZyb20gXCIuLi9wYWdpbmF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNb2RlbHMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSwgcHJvdmlkaW5nIGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb2RlbCBzdWNoIGFzXG4gICAqIHRoZSBvd25lciBhbmQgcGVybWlzc2lvbmluZy5cbiAgICovXG4gIHJldHJpZXZlKG1vZGVsOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPE1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC9tb2RlbHMvJHttb2RlbH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBtb2RlbHMsIGFuZCBwcm92aWRlcyBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoXG4gICAqIG9uZSBzdWNoIGFzIHRoZSBvd25lciBhbmQgYXZhaWxhYmlsaXR5LlxuICAgKi9cbiAgbGlzdChvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuUGFnZVByb21pc2U8TW9kZWxzUGFnZSwgTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LmdldEFQSUxpc3QoJy9tb2RlbHMnLCBNb2RlbHNQYWdlLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBmaW5lLXR1bmVkIG1vZGVsLiBZb3UgbXVzdCBoYXZlIHRoZSBPd25lciByb2xlIGluIHlvdXIgb3JnYW5pemF0aW9uIHRvXG4gICAqIGRlbGV0ZSBhIG1vZGVsLlxuICAgKi9cbiAgZGVsKG1vZGVsOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPE1vZGVsRGVsZXRlZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvbW9kZWxzLyR7bW9kZWx9YCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBOb3RlOiBubyBwYWdpbmF0aW9uIGFjdHVhbGx5IG9jY3VycyB5ZXQsIHRoaXMgaXMgZm9yIGZvcndhcmRzLWNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbHNQYWdlIGV4dGVuZHMgUGFnZTxNb2RlbD4ge31cblxuLyoqXG4gKiBEZXNjcmliZXMgYW4gT3BlbkFJIG1vZGVsIG9mZmVyaW5nIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsIHtcbiAgLyoqXG4gICAqIFRoZSBtb2RlbCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiB0aGUgQVBJIGVuZHBvaW50cy5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVbml4IHRpbWVzdGFtcCAoaW4gc2Vjb25kcykgd2hlbiB0aGUgbW9kZWwgd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBjcmVhdGVkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMgYWx3YXlzIFwibW9kZWxcIi5cbiAgICovXG4gIG9iamVjdDogJ21vZGVsJztcblxuICAvKipcbiAgICogVGhlIG9yZ2FuaXphdGlvbiB0aGF0IG93bnMgdGhlIG1vZGVsLlxuICAgKi9cbiAgb3duZWRfYnk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2RlbERlbGV0ZWQge1xuICBpZDogc3RyaW5nO1xuXG4gIGRlbGV0ZWQ6IGJvb2xlYW47XG5cbiAgb2JqZWN0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9kZWxzIHtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbCA9IE1vZGVsc0FQSS5Nb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbERlbGV0ZWQgPSBNb2RlbHNBUEkuTW9kZWxEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IE1vZGVsc1BhZ2UgPSBNb2RlbHNBUEkuTW9kZWxzUGFnZTtcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLiBTZWUgQ09OVFJJQlVUSU5HLm1kIGZvciBkZXRhaWxzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgTW9kZXJhdGlvbnNBUEkgZnJvbSBcIi4vbW9kZXJhdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIE1vZGVyYXRpb25zIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogQ2xhc3NpZmllcyBpZiB0ZXh0IGlzIHBvdGVudGlhbGx5IGhhcm1mdWwuXG4gICAqL1xuICBjcmVhdGUoXG4gICAgYm9keTogTW9kZXJhdGlvbkNyZWF0ZVBhcmFtcyxcbiAgICBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyxcbiAgKTogQ29yZS5BUElQcm9taXNlPE1vZGVyYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQucG9zdCgnL21vZGVyYXRpb25zJywgeyBib2R5LCAuLi5vcHRpb25zIH0pO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdGhlIGNhdGVnb3JpZXMsIGFuZCB3aGV0aGVyIHRoZXkgYXJlIGZsYWdnZWQgb3Igbm90LlxuICAgKi9cbiAgY2F0ZWdvcmllczogTW9kZXJhdGlvbi5DYXRlZ29yaWVzO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdGhlIGNhdGVnb3JpZXMgYWxvbmcgd2l0aCB0aGVpciBzY29yZXMgYXMgcHJlZGljdGVkIGJ5IG1vZGVsLlxuICAgKi9cbiAgY2F0ZWdvcnlfc2NvcmVzOiBNb2RlcmF0aW9uLkNhdGVnb3J5U2NvcmVzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFueSBvZiB0aGUgYmVsb3cgY2F0ZWdvcmllcyBhcmUgZmxhZ2dlZC5cbiAgICovXG4gIGZsYWdnZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9kZXJhdGlvbiB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdGhlIGNhdGVnb3JpZXMsIGFuZCB3aGV0aGVyIHRoZXkgYXJlIGZsYWdnZWQgb3Igbm90LlxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yaWVzIHtcbiAgICAvKipcbiAgICAgKiBDb250ZW50IHRoYXQgZXhwcmVzc2VzLCBpbmNpdGVzLCBvciBwcm9tb3RlcyBoYXJhc3NpbmcgbGFuZ3VhZ2UgdG93YXJkcyBhbnlcbiAgICAgKiB0YXJnZXQuXG4gICAgICovXG4gICAgaGFyYXNzbWVudDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEhhcmFzc21lbnQgY29udGVudCB0aGF0IGFsc28gaW5jbHVkZXMgdmlvbGVuY2Ugb3Igc2VyaW91cyBoYXJtIHRvd2FyZHMgYW55XG4gICAgICogdGFyZ2V0LlxuICAgICAqL1xuICAgICdoYXJhc3NtZW50L3RocmVhdGVuaW5nJzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgdGhhdCBleHByZXNzZXMsIGluY2l0ZXMsIG9yIHByb21vdGVzIGhhdGUgYmFzZWQgb24gcmFjZSwgZ2VuZGVyLFxuICAgICAqIGV0aG5pY2l0eSwgcmVsaWdpb24sIG5hdGlvbmFsaXR5LCBzZXh1YWwgb3JpZW50YXRpb24sIGRpc2FiaWxpdHkgc3RhdHVzLCBvclxuICAgICAqIGNhc3RlLiBIYXRlZnVsIGNvbnRlbnQgYWltZWQgYXQgbm9uLXByb3RlY3RlZCBncm91cHMgKGUuZy4sIGNoZXNzIHBsYXllcnMpIGlzXG4gICAgICogaGFyYXNzbWVudC5cbiAgICAgKi9cbiAgICBoYXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSGF0ZWZ1bCBjb250ZW50IHRoYXQgYWxzbyBpbmNsdWRlcyB2aW9sZW5jZSBvciBzZXJpb3VzIGhhcm0gdG93YXJkcyB0aGUgdGFyZ2V0ZWRcbiAgICAgKiBncm91cCBiYXNlZCBvbiByYWNlLCBnZW5kZXIsIGV0aG5pY2l0eSwgcmVsaWdpb24sIG5hdGlvbmFsaXR5LCBzZXh1YWxcbiAgICAgKiBvcmllbnRhdGlvbiwgZGlzYWJpbGl0eSBzdGF0dXMsIG9yIGNhc3RlLlxuICAgICAqL1xuICAgICdoYXRlL3RocmVhdGVuaW5nJzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgdGhhdCBwcm9tb3RlcywgZW5jb3VyYWdlcywgb3IgZGVwaWN0cyBhY3RzIG9mIHNlbGYtaGFybSwgc3VjaCBhc1xuICAgICAqIHN1aWNpZGUsIGN1dHRpbmcsIGFuZCBlYXRpbmcgZGlzb3JkZXJzLlxuICAgICAqL1xuICAgICdzZWxmLWhhcm0nOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCB0aGF0IGVuY291cmFnZXMgcGVyZm9ybWluZyBhY3RzIG9mIHNlbGYtaGFybSwgc3VjaCBhcyBzdWljaWRlLCBjdXR0aW5nLFxuICAgICAqIGFuZCBlYXRpbmcgZGlzb3JkZXJzLCBvciB0aGF0IGdpdmVzIGluc3RydWN0aW9ucyBvciBhZHZpY2Ugb24gaG93IHRvIGNvbW1pdCBzdWNoXG4gICAgICogYWN0cy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtL2luc3RydWN0aW9ucyc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IHdoZXJlIHRoZSBzcGVha2VyIGV4cHJlc3NlcyB0aGF0IHRoZXkgYXJlIGVuZ2FnaW5nIG9yIGludGVuZCB0byBlbmdhZ2VcbiAgICAgKiBpbiBhY3RzIG9mIHNlbGYtaGFybSwgc3VjaCBhcyBzdWljaWRlLCBjdXR0aW5nLCBhbmQgZWF0aW5nIGRpc29yZGVycy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtL2ludGVudCc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IG1lYW50IHRvIGFyb3VzZSBzZXh1YWwgZXhjaXRlbWVudCwgc3VjaCBhcyB0aGUgZGVzY3JpcHRpb24gb2Ygc2V4dWFsXG4gICAgICogYWN0aXZpdHksIG9yIHRoYXQgcHJvbW90ZXMgc2V4dWFsIHNlcnZpY2VzIChleGNsdWRpbmcgc2V4IGVkdWNhdGlvbiBhbmRcbiAgICAgKiB3ZWxsbmVzcykuXG4gICAgICovXG4gICAgc2V4dWFsOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU2V4dWFsIGNvbnRlbnQgdGhhdCBpbmNsdWRlcyBhbiBpbmRpdmlkdWFsIHdobyBpcyB1bmRlciAxOCB5ZWFycyBvbGQuXG4gICAgICovXG4gICAgJ3NleHVhbC9taW5vcnMnOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCB0aGF0IGRlcGljdHMgZGVhdGgsIHZpb2xlbmNlLCBvciBwaHlzaWNhbCBpbmp1cnkuXG4gICAgICovXG4gICAgdmlvbGVuY2U6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb250ZW50IHRoYXQgZGVwaWN0cyBkZWF0aCwgdmlvbGVuY2UsIG9yIHBoeXNpY2FsIGluanVyeSBpbiBncmFwaGljIGRldGFpbC5cbiAgICAgKi9cbiAgICAndmlvbGVuY2UvZ3JhcGhpYyc6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogQSBsaXN0IG9mIHRoZSBjYXRlZ29yaWVzIGFsb25nIHdpdGggdGhlaXIgc2NvcmVzIGFzIHByZWRpY3RlZCBieSBtb2RlbC5cbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcnlTY29yZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdoYXJhc3NtZW50Jy5cbiAgICAgKi9cbiAgICBoYXJhc3NtZW50OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnaGFyYXNzbWVudC90aHJlYXRlbmluZycuXG4gICAgICovXG4gICAgJ2hhcmFzc21lbnQvdGhyZWF0ZW5pbmcnOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgZm9yIHRoZSBjYXRlZ29yeSAnaGF0ZScuXG4gICAgICovXG4gICAgaGF0ZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ2hhdGUvdGhyZWF0ZW5pbmcnLlxuICAgICAqL1xuICAgICdoYXRlL3RocmVhdGVuaW5nJzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ3NlbGYtaGFybScuXG4gICAgICovXG4gICAgJ3NlbGYtaGFybSc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZWxmLWhhcm0vaW5zdHJ1Y3Rpb25zJy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtL2luc3RydWN0aW9ucyc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZWxmLWhhcm0vaW50ZW50Jy5cbiAgICAgKi9cbiAgICAnc2VsZi1oYXJtL2ludGVudCc6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSBmb3IgdGhlIGNhdGVnb3J5ICdzZXh1YWwnLlxuICAgICAqL1xuICAgIHNleHVhbDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ3NleHVhbC9taW5vcnMnLlxuICAgICAqL1xuICAgICdzZXh1YWwvbWlub3JzJzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ3Zpb2xlbmNlJy5cbiAgICAgKi9cbiAgICB2aW9sZW5jZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIGZvciB0aGUgY2F0ZWdvcnkgJ3Zpb2xlbmNlL2dyYXBoaWMnLlxuICAgICAqL1xuICAgICd2aW9sZW5jZS9ncmFwaGljJzogbnVtYmVyO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBpZiBhIGdpdmVuIHRleHQgaW5wdXQgaXMgcG90ZW50aWFsbHkgaGFybWZ1bC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlcmF0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbW9kZXJhdGlvbiByZXF1ZXN0LlxuICAgKi9cbiAgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZGVsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIG1vZGVyYXRpb24gcmVzdWx0cy5cbiAgICovXG4gIG1vZGVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBtb2RlcmF0aW9uIG9iamVjdHMuXG4gICAqL1xuICByZXN1bHRzOiBBcnJheTxNb2RlcmF0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2RlcmF0aW9uQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpbnB1dCB0ZXh0IHRvIGNsYXNzaWZ5XG4gICAqL1xuICBpbnB1dDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcblxuICAvKipcbiAgICogVHdvIGNvbnRlbnQgbW9kZXJhdGlvbnMgbW9kZWxzIGFyZSBhdmFpbGFibGU6IGB0ZXh0LW1vZGVyYXRpb24tc3RhYmxlYCBhbmRcbiAgICogYHRleHQtbW9kZXJhdGlvbi1sYXRlc3RgLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBpcyBgdGV4dC1tb2RlcmF0aW9uLWxhdGVzdGAgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZ3JhZGVkXG4gICAqIG92ZXIgdGltZS4gVGhpcyBlbnN1cmVzIHlvdSBhcmUgYWx3YXlzIHVzaW5nIG91ciBtb3N0IGFjY3VyYXRlIG1vZGVsLiBJZiB5b3UgdXNlXG4gICAqIGB0ZXh0LW1vZGVyYXRpb24tc3RhYmxlYCwgd2Ugd2lsbCBwcm92aWRlIGFkdmFuY2VkIG5vdGljZSBiZWZvcmUgdXBkYXRpbmcgdGhlXG4gICAqIG1vZGVsLiBBY2N1cmFjeSBvZiBgdGV4dC1tb2RlcmF0aW9uLXN0YWJsZWAgbWF5IGJlIHNsaWdodGx5IGxvd2VyIHRoYW4gZm9yXG4gICAqIGB0ZXh0LW1vZGVyYXRpb24tbGF0ZXN0YC5cbiAgICovXG4gIG1vZGVsPzogKHN0cmluZyAmIHt9KSB8ICd0ZXh0LW1vZGVyYXRpb24tbGF0ZXN0JyB8ICd0ZXh0LW1vZGVyYXRpb24tc3RhYmxlJztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNb2RlcmF0aW9ucyB7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbiA9IE1vZGVyYXRpb25zQVBJLk1vZGVyYXRpb247XG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbkNyZWF0ZVJlc3BvbnNlID0gTW9kZXJhdGlvbnNBUEkuTW9kZXJhdGlvbkNyZWF0ZVJlc3BvbnNlO1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb25DcmVhdGVQYXJhbXMgPSBNb2RlcmF0aW9uc0FQSS5Nb2RlcmF0aW9uQ3JlYXRlUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuIFNlZSBDT05UUklCVVRJTkcubWQgZm9yIGRldGFpbHMuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSAnLi9jb3JlJztcbmltcG9ydCAqIGFzIEVycm9ycyBmcm9tICcuL2Vycm9yJztcbmltcG9ydCB7IHR5cGUgQWdlbnQsIHR5cGUgUmVxdWVzdEluaXQgfSBmcm9tICcuL19zaGltcy9pbmRleCc7XG5pbXBvcnQgKiBhcyBVcGxvYWRzIGZyb20gJy4vdXBsb2Fkcyc7XG5pbXBvcnQgKiBhcyBQYWdpbmF0aW9uIGZyb20gXCIuL3BhZ2luYXRpb25cIjtcbmltcG9ydCAqIGFzIEFQSSBmcm9tIFwiLi9yZXNvdXJjZXMvaW5kZXhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmF1bHRzIHRvIHByb2Nlc3MuZW52WydPUEVOQUlfQVBJX0tFWSddLlxuICAgKi9cbiAgYXBpS2V5Pzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0cyB0byBwcm9jZXNzLmVudlsnT1BFTkFJX09SR19JRCddLlxuICAgKi9cbiAgb3JnYW5pemF0aW9uPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ09QRU5BSV9QUk9KRUNUX0lEJ10uXG4gICAqL1xuICBwcm9qZWN0Pzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmFzZSBVUkwgZm9yIHRoZSBBUEksIGUuZy4sIFwiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdjIvXCJcbiAgICpcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ09QRU5BSV9CQVNFX1VSTCddLlxuICAgKi9cbiAgYmFzZVVSTD86IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRoYXQgdGhlIGNsaWVudCBzaG91bGQgd2FpdCBmb3IgYSByZXNwb25zZVxuICAgKiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIHRpbWluZyBvdXQgYSBzaW5nbGUgcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHJlcXVlc3QgdGltZW91dHMgYXJlIHJldHJpZWQgYnkgZGVmYXVsdCwgc28gaW4gYSB3b3JzdC1jYXNlIHNjZW5hcmlvIHlvdSBtYXkgd2FpdFxuICAgKiBtdWNoIGxvbmdlciB0aGFuIHRoaXMgdGltZW91dCBiZWZvcmUgdGhlIHByb21pc2Ugc3VjY2VlZHMgb3IgZmFpbHMuXG4gICAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbiBIVFRQIGFnZW50IHVzZWQgdG8gbWFuYWdlIEhUVFAoUykgY29ubmVjdGlvbnMuXG4gICAqXG4gICAqIElmIG5vdCBwcm92aWRlZCwgYW4gYWdlbnQgd2lsbCBiZSBjb25zdHJ1Y3RlZCBieSBkZWZhdWx0IGluIHRoZSBOb2RlLmpzIGVudmlyb25tZW50LFxuICAgKiBvdGhlcndpc2Ugbm8gYWdlbnQgaXMgdXNlZC5cbiAgICovXG4gIGh0dHBBZ2VudD86IEFnZW50O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgY3VzdG9tIGBmZXRjaGAgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAqXG4gICAqIElmIG5vdCBwcm92aWRlZCwgd2UgdXNlIGBub2RlLWZldGNoYCBvbiBOb2RlLmpzIGFuZCBvdGhlcndpc2UgZXhwZWN0IHRoYXQgYGZldGNoYCBpc1xuICAgKiBkZWZpbmVkIGdsb2JhbGx5LlxuICAgKi9cbiAgZmV0Y2g/OiBDb3JlLkZldGNoIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgY2xpZW50IHdpbGwgcmV0cnkgYSByZXF1ZXN0IGluIGNhc2Ugb2YgYVxuICAgKiB0ZW1wb3JhcnkgZmFpbHVyZSwgbGlrZSBhIG5ldHdvcmsgZXJyb3Igb3IgYSA1WFggZXJyb3IgZnJvbSB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAyXG4gICAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICpcbiAgICogVGhlc2UgY2FuIGJlIHJlbW92ZWQgaW4gaW5kaXZpZHVhbCByZXF1ZXN0cyBieSBleHBsaWNpdGx5IHNldHRpbmcgdGhlXG4gICAqIGhlYWRlciB0byBgdW5kZWZpbmVkYCBvciBgbnVsbGAgaW4gcmVxdWVzdCBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEhlYWRlcnM/OiBDb3JlLkhlYWRlcnM7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgcXVlcnkgcGFyYW1ldGVycyB0byBpbmNsdWRlIHdpdGggZXZlcnkgcmVxdWVzdCB0byB0aGUgQVBJLlxuICAgKlxuICAgKiBUaGVzZSBjYW4gYmUgcmVtb3ZlZCBpbiBpbmRpdmlkdWFsIHJlcXVlc3RzIGJ5IGV4cGxpY2l0bHkgc2V0dGluZyB0aGVcbiAgICogcGFyYW0gdG8gYHVuZGVmaW5lZGAgaW4gcmVxdWVzdCBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdFF1ZXJ5PzogQ29yZS5EZWZhdWx0UXVlcnk7XG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIGNsaWVudC1zaWRlIHVzZSBvZiB0aGlzIGxpYnJhcnkgaXMgbm90IGFsbG93ZWQsIGFzIGl0IHJpc2tzIGV4cG9zaW5nIHlvdXIgc2VjcmV0IEFQSSBjcmVkZW50aWFscyB0byBhdHRhY2tlcnMuXG4gICAqIE9ubHkgc2V0IHRoaXMgb3B0aW9uIHRvIGB0cnVlYCBpZiB5b3UgdW5kZXJzdGFuZCB0aGUgcmlza3MgYW5kIGhhdmUgYXBwcm9wcmlhdGUgbWl0aWdhdGlvbnMgaW4gcGxhY2UuXG4gICAqL1xuICBkYW5nZXJvdXNseUFsbG93QnJvd3Nlcj86IGJvb2xlYW47XG59XG5cbi8qKiBBUEkgQ2xpZW50IGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZSBPcGVuQUkgQVBJLiAqL1xuZXhwb3J0IGNsYXNzIE9wZW5BSSBleHRlbmRzIENvcmUuQVBJQ2xpZW50IHtcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIG9yZ2FuaXphdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgcHJvamVjdDogc3RyaW5nIHwgbnVsbDtcblxuICBwcml2YXRlIF9vcHRpb25zOiBDbGllbnRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBBUEkgQ2xpZW50IGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZSBPcGVuQUkgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW29wdHMuYXBpS2V5PXByb2Nlc3MuZW52WydPUEVOQUlfQVBJX0tFWSddID8/IHVuZGVmaW5lZF1cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBbb3B0cy5vcmdhbml6YXRpb249cHJvY2Vzcy5lbnZbJ09QRU5BSV9PUkdfSUQnXSA/PyBudWxsXVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRzLnByb2plY3Q9cHJvY2Vzcy5lbnZbJ09QRU5BSV9QUk9KRUNUX0lEJ10gPz8gbnVsbF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmJhc2VVUkw9cHJvY2Vzcy5lbnZbJ09QRU5BSV9CQVNFX1VSTCddID8/IGh0dHBzOi8vYXBpLm9wZW5haS5jb20vdjFdIC0gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmFzZSBVUkwgZm9yIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy50aW1lb3V0PTEwIG1pbnV0ZXNdIC0gVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlIGNsaWVudCB3aWxsIHdhaXQgZm9yIGEgcmVzcG9uc2UgYmVmb3JlIHRpbWluZyBvdXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5odHRwQWdlbnRdIC0gQW4gSFRUUCBhZ2VudCB1c2VkIHRvIG1hbmFnZSBIVFRQKHMpIGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0ge0NvcmUuRmV0Y2h9IFtvcHRzLmZldGNoXSAtIFNwZWNpZnkgYSBjdXN0b20gYGZldGNoYCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLm1heFJldHJpZXM9Ml0gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNsaWVudCB3aWxsIHJldHJ5IGEgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtDb3JlLkhlYWRlcnN9IG9wdHMuZGVmYXVsdEhlYWRlcnMgLSBEZWZhdWx0IGhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtDb3JlLkRlZmF1bHRRdWVyeX0gb3B0cy5kZWZhdWx0UXVlcnkgLSBEZWZhdWx0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5kYW5nZXJvdXNseUFsbG93QnJvd3Nlcj1mYWxzZV0gLSBCeSBkZWZhdWx0LCBjbGllbnQtc2lkZSB1c2Ugb2YgdGhpcyBsaWJyYXJ5IGlzIG5vdCBhbGxvd2VkLCBhcyBpdCByaXNrcyBleHBvc2luZyB5b3VyIHNlY3JldCBBUEkgY3JlZGVudGlhbHMgdG8gYXR0YWNrZXJzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe1xuICAgIGJhc2VVUkwgPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9CQVNFX1VSTCcpLFxuICAgIGFwaUtleSA9IENvcmUucmVhZEVudignT1BFTkFJX0FQSV9LRVknKSxcbiAgICBvcmdhbml6YXRpb24gPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9PUkdfSUQnKSA/PyBudWxsLFxuICAgIHByb2plY3QgPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9QUk9KRUNUX0lEJykgPz8gbnVsbCxcbiAgICAuLi5vcHRzXG4gIH06IENsaWVudE9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChhcGlLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgXCJUaGUgT1BFTkFJX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbWlzc2luZyBvciBlbXB0eTsgZWl0aGVyIHByb3ZpZGUgaXQsIG9yIGluc3RhbnRpYXRlIHRoZSBPcGVuQUkgY2xpZW50IHdpdGggYW4gYXBpS2V5IG9wdGlvbiwgbGlrZSBuZXcgT3BlbkFJKHsgYXBpS2V5OiAnTXkgQVBJIEtleScgfSkuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IENsaWVudE9wdGlvbnMgPSB7XG4gICAgICBhcGlLZXksXG4gICAgICBvcmdhbml6YXRpb24sXG4gICAgICBwcm9qZWN0LFxuICAgICAgLi4ub3B0cyxcbiAgICAgIGJhc2VVUkw6IGJhc2VVUkwgfHwgYGh0dHBzOi8vYXBpLm9wZW5haS5jb20vdjFgLFxuICAgIH07XG5cbiAgICBpZiAoIW9wdGlvbnMuZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXIgJiYgQ29yZS5pc1J1bm5pbmdJbkJyb3dzZXIoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgXCJJdCBsb29rcyBsaWtlIHlvdSdyZSBydW5uaW5nIGluIGEgYnJvd3Nlci1saWtlIGVudmlyb25tZW50LlxcblxcblRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYXMgaXQgcmlza3MgZXhwb3NpbmcgeW91ciBzZWNyZXQgQVBJIGNyZWRlbnRpYWxzIHRvIGF0dGFja2Vycy5cXG5JZiB5b3UgdW5kZXJzdGFuZCB0aGUgcmlza3MgYW5kIGhhdmUgYXBwcm9wcmlhdGUgbWl0aWdhdGlvbnMgaW4gcGxhY2UsXFxueW91IGNhbiBzZXQgdGhlIGBkYW5nZXJvdXNseUFsbG93QnJvd3NlcmAgb3B0aW9uIHRvIGB0cnVlYCwgZS5nLixcXG5cXG5uZXcgT3BlbkFJKHsgYXBpS2V5LCBkYW5nZXJvdXNseUFsbG93QnJvd3NlcjogdHJ1ZSB9KTtcXG5cXG5odHRwczovL2hlbHAub3BlbmFpLmNvbS9lbi9hcnRpY2xlcy81MTEyNTk1LWJlc3QtcHJhY3RpY2VzLWZvci1hcGkta2V5LXNhZmV0eVxcblwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzdXBlcih7XG4gICAgICBiYXNlVVJMOiBvcHRpb25zLmJhc2VVUkwhLFxuICAgICAgdGltZW91dDogb3B0aW9ucy50aW1lb3V0ID8/IDYwMDAwMCAvKiAxMCBtaW51dGVzICovLFxuICAgICAgaHR0cEFnZW50OiBvcHRpb25zLmh0dHBBZ2VudCxcbiAgICAgIG1heFJldHJpZXM6IG9wdGlvbnMubWF4UmV0cmllcyxcbiAgICAgIGZldGNoOiBvcHRpb25zLmZldGNoLFxuICAgIH0pO1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5hcGlLZXkgPSBhcGlLZXk7XG4gICAgdGhpcy5vcmdhbml6YXRpb24gPSBvcmdhbml6YXRpb247XG4gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgfVxuXG4gIGNvbXBsZXRpb25zOiBBUEkuQ29tcGxldGlvbnMgPSBuZXcgQVBJLkNvbXBsZXRpb25zKHRoaXMpO1xuICBjaGF0OiBBUEkuQ2hhdCA9IG5ldyBBUEkuQ2hhdCh0aGlzKTtcbiAgZW1iZWRkaW5nczogQVBJLkVtYmVkZGluZ3MgPSBuZXcgQVBJLkVtYmVkZGluZ3ModGhpcyk7XG4gIGZpbGVzOiBBUEkuRmlsZXMgPSBuZXcgQVBJLkZpbGVzKHRoaXMpO1xuICBpbWFnZXM6IEFQSS5JbWFnZXMgPSBuZXcgQVBJLkltYWdlcyh0aGlzKTtcbiAgYXVkaW86IEFQSS5BdWRpbyA9IG5ldyBBUEkuQXVkaW8odGhpcyk7XG4gIG1vZGVyYXRpb25zOiBBUEkuTW9kZXJhdGlvbnMgPSBuZXcgQVBJLk1vZGVyYXRpb25zKHRoaXMpO1xuICBtb2RlbHM6IEFQSS5Nb2RlbHMgPSBuZXcgQVBJLk1vZGVscyh0aGlzKTtcbiAgZmluZVR1bmluZzogQVBJLkZpbmVUdW5pbmcgPSBuZXcgQVBJLkZpbmVUdW5pbmcodGhpcyk7XG4gIGJldGE6IEFQSS5CZXRhID0gbmV3IEFQSS5CZXRhKHRoaXMpO1xuICBiYXRjaGVzOiBBUEkuQmF0Y2hlcyA9IG5ldyBBUEkuQmF0Y2hlcyh0aGlzKTtcblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZGVmYXVsdFF1ZXJ5KCk6IENvcmUuRGVmYXVsdFF1ZXJ5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5kZWZhdWx0UXVlcnk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZGVmYXVsdEhlYWRlcnMob3B0czogQ29yZS5GaW5hbFJlcXVlc3RPcHRpb25zKTogQ29yZS5IZWFkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZGVmYXVsdEhlYWRlcnMob3B0cyksXG4gICAgICAnT3BlbkFJLU9yZ2FuaXphdGlvbic6IHRoaXMub3JnYW5pemF0aW9uLFxuICAgICAgJ09wZW5BSS1Qcm9qZWN0JzogdGhpcy5wcm9qZWN0LFxuICAgICAgLi4udGhpcy5fb3B0aW9ucy5kZWZhdWx0SGVhZGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGF1dGhIZWFkZXJzKG9wdHM6IENvcmUuRmluYWxSZXF1ZXN0T3B0aW9ucyk6IENvcmUuSGVhZGVycyB7XG4gICAgcmV0dXJuIHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuYXBpS2V5fWAgfTtcbiAgfVxuXG4gIHN0YXRpYyBPcGVuQUkgPSB0aGlzO1xuXG4gIHN0YXRpYyBPcGVuQUlFcnJvciA9IEVycm9ycy5PcGVuQUlFcnJvcjtcbiAgc3RhdGljIEFQSUVycm9yID0gRXJyb3JzLkFQSUVycm9yO1xuICBzdGF0aWMgQVBJQ29ubmVjdGlvbkVycm9yID0gRXJyb3JzLkFQSUNvbm5lY3Rpb25FcnJvcjtcbiAgc3RhdGljIEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IgPSBFcnJvcnMuQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcjtcbiAgc3RhdGljIEFQSVVzZXJBYm9ydEVycm9yID0gRXJyb3JzLkFQSVVzZXJBYm9ydEVycm9yO1xuICBzdGF0aWMgTm90Rm91bmRFcnJvciA9IEVycm9ycy5Ob3RGb3VuZEVycm9yO1xuICBzdGF0aWMgQ29uZmxpY3RFcnJvciA9IEVycm9ycy5Db25mbGljdEVycm9yO1xuICBzdGF0aWMgUmF0ZUxpbWl0RXJyb3IgPSBFcnJvcnMuUmF0ZUxpbWl0RXJyb3I7XG4gIHN0YXRpYyBCYWRSZXF1ZXN0RXJyb3IgPSBFcnJvcnMuQmFkUmVxdWVzdEVycm9yO1xuICBzdGF0aWMgQXV0aGVudGljYXRpb25FcnJvciA9IEVycm9ycy5BdXRoZW50aWNhdGlvbkVycm9yO1xuICBzdGF0aWMgSW50ZXJuYWxTZXJ2ZXJFcnJvciA9IEVycm9ycy5JbnRlcm5hbFNlcnZlckVycm9yO1xuICBzdGF0aWMgUGVybWlzc2lvbkRlbmllZEVycm9yID0gRXJyb3JzLlBlcm1pc3Npb25EZW5pZWRFcnJvcjtcbiAgc3RhdGljIFVucHJvY2Vzc2FibGVFbnRpdHlFcnJvciA9IEVycm9ycy5VbnByb2Nlc3NhYmxlRW50aXR5RXJyb3I7XG5cbiAgc3RhdGljIHRvRmlsZSA9IFVwbG9hZHMudG9GaWxlO1xuICBzdGF0aWMgZmlsZUZyb21QYXRoID0gVXBsb2Fkcy5maWxlRnJvbVBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCB7XG4gIE9wZW5BSUVycm9yLFxuICBBUElFcnJvcixcbiAgQVBJQ29ubmVjdGlvbkVycm9yLFxuICBBUElDb25uZWN0aW9uVGltZW91dEVycm9yLFxuICBBUElVc2VyQWJvcnRFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgUmF0ZUxpbWl0RXJyb3IsXG4gIEJhZFJlcXVlc3RFcnJvcixcbiAgQXV0aGVudGljYXRpb25FcnJvcixcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcixcbiAgUGVybWlzc2lvbkRlbmllZEVycm9yLFxuICBVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IsXG59ID0gRXJyb3JzO1xuXG5leHBvcnQgaW1wb3J0IHRvRmlsZSA9IFVwbG9hZHMudG9GaWxlO1xuZXhwb3J0IGltcG9ydCBmaWxlRnJvbVBhdGggPSBVcGxvYWRzLmZpbGVGcm9tUGF0aDtcblxuZXhwb3J0IG5hbWVzcGFjZSBPcGVuQUkge1xuICBleHBvcnQgaW1wb3J0IFJlcXVlc3RPcHRpb25zID0gQ29yZS5SZXF1ZXN0T3B0aW9ucztcblxuICBleHBvcnQgaW1wb3J0IFBhZ2UgPSBQYWdpbmF0aW9uLlBhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgUGFnZVJlc3BvbnNlID0gUGFnaW5hdGlvbi5QYWdlUmVzcG9uc2U7XG5cbiAgZXhwb3J0IGltcG9ydCBDdXJzb3JQYWdlID0gUGFnaW5hdGlvbi5DdXJzb3JQYWdlO1xuICBleHBvcnQgaW1wb3J0IEN1cnNvclBhZ2VQYXJhbXMgPSBQYWdpbmF0aW9uLkN1cnNvclBhZ2VQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ3Vyc29yUGFnZVJlc3BvbnNlID0gUGFnaW5hdGlvbi5DdXJzb3JQYWdlUmVzcG9uc2U7XG5cbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9ucyA9IEFQSS5Db21wbGV0aW9ucztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uID0gQVBJLkNvbXBsZXRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNob2ljZSA9IEFQSS5Db21wbGV0aW9uQ2hvaWNlO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25Vc2FnZSA9IEFQSS5Db21wbGV0aW9uVXNhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9IEFQSS5Db21wbGV0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZztcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nID0gQVBJLkNvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG5cbiAgZXhwb3J0IGltcG9ydCBDaGF0ID0gQVBJLkNoYXQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdE1vZGVsID0gQVBJLkNoYXRNb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbiA9IEFQSS5DaGF0Q29tcGxldGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbSA9IEFQSS5DaGF0Q29tcGxldGlvbkFzc2lzdGFudE1lc3NhZ2VQYXJhbTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvbkNodW5rID0gQVBJLkNoYXRDb21wbGV0aW9uQ2h1bms7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydCA9IEFQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0O1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uQ29udGVudFBhcnRJbWFnZSA9IEFQSS5DaGF0Q29tcGxldGlvbkNvbnRlbnRQYXJ0SW1hZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQgPSBBUEkuQ2hhdENvbXBsZXRpb25Db250ZW50UGFydFRleHQ7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb24gPSBBUEkuQ2hhdENvbXBsZXRpb25GdW5jdGlvbkNhbGxPcHRpb247XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25GdW5jdGlvbk1lc3NhZ2VQYXJhbSA9IEFQSS5DaGF0Q29tcGxldGlvbkZ1bmN0aW9uTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uTWVzc2FnZSA9IEFQSS5DaGF0Q29tcGxldGlvbk1lc3NhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW0gPSBBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGwgPSBBUEkuQ2hhdENvbXBsZXRpb25NZXNzYWdlVG9vbENhbGw7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2UgPSBBUEkuQ2hhdENvbXBsZXRpb25OYW1lZFRvb2xDaG9pY2U7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Sb2xlID0gQVBJLkNoYXRDb21wbGV0aW9uUm9sZTtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblN0cmVhbU9wdGlvbnMgPSBBUEkuQ2hhdENvbXBsZXRpb25TdHJlYW1PcHRpb25zO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtID0gQVBJLkNoYXRDb21wbGV0aW9uU3lzdGVtTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iID0gQVBJLkNoYXRDb21wbGV0aW9uVG9rZW5Mb2dwcm9iO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVG9vbCA9IEFQSS5DaGF0Q29tcGxldGlvblRvb2w7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25Ub29sQ2hvaWNlT3B0aW9uID0gQVBJLkNoYXRDb21wbGV0aW9uVG9vbENob2ljZU9wdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDaGF0Q29tcGxldGlvblRvb2xNZXNzYWdlUGFyYW0gPSBBUEkuQ2hhdENvbXBsZXRpb25Ub29sTWVzc2FnZVBhcmFtO1xuICBleHBvcnQgaW1wb3J0IENoYXRDb21wbGV0aW9uVXNlck1lc3NhZ2VQYXJhbSA9IEFQSS5DaGF0Q29tcGxldGlvblVzZXJNZXNzYWdlUGFyYW07XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMgPSBBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmcgPSBBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmc7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcgPSBBUEkuQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmc7XG5cbiAgZXhwb3J0IGltcG9ydCBFbWJlZGRpbmdzID0gQVBJLkVtYmVkZGluZ3M7XG4gIGV4cG9ydCBpbXBvcnQgQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2UgPSBBUEkuQ3JlYXRlRW1iZWRkaW5nUmVzcG9uc2U7XG4gIGV4cG9ydCBpbXBvcnQgRW1iZWRkaW5nID0gQVBJLkVtYmVkZGluZztcbiAgZXhwb3J0IGltcG9ydCBFbWJlZGRpbmdDcmVhdGVQYXJhbXMgPSBBUEkuRW1iZWRkaW5nQ3JlYXRlUGFyYW1zO1xuXG4gIGV4cG9ydCBpbXBvcnQgRmlsZXMgPSBBUEkuRmlsZXM7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNvbnRlbnQgPSBBUEkuRmlsZUNvbnRlbnQ7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZURlbGV0ZWQgPSBBUEkuRmlsZURlbGV0ZWQ7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZU9iamVjdCA9IEFQSS5GaWxlT2JqZWN0O1xuICBleHBvcnQgaW1wb3J0IEZpbGVPYmplY3RzUGFnZSA9IEFQSS5GaWxlT2JqZWN0c1BhZ2U7XG4gIGV4cG9ydCBpbXBvcnQgRmlsZUNyZWF0ZVBhcmFtcyA9IEFQSS5GaWxlQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEZpbGVMaXN0UGFyYW1zID0gQVBJLkZpbGVMaXN0UGFyYW1zO1xuXG4gIGV4cG9ydCBpbXBvcnQgSW1hZ2VzID0gQVBJLkltYWdlcztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZSA9IEFQSS5JbWFnZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZXNSZXNwb25zZSA9IEFQSS5JbWFnZXNSZXNwb25zZTtcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcyA9IEFQSS5JbWFnZUNyZWF0ZVZhcmlhdGlvblBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBJbWFnZUVkaXRQYXJhbXMgPSBBUEkuSW1hZ2VFZGl0UGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IEltYWdlR2VuZXJhdGVQYXJhbXMgPSBBUEkuSW1hZ2VHZW5lcmF0ZVBhcmFtcztcblxuICBleHBvcnQgaW1wb3J0IEF1ZGlvID0gQVBJLkF1ZGlvO1xuXG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbnMgPSBBUEkuTW9kZXJhdGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbiA9IEFQSS5Nb2RlcmF0aW9uO1xuICBleHBvcnQgaW1wb3J0IE1vZGVyYXRpb25DcmVhdGVSZXNwb25zZSA9IEFQSS5Nb2RlcmF0aW9uQ3JlYXRlUmVzcG9uc2U7XG4gIGV4cG9ydCBpbXBvcnQgTW9kZXJhdGlvbkNyZWF0ZVBhcmFtcyA9IEFQSS5Nb2RlcmF0aW9uQ3JlYXRlUGFyYW1zO1xuXG4gIGV4cG9ydCBpbXBvcnQgTW9kZWxzID0gQVBJLk1vZGVscztcbiAgZXhwb3J0IGltcG9ydCBNb2RlbCA9IEFQSS5Nb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbERlbGV0ZWQgPSBBUEkuTW9kZWxEZWxldGVkO1xuICBleHBvcnQgaW1wb3J0IE1vZGVsc1BhZ2UgPSBBUEkuTW9kZWxzUGFnZTtcblxuICBleHBvcnQgaW1wb3J0IEZpbmVUdW5pbmcgPSBBUEkuRmluZVR1bmluZztcblxuICBleHBvcnQgaW1wb3J0IEJldGEgPSBBUEkuQmV0YTtcblxuICBleHBvcnQgaW1wb3J0IEJhdGNoZXMgPSBBUEkuQmF0Y2hlcztcbiAgZXhwb3J0IGltcG9ydCBCYXRjaCA9IEFQSS5CYXRjaDtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaEVycm9yID0gQVBJLkJhdGNoRXJyb3I7XG4gIGV4cG9ydCBpbXBvcnQgQmF0Y2hSZXF1ZXN0Q291bnRzID0gQVBJLkJhdGNoUmVxdWVzdENvdW50cztcbiAgZXhwb3J0IGltcG9ydCBCYXRjaGVzUGFnZSA9IEFQSS5CYXRjaGVzUGFnZTtcbiAgZXhwb3J0IGltcG9ydCBCYXRjaENyZWF0ZVBhcmFtcyA9IEFQSS5CYXRjaENyZWF0ZVBhcmFtcztcbiAgZXhwb3J0IGltcG9ydCBCYXRjaExpc3RQYXJhbXMgPSBBUEkuQmF0Y2hMaXN0UGFyYW1zO1xuXG4gIGV4cG9ydCBpbXBvcnQgRXJyb3JPYmplY3QgPSBBUEkuRXJyb3JPYmplY3Q7XG4gIGV4cG9ydCBpbXBvcnQgRnVuY3Rpb25EZWZpbml0aW9uID0gQVBJLkZ1bmN0aW9uRGVmaW5pdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBGdW5jdGlvblBhcmFtZXRlcnMgPSBBUEkuRnVuY3Rpb25QYXJhbWV0ZXJzO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEF6dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEFQSSBDbGllbnQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIEF6dXJlIE9wZW5BSSBBUEkuICovXG5leHBvcnQgaW50ZXJmYWNlIEF6dXJlQ2xpZW50T3B0aW9ucyBleHRlbmRzIENsaWVudE9wdGlvbnMge1xuICAvKipcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ09QRU5BSV9BUElfVkVSU0lPTiddLlxuICAgKi9cbiAgYXBpVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogWW91ciBBenVyZSBlbmRwb2ludCwgaW5jbHVkaW5nIHRoZSByZXNvdXJjZSwgZS5nLiBgaHR0cHM6Ly9leGFtcGxlLXJlc291cmNlLmF6dXJlLm9wZW5haS5jb20vYFxuICAgKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgbW9kZWwgZGVwbG95bWVudCwgaWYgZ2l2ZW4sIHNldHMgdGhlIGJhc2UgY2xpZW50IFVSTCB0byBpbmNsdWRlIGAvZGVwbG95bWVudHMve2RlcGxveW1lbnR9YC5cbiAgICogTm90ZTogdGhpcyBtZWFucyB5b3Ugd29uJ3QgYmUgYWJsZSB0byB1c2Ugbm9uLWRlcGxveW1lbnQgZW5kcG9pbnRzLiBOb3Qgc3VwcG9ydGVkIHdpdGggQXNzaXN0YW50cyBBUElzLlxuICAgKi9cbiAgZGVwbG95bWVudD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ0FaVVJFX09QRU5BSV9BUElfS0VZJ10uXG4gICAqL1xuICBhcGlLZXk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGFjY2VzcyB0b2tlbiBmb3IgTWljcm9zb2Z0IEVudHJhIChmb3JtZXJseSBrbm93biBhcyBBenVyZSBBY3RpdmUgRGlyZWN0b3J5KSxcbiAgICogd2hpY2ggd2lsbCBiZSBpbnZva2VkIG9uIGV2ZXJ5IHJlcXVlc3QuXG4gICAqL1xuICBhenVyZUFEVG9rZW5Qcm92aWRlcj86ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogQVBJIENsaWVudCBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgQXp1cmUgT3BlbkFJIEFQSS4gKi9cbmV4cG9ydCBjbGFzcyBBenVyZU9wZW5BSSBleHRlbmRzIE9wZW5BSSB7XG4gIHByaXZhdGUgX2F6dXJlQURUb2tlblByb3ZpZGVyOiAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KSB8IHVuZGVmaW5lZDtcbiAgYXBpVmVyc2lvbjogc3RyaW5nID0gJyc7XG4gIC8qKlxuICAgKiBBUEkgQ2xpZW50IGZvciBpbnRlcmZhY2luZyB3aXRoIHRoZSBBenVyZSBPcGVuQUkgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW29wdHMuYXBpVmVyc2lvbj1wcm9jZXNzLmVudlsnT1BFTkFJX0FQSV9WRVJTSU9OJ10gPz8gdW5kZWZpbmVkXVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW29wdHMuZW5kcG9pbnQ9cHJvY2Vzcy5lbnZbJ0FaVVJFX09QRU5BSV9FTkRQT0lOVCddID8/IHVuZGVmaW5lZF0gLSBZb3VyIEF6dXJlIGVuZHBvaW50LCBpbmNsdWRpbmcgdGhlIHJlc291cmNlLCBlLmcuIGBodHRwczovL2V4YW1wbGUtcmVzb3VyY2UuYXp1cmUub3BlbmFpLmNvbS9gXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbb3B0cy5hcGlLZXk9cHJvY2Vzcy5lbnZbJ0FaVVJFX09QRU5BSV9BUElfS0VZJ10gPz8gdW5kZWZpbmVkXVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gb3B0cy5kZXBsb3ltZW50IC0gQSBtb2RlbCBkZXBsb3ltZW50LCBpZiBnaXZlbiwgc2V0cyB0aGUgYmFzZSBjbGllbnQgVVJMIHRvIGluY2x1ZGUgYC9kZXBsb3ltZW50cy97ZGVwbG95bWVudH1gLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IFtvcHRzLm9yZ2FuaXphdGlvbj1wcm9jZXNzLmVudlsnT1BFTkFJX09SR19JRCddID8/IG51bGxdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5iYXNlVVJMPXByb2Nlc3MuZW52WydPUEVOQUlfQkFTRV9VUkwnXV0gLSBTZXRzIHRoZSBiYXNlIFVSTCBmb3IgdGhlIEFQSS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXQ9MTAgbWludXRlc10gLSBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0aGUgY2xpZW50IHdpbGwgd2FpdCBmb3IgYSByZXNwb25zZSBiZWZvcmUgdGltaW5nIG91dC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmh0dHBBZ2VudF0gLSBBbiBIVFRQIGFnZW50IHVzZWQgdG8gbWFuYWdlIEhUVFAocykgY29ubmVjdGlvbnMuXG4gICAqIEBwYXJhbSB7Q29yZS5GZXRjaH0gW29wdHMuZmV0Y2hdIC0gU3BlY2lmeSBhIGN1c3RvbSBgZmV0Y2hgIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW29wdHMubWF4UmV0cmllcz0yXSAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgY2xpZW50IHdpbGwgcmV0cnkgYSByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge0NvcmUuSGVhZGVyc30gb3B0cy5kZWZhdWx0SGVhZGVycyAtIERlZmF1bHQgaGVhZGVycyB0byBpbmNsdWRlIHdpdGggZXZlcnkgcmVxdWVzdCB0byB0aGUgQVBJLlxuICAgKiBAcGFyYW0ge0NvcmUuRGVmYXVsdFF1ZXJ5fSBvcHRzLmRlZmF1bHRRdWVyeSAtIERlZmF1bHQgcXVlcnkgcGFyYW1ldGVycyB0byBpbmNsdWRlIHdpdGggZXZlcnkgcmVxdWVzdCB0byB0aGUgQVBJLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmRhbmdlcm91c2x5QWxsb3dCcm93c2VyPWZhbHNlXSAtIEJ5IGRlZmF1bHQsIGNsaWVudC1zaWRlIHVzZSBvZiB0aGlzIGxpYnJhcnkgaXMgbm90IGFsbG93ZWQsIGFzIGl0IHJpc2tzIGV4cG9zaW5nIHlvdXIgc2VjcmV0IEFQSSBjcmVkZW50aWFscyB0byBhdHRhY2tlcnMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgYmFzZVVSTCA9IENvcmUucmVhZEVudignT1BFTkFJX0JBU0VfVVJMJyksXG4gICAgYXBpS2V5ID0gQ29yZS5yZWFkRW52KCdBWlVSRV9PUEVOQUlfQVBJX0tFWScpLFxuICAgIGFwaVZlcnNpb24gPSBDb3JlLnJlYWRFbnYoJ09QRU5BSV9BUElfVkVSU0lPTicpLFxuICAgIGVuZHBvaW50LFxuICAgIGRlcGxveW1lbnQsXG4gICAgYXp1cmVBRFRva2VuUHJvdmlkZXIsXG4gICAgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXIsXG4gICAgLi4ub3B0c1xuICB9OiBBenVyZUNsaWVudE9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghYXBpVmVyc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgXCJUaGUgT1BFTkFJX0FQSV9WRVJTSU9OIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG1pc3Npbmcgb3IgZW1wdHk7IGVpdGhlciBwcm92aWRlIGl0LCBvciBpbnN0YW50aWF0ZSB0aGUgQXp1cmVPcGVuQUkgY2xpZW50IHdpdGggYW4gYXBpVmVyc2lvbiBvcHRpb24sIGxpa2UgbmV3IEF6dXJlT3BlbkFJKHsgYXBpVmVyc2lvbjogJ015IEFQSSBWZXJzaW9uJyB9KS5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhenVyZUFEVG9rZW5Qcm92aWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghYXp1cmVBRFRva2VuUHJvdmlkZXIgJiYgIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgJ01pc3NpbmcgY3JlZGVudGlhbHMuIFBsZWFzZSBwYXNzIG9uZSBvZiBgYXBpS2V5YCBhbmQgYGF6dXJlQURUb2tlblByb3ZpZGVyYCwgb3Igc2V0IHRoZSBgQVpVUkVfT1BFTkFJX0FQSV9LRVlgIGVudmlyb25tZW50IHZhcmlhYmxlLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhenVyZUFEVG9rZW5Qcm92aWRlciAmJiBhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoXG4gICAgICAgICdUaGUgYGFwaUtleWAgYW5kIGBhenVyZUFEVG9rZW5Qcm92aWRlcmAgYXJndW1lbnRzIGFyZSBtdXR1YWxseSBleGNsdXNpdmU7IG9ubHkgb25lIGNhbiBiZSBwYXNzZWQgYXQgYSB0aW1lLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGRlZmluZSBhIHNlbnRpbmVsIHZhbHVlIHRvIGF2b2lkIGFueSB0eXBpbmcgaXNzdWVzXG4gICAgYXBpS2V5ID8/PSBBUElfS0VZX1NFTlRJTkVMO1xuXG4gICAgb3B0cy5kZWZhdWx0UXVlcnkgPSB7IC4uLm9wdHMuZGVmYXVsdFF1ZXJ5LCAnYXBpLXZlcnNpb24nOiBhcGlWZXJzaW9uIH07XG5cbiAgICBpZiAoIWJhc2VVUkwpIHtcbiAgICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgICAgZW5kcG9pbnQgPSBwcm9jZXNzLmVudlsnQVpVUkVfT1BFTkFJX0VORFBPSU5UJ107XG4gICAgICB9XG5cbiAgICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9ycy5PcGVuQUlFcnJvcihcbiAgICAgICAgICAnTXVzdCBwcm92aWRlIG9uZSBvZiB0aGUgYGJhc2VVUkxgIG9yIGBlbmRwb2ludGAgYXJndW1lbnRzLCBvciB0aGUgYEFaVVJFX09QRU5BSV9FTkRQT0lOVGAgZW52aXJvbm1lbnQgdmFyaWFibGUnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVwbG95bWVudCkge1xuICAgICAgICBiYXNlVVJMID0gYCR7ZW5kcG9pbnR9L29wZW5haS9kZXBsb3ltZW50cy8ke2RlcGxveW1lbnR9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VVUkwgPSBgJHtlbmRwb2ludH0vb3BlbmFpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcnMuT3BlbkFJRXJyb3IoJ2Jhc2VVUkwgYW5kIGVuZHBvaW50IGFyZSBtdXR1YWxseSBleGNsdXNpdmUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlcih7XG4gICAgICBhcGlLZXksXG4gICAgICBiYXNlVVJMLFxuICAgICAgLi4ub3B0cyxcbiAgICAgIC4uLihkYW5nZXJvdXNseUFsbG93QnJvd3NlciAhPT0gdW5kZWZpbmVkID8geyBkYW5nZXJvdXNseUFsbG93QnJvd3NlciB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fYXp1cmVBRFRva2VuUHJvdmlkZXIgPSBhenVyZUFEVG9rZW5Qcm92aWRlcjtcbiAgICB0aGlzLmFwaVZlcnNpb24gPSBhcGlWZXJzaW9uO1xuICB9XG5cbiAgb3ZlcnJpZGUgYnVpbGRSZXF1ZXN0KG9wdGlvbnM6IENvcmUuRmluYWxSZXF1ZXN0T3B0aW9uczx1bmtub3duPik6IHtcbiAgICByZXE6IFJlcXVlc3RJbml0O1xuICAgIHVybDogc3RyaW5nO1xuICAgIHRpbWVvdXQ6IG51bWJlcjtcbiAgfSB7XG4gICAgaWYgKF9kZXBsb3ltZW50c19lbmRwb2ludHMuaGFzKG9wdGlvbnMucGF0aCkgJiYgb3B0aW9ucy5tZXRob2QgPT09ICdwb3N0JyAmJiBvcHRpb25zLmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFDb3JlLmlzT2JqKG9wdGlvbnMuYm9keSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXF1ZXN0IGJvZHkgdG8gYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBtb2RlbCA9IG9wdGlvbnMuYm9keVsnbW9kZWwnXTtcbiAgICAgIGRlbGV0ZSBvcHRpb25zLmJvZHlbJ21vZGVsJ107XG4gICAgICBpZiAobW9kZWwgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5iYXNlVVJMLmluY2x1ZGVzKCcvZGVwbG95bWVudHMnKSkge1xuICAgICAgICBvcHRpb25zLnBhdGggPSBgL2RlcGxveW1lbnRzLyR7bW9kZWx9JHtvcHRpb25zLnBhdGh9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmJ1aWxkUmVxdWVzdChvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2dldEF6dXJlQURUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fYXp1cmVBRFRva2VuUHJvdmlkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5fYXp1cmVBRFRva2VuUHJvdmlkZXIoKTtcbiAgICAgIGlmICghdG9rZW4gfHwgdHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKFxuICAgICAgICAgIGBFeHBlY3RlZCAnYXp1cmVBRFRva2VuUHJvdmlkZXInIGFyZ3VtZW50IHRvIHJldHVybiBhIHN0cmluZyBidXQgaXQgcmV0dXJuZWQgJHt0b2tlbn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGF1dGhIZWFkZXJzKG9wdHM6IENvcmUuRmluYWxSZXF1ZXN0T3B0aW9ucyk6IENvcmUuSGVhZGVycyB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHByZXBhcmVPcHRpb25zKG9wdHM6IENvcmUuRmluYWxSZXF1ZXN0T3B0aW9uczx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRzLmhlYWRlcnM/LlsnQXV0aG9yaXphdGlvbiddIHx8IG9wdHMuaGVhZGVycz8uWydhcGkta2V5J10pIHtcbiAgICAgIHJldHVybiBzdXBlci5wcmVwYXJlT3B0aW9ucyhvcHRzKTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLl9nZXRBenVyZUFEVG9rZW4oKTtcbiAgICBvcHRzLmhlYWRlcnMgPz89IHt9O1xuICAgIGlmICh0b2tlbikge1xuICAgICAgb3B0cy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXBpS2V5ICE9PSBBUElfS0VZX1NFTlRJTkVMKSB7XG4gICAgICBvcHRzLmhlYWRlcnNbJ2FwaS1rZXknXSA9IHRoaXMuYXBpS2V5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JzLk9wZW5BSUVycm9yKCdVbmFibGUgdG8gaGFuZGxlIGF1dGgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnByZXBhcmVPcHRpb25zKG9wdHMpO1xuICB9XG59XG5cbmNvbnN0IF9kZXBsb3ltZW50c19lbmRwb2ludHMgPSBuZXcgU2V0KFtcbiAgJy9jb21wbGV0aW9ucycsXG4gICcvY2hhdC9jb21wbGV0aW9ucycsXG4gICcvZW1iZWRkaW5ncycsXG4gICcvYXVkaW8vdHJhbnNjcmlwdGlvbnMnLFxuICAnL2F1ZGlvL3RyYW5zbGF0aW9ucycsXG4gICcvYXVkaW8vc3BlZWNoJyxcbiAgJy9pbWFnZXMvZ2VuZXJhdGlvbnMnLFxuXSk7XG5cbmNvbnN0IEFQSV9LRVlfU0VOVElORUwgPSAnPE1pc3NpbmcgS2V5Pic7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIEF6dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGRlZmF1bHQgT3BlbkFJO1xuIiwgImV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzAuMy4zJzsgLy8geC1yZWxlYXNlLXBsZWFzZS12ZXJzaW9uXG4iLCAiLyoqXG4gKiBEaXNjbGFpbWVyOiBtb2R1bGVzIGluIF9zaGltcyBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgaW1wb3J0ZWQgYnkgU0RLIHVzZXJzLlxuICovXG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hpbXMge1xuICBraW5kOiBzdHJpbmc7XG4gIGZldGNoOiBhbnk7XG4gIFJlcXVlc3Q6IGFueTtcbiAgUmVzcG9uc2U6IGFueTtcbiAgSGVhZGVyczogYW55O1xuICBGb3JtRGF0YTogYW55O1xuICBCbG9iOiBhbnk7XG4gIEZpbGU6IGFueTtcbiAgUmVhZGFibGVTdHJlYW06IGFueTtcbiAgZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnM6IDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIGZvcm06IFNoaW1zWydGb3JtRGF0YSddLFxuICAgIG9wdHM6IFJlcXVlc3RPcHRpb25zPFQ+LFxuICApID0+IFByb21pc2U8UmVxdWVzdE9wdGlvbnM8VD4+O1xuICBnZXREZWZhdWx0QWdlbnQ6ICh1cmw6IHN0cmluZykgPT4gYW55O1xuICBmaWxlRnJvbVBhdGg6XG4gICAgfCAoKHBhdGg6IHN0cmluZywgZmlsZW5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiB7fSkgPT4gUHJvbWlzZTxTaGltc1snRmlsZSddPilcbiAgICB8ICgocGF0aDogc3RyaW5nLCBvcHRpb25zPzoge30pID0+IFByb21pc2U8U2hpbXNbJ0ZpbGUnXT4pO1xuICBpc0ZzUmVhZFN0cmVhbTogKHZhbHVlOiBhbnkpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBsZXQgYXV0byA9IGZhbHNlO1xuZXhwb3J0IGxldCBraW5kOiBTaGltc1sna2luZCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBmZXRjaDogU2hpbXNbJ2ZldGNoJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IFJlcXVlc3Q6IFNoaW1zWydSZXF1ZXN0J10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IFJlc3BvbnNlOiBTaGltc1snUmVzcG9uc2UnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgSGVhZGVyczogU2hpbXNbJ0hlYWRlcnMnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgRm9ybURhdGE6IFNoaW1zWydGb3JtRGF0YSddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBCbG9iOiBTaGltc1snQmxvYiddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBGaWxlOiBTaGltc1snRmlsZSddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBSZWFkYWJsZVN0cmVhbTogU2hpbXNbJ1JlYWRhYmxlU3RyZWFtJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zOiBTaGltc1snZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbmV4cG9ydCBsZXQgZ2V0RGVmYXVsdEFnZW50OiBTaGltc1snZ2V0RGVmYXVsdEFnZW50J10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5leHBvcnQgbGV0IGZpbGVGcm9tUGF0aDogU2hpbXNbJ2ZpbGVGcm9tUGF0aCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuZXhwb3J0IGxldCBpc0ZzUmVhZFN0cmVhbTogU2hpbXNbJ2lzRnNSZWFkU3RyZWFtJ10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRTaGltcyhzaGltczogU2hpbXMsIG9wdGlvbnM6IHsgYXV0bzogYm9vbGVhbiB9ID0geyBhdXRvOiBmYWxzZSB9KSB7XG4gIGlmIChhdXRvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHlvdSBtdXN0IFxcYGltcG9ydCAnZ3JvcS1zZGsvc2hpbXMvJHtzaGltcy5raW5kfSdcXGAgYmVmb3JlIGltcG9ydGluZyBhbnl0aGluZyBlbHNlIGZyb20gZ3JvcS1zZGtgLFxuICAgICk7XG4gIH1cbiAgaWYgKGtpbmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgY2FuJ3QgXFxgaW1wb3J0ICdncm9xLXNkay9zaGltcy8ke3NoaW1zLmtpbmR9J1xcYCBhZnRlciBcXGBpbXBvcnQgJ2dyb3Etc2RrL3NoaW1zLyR7a2luZH0nXFxgYCxcbiAgICApO1xuICB9XG4gIGF1dG8gPSBvcHRpb25zLmF1dG87XG4gIGtpbmQgPSBzaGltcy5raW5kO1xuICBmZXRjaCA9IHNoaW1zLmZldGNoO1xuICBSZXF1ZXN0ID0gc2hpbXMuUmVxdWVzdDtcbiAgUmVzcG9uc2UgPSBzaGltcy5SZXNwb25zZTtcbiAgSGVhZGVycyA9IHNoaW1zLkhlYWRlcnM7XG4gIEZvcm1EYXRhID0gc2hpbXMuRm9ybURhdGE7XG4gIEJsb2IgPSBzaGltcy5CbG9iO1xuICBGaWxlID0gc2hpbXMuRmlsZTtcbiAgUmVhZGFibGVTdHJlYW0gPSBzaGltcy5SZWFkYWJsZVN0cmVhbTtcbiAgZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMgPSBzaGltcy5nZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucztcbiAgZ2V0RGVmYXVsdEFnZW50ID0gc2hpbXMuZ2V0RGVmYXVsdEFnZW50O1xuICBmaWxlRnJvbVBhdGggPSBzaGltcy5maWxlRnJvbVBhdGg7XG4gIGlzRnNSZWFkU3RyZWFtID0gc2hpbXMuaXNGc1JlYWRTdHJlYW07XG59XG4iLCAiLyoqXG4gKiBEaXNjbGFpbWVyOiBtb2R1bGVzIGluIF9zaGltcyBhcmVuJ3QgaW50ZW5kZWQgdG8gYmUgaW1wb3J0ZWQgYnkgU0RLIHVzZXJzLlxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlwYXJ0Qm9keSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBib2R5OiBhbnkpIHt9XG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnTXVsdGlwYXJ0Qm9keSc7XG4gIH1cbn1cbiIsICIvKipcbiAqIERpc2NsYWltZXI6IG1vZHVsZXMgaW4gX3NoaW1zIGFyZW4ndCBpbnRlbmRlZCB0byBiZSBpbXBvcnRlZCBieSBTREsgdXNlcnMuXG4gKi9cbmltcG9ydCB7IE11bHRpcGFydEJvZHkgfSBmcm9tICcuL011bHRpcGFydEJvZHknO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgdHlwZSBTaGltcyB9IGZyb20gJy4vcmVnaXN0cnknO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVudGltZSh7IG1hbnVhbGx5SW1wb3J0ZWQgfTogeyBtYW51YWxseUltcG9ydGVkPzogYm9vbGVhbiB9ID0ge30pOiBTaGltcyB7XG4gIGNvbnN0IHJlY29tbWVuZGF0aW9uID1cbiAgICBtYW51YWxseUltcG9ydGVkID9cbiAgICAgIGBZb3UgbWF5IG5lZWQgdG8gdXNlIHBvbHlmaWxsc2BcbiAgICA6IGBBZGQgb25lIG9mIHRoZXNlIGltcG9ydHMgYmVmb3JlIHlvdXIgZmlyc3QgXFxgaW1wb3J0IFx1MjAyNiBmcm9tICdncm9xLXNkaydcXGA6XG4tIFxcYGltcG9ydCAnZ3JvcS1zZGsvc2hpbXMvbm9kZSdcXGAgKGlmIHlvdSdyZSBydW5uaW5nIG9uIE5vZGUpXG4tIFxcYGltcG9ydCAnZ3JvcS1zZGsvc2hpbXMvd2ViJ1xcYCAob3RoZXJ3aXNlKVxuYDtcblxuICBsZXQgX2ZldGNoLCBfUmVxdWVzdCwgX1Jlc3BvbnNlLCBfSGVhZGVycztcbiAgdHJ5IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgX2ZldGNoID0gZmV0Y2g7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF9SZXF1ZXN0ID0gUmVxdWVzdDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgX1Jlc3BvbnNlID0gUmVzcG9uc2U7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIF9IZWFkZXJzID0gSGVhZGVycztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgdGhpcyBlbnZpcm9ubWVudCBpcyBtaXNzaW5nIHRoZSBmb2xsb3dpbmcgV2ViIEZldGNoIEFQSSB0eXBlOiAke1xuICAgICAgICAoZXJyb3IgYXMgYW55KS5tZXNzYWdlXG4gICAgICB9LiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAga2luZDogJ3dlYicsXG4gICAgZmV0Y2g6IF9mZXRjaCxcbiAgICBSZXF1ZXN0OiBfUmVxdWVzdCxcbiAgICBSZXNwb25zZTogX1Jlc3BvbnNlLFxuICAgIEhlYWRlcnM6IF9IZWFkZXJzLFxuICAgIEZvcm1EYXRhOlxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEZvcm1EYXRhIDogKFxuICAgICAgICBjbGFzcyBGb3JtRGF0YSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgZmlsZSB1cGxvYWRzIGFyZW4ndCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCB5ZXQgYXMgJ0Zvcm1EYXRhJyBpcyB1bmRlZmluZWQuICR7cmVjb21tZW5kYXRpb259YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgIEJsb2I6XG4gICAgICB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgPyBCbG9iIDogKFxuICAgICAgICBjbGFzcyBCbG9iIHtcbiAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYGZpbGUgdXBsb2FkcyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgeWV0IGFzICdCbG9iJyBpcyB1bmRlZmluZWQuICR7cmVjb21tZW5kYXRpb259YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgIEZpbGU6XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0eXBlb2YgRmlsZSAhPT0gJ3VuZGVmaW5lZCcgPyBGaWxlIDogKFxuICAgICAgICBjbGFzcyBGaWxlIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBmaWxlIHVwbG9hZHMgYXJlbid0IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IHlldCBhcyAnRmlsZScgaXMgdW5kZWZpbmVkLiAke3JlY29tbWVuZGF0aW9ufWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICBSZWFkYWJsZVN0cmVhbTpcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHR5cGVvZiBSZWFkYWJsZVN0cmVhbSAhPT0gJ3VuZGVmaW5lZCcgPyBSZWFkYWJsZVN0cmVhbSA6IChcbiAgICAgICAgY2xhc3MgUmVhZGFibGVTdHJlYW0ge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYHN0cmVhbWluZyBpc24ndCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCB5ZXQgYXMgJ1JlYWRhYmxlU3RyZWFtJyBpcyB1bmRlZmluZWQuICR7cmVjb21tZW5kYXRpb259YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zOiBhc3luYyA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvcm06IEZvcm1EYXRhLFxuICAgICAgb3B0czogUmVxdWVzdE9wdGlvbnM8VD4sXG4gICAgKTogUHJvbWlzZTxSZXF1ZXN0T3B0aW9uczxUPj4gPT4gKHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICBib2R5OiBuZXcgTXVsdGlwYXJ0Qm9keShmb3JtKSBhcyBhbnksXG4gICAgfSksXG4gICAgZ2V0RGVmYXVsdEFnZW50OiAodXJsOiBzdHJpbmcpID0+IHVuZGVmaW5lZCxcbiAgICBmaWxlRnJvbVBhdGg6ICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBgZmlsZUZyb21QYXRoYCBmdW5jdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBpbiBOb2RlLiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzOiBodHRwczovL3d3dy5naXRodWIuY29tL2dyb3EvZ3JvcS10eXBlc2NyaXB0I2ZpbGUtdXBsb2FkcycsXG4gICAgICApO1xuICAgIH0sXG4gICAgaXNGc1JlYWRTdHJlYW06ICh2YWx1ZTogYW55KSA9PiBmYWxzZSxcbiAgfTtcbn1cbiIsICIvKipcbiAqIERpc2NsYWltZXI6IG1vZHVsZXMgaW4gX3NoaW1zIGFyZW4ndCBpbnRlbmRlZCB0byBiZSBpbXBvcnRlZCBieSBTREsgdXNlcnMuXG4gKi9cbmltcG9ydCAqIGFzIHNoaW1zIGZyb20gJy4vcmVnaXN0cnkubWpzJztcbmltcG9ydCAqIGFzIGF1dG8gZnJvbSAnZ3JvcS1zZGsvX3NoaW1zL2F1dG8vcnVudGltZSc7XG5pZiAoIXNoaW1zLmtpbmQpIHNoaW1zLnNldFNoaW1zKGF1dG8uZ2V0UnVudGltZSgpLCB7IGF1dG86IHRydWUgfSk7XG5leHBvcnQgKiBmcm9tICcuL3JlZ2lzdHJ5Lm1qcyc7XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy5cblxuaW1wb3J0IHsgY2FzdFRvRXJyb3IsIEhlYWRlcnMgfSBmcm9tICcuL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgR3JvcUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGNsYXNzIEFQSUVycm9yIGV4dGVuZHMgR3JvcUVycm9yIHtcbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnMgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGVycm9yOiBPYmplY3QgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZXJyb3I6IE9iamVjdCB8IHVuZGVmaW5lZCxcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaGVhZGVyczogSGVhZGVycyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgc3VwZXIoYCR7QVBJRXJyb3IubWFrZU1lc3NhZ2Uoc3RhdHVzLCBlcnJvciwgbWVzc2FnZSl9YCk7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYWtlTWVzc2FnZShzdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZCwgZXJyb3I6IGFueSwgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbXNnID1cbiAgICAgIGVycm9yPy5tZXNzYWdlID9cbiAgICAgICAgdHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICBlcnJvci5tZXNzYWdlXG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZSlcbiAgICAgIDogZXJyb3IgPyBKU09OLnN0cmluZ2lmeShlcnJvcilcbiAgICAgIDogbWVzc2FnZTtcblxuICAgIGlmIChzdGF0dXMgJiYgbXNnKSB7XG4gICAgICByZXR1cm4gYCR7c3RhdHVzfSAke21zZ31gO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzKSB7XG4gICAgICByZXR1cm4gYCR7c3RhdHVzfSBzdGF0dXMgY29kZSAobm8gYm9keSlgO1xuICAgIH1cbiAgICBpZiAobXNnKSB7XG4gICAgICByZXR1cm4gbXNnO1xuICAgIH1cbiAgICByZXR1cm4gJyhubyBzdGF0dXMgY29kZSBvciBib2R5KSc7XG4gIH1cblxuICBzdGF0aWMgZ2VuZXJhdGUoXG4gICAgc3RhdHVzOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZXJyb3JSZXNwb25zZTogT2JqZWN0IHwgdW5kZWZpbmVkLFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBoZWFkZXJzOiBIZWFkZXJzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICBpZiAoIXN0YXR1cykge1xuICAgICAgcmV0dXJuIG5ldyBBUElDb25uZWN0aW9uRXJyb3IoeyBjYXVzZTogY2FzdFRvRXJyb3IoZXJyb3JSZXNwb25zZSkgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3IgPSBlcnJvclJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MDApIHtcbiAgICAgIHJldHVybiBuZXcgQmFkUmVxdWVzdEVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgcmV0dXJuIG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgcmV0dXJuIG5ldyBQZXJtaXNzaW9uRGVuaWVkRXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gNDIyKSB7XG4gICAgICByZXR1cm4gbmV3IFVucHJvY2Vzc2FibGVFbnRpdHlFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSA0MjkpIHtcbiAgICAgIHJldHVybiBuZXcgUmF0ZUxpbWl0RXJyb3Ioc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvcihzdGF0dXMsIGVycm9yLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFQSUVycm9yKHN0YXR1cywgZXJyb3IsIG1lc3NhZ2UsIGhlYWRlcnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBUElVc2VyQWJvcnRFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoeyBtZXNzYWdlIH06IHsgbWVzc2FnZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBzdXBlcih1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWVzc2FnZSB8fCAnUmVxdWVzdCB3YXMgYWJvcnRlZC4nLCB1bmRlZmluZWQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBUElDb25uZWN0aW9uRXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSwgY2F1c2UgfTogeyBtZXNzYWdlPzogc3RyaW5nOyBjYXVzZT86IEVycm9yIHwgdW5kZWZpbmVkIH0pIHtcbiAgICBzdXBlcih1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWVzc2FnZSB8fCAnQ29ubmVjdGlvbiBlcnJvci4nLCB1bmRlZmluZWQpO1xuICAgIC8vIGluIHNvbWUgZW52aXJvbm1lbnRzIHRoZSAnY2F1c2UnIHByb3BlcnR5IGlzIGFscmVhZHkgZGVjbGFyZWRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGNhdXNlKSB0aGlzLmNhdXNlID0gY2F1c2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IgZXh0ZW5kcyBBUElDb25uZWN0aW9uRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UgfTogeyBtZXNzYWdlPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgbWVzc2FnZTogbWVzc2FnZSA/PyAnUmVxdWVzdCB0aW1lZCBvdXQuJyB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmFkUmVxdWVzdEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQwMCA9IDQwMDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uRXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDAxID0gNDAxO1xufVxuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbkRlbmllZEVycm9yIGV4dGVuZHMgQVBJRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBzdGF0dXM6IDQwMyA9IDQwMztcbn1cblxuZXhwb3J0IGNsYXNzIE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDA0ID0gNDA0O1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmxpY3RFcnJvciBleHRlbmRzIEFQSUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgc3RhdHVzOiA0MDkgPSA0MDk7XG59XG5cbmV4cG9ydCBjbGFzcyBVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDIyID0gNDIyO1xufVxuXG5leHBvcnQgY2xhc3MgUmF0ZUxpbWl0RXJyb3IgZXh0ZW5kcyBBUElFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHN0YXR1czogNDI5ID0gNDI5O1xufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxTZXJ2ZXJFcnJvciBleHRlbmRzIEFQSUVycm9yIHt9XG4iLCAiaW1wb3J0IHsgUmVhZGFibGVTdHJlYW0sIHR5cGUgUmVzcG9uc2UgfSBmcm9tIFwiLi4vX3NoaW1zL2luZGV4XCI7XG5pbXBvcnQgeyBHcm9xRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcblxuaW1wb3J0IHsgQVBJRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JcIjtcblxudHlwZSBCeXRlcyA9IHN0cmluZyB8IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSB8IEJ1ZmZlciB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIFNlcnZlclNlbnRFdmVudCA9IHtcbiAgZXZlbnQ6IHN0cmluZyB8IG51bGw7XG4gIGRhdGE6IHN0cmluZztcbiAgcmF3OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTdHJlYW08SXRlbT4gaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPEl0ZW0+IHtcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaXRlcmF0b3I6ICgpID0+IEFzeW5jSXRlcmF0b3I8SXRlbT4sXG4gICAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICApIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGZyb21TU0VSZXNwb25zZTxJdGVtPihyZXNwb25zZTogUmVzcG9uc2UsIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcikge1xuICAgIGxldCBjb25zdW1lZCA9IGZhbHNlO1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgU1NFRGVjb2RlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGl0ZXJNZXNzYWdlcygpOiBBc3luY0dlbmVyYXRvcjxTZXJ2ZXJTZW50RXZlbnQsIHZvaWQsIHVua25vd24+IHtcbiAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIHRocm93IG5ldyBHcm9xRXJyb3IoYEF0dGVtcHRlZCB0byBpdGVyYXRlIG92ZXIgYSByZXNwb25zZSB3aXRoIG5vIGJvZHlgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGluZURlY29kZXIgPSBuZXcgTGluZURlY29kZXIoKTtcblxuICAgICAgY29uc3QgaXRlciA9IHJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYWJsZTxCeXRlcz4ocmVzcG9uc2UuYm9keSk7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGl0ZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVEZWNvZGVyLmRlY29kZShjaHVuaykpIHtcbiAgICAgICAgICBjb25zdCBzc2UgPSBkZWNvZGVyLmRlY29kZShsaW5lKTtcbiAgICAgICAgICBpZiAoc3NlKSB5aWVsZCBzc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVEZWNvZGVyLmZsdXNoKCkpIHtcbiAgICAgICAgY29uc3Qgc3NlID0gZGVjb2Rlci5kZWNvZGUobGluZSk7XG4gICAgICAgIGlmIChzc2UpIHlpZWxkIHNzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiogaXRlcmF0b3IoKTogQXN5bmNJdGVyYXRvcjxJdGVtLCBhbnksIHVuZGVmaW5lZD4ge1xuICAgICAgaWYgKGNvbnN1bWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGl0ZXJhdGUgb3ZlciBhIGNvbnN1bWVkIHN0cmVhbSwgdXNlIGAudGVlKClgIHRvIHNwbGl0IHRoZSBzdHJlYW0uJyk7XG4gICAgICB9XG4gICAgICBjb25zdW1lZCA9IHRydWU7XG4gICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBzc2Ugb2YgaXRlck1lc3NhZ2VzKCkpIHtcbiAgICAgICAgICBpZiAoZG9uZSkgY29udGludWU7XG5cbiAgICAgICAgICBpZiAoc3NlLmRhdGEuc3RhcnRzV2l0aCgnW0RPTkVdJykpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNzZS5ldmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGRhdGE7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHNzZS5kYXRhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQ291bGQgbm90IHBhcnNlIG1lc3NhZ2UgaW50byBKU09OOmAsIHNzZS5kYXRhKTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRnJvbSBjaHVuazpgLCBzc2UucmF3KTtcbiAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQVBJRXJyb3IodW5kZWZpbmVkLCBkYXRhLmVycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHlpZWxkIGRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiB0aGUgdXNlciBjYWxscyBgc3RyZWFtLmNvbnRyb2xsZXIuYWJvcnQoKWAsIHdlIHNob3VsZCBleGl0IHdpdGhvdXQgdGhyb3dpbmcuXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGBicmVha2BzLCBhYm9ydCB0aGUgb25nb2luZyByZXF1ZXN0LlxuICAgICAgICBpZiAoIWRvbmUpIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0cmVhbShpdGVyYXRvciwgY29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgU3RyZWFtIGZyb20gYSBuZXdsaW5lLXNlcGFyYXRlZCBSZWFkYWJsZVN0cmVhbVxuICAgKiB3aGVyZSBlYWNoIGl0ZW0gaXMgYSBKU09OIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIGZyb21SZWFkYWJsZVN0cmVhbTxJdGVtPihyZWFkYWJsZVN0cmVhbTogUmVhZGFibGVTdHJlYW0sIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcikge1xuICAgIGxldCBjb25zdW1lZCA9IGZhbHNlO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGl0ZXJMaW5lcygpOiBBc3luY0dlbmVyYXRvcjxzdHJpbmcsIHZvaWQsIHVua25vd24+IHtcbiAgICAgIGNvbnN0IGxpbmVEZWNvZGVyID0gbmV3IExpbmVEZWNvZGVyKCk7XG5cbiAgICAgIGNvbnN0IGl0ZXIgPSByZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmFibGU8Qnl0ZXM+KHJlYWRhYmxlU3RyZWFtKTtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcikge1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZURlY29kZXIuZGVjb2RlKGNodW5rKSkge1xuICAgICAgICAgIHlpZWxkIGxpbmU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVEZWNvZGVyLmZsdXNoKCkpIHtcbiAgICAgICAgeWllbGQgbGluZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiogaXRlcmF0b3IoKTogQXN5bmNJdGVyYXRvcjxJdGVtLCBhbnksIHVuZGVmaW5lZD4ge1xuICAgICAgaWYgKGNvbnN1bWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGl0ZXJhdGUgb3ZlciBhIGNvbnN1bWVkIHN0cmVhbSwgdXNlIGAudGVlKClgIHRvIHNwbGl0IHRoZSBzdHJlYW0uJyk7XG4gICAgICB9XG4gICAgICBjb25zdW1lZCA9IHRydWU7XG4gICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsaW5lIG9mIGl0ZXJMaW5lcygpKSB7XG4gICAgICAgICAgaWYgKGRvbmUpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChsaW5lKSB5aWVsZCBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJZiB0aGUgdXNlciBjYWxscyBgc3RyZWFtLmNvbnRyb2xsZXIuYWJvcnQoKWAsIHdlIHNob3VsZCBleGl0IHdpdGhvdXQgdGhyb3dpbmcuXG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGBicmVha2BzLCBhYm9ydCB0aGUgb25nb2luZyByZXF1ZXN0LlxuICAgICAgICBpZiAoIWRvbmUpIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0cmVhbShpdGVyYXRvciwgY29udHJvbGxlcik7XG4gIH1cblxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmF0b3I8SXRlbT4ge1xuICAgIHJldHVybiB0aGlzLml0ZXJhdG9yKCk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIHRoZSBzdHJlYW0gaW50byB0d28gc3RyZWFtcyB3aGljaCBjYW4gYmVcbiAgICogaW5kZXBlbmRlbnRseSByZWFkIGZyb20gYXQgZGlmZmVyZW50IHNwZWVkcy5cbiAgICovXG4gIHRlZSgpOiBbU3RyZWFtPEl0ZW0+LCBTdHJlYW08SXRlbT5dIHtcbiAgICBjb25zdCBsZWZ0OiBBcnJheTxQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PEl0ZW0+Pj4gPSBbXTtcbiAgICBjb25zdCByaWdodDogQXJyYXk8UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxJdGVtPj4+ID0gW107XG4gICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yKCk7XG5cbiAgICBjb25zdCB0ZWVJdGVyYXRvciA9IChxdWV1ZTogQXJyYXk8UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxJdGVtPj4+KTogQXN5bmNJdGVyYXRvcjxJdGVtPiA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgbGVmdC5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICByaWdodC5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBxdWV1ZS5zaGlmdCgpITtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgU3RyZWFtKCgpID0+IHRlZUl0ZXJhdG9yKGxlZnQpLCB0aGlzLmNvbnRyb2xsZXIpLFxuICAgICAgbmV3IFN0cmVhbSgoKSA9PiB0ZWVJdGVyYXRvcihyaWdodCksIHRoaXMuY29udHJvbGxlciksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGlzIHN0cmVhbSB0byBhIG5ld2xpbmUtc2VwYXJhdGVkIFJlYWRhYmxlU3RyZWFtIG9mXG4gICAqIEpTT04gc3RyaW5naWZpZWQgdmFsdWVzIGluIHRoZSBzdHJlYW1cbiAgICogd2hpY2ggY2FuIGJlIHR1cm5lZCBiYWNrIGludG8gYSBTdHJlYW0gd2l0aCBgU3RyZWFtLmZyb21SZWFkYWJsZVN0cmVhbSgpYC5cbiAgICovXG4gIHRvUmVhZGFibGVTdHJlYW0oKTogUmVhZGFibGVTdHJlYW0ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBpdGVyOiBBc3luY0l0ZXJhdG9yPEl0ZW0+O1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcblxuICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgYXN5bmMgc3RhcnQoKSB7XG4gICAgICAgIGl0ZXIgPSBzZWxmW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHB1bGwoY3RybCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm4gY3RybC5jbG9zZSgpO1xuXG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSBlbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnXFxuJyk7XG5cbiAgICAgICAgICBjdHJsLmVucXVldWUoYnl0ZXMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjdHJsLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgIGF3YWl0IGl0ZXIucmV0dXJuPy4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgU1NFRGVjb2RlciB7XG4gIHByaXZhdGUgZGF0YTogc3RyaW5nW107XG4gIHByaXZhdGUgZXZlbnQ6IHN0cmluZyB8IG51bGw7XG4gIHByaXZhdGUgY2h1bmtzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICB0aGlzLmNodW5rcyA9IFtdO1xuICB9XG5cbiAgZGVjb2RlKGxpbmU6IHN0cmluZykge1xuICAgIGlmIChsaW5lLmVuZHNXaXRoKCdcXHInKSkge1xuICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMSk7XG4gICAgfVxuXG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICAvLyBlbXB0eSBsaW5lIGFuZCB3ZSBkaWRuJ3QgcHJldmlvdXNseSBlbmNvdW50ZXIgYW55IG1lc3NhZ2VzXG4gICAgICBpZiAoIXRoaXMuZXZlbnQgJiYgIXRoaXMuZGF0YS5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCBzc2U6IFNlcnZlclNlbnRFdmVudCA9IHtcbiAgICAgICAgZXZlbnQ6IHRoaXMuZXZlbnQsXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YS5qb2luKCdcXG4nKSxcbiAgICAgICAgcmF3OiB0aGlzLmNodW5rcyxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXZlbnQgPSBudWxsO1xuICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICB0aGlzLmNodW5rcyA9IFtdO1xuXG4gICAgICByZXR1cm4gc3NlO1xuICAgIH1cblxuICAgIHRoaXMuY2h1bmtzLnB1c2gobGluZSk7XG5cbiAgICBpZiAobGluZS5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBbZmllbGRuYW1lLCBfLCB2YWx1ZV0gPSBwYXJ0aXRpb24obGluZSwgJzonKTtcblxuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCcgJykpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZG5hbWUgPT09ICdldmVudCcpIHtcbiAgICAgIHRoaXMuZXZlbnQgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkbmFtZSA9PT0gJ2RhdGEnKSB7XG4gICAgICB0aGlzLmRhdGEucHVzaCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHJlLWltcGxlbWVudGF0aW9uIG9mIGh0dHB4J3MgYExpbmVEZWNvZGVyYCBpbiBQeXRob24gdGhhdCBoYW5kbGVzIGluY3JlbWVudGFsbHlcbiAqIHJlYWRpbmcgbGluZXMgZnJvbSB0ZXh0LlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmNvZGUvaHR0cHgvYmxvYi85MjAzMzNlYTk4MTE4ZTljZjYxN2YyNDY5MDVkN2IyMDI1MTA5NDFjL2h0dHB4L19kZWNvZGVycy5weSNMMjU4XG4gKi9cbmNsYXNzIExpbmVEZWNvZGVyIHtcbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHN0YXRpYyBORVdMSU5FX0NIQVJTID0gbmV3IFNldChbJ1xcbicsICdcXHInLCAnXFx4MGInLCAnXFx4MGMnLCAnXFx4MWMnLCAnXFx4MWQnLCAnXFx4MWUnLCAnXFx4ODUnLCAnXFx1MjAyOCcsICdcXHUyMDI5J10pO1xuICBzdGF0aWMgTkVXTElORV9SRUdFWFAgPSAvXFxyXFxufFtcXG5cXHJcXHgwYlxceDBjXFx4MWNcXHgxZFxceDFlXFx4ODVcXHUyMDI4XFx1MjAyOV0vZztcblxuICBidWZmZXI6IHN0cmluZ1tdO1xuICB0cmFpbGluZ0NSOiBib29sZWFuO1xuICB0ZXh0RGVjb2RlcjogYW55OyAvLyBUZXh0RGVjb2RlciBmb3VuZCBpbiBicm93c2Vyczsgbm90IHR5cGVkIHRvIGF2b2lkIHB1bGxpbmcgaW4gZWl0aGVyIFwiZG9tXCIgb3IgXCJub2RlXCIgdHlwZXMuXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICB0aGlzLnRyYWlsaW5nQ1IgPSBmYWxzZTtcbiAgfVxuXG4gIGRlY29kZShjaHVuazogQnl0ZXMpOiBzdHJpbmdbXSB7XG4gICAgbGV0IHRleHQgPSB0aGlzLmRlY29kZVRleHQoY2h1bmspO1xuXG4gICAgaWYgKHRoaXMudHJhaWxpbmdDUikge1xuICAgICAgdGV4dCA9ICdcXHInICsgdGV4dDtcbiAgICAgIHRoaXMudHJhaWxpbmdDUiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGV4dC5lbmRzV2l0aCgnXFxyJykpIHtcbiAgICAgIHRoaXMudHJhaWxpbmdDUiA9IHRydWU7XG4gICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtMSk7XG4gICAgfVxuXG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdHJhaWxpbmdOZXdsaW5lID0gTGluZURlY29kZXIuTkVXTElORV9DSEFSUy5oYXModGV4dFt0ZXh0Lmxlbmd0aCAtIDFdIHx8ICcnKTtcbiAgICBsZXQgbGluZXMgPSB0ZXh0LnNwbGl0KExpbmVEZWNvZGVyLk5FV0xJTkVfUkVHRVhQKTtcblxuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEgJiYgIXRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgdGhpcy5idWZmZXIucHVzaChsaW5lc1swXSEpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcyA9IFt0aGlzLmJ1ZmZlci5qb2luKCcnKSArIGxpbmVzWzBdLCAuLi5saW5lcy5zbGljZSgxKV07XG4gICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgIH1cblxuICAgIGlmICghdHJhaWxpbmdOZXdsaW5lKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IFtsaW5lcy5wb3AoKSB8fCAnJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgZGVjb2RlVGV4dChieXRlczogQnl0ZXMpOiBzdHJpbmcge1xuICAgIGlmIChieXRlcyA9PSBudWxsKSByZXR1cm4gJyc7XG4gICAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHJldHVybiBieXRlcztcblxuICAgIC8vIE5vZGU6XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoYnl0ZXMgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIGJ5dGVzLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICBpZiAoYnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShieXRlcykudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEdyb3FFcnJvcihcbiAgICAgICAgYFVuZXhwZWN0ZWQ6IHJlY2VpdmVkIG5vbi1VaW50OEFycmF5ICgke2J5dGVzLmNvbnN0cnVjdG9yLm5hbWV9KSBzdHJlYW0gY2h1bmsgaW4gYW4gZW52aXJvbm1lbnQgd2l0aCBhIGdsb2JhbCBcIkJ1ZmZlclwiIGRlZmluZWQsIHdoaWNoIHRoaXMgbGlicmFyeSBhc3N1bWVzIHRvIGJlIE5vZGUuIFBsZWFzZSByZXBvcnQgdGhpcyBlcnJvci5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBCcm93c2VyXG4gICAgaWYgKHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgYnl0ZXMgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aGlzLnRleHREZWNvZGVyID8/PSBuZXcgVGV4dERlY29kZXIoJ3V0ZjgnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEdyb3FFcnJvcihcbiAgICAgICAgYFVuZXhwZWN0ZWQ6IHJlY2VpdmVkIG5vbi1VaW50OEFycmF5L0FycmF5QnVmZmVyICgke1xuICAgICAgICAgIChieXRlcyBhcyBhbnkpLmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgfSkgaW4gYSB3ZWIgcGxhdGZvcm0uIFBsZWFzZSByZXBvcnQgdGhpcyBlcnJvci5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgR3JvcUVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQ6IG5laXRoZXIgQnVmZmVyIG5vciBUZXh0RGVjb2RlciBhcmUgYXZhaWxhYmxlIGFzIGdsb2JhbHMuIFBsZWFzZSByZXBvcnQgdGhpcyBlcnJvci5gLFxuICAgICk7XG4gIH1cblxuICBmbHVzaCgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlci5sZW5ndGggJiYgIXRoaXMudHJhaWxpbmdDUikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gW3RoaXMuYnVmZmVyLmpvaW4oJycpXTtcbiAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgIHRoaXMudHJhaWxpbmdDUiA9IGZhbHNlO1xuICAgIHJldHVybiBsaW5lcztcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJ0aXRpb24oc3RyOiBzdHJpbmcsIGRlbGltaXRlcjogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddIHtcbiAgY29uc3QgaW5kZXggPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgcmV0dXJuIFtzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSwgZGVsaW1pdGVyLCBzdHIuc3Vic3RyaW5nKGluZGV4ICsgZGVsaW1pdGVyLmxlbmd0aCldO1xuICB9XG5cbiAgcmV0dXJuIFtzdHIsICcnLCAnJ107XG59XG5cbi8qKlxuICogTW9zdCBicm93c2VycyBkb24ndCB5ZXQgaGF2ZSBhc3luYyBpdGVyYWJsZSBzdXBwb3J0IGZvciBSZWFkYWJsZVN0cmVhbSxcbiAqIGFuZCBOb2RlIGhhcyBhIHZlcnkgZGlmZmVyZW50IHdheSBvZiByZWFkaW5nIGJ5dGVzIGZyb20gaXRzIFwiUmVhZGFibGVTdHJlYW1cIi5cbiAqXG4gKiBUaGlzIHBvbHlmaWxsIHdhcyBwdWxsZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTWF0dGlhc0J1ZWxlbnMvd2ViLXN0cmVhbXMtcG9seWZpbGwvcHVsbC8xMjIjaXNzdWVjb21tZW50LTE2MjczNTQ0OTBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYWJsZTxUPihzdHJlYW06IGFueSk6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxUPiB7XG4gIGlmIChzdHJlYW1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKSByZXR1cm4gc3RyZWFtO1xuXG4gIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBuZXh0KCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgaWYgKHJlc3VsdD8uZG9uZSkgcmVhZGVyLnJlbGVhc2VMb2NrKCk7IC8vIHJlbGVhc2UgbG9jayB3aGVuIHN0cmVhbSBiZWNvbWVzIGNsb3NlZFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTsgLy8gcmVsZWFzZSBsb2NrIHdoZW4gc3RyZWFtIGJlY29tZXMgZXJyb3JlZFxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IHJlYWRlci5jYW5jZWwoKTtcbiAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgYXdhaXQgY2FuY2VsUHJvbWlzZTtcbiAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICB9LFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICB9O1xufVxuIiwgImltcG9ydCB7IHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2NvcmUnO1xuaW1wb3J0IHtcbiAgRm9ybURhdGEsXG4gIEZpbGUsXG4gIHR5cGUgQmxvYixcbiAgdHlwZSBGaWxlUHJvcGVydHlCYWcsXG4gIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zLFxuICB0eXBlIEZzUmVhZFN0cmVhbSxcbiAgaXNGc1JlYWRTdHJlYW0sXG59IGZyb20gJy4vX3NoaW1zL2luZGV4JztcbmltcG9ydCB7IE11bHRpcGFydEJvZHkgfSBmcm9tICcuL19zaGltcy9NdWx0aXBhcnRCb2R5JztcbmV4cG9ydCB7IGZpbGVGcm9tUGF0aCB9IGZyb20gJy4vX3NoaW1zL2luZGV4JztcblxudHlwZSBCbG9iTGlrZVBhcnQgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IEFycmF5QnVmZmVyVmlldyB8IEJsb2JMaWtlIHwgVWludDhBcnJheSB8IERhdGFWaWV3O1xuZXhwb3J0IHR5cGUgQmxvYlBhcnQgPSBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IEFycmF5QnVmZmVyVmlldyB8IEJsb2IgfCBVaW50OEFycmF5IHwgRGF0YVZpZXc7XG5cbi8qKlxuICogVHlwaWNhbGx5LCB0aGlzIGlzIGEgbmF0aXZlIFwiRmlsZVwiIGNsYXNzLlxuICpcbiAqIFdlIHByb3ZpZGUgdGhlIHtAbGluayB0b0ZpbGV9IHV0aWxpdHkgdG8gY29udmVydCBhIHZhcmlldHkgb2Ygb2JqZWN0c1xuICogaW50byB0aGUgRmlsZSBjbGFzcy5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGEgZmV0Y2ggUmVzcG9uc2UsIG9yIGluIE5vZGUsXG4gKiB0aGUgcmVzdWx0IG9mIGZzLmNyZWF0ZVJlYWRTdHJlYW0oKS5cbiAqL1xuZXhwb3J0IHR5cGUgVXBsb2FkYWJsZSA9IEZpbGVMaWtlIHwgUmVzcG9uc2VMaWtlIHwgRnNSZWFkU3RyZWFtO1xuXG4vKipcbiAqIEludGVuZGVkIHRvIG1hdGNoIHdlYi5CbG9iLCBub2RlLkJsb2IsIG5vZGUtZmV0Y2guQmxvYiwgZXRjLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJsb2JMaWtlIHtcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvQmxvYi9zaXplKSAqL1xuICByZWFkb25seSBzaXplOiBudW1iZXI7XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0Jsb2IvdHlwZSkgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9CbG9iL3RleHQpICovXG4gIHRleHQoKTogUHJvbWlzZTxzdHJpbmc+O1xuICAvKiogW01ETiBSZWZlcmVuY2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0FQSS9CbG9iL3NsaWNlKSAqL1xuICBzbGljZShzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKTogQmxvYkxpa2U7XG4gIC8vIHVuZm9ydHVuYXRlbHkgQHR5cGVzL25vZGUtZmV0Y2hAXjIuNi40IGRvZXNuJ3QgdHlwZSB0aGUgYXJyYXlCdWZmZXIgbWV0aG9kXG59XG5cbi8qKlxuICogSW50ZW5kZWQgdG8gbWF0Y2ggd2ViLkZpbGUsIG5vZGUuRmlsZSwgbm9kZS1mZXRjaC5GaWxlLCBldGMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUxpa2UgZXh0ZW5kcyBCbG9iTGlrZSB7XG4gIC8qKiBbTUROIFJlZmVyZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvQVBJL0ZpbGUvbGFzdE1vZGlmaWVkKSAqL1xuICByZWFkb25seSBsYXN0TW9kaWZpZWQ6IG51bWJlcjtcbiAgLyoqIFtNRE4gUmVmZXJlbmNlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9BUEkvRmlsZS9uYW1lKSAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZW5kZWQgdG8gbWF0Y2ggd2ViLlJlc3BvbnNlLCBub2RlLlJlc3BvbnNlLCBub2RlLWZldGNoLlJlc3BvbnNlLCBldGMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VMaWtlIHtcbiAgdXJsOiBzdHJpbmc7XG4gIGJsb2IoKTogUHJvbWlzZTxCbG9iTGlrZT47XG59XG5cbmV4cG9ydCBjb25zdCBpc1Jlc3BvbnNlTGlrZSA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgUmVzcG9uc2VMaWtlID0+XG4gIHZhbHVlICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB0eXBlb2YgdmFsdWUudXJsID09PSAnc3RyaW5nJyAmJlxuICB0eXBlb2YgdmFsdWUuYmxvYiA9PT0gJ2Z1bmN0aW9uJztcblxuZXhwb3J0IGNvbnN0IGlzRmlsZUxpa2UgPSAodmFsdWU6IGFueSk6IHZhbHVlIGlzIEZpbGVMaWtlID0+XG4gIHZhbHVlICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgdHlwZW9mIHZhbHVlLmxhc3RNb2RpZmllZCA9PT0gJ251bWJlcicgJiZcbiAgaXNCbG9iTGlrZSh2YWx1ZSk7XG5cbi8qKlxuICogVGhlIEJsb2JMaWtlIHR5cGUgb21pdHMgYXJyYXlCdWZmZXIoKSBiZWNhdXNlIEB0eXBlcy9ub2RlLWZldGNoQF4yLjYuNCBsYWNrcyBpdDsgYnV0IHRoaXMgY2hlY2tcbiAqIGFkZHMgdGhlIGFycmF5QnVmZmVyKCkgbWV0aG9kIHR5cGUgYmVjYXVzZSBpdCBpcyBhdmFpbGFibGUgYW5kIHVzZWQgYXQgcnVudGltZVxuICovXG5leHBvcnQgY29uc3QgaXNCbG9iTGlrZSA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgQmxvYkxpa2UgJiB7IGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+IH0gPT5cbiAgdmFsdWUgIT0gbnVsbCAmJlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHR5cGVvZiB2YWx1ZS5zaXplID09PSAnbnVtYmVyJyAmJlxuICB0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZycgJiZcbiAgdHlwZW9mIHZhbHVlLnRleHQgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIHZhbHVlLnNsaWNlID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiB2YWx1ZS5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJztcblxuZXhwb3J0IGNvbnN0IGlzVXBsb2FkYWJsZSA9ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgVXBsb2FkYWJsZSA9PiB7XG4gIHJldHVybiBpc0ZpbGVMaWtlKHZhbHVlKSB8fCBpc1Jlc3BvbnNlTGlrZSh2YWx1ZSkgfHwgaXNGc1JlYWRTdHJlYW0odmFsdWUpO1xufTtcblxuZXhwb3J0IHR5cGUgVG9GaWxlSW5wdXQgPSBVcGxvYWRhYmxlIHwgRXhjbHVkZTxCbG9iTGlrZVBhcnQsIHN0cmluZz4gfCBBc3luY0l0ZXJhYmxlPEJsb2JMaWtlUGFydD47XG5cbi8qKlxuICogSGVscGVyIGZvciBjcmVhdGluZyBhIHtAbGluayBGaWxlfSB0byBwYXNzIHRvIGFuIFNESyB1cGxvYWQgbWV0aG9kIGZyb20gYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBkYXRhIGZvcm1hdHNcbiAqIEBwYXJhbSB2YWx1ZSB0aGUgcmF3IGNvbnRlbnQgb2YgdGhlIGZpbGUuICBDYW4gYmUgYW4ge0BsaW5rIFVwbG9hZGFibGV9LCB7QGxpbmsgQmxvYkxpa2VQYXJ0fSwgb3Ige0BsaW5rIEFzeW5jSXRlcmFibGV9IG9mIHtAbGluayBCbG9iTGlrZVBhcnR9c1xuICogQHBhcmFtIHtzdHJpbmc9fSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiBJZiBvbWl0dGVkLCB0b0ZpbGUgd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIGEgZmlsZSBuYW1lIGZyb20gYml0cyBpZiBwb3NzaWJsZVxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICogQHBhcmFtIHtzdHJpbmc9fSBvcHRpb25zLnR5cGUgdGhlIE1JTUUgdHlwZSBvZiB0aGUgY29udGVudFxuICogQHBhcmFtIHtudW1iZXI9fSBvcHRpb25zLmxhc3RNb2RpZmllZCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lc3RhbXBcbiAqIEByZXR1cm5zIGEge0BsaW5rIEZpbGV9IHdpdGggdGhlIGdpdmVuIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvRmlsZShcbiAgdmFsdWU6IFRvRmlsZUlucHV0IHwgUHJvbWlzZUxpa2U8VG9GaWxlSW5wdXQ+LFxuICBuYW1lPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogRmlsZVByb3BlcnR5QmFnIHwgdW5kZWZpbmVkID0ge30sXG4pOiBQcm9taXNlPEZpbGVMaWtlPiB7XG4gIC8vIElmIGl0J3MgYSBwcm9taXNlLCByZXNvbHZlIGl0LlxuICB2YWx1ZSA9IGF3YWl0IHZhbHVlO1xuXG4gIGlmIChpc1Jlc3BvbnNlTGlrZSh2YWx1ZSkpIHtcbiAgICBjb25zdCBibG9iID0gYXdhaXQgdmFsdWUuYmxvYigpO1xuICAgIG5hbWUgfHw9IG5ldyBVUkwodmFsdWUudXJsKS5wYXRobmFtZS5zcGxpdCgvW1xcXFwvXS8pLnBvcCgpID8/ICd1bmtub3duX2ZpbGUnO1xuXG4gICAgcmV0dXJuIG5ldyBGaWxlKFtibG9iIGFzIGFueV0sIG5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgYml0cyA9IGF3YWl0IGdldEJ5dGVzKHZhbHVlKTtcblxuICBuYW1lIHx8PSBnZXROYW1lKHZhbHVlKSA/PyAndW5rbm93bl9maWxlJztcblxuICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgIGNvbnN0IHR5cGUgPSAoYml0c1swXSBhcyBhbnkpPy50eXBlO1xuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIHR5cGUgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IEZpbGUoYml0cywgbmFtZSwgb3B0aW9ucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEJ5dGVzKHZhbHVlOiBUb0ZpbGVJbnB1dCk6IFByb21pc2U8QXJyYXk8QmxvYlBhcnQ+PiB7XG4gIGxldCBwYXJ0czogQXJyYXk8QmxvYlBhcnQ+ID0gW107XG4gIGlmIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSB8fCAvLyBpbmNsdWRlcyBVaW50OEFycmF5LCBCdWZmZXIsIGV0Yy5cbiAgICB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyXG4gICkge1xuICAgIHBhcnRzLnB1c2godmFsdWUpO1xuICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UodmFsdWUpKSB7XG4gICAgcGFydHMucHVzaChhd2FpdCB2YWx1ZS5hcnJheUJ1ZmZlcigpKTtcbiAgfSBlbHNlIGlmIChcbiAgICBpc0FzeW5jSXRlcmFibGVJdGVyYXRvcih2YWx1ZSkgLy8gaW5jbHVkZXMgUmVhZGFibGUsIFJlYWRhYmxlU3RyZWFtLCBldGMuXG4gICkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgdmFsdWUpIHtcbiAgICAgIHBhcnRzLnB1c2goY2h1bmsgYXMgQmxvYlBhcnQpOyAvLyBUT0RPLCBjb25zaWRlciB2YWxpZGF0aW5nP1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5leHBlY3RlZCBkYXRhIHR5cGU6ICR7dHlwZW9mIHZhbHVlfTsgY29uc3RydWN0b3I6ICR7dmFsdWU/LmNvbnN0cnVjdG9yXG4gICAgICAgID8ubmFtZX07IHByb3BzOiAke3Byb3BzRm9yRXJyb3IodmFsdWUpfWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuZnVuY3Rpb24gcHJvcHNGb3JFcnJvcih2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgY29uc3QgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIHJldHVybiBgWyR7cHJvcHMubWFwKChwKSA9PiBgXCIke3B9XCJgKS5qb2luKCcsICcpfV1gO1xufVxuXG5mdW5jdGlvbiBnZXROYW1lKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gKFxuICAgIGdldFN0cmluZ0Zyb21NYXliZUJ1ZmZlcih2YWx1ZS5uYW1lKSB8fFxuICAgIGdldFN0cmluZ0Zyb21NYXliZUJ1ZmZlcih2YWx1ZS5maWxlbmFtZSkgfHxcbiAgICAvLyBGb3IgZnMuUmVhZFN0cmVhbVxuICAgIGdldFN0cmluZ0Zyb21NYXliZUJ1ZmZlcih2YWx1ZS5wYXRoKT8uc3BsaXQoL1tcXFxcL10vKS5wb3AoKVxuICApO1xufVxuXG5jb25zdCBnZXRTdHJpbmdGcm9tTWF5YmVCdWZmZXIgPSAoeDogc3RyaW5nIHwgQnVmZmVyIHwgdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycpIHJldHVybiB4O1xuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgeCBpbnN0YW5jZW9mIEJ1ZmZlcikgcmV0dXJuIFN0cmluZyh4KTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGlzQXN5bmNJdGVyYWJsZUl0ZXJhdG9yID0gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8dW5rbm93bj4gPT5cbiAgdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG5cbmV4cG9ydCBjb25zdCBpc011bHRpcGFydEJvZHkgPSAoYm9keTogYW55KTogYm9keSBpcyBNdWx0aXBhcnRCb2R5ID0+XG4gIGJvZHkgJiYgdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnICYmIGJvZHkuYm9keSAmJiBib2R5W1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdNdWx0aXBhcnRCb2R5JztcblxuLyoqXG4gKiBSZXR1cm5zIGEgbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0IGlmIGFueSBwYXJ0IG9mIHRoZSBnaXZlbiByZXF1ZXN0IGJvZHkgY29udGFpbnMgYSBGaWxlIC8gQmxvYiB2YWx1ZS5cbiAqIE90aGVyd2lzZSByZXR1cm5zIHRoZSByZXF1ZXN0IGFzIGlzLlxuICovXG5leHBvcnQgY29uc3QgbWF5YmVNdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMgPSBhc3luYyA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgb3B0czogUmVxdWVzdE9wdGlvbnM8VD4sXG4pOiBQcm9taXNlPFJlcXVlc3RPcHRpb25zPFQgfCBNdWx0aXBhcnRCb2R5Pj4gPT4ge1xuICBpZiAoIWhhc1VwbG9hZGFibGVWYWx1ZShvcHRzLmJvZHkpKSByZXR1cm4gb3B0cztcblxuICBjb25zdCBmb3JtID0gYXdhaXQgY3JlYXRlRm9ybShvcHRzLmJvZHkpO1xuICByZXR1cm4gZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMoZm9ybSwgb3B0cyk7XG59O1xuXG5leHBvcnQgY29uc3QgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zID0gYXN5bmMgPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIG9wdHM6IFJlcXVlc3RPcHRpb25zPFQ+LFxuKTogUHJvbWlzZTxSZXF1ZXN0T3B0aW9uczxUIHwgTXVsdGlwYXJ0Qm9keT4+ID0+IHtcbiAgY29uc3QgZm9ybSA9IGF3YWl0IGNyZWF0ZUZvcm0ob3B0cy5ib2R5KTtcbiAgcmV0dXJuIGdldE11bHRpcGFydFJlcXVlc3RPcHRpb25zKGZvcm0sIG9wdHMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUZvcm0gPSBhc3luYyA8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pihib2R5OiBUIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxGb3JtRGF0YT4gPT4ge1xuICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5lbnRyaWVzKGJvZHkgfHwge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBhZGRGb3JtVmFsdWUoZm9ybSwga2V5LCB2YWx1ZSkpKTtcbiAgcmV0dXJuIGZvcm07XG59O1xuXG5jb25zdCBoYXNVcGxvYWRhYmxlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgaWYgKGlzVXBsb2FkYWJsZSh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5zb21lKGhhc1VwbG9hZGFibGVWYWx1ZSk7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgICBpZiAoaGFzVXBsb2FkYWJsZVZhbHVlKCh2YWx1ZSBhcyBhbnkpW2tdKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGFkZEZvcm1WYWx1ZSA9IGFzeW5jIChmb3JtOiBGb3JtRGF0YSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBSZWNlaXZlZCBudWxsIGZvciBcIiR7a2V5fVwiOyB0byBwYXNzIG51bGwgaW4gRm9ybURhdGEsIHlvdSBtdXN0IHVzZSB0aGUgc3RyaW5nICdudWxsJ2AsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRPRE86IG1ha2UgbmVzdGVkIGZvcm1hdHMgY29uZmlndXJhYmxlXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICBmb3JtLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpO1xuICB9IGVsc2UgaWYgKGlzVXBsb2FkYWJsZSh2YWx1ZSkpIHtcbiAgICBjb25zdCBmaWxlID0gYXdhaXQgdG9GaWxlKHZhbHVlKTtcbiAgICBmb3JtLmFwcGVuZChrZXksIGZpbGUgYXMgRmlsZSk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh2YWx1ZS5tYXAoKGVudHJ5KSA9PiBhZGRGb3JtVmFsdWUoZm9ybSwga2V5ICsgJ1tdJywgZW50cnkpKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgT2JqZWN0LmVudHJpZXModmFsdWUpLm1hcCgoW25hbWUsIHByb3BdKSA9PiBhZGRGb3JtVmFsdWUoZm9ybSwgYCR7a2V5fVske25hbWV9XWAsIHByb3ApKSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgSW52YWxpZCB2YWx1ZSBnaXZlbiB0byBmb3JtLCBleHBlY3RlZCBhIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvYmplY3QsIEFycmF5LCBGaWxlIG9yIEJsb2IgYnV0IGdvdCAke3ZhbHVlfSBpbnN0ZWFkYCxcbiAgICApO1xuICB9XG59O1xuIiwgImltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSAnLi9saWIvc3RyZWFtaW5nJztcbmltcG9ydCB7XG4gIEdyb3FFcnJvcixcbiAgQVBJRXJyb3IsXG4gIEFQSUNvbm5lY3Rpb25FcnJvcixcbiAgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcixcbiAgQVBJVXNlckFib3J0RXJyb3IsXG59IGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IHtcbiAga2luZCBhcyBzaGltc0tpbmQsXG4gIHR5cGUgUmVhZGFibGUsXG4gIGdldERlZmF1bHRBZ2VudCxcbiAgdHlwZSBBZ2VudCxcbiAgZmV0Y2gsXG4gIHR5cGUgUmVxdWVzdEluZm8sXG4gIHR5cGUgUmVxdWVzdEluaXQsXG4gIHR5cGUgUmVzcG9uc2UsXG4gIHR5cGUgSGVhZGVyc0luaXQsXG59IGZyb20gJy4vX3NoaW1zL2luZGV4JztcbmV4cG9ydCB7IHR5cGUgUmVzcG9uc2UgfTtcbmltcG9ydCB7IGlzTXVsdGlwYXJ0Qm9keSB9IGZyb20gJy4vdXBsb2Fkcyc7XG5leHBvcnQge1xuICBtYXliZU11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyxcbiAgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zLFxuICBjcmVhdGVGb3JtLFxuICB0eXBlIFVwbG9hZGFibGUsXG59IGZyb20gJy4vdXBsb2Fkcyc7XG5cbmV4cG9ydCB0eXBlIEZldGNoID0gKHVybDogUmVxdWVzdEluZm8sIGluaXQ/OiBSZXF1ZXN0SW5pdCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbnR5cGUgUHJvbWlzZU9yVmFsdWU8VD4gPSBUIHwgUHJvbWlzZTxUPjtcblxudHlwZSBBUElSZXNwb25zZVByb3BzID0ge1xuICByZXNwb25zZTogUmVzcG9uc2U7XG4gIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnM7XG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRQYXJzZVJlc3BvbnNlPFQ+KHByb3BzOiBBUElSZXNwb25zZVByb3BzKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgcmVzcG9uc2UgfSA9IHByb3BzO1xuICBpZiAocHJvcHMub3B0aW9ucy5zdHJlYW0pIHtcbiAgICBkZWJ1ZygncmVzcG9uc2UnLCByZXNwb25zZS5zdGF0dXMsIHJlc3BvbnNlLnVybCwgcmVzcG9uc2UuaGVhZGVycywgcmVzcG9uc2UuYm9keSk7XG5cbiAgICAvLyBOb3RlOiB0aGVyZSBpcyBhbiBpbnZhcmlhbnQgaGVyZSB0aGF0IGlzbid0IHJlcHJlc2VudGVkIGluIHRoZSB0eXBlIHN5c3RlbVxuICAgIC8vIHRoYXQgaWYgeW91IHNldCBgc3RyZWFtOiB0cnVlYCB0aGUgcmVzcG9uc2UgdHlwZSBtdXN0IGFsc28gYmUgYFN0cmVhbTxUPmBcblxuICAgIGlmIChwcm9wcy5vcHRpb25zLl9fc3RyZWFtQ2xhc3MpIHtcbiAgICAgIHJldHVybiBwcm9wcy5vcHRpb25zLl9fc3RyZWFtQ2xhc3MuZnJvbVNTRVJlc3BvbnNlKHJlc3BvbnNlLCBwcm9wcy5jb250cm9sbGVyKSBhcyBhbnk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmVhbS5mcm9tU1NFUmVzcG9uc2UocmVzcG9uc2UsIHByb3BzLmNvbnRyb2xsZXIpIGFzIGFueTtcbiAgfVxuXG4gIC8vIGZldGNoIHJlZnVzZXMgdG8gcmVhZCB0aGUgYm9keSB3aGVuIHRoZSBzdGF0dXMgY29kZSBpcyAyMDQuXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xuICAgIHJldHVybiBudWxsIGFzIFQ7XG4gIH1cblxuICBpZiAocHJvcHMub3B0aW9ucy5fX2JpbmFyeVJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlIGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICBjb25zdCBpc0pTT04gPVxuICAgIGNvbnRlbnRUeXBlPy5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpIHx8IGNvbnRlbnRUeXBlPy5pbmNsdWRlcygnYXBwbGljYXRpb24vdm5kLmFwaStqc29uJyk7XG4gIGlmIChpc0pTT04pIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgZGVidWcoJ3Jlc3BvbnNlJywgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS51cmwsIHJlc3BvbnNlLmhlYWRlcnMsIGpzb24pO1xuXG4gICAgcmV0dXJuIGpzb24gYXMgVDtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIGRlYnVnKCdyZXNwb25zZScsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UudXJsLCByZXNwb25zZS5oZWFkZXJzLCB0ZXh0KTtcblxuICAvLyBUT0RPIGhhbmRsZSBibG9iLCBhcnJheWJ1ZmZlciwgb3RoZXIgY29udGVudCB0eXBlcywgZXRjLlxuICByZXR1cm4gdGV4dCBhcyB1bmtub3duIGFzIFQ7XG59XG5cbi8qKlxuICogQSBzdWJjbGFzcyBvZiBgUHJvbWlzZWAgcHJvdmlkaW5nIGFkZGl0aW9uYWwgaGVscGVyIG1ldGhvZHNcbiAqIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBTREsuXG4gKi9cbmV4cG9ydCBjbGFzcyBBUElQcm9taXNlPFQ+IGV4dGVuZHMgUHJvbWlzZTxUPiB7XG4gIHByaXZhdGUgcGFyc2VkUHJvbWlzZTogUHJvbWlzZTxUPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlc3BvbnNlUHJvbWlzZTogUHJvbWlzZTxBUElSZXNwb25zZVByb3BzPixcbiAgICBwcml2YXRlIHBhcnNlUmVzcG9uc2U6IChwcm9wczogQVBJUmVzcG9uc2VQcm9wcykgPT4gUHJvbWlzZU9yVmFsdWU8VD4gPSBkZWZhdWx0UGFyc2VSZXNwb25zZSxcbiAgKSB7XG4gICAgc3VwZXIoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIHRoaXMgaXMgbWF5YmUgYSBiaXQgd2VpcmQgYnV0IHRoaXMgaGFzIHRvIGJlIGEgbm8tb3AgdG8gbm90IGltcGxpY2l0bHlcbiAgICAgIC8vIHBhcnNlIHRoZSByZXNwb25zZSBib2R5OyBpbnN0ZWFkIC50aGVuLCAuY2F0Y2gsIC5maW5hbGx5IGFyZSBvdmVycmlkZGVuXG4gICAgICAvLyB0byBwYXJzZSB0aGUgcmVzcG9uc2VcbiAgICAgIHJlc29sdmUobnVsbCBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgX3RoZW5VbndyYXA8VT4odHJhbnNmb3JtOiAoZGF0YTogVCkgPT4gVSk6IEFQSVByb21pc2U8VT4ge1xuICAgIHJldHVybiBuZXcgQVBJUHJvbWlzZSh0aGlzLnJlc3BvbnNlUHJvbWlzZSwgYXN5bmMgKHByb3BzKSA9PiB0cmFuc2Zvcm0oYXdhaXQgdGhpcy5wYXJzZVJlc3BvbnNlKHByb3BzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJhdyBgUmVzcG9uc2VgIGluc3RhbmNlIGluc3RlYWQgb2YgcGFyc2luZyB0aGUgcmVzcG9uc2VcbiAgICogZGF0YS5cbiAgICpcbiAgICogSWYgeW91IHdhbnQgdG8gcGFyc2UgdGhlIHJlc3BvbnNlIGJvZHkgYnV0IHN0aWxsIGdldCB0aGUgYFJlc3BvbnNlYFxuICAgKiBpbnN0YW5jZSwgeW91IGNhbiB1c2Uge0BsaW5rIHdpdGhSZXNwb25zZSgpfS5cbiAgICpcbiAgICogXHVEODNEXHVEQzRCIEdldHRpbmcgdGhlIHdyb25nIFR5cGVTY3JpcHQgdHlwZSBmb3IgYFJlc3BvbnNlYD9cbiAgICogVHJ5IHNldHRpbmcgYFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIk5vZGVOZXh0XCJgIGlmIHlvdSBjYW4sXG4gICAqIG9yIGFkZCBvbmUgb2YgdGhlc2UgaW1wb3J0cyBiZWZvcmUgeW91ciBmaXJzdCBgaW1wb3J0IFx1MjAyNiBmcm9tICdncm9xLXNkaydgOlxuICAgKiAtIGBpbXBvcnQgJ2dyb3Etc2RrL3NoaW1zL25vZGUnYCAoaWYgeW91J3JlIHJ1bm5pbmcgb24gTm9kZSlcbiAgICogLSBgaW1wb3J0ICdncm9xLXNkay9zaGltcy93ZWInYCAob3RoZXJ3aXNlKVxuICAgKi9cbiAgYXNSZXNwb25zZSgpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VQcm9taXNlLnRoZW4oKHApID0+IHAucmVzcG9uc2UpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYXJzZWQgcmVzcG9uc2UgZGF0YSBhbmQgdGhlIHJhdyBgUmVzcG9uc2VgIGluc3RhbmNlLlxuICAgKlxuICAgKiBJZiB5b3UganVzdCB3YW50IHRvIGdldCB0aGUgcmF3IGBSZXNwb25zZWAgaW5zdGFuY2Ugd2l0aG91dCBwYXJzaW5nIGl0LFxuICAgKiB5b3UgY2FuIHVzZSB7QGxpbmsgYXNSZXNwb25zZSgpfS5cbiAgICpcbiAgICpcbiAgICogXHVEODNEXHVEQzRCIEdldHRpbmcgdGhlIHdyb25nIFR5cGVTY3JpcHQgdHlwZSBmb3IgYFJlc3BvbnNlYD9cbiAgICogVHJ5IHNldHRpbmcgYFwibW9kdWxlUmVzb2x1dGlvblwiOiBcIk5vZGVOZXh0XCJgIGlmIHlvdSBjYW4sXG4gICAqIG9yIGFkZCBvbmUgb2YgdGhlc2UgaW1wb3J0cyBiZWZvcmUgeW91ciBmaXJzdCBgaW1wb3J0IFx1MjAyNiBmcm9tICdncm9xLXNkaydgOlxuICAgKiAtIGBpbXBvcnQgJ2dyb3Etc2RrL3NoaW1zL25vZGUnYCAoaWYgeW91J3JlIHJ1bm5pbmcgb24gTm9kZSlcbiAgICogLSBgaW1wb3J0ICdncm9xLXNkay9zaGltcy93ZWInYCAob3RoZXJ3aXNlKVxuICAgKi9cbiAgYXN5bmMgd2l0aFJlc3BvbnNlKCk6IFByb21pc2U8eyBkYXRhOiBUOyByZXNwb25zZTogUmVzcG9uc2UgfT4ge1xuICAgIGNvbnN0IFtkYXRhLCByZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5wYXJzZSgpLCB0aGlzLmFzUmVzcG9uc2UoKV0pO1xuICAgIHJldHVybiB7IGRhdGEsIHJlc3BvbnNlIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlKCk6IFByb21pc2U8VD4ge1xuICAgIGlmICghdGhpcy5wYXJzZWRQcm9taXNlKSB7XG4gICAgICB0aGlzLnBhcnNlZFByb21pc2UgPSB0aGlzLnJlc3BvbnNlUHJvbWlzZS50aGVuKHRoaXMucGFyc2VSZXNwb25zZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlZFByb21pc2U7XG4gIH1cblxuICBvdmVycmlkZSB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCB1bmRlZmluZWQgfCBudWxsLFxuICApOiBQcm9taXNlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSgpLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2F0Y2g8VFJlc3VsdCA9IG5ldmVyPihcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdCB8IFByb21pc2VMaWtlPFRSZXN1bHQ+KSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICk6IFByb21pc2U8VCB8IFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZSgpLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmluYWxseShvbmZpbmFsbHk/OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQgfCBudWxsKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2UoKS5maW5hbGx5KG9uZmluYWxseSk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFQSUNsaWVudCB7XG4gIGJhc2VVUkw6IHN0cmluZztcbiAgbWF4UmV0cmllczogbnVtYmVyO1xuICB0aW1lb3V0OiBudW1iZXI7XG4gIGh0dHBBZ2VudDogQWdlbnQgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBmZXRjaDogRmV0Y2g7XG4gIHByb3RlY3RlZCBpZGVtcG90ZW5jeUhlYWRlcj86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgYmFzZVVSTCxcbiAgICBtYXhSZXRyaWVzID0gMixcbiAgICB0aW1lb3V0ID0gNjAwMDAsIC8vIDEgbWludXRlXG4gICAgaHR0cEFnZW50LFxuICAgIGZldGNoOiBvdmVycmlkZW5GZXRjaCxcbiAgfToge1xuICAgIGJhc2VVUkw6IHN0cmluZztcbiAgICBtYXhSZXRyaWVzPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIHRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBodHRwQWdlbnQ6IEFnZW50IHwgdW5kZWZpbmVkO1xuICAgIGZldGNoOiBGZXRjaCB8IHVuZGVmaW5lZDtcbiAgfSkge1xuICAgIHRoaXMuYmFzZVVSTCA9IGJhc2VVUkw7XG4gICAgdGhpcy5tYXhSZXRyaWVzID0gdmFsaWRhdGVQb3NpdGl2ZUludGVnZXIoJ21heFJldHJpZXMnLCBtYXhSZXRyaWVzKTtcbiAgICB0aGlzLnRpbWVvdXQgPSB2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcigndGltZW91dCcsIHRpbWVvdXQpO1xuICAgIHRoaXMuaHR0cEFnZW50ID0gaHR0cEFnZW50O1xuXG4gICAgdGhpcy5mZXRjaCA9IG92ZXJyaWRlbkZldGNoID8/IGZldGNoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGF1dGhIZWFkZXJzKG9wdHM6IEZpbmFsUmVxdWVzdE9wdGlvbnMpOiBIZWFkZXJzIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhpcyB0byBhZGQgeW91ciBvd24gZGVmYXVsdCBoZWFkZXJzLCBmb3IgZXhhbXBsZTpcbiAgICpcbiAgICogIHtcbiAgICogICAgLi4uc3VwZXIuZGVmYXVsdEhlYWRlcnMoKSxcbiAgICogICAgQXV0aG9yaXphdGlvbjogJ0JlYXJlciAxMjMnLFxuICAgKiAgfVxuICAgKi9cbiAgcHJvdGVjdGVkIGRlZmF1bHRIZWFkZXJzKG9wdHM6IEZpbmFsUmVxdWVzdE9wdGlvbnMpOiBIZWFkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ1VzZXItQWdlbnQnOiB0aGlzLmdldFVzZXJBZ2VudCgpLFxuICAgICAgLi4uZ2V0UGxhdGZvcm1IZWFkZXJzKCksXG4gICAgICAuLi50aGlzLmF1dGhIZWFkZXJzKG9wdHMpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZGVmYXVsdFF1ZXJ5KCk6IERlZmF1bHRRdWVyeSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhpcyB0byBhZGQgeW91ciBvd24gaGVhZGVycyB2YWxpZGF0aW9uOlxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlSGVhZGVycyhoZWFkZXJzOiBIZWFkZXJzLCBjdXN0b21IZWFkZXJzOiBIZWFkZXJzKSB7fVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0SWRlbXBvdGVuY3lLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHN0YWlubGVzcy1ub2RlLXJldHJ5LSR7dXVpZDQoKX1gO1xuICB9XG5cbiAgZ2V0PFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgnZ2V0JywgcGF0aCwgb3B0cyk7XG4gIH1cblxuICBwb3N0PFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgncG9zdCcsIHBhdGgsIG9wdHMpO1xuICB9XG5cbiAgcGF0Y2g8UmVxLCBSc3A+KHBhdGg6IHN0cmluZywgb3B0cz86IFByb21pc2VPclZhbHVlPFJlcXVlc3RPcHRpb25zPFJlcT4+KTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RSZXF1ZXN0KCdwYXRjaCcsIHBhdGgsIG9wdHMpO1xuICB9XG5cbiAgcHV0PFJlcSwgUnNwPihwYXRoOiBzdHJpbmcsIG9wdHM/OiBQcm9taXNlT3JWYWx1ZTxSZXF1ZXN0T3B0aW9uczxSZXE+Pik6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMubWV0aG9kUmVxdWVzdCgncHV0JywgcGF0aCwgb3B0cyk7XG4gIH1cblxuICBkZWxldGU8UmVxLCBSc3A+KHBhdGg6IHN0cmluZywgb3B0cz86IFByb21pc2VPclZhbHVlPFJlcXVlc3RPcHRpb25zPFJlcT4+KTogQVBJUHJvbWlzZTxSc3A+IHtcbiAgICByZXR1cm4gdGhpcy5tZXRob2RSZXF1ZXN0KCdkZWxldGUnLCBwYXRoLCBvcHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgbWV0aG9kUmVxdWVzdDxSZXEsIFJzcD4oXG4gICAgbWV0aG9kOiBIVFRQTWV0aG9kLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRzPzogUHJvbWlzZU9yVmFsdWU8UmVxdWVzdE9wdGlvbnM8UmVxPj4sXG4gICk6IEFQSVByb21pc2U8UnNwPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChQcm9taXNlLnJlc29sdmUob3B0cykudGhlbigob3B0cykgPT4gKHsgbWV0aG9kLCBwYXRoLCAuLi5vcHRzIH0pKSk7XG4gIH1cblxuICBnZXRBUElMaXN0PEl0ZW0sIFBhZ2VDbGFzcyBleHRlbmRzIEFic3RyYWN0UGFnZTxJdGVtPiA9IEFic3RyYWN0UGFnZTxJdGVtPj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIFBhZ2U6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFBhZ2VDbGFzcyxcbiAgICBvcHRzPzogUmVxdWVzdE9wdGlvbnM8YW55PixcbiAgKTogUGFnZVByb21pc2U8UGFnZUNsYXNzLCBJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEFQSUxpc3QoUGFnZSwgeyBtZXRob2Q6ICdnZXQnLCBwYXRoLCAuLi5vcHRzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZW50TGVuZ3RoKGJvZHk6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHksICd1dGY4JykudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2Rlci5lbmNvZGUoYm9keSk7XG4gICAgICAgIHJldHVybiBlbmNvZGVkLmxlbmd0aC50b1N0cmluZygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYnVpbGRSZXF1ZXN0PFJlcT4ob3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9uczxSZXE+KTogeyByZXE6IFJlcXVlc3RJbml0OyB1cmw6IHN0cmluZzsgdGltZW91dDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXRoLCBxdWVyeSwgaGVhZGVyczogaGVhZGVycyA9IHt9IH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYm9keSA9XG4gICAgICBpc011bHRpcGFydEJvZHkob3B0aW9ucy5ib2R5KSA/IG9wdGlvbnMuYm9keS5ib2R5XG4gICAgICA6IG9wdGlvbnMuYm9keSA/IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuYm9keSwgbnVsbCwgMilcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gdGhpcy5jYWxjdWxhdGVDb250ZW50TGVuZ3RoKGJvZHkpO1xuXG4gICAgY29uc3QgdXJsID0gdGhpcy5idWlsZFVSTChwYXRoISwgcXVlcnkpO1xuICAgIGlmICgndGltZW91dCcgaW4gb3B0aW9ucykgdmFsaWRhdGVQb3NpdGl2ZUludGVnZXIoJ3RpbWVvdXQnLCBvcHRpb25zLnRpbWVvdXQpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy50aW1lb3V0O1xuICAgIGNvbnN0IGh0dHBBZ2VudCA9IG9wdGlvbnMuaHR0cEFnZW50ID8/IHRoaXMuaHR0cEFnZW50ID8/IGdldERlZmF1bHRBZ2VudCh1cmwpO1xuICAgIGNvbnN0IG1pbkFnZW50VGltZW91dCA9IHRpbWVvdXQgKyAxMDAwO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiAoaHR0cEFnZW50IGFzIGFueSk/Lm9wdGlvbnM/LnRpbWVvdXQgPT09ICdudW1iZXInICYmXG4gICAgICBtaW5BZ2VudFRpbWVvdXQgPiAoKGh0dHBBZ2VudCBhcyBhbnkpLm9wdGlvbnMudGltZW91dCA/PyAwKVxuICAgICkge1xuICAgICAgLy8gQWxsb3cgYW55IGdpdmVuIHJlcXVlc3QgdG8gYnVtcCBvdXIgYWdlbnQgYWN0aXZlIHNvY2tldCB0aW1lb3V0LlxuICAgICAgLy8gVGhpcyBtYXkgc2VlbSBzdHJhbmdlLCBidXQgbGVha2luZyBhY3RpdmUgc29ja2V0cyBzaG91bGQgYmUgcmFyZSBhbmQgbm90IHBhcnRpY3VsYXJseSBwcm9ibGVtYXRpYyxcbiAgICAgIC8vIGFuZCB3aXRob3V0IG11dGF0aW5nIGFnZW50IHdlIHdvdWxkIG5lZWQgdG8gY3JlYXRlIG1vcmUgb2YgdGhlbS5cbiAgICAgIC8vIFRoaXMgdHJhZGVvZmYgb3B0aW1pemVzIGZvciBwZXJmb3JtYW5jZS5cbiAgICAgIChodHRwQWdlbnQgYXMgYW55KS5vcHRpb25zLnRpbWVvdXQgPSBtaW5BZ2VudFRpbWVvdXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaWRlbXBvdGVuY3lIZWFkZXIgJiYgbWV0aG9kICE9PSAnZ2V0Jykge1xuICAgICAgaWYgKCFvcHRpb25zLmlkZW1wb3RlbmN5S2V5KSBvcHRpb25zLmlkZW1wb3RlbmN5S2V5ID0gdGhpcy5kZWZhdWx0SWRlbXBvdGVuY3lLZXkoKTtcbiAgICAgIGhlYWRlcnNbdGhpcy5pZGVtcG90ZW5jeUhlYWRlcl0gPSBvcHRpb25zLmlkZW1wb3RlbmN5S2V5O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcUhlYWRlcnMgPSB0aGlzLmJ1aWxkSGVhZGVycyh7IG9wdGlvbnMsIGhlYWRlcnMsIGNvbnRlbnRMZW5ndGggfSk7XG5cbiAgICBjb25zdCByZXE6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgbWV0aG9kLFxuICAgICAgLi4uKGJvZHkgJiYgeyBib2R5OiBib2R5IGFzIGFueSB9KSxcbiAgICAgIGhlYWRlcnM6IHJlcUhlYWRlcnMsXG4gICAgICAuLi4oaHR0cEFnZW50ICYmIHsgYWdlbnQ6IGh0dHBBZ2VudCB9KSxcbiAgICAgIC8vIEB0cy1pZ25vcmUgbm9kZS1mZXRjaCB1c2VzIGEgY3VzdG9tIEFib3J0U2lnbmFsIHR5cGUgdGhhdCBpc1xuICAgICAgLy8gbm90IGNvbXBhdGlibGUgd2l0aCBzdGFuZGFyZCB3ZWIgdHlwZXNcbiAgICAgIHNpZ25hbDogb3B0aW9ucy5zaWduYWwgPz8gbnVsbCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsgcmVxLCB1cmwsIHRpbWVvdXQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRIZWFkZXJzKHtcbiAgICBvcHRpb25zLFxuICAgIGhlYWRlcnMsXG4gICAgY29udGVudExlbmd0aCxcbiAgfToge1xuICAgIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnM7XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD47XG4gICAgY29udGVudExlbmd0aDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgfSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHJlcUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBpZiAoY29udGVudExlbmd0aCkge1xuICAgICAgcmVxSGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IGNvbnRlbnRMZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzKG9wdGlvbnMpO1xuICAgIGFwcGx5SGVhZGVyc011dChyZXFIZWFkZXJzLCBkZWZhdWx0SGVhZGVycyk7XG4gICAgYXBwbHlIZWFkZXJzTXV0KHJlcUhlYWRlcnMsIGhlYWRlcnMpO1xuXG4gICAgLy8gbGV0IGJ1aWx0aW4gZmV0Y2ggc2V0IHRoZSBDb250ZW50LVR5cGUgZm9yIG11bHRpcGFydCBib2RpZXNcbiAgICBpZiAoaXNNdWx0aXBhcnRCb2R5KG9wdGlvbnMuYm9keSkgJiYgc2hpbXNLaW5kICE9PSAnbm9kZScpIHtcbiAgICAgIGRlbGV0ZSByZXFIZWFkZXJzWydjb250ZW50LXR5cGUnXTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlSGVhZGVycyhyZXFIZWFkZXJzLCBoZWFkZXJzKTtcblxuICAgIHJldHVybiByZXFIZWFkZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYXMgYSBjYWxsYmFjayBmb3IgbXV0YXRpbmcgdGhlIGdpdmVuIGBGaW5hbFJlcXVlc3RPcHRpb25zYCBvYmplY3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZU9wdGlvbnMob3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge31cblxuICAvKipcbiAgICogVXNlZCBhcyBhIGNhbGxiYWNrIGZvciBtdXRhdGluZyB0aGUgZ2l2ZW4gYFJlcXVlc3RJbml0YCBvYmplY3QuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byBhZGQgY2VydGFpbiBoZWFkZXJzIGJhc2VkIG9mZiBvZlxuICAgKiB0aGUgcmVxdWVzdCBwcm9wZXJ0aWVzLCBlLmcuIGBtZXRob2RgIG9yIGB1cmxgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHByZXBhcmVSZXF1ZXN0KFxuICAgIHJlcXVlc3Q6IFJlcXVlc3RJbml0LFxuICAgIHsgdXJsLCBvcHRpb25zIH06IHsgdXJsOiBzdHJpbmc7IG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnMgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIHByb3RlY3RlZCBwYXJzZUhlYWRlcnMoaGVhZGVyczogSGVhZGVyc0luaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIChcbiAgICAgICFoZWFkZXJzID8ge31cbiAgICAgIDogU3ltYm9sLml0ZXJhdG9yIGluIGhlYWRlcnMgP1xuICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoQXJyYXkuZnJvbShoZWFkZXJzIGFzIEl0ZXJhYmxlPHN0cmluZ1tdPikubWFwKChoZWFkZXIpID0+IFsuLi5oZWFkZXJdKSlcbiAgICAgIDogeyAuLi5oZWFkZXJzIH1cbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1ha2VTdGF0dXNFcnJvcihcbiAgICBzdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBlcnJvcjogT2JqZWN0IHwgdW5kZWZpbmVkLFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBoZWFkZXJzOiBIZWFkZXJzIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICByZXR1cm4gQVBJRXJyb3IuZ2VuZXJhdGUoc3RhdHVzLCBlcnJvciwgbWVzc2FnZSwgaGVhZGVycyk7XG4gIH1cblxuICByZXF1ZXN0PFJlcSwgUnNwPihcbiAgICBvcHRpb25zOiBQcm9taXNlT3JWYWx1ZTxGaW5hbFJlcXVlc3RPcHRpb25zPFJlcT4+LFxuICAgIHJlbWFpbmluZ1JldHJpZXM6IG51bWJlciB8IG51bGwgPSBudWxsLFxuICApOiBBUElQcm9taXNlPFJzcD4ge1xuICAgIHJldHVybiBuZXcgQVBJUHJvbWlzZSh0aGlzLm1ha2VSZXF1ZXN0KG9wdGlvbnMsIHJlbWFpbmluZ1JldHJpZXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWFrZVJlcXVlc3Q8UmVxPihcbiAgICBvcHRpb25zSW5wdXQ6IFByb21pc2VPclZhbHVlPEZpbmFsUmVxdWVzdE9wdGlvbnM8UmVxPj4sXG4gICAgcmV0cmllc1JlbWFpbmluZzogbnVtYmVyIHwgbnVsbCxcbiAgKTogUHJvbWlzZTxBUElSZXNwb25zZVByb3BzPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IG9wdGlvbnNJbnB1dDtcbiAgICBpZiAocmV0cmllc1JlbWFpbmluZyA9PSBudWxsKSB7XG4gICAgICByZXRyaWVzUmVtYWluaW5nID0gb3B0aW9ucy5tYXhSZXRyaWVzID8/IHRoaXMubWF4UmV0cmllcztcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnByZXBhcmVPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgeyByZXEsIHVybCwgdGltZW91dCB9ID0gdGhpcy5idWlsZFJlcXVlc3Qob3B0aW9ucyk7XG5cbiAgICBhd2FpdCB0aGlzLnByZXBhcmVSZXF1ZXN0KHJlcSwgeyB1cmwsIG9wdGlvbnMgfSk7XG5cbiAgICBkZWJ1ZygncmVxdWVzdCcsIHVybCwgb3B0aW9ucywgcmVxLmhlYWRlcnMpO1xuXG4gICAgaWYgKG9wdGlvbnMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJVXNlckFib3J0RXJyb3IoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaFdpdGhUaW1lb3V0KHVybCwgcmVxLCB0aW1lb3V0LCBjb250cm9sbGVyKS5jYXRjaChjYXN0VG9FcnJvcik7XG5cbiAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKG9wdGlvbnMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBBUElVc2VyQWJvcnRFcnJvcigpO1xuICAgICAgfVxuICAgICAgaWYgKHJldHJpZXNSZW1haW5pbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlSZXF1ZXN0KG9wdGlvbnMsIHJldHJpZXNSZW1haW5pbmcpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICB0aHJvdyBuZXcgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEFQSUNvbm5lY3Rpb25FcnJvcih7IGNhdXNlOiByZXNwb25zZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBjcmVhdGVSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBpZiAocmV0cmllc1JlbWFpbmluZyAmJiB0aGlzLnNob3VsZFJldHJ5KHJlc3BvbnNlKSkge1xuICAgICAgICBjb25zdCByZXRyeU1lc3NhZ2UgPSBgcmV0cnlpbmcsICR7cmV0cmllc1JlbWFpbmluZ30gYXR0ZW1wdHMgcmVtYWluaW5nYDtcbiAgICAgICAgZGVidWcoYHJlc3BvbnNlIChlcnJvcjsgJHtyZXRyeU1lc3NhZ2V9KWAsIHJlc3BvbnNlLnN0YXR1cywgdXJsLCByZXNwb25zZUhlYWRlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXRyeVJlcXVlc3Qob3B0aW9ucywgcmV0cmllc1JlbWFpbmluZywgcmVzcG9uc2VIZWFkZXJzKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKS5jYXRjaCgoZSkgPT4gY2FzdFRvRXJyb3IoZSkubWVzc2FnZSk7XG4gICAgICBjb25zdCBlcnJKU09OID0gc2FmZUpTT04oZXJyVGV4dCk7XG4gICAgICBjb25zdCBlcnJNZXNzYWdlID0gZXJySlNPTiA/IHVuZGVmaW5lZCA6IGVyclRleHQ7XG4gICAgICBjb25zdCByZXRyeU1lc3NhZ2UgPSByZXRyaWVzUmVtYWluaW5nID8gYChlcnJvcjsgbm8gbW9yZSByZXRyaWVzIGxlZnQpYCA6IGAoZXJyb3I7IG5vdCByZXRyeWFibGUpYDtcblxuICAgICAgZGVidWcoYHJlc3BvbnNlIChlcnJvcjsgJHtyZXRyeU1lc3NhZ2V9KWAsIHJlc3BvbnNlLnN0YXR1cywgdXJsLCByZXNwb25zZUhlYWRlcnMsIGVyck1lc3NhZ2UpO1xuXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLm1ha2VTdGF0dXNFcnJvcihyZXNwb25zZS5zdGF0dXMsIGVyckpTT04sIGVyck1lc3NhZ2UsIHJlc3BvbnNlSGVhZGVycyk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcmVzcG9uc2UsIG9wdGlvbnMsIGNvbnRyb2xsZXIgfTtcbiAgfVxuXG4gIHJlcXVlc3RBUElMaXN0PEl0ZW0gPSB1bmtub3duLCBQYWdlQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdFBhZ2U8SXRlbT4gPSBBYnN0cmFjdFBhZ2U8SXRlbT4+KFxuICAgIFBhZ2U6IG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBBYnN0cmFjdFBhZ2U+KSA9PiBQYWdlQ2xhc3MsXG4gICAgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUGFnZVByb21pc2U8UGFnZUNsYXNzLCBJdGVtPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMubWFrZVJlcXVlc3Qob3B0aW9ucywgbnVsbCk7XG4gICAgcmV0dXJuIG5ldyBQYWdlUHJvbWlzZTxQYWdlQ2xhc3MsIEl0ZW0+KHRoaXMsIHJlcXVlc3QsIFBhZ2UpO1xuICB9XG5cbiAgYnVpbGRVUkw8UmVxPihwYXRoOiBzdHJpbmcsIHF1ZXJ5OiBSZXEgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgaXNBYnNvbHV0ZVVSTChwYXRoKSA/XG4gICAgICAgIG5ldyBVUkwocGF0aClcbiAgICAgIDogbmV3IFVSTCh0aGlzLmJhc2VVUkwgKyAodGhpcy5iYXNlVVJMLmVuZHNXaXRoKCcvJykgJiYgcGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoLnNsaWNlKDEpIDogcGF0aCkpO1xuXG4gICAgY29uc3QgZGVmYXVsdFF1ZXJ5ID0gdGhpcy5kZWZhdWx0UXVlcnkoKTtcbiAgICBpZiAoIWlzRW1wdHlPYmooZGVmYXVsdFF1ZXJ5KSkge1xuICAgICAgcXVlcnkgPSB7IC4uLmRlZmF1bHRRdWVyeSwgLi4ucXVlcnkgfSBhcyBSZXE7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gJ29iamVjdCcgJiYgcXVlcnkgJiYgIUFycmF5LmlzQXJyYXkocXVlcnkpKSB7XG4gICAgICB1cmwuc2VhcmNoID0gdGhpcy5zdHJpbmdpZnlRdWVyeShxdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0cmluZ2lmeVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHF1ZXJ5KVxuICAgICAgLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgcmV0dXJuIGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEdyb3FFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHN0cmluZ2lmeSB0eXBlICR7dHlwZW9mIHZhbHVlfTsgRXhwZWN0ZWQgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG9yIG51bGwuIElmIHlvdSBuZWVkIHRvIHBhc3MgbmVzdGVkIHF1ZXJ5IHBhcmFtZXRlcnMsIHlvdSBjYW4gbWFudWFsbHkgZW5jb2RlIHRoZW0sIGUuZy4geyBxdWVyeTogeyAnZm9vW2tleTFdJzogdmFsdWUxLCAnZm9vW2tleTJdJzogdmFsdWUyIH0gfSwgYW5kIHBsZWFzZSBvcGVuIGEgR2l0SHViIGlzc3VlIHJlcXVlc3RpbmcgYmV0dGVyIHN1cHBvcnQgZm9yIHlvdXIgdXNlIGNhc2UuYCxcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAuam9pbignJicpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hXaXRoVGltZW91dChcbiAgICB1cmw6IFJlcXVlc3RJbmZvLFxuICAgIGluaXQ6IFJlcXVlc3RJbml0IHwgdW5kZWZpbmVkLFxuICAgIG1zOiBudW1iZXIsXG4gICAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBzaWduYWwsIC4uLm9wdGlvbnMgfSA9IGluaXQgfHwge307XG4gICAgaWYgKHNpZ25hbCkgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcblxuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgbXMpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZ2V0UmVxdWVzdENsaWVudCgpXG4gICAgICAgIC8vIHVzZSB1bmRlZmluZWQgdGhpcyBiaW5kaW5nOyBmZXRjaCBlcnJvcnMgaWYgYm91bmQgdG8gc29tZXRoaW5nIGVsc2UgaW4gYnJvd3Nlci9jbG91ZGZsYXJlXG4gICAgICAgIC5mZXRjaC5jYWxsKHVuZGVmaW5lZCwgdXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgYXMgYW55LCAuLi5vcHRpb25zIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZXF1ZXN0Q2xpZW50KCk6IFJlcXVlc3RDbGllbnQge1xuICAgIHJldHVybiB7IGZldGNoOiB0aGlzLmZldGNoIH07XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJldHJ5KHJlc3BvbnNlOiBSZXNwb25zZSk6IGJvb2xlYW4ge1xuICAgIC8vIE5vdGUgdGhpcyBpcyBub3QgYSBzdGFuZGFyZCBoZWFkZXIuXG4gICAgY29uc3Qgc2hvdWxkUmV0cnlIZWFkZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC1zaG91bGQtcmV0cnknKTtcblxuICAgIC8vIElmIHRoZSBzZXJ2ZXIgZXhwbGljaXRseSBzYXlzIHdoZXRoZXIgb3Igbm90IHRvIHJldHJ5LCBvYmV5LlxuICAgIGlmIChzaG91bGRSZXRyeUhlYWRlciA9PT0gJ3RydWUnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoc2hvdWxkUmV0cnlIZWFkZXIgPT09ICdmYWxzZScpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJldHJ5IG9uIHJlcXVlc3QgdGltZW91dHMuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA4KSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFJldHJ5IG9uIGxvY2sgdGltZW91dHMuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA5KSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFJldHJ5IG9uIHJhdGUgbGltaXRzLlxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQyOSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBSZXRyeSBpbnRlcm5hbCBlcnJvcnMuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSA1MDApIHJldHVybiB0cnVlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXRyeVJlcXVlc3QoXG4gICAgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucyxcbiAgICByZXRyaWVzUmVtYWluaW5nOiBudW1iZXIsXG4gICAgcmVzcG9uc2VIZWFkZXJzPzogSGVhZGVycyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxBUElSZXNwb25zZVByb3BzPiB7XG4gICAgbGV0IHRpbWVvdXRNaWxsaXM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIC8vIE5vdGUgdGhlIGByZXRyeS1hZnRlci1tc2AgaGVhZGVyIG1heSBub3QgYmUgc3RhbmRhcmQsIGJ1dCBpcyBhIGdvb2QgaWRlYSBhbmQgd2UnZCBsaWtlIHByb2FjdGl2ZSBzdXBwb3J0IGZvciBpdC5cbiAgICBjb25zdCByZXRyeUFmdGVyTWlsbGlzSGVhZGVyID0gcmVzcG9uc2VIZWFkZXJzPy5bJ3JldHJ5LWFmdGVyLW1zJ107XG4gICAgaWYgKHJldHJ5QWZ0ZXJNaWxsaXNIZWFkZXIpIHtcbiAgICAgIGNvbnN0IHRpbWVvdXRNcyA9IHBhcnNlRmxvYXQocmV0cnlBZnRlck1pbGxpc0hlYWRlcik7XG4gICAgICBpZiAoIU51bWJlci5pc05hTih0aW1lb3V0TXMpKSB7XG4gICAgICAgIHRpbWVvdXRNaWxsaXMgPSB0aW1lb3V0TXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWJvdXQgdGhlIFJldHJ5LUFmdGVyIGhlYWRlcjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL1JldHJ5LUFmdGVyXG4gICAgY29uc3QgcmV0cnlBZnRlckhlYWRlciA9IHJlc3BvbnNlSGVhZGVycz8uWydyZXRyeS1hZnRlciddO1xuICAgIGlmIChyZXRyeUFmdGVySGVhZGVyICYmICF0aW1lb3V0TWlsbGlzKSB7XG4gICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IHBhcnNlRmxvYXQocmV0cnlBZnRlckhlYWRlcik7XG4gICAgICBpZiAoIU51bWJlci5pc05hTih0aW1lb3V0U2Vjb25kcykpIHtcbiAgICAgICAgdGltZW91dE1pbGxpcyA9IHRpbWVvdXRTZWNvbmRzICogMTAwMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbWVvdXRNaWxsaXMgPSBEYXRlLnBhcnNlKHJldHJ5QWZ0ZXJIZWFkZXIpIC0gRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgQVBJIGFza3MgdXMgdG8gd2FpdCBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUgKGFuZCBpdCdzIGEgcmVhc29uYWJsZSBhbW91bnQpLFxuICAgIC8vIGp1c3QgZG8gd2hhdCBpdCBzYXlzLCBidXQgb3RoZXJ3aXNlIGNhbGN1bGF0ZSBhIGRlZmF1bHRcbiAgICBpZiAoISh0aW1lb3V0TWlsbGlzICYmIDAgPD0gdGltZW91dE1pbGxpcyAmJiB0aW1lb3V0TWlsbGlzIDwgNjAgKiAxMDAwKSkge1xuICAgICAgY29uc3QgbWF4UmV0cmllcyA9IG9wdGlvbnMubWF4UmV0cmllcyA/PyB0aGlzLm1heFJldHJpZXM7XG4gICAgICB0aW1lb3V0TWlsbGlzID0gdGhpcy5jYWxjdWxhdGVEZWZhdWx0UmV0cnlUaW1lb3V0TWlsbGlzKHJldHJpZXNSZW1haW5pbmcsIG1heFJldHJpZXMpO1xuICAgIH1cbiAgICBhd2FpdCBzbGVlcCh0aW1lb3V0TWlsbGlzKTtcblxuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KG9wdGlvbnMsIHJldHJpZXNSZW1haW5pbmcgLSAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRGVmYXVsdFJldHJ5VGltZW91dE1pbGxpcyhyZXRyaWVzUmVtYWluaW5nOiBudW1iZXIsIG1heFJldHJpZXM6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaW5pdGlhbFJldHJ5RGVsYXkgPSAwLjU7XG4gICAgY29uc3QgbWF4UmV0cnlEZWxheSA9IDguMDtcblxuICAgIGNvbnN0IG51bVJldHJpZXMgPSBtYXhSZXRyaWVzIC0gcmV0cmllc1JlbWFpbmluZztcblxuICAgIC8vIEFwcGx5IGV4cG9uZW50aWFsIGJhY2tvZmYsIGJ1dCBub3QgbW9yZSB0aGFuIHRoZSBtYXguXG4gICAgY29uc3Qgc2xlZXBTZWNvbmRzID0gTWF0aC5taW4oaW5pdGlhbFJldHJ5RGVsYXkgKiBNYXRoLnBvdygyLCBudW1SZXRyaWVzKSwgbWF4UmV0cnlEZWxheSk7XG5cbiAgICAvLyBBcHBseSBzb21lIGppdHRlciwgdGFrZSB1cCB0byBhdCBtb3N0IDI1IHBlcmNlbnQgb2YgdGhlIHJldHJ5IHRpbWUuXG4gICAgY29uc3Qgaml0dGVyID0gMSAtIE1hdGgucmFuZG9tKCkgKiAwLjI1O1xuXG4gICAgcmV0dXJuIHNsZWVwU2Vjb25kcyAqIGppdHRlciAqIDEwMDA7XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJBZ2VudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9L0pTICR7VkVSU0lPTn1gO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFBhZ2VJbmZvID0geyB1cmw6IFVSTCB9IHwgeyBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB9O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYWdlPEl0ZW0+IGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxJdGVtPiB7XG4gICNjbGllbnQ6IEFQSUNsaWVudDtcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IEZpbmFsUmVxdWVzdE9wdGlvbnM7XG5cbiAgcHJvdGVjdGVkIHJlc3BvbnNlOiBSZXNwb25zZTtcbiAgcHJvdGVjdGVkIGJvZHk6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBBUElDbGllbnQsIHJlc3BvbnNlOiBSZXNwb25zZSwgYm9keTogdW5rbm93biwgb3B0aW9uczogRmluYWxSZXF1ZXN0T3B0aW9ucykge1xuICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0aGlzLmJvZHkgPSBib2R5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBuZXh0UGFnZUluZm8gaW5zdGVhZFxuICAgKi9cbiAgYWJzdHJhY3QgbmV4dFBhZ2VQYXJhbXMoKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCBudWxsO1xuICBhYnN0cmFjdCBuZXh0UGFnZUluZm8oKTogUGFnZUluZm8gfCBudWxsO1xuXG4gIGFic3RyYWN0IGdldFBhZ2luYXRlZEl0ZW1zKCk6IEl0ZW1bXTtcblxuICBoYXNOZXh0UGFnZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0UGFnaW5hdGVkSXRlbXMoKTtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLm5leHRQYWdlSW5mbygpICE9IG51bGw7XG4gIH1cblxuICBhc3luYyBnZXROZXh0UGFnZSgpOiBQcm9taXNlPHRoaXM+IHtcbiAgICBjb25zdCBuZXh0SW5mbyA9IHRoaXMubmV4dFBhZ2VJbmZvKCk7XG4gICAgaWYgKCFuZXh0SW5mbykge1xuICAgICAgdGhyb3cgbmV3IEdyb3FFcnJvcihcbiAgICAgICAgJ05vIG5leHQgcGFnZSBleHBlY3RlZDsgcGxlYXNlIGNoZWNrIGAuaGFzTmV4dFBhZ2UoKWAgYmVmb3JlIGNhbGxpbmcgYC5nZXROZXh0UGFnZSgpYC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgbmV4dE9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucyB9O1xuICAgIGlmICgncGFyYW1zJyBpbiBuZXh0SW5mbyAmJiB0eXBlb2YgbmV4dE9wdGlvbnMucXVlcnkgPT09ICdvYmplY3QnKSB7XG4gICAgICBuZXh0T3B0aW9ucy5xdWVyeSA9IHsgLi4ubmV4dE9wdGlvbnMucXVlcnksIC4uLm5leHRJbmZvLnBhcmFtcyB9O1xuICAgIH0gZWxzZSBpZiAoJ3VybCcgaW4gbmV4dEluZm8pIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IFsuLi5PYmplY3QuZW50cmllcyhuZXh0T3B0aW9ucy5xdWVyeSB8fCB7fSksIC4uLm5leHRJbmZvLnVybC5zZWFyY2hQYXJhbXMuZW50cmllcygpXTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHBhcmFtcykge1xuICAgICAgICBuZXh0SW5mby51cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlIGFzIGFueSk7XG4gICAgICB9XG4gICAgICBuZXh0T3B0aW9ucy5xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICAgIG5leHRPcHRpb25zLnBhdGggPSBuZXh0SW5mby51cmwudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuI2NsaWVudC5yZXF1ZXN0QVBJTGlzdCh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSwgbmV4dE9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgKml0ZXJQYWdlcygpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBsZXQgcGFnZTogQWJzdHJhY3RQYWdlPEl0ZW0+ID0gdGhpcztcbiAgICB5aWVsZCBwYWdlO1xuICAgIHdoaWxlIChwYWdlLmhhc05leHRQYWdlKCkpIHtcbiAgICAgIHBhZ2UgPSBhd2FpdCBwYWdlLmdldE5leHRQYWdlKCk7XG4gICAgICB5aWVsZCBwYWdlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgcGFnZSBvZiB0aGlzLml0ZXJQYWdlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFnZS5nZXRQYWdpbmF0ZWRJdGVtcygpKSB7XG4gICAgICAgIHlpZWxkIGl0ZW07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhpcyBzdWJjbGFzcyBvZiBQcm9taXNlIHdpbGwgcmVzb2x2ZSB0byBhbiBpbnN0YW50aWF0ZWQgUGFnZSBvbmNlIHRoZSByZXF1ZXN0IGNvbXBsZXRlcy5cbiAqXG4gKiBJdCBhbHNvIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZSB0byBhbGxvdyBhdXRvLXBhZ2luYXRpbmcgaXRlcmF0aW9uIG9uIGFuIHVuYXdhaXRlZCBsaXN0IGNhbGwsIGVnOlxuICpcbiAqICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBjbGllbnQuaXRlbXMubGlzdCgpKSB7XG4gKiAgICAgIGNvbnNvbGUubG9nKGl0ZW0pXG4gKiAgICB9XG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlUHJvbWlzZTxcbiAgICBQYWdlQ2xhc3MgZXh0ZW5kcyBBYnN0cmFjdFBhZ2U8SXRlbT4sXG4gICAgSXRlbSA9IFJldHVyblR5cGU8UGFnZUNsYXNzWydnZXRQYWdpbmF0ZWRJdGVtcyddPltudW1iZXJdLFxuICA+XG4gIGV4dGVuZHMgQVBJUHJvbWlzZTxQYWdlQ2xhc3M+XG4gIGltcGxlbWVudHMgQXN5bmNJdGVyYWJsZTxJdGVtPlxue1xuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnQ6IEFQSUNsaWVudCxcbiAgICByZXF1ZXN0OiBQcm9taXNlPEFQSVJlc3BvbnNlUHJvcHM+LFxuICAgIFBhZ2U6IG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBBYnN0cmFjdFBhZ2U+KSA9PiBQYWdlQ2xhc3MsXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGFzeW5jIChwcm9wcykgPT4gbmV3IFBhZ2UoY2xpZW50LCBwcm9wcy5yZXNwb25zZSwgYXdhaXQgZGVmYXVsdFBhcnNlUmVzcG9uc2UocHJvcHMpLCBwcm9wcy5vcHRpb25zKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IGF1dG8tcGFnaW5hdGluZyBpdGVyYXRpb24gb24gYW4gdW5hd2FpdGVkIGxpc3QgY2FsbCwgZWc6XG4gICAqXG4gICAqICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBjbGllbnQuaXRlbXMubGlzdCgpKSB7XG4gICAqICAgICAgY29uc29sZS5sb2coaXRlbSlcbiAgICogICAgfVxuICAgKi9cbiAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXM7XG4gICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHBhZ2UpIHtcbiAgICAgIHlpZWxkIGl0ZW07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXNwb25zZUhlYWRlcnMgPSAoXG4gIGhlYWRlcnM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTxGZXRjaD4+WydoZWFkZXJzJ10sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm94eShcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBoZWFkZXJzLmVudHJpZXMoKSxcbiAgICApLFxuICAgIHtcbiAgICAgIGdldCh0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbmFtZS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0W2tleS50b0xvd2VyQ2FzZSgpXSB8fCB0YXJnZXRba2V5XTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbn07XG5cbnR5cGUgSFRUUE1ldGhvZCA9ICdnZXQnIHwgJ3Bvc3QnIHwgJ3B1dCcgfCAncGF0Y2gnIHwgJ2RlbGV0ZSc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RDbGllbnQgPSB7IGZldGNoOiBGZXRjaCB9O1xuZXhwb3J0IHR5cGUgSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+O1xuZXhwb3J0IHR5cGUgRGVmYXVsdFF1ZXJ5ID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbmV4cG9ydCB0eXBlIEtleXNFbnVtPFQ+ID0geyBbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPl06IHRydWUgfTtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdE9wdGlvbnM8UmVxID0gdW5rbm93biB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgUmVhZGFibGU+ID0ge1xuICBtZXRob2Q/OiBIVFRQTWV0aG9kO1xuICBwYXRoPzogc3RyaW5nO1xuICBxdWVyeT86IFJlcSB8IHVuZGVmaW5lZDtcbiAgYm9keT86IFJlcSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGhlYWRlcnM/OiBIZWFkZXJzIHwgdW5kZWZpbmVkO1xuXG4gIG1heFJldHJpZXM/OiBudW1iZXI7XG4gIHN0cmVhbT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGh0dHBBZ2VudD86IEFnZW50O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCB8IG51bGw7XG4gIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuXG4gIF9fYmluYXJ5UmVzcG9uc2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBfX3N0cmVhbUNsYXNzPzogdHlwZW9mIFN0cmVhbTtcbn07XG5cbi8vIFRoaXMgaXMgcmVxdWlyZWQgc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gb2JqZWN0IG1hdGNoZXMgdGhlIFJlcXVlc3RPcHRpb25zXG4vLyB0eXBlIGF0IHJ1bnRpbWUuIFdoaWxlIHRoaXMgcmVxdWlyZXMgZHVwbGljYXRpb24sIGl0IGlzIGVuZm9yY2VkIGJ5IHRoZSBUeXBlU2NyaXB0XG4vLyBjb21waWxlciBzdWNoIHRoYXQgYW55IG1pc3NpbmcgLyBleHRyYW5lb3VzIGtleXMgd2lsbCBjYXVzZSBhbiBlcnJvci5cbmNvbnN0IHJlcXVlc3RPcHRpb25zS2V5czogS2V5c0VudW08UmVxdWVzdE9wdGlvbnM+ID0ge1xuICBtZXRob2Q6IHRydWUsXG4gIHBhdGg6IHRydWUsXG4gIHF1ZXJ5OiB0cnVlLFxuICBib2R5OiB0cnVlLFxuICBoZWFkZXJzOiB0cnVlLFxuXG4gIG1heFJldHJpZXM6IHRydWUsXG4gIHN0cmVhbTogdHJ1ZSxcbiAgdGltZW91dDogdHJ1ZSxcbiAgaHR0cEFnZW50OiB0cnVlLFxuICBzaWduYWw6IHRydWUsXG4gIGlkZW1wb3RlbmN5S2V5OiB0cnVlLFxuXG4gIF9fYmluYXJ5UmVzcG9uc2U6IHRydWUsXG4gIF9fc3RyZWFtQ2xhc3M6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgaXNSZXF1ZXN0T3B0aW9ucyA9IChvYmo6IHVua25vd24pOiBvYmogaXMgUmVxdWVzdE9wdGlvbnMgPT4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmXG4gICAgb2JqICE9PSBudWxsICYmXG4gICAgIWlzRW1wdHlPYmoob2JqKSAmJlxuICAgIE9iamVjdC5rZXlzKG9iaikuZXZlcnkoKGspID0+IGhhc093bihyZXF1ZXN0T3B0aW9uc0tleXMsIGspKVxuICApO1xufTtcblxuZXhwb3J0IHR5cGUgRmluYWxSZXF1ZXN0T3B0aW9uczxSZXEgPSB1bmtub3duIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBSZWFkYWJsZT4gPSBSZXF1ZXN0T3B0aW9uczxSZXE+ICYge1xuICBtZXRob2Q6IEhUVFBNZXRob2Q7XG4gIHBhdGg6IHN0cmluZztcbn07XG5cbmRlY2xhcmUgY29uc3QgRGVubzogYW55O1xuZGVjbGFyZSBjb25zdCBFZGdlUnVudGltZTogYW55O1xudHlwZSBBcmNoID0gJ3gzMicgfCAneDY0JyB8ICdhcm0nIHwgJ2FybTY0JyB8IGBvdGhlcjoke3N0cmluZ31gIHwgJ3Vua25vd24nO1xudHlwZSBQbGF0Zm9ybU5hbWUgPVxuICB8ICdNYWNPUydcbiAgfCAnTGludXgnXG4gIHwgJ1dpbmRvd3MnXG4gIHwgJ0ZyZWVCU0QnXG4gIHwgJ09wZW5CU0QnXG4gIHwgJ2lPUydcbiAgfCAnQW5kcm9pZCdcbiAgfCBgT3RoZXI6JHtzdHJpbmd9YFxuICB8ICdVbmtub3duJztcbnR5cGUgQnJvd3NlciA9ICdpZScgfCAnZWRnZScgfCAnY2hyb21lJyB8ICdmaXJlZm94JyB8ICdzYWZhcmknO1xudHlwZSBQbGF0Zm9ybVByb3BlcnRpZXMgPSB7XG4gICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJztcbiAgJ1gtU3RhaW5sZXNzLVBhY2thZ2UtVmVyc2lvbic6IHN0cmluZztcbiAgJ1gtU3RhaW5sZXNzLU9TJzogUGxhdGZvcm1OYW1lO1xuICAnWC1TdGFpbmxlc3MtQXJjaCc6IEFyY2g7XG4gICdYLVN0YWlubGVzcy1SdW50aW1lJzogJ25vZGUnIHwgJ2Rlbm8nIHwgJ2VkZ2UnIHwgYGJyb3dzZXI6JHtCcm93c2VyfWAgfCAndW5rbm93bic7XG4gICdYLVN0YWlubGVzcy1SdW50aW1lLVZlcnNpb24nOiBzdHJpbmc7XG59O1xuY29uc3QgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzID0gKCk6IFBsYXRmb3JtUHJvcGVydGllcyA9PiB7XG4gIGlmICh0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcgJiYgRGVuby5idWlsZCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICAgJ1gtU3RhaW5sZXNzLU9TJzogbm9ybWFsaXplUGxhdGZvcm0oRGVuby5idWlsZC5vcyksXG4gICAgICAnWC1TdGFpbmxlc3MtQXJjaCc6IG5vcm1hbGl6ZUFyY2goRGVuby5idWlsZC5hcmNoKSxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lJzogJ2Rlbm8nLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6IERlbm8udmVyc2lvbixcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgRWRnZVJ1bnRpbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICAgJ1gtU3RhaW5sZXNzLU9TJzogJ1Vua25vd24nLFxuICAgICAgJ1gtU3RhaW5sZXNzLUFyY2gnOiBgb3RoZXI6JHtFZGdlUnVudGltZX1gLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUnOiAnZWRnZScsXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzogcHJvY2Vzcy52ZXJzaW9uLFxuICAgIH07XG4gIH1cbiAgLy8gQ2hlY2sgaWYgTm9kZS5qc1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MgOiAwKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdYLVN0YWlubGVzcy1MYW5nJzogJ2pzJyxcbiAgICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICAgJ1gtU3RhaW5sZXNzLU9TJzogbm9ybWFsaXplUGxhdGZvcm0ocHJvY2Vzcy5wbGF0Zm9ybSksXG4gICAgICAnWC1TdGFpbmxlc3MtQXJjaCc6IG5vcm1hbGl6ZUFyY2gocHJvY2Vzcy5hcmNoKSxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lJzogJ25vZGUnLFxuICAgICAgJ1gtU3RhaW5sZXNzLVJ1bnRpbWUtVmVyc2lvbic6IHByb2Nlc3MudmVyc2lvbixcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgYnJvd3NlckluZm8gPSBnZXRCcm93c2VySW5mbygpO1xuICBpZiAoYnJvd3NlckluZm8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ1gtU3RhaW5sZXNzLUxhbmcnOiAnanMnLFxuICAgICAgJ1gtU3RhaW5sZXNzLVBhY2thZ2UtVmVyc2lvbic6IFZFUlNJT04sXG4gICAgICAnWC1TdGFpbmxlc3MtT1MnOiAnVW5rbm93bicsXG4gICAgICAnWC1TdGFpbmxlc3MtQXJjaCc6ICd1bmtub3duJyxcbiAgICAgICdYLVN0YWlubGVzcy1SdW50aW1lJzogYGJyb3dzZXI6JHticm93c2VySW5mby5icm93c2VyfWAsXG4gICAgICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzogYnJvd3NlckluZm8udmVyc2lvbixcbiAgICB9O1xuICB9XG5cbiAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgQ2xvdWRmbGFyZSB3b3JrZXJzLCBldGMuXG4gIHJldHVybiB7XG4gICAgJ1gtU3RhaW5sZXNzLUxhbmcnOiAnanMnLFxuICAgICdYLVN0YWlubGVzcy1QYWNrYWdlLVZlcnNpb24nOiBWRVJTSU9OLFxuICAgICdYLVN0YWlubGVzcy1PUyc6ICdVbmtub3duJyxcbiAgICAnWC1TdGFpbmxlc3MtQXJjaCc6ICd1bmtub3duJyxcbiAgICAnWC1TdGFpbmxlc3MtUnVudGltZSc6ICd1bmtub3duJyxcbiAgICAnWC1TdGFpbmxlc3MtUnVudGltZS1WZXJzaW9uJzogJ3Vua25vd24nLFxuICB9O1xufTtcblxudHlwZSBCcm93c2VySW5mbyA9IHtcbiAgYnJvd3NlcjogQnJvd3NlcjtcbiAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxuZGVjbGFyZSBjb25zdCBuYXZpZ2F0b3I6IHsgdXNlckFnZW50OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcblxuLy8gTm90ZTogbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vSlMtRGV2VG9vbHMvaG9zdC1lbnZpcm9ubWVudC9ibG9iL2IxYWI3OWVjZGUzN2RiNWQ2ZTE2M2MwNTBlNTRmZTdkMjg3ZDdjOTIvc3JjL2lzb21vcnBoaWMuYnJvd3Nlci50c1xuZnVuY3Rpb24gZ2V0QnJvd3NlckluZm8oKTogQnJvd3NlckluZm8gfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnIHx8ICFuYXZpZ2F0b3IpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIE5PVEU6IFRoZSBvcmRlciBtYXR0ZXJzIGhlcmUhXG4gIGNvbnN0IGJyb3dzZXJQYXR0ZXJucyA9IFtcbiAgICB7IGtleTogJ2VkZ2UnIGFzIGNvbnN0LCBwYXR0ZXJuOiAvRWRnZSg/OlxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnaWUnIGFzIGNvbnN0LCBwYXR0ZXJuOiAvTVNJRSg/OlxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnaWUnIGFzIGNvbnN0LCBwYXR0ZXJuOiAvVHJpZGVudCg/Oi4qcnZcXDooXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnY2hyb21lJyBhcyBjb25zdCwgcGF0dGVybjogL0Nocm9tZSg/OlxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/LyB9LFxuICAgIHsga2V5OiAnZmlyZWZveCcgYXMgY29uc3QsIHBhdHRlcm46IC9GaXJlZm94KD86XFxXKyhcXGQrKVxcLihcXGQrKSg/OlxcLihcXGQrKSk/KT8vIH0sXG4gICAgeyBrZXk6ICdzYWZhcmknIGFzIGNvbnN0LCBwYXR0ZXJuOiAvKD86VmVyc2lvblxcVysoXFxkKylcXC4oXFxkKykoPzpcXC4oXFxkKykpPyk/KD86XFxXK01vYmlsZVxcUyopP1xcVytTYWZhcmkvIH0sXG4gIF07XG5cbiAgLy8gRmluZCB0aGUgRklSU1QgbWF0Y2hpbmcgYnJvd3NlclxuICBmb3IgKGNvbnN0IHsga2V5LCBwYXR0ZXJuIH0gb2YgYnJvd3NlclBhdHRlcm5zKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBtYWpvciA9IG1hdGNoWzFdIHx8IDA7XG4gICAgICBjb25zdCBtaW5vciA9IG1hdGNoWzJdIHx8IDA7XG4gICAgICBjb25zdCBwYXRjaCA9IG1hdGNoWzNdIHx8IDA7XG5cbiAgICAgIHJldHVybiB7IGJyb3dzZXI6IGtleSwgdmVyc2lvbjogYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9YCB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBub3JtYWxpemVBcmNoID0gKGFyY2g6IHN0cmluZyk6IEFyY2ggPT4ge1xuICAvLyBOb2RlIGRvY3M6XG4gIC8vIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc2FyY2hcbiAgLy8gRGVubyBkb2NzOlxuICAvLyAtIGh0dHBzOi8vZG9jLmRlbm8ubGFuZC9kZW5vL3N0YWJsZS9+L0Rlbm8uYnVpbGRcbiAgaWYgKGFyY2ggPT09ICd4MzInKSByZXR1cm4gJ3gzMic7XG4gIGlmIChhcmNoID09PSAneDg2XzY0JyB8fCBhcmNoID09PSAneDY0JykgcmV0dXJuICd4NjQnO1xuICBpZiAoYXJjaCA9PT0gJ2FybScpIHJldHVybiAnYXJtJztcbiAgaWYgKGFyY2ggPT09ICdhYXJjaDY0JyB8fCBhcmNoID09PSAnYXJtNjQnKSByZXR1cm4gJ2FybTY0JztcbiAgaWYgKGFyY2gpIHJldHVybiBgb3RoZXI6JHthcmNofWA7XG4gIHJldHVybiAndW5rbm93bic7XG59O1xuXG5jb25zdCBub3JtYWxpemVQbGF0Zm9ybSA9IChwbGF0Zm9ybTogc3RyaW5nKTogUGxhdGZvcm1OYW1lID0+IHtcbiAgLy8gTm9kZSBwbGF0Zm9ybXM6XG4gIC8vIC0gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc3BsYXRmb3JtXG4gIC8vIERlbm8gcGxhdGZvcm1zOlxuICAvLyAtIGh0dHBzOi8vZG9jLmRlbm8ubGFuZC9kZW5vL3N0YWJsZS9+L0Rlbm8uYnVpbGRcbiAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vZGVub2xhbmQvZGVuby9pc3N1ZXMvMTQ3OTlcblxuICBwbGF0Zm9ybSA9IHBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gTk9URTogdGhpcyBpT1MgY2hlY2sgaXMgdW50ZXN0ZWQgYW5kIG1heSBub3Qgd29ya1xuICAvLyBOb2RlIGRvZXMgbm90IHdvcmsgbmF0aXZlbHkgb24gSU9TLCB0aGVyZSBpcyBhIGZvcmsgYXRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy1tb2JpbGUvbm9kZWpzLW1vYmlsZVxuICAvLyBob3dldmVyIGl0IGlzIHVua25vd24gYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyBob3cgdG8gZGV0ZWN0IGlmIGl0IGlzIHJ1bm5pbmdcbiAgaWYgKHBsYXRmb3JtLmluY2x1ZGVzKCdpb3MnKSkgcmV0dXJuICdpT1MnO1xuICBpZiAocGxhdGZvcm0gPT09ICdhbmRyb2lkJykgcmV0dXJuICdBbmRyb2lkJztcbiAgaWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykgcmV0dXJuICdNYWNPUyc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJykgcmV0dXJuICdXaW5kb3dzJztcbiAgaWYgKHBsYXRmb3JtID09PSAnZnJlZWJzZCcpIHJldHVybiAnRnJlZUJTRCc7XG4gIGlmIChwbGF0Zm9ybSA9PT0gJ29wZW5ic2QnKSByZXR1cm4gJ09wZW5CU0QnO1xuICBpZiAocGxhdGZvcm0gPT09ICdsaW51eCcpIHJldHVybiAnTGludXgnO1xuICBpZiAocGxhdGZvcm0pIHJldHVybiBgT3RoZXI6JHtwbGF0Zm9ybX1gO1xuICByZXR1cm4gJ1Vua25vd24nO1xufTtcblxubGV0IF9wbGF0Zm9ybUhlYWRlcnM6IFBsYXRmb3JtUHJvcGVydGllcztcbmNvbnN0IGdldFBsYXRmb3JtSGVhZGVycyA9ICgpID0+IHtcbiAgcmV0dXJuIChfcGxhdGZvcm1IZWFkZXJzID8/PSBnZXRQbGF0Zm9ybVByb3BlcnRpZXMoKSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2FmZUpTT04gPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xOTcwOTg0NlxuY29uc3Qgc3RhcnRzV2l0aFNjaGVtZVJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14oPzpbYS16XSs6KT8vLycsICdpJyk7XG5jb25zdCBpc0Fic29sdXRlVVJMID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBzdGFydHNXaXRoU2NoZW1lUmVnZXhwLnRlc3QodXJsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuXG5jb25zdCB2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlciA9IChuYW1lOiBzdHJpbmcsIG46IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7XG4gICAgdGhyb3cgbmV3IEdyb3FFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGFuIGludGVnZXJgKTtcbiAgfVxuICBpZiAobiA8IDApIHtcbiAgICB0aHJvdyBuZXcgR3JvcUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyYCk7XG4gIH1cbiAgcmV0dXJuIG47XG59O1xuXG5leHBvcnQgY29uc3QgY2FzdFRvRXJyb3IgPSAoZXJyOiBhbnkpOiBFcnJvciA9PiB7XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGVycjtcbiAgcmV0dXJuIG5ldyBFcnJvcihlcnIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuc3VyZVByZXNlbnQgPSA8VD4odmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogVCA9PiB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgR3JvcUVycm9yKGBFeHBlY3RlZCBhIHZhbHVlIHRvIGJlIGdpdmVuIGJ1dCByZWNlaXZlZCAke3ZhbHVlfSBpbnN0ZWFkLmApO1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIFJlYWQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKlxuICogVHJpbXMgYmVnaW5uaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLlxuICpcbiAqIFdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lc24ndCBleGlzdCBvciBjYW5ub3QgYmUgYWNjZXNzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCByZWFkRW52ID0gKGVudjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudj8uW2Vudl0/LnRyaW0oKSA/PyB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBEZW5vICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBEZW5vLmVudj8uZ2V0Py4oZW52KT8udHJpbSgpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgY29lcmNlSW50ZWdlciA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKTtcblxuICB0aHJvdyBuZXcgR3JvcUVycm9yKGBDb3VsZCBub3QgY29lcmNlICR7dmFsdWV9ICh0eXBlOiAke3R5cGVvZiB2YWx1ZX0pIGludG8gYSBudW1iZXJgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb2VyY2VGbG9hdCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG5cbiAgdGhyb3cgbmV3IEdyb3FFcnJvcihgQ291bGQgbm90IGNvZXJjZSAke3ZhbHVlfSAodHlwZTogJHt0eXBlb2YgdmFsdWV9KSBpbnRvIGEgbnVtYmVyYCk7XG59O1xuXG5leHBvcnQgY29uc3QgY29lcmNlQm9vbGVhbiA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICByZXR1cm4gQm9vbGVhbih2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbWF5YmVDb2VyY2VJbnRlZ2VyID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjb2VyY2VJbnRlZ2VyKHZhbHVlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBtYXliZUNvZXJjZUZsb2F0ID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjb2VyY2VGbG9hdCh2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbWF5YmVDb2VyY2VCb29sZWFuID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gY29lcmNlQm9vbGVhbih2YWx1ZSk7XG59O1xuXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzQ0OTEyODdcbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5T2JqKG9iajogT2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW9iaikgcmV0dXJuIHRydWU7XG4gIGZvciAoY29uc3QgX2sgaW4gb2JqKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBodHRwczovL2VzbGludC5vcmcvZG9jcy9sYXRlc3QvcnVsZXMvbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5leHBvcnQgZnVuY3Rpb24gaGFzT3duKG9iajogT2JqZWN0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgaGVhZGVycyBmcm9tIFwibmV3SGVhZGVyc1wiIG9udG8gXCJ0YXJnZXRIZWFkZXJzXCIsXG4gKiB1c2luZyBsb3dlci1jYXNlIGZvciBhbGwgcHJvcGVydGllcyxcbiAqIGlnbm9yaW5nIGFueSBrZXlzIHdpdGggdW5kZWZpbmVkIHZhbHVlcyxcbiAqIGFuZCBkZWxldGluZyBhbnkga2V5cyB3aXRoIG51bGwgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBhcHBseUhlYWRlcnNNdXQodGFyZ2V0SGVhZGVyczogSGVhZGVycywgbmV3SGVhZGVyczogSGVhZGVycyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGsgaW4gbmV3SGVhZGVycykge1xuICAgIGlmICghaGFzT3duKG5ld0hlYWRlcnMsIGspKSBjb250aW51ZTtcbiAgICBjb25zdCBsb3dlcktleSA9IGsudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIWxvd2VyS2V5KSBjb250aW51ZTtcblxuICAgIGNvbnN0IHZhbCA9IG5ld0hlYWRlcnNba107XG5cbiAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICBkZWxldGUgdGFyZ2V0SGVhZGVyc1tsb3dlcktleV07XG4gICAgfSBlbHNlIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0SGVhZGVyc1tsb3dlcktleV0gPSB2YWw7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1ZyhhY3Rpb246IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudlsnREVCVUcnXSA9PT0gJ3RydWUnKSB7XG4gICAgY29uc29sZS5sb2coYEdyb3E6REVCVUc6JHthY3Rpb259YCwgLi4uYXJncyk7XG4gIH1cbn1cblxuLyoqXG4gKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjExNzUyM1xuICovXG5jb25zdCB1dWlkNCA9ICgpID0+IHtcbiAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgKGMpID0+IHtcbiAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xuICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNSdW5uaW5nSW5Ccm93c2VyID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0eXBlb2Ygd2luZG93LmRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJ1xuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBIZWFkZXJzUHJvdG9jb2wge1xuICBnZXQ6IChoZWFkZXI6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCB0eXBlIEhlYWRlcnNMaWtlID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+IHwgSGVhZGVyc1Byb3RvY29sO1xuXG5leHBvcnQgY29uc3QgaXNIZWFkZXJzUHJvdG9jb2wgPSAoaGVhZGVyczogYW55KTogaGVhZGVycyBpcyBIZWFkZXJzUHJvdG9jb2wgPT4ge1xuICByZXR1cm4gdHlwZW9mIGhlYWRlcnM/LmdldCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXF1aXJlZEhlYWRlciA9IChoZWFkZXJzOiBIZWFkZXJzTGlrZSwgaGVhZGVyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsb3dlckNhc2VkSGVhZGVyID0gaGVhZGVyLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChpc0hlYWRlcnNQcm90b2NvbChoZWFkZXJzKSkge1xuICAgIC8vIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGUgaGVhZGVyIGxvb2tzIGxpa2UgU3RhaW5sZXNzLUV2ZW50LUlkXG4gICAgY29uc3QgaW50ZXJjYXBzSGVhZGVyID1cbiAgICAgIGhlYWRlclswXT8udG9VcHBlckNhc2UoKSArXG4gICAgICBoZWFkZXIuc3Vic3RyaW5nKDEpLnJlcGxhY2UoLyhbXlxcd10pKFxcdykvZywgKF9tLCBnMSwgZzIpID0+IGcxICsgZzIudG9VcHBlckNhc2UoKSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgW2hlYWRlciwgbG93ZXJDYXNlZEhlYWRlciwgaGVhZGVyLnRvVXBwZXJDYXNlKCksIGludGVyY2Fwc0hlYWRlcl0pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVycy5nZXQoa2V5KTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaGVhZGVycykpIHtcbiAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyQ2FzZWRIZWFkZXIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDw9IDEpIHJldHVybiB2YWx1ZVswXTtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWNlaXZlZCAke3ZhbHVlLmxlbmd0aH0gZW50cmllcyBmb3IgdGhlICR7aGVhZGVyfSBoZWFkZXIsIHVzaW5nIHRoZSBmaXJzdCBlbnRyeS5gKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgJHtoZWFkZXJ9IGhlYWRlcmApO1xufTtcblxuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIHRvIEJhc2U2NCBmb3JtYXQuXG4gKi9cbmV4cG9ydCBjb25zdCB0b0Jhc2U2NCA9IChzdHI6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXN0cikgcmV0dXJuICcnO1xuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oc3RyKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGJ0b2EgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGJ0b2Eoc3RyKTtcbiAgfVxuXG4gIHRocm93IG5ldyBHcm9xRXJyb3IoJ0Nhbm5vdCBnZW5lcmF0ZSBiNjQgc3RyaW5nOyBFeHBlY3RlZCBgQnVmZmVyYCBvciBgYnRvYWAgdG8gYmUgZGVmaW5lZCcpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqKG9iajogdW5rbm93bik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuXG5cbmltcG9ydCB0eXBlIHsgR3JvcSB9IGZyb20gJy4vaW5kZXgnO1xuXG5leHBvcnQgY2xhc3MgQVBJUmVzb3VyY2Uge1xuICBwcm90ZWN0ZWQgX2NsaWVudDogR3JvcTtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IEdyb3EpIHtcbiAgICB0aGlzLl9jbGllbnQgPSBjbGllbnQ7XG4gIH1cbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgQ29tcGxldGlvbnNBUEkgZnJvbSBcIi4vY29tcGxldGlvbnNcIjtcbmltcG9ydCB7IFN0cmVhbSB9IGZyb20gXCIuLi8uLi9saWIvc3RyZWFtaW5nXCI7XG5pbXBvcnQgeyBDaGF0Q29tcGxldGlvbkNodW5rIH0gZnJvbSBcIi4uLy4uL2xpYi9jaGF0X2NvbXBsZXRpb25zX2V4dFwiO1xuXG5leHBvcnQgY2xhc3MgQ29tcGxldGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29tcGxldGlvbiBmb3IgYSBjaGF0IHByb21wdFxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGJvZHk6IENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zTm9uU3RyZWFtaW5nLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8Q2hhdENvbXBsZXRpb24+O1xuICBjcmVhdGUoXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNTdHJlYW1pbmcsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxTdHJlYW08Q2hhdENvbXBsZXRpb25DaHVuaz4+O1xuICBjcmVhdGUoXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8U3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+IHwgQ2hhdENvbXBsZXRpb24+O1xuICBjcmVhdGUoXG4gICAgYm9keTogQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXMsXG4gICAgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMsXG4gICk6IENvcmUuQVBJUHJvbWlzZTxDaGF0Q29tcGxldGlvbj4gfCBDb3JlLkFQSVByb21pc2U8U3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KCcvb3BlbmFpL3YxL2NoYXQvY29tcGxldGlvbnMnLCB7IGJvZHksIC4uLm9wdGlvbnMsIHN0cmVhbTogYm9keS5zdHJlYW0gPz8gZmFsc2UgfSkgYXNcbiAgICAgIHwgQ29yZS5BUElQcm9taXNlPENoYXRDb21wbGV0aW9uPlxuICAgICAgfCBDb3JlLkFQSVByb21pc2U8U3RyZWFtPENoYXRDb21wbGV0aW9uQ2h1bms+PjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uIHtcbiAgY2hvaWNlczogQXJyYXk8Q2hhdENvbXBsZXRpb24uQ2hvaWNlPjtcblxuICBpZD86IHN0cmluZztcblxuICBjcmVhdGVkPzogbnVtYmVyO1xuXG4gIG1vZGVsPzogc3RyaW5nO1xuXG4gIG9iamVjdD86IHN0cmluZztcblxuICBzeXN0ZW1fZmluZ2VycHJpbnQ/OiBzdHJpbmc7XG5cbiAgdXNhZ2U/OiBDaGF0Q29tcGxldGlvbi5Vc2FnZTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDaGF0Q29tcGxldGlvbiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlIHtcbiAgICBmaW5pc2hfcmVhc29uOiBzdHJpbmc7XG5cbiAgICBpbmRleDogbnVtYmVyO1xuXG4gICAgbG9ncHJvYnM6IENob2ljZS5Mb2dwcm9icztcblxuICAgIG1lc3NhZ2U6IENob2ljZS5NZXNzYWdlO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBDaG9pY2Uge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9ncHJvYnMge1xuICAgICAgY29udGVudD86IEFycmF5PExvZ3Byb2JzLkNvbnRlbnQ+O1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgTG9ncHJvYnMge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBDb250ZW50IHtcbiAgICAgICAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgICAgICAgYnl0ZXM/OiBBcnJheTxudW1iZXI+O1xuXG4gICAgICAgIGxvZ3Byb2I/OiBudW1iZXI7XG5cbiAgICAgICAgdG9wX2xvZ3Byb2JzPzogQXJyYXk8Q29udGVudC5Ub3BMb2dwcm9iPjtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IG5hbWVzcGFjZSBDb250ZW50IHtcbiAgICAgICAgZXhwb3J0IGludGVyZmFjZSBUb3BMb2dwcm9iIHtcbiAgICAgICAgICB0b2tlbj86IHN0cmluZztcblxuICAgICAgICAgIGJ5dGVzPzogQXJyYXk8bnVtYmVyPjtcblxuICAgICAgICAgIGxvZ3Byb2I/OiBudW1iZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAgICAgY29udGVudDogc3RyaW5nO1xuXG4gICAgICByb2xlOiBzdHJpbmc7XG5cbiAgICAgIHRvb2xfY2FsbHM/OiBBcnJheTxNZXNzYWdlLlRvb2xDYWxsPjtcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIE1lc3NhZ2Uge1xuICAgICAgZXhwb3J0IGludGVyZmFjZSBUb29sQ2FsbCB7XG4gICAgICAgIGlkPzogc3RyaW5nO1xuXG4gICAgICAgIGZ1bmN0aW9uPzogVG9vbENhbGwuRnVuY3Rpb247XG5cbiAgICAgICAgdHlwZT86IHN0cmluZztcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IG5hbWVzcGFjZSBUb29sQ2FsbCB7XG4gICAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgICAgICAgIGFyZ3VtZW50cz86IHN0cmluZztcblxuICAgICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIFVzYWdlIHtcbiAgICBjb21wbGV0aW9uX3RpbWU/OiBudW1iZXI7XG5cbiAgICBjb21wbGV0aW9uX3Rva2Vucz86IG51bWJlcjtcblxuICAgIHByb21wdF90aW1lPzogbnVtYmVyO1xuXG4gICAgcHJvbXB0X3Rva2Vucz86IG51bWJlcjtcblxuICAgIHF1ZXVlX3RpbWU/OiBudW1iZXI7XG5cbiAgICB0b3RhbF90aW1lPzogbnVtYmVyO1xuXG4gICAgdG90YWxfdG9rZW5zPzogbnVtYmVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgbWVzc2FnZXM6IEFycmF5PENvbXBsZXRpb25DcmVhdGVQYXJhbXMuTWVzc2FnZT47XG5cbiAgbW9kZWw6IHN0cmluZztcblxuICBmcmVxdWVuY3lfcGVuYWx0eT86IG51bWJlcjtcblxuICBsb2dpdF9iaWFzPzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcblxuICBsb2dwcm9icz86IGJvb2xlYW47XG5cbiAgbWF4X3Rva2Vucz86IG51bWJlcjtcblxuICBuPzogbnVtYmVyO1xuXG4gIHByZXNlbmNlX3BlbmFsdHk/OiBudW1iZXI7XG5cbiAgcmVzcG9uc2VfZm9ybWF0PzogQ29tcGxldGlvbkNyZWF0ZVBhcmFtcy5SZXNwb25zZUZvcm1hdDtcblxuICBzZWVkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBVcCB0byA0IHNlcXVlbmNlcyB3aGVyZSB0aGUgQVBJIHdpbGwgc3RvcCBnZW5lcmF0aW5nIGZ1cnRoZXIgdG9rZW5zLiBUaGVcbiAgICogcmV0dXJuZWQgdGV4dCB3aWxsIG5vdCBjb250YWluIHRoZSBzdG9wIHNlcXVlbmNlLlxuICAgKi9cbiAgc3RvcD86IHN0cmluZyB8IG51bGwgfCBBcnJheTxzdHJpbmc+O1xuXG4gIHN0cmVhbT86IGJvb2xlYW47XG5cbiAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG5cbiAgdG9vbF9jaG9pY2U/OiBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLlRvb2xDaG9pY2U7XG5cbiAgdG9vbHM/OiBBcnJheTxDb21wbGV0aW9uQ3JlYXRlUGFyYW1zLlRvb2w+O1xuXG4gIHRvcF9sb2dwcm9icz86IG51bWJlcjtcblxuICB0b3BfcD86IG51bWJlcjtcblxuICB1c2VyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENvbXBsZXRpb25DcmVhdGVQYXJhbXMge1xuICBleHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAgIGNvbnRlbnQ6IHN0cmluZztcblxuICAgIHJvbGU6IHN0cmluZztcblxuICAgIG5hbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUb29sTWVzc2FnZSBGaWVsZHNcbiAgICAgKi9cbiAgICB0b29sX2NhbGxfaWQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBc3Npc3RhbnRNZXNzYWdlIEZpZWxkc1xuICAgICAqL1xuICAgIHRvb2xfY2FsbHM/OiBBcnJheTxNZXNzYWdlLlRvb2xDYWxsPjtcbiAgfVxuXG4gIGV4cG9ydCBuYW1lc3BhY2UgTWVzc2FnZSB7XG4gICAgZXhwb3J0IGludGVyZmFjZSBUb29sQ2FsbCB7XG4gICAgICBpZD86IHN0cmluZztcblxuICAgICAgZnVuY3Rpb24/OiBUb29sQ2FsbC5GdW5jdGlvbjtcblxuICAgICAgdHlwZT86IHN0cmluZztcbiAgICB9XG5cbiAgICBleHBvcnQgbmFtZXNwYWNlIFRvb2xDYWxsIHtcbiAgICAgIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgICAgICBhcmd1bWVudHM/OiBzdHJpbmc7XG5cbiAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlRm9ybWF0IHtcbiAgICB0eXBlPzogc3RyaW5nO1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBUb29sQ2hvaWNlIHtcbiAgICBzdHJpbmc/OiBzdHJpbmc7XG5cbiAgICB0b29sQ2hvaWNlPzogVG9vbENob2ljZS5Ub29sQ2hvaWNlO1xuICB9XG5cbiAgZXhwb3J0IG5hbWVzcGFjZSBUb29sQ2hvaWNlIHtcbiAgICBleHBvcnQgaW50ZXJmYWNlIFRvb2xDaG9pY2Uge1xuICAgICAgZnVuY3Rpb24/OiBUb29sQ2hvaWNlLkZ1bmN0aW9uO1xuXG4gICAgICB0eXBlPzogc3RyaW5nO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgVG9vbENob2ljZSB7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uIHtcbiAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIFRvb2wge1xuICAgIGZ1bmN0aW9uPzogVG9vbC5GdW5jdGlvbjtcblxuICAgIHR5cGU/OiBzdHJpbmc7XG4gIH1cblxuICBleHBvcnQgbmFtZXNwYWNlIFRvb2wge1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb24ge1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgICAgIG5hbWU/OiBzdHJpbmc7XG5cbiAgICAgIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBDb21wbGV0aW9ucyB7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb24gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc05vblN0cmVhbWluZyBleHRlbmRzIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zQmFzZSB7XG4gIHN0cmVhbT86IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRDb21wbGV0aW9uQ3JlYXRlUGFyYW1zU3RyZWFtaW5nIGV4dGVuZHMgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNCYXNlIHtcbiAgc3RyZWFtOiB0cnVlO1xufVxuXG5leHBvcnQgdHlwZSBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtcyA9XG4gIHwgQ2hhdENvbXBsZXRpb25DcmVhdGVQYXJhbXNOb25TdHJlYW1pbmdcbiAgfCBDaGF0Q29tcGxldGlvbkNyZWF0ZVBhcmFtc1N0cmVhbWluZztcbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLlxuXG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgQ29tcGxldGlvbnNBUEkgZnJvbSBcIi4vY29tcGxldGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYXQgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIGNvbXBsZXRpb25zOiBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9ucyA9IG5ldyBDb21wbGV0aW9uc0FQSS5Db21wbGV0aW9ucyh0aGlzLl9jbGllbnQpO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIENoYXQge1xuICBleHBvcnQgaW1wb3J0IENvbXBsZXRpb25zID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgQ2hhdENvbXBsZXRpb24gPSBDb21wbGV0aW9uc0FQSS5DaGF0Q29tcGxldGlvbjtcbiAgZXhwb3J0IGltcG9ydCBDb21wbGV0aW9uQ3JlYXRlUGFyYW1zID0gQ29tcGxldGlvbnNBUEkuQ29tcGxldGlvbkNyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgTW9kZWxzQVBJIGZyb20gXCIuL21vZGVsc1wiO1xuXG5leHBvcnQgY2xhc3MgTW9kZWxzIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogR2V0IGEgc3BlY2lmaWMgbW9kZWxcbiAgICovXG4gIHJldHJpZXZlKG1vZGVsOiBzdHJpbmcsIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPE1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5nZXQoYC9vcGVuYWkvdjEvbW9kZWxzLyR7bW9kZWx9YCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGFsbCBhdmFpbGFibGUgbW9kZWxzXG4gICAqL1xuICBsaXN0KG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zKTogQ29yZS5BUElQcm9taXNlPE1vZGVsTGlzdD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZ2V0KCcvb3BlbmFpL3YxL21vZGVscycsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIG1vZGVsXG4gICAqL1xuICBkZWxldGUobW9kZWw6IHN0cmluZywgb3B0aW9ucz86IENvcmUuUmVxdWVzdE9wdGlvbnMpOiBDb3JlLkFQSVByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9jbGllbnQuZGVsZXRlKGAvb3BlbmFpL3YxL21vZGVscy8ke21vZGVsfWAsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7IEFjY2VwdDogJyovKicsIC4uLm9wdGlvbnM/LmhlYWRlcnMgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsIHtcbiAgaWQ/OiBzdHJpbmc7XG5cbiAgY3JlYXRlZD86IG51bWJlcjtcblxuICBvYmplY3Q/OiBzdHJpbmc7XG5cbiAgb3duZWRfYnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxMaXN0IHtcbiAgZGF0YT86IEFycmF5PE1vZGVsPjtcblxuICBvYmplY3Q/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9kZWxzIHtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbCA9IE1vZGVsc0FQSS5Nb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbExpc3QgPSBNb2RlbHNBUEkuTW9kZWxMaXN0O1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuXG5cbmltcG9ydCAqIGFzIENvcmUgZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgKiBhcyBUcmFuc2NyaXB0aW9uc0FQSSBmcm9tIFwiLi90cmFuc2NyaXB0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBVcGxvYWRhYmxlLCBtdWx0aXBhcnRGb3JtUmVxdWVzdE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNjcmlwdGlvbnMgZXh0ZW5kcyBBUElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUcmFuc2NyaWJlcyBhdWRpbyBpbnRvIHRoZSBpbnB1dCBsYW5ndWFnZS5cbiAgICovXG4gIGNyZWF0ZShib2R5OiBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zLCBvcHRpb25zPzogQ29yZS5SZXF1ZXN0T3B0aW9ucyk6IENvcmUuQVBJUHJvbWlzZTxUcmFuc2NyaXB0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudC5wb3N0KFxuICAgICAgJy9vcGVuYWkvdjEvYXVkaW8vdHJhbnNjcmlwdGlvbnMnLFxuICAgICAgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zKHsgYm9keSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zY3JpcHRpb24gcmVzcG9uc2UgcmV0dXJuZWQgYnkgbW9kZWwsIGJhc2VkIG9uIHRoZSBwcm92aWRlZFxuICogaW5wdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgdHJhbnNjcmliZWQgdGV4dC5cbiAgICovXG4gIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhdWRpbyBmaWxlIG9iamVjdCAobm90IGZpbGUgbmFtZSkgdG8gdHJhbnNjcmliZSwgaW4gb25lIG9mIHRoZXNlIGZvcm1hdHM6XG4gICAqIGZsYWMsIG1wMywgbXA0LCBtcGVnLCBtcGdhLCBtNGEsIG9nZywgd2F2LCBvciB3ZWJtLlxuICAgKi9cbiAgZmlsZTogVXBsb2FkYWJsZTtcblxuICAvKipcbiAgICogSUQgb2YgdGhlIG1vZGVsIHRvIHVzZS4gT25seSBgd2hpc3Blci1sYXJnZS12M2AgaXMgY3VycmVudGx5IGF2YWlsYWJsZS5cbiAgICovXG4gIG1vZGVsOiAoc3RyaW5nICYge30pIHwgJ3doaXNwZXItbGFyZ2UtdjMnO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugb2YgdGhlIGlucHV0IGF1ZGlvLiBTdXBwbHlpbmcgdGhlIGlucHV0IGxhbmd1YWdlIGluXG4gICAqIFtJU08tNjM5LTFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfSVNPXzYzOS0xX2NvZGVzKSBmb3JtYXQgd2lsbFxuICAgKiBpbXByb3ZlIGFjY3VyYWN5IGFuZCBsYXRlbmN5LlxuICAgKi9cbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHRleHQgdG8gZ3VpZGUgdGhlIG1vZGVsJ3Mgc3R5bGUgb3IgY29udGludWUgYSBwcmV2aW91cyBhdWRpb1xuICAgKiBzZWdtZW50LiBUaGUgW3Byb21wdF0oL2RvY3MvZ3VpZGVzL3NwZWVjaC10by10ZXh0L3Byb21wdGluZykgc2hvdWxkIG1hdGNoIHRoZVxuICAgKiBhdWRpbyBsYW5ndWFnZS5cbiAgICovXG4gIHByb21wdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCBvZiB0aGUgdHJhbnNjcmlwdCBvdXRwdXQsIGluIG9uZSBvZiB0aGVzZSBvcHRpb25zOiBganNvbmAsIGB0ZXh0YCxcbiAgICogYHNydGAsIGB2ZXJib3NlX2pzb25gLCBvciBgdnR0YC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86ICdqc29uJyB8ICd0ZXh0JyB8ICdzcnQnIHwgJ3ZlcmJvc2VfanNvbicgfCAndnR0JztcblxuICAvKipcbiAgICogVGhlIHNhbXBsaW5nIHRlbXBlcmF0dXJlLCBiZXR3ZWVuIDAgYW5kIDEuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbCBtYWtlIHRoZVxuICAgKiBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZSBmb2N1c2VkIGFuZFxuICAgKiBkZXRlcm1pbmlzdGljLiBJZiBzZXQgdG8gMCwgdGhlIG1vZGVsIHdpbGwgdXNlXG4gICAqIFtsb2cgcHJvYmFiaWxpdHldKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xvZ19wcm9iYWJpbGl0eSkgdG9cbiAgICogYXV0b21hdGljYWxseSBpbmNyZWFzZSB0aGUgdGVtcGVyYXR1cmUgdW50aWwgY2VydGFpbiB0aHJlc2hvbGRzIGFyZSBoaXQuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBncmFudWxhcml0aWVzIHRvIHBvcHVsYXRlIGZvciB0aGlzIHRyYW5zY3JpcHRpb24uXG4gICAqIGByZXNwb25zZV9mb3JtYXRgIG11c3QgYmUgc2V0IGB2ZXJib3NlX2pzb25gIHRvIHVzZSB0aW1lc3RhbXAgZ3JhbnVsYXJpdGllcy5cbiAgICogRWl0aGVyIG9yIGJvdGggb2YgdGhlc2Ugb3B0aW9ucyBhcmUgc3VwcG9ydGVkOiBgd29yZGAsIG9yIGBzZWdtZW50YC4gTm90ZTogVGhlcmVcbiAgICogaXMgbm8gYWRkaXRpb25hbCBsYXRlbmN5IGZvciBzZWdtZW50IHRpbWVzdGFtcHMsIGJ1dCBnZW5lcmF0aW5nIHdvcmQgdGltZXN0YW1wc1xuICAgKiBpbmN1cnMgYWRkaXRpb25hbCBsYXRlbmN5LlxuICAgKi9cbiAgdGltZXN0YW1wX2dyYW51bGFyaXRpZXM/OiBBcnJheTwnd29yZCcgfCAnc2VnbWVudCc+O1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFRyYW5zY3JpcHRpb25zIHtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zID0gVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbkNyZWF0ZVBhcmFtcztcbn1cbiIsICIvLyBGaWxlIGdlbmVyYXRlZCBmcm9tIG91ciBPcGVuQVBJIHNwZWMgYnkgU3RhaW5sZXNzLlxuXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuLi8uLi9jb3JlXCI7XG5pbXBvcnQgeyBBUElSZXNvdXJjZSB9IGZyb20gXCIuLi8uLi9yZXNvdXJjZVwiO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zQVBJIGZyb20gXCIuL3RyYW5zbGF0aW9uc1wiO1xuaW1wb3J0ICogYXMgQXVkaW9BUEkgZnJvbSBcIi4vYXVkaW9cIjtcbmltcG9ydCB7IHR5cGUgVXBsb2FkYWJsZSwgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0aW9ucyBleHRlbmRzIEFQSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYXVkaW8gaW50byBFbmdsaXNoLlxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGJvZHk6IFRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zLFxuICAgIG9wdGlvbnM/OiBDb3JlLlJlcXVlc3RPcHRpb25zLFxuICApOiBDb3JlLkFQSVByb21pc2U8QXVkaW9BUEkuVHJhbnNsYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50LnBvc3QoXG4gICAgICAnL29wZW5haS92MS9hdWRpby90cmFuc2xhdGlvbnMnLFxuICAgICAgbXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zKHsgYm9keSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25DcmVhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGF1ZGlvIGZpbGUgb2JqZWN0IChub3QgZmlsZSBuYW1lKSB0cmFuc2xhdGUsIGluIG9uZSBvZiB0aGVzZSBmb3JtYXRzOiBmbGFjLFxuICAgKiBtcDMsIG1wNCwgbXBlZywgbXBnYSwgbTRhLCBvZ2csIHdhdiwgb3Igd2VibS5cbiAgICovXG4gIGZpbGU6IFVwbG9hZGFibGU7XG5cbiAgLyoqXG4gICAqIElEIG9mIHRoZSBtb2RlbCB0byB1c2UuIE9ubHkgYHdoaXNwZXItbGFyZ2UtdjNgIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqL1xuICBtb2RlbDogKHN0cmluZyAmIHt9KSB8ICd3aGlzcGVyLWxhcmdlLXYzJztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgdGV4dCB0byBndWlkZSB0aGUgbW9kZWwncyBzdHlsZSBvciBjb250aW51ZSBhIHByZXZpb3VzIGF1ZGlvXG4gICAqIHNlZ21lbnQuIFRoZSBbcHJvbXB0XSgvZG9jcy9ndWlkZXMvc3BlZWNoLXRvLXRleHQvcHJvbXB0aW5nKSBzaG91bGQgYmUgaW5cbiAgICogRW5nbGlzaC5cbiAgICovXG4gIHByb21wdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvcm1hdCBvZiB0aGUgdHJhbnNjcmlwdCBvdXRwdXQsIGluIG9uZSBvZiB0aGVzZSBvcHRpb25zOiBganNvbmAsIGB0ZXh0YCxcbiAgICogYHNydGAsIGB2ZXJib3NlX2pzb25gLCBvciBgdnR0YC5cbiAgICovXG4gIHJlc3BvbnNlX2Zvcm1hdD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNhbXBsaW5nIHRlbXBlcmF0dXJlLCBiZXR3ZWVuIDAgYW5kIDEuIEhpZ2hlciB2YWx1ZXMgbGlrZSAwLjggd2lsbCBtYWtlIHRoZVxuICAgKiBvdXRwdXQgbW9yZSByYW5kb20sIHdoaWxlIGxvd2VyIHZhbHVlcyBsaWtlIDAuMiB3aWxsIG1ha2UgaXQgbW9yZSBmb2N1c2VkIGFuZFxuICAgKiBkZXRlcm1pbmlzdGljLiBJZiBzZXQgdG8gMCwgdGhlIG1vZGVsIHdpbGwgdXNlXG4gICAqIFtsb2cgcHJvYmFiaWxpdHldKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xvZ19wcm9iYWJpbGl0eSkgdG9cbiAgICogYXV0b21hdGljYWxseSBpbmNyZWFzZSB0aGUgdGVtcGVyYXR1cmUgdW50aWwgY2VydGFpbiB0aHJlc2hvbGRzIGFyZSBoaXQuXG4gICAqL1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUcmFuc2xhdGlvbnMge1xuICBleHBvcnQgaW1wb3J0IFRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zID0gVHJhbnNsYXRpb25zQVBJLlRyYW5zbGF0aW9uQ3JlYXRlUGFyYW1zO1xufVxuIiwgIi8vIEZpbGUgZ2VuZXJhdGVkIGZyb20gb3VyIE9wZW5BUEkgc3BlYyBieSBTdGFpbmxlc3MuXG5cbmltcG9ydCB7IEFQSVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlXCI7XG5pbXBvcnQgKiBhcyBBdWRpb0FQSSBmcm9tIFwiLi9hdWRpb1wiO1xuaW1wb3J0ICogYXMgVHJhbnNjcmlwdGlvbnNBUEkgZnJvbSBcIi4vdHJhbnNjcmlwdGlvbnNcIjtcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0FQSSBmcm9tIFwiLi90cmFuc2xhdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvIGV4dGVuZHMgQVBJUmVzb3VyY2Uge1xuICB0cmFuc2NyaXB0aW9uczogVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbnMgPSBuZXcgVHJhbnNjcmlwdGlvbnNBUEkuVHJhbnNjcmlwdGlvbnModGhpcy5fY2xpZW50KTtcbiAgdHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25zID0gbmV3IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbnModGhpcy5fY2xpZW50KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xhdGlvbiB7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBdWRpbyB7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb24gPSBBdWRpb0FQSS5UcmFuc2xhdGlvbjtcbiAgZXhwb3J0IGltcG9ydCBUcmFuc2NyaXB0aW9ucyA9IFRyYW5zY3JpcHRpb25zQVBJLlRyYW5zY3JpcHRpb25zO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zY3JpcHRpb24gPSBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9uO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zY3JpcHRpb25DcmVhdGVQYXJhbXMgPSBUcmFuc2NyaXB0aW9uc0FQSS5UcmFuc2NyaXB0aW9uQ3JlYXRlUGFyYW1zO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zbGF0aW9ucyA9IFRyYW5zbGF0aW9uc0FQSS5UcmFuc2xhdGlvbnM7XG4gIGV4cG9ydCBpbXBvcnQgVHJhbnNsYXRpb25DcmVhdGVQYXJhbXMgPSBUcmFuc2xhdGlvbnNBUEkuVHJhbnNsYXRpb25DcmVhdGVQYXJhbXM7XG59XG4iLCAiLy8gRmlsZSBnZW5lcmF0ZWQgZnJvbSBvdXIgT3BlbkFQSSBzcGVjIGJ5IFN0YWlubGVzcy5cblxuaW1wb3J0ICogYXMgQ29yZSBmcm9tICcuL2NvcmUnO1xuaW1wb3J0ICogYXMgRXJyb3JzIGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IHsgdHlwZSBBZ2VudCB9IGZyb20gJy4vX3NoaW1zL2luZGV4JztcbmltcG9ydCAqIGFzIFVwbG9hZHMgZnJvbSAnLi91cGxvYWRzJztcbmltcG9ydCAqIGFzIEFQSSBmcm9tIFwiLi9yZXNvdXJjZXMvaW5kZXhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmF1bHRzIHRvIHByb2Nlc3MuZW52WydHUk9RX0FQSV9LRVknXS5cbiAgICovXG4gIGFwaUtleT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmFzZSBVUkwgZm9yIHRoZSBBUEksIGUuZy4sIFwiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vdjIvXCJcbiAgICpcbiAgICogRGVmYXVsdHMgdG8gcHJvY2Vzcy5lbnZbJ0dST1FfQkFTRV9VUkwnXS5cbiAgICovXG4gIGJhc2VVUkw/OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0aGF0IHRoZSBjbGllbnQgc2hvdWxkIHdhaXQgZm9yIGEgcmVzcG9uc2VcbiAgICogZnJvbSB0aGUgc2VydmVyIGJlZm9yZSB0aW1pbmcgb3V0IGEgc2luZ2xlIHJlcXVlc3QuXG4gICAqXG4gICAqIE5vdGUgdGhhdCByZXF1ZXN0IHRpbWVvdXRzIGFyZSByZXRyaWVkIGJ5IGRlZmF1bHQsIHNvIGluIGEgd29yc3QtY2FzZSBzY2VuYXJpbyB5b3UgbWF5IHdhaXRcbiAgICogbXVjaCBsb25nZXIgdGhhbiB0aGlzIHRpbWVvdXQgYmVmb3JlIHRoZSBwcm9taXNlIHN1Y2NlZWRzIG9yIGZhaWxzLlxuICAgKi9cbiAgdGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gSFRUUCBhZ2VudCB1c2VkIHRvIG1hbmFnZSBIVFRQKFMpIGNvbm5lY3Rpb25zLlxuICAgKlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGFuIGFnZW50IHdpbGwgYmUgY29uc3RydWN0ZWQgYnkgZGVmYXVsdCBpbiB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCxcbiAgICogb3RoZXJ3aXNlIG5vIGFnZW50IGlzIHVzZWQuXG4gICAqL1xuICBodHRwQWdlbnQ/OiBBZ2VudDtcblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBgZmV0Y2hgIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLlxuICAgKlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHdlIHVzZSBgbm9kZS1mZXRjaGAgb24gTm9kZS5qcyBhbmQgb3RoZXJ3aXNlIGV4cGVjdCB0aGF0IGBmZXRjaGAgaXNcbiAgICogZGVmaW5lZCBnbG9iYWxseS5cbiAgICovXG4gIGZldGNoPzogQ29yZS5GZXRjaCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIGNsaWVudCB3aWxsIHJldHJ5IGEgcmVxdWVzdCBpbiBjYXNlIG9mIGFcbiAgICogdGVtcG9yYXJ5IGZhaWx1cmUsIGxpa2UgYSBuZXR3b3JrIGVycm9yIG9yIGEgNVhYIGVycm9yIGZyb20gdGhlIHNlcnZlci5cbiAgICpcbiAgICogQGRlZmF1bHQgMlxuICAgKi9cbiAgbWF4UmV0cmllcz86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBoZWFkZXJzIHRvIGluY2x1ZGUgd2l0aCBldmVyeSByZXF1ZXN0IHRvIHRoZSBBUEkuXG4gICAqXG4gICAqIFRoZXNlIGNhbiBiZSByZW1vdmVkIGluIGluZGl2aWR1YWwgcmVxdWVzdHMgYnkgZXhwbGljaXRseSBzZXR0aW5nIHRoZVxuICAgKiBoZWFkZXIgdG8gYHVuZGVmaW5lZGAgb3IgYG51bGxgIGluIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRIZWFkZXJzPzogQ29yZS5IZWFkZXJzO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICpcbiAgICogVGhlc2UgY2FuIGJlIHJlbW92ZWQgaW4gaW5kaXZpZHVhbCByZXF1ZXN0cyBieSBleHBsaWNpdGx5IHNldHRpbmcgdGhlXG4gICAqIHBhcmFtIHRvIGB1bmRlZmluZWRgIGluIHJlcXVlc3Qgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRRdWVyeT86IENvcmUuRGVmYXVsdFF1ZXJ5O1xuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBjbGllbnQtc2lkZSB1c2Ugb2YgdGhpcyBsaWJyYXJ5IGlzIG5vdCBhbGxvd2VkLCBhcyBpdCByaXNrcyBleHBvc2luZyB5b3VyIHNlY3JldCBBUEkgY3JlZGVudGlhbHMgdG8gYXR0YWNrZXJzLlxuICAgKiBPbmx5IHNldCB0aGlzIG9wdGlvbiB0byBgdHJ1ZWAgaWYgeW91IHVuZGVyc3RhbmQgdGhlIHJpc2tzIGFuZCBoYXZlIGFwcHJvcHJpYXRlIG1pdGlnYXRpb25zIGluIHBsYWNlLlxuICAgKi9cbiAgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXI/OiBib29sZWFuO1xufVxuXG4vKiogQVBJIENsaWVudCBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgR3JvcSBBUEkuICovXG5leHBvcnQgY2xhc3MgR3JvcSBleHRlbmRzIENvcmUuQVBJQ2xpZW50IHtcbiAgYXBpS2V5OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfb3B0aW9uczogQ2xpZW50T3B0aW9ucztcblxuICAvKipcbiAgICogQVBJIENsaWVudCBmb3IgaW50ZXJmYWNpbmcgd2l0aCB0aGUgR3JvcSBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbb3B0cy5hcGlLZXk9cHJvY2Vzcy5lbnZbJ0dST1FfQVBJX0tFWSddID8/IHVuZGVmaW5lZF1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmJhc2VVUkw9cHJvY2Vzcy5lbnZbJ0dST1FfQkFTRV9VUkwnXSA/PyBodHRwczovL2FwaS5ncm9xLmNvbV0gLSBPdmVycmlkZSB0aGUgZGVmYXVsdCBiYXNlIFVSTCBmb3IgdGhlIEFQSS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXQ9MSBtaW51dGVdIC0gVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdGhlIGNsaWVudCB3aWxsIHdhaXQgZm9yIGEgcmVzcG9uc2UgYmVmb3JlIHRpbWluZyBvdXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0cy5odHRwQWdlbnRdIC0gQW4gSFRUUCBhZ2VudCB1c2VkIHRvIG1hbmFnZSBIVFRQKHMpIGNvbm5lY3Rpb25zLlxuICAgKiBAcGFyYW0ge0NvcmUuRmV0Y2h9IFtvcHRzLmZldGNoXSAtIFNwZWNpZnkgYSBjdXN0b20gYGZldGNoYCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLm1heFJldHJpZXM9Ml0gLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNsaWVudCB3aWxsIHJldHJ5IGEgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtDb3JlLkhlYWRlcnN9IG9wdHMuZGVmYXVsdEhlYWRlcnMgLSBEZWZhdWx0IGhlYWRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtDb3JlLkRlZmF1bHRRdWVyeX0gb3B0cy5kZWZhdWx0UXVlcnkgLSBEZWZhdWx0IHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jbHVkZSB3aXRoIGV2ZXJ5IHJlcXVlc3QgdG8gdGhlIEFQSS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5kYW5nZXJvdXNseUFsbG93QnJvd3Nlcj1mYWxzZV0gLSBCeSBkZWZhdWx0LCBjbGllbnQtc2lkZSB1c2Ugb2YgdGhpcyBsaWJyYXJ5IGlzIG5vdCBhbGxvd2VkLCBhcyBpdCByaXNrcyBleHBvc2luZyB5b3VyIHNlY3JldCBBUEkgY3JlZGVudGlhbHMgdG8gYXR0YWNrZXJzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe1xuICAgIGJhc2VVUkwgPSBDb3JlLnJlYWRFbnYoJ0dST1FfQkFTRV9VUkwnKSxcbiAgICBhcGlLZXkgPSBDb3JlLnJlYWRFbnYoJ0dST1FfQVBJX0tFWScpLFxuICAgIC4uLm9wdHNcbiAgfTogQ2xpZW50T3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKGFwaUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JzLkdyb3FFcnJvcihcbiAgICAgICAgXCJUaGUgR1JPUV9BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG1pc3Npbmcgb3IgZW1wdHk7IGVpdGhlciBwcm92aWRlIGl0LCBvciBpbnN0YW50aWF0ZSB0aGUgR3JvcSBjbGllbnQgd2l0aCBhbiBhcGlLZXkgb3B0aW9uLCBsaWtlIG5ldyBHcm9xKHsgYXBpS2V5OiAnTXkgQVBJIEtleScgfSkuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IENsaWVudE9wdGlvbnMgPSB7XG4gICAgICBhcGlLZXksXG4gICAgICAuLi5vcHRzLFxuICAgICAgYmFzZVVSTDogYmFzZVVSTCB8fCBgaHR0cHM6Ly9hcGkuZ3JvcS5jb21gLFxuICAgIH07XG5cbiAgICBpZiAoIW9wdGlvbnMuZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXIgJiYgQ29yZS5pc1J1bm5pbmdJbkJyb3dzZXIoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9ycy5Hcm9xRXJyb3IoXG4gICAgICAgICdUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGFzIGl0IHJpc2tzIGV4cG9zaW5nIHlvdXIgc2VjcmV0IEFQSSBjcmVkZW50aWFscyB0byBhdHRhY2tlcnMuXFxuSWYgeW91IHVuZGVyc3RhbmQgdGhlIHJpc2tzIGFuZCBoYXZlIGFwcHJvcHJpYXRlIG1pdGlnYXRpb25zIGluIHBsYWNlLFxcbnlvdSBjYW4gc2V0IHRoZSBgZGFuZ2Vyb3VzbHlBbGxvd0Jyb3dzZXJgIG9wdGlvbiB0byBgdHJ1ZWAsIGUuZy4sXFxuXFxubmV3IEdyb3EoeyBkYW5nZXJvdXNseUFsbG93QnJvd3NlcjogdHJ1ZSB9KScsXG4gICAgICApO1xuICAgIH1cblxuICAgIHN1cGVyKHtcbiAgICAgIGJhc2VVUkw6IG9wdGlvbnMuYmFzZVVSTCEsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXQgPz8gNjAwMDAgLyogMSBtaW51dGUgKi8sXG4gICAgICBodHRwQWdlbnQ6IG9wdGlvbnMuaHR0cEFnZW50LFxuICAgICAgbWF4UmV0cmllczogb3B0aW9ucy5tYXhSZXRyaWVzLFxuICAgICAgZmV0Y2g6IG9wdGlvbnMuZmV0Y2gsXG4gICAgfSk7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICB0aGlzLmFwaUtleSA9IGFwaUtleTtcbiAgfVxuXG4gIGNoYXQ6IEFQSS5DaGF0ID0gbmV3IEFQSS5DaGF0KHRoaXMpO1xuICBhdWRpbzogQVBJLkF1ZGlvID0gbmV3IEFQSS5BdWRpbyh0aGlzKTtcbiAgbW9kZWxzOiBBUEkuTW9kZWxzID0gbmV3IEFQSS5Nb2RlbHModGhpcyk7XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGRlZmF1bHRRdWVyeSgpOiBDb3JlLkRlZmF1bHRRdWVyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuZGVmYXVsdFF1ZXJ5O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGRlZmF1bHRIZWFkZXJzKG9wdHM6IENvcmUuRmluYWxSZXF1ZXN0T3B0aW9ucyk6IENvcmUuSGVhZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmRlZmF1bHRIZWFkZXJzKG9wdHMpLFxuICAgICAgLi4udGhpcy5fb3B0aW9ucy5kZWZhdWx0SGVhZGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGF1dGhIZWFkZXJzKG9wdHM6IENvcmUuRmluYWxSZXF1ZXN0T3B0aW9ucyk6IENvcmUuSGVhZGVycyB7XG4gICAgcmV0dXJuIHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuYXBpS2V5fWAgfTtcbiAgfVxuXG4gIHN0YXRpYyBHcm9xID0gdGhpcztcblxuICBzdGF0aWMgR3JvcUVycm9yID0gRXJyb3JzLkdyb3FFcnJvcjtcbiAgc3RhdGljIEFQSUVycm9yID0gRXJyb3JzLkFQSUVycm9yO1xuICBzdGF0aWMgQVBJQ29ubmVjdGlvbkVycm9yID0gRXJyb3JzLkFQSUNvbm5lY3Rpb25FcnJvcjtcbiAgc3RhdGljIEFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IgPSBFcnJvcnMuQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcjtcbiAgc3RhdGljIEFQSVVzZXJBYm9ydEVycm9yID0gRXJyb3JzLkFQSVVzZXJBYm9ydEVycm9yO1xuICBzdGF0aWMgTm90Rm91bmRFcnJvciA9IEVycm9ycy5Ob3RGb3VuZEVycm9yO1xuICBzdGF0aWMgQ29uZmxpY3RFcnJvciA9IEVycm9ycy5Db25mbGljdEVycm9yO1xuICBzdGF0aWMgUmF0ZUxpbWl0RXJyb3IgPSBFcnJvcnMuUmF0ZUxpbWl0RXJyb3I7XG4gIHN0YXRpYyBCYWRSZXF1ZXN0RXJyb3IgPSBFcnJvcnMuQmFkUmVxdWVzdEVycm9yO1xuICBzdGF0aWMgQXV0aGVudGljYXRpb25FcnJvciA9IEVycm9ycy5BdXRoZW50aWNhdGlvbkVycm9yO1xuICBzdGF0aWMgSW50ZXJuYWxTZXJ2ZXJFcnJvciA9IEVycm9ycy5JbnRlcm5hbFNlcnZlckVycm9yO1xuICBzdGF0aWMgUGVybWlzc2lvbkRlbmllZEVycm9yID0gRXJyb3JzLlBlcm1pc3Npb25EZW5pZWRFcnJvcjtcbiAgc3RhdGljIFVucHJvY2Vzc2FibGVFbnRpdHlFcnJvciA9IEVycm9ycy5VbnByb2Nlc3NhYmxlRW50aXR5RXJyb3I7XG59XG5cbmV4cG9ydCBjb25zdCB7XG4gIEdyb3FFcnJvcixcbiAgQVBJRXJyb3IsXG4gIEFQSUNvbm5lY3Rpb25FcnJvcixcbiAgQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvcixcbiAgQVBJVXNlckFib3J0RXJyb3IsXG4gIE5vdEZvdW5kRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIFJhdGVMaW1pdEVycm9yLFxuICBCYWRSZXF1ZXN0RXJyb3IsXG4gIEF1dGhlbnRpY2F0aW9uRXJyb3IsXG4gIEludGVybmFsU2VydmVyRXJyb3IsXG4gIFBlcm1pc3Npb25EZW5pZWRFcnJvcixcbiAgVW5wcm9jZXNzYWJsZUVudGl0eUVycm9yLFxufSA9IEVycm9ycztcblxuZXhwb3J0IGltcG9ydCB0b0ZpbGUgPSBVcGxvYWRzLnRvRmlsZTtcbmV4cG9ydCBpbXBvcnQgZmlsZUZyb21QYXRoID0gVXBsb2Fkcy5maWxlRnJvbVBhdGg7XG5cbmV4cG9ydCBuYW1lc3BhY2UgR3JvcSB7XG4gIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgZXhwb3J0IGltcG9ydCB0b0ZpbGUgPSBVcGxvYWRzLnRvRmlsZTtcbiAgZXhwb3J0IGltcG9ydCBmaWxlRnJvbVBhdGggPSBVcGxvYWRzLmZpbGVGcm9tUGF0aDtcblxuICBleHBvcnQgaW1wb3J0IFJlcXVlc3RPcHRpb25zID0gQ29yZS5SZXF1ZXN0T3B0aW9ucztcblxuICBleHBvcnQgaW1wb3J0IENoYXQgPSBBUEkuQ2hhdDtcblxuICBleHBvcnQgaW1wb3J0IEF1ZGlvID0gQVBJLkF1ZGlvO1xuICBleHBvcnQgaW1wb3J0IFRyYW5zbGF0aW9uID0gQVBJLlRyYW5zbGF0aW9uO1xuXG4gIGV4cG9ydCBpbXBvcnQgTW9kZWxzID0gQVBJLk1vZGVscztcbiAgZXhwb3J0IGltcG9ydCBNb2RlbCA9IEFQSS5Nb2RlbDtcbiAgZXhwb3J0IGltcG9ydCBNb2RlbExpc3QgPSBBUEkuTW9kZWxMaXN0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBHcm9xO1xuIiwgImZ1bmN0aW9uIGFyb3VuZChvYmosIGZhY3Rvcmllcykge1xuICBjb25zdCByZW1vdmVycyA9IE9iamVjdC5rZXlzKGZhY3RvcmllcykubWFwKChrZXkpID0+IGFyb3VuZDEob2JqLCBrZXksIGZhY3Rvcmllc1trZXldKSk7XG4gIHJldHVybiByZW1vdmVycy5sZW5ndGggPT09IDEgPyByZW1vdmVyc1swXSA6IGZ1bmN0aW9uKCkge1xuICAgIHJlbW92ZXJzLmZvckVhY2goKHIpID0+IHIoKSk7XG4gIH07XG59XG5mdW5jdGlvbiBhcm91bmQxKG9iaiwgbWV0aG9kLCBjcmVhdGVXcmFwcGVyKSB7XG4gIGNvbnN0IGluaGVyaXRlZCA9IG9ialttZXRob2RdLCBoYWRPd24gPSBvYmouaGFzT3duUHJvcGVydHkobWV0aG9kKSwgb3JpZ2luYWwgPSBoYWRPd24gPyBpbmhlcml0ZWQgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iailbbWV0aG9kXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuICBsZXQgY3VycmVudCA9IGNyZWF0ZVdyYXBwZXIob3JpZ2luYWwpO1xuICBpZiAoaW5oZXJpdGVkKVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjdXJyZW50LCBpbmhlcml0ZWQpO1xuICBPYmplY3Quc2V0UHJvdG90eXBlT2Yod3JhcHBlciwgY3VycmVudCk7XG4gIG9ialttZXRob2RdID0gd3JhcHBlcjtcbiAgcmV0dXJuIHJlbW92ZTtcbiAgZnVuY3Rpb24gd3JhcHBlciguLi5hcmdzKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG9yaWdpbmFsICYmIG9ialttZXRob2RdID09PSB3cmFwcGVyKVxuICAgICAgcmVtb3ZlKCk7XG4gICAgcmV0dXJuIGN1cnJlbnQuYXBwbHkodGhpcywgYXJncyk7XG4gIH1cbiAgZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGlmIChvYmpbbWV0aG9kXSA9PT0gd3JhcHBlcikge1xuICAgICAgaWYgKGhhZE93bilcbiAgICAgICAgb2JqW21ldGhvZF0gPSBvcmlnaW5hbDtcbiAgICAgIGVsc2VcbiAgICAgICAgZGVsZXRlIG9ialttZXRob2RdO1xuICAgIH1cbiAgICBpZiAoY3VycmVudCA9PT0gb3JpZ2luYWwpXG4gICAgICByZXR1cm47XG4gICAgY3VycmVudCA9IG9yaWdpbmFsO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih3cmFwcGVyLCBpbmhlcml0ZWQgfHwgRnVuY3Rpb24pO1xuICB9XG59XG5mdW5jdGlvbiBkZWR1cGUoa2V5LCBvbGRGbiwgbmV3Rm4pIHtcbiAgY2hlY2tba2V5XSA9IGtleTtcbiAgcmV0dXJuIGNoZWNrO1xuICBmdW5jdGlvbiBjaGVjayguLi5hcmdzKSB7XG4gICAgcmV0dXJuIChvbGRGbltrZXldID09PSBrZXkgPyBvbGRGbiA6IG5ld0ZuKS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxufVxuZnVuY3Rpb24gYWZ0ZXIocHJvbWlzZSwgY2IpIHtcbiAgcmV0dXJuIHByb21pc2UudGhlbihjYiwgY2IpO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplKGFzeW5jRnVuY3Rpb24pIHtcbiAgbGV0IGxhc3RSdW4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgZnVuY3Rpb24gd3JhcHBlciguLi5hcmdzKSB7XG4gICAgcmV0dXJuIGxhc3RSdW4gPSBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIGFmdGVyKGxhc3RSdW4sICgpID0+IHtcbiAgICAgICAgYXN5bmNGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmdzKS50aGVuKHJlcywgcmVqKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHdyYXBwZXIuYWZ0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbGFzdFJ1biA9IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgYWZ0ZXIobGFzdFJ1biwgcmVzKTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbmV4cG9ydCB7IGFmdGVyLCBhcm91bmQsIGRlZHVwZSwgc2VyaWFsaXplIH07XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLHFDQUFBQSxVQUFBQyxTQUFBO0FBQUEsSUFBQUEsUUFBQTtBQUFBLE1BQ0UsTUFBUTtBQUFBLE1BQ1IsU0FBVztBQUFBLE1BQ1gsYUFBZTtBQUFBLE1BQ2YsTUFBUTtBQUFBLE1BQ1IsT0FBUztBQUFBLE1BQ1QsU0FBVztBQUFBLFFBQ1QsS0FBSztBQUFBLFVBQ0gsT0FBUztBQUFBLFVBQ1QsU0FBVztBQUFBLFVBQ1gsU0FBVztBQUFBLFFBQ2I7QUFBQSxRQUNBLFlBQVk7QUFBQSxRQUNaLGVBQWU7QUFBQSxRQUNmLHFCQUFxQjtBQUFBLFFBQ3JCLHdCQUF3QjtBQUFBLFFBQ3hCLHFCQUFxQjtBQUFBLFFBQ3JCLHdCQUF3QjtBQUFBLFFBQ3hCLGtCQUFrQjtBQUFBLE1BQ3BCO0FBQUEsTUFDQSxTQUFXO0FBQUEsUUFDVCxhQUFh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QUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUNBLElBQUksaUJBQWlCO0FBQUEsRUFDbkIsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUE7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQTtBQUFBLEVBQ0wsS0FBSztBQUFBO0FBQUEsRUFDTCxLQUFLO0FBQUE7QUFBQSxFQUNMLEtBQUs7QUFBQTtBQUFBLEVBQ0wsS0FBSztBQUFBO0FBQUEsRUFDTCxLQUFLO0FBQUE7QUFBQSxFQUNMLEtBQUs7QUFBQTtBQUFBLEVBQ0wsS0FBSztBQUFBO0FBQUEsRUFDTCxLQUFLO0FBQUE7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQTtBQUFBLEVBQ0wsS0FBSztBQUFBO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUE7QUFBQSxFQUNMLEtBQUs7QUFBQTtBQUNQO0FBRUEsSUFBSSxxQkFBcUI7QUFBQSxFQUN2QixTQUFTO0FBQUEsRUFDVCxLQUFLO0FBQUEsRUFDTCxPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxjQUFjO0FBQ2hCO0FBRUEsSUFBSSx1QkFBb0MsdUJBQU8sT0FBTztBQUFBLEVBQ3JELFdBQVc7QUFBQSxFQUNYLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULGNBQWM7QUFBQSxFQUNkLFNBQVM7QUFBQSxFQUNULEtBQUs7QUFBQSxFQUNMLFNBQVM7QUFDVixDQUFDO0FBRUQsSUFBSSxhQUEwQixzQ0FBc0Isb0JBQW9CO0FBRXhFLFNBQVMsUUFBUSxNQUFNLElBQUk7QUFDekIsTUFBSSxPQUFPLFNBQVM7QUFDbEIsV0FBTyxTQUFTLElBQUk7QUFNdEIsTUFBSSxrQkFBa0IsU0FBUyxTQUFTLFNBQVMsT0FBTyxXQUFXLE1BQU0sS0FBSyxVQUFVO0FBRXhGLE1BQUksV0FBVyxLQUFLLFlBQVk7QUFDaEMsTUFBSSxPQUFPLEtBQUssWUFBWSxLQUFLO0FBQ2pDLE1BQUksT0FBTyxLQUFLO0FBQ2hCLE1BQUksT0FBTyxLQUFLLFFBQVE7QUFHeEIsTUFBSSxRQUFRLEtBQUssUUFBUSxHQUFHLE1BQU07QUFDaEMsV0FBTyxNQUFNLE9BQU87QUFHdEIsT0FBSyxPQUFPLE9BQVEsV0FBVyxPQUFPLE9BQVEsT0FBTyxPQUFPLE1BQU0sT0FBTyxNQUFNO0FBQy9FLE9BQUssVUFBVSxLQUFLLFVBQVUsT0FBTyxZQUFZO0FBQ2pELE9BQUssVUFBVSxLQUFLLFdBQVcsQ0FBQztBQUloQyxNQUFJLE1BQU0sSUFBSSxjQUFjLElBQUk7QUFDaEMsTUFBSTtBQUNGLFFBQUksR0FBRyxZQUFZLEVBQUU7QUFDdkIsU0FBTztBQUNUO0FBRUEsU0FBUyxJQUFJLE1BQU0sSUFBSTtBQUNyQixNQUFJLE1BQU0sUUFBUSxNQUFNLEVBQUU7QUFDMUIsTUFBSSxJQUFJO0FBQ1IsU0FBTztBQUNUO0FBRUEsU0FBUyxRQUFRO0FBQUM7QUFDbEIsTUFBTSxvQkFBb0I7QUFFMUIsSUFBSSxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUNBLElBQUksZUFBZTtBQUFBLEVBQ2pCLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQSxFQUNMLEtBQUs7QUFBQTtBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxLQUFLO0FBQUEsRUFDTCxL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QWlCO0FBQUEsY0FDakIsbUJBQW1CO0FBQUEsY0FDbkIsU0FBUztBQUFBLGNBQ1QsTUFBTTtBQUFBLGNBQ04sUUFBUTtBQUFBLGNBQ1IsV0FBVztBQUFBLGNBQ1gsU0FBUztBQUFBLGNBQ1QsZ0JBQWdCO0FBQUEsY0FDaEIsZ0JBQWdCO0FBQUEsY0FDaEIsV0FBVztBQUFBLGNBQ1gsWUFBWTtBQUFBLGNBQ1osU0FBUztBQUFBLGNBQ1Qsc0JBQXNCO0FBQUEsY0FDdEIsYUFBYTtBQUFBLGNBQ2IsVUFBVTtBQUFBLGNBQ1Ysb0JBQW9CO0FBQUEsY0FDcEIsZUFBZTtBQUFBLGNBQ2YsVUFBVTtBQUFBLGNBQ1YsVUFBVTtBQUFBLGNBQ1YsZ0JBQWdCO0FBQUEsY0FDaEIsa0JBQWtCO0FBQUEsY0FDbEIsNEJBQTRCO0FBQUEsY0FDNUIsY0FBYztBQUFBLGNBQ2QsdUJBQXVCO0FBQUEsY0FDdkIscUJBQXFCO0FBQUEsY0FDckIsbUJBQW1CO0FBQUEsY0FDbkIsZ0JBQWdCO0FBQUEsY0FDaEIsaUJBQWlCO0FBQUEsY0FDakIsY0FBYztBQUFBLGNBQ2QsZUFBZTtBQUFBLGNBQ2YsZUFBZTtBQUFBLGNBQ2YsYUFBYTtBQUFBLGNBQ2IsbUJBQW1CO0FBQUEsY0FDbkIsaUJBQWlCO0FBQUEsY0FDakIsb0JBQW9CO0FBQUEsY0FDcEIsa0JBQWtCO0FBQUEsY0FDbEIsYUFBYTtBQUFBLGNBQ2Isa0JBQWtCO0FBQUEsY0FDbEIsZ0JBQWdCO0FBQUEsY0FDaEIsZ0JBQWdCO0FBQUEsY0FDaEIsY0FBYztBQUFBLGNBQ2QsV0FBVztBQUFBLGNBQ1gsZ0JBQWdCO0FBQUEsY0FDaEIsb0JBQW9CO0FBQUEsY0FDcEIseUJBQXlCO0FBQUEsY0FDekIsa0JBQWtCO0FBQUEsY0FDbEIsYUFBYTtBQUFBLGNBQ2IsV0FBVztBQUFBLGNBQ1gsdUJBQXVCO0FBQUEsY0FDdkIscUJBQXFCO0FBQUEsY0FDckIsWUFBWTtBQUFBLGNBQ1osVUFBVTtBQUFBLGNBQ1YsaUJBQWlCO0FBQUEsY0FDakIsZUFBZTtBQUFBLGNBQ2YsdUJBQXVCO0FB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aW9uIiwgInBhcnNlIiwgImVyciIsICJrZXlzIiwgImVycm9yIiwgImRlYnVnIiwgInBhdGgiLCAiY29uZmlnIiwgImEiLCAiQnVmZmVyIiwgImZpbGwiLCAidG9TdHJpbmciLCAic3RyIiwgImNvbXBhcmUiLCAicmVhZCIsICJpIiwgIndyaXRlIiwgImJ5dGVMZW5ndGgiLCAiZSIsICJ2ZXJzaW9uIiwgImluaGVyaXRzIiwgImluc3BlY3QiLCAieCIsICJtc2ciLCAia2V5cyIsICJiYXNlIiwgInNlbGYiLCAibGlzdGVuZXJzIiwgImVtaXQiLCAiZG9tYWluIiwgImVyciIsICJhZGRMaXN0ZW5lciIsICJvbmNlIiwgInJlbW92ZUxpc3RlbmVyIiwgInJlbW92ZUFsbExpc3RlbmVycyIsICJjb3B5IiwgInByZXBlbmRMaXN0ZW5lciIsICJvbmVuZCIsICJpbmRleE9mIiwgInhociIsICJoZWFkZXIiLCAic3RhdHVzIiwgInJhbmsiLCAiZnJvbSIsICJjb2RlcyIsICJmbG93IiwgImVycm9yIiwgImtpbmQiLCAiX191bnVzZWRfd2VicGFja19tb2R1bGUiLCAiZXhwb3J0cyIsICJhc3NlcnQiLCAiQmFzZUV4Y2VwdGlvbiIsICJtYXAiLCAiX2EiLCAid29ya2VyIiwgIl9iIiwgImRvbmUiLCAiZm9udCIsICJvYmoiLCAiX193X3BkZmpzX3JlcXVpcmVfXyIsICJfdXRpbCIsICJfZGlzcGxheV91dGlscyIsICJyZXF1ZXN0IiwgIl9pc19ub2RlIiwgImRhdGEiLCAib2Zmc2V0WCIsICJvZmZzZXRZIiwgImsiLCAiZWxlbSIsICJvbiIsICJvZmYiLCAiZWRpdG9yIiwgIm1vZHVsZSIsICJiZXppZXIiLCAidE1heCIsICJ0TWluIiwgIl9hbm5vdGF0aW9uX3N0b3JhZ2UiLCAiY2hlY2tlZCIsICJ0aXRsZSIsICJfeGZhX3RleHQiLCAiY3JjVGFibGUiLCAiY3JjMzIiLCAiYWRsZXIzMiIsICJkZWZsYXRlU3luYyIsICJlbmNvZGUiLCAiY29udmVydEltZ0RhdGFUb1BuZyIsICJfd29ya2VyX29wdGlvbnMiLCAiZmV0Y2giLCAiUmVxdWVzdCIsICJSZXNwb25zZSIsICJIZWFkZXJzIiwgIkZvcm1EYXRhIiwgIkJsb2IiLCAiRmlsZSIsICJSZWFkYWJsZVN0cmVhbSIsICJlcnJvciIsICJzdGF0dXMiLCAiZXJyb3IiLCAibXNnIiwgIlN0cmVhbSIsICJkb25lIiwgInF1ZXVlIiwgInNlbGYiLCAiUmVhZGFibGVTdHJlYW0iLCAiZXJyIiwgIl9hIiwgInN0ciIsICJkZWxpbWl0ZXIiLCAiX2EiLCAiRmlsZSIsICJGb3JtRGF0YSIsICJkZWJ1ZyIsICJTdHJlYW0iLCAiZmV0Y2giLCAib3B0cyIsICJQYWdlIiwgIl9hIiwgInJlcXVlc3QiLCAic3RhdHVzIiwgImVycm9yIiwgInJldHJ5TWVzc2FnZSIsICJlcnIiLCAiaW5pdCIsICJwbGF0Zm9ybSIsICJlbnYiLCAiX2EiLCAiZGVidWciLCAiX2EiLCAiX2EiLCAiX2EiLCAiQ29tcGxldGlvbnMiLCAiQ2hhdCIsICJTcGVlY2giLCAiVHJhbnNjcmlwdGlvbnMiLCAiVHJhbnNsYXRpb25zIiwgIkF1ZGlvIiwgIkJhdGNoZXMiLCAiQXNzaXN0YW50cyIsICJlcnJvciIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCAiX2EiLCAiZW1pdCIsICJsaXN0ZW5lcnMiLCAiY29udGVudCIsICJfQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcl9nZXRGaW5hbE1lc3NhZ2UiLCAiX0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJfZ2V0RmluYWxGdW5jdGlvbkNhbGwiLCAiX0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJfZ2V0RmluYWxGdW5jdGlvbkNhbGxSZXN1bHQiLCAiX0Fic3RyYWN0Q2hhdENvbXBsZXRpb25SdW5uZXJfY2FsY3VsYXRlVG90YWxVc2FnZSIsICJfQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcl92YWxpZGF0ZVBhcmFtcyIsICJfQWJzdHJhY3RDaGF0Q29tcGxldGlvblJ1bm5lcl9zdHJpbmdpZnlGdW5jdGlvbkNhbGxSZXN1bHQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZEdldCIsICJfYSIsICJTdHJlYW0iLCAiX0NoYXRDb21wbGV0aW9uU3RyZWFtX2JlZ2luUmVxdWVzdCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwgIl9DaGF0Q29tcGxldGlvblN0cmVhbV9hZGRDaHVuayIsICJfQ2hhdENvbXBsZXRpb25TdHJlYW1fZW5kUmVxdWVzdCIsICJfQ2hhdENvbXBsZXRpb25TdHJlYW1fYWNjdW11bGF0ZUNoYXRDb21wbGV0aW9uIiwgImNvbnRlbnQiLCAicmVzdCIsICJfYiIsICJpbmRleCIsICJfYyIsICJkb25lIiwgImVyciIsICJjaHVuayIsICJpZCIsICJDb21wbGV0aW9ucyIsICJDaGF0IiwgIkNvbXBsZXRpb25zIiwgImVycm9yIiwgIl9fY2xhc3NQcml2YXRlRmllbGRTZXQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZEdldCIsICJsaXN0ZW5lcnMiLCAiZG9uZSIsICJlcnIiLCAiY2h1bmsiLCAiU3RyZWFtIiwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCAiX2EiLCAiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsICJfQXNzaXN0YW50U3RyZWFtX2VuZFJlcXVlc3QiLCAiX0Fzc2lzdGFudFN0cmVhbV9oYW5kbGVNZXNzYWdlIiwgIl9Bc3Npc3RhbnRTdHJlYW1faGFuZGxlUnVuU3RlcCIsICJfQXNzaXN0YW50U3RyZWFtX2hhbmRsZUV2ZW50IiwgIl9Bc3Npc3RhbnRTdHJlYW1fYWNjdW11bGF0ZVJ1blN0ZXAiLCAiX0Fzc2lzdGFudFN0cmVhbV9hY2N1bXVsYXRlTWVzc2FnZSIsICJfQXNzaXN0YW50U3RyZWFtX2FjY3VtdWxhdGVDb250ZW50IiwgIl9Bc3Npc3RhbnRTdHJlYW1faGFuZGxlUnVuIiwgIk1lc3NhZ2VzIiwgIlN0ZXBzIiwgIl9hIiwgIlJ1bnMiLCAiX2EiLCAiVGhyZWFkcyIsICJGaWxlcyIsICJfYSIsICJGaWxlQmF0Y2hlcyIsICJWZWN0b3JTdG9yZXMiLCAiQ2hhdCIsICJCZXRhIiwgIkNvbXBsZXRpb25zIiwgIl9hIiwgIkVtYmVkZGluZ3MiLCAiRmlsZXMiLCAiQ2hlY2twb2ludHMiLCAiSm9icyIsICJGaW5lVHVuaW5nIiwgIkltYWdlcyIsICJNb2RlbHMiLCAiTW9kZXJhdGlvbnMiLCAiX2EiLCAiQ29tcGxldGlvbnMiLCAiRmlsZXMiLCAiT3BlbkFJRXJyb3IiLCAiQVBJRXJyb3IiLCAiQVBJQ29ubmVjdGlvbkVycm9yIiwgIkFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IiLCAiQVBJVXNlckFib3J0RXJyb3IiLCAiTm90Rm91bmRFcnJvciIsICJDb25mbGljdEVycm9yIiwgIlJhdGVMaW1pdEVycm9yIiwgIkJhZFJlcXVlc3RFcnJvciIsICJBdXRoZW50aWNhdGlvbkVycm9yIiwgIkludGVybmFsU2VydmVyRXJyb3IiLCAiUGVybWlzc2lvbkRlbmllZEVycm9yIiwgIlVucHJvY2Vzc2FibGVFbnRpdHlFcnJvciIsICJPcGVuQUkiLCAiQ29tcGxldGlvbnMiLCAiRmlsZXMiLCAiVkVSU0lPTiIsICJhdXRvIiwgImtpbmQiLCAiZmV0Y2giLCAiUmVxdWVzdCIsICJSZXNwb25zZSIsICJIZWFkZXJzIiwgIkZvcm1EYXRhIiwgIkJsb2IiLCAiRmlsZSIsICJSZWFkYWJsZVN0cmVhbSIsICJnZXRNdWx0aXBhcnRSZXF1ZXN0T3B0aW9ucyIsICJnZXREZWZhdWx0QWdlbnQiLCAiZmlsZUZyb21QYXRoIiwgImlzRnNSZWFkU3RyZWFtIiwgInNldFNoaW1zIiwgIk11bHRpcGFydEJvZHkiLCAiZ2V0UnVudGltZSIsICJlcnJvciIsICJNdWx0aXBhcnRCb2R5IiwgImtpbmQiLCAic2V0U2hpbXMiLCAiZ2V0UnVudGltZSIsICJlcnJvcl9leHBvcnRzIiwgIkFQSUNvbm5lY3Rpb25FcnJvciIsICJBUElDb25uZWN0aW9uVGltZW91dEVycm9yIiwgIkFQSUVycm9yIiwgIkFQSVVzZXJBYm9ydEVycm9yIiwgIkF1dGhlbnRpY2F0aW9uRXJyb3IiLCAiQmFkUmVxdWVzdEVycm9yIiwgIkNvbmZsaWN0RXJyb3IiLCAiSW50ZXJuYWxTZXJ2ZXJFcnJvciIsICJOb3RGb3VuZEVycm9yIiwgIlBlcm1pc3Npb25EZW5pZWRFcnJvciIsICJSYXRlTGltaXRFcnJvciIsICJVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IiLCAiQVBJRXJyb3IiLCAic3RhdHVzIiwgImVycm9yIiwgIm1zZyIsICJBUElDb25uZWN0aW9uRXJyb3IiLCAiY2FzdFRvRXJyb3IiLCAiQmFkUmVxdWVzdEVycm9yIiwgIkF1dGhlbnRpY2F0aW9uRXJyb3IiLCAiUGVybWlzc2lvbkRlbmllZEVycm9yIiwgIk5vdEZvdW5kRXJyb3IiLCAiQ29uZmxpY3RFcnJvciIsICJVbnByb2Nlc3NhYmxlRW50aXR5RXJyb3IiLCAiUmF0ZUxpbWl0RXJyb3IiLCAiSW50ZXJuYWxTZXJ2ZXJFcnJvciIsICJBUElVc2VyQWJvcnRFcnJvciIsICJBUElDb25uZWN0aW9uVGltZW91dEVycm9yIiwgIlN0cmVhbSIsICJTU0VEZWNvZGVyIiwgIkxpbmVEZWNvZGVyIiwgInJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYWJsZSIsICJkb25lIiwgIkFQSUVycm9yIiwgInF1ZXVlIiwgInNlbGYiLCAiUmVhZGFibGVTdHJlYW0iLCAiZXJyIiwgIl9hIiwgInBhcnRpdGlvbiIsICJzdHIiLCAiZGVsaW1pdGVyIiwgImlzUmVzcG9uc2VMaWtlIiwgImlzRmlsZUxpa2UiLCAiaXNCbG9iTGlrZSIsICJpc1VwbG9hZGFibGUiLCAiaXNGc1JlYWRTdHJlYW0iLCAidG9GaWxlIiwgIl9hIiwgIkZpbGUiLCAiZ2V0Qnl0ZXMiLCAiZ2V0TmFtZSIsICJpc0FzeW5jSXRlcmFibGVJdGVyYXRvciIsICJwcm9wc0ZvckVycm9yIiwgImdldFN0cmluZ0Zyb21NYXliZUJ1ZmZlciIsICJpc011bHRpcGFydEJvZHkiLCAibXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zIiwgImNyZWF0ZUZvcm0iLCAiZ2V0TXVsdGlwYXJ0UmVxdWVzdE9wdGlvbnMiLCAiRm9ybURhdGEiLCAiYWRkRm9ybVZhbHVlIiwgImFkZEZvcm1WYWx1ZSIsICJpc1VwbG9hZGFibGUiLCAidG9GaWxlIiwgImRlZmF1bHRQYXJzZVJlc3BvbnNlIiwgImRlYnVnIiwgIlN0cmVhbSIsICJBUElQcm9taXNlIiwgIkFQSUNsaWVudCIsICJ2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlciIsICJmZXRjaCIsICJnZXRQbGF0Zm9ybUhlYWRlcnMiLCAidXVpZDQiLCAib3B0cyIsICJQYWdlIiwgImlzTXVsdGlwYXJ0Qm9keSIsICJfYSIsICJnZXREZWZhdWx0QWdlbnQiLCAiYXBwbHlIZWFkZXJzTXV0IiwgImtpbmQiLCAicmVxdWVzdCIsICJzdGF0dXMiLCAiZXJyb3IiLCAiQVBJRXJyb3IiLCAiQVBJVXNlckFib3J0RXJyb3IiLCAiY2FzdFRvRXJyb3IiLCAiQVBJQ29ubmVjdGlvblRpbWVvdXRFcnJvciIsICJBUElDb25uZWN0aW9uRXJyb3IiLCAiY3JlYXRlUmVzcG9uc2VIZWFkZXJzIiwgInJldHJ5TWVzc2FnZSIsICJzYWZlSlNPTiIsICJlcnIiLCAiUGFnZVByb21pc2UiLCAiaXNBYnNvbHV0ZVVSTCIsICJpc0VtcHR5T2JqIiwgImluaXQiLCAic2xlZXAiLCAiVkVSU0lPTiIsICJBYnN0cmFjdFBhZ2UiLCAiX0Fic3RyYWN0UGFnZV9jbGllbnQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgImdldFBsYXRmb3JtUHJvcGVydGllcyIsICJWRVJTSU9OIiwgIm5vcm1hbGl6ZVBsYXRmb3JtIiwgIm5vcm1hbGl6ZUFyY2giLCAiZ2V0QnJvd3NlckluZm8iLCAicGxhdGZvcm0iLCAiX3BsYXRmb3JtSGVhZGVycyIsICJnZXRQbGF0Zm9ybUhlYWRlcnMiLCAic2FmZUpTT04iLCAiZXJyIiwgInN0YXJ0c1dpdGhTY2hlbWVSZWdleHAiLCAiaXNBYnNvbHV0ZVVSTCIsICJzbGVlcCIsICJ2YWxpZGF0ZVBvc2l0aXZlSW50ZWdlciIsICJjYXN0VG9FcnJvciIsICJyZWFkRW52IiwgImVudiIsICJfYSIsICJpc0VtcHR5T2JqIiwgImhhc093biIsICJhcHBseUhlYWRlcnNNdXQiLCAiZGVidWciLCAidXVpZDQiLCAiaXNSdW5uaW5nSW5Ccm93c2VyIiwgIkFQSVJlc291cmNlIiwgIkNvbXBsZXRpb25zIiwgIkFQSVJlc291cmNlIiwgIl9hIiwgIkNoYXQiLCAiQVBJUmVzb3VyY2UiLCAiQ29tcGxldGlvbnMiLCAiTW9kZWxzIiwgIkFQSVJlc291cmNlIiwgIlRyYW5zY3JpcHRpb25zIiwgIkFQSVJlc291cmNlIiwgIm11bHRpcGFydEZvcm1SZXF1ZXN0T3B0aW9ucyIsICJUcmFuc2xhdGlvbnMiLCAiQVBJUmVzb3VyY2UiLCAibXVsdGlwYXJ0Rm9ybVJlcXVlc3RPcHRpb25zIiwgIkF1ZGlvIiwgIkFQSVJlc291cmNlIiwgIlRyYW5zY3JpcHRpb25zIiwgIlRyYW5zbGF0aW9ucyIsICJBUElDbGllbnQiLCAicmVhZEVudiIsICJfYSIsICJpc1J1bm5pbmdJbkJyb3dzZXIiLCAiQ2hhdCIsICJBdWRpbyIsICJNb2RlbHMiLCAiQVBJRXJyb3IiLCAiQVBJQ29ubmVjdGlvbkVycm9yIiwgIkFQSUNvbm5lY3Rpb25UaW1lb3V0RXJyb3IiLCAiQVBJVXNlckFib3J0RXJyb3IiLCAiTm90Rm91bmRFcnJvciIsICJDb25mbGljdEVycm9yIiwgIlJhdGVMaW1pdEVycm9yIiwgIkJhZFJlcXVlc3RFcnJvciIsICJBdXRoZW50aWNhdGlvbkVycm9yIiwgIkludGVybmFsU2VydmVyRXJyb3IiLCAiUGVybWlzc2lvbkRlbmllZEVycm9yIiwgIlVucHJvY2Vzc2FibGVFbnRpdHlFcnJvciIsICJHcm9xRXJyb3IiLCAiZXJyb3JfZXhwb3J0cyIsICJHcm9xIiwgInRvRmlsZSIsICJmaWxlRnJvbVBhdGgiLCAiQ2hhdCIsICJBdWRpbyIsICJNb2RlbHMiLCAiX2EiLCAiZGF0YSIsICJlcnJvciIsICJtb2RlbCIsICJub2RlIiwgImZpbGVfcGF0aCIsICJlcnIiLCAicXVldWUiLCAibm9kZV9jb250ZW50Il0KfQo= diff --git a/main.ts b/main.ts index 32f1b9d..0ca4ccc 100644 --- a/main.ts +++ b/main.ts @@ -538,6 +538,10 @@ class MainChat extends ItemView { export default class MyPlugin extends Plugin { settings: MyPluginSettings; + canvas_patched: boolean = false; + selected_node_colors: any = {}; + color_picker_open_on_last_click: boolean = false; + async onload() { this.addCommand({ id: "patch-menu", @@ -546,10 +550,16 @@ export default class MyPlugin extends Plugin { this.patchCanvasMenu(); }, }); + this.registerEvent(this.app.workspace.on("layout-change", () => {})); + const that = this; + this.registerEvent( this.app.workspace.on("active-leaf-change", () => { const currentLeaf = this.app.workspace.activeLeaf; + if (currentLeaf?.view.getViewType() === "canvas") { + const canvas = currentLeaf.view; + this.patchCanvasMenu(); } }) @@ -562,13 +572,14 @@ export default class MyPlugin extends Plugin { this.addSidebarTab(); this.addCommand({ - id: "log", + id: "caret-log", name: "Log", callback: async () => { const currentLeaf = this.app.workspace.activeLeaf; if (currentLeaf?.view.getViewType() === "canvas") { const canvasView = currentLeaf.view; const canvas = (canvasView as any).canvas; + console.log(canvas); const viewportNodes = canvas.getViewportNodes(); } }, @@ -761,43 +772,6 @@ export default class MyPlugin extends Plugin { } } - function parseCustomXML(xmlString: string) { - // Function to extract content between tags - function getContent(tag: string, string: string) { - const openTag = `<${tag}>`; - const closeTag = ``; - const start = string.indexOf(openTag) + openTag.length; - const end = string.indexOf(closeTag); - return string.substring(start, end).trim(); - } - - // Extract conversation ID - const conversationId = getContent("id", xmlString); - - // Initialize the result object with metadata - const result = { - metadata: { - id: conversationId, - }, - conversation: { - messages: [], - }, - }; - - // Extract messages - const messagesContent = getContent("conversation", xmlString); - const messageTags = messagesContent.split("").slice(0, -1); // Split and remove last empty element - - for (const messageTag of messageTags) { - const role = getContent("role", messageTag); - const content = getContent("content", messageTag); - //@ts-ignore // TODO - Remove this and fix it - result.conversation.messages.push({ role, content }); - } - - return result; - } - this.addCommand({ id: "open-chat", name: "Open Chat", @@ -860,20 +834,96 @@ export default class MyPlugin extends Plugin { }); } + async highlight_lineage() { + await new Promise((resolve) => setTimeout(resolve, 200)); // Sleep for 200 milliseconds + console.log("Running highlight lineage"); + + const canvas_view = this.app.workspace.getLeavesOfType("canvas").first()?.view; + if (!canvas_view) { + return; + } + const canvas = (canvas_view as any).canvas; // Assuming canvas is a property of the view + + const selection = canvas.selection; + const selection_iterator = selection.values(); + const node = selection_iterator.next().value; + if (!node) { + return; + } + const nodes_iterator = canvas.nodes.values(); + const nodes_array = Array.from(nodes_iterator); + const canvas_data = canvas.getData(); + const { edges, nodes } = canvas_data; + const longest_lineage = await this.getLongestLineage(nodes, edges, node.id); + + // Create a set to track lineage node IDs for comparison + const lineage_node_ids = new Set(longest_lineage.map((node) => node.id)); + + // Iterate through all nodes in the longest lineage + for (const lineage_node of longest_lineage) { + const lineage_id = lineage_node.id; + const lineage_color = lineage_node.color; + // Only store and change the color if it's not already stored + if (!this.selected_node_colors.hasOwnProperty(lineage_id)) { + this.selected_node_colors[lineage_id] = lineage_color; // Store the current color with node's id as key + const filtered_nodes = nodes_array.filter((node) => node.id === lineage_id); + filtered_nodes.forEach((node) => { + node.color = "4"; // Reset the node color to its original + node.render(); // Re-render the node to apply the color change + }); + } + } + + // Reset and remove nodes not in the current lineage + Object.keys(this.selected_node_colors).forEach((node_id) => { + if (!lineage_node_ids.has(node_id)) { + const original_color = this.selected_node_colors[node_id]; + const filtered_nodes = nodes_array.filter((node) => node.id === node_id); + filtered_nodes.forEach((node) => { + node.color = original_color; // Reset the node color to its original + node.render(); // Re-render the node to apply the color change + }); + delete this.selected_node_colors[node_id]; // Remove from tracking object + } + }); + + console.log(this.selected_node_colors); // Log out the stored colors + } + async unhighlight_lineage(event: any) { + const canvas_view = this.app.workspace.getLeavesOfType("canvas").first()?.view; + if (!canvas_view) { + return; + } + console.log("Running in unhighlight_lineage"); + const canvas = (canvas_view as any).canvas; + const nodes_iterator = canvas.nodes.values(); + const nodes_array = Array.from(nodes_iterator); + + for (const node_id in this.selected_node_colors) { + console.log("Resetting color"); + const filtered_nodes = nodes_array.filter((node) => node.id === node_id); + filtered_nodes.forEach((node) => { + node.color = this.selected_node_colors[node_id]; // Reset the node color to its original + node.render(); // Re-render the node to apply the color change + }); + } + this.selected_node_colors = {}; // Clear the stored colors after resetting + console.log(); + } patchCanvasMenu() { const canvasView = this.app.workspace.getLeavesOfType("canvas").first()?.view; if (!canvasView) { return; } const canvas = canvasView.canvas; + // console.log(canvas); - const menu = canvasView.canvas.menu; + const menu = canvas.menu; if (!menu) { console.error("No menu found on the canvas"); return; } const that = this; // Capture the correct 'this' context. - const menuUninstaller = around(menu.constructor.prototype, { render: (next: any) => function (...args: any) { @@ -884,6 +934,34 @@ export default class MyPlugin extends Plugin { return result; }, }); + this.register(menuUninstaller); + if (!this.canvas_patched) { + // Define the functions to be patched + const functions = { + onDoubleClick: (next: any) => + function (event: MouseEvent) { + next.call(this, event); + }, + onPointerdown: (next: any) => + function (event: MouseEvent) { + const isNode = event.target.closest(".canvas-node"); + const canvas_color_picker_item = document.querySelector( + '.clickable-icon button[aria-label="Set Color"]' + ); + + if (isNode) { + that.highlight_lineage(event); + } else { + that.unhighlight_lineage(event); + } + + next.call(this, event); + }, + }; + const doubleClickPatcher = around(canvas.constructor.prototype, functions); + this.register(doubleClickPatcher); + } + canvasView.scope?.register(["Mod", "Shift"], "ArrowUp", () => { that.create_directional_node(canvas, "top"); }); @@ -920,48 +998,19 @@ export default class MyPlugin extends Plugin { that.run_graph_chat(canvas); }); - // const canvasViewunistaller = around(canvasView.constructor.prototype, { - // onOpen: (next) => - // async function () { - // if (true) { - // console.log(this.scope); - // this.scope.register(["Mod"], "ArrowUp", () => { - // that.navigate(this.canvas, "top"); - // }); - // this.scope.register(["Mod"], "ArrowDown", () => { - // that.navigate(this.canvas, "bottom"); - // }); - // this.scope.register(["Mod"], "ArrowLeft", () => { - // that.navigate(this.canvas, "left"); - // }); - // this.scope.register(["Mod"], "ArrowRight", () => { - // that.navigate(this.canvas, "right"); - // }); - // this.scope.register(["Mod"], "Enter", () => { - // that.start_editing_node(this.canvas); - // }); - // } - // this.scope.register(["Mod", "Shift"], "ArrowUp", () => { - // that.create_directional_node(this.canvas, "top"); - // }); - // this.scope.register(["Mod", "Shift"], "ArrowDown", () => { - // that.create_directional_node(this.canvas, "bottom"); - // }); - // this.scope.register(["Mod", "Shift"], "ArrowLeft", () => { - // that.create_directional_node(this.canvas, "left"); - // }); - // this.scope.register(["Mod", "Shift"], "ArrowRight", () => { - // that.create_directional_node(this.canvas, "right"); - // }); - // this.scope.register(["Mod", "Shift"], "Enter", () => { - // that.run_graph_chat(this.canvas); - // }); - - // return next.call(this); - // }, - // }); + if (!this.canvas_patched) { + // @ts-ignore + canvasView.leaf.rebuildView(); + this.canvas_patched = true; + } - this.register(menuUninstaller); + // this.app.workspace.iterateAllLeaves((leaf: WorkspaceLeaf) => { + // if (leaf.view.getViewType() !== "canvas") return; + // const canvasView = leaf.view as CanvasView; + // // @ts-ignore + + // canvasView.leaf.rebuildView(); + // }); } create_directional_node(canvas: any, direction: string) { const selection = canvas.selection; @@ -1146,6 +1195,30 @@ export default class MyPlugin extends Plugin { canvas.selectOnly(target_node); canvas.zoomToSelection(); } + this.highlight_lineage(); + } + parseCustomXML(xmlString: string, tags: string[]) { + console.log("In parse custom"); + console.log({ tags, xmlString }); + // Function to extract content between tags + function getContent(tag: string, string: string) { + const openTag = `<${tag}>`; + const closeTag = ``; + const start = string.indexOf(openTag) + openTag.length; + const end = string.indexOf(closeTag); + return string.substring(start, end).trim(); + } + + // Initialize the result object + const result = {}; + + // Extract content for each tag provided + tags.forEach((tag) => { + const content = getContent(tag, xmlString); + result[tag] = content; + }); + + return result; } async extractTextFromPDF(file_name: string): Promise { // pdfjs.GlobalWorkerOptions.workerSrc = "pdf.worker.js"; @@ -1200,11 +1273,9 @@ export default class MyPlugin extends Plugin { const canvasView = this.app.workspace.getLeavesOfType("canvas").first()?.view; const canvas = canvasView.canvas; - console.log(canvas); const selection = canvas.selection; const selectionIterator = selection.values(); const node = selectionIterator.next().value; - console.log(node); const x = node.x + node.width + 200; this.childNode(canvas, node, x, node.y, "user"); }); @@ -1310,8 +1381,22 @@ export default class MyPlugin extends Plugin { } async get_ref_blocks_content(node: any): Promise { + console.log("Running in ref blocks. This is the node"); + console.log({ node }); let rep_block_content = ""; - const ref_blocks = node.text.match(/\[\[.*?\]\]/g) || []; + console.log(node.text); + let ref_blocks; + if (!node.text) { + return ""; + } + try { + ref_blocks = node.text.match(/\[\[.*?\]\]/g) || []; + } catch (error) { + console.error(node); + console.error(node.text); + throw error; + } + const inner_texts = ref_blocks.map((block: string) => block.slice(2, -2)); const files = this.app.vault.getFiles(); @@ -1321,171 +1406,301 @@ export default class MyPlugin extends Plugin { const text = await this.app.vault.cachedRead(foundFile); rep_block_content += `Title: ${file_name}\n${text}\n\n`; } else { - console.log("File not found for:", file_name); + console.error("File not found for:", file_name); } } rep_block_content = rep_block_content.trim(); return rep_block_content; } - addAIButtonIfNeeded(menuEl: HTMLElement) { - if (!menuEl.querySelector(".gpt-menu-item")) { - const buttonEl = createEl("button", "clickable-icon gpt-menu-item"); - setTooltip(buttonEl, "Sparkle", { placement: "top" }); - setIcon(buttonEl, "lucide-sparkles"); - buttonEl.addEventListener("click", async () => { - const canvasView = this.app.workspace.getLeavesOfType("canvas").first()?.view; - const canvas = canvasView.canvas; - await canvas.requestSave(true); - const selection = canvas.selection; - const selectionIterator = selection.values(); - const node = selectionIterator.next().value; - - // const file_name = "Attention is All Your Need"; - // const files = await this.app.vault.getFiles(); - // const foundFile = files.find((file) => file.basename === file_name); - // const pdf_text = await this.extractTextFromPDF(foundFile); - // await node.blur(); - // await node.blur(); - const canvas_data = canvas.getData(); - const { edges, nodes } = canvas_data; - console.log(canvas_data); - - // const ancestors = this.get_ancestors(nodes, edges, node.id); - // const all_ancestors = this.getAllAncestorNodes(nodes, edges, node.id); - const longest_lineage = this.getLongestLineage(nodes, edges, node.id); - - const ancestors_with_context = this.getDirectAncestorsWithContext(nodes, edges, node.id); - const ref_blocks = await this.get_ref_blocks_content(node); - let added_context = ``; - for (let i = 0; i < ancestors_with_context.length; i++) { - const node = ancestors_with_context[i]; - added_context += node.text + "\n"; - } - if (ref_blocks.length > 1) { - added_context += `\n ${ref_blocks}`; - } - added_context = added_context.trim(); - let conversation = []; - console.log("Here"); - for (let i = 0; i < longest_lineage.length; i++) { - const node = longest_lineage[i]; - let text = ""; - console.log(node); - if (node.type === "text") { - text = node.text; - } else if (node.type === "file" && node.file.includes(".pdf")) { - const file_name = node.file; - // const files = await this.app.vault.getFiles(); - // const foundFile = files.find((file) => file.basename === file_name); - text = await this.extractTextFromPDF(file_name); - console.log("Got text"); - console.log(text); - added_context += text; - const role = "assistant"; - const message = { - role, - content: text, - }; - conversation.push(message); - continue; - } + async sparkle(node_id: string) { + const canvas_view = this.app.workspace.getLeavesOfType("canvas").first()?.view; + if (!canvas_view) { + console.error("No canvas view found."); + return; + } + const canvas = canvas_view.canvas; - const userRegex = /User<\/role>/i; - const assistantRegex = /assistant<\/role>/i; + await canvas.requestSave(true); + const canvas_data = canvas.getData(); + const { edges, nodes } = canvas_data; + const nodes_iterator = canvas.nodes.values(); + let node = null; + console.log(node_id); + for (const node_objs of nodes_iterator) { + console.log(node_objs); + if (node_objs.id === node_id) { + node = node_objs; + break; + } + } + if (!node) { + console.error("Node not found with ID:", node_id); + return; + } - if (userRegex.test(text)) { - const split_text = text.split(userRegex); - const role = "user"; - let content = split_text[1].trim(); - // Only for the first node - if (added_context.length > 1 && i === 0) { - content += `\n${added_context}`; + // Continue with operations on `target_node` + console.log("Found node:"); + console.log(node); + if (node.hasOwnProperty("file")) { + console.log("Node has a 'file' attribute."); + const file_path = node.file.path; + const file = this.app.vault.getAbstractFileByPath(file_path); + if (file) { + console.log(file); + const text = await this.app.vault.cachedRead(file); + console.log(text); + + // Check for the presence of three dashes indicating the start of the front matter + const front_matter_match = text.match(/^---\s*^([\s\S]*?)^---/m); + if (front_matter_match) { + const front_matter_content = front_matter_match[1]; + console.log("Front matter content extracted:", front_matter_content); + + // Check for the presence of a caret prompt + const caret_prompt_match = front_matter_content.match(/caret_prompt:\s*(\w+)/); + let caret_prompt = ""; + let prompt_tags: string[] = []; + if (caret_prompt_match) { + caret_prompt = caret_prompt_match[1]; + + // // Extract the prompts if available + // const prompts_match = front_matter_content.match( + // /prompts:\s*\n\s*-\s*(.*?)\n\s*-\s*(.*?)\n\s*-\s*(.*?)(\n|$)/ + // ); + // console.log(front_matter_content); + // console.log({ prompts_match }); + // if (prompts_match) { + // console.log(prompts_match); + // prompt_tags = [prompts_match[1], prompts_match[2], prompts_match[3]].map((s) => s.trim()); + // console.log("Prompts extracted:", prompt_tags); + // } + // Split the front matter content into lines + const lines = front_matter_content.split("\n"); + console.log(lines); + + // Find the index of the line that contains 'prompts' + const promptsIndex = lines.findIndex((line) => line.trim().startsWith("prompts:")); + + // Check if 'prompts' was found + if (promptsIndex !== -1) { + // Collect all subsequent lines that start with a dash '-' indicating list items + for (let i = promptsIndex + 1; i < lines.length; i++) { + const line = lines[i].trim(); + if (line.startsWith("-")) { + prompt_tags.push(line.substring(1).trim()); // Remove the dash and trim whitespace + } else { + break; // Stop if we reach a line that doesn't start with a dash + } + } + console.log("Prompts extracted:", prompt_tags); } - const message = { - role, - content, - }; - conversation.push(message); - } - if (assistantRegex.test(text)) { - const split_text = text.split(assistantRegex); - const role = "assistant"; - const content = split_text[1].trim(); - const message = { - role, - content, - }; - conversation.push(message); } - } - conversation.reverse(); - console.log({ conversation }); - - const data = { - conversation, - }; - let model_choice = "openai-gpt-4"; - let node_content = ""; - if (model_choice === "local") { - // This is for local - try { - const response = await fetch("http://localhost:8000/conversation", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }); - const output = await response.json(); - console.log(output); - if (output) { - node_content = `assistant\n${output.response}`; - // const x = node.x + node.width + 200; - // this.childNode(canvas, node, x, node.y, content); + if (caret_prompt === "multiprompt") { + const prompts = this.parseCustomXML(text, prompt_tags); + const prompts_keys = Object.keys(prompts); + const total_prompts = prompts_keys.length; + const card_height = node.height; + const middle_index = Math.floor(total_prompts / 2); + const highest_y = node.y - middle_index * (100 + card_height); // Calculate the highest y based on the middle index + const sparklePromises = []; + for (let i = 0; i < prompts_keys.length; i++) { + const prompt = prompts[prompts_keys[i]]; + console.log({ prompt }); + let x = node.x + node.width + 200; + let y = highest_y + i * (100 + card_height); // Increment y for each prompt to distribute them vertically including card height + const new_node_content = `user\n${prompt}`; + const node_output = await this.childNode( + canvas, + node, + x, + y, + new_node_content, + "right", + "left", + "groq" + ); + sparklePromises.push(this.sparkle(node_output.id)); } - } catch (error) { - console.error("Error:", error); + await Promise.all(sparklePromises); } + return; } + } else { + console.error("File not found or is not a readable file:", file_path); + } + } + console.log("Running just a normal node?? This print 3 times"); + + // const ancestors = this.get_ancestors(nodes, edges, node.id); + // const all_ancestors = this.getAllAncestorNodes(nodes, edges, node.id); + const longest_lineage = this.getLongestLineage(nodes, edges, node.id); + + const ancestors_with_context = this.getDirectAncestorsWithContext(nodes, edges, node.id); + // TODO - This needs to be cleaned up. Not sure what's going on with this + // I would think it shoudl be plural. But it;'s only checking one node? + const ref_blocks = await this.get_ref_blocks_content(node); + let added_context = ``; + for (let i = 0; i < ancestors_with_context.length; i++) { + const node = ancestors_with_context[i]; + added_context += node.text + "\n"; + } + if (ref_blocks.length > 1) { + added_context += `\n ${ref_blocks}`; + } + added_context = added_context.trim(); + let conversation = []; + + for (let i = 0; i < longest_lineage.length; i++) { + const node = longest_lineage[i]; + let text = ""; + if (node.type === "text") { + text = node.text; + } else if (node.type === "file" && node.file.includes(".pdf")) { + const file_name = node.file; + // const files = await this.app.vault.getFiles(); + // const foundFile = files.find((file) => file.basename === file_name); + text = await this.extractTextFromPDF(file_name); + added_context += text; + const role = "assistant"; + const message = { + role, + content: text, + }; + conversation.push(message); + continue; + } - if (model_choice === "groq") { - const model = "llama3-70b-8192"; - - const params = { - messages: conversation, - model: model, - // tools: tools, - // tool_choice: tool_choice, - max_tokens: 12000, - stop: null, - }; + const userRegex = /User<\/role>/i; + const assistantRegex = /assistant<\/role>/i; - // @ts-ignore - new Notice("Calling Groq!"); - const chat_completion: OpenAI.Chat.ChatCompletion = await groq.chat.completions.create(params); - new Notice("Message back from Groq"); + if (userRegex.test(text)) { + const split_text = text.split(userRegex); + const role = "user"; + let content = split_text[1].trim(); + // Only for the first node + if (added_context.length > 1 && i === 0) { + content += `\n${added_context}`; + } + const message = { + role, + content, + }; + conversation.push(message); + } + if (assistantRegex.test(text)) { + const split_text = text.split(assistantRegex); + const role = "assistant"; + const content = split_text[1].trim(); + const message = { + role, + content, + }; + conversation.push(message); + } + } + conversation.reverse(); - const content = chat_completion.choices[0].message.content; - node_content = `assistant\n${content}`; + const data = { + conversation, + }; + const total_conversation_length = conversation.reduce((total, message) => { + return total + message.content.split(/\s+/).filter(Boolean).length; + }, 0); + console.log(`Total word count in conversation: ${total_conversation_length}`); + let model_choice = "groq"; + // TODO - Refactor this out + if (total_conversation_length > 10000) { + model_choice = "openai-gpt-4"; + } + let node_content = ""; + if (model_choice === "local") { + // This is for local + try { + const response = await fetch("http://localhost:8000/conversation", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + const output = await response.json(); + if (output) { + node_content = `assistant\n${output.response}`; + // const x = node.x + node.width + 200; + // this.childNode(canvas, node, x, node.y, content); } + } catch (error) { + console.error("Error:", error); + } + } - if (model_choice === "openai-gpt-4") { - const model = "gpt-4-1106-preview"; - const params = { - messages: conversation, - model: model, - }; - // @ts-ignore - new Notice("Calling GPT-4!"); - const chat_completion: OpenAI.Chat.ChatCompletion = await openai.chat.completions.create(params); + if (model_choice === "groq") { + const model = "llama3-70b-8192"; + + const params = { + messages: conversation, + model: model, + // tools: tools, + // tool_choice: tool_choice, + max_tokens: 12000, + stop: null, + }; + // @ts-ignore + new Notice("Calling Groq!"); + groq.chat.completions + .create(params) + .then((chat_completion) => { + new Notice("Message back from Groq!"); + const content = chat_completion.choices[0].message.content; + const node_content = `assistant\n${content}`; + const x = node.x + node.width + 200; + this.childNode(canvas, node, x, node.y, node_content, "right", "left", "groq"); + }) + .catch((error) => { + console.error("Error fetching chat completion from Groq:", error); + }); + } + if (model_choice === "openai-gpt-4") { + const model = "gpt-4-1106-preview"; + const params = { + messages: conversation, + model: model, + }; + // @ts-ignore + new Notice("Calling GPT-4!"); + openai.chat.completions + .create(params) + .then((chat_completion) => { new Notice("Message back from GPT-4!"); - // const chat_completion: OpenAI.Chat.ChatCompletion = await groq.chat.completions.create(params); const content = chat_completion.choices[0].message.content; - node_content = `assistant\n${content}`; - } - const x = node.x + node.width + 200; - this.childNode(canvas, node, x, node.y, node_content, "right", "left", "groq"); + const node_content = `assistant\n${content}`; + const x = node.x + node.width + 200; + this.childNode(canvas, node, x, node.y, node_content, "right", "left", "groq"); + }) + .catch((error) => { + console.error("Error fetching chat completion:", error); + }); + } + // const x = node.x + node.width + 200; + // this.childNode(canvas, node, x, node.y, node_content, "right", "left", "groq"); + } + + addAIButtonIfNeeded(menuEl: HTMLElement) { + if (!menuEl.querySelector(".gpt-menu-item")) { + const buttonEl = createEl("button", "clickable-icon gpt-menu-item"); + setTooltip(buttonEl, "Sparkle", { placement: "top" }); + setIcon(buttonEl, "lucide-sparkles"); + buttonEl.addEventListener("click", async () => { + const canvasView = this.app.workspace.getLeavesOfType("canvas").first()?.view; + const canvas = canvasView.canvas; + await canvas.requestSave(true); + console.log(canvas); + const selection = canvas.selection; + const selectionIterator = selection.values(); + const node = selectionIterator.next().value; + const node_id = node.id; + await this.sparkle(node_id); }); menuEl.appendChild(buttonEl); }