Files
pantosite/src/content/.obsidian/plugins/explorer-focus/main.js
2026-04-11 00:41:28 +02:00

819 lines
106 KiB
JavaScript

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/main.ts
var main_exports = {};
__export(main_exports, {
ExplorerFocusPlugin: () => ExplorerFocusPlugin,
default: () => main_default
});
module.exports = __toCommonJS(main_exports);
var import_obsidian5 = require("obsidian");
// src/types.ts
var DEFAULT_SETTINGS = {
showRightClickMenu: true,
showFileExplorerIcon: true,
focusLevel: "parent",
customFolderPath: "",
hideAncestorFolders: false,
autoHidePaths: []
};
// src/ui/settings-tab.ts
var import_obsidian4 = require("obsidian");
// src/utils/file-explorer-patch.ts
var import_obsidian = require("obsidian");
// node_modules/.pnpm/monkey-around@3.0.0/node_modules/monkey-around/dist/index.mjs
function around(obj, factories) {
const removers = Object.keys(factories).map((key) => around1(obj, key, factories[key]));
return removers.length === 1 ? removers[0] : function() {
removers.forEach((r) => r());
};
}
function around1(obj, method, createWrapper) {
const inherited = obj[method], hadOwn = obj.hasOwnProperty(method), original = hadOwn ? inherited : function() {
return Object.getPrototypeOf(obj)[method].apply(this, arguments);
};
let current = createWrapper(original);
if (inherited)
Object.setPrototypeOf(current, inherited);
Object.setPrototypeOf(wrapper, current);
obj[method] = wrapper;
return remove;
function wrapper(...args) {
if (current === original && obj[method] === wrapper)
remove();
return current.apply(this, args);
}
function remove() {
if (obj[method] === wrapper) {
if (hadOwn)
obj[method] = original;
else
delete obj[method];
}
if (current === original)
return;
current = original;
Object.setPrototypeOf(wrapper, inherited || Function);
}
}
// src/utils/file-explorer-patch.ts
var prototypePatched = false;
var patchingFailed = false;
function patchFileExplorer(plugin) {
if (patchingFailed) {
return;
}
if (import_obsidian.Platform.isMobile) {
patchingFailed = true;
return;
}
const fileExplorer = getFileExplorer(plugin);
if (!fileExplorer) {
return;
}
if (!prototypePatched) {
try {
const prototype = Object.getPrototypeOf(fileExplorer);
if (typeof prototype.getSortedFolderItems !== "function") {
throw new Error("getSortedFolderItems method not found on file explorer prototype");
}
plugin.register(
around(prototype, {
getSortedFolderItems(old) {
return function(folder) {
let sortedChildren = old.call(this, folder);
if (plugin.isFocus && plugin.focusedPath) {
const focusedPath = plugin.focusedPath;
sortedChildren = sortedChildren.filter((vEl) => {
const filePath = vEl.file.path;
if (filePath === focusedPath) {
vEl.info.hidden = false;
return true;
}
if (filePath.startsWith(focusedPath + "/")) {
vEl.info.hidden = false;
return true;
}
if (focusedPath.startsWith(filePath + "/")) {
vEl.info.hidden = false;
return true;
}
vEl.info.hidden = true;
return false;
});
} else {
sortedChildren.forEach((vEl) => {
vEl.info.hidden = false;
});
}
return sortedChildren;
};
}
})
);
prototypePatched = true;
} catch (error) {
patchingFailed = true;
console.warn(
"[Explorer Focus] Failed to patch file explorer. The plugin will use CSS-based hiding as a fallback, which may be less precise. This usually happens after an Obsidian update - please check for plugin updates.",
error
);
new import_obsidian.Notice(
"Explorer Focus: File explorer patching failed. The plugin will still work but may need an update for full functionality.",
8e3
);
return;
}
}
fileExplorer.fileExplorerPlusPatched = true;
}
function getFileExplorer(plugin) {
var _a;
const fileExplorerContainer = (_a = plugin.app.workspace.getLeavesOfType("file-explorer")) == null ? void 0 : _a.first();
return fileExplorerContainer == null ? void 0 : fileExplorerContainer.view;
}
function getAllFileExplorers(plugin) {
const fileExplorerLeaves = plugin.app.workspace.getLeavesOfType("file-explorer");
return fileExplorerLeaves.map((leaf) => leaf.view);
}
// src/ui/folder-suggest.ts
var import_obsidian2 = require("obsidian");
var FolderSuggest = class extends import_obsidian2.AbstractInputSuggest {
constructor(app, inputEl) {
super(app, inputEl);
this.inputEl = inputEl;
}
getSuggestions(query) {
const lowerQuery = query.toLowerCase();
const folders = [];
this.app.vault.getAllLoadedFiles().forEach((file) => {
if (file instanceof import_obsidian2.TFolder) {
if (file.path.toLowerCase().includes(lowerQuery)) {
folders.push(file);
}
}
});
folders.sort((a, b) => a.path.localeCompare(b.path));
return folders.slice(0, 20);
}
renderSuggestion(folder, el) {
el.createEl("div", { text: folder.path || "/" });
}
selectSuggestion(folder) {
this.inputEl.value = folder.path;
this.inputEl.trigger("input");
this.close();
}
};
// src/ui/auto-hide-modal.ts
var import_obsidian3 = require("obsidian");
var AutoHideModal = class extends import_obsidian3.Modal {
constructor(app, plugin, onSave) {
var _a;
super(app);
this.addInput = null;
this.plugin = plugin;
this.paths = [...(_a = plugin.settings.autoHidePaths) != null ? _a : []];
this.onSave = onSave;
}
onOpen() {
this.setTitle("Auto-hide folders");
this.renderContent();
}
renderContent() {
var _a;
const { contentEl } = this;
contentEl.empty();
contentEl.createEl("p", {
text: "The following folders are currently hidden from the file explorer."
});
const listWrapper = contentEl.createDiv();
this.paths.forEach((path, index) => {
const row = listWrapper.createDiv({ cls: "mobile-option-setting-item" });
row.createSpan({
text: path || "(empty)",
cls: "mobile-option-setting-item-name"
});
const removeBtn = row.createDiv({
cls: "clickable-icon mobile-option-setting-item-option-icon",
attr: { "aria-label": "Delete" }
});
(0, import_obsidian3.setIcon)(removeBtn, "x");
removeBtn.addEventListener("click", () => {
this.paths.splice(index, 1);
this.renderContent();
});
});
new import_obsidian3.Setting(contentEl).setName("Folder").addText((text) => {
new FolderSuggest(this.app, text.inputEl);
text.setPlaceholder("Enter folder path");
this.addInput = text;
}).addButton((button) => button.setButtonText("Add").onClick(() => {
var _a2, _b, _c;
const value = (_b = (_a2 = this.addInput) == null ? void 0 : _a2.getValue()) == null ? void 0 : _b.trim();
if (value) {
this.paths.push(value);
(_c = this.addInput) == null ? void 0 : _c.setValue("");
this.renderContent();
}
}));
(_a = this.modalEl.querySelector(".modal-button-container")) == null ? void 0 : _a.remove();
const buttonContainer = this.modalEl.createDiv({ cls: "modal-button-container" });
const saveBtn = buttonContainer.createEl("button", {
text: "Save",
cls: "mod-cta"
});
saveBtn.addEventListener("click", () => {
this.plugin.settings.autoHidePaths = this.paths;
void this.plugin.saveSettings();
this.plugin.updateAutoHideStyles();
this.onSave();
this.close();
});
const cancelBtn = buttonContainer.createEl("button", {
text: "Cancel",
cls: "mod-cancel"
});
cancelBtn.addEventListener("click", () => {
this.close();
});
}
};
// src/ui/settings-tab.ts
var ExplorerFocusSettingTab = class extends import_obsidian4.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.icon = "lucide-focus";
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
const generalGroup = new import_obsidian4.SettingGroup(containerEl);
generalGroup.addSetting((setting) => {
setting.setName("Show right-click menu option").addToggle((toggle) => toggle.setValue(this.plugin.settings.showRightClickMenu).onChange(async (value) => {
this.plugin.settings.showRightClickMenu = value;
await this.plugin.saveSettings();
}));
});
generalGroup.addSetting((setting) => {
setting.setName("Show file explorer icon").addToggle((toggle) => toggle.setValue(this.plugin.settings.showFileExplorerIcon).onChange(async (value) => {
this.plugin.settings.showFileExplorerIcon = value;
await this.plugin.saveSettings();
this.plugin.updateFileExplorerIcon();
}));
});
generalGroup.addSetting((setting) => {
setting.setName("Command focus level").setDesc("Determines what to focus when using the toggle command or file explorer icon. Right-click menu always focuses the clicked file/folder.").addDropdown((dropdown) => dropdown.addOption("file", "Current file only").addOption("parent", "Parent folder").addOption("grandparent", "Grandparent folder").addOption("greatgrandparent", "Great grandparent folder").addOption("custom", "Specific folder").setValue(this.plugin.settings.focusLevel).onChange(async (value) => {
this.plugin.settings.focusLevel = value;
await this.plugin.saveSettings();
if (this.plugin.isFocus) {
const fileExplorers = getAllFileExplorers(this.plugin);
fileExplorers.forEach((fileExplorer) => {
if (fileExplorer == null ? void 0 : fileExplorer.requestSort) {
fileExplorer.requestSort();
}
});
}
this.display();
}));
});
if (this.plugin.settings.focusLevel === "custom") {
generalGroup.addSetting((setting) => {
setting.setName("Custom folder path").setDesc("Enter a folder path (folder/subfolder). This folder will be focused regardless of which file is open.").addText((text) => {
new FolderSuggest(this.app, text.inputEl);
text.setPlaceholder("Folder/subfolder").setValue(this.plugin.settings.customFolderPath).onChange(async (value) => {
this.plugin.settings.customFolderPath = value;
await this.plugin.saveSettings();
});
});
});
}
const autoHideGroup = new import_obsidian4.SettingGroup(containerEl).setHeading("Auto-hide folders");
autoHideGroup.addSetting((setting) => {
var _a;
const autoHidePaths = ((_a = this.plugin.settings.autoHidePaths) != null ? _a : []).filter((p) => p.trim().length > 0);
const descFragment = document.createDocumentFragment();
descFragment.appendText("These folders are always hidden from the file explorer.");
if (autoHidePaths.length > 0) {
const list = descFragment.createEl("ul");
autoHidePaths.forEach((p) => {
list.createEl("li", { text: p });
});
}
setting.setName("Hidden folders").setDesc(descFragment).addButton((button) => button.setButtonText("Manage").onClick(() => {
new AutoHideModal(this.app, this.plugin, () => {
this.display();
}).open();
}));
});
}
};
// src/utils/focus.ts
function getFocusPath(path, level, settings) {
if (level === "custom") {
return settings.customFolderPath || path;
}
if (level === "file") {
return path;
}
const parts = path.split("/");
if (level === "parent") {
if (parts.length === 1) {
return path;
}
return parts.slice(0, -1).join("/");
}
if (level === "grandparent") {
if (parts.length <= 2) {
return parts[0] || path;
}
return parts.slice(0, -2).join("/");
}
if (parts.length <= 3) {
return parts[0] || path;
}
return parts.slice(0, -3).join("/");
}
// src/commands/index.ts
function registerCommands(plugin) {
plugin.addCommand({
id: "toggle",
name: "Toggle focus",
callback: () => {
if (plugin.isFocus) {
plugin.exitFocus();
} else {
if (plugin.settings.focusLevel === "custom") {
if (plugin.settings.customFolderPath) {
plugin.enterFocus(plugin.settings.customFolderPath);
}
} else {
const file = plugin.app.workspace.getActiveFile();
if (file == null ? void 0 : file.path) {
const focusPath = getFocusPath(file.path, plugin.settings.focusLevel, plugin.settings);
plugin.enterFocus(focusPath);
}
}
}
}
});
if (plugin.settings.showRightClickMenu) {
plugin.registerEvent(
plugin.app.workspace.on("file-menu", (menu, file) => {
if (!plugin.settings.showRightClickMenu) {
return;
}
menu.addItem((item) => {
item.setTitle(plugin.isFocus ? "Exit focus" : "Focus").setIcon(plugin.isFocus ? "log-out" : "focus").onClick(() => {
plugin.toggleFocus(file == null ? void 0 : file.path);
});
});
})
);
}
}
// src/utils/file-explorer.ts
function findNavButtonsContainer(fileExplorerView) {
var _a;
let container = fileExplorerView.querySelector(".nav-buttons-container");
if (container) {
return container;
}
container = fileExplorerView.querySelector(".nav-header-button-container");
if (container) {
return container;
}
const existingButtons = fileExplorerView.querySelectorAll(".nav-action-button");
if (existingButtons.length > 0) {
const firstButton = existingButtons[0];
const parent = firstButton.parentElement;
if (parent && (parent.classList.contains("nav-buttons-container") || parent.classList.contains("nav-header-button-container") || Array.from(parent.children).some((el) => el.classList.contains("nav-action-button")))) {
return parent;
}
}
const viewHeader = fileExplorerView.querySelector(".view-header");
if (viewHeader) {
const headerContainer = viewHeader.querySelector(".nav-buttons-container") || viewHeader.querySelector(".nav-header-button-container") || viewHeader.querySelector(".view-header-title-container");
if (headerContainer) {
return headerContainer;
}
return viewHeader;
}
const navFilesContainer = fileExplorerView.querySelector(".nav-files-container");
if (navFilesContainer) {
let mobileButtonContainer = fileExplorerView.querySelector(".explorer-focus-mobile-buttons");
if (!mobileButtonContainer) {
mobileButtonContainer = document.createElement("div");
mobileButtonContainer.className = "nav-buttons-container explorer-focus-mobile-buttons";
mobileButtonContainer.setCssProps({
display: "flex",
alignItems: "center",
gap: "4px",
padding: "8px",
borderBottom: "1px solid var(--background-modifier-border)"
});
(_a = navFilesContainer.parentElement) == null ? void 0 : _a.insertBefore(mobileButtonContainer, navFilesContainer);
}
return mobileButtonContainer;
}
let topContainer = fileExplorerView.querySelector(".explorer-focus-mobile-buttons");
if (!topContainer) {
topContainer = document.createElement("div");
topContainer.className = "nav-buttons-container explorer-focus-mobile-buttons";
topContainer.setCssProps({
display: "flex",
alignItems: "center",
gap: "4px",
padding: "8px",
borderBottom: "1px solid var(--background-modifier-border)"
});
fileExplorerView.insertBefore(topContainer, fileExplorerView.firstChild);
}
return topContainer;
}
function createFileExplorerIcon(plugin) {
const icon = document.createElement("div");
icon.className = "clickable-icon nav-action-button";
icon.setAttribute("aria-label", "Toggle focus");
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
svg.setAttribute("width", "24");
svg.setAttribute("height", "24");
svg.setAttribute("viewBox", "0 0 24 24");
svg.setAttribute("fill", "none");
svg.setAttribute("stroke", "currentColor");
svg.setAttribute("stroke-width", "2");
svg.setAttribute("stroke-linecap", "round");
svg.setAttribute("stroke-linejoin", "round");
svg.setAttribute("class", "svg-icon lucide-focus");
const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
circle.setAttribute("cx", "12");
circle.setAttribute("cy", "12");
circle.setAttribute("r", "3");
svg.appendChild(circle);
const path1 = document.createElementNS("http://www.w3.org/2000/svg", "path");
path1.setAttribute("d", "M3 7V5a2 2 0 0 1 2-2h2");
svg.appendChild(path1);
const path2 = document.createElementNS("http://www.w3.org/2000/svg", "path");
path2.setAttribute("d", "M17 3h2a2 2 0 0 1 2 2v2");
svg.appendChild(path2);
const path3 = document.createElementNS("http://www.w3.org/2000/svg", "path");
path3.setAttribute("d", "M21 17v2a2 2 0 0 1-2 2h-2");
svg.appendChild(path3);
const path4 = document.createElementNS("http://www.w3.org/2000/svg", "path");
path4.setAttribute("d", "M7 21H5a2 2 0 0 1-2-2v-2");
svg.appendChild(path4);
icon.appendChild(svg);
return icon;
}
function insertFileExplorerIcon(icon, navButtonsContainer) {
if (navButtonsContainer.contains(icon)) {
return;
}
const allIcons = Array.from(navButtonsContainer.querySelectorAll(".clickable-icon.nav-action-button"));
const defaultIcons = allIcons.filter((el) => !el.classList.contains("cmdr") && el !== icon);
const cmdrIcons = Array.from(navButtonsContainer.querySelectorAll(".cmdr"));
if (cmdrIcons.length > 0) {
navButtonsContainer.insertBefore(icon, cmdrIcons[0]);
} else if (defaultIcons.length > 0) {
const lastIcon = defaultIcons[defaultIcons.length - 1];
if (lastIcon.nextSibling) {
navButtonsContainer.insertBefore(icon, lastIcon.nextSibling);
} else {
navButtonsContainer.appendChild(icon);
}
} else {
navButtonsContainer.appendChild(icon);
}
}
// src/main.ts
var ExplorerFocusPlugin = class extends import_obsidian5.Plugin {
constructor(app, manifest) {
super(app, manifest);
this.isFocus = false;
this.focusedPath = null;
this.fileExplorerIcon = null;
}
async onload() {
await this.loadSettings();
this.addSettingTab(new ExplorerFocusSettingTab(this.app, this));
registerCommands(this);
if (this.settings.showFileExplorerIcon) {
this.addFileExplorerIcon();
}
this.app.workspace.onLayoutReady(() => {
this.patchAllFileExplorers();
this.updateFocusModeClasses();
this.updateAutoHideStyles();
});
this.app.workspace.on("layout-change", () => {
this.patchAllFileExplorers();
this.updateFocusModeClasses();
this.updateAutoHideStyles();
});
}
async loadSettings() {
const loadedData = await this.loadData();
this.settings = Object.assign({}, DEFAULT_SETTINGS, loadedData);
}
async saveSettings() {
await this.saveData(this.settings);
}
toggleFocus(path) {
if (this.isFocus) {
this.exitFocus();
} else if (path) {
this.enterFocus(path);
}
}
enterFocus(path) {
this.isFocus = true;
this.focusedPath = path;
this.updateFileExplorerIcon();
this.updateFocusModeClasses();
const fileExplorers = getAllFileExplorers(this);
fileExplorers.forEach((fileExplorer) => {
if (fileExplorer == null ? void 0 : fileExplorer.requestSort) {
fileExplorer.requestSort();
}
});
setTimeout(() => {
fileExplorers.forEach((fileExplorer) => {
this.refreshFileExplorerVisibility(fileExplorer);
});
}, 0);
}
patchAllFileExplorers() {
patchFileExplorer(this);
const fileExplorers = getAllFileExplorers(this);
fileExplorers.forEach((fileExplorer) => {
fileExplorer.fileExplorerPlusPatched = true;
});
}
exitFocus() {
this.isFocus = false;
this.focusedPath = null;
this.updateFileExplorerIcon();
this.updateFocusModeClasses();
const fileExplorers = getAllFileExplorers(this);
fileExplorers.forEach((fileExplorer) => {
if (fileExplorer == null ? void 0 : fileExplorer.requestSort) {
fileExplorer.requestSort();
}
});
setTimeout(() => {
fileExplorers.forEach((fileExplorer) => {
this.refreshFileExplorerVisibility(fileExplorer);
});
this.updateAutoHideStyles();
}, 0);
}
refreshFileExplorerVisibility(fileExplorer) {
if (!(fileExplorer == null ? void 0 : fileExplorer.fileItems)) {
return;
}
if (!this.isFocus || !this.focusedPath) {
Object.values(fileExplorer.fileItems).forEach((vEl) => {
if (!(vEl == null ? void 0 : vEl.el)) return;
if (vEl.el.hasAttribute("data-explorer-focus-hidden")) {
if (vEl.info) vEl.info.hidden = false;
vEl.el.setCssProps({ display: "" });
vEl.el.removeAttribute("data-explorer-focus-hidden");
}
});
return;
}
const focusedPath = this.focusedPath;
const ancestorPaths = /* @__PURE__ */ new Set();
const pathParts = focusedPath.split("/");
for (let i = 1; i < pathParts.length; i++) {
ancestorPaths.add(pathParts.slice(0, i).join("/"));
}
const topLevelFolders = /* @__PURE__ */ new Map();
const rootItems = [];
for (const path of Object.keys(fileExplorer.fileItems)) {
const firstSlash = path.indexOf("/");
if (firstSlash === -1) {
rootItems.push(path);
} else {
const topLevel = path.substring(0, firstSlash);
if (!topLevelFolders.has(topLevel)) {
topLevelFolders.set(topLevel, []);
}
topLevelFolders.get(topLevel).push(path);
}
}
const focusedTopLevel = focusedPath.split("/")[0];
for (const path of rootItems) {
const vEl = fileExplorer.fileItems[path];
if (!(vEl == null ? void 0 : vEl.el)) continue;
const shouldShow = path === focusedPath || focusedPath.startsWith(path + "/") || path.startsWith(focusedPath + "/");
this.updateItemVisibility(vEl, shouldShow);
}
for (const [topLevel, paths] of topLevelFolders) {
const isInFocusPath = topLevel === focusedTopLevel || ancestorPaths.has(topLevel) || focusedPath === topLevel;
if (!isInFocusPath) {
for (const path of paths) {
const vEl = fileExplorer.fileItems[path];
if (!(vEl == null ? void 0 : vEl.el)) continue;
this.updateItemVisibility(vEl, false);
}
} else {
for (const path of paths) {
const vEl = fileExplorer.fileItems[path];
if (!(vEl == null ? void 0 : vEl.el)) continue;
const shouldShow = path === focusedPath || path.startsWith(focusedPath + "/") || ancestorPaths.has(path);
this.updateItemVisibility(vEl, shouldShow);
}
}
}
}
updateItemVisibility(vEl, shouldShow) {
const currentlyHidden = vEl.el.hasAttribute("data-explorer-focus-hidden");
if (shouldShow && currentlyHidden) {
if (vEl.info) vEl.info.hidden = false;
vEl.el.setCssProps({ display: "" });
vEl.el.removeAttribute("data-explorer-focus-hidden");
} else if (!shouldShow && !currentlyHidden) {
if (vEl.info) vEl.info.hidden = true;
vEl.el.setCssProps({ display: "none" });
vEl.el.setAttribute("data-explorer-focus-hidden", "true");
}
}
updateFocusModeClasses() {
const fileExplorers = getAllFileExplorers(this);
fileExplorers.forEach((fileExplorer) => {
const containerEl = fileExplorer.containerEl;
if (this.isFocus) {
containerEl.addClass("explorer-focus-mode");
} else {
containerEl.removeClass("explorer-focus-mode");
}
});
}
addFileExplorerIcon() {
const handleIconClick = () => {
if (this.isFocus) {
this.exitFocus();
} else {
if (this.settings.focusLevel === "custom") {
if (this.settings.customFolderPath) {
this.enterFocus(this.settings.customFolderPath);
}
} else {
const file = this.app.workspace.getActiveFile();
if (file == null ? void 0 : file.path) {
const focusPath = getFocusPath(file.path, this.settings.focusLevel, this.settings);
this.enterFocus(focusPath);
}
}
}
};
const addIconToFileExplorer = () => {
const fileExplorerLeaves = this.app.workspace.getLeavesOfType("file-explorer");
if (fileExplorerLeaves.length === 0) {
return;
}
const fileExplorerView = fileExplorerLeaves[0].view.containerEl;
const navButtonsContainer = findNavButtonsContainer(fileExplorerView);
if (!navButtonsContainer) {
return;
}
if (this.fileExplorerIcon && navButtonsContainer.contains(this.fileExplorerIcon)) {
return;
}
if (this.fileExplorerIcon && this.fileExplorerIcon.parentElement) {
this.fileExplorerIcon.remove();
}
if (!this.fileExplorerIcon) {
this.fileExplorerIcon = createFileExplorerIcon(this);
this.fileExplorerIcon.setCssProps({ touchAction: "manipulation" });
let touchHandled = false;
this.registerDomEvent(this.fileExplorerIcon, "touchstart", (evt) => {
touchHandled = true;
evt.preventDefault();
evt.stopPropagation();
handleIconClick();
setTimeout(() => {
touchHandled = false;
}, 300);
});
this.registerDomEvent(this.fileExplorerIcon, "click", (evt) => {
if (touchHandled) {
evt.preventDefault();
evt.stopPropagation();
return;
}
evt.preventDefault();
evt.stopPropagation();
handleIconClick();
});
}
this.updateFileExplorerIcon();
insertFileExplorerIcon(this.fileExplorerIcon, navButtonsContainer);
};
addIconToFileExplorer();
this.registerEvent(
this.app.workspace.on("layout-change", () => {
if (this.settings.showFileExplorerIcon) {
addIconToFileExplorer();
}
})
);
}
updateFileExplorerIcon() {
if (!this.fileExplorerIcon) {
return;
}
if (!this.settings.showFileExplorerIcon) {
if (this.fileExplorerIcon.parentElement) {
this.fileExplorerIcon.remove();
}
return;
}
if (!this.fileExplorerIcon.parentElement) {
const fileExplorerLeaves = this.app.workspace.getLeavesOfType("file-explorer");
if (fileExplorerLeaves.length > 0) {
const fileExplorerView = fileExplorerLeaves[0].view.containerEl;
const navButtonsContainer = findNavButtonsContainer(fileExplorerView);
if (navButtonsContainer) {
insertFileExplorerIcon(this.fileExplorerIcon, navButtonsContainer);
}
}
}
if (this.fileExplorerIcon.style.cursor) {
this.fileExplorerIcon.style.removeProperty("cursor");
}
if (this.isFocus) {
this.fileExplorerIcon.addClass("is-active");
} else {
this.fileExplorerIcon.removeClass("is-active");
}
}
updateAutoHideStyles() {
var _a;
const paths = new Set(
((_a = this.settings.autoHidePaths) != null ? _a : []).map((p) => p.trim()).filter((p) => p.length > 0)
);
const fileExplorers = getAllFileExplorers(this);
fileExplorers.forEach((fileExplorer) => {
if (!(fileExplorer == null ? void 0 : fileExplorer.fileItems)) return;
for (const [filePath, vEl] of Object.entries(fileExplorer.fileItems)) {
if (!(vEl == null ? void 0 : vEl.el)) continue;
const shouldHide = paths.has(filePath);
const isHidden = vEl.el.hasAttribute("data-explorer-focus-auto-hidden");
if (shouldHide && !isHidden) {
vEl.el.setCssProps({ display: "none" });
vEl.el.setAttribute("data-explorer-focus-auto-hidden", "true");
} else if (!shouldHide && isHidden) {
vEl.el.setCssProps({ display: "" });
vEl.el.removeAttribute("data-explorer-focus-auto-hidden");
}
}
});
}
onunload() {
if (this.fileExplorerIcon) {
this.fileExplorerIcon.remove();
this.fileExplorerIcon = null;
}
}
};
var main_default = ExplorerFocusPlugin;
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3R5cGVzLnRzIiwgInNyYy91aS9zZXR0aW5ncy10YWIudHMiLCAic3JjL3V0aWxzL2ZpbGUtZXhwbG9yZXItcGF0Y2gudHMiLCAibm9kZV9tb2R1bGVzLy5wbnBtL21vbmtleS1hcm91bmRAMy4wLjAvbm9kZV9tb2R1bGVzL21vbmtleS1hcm91bmQvZGlzdC9pbmRleC5tanMiLCAic3JjL3VpL2ZvbGRlci1zdWdnZXN0LnRzIiwgInNyYy91aS9hdXRvLWhpZGUtbW9kYWwudHMiLCAic3JjL3V0aWxzL2ZvY3VzLnRzIiwgInNyYy9jb21tYW5kcy9pbmRleC50cyIsICJzcmMvdXRpbHMvZmlsZS1leHBsb3Jlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQXBwLCBQbHVnaW4sIFBsdWdpbk1hbmlmZXN0IH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7IEV4cGxvcmVyRm9jdXNTZXR0aW5ncywgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBFeHBsb3JlckZvY3VzU2V0dGluZ1RhYiB9IGZyb20gJy4vdWkvc2V0dGluZ3MtdGFiJztcclxuaW1wb3J0IHsgcmVnaXN0ZXJDb21tYW5kcyB9IGZyb20gJy4vY29tbWFuZHMnO1xyXG5pbXBvcnQgeyBjcmVhdGVGaWxlRXhwbG9yZXJJY29uLCBpbnNlcnRGaWxlRXhwbG9yZXJJY29uLCBmaW5kTmF2QnV0dG9uc0NvbnRhaW5lciB9IGZyb20gJy4vdXRpbHMvZmlsZS1leHBsb3Jlcic7XHJcbmltcG9ydCB7IHBhdGNoRmlsZUV4cGxvcmVyIGFzIHBhdGNoRmlsZUV4cGxvcmVyVXRpbCwgZ2V0QWxsRmlsZUV4cGxvcmVycywgRmlsZUV4cGxvcmVyVmlldyB9IGZyb20gJy4vdXRpbHMvZmlsZS1leHBsb3Jlci1wYXRjaCc7XHJcbmltcG9ydCB7IGdldEZvY3VzUGF0aCB9IGZyb20gJy4vdXRpbHMvZm9jdXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV4cGxvcmVyRm9jdXNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdGlzRm9jdXM6IGJvb2xlYW47XHJcblx0Zm9jdXNlZFBhdGg6IHN0cmluZyB8IG51bGw7XHJcblx0c2V0dGluZ3MhOiBFeHBsb3JlckZvY3VzU2V0dGluZ3M7XHJcblx0ZmlsZUV4cGxvcmVySWNvbjogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgbWFuaWZlc3Q6IFBsdWdpbk1hbmlmZXN0KSB7XHJcblx0XHRzdXBlcihhcHAsIG1hbmlmZXN0KTtcclxuXHRcdHRoaXMuaXNGb2N1cyA9IGZhbHNlO1xyXG5cdFx0dGhpcy5mb2N1c2VkUGF0aCA9IG51bGw7XHJcblx0XHR0aGlzLmZpbGVFeHBsb3Jlckljb24gPSBudWxsO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25sb2FkKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEV4cGxvcmVyRm9jdXNTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0cmVnaXN0ZXJDb21tYW5kcyh0aGlzKTtcclxuXHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5zaG93RmlsZUV4cGxvcmVySWNvbikge1xyXG5cdFx0XHR0aGlzLmFkZEZpbGVFeHBsb3Jlckljb24oKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB7XHJcblx0XHRcdHRoaXMucGF0Y2hBbGxGaWxlRXhwbG9yZXJzKCk7XHJcblx0XHRcdHRoaXMudXBkYXRlRm9jdXNNb2RlQ2xhc3NlcygpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZUF1dG9IaWRlU3R5bGVzKCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJsYXlvdXQtY2hhbmdlXCIsICgpID0+IHtcclxuXHRcdFx0dGhpcy5wYXRjaEFsbEZpbGVFeHBsb3JlcnMoKTtcclxuXHRcdFx0dGhpcy51cGRhdGVGb2N1c01vZGVDbGFzc2VzKCk7XHJcblx0XHRcdHRoaXMudXBkYXRlQXV0b0hpZGVTdHlsZXMoKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0Y29uc3QgbG9hZGVkRGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKSBhcyBQYXJ0aWFsPEV4cGxvcmVyRm9jdXNTZXR0aW5ncz4gfCBudWxsO1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGxvYWRlZERhdGEpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcblxyXG5cdHRvZ2dsZUZvY3VzKHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG5cdFx0aWYgKHRoaXMuaXNGb2N1cykge1xyXG5cdFx0XHR0aGlzLmV4aXRGb2N1cygpO1xyXG5cdFx0fSBlbHNlIGlmIChwYXRoKSB7XHJcblx0XHRcdHRoaXMuZW50ZXJGb2N1cyhwYXRoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGVudGVyRm9jdXMocGF0aDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmlzRm9jdXMgPSB0cnVlO1xyXG5cdFx0dGhpcy5mb2N1c2VkUGF0aCA9IHBhdGg7XHJcblx0XHRcclxuXHRcdC8vIFVwZGF0ZSBpY29uIGlmIGl0IGV4aXN0c1xyXG5cdFx0dGhpcy51cGRhdGVGaWxlRXhwbG9yZXJJY29uKCk7XHJcblx0XHRcclxuXHRcdC8vIFVwZGF0ZSBDU1MgY2xhc3Nlc1xyXG5cdFx0dGhpcy51cGRhdGVGb2N1c01vZGVDbGFzc2VzKCk7XHJcblx0XHRcclxuXHRcdC8vIFRyaWdnZXIgZmlsZSBleHBsb3JlciByZWZyZXNoIG9uIGFsbCBmaWxlIGV4cGxvcmVyIGluc3RhbmNlc1xyXG5cdFx0Y29uc3QgZmlsZUV4cGxvcmVycyA9IGdldEFsbEZpbGVFeHBsb3JlcnModGhpcyk7XHJcblx0XHRmaWxlRXhwbG9yZXJzLmZvckVhY2goZmlsZUV4cGxvcmVyID0+IHtcclxuXHRcdFx0aWYgKGZpbGVFeHBsb3Jlcj8ucmVxdWVzdFNvcnQpIHtcclxuXHRcdFx0XHRmaWxlRXhwbG9yZXIucmVxdWVzdFNvcnQoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRcclxuXHRcdC8vIEZvcmNlIHJlZnJlc2ggYnkgbWFudWFsbHkgdXBkYXRpbmcgdmlzaWJpbGl0eSAoZXNwZWNpYWxseSBpbXBvcnRhbnQgb24gbW9iaWxlKVxyXG5cdFx0Ly8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIERPTSBpcyByZWFkeSBhZnRlciByZXF1ZXN0U29ydFxyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdGZpbGVFeHBsb3JlcnMuZm9yRWFjaChmaWxlRXhwbG9yZXIgPT4ge1xyXG5cdFx0XHRcdHRoaXMucmVmcmVzaEZpbGVFeHBsb3JlclZpc2liaWxpdHkoZmlsZUV4cGxvcmVyKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9LCAwKTtcclxuXHR9XHJcblxyXG5cdHBhdGNoQWxsRmlsZUV4cGxvcmVycygpOiB2b2lkIHtcclxuXHRcdC8vIFBhdGNoIHRoZSBwcm90b3R5cGUgKG9uY2UpIGFuZCBtYXJrIGFsbCBpbnN0YW5jZXNcclxuXHRcdHBhdGNoRmlsZUV4cGxvcmVyVXRpbCh0aGlzKTtcclxuXHRcdGNvbnN0IGZpbGVFeHBsb3JlcnMgPSBnZXRBbGxGaWxlRXhwbG9yZXJzKHRoaXMpO1xyXG5cdFx0ZmlsZUV4cGxvcmVycy5mb3JFYWNoKGZpbGVFeHBsb3JlciA9PiB7XHJcblx0XHRcdGZpbGVFeHBsb3Jlci5maWxlRXhwbG9yZXJQbHVzUGF0Y2hlZCA9IHRydWU7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGV4aXRGb2N1cygpIHtcclxuXHRcdHRoaXMuaXNGb2N1cyA9IGZhbHNlO1xyXG5cdFx0dGhpcy5mb2N1c2VkUGF0aCA9IG51bGw7XHJcblxyXG5cdFx0Ly8gVXBkYXRlIGljb24gaWYgaXQgZXhpc3RzXHJcblx0XHR0aGlzLnVwZGF0ZUZpbGVFeHBsb3Jlckljb24oKTtcclxuXHJcblx0XHQvLyBVcGRhdGUgQ1NTIGNsYXNzZXNcclxuXHRcdHRoaXMudXBkYXRlRm9jdXNNb2RlQ2xhc3NlcygpO1xyXG5cclxuXHRcdC8vIFRyaWdnZXIgZmlsZSBleHBsb3JlciByZWZyZXNoIG9uIGFsbCBmaWxlIGV4cGxvcmVyIGluc3RhbmNlc1xyXG5cdFx0Y29uc3QgZmlsZUV4cGxvcmVycyA9IGdldEFsbEZpbGVFeHBsb3JlcnModGhpcyk7XHJcblx0XHRmaWxlRXhwbG9yZXJzLmZvckVhY2goZmlsZUV4cGxvcmVyID0+IHtcclxuXHRcdFx0aWYgKGZpbGVFeHBsb3Jlcj8ucmVxdWVzdFNvcnQpIHtcclxuXHRcdFx0XHRmaWxlRXhwbG9yZXIucmVxdWVzdFNvcnQoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gRm9yY2UgcmVmcmVzaCBieSBtYW51YWxseSB1cGRhdGluZyB2aXNpYmlsaXR5IChlc3BlY2lhbGx5IGltcG9ydGFudCBvbiBtb2JpbGUpXHJcblx0XHQvLyBVc2Ugc2V0VGltZW91dCB0byBlbnN1cmUgRE9NIGlzIHJlYWR5IGFmdGVyIHJlcXVlc3RTb3J0XHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0ZmlsZUV4cGxvcmVycy5mb3JFYWNoKGZpbGVFeHBsb3JlciA9PiB7XHJcblx0XHRcdFx0dGhpcy5yZWZyZXNoRmlsZUV4cGxvcmVyVmlzaWJpbGl0eShmaWxlRXhwbG9yZXIpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Ly8gUmUtYXBwbHkgYXV0by1oaWRlIGFmdGVyIGZvY3VzIG1vZGUgY2xlYXJzIHZpc2liaWxpdHlcclxuXHRcdFx0dGhpcy51cGRhdGVBdXRvSGlkZVN0eWxlcygpO1xyXG5cdFx0fSwgMCk7XHJcblx0fVxyXG5cclxuXHRyZWZyZXNoRmlsZUV4cGxvcmVyVmlzaWJpbGl0eShmaWxlRXhwbG9yZXI6IEZpbGVFeHBsb3JlclZpZXcpOiB2b2lkIHtcclxuXHRcdGlmICghZmlsZUV4cGxvcmVyPy5maWxlSXRlbXMpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFdoZW4gZXhpdGluZyBmb2N1cyBtb2RlLCB0aGUgcGF0Y2ggaGFuZGxlcyB2aXNpYmlsaXR5IHJlc2V0IHZpYSByZXF1ZXN0U29ydC5cclxuXHRcdC8vIFdlIG9ubHkgbmVlZCB0byBjbGVhciBhbnkgc3RhbGUgaGlkZGVuIGF0dHJpYnV0ZXMuXHJcblx0XHRpZiAoIXRoaXMuaXNGb2N1cyB8fCAhdGhpcy5mb2N1c2VkUGF0aCkge1xyXG5cdFx0XHRPYmplY3QudmFsdWVzKGZpbGVFeHBsb3Jlci5maWxlSXRlbXMpLmZvckVhY2goKHZFbCkgPT4ge1xyXG5cdFx0XHRcdGlmICghdkVsPy5lbCkgcmV0dXJuO1xyXG5cdFx0XHRcdC8vIE9ubHkgdXBkYXRlIGlmIGN1cnJlbnRseSBtYXJrZWQgaGlkZGVuIHRvIG1pbmltaXplIERPTSBvcGVyYXRpb25zXHJcblx0XHRcdFx0aWYgKHZFbC5lbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZXhwbG9yZXItZm9jdXMtaGlkZGVuJykpIHtcclxuXHRcdFx0XHRcdGlmICh2RWwuaW5mbykgdkVsLmluZm8uaGlkZGVuID0gZmFsc2U7XHJcblx0XHRcdFx0XHR2RWwuZWwuc2V0Q3NzUHJvcHMoeyBkaXNwbGF5OiAnJyB9KTtcclxuXHRcdFx0XHRcdHZFbC5lbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZXhwbG9yZXItZm9jdXMtaGlkZGVuJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGZvY3VzZWRQYXRoID0gdGhpcy5mb2N1c2VkUGF0aDtcclxuXHJcblx0XHQvLyBQcmUtY29tcHV0ZSBhbmNlc3RvciBwYXRocyBhcyBhIFNldCBmb3IgTygxKSBsb29rdXBcclxuXHRcdGNvbnN0IGFuY2VzdG9yUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHRcdGNvbnN0IHBhdGhQYXJ0cyA9IGZvY3VzZWRQYXRoLnNwbGl0KCcvJyk7XHJcblx0XHRmb3IgKGxldCBpID0gMTsgaSA8IHBhdGhQYXJ0cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRhbmNlc3RvclBhdGhzLmFkZChwYXRoUGFydHMuc2xpY2UoMCwgaSkuam9pbignLycpKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBHcm91cCBpdGVtcyBieSB0aGVpciB0b3AtbGV2ZWwgZm9sZGVyIGZvciBlZmZpY2llbnQgc3VidHJlZSBza2lwcGluZ1xyXG5cdFx0Y29uc3QgdG9wTGV2ZWxGb2xkZXJzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xyXG5cdFx0Y29uc3Qgcm9vdEl0ZW1zOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHRcdGZvciAoY29uc3QgcGF0aCBvZiBPYmplY3Qua2V5cyhmaWxlRXhwbG9yZXIuZmlsZUl0ZW1zKSkge1xyXG5cdFx0XHRjb25zdCBmaXJzdFNsYXNoID0gcGF0aC5pbmRleE9mKCcvJyk7XHJcblx0XHRcdGlmIChmaXJzdFNsYXNoID09PSAtMSkge1xyXG5cdFx0XHRcdHJvb3RJdGVtcy5wdXNoKHBhdGgpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnN0IHRvcExldmVsID0gcGF0aC5zdWJzdHJpbmcoMCwgZmlyc3RTbGFzaCk7XHJcblx0XHRcdFx0aWYgKCF0b3BMZXZlbEZvbGRlcnMuaGFzKHRvcExldmVsKSkge1xyXG5cdFx0XHRcdFx0dG9wTGV2ZWxGb2xkZXJzLnNldCh0b3BMZXZlbCwgW10pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0b3BMZXZlbEZvbGRlcnMuZ2V0KHRvcExldmVsKSEucHVzaChwYXRoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERldGVybWluZSB3aGljaCB0b3AtbGV2ZWwgZm9sZGVycyBuZWVkIGZ1bGwgcHJvY2Vzc2luZ1xyXG5cdFx0Y29uc3QgZm9jdXNlZFRvcExldmVsID0gZm9jdXNlZFBhdGguc3BsaXQoJy8nKVswXTtcclxuXHJcblx0XHQvLyBQcm9jZXNzIHJvb3QtbGV2ZWwgaXRlbXNcclxuXHRcdGZvciAoY29uc3QgcGF0aCBvZiByb290SXRlbXMpIHtcclxuXHRcdFx0Y29uc3QgdkVsID0gZmlsZUV4cGxvcmVyLmZpbGVJdGVtc1twYXRoXTtcclxuXHRcdFx0aWYgKCF2RWw/LmVsKSBjb250aW51ZTtcclxuXHJcblx0XHRcdGNvbnN0IHNob3VsZFNob3cgPSBwYXRoID09PSBmb2N1c2VkUGF0aCB8fFxyXG5cdFx0XHRcdGZvY3VzZWRQYXRoLnN0YXJ0c1dpdGgocGF0aCArICcvJykgfHxcclxuXHRcdFx0XHRwYXRoLnN0YXJ0c1dpdGgoZm9jdXNlZFBhdGggKyAnLycpO1xyXG5cdFx0XHR0aGlzLnVwZGF0ZUl0ZW1WaXNpYmlsaXR5KHZFbCwgc2hvdWxkU2hvdyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUHJvY2VzcyBlYWNoIHRvcC1sZXZlbCBmb2xkZXJcclxuXHRcdGZvciAoY29uc3QgW3RvcExldmVsLCBwYXRoc10gb2YgdG9wTGV2ZWxGb2xkZXJzKSB7XHJcblx0XHRcdC8vIENoZWNrIGlmIHRoaXMgdG9wLWxldmVsIGZvbGRlciBuZWVkcyBkZXRhaWxlZCBwcm9jZXNzaW5nXHJcblx0XHRcdGNvbnN0IGlzSW5Gb2N1c1BhdGggPSB0b3BMZXZlbCA9PT0gZm9jdXNlZFRvcExldmVsIHx8XHJcblx0XHRcdFx0YW5jZXN0b3JQYXRocy5oYXModG9wTGV2ZWwpIHx8XHJcblx0XHRcdFx0Zm9jdXNlZFBhdGggPT09IHRvcExldmVsO1xyXG5cclxuXHRcdFx0aWYgKCFpc0luRm9jdXNQYXRoKSB7XHJcblx0XHRcdFx0Ly8gVGhpcyBlbnRpcmUgc3VidHJlZSBzaG91bGQgYmUgaGlkZGVuIC0gYmF0Y2ggaGlkZSBhbGwgaXRlbXNcclxuXHRcdFx0XHRmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHZFbCA9IGZpbGVFeHBsb3Jlci5maWxlSXRlbXNbcGF0aF07XHJcblx0XHRcdFx0XHRpZiAoIXZFbD8uZWwpIGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVJdGVtVmlzaWJpbGl0eSh2RWwsIGZhbHNlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gVGhpcyBzdWJ0cmVlIG5lZWRzIGluZGl2aWR1YWwgZXZhbHVhdGlvblxyXG5cdFx0XHRcdGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xyXG5cdFx0XHRcdFx0Y29uc3QgdkVsID0gZmlsZUV4cGxvcmVyLmZpbGVJdGVtc1twYXRoXTtcclxuXHRcdFx0XHRcdGlmICghdkVsPy5lbCkgY29udGludWU7XHJcblxyXG5cdFx0XHRcdFx0Y29uc3Qgc2hvdWxkU2hvdyA9IHBhdGggPT09IGZvY3VzZWRQYXRoIHx8XHJcblx0XHRcdFx0XHRcdHBhdGguc3RhcnRzV2l0aChmb2N1c2VkUGF0aCArICcvJykgfHxcclxuXHRcdFx0XHRcdFx0YW5jZXN0b3JQYXRocy5oYXMocGF0aCk7XHJcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZUl0ZW1WaXNpYmlsaXR5KHZFbCwgc2hvdWxkU2hvdyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHVwZGF0ZUl0ZW1WaXNpYmlsaXR5KHZFbDogeyBpbmZvPzogeyBoaWRkZW46IGJvb2xlYW4gfTsgZWw6IEhUTUxFbGVtZW50IH0sIHNob3VsZFNob3c6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHRcdGNvbnN0IGN1cnJlbnRseUhpZGRlbiA9IHZFbC5lbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtZXhwbG9yZXItZm9jdXMtaGlkZGVuJyk7XHJcblxyXG5cdFx0Ly8gT25seSB1cGRhdGUgRE9NIGlmIHN0YXRlIGFjdHVhbGx5IGNoYW5nZXNcclxuXHRcdGlmIChzaG91bGRTaG93ICYmIGN1cnJlbnRseUhpZGRlbikge1xyXG5cdFx0XHRpZiAodkVsLmluZm8pIHZFbC5pbmZvLmhpZGRlbiA9IGZhbHNlO1xyXG5cdFx0XHR2RWwuZWwuc2V0Q3NzUHJvcHMoeyBkaXNwbGF5OiAnJyB9KTtcclxuXHRcdFx0dkVsLmVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1leHBsb3Jlci1mb2N1cy1oaWRkZW4nKTtcclxuXHRcdH0gZWxzZSBpZiAoIXNob3VsZFNob3cgJiYgIWN1cnJlbnRseUhpZGRlbikge1xyXG5cdFx0XHRpZiAodkVsLmluZm8pIHZFbC5pbmZvLmhpZGRlbiA9IHRydWU7XHJcblx0XHRcdHZFbC5lbC5zZXRDc3NQcm9wcyh7IGRpc3BsYXk6ICdub25lJyB9KTtcclxuXHRcdFx0dkVsLmVsLnNldEF0dHJpYnV0ZSgnZGF0YS1leHBsb3Jlci1mb2N1cy1oaWRkZW4nLCAndHJ1ZScpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dXBkYXRlRm9jdXNNb2RlQ2xhc3NlcygpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGZpbGVFeHBsb3JlcnMgPSBnZXRBbGxGaWxlRXhwbG9yZXJzKHRoaXMpO1xyXG5cdFx0ZmlsZUV4cGxvcmVycy5mb3JFYWNoKGZpbGVFeHBsb3JlciA9PiB7XHJcblx0XHRcdGNvbnN0IGNvbnRhaW5lckVsID0gZmlsZUV4cGxvcmVyLmNvbnRhaW5lckVsO1xyXG5cdFx0XHRpZiAodGhpcy5pc0ZvY3VzKSB7XHJcblx0XHRcdFx0Y29udGFpbmVyRWwuYWRkQ2xhc3MoXCJleHBsb3Jlci1mb2N1cy1tb2RlXCIpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnRhaW5lckVsLnJlbW92ZUNsYXNzKFwiZXhwbG9yZXItZm9jdXMtbW9kZVwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHJcblx0YWRkRmlsZUV4cGxvcmVySWNvbigpIHtcclxuXHRcdGNvbnN0IGhhbmRsZUljb25DbGljayA9ICgpID0+IHtcclxuXHRcdFx0aWYgKHRoaXMuaXNGb2N1cykge1xyXG5cdFx0XHRcdHRoaXMuZXhpdEZvY3VzKCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZm9jdXNMZXZlbCA9PT0gJ2N1c3RvbScpIHtcclxuXHRcdFx0XHRcdC8vIEZvciBjdXN0b20gZm9sZGVyLCB1c2UgdGhlIGN1c3RvbSBwYXRoIGRpcmVjdGx5XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZW50ZXJGb2N1cyh0aGlzLnNldHRpbmdzLmN1c3RvbUZvbGRlclBhdGgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBGb3Igb3RoZXIgbGV2ZWxzLCBuZWVkIHRoZSBjdXJyZW50IGZpbGVcclxuXHRcdFx0XHRcdGNvbnN0IGZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xyXG5cdFx0XHRcdFx0aWYgKGZpbGU/LnBhdGgpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZm9jdXNQYXRoID0gZ2V0Rm9jdXNQYXRoKGZpbGUucGF0aCwgdGhpcy5zZXR0aW5ncy5mb2N1c0xldmVsLCB0aGlzLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5lbnRlckZvY3VzKGZvY3VzUGF0aCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IGFkZEljb25Ub0ZpbGVFeHBsb3JlciA9ICgpID0+IHtcclxuXHRcdFx0Y29uc3QgZmlsZUV4cGxvcmVyTGVhdmVzID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZSgnZmlsZS1leHBsb3JlcicpO1xyXG5cdFx0XHRpZiAoZmlsZUV4cGxvcmVyTGVhdmVzLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgZmlsZUV4cGxvcmVyVmlldyA9IGZpbGVFeHBsb3JlckxlYXZlc1swXS52aWV3LmNvbnRhaW5lckVsO1xyXG5cdFx0XHRjb25zdCBuYXZCdXR0b25zQ29udGFpbmVyID0gZmluZE5hdkJ1dHRvbnNDb250YWluZXIoZmlsZUV4cGxvcmVyVmlldyk7XHJcblx0XHRcdFxyXG5cdFx0XHRpZiAoIW5hdkJ1dHRvbnNDb250YWluZXIpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENoZWNrIGlmIGljb24gYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBjb250YWluZXJcclxuXHRcdFx0aWYgKHRoaXMuZmlsZUV4cGxvcmVySWNvbiAmJiBuYXZCdXR0b25zQ29udGFpbmVyLmNvbnRhaW5zKHRoaXMuZmlsZUV4cGxvcmVySWNvbikpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFJlbW92ZSBvbGQgaWNvbiBpZiBpdCBleGlzdHMgZWxzZXdoZXJlXHJcblx0XHRcdGlmICh0aGlzLmZpbGVFeHBsb3Jlckljb24gJiYgdGhpcy5maWxlRXhwbG9yZXJJY29uLnBhcmVudEVsZW1lbnQpIHtcclxuXHRcdFx0XHR0aGlzLmZpbGVFeHBsb3Jlckljb24ucmVtb3ZlKCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENyZWF0ZSB0aGUgaWNvbiBidXR0b24gaWYgaXQgZG9lc24ndCBleGlzdFxyXG5cdFx0XHRpZiAoIXRoaXMuZmlsZUV4cGxvcmVySWNvbikge1xyXG5cdFx0XHRcdHRoaXMuZmlsZUV4cGxvcmVySWNvbiA9IGNyZWF0ZUZpbGVFeHBsb3Jlckljb24odGhpcyk7XHJcblxyXG5cdFx0XHRcdC8vIERvbid0IHNldCBjdXJzb3IgLSBsZXQgaXQgaW5oZXJpdCBmcm9tIC5jbGlja2FibGUtaWNvbiBjbGFzcyAoY3Vyc29yOiB2YXIoLS1jdXJzb3IpKVxyXG5cdFx0XHRcdC8vIFRoaXMgbWF0Y2hlcyBvdGhlciBmaWxlIGV4cGxvcmVyIGljb25zIHdoaWNoIHVzZSB0aGUgQ1NTIHZhcmlhYmxlXHJcblx0XHRcdFx0dGhpcy5maWxlRXhwbG9yZXJJY29uLnNldENzc1Byb3BzKHsgdG91Y2hBY3Rpb246ICdtYW5pcHVsYXRpb24nIH0pO1xyXG5cclxuXHRcdFx0XHQvLyBVc2UgYSB1bmlmaWVkIGhhbmRsZXIgdGhhdCB3b3JrcyBmb3IgYm90aCBjbGljayBhbmQgdG91Y2hcclxuXHRcdFx0XHQvLyBPbiBtb2JpbGUsIHRvdWNoIGV2ZW50cyB0eXBpY2FsbHkgdHJpZ2dlciBjbGljaywgYnV0IHdlIGhhbmRsZSBib3RoIHRvIGJlIHNhZmVcclxuXHRcdFx0XHRsZXQgdG91Y2hIYW5kbGVkID0gZmFsc2U7XHJcblx0XHRcdFx0XHJcblx0XHRcdFx0dGhpcy5yZWdpc3RlckRvbUV2ZW50KHRoaXMuZmlsZUV4cGxvcmVySWNvbiwgJ3RvdWNoc3RhcnQnLCAoZXZ0KSA9PiB7XHJcblx0XHRcdFx0XHR0b3VjaEhhbmRsZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRoYW5kbGVJY29uQ2xpY2soKTtcclxuXHRcdFx0XHRcdC8vIFJlc2V0IGZsYWcgYWZ0ZXIgYSBzaG9ydCBkZWxheVxyXG5cdFx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7IHRvdWNoSGFuZGxlZCA9IGZhbHNlOyB9LCAzMDApO1xyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHR0aGlzLnJlZ2lzdGVyRG9tRXZlbnQodGhpcy5maWxlRXhwbG9yZXJJY29uLCAnY2xpY2snLCAoZXZ0KSA9PiB7XHJcblx0XHRcdFx0XHQvLyBJZiB0b3VjaHN0YXJ0IGFscmVhZHkgaGFuZGxlZCBpdCwgc2tpcCBjbGljayB0byBhdm9pZCBkb3VibGUtZmlyaW5nXHJcblx0XHRcdFx0XHRpZiAodG91Y2hIYW5kbGVkKSB7XHJcblx0XHRcdFx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdFx0aGFuZGxlSWNvbkNsaWNrKCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdC8vIFNldC91cGRhdGUgaWNvblxyXG5cdFx0XHR0aGlzLnVwZGF0ZUZpbGVFeHBsb3Jlckljb24oKTtcclxuXHJcblx0XHRcdC8vIEluc2VydCBpY29uIGluIGNvcnJlY3QgcG9zaXRpb25cclxuXHRcdFx0aW5zZXJ0RmlsZUV4cGxvcmVySWNvbih0aGlzLmZpbGVFeHBsb3Jlckljb24sIG5hdkJ1dHRvbnNDb250YWluZXIpO1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBUcnkgdG8gYWRkIGltbWVkaWF0ZWx5XHJcblx0XHRhZGRJY29uVG9GaWxlRXhwbG9yZXIoKTtcclxuXHJcblx0XHQvLyBBbHNvIGxpc3RlbiBmb3Igd29ya3NwYWNlIGNoYW5nZXMgaW4gY2FzZSBmaWxlIGV4cGxvcmVyIGlzIGNyZWF0ZWQgbGF0ZXJcclxuXHRcdHRoaXMucmVnaXN0ZXJFdmVudChcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLm9uKCdsYXlvdXQtY2hhbmdlJywgKCkgPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLnNob3dGaWxlRXhwbG9yZXJJY29uKSB7XHJcblx0XHRcdFx0XHRhZGRJY29uVG9GaWxlRXhwbG9yZXIoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0dXBkYXRlRmlsZUV4cGxvcmVySWNvbigpIHtcclxuXHRcdGlmICghdGhpcy5maWxlRXhwbG9yZXJJY29uKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXRoaXMuc2V0dGluZ3Muc2hvd0ZpbGVFeHBsb3Jlckljb24pIHtcclxuXHRcdFx0aWYgKHRoaXMuZmlsZUV4cGxvcmVySWNvbi5wYXJlbnRFbGVtZW50KSB7XHJcblx0XHRcdFx0dGhpcy5maWxlRXhwbG9yZXJJY29uLnJlbW92ZSgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBFbnN1cmUgaWNvbiBpcyBpbiBET00gaWYgc2V0dGluZyBpcyBlbmFibGVkXHJcblx0XHRpZiAoIXRoaXMuZmlsZUV4cGxvcmVySWNvbi5wYXJlbnRFbGVtZW50KSB7XHJcblx0XHRcdC8vIFJlLWluc2VydCB0aGUgaWNvbiBpbnRvIHRoZSBmaWxlIGV4cGxvcmVyXHJcblx0XHRcdGNvbnN0IGZpbGVFeHBsb3JlckxlYXZlcyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoJ2ZpbGUtZXhwbG9yZXInKTtcclxuXHRcdFx0aWYgKGZpbGVFeHBsb3JlckxlYXZlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0Y29uc3QgZmlsZUV4cGxvcmVyVmlldyA9IGZpbGVFeHBsb3JlckxlYXZlc1swXS52aWV3LmNvbnRhaW5lckVsO1xyXG5cdFx0XHRcdGNvbnN0IG5hdkJ1dHRvbnNDb250YWluZXIgPSBmaW5kTmF2QnV0dG9uc0NvbnRhaW5lcihmaWxlRXhwbG9yZXJWaWV3KTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZiAobmF2QnV0dG9uc0NvbnRhaW5lcikge1xyXG5cdFx0XHRcdFx0aW5zZXJ0RmlsZUV4cGxvcmVySWNvbih0aGlzLmZpbGVFeHBsb3Jlckljb24sIG5hdkJ1dHRvbnNDb250YWluZXIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERvbid0IHNldCBjdXJzb3IgLSBsZXQgaXQgaW5oZXJpdCBmcm9tIC5jbGlja2FibGUtaWNvbiBjbGFzcyAoY3Vyc29yOiB2YXIoLS1jdXJzb3IpKVxyXG5cdFx0Ly8gVGhpcyBtYXRjaGVzIG90aGVyIGZpbGUgZXhwbG9yZXIgaWNvbnMgd2hpY2ggdXNlIHRoZSBDU1MgdmFyaWFibGVcclxuXHRcdGlmICh0aGlzLmZpbGVFeHBsb3Jlckljb24uc3R5bGUuY3Vyc29yKSB7XHJcblx0XHRcdHRoaXMuZmlsZUV4cGxvcmVySWNvbi5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnY3Vyc29yJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVG9nZ2xlIGlzLWFjdGl2ZSBjbGFzcyBiYXNlZCBvbiBmb2N1cyBzdGF0ZVxyXG5cdFx0aWYgKHRoaXMuaXNGb2N1cykge1xyXG5cdFx0XHR0aGlzLmZpbGVFeHBsb3Jlckljb24uYWRkQ2xhc3MoJ2lzLWFjdGl2ZScpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5maWxlRXhwbG9yZXJJY29uLnJlbW92ZUNsYXNzKCdpcy1hY3RpdmUnKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHVwZGF0ZUF1dG9IaWRlU3R5bGVzKCk6IHZvaWQge1xyXG5cdFx0Y29uc3QgcGF0aHMgPSBuZXcgU2V0KFxyXG5cdFx0XHQodGhpcy5zZXR0aW5ncy5hdXRvSGlkZVBhdGhzID8/IFtdKVxyXG5cdFx0XHRcdC5tYXAocCA9PiBwLnRyaW0oKSlcclxuXHRcdFx0XHQuZmlsdGVyKHAgPT4gcC5sZW5ndGggPiAwKVxyXG5cdFx0KTtcclxuXHJcblx0XHRjb25zdCBmaWxlRXhwbG9yZXJzID0gZ2V0QWxsRmlsZUV4cGxvcmVycyh0aGlzKTtcclxuXHRcdGZpbGVFeHBsb3JlcnMuZm9yRWFjaChmaWxlRXhwbG9yZXIgPT4ge1xyXG5cdFx0XHRpZiAoIWZpbGVFeHBsb3Jlcj8uZmlsZUl0ZW1zKSByZXR1cm47XHJcblxyXG5cdFx0XHRmb3IgKGNvbnN0IFtmaWxlUGF0aCwgdkVsXSBvZiBPYmplY3QuZW50cmllcyhmaWxlRXhwbG9yZXIuZmlsZUl0ZW1zKSkge1xyXG5cdFx0XHRcdGlmICghdkVsPy5lbCkgY29udGludWU7XHJcblx0XHRcdFx0Y29uc3Qgc2hvdWxkSGlkZSA9IHBhdGhzLmhhcyhmaWxlUGF0aCk7XHJcblx0XHRcdFx0Y29uc3QgaXNIaWRkZW4gPSB2RWwuZWwuaGFzQXR0cmlidXRlKCdkYXRhLWV4cGxvcmVyLWZvY3VzLWF1dG8taGlkZGVuJyk7XHJcblxyXG5cdFx0XHRcdGlmIChzaG91bGRIaWRlICYmICFpc0hpZGRlbikge1xyXG5cdFx0XHRcdFx0dkVsLmVsLnNldENzc1Byb3BzKHsgZGlzcGxheTogJ25vbmUnIH0pO1xyXG5cdFx0XHRcdFx0dkVsLmVsLnNldEF0dHJpYnV0ZSgnZGF0YS1leHBsb3Jlci1mb2N1cy1hdXRvLWhpZGRlbicsICd0cnVlJyk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICghc2hvdWxkSGlkZSAmJiBpc0hpZGRlbikge1xyXG5cdFx0XHRcdFx0dkVsLmVsLnNldENzc1Byb3BzKHsgZGlzcGxheTogJycgfSk7XHJcblx0XHRcdFx0XHR2RWwuZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWV4cGxvcmVyLWZvY3VzLWF1dG8taGlkZGVuJyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG9udW5sb2FkKCkge1xyXG5cdFx0aWYgKHRoaXMuZmlsZUV4cGxvcmVySWNvbikge1xyXG5cdFx0XHR0aGlzLmZpbGVFeHBsb3Jlckljb24ucmVtb3ZlKCk7XHJcblx0XHRcdHRoaXMuZmlsZUV4cGxvcmVySWNvbiA9IG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBFeHBsb3JlckZvY3VzUGx1Z2luO1xyXG5cclxuIiwgImV4cG9ydCBpbnRlcmZhY2UgRXhwbG9yZXJGb2N1c1NldHRpbmdzIHtcblx0c2hvd1JpZ2h0Q2xpY2tNZW51OiBib29sZWFuO1xuXHRzaG93RmlsZUV4cGxvcmVySWNvbjogYm9vbGVhbjtcblx0Zm9jdXNMZXZlbDogJ2ZpbGUnIHwgJ3BhcmVudCcgfCAnZ3JhbmRwYXJlbnQnIHwgJ2dyZWF0Z3JhbmRwYXJlbnQnIHwgJ2N1c3RvbSc7XG5cdGN1c3RvbUZvbGRlclBhdGg6IHN0cmluZztcblx0aGlkZUFuY2VzdG9yRm9sZGVyczogYm9vbGVhbjtcblx0YXV0b0hpZGVQYXRoczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBFeHBsb3JlckZvY3VzU2V0dGluZ3MgPSB7XG5cdHNob3dSaWdodENsaWNrTWVudTogdHJ1ZSxcblx0c2hvd0ZpbGVFeHBsb3Jlckljb246IHRydWUsXG5cdGZvY3VzTGV2ZWw6ICdwYXJlbnQnLFxuXHRjdXN0b21Gb2xkZXJQYXRoOiAnJyxcblx0aGlkZUFuY2VzdG9yRm9sZGVyczogZmFsc2UsXG5cdGF1dG9IaWRlUGF0aHM6IFtdXG59O1xuXG4iLCAiaW1wb3J0IHsgQXBwLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nR3JvdXAgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgRXhwbG9yZXJGb2N1c1BsdWdpbiB9IGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCB7IGdldEFsbEZpbGVFeHBsb3JlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZmlsZS1leHBsb3Jlci1wYXRjaFwiO1xyXG5pbXBvcnQgeyBGb2xkZXJTdWdnZXN0IH0gZnJvbSBcIi4vZm9sZGVyLXN1Z2dlc3RcIjtcclxuaW1wb3J0IHsgQXV0b0hpZGVNb2RhbCB9IGZyb20gXCIuL2F1dG8taGlkZS1tb2RhbFwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBFeHBsb3JlckZvY3VzU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogRXhwbG9yZXJGb2N1c1BsdWdpbjtcclxuXHRwdWJsaWMgaWNvbiA9ICdsdWNpZGUtZm9jdXMnO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBFeHBsb3JlckZvY3VzUGx1Z2luKSB7XHJcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHR9XHJcblxyXG5cdGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XHJcblxyXG5cdFx0Ly8gRmlyc3QgZ3JvdXAgKG5vIGhlYWRpbmcpXHJcblx0XHRjb25zdCBnZW5lcmFsR3JvdXAgPSBuZXcgU2V0dGluZ0dyb3VwKGNvbnRhaW5lckVsKTtcclxuXHJcblx0XHRnZW5lcmFsR3JvdXAuYWRkU2V0dGluZyhzZXR0aW5nID0+IHtcclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKFwiU2hvdyByaWdodC1jbGljayBtZW51IG9wdGlvblwiKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dSaWdodENsaWNrTWVudSlcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dSaWdodENsaWNrTWVudSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdH0pKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0LnNldE5hbWUoXCJTaG93IGZpbGUgZXhwbG9yZXIgaWNvblwiKVxyXG5cdFx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnNob3dGaWxlRXhwbG9yZXJJY29uKVxyXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jIHZhbHVlID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hvd0ZpbGVFeHBsb3Jlckljb24gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnVwZGF0ZUZpbGVFeHBsb3Jlckljb24oKTtcclxuXHRcdFx0XHRcdH0pKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRzZXR0aW5nXHJcblx0XHRcdFx0LnNldE5hbWUoXCJDb21tYW5kIGZvY3VzIGxldmVsXCIpXHJcblx0XHRcdFx0LnNldERlc2MoXCJEZXRlcm1pbmVzIHdoYXQgdG8gZm9jdXMgd2hlbiB1c2luZyB0aGUgdG9nZ2xlIGNvbW1hbmQgb3IgZmlsZSBleHBsb3JlciBpY29uLiBSaWdodC1jbGljayBtZW51IGFsd2F5cyBmb2N1c2VzIHRoZSBjbGlja2VkIGZpbGUvZm9sZGVyLlwiKVxyXG5cdFx0XHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiBkcm9wZG93blxyXG5cdFx0XHRcdFx0LmFkZE9wdGlvbignZmlsZScsIFwiQ3VycmVudCBmaWxlIG9ubHlcIilcclxuXHRcdFx0XHRcdC5hZGRPcHRpb24oJ3BhcmVudCcsIFwiUGFyZW50IGZvbGRlclwiKVxyXG5cdFx0XHRcdFx0LmFkZE9wdGlvbignZ3JhbmRwYXJlbnQnLCBcIkdyYW5kcGFyZW50IGZvbGRlclwiKVxyXG5cdFx0XHRcdFx0LmFkZE9wdGlvbignZ3JlYXRncmFuZHBhcmVudCcsIFwiR3JlYXQgZ3JhbmRwYXJlbnQgZm9sZGVyXCIpXHJcblx0XHRcdFx0XHQuYWRkT3B0aW9uKCdjdXN0b20nLCBcIlNwZWNpZmljIGZvbGRlclwiKVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvY3VzTGV2ZWwpXHJcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9jdXNMZXZlbCA9IHZhbHVlIGFzICdmaWxlJyB8ICdwYXJlbnQnIHwgJ2dyYW5kcGFyZW50JyB8ICdncmVhdGdyYW5kcGFyZW50JyB8ICdjdXN0b20nO1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0Ly8gUmVmcmVzaCBmaWxlIGV4cGxvcmVyIGlmIGluIGZvY3VzIG1vZGVcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMucGx1Z2luLmlzRm9jdXMpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBmaWxlRXhwbG9yZXJzID0gZ2V0QWxsRmlsZUV4cGxvcmVycyh0aGlzLnBsdWdpbik7XHJcblx0XHRcdFx0XHRcdFx0ZmlsZUV4cGxvcmVycy5mb3JFYWNoKChmaWxlRXhwbG9yZXIpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChmaWxlRXhwbG9yZXI/LnJlcXVlc3RTb3J0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpbGVFeHBsb3Jlci5yZXF1ZXN0U29ydCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpOyAvLyBSZWZyZXNoIHRvIHNob3cvaGlkZSBjdXN0b20gZm9sZGVyIGlucHV0XHJcblx0XHRcdFx0XHR9KSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBBZGQgY3VzdG9tIGZvbGRlciBwYXRoIGlucHV0IHRoYXQgb25seSBzaG93cyB3aGVuIGN1c3RvbSBpcyBzZWxlY3RlZFxyXG5cdFx0aWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvY3VzTGV2ZWwgPT09ICdjdXN0b20nKSB7XHJcblx0XHRcdGdlbmVyYWxHcm91cC5hZGRTZXR0aW5nKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRcdHNldHRpbmdcclxuXHRcdFx0XHRcdC5zZXROYW1lKFwiQ3VzdG9tIGZvbGRlciBwYXRoXCIpXHJcblx0XHRcdFx0XHQuc2V0RGVzYyhcIkVudGVyIGEgZm9sZGVyIHBhdGggKGZvbGRlci9zdWJmb2xkZXIpLiBUaGlzIGZvbGRlciB3aWxsIGJlIGZvY3VzZWQgcmVnYXJkbGVzcyBvZiB3aGljaCBmaWxlIGlzIG9wZW4uXCIpXHJcblx0XHRcdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHtcclxuXHRcdFx0XHRcdFx0bmV3IEZvbGRlclN1Z2dlc3QodGhpcy5hcHAsIHRleHQuaW5wdXRFbCk7XHJcblx0XHRcdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0ZvbGRlci9zdWJmb2xkZXInKVxyXG5cdFx0XHRcdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoKVxyXG5cdFx0XHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyB2YWx1ZSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBBdXRvLWhpZGUgZm9sZGVycyBzZWN0aW9uXHJcblx0XHRjb25zdCBhdXRvSGlkZUdyb3VwID0gbmV3IFNldHRpbmdHcm91cChjb250YWluZXJFbClcclxuXHRcdFx0LnNldEhlYWRpbmcoXCJBdXRvLWhpZGUgZm9sZGVyc1wiKTtcclxuXHJcblx0XHRhdXRvSGlkZUdyb3VwLmFkZFNldHRpbmcoc2V0dGluZyA9PiB7XHJcblx0XHRcdGNvbnN0IGF1dG9IaWRlUGF0aHMgPSAodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0hpZGVQYXRocyA/PyBbXSkuZmlsdGVyKHAgPT4gcC50cmltKCkubGVuZ3RoID4gMCk7XHJcblxyXG5cdFx0XHRjb25zdCBkZXNjRnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcblx0XHRcdGRlc2NGcmFnbWVudC5hcHBlbmRUZXh0KFwiVGhlc2UgZm9sZGVycyBhcmUgYWx3YXlzIGhpZGRlbiBmcm9tIHRoZSBmaWxlIGV4cGxvcmVyLlwiKTtcclxuXHJcblx0XHRcdGlmIChhdXRvSGlkZVBhdGhzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRjb25zdCBsaXN0ID0gZGVzY0ZyYWdtZW50LmNyZWF0ZUVsKFwidWxcIik7XHJcblx0XHRcdFx0YXV0b0hpZGVQYXRocy5mb3JFYWNoKHAgPT4ge1xyXG5cdFx0XHRcdFx0bGlzdC5jcmVhdGVFbChcImxpXCIsIHsgdGV4dDogcCB9KTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0c2V0dGluZ1xyXG5cdFx0XHRcdC5zZXROYW1lKFwiSGlkZGVuIGZvbGRlcnNcIilcclxuXHRcdFx0XHQuc2V0RGVzYyhkZXNjRnJhZ21lbnQpXHJcblx0XHRcdFx0LmFkZEJ1dHRvbihidXR0b24gPT4gYnV0dG9uXHJcblx0XHRcdFx0XHQuc2V0QnV0dG9uVGV4dChcIk1hbmFnZVwiKVxyXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRuZXcgQXV0b0hpZGVNb2RhbCh0aGlzLmFwcCwgdGhpcy5wbHVnaW4sICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHRcdFx0fSkub3BlbigpO1xyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxufVxyXG5cclxuIiwgImltcG9ydCB7IE5vdGljZSwgVmlldywgVEFic3RyYWN0RmlsZSwgUGxhdGZvcm0gfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuaW1wb3J0IHsgYXJvdW5kIH0gZnJvbSBcIm1vbmtleS1hcm91bmRcIjtcclxuaW1wb3J0IHsgRXhwbG9yZXJGb2N1c1BsdWdpbiB9IGZyb20gXCIuLi9tYWluXCI7XHJcbmltcG9ydCBcIi4uL3R5cGVzLmRcIjtcclxuXHJcbi8vIFR5cGUgZGVmaW5pdGlvbnMgZnJvbSBtb2R1bGUgYXVnbWVudGF0aW9uXHJcbnR5cGUgUGF0aFZpcnR1YWxFbGVtZW50ID0ge1xyXG5cdGNoaWxkcmVuRWw6IEhUTUxFbGVtZW50O1xyXG5cdGNvbGxhcHNlRWw6IEhUTUxFbGVtZW50O1xyXG5cdGNvbGxhcHNlZDogYm9vbGVhbjtcclxuXHRjb2xsYXBzaWJsZTogYm9vbGVhbjtcclxuXHRjb3ZlckVsOiBIVE1MRWxlbWVudDtcclxuXHRlbDogSFRNTEVsZW1lbnQ7XHJcblx0ZmlsZTogVEFic3RyYWN0RmlsZTtcclxuXHRpbmZvOiB7XHJcblx0XHRjaGlsZExlZnQ6IG51bWJlcjtcclxuXHRcdGNoaWxkTGVmdFBhZGRpbmc6IG51bWJlcjtcclxuXHRcdGNoaWxkVG9wOiBudW1iZXI7XHJcblx0XHRjb21wdXRlZDogYm9vbGVhbjtcclxuXHRcdGhlaWdodDogbnVtYmVyO1xyXG5cdFx0aGlkZGVuOiBib29sZWFuO1xyXG5cdFx0cGlubmVkPzogYm9vbGVhbjtcclxuXHRcdG5leHQ6IGJvb2xlYW47XHJcblx0XHRxdWV1ZWQ6IGJvb2xlYW47XHJcblx0XHR3aWR0aDogbnVtYmVyO1xyXG5cdH07XHJcblx0aW5uZXJFbDogSFRNTEVsZW1lbnQ7XHJcblx0cGFyZW50PzogUGF0aFZpcnR1YWxFbGVtZW50O1xyXG5cdHB1c2hlckVsOiBIVE1MRWxlbWVudDtcclxuXHRzZWxmRWw6IEhUTUxFbGVtZW50O1xyXG5cdHZDaGlsZHJlbjoge1xyXG5cdFx0Y2hpbGRyZW46IFBhdGhWaXJ0dWFsRWxlbWVudDtcclxuXHR9O1xyXG59O1xyXG5cclxuZXhwb3J0IHR5cGUgRmlsZUV4cGxvcmVyVmlldyA9IFZpZXcgJiB7XHJcblx0cmVxdWVzdFNvcnQoKTogdm9pZDtcclxuXHRmaWxlRXhwbG9yZXJQbHVzUGF0Y2hlZD86IGJvb2xlYW47XHJcblx0ZmlsZUl0ZW1zOiB7XHJcblx0XHRba2V5OiBzdHJpbmddOiBQYXRoVmlydHVhbEVsZW1lbnQ7XHJcblx0fTtcclxuXHRjb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XHJcbn07XHJcblxyXG50eXBlIEdldFNvcnRlZEZvbGRlckl0ZW1zRnVuY3Rpb24gPSAoZm9sZGVyOiBUQWJzdHJhY3RGaWxlKSA9PiBQYXRoVmlydHVhbEVsZW1lbnRbXTtcclxuXHJcbi8vIEdsb2JhbCBmbGFncyB0byB0cmFjayBwYXRjaGluZyBzdGF0ZVxyXG5sZXQgcHJvdG90eXBlUGF0Y2hlZCA9IGZhbHNlO1xyXG5sZXQgcGF0Y2hpbmdGYWlsZWQgPSBmYWxzZTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1BhdGNoaW5nRmFpbGVkKCk6IGJvb2xlYW4ge1xyXG5cdHJldHVybiBwYXRjaGluZ0ZhaWxlZDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoRmlsZUV4cGxvcmVyKHBsdWdpbjogRXhwbG9yZXJGb2N1c1BsdWdpbik6IHZvaWQge1xyXG5cdC8vIElmIHBhdGNoaW5nIHByZXZpb3VzbHkgZmFpbGVkLCBkb24ndCByZXRyeSAtIHJlbHkgb24gQ1NTIGZhbGxiYWNrXHJcblx0aWYgKHBhdGNoaW5nRmFpbGVkKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHQvLyBGb3IgbW9iaWxlLCB3ZSBleHBsaWNpdGx5IHNraXAgcHJvdG90eXBlIHBhdGNoaW5nIGFzIGl0IG9mdGVuIGZhaWxzXHJcblx0Ly8gYW5kIHJlbHkgb24gb3VyIHJvYnVzdCBET00tYmFzZWQgZmFsbGJhY2sgaW1wbGVtZW50ZWQgaW4gbWFpbi50c1xyXG5cdGlmIChQbGF0Zm9ybS5pc01vYmlsZSkge1xyXG5cdFx0cGF0Y2hpbmdGYWlsZWQgPSB0cnVlOyAvLyBTZXQgdG8gdHJ1ZSB0byBhdm9pZCByZXRyaWVzLCBidXQgZG9uJ3Qgc2hvdyBub3RpY2VcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGNvbnN0IGZpbGVFeHBsb3JlciA9IGdldEZpbGVFeHBsb3JlcihwbHVnaW4pO1xyXG5cclxuXHRpZiAoIWZpbGVFeHBsb3Jlcikge1xyXG5cdFx0cmV0dXJuOyAvLyBGaWxlIGV4cGxvcmVyIG5vdCBhdmFpbGFibGUgeWV0LCB3aWxsIGJlIHBhdGNoZWQgb24gbGF5b3V0LWNoYW5nZVxyXG5cdH1cclxuXHJcblx0Ly8gUGF0Y2ggdGhlIHByb3RvdHlwZSBvbmx5IG9uY2UgKGFmZmVjdHMgYWxsIGluc3RhbmNlcylcclxuXHRpZiAoIXByb3RvdHlwZVBhdGNoZWQpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihmaWxlRXhwbG9yZXIpO1xyXG5cclxuXHRcdFx0Ly8gVmVyaWZ5IHRoZSBtZXRob2Qgd2UncmUgcGF0Y2hpbmcgZXhpc3RzXHJcblx0XHRcdGlmICh0eXBlb2YgcHJvdG90eXBlLmdldFNvcnRlZEZvbGRlckl0ZW1zICE9PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdnZXRTb3J0ZWRGb2xkZXJJdGVtcyBtZXRob2Qgbm90IGZvdW5kIG9uIGZpbGUgZXhwbG9yZXIgcHJvdG90eXBlJyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBsdWdpbi5yZWdpc3RlcihcclxuXHRcdFx0XHRhcm91bmQocHJvdG90eXBlLCB7XHJcblx0XHRcdFx0XHRnZXRTb3J0ZWRGb2xkZXJJdGVtcyhvbGQ6IEdldFNvcnRlZEZvbGRlckl0ZW1zRnVuY3Rpb24pIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICh0aGlzOiBGaWxlRXhwbG9yZXJWaWV3LCBmb2xkZXI6IFRBYnN0cmFjdEZpbGUpOiBQYXRoVmlydHVhbEVsZW1lbnRbXSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IHNvcnRlZENoaWxkcmVuOiBQYXRoVmlydHVhbEVsZW1lbnRbXSA9IG9sZC5jYWxsKHRoaXMsIGZvbGRlcik7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIEFwcGx5IGZvY3VzIGhpZGluZyBpZiBmb2N1cyBtb2RlIGlzIGFjdGl2ZVxyXG5cdFx0XHRcdFx0XHRcdGlmIChwbHVnaW4uaXNGb2N1cyAmJiBwbHVnaW4uZm9jdXNlZFBhdGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGZvY3VzZWRQYXRoID0gcGx1Z2luLmZvY3VzZWRQYXRoO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHNvcnRlZENoaWxkcmVuID0gc29ydGVkQ2hpbGRyZW4uZmlsdGVyKCh2RWwpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZmlsZVBhdGggPSB2RWwuZmlsZS5wYXRoO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU2hvdyBpdGVtcyB0aGF0IG1hdGNoIHRoZSBmb2N1c2VkIHBhdGggZXhhY3RseVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZmlsZVBhdGggPT09IGZvY3VzZWRQYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dkVsLmluZm8uaGlkZGVuID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFNob3cgaXRlbXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YgdGhlIGZvY3VzZWQgcGF0aFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChmb2N1c2VkUGF0aCArIFwiL1wiKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZFbC5pbmZvLmhpZGRlbiA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTaG93IGl0ZW1zIHRoYXQgYXJlIGFuY2VzdG9ycyBvZiB0aGUgZm9jdXNlZCBwYXRoIChwYXJlbnQgY2hhaW4pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChmb2N1c2VkUGF0aC5zdGFydHNXaXRoKGZpbGVQYXRoICsgXCIvXCIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dkVsLmluZm8uaGlkZGVuID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhpZGUgZXZlcnl0aGluZyBlbHNlXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZFbC5pbmZvLmhpZGRlbiA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBFbnN1cmUgYWxsIGl0ZW1zIGFyZSB2aXNpYmxlIHdoZW4gbm90IGluIGZvY3VzIG1vZGVcclxuXHRcdFx0XHRcdFx0XHRcdHNvcnRlZENoaWxkcmVuLmZvckVhY2goKHZFbCkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2RWwuaW5mby5oaWRkZW4gPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNvcnRlZENoaWxkcmVuO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdHByb3RvdHlwZVBhdGNoZWQgPSB0cnVlO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0cGF0Y2hpbmdGYWlsZWQgPSB0cnVlO1xyXG5cdFx0XHRjb25zb2xlLndhcm4oXHJcblx0XHRcdFx0J1tFeHBsb3JlciBGb2N1c10gRmFpbGVkIHRvIHBhdGNoIGZpbGUgZXhwbG9yZXIuICcgK1xyXG5cdFx0XHRcdCdUaGUgcGx1Z2luIHdpbGwgdXNlIENTUy1iYXNlZCBoaWRpbmcgYXMgYSBmYWxsYmFjaywgd2hpY2ggbWF5IGJlIGxlc3MgcHJlY2lzZS4gJyArXHJcblx0XHRcdFx0J1RoaXMgdXN1YWxseSBoYXBwZW5zIGFmdGVyIGFuIE9ic2lkaWFuIHVwZGF0ZSAtIHBsZWFzZSBjaGVjayBmb3IgcGx1Z2luIHVwZGF0ZXMuJyxcclxuXHRcdFx0XHRlcnJvclxyXG5cdFx0XHQpO1xyXG5cdFx0XHRuZXcgTm90aWNlKFxyXG5cdFx0XHRcdCdFeHBsb3JlciBGb2N1czogRmlsZSBleHBsb3JlciBwYXRjaGluZyBmYWlsZWQuICcgK1xyXG5cdFx0XHRcdCdUaGUgcGx1Z2luIHdpbGwgc3RpbGwgd29yayBidXQgbWF5IG5lZWQgYW4gdXBkYXRlIGZvciBmdWxsIGZ1bmN0aW9uYWxpdHkuJyxcclxuXHRcdFx0XHQ4MDAwXHJcblx0XHRcdCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIE1hcmsgdGhpcyBpbnN0YW5jZSBhcyBwYXRjaGVkXHJcblx0ZmlsZUV4cGxvcmVyLmZpbGVFeHBsb3JlclBsdXNQYXRjaGVkID0gdHJ1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVFeHBsb3JlcihwbHVnaW46IEV4cGxvcmVyRm9jdXNQbHVnaW4pOiBGaWxlRXhwbG9yZXJWaWV3IHwgdW5kZWZpbmVkIHtcclxuXHRjb25zdCBmaWxlRXhwbG9yZXJDb250YWluZXIgPSBwbHVnaW4uYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXCJmaWxlLWV4cGxvcmVyXCIpPy5maXJzdCgpO1xyXG5cdHJldHVybiBmaWxlRXhwbG9yZXJDb250YWluZXI/LnZpZXcgYXMgRmlsZUV4cGxvcmVyVmlldztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZpbGVFeHBsb3JlcnMocGx1Z2luOiBFeHBsb3JlckZvY3VzUGx1Z2luKTogRmlsZUV4cGxvcmVyVmlld1tdIHtcclxuXHRjb25zdCBmaWxlRXhwbG9yZXJMZWF2ZXMgPSBwbHVnaW4uYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXCJmaWxlLWV4cGxvcmVyXCIpO1xyXG5cdHJldHVybiBmaWxlRXhwbG9yZXJMZWF2ZXMubWFwKGxlYWYgPT4gbGVhZi52aWV3IGFzIEZpbGVFeHBsb3JlclZpZXcpO1xyXG59XHJcblxyXG4iLCAiZnVuY3Rpb24gYXJvdW5kKG9iaiwgZmFjdG9yaWVzKSB7XG4gIGNvbnN0IHJlbW92ZXJzID0gT2JqZWN0LmtleXMoZmFjdG9yaWVzKS5tYXAoKGtleSkgPT4gYXJvdW5kMShvYmosIGtleSwgZmFjdG9yaWVzW2tleV0pKTtcbiAgcmV0dXJuIHJlbW92ZXJzLmxlbmd0aCA9PT0gMSA/IHJlbW92ZXJzWzBdIDogZnVuY3Rpb24oKSB7XG4gICAgcmVtb3ZlcnMuZm9yRWFjaCgocikgPT4gcigpKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGFyb3VuZDEob2JqLCBtZXRob2QsIGNyZWF0ZVdyYXBwZXIpIHtcbiAgY29uc3QgaW5oZXJpdGVkID0gb2JqW21ldGhvZF0sIGhhZE93biA9IG9iai5oYXNPd25Qcm9wZXJ0eShtZXRob2QpLCBvcmlnaW5hbCA9IGhhZE93biA/IGluaGVyaXRlZCA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKVttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG4gIGxldCBjdXJyZW50ID0gY3JlYXRlV3JhcHBlcihvcmlnaW5hbCk7XG4gIGlmIChpbmhlcml0ZWQpXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGN1cnJlbnQsIGluaGVyaXRlZCk7XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZih3cmFwcGVyLCBjdXJyZW50KTtcbiAgb2JqW21ldGhvZF0gPSB3cmFwcGVyO1xuICByZXR1cm4gcmVtb3ZlO1xuICBmdW5jdGlvbiB3cmFwcGVyKC4uLmFyZ3MpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gb3JpZ2luYWwgJiYgb2JqW21ldGhvZF0gPT09IHdyYXBwZXIpXG4gICAgICByZW1vdmUoKTtcbiAgICByZXR1cm4gY3VycmVudC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgaWYgKG9ialttZXRob2RdID09PSB3cmFwcGVyKSB7XG4gICAgICBpZiAoaGFkT3duKVxuICAgICAgICBvYmpbbWV0aG9kXSA9IG9yaWdpbmFsO1xuICAgICAgZWxzZVxuICAgICAgICBkZWxldGUgb2JqW21ldGhvZF07XG4gICAgfVxuICAgIGlmIChjdXJyZW50ID09PSBvcmlnaW5hbClcbiAgICAgIHJldHVybjtcbiAgICBjdXJyZW50ID0gb3JpZ2luYWw7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHdyYXBwZXIsIGluaGVyaXRlZCB8fCBGdW5jdGlvbik7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZHVwZShrZXksIG9sZEZuLCBuZXdGbikge1xuICBjaGVja1trZXldID0ga2V5O1xuICByZXR1cm4gY2hlY2s7XG4gIGZ1bmN0aW9uIGNoZWNrKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gKG9sZEZuW2tleV0gPT09IGtleSA/IG9sZEZuIDogbmV3Rm4pLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBhZnRlcihwcm9taXNlLCBjYikge1xuICByZXR1cm4gcHJvbWlzZS50aGVuKGNiLCBjYik7XG59XG5mdW5jdGlvbiBzZXJpYWxpemUoYXN5bmNGdW5jdGlvbikge1xuICBsZXQgbGFzdFJ1biA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBmdW5jdGlvbiB3cmFwcGVyKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gbGFzdFJ1biA9IG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgYWZ0ZXIobGFzdFJ1biwgKCkgPT4ge1xuICAgICAgICBhc3luY0Z1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpLnRoZW4ocmVzLCByZWopO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgd3JhcHBlci5hZnRlciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBsYXN0UnVuID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICBhZnRlcihsYXN0UnVuLCByZXMpO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZXhwb3J0IHsgYWZ0ZXIsIGFyb3VuZCwgZGVkdXBlLCBzZXJpYWxpemUgfTtcbiIsICJpbXBvcnQgeyBBYnN0cmFjdElucHV0U3VnZ2VzdCwgQXBwLCBURm9sZGVyIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5leHBvcnQgY2xhc3MgRm9sZGVyU3VnZ2VzdCBleHRlbmRzIEFic3RyYWN0SW5wdXRTdWdnZXN0PFRGb2xkZXI+IHtcblx0cHJpdmF0ZSBpbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50O1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBpbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50KSB7XG5cdFx0c3VwZXIoYXBwLCBpbnB1dEVsKTtcblx0XHR0aGlzLmlucHV0RWwgPSBpbnB1dEVsO1xuXHR9XG5cblx0Z2V0U3VnZ2VzdGlvbnMocXVlcnk6IHN0cmluZyk6IFRGb2xkZXJbXSB7XG5cdFx0Y29uc3QgbG93ZXJRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG5cdFx0Y29uc3QgZm9sZGVyczogVEZvbGRlcltdID0gW107XG5cblx0XHR0aGlzLmFwcC52YXVsdC5nZXRBbGxMb2FkZWRGaWxlcygpLmZvckVhY2goKGZpbGUpID0+IHtcblx0XHRcdGlmIChmaWxlIGluc3RhbmNlb2YgVEZvbGRlcikge1xuXHRcdFx0XHRpZiAoZmlsZS5wYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJRdWVyeSkpIHtcblx0XHRcdFx0XHRmb2xkZXJzLnB1c2goZmlsZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGZvbGRlcnMuc29ydCgoYSwgYikgPT4gYS5wYXRoLmxvY2FsZUNvbXBhcmUoYi5wYXRoKSk7XG5cdFx0cmV0dXJuIGZvbGRlcnMuc2xpY2UoMCwgMjApO1xuXHR9XG5cblx0cmVuZGVyU3VnZ2VzdGlvbihmb2xkZXI6IFRGb2xkZXIsIGVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuXHRcdGVsLmNyZWF0ZUVsKCdkaXYnLCB7IHRleHQ6IGZvbGRlci5wYXRoIHx8ICcvJyB9KTtcblx0fVxuXG5cdHNlbGVjdFN1Z2dlc3Rpb24oZm9sZGVyOiBURm9sZGVyKTogdm9pZCB7XG5cdFx0dGhpcy5pbnB1dEVsLnZhbHVlID0gZm9sZGVyLnBhdGg7XG5cdFx0dGhpcy5pbnB1dEVsLnRyaWdnZXIoJ2lucHV0Jyk7XG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgQXBwLCBNb2RhbCwgc2V0SWNvbiwgU2V0dGluZywgVGV4dENvbXBvbmVudCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgRXhwbG9yZXJGb2N1c1BsdWdpbiB9IGZyb20gXCIuLi9tYWluXCI7XG5pbXBvcnQgeyBGb2xkZXJTdWdnZXN0IH0gZnJvbSBcIi4vZm9sZGVyLXN1Z2dlc3RcIjtcblxuZXhwb3J0IGNsYXNzIEF1dG9IaWRlTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG5cdHBsdWdpbjogRXhwbG9yZXJGb2N1c1BsdWdpbjtcblx0cHJpdmF0ZSBwYXRoczogc3RyaW5nW107XG5cdHByaXZhdGUgb25TYXZlOiAoKSA9PiB2b2lkO1xuXHRwcml2YXRlIGFkZElucHV0OiBUZXh0Q29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogRXhwbG9yZXJGb2N1c1BsdWdpbiwgb25TYXZlOiAoKSA9PiB2b2lkKSB7XG5cdFx0c3VwZXIoYXBwKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0XHR0aGlzLnBhdGhzID0gWy4uLihwbHVnaW4uc2V0dGluZ3MuYXV0b0hpZGVQYXRocyA/PyBbXSldO1xuXHRcdHRoaXMub25TYXZlID0gb25TYXZlO1xuXHR9XG5cblx0b25PcGVuKCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0VGl0bGUoXCJBdXRvLWhpZGUgZm9sZGVyc1wiKTtcblx0XHR0aGlzLnJlbmRlckNvbnRlbnQoKTtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyQ29udGVudCgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcblxuXHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcInBcIiwge1xuXHRcdFx0dGV4dDogXCJUaGUgZm9sbG93aW5nIGZvbGRlcnMgYXJlIGN1cnJlbnRseSBoaWRkZW4gZnJvbSB0aGUgZmlsZSBleHBsb3Jlci5cIlxuXHRcdH0pO1xuXG5cdFx0Ly8gV3JhcHBlciBkaXYgZm9yIHRoZSBsaXN0IGl0ZW1zIChtYXRjaGVzIG5hdGl2ZSBzdHJ1Y3R1cmUpXG5cdFx0Y29uc3QgbGlzdFdyYXBwZXIgPSBjb250ZW50RWwuY3JlYXRlRGl2KCk7XG5cblx0XHQvLyBMaXN0IGV4aXN0aW5nIHBhdGhzIHVzaW5nIG5hdGl2ZSBPYnNpZGlhbiBjbGFzc2VzXG5cdFx0dGhpcy5wYXRocy5mb3JFYWNoKChwYXRoLCBpbmRleCkgPT4ge1xuXHRcdFx0Y29uc3Qgcm93ID0gbGlzdFdyYXBwZXIuY3JlYXRlRGl2KHsgY2xzOiBcIm1vYmlsZS1vcHRpb24tc2V0dGluZy1pdGVtXCIgfSk7XG5cblx0XHRcdHJvdy5jcmVhdGVTcGFuKHtcblx0XHRcdFx0dGV4dDogcGF0aCB8fCBcIihlbXB0eSlcIixcblx0XHRcdFx0Y2xzOiBcIm1vYmlsZS1vcHRpb24tc2V0dGluZy1pdGVtLW5hbWVcIlxuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IHJlbW92ZUJ0biA9IHJvdy5jcmVhdGVEaXYoe1xuXHRcdFx0XHRjbHM6IFwiY2xpY2thYmxlLWljb24gbW9iaWxlLW9wdGlvbi1zZXR0aW5nLWl0ZW0tb3B0aW9uLWljb25cIixcblx0XHRcdFx0YXR0cjogeyBcImFyaWEtbGFiZWxcIjogXCJEZWxldGVcIiB9XG5cdFx0XHR9KTtcblx0XHRcdHNldEljb24ocmVtb3ZlQnRuLCBcInhcIik7XG5cdFx0XHRyZW1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5wYXRocy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHR0aGlzLnJlbmRlckNvbnRlbnQoKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIG5ldyBmb2xkZXIgaW5wdXRcblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuc2V0TmFtZShcIkZvbGRlclwiKVxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB7XG5cdFx0XHRcdG5ldyBGb2xkZXJTdWdnZXN0KHRoaXMuYXBwLCB0ZXh0LmlucHV0RWwpO1xuXHRcdFx0XHR0ZXh0LnNldFBsYWNlaG9sZGVyKFwiRW50ZXIgZm9sZGVyIHBhdGhcIik7XG5cdFx0XHRcdHRoaXMuYWRkSW5wdXQgPSB0ZXh0O1xuXHRcdFx0fSlcblx0XHRcdC5hZGRCdXR0b24oYnV0dG9uID0+IGJ1dHRvblxuXHRcdFx0XHQuc2V0QnV0dG9uVGV4dChcIkFkZFwiKVxuXHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSB0aGlzLmFkZElucHV0Py5nZXRWYWx1ZSgpPy50cmltKCk7XG5cdFx0XHRcdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnBhdGhzLnB1c2godmFsdWUpO1xuXHRcdFx0XHRcdFx0dGhpcy5hZGRJbnB1dD8uc2V0VmFsdWUoXCJcIik7XG5cdFx0XHRcdFx0XHR0aGlzLnJlbmRlckNvbnRlbnQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pKTtcblxuXHRcdC8vIFNhdmUgLyBDYW5jZWwgYnV0dG9ucyB1c2luZyBuYXRpdmUgbW9kYWwtYnV0dG9uLWNvbnRhaW5lclxuXHRcdHRoaXMubW9kYWxFbC5xdWVyeVNlbGVjdG9yKCcubW9kYWwtYnV0dG9uLWNvbnRhaW5lcicpPy5yZW1vdmUoKTtcblx0XHRjb25zdCBidXR0b25Db250YWluZXIgPSB0aGlzLm1vZGFsRWwuY3JlYXRlRGl2KHsgY2xzOiBcIm1vZGFsLWJ1dHRvbi1jb250YWluZXJcIiB9KTtcblxuXHRcdGNvbnN0IHNhdmVCdG4gPSBidXR0b25Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuXHRcdFx0dGV4dDogXCJTYXZlXCIsXG5cdFx0XHRjbHM6IFwibW9kLWN0YVwiXG5cdFx0fSk7XG5cdFx0c2F2ZUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0hpZGVQYXRocyA9IHRoaXMucGF0aHM7XG5cdFx0XHR2b2lkIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0dGhpcy5wbHVnaW4udXBkYXRlQXV0b0hpZGVTdHlsZXMoKTtcblx0XHRcdHRoaXMub25TYXZlKCk7XG5cdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjYW5jZWxCdG4gPSBidXR0b25Db250YWluZXIuY3JlYXRlRWwoXCJidXR0b25cIiwge1xuXHRcdFx0dGV4dDogXCJDYW5jZWxcIixcblx0XHRcdGNsczogXCJtb2QtY2FuY2VsXCJcblx0XHR9KTtcblx0XHRjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcblx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHR9KTtcblx0fVxufVxuIiwgImltcG9ydCB7IEV4cGxvcmVyRm9jdXNTZXR0aW5ncyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvY3VzUGF0aChcblx0cGF0aDogc3RyaW5nLFxuXHRsZXZlbDogJ2ZpbGUnIHwgJ3BhcmVudCcgfCAnZ3JhbmRwYXJlbnQnIHwgJ2dyZWF0Z3JhbmRwYXJlbnQnIHwgJ2N1c3RvbScsXG5cdHNldHRpbmdzOiBFeHBsb3JlckZvY3VzU2V0dGluZ3Ncbik6IHN0cmluZyB7XG5cdGlmIChsZXZlbCA9PT0gJ2N1c3RvbScpIHtcblx0XHQvLyBVc2UgdGhlIGN1c3RvbSBmb2xkZXIgcGF0aCBmcm9tIHNldHRpbmdzLCByZWdhcmRsZXNzIG9mIGN1cnJlbnQgZmlsZVxuXHRcdHJldHVybiBzZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoIHx8IHBhdGg7XG5cdH1cblxuXHRpZiAobGV2ZWwgPT09ICdmaWxlJykge1xuXHRcdHJldHVybiBwYXRoO1xuXHR9XG5cblx0Y29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7XG5cdFxuXHRpZiAobGV2ZWwgPT09ICdwYXJlbnQnKSB7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIHBhdGg7IC8vIEFscmVhZHkgYXQgcm9vdFxuXHRcdH1cblx0XHRyZXR1cm4gcGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oJy8nKTtcblx0fVxuXG5cdGlmIChsZXZlbCA9PT0gJ2dyYW5kcGFyZW50Jykge1xuXHRcdGlmIChwYXJ0cy5sZW5ndGggPD0gMikge1xuXHRcdFx0cmV0dXJuIHBhcnRzWzBdIHx8IHBhdGg7IC8vIFJldHVybiByb290IG9yIGZpcnN0IHBhcnRcblx0XHR9XG5cdFx0cmV0dXJuIHBhcnRzLnNsaWNlKDAsIC0yKS5qb2luKCcvJyk7XG5cdH1cblxuXHQvLyBncmVhdGdyYW5kcGFyZW50XG5cdGlmIChwYXJ0cy5sZW5ndGggPD0gMykge1xuXHRcdHJldHVybiBwYXJ0c1swXSB8fCBwYXRoOyAvLyBSZXR1cm4gcm9vdCBvciBmaXJzdCBwYXJ0XG5cdH1cblx0cmV0dXJuIHBhcnRzLnNsaWNlKDAsIC0zKS5qb2luKCcvJyk7XG59XG5cbiIsICJpbXBvcnQgeyBFeHBsb3JlckZvY3VzUGx1Z2luIH0gZnJvbSBcIi4uL21haW5cIjtcbmltcG9ydCB7IGdldEZvY3VzUGF0aCB9IGZyb20gXCIuLi91dGlscy9mb2N1c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDb21tYW5kcyhwbHVnaW46IEV4cGxvcmVyRm9jdXNQbHVnaW4pOiB2b2lkIHtcblx0Ly8gVG9nZ2xlIGZvY3VzIGNvbW1hbmRcblx0cGx1Z2luLmFkZENvbW1hbmQoe1xuXHRcdGlkOiBcInRvZ2dsZVwiLFxuXHRcdG5hbWU6IFwiVG9nZ2xlIGZvY3VzXCIsXG5cdFx0Y2FsbGJhY2s6ICgpID0+IHtcblx0XHRcdGlmIChwbHVnaW4uaXNGb2N1cykge1xuXHRcdFx0XHRwbHVnaW4uZXhpdEZvY3VzKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAocGx1Z2luLnNldHRpbmdzLmZvY3VzTGV2ZWwgPT09ICdjdXN0b20nKSB7XG5cdFx0XHRcdFx0Ly8gRm9yIGN1c3RvbSBmb2xkZXIsIHVzZSB0aGUgY3VzdG9tIHBhdGggZGlyZWN0bHlcblx0XHRcdFx0XHRpZiAocGx1Z2luLnNldHRpbmdzLmN1c3RvbUZvbGRlclBhdGgpIHtcblx0XHRcdFx0XHRcdHBsdWdpbi5lbnRlckZvY3VzKHBsdWdpbi5zZXR0aW5ncy5jdXN0b21Gb2xkZXJQYXRoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gRm9yIG90aGVyIGxldmVscywgbmVlZCB0aGUgY3VycmVudCBmaWxlXG5cdFx0XHRcdFx0Y29uc3QgZmlsZSA9IHBsdWdpbi5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblx0XHRcdFx0XHRpZiAoZmlsZT8ucGF0aCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgZm9jdXNQYXRoID0gZ2V0Rm9jdXNQYXRoKGZpbGUucGF0aCwgcGx1Z2luLnNldHRpbmdzLmZvY3VzTGV2ZWwsIHBsdWdpbi5zZXR0aW5ncyk7XG5cdFx0XHRcdFx0XHRwbHVnaW4uZW50ZXJGb2N1cyhmb2N1c1BhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdH0pO1xuXG5cdC8vIEZpbGUgbWVudSBpdGVtXG5cdGlmIChwbHVnaW4uc2V0dGluZ3Muc2hvd1JpZ2h0Q2xpY2tNZW51KSB7XG5cdFx0cGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG5cdFx0XHRwbHVnaW4uYXBwLndvcmtzcGFjZS5vbihcImZpbGUtbWVudVwiLCAobWVudSwgZmlsZSkgPT4ge1xuXHRcdFx0XHRpZiAoIXBsdWdpbi5zZXR0aW5ncy5zaG93UmlnaHRDbGlja01lbnUpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcblx0XHRcdFx0XHRpdGVtXG5cdFx0XHRcdFx0XHQuc2V0VGl0bGUocGx1Z2luLmlzRm9jdXMgPyBcIkV4aXQgZm9jdXNcIiA6IFwiRm9jdXNcIilcblx0XHRcdFx0XHRcdC5zZXRJY29uKHBsdWdpbi5pc0ZvY3VzID8gXCJsb2ctb3V0XCIgOiBcImZvY3VzXCIpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0cGx1Z2luLnRvZ2dsZUZvY3VzKGZpbGU/LnBhdGgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxufVxuXG4iLCAiaW1wb3J0IHsgRXhwbG9yZXJGb2N1c1BsdWdpbiB9IGZyb20gXCIuLi9tYWluXCI7XG5cbi8qKlxuICogRmluZCBvciBjcmVhdGUgdGhlIG5hdmlnYXRpb24gYnV0dG9ucyBjb250YWluZXIgaW4gdGhlIGZpbGUgZXhwbG9yZXIgdmlldy5cbiAqIFRyaWVzIG11bHRpcGxlIHNlbGVjdG9ycyB0byBzdXBwb3J0IGJvdGggZGVza3RvcCBhbmQgbW9iaWxlLlxuICogT24gbW9iaWxlLCBjcmVhdGVzIGEgY29udGFpbmVyIGlmIG5vbmUgZXhpc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE5hdkJ1dHRvbnNDb250YWluZXIoZmlsZUV4cGxvcmVyVmlldzogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuXHQvLyBUcnkgZGVza3RvcCBzZWxlY3RvciBmaXJzdFxuXHRsZXQgY29udGFpbmVyID0gZmlsZUV4cGxvcmVyVmlldy5xdWVyeVNlbGVjdG9yKCcubmF2LWJ1dHRvbnMtY29udGFpbmVyJyk7XG5cdGlmIChjb250YWluZXIpIHtcblx0XHRyZXR1cm4gY29udGFpbmVyIGFzIEhUTUxFbGVtZW50O1xuXHR9XG5cblx0Ly8gVHJ5IGFsdGVybmF0aXZlIHNlbGVjdG9ycyBmb3IgbW9iaWxlXG5cdC8vIE1vYmlsZSBtaWdodCBoYXZlIHRoZSBidXR0b25zIGluIGEgZGlmZmVyZW50IHN0cnVjdHVyZVxuXHRjb250YWluZXIgPSBmaWxlRXhwbG9yZXJWaWV3LnF1ZXJ5U2VsZWN0b3IoJy5uYXYtaGVhZGVyLWJ1dHRvbi1jb250YWluZXInKTtcblx0aWYgKGNvbnRhaW5lcikge1xuXHRcdHJldHVybiBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cdH1cblxuXHQvLyBUcnkgZmluZGluZyBieSBsb29raW5nIGZvciBleGlzdGluZyBuYXYtYWN0aW9uLWJ1dHRvbiBlbGVtZW50c1xuXHRjb25zdCBleGlzdGluZ0J1dHRvbnMgPSBmaWxlRXhwbG9yZXJWaWV3LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYXYtYWN0aW9uLWJ1dHRvbicpO1xuXHRpZiAoZXhpc3RpbmdCdXR0b25zLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBmaXJzdEJ1dHRvbiA9IGV4aXN0aW5nQnV0dG9uc1swXTtcblx0XHRjb25zdCBwYXJlbnQgPSBmaXJzdEJ1dHRvbi5wYXJlbnRFbGVtZW50O1xuXHRcdGlmIChwYXJlbnQgJiYgKHBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ25hdi1idXR0b25zLWNvbnRhaW5lcicpIHx8IFxuXHRcdCAgICAgICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ25hdi1oZWFkZXItYnV0dG9uLWNvbnRhaW5lcicpIHx8XG5cdFx0ICAgICAgICAgICAgICAgQXJyYXkuZnJvbShwYXJlbnQuY2hpbGRyZW4pLnNvbWUoZWwgPT4gZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCduYXYtYWN0aW9uLWJ1dHRvbicpKSkpIHtcblx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVHJ5IGZpbmRpbmcgdGhlIHZpZXcgaGVhZGVyIGFuZCBhcHBlbmRpbmcgdG8gaXRcblx0Y29uc3Qgdmlld0hlYWRlciA9IGZpbGVFeHBsb3JlclZpZXcucXVlcnlTZWxlY3RvcignLnZpZXctaGVhZGVyJykgYXMgSFRNTEVsZW1lbnQ7XG5cdGlmICh2aWV3SGVhZGVyKSB7XG5cdFx0Ly8gTG9vayBmb3IgYW55IGNvbnRhaW5lciB3aXRoIG5hdiBidXR0b25zIGluc2lkZSB0aGUgaGVhZGVyXG5cdFx0Y29uc3QgaGVhZGVyQ29udGFpbmVyID0gdmlld0hlYWRlci5xdWVyeVNlbGVjdG9yKCcubmF2LWJ1dHRvbnMtY29udGFpbmVyJykgYXMgSFRNTEVsZW1lbnQgfHxcblx0XHQgICAgICAgICAgICAgICAgICAgICAgIHZpZXdIZWFkZXIucXVlcnlTZWxlY3RvcignLm5hdi1oZWFkZXItYnV0dG9uLWNvbnRhaW5lcicpIGFzIEhUTUxFbGVtZW50IHx8XG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICB2aWV3SGVhZGVyLnF1ZXJ5U2VsZWN0b3IoJy52aWV3LWhlYWRlci10aXRsZS1jb250YWluZXInKSBhcyBIVE1MRWxlbWVudDtcblx0XHRpZiAoaGVhZGVyQ29udGFpbmVyKSB7XG5cdFx0XHRyZXR1cm4gaGVhZGVyQ29udGFpbmVyO1xuXHRcdH1cblx0XHQvLyBJZiBubyBjb250YWluZXIgZm91bmQsIHJldHVybiB0aGUgaGVhZGVyIGl0c2VsZiBhcyBmYWxsYmFja1xuXHRcdHJldHVybiB2aWV3SGVhZGVyO1xuXHR9XG5cblx0Ly8gTW9iaWxlIGZhbGxiYWNrOiBMb29rIGZvciBuYXYtZmlsZXMtY29udGFpbmVyIGFuZCBjcmVhdGUgYSBidXR0b24gYmFyIGFib3ZlIGl0XG5cdGNvbnN0IG5hdkZpbGVzQ29udGFpbmVyID0gZmlsZUV4cGxvcmVyVmlldy5xdWVyeVNlbGVjdG9yKCcubmF2LWZpbGVzLWNvbnRhaW5lcicpIGFzIEhUTUxFbGVtZW50O1xuXHRpZiAobmF2RmlsZXNDb250YWluZXIpIHtcblx0XHQvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGNyZWF0ZWQgYSBtb2JpbGUgYnV0dG9uIGNvbnRhaW5lclxuXHRcdGxldCBtb2JpbGVCdXR0b25Db250YWluZXIgPSBmaWxlRXhwbG9yZXJWaWV3LnF1ZXJ5U2VsZWN0b3IoJy5leHBsb3Jlci1mb2N1cy1tb2JpbGUtYnV0dG9ucycpIGFzIEhUTUxFbGVtZW50O1xuXHRcdGlmICghbW9iaWxlQnV0dG9uQ29udGFpbmVyKSB7XG5cdFx0XHQvLyBDcmVhdGUgYSBtb2JpbGUgYnV0dG9uIGNvbnRhaW5lclxuXHRcdFx0bW9iaWxlQnV0dG9uQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRtb2JpbGVCdXR0b25Db250YWluZXIuY2xhc3NOYW1lID0gJ25hdi1idXR0b25zLWNvbnRhaW5lciBleHBsb3Jlci1mb2N1cy1tb2JpbGUtYnV0dG9ucyc7XG5cdFx0XHRtb2JpbGVCdXR0b25Db250YWluZXIuc2V0Q3NzUHJvcHMoe1xuXHRcdFx0XHRkaXNwbGF5OiAnZmxleCcsXG5cdFx0XHRcdGFsaWduSXRlbXM6ICdjZW50ZXInLFxuXHRcdFx0XHRnYXA6ICc0cHgnLFxuXHRcdFx0XHRwYWRkaW5nOiAnOHB4Jyxcblx0XHRcdFx0Ym9yZGVyQm90dG9tOiAnMXB4IHNvbGlkIHZhcigtLWJhY2tncm91bmQtbW9kaWZpZXItYm9yZGVyKSdcblx0XHRcdH0pO1xuXHRcdFx0XG5cdFx0XHQvLyBJbnNlcnQgaXQgYmVmb3JlIHRoZSBuYXYtZmlsZXMtY29udGFpbmVyXG5cdFx0XHRuYXZGaWxlc0NvbnRhaW5lci5wYXJlbnRFbGVtZW50Py5pbnNlcnRCZWZvcmUobW9iaWxlQnV0dG9uQ29udGFpbmVyLCBuYXZGaWxlc0NvbnRhaW5lcik7XG5cdFx0fVxuXHRcdHJldHVybiBtb2JpbGVCdXR0b25Db250YWluZXI7XG5cdH1cblxuXHQvLyBMYXN0IHJlc29ydDogY3JlYXRlIGEgY29udGFpbmVyIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdcblx0bGV0IHRvcENvbnRhaW5lciA9IGZpbGVFeHBsb3JlclZpZXcucXVlcnlTZWxlY3RvcignLmV4cGxvcmVyLWZvY3VzLW1vYmlsZS1idXR0b25zJykgYXMgSFRNTEVsZW1lbnQ7XG5cdGlmICghdG9wQ29udGFpbmVyKSB7XG5cdFx0dG9wQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0dG9wQ29udGFpbmVyLmNsYXNzTmFtZSA9ICduYXYtYnV0dG9ucy1jb250YWluZXIgZXhwbG9yZXItZm9jdXMtbW9iaWxlLWJ1dHRvbnMnO1xuXHRcdHRvcENvbnRhaW5lci5zZXRDc3NQcm9wcyh7XG5cdFx0XHRkaXNwbGF5OiAnZmxleCcsXG5cdFx0XHRhbGlnbkl0ZW1zOiAnY2VudGVyJyxcblx0XHRcdGdhcDogJzRweCcsXG5cdFx0XHRwYWRkaW5nOiAnOHB4Jyxcblx0XHRcdGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCB2YXIoLS1iYWNrZ3JvdW5kLW1vZGlmaWVyLWJvcmRlciknXG5cdFx0fSk7XG5cdFx0XG5cdFx0Ly8gSW5zZXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZpZXdcblx0XHRmaWxlRXhwbG9yZXJWaWV3Lmluc2VydEJlZm9yZSh0b3BDb250YWluZXIsIGZpbGVFeHBsb3JlclZpZXcuZmlyc3RDaGlsZCk7XG5cdH1cblx0cmV0dXJuIHRvcENvbnRhaW5lcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZpbGVFeHBsb3Jlckljb24ocGx1Z2luOiBFeHBsb3JlckZvY3VzUGx1Z2luKTogSFRNTEVsZW1lbnQge1xuXHRjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdGljb24uY2xhc3NOYW1lID0gJ2NsaWNrYWJsZS1pY29uIG5hdi1hY3Rpb24tYnV0dG9uJztcblx0aWNvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBcIlRvZ2dsZSBmb2N1c1wiKTtcblxuXHQvLyBDcmVhdGUgdGhlIGZvY3VzIGljb24gU1ZHXG5cdGNvbnN0IHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG5cdHN2Zy5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyk7XG5cdHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzI0Jyk7XG5cdHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcyNCcpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgJzAgMCAyNCAyNCcpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcblx0c3ZnLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJ2N1cnJlbnRDb2xvcicpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCAnMicpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWNhcCcsICdyb3VuZCcpO1xuXHRzdmcuc2V0QXR0cmlidXRlKCdzdHJva2UtbGluZWpvaW4nLCAncm91bmQnKTtcblx0c3ZnLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnc3ZnLWljb24gbHVjaWRlLWZvY3VzJyk7XG5cdFxuXHQvLyBMdWNpZGUgZm9jdXMgaWNvbiAtIGNpcmNsZSB3aXRoIGNvcm5lciBicmFja2V0c1xuXHRjb25zdCBjaXJjbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2NpcmNsZScpO1xuXHRjaXJjbGUuc2V0QXR0cmlidXRlKCdjeCcsICcxMicpO1xuXHRjaXJjbGUuc2V0QXR0cmlidXRlKCdjeScsICcxMicpO1xuXHRjaXJjbGUuc2V0QXR0cmlidXRlKCdyJywgJzMnKTtcblx0c3ZnLmFwcGVuZENoaWxkKGNpcmNsZSk7XG5cdFxuXHRjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuXHRwYXRoMS5zZXRBdHRyaWJ1dGUoJ2QnLCAnTTMgN1Y1YTIgMiAwIDAgMSAyLTJoMicpO1xuXHRzdmcuYXBwZW5kQ2hpbGQocGF0aDEpO1xuXHRcblx0Y29uc3QgcGF0aDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcblx0cGF0aDIuc2V0QXR0cmlidXRlKCdkJywgJ00xNyAzaDJhMiAyIDAgMCAxIDIgMnYyJyk7XG5cdHN2Zy5hcHBlbmRDaGlsZChwYXRoMik7XG5cdFxuXHRjb25zdCBwYXRoMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuXHRwYXRoMy5zZXRBdHRyaWJ1dGUoJ2QnLCAnTTIxIDE3djJhMiAyIDAgMCAxLTIgMmgtMicpO1xuXHRzdmcuYXBwZW5kQ2hpbGQocGF0aDMpO1xuXHRcblx0Y29uc3QgcGF0aDQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcblx0cGF0aDQuc2V0QXR0cmlidXRlKCdkJywgJ003IDIxSDVhMiAyIDAgMCAxLTItMnYtMicpO1xuXHRzdmcuYXBwZW5kQ2hpbGQocGF0aDQpO1xuXHRcblx0aWNvbi5hcHBlbmRDaGlsZChzdmcpO1xuXHRyZXR1cm4gaWNvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEZpbGVFeHBsb3Jlckljb24oaWNvbjogSFRNTEVsZW1lbnQsIG5hdkJ1dHRvbnNDb250YWluZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cdC8vIERvbid0IGluc2VydCBpZiBhbHJlYWR5IGluIHRoZSBjb250YWluZXJcblx0aWYgKG5hdkJ1dHRvbnNDb250YWluZXIuY29udGFpbnMoaWNvbikpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBGaW5kIHRoZSBwb3NpdGlvbiB0byBpbnNlcnQ6IGFmdGVyIGFsbCBkZWZhdWx0IE9ic2lkaWFuIGljb25zLCBiZWZvcmUgYW55IC5jbWRyIGVsZW1lbnRzXG5cdGNvbnN0IGFsbEljb25zID0gQXJyYXkuZnJvbShuYXZCdXR0b25zQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5jbGlja2FibGUtaWNvbi5uYXYtYWN0aW9uLWJ1dHRvbicpKTtcblx0Y29uc3QgZGVmYXVsdEljb25zID0gYWxsSWNvbnMuZmlsdGVyKGVsID0+ICFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NtZHInKSAmJiBlbCAhPT0gaWNvbik7XG5cdGNvbnN0IGNtZHJJY29ucyA9IEFycmF5LmZyb20obmF2QnV0dG9uc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuY21kcicpKTtcblx0XG5cdGlmIChjbWRySWNvbnMubGVuZ3RoID4gMCkge1xuXHRcdC8vIEluc2VydCBiZWZvcmUgZmlyc3QgY21kciBpY29uXG5cdFx0bmF2QnV0dG9uc0NvbnRhaW5lci5pbnNlcnRCZWZvcmUoaWNvbiwgY21kckljb25zWzBdKTtcblx0fSBlbHNlIGlmIChkZWZhdWx0SWNvbnMubGVuZ3RoID4gMCkge1xuXHRcdC8vIEluc2VydCBhZnRlciBsYXN0IGRlZmF1bHQgaWNvblxuXHRcdGNvbnN0IGxhc3RJY29uID0gZGVmYXVsdEljb25zW2RlZmF1bHRJY29ucy5sZW5ndGggLSAxXTtcblx0XHRpZiAobGFzdEljb24ubmV4dFNpYmxpbmcpIHtcblx0XHRcdG5hdkJ1dHRvbnNDb250YWluZXIuaW5zZXJ0QmVmb3JlKGljb24sIGxhc3RJY29uLm5leHRTaWJsaW5nKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmF2QnV0dG9uc0NvbnRhaW5lci5hcHBlbmRDaGlsZChpY29uKTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSnVzdCBhcHBlbmQgaWYgbm8gb3RoZXIgaWNvbnNcblx0XHRuYXZCdXR0b25zQ29udGFpbmVyLmFwcGVuZENoaWxkKGlj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QUFJLFFBQVE7QUFDckMsY0FBTSxXQUFXLElBQUksR0FBRyxhQUFhLGlDQUFpQztBQUV0RSxZQUFJLGNBQWMsQ0FBQyxVQUFVO0FBQzVCLGNBQUksR0FBRyxZQUFZLEVBQUUsU0FBUyxPQUFPLENBQUM7QUFDdEMsY0FBSSxHQUFHLGFBQWEsbUNBQW1DLE1BQU07QUFBQSxRQUM5RCxXQUFXLENBQUMsY0FBYyxVQUFVO0FBQ25DLGNBQUksR0FBRyxZQUFZLEVBQUUsU0FBUyxHQUFHLENBQUM7QUFDbEMsY0FBSSxHQUFHLGdCQUFnQixpQ0FBaUM7QUFBQSxRQUN6RDtBQUFBLE1BQ0Q7QUFBQSxJQUNELENBQUM7QUFBQSxFQUNGO0FBQUEsRUFFQSxXQUFXO0FBQ1YsUUFBSSxLQUFLLGtCQUFrQjtBQUMxQixXQUFLLGlCQUFpQixPQUFPO0FBQzdCLFdBQUssbUJBQW1CO0FBQUEsSUFDekI7QUFBQSxFQUNEO0FBQ0Q7QUFFQSxJQUFPLGVBQVE7IiwKICAibmFtZXMiOiBbImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJfYSJdCn0K