From 853f31462b32babb01e502a3f14b7b296d7c31bc Mon Sep 17 00:00:00 2001
From: JianxiangTian <61312155+moyanxinxu@users.noreply.github.com>
Date: Tue, 12 Nov 2024 23:10:56 +0800
Subject: [PATCH] Add Dataset method introduction (#55)
* fix: Add Dataset method introduction
* add obdisian config file
---
.gitignore | 2 +-
.obsidian/app.json | 10 +
.obsidian/appearance.json | 7 +
.obsidian/community-plugins.json | 3 +
.obsidian/core-plugins-migration.json | 30 +
.obsidian/core-plugins.json | 30 +
.../plugins/easy-typing-obsidian/data.json | 59 +
.../plugins/easy-typing-obsidian/main.js | 4128 ++++++++
.../easy-typing-obsidian/manifest.json | 11 +
.../plugins/easy-typing-obsidian/styles.css | 17 +
.obsidian/themes/Border/manifest.json | 7 +
.obsidian/themes/Border/theme.css | 9019 +++++++++++++++++
.obsidian/workspace.json | 137 +
.obsidian/workspaces.json | 1 +
docs/chapter1/dataset_tour/datasets.md | 243 +-
15 files changed, 13695 insertions(+), 9 deletions(-)
create mode 100644 .obsidian/app.json
create mode 100644 .obsidian/appearance.json
create mode 100644 .obsidian/community-plugins.json
create mode 100644 .obsidian/core-plugins-migration.json
create mode 100644 .obsidian/core-plugins.json
create mode 100644 .obsidian/plugins/easy-typing-obsidian/data.json
create mode 100644 .obsidian/plugins/easy-typing-obsidian/main.js
create mode 100644 .obsidian/plugins/easy-typing-obsidian/manifest.json
create mode 100644 .obsidian/plugins/easy-typing-obsidian/styles.css
create mode 100644 .obsidian/themes/Border/manifest.json
create mode 100644 .obsidian/themes/Border/theme.css
create mode 100644 .obsidian/workspace.json
create mode 100644 .obsidian/workspaces.json
diff --git a/.gitignore b/.gitignore
index 10cbb9e..dc80df1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
-.obsidian
+# .obsidian
.idea
site
main.ipynb
diff --git a/.obsidian/app.json b/.obsidian/app.json
new file mode 100644
index 0000000..143bc18
--- /dev/null
+++ b/.obsidian/app.json
@@ -0,0 +1,10 @@
+{
+ "strictLineBreaks": false,
+ "showLineNumber": true,
+ "alwaysUpdateLinks": true,
+ "newLinkFormat": "relative",
+ "useMarkdownLinks": true,
+ "showUnsupportedFiles": true,
+ "readableLineLength": false,
+ "attachmentFolderPath": "./imgs"
+}
\ No newline at end of file
diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json
new file mode 100644
index 0000000..d4c9c4b
--- /dev/null
+++ b/.obsidian/appearance.json
@@ -0,0 +1,7 @@
+{
+ "monospaceFontFamily": "JetBrains Mono",
+ "translucency": false,
+ "cssTheme": "Border",
+ "accentColor": "",
+ "theme": "system"
+}
\ No newline at end of file
diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json
new file mode 100644
index 0000000..b3e9114
--- /dev/null
+++ b/.obsidian/community-plugins.json
@@ -0,0 +1,3 @@
+[
+ "easy-typing-obsidian"
+]
\ No newline at end of file
diff --git a/.obsidian/core-plugins-migration.json b/.obsidian/core-plugins-migration.json
new file mode 100644
index 0000000..2ddf6fa
--- /dev/null
+++ b/.obsidian/core-plugins-migration.json
@@ -0,0 +1,30 @@
+{
+ "file-explorer": true,
+ "global-search": false,
+ "switcher": false,
+ "graph": false,
+ "backlink": false,
+ "canvas": false,
+ "outgoing-link": false,
+ "tag-pane": false,
+ "properties": false,
+ "page-preview": true,
+ "daily-notes": false,
+ "templates": false,
+ "note-composer": false,
+ "command-palette": true,
+ "slash-command": true,
+ "editor-status": true,
+ "bookmarks": false,
+ "markdown-importer": false,
+ "zk-prefixer": false,
+ "random-note": false,
+ "outline": true,
+ "word-count": true,
+ "slides": true,
+ "audio-recorder": false,
+ "workspaces": false,
+ "file-recovery": false,
+ "publish": false,
+ "sync": false
+}
\ No newline at end of file
diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json
new file mode 100644
index 0000000..2ddf6fa
--- /dev/null
+++ b/.obsidian/core-plugins.json
@@ -0,0 +1,30 @@
+{
+ "file-explorer": true,
+ "global-search": false,
+ "switcher": false,
+ "graph": false,
+ "backlink": false,
+ "canvas": false,
+ "outgoing-link": false,
+ "tag-pane": false,
+ "properties": false,
+ "page-preview": true,
+ "daily-notes": false,
+ "templates": false,
+ "note-composer": false,
+ "command-palette": true,
+ "slash-command": true,
+ "editor-status": true,
+ "bookmarks": false,
+ "markdown-importer": false,
+ "zk-prefixer": false,
+ "random-note": false,
+ "outline": true,
+ "word-count": true,
+ "slides": true,
+ "audio-recorder": false,
+ "workspaces": false,
+ "file-recovery": false,
+ "publish": false,
+ "sync": false
+}
\ No newline at end of file
diff --git a/.obsidian/plugins/easy-typing-obsidian/data.json b/.obsidian/plugins/easy-typing-obsidian/data.json
new file mode 100644
index 0000000..11c9aec
--- /dev/null
+++ b/.obsidian/plugins/easy-typing-obsidian/data.json
@@ -0,0 +1,59 @@
+{
+ "Tabout": true,
+ "SelectionEnhance": true,
+ "IntrinsicSymbolPairs": true,
+ "BaseObEditEnhance": true,
+ "FW2HWEnhance": true,
+ "BetterCodeEdit": true,
+ "AutoFormat": true,
+ "ExcludeFiles": "",
+ "ChineseEnglishSpace": true,
+ "ChineseNumberSpace": true,
+ "EnglishNumberSpace": true,
+ "ChineseNoSpace": true,
+ "PunctuationSpace": true,
+ "AutoCapital": true,
+ "AutoCapitalMode": "typing",
+ "PunctuationSpaceMode": "typing",
+ "InlineCodeSpaceMode": 1,
+ "InlineFormulaSpaceMode": 1,
+ "InlineLinkSpaceMode": 1,
+ "InlineLinkSmartSpace": true,
+ "UserDefinedRegSwitch": true,
+ "UserDefinedRegExp": "{{.*?}}|++\n<.*?>|--\n\\[\\!.*?\\][-+]{0,1}|-+\n(file:///|https?://|ftp://|obsidian://|zotero://|www.)[^\\s()《》。,,!?;;:“”‘’\\)\\(\\[\\]\\{\\}']+|--\n\n[a-zA-Z0-9_\\-.]+@[a-zA-Z0-9_\\-.]+|++\n(? function __require() {
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
+};
+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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+
+// node_modules/sprintf-js/src/sprintf.js
+var require_sprintf = __commonJS({
+ "node_modules/sprintf-js/src/sprintf.js"(exports) {
+ !function() {
+ "use strict";
+ var re = {
+ not_string: /[^s]/,
+ not_bool: /[^t]/,
+ not_type: /[^T]/,
+ not_primitive: /[^v]/,
+ number: /[diefg]/,
+ numeric_arg: /[bcdiefguxX]/,
+ json: /[j]/,
+ not_json: /[^j]/,
+ text: /^[^\x25]+/,
+ modulo: /^\x25{2}/,
+ placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,
+ key: /^([a-z_][a-z_\d]*)/i,
+ key_access: /^\.([a-z_][a-z_\d]*)/i,
+ index_access: /^\[(\d+)\]/,
+ sign: /^[+-]/
+ };
+ function sprintf2(key) {
+ return sprintf_format(sprintf_parse(key), arguments);
+ }
+ function vsprintf(fmt, argv) {
+ return sprintf2.apply(null, [fmt].concat(argv || []));
+ }
+ function sprintf_format(parse_tree, argv) {
+ var cursor = 1, tree_length = parse_tree.length, arg, output = "", i, k, ph, pad, pad_character, pad_length, is_positive, sign;
+ for (i = 0; i < tree_length; i++) {
+ if (typeof parse_tree[i] === "string") {
+ output += parse_tree[i];
+ } else if (typeof parse_tree[i] === "object") {
+ ph = parse_tree[i];
+ if (ph.keys) {
+ arg = argv[cursor];
+ for (k = 0; k < ph.keys.length; k++) {
+ if (arg == void 0) {
+ throw new Error(sprintf2('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k - 1]));
+ }
+ arg = arg[ph.keys[k]];
+ }
+ } else if (ph.param_no) {
+ arg = argv[ph.param_no];
+ } else {
+ arg = argv[cursor++];
+ }
+ if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) {
+ arg = arg();
+ }
+ if (re.numeric_arg.test(ph.type) && (typeof arg !== "number" && isNaN(arg))) {
+ throw new TypeError(sprintf2("[sprintf] expecting number but found %T", arg));
+ }
+ if (re.number.test(ph.type)) {
+ is_positive = arg >= 0;
+ }
+ switch (ph.type) {
+ case "b":
+ arg = parseInt(arg, 10).toString(2);
+ break;
+ case "c":
+ arg = String.fromCharCode(parseInt(arg, 10));
+ break;
+ case "d":
+ case "i":
+ arg = parseInt(arg, 10);
+ break;
+ case "j":
+ arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0);
+ break;
+ case "e":
+ arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential();
+ break;
+ case "f":
+ arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg);
+ break;
+ case "g":
+ arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg);
+ break;
+ case "o":
+ arg = (parseInt(arg, 10) >>> 0).toString(8);
+ break;
+ case "s":
+ arg = String(arg);
+ arg = ph.precision ? arg.substring(0, ph.precision) : arg;
+ break;
+ case "t":
+ arg = String(!!arg);
+ arg = ph.precision ? arg.substring(0, ph.precision) : arg;
+ break;
+ case "T":
+ arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase();
+ arg = ph.precision ? arg.substring(0, ph.precision) : arg;
+ break;
+ case "u":
+ arg = parseInt(arg, 10) >>> 0;
+ break;
+ case "v":
+ arg = arg.valueOf();
+ arg = ph.precision ? arg.substring(0, ph.precision) : arg;
+ break;
+ case "x":
+ arg = (parseInt(arg, 10) >>> 0).toString(16);
+ break;
+ case "X":
+ arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase();
+ break;
+ }
+ if (re.json.test(ph.type)) {
+ output += arg;
+ } else {
+ if (re.number.test(ph.type) && (!is_positive || ph.sign)) {
+ sign = is_positive ? "+" : "-";
+ arg = arg.toString().replace(re.sign, "");
+ } else {
+ sign = "";
+ }
+ pad_character = ph.pad_char ? ph.pad_char === "0" ? "0" : ph.pad_char.charAt(1) : " ";
+ pad_length = ph.width - (sign + arg).length;
+ pad = ph.width ? pad_length > 0 ? pad_character.repeat(pad_length) : "" : "";
+ output += ph.align ? sign + arg + pad : pad_character === "0" ? sign + pad + arg : pad + sign + arg;
+ }
+ }
+ }
+ return output;
+ }
+ var sprintf_cache = /* @__PURE__ */ Object.create(null);
+ function sprintf_parse(fmt) {
+ if (sprintf_cache[fmt]) {
+ return sprintf_cache[fmt];
+ }
+ var _fmt = fmt, match, parse_tree = [], arg_names = 0;
+ while (_fmt) {
+ if ((match = re.text.exec(_fmt)) !== null) {
+ parse_tree.push(match[0]);
+ } else if ((match = re.modulo.exec(_fmt)) !== null) {
+ parse_tree.push("%");
+ } else if ((match = re.placeholder.exec(_fmt)) !== null) {
+ if (match[2]) {
+ arg_names |= 1;
+ var field_list = [], replacement_field = match[2], field_match = [];
+ if ((field_match = re.key.exec(replacement_field)) !== null) {
+ field_list.push(field_match[1]);
+ while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") {
+ if ((field_match = re.key_access.exec(replacement_field)) !== null) {
+ field_list.push(field_match[1]);
+ } else if ((field_match = re.index_access.exec(replacement_field)) !== null) {
+ field_list.push(field_match[1]);
+ } else {
+ throw new SyntaxError("[sprintf] failed to parse named argument key");
+ }
+ }
+ } else {
+ throw new SyntaxError("[sprintf] failed to parse named argument key");
+ }
+ match[2] = field_list;
+ } else {
+ arg_names |= 2;
+ }
+ if (arg_names === 3) {
+ throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");
+ }
+ parse_tree.push({
+ placeholder: match[0],
+ param_no: match[1],
+ keys: match[2],
+ sign: match[3],
+ pad_char: match[4],
+ align: match[5],
+ width: match[6],
+ precision: match[7],
+ type: match[8]
+ });
+ } else {
+ throw new SyntaxError("[sprintf] unexpected placeholder");
+ }
+ _fmt = _fmt.substring(match[0].length);
+ }
+ return sprintf_cache[fmt] = parse_tree;
+ }
+ if (typeof exports !== "undefined") {
+ exports["sprintf"] = sprintf2;
+ exports["vsprintf"] = vsprintf;
+ }
+ if (typeof window !== "undefined") {
+ window["sprintf"] = sprintf2;
+ window["vsprintf"] = vsprintf;
+ if (typeof define === "function" && define["amd"]) {
+ define(function() {
+ return {
+ "sprintf": sprintf2,
+ "vsprintf": vsprintf
+ };
+ });
+ }
+ }
+ }();
+ }
+});
+
+// src/main.ts
+var main_exports = {};
+__export(main_exports, {
+ default: () => EasyTypingPlugin
+});
+module.exports = __toCommonJS(main_exports);
+var import_obsidian3 = require("obsidian");
+var import_state3 = require("@codemirror/state");
+
+// src/core.ts
+var import_obsidian = require("obsidian");
+
+// src/utils.ts
+var DEBUG = true;
+var print = (message, ...optionalParams) => {
+ if (DEBUG) {
+ console.log(message, ...optionalParams);
+ }
+};
+function offsetToPos(doc, offset) {
+ let line = doc.lineAt(offset);
+ return { line: line.number - 1, ch: offset - line.from };
+}
+function getTypeStrOfTransac(tr) {
+ let TransacTypeArray = [
+ "EasyTyping.change",
+ "EasyTyping.paste",
+ "input.type.compose",
+ "input.type",
+ "input.paste",
+ "input.drop",
+ "input.complete",
+ "input",
+ "delete.selection",
+ "delete.forward",
+ "delete.backward",
+ "delete.cut",
+ "delete",
+ "move.drop",
+ "undo",
+ "redo",
+ "select.pointer"
+ ];
+ for (let i = 0; i < TransacTypeArray.length; i++) {
+ if (tr.isUserEvent(TransacTypeArray[i]))
+ return TransacTypeArray[i];
+ }
+ return "none";
+}
+function string2pairstring(s) {
+ let cursorIdx = findFirstPipeNotPrecededByBackslash(s);
+ let left = s.substring(0, cursorIdx);
+ let _left = isRegexp(left) ? left : convertEscapeChar(left);
+ let right = s.substring(cursorIdx + 1);
+ let _right = isRegexp(right) ? right : convertEscapeChar(right);
+ return { left: _left, right: _right };
+}
+function replacePlaceholders(str, replacements) {
+ let replace_matches = str.replace(/\[\[(\d+)\]\]/g, function(match, index) {
+ return replacements[parseInt(index, 10)] || match;
+ });
+ return replace_matches;
+}
+function replacePlaceholdersAndTabstops(str, replacements) {
+ let tabstops = [];
+ const regex = /\$(\d+)|\$\{(\d+): *([^ {}]*?)\}|\[\[(\d+)\]\]/g;
+ let match;
+ let replaceStrings = [];
+ while ((match = regex.exec(str)) !== null) {
+ const isSimpleVar = match[1];
+ const isNamedVar = match[2];
+ const content = match[3];
+ const replaceN = match[4];
+ const tabstopN = isSimpleVar || isNamedVar;
+ const startIndex = match.index;
+ const endIndex = startIndex + match[0].length;
+ if (replaceN) {
+ let matchedN = parseInt(replaceN, 10);
+ if (matchedN < replacements.length) {
+ replaceStrings.push({ from: startIndex, to: endIndex, replacement: replacements[matchedN], tabstop: false });
+ }
+ } else {
+ let n = parseInt(tabstopN, 10);
+ let contentStr = replacePlaceholders(content ? content : "", replacements);
+ replaceStrings.push({ from: startIndex, to: endIndex, replacement: contentStr, tabstop: true, tabstopNumber: n });
+ }
+ }
+ let newString = str;
+ let offset = 0;
+ for (let i = 0; i < replaceStrings.length; i++) {
+ let replaceString = replaceStrings[i];
+ newString = newString.substring(0, replaceString.from + offset) + replaceString.replacement + newString.substring(replaceString.to + offset);
+ if (replaceString.tabstop) {
+ let tabstop = {
+ from: replaceString.from + offset,
+ to: replaceString.from + offset + replaceString.replacement.length,
+ number: replaceString.tabstopNumber
+ };
+ tabstops.push(tabstop);
+ }
+ offset += replaceString.replacement.length - (replaceString.to - replaceString.from);
+ }
+ return [newString, tabstops];
+}
+function parseTheAfterPattern(pattern, replacements) {
+ let single_cursor_pos = findFirstPipeNotPrecededByBackslash(pattern);
+ let general_cursor_find = /\$(\d+)|\$\{(\d+): *([^ {}]*?)\}/.test(pattern);
+ let single_cursor_find = single_cursor_pos !== -1;
+ let final_pattern = pattern;
+ if (general_cursor_find) {
+ final_pattern = pattern;
+ } else if (single_cursor_find) {
+ final_pattern = pattern.substring(0, single_cursor_pos) + "$0" + pattern.substring(single_cursor_pos + 1);
+ } else {
+ final_pattern = pattern + "$0";
+ }
+ return replacePlaceholdersAndTabstops(convertEscapeChar(final_pattern), replacements);
+}
+function isRegexp(s) {
+ return s.startsWith("r/") && s.endsWith("/");
+}
+function convertEscapeChar(s) {
+ return s.replace(/\\\|/g, "|").replace(/\\n/g, "\n").replace(/\\r/g, "\r").replace(/\\t/g, " ").replace(/\\\n/g, "\\n").replace(/\\\r/g, "\\r").replace(/\\\t/g, "\\t").replace(/\\\\/g, "\\");
+}
+function ruleStringList2RuleList(list) {
+ let res = [];
+ for (let i in list) {
+ res[i] = { before: string2pairstring(list[i][0]), after: string2pairstring(list[i][1]), after_pattern: list[i][1] };
+ }
+ return res;
+}
+function findFirstPipeNotPrecededByBackslash(s) {
+ let regex = /^r\/[^]*?\/\|/;
+ let regMatch = s.match(regex);
+ if (regMatch)
+ return regMatch[0].length - 1;
+ const match = s.match(/((^|[^\\])(\\\\)*)\|/);
+ return match ? s.indexOf(match[0]) + match[1].length : -1;
+}
+function stringDeleteAt(str, index) {
+ return str.substring(0, index) + str.substring(index + 1);
+}
+function stringInsertAt(str, index, s) {
+ return str.substring(0, index) + s + str.substring(index);
+}
+function isParamDefined(param) {
+ return typeof param !== "undefined";
+}
+function showString(s) {
+ return s.replace(/\n/g, "\\n");
+}
+
+// src/core.ts
+var import_language = require("@codemirror/language");
+var LineFormater = class {
+ constructor() {
+ }
+ syntaxTreeNodeNameType(name) {
+ if (name.contains("code") && !name.contains("link")) {
+ return "code" /* code */;
+ } else if (name.contains("math")) {
+ return "formula" /* formula */;
+ } else {
+ return "text" /* text */;
+ }
+ }
+ parseLineWithSyntaxTree(state, lineNum, regRegExp) {
+ let linePartsOfTxtCodeFormula = [];
+ let line = state.doc.line(lineNum);
+ const tree = (0, import_language.syntaxTree)(state);
+ let pos = line.from;
+ let prevNodeType = "none" /* none */;
+ let prevBeginIdx = 0;
+ while (pos < line.to) {
+ let node = tree.resolve(pos, 1);
+ let curNodeType = this.syntaxTreeNodeNameType(node.name);
+ if (prevNodeType == "none" /* none */) {
+ prevNodeType = curNodeType;
+ prevBeginIdx = 0;
+ } else if (prevNodeType == curNodeType) {
+ } else {
+ linePartsOfTxtCodeFormula.push({
+ content: line.text.substring(prevBeginIdx, pos - line.from),
+ type: prevNodeType,
+ begin: prevBeginIdx,
+ end: pos - line.from,
+ leftSpaceRequire: 0 /* none */,
+ rightSpaceRequire: 0 /* none */
+ });
+ prevNodeType = curNodeType;
+ prevBeginIdx = pos - line.from;
+ }
+ if (curNodeType == "text" /* text */) {
+ pos++;
+ } else {
+ pos = node.to;
+ }
+ if (pos == line.to) {
+ linePartsOfTxtCodeFormula.push({
+ content: line.text.substring(prevBeginIdx, pos - line.from),
+ type: prevNodeType,
+ begin: prevBeginIdx,
+ end: pos - line.from,
+ leftSpaceRequire: 0 /* none */,
+ rightSpaceRequire: 0 /* none */
+ });
+ }
+ }
+ let retArray = [];
+ for (let i = 0; i < linePartsOfTxtCodeFormula.length; i++) {
+ if (linePartsOfTxtCodeFormula[i].type != "text" /* text */) {
+ retArray.push(linePartsOfTxtCodeFormula[i]);
+ } else {
+ let tempArray;
+ if (isParamDefined(regRegExp))
+ tempArray = splitTextWithLinkAndUserDefined(linePartsOfTxtCodeFormula[i].content, regRegExp);
+ else
+ tempArray = splitTextWithLinkAndUserDefined(linePartsOfTxtCodeFormula[i].content);
+ tempArray.forEach((item) => {
+ item.begin += linePartsOfTxtCodeFormula[i].begin;
+ item.end += linePartsOfTxtCodeFormula[i].begin;
+ retArray.push(item);
+ });
+ }
+ }
+ return retArray;
+ }
+ formatLineOfDoc(state, settings, fromB, toB, insertedStr) {
+ let doc = state.doc;
+ let line = doc.lineAt(fromB).text;
+ let res = null;
+ if (insertedStr.contains("\n")) {
+ res = this.formatLine(state, doc.lineAt(fromB).number, settings, offsetToPos(doc, fromB).ch, offsetToPos(doc, fromB).ch);
+ } else {
+ res = this.formatLine(state, doc.lineAt(fromB).number, settings, offsetToPos(doc, toB).ch, offsetToPos(doc, fromB).ch);
+ }
+ if (res === null || res[2].length == 0)
+ return null;
+ let newline = stringInsertAt(res[0], res[1], "|");
+ let changes = [];
+ let offset = doc.lineAt(fromB).from;
+ for (let changeItem of res[2]) {
+ changes.push({
+ changes: { from: offset + changeItem.begin, to: offset + changeItem.end, insert: changeItem.text },
+ userEvent: "EasyTyping.change"
+ });
+ }
+ if (insertedStr.contains("\n")) {
+ console.log("insertStr", insertedStr);
+ res[1] += insertedStr.length;
+ }
+ return [changes, { selection: { anchor: offset + res[1] }, userEvent: "EasyTyping.change" }];
+ }
+ formatLine(state, lineNum, settings, curCh, prevCh) {
+ let line = state.doc.line(lineNum).text;
+ let regNull = /^\s*$/g;
+ if (regNull.test(line))
+ return [line, curCh, []];
+ let lineParts = settings.UserDefinedRegSwitch ? this.parseLineWithSyntaxTree(state, lineNum, settings.UserDefinedRegExp) : this.parseLineWithSyntaxTree(state, lineNum);
+ if (settings.debug)
+ console.log("line parts\n", lineParts);
+ let linePartsOrigin = JSON.parse(JSON.stringify(lineParts));
+ let inlineChangeList = [];
+ let cursorLinePartIndex = -1;
+ let cursorRelativeIndex = -1;
+ let resultCursorCh = 0;
+ for (let i = 0; i < lineParts.length; i++) {
+ if (curCh > lineParts[i].begin && curCh <= lineParts[i].end) {
+ cursorLinePartIndex = i;
+ cursorRelativeIndex = curCh - lineParts[i].begin;
+ if (lineParts[i].type === "text" /* text */) {
+ lineParts[i].content = stringInsertAt(lineParts[i].content, cursorRelativeIndex, "\0");
+ }
+ break;
+ }
+ }
+ let resultLine = "";
+ let offset = 0;
+ let prevPartType = "none" /* none */;
+ let prevTextEndSpaceState = 0 /* none */;
+ for (let i = 0; i < lineParts.length; i++) {
+ if (i === 0 && lineParts[i].type === "text" /* text */ && settings.AutoCapital) {
+ if (isParamDefined(prevCh) && cursorLinePartIndex != 0) {
+ } else {
+ let regFirstSentence = /^\s*(\- (\[[x ]\] )?)?“?[a-z\u0401\u0451\u0410-\u044f]/g;
+ let regHeaderSentence = /^(#+ |>+ ?|“)[a-z\u0401\u0451\u0410-\u044f]/g;
+ let textcopy = lineParts[0].content;
+ let match = regFirstSentence.exec(textcopy);
+ let matchHeader = regHeaderSentence.exec(textcopy);
+ let dstCharIndex = -1;
+ if (match) {
+ dstCharIndex = regFirstSentence.lastIndex - 1;
+ } else if (matchHeader) {
+ dstCharIndex = regHeaderSentence.lastIndex - 1;
+ }
+ if (settings.AutoCapitalMode == "global" /* Globally */ || isParamDefined(prevCh) && dstCharIndex >= prevCh && dstCharIndex < curCh) {
+ } else {
+ dstCharIndex = -1;
+ }
+ if (dstCharIndex != -1) {
+ lineParts[0].content = textcopy.substring(0, dstCharIndex) + textcopy.charAt(dstCharIndex).toUpperCase() + textcopy.substring(dstCharIndex + 1);
+ }
+ }
+ }
+ switch (lineParts[i].type) {
+ case "text" /* text */:
+ let insertSpace = function(content2, reg2, prevCh2, curCh2, offset2) {
+ while (true) {
+ let match = reg2.exec(content2);
+ if (!match)
+ break;
+ let tempIndex = reg2.lastIndex - 1;
+ if (isParamDefined(prevCh2) && tempIndex >= prevCh2 - offset2 && tempIndex < curCh2 - offset2) {
+ content2 = content2.substring(0, tempIndex) + " " + content2.substring(tempIndex);
+ curCh2 += 1;
+ }
+ }
+ return [content2, curCh2];
+ };
+ let content = lineParts[i].content;
+ if (settings.AutoCapital) {
+ var reg = /[\.\?\!。!?]([\s]*)[a-z\u0401\u0451\u0410-\u044f]/g;
+ while (true) {
+ let match = reg.exec(content);
+ if (!match)
+ break;
+ let tempIndex = reg.lastIndex - 1;
+ let isSpaceDot = tempIndex - 2 < 0 || content.substring(tempIndex - 2, tempIndex) == " .";
+ if (settings.AutoCapitalMode == "global" /* Globally */ && !isSpaceDot) {
+ lineParts[i].content = content.substring(0, tempIndex) + content.charAt(tempIndex).toUpperCase() + content.substring(reg.lastIndex);
+ content = lineParts[i].content;
+ } else if (isParamDefined(prevCh) && tempIndex >= prevCh - offset && tempIndex < curCh - offset && !isSpaceDot) {
+ lineParts[i].content = content.substring(0, tempIndex) + content.charAt(tempIndex).toUpperCase() + content.substring(reg.lastIndex);
+ content = lineParts[i].content;
+ }
+ }
+ }
+ if (settings.ChineseEnglishSpace) {
+ let reg1 = /([A-Za-z])([\u4e00-\u9fa5])/gi;
+ let reg2 = /([\u4e00-\u9fa5])([A-Za-z])/gi;
+ [content, curCh] = insertSpace(content, reg1, prevCh, curCh, offset);
+ [content, curCh] = insertSpace(content, reg2, prevCh, curCh, offset);
+ }
+ if (settings.ChineseNumberSpace) {
+ let reg2 = /([0-9])([\u4e00-\u9fa5])/g;
+ let reg1 = /([\u4e00-\u9fa5])([0-9])/g;
+ [content, curCh] = insertSpace(content, reg2, prevCh, curCh, offset);
+ [content, curCh] = insertSpace(content, reg1, prevCh, curCh, offset);
+ }
+ if (settings.EnglishNumberSpace) {
+ let reg2 = /([A-Za-z])(\d)/g;
+ let reg1 = /(\d)([A-Za-z])/g;
+ [content, curCh] = insertSpace(content, reg2, prevCh, curCh, offset);
+ [content, curCh] = insertSpace(content, reg1, prevCh, curCh, offset);
+ }
+ if (settings.ChineseNoSpace) {
+ let reg2 = /([\u4e00-\u9fa5,。、!;‘’《》]+)(\s+)([\u4e00-\u9fa5,。、!;‘’《》]+)/g;
+ while (reg2.exec(content)) {
+ lineParts[i].content = content.replace(reg2, "$1$3");
+ content = lineParts[i].content;
+ }
+ }
+ if (settings.PunctuationSpace) {
+ {
+ let reg2 = /([,\.;\?\!\)])([0-9A-Za-z\u0401\u0451\u0410-\u044f\u4e00-\u9fa5])|([A-Za-z0-9\u4e00-\u9fa5:,\.\?\!'"]+)(\()|[,\.;\?:!][\u4e00-\u9fa5]/gi;
+ while (true) {
+ let match = reg2.exec(content);
+ if (!match)
+ break;
+ let tempIndex = reg2.lastIndex - 1;
+ let isSpaceDot = "!.?;,".contains(content.charAt(tempIndex - 1)) && (tempIndex - 2 < 0 && i == 0 || content.charAt(tempIndex - 2) == " ");
+ let isNumPuncNum = /[,.]\d/.test(content.substring(tempIndex - 1, tempIndex + 1)) && (tempIndex - 2 < 0 || /\d/.test(content.charAt(tempIndex - 2)));
+ if (settings.PunctuationSpaceMode == "global" /* Globally */ && !isSpaceDot && !isNumPuncNum) {
+ content = content.substring(0, tempIndex) + " " + content.substring(tempIndex);
+ } else if (isParamDefined(prevCh) && tempIndex >= prevCh - offset && tempIndex < curCh - offset && !isSpaceDot && !isNumPuncNum) {
+ content = content.substring(0, tempIndex) + " " + content.substring(tempIndex);
+ curCh += 1;
+ }
+ }
+ let reg22 = /(:)([A-Za-z0-9_]+[ ,\.\?\\\/;'",。?;‘“”’、\[\]\-\{\}])/gi;
+ lineParts[i].content = content.replace(reg22, "$1 $2");
+ content = lineParts[i].content;
+ let reg3 = /(:)(["'])/g;
+ lineParts[i].content = content.replace(reg3, "$1 $2");
+ content = lineParts[i].content;
+ }
+ }
+ let regStrictSpaceStart = /^\0?\s/;
+ let regStrictSpaceEnd = /\s\0?$/;
+ let regStartWithSpace = /^\0?[\s,\.;\?\!,。;》?::!~\*、()"”\[\]\)\{\}]/;
+ let regEndWithSpace = /[\s,。、:;?!()~\*"《“\[\]\(\{\}]\0?$/;
+ let txtStartSpaceSate = 0 /* none */;
+ let txtEndSpaceState = 0 /* none */;
+ if (regStartWithSpace.test(content) || content.startsWith(" ")) {
+ if (regStrictSpaceStart.test(content))
+ txtStartSpaceSate = 2 /* strict */;
+ else
+ txtStartSpaceSate = 1 /* soft */;
+ }
+ if (regEndWithSpace.test(content) || content.endsWith(" ")) {
+ if (regStrictSpaceEnd.test(content))
+ txtEndSpaceState = 2 /* strict */;
+ else
+ txtEndSpaceState = 1 /* soft */;
+ }
+ switch (prevPartType) {
+ case "none" /* none */:
+ break;
+ case "code" /* code */:
+ if (settings.InlineCodeSpaceMode > txtStartSpaceSate) {
+ lineParts[i].content = " " + content;
+ content = lineParts[i].content;
+ }
+ break;
+ case "formula" /* formula */:
+ if (settings.InlineFormulaSpaceMode > txtStartSpaceSate) {
+ lineParts[i].content = " " + content;
+ content = lineParts[i].content;
+ }
+ break;
+ case "wikilink" /* wikilink */:
+ case "mdlink" /* mdlink */:
+ if (!settings.InlineLinkSmartSpace && settings.InlineLinkSpaceMode > txtStartSpaceSate) {
+ lineParts[i].content = " " + content;
+ content = lineParts[i].content;
+ } else if (settings.InlineLinkSmartSpace && txtStartSpaceSate == 0 /* none */) {
+ let charAtTextBegin = content.charAt(0);
+ let regMdLinkEnd = /\]/;
+ let charAtLinkEndIndex = lineParts[i - 1].content.search(regMdLinkEnd) - 1;
+ let charAtLinkEnd = lineParts[i - 1].content.charAt(charAtLinkEndIndex);
+ if (charAtLinkEnd === "[")
+ break;
+ let twoNeighborChars = charAtLinkEnd + charAtTextBegin;
+ let regNotNeedSpace = /[\u4e00-\u9fa5,。?:;”“’‘-)}][\u4e00-\u9fa5]/g;
+ if (!regNotNeedSpace.test(twoNeighborChars)) {
+ lineParts[i].content = " " + content;
+ content = lineParts[i].content;
+ }
+ }
+ break;
+ case "user-defined" /* user */:
+ if (lineParts[i - 1].rightSpaceRequire > txtStartSpaceSate) {
+ lineParts[i].content = " " + content;
+ content = lineParts[i].content;
+ }
+ break;
+ }
+ if (i === cursorLinePartIndex) {
+ let reg2 = "\0";
+ let n = content.search(reg2);
+ resultCursorCh = offset + n;
+ lineParts[i].content = stringDeleteAt(content, n);
+ }
+ resultLine += lineParts[i].content;
+ offset += lineParts[i].content.length;
+ prevPartType = "text" /* text */;
+ prevTextEndSpaceState = txtEndSpaceState;
+ break;
+ case "code" /* code */:
+ switch (prevPartType) {
+ case "none" /* none */:
+ break;
+ case "text" /* text */:
+ if (settings.InlineCodeSpaceMode > prevTextEndSpaceState) {
+ lineParts[i - 1].content += " ";
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "code" /* code */:
+ if (settings.InlineCodeSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "formula" /* formula */:
+ if (settings.InlineCodeSpaceMode > 0 /* none */ || settings.InlineFormulaSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "mdlink" /* mdlink */:
+ case "wikilink" /* wikilink */:
+ if (settings.InlineCodeSpaceMode > 0 /* none */ || settings.InlineLinkSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "user-defined" /* user */:
+ if (settings.InlineCodeSpaceMode > 0 /* none */ && lineParts[i - 1].rightSpaceRequire > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ }
+ if (i === cursorLinePartIndex) {
+ resultCursorCh = offset + cursorRelativeIndex;
+ }
+ resultLine += lineParts[i].content;
+ offset += lineParts[i].content.length;
+ prevPartType = "code" /* code */;
+ prevTextEndSpaceState = 0 /* none */;
+ break;
+ case "formula" /* formula */:
+ if (lineParts[i].content == "$\\qquad$") {
+ prevPartType = "text" /* text */;
+ prevTextEndSpaceState = 2 /* strict */;
+ break;
+ }
+ switch (prevPartType) {
+ case "none" /* none */:
+ break;
+ case "text" /* text */:
+ if (settings.InlineFormulaSpaceMode > prevTextEndSpaceState) {
+ lineParts[i - 1].content += " ";
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "code" /* code */:
+ if (settings.InlineFormulaSpaceMode > 0 /* none */ || settings.InlineCodeSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "formula" /* formula */:
+ if (settings.InlineCodeSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "mdlink" /* mdlink */:
+ case "wikilink" /* wikilink */:
+ if (settings.InlineFormulaSpaceMode > 0 /* none */ || settings.InlineLinkSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "user-defined" /* user */:
+ if (settings.InlineFormulaSpaceMode > 0 /* none */ && lineParts[i - 1].rightSpaceRequire > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ }
+ if (i === cursorLinePartIndex) {
+ resultCursorCh = offset + cursorRelativeIndex;
+ }
+ resultLine += lineParts[i].content;
+ offset += lineParts[i].content.length;
+ prevPartType = "formula" /* formula */;
+ prevTextEndSpaceState = 0 /* none */;
+ break;
+ case "mdlink" /* mdlink */:
+ case "wikilink" /* wikilink */:
+ switch (prevPartType) {
+ case "none" /* none */:
+ break;
+ case "text" /* text */:
+ if (prevTextEndSpaceState >= settings.InlineLinkSpaceMode && !settings.InlineLinkSmartSpace)
+ break;
+ if (prevTextEndSpaceState == 2 /* strict */ && settings.InlineLinkSpaceMode == 2 /* strict */)
+ break;
+ let charAtTextEnd = lineParts[i - 1].content.charAt(lineParts[i - 1].content.length - 1);
+ let charAtLinkBegin = "";
+ if (lineParts[i].type == "wikilink" /* wikilink */) {
+ let regAlias = /\|/;
+ let charOfAliasBegin = lineParts[i].content.search(regAlias);
+ let beginIndex = 2;
+ if (lineParts[i].content.charAt(0) === "!")
+ beginIndex = 3;
+ if (charOfAliasBegin != -1) {
+ beginIndex = charOfAliasBegin + 1;
+ } else if (lineParts[i].content.charAt(beginIndex) == "#") {
+ beginIndex += 1;
+ }
+ charAtLinkBegin = lineParts[i].content.charAt(beginIndex);
+ if (charAtLinkBegin == "]")
+ break;
+ } else {
+ let regMdLinkBegin = /\[/;
+ let charAtLinkBeginIndex = lineParts[i].content.search(regMdLinkBegin) + 1;
+ charAtLinkBegin = lineParts[i].content.charAt(charAtLinkBeginIndex);
+ if (charAtLinkBegin === "]")
+ break;
+ }
+ if (settings.InlineLinkSpaceMode == 2 /* strict */ && prevTextEndSpaceState < 2 /* strict */) {
+ lineParts[i - 1].content += " ";
+ resultLine += " ";
+ offset += 1;
+ } else if (settings.InlineLinkSmartSpace && lineParts[i - 1].content.endsWith(" ")) {
+ let tempContent = lineParts[i - 1].content + charAtLinkBegin;
+ let regRevertSpace = /[\u4e00-\u9fa5] [\u4e00-\u9fa5]$/;
+ if (regRevertSpace.test(tempContent)) {
+ lineParts[i - 1].content = lineParts[i - 1].content.substring(0, lineParts[i - 1].content.length - 1);
+ resultLine = resultLine.substring(0, resultLine.length - 1);
+ offset -= 1;
+ }
+ } else if (settings.InlineLinkSmartSpace && prevTextEndSpaceState == 0 /* none */) {
+ let regNoNeedSpace = /[\u4e00-\u9fa5][\u4e00-\u9fa5]/g;
+ let twoNeighborChars = charAtTextEnd + charAtLinkBegin;
+ if (!regNoNeedSpace.test(twoNeighborChars)) {
+ lineParts[i - 1].content += " ";
+ resultLine += " ";
+ offset += 1;
+ }
+ } else if (!settings.InlineLinkSmartSpace && settings.InlineLinkSpaceMode > prevTextEndSpaceState) {
+ lineParts[i - 1].content += " ";
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "code" /* code */:
+ if (settings.InlineLinkSpaceMode > 0 /* none */ || settings.InlineCodeSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "formula" /* formula */:
+ if (settings.InlineLinkSpaceMode > 0 /* none */ || settings.InlineFormulaSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "mdlink" /* mdlink */:
+ case "wikilink" /* wikilink */:
+ if (settings.InlineLinkSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "user-defined" /* user */:
+ if (lineParts[i - 1].rightSpaceRequire > 0 /* none */ && settings.InlineLinkSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ }
+ if (i === cursorLinePartIndex) {
+ resultCursorCh = offset + cursorRelativeIndex;
+ }
+ resultLine += lineParts[i].content;
+ offset += lineParts[i].content.length;
+ prevPartType = lineParts[i].type;
+ prevTextEndSpaceState = 0 /* none */;
+ break;
+ case "user-defined" /* user */:
+ switch (prevPartType) {
+ case "none" /* none */:
+ break;
+ case "text" /* text */:
+ if (lineParts[i].leftSpaceRequire > prevTextEndSpaceState) {
+ lineParts[i - 1].content += " ";
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "code" /* code */:
+ if (lineParts[i].leftSpaceRequire > 0 /* none */ && settings.InlineCodeSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "formula" /* formula */:
+ if (lineParts[i].leftSpaceRequire > 0 /* none */ && settings.InlineFormulaSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "mdlink" /* mdlink */:
+ case "wikilink" /* wikilink */:
+ if (lineParts[i].leftSpaceRequire > 0 /* none */ && settings.InlineLinkSpaceMode > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ case "user-defined" /* user */:
+ if (lineParts[i].leftSpaceRequire > 0 /* none */ && lineParts[i - 1].rightSpaceRequire > 0 /* none */) {
+ inlineChangeList.push({
+ text: " ",
+ begin: lineParts[i].begin,
+ end: lineParts[i].begin,
+ origin: ""
+ });
+ resultLine += " ";
+ offset += 1;
+ }
+ break;
+ }
+ if (i === cursorLinePartIndex) {
+ resultCursorCh = offset + cursorRelativeIndex;
+ }
+ resultLine += lineParts[i].content;
+ offset += lineParts[i].content.length;
+ prevPartType = "user-defined" /* user */;
+ prevTextEndSpaceState = 0 /* none */;
+ break;
+ }
+ }
+ for (let i = 0; i < lineParts.length; i++) {
+ if (lineParts[i].type === "text" /* text */ && lineParts[i].content != linePartsOrigin[i].content) {
+ inlineChangeList.push({
+ text: lineParts[i].content,
+ begin: linePartsOrigin[i].begin,
+ end: linePartsOrigin[i].end,
+ origin: linePartsOrigin[i].content
+ });
+ }
+ }
+ inlineChangeList = inlineChangeList.sort((a, b) => a.begin - b.begin);
+ return [resultLine, resultCursorCh, inlineChangeList];
+ }
+};
+function matchWithReg(text, regExp, type, inlineTypeArray, checkArray = false, leftSpaceRe = 0 /* none */, rightSpaceRe = 0 /* none */) {
+ let retArray = inlineTypeArray;
+ let matchArray = [];
+ retArray = retArray.sort((a, b) => a.begin - b.begin);
+ while (true) {
+ let match = regExp.exec(text);
+ if (!match)
+ break;
+ let valid = true;
+ if (checkArray) {
+ for (let i = 0; i < retArray.length; i++) {
+ if (regExp.lastIndex > retArray[i].begin && retArray[i].end > match.index) {
+ valid = false;
+ break;
+ }
+ }
+ }
+ if (!valid)
+ continue;
+ matchArray.push({
+ content: match[0],
+ type,
+ begin: match.index,
+ end: regExp.lastIndex,
+ leftSpaceRequire: leftSpaceRe,
+ rightSpaceRequire: rightSpaceRe
+ });
+ }
+ retArray = retArray.concat(matchArray);
+ return retArray;
+}
+function matchWithAbbr(text, type, inlineTypeArray, checkArray = false) {
+ let retArray = inlineTypeArray;
+ let matchArray = [];
+ retArray = retArray.sort((a, b) => a.begin - b.begin);
+ let regAbbr = /([a-zA-Z]\.)+/g;
+ while (true) {
+ let match = regAbbr.exec(text);
+ if (!match)
+ break;
+ let valid = true;
+ let isInBlockBegin = match.index == 0;
+ if (checkArray) {
+ for (let i = 0; i < retArray.length; i++) {
+ if (match.index == retArray[i].end) {
+ isInBlockBegin = true;
+ }
+ if (regAbbr.lastIndex > retArray[i].begin && retArray[i].end > match.index) {
+ valid = false;
+ break;
+ }
+ }
+ }
+ if (!isInBlockBegin && valid) {
+ let regChar = /[a-zA-Z0-9]/;
+ if (regChar.test(text.charAt(match.index - 1))) {
+ valid = false;
+ }
+ }
+ if (!valid)
+ continue;
+ matchArray.push({
+ content: match[0],
+ type,
+ begin: match.index,
+ end: regAbbr.lastIndex,
+ leftSpaceRequire: 0 /* none */,
+ rightSpaceRequire: 0 /* none */
+ });
+ }
+ retArray = retArray.concat(matchArray);
+ return retArray;
+}
+function splitTextWithLinkAndUserDefined(text, regExps) {
+ let retArray = [];
+ let regWikiLink = /\!{0,2}\[\[[^\[\]]*?\]\]/g;
+ let regMdLink = /\!{0,2}\[[^\[\]]*?\]\([^\s\)\(\[\]\{\}']*\)/g;
+ retArray = matchWithReg(text, regWikiLink, "wikilink" /* wikilink */, retArray);
+ retArray = matchWithReg(text, regMdLink, "mdlink" /* mdlink */, retArray);
+ let regExpList = [];
+ let leftSRequireList = [];
+ let rightSRequireList = [];
+ let regNull = /^\s*$|^\/\//g;
+ let regSRequire = /\|[\-=\+][\-=\+]$/;
+ if (regExps) {
+ let regs = regExps.split("\n");
+ for (let i = 0; i < regs.length; i++) {
+ if (regNull.test(regs[i]))
+ continue;
+ if (!regSRequire.test(regs[i]) || regs[i].length <= 3) {
+ new import_obsidian.Notice("EasyTyping: \u7B2C" + String(i) + "\u884C\u81EA\u5B9A\u4E49\u6B63\u5219\u4E0D\u7B26\u5408\u89C4\u8303\n" + regs[i]);
+ continue;
+ }
+ let regItem = regs[i].substring(0, regs[i].length - 3);
+ let spaceReqString = regs[i].substring(regs[i].length - 3);
+ let isValidReg = true;
+ try {
+ let regTemp = new RegExp(regItem, "g");
+ } catch (error) {
+ isValidReg = false;
+ if (this.settings.debug) {
+ new import_obsidian.Notice("EasuTyping: Bad RegExp:\n" + regItem);
+ }
+ }
+ if (isValidReg) {
+ regExpList.push(new RegExp(regItem, "g"));
+ leftSRequireList.push(str2SpaceState(spaceReqString.charAt(1)));
+ rightSRequireList.push(str2SpaceState(spaceReqString.charAt(2)));
+ }
+ }
+ let regLen = regExpList.length;
+ for (let i = 0; i < regLen; i++) {
+ retArray = matchWithReg(text, regExpList[i], "user-defined" /* user */, retArray, true, leftSRequireList[i], rightSRequireList[i]);
+ }
+ }
+ retArray = matchWithReg(text, /\d{1,2}:\d{1,2}(:\d{0,2}){0,1}/g, "user-defined" /* user */, retArray, true, 0 /* none */, 0 /* none */);
+ retArray = matchWithAbbr(text, "user-defined" /* user */, retArray, true);
+ retArray = retArray.sort((a, b) => a.begin - b.begin);
+ let textArray = [];
+ let textBegin = 0;
+ let textEnd = 0;
+ for (let i = 0; i < retArray.length; i++) {
+ if (textBegin < retArray[i].begin) {
+ textEnd = retArray[i].begin;
+ textArray.push({
+ content: text.substring(textBegin, textEnd),
+ type: "text" /* text */,
+ begin: textBegin,
+ end: textEnd,
+ leftSpaceRequire: 0 /* none */,
+ rightSpaceRequire: 0 /* none */
+ });
+ }
+ textBegin = retArray[i].end;
+ }
+ if (textBegin != text.length) {
+ textArray.push({
+ content: text.substring(textBegin, text.length),
+ type: "text" /* text */,
+ begin: textBegin,
+ end: text.length,
+ leftSpaceRequire: 0 /* none */,
+ rightSpaceRequire: 0 /* none */
+ });
+ }
+ retArray = retArray.concat(textArray);
+ retArray = retArray.sort((a, b) => a.begin - b.begin);
+ return retArray;
+}
+function str2SpaceState(s) {
+ switch (s) {
+ case "+":
+ return 2 /* strict */;
+ case "=":
+ return 1 /* soft */;
+ case "-":
+ default:
+ return 0 /* none */;
+ }
+}
+function string2SpaceState(s) {
+ if (Number(s) == 0 /* none */)
+ return 0 /* none */;
+ if (Number(s) == 1 /* soft */)
+ return 1 /* soft */;
+ if (Number(s) == 2 /* strict */)
+ return 2 /* strict */;
+ return 0 /* none */;
+}
+function getPosLineType(state, pos) {
+ const line = state.doc.lineAt(pos);
+ let line_number = line.number;
+ const tree = (0, import_language.ensureSyntaxTree)(state, line.to);
+ const token = tree.resolve(line.from, 1).name;
+ if (token.contains("table")) {
+ return "table" /* table */;
+ }
+ if (token.contains("hmd-frontmatter")) {
+ return "frontmatter" /* frontmatter */;
+ }
+ if (token.contains("math")) {
+ for (let p = line.from + 1; p < line.to; p += 1) {
+ if (!tree.resolve(p, 1).name.contains("math")) {
+ return "text" /* text */;
+ }
+ }
+ return "formula" /* formula */;
+ } else if (token.contains("code") && token.contains("block")) {
+ for (let p = line.from + 1; p < line.to; p += 1) {
+ let t = tree.resolve(p, 1).name;
+ if (!(t.contains("code") && t.contains("block"))) {
+ return "text" /* text */;
+ }
+ }
+ return "codeblock" /* codeblock */;
+ } else if (token.contains("quote") && !token.contains("callout")) {
+ let callout_start_line = -1;
+ for (let l = line_number - 1; l >= 1; l -= 1) {
+ let l_line = state.doc.line(l);
+ let l_token = tree.resolve(l_line.from, 1).name;
+ if (!l_token.contains("quote")) {
+ break;
+ }
+ if (l_token.contains("callout")) {
+ callout_start_line = l;
+ break;
+ }
+ }
+ if (callout_start_line == -1)
+ return "text" /* text */;
+ let is_code_block = false;
+ let reset = false;
+ let reg_code_begin = /^>+ ```/;
+ let reg_code_end = /^>+ ```$/;
+ for (let l = callout_start_line + 1; l <= line_number; l += 1) {
+ let l_line = state.doc.line(l);
+ if (reset) {
+ is_code_block = false;
+ reset = false;
+ }
+ if (is_code_block && reg_code_end.test(l_line.text)) {
+ is_code_block = true;
+ reset = true;
+ } else if (!is_code_block && reg_code_begin.test(l_line.text)) {
+ is_code_block = true;
+ }
+ }
+ if (is_code_block) {
+ return "codeblock" /* codeblock */;
+ } else
+ return "text" /* text */;
+ } else if (token.contains("list")) {
+ for (let p = line.from + 1; p < line.to; p += 1) {
+ let t = tree.resolve(p, 1).name;
+ if (t.contains("code") && t.contains("block")) {
+ return "codeblock" /* codeblock */;
+ }
+ }
+ }
+ return "text" /* text */;
+}
+function getPosLineType2(state, pos) {
+ const line = state.doc.lineAt(pos);
+ const tree = (0, import_language.syntaxTree)(state);
+ const token = tree.resolve(line.from, 1).name;
+ if (token.contains("hmd-frontmatter")) {
+ return "frontmatter" /* frontmatter */;
+ }
+ if (token.contains("math")) {
+ for (let p = line.from + 1; p < line.to; p += 1) {
+ if (!tree.resolve(p, 1).name.contains("math")) {
+ return "text" /* text */;
+ }
+ }
+ return "formula" /* formula */;
+ } else if (token.contains("code") && token.contains("block")) {
+ for (let p = line.from + 1; p < line.to; p += 1) {
+ let t = tree.resolve(p, 1).name;
+ if (!(t.contains("code") && t.contains("block"))) {
+ return "text" /* text */;
+ }
+ }
+ return "codeblock" /* codeblock */;
+ }
+ for (let p = line.from; p < line.to; p += 1) {
+ if (tree.resolve(p, 1).name.contains("list")) {
+ return "list" /* list */;
+ } else if (tree.resolve(p, 1).name.contains("callout")) {
+ return "callout_title" /* callout_title */;
+ }
+ }
+ if (token.contains("quote")) {
+ return "quote" /* quote */;
+ }
+ return "text" /* text */;
+}
+
+// src/settings.ts
+var import_obsidian2 = require("obsidian");
+
+// src/lang/locale/en-US.ts
+var locale = {
+ settings: {
+ symbolAutoPair: {
+ name: "Symbol auto pair and delete with pair",
+ desc: "Add auto-pairing and auto-deletion for various symbols such as \u300A\u300B, \u201C\u201D, \u300C\u300D, \u300E\u300F, \u3010\u3011, etc."
+ },
+ selectionReplace: {
+ name: "Selection Replace Enhancement",
+ desc: "Enhanced editing for selected text, e.g., pressing \uFFE5 \u2192 $selected text$, pressing \xB7 \u2192 `selected text`, \u300A \u2192 \u300Aselected text\u300B, etc."
+ },
+ fullWidthToHalfWidth: {
+ name: "Convert successive full width symbol to half width symbol",
+ desc: "Convert consecutive full-width symbols to half-width, e.g., \u3002\u3002\u2192 ., \uFF01\uFF01\u2192 !, \u300B\u300B\u2192 >"
+ },
+ basicInputEnhance: {
+ name: "Basic symbol input enhance for Obsidian",
+ desc: "Basic input enhancement for Obsidian, e.g., \u3010\u3010| \u2192 [[|]], starting with \u3001\u2192 /, starting with \u300B\u2192 >, \xB7\xB7| \u2192 `|`, `\xB7|` becomes code block, \uFFE5\uFFE5| \u2192 $|$"
+ },
+ codeblockEdit: {
+ name: "Enhance codeblock edit",
+ desc: "Improve editing in codeblocks (Tab, delete, paste, Cmd/Ctrl+A select)."
+ },
+ tabOut: {
+ name: "Tabout",
+ desc: "Tab out of inline code or paired symbols (when selected)."
+ },
+ autoFormatting: {
+ name: "Auto formatting when typing",
+ desc: "Toggle auto-formatting of text while editing the document."
+ },
+ spaceBetweenChineseEnglish: {
+ name: "Space between Chinese and English",
+ desc: "Insert space between Chinese and English characters."
+ },
+ spaceBetweenChineseNumber: {
+ name: "Space between Chinese and Number",
+ desc: "Insert space between Chinese characters and numbers."
+ },
+ spaceBetweenEnglishNumber: {
+ name: "Space between English and Number",
+ desc: "Insert space between English characters and numbers."
+ },
+ deleteSpaceBetweenChinese: {
+ name: "Delete the Space between Chinese characters",
+ desc: "Remove spaces between Chinese characters."
+ },
+ capitalizeFirstLetter: {
+ name: "Capitalize the first letter of every sentence",
+ desc: "Capitalize the first letter of each sentence in English."
+ },
+ smartInsertSpace: {
+ name: "Smartly insert space between text and punctuation",
+ desc: "Insert space between text and punctuation intelligently."
+ },
+ spaceStrategyInlineCode: {
+ name: "Space strategy between inline code and text",
+ desc: "No requirement: No space requirement between this category block and the surrounding text. Soft space: Only requires a soft space between this category block and the surrounding blocks. Soft space example: If the adjacent text on the left side of the current block is full-width punctuation like . , ; ? etc., and the adjacent text on the right side of the current block is all full-width or half-width punctuation. Strict space: Strictly add spaces between the current block and the adjacent text."
+ },
+ spaceStrategyInlineFormula: {
+ name: "Space strategy between inline formula and text",
+ desc: "Define the spacing strategy between inline formulas and text."
+ },
+ spaceStrategyLinkText: {
+ name: "Space strategy between link and text",
+ desc: "Define the spacing strategy between [[wikilink]] [mdlink](...) and text."
+ },
+ userDefinedRegexpSwitch: {
+ name: "User Defined RegExp Switch",
+ desc: "Toggle custom regular expressions, preventing formatting and setting space strategy between matched content and other text."
+ },
+ userDefinedRegexp: {
+ name: "User-defined Regular Expression, one expression per line",
+ desc: "User-defined regular expression, matched to the content is not formatted, one expression per line, do not feel free to add spaces at the end of the line.The end of each line of three characters fixed as | and two space strategy symbols, space strategy symbols for - = +, respectively, on behalf of not requiring spaces (-), soft spaces (=), strict spaces (+).These two space strategy symbols are the space strategy for the left and right sides of the matching block respectively"
+ },
+ excludeFoldersFiles: {
+ name: "Exclude Folders/Files",
+ desc: "This plugin will parse each line as an exclude folder or file. For example: DailyNote/, DailyNote/WeekNotes/, DailyNote/test.md"
+ },
+ fixMacOSContextMenu: {
+ name: "Fix MacOS context-menu cursor position (Need to restart Obsidian)",
+ desc: "Fix the issue where the cursor jumps to the next line when the context menu is invoked on MacOS (requires restarting Obsidian)."
+ },
+ fixMicrosoftIME: {
+ name: "Fix Microsoft Input Method Issue",
+ desc: "Adapt for older versions of Microsoft Input Method."
+ },
+ strictLineBreaks: {
+ name: "Strict Line breaks Mode Enter Twice",
+ desc: "In strict line breaks mode, pressing Enter once in normal text lines will produce two line breaks."
+ },
+ puncRectify: {
+ name: "Punc rectify",
+ desc: "Automatically convert English punctuation (, . ? !) between Chinese characters to full-width punctuation during typing (reversible)."
+ },
+ printDebugInfo: {
+ name: "Print debug info in console",
+ desc: "Print debug information in the console."
+ },
+ selectionReplaceRule: {
+ name: "Selection Replace Rule",
+ desc: "User defined Selection Replace Rule"
+ },
+ deleteRule: {
+ name: "Delete Rule",
+ desc: "Rule: Use | to indicate the cursor position. Tips: Using | to indicate the cursor position."
+ },
+ convertRule: {
+ name: "Convert Rule",
+ desc: "Rule: Use | to indicate the cursor position. Tips: Using | to indicate the cursor position."
+ },
+ trigger: {
+ name: "Trigger"
+ },
+ left: {
+ name: "Left"
+ },
+ right: {
+ name: "Right"
+ },
+ oldPattern: {
+ name: "Old Pattern"
+ },
+ newPattern: {
+ name: "New Pattern"
+ }
+ },
+ headers: {
+ main: "Obsidian EasyTyping Plugin",
+ githubDetail: "More detail is in Github: ",
+ enhancedEditing: "Enhanced Editing Setting",
+ customizeEditRule: "Customize Edit Convertion Rule",
+ autoformatSetting: "Autoformat Setting",
+ detailedSetting: "Detailed Setting Below",
+ customRegexpBlock: "Custom regular expressions block",
+ excludeFoldersFiles: "Exclude Folders/Files",
+ experimentalFeatures: "Experimental Features",
+ aboutRegexp: {
+ header: "For knowledge about regular expressions, see ",
+ text: "Yifeng Nguyen: A Concise Tutorial on Regular Expressions"
+ },
+ instructionsRegexp: {
+ header: "Instructions and examples for using regular expression rules: ",
+ text: "Customizing Regular Expression Rules"
+ },
+ customizeSelectionRule: "Customize Selection Replace Rule",
+ customizeDeleteRule: "Customize Delete Rule",
+ customizeConvertRule: "Customize Convert Rule",
+ editSelectionReplaceRule: "Edit Selection Replace Rule"
+ },
+ dropdownOptions: {
+ onlyWhenTyping: "Only When Typing",
+ globally: "Work Globally",
+ noRequire: "No Require",
+ softSpace: "Soft Space",
+ strictSpace: "Strict Space",
+ dummy: "Dummy",
+ smart: "Smart"
+ },
+ toolTip: {
+ switch: "Switch",
+ editRule: "Edit rule",
+ removeRule: "Remove rule",
+ addRule: "Add Rule"
+ },
+ placeHolder: {
+ triggerSymbol: "Trigger Symbol",
+ newLeftSideString: "New Left Side String",
+ newRightSideString: "New Right Side String",
+ addRule: "Add Rule",
+ noticeInvaidTrigger: "Inlvalid trigger, trigger must be a symbol of length 1 or symbol \u2014\u2014, \u2026\u2026",
+ noticeWarnTriggerExists: "warning! Trigger %s is already exist!",
+ noticeMissingInput: "missing input",
+ beforeDelete: "Before Delete",
+ newPattern: "New Pattern",
+ noticeInvaidTriggerPatternContainSymbol: "Inlvalid trigger, pattern must contain symbol | which indicate cursor position",
+ beforeConvert: "Before Convert",
+ noticeInvalidPatternString: "Invalid pattern string!"
+ },
+ button: {
+ update: "Update"
+ }
+};
+var en_US_default = locale;
+
+// src/lang/locale/zh-CN.ts
+var locale2 = {
+ settings: {
+ symbolAutoPair: {
+ name: "\u7B26\u53F7\u81EA\u52A8\u914D\u5BF9\u53CA\u5220\u9664\u914D\u5BF9",
+ desc: "\u589E\u52A0\u591A\u79CD\u7B26\u53F7\u914D\u5BF9\u8F93\u5165\uFF0C\u914D\u5BF9\u5220\u9664\uFF0C\u5982\u300A\u300B, \u201C\u201D, \u300C\u300D, \u300E\u300F, \u3010\u3011\u7B49"
+ },
+ selectionReplace: {
+ name: "\u9009\u4E2D\u6587\u672C\u66FF\u6362\u589E\u5F3A",
+ desc: "\u9009\u4E2D\u6587\u672C\u60C5\u51B5\u4E0B\u7684\u7F16\u8F91\u589E\u5F3A\uFF0C\u6309\uFFE5\u2192$\u9009\u4E2D\u7684\u6587\u672C$, \u6309\xB7\u2192`\u9009\u4E2D\u7684\u6587\u672C`\uFF0C\u300A \u2192 \u300A\u9009\u4E2D\u7684\u6587\u672C\u300B\u7B49\u7B49"
+ },
+ fullWidthToHalfWidth: {
+ name: "\u8FDE\u7EED\u8F93\u5165\u5168\u89D2\u7B26\u53F7\u8F6C\u534A\u89D2\u7B26\u53F7",
+ desc: "\u8FDE\u7EED\u8F93\u5165\u5168\u89D2\u7B26\u53F7\u8F6C\u534A\u89D2\uFF0C\u3002\u3002\u2192 .\uFF0C\uFF01\uFF01\u2192 !\uFF0C \u300B\u300B\u2192 >"
+ },
+ basicInputEnhance: {
+ name: "Obsidian \u7684\u57FA\u7840\u7B26\u53F7\u8F93\u5165\u589E\u5F3A",
+ desc: "Obsidian \u7684\u57FA\u7840\u8F93\u5165\u589E\u5F3A\uFF0C\u5982\u3010\u3010| \u2192 [[|]]\uFF0C\u53E5\u9996\u7684\u3001\u2192 /\uFF0C\u53E5\u9996\u7684\u300B\u2192 >\uFF0C\xB7\xB7| \u2192 `|`\uFF0C `\xB7|` \u53D8\u6210\u4EE3\u7801\u5757\uFF0C\uFFE5\uFFE5| \u2192 $|$"
+ },
+ codeblockEdit: {
+ name: "\u589E\u5F3A\u4EE3\u7801\u5757\u7F16\u8F91",
+ desc: "\u589E\u5F3A\u4EE3\u7801\u5757\u5185\u7684\u7F16\u8F91\uFF08Cmd/Ctrl+A \u9009\u4E2D\u3001Tab\u3001\u5220\u9664\u3001\u7C98\u8D34\uFF09"
+ },
+ tabOut: {
+ name: "\u8DF3\u51FA\u4EE3\u7801\u5757",
+ desc: "Tab \u8DF3\u51FA\u884C\u5185\u4EE3\u7801\u5757\u6216\u914D\u5BF9\u7B26\u53F7\u5757(\u9009\u4E2D\u65F6)"
+ },
+ autoFormatting: {
+ name: "\u8F93\u5165\u65F6\u81EA\u52A8\u683C\u5F0F\u5316",
+ desc: "\u662F\u5426\u5728\u7F16\u8F91\u6587\u6863\u65F6\u81EA\u52A8\u683C\u5F0F\u5316\u6587\u672C\uFF0C\u81EA\u52A8\u683C\u5F0F\u5316\u7684\u603B\u5F00\u5173"
+ },
+ spaceBetweenChineseEnglish: {
+ name: "\u4E2D\u6587\u4E0E\u82F1\u6587\u4E4B\u95F4\u7684\u7A7A\u683C",
+ desc: "\u5728\u4E2D\u6587\u548C\u82F1\u6587\u4E4B\u95F4\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u64A4\u9500"
+ },
+ spaceBetweenChineseNumber: {
+ name: "\u4E2D\u6587\u4E0E\u6570\u5B57\u4E4B\u95F4\u7684\u7A7A\u683C",
+ desc: "\u5728\u4E2D\u6587\u548C\u6570\u5B57\u4E4B\u95F4\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u64A4\u9500"
+ },
+ spaceBetweenEnglishNumber: {
+ name: "\u82F1\u6587\u4E0E\u6570\u5B57\u4E4B\u95F4\u7684\u7A7A\u683C",
+ desc: "\u5728\u82F1\u6587\u548C\u6570\u5B57\u4E4B\u95F4\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u64A4\u9500"
+ },
+ deleteSpaceBetweenChinese: {
+ name: "\u5220\u9664\u4E2D\u6587\u5B57\u7B26\u95F4\u7684\u7A7A\u683C",
+ desc: "\u53BB\u9664\u4E2D\u6587\u5B57\u7B26\u4E4B\u95F4\u7684\u7A7A\u683C\uFF0C\u4E0D\u53EF\u64A4\u9500"
+ },
+ capitalizeFirstLetter: {
+ name: "\u53E5\u9996\u5B57\u6BCD\u5927\u5199",
+ desc: "\u82F1\u6587\u6BCF\u4E2A\u53E5\u9996\u5B57\u6BCD\u5927\u5199\uFF0C\u53EF\u64A4\u9500"
+ },
+ smartInsertSpace: {
+ name: "\u667A\u80FD\u63D2\u5165\u7A7A\u683C",
+ desc: "\u5728\u6587\u672C\u548C\u6807\u70B9\u4E4B\u95F4\u667A\u80FD\u63D2\u5165\u7A7A\u683C"
+ },
+ spaceStrategyInlineCode: {
+ name: "\u884C\u5185\u4EE3\u7801\u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565",
+ desc: "\u65E0\u8981\u6C42\uFF1A\u5BF9\u672C\u7C7B\u522B\u5757\u4E0E\u5DE6\u53F3\u6587\u672C\u6CA1\u6709\u7A7A\u683C\u7684\u8981\u6C42\uFF0C\u8F6F\u7A7A\u683C\uFF1A\u5BF9\u672C\u7C7B\u522B\u5757\u4E0E\u5468\u56F4\u533A\u5757\u53EA\u8981\u6C42\u6709\u8F6F\u7A7A\u683C\uFF0C\u8F6F\u7A7A\u683C\u5982\u5F53\u524D\u5757\u5DE6\u8FB9\u7684\u4E34\u8FD1\u6587\u672C\u4E3A\u3002\uFF0C\uFF1B\uFF1F\u7B49\u5168\u89D2\u6807\u70B9\uFF0C\u5F53\u524D\u5757\u53F3\u8FB9\u7684\u4E34\u8FD1\u6587\u672C\u4E3A\u6240\u6709\u5168\u534A\u89D2\u6807\u70B9\uFF0C\u4E25\u683C\u7A7A\u683C\uFF1A\u5F53\u524D\u5757\u4E0E\u4E34\u8FD1\u6587\u672C\u4E4B\u95F4\u4E25\u683C\u6DFB\u52A0\u7A7A\u683C\u3002"
+ },
+ spaceStrategyInlineFormula: {
+ name: "\u884C\u5185\u516C\u5F0F\u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565",
+ desc: "\u5B9A\u4E49\u884C\u5185\u516C\u5F0F\u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565"
+ },
+ spaceStrategyLinkText: {
+ name: "\u94FE\u63A5\u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565",
+ desc: "\u5B9A\u4E49 [[wikilink]] [mdlink](...) \u548C\u6587\u672C\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565"
+ },
+ userDefinedRegexpSwitch: {
+ name: "\u7528\u6237\u5B9A\u4E49\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\u5F00\u5173",
+ desc: "\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u5F00\u5173\uFF0C\u5339\u914D\u5230\u7684\u5185\u5BB9\u4E0D\u8FDB\u884C\u683C\u5F0F\u5316\uFF0C\u4E14\u53EF\u4EE5\u8BBE\u7F6E\u5339\u914D\u5230\u7684\u5185\u5BB9\u5757\u4E0E\u5176\u4ED6\u5185\u5BB9\u4E4B\u95F4\u7684\u7A7A\u683C\u7B56\u7565"
+ },
+ userDefinedRegexp: {
+ name: "\u7528\u6237\u5B9A\u4E49\u7684\u6B63\u5219\u8868\u8FBE\u5F0F",
+ desc: "\u7528\u6237\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\uFF0C\u5339\u914D\u5230\u7684\u5185\u5BB9\u4E0D\u8FDB\u884C\u683C\u5F0F\u5316\uFF0C\u6BCF\u884C\u4E00\u4E2A\u8868\u8FBE\u5F0F\uFF0C\u884C\u5C3E\u4E0D\u8981\u968F\u610F\u52A0\u7A7A\u683C\u3002\u6BCF\u884C\u672B\u5C3E3\u4E2A\u5B57\u7B26\u7684\u56FA\u5B9A\u4E3A|\u548C\u4E24\u4E2A\u7A7A\u683C\u7B56\u7565\u7B26\u53F7\uFF0C\u7A7A\u683C\u7B56\u7565\u7B26\u53F7\u4E3A-=+\uFF0C\u5206\u522B\u4EE3\u8868\u4E0D\u8981\u6C42\u7A7A\u683C(-)\uFF0C\u8F6F\u7A7A\u683C(=)\uFF0C\u4E25\u683C\u7A7A\u683C(+)\u3002\u8FD9\u4E24\u4E2A\u7A7A\u683C\u7B56\u7565\u7B26\u53F7\u5206\u522B\u4E3A\u5339\u914D\u533A\u5757\u7684\u5DE6\u53F3\u4E24\u8FB9\u7684\u7A7A\u683C\u7B56\u7565"
+ },
+ excludeFoldersFiles: {
+ name: "\u6392\u9664\u6587\u4EF6\u5939/\u6587\u4EF6",
+ desc: "\u8BE5\u63D2\u4EF6\u5C06\u6BCF\u884C\u89E3\u6790\u4E3A\u4E00\u4E2A\u6392\u9664\u6587\u4EF6\u5939\u6216\u6587\u4EF6\u3002\u4F8B\u5982\uFF1ADailyNote/, DailyNote/WeekNotes/, DailyNote/test.md"
+ },
+ fixMacOSContextMenu: {
+ name: "\u4FEE\u590D MacOS \u53F3\u952E\u83DC\u5355\u5149\u6807\u4F4D\u7F6E",
+ desc: "\u4FEE\u590D MacOS \u9F20\u6807\u53F3\u952E\u547C\u51FA\u83DC\u5355\u65F6\u5149\u6807\u8DF3\u5230\u4E0B\u4E00\u884C\u7684\u95EE\u9898 (\u9700\u8981\u91CD\u542F Obsidian \u751F\u6548)"
+ },
+ fixMicrosoftIME: {
+ name: "\u4FEE\u590D\u5FAE\u8F6F\u8F93\u5165\u6CD5\u95EE\u9898",
+ desc: "\u9002\u914D\u65E7\u7248\u5FAE\u8F6F\u8F93\u5165\u6CD5"
+ },
+ strictLineBreaks: {
+ name: "\u4E25\u683C\u6362\u884C\u6A21\u5F0F\u4E0B\u6309\u4E24\u6B21\u56DE\u8F66",
+ desc: "\u4E25\u683C\u6362\u884C\u7684\u8BBE\u7F6E\u4E0B\uFF0C\u5728\u666E\u901A\u6587\u672C\u884C\u8FDB\u884C\u4E00\u6B21\u56DE\u8F66\u4F1A\u4EA7\u751F\u4E24\u4E2A\u6362\u884C\u7B26"
+ },
+ puncRectify: {
+ name: "\u6807\u70B9\u77EB\u6B63",
+ desc: "\u4EC5\u5728\u8F93\u5165\u8FC7\u7A0B\u4E2D\uFF0C\u4E2D\u6587\u95F4\u7684\u82F1\u6587\u6807\u70B9\uFF08,.?!\uFF09\u81EA\u52A8\u8F6C\u6362\u4E3A\u5168\u89D2\uFF08\u53EF\u64A4\u9500\uFF09"
+ },
+ printDebugInfo: {
+ name: "\u5728\u63A7\u5236\u53F0\u8F93\u51FA\u8C03\u8BD5\u4FE1\u606F",
+ desc: "\u5728\u63A7\u5236\u53F0\u8F93\u51FA\u8C03\u8BD5\u4FE1\u606F"
+ },
+ selectionReplaceRule: {
+ name: "\u9009\u4E2D\u66FF\u6362\u89C4\u5219",
+ desc: "\u7528\u6237\u5B9A\u4E49\u7684\u9009\u62E9\u66FF\u6362\u89C4\u5219"
+ },
+ deleteRule: {
+ name: "\u5220\u9664\u89C4\u5219",
+ desc: "\u89C4\u5219\uFF1A\u7528 | \u4EE3\u8868\u5149\u6807\u4F4D\u7F6E\uFF0C\u5FC5\u987B\u5305\u542B\u5149\u6807\u3002\u63D0\u793A\uFF1A\u4F7F\u7528 | \u8868\u793A\u5149\u6807\u4F4D\u7F6E\u3002"
+ },
+ convertRule: {
+ name: "\u8F6C\u6362\u89C4\u5219",
+ desc: "\u89C4\u5219\uFF1A\u7528 | \u4EE3\u8868\u5149\u6807\u4F4D\u7F6E\uFF0C\u5FC5\u987B\u5305\u542B\u5149\u6807\u3002\u63D0\u793A\uFF1A\u4F7F\u7528 | \u8868\u793A\u5149\u6807\u4F4D\u7F6E\u3002"
+ },
+ trigger: {
+ name: "\u89E6\u53D1\u5668"
+ },
+ left: {
+ name: "\u5DE6"
+ },
+ right: {
+ name: "\u53F3"
+ },
+ oldPattern: {
+ name: "\u65E7\u6A21\u5F0F"
+ },
+ newPattern: {
+ name: "\u65B0\u6A21\u5F0F"
+ }
+ },
+ headers: {
+ main: "Obsidian EasyTyping \u63D2\u4EF6",
+ githubDetail: "\u8BE6\u60C5\u89C1 Github\uFF1A",
+ enhancedEditing: "\u589E\u5F3A\u7F16\u8F91\u8BBE\u7F6E",
+ customizeEditRule: "\u81EA\u5B9A\u4E49\u7F16\u8F91\u8F6C\u6362\u89C4\u5219",
+ autoformatSetting: "\u81EA\u52A8\u683C\u5F0F\u5316\u8BBE\u7F6E",
+ detailedSetting: "\u8BE6\u7EC6\u8BBE\u7F6E\u5982\u4E0B",
+ customRegexpBlock: "\u81EA\u5B9A\u4E49\u6B63\u5219\u533A\u5757",
+ excludeFoldersFiles: "\u6307\u5B9A\u6587\u4EF6\u4E0D\u81EA\u52A8\u683C\u5F0F\u5316",
+ experimentalFeatures: "\u5B9E\u9A8C\u529F\u80FD",
+ aboutRegexp: {
+ header: "\u6B63\u5219\u8868\u8FBE\u5F0F\u76F8\u5173\u77E5\u8BC6\uFF0C\u89C1 ",
+ text: "\u300A\u962E\u4E00\u5CF0\uFF1A\u6B63\u5219\u8868\u8FBE\u5F0F\u7B80\u660E\u6559\u7A0B\u300B"
+ },
+ instructionsRegexp: {
+ header: "\u6B63\u5219\u8868\u8FBE\u5F0F\u89C4\u5219\u4F7F\u7528\u8BF4\u660E\u4E0E\u793A\u4F8B\uFF1A ",
+ text: "\u81EA\u5B9A\u4E49\u6B63\u5219\u8868\u8FBE\u5F0F\u89C4\u5219"
+ },
+ customizeSelectionRule: "\u81EA\u5B9A\u4E49\u9009\u4E2D\u6587\u672C\u7F16\u8F91\u589E\u5F3A\u89C4\u5219",
+ customizeDeleteRule: "\u81EA\u5B9A\u4E49\u5220\u9664\u7F16\u8F91\u589E\u5F3A\u89C4\u5219",
+ customizeConvertRule: "\u81EA\u5B9A\u4E49\u7F16\u8F91\u8F6C\u6362\u89C4\u5219",
+ editSelectionReplaceRule: "\u7F16\u8F91\u9009\u4E2D\u66FF\u6362\u89C4\u5219"
+ },
+ dropdownOptions: {
+ onlyWhenTyping: "\u8F93\u5165\u65F6\u751F\u6548",
+ globally: "\u5168\u5C40\u751F\u6548",
+ noRequire: "\u65E0\u8981\u6C42",
+ softSpace: "\u8F6F\u7A7A\u683C",
+ strictSpace: "\u4E25\u683C\u7A7A\u683C",
+ dummy: "\u5446\u7A7A\u683C",
+ smart: "\u667A\u80FD\u7A7A\u683C"
+ },
+ toolTip: {
+ switch: "\u529F\u80FD\u5F00\u5173",
+ editRule: "\u7F16\u8F91\u89C4\u5219",
+ removeRule: "\u5220\u9664\u89C4\u5219",
+ addRule: "\u6DFB\u52A0\u89C4\u5219"
+ },
+ placeHolder: {
+ triggerSymbol: "\u89E6\u53D1\u7B26",
+ newLeftSideString: "\u5DE6\u8FB9\u7B26\u53F7",
+ newRightSideString: "\u53F3\u8FB9\u7B26\u53F7",
+ addRule: "\u6DFB\u52A0\u89C4\u5219",
+ noticeInvaidTrigger: "\u65E0\u6548\u7684\u89E6\u53D1\u7B26, \u89E6\u53D1\u7B26\u5FC5\u987B\u662F\u5355\u5B57\u7B26\u6216\u8005\u662F \u2014\u2014\u3001\u2026\u2026",
+ noticeWarnTriggerExists: "\u65E0\u6548\u89C4\u5219! \u89E6\u53D1\u7B26 %s \u5DF2\u5B58\u5728",
+ noticeMissingInput: "missing input",
+ beforeDelete: "\u5220\u9664\u524D|",
+ newPattern: "\u89E6\u53D1\u89C4\u5219\u540E\u5B57\u7B26\u4E32\u6A21\u5F0F",
+ noticeInvaidTriggerPatternContainSymbol: "\u65E0\u6548\u89C4\u5219, \u8F6C\u6362\u524D\u6A21\u5F0F\u5FC5\u987B\u5305\u542B\u4EE3\u8868\u5149\u6807\u4F4D\u7F6E\u7684\u7B26\u53F7 |",
+ beforeConvert: "\u8F6C\u6362\u524D|",
+ noticeInvalidPatternString: "Invalid pattern string!"
+ },
+ button: {
+ update: "\u66F4\u65B0"
+ }
+};
+var zh_CN_default = locale2;
+
+// src/lang/locale/ru-RU.ts
+var locale3 = {
+ settings: {
+ symbolAutoPair: {
+ name: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0438 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u043F\u0430\u0440\u0430",
+ desc: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u0438 \u0430\u0432\u0442\u043E\u0437\u0430\u043A\u0440\u044B\u0442\u0438\u0435 \u0434\u043B\u044F \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A \u300A\u300B, \u201C\u201D, \u300C\u300D, \u300E\u300F, \u3010\u3011 \u0438 \u0442.\u0434."
+ },
+ selectionReplace: {
+ name: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430",
+ desc: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u043E\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u043D\u0430\u0436\u0430\u0442\u0438\u0435 \uFFE5 \u2192 $\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442$, \u043D\u0430\u0436\u0430\u0442\u0438\u0435 \xB7 \u2192 `\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442`, \u300A \u2192 \u300A\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442\u300B \u0438 \u0442.\u0434."
+ },
+ fullWidthToHalfWidth: {
+ name: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044F \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 \u043F\u043E\u043B\u0443\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0435",
+ desc: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044F \u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0432 \u043F\u043E\u043B\u0443\u0448\u0438\u0440\u0438\u043D\u043D\u044B\u0435, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u3002\u3002\u2192 ., \uFF01\uFF01\u2192 !, \u300B\u300B\u2192 >"
+ },
+ basicInputEnhance: {
+ name: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0431\u0430\u0437\u043E\u0432\u043E\u0433\u043E \u0432\u0432\u043E\u0434\u0430 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 \u0434\u043B\u044F Obsidian",
+ desc: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0431\u0430\u0437\u043E\u0432\u043E\u0433\u043E \u0432\u0432\u043E\u0434\u0430 \u0434\u043B\u044F Obsidian, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, \u3010\u3010| \u2192 [[|]], \u043D\u0430\u0447\u0430\u043B\u043E \u0441 \u3001\u2192 /, \u043D\u0430\u0447\u0430\u043B\u043E \u0441 \u300B\u2192 >, \xB7\xB7| \u2192 `|`, `\xB7|` \u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0441\u044F \u043A\u043E\u0434\u043E\u0432\u044B\u043C \u0431\u043B\u043E\u043A\u043E\u043C, \uFFE5\uFFE5| \u2192 $|$"
+ },
+ codeblockEdit: {
+ name: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043A\u043E\u0434\u043E\u0432\u044B\u0445 \u0431\u043B\u043E\u043A\u043E\u0432",
+ desc: "\u0423\u043B\u0443\u0447\u0448\u0435\u043D\u0438\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u043A\u043E\u0434\u043E\u0432\u044B\u0445 \u0431\u043B\u043E\u043A\u0430\u0445 (Tab, \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u0435, \u0432\u0441\u0442\u0430\u0432\u043A\u0430, Cmd/Ctrl+A \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435)."
+ },
+ tabOut: {
+ name: "Tabout",
+ desc: "\u0412\u044B\u0439\u0442\u0438 \u0438\u0437 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0438\u043B\u0438 \u043F\u0430\u0440\u043D\u044B\u0445 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432 (\u043A\u043E\u0433\u0434\u0430 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043E)."
+ },
+ autoFormatting: {
+ name: "\u0410\u0432\u0442\u043E\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u0438 \u043D\u0430\u0431\u043E\u0440\u0435 \u0442\u0435\u043A\u0441\u0442\u0430",
+ desc: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435/\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u0430\u0432\u0442\u043E\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u0430 \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430."
+ },
+ spaceBetweenChineseEnglish: {
+ name: "\u041F\u0440\u043E\u0431\u0435\u043B \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0438 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438",
+ desc: "\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0438 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438."
+ },
+ spaceBetweenChineseNumber: {
+ name: "\u041F\u0440\u043E\u0431\u0435\u043B \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0438 \u0447\u0438\u0441\u043B\u0430\u043C\u0438",
+ desc: "\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0438 \u0447\u0438\u0441\u043B\u0430\u043C\u0438."
+ },
+ spaceBetweenEnglishNumber: {
+ name: "\u041F\u0440\u043E\u0431\u0435\u043B \u043C\u0435\u0436\u0434\u0443 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0438 \u0447\u0438\u0441\u043B\u0430\u043C\u0438",
+ desc: "\u0412\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0438 \u0447\u0438\u0441\u043B\u0430\u043C\u0438."
+ },
+ deleteSpaceBetweenChinese: {
+ name: "\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438",
+ desc: "\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438."
+ },
+ capitalizeFirstLetter: {
+ name: "\u0417\u0430\u0433\u043B\u0430\u0432\u043D\u0430\u044F \u0431\u0443\u043A\u0432\u0430 \u0432 \u043D\u0430\u0447\u0430\u043B\u0435 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F",
+ desc: "\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0435\u0440\u0432\u043E\u0439 \u0431\u0443\u043A\u0432\u044B \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0432 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u043E\u043C \u0432 \u0437\u0430\u0433\u043B\u0430\u0432\u043D\u0443\u044E."
+ },
+ smartInsertSpace: {
+ name: "\u0418\u043D\u0442\u0435\u043B\u043B\u0435\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u0430\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u0442\u0435\u043A\u0441\u0442\u043E\u043C \u0438 \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u0435\u0439",
+ desc: "\u0418\u043D\u0442\u0435\u043B\u043B\u0435\u043A\u0442\u0443\u0430\u043B\u044C\u043D\u0430\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0430 \u043F\u0440\u043E\u0431\u0435\u043B\u0430 \u043C\u0435\u0436\u0434\u0443 \u0442\u0435\u043A\u0441\u0442\u043E\u043C \u0438 \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u0435\u0439."
+ },
+ spaceStrategyInlineCode: {
+ name: "\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C",
+ desc: "\u041D\u0435\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u0439: \u041D\u0435\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u0439 \u043A \u043F\u0440\u043E\u0431\u0435\u043B\u0430\u043C \u043C\u0435\u0436\u0434\u0443 \u044D\u0442\u0438\u043C \u0431\u043B\u043E\u043A\u043E\u043C \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438 \u0438 \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0438\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C. \u041C\u044F\u0433\u043A\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B: \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0442\u043E\u043B\u044C\u043A\u043E \u043C\u044F\u0433\u043A\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B \u043C\u0435\u0436\u0434\u0443 \u044D\u0442\u0438\u043C \u0431\u043B\u043E\u043A\u043E\u043C \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0438 \u0438 \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0438\u043C\u0438 \u0431\u043B\u043E\u043A\u0430\u043C\u0438. \u041F\u0440\u0438\u043C\u0435\u0440 \u043C\u044F\u0433\u043A\u043E\u0433\u043E \u043F\u0440\u043E\u0431\u0435\u043B\u0430: \u0415\u0441\u043B\u0438 \u043F\u0440\u0438\u043B\u0435\u0433\u0430\u044E\u0449\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0441\u043B\u0435\u0432\u0430 \u043E\u0442 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0431\u043B\u043E\u043A\u0430 - \u044D\u0442\u043E \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u0430\u044F \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u044F, \u0442\u0430\u043A\u0430\u044F \u043A\u0430\u043A . , ; ? \u0438 \u0442.\u0434., \u0430 \u043F\u0440\u0438\u043B\u0435\u0433\u0430\u044E\u0449\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0441\u043F\u0440\u0430\u0432\u0430 \u043E\u0442 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0431\u043B\u043E\u043A\u0430 - \u044D\u0442\u043E \u0432\u0441\u044F \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u0430\u044F \u0438\u043B\u0438 \u043F\u043E\u043B\u0443\u0448\u0438\u0440\u0438\u043D\u043D\u0430\u044F \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u044F. \u0421\u0442\u0440\u043E\u0433\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B: \u0421\u0442\u0440\u043E\u0433\u043E\u0435 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0442\u0435\u043A\u0443\u0449\u0438\u043C \u0431\u043B\u043E\u043A\u043E\u043C \u0438 \u043F\u0440\u0438\u043B\u0435\u0433\u0430\u044E\u0449\u0438\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C."
+ },
+ spaceStrategyInlineFormula: {
+ name: "\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u043E\u0439 \u0444\u043E\u0440\u043C\u0443\u043B\u043E\u0439 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C",
+ desc: "\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u043C\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0430\u043C\u0438 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C."
+ },
+ spaceStrategyLinkText: {
+ name: "\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0441\u0441\u044B\u043B\u043A\u043E\u0439 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C",
+ desc: "\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 [[\u0432\u0438\u043A\u0438\u0441\u0441\u044B\u043B\u043A\u0430\u043C\u0438]] [markdown-\u0441\u0441\u044B\u043B\u043A\u0430\u043C\u0438](...) \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u043C."
+ },
+ userDefinedRegexpSwitch: {
+ name: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439",
+ desc: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435/\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0435\u043D\u0438\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0438 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u043C\u0435\u0436\u0434\u0443 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0438\u043C \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u044B\u043C \u0438 \u0434\u0440\u0443\u0433\u0438\u043C \u0442\u0435\u043A\u0441\u0442\u043E\u043C."
+ },
+ userDefinedRegexp: {
+ name: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435, \u043E\u0434\u043D\u043E \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443",
+ desc: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435, \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0435\u0435 \u0441 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u044B\u043C, \u043D\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044F, \u043E\u0434\u043D\u043E \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0443, \u043D\u0435 \u0434\u043E\u0431\u0430\u0432\u043B\u044F\u0439\u0442\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u044B \u0432 \u043A\u043E\u043D\u0446\u0435 \u0441\u0442\u0440\u043E\u043A\u0438.\u041A\u043E\u043D\u0435\u0446 \u043A\u0430\u0436\u0434\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0444\u0438\u043A\u0441\u0438\u0440\u043E\u0432\u0430\u043D \u0442\u0440\u0435\u043C\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438: | \u0438 \u0434\u0432\u0443\u043C\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432, \u0441\u0438\u043C\u0432\u043E\u043B\u044B \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 - \u044D\u0442\u043E - = +, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E \u043E\u0431\u043E\u0437\u043D\u0430\u0447\u0430\u044E\u0442 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 (-), \u043C\u044F\u0433\u043A\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u044B (=), \u0441\u0442\u0440\u043E\u0433\u0438\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u044B (+).\u042D\u0442\u0438 \u0434\u0432\u0430 \u0441\u0438\u043C\u0432\u043E\u043B\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u044F\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u0432 \u0434\u043B\u044F \u043B\u0435\u0432\u043E\u0439 \u0438 \u043F\u0440\u0430\u0432\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0449\u0435\u0433\u043E \u0431\u043B\u043E\u043A\u0430 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u043E"
+ },
+ excludeFoldersFiles: {
+ name: "\u0418\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0430\u043F\u043A\u0438/\u0444\u0430\u0439\u043B\u044B",
+ desc: "\u042D\u0442\u043E\u0442 \u043F\u043B\u0430\u0433\u0438\u043D \u0431\u0443\u0434\u0435\u0442 \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0442\u044C \u043A\u0430\u0436\u0434\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u043A\u0430\u043A \u0438\u0441\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u0443\u044E \u043F\u0430\u043F\u043A\u0443 \u0438\u043B\u0438 \u0444\u0430\u0439\u043B. \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: DailyNote/, DailyNote/WeekNotes/, DailyNote/test.md"
+ },
+ fixMacOSContextMenu: {
+ name: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u043D\u043E\u0433\u043E \u043C\u0435\u043D\u044E MacOS (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A Obsidian)",
+ desc: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B, \u043A\u043E\u0433\u0434\u0430 \u043A\u0443\u0440\u0441\u043E\u0440 \u043F\u0435\u0440\u0435\u0441\u043A\u0430\u043A\u0438\u0432\u0430\u0435\u0442 \u043D\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443 \u043F\u0440\u0438 \u0432\u044B\u0437\u043E\u0432\u0435 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u043D\u043E\u0433\u043E \u043C\u0435\u043D\u044E \u043D\u0430 MacOS (\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A Obsidian)."
+ },
+ fixMicrosoftIME: {
+ name: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u044B \u0441 Microsoft Input Method",
+ desc: "\u0410\u0434\u0430\u043F\u0442\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0441\u0442\u0430\u0440\u044B\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Microsoft Input Method."
+ },
+ strictLineBreaks: {
+ name: "\u0420\u0435\u0436\u0438\u043C \u0441\u0442\u0440\u043E\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u044B\u0432\u043E\u0432 \u0441\u0442\u0440\u043E\u043A, \u0434\u0432\u0430\u0436\u0434\u044B \u043D\u0430\u0436\u043C\u0438\u0442\u0435 Enter",
+ desc: "\u0412 \u0440\u0435\u0436\u0438\u043C\u0435 \u0441\u0442\u0440\u043E\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u044B\u0432\u043E\u0432 \u0441\u0442\u0440\u043E\u043A, \u043E\u0434\u043D\u043E\u043A\u0440\u0430\u0442\u043D\u043E\u0435 \u043D\u0430\u0436\u0430\u0442\u0438\u0435 Enter \u0432 \u043E\u0431\u044B\u0447\u043D\u044B\u0445 \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0445 \u0441\u0442\u0440\u043E\u043A\u0430\u0445 \u0441\u043E\u0437\u0434\u0430\u0441\u0442 \u0434\u0432\u0430 \u0440\u0430\u0437\u0440\u044B\u0432\u0430 \u0441\u0442\u0440\u043E\u043A\u0438."
+ },
+ puncRectify: {
+ name: "\u041A\u043E\u0440\u0440\u0435\u043A\u0446\u0438\u044F \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u0438",
+ desc: "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0430\u044F \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044F \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u043E\u0439 \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u0438 (, . ? !) \u043C\u0435\u0436\u0434\u0443 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u043C\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u0430\u043C\u0438 \u0432 \u043F\u043E\u043B\u043D\u043E\u0448\u0438\u0440\u0438\u043D\u043D\u0443\u044E \u043F\u0443\u043D\u043A\u0442\u0443\u0430\u0446\u0438\u044E \u043F\u0440\u0438 \u043D\u0430\u0431\u043E\u0440\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 (\u043E\u0431\u0440\u0430\u0442\u0438\u043C\u043E)."
+ },
+ printDebugInfo: {
+ name: "\u0412\u044B\u0432\u043E\u0434 \u043E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C",
+ desc: "\u0412\u044B\u0432\u043E\u0434 \u043E\u0442\u043B\u0430\u0434\u043E\u0447\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u0432 \u043A\u043E\u043D\u0441\u043E\u043B\u044C."
+ },
+ selectionReplaceRule: {
+ name: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430",
+ desc: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u043E \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430"
+ },
+ deleteRule: {
+ name: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F",
+ desc: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 | \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430. \u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 | \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430."
+ },
+ convertRule: {
+ name: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F",
+ desc: "\u041F\u0440\u0430\u0432\u0438\u043B\u043E: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 | \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430. \u041F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0430: \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435 | \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u0438\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u0438 \u043A\u0443\u0440\u0441\u043E\u0440\u0430."
+ },
+ trigger: {
+ name: "\u0422\u0440\u0438\u0433\u0433\u0435\u0440"
+ },
+ left: {
+ name: "\u041B\u0435\u0432\u044B\u0439"
+ },
+ right: {
+ name: "\u041F\u0440\u0430\u0432\u044B\u0439"
+ },
+ oldPattern: {
+ name: "\u0421\u0442\u0430\u0440\u044B\u0439 \u0448\u0430\u0431\u043B\u043E\u043D"
+ },
+ newPattern: {
+ name: "\u041D\u043E\u0432\u044B\u0439 \u0448\u0430\u0431\u043B\u043E\u043D"
+ }
+ },
+ headers: {
+ main: "\u041F\u043B\u0430\u0433\u0438\u043D Obsidian EasyTyping",
+ githubDetail: "\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0435\u0435 \u043D\u0430 Github: ",
+ enhancedEditing: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0443\u043B\u0443\u0447\u0448\u0435\u043D\u043D\u043E\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
+ customizeEditRule: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
+ autoformatSetting: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0430\u0432\u0442\u043E\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F",
+ detailedSetting: "\u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0430\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043D\u0438\u0436\u0435",
+ customRegexpBlock: "\u0411\u043B\u043E\u043A \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439",
+ excludeFoldersFiles: "\u0418\u0441\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0430\u043F\u043A\u0438/\u0444\u0430\u0439\u043B\u044B",
+ experimentalFeatures: "\u042D\u043A\u0441\u043F\u0435\u0440\u0438\u043C\u0435\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0438",
+ aboutRegexp: {
+ header: "\u0414\u043B\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u043E \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u0445 \u0441\u043C. ",
+ text: "Yifeng Nguyen: \u041A\u0440\u0430\u0442\u043A\u043E\u0435 \u0440\u0443\u043A\u043E\u0432\u043E\u0434\u0441\u0442\u0432\u043E \u043F\u043E \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u043C \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u043C"
+ },
+ instructionsRegexp: {
+ header: "\u0418\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u0438 \u0438 \u043F\u0440\u0438\u043C\u0435\u0440\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u043F\u0440\u0430\u0432\u0438\u043B \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439: ",
+ text: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u043F\u0440\u0430\u0432\u0438\u043B \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u044B\u0445 \u0432\u044B\u0440\u0430\u0436\u0435\u043D\u0438\u0439"
+ },
+ customizeSelectionRule: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430",
+ customizeDeleteRule: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F",
+ customizeConvertRule: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F",
+ editSelectionReplaceRule: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u0437\u0430\u043C\u0435\u043D\u044B \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430"
+ },
+ dropdownOptions: {
+ onlyWhenTyping: "\u0422\u043E\u043B\u044C\u043A\u043E \u043F\u0440\u0438 \u043D\u0430\u0431\u043E\u0440\u0435 \u0442\u0435\u043A\u0441\u0442\u0430",
+ globally: "\u0420\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u043E",
+ noRequire: "\u041D\u0435\u0442 \u0442\u0440\u0435\u0431\u043E\u0432\u0430\u043D\u0438\u0439",
+ softSpace: "\u041C\u044F\u0433\u043A\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B",
+ strictSpace: "\u0421\u0442\u0440\u043E\u0433\u0438\u0439 \u043F\u0440\u043E\u0431\u0435\u043B",
+ dummy: "\u0424\u0438\u043A\u0442\u0438\u0432\u043D\u044B\u0439",
+ smart: "\u0423\u043C\u043D\u044B\u0439"
+ },
+ toolTip: {
+ switch: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C",
+ editRule: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u043E",
+ removeRule: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u043E",
+ addRule: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u043E"
+ },
+ placeHolder: {
+ triggerSymbol: "\u0421\u0438\u043C\u0432\u043E\u043B \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430",
+ newLeftSideString: "\u041D\u043E\u0432\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441 \u043B\u0435\u0432\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B",
+ newRightSideString: "\u041D\u043E\u0432\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0441 \u043F\u0440\u0430\u0432\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B",
+ addRule: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u0440\u0430\u0432\u0438\u043B\u043E",
+ noticeInvaidTrigger: "\u041D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440, \u0442\u0440\u0438\u0433\u0433\u0435\u0440 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C \u0434\u043B\u0438\u043D\u043E\u0439 1 \u0438\u043B\u0438 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u043C \u2014\u2014, \u2026\u2026",
+ noticeWarnTriggerExists: "\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u0422\u0440\u0438\u0433\u0433\u0435\u0440 %s \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442!",
+ noticeMissingInput: "\u041E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0432\u043E\u0434",
+ beforeDelete: "\u0414\u043E \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F",
+ newPattern: "\u041D\u043E\u0432\u044B\u0439 \u0448\u0430\u0431\u043B\u043E\u043D",
+ noticeInvaidTriggerPatternContainSymbol: "\u041D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0442\u0440\u0438\u0433\u0433\u0435\u0440, \u0448\u0430\u0431\u043B\u043E\u043D \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B |, \u0443\u043A\u0430\u0437\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u043D\u0430 \u043F\u043E\u0437\u0438\u0446\u0438\u044E \u043A\u0443\u0440\u0441\u043E\u0440\u0430",
+ beforeConvert: "\u0414\u043E \u043F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u0438\u044F",
+ noticeInvalidPatternString: "\u041D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0441\u0442\u0440\u043E\u043A\u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u0430!"
+ },
+ button: {
+ update: "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C"
+ }
+};
+var ru_RU_default = locale3;
+
+// src/lang/locale/zh-TW.ts
+var locale4 = {
+ settings: {
+ symbolAutoPair: {
+ name: "\u7B26\u865F\u81EA\u52D5\u914D\u5C0D\u53CA\u522A\u9664\u914D\u5C0D",
+ desc: "\u589E\u52A0\u591A\u7A2E\u7B26\u865F\u914D\u5C0D\u8F38\u5165\uFF0C\u914D\u5C0D\u522A\u9664\uFF0C\u5982\u300A\u300B, \u201C\u201D, \u300C\u300D, \u300E\u300F, \u3010\u3011\u7B49"
+ },
+ selectionReplace: {
+ name: "\u9078\u4E2D\u6587\u672C\u66FF\u63DB\u589E\u5F3A",
+ desc: "\u9078\u4E2D\u6587\u672C\u60C5\u6CC1\u4E0B\u7684\u7DE8\u8F2F\u589E\u5F3A\uFF0C\u6309\uFFE5\u2192$\u9078\u4E2D\u7684\u6587\u672C$, \u6309\xB7\u2192`\u9078\u4E2D\u7684\u6587\u672C`\uFF0C\u300A \u2192 \u300A\u9078\u4E2D\u7684\u6587\u672C\u300B\u7B49\u7B49"
+ },
+ fullWidthToHalfWidth: {
+ name: "\u9023\u7E8C\u8F38\u5165\u5168\u89D2\u7B26\u865F\u8F49\u534A\u89D2\u7B26\u865F",
+ desc: "\u9023\u7E8C\u8F38\u5165\u5168\u89D2\u7B26\u865F\u8F49\u534A\u89D2\uFF0C\u3002\u3002\u2192 .\uFF0C\uFF01\uFF01\u2192 !\uFF0C \u300B\u300B\u2192 >"
+ },
+ basicInputEnhance: {
+ name: "Obsidian \u7684\u57FA\u790E\u7B26\u865F\u8F38\u5165\u589E\u5F3A",
+ desc: "Obsidian \u7684\u57FA\u790E\u8F38\u5165\u589E\u5F3A\uFF0C\u5982\u3010\u3010| \u2192 [[|]]\uFF0C\u53E5\u9996\u7684\u3001\u2192 /\uFF0C\u53E5\u9996\u7684\u300B\u2192 >\uFF0C\xB7\xB7| \u2192 `|`\uFF0C `\xB7|` \u8B8A\u6210\u4EE3\u78BC\u584A\uFF0C\uFFE5\uFFE5| \u2192 $|$"
+ },
+ codeblockEdit: {
+ name: "\u589E\u5F3A\u4EE3\u78BC\u584A\u7DE8\u8F2F",
+ desc: "\u589E\u5F3A\u4EE3\u78BC\u584A\u5167\u7684\u7DE8\u8F2F\uFF08Cmd/Ctrl+A \u9078\u4E2D\u3001Tab\u3001\u522A\u9664\u3001\u7C98\u8CBC\uFF09"
+ },
+ tabOut: {
+ name: "\u8DF3\u51FA\u4EE3\u78BC\u584A",
+ desc: "Tab \u8DF3\u51FA\u884C\u5167\u4EE3\u78BC\u584A\u6216\u914D\u5C0D\u7B26\u865F\u584A(\u9078\u4E2D\u6642)"
+ },
+ autoFormatting: {
+ name: "\u8F38\u5165\u6642\u81EA\u52D5\u683C\u5F0F\u5316",
+ desc: "\u662F\u5426\u5728\u7DE8\u8F2F\u6587\u6A94\u6642\u81EA\u52D5\u683C\u5F0F\u5316\u6587\u672C\uFF0C\u81EA\u52D5\u683C\u5F0F\u5316\u7684\u7E3D\u958B\u95DC"
+ },
+ spaceBetweenChineseEnglish: {
+ name: "\u4E2D\u6587\u8207\u82F1\u6587\u4E4B\u9593\u7684\u7A7A\u683C",
+ desc: "\u5728\u4E2D\u6587\u548C\u82F1\u6587\u4E4B\u9593\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u53D6\u6D88"
+ },
+ spaceBetweenChineseNumber: {
+ name: "\u4E2D\u6587\u8207\u6578\u5B57\u4E4B\u9593\u7684\u7A7A\u683C",
+ desc: "\u5728\u4E2D\u6587\u548C\u6578\u5B57\u4E4B\u9593\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u53D6\u6D88"
+ },
+ spaceBetweenEnglishNumber: {
+ name: "\u82F1\u6587\u8207\u6578\u5B57\u4E4B\u9593\u7684\u7A7A\u683C",
+ desc: "\u5728\u82F1\u6587\u548C\u6578\u5B57\u4E4B\u9593\u63D2\u5165\u7A7A\u683C\uFF0C\u53EF\u53D6\u6D88"
+ },
+ deleteSpaceBetweenChinese: {
+ name: "\u522A\u9664\u4E2D\u6587\u5B57\u7B26\u9593\u7684\u7A7A\u683C",
+ desc: "\u53BB\u9664\u4E2D\u6587\u5B57\u7B26\u4E4B\u9593\u7684\u7A7A\u683C\uFF0C\u4E0D\u53EF\u53D6\u6D88"
+ },
+ capitalizeFirstLetter: {
+ name: "\u53E5\u9996\u5B57\u6BCD\u5927\u5BEB",
+ desc: "\u82F1\u6587\u6BCF\u500B\u53E5\u9996\u5B57\u6BCD\u5927\u5BEB\uFF0C\u53EF\u53D6\u6D88"
+ },
+ smartInsertSpace: {
+ name: "\u667A\u80FD\u63D2\u5165\u7A7A\u683C",
+ desc: "\u5728\u6587\u672C\u548C\u6A19\u9EDE\u4E4B\u9593\u667A\u80FD\u63D2\u5165\u7A7A\u683C"
+ },
+ spaceStrategyInlineCode: {
+ name: "\u884C\u5167\u4EE3\u78BC\u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565",
+ desc: "\u7121\u8981\u6C42\uFF1A\u5C0D\u672C\u985E\u5225\u584A\u8207\u5DE6\u53F3\u6587\u672C\u6C92\u6709\u7A7A\u683C\u7684\u8981\u6C42\uFF0C\u8EDF\u7A7A\u683C\uFF1A\u5C0D\u672C\u985E\u5225\u584A\u8207\u5468\u570D\u5340\u584A\u53EA\u8981\u6C42\u6709\u8EDF\u7A7A\u683C\uFF0C\u8EDF\u7A7A\u683C\u5982\u7576\u524D\u584A\u5DE6\u908A\u7684\u81E8\u8FD1\u6587\u672C\u70BA\u3002\uFF0C\uFF1B\uFF1F\u7B49\u5168\u89D2\u6A19\u9EDE\uFF0C\u7576\u524D\u584A\u53F3\u908A\u7684\u81E8\u8FD1\u6587\u672C\u70BA\u6240\u6709\u5168\u534A\u89D2\u6A19\u9EDE\uFF0C\u56B4\u683C\u7A7A\u683C\uFF1A\u7576\u524D\u584A\u8207\u81E8\u8FD1\u6587\u672C\u4E4B\u9593\u56B4\u683C\u6DFB\u52A0\u7A7A\u683C\u3002"
+ },
+ spaceStrategyInlineFormula: {
+ name: "\u884C\u5167\u516C\u5F0F\u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565",
+ desc: "\u5B9A\u7FA9\u884C\u5167\u516C\u5F0F\u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565"
+ },
+ spaceStrategyLinkText: {
+ name: "\u9023\u7D50\u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565",
+ desc: "\u5B9A\u7FA9 [[wikilink]] [mdlink](...) \u548C\u6587\u672C\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565"
+ },
+ userDefinedRegexpSwitch: {
+ name: "\u7528\u6236\u5B9A\u7FA9\u7684\u6B63\u5247\u8868\u9054\u5F0F\u958B\u95DC",
+ desc: "\u81EA\u5B9A\u7FA9\u6B63\u5247\u8868\u9054\u5F0F\u958B\u95DC\uFF0C\u5339\u914D\u5230\u7684\u5167\u5BB9\u4E0D\u9032\u884C\u683C\u5F0F\u5316\uFF0C\u4E14\u53EF\u4EE5\u8A2D\u7F6E\u5339\u914D\u5230\u7684\u5167\u5BB9\u584A\u8207\u5176\u4ED6\u5167\u5BB9\u4E4B\u9593\u7684\u7A7A\u683C\u7B56\u7565"
+ },
+ userDefinedRegexp: {
+ name: "\u7528\u6236\u5B9A\u7FA9\u7684\u6B63\u5247\u8868\u9054\u5F0F",
+ desc: "\u7528\u6236\u81EA\u5B9A\u7FA9\u6B63\u5247\u8868\u9054\u5F0F\uFF0C\u5339\u914D\u5230\u7684\u5167\u5BB9\u4E0D\u9032\u884C\u683C\u5F0F\u5316\uFF0C\u6BCF\u884C\u4E00\u500B\u8868\u9054\u5F0F\uFF0C\u884C\u5C3E\u4E0D\u8981\u96A8\u610F\u52A0\u7A7A\u683C\u3002\u6BCF\u884C\u672B\u5C3E3\u500B\u5B57\u7B26\u7684\u56FA\u5B9A\u70BA|\u548C\u5169\u500B\u7A7A\u683C\u7B56\u7565\u7B26\u865F\uFF0C\u7A7A\u683C\u7B56\u7565\u7B26\u865F\u70BA-=+\uFF0C\u5206\u5225\u4EE3\u8868\u4E0D\u8981\u6C42\u7A7A\u683C(-)\uFF0C\u8EDF\u7A7A\u683C(=)\uFF0C\u56B4\u683C\u7A7A\u683C(+)\u3002\u9019\u5169\u500B\u7A7A\u683C\u7B56\u7565\u7B26\u865F\u5206\u5225\u70BA\u5339\u914D\u5340\u584A\u7684\u5DE6\u53F3\u5169\u908A\u7684\u7A7A\u683C\u7B56\u7565"
+ },
+ excludeFoldersFiles: {
+ name: "\u6392\u9664\u6587\u4EF6\u593E/\u6587\u4EF6",
+ desc: "\u8A72\u63D2\u4EF6\u5C07\u6BCF\u884C\u89E3\u6790\u70BA\u4E00\u500B\u6392\u9664\u6587\u4EF6\u593E\u6216\u6587\u4EF6\u3002\u4F8B\u5982\uFF1ADailyNote/, DailyNote/WeekNotes/, DailyNote/test.md"
+ },
+ fixMacOSContextMenu: {
+ name: "\u4FEE\u5FA9 MacOS \u53F3\u9375\u83DC\u55AE\u5149\u6A19\u4F4D\u7F6E",
+ desc: "\u4FEE\u5FA9 MacOS \u9F20\u6A19\u53F3\u9375\u547C\u51FA\u83DC\u55AE\u6642\u5149\u6A19\u8DF3\u5230\u4E0B\u4E00\u884C\u7684\u554F\u984C (\u9700\u8981\u91CD\u555F Obsidian \u751F\u6548)"
+ },
+ fixMicrosoftIME: {
+ name: "\u4FEE\u5FA9\u5FAE\u8EDF\u8F38\u5165\u6CD5\u554F\u984C",
+ desc: "\u9069\u914D\u820A\u7248\u5FAE\u8EDF\u8F38\u5165\u6CD5"
+ },
+ strictLineBreaks: {
+ name: "\u56B4\u683C\u63DB\u884C\u6A21\u5F0F\u4E0B\u6309\u5169\u6B21\u56DE\u8ECA",
+ desc: "\u56B4\u683C\u63DB\u884C\u7684\u8A2D\u7F6E\u4E0B\uFF0C\u5728\u666E\u901A\u6587\u672C\u884C\u9032\u884C\u4E00\u6B21\u56DE\u8ECA\u6703\u7522\u751F\u5169\u500B\u63DB\u884C\u7B26"
+ },
+ puncRectify: {
+ name: "\u6A19\u9EDE\u77EB\u6B63",
+ desc: "\u50C5\u5728\u8F38\u5165\u904E\u7A0B\u4E2D\uFF0C\u4E2D\u6587\u9593\u7684\u82F1\u6587\u6A19\u9EDE\uFF08,.?!\uFF09\u81EA\u52D5\u8F49\u63DB\u70BA\u5168\u89D2\uFF08\u53EF\u53D6\u6D88\uFF09"
+ },
+ printDebugInfo: {
+ name: "\u5728\u63A7\u5236\u53F0\u8F38\u51FA\u8ABF\u8A66\u8CC7\u8A0A",
+ desc: "\u5728\u63A7\u5236\u53F0\u8F38\u51FA\u8ABF\u8A66\u8CC7\u8A0A"
+ },
+ selectionReplaceRule: {
+ name: "\u9078\u4E2D\u66FF\u63DB\u898F\u5247",
+ desc: "\u7528\u6236\u5B9A\u7FA9\u7684\u9078\u4E2D\u66FF\u63DB\u898F\u5247"
+ },
+ deleteRule: {
+ name: "\u522A\u9664\u898F\u5247",
+ desc: "\u898F\u5247\uFF1A\u7528 | \u4EE3\u8868\u5149\u6A19\u4F4D\u7F6E\uFF0C\u5FC5\u9808\u5305\u542B\u5149\u6A19\u3002\u63D0\u793A\uFF1A\u4F7F\u7528 | \u8868\u793A\u5149\u6A19\u4F4D\u7F6E\u3002"
+ },
+ convertRule: {
+ name: "\u8F49\u63DB\u898F\u5247",
+ desc: "\u898F\u5247\uFF1A\u7528 | \u4EE3\u8868\u5149\u6A19\u4F4D\u7F6E\uFF0C\u5FC5\u9808\u5305\u542B\u5149\u6A19\u3002\u63D0\u793A\uFF1A\u4F7F\u7528 | \u8868\u793A\u5149\u6A19\u4F4D\u7F6E\u3002"
+ },
+ trigger: {
+ name: "\u89F8\u767C\u5668"
+ },
+ left: {
+ name: "\u5DE6"
+ },
+ right: {
+ name: "\u53F3"
+ },
+ oldPattern: {
+ name: "\u820A\u6A21\u5F0F"
+ },
+ newPattern: {
+ name: "\u65B0\u6A21\u5F0F"
+ }
+ },
+ headers: {
+ main: "Obsidian EasyTyping \u63D2\u4EF6",
+ githubDetail: "\u8A73\u60C5\u898B Github\uFF1A",
+ enhancedEditing: "\u589E\u5F37\u7DE8\u8F2F\u8A2D\u7F6E",
+ customizeEditRule: "\u81EA\u5B9A\u7FA9\u7DE8\u8F2F\u8F49\u63DB\u898F\u5247",
+ autoformatSetting: "\u81EA\u52D5\u683C\u5F0F\u5316\u8A2D\u7F6E",
+ detailedSetting: "\u8A73\u7D30\u8A2D\u7F6E\u5982\u4E0B",
+ customRegexpBlock: "\u81EA\u5B9A\u7FA9\u6B63\u5247\u5340\u584A",
+ excludeFoldersFiles: "\u6307\u5B9A\u6587\u4EF6\u4E0D\u81EA\u52D5\u683C\u5F0F\u5316",
+ experimentalFeatures: "\u5BE6\u9A57\u529F\u80FD",
+ aboutRegexp: {
+ header: "\u6B63\u5247\u8868\u9054\u5F0F\u76F8\u95DC\u77E5\u8B58\uFF0C\u898B ",
+ text: "\u300A\u962E\u4E00\u5CF0\uFF1A\u6B63\u5247\u8868\u9054\u5F0F\u7C21\u660E\u6559\u7A0B\u300B"
+ },
+ instructionsRegexp: {
+ header: "\u6B63\u5247\u8868\u9054\u5F0F\u898F\u5247\u4F7F\u7528\u8AAA\u660E\u8207\u793A\u4F8B\uFF1A ",
+ text: "\u81EA\u5B9A\u7FA9\u6B63\u5247\u8868\u9054\u5F0F\u898F\u5247"
+ },
+ customizeSelectionRule: "\u81EA\u5B9A\u7FA9\u9078\u4E2D\u6587\u672C\u7DE8\u8F2F\u589E\u5F3A\u898F\u5247",
+ customizeDeleteRule: "\u81EA\u5B9A\u7FA9\u522A\u9664\u7DE8\u8F2F\u589E\u5F3A\u898F\u5247",
+ customizeConvertRule: "\u81EA\u5B9A\u7FA9\u7DE8\u8F2F\u8F49\u63DB\u898F\u5247",
+ editSelectionReplaceRule: "\u7DE8\u8F2F\u9078\u4E2D\u66FF\u63DB\u898F\u5247"
+ },
+ dropdownOptions: {
+ onlyWhenTyping: "\u8F38\u5165\u6642\u751F\u6548",
+ globally: "\u5168\u5C40\u751F\u6548",
+ noRequire: "\u7121\u8981\u6C42",
+ softSpace: "\u8EDF\u7A7A\u683C",
+ strictSpace: "\u56B4\u683C\u7A7A\u683C",
+ dummy: "\u5446\u7A7A\u683C",
+ smart: "\u667A\u80FD\u7A7A\u683C"
+ },
+ toolTip: {
+ switch: "\u529F\u80FD\u958B\u95DC",
+ editRule: "\u7DE8\u8F2F\u898F\u5247",
+ removeRule: "\u522A\u9664\u898F\u5247",
+ addRule: "\u6DFB\u52A0\u898F\u5247"
+ },
+ placeHolder: {
+ triggerSymbol: "\u89F8\u767C\u7B26",
+ newLeftSideString: "\u5DE6\u908A\u7B26\u865F",
+ newRightSideString: "\u53F3\u908A\u7B26\u865F",
+ addRule: "\u6DFB\u52A0\u898F\u5247",
+ noticeInvaidTrigger: "\u7121\u6548\u7684\u89F8\u767C\u7B26, \u89F8\u767C\u7B26\u5FC5\u9808\u662F\u55AE\u5B57\u7B26\u6216\u8005\u662F \u2014\u2014\u3001\u2026\u2026",
+ noticeWarnTriggerExists: "\u7121\u6548\u898F\u5247! \u89F8\u767C\u7B26 %s \u5DF2\u5B58\u5728",
+ noticeMissingInput: "missing input",
+ beforeDelete: "\u522A\u9664\u524D|",
+ newPattern: "\u89F8\u767C\u898F\u5247\u5F8C\u5B57\u4E32\u6A21\u5F0F",
+ noticeInvaidTriggerPatternContainSymbol: "\u7121\u6548\u898F\u5247, \u8F49\u63DB\u524D\u6A21\u5F0F\u5FC5\u9808\u5305\u542B\u4EE3\u8868\u5149\u6A19\u4F4D\u7F6E\u7684\u7B26\u865F |",
+ beforeConvert: "\u8F49\u63DB\u524D|",
+ noticeInvalidPatternString: "Invalid pattern string!"
+ },
+ button: {
+ update: "\u66F4\u65B0"
+ }
+};
+var zh_TW_default = locale4;
+
+// src/settings.ts
+var import_sprintf_js = __toESM(require_sprintf());
+var DEFAULT_SETTINGS = {
+ Tabout: true,
+ SelectionEnhance: true,
+ IntrinsicSymbolPairs: true,
+ BaseObEditEnhance: true,
+ FW2HWEnhance: true,
+ BetterCodeEdit: true,
+ AutoFormat: true,
+ ExcludeFiles: "",
+ ChineseEnglishSpace: true,
+ ChineseNumberSpace: true,
+ EnglishNumberSpace: true,
+ ChineseNoSpace: true,
+ PunctuationSpace: true,
+ AutoCapital: true,
+ AutoCapitalMode: "typing" /* OnlyWhenTyping */,
+ PunctuationSpaceMode: "typing" /* OnlyWhenTyping */,
+ InlineCodeSpaceMode: 1 /* soft */,
+ InlineFormulaSpaceMode: 1 /* soft */,
+ InlineLinkSpaceMode: 1 /* soft */,
+ InlineLinkSmartSpace: true,
+ UserDefinedRegSwitch: true,
+ UserDefinedRegExp: "{{.*?}}|++\n<.*?>|--\n\\[\\!.*?\\][-+]{0,1}|-+\n(file:///|https?://|ftp://|obsidian://|zotero://|www.)[^\\s\uFF08\uFF09\u300A\u300B\u3002,\uFF0C\uFF01\uFF1F;\uFF1B\uFF1A\u201C\u201D\u2018\u2019\\)\\(\\[\\]\\{\\}']+|--\n\n[a-zA-Z0-9_\\-.]+@[a-zA-Z0-9_\\-.]+|++\n(? {
+ toggle.setValue(this.plugin.settings.IntrinsicSymbolPairs).onChange(async (value) => {
+ this.plugin.settings.IntrinsicSymbolPairs = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.selectionReplace.name).setDesc(locale5.settings.selectionReplace.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.SelectionEnhance).onChange(async (value) => {
+ this.plugin.settings.SelectionEnhance = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.fullWidthToHalfWidth.name).setDesc(locale5.settings.fullWidthToHalfWidth.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.FW2HWEnhance).onChange(async (value) => {
+ this.plugin.settings.FW2HWEnhance = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.basicInputEnhance.name).setDesc(locale5.settings.basicInputEnhance.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.BaseObEditEnhance).onChange(async (value) => {
+ this.plugin.settings.BaseObEditEnhance = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.codeblockEdit.name).setDesc(locale5.settings.codeblockEdit.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.BetterCodeEdit).onChange(async (value) => {
+ this.plugin.settings.BetterCodeEdit = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.tabOut.name).setDesc(locale5.settings.tabOut.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.Tabout).onChange(async (value) => {
+ this.plugin.settings.Tabout = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ containerEl.createEl("h2", { text: locale5.headers.customizeEditRule });
+ this.buildUserSelRepRuleSetting(this.containerEl.createEl("details", {
+ cls: "easytyping-nested-settings",
+ attr: {
+ ...this.plugin.settings.userSelRuleSettingsOpen ? { open: true } : {}
+ }
+ }));
+ this.buildUserDeleteRuleSetting(this.containerEl.createEl("details", {
+ cls: "easytyping-nested-settings",
+ attr: {
+ ...this.plugin.settings.userDelRuleSettingsOpen ? { open: true } : {}
+ }
+ }));
+ this.buildUserConvertRuleSetting(this.containerEl.createEl("details", {
+ cls: "easytyping-nested-settings",
+ attr: {
+ ...this.plugin.settings.userCvtRuleSettingsOpen ? { open: true } : {}
+ }
+ }));
+ containerEl.createEl("h2", { text: locale5.headers.autoformatSetting });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.autoFormatting.name).setDesc(locale5.settings.autoFormatting.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.AutoFormat).onChange(async (value) => {
+ this.plugin.settings.AutoFormat = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ containerEl.createEl("p", { text: locale5.headers.detailedSetting });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceBetweenChineseEnglish.name).setDesc(locale5.settings.spaceBetweenChineseEnglish.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.ChineseEnglishSpace).onChange(async (value) => {
+ this.plugin.settings.ChineseEnglishSpace = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceBetweenChineseNumber.name).setDesc(locale5.settings.spaceBetweenChineseNumber.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.ChineseNumberSpace).onChange(async (value) => {
+ this.plugin.settings.ChineseNumberSpace = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceBetweenEnglishNumber.name).setDesc(locale5.settings.spaceBetweenEnglishNumber.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.EnglishNumberSpace).onChange(async (value) => {
+ this.plugin.settings.EnglishNumberSpace = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.deleteSpaceBetweenChinese.name).setDesc(locale5.settings.deleteSpaceBetweenChinese.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.ChineseNoSpace).onChange(async (value) => {
+ this.plugin.settings.ChineseNoSpace = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.capitalizeFirstLetter.name).setDesc(locale5.settings.capitalizeFirstLetter.desc).addDropdown((dropdown) => {
+ dropdown.addOption("typing" /* OnlyWhenTyping */, locale5.dropdownOptions.onlyWhenTyping);
+ dropdown.addOption("global" /* Globally */, locale5.dropdownOptions.globally);
+ dropdown.setValue(this.plugin.settings.AutoCapitalMode);
+ dropdown.onChange(async (v) => {
+ this.plugin.settings.AutoCapitalMode = v;
+ await this.plugin.saveSettings();
+ });
+ }).addToggle((toggle) => {
+ toggle.setTooltip(locale5.toolTip.switch);
+ toggle.setValue(this.plugin.settings.AutoCapital).onChange(async (value) => {
+ this.plugin.settings.AutoCapital = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.smartInsertSpace.name).setDesc(locale5.settings.smartInsertSpace.desc).addDropdown((dropdown) => {
+ dropdown.addOption("typing" /* OnlyWhenTyping */, locale5.dropdownOptions.onlyWhenTyping);
+ dropdown.addOption("global" /* Globally */, locale5.dropdownOptions.globally);
+ dropdown.setValue(this.plugin.settings.PunctuationSpaceMode);
+ dropdown.onChange(async (v) => {
+ this.plugin.settings.PunctuationSpaceMode = v;
+ await this.plugin.saveSettings();
+ });
+ }).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.PunctuationSpace).onChange(async (value) => {
+ this.plugin.settings.PunctuationSpace = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceStrategyInlineCode.name).setDesc(locale5.settings.spaceStrategyInlineCode.desc).addDropdown((dropdown) => {
+ dropdown.addOption(String(0 /* none */), locale5.dropdownOptions.noRequire);
+ dropdown.addOption(String(1 /* soft */), locale5.dropdownOptions.softSpace);
+ dropdown.addOption(String(2 /* strict */), locale5.dropdownOptions.strictSpace);
+ dropdown.setValue(String(this.plugin.settings.InlineCodeSpaceMode));
+ dropdown.onChange(async (v) => {
+ this.plugin.settings.InlineCodeSpaceMode = string2SpaceState(v);
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceStrategyInlineFormula.name).setDesc(locale5.settings.spaceStrategyInlineFormula.desc).addDropdown((dropdown) => {
+ dropdown.addOption(String(0 /* none */), locale5.dropdownOptions.noRequire);
+ dropdown.addOption(String(1 /* soft */), locale5.dropdownOptions.softSpace);
+ dropdown.addOption(String(2 /* strict */), locale5.dropdownOptions.strictSpace);
+ dropdown.setValue(String(this.plugin.settings.InlineFormulaSpaceMode));
+ dropdown.onChange(async (v) => {
+ this.plugin.settings.InlineFormulaSpaceMode = string2SpaceState(v);
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.spaceStrategyLinkText.name).setDesc(locale5.settings.spaceStrategyLinkText.desc).addDropdown((dropdown) => {
+ dropdown.addOption("dummy", locale5.dropdownOptions.dummy);
+ dropdown.addOption("smart", locale5.dropdownOptions.smart);
+ dropdown.setValue(this.plugin.settings.InlineLinkSmartSpace ? "smart" : "dummy");
+ dropdown.onChange(async (v) => {
+ this.plugin.settings.InlineLinkSmartSpace = v == "smart" ? true : false;
+ await this.plugin.saveSettings();
+ });
+ }).addDropdown((dropdown) => {
+ dropdown.addOption(String(0 /* none */), locale5.dropdownOptions.noRequire);
+ dropdown.addOption(String(1 /* soft */), locale5.dropdownOptions.softSpace);
+ dropdown.addOption(String(2 /* strict */), locale5.dropdownOptions.strictSpace);
+ dropdown.setValue(String(this.plugin.settings.InlineLinkSpaceMode));
+ dropdown.onChange(async (v) => {
+ this.plugin.settings.InlineLinkSpaceMode = string2SpaceState(v);
+ await this.plugin.saveSettings();
+ });
+ });
+ containerEl.createEl("h2", { text: locale5.headers.customRegexpBlock });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.userDefinedRegexpSwitch.name).setDesc(locale5.settings.userDefinedRegexpSwitch.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.UserDefinedRegSwitch).onChange(async (value) => {
+ this.plugin.settings.UserDefinedRegSwitch = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ containerEl.createEl("p", { text: locale5.headers.aboutRegexp.header }).createEl("a", {
+ text: locale5.headers.aboutRegexp.text,
+ href: "https://javascript.ruanyifeng.com/stdlib/regexp.html#"
+ });
+ containerEl.createEl("p", { text: locale5.headers.instructionsRegexp.header }).createEl("a", {
+ text: locale5.headers.instructionsRegexp.text,
+ href: "https://github.com/Yaozhuwa/easy-typing-obsidian/blob/master/UserDefinedRegExp.md"
+ });
+ const regContentAreaSetting = new import_obsidian2.Setting(containerEl);
+ regContentAreaSetting.settingEl.setAttribute("style", "display: grid; grid-template-columns: 1fr;");
+ regContentAreaSetting.setName(locale5.settings.userDefinedRegexp.name).setDesc(locale5.settings.userDefinedRegexp.desc);
+ const regContentArea = new import_obsidian2.TextAreaComponent(regContentAreaSetting.controlEl);
+ setAttributes(regContentArea.inputEl, {
+ style: "margin-top: 12px; width: 100%; height: 30vh;"
+ });
+ regContentArea.setValue(this.plugin.settings.UserDefinedRegExp).onChange(async (value) => {
+ this.plugin.settings.UserDefinedRegExp = value;
+ this.plugin.saveSettings();
+ });
+ containerEl.createEl("h2", { text: locale5.headers.excludeFoldersFiles });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.excludeFoldersFiles.name).setDesc(locale5.settings.excludeFoldersFiles.desc).addTextArea((text) => text.setValue(this.plugin.settings.ExcludeFiles).onChange(async (value) => {
+ this.plugin.settings.ExcludeFiles = value;
+ this.plugin.saveSettings();
+ }));
+ containerEl.createEl("h2", { text: locale5.headers.experimentalFeatures });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.fixMacOSContextMenu.name).setDesc(locale5.settings.fixMacOSContextMenu.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.FixMacOSContextMenu).onChange(async (value) => {
+ this.plugin.settings.FixMacOSContextMenu = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.fixMicrosoftIME.name).setDesc(locale5.settings.fixMicrosoftIME.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.TryFixMSIME).onChange(async (value) => {
+ this.plugin.settings.TryFixMSIME = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.strictLineBreaks.name).setDesc(locale5.settings.strictLineBreaks.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.EnterTwice).onChange(async (value) => {
+ this.plugin.settings.EnterTwice = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.puncRectify.name).setDesc(locale5.settings.puncRectify.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.PuncRectify).onChange(async (value) => {
+ this.plugin.settings.PuncRectify = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ new import_obsidian2.Setting(containerEl).setName(locale5.settings.printDebugInfo.name).setDesc(locale5.settings.printDebugInfo.desc).addToggle((toggle) => {
+ toggle.setValue(this.plugin.settings.debug).onChange(async (value) => {
+ this.plugin.settings.debug = value;
+ await this.plugin.saveSettings();
+ });
+ });
+ }
+ buildUserSelRepRuleSetting(containerEl) {
+ containerEl.empty();
+ containerEl.ontoggle = async () => {
+ this.plugin.settings.userSelRuleSettingsOpen = containerEl.open;
+ await this.plugin.saveSettings();
+ };
+ const summary = containerEl.createEl("summary", { cls: "easytyping-nested-settings" });
+ summary.setText(locale5.headers.customizeSelectionRule);
+ const selectionRuleSetting = new import_obsidian2.Setting(containerEl);
+ selectionRuleSetting.setName(locale5.settings.selectionReplaceRule.name);
+ const replaceRuleTrigger = new import_obsidian2.TextComponent(selectionRuleSetting.controlEl);
+ replaceRuleTrigger.setPlaceholder(locale5.placeHolder.triggerSymbol);
+ const replaceLeftString = new import_obsidian2.TextComponent(selectionRuleSetting.controlEl);
+ replaceLeftString.setPlaceholder(locale5.placeHolder.newLeftSideString);
+ const replaceRightString = new import_obsidian2.TextComponent(selectionRuleSetting.controlEl);
+ replaceRightString.setPlaceholder(locale5.placeHolder.newRightSideString);
+ selectionRuleSetting.addButton((button) => {
+ button.setButtonText("+").setTooltip(locale5.placeHolder.addRule).onClick(async (buttonEl) => {
+ let trigger = replaceRuleTrigger.inputEl.value;
+ let left = replaceLeftString.inputEl.value;
+ let right = replaceRightString.inputEl.value;
+ if (trigger && (left || right)) {
+ if (trigger.length != 1 && trigger != "\u2014\u2014" && trigger != "\u2026\u2026") {
+ new import_obsidian2.Notice(locale5.placeHolder.noticeInvaidTrigger);
+ return;
+ }
+ if (this.plugin.addUserSelectionRepRule(trigger, left, right)) {
+ await this.plugin.saveSettings();
+ this.display();
+ } else {
+ new import_obsidian2.Notice((0, import_sprintf_js.sprintf)(locale5.placeHolder.noticeWarnTriggerExists, trigger));
+ }
+ } else {
+ new import_obsidian2.Notice(locale5.placeHolder.noticeMissingInput);
+ }
+ });
+ });
+ for (let i = 0; i < this.plugin.settings.userSelRepRuleTrigger.length; i++) {
+ let trigger = this.plugin.settings.userSelRepRuleTrigger[i];
+ let left_s = this.plugin.settings.userSelRepRuleValue[i].left;
+ let right_s = this.plugin.settings.userSelRepRuleValue[i].right;
+ let showStr = "Trigger: " + trigger + " \u2192 " + showString(left_s) + "selected" + showString(right_s);
+ new import_obsidian2.Setting(containerEl).setName(showStr).addExtraButton((button) => {
+ button.setIcon("gear").setTooltip(locale5.toolTip.editRule).onClick(() => {
+ new SelectRuleEditModal(this.app, trigger, left_s, right_s, async (new_left, new_right) => {
+ this.plugin.updateUserSelectionRepRule(i, new_left, new_right);
+ await this.plugin.saveSettings();
+ this.display();
+ }).open();
+ });
+ }).addExtraButton((button) => {
+ button.setIcon("trash").setTooltip(locale5.toolTip.removeRule).onClick(async () => {
+ this.plugin.deleteUserSelectionRepRule(i);
+ await this.plugin.saveSettings();
+ this.display();
+ });
+ });
+ }
+ }
+ buildUserDeleteRuleSetting(containerEl) {
+ containerEl.empty();
+ containerEl.ontoggle = async () => {
+ this.plugin.settings.userDelRuleSettingsOpen = containerEl.open;
+ await this.plugin.saveSettings();
+ };
+ const summary = containerEl.createEl("summary", { cls: "easytyping-nested-settings" });
+ summary.setText(locale5.headers.customizeDeleteRule);
+ const deleteRuleSetting = new import_obsidian2.Setting(containerEl);
+ deleteRuleSetting.setName(locale5.settings.deleteRule.name).setDesc(locale5.settings.deleteRule.desc);
+ const patternBefore = new import_obsidian2.TextAreaComponent(deleteRuleSetting.controlEl);
+ patternBefore.setPlaceholder(locale5.placeHolder.beforeDelete);
+ const patternAfter = new import_obsidian2.TextAreaComponent(deleteRuleSetting.controlEl);
+ patternAfter.setPlaceholder(locale5.placeHolder.newPattern);
+ deleteRuleSetting.addButton((button) => {
+ button.setButtonText("+").setTooltip(locale5.toolTip.addRule).onClick(async (buttonEl) => {
+ let before = patternBefore.inputEl.value;
+ let after = patternAfter.inputEl.value;
+ if (before && after) {
+ if (findFirstPipeNotPrecededByBackslash(before) == -1) {
+ new import_obsidian2.Notice(locale5.placeHolder.noticeInvaidTriggerPatternContainSymbol);
+ return;
+ } else {
+ this.plugin.addUserDeleteRule(before, after);
+ await this.plugin.saveSettings();
+ this.display();
+ }
+ } else {
+ new import_obsidian2.Notice(locale5.placeHolder.noticeMissingInput);
+ }
+ });
+ });
+ for (let i = 0; i < this.plugin.settings.userDeleteRulesStrList.length; i++) {
+ let before = this.plugin.settings.userDeleteRulesStrList[i][0];
+ let after = this.plugin.settings.userDeleteRulesStrList[i][1];
+ let showStr = '"' + showString(before) + '" delete.backwards \u2192 "' + showString(after) + '"';
+ new import_obsidian2.Setting(containerEl).setName(showStr).addExtraButton((button) => {
+ button.setIcon("gear").setTooltip(locale5.toolTip.editRule).onClick(() => {
+ new EditConvertRuleModal(this.app, "Delete Rule" /* delete */, before, after, async (new_before, new_after) => {
+ this.plugin.updateUserDeleteRule(i, new_before, new_after);
+ await this.plugin.saveSettings();
+ this.display();
+ }).open();
+ });
+ }).addExtraButton((button) => {
+ button.setIcon("trash").setTooltip(locale5.toolTip.removeRule).onClick(async () => {
+ this.plugin.deleteUserDeleteRule(i);
+ await this.plugin.saveSettings();
+ this.display();
+ });
+ });
+ }
+ }
+ buildUserConvertRuleSetting(containerEl) {
+ containerEl.empty();
+ containerEl.ontoggle = async () => {
+ this.plugin.settings.userCvtRuleSettingsOpen = containerEl.open;
+ await this.plugin.saveSettings();
+ };
+ const summary = containerEl.createEl("summary", { cls: "easytyping-nested-settings" });
+ summary.setText(locale5.headers.customizeConvertRule);
+ const convertRuleSetting = new import_obsidian2.Setting(containerEl);
+ convertRuleSetting.setName(locale5.settings.convertRule.name).setDesc(locale5.settings.convertRule.desc);
+ const patternBefore = new import_obsidian2.TextAreaComponent(convertRuleSetting.controlEl);
+ patternBefore.setPlaceholder(locale5.placeHolder.beforeConvert);
+ const patternAfter = new import_obsidian2.TextAreaComponent(convertRuleSetting.controlEl);
+ patternAfter.setPlaceholder(locale5.placeHolder.newPattern);
+ convertRuleSetting.addButton((button) => {
+ button.setButtonText("+").setTooltip(locale5.toolTip.addRule).onClick(async (buttonEl) => {
+ let before = patternBefore.inputEl.value;
+ let after = patternAfter.inputEl.value;
+ if (before && after) {
+ if (findFirstPipeNotPrecededByBackslash(before) == -1) {
+ new import_obsidian2.Notice(locale5.placeHolder.noticeInvaidTriggerPatternContainSymbol);
+ return;
+ } else {
+ this.plugin.addUserConvertRule(before, after);
+ await this.plugin.saveSettings();
+ this.display();
+ }
+ } else {
+ new import_obsidian2.Notice(locale5.placeHolder.noticeMissingInput);
+ }
+ });
+ });
+ for (let i = 0; i < this.plugin.settings.userConvertRulesStrList.length; i++) {
+ let before = this.plugin.settings.userConvertRulesStrList[i][0];
+ let after = this.plugin.settings.userConvertRulesStrList[i][1];
+ let showStr = '"' + showString(before) + '" auto convert to "' + showString(after) + '"';
+ new import_obsidian2.Setting(containerEl).setName(showStr).addExtraButton((button) => {
+ button.setIcon("gear").setTooltip(locale5.toolTip.editRule).onClick(() => {
+ new EditConvertRuleModal(this.app, "Convert Rule" /* convert */, before, after, async (new_before, new_after) => {
+ this.plugin.updateUserConvertRule(i, new_before, new_after);
+ await this.plugin.saveSettings();
+ this.display();
+ }).open();
+ });
+ }).addExtraButton((button) => {
+ button.setIcon("trash").setTooltip(locale5.toolTip.removeRule).onClick(async () => {
+ this.plugin.deleteUserConvertRule(i);
+ await this.plugin.saveSettings();
+ this.display();
+ });
+ });
+ }
+ }
+};
+function setAttributes(element, attributes) {
+ for (let key in attributes) {
+ element.setAttribute(key, attributes[key]);
+ }
+}
+var SelectRuleEditModal = class extends import_obsidian2.Modal {
+ constructor(app, trigger, left, right, onSubmit) {
+ super(app);
+ this.trigger = trigger;
+ this.old_left = left;
+ this.old_right = right;
+ this.new_left = left;
+ this.new_right = right;
+ this.onSubmit = onSubmit;
+ }
+ onOpen() {
+ const { contentEl } = this;
+ contentEl.createEl("h1", { text: locale5.headers.editSelectionReplaceRule });
+ new import_obsidian2.Setting(contentEl).setName(locale5.settings.trigger.name).addText((text) => {
+ text.setValue(this.trigger);
+ text.setDisabled(true);
+ });
+ new import_obsidian2.Setting(contentEl).setName(locale5.settings.left.name).addTextArea((text) => {
+ text.setValue(this.old_left);
+ text.onChange((value) => {
+ this.new_left = value;
+ });
+ });
+ new import_obsidian2.Setting(contentEl).setName(locale5.settings.right.name).addTextArea((text) => {
+ text.setValue(this.old_right);
+ text.onChange((value) => {
+ this.new_right = value;
+ });
+ });
+ new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText(locale5.button.update).setCta().onClick(() => {
+ this.close();
+ this.onSubmit(this.new_left, this.new_right);
+ }));
+ }
+ onClose() {
+ let { contentEl } = this;
+ contentEl.empty();
+ }
+};
+var EditConvertRuleModal = class extends import_obsidian2.Modal {
+ constructor(app, type, before, after, onSubmit) {
+ super(app);
+ this.type = type;
+ this.old_before = before;
+ this.old_after = after;
+ this.new_before = before;
+ this.new_after = after;
+ this.onSubmit = onSubmit;
+ }
+ onOpen() {
+ const { contentEl } = this;
+ contentEl.createEl("h1", { text: "Edit " + this.type });
+ new import_obsidian2.Setting(contentEl).setName(locale5.settings.oldPattern.name).addTextArea((text) => {
+ text.setValue(this.old_before);
+ text.onChange((value) => {
+ this.new_before = value;
+ });
+ });
+ new import_obsidian2.Setting(contentEl).setName(locale5.settings.newPattern.name).addTextArea((text) => {
+ text.setValue(this.old_after);
+ text.onChange((value) => {
+ this.new_after = value;
+ });
+ });
+ new import_obsidian2.Setting(contentEl).addButton((btn) => btn.setButtonText(locale5.button.update).setCta().onClick(() => {
+ if (this.checkConvertPatternString(this.new_before, this.new_after)) {
+ this.close();
+ this.onSubmit(this.new_before, this.new_after);
+ } else {
+ new import_obsidian2.Notice(locale5.placeHolder.noticeInvalidPatternString);
+ }
+ }));
+ }
+ checkConvertPatternString(before, after) {
+ if (findFirstPipeNotPrecededByBackslash(before) == -1)
+ return false;
+ return true;
+ }
+ onClose() {
+ let { contentEl } = this;
+ contentEl.empty();
+ }
+};
+
+// src/main.ts
+var import_view3 = require("@codemirror/view");
+var import_language3 = require("@codemirror/language");
+
+// src/syntax.ts
+var import_language2 = require("@codemirror/language");
+function isCodeBlockInPos(state, pos) {
+ let codeBlockInfos = getCodeBlocksInfos(state);
+ for (let i = 0; i < codeBlockInfos.length; i++) {
+ if (pos >= codeBlockInfos[i].start_pos && pos <= codeBlockInfos[i].end_pos) {
+ return true;
+ }
+ }
+ return false;
+}
+function selectCodeBlockInPos(view, pos) {
+ let codeBlockInfos = getCodeBlocksInfos(view.state);
+ for (let i = 0; i < codeBlockInfos.length; i++) {
+ if (pos >= codeBlockInfos[i].start_pos && pos <= codeBlockInfos[i].end_pos) {
+ view.dispatch({
+ selection: {
+ anchor: codeBlockInfos[i].code_start_pos,
+ head: codeBlockInfos[i].code_end_pos
+ }
+ });
+ return true;
+ }
+ }
+ return false;
+}
+function getCodeBlocksInfos(state) {
+ let isCodeBlockBegin = false;
+ let codeBlockInfos = [];
+ let curCodeBlockInfo = null;
+ const doc = state.doc;
+ (0, import_language2.syntaxTree)(state).iterate({
+ enter(node) {
+ const nodeName = node.name;
+ const nodeFrom = node.from;
+ const nodeTo = node.to;
+ const nodeText = state.sliceDoc(nodeFrom, nodeTo);
+ if (nodeName.includes("codeblock-begin")) {
+ isCodeBlockBegin = true;
+ let start_pos = nodeFrom + nodeText.indexOf("`");
+ let indent = start_pos - state.doc.lineAt(start_pos).from;
+ let language = nodeText.trim().substring(3);
+ curCodeBlockInfo = {
+ start_pos,
+ end_pos: -1,
+ code_start_pos: -1,
+ code_end_pos: -1,
+ language,
+ indent
+ };
+ } else if (nodeName.includes("codeblock-end")) {
+ isCodeBlockBegin = false;
+ if (curCodeBlockInfo != null) {
+ curCodeBlockInfo.end_pos = nodeTo;
+ if (doc.lineAt(curCodeBlockInfo.start_pos).number == doc.lineAt(curCodeBlockInfo.end_pos).number - 1) {
+ curCodeBlockInfo.code_start_pos = doc.lineAt(curCodeBlockInfo.start_pos).to;
+ curCodeBlockInfo.code_end_pos = doc.lineAt(curCodeBlockInfo.start_pos).to;
+ } else {
+ let code_start_line = doc.lineAt(curCodeBlockInfo.start_pos).number + 1;
+ let code_end_line = doc.lineAt(curCodeBlockInfo.end_pos).number - 1;
+ curCodeBlockInfo.code_start_pos = doc.line(code_start_line).from + curCodeBlockInfo.indent;
+ curCodeBlockInfo.code_end_pos = doc.line(code_end_line).to;
+ }
+ codeBlockInfos.push(curCodeBlockInfo);
+ curCodeBlockInfo = null;
+ }
+ }
+ }
+ });
+ if (isCodeBlockBegin && curCodeBlockInfo) {
+ curCodeBlockInfo.end_pos = doc.length;
+ curCodeBlockInfo.code_end_pos = doc.length;
+ if (doc.lines > doc.lineAt(curCodeBlockInfo.start_pos).number) {
+ let start_line = doc.lineAt(curCodeBlockInfo.start_pos).number + 1;
+ let code_start_pos = doc.line(start_line).from + curCodeBlockInfo.indent;
+ curCodeBlockInfo.code_start_pos = code_start_pos < doc.length ? code_start_pos : doc.lineAt(curCodeBlockInfo.start_pos + 1).from;
+ } else {
+ curCodeBlockInfo.code_start_pos = doc.lineAt(curCodeBlockInfo.start_pos).to;
+ }
+ codeBlockInfos.push(curCodeBlockInfo);
+ curCodeBlockInfo = null;
+ }
+ return codeBlockInfos;
+}
+
+// src/tabstops_state_field.ts
+var import_view = require("@codemirror/view");
+var import_state = require("@codemirror/state");
+var addTabstopsEffect = import_state.StateEffect.define();
+var removeTabstopEffect = import_state.StateEffect.define();
+var removeAllTabstopsEffect = import_state.StateEffect.define();
+var tabstopsStateField = import_state.StateField.define({
+ create() {
+ return [];
+ },
+ update(value, transaction) {
+ let tabstopGroups = value;
+ tabstopGroups.forEach((grp) => grp.map(transaction.changes));
+ for (const effect of transaction.effects) {
+ if (effect.is(addTabstopsEffect)) {
+ tabstopGroups = [];
+ tabstopGroups.unshift(...effect.value);
+ } else if (effect.is(removeTabstopEffect)) {
+ tabstopGroups.shift();
+ } else if (effect.is(removeAllTabstopsEffect)) {
+ tabstopGroups = [];
+ }
+ }
+ return tabstopGroups;
+ },
+ provide: (field) => {
+ return import_view.EditorView.decorations.of((view) => {
+ const tabstopGroups = view.state.field(field);
+ const decos = [];
+ if (tabstopGroups.length >= 2) {
+ decos.push(...tabstopGroups[1].getDecoRanges());
+ }
+ return import_view.Decoration.set(decos, true);
+ });
+ }
+});
+function getTabstopGroupsFromView(view) {
+ const currentTabstopGroups = view.state.field(tabstopsStateField);
+ return currentTabstopGroups;
+}
+function addTabstops(view, tabstopGroups) {
+ view.dispatch({
+ effects: [addTabstopsEffect.of(tabstopGroups)]
+ });
+}
+function removeTabstop(view) {
+ view.dispatch({
+ effects: [removeTabstopEffect.of(null)]
+ });
+}
+function removeAllTabstops(view) {
+ view.dispatch({
+ effects: [removeAllTabstopsEffect.of(null)]
+ });
+}
+function addTabstopsAndSelect(view, tabstopGroups) {
+ addTabstops(view, tabstopGroups);
+ tabstopGroups[0].select(view, false);
+}
+function tidyTabstops(view) {
+ const currentTabstopGroups = getTabstopGroupsFromView(view);
+ if (currentTabstopGroups.length === 1) {
+ removeAllTabstops(view);
+ }
+}
+function isInsideCurTabstop(view) {
+ const currentTabstopGroups = getTabstopGroupsFromView(view);
+ if (currentTabstopGroups.length > 1 && currentTabstopGroups[0].containsSelection(view.state.selection)) {
+ return true;
+ }
+ return false;
+}
+function consumeAndGotoNextTabstop(view) {
+ if (getTabstopGroupsFromView(view).length === 0)
+ return false;
+ removeTabstop(view);
+ const oldSel = view.state.selection;
+ const nextGrp = getTabstopGroupsFromView(view)[0];
+ if (!nextGrp)
+ return false;
+ const shouldMoveToEndpoints = nextGrp.containsSelection(oldSel);
+ nextGrp.select(view, shouldMoveToEndpoints);
+ const newSel = view.state.selection;
+ if (oldSel.eq(newSel))
+ return consumeAndGotoNextTabstop(view);
+ tidyTabstops(view);
+ return true;
+}
+
+// src/tabstop.ts
+var import_state2 = require("@codemirror/state");
+var import_view2 = require("@codemirror/view");
+var TABSTOP_DECO_CLASS = "easy-typing-tabstops";
+var CURSOR_WIDGET_CLASS = "easy-typing-cursor-widget";
+function getMarkerDecoration(from, to) {
+ const className = `${TABSTOP_DECO_CLASS}`;
+ if (from == to) {
+ return import_view2.Decoration.widget({
+ widget: new CursorWidget(),
+ side: 1
+ }).range(from);
+ }
+ return import_view2.Decoration.mark({
+ inclusive: true,
+ class: className
+ }).range(from, to);
+}
+var TabstopGroup = class {
+ constructor(tabstopSpecs) {
+ const decos = tabstopSpecs.map((spec) => getMarkerDecoration(spec.from, spec.to));
+ this.selections = tabstopSpecs.map((spec) => import_state2.EditorSelection.range(spec.from, spec.to));
+ this.decos = import_view2.Decoration.set(decos, true);
+ }
+ select(view, selectEndpoints) {
+ const sel = this.toEditorSelection();
+ const toSelect = selectEndpoints ? getEditorSelectionEndpoints(sel) : sel;
+ view.dispatch({
+ selection: toSelect
+ });
+ }
+ toSelectionRanges() {
+ return this.selections;
+ }
+ toEditorSelection() {
+ return import_state2.EditorSelection.create(this.toSelectionRanges());
+ }
+ containsSelection(selection) {
+ function rangeLiesWithinSelection(range, sel) {
+ for (const selRange of sel) {
+ if (selRange.from <= range.from && selRange.to >= range.to) {
+ return true;
+ }
+ }
+ return false;
+ }
+ const tabstopRanges = this.toSelectionRanges();
+ let result = true;
+ for (const range of selection.ranges) {
+ if (!rangeLiesWithinSelection(range, tabstopRanges)) {
+ result = false;
+ break;
+ }
+ }
+ return result;
+ }
+ map(changes) {
+ this.decos = this.decos.map(changes);
+ this.selections = this.selections.map((range) => {
+ let rangeFrom = changes.mapPos(range.from, -1);
+ let rangeTo = changes.mapPos(range.to, 1);
+ return import_state2.EditorSelection.range(rangeFrom, rangeTo);
+ });
+ }
+ getDecoRanges() {
+ const ranges = [];
+ const cur = this.decos.iter();
+ while (cur.value != null) {
+ if (cur.from != cur.to) {
+ ranges.push(cur.value.range(cur.from, cur.to));
+ } else {
+ ranges.push(cur.value.range(cur.from));
+ }
+ cur.next();
+ }
+ return ranges;
+ }
+};
+function tabstopSpecsToTabstopGroups(tabstops) {
+ const tabstopsByNumber = {};
+ for (const tabstop of tabstops) {
+ const n = String(tabstop.number);
+ if (tabstopsByNumber[n]) {
+ tabstopsByNumber[n].push(tabstop);
+ } else {
+ tabstopsByNumber[n] = [tabstop];
+ }
+ }
+ const result = [];
+ const numbers = Object.keys(tabstopsByNumber);
+ numbers.sort((a, b) => parseInt(a) - parseInt(b));
+ for (const number of numbers) {
+ const grp = new TabstopGroup(tabstopsByNumber[number]);
+ result.push(grp);
+ }
+ return result;
+}
+function getEditorSelectionEndpoints(sel) {
+ const endpoints = sel.ranges.map((range) => import_state2.EditorSelection.range(range.to, range.to));
+ return import_state2.EditorSelection.create(endpoints);
+}
+var CursorWidget = class extends import_view2.WidgetType {
+ eq(widget) {
+ return true;
+ }
+ toDOM(view) {
+ const cursorEl = document.createElement("span");
+ cursorEl.className = `${CURSOR_WIDGET_CLASS}`;
+ cursorEl.textContent = "|";
+ return cursorEl;
+ }
+};
+
+// src/main.ts
+var EasyTypingPlugin = class extends import_obsidian3.Plugin {
+ constructor() {
+ super(...arguments);
+ this.getDefaultIndentChar = () => {
+ let useTab = this.app.vault.config.useTab === void 0 ? true : false;
+ let tabSize = this.app.vault.config.tabSize == void 0 ? 4 : this.app.vault.config.tabSize;
+ let default_indent = useTab ? " " : " ".repeat(tabSize);
+ return default_indent;
+ };
+ this.transactionFilterPlugin = (tr) => {
+ const changes = [];
+ if (!tr.docChanged)
+ return tr;
+ let selected = tr.startState.selection.asSingle().main.anchor != tr.startState.selection.asSingle().main.head;
+ let changeTypeStr = getTypeStrOfTransac(tr);
+ tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {
+ var _a, _b;
+ let changedStr = tr.startState.sliceDoc(fromA, toA);
+ let changestr_ = changedStr.replace(/\s/g, "0");
+ let insertedStr = inserted.sliceString(0);
+ if (this.settings.debug) {
+ console.log("[TransactionFilter] type, fromA, toA, changed, fromB, toB, inserted");
+ console.log(changeTypeStr, fromA, toA, changedStr, fromB, toB, insertedStr);
+ }
+ if (getPosLineType(tr.startState, fromA) == "table" /* table */)
+ return tr;
+ if (this.settings.SelectionEnhance) {
+ if ((changeTypeStr == "input.type" || changeTypeStr == "input.type.compose") && fromA != toA && (fromB + 1 === toB || insertedStr == "\u2014\u2014" || insertedStr == "\u2026\u2026")) {
+ if (this.SelectionReplaceMap.has(insertedStr)) {
+ changes.push({ changes: { from: fromA, insert: (_a = this.SelectionReplaceMap.get(insertedStr)) == null ? void 0 : _a.left }, userEvent: "EasyTyping.change" });
+ changes.push({ changes: { from: toA, insert: (_b = this.SelectionReplaceMap.get(insertedStr)) == null ? void 0 : _b.right }, userEvent: "EasyTyping.change" });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ }
+ if (this.settings.BetterCodeEdit && changeTypeStr.contains("paste") && fromA == fromB && isCodeBlockInPos(tr.startState, fromA)) {
+ print("\u68C0\u6D4B\u5230\u5728\u4EE3\u7801\u5757\u4E2D\u7C98\u8D34");
+ let line = tr.startState.doc.lineAt(fromB).text;
+ let indent_space = line.match(/^\s*/)[0].length;
+ let inserted_lines = insertedStr.split("\n");
+ let extra_indent = "";
+ if (inserted_lines.length > 1) {
+ let first_line = inserted_lines[0].trimStart();
+ let rest_lines = inserted_lines.slice(1);
+ let min_indent_space = Infinity;
+ for (let line2 of rest_lines) {
+ let indent = line2.match(/^\s*/)[0].length;
+ if (!/^\s*$/.test(line2) && indent < min_indent_space)
+ min_indent_space = indent;
+ }
+ let new_rest_lines = rest_lines.map((line2) => line2.substring(min_indent_space));
+ new_rest_lines = new_rest_lines.map((line2) => line2.replace(/[\t]/g, this.getDefaultIndentChar()));
+ let final_rest_lines = new_rest_lines.map((line2) => " ".repeat(indent_space) + extra_indent + line2);
+ let new_insertedStr = first_line + "\n" + final_rest_lines.join("\n");
+ changes.push({
+ changes: { from: fromA, to: toA, insert: new_insertedStr },
+ selection: { anchor: fromA + new_insertedStr.length },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ if (selected)
+ return tr;
+ if (this.settings.TryFixMSIME && changeTypeStr == "input.type.compose" && changedStr == "" && /^[\u4e00-\u9fa5]+$/.test(insertedStr)) {
+ print("MS-IME Compose detected:", insertedStr);
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ if (this.settings.BetterCodeEdit && changeTypeStr == "delete.backward" && !selected && getPosLineType(tr.startState, toA) == "codeblock" /* codeblock */ && (tr.startState.sliceDoc(fromA, toA) != "`" || getPosLineType(tr.state, fromA) == "codeblock" /* codeblock */)) {
+ let line_number = tr.startState.doc.lineAt(toA).number;
+ let cur_line = tr.startState.doc.lineAt(toA);
+ let list_code = false;
+ let list_code_indent = 0;
+ for (let i = line_number - 1; i >= 1; i--) {
+ let line = tr.startState.doc.line(i);
+ if (/^\s+```/.test(line.text)) {
+ list_code = true;
+ list_code_indent = line.text.match(/^\s*/)[0].length;
+ break;
+ } else if (/^```/.test(line.text))
+ break;
+ else
+ continue;
+ }
+ if (list_code) {
+ print("list_code, indent: ", list_code_indent);
+ if (toA == cur_line.from + list_code_indent) {
+ changes.push({ changes: { from: tr.startState.doc.line(line_number - 1).to, to: toA, insert: "" }, userEvent: "EasyTyping.change" });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ if (fromA >= cur_line.from && fromA < cur_line.from + list_code_indent && toA > cur_line.from + list_code_indent) {
+ changes.push({ changes: { from: cur_line.from + list_code_indent, to: toA, insert: "" }, userEvent: "EasyTyping.change" });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ }
+ if (changeTypeStr === "delete.backward" && this.settings.IntrinsicSymbolPairs) {
+ if (this.SymbolPairsMap.has(changedStr) && this.SymbolPairsMap.get(changedStr) === tr.startState.sliceDoc(toA, toA + 1)) {
+ changes.push({ changes: { from: fromA, to: toA + 1 }, userEvent: "EasyTyping.change" });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ let line_content = tr.startState.doc.lineAt(toA).text;
+ let next_line_content = tr.startState.doc.sliceString(toA, toA + line_content.length + 1);
+ if (/^\s*```$/.test(line_content) && "\n" + line_content == next_line_content) {
+ changes.push({
+ changes: {
+ from: toA - 3,
+ to: toA + line_content.length + 1,
+ insert: ""
+ },
+ selection: { anchor: toA - 3 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ for (let rule of this.IntrinsicDeleteRules) {
+ let left = tr.startState.doc.sliceString(toA - rule.before.left.length, toA);
+ let right = tr.startState.doc.sliceString(toA, toA + rule.before.right.length);
+ if (left === rule.before.left && right === rule.before.right) {
+ changes.push({
+ changes: {
+ from: toA - rule.before.left.length,
+ to: toA + rule.before.right.length,
+ insert: rule.after.left + rule.after.right
+ },
+ selection: { anchor: toA - rule.before.left.length + rule.after.left.length },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ }
+ if (changeTypeStr == "delete.backward") {
+ for (let rule of this.UserDeleteRules) {
+ let leftDocStr = tr.startState.doc.sliceString(0, toA);
+ let rightDocStr = tr.startState.doc.sliceString(toA);
+ let leftRegexpStr = rule.before.left;
+ if (isRegexp(rule.before.left)) {
+ leftRegexpStr = leftRegexpStr.slice(2, -1);
+ } else {
+ leftRegexpStr = leftRegexpStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ }
+ let leftRegexp = new RegExp(leftRegexpStr + "$");
+ let leftMatch = leftDocStr.match(leftRegexp);
+ if (leftMatch) {
+ let leftMatchStr = leftMatch[0];
+ let matchList = leftMatch.slice(1);
+ let matchPosBegin = toA - leftMatchStr.length;
+ let rightRegexpStr = rule.before.right;
+ if (isRegexp(rule.before.right)) {
+ rightRegexpStr = rightRegexpStr.slice(2, -1);
+ } else {
+ rightRegexpStr = rightRegexpStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ }
+ let rightRegexp = new RegExp("^" + rightRegexpStr);
+ let rightMatch = rightDocStr.match(rightRegexp);
+ if (rightMatch) {
+ let rightMatchStr = rightMatch[0];
+ let matchPosEnd = toA + rightMatchStr.length;
+ matchList.push(...rightMatch.slice(1));
+ let [new_string, tabstops] = parseTheAfterPattern(rule.after_pattern, matchList);
+ const updatedTabstops = tabstops.map((tabstop) => ({
+ ...tabstop,
+ from: tabstop.from + matchPosBegin,
+ to: tabstop.to + matchPosBegin
+ }));
+ let tabstopGroups = tabstopSpecsToTabstopGroups(updatedTabstops);
+ changes.push({
+ changes: {
+ from: matchPosBegin,
+ to: matchPosEnd,
+ insert: new_string
+ },
+ selection: tabstopGroups[0].toEditorSelection(),
+ effects: [addTabstopsEffect.of(tabstopGroups)],
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ }
+ }
+ if (changeTypeStr == "input.type" && insertedStr == "`\n```" && this.settings.BaseObEditEnhance) {
+ const line_content = tr.startState.doc.lineAt(fromA).text;
+ if (/^\s*``$/.test(line_content)) {
+ changes.push({
+ changes: { from: fromA, to: toA, insert: "`\n" + line_content + "`" },
+ selection: { anchor: fromA + 1 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ if ((changeTypeStr == "input.type" || changeTypeStr == "input.type.compose") && fromA === toA && fromB + 1 === toB) {
+ if (this.settings.BaseObEditEnhance) {
+ if (insertedStr === "`" && toA - tr.startState.doc.lineAt(toA).from > 2 && tr.startState.sliceDoc(toA - 1, toA) === "`" && tr.startState.sliceDoc(toA - 2, toA - 1) != "`") {
+ changes.push({
+ changes: { from: toA, insert: "`" },
+ selection: { anchor: toA },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ if (insertedStr == "\xB7") {
+ let line_content = tr.startState.doc.lineAt(fromA).text;
+ let ch_pos = fromA - tr.startState.doc.lineAt(fromA).from;
+ if (/^\s*``$/.test(line_content) && ch_pos == line_content.length - 1) {
+ changes.push({
+ changes: { from: fromA + 1, to: toA + 1, insert: "`\n" + line_content + "`" },
+ selection: { anchor: fromA + 2 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ for (let rule of this.BasicConvRules) {
+ if (insertedStr != rule.before.left.charAt(rule.before.left.length - 1))
+ continue;
+ if (rule.before.left.charAt(0) === "\n" && offsetToPos(tr.state.doc, fromA).line === 0 && toB - rule.before.left.length + 1 === 0) {
+ let left = tr.state.doc.sliceString(toB - rule.before.left.length + 1, toB);
+ let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
+ if (left === rule.before.left.substring(1) && right === rule.before.right) {
+ changes.push({
+ changes: {
+ from: toA - rule.before.left.length + 2,
+ to: toA + rule.before.right.length,
+ insert: rule.after.left.substring(1) + rule.after.right
+ },
+ selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ } else {
+ let left = tr.state.doc.sliceString(toB - rule.before.left.length, toB);
+ let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
+ if (left === rule.before.left && right === rule.before.right) {
+ changes.push({
+ changes: {
+ from: toA - rule.before.left.length + 1,
+ to: toA + rule.before.right.length,
+ insert: rule.after.left + rule.after.right
+ },
+ selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ }
+ }
+ if (this.settings.FW2HWEnhance) {
+ for (let rule of this.FW2HWSymbolRules) {
+ if (insertedStr != rule.before.left.charAt(rule.before.left.length - 1))
+ continue;
+ let left = tr.state.doc.sliceString(toB - rule.before.left.length, toB);
+ let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
+ if (left === rule.before.left && right === rule.before.right) {
+ changes.push({
+ changes: {
+ from: toA - rule.before.left.length + 1,
+ to: toA + rule.before.right.length,
+ insert: rule.after.left + rule.after.right
+ },
+ selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ }
+ if (this.settings.IntrinsicSymbolPairs) {
+ for (let rule of this.IntrinsicAutoPairRulesPatch) {
+ if (insertedStr != rule.before.left.charAt(rule.before.left.length - 1))
+ continue;
+ let left = tr.state.doc.sliceString(toB - rule.before.left.length, toB);
+ let right = tr.state.doc.sliceString(toB, toB + rule.before.right.length);
+ if (left === rule.before.left && right === rule.before.right) {
+ changes.push({
+ changes: {
+ from: toA - rule.before.left.length + 1,
+ to: toA + rule.before.right.length,
+ insert: rule.after.left + rule.after.right
+ },
+ selection: { anchor: toA - rule.before.left.length + rule.after.left.length + 1 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ if (this.SymbolPairsMap.has(insertedStr) && insertedStr != "'") {
+ changes.push({
+ changes: { from: fromA, to: toA, insert: insertedStr + this.SymbolPairsMap.get(insertedStr) },
+ selection: { anchor: fromA + 1 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ } else if (insertedStr === "'") {
+ let charBeforeCursor = tr.startState.sliceDoc(fromA - 1, fromA);
+ if (["", " ", "\n"].includes(charBeforeCursor)) {
+ changes.push({
+ changes: { from: fromA, to: toA, insert: "''" },
+ selection: { anchor: fromA + 1 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ if (insertedStr === "\u201D" || insertedStr === "\u2019") {
+ let tempStr = insertedStr === "\u201D" ? "\u201C\u201D" : "\u2018\u2019";
+ changes.push({
+ changes: { from: fromA, to: toA, insert: tempStr },
+ selection: { anchor: fromA + 1 },
+ userEvent: "EasyTyping.change"
+ });
+ tr = tr.startState.update(...changes);
+ return tr;
+ }
+ }
+ }
+ });
+ return tr;
+ };
+ this.viewUpdatePlugin = (update) => {
+ if (this.onFormatArticle === true)
+ return;
+ let cursor_changed = update.transactions.find((tr2) => tr2.selection) != null;
+ if ((update.docChanged || cursor_changed) && !update.view.composing && !isInsideCurTabstop(update.view)) {
+ removeAllTabstops(update.view);
+ }
+ if (update.transactions.find((tr2) => tr2.isUserEvent("undo"))) {
+ removeAllTabstops(update.view);
+ }
+ let notSelected = true;
+ let mainSelection = update.view.state.selection.asSingle().main;
+ if (mainSelection.anchor != mainSelection.head)
+ notSelected = false;
+ if (!update.docChanged)
+ return;
+ let isExcludeFile = this.isCurrentFileExclude();
+ let tr = update.transactions[0];
+ let changeType = getTypeStrOfTransac(tr);
+ tr.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {
+ let insertedStr = inserted.sliceString(0);
+ let changedStr = tr.startState.doc.sliceString(fromA, toA);
+ if (this.settings.debug) {
+ console.log("[ViewUpdate] type, fromA, toA, changed, fromB, toB, inserted");
+ console.log(changeType, fromA, toA, changedStr, fromB, toB, insertedStr);
+ console.log("==>[Composing]", update.view.composing);
+ }
+ if (getPosLineType(update.view.state, fromB) == "table" /* table */) {
+ return;
+ }
+ let cursor = update.view.state.selection.asSingle().main;
+ if (update.view.composing) {
+ if (this.compose_need_handle) {
+ this.compose_end_pos = cursor.anchor;
+ } else {
+ this.compose_need_handle = true;
+ this.compose_begin_pos = fromA;
+ this.compose_end_pos = cursor.anchor;
+ }
+ return;
+ }
+ let change_from = fromB;
+ let change_to = toB;
+ let composeEnd = false;
+ if (this.compose_need_handle) {
+ composeEnd = true;
+ this.compose_need_handle = false;
+ change_from = this.compose_begin_pos;
+ change_to = this.compose_end_pos;
+ }
+ if (changeType.contains("EasyTyping") || changeType == "undo" || changeType == "redo")
+ return;
+ if (changeType != "none" && notSelected && !changeType.includes("delete")) {
+ if (this.triggerUserCvtRule(update.view, mainSelection.anchor))
+ return;
+ if (composeEnd && this.triggerPuncRectify(update.view, change_from))
+ return;
+ if (this.settings.AutoFormat && notSelected && !isExcludeFile && (changeType != "none" || insertedStr == "\n")) {
+ if (getPosLineType(update.view.state, change_from) == "text" /* text */ || getPosLineType(update.view.state, change_from) == "table" /* table */) {
+ let changes = this.Formater.formatLineOfDoc(update.state, this.settings, change_from, cursor.anchor, insertedStr);
+ if (changes != null) {
+ update.view.dispatch(...changes[0]);
+ update.view.dispatch(changes[1]);
+ return;
+ }
+ }
+ }
+ }
+ if (this.settings.AutoFormat && !isExcludeFile && changeType == "input.paste" && !import_obsidian3.Platform.isIosApp) {
+ let updateLineStart = update.state.doc.lineAt(fromB).number;
+ let updateLineEnd = update.state.doc.lineAt(toB).number;
+ if (updateLineStart == updateLineEnd && getPosLineType(update.view.state, toB) == "text" /* text */) {
+ let changes = this.Formater.formatLineOfDoc(update.state, this.settings, fromB, toB, insertedStr);
+ if (changes != null) {
+ update.view.dispatch(...changes[0]);
+ return;
+ }
+ } else {
+ let all_changes = [];
+ let inserted_array = insertedStr.split("\n");
+ let update_start = fromB;
+ for (let i = updateLineStart; i <= updateLineEnd; i++) {
+ let real_inserted = inserted_array[i - updateLineStart];
+ let changes = this.Formater.formatLineOfDoc(update.state, this.settings, update_start, update_start + real_inserted.length, real_inserted);
+ if (changes != null) {
+ all_changes.push(...changes[0]);
+ }
+ update_start += real_inserted.length + 1;
+ }
+ if (all_changes.length > 0) {
+ update.view.dispatch(...all_changes);
+ return;
+ }
+ }
+ }
+ });
+ };
+ this.handleTabDown = (view) => {
+ if (consumeAndGotoNextTabstop(view)) {
+ return true;
+ }
+ if (!this.settings.Tabout)
+ return false;
+ let state = view.state;
+ let doc = state.doc;
+ const tree = (0, import_language3.syntaxTree)(state);
+ const s = view.state.selection;
+ if (s.ranges.length > 1)
+ return false;
+ const pos = s.main.to;
+ let line = doc.lineAt(pos);
+ if (s.main.from == s.main.to && isCodeBlockInPos(state, pos)) {
+ const default_indent = this.getDefaultIndentChar();
+ view.dispatch({
+ changes: {
+ from: s.main.from,
+ insert: default_indent
+ },
+ selection: {
+ anchor: s.main.from + default_indent.length
+ }
+ });
+ return true;
+ }
+ if (this.settings.BetterCodeEdit && pos - line.from != 0 && tree.resolve(pos - 1, 1).name.contains("inline-code")) {
+ if (tree.resolve(pos, 1).name.contains("formatting-code_inline-code")) {
+ view.dispatch({
+ selection: { anchor: pos + 1, head: pos + 1 }
+ });
+ return true;
+ }
+ for (let p = pos + 1; p < line.to && tree.resolve(p, 1).name.contains("inline-code"); p += 1) {
+ if (tree.resolve(p, 1).name.contains("formatting-code_inline-code")) {
+ view.dispatch({
+ selection: { anchor: p, head: p }
+ });
+ return true;
+ }
+ if (p == line.to - 1 && tree.resolve(p, 1).name.contains("inline-code")) {
+ view.dispatch({
+ selection: { anchor: p + 1, head: p + 1 }
+ });
+ return true;
+ }
+ }
+ }
+ let selection = view.state.selection.asSingle().main;
+ let selected = selection.anchor != selection.head;
+ if (selected) {
+ let new_anchor = selection.anchor < selection.head ? selection.anchor : selection.head;
+ let new_head = selection.anchor > selection.head ? selection.anchor : selection.head;
+ for (let pstr of this.TaboutPairStrs) {
+ if (doc.sliceString(new_anchor - pstr.left.length, new_anchor) == pstr.left && doc.sliceString(new_head, new_head + pstr.right.length) == pstr.right) {
+ view.dispatch({
+ selection: { anchor: new_head + pstr.right.length, head: new_head + pstr.right.length }
+ });
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+ this.handleEnter = (view) => {
+ if (!this.settings.EnterTwice)
+ return false;
+ let strictLineBreaks = this.app.vault.config.strictLineBreaks || false;
+ if (!strictLineBreaks)
+ return false;
+ let state = view.state;
+ let doc = state.doc;
+ const tree = (0, import_language3.syntaxTree)(state);
+ const s = view.state.selection;
+ if (s.ranges.length > 1)
+ return false;
+ const pos = s.main.to;
+ let line = doc.lineAt(pos);
+ if (/^\s*$/.test(line.text))
+ return false;
+ if (pos == line.from)
+ return false;
+ if (line.number < doc.lines && !/^\s*$/.test(doc.line(line.number + 1).text))
+ return false;
+ if (getPosLineType2(state, pos) == "text" /* text */) {
+ view.dispatch({
+ changes: {
+ from: pos,
+ to: pos,
+ insert: "\n\n"
+ },
+ selection: { anchor: pos + 2 },
+ userEvent: "EasyTyping.change"
+ });
+ return true;
+ }
+ return false;
+ };
+ this.handleModAInCodeBlock = (view) => {
+ if (!this.settings.BetterCodeEdit)
+ return false;
+ let selected = false;
+ let mainSelection = view.state.selection.asSingle().main;
+ if (mainSelection.anchor != mainSelection.head)
+ selected = true;
+ if (selected)
+ return false;
+ let cursor_pos = mainSelection.anchor;
+ return selectCodeBlockInPos(view, cursor_pos);
+ };
+ this.onKeyup = (event, view) => {
+ if (this.settings.debug) {
+ console.log("Keyup:", event.key);
+ }
+ this.handleEndComposeTypeKey(event, view);
+ };
+ this.triggerUserCvtRule = (view, cursor_pos) => {
+ for (let rule of this.UserConvertRules) {
+ let leftDocStr = view.state.doc.sliceString(0, cursor_pos);
+ let rightDocStr = view.state.doc.sliceString(cursor_pos);
+ let leftRegexpStr = rule.before.left;
+ if (isRegexp(rule.before.left)) {
+ leftRegexpStr = leftRegexpStr.slice(2, -1);
+ } else {
+ leftRegexpStr = leftRegexpStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ }
+ let leftRegexp = new RegExp(leftRegexpStr + "$");
+ let leftMatch = leftDocStr.match(leftRegexp);
+ if (leftMatch) {
+ let leftMatchStr = leftMatch[0];
+ let matchList = leftMatch.slice(1);
+ let matchPosBegin = cursor_pos - leftMatchStr.length;
+ let rightRegexpStr = rule.before.right;
+ if (isRegexp(rule.before.right)) {
+ rightRegexpStr = rightRegexpStr.slice(2, -1);
+ } else {
+ rightRegexpStr = rightRegexpStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+ }
+ let rightRegexp = new RegExp("^" + rightRegexpStr);
+ let rightMatch = rightDocStr.match(rightRegexp);
+ if (rightMatch) {
+ let rightMatchStr = rightMatch[0];
+ let matchPosEnd = cursor_pos + rightMatchStr.length;
+ matchList.push(...rightMatch.slice(1));
+ let [new_string, tabstops] = parseTheAfterPattern(rule.after_pattern, matchList);
+ const updatedTabstops = tabstops.map((tabstop) => ({
+ ...tabstop,
+ from: tabstop.from + matchPosBegin,
+ to: tabstop.to + matchPosBegin
+ }));
+ view.dispatch({
+ changes: {
+ from: matchPosBegin,
+ to: matchPosEnd,
+ insert: new_string
+ },
+ userEvent: "EasyTyping.change"
+ });
+ addTabstopsAndSelect(view, tabstopSpecsToTabstopGroups(updatedTabstops));
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+ this.triggerPuncRectify = (view, change_from_pos) => {
+ if (this.settings.PuncRectify && /[,.?!]/.test(view.state.doc.sliceString(change_from_pos - 1, change_from_pos))) {
+ let punc = view.state.doc.sliceString(change_from_pos - 1, change_from_pos);
+ if (change_from_pos > 2 && /[^\u4e00-\u9fa5]/.test(view.state.doc.sliceString(change_from_pos - 2, change_from_pos - 1))) {
+ } else {
+ view.dispatch({
+ changes: {
+ from: change_from_pos - 1,
+ to: change_from_pos,
+ insert: this.halfToFullSymbolMap.get(punc)
+ },
+ userEvent: "EasyTyping.change"
+ });
+ return true;
+ }
+ }
+ return false;
+ };
+ this.handleEndComposeTypeKey = (event, view) => {
+ if ((["Enter", "Process", " ", "Shift"].contains(event.key) || /\d/.test(event.key)) && this.compose_need_handle) {
+ let cursor = view.state.selection.asSingle().main;
+ if (cursor.head != cursor.anchor)
+ return;
+ let insertedStr = view.state.doc.sliceString(this.compose_begin_pos, cursor.anchor);
+ this.compose_need_handle = false;
+ if (this.triggerUserCvtRule(view, cursor.anchor))
+ return;
+ if (this.triggerPuncRectify(view, this.compose_begin_pos))
+ return;
+ if (this.settings.AutoFormat && !this.isCurrentFileExclude()) {
+ if (getPosLineType(view.state, cursor.anchor) != "text" /* text */)
+ return;
+ let changes = this.Formater.formatLineOfDoc(view.state, this.settings, this.compose_begin_pos, cursor.anchor, insertedStr);
+ if (changes != null) {
+ view.dispatch(...changes[0]);
+ view.dispatch(changes[1]);
+ return;
+ }
+ }
+ }
+ };
+ this.formatArticle = (editor, view) => {
+ const editorView = editor.cm;
+ const tree = (0, import_language3.ensureSyntaxTree)(editorView.state, editorView.state.doc.length);
+ if (!tree) {
+ new import_obsidian3.Notice("EasyTyping: Syntax tree is not ready yet, please wait a moment and try again later!", 5e3);
+ return;
+ }
+ this.onFormatArticle = true;
+ let lineCount = editor.lineCount();
+ let new_article = "";
+ let cs = editor.getCursor();
+ let ch = 0;
+ for (let i = 0; i < lineCount; i++) {
+ if (i != 0)
+ new_article += "\n";
+ if (i != cs.line) {
+ new_article += this.preFormatOneLine(editor, i + 1)[0];
+ } else {
+ let newData = this.preFormatOneLine(editor, i + 1, cs.ch);
+ new_article += newData[0];
+ ch = newData[1];
+ }
+ }
+ editor.setValue(new_article);
+ editor.setCursor({ line: cs.line, ch });
+ this.onFormatArticle = false;
+ new import_obsidian3.Notice("EasyTyping: Format Article Done!");
+ };
+ this.formatSelectionOrCurLine = (editor, view) => {
+ if (!editor.somethingSelected() || editor.getSelection() === "") {
+ let lineNumber = editor.getCursor().line;
+ let newLineData = this.preFormatOneLine(editor, lineNumber + 1, editor.getCursor().ch);
+ editor.replaceRange(newLineData[0], { line: lineNumber, ch: 0 }, { line: lineNumber, ch: editor.getLine(lineNumber).length });
+ editor.setSelection({ line: lineNumber, ch: newLineData[1] });
+ return;
+ }
+ let selection = editor.listSelections()[0];
+ let begin = selection.anchor.line;
+ let end = selection.head.line;
+ if (begin > end) {
+ let temp = begin;
+ begin = end;
+ end = temp;
+ }
+ let new_lines = "";
+ for (let i = begin; i <= end; i++) {
+ if (i != begin)
+ new_lines += "\n";
+ new_lines += this.preFormatOneLine(editor, i + 1)[0];
+ }
+ editor.replaceRange(new_lines, { line: begin, ch: 0 }, { line: end, ch: editor.getLine(end).length });
+ if (selection.anchor.line < selection.head.line) {
+ editor.setSelection({ line: selection.anchor.line, ch: 0 }, { line: selection.head.line, ch: editor.getLine(selection.head.line).length });
+ } else {
+ editor.setSelection({ line: selection.anchor.line, ch: editor.getLine(selection.anchor.line).length }, { line: selection.head.line, ch: 0 });
+ }
+ };
+ this.formatOneLine = (editor, lineNumber) => {
+ const editorView = editor.cm;
+ let state = editorView.state;
+ let line = state.doc.line(lineNumber);
+ if (getPosLineType(state, line.from) == "text" /* text */ || getPosLineType(state, line.from) == "table" /* table */) {
+ let oldLine = line.text;
+ let newLine = this.Formater.formatLine(state, lineNumber, this.settings, oldLine.length, 0)[0];
+ if (oldLine != newLine) {
+ editor.replaceRange(newLine, { line: lineNumber - 1, ch: 0 }, { line: lineNumber - 1, ch: oldLine.length });
+ editor.setCursor({ line: lineNumber - 1, ch: editor.getLine(lineNumber - 1).length });
+ }
+ }
+ return;
+ };
+ this.preFormatOneLine = (editor, lineNumber, ch = -1) => {
+ const editorView = editor.cm;
+ let state = editorView.state;
+ let line = state.doc.line(lineNumber);
+ let newLine = line.text;
+ let newCh = 0;
+ let curCh = line.text.length;
+ if (ch != -1) {
+ curCh = ch;
+ }
+ if (getPosLineType(state, line.from) == "text" /* text */ || getPosLineType(state, line.from) == "table" /* table */) {
+ let newLineData = this.Formater.formatLine(state, lineNumber, this.settings, curCh, 0);
+ newLine = newLineData[0];
+ newCh = newLineData[1];
+ }
+ return [newLine, newCh];
+ };
+ this.deleteBlankLines = (editor) => {
+ if (this.settings.debug) {
+ console.log("config.strictLineBreaks", this.app.vault.getConfig("strictLineBreaks"));
+ }
+ let strictLineBreaks = this.app.vault.config.strictLineBreaks || false;
+ const editorView = editor.cm;
+ let state = editorView.state;
+ let doc = state.doc;
+ const tree = (0, import_language3.ensureSyntaxTree)(state, doc.length);
+ if (!tree) {
+ new import_obsidian3.Notice("EasyTyping: Syntax tree is not ready yet, please wait a moment and try again later!", 5e3);
+ return;
+ }
+ let start_line = 1;
+ let end_line = doc.lines;
+ let line_num = doc.lines;
+ const selected = editor.somethingSelected() && editor.getSelection() != "";
+ if (selected) {
+ let selection = editor.listSelections()[0];
+ let begin = selection.anchor.line + 1;
+ let end = selection.head.line + 1;
+ if (begin > end) {
+ let temp = begin;
+ begin = end;
+ end = temp;
+ }
+ start_line = begin;
+ end_line = end;
+ }
+ let delete_index = [];
+ let blank_reg = /^\s*$/;
+ let remain_next_blank = false;
+ if (start_line != 1) {
+ let node = tree.resolve(doc.line(start_line - 1).from, 1);
+ if (node.name.contains("list") || node.name.contains("quote") || node.name.contains("blockid")) {
+ remain_next_blank = true;
+ }
+ }
+ if (end_line != line_num && !blank_reg.test(doc.line(end_line + 1).text)) {
+ end_line += 1;
+ }
+ for (let i = start_line; i <= end_line; i++) {
+ let line = doc.line(i);
+ let pos = line.from;
+ let node = tree.resolve(pos, 1);
+ if (blank_reg.test(line.text) && !remain_next_blank) {
+ delete_index.push(i);
+ continue;
+ } else if (blank_reg.test(line.text) && remain_next_blank) {
+ remain_next_blank = false;
+ continue;
+ }
+ if (node.name.contains("hr") && delete_index[delete_index.length - 1] == i - 1) {
+ delete_index.pop();
+ } else if (node.name.contains("list") || node.name.contains("quote") || node.name.contains("blockid")) {
+ remain_next_blank = true;
+ } else {
+ remain_next_blank = false;
+ }
+ }
+ let newContent = "";
+ for (let i = 1; i < line_num; i++) {
+ if (!delete_index.contains(i)) {
+ newContent += doc.line(i).text + "\n";
+ }
+ }
+ if (!delete_index.contains(line_num)) {
+ newContent += doc.line(line_num).text;
+ }
+ editor.setValue(newContent);
+ };
+ this.getEditor = () => {
+ let editor = null;
+ let markdownView = this.app.workspace.getActiveViewOfType(import_obsidian3.MarkdownView);
+ if (markdownView) {
+ editor = markdownView.editor;
+ }
+ if (editor === null)
+ console.log("can't get editor");
+ return editor;
+ };
+ }
+ async onload() {
+ await this.loadSettings();
+ this.selectionReplaceMapInitalData = [
+ ["\u3010", { left: "[", right: "]" }],
+ ["\uFFE5", { left: "$", right: "$" }],
+ ["\xB7", { left: "`", right: "`" }],
+ ["\xA5", { left: "$", right: "$" }],
+ ["\u300A", { left: "\u300A", right: "\u300B" }],
+ ["\u201C", { left: "\u201C", right: "\u201D" }],
+ ["\u201D", { left: "\u201C", right: "\u201D" }],
+ ["\uFF08", { left: "\uFF08", right: "\uFF09" }],
+ ["<", { left: "<", right: ">" }]
+ ];
+ this.refreshSelectionReplaceRule();
+ this.SymbolPairsMap = /* @__PURE__ */ new Map();
+ let SymbolPairs = ["\u3010\u3011", "\uFF08\uFF09", "\u300A\u300B", "\u201C\u201D", "\u2018\u2019", "\u300C\u300D", "\u300E\u300F", "[]", "()", "{}", '""', "''"];
+ for (let pairStr of SymbolPairs)
+ this.SymbolPairsMap.set(pairStr.charAt(0), pairStr.charAt(1));
+ this.halfToFullSymbolMap = /* @__PURE__ */ new Map([
+ [".", "\u3002"],
+ [",", "\uFF0C"],
+ ["?", "\uFF1F"],
+ ["!", "\uFF01"]
+ ]);
+ let BasicConvRuleStringList = [
+ ["\xB7\xB7|", "`|`"],
+ ["\uFF01\u3010\u3010|\u3011", "![[|]]"],
+ ["\uFF01\u3010\u3010|", "![[|]]"],
+ ["\u3010\u3010|\u3011", "[[|]]"],
+ ["\u3010\u3010|", "[[|]]"],
+ ["\uFFE5\uFFE5|", "$|$"],
+ ["$\uFFE5|$", "$$\n|\n$$"],
+ ["\xA5\xA5|", "$|$"],
+ ["$\xA5|$", "$$\n|\n$$"],
+ ["$$|$", "$$\n|\n$$"],
+ ["$$|", "$|$"],
+ [">\u300B|", ">>|"],
+ ["\n\u300B|", "\n>|"],
+ [" \u300B|", " >|"],
+ ["\n\u3001|", "\n/|"]
+ ];
+ this.BasicConvRules = ruleStringList2RuleList(BasicConvRuleStringList);
+ let FW2HWSymbolRulesStrList = [
+ ["\u3002\u3002|", ".|"],
+ ["\uFF01\uFF01|", "!|"],
+ ["\uFF1B\uFF1B|", ";|"],
+ ["\uFF0C\uFF0C|", ",|"],
+ ["\uFF1A\uFF1A|", ":|"],
+ ["\uFF1F\uFF1F|", "?|"],
+ ["\uFF08\uFF08|\uFF09", "(|)"],
+ ["\uFF08\uFF08|", "(|)"],
+ ["\u201C\u201C|\u201D", '"|"'],
+ ["\u201C\u201D|\u201D", '"|"'],
+ ["\u2018\u2018|\u2019", "'|'"],
+ ["\u2018\u2019|\u2019", "'|'"],
+ ["\u300B\u300B|", ">|"],
+ ["\u300A\u300A|\u300B", "<|"],
+ ["\u300A\u300A|", "<|"]
+ ];
+ this.FW2HWSymbolRules = ruleStringList2RuleList(FW2HWSymbolRulesStrList);
+ let fw2hw_rule_0 = { before: { left: "\uFF5C\uFF5C", right: "" }, after: { left: "|", right: "" } };
+ this.FW2HWSymbolRules.push(fw2hw_rule_0);
+ let DeleteRulesStrList = [["$|$", "|"], ["==|==", "|"], ["$$\n|\n$$", "|"]];
+ this.IntrinsicDeleteRules = ruleStringList2RuleList(DeleteRulesStrList);
+ let autoPairRulesPatchStrList = [
+ ["\u3010\u3011|\u3011", "\u3010\u3011|"],
+ ["\uFF08\uFF09|\uFF09", "\uFF08\uFF09|"],
+ ["<>|>", "<>|"],
+ ["\u300A\u300B|\u300B", "\u300A\u300B|"],
+ ["\u300C\u300D|\u300D", "\u300C\u300D|"],
+ ["\u300E\u300F|\u300F", "\u300E\u300F|"],
+ ["()|)", "()|"],
+ ["[]|]", "[]|"],
+ ["{}|}", "{}|"],
+ ["''|'", "''|"],
+ ['""|"', '""|']
+ ];
+ this.IntrinsicAutoPairRulesPatch = ruleStringList2RuleList(autoPairRulesPatchStrList);
+ let TaboutPairStrs = [
+ "\u3010|\u3011",
+ "\uFF08|\uFF09",
+ "\u300A|\u300B",
+ "\u201C|\u201D",
+ "\u2018|\u2019",
+ "\u300C|\u300D",
+ "\u300E|\u300F",
+ "'|'",
+ '"|"',
+ "$$|$$",
+ "$|$",
+ "__|__",
+ "_|_",
+ "==|==",
+ "~~|~~",
+ "**|**",
+ "*|*",
+ "[[|]]",
+ "[|]",
+ "{|}",
+ "(|)",
+ "<|>"
+ ];
+ this.TaboutPairStrs = TaboutPairStrs.map((s) => string2pairstring(s));
+ this.refreshUserDeleteRule();
+ this.refreshUserConvertRule();
+ this.CurActiveMarkdown = "";
+ this.compose_need_handle = false;
+ this.Formater = new LineFormater();
+ this.onFormatArticle = false;
+ this.registerEditorExtension([
+ import_state3.EditorState.transactionFilter.of(this.transactionFilterPlugin),
+ import_view3.EditorView.updateListener.of(this.viewUpdatePlugin),
+ import_state3.Prec.highest(import_view3.EditorView.domEventHandlers({
+ "keyup": this.onKeyup
+ })),
+ tabstopsStateField.extension
+ ]);
+ this.registerEditorExtension(import_state3.Prec.highest(import_view3.keymap.of([
+ {
+ key: "Tab",
+ run: (view) => {
+ const success = this.handleTabDown(view);
+ return success;
+ }
+ },
+ {
+ key: "Enter",
+ run: (view) => {
+ const success = this.handleEnter(view);
+ return success;
+ }
+ },
+ {
+ key: "Mod-a",
+ run: (view) => {
+ const success = this.handleModAInCodeBlock(view);
+ return success;
+ }
+ }
+ ])));
+ this.lang = window.localStorage.getItem("language");
+ let command_name_map = this.getCommandNameMap();
+ this.addCommand({
+ id: "easy-typing-format-article",
+ name: command_name_map.get("format_article"),
+ editorCallback: (editor, view) => {
+ this.formatArticle(editor, view);
+ },
+ hotkeys: [{
+ modifiers: ["Ctrl", "Shift"],
+ key: "s"
+ }]
+ });
+ this.addCommand({
+ id: "easy-typing-format-selection",
+ name: command_name_map.get("format_selection"),
+ editorCallback: (editor, view) => {
+ this.formatSelectionOrCurLine(editor, view);
+ },
+ hotkeys: [{
+ modifiers: ["Ctrl", "Shift"],
+ key: "l"
+ }]
+ });
+ this.addCommand({
+ id: "easy-typing-delete-blank-line",
+ name: command_name_map.get("delete_blank_line"),
+ editorCallback: (editor, view) => {
+ this.deleteBlankLines(editor);
+ },
+ hotkeys: [{
+ modifiers: ["Ctrl", "Shift"],
+ key: "k"
+ }]
+ });
+ this.addCommand({
+ id: "easy-typing-insert-codeblock",
+ name: command_name_map.get("insert_codeblock"),
+ editorCallback: (editor, view) => {
+ this.convert2CodeBlock(editor);
+ },
+ hotkeys: [{
+ modifiers: ["Ctrl", "Shift"],
+ key: "n"
+ }]
+ });
+ this.addCommand({
+ id: "easy-typing-format-switch",
+ name: command_name_map.get("switch_autoformat"),
+ callback: () => this.switchAutoFormatting(),
+ hotkeys: [{
+ modifiers: ["Ctrl"],
+ key: "tab"
+ }]
+ });
+ this.addCommand({
+ id: "easy-typing-paste-without-format",
+ name: command_name_map.get("paste_wo_format"),
+ editorCallback: (editor) => this.normalPaste(editor),
+ hotkeys: [
+ {
+ modifiers: ["Mod", "Shift"],
+ key: "v"
+ }
+ ]
+ });
+ this.addSettingTab(new EasyTypingSettingTab(this.app, this));
+ this.registerEvent(this.app.workspace.on("active-leaf-change", (leaf) => {
+ if (leaf.view.getViewType() == "markdown") {
+ let file = this.app.workspace.getActiveFile();
+ if (file != null && this.CurActiveMarkdown != file.path) {
+ this.CurActiveMarkdown = file.path;
+ if (this.settings.debug)
+ new import_obsidian3.Notice("new md-file open: " + file.path);
+ }
+ }
+ }));
+ if (import_obsidian3.Platform.isMacOS && this.settings.FixMacOSContextMenu) {
+ this.registerEvent(this.app.workspace.on("editor-menu", (menu, editor, view) => {
+ if (editor.listSelections().length != 1)
+ return;
+ let selection = editor.listSelections()[0];
+ let selected = editor.getSelection();
+ if (selected == "\n") {
+ editor.setSelection(selection.anchor, selection.anchor);
+ }
+ }));
+ }
+ console.log("Easy Typing Plugin loaded.");
+ }
+ onunload() {
+ console.log("Easy Typing Plugin unloaded.");
+ }
+ async normalPaste(editor) {
+ let clipboardText = await navigator.clipboard.readText();
+ if (clipboardText === null || clipboardText === "")
+ return;
+ if (this.settings.debug)
+ console.log("Normal Paste!!");
+ const editorView = editor.cm;
+ let mainSelection = editorView.state.selection.asSingle().main;
+ editorView.dispatch({
+ changes: { from: mainSelection.from, to: mainSelection.to, insert: clipboardText },
+ selection: { anchor: mainSelection.from + clipboardText.length },
+ userEvent: "EasyTyping.paste"
+ });
+ }
+ isCurrentFileExclude() {
+ if (this.CurActiveMarkdown == "") {
+ let file = this.app.workspace.getActiveFile();
+ if (file != null && this.CurActiveMarkdown != file.path) {
+ this.CurActiveMarkdown = file.path;
+ } else {
+ return true;
+ }
+ }
+ let excludePaths = this.settings.ExcludeFiles.split("\n");
+ for (let epath of excludePaths) {
+ if (epath.charAt(0) == "/")
+ epath = epath.substring(1);
+ if (this.CurActiveMarkdown == epath)
+ return true;
+ let len = epath.length;
+ if (this.CurActiveMarkdown.substring(0, len) == epath && (this.CurActiveMarkdown.charAt(len) == "/" || this.CurActiveMarkdown.charAt(len) == "\\" || epath.charAt(len - 1) == "/" || epath.charAt(len - 1) == "\\")) {
+ return true;
+ }
+ }
+ return false;
+ }
+ switchAutoFormatting() {
+ this.settings.AutoFormat = !this.settings.AutoFormat;
+ let status = this.settings.AutoFormat ? "on" : "off";
+ new import_obsidian3.Notice("EasyTyping: Autoformat is " + status + "!");
+ }
+ convert2CodeBlock(editor) {
+ if (this.settings.debug)
+ console.log("----- EasyTyping: insert code block-----");
+ if (editor.somethingSelected && editor.getSelection() != "") {
+ let selected = editor.getSelection();
+ let selectedRange = editor.listSelections()[0];
+ let anchor = selectedRange.anchor;
+ let head = selectedRange.head;
+ let replacement = "```\n" + selected + "\n```";
+ if (anchor.line > head.line || anchor.line == head.line && anchor.ch > head.ch) {
+ let temp = anchor;
+ anchor = head;
+ head = temp;
+ }
+ let dstLine = anchor.line;
+ if (anchor.ch != 0) {
+ replacement = "\n" + replacement;
+ dstLine += 1;
+ }
+ if (head.ch != editor.getLine(head.line).length) {
+ replacement = replacement + "\n";
+ }
+ editor.replaceSelection(replacement);
+ editor.setCursor({ line: dstLine, ch: 3 });
+ } else {
+ let cs = editor.getCursor();
+ let replace = "```\n```";
+ let dstLine = cs.line;
+ if (cs.ch != 0) {
+ replace = "\n" + replace;
+ dstLine += 1;
+ }
+ if (cs.ch != editor.getLine(cs.line).length) {
+ replace = replace + "\n";
+ }
+ editor.replaceRange(replace, cs);
+ editor.setCursor({ line: dstLine, ch: 3 });
+ }
+ }
+ refreshSelectionReplaceRule() {
+ this.SelectionReplaceMap = new Map(this.selectionReplaceMapInitalData);
+ for (let i = 0; i < this.settings.userSelRepRuleTrigger.length; i++) {
+ let trigger = this.settings.userSelRepRuleTrigger[i];
+ let lefts = this.settings.userSelRepRuleValue[i].left;
+ let rights = this.settings.userSelRepRuleValue[i].right;
+ this.SelectionReplaceMap.set(trigger, { left: lefts, right: rights });
+ }
+ }
+ addUserSelectionRepRule(trigger, left, right) {
+ if (this.settings.userSelRepRuleTrigger.includes(trigger))
+ return false;
+ this.settings.userSelRepRuleTrigger.push(trigger);
+ this.settings.userSelRepRuleValue.push({ left, right });
+ this.refreshSelectionReplaceRule();
+ return true;
+ }
+ deleteUserSelectionRepRule(idx) {
+ if (idx < 0 || idx >= this.settings.userSelRepRuleTrigger.length)
+ return;
+ this.settings.userSelRepRuleTrigger.splice(idx, 1);
+ this.settings.userSelRepRuleValue.splice(idx, 1);
+ this.refreshSelectionReplaceRule();
+ }
+ updateUserSelectionRepRule(idx, left, right) {
+ if (idx < 0 || idx >= this.settings.userSelRepRuleTrigger.length)
+ return;
+ this.settings.userSelRepRuleValue[idx].left = left;
+ this.settings.userSelRepRuleValue[idx].right = right;
+ this.refreshSelectionReplaceRule();
+ }
+ refreshUserDeleteRule() {
+ this.UserDeleteRules = ruleStringList2RuleList(this.settings.userDeleteRulesStrList);
+ }
+ addUserDeleteRule(before, after) {
+ this.settings.userDeleteRulesStrList.push([before, after]);
+ this.refreshUserDeleteRule();
+ }
+ deleteUserDeleteRule(idx) {
+ if (idx >= this.settings.userDeleteRulesStrList.length || idx < 0)
+ return;
+ this.settings.userDeleteRulesStrList.splice(idx, 1);
+ this.refreshUserDeleteRule();
+ }
+ updateUserDeleteRule(idx, before, after) {
+ if (idx >= this.settings.userDeleteRulesStrList.length || idx < 0)
+ return;
+ this.settings.userDeleteRulesStrList[idx][0] = before;
+ this.settings.userDeleteRulesStrList[idx][1] = after;
+ this.refreshUserDeleteRule();
+ }
+ refreshUserConvertRule() {
+ this.UserConvertRules = ruleStringList2RuleList(this.settings.userConvertRulesStrList);
+ }
+ addUserConvertRule(before, after) {
+ this.settings.userConvertRulesStrList.push([before, after]);
+ this.refreshUserConvertRule();
+ }
+ deleteUserConvertRule(idx) {
+ if (idx >= this.settings.userConvertRulesStrList.length || idx < 0)
+ return;
+ this.settings.userConvertRulesStrList.splice(idx, 1);
+ this.refreshUserConvertRule();
+ }
+ getCommandNameMap() {
+ const lang = window.localStorage.getItem("language");
+ let command_name_map_en = /* @__PURE__ */ new Map([
+ ["format_article", "Format current article"],
+ ["format_selection", "Format selected text or current line"],
+ ["delete_blank_line", "Delete blank lines of the selected or whole article"],
+ ["insert_codeblock", "Insert code block w/wo selection"],
+ ["switch_autoformat", "Switch autoformat"],
+ ["paste_wo_format", "Paste without format"]
+ ]);
+ let command_name_map_zh_TW = /* @__PURE__ */ new Map([
+ ["format_article", "\u683C\u5F0F\u5316\u5168\u6587"],
+ ["format_selection", "\u683C\u5F0F\u5316\u9078\u4E2D\u90E8\u5206/\u7576\u524D\u884C"],
+ ["delete_blank_line", "\u522A\u9664\u9078\u4E2D\u90E8\u5206/\u5168\u6587\u7684\u591A\u9918\u7A7A\u767D\u884C"],
+ ["insert_codeblock", "\u63D2\u5165\u4EE3\u78BC\u584A"],
+ ["switch_autoformat", "\u5207\u63DB\u81EA\u52D5\u683C\u5F0F\u5316\u958B\u95DC"],
+ ["paste_wo_format", "\u7121\u683C\u5F0F\u5316\u7C98\u8CBC"]
+ ]);
+ let command_name_map_zh = /* @__PURE__ */ new Map([
+ ["format_article", "\u683C\u5F0F\u5316\u5168\u6587"],
+ ["format_selection", "\u683C\u5F0F\u5316\u9009\u4E2D\u90E8\u5206/\u5F53\u524D\u884C"],
+ ["delete_blank_line", "\u522A\u9664\u9009\u4E2D\u90E8\u5206/\u5168\u6587\u7684\u591A\u4F59\u7A7A\u767D\u884C"],
+ ["insert_codeblock", "\u63D2\u5165\u4EE3\u7801\u5757"],
+ ["switch_autoformat", "\u5207\u6362\u81EA\u52A8\u683C\u5F0F\u5316\u5F00\u5173"],
+ ["paste_wo_format", "\u65E0\u683C\u5F0F\u5316\u7C98\u8D34"]
+ ]);
+ let command_name_map_ru = /* @__PURE__ */ new Map([
+ ["format_article", "\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0430\u0442\u044C\u044E"],
+ ["format_selection", "\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \u0438\u043B\u0438 \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443"],
+ ["delete_blank_line", "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0443\u0441\u0442\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u043C \u0438\u043B\u0438 \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u0442\u044C\u0435"],
+ ["insert_codeblock", "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0431\u043B\u043E\u043A \u043A\u043E\u0434\u0430 \u0441/\u0431\u0435\u0437 \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C"],
+ ["switch_autoformat", "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435"],
+ ["paste_wo_format", "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0431\u0435\u0437 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F"]
+ ]);
+ let command_name_map = command_name_map_en;
+ if (lang == "zh") {
+ command_name_map = command_name_map_zh;
+ } else if (lang == "zh-TW") {
+ command_name_map = command_name_map_zh_TW;
+ } else if (lang == "ru") {
+ command_name_map = command_name_map_ru;
+ }
+ return command_name_map;
+ }
+ updateUserConvertRule(idx, before, after) {
+ if (idx >= this.settings.userConvertRulesStrList.length || idx < 0)
+ return;
+ this.settings.userConvertRulesStrList[idx][0] = before;
+ this.settings.userConvertRulesStrList[idx][1] = after;
+ this.refreshUserConvertRule();
+ }
+ async loadSettings() {
+ this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
+ }
+ async saveSettings() {
+ await this.saveData(this.settings);
+ }
+};
+//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3NwcmludGYtanMvc3JjL3NwcmludGYuanMiLCAic3JjL21haW4udHMiLCAic3JjL2NvcmUudHMiLCAic3JjL3V0aWxzLnRzIiwgInNyYy9zZXR0aW5ncy50cyIsICJzcmMvbGFuZy9sb2NhbGUvZW4tVVMudHMiLCAic3JjL2xhbmcvbG9jYWxlL3poLUNOLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9ydS1SVS50cyIsICJzcmMvbGFuZy9sb2NhbGUvemgtVFcudHMiLCAic3JjL3N5bnRheC50cyIsICJzcmMvdGFic3RvcHNfc3RhdGVfZmllbGQudHMiLCAic3JjL3RhYnN0b3AudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGdsb2JhbCB3aW5kb3csIGV4cG9ydHMsIGRlZmluZSAqL1xuXG4hZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnXG5cbiAgICB2YXIgcmUgPSB7XG4gICAgICAgIG5vdF9zdHJpbmc6IC9bXnNdLyxcbiAgICAgICAgbm90X2Jvb2w6IC9bXnRdLyxcbiAgICAgICAgbm90X3R5cGU6IC9bXlRdLyxcbiAgICAgICAgbm90X3ByaW1pdGl2ZTogL1tedl0vLFxuICAgICAgICBudW1iZXI6IC9bZGllZmddLyxcbiAgICAgICAgbnVtZXJpY19hcmc6IC9bYmNkaWVmZ3V4WF0vLFxuICAgICAgICBqc29uOiAvW2pdLyxcbiAgICAgICAgbm90X2pzb246IC9bXmpdLyxcbiAgICAgICAgdGV4dDogL15bXlxceDI1XSsvLFxuICAgICAgICBtb2R1bG86IC9eXFx4MjV7Mn0vLFxuICAgICAgICBwbGFjZWhvbGRlcjogL15cXHgyNSg/OihbMS05XVxcZCopXFwkfFxcKChbXildKylcXCkpPyhcXCspPygwfCdbXiRdKT8oLSk/KFxcZCspPyg/OlxcLihcXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLFxuICAgICAgICBrZXk6IC9eKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGtleV9hY2Nlc3M6IC9eXFwuKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGluZGV4X2FjY2VzczogL15cXFsoXFxkKylcXF0vLFxuICAgICAgICBzaWduOiAvXlsrLV0vXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ByaW50ZihrZXkpIHtcbiAgICAgICAgLy8gYGFyZ3VtZW50c2AgaXMgbm90IGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGZpbmUgZm9yIHRoaXMgY2FsbFxuICAgICAgICByZXR1cm4gc3ByaW50Zl9mb3JtYXQoc3ByaW50Zl9wYXJzZShrZXkpLCBhcmd1bWVudHMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdnNwcmludGYoZm10LCBhcmd2KSB7XG4gICAgICAgIHJldHVybiBzcHJpbnRmLmFwcGx5KG51bGwsIFtmbXRdLmNvbmNhdChhcmd2IHx8IFtdKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmX2Zvcm1hdChwYXJzZV90cmVlLCBhcmd2KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSAxLCB0cmVlX2xlbmd0aCA9IHBhcnNlX3RyZWUubGVuZ3RoLCBhcmcsIG91dHB1dCA9ICcnLCBpLCBrLCBwaCwgcGFkLCBwYWRfY2hhcmFjdGVyLCBwYWRfbGVuZ3RoLCBpc19wb3NpdGl2ZSwgc2lnblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJlZV9sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZV90cmVlW2ldID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBwYXJzZV90cmVlW2ldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGFyc2VfdHJlZVtpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBwaCA9IHBhcnNlX3RyZWVbaV0gLy8gY29udmVuaWVuY2UgcHVycG9zZXMgb25seVxuICAgICAgICAgICAgICAgIGlmIChwaC5rZXlzKSB7IC8vIGtleXdvcmQgYXJndW1lbnRcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltjdXJzb3JdXG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwaC5rZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdbc3ByaW50Zl0gQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBcIiVzXCIgb2YgdW5kZWZpbmVkIHZhbHVlIFwiJXNcIicsIHBoLmtleXNba10sIHBoLmtleXNbay0xXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdbcGgua2V5c1trXV1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwaC5wYXJhbV9ubykgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChleHBsaWNpdClcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltwaC5wYXJhbV9ub11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIHBvc2l0aW9uYWwgYXJndW1lbnQgKGltcGxpY2l0KVxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcisrXVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5ub3RfdHlwZS50ZXN0KHBoLnR5cGUpICYmIHJlLm5vdF9wcmltaXRpdmUudGVzdChwaC50eXBlKSAmJiBhcmcgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5udW1lcmljX2FyZy50ZXN0KHBoLnR5cGUpICYmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyAmJiBpc05hTihhcmcpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNwcmludGYoJ1tzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlVCcsIGFyZykpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzX3Bvc2l0aXZlID0gYXJnID49IDBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBoLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKS50b1N0cmluZygyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2onOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCBwaC53aWR0aCA/IHBhcnNlSW50KHBoLndpZHRoKSA6IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZykudG9FeHBvbmVudGlhbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0ZpeGVkKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gU3RyaW5nKE51bWJlcihhcmcudG9QcmVjaXNpb24ocGgucHJlY2lzaW9uKSkpIDogcGFyc2VGbG9hdChhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoOClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nKGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZyghIWFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKSA+Pj4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmUuanNvbi50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBhcmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS5udW1iZXIudGVzdChwaC50eXBlKSAmJiAoIWlzX3Bvc2l0aXZlIHx8IHBoLnNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gaXNfcG9zaXRpdmUgPyAnKycgOiAnLSdcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy50b1N0cmluZygpLnJlcGxhY2UocmUuc2lnbiwgJycpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcmFjdGVyID0gcGgucGFkX2NoYXIgPyBwaC5wYWRfY2hhciA9PT0gJzAnID8gJzAnIDogcGgucGFkX2NoYXIuY2hhckF0KDEpIDogJyAnXG4gICAgICAgICAgICAgICAgICAgIHBhZF9sZW5ndGggPSBwaC53aWR0aCAtIChzaWduICsgYXJnKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcGFkID0gcGgud2lkdGggPyAocGFkX2xlbmd0aCA+IDAgPyBwYWRfY2hhcmFjdGVyLnJlcGVhdChwYWRfbGVuZ3RoKSA6ICcnKSA6ICcnXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBwaC5hbGlnbiA/IHNpZ24gKyBhcmcgKyBwYWQgOiAocGFkX2NoYXJhY3RlciA9PT0gJzAnID8gc2lnbiArIHBhZCArIGFyZyA6IHBhZCArIHNpZ24gKyBhcmcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICB2YXIgc3ByaW50Zl9jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICAgIGZ1bmN0aW9uIHNwcmludGZfcGFyc2UoZm10KSB7XG4gICAgICAgIGlmIChzcHJpbnRmX2NhY2hlW2ZtdF0pIHtcbiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmX2NhY2hlW2ZtdF1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZm10ID0gZm10LCBtYXRjaCwgcGFyc2VfdHJlZSA9IFtdLCBhcmdfbmFtZXMgPSAwXG4gICAgICAgIHdoaWxlIChfZm10KSB7XG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gcmUudGV4dC5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaChtYXRjaFswXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLm1vZHVsby5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaCgnJScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSByZS5wbGFjZWhvbGRlci5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMVxuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRfbGlzdCA9IFtdLCByZXBsYWNlbWVudF9maWVsZCA9IG1hdGNoWzJdLCBmaWVsZF9tYXRjaCA9IFtdXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXkuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlcGxhY2VtZW50X2ZpZWxkID0gcmVwbGFjZW1lbnRfZmllbGQuc3Vic3RyaW5nKGZpZWxkX21hdGNoWzBdLmxlbmd0aCkpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXlfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmluZGV4X2FjY2Vzcy5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPSBmaWVsZF9saXN0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJnX25hbWVzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9ubzogICAgbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduOiAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcjogICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246ICAgbWF0Y2hbN10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAgbWF0Y2hbOF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXInKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZtdCA9IF9mbXQuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3ByaW50Zl9jYWNoZVtmbXRdID0gcGFyc2VfdHJlZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGV4cG9ydCB0byBlaXRoZXIgYnJvd3NlciBvciBub2RlLmpzXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHNbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgZXhwb3J0c1sndnNwcmludGYnXSA9IHZzcHJpbnRmXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3dbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgd2luZG93Wyd2c3ByaW50ZiddID0gdnNwcmludGZcblxuICAgICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICAgICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgJ3NwcmludGYnOiBzcHJpbnRmLFxuICAgICAgICAgICAgICAgICAgICAndnNwcmludGYnOiB2c3ByaW50ZlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBxdW90ZS1wcm9wcyAqL1xufSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4iLCAiaW1wb3J0IHtFZGl0b3IsIE1hcmtkb3duVmlldywgTWVudSwgTm90aWNlLCBQbGF0Zm9ybSwgUGx1Z2luLCBXb3Jrc3BhY2VMZWFmfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge0VkaXRvclNlbGVjdGlvbiwgRWRpdG9yU3RhdGUsIFByZWMsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblNwZWN9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7Q29udmVydFJ1bGUsIERFRkFVTFRfU0VUVElOR1MsIEVhc3lUeXBpbmdTZXR0aW5ncywgRWFzeVR5cGluZ1NldHRpbmdUYWIsIFBhaXJTdHJpbmd9IGZyb20gXCIuL3NldHRpbmdzXCJcbmltcG9ydCB7RWRpdG9yVmlldywga2V5bWFwLCBWaWV3VXBkYXRlfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB7XG5cdGdldFR5cGVTdHJPZlRyYW5zYWMsXG5cdG9mZnNldFRvUG9zLFxuXHRwcmludCxcblx0cnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QsXG5cdHN0cmluZzJwYWlyc3RyaW5nLFxuXHRpc1JlZ2V4cCxcblx0cmVwbGFjZVBsYWNlaG9sZGVycyxcblx0cGFyc2VUaGVBZnRlclBhdHRlcm5cbn0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7Z2V0UG9zTGluZVR5cGUsIGdldFBvc0xpbmVUeXBlMiwgTGluZUZvcm1hdGVyLCBMaW5lVHlwZX0gZnJvbSAnLi9jb3JlJ1xuaW1wb3J0IHtlbnN1cmVTeW50YXhUcmVlLCBzeW50YXhUcmVlfSBmcm9tIFwiQGNvZGVtaXJyb3IvbGFuZ3VhZ2VcIjtcbmltcG9ydCB7IHNlbGVjdENvZGVCbG9ja0luUG9zLCBpc0NvZGVCbG9ja0luUG9zIH0gZnJvbSAnLi9zeW50YXgnO1xuaW1wb3J0IHsgY29uc3VtZUFuZEdvdG9OZXh0VGFic3RvcCwgdGFic3RvcHNTdGF0ZUZpZWxkLCBpc0luc2lkZUFUYWJzdG9wLCByZW1vdmVBbGxUYWJzdG9wcywgYWRkVGFic3RvcHNBbmRTZWxlY3QsIGFkZFRhYnN0b3BzLCBhZGRUYWJzdG9wc0VmZmVjdCwgaXNJbnNpZGVDdXJUYWJzdG9wIH0gZnJvbSAnLi90YWJzdG9wc19zdGF0ZV9maWVsZCc7XG5pbXBvcnQgeyB0YWJzdG9wU3BlY3NUb1RhYnN0b3BHcm91cHMgfSBmcm9tICcuL3RhYnN0b3AnO1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVhc3lUeXBpbmdQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogRWFzeVR5cGluZ1NldHRpbmdzO1xuXHRzZWxlY3Rpb25SZXBsYWNlTWFwSW5pdGFsRGF0YTogW3N0cmluZywgUGFpclN0cmluZ11bXTtcblx0U2VsZWN0aW9uUmVwbGFjZU1hcDogTWFwPHN0cmluZywgUGFpclN0cmluZz47XG5cdFN5bWJvbFBhaXJzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXHRoYWxmVG9GdWxsU3ltYm9sTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXHRCYXNpY0NvbnZSdWxlczogQ29udmVydFJ1bGVbXTtcblx0RlcySFdTeW1ib2xSdWxlczogQ29udmVydFJ1bGVbXTtcblx0Rm9ybWF0ZXI6IExpbmVGb3JtYXRlcjtcblx0SW50cmluc2ljRGVsZXRlUnVsZXM6IENvbnZlcnRSdWxlW107XG5cdEludHJpbnNpY0F1dG9QYWlyUnVsZXNQYXRjaDogQ29udmVydFJ1bGVbXTtcblx0Q3VyQWN0aXZlTWFya2Rvd246IHN0cmluZztcblxuXHRVc2VyRGVsZXRlUnVsZXM6IENvbnZlcnRSdWxlW107XG5cdFVzZXJDb252ZXJ0UnVsZXM6IENvbnZlcnRSdWxlW107XG5cdGxhbmc6IHN0cmluZztcblxuXHRjb21wb3NlX2JlZ2luX3BvczogbnVtYmVyO1xuXHRjb21wb3NlX2VuZF9wb3M6IG51bWJlcjtcblx0Y29tcG9zZV9uZWVkX2hhbmRsZTogYm9vbGVhbjtcblxuXHRvbkZvcm1hdEFydGljbGU6IGJvb2xlYW47XG5cdFRhYm91dFBhaXJTdHJzOiBQYWlyU3RyaW5nW107XG5cblxuXHRhc3luYyBvbmxvYWQoKSB7XG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblx0XHR0aGlzLnNlbGVjdGlvblJlcGxhY2VNYXBJbml0YWxEYXRhID0gW1xuXHRcdFx0W1wiXHUzMDEwXCIsIHsgbGVmdDogXCJbXCIsIHJpZ2h0OiBcIl1cIiB9XSwgW1wiXHVGRkU1XCIsIHsgbGVmdDogXCIkXCIsIHJpZ2h0OiBcIiRcIiB9XSwgW1wiXHUwMEI3XCIsIHsgbGVmdDogXCJgXCIsIHJpZ2h0OiBcImBcIiB9XSwgWydcdTAwQTUnLCB7IGxlZnQ6IFwiJFwiLCByaWdodDogXCIkXCIgfV0sXG5cdFx0XHRbXCJcdTMwMEFcIiwgeyBsZWZ0OiBcIlx1MzAwQVwiLCByaWdodDogXCJcdTMwMEJcIiB9XSwgW1wiXHUyMDFDXCIsIHsgbGVmdDogXCJcdTIwMUNcIiwgcmlnaHQ6IFwiXHUyMDFEXCIgfV0sIFtcIlx1MjAxRFwiLCB7IGxlZnQ6IFwiXHUyMDFDXCIsIHJpZ2h0OiBcIlx1MjAxRFwiIH1dLCBbXCJcdUZGMDhcIiwgeyBsZWZ0OiBcIlx1RkYwOFwiLCByaWdodDogXCJcdUZGMDlcIiB9XSxcblx0XHRcdFtcIjxcIiwgeyBsZWZ0OiBcIjxcIiwgcmlnaHQ6IFwiPlwiIH1dXG5cdFx0XTtcblx0XHR0aGlzLnJlZnJlc2hTZWxlY3Rpb25SZXBsYWNlUnVsZSgpO1xuXHRcdHRoaXMuU3ltYm9sUGFpcnNNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHRcdGxldCBTeW1ib2xQYWlycyA9IFtcIlx1MzAxMFx1MzAxMVwiLCBcIlx1RkYwOFx1RkYwOVwiLCBcIlx1MzAwQVx1MzAwQlwiLCBcIlx1MjAxQ1x1MjAxRFwiLCBcIlx1MjAxOFx1MjAxOVwiLCBcIlx1MzAwQ1x1MzAwRFwiLCBcIlx1MzAwRVx1MzAwRlwiLCAnW10nLCAnKCknLCAne30nLCAnXCJcIicsIFwiJydcIl1cblx0XHRmb3IgKGxldCBwYWlyU3RyIG9mIFN5bWJvbFBhaXJzKSB0aGlzLlN5bWJvbFBhaXJzTWFwLnNldChwYWlyU3RyLmNoYXJBdCgwKSwgcGFpclN0ci5jaGFyQXQoMSkpO1xuXG5cdFx0dGhpcy5oYWxmVG9GdWxsU3ltYm9sTWFwID0gbmV3IE1hcChbXG5cdFx0XHRbXCIuXCIsIFwiXHUzMDAyXCJdLFxuXHRcdFx0W1wiLFwiLCBcIlx1RkYwQ1wiXSxcblx0XHRcdFsnPycsICdcdUZGMUYnXSxcblx0XHRcdFsnIScsICdcdUZGMDEnXVxuXHRcdF0pO1xuXG5cdFx0bGV0IEJhc2ljQ29udlJ1bGVTdHJpbmdMaXN0OiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtbJ1x1MDBCN1x1MDBCN3wnLCAnYHxgJ10sIFtcIlx1RkYwMVx1MzAxMFx1MzAxMHxcdTMwMTFcIiwnIVtbfF1dJ10sWydcdUZGMDFcdTMwMTBcdTMwMTB8JywgJyFbW3xdXSddLFxuXHRcdFtcIlx1MzAxMFx1MzAxMHxcdTMwMTFcIiwgXCJbW3xdXVwiXSwgWydcdTMwMTBcdTMwMTB8JywgXCJbW3xdXVwiXSwgWydcdUZGRTVcdUZGRTV8JywgJyR8JCddLCBbJyRcdUZGRTV8JCcsIFwiJCRcXG58XFxuJCRcIl0sWydcdTAwQTVcdTAwQTV8JywnJHwkJ10sIFsnJFx1MDBBNXwkJywgXCIkJFxcbnxcXG4kJFwiXSxbXCIkJHwkXCIsIFwiJCRcXG58XFxuJCRcIl0sIFsnJCR8JywgXCIkfCRcIl0sXG5cdFx0W1wiPlx1MzAwQnxcIiwgXCI+PnxcIl0sIFsnXFxuXHUzMDBCfCcsIFwiXFxuPnxcIl0sIFtcIiBcdTMwMEJ8XCIsIFwiID58XCJdLCBbXCJcXG5cdTMwMDF8XCIsIFwiXFxuL3xcIl1dO1xuXHRcdHRoaXMuQmFzaWNDb252UnVsZXMgPSBydWxlU3RyaW5nTGlzdDJSdWxlTGlzdChCYXNpY0NvbnZSdWxlU3RyaW5nTGlzdCk7XG5cdFx0bGV0IEZXMkhXU3ltYm9sUnVsZXNTdHJMaXN0OiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtbXCJcdTMwMDJcdTMwMDJ8XCIsIFwiLnxcIl0sIFtcIlx1RkYwMVx1RkYwMXxcIiwgXCIhfFwiXSwgW1wiXHVGRjFCXHVGRjFCfFwiLCBcIjt8XCJdLCBbXCJcdUZGMENcdUZGMEN8XCIsIFwiLHxcIl0sXG5cdFx0W1wiXHVGRjFBXHVGRjFBfFwiLCBcIjp8XCJdLCBbJ1x1RkYxRlx1RkYxRnwnLCAnP3wnXSwgWydcdUZGMDhcdUZGMDh8XHVGRjA5JywgXCIofClcIl0sIFsnXHVGRjA4XHVGRjA4fCcsICcofCknXSwgW1wiXHUyMDFDXHUyMDFDfFx1MjAxRFwiLCBcIlxcXCJ8XFxcIlwiXSwgW1wiXHUyMDFDXHUyMDFEfFx1MjAxRFwiLCBcIlxcXCJ8XFxcIlwiXSwgW1wiXHUyMDE4XHUyMDE4fFx1MjAxOVwiLCBcIid8J1wiXSwgW1wiXHUyMDE4XHUyMDE5fFx1MjAxOVwiLCBcIid8J1wiXSxcblx0XHRbXCJcdTMwMEJcdTMwMEJ8XCIsIFwiPnxcIl0sIFtcIlx1MzAwQVx1MzAwQXxcdTMwMEJcIiwgXCI8fFwiXSwgWydcdTMwMEFcdTMwMEF8JywgXCI8fFwiXV07XG5cdFx0dGhpcy5GVzJIV1N5bWJvbFJ1bGVzID0gcnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QoRlcySFdTeW1ib2xSdWxlc1N0ckxpc3QpO1xuXHRcdGxldCBmdzJod19ydWxlXzA6IENvbnZlcnRSdWxlID0ge2JlZm9yZTp7bGVmdDonXHVGRjVDXHVGRjVDJywgcmlnaHQ6Jyd9LCBhZnRlcjp7bGVmdDonfCcsIHJpZ2h0OicnfX07XG5cdFx0dGhpcy5GVzJIV1N5bWJvbFJ1bGVzLnB1c2goZncyaHdfcnVsZV8wKVxuXG5cdFx0bGV0IERlbGV0ZVJ1bGVzU3RyTGlzdDogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbW1wiJHwkXCIsIFwifFwiXSwgWyc9PXw9PScsICd8J10sIFsnJCRcXG58XFxuJCQnLCBcInxcIl1dO1xuXHRcdHRoaXMuSW50cmluc2ljRGVsZXRlUnVsZXMgPSBydWxlU3RyaW5nTGlzdDJSdWxlTGlzdChEZWxldGVSdWxlc1N0ckxpc3QpO1xuXG5cdFx0bGV0IGF1dG9QYWlyUnVsZXNQYXRjaFN0ckxpc3Q6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW1tcIlx1MzAxMFx1MzAxMXxcdTMwMTFcIiwgXCJcdTMwMTBcdTMwMTF8XCJdLCBbXCJcdUZGMDhcdUZGMDl8XHVGRjA5XCIsIFwiXHVGRjA4XHVGRjA5fFwiXSxcblx0XHRbXCI8Pnw+XCIsIFwiPD58XCJdLCBbXCJcdTMwMEFcdTMwMEJ8XHUzMDBCXCIsIFwiXHUzMDBBXHUzMDBCfFwiXSwgW1wiXHUzMDBDXHUzMDBEfFx1MzAwRFwiLCBcIlx1MzAwQ1x1MzAwRHxcIl0sIFtcIlx1MzAwRVx1MzAwRnxcdTMwMEZcIiwgXCJcdTMwMEVcdTMwMEZ8XCJdLCBbXCIoKXwpXCIsIFwiKCl8XCJdLCBbJ1tdfF0nLCAnW118J10sXG5cdFx0W1wie318fVwiLCBcInt9fFwiXSwgW1wiJyd8J1wiLCBcIicnfFwiXSwgWydcIlwifFwiJywgJ1wiXCJ8J10sXG5cdFx0XTtcblx0XHR0aGlzLkludHJpbnNpY0F1dG9QYWlyUnVsZXNQYXRjaCA9IHJ1bGVTdHJpbmdMaXN0MlJ1bGVMaXN0KGF1dG9QYWlyUnVsZXNQYXRjaFN0ckxpc3QpO1xuXG5cdFx0bGV0IFRhYm91dFBhaXJTdHJzID0gW1wiXHUzMDEwfFx1MzAxMVwiLCBcIlx1RkYwOHxcdUZGMDlcIiwgXCJcdTMwMEF8XHUzMDBCXCIsIFwiXHUyMDFDfFx1MjAxRFwiLCBcIlx1MjAxOHxcdTIwMTlcIiwgXG5cdFx0XHRcdFx0XHQgICBcIlx1MzAwQ3xcdTMwMERcIiwgXCJcdTMwMEV8XHUzMDBGXCIsIFwiJ3wnXCIsIFwiXFxcInxcXFwiXCIsIFwiJCR8JCRcIiwgJyR8JCcsICdfX3xfXycsICdffF8nLFxuXHRcdFx0XHRcdFx0XHRcIj09fD09XCIsIFwifn58fn5cIiwgXCIqKnwqKlwiLCAnKnwqJywgXCJbW3xdXVwiLCAnW3xdJyxcInt8fVwiLCBcIih8KVwiLCBcIjx8PlwiXTtcblx0XHR0aGlzLlRhYm91dFBhaXJTdHJzID0gVGFib3V0UGFpclN0cnMubWFwKChzOnN0cmluZyk9PnN0cmluZzJwYWlyc3RyaW5nKHMpKTtcblxuXHRcdHRoaXMucmVmcmVzaFVzZXJEZWxldGVSdWxlKCk7XG5cdFx0dGhpcy5yZWZyZXNoVXNlckNvbnZlcnRSdWxlKCk7XG5cblx0XHR0aGlzLkN1ckFjdGl2ZU1hcmtkb3duID0gXCJcIjtcblxuXHRcdHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5Gb3JtYXRlciA9IG5ldyBMaW5lRm9ybWF0ZXIoKTtcblxuXHRcdHRoaXMub25Gb3JtYXRBcnRpY2xlID0gZmFsc2U7XG5cblx0XHR0aGlzLnJlZ2lzdGVyRWRpdG9yRXh0ZW5zaW9uKFtcblx0XHRcdEVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRmlsdGVyLm9mKHRoaXMudHJhbnNhY3Rpb25GaWx0ZXJQbHVnaW4pLFxuXHRcdFx0RWRpdG9yVmlldy51cGRhdGVMaXN0ZW5lci5vZih0aGlzLnZpZXdVcGRhdGVQbHVnaW4pLFxuXHRcdFx0UHJlYy5oaWdoZXN0KEVkaXRvclZpZXcuZG9tRXZlbnRIYW5kbGVycyh7XG5cdFx0XHRcdFwia2V5dXBcIjogdGhpcy5vbktleXVwXG5cdFx0XHR9KSksXG5cdFx0XHR0YWJzdG9wc1N0YXRlRmllbGQuZXh0ZW5zaW9uLFxuXHRcdF0pO1xuXG5cblx0XHR0aGlzLnJlZ2lzdGVyRWRpdG9yRXh0ZW5zaW9uKFByZWMuaGlnaGVzdChrZXltYXAub2YoW1xuXHRcdFx0e1xuXHRcdFx0XHRrZXk6IFwiVGFiXCIsXG5cdFx0XHRcdHJ1bjogKHZpZXc6IEVkaXRvclZpZXcpOiBib29sZWFuID0+IHtcblx0XHRcdFx0XHRjb25zdCBzdWNjZXNzID0gdGhpcy5oYW5kbGVUYWJEb3duKHZpZXcpO1xuXHRcdFx0XHRcdHJldHVybiBzdWNjZXNzO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRrZXk6IFwiRW50ZXJcIixcblx0XHRcdFx0cnVuOiAodmlldzogRWRpdG9yVmlldyk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmhhbmRsZUVudGVyKHZpZXcpO1xuXHRcdFx0XHRcdHJldHVybiBzdWNjZXNzO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRrZXk6IFwiTW9kLWFcIiwgXG5cdFx0XHRcdHJ1bjogKHZpZXc6IEVkaXRvclZpZXcpOiBib29sZWFuID0+IHtcblx0XHRcdFx0XHRjb25zdCBzdWNjZXNzID0gdGhpcy5oYW5kbGVNb2RBSW5Db2RlQmxvY2sodmlldyk7XG5cdFx0XHRcdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdKSkpO1xuXG5cdFx0dGhpcy5sYW5nID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYW5ndWFnZScpO1xuXHRcdGxldCBjb21tYW5kX25hbWVfbWFwID0gdGhpcy5nZXRDb21tYW5kTmFtZU1hcCgpO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLWZvcm1hdC1hcnRpY2xlXCIsXG5cdFx0XHRuYW1lOiBjb21tYW5kX25hbWVfbWFwLmdldChcImZvcm1hdF9hcnRpY2xlXCIpLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0QXJ0aWNsZShlZGl0b3IsIHZpZXcpO1xuXHRcdFx0fSxcblx0XHRcdGhvdGtleXM6IFt7XG5cdFx0XHRcdG1vZGlmaWVyczogWydDdHJsJywgJ1NoaWZ0J10sXG5cdFx0XHRcdGtleTogXCJzXCJcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLWZvcm1hdC1zZWxlY3Rpb25cIixcblx0XHRcdG5hbWU6IGNvbW1hbmRfbmFtZV9tYXAuZ2V0KFwiZm9ybWF0X3NlbGVjdGlvblwiKSxcblx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuXHRcdFx0XHR0aGlzLmZvcm1hdFNlbGVjdGlvbk9yQ3VyTGluZShlZGl0b3IsIHZpZXcpO1xuXHRcdFx0fSxcblx0XHRcdGhvdGtleXM6IFt7XG5cdFx0XHRcdG1vZGlmaWVyczogWydDdHJsJywgJ1NoaWZ0J10sXG5cdFx0XHRcdGtleTogXCJsXCJcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLWRlbGV0ZS1ibGFuay1saW5lXCIsXG5cdFx0XHRuYW1lOiBjb21tYW5kX25hbWVfbWFwLmdldChcImRlbGV0ZV9ibGFua19saW5lXCIpLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMuZGVsZXRlQmxhbmtMaW5lcyhlZGl0b3IpO1xuXHRcdFx0fSxcblx0XHRcdGhvdGtleXM6IFt7XG5cdFx0XHRcdG1vZGlmaWVyczogWydDdHJsJywgJ1NoaWZ0J10sXG5cdFx0XHRcdGtleTogXCJrXCJcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLWluc2VydC1jb2RlYmxvY2tcIixcblx0XHRcdG5hbWU6IGNvbW1hbmRfbmFtZV9tYXAuZ2V0KFwiaW5zZXJ0X2NvZGVibG9ja1wiKSxcblx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuXHRcdFx0XHR0aGlzLmNvbnZlcnQyQ29kZUJsb2NrKGVkaXRvcik7XG5cdFx0XHR9LFxuXHRcdFx0aG90a2V5czogW3tcblx0XHRcdFx0bW9kaWZpZXJzOiBbJ0N0cmwnLCAnU2hpZnQnXSxcblx0XHRcdFx0a2V5OiBcIm5cIlxuXHRcdFx0fV0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwiZWFzeS10eXBpbmctZm9ybWF0LXN3aXRjaFwiLFxuXHRcdFx0bmFtZTogY29tbWFuZF9uYW1lX21hcC5nZXQoXCJzd2l0Y2hfYXV0b2Zvcm1hdFwiKSxcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB0aGlzLnN3aXRjaEF1dG9Gb3JtYXR0aW5nKCksXG5cdFx0XHRob3RrZXlzOiBbe1xuXHRcdFx0XHRtb2RpZmllcnM6IFsnQ3RybCddLFxuXHRcdFx0XHRrZXk6IFwidGFiXCJcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcImVhc3ktdHlwaW5nLXBhc3RlLXdpdGhvdXQtZm9ybWF0XCIsXG5cdFx0XHRuYW1lOiBjb21tYW5kX25hbWVfbWFwLmdldChcInBhc3RlX3dvX2Zvcm1hdFwiKSxcblx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yKSA9PiB0aGlzLm5vcm1hbFBhc3RlKGVkaXRvciksXG5cdFx0XHRob3RrZXlzOiBbXG5cdFx0XHQgIHtcblx0XHRcdFx0bW9kaWZpZXJzOiBbXCJNb2RcIiwgXCJTaGlmdFwiXSxcblx0XHRcdFx0a2V5OiBcInZcIixcblx0XHRcdCAgfSxcblx0XHRcdF0sXG5cdFx0ICB9KTtcblxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBFYXN5VHlwaW5nU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgKGxlYWY6IFdvcmtzcGFjZUxlYWYpID0+IHtcblx0XHRcdGlmIChsZWFmLnZpZXcuZ2V0Vmlld1R5cGUoKSA9PSAnbWFya2Rvd24nKSB7XG5cdFx0XHRcdGxldCBmaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblx0XHRcdFx0aWYgKGZpbGUgIT0gbnVsbCAmJiB0aGlzLkN1ckFjdGl2ZU1hcmtkb3duICE9IGZpbGUucGF0aCkge1xuXHRcdFx0XHRcdHRoaXMuQ3VyQWN0aXZlTWFya2Rvd24gPSBmaWxlLnBhdGg7XG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpXG5cdFx0XHRcdFx0XHRuZXcgTm90aWNlKCduZXcgbWQtZmlsZSBvcGVuOiAnICsgZmlsZS5wYXRoKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSkpO1xuXG5cdFx0Ly9cdTUyMjRcdTY1QURcdTVGNTNcdTUyNERcdTY2MkZcdTU0MjZcdTRFM0FNQUNcdTdDRkJcdTdFREZcblx0XHRpZiAoUGxhdGZvcm0uaXNNYWNPUyAmJiB0aGlzLnNldHRpbmdzLkZpeE1hY09TQ29udGV4dE1lbnUpIHtcblx0XHRcdC8vIFx1NjhDMFx1NkQ0Qlx1OUYyMFx1NjgwN1x1NTNGM1x1OTUyRVx1NTQ3Q1x1NTFGQVx1ODNEQ1x1NTM1NVx1NzY4NFx1NEU4Qlx1NEVGNlxuXHRcdFx0dGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZWRpdG9yLW1lbnUnLCAobWVudTogTWVudSwgZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldykgPT4ge1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnZWRpdG9yLW1lbnUnLCBtZW51LCBlZGl0b3IsIHZpZXcpO1xuXHRcdFx0XHRpZiAoZWRpdG9yLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoICE9IDEpIHJldHVybjtcblx0XHRcdFx0bGV0IHNlbGVjdGlvbiA9IGVkaXRvci5saXN0U2VsZWN0aW9ucygpWzBdO1xuXHRcdFx0XHRsZXQgc2VsZWN0ZWQgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdzZWxlY3RlZCcsIHNlbGVjdGVkLCBzZWxlY3RlZD09J1xcbicpO1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnc2VsZWN0aW9uJywgc2VsZWN0aW9uKTtcblx0XHRcdFx0aWYgKHNlbGVjdGVkPT0nXFxuJylcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLmFuY2hvciwgc2VsZWN0aW9uLmFuY2hvcik7XG5cdFx0XHRcdH1cblx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHQvLyB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCAoZmlsZTogVEZpbGUgfCBudWxsKSA9PiB7XG5cdFx0Ly8gXHRpZiAoZmlsZSAhPSBudWxsKSB7XG5cdFx0Ly8gXHRcdGxldCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvcigpO1xuXHRcdC8vIFx0XHRpZiAoZWRpdG9yID09PSBudWxsKSByZXR1cm47XG5cdFx0Ly8gXHRcdHRoaXMuQ29udGVudFBhcnNlci5wYXJzZU5ld0FydGljbGUoZWRpdG9yLmdldFZhbHVlKCkpO1xuXHRcdC8vIFx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Zykge1xuXHRcdC8vIFx0XHRcdG5ldyBOb3RpY2UoXCJFYXN5VHlwaW5nOiBQYXJzZSBOZXcgQXJ0aWNsZTogXCIgKyBmaWxlLnZhdWx0LmdldE5hbWUoKSArICcvJyArIGZpbGUucGF0aCk7XG5cdFx0Ly8gXHRcdFx0Ly8gaWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIHRoaXMuQ29udGVudFBhcnNlci5wcmludCgpO1xuXHRcdC8vIFx0XHR9XG5cdFx0Ly8gXHR9XG5cdFx0Ly8gfSkpO1xuXHRcdGNvbnNvbGUubG9nKFwiRWFzeSBUeXBpbmcgUGx1Z2luIGxvYWRlZC5cIilcblx0fVxuXG5cdG9udW5sb2FkKCkge1xuXHRcdGNvbnNvbGUubG9nKFwiRWFzeSBUeXBpbmcgUGx1Z2luIHVubG9hZGVkLlwiKVxuXHR9XG5cblx0Z2V0RGVmYXVsdEluZGVudENoYXIgPSAoKSA9PiB7XG5cdFx0Ly8gY29uc29sZS5sb2coJ3VzZVRhYiwgdGFiU2l6ZScsIHRoaXMuYXBwLnZhdWx0LmNvbmZpZy51c2VUYWIsIHRoaXMuYXBwLnZhdWx0LmNvbmZpZy50YWJTaXplKTtcblx0XHRsZXQgdXNlVGFiID0gdGhpcy5hcHAudmF1bHQuY29uZmlnLnVzZVRhYiA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdGxldCB0YWJTaXplID0gdGhpcy5hcHAudmF1bHQuY29uZmlnLnRhYlNpemUgPT0gdW5kZWZpbmVkID8gNCA6IHRoaXMuYXBwLnZhdWx0LmNvbmZpZy50YWJTaXplO1xuXHRcdGxldCBkZWZhdWx0X2luZGVudCA9IHVzZVRhYiA/ICdcXHQnIDogJyAnLnJlcGVhdCh0YWJTaXplKTtcblx0XHRyZXR1cm4gZGVmYXVsdF9pbmRlbnQ7XG5cdH1cblxuXHR0cmFuc2FjdGlvbkZpbHRlclBsdWdpbiA9ICh0cjogVHJhbnNhY3Rpb24pOiBUcmFuc2FjdGlvblNwZWMgfCByZWFkb25seSBUcmFuc2FjdGlvblNwZWNbXSA9PiB7XG5cdFx0Y29uc3QgY2hhbmdlczogVHJhbnNhY3Rpb25TcGVjW10gPSBbXTtcblx0XHRpZiAoIXRyLmRvY0NoYW5nZWQpIHJldHVybiB0cjtcblx0XHRsZXQgc2VsZWN0ZWQgPSB0ci5zdGFydFN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW4uYW5jaG9yICE9IHRyLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLmFzU2luZ2xlKCkubWFpbi5oZWFkO1xuXG5cdFx0bGV0IGNoYW5nZVR5cGVTdHIgPSBnZXRUeXBlU3RyT2ZUcmFuc2FjKHRyKTtcblxuXHRcdHRyLmNoYW5nZXMuaXRlckNoYW5nZXMoKGZyb21BLCB0b0EsIGZyb21CLCB0b0IsIGluc2VydGVkKSA9PiB7XG5cdFx0XHRsZXQgY2hhbmdlZFN0ciA9IHRyLnN0YXJ0U3RhdGUuc2xpY2VEb2MoZnJvbUEsIHRvQSk7XG5cdFx0XHRsZXQgY2hhbmdlc3RyXyA9IGNoYW5nZWRTdHIucmVwbGFjZSgvXFxzL2csICcwJylcblx0XHRcdGxldCBpbnNlcnRlZFN0ciA9IGluc2VydGVkLnNsaWNlU3RyaW5nKDApO1xuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnNvbGUubG9nKFwiW1RyYW5zYWN0aW9uRmlsdGVyXSB0eXBlLCBmcm9tQSwgdG9BLCBjaGFuZ2VkLCBmcm9tQiwgdG9CLCBpbnNlcnRlZFwiKTtcblx0XHRcdFx0Y29uc29sZS5sb2coY2hhbmdlVHlwZVN0ciwgZnJvbUEsIHRvQSwgY2hhbmdlZFN0cixmcm9tQiwgdG9CLCBpbnNlcnRlZFN0cik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFx1ODg2OFx1NjgzQ1x1N0YxNlx1OEY5MVx1NjVGNlx1NzZGNFx1NjNBNVx1OEZENFx1NTZERVx1RkYwQ1x1ODlFM1x1NTFCM1x1ODg2OFx1NjgzQ1x1NTE4NVx1NUJCOVx1N0YxNlx1OEY5MVx1NjcwOVx1NjVGNlx1NTAxOVx1NEYxQVx1OERGM1x1NTFGQVx1ODA1QVx1NzEyNlx1NzJCNlx1NjAwMVx1NzY4NCBCdWdcblx0XHRcdGlmIChnZXRQb3NMaW5lVHlwZSh0ci5zdGFydFN0YXRlLCBmcm9tQSk9PUxpbmVUeXBlLnRhYmxlKSByZXR1cm4gdHI7XG5cblx0XHRcdC8vID09PT09PT09PT0gU2VsZWN0aW9uIFJlcGxhY2UgPT09PT09PT09PT09XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5TZWxlY3Rpb25FbmhhbmNlKSB7XG5cdFx0XHRcdGlmICgoY2hhbmdlVHlwZVN0ciA9PSAnaW5wdXQudHlwZScgfHwgY2hhbmdlVHlwZVN0ciA9PSBcImlucHV0LnR5cGUuY29tcG9zZVwiKSAmJiBmcm9tQSAhPSB0b0EgJiYgKChmcm9tQiArIDEgPT09IHRvQil8fGluc2VydGVkU3RyPT0nXHUyMDE0XHUyMDE0J3x8aW5zZXJ0ZWRTdHI9PSdcdTIwMjZcdTIwMjYnKSkge1xuXHRcdFx0XHRcdGlmICh0aGlzLlNlbGVjdGlvblJlcGxhY2VNYXAuaGFzKGluc2VydGVkU3RyKSkge1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHsgY2hhbmdlczogeyBmcm9tOiBmcm9tQSwgaW5zZXJ0OiB0aGlzLlNlbGVjdGlvblJlcGxhY2VNYXAuZ2V0KGluc2VydGVkU3RyKT8ubGVmdCB9LCB1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIiB9KVxuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHsgY2hhbmdlczogeyBmcm9tOiB0b0EsIGluc2VydDogdGhpcy5TZWxlY3Rpb25SZXBsYWNlTWFwLmdldChpbnNlcnRlZFN0cik/LnJpZ2h0IH0sIHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiIH0pXG5cdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBcdTU3MjhcdTRFRTNcdTc4MDFcdTU3NTdcdTRFMkRcdTdDOThcdThEMzRcdTY1RjZcdTY2N0FcdTgwRkRcdTZERkJcdTUyQTBcdTdGMjlcdThGREJcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLkJldHRlckNvZGVFZGl0ICYmIGNoYW5nZVR5cGVTdHIuY29udGFpbnMoJ3Bhc3RlJykgJiYgZnJvbUE9PWZyb21CICYmIFxuXHRcdFx0XHRcdGlzQ29kZUJsb2NrSW5Qb3ModHIuc3RhcnRTdGF0ZSwgZnJvbUEpKXtcblx0XHRcdFx0cHJpbnQoXCJcdTY4QzBcdTZENEJcdTUyMzBcdTU3MjhcdTRFRTNcdTc4MDFcdTU3NTdcdTRFMkRcdTdDOThcdThEMzRcIilcblx0XHRcdFx0bGV0IGxpbmUgPSB0ci5zdGFydFN0YXRlLmRvYy5saW5lQXQoZnJvbUIpLnRleHQ7XG5cdFx0XHRcdGxldCBpbmRlbnRfc3BhY2UgPSBsaW5lLm1hdGNoKC9eXFxzKi8pWzBdLmxlbmd0aDtcblx0XHRcdFx0bGV0IGluc2VydGVkX2xpbmVzID0gaW5zZXJ0ZWRTdHIuc3BsaXQoJ1xcbicpO1xuXHRcdFx0XHRsZXQgZXh0cmFfaW5kZW50ID0gJyc7XG5cdFx0XHRcdGlmKGluc2VydGVkX2xpbmVzLmxlbmd0aD4xKXtcblx0XHRcdFx0XHRsZXQgZmlyc3RfbGluZSA9IGluc2VydGVkX2xpbmVzWzBdLnRyaW1TdGFydCgpO1xuXHRcdFx0XHRcdC8vIGlmIChmaXJzdF9saW5lLmVuZHNXaXRoKCd7JykgfHwgZmlyc3RfbGluZS5lbmRzV2l0aCgnKCcpIHx8IGZpcnN0X2xpbmUuZW5kc1dpdGgoJ1snKVxuXHRcdFx0XHRcdC8vIFx0fHwgZmlyc3RfbGluZS5lbmRzV2l0aCgnOicpKXtcblx0XHRcdFx0XHQvLyBcdGV4dHJhX2luZGVudCA9IHRoaXMuZ2V0RGVmYXVsdEluZGVudENoYXIoKTtcblx0XHRcdFx0XHQvLyB9XG5cdFx0XHRcdFx0bGV0IHJlc3RfbGluZXMgPSBpbnNlcnRlZF9saW5lcy5zbGljZSgxKTtcblx0XHRcdFx0XHQvLyBmaW5kIHRoZSBtaW5pbXVtIGluZGVudCBzcGFjZSBpbiByZXN0IGxpbmVzXG5cdFx0XHRcdFx0bGV0IG1pbl9pbmRlbnRfc3BhY2UgPSBJbmZpbml0eTtcblx0XHRcdFx0XHRmb3IgKGxldCBsaW5lIG9mIHJlc3RfbGluZXMpe1xuXHRcdFx0XHRcdFx0bGV0IGluZGVudCA9IGxpbmUubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoO1xuXHRcdFx0XHRcdFx0aWYgKCEvXlxccyokLy50ZXN0KGxpbmUpICYmIGluZGVudDxtaW5faW5kZW50X3NwYWNlKSBtaW5faW5kZW50X3NwYWNlID0gaW5kZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsZXQgbmV3X3Jlc3RfbGluZXMgPSByZXN0X2xpbmVzLm1hcCgobGluZTpzdHJpbmcpPT5saW5lLnN1YnN0cmluZyhtaW5faW5kZW50X3NwYWNlKSk7XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0bmV3X3Jlc3RfbGluZXMgPSBuZXdfcmVzdF9saW5lcy5tYXAoXG5cdFx0XHRcdFx0XHQobGluZTpzdHJpbmcpPT5saW5lLnJlcGxhY2UoL1tcXHRdL2csIHRoaXMuZ2V0RGVmYXVsdEluZGVudENoYXIoKSkpO1xuXHRcdFx0XHRcdGxldCBmaW5hbF9yZXN0X2xpbmVzID0gbmV3X3Jlc3RfbGluZXMubWFwKChsaW5lOnN0cmluZyk9PicgJy5yZXBlYXQoaW5kZW50X3NwYWNlKStleHRyYV9pbmRlbnQrbGluZSk7XG5cdFx0XHRcdFx0bGV0IG5ld19pbnNlcnRlZFN0ciA9IGZpcnN0X2xpbmUrJ1xcbicrZmluYWxfcmVzdF9saW5lcy5qb2luKCdcXG4nKTtcblx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhbmdlczoge2Zyb206IGZyb21BLCB0bzogdG9BLCBpbnNlcnQ6IG5ld19pbnNlcnRlZFN0cn0sXG5cdFx0XHRcdFx0XHRzZWxlY3Rpb246IHthbmNob3I6IGZyb21BK25ld19pbnNlcnRlZFN0ci5sZW5ndGh9LFxuXHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0fVx0XHRcdFx0XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzZWxlY3RlZCkgcmV0dXJuIHRyO1xuXG5cdFx0XHQvLyBsZXQgdGVzdF9zID0gXCJcdTAwQTVcIlxuXHRcdFx0Ly8gY29uc29sZS5sb2coICdcdTAwQTUnLCB0ZXN0X3MgPT0gJ1x1RkZFNScpXG5cblx0XHRcdC8vIFx1NUMxRFx1OEJENVx1ODlFM1x1NTFCM1x1NUZBRVx1OEY2Rlx1NjVFN1x1NzI0OFx1OEY5M1x1NTE2NVx1NkNENVx1NzY4NFx1OTVFRVx1OTg5OH5cblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLlRyeUZpeE1TSU1FICYmIFxuXHRcdFx0XHRjaGFuZ2VUeXBlU3RyID09IFwiaW5wdXQudHlwZS5jb21wb3NlXCIgJiYgXG5cdFx0XHRcdGNoYW5nZWRTdHIgPT0gJycgJiYgL15bXFx1NGUwMC1cXHU5ZmE1XSskLy50ZXN0KGluc2VydGVkU3RyKSl7XG5cdFx0XHRcdHByaW50KFwiTVMtSU1FIENvbXBvc2UgZGV0ZWN0ZWQ6XCIsIGluc2VydGVkU3RyKTtcblx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBcdTUyMTdcdTg4NjhcdTRFMEJcdTc2ODRcdTRFRTNcdTc4MDFcdTU3NTdcdTUyMjBcdTk2NjRcdTUyOUZcdTgwRkRcdTRGMThcdTUzMTZcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLkJldHRlckNvZGVFZGl0ICYmIGNoYW5nZVR5cGVTdHIgPT0gXCJkZWxldGUuYmFja3dhcmRcIiAmJiAhc2VsZWN0ZWQgJiYgXG5cdFx0XHRcdGdldFBvc0xpbmVUeXBlKHRyLnN0YXJ0U3RhdGUsIHRvQSkgPT0gTGluZVR5cGUuY29kZWJsb2NrICYmIFxuXHRcdFx0XHQodHIuc3RhcnRTdGF0ZS5zbGljZURvYyhmcm9tQSx0b0EpIT0nYCcgfHwgZ2V0UG9zTGluZVR5cGUodHIuc3RhdGUsIGZyb21BKT09TGluZVR5cGUuY29kZWJsb2NrKSkge1xuXHRcdFx0XHRsZXQgbGluZV9udW1iZXIgPSB0ci5zdGFydFN0YXRlLmRvYy5saW5lQXQodG9BKS5udW1iZXI7XG5cdFx0XHRcdGxldCBjdXJfbGluZSA9IHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmVBdCh0b0EpO1xuXHRcdFx0XHRsZXQgbGlzdF9jb2RlID0gZmFsc2U7XG5cdFx0XHRcdGxldCBsaXN0X2NvZGVfaW5kZW50ID0gMDtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IGxpbmVfbnVtYmVyIC0gMTsgaSA+PSAxOyBpLS0pIHtcblx0XHRcdFx0XHRsZXQgbGluZSA9IHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmUoaSk7XG5cdFx0XHRcdFx0aWYgKC9eXFxzK2BgYC8udGVzdChsaW5lLnRleHQpKSB7XG5cdFx0XHRcdFx0XHRsaXN0X2NvZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0bGlzdF9jb2RlX2luZGVudCA9IGxpbmUudGV4dC5tYXRjaCgvXlxccyovKVswXS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoL15gYGAvLnRlc3QobGluZS50ZXh0KSkgYnJlYWs7XG5cdFx0XHRcdFx0ZWxzZSBjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChsaXN0X2NvZGUpIHtcblx0XHRcdFx0XHRwcmludCgnbGlzdF9jb2RlLCBpbmRlbnQ6ICcsIGxpc3RfY29kZV9pbmRlbnQpO1xuXHRcdFx0XHRcdGlmICh0b0EgPT0gY3VyX2xpbmUuZnJvbSArIGxpc3RfY29kZV9pbmRlbnQpIHtcblx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7IGNoYW5nZXM6IHsgZnJvbTogdHIuc3RhcnRTdGF0ZS5kb2MubGluZShsaW5lX251bWJlci0xKS50bywgdG86IHRvQSwgaW5zZXJ0OiAnJyB9LCB1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIiB9KTtcblx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChmcm9tQT49Y3VyX2xpbmUuZnJvbSAmJiBmcm9tQSA8IGN1cl9saW5lLmZyb20rbGlzdF9jb2RlX2luZGVudCAmJiB0b0E+Y3VyX2xpbmUuZnJvbStsaXN0X2NvZGVfaW5kZW50KXtcblx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7IGNoYW5nZXM6IHsgZnJvbTogY3VyX2xpbmUuZnJvbStsaXN0X2NvZGVfaW5kZW50LCB0bzogdG9BLCBpbnNlcnQ6ICcnIH0sIHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiIH0pO1xuXHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gPT09PT09PT09PSBkZWxldGUgcGFpciBzeW1ib2wgPT09PT09PT09PT09XG5cdFx0XHRpZiAoY2hhbmdlVHlwZVN0ciA9PT0gXCJkZWxldGUuYmFja3dhcmRcIiAmJiB0aGlzLnNldHRpbmdzLkludHJpbnNpY1N5bWJvbFBhaXJzKSB7XG5cdFx0XHRcdGlmICh0aGlzLlN5bWJvbFBhaXJzTWFwLmhhcyhjaGFuZ2VkU3RyKSAmJiB0aGlzLlN5bWJvbFBhaXJzTWFwLmdldChjaGFuZ2VkU3RyKSA9PT0gdHIuc3RhcnRTdGF0ZS5zbGljZURvYyh0b0EsIHRvQSArIDEpKSB7XG5cdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHsgY2hhbmdlczogeyBmcm9tOiBmcm9tQSwgdG86IHRvQSArIDEgfSwgdXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCIgfSk7XG5cdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBcdTU5MDRcdTc0MDZcdTUyMjBcdTk2NjRcdTRFRTNcdTc4MDFcdTU3NTdcblx0XHRcdFx0bGV0IGxpbmVfY29udGVudCA9IHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmVBdCh0b0EpLnRleHQ7XG5cdFx0XHRcdGxldCBuZXh0X2xpbmVfY29udGVudCA9IHRyLnN0YXJ0U3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQSwgdG9BICsgbGluZV9jb250ZW50Lmxlbmd0aCsxKTtcblx0XHRcdFx0aWYgKC9eXFxzKmBgYCQvLnRlc3QobGluZV9jb250ZW50KSAmJiAnXFxuJytsaW5lX2NvbnRlbnQ9PW5leHRfbGluZV9jb250ZW50KSB7XG5cdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdGNoYW5nZXM6e1xuXHRcdFx0XHRcdFx0XHRmcm9tOiB0b0EtMywgXG5cdFx0XHRcdFx0XHRcdHRvOiB0b0ErbGluZV9jb250ZW50Lmxlbmd0aCsxLFxuXHRcdFx0XHRcdFx0XHRpbnNlcnQ6ICcnXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogdG9BIC0gMyB9LFxuXHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAobGV0IHJ1bGUgb2YgdGhpcy5JbnRyaW5zaWNEZWxldGVSdWxlcykge1xuXHRcdFx0XHRcdGxldCBsZWZ0ID0gdHIuc3RhcnRTdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGgsIHRvQSk7XG5cdFx0XHRcdFx0bGV0IHJpZ2h0ID0gdHIuc3RhcnRTdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9BLCB0b0EgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgpO1xuXHRcdFx0XHRcdGlmIChsZWZ0ID09PSBydWxlLmJlZm9yZS5sZWZ0ICYmIHJpZ2h0ID09PSBydWxlLmJlZm9yZS5yaWdodCkge1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdGZyb206IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdHRvOiB0b0EgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0aW5zZXJ0OiBydWxlLmFmdGVyLmxlZnQgKyBydWxlLmFmdGVyLnJpZ2h0XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgcnVsZS5hZnRlci5sZWZ0Lmxlbmd0aCB9LFxuXHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBVc2VyRGVmaW5lZCBEZWxldGUgUnVsZVxuXHRcdFx0aWYgKGNoYW5nZVR5cGVTdHIgPT0gXCJkZWxldGUuYmFja3dhcmRcIikge1xuXHRcdFx0XHRmb3IgKGxldCBydWxlIG9mIHRoaXMuVXNlckRlbGV0ZVJ1bGVzKSB7XG5cdFx0XHRcdFx0bGV0IGxlZnREb2NTdHIgPSB0ci5zdGFydFN0YXRlLmRvYy5zbGljZVN0cmluZygwLCB0b0EpO1xuXHRcdFx0XHRcdGxldCByaWdodERvY1N0ciA9IHRyLnN0YXJ0U3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQSk7XG5cdFx0XHRcdFx0bGV0IGxlZnRSZWdleHBTdHIgPSBydWxlLmJlZm9yZS5sZWZ0O1xuXHRcdFx0XHRcdGlmIChpc1JlZ2V4cChydWxlLmJlZm9yZS5sZWZ0KSl7XG5cdFx0XHRcdFx0XHRsZWZ0UmVnZXhwU3RyID0gbGVmdFJlZ2V4cFN0ci5zbGljZSgyLCAtMSk7XG5cdFx0XHRcdFx0fWVsc2V7XG5cdFx0XHRcdFx0XHRsZWZ0UmVnZXhwU3RyID0gbGVmdFJlZ2V4cFN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcblx0XHRcdFx0XHRsZXQgbGVmdFJlZ2V4cCA9IG5ldyBSZWdFeHAobGVmdFJlZ2V4cFN0citcIiRcIik7XG5cdFx0XHRcdFx0bGV0IGxlZnRNYXRjaCA9IGxlZnREb2NTdHIubWF0Y2gobGVmdFJlZ2V4cCk7XG5cdFx0XHRcdFx0aWYgKGxlZnRNYXRjaCl7XG5cdFx0XHRcdFx0XHRsZXQgbGVmdE1hdGNoU3RyID0gbGVmdE1hdGNoWzBdO1xuXHRcdFx0XHRcdFx0Ly8gXHU5MDA5XHU2MkU5IGxlZnRNYXRjaFswXSBcdTRFNEJcdTU0MEVcdTc2ODRcdTYyNDBcdTY3MDlcdTUzMzlcdTkxNERcblx0XHRcdFx0XHRcdGxldCBtYXRjaExpc3QgPSBsZWZ0TWF0Y2guc2xpY2UoMSk7XG5cdFx0XHRcdFx0XHRsZXQgbWF0Y2hQb3NCZWdpbiA9IHRvQSAtIGxlZnRNYXRjaFN0ci5sZW5ndGg7XG5cdFx0XHRcdFx0XHRsZXQgcmlnaHRSZWdleHBTdHIgPSBydWxlLmJlZm9yZS5yaWdodDtcblx0XHRcdFx0XHRcdGlmIChpc1JlZ2V4cChydWxlLmJlZm9yZS5yaWdodCkpe1xuXHRcdFx0XHRcdFx0XHRyaWdodFJlZ2V4cFN0ciA9IHJpZ2h0UmVnZXhwU3RyLnNsaWNlKDIsIC0xKTtcblx0XHRcdFx0XHRcdH1lbHNle1xuXHRcdFx0XHRcdFx0XHQvLyAkJiBcdTg4NjhcdTc5M0FcdTUzMzlcdTkxNERcdTc2ODRcdTVCNTBcdTRFMzJcblx0XHRcdFx0XHRcdFx0cmlnaHRSZWdleHBTdHIgPSByaWdodFJlZ2V4cFN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bGV0IHJpZ2h0UmVnZXhwID0gbmV3IFJlZ0V4cCgnXicrcmlnaHRSZWdleHBTdHIpO1xuXHRcdFx0XHRcdFx0bGV0IHJpZ2h0TWF0Y2ggPSByaWdodERvY1N0ci5tYXRjaChyaWdodFJlZ2V4cCk7XG5cdFx0XHRcdFx0XHRpZihyaWdodE1hdGNoKXtcblx0XHRcdFx0XHRcdFx0bGV0IHJpZ2h0TWF0Y2hTdHIgPSByaWdodE1hdGNoWzBdO1xuXHRcdFx0XHRcdFx0XHRsZXQgbWF0Y2hQb3NFbmQgPSB0b0EgKyByaWdodE1hdGNoU3RyLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0bWF0Y2hMaXN0LnB1c2goLi4ucmlnaHRNYXRjaC5zbGljZSgxKSk7XG5cdFx0XHRcdFx0XHRcdC8vIFx1NURFNlx1NTNGM1x1OTBGRFx1NTMzOVx1OTE0RFx1NjIxMFx1NTI5Rlx1RkYwQ1x1NUYwMFx1NTlDQlx1NjZGRlx1NjM2Mlx1NUI1N1x1N0IyNlx1NEUzMlxuXHRcdFx0XHRcdFx0XHQvLyBsZXQgcmVwbGFjZUxlZnQgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHJ1bGUuYWZ0ZXIubGVmdCwgbWF0Y2hMaXN0KTtcblx0XHRcdFx0XHRcdFx0Ly8gbGV0IHJlcGxhY2VSaWdodCA9IHJlcGxhY2VQbGFjZWhvbGRlcnMocnVsZS5hZnRlci5yaWdodCwgbWF0Y2hMaXN0KTtcblx0XHRcdFx0XHRcdFx0bGV0IFtuZXdfc3RyaW5nLCB0YWJzdG9wc10gPSBwYXJzZVRoZUFmdGVyUGF0dGVybihydWxlLmFmdGVyX3BhdHRlcm4sIG1hdGNoTGlzdCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHVwZGF0ZWRUYWJzdG9wcyA9IHRhYnN0b3BzLm1hcCh0YWJzdG9wID0+ICh7XG5cdFx0XHRcdFx0XHRcdFx0Li4udGFic3RvcCwgLy8gXHU1QzU1XHU1RjAwXHU3M0IwXHU2NzA5XHU3Njg0XHU1QzVFXHU2MDI3XG5cdFx0XHRcdFx0XHRcdFx0ZnJvbTogdGFic3RvcC5mcm9tICsgbWF0Y2hQb3NCZWdpbiwgLy8gXHU1ODlFXHU1MkEwZnJvbVx1NUM1RVx1NjAyN1x1NzY4NFx1NTAzQ1xuXHRcdFx0XHRcdFx0XHRcdHRvOiB0YWJzdG9wLnRvICsgbWF0Y2hQb3NCZWdpbiAvLyBcdTU4OUVcdTUyQTB0b1x1NUM1RVx1NjAyN1x1NzY4NFx1NTAzQ1xuXHRcdFx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdFx0XHRcdGxldCB0YWJzdG9wR3JvdXBzID0gdGFic3RvcFNwZWNzVG9UYWJzdG9wR3JvdXBzKHVwZGF0ZWRUYWJzdG9wcyk7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZnJvbTogbWF0Y2hQb3NCZWdpbixcblx0XHRcdFx0XHRcdFx0XHRcdHRvOiBtYXRjaFBvc0VuZCxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogbmV3X3N0cmluZ1xuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB0YWJzdG9wR3JvdXBzWzBdLnRvRWRpdG9yU2VsZWN0aW9uKCksXG5cdFx0XHRcdFx0XHRcdFx0ZWZmZWN0czogIFthZGRUYWJzdG9wc0VmZmVjdC5vZih0YWJzdG9wR3JvdXBzKV0sXG5cdFx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gXHU1OTA0XHU3NDA2XHU4MkYxXHU2NTg3XHU4RjkzXHU1MTY1XHU2Q0Q1XHU0RTBCXHU4RjkzXHU1MTY1XHU0RUUzXHU3ODAxXHU1NzU3XG5cdFx0XHRpZiAoY2hhbmdlVHlwZVN0ciA9PSAnaW5wdXQudHlwZScgJiYgaW5zZXJ0ZWRTdHIgPT0nYFxcbmBgYCcgJiYgdGhpcy5zZXR0aW5ncy5CYXNlT2JFZGl0RW5oYW5jZSl7XG5cdFx0XHRcdGNvbnN0IGxpbmVfY29udGVudCA9IHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmVBdChmcm9tQSkudGV4dDtcblx0XHRcdFx0aWYgKC9eXFxzKmBgJC8udGVzdChsaW5lX2NvbnRlbnQpKXtcblx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhbmdlczoge2Zyb206IGZyb21BLCB0bzogdG9BLCBpbnNlcnQ6ICdgXFxuJytsaW5lX2NvbnRlbnQrJ2AnfSxcblx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IGZyb21BICsgMSB9LFxuXHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHQvLyBcdTkwMUFcdTVFMzhcdTUzNTVcdTVCNTdcdThGOTNcdTUxNjVcblx0XHRcdGlmICgoY2hhbmdlVHlwZVN0ciA9PSAnaW5wdXQudHlwZScgfHwgY2hhbmdlVHlwZVN0ciA9PSBcImlucHV0LnR5cGUuY29tcG9zZVwiKSAmJiBmcm9tQSA9PT0gdG9BICYmIGZyb21CICsgMSA9PT0gdG9CKSB7XG5cdFx0XHRcdC8vIGlmICh0aGlzLnNldHRpbmdzLmRlYnVnKSBjb25zb2xlLmxvZyhcIklucHV0LnR5cGUgPT4gXCIsIGluc2VydGVkU3RyKVxuXHRcdFx0XHQvLyA9PT09PT09PT09PSBiYXNpYyBjb252ZXJ0IHJ1bGVzID09PT09PT09PT09PVxuXHRcdFx0XHQvLyBub3Qgc3VwcG9ydCB1bmRvIGFuZCByZWRvXG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLkJhc2VPYkVkaXRFbmhhbmNlKSB7XG5cdFx0XHRcdFx0Ly8gXHU1OTA0XHU3NDA2XHU4MkYxXHU2NTg3XHU2ODA3XHU3MEI5XHU0RTBCYGB8XHU3Njg0XHU2MEM1XHU1MUI1XHVGRjBDXHU1MTQ5XHU2ODA3XHU4MUVBXHU1MkE4XHU4REYzXHU4RjZDXHU1MjMwXHU0RTJEXHU5NUY0XG5cdFx0XHRcdFx0aWYgKGluc2VydGVkU3RyID09PSAnYCcgJiYgXG5cdFx0XHRcdFx0XHR0b0EtdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KHRvQSkuZnJvbT4yICYmIFxuXHRcdFx0XHRcdFx0dHIuc3RhcnRTdGF0ZS5zbGljZURvYyh0b0EtMSwgdG9BKSA9PT0gJ2AnXG5cdFx0XHRcdFx0XHQmJiB0ci5zdGFydFN0YXRlLnNsaWNlRG9jKHRvQS0yLCB0b0EtMSkgIT0gJ2AnKXtcblx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHtmcm9tOnRvQSwgaW5zZXJ0OidgJ30sXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHRvQSB9LCB1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIiBcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBcdTU5MDRcdTc0MDZcdTRFMkRcdTY1ODdcdThGOTNcdTUxNjVcdTZDRDVcdTRFMEJcdThGOTNcdTUxNjVcdTRFRTNcdTc4MDFcdTU3NTdcblx0XHRcdFx0XHRpZiAoaW5zZXJ0ZWRTdHIgPT0gJ1x1MDBCNycpe1xuXHRcdFx0XHRcdFx0bGV0IGxpbmVfY29udGVudCA9IHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmVBdChmcm9tQSkudGV4dDtcblx0XHRcdFx0XHRcdGxldCBjaF9wb3MgPSBmcm9tQSAtIHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmVBdChmcm9tQSkuZnJvbTtcblx0XHRcdFx0XHRcdGlmICgvXlxccypgYCQvLnRlc3QobGluZV9jb250ZW50KSAmJiBjaF9wb3M9PWxpbmVfY29udGVudC5sZW5ndGgtMSl7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge2Zyb206IGZyb21BKzEsIHRvOiB0b0ErMSwgaW5zZXJ0OiAnYFxcbicrbGluZV9jb250ZW50KydgJ30sXG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogZnJvbUEgKyAyIH0sXG5cdFx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmb3IgKGxldCBydWxlIG9mIHRoaXMuQmFzaWNDb252UnVsZXMpIHtcblx0XHRcdFx0XHRcdGlmIChpbnNlcnRlZFN0ciAhPSBydWxlLmJlZm9yZS5sZWZ0LmNoYXJBdChydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCAtIDEpKSBjb250aW51ZTtcblx0XHRcdFx0XHRcdC8vIFx1NTkwNFx1NzQwNlx1NjU4N1x1Njg2M1x1N0IyQyAwIFx1ODg0Q1xuXHRcdFx0XHRcdFx0aWYgKHJ1bGUuYmVmb3JlLmxlZnQuY2hhckF0KDApID09PSAnXFxuJyAmJiBvZmZzZXRUb1Bvcyh0ci5zdGF0ZS5kb2MsIGZyb21BKS5saW5lID09PSAwICYmIHRvQiAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgMSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRsZXQgbGVmdCA9IHRyLnN0YXRlLmRvYy5zbGljZVN0cmluZyh0b0IgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIDEsIHRvQik7XG5cdFx0XHRcdFx0XHRcdGxldCByaWdodCA9IHRyLnN0YXRlLmRvYy5zbGljZVN0cmluZyh0b0IsIHRvQiArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdGlmIChsZWZ0ID09PSBydWxlLmJlZm9yZS5sZWZ0LnN1YnN0cmluZygxKSAmJiByaWdodCA9PT0gcnVsZS5iZWZvcmUucmlnaHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRmcm9tOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIDIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvOiB0b0EgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogcnVsZS5hZnRlci5sZWZ0LnN1YnN0cmluZygxKSArIHJ1bGUuYWZ0ZXIucmlnaHRcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIHJ1bGUuYWZ0ZXIubGVmdC5sZW5ndGggKyAxIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBcdTkwMUFcdTVFMzhcdTYwQzVcdTUxQjVcdTU5MDRcdTc0MDZcblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRsZXQgbGVmdCA9IHRyLnN0YXRlLmRvYy5zbGljZVN0cmluZyh0b0IgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCwgdG9CKTtcblx0XHRcdFx0XHRcdFx0bGV0IHJpZ2h0ID0gdHIuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiwgdG9CICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoKTtcblx0XHRcdFx0XHRcdFx0aWYgKGxlZnQgPT09IHJ1bGUuYmVmb3JlLmxlZnQgJiYgcmlnaHQgPT09IHJ1bGUuYmVmb3JlLnJpZ2h0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZnJvbTogdG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyAxLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0bzogdG9BICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbnNlcnQ6IHJ1bGUuYWZ0ZXIubGVmdCArIHJ1bGUuYWZ0ZXIucmlnaHRcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIHJ1bGUuYWZ0ZXIubGVmdC5sZW5ndGggKyAxIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuRlcySFdFbmhhbmNlKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgcnVsZSBvZiB0aGlzLkZXMkhXU3ltYm9sUnVsZXMpIHtcblx0XHRcdFx0XHRcdGlmIChpbnNlcnRlZFN0ciAhPSBydWxlLmJlZm9yZS5sZWZ0LmNoYXJBdChydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCAtIDEpKSBjb250aW51ZTtcblx0XHRcdFx0XHRcdGxldCBsZWZ0ID0gdHIuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoLCB0b0IpO1xuXHRcdFx0XHRcdFx0bGV0IHJpZ2h0ID0gdHIuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiwgdG9CICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoKTtcblx0XHRcdFx0XHRcdGlmIChsZWZ0ID09PSBydWxlLmJlZm9yZS5sZWZ0ICYmIHJpZ2h0ID09PSBydWxlLmJlZm9yZS5yaWdodCkge1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHtcblx0XHRcdFx0XHRcdFx0XHRcdGZyb206IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgMSxcblx0XHRcdFx0XHRcdFx0XHRcdHRvOiB0b0EgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRpbnNlcnQ6IHJ1bGUuYWZ0ZXIubGVmdCArIHJ1bGUuYWZ0ZXIucmlnaHRcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgcnVsZS5hZnRlci5sZWZ0Lmxlbmd0aCArIDEgfSxcblx0XHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vID09PT09PT09PT09PT09PT0gYXV0byBwYWlyID09PT09PT09PT09PT09PT09XG5cdFx0XHRcdC8vIGxldCBQYWlyVmFsaWRTZXQgPSBuZXcgU2V0KFtcIlwiLCBcIiBcIixcIlxcblwiXSlcblx0XHRcdFx0Ly8gbGV0IGNoYXJBZnRlckN1cnNvciA9IHRyLnN0YXJ0U3RhdGUuc2xpY2VEb2ModG9BLCB0b0ErMSk7XG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLkludHJpbnNpY1N5bWJvbFBhaXJzKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgcnVsZSBvZiB0aGlzLkludHJpbnNpY0F1dG9QYWlyUnVsZXNQYXRjaCkge1xuXHRcdFx0XHRcdFx0aWYgKGluc2VydGVkU3RyICE9IHJ1bGUuYmVmb3JlLmxlZnQuY2hhckF0KHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoIC0gMSkpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0bGV0IGxlZnQgPSB0ci5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9CIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGgsIHRvQik7XG5cdFx0XHRcdFx0XHRsZXQgcmlnaHQgPSB0ci5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9CLCB0b0IgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0aWYgKGxlZnQgPT09IHJ1bGUuYmVmb3JlLmxlZnQgJiYgcmlnaHQgPT09IHJ1bGUuYmVmb3JlLnJpZ2h0KSB7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZnJvbTogdG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyAxLFxuXHRcdFx0XHRcdFx0XHRcdFx0dG86IHRvQSArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogcnVsZS5hZnRlci5sZWZ0ICsgcnVsZS5hZnRlci5yaWdodFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogdG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyBydWxlLmFmdGVyLmxlZnQubGVuZ3RoICsgMSB9LFxuXHRcdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHRoaXMuU3ltYm9sUGFpcnNNYXAuaGFzKGluc2VydGVkU3RyKSAmJiBpbnNlcnRlZFN0ciE9XCInXCIpIHtcblx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHsgZnJvbTogZnJvbUEsIHRvOiB0b0EsIGluc2VydDogaW5zZXJ0ZWRTdHIgKyB0aGlzLlN5bWJvbFBhaXJzTWFwLmdldChpbnNlcnRlZFN0cikgfSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogZnJvbUEgKyAxIH0sXG5cdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKGluc2VydGVkU3RyID09PSBcIidcIikge1xuXHRcdFx0XHRcdFx0bGV0IGNoYXJCZWZvcmVDdXJzb3IgPSB0ci5zdGFydFN0YXRlLnNsaWNlRG9jKGZyb21BIC0gMSwgZnJvbUEpO1xuXHRcdFx0XHRcdFx0aWYgKFsnJywgJyAnLCAnXFxuJ10uaW5jbHVkZXMoY2hhckJlZm9yZUN1cnNvcikpIHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7IGZyb206IGZyb21BLCB0bzogdG9BLCBpbnNlcnQ6IFwiJydcIiB9LFxuXHRcdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IGZyb21BICsgMSB9LFxuXHRcdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gaGFuZGxlIGF1dG9wYWlyIGZvciBcIlx1MjAxRFwiIGFuZCBcIlx1MjAxOVwiXG5cdFx0XHRcdFx0aWYgKGluc2VydGVkU3RyID09PSAnXHUyMDFEJyB8fCBpbnNlcnRlZFN0ciA9PT0gJ1x1MjAxOScpIHtcblx0XHRcdFx0XHRcdGxldCB0ZW1wU3RyID0gaW5zZXJ0ZWRTdHIgPT09IFwiXHUyMDFEXCIgPyBcIlx1MjAxQ1x1MjAxRFwiIDogXCJcdTIwMThcdTIwMTlcIjtcblx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHsgZnJvbTogZnJvbUEsIHRvOiB0b0EsIGluc2VydDogdGVtcFN0ciB9LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBmcm9tQSArIDEgfSxcblx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KVxuXHRcdHJldHVybiB0cjtcblx0fVxuXG5cdGFzeW5jIG5vcm1hbFBhc3RlKGVkaXRvcjogRWRpdG9yKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IGNsaXBib2FyZFRleHQgPSBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCk7XG5cdFx0aWYgKGNsaXBib2FyZFRleHQgPT09IG51bGwgfHwgY2xpcGJvYXJkVGV4dCA9PT0gXCJcIikgcmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwiTm9ybWFsIFBhc3RlISFcIilcblx0XHRjb25zdCBlZGl0b3JWaWV3ID0gZWRpdG9yLmNtIGFzIEVkaXRvclZpZXc7XG5cdFx0bGV0IG1haW5TZWxlY3Rpb24gPSBlZGl0b3JWaWV3LnN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW47XG5cdFx0ZWRpdG9yVmlldy5kaXNwYXRjaCh7XG5cdFx0XHRjaGFuZ2VzOiB7IGZyb206IG1haW5TZWxlY3Rpb24uZnJvbSwgdG86IG1haW5TZWxlY3Rpb24udG8sIGluc2VydDogY2xpcGJvYXJkVGV4dCB9LFxuXHRcdFx0c2VsZWN0aW9uOiB7YW5jaG9yOiBtYWluU2VsZWN0aW9uLmZyb20gKyBjbGlwYm9hcmRUZXh0Lmxlbmd0aH0sXG5cdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5wYXN0ZVwiXG5cdFx0fSk7XG5cdH1cblxuXHR2aWV3VXBkYXRlUGx1Z2luID0gKHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4ge1xuXHRcdGlmICh0aGlzLm9uRm9ybWF0QXJ0aWNsZSA9PT0gdHJ1ZSkgcmV0dXJuO1xuXG5cdFx0bGV0IGN1cnNvcl9jaGFuZ2VkID0gdXBkYXRlLnRyYW5zYWN0aW9ucy5maW5kKHRyID0+IHRyLnNlbGVjdGlvbikgIT0gbnVsbDtcblx0XHQvLyBjb25zb2xlLmxvZygnY3Vyc29yX2NoYW5nZWQnLCBjdXJzb3JfY2hhbmdlZClcblx0XHRcblx0XHRpZiAoKHVwZGF0ZS5kb2NDaGFuZ2VkIHx8IGN1cnNvcl9jaGFuZ2VkKSAmJiAhdXBkYXRlLnZpZXcuY29tcG9zaW5nICYmICFpc0luc2lkZUN1clRhYnN0b3AodXBkYXRlLnZpZXcpKSB7XG5cdFx0XHRyZW1vdmVBbGxUYWJzdG9wcyh1cGRhdGUudmlldyk7XG5cdFx0fVxuXHRcdGlmICh1cGRhdGUudHJhbnNhY3Rpb25zLmZpbmQodHIgPT4gdHIuaXNVc2VyRXZlbnQoXCJ1bmRvXCIpKSl7XG5cdFx0XHRyZW1vdmVBbGxUYWJzdG9wcyh1cGRhdGUudmlldyk7XG5cdFx0fVxuXG5cdFx0bGV0IG5vdFNlbGVjdGVkID0gdHJ1ZTtcblx0XHRsZXQgbWFpblNlbGVjdGlvbiA9IHVwZGF0ZS52aWV3LnN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW47XG5cdFx0aWYgKG1haW5TZWxlY3Rpb24uYW5jaG9yICE9IG1haW5TZWxlY3Rpb24uaGVhZCkgbm90U2VsZWN0ZWQgPSBmYWxzZTtcblx0XHRpZiAoIXVwZGF0ZS5kb2NDaGFuZ2VkKSByZXR1cm47XG5cblx0XHRsZXQgaXNFeGNsdWRlRmlsZSA9IHRoaXMuaXNDdXJyZW50RmlsZUV4Y2x1ZGUoKTtcblx0XHQvLyBjb25zb2xlLmxvZyh0aGlzLkN1ckFjdGl2ZU1hcmtkb3duLCBpc0V4Y2x1ZGVGaWxlKVxuXG5cdFx0Ly8gaWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwiLS0tLS1WaWV3VXBkYXRlQ2hhbmdlLS0tLS1cIik7XG5cdFx0bGV0IHRyID0gdXBkYXRlLnRyYW5zYWN0aW9uc1swXVxuXHRcdGxldCBjaGFuZ2VUeXBlID0gZ2V0VHlwZVN0ck9mVHJhbnNhYyh0cik7XG5cblx0XHR0ci5jaGFuZ2VzLml0ZXJDaGFuZ2VzKChmcm9tQSwgdG9BLCBmcm9tQiwgdG9CLCBpbnNlcnRlZCkgPT4ge1xuXHRcdFx0bGV0IGluc2VydGVkU3RyID0gaW5zZXJ0ZWQuc2xpY2VTdHJpbmcoMCk7XG5cdFx0XHRsZXQgY2hhbmdlZFN0ciA9IHRyLnN0YXJ0U3RhdGUuZG9jLnNsaWNlU3RyaW5nKGZyb21BLCB0b0EpO1xuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpe1xuXHRcdFx0XHRjb25zb2xlLmxvZyhcIltWaWV3VXBkYXRlXSB0eXBlLCBmcm9tQSwgdG9BLCBjaGFuZ2VkLCBmcm9tQiwgdG9CLCBpbnNlcnRlZFwiKTtcblx0XHRcdFx0Y29uc29sZS5sb2coY2hhbmdlVHlwZSwgZnJvbUEsIHRvQSwgY2hhbmdlZFN0ciwgZnJvbUIsIHRvQiwgaW5zZXJ0ZWRTdHIpXG5cdFx0XHRcdGNvbnNvbGUubG9nKFwiPT0+W0NvbXBvc2luZ11cIiwgdXBkYXRlLnZpZXcuY29tcG9zaW5nKVxuXHRcdFx0fVxuXG5cdFx0XHQvLyB0YWJsZSBcdTUxODVcdTkwRThcdTRFMERcdTUwNUFcdTU5MDRcdTc0MDZcdUZGMENcdTc2RjRcdTYzQTVcdThGRDRcdTU2REUgPT4gXHU5MTREXHU1NDA4IE9ic2lkaWFuIFx1NzY4NFx1NjczQVx1NTIzNlxuXHRcdFx0aWYgKGdldFBvc0xpbmVUeXBlKHVwZGF0ZS52aWV3LnN0YXRlLCBmcm9tQikgPT0gTGluZVR5cGUudGFibGUpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgY3Vyc29yID0gdXBkYXRlLnZpZXcuc3RhdGUuc2VsZWN0aW9uLmFzU2luZ2xlKCkubWFpbjtcblxuXHRcdFx0aWYgKHVwZGF0ZS52aWV3LmNvbXBvc2luZyl7XG5cdFx0XHRcdGlmICh0aGlzLmNvbXBvc2VfbmVlZF9oYW5kbGUpe1xuXHRcdFx0XHRcdHRoaXMuY29tcG9zZV9lbmRfcG9zID0gY3Vyc29yLmFuY2hvcjtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNle1xuXHRcdFx0XHRcdHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSA9IHRydWU7XG5cdFx0XHRcdFx0dGhpcy5jb21wb3NlX2JlZ2luX3BvcyA9IGZyb21BO1xuXHRcdFx0XHRcdHRoaXMuY29tcG9zZV9lbmRfcG9zID0gY3Vyc29yLmFuY2hvcjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGxldCBjaGFuZ2VfZnJvbSA9IGZyb21CO1xuXHRcdFx0bGV0IGNoYW5nZV90byA9IHRvQjtcblx0XHRcdGxldCBjb21wb3NlRW5kID0gZmFsc2U7XG5cdFx0XHRpZiAodGhpcy5jb21wb3NlX25lZWRfaGFuZGxlKXtcblx0XHRcdFx0Y29tcG9zZUVuZCA9IHRydWU7XG5cdFx0XHRcdHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSA9IGZhbHNlO1xuXHRcdFx0XHRjaGFuZ2VfZnJvbSA9IHRoaXMuY29tcG9zZV9iZWdpbl9wb3M7XG5cdFx0XHRcdGNoYW5nZV90byA9IHRoaXMuY29tcG9zZV9lbmRfcG9zO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hhbmdlVHlwZS5jb250YWlucygnRWFzeVR5cGluZycpIHx8IGNoYW5nZVR5cGU9PSd1bmRvJyB8fCBjaGFuZ2VUeXBlPT0ncmVkbycpIHJldHVybjtcblx0XHRcdC8vIFx1NTIyNFx1NjVBRFx1NkJDRlx1NkIyMVx1OEY5M1x1NTE2NVx1N0VEM1x1Njc1RlxuXHRcdFx0aWYgKGNoYW5nZVR5cGUgIT0gJ25vbmUnICYmIG5vdFNlbGVjdGVkICYmICFjaGFuZ2VUeXBlLmluY2x1ZGVzKCdkZWxldGUnKSkge1xuXHRcdFx0XHQvLyBcdTc1MjhcdTYyMzdcdTgxRUFcdTVCOUFcdTRFNDlcdThGNkNcdTUzMTZcdTg5QzRcdTUyMTlcblx0XHRcdFx0aWYgKHRoaXMudHJpZ2dlclVzZXJDdnRSdWxlKHVwZGF0ZS52aWV3LCBtYWluU2VsZWN0aW9uLmFuY2hvcikpIHJldHVybjtcblx0XHRcdFx0aWYgKGNvbXBvc2VFbmQgJiYgdGhpcy50cmlnZ2VyUHVuY1JlY3RpZnkodXBkYXRlLnZpZXcsIGNoYW5nZV9mcm9tKSkgcmV0dXJuO1xuXG5cdFx0XHRcdC8vIFx1NTIyNFx1NjVBRFx1NjgzQ1x1NUYwRlx1NTMxNlx1NjU4N1x1NjcyQ1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInJlYWR5IHRvIGZvcm1hdFwiKTtcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJjaGVjayBpcyBleGNsdWUgZmlsZTpcIiwgaXNFeGNsdWRlRmlsZSlcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuQXV0b0Zvcm1hdCAmJiBub3RTZWxlY3RlZCAmJiAhaXNFeGNsdWRlRmlsZSAmJlxuXHRcdFx0XHRcdCAoY2hhbmdlVHlwZSAhPSAnbm9uZScgfHwgaW5zZXJ0ZWRTdHI9PVwiXFxuXCIpKSB7XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0aWYgKGdldFBvc0xpbmVUeXBlKHVwZGF0ZS52aWV3LnN0YXRlLCBjaGFuZ2VfZnJvbSkgPT0gTGluZVR5cGUudGV4dCB8fCBnZXRQb3NMaW5lVHlwZSh1cGRhdGUudmlldy5zdGF0ZSwgY2hhbmdlX2Zyb20pID09IExpbmVUeXBlLnRhYmxlKXtcblx0XHRcdFx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5Gb3JtYXRlci5mb3JtYXRMaW5lT2ZEb2ModXBkYXRlLnN0YXRlLCB0aGlzLnNldHRpbmdzLCBjaGFuZ2VfZnJvbSwgY3Vyc29yLmFuY2hvciwgaW5zZXJ0ZWRTdHIpO1xuXHRcdFx0XHRcdFx0aWYgKGNoYW5nZXMgIT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHR1cGRhdGUudmlldy5kaXNwYXRjaCguLi5jaGFuZ2VzWzBdKTtcblx0XHRcdFx0XHRcdFx0dXBkYXRlLnZpZXcuZGlzcGF0Y2goY2hhbmdlc1sxXSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gXHU3Qzk4XHU4RDM0XHU2NUY2XHU4MUVBXHU1MkE4XHU2ODNDXHU1RjBGXHU1MzE2XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5BdXRvRm9ybWF0ICYmICFpc0V4Y2x1ZGVGaWxlICYmIGNoYW5nZVR5cGUgPT0gXCJpbnB1dC5wYXN0ZVwiICYmICFQbGF0Zm9ybS5pc0lvc0FwcCkge1xuXHRcdFx0XHRsZXQgdXBkYXRlTGluZVN0YXJ0ID0gdXBkYXRlLnN0YXRlLmRvYy5saW5lQXQoZnJvbUIpLm51bWJlcjtcblx0XHRcdFx0bGV0IHVwZGF0ZUxpbmVFbmQgPSB1cGRhdGUuc3RhdGUuZG9jLmxpbmVBdCh0b0IpLm51bWJlcjtcblx0XHRcdFx0aWYgKHVwZGF0ZUxpbmVTdGFydCA9PSB1cGRhdGVMaW5lRW5kICYmIGdldFBvc0xpbmVUeXBlKHVwZGF0ZS52aWV3LnN0YXRlLCB0b0IpID09IExpbmVUeXBlLnRleHQpIHtcblx0XHRcdFx0XHRsZXQgY2hhbmdlcyA9IHRoaXMuRm9ybWF0ZXIuZm9ybWF0TGluZU9mRG9jKHVwZGF0ZS5zdGF0ZSwgdGhpcy5zZXR0aW5ncywgZnJvbUIsIHRvQiwgaW5zZXJ0ZWRTdHIpO1xuXHRcdFx0XHRcdGlmIChjaGFuZ2VzICE9IG51bGwpIHtcblx0XHRcdFx0XHRcdHVwZGF0ZS52aWV3LmRpc3BhdGNoKC4uLmNoYW5nZXNbMF0pO1xuXHRcdFx0XHRcdFx0Ly8gdXBkYXRlLnZpZXcuZGlzcGF0Y2goY2hhbmdlc1sxXSk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGxldCBhbGxfY2hhbmdlczogVHJhbnNhY3Rpb25TcGVjW10gPSBbXTtcblx0XHRcdFx0XHRsZXQgaW5zZXJ0ZWRfYXJyYXkgPSBpbnNlcnRlZFN0ci5zcGxpdChcIlxcblwiKTtcblx0XHRcdFx0XHRsZXQgdXBkYXRlX3N0YXJ0ID0gZnJvbUJcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gdXBkYXRlTGluZVN0YXJ0OyBpIDw9IHVwZGF0ZUxpbmVFbmQ7IGkrKykge1xuXHRcdFx0XHRcdFx0bGV0IHJlYWxfaW5zZXJ0ZWQgPSBpbnNlcnRlZF9hcnJheVtpIC0gdXBkYXRlTGluZVN0YXJ0XTtcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdyZWFsX2luc2VydGVkJywgcmVhbF9pbnNlcnRlZC5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJykpXG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygndXBkYXRlX2RvY190ZXh0JywgdXBkYXRlLnN0YXRlLmRvYy5zbGljZVN0cmluZyh1cGRhdGVfc3RhcnQsIHVwZGF0ZV9zdGFydCArIHJlYWxfaW5zZXJ0ZWQubGVuZ3RoKS5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJykpXG5cdFx0XHRcdFx0XHRsZXQgY2hhbmdlcyA9IHRoaXMuRm9ybWF0ZXIuZm9ybWF0TGluZU9mRG9jKHVwZGF0ZS5zdGF0ZSwgdGhpcy5zZXR0aW5ncywgdXBkYXRlX3N0YXJ0LCB1cGRhdGVfc3RhcnQgKyByZWFsX2luc2VydGVkLmxlbmd0aCwgcmVhbF9pbnNlcnRlZCk7XG5cdFx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygnY2hhbmdlcycsIGNoYW5nZXMpXG5cdFx0XHRcdFx0XHRpZiAoY2hhbmdlcyAhPSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdGFsbF9jaGFuZ2VzLnB1c2goLi4uY2hhbmdlc1swXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR1cGRhdGVfc3RhcnQgKz0gcmVhbF9pbnNlcnRlZC5sZW5ndGggKyAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYWxsX2NoYW5nZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0dXBkYXRlLnZpZXcuZGlzcGF0Y2goLi4uYWxsX2NoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1x0Ly8gaXRlcmNoYW5nZXMgZW5kXG5cdH1cblxuXHRwcml2YXRlIHJlYWRvbmx5IGhhbmRsZVRhYkRvd24gPSAodmlldzogRWRpdG9yVmlldykgPT4ge1xuXHRcdGlmIChjb25zdW1lQW5kR290b05leHRUYWJzdG9wKHZpZXcpKXtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5UYWJvdXQpIHJldHVybiBmYWxzZTtcblxuXHRcdGxldCBzdGF0ZSA9IHZpZXcuc3RhdGU7XG5cdFx0bGV0IGRvYyA9IHN0YXRlLmRvY1xuXHRcdGNvbnN0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKTtcblx0XHRjb25zdCBzID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG5cdFx0aWYgKHMucmFuZ2VzLmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTtcblx0XHRjb25zdCBwb3MgPSBzLm1haW4udG87XG5cdFx0bGV0IGxpbmUgPSBkb2MubGluZUF0KHBvcylcblxuXHRcdC8vIERlYnVnIGluZm9cblx0XHQvLyBjb25zb2xlLmxvZyhsaW5lLnRleHQpXG5cdFx0Ly8gZm9yIChsZXQgcD1saW5lLmZyb207IHA8PWxpbmUudG87IHArPTEpe1xuXHRcdC8vIFx0Y29uc3QgdG9rZW4gPSB0cmVlLnJlc29sdmUocCwgMSkubmFtZVxuXHRcdC8vIFx0Y29uc29sZS5sb2cocC1saW5lLmZyb20sIHRva2VuKVxuXHRcdC8vIH1cblx0XHQvLyByZXR1cm4gdHJ1ZTtcblxuXHRcdGlmIChzLm1haW4uZnJvbT09cy5tYWluLnRvICYmIGlzQ29kZUJsb2NrSW5Qb3Moc3RhdGUsIHBvcykpe1xuXHRcdFx0Y29uc3QgZGVmYXVsdF9pbmRlbnQgPSB0aGlzLmdldERlZmF1bHRJbmRlbnRDaGFyKCk7XG5cdFx0XHR2aWV3LmRpc3BhdGNoKHtcblx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdGZyb206IHMubWFpbi5mcm9tLFxuXHRcdFx0XHRcdGluc2VydDogZGVmYXVsdF9pbmRlbnRcblx0XHRcdFx0fSxcblx0XHRcdFx0c2VsZWN0aW9uOiB7XG5cdFx0XHRcdFx0YW5jaG9yOiBzLm1haW4uZnJvbSArIGRlZmF1bHRfaW5kZW50Lmxlbmd0aFxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdC8vIHJldHVybiB0cnVlO1xuXG5cdFx0Ly8gXHU1RjUzXHU1MTQ5XHU2ODA3XHU1NzI4XHU4ODRDXHU1MTg1XHU0RUUzXHU3ODAxXHU1MTg1XHU5MEU4XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuQmV0dGVyQ29kZUVkaXQgJiYgcG9zIC0gbGluZS5mcm9tICE9IDAgJiYgdHJlZS5yZXNvbHZlKHBvcyAtIDEsIDEpLm5hbWUuY29udGFpbnMoJ2lubGluZS1jb2RlJykpIHtcblx0XHRcdGlmICh0cmVlLnJlc29sdmUocG9zLCAxKS5uYW1lLmNvbnRhaW5zKCdmb3JtYXR0aW5nLWNvZGVfaW5saW5lLWNvZGUnKSkge1xuXHRcdFx0XHR2aWV3LmRpc3BhdGNoKHtcblx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBwb3MgKyAxLCBoZWFkOiBwb3MgKyAxIH1cblx0XHRcdFx0fSlcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAobGV0IHAgPSBwb3MgKyAxOyBwIDwgbGluZS50byAmJiB0cmVlLnJlc29sdmUocCwgMSkubmFtZS5jb250YWlucygnaW5saW5lLWNvZGUnKTsgcCArPSAxKSB7XG5cdFx0XHRcdC8vIFx1NTk4Mlx1Njc5Q1x1NjI3RVx1NTIzMCBgIFx1NTIxOVx1NTE0OVx1NjgwN1x1OERGM1x1NTIzMFx1NTE3Nlx1NTQwRVxuXHRcdFx0XHRpZiAodHJlZS5yZXNvbHZlKHAsIDEpLm5hbWUuY29udGFpbnMoJ2Zvcm1hdHRpbmctY29kZV9pbmxpbmUtY29kZScpKSB7XG5cdFx0XHRcdFx0dmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBwLCBoZWFkOiBwIH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIFx1NTk4Mlx1Njc5Q1x1NkNBMVx1NjI3RVx1NTIzMCBgIFx1NTIxOVx1NzZGNFx1NjNBNVx1OERGM1x1NTIzMFx1ODg0Q1x1NUMzRVxuXHRcdFx0XHRpZiAocCA9PSBsaW5lLnRvIC0gMSAmJiB0cmVlLnJlc29sdmUocCwgMSkubmFtZS5jb250YWlucygnaW5saW5lLWNvZGUnKSkge1xuXHRcdFx0XHRcdHZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogcCArIDEsIGhlYWQ6IHAgKyAxIH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gXHU1RjUzXHU1MTQ5XHU2ODA3XHU1NzI4XHU4ODRDXHU1MTg1XHU0RUUzXHU3ODAxXHU1OTE2XHU5MEU4XHVGRjBDXHU1RTc2XHU1NzI4XHU5MDA5XHU0RTJEXHU2NTg3XHU2NzJDXHU3Njg0XHU2MEM1XHU1MUI1XHU0RTBCXHVGRjBDdGFiXHU1QzA2XHU0RjFBXHU4REYzXHU1MUZBXHU1MjMwcGFpcnN0cmluZ1x1NzY4NFx1NTkxNlx1OTBFOFxuXHRcdGxldCBzZWxlY3Rpb24gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW47XG5cdFx0bGV0IHNlbGVjdGVkID0gc2VsZWN0aW9uLmFuY2hvciAhPSBzZWxlY3Rpb24uaGVhZDtcblx0XHRpZiAoc2VsZWN0ZWQpe1xuXHRcdFx0bGV0IG5ld19hbmNob3IgPSBzZWxlY3Rpb24uYW5jaG9yPHNlbGVjdGlvbi5oZWFkP3NlbGVjdGlvbi5hbmNob3I6c2VsZWN0aW9uLmhlYWQ7XG5cdFx0XHRsZXQgbmV3X2hlYWQgPSBzZWxlY3Rpb24uYW5jaG9yPnNlbGVjdGlvbi5oZWFkP3NlbGVjdGlvbi5hbmNob3I6c2VsZWN0aW9uLmhlYWQ7XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcInNlbGVjdGlvblwiLCBzZWxlY3Rpb24uYW5jaG9yLCBzZWxlY3Rpb24uaGVhZClcblxuXHRcdFx0Zm9yIChsZXQgcHN0ciBvZiB0aGlzLlRhYm91dFBhaXJTdHJzKXtcblx0XHRcdFx0aWYgKGRvYy5zbGljZVN0cmluZyhuZXdfYW5jaG9yLXBzdHIubGVmdC5sZW5ndGgsIG5ld19hbmNob3IpID09IHBzdHIubGVmdCAmJlxuXHRcdFx0XHRcdGRvYy5zbGljZVN0cmluZyhuZXdfaGVhZCwgbmV3X2hlYWQrcHN0ci5yaWdodC5sZW5ndGgpID09IHBzdHIucmlnaHQpe1xuXHRcdFx0XHRcdFx0dmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IG5ld19oZWFkK3BzdHIucmlnaHQubGVuZ3RoLCBoZWFkOiBuZXdfaGVhZCtwc3RyLnJpZ2h0Lmxlbmd0aCB9XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZWFkb25seSBoYW5kbGVFbnRlciA9ICh2aWV3OiBFZGl0b3JWaWV3KSA9PiB7XG5cdFx0Ly8gY29uc29sZS5sb2coXCJ0aGlzLnNldHRpbmdzLkVudGVyVHdpY2VcIiwgdGhpcy5zZXR0aW5ncy5FbnRlclR3aWNlKVxuXHRcdGlmICghdGhpcy5zZXR0aW5ncy5FbnRlclR3aWNlKSByZXR1cm4gZmFsc2U7XG5cblx0XHRsZXQgc3RyaWN0TGluZUJyZWFrcyA9IHRoaXMuYXBwLnZhdWx0LmNvbmZpZy5zdHJpY3RMaW5lQnJlYWtzIHx8IGZhbHNlO1xuXHRcdGlmICghc3RyaWN0TGluZUJyZWFrcykgcmV0dXJuIGZhbHNlO1xuXG5cdFx0bGV0IHN0YXRlID0gdmlldy5zdGF0ZTtcblx0XHRsZXQgZG9jID0gc3RhdGUuZG9jXG5cdFx0Y29uc3QgdHJlZSA9IHN5bnRheFRyZWUoc3RhdGUpO1xuXHRcdGNvbnN0IHMgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcblx0XHRpZiAocy5yYW5nZXMubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXHRcdGNvbnN0IHBvcyA9IHMubWFpbi50bztcblx0XHRsZXQgbGluZSA9IGRvYy5saW5lQXQocG9zKTtcblxuXHRcdC8vIGNvbnNvbGUubG9nKGxpbmUudGV4dCwgZ2V0UG9zTGluZVR5cGUyKHN0YXRlLCBwb3MpKVxuXHRcdC8vIGZvciAobGV0IHA9bGluZS5mcm9tOyBwPD1saW5lLnRvOyBwKz0xKXtcblx0XHQvLyBcdGNvbnN0IHRva2VuID0gdHJlZS5yZXNvbHZlKHAsIDEpLm5hbWVcblx0XHQvLyBcdGNvbnNvbGUubG9nKHAtbGluZS5mcm9tLCB0b2tlbilcblx0XHQvLyB9XG5cdFx0Ly8gXHU1OTgyXHU2NzlDXHU1RjUzXHU1MjREXHU4ODRDXHU0RTNBXHU3QTdBXHU3NjdEXHU4ODRDXHVGRjBDXHU0RTBEXHU1MDVBXHU1OTA0XHU3NDA2XG5cdFx0aWYgKC9eXFxzKiQvLnRlc3QobGluZS50ZXh0KSkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8gXHU1OTgyXHU2NzlDXHU1MTQ5XHU2ODA3XHU1NzI4XHU1RjUzXHU1MjREXHU4ODRDXHU5OTk2XHVGRjBDXHU0RTBEXHU1MDVBXHU1OTA0XHU3NDA2XG5cdFx0aWYgKHBvcz09bGluZS5mcm9tKSByZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBcdTU5ODJcdTRFMEJcdTRFMDBcdTg4NENcdTk3NUVcdTdBN0FcdTc2N0RcdTg4NENcdUZGMENcdTRFMERcdTUwNUFcdTU5MDRcdTc0MDZcblx0XHRpZiAobGluZS5udW1iZXIgPCBkb2MubGluZXMgJiYgIS9eXFxzKiQvLnRlc3QoZG9jLmxpbmUobGluZS5udW1iZXIrMSkudGV4dCkpIHJldHVybiBmYWxzZTtcblxuXHRcdGlmIChnZXRQb3NMaW5lVHlwZTIoc3RhdGUsIHBvcykgPT0gTGluZVR5cGUudGV4dCkge1xuXHRcdFx0dmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdGNoYW5nZXM6IHtcblx0XHRcdFx0XHRmcm9tOiBwb3MsXG5cdFx0XHRcdFx0dG86IHBvcyxcblx0XHRcdFx0XHRpbnNlcnQ6ICdcXG5cXG4nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHBvcyArIDIgfSxcblx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdH0pXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXG5cdHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTW9kQUluQ29kZUJsb2NrID0gKHZpZXc6IEVkaXRvclZpZXcpID0+IHtcblx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuQmV0dGVyQ29kZUVkaXQpIHJldHVybiBmYWxzZTtcblx0XHRsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcblx0XHRsZXQgbWFpblNlbGVjdGlvbiA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFzU2luZ2xlKCkubWFpbjtcblx0XHRpZiAobWFpblNlbGVjdGlvbi5hbmNob3IgIT0gbWFpblNlbGVjdGlvbi5oZWFkKSBzZWxlY3RlZCA9IHRydWU7XG5cdFx0aWYgKHNlbGVjdGVkKSByZXR1cm4gZmFsc2U7XG5cblx0XHRsZXQgY3Vyc29yX3BvcyA9IG1haW5TZWxlY3Rpb24uYW5jaG9yO1xuXG5cdFx0cmV0dXJuIHNlbGVjdENvZGVCbG9ja0luUG9zKHZpZXcsIGN1cnNvcl9wb3MpO1xuXHR9XG5cblx0cHJpdmF0ZSByZWFkb25seSBvbktleXVwID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50LCB2aWV3OiBFZGl0b3JWaWV3KSA9PiB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIHtcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiS2V5dXA6XCIsIGV2ZW50LmtleSwgZXZlbnQuc2hpZnRLZXksIGV2ZW50LmN0cmxLZXl8fGV2ZW50Lm1ldGFLZXkpO1xuXHRcdFx0Y29uc29sZS5sb2coXCJLZXl1cDpcIiwgZXZlbnQua2V5KTtcblx0XHR9XG5cdFx0dGhpcy5oYW5kbGVFbmRDb21wb3NlVHlwZUtleShldmVudCwgdmlldyk7XG5cdH1cblxuXHR0cmlnZ2VyVXNlckN2dFJ1bGUgPSAodmlldzogRWRpdG9yVmlldywgY3Vyc29yX3BvczogbnVtYmVyKTpib29sZWFuID0+IHtcblx0XHRmb3IgKGxldCBydWxlIG9mIHRoaXMuVXNlckNvbnZlcnRSdWxlcykge1xuXHRcdFx0bGV0IGxlZnREb2NTdHIgPSB2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZygwLCBjdXJzb3JfcG9zKTtcblx0XHRcdGxldCByaWdodERvY1N0ciA9IHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKGN1cnNvcl9wb3MpO1xuXHRcdFx0bGV0IGxlZnRSZWdleHBTdHIgPSBydWxlLmJlZm9yZS5sZWZ0O1xuXHRcdFx0aWYgKGlzUmVnZXhwKHJ1bGUuYmVmb3JlLmxlZnQpKXtcblx0XHRcdFx0bGVmdFJlZ2V4cFN0ciA9IGxlZnRSZWdleHBTdHIuc2xpY2UoMiwgLTEpO1xuXHRcdFx0fWVsc2V7XG5cdFx0XHRcdGxlZnRSZWdleHBTdHIgPSBsZWZ0UmVnZXhwU3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdGxldCBsZWZ0UmVnZXhwID0gbmV3IFJlZ0V4cChsZWZ0UmVnZXhwU3RyK1wiJFwiKTtcblx0XHRcdGxldCBsZWZ0TWF0Y2ggPSBsZWZ0RG9jU3RyLm1hdGNoKGxlZnRSZWdleHApO1xuXHRcdFx0aWYgKGxlZnRNYXRjaCl7XG5cdFx0XHRcdGxldCBsZWZ0TWF0Y2hTdHIgPSBsZWZ0TWF0Y2hbMF07XG5cdFx0XHRcdC8vIFx1OTAwOVx1NjJFOSBsZWZ0TWF0Y2hbMF0gXHU0RTRCXHU1NDBFXHU3Njg0XHU2MjQwXHU2NzA5XHU1MzM5XHU5MTREXG5cdFx0XHRcdGxldCBtYXRjaExpc3QgPSBsZWZ0TWF0Y2guc2xpY2UoMSk7XG5cdFx0XHRcdGxldCBtYXRjaFBvc0JlZ2luID0gY3Vyc29yX3BvcyAtIGxlZnRNYXRjaFN0ci5sZW5ndGg7XG5cdFx0XHRcdGxldCByaWdodFJlZ2V4cFN0ciA9IHJ1bGUuYmVmb3JlLnJpZ2h0O1xuXHRcdFx0XHRpZiAoaXNSZWdleHAocnVsZS5iZWZvcmUucmlnaHQpKXtcblx0XHRcdFx0XHRyaWdodFJlZ2V4cFN0ciA9IHJpZ2h0UmVnZXhwU3RyLnNsaWNlKDIsIC0xKTtcblx0XHRcdFx0fWVsc2V7XG5cdFx0XHRcdFx0Ly8gJCYgXHU4ODY4XHU3OTNBXHU1MzM5XHU5MTREXHU3Njg0XHU1QjUwXHU0RTMyXG5cdFx0XHRcdFx0cmlnaHRSZWdleHBTdHIgPSByaWdodFJlZ2V4cFN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCByaWdodFJlZ2V4cCA9IG5ldyBSZWdFeHAoJ14nK3JpZ2h0UmVnZXhwU3RyKTtcblx0XHRcdFx0bGV0IHJpZ2h0TWF0Y2ggPSByaWdodERvY1N0ci5tYXRjaChyaWdodFJlZ2V4cCk7XG5cdFx0XHRcdGlmKHJpZ2h0TWF0Y2gpe1xuXHRcdFx0XHRcdGxldCByaWdodE1hdGNoU3RyID0gcmlnaHRNYXRjaFswXTtcblx0XHRcdFx0XHRsZXQgbWF0Y2hQb3NFbmQgPSBjdXJzb3JfcG9zICsgcmlnaHRNYXRjaFN0ci5sZW5ndGg7XG5cdFx0XHRcdFx0bWF0Y2hMaXN0LnB1c2goLi4ucmlnaHRNYXRjaC5zbGljZSgxKSk7XG5cdFx0XHRcdFx0Ly8gXHU1REU2XHU1M0YzXHU5MEZEXHU1MzM5XHU5MTREXHU2MjEwXHU1MjlGXHVGRjBDXHU1RjAwXHU1OUNCXHU2NkZGXHU2MzYyXHU1QjU3XHU3QjI2XHU0RTMyXG5cdFx0XHRcdFx0Ly8gbGV0IHJlcGxhY2VMZWZ0ID0gcmVwbGFjZVBsYWNlaG9sZGVycyhydWxlLmFmdGVyLmxlZnQsIG1hdGNoTGlzdCk7XG5cdFx0XHRcdFx0Ly8gbGV0IHJlcGxhY2VSaWdodCA9IHJlcGxhY2VQbGFjZWhvbGRlcnMocnVsZS5hZnRlci5yaWdodCwgbWF0Y2hMaXN0KTtcblx0XHRcdFx0XHRsZXQgW25ld19zdHJpbmcsIHRhYnN0b3BzXSA9IHBhcnNlVGhlQWZ0ZXJQYXR0ZXJuKHJ1bGUuYWZ0ZXJfcGF0dGVybiwgbWF0Y2hMaXN0KTtcblx0XHRcdFx0XHRjb25zdCB1cGRhdGVkVGFic3RvcHMgPSB0YWJzdG9wcy5tYXAodGFic3RvcCA9PiAoe1xuXHRcdFx0XHRcdFx0Li4udGFic3RvcCwgLy8gXHU1QzU1XHU1RjAwXHU3M0IwXHU2NzA5XHU3Njg0XHU1QzVFXHU2MDI3XG5cdFx0XHRcdFx0XHRmcm9tOiB0YWJzdG9wLmZyb20gKyBtYXRjaFBvc0JlZ2luLCAvLyBcdTU4OUVcdTUyQTBmcm9tXHU1QzVFXHU2MDI3XHU3Njg0XHU1MDNDXG5cdFx0XHRcdFx0XHR0bzogdGFic3RvcC50byArIG1hdGNoUG9zQmVnaW4gLy8gXHU1ODlFXHU1MkEwdG9cdTVDNUVcdTYwMjdcdTc2ODRcdTUwM0Ncblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdFx0dmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0XHRcdGZyb206IG1hdGNoUG9zQmVnaW4sXG5cdFx0XHRcdFx0XHRcdHRvOiBtYXRjaFBvc0VuZCxcblx0XHRcdFx0XHRcdFx0aW5zZXJ0OiBuZXdfc3RyaW5nXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhZGRUYWJzdG9wc0FuZFNlbGVjdCh2aWV3LCB0YWJzdG9wU3BlY3NUb1RhYnN0b3BHcm91cHModXBkYXRlZFRhYnN0b3BzKSk7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dHJpZ2dlclB1bmNSZWN0aWZ5ID0gKHZpZXc6IEVkaXRvclZpZXcsIGNoYW5nZV9mcm9tX3BvczogbnVtYmVyKTpib29sZWFuID0+IHtcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5QdW5jUmVjdGlmeSAmJlxuXHRcdFx0L1ssLj8hXS8udGVzdCh2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyhjaGFuZ2VfZnJvbV9wb3MgLSAxLCBjaGFuZ2VfZnJvbV9wb3MpKSkge1xuXHRcdFx0bGV0IHB1bmMgPSB2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyhjaGFuZ2VfZnJvbV9wb3MgLSAxLCBjaGFuZ2VfZnJvbV9wb3MpXG5cdFx0XHRpZiAoY2hhbmdlX2Zyb21fcG9zID4gMiAmJiAvW15cXHU0ZTAwLVxcdTlmYTVdLy50ZXN0KHZpZXcuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKGNoYW5nZV9mcm9tX3BvcyAtIDIsIGNoYW5nZV9mcm9tX3BvcyAtIDEpKSkgeyB9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0ZnJvbTogY2hhbmdlX2Zyb21fcG9zIC0gMSxcblx0XHRcdFx0XHRcdHRvOiBjaGFuZ2VfZnJvbV9wb3MsXG5cdFx0XHRcdFx0XHRpbnNlcnQ6IHRoaXMuaGFsZlRvRnVsbFN5bWJvbE1hcC5nZXQocHVuYylcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8vIHNlbGVjdGlvbjogeyBhbmNob3I6IHRvQiAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgcnVsZS5hZnRlci5sZWZ0Lmxlbmd0aCB9LFxuXHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdH0pXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRoYW5kbGVFbmRDb21wb3NlVHlwZUtleSA9IChldmVudDogS2V5Ym9hcmRFdmVudCwgdmlldzogRWRpdG9yVmlldykgPT4ge1xuXHRcdGlmICgoWydFbnRlcicsICdQcm9jZXNzJywgJyAnLCAnU2hpZnQnXS5jb250YWlucyhldmVudC5rZXkpIHx8IC9cXGQvLnRlc3QoZXZlbnQua2V5KSkgJiZcblx0XHRcdHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSkge1xuXHRcdFx0bGV0IGN1cnNvciA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFzU2luZ2xlKCkubWFpbjtcblx0XHRcdGlmIChjdXJzb3IuaGVhZCAhPSBjdXJzb3IuYW5jaG9yKSByZXR1cm47XG5cdFx0XHRsZXQgaW5zZXJ0ZWRTdHIgPSB2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyh0aGlzLmNvbXBvc2VfYmVnaW5fcG9zLCBjdXJzb3IuYW5jaG9yKTtcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiaW5zZXJ0ZWQgc3RyXCIsIGluc2VydGVkU3RyKTtcblx0XHRcdHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSA9IGZhbHNlO1xuXHRcdFx0aWYgKHRoaXMudHJpZ2dlclVzZXJDdnRSdWxlKHZpZXcsIGN1cnNvci5hbmNob3IpKSByZXR1cm47XG5cdFx0XHRpZiAodGhpcy50cmlnZ2VyUHVuY1JlY3RpZnkodmlldywgdGhpcy5jb21wb3NlX2JlZ2luX3BvcykpIHJldHVybjtcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLkF1dG9Gb3JtYXQgJiYgIXRoaXMuaXNDdXJyZW50RmlsZUV4Y2x1ZGUoKSl7XG5cdFx0XHRcdGlmIChnZXRQb3NMaW5lVHlwZSh2aWV3LnN0YXRlLCBjdXJzb3IuYW5jaG9yKSAhPSBMaW5lVHlwZS50ZXh0KSByZXR1cm47XG5cdFx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5Gb3JtYXRlci5mb3JtYXRMaW5lT2ZEb2Modmlldy5zdGF0ZSwgdGhpcy5zZXR0aW5ncyxcblx0XHRcdFx0XHR0aGlzLmNvbXBvc2VfYmVnaW5fcG9zLCBjdXJzb3IuYW5jaG9yLCBpbnNlcnRlZFN0cik7XG5cdFx0XHRcdGlmIChjaGFuZ2VzICE9IG51bGwpIHtcblx0XHRcdFx0XHR2aWV3LmRpc3BhdGNoKC4uLmNoYW5nZXNbMF0pO1xuXHRcdFx0XHRcdHZpZXcuZGlzcGF0Y2goY2hhbmdlc1sxXSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Zm9ybWF0QXJ0aWNsZSA9IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KTogdm9pZCA9PiB7XG5cdFx0Y29uc3QgZWRpdG9yVmlldyA9IGVkaXRvci5jbSBhcyBFZGl0b3JWaWV3O1xuXHRcdGNvbnN0IHRyZWUgPSBlbnN1cmVTeW50YXhUcmVlKGVkaXRvclZpZXcuc3RhdGUsIGVkaXRvclZpZXcuc3RhdGUuZG9jLmxlbmd0aCk7XG5cdFx0aWYgKCF0cmVlKXtcblx0XHRcdG5ldyBOb3RpY2UoJ0Vhc3lUeXBpbmc6IFN5bnRheCB0cmVlIGlzIG5vdCByZWFkeSB5ZXQsIHBsZWFzZSB3YWl0IGEgbW9tZW50IGFuZCB0cnkgYWdhaW4gbGF0ZXIhJywgNTAwMCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5vbkZvcm1hdEFydGljbGUgPSB0cnVlO1xuXHRcdFxuXHRcdGxldCBsaW5lQ291bnQgPSBlZGl0b3IubGluZUNvdW50KCk7XG5cdFx0bGV0IG5ld19hcnRpY2xlID0gXCJcIjtcblx0XHRsZXQgY3MgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG5cdFx0bGV0IGNoID0gMDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7XG5cdFx0XHRpZiAoaSAhPSAwKSBuZXdfYXJ0aWNsZSArPSAnXFxuJztcblx0XHRcdGlmIChpICE9IGNzLmxpbmUpIHtcblx0XHRcdFx0bmV3X2FydGljbGUgKz0gdGhpcy5wcmVGb3JtYXRPbmVMaW5lKGVkaXRvciwgaSArIDEpWzBdO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGxldCBuZXdEYXRhID0gdGhpcy5wcmVGb3JtYXRPbmVMaW5lKGVkaXRvciwgaSArIDEsIGNzLmNoKTtcblx0XHRcdFx0bmV3X2FydGljbGUgKz0gbmV3RGF0YVswXTtcblx0XHRcdFx0Y2ggPSBuZXdEYXRhWzFdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlZGl0b3Iuc2V0VmFsdWUobmV3X2FydGljbGUpO1xuXHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBjcy5saW5lLCBjaDogY2ggfSk7XG5cblx0XHR0aGlzLm9uRm9ybWF0QXJ0aWNsZSA9IGZhbHNlO1xuXG5cdFx0bmV3IE5vdGljZShcIkVhc3lUeXBpbmc6IEZvcm1hdCBBcnRpY2xlIERvbmUhXCIpO1xuXHR9XG5cblx0aXNDdXJyZW50RmlsZUV4Y2x1ZGUoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuQ3VyQWN0aXZlTWFya2Rvd24gPT0gXCJcIikge1xuXHRcdFx0bGV0IGZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuXHRcdFx0aWYgKGZpbGUgIT0gbnVsbCAmJiB0aGlzLkN1ckFjdGl2ZU1hcmtkb3duICE9IGZpbGUucGF0aCkge1xuXHRcdFx0XHR0aGlzLkN1ckFjdGl2ZU1hcmtkb3duID0gZmlsZS5wYXRoO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRsZXQgZXhjbHVkZVBhdGhzID0gdGhpcy5zZXR0aW5ncy5FeGNsdWRlRmlsZXMuc3BsaXQoJ1xcbicpO1xuXHRcdGZvciAobGV0IGVwYXRoIG9mIGV4Y2x1ZGVQYXRocykge1xuXHRcdFx0aWYgKGVwYXRoLmNoYXJBdCgwKSA9PSAnLycpIGVwYXRoID0gZXBhdGguc3Vic3RyaW5nKDEpO1xuXHRcdFx0aWYgKHRoaXMuQ3VyQWN0aXZlTWFya2Rvd24gPT0gZXBhdGgpIHJldHVybiB0cnVlO1xuXHRcdFx0bGV0IGxlbiA9IGVwYXRoLmxlbmd0aDtcblx0XHRcdGlmICh0aGlzLkN1ckFjdGl2ZU1hcmtkb3duLnN1YnN0cmluZygwLCBsZW4pID09IGVwYXRoICYmICh0aGlzLkN1ckFjdGl2ZU1hcmtkb3duLmNoYXJBdChsZW4pID09ICcvJyB8fCB0aGlzLkN1ckFjdGl2ZU1hcmtkb3duLmNoYXJBdChsZW4pID09ICdcXFxcJyB8fFxuXHRcdFx0XHRlcGF0aC5jaGFyQXQobGVuIC0gMSkgPT0gXCIvXCIgfHwgZXBhdGguY2hhckF0KGxlbiAtIDEpID09IFwiXFxcXFwiKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Zm9ybWF0U2VsZWN0aW9uT3JDdXJMaW5lID0gKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpOiB2b2lkID0+IHtcblx0XHRpZiAoIWVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCgpIHx8IGVkaXRvci5nZXRTZWxlY3Rpb24oKSA9PT0gJycpIHtcblx0XHRcdGxldCBsaW5lTnVtYmVyID0gZWRpdG9yLmdldEN1cnNvcigpLmxpbmU7XG5cdFx0XHRsZXQgbmV3TGluZURhdGEgPSB0aGlzLnByZUZvcm1hdE9uZUxpbmUoZWRpdG9yLCBsaW5lTnVtYmVyICsgMSwgZWRpdG9yLmdldEN1cnNvcigpLmNoKTtcblx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UobmV3TGluZURhdGFbMF0sIHsgbGluZTogbGluZU51bWJlciwgY2g6IDAgfSwgeyBsaW5lOiBsaW5lTnVtYmVyLCBjaDogZWRpdG9yLmdldExpbmUobGluZU51bWJlcikubGVuZ3RoIH0pO1xuXHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7IGxpbmU6IGxpbmVOdW1iZXIsIGNoOiBuZXdMaW5lRGF0YVsxXSB9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IHNlbGVjdGlvbiA9IGVkaXRvci5saXN0U2VsZWN0aW9ucygpWzBdO1xuXHRcdGxldCBiZWdpbiA9IHNlbGVjdGlvbi5hbmNob3IubGluZTtcblx0XHRsZXQgZW5kID0gc2VsZWN0aW9uLmhlYWQubGluZTtcblx0XHRpZiAoYmVnaW4gPiBlbmQpIHtcblx0XHRcdGxldCB0ZW1wID0gYmVnaW47XG5cdFx0XHRiZWdpbiA9IGVuZDtcblx0XHRcdGVuZCA9IHRlbXA7XG5cdFx0fVxuXHRcdC8vIGNvbnNvbGUubG9nKGJlZ2luLCBlbmQpXG5cdFx0bGV0IG5ld19saW5lcyA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IGJlZ2luOyBpIDw9IGVuZDsgaSsrKSB7XG5cdFx0XHRpZiAoaSAhPSBiZWdpbikgbmV3X2xpbmVzICs9ICdcXG4nO1xuXHRcdFx0bmV3X2xpbmVzICs9IHRoaXMucHJlRm9ybWF0T25lTGluZShlZGl0b3IsIGkgKyAxKVswXTtcblx0XHR9XG5cdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShuZXdfbGluZXMsIHsgbGluZTogYmVnaW4sIGNoOiAwIH0sIHsgbGluZTogZW5kLCBjaDogZWRpdG9yLmdldExpbmUoZW5kKS5sZW5ndGggfSk7XG5cdFx0aWYgKHNlbGVjdGlvbi5hbmNob3IubGluZSA8IHNlbGVjdGlvbi5oZWFkLmxpbmUpIHtcblx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oeyBsaW5lOiBzZWxlY3Rpb24uYW5jaG9yLmxpbmUsIGNoOiAwIH0sIHsgbGluZTogc2VsZWN0aW9uLmhlYWQubGluZSwgY2g6IGVkaXRvci5nZXRMaW5lKHNlbGVjdGlvbi5oZWFkLmxpbmUpLmxlbmd0aCB9KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRlZGl0b3Iuc2V0U2VsZWN0aW9uKHsgbGluZTogc2VsZWN0aW9uLmFuY2hvci5saW5lLCBjaDogZWRpdG9yLmdldExpbmUoc2VsZWN0aW9uLmFuY2hvci5saW5lKS5sZW5ndGggfSwgeyBsaW5lOiBzZWxlY3Rpb24uaGVhZC5saW5lLCBjaDogMCB9KTtcblx0XHR9XG5cdH1cblxuXHQvLyBwYXJhbTogbGluZU51bWJlciBpcyAoMS1iYXNlZCksIFx1NUU5Rlx1NUYwM1x1NTFGRFx1NjU3MFxuXHRmb3JtYXRPbmVMaW5lID0gKGVkaXRvcjogRWRpdG9yLCBsaW5lTnVtYmVyOiBudW1iZXIpOiB2b2lkID0+IHtcblx0XHRjb25zdCBlZGl0b3JWaWV3ID0gZWRpdG9yLmNtIGFzIEVkaXRvclZpZXc7XG5cdFx0bGV0IHN0YXRlID0gZWRpdG9yVmlldy5zdGF0ZTtcblx0XHRsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lKGxpbmVOdW1iZXIpXG5cblx0XHRpZiAoZ2V0UG9zTGluZVR5cGUoc3RhdGUsIGxpbmUuZnJvbSkgPT0gTGluZVR5cGUudGV4dCB8fCBnZXRQb3NMaW5lVHlwZShzdGF0ZSwgbGluZS5mcm9tKSA9PSBMaW5lVHlwZS50YWJsZSkge1xuXHRcdFx0bGV0IG9sZExpbmUgPSBsaW5lLnRleHQ7XG5cdFx0XHRsZXQgbmV3TGluZSA9IHRoaXMuRm9ybWF0ZXIuZm9ybWF0TGluZShzdGF0ZSwgbGluZU51bWJlciwgdGhpcy5zZXR0aW5ncywgb2xkTGluZS5sZW5ndGgsIDApWzBdO1xuXHRcdFx0aWYgKG9sZExpbmUgIT0gbmV3TGluZSkge1xuXHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKG5ld0xpbmUsIHsgbGluZTogbGluZU51bWJlciAtIDEsIGNoOiAwIH0sIHsgbGluZTogbGluZU51bWJlciAtIDEsIGNoOiBvbGRMaW5lLmxlbmd0aCB9KTtcblx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IGxpbmVOdW1iZXIgLSAxLCBjaDogZWRpdG9yLmdldExpbmUobGluZU51bWJlciAtIDEpLmxlbmd0aCB9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gcGFyYW06IGxpbmVOdW1iZXIgaXMgKDEtYmFzZWQpXG5cdHByZUZvcm1hdE9uZUxpbmUgPSAoZWRpdG9yOiBFZGl0b3IsIGxpbmVOdW1iZXI6IG51bWJlciwgY2g6IG51bWJlciA9IC0xKTogW3N0cmluZywgbnVtYmVyXSA9PiB7XG5cdFx0Y29uc3QgZWRpdG9yVmlldyA9IGVkaXRvci5jbSBhcyBFZGl0b3JWaWV3O1xuXHRcdGxldCBzdGF0ZSA9IGVkaXRvclZpZXcuc3RhdGU7XG5cdFx0bGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShsaW5lTnVtYmVyKVxuXG5cdFx0bGV0IG5ld0xpbmUgPSBsaW5lLnRleHQ7XG5cdFx0bGV0IG5ld0NoID0gMDtcblx0XHRsZXQgY3VyQ2ggPSBsaW5lLnRleHQubGVuZ3RoO1xuXHRcdGlmIChjaCAhPSAtMSkge1xuXHRcdFx0Y3VyQ2ggPSBjaDtcblx0XHR9XG5cdFx0aWYgKGdldFBvc0xpbmVUeXBlKHN0YXRlLCBsaW5lLmZyb20pID09IExpbmVUeXBlLnRleHQgfHwgZ2V0UG9zTGluZVR5cGUoc3RhdGUsIGxpbmUuZnJvbSkgPT0gTGluZVR5cGUudGFibGUpIHtcblx0XHRcdGxldCBuZXdMaW5lRGF0YSA9IHRoaXMuRm9ybWF0ZXIuZm9ybWF0TGluZShzdGF0ZSwgbGluZU51bWJlciwgdGhpcy5zZXR0aW5ncywgY3VyQ2gsIDApO1xuXHRcdFx0bmV3TGluZSA9IG5ld0xpbmVEYXRhWzBdO1xuXHRcdFx0bmV3Q2ggPSBuZXdMaW5lRGF0YVsxXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gW25ld0xpbmUsIG5ld0NoXTtcblx0fVxuXG5cdGRlbGV0ZUJsYW5rTGluZXMgPSAoZWRpdG9yOiBFZGl0b3IpOiB2b2lkID0+IHtcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Zykge1xuXHRcdFx0Y29uc29sZS5sb2coJ2NvbmZpZy5zdHJpY3RMaW5lQnJlYWtzJywgdGhpcy5hcHAudmF1bHQuZ2V0Q29uZmlnKFwic3RyaWN0TGluZUJyZWFrc1wiKSk7XG5cdFx0XHQvLyByZXR1cm47XG5cdFx0fVxuXHRcdGxldCBzdHJpY3RMaW5lQnJlYWtzID0gdGhpcy5hcHAudmF1bHQuY29uZmlnLnN0cmljdExpbmVCcmVha3MgfHwgZmFsc2U7XG5cblx0XHRjb25zdCBlZGl0b3JWaWV3ID0gZWRpdG9yLmNtIGFzIEVkaXRvclZpZXc7XG5cdFx0bGV0IHN0YXRlID0gZWRpdG9yVmlldy5zdGF0ZTtcblx0XHRsZXQgZG9jID0gc3RhdGUuZG9jXG5cdFx0XG5cdFx0Y29uc3QgdHJlZSA9IGVuc3VyZVN5bnRheFRyZWUoc3RhdGUsIGRvYy5sZW5ndGgpO1xuXHRcdGlmICghdHJlZSl7XG5cdFx0XHRuZXcgTm90aWNlKCdFYXN5VHlwaW5nOiBTeW50YXggdHJlZSBpcyBub3QgcmVhZHkgeWV0LCBwbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluIGxhdGVyIScsIDUwMDApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRcblx0XHRsZXQgc3RhcnRfbGluZSA9IDE7XG5cdFx0bGV0IGVuZF9saW5lID0gZG9jLmxpbmVzO1xuXHRcdGxldCBsaW5lX251bSA9IGRvYy5saW5lcztcblx0XHRjb25zdCBzZWxlY3RlZCA9IGVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCgpICYmIGVkaXRvci5nZXRTZWxlY3Rpb24oKSAhPSAnJztcblx0XHRpZiAoc2VsZWN0ZWQpIHtcblx0XHRcdGxldCBzZWxlY3Rpb24gPSBlZGl0b3IubGlzdFNlbGVjdGlvbnMoKVswXTtcblx0XHRcdGxldCBiZWdpbiA9IHNlbGVjdGlvbi5hbmNob3IubGluZSArIDE7XG5cdFx0XHRsZXQgZW5kID0gc2VsZWN0aW9uLmhlYWQubGluZSArIDE7XG5cdFx0XHRpZiAoYmVnaW4gPiBlbmQpIHtcblx0XHRcdFx0bGV0IHRlbXAgPSBiZWdpbjtcblx0XHRcdFx0YmVnaW4gPSBlbmQ7XG5cdFx0XHRcdGVuZCA9IHRlbXA7XG5cdFx0XHR9XG5cdFx0XHRzdGFydF9saW5lID0gYmVnaW47XG5cdFx0XHRlbmRfbGluZSA9IGVuZFxuXHRcdH1cblxuXHRcdC8vIGlmKHRoaXMuc2V0dGluZ3MuZGVidWcpe1xuXHRcdC8vIFx0bGV0IGxpbmVfaW5kZXggPSBlZGl0b3IuZ2V0Q3Vyc29yKCkubGluZSArIDE7XG5cdFx0Ly8gXHRsZXQgY29udGVudCA9IGVkaXRvci5nZXRMaW5lKGVkaXRvci5nZXRDdXJzb3IoKS5saW5lKTtcblx0XHQvLyBcdGNvbnNvbGUubG9nKGNvbnRlbnQpO1xuXHRcdC8vIFx0Zm9yIChsZXQgaT0wO2k8Y29udGVudC5sZW5ndGg7aSsrKXtcblx0XHQvLyBcdFx0bGV0IG5vZGUgPSB0cmVlLnJlc29sdmUoZG9jLmxpbmUobGluZV9pbmRleCkuZnJvbStpLCAxKTtcblx0XHQvLyBcdFx0Y29uc29sZS5sb2coaSwgbm9kZS5uYW1lKVxuXHRcdC8vIFx0fVxuXHRcdC8vIFx0cmV0dXJuO1xuXHRcdC8vIH1cblxuXHRcdGxldCBkZWxldGVfaW5kZXg6IG51bWJlcltdID0gW107XG5cdFx0bGV0IGJsYW5rX3JlZyA9IC9eXFxzKiQvO1xuXHRcdGxldCByZW1haW5fbmV4dF9ibGFuayA9IGZhbHNlO1xuXG5cdFx0aWYgKHN0YXJ0X2xpbmUgIT0gMSkge1xuXHRcdFx0bGV0IG5vZGUgPSB0cmVlLnJlc29sdmUoZG9jLmxpbmUoc3RhcnRfbGluZSAtIDEpLmZyb20sIDEpO1xuXHRcdFx0aWYgKG5vZGUubmFtZS5jb250YWlucygnbGlzdCcpIHx8IG5vZGUubmFtZS5jb250YWlucygncXVvdGUnKSB8fCBub2RlLm5hbWUuY29udGFpbnMoJ2Jsb2NraWQnKSkge1xuXHRcdFx0XHRyZW1haW5fbmV4dF9ibGFuayA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChlbmRfbGluZSAhPSBsaW5lX251bSAmJiAhYmxhbmtfcmVnLnRlc3QoZG9jLmxpbmUoZW5kX2xpbmUgKyAxKS50ZXh0KSkge1xuXHRcdFx0ZW5kX2xpbmUgKz0gMTtcblx0XHR9XG5cblx0XHRmb3IgKGxldCBpID0gc3RhcnRfbGluZTsgaSA8PSBlbmRfbGluZTsgaSsrKSB7XG5cdFx0XHRsZXQgbGluZSA9IGRvYy5saW5lKGkpO1xuXHRcdFx0bGV0IHBvcyA9IGxpbmUuZnJvbTtcblx0XHRcdGxldCBub2RlID0gdHJlZS5yZXNvbHZlKHBvcywgMSk7XG5cblx0XHRcdC8vIFx1NUJGOVx1NEU4RVx1N0E3QVx1NzY3RFx1ODg0Q1xuXHRcdFx0aWYgKGJsYW5rX3JlZy50ZXN0KGxpbmUudGV4dCkgJiYgIXJlbWFpbl9uZXh0X2JsYW5rKSB7XG5cdFx0XHRcdGRlbGV0ZV9pbmRleC5wdXNoKGkpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGJsYW5rX3JlZy50ZXN0KGxpbmUudGV4dCkgJiYgcmVtYWluX25leHRfYmxhbmspIHtcblx0XHRcdFx0cmVtYWluX25leHRfYmxhbmsgPSBmYWxzZTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChub2RlLm5hbWUuY29udGFpbnMoJ2hyJykgJiYgZGVsZXRlX2luZGV4W2RlbGV0ZV9pbmRleC5sZW5ndGggLSAxXSA9PSBpIC0gMSkge1xuXHRcdFx0XHRkZWxldGVfaW5kZXgucG9wKClcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKG5vZGUubmFtZS5jb250YWlucygnbGlzdCcpIHx8IG5vZGUubmFtZS5jb250YWlucygncXVvdGUnKSB8fCBub2RlLm5hbWUuY29udGFpbnMoJ2Jsb2NraWQnKSkge1xuXHRcdFx0XHRyZW1haW5fbmV4dF9ibGFuayA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0cmVtYWluX25leHRfYmxhbmsgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Ly8gY29uc29sZS5sb2coXCJkZWxldGVfaW5kZXhcIixkZWxldGVfaW5kZXgpXG5cdFx0bGV0IG5ld0NvbnRlbnQgPSBcIlwiO1xuXHRcdGZvciAobGV0IGkgPSAxOyBpIDwgbGluZV9udW07IGkrKykge1xuXHRcdFx0aWYgKCFkZWxldGVfaW5kZXguY29udGFpbnMoaSkpIHtcblx0XHRcdFx0bmV3Q29udGVudCArPSBkb2MubGluZShpKS50ZXh0ICsgJ1xcbic7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghZGVsZXRlX2luZGV4LmNvbnRhaW5zKGxpbmVfbnVtKSkge1xuXHRcdFx0bmV3Q29udGVudCArPSBkb2MubGluZShsaW5lX251bSkudGV4dFxuXHRcdH1cblxuXHRcdGVkaXRvci5zZXRWYWx1ZShuZXdDb250ZW50KTtcblx0XHQvLyB0aGlzLkNvbnRlbnRQYXJzZXIucmVwYXJzZShlZGl0b3IuZ2V0VmFsdWUoKSwgMCk7XG5cdH1cblxuXHRzd2l0Y2hBdXRvRm9ybWF0dGluZygpIHtcblx0XHR0aGlzLnNldHRpbmdzLkF1dG9Gb3JtYXQgPSAhdGhpcy5zZXR0aW5ncy5BdXRvRm9ybWF0O1xuXHRcdGxldCBzdGF0dXMgPSB0aGlzLnNldHRpbmdzLkF1dG9Gb3JtYXQgPyAnb24nIDogJ29mZic7XG5cdFx0bmV3IE5vdGljZSgnRWFzeVR5cGluZzogQXV0b2Zvcm1hdCBpcyAnICsgc3RhdHVzICsgJyEnKTtcblx0fVxuXG5cdGNvbnZlcnQyQ29kZUJsb2NrKGVkaXRvcjogRWRpdG9yKSB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwiLS0tLS0gRWFzeVR5cGluZzogaW5zZXJ0IGNvZGUgYmxvY2stLS0tLVwiKTtcblx0XHRpZiAoZWRpdG9yLnNvbWV0aGluZ1NlbGVjdGVkICYmIGVkaXRvci5nZXRTZWxlY3Rpb24oKSAhPSBcIlwiKSB7XG5cdFx0XHRsZXQgc2VsZWN0ZWQgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRsZXQgc2VsZWN0ZWRSYW5nZSA9IGVkaXRvci5saXN0U2VsZWN0aW9ucygpWzBdO1xuXHRcdFx0bGV0IGFuY2hvciA9IHNlbGVjdGVkUmFuZ2UuYW5jaG9yO1xuXHRcdFx0bGV0IGhlYWQgPSBzZWxlY3RlZFJhbmdlLmhlYWQ7XG5cblx0XHRcdGxldCByZXBsYWNlbWVudCA9IFwiYGBgXFxuXCIgKyBzZWxlY3RlZCArIFwiXFxuYGBgXCI7XG5cdFx0XHQvLyBtYWtlIHN1cmUgYW5jaG9yIDwgaGVhZFxuXHRcdFx0aWYgKGFuY2hvci5saW5lID4gaGVhZC5saW5lIHx8IChhbmNob3IubGluZSA9PSBoZWFkLmxpbmUgJiYgYW5jaG9yLmNoID4gaGVhZC5jaCkpIHtcblx0XHRcdFx0bGV0IHRlbXAgPSBhbmNob3I7XG5cdFx0XHRcdGFuY2hvciA9IGhlYWQ7XG5cdFx0XHRcdGhlYWQgPSB0ZW1wO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGRzdExpbmUgPSBhbmNob3IubGluZTtcblx0XHRcdGlmIChhbmNob3IuY2ggIT0gMCkge1xuXHRcdFx0XHRyZXBsYWNlbWVudCA9ICdcXG4nICsgcmVwbGFjZW1lbnQ7XG5cdFx0XHRcdGRzdExpbmUgKz0gMTtcblx0XHRcdH1cblx0XHRcdGlmIChoZWFkLmNoICE9IGVkaXRvci5nZXRMaW5lKGhlYWQubGluZSkubGVuZ3RoKSB7XG5cdFx0XHRcdHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQgKyAnXFxuJztcblx0XHRcdH1cblx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKHJlcGxhY2VtZW50KTtcblx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBkc3RMaW5lLCBjaDogMyB9KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRsZXQgY3MgPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XG5cdFx0XHRsZXQgcmVwbGFjZSA9IFwiYGBgXFxuYGBgXCI7XG5cdFx0XHRsZXQgZHN0TGluZSA9IGNzLmxpbmU7XG5cdFx0XHRpZiAoY3MuY2ggIT0gMCkge1xuXHRcdFx0XHRyZXBsYWNlID0gXCJcXG5cIiArIHJlcGxhY2U7XG5cdFx0XHRcdGRzdExpbmUgKz0gMTtcblx0XHRcdH1cblx0XHRcdGlmIChjcy5jaCAhPSBlZGl0b3IuZ2V0TGluZShjcy5saW5lKS5sZW5ndGgpIHtcblx0XHRcdFx0cmVwbGFjZSA9IHJlcGxhY2UgKyAnXFxuJztcblx0XHRcdH1cblx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UocmVwbGFjZSwgY3MpO1xuXHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IGRzdExpbmUsIGNoOiAzIH0pO1xuXHRcdH1cblxuXHR9XG5cblx0cmVmcmVzaFNlbGVjdGlvblJlcGxhY2VSdWxlKCkge1xuXHRcdHRoaXMuU2VsZWN0aW9uUmVwbGFjZU1hcCA9IG5ldyBNYXAodGhpcy5zZWxlY3Rpb25SZXBsYWNlTWFwSW5pdGFsRGF0YSk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlci5sZW5ndGg7IGkrKykge1xuXHRcdFx0bGV0IHRyaWdnZXIgPSB0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlcltpXTtcblx0XHRcdGxldCBsZWZ0cyA9IHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZVtpXS5sZWZ0O1xuXHRcdFx0bGV0IHJpZ2h0cyA9IHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZVtpXS5yaWdodDtcblxuXHRcdFx0dGhpcy5TZWxlY3Rpb25SZXBsYWNlTWFwLnNldCh0cmlnZ2VyLCB7IGxlZnQ6IGxlZnRzLCByaWdodDogcmlnaHRzIH0pO1xuXHRcdH1cblx0fVxuXG5cdGFkZFVzZXJTZWxlY3Rpb25SZXBSdWxlKHRyaWdnZXI6IHN0cmluZywgbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVUcmlnZ2VyLmluY2x1ZGVzKHRyaWdnZXIpKSByZXR1cm4gZmFsc2U7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXIucHVzaCh0cmlnZ2VyKVxuXHRcdHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZS5wdXNoKHsgbGVmdDogbGVmdCwgcmlnaHQ6IHJpZ2h0IH0pO1xuXHRcdHRoaXMucmVmcmVzaFNlbGVjdGlvblJlcGxhY2VSdWxlKCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRkZWxldGVVc2VyU2VsZWN0aW9uUmVwUnVsZShpZHg6IG51bWJlcik6IHZvaWQge1xuXHRcdGlmIChpZHggPCAwIHx8IGlkeCA+PSB0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlci5sZW5ndGgpIHJldHVybjtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlci5zcGxpY2UoaWR4LCAxKTtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVmFsdWUuc3BsaWNlKGlkeCwgMSk7XG5cdFx0dGhpcy5yZWZyZXNoU2VsZWN0aW9uUmVwbGFjZVJ1bGUoKTtcblx0fVxuXG5cdHVwZGF0ZVVzZXJTZWxlY3Rpb25SZXBSdWxlKGlkeDogbnVtYmVyLCBsZWZ0OiBzdHJpbmcsIHJpZ2h0OiBzdHJpbmcpIHtcblx0XHRpZiAoaWR4IDwgMCB8fCBpZHggPj0gdGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXIubGVuZ3RoKSByZXR1cm47XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVZhbHVlW2lkeF0ubGVmdCA9IGxlZnQ7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVZhbHVlW2lkeF0ucmlnaHQgPSByaWdodDtcblx0XHR0aGlzLnJlZnJlc2hTZWxlY3Rpb25SZXBsYWNlUnVsZSgpO1xuXHR9XG5cblx0cmVmcmVzaFVzZXJEZWxldGVSdWxlKCkge1xuXHRcdHRoaXMuVXNlckRlbGV0ZVJ1bGVzID0gcnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QodGhpcy5zZXR0aW5ncy51c2VyRGVsZXRlUnVsZXNTdHJMaXN0KTtcblx0fVxuXG5cdGFkZFVzZXJEZWxldGVSdWxlKGJlZm9yZTogc3RyaW5nLCBhZnRlcjogc3RyaW5nKSB7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyRGVsZXRlUnVsZXNTdHJMaXN0LnB1c2goW2JlZm9yZSwgYWZ0ZXJdKTtcblx0XHR0aGlzLnJlZnJlc2hVc2VyRGVsZXRlUnVsZSgpO1xuXHR9XG5cblx0ZGVsZXRlVXNlckRlbGV0ZVJ1bGUoaWR4OiBudW1iZXIpIHtcblx0XHRpZiAoaWR4ID49IHRoaXMuc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdC5sZW5ndGggfHwgaWR4IDwgMCkgcmV0dXJuO1xuXHRcdHRoaXMuc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdC5zcGxpY2UoaWR4LCAxKTtcblx0XHR0aGlzLnJlZnJlc2hVc2VyRGVsZXRlUnVsZSgpO1xuXHR9XG5cblx0dXBkYXRlVXNlckRlbGV0ZVJ1bGUoaWR4OiBudW1iZXIsIGJlZm9yZTogc3RyaW5nLCBhZnRlcjogc3RyaW5nKSB7XG5cdFx0aWYgKGlkeCA+PSB0aGlzLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3QubGVuZ3RoIHx8IGlkeCA8IDApIHJldHVybjtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3RbaWR4XVswXSA9IGJlZm9yZTtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3RbaWR4XVsxXSA9IGFmdGVyO1xuXHRcdHRoaXMucmVmcmVzaFVzZXJEZWxldGVSdWxlKCk7XG5cdH1cblxuXHRyZWZyZXNoVXNlckNvbnZlcnRSdWxlKCkge1xuXHRcdHRoaXMuVXNlckNvbnZlcnRSdWxlcyA9IHJ1bGVTdHJpbmdMaXN0MlJ1bGVMaXN0KHRoaXMuc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3QpO1xuXHR9XG5cblx0YWRkVXNlckNvbnZlcnRSdWxlKGJlZm9yZTogc3RyaW5nLCBhZnRlcjogc3RyaW5nKSB7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyQ29udmVydFJ1bGVzU3RyTGlzdC5wdXNoKFtiZWZvcmUsIGFmdGVyXSk7XG5cdFx0dGhpcy5yZWZyZXNoVXNlckNvbnZlcnRSdWxlKCk7XG5cdH1cblxuXHRkZWxldGVVc2VyQ29udmVydFJ1bGUoaWR4OiBudW1iZXIpIHtcblx0XHRpZiAoaWR4ID49IHRoaXMuc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3QubGVuZ3RoIHx8IGlkeCA8IDApIHJldHVybjtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0LnNwbGljZShpZHgsIDEpO1xuXHRcdHRoaXMucmVmcmVzaFVzZXJDb252ZXJ0UnVsZSgpO1xuXHR9XG5cblx0Z2V0Q29tbWFuZE5hbWVNYXAoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG5cdFx0Y29uc3QgbGFuZyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFuZ3VhZ2UnKTtcblxuXHRcdGxldCBjb21tYW5kX25hbWVfbWFwX2VuID0gbmV3IE1hcChbXG5cdFx0XHRbXCJmb3JtYXRfYXJ0aWNsZVwiLCBcIkZvcm1hdCBjdXJyZW50IGFydGljbGVcIl0sXG5cdFx0XHRbXCJmb3JtYXRfc2VsZWN0aW9uXCIsIFwiRm9ybWF0IHNlbGVjdGVkIHRleHQgb3IgY3VycmVudCBsaW5lXCJdLFxuXHRcdFx0W1wiZGVsZXRlX2JsYW5rX2xpbmVcIiwgXCJEZWxldGUgYmxhbmsgbGluZXMgb2YgdGhlIHNlbGVjdGVkIG9yIHdob2xlIGFydGljbGVcIl0sXG5cdFx0XHRbXCJpbnNlcnRfY29kZWJsb2NrXCIsIFwiSW5zZXJ0IGNvZGUgYmxvY2sgdy93byBzZWxlY3Rpb25cIl0sXG5cdFx0XHRbXCJzd2l0Y2hfYXV0b2Zvcm1hdFwiLCBcIlN3aXRjaCBhdXRvZm9ybWF0XCJdLFxuXHRcdFx0W1wicGFzdGVfd29fZm9ybWF0XCIsIFwiUGFzdGUgd2l0aG91dCBmb3JtYXRcIl0sXG5cdFx0XSk7XG5cblx0XHRsZXQgY29tbWFuZF9uYW1lX21hcF96aF9UVyA9IG5ldyBNYXAoW1xuXHRcdFx0W1wiZm9ybWF0X2FydGljbGVcIiwgXCJcdTY4M0NcdTVGMEZcdTUzMTZcdTUxNjhcdTY1ODdcIl0sXG5cdFx0XHRbXCJmb3JtYXRfc2VsZWN0aW9uXCIsIFwiXHU2ODNDXHU1RjBGXHU1MzE2XHU5MDc4XHU0RTJEXHU5MEU4XHU1MjA2L1x1NzU3Nlx1NTI0RFx1ODg0Q1wiXSxcblx0XHRcdFtcImRlbGV0ZV9ibGFua19saW5lXCIsIFwiXHU1MjJBXHU5NjY0XHU5MDc4XHU0RTJEXHU5MEU4XHU1MjA2L1x1NTE2OFx1NjU4N1x1NzY4NFx1NTkxQVx1OTkxOFx1N0E3QVx1NzY3RFx1ODg0Q1wiXSxcblx0XHRcdFtcImluc2VydF9jb2RlYmxvY2tcIiwgXCJcdTYzRDJcdTUxNjVcdTRFRTNcdTc4QkNcdTU4NEFcIl0sXG5cdFx0XHRbXCJzd2l0Y2hfYXV0b2Zvcm1hdFwiLCBcIlx1NTIwN1x1NjNEQlx1ODFFQVx1NTJENVx1NjgzQ1x1NUYwRlx1NTMxNlx1OTU4Qlx1OTVEQ1wiXSxcblx0XHRcdFtcInBhc3RlX3dvX2Zvcm1hdFwiLCBcIlx1NzEyMVx1NjgzQ1x1NUYwRlx1NTMxNlx1N0M5OFx1OENCQ1wiXSxcblx0XHRdKTtcblxuXHRcdGxldCBjb21tYW5kX25hbWVfbWFwX3poID0gbmV3IE1hcChbXG5cdFx0XHRbXCJmb3JtYXRfYXJ0aWNsZVwiLCBcIlx1NjgzQ1x1NUYwRlx1NTMxNlx1NTE2OFx1NjU4N1wiXSxcblx0XHRcdFtcImZvcm1hdF9zZWxlY3Rpb25cIiwgXCJcdTY4M0NcdTVGMEZcdTUzMTZcdTkwMDlcdTRFMkRcdTkwRThcdTUyMDYvXHU1RjUzXHU1MjREXHU4ODRDXCJdLFxuXHRcdFx0W1wiZGVsZXRlX2JsYW5rX2xpbmVcIiwgXCJcdTUyMkFcdTk2NjRcdTkwMDlcdTRFMkRcdTkwRThcdTUyMDYvXHU1MTY4XHU2NTg3XHU3Njg0XHU1OTFBXHU0RjU5XHU3QTdBXHU3NjdEXHU4ODRDXCJdLFxuXHRcdFx0W1wiaW5zZXJ0X2NvZGVibG9ja1wiLCBcIlx1NjNEMlx1NTE2NVx1NEVFM1x1NzgwMVx1NTc1N1wiXSxcblx0XHRcdFtcInN3aXRjaF9hdXRvZm9ybWF0XCIsIFwiXHU1MjA3XHU2MzYyXHU4MUVBXHU1MkE4XHU2ODNDXHU1RjBGXHU1MzE2XHU1RjAwXHU1MTczXCJdLFxuXHRcdFx0W1wicGFzdGVfd29fZm9ybWF0XCIsIFwiXHU2NUUwXHU2ODNDXHU1RjBGXHU1MzE2XHU3Qzk4XHU4RDM0XCJdLFxuXHRcdF0pO1xuXG5cdFx0bGV0IGNvbW1hbmRfbmFtZV9tYXBfcnUgPSBuZXcgTWFwKFtcblx0XHRcdFtcImZvcm1hdF9hcnRpY2xlXCIsIFwiXHUwNDI0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NDJcdTA0NENcdTA0NEVcIl0sXG5cdFx0XHRbXCJmb3JtYXRfc2VsZWN0aW9uXCIsIFwiXHUwNDI0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDNcIl0sXG5cdFx0XHRbXCJkZWxldGVfYmxhbmtfbGluZVwiLCBcIlx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDM4IFx1MDQzMiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0M0MgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzMlx1MDQ0MVx1MDQzNVx1MDQzOSBcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NDJcdTA0NENcdTA0MzVcIl0sXG5cdFx0XHRbXCJpbnNlcnRfY29kZWJsb2NrXCIsIFwiXHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzQSBcdTA0M0FcdTA0M0VcdTA0MzRcdTA0MzAgXHUwNDQxL1x1MDQzMVx1MDQzNVx1MDQzNyBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcdTA0M0NcIl0sXG5cdFx0XHRbXCJzd2l0Y2hfYXV0b2Zvcm1hdFwiLCBcIlx1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzVcIl0sXG5cdFx0XHRbXCJwYXN0ZV93b19mb3JtYXRcIiwgXCJcdTA0MTJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDMxXHUwNDM1XHUwNDM3IFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RlwiXSxcblx0XHRdKTtcblxuXHRcdGxldCBjb21tYW5kX25hbWVfbWFwID0gY29tbWFuZF9uYW1lX21hcF9lbjtcblx0XHRpZiAobGFuZyA9PSAnemgnKSB7XG5cdFx0XHRjb21tYW5kX25hbWVfbWFwID0gY29tbWFuZF9uYW1lX21hcF96aDtcblx0XHR9XG5cdFx0ZWxzZSBpZiAobGFuZyA9PSAnemgtVFcnKSB7XG5cdFx0XHRjb21tYW5kX25hbWVfbWFwID0gY29tbWFuZF9uYW1lX21hcF96aF9UVztcblx0XHR9XG5cdFx0ZWxzZSBpZiAobGFuZyA9PSBcInJ1XCIpIHtcblx0XHRcdGNvbW1hbmRfbmFtZV9tYXAgPSBjb21tYW5kX25hbWVfbWFwX3J1O1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21tYW5kX25hbWVfbWFwO1xuXHR9XG5cblx0dXBkYXRlVXNlckNvbnZlcnRSdWxlKGlkeDogbnVtYmVyLCBiZWZvcmU6IHN0cmluZywgYWZ0ZXI6IHN0cmluZykge1xuXHRcdGlmIChpZHggPj0gdGhpcy5zZXR0aW5ncy51c2VyQ29udmVydFJ1bGVzU3RyTGlzdC5sZW5ndGggfHwgaWR4IDwgMCkgcmV0dXJuO1xuXHRcdHRoaXMuc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3RbaWR4XVswXSA9IGJlZm9yZTtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0W2lkeF1bMV0gPSBhZnRlcjtcblx0XHR0aGlzLnJlZnJlc2hVc2VyQ29udmVydFJ1bGUoKTtcblx0fVxuXG5cdGdldEVkaXRvciA9ICgpOiBFZGl0b3IgfCBudWxsID0+IHtcblx0XHRsZXQgZWRpdG9yID0gbnVsbDtcblx0XHRsZXQgbWFya2Rvd25WaWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcblx0XHRpZiAobWFya2Rvd25WaWV3KSB7XG5cdFx0XHRlZGl0b3IgPSBtYXJrZG93blZpZXcuZWRpdG9yO1xuXHRcdH1cblx0XHRpZiAoZWRpdG9yID09PSBudWxsKSBjb25zb2xlLmxvZygnY2FuXFwndCBnZXQgZWRpdG9yJyk7XG5cdFx0cmV0dXJuIGVkaXRvcjtcblx0fVxuXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcblx0fVxuXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuXHR9XG59IiwgImltcG9ydCB7IE5vdGljZX0gZnJvbSBcIm9ic2lkaWFuXCJcbmltcG9ydCB7IEVhc3lUeXBpbmdTZXR0aW5ncywgV29ya01vZGUgfSBmcm9tICcuL3NldHRpbmdzJ1xuaW1wb3J0IHsgQW5ub3RhdGlvbiwgRWRpdG9yU3RhdGUsIEV4dGVuc2lvbiwgU3RhdGVGaWVsZCwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uU3BlYywgVGV4dCwgTGluZSB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IG9mZnNldFRvUG9zLCBwb3NUb09mZnNldCwgc3RyaW5nRGVsZXRlQXQsIHN0cmluZ0luc2VydEF0LCBpc1BhcmFtRGVmaW5lZH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7IGVuc3VyZVN5bnRheFRyZWUsIHN5bnRheFRyZWUgfSBmcm9tIFwiQGNvZGVtaXJyb3IvbGFuZ3VhZ2VcIjtcbmltcG9ydCB7IHByaW50IH0gZnJvbSBcIi4vdXRpbHNcIlxuXG5leHBvcnQgZW51bSBMaW5lVHlwZSB7IHRleHQgPSAndGV4dCcsIGNvZGVibG9jayA9ICdjb2RlYmxvY2snLCBmb3JtdWxhID0gJ2Zvcm11bGEnLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfc3RhcnQgPSAnY29kZV9ibG9ja19zdGFydCcsIGNvZGVfZW5kID0gJ2NvZGVfYmxvY2tfZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vbmUgPSAnbm9uZScsIGZyb250bWF0dGVyPVwiZnJvbnRtYXR0ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlPSdxdW90ZScsIGNhbGxvdXRfdGl0bGU9J2NhbGxvdXRfdGl0bGUnLCBsaXN0PSdsaXN0JywgdGFibGU9ICd0YWJsZScgfVxuXG5leHBvcnQgZW51bSBTcGFjZVN0YXRlIHtcbiAgICBub25lLFxuICAgIHNvZnQsXG4gICAgc3RyaWN0XG59XG5cbmV4cG9ydCBlbnVtIElubGluZVR5cGUge1xuICAgIHRleHQgPSAndGV4dCcsIGNvZGUgPSAnY29kZScsIGZvcm11bGEgPSAnZm9ybXVsYScsXG4gICAgd2lraWxpbmsgPSAnd2lraWxpbmsnLCBtZGxpbmsgPSBcIm1kbGlua1wiLFxuICAgIHVzZXIgPSAndXNlci1kZWZpbmVkJywgbm9uZSA9ICdub25lJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElubGluZUNoYW5nZSB7XG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGJlZ2luOiBudW1iZXIsXG4gICAgZW5kOiBudW1iZXIsXG4gICAgb3JpZ2luOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcnRpY2xlUGFydCB7XG4gICAgdHlwZTogTGluZVR5cGU7XG4gICAgYmVnaW46IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElubGluZVBhcnQge1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICB0eXBlOiBJbmxpbmVUeXBlO1xuICAgIGJlZ2luOiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXI7XG4gICAgbGVmdFNwYWNlUmVxdWlyZTogU3BhY2VTdGF0ZTtcbiAgICByaWdodFNwYWNlUmVxdWlyZTogU3BhY2VTdGF0ZTtcbn1cblxuZXhwb3J0IGNsYXNzIExpbmVGb3JtYXRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICBzeW50YXhUcmVlTm9kZU5hbWVUeXBlKG5hbWU6c3RyaW5nKTpJbmxpbmVUeXBle1xuICAgICAgICBpZihuYW1lLmNvbnRhaW5zKCdjb2RlJykgJiYgIW5hbWUuY29udGFpbnMoXCJsaW5rXCIpKXtcbiAgICAgICAgICAgIHJldHVybiBJbmxpbmVUeXBlLmNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihuYW1lLmNvbnRhaW5zKCdtYXRoJykpe1xuICAgICAgICAgICAgcmV0dXJuIElubGluZVR5cGUuZm9ybXVsYTtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgICAgcmV0dXJuIElubGluZVR5cGUudGV4dDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcmFtIGxpbmVOdW06IDEtYmFzZWQgbGluZSBudW1iZXJcbiAgICBwYXJzZUxpbmVXaXRoU3ludGF4VHJlZShzdGF0ZTogRWRpdG9yU3RhdGUsIGxpbmVOdW06bnVtYmVyLCByZWdSZWdFeHA/OiBzdHJpbmcpe1xuICAgICAgICBsZXQgbGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYTogSW5saW5lUGFydFtdID0gW107XG4gICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUobGluZU51bSk7XG4gICAgICAgIGNvbnN0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKTtcbiAgICAgICAgbGV0IHBvcyA9IGxpbmUuZnJvbTtcbiAgICAgICAgbGV0IHByZXZOb2RlVHlwZTpJbmxpbmVUeXBlID0gSW5saW5lVHlwZS5ub25lO1xuICAgICAgICBsZXQgcHJldkJlZ2luSWR4ID0gMDtcbiAgICAgICAgd2hpbGUocG9zPGxpbmUudG8pe1xuICAgICAgICAgICAgbGV0IG5vZGUgPSB0cmVlLnJlc29sdmUocG9zLCAxKTtcbiAgICAgICAgICAgIGxldCBjdXJOb2RlVHlwZSA9IHRoaXMuc3ludGF4VHJlZU5vZGVOYW1lVHlwZShub2RlLm5hbWUpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKHByZXZOb2RlVHlwZT09SW5saW5lVHlwZS5ub25lKXtcbiAgICAgICAgICAgICAgICBwcmV2Tm9kZVR5cGU9Y3VyTm9kZVR5cGU7XG4gICAgICAgICAgICAgICAgcHJldkJlZ2luSWR4PTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKHByZXZOb2RlVHlwZT09Y3VyTm9kZVR5cGUpe31cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgbGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDpsaW5lLnRleHQuc3Vic3RyaW5nKHByZXZCZWdpbklkeCwgcG9zLWxpbmUuZnJvbSksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6cHJldk5vZGVUeXBlLFxuICAgICAgICAgICAgICAgICAgICBiZWdpbjpwcmV2QmVnaW5JZHgsXG4gICAgICAgICAgICAgICAgICAgIGVuZDpwb3MtbGluZS5mcm9tLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0U3BhY2VSZXF1aXJlOlNwYWNlU3RhdGUubm9uZSxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRTcGFjZVJlcXVpcmU6U3BhY2VTdGF0ZS5ub25lXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBwcmV2Tm9kZVR5cGUgPSBjdXJOb2RlVHlwZTtcbiAgICAgICAgICAgICAgICBwcmV2QmVnaW5JZHggPSBwb3MtbGluZS5mcm9tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdXBkYXRlIG5leHQgcG9zXG4gICAgICAgICAgICBpZiAoY3VyTm9kZVR5cGUgPT0gSW5saW5lVHlwZS50ZXh0KXtcbiAgICAgICAgICAgICAgICBwb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAgICAgcG9zID0gbm9kZS50bztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYocG9zPT1saW5lLnRvKXtcbiAgICAgICAgICAgICAgICBsaW5lUGFydHNPZlR4dENvZGVGb3JtdWxhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OmxpbmUudGV4dC5zdWJzdHJpbmcocHJldkJlZ2luSWR4LCBwb3MtbGluZS5mcm9tKSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTpwcmV2Tm9kZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGJlZ2luOnByZXZCZWdpbklkeCxcbiAgICAgICAgICAgICAgICAgICAgZW5kOnBvcy1saW5lLmZyb20sXG4gICAgICAgICAgICAgICAgICAgIGxlZnRTcGFjZVJlcXVpcmU6U3BhY2VTdGF0ZS5ub25lLFxuICAgICAgICAgICAgICAgICAgICByaWdodFNwYWNlUmVxdWlyZTpTcGFjZVN0YXRlLm5vbmVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwibGluZSBwYXJ0czogXCIsIGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGEpO1xuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgbGV0IHJldEFycmF5OiBJbmxpbmVQYXJ0W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lUGFydHNPZlR4dENvZGVGb3JtdWxhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYVtpXS50eXBlICE9IElubGluZVR5cGUudGV4dCkge1xuICAgICAgICAgICAgICAgIHJldEFycmF5LnB1c2gobGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcEFycmF5OiBJbmxpbmVQYXJ0W107XG4gICAgICAgICAgICAgICAgaWYgKGlzUGFyYW1EZWZpbmVkKHJlZ1JlZ0V4cCkpXG4gICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheSA9IHNwbGl0VGV4dFdpdGhMaW5rQW5kVXNlckRlZmluZWQobGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYVtpXS5jb250ZW50LCByZWdSZWdFeHApO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGVtcEFycmF5ID0gc3BsaXRUZXh0V2l0aExpbmtBbmRVc2VyRGVmaW5lZChsaW5lUGFydHNPZlR4dENvZGVGb3JtdWxhW2ldLmNvbnRlbnQpO1xuICAgIFxuICAgICAgICAgICAgICAgIHRlbXBBcnJheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmJlZ2luICs9IGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGFbaV0uYmVnaW47XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZW5kICs9IGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGFbaV0uYmVnaW47XG4gICAgICAgICAgICAgICAgICAgIHJldEFycmF5LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2cocmV0QXJyYXkpXG4gICAgICAgIHJldHVybiByZXRBcnJheTtcbiAgICB9XG5cbiAgICBmb3JtYXRMaW5lT2ZEb2Moc3RhdGU6IEVkaXRvclN0YXRlLCBzZXR0aW5nczogRWFzeVR5cGluZ1NldHRpbmdzLCBmcm9tQjogbnVtYmVyLCB0b0I6IG51bWJlciwgaW5zZXJ0ZWRTdHI6IHN0cmluZyk6IFtUcmFuc2FjdGlvblNwZWNbXSwgVHJhbnNhY3Rpb25TcGVjXSB8IG51bGwge1xuICAgICAgICBsZXQgZG9jID0gc3RhdGUuZG9jO1xuICAgICAgICBsZXQgbGluZSA9IGRvYy5saW5lQXQoZnJvbUIpLnRleHQ7XG4gICAgICAgIGxldCByZXMgPSBudWxsXG4gICAgICAgIGlmIChpbnNlcnRlZFN0ci5jb250YWlucyhcIlxcblwiKSlcbiAgICAgICAge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0Zyb21CLCBUb0InLCBmcm9tQiwgdG9CKVxuICAgICAgICAgICAgcmVzID0gdGhpcy5mb3JtYXRMaW5lKHN0YXRlLCBkb2MubGluZUF0KGZyb21CKS5udW1iZXIsIHNldHRpbmdzLCBvZmZzZXRUb1Bvcyhkb2MsIGZyb21CKS5jaCwgb2Zmc2V0VG9Qb3MoZG9jLCBmcm9tQikuY2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmVzID0gdGhpcy5mb3JtYXRMaW5lKHN0YXRlLCBkb2MubGluZUF0KGZyb21CKS5udW1iZXIsIHNldHRpbmdzLCBvZmZzZXRUb1Bvcyhkb2MsIHRvQikuY2gsIG9mZnNldFRvUG9zKGRvYywgZnJvbUIpLmNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzID09PW51bGwgfHwgcmVzWzJdLmxlbmd0aD09MCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgbmV3bGluZSA9IHN0cmluZ0luc2VydEF0KHJlc1swXSwgcmVzWzFdLCBcInxcIik7XG4gICAgICAgIC8vIGlmIChzZXR0aW5ncy5kZWJ1ZykgY29uc29sZS5sb2coXCJFYXN5VHlwaW5nOiBOZXcgTGluZSBTdHJpbmc6XCIsIG5ld2xpbmUpXG5cbiAgICAgICAgbGV0IGNoYW5nZXM6IFRyYW5zYWN0aW9uU3BlY1tdID0gW107XG4gICAgICAgIGxldCBvZmZzZXQgPSBkb2MubGluZUF0KGZyb21CKS5mcm9tO1xuXG4gICAgICAgIGZvcihsZXQgY2hhbmdlSXRlbSBvZiByZXNbMl0pXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgY2hhbmdlczp7ZnJvbTogb2Zmc2V0K2NoYW5nZUl0ZW0uYmVnaW4sIHRvOm9mZnNldCtjaGFuZ2VJdGVtLmVuZCwgaW5zZXJ0OmNoYW5nZUl0ZW0udGV4dH0sIHVzZXJFdmVudDpcIkVhc3lUeXBpbmcuY2hhbmdlXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc2VydGVkU3RyLmNvbnRhaW5zKFwiXFxuXCIpKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiaW5zZXJ0U3RyXCIsIGluc2VydGVkU3RyKVxuICAgICAgICAgICAgcmVzWzFdKz0gaW5zZXJ0ZWRTdHIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY2hhbmdlcywge3NlbGVjdGlvbjp7YW5jaG9yOm9mZnNldCtyZXNbMV19LCB1c2VyRXZlbnQ6XCJFYXN5VHlwaW5nLmNoYW5nZVwifV07XG4gICAgfVxuXG4gICAgLy8gXHU4RkQ0XHU1NkRFXHU1MDNDXHVGRjFBIFtcdTY3MDBcdTdFQzhcdTc2ODRcdTg4NENcdUZGMENcdTY3MDBcdTdFQzhcdTUxNDlcdTY4MDdcdTRGNERcdTdGNkVcdUZGMENcdTUxODVcdTVCQjlcdTY1MzlcdTUzRDhdXG4gICAgLy8gcGFyYW0gbGluZU51bTogMS1iYXNlZCBsaW5lIG51bWJlclxuICAgIC8vIGN1ckNoOiBcdTUxNDlcdTY4MDdcdTU3MjhcdTVGNTNcdTUyNERcdTg4NENcdTc2ODRcdTRGNERcdTdGNkVcbiAgICAvLyBwcmV2Q2g6IFx1NTE0OVx1NjgwN1x1NTcyOFx1NTI0RFx1NEUwMFx1NjVGNlx1NTIzQlx1NTcyOFx1NUY1M1x1NTI0RFx1ODg0Q1x1NzY4NFx1NEY0RFx1N0Y2RVxuICAgIGZvcm1hdExpbmUoc3RhdGU6IEVkaXRvclN0YXRlLCBsaW5lTnVtOm51bWJlciwgc2V0dGluZ3M6IEVhc3lUeXBpbmdTZXR0aW5ncywgY3VyQ2g6IG51bWJlciwgcHJldkNoPzogbnVtYmVyKTogW3N0cmluZywgbnVtYmVyLCBJbmxpbmVDaGFuZ2VbXV0gfCBudWxsIHtcbiAgICAgICAgLy8gbmV3IE5vdGljZShcImZvcm1hdC1ub3dcIik7XG4gICAgICAgIGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUobGluZU51bSkudGV4dDtcbiAgICAgICAgbGV0IHJlZ051bGwgPSAvXlxccyokL2c7XG4gICAgICAgIGlmIChyZWdOdWxsLnRlc3QobGluZSkpIHJldHVybiBbbGluZSwgY3VyQ2gsIFtdXTtcbiAgICAgICAgLy8gMS4gXHU1MjEyXHU1MjA2XHU0RTAwXHU4ODRDXHU2NTg3XHU1QjU3XHU3Njg0XHU1MTg1XHU5MEU4XHU0RTBEXHU1NDBDXHU2QTIxXHU1NzU3XHU1MzNBXHU1N0RGXG5cbiAgICAgICAgbGV0IGxpbmVQYXJ0cyA9IHNldHRpbmdzLlVzZXJEZWZpbmVkUmVnU3dpdGNoXG4gICAgICAgID8gdGhpcy5wYXJzZUxpbmVXaXRoU3ludGF4VHJlZShzdGF0ZSwgbGluZU51bSwgc2V0dGluZ3MuVXNlckRlZmluZWRSZWdFeHApXG4gICAgICAgIDogdGhpcy5wYXJzZUxpbmVXaXRoU3ludGF4VHJlZShzdGF0ZSwgbGluZU51bSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwibGluZSBwYXJ0c1xcblwiLCBsaW5lUGFydHMpO1xuXG4gICAgICAgIC8vIFx1NTkwN1x1NEVGRFx1NTM5Rlx1Njc2NVx1NzY4NGxpbmVQYXJ0cywgXHU2REYxXHU2MkY3XHU4RDFEXG4gICAgICAgIGxldCBsaW5lUGFydHNPcmlnaW4gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxpbmVQYXJ0cykpO1xuICAgICAgICBsZXQgaW5saW5lQ2hhbmdlTGlzdDogSW5saW5lQ2hhbmdlW10gPSBbXTtcblxuICAgICAgICBsZXQgY3Vyc29yTGluZVBhcnRJbmRleCA9IC0xO1xuICAgICAgICBsZXQgY3Vyc29yUmVsYXRpdmVJbmRleCA9IC0xO1xuICAgICAgICBsZXQgcmVzdWx0Q3Vyc29yQ2ggPSAwOyAgICAgLy8gXHU4RjkzXHU1MUZBXHU3Njg0XHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXG5cbiAgICAgICAgLy8gMi4gXHU2MjdFXHU1MjMwXHU1MTQ5XHU2ODA3XHU2MjQwXHU1NzI4XHU3Njg0XHU5MEU4XHU1MjA2XHVGRjBDXHU1OTgyXHU2NzlDXHU2NjJGIElubGluZVBhcnQudGV4dFx1RkYwQ1x1NTIxOVx1NTcyOFx1NTE0OVx1NjgwN1x1NTkwNFx1NjNEMlx1NTE2NSdcXDAnXHU2NzY1XHU2ODA3XHU4QkIwXHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY3VyQ2ggPiBsaW5lUGFydHNbaV0uYmVnaW4gJiYgY3VyQ2ggPD0gbGluZVBhcnRzW2ldLmVuZCkge1xuICAgICAgICAgICAgICAgIGN1cnNvckxpbmVQYXJ0SW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGN1cnNvclJlbGF0aXZlSW5kZXggPSBjdXJDaCAtIGxpbmVQYXJ0c1tpXS5iZWdpbjtcbiAgICAgICAgICAgICAgICBpZiAobGluZVBhcnRzW2ldLnR5cGUgPT09IElubGluZVR5cGUudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9IHN0cmluZ0luc2VydEF0KGxpbmVQYXJ0c1tpXS5jb250ZW50LCBjdXJzb3JSZWxhdGl2ZUluZGV4LCAnXFwwJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHRMaW5lID0gJyc7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICAvLyBcdTRGRERcdTVCNThcdTUyNERcdTRFMDBcdTkwRThcdTUyMDZcdTc2ODRcdTUzM0FcdTU3NTdcdTdDN0JcdTU3OEJcdUZGMENJbmxpbmVUeXBlLm5vbmUgXHU0RUUzXHU4ODY4XHU0RTAwXHU4ODRDXHU3Njg0XHU1RjAwXHU1OUNCXG4gICAgICAgIGxldCBwcmV2UGFydFR5cGU6IHN0cmluZyA9IElubGluZVR5cGUubm9uZTtcbiAgICAgICAgbGV0IHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZTtcblxuICAgICAgICAvLyAzLiBcdTkwNERcdTUzODZcdTZCQ0ZcdTRFMkFcdTg4NENcdTkwRThcdTUyMDZcdUZGMENcdThGREJcdTg4NENcdTY4M0NcdTVGMEZcdTUzMTZcdTU5MDRcdTc0MDZcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIDMuMSBcdTU5ODJcdTY3OUNcdTg4NENcdTUxODVcdTdCMkNcdTRFMDBcdTkwRThcdTUyMDZcdTRFM0FcdTY1ODdcdTY3MkNcdUZGMENcdTUyMTlcdTU5MDRcdTc0MDZcdTUzRTVcdTk5OTZcdTVCNTdcdTZCQ0RcdTU5MjdcdTUxOTlcdTc2ODRcdTkwRThcdTUyMDZcbiAgICAgICAgICAgIGlmIChpID09PSAwICYmIGxpbmVQYXJ0c1tpXS50eXBlID09PSBJbmxpbmVUeXBlLnRleHQgJiYgc2V0dGluZ3MuQXV0b0NhcGl0YWwpIHtcbiAgICAgICAgICAgICAgICAvLyAzLjEuMSBcdTU5ODJcdTY3OUMgcHJldkN1cnNvciBcdTRFMTRcdTUxNDlcdTY4MDdcdTRFMERcdTU3MjhcdTZCNjRcdTkwRThcdTUyMDZcdUZGMENcdTUyMTlcdThERjNcdThGQzdcbiAgICAgICAgICAgICAgICBpZiAoaXNQYXJhbURlZmluZWQocHJldkNoKSAmJiBjdXJzb3JMaW5lUGFydEluZGV4ICE9IDApIHsgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnRmlyc3RTZW50ZW5jZSA9IC9eXFxzKihcXC0gKFxcW1t4IF1cXF0gKT8pP1x1MjAxQz9bYS16XFx1MDQwMVxcdTA0NTFcXHUwNDEwLVxcdTA0NGZdL2c7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdIZWFkZXJTZW50ZW5jZSA9IC9eKCMrIHw+KyA/fFx1MjAxQylbYS16XFx1MDQwMVxcdTA0NTFcXHUwNDEwLVxcdTA0NGZdL2c7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0Y29weSA9IGxpbmVQYXJ0c1swXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSByZWdGaXJzdFNlbnRlbmNlLmV4ZWModGV4dGNvcHkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2hIZWFkZXIgPSByZWdIZWFkZXJTZW50ZW5jZS5leGVjKHRleHRjb3B5KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRzdENoYXJJbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRzdENoYXJJbmRleCA9IHJlZ0ZpcnN0U2VudGVuY2UubGFzdEluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaEhlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHN0Q2hhckluZGV4ID0gcmVnSGVhZGVyU2VudGVuY2UubGFzdEluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5BdXRvQ2FwaXRhbE1vZGUgPT0gV29ya01vZGUuR2xvYmFsbHkgfHwgKGlzUGFyYW1EZWZpbmVkKHByZXZDaCkgJiYgZHN0Q2hhckluZGV4ID49IHByZXZDaCAmJiBkc3RDaGFySW5kZXggPCBjdXJDaCkpIHsgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRzdENoYXJJbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRzdENoYXJJbmRleCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbMF0uY29udGVudCA9IHRleHRjb3B5LnN1YnN0cmluZygwLCBkc3RDaGFySW5kZXgpICsgdGV4dGNvcHkuY2hhckF0KGRzdENoYXJJbmRleCkudG9VcHBlckNhc2UoKSArIHRleHRjb3B5LnN1YnN0cmluZyhkc3RDaGFySW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoIChsaW5lUGFydHNbaV0udHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIDMuMi4xIFx1NTkwNFx1NzQwNlx1NjU4N1x1NjcyQ1x1NTMzQVx1NTc1N1xuICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS50ZXh0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0LjQgXHU1OTA0XHU3NDA2XHU1M0U1XHU5OTk2XHU1QjU3XHU2QkNEXHU1OTI3XHU1MTk5XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5BdXRvQ2FwaXRhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZyA9IC9bXFwuXFw/XFwhXHUzMDAyXHVGRjAxXHVGRjFGXShbXFxzXSopW2EtelxcdTA0MDFcXHUwNDUxXFx1MDQxMC1cXHUwNDRmXS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSByZWcuZXhlYyhjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcEluZGV4ID0gcmVnLmxhc3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJwcmV2Q2gsIGN1ckNoLCBvZmZzZXQsIHRlbXBJbmRleFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHByZXZDaCwgY3VyQ2gsIG9mZnNldCwgdGVtcEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1NwYWNlRG90ID0gdGVtcEluZGV4LTI8MCB8fCBjb250ZW50LnN1YnN0cmluZyh0ZW1wSW5kZXgtMiwgdGVtcEluZGV4KT09JyAuJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQXV0b0NhcGl0YWxNb2RlID09IFdvcmtNb2RlLkdsb2JhbGx5ICYmICFpc1NwYWNlRG90KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoMCwgdGVtcEluZGV4KSArIGNvbnRlbnQuY2hhckF0KHRlbXBJbmRleCkudG9VcHBlckNhc2UoKSArIGNvbnRlbnQuc3Vic3RyaW5nKHJlZy5sYXN0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzUGFyYW1EZWZpbmVkKHByZXZDaCkgJiYgdGVtcEluZGV4ID49IHByZXZDaCAtIG9mZnNldCAmJiB0ZW1wSW5kZXggPCBjdXJDaCAtIG9mZnNldCAmJiAhaXNTcGFjZURvdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIHRlbXBJbmRleCkgKyBjb250ZW50LmNoYXJBdCh0ZW1wSW5kZXgpLnRvVXBwZXJDYXNlKCkgKyBjb250ZW50LnN1YnN0cmluZyhyZWcubGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluc2VydFNwYWNlKGNvbnRlbnQ6IHN0cmluZywgcmVnOiBSZWdFeHAsIHByZXZDaDogbnVtYmVyLCBjdXJDaDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcik6IFtzdHJpbmcsIG51bWJlcl0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSByZWcuZXhlYyhjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcEluZGV4ID0gcmVnLmxhc3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFyYW1EZWZpbmVkKHByZXZDaCkgJiYgdGVtcEluZGV4ID49IHByZXZDaCAtIG9mZnNldCAmJiB0ZW1wSW5kZXggPCBjdXJDaCAtIG9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoMCwgdGVtcEluZGV4KSArIFwiIFwiICsgY29udGVudC5zdWJzdHJpbmcodGVtcEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2ggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2NvbnRlbnQsIGN1ckNoXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRleHQuMSBcdTU5MDRcdTc0MDZcdTRFMkRcdTgyRjFcdTY1ODdcdTRFNEJcdTk1RjRcdTdBN0FcdTY4M0NcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLkNoaW5lc2VFbmdsaXNoU3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWcxID0gLyhbQS1aYS16XSkoW1xcdTRlMDAtXFx1OWZhNV0pL2dpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZzIgPSAvKFtcXHU0ZTAwLVxcdTlmYTVdKShbQS1aYS16XSkvZ2k7XG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudCwgY3VyQ2hdID0gaW5zZXJ0U3BhY2UoY29udGVudCwgcmVnMSwgcHJldkNoLCBjdXJDaCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50LCBjdXJDaF0gPSBpbnNlcnRTcGFjZShjb250ZW50LCByZWcyLCBwcmV2Q2gsIGN1ckNoLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLkNoaW5lc2VOdW1iZXJTcGFjZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnID0gLyhbMC05XSkoW1xcdTRlMDAtXFx1OWZhNV0pL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnMSA9IC8oW1xcdTRlMDAtXFx1OWZhNV0pKFswLTldKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnQsIGN1ckNoXSA9IGluc2VydFNwYWNlKGNvbnRlbnQsIHJlZywgcHJldkNoLCBjdXJDaCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50LCBjdXJDaF0gPSBpbnNlcnRTcGFjZShjb250ZW50LCByZWcxLCBwcmV2Q2gsIGN1ckNoLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLkVuZ2xpc2hOdW1iZXJTcGFjZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnID0gLyhbQS1aYS16XSkoXFxkKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZzEgPSAvKFxcZCkoW0EtWmEtel0pL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudCwgY3VyQ2hdID0gaW5zZXJ0U3BhY2UoY29udGVudCwgcmVnLCBwcmV2Q2gsIGN1ckNoLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnQsIGN1ckNoXSA9IGluc2VydFNwYWNlKGNvbnRlbnQsIHJlZzEsIHByZXZDaCwgY3VyQ2gsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0LjIgXHU1OTA0XHU3NDA2XHU0RTJEXHU2NTg3XHU5NUY0XHU2NUUwXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5DaGluZXNlTm9TcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oW1xcdTRlMDAtXFx1OWZhNVx1RkYwQ1x1MzAwMlx1MzAwMVx1RkYwMVx1RkYxQlx1MjAxOFx1MjAxOVx1MzAwQVx1MzAwQl0rKShcXHMrKShbXFx1NGUwMC1cXHU5ZmE1XHVGRjBDXHUzMDAyXHUzMDAxXHVGRjAxXHVGRjFCXHUyMDE4XHUyMDE5XHUzMDBBXHUzMDBCXSspL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVnLmV4ZWMoY29udGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShyZWcsIFwiJDEkM1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBcdTY4MDdcdTcwQjlcdTRFMEVcdTY1ODdcdTY3MkNcdTdBN0FcdTY4M0NcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLlB1bmN0dWF0aW9uU3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRleHQuMyBcdTU5MDRcdTc0MDZcdTY4MDdcdTcwQjlcdTRFMEVcdTY1ODdcdTY3MkNcdTdBN0FcdTY4M0NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmKHNldHRpbmdzLkVuZ2xpc2hTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnID0gLyhbLFxcLjtcXD9cXCFcXCldKShbMC05QS1aYS16XFx1MDQwMVxcdTA0NTFcXHUwNDEwLVxcdTA0NGZcXHU0ZTAwLVxcdTlmYTVdKXwoW0EtWmEtejAtOVxcdTRlMDAtXFx1OWZhNTosXFwuXFw/XFwhJ1wiXSspKFxcKCl8WyxcXC47XFw/OiFdW1xcdTRlMDAtXFx1OWZhNV0vZ2k7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gcmVnLmV4ZWMoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2gpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcEluZGV4ID0gcmVnLmxhc3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1NwYWNlRG90ID0gJyEuPzssJy5jb250YWlucyhjb250ZW50LmNoYXJBdCh0ZW1wSW5kZXgtMSkpICYmICgodGVtcEluZGV4LTI8MCAmJiBpPT0wKSB8fCBjb250ZW50LmNoYXJBdCh0ZW1wSW5kZXgtMik9PScgJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc051bVB1bmNOdW0gPSAvWywuXVxcZC8udGVzdChjb250ZW50LnN1YnN0cmluZyh0ZW1wSW5kZXgtMSwgdGVtcEluZGV4KzEpKSAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcEluZGV4LTI8MCB8fCAvXFxkLy50ZXN0KGNvbnRlbnQuY2hhckF0KHRlbXBJbmRleC0yKSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLlB1bmN0dWF0aW9uU3BhY2VNb2RlID09IFdvcmtNb2RlLkdsb2JhbGx5ICYmICFpc1NwYWNlRG90ICYmICFpc051bVB1bmNOdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZygwLCB0ZW1wSW5kZXgpICsgXCIgXCIgKyBjb250ZW50LnN1YnN0cmluZyh0ZW1wSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzUGFyYW1EZWZpbmVkKHByZXZDaCkgJiYgdGVtcEluZGV4ID49IHByZXZDaCAtIG9mZnNldCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0ZW1wSW5kZXggPCBjdXJDaCAtIG9mZnNldCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNTcGFjZURvdCAmJiAhaXNOdW1QdW5jTnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoMCwgdGVtcEluZGV4KSArIFwiIFwiICsgY29udGVudC5zdWJzdHJpbmcodGVtcEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckNoICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcdTUzNTVcdTcyRUNcdTU5MDRcdTc0MDZcdTUxOTJcdTUzRjdcdTU0MEVcdTY1ODdcdTY3MkNcdTc2ODRcdTgxRUFcdTUyQThcdTdBN0FcdTY4M0NcdUZGMENcdTRFM0FcdTRFODZcdTUxN0NcdTVCQjkgOmVtb2ppOiBcdTY4M0NcdTVGMEZcdTc2ODRcdThGOTNcdTUxNjVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnMiA9IC8oOikoW0EtWmEtejAtOV9dK1sgLFxcLlxcP1xcXFxcXC87J1wiXHVGRjBDXHUzMDAyXHVGRjFGXHVGRjFCXHUyMDE4XHUyMDFDXHUyMDFEXHUyMDE5XHUzMDAxXFxbXFxdXFwtXFx7XFx9XSkvZ2k7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocmVnMiwgXCIkMSAkMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnMyA9IC8oOikoW1wiJ10pL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocmVnMywgXCIkMSAkMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0LjcgXHU1Rjk3XHU1MjMwXHU2NTg3XHU2NzJDXHU5MEU4XHU1MjA2XHU2NjJGXHU1NDI2XHU0RUU1XHU3QTdBXHU3NjdEXHU3QjI2XHU1RjAwXHU1OUNCXHU2MjE2XHU3RUQzXHU2NzVGXHVGRjBDXHU3NTI4XHU2NzY1XHU1MjI0XHU2NUFEXHU1NDBFXHU3RUVEXHU2NTg3XHU2NzJDXHU1MjREXHU1NDBFXHU2NjJGXHU1NDI2XHU5NzAwXHU4OTgxXHU2REZCXHU1MkEwXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdTdHJpY3RTcGFjZVN0YXJ0ID0gL15cXDA/XFxzLztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ1N0cmljdFNwYWNlRW5kID0gL1xcc1xcMD8kLztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ1N0YXJ0V2l0aFNwYWNlID0gL15cXDA/W1xccyxcXC47XFw/XFwhXHVGRjBDXHUzMDAyXHVGRjFCXHUzMDBCXHVGRjFGXHVGRjFBOlx1RkYwMX5cXCpcdTMwMDFcdUZGMDhcdUZGMDlcIlx1MjAxRFxcW1xcXVxcKVxce1xcfV0vO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnRW5kV2l0aFNwYWNlID0gL1tcXHNcdUZGMENcdTMwMDJcdTMwMDFcdUZGMUFcdUZGMUJcdUZGMUZcdUZGMDFcdUZGMDhcdUZGMDl+XFwqXCJcdTMwMEFcdTIwMUNcXFtcXF1cXChcXHtcXH1dXFwwPyQvO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHh0U3RhcnRTcGFjZVNhdGUgPSBTcGFjZVN0YXRlLm5vbmU7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eHRFbmRTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5ub25lO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVnU3RhcnRXaXRoU3BhY2UudGVzdChjb250ZW50KXx8Y29udGVudC5zdGFydHNXaXRoKFwiPGJyPlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ1N0cmljdFNwYWNlU3RhcnQudGVzdChjb250ZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRTdGFydFNwYWNlU2F0ZSA9IFNwYWNlU3RhdGUuc3RyaWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0U3RhcnRTcGFjZVNhdGUgPSBTcGFjZVN0YXRlLnNvZnRcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWdFbmRXaXRoU3BhY2UudGVzdChjb250ZW50KSB8fCBjb250ZW50LmVuZHNXaXRoKFwiPGJyPlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ1N0cmljdFNwYWNlRW5kLnRlc3QoY29udGVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUuc3RyaWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dEVuZFNwYWNlU3RhdGUgPSBTcGFjZVN0YXRlLnNvZnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0LjggXHU2ODM5XHU2MzZFXHU1MjREXHU0RTAwXHU5MEU4XHU1MjA2XHU3Njg0XHU1MzNBXHU1NzU3XHU3QzdCXHU1NzhCXHU1OTA0XHU3NDA2XHU3QTdBXHU2ODNDXHU2REZCXHU1MkEwXHU3Njg0XHU5NUVFXHU5ODk4XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocHJldlBhcnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubm9uZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5jb2RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlID4gdHh0U3RhcnRTcGFjZVNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSAnICcgKyBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmZvcm11bGE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGUgPiB0eHRTdGFydFNwYWNlU2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9ICcgJyArIGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUud2lraWxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubWRsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgJiYgc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZSA+IHR4dFN0YXJ0U3BhY2VTYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gJyAnICsgY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU21hcnRTcGFjZSAmJiB0eHRTdGFydFNwYWNlU2F0ZSA9PSBTcGFjZVN0YXRlLm5vbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJBdFRleHRCZWdpbiA9IGNvbnRlbnQuY2hhckF0KDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnTWRMaW5rRW5kID0gL1xcXS87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyQXRMaW5rRW5kSW5kZXggPSBsaW5lUGFydHNbaSAtIDFdLmNvbnRlbnQuc2VhcmNoKHJlZ01kTGlua0VuZCkgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hhckF0TGlua0VuZCA9IGxpbmVQYXJ0c1tpIC0gMV0uY29udGVudC5jaGFyQXQoY2hhckF0TGlua0VuZEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJBdExpbmtFbmQgPT09ICdbJykgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0d29OZWlnaGJvckNoYXJzID0gY2hhckF0TGlua0VuZCArIGNoYXJBdFRleHRCZWdpbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ05vdE5lZWRTcGFjZSA9IC9bXFx1NGUwMC1cXHU5ZmE1XHVGRjBDXHUzMDAyXHVGRjFGXHVGRjFBXHVGRjFCXHUyMDFEXHUyMDFDXHUyMDE5XHUyMDE4LVx1RkYwOX1dW1xcdTRlMDAtXFx1OWZhNV0vZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdOb3ROZWVkU3BhY2UudGVzdCh0d29OZWlnaGJvckNoYXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSAnICcgKyBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnVzZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpIC0gMV0ucmlnaHRTcGFjZVJlcXVpcmUgPiB0eHRTdGFydFNwYWNlU2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9ICcgJyArIGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0LjkgXHU1OTgyXHU2NzlDXHU1MTQ5XHU2ODA3XHU1NzI4XHU4QkU1XHU1MzNBXHU1NzU3XHVGRjBDXHU1MjE5XHU4QkExXHU3Qjk3XHU2NzAwXHU3RUM4XHU1MTQ5XHU2ODA3XHU3Njg0XHU0RjREXHU3RjZFXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBjdXJzb3JMaW5lUGFydEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnID0gJ1xcMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IGNvbnRlbnQuc2VhcmNoKHJlZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEN1cnNvckNoID0gb2Zmc2V0ICsgbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFx1NTIyMFx1OTY2NCBcXDBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gc3RyaW5nRGVsZXRlQXQoY29udGVudCwgbik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBwcmV2UGFydFR5cGUgPSBJbmxpbmVUeXBlLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IHR4dEVuZFNwYWNlU3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIDMuMi4yIFx1NTkwNFx1NzQwNlx1ODg0Q1x1NTE4NVx1NEVFM1x1NzgwMVx1NTc1N1x1OTBFOFx1NTIwNlxuICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5jb2RlOlxuICAgICAgICAgICAgICAgICAgICAvLyBDb2RlLjEgXHU2ODM5XHU2MzZFXHU1MjREXHU0RTAwXHU1MzNBXHU1NzU3XHU3QzdCXHU1NzhCXHU1NDhDc2V0dGluZ3NcdTZERkJcdTUyQTBcdTdBN0FcdTY4M0NcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHByZXZQYXJ0VHlwZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm5vbmU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudGV4dDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZSA+IHByZXZUZXh0RW5kU3BhY2VTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpLTFdLmNvbnRlbnQgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmNvZGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUNvZGVTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuZm9ybXVsYTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubWRsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLndpa2lsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS51c2VyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5yaWdodFNwYWNlUmVxdWlyZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBDb2RlLjIgXHU1OTgyXHU2NzlDXHU1MTQ5XHU2ODA3XHU1NzI4XHU4QkU1XHU1MzNBXHU1NzU3XHVGRjBDXHU1MjE5XHU4QkExXHU3Qjk3XHU2NzAwXHU3RUM4XHU1MTQ5XHU2ODA3XHU3Njg0XHU0RjREXHU3RjZFXG4gICAgICAgICAgICAgICAgICAgIGlmKGkgPT09IGN1cnNvckxpbmVQYXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEN1cnNvckNoID0gb2Zmc2V0ICsgY3Vyc29yUmVsYXRpdmVJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBDb2RlLjMgXHU1M0Q4XHU5MUNGXHU2NkY0XHU2NUIwXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaW5lUGFydHNbaV0uY29udGVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHByZXZQYXJ0VHlwZSA9IElubGluZVR5cGUuY29kZTtcbiAgICAgICAgICAgICAgICAgICAgcHJldlRleHRFbmRTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5ub25lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyAzLjIuMyBcdTU5MDRcdTc0MDZcdTg4NENcdTUxODVcdTUxNkNcdTVGMEZcdTc2ODRcdTkwRThcdTUyMDZcbiAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuZm9ybXVsYTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS5jb250ZW50ID09IFwiJFxcXFxxcXVhZCRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldlBhcnRUeXBlID0gSW5saW5lVHlwZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldlRleHRFbmRTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5zdHJpY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGb3JtdWxhLjEgXHU2ODM5XHU2MzZFXHU1MjREXHU0RTAwXHU1MzNBXHU1NzU3XHU3QzdCXHU1NzhCXHU1NDhDc2V0dGluZ3NcdTZERkJcdTUyQTBcdTdBN0FcdTY4M0NcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHByZXZQYXJ0VHlwZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm5vbmU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudGV4dDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5wcmV2VGV4dEVuZFNwYWNlU3RhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5jb2RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmZvcm11bGE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUNvZGVTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubWRsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLndpa2lsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS51c2VyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5yaWdodFNwYWNlUmVxdWlyZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGb3JtdWxhLjIgXHU1OTgyXHU2NzlDXHU1MTQ5XHU2ODA3XHU1NzI4XHU4QkU1XHU1MzNBXHU1NzU3XHVGRjBDXHU1MjE5XHU4QkExXHU3Qjk3XHU2NzAwXHU3RUM4XHU1MTQ5XHU2ODA3XHU3Njg0XHU0RjREXHU3RjZFXG4gICAgICAgICAgICAgICAgICAgIGlmKGkgPT09IGN1cnNvckxpbmVQYXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEN1cnNvckNoID0gb2Zmc2V0ICsgY3Vyc29yUmVsYXRpdmVJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGb3JtdWxhLjMgXHU1M0Q4XHU5MUNGXHU2NkY0XHU2NUIwXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaW5lUGFydHNbaV0uY29udGVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHByZXZQYXJ0VHlwZSA9IElubGluZVR5cGUuZm9ybXVsYTtcbiAgICAgICAgICAgICAgICAgICAgcHJldlRleHRFbmRTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5ub25lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5tZGxpbms6XG4gICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLndpa2lsaW5rOlxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocHJldlBhcnRUeXBlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubm9uZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS50ZXh0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2VGV4dEVuZFNwYWNlU3RhdGU+PXNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGUgJiYgICFzZXR0aW5ncy5JbmxpbmVMaW5rU21hcnRTcGFjZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZUZXh0RW5kU3BhY2VTdGF0ZT09U3BhY2VTdGF0ZS5zdHJpY3QgJiYgc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZT09U3BhY2VTdGF0ZS5zdHJpY3QpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyQXRUZXh0RW5kID0gbGluZVBhcnRzW2kgLSAxXS5jb250ZW50LmNoYXJBdChsaW5lUGFydHNbaSAtIDFdLmNvbnRlbnQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJBdExpbmtCZWdpbjogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZVBhcnRzW2ldLnR5cGUgPT0gSW5saW5lVHlwZS53aWtpbGluaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnQWxpYXMgPSAvXFx8LztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJPZkFsaWFzQmVnaW4gPSBsaW5lUGFydHNbaV0uY29udGVudC5zZWFyY2gocmVnQWxpYXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNoYXJPZkFsaWFzQmVnaW5cIixjaGFyT2ZBbGlhc0JlZ2luKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmVnaW5JbmRleCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaV0uY29udGVudC5jaGFyQXQoMCkgPT09ICchJykgYmVnaW5JbmRleCA9IDM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJPZkFsaWFzQmVnaW4gIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luSW5kZXggPSBjaGFyT2ZBbGlhc0JlZ2luICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsaW5lUGFydHNbaV0uY29udGVudC5jaGFyQXQoYmVnaW5JbmRleCkgPT0gJyMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbkluZGV4ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQXRMaW5rQmVnaW4gPSBsaW5lUGFydHNbaV0uY29udGVudC5jaGFyQXQoYmVnaW5JbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYmVnaW5JbmRleFwiLCBiZWdpbkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJBdExpbmtCZWdpbiA9PSAnXScpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ01kTGlua0JlZ2luID0gL1xcWy87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyQXRMaW5rQmVnaW5JbmRleCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50LnNlYXJjaChyZWdNZExpbmtCZWdpbikgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQXRMaW5rQmVnaW4gPSBsaW5lUGFydHNbaV0uY29udGVudC5jaGFyQXQoY2hhckF0TGlua0JlZ2luSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhckF0TGlua0JlZ2luID09PSAnXScpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPT1TcGFjZVN0YXRlLnN0cmljdCAmJiBwcmV2VGV4dEVuZFNwYWNlU3RhdGU8U3BhY2VTdGF0ZS5zdHJpY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU21hcnRTcGFjZSAmJiBsaW5lUGFydHNbaS0xXS5jb250ZW50LmVuZHNXaXRoKCcgJykpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcENvbnRlbnQgPSBsaW5lUGFydHNbaS0xXS5jb250ZW50K2NoYXJBdExpbmtCZWdpbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ1JldmVydFNwYWNlID0gL1tcXHU0ZTAwLVxcdTlmYTVdIFtcXHU0ZTAwLVxcdTlmYTVdJC87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWdSZXZlcnRTcGFjZS50ZXN0KHRlbXBDb250ZW50KSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ID0gbGluZVBhcnRzW2ktMV0uY29udGVudC5zdWJzdHJpbmcoMCwgbGluZVBhcnRzW2ktMV0uY29udGVudC5sZW5ndGgtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lID0gcmVzdWx0TGluZS5zdWJzdHJpbmcoMCwgcmVzdWx0TGluZS5sZW5ndGgtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU21hcnRTcGFjZSAmJiBwcmV2VGV4dEVuZFNwYWNlU3RhdGU9PVNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdOb05lZWRTcGFjZSA9IC9bXFx1NGUwMC1cXHU5ZmE1XVtcXHU0ZTAwLVxcdTlmYTVdL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0d29OZWlnaGJvckNoYXJzID0gY2hhckF0VGV4dEVuZCtjaGFyQXRMaW5rQmVnaW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFyZWdOb05lZWRTcGFjZS50ZXN0KHR3b05laWdoYm9yQ2hhcnMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZighc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgJiYgc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZT5wcmV2VGV4dEVuZFNwYWNlU3RhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5jb2RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmZvcm11bGE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5tZGxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUud2lraWxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudXNlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZVBhcnRzW2ktMV0ucmlnaHRTcGFjZVJlcXVpcmU+U3BhY2VTdGF0ZS5ub25lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gTGluay4yIFx1NTk4Mlx1Njc5Q1x1OEJFNVx1NTMzQVx1NTc1N1x1NjcwOVx1NTE0OVx1NjgwN1x1RkYwQ1x1NTIxOVx1OEJBMVx1N0I5N1x1NjcwMFx1N0VDOFx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVxuICAgICAgICAgICAgICAgICAgICBpZihpID09PSBjdXJzb3JMaW5lUGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDdXJzb3JDaCA9IG9mZnNldCArIGN1cnNvclJlbGF0aXZlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gTGluay4zIFx1NjZGNFx1NjVCMFx1NTNEOFx1OTFDRlxuICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBwcmV2UGFydFR5cGUgPSBsaW5lUGFydHNbaV0udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgcHJldlRleHRFbmRTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5ub25lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyAzLjIuNSBcdTU5MDRcdTc0MDZcdTc1MjhcdTYyMzdcdTgxRUFcdTVCOUFcdTRFNDlcdTUzM0FcdTU3NTdcdTc2ODRcdTkwRThcdTUyMDZcbiAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudXNlcjpcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlci4xIFx1NjgzOVx1NjM2RVx1NTI0RFx1NEUwMFx1NTMzQVx1NTc1N1x1N0M3Qlx1NTc4Qlx1NTQ4Q3NldHRpbmdzXHU2REZCXHU1MkEwXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwcmV2UGFydFR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5ub25lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnRleHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS5sZWZ0U3BhY2VSZXF1aXJlPnByZXZUZXh0RW5kU3BhY2VTdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpLTFdLmNvbnRlbnQgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmNvZGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS5sZWZ0U3BhY2VSZXF1aXJlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmZvcm11bGE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS5sZWZ0U3BhY2VSZXF1aXJlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm1kbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS53aWtpbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZVBhcnRzW2ldLmxlZnRTcGFjZVJlcXVpcmU+U3BhY2VTdGF0ZS5ub25lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudXNlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZVBhcnRzW2ldLmxlZnRTcGFjZVJlcXVpcmU+U3BhY2VTdGF0ZS5ub25lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpLTFdLnJpZ2h0U3BhY2VSZXF1aXJlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZXIuMiBcdTU5ODJcdTY3OUNcdThCRTVcdTUzM0FcdTU3NTdcdTY3MDlcdTUxNDlcdTY4MDdcdUZGMENcdTUyMTlcdThCQTFcdTdCOTdcdTY3MDBcdTdFQzhcdTUxNDlcdTY4MDdcdTRGNERcdTdGNkVcbiAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gY3Vyc29yTGluZVBhcnRJbmRleClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q3Vyc29yQ2ggPSBvZmZzZXQgKyBjdXJzb3JSZWxhdGl2ZUluZGV4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIExpbmsuMyBcdTY2RjRcdTY1QjBcdTUzRDhcdTkxQ0ZcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgcHJldlBhcnRUeXBlID0gSW5saW5lVHlwZS51c2VyO1xuICAgICAgICAgICAgICAgICAgICBwcmV2VGV4dEVuZFNwYWNlU3RhdGUgPSBTcGFjZVN0YXRlLm5vbmU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGxldCBpPTA7aTxsaW5lUGFydHMubGVuZ3RoO2krKylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYobGluZVBhcnRzW2ldLnR5cGUgPT09IElubGluZVR5cGUudGV4dCAmJiBsaW5lUGFydHNbaV0uY29udGVudCE9bGluZVBhcnRzT3JpZ2luW2ldLmNvbnRlbnQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBsaW5lUGFydHNbaV0uY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNPcmlnaW5baV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c09yaWdpbltpXS5lbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46IGxpbmVQYXJ0c09yaWdpbltpXS5jb250ZW50XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgaW5saW5lQ2hhbmdlTGlzdCA9IGlubGluZUNoYW5nZUxpc3Quc29ydCgoYSwgYik6bnVtYmVyPT5hLmJlZ2luLWIuYmVnaW4pO1xuICAgICAgICByZXR1cm4gW3Jlc3VsdExpbmUsIHJlc3VsdEN1cnNvckNoLCBpbmxpbmVDaGFuZ2VMaXN0XTtcbiAgICB9XG4gICAgXG59XG5cblxuZXhwb3J0IGNsYXNzIE1hcmtkb3duUGFyc2Vye1xuICAgIGNvbnN0cnVjdG9yKCl7fVxuXG59XG5cbmZ1bmN0aW9uIG1hdGNoV2l0aFJlZyh0ZXh0OiBzdHJpbmcsIHJlZ0V4cDogUmVnRXhwLCB0eXBlOiBJbmxpbmVUeXBlLCBpbmxpbmVUeXBlQXJyYXk6IElubGluZVBhcnRbXSxcbiAgICBjaGVja0FycmF5ID0gZmFsc2UsIGxlZnRTcGFjZVJlOiBTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5ub25lLCByaWdodFNwYWNlUmU6IFNwYWNlU3RhdGUgPSBTcGFjZVN0YXRlLm5vbmUpOiBJbmxpbmVQYXJ0W10ge1xuICAgIGxldCByZXRBcnJheSA9IGlubGluZVR5cGVBcnJheTtcbiAgICBsZXQgbWF0Y2hBcnJheTogSW5saW5lUGFydFtdID0gW107XG4gICAgcmV0QXJyYXkgPSByZXRBcnJheS5zb3J0KChhLCBiKTogbnVtYmVyID0+IGEuYmVnaW4gLSBiLmJlZ2luKTtcbiAgICAvLyBjb25zb2xlLmxvZygnYmVmb3JlLS0tLS0tLS0tLS1cXG4nLHJldEFycmF5KVxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IHJlZ0V4cC5leGVjKHRleHQpO1xuICAgICAgICBpZiAoIW1hdGNoKSBicmVhaztcbiAgICAgICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgLy8gXHU2OEMwXHU2N0U1XHU1MUIyXHU3QTgxXG4gICAgICAgIGlmIChjaGVja0FycmF5KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJldEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYocmVnRXhwLmxhc3RJbmRleD5yZXRBcnJheVtpXS5iZWdpbiAmJiByZXRBcnJheVtpXS5lbmQ+bWF0Y2guaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2YWxpZCkgY29udGludWU7XG4gICAgICAgIG1hdGNoQXJyYXkucHVzaChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBtYXRjaFswXSxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGJlZ2luOiBtYXRjaC5pbmRleCxcbiAgICAgICAgICAgICAgICBlbmQ6IHJlZ0V4cC5sYXN0SW5kZXgsXG4gICAgICAgICAgICAgICAgbGVmdFNwYWNlUmVxdWlyZTogbGVmdFNwYWNlUmUsXG4gICAgICAgICAgICAgICAgcmlnaHRTcGFjZVJlcXVpcmU6IHJpZ2h0U3BhY2VSZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXRBcnJheSA9IHJldEFycmF5LmNvbmNhdChtYXRjaEFycmF5KTtcbiAgICAvLyBjb25zb2xlLmxvZygnQWZ0ZXI9PT09PT09PT09PVxcbicsIHJldEFycmF5KTtcbiAgICByZXR1cm4gcmV0QXJyYXk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoV2l0aEFiYnIodGV4dDogc3RyaW5nLCB0eXBlOiBJbmxpbmVUeXBlLCBpbmxpbmVUeXBlQXJyYXk6IElubGluZVBhcnRbXSwgY2hlY2tBcnJheSA9IGZhbHNlKXtcbiAgICBsZXQgcmV0QXJyYXkgPSBpbmxpbmVUeXBlQXJyYXk7XG4gICAgbGV0IG1hdGNoQXJyYXk6IElubGluZVBhcnRbXSA9IFtdO1xuICAgIHJldEFycmF5ID0gcmV0QXJyYXkuc29ydCgoYSwgYik6IG51bWJlciA9PiBhLmJlZ2luIC0gYi5iZWdpbik7XG4gICAgbGV0IHJlZ0FiYnIgPSAvKFthLXpBLVpdXFwuKSsvZztcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSByZWdBYmJyLmV4ZWModGV4dCk7XG4gICAgICAgIGlmICghbWF0Y2gpIGJyZWFrO1xuICAgICAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgICAgICBsZXQgaXNJbkJsb2NrQmVnaW46Ym9vbGVhbiA9IChtYXRjaC5pbmRleD09MCk7XG4gICAgICAgIC8vIFx1NjhDMFx1NjdFNVx1NTFCMlx1N0E4MVxuICAgICAgICBpZiAoY2hlY2tBcnJheSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmKG1hdGNoLmluZGV4ID09IHJldEFycmF5W2ldLmVuZCl7XG4gICAgICAgICAgICAgICAgICAgIGlzSW5CbG9ja0JlZ2luID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYocmVnQWJici5sYXN0SW5kZXg+cmV0QXJyYXlbaV0uYmVnaW4gJiYgcmV0QXJyYXlbaV0uZW5kPm1hdGNoLmluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKCFpc0luQmxvY2tCZWdpbiAmJiB2YWxpZClcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHJlZ0NoYXIgPSAvW2EtekEtWjAtOV0vO1xuICAgICAgICAgICAgaWYocmVnQ2hhci50ZXN0KHRleHQuY2hhckF0KG1hdGNoLmluZGV4LTEpKSl7XG4gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsaWQpIGNvbnRpbnVlO1xuICAgICAgICBtYXRjaEFycmF5LnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGVudDogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBiZWdpbjogbWF0Y2guaW5kZXgsXG4gICAgICAgICAgICAgICAgZW5kOiByZWdBYmJyLmxhc3RJbmRleCxcbiAgICAgICAgICAgICAgICBsZWZ0U3BhY2VSZXF1aXJlOiBTcGFjZVN0YXRlLm5vbmUsXG4gICAgICAgICAgICAgICAgcmlnaHRTcGFjZVJlcXVpcmU6IFNwYWNlU3RhdGUubm9uZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cbiAgICByZXRBcnJheSA9IHJldEFycmF5LmNvbmNhdChtYXRjaEFycmF5KTtcbiAgICAvLyBjb25zb2xlLmxvZygnQWZ0ZXI9PT09PT09PT09PVxcbicsIHJldEFycmF5KTtcbiAgICByZXR1cm4gcmV0QXJyYXk7XG59XG5cbi8qKlxuICogXHU1MjA2XHU1MjcyXHU0RTAwXHU4ODRDXHU2NTg3XHU2NzJDXHU0RTJEXHU3Njg0XHU5NEZFXHU2M0E1XHU1NDhDXHU3NTI4XHU2MjM3XHU4MUVBXHU1QjlBXHU0RTQ5XHU3Njg0XHU2QjYzXHU1MjE5XHU5MEU4XHU1MjA2XHVGRjBDXHU1Rjk3XHU1MjMwIElubGluZVBhcnQgXHU3Njg0XHU0RTBEXHU1NDBDXHU1MzNBXHU1N0RGXG4gKi9cbmZ1bmN0aW9uIHNwbGl0VGV4dFdpdGhMaW5rQW5kVXNlckRlZmluZWQodGV4dDogc3RyaW5nLCByZWdFeHBzPzogc3RyaW5nKTogSW5saW5lUGFydFtdIHtcbiAgICBsZXQgcmV0QXJyYXk6IElubGluZVBhcnRbXSA9IFtdO1xuICAgIGxldCByZWdXaWtpTGluayA9IC9cXCF7MCwyfVxcW1xcW1teXFxbXFxdXSo/XFxdXFxdL2c7XG4gICAgbGV0IHJlZ01kTGluayA9IC9cXCF7MCwyfVxcW1teXFxbXFxdXSo/XFxdXFwoW15cXHNcXClcXChcXFtcXF1cXHtcXH0nXSpcXCkvZztcbiAgICAvLyBsZXQgcmVnQmFyZUxpbmsgPSAvKGh0dHBzPzpcXC9cXC98ZnRwOlxcL1xcL3xvYnNpZGlhbjpcXC9cXC98em90ZXJvOlxcL1xcL3x3d3cuKVteXFxzXHVGRjA4XHVGRjA5XHUzMDBBXHUzMDBCXHUzMDAyXHVGRjBDXHVGRjAxXHVGRjFGXHVGRjFCXHVGRjFBXHUyMDFDXHUyMDFEXHUyMDE4XHUyMDE5XFwpXFwoXFxbXFxdXFx7XFx9J10rL2c7XG5cbiAgICAvLyAxLiBcdTUzMzlcdTkxNER3aWtpbGlua1xuICAgIHJldEFycmF5ID0gbWF0Y2hXaXRoUmVnKHRleHQsIHJlZ1dpa2lMaW5rLCBJbmxpbmVUeXBlLndpa2lsaW5rLCByZXRBcnJheSk7XG4gICAgLy8gMi4gXHU1MzM5XHU5MTREbWRsaW5rXG4gICAgcmV0QXJyYXkgPSBtYXRjaFdpdGhSZWcodGV4dCwgcmVnTWRMaW5rLCBJbmxpbmVUeXBlLm1kbGluaywgcmV0QXJyYXkpO1xuXG4gICAgLy8gMy4gXHU1MzM5XHU5MTREXHU3NTI4XHU2MjM3XHU4MUVBXHU1QjlBXHU0RTQ5XHU2QjYzXHU1MjE5XG4gICAgbGV0IHJlZ0V4cExpc3Q6IFJlZ0V4cFtdID0gW107XG4gICAgbGV0IGxlZnRTUmVxdWlyZUxpc3Q6IFNwYWNlU3RhdGVbXSA9IFtdO1xuICAgIGxldCByaWdodFNSZXF1aXJlTGlzdDogU3BhY2VTdGF0ZVtdID0gW107XG4gICAgbGV0IHJlZ051bGwgPSAvXlxccyokfF5cXC9cXC8vZztcbiAgICBsZXQgcmVnU1JlcXVpcmUgPSAvXFx8W1xcLT1cXCtdW1xcLT1cXCtdJC87XG4gICAgaWYgKHJlZ0V4cHMpIHtcbiAgICAgICAgbGV0IHJlZ3MgPSByZWdFeHBzLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGlmIChyZWdOdWxsLnRlc3QocmVnc1tpXSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoKCFyZWdTUmVxdWlyZS50ZXN0KHJlZ3NbaV0pKSB8fCByZWdzW2ldLmxlbmd0aCA8PSAzKSB7XG4gICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIkVhc3lUeXBpbmc6IFx1N0IyQ1wiICsgU3RyaW5nKGkpICsgXCJcdTg4NENcdTgxRUFcdTVCOUFcdTRFNDlcdTZCNjNcdTUyMTlcdTRFMERcdTdCMjZcdTU0MDhcdTg5QzRcdTgzMDNcXG5cIityZWdzW2ldKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZWdJdGVtID0gcmVnc1tpXS5zdWJzdHJpbmcoMCwgcmVnc1tpXS5sZW5ndGggLSAzKTtcbiAgICAgICAgICAgIGxldCBzcGFjZVJlcVN0cmluZyA9IHJlZ3NbaV0uc3Vic3RyaW5nKHJlZ3NbaV0ubGVuZ3RoIC0gMyk7XG5cbiAgICAgICAgICAgIGxldCBpc1ZhbGlkUmVnID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlZ1RlbXAgPSBuZXcgUmVnRXhwKHJlZ0l0ZW0sICdnJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlzVmFsaWRSZWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZih0aGlzLnNldHRpbmdzLmRlYnVnKXtcbiAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZShcIkVhc3VUeXBpbmc6IEJhZCBSZWdFeHA6XFxuXCIgKyByZWdJdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc1ZhbGlkUmVnKSB7XG4gICAgICAgICAgICAgICAgcmVnRXhwTGlzdC5wdXNoKG5ldyBSZWdFeHAocmVnSXRlbSwgJ2cnKSk7XG4gICAgICAgICAgICAgICAgbGVmdFNSZXF1aXJlTGlzdC5wdXNoKHN0cjJTcGFjZVN0YXRlKHNwYWNlUmVxU3RyaW5nLmNoYXJBdCgxKSkpO1xuICAgICAgICAgICAgICAgIHJpZ2h0U1JlcXVpcmVMaXN0LnB1c2goc3RyMlNwYWNlU3RhdGUoc3BhY2VSZXFTdHJpbmcuY2hhckF0KDIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlZ0xlbiA9IHJlZ0V4cExpc3QubGVuZ3RoO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVnTGVuOyBpKyspIHtcbiAgICAgICAgICAgIHJldEFycmF5ID0gbWF0Y2hXaXRoUmVnKHRleHQsIHJlZ0V4cExpc3RbaV0sIElubGluZVR5cGUudXNlciwgcmV0QXJyYXksIHRydWUsIGxlZnRTUmVxdWlyZUxpc3RbaV0sIHJpZ2h0U1JlcXVpcmVMaXN0W2ldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1NTMzOVx1OTE0RFx1NjVGNlx1OTVGNFx1NjIzM1xuICAgIHJldEFycmF5ID0gbWF0Y2hXaXRoUmVnKHRleHQsIC9cXGR7MSwyfTpcXGR7MSwyfSg6XFxkezAsMn0pezAsMX0vZywgSW5saW5lVHlwZS51c2VyLCByZXRBcnJheSwgdHJ1ZSwgU3BhY2VTdGF0ZS5ub25lLCBTcGFjZVN0YXRlLm5vbmUpO1xuXG4gICAgLy8gNC4gXHU1MzM5XHU5MTREXHU3RjI5XHU1MTk5XHU1OTgyIGEubS5cbiAgICByZXRBcnJheSA9IG1hdGNoV2l0aEFiYnIodGV4dCwgSW5saW5lVHlwZS51c2VyLCByZXRBcnJheSwgdHJ1ZSk7XG5cbiAgICAvLyA1LiBcdTVGOTdcdTUyMzBcdTUyNjlcdTRGNTlcdTc2ODRcdTY1ODdcdTY3MkNcdTkwRThcdTUyMDZcbiAgICByZXRBcnJheSA9IHJldEFycmF5LnNvcnQoKGEsIGIpOiBudW1iZXIgPT4gYS5iZWdpbiAtIGIuYmVnaW4pO1xuXG4gICAgbGV0IHRleHRBcnJheTogSW5saW5lUGFydFtdID0gW107XG4gICAgbGV0IHRleHRCZWdpbiA9IDA7XG4gICAgbGV0IHRleHRFbmQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRleHRCZWdpbiA8IHJldEFycmF5W2ldLmJlZ2luKSB7XG4gICAgICAgICAgICB0ZXh0RW5kID0gcmV0QXJyYXlbaV0uYmVnaW47XG4gICAgICAgICAgICB0ZXh0QXJyYXkucHVzaChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQuc3Vic3RyaW5nKHRleHRCZWdpbiwgdGV4dEVuZCksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IElubGluZVR5cGUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYmVnaW46IHRleHRCZWdpbixcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0ZXh0RW5kLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0U3BhY2VSZXF1aXJlOiBTcGFjZVN0YXRlLm5vbmUsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0U3BhY2VSZXF1aXJlOiBTcGFjZVN0YXRlLm5vbmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRleHRCZWdpbiA9IHJldEFycmF5W2ldLmVuZDtcbiAgICB9XG5cbiAgICBpZiAodGV4dEJlZ2luICE9IHRleHQubGVuZ3RoKSB7XG4gICAgICAgIHRleHRBcnJheS5wdXNoKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQuc3Vic3RyaW5nKHRleHRCZWdpbiwgdGV4dC5sZW5ndGgpLFxuICAgICAgICAgICAgICAgIHR5cGU6IElubGluZVR5cGUudGV4dCxcbiAgICAgICAgICAgICAgICBiZWdpbjogdGV4dEJlZ2luLFxuICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgbGVmdFNwYWNlUmVxdWlyZTogU3BhY2VTdGF0ZS5ub25lLFxuICAgICAgICAgICAgICAgIHJpZ2h0U3BhY2VSZXF1aXJlOiBTcGFjZVN0YXRlLm5vbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA2LiBcdTU0MDhcdTVFNzZcdTY1ODdcdTY3MkNcdTkwRThcdTUyMDZcdTU0OENcdTUxNzZcdTRFRDZcdTkwRThcdTUyMDZcbiAgICByZXRBcnJheSA9IHJldEFycmF5LmNvbmNhdCh0ZXh0QXJyYXkpO1xuICAgIHJldEFycmF5ID0gcmV0QXJyYXkuc29ydCgoYSwgYik6IG51bWJlciA9PiBhLmJlZ2luIC0gYi5iZWdpbik7XG4gICAgcmV0dXJuIHJldEFycmF5XG59XG5cbi8vIFx1NUI1N1x1N0IyNlx1OEY2Q1x1NTMxNlx1NjIxMFx1N0E3QVx1NjgzQ1x1NzJCNlx1NjAwMVx1ODk4MVx1NkM0MlxuZnVuY3Rpb24gc3RyMlNwYWNlU3RhdGUoczogc3RyaW5nKTogU3BhY2VTdGF0ZSB7XG4gICAgc3dpdGNoIChzKSB7XG4gICAgICAgIGNhc2UgXCIrXCI6XG4gICAgICAgICAgICByZXR1cm4gU3BhY2VTdGF0ZS5zdHJpY3Q7XG4gICAgICAgIGNhc2UgJz0nOlxuICAgICAgICAgICAgcmV0dXJuIFNwYWNlU3RhdGUuc29mdDtcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gU3BhY2VTdGF0ZS5ub25lO1xuICAgIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nMlNwYWNlU3RhdGUoczpzdHJpbmcpOlNwYWNlU3RhdGVcbntcbiAgICBpZihOdW1iZXIocyk9PVNwYWNlU3RhdGUubm9uZSkgcmV0dXJuIFNwYWNlU3RhdGUubm9uZTtcbiAgICBpZihOdW1iZXIocyk9PVNwYWNlU3RhdGUuc29mdCkgcmV0dXJuIFNwYWNlU3RhdGUuc29mdDtcbiAgICBpZihOdW1iZXIocyk9PVNwYWNlU3RhdGUuc3RyaWN0KSByZXR1cm4gU3BhY2VTdGF0ZS5zdHJpY3Q7XG4gICAgcmV0dXJuIFNwYWNlU3RhdGUubm9uZTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9zTGluZVR5cGUoc3RhdGU6IEVkaXRvclN0YXRlLCBwb3M6IG51bWJlcik6TGluZVR5cGUge1xuICAgIGNvbnN0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHBvcylcbiAgICBsZXQgbGluZV9udW1iZXIgPSBsaW5lLm51bWJlclxuICAgIC8vIGNvbnN0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKTtcbiAgICBjb25zdCB0cmVlID0gZW5zdXJlU3ludGF4VHJlZShzdGF0ZSwgbGluZS50byk7XG4gICAgY29uc3QgdG9rZW4gPSB0cmVlLnJlc29sdmUobGluZS5mcm9tLCAxKS5uYW1lXG5cbiAgICAvLyBmb3IgKGxldCBwPWxpbmUuZnJvbTsgcDxsaW5lLnRvOyBwKz0xKXtcbiAgICAvLyAgICAgY29uc29sZS5sb2cocC1saW5lLmZyb20sIHRyZWUucmVzb2x2ZShwLCAxKS5uYW1lKVxuICAgIC8vIH1cblxuICAgIGlmICh0b2tlbi5jb250YWlucygndGFibGUnKSl7XG4gICAgICAgIHJldHVybiBMaW5lVHlwZS50YWJsZTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW4uY29udGFpbnMoJ2htZC1mcm9udG1hdHRlcicpKXtcbiAgICAgICAgcmV0dXJuIExpbmVUeXBlLmZyb250bWF0dGVyO1xuICAgIH1cblxuICAgIGlmKHRva2VuLmNvbnRhaW5zKCdtYXRoJykpe1xuICAgICAgICBmb3IobGV0IHA9bGluZS5mcm9tKzE7cDxsaW5lLnRvO3ArPTEpe1xuICAgICAgICAgICAgaWYoIXRyZWUucmVzb2x2ZShwLCAxKS5uYW1lLmNvbnRhaW5zKCdtYXRoJykpe1xuICAgICAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMaW5lVHlwZS5mb3JtdWxhXG4gICAgfVxuICAgIGVsc2UgaWYodG9rZW4uY29udGFpbnMoJ2NvZGUnKSAmJiB0b2tlbi5jb250YWlucygnYmxvY2snKSl7XG4gICAgICAgIGZvcihsZXQgcD1saW5lLmZyb20rMTtwPGxpbmUudG87cCs9MSl7XG4gICAgICAgICAgICBsZXQgdCA9IHRyZWUucmVzb2x2ZShwLCAxKS5uYW1lXG4gICAgICAgICAgICBpZighKHQuY29udGFpbnMoJ2NvZGUnKSAmJiB0LmNvbnRhaW5zKCdibG9jaycpKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIExpbmVUeXBlLnRleHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTGluZVR5cGUuY29kZWJsb2NrXG4gICAgfVxuICAgIGVsc2UgaWYodG9rZW4uY29udGFpbnMoJ3F1b3RlJykgJiYgIXRva2VuLmNvbnRhaW5zKCdjYWxsb3V0Jykpe1xuICAgICAgICAvLyBcdTYzQTVcdTRFMEJcdTY3NjVcdTUyMjRcdTY1QURcdThCRTVcdTg4NENcdTY2MkZcdTU0MjZcdTRFM0FjYWxsb3V0XHU1NzU3XHU1MTg1XHU3Njg0XHU0RUUzXHU3ODAxXHU1NzU3XG4gICAgICAgIC8vIFx1OTk5Nlx1NTE0OFx1NTIyNFx1NjVBRFx1NjYyRlx1NTQyNlx1NEUzQWNhbGxvdXRcbiAgICAgICAgbGV0IGNhbGxvdXRfc3RhcnRfbGluZSA9IC0xO1xuICAgICAgICBmb3IobGV0IGw9bGluZV9udW1iZXItMTsgbD49MTsgbC09MSl7XG4gICAgICAgICAgICBsZXQgbF9saW5lID0gc3RhdGUuZG9jLmxpbmUobClcbiAgICAgICAgICAgIGxldCBsX3Rva2VuID0gdHJlZS5yZXNvbHZlKGxfbGluZS5mcm9tLCAxKS5uYW1lXG4gICAgICAgICAgICBpZighbF90b2tlbi5jb250YWlucygncXVvdGUnKSl7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobF90b2tlbi5jb250YWlucygnY2FsbG91dCcpKXtcbiAgICAgICAgICAgICAgICBjYWxsb3V0X3N0YXJ0X2xpbmUgPSBsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxsb3V0X3N0YXJ0X2xpbmU9PS0xKSByZXR1cm4gTGluZVR5cGUudGV4dDtcbiAgICAgICAgXG4gICAgICAgIC8vIFx1NzEzNlx1NTQwRVx1NTIyNFx1NjVBRFx1NjYyRlx1NTQyNlx1NEUzQVx1NEVFM1x1NzgwMVx1NTc1N1xuICAgICAgICBsZXQgaXNfY29kZV9ibG9jazpib29sZWFuID0gZmFsc2U7XG4gICAgICAgIGxldCByZXNldDpib29sZWFuID0gZmFsc2U7XG4gICAgICAgIGxldCByZWdfY29kZV9iZWdpbiA9IC9ePisgYGBgLztcbiAgICAgICAgbGV0IHJlZ19jb2RlX2VuZCA9IC9ePisgYGBgJC87XG4gICAgICAgIGZvciAobGV0IGw9Y2FsbG91dF9zdGFydF9saW5lKzE7IGw8PWxpbmVfbnVtYmVyOyBsKz0xKXtcbiAgICAgICAgICAgIGxldCBsX2xpbmUgPSBzdGF0ZS5kb2MubGluZShsKVxuICAgICAgICAgICAgaWYgKHJlc2V0KXtcbiAgICAgICAgICAgICAgICBpc19jb2RlX2Jsb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGlzX2NvZGVfYmxvY2sgJiYgcmVnX2NvZGVfZW5kLnRlc3QobF9saW5lLnRleHQpKXtcbiAgICAgICAgICAgICAgICBpc19jb2RlX2Jsb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXNldCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmKCFpc19jb2RlX2Jsb2NrICYmIHJlZ19jb2RlX2JlZ2luLnRlc3QobF9saW5lLnRleHQpKXtcbiAgICAgICAgICAgICAgICBpc19jb2RlX2Jsb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNfY29kZV9ibG9jaykge1xuICAgICAgICAgICAgcmV0dXJuIExpbmVUeXBlLmNvZGVibG9jaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHJldHVybiBMaW5lVHlwZS50ZXh0O1xuICAgIH1cbiAgICBlbHNlIGlmKHRva2VuLmNvbnRhaW5zKCdsaXN0Jykpe1xuICAgICAgICBmb3IobGV0IHA9bGluZS5mcm9tKzE7cDxsaW5lLnRvO3ArPTEpe1xuICAgICAgICAgICAgbGV0IHQgPSB0cmVlLnJlc29sdmUocCwgMSkubmFtZVxuICAgICAgICAgICAgaWYoKHQuY29udGFpbnMoJ2NvZGUnKSAmJiB0LmNvbnRhaW5zKCdibG9jaycpKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIExpbmVUeXBlLmNvZGVibG9ja1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBMaW5lVHlwZS50ZXh0XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc0xpbmVUeXBlMihzdGF0ZTogRWRpdG9yU3RhdGUsIHBvczogbnVtYmVyKTpMaW5lVHlwZSB7XG4gICAgY29uc3QgbGluZSA9IHN0YXRlLmRvYy5saW5lQXQocG9zKVxuICAgIGNvbnN0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKTtcbiAgICBjb25zdCB0b2tlbiA9IHRyZWUucmVzb2x2ZShsaW5lLmZyb20sIDEpLm5hbWVcbiAgICBpZiAodG9rZW4uY29udGFpbnMoJ2htZC1mcm9udG1hdHRlcicpKXtcbiAgICAgICAgcmV0dXJuIExpbmVUeXBlLmZyb250bWF0dGVyXG4gICAgfVxuXG4gICAgaWYodG9rZW4uY29udGFpbnMoJ21hdGgnKSl7XG4gICAgICAgIGZvcihsZXQgcD1saW5lLmZyb20rMTtwPGxpbmUudG87cCs9MSl7XG4gICAgICAgICAgICBpZighdHJlZS5yZXNvbHZlKHAsIDEpLm5hbWUuY29udGFpbnMoJ21hdGgnKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIExpbmVUeXBlLnRleHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTGluZVR5cGUuZm9ybXVsYVxuICAgIH1cbiAgICBlbHNlIGlmKHRva2VuLmNvbnRhaW5zKCdjb2RlJykgJiYgdG9rZW4uY29udGFpbnMoJ2Jsb2NrJykpe1xuICAgICAgICBmb3IobGV0IHA9bGluZS5mcm9tKzE7cDxsaW5lLnRvO3ArPTEpe1xuICAgICAgICAgICAgbGV0IHQgPSB0cmVlLnJlc29sdmUocCwgMSkubmFtZVxuICAgICAgICAgICAgaWYoISh0LmNvbnRhaW5zKCdjb2RlJykgJiYgdC5jb250YWlucygnYmxvY2snKSkpe1xuICAgICAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS50ZXh0XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExpbmVUeXBlLmNvZGVibG9ja1xuICAgIH1cblxuICAgIGZvcihsZXQgcD1saW5lLmZyb207cDxsaW5lLnRvO3ArPTEpe1xuICAgICAgICBpZih0cmVlLnJlc29sdmUocCwgMSkubmFtZS5jb250YWlucygnbGlzdCcpKXtcbiAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS5saXN0XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0cmVlLnJlc29sdmUocCwgMSkubmFtZS5jb250YWlucygnY2FsbG91dCcpKXtcbiAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS5jYWxsb3V0X3RpdGxlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYodG9rZW4uY29udGFpbnMoJ3F1b3RlJykpe1xuICAgICAgICByZXR1cm4gTGluZVR5cGUucXVvdGU7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBMaW5lVHlwZS50ZXh0XG59IiwgImltcG9ydCB7IEFubm90YXRpb24sIEVkaXRvclN0YXRlLCBFeHRlbnNpb24sIFN0YXRlRmllbGQsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblNwZWMsIFRleHR9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IEVhc3lUeXBpbmdTZXR0aW5nVGFiLCBFYXN5VHlwaW5nU2V0dGluZ3MsIFBhaXJTdHJpbmcsIENvbnZlcnRSdWxlfSBmcm9tIFwiLi9zZXR0aW5nc1wiXG5pbXBvcnQgeyBBcHAsIFBsdWdpbiwgUGxhdGZvcm0gfSBmcm9tICdvYnNpZGlhbidcbmltcG9ydCB7IFRhYnN0b3BTcGVjIH0gZnJvbSAnLi90YWJzdG9wJztcblxubGV0IERFQlVHID0gdHJ1ZTtcblxuZXhwb3J0IGNvbnN0IHByaW50PShtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+e1xuICAgIGlmIChERUJVRykge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCAuLi5vcHRpb25hbFBhcmFtcyk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zVG9PZmZzZXQoZG9jOlRleHQsIHBvczp7bGluZTpudW1iZXIsIGNoOm51bWJlcn0pIHtcblx0cmV0dXJuIGRvYy5saW5lKHBvcy5saW5lICsgMSkuZnJvbSArIHBvcy5jaFxufVxuZXhwb3J0IGZ1bmN0aW9uIG9mZnNldFRvUG9zKGRvYzpUZXh0LCBvZmZzZXQ6bnVtYmVyKSB7XG5cdGxldCBsaW5lID0gZG9jLmxpbmVBdChvZmZzZXQpXG5cdHJldHVybiB7bGluZTogbGluZS5udW1iZXIgLSAxLCBjaDogb2Zmc2V0IC0gbGluZS5mcm9tfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZVN0ck9mVHJhbnNhYyh0cjogVHJhbnNhY3Rpb24pOiBzdHJpbmcge1xuXHRsZXQgVHJhbnNhY1R5cGVBcnJheTpzdHJpbmdbXSA9IFtcIkVhc3lUeXBpbmcuY2hhbmdlXCIsIFwiRWFzeVR5cGluZy5wYXN0ZVwiLFxuXHRcdFx0XHRcdFx0XHRcImlucHV0LnR5cGUuY29tcG9zZVwiLCBcImlucHV0LnR5cGVcIiwgXCJpbnB1dC5wYXN0ZVwiLCBcImlucHV0LmRyb3BcIiwgXCJpbnB1dC5jb21wbGV0ZVwiLCBcImlucHV0XCIsXG5cdFx0XHRcdFx0XHRcdFwiZGVsZXRlLnNlbGVjdGlvblwiLCBcImRlbGV0ZS5mb3J3YXJkXCIsIFwiZGVsZXRlLmJhY2t3YXJkXCIsIFwiZGVsZXRlLmN1dFwiLCBcImRlbGV0ZVwiLFxuXHRcdFx0XHRcdFx0XHRcIm1vdmUuZHJvcFwiLFxuXHRcdFx0XHRcdFx0XHRcInVuZG9cIiwgXCJyZWRvXCIsXG5cdFx0XHRcdFx0XHRcdFwic2VsZWN0LnBvaW50ZXJcIl07XG5cdGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBUcmFuc2FjVHlwZUFycmF5Lmxlbmd0aDsgaSsrKVxuXHR7XG5cdFx0aWYgKHRyLmlzVXNlckV2ZW50KFRyYW5zYWNUeXBlQXJyYXlbaV0pKVxuXHRcdFx0cmV0dXJuIFRyYW5zYWNUeXBlQXJyYXlbaV07XG5cdH1cblx0cmV0dXJuIFwibm9uZVwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmcycGFpcnN0cmluZyhzOiBzdHJpbmcpOlBhaXJTdHJpbmd7XG5cdGxldCBjdXJzb3JJZHggPSBmaW5kRmlyc3RQaXBlTm90UHJlY2VkZWRCeUJhY2tzbGFzaChzKTtcblx0bGV0IGxlZnQgPSBzLnN1YnN0cmluZygwLCBjdXJzb3JJZHgpO1xuXHRsZXQgX2xlZnQgPSBpc1JlZ2V4cChsZWZ0KSA/IGxlZnQgOiBjb252ZXJ0RXNjYXBlQ2hhcihsZWZ0KTtcblx0bGV0IHJpZ2h0ID0gcy5zdWJzdHJpbmcoY3Vyc29ySWR4KzEpO1xuXHRsZXQgX3JpZ2h0ID0gaXNSZWdleHAocmlnaHQpID8gcmlnaHQgOiBjb252ZXJ0RXNjYXBlQ2hhcihyaWdodClcblx0cmV0dXJuIHtsZWZ0Ol9sZWZ0LCByaWdodDpfcmlnaHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVycyhzdHI6IHN0cmluZywgcmVwbGFjZW1lbnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGxldCByZXBsYWNlX21hdGNoZXMgPSBzdHIucmVwbGFjZSgvXFxbXFxbKFxcZCspXFxdXFxdL2csIGZ1bmN0aW9uIChtYXRjaCwgaW5kZXgpIHtcblx0XHRyZXR1cm4gcmVwbGFjZW1lbnRzW3BhcnNlSW50KGluZGV4LCAxMCldIHx8IG1hdGNoO1xuXHR9KTtcblx0cmV0dXJuIHJlcGxhY2VfbWF0Y2hlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VQbGFjZWhvbGRlcnNBbmRUYWJzdG9wcyhzdHI6IHN0cmluZywgcmVwbGFjZW1lbnRzOiBzdHJpbmdbXSk6IFtzdHJpbmcsIFRhYnN0b3BTcGVjW11de1xuXHRsZXQgdGFic3RvcHM6IFRhYnN0b3BTcGVjW10gPSBbXTtcblx0Y29uc3QgcmVnZXggPSAvXFwkKFxcZCspfFxcJFxceyhcXGQrKTogKihbXiB7fV0qPylcXH18XFxbXFxbKFxcZCspXFxdXFxdL2c7XG5cdGxldCBtYXRjaDtcblx0aW50ZXJmYWNlIFJlcGxhY2VTdHJpbmcge1xuXHRcdGZyb206IG51bWJlcjtcblx0XHR0bzogbnVtYmVyO1xuXHRcdHJlcGxhY2VtZW50OiBzdHJpbmc7XG5cdFx0dGFic3RvcDogYm9vbGVhbjtcblx0XHR0YWJzdG9wTnVtYmVyPzogbnVtYmVyO1xuXHR9XG5cblx0bGV0IHJlcGxhY2VTdHJpbmdzOiBSZXBsYWNlU3RyaW5nW10gPSBbXTtcblx0d2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyKSkgIT09IG51bGwpIHtcblx0XHQvLyBcdTY4QzBcdTY3RTVcdTY2MkZcdTU0RUFcdTc5Q0RcdTZBMjFcdTVGMEZcdTc2ODRcdTUzMzlcdTkxNERcblx0XHRjb25zdCBpc1NpbXBsZVZhciA9IG1hdGNoWzFdOyAvLyBcdTc1MjhcdTRFOEUgJG4gXHU1RjYyXHU1RjBGXG5cdFx0Y29uc3QgaXNOYW1lZFZhciA9IG1hdGNoWzJdOyAvLyBcdTc1MjhcdTRFOEUgJHtuOiBcdTUxODVcdTVCQjl9IFx1NUY2Mlx1NUYwRlxuXHRcdGNvbnN0IGNvbnRlbnQgPSBtYXRjaFszXTsgLy8gXHU3NTI4XHU0RThFICR7bjogXHU1MTg1XHU1QkI5fSBcdTVGNjJcdTVGMEZcdTc2ODRcdTUxODVcdTVCQjlcblx0XHRjb25zdCByZXBsYWNlTiA9IG1hdGNoWzRdOyAvLyBcdTc1MjhcdTRFOEUgW1tuXV0gXHU1RjYyXHU1RjBGXG5cblx0XHRjb25zdCB0YWJzdG9wTiA9IGlzU2ltcGxlVmFyIHx8IGlzTmFtZWRWYXI7IC8vIFx1NTNENiBuIFx1NzY4NFx1NTAzQ1x1RkYwQ1x1NjVFMFx1OEJCQVx1NjYyRlx1N0I4MFx1NTM1NVx1OEZEOFx1NjYyRlx1NTQ3RFx1NTQwRFx1NTNEOFx1OTFDRlxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSBtYXRjaC5pbmRleDtcblx0XHRjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG5cdFx0aWYgKHJlcGxhY2VOKXtcblx0XHRcdGxldCBtYXRjaGVkTiA9IHBhcnNlSW50KHJlcGxhY2VOLCAxMCk7XG5cdFx0XHRpZihtYXRjaGVkTiA8IHJlcGxhY2VtZW50cy5sZW5ndGgpe1xuXHRcdFx0XHRyZXBsYWNlU3RyaW5ncy5wdXNoKHtmcm9tOiBzdGFydEluZGV4LCB0bzogZW5kSW5kZXgsIHJlcGxhY2VtZW50OiByZXBsYWNlbWVudHNbbWF0Y2hlZE5dLCB0YWJzdG9wOmZhbHNlfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IG4gPSBwYXJzZUludCh0YWJzdG9wTiwgMTApO1xuXHRcdFx0bGV0IGNvbnRlbnRTdHIgPSByZXBsYWNlUGxhY2Vob2xkZXJzKGNvbnRlbnQ/Y29udGVudDpcIlwiLCByZXBsYWNlbWVudHMpO1xuXHRcdFx0cmVwbGFjZVN0cmluZ3MucHVzaCh7ZnJvbTogc3RhcnRJbmRleCwgdG86IGVuZEluZGV4LCByZXBsYWNlbWVudDogY29udGVudFN0ciwgdGFic3RvcDp0cnVlLCB0YWJzdG9wTnVtYmVyOiBufSk7XG5cdFx0fVxuXHR9XG5cblx0bGV0IG5ld1N0cmluZyA9IHN0cjtcblx0bGV0IG9mZnNldCA9IDA7XG5cdGZvciAobGV0IGk9MDsgaTxyZXBsYWNlU3RyaW5ncy5sZW5ndGg7IGkrKyl7XG5cdFx0bGV0IHJlcGxhY2VTdHJpbmcgPSByZXBsYWNlU3RyaW5nc1tpXTtcblx0XHRuZXdTdHJpbmcgPSBuZXdTdHJpbmcuc3Vic3RyaW5nKDAsIHJlcGxhY2VTdHJpbmcuZnJvbSArIG9mZnNldCkgKyByZXBsYWNlU3RyaW5nLnJlcGxhY2VtZW50ICsgbmV3U3RyaW5nLnN1YnN0cmluZyhyZXBsYWNlU3RyaW5nLnRvICsgb2Zmc2V0KTtcblx0XHRpZiAocmVwbGFjZVN0cmluZy50YWJzdG9wKXtcblx0XHRcdGxldCB0YWJzdG9wOiBUYWJzdG9wU3BlYyA9IHtcblx0XHRcdFx0ZnJvbTogcmVwbGFjZVN0cmluZy5mcm9tICsgb2Zmc2V0LFxuXHRcdFx0XHR0bzogcmVwbGFjZVN0cmluZy5mcm9tICsgb2Zmc2V0ICsgcmVwbGFjZVN0cmluZy5yZXBsYWNlbWVudC5sZW5ndGgsXG5cdFx0XHRcdG51bWJlcjogcmVwbGFjZVN0cmluZy50YWJzdG9wTnVtYmVyLFxuXHRcdFx0fVxuXHRcdFx0dGFic3RvcHMucHVzaCh0YWJzdG9wKTtcblx0XHR9XG5cdFx0b2Zmc2V0ICs9IHJlcGxhY2VTdHJpbmcucmVwbGFjZW1lbnQubGVuZ3RoIC0gKHJlcGxhY2VTdHJpbmcudG8gLSByZXBsYWNlU3RyaW5nLmZyb20pO1xuXHR9XG5cblx0cmV0dXJuIFtuZXdTdHJpbmcsIHRhYnN0b3BzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGhlQWZ0ZXJQYXR0ZXJuKHBhdHRlcm46IHN0cmluZywgcmVwbGFjZW1lbnRzOiBzdHJpbmdbXSk6IFtzdHJpbmcsIFRhYnN0b3BTcGVjW11de1xuXHRsZXQgc2luZ2xlX2N1cnNvcl9wb3MgPSBmaW5kRmlyc3RQaXBlTm90UHJlY2VkZWRCeUJhY2tzbGFzaChwYXR0ZXJuKTtcblx0bGV0IGdlbmVyYWxfY3Vyc29yX2ZpbmQgPSAvXFwkKFxcZCspfFxcJFxceyhcXGQrKTogKihbXiB7fV0qPylcXH0vLnRlc3QocGF0dGVybik7XG5cdGxldCBzaW5nbGVfY3Vyc29yX2ZpbmQgPSBzaW5nbGVfY3Vyc29yX3BvcyAhPT0gLTE7XG5cdGxldCBmaW5hbF9wYXR0ZXJuID0gcGF0dGVybjtcblx0aWYgKGdlbmVyYWxfY3Vyc29yX2ZpbmQpe1xuXHRcdGZpbmFsX3BhdHRlcm4gPSBwYXR0ZXJuO1xuXHR9ZWxzZSBpZiAoc2luZ2xlX2N1cnNvcl9maW5kKXtcblx0XHRmaW5hbF9wYXR0ZXJuID0gcGF0dGVybi5zdWJzdHJpbmcoMCwgc2luZ2xlX2N1cnNvcl9wb3MpICsgXCIkMFwiICsgcGF0dGVybi5zdWJzdHJpbmcoc2luZ2xlX2N1cnNvcl9wb3MrMSk7XG5cdH1lbHNlIHtcblx0XHRmaW5hbF9wYXR0ZXJuID0gcGF0dGVybiArIFwiJDBcIjtcblx0fVxuXHRyZXR1cm4gcmVwbGFjZVBsYWNlaG9sZGVyc0FuZFRhYnN0b3BzKGNvbnZlcnRFc2NhcGVDaGFyKGZpbmFsX3BhdHRlcm4pLCByZXBsYWNlbWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWdleHAoczogc3RyaW5nKTpib29sZWFue1xuXHRyZXR1cm4gcy5zdGFydHNXaXRoKFwici9cIikgJiYgcy5lbmRzV2l0aChcIi9cIik7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRFc2NhcGVDaGFyKHM6IHN0cmluZyk6c3RyaW5ne1xuXHRyZXR1cm4gcy5yZXBsYWNlKC9cXFxcXFx8L2csIFwifFwiKVxuXHRcdFx0LnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKS5yZXBsYWNlKC9cXFxcci9nLCAnXFxyJykucmVwbGFjZSgvXFxcXHQvZywgJ1xcdCcpXG5cdFx0XHQucmVwbGFjZSgvXFxcXFxcbi9nLCAnXFxcXG4nKS5yZXBsYWNlKC9cXFxcXFxyL2csICdcXFxccicpLnJlcGxhY2UoL1xcXFxcXHQvZywgJ1xcXFx0Jylcblx0XHRcdC5yZXBsYWNlKC9cXFxcXFxcXC9nLCBcIlxcXFxcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydWxlU3RyaW5nTGlzdDJSdWxlTGlzdChsaXN0OiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPik6Q29udmVydFJ1bGVbXSB7XG5cdGxldCByZXM6Q29udmVydFJ1bGVbXSA9IFtdO1xuXHRmb3IgKGxldCBpIGluIGxpc3Qpe1xuXHRcdHJlc1tpXSA9IHtiZWZvcmU6IHN0cmluZzJwYWlyc3RyaW5nKGxpc3RbaV1bMF0pLCBhZnRlcjogc3RyaW5nMnBhaXJzdHJpbmcobGlzdFtpXVsxXSksIGFmdGVyX3BhdHRlcm46IGxpc3RbaV1bMV19XG5cdH1cblx0cmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRGaXJzdFBpcGVOb3RQcmVjZWRlZEJ5QmFja3NsYXNoKHM6IHN0cmluZyk6IG51bWJlciB7XG5cdGxldCByZWdleCA9IC9eclxcL1teXSo/XFwvXFx8Lztcblx0bGV0IHJlZ01hdGNoID0gcy5tYXRjaChyZWdleCk7XG5cdGlmIChyZWdNYXRjaCkgcmV0dXJuIHJlZ01hdGNoWzBdLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgbWF0Y2ggPSBzLm1hdGNoKC8oKF58W15cXFxcXSkoXFxcXFxcXFwpKilcXHwvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBzLmluZGV4T2YobWF0Y2hbMF0pICsgbWF0Y2hbMV0ubGVuZ3RoIDogLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdEZWxldGVBdChzdHI6IHN0cmluZywgaW5kZXg6IG51bWJlcik6c3RyaW5nXG57XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpK3N0ci5zdWJzdHJpbmcoaW5kZXgrMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdJbnNlcnRBdChzdHI6c3RyaW5nLCBpbmRleDogbnVtYmVyLCBzOiBzdHJpbmcpOnN0cmluZ1xue1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KStzK3N0ci5zdWJzdHJpbmcoaW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQYXJhbURlZmluZWQocGFyYW06IGFueSk6Ym9vbGVhblxue1xuXHRyZXR1cm4gdHlwZW9mIHBhcmFtIT09XCJ1bmRlZmluZWRcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dTdHJpbmcoczogc3RyaW5nKTpzdHJpbmd7XG5cdHJldHVybiBzLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKTtcbn0iLCAiaW1wb3J0IHsgU3BhY2VTdGF0ZSwgc3RyaW5nMlNwYWNlU3RhdGUgfSBmcm9tICdzcmMvY29yZSc7XG5pbXBvcnQgeyBBcHAsIFRleHRDb21wb25lbnQsIE1hcmtkb3duVmlldywgTW9kYWwsIE5vdGljZSwgUGx1Z2luLCBQbHVnaW5TZXR0aW5nVGFiLCBTZXR0aW5nLCBXb3Jrc3BhY2UsIFdvcmtzcGFjZUxlYWYsIFRleHRBcmVhQ29tcG9uZW50LCBtb21lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgRWFzeVR5cGluZ1BsdWdpbiBmcm9tICcuL21haW4nO1xuaW1wb3J0IHsgc2hvd1N0cmluZywgZmluZEZpcnN0UGlwZU5vdFByZWNlZGVkQnlCYWNrc2xhc2ggfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGVuVVMsIHJ1UlUsIHpoQ04sIHpoVFcgfSBmcm9tICcuL2xhbmcvbG9jYWxlJztcbmltcG9ydCB7c3ByaW50Zn0gZnJvbSBcInNwcmludGYtanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQYWlyU3RyaW5nIHtcblx0bGVmdDogc3RyaW5nO1xuXHRyaWdodDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRSdWxlIHtcblx0YmVmb3JlOiBQYWlyU3RyaW5nO1xuXHRhZnRlcjogUGFpclN0cmluZztcblx0YWZ0ZXJfcGF0dGVybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gUnVsZVR5cGUge2RlbGV0ZT0gXCJEZWxldGUgUnVsZVwiLCBjb252ZXJ0PSdDb252ZXJ0IFJ1bGUnfVxuZXhwb3J0IGVudW0gV29ya01vZGUgeyBPbmx5V2hlblR5cGluZyA9IFwidHlwaW5nXCIsIEdsb2JhbGx5ID0gXCJnbG9iYWxcIiB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWFzeVR5cGluZ1NldHRpbmdzIHtcblx0VGFib3V0OiBib29sZWFuO1xuXHRTZWxlY3Rpb25FbmhhbmNlOiBib29sZWFuO1xuXHRJbnRyaW5zaWNTeW1ib2xQYWlyczogYm9vbGVhbjtcblx0QmFzZU9iRWRpdEVuaGFuY2U6IGJvb2xlYW47XG5cdEZXMkhXRW5oYW5jZTogYm9vbGVhbjtcblx0QmV0dGVyQ29kZUVkaXQ6IGJvb2xlYW47XG5cdEF1dG9Gb3JtYXQ6IGJvb2xlYW47XG5cdEV4Y2x1ZGVGaWxlczogc3RyaW5nO1xuXHRBdXRvQ2FwaXRhbDogYm9vbGVhbjtcblx0QXV0b0NhcGl0YWxNb2RlOiBXb3JrTW9kZTtcblx0Q2hpbmVzZUVuZ2xpc2hTcGFjZTogYm9vbGVhbjtcblx0RW5nbGlzaE51bWJlclNwYWNlOiBib29sZWFuO1xuXHRDaGluZXNlTm9TcGFjZTogYm9vbGVhbjtcblx0Q2hpbmVzZU51bWJlclNwYWNlOiBib29sZWFuO1xuXHRQdW5jdHVhdGlvblNwYWNlOiBib29sZWFuO1xuXHRQdW5jdHVhdGlvblNwYWNlTW9kZTogV29ya01vZGU7XG5cdElubGluZUNvZGVTcGFjZU1vZGU6IFNwYWNlU3RhdGU7XG5cdElubGluZUZvcm11bGFTcGFjZU1vZGU6IFNwYWNlU3RhdGU7XG5cdElubGluZUxpbmtTcGFjZU1vZGU6IFNwYWNlU3RhdGU7XG5cdElubGluZUxpbmtTbWFydFNwYWNlOiBib29sZWFuO1xuXHRVc2VyRGVmaW5lZFJlZ1N3aXRjaDogYm9vbGVhbjtcblx0VXNlckRlZmluZWRSZWdFeHA6IHN0cmluZztcblx0ZGVidWc6IGJvb2xlYW47XG5cblx0dXNlclNlbFJlcFJ1bGVUcmlnZ2VyOiBzdHJpbmdbXTtcblx0dXNlclNlbFJlcFJ1bGVWYWx1ZTogUGFpclN0cmluZ1tdO1xuXHR1c2VyRGVsZXRlUnVsZXNTdHJMaXN0OiBbc3RyaW5nLCBzdHJpbmddW107XG5cdHVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0OiBbc3RyaW5nLCBzdHJpbmddW107XG5cdHVzZXJTZWxSdWxlU2V0dGluZ3NPcGVuOiBib29sZWFuO1xuXHR1c2VyRGVsUnVsZVNldHRpbmdzT3BlbjogYm9vbGVhbjtcblx0dXNlckN2dFJ1bGVTZXR0aW5nc09wZW46IGJvb2xlYW47XG5cblx0RW50ZXJUd2ljZTogYm9vbGVhbjtcblx0UHVuY1JlY3RpZnk6IGJvb2xlYW47XG5cdFRyeUZpeENoaW5lc2VJTTogYm9vbGVhbjtcblx0Rml4TWFjT1NDb250ZXh0TWVudTogYm9vbGVhbjtcblx0VHJ5Rml4TVNJTUU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBFYXN5VHlwaW5nU2V0dGluZ3MgPSB7XG5cdFRhYm91dDogdHJ1ZSxcblx0U2VsZWN0aW9uRW5oYW5jZTogdHJ1ZSxcblx0SW50cmluc2ljU3ltYm9sUGFpcnM6IHRydWUsXG5cdEJhc2VPYkVkaXRFbmhhbmNlOiB0cnVlLFxuXHRGVzJIV0VuaGFuY2U6IHRydWUsXG5cdEJldHRlckNvZGVFZGl0OiB0cnVlLFxuXG5cdEF1dG9Gb3JtYXQ6IHRydWUsXG5cdEV4Y2x1ZGVGaWxlczogXCJcIixcblx0Q2hpbmVzZUVuZ2xpc2hTcGFjZTogdHJ1ZSxcblx0Q2hpbmVzZU51bWJlclNwYWNlOiB0cnVlLFxuXHRFbmdsaXNoTnVtYmVyU3BhY2U6IHRydWUsXG5cdENoaW5lc2VOb1NwYWNlOiB0cnVlLFxuXHRQdW5jdHVhdGlvblNwYWNlOiB0cnVlLFxuXHRBdXRvQ2FwaXRhbDogdHJ1ZSxcblx0QXV0b0NhcGl0YWxNb2RlOiBXb3JrTW9kZS5Pbmx5V2hlblR5cGluZyxcblx0UHVuY3R1YXRpb25TcGFjZU1vZGU6IFdvcmtNb2RlLk9ubHlXaGVuVHlwaW5nLFxuXHRJbmxpbmVDb2RlU3BhY2VNb2RlOiBTcGFjZVN0YXRlLnNvZnQsXG5cdElubGluZUZvcm11bGFTcGFjZU1vZGU6IFNwYWNlU3RhdGUuc29mdCxcblx0SW5saW5lTGlua1NwYWNlTW9kZTogU3BhY2VTdGF0ZS5zb2Z0LFxuXHRJbmxpbmVMaW5rU21hcnRTcGFjZTogdHJ1ZSxcblx0VXNlckRlZmluZWRSZWdTd2l0Y2g6IHRydWUsXG5cdFVzZXJEZWZpbmVkUmVnRXhwOiBcInt7Lio/fX18KytcXG5cIitcblx0XHRcIjwuKj8+fC0tXFxuXCIgK1xuXHRcdFwiXFxcXFtcXFxcIS4qP1xcXFxdWy0rXXswLDF9fC0rXFxuXCIrXG5cdFx0XCIoZmlsZTovLy98aHR0cHM/Oi8vfGZ0cDovL3xvYnNpZGlhbjovL3x6b3Rlcm86Ly98d3d3LilbXlxcXFxzXHVGRjA4XHVGRjA5XHUzMDBBXHUzMDBCXHUzMDAyLFx1RkYwQ1x1RkYwMVx1RkYxRjtcdUZGMUJcdUZGMUFcdTIwMUNcdTIwMURcdTIwMThcdTIwMTlcXFxcKVxcXFwoXFxcXFtcXFxcXVxcXFx7XFxcXH0nXSt8LS1cXG5cIitcblx0XHRcIlxcblthLXpBLVowLTlfXFxcXC0uXStAW2EtekEtWjAtOV9cXFxcLS5dK3wrK1xcblwiK1xuXHRcdFwiKD88ISMpI1tcXFxcdTRlMDAtXFxcXHU5ZmE1XFxcXHctXFxcXC9dK3wrK1wiLFxuXHRkZWJ1ZzogZmFsc2UsXG5cdHVzZXJTZWxSZXBSdWxlVHJpZ2dlcjogW1wiLVwiLCBcIiNcIl0sXG5cdHVzZXJTZWxSZXBSdWxlVmFsdWU6IFt7bGVmdDpcIn5+XCIsIHJpZ2h0Olwifn5cIn0sIHtsZWZ0OlwiI1wiLCByaWdodDpcIiBcIn1dLFxuXHR1c2VyRGVsZXRlUnVsZXNTdHJMaXN0OiBbW1wiZGVtb3xcIiwgXCJ8XCJdXSxcblx0dXNlckNvbnZlcnRSdWxlc1N0ckxpc3Q6IFtbXCI6KXxcIixcIlx1RDgzRFx1REUwMHxcIl1dLFxuXHR1c2VyU2VsUnVsZVNldHRpbmdzT3BlbjogdHJ1ZSxcblx0dXNlckRlbFJ1bGVTZXR0aW5nc09wZW46IHRydWUsXG5cdHVzZXJDdnRSdWxlU2V0dGluZ3NPcGVuOiB0cnVlLFxuXG5cdEVudGVyVHdpY2U6IGZhbHNlLFxuXHRUcnlGaXhDaGluZXNlSU06IHRydWUsXG5cdFB1bmNSZWN0aWZ5OiBmYWxzZSxcblx0Rml4TWFjT1NDb250ZXh0TWVudTogZmFsc2UsXG5cdFRyeUZpeE1TSU1FOiBmYWxzZSxcbn1cblxudmFyIGxvY2FsZSA9IGVuVVM7XG5cbmV4cG9ydCBjbGFzcyBFYXN5VHlwaW5nU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuXHRwbHVnaW46IEVhc3lUeXBpbmdQbHVnaW47XG5cblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogRWFzeVR5cGluZ1BsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuXHRcdC8vIG5ldyBOb3RpY2UoXCJtb21lbnQubG9jYWxlKCkgXCIrbW9tZW50LmxvY2FsZSgpKVxuXG5cdFx0aWYgKG1vbWVudC5sb2NhbGUoKSA9PSBcInpoXCIgfHwgbW9tZW50LmxvY2FsZSgpID09IFwiemgtY25cIikge1xuXHRcdFx0bG9jYWxlID0gemhDTjtcblx0XHR9XG5cdFx0ZWxzZSBpZiAobW9tZW50LmxvY2FsZSgpLnRvTG93ZXJDYXNlKCkgPT0gXCJ6aC10d1wiKXtcblx0XHRcdGxvY2FsZSA9IHpoVFc7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKG1vbWVudC5sb2NhbGUoKSA9PSBcInJ1XCIpIHtcblx0XHRcdGxvY2FsZSA9IHJ1UlU7XG5cdFx0fVxuXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDFcIiwgeyB0ZXh0OiBsb2NhbGUuaGVhZGVycy5tYWluIH0pO1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IGxvY2FsZS5oZWFkZXJzLmdpdGh1YkRldGFpbCB9KS5jcmVhdGVFbChcImFcIiwge1xuXHRcdFx0dGV4dDogXCJlYXN5LXR5cGluZy1vYnNpZGlhblwiLFxuXHRcdFx0aHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vWWFvemh1d2EvZWFzeS10eXBpbmctb2JzaWRpYW5cIixcblx0XHR9KTtcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogbG9jYWxlLmhlYWRlcnMuZW5oYW5jZWRFZGl0aW5nIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3Muc3ltYm9sQXV0b1BhaXIubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5zeW1ib2xBdXRvUGFpci5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnRyaW5zaWNTeW1ib2xQYWlycylcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbnRyaW5zaWNTeW1ib2xQYWlycyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnNlbGVjdGlvblJlcGxhY2UubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5zZWxlY3Rpb25SZXBsYWNlLmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlNlbGVjdGlvbkVuaGFuY2UpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuU2VsZWN0aW9uRW5oYW5jZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLmZ1bGxXaWR0aFRvSGFsZldpZHRoLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MuZnVsbFdpZHRoVG9IYWxmV2lkdGguZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRlcySFdFbmhhbmNlKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkZXMkhXRW5oYW5jZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLmJhc2ljSW5wdXRFbmhhbmNlLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MuYmFzaWNJbnB1dEVuaGFuY2UuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQmFzZU9iRWRpdEVuaGFuY2UpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuQmFzZU9iRWRpdEVuaGFuY2UgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5jb2RlYmxvY2tFZGl0Lm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MuY29kZWJsb2NrRWRpdC5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5CZXR0ZXJDb2RlRWRpdClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5CZXR0ZXJDb2RlRWRpdCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnRhYk91dC5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnRhYk91dC5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5UYWJvdXQpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuVGFib3V0ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiBsb2NhbGUuaGVhZGVycy5jdXN0b21pemVFZGl0UnVsZSB9KTtcblx0XHR0aGlzLmJ1aWxkVXNlclNlbFJlcFJ1bGVTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJkZXRhaWxzXCIsIHtcblx0XHRcdGNsczogXCJlYXN5dHlwaW5nLW5lc3RlZC1zZXR0aW5nc1wiLFxuXHRcdFx0YXR0cjoge1xuXHRcdFx0XHQuLi4odGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlclNlbFJ1bGVTZXR0aW5nc09wZW4/eyBvcGVuOiB0cnVlIH06e30pXG5cdFx0XHR9XG5cdFx0fSkpXG5cblx0XHR0aGlzLmJ1aWxkVXNlckRlbGV0ZVJ1bGVTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJkZXRhaWxzXCIsIHtcblx0XHRcdGNsczogXCJlYXN5dHlwaW5nLW5lc3RlZC1zZXR0aW5nc1wiLFxuXHRcdFx0YXR0cjoge1xuXHRcdFx0XHQuLi4odGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckRlbFJ1bGVTZXR0aW5nc09wZW4/eyBvcGVuOiB0cnVlIH06e30pXG5cdFx0XHR9XG5cdFx0fSkpXG5cblx0XHR0aGlzLmJ1aWxkVXNlckNvbnZlcnRSdWxlU2V0dGluZyh0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiZGV0YWlsc1wiLCB7XG5cdFx0XHRjbHM6IFwiZWFzeXR5cGluZy1uZXN0ZWQtc2V0dGluZ3NcIixcblx0XHRcdGF0dHI6IHtcblx0XHRcdFx0Li4uKHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJDdnRSdWxlU2V0dGluZ3NPcGVuP3sgb3BlbjogdHJ1ZSB9Ont9KVxuXHRcdFx0fVxuXHRcdH0pKVxuXHRcdFxuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiBsb2NhbGUuaGVhZGVycy5hdXRvZm9ybWF0U2V0dGluZyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLmF1dG9Gb3JtYXR0aW5nLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MuYXV0b0Zvcm1hdHRpbmcuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQXV0b0Zvcm1hdClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvRm9ybWF0ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdwJywgeyB0ZXh0OiBsb2NhbGUuaGVhZGVycy5kZXRhaWxlZFNldHRpbmcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5zcGFjZUJldHdlZW5DaGluZXNlRW5nbGlzaC5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnNwYWNlQmV0d2VlbkNoaW5lc2VFbmdsaXNoLmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkNoaW5lc2VFbmdsaXNoU3BhY2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkNoaW5lc2VFbmdsaXNoU3BhY2UgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnNwYWNlQmV0d2VlbkNoaW5lc2VOdW1iZXIubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5zcGFjZUJldHdlZW5DaGluZXNlTnVtYmVyLmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkNoaW5lc2VOdW1iZXJTcGFjZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuQ2hpbmVzZU51bWJlclNwYWNlID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3Muc3BhY2VCZXR3ZWVuRW5nbGlzaE51bWJlci5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnNwYWNlQmV0d2VlbkVuZ2xpc2hOdW1iZXIuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRW5nbGlzaE51bWJlclNwYWNlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5FbmdsaXNoTnVtYmVyU3BhY2UgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLmRlbGV0ZVNwYWNlQmV0d2VlbkNoaW5lc2UubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5kZWxldGVTcGFjZUJldHdlZW5DaGluZXNlLmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkNoaW5lc2VOb1NwYWNlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5DaGluZXNlTm9TcGFjZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLmRlc2MpXG5cdFx0XHQuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PiB7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihXb3JrTW9kZS5Pbmx5V2hlblR5cGluZywgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5vbmx5V2hlblR5cGluZyk7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihXb3JrTW9kZS5HbG9iYWxseSwgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5nbG9iYWxseSk7XG5cdFx0XHRcdGRyb3Bkb3duLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkF1dG9DYXBpdGFsTW9kZSk7XG5cdFx0XHRcdGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2OiBXb3JrTW9kZS5Pbmx5V2hlblR5cGluZyB8IFdvcmtNb2RlLkdsb2JhbGx5KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuQXV0b0NhcGl0YWxNb2RlID0gdjtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSlcblx0XHRcdH0pXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFRvb2x0aXAobG9jYWxlLnRvb2xUaXAuc3dpdGNoKTtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkF1dG9DYXBpdGFsKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvQ2FwaXRhbCA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3Muc21hcnRJbnNlcnRTcGFjZS5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnNtYXJ0SW5zZXJ0U3BhY2UuZGVzYylcblx0XHRcdC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFdvcmtNb2RlLk9ubHlXaGVuVHlwaW5nLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLm9ubHlXaGVuVHlwaW5nKTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFdvcmtNb2RlLkdsb2JhbGx5LCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLmdsb2JhbGx5KTtcblx0XHRcdFx0ZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY3R1YXRpb25TcGFjZU1vZGUpO1xuXHRcdFx0XHRkcm9wZG93bi5vbkNoYW5nZShhc3luYyAodjogV29ya01vZGUuT25seVdoZW5UeXBpbmcgfCBXb3JrTW9kZS5HbG9iYWxseSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLlB1bmN0dWF0aW9uU3BhY2VNb2RlID0gdjtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSlcblx0XHRcdH0pXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlB1bmN0dWF0aW9uU3BhY2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLlB1bmN0dWF0aW9uU3BhY2UgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnNwYWNlU3RyYXRlZ3lJbmxpbmVDb2RlLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3Muc3BhY2VTdHJhdGVneUlubGluZUNvZGUuZGVzYylcblx0XHRcdC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLm5vbmUpLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLm5vUmVxdWlyZSk7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihTdHJpbmcoU3BhY2VTdGF0ZS5zb2Z0KSwgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5zb2Z0U3BhY2UpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKFNwYWNlU3RhdGUuc3RyaWN0KSwgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5zdHJpY3RTcGFjZSk7XG5cdFx0XHRcdGRyb3Bkb3duLnNldFZhbHVlKFN0cmluZyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlKSk7XG5cdFx0XHRcdGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlID0gc3RyaW5nMlNwYWNlU3RhdGUodik7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnNwYWNlU3RyYXRlZ3lJbmxpbmVGb3JtdWxhLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3Muc3BhY2VTdHJhdGVneUlubGluZUZvcm11bGEuZGVzYylcblx0XHRcdC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLm5vbmUpLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLm5vUmVxdWlyZSk7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihTdHJpbmcoU3BhY2VTdGF0ZS5zb2Z0KSwgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5zb2Z0U3BhY2UpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKFNwYWNlU3RhdGUuc3RyaWN0KSwgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5zdHJpY3RTcGFjZSk7XG5cdFx0XHRcdGRyb3Bkb3duLnNldFZhbHVlKFN0cmluZyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlKSk7XG5cdFx0XHRcdGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlID0gc3RyaW5nMlNwYWNlU3RhdGUodik7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnNwYWNlU3RyYXRlZ3lMaW5rVGV4dC5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnNwYWNlU3RyYXRlZ3lMaW5rVGV4dC5kZXNjKVxuXHRcdFx0LmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oXCJkdW1teVwiLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLmR1bW15KTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFwic21hcnRcIiwgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5zbWFydCk7XG5cdFx0XHRcdGRyb3Bkb3duLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLklubGluZUxpbmtTbWFydFNwYWNlID8gXCJzbWFydFwiIDogXCJkdW1teVwiKTtcblx0XHRcdFx0ZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKHY6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLklubGluZUxpbmtTbWFydFNwYWNlID0gdiA9PSBcInNtYXJ0XCIgPyB0cnVlIDogZmFsc2U7XG5cdFx0XHRcdFx0Ly8gbmV3IE5vdGljZShTdHJpbmcodGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UpKTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSlcblx0XHRcdH0pXG5cdFx0XHQuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PiB7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihTdHJpbmcoU3BhY2VTdGF0ZS5ub25lKSwgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5ub1JlcXVpcmUpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKFNwYWNlU3RhdGUuc29mdCksIGxvY2FsZS5kcm9wZG93bk9wdGlvbnMuc29mdFNwYWNlKTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLnN0cmljdCksIGxvY2FsZS5kcm9wZG93bk9wdGlvbnMuc3RyaWN0U3BhY2UpO1xuXHRcdFx0XHRkcm9wZG93bi5zZXRWYWx1ZShTdHJpbmcodGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZSkpO1xuXHRcdFx0XHRkcm9wZG93bi5vbkNoYW5nZShhc3luYyAodjogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZSA9IHN0cmluZzJTcGFjZVN0YXRlKHYpO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogbG9jYWxlLmhlYWRlcnMuY3VzdG9tUmVnZXhwQmxvY2sgfSk7XG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MudXNlckRlZmluZWRSZWdleHBTd2l0Y2gubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy51c2VyRGVmaW5lZFJlZ2V4cFN3aXRjaC5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VyRGVmaW5lZFJlZ1N3aXRjaCkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlckRlZmluZWRSZWdTd2l0Y2ggPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IGxvY2FsZS5oZWFkZXJzLmFib3V0UmVnZXhwLmhlYWRlciB9KS5jcmVhdGVFbChcImFcIiwge1xuXHRcdFx0dGV4dDogbG9jYWxlLmhlYWRlcnMuYWJvdXRSZWdleHAudGV4dCxcblx0XHRcdGhyZWY6IFwiaHR0cHM6Ly9qYXZhc2NyaXB0LnJ1YW55aWZlbmcuY29tL3N0ZGxpYi9yZWdleHAuaHRtbCNcIixcblx0XHR9KTtcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwicFwiLCB7IHRleHQ6IGxvY2FsZS5oZWFkZXJzLmluc3RydWN0aW9uc1JlZ2V4cC5oZWFkZXIgfSkuY3JlYXRlRWwoXCJhXCIsIHtcblx0XHRcdHRleHQ6IGxvY2FsZS5oZWFkZXJzLmluc3RydWN0aW9uc1JlZ2V4cC50ZXh0LFxuXHRcdFx0aHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vWWFvemh1d2EvZWFzeS10eXBpbmctb2JzaWRpYW4vYmxvYi9tYXN0ZXIvVXNlckRlZmluZWRSZWdFeHAubWRcIixcblx0XHR9KTtcblxuXHRcdGNvbnN0IHJlZ0NvbnRlbnRBcmVhU2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKTtcblx0XHRyZWdDb250ZW50QXJlYVNldHRpbmcuc2V0dGluZ0VsLnNldEF0dHJpYnV0ZShcblx0XHRcdFwic3R5bGVcIixcblx0XHRcdFwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XCJcblx0XHQpO1xuXHRcdHJlZ0NvbnRlbnRBcmVhU2V0dGluZ1xuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnVzZXJEZWZpbmVkUmVnZXhwLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MudXNlckRlZmluZWRSZWdleHAuZGVzYyk7XG5cdFx0Y29uc3QgcmVnQ29udGVudEFyZWEgPSBuZXcgVGV4dEFyZWFDb21wb25lbnQoXG5cdFx0XHRyZWdDb250ZW50QXJlYVNldHRpbmcuY29udHJvbEVsXG5cdFx0KTtcblxuXHRcdHNldEF0dHJpYnV0ZXMocmVnQ29udGVudEFyZWEuaW5wdXRFbCwge1xuXHRcdFx0c3R5bGU6IFwibWFyZ2luLXRvcDogMTJweDsgd2lkdGg6IDEwMCU7ICBoZWlnaHQ6IDMwdmg7XCIsXG5cdFx0XHQvLyBjbGFzczogXCJtcy1jc3MtZWRpdG9yXCIsXG5cdFx0fSk7XG5cdFx0cmVnQ29udGVudEFyZWFcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VyRGVmaW5lZFJlZ0V4cClcblx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuVXNlckRlZmluZWRSZWdFeHAgPSB2YWx1ZTtcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHR9KTtcblxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogbG9jYWxlLmhlYWRlcnMuZXhjbHVkZUZvbGRlcnNGaWxlcyB9KTtcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5leGNsdWRlRm9sZGVyc0ZpbGVzLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MuZXhjbHVkZUZvbGRlcnNGaWxlcy5kZXNjKVxuXHRcdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PlxuXHRcdFx0XHR0ZXh0XG5cdFx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkV4Y2x1ZGVGaWxlcylcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5FeGNsdWRlRmlsZXMgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHQpO1xuXHRcdFxuXHRcdGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogbG9jYWxlLmhlYWRlcnMuZXhwZXJpbWVudGFsRmVhdHVyZXMgfSk7XG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MuZml4TWFjT1NDb250ZXh0TWVudS5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLmZpeE1hY09TQ29udGV4dE1lbnUuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRml4TWFjT1NDb250ZXh0TWVudSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuRml4TWFjT1NDb250ZXh0TWVudSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MuZml4TWljcm9zb2Z0SU1FLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MuZml4TWljcm9zb2Z0SU1FLmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlRyeUZpeE1TSU1FKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5UcnlGaXhNU0lNRSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3Muc3RyaWN0TGluZUJyZWFrcy5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnN0cmljdExpbmVCcmVha3MuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRW50ZXJUd2ljZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuRW50ZXJUd2ljZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnB1bmNSZWN0aWZ5Lm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MucHVuY1JlY3RpZnkuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY1JlY3RpZnkpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLlB1bmNSZWN0aWZ5ID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5wcmludERlYnVnSW5mby5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnByaW50RGVidWdJbmZvLmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5kZWJ1ZyA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHR9XG5cblx0YnVpbGRVc2VyU2VsUmVwUnVsZVNldHRpbmcoY29udGFpbmVyRWw6IEhUTUxEZXRhaWxzRWxlbWVudCl7XG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICAgICAgY29udGFpbmVyRWwub250b2dnbGUgPSBhc3luYyAoKSA9PiB7XG5cdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyU2VsUnVsZVNldHRpbmdzT3BlbiA9IGNvbnRhaW5lckVsLm9wZW47XG5cdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgfTtcblx0XHRcblx0XHRjb25zdCBzdW1tYXJ5ID0gY29udGFpbmVyRWwuY3JlYXRlRWwoXCJzdW1tYXJ5XCIsIHtjbHM6IFwiZWFzeXR5cGluZy1uZXN0ZWQtc2V0dGluZ3NcIn0pO1xuXHRcdHN1bW1hcnkuc2V0VGV4dChsb2NhbGUuaGVhZGVycy5jdXN0b21pemVTZWxlY3Rpb25SdWxlKVxuXG4gICAgICAgIC8vIHN1bW1hcnkuc2V0SGVhZGluZygpLnNldE5hbWUoXCJVc2VyIGRlZmluZWQgU2VsZWN0aW9uIFJlcGxhY2UgUnVsZVwiKTtcbiAgICAgICAgLy8gc3VtbWFyeS5jcmVhdGVEaXYoXCJjb2xsYXBzZXJcIikuY3JlYXRlRGl2KFwiaGFuZGxlXCIpO1xuXG5cdFx0Y29uc3Qgc2VsZWN0aW9uUnVsZVNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCk7XG5cdFx0c2VsZWN0aW9uUnVsZVNldHRpbmdcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5zZWxlY3Rpb25SZXBsYWNlUnVsZS5uYW1lKVxuXHRcdFx0Ly8gLnNldERlc2MobG9jYWxlLnNldHRpbmdzLnNlbGVjdGlvblJlcGxhY2VSdWxlLmRlc2MpXG5cblx0XHRjb25zdCByZXBsYWNlUnVsZVRyaWdnZXIgPSBuZXcgVGV4dENvbXBvbmVudChzZWxlY3Rpb25SdWxlU2V0dGluZy5jb250cm9sRWwpO1xuXHRcdHJlcGxhY2VSdWxlVHJpZ2dlci5zZXRQbGFjZWhvbGRlcihsb2NhbGUucGxhY2VIb2xkZXIudHJpZ2dlclN5bWJvbCk7XG5cblx0XHRjb25zdCByZXBsYWNlTGVmdFN0cmluZyA9IG5ldyBUZXh0Q29tcG9uZW50KHNlbGVjdGlvblJ1bGVTZXR0aW5nLmNvbnRyb2xFbCk7XG5cdFx0cmVwbGFjZUxlZnRTdHJpbmcuc2V0UGxhY2Vob2xkZXIobG9jYWxlLnBsYWNlSG9sZGVyLm5ld0xlZnRTaWRlU3RyaW5nKTtcblxuXHRcdGNvbnN0IHJlcGxhY2VSaWdodFN0cmluZyA9IG5ldyBUZXh0Q29tcG9uZW50KHNlbGVjdGlvblJ1bGVTZXR0aW5nLmNvbnRyb2xFbCk7XG5cdFx0cmVwbGFjZVJpZ2h0U3RyaW5nLnNldFBsYWNlaG9sZGVyKGxvY2FsZS5wbGFjZUhvbGRlci5uZXdSaWdodFNpZGVTdHJpbmcpO1xuXG5cdFx0c2VsZWN0aW9uUnVsZVNldHRpbmdcblx0XHRcdC5hZGRCdXR0b24oKGJ1dHRvbikgPT4ge1xuXHRcdFx0XHRidXR0b25cblx0XHRcdFx0XHQuc2V0QnV0dG9uVGV4dChcIitcIilcblx0XHRcdFx0XHQuc2V0VG9vbHRpcChsb2NhbGUucGxhY2VIb2xkZXIuYWRkUnVsZSlcblx0XHRcdFx0XHQub25DbGljayhhc3luYyAoYnV0dG9uRWw6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IHRyaWdnZXIgPSByZXBsYWNlUnVsZVRyaWdnZXIuaW5wdXRFbC52YWx1ZTtcblx0XHRcdFx0XHRcdGxldCBsZWZ0ID0gcmVwbGFjZUxlZnRTdHJpbmcuaW5wdXRFbC52YWx1ZTtcblx0XHRcdFx0XHRcdGxldCByaWdodCA9IHJlcGxhY2VSaWdodFN0cmluZy5pbnB1dEVsLnZhbHVlO1xuXHRcdFx0XHRcdFx0aWYgKHRyaWdnZXIgJiYgKGxlZnQgfHwgcmlnaHQpKSB7XG5cdFx0XHRcdFx0XHRcdGlmKHRyaWdnZXIubGVuZ3RoIT0xICYmIHRyaWdnZXIhPVwiXHUyMDE0XHUyMDE0XCIgJiYgdHJpZ2dlciE9XCJcdTIwMjZcdTIwMjZcIil7XG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShsb2NhbGUucGxhY2VIb2xkZXIubm90aWNlSW52YWlkVHJpZ2dlcik7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLnBsdWdpbi5hZGRVc2VyU2VsZWN0aW9uUmVwUnVsZSh0cmlnZ2VyLCBsZWZ0LCByaWdodCkpe1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShzcHJpbnRmKGxvY2FsZS5wbGFjZUhvbGRlci5ub3RpY2VXYXJuVHJpZ2dlckV4aXN0cywgdHJpZ2dlcikpXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKGxvY2FsZS5wbGFjZUhvbGRlci5ub3RpY2VNaXNzaW5nSW5wdXQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBjb25zdCBzZWxSZXBSdWxlQ29udGFpbmVyID0gY29udGFpbmVyRWwuY3JlYXRlRWwoXCJkaXZcIik7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXIubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCB0cmlnZ2VyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVUcmlnZ2VyW2ldO1xuXHRcdFx0bGV0IGxlZnRfcyA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVmFsdWVbaV0ubGVmdDtcblx0XHRcdGxldCByaWdodF9zID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZVtpXS5yaWdodDtcblx0XHRcdGxldCBzaG93U3RyID0gXCJUcmlnZ2VyOiBcIiArIHRyaWdnZXIgKyBcIiBcdTIxOTIgXCIgKyBzaG93U3RyaW5nKGxlZnRfcykgKyBcInNlbGVjdGVkXCIgKyBzaG93U3RyaW5nKHJpZ2h0X3MpO1xuXHRcdFx0Ly8gY29uc3Qgc2V0dGluZ0l0ZW0gPSBzZWxSZXBSdWxlQ29udGFpbmVyLmNyZWF0ZUVsKFwiZGl2XCIpO1xuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHRcdC5zZXROYW1lKHNob3dTdHIpXG5cdFx0XHRcdC5hZGRFeHRyYUJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwiZ2VhclwiKVxuXHRcdFx0XHRcdFx0LnNldFRvb2x0aXAobG9jYWxlLnRvb2xUaXAuZWRpdFJ1bGUpXG5cdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG5ldyBTZWxlY3RSdWxlRWRpdE1vZGFsKHRoaXMuYXBwLCB0cmlnZ2VyLGxlZnRfcywgcmlnaHRfcywgYXN5bmMgKG5ld19sZWZ0LCBuZXdfcmlnaHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi51cGRhdGVVc2VyU2VsZWN0aW9uUmVwUnVsZShpLCBuZXdfbGVmdCwgbmV3X3JpZ2h0KTtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHRcdFx0fSkub3BlbigpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0fSlcblx0XHRcdFx0LmFkZEV4dHJhQnV0dG9uKGJ1dHRvbiA9PiB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEljb24oXCJ0cmFzaFwiKVxuXHRcdFx0XHRcdFx0LnNldFRvb2x0aXAobG9jYWxlLnRvb2xUaXAucmVtb3ZlUnVsZSlcblx0XHRcdFx0XHRcdC5vbkNsaWNrKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZGVsZXRlVXNlclNlbGVjdGlvblJlcFJ1bGUoaSk7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXG5cdH1cblxuXHRidWlsZFVzZXJEZWxldGVSdWxlU2V0dGluZyhjb250YWluZXJFbDogSFRNTERldGFpbHNFbGVtZW50KXtcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuICAgICAgICBjb250YWluZXJFbC5vbnRvZ2dsZSA9IGFzeW5jICgpID0+IHtcblx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJEZWxSdWxlU2V0dGluZ3NPcGVuID0gY29udGFpbmVyRWwub3Blbjtcblx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICB9O1xuXHRcdGNvbnN0IHN1bW1hcnkgPSBjb250YWluZXJFbC5jcmVhdGVFbChcInN1bW1hcnlcIiwge2NsczogXCJlYXN5dHlwaW5nLW5lc3RlZC1zZXR0aW5nc1wifSk7XG5cdFx0c3VtbWFyeS5zZXRUZXh0KGxvY2FsZS5oZWFkZXJzLmN1c3RvbWl6ZURlbGV0ZVJ1bGUpXG5cblx0XHRjb25zdCBkZWxldGVSdWxlU2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKTtcblx0XHRkZWxldGVSdWxlU2V0dGluZ1xuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLmRlbGV0ZVJ1bGUubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5kZWxldGVSdWxlLmRlc2MpXG5cblx0XHRjb25zdCBwYXR0ZXJuQmVmb3JlID0gbmV3IFRleHRBcmVhQ29tcG9uZW50KGRlbGV0ZVJ1bGVTZXR0aW5nLmNvbnRyb2xFbCk7XG5cdFx0cGF0dGVybkJlZm9yZS5zZXRQbGFjZWhvbGRlcihsb2NhbGUucGxhY2VIb2xkZXIuYmVmb3JlRGVsZXRlKTtcblxuXHRcdGNvbnN0IHBhdHRlcm5BZnRlciA9IG5ldyBUZXh0QXJlYUNvbXBvbmVudChkZWxldGVSdWxlU2V0dGluZy5jb250cm9sRWwpO1xuXHRcdHBhdHRlcm5BZnRlci5zZXRQbGFjZWhvbGRlcihsb2NhbGUucGxhY2VIb2xkZXIubmV3UGF0dGVybik7XG5cblx0XHRkZWxldGVSdWxlU2V0dGluZ1xuXHRcdFx0LmFkZEJ1dHRvbigoYnV0dG9uKSA9PiB7XG5cdFx0XHRcdGJ1dHRvblxuXHRcdFx0XHRcdC5zZXRCdXR0b25UZXh0KFwiK1wiKVxuXHRcdFx0XHRcdC5zZXRUb29sdGlwKGxvY2FsZS50b29sVGlwLmFkZFJ1bGUpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKGJ1dHRvbkVsOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGxldCBiZWZvcmUgPSBwYXR0ZXJuQmVmb3JlLmlucHV0RWwudmFsdWU7XG5cdFx0XHRcdFx0XHRsZXQgYWZ0ZXIgPSBwYXR0ZXJuQWZ0ZXIuaW5wdXRFbC52YWx1ZTtcblx0XHRcdFx0XHRcdGlmIChiZWZvcmUgJiYgYWZ0ZXIpIHtcblx0XHRcdFx0XHRcdFx0aWYoZmluZEZpcnN0UGlwZU5vdFByZWNlZGVkQnlCYWNrc2xhc2goYmVmb3JlKT09LTEpe1xuXHRcdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UobG9jYWxlLnBsYWNlSG9sZGVyLm5vdGljZUludmFpZFRyaWdnZXJQYXR0ZXJuQ29udGFpblN5bWJvbCk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uYWRkVXNlckRlbGV0ZVJ1bGUoYmVmb3JlLCBhZnRlcik7XG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKGxvY2FsZS5wbGFjZUhvbGRlci5ub3RpY2VNaXNzaW5nSW5wdXQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3QubGVuZ3RoOyBpKyspe1xuXHRcdFx0bGV0IGJlZm9yZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3RbaV1bMF07XG5cdFx0XHRsZXQgYWZ0ZXIgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyRGVsZXRlUnVsZXNTdHJMaXN0W2ldWzFdO1xuXHRcdFx0bGV0IHNob3dTdHIgPSBcIlxcXCJcIiArIHNob3dTdHJpbmcoYmVmb3JlKSArIFwiXFxcIiAgZGVsZXRlLmJhY2t3YXJkcyAgXHUyMTkyIFxcXCJcIisgc2hvd1N0cmluZyhhZnRlcikrXCJcXFwiXCI7IFxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHRcdC5zZXROYW1lKHNob3dTdHIpXG5cdFx0XHRcdC5hZGRFeHRyYUJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwiZ2VhclwiKVxuXHRcdFx0XHRcdFx0LnNldFRvb2x0aXAobG9jYWxlLnRvb2xUaXAuZWRpdFJ1bGUpXG5cdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG5ldyBFZGl0Q29udmVydFJ1bGVNb2RhbCh0aGlzLmFwcCwgUnVsZVR5cGUuZGVsZXRlLCBiZWZvcmUsIGFmdGVyLCBhc3luYyAobmV3X2JlZm9yZSwgbmV3X2FmdGVyKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4udXBkYXRlVXNlckRlbGV0ZVJ1bGUoaSwgbmV3X2JlZm9yZSwgbmV3X2FmdGVyKTtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHRcdFx0fSkub3BlbigpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0fSlcblx0XHRcdFx0LmFkZEV4dHJhQnV0dG9uKGJ1dHRvbiA9PiB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEljb24oXCJ0cmFzaFwiKVxuXHRcdFx0XHRcdFx0LnNldFRvb2x0aXAobG9jYWxlLnRvb2xUaXAucmVtb3ZlUnVsZSlcblx0XHRcdFx0XHRcdC5vbkNsaWNrKGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uZGVsZXRlVXNlckRlbGV0ZVJ1bGUoaSk7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHR9XG5cblx0YnVpbGRVc2VyQ29udmVydFJ1bGVTZXR0aW5nKGNvbnRhaW5lckVsOiBIVE1MRGV0YWlsc0VsZW1lbnQpe1xuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG4gICAgICAgIGNvbnRhaW5lckVsLm9udG9nZ2xlID0gYXN5bmMgKCkgPT4ge1xuXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckN2dFJ1bGVTZXR0aW5nc09wZW4gPSBjb250YWluZXJFbC5vcGVuO1xuXHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIH07XG5cdFx0Y29uc3Qgc3VtbWFyeSA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwic3VtbWFyeVwiLCB7Y2xzOiBcImVhc3l0eXBpbmctbmVzdGVkLXNldHRpbmdzXCJ9KTtcblx0XHRzdW1tYXJ5LnNldFRleHQobG9jYWxlLmhlYWRlcnMuY3VzdG9taXplQ29udmVydFJ1bGUpXG5cblx0XHRjb25zdCBjb252ZXJ0UnVsZVNldHRpbmcgPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCk7XG5cdFx0Y29udmVydFJ1bGVTZXR0aW5nXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MuY29udmVydFJ1bGUubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5jb252ZXJ0UnVsZS5kZXNjKVxuXG5cdFx0Y29uc3QgcGF0dGVybkJlZm9yZSA9IG5ldyBUZXh0QXJlYUNvbXBvbmVudChjb252ZXJ0UnVsZVNldHRpbmcuY29udHJvbEVsKTtcblx0XHRwYXR0ZXJuQmVmb3JlLnNldFBsYWNlaG9sZGVyKGxvY2FsZS5wbGFjZUhvbGRlci5iZWZvcmVDb252ZXJ0KTtcblxuXHRcdGNvbnN0IHBhdHRlcm5BZnRlciA9IG5ldyBUZXh0QXJlYUNvbXBvbmVudChjb252ZXJ0UnVsZVNldHRpbmcuY29udHJvbEVsKTtcblx0XHRwYXR0ZXJuQWZ0ZXIuc2V0UGxhY2Vob2xkZXIobG9jYWxlLnBsYWNlSG9sZGVyLm5ld1BhdHRlcm4pO1xuXG5cdFx0Y29udmVydFJ1bGVTZXR0aW5nXG5cdFx0XHQuYWRkQnV0dG9uKChidXR0b24pID0+IHtcblx0XHRcdFx0YnV0dG9uXG5cdFx0XHRcdFx0LnNldEJ1dHRvblRleHQoXCIrXCIpXG5cdFx0XHRcdFx0LnNldFRvb2x0aXAobG9jYWxlLnRvb2xUaXAuYWRkUnVsZSlcblx0XHRcdFx0XHQub25DbGljayhhc3luYyAoYnV0dG9uRWw6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IGJlZm9yZSA9IHBhdHRlcm5CZWZvcmUuaW5wdXRFbC52YWx1ZTtcblx0XHRcdFx0XHRcdGxldCBhZnRlciA9IHBhdHRlcm5BZnRlci5pbnB1dEVsLnZhbHVlO1xuXHRcdFx0XHRcdFx0aWYgKGJlZm9yZSAmJiBhZnRlcikge1xuXHRcdFx0XHRcdFx0XHRpZihmaW5kRmlyc3RQaXBlTm90UHJlY2VkZWRCeUJhY2tzbGFzaChiZWZvcmUpPT0tMSl7XG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShsb2NhbGUucGxhY2VIb2xkZXIubm90aWNlSW52YWlkVHJpZ2dlclBhdHRlcm5Db250YWluU3ltYm9sKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZXtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5hZGRVc2VyQ29udmVydFJ1bGUoYmVmb3JlLCBhZnRlcik7XG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKGxvY2FsZS5wbGFjZUhvbGRlci5ub3RpY2VNaXNzaW5nSW5wdXQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0Lmxlbmd0aDsgaSsrKXtcblx0XHRcdGxldCBiZWZvcmUgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyQ29udmVydFJ1bGVzU3RyTGlzdFtpXVswXTtcblx0XHRcdGxldCBhZnRlciA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0W2ldWzFdO1xuXHRcdFx0bGV0IHNob3dTdHIgPSBcIlxcXCJcIiArIHNob3dTdHJpbmcoYmVmb3JlKSArIFwiXFxcIiAgYXV0byBjb252ZXJ0IHRvIFxcXCJcIisgc2hvd1N0cmluZyhhZnRlcikrXCJcXFwiXCI7IFxuXHRcdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHRcdC5zZXROYW1lKHNob3dTdHIpXG5cdFx0XHRcdC5hZGRFeHRyYUJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwiZ2VhclwiKVxuXHRcdFx0XHRcdFx0LnNldFRvb2x0aXAobG9jYWxlLnRvb2xUaXAuZWRpdFJ1bGUpXG5cdFx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG5ldyBFZGl0Q29udmVydFJ1bGVNb2RhbCh0aGlzLmFwcCwgUnVsZVR5cGUuY29udmVydCwgYmVmb3JlLCBhZnRlciwgYXN5bmMgKG5ld19iZWZvcmUsIG5ld19hZnRlcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnVwZGF0ZVVzZXJDb252ZXJ0UnVsZShpLCBuZXdfYmVmb3JlLCBuZXdfYWZ0ZXIpO1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0XHR9KS5vcGVuKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuYWRkRXh0cmFCdXR0b24oYnV0dG9uID0+IHtcblx0XHRcdFx0XHRidXR0b24uc2V0SWNvbihcInRyYXNoXCIpXG5cdFx0XHRcdFx0XHQuc2V0VG9vbHRpcChsb2NhbGUudG9vbFRpcC5yZW1vdmVSdWxlKVxuXHRcdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5kZWxldGVVc2VyQ29udmVydFJ1bGUoaSk7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG59XG5cblxuZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhlbGVtZW50OiBhbnksIGF0dHJpYnV0ZXM6IGFueSkge1xuXHRmb3IgKGxldCBrZXkgaW4gYXR0cmlidXRlcykge1xuXHRcdGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgYXR0cmlidXRlc1trZXldKTtcblx0fVxufVxuXG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RSdWxlRWRpdE1vZGFsIGV4dGVuZHMgTW9kYWwge1xuXHR0cmlnZ2VyOiBzdHJpbmc7XG5cdG9sZF9sZWZ0OiBzdHJpbmc7XG5cdG9sZF9yaWdodDogc3RyaW5nO1xuXHRuZXdfbGVmdDogc3RyaW5nO1xuXHRuZXdfcmlnaHQ6IHN0cmluZztcblx0b25TdWJtaXQ6IChuZXdfbGVmdDogc3RyaW5nLCBuZXdfcmlnaHQ6c3RyaW5nKSA9PiB2b2lkO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCB0cmlnZ2VyOiBzdHJpbmcsIGxlZnQ6IHN0cmluZywgcmlnaHQ6IHN0cmluZywgb25TdWJtaXQ6IChuZXdfbGVmdDogc3RyaW5nLCBuZXdfcmlnaHQ6c3RyaW5nKSA9PiB2b2lkKSB7XG5cdFx0c3VwZXIoYXBwKTtcblx0XHR0aGlzLnRyaWdnZXIgPSB0cmlnZ2VyO1xuXHRcdHRoaXMub2xkX2xlZnQgPSBsZWZ0O1xuXHRcdHRoaXMub2xkX3JpZ2h0ID0gcmlnaHQ7XG5cdFx0dGhpcy5uZXdfbGVmdCA9IGxlZnQ7XG5cdFx0dGhpcy5uZXdfcmlnaHQgPSByaWdodDtcblxuXHRcdHRoaXMub25TdWJtaXQgPSBvblN1Ym1pdDtcblx0fVxuXG5cdG9uT3BlbigpIHtcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblxuXHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcImgxXCIsIHsgdGV4dDogbG9jYWxlLmhlYWRlcnMuZWRpdFNlbGVjdGlvblJlcGxhY2VSdWxlIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnRyaWdnZXIubmFtZSlcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB7XG5cdFx0XHRcdHRleHQuc2V0VmFsdWUodGhpcy50cmlnZ2VyKTtcblx0XHRcdFx0dGV4dC5zZXREaXNhYmxlZCh0cnVlKTtcblx0XHRcdH0pXG5cdFx0XG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLmxlZnQubmFtZSlcblx0XHRcdC5hZGRUZXh0QXJlYSgodGV4dCkgPT4ge1xuXHRcdFx0XHR0ZXh0LnNldFZhbHVlKHRoaXMub2xkX2xlZnQpO1xuXHRcdFx0XHR0ZXh0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubmV3X2xlZnQgPSB2YWx1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MucmlnaHQubmFtZSlcblx0XHRcdC5hZGRUZXh0QXJlYSgodGV4dCkgPT4ge1xuXHRcdFx0XHR0ZXh0LnNldFZhbHVlKHRoaXMub2xkX3JpZ2h0KTtcblx0XHRcdFx0dGV4dC5vbkNoYW5nZSgodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5ld19yaWdodCA9IHZhbHVlXG5cdFx0XHRcdH0pXG5cdFx0XHR9KTtcblxuXG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LmFkZEJ1dHRvbigoYnRuKSA9PlxuXHRcdFx0XHRidG5cblx0XHRcdFx0XHQuc2V0QnV0dG9uVGV4dChsb2NhbGUuYnV0dG9uLnVwZGF0ZSlcblx0XHRcdFx0XHQuc2V0Q3RhKClcblx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHR0aGlzLm9uU3VibWl0KHRoaXMubmV3X2xlZnQsIHRoaXMubmV3X3JpZ2h0KTtcblx0XHRcdFx0XHR9KSk7XG5cdH1cblxuXHRvbkNsb3NlKCkge1xuXHRcdGxldCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcblx0fVxufVxuXG5cblxuZXhwb3J0IGNsYXNzIEVkaXRDb252ZXJ0UnVsZU1vZGFsIGV4dGVuZHMgTW9kYWwge1xuXHR0eXBlOiBSdWxlVHlwZTtcblx0b2xkX2JlZm9yZTogc3RyaW5nO1xuXHRvbGRfYWZ0ZXI6IHN0cmluZztcblx0bmV3X2JlZm9yZTogc3RyaW5nO1xuXHRuZXdfYWZ0ZXI6IHN0cmluZztcblx0b25TdWJtaXQ6IChuZXdfYmVmb3JlOiBzdHJpbmcsIG5ld19hZnRlcjpzdHJpbmcpID0+IHZvaWQ7XG5cblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHR5cGU6IFJ1bGVUeXBlLCBiZWZvcmU6IHN0cmluZywgYWZ0ZXI6IHN0cmluZywgb25TdWJtaXQ6IChuZXdfYmVmb3JlOiBzdHJpbmcsIG5ld19hZnRlcjpzdHJpbmcpID0+IHZvaWQpIHtcblx0XHRzdXBlcihhcHApO1xuXHRcdHRoaXMudHlwZSA9IHR5cGU7XG5cdFx0dGhpcy5vbGRfYmVmb3JlID0gYmVmb3JlO1xuXHRcdHRoaXMub2xkX2FmdGVyID0gYWZ0ZXI7XG5cdFx0dGhpcy5uZXdfYmVmb3JlID0gYmVmb3JlO1xuXHRcdHRoaXMubmV3X2FmdGVyID0gYWZ0ZXI7XG5cblx0XHR0aGlzLm9uU3VibWl0ID0gb25TdWJtaXQ7XG5cdH1cblxuXHRvbk9wZW4oKSB7XG5cdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XG5cblx0XHRjb250ZW50RWwuY3JlYXRlRWwoXCJoMVwiLCB7IHRleHQ6IFwiRWRpdCBcIiArIHRoaXMudHlwZX0pO1xuXHRcdFxuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5vbGRQYXR0ZXJuLm5hbWUpXG5cdFx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+IHtcblx0XHRcdFx0dGV4dC5zZXRWYWx1ZSh0aGlzLm9sZF9iZWZvcmUpO1xuXHRcdFx0XHR0ZXh0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubmV3X2JlZm9yZSA9IHZhbHVlXG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5uZXdQYXR0ZXJuLm5hbWUpXG5cdFx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+IHtcblx0XHRcdFx0dGV4dC5zZXRWYWx1ZSh0aGlzLm9sZF9hZnRlcik7XG5cdFx0XHRcdHRleHQub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5uZXdfYWZ0ZXIgPSB2YWx1ZVxuXHRcdFx0XHR9KVxuXHRcdFx0fSk7XG5cblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5hZGRCdXR0b24oKGJ0bikgPT5cblx0XHRcdFx0YnRuXG5cdFx0XHRcdFx0LnNldEJ1dHRvblRleHQobG9jYWxlLmJ1dHRvbi51cGRhdGUpXG5cdFx0XHRcdFx0LnNldEN0YSgpXG5cdFx0XHRcdFx0Lm9uQ2xpY2soKCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuY2hlY2tDb252ZXJ0UGF0dGVyblN0cmluZyh0aGlzLm5ld19iZWZvcmUsIHRoaXMubmV3X2FmdGVyKSlcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm9uU3VibWl0KHRoaXMubmV3X2JlZm9yZSwgdGhpcy5uZXdfYWZ0ZXIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZXtcblx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShsb2NhbGUucGxhY2VIb2xkZXIubm90aWNlSW52YWxpZFBhdHRlcm5TdHJpbmcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0fSkpO1xuXHR9XG5cblx0Y2hlY2tDb252ZXJ0UGF0dGVyblN0cmluZyhiZWZvcmU6IHN0cmluZywgYWZ0ZXI6c3RyaW5nKTpib29sZWFue1xuXHRcdGlmKGZpbmRGaXJzdFBpcGVOb3RQcmVjZWRlZEJ5QmFja3NsYXNoKGJlZm9yZSk9PS0xKSByZXR1cm4gZmFsc2U7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRvbkNsb3NlKCkge1xuXHRcdGxldCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcblx0fVxufVxuXG4iLCAiY29uc3QgbG9jYWxlID0ge1xuICAgIHNldHRpbmdzOiB7XG4gICAgICAgIHN5bWJvbEF1dG9QYWlyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN5bWJvbCBhdXRvIHBhaXIgYW5kIGRlbGV0ZSB3aXRoIHBhaXJcIixcbiAgICAgICAgICAgIGRlc2M6IFwiQWRkIGF1dG8tcGFpcmluZyBhbmQgYXV0by1kZWxldGlvbiBmb3IgdmFyaW91cyBzeW1ib2xzIHN1Y2ggYXMgXHUzMDBBXHUzMDBCLCBcdTIwMUNcdTIwMUQsIFx1MzAwQ1x1MzAwRCwgXHUzMDBFXHUzMDBGLCBcdTMwMTBcdTMwMTEsIGV0Yy5cIlxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25SZXBsYWNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlNlbGVjdGlvbiBSZXBsYWNlIEVuaGFuY2VtZW50XCIsXG4gICAgICAgICAgICBkZXNjOiBcIkVuaGFuY2VkIGVkaXRpbmcgZm9yIHNlbGVjdGVkIHRleHQsIGUuZy4sIHByZXNzaW5nIFx1RkZFNSBcdTIxOTIgJHNlbGVjdGVkIHRleHQkLCBwcmVzc2luZyBcdTAwQjcgXHUyMTkyIGBzZWxlY3RlZCB0ZXh0YCwgXHUzMDBBIFx1MjE5MiBcdTMwMEFzZWxlY3RlZCB0ZXh0XHUzMDBCLCBldGMuXCJcbiAgICAgICAgfSxcbiAgICAgICAgZnVsbFdpZHRoVG9IYWxmV2lkdGg6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiQ29udmVydCBzdWNjZXNzaXZlIGZ1bGwgd2lkdGggc3ltYm9sIHRvIGhhbGYgd2lkdGggc3ltYm9sXCIsXG4gICAgICAgICAgICBkZXNjOiBcIkNvbnZlcnQgY29uc2VjdXRpdmUgZnVsbC13aWR0aCBzeW1ib2xzIHRvIGhhbGYtd2lkdGgsIGUuZy4sIFx1MzAwMlx1MzAwMlx1MjE5MiAuLCBcdUZGMDFcdUZGMDFcdTIxOTIgISwgXHUzMDBCXHUzMDBCXHUyMTkyID5cIlxuICAgICAgICB9LFxuICAgICAgICBiYXNpY0lucHV0RW5oYW5jZToge1xuICAgICAgICAgICAgbmFtZTogXCJCYXNpYyBzeW1ib2wgaW5wdXQgZW5oYW5jZSBmb3IgT2JzaWRpYW5cIixcbiAgICAgICAgICAgIGRlc2M6IFwiQmFzaWMgaW5wdXQgZW5oYW5jZW1lbnQgZm9yIE9ic2lkaWFuLCBlLmcuLCBcdTMwMTBcdTMwMTB8IFx1MjE5MiBbW3xdXSwgc3RhcnRpbmcgd2l0aCBcdTMwMDFcdTIxOTIgLywgc3RhcnRpbmcgd2l0aCBcdTMwMEJcdTIxOTIgPiwgXHUwMEI3XHUwMEI3fCBcdTIxOTIgYHxgLCBgXHUwMEI3fGAgYmVjb21lcyBjb2RlIGJsb2NrLCBcdUZGRTVcdUZGRTV8IFx1MjE5MiAkfCRcIlxuICAgICAgICB9LFxuICAgICAgICBjb2RlYmxvY2tFZGl0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIkVuaGFuY2UgY29kZWJsb2NrIGVkaXRcIixcbiAgICAgICAgICAgIGRlc2M6IFwiSW1wcm92ZSBlZGl0aW5nIGluIGNvZGVibG9ja3MgKFRhYiwgZGVsZXRlLCBwYXN0ZSwgQ21kL0N0cmwrQSBzZWxlY3QpLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHRhYk91dDoge1xuICAgICAgICAgICAgbmFtZTogXCJUYWJvdXRcIixcbiAgICAgICAgICAgIGRlc2M6IFwiVGFiIG91dCBvZiBpbmxpbmUgY29kZSBvciBwYWlyZWQgc3ltYm9scyAod2hlbiBzZWxlY3RlZCkuXCJcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b0Zvcm1hdHRpbmc6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiQXV0byBmb3JtYXR0aW5nIHdoZW4gdHlwaW5nXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlRvZ2dsZSBhdXRvLWZvcm1hdHRpbmcgb2YgdGV4dCB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudC5cIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZUJldHdlZW5DaGluZXNlRW5nbGlzaDoge1xuICAgICAgICAgICAgbmFtZTogXCJTcGFjZSBiZXR3ZWVuIENoaW5lc2UgYW5kIEVuZ2xpc2hcIixcbiAgICAgICAgICAgIGRlc2M6IFwiSW5zZXJ0IHNwYWNlIGJldHdlZW4gQ2hpbmVzZSBhbmQgRW5nbGlzaCBjaGFyYWN0ZXJzLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkNoaW5lc2VOdW1iZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3BhY2UgYmV0d2VlbiBDaGluZXNlIGFuZCBOdW1iZXJcIixcbiAgICAgICAgICAgIGRlc2M6IFwiSW5zZXJ0IHNwYWNlIGJldHdlZW4gQ2hpbmVzZSBjaGFyYWN0ZXJzIGFuZCBudW1iZXJzLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkVuZ2xpc2hOdW1iZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3BhY2UgYmV0d2VlbiBFbmdsaXNoIGFuZCBOdW1iZXJcIixcbiAgICAgICAgICAgIGRlc2M6IFwiSW5zZXJ0IHNwYWNlIGJldHdlZW4gRW5nbGlzaCBjaGFyYWN0ZXJzIGFuZCBudW1iZXJzLlwiXG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVNwYWNlQmV0d2VlbkNoaW5lc2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGVsZXRlIHRoZSBTcGFjZSBiZXR3ZWVuIENoaW5lc2UgY2hhcmFjdGVyc1wiLFxuICAgICAgICAgICAgZGVzYzogXCJSZW1vdmUgc3BhY2VzIGJldHdlZW4gQ2hpbmVzZSBjaGFyYWN0ZXJzLlwiXG4gICAgICAgIH0sXG4gICAgICAgIGNhcGl0YWxpemVGaXJzdExldHRlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZXZlcnkgc2VudGVuY2VcIixcbiAgICAgICAgICAgIGRlc2M6IFwiQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggc2VudGVuY2UgaW4gRW5nbGlzaC5cIlxuICAgICAgICB9LFxuICAgICAgICBzbWFydEluc2VydFNwYWNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlNtYXJ0bHkgaW5zZXJ0IHNwYWNlIGJldHdlZW4gdGV4dCBhbmQgcHVuY3R1YXRpb25cIixcbiAgICAgICAgICAgIGRlc2M6IFwiSW5zZXJ0IHNwYWNlIGJldHdlZW4gdGV4dCBhbmQgcHVuY3R1YXRpb24gaW50ZWxsaWdlbnRseS5cIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZVN0cmF0ZWd5SW5saW5lQ29kZToge1xuICAgICAgICAgICAgbmFtZTogXCJTcGFjZSBzdHJhdGVneSBiZXR3ZWVuIGlubGluZSBjb2RlIGFuZCB0ZXh0XCIsXG4gICAgICAgICAgICBkZXNjOiBcIk5vIHJlcXVpcmVtZW50OiBObyBzcGFjZSByZXF1aXJlbWVudCBiZXR3ZWVuIHRoaXMgY2F0ZWdvcnkgYmxvY2sgYW5kIHRoZSBzdXJyb3VuZGluZyB0ZXh0LiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJTb2Z0IHNwYWNlOiBPbmx5IHJlcXVpcmVzIGEgc29mdCBzcGFjZSBiZXR3ZWVuIHRoaXMgY2F0ZWdvcnkgYmxvY2sgYW5kIHRoZSBzdXJyb3VuZGluZyBibG9ja3MuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcIlNvZnQgc3BhY2UgZXhhbXBsZTogSWYgdGhlIGFkamFjZW50IHRleHQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgY3VycmVudCBibG9jayBpcyBmdWxsLXdpZHRoIHB1bmN0dWF0aW9uIGxpa2UgLiAsIDsgPyBldGMuLCBhbmQgdGhlIGFkamFjZW50IHRleHQgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgaXMgYWxsIGZ1bGwtd2lkdGggb3IgaGFsZi13aWR0aCBwdW5jdHVhdGlvbi4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiU3RyaWN0IHNwYWNlOiBTdHJpY3RseSBhZGQgc3BhY2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHRoZSBhZGphY2VudCB0ZXh0LlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlU3RyYXRlZ3lJbmxpbmVGb3JtdWxhOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlNwYWNlIHN0cmF0ZWd5IGJldHdlZW4gaW5saW5lIGZvcm11bGEgYW5kIHRleHRcIixcbiAgICAgICAgICAgIGRlc2M6IFwiRGVmaW5lIHRoZSBzcGFjaW5nIHN0cmF0ZWd5IGJldHdlZW4gaW5saW5lIGZvcm11bGFzIGFuZCB0ZXh0LlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlU3RyYXRlZ3lMaW5rVGV4dDoge1xuICAgICAgICAgICAgbmFtZTogXCJTcGFjZSBzdHJhdGVneSBiZXR3ZWVuIGxpbmsgYW5kIHRleHRcIixcbiAgICAgICAgICAgIGRlc2M6IFwiRGVmaW5lIHRoZSBzcGFjaW5nIHN0cmF0ZWd5IGJldHdlZW4gW1t3aWtpbGlua11dIFttZGxpbmtdKC4uLikgYW5kIHRleHQuXCJcbiAgICAgICAgfSxcbiAgICAgICAgdXNlckRlZmluZWRSZWdleHBTd2l0Y2g6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiVXNlciBEZWZpbmVkIFJlZ0V4cCBTd2l0Y2hcIixcbiAgICAgICAgICAgIGRlc2M6IFwiVG9nZ2xlIGN1c3RvbSByZWd1bGFyIGV4cHJlc3Npb25zLCBwcmV2ZW50aW5nIGZvcm1hdHRpbmcgYW5kIHNldHRpbmcgc3BhY2Ugc3RyYXRlZ3kgYmV0d2VlbiBtYXRjaGVkIGNvbnRlbnQgYW5kIG90aGVyIHRleHQuXCJcbiAgICAgICAgfSxcbiAgICAgICAgdXNlckRlZmluZWRSZWdleHA6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiVXNlci1kZWZpbmVkIFJlZ3VsYXIgRXhwcmVzc2lvbiwgb25lIGV4cHJlc3Npb24gcGVyIGxpbmVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiVXNlci1kZWZpbmVkIHJlZ3VsYXIgZXhwcmVzc2lvbiwgbWF0Y2hlZCB0byB0aGUgY29udGVudCBpcyBub3QgZm9ybWF0dGVkLCBvbmUgZXhwcmVzc2lvbiBwZXIgbGluZSwgZG8gbm90IGZlZWwgZnJlZSB0byBhZGQgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuXCIrXG4gICAgICAgICAgICAgICAgXCJUaGUgZW5kIG9mIGVhY2ggbGluZSBvZiB0aHJlZSBjaGFyYWN0ZXJzIGZpeGVkIGFzIHwgYW5kIHR3byBzcGFjZSBzdHJhdGVneSBzeW1ib2xzLCBzcGFjZSBzdHJhdGVneSBzeW1ib2xzIGZvciAtID0gKywgcmVzcGVjdGl2ZWx5LCBvbiBiZWhhbGYgb2Ygbm90IHJlcXVpcmluZyBzcGFjZXMgKC0pLCBzb2Z0IHNwYWNlcyAoPSksIHN0cmljdCBzcGFjZXMgKCspLlwiK1xuICAgICAgICAgICAgICAgIFwiVGhlc2UgdHdvIHNwYWNlIHN0cmF0ZWd5IHN5bWJvbHMgYXJlIHRoZSBzcGFjZSBzdHJhdGVneSBmb3IgdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIG9mIHRoZSBtYXRjaGluZyBibG9jayByZXNwZWN0aXZlbHlcIlxuICAgICAgICB9LFxuICAgICAgICBleGNsdWRlRm9sZGVyc0ZpbGVzOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkV4Y2x1ZGUgRm9sZGVycy9GaWxlc1wiLFxuICAgICAgICAgICAgZGVzYzogXCJUaGlzIHBsdWdpbiB3aWxsIHBhcnNlIGVhY2ggbGluZSBhcyBhbiBleGNsdWRlIGZvbGRlciBvciBmaWxlLiBGb3IgZXhhbXBsZTogRGFpbHlOb3RlLywgRGFpbHlOb3RlL1dlZWtOb3Rlcy8sIERhaWx5Tm90ZS90ZXN0Lm1kXCJcbiAgICAgICAgfSxcbiAgICAgICAgZml4TWFjT1NDb250ZXh0TWVudToge1xuICAgICAgICAgICAgbmFtZTogXCJGaXggTWFjT1MgY29udGV4dC1tZW51IGN1cnNvciBwb3NpdGlvbiAoTmVlZCB0byByZXN0YXJ0IE9ic2lkaWFuKVwiLFxuICAgICAgICAgICAgZGVzYzogXCJGaXggdGhlIGlzc3VlIHdoZXJlIHRoZSBjdXJzb3IganVtcHMgdG8gdGhlIG5leHQgbGluZSB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgaW52b2tlZCBvbiBNYWNPUyAocmVxdWlyZXMgcmVzdGFydGluZyBPYnNpZGlhbikuXCJcbiAgICAgICAgfSxcbiAgICAgICAgZml4TWljcm9zb2Z0SU1FOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkZpeCBNaWNyb3NvZnQgSW5wdXQgTWV0aG9kIElzc3VlXCIsXG4gICAgICAgICAgICBkZXNjOiBcIkFkYXB0IGZvciBvbGRlciB2ZXJzaW9ucyBvZiBNaWNyb3NvZnQgSW5wdXQgTWV0aG9kLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHN0cmljdExpbmVCcmVha3M6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaWN0IExpbmUgYnJlYWtzIE1vZGUgRW50ZXIgVHdpY2VcIixcbiAgICAgICAgICAgIGRlc2M6IFwiSW4gc3RyaWN0IGxpbmUgYnJlYWtzIG1vZGUsIHByZXNzaW5nIEVudGVyIG9uY2UgaW4gbm9ybWFsIHRleHQgbGluZXMgd2lsbCBwcm9kdWNlIHR3byBsaW5lIGJyZWFrcy5cIlxuICAgICAgICB9LFxuICAgICAgICBwdW5jUmVjdGlmeToge1xuICAgICAgICAgICAgbmFtZTogXCJQdW5jIHJlY3RpZnlcIixcbiAgICAgICAgICAgIGRlc2M6IFwiQXV0b21hdGljYWxseSBjb252ZXJ0IEVuZ2xpc2ggcHVuY3R1YXRpb24gKCwgLiA/ICEpIGJldHdlZW4gQ2hpbmVzZSBjaGFyYWN0ZXJzIHRvIGZ1bGwtd2lkdGggcHVuY3R1YXRpb24gZHVyaW5nIHR5cGluZyAocmV2ZXJzaWJsZSkuXCJcbiAgICAgICAgfSxcbiAgICAgICAgcHJpbnREZWJ1Z0luZm86IHtcbiAgICAgICAgICAgIG5hbWU6IFwiUHJpbnQgZGVidWcgaW5mbyBpbiBjb25zb2xlXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlByaW50IGRlYnVnIGluZm9ybWF0aW9uIGluIHRoZSBjb25zb2xlLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvblJlcGxhY2VSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlNlbGVjdGlvbiBSZXBsYWNlIFJ1bGVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiVXNlciBkZWZpbmVkIFNlbGVjdGlvbiBSZXBsYWNlIFJ1bGVcIlxuICAgICAgICB9LFxuICAgICAgICBkZWxldGVSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkRlbGV0ZSBSdWxlXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlJ1bGU6IFVzZSB8IHRvIGluZGljYXRlIHRoZSBjdXJzb3IgcG9zaXRpb24uIFRpcHM6IFVzaW5nIHwgdG8gaW5kaWNhdGUgdGhlIGN1cnNvciBwb3NpdGlvbi5cIlxuICAgICAgICB9LFxuICAgICAgICBjb252ZXJ0UnVsZToge1xuICAgICAgICAgICAgbmFtZTogXCJDb252ZXJ0IFJ1bGVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiUnVsZTogVXNlIHwgdG8gaW5kaWNhdGUgdGhlIGN1cnNvciBwb3NpdGlvbi4gVGlwczogVXNpbmcgfCB0byBpbmRpY2F0ZSB0aGUgY3Vyc29yIHBvc2l0aW9uLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHRyaWdnZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiVHJpZ2dlclwiXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTGVmdFwiXG4gICAgICAgIH0sXG4gICAgICAgIHJpZ2h0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlJpZ2h0XCJcbiAgICAgICAgfSxcbiAgICAgICAgb2xkUGF0dGVybjoge1xuICAgICAgICAgICAgbmFtZTogXCJPbGQgUGF0dGVyblwiXG4gICAgICAgIH0sXG4gICAgICAgIG5ld1BhdHRlcm46IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTmV3IFBhdHRlcm5cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIG1haW46IFwiT2JzaWRpYW4gRWFzeVR5cGluZyBQbHVnaW5cIixcbiAgICAgICAgZ2l0aHViRGV0YWlsOiBcIk1vcmUgZGV0YWlsIGlzIGluIEdpdGh1YjogXCIsXG4gICAgICAgIGVuaGFuY2VkRWRpdGluZzogXCJFbmhhbmNlZCBFZGl0aW5nIFNldHRpbmdcIixcbiAgICAgICAgY3VzdG9taXplRWRpdFJ1bGU6IFwiQ3VzdG9taXplIEVkaXQgQ29udmVydGlvbiBSdWxlXCIsXG4gICAgICAgIGF1dG9mb3JtYXRTZXR0aW5nOiBcIkF1dG9mb3JtYXQgU2V0dGluZ1wiLFxuICAgICAgICBkZXRhaWxlZFNldHRpbmc6IFwiRGV0YWlsZWQgU2V0dGluZyBCZWxvd1wiLFxuICAgICAgICBjdXN0b21SZWdleHBCbG9jazogXCJDdXN0b20gcmVndWxhciBleHByZXNzaW9ucyBibG9ja1wiLFxuICAgICAgICBleGNsdWRlRm9sZGVyc0ZpbGVzOiBcIkV4Y2x1ZGUgRm9sZGVycy9GaWxlc1wiLFxuICAgICAgICBleHBlcmltZW50YWxGZWF0dXJlczogXCJFeHBlcmltZW50YWwgRmVhdHVyZXNcIixcbiAgICAgICAgYWJvdXRSZWdleHA6IHtcbiAgICAgICAgICAgIGhlYWRlcjogXCJGb3Iga25vd2xlZGdlIGFib3V0IHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHNlZSBcIixcbiAgICAgICAgICAgIHRleHQ6IFwiWWlmZW5nIE5ndXllbjogQSBDb25jaXNlIFR1dG9yaWFsIG9uIFJlZ3VsYXIgRXhwcmVzc2lvbnNcIixcbiAgICAgICAgfSxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zUmVnZXhwOiB7XG4gICAgICAgICAgICBoZWFkZXI6IFwiSW5zdHJ1Y3Rpb25zIGFuZCBleGFtcGxlcyBmb3IgdXNpbmcgcmVndWxhciBleHByZXNzaW9uIHJ1bGVzOiBcIixcbiAgICAgICAgICAgIHRleHQ6XCJDdXN0b21pemluZyBSZWd1bGFyIEV4cHJlc3Npb24gUnVsZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9taXplU2VsZWN0aW9uUnVsZTogXCJDdXN0b21pemUgU2VsZWN0aW9uIFJlcGxhY2UgUnVsZVwiLFxuICAgICAgICBjdXN0b21pemVEZWxldGVSdWxlOiBcIkN1c3RvbWl6ZSBEZWxldGUgUnVsZVwiLFxuICAgICAgICBjdXN0b21pemVDb252ZXJ0UnVsZTogXCJDdXN0b21pemUgQ29udmVydCBSdWxlXCIsXG4gICAgICAgIGVkaXRTZWxlY3Rpb25SZXBsYWNlUnVsZTogXCJFZGl0IFNlbGVjdGlvbiBSZXBsYWNlIFJ1bGVcIixcbiAgICB9LFxuICAgIGRyb3Bkb3duT3B0aW9uczoge1xuICAgICAgICBvbmx5V2hlblR5cGluZzogXCJPbmx5IFdoZW4gVHlwaW5nXCIsXG4gICAgICAgIGdsb2JhbGx5OiBcIldvcmsgR2xvYmFsbHlcIixcbiAgICAgICAgbm9SZXF1aXJlOiBcIk5vIFJlcXVpcmVcIixcbiAgICAgICAgc29mdFNwYWNlOiBcIlNvZnQgU3BhY2VcIixcbiAgICAgICAgc3RyaWN0U3BhY2U6IFwiU3RyaWN0IFNwYWNlXCIsXG4gICAgICAgIGR1bW15OiBcIkR1bW15XCIsXG4gICAgICAgIHNtYXJ0OiBcIlNtYXJ0XCJcbiAgICB9LFxuICAgIHRvb2xUaXA6IHtcbiAgICAgICAgc3dpdGNoOiBcIlN3aXRjaFwiLFxuICAgICAgICBlZGl0UnVsZTogXCJFZGl0IHJ1bGVcIixcbiAgICAgICAgcmVtb3ZlUnVsZTogXCJSZW1vdmUgcnVsZVwiLFxuICAgICAgICBhZGRSdWxlOiBcIkFkZCBSdWxlXCIsXG4gICAgfSxcbiAgICBwbGFjZUhvbGRlcjoge1xuICAgICAgICB0cmlnZ2VyU3ltYm9sOiBcIlRyaWdnZXIgU3ltYm9sXCIsXG4gICAgICAgIG5ld0xlZnRTaWRlU3RyaW5nOiBcIk5ldyBMZWZ0IFNpZGUgU3RyaW5nXCIsXG4gICAgICAgIG5ld1JpZ2h0U2lkZVN0cmluZzogXCJOZXcgUmlnaHQgU2lkZSBTdHJpbmdcIixcbiAgICAgICAgYWRkUnVsZTogXCJBZGQgUnVsZVwiLFxuICAgICAgICBub3RpY2VJbnZhaWRUcmlnZ2VyOiBcIklubHZhbGlkIHRyaWdnZXIsIHRyaWdnZXIgbXVzdCBiZSBhIHN5bWJvbCBvZiBsZW5ndGggMSBvciBzeW1ib2wgXHUyMDE0XHUyMDE0LCBcdTIwMjZcdTIwMjZcIixcbiAgICAgICAgbm90aWNlV2FyblRyaWdnZXJFeGlzdHM6IFwid2FybmluZyEgVHJpZ2dlciAlcyBpcyBhbHJlYWR5IGV4aXN0IVwiLFxuICAgICAgICBub3RpY2VNaXNzaW5nSW5wdXQ6IFwibWlzc2luZyBpbnB1dFwiLFxuICAgICAgICBiZWZvcmVEZWxldGU6IFwiQmVmb3JlIERlbGV0ZVwiLFxuXHRcdG5ld1BhdHRlcm46IFwiTmV3IFBhdHRlcm5cIixcbiAgICAgICAgbm90aWNlSW52YWlkVHJpZ2dlclBhdHRlcm5Db250YWluU3ltYm9sOiBcIklubHZhbGlkIHRyaWdnZXIsIHBhdHRlcm4gbXVzdCBjb250YWluIHN5bWJvbCBcXHwgd2hpY2ggaW5kaWNhdGUgY3Vyc29yIHBvc2l0aW9uXCIsXG4gICAgICAgIGJlZm9yZUNvbnZlcnQ6IFwiQmVmb3JlIENvbnZlcnRcIixcbiAgICAgICAgbm90aWNlSW52YWxpZFBhdHRlcm5TdHJpbmc6XCJJbnZhbGlkIHBhdHRlcm4gc3RyaW5nIVwiLFxuICAgIH0sXG4gICAgYnV0dG9uOiB7XG4gICAgICAgIHVwZGF0ZTogXCJVcGRhdGVcIixcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7XG4iLCAiaW1wb3J0IHsgZW5VUyB9IGZyb20gXCIuXCI7XG5cbmNvbnN0IGxvY2FsZTogdHlwZW9mIGVuVVMgPSB7XG4gICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc3ltYm9sQXV0b1BhaXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU3QjI2XHU1M0Y3XHU4MUVBXHU1MkE4XHU5MTREXHU1QkY5XHU1M0NBXHU1MjIwXHU5NjY0XHU5MTREXHU1QkY5XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTg5RVx1NTJBMFx1NTkxQVx1NzlDRFx1N0IyNlx1NTNGN1x1OTE0RFx1NUJGOVx1OEY5M1x1NTE2NVx1RkYwQ1x1OTE0RFx1NUJGOVx1NTIyMFx1OTY2NFx1RkYwQ1x1NTk4Mlx1MzAwQVx1MzAwQiwgXHUyMDFDXHUyMDFELCBcdTMwMENcdTMwMEQsIFx1MzAwRVx1MzAwRiwgXHUzMDEwXHUzMDExXHU3QjQ5XCJcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uUmVwbGFjZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTkwMDlcdTRFMkRcdTY1ODdcdTY3MkNcdTY2RkZcdTYzNjJcdTU4OUVcdTVGM0FcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU5MDA5XHU0RTJEXHU2NTg3XHU2NzJDXHU2MEM1XHU1MUI1XHU0RTBCXHU3Njg0XHU3RjE2XHU4RjkxXHU1ODlFXHU1RjNBXHVGRjBDXHU2MzA5XHVGRkU1XHUyMTkyJFx1OTAwOVx1NEUyRFx1NzY4NFx1NjU4N1x1NjcyQyQsIFx1NjMwOVx1MDBCN1x1MjE5MmBcdTkwMDlcdTRFMkRcdTc2ODRcdTY1ODdcdTY3MkNgXHVGRjBDXHUzMDBBIFx1MjE5MiBcdTMwMEFcdTkwMDlcdTRFMkRcdTc2ODRcdTY1ODdcdTY3MkNcdTMwMEJcdTdCNDlcdTdCNDlcIlxuICAgICAgICB9LFxuICAgICAgICBmdWxsV2lkdGhUb0hhbGZXaWR0aDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdThGREVcdTdFRURcdThGOTNcdTUxNjVcdTUxNjhcdTg5RDJcdTdCMjZcdTUzRjdcdThGNkNcdTUzNEFcdTg5RDJcdTdCMjZcdTUzRjdcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU4RkRFXHU3RUVEXHU4RjkzXHU1MTY1XHU1MTY4XHU4OUQyXHU3QjI2XHU1M0Y3XHU4RjZDXHU1MzRBXHU4OUQyXHVGRjBDXHUzMDAyXHUzMDAyXHUyMTkyIC5cdUZGMENcdUZGMDFcdUZGMDFcdTIxOTIgIVx1RkYwQyBcdTMwMEJcdTMwMEJcdTIxOTIgPlwiXG4gICAgICAgIH0sXG4gICAgICAgIGJhc2ljSW5wdXRFbmhhbmNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk9ic2lkaWFuIFx1NzY4NFx1NTdGQVx1Nzg0MFx1N0IyNlx1NTNGN1x1OEY5M1x1NTE2NVx1NTg5RVx1NUYzQVwiLFxuICAgICAgICAgICAgZGVzYzogXCJPYnNpZGlhbiBcdTc2ODRcdTU3RkFcdTc4NDBcdThGOTNcdTUxNjVcdTU4OUVcdTVGM0FcdUZGMENcdTU5ODJcdTMwMTBcdTMwMTB8IFx1MjE5MiBbW3xdXVx1RkYwQ1x1NTNFNVx1OTk5Nlx1NzY4NFx1MzAwMVx1MjE5MiAvXHVGRjBDXHU1M0U1XHU5OTk2XHU3Njg0XHUzMDBCXHUyMTkyID5cdUZGMENcdTAwQjdcdTAwQjd8IFx1MjE5MiBgfGBcdUZGMEMgYFx1MDBCN3xgIFx1NTNEOFx1NjIxMFx1NEVFM1x1NzgwMVx1NTc1N1x1RkYwQ1x1RkZFNVx1RkZFNXwgXHUyMTkyICR8JFwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVibG9ja0VkaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1ODlFXHU1RjNBXHU0RUUzXHU3ODAxXHU1NzU3XHU3RjE2XHU4RjkxXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTg5RVx1NUYzQVx1NEVFM1x1NzgwMVx1NTc1N1x1NTE4NVx1NzY4NFx1N0YxNlx1OEY5MVx1RkYwOENtZC9DdHJsK0EgXHU5MDA5XHU0RTJEXHUzMDAxVGFiXHUzMDAxXHU1MjIwXHU5NjY0XHUzMDAxXHU3Qzk4XHU4RDM0XHVGRjA5XCJcbiAgICAgICAgfSxcbiAgICAgICAgdGFiT3V0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OERGM1x1NTFGQVx1NEVFM1x1NzgwMVx1NTc1N1wiLFxuICAgICAgICAgICAgZGVzYzogXCJUYWIgXHU4REYzXHU1MUZBXHU4ODRDXHU1MTg1XHU0RUUzXHU3ODAxXHU1NzU3XHU2MjE2XHU5MTREXHU1QkY5XHU3QjI2XHU1M0Y3XHU1NzU3KFx1OTAwOVx1NEUyRFx1NjVGNilcIlxuICAgICAgICB9LFxuICAgICAgICBhdXRvRm9ybWF0dGluZzoge1xuICAgICAgICAgICAgbmFtZTogXCJcdThGOTNcdTUxNjVcdTY1RjZcdTgxRUFcdTUyQThcdTY4M0NcdTVGMEZcdTUzMTZcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU2NjJGXHU1NDI2XHU1NzI4XHU3RjE2XHU4RjkxXHU2NTg3XHU2ODYzXHU2NUY2XHU4MUVBXHU1MkE4XHU2ODNDXHU1RjBGXHU1MzE2XHU2NTg3XHU2NzJDXHVGRjBDXHU4MUVBXHU1MkE4XHU2ODNDXHU1RjBGXHU1MzE2XHU3Njg0XHU2MDNCXHU1RjAwXHU1MTczXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VCZXR3ZWVuQ2hpbmVzZUVuZ2xpc2g6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU0RTJEXHU2NTg3XHU0RTBFXHU4MkYxXHU2NTg3XHU0RTRCXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTcyOFx1NEUyRFx1NjU4N1x1NTQ4Q1x1ODJGMVx1NjU4N1x1NEU0Qlx1OTVGNFx1NjNEMlx1NTE2NVx1N0E3QVx1NjgzQ1x1RkYwQ1x1NTNFRlx1NjRBNFx1OTUwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkNoaW5lc2VOdW1iZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU0RTJEXHU2NTg3XHU0RTBFXHU2NTcwXHU1QjU3XHU0RTRCXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTcyOFx1NEUyRFx1NjU4N1x1NTQ4Q1x1NjU3MFx1NUI1N1x1NEU0Qlx1OTVGNFx1NjNEMlx1NTE2NVx1N0E3QVx1NjgzQ1x1RkYwQ1x1NTNFRlx1NjRBNFx1OTUwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkVuZ2xpc2hOdW1iZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU4MkYxXHU2NTg3XHU0RTBFXHU2NTcwXHU1QjU3XHU0RTRCXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTcyOFx1ODJGMVx1NjU4N1x1NTQ4Q1x1NjU3MFx1NUI1N1x1NEU0Qlx1OTVGNFx1NjNEMlx1NTE2NVx1N0E3QVx1NjgzQ1x1RkYwQ1x1NTNFRlx1NjRBNFx1OTUwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVNwYWNlQmV0d2VlbkNoaW5lc2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1MjIwXHU5NjY0XHU0RTJEXHU2NTg3XHU1QjU3XHU3QjI2XHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTNCQlx1OTY2NFx1NEUyRFx1NjU4N1x1NUI1N1x1N0IyNlx1NEU0Qlx1OTVGNFx1NzY4NFx1N0E3QVx1NjgzQ1x1RkYwQ1x1NEUwRFx1NTNFRlx1NjRBNFx1OTUwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIGNhcGl0YWxpemVGaXJzdExldHRlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTUzRTVcdTk5OTZcdTVCNTdcdTZCQ0RcdTU5MjdcdTUxOTlcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU4MkYxXHU2NTg3XHU2QkNGXHU0RTJBXHU1M0U1XHU5OTk2XHU1QjU3XHU2QkNEXHU1OTI3XHU1MTk5XHVGRjBDXHU1M0VGXHU2NEE0XHU5NTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgc21hcnRJbnNlcnRTcGFjZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTY2N0FcdTgwRkRcdTYzRDJcdTUxNjVcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1NzI4XHU2NTg3XHU2NzJDXHU1NDhDXHU2ODA3XHU3MEI5XHU0RTRCXHU5NUY0XHU2NjdBXHU4MEZEXHU2M0QyXHU1MTY1XHU3QTdBXHU2ODNDXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VTdHJhdGVneUlubGluZUNvZGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU4ODRDXHU1MTg1XHU0RUUzXHU3ODAxXHU1NDhDXHU2NTg3XHU2NzJDXHU0RTRCXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NjVFMFx1ODk4MVx1NkM0Mlx1RkYxQVx1NUJGOVx1NjcyQ1x1N0M3Qlx1NTIyQlx1NTc1N1x1NEUwRVx1NURFNlx1NTNGM1x1NjU4N1x1NjcyQ1x1NkNBMVx1NjcwOVx1N0E3QVx1NjgzQ1x1NzY4NFx1ODk4MVx1NkM0Mlx1RkYwQ1wiICtcbiAgICAgICAgICAgICAgICAgICAgIFwiXHU4RjZGXHU3QTdBXHU2ODNDXHVGRjFBXHU1QkY5XHU2NzJDXHU3QzdCXHU1MjJCXHU1NzU3XHU0RTBFXHU1NDY4XHU1NkY0XHU1MzNBXHU1NzU3XHU1M0VBXHU4OTgxXHU2QzQyXHU2NzA5XHU4RjZGXHU3QTdBXHU2ODNDXHVGRjBDXHU4RjZGXHU3QTdBXHU2ODNDXHU1OTgyXHU1RjUzXHU1MjREXHU1NzU3XHU1REU2XHU4RkI5XHU3Njg0XHU0RTM0XHU4RkQxXHU2NTg3XHU2NzJDXHU0RTNBXHUzMDAyXHVGRjBDXHVGRjFCXHVGRjFGXHU3QjQ5XHU1MTY4XHU4OUQyXHU2ODA3XHU3MEI5XHVGRjBDXHU1RjUzXHU1MjREXHU1NzU3XHU1M0YzXHU4RkI5XHU3Njg0XHU0RTM0XHU4RkQxXHU2NTg3XHU2NzJDXHU0RTNBXHU2MjQwXHU2NzA5XHU1MTY4XHU1MzRBXHU4OUQyXHU2ODA3XHU3MEI5XHVGRjBDXCIgK1xuICAgICAgICAgICAgICAgICAgICAgXCJcdTRFMjVcdTY4M0NcdTdBN0FcdTY4M0NcdUZGMUFcdTVGNTNcdTUyNERcdTU3NTdcdTRFMEVcdTRFMzRcdThGRDFcdTY1ODdcdTY3MkNcdTRFNEJcdTk1RjRcdTRFMjVcdTY4M0NcdTZERkJcdTUyQTBcdTdBN0FcdTY4M0NcdTMwMDJcIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZVN0cmF0ZWd5SW5saW5lRm9ybXVsYToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTg4NENcdTUxODVcdTUxNkNcdTVGMEZcdTU0OENcdTY1ODdcdTY3MkNcdTRFNEJcdTk1RjRcdTc2ODRcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1QjlBXHU0RTQ5XHU4ODRDXHU1MTg1XHU1MTZDXHU1RjBGXHU1NDhDXHU2NTg3XHU2NzJDXHU0RTRCXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VTdHJhdGVneUxpbmtUZXh0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OTRGRVx1NjNBNVx1NTQ4Q1x1NjU4N1x1NjcyQ1x1NEU0Qlx1OTVGNFx1NzY4NFx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTVCOUFcdTRFNDkgW1t3aWtpbGlua11dIFttZGxpbmtdKC4uLikgXHU1NDhDXHU2NTg3XHU2NzJDXHU0RTRCXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCJcbiAgICAgICAgfSxcbiAgICAgICAgdXNlckRlZmluZWRSZWdleHBTd2l0Y2g6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU3NTI4XHU2MjM3XHU1QjlBXHU0RTQ5XHU3Njg0XHU2QjYzXHU1MjE5XHU4ODY4XHU4RkJFXHU1RjBGXHU1RjAwXHU1MTczXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1ODFFQVx1NUI5QVx1NEU0OVx1NkI2M1x1NTIxOVx1ODg2OFx1OEZCRVx1NUYwRlx1NUYwMFx1NTE3M1x1RkYwQ1x1NTMzOVx1OTE0RFx1NTIzMFx1NzY4NFx1NTE4NVx1NUJCOVx1NEUwRFx1OEZEQlx1ODg0Q1x1NjgzQ1x1NUYwRlx1NTMxNlx1RkYwQ1x1NEUxNFx1NTNFRlx1NEVFNVx1OEJCRVx1N0Y2RVx1NTMzOVx1OTE0RFx1NTIzMFx1NzY4NFx1NTE4NVx1NUJCOVx1NTc1N1x1NEUwRVx1NTE3Nlx1NEVENlx1NTE4NVx1NUJCOVx1NEU0Qlx1OTVGNFx1NzY4NFx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHVzZXJEZWZpbmVkUmVnZXhwOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NzUyOFx1NjIzN1x1NUI5QVx1NEU0OVx1NzY4NFx1NkI2M1x1NTIxOVx1ODg2OFx1OEZCRVx1NUYwRlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTc1MjhcdTYyMzdcdTgxRUFcdTVCOUFcdTRFNDlcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdUZGMENcdTUzMzlcdTkxNERcdTUyMzBcdTc2ODRcdTUxODVcdTVCQjlcdTRFMERcdThGREJcdTg4NENcdTY4M0NcdTVGMEZcdTUzMTZcdUZGMENcdTZCQ0ZcdTg4NENcdTRFMDBcdTRFMkFcdTg4NjhcdThGQkVcdTVGMEZcdUZGMENcdTg4NENcdTVDM0VcdTRFMERcdTg5ODFcdTk2OEZcdTYxMEZcdTUyQTBcdTdBN0FcdTY4M0NcdTMwMDJcIiArXG5cdFx0XHRcdFwiXHU2QkNGXHU4ODRDXHU2NzJCXHU1QzNFM1x1NEUyQVx1NUI1N1x1N0IyNlx1NzY4NFx1NTZGQVx1NUI5QVx1NEUzQXxcdTU0OENcdTRFMjRcdTRFMkFcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcdTdCMjZcdTUzRjdcdUZGMENcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcdTdCMjZcdTUzRjdcdTRFM0EtPStcdUZGMENcdTUyMDZcdTUyMkJcdTRFRTNcdTg4NjhcdTRFMERcdTg5ODFcdTZDNDJcdTdBN0FcdTY4M0MoLSlcdUZGMENcdThGNkZcdTdBN0FcdTY4M0MoPSlcdUZGMENcdTRFMjVcdTY4M0NcdTdBN0FcdTY4M0MoKylcdTMwMDJcIiArXG5cdFx0XHRcdFwiXHU4RkQ5XHU0RTI0XHU0RTJBXHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XHU3QjI2XHU1M0Y3XHU1MjA2XHU1MjJCXHU0RTNBXHU1MzM5XHU5MTREXHU1MzNBXHU1NzU3XHU3Njg0XHU1REU2XHU1M0YzXHU0RTI0XHU4RkI5XHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCJcbiAgICAgICAgfSxcbiAgICAgICAgZXhjbHVkZUZvbGRlcnNGaWxlczoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTYzOTJcdTk2NjRcdTY1ODdcdTRFRjZcdTU5MzkvXHU2NTg3XHU0RUY2XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1OEJFNVx1NjNEMlx1NEVGNlx1NUMwNlx1NkJDRlx1ODg0Q1x1ODlFM1x1Njc5MFx1NEUzQVx1NEUwMFx1NEUyQVx1NjM5Mlx1OTY2NFx1NjU4N1x1NEVGNlx1NTkzOVx1NjIxNlx1NjU4N1x1NEVGNlx1MzAwMlx1NEY4Qlx1NTk4Mlx1RkYxQURhaWx5Tm90ZS8sIERhaWx5Tm90ZS9XZWVrTm90ZXMvLCBEYWlseU5vdGUvdGVzdC5tZFwiXG4gICAgICAgIH0sXG4gICAgICAgIGZpeE1hY09TQ29udGV4dE1lbnU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU0RkVFXHU1OTBEIE1hY09TIFx1NTNGM1x1OTUyRVx1ODNEQ1x1NTM1NVx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTRGRUVcdTU5MEQgTWFjT1MgXHU5RjIwXHU2ODA3XHU1M0YzXHU5NTJFXHU1NDdDXHU1MUZBXHU4M0RDXHU1MzU1XHU2NUY2XHU1MTQ5XHU2ODA3XHU4REYzXHU1MjMwXHU0RTBCXHU0RTAwXHU4ODRDXHU3Njg0XHU5NUVFXHU5ODk4IChcdTk3MDBcdTg5ODFcdTkxQ0RcdTU0MkYgT2JzaWRpYW4gXHU3NTFGXHU2NTQ4KVwiXG4gICAgICAgIH0sXG4gICAgICAgIGZpeE1pY3Jvc29mdElNRToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTRGRUVcdTU5MERcdTVGQUVcdThGNkZcdThGOTNcdTUxNjVcdTZDRDVcdTk1RUVcdTk4OThcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU5MDAyXHU5MTREXHU2NUU3XHU3MjQ4XHU1RkFFXHU4RjZGXHU4RjkzXHU1MTY1XHU2Q0Q1XCJcbiAgICAgICAgfSxcbiAgICAgICAgc3RyaWN0TGluZUJyZWFrczoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTRFMjVcdTY4M0NcdTYzNjJcdTg4NENcdTZBMjFcdTVGMEZcdTRFMEJcdTYzMDlcdTRFMjRcdTZCMjFcdTU2REVcdThGNjZcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU0RTI1XHU2ODNDXHU2MzYyXHU4ODRDXHU3Njg0XHU4QkJFXHU3RjZFXHU0RTBCXHVGRjBDXHU1NzI4XHU2NjZFXHU5MDFBXHU2NTg3XHU2NzJDXHU4ODRDXHU4RkRCXHU4ODRDXHU0RTAwXHU2QjIxXHU1NkRFXHU4RjY2XHU0RjFBXHU0RUE3XHU3NTFGXHU0RTI0XHU0RTJBXHU2MzYyXHU4ODRDXHU3QjI2XCJcbiAgICAgICAgfSxcbiAgICAgICAgcHVuY1JlY3RpZnk6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU2ODA3XHU3MEI5XHU3N0VCXHU2QjYzXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NEVDNVx1NTcyOFx1OEY5M1x1NTE2NVx1OEZDN1x1N0EwQlx1NEUyRFx1RkYwQ1x1NEUyRFx1NjU4N1x1OTVGNFx1NzY4NFx1ODJGMVx1NjU4N1x1NjgwN1x1NzBCOVx1RkYwOCwuPyFcdUZGMDlcdTgxRUFcdTUyQThcdThGNkNcdTYzNjJcdTRFM0FcdTUxNjhcdTg5RDJcdUZGMDhcdTUzRUZcdTY0QTRcdTk1MDBcdUZGMDlcIlxuICAgICAgICB9LFxuICAgICAgICBwcmludERlYnVnSW5mbzoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTU3MjhcdTYzQTdcdTUyMzZcdTUzRjBcdThGOTNcdTUxRkFcdThDMDNcdThCRDVcdTRGRTFcdTYwNkZcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1NzI4XHU2M0E3XHU1MjM2XHU1M0YwXHU4RjkzXHU1MUZBXHU4QzAzXHU4QkQ1XHU0RkUxXHU2MDZGXCJcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uUmVwbGFjZVJ1bGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU5MDA5XHU0RTJEXHU2NkZGXHU2MzYyXHU4OUM0XHU1MjE5XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NzUyOFx1NjIzN1x1NUI5QVx1NEU0OVx1NzY4NFx1OTAwOVx1NjJFOVx1NjZGRlx1NjM2Mlx1ODlDNFx1NTIxOVwiXG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVJ1bGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1MjIwXHU5NjY0XHU4OUM0XHU1MjE5XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1ODlDNFx1NTIxOVx1RkYxQVx1NzUyOCB8IFx1NEVFM1x1ODg2OFx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVx1RkYwQ1x1NUZDNVx1OTg3Qlx1NTMwNVx1NTQyQlx1NTE0OVx1NjgwN1x1MzAwMlx1NjNEMFx1NzkzQVx1RkYxQVx1NEY3Rlx1NzUyOCB8IFx1ODg2OFx1NzkzQVx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVx1MzAwMlwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnZlcnRSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OEY2Q1x1NjM2Mlx1ODlDNFx1NTIxOVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTg5QzRcdTUyMTlcdUZGMUFcdTc1MjggfCBcdTRFRTNcdTg4NjhcdTUxNDlcdTY4MDdcdTRGNERcdTdGNkVcdUZGMENcdTVGQzVcdTk4N0JcdTUzMDVcdTU0MkJcdTUxNDlcdTY4MDdcdTMwMDJcdTYzRDBcdTc5M0FcdUZGMUFcdTRGN0ZcdTc1MjggfCBcdTg4NjhcdTc5M0FcdTUxNDlcdTY4MDdcdTRGNERcdTdGNkVcdTMwMDJcIlxuICAgICAgICB9LFxuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1ODlFNlx1NTNEMVx1NTY2OFwiXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1REU2XCJcbiAgICAgICAgfSxcbiAgICAgICAgcmlnaHQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1M0YzXCJcbiAgICAgICAgfSxcbiAgICAgICAgb2xkUGF0dGVybjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTY1RTdcdTZBMjFcdTVGMEZcIlxuICAgICAgICB9LFxuICAgICAgICBuZXdQYXR0ZXJuOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NjVCMFx1NkEyMVx1NUYwRlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgbWFpbjogXCJPYnNpZGlhbiBFYXN5VHlwaW5nIFx1NjNEMlx1NEVGNlwiLFxuICAgICAgICBnaXRodWJEZXRhaWw6IFwiXHU4QkU2XHU2MEM1XHU4OUMxIEdpdGh1Ylx1RkYxQVwiLFxuICAgICAgICBlbmhhbmNlZEVkaXRpbmc6IFwiXHU1ODlFXHU1RjNBXHU3RjE2XHU4RjkxXHU4QkJFXHU3RjZFXCIsXG4gICAgICAgIGN1c3RvbWl6ZUVkaXRSdWxlOiBcIlx1ODFFQVx1NUI5QVx1NEU0OVx1N0YxNlx1OEY5MVx1OEY2Q1x1NjM2Mlx1ODlDNFx1NTIxOVwiLFxuICAgICAgICBhdXRvZm9ybWF0U2V0dGluZzogXCJcdTgxRUFcdTUyQThcdTY4M0NcdTVGMEZcdTUzMTZcdThCQkVcdTdGNkVcIixcbiAgICAgICAgZGV0YWlsZWRTZXR0aW5nOiBcIlx1OEJFNlx1N0VDNlx1OEJCRVx1N0Y2RVx1NTk4Mlx1NEUwQlwiLFxuICAgICAgICBjdXN0b21SZWdleHBCbG9jazogXCJcdTgxRUFcdTVCOUFcdTRFNDlcdTZCNjNcdTUyMTlcdTUzM0FcdTU3NTdcIixcbiAgICAgICAgZXhjbHVkZUZvbGRlcnNGaWxlczogXCJcdTYzMDdcdTVCOUFcdTY1ODdcdTRFRjZcdTRFMERcdTgxRUFcdTUyQThcdTY4M0NcdTVGMEZcdTUzMTZcIixcbiAgICAgICAgZXhwZXJpbWVudGFsRmVhdHVyZXM6IFwiXHU1QjlFXHU5QThDXHU1MjlGXHU4MEZEXCIsXG4gICAgICAgIGFib3V0UmVnZXhwOiB7XG4gICAgICAgICAgICBoZWFkZXI6XCJcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdTc2RjhcdTUxNzNcdTc3RTVcdThCQzZcdUZGMENcdTg5QzEgXCIsXG4gICAgICAgICAgICB0ZXh0OiBcIlx1MzAwQVx1OTYyRVx1NEUwMFx1NUNGMFx1RkYxQVx1NkI2M1x1NTIxOVx1ODg2OFx1OEZCRVx1NUYwRlx1N0I4MFx1NjYwRVx1NjU1OVx1N0EwQlx1MzAwQlwiLFxuICAgICAgICB9LFxuICAgICAgICBpbnN0cnVjdGlvbnNSZWdleHA6IHtcbiAgICAgICAgICAgIGhlYWRlcjogXCJcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdTg5QzRcdTUyMTlcdTRGN0ZcdTc1MjhcdThCRjRcdTY2MEVcdTRFMEVcdTc5M0FcdTRGOEJcdUZGMUEgXCIsXG4gICAgICAgICAgICB0ZXh0OlwiXHU4MUVBXHU1QjlBXHU0RTQ5XHU2QjYzXHU1MjE5XHU4ODY4XHU4RkJFXHU1RjBGXHU4OUM0XHU1MjE5XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGN1c3RvbWl6ZVNlbGVjdGlvblJ1bGU6IFwiXHU4MUVBXHU1QjlBXHU0RTQ5XHU5MDA5XHU0RTJEXHU2NTg3XHU2NzJDXHU3RjE2XHU4RjkxXHU1ODlFXHU1RjNBXHU4OUM0XHU1MjE5XCIsXG4gICAgICAgIGN1c3RvbWl6ZURlbGV0ZVJ1bGU6IFwiXHU4MUVBXHU1QjlBXHU0RTQ5XHU1MjIwXHU5NjY0XHU3RjE2XHU4RjkxXHU1ODlFXHU1RjNBXHU4OUM0XHU1MjE5XCIsXG4gICAgICAgIGN1c3RvbWl6ZUNvbnZlcnRSdWxlOiBcIlx1ODFFQVx1NUI5QVx1NEU0OVx1N0YxNlx1OEY5MVx1OEY2Q1x1NjM2Mlx1ODlDNFx1NTIxOVwiLFxuICAgICAgICBlZGl0U2VsZWN0aW9uUmVwbGFjZVJ1bGU6IFwiXHU3RjE2XHU4RjkxXHU5MDA5XHU0RTJEXHU2NkZGXHU2MzYyXHU4OUM0XHU1MjE5XCIsXG4gICAgfSxcbiAgICBkcm9wZG93bk9wdGlvbnM6IHtcbiAgICAgICAgb25seVdoZW5UeXBpbmc6IFwiXHU4RjkzXHU1MTY1XHU2NUY2XHU3NTFGXHU2NTQ4XCIsXG4gICAgICAgIGdsb2JhbGx5OiBcIlx1NTE2OFx1NUM0MFx1NzUxRlx1NjU0OFwiLFxuICAgICAgICBub1JlcXVpcmU6IFwiXHU2NUUwXHU4OTgxXHU2QzQyXCIsXG4gICAgICAgIHNvZnRTcGFjZTogXCJcdThGNkZcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgc3RyaWN0U3BhY2U6IFwiXHU0RTI1XHU2ODNDXHU3QTdBXHU2ODNDXCIsXG4gICAgICAgIGR1bW15OiBcIlx1NTQ0Nlx1N0E3QVx1NjgzQ1wiLFxuICAgICAgICBzbWFydDogXCJcdTY2N0FcdTgwRkRcdTdBN0FcdTY4M0NcIlxuICAgIH0sXG4gICAgdG9vbFRpcDoge1xuICAgICAgICBzd2l0Y2g6IFwiXHU1MjlGXHU4MEZEXHU1RjAwXHU1MTczXCIsXG4gICAgICAgIGVkaXRSdWxlOiBcIlx1N0YxNlx1OEY5MVx1ODlDNFx1NTIxOVwiLFxuICAgICAgICByZW1vdmVSdWxlOiBcIlx1NTIyMFx1OTY2NFx1ODlDNFx1NTIxOVwiLFxuICAgICAgICBhZGRSdWxlOiBcIlx1NkRGQlx1NTJBMFx1ODlDNFx1NTIxOVwiLFxuICAgIH0sXG4gICAgcGxhY2VIb2xkZXI6IHtcbiAgICAgICAgdHJpZ2dlclN5bWJvbDogXCJcdTg5RTZcdTUzRDFcdTdCMjZcIixcbiAgICAgICAgbmV3TGVmdFNpZGVTdHJpbmc6IFwiXHU1REU2XHU4RkI5XHU3QjI2XHU1M0Y3XCIsXG4gICAgICAgIG5ld1JpZ2h0U2lkZVN0cmluZzogXCJcdTUzRjNcdThGQjlcdTdCMjZcdTUzRjdcIixcbiAgICAgICAgYWRkUnVsZTogXCJcdTZERkJcdTUyQTBcdTg5QzRcdTUyMTlcIixcbiAgICAgICAgbm90aWNlSW52YWlkVHJpZ2dlcjogXCJcdTY1RTBcdTY1NDhcdTc2ODRcdTg5RTZcdTUzRDFcdTdCMjYsIFx1ODlFNlx1NTNEMVx1N0IyNlx1NUZDNVx1OTg3Qlx1NjYyRlx1NTM1NVx1NUI1N1x1N0IyNlx1NjIxNlx1ODAwNVx1NjYyRiBcdTIwMTRcdTIwMTRcdTMwMDFcdTIwMjZcdTIwMjZcIixcbiAgICAgICAgbm90aWNlV2FyblRyaWdnZXJFeGlzdHM6IFwiXHU2NUUwXHU2NTQ4XHU4OUM0XHU1MjE5ISBcdTg5RTZcdTUzRDFcdTdCMjYgJXMgXHU1REYyXHU1QjU4XHU1NzI4XCIsXG4gICAgICAgIG5vdGljZU1pc3NpbmdJbnB1dDogXCJtaXNzaW5nIGlucHV0XCIsXG4gICAgICAgIGJlZm9yZURlbGV0ZTogXCJcdTUyMjBcdTk2NjRcdTUyNER8XCIsXG4gICAgICAgIG5ld1BhdHRlcm46IFwiXHU4OUU2XHU1M0QxXHU4OUM0XHU1MjE5XHU1NDBFXHU1QjU3XHU3QjI2XHU0RTMyXHU2QTIxXHU1RjBGXCIsXG4gICAgICAgIG5vdGljZUludmFpZFRyaWdnZXJQYXR0ZXJuQ29udGFpblN5bWJvbDogXCJcdTY1RTBcdTY1NDhcdTg5QzRcdTUyMTksIFx1OEY2Q1x1NjM2Mlx1NTI0RFx1NkEyMVx1NUYwRlx1NUZDNVx1OTg3Qlx1NTMwNVx1NTQyQlx1NEVFM1x1ODg2OFx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVx1NzY4NFx1N0IyNlx1NTNGNyBcXHxcIixcbiAgICAgICAgYmVmb3JlQ29udmVydDogXCJcdThGNkNcdTYzNjJcdTUyNER8XCIsXG4gICAgICAgIG5vdGljZUludmFsaWRQYXR0ZXJuU3RyaW5nOlwiSW52YWxpZCBwYXR0ZXJuIHN0cmluZyFcIixcbiAgICB9LFxuICAgIGJ1dHRvbjoge1xuICAgICAgICB1cGRhdGU6IFwiXHU2NkY0XHU2NUIwXCIsXG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgbG9jYWxlO1xuIiwgImltcG9ydCB7IGVuVVMgfSBmcm9tIFwiLlwiO1xuXG4vLyBtYWNoaW5lIHRyYW5zbGF0aW9uXG5jb25zdCBsb2NhbGU6IHR5cGVvZiBlblVTID0ge1xuICAgIHNldHRpbmdzOiB7XG4gICAgICAgIHN5bWJvbEF1dG9QYWlyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDM4IFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDNGXHUwNDMwXHUwNDQwXHUwNDMwXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0MzdcdTA0MzBcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0MzhcdTA0MzUgXHUwNDM4IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzN1x1MDQzMFx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMiwgXHUwNDQyXHUwNDMwXHUwNDNBXHUwNDM4XHUwNDQ1IFx1MDQzQVx1MDQzMFx1MDQzQSBcdTMwMEFcdTMwMEIsIFx1MjAxQ1x1MjAxRCwgXHUzMDBDXHUzMDBELCBcdTMwMEVcdTMwMEYsIFx1MzAxMFx1MzAxMSBcdTA0MzggXHUwNDQyLlx1MDQzNC5cIlxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25SZXBsYWNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQyM1x1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEIgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMFwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MjNcdTA0M0JcdTA0NDNcdTA0NDdcdTA0NDhcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzAsIFx1MDQzRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MCwgXHUwNDNEXHUwNDMwXHUwNDM2XHUwNDMwXHUwNDQyXHUwNDM4XHUwNDM1IFx1RkZFNSBcdTIxOTIgJFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIkLCBcdTA0M0RcdTA0MzBcdTA0MzZcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzUgXHUwMEI3IFx1MjE5MiBgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MmAsIFx1MzAwQSBcdTIxOTIgXHUzMDBBXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MzAwQiBcdTA0MzggXHUwNDQyLlx1MDQzNC5cIlxuICAgICAgICB9LFxuICAgICAgICBmdWxsV2lkdGhUb0hhbGZXaWR0aDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MUFcdTA0M0VcdTA0M0RcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDMyIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MUFcdTA0M0VcdTA0M0RcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDMyIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSwgXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwLCBcdTMwMDJcdTMwMDJcdTIxOTIgLiwgXHVGRjAxXHVGRjAxXHUyMTkyICEsIFx1MzAwQlx1MzAwQlx1MjE5MiA+XCJcbiAgICAgICAgfSxcbiAgICAgICAgYmFzaWNJbnB1dEVuaGFuY2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDIzXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDQ4XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzMVx1MDQzMFx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzJcdTA0MzJcdTA0M0VcdTA0MzRcdTA0MzAgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzNFx1MDQzQlx1MDQ0RiBPYnNpZGlhblwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MjNcdTA0M0JcdTA0NDNcdTA0NDdcdTA0NDhcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDMwXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzMlx1MDQzMlx1MDQzRVx1MDQzNFx1MDQzMCBcdTA0MzRcdTA0M0JcdTA0NEYgT2JzaWRpYW4sIFx1MDQzRFx1MDQzMFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MCwgXHUzMDEwXHUzMDEwfCBcdTIxOTIgW1t8XV0sIFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQzRSBcdTA0NDEgXHUzMDAxXHUyMTkyIC8sIFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzQlx1MDQzRSBcdTA0NDEgXHUzMDBCXHUyMTkyID4sIFx1MDBCN1x1MDBCN3wgXHUyMTkyIGB8YCwgYFx1MDBCN3xgIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0FcdTA0M0VcdTA0MzRcdTA0M0VcdTA0MzJcdTA0NEJcdTA0M0MgXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDLCBcdUZGRTVcdUZGRTV8IFx1MjE5MiAkfCRcIlxuICAgICAgICB9LFxuICAgICAgICBjb2RlYmxvY2tFZGl0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQyM1x1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNBXHUwNDNFXHUwNDM0XHUwNDNFXHUwNDMyXHUwNDRCXHUwNDQ1IFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzMlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MjNcdTA0M0JcdTA0NDNcdTA0NDdcdTA0NDhcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMiBcdTA0M0FcdTA0M0VcdTA0MzRcdTA0M0VcdTA0MzJcdTA0NEJcdTA0NDUgXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDQ1IChUYWIsIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSwgXHUwNDMyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDMwLCBDbWQvQ3RybCtBIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSkuXCJcbiAgICAgICAgfSxcbiAgICAgICAgdGFiT3V0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlRhYm91dFwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MTJcdTA0NEJcdTA0MzlcdTA0NDJcdTA0MzggXHUwNDM4XHUwNDM3IFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0FcdTA0M0VcdTA0MzRcdTA0MzAgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzRlx1MDQzMFx1MDQ0MFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzIgKFx1MDQzQVx1MDQzRVx1MDQzM1x1MDQzNFx1MDQzMCBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0UpLlwiXG4gICAgICAgIH0sXG4gICAgICAgIGF1dG9Gb3JtYXR0aW5nOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNEXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDM1IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMFwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MTJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUvXHUwNDMyXHUwNDRCXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzAgXHUwNDMyXHUwNDNFIFx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzQ1x1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM0XHUwNDNFXHUwNDNBXHUwNDQzXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkNoaW5lc2VFbmdsaXNoOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDNBXHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQzOCBcdTA0MzBcdTA0M0RcdTA0MzNcdTA0M0JcdTA0MzhcdTA0MzlcdTA0NDFcdTA0M0FcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0MzAgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQzQVx1MDQzOFx1MDQ0Mlx1MDQzMFx1MDQzOVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzQ1x1MDQzOCBcdTA0MzggXHUwNDMwXHUwNDNEXHUwNDMzXHUwNDNCXHUwNDM4XHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOC5cIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZUJldHdlZW5DaGluZXNlTnVtYmVyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDNBXHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOCBcdTA0MzggXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0MzAgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQzQVx1MDQzOFx1MDQ0Mlx1MDQzMFx1MDQzOVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzQ1x1MDQzOCBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDM4IFx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOC5cIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZUJldHdlZW5FbmdsaXNoTnVtYmVyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDMwXHUwNDNEXHUwNDMzXHUwNDNCXHUwNDM4XHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOCBcdTA0MzggXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0MzAgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQzMFx1MDQzRFx1MDQzM1x1MDQzQlx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzQ1x1MDQzOCBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDM4IFx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOC5cIlxuICAgICAgICB9LFxuICAgICAgICBkZWxldGVTcGFjZUJldHdlZW5DaGluZXNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0MzAgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQzQVx1MDQzOFx1MDQ0Mlx1MDQzMFx1MDQzOVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzQ1x1MDQzOCBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzhcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDNBXHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOC5cIlxuICAgICAgICB9LFxuICAgICAgICBjYXBpdGFsaXplRmlyc3RMZXR0ZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDE3XHUwNDMwXHUwNDMzXHUwNDNCXHUwNDMwXHUwNDMyXHUwNDNEXHUwNDMwXHUwNDRGIFx1MDQzMVx1MDQ0M1x1MDQzQVx1MDQzMlx1MDQzMCBcdTA0MzIgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQzNlx1MDQzNFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDFGXHUwNDQwXHUwNDM1XHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzRVx1MDQzOSBcdTA0MzFcdTA0NDNcdTA0M0FcdTA0MzJcdTA0NEIgXHUwNDNBXHUwNDMwXHUwNDM2XHUwNDM0XHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzIgXHUwNDMwXHUwNDNEXHUwNDMzXHUwNDNCXHUwNDM4XHUwNDM5XHUwNDQxXHUwNDNBXHUwNDNFXHUwNDNDIFx1MDQzMiBcdTA0MzdcdTA0MzBcdTA0MzNcdTA0M0JcdTA0MzBcdTA0MzJcdTA0M0RcdTA0NDNcdTA0NEUuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc21hcnRJbnNlcnRTcGFjZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MThcdTA0M0RcdTA0NDJcdTA0MzVcdTA0M0JcdTA0M0JcdTA0MzVcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0MzBcdTA0NEYgXHUwNDMyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzMCBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDIFx1MDQzOCBcdTA0M0ZcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzVcdTA0MzlcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDE4XHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDNCXHUwNDM1XHUwNDNBXHUwNDQyXHUwNDQzXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDMwXHUwNDRGIFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0MzAgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQyBcdTA0MzggXHUwNDNGXHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM1XHUwNDM5LlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlU3RyYXRlZ3lJbmxpbmVDb2RlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzQyBcdTA0M0FcdTA0M0VcdTA0MzRcdTA0M0VcdTA0M0MgXHUwNDM4IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQ1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MURcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM5OiBcdTA0MURcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM5IFx1MDQzQSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0MzBcdTA0M0MgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQ0RFx1MDQ0Mlx1MDQzOFx1MDQzQyBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0MgXHUwNDNBXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4IFx1MDQzOCBcdTA0M0VcdTA0M0FcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzhcdTA0M0MgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJcdTA0MUNcdTA0NEZcdTA0MzNcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCOiBcdTA0MjJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0NDNcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDQyXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDNBXHUwNDNFIFx1MDQzQ1x1MDQ0Rlx1MDQzM1x1MDQzQVx1MDQzOFx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0IgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQ0RFx1MDQ0Mlx1MDQzOFx1MDQzQyBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0MgXHUwNDNBXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDM4IFx1MDQzOCBcdTA0M0VcdTA0M0FcdTA0NDBcdTA0NDNcdTA0MzZcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDNDXHUwNDM4LiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDAgXHUwNDNDXHUwNDRGXHUwNDMzXHUwNDNBXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzMDogXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQlx1MDQzNVx1MDQzM1x1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIgXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDMyXHUwNDMwIFx1MDQzRVx1MDQ0MiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNBXHUwNDMwIC0gXHUwNDREXHUwNDQyXHUwNDNFIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzRFx1MDQzMFx1MDQ0RiBcdTA0M0ZcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEYsIFx1MDQ0Mlx1MDQzMFx1MDQzQVx1MDQzMFx1MDQ0RiBcdTA0M0FcdTA0MzBcdTA0M0EgLiAsIDsgPyBcdTA0MzggXHUwNDQyLlx1MDQzNC4sIFx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0JcdTA0MzVcdTA0MzNcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzhcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyIFx1MDQ0MVx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMCBcdTA0M0VcdTA0NDIgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzQVx1MDQzMCAtIFx1MDQ0RFx1MDQ0Mlx1MDQzRSBcdTA0MzJcdTA0NDFcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDNFXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDNEXHUwNDMwXHUwNDRGIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NDNcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0M0RcdTA0MzBcdTA0NEYgXHUwNDNGXHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJcdTA0MjFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzNcdTA0MzhcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCOiBcdTA0MjFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzNcdTA0M0VcdTA0MzUgXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQzXHUwNDQ5XHUwNDM4XHUwNDNDIFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQyBcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNCXHUwNDM1XHUwNDMzXHUwNDMwXHUwNDRFXHUwNDQ5XHUwNDM4XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQy5cIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZVN0cmF0ZWd5SW5saW5lRm9ybXVsYToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MjFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDQzXHUwNDNCXHUwNDNFXHUwNDM5IFx1MDQzOCBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDFFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzOFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzQ1x1MDQzOCBcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0NDNcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDM4IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQy5cIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZVN0cmF0ZWd5TGlua1RleHQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDIxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDNFXHUwNDM5IFx1MDQzOCBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0NcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDFFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzOFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFtbXHUwNDMyXHUwNDM4XHUwNDNBXHUwNDM4XHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDMwXHUwNDNDXHUwNDM4XV0gW21hcmtkb3duLVx1MDQ0MVx1MDQ0MVx1MDQ0Qlx1MDQzQlx1MDQzQVx1MDQzMFx1MDQzQ1x1MDQzOF0oLi4uKSBcdTA0MzggXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHVzZXJEZWZpbmVkUmVnZXhwU3dpdGNoOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0NDUgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDQzXHUwNDNCXHUwNDRGXHUwNDQwXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MTJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUvXHUwNDMyXHUwNDRCXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzOFx1MDQ0NSBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0NDNcdTA0M0JcdTA0NEZcdTA0NDBcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5LCBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0VcdTA0NDJcdTA0MzJcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzOCBcdTA0NDNcdTA0NDFcdTA0NDJcdTA0MzBcdTA0M0RcdTA0M0VcdTA0MzJcdTA0M0FcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDQxXHUwNDNFXHUwNDMyXHUwNDNGXHUwNDMwXHUwNDM0XHUwNDMwXHUwNDRFXHUwNDQ5XHUwNDM4XHUwNDNDIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQ0Qlx1MDQzQyBcdTA0MzggXHUwNDM0XHUwNDQwXHUwNDQzXHUwNDMzXHUwNDM4XHUwNDNDIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQy5cIlxuICAgICAgICB9LFxuICAgICAgICB1c2VyRGVmaW5lZFJlZ2V4cDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0M0VcdTA0MzUgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDQzXHUwNDNCXHUwNDRGXHUwNDQwXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSwgXHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFIFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDQzXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0NDNcdTA0M0JcdTA0NEZcdTA0NDBcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1LCBcdTA0NDFcdTA0M0VcdTA0MzJcdTA0M0ZcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzVcdTA0MzUgXHUwNDQxIFx1MDQ0MVx1MDQzRVx1MDQzNFx1MDQzNVx1MDQ0MFx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQ0Qlx1MDQzQywgXHUwNDNEXHUwNDM1IFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiwgXHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFIFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDQzLCBcdTA0M0RcdTA0MzUgXHUwNDM0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDM5XHUwNDQyXHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQ0QiBcdTA0MzIgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQ2XHUwNDM1IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzOC5cIitcbiAgICAgICAgICAgICAgICBcIlx1MDQxQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0NiBcdTA0M0FcdTA0MzBcdTA0MzZcdTA0MzRcdTA0M0VcdTA0MzkgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDM4IFx1MDQ0NFx1MDQzOFx1MDQzQVx1MDQ0MVx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRCBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0M0NcdTA0NEYgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4OiB8IFx1MDQzOCBcdTA0MzRcdTA0MzJcdTA0NDNcdTA0M0NcdTA0NEYgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzOFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0M0VcdTA0MzIsIFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0QiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0MzhcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDNFXHUwNDMyIC0gXHUwNDREXHUwNDQyXHUwNDNFIC0gPSArLCBcdTA0M0FcdTA0M0VcdTA0NDJcdTA0M0VcdTA0NDBcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFIFx1MDQzRVx1MDQzMVx1MDQzRVx1MDQzN1x1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQ0RVx1MDQ0MiBcdTA0M0VcdTA0NDJcdTA0NDFcdTA0NDNcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0MzUgXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiAoLSksIFx1MDQzQ1x1MDQ0Rlx1MDQzM1x1MDQzQVx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0NEIgKD0pLCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzNcdTA0MzhcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDRCICgrKS5cIitcbiAgICAgICAgICAgICAgICBcIlx1MDQyRFx1MDQ0Mlx1MDQzOCBcdTA0MzRcdTA0MzJcdTA0MzAgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDMwIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzOFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDRGXHUwNDMyXHUwNDNCXHUwNDRGXHUwNDRFXHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzOFx1MDQzNVx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzQlx1MDQzNVx1MDQzMlx1MDQzRVx1MDQzOSBcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNFXHUwNDM5IFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzRVx1MDQzRCBcdTA0NDFcdTA0M0VcdTA0MzJcdTA0M0ZcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNBXHUwNDMwIFx1MDQ0MVx1MDQzRVx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVwiXG4gICAgICAgIH0sXG4gICAgICAgIGV4Y2x1ZGVGb2xkZXJzRmlsZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDE4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzOC9cdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEJcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDJEXHUwNDQyXHUwNDNFXHUwNDQyIFx1MDQzRlx1MDQzQlx1MDQzMFx1MDQzM1x1MDQzOFx1MDQzRCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDMxXHUwNDMwXHUwNDQyXHUwNDRCXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzQVx1MDQzMFx1MDQzNlx1MDQzNFx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDMgXHUwNDNBXHUwNDMwXHUwNDNBIFx1MDQzOFx1MDQ0MVx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQzQ1x1MDQ0M1x1MDQ0RSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0NDMgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQi4gXHUwNDFEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwOiBEYWlseU5vdGUvLCBEYWlseU5vdGUvV2Vla05vdGVzLywgRGFpbHlOb3RlL3Rlc3QubWRcIlxuICAgICAgICB9LFxuICAgICAgICBmaXhNYWNPU0NvbnRleHRNZW51OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEUgTWFjT1MgKFx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzMVx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0M0EgT2JzaWRpYW4pXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0M0JcdTA0MzVcdTA0M0NcdTA0NEIsIFx1MDQzQVx1MDQzRVx1MDQzM1x1MDQzNFx1MDQzMCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDAgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDQxXHUwNDNBXHUwNDMwXHUwNDNBXHUwNDM4XHUwNDMyXHUwNDMwXHUwNDM1XHUwNDQyIFx1MDQzRFx1MDQzMCBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NEVcdTA0NDlcdTA0NDNcdTA0NEUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDQzIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0MzJcdTA0NEJcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0RSBcdTA0M0RcdTA0MzAgTWFjT1MgKFx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzMVx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzBcdTA0M0ZcdTA0NDNcdTA0NDFcdTA0M0EgT2JzaWRpYW4pLlwiXG4gICAgICAgIH0sXG4gICAgICAgIGZpeE1pY3Jvc29mdElNRToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MThcdTA0NDFcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDNCXHUwNDM1XHUwNDNDXHUwNDRCIFx1MDQ0MSBNaWNyb3NvZnQgSW5wdXQgTWV0aG9kXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMFx1MDQzNFx1MDQzMFx1MDQzRlx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDRCXHUwNDQ1IFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0MVx1MDQzOFx1MDQzOSBNaWNyb3NvZnQgSW5wdXQgTWV0aG9kLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHN0cmljdExpbmVCcmVha3M6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDIwXHUwNDM1XHUwNDM2XHUwNDM4XHUwNDNDIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzM1x1MDQzOFx1MDQ0NSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0NEJcdTA0MzJcdTA0M0VcdTA0MzIgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBLCBcdTA0MzRcdTA0MzJcdTA0MzBcdTA0MzZcdTA0MzRcdTA0NEIgXHUwNDNEXHUwNDMwXHUwNDM2XHUwNDNDXHUwNDM4XHUwNDQyXHUwNDM1IEVudGVyXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMiBcdTA0NDBcdTA0MzVcdTA0MzZcdTA0MzhcdTA0M0NcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDMzXHUwNDM4XHUwNDQ1IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQ0MFx1MDQ0Qlx1MDQzMlx1MDQzRVx1MDQzMiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0EsIFx1MDQzRVx1MDQzNFx1MDQzRFx1MDQzRVx1MDQzQVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0M0RcdTA0MzBcdTA0MzZcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzUgRW50ZXIgXHUwNDMyIFx1MDQzRVx1MDQzMVx1MDQ0Qlx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzJcdTA0NEJcdTA0NDUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDQ1IFx1MDQ0MVx1MDQzRVx1MDQzN1x1MDQzNFx1MDQzMFx1MDQ0MVx1MDQ0MiBcdTA0MzRcdTA0MzJcdTA0MzAgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDRCXHUwNDMyXHUwNDMwIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzOC5cIlxuICAgICAgICB9LFxuICAgICAgICBwdW5jUmVjdGlmeToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MUFcdTA0M0VcdTA0NDBcdTA0NDBcdTA0MzVcdTA0M0FcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQzQVx1MDQzMFx1MDQ0RiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEYgXHUwNDMwXHUwNDNEXHUwNDMzXHUwNDNCXHUwNDM4XHUwNDM5XHUwNDQxXHUwNDNBXHUwNDNFXHUwNDM5IFx1MDQzRlx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCAoLCAuID8gISkgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQzQVx1MDQzOFx1MDQ0Mlx1MDQzMFx1MDQzOVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzQ1x1MDQzOCBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDMyIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRFx1MDQzRVx1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzRFx1MDQ0M1x1MDQ0RSBcdTA0M0ZcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEUgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzRFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0MFx1MDQzNSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzAgKFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzQ1x1MDQzRSkuXCJcbiAgICAgICAgfSxcbiAgICAgICAgcHJpbnREZWJ1Z0luZm86IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDEyXHUwNDRCXHUwNDMyXHUwNDNFXHUwNDM0IFx1MDQzRVx1MDQ0Mlx1MDQzQlx1MDQzMFx1MDQzNFx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQzRVx1MDQzOSBcdTA0MzhcdTA0M0RcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDMyIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0Q1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MTJcdTA0NEJcdTA0MzJcdTA0M0VcdTA0MzQgXHUwNDNFXHUwNDQyXHUwNDNCXHUwNDMwXHUwNDM0XHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzIgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQxXHUwNDNFXHUwNDNCXHUwNDRDLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvblJlcGxhY2VSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzRSBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEIgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMFwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0M0VcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDNFIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0QiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwXCJcbiAgICAgICAgfSxcbiAgICAgICAgZGVsZXRlUnVsZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MUZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0M0UgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzRTogXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM5XHUwNDQyXHUwNDM1IHwgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzQVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwLiBcdTA0MUZcdTA0M0VcdTA0MzRcdTA0NDFcdTA0M0FcdTA0MzBcdTA0MzdcdTA0M0FcdTA0MzA6IFx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSB8IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDNcdTA0M0FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMC5cIlxuICAgICAgICB9LFxuICAgICAgICBjb252ZXJ0UnVsZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MUZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzRTogXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM5XHUwNDQyXHUwNDM1IHwgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzQVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwLiBcdTA0MUZcdTA0M0VcdTA0MzRcdTA0NDFcdTA0M0FcdTA0MzBcdTA0MzdcdTA0M0FcdTA0MzA6IFx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSB8IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDNcdTA0M0FcdTA0MzBcdTA0MzdcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMC5cIlxuICAgICAgICB9LFxuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQyMlx1MDQ0MFx1MDQzOFx1MDQzM1x1MDQzM1x1MDQzNVx1MDQ0MFwiXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDFCXHUwNDM1XHUwNDMyXHUwNDRCXHUwNDM5XCJcbiAgICAgICAgfSxcbiAgICAgICAgcmlnaHQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDFGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDRCXHUwNDM5XCJcbiAgICAgICAgfSxcbiAgICAgICAgb2xkUGF0dGVybjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MjFcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NEJcdTA0MzkgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNEXCJcbiAgICAgICAgfSxcbiAgICAgICAgbmV3UGF0dGVybjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzkgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNEXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVhZGVyczoge1xuICAgICAgICBtYWluOiBcIlx1MDQxRlx1MDQzQlx1MDQzMFx1MDQzM1x1MDQzOFx1MDQzRCBPYnNpZGlhbiBFYXN5VHlwaW5nXCIsXG4gICAgICAgIGdpdGh1YkRldGFpbDogXCJcdTA0MUZcdTA0M0VcdTA0MzRcdTA0NDBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0MzVcdTA0MzUgXHUwNDNEXHUwNDMwIEdpdGh1YjogXCIsXG4gICAgICAgIGVuaGFuY2VkRWRpdGluZzogXCJcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzAgXHUwNDQzXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDQ4XHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgICAgICBjdXN0b21pemVFZGl0UnVsZTogXCJcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEZcIixcbiAgICAgICAgYXV0b2Zvcm1hdFNldHRpbmc6IFwiXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDMwIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgICAgICBkZXRhaWxlZFNldHRpbmc6IFwiXHUwNDFGXHUwNDNFXHUwNDM0XHUwNDQwXHUwNDNFXHUwNDMxXHUwNDNEXHUwNDMwXHUwNDRGIFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzMCBcdTA0M0RcdTA0MzhcdTA0MzZcdTA0MzVcIixcbiAgICAgICAgY3VzdG9tUmVnZXhwQmxvY2s6IFwiXHUwNDExXHUwNDNCXHUwNDNFXHUwNDNBIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzOFx1MDQ0NSBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0NDNcdTA0M0JcdTA0NEZcdTA0NDBcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5XCIsXG4gICAgICAgIGV4Y2x1ZGVGb2xkZXJzRmlsZXM6IFwiXHUwNDE4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQzOC9cdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0JcdTA0NEJcIixcbiAgICAgICAgZXhwZXJpbWVudGFsRmVhdHVyZXM6IFwiXHUwNDJEXHUwNDNBXHUwNDQxXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzOFwiLFxuICAgICAgICBhYm91dFJlZ2V4cDoge1xuICAgICAgICAgICAgaGVhZGVyOiBcIlx1MDQxNFx1MDQzQlx1MDQ0RiBcdTA0MzhcdTA0M0RcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNFIFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQ0M1x1MDQzQlx1MDQ0Rlx1MDQ0MFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0MzJcdTA0NEJcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcdTA0NDUgXHUwNDQxXHUwNDNDLiBcIixcbiAgICAgICAgICAgIHRleHQ6IFwiWWlmZW5nIE5ndXllbjogXHUwNDFBXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDNBXHUwNDNFXHUwNDM1IFx1MDQ0MFx1MDQ0M1x1MDQzQVx1MDQzRVx1MDQzMlx1MDQzRVx1MDQzNFx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRSBcdTA0M0ZcdTA0M0UgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDQzXHUwNDNCXHUwNDRGXHUwNDQwXHUwNDNEXHUwNDRCXHUwNDNDIFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Rlx1MDQzQ1wiLFxuICAgICAgICB9LFxuICAgICAgICBpbnN0cnVjdGlvbnNSZWdleHA6IHtcbiAgICAgICAgICAgIGhlYWRlcjogXCJcdTA0MThcdTA0M0RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQ0QiBcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCIFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQ0M1x1MDQzQlx1MDQ0Rlx1MDQ0MFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0MzJcdTA0NEJcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0Mzk6IFwiLFxuICAgICAgICAgICAgdGV4dDpcIlx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0NDUgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCIFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQ0M1x1MDQzQlx1MDQ0Rlx1MDQ0MFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0MzJcdTA0NEJcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzlcIixcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9taXplU2VsZWN0aW9uUnVsZTogXCJcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0QiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwXCIsXG4gICAgICAgIGN1c3RvbWl6ZURlbGV0ZVJ1bGU6IFwiXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzMCBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcIixcbiAgICAgICAgY3VzdG9taXplQ29udmVydFJ1bGU6IFwiXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEZcIixcbiAgICAgICAgZWRpdFNlbGVjdGlvblJlcGxhY2VSdWxlOiBcIlx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRCIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzBcIixcbiAgICB9LFxuICAgIGRyb3Bkb3duT3B0aW9uczoge1xuICAgICAgICBvbmx5V2hlblR5cGluZzogXCJcdTA0MjJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzRFx1MDQzMFx1MDQzMVx1MDQzRVx1MDQ0MFx1MDQzNSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzBcIixcbiAgICAgICAgZ2xvYmFsbHk6IFwiXHUwNDIwXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzM1x1MDQzQlx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRVwiLFxuICAgICAgICBub1JlcXVpcmU6IFwiXHUwNDFEXHUwNDM1XHUwNDQyIFx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzMVx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQzOVwiLFxuICAgICAgICBzb2Z0U3BhY2U6IFwiXHUwNDFDXHUwNDRGXHUwNDMzXHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlwiLFxuICAgICAgICBzdHJpY3RTcGFjZTogXCJcdTA0MjFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzNcdTA0MzhcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXCIsXG4gICAgICAgIGR1bW15OiBcIlx1MDQyNFx1MDQzOFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQzMlx1MDQzRFx1MDQ0Qlx1MDQzOVwiLFxuICAgICAgICBzbWFydDogXCJcdTA0MjNcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzlcIlxuICAgIH0sXG4gICAgdG9vbFRpcDoge1xuICAgICAgICBzd2l0Y2g6IFwiXHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM4XHUwNDQyXHUwNDRDXCIsXG4gICAgICAgIGVkaXRSdWxlOiBcIlx1MDQyMFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0M0VcIixcbiAgICAgICAgcmVtb3ZlUnVsZTogXCJcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDNFXCIsXG4gICAgICAgIGFkZFJ1bGU6IFwiXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzRVwiLFxuICAgIH0sXG4gICAgcGxhY2VIb2xkZXI6IHtcbiAgICAgICAgdHJpZ2dlclN5bWJvbDogXCJcdTA0MjFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0IgXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDMzXHUwNDMzXHUwNDM1XHUwNDQwXHUwNDMwXCIsXG4gICAgICAgIG5ld0xlZnRTaWRlU3RyaW5nOiBcIlx1MDQxRFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0RiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDQxIFx1MDQzQlx1MDQzNVx1MDQzMlx1MDQzRVx1MDQzOSBcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0M0VcdTA0M0RcdTA0NEJcIixcbiAgICAgICAgbmV3UmlnaHRTaWRlU3RyaW5nOiBcIlx1MDQxRFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0RiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDQxIFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzRVx1MDQzOSBcdTA0NDFcdTA0NDJcdTA0M0VcdTA0NDBcdTA0M0VcdTA0M0RcdTA0NEJcIixcbiAgICAgICAgYWRkUnVsZTogXCJcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDNFXCIsXG4gICAgICAgIG5vdGljZUludmFpZFRyaWdnZXI6IFwiXHUwNDFEXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzM1x1MDQzM1x1MDQzNVx1MDQ0MCwgXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDMzXHUwNDMzXHUwNDM1XHUwNDQwIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzNVx1MDQzRCBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDNDIFx1MDQzNFx1MDQzQlx1MDQzOFx1MDQzRFx1MDQzRVx1MDQzOSAxIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0M0VcdTA0M0MgXHUyMDE0XHUyMDE0LCBcdTIwMjZcdTIwMjZcIixcbiAgICAgICAgbm90aWNlV2FyblRyaWdnZXJFeGlzdHM6IFwiXHUwNDEyXHUwNDNEXHUwNDM4XHUwNDNDXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1ISBcdTA0MjJcdTA0NDBcdTA0MzhcdTA0MzNcdTA0MzNcdTA0MzVcdTA0NDAgJXMgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0MiFcIixcbiAgICAgICAgbm90aWNlTWlzc2luZ0lucHV0OiBcIlx1MDQxRVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0MzJcdTA0M0VcdTA0MzRcIixcbiAgICAgICAgYmVmb3JlRGVsZXRlOiBcIlx1MDQxNFx1MDQzRSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcIixcblx0XHRuZXdQYXR0ZXJuOiBcIlx1MDQxRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0RcIixcbiAgICAgICAgbm90aWNlSW52YWlkVHJpZ2dlclBhdHRlcm5Db250YWluU3ltYm9sOiBcIlx1MDQxRFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzNcdTA0MzNcdTA0MzVcdTA0NDAsIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzRCBcdTA0MzRcdTA0M0VcdTA0M0JcdTA0MzZcdTA0MzVcdTA0M0QgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQiBcXHwsIFx1MDQ0M1x1MDQzQVx1MDQzMFx1MDQzN1x1MDQ0Qlx1MDQzMlx1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0M0RcdTA0MzAgXHUwNDNGXHUwNDNFXHUwNDM3XHUwNDM4XHUwNDQ2XHUwNDM4XHUwNDRFIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MFx1MDQzMFwiLFxuICAgICAgICBiZWZvcmVDb252ZXJ0OiBcIlx1MDQxNFx1MDQzRSBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEZcIixcbiAgICAgICAgbm90aWNlSW52YWxpZFBhdHRlcm5TdHJpbmc6XCJcdTA0MURcdTA0MzVcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0MzBcdTA0NEYgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDMwIFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzRFx1MDQzMCFcIixcbiAgICB9LFxuICAgIGJ1dHRvbjoge1xuICAgICAgICB1cGRhdGU6IFwiXHUwNDFFXHUwNDMxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDXCIsXG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgbG9jYWxlO1xuIiwgImltcG9ydCB7IGVuVVMgfSBmcm9tIFwiLlwiO1xuXG5jb25zdCBsb2NhbGU6IHR5cGVvZiBlblVTID0ge1xuICAgIHNldHRpbmdzOiB7XG4gICAgICAgIHN5bWJvbEF1dG9QYWlyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1N0IyNlx1ODY1Rlx1ODFFQVx1NTJENVx1OTE0RFx1NUMwRFx1NTNDQVx1NTIyQVx1OTY2NFx1OTE0RFx1NUMwRFwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTU4OUVcdTUyQTBcdTU5MUFcdTdBMkVcdTdCMjZcdTg2NUZcdTkxNERcdTVDMERcdThGMzhcdTUxNjVcdUZGMENcdTkxNERcdTVDMERcdTUyMkFcdTk2NjRcdUZGMENcdTU5ODJcdTMwMEFcdTMwMEIsIFx1MjAxQ1x1MjAxRCwgXHUzMDBDXHUzMDBELCBcdTMwMEVcdTMwMEYsIFx1MzAxMFx1MzAxMVx1N0I0OVwiXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvblJlcGxhY2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU5MDc4XHU0RTJEXHU2NTg3XHU2NzJDXHU2NkZGXHU2M0RCXHU1ODlFXHU1RjNBXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1OTA3OFx1NEUyRFx1NjU4N1x1NjcyQ1x1NjBDNVx1NkNDMVx1NEUwQlx1NzY4NFx1N0RFOFx1OEYyRlx1NTg5RVx1NUYzQVx1RkYwQ1x1NjMwOVx1RkZFNVx1MjE5MiRcdTkwNzhcdTRFMkRcdTc2ODRcdTY1ODdcdTY3MkMkLCBcdTYzMDlcdTAwQjdcdTIxOTJgXHU5MDc4XHU0RTJEXHU3Njg0XHU2NTg3XHU2NzJDYFx1RkYwQ1x1MzAwQSBcdTIxOTIgXHUzMDBBXHU5MDc4XHU0RTJEXHU3Njg0XHU2NTg3XHU2NzJDXHUzMDBCXHU3QjQ5XHU3QjQ5XCJcbiAgICAgICAgfSxcbiAgICAgICAgZnVsbFdpZHRoVG9IYWxmV2lkdGg6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU5MDIzXHU3RThDXHU4RjM4XHU1MTY1XHU1MTY4XHU4OUQyXHU3QjI2XHU4NjVGXHU4RjQ5XHU1MzRBXHU4OUQyXHU3QjI2XHU4NjVGXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1OTAyM1x1N0U4Q1x1OEYzOFx1NTE2NVx1NTE2OFx1ODlEMlx1N0IyNlx1ODY1Rlx1OEY0OVx1NTM0QVx1ODlEMlx1RkYwQ1x1MzAwMlx1MzAwMlx1MjE5MiAuXHVGRjBDXHVGRjAxXHVGRjAxXHUyMTkyICFcdUZGMEMgXHUzMDBCXHUzMDBCXHUyMTkyID5cIlxuICAgICAgICB9LFxuICAgICAgICBiYXNpY0lucHV0RW5oYW5jZToge1xuICAgICAgICAgICAgbmFtZTogXCJPYnNpZGlhbiBcdTc2ODRcdTU3RkFcdTc5MEVcdTdCMjZcdTg2NUZcdThGMzhcdTUxNjVcdTU4OUVcdTVGM0FcIixcbiAgICAgICAgICAgIGRlc2M6IFwiT2JzaWRpYW4gXHU3Njg0XHU1N0ZBXHU3OTBFXHU4RjM4XHU1MTY1XHU1ODlFXHU1RjNBXHVGRjBDXHU1OTgyXHUzMDEwXHUzMDEwfCBcdTIxOTIgW1t8XV1cdUZGMENcdTUzRTVcdTk5OTZcdTc2ODRcdTMwMDFcdTIxOTIgL1x1RkYwQ1x1NTNFNVx1OTk5Nlx1NzY4NFx1MzAwQlx1MjE5MiA+XHVGRjBDXHUwMEI3XHUwMEI3fCBcdTIxOTIgYHxgXHVGRjBDIGBcdTAwQjd8YCBcdThCOEFcdTYyMTBcdTRFRTNcdTc4QkNcdTU4NEFcdUZGMENcdUZGRTVcdUZGRTV8IFx1MjE5MiAkfCRcIlxuICAgICAgICB9LFxuICAgICAgICBjb2RlYmxvY2tFZGl0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NTg5RVx1NUYzQVx1NEVFM1x1NzhCQ1x1NTg0QVx1N0RFOFx1OEYyRlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTU4OUVcdTVGM0FcdTRFRTNcdTc4QkNcdTU4NEFcdTUxNjdcdTc2ODRcdTdERThcdThGMkZcdUZGMDhDbWQvQ3RybCtBIFx1OTA3OFx1NEUyRFx1MzAwMVRhYlx1MzAwMVx1NTIyQVx1OTY2NFx1MzAwMVx1N0M5OFx1OENCQ1x1RkYwOVwiXG4gICAgICAgIH0sXG4gICAgICAgIHRhYk91dDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdThERjNcdTUxRkFcdTRFRTNcdTc4QkNcdTU4NEFcIixcbiAgICAgICAgICAgIGRlc2M6IFwiVGFiIFx1OERGM1x1NTFGQVx1ODg0Q1x1NTE2N1x1NEVFM1x1NzhCQ1x1NTg0QVx1NjIxNlx1OTE0RFx1NUMwRFx1N0IyNlx1ODY1Rlx1NTg0QShcdTkwNzhcdTRFMkRcdTY2NDIpXCJcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b0Zvcm1hdHRpbmc6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU4RjM4XHU1MTY1XHU2NjQyXHU4MUVBXHU1MkQ1XHU2ODNDXHU1RjBGXHU1MzE2XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NjYyRlx1NTQyNlx1NTcyOFx1N0RFOFx1OEYyRlx1NjU4N1x1NkE5NFx1NjY0Mlx1ODFFQVx1NTJENVx1NjgzQ1x1NUYwRlx1NTMxNlx1NjU4N1x1NjcyQ1x1RkYwQ1x1ODFFQVx1NTJENVx1NjgzQ1x1NUYwRlx1NTMxNlx1NzY4NFx1N0UzRFx1OTU4Qlx1OTVEQ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkNoaW5lc2VFbmdsaXNoOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NEUyRFx1NjU4N1x1ODIwN1x1ODJGMVx1NjU4N1x1NEU0Qlx1OTU5M1x1NzY4NFx1N0E3QVx1NjgzQ1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTU3MjhcdTRFMkRcdTY1ODdcdTU0OENcdTgyRjFcdTY1ODdcdTRFNEJcdTk1OTNcdTYzRDJcdTUxNjVcdTdBN0FcdTY4M0NcdUZGMENcdTUzRUZcdTUzRDZcdTZEODhcIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZUJldHdlZW5DaGluZXNlTnVtYmVyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NEUyRFx1NjU4N1x1ODIwN1x1NjU3OFx1NUI1N1x1NEU0Qlx1OTU5M1x1NzY4NFx1N0E3QVx1NjgzQ1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTU3MjhcdTRFMkRcdTY1ODdcdTU0OENcdTY1NzhcdTVCNTdcdTRFNEJcdTk1OTNcdTYzRDJcdTUxNjVcdTdBN0FcdTY4M0NcdUZGMENcdTUzRUZcdTUzRDZcdTZEODhcIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZUJldHdlZW5FbmdsaXNoTnVtYmVyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1ODJGMVx1NjU4N1x1ODIwN1x1NjU3OFx1NUI1N1x1NEU0Qlx1OTU5M1x1NzY4NFx1N0E3QVx1NjgzQ1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTU3MjhcdTgyRjFcdTY1ODdcdTU0OENcdTY1NzhcdTVCNTdcdTRFNEJcdTk1OTNcdTYzRDJcdTUxNjVcdTdBN0FcdTY4M0NcdUZGMENcdTUzRUZcdTUzRDZcdTZEODhcIlxuICAgICAgICB9LFxuICAgICAgICBkZWxldGVTcGFjZUJldHdlZW5DaGluZXNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NTIyQVx1OTY2NFx1NEUyRFx1NjU4N1x1NUI1N1x1N0IyNlx1OTU5M1x1NzY4NFx1N0E3QVx1NjgzQ1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTUzQkJcdTk2NjRcdTRFMkRcdTY1ODdcdTVCNTdcdTdCMjZcdTRFNEJcdTk1OTNcdTc2ODRcdTdBN0FcdTY4M0NcdUZGMENcdTRFMERcdTUzRUZcdTUzRDZcdTZEODhcIlxuICAgICAgICB9LFxuICAgICAgICBjYXBpdGFsaXplRmlyc3RMZXR0ZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1M0U1XHU5OTk2XHU1QjU3XHU2QkNEXHU1OTI3XHU1QkVCXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1ODJGMVx1NjU4N1x1NkJDRlx1NTAwQlx1NTNFNVx1OTk5Nlx1NUI1N1x1NkJDRFx1NTkyN1x1NUJFQlx1RkYwQ1x1NTNFRlx1NTNENlx1NkQ4OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHNtYXJ0SW5zZXJ0U3BhY2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU2NjdBXHU4MEZEXHU2M0QyXHU1MTY1XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTcyOFx1NjU4N1x1NjcyQ1x1NTQ4Q1x1NkExOVx1OUVERVx1NEU0Qlx1OTU5M1x1NjY3QVx1ODBGRFx1NjNEMlx1NTE2NVx1N0E3QVx1NjgzQ1wiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlU3RyYXRlZ3lJbmxpbmVDb2RlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1ODg0Q1x1NTE2N1x1NEVFM1x1NzhCQ1x1NTQ4Q1x1NjU4N1x1NjcyQ1x1NEU0Qlx1OTU5M1x1NzY4NFx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTcxMjFcdTg5ODFcdTZDNDJcdUZGMUFcdTVDMERcdTY3MkNcdTk4NUVcdTUyMjVcdTU4NEFcdTgyMDdcdTVERTZcdTUzRjNcdTY1ODdcdTY3MkNcdTZDOTJcdTY3MDlcdTdBN0FcdTY4M0NcdTc2ODRcdTg5ODFcdTZDNDJcdUZGMENcIiArXG4gICAgICAgICAgICAgICAgXCJcdThFREZcdTdBN0FcdTY4M0NcdUZGMUFcdTVDMERcdTY3MkNcdTk4NUVcdTUyMjVcdTU4NEFcdTgyMDdcdTU0NjhcdTU3MERcdTUzNDBcdTU4NEFcdTUzRUFcdTg5ODFcdTZDNDJcdTY3MDlcdThFREZcdTdBN0FcdTY4M0NcdUZGMENcdThFREZcdTdBN0FcdTY4M0NcdTU5ODJcdTc1NzZcdTUyNERcdTU4NEFcdTVERTZcdTkwOEFcdTc2ODRcdTgxRThcdThGRDFcdTY1ODdcdTY3MkNcdTcwQkFcdTMwMDJcdUZGMENcdUZGMUJcdUZGMUZcdTdCNDlcdTUxNjhcdTg5RDJcdTZBMTlcdTlFREVcdUZGMENcdTc1NzZcdTUyNERcdTU4NEFcdTUzRjNcdTkwOEFcdTc2ODRcdTgxRThcdThGRDFcdTY1ODdcdTY3MkNcdTcwQkFcdTYyNDBcdTY3MDlcdTUxNjhcdTUzNEFcdTg5RDJcdTZBMTlcdTlFREVcdUZGMENcIiArXG4gICAgICAgICAgICAgICAgXCJcdTU2QjRcdTY4M0NcdTdBN0FcdTY4M0NcdUZGMUFcdTc1NzZcdTUyNERcdTU4NEFcdTgyMDdcdTgxRThcdThGRDFcdTY1ODdcdTY3MkNcdTRFNEJcdTk1OTNcdTU2QjRcdTY4M0NcdTZERkJcdTUyQTBcdTdBN0FcdTY4M0NcdTMwMDJcIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZVN0cmF0ZWd5SW5saW5lRm9ybXVsYToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTg4NENcdTUxNjdcdTUxNkNcdTVGMEZcdTU0OENcdTY1ODdcdTY3MkNcdTRFNEJcdTk1OTNcdTc2ODRcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1QjlBXHU3RkE5XHU4ODRDXHU1MTY3XHU1MTZDXHU1RjBGXHU1NDhDXHU2NTg3XHU2NzJDXHU0RTRCXHU5NTkzXHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VTdHJhdGVneUxpbmtUZXh0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OTAyM1x1N0Q1MFx1NTQ4Q1x1NjU4N1x1NjcyQ1x1NEU0Qlx1OTU5M1x1NzY4NFx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTVCOUFcdTdGQTkgW1t3aWtpbGlua11dIFttZGxpbmtdKC4uLikgXHU1NDhDXHU2NTg3XHU2NzJDXHU0RTRCXHU5NTkzXHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCJcbiAgICAgICAgfSxcbiAgICAgICAgdXNlckRlZmluZWRSZWdleHBTd2l0Y2g6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU3NTI4XHU2MjM2XHU1QjlBXHU3RkE5XHU3Njg0XHU2QjYzXHU1MjQ3XHU4ODY4XHU5MDU0XHU1RjBGXHU5NThCXHU5NURDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1ODFFQVx1NUI5QVx1N0ZBOVx1NkI2M1x1NTI0N1x1ODg2OFx1OTA1NFx1NUYwRlx1OTU4Qlx1OTVEQ1x1RkYwQ1x1NTMzOVx1OTE0RFx1NTIzMFx1NzY4NFx1NTE2N1x1NUJCOVx1NEUwRFx1OTAzMlx1ODg0Q1x1NjgzQ1x1NUYwRlx1NTMxNlx1RkYwQ1x1NEUxNFx1NTNFRlx1NEVFNVx1OEEyRFx1N0Y2RVx1NTMzOVx1OTE0RFx1NTIzMFx1NzY4NFx1NTE2N1x1NUJCOVx1NTg0QVx1ODIwN1x1NTE3Nlx1NEVENlx1NTE2N1x1NUJCOVx1NEU0Qlx1OTU5M1x1NzY4NFx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVwiXG4gICAgICAgIH0sXG4gICAgICAgIHVzZXJEZWZpbmVkUmVnZXhwOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NzUyOFx1NjIzNlx1NUI5QVx1N0ZBOVx1NzY4NFx1NkI2M1x1NTI0N1x1ODg2OFx1OTA1NFx1NUYwRlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTc1MjhcdTYyMzZcdTgxRUFcdTVCOUFcdTdGQTlcdTZCNjNcdTUyNDdcdTg4NjhcdTkwNTRcdTVGMEZcdUZGMENcdTUzMzlcdTkxNERcdTUyMzBcdTc2ODRcdTUxNjdcdTVCQjlcdTRFMERcdTkwMzJcdTg4NENcdTY4M0NcdTVGMEZcdTUzMTZcdUZGMENcdTZCQ0ZcdTg4NENcdTRFMDBcdTUwMEJcdTg4NjhcdTkwNTRcdTVGMEZcdUZGMENcdTg4NENcdTVDM0VcdTRFMERcdTg5ODFcdTk2QThcdTYxMEZcdTUyQTBcdTdBN0FcdTY4M0NcdTMwMDJcIiArXG4gICAgICAgICAgICAgICAgXCJcdTZCQ0ZcdTg4NENcdTY3MkJcdTVDM0UzXHU1MDBCXHU1QjU3XHU3QjI2XHU3Njg0XHU1NkZBXHU1QjlBXHU3MEJBfFx1NTQ4Q1x1NTE2OVx1NTAwQlx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVx1N0IyNlx1ODY1Rlx1RkYwQ1x1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVx1N0IyNlx1ODY1Rlx1NzBCQS09K1x1RkYwQ1x1NTIwNlx1NTIyNVx1NEVFM1x1ODg2OFx1NEUwRFx1ODk4MVx1NkM0Mlx1N0E3QVx1NjgzQygtKVx1RkYwQ1x1OEVERlx1N0E3QVx1NjgzQyg9KVx1RkYwQ1x1NTZCNFx1NjgzQ1x1N0E3QVx1NjgzQygrKVx1MzAwMlwiICtcbiAgICAgICAgICAgICAgICBcIlx1OTAxOVx1NTE2OVx1NTAwQlx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVx1N0IyNlx1ODY1Rlx1NTIwNlx1NTIyNVx1NzBCQVx1NTMzOVx1OTE0RFx1NTM0MFx1NTg0QVx1NzY4NFx1NURFNlx1NTNGM1x1NTE2OVx1OTA4QVx1NzY4NFx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVwiXG4gICAgICAgIH0sXG4gICAgICAgIGV4Y2x1ZGVGb2xkZXJzRmlsZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU2MzkyXHU5NjY0XHU2NTg3XHU0RUY2XHU1OTNFL1x1NjU4N1x1NEVGNlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdThBNzJcdTYzRDJcdTRFRjZcdTVDMDdcdTZCQ0ZcdTg4NENcdTg5RTNcdTY3OTBcdTcwQkFcdTRFMDBcdTUwMEJcdTYzOTJcdTk2NjRcdTY1ODdcdTRFRjZcdTU5M0VcdTYyMTZcdTY1ODdcdTRFRjZcdTMwMDJcdTRGOEJcdTU5ODJcdUZGMUFEYWlseU5vdGUvLCBEYWlseU5vdGUvV2Vla05vdGVzLywgRGFpbHlOb3RlL3Rlc3QubWRcIlxuICAgICAgICB9LFxuICAgICAgICBmaXhNYWNPU0NvbnRleHRNZW51OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NEZFRVx1NUZBOSBNYWNPUyBcdTUzRjNcdTkzNzVcdTgzRENcdTU1QUVcdTUxNDlcdTZBMTlcdTRGNERcdTdGNkVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU0RkVFXHU1RkE5IE1hY09TIFx1OUYyMFx1NkExOVx1NTNGM1x1OTM3NVx1NTQ3Q1x1NTFGQVx1ODNEQ1x1NTVBRVx1NjY0Mlx1NTE0OVx1NkExOVx1OERGM1x1NTIzMFx1NEUwQlx1NEUwMFx1ODg0Q1x1NzY4NFx1NTU0Rlx1OTg0QyAoXHU5NzAwXHU4OTgxXHU5MUNEXHU1NTVGIE9ic2lkaWFuIFx1NzUxRlx1NjU0OClcIlxuICAgICAgICB9LFxuICAgICAgICBmaXhNaWNyb3NvZnRJTUU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU0RkVFXHU1RkE5XHU1RkFFXHU4RURGXHU4RjM4XHU1MTY1XHU2Q0Q1XHU1NTRGXHU5ODRDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1OTA2OVx1OTE0RFx1ODIwQVx1NzI0OFx1NUZBRVx1OEVERlx1OEYzOFx1NTE2NVx1NkNENVwiXG4gICAgICAgIH0sXG4gICAgICAgIHN0cmljdExpbmVCcmVha3M6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1NkI0XHU2ODNDXHU2M0RCXHU4ODRDXHU2QTIxXHU1RjBGXHU0RTBCXHU2MzA5XHU1MTY5XHU2QjIxXHU1NkRFXHU4RUNBXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTZCNFx1NjgzQ1x1NjNEQlx1ODg0Q1x1NzY4NFx1OEEyRFx1N0Y2RVx1NEUwQlx1RkYwQ1x1NTcyOFx1NjY2RVx1OTAxQVx1NjU4N1x1NjcyQ1x1ODg0Q1x1OTAzMlx1ODg0Q1x1NEUwMFx1NkIyMVx1NTZERVx1OEVDQVx1NjcwM1x1NzUyMlx1NzUxRlx1NTE2OVx1NTAwQlx1NjNEQlx1ODg0Q1x1N0IyNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHB1bmNSZWN0aWZ5OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NkExOVx1OUVERVx1NzdFQlx1NkI2M1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTUwQzVcdTU3MjhcdThGMzhcdTUxNjVcdTkwNEVcdTdBMEJcdTRFMkRcdUZGMENcdTRFMkRcdTY1ODdcdTk1OTNcdTc2ODRcdTgyRjFcdTY1ODdcdTZBMTlcdTlFREVcdUZGMDgsLj8hXHVGRjA5XHU4MUVBXHU1MkQ1XHU4RjQ5XHU2M0RCXHU3MEJBXHU1MTY4XHU4OUQyXHVGRjA4XHU1M0VGXHU1M0Q2XHU2RDg4XHVGRjA5XCJcbiAgICAgICAgfSxcbiAgICAgICAgcHJpbnREZWJ1Z0luZm86IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1NzI4XHU2M0E3XHU1MjM2XHU1M0YwXHU4RjM4XHU1MUZBXHU4QUJGXHU4QTY2XHU4Q0M3XHU4QTBBXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTcyOFx1NjNBN1x1NTIzNlx1NTNGMFx1OEYzOFx1NTFGQVx1OEFCRlx1OEE2Nlx1OENDN1x1OEEwQVwiXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvblJlcGxhY2VSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OTA3OFx1NEUyRFx1NjZGRlx1NjNEQlx1ODk4Rlx1NTI0N1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTc1MjhcdTYyMzZcdTVCOUFcdTdGQTlcdTc2ODRcdTkwNzhcdTRFMkRcdTY2RkZcdTYzREJcdTg5OEZcdTUyNDdcIlxuICAgICAgICB9LFxuICAgICAgICBkZWxldGVSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NTIyQVx1OTY2NFx1ODk4Rlx1NTI0N1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTg5OEZcdTUyNDdcdUZGMUFcdTc1MjggfCBcdTRFRTNcdTg4NjhcdTUxNDlcdTZBMTlcdTRGNERcdTdGNkVcdUZGMENcdTVGQzVcdTk4MDhcdTUzMDVcdTU0MkJcdTUxNDlcdTZBMTlcdTMwMDJcdTYzRDBcdTc5M0FcdUZGMUFcdTRGN0ZcdTc1MjggfCBcdTg4NjhcdTc5M0FcdTUxNDlcdTZBMTlcdTRGNERcdTdGNkVcdTMwMDJcIlxuICAgICAgICB9LFxuICAgICAgICBjb252ZXJ0UnVsZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdThGNDlcdTYzREJcdTg5OEZcdTUyNDdcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU4OThGXHU1MjQ3XHVGRjFBXHU3NTI4IHwgXHU0RUUzXHU4ODY4XHU1MTQ5XHU2QTE5XHU0RjREXHU3RjZFXHVGRjBDXHU1RkM1XHU5ODA4XHU1MzA1XHU1NDJCXHU1MTQ5XHU2QTE5XHUzMDAyXHU2M0QwXHU3OTNBXHVGRjFBXHU0RjdGXHU3NTI4IHwgXHU4ODY4XHU3OTNBXHU1MTQ5XHU2QTE5XHU0RjREXHU3RjZFXHUzMDAyXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHJpZ2dlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTg5RjhcdTc2N0NcdTU2NjhcIlxuICAgICAgICB9LFxuICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NURFNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHJpZ2h0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NTNGM1wiXG4gICAgICAgIH0sXG4gICAgICAgIG9sZFBhdHRlcm46IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU4MjBBXHU2QTIxXHU1RjBGXCJcbiAgICAgICAgfSxcbiAgICAgICAgbmV3UGF0dGVybjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTY1QjBcdTZBMjFcdTVGMEZcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIG1haW46IFwiT2JzaWRpYW4gRWFzeVR5cGluZyBcdTYzRDJcdTRFRjZcIixcbiAgICAgICAgZ2l0aHViRGV0YWlsOiBcIlx1OEE3M1x1NjBDNVx1ODk4QiBHaXRodWJcdUZGMUFcIixcbiAgICAgICAgZW5oYW5jZWRFZGl0aW5nOiBcIlx1NTg5RVx1NUYzN1x1N0RFOFx1OEYyRlx1OEEyRFx1N0Y2RVwiLFxuICAgICAgICBjdXN0b21pemVFZGl0UnVsZTogXCJcdTgxRUFcdTVCOUFcdTdGQTlcdTdERThcdThGMkZcdThGNDlcdTYzREJcdTg5OEZcdTUyNDdcIixcbiAgICAgICAgYXV0b2Zvcm1hdFNldHRpbmc6IFwiXHU4MUVBXHU1MkQ1XHU2ODNDXHU1RjBGXHU1MzE2XHU4QTJEXHU3RjZFXCIsXG4gICAgICAgIGRldGFpbGVkU2V0dGluZzogXCJcdThBNzNcdTdEMzBcdThBMkRcdTdGNkVcdTU5ODJcdTRFMEJcIixcbiAgICAgICAgY3VzdG9tUmVnZXhwQmxvY2s6IFwiXHU4MUVBXHU1QjlBXHU3RkE5XHU2QjYzXHU1MjQ3XHU1MzQwXHU1ODRBXCIsXG4gICAgICAgIGV4Y2x1ZGVGb2xkZXJzRmlsZXM6IFwiXHU2MzA3XHU1QjlBXHU2NTg3XHU0RUY2XHU0RTBEXHU4MUVBXHU1MkQ1XHU2ODNDXHU1RjBGXHU1MzE2XCIsXG4gICAgICAgIGV4cGVyaW1lbnRhbEZlYXR1cmVzOiBcIlx1NUJFNlx1OUE1N1x1NTI5Rlx1ODBGRFwiLFxuICAgICAgICBhYm91dFJlZ2V4cDoge1xuICAgICAgICAgICAgaGVhZGVyOiBcIlx1NkI2M1x1NTI0N1x1ODg2OFx1OTA1NFx1NUYwRlx1NzZGOFx1OTVEQ1x1NzdFNVx1OEI1OFx1RkYwQ1x1ODk4QiBcIixcbiAgICAgICAgICAgIHRleHQ6IFwiXHUzMDBBXHU5NjJFXHU0RTAwXHU1Q0YwXHVGRjFBXHU2QjYzXHU1MjQ3XHU4ODY4XHU5MDU0XHU1RjBGXHU3QzIxXHU2NjBFXHU2NTU5XHU3QTBCXHUzMDBCXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGluc3RydWN0aW9uc1JlZ2V4cDoge1xuICAgICAgICAgICAgaGVhZGVyOiBcIlx1NkI2M1x1NTI0N1x1ODg2OFx1OTA1NFx1NUYwRlx1ODk4Rlx1NTI0N1x1NEY3Rlx1NzUyOFx1OEFBQVx1NjYwRVx1ODIwN1x1NzkzQVx1NEY4Qlx1RkYxQSBcIixcbiAgICAgICAgICAgIHRleHQ6IFwiXHU4MUVBXHU1QjlBXHU3RkE5XHU2QjYzXHU1MjQ3XHU4ODY4XHU5MDU0XHU1RjBGXHU4OThGXHU1MjQ3XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGN1c3RvbWl6ZVNlbGVjdGlvblJ1bGU6IFwiXHU4MUVBXHU1QjlBXHU3RkE5XHU5MDc4XHU0RTJEXHU2NTg3XHU2NzJDXHU3REU4XHU4RjJGXHU1ODlFXHU1RjNBXHU4OThGXHU1MjQ3XCIsXG4gICAgICAgIGN1c3RvbWl6ZURlbGV0ZVJ1bGU6IFwiXHU4MUVBXHU1QjlBXHU3RkE5XHU1MjJBXHU5NjY0XHU3REU4XHU4RjJGXHU1ODlFXHU1RjNBXHU4OThGXHU1MjQ3XCIsXG4gICAgICAgIGN1c3RvbWl6ZUNvbnZlcnRSdWxlOiBcIlx1ODFFQVx1NUI5QVx1N0ZBOVx1N0RFOFx1OEYyRlx1OEY0OVx1NjNEQlx1ODk4Rlx1NTI0N1wiLFxuICAgICAgICBlZGl0U2VsZWN0aW9uUmVwbGFjZVJ1bGU6IFwiXHU3REU4XHU4RjJGXHU5MDc4XHU0RTJEXHU2NkZGXHU2M0RCXHU4OThGXHU1MjQ3XCIsXG4gICAgfSxcbiAgICBkcm9wZG93bk9wdGlvbnM6IHtcbiAgICAgICAgb25seVdoZW5UeXBpbmc6IFwiXHU4RjM4XHU1MTY1XHU2NjQyXHU3NTFGXHU2NTQ4XCIsXG4gICAgICAgIGdsb2JhbGx5OiBcIlx1NTE2OFx1NUM0MFx1NzUxRlx1NjU0OFwiLFxuICAgICAgICBub1JlcXVpcmU6IFwiXHU3MTIxXHU4OTgxXHU2QzQyXCIsXG4gICAgICAgIHNvZnRTcGFjZTogXCJcdThFREZcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgc3RyaWN0U3BhY2U6IFwiXHU1NkI0XHU2ODNDXHU3QTdBXHU2ODNDXCIsXG4gICAgICAgIGR1bW15OiBcIlx1NTQ0Nlx1N0E3QVx1NjgzQ1wiLFxuICAgICAgICBzbWFydDogXCJcdTY2N0FcdTgwRkRcdTdBN0FcdTY4M0NcIlxuICAgIH0sXG4gICAgdG9vbFRpcDoge1xuICAgICAgICBzd2l0Y2g6IFwiXHU1MjlGXHU4MEZEXHU5NThCXHU5NURDXCIsXG4gICAgICAgIGVkaXRSdWxlOiBcIlx1N0RFOFx1OEYyRlx1ODk4Rlx1NTI0N1wiLFxuICAgICAgICByZW1vdmVSdWxlOiBcIlx1NTIyQVx1OTY2NFx1ODk4Rlx1NTI0N1wiLFxuICAgICAgICBhZGRSdWxlOiBcIlx1NkRGQlx1NTJBMFx1ODk4Rlx1NTI0N1wiLFxuICAgIH0sXG4gICAgcGxhY2VIb2xkZXI6IHtcbiAgICAgICAgdHJpZ2dlclN5bWJvbDogXCJcdTg5RjhcdTc2N0NcdTdCMjZcIixcbiAgICAgICAgbmV3TGVmdFNpZGVTdHJpbmc6IFwiXHU1REU2XHU5MDhBXHU3QjI2XHU4NjVGXCIsXG4gICAgICAgIG5ld1JpZ2h0U2lkZVN0cmluZzogXCJcdTUzRjNcdTkwOEFcdTdCMjZcdTg2NUZcIixcbiAgICAgICAgYWRkUnVsZTogXCJcdTZERkJcdTUyQTBcdTg5OEZcdTUyNDdcIixcbiAgICAgICAgbm90aWNlSW52YWlkVHJpZ2dlcjogXCJcdTcxMjFcdTY1NDhcdTc2ODRcdTg5RjhcdTc2N0NcdTdCMjYsIFx1ODlGOFx1NzY3Q1x1N0IyNlx1NUZDNVx1OTgwOFx1NjYyRlx1NTVBRVx1NUI1N1x1N0IyNlx1NjIxNlx1ODAwNVx1NjYyRiBcdTIwMTRcdTIwMTRcdTMwMDFcdTIwMjZcdTIwMjZcIixcbiAgICAgICAgbm90aWNlV2FyblRyaWdnZXJFeGlzdHM6IFwiXHU3MTIxXHU2NTQ4XHU4OThGXHU1MjQ3ISBcdTg5RjhcdTc2N0NcdTdCMjYgJXMgXHU1REYyXHU1QjU4XHU1NzI4XCIsXG4gICAgICAgIG5vdGljZU1pc3NpbmdJbnB1dDogXCJtaXNzaW5nIGlucHV0XCIsXG4gICAgICAgIGJlZm9yZURlbGV0ZTogXCJcdTUyMkFcdTk2NjRcdTUyNER8XCIsXG4gICAgICAgIG5ld1BhdHRlcm46IFwiXHU4OUY4XHU3NjdDXHU4OThGXHU1MjQ3XHU1RjhDXHU1QjU3XHU0RTMyXHU2QTIxXHU1RjBGXCIsXG4gICAgICAgIG5vdGljZUludmFpZFRyaWdnZXJQYXR0ZXJuQ29udGFpblN5bWJvbDogXCJcdTcxMjFcdTY1NDhcdTg5OEZcdTUyNDcsIFx1OEY0OVx1NjNEQlx1NTI0RFx1NkEyMVx1NUYwRlx1NUZDNVx1OTgwOFx1NTMwNVx1NTQyQlx1NEVFM1x1ODg2OFx1NTE0OVx1NkExOVx1NEY0RFx1N0Y2RVx1NzY4NFx1N0IyNlx1ODY1RiB8XCIsXG4gICAgICAgIGJlZm9yZUNvbnZlcnQ6IFwiXHU4RjQ5XHU2M0RCXHU1MjREfFwiLFxuICAgICAgICBub3RpY2VJbnZhbGlkUGF0dGVyblN0cmluZzogXCJJbnZhbGlkIHBhdHRlcm4gc3RyaW5nIVwiLFxuICAgIH0sXG4gICAgYnV0dG9uOiB7XG4gICAgICAgIHVwZGF0ZTogXCJcdTY2RjRcdTY1QjBcIixcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7IiwgImltcG9ydCB7IGVuc3VyZVN5bnRheFRyZWUsIHN5bnRheFRyZWUgfSBmcm9tIFwiQGNvZGVtaXJyb3IvbGFuZ3VhZ2VcIjtcbmltcG9ydCB7IEVkaXRvclZpZXcgfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB7IEVkaXRvclN0YXRlIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuZXhwb3J0IGludGVyZmFjZSBDb2RlQmxvY2tJbmZvIHtcbiAgICBzdGFydF9wb3M6IG51bWJlcjtcbiAgICBlbmRfcG9zOiBudW1iZXI7XG4gICAgY29kZV9zdGFydF9wb3M6IG51bWJlcjtcbiAgICBjb2RlX2VuZF9wb3M6IG51bWJlcjtcbiAgICBsYW5ndWFnZTogc3RyaW5nO1xuICAgIGluZGVudDogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb2RlQmxvY2tJblBvcyhzdGF0ZTogRWRpdG9yU3RhdGUsIHBvczogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgbGV0IGNvZGVCbG9ja0luZm9zID0gZ2V0Q29kZUJsb2Nrc0luZm9zKHN0YXRlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVCbG9ja0luZm9zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwb3MgPj0gY29kZUJsb2NrSW5mb3NbaV0uc3RhcnRfcG9zICYmIHBvcyA8PSBjb2RlQmxvY2tJbmZvc1tpXS5lbmRfcG9zKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2RlQmxvY2tJbmZvSW5Qb3Moc3RhdGU6IEVkaXRvclN0YXRlLCBwb3M6IG51bWJlcik6IENvZGVCbG9ja0luZm8gfCBudWxsIHtcbiAgICBsZXQgY29kZUJsb2NrSW5mb3MgPSBnZXRDb2RlQmxvY2tzSW5mb3Moc3RhdGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZUJsb2NrSW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvcyA+PSBjb2RlQmxvY2tJbmZvc1tpXS5zdGFydF9wb3MgJiYgcG9zIDw9IGNvZGVCbG9ja0luZm9zW2ldLmVuZF9wb3MpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2RlQmxvY2tJbmZvc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdENvZGVCbG9ja0luUG9zKHZpZXc6IEVkaXRvclZpZXcsIHBvczogbnVtYmVyKTpib29sZWFuIHtcbiAgICBsZXQgY29kZUJsb2NrSW5mb3MgPSBnZXRDb2RlQmxvY2tzSW5mb3Modmlldy5zdGF0ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2RlQmxvY2tJbmZvcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocG9zID49IGNvZGVCbG9ja0luZm9zW2ldLnN0YXJ0X3BvcyAmJiBwb3MgPD0gY29kZUJsb2NrSW5mb3NbaV0uZW5kX3Bvcykge1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcjogY29kZUJsb2NrSW5mb3NbaV0uY29kZV9zdGFydF9wb3MsXG4gICAgICAgICAgICAgICAgICAgIGhlYWQ6IGNvZGVCbG9ja0luZm9zW2ldLmNvZGVfZW5kX3Bvc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29kZUJsb2Nrc0luZm9zKHN0YXRlOiBFZGl0b3JTdGF0ZSk6IENvZGVCbG9ja0luZm9bXXtcbiAgICBsZXQgaXNDb2RlQmxvY2tCZWdpbiA9IGZhbHNlO1xuICAgIGxldCBjb2RlQmxvY2tJbmZvczogQ29kZUJsb2NrSW5mb1tdID0gW107XG4gICAgbGV0IGN1ckNvZGVCbG9ja0luZm86IENvZGVCbG9ja0luZm8gfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBkb2MgPSBzdGF0ZS5kb2M7XG5cbiAgICBzeW50YXhUcmVlKHN0YXRlKS5pdGVyYXRlKHtcbiAgICAgICAgZW50ZXIobm9kZSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBub2RlLm5hbWU7XG4gICAgICAgICAgICBjb25zdCBub2RlRnJvbSA9IG5vZGUuZnJvbTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUbyA9IG5vZGUudG87XG4gICAgICAgICAgICBjb25zdCBub2RlVGV4dCA9IHN0YXRlLnNsaWNlRG9jKG5vZGVGcm9tLCBub2RlVG8pO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2cobm9kZU5hbWUsIG5vZGVGcm9tLCBub2RlVG8sIG5vZGVUZXh0KTtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZS5pbmNsdWRlcygnY29kZWJsb2NrLWJlZ2luJykpIHtcbiAgICAgICAgICAgICAgICBpc0NvZGVCbG9ja0JlZ2luID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRfcG9zID0gbm9kZUZyb20gKyBub2RlVGV4dC5pbmRleE9mKCdgJyk7XG4gICAgICAgICAgICAgICAgbGV0IGluZGVudCA9IHN0YXJ0X3BvcyAtIHN0YXRlLmRvYy5saW5lQXQoc3RhcnRfcG9zKS5mcm9tO1xuICAgICAgICAgICAgICAgIGxldCBsYW5ndWFnZSA9IG5vZGVUZXh0LnRyaW0oKS5zdWJzdHJpbmcoMyk7XG4gICAgICAgICAgICAgICAgY3VyQ29kZUJsb2NrSW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zOiBzdGFydF9wb3MsXG4gICAgICAgICAgICAgICAgICAgIGVuZF9wb3M6IC0xLFxuICAgICAgICAgICAgICAgICAgICBjb2RlX3N0YXJ0X3BvczogLTEsXG4gICAgICAgICAgICAgICAgICAgIGNvZGVfZW5kX3BvczogLTEsXG4gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiBpbmRlbnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lLmluY2x1ZGVzKCdjb2RlYmxvY2stZW5kJykpIHtcbiAgICAgICAgICAgICAgICBpc0NvZGVCbG9ja0JlZ2luID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGN1ckNvZGVCbG9ja0luZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJDb2RlQmxvY2tJbmZvLmVuZF9wb3MgPSBub2RlVG87XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb2MubGluZUF0KGN1ckNvZGVCbG9ja0luZm8uc3RhcnRfcG9zKS5udW1iZXIgPT1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5saW5lQXQoY3VyQ29kZUJsb2NrSW5mby5lbmRfcG9zKS5udW1iZXIgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDb2RlQmxvY2tJbmZvLmNvZGVfc3RhcnRfcG9zID0gZG9jLmxpbmVBdChjdXJDb2RlQmxvY2tJbmZvLnN0YXJ0X3BvcykudG87XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDb2RlQmxvY2tJbmZvLmNvZGVfZW5kX3BvcyA9IGRvYy5saW5lQXQoY3VyQ29kZUJsb2NrSW5mby5zdGFydF9wb3MpLnRvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvZGVfc3RhcnRfbGluZSA9IGRvYy5saW5lQXQoY3VyQ29kZUJsb2NrSW5mby5zdGFydF9wb3MpLm51bWJlciArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29kZV9lbmRfbGluZSA9IGRvYy5saW5lQXQoY3VyQ29kZUJsb2NrSW5mby5lbmRfcG9zKS5udW1iZXIgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ29kZUJsb2NrSW5mby5jb2RlX3N0YXJ0X3BvcyA9IGRvYy5saW5lKGNvZGVfc3RhcnRfbGluZSkuZnJvbSArIGN1ckNvZGVCbG9ja0luZm8uaW5kZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ29kZUJsb2NrSW5mby5jb2RlX2VuZF9wb3MgPSBkb2MubGluZShjb2RlX2VuZF9saW5lKS50bztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb2RlQmxvY2tJbmZvcy5wdXNoKGN1ckNvZGVCbG9ja0luZm8pO1xuICAgICAgICAgICAgICAgICAgICBjdXJDb2RlQmxvY2tJbmZvID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChpc0NvZGVCbG9ja0JlZ2luICYmIGN1ckNvZGVCbG9ja0luZm8pIHtcbiAgICAgICAgY3VyQ29kZUJsb2NrSW5mby5lbmRfcG9zID0gZG9jLmxlbmd0aDtcbiAgICAgICAgY3VyQ29kZUJsb2NrSW5mby5jb2RlX2VuZF9wb3MgPSBkb2MubGVuZ3RoO1xuICAgICAgICBpZiAoZG9jLmxpbmVzID4gZG9jLmxpbmVBdChjdXJDb2RlQmxvY2tJbmZvLnN0YXJ0X3BvcykubnVtYmVyKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRfbGluZSA9IGRvYy5saW5lQXQoY3VyQ29kZUJsb2NrSW5mby5zdGFydF9wb3MpLm51bWJlciArIDE7XG4gICAgICAgICAgICBsZXQgY29kZV9zdGFydF9wb3MgPSBkb2MubGluZShzdGFydF9saW5lKS5mcm9tICsgY3VyQ29kZUJsb2NrSW5mby5pbmRlbnQ7XG4gICAgICAgICAgICBjdXJDb2RlQmxvY2tJbmZvLmNvZGVfc3RhcnRfcG9zID0gY29kZV9zdGFydF9wb3MgPCBkb2MubGVuZ3RoID8gY29kZV9zdGFydF9wb3MgOlxuICAgICAgICAgICAgICAgIGRvYy5saW5lQXQoY3VyQ29kZUJsb2NrSW5mby5zdGFydF9wb3MgKyAxKS5mcm9tIDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1ckNvZGVCbG9ja0luZm8uY29kZV9zdGFydF9wb3MgPSBkb2MubGluZUF0KGN1ckNvZGVCbG9ja0luZm8uc3RhcnRfcG9zKS50bztcbiAgICAgICAgfVxuICAgICAgICBjb2RlQmxvY2tJbmZvcy5wdXNoKGN1ckNvZGVCbG9ja0luZm8pO1xuICAgICAgICBjdXJDb2RlQmxvY2tJbmZvID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvZGVCbG9ja0luZm9zO1xufVxuXG4iLCAiaW1wb3J0IHsgRWRpdG9yVmlldywgRGVjb3JhdGlvbiB9IGZyb20gXCJAY29kZW1pcnJvci92aWV3XCI7XG5pbXBvcnQgeyBFZGl0b3JTZWxlY3Rpb24sIFN0YXRlRWZmZWN0LCBTdGF0ZUZpZWxkLCBUcmFuc2FjdGlvbiB9IGZyb20gXCJAY29kZW1pcnJvci9zdGF0ZVwiO1xuaW1wb3J0IHsgVGFic3RvcEdyb3VwIH0gZnJvbSBcIi4vdGFic3RvcFwiO1xuXG5leHBvcnQgY29uc3QgYWRkVGFic3RvcHNFZmZlY3QgPSBTdGF0ZUVmZmVjdC5kZWZpbmU8VGFic3RvcEdyb3VwW10+KCk7XG5jb25zdCByZW1vdmVUYWJzdG9wRWZmZWN0ID0gU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5jb25zdCByZW1vdmVBbGxUYWJzdG9wc0VmZmVjdCA9IFN0YXRlRWZmZWN0LmRlZmluZSgpO1xuXG5leHBvcnQgY29uc3QgdGFic3RvcHNTdGF0ZUZpZWxkID0gU3RhdGVGaWVsZC5kZWZpbmU8VGFic3RvcEdyb3VwW10+KHtcbiAgICBjcmVhdGUoKXtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG5cbiAgICB1cGRhdGUodmFsdWU6IFRhYnN0b3BHcm91cFtdLCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pe1xuICAgICAgICBsZXQgdGFic3RvcEdyb3VwcyA9IHZhbHVlO1xuXHRcdHRhYnN0b3BHcm91cHMuZm9yRWFjaChncnAgPT4gZ3JwLm1hcCh0cmFuc2FjdGlvbi5jaGFuZ2VzKSk7XG5cblx0XHRmb3IgKGNvbnN0IGVmZmVjdCBvZiB0cmFuc2FjdGlvbi5lZmZlY3RzKSB7XG5cdFx0XHRpZiAoZWZmZWN0LmlzKGFkZFRhYnN0b3BzRWZmZWN0KSkge1xuICAgICAgICAgICAgICAgIHRhYnN0b3BHcm91cHMgPSBbXTtcblx0XHRcdFx0dGFic3RvcEdyb3Vwcy51bnNoaWZ0KC4uLmVmZmVjdC52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChlZmZlY3QuaXMocmVtb3ZlVGFic3RvcEVmZmVjdCkpIHtcblx0XHRcdFx0dGFic3RvcEdyb3Vwcy5zaGlmdCgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoZWZmZWN0LmlzKHJlbW92ZUFsbFRhYnN0b3BzRWZmZWN0KSkge1xuXHRcdFx0XHR0YWJzdG9wR3JvdXBzID0gW107XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhYnN0b3BHcm91cHM7XG4gICAgfSxcblxuICAgIHByb3ZpZGU6IChmaWVsZCkgPT4ge1xuXHRcdHJldHVybiBFZGl0b3JWaWV3LmRlY29yYXRpb25zLm9mKHZpZXcgPT4ge1xuXHRcdFx0Ly8gXCJGbGF0dGVuXCIgdGhlIGFycmF5IG9mIERlY29yYXRpb25TZXRzIHRvIHByb2R1Y2UgYSBzaW5nbGUgRGVjb3JhdGlvblNldFxuXHRcdFx0Y29uc3QgdGFic3RvcEdyb3VwcyA9IHZpZXcuc3RhdGUuZmllbGQoZmllbGQpO1xuICAgICAgICAgICAgXG5cdFx0XHRjb25zdCBkZWNvcyA9IFtdO1xuXG5cdFx0XHRpZiAodGFic3RvcEdyb3Vwcy5sZW5ndGggPj0gMil7XG5cdFx0XHRcdGRlY29zLnB1c2goLi4udGFic3RvcEdyb3Vwc1sxXS5nZXREZWNvUmFuZ2VzKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gRGVjb3JhdGlvbi5zZXQoZGVjb3MsIHRydWUpO1xuXHRcdH0pO1xuXHR9XG59KTtcblxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFic3RvcEdyb3Vwc0Zyb21WaWV3KHZpZXc6IEVkaXRvclZpZXcpIHtcblx0Y29uc3QgY3VycmVudFRhYnN0b3BHcm91cHMgPSB2aWV3LnN0YXRlLmZpZWxkKHRhYnN0b3BzU3RhdGVGaWVsZCk7XG5cblx0cmV0dXJuIGN1cnJlbnRUYWJzdG9wR3JvdXBzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkVGFic3RvcHModmlldzogRWRpdG9yVmlldywgdGFic3RvcEdyb3VwczogVGFic3RvcEdyb3VwW10pIHtcblx0dmlldy5kaXNwYXRjaCh7XG5cdFx0ZWZmZWN0czogW2FkZFRhYnN0b3BzRWZmZWN0Lm9mKHRhYnN0b3BHcm91cHMpXSxcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVUYWJzdG9wKHZpZXc6IEVkaXRvclZpZXcpIHtcblx0dmlldy5kaXNwYXRjaCh7XG5cdFx0ZWZmZWN0czogW3JlbW92ZVRhYnN0b3BFZmZlY3Qub2YobnVsbCldLFxuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFsbFRhYnN0b3BzKHZpZXc6IEVkaXRvclZpZXcpIHtcblx0dmlldy5kaXNwYXRjaCh7XG5cdFx0ZWZmZWN0czogW3JlbW92ZUFsbFRhYnN0b3BzRWZmZWN0Lm9mKG51bGwpXSxcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRUYWJzdG9wc0FuZFNlbGVjdCh2aWV3OiBFZGl0b3JWaWV3LCB0YWJzdG9wR3JvdXBzOiBUYWJzdG9wR3JvdXBbXSkge1xuICAgIGFkZFRhYnN0b3BzKHZpZXcsIHRhYnN0b3BHcm91cHMpO1xuICAgIHRhYnN0b3BHcm91cHNbMF0uc2VsZWN0KHZpZXcsIGZhbHNlKTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gdGlkeVRhYnN0b3BzKHZpZXc6IEVkaXRvclZpZXcpIHtcblx0Ly8gQ2xlYXIgYWxsIHRhYnN0b3AgZ3JvdXBzIGlmIHRoZXJlJ3MganVzdCBvbmUgcmVtYWluaW5nXG5cdGNvbnN0IGN1cnJlbnRUYWJzdG9wR3JvdXBzID0gZ2V0VGFic3RvcEdyb3Vwc0Zyb21WaWV3KHZpZXcpO1xuXG5cdGlmIChjdXJyZW50VGFic3RvcEdyb3Vwcy5sZW5ndGggPT09IDEpIHtcblx0XHRyZW1vdmVBbGxUYWJzdG9wcyh2aWV3KTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnNpZGVBVGFic3RvcCh2aWV3OiBFZGl0b3JWaWV3KTpib29sZWFuIHtcblx0Y29uc3QgY3VycmVudFRhYnN0b3BHcm91cHMgPSBnZXRUYWJzdG9wR3JvdXBzRnJvbVZpZXcodmlldyk7XG5cblx0Zm9yIChjb25zdCB0YWJzdG9wR3JvdXAgb2YgY3VycmVudFRhYnN0b3BHcm91cHMpIHtcblx0XHRpZiAodGFic3RvcEdyb3VwLmNvbnRhaW5zU2VsZWN0aW9uKHZpZXcuc3RhdGUuc2VsZWN0aW9uKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnNpZGVDdXJUYWJzdG9wKHZpZXc6IEVkaXRvclZpZXcpOmJvb2xlYW4ge1xuXHRjb25zdCBjdXJyZW50VGFic3RvcEdyb3VwcyA9IGdldFRhYnN0b3BHcm91cHNGcm9tVmlldyh2aWV3KTtcblxuXHRpZiAoY3VycmVudFRhYnN0b3BHcm91cHMubGVuZ3RoPjEgJiYgY3VycmVudFRhYnN0b3BHcm91cHNbMF0uY29udGFpbnNTZWxlY3Rpb24odmlldy5zdGF0ZS5zZWxlY3Rpb24pKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lQW5kR290b05leHRUYWJzdG9wKHZpZXc6IEVkaXRvclZpZXcpOiBib29sZWFuIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYmVmb3JlLWNvbnN1bWUnLCBnZXRUYWJzdG9wR3JvdXBzRnJvbVZpZXcodmlldykpXG5cdC8vIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGN1cnJlbnRseSBhbnkgdGFic3RvcHNcblx0aWYgKGdldFRhYnN0b3BHcm91cHNGcm9tVmlldyh2aWV3KS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuXHQvLyBSZW1vdmUgdGhlIHRhYnN0b3AgdGhhdCB3ZSdyZSBpbnNpZGUgb2Zcblx0cmVtb3ZlVGFic3RvcCh2aWV3KTtcblxuXHQvLyBTZWxlY3QgdGhlIG5leHQgdGFic3RvcFxuXHRjb25zdCBvbGRTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcblx0Y29uc3QgbmV4dEdycCA9IGdldFRhYnN0b3BHcm91cHNGcm9tVmlldyh2aWV3KVswXTtcblx0aWYgKCFuZXh0R3JwKSByZXR1cm4gZmFsc2U7XG5cblx0Ly8gSWYgdGhlIG9sZCB0YWJzdG9wKHMpIGxpZSB3aXRoaW4gdGhlIG5ldyB0YWJzdG9wKHMpLCBzaW1wbHkgbW92ZSB0aGUgY3Vyc29yXG5cdGNvbnN0IHNob3VsZE1vdmVUb0VuZHBvaW50cyA9IG5leHRHcnAuY29udGFpbnNTZWxlY3Rpb24ob2xkU2VsKTtcblx0bmV4dEdycC5zZWxlY3Qodmlldywgc2hvdWxkTW92ZVRvRW5kcG9pbnRzKTtcblxuXHQvLyBJZiB3ZSBoYXZlbid0IG1vdmVkLCBnbyBhZ2FpblxuXHRjb25zdCBuZXdTZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcblxuXHRpZiAob2xkU2VsLmVxKG5ld1NlbCkpXG5cdFx0cmV0dXJuIGNvbnN1bWVBbmRHb3RvTmV4dFRhYnN0b3Aodmlldyk7XG5cblx0Ly8gSWYgdGhpcyB3YXMgdGhlIGxhc3QgdGFic3RvcCBncm91cCB3YWl0aW5nIHRvIGJlIHNlbGVjdGVkLCByZW1vdmUgaXRcblx0dGlkeVRhYnN0b3BzKHZpZXcpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdhZnRlci1jb25zdW1lJywgZ2V0VGFic3RvcEdyb3Vwc0Zyb21WaWV3KHZpZXcpKVxuXHRyZXR1cm4gdHJ1ZTtcbn1cbiIsICJpbXBvcnQgeyBDaGFuZ2VEZXNjLCBFZGl0b3JTZWxlY3Rpb24sIFNlbGVjdGlvblJhbmdlIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uU2V0LCBFZGl0b3JWaWV3LCBXaWRnZXRUeXBlIH0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcblxuXG5jb25zdCBUQUJTVE9QX0RFQ09fQ0xBU1MgPSBcImVhc3ktdHlwaW5nLXRhYnN0b3BzXCI7XG5jb25zdCBDVVJTT1JfV0lER0VUX0NMQVNTID0gXCJlYXN5LXR5cGluZy1jdXJzb3Itd2lkZ2V0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFic3RvcFNwZWMge1xuICAgIG51bWJlcjogbnVtYmVyLFxuICAgIGZyb206IG51bWJlcixcbiAgICB0bzogbnVtYmVyXG59XG5cbmZ1bmN0aW9uIGdldE1hcmtlckRlY29yYXRpb24oZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gYCR7VEFCU1RPUF9ERUNPX0NMQVNTfWA7XG5cbiAgICBpZiAoZnJvbT09dG8pe1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbi53aWRnZXQoe1xuICAgICAgICAgICAgd2lkZ2V0OiBuZXcgQ3Vyc29yV2lkZ2V0KCksXG4gICAgICAgICAgICBzaWRlOiAxLFxuICAgICAgICB9KS5yYW5nZShmcm9tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gRGVjb3JhdGlvbi5tYXJrKHtcbiAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICBjbGFzczogY2xhc3NOYW1lLFxuICAgIH0pLnJhbmdlKGZyb20sIHRvKTtcbn1cblxuZXhwb3J0IGNsYXNzIFRhYnN0b3BHcm91cCB7XG4gICAgZGVjb3M6IERlY29yYXRpb25TZXQ7XG4gICAgc2VsZWN0aW9uczogU2VsZWN0aW9uUmFuZ2VbXTtcblxuICAgIGNvbnN0cnVjdG9yKHRhYnN0b3BTcGVjczogVGFic3RvcFNwZWNbXSkge1xuICAgICAgICAvLyBjb25zdCB0YWJzdG9wU3BlY3NSYW5nZSA9IHRhYnN0b3BTcGVjcy5maWx0ZXIoc3BlYyA9PiBzcGVjLmZyb20gIT0gc3BlYy50byk7XG4gICAgICAgIGNvbnN0IGRlY29zID0gdGFic3RvcFNwZWNzLm1hcChzcGVjID0+IGdldE1hcmtlckRlY29yYXRpb24oc3BlYy5mcm9tLCBzcGVjLnRvKSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9ucyA9IHRhYnN0b3BTcGVjcy5tYXAoc3BlYyA9PiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2Uoc3BlYy5mcm9tLCBzcGVjLnRvKSk7XG4gICAgICAgIHRoaXMuZGVjb3MgPSBEZWNvcmF0aW9uLnNldChkZWNvcywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2VsZWN0KHZpZXc6IEVkaXRvclZpZXcsIHNlbGVjdEVuZHBvaW50czogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzZWwgPSB0aGlzLnRvRWRpdG9yU2VsZWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IHRvU2VsZWN0ID0gc2VsZWN0RW5kcG9pbnRzID8gZ2V0RWRpdG9yU2VsZWN0aW9uRW5kcG9pbnRzKHNlbCkgOiBzZWw7XG5cbiAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBzZWxlY3Rpb246IHRvU2VsZWN0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0b1NlbGVjdGlvblJhbmdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9ucztcbiAgICB9XG5cbiAgICB0b0VkaXRvclNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5jcmVhdGUodGhpcy50b1NlbGVjdGlvblJhbmdlcygpKTtcbiAgICB9XG5cbiAgICBjb250YWluc1NlbGVjdGlvbihzZWxlY3Rpb246IEVkaXRvclNlbGVjdGlvbikge1xuICAgICAgICBmdW5jdGlvbiByYW5nZUxpZXNXaXRoaW5TZWxlY3Rpb24ocmFuZ2U6IFNlbGVjdGlvblJhbmdlLCBzZWw6IFNlbGVjdGlvblJhbmdlW10pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VsUmFuZ2Ugb2Ygc2VsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbFJhbmdlLmZyb20gPD0gcmFuZ2UuZnJvbSAmJiBzZWxSYW5nZS50byA+PSByYW5nZS50bykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgY29uc3QgdGFic3RvcFJhbmdlcyA9IHRoaXMudG9TZWxlY3Rpb25SYW5nZXMoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgXG4gICAgICAgIGZvciAoY29uc3QgcmFuZ2Ugb2Ygc2VsZWN0aW9uLnJhbmdlcykge1xuICAgICAgICAgICAgaWYgKCFyYW5nZUxpZXNXaXRoaW5TZWxlY3Rpb24ocmFuZ2UsIHRhYnN0b3BSYW5nZXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBtYXAoY2hhbmdlczogQ2hhbmdlRGVzYykge1xuICAgICAgICB0aGlzLmRlY29zID0gdGhpcy5kZWNvcy5tYXAoY2hhbmdlcyk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9ucyA9IHRoaXMuc2VsZWN0aW9ucy5tYXAocmFuZ2UgPT4ge1xuICAgICAgICAgICAgbGV0IHJhbmdlRnJvbSA9IGNoYW5nZXMubWFwUG9zKHJhbmdlLmZyb20sIC0xKTtcbiAgICAgICAgICAgIGxldCByYW5nZVRvID0gY2hhbmdlcy5tYXBQb3MocmFuZ2UudG8sIDEpO1xuICAgICAgICAgICAgcmV0dXJuIEVkaXRvclNlbGVjdGlvbi5yYW5nZShyYW5nZUZyb20sIHJhbmdlVG8pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgZ2V0RGVjb1JhbmdlcygpIHtcbiAgICAgICAgY29uc3QgcmFuZ2VzID0gW107XG4gICAgICAgIGNvbnN0IGN1ciA9IHRoaXMuZGVjb3MuaXRlcigpO1xuXG4gICAgICAgIHdoaWxlIChjdXIudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN1ci5mcm9tICE9IGN1ci50byl7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goY3VyLnZhbHVlLnJhbmdlKGN1ci5mcm9tLCBjdXIudG8pKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJhbmdlcy5wdXNoKGN1ci52YWx1ZS5yYW5nZShjdXIuZnJvbSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmFuZ2VzLnB1c2goY3VyLnZhbHVlLnJhbmdlKGN1ci5mcm9tLCBjdXIudG8pKTtcbiAgICAgICAgICAgIGN1ci5uZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRhYnN0b3BTcGVjc1RvVGFic3RvcEdyb3Vwcyh0YWJzdG9wczogVGFic3RvcFNwZWNbXSk6VGFic3RvcEdyb3VwW10ge1xuICAgIGNvbnN0IHRhYnN0b3BzQnlOdW1iZXI6IHtbbjogc3RyaW5nXTogVGFic3RvcFNwZWNbXX0gPSB7fTtcblxuICAgIGZvciAoY29uc3QgdGFic3RvcCBvZiB0YWJzdG9wcykge1xuICAgICAgICBjb25zdCBuID0gU3RyaW5nKHRhYnN0b3AubnVtYmVyKTtcblxuICAgICAgICBpZiAodGFic3RvcHNCeU51bWJlcltuXSkge1xuICAgICAgICAgICAgdGFic3RvcHNCeU51bWJlcltuXS5wdXNoKHRhYnN0b3ApO1xuXHRcdH1cblx0XHRlbHNlIHtcbiAgICAgICAgICAgIHRhYnN0b3BzQnlOdW1iZXJbbl0gPSBbdGFic3RvcF07XG5cdFx0fVxuXHR9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBudW1iZXJzID0gT2JqZWN0LmtleXModGFic3RvcHNCeU51bWJlcik7XG4gICAgbnVtYmVycy5zb3J0KChhLGIpID0+IHBhcnNlSW50KGEpIC0gcGFyc2VJbnQoYikpO1xuXG4gICAgZm9yIChjb25zdCBudW1iZXIgb2YgbnVtYmVycykge1xuICAgICAgICBjb25zdCBncnAgPSBuZXcgVGFic3RvcEdyb3VwKHRhYnN0b3BzQnlOdW1iZXJbbnVtYmVyXSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKGdycCk7XG4gICAgfVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZGl0b3JTZWxlY3Rpb25FbmRwb2ludHMoc2VsOiBFZGl0b3JTZWxlY3Rpb24pIHtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBzZWwucmFuZ2VzLm1hcChyYW5nZSA9PiBFZGl0b3JTZWxlY3Rpb24ucmFuZ2UocmFuZ2UudG8sIHJhbmdlLnRvKSk7XG5cbiAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZShlbmRwb2ludHMpO1xufVxuXG5jbGFzcyBDdXJzb3JXaWRnZXQgZXh0ZW5kcyBXaWRnZXRUeXBlIHtcblxuICAgIGVxKHdpZGdldDogV2lkZ2V0VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0b0RPTSh2aWV3OiBFZGl0b3JWaWV3KTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBjdXJzb3JFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBjdXJzb3JFbC5jbGFzc05hbWUgPSBgJHtDVVJTT1JfV0lER0VUX0NMQVNTfWA7XG4gICAgICAgIGN1cnNvckVsLnRleHRDb250ZW50ID0gJ3wnO1xuICAgICAgICByZXR1cm4gY3Vyc29yRWw7XG4gICAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUVBLEtBQUMsV0FBVztBQUNSO0FBRUEsVUFBSSxLQUFLO0FBQUEsUUFDTCxZQUFZO0FBQUEsUUFDWixVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsUUFDVixlQUFlO0FBQUEsUUFDZixRQUFRO0FBQUEsUUFDUixhQUFhO0FBQUEsUUFDYixNQUFNO0FBQUEsUUFDTixVQUFVO0FBQUEsUUFDVixNQUFNO0FBQUEsUUFDTixRQUFRO0FBQUEsUUFDUixhQUFhO0FBQUEsUUFDYixLQUFLO0FBQUEsUUFDTCxZQUFZO0FBQUEsUUFDWixjQUFjO0FBQUEsUUFDZCxNQUFNO0FBQUEsTUFDVjtBQUVBLHdCQUFpQixLQUFLO0FBRWxCLGVBQU8sZUFBZSxjQUFjLEdBQUcsR0FBRyxTQUFTO0FBQUEsTUFDdkQ7QUFFQSx3QkFBa0IsS0FBSyxNQUFNO0FBQ3pCLGVBQU8sU0FBUSxNQUFNLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQUEsTUFD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
diff --git a/.obsidian/plugins/easy-typing-obsidian/manifest.json b/.obsidian/plugins/easy-typing-obsidian/manifest.json
new file mode 100644
index 0000000..b3cde12
--- /dev/null
+++ b/.obsidian/plugins/easy-typing-obsidian/manifest.json
@@ -0,0 +1,11 @@
+{
+ "id": "easy-typing-obsidian",
+ "name": "Easy Typing",
+ "version": "5.5.0",
+ "minAppVersion": "0.15.0",
+ "description": "Autoformat your note as typing.(Auto captalize, autospace)",
+ "author": "yaozhuwa",
+ "authorUrl": "https://github.com/Yaozhuwa",
+ "isDesktopOnly": false,
+ "fundingUrl": "https://www.buymeacoffee.com/yaozhuwa"
+}
\ No newline at end of file
diff --git a/.obsidian/plugins/easy-typing-obsidian/styles.css b/.obsidian/plugins/easy-typing-obsidian/styles.css
new file mode 100644
index 0000000..9ab536c
--- /dev/null
+++ b/.obsidian/plugins/easy-typing-obsidian/styles.css
@@ -0,0 +1,17 @@
+span[class="easy-typing-tabstops"] {
+ border-radius: 2px;
+ background-color: #87cefa2e;
+ outline: #87cefa6e solid 1px;
+}
+
+span[class="easy-typing-cursor-widget"] {
+ color: #1364ce6e;
+ /* animation: blink 1s step-start 0s infinite; */
+ display: inline;
+ position: absolute;
+ white-space: pre;
+}
+
+/* @keyframes blink {
+ 50% { opacity: 0; }
+} */
\ No newline at end of file
diff --git a/.obsidian/themes/Border/manifest.json b/.obsidian/themes/Border/manifest.json
new file mode 100644
index 0000000..e642eda
--- /dev/null
+++ b/.obsidian/themes/Border/manifest.json
@@ -0,0 +1,7 @@
+{
+ "name": "Border",
+ "version": "1.9.8",
+ "minAppVersion": "0.16.0",
+ "author": "Akifyss",
+ "authorUrl": "https://github.com/Akifyss"
+}
diff --git a/.obsidian/themes/Border/theme.css b/.obsidian/themes/Border/theme.css
new file mode 100644
index 0000000..caf7c6a
--- /dev/null
+++ b/.obsidian/themes/Border/theme.css
@@ -0,0 +1,9019 @@
+/* @settings
+
+name: Theme Info
+id: Info
+settings:
+ -
+ id: Extras-info
+ description: "🎨 Appearance presets: [get presets here](https://github.com/Akifyss/obsidian-border/blob/main/presets.md), click on “Import” in the top right corner and restart obsidian. 📭 If you have problems, please submit [issues](https://github.com/Akifyss/obsidian-border/issues) or [discuss](https://github.com/Akifyss/obsidian-border/discussions) on Github 🔼 View recent updates: [Github Commit History](https://github.com/Akifyss/obsidian-border/commits/main)"
+ description.zh: "🎨 外观预设:[在此获取预设](https://github.com/Akifyss/obsidian-border/blob/main/presets.md),点击右上角“Import”导入预设,重启obsidian来生效. 📭 如果遇到问题,可以在Github上 [提交issues](https://github.com/Akifyss/obsidian-border/issues) 或[讨论](https://github.com/Akifyss/obsidian-border/discussions) 🔼 查看最近更新:[Github Commit History](https://github.com/Akifyss/obsidian-border/commits/main)"
+ type: info-text
+ markdown: true
+*/
+
+
+/* @settings
+
+name: Components
+id: Components
+settings:
+ -
+ id: autohide
+ title: Auto hide
+ title.zh: 自动隐藏
+ type: heading
+ collapsed: ture
+ level: 3
+ -
+ id: tab-autohide
+ title: Auto hide tab bar
+ title.zh: 自动隐藏 tab栏
+ description: Mac users can adjust the position of the traffic light using the 'Electron Window Tweaker' plugin
+ description.zh: Mac 用户可以使用 “Electron Window Tweaker” 插件来调整左上角红绿灯的位置
+ type: class-toggle
+ -
+ id: status-bar-autohide
+ title: Auto hide bottom status bar
+ title.zh: 自动隐藏 底部状态栏
+ type: class-toggle
+ -
+ id: Ribbon-autohide
+ title: Auto hide left ribbon menu
+ title.zh: 自动隐藏 左侧功能区菜单
+ type: class-toggle
+ -
+ id: nav-header-autohide
+ title: Auto hide header icons in sidepane
+ title.zh: 自动隐藏 侧边面板中的头部按钮
+ type: class-toggle
+ -
+ id: tab-title-bar-autohide
+ title: Auto hide tab title bar
+ title.zh: 自动隐藏 标签页标题栏
+ type: class-toggle
+ -
+ id: file-explorer
+ title: File explorer
+ title.zh: 文件列表
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: CTA-BTN-enable
+ title: Enable bigger "New note" button
+ title.zh: 启用 更大的“New Note”按钮
+ type: class-toggle
+ -
+ id: file-names-untrim
+ title: Untrim file names
+ title.zh: 不修剪文件名
+ type: class-toggle
+ -
+ id: folder-font-bold
+ title: Bold folder font
+ title.zh: 加粗文件夹字体
+ type: class-toggle
+ -
+ id: file-explorer-icon
+ title: icon
+ title.zh: 图标
+ type: heading
+ collapsed: false
+ level: 4
+ -
+ id: file-icon-remove
+ title: Remove custom icon
+ title.zh: 移除 自定义图标
+ type: class-toggle
+ -
+ id: colorful-folder
+ title: Enable colorful folder icon
+ title.zh: 启用 多彩文件夹图标
+ type: class-toggle
+ -
+ id: outline-panel
+ title: Outline Panel
+ title.zh: 大纲面板
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: outline-enhanced
+ title: Enable enhanced outline style
+ title.zh: 启用 增强的大纲样式
+ description: from https://github.com/subframe7536/obsidian-theme-maple, author:@subframe7536
+ type: class-toggle
+ -
+ id: New-tab
+ title: New tab
+ title.zh: 新标签页
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: new-tab-btn-select
+ title: New tab buttons
+ title.zh: 新标签页 按钮
+ type: class-select
+ allowEmpty: false
+ default: new-tab-btn-default
+ options:
+ - label: text buttons (obsidian default)
+ value: new-tab-text-btn-restore
+ - label: default
+ value: new-tab-btn-default
+ -
+ id: new-tab-image-select
+ title: New tab image
+ title.zh: 新标签页 图像
+ type: class-select
+ allowEmpty: false
+ default: new-tab-image-default
+ options:
+ - label: none
+ value: new-tab-image-none
+ - label: obsidian logo
+ value: new-tab-image-default
+ - label: old default
+ value: new-tab-image-old
+ - label: customize image
+ value: new-tab-image-customize
+ -
+ id: new-tab-image
+ title: customize new tab image
+ title.zh: 自定义新标签页图像
+ type: variable-text
+ description: Enter the url of the image into quotes
+ description.zh: 向引号内输入图像的url
+ default: url(" ")
+ -
+ id: Graph-view
+ title: Graph view
+ title.zh: 关系图谱
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: graph-text
+ title: graph-text color
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: graph-line
+ title: graph-line color
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: graph-node
+ title: graph-node color
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: graph-node-unresolved
+ title: graph-node-unresolved color
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: graph-node-focused
+ title: graph-node-focused color
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: graph-node-tag
+ title: graph-node-tag color
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: graph-node-attachment
+ title: graph-node-attachment color
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: Canvas
+ title: Canvas
+ title.zh: 白板
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: immersive-canvas
+ title: immersive canvas
+ title.zh: 沉浸式白板
+ type: class-toggle
+ -
+ id: media-embed-card-border-off
+ title: Remove border effect of media card.
+ title.zh: 移除媒体卡片的边框效果
+ type: class-toggle
+ -
+ id: canvas-background
+ title: Customize canvas background color
+ title.zh: 自定义 canvas 背景色
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: canvas-card-border-width
+ title: canvas card border width
+ title.zh: canvas 卡片边框大小
+ type: variable-text
+ description: Input any CSS border-width value
+ description.zh: 输入任意 CSS border-width 值
+ default: 2px
+ -
+ id: canvas-card-border-style
+ title: canvas card border style
+ title.zh: canvas 卡片边框风格
+ type: variable-text
+ description: Input any CSS border-style value
+ description.zh: 输入任意 CSS border-style 值
+ default: solid
+ -
+ id: canvas-card-menu
+ title: canvas card menu position
+ title.zh: canvas 卡片菜单位置
+ type: class-select
+ allowEmpty: false
+ default: canvas-card-menu-center
+ options:
+ - label: center(obsidian default)
+ value: canvas-card-menu-center
+ - label: left
+ value: canvas-card-menu-left
+ - label: right
+ value: canvas-card-menu-right
+ -
+ id: animation
+ title: Animation
+ title.zh: 动效
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: extra-anim-remove
+ title: Remove additional added animation
+ title.zh: 移除 额外增加的动效
+ type: class-toggle
+ -
+ id: anim-speed
+ title: Animation speed
+ title.zh: 动效速度
+ type: variable-number-slider
+ default: 1
+ min: 0.5
+ max: 2
+ step: 0.05
+ -
+ id: Miscellaneous
+ title: Miscellaneous
+ title.zh: 杂项
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: setting-item-title-icon-remove
+ title: Remove setting item title icon
+ title.zh: 移除 设置项标题图标
+ type: class-toggle
+ -
+ id: scrollbar-hide
+ title: Hide scrollbar
+ title.zh: 隐藏 滚动条
+ type: class-toggle
+ -
+ id: restored-scrollbars
+ title: Restore scrollbar style
+ title.zh: 还原 滚动条的样式
+ type: class-toggle
+
+*/
+
+/* @settings
+
+name: Appearance (light mode)
+id: Appearance-light
+settings:
+ -
+ id: Presets-info-light
+ description: "[Presets (light)](https://github.com/Akifyss/obsidian-border/blob/main/presets.md#light-mode) | Before importing, it is recommended to reset this entry to default / Remove preset↗️"
+ description.zh: "[预设(亮色)](https://github.com/Akifyss/obsidian-border/blob/main/presets.md#light-mode) | 导入前,推荐先将此条目重设为默认 / 移除预设↗️ "
+ type: info-text
+ markdown: true
+ -
+ id: card-layout-open-light
+ title: Enable card layout(light mode)
+ title.zh: 启用 卡片式布局(亮色模式)
+ type: class-toggle
+ -
+ id: theme-light-style-select
+ title: Base style (light mode)
+ title.zh: 基础风格(亮色模式)
+ type: class-select
+ allowEmpty: false
+ default: theme-light-background-default
+ options:
+ - label: default
+ value: theme-light-background-default
+ - label: old default
+ value: theme-light-background-old-default
+ - label: colored
+ value: theme-light-background-adapt
+ -
+ id: Color-light
+ title: Color
+ title.zh: 色彩
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: Accent-color-light
+ title: Accent color
+ title.zh: 主题色
+ type: heading
+ collapsed: true
+ level: 4
+ -
+ id: accent-light
+ title: Accent color(light mode)
+ title.zh: 主题色(亮色模式)
+ description: Set accent color for the light and dark modes separately
+ description.zh: 分开来设置亮色模式与暗色模式的强调色
+ type: variable-color
+ format: hsl-split
+ opacity: false
+ default: '#5a6ded'
+ -
+ id: accent-color-override-light
+ title: Override accent color setting in "Settings-Appearance" menu(light mode)
+ title.zh: 覆写 "设置-外观 "菜单中的强调色设置(亮色模式)
+ type: class-toggle
+ -
+ id: accent-advanced-light
+ title: Advanced
+ title.zh: 高级
+ type: heading
+ collapsed: true
+ level: 5
+ -
+ id: color-accent-hsl-light
+ title: color-accent-hsl
+ title.zh: color-accent-hsl
+ type: variable-color
+ format: hsl-values
+ opacity: false
+ default: '#'
+ -
+ id: color-accent-light
+ title: color-accent
+ title.zh: color-accent
+ type: variable-color
+ format: hsl
+ opacity: false
+ default: '#'
+ -
+ id: color-accent-1-light
+ title: color-accent-1
+ title.zh: color-accent-1
+ type: variable-color
+ format: hsl
+ opacity: false
+ default: '#'
+ -
+ id: color-accent-2-light
+ title: color-accent-2
+ title.zh: color-accent-2
+ type: variable-color
+ format: hsl
+ opacity: false
+ default: '#'
+ -
+ id: color-accent-3-light
+ title: color-accent-3
+ title.zh: color-accent-3
+ type: variable-color
+ format: hsl
+ opacity: false
+ default: '#'
+ -
+ id: Extended-colors-light
+ title: Extended colors
+ title.zh: 拓展色
+ type: heading
+ collapsed: true
+ level: 4
+ -
+ id: color-red-rgb
+ title: Red
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#dd2c38'
+ default-dark: '#ff7881'
+ -
+ id: color-orange-rgb
+ title: Orange
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#de7417'
+ default-dark: '#fbbb83'
+ -
+ id: color-yellow-rgb
+ title: Yellow
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#c09c0c'
+ default-dark: '#ffe88b'
+ -
+ id: color-green-rgb
+ title: Green
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#1da51d'
+ default-dark: '#7cd37c'
+ -
+ id: color-cyan-rgb
+ title: Cyan
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#16a6ab'
+ default-dark: '#86dfe2'
+ -
+ id: color-blue-rgb
+ title: Blue
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#1775d9'
+ default-dark: '#89bdf4'
+ -
+ id: color-purple-rgb
+ title: Purple
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#8f47e1'
+ default-dark: '#cb9eff'
+ -
+ id: color-pink-rgb
+ title: Pink
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#dd1399'
+ default-dark: '#f2b6de'
+ -
+ id: Background-light
+ title: Background
+ title.zh: 背景
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: mod-left-split-background-header-light
+ title: Left sidepane background
+ title.zh: 左侧面板背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: mod-left-split-background-select-light
+ title: Left sidepane background(light mode)
+ title.zh: 左侧面板背景(亮色模式)
+ type: class-select
+ allowEmpty: false
+ default: mod-left-split-background-primary-light
+ options:
+ - label: background-primary (default)
+ value: mod-left-split-background-primary-light
+ - label: background-secondary
+ value: mod-left-split-background-secondary-light
+ - label: transparent (card layout only)
+ value: mod-left-split-background-transparent-light
+ - label: customize color
+ value: mod-left-split-background-customize-light
+ - label: customize CSS
+ value: mod-left-split-background-CSS-light
+ -
+ id: background-mod-left-split-light
+ title: Customize left sidepane background color (light mode)
+ title.zh: 自定义 左侧面板 背景色(亮色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: background-mod-left-CSS-light
+ title: Left sidepane background (light mode)
+ title.zh: 左侧面板background(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: background-mod-left-CSS-blend-mode-light
+ title: Left sidepane background-blend-mode (light mode)
+ title.zh: 左侧面板background-blend-mode(亮色模式)
+ description: Input any CSS background-blend-mode value
+ description.zh: 输入任意 CSS background-blend-mode 值
+ type: variable-text
+ default: normal
+ -
+ id: background-mod-left-CSS-backdrop-filter-light
+ title: Left sidepane backdrop-filter (light mode)
+ title.zh: 左侧面板backdrop-filter(亮色模式)
+ description: Input any CSS backdrop-filter value
+ description.zh: 输入任意 CSS backdrop-filter 值
+ type: variable-text
+ default: blur(32px)
+ -
+ id: mod-right-split-background-header-light
+ title: Right sidepane background
+ title.zh: 右侧面板背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: mod-right-split-background-select-light
+ title: Right sidepane background (light mode)
+ title.zh: 右侧面板背景(亮色模式)
+ type: class-select
+ allowEmpty: false
+ default: mod-right-split-background-primary-light
+ options:
+ - label: background-primary (default)
+ value: mod-right-split-background-primary-light
+ - label: background-secondary
+ value: mod-right-split-background-secondary-light
+ - label: transparent (card layout only)
+ value: mod-right-split-background-transparent-light
+ - label: customize color
+ value: mod-right-split-background-customize-light
+ - label: customize CSS
+ value: mod-right-split-background-CSS-light
+ -
+ id: background-mod-right-split-light
+ title: Customize right sidepane background color(light mode)
+ title.zh: 自定义 右侧面板 背景色(亮色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: background-mod-right-CSS-light
+ title: Right sidepane background (light mode)
+ title.zh: 右侧面板background(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: background-mod-right-CSS-blend-mode-light
+ title: Right sidepane background-blend-mode (light mode)
+ title.zh: 右侧面板background-blend-mode(亮色模式)
+ description: Input any CSS background-blend-mode value
+ description.zh: 输入任意 CSS background-blend-mode 值
+ type: variable-text
+ default: normal
+ -
+ id: background-mod-right-CSS-backdrop-filter-light
+ title: Right sidepane backdrop-filter (light mode)
+ title.zh: 右侧面板backdrop-filter(亮色模式)
+ description: Input any CSS backdrop-filter value
+ description.zh: 输入任意 CSS backdrop-filter 值
+ type: variable-text
+ default: blur(32px)
+ -
+ id: mod-root-split-background-header-light
+ title: Middle pane background
+ title.zh: 中间面板背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: mod-root-split-background-select-light
+ title: Middle pane background (light mode)
+ title.zh: 中间面板背景(亮色模式)
+ type: class-select
+ allowEmpty: false
+ default: mod-root-split-background-primary-light
+ options:
+ - label: background-primary (default)
+ value: mod-root-split-background-primary-light
+ - label: background-secondary
+ value: mod-root-split-background-secondary-light
+ - label: transparent (card layout only)
+ value: mod-root-split-background-transparent-light
+ - label: customize color
+ value: mod-root-split-background-customize-light
+ - label: customize CSS
+ value: mod-root-split-background-CSS-light
+ -
+ id: background-mod-root-split-light
+ title: Customize Middle pane background color(light mode)
+ title.zh: 自定义 中间面板 背景色(亮色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: background-mod-root-CSS-light
+ title: Middle pane background (light mode)
+ title.zh: 中间面板background(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: background-mod-root-CSS-blend-mode-light
+ title: Middle pane background-blend-mode (light mode)
+ title.zh: 中间面板background-blend-mode(亮色模式)
+ description: Input any CSS background-blend-mode value
+ description.zh: 输入任意 CSS background-blend-mode 值
+ type: variable-text
+ default: normal
+ -
+ id: background-mod-root-CSS-backdrop-filter-light
+ title: Middle pane backdrop-filter (light mode)
+ title.zh: 中间面板backdrop-filter(亮色模式)
+ description: Input any CSS backdrop-filter value
+ description.zh: 输入任意 CSS backdrop-filter 值
+ type: variable-text
+ default: blur(32px)
+ -
+ id: underlying-background-header-light
+ title: Underlying background
+ title.zh: 底层背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: background-underlying-select-light
+ title: underlying background(light mode)
+ title.zh: 底层背景(亮色模式)
+ type: class-select
+ allowEmpty: false
+ default: background-underlying-default-light
+ options:
+ - label: background-primary
+ value: background-underlying-primary-light
+ - label: background-secondary
+ value: background-underlying-secondary-light
+ - label: adapt to accent color(default)
+ value: background-underlying-default-light
+ - label: customize color
+ value: background-underlying-Color-light
+ - label: customize CSS
+ value: background-underlying-CSS-light
+ -
+ id: background-underlying-light
+ title: Customize underlying background color(light mode)
+ title.zh: 自定义 底层背景色(亮色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: background-underlying-CSS-light
+ title: underlying background (light mode)
+ title.zh: 底层background(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: background-underlying-CSS-blend-mode-light
+ title: underlying background-blend-mode (light mode)
+ title.zh: 底层background-blend-mode(亮色模式)
+ description: Input any CSS background-blend-mode value
+ description.zh: 输入任意 CSS background-blend-mode 值
+ type: variable-text
+ default: overlay, color-burn
+ -
+ id: underlying-foreground-header-light
+ title: Underlying foreground
+ title.zh: 底层前景
+ description: Adjust foreground to fit the background
+ description.zh: 调整前景以适应背景
+ type: heading
+ collapsed: ture
+ level: 5
+ -
+ id: on-border-light
+ title: underlying foreground color(light mode)
+ title.zh: 底层前景色(亮色模式)
+ description: Color of elements (text&icon) displayed on underlying background, including top tab bar, ribbon menu, and status bar
+ description.zh: 显示在底层背景上的元素(text&icon)颜色,包括顶部标签栏、功能区菜单和状态栏
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: mix-blend-mode-on-border-light
+ title: mix blend mode of underlying foreground(light mode)
+ title.zh: 底层前景的混合模式(亮色模式)
+ description: Input any CSS mix-blend-mode value
+ description.zh: 输入任意 CSS mix-blend-mode 值
+ type: variable-text
+ default: normal
+ -
+ id: Global-background-header-light
+ title: Global background
+ title.zh: 全局背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: background-primary
+ title: background-primary(light mode)
+ title.zh: background-primary(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-primary-alt
+ title: background-primary-alt(light mode)
+ title.zh: background-primary-alt(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-secondary
+ title: background-secondary(light mode)
+ title.zh: background-secondary(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-secondary-alt
+ title: background-secondary-alt(light mode)
+ title.zh: background-secondary-alt(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-tertiary
+ title: background-tertiary(light mode)
+ title.zh: background-tertiary(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: workspace-background-translucent
+ title: workspace-background-translucent(light mode)
+ title.zh: workspace-background-translucent(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hsl
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-hover
+ title: background-modifier-hover(light mode)
+ title.zh: background-modifier-hover(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-active-hover
+ title: background-modifier-active-hover(light mode)
+ title.zh: background-modifier-active-hover(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-border
+ title: background-modifier-border(light mode)
+ title.zh: background-modifier-border(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-border-hover
+ title: background-modifier-border-hover(light mode)
+ title.zh: background-modifier-border-hover(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-border-focus
+ title: background-modifier-border-focus(light mode)
+ title.zh: background-modifier-border-focus(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: Foreground-header-light
+ title: Foreground
+ title.zh: 前景
+ type: heading
+ collapsed: ture
+ level: 3
+ -
+ id: text-color-light
+ title: Text & icon color
+ title.zh: 文本 & 图标色
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: text-normal
+ title: text-normal(light mode)
+ title.zh: text-normal(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-muted
+ title: text-muted(light mode)
+ title.zh: text-muted(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-faint
+ title: text-faint(light mode)
+ title.zh: text-faint(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-accent
+ title: text-accent(light mode)
+ title.zh: text-accent(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-accent-hover
+ title: text-accent-hover(light mode)
+ title.zh: text-accent-hover(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-on-accent
+ title: text-on-accent(light mode)
+ title.zh: text-on-accent(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-on-accent-inverted
+ title: text-on-accent-inverted(light mode)
+ title.zh: text-on-accent-inverted(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-color-light
+ title: Interactive color
+ title.zh: 交互色
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: interactive-normal
+ title: interactive-normal(light mode)
+ title.zh: interactive-normal(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-hover
+ title: interactive-hover(light mode)
+ title.zh: interactive-hover(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-accent
+ title: interactive-accent(light mode)
+ title.zh: interactive-accent(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-accent-hsl
+ title: interactive-accent-hsl(light mode)
+ title.zh: interactive-accent-hsl(亮色模式)
+ type: variable-themed-color
+ format: hsl-values
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-accent-hover
+ title: interactive-accent-hover(light mode)
+ title.zh: interactive-accent-hover(亮色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: Card-light
+ title: Card
+ title.zh: 卡片
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: card-border-radius-light
+ title: Custom card border radius (light mode)
+ title.zh: 自定义 卡片的圆角大小(亮色模式)
+ description: Input your border-radius value here
+ description.zh: 在这里输入你的 border-radius 值
+ type: variable-text
+ default: 8px
+ -
+ id: card-shadow-light
+ title: Custom card shadow (light mode)
+ title.zh: 自定义 卡片阴影(亮色模式)
+ description: Input your box-shadow value here
+ description.zh: 在这里输入你的 box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: Active-states-light
+ title: Active states
+ title.zh: 激活态
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: Active-states-Tabs-light
+ title: Active states(Tabs)
+ title.zh: 激活态(Tabs)
+ type: heading
+ collapsed: true
+ level: 4
+ -
+ id: color-activated-tab-header-light
+ title: activated Tab header color(light mode)
+ title.zh: 已激活Tab的标头颜色(亮色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: color-to-tab-icon-light
+ title: Apply custom color to the "close" icon(light mode)
+ title.zh: 将自定义颜色应用于“关闭”图标(亮色模式)
+ type: class-toggle
+ -
+ id: border-radius-activated-tab-header-light
+ title: activated Tab header border radius(light mode)
+ title.zh: 已激活Tab的标头圆角大小(亮色模式)
+ description: Input any CSS border-radius value
+ description.zh: 输入任意 CSS border-radius 值
+ type: variable-text
+ default: 6px
+ -
+ id: background-activated-tab-header-light
+ title: activated Tab header background(light mode)
+ title.zh: 已激活Tab的标头背景(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: shadow-activated-tab-header-light
+ title: activated Tab header shadow(light mode)
+ title.zh: 已激活Tab的标头阴影(亮色模式)
+ description: Input any CSS box-shadow value
+ description.zh: 输入任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: color-activated-tab-header-underline-light
+ title: activated Tab header underline color(light mode)
+ title.zh: 已激活Tab的标头下划线颜色(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: Active-states-file-explorer-light
+ title: Active states(file explorer)
+ title.zh: 激活态(文件列表)
+ type: heading
+ collapsed: true
+ level: 4
+ -
+ id: Active-states-file-explorer-select-light
+ title: Activated file style(light mode)
+ title.zh: 已激活文件 风格(亮色模式)
+ type: class-select
+ allowEmpty: false
+ default: activated-file-default-light
+ options:
+ - label: default
+ value: activated-file-default-light
+ - label: Accent color
+ value: activated-file-accent-light
+ - label: Consistent with tab style
+ value: activated-file-tab-style-light
+ - label: customize
+ value: activated-file-customize-light
+ -
+ id: color-activated-file-light
+ title: Activated file color(light mode)
+ title.zh: 已激活文件的颜色(亮色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: border-radius-activated-file-light
+ title: Activated file border radius(light mode)
+ title.zh: 已激活文件的圆角大小(亮色模式)
+ description: Input any CSS border-radius value
+ description.zh: 输入任意 CSS border-radius 值
+ type: variable-text
+ default: 4px
+ -
+ id: background-activated-file-light
+ title: Activated file background(light mode)
+ title.zh: 已激活文件的背景(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: shadow-activated-file-light
+ title: Activated file shadow(light mode)
+ title.zh: 已激活文件的阴影(亮色模式)
+ description: Input any CSS box-shadow value
+ description.zh: 输入任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: UI-Controls-light
+ title: UI Controls
+ title.zh: UI 控件
+ type: heading
+ collapsed: ture
+ level: 3
+ -
+ id: input-radius-light
+ title: input-radius(light mode)
+ title.zh: input-radius(亮色模式)
+ description: border radius of buttons, input, etc.
+ description.zh: 按钮,输入框等的圆角大小
+ type: variable-number
+ default: 5
+ format: px
+ -
+ id: input-shadow-light
+ title: input-shadow(light mode)
+ title.zh: input-shadow(亮色模式)
+ description: shadow of button,dropdown, etc. Accepts any CSS box-shadow value
+ description.zh: 按钮,下拉菜单等的阴影 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: input-shadow-hover-light
+ title: input-shadow-hover(light mode)
+ title.zh: input-shadow-hover(亮色模式)
+ description: shadow of button,dropdown, etc.(hovered) Accepts any CSS box-shadow value
+ description.zh: 按钮,下拉菜单等的阴影(鼠标悬停时) 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-light
+ title: toggle switch
+ title.zh: 滑动开关
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: toggle-thumb-color-light
+ title: toggle-thumb-color(light mode)
+ title.zh: toggle-thumb-color(亮色模式)
+ description: background color of toggle thumb Accepts any CSS background-color value
+ description.zh: 开关滑块的背景色 接受任意 CSS background-color 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-thumb-enabled-color-light
+ title: toggle-thumb-enabled-color(light mode)
+ title.zh: toggle-thumb-enabled-color(亮色模式)
+ description: background color of toggle thumb(enabled) Accepts any CSS background-color value
+ description.zh: 开关滑块的背景色(开启时) 接受任意 CSS background-color 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-thumb-shadow-light
+ title: toggle-thumb-shadow(light mode)
+ title.zh: toggle-thumb-shadow(亮色模式)
+ description: shadow of toggle thumb Accepts any CSS box-shadow value
+ description.zh: 开关滑块的阴影 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-thumb-enabled-shadow-light
+ title: toggle-thumb-enabled-shadow(light mode)
+ title.zh: toggle-thumb-enabled-shadow(亮色模式)
+ description: shadow of toggle thumb(enabled) Accepts any CSS box-shadow value
+ description.zh: 开关滑块的阴影(开启时) 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-track-color-light
+ title: toggle-track-color(light mode)
+ title.zh: toggle-track-color(亮色模式)
+ description: background color of toggle track Accepts any CSS background-color value
+ description.zh: 开关滑轨的背景色 接受任意 CSS background-color 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-track-enabled-color-light
+ title: toggle-track-enabled-color(light mode)
+ title.zh: toggle-track-enabled-color(亮色模式)
+ description: background color of toggle track(enabled) Accepts any CSS background-color value
+ description.zh: 开关滑轨的背景色(开启时) 接受任意 CSS background-color 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-track-shadow-light
+ title: toggle-track-shadow(light mode)
+ title.zh: toggle-track-shadow(亮色模式)
+ description: shadow of toggle track Accepts any CSS box-shadow value
+ description.zh: 开关滑轨的阴影 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-track-hovered-shadow-light
+ title: toggle-track-hovered-shadow(light mode)
+ title.zh: toggle-track-hovered-shadow(亮色模式)
+ description: shadow of toggle track(hovered) Accepts any CSS box-shadow value
+ description.zh: 开关滑轨的阴影(鼠标悬停时) 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: Miscellaneous-light
+ title: Miscellaneous
+ title.zh: 杂项
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: card-highlight-light
+ title: Highlight active card
+ title.zh: 高亮当前活动卡片
+ description: Only applicable for card layout
+ description.zh: 仅限卡片式布局
+ type: class-toggle
+ -
+ id: workspace-divider-transparent-light
+ title: Visually remove divider effect in workspace
+ title.zh: 在视觉上移除工作区的分隔线效果
+ description: For default layout
+ description.zh: 针对默认布局
+ type: class-toggle
+ -
+ id: link-external-color
+ title: External link color
+ title.zh: 外部链接颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: link-external-color-hover
+ title: External link color (hover)
+ title.zh: 外部链接颜色(鼠标悬停时)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+
+*/
+
+/* @settings
+
+name: Appearance (dark mode)
+id: Appearance-dark
+settings:
+ -
+ id: Presets-info-dark
+ description: "[Presets (dark)](https://github.com/Akifyss/obsidian-border/blob/main/presets.md#light-mode) | Before importing, it is recommended to reset this entry to default / Remove preset↗️"
+ description.zh: "[预设(暗色)](https://github.com/Akifyss/obsidian-border/blob/main/presets.md#dark-mode) | 导入前,推荐先将此条目重设为默认 / 移除预设↗️ "
+ type: info-text
+ markdown: true
+ -
+ id: card-layout-open-dark
+ title: Enable card layout(dark mode)
+ title.zh: 启用 卡片式布局(暗色模式)
+ type: class-toggle
+ -
+ id: theme-dark-style-select
+ title: Base style (dark mode)
+ title.zh: 基础风格(暗色模式)
+ type: class-select
+ allowEmpty: false
+ default: theme-dark-background-default
+ options:
+ - label: brighter
+ value: theme-dark-background-brighter
+ - label: default
+ value: theme-dark-background-default
+ - label: darker
+ value: theme-dark-background-darker
+ - label: pure black
+ value: theme-dark-background-black
+ -
+ id: Color-dark
+ title: Color
+ title.zh: 色彩
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: Accent-color-dark
+ title: Accent color
+ title.zh: 主题色
+ type: heading
+ collapsed: true
+ level: 4
+ -
+ id: accent-dark
+ title: Accent color(dark mode)
+ title.zh: 主题色(暗色模式)
+ description: Set accent color for the light and dark modes separately
+ description.zh: 分开来设置亮色模式与暗色模式的强调色
+ type: variable-color
+ format: hsl-split
+ opacity: false
+ default: '#8a96e5'
+ -
+ id: accent-color-override-dark
+ title: Override accent color setting in "Settings-Appearance" menu(dark mode)
+ title.zh: 覆写 "设置-外观 "菜单中的强调色设置(暗色模式)
+ type: class-toggle
+ -
+ id: accent-advanced-dark
+ title: Advanced
+ title.zh: 高级
+ type: heading
+ collapsed: true
+ level: 5
+ -
+ id: color-accent-hsl-dark
+ title: color-accent-hsl
+ title.zh: color-accent-hsl
+ type: variable-color
+ format: hsl-values
+ opacity: false
+ default: '#'
+ -
+ id: color-accent-dark
+ title: color-accent
+ title.zh: color-accent
+ type: variable-color
+ format: hsl
+ opacity: false
+ default: '#'
+ -
+ id: color-accent-1-dark
+ title: color-accent-1
+ title.zh: color-accent-1
+ type: variable-color
+ format: hsl
+ opacity: false
+ default: '#'
+ -
+ id: color-accent-2-dark
+ title: color-accent-2
+ title.zh: color-accent-2
+ type: variable-color
+ format: hsl
+ opacity: false
+ default: '#'
+ -
+ id: color-accent-3-dark
+ title: color-accent-3
+ title.zh: color-accent-3
+ type: variable-color
+ format: hsl
+ opacity: false
+ default: '#'
+ -
+ id: Extended-colors-dark
+ title: Extended colors
+ title.zh: 拓展色
+ type: heading
+ collapsed: true
+ level: 4
+ -
+ id: color-red-rgb
+ title: Red
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#dd2c38'
+ default-dark: '#ff7881'
+ -
+ id: color-orange-rgb
+ title: Orange
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#de7417'
+ default-dark: '#fbbb83'
+ -
+ id: color-yellow-rgb
+ title: Yellow
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#c09c0c'
+ default-dark: '#ffe88b'
+ -
+ id: color-green-rgb
+ title: Green
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#1da51d'
+ default-dark: '#7cd37c'
+ -
+ id: color-cyan-rgb
+ title: Cyan
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#16a6ab'
+ default-dark: '#86dfe2'
+ -
+ id: color-blue-rgb
+ title: Blue
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#1775d9'
+ default-dark: '#89bdf4'
+ -
+ id: color-purple-rgb
+ title: Purple
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#8f47e1'
+ default-dark: '#cb9eff'
+ -
+ id: color-pink-rgb
+ title: Pink
+ type: variable-themed-color
+ format: 'rgb-values'
+ default-light: '#dd1399'
+ default-dark: '#f2b6de'
+ -
+ id: Background-dark
+ title: Background
+ title.zh: 背景
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: mod-left-split-background-header-dark
+ title: Left sidepane background
+ title.zh: 左侧面板背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: mod-left-split-background-select-dark
+ title: Left sidepane background(dark mode)
+ title.zh: 左侧面板背景(暗色模式)
+ type: class-select
+ allowEmpty: false
+ default: mod-left-split-background-primary-dark
+ options:
+ - label: background-primary (default)
+ value: mod-left-split-background-primary-dark
+ - label: background-secondary
+ value: mod-left-split-background-secondary-dark
+ - label: transparent (card layout only)
+ value: mod-left-split-background-transparent-dark
+ - label: customize color
+ value: mod-left-split-background-customize-dark
+ - label: customize CSS
+ value: mod-left-split-background-CSS-dark
+ -
+ id: background-mod-left-split-dark
+ title: Customize left sidepane background color (dark mode)
+ title.zh: 自定义 左侧面板 背景色(暗色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: background-mod-left-CSS-dark
+ title: Left sidepane background (dark mode)
+ title.zh: 左侧面板background(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: background-mod-left-CSS-blend-mode-dark
+ title: Left sidepane background-blend-mode (dark mode)
+ title.zh: 左侧面板background-blend-mode(暗色模式)
+ description: Input any CSS background-blend-mode value
+ description.zh: 输入任意 CSS background-blend-mode 值
+ type: variable-text
+ default: normal
+ -
+ id: background-mod-left-CSS-backdrop-filter-dark
+ title: Left sidepane backdrop-filter (dark mode)
+ title.zh: 左侧面板backdrop-filter(暗色模式)
+ description: Input any CSS backdrop-filter value
+ description.zh: 输入任意 CSS backdrop-filter 值
+ type: variable-text
+ default: blur(32px)
+ -
+ id: mod-right-split-background-header-dark
+ title: Right sidepane background
+ title.zh: 右侧面板背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: mod-right-split-background-select-dark
+ title: Right sidepane background(dark mode)
+ title.zh: 右侧面板背景(暗色模式)
+ type: class-select
+ allowEmpty: false
+ default: mod-right-split-background-primary-dark
+ options:
+ - label: background-primary (default)
+ value: mod-right-split-background-primary-dark
+ - label: background-secondary
+ value: mod-right-split-background-secondary-dark
+ - label: transparent (card layout only)
+ value: mod-right-split-background-transparent-dark
+ - label: customize color
+ value: mod-right-split-background-customize-dark
+ - label: customize CSS
+ value: mod-right-split-background-CSS-dark
+ -
+ id: background-mod-right-split-dark
+ title: Customize right sidepane background color(dark mode)
+ title.zh: 自定义 右侧面板 背景色(暗色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: background-mod-right-CSS-dark
+ title: Right sidepane background (dark mode)
+ title.zh: 右侧面板background(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: background-mod-right-CSS-blend-mode-dark
+ title: Right sidepane background-blend-mode (dark mode)
+ title.zh: 右侧面板background-blend-mode(暗色模式)
+ description: Input any CSS background-blend-mode value
+ description.zh: 输入任意 CSS background-blend-mode 值
+ type: variable-text
+ default: normal
+ -
+ id: background-mod-right-CSS-backdrop-filter-dark
+ title: Right sidepane backdrop-filter (dark mode)
+ title.zh: 右侧面板backdrop-filter(暗色模式)
+ description: Input any CSS backdrop-filter value
+ description.zh: 输入任意 CSS backdrop-filter 值
+ type: variable-text
+ default: blur(32px)
+ -
+ id: mod-root-split-background-header-dark
+ title: Middle pane background
+ title.zh: 中间面板背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: mod-root-split-background-select-dark
+ title: Middle pane background (dark mode)
+ title.zh: 中间面板背景(暗色模式)
+ type: class-select
+ allowEmpty: false
+ default: mod-root-split-background-primary-dark
+ options:
+ - label: background-primary (default)
+ value: mod-root-split-background-primary-dark
+ - label: background-secondary
+ value: mod-root-split-background-secondary-dark
+ - label: transparent (card layout only)
+ value: mod-root-split-background-transparent-dark
+ - label: customize color
+ value: mod-root-split-background-customize-dark
+ - label: customize CSS
+ value: mod-root-split-background-CSS-dark
+ -
+ id: background-mod-root-split-dark
+ title: Customize Middle pane background color (dark mode)
+ title.zh: 自定义 中间面板 背景色(暗色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: background-mod-root-CSS-dark
+ title: Middle pane background (dark mode)
+ title.zh: 中间面板background(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: background-mod-root-CSS-blend-mode-dark
+ title: Middle pane background-blend-mode (dark mode)
+ title.zh: 中间面板background-blend-mode(暗色模式)
+ description: Input any CSS background-blend-mode value
+ description.zh: 输入任意 CSS background-blend-mode 值
+ type: variable-text
+ default: normal
+ -
+ id: background-mod-root-CSS-backdrop-filter-dark
+ title: Middle pane backdrop-filter (dark mode)
+ title.zh: 中间面板backdrop-filter(暗色模式)
+ description: Input any CSS backdrop-filter value
+ description.zh: 输入任意 CSS backdrop-filter 值
+ type: variable-text
+ default: blur(32px)
+ -
+ id: underlying-background-header-dark
+ title: Underlying background
+ title.zh: 底层背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: background-underlying-select-dark
+ title: underlying background(dark mode)
+ title.zh: 底层背景(暗色模式)
+ type: class-select
+ allowEmpty: false
+ default: background-underlying-default-dark
+ options:
+ - label: background-primary
+ value: background-underlying-primary-dark
+ - label: background-secondary
+ value: background-underlying-secondary-dark
+ - label: adapt to accent color(default)
+ value: background-underlying-default-dark
+ - label: customize color
+ value: background-underlying-Color-dark
+ - label: customize CSS
+ value: background-underlying-CSS-dark
+ -
+ id: background-underlying-dark
+ title: Customize underlying background color(dark mode)
+ title.zh: 自定义 底层背景色(暗色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: background-underlying-CSS-dark
+ title: underlying background (dark mode)
+ title.zh: 底层background(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: background-underlying-CSS-blend-mode-dark
+ title: underlying background-blend-mode (dark mode)
+ title.zh: 底层background-blend-mode(暗色模式)
+ description: Input any CSS background-blend-mode value
+ description.zh: 输入任意 CSS background-blend-mode 值
+ type: variable-text
+ default: soft-light, luminosity, hue, luminosity, hard-light
+ -
+ id: underlying-foreground-header-dark
+ title: Underlying foreground
+ title.zh: 底层前景
+ description: Adjust foreground to fit the background
+ description.zh: 调整前景以适应背景
+ type: heading
+ collapsed: ture
+ level: 5
+ -
+ id: on-border-dark
+ title: underlying foreground color(dark mode)
+ title.zh: 底层前景色(暗色模式)
+ description: Color of elements (text&icon) displayed on underlying background, including top tab bar, ribbon menu, and status bar
+ description.zh: 显示在底层背景上的元素(text&icon)颜色,包括顶部标签栏、功能区菜单和状态栏
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: mix-blend-mode-on-border-dark
+ title: mix blend mode of underlying foreground(dark mode)
+ title.zh: 底层前景的混合模式(暗色模式)
+ description: Input any CSS mix-blend-mode value
+ description.zh: 输入任意 CSS mix-blend-mode 值
+ type: variable-text
+ default: screen
+ -
+ id: Global-background-header-dark
+ title: Global background
+ title.zh: 全局背景
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: background-primary
+ title: background-primary(dark mode)
+ title.zh: background-primary(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-primary-alt
+ title: background-primary-alt(dark mode)
+ title.zh: background-primary-alt(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-secondary
+ title: background-secondary(dark mode)
+ title.zh: background-secondary(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-secondary-alt
+ title: background-secondary-alt(dark mode)
+ title.zh: background-secondary-alt(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-tertiary
+ title: background-tertiary(dark mode)
+ title.zh: background-tertiary(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: workspace-background-translucent
+ title: workspace-background-translucent(dark mode)
+ title.zh: workspace-background-translucent(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hsl
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-hover
+ title: background-modifier-hover(dark mode)
+ title.zh: background-modifier-hover(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-active-hover
+ title: background-modifier-active-hover(dark mode)
+ title.zh: background-modifier-active-hover(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-border
+ title: background-modifier-border(dark mode)
+ title.zh: background-modifier-border(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-border-hover
+ title: background-modifier-border-hover(dark mode)
+ title.zh: background-modifier-border-hover(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: background-modifier-border-focus
+ title: background-modifier-border-focus(dark mode)
+ title.zh: background-modifier-border-focus(暗色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: Foreground-header-dark
+ title: Foreground
+ title.zh: 前景
+ type: heading
+ collapsed: ture
+ level: 3
+ -
+ id: text-color-dark
+ title: Text & icon color
+ title.zh: 文本 & 图标色
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: text-normal
+ title: text-normal(dark mode)
+ title.zh: text-normal(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-muted
+ title: text-muted(dark mode)
+ title.zh: text-muted(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-faint
+ title: text-faint(dark mode)
+ title.zh: text-faint(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-accent
+ title: text-accent(dark mode)
+ title.zh: text-accent(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-accent-hover
+ title: text-accent-hover(dark mode)
+ title.zh: text-accent-hover(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-on-accent
+ title: text-on-accent(dark mode)
+ title.zh: text-on-accent(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-on-accent-inverted
+ title: text-on-accent-inverted(dark mode)
+ title.zh: text-on-accent-inverted(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-color-dark
+ title: Interactive color
+ title.zh: 交互色
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: interactive-normal
+ title: interactive-normal(dark mode)
+ title.zh: interactive-normal(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-hover
+ title: interactive-hover(dark mode)
+ title.zh: interactive-hover(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-accent
+ title: interactive-accent(dark mode)
+ title.zh: interactive-accent(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-accent-hsl
+ title: interactive-accent-hsl(dark mode)
+ title.zh: interactive-accent-hsl(暗色模式)
+ type: variable-themed-color
+ format: hsl-values
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: interactive-accent-hover
+ title: interactive-accent-hover(dark mode)
+ title.zh: interactive-accent-hover(暗色模式)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: Card-dark
+ title: Card
+ title.zh: 卡片
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: card-border-radius-dark
+ title: Custom card border radius (dark mode)
+ title.zh: 自定义 卡片的圆角大小(暗色模式)
+ description: Input your border-radius value here
+ description.zh: 在这里输入你的 border-radius 值
+ type: variable-text
+ default: 8px
+ -
+ id: card-shadow-dark
+ title: Custom card shadow (dark mode)
+ title.zh: 自定义 卡片阴影(暗色模式)
+ description: Input your box-shadow value here
+ description.zh: 在这里输入你的 box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: Active-states-dark
+ title: Active states
+ title.zh: 激活态
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: Active-states-Tabs-dark
+ title: Active states(Tabs)
+ title.zh: 激活态(Tabs)
+ type: heading
+ collapsed: true
+ level: 4
+ -
+ id: color-activated-tab-header-dark
+ title: activated Tab header color(dark mode)
+ title.zh: 已激活Tab的标头颜色(暗色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: color-to-tab-icon-dark
+ title: Apply custom color to the "close" icon(dark mode)
+ title.zh: 将自定义颜色应用于“关闭”图标(暗色模式)
+ type: class-toggle
+ -
+ id: border-radius-activated-tab-header-dark
+ title: activated Tab header border radius(dark mode)
+ title.zh: 已激活Tab的标头圆角大小(暗色模式)
+ description: Input any CSS border-radius value
+ description.zh: 输入任意 CSS border-radius 值
+ type: variable-text
+ default: 6px
+ -
+ id: background-activated-tab-header-dark
+ title: activated Tab header background(dark mode)
+ title.zh: 已激活Tab的标头背景(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: shadow-activated-tab-header-dark
+ title: activated Tab header shadow(dark mode)
+ title.zh: 已激活Tab的标头阴影(暗色模式)
+ description: Input any CSS box-shadow value
+ description.zh: 输入任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: color-activated-tab-header-underline-dark
+ title: activated Tab header underline color(dark mode)
+ title.zh: 已激活Tab的标头下划线颜色(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: Active-states-file-explorer-dark
+ title: Active states(file explorer)
+ title.zh: 激活态(文件列表)
+ type: heading
+ collapsed: true
+ level: 4
+ -
+ id: Active-states-file-explorer-select-dark
+ title: Activated file style(dark mode)
+ title.zh: 已激活文件 风格(暗色模式)
+ type: class-select
+ allowEmpty: false
+ default: activated-file-default-dark
+ options:
+ - label: default
+ value: activated-file-default-dark
+ - label: Accent color
+ value: activated-file-accent-dark
+ - label: Consistent with tab style
+ value: activated-file-tab-style-dark
+ - label: customize
+ value: activated-file-customize-dark
+ -
+ id: color-activated-file-dark
+ title: Activated file color(dark mode)
+ title.zh: 已激活文件的颜色(暗色模式)
+ type: variable-color
+ opacity: ture
+ format: hex
+ alt-format:
+ -
+ id: accent-rgb
+ format: rgb
+ default: '#'
+ -
+ id: border-radius-activated-file-dark
+ title: Activated file border radius(dark mode)
+ title.zh: 已激活文件的圆角大小(暗色模式)
+ description: Input any CSS border-radius value
+ description.zh: 输入任意 CSS border-radius 值
+ type: variable-text
+ default: 4px
+ -
+ id: background-activated-file-dark
+ title: Activated file background(dark mode)
+ title.zh: 已激活文件的背景(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: shadow-activated-file-dark
+ title: Activated file shadow(dark mode)
+ title.zh: 已激活文件的阴影(暗色模式)
+ description: Input any CSS box-shadow value
+ description.zh: 输入任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: UI-Controls-dark
+ title: UI Controls
+ title.zh: UI 控件
+ type: heading
+ collapsed: ture
+ level: 3
+ -
+ id: input-radius-dark
+ title: input-radius(dark mode)
+ title.zh: input-radius(暗色模式)
+ description: border radius of button, input, etc.
+ description.zh: 按钮,输入框等的圆角大小
+ type: variable-number
+ default: 5
+ format: px
+ -
+ id: input-shadow-dark
+ title: input-shadow(dark mode)
+ title.zh: input-shadow(暗色模式)
+ description: shadow of button,dropdown, etc. Accepts any CSS box-shadow value
+ description.zh: 按钮,下拉菜单等的阴影 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: input-shadow-hover-dark
+ title: input-shadow-hover(dark mode)
+ title.zh: input-shadow-hover(暗色模式)
+ description: shadow of button,dropdown, etc.(hovered) Accepts any CSS box-shadow value
+ description.zh: 按钮,下拉菜单等的阴影(鼠标悬停时) 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-dark
+ title: toggle switch
+ title.zh: 滑动开关
+ type: heading
+ collapsed: ture
+ level: 4
+ -
+ id: toggle-thumb-color-dark
+ title: toggle-thumb-color(dark mode)
+ title.zh: toggle-thumb-color(暗色模式)
+ description: background color of toggle thumb Accepts any CSS background-color value
+ description.zh: 开关滑块的背景色 接受任意 CSS background-color 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-thumb-enabled-color-dark
+ title: toggle-thumb-enabled-color(dark mode)
+ title.zh: toggle-thumb-enabled-color(暗色模式)
+ description: background color of toggle thumb(enabled) Accepts any CSS background-color value
+ description.zh: 开关滑块的背景色(开启时) 接受任意 CSS background-color 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-thumb-shadow-dark
+ title: toggle-thumb-shadow(dark mode)
+ title.zh: toggle-thumb-shadow(暗色模式)
+ description: shadow of toggle thumb Accepts any CSS box-shadow value
+ description.zh: 开关滑块的阴影 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-thumb-enabled-shadow-dark
+ title: toggle-thumb-enabled-shadow(dark mode)
+ title.zh: toggle-thumb-enabled-shadow(暗色模式)
+ description: shadow of toggle thumb(enabled) Accepts any CSS box-shadow value
+ description.zh: 开关滑块的阴影(开启时) 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+
+ -
+ id: toggle-track-color-dark
+ title: toggle-track-color(dark mode)
+ title.zh: toggle-track-color(暗色模式)
+ description: background color of toggle track Accepts any CSS background-color value
+ description.zh: 开关滑轨的背景色 接受任意 CSS background-color 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-track-enabled-color-dark
+ title: toggle-track-enabled-color(dark mode)
+ title.zh: toggle-track-enabled-color(暗色模式)
+ description: background color of toggle track(enabled) Accepts any CSS background-color value
+ description.zh: 开关滑轨的背景色(开启时) 接受任意 CSS background-color 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-track-shadow-dark
+ title: toggle-track-shadow(dark mode)
+ title.zh: toggle-track-shadow(暗色模式)
+ description: shadow of toggle track Accepts any CSS box-shadow value
+ description.zh: 开关滑轨的阴影 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: toggle-track-hovered-shadow-dark
+ title: toggle-track-hovered-shadow(dark mode)
+ title.zh: toggle-track-hovered-shadow(暗色模式)
+ description: shadow of toggle track(hovered) Accepts any CSS box-shadow value
+ description.zh: 开关滑轨的阴影(鼠标悬停时) 接受任意 CSS box-shadow 值
+ type: variable-text
+ default: ''
+ -
+ id: Miscellaneous-dark
+ title: Miscellaneous
+ title.zh: 杂项
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: card-highlight-dark
+ title: Highlight active card
+ title.zh: 高亮当前活动卡片
+ description: Only applicable for card layout
+ description.zh: 仅限卡片式布局
+ type: class-toggle
+ -
+ id: workspace-divider-transparent-dark
+ title: Visually remove divider effect in workspace
+ title.zh: 在视觉上移除工作区的分隔线效果
+ description: For default layout
+ description.zh: 针对默认布局
+ type: class-toggle
+ -
+ id: link-external-color
+ title: External link color
+ title.zh: 外部链接颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: link-external-color-hover
+ title: External link color (hover)
+ title.zh: 外部链接颜色(鼠标悬停时)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+
+*/
+
+/* @settings
+
+name: Editor
+id: Editor
+settings:
+ -
+ id: border-focus-mode-heading
+ title: Focus mode
+ title.zh: 专注模式
+ type: heading
+ collapsed: ture
+ level: 3
+ -
+ id: border-focus-mode-info
+ description: "Highlight active line"
+ description.zh: "突出显示当前活动行"
+ type: info-text
+ markdown: true
+ -
+ id: border-focus-mode
+ title: Enable focus mode
+ title.zh: 启用 专注模式
+ type: class-toggle
+ -
+ id: line-active-bg
+ title: Active line background color
+ title.zh: 活动行背景色
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: line-normal-opacity
+ title: Normal line opacity
+ title.zh: 普通行透明度
+ type: variable-number-slider
+ default: 0.5
+ min: 0.05
+ max: 1
+ step: 0.05
+ -
+ id: line-emphasis
+ title: Hover line indicator
+ title.zh: 悬停行指示器
+ type: heading
+ collapsed: ture
+ level: 3
+ -
+ id: line-hover-indicator-info
+ description: "Display a vertical line indicator before hovered line"
+ description.zh: "在鼠标悬停行前显示一个竖线指示器"
+ type: info-text
+ markdown: true
+ -
+ id: line-hover-indicator
+ title: Enable hover line indicator
+ title.zh: 启用 悬停行指示器
+ type: class-toggle
+ -
+ id: hover-indicator-color
+ title: Customize indicator color
+ title.zh: 自定义指示器的颜色
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: Headings
+ title: Headings
+ title.zh: 标题
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: collapse-icon-restore
+ title: Restore the collapse icon before headings
+ title.zh: 还原标题前的折叠图标
+ type: class-toggle
+ -
+ id: heading-indicator-off
+ title: Remove headings indicator
+ title.zh: 移除标题左侧的指示器
+ type: class-toggle
+ default: false
+ -
+ id: Inline-title
+ title: Inline Title
+ title.zh: 页内标题
+ type: heading
+ level: 4
+ collapsed: true
+ -
+ id: inline-title-divider-remove
+ title: Remove inline title divider
+ title.zh: 移除页内标题分隔线
+ type: class-toggle
+ -
+ id: inline-title-font
+ title: inline title font
+ title.zh: 页内标题 字体
+ type: variable-text
+ default: ''
+ -
+ id: inline-title-size
+ title: inline title size
+ title.zh: 页内标题 字体大小
+ description: Accepts any CSS font-size value
+ description.zh: 接受任何 CSS font-size 值
+ type: variable-text
+ default: 1.5em
+ -
+ id: inline-title-weight
+ title: inline title weight
+ title.zh: 页内标题 字重
+ description: Accepts a value from 100 to 900
+ description.zh: 接受 100-900 的值
+ type: variable-number
+ default: 700
+ -
+ id: inline-title-text-transform
+ title: inline title text-transform
+ title.zh: 页内标题 text-transform
+ description: Accepts any CSS text-transform value
+ description.zh: 接受任何 CSS text-transform 值
+ type: variable-text
+ default: ''
+ -
+ id: inline-title-color-select
+ title: inline title text color
+ title.zh: 页内标题 文本颜色
+ type: class-select
+ allowEmpty: false
+ default: inline-title-color-default
+ options:
+ - label: H1 color
+ value: inline-title-color-default
+ - label: Customized color
+ value: inline-title-color-customized
+ -
+ id: inline-title-color
+ title: Customize inline title text color
+ title.zh: 自定义 页内标题 文本颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: level-1-headings
+ title: Level 1 Headings
+ title.zh: 一级标题
+ type: heading
+ level: 4
+ collapsed: true
+ -
+ id: h1-divider-on
+ title: Enable H1 divider
+ title.zh: 启用H1分隔线
+ type: class-toggle
+ default: false
+ -
+ id: h1-font
+ title: H1 font
+ title.zh: H1 字体
+ type: variable-text
+ default: ''
+ -
+ id: h1-size
+ title: H1 font size
+ title.zh: H1 字体大小
+ description: Accepts any CSS font-size value
+ description.zh: 接受任何 CSS font-size 值
+ type: variable-text
+ default: 1.5em
+ -
+ id: h1-weight
+ title: H1 font weight
+ title.zh: H1 字重
+ description: Accepts a value from 100 to 900
+ description.zh: 接受 100-900 的值
+ type: variable-number
+ default: 700
+ -
+ id: h1-text-transform
+ title: H1 text-transform
+ title.zh: H1 text-transform
+ description: Accepts any CSS text-transform value
+ description.zh: 接受任何 CSS text-transform 值
+ type: variable-text
+ default: ''
+ -
+ id: h1-accent-color
+ title: Customize H1 accent color
+ title.zh: 自定义 H1 强调色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: h1-color-select
+ title: H1 text color
+ title.zh: H1 文本颜色
+ type: class-select
+ allowEmpty: false
+ default: h1-color-default
+ options:
+ - label: Default
+ value: h1-color-default
+ - label: Accent color
+ value: h1-color-designated
+ -
+ id: level-2-headings
+ title: Level 2 Headings
+ title.zh: 二级标题
+ type: heading
+ level: 4
+ collapsed: true
+ -
+ id: h2-divider-on
+ title: Enable H2 divider
+ title.zh: 启用H2分隔线
+ type: class-toggle
+ default: false
+ -
+ id: h2-font
+ title: H2 font
+ title.zh: H2 字体
+ type: variable-text
+ default: ''
+ -
+ id: h2-size
+ title: H2 font size
+ title.zh: H2 字体大小
+ description: Accepts any CSS font-size value
+ description.zh: 接受任何 CSS font-size 值
+ type: variable-text
+ default: 1.425em
+ -
+ id: h2-weight
+ title: H2 font weight
+ title.zh: H2 字重
+ description: Accepts a value from 100 to 900
+ description.zh: 接受 100-900 的值
+ type: variable-number
+ default: 675
+ -
+ id: h2-text-transform
+ title: H2 text-transform
+ title.zh: H2 text-transform
+ description: Accepts any CSS text-transform value
+ description.zh: 接受任何 CSS text-transform 值
+ type: variable-text
+ default: ''
+ -
+ id: h2-accent-color
+ title: Customize H2 accent color
+ title.zh: 自定义 H2 强调色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: h2-color-select
+ title: H2 text color
+ title.zh: H2 文本颜色
+ type: class-select
+ allowEmpty: false
+ default: h2-color-default
+ options:
+ - label: Default
+ value: h2-color-default
+ - label: Accent color
+ value: h2-color-designated
+ -
+ id: level-3-headings
+ title: Level 3 Headings
+ title.zh: 三级标题
+ type: heading
+ level: 4
+ collapsed: true
+ -
+ id: h3-divider-on
+ title: Enable H3 divider
+ title.zh: 启用H3分隔线
+ type: class-toggle
+ default: false
+ -
+ id: h3-font
+ title: H3 font
+ title.zh: H3 字体
+ type: variable-text
+ default: ''
+ -
+ id: h3-size
+ title: H3 font size
+ title.zh: H3 字体大小
+ description: Accepts any CSS font-size value
+ description.zh: 接受任何 CSS font-size 值
+ type: variable-text
+ default: 1.35em
+ -
+ id: h3-weight
+ title: H3 font weight
+ title.zh: H3 字重
+ description: Accepts a value from 100 to 900
+ description.zh: 接受 100-900 的值
+ type: variable-number
+ default: 650
+ -
+ id: h3-text-transform
+ title: H3 text-transform
+ title.zh: H3 text-transform
+ description: Accepts any CSS text-transform value
+ description.zh: 接受任何 CSS text-transform 值
+ type: variable-text
+ default: ''
+ -
+ id: h3-accent-color
+ title: Customize H3 accent color
+ title.zh: 自定义 H3 强调色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: h3-color-select
+ title: H3 text color
+ title.zh: H3 文本颜色
+ type: class-select
+ allowEmpty: false
+ default: h3-color-default
+ options:
+ - label: Default
+ value: h3-color-default
+ - label: Accent color
+ value: h3-color-designated
+ -
+ id: level-4-headings
+ title: Level 4 Headings
+ title.zh: 四级标题
+ type: heading
+ level: 4
+ collapsed: true
+ -
+ id: h4-divider-on
+ title: Enable H4 divider
+ title.zh: 启用H4分隔线
+ type: class-toggle
+ default: false
+ -
+ id: h4-font
+ title: H4 font
+ title.zh: H4 字体
+ type: variable-text
+ default: ''
+ -
+ id: h4-size
+ title: H4 font size
+ title.zh: H4 字体大小
+ description: Accepts any CSS font-size value
+ description.zh: 接受任何 CSS font-size 值
+ type: variable-text
+ default: 1.275em
+ -
+ id: h4-weight
+ title: H4 font weight
+ title.zh: H4 字重
+ description: Accepts a value from 100 to 900
+ description.zh: 接受 100-900 的值
+ type: variable-number
+ default: 625
+ -
+ id: h4-text-transform
+ title: H4 text-transform
+ title.zh: H4 text-transform
+ description: Accepts any CSS text-transform value
+ description.zh: 接受任何 CSS text-transform 值
+ type: variable-text
+ default: ''
+ -
+ id: h4-accent-color
+ title: Customize H4 accent color
+ title.zh: 自定义 H4 强调色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: h4-color-select
+ title: H4 text color
+ title.zh: H4 文本颜色
+ type: class-select
+ allowEmpty: false
+ default: h4-color-default
+ options:
+ - label: Default
+ value: h4-color-default
+ - label: Accent color
+ value: h4-color-designated
+ -
+ id: level-5-headings
+ title: Level 5 Headings
+ title.zh: 五级标题
+ type: heading
+ level: 4
+ collapsed: true
+ -
+ id: h5-divider-on
+ title: Enable H5 divider
+ title.zh: 启用H5分隔线
+ type: class-toggle
+ default: false
+ -
+ id: h5-font
+ title: H5 font
+ title.zh: H5 字体
+ type: variable-text
+ default: ''
+ -
+ id: h5-size
+ title: H5 font size
+ title.zh: H5 字体大小
+ description: Accepts any CSS font-size value
+ description.zh: 接受任何 CSS font-size 值
+ type: variable-text
+ default: 1.2em
+ -
+ id: h5-weight
+ title: H5 font weight
+ title.zh: H5 字重
+ description: Accepts a value from 100 to 900
+ description.zh: 接受 100-900 的值
+ type: variable-number
+ default: 600
+ -
+ id: h5-text-transform
+ title: H5 text-transform
+ title.zh: H5 text-transform
+ description: Accepts any CSS text-transform value
+ description.zh: 接受任何 CSS text-transform 值
+ type: variable-text
+ default: ''
+ -
+ id: h5-accent-color
+ title: Customize H5 accent color
+ title.zh: 自定义 H5 强调色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: h5-color-select
+ title: H5 text color
+ title.zh: H5 文本颜色
+ type: class-select
+ allowEmpty: false
+ default: h5-color-default
+ options:
+ - label: Default
+ value: h5-color-default
+ - label: Accent color
+ value: h5-color-designated
+ -
+ id: level-6-headings
+ title: Level 6 Headings
+ title.zh: 六级标题
+ type: heading
+ level: 4
+ collapsed: true
+ -
+ id: h6-divider-on
+ title: Enable H6 divider
+ title.zh: 启用H6分隔线
+ type: class-toggle
+ default: false
+ -
+ id: h6-font
+ title: H6 font
+ title.zh: H6 字体
+ type: variable-text
+ default: ''
+ -
+ id: h6-size
+ title: H6 font size
+ title.zh: H6 字体大小
+ description: Accepts any CSS font-size value
+ description.zh: 接受任何 CSS font-size 值
+ type: variable-text
+ default: 1.125em
+ -
+ id: h6-weight
+ title: H6 font weight
+ title.zh: H6 字重
+ description: Accepts a value from 100 to 900
+ description.zh: 接受 100-900 的值
+ type: variable-number
+ default: 575
+ -
+ id: h6-text-transform
+ title: H6 text-transform
+ title.zh: H6 text-transform
+ description: Accepts any CSS text-transform value
+ description.zh: 接受任何 CSS text-transform 值
+ type: variable-text
+ default: ''
+ -
+ id: h6-accent-color
+ title: Customize H6 accent color
+ title.zh: 自定义 H6 强调色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: h6-color-select
+ title: H6 text color
+ title.zh: H6 文本颜色
+ type: class-select
+ allowEmpty: false
+ default: h6-color-default
+ options:
+ - label: Default
+ value: h6-color-default
+ - label: Accent color
+ value: h6-color-designated
+ -
+ id: Paragraph
+ title: Paragraph
+ title.zh: 段落
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: text-align-justify
+ title: Justify paragraph text
+ title.zh: 段落两端对齐
+ type: class-toggle
+ default: false
+ -
+ id: line-height-customize
+ title: Paragraph line height
+ title.zh: 段落行高
+ type: variable-number
+ default: 1.5
+ -
+ id: file-line-width
+ title: Paragraph line width (Need to turn on “Readable line length”)
+ title.zh: 段落行宽(需开启“缩减栏宽”)
+ type: variable-text
+ default: 700px
+ -
+ id: p-spacing
+ title: Paragraph spacing (Reading mode)
+ title.zh: 段落间距(阅读模式)
+ type: variable-text
+ default: 1em
+ -
+ id: p-spacing-br
+ title: Paragraph spacing also takes effect after a line break (Reading mode)
+ title.zh: 段间距也对换行后的内容生效(阅读模式)
+ type: class-toggle
+ default: false
+ -
+ id: Text
+ title: Text
+ title.zh: 文本
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: bold-color
+ title: Bold text color
+ title.zh: 粗体颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: italic-color
+ title: Italic text color
+ title.zh: 斜体颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: text-highlight-bg
+ title: text highlight bg color
+ title.zh: 文本高亮背景颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: inline-code-normal
+ title: inline code text color
+ title.zh: 内联代码颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: inline-code-background-light
+ title: Customize inline code background (light mode)
+ title.zh: 自定义 内联代码背景(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: inline-code-background-dark
+ title: Customize inline code background (dark mode)
+ title.zh: 自定义 内联代码背景(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: Links
+ title: Links
+ title.zh: 链接
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: link-color
+ title: Link color
+ title.zh: 链接颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: link-color-hover
+ title: Link color (hover)
+ title.zh: 链接颜色(鼠标悬停时)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: link-decoration
+ title: Link decoration
+ title.zh: 链接装饰
+ description: Accepts any CSS text-decoration-line value
+ description.zh: 接受任何 CSS text-decoration-line 值
+ type: variable-text
+ default: underline
+ -
+ id: link-decoration-hover
+ title: Link decoration (hover)
+ title.zh: 链接装饰(鼠标悬停时)
+ description: Accepts any CSS text-decoration-line value
+ description.zh: 接受任何 CSS text-decoration-line 值
+ type: variable-text
+ default: underline
+ -
+ id: link-decoration-thickness
+ title: Link decoration thickness
+ title.zh: 链接装饰厚度
+ description: Accepts any CSS text-decoration-thickness value
+ description.zh: 接受任何 CSS text-decoration-thickness 值
+ type: variable-text
+ default: auto
+ -
+ id: link-unresolved
+ title: Unresolved link
+ title.zh: 未创建链接
+ type: heading
+ level: 4
+ collapsed: true
+ -
+ id: link-unresolved-color
+ title: Unresolved link color
+ title.zh: 未创建链接颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: link-unresolved-opacity
+ title: Unresolved link opacity
+ title.zh: 未创建链接透明度
+ type: variable-number-slider
+ default: 0.7
+ min: 0.25
+ max: 1
+ step: 0.05
+ -
+ id: link-unresolved-filter
+ title: Unresolved link filter
+ title.zh: 未创建链接 filter
+ description: Accepts any CSS filter value
+ description.zh: 接受任何 CSS filter 值
+ type: variable-text
+ default: none
+ -
+ id: link-unresolved-decoration-style
+ title: Unresolved link decoration style
+ title.zh: 未创建链接装饰风格
+ description: Accepts any CSS text-decoration-style value
+ description.zh: 接受任何 CSS text-decoration-style 值
+ type: variable-text
+ default: solid
+ -
+ id: link-unresolved-decoration-color
+ title: Unresolved link decoration color
+ title.zh: 未创建链接装饰颜色
+ type: variable-themed-color
+ format: hex
+ opacity: true
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: links-external
+ title: External links
+ title.zh: 外部链接
+ type: heading
+ level: 4
+ collapsed: true
+ -
+ id: link-external-color
+ title: External link color
+ title.zh: 外部链接颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: link-external-color-hover
+ title: External link color (hover)
+ title.zh: 外部链接颜色(鼠标悬停时)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: link-external-decoration
+ title: External link decoration
+ title.zh: 外部链接装饰
+ description: Accepts any CSS text-decoration-line value
+ description.zh: 接受任何 CSS text-decoration-line 值
+ type: variable-text
+ default: underline
+ -
+ id: link-external-decoration-hover
+ title: External link decoration (hover)
+ title.zh: 外部链接装饰(鼠标悬停时)
+ description: Accepts any CSS text-decoration-line value
+ description.zh: 接受任何 CSS text-decoration-line 值
+ type: variable-text
+ default: underline
+ -
+ id: link-external-filter
+ title: External link filter
+ title.zh: 外部链接 filter
+ description: Accepts any CSS filter value
+ description.zh: 接受任何 CSS filter 值
+ type: variable-text
+ default: none
+ -
+ id: Lists
+ title: Lists
+ title.zh: 列表
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: list-indent
+ title: list indent
+ title.zh: 列表缩进
+ type: variable-text
+ default: 2em
+ -
+ id: list-spacing
+ title: list spacing
+ title.zh: 列表间距
+ type: variable-text
+ default: 0.075em
+ -
+ id: list-bullet-size
+ title: list marker size
+ title.zh: 列表标记大小
+ type: variable-text
+ default: 0.3em
+ -
+ id: list-marker-color
+ title: list marker color
+ title.zh: 列表标记颜色
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: list-marker-color-hover
+ title: list marker color (hover)
+ title.zh: 列表标记颜色(鼠标悬停时)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: list-marker-color-collapsed
+ title: list marker color (collapsed)
+ title.zh: 列表标记颜色(折叠时)
+ type: variable-themed-color
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: ul-marker-restore
+ title: Restore default style of unordered list
+ title.zh: 恢复无序列表的默认样式
+ type: class-toggle
+ default: false
+ -
+ id: Tags
+ title: Tags
+ title.zh: 标签
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: tag-color
+ title: Tag text color
+ title.zh: 标签文本颜色
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: tag-background
+ title: Tag background color
+ title.zh: 标签背景颜色
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: tag-background-hover
+ title: Tag background color (hover)
+ title.zh: 标签背景颜色(鼠标悬停时)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: Table
+ title: Table
+ title.zh: 表格
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: table-header-color
+ title: Customize table header color
+ title.zh: 自定义 表头颜色(亮色模式)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: table-header-background-light
+ title: Customize table header background (light mode)
+ title.zh: 自定义 表头背景(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: table-header-background-dark
+ title: Customize table header background (dark mode)
+ title.zh: 自定义 表头背景(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: table-width-select
+ title: Table width
+ title.zh: 表格宽度
+ type: class-select
+ allowEmpty: false
+ default: table-width-default
+ options:
+ - label: Consistent with line width (Default)
+ value: table-width-default
+ - label: Obsidian default
+ value: table-width-obsidian-default
+ - label: Customize table width
+ value: table-width-customized
+ -
+ id: table-width
+ title: customize table width
+ title.zh: 自定义表格宽度
+ description: () percent of the editor panel width
+ description.zh: 编辑器面板宽度的百分之()
+ type: variable-number-slider
+ default: 88
+ min: 10
+ max: 100
+ step: 1
+ format: cqw
+ -
+ id: Image
+ title: Image
+ title.zh: 图片
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: img-center-align
+ title: center-align the image
+ title.zh: 图像居中显示
+ type: class-toggle
+ -
+ id: img-darken
+ title: darken image in dark mode
+ title.zh: 在暗黑模式下暗化图像
+ description: Hover to restore image
+ description.zh: 鼠标经过时还原
+ type: class-toggle
+ -
+ id: zoom-off
+ title: Disable Image zoom
+ title.zh: 关闭图像缩放
+ description: from https://github.com/kepano/obsidian-minimal, author:@kepano
+ type: class-toggle
+ -
+ id: Code-heading
+ title: Codeblock
+ title.zh: 代码块
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: codeblock-style-select
+ title: Codeblock theme
+ title.zh: 代码块主题
+ type: class-select
+ allowEmpty: false
+ default: codeblock-style-customize
+ options:
+ - label: Customize
+ value: codeblock-style-customize
+ - label: Dracula
+ value: codeblock-style-dracula
+ - label: Solarized light
+ value: codeblock-style-solarized-light
+ - label: Solarized dark
+ value: codeblock-style-solarized-dark
+ - label: One dark
+ value: codeblock-style-one-dark
+ -
+ id: code-background-light
+ title: Customize codeblock background (light mode)
+ title.zh: 自定义 代码块背景(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: code-border-light
+ title: Customize codeblock border (light mode)
+ title.zh: 自定义 代码块边框(亮色模式)
+ description: Input any CSS border value
+ description.zh: 输入任意 CSS border 值
+ type: variable-text
+ default: ''
+ -
+ id: code-background-dark
+ title: Customize codeblock background (dark mode)
+ title.zh: 自定义 代码块背景(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: code-border-dark
+ title: Customize codeblock border (dark mode)
+ title.zh: 自定义 代码块边框(暗色模式)
+ description: Input any CSS border value
+ description.zh: 输入任意 CSS border 值
+ type: variable-text
+ default: ''
+ -
+ id: code-normal
+ title: code-normal
+ title.zh: code-normal
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-comment
+ title: code-comment
+ title.zh: code-comment
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-function
+ title: code-function
+ title.zh: code-function
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-important
+ title: code-important
+ title.zh: code-important
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-keyword
+ title: code-keyword
+ title.zh: code-keyword
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-operator
+ title: code-operator
+ title.zh: code-operator
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-property
+ title: code-property
+ title.zh: code-property
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-punctuation
+ title: code-punctuation
+ title.zh: code-punctuation
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-string
+ title: code-string
+ title.zh: code-string
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-tag
+ title: code-tag
+ title.zh: code-tag
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: code-value
+ title: code-value
+ title.zh: code-value
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: Blockquote-heading
+ title: Blockquote
+ title.zh: 块引用
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: blockquote-background-light
+ title: Customize blockquote background (light mode)
+ title.zh: 自定义 块引用背景(亮色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: blockquote-background-dark
+ title: Customize blockquote background (dark mode)
+ title.zh: 自定义 块引用背景(暗色模式)
+ description: Input any CSS background value
+ description.zh: 输入任意 CSS background 值
+ type: variable-text
+ default: ''
+ -
+ id: Callouts
+ title: Callouts
+ title.zh: 标注
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: callout-style-select
+ title: callout style
+ title.zh: 标注风格
+ type: class-select
+ allowEmpty: false
+ default: callout-style-customize
+ options:
+ - label: Customize
+ value: callout-style-customize
+ - label: style 1
+ value: callout-style-1
+ - label: style 2
+ value: callout-style-2
+ - label: style 3
+ value: callout-style-3
+ - label: style 4
+ value: callout-style-4
+ -
+ id: callout-border-width
+ title: callout border width
+ title.zh: 标注边框大小
+ type: variable-text
+ description: Input any CSS border-width value
+ description.zh: 输入任意 CSS border-width 值
+ default: 0px
+ -
+ id: callout-border-opacity
+ title: callout border opacity
+ title.zh: 标注边框透明度
+ type: variable-number-slider
+ default: 0.25
+ min: 0
+ max: 1
+ step: 0.05
+ -
+ id: callout-padding
+ title: callout padding
+ title.zh: 标注边距
+ description: Accepts any CSS padding value
+ description.zh: 接受任何 CSS padding 值
+ type: variable-text
+ default: ''
+ -
+ id: callout-radius
+ title: callout radius
+ title.zh: 标注圆角
+ description: Input your border-radius value here
+ description.zh: 在这里输入你的 border-radius 值
+ type: variable-text
+ default: ''
+ -
+ id: callout-title-color
+ title: callout title color
+ title.zh: 标注标题颜色
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: callout-title-padding
+ title: callout title padding
+ title.zh: 标注标题边距
+ description: Accepts any CSS padding value
+ description.zh: 接受任何 CSS padding 值
+ type: variable-text
+ default: ''
+ -
+ id: callout-title-size
+ title: callout title size
+ title.zh: 标注标题大小
+ description: Accepts any CSS font-size value
+ description.zh: 接受任何 CSS font-size 值
+ type: variable-text
+ default: ''
+ -
+ id: callout-content-padding
+ title: callout content padding
+ title.zh: 标注内容边距
+ description: Accepts any CSS padding value
+ description.zh: 接受任何 CSS padding 值
+ type: variable-text
+ default: ''
+ -
+ id: callout-content-background
+ title: callout content background
+ title.zh: 标注内容背景
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: callout-content-radius
+ title: callout content radius
+ title.zh: 标注内容圆角
+ description: Input your border-radius value here
+ description.zh: 在这里输入你的 border-radius 值
+ type: variable-text
+ default: ''
+ -
+ id: Embeds
+ title: Embeds
+ title.zh: 内嵌文档
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: seamless-embeds
+ title: seamless embeds
+ title.zh: 无缝嵌入
+ type: class-toggle
+ -
+ id: embed-background
+ title: embed background
+ title.zh: 内嵌文档 背景
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: embed-padding
+ title: embed padding
+ title.zh: 内嵌文档 padding
+ description: Input any CSS padding value
+ description.zh: 输入任意 CSS padding 值
+ type: variable-text
+ default: ''
+ -
+ id: embed-border-radius
+ title: embed border radius
+ title.zh: 内嵌文档 圆角半径
+ description: Input any CSS border-radius value
+ description.zh: 输入任意 CSS border-radius 值
+ type: variable-text
+ default: ''
+ -
+ id: embed-font-style
+ title: embed font style
+ title.zh: 内嵌文档 字体风格
+ description: Input any CSS font-style value
+ description.zh: 输入任意 CSS font-style 值
+ type: variable-text
+ default: ''
+ -
+ id: Checkbox
+ title: Checkbox
+ title.zh: 复选框
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: checkbox-radius
+ title: checkbox radius
+ title.zh: 复选框 圆角半径
+ description: Input any CSS border-radius value
+ description.zh: 输入任意 CSS border-radius 值
+ type: variable-text
+ default: ''
+ -
+ id: checkbox-marker-color
+ title: checkbox marker color
+ title.zh: 复选框标记颜色
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: checkbox-color
+ title: checkbox color
+ title.zh: 复选框颜色
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: checkbox-color-hover
+ title: checkbox color (hover)
+ title.zh: 复选框颜色(鼠标悬停时)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: checkbox-border-color
+ title: checkbox border color
+ title.zh: 复选框边框颜色
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+ -
+ id: checkbox-border-color-hover
+ title: checkbox border color (hover)
+ title.zh: 复选框边框颜色(鼠标悬停时)
+ type: variable-themed-color
+ opacity: true
+ format: hex
+ default-light: '#'
+ default-dark: '#'
+
+
+*/
+
+/* @settings
+
+name: Mobile
+id: Mobile
+settings:
+ -
+ id: card-layout-pad-open
+ title: Enable card layout (pad only)
+ title.zh: 开启卡片式布局(平板端)
+ type: class-toggle
+ -
+ id: drawer-phone-full-width
+ title: Side drawer full screen (phone only)
+ title.zh: 侧边抽屉全屏(手机端)
+ type: class-toggle
+
+*/
+
+/* @settings
+
+name: Plugin
+id: Plugin
+settings:
+ -
+ id: DB Folder
+ title: DB Folder
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: DB-table-full-width-off
+ title: Disable full width table
+ title.zh: 关闭 全宽表格
+ type: class-toggle
+ -
+ id: DB-table-bg-color
+ title: background color
+ title.zh: 背景颜色
+ type: class-select
+ allowEmpty: false
+ default: DB-table-bg-color-default
+ options:
+ - label: Default
+ value: DB-table-bg-color-default
+ - label: Adapt to lower background
+ value: DB-table-bg-color-adapt
+ - label: Unify background color
+ value: DB-table-bg-color-unify
+ -
+ id: Projects
+ title: Projects
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: Projects-bg-color
+ title: background color
+ title.zh: 背景颜色
+ type: class-select
+ allowEmpty: false
+ default: Projects-bg-color-default
+ options:
+ - label: Default
+ value: Projects-bg-color-default
+ - label: Adapt to lower background
+ value: Projects-bg-color-adapt
+ - label: Unify background color
+ value: Projects-bg-color-unify
+ -
+ id: Surfing
+ title: Surfing
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: Surfing-bookmark-bar-hide
+ title: Hide bookmark bar when browsing web
+ title.zh: 浏览网页时隐藏书签栏
+ type: class-toggle
+ -
+ id: Checklist
+ title: Checklist
+ type: heading
+ collapsed: true
+ level: 3
+ -
+ id: colorful-checkbox
+ title: colorful checkbox
+ title.zh: 多彩选框
+ type: class-toggle
+
+
+*/
+
+
+/*hide style setting option*/
+body:not(.border-focus-mode) .setting-item:is([data-id=line-active-bg], [data-id=line-normal-opacity]),
+body:not(.inline-title-color-customized) .setting-item[data-id=inline-title-color],
+body:not(.background-underlying-Color-light) .setting-item[data-id=background-underlying-light],
+body:not(.background-underlying-CSS-light) .setting-item:is([data-id=background-underlying-CSS-light], [data-id=background-underlying-CSS-blend-mode-light]),
+body:not(.background-underlying-Color-dark) .setting-item[data-id=background-underlying-dark],
+body:not(.background-underlying-CSS-dark) .setting-item:is([data-id=background-underlying-CSS-dark], [data-id=background-underlying-CSS-blend-mode-dark]),
+body.mod-root-split-background-primary-light .setting-item[data-id=background-mod-root-split-light],
+body.mod-root-split-background-primary-light .setting-item[data-id=background-mod-root-CSS-light],
+body.mod-root-split-background-primary-light .setting-item[data-id=background-mod-root-CSS-blend-mode-light],
+body.mod-root-split-background-primary-light .setting-item[data-id=background-mod-root-CSS-backdrop-filter-light],
+body.mod-root-split-background-secondary-light .setting-item[data-id=background-mod-root-split-light],
+body.mod-root-split-background-secondary-light .setting-item[data-id=background-mod-root-CSS-light],
+body.mod-root-split-background-secondary-light .setting-item[data-id=background-mod-root-CSS-blend-mode-light],
+body.mod-root-split-background-secondary-light .setting-item[data-id=background-mod-root-CSS-backdrop-filter-light],
+body.mod-root-split-background-transparent-light .setting-item[data-id=background-mod-root-split-light],
+body.mod-root-split-background-transparent-light .setting-item[data-id=background-mod-root-CSS-light],
+body.mod-root-split-background-transparent-light .setting-item[data-id=background-mod-root-CSS-blend-mode-light],
+body.mod-root-split-background-transparent-light .setting-item[data-id=background-mod-root-CSS-backdrop-filter-light],
+body.mod-root-split-background-CSS-light .setting-item[data-id=background-mod-root-split-light],
+body.mod-root-split-background-customize-light .setting-item[data-id=background-mod-root-CSS-light],
+body.mod-root-split-background-customize-light .setting-item[data-id=background-mod-root-CSS-blend-mode-light],
+body.mod-root-split-background-customize-light .setting-item[data-id=background-mod-root-CSS-backdrop-filter-light],
+body.mod-root-split-background-primary-dark .setting-item[data-id=background-mod-root-split-dark],
+body.mod-root-split-background-primary-dark .setting-item[data-id=background-mod-root-CSS-dark],
+body.mod-root-split-background-primary-dark .setting-item[data-id=background-mod-root-CSS-blend-mode-dark],
+body.mod-root-split-background-primary-dark .setting-item[data-id=background-mod-root-CSS-backdrop-filter-dark],
+body.mod-root-split-background-secondary-dark .setting-item[data-id=background-mod-root-split-dark],
+body.mod-root-split-background-secondary-dark .setting-item[data-id=background-mod-root-CSS-dark],
+body.mod-root-split-background-secondary-dark .setting-item[data-id=background-mod-root-CSS-blend-mode-dark],
+body.mod-root-split-background-secondary-dark .setting-item[data-id=background-mod-root-CSS-backdrop-filter-dark],
+body.mod-root-split-background-transparent-dark .setting-item[data-id=background-mod-root-split-dark],
+body.mod-root-split-background-transparent-dark .setting-item[data-id=background-mod-root-CSS-dark],
+body.mod-root-split-background-transparent-dark .setting-item[data-id=background-mod-root-CSS-blend-mode-dark],
+body.mod-root-split-background-transparent-dark .setting-item[data-id=background-mod-root-CSS-backdrop-filter-dark],
+body.mod-root-split-background-CSS-dark .setting-item[data-id=background-mod-root-split-dark],
+body.mod-root-split-background-customize-dark .setting-item[data-id=background-mod-root-CSS-dark],
+body.mod-root-split-background-customize-dark .setting-item[data-id=background-mod-root-CSS-blend-mode-dark],
+body.mod-root-split-background-customize-dark .setting-item[data-id=background-mod-root-CSS-backdrop-filter-dark],
+body.mod-left-split-background-primary-light .setting-item[data-id=background-mod-left-split-light],
+body.mod-left-split-background-primary-light .setting-item[data-id=background-mod-left-CSS-light],
+body.mod-left-split-background-primary-light .setting-item[data-id=background-mod-left-CSS-blend-mode-light],
+body.mod-left-split-background-primary-light .setting-item[data-id=background-mod-left-CSS-backdrop-filter-light],
+body.mod-left-split-background-secondary-light .setting-item[data-id=background-mod-left-split-light],
+body.mod-left-split-background-secondary-light .setting-item[data-id=background-mod-left-CSS-light],
+body.mod-left-split-background-secondary-light .setting-item[data-id=background-mod-left-CSS-blend-mode-light],
+body.mod-left-split-background-secondary-light .setting-item[data-id=background-mod-left-CSS-backdrop-filter-light],
+body.mod-left-split-background-transparent-light .setting-item[data-id=background-mod-left-split-light],
+body.mod-left-split-background-transparent-light .setting-item[data-id=background-mod-left-CSS-light],
+body.mod-left-split-background-transparent-light .setting-item[data-id=background-mod-left-CSS-blend-mode-light],
+body.mod-left-split-background-transparent-light .setting-item[data-id=background-mod-left-CSS-backdrop-filter-light],
+body.mod-left-split-background-CSS-light .setting-item[data-id=background-mod-left-split-light],
+body.mod-left-split-background-customize-light .setting-item[data-id=background-mod-left-CSS-light],
+body.mod-left-split-background-customize-light .setting-item[data-id=background-mod-left-CSS-blend-mode-light],
+body.mod-left-split-background-customize-light .setting-item[data-id=background-mod-left-CSS-backdrop-filter-light],
+body.mod-left-split-background-primary-dark .setting-item[data-id=background-mod-left-split-dark],
+body.mod-left-split-background-primary-dark .setting-item[data-id=background-mod-left-CSS-dark],
+body.mod-left-split-background-primary-dark .setting-item[data-id=background-mod-left-CSS-blend-mode-dark],
+body.mod-left-split-background-primary-dark .setting-item[data-id=background-mod-left-CSS-backdrop-filter-dark],
+body.mod-left-split-background-secondary-dark .setting-item[data-id=background-mod-left-split-dark],
+body.mod-left-split-background-secondary-dark .setting-item[data-id=background-mod-left-CSS-dark],
+body.mod-left-split-background-secondary-dark .setting-item[data-id=background-mod-left-CSS-blend-mode-dark],
+body.mod-left-split-background-secondary-dark .setting-item[data-id=background-mod-left-CSS-backdrop-filter-dark],
+body.mod-left-split-background-transparent-dark .setting-item[data-id=background-mod-left-split-dark],
+body.mod-left-split-background-transparent-dark .setting-item[data-id=background-mod-left-CSS-dark],
+body.mod-left-split-background-transparent-dark .setting-item[data-id=background-mod-left-CSS-blend-mode-dark],
+body.mod-left-split-background-transparent-dark .setting-item[data-id=background-mod-left-CSS-backdrop-filter-dark],
+body.mod-left-split-background-CSS-dark .setting-item[data-id=background-mod-left-split-dark],
+body.mod-left-split-background-customize-dark .setting-item[data-id=background-mod-left-CSS-dark],
+body.mod-left-split-background-customize-dark .setting-item[data-id=background-mod-left-CSS-blend-mode-dark],
+body.mod-left-split-background-customize-dark .setting-item[data-id=background-mod-left-CSS-backdrop-filter-dark],
+body.mod-right-split-background-primary-light .setting-item[data-id=background-mod-right-split-light],
+body.mod-right-split-background-primary-light .setting-item[data-id=background-mod-right-CSS-light],
+body.mod-right-split-background-primary-light .setting-item[data-id=background-mod-right-CSS-blend-mode-light],
+body.mod-right-split-background-primary-light .setting-item[data-id=background-mod-right-CSS-backdrop-filter-light],
+body.mod-right-split-background-secondary-light .setting-item[data-id=background-mod-right-split-light],
+body.mod-right-split-background-secondary-light .setting-item[data-id=background-mod-right-CSS-light],
+body.mod-right-split-background-secondary-light .setting-item[data-id=background-mod-right-CSS-blend-mode-light],
+body.mod-right-split-background-secondary-light .setting-item[data-id=background-mod-right-CSS-backdrop-filter-light],
+body.mod-right-split-background-transparent-light .setting-item[data-id=background-mod-right-split-light],
+body.mod-right-split-background-transparent-light .setting-item[data-id=background-mod-right-CSS-light],
+body.mod-right-split-background-transparent-light .setting-item[data-id=background-mod-right-CSS-blend-mode-light],
+body.mod-right-split-background-transparent-light .setting-item[data-id=background-mod-right-CSS-backdrop-filter-light],
+body.mod-right-split-background-CSS-light .setting-item[data-id=background-mod-right-split-light],
+body.mod-right-split-background-customize-light .setting-item[data-id=background-mod-right-CSS-light],
+body.mod-right-split-background-customize-light .setting-item[data-id=background-mod-right-CSS-blend-mode-light],
+body.mod-right-split-background-customize-light .setting-item[data-id=background-mod-right-CSS-backdrop-filter-light],
+body.mod-right-split-background-primary-dark .setting-item[data-id=background-mod-right-split-dark],
+body.mod-right-split-background-primary-dark .setting-item[data-id=background-mod-right-CSS-dark],
+body.mod-right-split-background-primary-dark .setting-item[data-id=background-mod-right-CSS-blend-mode-dark],
+body.mod-right-split-background-primary-dark .setting-item[data-id=background-mod-right-CSS-backdrop-filter-dark],
+body.mod-right-split-background-secondary-dark .setting-item[data-id=background-mod-right-split-dark],
+body.mod-right-split-background-secondary-dark .setting-item[data-id=background-mod-right-CSS-dark],
+body.mod-right-split-background-secondary-dark .setting-item[data-id=background-mod-right-CSS-blend-mode-dark],
+body.mod-right-split-background-secondary-dark .setting-item[data-id=background-mod-right-CSS-backdrop-filter-dark],
+body.mod-right-split-background-transparent-dark .setting-item[data-id=background-mod-right-split-dark],
+body.mod-right-split-background-transparent-dark .setting-item[data-id=background-mod-right-CSS-dark],
+body.mod-right-split-background-transparent-dark .setting-item[data-id=background-mod-right-CSS-blend-mode-dark],
+body.mod-right-split-background-transparent-dark .setting-item[data-id=background-mod-right-CSS-backdrop-filter-dark],
+body.mod-right-split-background-CSS-dark .setting-item[data-id=background-mod-right-split-dark],
+body.mod-right-split-background-customize-dark .setting-item[data-id=background-mod-right-CSS-dark],
+body.mod-right-split-background-customize-dark .setting-item[data-id=background-mod-right-CSS-blend-mode-dark],
+body.mod-right-split-background-customize-dark .setting-item[data-id=background-mod-right-CSS-backdrop-filter-dark],
+body.activated-file-default-light .setting-item[data-id=color-activated-file-light],
+body.activated-file-default-light .setting-item[data-id=border-radius-activated-file-light],
+body.activated-file-default-light .setting-item[data-id=background-activated-file-light],
+body.activated-file-default-light .setting-item[data-id=shadow-activated-file-light],
+body.activated-file-accent-light .setting-item[data-id=color-activated-file-light],
+body.activated-file-accent-light .setting-item[data-id=border-radius-activated-file-light],
+body.activated-file-accent-light .setting-item[data-id=background-activated-file-light],
+body.activated-file-accent-light .setting-item[data-id=shadow-activated-file-light],
+body.activated-file-tab-style-light .setting-item[data-id=color-activated-file-light],
+body.activated-file-tab-style-light .setting-item[data-id=border-radius-activated-file-light],
+body.activated-file-tab-style-light .setting-item[data-id=background-activated-file-light],
+body.activated-file-tab-style-light .setting-item[data-id=shadow-activated-file-light],
+body.activated-file-default-dark .setting-item[data-id=color-activated-file-dark],
+body.activated-file-default-dark .setting-item[data-id=border-radius-activated-file-dark],
+body.activated-file-default-dark .setting-item[data-id=background-activated-file-dark],
+body.activated-file-default-dark .setting-item[data-id=shadow-activated-file-dark],
+body.activated-file-accent-dark .setting-item[data-id=color-activated-file-dark],
+body.activated-file-accent-dark .setting-item[data-id=border-radius-activated-file-dark],
+body.activated-file-accent-dark .setting-item[data-id=background-activated-file-dark],
+body.activated-file-accent-dark .setting-item[data-id=shadow-activated-file-dark],
+body.activated-file-tab-style-dark .setting-item[data-id=color-activated-file-dark],
+body.activated-file-tab-style-dark .setting-item[data-id=border-radius-activated-file-dark],
+body.activated-file-tab-style-dark .setting-item[data-id=background-activated-file-dark],
+body.activated-file-tab-style-dark .setting-item[data-id=shadow-activated-file-dark],
+body:not(.table-width-customized) .setting-item[data-id=table-width],
+body.file-icon-remove .setting-item[data-id=colorful-folder],
+body:not(.new-tab-image-customize) .setting-item[data-id=new-tab-image],
+body:not(.line-hover-indicator) .setting-item[data-id=hover-indicator-color],
+body:not(.codeblock-style-customize) .setting-item:is([data-id=code-background-light], [data-id=code-background-dark], [data-id=code-border-light], [data-id=code-border-dark], [data-id=code-normal], [data-id=code-comment], [data-id=code-function], [data-id=code-important], [data-id=code-keyword], [data-id=code-operator], [data-id=code-property], [data-id=code-punctuation], [data-id=code-string], [data-id=code-tag], [data-id=code-value]),
+body:not(.callout-style-customize) .setting-item:is([data-id=callout-border-width], [data-id=callout-border-opacity], [data-id=callout-padding], [data-id=callout-radius], [data-id=callout-title-color], [data-id=callout-title-padding], [data-id=callout-title-padding], [data-id=callout-title-size], [data-id=callout-content-padding], [data-id=callout-content-background], [data-id=callout-content-radius]) {
+ display: none;
+}
+
+.accent-color-override-light.theme-light .mod-settings .vertical-tab-content-container>.vertical-tab-content>.setting-item:nth-child(2)>.setting-item-control>.clickable-icon.extra-setting-button:has(+ input[type=color]),
+.accent-color-override-dark.theme-dark .mod-settings .vertical-tab-content-container>.vertical-tab-content>.setting-item:nth-child(2)>.setting-item-control>.clickable-icon.extra-setting-button:has(+ input[type=color]),
+.accent-color-override-light.theme-light .mod-settings .vertical-tab-content-container>.vertical-tab-content>.setting-item:nth-child(2)>.setting-item-control>input[type=color],
+.accent-color-override-dark.theme-dark .mod-settings .vertical-tab-content-container>.vertical-tab-content>.setting-item:nth-child(2)>.setting-item-control>input[type=color] {
+ position: relative;
+ visibility: hidden;
+}
+
+.accent-color-override-light.theme-light .mod-settings .vertical-tab-content-container>.vertical-tab-content>.setting-item:nth-child(2)>.setting-item-control>input[type=color]::before,
+.accent-color-override-dark.theme-dark .mod-settings .vertical-tab-content-container>.vertical-tab-content>.setting-item:nth-child(2)>.setting-item-control>input[type=color]::before {
+ content: "Overridden by Style Settings";
+ font-family: var(--font-interface);
+ font-size: var(--font-ui-smaller);
+ position: absolute;
+ width: max-content;
+ right: 0px;
+ top: 50%;
+ transform: translateY(-50%);
+ visibility: visible;
+ pointer-events: none;
+}
+
+.accent-color-override-light.theme-light.is-mobile .mod-settings .vertical-tab-content-container>.vertical-tab-content>.setting-item:nth-child(2)>.setting-item-control>input[type=color]::before,
+.accent-color-override-dark.theme-dark.is-mobile .mod-settings .vertical-tab-content-container>.vertical-tab-content>.setting-item:nth-child(2)>.setting-item-control>input[type=color]::before {
+ width: auto;
+}
+
+/* color */
+
+body {
+ /* Accent HSL values */
+ --accent-h: 232;
+ --accent-s: 80%;
+ --accent-l: 64%;
+}
+
+.theme-light.accent-color-override-light {
+ --accent-h: var(--accent-light-h) !important;
+ --accent-s: var(--accent-light-s) !important;
+ --accent-l: var(--accent-light-l) !important;
+}
+
+.theme-dark.accent-color-override-dark {
+ --accent-h: var(--accent-dark-h) !important;
+ --accent-s: var(--accent-dark-s) !important;
+ --accent-l: var(--accent-dark-l) !important;
+}
+
+.theme-light {
+ color-scheme: light;
+ --text-normal: hsl(var(--accent-h), 12%, 12%);
+ --text-muted: hsl(var(--accent-h), 9%, 36%);
+ --text-faint: hsl(var(--accent-h), 6%, 64%);
+ --highlight-mix-blend-mode: darken;
+ --mono-rgb-0: 255, 255, 255;
+ --mono-rgb-100: 0, 0, 0;
+ --color-red-rgb: 221, 44, 56;
+ --color-red: rgb(var(--color-red-rgb));
+ --color-green-rgb: 29, 165, 29;
+ --color-green: rgb(var(--color-green-rgb));
+ --color-orange-rgb: 222, 116, 23;
+ --color-orange: rgb(var(--color-orange-rgb));
+ --color-yellow-rgb: 192, 156, 12;
+ --color-yellow: rgb(var(--color-yellow-rgb));
+ --color-cyan-rgb: 22, 166, 171;
+ --color-cyan: rgb(var(--color-cyan-rgb));
+ --color-blue-rgb: 23, 117, 217;
+ --color-blue: rgb(var(--color-blue-rgb));
+ --color-purple-rgb: 143, 71, 225;
+ --color-purple: rgb(var(--color-purple-rgb));
+ --color-pink-rgb: 221, 19, 153;
+ --color-pink: rgb(var(--color-pink-rgb));
+ --color-base-00: #ffffff;
+ --color-base-05: #fcfcfc;
+ --color-base-10: #fafafa;
+ --color-base-15: #f7f7f7;
+ --color-base-20: #F0F0F0;
+ --color-base-25: #e3e3e3;
+ --color-base-30: #e0e0e0;
+ --color-base-35: #d4d4d4;
+ --color-base-40: #bdbdbd;
+ --color-base-50: #ababab;
+ --color-base-60: #707070;
+ --color-base-70: #5a5a5a;
+ --color-base-100: #222222;
+ --accent-h: var(--accent-light-h);
+ --accent-s: var(--accent-light-s);
+ --accent-l: var(--accent-light-l);
+ --accent-light-h: 232;
+ --accent-light-s: 80%;
+ --accent-light-l: 64%;
+ --color-accent-hsl: var(--color-accent-hsl-light);
+ --color-accent: var(--color-accent-light);
+ --color-accent-1: var(--color-accent-1-light);
+ --color-accent-2: var(--color-accent-2-light);
+ --color-accent-3: var(--color-accent-3-light);
+ --color-accent-hsl-light: var(--accent-h),
+ var(--accent-s),
+ var(--accent-l);
+ --color-accent-light: hsl(var(--accent-h), var(--accent-s), var(--accent-l));
+ --color-accent-1-light: hsl(var(--accent-h), var(--accent-s), calc(var(--accent-l) + 2.5%));
+ --color-accent-2-light: hsl(var(--accent-h), var(--accent-s), calc(var(--accent-l) + 5%));
+ --color-accent-3-light: hsla(var(--accent-h), calc(0.4*var(--accent-s)), calc(var(--accent-l)));
+ --background-modifier-border: hsla(var(--accent-h), calc(0.4*var(--accent-s)), calc(var(--accent-l)), 0.2);
+ --background-modifier-border-hover: hsla(var(--accent-h), calc(0.4*var(--accent-s)), calc(var(--accent-l)), 0.25);
+ --background-modifier-border-focus: hsla(var(--accent-h), calc(0.4*var(--accent-s)), calc(var(--accent-l)), 0.3);
+ --background-primary: var(--color-base-00);
+ --background-primary-alt: var(--color-base-10);
+ --background-secondary: hsl(var(--accent-h),
+ calc((var(--accent-s)) / 6),
+ calc(100% - (100% - var(--accent-l)) / 16));
+ --background-secondary-alt: var(--color-base-05);
+ --background-tertiary: hsl(var(--accent-h),
+ calc((var(--accent-s)) / 2),
+ calc(100% - (100% - var(--accent-l)) / 12));
+ --workspace-background-translucent: rgba(246, 246, 246, 0.8);
+ --background-modifier-hover: hsla(var(--accent-h), 6%, 64%, 0.15);
+ --background-modifier-active-hover: hsla(var(--interactive-accent-hsl), 0.15);
+ --background-modifier-box-shadow: rgba(0, 0, 0, 0.1);
+ --background-modifier-cover: rgba(220, 220, 220, 0.4);
+ --background-modifier-form-field: transparent;
+ --search-result-background: transparent;
+ --text-highlight-bg: rgba(255, 208, 0, 0.4);
+ --text-highlight-bg-active: rgba(255, 128, 0, 0.4);
+ --shadow-s: 0px 1px 2px rgba(0, 0, 0, 0.028),
+ 0px 3.4px 6.7px rgba(0, 0, 0, .042),
+ 0px 15px 30px rgba(0, 0, 0, .07);
+ --shadow-l: 0px 1.8px 7.3px rgba(0, 0, 0, 0.071),
+ 0px 6.3px 24.7px rgba(0, 0, 0, 0.112),
+ 0px 30px 90px rgba(0, 0, 0, 0.2);
+}
+
+.theme-light-background-old-default {
+ --background-primary: var(--color-base-00);
+ --background-primary-alt: var(--color-base-10);
+ --background-secondary: hsl(var(--accent-h),
+ calc((var(--accent-s) - 12%) / 6),
+ calc(100% - (100% - var(--accent-l)) / 16));
+ --background-secondary-alt: var(--color-base-05);
+ --background-tertiary: hsl(calc(var(--accent-h) - 18),
+ calc(var(--accent-s) - 4%),
+ calc(100% - (100% - var(--accent-l)) / 8));
+}
+
+.theme-light.theme-light-background-adapt {
+ --color-accent-3-light: hsla(var(--accent-h), calc(0.4*var(--accent-s)), calc(0.81*var(--accent-l)));
+ --background-primary: hsl(var(--accent-h),
+ calc(var(--accent-s) / 2),
+ calc(100% - (100% - var(--accent-l)) / 12));
+ --background-primary-alt: hsl(var(--accent-h),
+ calc(var(--accent-s) / 2),
+ calc(100% - (100% - var(--accent-l)) / 10));
+ --background-secondary: hsl(var(--accent-h),
+ calc(var(--accent-s) / 2),
+ calc(100% - (100% - var(--accent-l)) / 8));
+ --background-secondary-alt: hsl(var(--accent-h),
+ calc(var(--accent-s) / 2),
+ calc(100% - (100% - var(--accent-l)) / 7));
+ --background-tertiary: hsl(var(--accent-h),
+ calc(var(--accent-s)),
+ calc(100% - (100% - var(--accent-l)) / 6));
+ --interactive-normal: var(--color-base-00);
+ --interactive-hover: var(--color-base-10);
+ --background-modifier-hover: hsla(var(--accent-h), 6%, 64%, 0.225);
+}
+
+.theme-dark {
+ color-scheme: dark;
+ --text-normal: hsl(var(--accent-h), 24%, 84%);
+ --text-muted: hsl(var(--accent-h), 18%, 72%);
+ --text-faint: hsl(var(--accent-h), 12%, 44%);
+ --highlight-mix-blend-mode: lighten;
+ --mono-rgb-0: 0, 0, 0;
+ --mono-rgb-100: 255, 255, 255;
+ --color-red-rgb: 255, 120, 129;
+ --color-red: rgb(var(--color-red-rgb));
+ --color-green-rgb: 124, 211, 124;
+ --color-green: rgb(var(--color-green-rgb));
+ --color-orange-rgb: 251, 187, 131;
+ --color-orange: rgb(var(--color-orange-rgb));
+ --color-yellow-rgb: 255, 232, 139;
+ --color-yellow: rgb(var(--color-yellow-rgb));
+ --color-cyan-rgb: 134, 223, 226;
+ --color-cyan: rgb(var(--color-cyan-rgb));
+ --color-blue-rgb: 137, 189, 244;
+ --color-blue: rgb(var(--color-blue-rgb));
+ --color-purple-rgb: 203, 158, 255;
+ --color-purple: rgb(var(--color-purple-rgb));
+ --color-pink-rgb: 242, 182, 222;
+ --color-pink: rgb(var(--color-pink-rgb));
+ --color-base-00: #1e1e1e;
+ --color-base-10: #242424;
+ --color-base-15: #252525;
+ --color-base-20: #262626;
+ --color-base-25: #2a2a2a;
+ --color-base-30: #363636;
+ --color-base-35: #3F3F3F;
+ --color-base-40: #555;
+ --color-base-50: #666;
+ --color-base-60: #999;
+ --color-base-70: #bababa;
+ --color-base-100: #dadada;
+ --accent-h: var(--accent-dark-h);
+ --accent-s: var(--accent-dark-s);
+ --accent-l: var(--accent-dark-l);
+ --accent-dark-h: 232;
+ --accent-dark-s: 64%;
+ --accent-dark-l: 72%;
+ --color-accent-hsl: var(--color-accent-hsl-dark);
+ --color-accent: var(--color-accent-dark);
+ --color-accent-1: var(--color-accent-1-dark);
+ --color-accent-2: var(--color-accent-2-dark);
+ --color-accent-3: var(--color-accent-3-dark);
+ --color-accent-hsl-dark: var(--accent-h),
+ var(--accent-s),
+ var(--accent-l);
+ --color-accent-dark: hsl(var(--accent-h), var(--accent-s), var(--accent-l));
+ --color-accent-1-dark: hsl(var(--accent-h), var(--accent-s), calc(var(--accent-l) - 3.8%));
+ --color-accent-2-dark: hsl(var(--accent-h), var(--accent-s), calc(var(--accent-l) + 3.8%));
+ --color-accent-3-dark: hsla(var(--accent-h), calc(0.4*var(--accent-s)), calc(0.9*var(--accent-l)));
+ --background-modifier-border: hsla(var(--accent-h), calc(0.4*var(--accent-s)), calc(0.9*var(--accent-l)), 0.2);
+ --background-modifier-border-hover: hsla(var(--accent-h), calc(0.4*var(--accent-s)), calc(0.9*var(--accent-l)), 0.25);
+ --background-modifier-border-focus: hsla(var(--accent-h), calc(0.4*var(--accent-s)), calc(0.9*var(--accent-l)), 0.3);
+ --background-primary: hsl(var(--accent-h), calc(var(--accent-s) / 5), calc(1.25*var(--accent-l) / 4.5));
+ --background-primary-alt: hsl(var(--accent-h), calc(var(--accent-s) / 5), calc(1.25*var(--accent-l) / 3.9));
+ --background-secondary: hsl(var(--accent-h), calc(var(--accent-s) / 5), calc(1.25*var(--accent-l) / 4.9));
+ --background-secondary-alt: hsl(var(--accent-h),
+ calc(var(--accent-s) / 5.4),
+ calc(1.25*var(--accent-l) / 3));
+ --background-tertiary: hsl(var(--accent-h),
+ calc(var(--accent-s) / 5.4),
+ calc(1.25*var(--accent-l) / 3.6));
+ --workspace-background-translucent: hsla(var(--accent-h),
+ calc(var(--accent-s) / 5.4),
+ calc(1.25*var(--accent-l) / 3.6), 0.6);
+ --background-modifier-hover: hsla(var(--accent-h), 12%, 40%, 0.25);
+ --background-modifier-active-hover: hsla(var(--interactive-accent-hsl), 0.15);
+ --background-modifier-box-shadow: rgba(0, 0, 0, 0.3);
+ --background-modifier-cover: rgba(10, 10, 10, 0.4);
+ --background-modifier-form-field: transparent;
+ --search-result-background: transparent;
+ --text-highlight-bg: rgba(255, 208, 0, 0.4);
+ --text-highlight-bg-active: rgba(255, 128, 0, 0.4);
+ --text-selection: hsla(var(--interactive-accent-hsl), 0.25);
+ --shadow-s: 0px 1px 2px rgba(0, 0, 0, 0.121),
+ 0px 3.4px 6.7px rgba(0, 0, 0, 0.179),
+ 0px 15px 30px rgba(0, 0, 0, 0.3);
+ --shadow-l: 0px 1.8px 7.3px rgba(0, 0, 0, 0.071),
+ 0px 6.3px 24.7px rgba(0, 0, 0, 0.112),
+ 0px 30px 90px rgba(0, 0, 0, 0.2);
+}
+
+.theme-dark.theme-dark-background-darker {
+ --background-primary: hsl(var(--accent-h), calc(var(--accent-s) / 4), calc(var(--accent-l) / 5));
+ --background-primary-alt: hsl(var(--accent-h), calc(var(--accent-s) / 4), calc(var(--accent-l) / 4));
+ --background-secondary: hsl(var(--accent-h), calc(var(--accent-s) / 5), calc(var(--accent-l) / 6));
+ --background-secondary-alt: hsl(var(--accent-h),
+ calc(var(--accent-s) / 6),
+ calc(var(--accent-l) / 3.6));
+ --background-tertiary: hsl(var(--accent-h),
+ calc(var(--accent-s) / 6),
+ calc(var(--accent-l) / 4));
+ --workspace-background-translucent: hsla(var(--accent-h),
+ calc(var(--accent-s) / 6),
+ calc(var(--accent-l) / 4), 0.6);
+ --interactive-normal: hsl(var(--accent-h),
+ calc(var(--accent-s) / 7),
+ calc(var(--accent-l) / 3));
+ --interactive-hover: hsl(var(--accent-h),
+ calc(var(--accent-s) / 7),
+ calc(var(--accent-l) / 2.7));
+}
+
+
+.theme-dark.theme-dark-background-brighter {
+ --background-primary: hsl(var(--accent-h), calc(var(--accent-s) / 4.2), calc(1.25*var(--accent-l) / 3.5));
+ --background-primary-alt: hsl(var(--accent-h), calc(var(--accent-s) / 4.2), calc(1.25*var(--accent-l) / 3.1));
+ --background-secondary: hsl(var(--accent-h), calc(var(--accent-s) / 4.2), calc(1.25*var(--accent-l) / 4));
+ --background-secondary-alt: hsl(var(--accent-h),
+ calc(var(--accent-s) / 4.2),
+ calc(1.25*var(--accent-l) / 3.7));
+ --background-tertiary: hsl(var(--accent-h),
+ calc(var(--accent-s) / 4.8),
+ calc(1.25*var(--accent-l) / 3));
+ --workspace-background-translucent: hsla(var(--accent-h),
+ calc(var(--accent-s) / 4.8),
+ calc(1.25*var(--accent-l) / 3), 0.6);
+ --interactive-normal: hsl(var(--accent-h),
+ calc(var(--accent-s) / 5.6),
+ calc(1.25*var(--accent-l) / 2.4));
+ --interactive-hover: hsl(var(--accent-h),
+ calc(var(--accent-s) / 5.6),
+ calc(1.25*var(--accent-l) / 2.2));
+}
+
+
+.theme-dark.theme-dark-background-black {
+ --background-primary: black;
+ --background-primary-alt: var(--color-base-00);
+ --background-secondary: black;
+ --background-secondary-alt: black;
+ --background-tertiary: black;
+ --workspace-background-translucent: rgba(0, 0, 0, 0.6);
+ --interactive-normal: hsl(var(--accent-h),
+ calc(var(--accent-s) / 7),
+ calc(var(--accent-l) / 4));
+ --interactive-hover: hsl(var(--accent-h),
+ calc(var(--accent-s) / 7),
+ calc(var(--accent-l) / 3.2));
+ --background-table-rows: var(--color-base-00);
+ --background-modifier-border: var(--color-base-30);
+ --background-modifier-border-hover: var(--color-base-35);
+ --background-modifier-border-focus: var(--color-base-40);
+ --background-modifier-hover: rgba(var(--mono-rgb-100), 0.15);
+}
+
+/*====== Animations ======*/
+body {
+ /* Animations */
+ --anim-speed: 1;
+ --anim-duration-superfast: calc(75ms / var(--anim-speed));
+ --anim-duration-fast: calc(150ms / var(--anim-speed));
+ --anim-duration-moderate: calc(300ms / var(--anim-speed));
+ --anim-duration-slow: calc(600ms / var(--anim-speed));
+ --anim-in: var(--anim-duration-fast) var(--anim-duration-superfast) var(--anim-motion-swing);
+ --anim-out: var(--anim-duration-moderate) var(--anim-duration-slow) var(--anim-motion-swing);
+}
+
+/*body:not(.is-phone, .extra-anim-remove) .graph-controls:not(.is-close),
+body:not(.is-phone, .extra-anim-remove) .popover:not(.svelte-1xg3ic1),
+body:not(.is-phone, .extra-anim-remove) .modal:not(:has(.checkbox-container)),
+body:not(.is-phone, .extra-anim-remove) .menu:not(.mk-style-menu, .svelte-1xg3ic1),
+body:not(.is-phone, .extra-anim-remove) .suggestion-container:not([data-popper-placement="bottom-start"]),*/
+body:not(.is-phone, .extra-anim-remove) .prompt,
+body:not(.is-mobile, .extra-anim-remove) .document-search-container {
+ -webkit-animation: scale-up var(--anim-duration-fast) cubic-bezier(0.175, 0.885, 0.320, 1.095) both;
+ animation: scale-up var(--anim-duration-fast) cubic-bezier(0.175, 0.885, 0.320, 1.095) both;
+}
+
+@-webkit-keyframes scale-up {
+ 0% {
+ -webkit-transform: scale(0.75);
+ transform: scale(0.75);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+@keyframes scale-up {
+ 0% {
+ -webkit-transform: scale(0.75);
+ transform: scale(0.75);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+body:not(.is-phone, .extra-anim-remove) .modal:has(.checkbox-container),
+body:not(.is-phone, .extra-anim-remove) .modal.mod-settings,
+body:not(.is-phone, .extra-anim-remove) .modal.mod-community-modal {
+ -webkit-animation: var(--anim-duration-fast) fadeIn both;
+ animation: var(--anim-duration-fast) fadeIn both;
+}
+
+/*----------workspace----------*/
+/* ====== background ===== */
+body {
+ --background-underlying-light: var(--background-tertiary);
+ --background-underlying-dark: var(--background-tertiary);
+ --background-underlying: var(--background-tertiary);
+ --background-mod-left-split-light: var(--background-primary);
+ --background-mod-left-split-dark: var(--background-primary);
+ --background-mod-left-split: var(--background-primary);
+ --background-mod-right-split-light: var(--background-primary);
+ --background-mod-right-split-dark: var(--background-primary);
+ --background-mod-right-split: var(--background-primary);
+ --background-mod-root-split-light: var(--background-primary);
+ --background-mod-root-split-dark: var(--background-primary);
+ --background-mod-root-split: var(--background-primary);
+
+ --background-mod-root-CSS-light: rgba(255, 255, 255, 0.5);
+ --background-mod-root-CSS-dark: rgba(0, 0, 0, 0.5);
+ --background-mod-root-CSS-blend-mode-light: normal;
+ --background-mod-root-CSS-blend-mode-dark: normal;
+ --background-mod-root-CSS-backdrop-filter-light: blur(32px);
+ --background-mod-root-CSS-backdrop-filter-dark: blur(32px);
+ --background-mod-left-CSS-light: rgba(255, 255, 255, 0.5);
+ --background-mod-left-CSS-dark: rgba(0, 0, 0, 0.5);
+ --background-mod-left-CSS-blend-mode-light: normal;
+ --background-mod-left-CSS-blend-mode-dark: normal;
+ --background-mod-left-CSS-backdrop-filter-light: blur(32px);
+ --background-mod-left-CSS-backdrop-filter-dark: blur(32px);
+ --background-mod-right-CSS-light: rgba(255, 255, 255, 0.5);
+ --background-mod-right-CSS-dark: rgba(0, 0, 0, 0.5);
+ --background-mod-right-CSS-blend-mode-light: normal;
+ --background-mod-right-CSS-blend-mode-dark: normal;
+ --background-mod-right-CSS-backdrop-filter-light: blur(32px);
+ --background-mod-right-CSS-backdrop-filter-dark: blur(32px);
+ --background-underlying-CSS-light: radial-gradient(100% 100% at 13% 50%, rgb(90, 109, 237) 0%, rgb(224, 218, 247) 100%), linear-gradient(6deg, rgb(235, 242, 252) 0%, rgb(90, 109, 237) 5%, rgb(166, 126, 241) 7%, rgb(224, 218, 247) 11%, rgb(90, 109, 237) 16%), radial-gradient(100% 100% at 60% 71%, rgb(224, 218, 247) 0%, rgb(219, 244, 255) 100%), linear-gradient(97deg, rgb(90, 109, 237) 0%, rgb(90, 109, 237) 23%, rgb(90, 109, 237) 53%), linear-gradient(351deg, rgb(235, 242, 252) 0%, rgb(219, 244, 255) 1%, rgb(235, 242, 252) 6%, rgb(224, 218, 247) 10%, rgb(166, 126, 241) 13%, rgb(235, 242, 252) 29%), radial-gradient(100% 100% at 10% 32%, rgb(90, 109, 237) 0%, rgb(219, 244, 255) 100%), radial-gradient(100% 100% at 35% 63%, rgb(224, 218, 247) 0%, rgb(224, 218, 247) 100%);
+ --background-underlying-CSS-dark: linear-gradient(317deg, rgb(112, 55, 205) 0%, rgb(29, 12, 32) 19%, rgb(101, 31, 113) 19%, rgb(101, 31, 113) 33%), radial-gradient(100% 100% at 90% 9%, rgb(29, 12, 32) 0%, rgb(29, 12, 32) 100%), linear-gradient(109deg, rgb(104, 178, 248) 0%, rgb(80, 110, 229) 15%, rgb(112, 55, 205) 34%, rgb(104, 178, 248) 54%, rgb(104, 178, 248) 65%), radial-gradient(100% 100% at 20% 45%, rgb(80, 110, 229) 0%, rgb(101, 31, 113) 100%), radial-gradient(100% 100% at 90% 27%, rgb(80, 110, 229) 0%, rgb(101, 31, 113) 100%), linear-gradient(339deg, rgb(101, 31, 113) 0%, rgb(104, 178, 248) 12%, rgb(101, 31, 113) 14%, rgb(80, 110, 229) 19%, rgb(101, 31, 113) 20%, rgb(29, 12, 32) 30%);
+ --background-underlying-CSS-blend-mode-light: overlay, color-burn;
+ --background-underlying-CSS-blend-mode-dark: soft-light, luminosity, hue, luminosity, hard-light;
+}
+
+/* background - transparent */
+body {
+ --tab-background-active: transparent;
+ --tab-container-background: transparent;
+ --titlebar-background: transparent;
+ --titlebar-background-focused: transparent;
+}
+
+.sidebar-toggle-button,
+.workspace-tabs.mod-top,
+body.is-focused .sidebar-toggle-button,
+body.is-focused .workspace-tabs.mod-top {
+ --tab-container-background: transparent;
+}
+
+body:not(.is-mobile) .workspace-tabs:not(.mod-stacked) .workspace-leaf,
+body:not(.is-mobile) .workspace-tabs:not(.mod-stacked) .workspace-leaf-content,
+body:not(.is-mobile) .workspace-tabs:not(.mod-stacked) .view-header:not(.animate),
+body:not(.is-mobile) .workspace-tabs:not(.mod-stacked) .view-content:not(.vignette-radial, .vignette-linear, .animate, .ptm-fullscreen-writing-focus-element),
+.mod-left-split .workspace-tab-header.has-active-menu,
+.mod-right-split .workspace-tab-header.has-active-menu,
+body:not(.is-mobile) .workspace-tab-header-container,
+.workspace>.workspace-split {
+ background-color: transparent !important;
+}
+
+body:not(.is-mobile) .app-container,
+body:not(.is-mobile) .workspace,
+.workspace-ribbon.mod-left:before {
+ background-color: transparent;
+}
+
+.workspace-ribbon,
+.workspace-ribbon.mod-left.is-collapsed {
+ border-right: none;
+ background-color: transparent;
+}
+
+.workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active {
+ background-color: transparent !important;
+ box-shadow: none;
+ overflow: visible;
+}
+
+body:not(.is-mobile) .view-header-title-container:not(.mod-at-start):before,
+body:not(.is-mobile) .view-header-title-container:not(.mod-at-end):after {
+ background: transparent;
+}
+
+/* background - underlying */
+body:not(.is-mobile):has(>.app-container) {
+ background: var(--background-underlying);
+}
+
+body.theme-light:not(.is-mobile):has(>.app-container).background-underlying-CSS-light {
+ background: var(--background-underlying-CSS-light, --background-underlying) !important;
+ background-blend-mode: var(--background-underlying-CSS-blend-mode-light) !important;
+}
+
+body.theme-dark:not(.is-mobile):has(>.app-container).background-underlying-CSS-dark {
+ background: var(--background-underlying-CSS-dark, --background-underlying) !important;
+ background-blend-mode: var(--background-underlying-CSS-blend-mode-dark) !important;
+}
+
+body.background-underlying-primary-light.theme-light,
+body.background-underlying-primary-dark.theme-dark {
+ --background-underlying: var(--background-primary) !important;
+}
+
+body.background-underlying-secondary-light.theme-light,
+body.background-underlying-secondary-dark.theme-dark {
+ --background-underlying: var(--background-secondary) !important;
+}
+
+body.background-underlying-default-light.theme-light,
+body.background-underlying-default-dark.theme-dark {
+ --background-underlying: var(--background-tertiary) !important;
+}
+
+body.background-underlying-Color-light.theme-light {
+ --background-underlying: var(--background-underlying-light) !important;
+}
+
+body.background-underlying-Color-dark.theme-dark {
+ --background-underlying: var(--background-underlying-dark) !important;
+}
+
+
+/* foreground - underlying */
+body {
+ --on-border-light: var(--color-accent-3);
+ --on-border-dark: var(--color-accent-3);
+ --mix-blend-mode-on-border-light: normal;
+ --mix-blend-mode-on-border-dark: screen;
+}
+
+.theme-light:not(.is-mobile) .titlebar,
+.theme-light:not(.is-mobile) .status-bar,
+.theme-light:not(.is-mobile) .workspace-ribbon,
+.theme-light:not(.is-mobile) .workspace-tabs.mod-top .workspace-tab-header-container,
+.theme-light:not(.is-mobile).card-layout-open-light .workspace-tabs .workspace-tab-header-container {
+ --text-muted: var(--on-border-light);
+ --text-faint: var(--on-border-light);
+
+ --titlebar-text-color: var(--text-muted);
+ --titlebar-text-color-focused: var(--text-muted);
+ --tab-text-color-active: var(--text-muted);
+ --tab-text-color-focused: var(--text-muted);
+ --tab-text-color-focused-active: var(--text-muted);
+ --status-bar-text-color: var(--text-muted);
+ --icon-color: var(--text-muted);
+ --icon-color-hover: var(--text-muted);
+
+ --tab-text-color: var(--text-faint);
+
+ --icon-opacity: 1;
+
+ mix-blend-mode: var(--mix-blend-mode-on-border-light);
+}
+
+.theme-dark:not(.is-mobile) .titlebar,
+.theme-dark:not(.is-mobile) .status-bar,
+.theme-dark:not(.is-mobile) .workspace-ribbon,
+.theme-dark:not(.is-mobile) .workspace-tabs.mod-top .workspace-tab-header-container,
+.theme-dark:not(.is-mobile).card-layout-open-dark .workspace-tabs .workspace-tab-header-container {
+ --text-muted: var(--on-border-dark);
+ --text-faint: var(--on-border-dark);
+
+ --titlebar-text-color: var(--text-muted);
+ --titlebar-text-color-focused: var(--text-muted);
+ --tab-text-color-active: var(--text-muted);
+ --tab-text-color-focused: var(--text-muted);
+ --tab-text-color-focused-active: var(--text-muted);
+ --status-bar-text-color: var(--text-muted);
+ --icon-color: var(--text-muted);
+ --icon-color-hover: var(--text-muted);
+
+ --tab-text-color: var(--text-faint);
+
+ --icon-opacity: 1;
+
+ mix-blend-mode: var(--mix-blend-mode-on-border-dark);
+}
+
+
+/* background - mod-left */
+
+body.theme-light.mod-left-split-background-primary-light,
+body.theme-dark.mod-left-split-background-primary-dark,
+body.theme-light.mod-left-split-background-transparent-light:not(.card-layout-open-light),
+body.theme-dark.mod-left-split-background-transparent-dark:not(.card-layout-open-dark) {
+ --background-mod-left-split: var(--background-primary) !important;
+}
+
+body.theme-light.mod-left-split-background-secondary-light,
+body.theme-dark.mod-left-split-background-secondary-dark {
+ --background-mod-left-split: var(--background-secondary) !important;
+}
+
+body.theme-light.mod-left-split-background-transparent-light.card-layout-open-light,
+body.theme-dark.mod-left-split-background-transparent-dark.card-layout-open-dark {
+ --background-mod-left-split: transparent !important;
+}
+
+body.theme-light:not(.is-mobile).card-layout-open-light.mod-left-split-background-transparent-light .mod-left-split .workspace-tab-container {
+ --card-shadow-light: transparent;
+}
+
+body.theme-dark:not(.is-mobile).card-layout-open-dark.mod-left-split-background-transparent-dark .mod-left-split .workspace-tab-container {
+ --card-shadow-dark: transparent;
+}
+
+body.theme-light.mod-left-split-background-customize-light {
+ --background-mod-left-split: var(--background-mod-left-split-light) !important;
+}
+
+body.theme-dark.mod-left-split-background-customize-dark {
+ --background-mod-left-split: var(--background-mod-left-split-dark) !important;
+}
+
+/* --- */
+
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-split.mod-left-split .workspace-tab-container,
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace-split.mod-left-split .workspace-tab-container,
+body:not(.is-mobile):not(.card-layout-open-light).theme-light .workspace-split.mod-left-split .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile):not(.card-layout-open-dark).theme-dark .workspace-split.mod-left-split .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile):not(.card-layout-open-light).theme-light .workspace-split.mod-left-split .workspace-tabs:not(.mod-top),
+body:not(.is-mobile):not(.card-layout-open-dark).theme-dark .workspace-split.mod-left-split .workspace-tabs:not(.mod-top) {
+ background: var(--background-mod-left-split) !important;
+}
+
+body:not(.is-mobile).theme-light.card-layout-open-light.mod-left-split-background-CSS-light .workspace-split.mod-left-split .workspace-tab-container,
+body:not(.is-mobile).theme-light:not(.card-layout-open-light).mod-left-split-background-CSS-light .workspace-split.mod-left-split .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile).theme-light:not(.card-layout-open-light).mod-left-split-background-CSS-light .workspace-split.mod-left-split .workspace-tabs:not(.mod-top) {
+ background: var(--background-mod-left-CSS-light) !important;
+ background-blend-mode: var(--background-mod-left-CSS-blend-mode-light);
+ backdrop-filter: var(--background-mod-left-CSS-backdrop-filter-light);
+ -webkit-backdrop-filter: var(--background-mod-left-CSS-backdrop-filter-light);
+}
+
+body:not(.is-mobile).theme-dark.card-layout-open-dark.mod-left-split-background-CSS-dark .workspace-split.mod-left-split .workspace-tab-container,
+body:not(.is-mobile).theme-dark:not(.card-layout-open-dark).mod-left-split-background-CSS-dark .workspace-split.mod-left-split .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile).theme-dark:not(.card-layout-open-dark).mod-left-split-background-CSS-dark .workspace-split.mod-left-split .workspace-tabs:not(.mod-top) {
+ background: var(--background-mod-left-CSS-dark) !important;
+ background-blend-mode: var(--background-mod-left-CSS-blend-mode-dark);
+ backdrop-filter: var(--background-mod-left-CSS-backdrop-filter-dark);
+ -webkit-backdrop-filter: var(--background-mod-left-CSS-backdrop-filter-dark);
+}
+
+
+/* background - mod-right */
+
+body.theme-light.mod-right-split-background-primary-light,
+body.theme-dark.mod-right-split-background-primary-dark,
+body.theme-light.mod-right-split-background-transparent-light:not(.card-layout-open-light),
+body.theme-dark.mod-right-split-background-transparent-dark:not(.card-layout-open-dark) {
+ --background-mod-right-split: var(--background-primary) !important;
+}
+
+body.theme-light.mod-right-split-background-secondary-light,
+body.theme-dark.mod-right-split-background-secondary-dark {
+ --background-mod-right-split: var(--background-secondary) !important;
+}
+
+body.theme-light.mod-right-split-background-transparent-light.card-layout-open-light,
+body.theme-dark.mod-right-split-background-transparent-dark.card-layout-open-dark {
+ --background-mod-right-split: transparent !important;
+}
+
+body.theme-light:not(.is-mobile).card-layout-open-light.mod-right-split-background-transparent-light .mod-right-split .workspace-tab-container {
+ --card-shadow-light: transparent;
+}
+
+body.theme-dark:not(.is-mobile).card-layout-open-dark.mod-right-split-background-transparent-dark .mod-right-split .workspace-tab-container {
+ --card-shadow-dark: transparent;
+}
+
+body.theme-light.mod-right-split-background-customize-light {
+ --background-mod-right-split: var(--background-mod-right-split-light) !important;
+}
+
+body.theme-dark.mod-right-split-background-customize-dark {
+ --background-mod-right-split: var(--background-mod-right-split-dark) !important;
+}
+
+/* --- */
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-split.mod-right-split .workspace-tab-container,
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace-split.mod-right-split .workspace-tab-container,
+body:not(.is-mobile):not(.card-layout-open-light).theme-light .workspace-split.mod-right-split .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile):not(.card-layout-open-dark).theme-dark .workspace-split.mod-right-split .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile):not(.card-layout-open-light).theme-light .workspace-split.mod-right-split .workspace-tabs:not(.mod-top),
+body:not(.is-mobile):not(.card-layout-open-dark).theme-dark .workspace-split.mod-right-split .workspace-tabs:not(.mod-top) {
+ background: var(--background-mod-right-split) !important;
+}
+
+body:not(.is-mobile).theme-light.card-layout-open-light.mod-right-split-background-CSS-light .workspace-split.mod-right-split .workspace-tab-container,
+body:not(.is-mobile).theme-light:not(.card-layout-open-light).mod-right-split-background-CSS-light .workspace-split.mod-right-split .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile).theme-light:not(.card-layout-open-light).mod-right-split-background-CSS-light .workspace-split.mod-right-split .workspace-tabs:not(.mod-top) {
+ background: var(--background-mod-right-CSS-light) !important;
+ background-blend-mode: var(--background-mod-right-CSS-blend-mode-light);
+ backdrop-filter: var(--background-mod-right-CSS-backdrop-filter-light);
+ -webkit-backdrop-filter: var(--background-mod-right-CSS-backdrop-filter-light);
+}
+
+body:not(.is-mobile).theme-dark.card-layout-open-dark.mod-right-split-background-CSS-dark .workspace-split.mod-right-split .workspace-tab-container,
+body:not(.is-mobile).theme-dark:not(.card-layout-open-dark).mod-right-split-background-CSS-dark .workspace-split.mod-right-split .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile).theme-dark:not(.card-layout-open-dark).mod-right-split-background-CSS-dark .workspace-split.mod-right-split .workspace-tabs:not(.mod-top) {
+ background: var(--background-mod-right-CSS-dark) !important;
+ background-blend-mode: var(--background-mod-right-CSS-blend-mode-dark);
+ backdrop-filter: var(--background-mod-right-CSS-backdrop-filter-dark);
+ -webkit-backdrop-filter: var(--background-mod-right-CSS-backdrop-filter-dark);
+}
+
+/* background - mod-root */
+
+body.theme-light.mod-root-split-background-primary-light,
+body.theme-dark.mod-root-split-background-primary-dark,
+body.theme-light.mod-root-split-background-transparent-light:not(.card-layout-open-light),
+body.theme-dark.mod-root-split-background-transparent-dark:not(.card-layout-open-dark),
+body.theme-light:is(.mod-root-split-background-transparent-light, .mod-root-split-background-CSS-light) .mod-stacked,
+body.theme-dark:is(.mod-root-split-background-transparent-dark, .mod-root-split-background-CSS-dark) .mod-stacked {
+ --background-mod-root-split: var(--background-primary) !important;
+}
+
+body.theme-light.mod-root-split-background-secondary-light,
+body.theme-dark.mod-root-split-background-secondary-dark {
+ --background-mod-root-split: var(--background-secondary) !important;
+}
+
+body.theme-light.mod-root-split-background-transparent-light.card-layout-open-light,
+body.theme-dark.mod-root-split-background-transparent-dark.card-layout-open-dark {
+ --background-mod-root-split: transparent !important;
+}
+
+body.theme-light:not(.is-mobile).card-layout-open-light.mod-root-split-background-transparent-light .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-container {
+ --card-shadow-light: transparent;
+}
+
+body.theme-dark:not(.is-mobile).card-layout-open-dark.mod-root-split-background-transparent-dark .mod-root .workspace-tabs:not(.mod-stacked) .workspace-tab-container {
+ --card-shadow-dark: transparent;
+}
+
+body.theme-light.mod-root-split-background-customize-light {
+ --background-mod-root-split: var(--background-mod-root-split-light) !important;
+}
+
+body.theme-dark.mod-root-split-background-customize-dark {
+ --background-mod-root-split: var(--background-mod-root-split-dark) !important;
+}
+
+/* --- */
+
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-split.mod-root .workspace-tab-container,
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace-split.mod-root .workspace-tab-container,
+body:not(.is-mobile):not(.card-layout-open-light).theme-light .workspace-split.mod-root .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile):not(.card-layout-open-dark).theme-dark .workspace-split.mod-root .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile):not(.card-layout-open-light).theme-light .workspace-split.mod-root .workspace-tabs:not(.mod-top),
+body:not(.is-mobile):not(.card-layout-open-dark).theme-dark .workspace-split.mod-root .workspace-tabs:not(.mod-top) {
+ background: var(--background-mod-root-split) !important;
+}
+
+body:not(.is-mobile).theme-light.card-layout-open-light.mod-root-split-background-CSS-light .workspace-split.mod-root .workspace-tab-container,
+body:not(.is-mobile).theme-light:not(.card-layout-open-light).mod-root-split-background-CSS-light .workspace-split.mod-root .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile).theme-light:not(.card-layout-open-light).mod-root-split-background-CSS-light .workspace-split.mod-root .workspace-tabs:not(.mod-top) {
+ background: var(--background-mod-root-CSS-light) !important;
+ background-blend-mode: var(--background-mod-root-CSS-blend-mode-light);
+ backdrop-filter: var(--background-mod-root-CSS-backdrop-filter-light);
+ -webkit-backdrop-filter: var(--background-mod-root-CSS-backdrop-filter-light);
+}
+
+body:not(.is-mobile).theme-dark.card-layout-open-dark.mod-root-split-background-CSS-dark .workspace-split.mod-root .workspace-tab-container,
+body:not(.is-mobile).theme-dark:not(.card-layout-open-dark).mod-root-split-background-CSS-dark .workspace-split.mod-root .workspace-tabs.mod-top .workspace-tab-container,
+body:not(.is-mobile).theme-dark:not(.card-layout-open-dark).mod-root-split-background-CSS-dark .workspace-split.mod-root .workspace-tabs:not(.mod-top) {
+ background: var(--background-mod-root-CSS-dark) !important;
+ background-blend-mode: var(--background-mod-root-CSS-blend-mode-dark);
+ backdrop-filter: var(--background-mod-root-CSS-backdrop-filter-dark);
+ -webkit-backdrop-filter: var(--background-mod-root-CSS-backdrop-filter-dark);
+}
+
+/* ====== translucent window ===== */
+.is-translucent:not(.is-fullscreen) {
+ --divider-color: var(--background-modifier-border);
+}
+
+.is-translucent:not(.is-fullscreen) .titlebar,
+.is-translucent:not(.is-fullscreen) .app-container,
+.is-translucent .workspace-ribbon::after,
+.is-translucent:not(.is-fullscreen) .workspace-tabs.mod-top,
+.is-translucent .workspace-split.mod-horizontal.mod-left-split,
+.is-translucent.is-hidden-frameless .titlebar,
+.is-translucent .titlebar-button {
+ background-color: transparent !important;
+}
+
+.is-translucent:not(.is-fullscreen) {
+ background-color: var(--workspace-background-translucent) !important;
+}
+
+.is-translucent .titlebar-button:hover {
+ background-color: var(--background-modifier-hover) !important;
+}
+
+.is-translucent .workspace .mod-root .workspace-tab-header-inner::after {
+ background-color: var(--divider-color);
+}
+
+/* ====== Layout ===== */
+/* default Layout*/
+body {
+ --card-shadow-light: 0px 0px 6px hsla(var(--accent-h), 18%, 80%, 0.4), 0px 0px 2px hsla(var(--accent-h), 18%, 80%, 0.2), 0 0 0 1px var(--background-modifier-border);
+ --card-shadow-dark: 0px 0px 0px 1px var(--background-modifier-border);
+ --card-border-radius-light: 8px;
+ --card-border-radius-dark: 8px;
+ --card-shadow-border-radius-light: calc(var(--card-border-radius-light) - 1px);
+ --card-shadow-border-radius-dark: calc(var(--card-border-radius-dark) - 1px);
+}
+
+body.is-frameless:not(.is-hidden-frameless).is-fullscreen {
+ padding-top: 0;
+}
+
+body:not(.is-mobile) .horizontal-main-container {
+ padding-bottom: 24px;
+}
+
+body:not(.is-mobile).is-popout-window .horizontal-main-container {
+ padding-bottom: 16px;
+}
+
+body:not(.is-mobile) .workspace {
+ margin-right: 16px;
+ position: relative;
+ overflow: visible;
+}
+
+body:not(.is-mobile).is-popout-window .workspace {
+ margin-right: 16px;
+ margin-left: 16px;
+}
+
+body:not(.is-mobile) .mod-top-left-space .workspace-tab-container,
+body.is-popout-window .workspace-tabs.mod-top-left-space>.workspace-tab-container {
+ border-top-left-radius: var(--card-border-radius-light, 8px) !important;
+}
+
+body:not(.is-mobile).theme-dark .mod-top-left-space .workspace-tab-container,
+body.is-popout-window.theme-dark .workspace-tabs.mod-top-left-space>.workspace-tab-container {
+ border-top-left-radius: var(--card-border-radius-dark, 8px) !important;
+}
+
+body:not(.is-mobile) .mod-top-right-space .workspace-tab-container {
+ border-top-right-radius: var(--card-border-radius-light, 8px);
+ overflow: hidden;
+}
+
+body:not(.is-mobile).theme-dark .mod-top-right-space .workspace-tab-container {
+ border-top-right-radius: var(--card-border-radius-dark, 8px);
+}
+
+body:not(.is-mobile) .workspace-split.mod-left-split,
+body:not(.is-mobile) .workspace:not(.is-left-sidedock-open) .workspace-split.mod-root {
+ border-bottom-left-radius: var(--card-border-radius-light, 8px);
+ overflow: hidden;
+}
+
+body:not(.is-mobile).theme-dark .workspace-split.mod-left-split,
+body:not(.is-mobile).theme-dark .workspace:not(.is-left-sidedock-open) .workspace-split.mod-root {
+ border-bottom-left-radius: var(--card-border-radius-dark, 8px);
+}
+
+body:not(.is-mobile) .workspace:not(.is-right-sidedock-open) .workspace-split.mod-root,
+body:not(.is-mobile) .workspace-split.mod-right-split {
+ border-bottom-right-radius: var(--card-border-radius-light, 8px);
+ overflow: hidden;
+}
+
+body:not(.is-mobile).theme-dark .workspace:not(.is-right-sidedock-open) .workspace-split.mod-root,
+body:not(.is-mobile).theme-dark .workspace-split.mod-right-split {
+ border-bottom-right-radius: var(--card-border-radius-dark, 8px);
+}
+
+.workspace-window .mod-top-left-space .workspace-tab-container,
+.workspace-window .mod-top-left-space .workspace-tab-container .workspace-leaf-content {
+ border-top-left-radius: 0px !important;
+}
+
+
+body:not(.is-mobile) .workspace::before {
+ content: " ";
+ width: calc(100% - 44px);
+ height: calc(100% - 44px);
+ border-radius: var(--card-shadow-border-radius-light, 7px);
+ background-color: transparent;
+ box-shadow: var(--card-shadow-light);
+ position: absolute;
+ bottom: 0px;
+ right: 0px;
+}
+
+body:not(.is-mobile).theme-dark .workspace::before {
+ border-radius: var(--card-shadow-border-radius-dark, 7px);
+ box-shadow: var(--card-shadow-dark, 0px 0px 0px 1px var(--background-modifier-border));
+}
+
+body:not(.is-mobile).is-popout-window .workspace::before {
+ width: calc(100%) !important;
+ height: calc(100% - 44px);
+}
+
+
+.workspace-tab-header-container,
+.workspace-tabs.mod-top .workspace-tab-header-container,
+.workspace-ribbon.mod-left:before {
+ border-bottom: 1px solid transparent;
+}
+
+body:not(.is-mobile) .workspace-ribbon {
+ padding: 10px 4px 0px;
+}
+
+.workspace-tabs {
+ gap: 4px;
+}
+
+.workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf {
+ box-shadow: inset 0px 1px 0px var(--workspace-divider-color);
+}
+
+body.theme-light.card-layout-open-light .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf,
+body.theme-dark.card-layout-open-dark .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf {
+ box-shadow: inset 0px 1px 0px transparent;
+}
+
+body.theme-light.mod-left-split-background-transparent-light.card-layout-open-light.tab-autohide .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf,
+body.theme-dark.mod-left-split-background-transparent-dark.card-layout-open-dark.tab-autohide .mod-left-split .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf,
+body.theme-light.mod-right-split-background-transparent-light.card-layout-open-light.tab-autohide .mod-right-split .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf,
+body.theme-dark.mod-right-split-background-transparent-dark.card-layout-open-dark.tab-autohide .mod-right-split .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf,
+body.theme-light.mod-root-split-background-transparent-light.card-layout-open-light.tab-autohide .mod-root .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf,
+body.theme-dark.mod-root-split-background-transparent-dark.card-layout-open-dark.tab-autohide .mod-root .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf {
+ box-shadow: inset 0px 1px 0px var(--divider-color);
+ border-top-left-radius: 0px !important;
+ border-top-right-radius: 0px !important;
+}
+
+/* card layout light*/
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace::before {
+ display: none;
+}
+
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace.is-left-sidedock-open .workspace-split.mod-horizontal.mod-left-split {
+ margin-right: 16px;
+}
+
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace.is-right-sidedock-open .workspace-split.mod-horizontal.mod-right-split {
+ margin-left: 16px;
+}
+
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-split.mod-vertical {
+ gap: 16px
+}
+
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-tab-container {
+ border-radius: var(--card-border-radius-light, 8px) !important;
+ overflow: hidden !important;
+ box-shadow: var(--card-shadow-light);
+}
+
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-tabs,
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-split {
+ overflow: visible !important;
+}
+
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-tabs,
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-tab-header-container {
+ background-color: transparent !important;
+}
+
+
+body:not(.is-mobile).card-layout-open-light.theme-light .workspace-tabs:not(.mod-top) .workspace-tab-container {
+ border-top: unset;
+}
+
+/* card layout dark*/
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace::before {
+ display: none;
+}
+
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace.is-left-sidedock-open .workspace-split.mod-horizontal.mod-left-split {
+ margin-right: 16px;
+}
+
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace.is-right-sidedock-open .workspace-split.mod-horizontal.mod-right-split {
+ margin-left: 16px;
+}
+
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace-split.mod-vertical {
+ gap: 16px
+}
+
+body:not(.is-mobile).theme-dark.card-layout-open-dark .workspace-tab-container {
+ border-radius: var(--card-border-radius-dark, 8px) !important;
+ overflow: hidden !important;
+ box-shadow: var(--card-shadow-dark, 0px 0px 0px 1px var(--background-modifier-border));
+}
+
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace-tabs,
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace-split {
+ overflow: visible !important;
+}
+
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace-tabs,
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace-tab-header-container {
+ background-color: transparent !important;
+}
+
+body:not(.is-mobile).card-layout-open-dark.theme-dark .workspace-tabs:not(.mod-top) .workspace-tab-container {
+ border-top: unset;
+}
+
+/* card highlight */
+body:not(.is-mobile).card-highlight-light.card-layout-open-light.theme-light .mod-root:has(.workspace-tabs+.workspace-tabs) .workspace-tabs.mod-active .workspace-tab-container,
+body:not(.is-mobile).card-highlight-dark.card-layout-open-dark.theme-dark .mod-root:has(.workspace-tabs+.workspace-tabs) .workspace-tabs.mod-active .workspace-tab-container {
+ outline-offset: 0px;
+ outline: 2px solid var(--color-accent-3);
+}
+
+/* scrollbar */
+body {
+ /* Scrollbars */
+ --scrollbar-bg: rgba(var(--mono-rgb-100), 0);
+ --scrollbar-thumb-bg: rgba(var(--mono-rgb-100), 0.1);
+ --scrollbar-active-thumb-bg: rgba(var(--mono-rgb-100), 0.15);
+}
+
+body:not(.restored-scrollbars) ::-webkit-scrollbar,
+body:not(.restored-scrollbars) .kanban-plugin__scroll-container::-webkit-scrollbar {
+ width: 11px;
+ height: 11px;
+}
+
+body:not(.restored-scrollbars) ::-webkit-scrollbar-thumb,
+body:not(.restored-scrollbars) .kanban-plugin__scroll-container::-webkit-scrollbar-thumb {
+ background-clip: padding-box;
+ border-radius: 20px;
+ border: 3px solid transparent;
+ border-width: 3px 3px 3px 3px;
+ min-height: 45px
+}
+
+body:not(.restored-scrollbars) .mobile-toolbar-options-container::-webkit-scrollbar {
+ width: 0 !important;
+ height: 0 !important;
+}
+
+body:not(.restored-scrollbars) ::-webkit-scrollbar-track,
+body:not(.restored-scrollbars) ::-webkit-scrollbar-track-piece,
+body:not(.restored-scrollbars):not(.is-mobile) ::-webkit-scrollbar-thumb {
+ background-color: transparent !important;
+}
+
+body:not(.restored-scrollbars):not(.is-mobile) :hover::-webkit-scrollbar-thumb {
+ background-color: var(--scrollbar-thumb-bg) !important;
+}
+
+body:not(.restored-scrollbars):not(.is-mobile) ::-webkit-scrollbar-thumb:hover,
+body:not(.restored-scrollbars):not(.is-mobile) ::-webkit-scrollbar-thumb:active {
+ background-color: var(--scrollbar-active-thumb-bg) !important;
+}
+
+.workspace-leaf-content:is([data-type="surfing-view"], [data-type="graph"], [data-type="localgraph"]) ::-webkit-scrollbar,
+.scrollbar-hide ::-webkit-scrollbar {
+ display: none;
+}
+
+/* ====== titlebar ===== */
+body:not(.is-translucent) .titlebar-text {
+ opacity: 1;
+}
+
+.is-hidden-frameless .titlebar .titlebar-button-container {
+ background-color: transparent !important;
+}
+
+.mod-windows .titlebar .titlebar-button.mod-close:hover,
+.mod-windows .titlebar .titlebar-button.mod-close:focus {
+ background-color: var(--background-modifier-error) !important;
+}
+
+.mod-windows .titlebar .titlebar-button.mod-close:hover::after,
+.mod-windows .titlebar .titlebar-button.mod-close:focus::after {
+ background-color: var(--text-on-accent) !important;
+}
+
+.mod-windows .titlebar .titlebar-button.mod-close:hover,
+.mod-windows .titlebar .titlebar-button.mod-close:focus {
+ color: var(--text-on-accent) !important;
+}
+
+.is-hidden-frameless .titlebar-button-container.mod-right .titlebar-button {
+ height: 44px;
+ width: 44px;
+ padding: 0;
+}
+
+.titlebar-button-container.mod-right .titlebar-button:hover {
+ background-color: var(--background-modifier-hover);
+}
+
+.titlebar-button-container.mod-right .titlebar-button:last-of-type {
+ margin-right: 0px;
+}
+
+.is-hidden-frameless .titlebar-button-container.mod-right {
+ height: 44px;
+}
+
+.titlebar-button:not(.mod-logo)>svg {
+ display: none;
+}
+
+.titlebar-button-container.mod-right .titlebar-button::after {
+ content: '';
+ background-color: var(--on-border-light);
+ width: 16px;
+ height: 16px;
+ margin: auto;
+}
+
+.theme-dark .titlebar-button-container.mod-right .titlebar-button::after {
+ background-color: var(--on-border-dark);
+}
+
+.titlebar-button-container.mod-right .titlebar-button.mod-close::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg clip-path='url(%23a)'%3e%3cpath stroke='black' stroke-width='2' d='m3.757 12.243 8.486-8.486m0 8.486L3.757 3.757'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h8v8H0z' transform='translate(4 4)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+.titlebar-button-container.mod-right .titlebar-button.mod-maximize::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='black' stroke-width='2' d='M5 5h6v6H5z'/%3e%3c/svg%3e");
+}
+
+.titlebar-button-container.mod-right .titlebar-button.mod-minimize::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='black' stroke-width='2' d='M4 11h8'/%3e%3c/svg%3e");
+}
+
+@media (hover: hover) {
+ .titlebar-button:hover {
+ background-color: transparent;
+ }
+}
+
+/* ====== status bar====== */
+
+body {
+ --status-bar-background: transparent;
+ --status-bar-border-color: transparent;
+ --status-bar-border-width: 0;
+}
+
+.status-bar {
+ padding: 0 16px 0 0;
+ width: calc(100% - 44px);
+ min-height: 16px;
+}
+
+.status-bar-item.mod-clickable:hover {
+ color: var(--status-bar-text-color);
+}
+
+.status-bar-item {
+ height: 24px;
+}
+
+body.is-frameless.is-hidden-frameless:not(.qe-hide-breadcrumbs) .status-bar,
+body:not(.is-frameless):not(.qe-hide-breadcrumbs) .status-bar {
+ position: var(--status-bar-position);
+}
+
+/* ====== ribbon====== */
+body:not(.is-mobile):not(.show-ribbon) .workspace {
+ margin-left: 16px;
+}
+
+body:not(.is-mobile):not(.show-ribbon) .workspace::before {
+ width: 100%;
+}
+
+.mod-macos:not(.show-ribbon) {
+ --frame-left-space: calc(80px - 16px);
+}
+
+/* tab */
+/* tab layout */
+
+.mod-windows,
+.mod-linux {
+ --frame-right-space: 110px;
+}
+
+.workspace-tab-header-container {
+ padding-left: 0px;
+ padding-right: var(--size-2-3);
+}
+
+.is-hidden-frameless:not(.is-fullscreen) .workspace-tabs.mod-top-left-space .workspace-tab-header-container {
+ padding-left: calc(0px + var(--frame-left-space));
+}
+
+body:not(.is-hidden-frameless):not(.is-mobile) .workspace .workspace-tabs.mod-top-right-space .workspace-tab-header-container,
+.mod-macos.is-hidden-frameless .workspace .workspace-tabs.mod-top-right-space .workspace-tab-header-container {
+ padding-right: 0px !important;
+}
+
+.workspace-tab-header::before,
+.workspace-tab-header::after {
+ display: none;
+}
+
+.sidebar-toggle-button {
+ padding-top: 6px;
+}
+
+.mod-macos.is-hidden-frameless:not(.is-popout-window) .sidebar-toggle-button.mod-right {
+ padding-right: 0px;
+ position: unset;
+}
+
+.workspace-tab-header-tab-list {
+ margin-right: 0;
+}
+
+body:not(.hider-sidebar-buttons) .workspace-tab-header-tab-list:has(+.sidebar-toggle-button.mod-right) {
+ margin-right: var(--size-4-1);
+}
+
+.workspace-tab-header-inner {
+ border-radius: 6px;
+}
+
+.workspace .mod-root .workspace-tab-header {
+ padding: 0px 3px 2px;
+}
+
+.workspace .mod-root .workspace-tab-header:first-child {
+ padding: 0px 3px 2px 0px;
+}
+
+.workspace .mod-root .workspace-tab-header-inner::after {
+ background-color: var(--divider-color);
+}
+
+.mod-root .workspace-tab-header-inner {
+ padding: 0 6px 0 8px
+}
+
+.mod-root .workspace-tab-header-container-inner {
+ margin: 0px;
+ padding: 6px 8px 4px 6px;
+ height: calc(var(--header-height) + 4px);
+}
+
+.mod-left-split .workspace-tab-header-container-inner,
+.mod-right-split .workspace-tab-header-container-inner {
+ padding: 6px;
+ margin: 0px;
+ gap: 2px;
+ height: 44px;
+ display: flex;
+ align-items: center;
+ border-radius: 6px;
+ overflow-y: visible;
+}
+
+.workspace-tab-header {
+ cursor: var(--cursor);
+}
+
+:is(.theme-dark.card-layout-open-dark.mod-root-split-background-transparent-dark, .theme-light.card-layout-open-light.mod-root-split-background-transparent-light) .is-sidedock-collapsed,
+:is(.theme-dark.card-layout-open-dark, .theme-light.card-layout-open-light) .is-sidedock-collapsed :is(.mod-top-left-space .workspace-tab-header-container, .workspace-sidedock-vault-profile) {
+ visibility: hidden;
+}
+
+/* tab style */
+body {
+ --border-radius-activated-tab-header-light: 6px;
+ --border-radius-activated-tab-header-dark: 6px;
+ --color-activated-tab-header-light: var(--text-normal);
+ --color-activated-tab-header-dark: var(--text-normal);
+ --background-activated-tab-header-light: var(--background-primary);
+ --shadow-activated-tab-header-light: 0px 0px 6px hsla(var(--accent-h), 18%, 80%, 0.4), 0px 0px 2px hsla(var(--accent-h), 18%, 80%, 0.2), 0 0 0 1px var(--background-modifier-border);
+ --background-activated-tab-header-dark: var(--background-modifier-active-hover);
+ --shadow-activated-tab-header-dark: inset 0 0 0 1px var(--background-modifier-border);
+}
+
+
+body.theme-light.color-to-tab-icon-light .workspace-tab-header.is-active svg,
+body.theme-light .workspace-tab-header.is-active .workspace-tab-header-inner-icon,
+body.theme-light .workspace-tab-header.is-active .workspace-tab-header-inner-title {
+ color: var(--color-activated-tab-header-light) !important;
+ --icon-opacity: 1;
+}
+
+body.theme-dark.color-to-tab-icon-dark .workspace-tab-header.is-active svg,
+body.theme-dark .workspace-tab-header.is-active .workspace-tab-header-inner-icon,
+body.theme-dark .workspace-tab-header.is-active .workspace-tab-header-inner-title {
+ color: var(--color-activated-tab-header-dark) !important;
+ --icon-opacity: 1;
+}
+
+body:not(.is-mobile) .clickable-icon.side-dock-ribbon-action,
+body:not(.is-mobile) .sidebar-toggle-button .clickable-icon,
+body:not(.is-mobile) .workspace-tab-header-tab-list .clickable-icon,
+body:not(.is-mobile) .workspace-tab-header-new-tab .clickable-icon,
+body:not(.is-mobile) .workspace-tab-header .workspace-tab-header-inner {
+ border-radius: var(--border-radius-activated-tab-header-light);
+}
+
+body:not(.is-mobile).theme-dark .clickable-icon.side-dock-ribbon-action,
+body:not(.is-mobile).theme-dark .sidebar-toggle-button .clickable-icon,
+body:not(.is-mobile).theme-dark .workspace-tab-header-tab-list .clickable-icon,
+body:not(.is-mobile).theme-dark .workspace-tab-header-new-tab .clickable-icon,
+body:not(.is-mobile).theme-dark .workspace-tab-header .workspace-tab-header-inner {
+ border-radius: var(--border-radius-activated-tab-header-dark);
+}
+
+body:not(.is-mobile) .workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active .workspace-tab-header-inner {
+ background: var(--background-activated-tab-header-light);
+ box-shadow: var(--shadow-activated-tab-header-light);
+ border-radius: var(--border-radius-activated-tab-header-light);
+}
+
+body:not(.is-mobile).theme-dark .workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active .workspace-tab-header-inner {
+ box-shadow: var(--shadow-activated-tab-header-dark);
+ background: var(--background-activated-tab-header-dark);
+ border-radius: var(--border-radius-activated-tab-header-dark);
+}
+
+body:not(.is-mobile) .workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active .workspace-tab-header-inner::before {
+ content: "";
+ width: calc(100% - 6px);
+ height: 3px;
+ background-color: var(--color-activated-tab-header-underline-light);
+ position: absolute;
+ top: 35px;
+ left: 3px;
+}
+
+body:not(.is-mobile).theme-dark .workspace-tabs:not(.mod-stacked) .workspace-tab-header.is-active .workspace-tab-header-inner::before {
+ content: "";
+ width: calc(100% - 6px);
+ height: 3px;
+ background-color: var(--color-activated-tab-header-underline-dark);
+ position: absolute;
+ top: 35px;
+ left: 3px;
+}
+
+/* tab - mobile*/
+
+.is-mobile .workspace-tab-header.is-active .workspace-tab-header-inner {
+ background: var(--background-modifier-hover);
+ box-shadow: inset 0 0 0 1px var(--background-modifier-border);
+}
+
+/* divider */
+body {
+ --workspace-divider-color: var(--divider-color);
+}
+
+body:not(.is-mobile).card-layout-open-light.theme-light,
+body:not(.is-mobile).card-layout-open-dark.theme-dark,
+body.workspace-divider-transparent-light.theme-light,
+body.workspace-divider-transparent-dark.theme-dark {
+ --workspace-divider-color: transparent;
+}
+
+.workspace-leaf-resize-handle {
+ border-color: var(--workspace-divider-color);
+}
+
+
+/* ====== divider vertical height ===== */
+.is-hidden-frameless .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle,
+.is-hidden-frameless .workspace-split.mod-left-split>.workspace-leaf-resize-handle,
+.is-hidden-frameless .workspace-split.mod-right-split>.workspace-leaf-resize-handle {
+ height: calc(var(--divider-vertical-height) - var(--header-height) - 4px);
+}
+
+.workspace-split.mod-vertical>*>.workspace-leaf-resize-handle,
+.workspace-split.mod-left-split>.workspace-leaf-resize-handle,
+.workspace-split.mod-right-split>.workspace-leaf-resize-handle {
+ height: calc(var(--divider-vertical-height) - 4px);
+}
+
+.workspace-split.mod-vertical:not(:has(.mod-top))>*>.workspace-leaf-resize-handle {
+ height: 100% !important;
+}
+
+/* ====== autohide ===== */
+
+/*autohide transition*/
+body:not(.is-mobile) .workspace::before {
+ transition: width var(--anim-out), height var(--anim-out);
+}
+
+body:not(.is-mobile):has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover, .status-bar:hover) .workspace::before {
+ transition: width var(--anim-out), height var(--anim-in);
+}
+
+body:not(.is-mobile):has(.workspace-ribbon.side-dock-ribbon:hover) .workspace::before {
+ transition: width var(--anim-in), height var(--anim-out);
+}
+
+/*tab autohide*/
+
+body:not(.is-mobile).tab-autohide .workspace-tabs {
+ gap: 0px;
+ transition: gap var(--anim-out);
+}
+
+body:not(.is-mobile).tab-autohide :has(.workspace-tab-header-container:hover) .workspace-tabs:hover {
+ gap: 4px;
+ transition: gap var(--anim-in);
+}
+
+body:not(.is-mobile).tab-autohide .workspace-tab-header-container {
+ height: 16px;
+ opacity: 0;
+ transition: height var(--anim-out), opacity var(--anim-out);
+}
+
+body:not(.is-mobile).tab-autohide .workspace-tab-header-container:hover {
+ height: 40px;
+ opacity: 1;
+ transition: height var(--anim-in), opacity var(--anim-in);
+}
+
+body:not(.is-mobile).tab-autohide .workspace-tab-header-container-inner {
+ transform: translateY(-22px);
+ opacity: 0;
+ transition: transform var(--anim-out), opacity var(--anim-out);
+}
+
+body:not(.is-mobile).tab-autohide .workspace-tab-header-container:hover .workspace-tab-header-container-inner,
+body:not(.is-mobile).tab-autohide:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .mod-top .workspace-tab-header-container-inner {
+ transform: translateY(0px);
+ opacity: 1;
+ transition: transform var(--anim-in), opacity var(--anim-in);
+}
+
+body:not(.is-mobile).tab-autohide:not(.card-layout-open-light).theme-light .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf,
+body:not(.is-mobile).tab-autohide:not(.card-layout-open-dark).theme-dark .workspace-tabs:not(.mod-top) .workspace-tab-container>.workspace-leaf {
+ box-shadow: inset 0px 1px 0px transparent;
+ transition: box-shadow var(--anim-out);
+}
+
+body:not(.is-mobile).tab-autohide:not(.card-layout-open-light).theme-light :has(.workspace-tab-header-container:hover) .workspace-tabs:not(.mod-top):hover .workspace-tab-container>.workspace-leaf,
+body:not(.is-mobile).tab-autohide:not(.card-layout-open-dark).theme-dark :has(.workspace-tab-header-container:hover) .workspace-tabs:not(.mod-top):hover .workspace-tab-container>.workspace-leaf {
+ box-shadow: inset 0px 1px 0px var(--workspace-divider-color);
+ transition: box-shadow var(--anim-in);
+}
+
+
+/*tab autohide mod-top*/
+
+body:not(.is-mobile).tab-autohide .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide .workspace-split.mod-left-split>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide .workspace-split.mod-right-split>.workspace-leaf-resize-handle {
+ height: calc(var(--divider-vertical-height) + 24px);
+ transition: height var(--anim-out), background-color 200ms ease-in-out, border-color 200ms ease-in-out, opacity 200ms ease-in-out;
+}
+
+body:not(.is-mobile).tab-autohide.status-bar-autohide:has(.status-bar:hover) .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide.status-bar-autohide:has(.status-bar:hover) .workspace-split.mod-left-split>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide.status-bar-autohide:has(.status-bar:hover) .workspace-split.mod-right-split>.workspace-leaf-resize-handle {
+ transition: height var(--anim-in), background-color 200ms ease-in-out, border-color 200ms ease-in-out, opacity 200ms ease-in-out;
+}
+
+body:not(.is-mobile).tab-autohide:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .workspace-split.mod-left-split>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .workspace-split.mod-right-split>.workspace-leaf-resize-handle {
+ height: calc(var(--divider-vertical-height) - 4px);
+ transition: height var(--anim-in), background-color 200ms ease-in-out, border-color 200ms ease-in-out, opacity 200ms ease-in-out;
+}
+
+body:not(.is-mobile).tab-autohide.is-hidden-frameless .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide.is-hidden-frameless .workspace-split.mod-left-split>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide.is-hidden-frameless .workspace-split.mod-right-split>.workspace-leaf-resize-handle {
+ height: calc(var(--divider-vertical-height) - 16px);
+ transition: height var(--anim-out), background-color 200ms ease-in-out, border-color 200ms ease-in-out, opacity 200ms ease-in-out;
+}
+
+body:not(.is-mobile).tab-autohide.status-bar-autohide:has(.status-bar:hover).is-hidden-frameless .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide.status-bar-autohide:has(.status-bar:hover).is-hidden-frameless .workspace-split.mod-left-split>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide.status-bar-autohide:has(.status-bar:hover).is-hidden-frameless .workspace-split.mod-right-split>.workspace-leaf-resize-handle {
+ transition: height var(--anim-in), background-color 200ms ease-in-out, border-color 200ms ease-in-out, opacity 200ms ease-in-out;
+}
+
+body:not(.is-mobile).tab-autohide.is-hidden-frameless:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .workspace-split.mod-vertical>*>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide.is-hidden-frameless:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .workspace-split.mod-left-split>.workspace-leaf-resize-handle,
+body:not(.is-mobile).tab-autohide.is-hidden-frameless:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .workspace-split.mod-right-split>.workspace-leaf-resize-handle {
+ height: calc(var(--divider-vertical-height) - var(--header-height) - 4px);
+ transition: height var(--anim-in), background-color 200ms ease-in-out, border-color 200ms ease-in-out, opacity 200ms ease-in-out;
+}
+
+/*---*/
+
+body:not(.is-mobile).tab-autohide .workspace-tabs.mod-top {
+ gap: 0px;
+ transition: gap var(--anim-out);
+}
+
+body:not(.is-mobile).tab-autohide.status-bar-autohide:has(.status-bar:hover) .workspace-tabs.mod-top {
+ transition: gap var(--anim-in);
+}
+
+body:not(.is-mobile).tab-autohide:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .workspace-tabs.mod-top {
+ gap: 4px;
+ transition: gap var(--anim-in);
+}
+
+body:not(.is-mobile).tab-autohide .workspace::before {
+ height: calc(100% - 16px);
+}
+
+body:not(.is-mobile).tab-autohide:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .workspace::before {
+ height: calc(100% - 44px);
+}
+
+body:not(.is-mobile).tab-autohide.is-hidden-frameless .titlebar-button-container,
+body:not(.is-mobile).tab-autohide .mod-top .workspace-tab-header-container {
+ height: 16px;
+ opacity: 0;
+ transition: height var(--anim-out), opacity var(--anim-out);
+}
+
+body:not(.is-mobile).tab-autohide:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .mod-top .workspace-tab-header-container {
+ height: 40px;
+ opacity: 1;
+ transition: height var(--anim-in), opacity var(--anim-in);
+}
+
+body:not(.is-mobile).tab-autohide:has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover).is-hidden-frameless .titlebar-button-container {
+ height: 44px;
+ opacity: 1;
+ transition: height var(--anim-in), opacity var(--anim-in);
+}
+
+body:not(.is-mobile).tab-autohide.status-bar-autohide:has(.status-bar:hover).is-hidden-frameless .titlebar-button-container,
+body:not(.is-mobile).tab-autohide.status-bar-autohide:has(.status-bar:hover) .mod-top .workspace-tab-header-container {
+ transition: height var(--anim-in), opacity var(--anim-in);
+}
+
+
+/*status bar autohide*/
+body:not(.is-mobile).status-bar-autohide .status-bar {
+ opacity: 0;
+ height: 16px;
+ transition: height var(--anim-out), opacity var(--anim-out);
+}
+
+body:not(.is-mobile).status-bar-autohide .status-bar:hover {
+ opacity: 1;
+ height: 24px;
+ transition: height var(--anim-in), opacity var(--anim-in);
+}
+
+body:not(.is-mobile).status-bar-autohide .horizontal-main-container {
+ padding-bottom: 16px;
+ transition: padding-bottom var(--anim-out);
+}
+
+body:not(.is-mobile).status-bar-autohide:has(.status-bar:hover) .horizontal-main-container {
+ padding-bottom: 24px;
+ transition: padding-bottom var(--anim-in);
+}
+
+/*ribbon autohide*/
+body:not(.is-mobile).Ribbon-autohide.show-ribbon .workspace-ribbon.side-dock-ribbon.mod-left {
+ --ribbon-width: 16px;
+ transition: all var(--anim-out);
+}
+
+body:not(.is-mobile).Ribbon-autohide.show-ribbon .workspace-ribbon.side-dock-ribbon.mod-left:hover {
+ --ribbon-width: 44px;
+ transition: all var(--anim-in);
+}
+
+body:not(.is-mobile).Ribbon-autohide.show-ribbon .workspace-ribbon.side-dock-ribbon.mod-left>* {
+ opacity: 0;
+ transition: all var(--anim-out);
+}
+
+body:not(.is-mobile).Ribbon-autohide.show-ribbon .workspace-ribbon.side-dock-ribbon.mod-left:hover>* {
+ opacity: 1;
+ transition: all var(--anim-in);
+}
+
+body:not(.is-mobile).Ribbon-autohide.show-ribbon .workspace::before {
+ width: calc(100% - 16px);
+}
+
+body:not(.is-mobile).Ribbon-autohide.show-ribbon:has(.workspace-ribbon.side-dock-ribbon:hover) .workspace::before {
+ width: calc(100% - 44px);
+}
+
+/* macos autohide fix*/
+body:not(.is-mobile):not(.is-popout-window).Ribbon-autohide.show-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen) .mod-left-split .mod-top-left-space .workspace-tab-header-container,
+body:not(.is-mobile):not(.is-popout-window).Ribbon-autohide.show-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen) .workspace:not(.is-left-sidedock-open) .sidebar-toggle-button.mod-left {
+ margin-left: 28px;
+}
+
+body:not(.is-mobile):not(.is-popout-window).Ribbon-autohide.show-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen):has(.workspace-ribbon.side-dock-ribbon:hover) .mod-left-split .mod-top-left-space .workspace-tab-header-container,
+body:not(.is-mobile):not(.is-popout-window).Ribbon-autohide.show-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen):has(.workspace-ribbon.side-dock-ribbon:hover) .workspace:not(.is-left-sidedock-open) .sidebar-toggle-button.mod-left {
+ margin-left: 0px;
+}
+
+body:not(.is-mobile):not(.is-popout-window).Ribbon-autohide.show-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen) .mod-left-split .mod-top-left-space .workspace-tab-header-container,
+body:not(.is-mobile):not(.is-popout-window).Ribbon-autohide.show-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen) .workspace:not(.is-left-sidedock-open) .sidebar-toggle-button.mod-left,
+body:not(.is-mobile):not(.is-popout-window).tab-autohide.mod-macos.is-hidden-frameless:not(.is-fullscreen) .mod-left-split .mod-top-left-space .workspace-tab-header-container,
+body:not(.is-mobile):not(.is-popout-window).tab-autohide.mod-macos.is-hidden-frameless:not(.is-fullscreen) .workspace:not(.is-left-sidedock-open) .sidebar-toggle-button.mod-left {
+ transition: height var(--anim-out), opacity var(--anim-out), margin-left var(--anim-out);
+}
+
+body:not(.is-mobile):not(.is-popout-window).Ribbon-autohide.show-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen):has(.workspace-ribbon.side-dock-ribbon:hover) .mod-left-split .mod-top-left-space .workspace-tab-header-container,
+body:not(.is-mobile):not(.is-popout-window).Ribbon-autohide.show-ribbon.mod-macos.is-hidden-frameless:not(.is-fullscreen):has(.workspace-ribbon.side-dock-ribbon:hover) .workspace:not(.is-left-sidedock-open) .sidebar-toggle-button.mod-left {
+ transition: height var(--anim-out), opacity var(--anim-out), margin-left var(--anim-in);
+}
+
+body:not(.is-mobile):not(.is-popout-window).tab-autohide.mod-macos.is-hidden-frameless:not(.is-fullscreen):has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .mod-left-split .mod-top-left-space .workspace-tab-header-container,
+body:not(.is-mobile):not(.is-popout-window).tab-autohide.mod-macos.is-hidden-frameless:not(.is-fullscreen):has(.mod-top>.workspace-tab-header-container:hover, .titlebar-button-container:hover) .workspace:not(.is-left-sidedock-open) .sidebar-toggle-button.mod-left {
+ transition: height var(--anim-in), opacity var(--anim-in), margin-left var(--anim-out);
+}
+
+/* hider plugin*/
+.hider-sidebar-buttons.mod-macos .sidebar-toggle-button.mod-left {
+ display: unset;
+ -webkit-app-region: drag;
+}
+
+.hider-sidebar-buttons.mod-macos .sidebar-toggle-button.mod-left>.clickable-icon {
+ display: none;
+}
+
+/*nav header autohide*/
+body:not(.is-mobile).nav-header-autohide :is(.workspace-leaf-content, .view-content)>.nav-header {
+ height: 16px;
+ opacity: 0;
+ transition: height var(--anim-out), opacity var(--anim-out);
+}
+
+body:not(.is-mobile).nav-header-autohide :is(.workspace-leaf-content, .view-content)>.nav-header:hover,
+body:not(.is-mobile).nav-header-autohide .workspace-tab-header-container:hover~.workspace-tab-container :is(.workspace-leaf-content, .view-content)>.nav-header,
+body:not(.is-mobile).tab-title-bar-autohide.nav-header-autohide .mod-root .workspace-leaf-content[data-type="backlink"] .view-header:hover~.view-content>.nav-header {
+ height: 44px;
+ opacity: 1;
+ transition: height var(--anim-in), opacity var(--anim-in);
+}
+
+
+body:not(.is-mobile).nav-header-autohide :is(.workspace-leaf-content, .view-content)>.nav-header .nav-buttons-container {
+ transform: translateY(-22px);
+ opacity: 0;
+ transition: transform var(--anim-out), opacity var(--anim-out);
+}
+
+body:not(.is-mobile).nav-header-autohide :is(.workspace-leaf-content, .view-content)>.nav-header:hover .nav-buttons-container,
+body:not(.is-mobile).nav-header-autohide .workspace-tab-header-container:hover~.workspace-tab-container :is(.workspace-leaf-content, .view-content)>.nav-header .nav-buttons-container,
+body:not(.is-mobile).tab-title-bar-autohide.nav-header-autohide .mod-root .workspace-leaf-content[data-type="backlink"] .view-header:hover~.view-content>.nav-header .nav-buttons-container {
+ transform: translateY(0px);
+ opacity: 1;
+ transition: transform var(--anim-in), opacity var(--anim-in);
+}
+
+/*view-header autohide */
+
+body:not(.is-mobile).tab-title-bar-autohide .view-header::after {
+ width: 100%;
+ content: " ";
+ background-color: transparent;
+ height: var(--size-4-4);
+ position: absolute;
+ z-index: -9;
+ top: 1px;
+ right: 0;
+}
+
+body:not(.is-mobile).tab-title-bar-autohide .mod-root .workspace-leaf .view-header {
+ height: 0;
+ margin-top: -1px;
+ transition: height var(--anim-out), margin var(--anim-out);
+}
+
+body:not(.is-mobile).tab-title-bar-autohide .mod-root .workspace-leaf .view-header:focus-within,
+body:not(.is-mobile).tab-title-bar-autohide .mod-root .workspace-leaf .view-header:hover,
+body:not(.is-mobile).tab-title-bar-autohide .mod-root .workspace-tab-header-container:hover~.workspace-tab-container .view-header {
+ height: var(--header-height);
+ margin-top: 0px;
+ transition: height var(--anim-in), margin var(--anim-in);
+}
+
+body:not(.is-mobile).tab-title-bar-autohide .view-actions,
+body:not(.is-mobile).tab-title-bar-autohide .view-header-nav-buttons,
+body:not(.is-mobile).tab-title-bar-autohide .view-header-title-container {
+ opacity: 0;
+ transition: opacity var(--anim-out);
+}
+
+body:not(.is-mobile).tab-title-bar-autohide .mod-root .workspace-tab-header-container:hover~.workspace-tab-container .view-header :is(.view-actions, .view-header-nav-buttons, .view-header-title-container),
+body:not(.is-mobile).tab-title-bar-autohide .view-header:focus-within :is(.view-actions, .view-header-nav-buttons, .view-header-title-container),
+body:not(.is-mobile).tab-title-bar-autohide .view-header:hover :is(.view-actions, .view-header-nav-buttons, .view-header-title-container) {
+ opacity: 1;
+ transition: opacity var(--anim-in);
+}
+
+/*view-header*/
+
+body:not(.is-mobile) .view-header {
+ padding: 0 6px;
+ border: 0;
+}
+
+body:not(.is-mobile) .view-header>* {
+ padding-top: var(--size-2-3);
+ padding-bottom: var(--size-2-1);
+ --icon-size: var(--icon-m);
+ --icon-stroke: var(--icon-m-stroke-width);
+}
+
+/*view-header surfing*/
+body:not(.is-mobile) .workspace-leaf-content[data-type="empty"]:has(.wb-bookmark-bar) .view-header {
+ margin-top: 0px !important;
+ height: var(--header-height) !important;
+}
+
+body:not(.is-mobile) .workspace-leaf-content[data-type="empty"]:has(.wb-bookmark-bar) :is(.view-actions, .view-header-nav-buttons, .view-header-title-container) {
+ opacity: 1;
+}
+
+/* ====== workspace mod root====== */
+/* ====== stack mod===== */
+.workspace .mod-root .workspace-tabs.mod-stacked .workspace-tab-container :is(.workspace-tab-header, .workspace-tab-header-inner, .view-header, .view-content) {
+ background-color: var(--background-mod-root-split);
+}
+
+.workspace .mod-root .workspace-tabs.mod-stacked .workspace-tab-container .workspace-tab-header-inner-icon {
+ width: 22px;
+ height: 22px;
+}
+
+body:not(.restored-scrollbars) .mod-stacked ::-webkit-scrollbar-track {
+ background-color: var(--background-primary) !important;
+}
+
+.mod-stacked .workspace-tab-header.is-active .workspace-tab-header-inner {
+ box-shadow: unset;
+}
+
+.workspace .mod-root .workspace-tabs.mod-stacked .workspace-tab-container .workspace-tab-header {
+ box-shadow: none;
+}
+
+.workspace .mod-root .workspace-tabs.mod-stacked .workspace-tab-container .workspace-tab-header-inner {
+ border-left: 1px solid var(--divider-color);
+ border-top-left-radius: var(--card-border-radius-light, 8px);
+ box-shadow: var(--tab-stacked-shadow);
+}
+
+.theme-dark .workspace .mod-root .workspace-tabs.mod-stacked .workspace-tab-container .workspace-tab-header-inner {
+ border-top-left-radius: var(--card-border-radius-dark, 8px);
+}
+
+.workspace .mod-root .workspace-tabs.mod-stacked .workspace-tab-container .workspace-tab-header:first-of-type .workspace-tab-header-inner {
+ border-left: none;
+}
+
+.workspace-split.mod-root.workspace-window .workspace-tabs.mod-stacked .workspace-tab-container .workspace-tab-header:first-of-type .workspace-tab-header-inner {
+ border-top-left-radius: 0px;
+ border-left: none;
+}
+
+.workspace .workspace-tabs.mod-stacked:not(.mod-top-left-space) .workspace-tab-container .workspace-tab-header:first-of-type .workspace-tab-header-inner {
+ border-top-left-radius: 0px;
+ border-left: none;
+}
+
+.workspace.is-left-sidedock-open .mod-stacked .workspace-tab-header:first-of-type,
+.workspace.is-left-sidedock-open .mod-stacked .workspace-tab-header:first-of-type .workspace-tab-header-inner {
+ border-top-left-radius: 0px !important;
+ border-left: none;
+}
+
+/* embedded backlinks */
+body:not(.is-mobile) .embedded-backlinks .nav-header~.search-input-container {
+ margin: 15px 0 0 0;
+}
+
+.is-mobile .embedded-backlinks .nav-header~.search-input-container {
+ margin: 10px 0 0 0;
+}
+
+/* document search replace */
+#cMenuToolbarModalBar.top {
+ z-index: var(--layer-status-bar);
+}
+
+body:not(.is-mobile) .mod-active .document-search-container,
+body:not(.is-mobile) .document-search-container {
+ background-color: var(--background-primary);
+}
+
+body:not(.is-mobile) .workspace-leaf-content[data-type=markdown] .document-search-container {
+ position: absolute;
+ top: var(--size-4-4);
+ border-radius: var(--size-4-2);
+ padding: var(--size-4-2) 0;
+ height: fit-content;
+ box-shadow: 0px 20px 30px -10px rgba(0, 0, 0, 0.3);
+ margin: 0px;
+ margin-left: calc((600px - 100%) / -2);
+ max-width: 600px;
+ width: calc(100% - 8px);
+ border: 1px solid var(--background-modifier-border);
+}
+
+body:not(.is-mobile).theme-dark .workspace-leaf-content[data-type=markdown] .document-search-container {
+ box-shadow: 0px 20px 30px -10px rgba(0, 0, 0, 0.6);
+}
+
+@container (max-width: 600px) {
+ body:not(.is-mobile) .workspace-leaf-content[data-type=markdown] .document-search-container {
+ margin-left: 4px;
+ }
+}
+
+/* canvas */
+body {
+ --canvas-dot-pattern: var(--color-base-30);
+ --canvas-background: transparent;
+ --canvas-card-border-style: solid;
+ --canvas-card-border-width: 2px;
+}
+
+.canvas-node-container {
+ border-width: var(--canvas-card-border-width);
+ border-style: var(--canvas-card-border-style);
+}
+
+
+.canvas-card-menu-left .canvas-card-menu {
+ left: var(--size-4-4);
+ transform: translatex(0%);
+}
+
+.canvas-card-menu-right .canvas-card-menu {
+ right: var(--size-4-4);
+ left: unset;
+ transform: translatex(0%);
+}
+
+.canvas-controls button {
+ border-bottom: 1px solid var(--divider-color);
+}
+
+.canvas-wrapper.is-screenshotting {
+ --canvas-background: var(--background-primary);
+}
+
+.canvas-controls-group {
+ background-color: transparent;
+ border: 1px solid var(--background-modifier-border);
+}
+
+.immersive-canvas .canvas-card-menu,
+.immersive-canvas .canvas-controls {
+ opacity: 0;
+ transition: opacity var(--anim-out);
+}
+
+
+.immersive-canvas .canvas-card-menu:hover,
+.immersive-canvas .canvas-controls:hover {
+ opacity: 1;
+ transition: opacity var(--anim-in);
+}
+
+
+/* canvas hover effect*/
+.canvas-node-container:hover {
+ border-color: var(--color-accent);
+}
+
+/* canvas hover effect*/
+
+.media-embed-card-border-off .canvas-node-container:has(> .media-embed) {
+ border-width: 0;
+ border-style: none;
+ box-shadow: none;
+}
+
+/* graph view*/
+.graph-controls {
+ right: var(--size-4-2);
+ top: var(--size-4-2);
+}
+
+.graph-controls.is-close {
+ border: 1px solid var(--background-modifier-border);
+ padding: 0px;
+ border-radius: var(--radius-s);
+}
+
+.graph-controls-button.mod-open,
+.graph-controls-button.mod-animate {
+ width: 32px;
+ height: 32px;
+ border-radius: 0px;
+ --icon-color: var(--text-normal);
+ background-color: var(--interactive-normal);
+}
+
+.graph-controls-button.mod-animate {
+ height: 33px;
+}
+
+.graph-controls-button.mod-open svg,
+.graph-controls-button.mod-animate svg {
+ --icon-size: var(--icon-s);
+ opacity: var(--icon-opacity);
+}
+
+.graph-controls.is-close,
+.workspace-split:not(.mod-root) .graph-controls.is-close {
+ background-color: var(--background-primary);
+ box-shadow: var(--input-shadow);
+}
+
+.graph-controls-button.mod-open:hover,
+.graph-controls-button.mod-animate:hover {
+ opacity: 1;
+ color: var(--icon-color);
+ background-color: var(--interactive-hover);
+}
+
+.graph-controls-button.mod-animate {
+ border-top: 1px solid var(--divider-color);
+}
+
+.graph-controls-button.mod-animate {
+ margin-top: 0px;
+}
+
+/*====== new tab ======*/
+body:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action-list {
+ display: flex;
+ gap: 0px;
+ border-radius: var(--radius-s);
+ box-shadow: var(--input-shadow);
+ overflow: hidden;
+}
+
+body:not(.new-tab-text-btn-restore).is-mobile.theme-light .workspace-leaf-content[data-type="empty"] .empty-state-action-list {
+ box-shadow: var(--input-shadow-light);
+}
+
+body:not(.new-tab-text-btn-restore).is-mobile.theme-dark .workspace-leaf-content[data-type="empty"] .empty-state-action-list {
+ box-shadow: var(--input-shadow-dark);
+}
+
+body:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action {
+ font-size: 0;
+ background-color: transparent !important;
+ color: var(--text-muted);
+ cursor: var(--cursor);
+ height: 40px;
+ width: 44px;
+ padding: 10px 12px;
+ border-radius: 0;
+}
+
+body.is-mobile:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action {
+ height: 44px;
+ width: 46px;
+ padding: 10px 12px;
+ margin: 0;
+}
+
+body:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action:nth-child(1),
+body:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action:nth-child(2) {
+ box-shadow: inset -1px 0px 0px var(--divider-color);
+}
+
+body:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action:hover {
+ background-color: var(--background-modifier-hover) !important;
+ color: var(--text-normal);
+}
+
+body.is-mobile:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action:before {
+ height: 24px !important;
+ width: 24px !important;
+}
+
+body:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action:nth-child(1):before {
+ content: " ";
+ display: block;
+ height: 20px;
+ width: 20px;
+ background-color: var(--icon-color);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+body:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action:nth-child(2):before {
+ content: " ";
+ display: block;
+ height: 20px;
+ width: 20px;
+ background-color: var(--icon-color);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+body:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action:nth-child(3) {
+ display: none;
+}
+
+body:not(.new-tab-text-btn-restore) .workspace-leaf-content[data-type="empty"] .empty-state-action:nth-child(4):before {
+ content: " ";
+ display: block;
+ height: 20px;
+ width: 20px;
+ background-color: var(--icon-color);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+/*new tab image*/
+.workspace-leaf-content[data-type="empty"] .empty-state::before {
+ content: "";
+ width: 100%;
+ height: 30%;
+ background-color: var(--icon-color);
+ -webkit-mask-size: contain;
+ -webkit-mask-position: center;
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2280%22%20height%3D%2280%22%20fill%3D%22none%22%20viewBox%3D%220%200%2080%2080%22%3E%3Cpath%20fill%3D%22%23000%22%20fill-opacity%3D%22.1%22%20fill-rule%3D%22evenodd%22%20d%3D%22M41.025%2044.046c-1.565-4.198-2.066-7.455-1.95-10.13.126-2.9.975-5.058%201.89-6.923.243-.495.485-.96.717-1.406.66-1.27%201.243-2.393%201.57-3.657.398-1.537.4-3.279-.519-5.633a3.197%203.197%200%200%200-3.486.523l-9.875%208.884a3.197%203.197%200%200%200-1.023%201.9c-.118.78-.259%201.752-.404%202.757-.25%201.72-.512%203.537-.7%204.67%202.313%201.47%205.437%203.94%207.093%207.98.226.553.424%201.132.589%201.74%202.033-.46%204.085-.765%206.098-.705Zm1.587.128c.957.129%201.901.355%202.827.701%203.307%201.238%206.25%203.964%208.665%208.966l.08-.12a139.935%20139.935%200%200%200%204.196-6.627%201.618%201.618%200%200%200-.122-1.797c-1.03-1.364-3-4.138-4.074-6.706-1.104-2.64-1.269-6.74-1.278-8.736a3.406%203.406%200%200%200-.714-2.097l-7.383-9.38a9.237%209.237%200%200%201-.165%203.912c-.371%201.437-1.062%202.763-1.744%204.075a60.2%2060.2%200%200%200-.644%201.26c-.87%201.771-1.631%203.728-1.745%206.353-.111%202.562.393%205.815%202.101%2010.196Zm4.66%2019.708c2.13.59%204.273-1.12%204.567-3.31.218-1.618.633-3.462%201.408-5.16-2.394-5.402-5.261-8.05-8.312-9.19-2.97-1.112-6.244-.85-9.698-.068.666%203.863.018%208.748-3%2014.906.158.036.32.06.483.072l4.844.367c2.362.182%204.92.956%207.328%201.684.816.246%201.613.488%202.38.7Zm-16.329-3.449c3.777-7.702%203.612-13.101%202.065-16.876-1.404-3.426-3.996-5.637-6.134-7.054-.91%202.125-5.19%2011.535-5.19%2011.535a3.196%203.196%200%200%200%20.622%203.535l8.348%208.597c.091.094.188.182.29.263Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E");
+}
+
+.new-tab-image-old .workspace-leaf-content[data-type="empty"] .empty-state::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240' fill='none' viewBox='0 0 240 240'%3e%3cg fill='black' clip-path='url(%23a)'%3e%3cpath fill-opacity='.25' fill-rule='evenodd' d='M67.793 61.072A80.673 80.673 0 0 1 95.85 45.667v32.798H75.54l-7.748-17.393Zm-28.703 58.26a3.98 3.98 0 0 0 2.737-.18l4.546-2.025 7.425 52.553C44.474 156.487 39 140.377 39 123c0-1.23.03-2.453.09-3.668Zm60.322 73.005h-21.3c12.038 7.29 26.13 11.535 41.198 11.655-8.453-.24-15.81-4.852-19.898-11.655Zm62.476 0c-12.038 7.29-26.131 11.535-41.198 11.655 8.453-.24 15.81-4.852 19.898-11.655h21.3Zm28.049-28.454C196.972 151.883 201 137.91 201 123c0-1.747-.053-3.472-.165-5.19l-14.918-5.43v9.293h3.128c3.622 0 6.405 3.202 5.895 6.787l-5.003 35.423Zm-22.312-85.418H147.15v-31.8a80.945 80.945 0 0 1 26.385 15.548l-5.91 16.252Z' clip-rule='evenodd'/%3e%3cpath fill-opacity='.4' d='M185.917 112.38v9.293H100.83a5.96 5.96 0 0 1-5.895-5.115l-1.47-10.403a5.947 5.947 0 0 0-5.895-5.115h-5.31a3.954 3.954 0 0 0 1.215-4.748L75.54 78.466h20.31v17.46a3.945 3.945 0 0 0 3.945 3.945h43.41a3.945 3.945 0 0 0 3.945-3.945v-17.46h20.475l-7.237 19.882-.173.48a3.936 3.936 0 0 0 2.355 5.055l23.347 8.498Zm-67.312-57.855s-4.23-8.648-5.76-12.21c-.277-.637-.465-1.117-.525-1.35 0 0-.285-.72-1.298-.72-1.012 0-1.267.645-1.267.645-.083.3-.36.968-.765 1.86-1.74 3.833-5.745 11.775-5.745 11.775-.36.742-1.245 1.44-1.245 1.943 0 .412.217.532.817.532h2.04c.6 0 .84-.12.84-.532 0-.503-.84-1.178-.84-1.943l1.321-2.76h6.697l1.32 2.76c0 .765-.84 1.44-.84 1.943 0 .412.21.532.84.532h4.823c.6 0 .839-.12.839-.532 0-.503-.915-1.2-1.252-1.943ZM106.822 50.4l2.693-5.737 2.708 5.737h-5.401Z'/%3e%3cg fill-opacity='.1'%3e%3cpath d='M135.315 40.958V29.123h-35.52a3.945 3.945 0 0 0-3.945 3.945v62.857a3.945 3.945 0 0 0 3.945 3.945h43.41a3.945 3.945 0 0 0 3.945-3.945V40.958h-11.835Zm-32.07 13.567s4.005-7.942 5.745-11.775c.405-.892.683-1.56.765-1.86 0 0 .263-.645 1.268-.645s1.297.72 1.297.72c.06.232.248.712.525 1.35 1.53 3.563 5.76 12.21 5.76 12.21.338.742 1.253 1.44 1.253 1.943 0 .412-.24.532-.84.532h-4.823c-.63 0-.84-.12-.84-.532 0-.503.84-1.178.84-1.943l-1.32-2.76h-6.697l-1.32 2.76c0 .765.839 1.44.839 1.943 0 .412-.239.532-.839.532h-2.04c-.6 0-.818-.12-.818-.532 0-.503.885-1.2 1.245-1.943ZM141 93h-39v-2.25h39V93Zm0-9h-39v-2.25h39V84Zm0-9h-39v-2.25h39V75Zm0-9h-39v-2.25h39V66Zm0-9h-18v-2.25h18V57Zm0-9h-18v-2.25h18V48Z'/%3e%3cpath d='m109.515 44.663-2.693 5.737h5.401l-2.708-5.737Z'/%3e%3c/g%3e%3cpath fill-opacity='.3' d='m67.823 76.245-4.808-10.808-3.428-7.694a4.49 4.49 0 0 0-2.505-2.37 4.458 4.458 0 0 0-3.442.09L26.235 67.665a4.51 4.51 0 0 0-2.28 5.94l8.235 18.502a4.502 4.502 0 0 0 5.94 2.28l7.402-3.292L57 85.987l8.543-3.802a4.492 4.492 0 0 0 2.647-3.72 4.43 4.43 0 0 0-.367-2.22Zm-5.715-7.313 1.83 4.118-8.91 3.96-.66-1.485-1.17-2.625 4.957-2.205 3.945-1.762h.008Zm-2.753-6.165 1.83 4.11-8.903 3.968-1.83-4.11 8.903-3.968Zm-8.212 11.048 1.71 3.855.12.255-.405.18L43.38 82.2l-1.83-4.11 9.593-4.275Zm-10.508 2.22-1.83-4.11 9.593-4.275 1.83 4.11-9.593 4.275Zm13.92-18.517c.292-.128.608-.196.915-.196.278 0 .547.053.81.15a2.22 2.22 0 0 1 1.245 1.185l.915 2.056-8.902 3.967-1.83-4.118 6.847-3.044Zm-8.91 3.967 1.837 4.11-9.592 4.275-1.837-4.118 9.592-4.267ZM26.01 72.69a2.236 2.236 0 0 1-.045-1.718 2.258 2.258 0 0 1 1.185-1.252l6.848-3.052 1.837 4.117-8.91 3.968-.915-2.063Zm1.83 4.118 8.91-3.968 1.83 4.11-8.91 3.968-1.83-4.11Zm4.575 10.274-1.83-4.11 8.91-3.967 1.83 4.11-8.91 3.968Zm4.8 5.25a2.235 2.235 0 0 1-1.718.046 2.258 2.258 0 0 1-1.252-1.186l-.915-2.054 8.91-3.968 1.83 4.11-6.855 3.052Zm9.712-4.327-.802.36-1.83-4.11 6.12-2.722 3.473-1.553 1.83 4.117-8.79 3.908Zm18.998-9.54a2.224 2.224 0 0 1-1.297 1.665l-6.855 3.053-.383-.863-1.447-3.255 8.91-3.96.915 2.055c.187.428.232.877.157 1.305Z'/%3e%3cpath fill-opacity='.2' d='M57.525 58.657a2.22 2.22 0 0 0-1.245-1.184 2.313 2.313 0 0 0-.81-.15c-.307 0-.623.067-.915.194l-6.847 3.045 1.83 4.118 8.902-3.968-.915-2.055Zm-21.472 7.095 1.837 4.118 9.593-4.275-1.838-4.11-9.593 4.267ZM27.15 69.72c-.547.248-.967.69-1.185 1.252a2.236 2.236 0 0 0 .045 1.718l.915 2.063 8.91-3.968-1.837-4.117-6.848 3.052Z'/%3e%3cpath fill-opacity='.1' d='M83.475 96.293 75.54 78.465l-7.748-17.393-6.675-15-10.814 4.816-4.816-10.816-32.444 14.445a3.943 3.943 0 0 0-1.995 5.205l25.567 57.428a3.957 3.957 0 0 0 2.475 2.183c.87.255 1.837.217 2.737-.181l4.546-2.024-.893-6.308-4.133 1.838-.922-2.055 4.733-2.108-.098-.667c-.503-3.585 2.273-6.788 5.895-6.788h10.95l14.153-6.3.914 2.055-9.532 4.245h14.82a3.954 3.954 0 0 0 1.215-4.748Zm-65.01-35.018L41.078 51.21l.914 2.055L19.38 63.33l-.915-2.055Zm17.842 33.503a4.502 4.502 0 0 1-4.117-2.67l-8.235-18.503a4.51 4.51 0 0 1 2.28-5.94L53.64 55.462a4.458 4.458 0 0 1 3.443-.09 4.49 4.49 0 0 1 2.505 2.37l3.427 7.696 4.808 10.807a4.43 4.43 0 0 1 .367 2.22 4.492 4.492 0 0 1-2.647 3.72L57 85.987l-11.468 5.108-7.402 3.293c-.585.262-1.2.39-1.823.39ZM57 95.835l-15.443 6.877-3.877 1.726-.915-2.056 5.587-2.49L57 93.376l15.397-6.855.915 2.055L57 95.835Z'/%3e%3cpath fill-opacity='.05' d='m36.746 72.85-8.907 3.965 1.83 4.111 8.907-3.965-1.83-4.111Zm11.648-5.192L38.8 71.93l1.83 4.11 9.593-4.27-1.83-4.11Zm10.965-4.89-8.907 3.966 1.83 4.11 8.907-3.965-1.83-4.11ZM53.197 72.9l1.17 2.625.66 1.485 8.91-3.96-1.83-4.117H62.1l-3.945 1.762-4.958 2.205Zm-.629 5.205.404-.18-.12-.255-1.71-3.855-9.592 4.275 1.83 4.11 9.188-4.088v-.007Zm-13.08.91-8.907 3.966 1.83 4.11 8.908-3.965-1.83-4.11Zm2.752 6.155-8.91 3.968.915 2.054c.248.548.69.968 1.253 1.186.562.217 1.17.195 1.717-.046l6.855-3.052-1.83-4.11Zm8.175-3.645v.008l-6.12 2.722 1.83 4.11.803-.352v-.008l8.79-3.907-1.83-4.118-3.473 1.545Zm6.975.795.383.863 6.854-3.053a2.224 2.224 0 0 0 1.298-1.665c.075-.427.03-.877-.157-1.305l-.915-2.055-8.91 3.96 1.447 3.255Z'/%3e%3cpath fill-opacity='.1' d='m216.098 60.667 4.042-11.122-33.368-12.15a3.954 3.954 0 0 0-5.062 2.355l-3.78 10.388-4.395 12.075-5.91 16.252-7.237 19.882-.173.48a3.936 3.936 0 0 0 2.355 5.055l23.347 8.498 14.918 5.43 2.52.915a3.946 3.946 0 0 0 5.063-2.355l.172-.48 17.55-48.203 1.08-2.97-11.122-4.05ZM185.977 46.02l25.373 9.232-.773 2.115-25.372-9.232.772-2.115Zm17.663 65.49-3.653-1.328-14.07-5.122-18.922-6.885.765-2.115 18.157 6.607 13.62 4.951 4.875 1.777-.772 2.115Zm11.505-31.598-7.118 19.545a3.89 3.89 0 0 1-4.995 2.333l-5.407-1.965-11.708-4.267-12.202-4.44a3.884 3.884 0 0 1-2.333-4.995l2.783-7.658 4.223-11.603.105-.284a3.894 3.894 0 0 1 5.002-2.333l29.317 10.672a3.897 3.897 0 0 1 2.333 4.995Zm3.63-9.982L182.13 56.595l.765-2.115 36.653 13.335-.773 2.115Z'/%3e%3cpath fill-opacity='.25' d='m212.813 74.918-29.318-10.673a3.894 3.894 0 0 0-5.002 2.332l-.105.285-4.223 11.603-2.782 7.657a3.884 3.884 0 0 0 2.332 4.996l12.203 4.44 11.707 4.26 5.407 1.972a3.891 3.891 0 0 0 4.996-2.333l7.117-19.544a3.896 3.896 0 0 0-2.332-4.995Zm-31.763-3.953c.037-.105.083-.21.128-.308.037-.075.067-.15.112-.217.045-.082.09-.157.143-.233 0 0 .022-.03.03-.044.03-.045.06-.09.097-.128a2.55 2.55 0 0 1 .225-.255c.053-.06.113-.12.173-.165.052-.06.112-.105.172-.15.18-.135.375-.255.593-.36.825-.36 1.635-.398 2.49-.083.15.053.3.12.435.195.082.038.157.083.225.128.165.097.314.21.449.338a3.19 3.19 0 0 1 .586.712c.052.098.105.195.157.3.368.818.405 1.635.09 2.49-.308.855-.862 1.455-1.672 1.852-.053.023-.113.045-.165.068-.008.007-.015.007-.03.007-.068.03-.128.053-.196.076-.127.037-.247.075-.382.09-.09.022-.187.037-.277.044-.473.053-.945-.014-1.44-.195-.855-.307-1.455-.862-1.853-1.672-.367-.825-.405-1.635-.09-2.49Zm23.317 27.157-8.295-3.014-10.154-3.698-10.868-3.953 1.417-3.914 6.893-4.006.127-.075.593.66.593.66 2.752 3.068 2.76-1.313 10.635-5.07 6.863 11.543-3.316 9.112Z'/%3e%3cpath fill-opacity='.05' d='m207.682 89.01-3.315 9.112-8.295-3.014-10.155-3.698-10.867-3.953 1.417-3.914 6.893-4.006.127-.075.593.66.592.66 2.753 3.068 2.76-1.313 10.635-5.07 6.862 11.543Zm-20.527-15.825c-.308.855-.863 1.455-1.673 1.852-.052.023-.112.045-.165.068-.007.007-.015.007-.03.007-.067.03-.127.053-.195.076-.127.037-.247.075-.382.09-.09.022-.188.037-.278.044-.472.053-.945-.014-1.44-.195-.855-.307-1.455-.862-1.852-1.672-.368-.825-.405-1.635-.09-2.49.037-.105.082-.21.127-.308.03-.075.068-.15.113-.217.045-.082.09-.157.142-.233 0 0 .023-.03.03-.044.03-.045.06-.09.098-.128.067-.09.142-.172.225-.255.052-.06.112-.12.172-.165.053-.052.113-.105.173-.15.18-.135.375-.255.592-.36.825-.36 1.635-.398 2.49-.083.15.053.3.12.435.195.083.038.158.083.225.128.165.097.315.21.45.338.075.067.143.134.21.21.135.15.255.322.375.502.053.098.105.195.158.3.367.818.405 1.635.09 2.49Z'/%3e%3cpath fill-opacity='.3' d='M147.15 40.958h-11.835V29.13l11.835 11.828Zm-96.847 9.929 10.815-4.815-15.63-6 4.815 10.815ZM227.22 64.718l-11.122-4.05 4.042-11.123 7.08 15.172Z'/%3e%3cpath fill-opacity='.15' d='m194.94 128.46-5.002 35.422-3.3 23.333a5.949 5.949 0 0 1-5.895 5.123h-40.156c.12-.203.24-.398.353-.608A23.85 23.85 0 0 0 144 180c0-13.26-10.747-24-24-24s-24 10.74-24 24c0 4.26 1.11 8.265 3.06 11.73.112.21.233.405.352.608H62.167a5.96 5.96 0 0 1-5.895-5.123l-2.474-17.535-7.425-52.553-.893-6.307-.322-2.325-.098-.667c-.503-3.585 2.273-6.788 5.895-6.788H87.57a5.947 5.947 0 0 1 5.895 5.115l1.47 10.403a5.959 5.959 0 0 0 5.895 5.114h88.215c3.622 0 6.405 3.203 5.895 6.788Z'/%3e%3cpath fill-opacity='.4' d='M120 156c-13.253 0-24 10.74-24 24 0 4.26 1.11 8.265 3.06 11.73.112.21.233.405.352.608 4.088 6.802 11.446 11.414 19.898 11.654h1.38c8.452-.24 15.81-4.852 19.897-11.654.12-.203.24-.398.353-.608A23.85 23.85 0 0 0 144 180c0-13.26-10.747-24-24-24Zm13.65 35.73c-.173.21-.36.413-.547.608A17.928 17.928 0 0 1 120 198a17.908 17.908 0 0 1-13.095-5.662 8.574 8.574 0 0 1-.555-.608A17.935 17.935 0 0 1 102 180c0-9.945 8.062-18 18-18s18 8.055 18 18c0 4.485-1.635 8.58-4.35 11.73Z'/%3e%3cpath fill-opacity='.5' d='M120 162c-9.938 0-18 8.055-18 18 0 4.485 1.643 8.58 4.35 11.73.173.21.36.413.555.608A17.92 17.92 0 0 0 120 198a17.94 17.94 0 0 0 13.103-5.662c.187-.195.374-.398.547-.608A17.893 17.893 0 0 0 138 180c0-9.945-8.055-18-18-18Zm7.5 19.5h-6v6c0 .825-.675 1.5-1.5 1.5s-1.5-.675-1.5-1.5v-6h-6c-.825 0-1.5-.675-1.5-1.5s.675-1.5 1.5-1.5h6v-6a1.5 1.5 0 1 1 3 0v6h6a1.5 1.5 0 1 1 0 3Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h240v240H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+.new-tab-image-customize .workspace-leaf-content[data-type="empty"] .empty-state::before {
+ background-color: unset;
+ background-size: contain;
+ background-position: center;
+ background-repeat: no-repeat;
+ background-image: var(--new-tab-image);
+ -webkit-mask: unset;
+}
+
+.new-tab-image-none .workspace-leaf-content[data-type="empty"] .empty-state::before {
+ display: none;
+}
+
+.new-tab-image-none .workspace-leaf-content[data-type="empty"] .empty-state-title {
+ display: block;
+}
+
+body {
+ --new-tab-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2280%22%20height%3D%2280%22%20fill%3D%22none%22%20viewBox%3D%220%200%2080%2080%22%3E%3Cg%20filter%3D%22url(%23a)%22%3E%3Cpath%20fill%3D%22%23000%22%20fill-opacity%3D%22.26%22%20d%3D%22M51.894%2060.617c-.291%202.162-2.41%203.85-4.515%203.267-3-.825-6.474-2.112-9.6-2.352l-4.79-.362a3.163%203.163%200%200%201-2.042-.95l-8.254-8.483a3.15%203.15%200%200%201-.616-3.49S27.18%2037.053%2027.37%2036.47c.19-.582.886-5.66%201.298-8.388a3.153%203.153%200%200%201%201.011-1.875l9.765-8.767a3.165%203.165%200%200%201%204.597.394l8.202%2010.4c.464.59.702%201.32.706%202.07.009%201.97.172%206.016%201.263%208.621%201.062%202.535%203.01%205.272%204.03%206.619.39.517.45%201.216.12%201.773a138.06%20138.06%200%200%201-4.15%206.54c-1.386%202.063-2.028%204.613-2.318%206.761Z%22%2F%3E%3C%2Fg%3E%3Cpath%20fill%3D%22%230E0E0E%22%20d%3D%22M51.602%2060.187c-.292%202.171-2.417%203.867-4.528%203.282-3.008-.829-6.491-2.122-9.626-2.362l-4.803-.365a3.168%203.168%200%200%201-2.048-.953l-8.277-8.523a3.168%203.168%200%200%201-.618-3.504S26.82%2036.515%2027.01%2035.93c.19-.585.888-5.686%201.301-8.427a3.17%203.17%200%200%201%201.015-1.883l9.79-8.807a3.17%203.17%200%200%201%204.61.396l8.226%2010.448c.465.59.704%201.326.707%202.078.01%201.98.173%206.043%201.268%208.66%201.064%202.547%203.018%205.296%204.04%206.65a1.6%201.6%200%200%201%20.12%201.78%20137.46%20137.46%200%200%201-4.16%206.57c-1.39%202.072-2.034%204.634-2.325%206.792Z%22%2F%3E%3Cpath%20fill%3D%22url(%23b)%22%20d%3D%22M31.489%2060.433c3.844-7.804%203.736-13.395%202.1-17.384-1.505-3.672-4.304-5.988-6.51-7.425-.047.208-.115.41-.202.605l-5.175%2011.532a3.168%203.168%200%200%200%20.618%203.505l8.277%208.523c.26.267.562.484.892.644Z%22%2F%3E%3Cpath%20fill%3D%22url(%23c)%22%20d%3D%22M47.075%2063.469c2.11.585%204.235-1.11%204.527-3.282.252-1.869.769-4.041%201.806-5.936-2.38-5.121-5.256-7.777-8.41-8.954-3.339-1.246-6.987-.835-10.684.063.826%203.76.331%208.673-2.82%2015.073.358.174.75.28%201.154.309%200%200%202.275.191%204.98.383%202.705.191%206.73%201.59%209.447%202.344Z%22%2F%3E%3Cpath%20fill%3D%22url(%23d)%22%20d%3D%22M41.95%2044.595c1.038.108%202.056.332%203.047.702%203.154%201.177%206.032%203.833%208.411%208.954.16-.292.333-.578.519-.855a138.877%20138.877%200%200%200%204.16-6.57%201.603%201.603%200%200%200-.12-1.78c-1.022-1.354-2.976-4.103-4.04-6.65-1.095-2.617-1.258-6.68-1.267-8.66a3.377%203.377%200%200%200-.708-2.079L43.727%2017.21a3.198%203.198%200%200%200-.136-.162c.603%201.978.562%203.569.19%205.015-.345%201.341-.975%202.558-1.641%203.843-.223.43-.45.87-.672%201.323-.884%201.806-1.68%203.85-1.798%206.592-.118%202.74.444%206.179%202.28%2010.774Z%22%2F%3E%3Cpath%20fill%3D%22url(%23e)%22%20d%3D%22M41.948%2044.594c-1.835-4.595-2.398-8.033-2.28-10.774.118-2.742.915-4.786%201.798-6.592.222-.454.45-.893.673-1.324.665-1.285%201.295-2.501%201.64-3.842.373-1.447.414-3.038-.19-5.017a3.17%203.17%200%200%200-4.472-.232l-9.792%208.807a3.17%203.17%200%200%200-1.014%201.883l-1.192%207.902a3.182%203.182%200%200%201-.04.218c2.206%201.438%205.006%203.754%206.511%207.426.294.717.54%201.486.72%202.31%202.6-.632%205.177-1.022%207.638-.765Z%22%2F%3E%3Cg%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%3E%3Cpath%20fill%3D%22url(%23f)%22%20d%3D%22M39.687%2033.638c-.118%202.72.221%205.839%202.053%2010.424l-.575-.052c-1.643-4.785-2.001-7.238-1.881-9.995.12-2.758%201.01-4.879%201.899-6.688.225-.458.75-1.319.974-1.75.665-1.28%201.108-1.955%201.488-3.124.53-1.633.416-2.406.355-3.176.422%202.783-1.178%205.202-2.388%207.667-.882%201.795-1.807%203.976-1.925%206.694Z%22%2F%3E%3Cpath%20fill%3D%22url(%23g)%22%20d%3D%22M34.131%2043.25c.217.502.422.907.552%201.529l-.48.108c-.2-.726-.354-1.242-.63-1.865-1.654-3.902-4.309-5.91-6.478-7.381%202.62%201.41%205.31%203.616%207.036%207.608Z%22%2F%3E%3Cpath%20fill%3D%22url(%23h)%22%20d%3D%22M34.71%2045.27c.917%204.264-.105%209.683-3.118%2014.95%202.518-5.22%203.74-10.234%202.723-14.866l.396-.085Z%22%2F%3E%3Cpath%20fill%3D%22url(%23i)%22%20d%3D%22M45.11%2044.888c4.94%201.848%206.842%205.908%208.264%209.294-1.756-3.546-4.197-7.462-8.441-8.915-3.23-1.106-5.957-.975-10.619.083l-.104-.462c4.948-1.128%207.535-1.26%2010.9%200Z%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CradialGradient%20id%3D%22b%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientTransform%3D%22matrix(-5.44827%20-20.95522%2013.96424%20-3.63065%2031.076%2059.662)%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23fff%22%20stop-opacity%3D%22.44%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23333%22%20stop-opacity%3D%22.52%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22c%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientTransform%3D%22matrix(-9.24927%20-16.1868%2016.18663%20-9.24917%2047.535%2064.623)%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23565656%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23151515%22%20stop-opacity%3D%22.71%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22d%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientTransform%3D%22matrix(4.6468%20-35.22462%2026.02364%203.433%2049.53%2050.76)%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%237E7E7E%22%20stop-opacity%3D%22.91%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%231E1E1E%22%20stop-opacity%3D%22.6%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22e%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientTransform%3D%22matrix(13.14708%20-30.29344%2020.65904%208.96583%2034.531%2046.293)%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23D7D7D7%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23414141%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22f%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientTransform%3D%22matrix(-3.34584%2015.42817%20-10.40357%20-2.25617%2044.882%2027.895)%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23fff%22%20stop-opacity%3D%220%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23fff%22%20stop-opacity%3D%22.17%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22g%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientTransform%3D%22matrix(8.17858%208.27172%20-17.61805%2017.41967%2026.387%2036.445)%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23fff%22%20stop-opacity%3D%22.2%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23fff%22%20stop-opacity%3D%22.44%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22h%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientTransform%3D%22rotate(80.202%20-7.323%2041.856)%20scale(13.634%2028.9518)%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23fff%22%20stop-opacity%3D%22.12%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23fff%22%20stop-opacity%3D%22.35%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22i%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientTransform%3D%22rotate(-152.296%2033.168%2019.977)%20scale(20.7745%2065.377)%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23fff%22%20stop-opacity%3D%22.21%22%2F%3E%3Cstop%20offset%3D%22.467%22%20stop-color%3D%22%23fff%22%20stop-opacity%3D%22.19%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23fff%22%20stop-opacity%3D%22.29%22%2F%3E%3C%2FradialGradient%3E%3Cfilter%20id%3D%22a%22%20width%3D%2239.273%22%20height%3D%2249.867%22%20x%3D%2220.551%22%20y%3D%2215.381%22%20color-interpolation-filters%3D%22sRGB%22%20filterUnits%3D%22userSpaceOnUse%22%3E%3CfeFlood%20flood-opacity%3D%220%22%20result%3D%22BackgroundImageFix%22%2F%3E%3CfeBlend%20in%3D%22SourceGraphic%22%20in2%3D%22BackgroundImageFix%22%20mode%3D%22normal%22%20result%3D%22shape%22%2F%3E%3CfeGaussianBlur%20result%3D%22effect1_foregroundBlur_3584_482%22%20stdDeviation%3D%22.624%22%2F%3E%3C%2Ffilter%3E%3C%2Fdefs%3E%3C%2Fsvg%3E");
+}
+
+.new-tab-image-customize .workspace-leaf-content[data-type="empty"] .empty-state::before {
+ background-color: unset;
+ background-size: contain;
+ background-position: center;
+ background-repeat: no-repeat;
+ background-image: var(--new-tab-image);
+ -webkit-mask: unset;
+}
+
+.workspace-leaf-content[data-type="empty"] .empty-state-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ max-height: 100%;
+}
+
+.workspace-leaf-content[data-type="empty"] .empty-state-title {
+ display: none;
+}
+
+.is-mobile .workspace-leaf-content[data-type="empty"] .empty-state-action-list,
+.workspace-leaf-content[data-type="empty"] .empty-state-action-list {
+ margin-top: 0px;
+}
+
+.workspace-leaf-content[data-type="empty"] .empty-state-container div:has(+ .empty-state-action-list) {
+ margin-bottom: 20px;
+}
+
+.is-mobile .workspace-leaf-content[data-type="empty"] .empty-state-action {
+ margin: 12px 0;
+ padding: 4px 24px;
+}
+
+/*surfing plugin*/
+
+.empty-state:has(.wb-search-bar-container)::before,
+.empty-state:has(.wb-search-bar-container) .empty-state-container {
+ display: none;
+}
+
+.surfing-settings-icon {
+ width: fit-content;
+ height: fit-content;
+ position: absolute;
+ right: 20px;
+ margin-top: var(--size-4-4);
+}
+
+input.wb-search-bar {
+ --background-modifier-form-field: transparent;
+}
+
+/* ====== workspace mod side====== */
+.nav-header {
+ padding: var(--size-2-3) var(--size-2-3) var(--size-2-1);
+}
+
+.nav-header~.search-input-container {
+ width: calc(100% - var(--size-4-6));
+}
+
+/*nav-buttons left align*/
+.nav-buttons-container {
+ display: flex;
+ justify-content: flex-start;
+}
+
+/*outline pane*/
+/* from https://github.com/subframe7536/obsidian-theme-maple, author:@subframe7536 */
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .collapse-icon {
+ padding-inline-end: var(--size-2-3);
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .collapse-icon::before {
+ content: "" !important;
+}
+
+.outline-enhanced:not(.is-grabbing) .workspace-leaf-content[data-type=outline] .view-content .tree-item {
+ position: relative;
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item-self {
+ position: relative;
+ margin-bottom: 0;
+ white-space: nowrap;
+ margin-top: -1px;
+ /* fix item gap */
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item-self .tree-item-inner {
+ padding-left: 16px;
+ margin-left: -16px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ height: calc(var(--nav-item-size) * 1.8);
+ line-height: calc(var(--nav-item-size) * 1.8);
+ position: relative;
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item-self .tree-item-inner::before {
+ content: "";
+ width: var(--size-4-1);
+ height: var(--size-4-1);
+ border: 2px solid var(--color-accent);
+ border-radius: 50%;
+ position: absolute;
+ left: 0px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+/*.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item-self .tree-item-icon~.tree-item-inner {
+ padding-left: 4px;
+}*/
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item-self .tree-item-icon~.tree-item-inner::before {
+ content: none;
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item.is-collapsed .tree-item-icon::before {
+ box-shadow: 0 0 0 4px var(--background-modifier-active-hover);
+}
+
+.outline-enhanced:not(.is-grabbing) .workspace-leaf-content[data-type=outline] .view-content .tree-item::after {
+ content: "";
+ width: 2px;
+ position: absolute;
+ background-color: transparent;
+ top: calc(var(--nav-item-size) * 1.8 / 2 * -1);
+ left: -9px;
+ height: calc(100% - var(--nav-item-size) * 1.8 + var(--size-4-8));
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item-icon {
+ cursor: pointer;
+ top: 50%;
+ transform: translateY(-50%);
+ z-index: 1;
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item-icon::before {
+ width: var(--size-4-2);
+ height: var(--size-4-2);
+ background-color: var(--color-accent);
+ border-radius: 50%;
+ position: absolute;
+ left: 4px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item-icon svg {
+ display: block;
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item-icon svg path {
+ display: none;
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item:hover>.tree-item-children>.tree-item::after {
+ background-color: var(--color-accent);
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item:hover>.tree-item-self:hover+.tree-item-children .tree-item::after {
+ background-color: transparent;
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item:hover>.tree-item-children>.tree-item:hover::after,
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content .tree-item:hover>.tree-item-children>.tree-item:hover~.tree-item::after {
+ background-color: transparent;
+}
+
+.outline-enhanced:not(.is-grabbing) .workspace-leaf-content[data-type=outline] .view-content .tree-item:hover>.tree-item-children>.tree-item:hover::before {
+ content: "";
+ position: absolute;
+ top: calc(var(--nav-item-size) * 1.8 / 2 * -1);
+ left: -9px;
+ bottom: calc(100% - (var(--nav-item-size) * 1.8 + var(--size-4-2)) / 2 - 1px);
+ width: 16px;
+ border-bottom-left-radius: var(--radius-m);
+ border-bottom: 2px solid var(--color-accent);
+ border-left: 2px solid var(--color-accent);
+}
+
+.outline-enhanced .workspace-leaf-content[data-type=outline] .view-content :is(.tree-item-children, .tree-item-self .tree-item-self) {
+ padding-left: 0;
+ margin-left: var(--size-4-5);
+ border-left: none;
+}
+
+/* ====== file pane====== */
+/*bigger cta*/
+body:not(.is-mobile).CTA-BTN-enable .workspace-leaf-content[data-type="file-explorer"] .nav-header .nav-buttons-container .clickable-icon.nav-action-button:first-of-type {
+ background-color: var(--interactive-accent);
+ color: var(--text-on-accent);
+ box-shadow: var(--input-shadow);
+ border-radius: var(--button-radius);
+ width: 100px;
+ padding: var(--size-2-3);
+}
+
+body:not(.is-mobile).CTA-BTN-enable .workspace-leaf-content[data-type="file-explorer"] .nav-header .nav-buttons-container .clickable-icon.nav-action-button:first-of-type:hover {
+ background-color: var(--interactive-accent-hover);
+}
+
+body:not(.is-mobile).CTA-BTN-enable .workspace-leaf-content[data-type="file-explorer"] .nav-header .nav-buttons-container .clickable-icon.nav-action-button:first-of-type::after {
+ content: "New Note";
+ font-size: var(--font-ui-small);
+ margin-left: auto;
+}
+
+/* file active states */
+.theme-light {
+ --border-radius-activated-file-light: var(--radius-s);
+ --color-activated-file-light: var(--nav-item-color-active);
+ --background-activated-file-light: var(--nav-item-background-active);
+ --shadow-activated-file-light: none;
+}
+
+.theme-dark {
+ --border-radius-activated-file-dark: var(--radius-s);
+ --color-activated-file-dark: var(--nav-item-color-active);
+ --background-activated-file-dark: var(--nav-item-background-active);
+ --shadow-activated-file-dark: none;
+}
+
+.activated-file-default-light.theme-light {
+ --border-radius-activated-file-light: var(--radius-s) !important;
+ --color-activated-file-light: var(--nav-item-color-active) !important;
+ --background-activated-file-light: var(--nav-item-background-active) !important;
+ --shadow-activated-file-light: none !important;
+}
+
+.activated-file-default-dark.theme-dark {
+ --border-radius-activated-file-dark: var(--radius-s) !important;
+ --color-activated-file-dark: var(--nav-item-color-active) !important;
+ --background-activated-file-dark: var(--nav-item-background-active) !important;
+ --shadow-activated-file-dark: none !important;
+}
+
+.activated-file-accent-light.theme-light {
+ --border-radius-activated-file-light: var(--radius-s) !important;
+ --color-activated-file-light: var(--text-on-accent) !important;
+ --background-activated-file-light: var(--color-accent) !important;
+ --shadow-activated-file-light: none !important;
+}
+
+.activated-file-accent-dark.theme-dark {
+ --border-radius-activated-file-dark: var(--radius-s) !important;
+ --color-activated-file-dark: var(--text-on-accent) !important;
+ --background-activated-file-dark: var(--color-accent) !important;
+ --shadow-activated-file-dark: none !important;
+}
+
+.activated-file-accent-light.theme-light .nav-file-title.is-active .nav-file-tag,
+.activated-file-accent-dark.theme-dark .nav-file-title.is-active .nav-file-tag,
+.activated-file-accent-light.theme-light .tree-item-self.is-active svg,
+.activated-file-accent-dark.theme-dark .tree-item-self.is-active svg {
+ color: var(--text-on-accent) !important;
+}
+
+.activated-file-tab-style-light.theme-light {
+ --border-radius-activated-file-light: var(--border-radius-activated-tab-header-light) !important;
+ --color-activated-file-light: var(--color-activated-tab-header-light) !important;
+ --background-activated-file-light: var(--background-activated-tab-header-light) !important;
+ --shadow-activated-file-light: var(--shadow-activated-tab-header-light) !important;
+}
+
+.activated-file-tab-style-dark.theme-dark {
+ --border-radius-activated-file-dark: var(--border-radius-activated-tab-header-dark) !important;
+ --color-activated-file-dark: var(--color-activated-tab-header-dark) !important;
+ --background-activated-file-dark: var(--background-activated-tab-header-dark) !important;
+ --shadow-activated-file-dark: var(--shadow-activated-tab-header-dark) !important;
+}
+
+.activated-file-tab-style-light.theme-light .nav-file-title.is-active .nav-file-tag,
+.activated-file-tab-style-light.theme-light .tree-item-self.is-active svg {
+ color: var(--color-activated-file-light) !important;
+}
+
+.activated-file-tab-style-dark.theme-dark .nav-file-title.is-active .nav-file-tag,
+.activated-file-tab-style-dark.theme-dark .tree-item-self.is-active svg {
+ color: var(--color-activated-file-dark) !important;
+}
+
+.activated-file-customize-light {
+ --border-radius-activated-file-light: 4px;
+ --color-activated-file-light: var(--nav-item-color-active);
+ --background-activated-file-light: rgba(0, 0, 0, 0.05);
+ --shadow-activated-file-light: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
+}
+
+.activated-file-customize-dark {
+ --border-radius-activated-file-dark: 4px;
+ --color-activated-file-light: var(--nav-item-color-active);
+ --background-activated-file-dark: rgba(255, 255, 255, 0.075);
+ --shadow-activated-file-dark: inset 0 0 0 1px rgba(255, 255, 255, 0.15);
+}
+
+.activated-file-customize-light.theme-light .nav-file-title.is-active .nav-file-tag,
+.activated-file-customize-light.theme-light .tree-item-self.is-active svg {
+ color: var(--color-activated-file-light) !important;
+}
+
+.activated-file-customize-dark.theme-dark .nav-file-title.is-active .nav-file-tag,
+.activated-file-customize-dark.theme-dark .tree-item-self.is-active svg {
+ color: var(--color-activated-file-dark) !important;
+}
+
+.theme-light:not(.is-grabbing) .workspace-leaf-content[data-type="bookmarks"] .tree-item-self.is-active:hover,
+.theme-light .workspace-leaf-content[data-type="bookmarks"] .tree-item-self.is-active,
+.theme-light .mk-tree-item.nav-folder-title.is-active.is-selected,
+.theme-light .mk-tree-item.nav-file-title.is-active.is-selected,
+.theme-light:not(.is-grabbing) .nav-file-title.is-active:hover,
+.theme-light:not(.is-grabbing) .nav-folder-title.is-active:hover,
+.theme-light .nav-file-title.is-active,
+.theme-light .nav-folder-title.is-active {
+ --nav-item-color-active: var(--color-activated-file-light);
+ --nav-item-color-selected: var(--color-activated-file-light);
+ border-radius: var(--border-radius-activated-file-light);
+ background: var(--background-activated-file-light) !important;
+ box-shadow: var(--shadow-activated-file-light);
+}
+
+.theme-dark:not(.is-grabbing) .workspace-leaf-content[data-type="bookmarks"] .tree-item-self.is-active:hover,
+.theme-dark .workspace-leaf-content[data-type="bookmarks"] .tree-item-self.is-active,
+.theme-dark .mk-tree-item.nav-folder-title.is-active.is-selected,
+.theme-dark .mk-tree-item.nav-file-title.is-active.is-selected,
+.theme-dark:not(.is-grabbing) .nav-file-title.is-active:hover,
+.theme-dark:not(.is-grabbing) .nav-folder-title.is-active:hover,
+.theme-dark .nav-file-title.is-active,
+.theme-dark .nav-folder-title.is-active {
+ --nav-item-color-active: var(--color-activated-file-dark);
+ --nav-item-color-selected: var(--color-activated-file-dark);
+ border-radius: var(--border-radius-activated-file-dark);
+ background: var(--background-activated-file-dark) !important;
+ box-shadow: var(--shadow-activated-file-dark);
+}
+
+/* file layout & style */
+.workspace-leaf-content .tree-item-self {
+ margin-bottom: var(--size-2-2);
+ position: relative;
+ border-radius: var(--border-radius-activated-file-light);
+ align-items: center;
+}
+
+.theme-dark .workspace-leaf-content .tree-item-self {
+ border-radius: var(--border-radius-activated-file-dark);
+}
+
+.workspace-leaf-content .tree-item-self :is(.tree-item-flair, .tree-item-inner) {
+ line-height: 20px;
+}
+
+.file-names-untrim .workspace-leaf-content[data-type="file-explorer"] :is(.nav-file-title-content, .nav-folder-title-content) {
+ white-space: normal;
+}
+
+.folder-font-bold .nav-folder-title {
+ --nav-item-weight-hover: bold;
+ --nav-item-weight-active: bold;
+ --nav-item-weight: bold;
+}
+
+/*file tag*/
+.nav-file-tag {
+ background-color: transparent;
+ color: var(--text-faint);
+ margin-left: 4px;
+}
+
+/*other pane*/
+.workspace-leaf-content .nav-header~.node-insert-event {
+ padding-top: var(--size-4-1);
+}
+
+/*icons in pane*/
+.tree-item-self .tree-item-icon {
+ height: var(--size-4-4);
+ --icon-color: currentColor;
+}
+
+.tree-item-self .tree-item-icon .svg-icon:not(.right-triangle) {
+ --icon-size: var(--icon-s);
+ --icon-stroke: var(--icon-s-stroke-width);
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="tag"] .tree-item:not(:hover) .tree-item-icon.collapse-icon svg.svg-icon,
+body:not(.file-icon-remove) .workspace-leaf-content:is([data-type="bookmarks"], [data-type="file-explorer"]) .tree-item-icon.collapse-icon svg.svg-icon {
+ color: transparent;
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="tag"] .tree-item:not(:hover) .tree-item-icon.collapse-icon,
+body:not(.file-icon-remove) .workspace-leaf-content:is([data-type="bookmarks"], [data-type="file-explorer"]) .tree-item-icon.collapse-icon {
+ background-color: currentColor;
+ opacity: var(--icon-opacity);
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="tag"] .tree-item-self:not(:has(>.tree-item-icon.collapse-icon)):before,
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] :is(.nav-file-title, .nav-folder.mod-root>.nav-folder-title)::before {
+ content: " ";
+ position: absolute;
+ margin-left: calc(-1 * var(--size-4-5));
+ width: var(--size-4-4);
+ height: var(--size-4-4);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ opacity: var(--icon-opacity);
+ background-color: currentColor;
+ flex: 0 0 auto;
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .nav-folder.mod-root>.nav-folder-title::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333'%3e%3cpath d='M14 12.8V3.2c0-.884-.264-1.2-1-1.2H3c-.736 0-1 .316-1 1.2v9.6c0 .884.264 1.2 1 1.2h10c.736 0 1-.316 1-1.2Z'/%3e%3cpath d='M9.978 7.04a2 2 0 1 1-3.956.587 2 2 0 0 1 3.956-.587ZM8 9.333v2m6-6.666h1m-1 6h1'/%3e%3c/g%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .tree-item-icon.collapse-icon,
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="bookmarks"] .tree-item-icon.collapse-icon {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333' d='M4 9.333 4.967 7.4a1.333 1.333 0 0 1 1.193-.733h7.173m0 0a1.333 1.333 0 0 1 1.294 1.666l-1.034 4a1.333 1.333 0 0 1-1.293 1H2.667A1.333 1.333 0 0 1 1.333 12V3.333C1.333 2.6 1.933 2 2.667 2h2.62a1.333 1.333 0 0 1 1.106.6l.547.8a1.333 1.333 0 0 0 1.107.6H12a1.333 1.333 0 0 1 1.333 1.333v1.334Z'/%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .is-collapsed .tree-item-icon.collapse-icon,
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="bookmarks"] .is-collapsed .tree-item-icon.collapse-icon {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333' d='M2.667 13.333h10.666A1.333 1.333 0 0 0 14.667 12V5.333A1.333 1.333 0 0 0 13.333 4H8.047a1.333 1.333 0 0 1-1.107-.6l-.547-.8A1.333 1.333 0 0 0 5.287 2h-2.62a1.333 1.333 0 0 0-1.334 1.333V12c0 .733.6 1.333 1.334 1.333Z'/%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .nav-file-title::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333'%3e%3cpath d='M9.667 1.333H4a1.333 1.333 0 0 0-1.333 1.334v10.666A1.333 1.333 0 0 0 4 14.667h8a1.333 1.333 0 0 0 1.333-1.334V5L9.667 1.333Z'/%3e%3cpath d='M9.333 1.333v4h4'/%3e%3c/g%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .nav-file-title[data-path$=".canvas"]::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333' d='M6 2H2.667A.667.667 0 0 0 2 2.667v4.666c0 .369.298.667.667.667H6a.667.667 0 0 0 .667-.667V2.667A.667.667 0 0 0 6 2Zm7.333 0H10a.667.667 0 0 0-.667.667v2c0 .368.299.666.667.666h3.333A.667.667 0 0 0 14 4.667v-2A.667.667 0 0 0 13.333 2Zm0 6H10a.667.667 0 0 0-.667.667v4.666c0 .368.299.667.667.667h3.333a.667.667 0 0 0 .667-.667V8.667A.667.667 0 0 0 13.333 8ZM6 10.667H2.667a.667.667 0 0 0-.667.666v2c0 .368.298.667.667.667H6a.667.667 0 0 0 .667-.667v-2A.667.667 0 0 0 6 10.667Z'/%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .is-unsupported.nav-file-title::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333'%3e%3cpath d='M9.667 1.333H4a1.333 1.333 0 0 0-1.333 1.334v10.666A1.333 1.333 0 0 0 4 14.667h8a1.333 1.333 0 0 0 1.333-1.334V5L9.667 1.333Z'/%3e%3cpath d='M6.667 6.867c.133-.267.333-.534.6-.667A1.4 1.4 0 0 1 9 6.467c.2.266.333.533.333.866C9.333 8.2 8 8.667 8 8.667m0 2.666h.007'/%3e%3c/g%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .is-unsupported.nav-file-title:is([data-path$=".zip"], [data-path$=".7z"])::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333'%3e%3cpath d='M2.667 14.667v-12c0-.334.133-.667.4-.934.266-.266.6-.4.933-.4h5.667L13.333 5v8.333c0 .334-.133.667-.4.934-.266.266-.6.4-.933.4h-1.333'/%3e%3cpath d='M9.333 1.333v4h4m-6.666 9.334a1.333 1.333 0 1 0 0-2.667 1.333 1.333 0 0 0 0 2.667Zm0-10V4m0 4v-.667m0 4.667v-1.333'/%3e%3c/g%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .nav-file-title[data-path$=".webm"]::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333'%3e%3cpath d='M2.667 14.667H12a1.333 1.333 0 0 0 1.333-1.334V5L9.667 1.333H4a1.333 1.333 0 0 0-1.333 1.334v2'/%3e%3cpath d='M9.333 1.333v4h4M4.667 6.667 2.667 8H1.333v2.667h1.334l2 1.333V6.667Zm2.666.666c.427.534.667 1.247.667 2 0 .754-.24 1.467-.667 2'/%3e%3c/g%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .nav-file-title:is([data-path$=".svg"], [data-path$=".bmp"], [data-path$=".jpeg"], [data-path$=".jpg"], [data-path$=".png"], [data-path$=".gif"])::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333'%3e%3cpath d='M12.667 2H3.333C2.597 2 2 2.597 2 3.333v9.334C2 13.403 2.597 14 3.333 14h9.334c.736 0 1.333-.597 1.333-1.333V3.333C14 2.597 13.403 2 12.667 2Z'/%3e%3cpath d='M6 7.333a1.333 1.333 0 1 0 0-2.666 1.333 1.333 0 0 0 0 2.666ZM14 10l-2.057-2.057a1.333 1.333 0 0 0-1.886 0L4 14'/%3e%3c/g%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .nav-file-title[data-path$=".pdf"]::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333'%3e%3cpath d='M9.667 1.333H4a1.333 1.333 0 0 0-1.333 1.334v10.666A1.333 1.333 0 0 0 4 14.667h8a1.333 1.333 0 0 0 1.333-1.334V5L9.667 1.333Z'/%3e%3cpath d='M9.333 1.333v4h4m-2.666 3.334H5.333m5.334 2.666H5.333M6.667 6H5.333'/%3e%3c/g%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="file-explorer"] .nav-file-title[data-path$=".excalidraw.md"]::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333' clip-path='url(%23a)'%3e%3cpath d='M8 12.667 12.667 8l2 2L10 14.667l-2-2Z'/%3e%3cpath d='m12 8.667-1-5-9.667-2.334L3.667 11l5 1L12 8.667ZM1.333 1.333l5.058 5.058'/%3e%3cpath d='M7.333 8.667a1.333 1.333 0 1 0 0-2.667 1.333 1.333 0 0 0 0 2.667Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h16v16H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="tag"] .tree-item:not(:hover) .tree-item-icon.collapse-icon {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333'%3e%3cpath d='M6 3.333H1.333V8l4.194 4.193a1.617 1.617 0 0 0 2.28 0l2.386-2.386a1.617 1.617 0 0 0 0-2.28L6 3.333ZM4 6.007V6'/%3e%3cpath d='m10 3.333 4.2 4.2a1.6 1.6 0 0 1 0 2.267l-2.867 2.867'/%3e%3c/g%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="tag"] .tree-item-self:not(:has(>.tree-item-icon.collapse-icon))::before {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg clip-path='url(%23a)'%3e%3cpath stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333' d='M8 1.333H1.333V8l6.194 6.193a1.617 1.617 0 0 0 2.28 0l4.386-4.386a1.617 1.617 0 0 0 0-2.28L8 1.333ZM4.667 4.667h.006'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h16v16H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+body:not(.file-icon-remove) .workspace-leaf-content[data-type="bookmarks"] svg.lucide-folder {
+ background-color: currentColor;
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.333'%3e%3cpath d='M1.333 6V3.333C1.333 2.6 1.933 2 2.667 2h2.62a1.333 1.333 0 0 1 1.106.6l.547.8a1.333 1.333 0 0 0 1.107.6h5.286a1.333 1.333 0 0 1 1.334 1.333V12a1.333 1.333 0 0 1-1.334 1.333h-12'/%3e%3cpath d='m5.333 10.667 2-2-2-2'/%3e%3cpath d='M1.333 10.667V10a1.333 1.333 0 0 1 1.334-1.333h4'/%3e%3c/g%3e%3c/svg%3e");
+}
+
+/*colorful folder icon*/
+
+body:not(.file-icon-remove) .nav-folder:nth-child(8n+2) {
+ --colorful-folder-color: var(--color-red);
+}
+
+body:not(.file-icon-remove) .nav-folder:nth-child(8n+3) {
+ --colorful-folder-color: var(--color-orange);
+}
+
+body:not(.file-icon-remove) .nav-folder:nth-child(8n+4) {
+ --colorful-folder-color: var(--color-yellow);
+}
+
+body:not(.file-icon-remove) .nav-folder:nth-child(8n+5) {
+ --colorful-folder-color: var(--color-green);
+}
+
+body:not(.file-icon-remove) .nav-folder:nth-child(8n+6) {
+ --colorful-folder-color: var(--color-cyan);
+}
+
+body:not(.file-icon-remove) .nav-folder:nth-child(8n+7) {
+ --colorful-folder-color: var(--color-blue);
+}
+
+body:not(.file-icon-remove) .nav-folder:nth-child(8n+8) {
+ --colorful-folder-color: var(--color-purple);
+}
+
+body:not(.file-icon-remove) .nav-folder:nth-child(8n+9) {
+ --colorful-folder-color: var(--color-pink);
+}
+
+body:not(.file-icon-remove).colorful-folder .workspace-leaf-content[data-type="file-explorer"] .tree-item-icon.collapse-icon {
+ background-color: var(--colorful-folder-color);
+}
+
+body:not(.file-icon-remove).colorful-folder .nav-folder.mod-root>.nav-folder-title::before {
+ background-color: currentColor;
+}
+
+
+/* vault profile */
+
+body:not(.is-mobile) .workspace-split.mod-left-split {
+ position: relative;
+}
+
+body:not(.is-mobile) .workspace-split.mod-left-split .workspace-tabs:last-of-type .workspace-tab-container {
+ padding-bottom: 44px;
+}
+
+body:not(.is-mobile) .workspace-split.mod-left-split .workspace-sidedock-vault-profile {
+ padding: 6px;
+ background-color: transparent;
+ position: absolute;
+ bottom: 0;
+ z-index: 10;
+ height: 44px;
+}
+
+body:not(.is-mobile) .workspace-split.mod-left-split .workspace-sidedock-vault-profile .workspace-drawer-vault-switcher {
+ height: 32px;
+}
+
+body:not(.is-mobile) .workspace-split.mod-left-split .workspace-sidedock-vault-profile .workspace-drawer-vault-actions {
+ gap: var(--size-2-1);
+}
+
+/*====== empty state ======*/
+
+body {
+ --empty-state-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22160%22%20height%3D%22160%22%20fill%3D%22none%22%20viewBox%3D%220%200%20160%20160%22%3E%3Cg%20fill%3D%22%23000%22%20clip-path%3D%22url(%23a)%22%20opacity%3D%22.75%22%3E%3Cpath%20fill-opacity%3D%22.25%22%20d%3D%22M38.66%20123.48C27.16%20112.55%2020%2097.11%2020%2080c0-5.18.66-10.2%201.89-15l16.77%2058.48Zm70.35%209.05C100.41%20137.29%2090.52%20140%2080%20140c-10.52%200-20.47-2.73-29.08-7.52l19.24-5.51c3%201.03%206.22%201.58%209.57%201.58%203.7%200%207.24-.68%2010.5-1.91l17.97%205.15.81.74Zm29.04-67.75-16.88%2058.86C132.76%20112.71%20140%2097.2%20140%2080c0-5.26-.68-10.36-1.95-15.22Zm-15.41-26.99-39.3-11.27a5.27%205.27%200%200%200-6.51%203.61l-1.34%204.68-8.94-4.95-29.78%208.54C47.68%2027.06%2063.02%2020%2080%2020c16.98%200%2031.77%206.8%2042.64%2017.79Z%22%2F%3E%3Cpath%20fill-opacity%3D%22.05%22%20d%3D%22m70.31%2052.88-.98%203.41-38.26%2010.97-.83-2.89%2040.07-11.49ZM58.37%2078.15a28.777%2028.777%200%200%200-3.3%204.07l-18.21%205.22-.83-2.88%2022.34-6.41Zm-7.78%2014.72c-.21%201.06-.37%202.15-.47%203.25l-9.96%202.86-.82-2.88%2011.25-3.23Zm.24-43.76-23.07%206.61-.83-2.88L50%2046.22l.83%202.89Zm4.9%2067.25-.06.02-9.72%202.79-.83-2.89%208.67-2.48.23-.07c.51.91%201.09%201.79%201.71%202.63Z%22%2F%3E%3Cpath%20fill-opacity%3D%22.15%22%20d%3D%22m72.71%2044.51-1.81.52-4.35-15.17-29.78%208.54-15.74%204.51a5.27%205.27%200%200%200-3.61%206.51L21.89%2065l16.77%2058.48%201.87%206.51c.8%202.79%203.71%204.41%206.5%203.61l3.89-1.12%2019.24-5.51a29.706%2029.706%200%200%201-14.43-10.61l-.06.02-9.72%202.79-.83-2.89%208.67-2.48.23-.07c-.15-.24-.29-.48-.43-.73A29.64%2029.64%200%200%201%2050%2098.82c0-.91.04-1.81.12-2.7l-9.96%202.86-.82-2.88%2011.25-3.23c.79-3.88%202.34-7.48%204.48-10.65l-18.21%205.22-.83-2.88%2022.34-6.41a29.14%2029.14%200%200%201%206.07-4.82l4.89-17.04-38.26%2010.97-.83-2.89%2040.07-11.49%202.4-8.37ZM27.76%2055.72l-.83-2.88L50%2046.22l.83%202.89-23.07%206.61Z%22%2F%3E%3Cpath%20fill-opacity%3D%22.1%22%20d%3D%22m108.2%20131.79-17.97-5.15c2.76-1.04%205.32-2.48%207.61-4.25l10.36%209.4ZM135.84%2058l-11.33-3.25%203.19-11.14%201.16-4.04-6.22-1.78-39.3-11.27a5.27%205.27%200%200%200-6.51%203.61l-1.34%204.68-2.78%209.7-2.4%208.37-.98%203.41-4.89%2017.04c4.47-2.69%209.7-4.24%2015.29-4.24s11.22%201.66%2015.79%204.55a28.65%2028.65%200%200%201%204.74%203.68l23.71%206.8-.82%202.89-19.27-5.52c2.3%203.17%203.97%206.81%204.85%2010.75l11.94%203.42-.83%202.88-10.55-3.03c.12%201.09.18%202.19.18%203.31%200%204.7-1.09%209.14-3.03%2013.09-.22.45-.45.89-.7%201.32l.67.19%208.47%202.43-.83%202.88-6.55-1.88%2010.53%209.55%201.87%201.69%201.27-4.45%2016.88-58.86%201.63-5.68-3.84-1.1ZM82.85%2038.89l.23-.82%2023.07%206.62-.82%202.88-18.83-5.4-2.81-.81-1.43-.41.59-2.06Zm46.09%2027.93L90.4%2055.77l-9.63-2.76-1.82-.52.65-2.27.18-.62%209.64%202.77%2040.34%2011.57-.82%202.88Z%22%2F%3E%3Cpath%20fill-opacity%3D%22.35%22%20d%3D%22m75.49%2034.81-2.78%209.7-1.81.52-4.35-15.17%208.94%204.95Z%22%2F%3E%3Cpath%20fill-opacity%3D%22.3%22%20d%3D%22m128.86%2039.57-1.16%204.03v.01l-3.19%2011.14L135.84%2058l3.84%201.1-10.82-19.53Z%22%2F%3E%3Cpath%20fill-opacity%3D%22.35%22%20d%3D%22m122.01%20130.01-7.12%207.85-5.88-5.33-.81-.74-10.36-9.4c1.83-1.39%203.49-3%204.94-4.79.46-.56.9-1.13%201.3-1.73.32-.43.61-.87.88-1.32l.79.71%201.75%201.59%2010.53%209.55%201.87%201.69%202.11%201.92Z%22%2F%3E%3Cpath%20fill-opacity%3D%22.35%22%20fill-rule%3D%22evenodd%22%20d%3D%22M109.29%2095.51c-.13-1.11-.31-2.2-.56-3.27-.88-3.94-2.55-7.58-4.85-10.75-1.07-1.51-2.28-2.9-3.62-4.17a28.65%2028.65%200%200%200-4.74-3.68c-4.57-2.89-9.99-4.55-15.79-4.55-5.8%200-10.82%201.55-15.29%204.24a29.14%2029.14%200%200%200-6.07%204.82%2028.777%2028.777%200%200%200-3.3%204.07%2029.564%2029.564%200%200%200-4.48%2010.65%2030.145%2030.145%200%200%200-.59%205.95c0%205.13%201.3%209.96%203.59%2014.17.14.26.28.5.43.74.51.91%201.09%201.79%201.71%202.63a29.706%2029.706%200%200%200%2014.43%2010.61c3%201.03%206.22%201.58%209.57%201.58%203.7%200%207.24-.68%2010.5-1.91%202.76-1.04%205.32-2.48%207.61-4.25%201.83-1.39%203.49-3%204.94-4.79.46-.56.9-1.13%201.3-1.73.32-.43.61-.87.88-1.32.28-.43.54-.87.78-1.32.25-.43.48-.87.7-1.32%201.94-3.95%203.03-8.39%203.03-13.09%200-1.12-.06-2.22-.18-3.31Zm-4.98%208.78a24.97%2024.97%200%200%201-4.91%2010.24c-.31.4-.63.78-.97%201.15-.02.02-.04.05-.06.07-.27.3-.55.59-.83.87-.29.28-.58.56-.88.83-.59.55-1.21%201.06-1.86%201.54-.65.49-1.32.94-2.01%201.36l-.42.24s-.01.01-.02.01c-.55.33-1.12.63-1.7.91-1.1.53-2.25.98-3.43%201.35-2.01.62-4.14%201-6.33%201.1-.1.01-.19.01-.29.01-.29.02-.58.02-.87.02-2.61%200-5.12-.4-7.48-1.13a24.94%2024.94%200%200%201-5.57-2.51c-.21-.13-.43-.27-.64-.4-.21-.13-.41-.27-.62-.42-.26-.17-.5-.35-.75-.54-.65-.48-1.27-.99-1.86-1.54-.84-.76-1.62-1.57-2.35-2.44-.69-.81-1.32-1.68-1.9-2.58a25.1%2025.1%200%200%201-3.22-7.35c-.51-2-.78-4.1-.78-6.26%200-1.38.11-2.74.33-4.06.18-1.15.44-2.26.78-3.34%201.28-4.17%203.61-7.87%206.68-10.8.26-.26.52-.5.79-.71a24.966%2024.966%200%200%201%2016.59-6.26c1.39%200%202.74.11%204.07.33%204.28.69%208.2%202.47%2011.46%205.04.85.65%201.66%201.37%202.42%202.14%202.63%202.68%204.68%205.95%205.9%209.6.38%201.09.68%202.21.89%203.37a25.259%2025.259%200%200%201-.16%2010.16Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3Cpath%20fill-opacity%3D%22.05%22%20fill-rule%3D%22evenodd%22%20d%3D%22M104.47%2094.13c-.21-1.16-.51-2.28-.89-3.37a25.082%2025.082%200%200%200-5.9-9.6c-.76-.77-1.57-1.49-2.42-2.14a24.907%2024.907%200%200%200-11.46-5.04c-1.33-.22-2.68-.33-4.07-.33a24.966%2024.966%200%200%200-16.59%206.26c-.27.21-.53.45-.79.71-3.07%202.93-5.4%206.63-6.68%2010.8-.34%201.08-.6%202.19-.78%203.34-.22%201.32-.33%202.68-.33%204.06%200%202.16.27%204.26.78%206.26a25.1%2025.1%200%200%200%203.22%207.35c.58.9%201.21%201.77%201.9%202.58.73.87%201.51%201.68%202.35%202.44.59.55%201.21%201.06%201.86%201.54.25.19.49.37.75.54.21.15.41.29.62.42.21.13.43.27.64.4a24.94%2024.94%200%200%200%205.57%202.51c2.36.73%204.87%201.13%207.48%201.13.29%200%20.58%200%20.87-.02.1%200%20.19%200%20.29-.01%202.19-.1%204.32-.48%206.33-1.1%201.18-.37%202.33-.82%203.43-1.35.58-.28%201.15-.58%201.7-.91.01%200%20.02%200%20.02-.01l.42-.24c.69-.42%201.36-.87%202.01-1.36.65-.48%201.27-.99%201.86-1.54.3-.27.59-.55.88-.83.28-.28.56-.57.83-.87.02-.02.04-.05.06-.07.34-.37.66-.75.97-1.15.66-.82%201.27-1.68%201.83-2.59a25.174%2025.174%200%200%200%203.68-13.12c0-1.6-.15-3.17-.44-4.69Zm-14.69%209.35h.01l2.41%202.42.14.14c.64.72.98%201.65.95%202.61-.01.33-.06.65-.16.96-.17.6-.49%201.14-.94%201.59-.39.39-.86.69-1.37.87-.37.15-.77.23-1.18.24-.96.03-1.89-.3-2.61-.94l-.54-.54-2.56-2.56-1.83-1.82-2.29-2.29-1.27%201.27-1.78%201.78-.64.64-3.52%203.52c-.08.08-.16.16-.24.22-.3.27-.63.48-.99.64-.46.21-.96.32-1.46.32-.23%200-.46%200-.69-.06h-.02c-.26-.04-.51-.11-.76-.21a3.796%203.796%200%200%201-2.08-2.08c-.19-.48-.28-.97-.28-1.47.01-.51.12-1%20.32-1.47.2-.46.5-.87.86-1.22l.56-.56%202.43-2.43%204.23-4.23-7.22-7.21c-.1-.1-.2-.2-.29-.31-.23-.28-.43-.58-.57-.91-.2-.47-.31-.96-.32-1.47%200-.17.01-.34.04-.5.03-.33.11-.66.24-.97.19-.47.47-.89.83-1.25.35-.36.78-.64%201.25-.83.46-.19.96-.28%201.47-.27.5%200%201%20.11%201.46.31.46.21.88.5%201.23.87l.22.22%202.42%202.42%204.56%204.57%205-5%202.21-2.21c.08-.07.16-.14.24-.2.68-.56%201.53-.85%202.4-.83.99.01%201.92.41%202.62%201.1.4.41.7.89.88%201.42.13.38.21.79.21%201.2a3.7%203.7%200%200%201-1.03%202.64l-7.2%207.21%204.64%204.66h.01Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3Cpath%20fill-opacity%3D%22.5%22%20fill-rule%3D%22evenodd%22%20d%3D%22M92.34%20106.04c.64.72.98%201.65.95%202.61-.01.33-.06.65-.16.96-.17.6-.49%201.14-.94%201.59-.39.39-.86.69-1.37.87-.37.15-.77.23-1.18.24-.96.03-1.89-.3-2.61-.94l-.54-.54-2.56-2.56-1.83-1.82-2.29-2.29-1.27%201.27-1.78%201.78-.64.64-3.52%203.52c-.08.08-.16.16-.24.22-.3.27-.63.48-.99.64-.46.21-.96.32-1.46.32-.23%200-.46%200-.69-.06h-.02c-.26-.04-.51-.11-.76-.21a3.796%203.796%200%200%201-2.08-2.08c-.19-.48-.28-.97-.28-1.47.01-.51.12-1%20.32-1.47.2-.46.5-.87.86-1.22l.56-.56%202.43-2.43%204.23-4.23-7.22-7.21c-.1-.1-.2-.2-.29-.31-.23-.28-.43-.58-.57-.91-.2-.47-.31-.96-.32-1.47%200-.17.01-.34.04-.5.03-.33.11-.66.24-.97.19-.47.47-.89.83-1.25.35-.36.78-.64%201.25-.83.46-.19.96-.28%201.47-.27.5%200%201%20.11%201.46.31.46.21.88.5%201.23.87l.22.22%202.42%202.42%204.56%204.57%205-5%202.21-2.21c.08-.07.16-.14.24-.2.68-.56%201.53-.85%202.4-.83.99.01%201.92.41%202.62%201.1.4.41.7.89.88%201.42.13.38.21.79.21%201.2a3.7%203.7%200%200%201-1.03%202.64l-7.2%207.21%204.64%204.66h.01l2.41%202.42.14.14h.01Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3Cpath%20fill-opacity%3D%22.35%22%20d%3D%22M124.81%20134.66c.07%201.4-.42%202.77-1.36%203.81a5.29%205.29%200%200%201-3.67%201.73c-1.4.07-2.78-.42-3.82-1.36l-1.07-.98%207.12-7.84%201.07.97c1.04.94%201.66%202.26%201.73%203.67Z%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22a%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M0%200h160v160H0z%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E");
+}
+
+.tag-pane-empty,
+.bookmarks-pane-empty,
+.workspace-leaf-content[data-type=outline] .pane-empty,
+.search-empty-state {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ gap: 8px;
+ padding-left: 0px;
+}
+
+.tag-pane-empty::before,
+.bookmarks-pane-empty::before,
+.workspace-leaf-content[data-type=outline] .pane-empty::before,
+.search-empty-state::before {
+ content: "";
+ display: inline-block;
+ width: 160px;
+ height: 160px;
+ background-color: var(--icon-color);
+ -webkit-mask-size: contain;
+ -webkit-mask-position: center;
+ -webkit-mask-repeat: no-repeat;
+ -webkit-mask-image: var(--empty-state-image);
+}
+
+
+/*====== setting modal ======*/
+
+body {
+ --modal-border-color: var(--background-modifier-border);
+}
+
+.settings-search-container.vertical-tab-header-group {
+ padding-top: 2px;
+}
+
+body:not(.setting-item-title-icon-remove):not(.is-phone) .vertical-tab-header-group .vertical-tab-header-group-title {
+ display: flex;
+ align-items: center;
+}
+
+body:not(.setting-item-title-icon-remove):not(.is-phone) .vertical-tab-header-group:nth-last-of-type(3) .vertical-tab-header-group-title::before {
+ content: " ";
+ width: 16px;
+ height: 16px;
+ background-color: currentColor;
+ margin-right: 4px;
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg clip-path='url(%23a)'%3e%3cpath fill='black' d='m14.476 6.987-1.49-.445a5.177 5.177 0 0 0-.422-1.035l.73-1.365a.27.27 0 0 0-.05-.32l-1.062-1.066a.271.271 0 0 0-.32-.05l-1.355.725a5.165 5.165 0 0 0-1.05-.444l-.444-1.471a.271.271 0 0 0-.262-.183H7.25a.271.271 0 0 0-.258.191l-.444 1.467a5.169 5.169 0 0 0-1.058.445l-1.333-.72a.271.271 0 0 0-.32.048l-1.08 1.054a.271.271 0 0 0-.05.32l.72 1.333a5.169 5.169 0 0 0-.444 1.053l-1.47.445a.271.271 0 0 0-.192.258v1.502a.271.271 0 0 0 .191.258l1.48.444c.11.36.26.708.445 1.036l-.73 1.395a.271.271 0 0 0 .05.32l1.062 1.062a.271.271 0 0 0 .32.05l1.373-.734a5.25 5.25 0 0 0 1.022.418l.445 1.498a.27.27 0 0 0 .258.19h1.502a.271.271 0 0 0 .258-.19l.444-1.503a5.17 5.17 0 0 0 1.013-.417l1.383.737a.27.27 0 0 0 .32-.049l1.062-1.062a.27.27 0 0 0 .049-.32l-.738-1.378a5.17 5.17 0 0 0 .422-1.017l1.498-.445a.271.271 0 0 0 .191-.258V7.25a.271.271 0 0 0-.164-.262ZM8 10.444a2.444 2.444 0 1 1 0-4.888 2.444 2.444 0 0 1 0 4.888Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h16v16H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+body:not(.setting-item-title-icon-remove):not(.is-phone) .vertical-tab-header-group:nth-last-of-type(2) .vertical-tab-header-group-title::before {
+ content: " ";
+ width: 16px;
+ height: 16px;
+ background-color: currentColor;
+ margin-right: 4px;
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg clip-path='url(%23a)'%3e%3cpath fill='black' d='M13.249 7.111h-.36V3.924A.889.889 0 0 0 12 3.036H9.333A2.284 2.284 0 0 0 7.338.889a2.222 2.222 0 0 0-2.45 2.147h-3.11a.889.889 0 0 0-.89.888v3.632h1.25A1.391 1.391 0 0 1 3.556 8.75a1.333 1.333 0 0 1-.347 1.027 1.334 1.334 0 0 1-.987.444H.89v3.925a.889.889 0 0 0 .889.889H12a.889.889 0 0 0 .889-.89v-2.59h.444a2.223 2.223 0 0 0 2.223-2.45 2.29 2.29 0 0 0-2.307-1.995Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h16v16H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+body:not(.setting-item-title-icon-remove):not(.is-phone) .vertical-tab-header-group:nth-last-of-type(1) .vertical-tab-header-group-title::before {
+ content: " ";
+ width: 16px;
+ height: 16px;
+ background-color: currentColor;
+ margin-right: 4px;
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg fill='black' clip-path='url(%23a)'%3e%3cpath d='M13.249 7.111h-.36v-.267H9.88a1.636 1.636 0 0 1-1.436-2.448l.89-1.467A2.276 2.276 0 0 0 7.337.889a2.222 2.222 0 0 0-2.45 2.147h-3.11a.889.889 0 0 0-.89.888v3.632h1.25A1.391 1.391 0 0 1 3.556 8.75a1.333 1.333 0 0 1-.347 1.027 1.334 1.334 0 0 1-.987.444H.89v3.925a.889.889 0 0 0 .889.889H12a.889.889 0 0 0 .889-.89v-2.59h.444a2.223 2.223 0 0 0 2.223-2.45 2.29 2.29 0 0 0-2.307-1.995Z'/%3e%3cpath d='M11.933.507 9.391 4.889a.569.569 0 0 0 .489.889h5.089a.569.569 0 0 0 .489-.89L12.916.508a.57.57 0 0 0-.983 0Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h16v16H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+
+/* ====== UI Components====== */
+.theme-light {
+ --toggle-thumb-color: var(--toggle-thumb-color-light);
+ --toggle-thumb-enabled-color: var(--toggle-thumb-enabled-color-light);
+ --toggle-thumb-color-light: white;
+ --toggle-thumb-enabled-color-light: white;
+
+ --toggle-thumb-shadow: var(--toggle-thumb-shadow-light);
+ --toggle-thumb-enabled-shadow: var(--toggle-thumb-enabled-shadow-light);
+ --toggle-thumb-shadow-light: 0px 4px 4px rgba(0, 0, 0, 0.05), 0px 1px 2px rgba(0, 0, 0, 0.3), inset 0px -1px 1px rgba(255, 255, 255, 0.4), inset 0px -4px 4px rgba(0, 0, 0, 0.1);
+ --toggle-thumb-enabled-shadow-light: 0px 4px 4px rgba(0, 0, 0, 0.05), 0px 1px 2px rgba(0, 0, 0, 0.3), inset 0px -1px 1px rgba(255, 255, 255, 0.4), inset 0px -4px 4px hsla(var(--interactive-accent-hsl), 0.3);
+
+ --toggle-track-color: var(--toggle-track-color-light);
+ --toggle-track-enabled-color: var(--toggle-track-enabled-color-light);
+ --toggle-track-color-light: var(--background-modifier-border-hover);
+ --toggle-track-enabled-color-light: var(--interactive-accent);
+
+ --toggle-track-shadow: var(--toggle-track-shadow-light);
+ --toggle-track-hovered-shadow: var(--toggle-track-hovered-shadow-light);
+ --toggle-track-shadow-light: inset 0px 1px 2px rgba(0, 0, 0, 0.25), 0px 1px 0px var(--background-primary), 0px 2px 4px rgba(0, 0, 0, 0.04);
+ --toggle-track-hovered-shadow-light: inset 0px 1px 2px rgba(0, 0, 0, 0.25), 0px 1px 0px var(--background-primary), 0px 2px 4px rgba(0, 0, 0, 0.04);
+
+ --interactive-normal: var(--color-base-05);
+ --interactive-hover: var(--color-base-15);
+
+ --input-radius: var(--input-radius-light);
+ --input-shadow: var(--input-shadow-light);
+ --input-shadow-hover: var(--input-shadow-hover-light);
+
+ --input-radius-light: 5px;
+ --input-shadow-light: 0px 4px 8px -4px rgba(0, 0, 0, 0.16), inset 0px -1px 0px rgba(0, 0, 0, 0.04), inset 0px 0px 0px 1px rgba(0, 0, 0, 0.12), inset 0px 2px 0.75px rgba(255, 255, 255, 0.24), inset 0px -3px 0.75px rgba(0, 0, 0, 0.04);
+ --input-shadow-hover-light: 0px 4px 8px -4px rgba(0, 0, 0, 0.16), inset 0px -1px 0px rgba(0, 0, 0, 0.04), inset 0px 0px 0px 1px rgba(0, 0, 0, 0.12), inset 0px 2px 0.75px rgba(255, 255, 255, 0.24), inset 0px -3px 0.75px rgba(0, 0, 0, 0.04);
+}
+
+.theme-dark {
+ --toggle-thumb-color: var(--toggle-thumb-color-dark);
+ --toggle-thumb-enabled-color: var(--toggle-thumb-enabled-color-dark);
+ --toggle-thumb-color-dark: white;
+ --toggle-thumb-enabled-color-dark: white;
+
+ --toggle-thumb-shadow: var(--toggle-thumb-shadow-dark);
+ --toggle-thumb-enabled-shadow: var(--toggle-thumb-enabled-shadow-dark);
+ --toggle-thumb-shadow-dark: 0px 4px 4px rgba(0, 0, 0, 0.3), 0px 1px 2px rgba(0, 0, 0, 0.6), inset 0px -1px 1px rgba(255, 255, 255, 0.4), inset 0px -4px 6px rgba(0, 0, 0, 0.25), inset 0px 4px 4px #FFFFFF;
+ --toggle-thumb-enabled-shadow-dark: 0px 4px 4px rgba(0, 0, 0, 0.1), 0px 1px 2px rgba(0, 0, 0, 0.3), inset 0px -1px 1px rgba(255, 255, 255, 0.4), inset 0px -4px 6px hsla(var(--interactive-accent-hsl), 0.5), inset 0px 4px 4px #FFFFFF;
+
+ --toggle-track-color: var(--toggle-track-color-dark);
+ --toggle-track-enabled-color: var(--toggle-track-enabled-color-dark);
+ --toggle-track-color-dark: var(--background-modifier-border-hover);
+ --toggle-track-enabled-color-dark: var(--interactive-accent);
+
+ --toggle-track-shadow: var(--toggle-track-shadow-dark);
+ --toggle-track-hovered-shadow: var(--toggle-track-hovered-shadow-dark);
+ --toggle-track-shadow-dark: inset 0px -1px 2px rgba(0, 0, 0, 0.2), inset 0px 2px 4px rgba(0, 0, 0, 0.4), 0px 0px 0px 1px var(--background-modifier-border);
+ --toggle-track-hovered-shadow-dark: inset 0px -1px 2px rgba(0, 0, 0, 0.2), inset 0px 2px 4px rgba(0, 0, 0, 0.4), 0px 0px 0px 1px var(--background-modifier-border);
+
+ --interactive-normal: hsl(var(--accent-h),
+ calc(var(--accent-s) / 7),
+ calc(1.25*var(--accent-l) / 3));
+ --interactive-hover: hsl(var(--accent-h),
+ calc(var(--accent-s) / 7),
+ calc(1.25*var(--accent-l) / 2.7));
+
+ --input-radius: var(--input-radius-dark);
+ --input-shadow: var(--input-shadow-dark);
+ --input-shadow-hover: var(--input-shadow-hover-dark);
+
+ --input-radius-dark: 5px;
+ --input-shadow-dark: 0px 4px 8px -4px rgba(0, 0, 0, 0.32), 0px 1px 2px rgba(0, 0, 0, 0.32), 0px 0px 0px 1px rgba(0, 0, 0, 0.32), 0px 0px 1px 1px rgba(0, 0, 0, 0.12), inset 0px 1px 0.75px rgba(255, 255, 255, 0.16), inset 0px -2px 0.75px rgba(0, 0, 0, 0.16);
+ --input-shadow-hover-dark: 0px 4px 8px -4px rgba(0, 0, 0, 0.32), 0px 1px 2px rgba(0, 0, 0, 0.32), 0px 0px 0px 1px rgba(0, 0, 0, 0.32), 0px 0px 1px 1px rgba(0, 0, 0, 0.12), inset 0px 1px 0.75px rgba(255, 255, 255, 0.16), inset 0px -2px 0.75px rgba(0, 0, 0, 0.16);
+}
+
+.theme-light.is-mobile,
+.theme-dark.is-mobile {
+ --input-shadow: none;
+ --input-shadow-hover: none;
+}
+
+/* Range slider */
+input[type='range']::-webkit-slider-thumb {
+ box-shadow: var(--toggle-thumb-shadow);
+ transition: none;
+}
+
+input[type=range]::-webkit-slider-thumb:is(:hover, :active) {
+ box-shadow: var(--toggle-thumb-shadow);
+ outline-offset: 2px;
+ outline: 2px solid var(--background-modifier-border-hover);
+ transition: none;
+ border-color: var(--slider-thumb-border-color);
+}
+
+body:not(.is-mobile) input[type=range]:is(:focus, :focus-visible)::-webkit-slider-thumb {
+ box-shadow: var(--toggle-thumb-shadow);
+ outline-offset: 2px;
+ outline: 2px solid var(--background-modifier-border-focus);
+ transition: none;
+ border-color: var(--slider-thumb-border-color);
+}
+
+/* input */
+
+body:not(.is-mobile) textarea:not([class]):is(:focus, :focus-visible),
+body:not(.is-mobile) input[type='text']:not([class]):is(:focus, :focus-visible),
+body:not(.is-mobile) input[type='search']:not([class]):is(:focus, :focus-visible),
+body:not(.is-mobile) input[type='email']:not([class]):is(:focus, :focus-visible),
+body:not(.is-mobile) input[type='password']:not([class]):is(:focus, :focus-visible),
+body:not(.is-mobile) input[type='number']:not([class]):is(:focus, :focus-visible) {
+ border: 1px solid var(--interactive-accent);
+ box-shadow: 0 0 0 4px var(--background-modifier-active-hover);
+}
+
+.view-header input,
+body:not(.is-mobile) input.prompt-input {
+ border: none !important;
+ box-shadow: none !important;
+}
+
+body:not(.is-phone) div:has(>input.prompt-input) {
+ border-bottom: 2px solid var(--color-accent) !important;
+}
+
+.kanban-plugin__lane-input>textarea,
+.kanban-plugin__grow-wrap>textarea {
+ --background-modifier-form-field: transparent;
+}
+
+/* dropdown */
+
+select,
+.dropdown {
+ cursor: pointer;
+}
+
+/*toggle switch*/
+
+/*track*/
+
+.checkbox-container {
+ background-color: var(--toggle-track-color);
+ box-shadow: var(--toggle-track-shadow);
+}
+
+.checkbox-container.is-enabled {
+ background-color: var(--toggle-track-enabled-color);
+}
+
+@media (hover: hover) {
+ .checkbox-container:hover {
+ box-shadow: var(--toggle-track-hovered-shadow);
+ }
+}
+
+/*thumb*/
+
+.checkbox-container:after {
+ background-color: var(--toggle-thumb-color);
+ box-shadow: var(--toggle-thumb-shadow);
+}
+
+.checkbox-container.is-enabled:after {
+ background-color: var(--toggle-thumb-enabled-color);
+ box-shadow: var(--toggle-thumb-enabled-shadow);
+}
+
+body {
+ /* Buttons */
+ --button-radius: var(--input-radius);
+}
+
+
+/* container */
+.modal.mod-canvas-help,
+.suggestion-container,
+.popover,
+.prompt,
+.menu,
+.suggestion-container.mod-search-suggestion {
+ background-color: var(--workspace-background-translucent);
+ backdrop-filter: blur(12px) saturate(190%) contrast(50%) brightness(130%);
+ -webkit-backdrop-filter: blur(12px) saturate(190%) contrast(50%) brightness(130%);
+}
+
+.theme-dark .modal.mod-canvas-help,
+.theme-dark .suggestion-container,
+.theme-dark .popover,
+.theme-dark.is-mobile .prompt,
+.theme-dark .prompt,
+.theme-dark .menu,
+.theme-dark .suggestion-container.mod-search-suggestion {
+ background-color: var(--workspace-background-translucent);
+ backdrop-filter: blur(10px) saturate(190%) contrast(70%) brightness(80%);
+ -webkit-backdrop-filter: blur(10px) saturate(190%) contrast(70%) brightness(80%);
+}
+
+.suggestion-container.mod-search-suggestion .suggestion {
+ background-color: transparent;
+}
+
+.prompt-instructions {
+ border-top: 1px solid var(--divider-color);
+}
+
+input.prompt-input {
+ background-color: transparent !important;
+}
+
+/* notice */
+.notice-container {
+ top: 34px;
+ padding-right: 16px;
+}
+
+.tab-autohide .notice-container {
+ top: 6px;
+}
+
+/* Prompts */
+
+body {
+ --prompt-border-color: var(--background-modifier-border);
+}
+
+/* ====== editor ====== */
+/* Paragraphs */
+
+body.p-spacing-br :is(.markdown-preview-view, .markdown-rendered) p>br {
+ content: " ";
+ margin-top: var(--p-spacing);
+ display: block;
+}
+
+.markdown-source-view.mod-cm6 .cm-content>div:first-of-type {
+ padding-top: 0 !important;
+}
+
+/* line-height */
+body {
+ --line-height-normal: 1.5;
+ --line-height-tight: 1.3;
+ --line-height-customize: var(--line-height-normal);
+}
+
+.markdown-preview-view,
+.markdown-source-view.mod-cm6 .cm-scroller {
+ line-height: var(--line-height-customize);
+}
+
+/* justify text */
+body.text-align-justify .markdown-source-view.mod-cm6 .cm-line,
+body.text-align-justify .markdown-preview-view p {
+ text-align: justify;
+ text-justify: auto;
+}
+
+
+/* ====== title style ====== */
+body {
+ /* Inline title */
+ --inline-title-color: var(--h1-color);
+ --inline-title-font: var(--h1-font);
+ --inline-title-line-height: var(--h1-line-height);
+ --inline-title-size: var(--h1-size);
+ --inline-title-style: var(--h1-style);
+ --inline-title-variant: var(--h1-variant);
+ --inline-title-weight: var(--h1-weight);
+ /* Headings */
+ --heading-formatting: var(--text-faint);
+ --h1-color: inherit;
+ --h2-color: inherit;
+ --h3-color: inherit;
+ --h4-color: inherit;
+ --h5-color: inherit;
+ --h6-color: inherit;
+ --h1-accent-color: var(--color-red);
+ --h2-accent-color: var(--color-orange);
+ --h3-accent-color: var(--color-yellow);
+ --h4-accent-color: var(--color-green);
+ --h5-accent-color: var(--color-blue);
+ --h6-accent-color: var(--color-purple);
+ --h1-font: inherit;
+ --h2-font: inherit;
+ --h3-font: inherit;
+ --h4-font: inherit;
+ --h5-font: inherit;
+ --h6-font: inherit;
+ --h1-line-height: 1.2;
+ --h2-line-height: 1.2;
+ --h3-line-height: 1.3;
+ --h4-line-height: 1.4;
+ --h5-line-height: var(--line-height-normal);
+ --h6-line-height: var(--line-height-normal);
+ --h1-size: 1.5em;
+ --h2-size: 1.425em;
+ --h3-size: 1.35em;
+ --h4-size: 1.275em;
+ --h5-size: 1.2em;
+ --h6-size: 1.125em;
+ --h1-style: normal;
+ --h2-style: normal;
+ --h3-style: normal;
+ --h4-style: normal;
+ --h5-style: normal;
+ --h6-style: normal;
+ --h1-variant: normal;
+ --h2-variant: normal;
+ --h3-variant: normal;
+ --h4-variant: normal;
+ --h5-variant: normal;
+ --h6-variant: normal;
+ --h1-weight: 700;
+ --h2-weight: 675;
+ --h3-weight: 650;
+ --h4-weight: 625;
+ --h5-weight: 600;
+ --h6-weight: 575;
+}
+
+body {
+ /* Extra */
+ --inline-title-text-transform: var(--h1-text-transform);
+ --h1-text-transform: unset;
+ --h2-text-transform: unset;
+ --h3-text-transform: unset;
+ --h4-text-transform: unset;
+ --h5-text-transform: unset;
+ --h6-text-transform: unset;
+}
+
+.inline-title {
+ text-transform: var(--inline-title-text-transform);
+}
+
+body:not(.inline-title-divider-remove) .inline-title:not(.mk-inline-title) {
+ border-bottom: 1px solid var(--divider-color);
+ padding-bottom: var(--size-4-3);
+ margin-bottom: var(--size-4-3);
+}
+
+.embedded-backlinks {
+ border-top: 1px solid var(--divider-color);
+}
+
+.markdown-rendered>:is(h1, h2, h3, h4, h5, h6),
+.markdown-preview-sizer>div>:is(h1, h2, h3, h4, h5, h6) {
+ position: relative;
+}
+
+body:not(.heading-indicator-off) .markdown-preview-view .heading-collapse-indicator,
+body:not(.heading-indicator-off) .is-live-preview .HyperMD-header .collapse-indicator.collapse-icon {
+ transform: translateX(-8px);
+}
+
+body:not(.heading-indicator-off) .markdown-rendered>:is(h1, h2, h3, h4, h5, h6),
+body:not(.heading-indicator-off) .markdown-preview-sizer>div>:is(h1, h2, h3, h4, h5, h6) {
+ text-indent: 9px;
+}
+
+@media print {
+ :is(h1, h2, h3, h4, h5, h6) {
+ position: relative;
+ }
+
+ body:not(.heading-indicator-off) :is(h1, h2, h3, h4, h5, h6) {
+ text-indent: 9px;
+ }
+}
+
+/* h1 */
+h1,
+.markdown-rendered h1,
+.HyperMD-header-1,
+.inline-title[data-level='1'],
+.HyperMD-list-line .cm-header-1 {
+ text-transform: var(--h1-text-transform);
+}
+
+.h1-color-designated {
+ --h1-color: var(--h1-accent-color) !important;
+}
+
+body:not(.heading-indicator-off) .is-live-preview .HyperMD-header-1::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h1-accent-color);
+ transform: translateY(4px);
+}
+
+body:not(.heading-indicator-off) .markdown-rendered>h1::before,
+body:not(.heading-indicator-off) .markdown-preview-sizer>div>h1::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h1-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+}
+
+
+body.h1-divider-on :is(.markdown-preview-sizer>div>h1, .markdown-rendered>h1, .HyperMD-header-1)::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h1-accent-color) 30%, transparent 70%);
+}
+
+@media print {
+ body:not(.heading-indicator-off) h1::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h1-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+ }
+
+ body.h1-divider-on h1::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h1-accent-color) 30%, transparent 70%);
+ }
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-1 .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) h1 .collapse-indicator.collapse-icon svg {
+ transform: translateX(0px);
+ background-color: currentColor;
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ')
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-1 .is-collapsed .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) .is-collapsed h1 .collapse-indicator.collapse-icon svg {
+ background-color: var(--h1-accent-color);
+ color: var(--h1-accent-color);
+}
+
+h2,
+.markdown-rendered h2,
+.HyperMD-header-2,
+.inline-title[data-level='2'],
+.HyperMD-list-line .cm-header-2 {
+ text-transform: var(--h2-text-transform);
+}
+
+.h2-color-designated {
+ --h2-color: var(--h2-accent-color) !important;
+}
+
+body:not(.heading-indicator-off) .is-live-preview .HyperMD-header-2::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h2-accent-color);
+ transform: translateY(4px);
+}
+
+body:not(.heading-indicator-off) .markdown-rendered>h2::before,
+body:not(.heading-indicator-off) .markdown-preview-sizer>div>h2::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h2-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+}
+
+
+body.h2-divider-on :is(.markdown-preview-sizer>div>h2, .markdown-rendered>h2, .HyperMD-header-2)::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h2-accent-color) 30%, transparent 70%);
+}
+
+@media print {
+ body:not(.heading-indicator-off) h2::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h2-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+ }
+
+ body.h2-divider-on h2::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h2-accent-color) 30%, transparent 70%);
+ }
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-2 .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) h2 .collapse-indicator.collapse-icon svg {
+ transform: translateX(0px);
+ background-color: currentColor;
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ')
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-2 .is-collapsed .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) .is-collapsed h2 .collapse-indicator.collapse-icon svg {
+ background-color: var(--h2-accent-color);
+ color: var(--h2-accent-color);
+}
+
+h3,
+.markdown-rendered h3,
+.HyperMD-header-3,
+.inline-title[data-level='3'],
+.HyperMD-list-line .cm-header-3 {
+ text-transform: var(--h3-text-transform);
+}
+
+.h3-color-designated {
+ --h3-color: var(--h3-accent-color) !important;
+}
+
+body:not(.heading-indicator-off) .is-live-preview .HyperMD-header-3::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.3em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h3-accent-color);
+ transform: translateY(4px);
+}
+
+body:not(.heading-indicator-off) .markdown-rendered>h3::before,
+body:not(.heading-indicator-off) .markdown-preview-sizer>div>h3::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.3em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h3-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+}
+
+body.h3-divider-on :is(.markdown-preview-sizer>div>h3, .markdown-rendered>h3, .HyperMD-header-3)::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h3-accent-color) 30%, transparent 70%);
+}
+
+@media print {
+ body:not(.heading-indicator-off) h3::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h3-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+ }
+
+ body.h3-divider-on h3::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h3-accent-color) 30%, transparent 70%);
+ }
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-3 .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) h3 .collapse-indicator.collapse-icon svg {
+ transform: translateX(0px);
+ background-color: currentColor;
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ')
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-3 .is-collapsed .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) .is-collapsed h3 .collapse-indicator.collapse-icon svg {
+ background-color: var(--h3-accent-color);
+ color: var(--h3-accent-color);
+}
+
+h4,
+.markdown-rendered h4,
+.HyperMD-header-4,
+.inline-title[data-level='4'],
+.HyperMD-list-line .cm-header-4 {
+ text-transform: var(--h4-text-transform);
+}
+
+.h4-color-designated {
+ --h4-color: var(--h4-accent-color) !important;
+}
+
+body:not(.heading-indicator-off) .is-live-preview .HyperMD-header-4::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.4em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h4-accent-color);
+ transform: translateY(4px);
+}
+
+body:not(.heading-indicator-off) .markdown-rendered>h4::before,
+body:not(.heading-indicator-off) .markdown-preview-sizer>div>h4::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.4em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h4-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+}
+
+
+body.h4-divider-on :is(.markdown-rendered>h4, .markdown-preview-sizer>div>h4, .HyperMD-header-4)::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h4-accent-color) 30%, transparent 70%);
+}
+
+@media print {
+ body:not(.heading-indicator-off) h4::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h4-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+ }
+
+ body.h4-divider-on h4::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h4-accent-color) 30%, transparent 70%);
+ }
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-4 .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) h4 .collapse-indicator.collapse-icon svg {
+ transform: translateX(0px);
+ background-color: currentColor;
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ')
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-4 .is-collapsed .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) .is-collapsed h4 .collapse-indicator.collapse-icon svg {
+ background-color: var(--h4-accent-color);
+ color: var(--h4-accent-color);
+}
+
+h5,
+.markdown-rendered h5,
+.HyperMD-header-5,
+.inline-title[data-level='5'],
+.HyperMD-list-line .cm-header-5 {
+ text-transform: var(--h5-text-transform);
+}
+
+.h5-color-designated {
+ --h5-color: var(--h5-accent-color) !important;
+}
+
+body:not(.heading-indicator-off) .is-live-preview .HyperMD-header-5::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.5em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h5-accent-color);
+ transform: translateY(4px);
+}
+
+body:not(.heading-indicator-off) .markdown-rendered>h5::before,
+body:not(.heading-indicator-off) .markdown-preview-sizer>div>h5::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.5em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h5-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+}
+
+
+body.h5-divider-on :is(.markdown-rendered>h5, .markdown-preview-sizer>div>h5, .HyperMD-header-5)::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h5-accent-color) 30%, transparent 70%);
+}
+
+@media print {
+ body:not(.heading-indicator-off) h5::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h5-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+ }
+
+ body.h5-divider-on h5::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h5-accent-color) 30%, transparent 70%);
+ }
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-5 .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) h5 .collapse-indicator.collapse-icon svg {
+ transform: translateX(0px);
+ background-color: currentColor;
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ')
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-5 .is-collapsed .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) .is-collapsed h5 .collapse-indicator.collapse-icon svg {
+ background-color: var(--h5-accent-color);
+ color: var(--h5-accent-color);
+}
+
+h6,
+.markdown-rendered h6,
+.HyperMD-header-6,
+.inline-title[data-level='6'],
+.HyperMD-list-line .cm-header-6 {
+ text-transform: var(--h6-text-transform);
+}
+
+.h6-color-designated {
+ --h6-color: var(--h6-accent-color) !important;
+}
+
+body:not(.heading-indicator-off) .is-live-preview .HyperMD-header-6::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.5em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h6-accent-color);
+ transform: translateY(4px);
+}
+
+body:not(.heading-indicator-off) .markdown-rendered>h6::before,
+body:not(.heading-indicator-off) .markdown-preview-sizer>div>h6::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.5em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h6-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+}
+
+
+body.h6-divider-on :is(.markdown-rendered>h6, .markdown-preview-sizer>div>h6, .HyperMD-header-6)::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h6-accent-color) 30%, transparent 70%);
+}
+
+@media print {
+ body:not(.heading-indicator-off) h6::before {
+ margin-right: 6px;
+ content: " ";
+ display: inline-block;
+ width: 3px;
+ height: calc(1.2em - 8px);
+ border-radius: var(--radius-m);
+ background-color: var(--h6-accent-color);
+ position: absolute;
+ top: 4px;
+ left: 0px;
+ }
+
+ body.h6-divider-on h6::after {
+ content: "";
+ position: absolute;
+ height: 1px;
+ width: 100%;
+ right: 0px;
+ opacity: 0.5;
+ bottom: 0;
+ background-image: linear-gradient(to left, var(--h6-accent-color) 30%, transparent 70%);
+ }
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-6 .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) h6 .collapse-indicator.collapse-icon svg {
+ transform: translateX(0px);
+ background-color: currentColor;
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ')
+}
+
+body:not(.collapse-icon-restore) .is-live-preview .HyperMD-header-6 .is-collapsed .collapse-indicator.collapse-icon svg,
+body:not(.collapse-icon-restore) :is(.markdown-rendered, .markdown-preview-view) .is-collapsed h6 .collapse-indicator.collapse-icon svg {
+ background-color: var(--h6-accent-color);
+ color: var(--h6-accent-color);
+}
+
+
+
+
+/* ====== link ====== */
+body {
+ /* Links */
+ --link-external-color: var(--color-blue);
+ --link-external-color-hover: var(--color-blue);
+}
+
+.cm-s-obsidian span:is(.cm-link, .cm-url) a {
+ color: var(--link-external-color);
+}
+
+a:not(.tag, .raindrop-tag, .clickable-icon, :has(img:not(.link-favicon))):hover,
+.cm-s-obsidian .cm-line:not(.cm-active) span.cm-hmd-internal-link:hover,
+.external-link:not(:has(img:not(.link-favicon))):hover,
+.cm-s-obsidian .cm-line:not(.cm-active) span:is(.cm-link, .cm-url):hover {
+ border-radius: var(--radius-s);
+ background-color: var(--background-modifier-hover);
+ transition: background-color var(--anim-duration-fast) var(--anim-motion-smooth);
+}
+
+/* ====== tag====== */
+body {
+ /* Tags */
+ --tag-size: var(--font-smaller);
+ --tag-color: var(--text-accent);
+ --tag-color-hover: var(--text-accent);
+ --tag-decoration: none;
+ --tag-decoration-hover: none;
+ --tag-background: hsla(var(--interactive-accent-hsl), 0.1);
+ --tag-background-hover: hsla(var(--interactive-accent-hsl), 0.2);
+ --tag-border-color: hsla(var(--interactive-accent-hsl), 0.15);
+ --tag-border-color-hover: hsla(var(--interactive-accent-hsl), 0.15);
+ --tag-border-width: 0px;
+ --tag-padding-x: 0.65em;
+ --tag-padding-y: 0.25em;
+ --tag-radius: 2em;
+}
+
+@media (hover: hover) {
+
+ .cm-hashtag-end:hover,
+ .cm-hashtag-begin:has(+.cm-hashtag-end:hover),
+ .cm-hashtag-begin:hover,
+ .cm-hashtag-begin:hover+.cm-hashtag-end {
+ background-color: var(--tag-background-hover);
+ border: var(--tag-border-width) solid var(--tag-border-color-hover);
+ color: var(--tag-color-hover);
+ text-decoration: var(--tag-decoration-hover);
+ }
+}
+
+
+/* ====== line emphasis ====== */
+/* ====== highlight ====== */
+body {
+ --line-normal-opacity: 0.5;
+}
+
+.border-focus-mode .cm-lineWrapping>.cm-line.cm-active:not(:has(.mk-note-footer, .mk-floweditor-container)) {
+ background-color: var(--line-active-bg);
+ border-radius: var(--radius-s);
+ opacity: 1;
+}
+
+.border-focus-mode .cm-lineWrapping>.cm-line {
+ padding-left: var(--size-4-1);
+ padding-right: var(--size-4-1);
+ opacity: var(--line-normal-opacity);
+}
+
+.border-focus-mode .cm-lineWrapping>.cm-table-widget .cm-line {
+ background-color: unset !important;
+ border-radius: unset !important;
+ padding-left: unset !important;
+ padding-right: unset !important;
+}
+
+.border-focus-mode .markdown-source-view .cm-scroller .cm-line.cm-active.HyperMD-codeblock-bg:not(.HyperMD-codeblock-begin-bg, .HyperMD-codeblock-end-bg) {
+ border-radius: 0px;
+}
+
+.border-focus-mode .markdown-source-view .cm-scroller .cm-line.cm-active.HyperMD-codeblock-begin-bg {
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+}
+
+.border-focus-mode .markdown-source-view .cm-scroller .cm-line.cm-active.HyperMD-codeblock-end-bg {
+ border-top-left-radius: 0px;
+ border-top-right-radius: 0px;
+}
+
+/* ====== hover indicator ====== */
+
+/*general*/
+
+body {
+ --hover-indicator-color: var(--color-accent);
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .markdown-preview-sizer>div:not([class], :has(.collapse-indicator, .mk-header)) {
+ position: relative;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .markdown-source-view .cm-content>div:not(:has(.mk-note-footer)):has(.cm-hmd-list-indent)::after,
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .markdown-source-view .cm-content>div:not(.image-embed, .mk-header, :has(.mk-note-footer, .collapse-indicator))::after,
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .markdown-preview-sizer>div:is(.el-ul, .el-ol)::after,
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .markdown-preview-sizer>div:not([class], :has(.collapse-indicator, .mk-header))::after {
+ content: "";
+ position: absolute;
+ left: -12px;
+ top: 3px;
+ width: 3px;
+ height: 0;
+ border-radius: 10px;
+ background: var(--hover-indicator-color);
+ opacity: 1;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .markdown-source-view .cm-content>div:not(:has(.mk-note-footer)):has(.cm-hmd-list-indent):hover::after,
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .markdown-source-view .cm-content>div:not(.image-embed, .mk-header, :has(.mk-note-footer, .collapse-indicator)):hover::after,
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .markdown-preview-sizer>div:is(.el-ul, .el-ol):hover::after,
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .markdown-preview-sizer>div:not([class], :has(.collapse-indicator, .mk-header)):hover::after {
+ height: calc(100% - 6px);
+}
+
+/* num */
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line:not(.HyperMD-list-line-1):after,
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-codeblock:not(.HyperMD-codeblock-begin):not(.HyperMD-codeblock-end)::after {
+ background: unset !important;
+ opacity: 0 !important;
+ position: absolute !important;
+ left: -12px !important;
+ top: 0px !important;
+ height: 100% !important;
+ width: 3px !important;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ white-space: nowrap;
+ color: var(--hover-indicator-color);
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line:not(.HyperMD-list-line-1):hover::after,
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-codeblock:not(.HyperMD-codeblock-begin):not(.HyperMD-codeblock-end):hover:after {
+ opacity: 1 !important;
+}
+
+/* code */
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer,
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-codeblock-end {
+ counter-reset: code-line;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-codeblock:not(.HyperMD-codeblock-begin):not(.HyperMD-codeblock-end)::after {
+ counter-increment: code-line;
+ content: counter(code-line) !important;
+}
+
+/* list */
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line:not(.HyperMD-list-line-1):after {
+ content: "";
+ text-indent: 0px !important;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line.HyperMD-list-line-2::after {
+ content: "2" !important;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line.HyperMD-list-line-3::after {
+ content: "3" !important;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line.HyperMD-list-line-4::after {
+ content: "4" !important;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line.HyperMD-list-line-5::after {
+ content: "5" !important;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line.HyperMD-list-line-6::after {
+ content: "6" !important;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line.HyperMD-list-line-7::after {
+ content: "7" !important;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line.HyperMD-list-line-8::after {
+ content: "8" !important;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line.HyperMD-list-line-9::after {
+ content: "9" !important;
+}
+
+.line-hover-indicator .workspace-leaf-content[data-type="markdown"] .cm-contentContainer .cm-line.HyperMD-list-line.HyperMD-list-line-10::after {
+ content: "10" !important;
+}
+
+/* Cursor */
+
+body {
+ --cursor: pointer;
+ --cursor-link: pointer;
+}
+
+
+/* ====== Bold ====== */
+
+
+body {
+ --bold-weight: var(--font-semibold);
+ --bold-color: var(--color-red);
+}
+
+.cm-s-obsidian span.cm-quote.cm-strong {
+ color: var(--bold-color);
+}
+
+/* Italic */
+body {
+ --italic-color: var(--color-orange);
+}
+
+.cm-s-obsidian span.cm-quote.cm-em {
+ color: var(--italic-color);
+}
+
+/* --- */
+
+font[color] {
+ --italic-color: inhert;
+ --bold-color: inhert;
+}
+
+/* Lists */
+body {
+ --list-indent: 2em;
+ --list-spacing: 0.075em;
+ --list-bullet-border: none;
+ --list-bullet-radius: 50%;
+ --list-bullet-size: 0.3em;
+ --list-bullet-size-alt: calc(var(--list-bullet-size) / 2);
+ --list-bullet-transform: none;
+ --list-numbered-style: decimal;
+}
+
+/* List all */
+body:not(.ul-marker-restore) .markdown-rendered .has-list-bullet .has-list-bullet .has-list-bullet .has-list-bullet .list-bullet::after,
+body:not(.ul-marker-restore) .markdown-rendered .list-bullet::after,
+body:not(.ul-marker-restore) .markdown-source-view.mod-cm6 .list-bullet::after {
+ --list-bullet-radius: 50%;
+ --list-bullet-border: calc(var(--list-bullet-size) / 2) solid var(--list-marker-color);
+ width: var(--list-bullet-size-alt);
+ height: var(--list-bullet-size-alt);
+ background-color: transparent;
+}
+
+/* level 1 */
+body:not(.ul-marker-restore) .markdown-rendered .has-list-bullet .list-bullet::after,
+body:not(.ul-marker-restore) .markdown-source-view.mod-cm6 .HyperMD-list-line.HyperMD-list-line-1.cm-line div.cm-fold-indicator~span.cm-formatting .list-bullet::after,
+body:not(.ul-marker-restore) .markdown-source-view.mod-cm6 .HyperMD-list-line.HyperMD-list-line-1.cm-line>span.cm-formatting:first-of-type .list-bullet::after {
+ --list-bullet-radius: 50%;
+ --list-bullet-border: none;
+ width: var(--list-bullet-size);
+ height: var(--list-bullet-size);
+ background-color: var(--list-marker-color);
+}
+
+/* level 2 */
+body:not(.ul-marker-restore) .markdown-rendered .has-list-bullet .has-list-bullet .list-bullet::after,
+body:not(.ul-marker-restore) .markdown-source-view.mod-cm6 .HyperMD-list-line.HyperMD-list-line-2.cm-line div.cm-fold-indicator~span.cm-formatting .list-bullet::after,
+body:not(.ul-marker-restore) .markdown-source-view.mod-cm6 .HyperMD-list-line.HyperMD-list-line-2.cm-line span.cm-hmd-list-indent~span.cm-formatting .list-bullet::after {
+ --list-bullet-radius: 0;
+ --list-bullet-border: none;
+ width: var(--list-bullet-size);
+ height: var(--list-bullet-size);
+ background-color: var(--list-marker-color);
+}
+
+/* level 3 */
+body:not(.ul-marker-restore) .markdown-rendered .has-list-bullet .has-list-bullet .has-list-bullet .list-bullet::after,
+body:not(.ul-marker-restore) .markdown-source-view.mod-cm6 .HyperMD-list-line.HyperMD-list-line-3.cm-line div.cm-fold-indicator~span.cm-formatting .list-bullet::after,
+body:not(.ul-marker-restore) .markdown-source-view.mod-cm6 .HyperMD-list-line.HyperMD-list-line-3.cm-line span.cm-hmd-list-indent~span.cm-formatting .list-bullet::after {
+ --list-bullet-radius: 0;
+ --list-bullet-transform: rotate(45deg);
+ --list-bullet-border: none;
+ width: var(--list-bullet-size);
+ height: var(--list-bullet-size);
+ background-color: var(--list-marker-color);
+}
+
+li.is-collapsed .list-bullet:after,
+.is-collapsed~.cm-formatting-list .list-bullet:after {
+ background-color: var(--list-marker-color-collapsed) !important;
+}
+
+ol>li.is-collapsed::marker,
+ul>li.is-collapsed::marker,
+.cm-s-obsidian .is-collapsed~.cm-formatting-list {
+ color: var(--list-marker-color-collapsed) !important;
+}
+
+@media (hover: hover) {
+
+ .list-collapse-indicator:hover~.list-bullet:after,
+ .cm-fold-indicator:hover~.list-bullet:after,
+ .list-collapse-indicator:hover~.cm-formatting-list .list-bullet:after,
+ .cm-fold-indicator:hover~.cm-formatting-list .list-bullet:after {
+ background-color: var(--list-marker-color-hover) !important;
+ }
+
+ li.is-collapsed .list-collapse-indicator:hover~.list-bullet:after,
+ li.is-collapsed .cm-fold-indicator:hover~.list-bullet:after,
+ .list-collapse-indicator:hover.is-collapsed~.list-bullet:after,
+ .cm-fold-indicator:hover.is-collapsed~.list-bullet:after,
+ li.is-collapsed .list-collapse-indicator:hover~.cm-formatting-list .list-bullet:after,
+ li.is-collapsed .cm-fold-indicator:hover~.cm-formatting-list .list-bullet:after,
+ .list-collapse-indicator:hover.is-collapsed~.cm-formatting-list .list-bullet:after,
+ .cm-fold-indicator:hover.is-collapsed~.cm-formatting-list .list-bullet:after {
+ background-color: var(--list-marker-color-collapsed) !important;
+ }
+}
+
+
+/* ======checkboxes ====== */
+body {
+ /* Checkboxes */
+ --checkbox-radius: var(--radius-l);
+ --checkbox-size: var(--font-text-size);
+ --checkbox-marker-color: var(--background-primary);
+ --checkbox-color: var(--color-green);
+ --checkbox-color-hover: var(--color-green);
+ --checkbox-border-color: var(--text-faint);
+ --checkbox-border-color-hover: var(--text-faint);
+ --checklist-done-decoration: line-through;
+ --checklist-done-color: var(--text-faint);
+}
+
+@media (hover: hover) {
+ input[type=checkbox]:checked:hover {
+ filter: brightness(1.075);
+ }
+
+
+ input[type=checkbox]:hover {
+ outline-offset: 2px;
+ outline: 2px solid var(--background-modifier-border-hover);
+ }
+}
+
+input[type=checkbox] {
+ transition: box-shadow var(--anim-duration-moderate) var(--anim-motion-swing), filter var(--anim-duration-moderate) var(--anim-motion-smooth);
+ cursor: pointer;
+}
+
+input[type=checkbox]:checked:after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3e%3cg clip-path='url(%23a)'%3e%3cpath fill='black' d='M15.53 2.41a1.5 1.5 0 0 1 .06 2.12l-8.5 9a1.501 1.501 0 0 1-2.15.03l-4.5-4.5a1.5 1.5 0 0 1 2.12-2.12l3.41 3.408 7.44-7.878a1.5 1.5 0 0 1 2.12-.06Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h16v16H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+
+/* Alternate Checkboxes */
+
+input[data-task="<"]:checked,
+li[data-task="<"]>input:checked,
+li[data-task="<"]>p>input:checked,
+input[data-task=">"]:checked,
+li[data-task=">"]>input:checked,
+li[data-task=">"]>p>input:checked,
+input[data-task="d"]:checked,
+li[data-task="d"]>input:checked,
+li[data-task="d"]>p>input:checked,
+input[data-task="u"]:checked,
+li[data-task="u"]>input:checked,
+li[data-task="u"]>p>input:checked,
+input[data-task="S"]:checked,
+li[data-task="S"]>input:checked,
+li[data-task="S"]>p>input:checked,
+input[data-task="“"]:checked,
+li[data-task="“"]>input:checked,
+li[data-task="“"]>p>input:checked,
+input[data-task="\""]:checked,
+li[data-task="\""]>input:checked,
+li[data-task="\""]>p>input:checked,
+input[data-task="c"]:checked,
+li[data-task="c"]>input:checked,
+li[data-task="c"]>p>input:checked,
+input[data-task="p"]:checked,
+li[data-task="p"]>input:checked,
+li[data-task="p"]>p>input:checked,
+input[data-task="n"]:checked,
+li[data-task="n"]>input:checked,
+li[data-task="n"]>p>input:checked,
+input[data-task="b"]:checked,
+li[data-task="b"]>input:checked,
+li[data-task="b"]>p>input:checked,
+input[data-task="-"]:checked,
+li[data-task="-"]>input:checked,
+li[data-task="-"]>p>input:checked,
+input[data-task="l"]:checked,
+li[data-task="l"]>input:checked,
+li[data-task="l"]>p>input:checked,
+input[data-task="I"]:checked,
+li[data-task="I"]>input:checked,
+li[data-task="I"]>p>input:checked,
+input[data-task="/"]:checked,
+li[data-task="/"]>input:checked,
+li[data-task="/"]>p>input:checked,
+input[data-task="i"]:checked,
+li[data-task="i"]>input:checked,
+li[data-task="i"]>p>input:checked,
+input[data-task="*"]:checked,
+li[data-task="*"]>input:checked,
+li[data-task="*"]>p>input:checked,
+input[data-task="?"]:checked,
+li[data-task="?"]>input:checked,
+li[data-task="?"]>p>input:checked,
+input[data-task="!"]:checked,
+li[data-task="!"]>input:checked,
+li[data-task="!"]>p>input:checked {
+ --checkbox-marker-color: transparent;
+ border: none;
+ border-radius: 0;
+ background-image: none;
+ background-color: currentColor;
+ -webkit-mask-size: var(--checkbox-icon);
+ -webkit-mask-position: 50% 50%
+}
+
+input[data-task="!"]:checked,
+li[data-task="!"]>input:checked,
+li[data-task="!"]>p>input:checked {
+ --checkbox-color-hover: var(--color-orange);
+ color: var(--color-orange);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="?"]:checked,
+li[data-task="?"]>input:checked,
+li[data-task="?"]>p>input:checked {
+ --checkbox-color-hover: var(--color-pink);
+ color: var(--color-pink);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="*"]:checked,
+li[data-task="*"]>input:checked,
+li[data-task="*"]>p>input:checked {
+ --checkbox-color-hover: var(--color-yellow);
+ color: var(--color-yellow);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="i"]:checked,
+li[data-task="i"]>input:checked,
+li[data-task="i"]>p>input:checked {
+ --checkbox-color-hover: var(--color-cyan);
+ color: var(--color-cyan);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="/"]:checked,
+li[data-task="/"]>input:checked,
+li[data-task="/"]>p>input:checked {
+ --checkbox-color-hover: var(--color-yellow);
+ color: var(--color-yellow);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="I"]:checked,
+li[data-task="I"]>input:checked,
+li[data-task="I"]>p>input:checked {
+ --checkbox-color-hover: var(--color-orange);
+ color: var(--color-orange);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="l"]:checked,
+li[data-task="l"]>input:checked,
+li[data-task="l"]>p>input:checked {
+ --checkbox-color-hover: var(--color-red);
+ color: var(--color-red);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="-"]:checked,
+li[data-task="-"]>input:checked,
+li[data-task="-"]>p>input:checked {
+ --checkbox-color-hover: var(--text-faint);
+ color: var(--text-faint);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+body:not(.tasks) .markdown-preview-view ul li[data-task="-"].task-list-item.is-checked,
+body:not(.tasks) .markdown-source-view.mod-cm6 .HyperMD-task-line[data-task]:is([data-task="-"]),
+body:not(.tasks) li[data-task="-"].task-list-item.is-checked {
+ color: var(--text-faint);
+ text-decoration: line-through solid var(--text-faint) 1px
+}
+
+
+input[data-task="b"]:checked,
+li[data-task="b"]>input:checked,
+li[data-task="b"]>p>input:checked {
+ --checkbox-color-hover: var(--color-blue);
+ color: var(--color-blue);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="n"]:checked,
+li[data-task="n"]>input:checked,
+li[data-task="n"]>p>input:checked {
+ --checkbox-color-hover: var(--color-cyan);
+ color: var(--color-cyan);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="p"]:checked,
+li[data-task="p"]>input:checked,
+li[data-task="p"]>p>input:checked {
+ --checkbox-color-hover: var(--color-green);
+ color: var(--color-green);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="c"]:checked,
+li[data-task="c"]>input:checked,
+li[data-task="c"]>p>input:checked {
+ --checkbox-color-hover: var(--color-red);
+ color: var(--color-red);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="“"]:checked,
+li[data-task="“"]>input:checked,
+li[data-task="“"]>p>input:checked,
+input[data-task="\""]:checked,
+li[data-task="\""]>input:checked,
+li[data-task="\""]>p>input:checked {
+ --checkbox-color-hover: var(--color-purple);
+ color: var(--color-purple);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="S"]:checked,
+li[data-task="S"]>input:checked,
+li[data-task="S"]>p>input:checked {
+ --checkbox-color-hover: var(--color-green);
+ color: var(--color-green);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="u"]:checked,
+li[data-task="u"]>input:checked,
+li[data-task="u"]>p>input:checked {
+ --checkbox-color-hover: var(--color-green);
+ color: var(--color-green);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="d"]:checked,
+li[data-task="d"]>input:checked,
+li[data-task="d"]>p>input:checked {
+ --checkbox-color-hover: var(--color-red);
+ color: var(--color-red);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task=">"]:checked,
+li[data-task=">"]>input:checked,
+li[data-task=">"]>p>input:checked {
+ --checkbox-color-hover: var(--color-pink);
+ color: var(--color-pink);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+input[data-task="<"]:checked,
+li[data-task="<"]>input:checked,
+li[data-task="<"]>p>input:checked {
+ --checkbox-color-hover: var(--color-blue);
+ color: var(--color-blue);
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ');
+}
+
+
+/* ====== Callout ====== */
+body {
+ /* Callouts */
+ --callout-border-width: 0px;
+ --callout-border-opacity: 0.25;
+ --callout-padding: var(--size-4-3) var(--size-4-3) var(--size-4-3) var(--size-4-6);
+ --callout-radius: var(--radius-s);
+ --callout-title-color: inherit;
+ --callout-title-padding: 0;
+ --callout-title-size: inherit;
+ --callout-content-padding: 0;
+ --callout-content-background: transparent;
+ --callout-content-radius: 0px;
+}
+
+.theme-light .callout:is([data-callout-metadata*="style-1"], [data-callout*=style-1]),
+.callout-style-1.theme-light {
+ --callout-border-width: 1px;
+ --callout-border-opacity: 0.25;
+ --callout-padding: 0;
+ --callout-radius: var(--radius-s);
+ --callout-title-color: inherit;
+ --callout-title-padding: 8px 16px;
+ --callout-title-size: inherit;
+ --callout-content-padding: 0px 16px;
+ --callout-content-background: #FFFFFFBF;
+ --callout-content-radius: 0px;
+}
+
+.theme-dark .callout:is([data-callout-metadata*="style-1"], [data-callout*=style-1]),
+.callout-style-1.theme-dark {
+ --callout-border-width: 1px;
+ --callout-border-opacity: 0.25;
+ --callout-padding: 0;
+ --callout-radius: var(--radius-s);
+ --callout-title-color: inherit;
+ --callout-title-padding: 8px 16px;
+ --callout-title-size: inherit;
+ --callout-content-padding: 0px 16px;
+ --callout-content-background: #00000040;
+ --callout-content-radius: 0px;
+}
+
+.theme-light .callout:is([data-callout-metadata*="style-2"], [data-callout*=style-2]),
+.callout-style-2.theme-light {
+ --callout-border-width: 1px;
+ --callout-border-opacity: 0.25;
+ --callout-padding: 0 6px 6px;
+ --callout-radius: var(--radius-s);
+ --callout-title-color: inherit;
+ --callout-title-padding: 8px 16px;
+ --callout-title-size: inherit;
+ --callout-content-padding: 0px 16px;
+ --callout-content-background: #FFFFFFBF;
+ --callout-content-radius: 4px;
+}
+
+.theme-dark .callout:is([data-callout-metadata*="style-2"], [data-callout*=style-2]),
+.callout-style-2.theme-dark {
+ --callout-border-width: 1px;
+ --callout-border-opacity: 0.25;
+ --callout-padding: 0 6px 6px;
+ --callout-radius: var(--radius-s);
+ --callout-title-color: inherit;
+ --callout-title-padding: 8px 16px;
+ --callout-title-size: inherit;
+ --callout-content-padding: 0px 16px;
+ --callout-content-background: #00000040;
+ --callout-content-radius: 4px;
+}
+
+body:is(.theme-light, .theme-dark) .callout:is([data-callout-metadata*="style-3"], [data-callout*=style-3]),
+.callout-style-3:is(.theme-light, .theme-dark) {
+ --callout-border-width: 0 0 0 4px;
+ --callout-border-opacity: 1;
+ --callout-padding: var(--size-4-3) var(--size-4-3) var(--size-4-3) var(--size-4-6);
+ --callout-radius: var(--radius-s);
+ --callout-title-color: inherit;
+ --callout-title-padding: 0;
+ --callout-title-size: inherit;
+ --callout-content-padding: 0;
+ --callout-content-background: transparent;
+ --callout-content-radius: 0px;
+}
+
+.theme-light .callout:is([data-callout-metadata*="style-4"], [data-callout*=style-4]),
+.callout-style-4.theme-light {
+ --callout-border-width: 0 0 0 4px;
+ --callout-border-opacity: 1;
+ --callout-padding: 0;
+ --callout-radius: var(--radius-s);
+ --callout-title-color: inherit;
+ --callout-title-padding: 8px 16px;
+ --callout-title-size: inherit;
+ --callout-content-padding: 0px 16px;
+ --callout-content-background: #FFFFFFBF;
+ --callout-content-radius: 0px;
+}
+
+.theme-dark .callout:is([data-callout-metadata*="style-4"], [data-callout*=style-4]),
+.callout-style-4.theme-dark {
+ --callout-border-width: 0 0 0 4px;
+ --callout-border-opacity: 1;
+ --callout-padding: 0;
+ --callout-radius: var(--radius-s);
+ --callout-title-color: inherit;
+ --callout-title-padding: 8px 16px;
+ --callout-title-size: inherit;
+ --callout-content-padding: 0px 16px;
+ --callout-content-background: #00000040;
+ --callout-content-radius: 0px;
+}
+
+.callout-content {
+ border-radius: var(--callout-content-radius);
+}
+
+/* ======Blockquotes ====== */
+body {
+ --background-alt-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3E%3Cpath fill='%23000000' fill-opacity='0.12' d='M1 3h1v1H1V3zm2-2h1v1H3V1z'%3E%3C/path%3E%3C/svg%3E");
+ --background-alt-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3E%3Cpath fill='%23ffffff' fill-opacity='0.12' d='M1 3h1v1H1V3zm2-2h1v1H3V1z'%3E%3C/path%3E%3C/svg%3E");
+}
+
+body {
+ /* Blockquotes */
+ --blockquote-border-thickness: 3px;
+ --blockquote-border-color: var(--interactive-accent);
+ --blockquote-font-style: normal;
+ --blockquote-color: inherit;
+ --blockquote-background-color: transparent;
+ --blockquote-background-light: var(--background-alt-light);
+ --blockquote-background-dark: var(--background-alt-dark);
+}
+
+.theme-light .markdown-source-view .cm-scroller .cm-line.HyperMD-quote,
+.theme-light .markdown-rendered blockquote {
+ border-radius: var(--radius-s);
+ background: var(--blockquote-background-light);
+}
+
+.theme-dark .markdown-source-view .cm-scroller .cm-line.HyperMD-quote,
+.theme-dark .markdown-rendered blockquote {
+ border-radius: var(--radius-s);
+ background: var(--blockquote-background-dark);
+}
+
+.markdown-rendered blockquote,
+.markdown-preview-view blockquote {
+ position: relative;
+}
+
+.markdown-rendered blockquote::before,
+.markdown-preview-view blockquote::before {
+ content: "";
+ position: absolute;
+ left: 4px;
+ top: 4px;
+ height: calc(100% - 8px);
+ width: var(--blockquote-border-thickness);
+ background-color: var(--blockquote-border-color);
+ border-radius: 24px;
+}
+
+.markdown-rendered blockquote {
+ border-left: none;
+}
+
+.markdown-source-view.mod-cm6.is-live-preview .HyperMD-quote::before {
+ content: "";
+ width: var(--blockquote-border-thickness) !important;
+ border-left: none !important;
+ background-color: var(--blockquote-border-color);
+ border-radius: 24px;
+ border-top-left-radius: 0px;
+ border-top-right-radius: 0px;
+ color: transparent;
+ position: absolute;
+ left: 0px !important;
+ bottom: 4px !important;
+ height: calc(100% - 4px);
+}
+
+.markdown-source-view.mod-cm6.is-live-preview .HyperMD-quote.cm-line {
+ border-left: 4px solid transparent;
+}
+
+.markdown-source-view.mod-cm6 div:not(.HyperMD-quote)+.HyperMD-quote::before,
+.markdown-source-view.mod-cm6 .cm-content :first-child:is(.HyperMD-quote)::before {
+ top: 4px !important;
+ height: calc(100% - 4px);
+ border-radius: 24px;
+ border-bottom-left-radius: 0px;
+ border-bottom-right-radius: 0px;
+}
+
+.markdown-source-view.mod-cm6 div:not(.HyperMD-quote)+.HyperMD-quote:not(:has(+ .HyperMD-quote))::before,
+.markdown-source-view.mod-cm6 .cm-content :first-child:is(.HyperMD-quote):not(:has(+ .HyperMD-quote))::before {
+ bottom: 4px !important;
+ top: 4px !important;
+ height: calc(100% - 8px);
+ border-radius: 24px;
+}
+
+.markdown-source-view.mod-cm6 .HyperMD-quote:has(+ .HyperMD-quote)::before {
+ bottom: 0px !important;
+ height: 100%;
+ border-radius: 0px;
+}
+
+/*---*/
+
+.markdown-source-view.mod-cm6 .HyperMD-quote {
+ border-top-left-radius: 0 !important;
+ border-top-right-radius: 0 !important;
+ border-bottom-left-radius: var(--radius-s) !important;
+ border-bottom-right-radius: var(--radius-s) !important;
+}
+
+.markdown-source-view.mod-cm6 div:not(.HyperMD-quote)+.HyperMD-quote,
+.markdown-source-view.mod-cm6 .cm-content :first-child:is(.HyperMD-quote) {
+ border-top-left-radius: var(--radius-s) !important;
+ border-top-right-radius: var(--radius-s) !important;
+}
+
+.markdown-source-view.mod-cm6 .HyperMD-quote:has(+ .HyperMD-quote) {
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+/*kbd*/
+kbd {
+ background-color: var(--background-modifier-hover);
+ color: var(--text-muted);
+}
+
+/*inline code*/
+body {
+ --inline-code-normal: var(--color-pink);
+ --inline-code-background-light: var(--background-alt-light);
+ --inline-code-background-dark: var(--background-alt-dark);
+}
+
+.markdown-rendered :not(pre)>code,
+.cm-s-obsidian span.cm-inline-code {
+ color: var(--inline-code-normal)
+}
+
+.theme-light .cm-s-obsidian span.cm-inline-code:not(.cm-formatting):not(.cm-hmd-indented-code):not(.obsidian-search-match-highlight),
+.theme-light .cm-s-obsidian span.cm-inline-code,
+.theme-light :not(pre)>code {
+ background: var(--inline-code-background-light);
+}
+
+.theme-dark .cm-s-obsidian span.cm-inline-code:not(.cm-formatting):not(.cm-hmd-indented-code):not(.obsidian-search-match-highlight),
+.theme-dark .cm-s-obsidian span.cm-inline-code,
+.theme-dark :not(pre)>code {
+ background: var(--inline-code-background-dark);
+}
+
+.theme-light .cm-s-obsidian span.cm-inline-code span.cm-inline-code.cm-hmd-indented-code,
+.theme-dark .cm-s-obsidian span.cm-inline-code span.cm-inline-code.cm-hmd-indented-code {
+ background: unset;
+}
+
+/*codeblock*/
+body {
+ /* Code */
+ --code-white-space: pre-wrap;
+ --code-radius: var(--radius-s);
+ --code-size: var(--font-smaller);
+ --code-background-light: var(--background-alt-light);
+ --code-background-dark: var(--background-alt-dark);
+ --code-border-light: 1px dashed var(--background-modifier-border);
+ --code-border-dark: 1px dashed var(--background-modifier-border);
+ --code-normal: var(--text-muted);
+ --code-comment: var(--text-faint);
+ --code-function: var(--color-yellow);
+ --code-important: var(--color-orange);
+ --code-keyword: var(--color-pink);
+ --code-operator: var(--color-red);
+ --code-property: var(--color-cyan);
+ --code-punctuation: var(--text-muted);
+ --code-string: var(--color-green);
+ --code-tag: var(--color-red);
+ --code-value: var(--color-purple);
+}
+
+.theme-light {
+ --code-background: var(--code-background-light);
+ --code-border: var(--code-border-light);
+}
+
+.theme-dark {
+ --code-background: var(--code-background-dark);
+ --code-border: var(--code-border-dark);
+}
+
+.cm-s-obsidian div.HyperMD-codeblock-begin-bg,
+.cm-s-obsidian div.HyperMD-codeblock-end-bg,
+.cm-s-obsidian div.HyperMD-codeblock-bg,
+.markdown-rendered pre {
+ background: var(--code-background);
+}
+
+.cm-s-obsidian div.HyperMD-codeblock-begin-bg {
+ border-top: var(--code-border);
+}
+
+.cm-s-obsidian div.HyperMD-codeblock-end-bg {
+ border-bottom: var(--code-border);
+}
+
+.cm-s-obsidian div.HyperMD-codeblock-bg {
+ border-left: var(--code-border);
+ border-right: var(--code-border);
+}
+
+.markdown-rendered pre {
+ border: var(--code-border);
+}
+
+.cm-s-obsidian .HyperMD-codeblock {
+ caret-color: auto;
+}
+
+.codeblock-style-dracula {
+ --code-background-light: #282A36;
+ --code-background-dark: #282A36;
+ --code-border-light: none;
+ --code-border-dark: none;
+ --code-normal: #f8f8f2;
+ --code-comment: #6272a4;
+ --code-function: #f1fa8c;
+ --code-important: #ffb86c;
+ --code-keyword: #ff79c6;
+ --code-operator: #ff5555;
+ --code-property: #8be9fd;
+ --code-punctuation: #f8f8f2;
+ --code-string: #50fa7b;
+ --code-tag: #ff5555;
+ --code-value: #bd93f9;
+}
+
+.codeblock-style-solarized-light {
+ --code-background-light: #fdf6e3;
+ --code-background-dark: #fdf6e3;
+ --code-border-light: none;
+ --code-border-dark: none;
+ --code-normal: #657b83;
+ --code-comment: #93a1a1;
+ --code-function: #b58900;
+ --code-important: #cb4b16;
+ --code-keyword: #d33682;
+ --code-operator: #dc322f;
+ --code-property: #2aa198;
+ --code-punctuation: #657b83;
+ --code-string: #859900;
+ --code-tag: #dc322f;
+ --code-value: #6c71c4;
+}
+
+.codeblock-style-solarized-dark {
+ --code-background-light: #002b36;
+ --code-background-dark: #002b36;
+ --code-border-light: none;
+ --code-border-dark: none;
+ --code-normal: #839496;
+ --code-comment: #586e75;
+ --code-function: #b58900;
+ --code-important: #cb4b16;
+ --code-keyword: #d33682;
+ --code-operator: #dc322f;
+ --code-property: #2aa198;
+ --code-punctuation: #839496;
+ --code-string: #859900;
+ --code-tag: #dc322f;
+ --code-value: #6c71c4;
+}
+
+.codeblock-style-one-dark {
+ --code-background-light: #282C34;
+ --code-background-dark: #282C34;
+ --code-border-light: none;
+ --code-border-dark: none;
+ --code-normal: #ABB2BF;
+ --code-comment: #5C6370;
+ --code-function: #E5C07B;
+ --code-important: #D19A66;
+ --code-keyword: #E06C75;
+ --code-operator: #BE5046;
+ --code-property: #56B6C2;
+ --code-punctuation: #ABB2BF;
+ --code-string: #98C379;
+ --code-tag: #BE5046;
+ --code-value: #C678DD;
+}
+
+.css-settings-manager:not(.codeblock-style-customize) .cm-s-obsidian .HyperMD-codeblock ::selection,
+.css-settings-manager:not(.codeblock-style-customize) .markdown-rendered pre ::selection,
+.css-settings-manager:not(.codeblock-style-customize) .markdown-source-view.mod-cm6 .code-block-flair:hover,
+.css-settings-manager:not(.codeblock-style-customize) .markdown-rendered button.copy-code-button:hover {
+ background-color: hsl(from var(--code-normal) h s l / 20%);
+}
+
+.markdown-source-view.mod-cm6 .code-block-flair,
+.markdown-rendered button.copy-code-button {
+ color: var(--code-normal);
+}
+
+/* ======table ====== */
+body {
+ --table-header-background-light: var(--background-alt-light);
+ --table-header-background-dark: var(--background-alt-dark);
+ --table-width: 88cqw;
+}
+
+.theme-light .markdown-rendered thead tr {
+ background: var(--table-header-background-light);
+}
+
+.theme-dark .markdown-rendered thead tr {
+ background: var(--table-header-background-dark);
+}
+
+body:not(.table-width-obsidian-default) .markdown-source-view.mod-cm6 .cm-table-widget .table-wrapper,
+body:not(.table-width-obsidian-default) :is(.markdown-rendered, .markdown-source-view.mod-cm6.is-live-preview) table {
+ width: 100% !important;
+}
+
+.markdown-source-view,
+.markdown-reading-view {
+ container-type: inline-size;
+}
+
+.table-width-customized .markdown-source-view.mod-cm6.is-live-preview .cm-content>.cm-table-widget,
+.table-width-customized .markdown-rendered .markdown-preview-sizer>div:has(>table) {
+ overflow: auto;
+ width: var(--table-width) !important;
+ margin-left: calc((var(--table-width) - 100%) / -2) !important;
+}
+
+/* ===== embeds ====== */
+body {
+ /* Embeds */
+ --embed-border-radius: 0px;
+}
+
+body.seamless-embeds {
+ --embed-border-left: none;
+}
+
+.markdown-embed {
+ border-radius: var(--embed-border-radius);
+}
+
+/* ===== image ====== */
+
+/* image center align */
+.img-center-align .print :is(.markdown-preview-view, .markdown-rendered) img:not([class]),
+.img-center-align .markdown-preview-view img:not([class]),
+.img-center-align .markdown-source-view img:not([class]) {
+ display: block;
+ margin-left: auto !important;
+ margin-right: auto !important;
+}
+
+.img-center-align .print :is(.markdown-preview-view, .markdown-rendered) img:is([class=""], .image-ready-resize, .image-ready-click-view),
+.img-center-align .markdown-preview-view img:is([class=""], .image-ready-resize, .image-ready-click-view),
+.img-center-align .markdown-source-view img:is([class=""], .image-ready-resize, .image-ready-click-view) {
+ display: block;
+ margin-left: auto !important;
+ margin-right: auto !important;
+}
+
+/* image hover effect */
+.markdown-source-view.mod-cm6 .cm-content>.internal-embed {
+ contain: unset !important;
+}
+
+@media (hover: hover) {
+
+ .workspace-leaf-content[data-type="markdown"] .markdown-source-view .cm-content>img:hover,
+ .workspace-leaf-content[data-type="markdown"] .view-content .cm-content .image-embed img:hover {
+ outline-offset: 2px;
+ outline: 2px solid var(--background-modifier-border-hover);
+ border-radius: var(--radius-s);
+ }
+}
+
+.theme-dark.img-darken .markdown-preview-view img,
+.theme-dark.img-darken .markdown-source-view img {
+ opacity: 0.75;
+ transition: opacity var(--anim-duration-fast) linear;
+}
+
+.theme-dark.img-darken .markdown-preview-view img:hover,
+.theme-dark.img-darken .markdown-source-view img:hover {
+ opacity: 1;
+ transition: opacity var(--anim-duration-fast) linear;
+}
+
+/* image zoom */
+/* from https://github.com/kepano/obsidian-minimal, author:@kepano */
+
+.image-embed.is-loaded {
+ line-height: 0
+}
+
+.image-embed.is-loaded img {
+ background-color: transparent
+}
+
+.image-embed.is-loaded img:active {
+ background-color: transparent
+}
+
+body:not(.zoom-off) .view-content div:not(.canvas-node-content) img:not([class]) {
+ max-width: 100%;
+ cursor: zoom-in
+}
+
+body:not(.zoom-off) .view-content img:not([class]):active {
+ cursor: zoom-out;
+}
+
+body:not(.zoom-off) .view-content .markdown-preview-view img:not([class])[referrerpolicy=no-referrer]:active {
+ background-color: var(--background-primary);
+ padding: 10px;
+}
+
+body:not(.zoom-off) .view-content .image-embed:not(.canvas-node-content):active,
+body:not(.zoom-off) .view-content .markdown-preview-view img:not([class])[referrerpolicy=no-referrer]:active {
+ aspect-ratio: unset;
+ cursor: zoom-out;
+ display: block;
+ z-index: 200;
+ position: fixed;
+ max-height: calc(100% + 1px);
+ max-width: 100%;
+ height: calc(100% + 1px);
+ width: 100%;
+ object-fit: contain;
+ margin: -.5px auto 0 !important;
+ text-align: center;
+ padding: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+}
+
+body:not(.zoom-off) .view-content .image-embed:not(.canvas-node-content):active:after {
+ background-color: var(--background-primary);
+ opacity: .9;
+ content: " ";
+ height: calc(100% + 1px);
+ width: 100%;
+ position: fixed;
+ left: 0;
+ right: 1px;
+ z-index: 0;
+}
+
+body:not(.zoom-off) .view-content .image-embed:not(.canvas-node-content):active img:not([class]) {
+ aspect-ratio: unset;
+ top: 50%;
+ z-index: 99;
+ transform: translateY(-50%);
+ padding: 0;
+ margin: 0 auto;
+ width: calc(100% - 20px);
+ max-height: 95vh;
+ object-fit: contain;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ position: absolute;
+ opacity: 1;
+ outline: unset !important;
+ outline-offset: 0px !important;
+ border-radius: 0 !important;
+}
+
+/* ====== pdf ====== */
+.pdf-toolbar,
+.pdf-container,
+.pdf-sidebar-container {
+ background-color: transparent;
+}
+
+/* ====== icon ====== */
+body {
+ --clickable-icon-radius: 6px;
+}
+
+.workspace-tab-header-inner-icon {
+ align-items: center;
+ justify-content: center;
+}
+
+.workspace-tab-header-tab-list,
+.workspace-tab-header-new-tab {
+ padding-top: 6px;
+}
+
+.clickable-icon.document-search-button,
+.clickable-icon.document-search-close-button,
+body:not(.is-mobile) .workspace-split.mod-left-split .workspace-sidedock-vault-profile .workspace-drawer-vault-actions .clickable-icon,
+.mod-left-split .workspace-tab-header .workspace-tab-header-inner,
+.mod-right-split .workspace-tab-header .workspace-tab-header-inner,
+.clickable-icon.nav-action-button,
+.clickable-icon.side-dock-ribbon-action,
+.sidebar-toggle-button .clickable-icon,
+.workspace-tab-header-new-tab .clickable-icon,
+.workspace-tab-header-tab-list .clickable-icon,
+.view-header .clickable-icon {
+ padding: 7px;
+ height: 32px;
+ width: 32px;
+}
+
+.workspace-leaf.has-pane-relief-label .view-header .view-header-nav-buttons .clickable-icon {
+ width: unset;
+}
+
+.mod-left-split .workspace-tab-header .workspace-tab-header-inner,
+.mod-right-split .workspace-tab-header .workspace-tab-header-inner {
+ /*pin icon*/
+ width: fit-content;
+ gap: var(--size-2-2);
+}
+
+.is-mobile .clickable-icon.nav-action-button,
+.is-mobile .clickable-icon.side-dock-ribbon-action,
+.is-mobile .sidebar-toggle-button .clickable-icon,
+.is-mobile .view-header .clickable-icon {
+ padding: var(--size-2-2);
+}
+
+.titlebar .workspace-tab-header-tab-list,
+.titlebar .workspace-tab-header-new-tab,
+.mod-root .workspace-tab-header-tab-list,
+.mod-root .workspace-tab-header-new-tab {
+ display: unset;
+}
+
+.side-dock-settings,
+.side-dock-actions {
+ gap: var(--size-2-2);
+}
+
+.workspace-tab-header-status-icon,
+.mod-root .workspace-tab-header-status-icon,
+.mod-root .workspace-tab-header-inner-icon {
+ --icon-size: var(--icon-s);
+}
+
+
+/* ====== icon replace ====== */
+svg {
+ -webkit-mask-size: contain;
+ -webkit-mask-position: center;
+ -webkit-mask-repeat: no-repeat;
+}
+
+svg.sidebar-right {
+ background-color: currentColor;
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' viewBox='0 0 24 24'%3e%3cpath fill='black' fill-rule='evenodd' d='M22.875 5.778c0-1.484-1.224-2.653-2.693-2.653H3.818c-1.469 0-2.693 1.17-2.693 2.653v12.444c0 1.484 1.224 2.653 2.693 2.653h16.364c1.469 0 2.693-1.17 2.693-2.653V5.778Zm-10.75 13.347H3.818c-.54 0-.943-.423-.943-.903V5.778c0-.48.404-.903.943-.903h8.307v14.25Zm1.75-14.25v14.25h6.307c.54 0 .943-.423.943-.903V5.778c0-.48-.404-.903-.943-.903h-6.307Zm6 2.125A.875.875 0 0 0 19 6.125h-3a.875.875 0 0 0 0 1.75h3A.875.875 0 0 0 19.875 7Zm0 3A.875.875 0 0 0 19 9.125h-3a.875.875 0 0 0 0 1.75h3a.875.875 0 0 0 .875-.875Zm0 3a.875.875 0 0 0-.875-.875h-3a.875.875 0 0 0 0 1.75h3a.875.875 0 0 0 .875-.875Z' clip-rule='evenodd'/%3e%3c/svg%3e");
+}
+
+svg.sidebar-left {
+ background-color: currentColor;
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none' viewBox='0 0 24 24'%3e%3cpath fill='black' fill-rule='evenodd' d='M1.125 5.778c0-1.484 1.224-2.653 2.693-2.653h16.364c1.469 0 2.693 1.17 2.693 2.653v12.444c0 1.484-1.224 2.653-2.693 2.653H3.818c-1.469 0-2.693-1.17-2.693-2.653V5.778Zm10.75 13.347h8.307c.54 0 .943-.423.943-.903V5.778c0-.48-.404-.903-.943-.903h-8.307v14.25Zm-1.75-14.25v14.25H3.818c-.54 0-.943-.423-.943-.903V5.778c0-.48.404-.903.943-.903h6.307ZM4.125 7c0-.483.392-.875.875-.875h3a.875.875 0 1 1 0 1.75H5A.875.875 0 0 1 4.125 7Zm0 3c0-.483.392-.875.875-.875h3a.875.875 0 1 1 0 1.75H5A.875.875 0 0 1 4.125 10Zm0 3c0-.483.392-.875.875-.875h3a.875.875 0 0 1 0 1.75H5A.875.875 0 0 1 4.125 13Z' clip-rule='evenodd'/%3e%3c/svg%3e");
+}
+
+/* ====== MOBILE ====== */
+
+.is-mobile {
+ --background-modifier-form-field: var(--background-modifier-hover);
+}
+
+.is-mobile.theme-light {
+ --interactive-normal: rgba(var(--mono-rgb-100), 0.05);
+ --interactive-hover: rgba(var(--mono-rgb-100), 0.075);
+}
+
+.is-mobile.theme-dark {
+ --search-result-background: var(--background-tertiary);
+ --background-modifier-form-field: var(--background-modifier-hover);
+ --background-modifier-hover: rgba(var(--mono-rgb-100), 0.08);
+ --interactive-normal: var(--background-modifier-border);
+ --interactive-hover: var(--background-modifier-border-hover);
+}
+
+.is-tablet.theme-dark .vertical-tab-content,
+.is-tablet .workspace-tab-header-container,
+.is-mobile .workspace-split.mod-root .view-header,
+.is-mobile .workspace-split.mod-root .view-content,
+.workspace-drawer.mod-right .workspace-drawer-header,
+.workspace-drawer.mod-right .workspace-drawer-active-tab-header,
+.workspace-drawer.mod-right .view-header,
+.workspace-drawer.mod-right .view-content,
+.workspace-drawer.mod-right,
+.workspace-drawer.mod-right .workspace-drawer-inner,
+.workspace-drawer.mod-right .workspace-drawer-inner .workspace-drawer-tab-container,
+.workspace-drawer.mod-right .workspace-drawer-inner .workspace-drawer-tab-container .workspace-leaf-content {
+ background-color: var(--background-primary);
+}
+
+.mobile-navbar {
+ box-shadow: 0px 0px 8px hsla(var(--accent-h), 18%, 80%, 0.2), 0px 0px 6px hsla(var(--accent-h), 18%, 80%, 0.1);
+}
+
+.theme-dark .mobile-navbar {
+ box-shadow: 0px -1px 0px var(--divider-color);
+}
+
+.is-tablet .workspace-tab-container {
+ border-top: 1px solid var(--divider-color);
+}
+
+.is-tablet .workspace-drawer-ribbon {
+ border-right: 1px solid var(--divider-color);
+}
+
+.is-tablet .workspace-drawer {
+ padding-top: 0;
+}
+
+.is-mobile.theme-light .mk-flow-bar button {
+ background-color: var(--background-modifier-form-field);
+}
+
+/* ====== mobile toolbar====== */
+.mobile-toolbar {
+ box-shadow: inset 0px 1px var(--divider-color);
+}
+
+
+/* tablet card layout */
+body.card-layout-pad-open.is-tablet {
+ --titlebar-background: var(--background-underlying);
+ --titlebar-background-focused: var(--background-underlying);
+}
+
+body.card-layout-pad-open.is-tablet,
+body.card-layout-pad-open.is-tablet .app-container,
+body.card-layout-pad-open.is-tablet .workspace,
+body.card-layout-pad-open.is-tablet .horizontal-main-container {
+ background-color: var(--background-underlying) !important;
+}
+
+body.card-layout-pad-open.is-tablet .workspace {
+ gap: 16px;
+ padding: 16px;
+ padding-bottom: 24px;
+ padding-top: 8px;
+}
+
+body.card-layout-pad-open.is-tablet .app-container:has(.mobile-toolbar) .workspace {
+ padding-bottom: 8px;
+}
+
+body.card-layout-pad-open.is-tablet .workspace-drawer {
+ background-color: var(--background-primary);
+ border-radius: var(--card-border-radius-light, 8px) !important;
+ overflow: hidden !important;
+ margin: 16px;
+ margin-bottom: 24px;
+ margin-top: 32px;
+}
+
+body.card-layout-pad-open.is-tablet.theme-dark .workspace-drawer {
+ border-radius: var(--card-border-radius-dark, 8px) !important;
+}
+
+body.card-layout-pad-open.is-tablet .workspace-split.mod-root {
+ border-radius: var(--card-border-radius-light, 8px) !important;
+ overflow: hidden !important;
+ background-color: var(--background-primary) !important;
+ box-shadow: 0px 0px 6px hsla(var(--accent-h), 18%, 80%, 0.4), 0px 0px 2px hsla(var(--accent-h), 18%, 80%, 0.2), 0 0 0 1px var(--background-modifier-border);
+}
+
+body.card-layout-pad-open.is-tablet.theme-dark .workspace-split.mod-root {
+ box-shadow: 0px 0px 0px 1px var(--background-modifier-border);
+ border-radius: var(--card-border-radius-dark, 8px);
+}
+
+body.card-layout-pad-open.is-tablet .workspace-drawer.is-pinned {
+ border-right: none;
+ border-left: none;
+ border-radius: var(--card-border-radius-light, 8px) !important;
+ margin: 0px;
+ box-shadow: 0px 0px 6px hsla(var(--accent-h), 18%, 80%, 0.4), 0px 0px 2px hsla(var(--accent-h), 18%, 80%, 0.2), 0 0 0 1px var(--background-modifier-border);
+}
+
+body.card-layout-pad-open.is-tablet.theme-dark .workspace-drawer.is-pinned {
+ box-shadow: 0px 0px 0px 1px var(--background-modifier-border);
+ border-radius: var(--card-border-radius-dark, 8px) !important;
+}
+
+body.card-layout-pad-open.is-tablet .workspace-drawer-inner {
+ padding-top: 8px;
+}
+
+
+/* drawer-phone-full-width */
+
+body.is-phone.drawer-phone-full-width .workspace-drawer {
+ width: 100vw;
+ border-radius: 0px;
+}
+
+
+/* ======== Plugin support ========*/
+
+/*DB folder*/
+body:not(.DB-table-full-width-off) .database-plugin__table {
+ width: 100% !important;
+}
+
+body.DB-table-bg-color-unify .database-plugin__navbar,
+body.DB-table-bg-color-unify .database-plugin__table {
+ --background-primary: transparent;
+ --background-secondary: transparent;
+}
+
+body.DB-table-bg-color-adapt .database-plugin__navbar,
+body.DB-table-bg-color-adapt .database-plugin__table {
+ --background-primary: transparent;
+ --background-secondary: rgba(var(--mono-rgb-100), 0.025);
+}
+
+body.DB-table-bg-color-unify .database-plugin__th:hover,
+body.DB-table-bg-color-unify .data-input:hover,
+body.DB-table-bg-color-adapt .database-plugin__th:hover,
+body.DB-table-bg-color-adapt .data-input:hover {
+ --background-modifier-hover: rgba(var(--mono-rgb-100), 0.025);
+ --background-secondary: var(--background-modifier-hover);
+}
+
+.database-plugin__pagination-button:hover {
+ background-color: var(--interactive-hover);
+}
+
+/* Projects */
+body.Projects-bg-color-unify .projects-container.svelte-gr1f73 {
+ --background-primary: transparent;
+ --background-secondary: transparent;
+ --tab-background-active: var(--background-primary);
+}
+
+body.Projects-bg-color-adapt .projects-container.svelte-gr1f73 {
+ --background-primary: transparent;
+ --background-secondary: rgba(var(--mono-rgb-100), 0.025);
+ --tab-background-active: var(--background-primary);
+}
+
+/*style settings*/
+
+body:not(.is-mobile) .workspace-leaf-content[data-type="style-settings"] .view-content {
+ padding: 12px !important;
+}
+
+.style-settings-container {
+ padding-left: var(--size-4-8);
+ margin-left: var(--size-4-1);
+ border-left: 1px solid var(--divider-color);
+}
+
+.style-settings-heading,
+.style-settings-heading[data-level="0"] {
+ margin-bottom: 12px;
+}
+
+.style-settings-heading.is-collapsed[data-level="0"] {
+ margin-bottom: 0;
+}
+
+.setting-item+div>.setting-item-heading,
+.setting-item+.setting-item-heading,
+.themed-color-wrapper>div+div {
+ margin-top: 0px;
+}
+
+.themed-color-wrapper>div {
+ box-shadow: 0px 0px 0px 1px var(--background-modifier-border);
+}
+
+.themed-color-wrapper {
+ display: flex;
+ align-items: center;
+ flex-direction: row;
+ gap: 8px;
+}
+
+.style-settings-container {
+ padding-bottom: 8px;
+}
+
+.setting-item.style-settings-heading:is([data-id=Info], [data-id=Components], [data-id=Appearance-light], [data-id=Appearance-dark], [data-id=Editor], [data-id=Mobile], [data-id=Plugin]) .style-settings-collapse-indicator::after {
+ content: "";
+ margin-left: var(--size-4-2);
+ display: inline-block;
+ position: relative;
+ top: 4px;
+ width: 18px;
+ height: 18px;
+ background-color: var(--text-muted);
+}
+
+.setting-item.style-settings-heading[data-id=Info] .style-settings-collapse-indicator::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' fill='none' viewBox='0 0 18 18'%3e%3cg clip-path='url(%23a)'%3e%3cpath fill='%2309244B' d='M9 1.5a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15ZM9 3a6 6 0 1 0 0 12A6 6 0 0 0 9 3Zm-.008 4.5c.419 0 .758.34.758.758V12.1a.75.75 0 0 1-.375 1.4h-.367a.757.757 0 0 1-.758-.758V9a.75.75 0 1 1 0-1.5h.742ZM9 5.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h18v18H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+.setting-item.style-settings-heading[data-id=Components] .style-settings-collapse-indicator::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' fill='none' viewBox='0 0 18 18'%3e%3cg clip-path='url(%23a)'%3e%3cpath stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M4.125 6.375 6.75 9l-2.625 2.625L1.5 9l2.625-2.625ZM9 1.5l2.625 2.625L9 6.75 6.375 4.125 9 1.5Zm4.875 4.875L16.5 9l-2.625 2.625L11.25 9l2.625-2.625ZM9 11.25l2.625 2.625L9 16.5l-2.625-2.625L9 11.25Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h18v18H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+.setting-item.style-settings-heading[data-id=Appearance-light] .style-settings-collapse-indicator::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' fill='none' viewBox='0 0 18 18'%3e%3cg clip-path='url(%23a)'%3e%3cpath fill='black' d='M9 3a.726.726 0 0 1-.535-.216.723.723 0 0 1-.215-.534V1.5c0-.213.072-.391.216-.535A.723.723 0 0 1 9 .75a.73.73 0 0 1 .535.216.723.723 0 0 1 .215.534v.75c0 .212-.072.39-.216.534A.723.723 0 0 1 9 3Zm0 14.25a.726.726 0 0 1-.535-.216.723.723 0 0 1-.215-.534v-.75c0-.213.072-.391.216-.535A.723.723 0 0 1 9 15a.73.73 0 0 1 .535.216.723.723 0 0 1 .215.534v.75a.73.73 0 0 1-.216.535.723.723 0 0 1-.534.215Zm6.75-7.5a.726.726 0 0 1-.535-.216A.723.723 0 0 1 15 9c0-.213.072-.391.216-.535a.723.723 0 0 1 .534-.215h.75a.73.73 0 0 1 .535.216.723.723 0 0 1 .215.534c0 .212-.072.39-.216.534a.723.723 0 0 1-.534.216h-.75Zm-14.25 0a.726.726 0 0 1-.535-.216A.723.723 0 0 1 .75 9c0-.213.072-.391.216-.535A.723.723 0 0 1 1.5 8.25h.75a.73.73 0 0 1 .535.216A.723.723 0 0 1 3 9c0 .212-.072.39-.216.534a.723.723 0 0 1-.534.216H1.5Zm12-5.25a.688.688 0 0 1-.206-.507c0-.2.068-.38.206-.543l.262-.282a.68.68 0 0 1 .525-.225.74.74 0 0 1 .544.225.79.79 0 0 1 .235.554.638.638 0 0 1-.235.534l-.281.262a.699.699 0 0 1-.515.207.732.732 0 0 1-.535-.225ZM3.169 14.83a.784.784 0 0 1-.234-.553.645.645 0 0 1 .234-.535l.28-.262a.7.7 0 0 1 .517-.206.73.73 0 0 1 .534.225.7.7 0 0 1 .206.516.762.762 0 0 1-.206.534l-.263.281a.68.68 0 0 1-.525.225.74.74 0 0 1-.543-.225Zm10.575 0-.263-.281a.7.7 0 0 1-.206-.516.73.73 0 0 1 .225-.534.7.7 0 0 1 .516-.207c.206 0 .384.07.534.207l.281.262a.68.68 0 0 1 .225.525.74.74 0 0 1-.225.544.787.787 0 0 1-.553.235.641.641 0 0 1-.534-.235ZM3.45 4.5l-.281-.263a.68.68 0 0 1-.225-.525.74.74 0 0 1 .225-.544.787.787 0 0 1 .553-.234.638.638 0 0 1 .534.234l.263.282a.7.7 0 0 1 .206.516.728.728 0 0 1-.225.534.688.688 0 0 1-.506.206.821.821 0 0 1-.544-.206Zm5.55 9c-1.25 0-2.313-.438-3.188-1.313S4.5 10.25 4.5 9c0-1.25.437-2.313 1.312-3.188S7.75 4.5 9 4.5c1.25 0 2.312.437 3.187 1.312S13.5 7.75 13.5 9c0 1.25-.438 2.312-1.313 3.187S10.25 13.5 9 13.5ZM9 12c.837 0 1.547-.291 2.128-.873C11.71 10.546 12 9.837 12 9c0-.838-.29-1.547-.872-2.129C10.546 6.29 9.837 6 9 6c-.838 0-1.547.29-2.129.872C6.29 7.453 6 8.162 6 9c0 .837.29 1.547.872 2.128C7.454 11.71 8.162 12 9 12Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h18v18H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+.setting-item.style-settings-heading[data-id=Appearance-dark] .style-settings-collapse-indicator::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' fill='none' viewBox='0 0 18 18'%3e%3cg clip-path='url(%23a)'%3e%3cpath fill='%2309244B' fill-rule='evenodd' d='M9.358 3.41a.758.758 0 0 1 .822-1.057A6.752 6.752 0 0 1 9 15.75a6.752 6.752 0 0 1-6.647-5.57.758.758 0 0 1 1.056-.822 4.5 4.5 0 0 0 5.949-5.949Zm1.803.803a6 6 0 0 1-6.947 6.947A5.252 5.252 0 0 0 14.25 9a5.252 5.252 0 0 0-3.09-4.787ZM4.174 5.787l.047.104c.205.423.527.779.929 1.023l.074.044a.05.05 0 0 1 0 .089l-.074.043c-.402.245-.724.6-.929 1.024l-.047.104a.053.053 0 0 1-.098 0l-.047-.104A2.445 2.445 0 0 0 3.1 7.09l-.074-.043a.05.05 0 0 1 0-.089l.074-.044c.402-.244.724-.6.929-1.023l.047-.104a.053.053 0 0 1 .098 0Zm2.123-3.644a.085.085 0 0 1 .155 0l.076.166c.326.674.84 1.24 1.478 1.629l.118.07a.081.081 0 0 1 0 .14l-.118.07a3.891 3.891 0 0 0-1.554 1.795.085.085 0 0 1-.155 0l-.076-.166a3.892 3.892 0 0 0-1.477-1.629l-.118-.07a.081.081 0 0 1 0-.14l.118-.07a3.892 3.892 0 0 0 1.477-1.629l.076-.166Z' clip-rule='evenodd'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h18v18H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+.setting-item.style-settings-heading[data-id=Editor] .style-settings-collapse-indicator::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' fill='none' viewBox='0 0 18 18'%3e%3cg clip-path='url(%23a)'%3e%3cpath fill='%2309244B' d='M9.75 2.25a.75.75 0 0 1 .087 1.495l-.087.005h-6v10.5h10.5v-6a.75.75 0 0 1 1.495-.087l.005.087v6a1.5 1.5 0 0 1-1.388 1.496l-.112.004H3.75a1.5 1.5 0 0 1-1.496-1.388l-.004-.112V3.75a1.5 1.5 0 0 1 1.388-1.496l.112-.004h6Zm4.682.257a.75.75 0 0 1 1.123.99l-.062.071-7.425 7.425a.75.75 0 0 1-1.123-.99l.062-.07 7.425-7.425Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h18v18H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+.setting-item.style-settings-heading[data-id=Mobile] .style-settings-collapse-indicator::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' fill='none' viewBox='0 0 18 18'%3e%3cg clip-path='url(%23a)'%3e%3cpath fill='%2309244B' d='M12.75 1.5a1.5 1.5 0 0 1 1.496 1.388L14.25 3v12a1.5 1.5 0 0 1-1.388 1.496l-.112.004h-7.5a1.5 1.5 0 0 1-1.496-1.388L3.75 15V3a1.5 1.5 0 0 1 1.388-1.496L5.25 1.5h7.5Zm0 1.5h-7.5v12h7.5V3Zm-3.375 9c.184 0 .337.133.369.308l.006.067v.75a.375.375 0 0 1-.308.369l-.067.006h-.75a.375.375 0 0 1-.369-.308l-.006-.067v-.75c0-.184.133-.337.308-.369L8.625 12h.75Z'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h18v18H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+.setting-item.style-settings-heading[data-id=Plugin] .style-settings-collapse-indicator::after {
+ -webkit-mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' fill='none' viewBox='0 0 18 18'%3e%3cg clip-path='url(%23a)'%3e%3cpath fill='black' fill-rule='evenodd' d='M7.875 3a1.104 1.104 0 0 0-.988 1.597l.122.244a.8.8 0 0 1-.717 1.158H3.75a.75.75 0 0 0-.75.75v.896c1.365-.082 2.625.998 2.625 2.48 0 1.48-1.26 2.56-2.625 2.479v1.645a.75.75 0 0 0 .75.75h1.645c-.081-1.365.999-2.625 2.48-2.625 1.481 0 2.561 1.26 2.48 2.625h.895a.75.75 0 0 0 .75-.75v-2.542a.801.801 0 0 1 1.159-.717l.243.122a1.105 1.105 0 1 0 0-1.975l-.243.122a.8.8 0 0 1-1.16-.717V6.749a.75.75 0 0 0-.75-.75H9.458a.801.801 0 0 1-.717-1.158l.123-.244a1.104 1.104 0 0 0-.988-1.598ZM5.298 4.5c-.237-1.513.922-3 2.577-3 1.654 0 2.814 1.487 2.577 3h.798a2.25 2.25 0 0 1 2.25 2.25v.797c1.513-.237 3 .923 3 2.577s-1.487 2.814-3 2.577v1.548a2.25 2.25 0 0 1-2.25 2.25H9.445a.794.794 0 0 1-.732-1.11l.063-.147a.981.981 0 1 0-1.803 0l.064.148a.796.796 0 0 1-.732 1.11H3.75a2.25 2.25 0 0 1-2.25-2.25v-2.556a.796.796 0 0 1 1.11-.732l.148.064a.982.982 0 0 0 1.25-1.367.981.981 0 0 0-1.25-.436l-.149.064a.796.796 0 0 1-1.11-.732V6.749A2.25 2.25 0 0 1 3.75 4.5h1.549Z' clip-rule='evenodd'/%3e%3c/g%3e%3cdefs%3e%3cclipPath id='a'%3e%3cpath fill='white' d='M0 0h18v18H0z'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e");
+}
+
+
+.setting-item.style-settings-heading:is([data-id=Extended-colors-light], [data-id=Global-background-header-light], [data-id=Foreground-header-light], [data-id=interactive-color-light], [data-id=Miscellaneous-light])+.style-settings-container .setting-item .setting-item-control div.theme-dark,
+.setting-item.style-settings-heading:is([data-id=Extended-colors-dark], [data-id=Global-background-header-dark], [data-id=Foreground-header-dark], [data-id=interactive-color-dark], [data-id=Miscellaneous-dark])+.style-settings-container .setting-item .setting-item-control div.theme-light {
+ display: none;
+}
+
+/*calendar*/
+.day.svelte-q3wqg9:active .filled.svelte-1widvzq,
+.active.svelte-q3wqg9 .filled.svelte-1widvzq,
+.active.today.svelte-q3wqg9 .filled.svelte-1widvzq {
+ fill: var(--text-on-accent);
+}
+
+.today.svelte-q3wqg9 {
+ box-shadow: inset 0 0 0 1px var(--color-accent);
+}
+
+.reset-button.svelte-1vwr9dd.svelte-1vwr9dd {
+ line-height: 16px;
+}
+
+.workspace-leaf-content[data-type=calendar] .view-content {
+ padding: 8px 0 0;
+}
+
+#calendar-container {
+ padding: 0 var(--size-4-4);
+}
+
+/*surfing*/
+
+body.Surfing-bookmark-bar-hide .workspace-leaf-content[data-type="surfing-view"] .wb-bookmark-bar {
+ display: none;
+}
+
+body.Surfing-bookmark-bar-hide .workspace-leaf-content[data-type="surfing-view"] .wb-view-content:has(.wb-bookmark-bar) .wb-frame {
+ height: calc(100%);
+}
+
+
+/* make.md */
+.mk-blink-preview {
+ border-color: var(--divider-color);
+}
+
+.mk-blink-modal .mk-options-menu__search input {
+ border-bottom: 2px solid var(--color-accent);
+}
+
+/* checklist */
+.compact.svelte-sx5ktw>.content.svelte-sx5ktw {
+ --checklist-contentPadding--compact: 4px 2px;
+}
+
+li.svelte-sx5ktw.svelte-sx5ktw {
+ --checklist-listItemMargin: 0 0 4px;
+ --checklist-listItemBackground: transparent;
+ --checklist-listItemBackground--hover: var(--background-modifier-hover);
+}
+
+svg.settings.button.svelte-9fjno5 {
+ background-color: currentColor;
+ -webkit-mask-image: url('data:image/svg+xml;utf8, ')
+}
+
+.checkbox.svelte-1wagsqu {
+ --checklist-checkboxSize: var(--checkbox-size);
+ --checklist-checkboxBorder: 2px solid var(--text-muted);
+ --checklist-checkboxCheckedSize: 8px;
+ --checklist-listItemBorderRadius: var(--radius-s);
+}
+
+body.colorful-checkbox li.svelte-sx5ktw.svelte-sx5ktw:nth-child(8n+1) .checkbox.svelte-1wagsqu {
+ --checklist-checkboxBorder: 2px solid var(--color-red);
+}
+
+body.colorful-checkbox li.svelte-sx5ktw.svelte-sx5ktw:nth-child(8n+2) .checkbox.svelte-1wagsqu {
+ --checklist-checkboxBorder: 2px solid var(--color-green);
+}
+
+body.colorful-checkbox li.svelte-sx5ktw.svelte-sx5ktw:nth-child(8n+3) .checkbox.svelte-1wagsqu {
+ --checklist-checkboxBorder: 2px solid var(--color-orange);
+}
+
+body.colorful-checkbox li.svelte-sx5ktw.svelte-sx5ktw:nth-child(8n+4) .checkbox.svelte-1wagsqu {
+ --checklist-checkboxBorder: 2px solid var(--color-yellow);
+}
+
+body.colorful-checkbox li.svelte-sx5ktw.svelte-sx5ktw:nth-child(8n+5) .checkbox.svelte-1wagsqu {
+ --checklist-checkboxBorder: 2px solid var(--color-cyan);
+}
+
+body.colorful-checkbox li.svelte-sx5ktw.svelte-sx5ktw:nth-child(8n+6) .checkbox.svelte-1wagsqu {
+ --checklist-checkboxBorder: 2px solid var(--color-blue);
+}
+
+body.colorful-checkbox li.svelte-sx5ktw.svelte-sx5ktw:nth-child(8n+7) .checkbox.svelte-1wagsqu {
+ --checklist-checkboxBorder: 2px solid var(--color-purple);
+}
+
+body.colorful-checkbox li.svelte-sx5ktw.svelte-sx5ktw:nth-child(8n+8) .checkbox.svelte-1wagsqu {
+ --checklist-checkboxBorder: 2px solid var(--color-pink);
+}
+
+.checked.svelte-1wagsqu {
+ top: calc(calc(var(--checklist-checkboxSize) - var(--checklist-checkboxCheckedSize) - 2) / 2) !important;
+ left: calc(calc(var(--checklist-checkboxSize) - var(--checklist-checkboxCheckedSize) - 2) / 2) !important;
+}
+
+.checklist-plugin-main .title {
+ font-weight: 400;
+ font-size: 14px;
+}
+
+.search.svelte-rdace4.svelte-rdace4 {
+ box-shadow: 0 0 0 1px var(--background-modifier-border);
+}
+
+.count.svelte-1tzpg3c {
+ --checklist-countBackground: transparent;
+ --checklist-countPadding: 0px
+}
+
+.svg.svelte-9fjno5 {
+ --checklist-iconSize: 20px
+}
+
+.search.svelte-rdace4.svelte-rdace4 {
+ --checklist-searchBackground: transparent;
+ --checklist-listItemBorderRadius: var(--input-radius);
+}
+
+.toggle.svelte-sx5ktw.svelte-sx5ktw:hover {
+ opacity: 1 !important;
+}
+
+/* Text Generator */
+.modelTitle {
+ display: none;
+}
+
+/* callout manager */
+body:not(.is-mobile):not(.mod-macos):not(.mod-windows):not(.mod-linux) .workspace::before,
+body:not(.is-mobile):not(.mod-macos):not(.mod-windows):not(.mod-linux) .app-container::before {
+ display: none !important;
+}
\ No newline at end of file
diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json
new file mode 100644
index 0000000..4308a6d
--- /dev/null
+++ b/.obsidian/workspace.json
@@ -0,0 +1,137 @@
+{
+ "main": {
+ "id": "d8a9c21bb33e2f25",
+ "type": "split",
+ "children": [
+ {
+ "id": "573586949ed91bbb",
+ "type": "tabs",
+ "children": [
+ {
+ "id": "f424c41e63078b46",
+ "type": "leaf",
+ "state": {
+ "type": "markdown",
+ "state": {
+ "file": "docs/chapter1/dataset_tour/datasets.md",
+ "mode": "source",
+ "backlinks": false,
+ "source": false
+ },
+ "icon": "lucide-file",
+ "title": "datasets"
+ }
+ }
+ ]
+ }
+ ],
+ "direction": "vertical"
+ },
+ "left": {
+ "id": "be9138204cd9df0a",
+ "type": "split",
+ "children": [
+ {
+ "id": "d1e806fcaddf5e8a",
+ "type": "tabs",
+ "children": [
+ {
+ "id": "9944f69131eca24e",
+ "type": "leaf",
+ "state": {
+ "type": "file-explorer",
+ "state": {
+ "sortOrder": "alphabetical"
+ },
+ "icon": "lucide-folder-closed",
+ "title": "文件列表"
+ }
+ }
+ ]
+ }
+ ],
+ "direction": "horizontal",
+ "width": 309.5
+ },
+ "right": {
+ "id": "c1fee1dbd3cfa601",
+ "type": "split",
+ "children": [
+ {
+ "id": "ab946acff5eabd23",
+ "type": "tabs",
+ "children": [
+ {
+ "id": "2b3e4c969af51de1",
+ "type": "leaf",
+ "state": {
+ "type": "outline",
+ "state": {
+ "file": "docs/chapter1/dataset_tour/datasets.md"
+ },
+ "icon": "lucide-list",
+ "title": "datasets 的大纲"
+ }
+ }
+ ]
+ }
+ ],
+ "direction": "horizontal",
+ "width": 213.5,
+ "collapsed": true
+ },
+ "left-ribbon": {
+ "hiddenItems": {
+ "command-palette:打开命令面板": false
+ }
+ },
+ "active": "f424c41e63078b46",
+ "lastOpenFiles": [
+ "data.parquet",
+ "sample_data.arrow",
+ "docs/chapter1/dataset_tour/imgs/cmrc_split.png",
+ "docs/chapter1/dataset_tour/datasets.md",
+ "main.py",
+ "main.ipynb",
+ "mkdocs.yml",
+ "docs/rep_index/unlock-hf.smm",
+ "docs/rep_index/nav.png",
+ "docs/rep_index/map.png",
+ "docs/rep_index/images_brand_logos_hf-logo-with-white-title.png",
+ "docs/rep_index",
+ "docs/index.md",
+ "docs/chapter8/repositories/imgs/transformers.png",
+ "docs/chapter8/repositories/imgs/structure_mindmap.png",
+ "docs/chapter8/repositories/assests/structure_mindmap.pdf",
+ "docs/chapter8/repositories/assests/structure_mindmap.drawio",
+ "docs/chapter8/repositories/imgs",
+ "docs/chapter8/repositories/repositories.md",
+ "docs/chapter8/repositories/assests",
+ "docs/chapter8/repositories_index.md",
+ "docs/chapter7/gradio/imgs/visible.png",
+ "docs/chapter7/gradio/imgs/show_progress.png",
+ "docs/chapter7/gradio/imgs/row.png",
+ "docs/chapter7/gradio/imgs/nesting.png",
+ "docs/chapter7/gradio/gradio_tour.md",
+ "docs/chapter7/gradio/gradio_layout.md",
+ "docs/chapter7/gradio_index.md",
+ "docs/chapter6/translation/translation.md",
+ "docs/chapter6/text-summary/text-summary.md",
+ "docs/chapter6/mlcoftc/multi-label-classification-of-toxic-comments.md",
+ "docs/chapter6/ddpm-unet-mnist/ddpm-unet-mnist.md",
+ "docs/chapter6/container-detr/container-detr.md",
+ "docs/chapter6/code_index.md",
+ "docs/chapter5/diffusers_index.md",
+ "docs/chapter1/features_tour/features_tour.md",
+ "docs/chapter1/custom_dataset/custom_dataset.md",
+ "docs/chapter1/arrow_tour/arrow_tour.md",
+ "docs/chapter1/datasets_index.md",
+ "docs/appendix/env_config/env.md",
+ "docs/appendix/tensorboard/TensorBoard.md",
+ "docs/appendix/appendix_index.md",
+ "docs/_sidebar.md",
+ "docs/chapter2/trainer/callbacks/callbacks.md",
+ "百度实习面试 6798c2df28c44cd5aee43850fef52936.md",
+ "docs/chapter1/datasets.md"
+ ]
+}
\ No newline at end of file
diff --git a/.obsidian/workspaces.json b/.obsidian/workspaces.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/.obsidian/workspaces.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/docs/chapter1/dataset_tour/datasets.md b/docs/chapter1/dataset_tour/datasets.md
index 00ff537..143b02d 100644
--- a/docs/chapter1/dataset_tour/datasets.md
+++ b/docs/chapter1/dataset_tour/datasets.md
@@ -191,14 +191,15 @@ Dataset({
## Dataset 方法介绍
### `add_column` 方法
+
该方法向数据集中增加一列数据。以下是该方法的参数表格。
-| 参数 | 数据类型 | 默认值 | 说明 |
-| ----------------- | ----------------------- | ------ | ------- |
-| `name` | `str` | | 列名 |
+| 参数名称 | 数据类型 | 默认值 | 说明 |
+| ----------------- | ----------------------- | ------ | -------------- |
+| `name` | `str` | | 列名 |
| `column` | `list` or `numpy.array` | | 所要添加的数据 |
-| `new_fingerprint` | | | |
-| `feature` | `FeatureType` or `None` | `None` | 列数据类型 |
+| `new_fingerprint` | | | |
+| `feature` | `FeatureType` or `None` | `None` | 列数据类型 |
```python
from datasets import load_dataset
@@ -236,6 +237,232 @@ ds.add_column(name="new_column", column=new_column)
| bielinsky is a filmmaker of impressive talent | 1 | bielinsky is a filmmaker of impressive talent |
| $\cdots$ | $\cdots$ | $\cdots$ |
-!!! bug "注意"
- 确保添加的数据和原数据的数目一致,否则会出现错误:
- `ValueError: Failed to concatenate on axis=1 because tables don't have the same number of rows`
\ No newline at end of file
+!!! Bug "注意"
+ 确保添加的数据和原数据的数目一致,否则抛出错误:`ValueError: Failed to concatenate on axis=1 because tables don't have the same number of rows`。
+
+### `add_item` 方法
+
+该方法向数据集中增加一条数据。以下是该方法的参数表格。
+
+| 参数名称 | 数据类型 | 默认值 | 说明 |
+| -------- | -------- | ------ | ------------------ |
+| `item` | `dict` | | 要添加的数据样本。 |
+
+现在调用 `add_item` 方法向原有数据增加一条数据。
+
+```python
+from datasets import load_dataset
+ds = load_dataset("rotten_tomatoes", split="validation")
+new_review = {'label': 0, 'text': 'this movie is the absolute worst thing I have ever seen'}
+ds = ds.add_item(new_review)
+```
+
+```python title="ds[-1]"
+{
+ "text": "this movie is the absolute worst thing I have ever seen",
+ "label": 0
+}
+```
+
+### `from_pandas` 方法
+
+该方法利用 `pandas.DataFrame` 创建数据集。以下是该方法的参数表格。
+
+| 参数名称 | 数据类型 | 默认值 | 说明 |
+| ---------------- | ------------------ | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `df` | `pandas.DataFrame` | | 包含数据集的 `DataFrame`。 |
+| `features` | `Features` | `None` | 数据集特征。 |
+| `info` | `DatasetInfo` | `None` | 数据集信息。 |
+| `split` | `NamedSplit` | `None` | 数据集分割的名称。 |
+| `preserve_index` | `bool` | `None` | 是否将索引存储为结果中一个附加列。如果为 `None`,则将索引存储为一列,除了 `RangeIndex` 之外会作为元数据。使用 `preserve_index=True` 强制存储为一列。 |
+
+下面创建 `DataFrame` 数据案例。
+
+```python
+import pandas as pd
+
+df = pd.DataFrame({"text": ["Hello", "World"], "label": [0, 1]})
+```
+
+使用方法 `from_pandas` 从 `DataFrame` 创建数据集。
+
+```python
+from datasets import Dataset
+
+ds = Dataset.from_pandas(df)
+```
+
+```python title="ds"
+Dataset(
+ {
+ features: ["text", "label"],
+ num_rows: 2,
+ }
+)
+```
+
+### `from_dict` 方法
+
+该方法将字典转换为 `pyarrow.Table` 以创建数据集。以下是该方法的参数表格。
+
+| 参数名称 | 类型 | 默认值 | 说明 |
+| -------- | ------------- | ------ | ------------------------------------ |
+| mapping | `Mapping` | | 字符串到数组或 `python` 列表的映射。 |
+| features | `Features` | `None` | 数据集特征。 |
+| info | `DatasetInfo` | `None` | 数据集信息。 |
+| split | `NamedSplit` | `None` | 数据集分割的名称。 |
+
+```python title="mapping"
+mapping = {
+ "product_id": [101, 102, 103, 104],
+ "product_name": ["Laptop", "Smartphone", "Tablet", "Headphones"],
+ "price": [999.99, 499.99, 299.99, 89.99],
+ "stock_quantity": [20, 35, 50, 100],
+}
+```
+
+下面的代码是利用方法 `from_dict` 最基础的创建方式,只需要传入格式为字典的数据即可。转换过程中,方法会自动推测每列的数据类型。
+
+```python
+ds = Dataset.from_dict(mapping)
+```
+
+下面的代码是在基础代码上又传入特征类型 `features`,作用是:指定数据类型,确保数据一致性和优化加载性能,同时可以避免数据类型推断错误,尤其是当数据复杂时(例如有嵌套结构或非标准类型)。
+
+```python
+from datasets import Features, Value
+
+features = Features(
+ {
+ "product_id": Value("int64"),
+ "product_name": Value("string"),
+ "price": Value("float"),
+ "stock_quantity": Value("int64"),
+ }
+)
+ds = Dataset.from_dict(mapping, features=features)
+```
+
+```python title="ds.features"
+{
+ "product_id": Value(dtype="int64", id=None),
+ "product_name": Value(dtype="string", id=None),
+ "price": Value(dtype="float32", id=None),
+ "stock_quantity": Value(dtype="int64", id=None),
+}
+```
+
+下面的代码是在基础代码上加入描述和引用信息 `info`,方便数据集文档化和展示详细信息。
+
+```python
+from datasets import DatasetInfo
+
+info = DatasetInfo(
+ description="包含四种电子商品的ID、名称、价格和库存数量的信息数据集",
+ citation="数据来源:Example Corporation",
+)
+ds = Dataset.from_dict(mapping, info=info)
+```
+
+```python title="ds.info"
+DatasetInfo(
+ description="包含四种电子商品的ID、名称、价格和库存数量的信息数据集",
+ citation="数据来源:Example Corporation",
+ homepage="",
+ license="",
+ features={
+ "product_id": Value(dtype="int64", id=None),
+ "product_name": Value(dtype="string", id=None),
+ "price": Value(dtype="float64", id=None),
+ "stock_quantity": Value(dtype="int64", id=None),
+ },
+ post_processed=None,
+ supervised_keys=None,
+ builder_name=None,
+ dataset_name=None,
+ config_name=None,
+ version=None,
+ splits=None,
+ download_checksums=None,
+ download_size=None,
+ post_processing_size=None,
+ dataset_size=None,
+ size_in_bytes=None,
+)
+```
+
+下面的代码是在基础代码上加入数据集分割信息 `split`,用于将数据集分为训练集、测试集或验证集。
+
+```python
+ds_train = Dataset.from_dict(mapping, split="train")
+ds_test = Dataset.from_dict(mapping, split="test")
+```
+
+### `from_generator` 方法
+
+| 参数名称 | 类型 | 默认值 | 说明 |
+| ---------------- | ------------ | ------------------------------- | -------------------------------------------------------------------------------------------------- |
+| `generator` | `Callable` | | 生成器函数,用于逐个生成数据实例,迭代每条数据。 |
+| `features` | `Features` | `None` | 数据特征类型。 |
+| `cache_dir` | `str` | `~/.cache/huggingface/datasets` | 缓存目录,用于保存下载的数据。可以指定不同位置,以便管理和存储大规模数据集。 |
+| `keep_in_memory` | `bool` | `False` | 是否将数据保存在内存中。若设置为 `True`,数据将被加载至内存,适合小数据集处理。 |
+| `gen_kwargs` | `dict` | `None` | 传递给生成器函数的关键字参数字典。可以定义分片数据集,适合大数据分布式处理场景。 |
+| `num_proc` | `int` | `None` | 本地下载或生成数据集时使用的进程数。启用多进程可以加速多文件数据集的加载,适合分布式数据处理场景。 |
+| `split` | `NamedSplit` | `Split.TRAIN` | 数据集分割的名称。 |
+| `kwargs` | | | 传递给 `GeneratorConfig` 的其他关键字参数,用于进一步配置生成器。 |
+
+下面的代码是利用方法 `from_generator` 从迭代器创建数据的基础案例。
+
+```python
+from datasets import Dataset
+
+def gen():
+ yield {"text": "Good", "label": 0}
+ yield {"text": "Bad", "label": 1}
+
+
+ds = Dataset.from_generator(gen)
+```
+
+```python title="ds"
+Generating train split: 2 examples [00:00, 660.16 examples/s]
+
+{
+ 'features': {
+ 'text': ['Good', 'Bad'],
+ 'label': [0, 1]
+ },
+ 'num_rows': 2
+}
+```
+
+### `data` 方法
+
+该方法会返回数据集的底层数据结构(由 `Apache Arrow ` 库提供的表格格式)。
+
+```python
+from datasets import load_dataset
+
+ds = load_dataset("rotten_tomatoes", split="validation")
+```
+
+```python title="ds"
+MemoryMappedTable
+text: string
+label: int64
+----
+text: [["compassionately explores the seemingly irreconcilable situation between conservative christian parents and their estranged gay and lesbian children .","the soundtrack alone is worth the price of admission .","rodriguez does a splendid job of racial profiling hollywood style--casting excellent latin actors of all ages--a trend long overdue .","beneath the film's obvious determination to shock at any cost lies considerable skill and determination , backed by sheer nerve .","bielinsky is a filmmaker of impressive talent .",...,"the movie does such an excellent job of critiquing itself at every faltering half-step of its development that criticizing feels more like commiserating .","i found it slow , predictable and not very amusing .","director yu seems far more interested in gross-out humor than in showing us well-thought stunts or a car chase that we haven't seen 10 , 000 times .","viewers will need all the luck they can muster just figuring out who's who in this pretentious mess .","a pint-sized 'goodfellas' designed to appeal to the younger set , it's not a very good movie in any objective sense , but it does mostly hold one's interest ."],["get out your pooper-scoopers .","while the material is slight , the movie is better than you might think .","it's definitely not made for kids or their parents , for that matter , and i think even fans of sandler's comic taste may find it uninteresting .","sheridan seems terrified of the book's irreverent energy , and scotches most of its élan , humor , bile , and irony .","more busy than exciting , more frantic than involving , more chaotic than entertaining .",...,"this picture is murder by numbers , and as easy to be bored by as your abc's , despite a few whopping shootouts .","hilarious musical comedy though stymied by accents thick as mud .","if you are into splatter movies , then you will probably have a reasonably good time with the salton sea .","a dull , simple-minded and stereotypical tale of drugs , death and mind-numbing indifference on the inner-city streets .","the feature-length stretch . . . strains the show's concept ."]]
+label: [[1,1,1,1,1,...,0,0,0,0,0],[0,0,0,0,0,...,0,0,0,0,0]]
+```
+
+### `cache_files` 方法
+
+该方法会返回数据集的缓存地址。
+
+```python title="ds.cache_files"
+[
+ {
+ "filename": "/root/.cache/huggingface/datasets/rotten_tomatoes/default/0.0.0/aa13bc287fa6fcab6daf52f0dfb9994269ffea28/rotten_tomatoes-validation.arrow"
+ }
+]
+```