forked from Edikoyo/EdikoyoWiki
265 lines
32 KiB
JavaScript
265 lines
32 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
|
|
*/
|
|
|
|
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);
|
|
|
|
// main.ts
|
|
var main_exports = {};
|
|
__export(main_exports, {
|
|
FileSuggest: () => FileSuggest,
|
|
default: () => PinnedNotesPlugin,
|
|
trimFile: () => trimFile
|
|
});
|
|
module.exports = __toCommonJS(main_exports);
|
|
var import_obsidian = require("obsidian");
|
|
|
|
// node_modules/uuid/dist/esm-browser/rng.js
|
|
var getRandomValues;
|
|
var rnds8 = new Uint8Array(16);
|
|
function rng() {
|
|
if (!getRandomValues) {
|
|
getRandomValues = typeof crypto !== "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
|
|
if (!getRandomValues) {
|
|
throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
|
|
}
|
|
}
|
|
return getRandomValues(rnds8);
|
|
}
|
|
|
|
// node_modules/uuid/dist/esm-browser/stringify.js
|
|
var byteToHex = [];
|
|
for (let i = 0; i < 256; ++i) {
|
|
byteToHex.push((i + 256).toString(16).slice(1));
|
|
}
|
|
function unsafeStringify(arr, offset = 0) {
|
|
return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
|
|
}
|
|
|
|
// node_modules/uuid/dist/esm-browser/native.js
|
|
var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
|
|
var native_default = {
|
|
randomUUID
|
|
};
|
|
|
|
// node_modules/uuid/dist/esm-browser/v4.js
|
|
function v4(options, buf, offset) {
|
|
if (native_default.randomUUID && !buf && !options) {
|
|
return native_default.randomUUID();
|
|
}
|
|
options = options || {};
|
|
const rnds = options.random || (options.rng || rng)();
|
|
rnds[6] = rnds[6] & 15 | 64;
|
|
rnds[8] = rnds[8] & 63 | 128;
|
|
if (buf) {
|
|
offset = offset || 0;
|
|
for (let i = 0; i < 16; ++i) {
|
|
buf[offset + i] = rnds[i];
|
|
}
|
|
return buf;
|
|
}
|
|
return unsafeStringify(rnds);
|
|
}
|
|
var v4_default = v4;
|
|
|
|
// main.ts
|
|
var PinnedNote = class {
|
|
constructor(title, path, icon) {
|
|
this.id = v4_default();
|
|
this.icon = icon;
|
|
this.path = path;
|
|
this.title = title;
|
|
}
|
|
};
|
|
var DEFAULT_SETTINGS = {
|
|
pinnedNotes: []
|
|
};
|
|
var PinnedNotesPlugin = class extends import_obsidian.Plugin {
|
|
async onload() {
|
|
await this.loadSettings();
|
|
this.addSettingTab(new SettingTab(this.app, this));
|
|
}
|
|
async addPinnedNote(note) {
|
|
this.settings.pinnedNotes.push(note);
|
|
await this.saveSettings();
|
|
await this.loadSettings();
|
|
}
|
|
async removePinnedNote(noteId) {
|
|
const noteIndex = this.settings.pinnedNotes.findIndex((note) => note.id === noteId);
|
|
delete this.settings.pinnedNotes[noteIndex];
|
|
this.settings.pinnedNotes.splice(noteIndex, 1);
|
|
await this.saveSettings();
|
|
await this.loadSettings();
|
|
}
|
|
async loadSettings() {
|
|
var _a;
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
|
(_a = this.ribbonIcons) == null ? void 0 : _a.forEach((ribbonIcon, index) => {
|
|
ribbonIcon.remove();
|
|
delete this.ribbonIcons[index];
|
|
});
|
|
this.ribbonIcons = this.settings.pinnedNotes.map(
|
|
(note) => this.addRibbonIcon(
|
|
note.icon === "" ? "file" : note.icon,
|
|
note.title,
|
|
async (e) => {
|
|
await this.app.workspace.openLinkText(note.path, "");
|
|
}
|
|
)
|
|
);
|
|
}
|
|
async saveSettings() {
|
|
await this.saveData(this.settings);
|
|
}
|
|
};
|
|
var SettingTab = class extends import_obsidian.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
const { containerEl } = this;
|
|
containerEl.empty();
|
|
let isCanBeAddedNewNote = true;
|
|
let title = "";
|
|
let path = "";
|
|
let icon = "";
|
|
let changedTitle;
|
|
let changedPath;
|
|
let changedIcon;
|
|
const addNoteButton = new import_obsidian.Setting(containerEl).setName("Add pinned note").setDesc(`Provide: 1) file's name that will be displayed on hover 2) path to this file, e.g Folder1/File1 3) Icon name from lucide.dev; if icon won't be provided, default icon "file" will be placed instead. RESTART OBSIDIAN AFTER CHANGES`);
|
|
isCanBeAddedNewNote && addNoteButton.addButton((button) => {
|
|
button.setIcon("plus").onClick(
|
|
() => {
|
|
isCanBeAddedNewNote = false;
|
|
this.display();
|
|
new import_obsidian.Setting(containerEl).setName("File").addText(
|
|
(text) => text.setPlaceholder("Title").onChange((value) => title = value)
|
|
).addText(
|
|
(text) => {
|
|
new FileSuggest(this.app, text.inputEl);
|
|
text.setPlaceholder("Path").onChange((value) => path = value);
|
|
}
|
|
).addText(
|
|
(text) => text.setPlaceholder("Icon(optional)").onChange((value) => icon = value)
|
|
).addButton((button2) => button2.setIcon("save").onClick(
|
|
async () => {
|
|
if (title.length !== 0 && path.length !== 0) {
|
|
await this.plugin.addPinnedNote(new PinnedNote(title, path, icon));
|
|
isCanBeAddedNewNote = true;
|
|
this.display();
|
|
} else {
|
|
new import_obsidian.Notice("Provide title and path");
|
|
}
|
|
}
|
|
));
|
|
}
|
|
);
|
|
});
|
|
this.plugin.settings.pinnedNotes.forEach((note, index) => {
|
|
new import_obsidian.Setting(containerEl).setName("File " + (index + 1)).addText(
|
|
(text) => text.setPlaceholder("Title").setValue(note.title).onChange(async (value) => {
|
|
changedTitle = value;
|
|
})
|
|
).addText(
|
|
(text) => {
|
|
new FileSuggest(this.app, text.inputEl);
|
|
text.setPlaceholder("Path").setValue(note.path).onChange(async (value) => {
|
|
changedPath = value;
|
|
});
|
|
}
|
|
).addText(
|
|
(text) => text.setPlaceholder("Icon(optional)").setValue(note.icon).onChange(async (value) => {
|
|
changedIcon = value;
|
|
})
|
|
).addButton(
|
|
(button) => button.setIcon("save").onClick(
|
|
async () => {
|
|
if ((changedTitle === void 0 || changedTitle === note.title) && (changedPath === void 0 || changedPath === note.path) && (changedIcon === void 0 || changedIcon === note.icon)) {
|
|
new import_obsidian.Notice("Provide any data");
|
|
return;
|
|
}
|
|
if (changedTitle !== void 0) {
|
|
if (changedTitle.length !== 0) {
|
|
note.title = changedTitle;
|
|
changedTitle = void 0;
|
|
} else
|
|
new import_obsidian.Notice("Provide title");
|
|
}
|
|
if (changedPath !== void 0) {
|
|
if (changedPath.length !== 0) {
|
|
note.path = changedPath;
|
|
changedPath = void 0;
|
|
} else
|
|
new import_obsidian.Notice("Provide path");
|
|
}
|
|
if (changedIcon !== void 0) {
|
|
note.icon = changedIcon;
|
|
changedIcon = void 0;
|
|
}
|
|
await this.plugin.saveSettings();
|
|
await this.plugin.loadSettings();
|
|
this.display();
|
|
}
|
|
)
|
|
).addButton((button) => button.setIcon("trash-2").setWarning().onClick(
|
|
async () => {
|
|
await this.plugin.removePinnedNote(note.id);
|
|
this.display();
|
|
}
|
|
));
|
|
});
|
|
}
|
|
};
|
|
var FileSuggest = class extends import_obsidian.AbstractInputSuggest {
|
|
getSuggestions(inputStr) {
|
|
const abstractFiles = this.app.vault.getAllLoadedFiles();
|
|
const files = [];
|
|
const inputLower = inputStr.toLowerCase();
|
|
abstractFiles.forEach((file) => {
|
|
if (file instanceof import_obsidian.TFile && ["md", "canvas"].contains(file.extension) && file.path.toLowerCase().contains(inputLower)) {
|
|
files.push(file);
|
|
}
|
|
});
|
|
return files;
|
|
}
|
|
renderSuggestion(file, el) {
|
|
if (file.extension == "md") {
|
|
el.setText(trimFile(file));
|
|
} else {
|
|
el.setText(file.path.slice(0, -7));
|
|
el.insertAdjacentHTML(
|
|
"beforeend",
|
|
`<div class="nav-file-tag" style="display:inline-block;vertical-align:middle">canvas</div>`
|
|
);
|
|
}
|
|
}
|
|
selectSuggestion(file) {
|
|
this.textInputEl.value = trimFile(file);
|
|
this.textInputEl.trigger("input");
|
|
this.close();
|
|
}
|
|
};
|
|
function trimFile(file) {
|
|
if (!file)
|
|
return "";
|
|
return file.extension == "md" ? file.path.slice(0, -3) : file.path;
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25hdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge1xyXG5cdEFic3RyYWN0SW5wdXRTdWdnZXN0LFxyXG5cdEFwcCxcclxuXHRJY29uTmFtZSxcclxuXHROb3RpY2UsXHJcblx0UGx1Z2luLFxyXG5cdFBsdWdpblNldHRpbmdUYWIsXHJcblx0U2V0dGluZyxcclxuXHRUQWJzdHJhY3RGaWxlLFxyXG5cdFRGaWxlXHJcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCB7djQgYXMgdXVpZHY0fSBmcm9tIFwidXVpZFwiO1xyXG5cclxuY2xhc3MgUGlubmVkTm90ZSB7XHJcblx0aWQ6IG51bWJlcjtcclxuXHRpY29uOiBJY29uTmFtZTtcclxuXHRwYXRoOiBzdHJpbmc7XHJcblx0dGl0bGU6IHN0cmluZztcclxuXHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0dGl0bGU6IHN0cmluZyxcclxuXHRcdHBhdGg6IHN0cmluZyxcclxuXHRcdGljb246IEljb25OYW1lXHJcblx0KSB7XHJcblx0XHR0aGlzLmlkID0gdXVpZHY0KClcclxuXHRcdHRoaXMuaWNvbiA9IGljb247XHJcblx0XHR0aGlzLnBhdGggPSBwYXRoO1xyXG5cdFx0dGhpcy50aXRsZSA9IHRpdGxlO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUGlubmVkTm90ZXNQbHVnaW5TZXR0aW5ncyB7XHJcblx0cGlubmVkTm90ZXM6IFBpbm5lZE5vdGVbXVxyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBJUGlubmVkTm90ZXNQbHVnaW5TZXR0aW5ncyA9IHtcclxuXHRwaW5uZWROb3RlczogW11cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGlubmVkTm90ZXNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xyXG5cdHNldHRpbmdzOiBJUGlubmVkTm90ZXNQbHVnaW5TZXR0aW5nc1xyXG5cdHJpYmJvbkljb25zOiBIVE1MRWxlbWVudFtdXHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKVxyXG5cdH1cclxuXHJcblx0YXN5bmMgYWRkUGlubmVkTm90ZShub3RlOiBQaW5uZWROb3RlKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzLnBpbm5lZE5vdGVzLnB1c2gobm90ZSlcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZVNldHRpbmdzKClcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKClcclxuXHR9XHJcblxyXG5cdGFzeW5jIHJlbW92ZVBpbm5lZE5vdGUobm90ZUlkOiBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG5vdGVJbmRleCA9IHRoaXMuc2V0dGluZ3MucGlubmVkTm90ZXMuZmluZEluZGV4KChub3RlKSA9PiBub3RlLmlkID09PSBub3RlSWQpXHJcblx0XHRkZWxldGUgdGhpcy5zZXR0aW5ncy5waW5uZWROb3Rlc1tub3RlSW5kZXhdXHJcblx0XHR0aGlzLnNldHRpbmdzLnBpbm5lZE5vdGVzLnNwbGljZShub3RlSW5kZXgsIDEpXHJcblx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpXHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpXHJcblx0fVxyXG5cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcblx0XHR0aGlzLnJpYmJvbkljb25zPy5mb3JFYWNoKChyaWJib25JY29uLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRyaWJib25JY29uLnJlbW92ZSgpXHJcblx0XHRcdGRlbGV0ZSB0aGlzLnJpYmJvbkljb25zW2luZGV4XVxyXG5cdFx0fSlcclxuXHRcdHRoaXMucmliYm9uSWNvbnMgPSB0aGlzLnNldHRpbmdzLnBpbm5lZE5vdGVzLm1hcCgobm90ZSkgPT5cclxuXHRcdFx0dGhpcy5hZGRSaWJib25JY29uKFxyXG5cdFx0XHRcdG5vdGUuaWNvbiA9PT0gXCJcIiA/IFwiZmlsZVwiIDogbm90ZS5pY29uLFxyXG5cdFx0XHRcdG5vdGUudGl0bGUsXHJcblx0XHRcdFx0YXN5bmMgKGUpID0+IHtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobm90ZS5wYXRoLCBcIlwiKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KVxyXG5cdFx0KVxyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuXHJcbmNsYXNzIFNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHRwbHVnaW46IFBpbm5lZE5vdGVzUGx1Z2luXHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFBpbm5lZE5vdGVzUGx1Z2luKSB7XHJcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHR9XHJcblxyXG5cdGRpc3BsYXkoKSB7XHJcblx0XHRjb25zdCB7Y29udGFpbmVyRWx9ID0gdGhpcztcclxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KClcclxuXHRcdGxldCBpc0NhbkJlQWRkZWROZXdOb3RlID0gdHJ1ZVxyXG5cdFx0bGV0IHRpdGxlID0gXCJcIlxyXG5cdFx0bGV0IHBhdGggPSBcIlwiXHJcblx0XHRsZXQgaWNvbjogSWNvbk5hbWUgPSBcIlwiXHJcblx0XHRsZXQgY2hhbmdlZFRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblx0XHRsZXQgY2hhbmdlZFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHRcdGxldCBjaGFuZ2VkSWNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cdFx0Y29uc3QgYWRkTm90ZUJ1dHRvbiA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZShcIkFkZCBwaW5uZWQgbm90ZVwiKVxyXG5cdFx0XHQuc2V0RGVzYyhcIlByb3ZpZGU6IDEpIGZpbGUncyBuYW1lIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gaG92ZXIgMikgcGF0aCB0byB0aGlzIGZpbGUsIGUuZyBGb2xkZXIxL0ZpbGUxIDMpIEljb24gbmFtZSBmcm9tIGx1Y2lkZS5kZXY7IGlmIGljb24gd29uJ3QgYmUgcHJvdmlkZWQsIGRlZmF1bHQgaWNvbiBcXFwiZmlsZVxcXCIgd2lsbCBiZSBwbGFjZWQgaW5zdGVhZC4gUkVTVEFSVCBPQlNJRElBTiBBRlRFUiBDSEFOR0VTXCIpXHJcblx0XHRpc0NhbkJlQWRkZWROZXdOb3RlICYmIGFkZE5vdGVCdXR0b25cclxuXHRcdFx0LmFkZEJ1dHRvbigoYnV0dG9uKSA9PiB7XHJcblx0XHRcdFx0YnV0dG9uLnNldEljb24oXCJwbHVzXCIpLm9uQ2xpY2soXHJcblx0XHRcdFx0XHQoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlzQ2FuQmVBZGRlZE5ld05vdGUgPSBmYWxzZVxyXG5cdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKVxyXG5cdFx0XHRcdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0XHRcdFx0XHQuc2V0TmFtZShcIkZpbGVcIilcclxuXHRcdFx0XHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHRcdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiVGl0bGVcIilcclxuXHRcdFx0XHRcdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHRpdGxlID0gdmFsdWUpXHJcblx0XHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHRuZXcgRmlsZVN1Z2dlc3QodGhpcy5hcHAsIHRleHQuaW5wdXRFbCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRleHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJQYXRoXCIpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4gcGF0aCA9IHZhbHVlKVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHRcdFx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKFwiSWNvbihvcHRpb25hbClcIilcclxuXHRcdFx0XHRcdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IGljb24gPSB2YWx1ZSlcclxuXHRcdFx0XHRcdFx0XHQpXHJcblx0XHRcdFx0XHRcdFx0LmFkZEJ1dHRvbigoYnV0dG9uKSA9PiBidXR0b24uc2V0SWNvbihcInNhdmVcIikub25DbGljayhcclxuXHRcdFx0XHRcdFx0XHRcdGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRpdGxlLmxlbmd0aCAhPT0gMCAmJiBwYXRoLmxlbmd0aCAhPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLmFkZFBpbm5lZE5vdGUobmV3IFBpbm5lZE5vdGUodGl0bGUsIHBhdGgsIGljb24pKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlzQ2FuQmVBZGRlZE5ld05vdGUgPSB0cnVlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KClcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKFwiUHJvdmlkZSB0aXRsZSBhbmQgcGF0aFwiKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0KSlcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpXHJcblx0XHRcdH0pXHJcblxyXG5cdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucGlubmVkTm90ZXMuZm9yRWFjaCgobm90ZSwgaW5kZXgpID0+IHtcclxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdFx0LnNldE5hbWUoXCJGaWxlIFwiICsgKGluZGV4ICsgMSkpXHJcblx0XHRcdFx0LmFkZFRleHQoKHRleHQpID0+IHRleHRcclxuXHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIlRpdGxlXCIpXHJcblx0XHRcdFx0XHQuc2V0VmFsdWUobm90ZS50aXRsZSlcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0Y2hhbmdlZFRpdGxlID0gdmFsdWU7XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHQuYWRkVGV4dCgodGV4dCkgPT4ge1xyXG5cdFx0XHRcdFx0bmV3IEZpbGVTdWdnZXN0KHRoaXMuYXBwLCB0ZXh0LmlucHV0RWwpXHJcblx0XHRcdFx0XHR0ZXh0XHJcblx0XHRcdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihcIlBhdGhcIilcclxuXHRcdFx0XHRcdFx0LnNldFZhbHVlKG5vdGUucGF0aClcclxuXHRcdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGNoYW5nZWRQYXRoID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB0ZXh0XHJcblx0XHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoXCJJY29uKG9wdGlvbmFsKVwiKVxyXG5cdFx0XHRcdFx0LnNldFZhbHVlKG5vdGUuaWNvbilcclxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdFx0Y2hhbmdlZEljb24gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdC5hZGRCdXR0b24oKGJ1dHRvbikgPT4gYnV0dG9uLnNldEljb24oXCJzYXZlXCIpLm9uQ2xpY2soXHJcblx0XHRcdFx0XHRhc3luYyAoKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHQoY2hhbmdlZFRpdGxlID09PSB1bmRlZmluZWQgfHwgY2hhbmdlZFRpdGxlID09PSBub3RlLnRpdGxlKSAmJlxyXG5cdFx0XHRcdFx0XHRcdChjaGFuZ2VkUGF0aCA9PT0gdW5kZWZpbmVkIHx8IGNoYW5nZWRQYXRoID09PSBub3RlLnBhdGgpICYmXHJcblx0XHRcdFx0XHRcdFx0KGNoYW5nZWRJY29uID09PSB1bmRlZmluZWQgfHwgY2hhbmdlZEljb24gPT09IG5vdGUuaWNvbilcclxuXHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShcIlByb3ZpZGUgYW55IGRhdGFcIilcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKGNoYW5nZWRUaXRsZSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGNoYW5nZWRUaXRsZS5sZW5ndGggIT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdG5vdGUudGl0bGUgPSBjaGFuZ2VkVGl0bGVcclxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZWRUaXRsZSA9IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRlbHNlIG5ldyBOb3RpY2UoXCJQcm92aWRlIHRpdGxlXCIpXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKGNoYW5nZWRQYXRoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoY2hhbmdlZFBhdGgubGVuZ3RoICE9PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRub3RlLnBhdGggPSBjaGFuZ2VkUGF0aFxyXG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlZFBhdGggPSB1bmRlZmluZWRcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0ZWxzZSBuZXcgTm90aWNlKFwiUHJvdmlkZSBwYXRoXCIpXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKGNoYW5nZWRJY29uICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRub3RlLmljb24gPSBjaGFuZ2VkSWNvblxyXG5cdFx0XHRcdFx0XHRcdGNoYW5nZWRJY29uID0gdW5kZWZpbmVkXHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLmxvYWRTZXR0aW5ncygpXHJcblx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpXHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHQuYWRkQnV0dG9uKChidXR0b24pID0+IGJ1dHRvbi5zZXRJY29uKFwidHJhc2gtMlwiKS5zZXRXYXJuaW5nKCkub25DbGljayhcclxuXHRcdFx0XHRcdGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4ucmVtb3ZlUGlubmVkTm90ZShub3RlLmlkKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KClcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQpKVxyXG5cdFx0fSlcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGaWxlU3VnZ2VzdCBleHRlbmRzIEFic3RyYWN0SW5wdXRTdWdnZXN0PFRGaWxlPiB7XHJcblx0dGV4dElucHV0RWw6IEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG5cdGdldFN1Z2dlc3Rpb25zKGlucHV0U3RyOiBzdHJpbmcpOiBURmlsZVtdIHtcclxuXHRcdGNvbnN0IGFic3RyYWN0RmlsZXMgPSB0aGlzLmFwcC52YXVsdC5nZXRBbGxMb2FkZWRGaWxlcygpO1xyXG5cdFx0Y29uc3QgZmlsZXM6IFRGaWxlW10gPSBbXTtcclxuXHRcdGNvbnN0IGlucHV0TG93ZXIgPSBpbnB1dFN0ci50b0xvd2VyQ2FzZSgpO1xyXG5cclxuXHRcdGFic3RyYWN0RmlsZXMuZm9yRWFjaCgoZmlsZTogVEFic3RyYWN0RmlsZSkgPT4ge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0ZmlsZSBpbnN0YW5jZW9mIFRGaWxlICYmIFtcIm1kXCIsIFwiY2FudmFzXCJdLmNvbnRhaW5zKGZpbGUuZXh0ZW5zaW9uKSAmJlxyXG5cdFx0XHRcdGZpbGUucGF0aC50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKGlucHV0TG93ZXIpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGZpbGVzLnB1c2goZmlsZSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIGZpbGVzO1xyXG5cdH1cclxuXHJcblx0cmVuZGVyU3VnZ2VzdGlvbihmaWxlOiBURmlsZSwgZWw6IEhUTUxFbGVtZW50KSB7XHJcblx0XHRpZiAoZmlsZS5leHRlbnNpb24gPT0gXCJtZFwiKSB7XHJcblx0XHRcdGVsLnNldFRleHQodHJpbUZpbGUoZmlsZSkpO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdC8vd2UgZG9uJ3QgdXNlIHRyaW1GaWxlIGhlcmUgYXMgdGhlIGV4dGVuc2lvbiBpc24ndCBkaXNwbGF5ZWQgaGVyZVxyXG5cdFx0XHRlbC5zZXRUZXh0KGZpbGUucGF0aC5zbGljZSgwLCAtNykpXHJcblx0XHRcdGVsLmluc2VydEFkamFjZW50SFRNTChcclxuXHRcdFx0XHRcImJlZm9yZWVuZFwiLFxyXG5cdFx0XHRcdGA8ZGl2IGNsYXNzPVwibmF2LWZpbGUtdGFnXCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGVcIj5jYW52YXM8L2Rpdj5gXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzZWxlY3RTdWdnZXN0aW9uKGZpbGU6IFRGaWxlKSB7XHJcblx0XHR0aGlzLnRleHRJbnB1dEVsLnZhbHVlID0gdHJpbUZpbGUoZmlsZSk7XHJcblx0XHR0aGlzLnRleHRJbnB1dEVsLnRyaWdnZXIoXCJpbnB1dFwiKTtcclxuXHRcdHRoaXMuY2xvc2UoKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmltRmlsZShmaWxlOiBURmlsZSk6IHN0cmluZyB7XHJcblx0aWYgKCFmaWxlKSByZXR1cm4gXCJcIjtcclxuXHRyZXR1cm4gZmlsZS5leHRlbnNpb24gPT0gXCJtZFwiID8gZmlsZS5wYXRoLnNsaWNlKDAsIC0zKTogZmlsZS5wYXRoO1xyXG59XHJcbiIsICIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbmxldCBnZXRSYW5kb21WYWx1ZXM7XG5jb25zdCBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJuZygpIHtcbiAgLy8gbGF6eSBsb2FkIHNvIHRoYXQgZW52aXJvbm1lbnRzIHRoYXQgbmVlZCB0byBwb2x5ZmlsbCBoYXZlIGEgY2hhbmNlIHRvIGRvIHNvXG4gIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gZ2V0UmFuZG9tVmFsdWVzIG5lZWRzIHRvIGJlIGludm9rZWQgaW4gYSBjb250ZXh0IHdoZXJlIFwidGhpc1wiIGlzIGEgQ3J5cHRvIGltcGxlbWVudGF0aW9uLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsICJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cblxuY29uc3QgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnNsaWNlKDEpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHJldHVybiBieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICBjb25zdCB1dWlkID0gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0KTsgLy8gQ29uc2lzdGVuY3kgY2hlY2sgZm9yIHZhbGlkIFVVSUQuICBJZiB0aGlzIHRocm93cywgaXQncyBsaWtlbHkgZHVlIHRvIG9uZVxuICAvLyBvZiB0aGUgZm9sbG93aW5nOlxuICAvLyAtIE9uZSBvciBtb3JlIGlucHV0IGFycmF5IHZhbHVlcyBkb24ndCBtYXAgdG8gYSBoZXggb2N0ZXQgKGxlYWRpbmcgdG9cbiAgLy8gXCJ1bmRlZmluZWRcIiBpbiB0aGUgdXVpZClcbiAgLy8gLSBJbnZhbGlkIGlucHV0IHZhbHVlcyBmb3IgdGhlIFJGQyBgdmVyc2lvbmAgb3IgYHZhcmlhbnRgIGZpZWxkc1xuXG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgcmV0dXJuIHV1aWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ2lmeTsiLCAiY29uc3QgcmFuZG9tVVVJRCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEICYmIGNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgcmFuZG9tVVVJRFxufTsiLCAiaW1wb3J0IG5hdGl2ZSBmcm9tICcuL25hdGl2ZS5qcyc7XG5pbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCB7IHVuc2FmZVN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgaWYgKG5hdGl2ZS5yYW5kb21VVUlEICYmICFidWYgJiYgIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmF0aXZlLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHVuc2FmZVN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFVTzs7O0FDUFAsSUFBSTtBQUNKLElBQU0sUUFBUSxJQUFJLFdBQVcsRUFBRTtBQUNoQixTQUFSLE1BQXVCO0FBRTVCLE1BQUksQ0FBQyxpQkFBaUI7QUFFcEIsc0JBQWtCLE9BQU8sV0FBVyxlQUFlLE9BQU8sbUJBQW1CLE9BQU8sZ0JBQWdCLEtBQUssTUFBTTtBQUUvRyxRQUFJLENBQUMsaUJBQWlCO0FBQ3BCLFlBQU0sSUFBSSxNQUFNLDBHQUEwRztBQUFBLElBQzVIO0FBQUEsRUFDRjtBQUVBLFNBQU8sZ0JBQWdCLEtBQUs7QUFDOUI7OztBQ1hBLElBQU0sWUFBWSxDQUFDO0FBRW5CLFNBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLEdBQUc7QUFDNUIsWUFBVSxNQUFNLElBQUksS0FBTyxTQUFTLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRDtBQUVPLFNBQVMsZ0JBQWdCLEtBQUssU0FBUyxHQUFHO0FBRy9DLFNBQU8sVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksTUFBTSxVQUFVLElBQUksU0FBUyxDQUFDLENBQUMsSUFBSSxVQUFVLElBQUksU0FBUyxDQUFDLENBQUMsSUFBSSxNQUFNLFVBQVUsSUFBSSxTQUFTLENBQUMsQ0FBQyxJQUFJLFVBQVUsSUFBSSxTQUFTLENBQUMsQ0FBQyxJQUFJLE1BQU0sVUFBVSxJQUFJLFNBQVMsQ0FBQyxDQUFD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
|