4180 lines
659 KiB
JavaScript
4180 lines
659 KiB
JavaScript
/*
|
||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||
if you want to view the source, please visit the github repository of this plugin
|
||
*/
|
||
|
||
var __create = Object.create;
|
||
var __defProp = Object.defineProperty;
|
||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||
var __getProtoOf = Object.getPrototypeOf;
|
||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||
var __commonJS = (cb, mod) => 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");
|
||
}
|
||
function taboutCursorInPairedString(input, cursorPosition, symbolPairs) {
|
||
let stack = [];
|
||
let fail = { isSuccess: false, newPosition: 0 };
|
||
for (let i = 0; i < cursorPosition; i++) {
|
||
for (const { left: open, right: close } of symbolPairs) {
|
||
if (input.startsWith(open, i) && (open !== close || stack.lastIndexOf(open) === -1)) {
|
||
stack.push(open);
|
||
i += open.length - 1;
|
||
} else if (input.startsWith(close, i) && stack.length > 0) {
|
||
const lastOpenIndex = stack.lastIndexOf(open);
|
||
if (lastOpenIndex !== -1) {
|
||
stack = stack.slice(0, lastOpenIndex);
|
||
}
|
||
i += close.length - 1;
|
||
}
|
||
}
|
||
}
|
||
if (stack.length === 0) {
|
||
return fail;
|
||
}
|
||
let tempStack = [];
|
||
for (let i = cursorPosition; i < input.length; i++) {
|
||
for (const { left: open, right: close } of symbolPairs) {
|
||
if (input.startsWith(open, i) && (open !== close || stack.lastIndexOf(open) === -1 && tempStack.lastIndexOf(open) === -1)) {
|
||
tempStack.push(open);
|
||
i += open.length - 1;
|
||
} else if (input.startsWith(close, i)) {
|
||
const lastOpenIndex = tempStack.lastIndexOf(open);
|
||
if (lastOpenIndex === -1 && stack.lastIndexOf(open) !== -1) {
|
||
return { isSuccess: true, newPosition: cursorPosition === i ? i + close.length : i };
|
||
} else if (lastOpenIndex !== -1) {
|
||
tempStack = tempStack.slice(0, lastOpenIndex);
|
||
}
|
||
i += close.length - 1;
|
||
}
|
||
}
|
||
}
|
||
return fail;
|
||
}
|
||
|
||
// 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("<br>")) {
|
||
if (regStrictSpaceStart.test(content))
|
||
txtStartSpaceSate = 2 /* strict */;
|
||
else
|
||
txtStartSpaceSate = 1 /* soft */;
|
||
}
|
||
if (regEndWithSpace.test(content) || content.endsWith("<br>")) {
|
||
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(?<!#)#[\\u4e00-\\u9fa5\\w-\\/]+|++",
|
||
debug: false,
|
||
userSelRepRuleTrigger: ["-", "#"],
|
||
userSelRepRuleValue: [{ left: "~~", right: "~~" }, { left: "#", right: " " }],
|
||
userDeleteRulesStrList: [["demo|", "|"]],
|
||
userConvertRulesStrList: [[":)|", "\u{1F600}|"]],
|
||
userSelRuleSettingsOpen: true,
|
||
userDelRuleSettingsOpen: true,
|
||
userCvtRuleSettingsOpen: true,
|
||
EnterTwice: false,
|
||
TryFixChineseIM: true,
|
||
PuncRectify: false,
|
||
FixMacOSContextMenu: false,
|
||
TryFixMSIME: false
|
||
};
|
||
var locale5 = en_US_default;
|
||
var EasyTypingSettingTab = class extends import_obsidian2.PluginSettingTab {
|
||
constructor(app, plugin) {
|
||
super(app, plugin);
|
||
this.plugin = plugin;
|
||
}
|
||
display() {
|
||
const { containerEl } = this;
|
||
if (import_obsidian2.moment.locale() == "zh" || import_obsidian2.moment.locale() == "zh-cn") {
|
||
locale5 = zh_CN_default;
|
||
} else if (import_obsidian2.moment.locale().toLowerCase() == "zh-tw") {
|
||
locale5 = zh_TW_default;
|
||
} else if (import_obsidian2.moment.locale() == "ru") {
|
||
locale5 = ru_RU_default;
|
||
}
|
||
containerEl.empty();
|
||
containerEl.createEl("h1", { text: locale5.headers.main });
|
||
containerEl.createEl("p", { text: locale5.headers.githubDetail }).createEl("a", {
|
||
text: "easy-typing-obsidian",
|
||
href: "https://github.com/Yaozhuwa/easy-typing-obsidian"
|
||
});
|
||
containerEl.createEl("h2", { text: locale5.headers.enhancedEditing });
|
||
new import_obsidian2.Setting(containerEl).setName(locale5.settings.symbolAutoPair.name).setDesc(locale5.settings.symbolAutoPair.desc).addToggle((toggle) => {
|
||
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;
|
||
}
|
||
}
|
||
} else {
|
||
let taboutRes = taboutCursorInPairedString(line.text, pos - line.from, this.TaboutPairStrs);
|
||
if (taboutRes.isSuccess) {
|
||
view.dispatch({
|
||
selection: { anchor: taboutRes.newPosition + line.from }
|
||
});
|
||
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: ">" }],
|
||
['"', { left: '"', right: '"' }],
|
||
["'", { left: "'", right: "'" }],
|
||
["\u300C", { left: "\u300C", right: "\u300D" }],
|
||
["\u300E", { left: "\u300E", right: "\u300F" }]
|
||
];
|
||
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/IHNpZ24gKyBhcmcgKyBwYWQgOiAocGFkX2NoYXJhY3RlciA9PT0gJzAnID8gc2lnbiArIHBhZCArIGFyZyA6IHBhZCArIHNpZ24gKyBhcmcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICB2YXIgc3ByaW50Zl9jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICAgIGZ1bmN0aW9uIHNwcmludGZfcGFyc2UoZm10KSB7XG4gICAgICAgIGlmIChzcHJpbnRmX2NhY2hlW2ZtdF0pIHtcbiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmX2NhY2hlW2ZtdF1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZm10ID0gZm10LCBtYXRjaCwgcGFyc2VfdHJlZSA9IFtdLCBhcmdfbmFtZXMgPSAwXG4gICAgICAgIHdoaWxlIChfZm10KSB7XG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gcmUudGV4dC5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaChtYXRjaFswXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLm1vZHVsby5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaCgnJScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSByZS5wbGFjZWhvbGRlci5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMVxuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRfbGlzdCA9IFtdLCByZXBsYWNlbWVudF9maWVsZCA9IG1hdGNoWzJdLCBmaWVsZF9tYXRjaCA9IFtdXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXkuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlcGxhY2VtZW50X2ZpZWxkID0gcmVwbGFjZW1lbnRfZmllbGQuc3Vic3RyaW5nKGZpZWxkX21hdGNoWzBdLmxlbmd0aCkpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXlfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmluZGV4X2FjY2Vzcy5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPSBmaWVsZF9saXN0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJnX25hbWVzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9ubzogICAgbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduOiAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcjogICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246ICAgbWF0Y2hbN10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAgbWF0Y2hbOF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXInKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZtdCA9IF9mbXQuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3ByaW50Zl9jYWNoZVtmbXRdID0gcGFyc2VfdHJlZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGV4cG9ydCB0byBlaXRoZXIgYnJvd3NlciBvciBub2RlLmpzXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHNbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgZXhwb3J0c1sndnNwcmludGYnXSA9IHZzcHJpbnRmXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3dbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgd2luZG93Wyd2c3ByaW50ZiddID0gdnNwcmludGZcblxuICAgICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICAgICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgJ3NwcmludGYnOiBzcHJpbnRmLFxuICAgICAgICAgICAgICAgICAgICAndnNwcmludGYnOiB2c3ByaW50ZlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBxdW90ZS1wcm9wcyAqL1xufSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4iLCAiaW1wb3J0IHtFZGl0b3IsIE1hcmtkb3duVmlldywgTWVudSwgTm90aWNlLCBQbGF0Zm9ybSwgUGx1Z2luLCBXb3Jrc3BhY2VMZWFmfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge0VkaXRvclNlbGVjdGlvbiwgRWRpdG9yU3RhdGUsIFByZWMsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblNwZWN9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7Q29udmVydFJ1bGUsIERFRkFVTFRfU0VUVElOR1MsIEVhc3lUeXBpbmdTZXR0aW5ncywgRWFzeVR5cGluZ1NldHRpbmdUYWIsIFBhaXJTdHJpbmd9IGZyb20gXCIuL3NldHRpbmdzXCJcbmltcG9ydCB7RWRpdG9yVmlldywga2V5bWFwLCBWaWV3VXBkYXRlfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcbmltcG9ydCB7XG5cdGdldFR5cGVTdHJPZlRyYW5zYWMsXG5cdG9mZnNldFRvUG9zLFxuXHRwcmludCxcblx0cnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QsXG5cdHN0cmluZzJwYWlyc3RyaW5nLFxuXHRpc1JlZ2V4cCxcblx0cmVwbGFjZVBsYWNlaG9sZGVycyxcblx0cGFyc2VUaGVBZnRlclBhdHRlcm4sXG5cdHRhYm91dEN1cnNvckluUGFpcmVkU3RyaW5nLFxufSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHtnZXRQb3NMaW5lVHlwZSwgZ2V0UG9zTGluZVR5cGUyLCBMaW5lRm9ybWF0ZXIsIExpbmVUeXBlfSBmcm9tICcuL2NvcmUnXG5pbXBvcnQge2Vuc3VyZVN5bnRheFRyZWUsIHN5bnRheFRyZWV9IGZyb20gXCJAY29kZW1pcnJvci9sYW5ndWFnZVwiO1xuaW1wb3J0IHsgc2VsZWN0Q29kZUJsb2NrSW5Qb3MsIGlzQ29kZUJsb2NrSW5Qb3MgfSBmcm9tICcuL3N5bnRheCc7XG5pbXBvcnQgeyBjb25zdW1lQW5kR290b05leHRUYWJzdG9wLCB0YWJzdG9wc1N0YXRlRmllbGQsIGlzSW5zaWRlQVRhYnN0b3AsIHJlbW92ZUFsbFRhYnN0b3BzLCBhZGRUYWJzdG9wc0FuZFNlbGVjdCwgYWRkVGFic3RvcHMsIGFkZFRhYnN0b3BzRWZmZWN0LCBpc0luc2lkZUN1clRhYnN0b3AgfSBmcm9tICcuL3RhYnN0b3BzX3N0YXRlX2ZpZWxkJztcbmltcG9ydCB7IHRhYnN0b3BTcGVjc1RvVGFic3RvcEdyb3VwcyB9IGZyb20gJy4vdGFic3RvcCc7XG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWFzeVR5cGluZ1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG5cdHNldHRpbmdzOiBFYXN5VHlwaW5nU2V0dGluZ3M7XG5cdHNlbGVjdGlvblJlcGxhY2VNYXBJbml0YWxEYXRhOiBbc3RyaW5nLCBQYWlyU3RyaW5nXVtdO1xuXHRTZWxlY3Rpb25SZXBsYWNlTWFwOiBNYXA8c3RyaW5nLCBQYWlyU3RyaW5nPjtcblx0U3ltYm9sUGFpcnNNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz47XG5cdGhhbGZUb0Z1bGxTeW1ib2xNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz47XG5cdEJhc2ljQ29udlJ1bGVzOiBDb252ZXJ0UnVsZVtdO1xuXHRGVzJIV1N5bWJvbFJ1bGVzOiBDb252ZXJ0UnVsZVtdO1xuXHRGb3JtYXRlcjogTGluZUZvcm1hdGVyO1xuXHRJbnRyaW5zaWNEZWxldGVSdWxlczogQ29udmVydFJ1bGVbXTtcblx0SW50cmluc2ljQXV0b1BhaXJSdWxlc1BhdGNoOiBDb252ZXJ0UnVsZVtdO1xuXHRDdXJBY3RpdmVNYXJrZG93bjogc3RyaW5nO1xuXG5cdFVzZXJEZWxldGVSdWxlczogQ29udmVydFJ1bGVbXTtcblx0VXNlckNvbnZlcnRSdWxlczogQ29udmVydFJ1bGVbXTtcblx0bGFuZzogc3RyaW5nO1xuXG5cdGNvbXBvc2VfYmVnaW5fcG9zOiBudW1iZXI7XG5cdGNvbXBvc2VfZW5kX3BvczogbnVtYmVyO1xuXHRjb21wb3NlX25lZWRfaGFuZGxlOiBib29sZWFuO1xuXG5cdG9uRm9ybWF0QXJ0aWNsZTogYm9vbGVhbjtcblx0VGFib3V0UGFpclN0cnM6IFBhaXJTdHJpbmdbXTtcblxuXG5cdGFzeW5jIG9ubG9hZCgpIHtcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuXHRcdHRoaXMuc2VsZWN0aW9uUmVwbGFjZU1hcEluaXRhbERhdGEgPSBbXG5cdFx0XHRbXCJcdTMwMTBcIiwgeyBsZWZ0OiBcIltcIiwgcmlnaHQ6IFwiXVwiIH1dLCBbXCJcdUZGRTVcIiwgeyBsZWZ0OiBcIiRcIiwgcmlnaHQ6IFwiJFwiIH1dLCBbXCJcdTAwQjdcIiwgeyBsZWZ0OiBcImBcIiwgcmlnaHQ6IFwiYFwiIH1dLCBbJ1x1MDBBNScsIHsgbGVmdDogXCIkXCIsIHJpZ2h0OiBcIiRcIiB9XSxcblx0XHRcdFtcIlx1MzAwQVwiLCB7IGxlZnQ6IFwiXHUzMDBBXCIsIHJpZ2h0OiBcIlx1MzAwQlwiIH1dLCBbXCJcdTIwMUNcIiwgeyBsZWZ0OiBcIlx1MjAxQ1wiLCByaWdodDogXCJcdTIwMURcIiB9XSwgW1wiXHUyMDFEXCIsIHsgbGVmdDogXCJcdTIwMUNcIiwgcmlnaHQ6IFwiXHUyMDFEXCIgfV0sIFtcIlx1RkYwOFwiLCB7IGxlZnQ6IFwiXHVGRjA4XCIsIHJpZ2h0OiBcIlx1RkYwOVwiIH1dLFxuXHRcdFx0W1wiPFwiLCB7IGxlZnQ6IFwiPFwiLCByaWdodDogXCI+XCIgfV0sIFtcIlxcXCJcIiwgeyBsZWZ0OiBcIlxcXCJcIiwgcmlnaHQ6IFwiXFxcIlwiIH1dLCBbXCInXCIsIHsgbGVmdDogXCInXCIsIHJpZ2h0OiBcIidcIiB9XSxcblx0XHRcdFsnXHUzMDBDJywgeyBsZWZ0OiAnXHUzMDBDJywgcmlnaHQ6ICdcdTMwMEQnIH1dLCBbJ1x1MzAwRScsIHsgbGVmdDogJ1x1MzAwRScsIHJpZ2h0OiAnXHUzMDBGJyB9XSxcblx0XHRdO1xuXHRcdHRoaXMucmVmcmVzaFNlbGVjdGlvblJlcGxhY2VSdWxlKCk7XG5cdFx0dGhpcy5TeW1ib2xQYWlyc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cdFx0bGV0IFN5bWJvbFBhaXJzID0gW1wiXHUzMDEwXHUzMDExXCIsIFwiXHVGRjA4XHVGRjA5XCIsIFwiXHUzMDBBXHUzMDBCXCIsIFwiXHUyMDFDXHUyMDFEXCIsIFwiXHUyMDE4XHUyMDE5XCIsIFwiXHUzMDBDXHUzMDBEXCIsIFwiXHUzMDBFXHUzMDBGXCIsICdbXScsICcoKScsICd7fScsICdcIlwiJywgXCInJ1wiXVxuXHRcdGZvciAobGV0IHBhaXJTdHIgb2YgU3ltYm9sUGFpcnMpIHRoaXMuU3ltYm9sUGFpcnNNYXAuc2V0KHBhaXJTdHIuY2hhckF0KDApLCBwYWlyU3RyLmNoYXJBdCgxKSk7XG5cblx0XHR0aGlzLmhhbGZUb0Z1bGxTeW1ib2xNYXAgPSBuZXcgTWFwKFtcblx0XHRcdFtcIi5cIiwgXCJcdTMwMDJcIl0sXG5cdFx0XHRbXCIsXCIsIFwiXHVGRjBDXCJdLFxuXHRcdFx0Wyc/JywgJ1x1RkYxRiddLFxuXHRcdFx0WychJywgJ1x1RkYwMSddXG5cdFx0XSk7XG5cblx0XHRsZXQgQmFzaWNDb252UnVsZVN0cmluZ0xpc3Q6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW1snXHUwMEI3XHUwMEI3fCcsICdgfGAnXSwgW1wiXHVGRjAxXHUzMDEwXHUzMDEwfFx1MzAxMVwiLCchW1t8XV0nXSxbJ1x1RkYwMVx1MzAxMFx1MzAxMHwnLCAnIVtbfF1dJ10sXG5cdFx0W1wiXHUzMDEwXHUzMDEwfFx1MzAxMVwiLCBcIltbfF1dXCJdLCBbJ1x1MzAxMFx1MzAxMHwnLCBcIltbfF1dXCJdLCBbJ1x1RkZFNVx1RkZFNXwnLCAnJHwkJ10sIFsnJFx1RkZFNXwkJywgXCIkJFxcbnxcXG4kJFwiXSxbJ1x1MDBBNVx1MDBBNXwnLCckfCQnXSwgWyckXHUwMEE1fCQnLCBcIiQkXFxufFxcbiQkXCJdLFtcIiQkfCRcIiwgXCIkJFxcbnxcXG4kJFwiXSwgWyckJHwnLCBcIiR8JFwiXSxcblx0XHRbXCI+XHUzMDBCfFwiLCBcIj4+fFwiXSwgWydcXG5cdTMwMEJ8JywgXCJcXG4+fFwiXSwgW1wiIFx1MzAwQnxcIiwgXCIgPnxcIl0sIFtcIlxcblx1MzAwMXxcIiwgXCJcXG4vfFwiXV07XG5cdFx0dGhpcy5CYXNpY0NvbnZSdWxlcyA9IHJ1bGVTdHJpbmdMaXN0MlJ1bGVMaXN0KEJhc2ljQ29udlJ1bGVTdHJpbmdMaXN0KTtcblx0XHRsZXQgRlcySFdTeW1ib2xSdWxlc1N0ckxpc3Q6IEFycmF5PFtzdHJpbmcsIHN0cmluZ10+ID0gW1tcIlx1MzAwMlx1MzAwMnxcIiwgXCIufFwiXSwgW1wiXHVGRjAxXHVGRjAxfFwiLCBcIiF8XCJdLCBbXCJcdUZGMUJcdUZGMUJ8XCIsIFwiO3xcIl0sIFtcIlx1RkYwQ1x1RkYwQ3xcIiwgXCIsfFwiXSxcblx0XHRbXCJcdUZGMUFcdUZGMUF8XCIsIFwiOnxcIl0sIFsnXHVGRjFGXHVGRjFGfCcsICc/fCddLCBbJ1x1RkYwOFx1RkYwOHxcdUZGMDknLCBcIih8KVwiXSwgWydcdUZGMDhcdUZGMDh8JywgJyh8KSddLCBbXCJcdTIwMUNcdTIwMUN8XHUyMDFEXCIsIFwiXFxcInxcXFwiXCJdLCBbXCJcdTIwMUNcdTIwMUR8XHUyMDFEXCIsIFwiXFxcInxcXFwiXCJdLCBbXCJcdTIwMThcdTIwMTh8XHUyMDE5XCIsIFwiJ3wnXCJdLCBbXCJcdTIwMThcdTIwMTl8XHUyMDE5XCIsIFwiJ3wnXCJdLFxuXHRcdFtcIlx1MzAwQlx1MzAwQnxcIiwgXCI+fFwiXSwgW1wiXHUzMDBBXHUzMDBBfFx1MzAwQlwiLCBcIjx8XCJdLCBbJ1x1MzAwQVx1MzAwQXwnLCBcIjx8XCJdXTtcblx0XHR0aGlzLkZXMkhXU3ltYm9sUnVsZXMgPSBydWxlU3RyaW5nTGlzdDJSdWxlTGlzdChGVzJIV1N5bWJvbFJ1bGVzU3RyTGlzdCk7XG5cdFx0bGV0IGZ3Mmh3X3J1bGVfMDogQ29udmVydFJ1bGUgPSB7YmVmb3JlOntsZWZ0OidcdUZGNUNcdUZGNUMnLCByaWdodDonJ30sIGFmdGVyOntsZWZ0Oid8JywgcmlnaHQ6Jyd9fTtcblx0XHR0aGlzLkZXMkhXU3ltYm9sUnVsZXMucHVzaChmdzJod19ydWxlXzApXG5cblx0XHRsZXQgRGVsZXRlUnVsZXNTdHJMaXN0OiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtbXCIkfCRcIiwgXCJ8XCJdLCBbJz09fD09JywgJ3wnXSwgWyckJFxcbnxcXG4kJCcsIFwifFwiXV07XG5cdFx0dGhpcy5JbnRyaW5zaWNEZWxldGVSdWxlcyA9IHJ1bGVTdHJpbmdMaXN0MlJ1bGVMaXN0KERlbGV0ZVJ1bGVzU3RyTGlzdCk7XG5cblx0XHRsZXQgYXV0b1BhaXJSdWxlc1BhdGNoU3RyTGlzdDogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbW1wiXHUzMDEwXHUzMDExfFx1MzAxMVwiLCBcIlx1MzAxMFx1MzAxMXxcIl0sIFtcIlx1RkYwOFx1RkYwOXxcdUZGMDlcIiwgXCJcdUZGMDhcdUZGMDl8XCJdLFxuXHRcdFtcIjw+fD5cIiwgXCI8PnxcIl0sIFtcIlx1MzAwQVx1MzAwQnxcdTMwMEJcIiwgXCJcdTMwMEFcdTMwMEJ8XCJdLCBbXCJcdTMwMENcdTMwMER8XHUzMDBEXCIsIFwiXHUzMDBDXHUzMDBEfFwiXSwgW1wiXHUzMDBFXHUzMDBGfFx1MzAwRlwiLCBcIlx1MzAwRVx1MzAwRnxcIl0sIFtcIigpfClcIiwgXCIoKXxcIl0sIFsnW118XScsICdbXXwnXSxcblx0XHRbXCJ7fXx9XCIsIFwie318XCJdLCBbXCInJ3wnXCIsIFwiJyd8XCJdLCBbJ1wiXCJ8XCInLCAnXCJcInwnXSxcblx0XHRdO1xuXHRcdHRoaXMuSW50cmluc2ljQXV0b1BhaXJSdWxlc1BhdGNoID0gcnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QoYXV0b1BhaXJSdWxlc1BhdGNoU3RyTGlzdCk7XG5cblx0XHRsZXQgVGFib3V0UGFpclN0cnMgPSBbXCJcdTMwMTB8XHUzMDExXCIsIFwiXHVGRjA4fFx1RkYwOVwiLCBcIlx1MzAwQXxcdTMwMEJcIiwgXCJcdTIwMUN8XHUyMDFEXCIsIFwiXHUyMDE4fFx1MjAxOVwiLCBcblx0XHRcdFx0XHRcdCAgIFwiXHUzMDBDfFx1MzAwRFwiLCBcIlx1MzAwRXxcdTMwMEZcIiwgXCInfCdcIiwgXCJcXFwifFxcXCJcIiwgXCIkJHwkJFwiLCAnJHwkJywgJ19ffF9fJywgJ198XycsXG5cdFx0XHRcdFx0XHRcdFwiPT18PT1cIiwgXCJ+fnx+flwiLCBcIioqfCoqXCIsICcqfConLCBcIltbfF1dXCIsICdbfF0nLFwie3x9XCIsIFwiKHwpXCIsIFwiPHw+XCJdO1xuXHRcdHRoaXMuVGFib3V0UGFpclN0cnMgPSBUYWJvdXRQYWlyU3Rycy5tYXAoKHM6c3RyaW5nKT0+c3RyaW5nMnBhaXJzdHJpbmcocykpO1xuXG5cdFx0dGhpcy5yZWZyZXNoVXNlckRlbGV0ZVJ1bGUoKTtcblx0XHR0aGlzLnJlZnJlc2hVc2VyQ29udmVydFJ1bGUoKTtcblxuXHRcdHRoaXMuQ3VyQWN0aXZlTWFya2Rvd24gPSBcIlwiO1xuXG5cdFx0dGhpcy5jb21wb3NlX25lZWRfaGFuZGxlID0gZmFsc2U7XG5cblx0XHR0aGlzLkZvcm1hdGVyID0gbmV3IExpbmVGb3JtYXRlcigpO1xuXG5cdFx0dGhpcy5vbkZvcm1hdEFydGljbGUgPSBmYWxzZTtcblxuXHRcdHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24oW1xuXHRcdFx0RWRpdG9yU3RhdGUudHJhbnNhY3Rpb25GaWx0ZXIub2YodGhpcy50cmFuc2FjdGlvbkZpbHRlclBsdWdpbiksXG5cdFx0XHRFZGl0b3JWaWV3LnVwZGF0ZUxpc3RlbmVyLm9mKHRoaXMudmlld1VwZGF0ZVBsdWdpbiksXG5cdFx0XHRQcmVjLmhpZ2hlc3QoRWRpdG9yVmlldy5kb21FdmVudEhhbmRsZXJzKHtcblx0XHRcdFx0XCJrZXl1cFwiOiB0aGlzLm9uS2V5dXBcblx0XHRcdH0pKSxcblx0XHRcdHRhYnN0b3BzU3RhdGVGaWVsZC5leHRlbnNpb24sXG5cdFx0XSk7XG5cblxuXHRcdHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24oUHJlYy5oaWdoZXN0KGtleW1hcC5vZihbXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJUYWJcIixcblx0XHRcdFx0cnVuOiAodmlldzogRWRpdG9yVmlldyk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmhhbmRsZVRhYkRvd24odmlldyk7XG5cdFx0XHRcdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJFbnRlclwiLFxuXHRcdFx0XHRydW46ICh2aWV3OiBFZGl0b3JWaWV3KTogYm9vbGVhbiA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc3VjY2VzcyA9IHRoaXMuaGFuZGxlRW50ZXIodmlldyk7XG5cdFx0XHRcdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJNb2QtYVwiLCBcblx0XHRcdFx0cnVuOiAodmlldzogRWRpdG9yVmlldyk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmhhbmRsZU1vZEFJbkNvZGVCbG9jayh2aWV3KTtcblx0XHRcdFx0XHRyZXR1cm4gc3VjY2Vzcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0pKSk7XG5cblx0XHR0aGlzLmxhbmcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmd1YWdlJyk7XG5cdFx0bGV0IGNvbW1hbmRfbmFtZV9tYXAgPSB0aGlzLmdldENvbW1hbmROYW1lTWFwKCk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwiZWFzeS10eXBpbmctZm9ybWF0LWFydGljbGVcIixcblx0XHRcdG5hbWU6IGNvbW1hbmRfbmFtZV9tYXAuZ2V0KFwiZm9ybWF0X2FydGljbGVcIiksXG5cdFx0XHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcblx0XHRcdFx0dGhpcy5mb3JtYXRBcnRpY2xlKGVkaXRvciwgdmlldyk7XG5cdFx0XHR9LFxuXHRcdFx0aG90a2V5czogW3tcblx0XHRcdFx0bW9kaWZpZXJzOiBbJ0N0cmwnLCAnU2hpZnQnXSxcblx0XHRcdFx0a2V5OiBcInNcIlxuXHRcdFx0fV0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwiZWFzeS10eXBpbmctZm9ybWF0LXNlbGVjdGlvblwiLFxuXHRcdFx0bmFtZTogY29tbWFuZF9uYW1lX21hcC5nZXQoXCJmb3JtYXRfc2VsZWN0aW9uXCIpLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMuZm9ybWF0U2VsZWN0aW9uT3JDdXJMaW5lKGVkaXRvciwgdmlldyk7XG5cdFx0XHR9LFxuXHRcdFx0aG90a2V5czogW3tcblx0XHRcdFx0bW9kaWZpZXJzOiBbJ0N0cmwnLCAnU2hpZnQnXSxcblx0XHRcdFx0a2V5OiBcImxcIlxuXHRcdFx0fV0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwiZWFzeS10eXBpbmctZGVsZXRlLWJsYW5rLWxpbmVcIixcblx0XHRcdG5hbWU6IGNvbW1hbmRfbmFtZV9tYXAuZ2V0KFwiZGVsZXRlX2JsYW5rX2xpbmVcIiksXG5cdFx0XHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcblx0XHRcdFx0dGhpcy5kZWxldGVCbGFua0xpbmVzKGVkaXRvcik7XG5cdFx0XHR9LFxuXHRcdFx0aG90a2V5czogW3tcblx0XHRcdFx0bW9kaWZpZXJzOiBbJ0N0cmwnLCAnU2hpZnQnXSxcblx0XHRcdFx0a2V5OiBcImtcIlxuXHRcdFx0fV0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwiZWFzeS10eXBpbmctaW5zZXJ0LWNvZGVibG9ja1wiLFxuXHRcdFx0bmFtZTogY29tbWFuZF9uYW1lX21hcC5nZXQoXCJpbnNlcnRfY29kZWJsb2NrXCIpLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdHRoaXMuY29udmVydDJDb2RlQmxvY2soZWRpdG9yKTtcblx0XHRcdH0sXG5cdFx0XHRob3RrZXlzOiBbe1xuXHRcdFx0XHRtb2RpZmllcnM6IFsnQ3RybCcsICdTaGlmdCddLFxuXHRcdFx0XHRrZXk6IFwiblwiXG5cdFx0XHR9XSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XG5cdFx0XHRpZDogXCJlYXN5LXR5cGluZy1mb3JtYXQtc3dpdGNoXCIsXG5cdFx0XHRuYW1lOiBjb21tYW5kX25hbWVfbWFwLmdldChcInN3aXRjaF9hdXRvZm9ybWF0XCIpLFxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHRoaXMuc3dpdGNoQXV0b0Zvcm1hdHRpbmcoKSxcblx0XHRcdGhvdGtleXM6IFt7XG5cdFx0XHRcdG1vZGlmaWVyczogWydDdHJsJ10sXG5cdFx0XHRcdGtleTogXCJ0YWJcIlxuXHRcdFx0fV0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6IFwiZWFzeS10eXBpbmctcGFzdGUtd2l0aG91dC1mb3JtYXRcIixcblx0XHRcdG5hbWU6IGNvbW1hbmRfbmFtZV9tYXAuZ2V0KFwicGFzdGVfd29fZm9ybWF0XCIpLFxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3IpID0+IHRoaXMubm9ybWFsUGFzdGUoZWRpdG9yKSxcblx0XHRcdGhvdGtleXM6IFtcblx0XHRcdCAge1xuXHRcdFx0XHRtb2RpZmllcnM6IFtcIk1vZFwiLCBcIlNoaWZ0XCJdLFxuXHRcdFx0XHRrZXk6IFwidlwiLFxuXHRcdFx0ICB9LFxuXHRcdFx0XSxcblx0XHQgIH0pO1xuXG5cdFx0Ly8gVGhpcyBhZGRzIGEgc2V0dGluZ3MgdGFiIHNvIHRoZSB1c2VyIGNhbiBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbHVnaW5cblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IEVhc3lUeXBpbmdTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cblx0XHR0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdhY3RpdmUtbGVhZi1jaGFuZ2UnLCAobGVhZjogV29ya3NwYWNlTGVhZikgPT4ge1xuXHRcdFx0aWYgKGxlYWYudmlldy5nZXRWaWV3VHlwZSgpID09ICdtYXJrZG93bicpIHtcblx0XHRcdFx0bGV0IGZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuXHRcdFx0XHRpZiAoZmlsZSAhPSBudWxsICYmIHRoaXMuQ3VyQWN0aXZlTWFya2Rvd24gIT0gZmlsZS5wYXRoKSB7XG5cdFx0XHRcdFx0dGhpcy5DdXJBY3RpdmVNYXJrZG93biA9IGZpbGUucGF0aDtcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Zylcblx0XHRcdFx0XHRcdG5ldyBOb3RpY2UoJ25ldyBtZC1maWxlIG9wZW46ICcgKyBmaWxlLnBhdGgpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KSk7XG5cblx0XHQvL1x1NTIyNFx1NjVBRFx1NUY1M1x1NTI0RFx1NjYyRlx1NTQyNlx1NEUzQU1BQ1x1N0NGQlx1N0VERlxuXHRcdGlmIChQbGF0Zm9ybS5pc01hY09TICYmIHRoaXMuc2V0dGluZ3MuRml4TWFjT1NDb250ZXh0TWVudSkge1xuXHRcdFx0Ly8gXHU2OEMwXHU2RDRCXHU5RjIwXHU2ODA3XHU1M0YzXHU5NTJFXHU1NDdDXHU1MUZBXHU4M0RDXHU1MzU1XHU3Njg0XHU0RThCXHU0RUY2XG5cdFx0XHR0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdlZGl0b3ItbWVudScsIChtZW51OiBNZW51LCBlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdlZGl0b3ItbWVudScsIG1lbnUsIGVkaXRvciwgdmlldyk7XG5cdFx0XHRcdGlmIChlZGl0b3IubGlzdFNlbGVjdGlvbnMoKS5sZW5ndGggIT0gMSkgcmV0dXJuO1xuXHRcdFx0XHRsZXQgc2VsZWN0aW9uID0gZWRpdG9yLmxpc3RTZWxlY3Rpb25zKClbMF07XG5cdFx0XHRcdGxldCBzZWxlY3RlZCA9IGVkaXRvci5nZXRTZWxlY3Rpb24oKTtcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ3NlbGVjdGVkJywgc2VsZWN0ZWQsIHNlbGVjdGVkPT0nXFxuJyk7XG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdzZWxlY3Rpb24nLCBzZWxlY3Rpb24pO1xuXHRcdFx0XHRpZiAoc2VsZWN0ZWQ9PSdcXG4nKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbihzZWxlY3Rpb24uYW5jaG9yLCBzZWxlY3Rpb24uYW5jaG9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSkpO1xuXHRcdH1cblxuXHRcdC8vIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtb3BlbicsIChmaWxlOiBURmlsZSB8IG51bGwpID0+IHtcblx0XHQvLyBcdGlmIChmaWxlICE9IG51bGwpIHtcblx0XHQvLyBcdFx0bGV0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9yKCk7XG5cdFx0Ly8gXHRcdGlmIChlZGl0b3IgPT09IG51bGwpIHJldHVybjtcblx0XHQvLyBcdFx0dGhpcy5Db250ZW50UGFyc2VyLnBhcnNlTmV3QXJ0aWNsZShlZGl0b3IuZ2V0VmFsdWUoKSk7XG5cdFx0Ly8gXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnKSB7XG5cdFx0Ly8gXHRcdFx0bmV3IE5vdGljZShcIkVhc3lUeXBpbmc6IFBhcnNlIE5ldyBBcnRpY2xlOiBcIiArIGZpbGUudmF1bHQuZ2V0TmFtZSgpICsgJy8nICsgZmlsZS5wYXRoKTtcblx0XHQvLyBcdFx0XHQvLyBpZiAodGhpcy5zZXR0aW5ncy5kZWJ1ZykgdGhpcy5Db250ZW50UGFyc2VyLnByaW50KCk7XG5cdFx0Ly8gXHRcdH1cblx0XHQvLyBcdH1cblx0XHQvLyB9KSk7XG5cdFx0Y29uc29sZS5sb2coXCJFYXN5IFR5cGluZyBQbHVnaW4gbG9hZGVkLlwiKVxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0Y29uc29sZS5sb2coXCJFYXN5IFR5cGluZyBQbHVnaW4gdW5sb2FkZWQuXCIpXG5cdH1cblxuXHRnZXREZWZhdWx0SW5kZW50Q2hhciA9ICgpID0+IHtcblx0XHQvLyBjb25zb2xlLmxvZygndXNlVGFiLCB0YWJTaXplJywgdGhpcy5hcHAudmF1bHQuY29uZmlnLnVzZVRhYiwgdGhpcy5hcHAudmF1bHQuY29uZmlnLnRhYlNpemUpO1xuXHRcdGxldCB1c2VUYWIgPSB0aGlzLmFwcC52YXVsdC5jb25maWcudXNlVGFiID09PSB1bmRlZmluZWQgPyB0cnVlIDogZmFsc2U7XG5cdFx0bGV0IHRhYlNpemUgPSB0aGlzLmFwcC52YXVsdC5jb25maWcudGFiU2l6ZSA9PSB1bmRlZmluZWQgPyA0IDogdGhpcy5hcHAudmF1bHQuY29uZmlnLnRhYlNpemU7XG5cdFx0bGV0IGRlZmF1bHRfaW5kZW50ID0gdXNlVGFiID8gJ1xcdCcgOiAnICcucmVwZWF0KHRhYlNpemUpO1xuXHRcdHJldHVybiBkZWZhdWx0X2luZGVudDtcblx0fVxuXG5cdHRyYW5zYWN0aW9uRmlsdGVyUGx1Z2luID0gKHRyOiBUcmFuc2FjdGlvbik6IFRyYW5zYWN0aW9uU3BlYyB8IHJlYWRvbmx5IFRyYW5zYWN0aW9uU3BlY1tdID0+IHtcblx0XHRjb25zdCBjaGFuZ2VzOiBUcmFuc2FjdGlvblNwZWNbXSA9IFtdO1xuXHRcdGlmICghdHIuZG9jQ2hhbmdlZCkgcmV0dXJuIHRyO1xuXHRcdGxldCBzZWxlY3RlZCA9IHRyLnN0YXJ0U3RhdGUuc2VsZWN0aW9uLmFzU2luZ2xlKCkubWFpbi5hbmNob3IgIT0gdHIuc3RhcnRTdGF0ZS5zZWxlY3Rpb24uYXNTaW5nbGUoKS5tYWluLmhlYWQ7XG5cblx0XHRsZXQgY2hhbmdlVHlwZVN0ciA9IGdldFR5cGVTdHJPZlRyYW5zYWModHIpO1xuXG5cdFx0dHIuY2hhbmdlcy5pdGVyQ2hhbmdlcygoZnJvbUEsIHRvQSwgZnJvbUIsIHRvQiwgaW5zZXJ0ZWQpID0+IHtcblx0XHRcdGxldCBjaGFuZ2VkU3RyID0gdHIuc3RhcnRTdGF0ZS5zbGljZURvYyhmcm9tQSwgdG9BKTtcblx0XHRcdGxldCBjaGFuZ2VzdHJfID0gY2hhbmdlZFN0ci5yZXBsYWNlKC9cXHMvZywgJzAnKVxuXHRcdFx0bGV0IGluc2VydGVkU3RyID0gaW5zZXJ0ZWQuc2xpY2VTdHJpbmcoMCk7XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Zylcblx0XHRcdHtcblx0XHRcdFx0Y29uc29sZS5sb2coXCJbVHJhbnNhY3Rpb25GaWx0ZXJdIHR5cGUsIGZyb21BLCB0b0EsIGNoYW5nZWQsIGZyb21CLCB0b0IsIGluc2VydGVkXCIpO1xuXHRcdFx0XHRjb25zb2xlLmxvZyhjaGFuZ2VUeXBlU3RyLCBmcm9tQSwgdG9BLCBjaGFuZ2VkU3RyLGZyb21CLCB0b0IsIGluc2VydGVkU3RyKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gXHU4ODY4XHU2ODNDXHU3RjE2XHU4RjkxXHU2NUY2XHU3NkY0XHU2M0E1XHU4RkQ0XHU1NkRFXHVGRjBDXHU4OUUzXHU1MUIzXHU4ODY4XHU2ODNDXHU1MTg1XHU1QkI5XHU3RjE2XHU4RjkxXHU2NzA5XHU2NUY2XHU1MDE5XHU0RjFBXHU4REYzXHU1MUZBXHU4MDVBXHU3MTI2XHU3MkI2XHU2MDAxXHU3Njg0IEJ1Z1xuXHRcdFx0aWYgKGdldFBvc0xpbmVUeXBlKHRyLnN0YXJ0U3RhdGUsIGZyb21BKT09TGluZVR5cGUudGFibGUpIHJldHVybiB0cjtcblxuXHRcdFx0Ly8gPT09PT09PT09PSBTZWxlY3Rpb24gUmVwbGFjZSA9PT09PT09PT09PT1cblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLlNlbGVjdGlvbkVuaGFuY2UpIHtcblx0XHRcdFx0aWYgKChjaGFuZ2VUeXBlU3RyID09ICdpbnB1dC50eXBlJyB8fCBjaGFuZ2VUeXBlU3RyID09IFwiaW5wdXQudHlwZS5jb21wb3NlXCIpICYmIGZyb21BICE9IHRvQSAmJiAoKGZyb21CICsgMSA9PT0gdG9CKXx8aW5zZXJ0ZWRTdHI9PSdcdTIwMTRcdTIwMTQnfHxpbnNlcnRlZFN0cj09J1x1MjAyNlx1MjAyNicpKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMuU2VsZWN0aW9uUmVwbGFjZU1hcC5oYXMoaW5zZXJ0ZWRTdHIpKSB7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goeyBjaGFuZ2VzOiB7IGZyb206IGZyb21BLCBpbnNlcnQ6IHRoaXMuU2VsZWN0aW9uUmVwbGFjZU1hcC5nZXQoaW5zZXJ0ZWRTdHIpPy5sZWZ0IH0sIHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiIH0pXG5cdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goeyBjaGFuZ2VzOiB7IGZyb206IHRvQSwgaW5zZXJ0OiB0aGlzLlNlbGVjdGlvblJlcGxhY2VNYXAuZ2V0KGluc2VydGVkU3RyKT8ucmlnaHQgfSwgdXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCIgfSlcblx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFx1NTcyOFx1NEVFM1x1NzgwMVx1NTc1N1x1NEUyRFx1N0M5OFx1OEQzNFx1NjVGNlx1NjY3QVx1ODBGRFx1NkRGQlx1NTJBMFx1N0YyOVx1OEZEQlxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuQmV0dGVyQ29kZUVkaXQgJiYgY2hhbmdlVHlwZVN0ci5jb250YWlucygncGFzdGUnKSAmJiBmcm9tQT09ZnJvbUIgJiYgXG5cdFx0XHRcdFx0aXNDb2RlQmxvY2tJblBvcyh0ci5zdGFydFN0YXRlLCBmcm9tQSkpe1xuXHRcdFx0XHRwcmludChcIlx1NjhDMFx1NkQ0Qlx1NTIzMFx1NTcyOFx1NEVFM1x1NzgwMVx1NTc1N1x1NEUyRFx1N0M5OFx1OEQzNFwiKVxuXHRcdFx0XHRsZXQgbGluZSA9IHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmVBdChmcm9tQikudGV4dDtcblx0XHRcdFx0bGV0IGluZGVudF9zcGFjZSA9IGxpbmUubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoO1xuXHRcdFx0XHRsZXQgaW5zZXJ0ZWRfbGluZXMgPSBpbnNlcnRlZFN0ci5zcGxpdCgnXFxuJyk7XG5cdFx0XHRcdGxldCBleHRyYV9pbmRlbnQgPSAnJztcblx0XHRcdFx0aWYoaW5zZXJ0ZWRfbGluZXMubGVuZ3RoPjEpe1xuXHRcdFx0XHRcdGxldCBmaXJzdF9saW5lID0gaW5zZXJ0ZWRfbGluZXNbMF0udHJpbVN0YXJ0KCk7XG5cdFx0XHRcdFx0Ly8gaWYgKGZpcnN0X2xpbmUuZW5kc1dpdGgoJ3snKSB8fCBmaXJzdF9saW5lLmVuZHNXaXRoKCcoJykgfHwgZmlyc3RfbGluZS5lbmRzV2l0aCgnWycpXG5cdFx0XHRcdFx0Ly8gXHR8fCBmaXJzdF9saW5lLmVuZHNXaXRoKCc6Jykpe1xuXHRcdFx0XHRcdC8vIFx0ZXh0cmFfaW5kZW50ID0gdGhpcy5nZXREZWZhdWx0SW5kZW50Q2hhcigpO1xuXHRcdFx0XHRcdC8vIH1cblx0XHRcdFx0XHRsZXQgcmVzdF9saW5lcyA9IGluc2VydGVkX2xpbmVzLnNsaWNlKDEpO1xuXHRcdFx0XHRcdC8vIGZpbmQgdGhlIG1pbmltdW0gaW5kZW50IHNwYWNlIGluIHJlc3QgbGluZXNcblx0XHRcdFx0XHRsZXQgbWluX2luZGVudF9zcGFjZSA9IEluZmluaXR5O1xuXHRcdFx0XHRcdGZvciAobGV0IGxpbmUgb2YgcmVzdF9saW5lcyl7XG5cdFx0XHRcdFx0XHRsZXQgaW5kZW50ID0gbGluZS5tYXRjaCgvXlxccyovKVswXS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRpZiAoIS9eXFxzKiQvLnRlc3QobGluZSkgJiYgaW5kZW50PG1pbl9pbmRlbnRfc3BhY2UpIG1pbl9pbmRlbnRfc3BhY2UgPSBpbmRlbnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGxldCBuZXdfcmVzdF9saW5lcyA9IHJlc3RfbGluZXMubWFwKChsaW5lOnN0cmluZyk9PmxpbmUuc3Vic3RyaW5nKG1pbl9pbmRlbnRfc3BhY2UpKTtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRuZXdfcmVzdF9saW5lcyA9IG5ld19yZXN0X2xpbmVzLm1hcChcblx0XHRcdFx0XHRcdChsaW5lOnN0cmluZyk9PmxpbmUucmVwbGFjZSgvW1xcdF0vZywgdGhpcy5nZXREZWZhdWx0SW5kZW50Q2hhcigpKSk7XG5cdFx0XHRcdFx0bGV0IGZpbmFsX3Jlc3RfbGluZXMgPSBuZXdfcmVzdF9saW5lcy5tYXAoKGxpbmU6c3RyaW5nKT0+JyAnLnJlcGVhdChpbmRlbnRfc3BhY2UpK2V4dHJhX2luZGVudCtsaW5lKTtcblx0XHRcdFx0XHRsZXQgbmV3X2luc2VydGVkU3RyID0gZmlyc3RfbGluZSsnXFxuJytmaW5hbF9yZXN0X2xpbmVzLmpvaW4oJ1xcbicpO1xuXHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzOiB7ZnJvbTogZnJvbUEsIHRvOiB0b0EsIGluc2VydDogbmV3X2luc2VydGVkU3RyfSxcblx0XHRcdFx0XHRcdHNlbGVjdGlvbjoge2FuY2hvcjogZnJvbUErbmV3X2luc2VydGVkU3RyLmxlbmd0aH0sXG5cdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHR9XHRcdFx0XHRcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNlbGVjdGVkKSByZXR1cm4gdHI7XG5cblx0XHRcdC8vIGxldCB0ZXN0X3MgPSBcIlx1MDBBNVwiXG5cdFx0XHQvLyBjb25zb2xlLmxvZyggJ1x1MDBBNScsIHRlc3RfcyA9PSAnXHVGRkU1JylcblxuXHRcdFx0Ly8gXHU1QzFEXHU4QkQ1XHU4OUUzXHU1MUIzXHU1RkFFXHU4RjZGXHU2NUU3XHU3MjQ4XHU4RjkzXHU1MTY1XHU2Q0Q1XHU3Njg0XHU5NUVFXHU5ODk4flxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuVHJ5Rml4TVNJTUUgJiYgXG5cdFx0XHRcdGNoYW5nZVR5cGVTdHIgPT0gXCJpbnB1dC50eXBlLmNvbXBvc2VcIiAmJiBcblx0XHRcdFx0Y2hhbmdlZFN0ciA9PSAnJyAmJiAvXltcXHU0ZTAwLVxcdTlmYTVdKyQvLnRlc3QoaW5zZXJ0ZWRTdHIpKXtcblx0XHRcdFx0cHJpbnQoXCJNUy1JTUUgQ29tcG9zZSBkZXRlY3RlZDpcIiwgaW5zZXJ0ZWRTdHIpO1xuXHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFx1NTIxN1x1ODg2OFx1NEUwQlx1NzY4NFx1NEVFM1x1NzgwMVx1NTc1N1x1NTIyMFx1OTY2NFx1NTI5Rlx1ODBGRFx1NEYxOFx1NTMxNlxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuQmV0dGVyQ29kZUVkaXQgJiYgY2hhbmdlVHlwZVN0ciA9PSBcImRlbGV0ZS5iYWNrd2FyZFwiICYmICFzZWxlY3RlZCAmJiBcblx0XHRcdFx0Z2V0UG9zTGluZVR5cGUodHIuc3RhcnRTdGF0ZSwgdG9BKSA9PSBMaW5lVHlwZS5jb2RlYmxvY2sgJiYgXG5cdFx0XHRcdCh0ci5zdGFydFN0YXRlLnNsaWNlRG9jKGZyb21BLHRvQSkhPSdgJyB8fCBnZXRQb3NMaW5lVHlwZSh0ci5zdGF0ZSwgZnJvbUEpPT1MaW5lVHlwZS5jb2RlYmxvY2spKSB7XG5cdFx0XHRcdGxldCBsaW5lX251bWJlciA9IHRyLnN0YXJ0U3RhdGUuZG9jLmxpbmVBdCh0b0EpLm51bWJlcjtcblx0XHRcdFx0bGV0IGN1cl9saW5lID0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KHRvQSk7XG5cdFx0XHRcdGxldCBsaXN0X2NvZGUgPSBmYWxzZTtcblx0XHRcdFx0bGV0IGxpc3RfY29kZV9pbmRlbnQgPSAwO1xuXHRcdFx0XHRmb3IgKGxldCBpID0gbGluZV9udW1iZXIgLSAxOyBpID49IDE7IGktLSkge1xuXHRcdFx0XHRcdGxldCBsaW5lID0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZShpKTtcblx0XHRcdFx0XHRpZiAoL15cXHMrYGBgLy50ZXN0KGxpbmUudGV4dCkpIHtcblx0XHRcdFx0XHRcdGxpc3RfY29kZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRsaXN0X2NvZGVfaW5kZW50ID0gbGluZS50ZXh0Lm1hdGNoKC9eXFxzKi8pWzBdLmxlbmd0aDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmICgvXmBgYC8udGVzdChsaW5lLnRleHQpKSBicmVhaztcblx0XHRcdFx0XHRlbHNlIGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGxpc3RfY29kZSkge1xuXHRcdFx0XHRcdHByaW50KCdsaXN0X2NvZGUsIGluZGVudDogJywgbGlzdF9jb2RlX2luZGVudCk7XG5cdFx0XHRcdFx0aWYgKHRvQSA9PSBjdXJfbGluZS5mcm9tICsgbGlzdF9jb2RlX2luZGVudCkge1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHsgY2hhbmdlczogeyBmcm9tOiB0ci5zdGFydFN0YXRlLmRvYy5saW5lKGxpbmVfbnVtYmVyLTEpLnRvLCB0bzogdG9BLCBpbnNlcnQ6ICcnIH0sIHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiIH0pO1xuXHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGZyb21BPj1jdXJfbGluZS5mcm9tICYmIGZyb21BIDwgY3VyX2xpbmUuZnJvbStsaXN0X2NvZGVfaW5kZW50ICYmIHRvQT5jdXJfbGluZS5mcm9tK2xpc3RfY29kZV9pbmRlbnQpe1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHsgY2hhbmdlczogeyBmcm9tOiBjdXJfbGluZS5mcm9tK2xpc3RfY29kZV9pbmRlbnQsIHRvOiB0b0EsIGluc2VydDogJycgfSwgdXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCIgfSk7XG5cdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyA9PT09PT09PT09IGRlbGV0ZSBwYWlyIHN5bWJvbCA9PT09PT09PT09PT1cblx0XHRcdGlmIChjaGFuZ2VUeXBlU3RyID09PSBcImRlbGV0ZS5iYWNrd2FyZFwiICYmIHRoaXMuc2V0dGluZ3MuSW50cmluc2ljU3ltYm9sUGFpcnMpIHtcblx0XHRcdFx0aWYgKHRoaXMuU3ltYm9sUGFpcnNNYXAuaGFzKGNoYW5nZWRTdHIpICYmIHRoaXMuU3ltYm9sUGFpcnNNYXAuZ2V0KGNoYW5nZWRTdHIpID09PSB0ci5zdGFydFN0YXRlLnNsaWNlRG9jKHRvQSwgdG9BICsgMSkpIHtcblx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goeyBjaGFuZ2VzOiB7IGZyb206IGZyb21BLCB0bzogdG9BICsgMSB9LCB1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIiB9KTtcblx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFx1NTkwNFx1NzQwNlx1NTIyMFx1OTY2NFx1NEVFM1x1NzgwMVx1NTc1N1xuXHRcdFx0XHRsZXQgbGluZV9jb250ZW50ID0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KHRvQSkudGV4dDtcblx0XHRcdFx0bGV0IG5leHRfbGluZV9jb250ZW50ID0gdHIuc3RhcnRTdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9BLCB0b0EgKyBsaW5lX2NvbnRlbnQubGVuZ3RoKzEpO1xuXHRcdFx0XHRpZiAoL15cXHMqYGBgJC8udGVzdChsaW5lX2NvbnRlbnQpICYmICdcXG4nK2xpbmVfY29udGVudD09bmV4dF9saW5lX2NvbnRlbnQpIHtcblx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y2hhbmdlczp7XG5cdFx0XHRcdFx0XHRcdGZyb206IHRvQS0zLCBcblx0XHRcdFx0XHRcdFx0dG86IHRvQStsaW5lX2NvbnRlbnQubGVuZ3RoKzEsXG5cdFx0XHRcdFx0XHRcdGluc2VydDogJydcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiB0b0EgLSAzIH0sXG5cdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yIChsZXQgcnVsZSBvZiB0aGlzLkludHJpbnNpY0RlbGV0ZVJ1bGVzKSB7XG5cdFx0XHRcdFx0bGV0IGxlZnQgPSB0ci5zdGFydFN0YXRlLmRvYy5zbGljZVN0cmluZyh0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCwgdG9BKTtcblx0XHRcdFx0XHRsZXQgcmlnaHQgPSB0ci5zdGFydFN0YXRlLmRvYy5zbGljZVN0cmluZyh0b0EsIHRvQSArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCk7XG5cdFx0XHRcdFx0aWYgKGxlZnQgPT09IHJ1bGUuYmVmb3JlLmxlZnQgJiYgcmlnaHQgPT09IHJ1bGUuYmVmb3JlLnJpZ2h0KSB7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0XHRcdFx0ZnJvbTogdG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0dG86IHRvQSArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRpbnNlcnQ6IHJ1bGUuYWZ0ZXIubGVmdCArIHJ1bGUuYWZ0ZXIucmlnaHRcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogdG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyBydWxlLmFmdGVyLmxlZnQubGVuZ3RoIH0sXG5cdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVzZXJEZWZpbmVkIERlbGV0ZSBSdWxlXG5cdFx0XHRpZiAoY2hhbmdlVHlwZVN0ciA9PSBcImRlbGV0ZS5iYWNrd2FyZFwiKSB7XG5cdFx0XHRcdGZvciAobGV0IHJ1bGUgb2YgdGhpcy5Vc2VyRGVsZXRlUnVsZXMpIHtcblx0XHRcdFx0XHRsZXQgbGVmdERvY1N0ciA9IHRyLnN0YXJ0U3RhdGUuZG9jLnNsaWNlU3RyaW5nKDAsIHRvQSk7XG5cdFx0XHRcdFx0bGV0IHJpZ2h0RG9jU3RyID0gdHIuc3RhcnRTdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9BKTtcblx0XHRcdFx0XHRsZXQgbGVmdFJlZ2V4cFN0ciA9IHJ1bGUuYmVmb3JlLmxlZnQ7XG5cdFx0XHRcdFx0aWYgKGlzUmVnZXhwKHJ1bGUuYmVmb3JlLmxlZnQpKXtcblx0XHRcdFx0XHRcdGxlZnRSZWdleHBTdHIgPSBsZWZ0UmVnZXhwU3RyLnNsaWNlKDIsIC0xKTtcblx0XHRcdFx0XHR9ZWxzZXtcblx0XHRcdFx0XHRcdGxlZnRSZWdleHBTdHIgPSBsZWZ0UmVnZXhwU3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdGxldCBsZWZ0UmVnZXhwID0gbmV3IFJlZ0V4cChsZWZ0UmVnZXhwU3RyK1wiJFwiKTtcblx0XHRcdFx0XHRsZXQgbGVmdE1hdGNoID0gbGVmdERvY1N0ci5tYXRjaChsZWZ0UmVnZXhwKTtcblx0XHRcdFx0XHRpZiAobGVmdE1hdGNoKXtcblx0XHRcdFx0XHRcdGxldCBsZWZ0TWF0Y2hTdHIgPSBsZWZ0TWF0Y2hbMF07XG5cdFx0XHRcdFx0XHQvLyBcdTkwMDlcdTYyRTkgbGVmdE1hdGNoWzBdIFx1NEU0Qlx1NTQwRVx1NzY4NFx1NjI0MFx1NjcwOVx1NTMzOVx1OTE0RFxuXHRcdFx0XHRcdFx0bGV0IG1hdGNoTGlzdCA9IGxlZnRNYXRjaC5zbGljZSgxKTtcblx0XHRcdFx0XHRcdGxldCBtYXRjaFBvc0JlZ2luID0gdG9BIC0gbGVmdE1hdGNoU3RyLmxlbmd0aDtcblx0XHRcdFx0XHRcdGxldCByaWdodFJlZ2V4cFN0ciA9IHJ1bGUuYmVmb3JlLnJpZ2h0O1xuXHRcdFx0XHRcdFx0aWYgKGlzUmVnZXhwKHJ1bGUuYmVmb3JlLnJpZ2h0KSl7XG5cdFx0XHRcdFx0XHRcdHJpZ2h0UmVnZXhwU3RyID0gcmlnaHRSZWdleHBTdHIuc2xpY2UoMiwgLTEpO1xuXHRcdFx0XHRcdFx0fWVsc2V7XG5cdFx0XHRcdFx0XHRcdC8vICQmIFx1ODg2OFx1NzkzQVx1NTMzOVx1OTE0RFx1NzY4NFx1NUI1MFx1NEUzMlxuXHRcdFx0XHRcdFx0XHRyaWdodFJlZ2V4cFN0ciA9IHJpZ2h0UmVnZXhwU3RyLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRsZXQgcmlnaHRSZWdleHAgPSBuZXcgUmVnRXhwKCdeJytyaWdodFJlZ2V4cFN0cik7XG5cdFx0XHRcdFx0XHRsZXQgcmlnaHRNYXRjaCA9IHJpZ2h0RG9jU3RyLm1hdGNoKHJpZ2h0UmVnZXhwKTtcblx0XHRcdFx0XHRcdGlmKHJpZ2h0TWF0Y2gpe1xuXHRcdFx0XHRcdFx0XHRsZXQgcmlnaHRNYXRjaFN0ciA9IHJpZ2h0TWF0Y2hbMF07XG5cdFx0XHRcdFx0XHRcdGxldCBtYXRjaFBvc0VuZCA9IHRvQSArIHJpZ2h0TWF0Y2hTdHIubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRtYXRjaExpc3QucHVzaCguLi5yaWdodE1hdGNoLnNsaWNlKDEpKTtcblx0XHRcdFx0XHRcdFx0Ly8gXHU1REU2XHU1M0YzXHU5MEZEXHU1MzM5XHU5MTREXHU2MjEwXHU1MjlGXHVGRjBDXHU1RjAwXHU1OUNCXHU2NkZGXHU2MzYyXHU1QjU3XHU3QjI2XHU0RTMyXG5cdFx0XHRcdFx0XHRcdC8vIGxldCByZXBsYWNlTGVmdCA9IHJlcGxhY2VQbGFjZWhvbGRlcnMocnVsZS5hZnRlci5sZWZ0LCBtYXRjaExpc3QpO1xuXHRcdFx0XHRcdFx0XHQvLyBsZXQgcmVwbGFjZVJpZ2h0ID0gcmVwbGFjZVBsYWNlaG9sZGVycyhydWxlLmFmdGVyLnJpZ2h0LCBtYXRjaExpc3QpO1xuXHRcdFx0XHRcdFx0XHRsZXQgW25ld19zdHJpbmcsIHRhYnN0b3BzXSA9IHBhcnNlVGhlQWZ0ZXJQYXR0ZXJuKHJ1bGUuYWZ0ZXJfcGF0dGVybiwgbWF0Y2hMaXN0KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdXBkYXRlZFRhYnN0b3BzID0gdGFic3RvcHMubWFwKHRhYnN0b3AgPT4gKHtcblx0XHRcdFx0XHRcdFx0XHQuLi50YWJzdG9wLCAvLyBcdTVDNTVcdTVGMDBcdTczQjBcdTY3MDlcdTc2ODRcdTVDNUVcdTYwMjdcblx0XHRcdFx0XHRcdFx0XHRmcm9tOiB0YWJzdG9wLmZyb20gKyBtYXRjaFBvc0JlZ2luLCAvLyBcdTU4OUVcdTUyQTBmcm9tXHU1QzVFXHU2MDI3XHU3Njg0XHU1MDNDXG5cdFx0XHRcdFx0XHRcdFx0dG86IHRhYnN0b3AudG8gKyBtYXRjaFBvc0JlZ2luIC8vIFx1NTg5RVx1NTJBMHRvXHU1QzVFXHU2MDI3XHU3Njg0XHU1MDNDXG5cdFx0XHRcdFx0XHRcdH0pKTtcblx0XHRcdFx0XHRcdFx0bGV0IHRhYnN0b3BHcm91cHMgPSB0YWJzdG9wU3BlY3NUb1RhYnN0b3BHcm91cHModXBkYXRlZFRhYnN0b3BzKTtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmcm9tOiBtYXRjaFBvc0JlZ2luLFxuXHRcdFx0XHRcdFx0XHRcdFx0dG86IG1hdGNoUG9zRW5kLFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5zZXJ0OiBuZXdfc3RyaW5nXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHRhYnN0b3BHcm91cHNbMF0udG9FZGl0b3JTZWxlY3Rpb24oKSxcblx0XHRcdFx0XHRcdFx0XHRlZmZlY3RzOiAgW2FkZFRhYnN0b3BzRWZmZWN0Lm9mKHRhYnN0b3BHcm91cHMpXSxcblx0XHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBcdTU5MDRcdTc0MDZcdTgyRjFcdTY1ODdcdThGOTNcdTUxNjVcdTZDRDVcdTRFMEJcdThGOTNcdTUxNjVcdTRFRTNcdTc4MDFcdTU3NTdcblx0XHRcdGlmIChjaGFuZ2VUeXBlU3RyID09ICdpbnB1dC50eXBlJyAmJiBpbnNlcnRlZFN0ciA9PSdgXFxuYGBgJyAmJiB0aGlzLnNldHRpbmdzLkJhc2VPYkVkaXRFbmhhbmNlKXtcblx0XHRcdFx0Y29uc3QgbGluZV9jb250ZW50ID0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KGZyb21BKS50ZXh0O1xuXHRcdFx0XHRpZiAoL15cXHMqYGAkLy50ZXN0KGxpbmVfY29udGVudCkpe1xuXHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzOiB7ZnJvbTogZnJvbUEsIHRvOiB0b0EsIGluc2VydDogJ2BcXG4nK2xpbmVfY29udGVudCsnYCd9LFxuXHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogZnJvbUEgKyAxIH0sXG5cdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdC8vIFx1OTAxQVx1NUUzOFx1NTM1NVx1NUI1N1x1OEY5M1x1NTE2NVxuXHRcdFx0aWYgKChjaGFuZ2VUeXBlU3RyID09ICdpbnB1dC50eXBlJyB8fCBjaGFuZ2VUeXBlU3RyID09IFwiaW5wdXQudHlwZS5jb21wb3NlXCIpICYmIGZyb21BID09PSB0b0EgJiYgZnJvbUIgKyAxID09PSB0b0IpIHtcblx0XHRcdFx0Ly8gaWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwiSW5wdXQudHlwZSA9PiBcIiwgaW5zZXJ0ZWRTdHIpXG5cdFx0XHRcdC8vID09PT09PT09PT09IGJhc2ljIGNvbnZlcnQgcnVsZXMgPT09PT09PT09PT09XG5cdFx0XHRcdC8vIG5vdCBzdXBwb3J0IHVuZG8gYW5kIHJlZG9cblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuQmFzZU9iRWRpdEVuaGFuY2UpIHtcblx0XHRcdFx0XHQvLyBcdTU5MDRcdTc0MDZcdTgyRjFcdTY1ODdcdTY4MDdcdTcwQjlcdTRFMEJgYHxcdTc2ODRcdTYwQzVcdTUxQjVcdUZGMENcdTUxNDlcdTY4MDdcdTgxRUFcdTUyQThcdThERjNcdThGNkNcdTUyMzBcdTRFMkRcdTk1RjRcblx0XHRcdFx0XHRpZiAoaW5zZXJ0ZWRTdHIgPT09ICdgJyAmJiBcblx0XHRcdFx0XHRcdHRvQS10ci5zdGFydFN0YXRlLmRvYy5saW5lQXQodG9BKS5mcm9tPjIgJiYgXG5cdFx0XHRcdFx0XHR0ci5zdGFydFN0YXRlLnNsaWNlRG9jKHRvQS0xLCB0b0EpID09PSAnYCdcblx0XHRcdFx0XHRcdCYmIHRyLnN0YXJ0U3RhdGUuc2xpY2VEb2ModG9BLTIsIHRvQS0xKSAhPSAnYCcpe1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge2Zyb206dG9BLCBpbnNlcnQ6J2AnfSxcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogdG9BIH0sIHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiIFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFx1NTkwNFx1NzQwNlx1NEUyRFx1NjU4N1x1OEY5M1x1NTE2NVx1NkNENVx1NEUwQlx1OEY5M1x1NTE2NVx1NEVFM1x1NzgwMVx1NTc1N1xuXHRcdFx0XHRcdGlmIChpbnNlcnRlZFN0ciA9PSAnXHUwMEI3Jyl7XG5cdFx0XHRcdFx0XHRsZXQgbGluZV9jb250ZW50ID0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KGZyb21BKS50ZXh0O1xuXHRcdFx0XHRcdFx0bGV0IGNoX3BvcyA9IGZyb21BIC0gdHIuc3RhcnRTdGF0ZS5kb2MubGluZUF0KGZyb21BKS5mcm9tO1xuXHRcdFx0XHRcdFx0aWYgKC9eXFxzKmBgJC8udGVzdChsaW5lX2NvbnRlbnQpICYmIGNoX3Bvcz09bGluZV9jb250ZW50Lmxlbmd0aC0xKXtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7ZnJvbTogZnJvbUErMSwgdG86IHRvQSsxLCBpbnNlcnQ6ICdgXFxuJytsaW5lX2NvbnRlbnQrJ2AnfSxcblx0XHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBmcm9tQSArIDIgfSxcblx0XHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGZvciAobGV0IHJ1bGUgb2YgdGhpcy5CYXNpY0NvbnZSdWxlcykge1xuXHRcdFx0XHRcdFx0aWYgKGluc2VydGVkU3RyICE9IHJ1bGUuYmVmb3JlLmxlZnQuY2hhckF0KHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoIC0gMSkpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0Ly8gXHU1OTA0XHU3NDA2XHU2NTg3XHU2ODYzXHU3QjJDIDAgXHU4ODRDXG5cdFx0XHRcdFx0XHRpZiAocnVsZS5iZWZvcmUubGVmdC5jaGFyQXQoMCkgPT09ICdcXG4nICYmIG9mZnNldFRvUG9zKHRyLnN0YXRlLmRvYywgZnJvbUEpLmxpbmUgPT09IDAgJiYgdG9CIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyAxID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdGxldCBsZWZ0ID0gdHIuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgMSwgdG9CKTtcblx0XHRcdFx0XHRcdFx0bGV0IHJpZ2h0ID0gdHIuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiwgdG9CICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoKTtcblx0XHRcdFx0XHRcdFx0aWYgKGxlZnQgPT09IHJ1bGUuYmVmb3JlLmxlZnQuc3Vic3RyaW5nKDEpICYmIHJpZ2h0ID09PSBydWxlLmJlZm9yZS5yaWdodCkge1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZyb206IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgMixcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG86IHRvQSArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5zZXJ0OiBydWxlLmFmdGVyLmxlZnQuc3Vic3RyaW5nKDEpICsgcnVsZS5hZnRlci5yaWdodFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgcnVsZS5hZnRlci5sZWZ0Lmxlbmd0aCArIDEgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdC8vIFx1OTAxQVx1NUUzOFx1NjBDNVx1NTFCNVx1NTkwNFx1NzQwNlxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGxldCBsZWZ0ID0gdHIuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHRvQiAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoLCB0b0IpO1xuXHRcdFx0XHRcdFx0XHRsZXQgcmlnaHQgPSB0ci5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9CLCB0b0IgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0XHRpZiAobGVmdCA9PT0gcnVsZS5iZWZvcmUubGVmdCAmJiByaWdodCA9PT0gcnVsZS5iZWZvcmUucmlnaHQpIHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRmcm9tOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIDEsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvOiB0b0EgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogcnVsZS5hZnRlci5sZWZ0ICsgcnVsZS5hZnRlci5yaWdodFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHRvQSAtIHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoICsgcnVsZS5hZnRlci5sZWZ0Lmxlbmd0aCArIDEgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5GVzJIV0VuaGFuY2UpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBydWxlIG9mIHRoaXMuRlcySFdTeW1ib2xSdWxlcykge1xuXHRcdFx0XHRcdFx0aWYgKGluc2VydGVkU3RyICE9IHJ1bGUuYmVmb3JlLmxlZnQuY2hhckF0KHJ1bGUuYmVmb3JlLmxlZnQubGVuZ3RoIC0gMSkpIGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0bGV0IGxlZnQgPSB0ci5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9CIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGgsIHRvQik7XG5cdFx0XHRcdFx0XHRsZXQgcmlnaHQgPSB0ci5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodG9CLCB0b0IgKyBydWxlLmJlZm9yZS5yaWdodC5sZW5ndGgpO1xuXHRcdFx0XHRcdFx0aWYgKGxlZnQgPT09IHJ1bGUuYmVmb3JlLmxlZnQgJiYgcmlnaHQgPT09IHJ1bGUuYmVmb3JlLnJpZ2h0KSB7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZnJvbTogdG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyAxLFxuXHRcdFx0XHRcdFx0XHRcdFx0dG86IHRvQSArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2VydDogcnVsZS5hZnRlci5sZWZ0ICsgcnVsZS5hZnRlci5yaWdodFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogdG9BIC0gcnVsZS5iZWZvcmUubGVmdC5sZW5ndGggKyBydWxlLmFmdGVyLmxlZnQubGVuZ3RoICsgMSB9LFxuXHRcdFx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gPT09PT09PT09PT09PT09PSBhdXRvIHBhaXIgPT09PT09PT09PT09PT09PT1cblx0XHRcdFx0Ly8gbGV0IFBhaXJWYWxpZFNldCA9IG5ldyBTZXQoW1wiXCIsIFwiIFwiLFwiXFxuXCJdKVxuXHRcdFx0XHQvLyBsZXQgY2hhckFmdGVyQ3Vyc29yID0gdHIuc3RhcnRTdGF0ZS5zbGljZURvYyh0b0EsIHRvQSsxKTtcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuSW50cmluc2ljU3ltYm9sUGFpcnMpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBydWxlIG9mIHRoaXMuSW50cmluc2ljQXV0b1BhaXJSdWxlc1BhdGNoKSB7XG5cdFx0XHRcdFx0XHRpZiAoaW5zZXJ0ZWRTdHIgIT0gcnVsZS5iZWZvcmUubGVmdC5jaGFyQXQocnVsZS5iZWZvcmUubGVmdC5sZW5ndGggLSAxKSkgY29udGludWU7XG5cdFx0XHRcdFx0XHRsZXQgbGVmdCA9IHRyLnN0YXRlLmRvYy5zbGljZVN0cmluZyh0b0IgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCwgdG9CKTtcblx0XHRcdFx0XHRcdGxldCByaWdodCA9IHRyLnN0YXRlLmRvYy5zbGljZVN0cmluZyh0b0IsIHRvQiArIHJ1bGUuYmVmb3JlLnJpZ2h0Lmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRpZiAobGVmdCA9PT0gcnVsZS5iZWZvcmUubGVmdCAmJiByaWdodCA9PT0gcnVsZS5iZWZvcmUucmlnaHQpIHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmcm9tOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIDEsXG5cdFx0XHRcdFx0XHRcdFx0XHR0bzogdG9BICsgcnVsZS5iZWZvcmUucmlnaHQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5zZXJ0OiBydWxlLmFmdGVyLmxlZnQgKyBydWxlLmFmdGVyLnJpZ2h0XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiB0b0EgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIHJ1bGUuYWZ0ZXIubGVmdC5sZW5ndGggKyAxIH0sXG5cdFx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodGhpcy5TeW1ib2xQYWlyc01hcC5oYXMoaW5zZXJ0ZWRTdHIpICYmIGluc2VydGVkU3RyIT1cIidcIikge1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlczogeyBmcm9tOiBmcm9tQSwgdG86IHRvQSwgaW5zZXJ0OiBpbnNlcnRlZFN0ciArIHRoaXMuU3ltYm9sUGFpcnNNYXAuZ2V0KGluc2VydGVkU3RyKSB9LFxuXHRcdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBmcm9tQSArIDEgfSxcblx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0dHIgPSB0ci5zdGFydFN0YXRlLnVwZGF0ZSguLi5jaGFuZ2VzKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoaW5zZXJ0ZWRTdHIgPT09IFwiJ1wiKSB7XG5cdFx0XHRcdFx0XHRsZXQgY2hhckJlZm9yZUN1cnNvciA9IHRyLnN0YXJ0U3RhdGUuc2xpY2VEb2MoZnJvbUEgLSAxLCBmcm9tQSk7XG5cdFx0XHRcdFx0XHRpZiAoWycnLCAnICcsICdcXG4nXS5pbmNsdWRlcyhjaGFyQmVmb3JlQ3Vyc29yKSkge1xuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXM6IHsgZnJvbTogZnJvbUEsIHRvOiB0b0EsIGluc2VydDogXCInJ1wiIH0sXG5cdFx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogZnJvbUEgKyAxIH0sXG5cdFx0XHRcdFx0XHRcdFx0dXNlckV2ZW50OiBcIkVhc3lUeXBpbmcuY2hhbmdlXCJcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdHRyID0gdHIuc3RhcnRTdGF0ZS51cGRhdGUoLi4uY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBoYW5kbGUgYXV0b3BhaXIgZm9yIFwiXHUyMDFEXCIgYW5kIFwiXHUyMDE5XCJcblx0XHRcdFx0XHRpZiAoaW5zZXJ0ZWRTdHIgPT09ICdcdTIwMUQnIHx8IGluc2VydGVkU3RyID09PSAnXHUyMDE5Jykge1xuXHRcdFx0XHRcdFx0bGV0IHRlbXBTdHIgPSBpbnNlcnRlZFN0ciA9PT0gXCJcdTIwMURcIiA/IFwiXHUyMDFDXHUyMDFEXCIgOiBcIlx1MjAxOFx1MjAxOVwiO1xuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0Y2hhbmdlczogeyBmcm9tOiBmcm9tQSwgdG86IHRvQSwgaW5zZXJ0OiB0ZW1wU3RyIH0sXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IGZyb21BICsgMSB9LFxuXHRcdFx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0ciA9IHRyLnN0YXJ0U3RhdGUudXBkYXRlKC4uLmNoYW5nZXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pXG5cdFx0cmV0dXJuIHRyO1xuXHR9XG5cblx0YXN5bmMgbm9ybWFsUGFzdGUoZWRpdG9yOiBFZGl0b3IpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRsZXQgY2xpcGJvYXJkVGV4dCA9IGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKTtcblx0XHRpZiAoY2xpcGJvYXJkVGV4dCA9PT0gbnVsbCB8fCBjbGlwYm9hcmRUZXh0ID09PSBcIlwiKSByZXR1cm47XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1ZykgY29uc29sZS5sb2coXCJOb3JtYWwgUGFzdGUhIVwiKVxuXHRcdGNvbnN0IGVkaXRvclZpZXcgPSBlZGl0b3IuY20gYXMgRWRpdG9yVmlldztcblx0XHRsZXQgbWFpblNlbGVjdGlvbiA9IGVkaXRvclZpZXcuc3RhdGUuc2VsZWN0aW9uLmFzU2luZ2xlKCkubWFpbjtcblx0XHRlZGl0b3JWaWV3LmRpc3BhdGNoKHtcblx0XHRcdGNoYW5nZXM6IHsgZnJvbTogbWFpblNlbGVjdGlvbi5mcm9tLCB0bzogbWFpblNlbGVjdGlvbi50bywgaW5zZXJ0OiBjbGlwYm9hcmRUZXh0IH0sXG5cdFx0XHRzZWxlY3Rpb246IHthbmNob3I6IG1haW5TZWxlY3Rpb24uZnJvbSArIGNsaXBib2FyZFRleHQubGVuZ3RofSxcblx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLnBhc3RlXCJcblx0XHR9KTtcblx0fVxuXG5cdHZpZXdVcGRhdGVQbHVnaW4gPSAodXBkYXRlOiBWaWV3VXBkYXRlKSA9PiB7XG5cdFx0aWYgKHRoaXMub25Gb3JtYXRBcnRpY2xlID09PSB0cnVlKSByZXR1cm47XG5cblx0XHRsZXQgY3Vyc29yX2NoYW5nZWQgPSB1cGRhdGUudHJhbnNhY3Rpb25zLmZpbmQodHIgPT4gdHIuc2VsZWN0aW9uKSAhPSBudWxsO1xuXHRcdC8vIGNvbnNvbGUubG9nKCdjdXJzb3JfY2hhbmdlZCcsIGN1cnNvcl9jaGFuZ2VkKVxuXHRcdFxuXHRcdGlmICgodXBkYXRlLmRvY0NoYW5nZWQgfHwgY3Vyc29yX2NoYW5nZWQpICYmICF1cGRhdGUudmlldy5jb21wb3NpbmcgJiYgIWlzSW5zaWRlQ3VyVGFic3RvcCh1cGRhdGUudmlldykpIHtcblx0XHRcdHJlbW92ZUFsbFRhYnN0b3BzKHVwZGF0ZS52aWV3KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZS50cmFuc2FjdGlvbnMuZmluZCh0ciA9PiB0ci5pc1VzZXJFdmVudChcInVuZG9cIikpKXtcblx0XHRcdHJlbW92ZUFsbFRhYnN0b3BzKHVwZGF0ZS52aWV3KTtcblx0XHR9XG5cblx0XHRsZXQgbm90U2VsZWN0ZWQgPSB0cnVlO1xuXHRcdGxldCBtYWluU2VsZWN0aW9uID0gdXBkYXRlLnZpZXcuc3RhdGUuc2VsZWN0aW9uLmFzU2luZ2xlKCkubWFpbjtcblx0XHRpZiAobWFpblNlbGVjdGlvbi5hbmNob3IgIT0gbWFpblNlbGVjdGlvbi5oZWFkKSBub3RTZWxlY3RlZCA9IGZhbHNlO1xuXHRcdGlmICghdXBkYXRlLmRvY0NoYW5nZWQpIHJldHVybjtcblxuXHRcdGxldCBpc0V4Y2x1ZGVGaWxlID0gdGhpcy5pc0N1cnJlbnRGaWxlRXhjbHVkZSgpO1xuXHRcdC8vIGNvbnNvbGUubG9nKHRoaXMuQ3VyQWN0aXZlTWFya2Rvd24sIGlzRXhjbHVkZUZpbGUpXG5cblx0XHQvLyBpZiAodGhpcy5zZXR0aW5ncy5kZWJ1ZykgY29uc29sZS5sb2coXCItLS0tLVZpZXdVcGRhdGVDaGFuZ2UtLS0tLVwiKTtcblx0XHRsZXQgdHIgPSB1cGRhdGUudHJhbnNhY3Rpb25zWzBdXG5cdFx0bGV0IGNoYW5nZVR5cGUgPSBnZXRUeXBlU3RyT2ZUcmFuc2FjKHRyKTtcblxuXHRcdHRyLmNoYW5nZXMuaXRlckNoYW5nZXMoKGZyb21BLCB0b0EsIGZyb21CLCB0b0IsIGluc2VydGVkKSA9PiB7XG5cdFx0XHRsZXQgaW5zZXJ0ZWRTdHIgPSBpbnNlcnRlZC5zbGljZVN0cmluZygwKTtcblx0XHRcdGxldCBjaGFuZ2VkU3RyID0gdHIuc3RhcnRTdGF0ZS5kb2Muc2xpY2VTdHJpbmcoZnJvbUEsIHRvQSk7XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5kZWJ1Zyl7XG5cdFx0XHRcdGNvbnNvbGUubG9nKFwiW1ZpZXdVcGRhdGVdIHR5cGUsIGZyb21BLCB0b0EsIGNoYW5nZWQsIGZyb21CLCB0b0IsIGluc2VydGVkXCIpO1xuXHRcdFx0XHRjb25zb2xlLmxvZyhjaGFuZ2VUeXBlLCBmcm9tQSwgdG9BLCBjaGFuZ2VkU3RyLCBmcm9tQiwgdG9CLCBpbnNlcnRlZFN0cilcblx0XHRcdFx0Y29uc29sZS5sb2coXCI9PT5bQ29tcG9zaW5nXVwiLCB1cGRhdGUudmlldy5jb21wb3NpbmcpXG5cdFx0XHR9XG5cblx0XHRcdC8vIHRhYmxlIFx1NTE4NVx1OTBFOFx1NEUwRFx1NTA1QVx1NTkwNFx1NzQwNlx1RkYwQ1x1NzZGNFx1NjNBNVx1OEZENFx1NTZERSA9PiBcdTkxNERcdTU0MDggT2JzaWRpYW4gXHU3Njg0XHU2NzNBXHU1MjM2XG5cdFx0XHRpZiAoZ2V0UG9zTGluZVR5cGUodXBkYXRlLnZpZXcuc3RhdGUsIGZyb21CKSA9PSBMaW5lVHlwZS50YWJsZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGxldCBjdXJzb3IgPSB1cGRhdGUudmlldy5zdGF0ZS5zZWxlY3Rpb24uYXNTaW5nbGUoKS5tYWluO1xuXG5cdFx0XHRpZiAodXBkYXRlLnZpZXcuY29tcG9zaW5nKXtcblx0XHRcdFx0aWYgKHRoaXMuY29tcG9zZV9uZWVkX2hhbmRsZSl7XG5cdFx0XHRcdFx0dGhpcy5jb21wb3NlX2VuZF9wb3MgPSBjdXJzb3IuYW5jaG9yO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2V7XG5cdFx0XHRcdFx0dGhpcy5jb21wb3NlX25lZWRfaGFuZGxlID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLmNvbXBvc2VfYmVnaW5fcG9zID0gZnJvbUE7XG5cdFx0XHRcdFx0dGhpcy5jb21wb3NlX2VuZF9wb3MgPSBjdXJzb3IuYW5jaG9yO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGNoYW5nZV9mcm9tID0gZnJvbUI7XG5cdFx0XHRsZXQgY2hhbmdlX3RvID0gdG9CO1xuXHRcdFx0bGV0IGNvbXBvc2VFbmQgPSBmYWxzZTtcblx0XHRcdGlmICh0aGlzLmNvbXBvc2VfbmVlZF9oYW5kbGUpe1xuXHRcdFx0XHRjb21wb3NlRW5kID0gdHJ1ZTtcblx0XHRcdFx0dGhpcy5jb21wb3NlX25lZWRfaGFuZGxlID0gZmFsc2U7XG5cdFx0XHRcdGNoYW5nZV9mcm9tID0gdGhpcy5jb21wb3NlX2JlZ2luX3Bvcztcblx0XHRcdFx0Y2hhbmdlX3RvID0gdGhpcy5jb21wb3NlX2VuZF9wb3M7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaGFuZ2VUeXBlLmNvbnRhaW5zKCdFYXN5VHlwaW5nJykgfHwgY2hhbmdlVHlwZT09J3VuZG8nIHx8IGNoYW5nZVR5cGU9PSdyZWRvJykgcmV0dXJuO1xuXHRcdFx0Ly8gXHU1MjI0XHU2NUFEXHU2QkNGXHU2QjIxXHU4RjkzXHU1MTY1XHU3RUQzXHU2NzVGXG5cdFx0XHRpZiAoY2hhbmdlVHlwZSAhPSAnbm9uZScgJiYgbm90U2VsZWN0ZWQgJiYgIWNoYW5nZVR5cGUuaW5jbHVkZXMoJ2RlbGV0ZScpKSB7XG5cdFx0XHRcdC8vIFx1NzUyOFx1NjIzN1x1ODFFQVx1NUI5QVx1NEU0OVx1OEY2Q1x1NTMxNlx1ODlDNFx1NTIxOVxuXHRcdFx0XHRpZiAodGhpcy50cmlnZ2VyVXNlckN2dFJ1bGUodXBkYXRlLnZpZXcsIG1haW5TZWxlY3Rpb24uYW5jaG9yKSkgcmV0dXJuO1xuXHRcdFx0XHRpZiAoY29tcG9zZUVuZCAmJiB0aGlzLnRyaWdnZXJQdW5jUmVjdGlmeSh1cGRhdGUudmlldywgY2hhbmdlX2Zyb20pKSByZXR1cm47XG5cblx0XHRcdFx0Ly8gXHU1MjI0XHU2NUFEXHU2ODNDXHU1RjBGXHU1MzE2XHU2NTg3XHU2NzJDXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwicmVhZHkgdG8gZm9ybWF0XCIpO1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcImNoZWNrIGlzIGV4Y2x1ZSBmaWxlOlwiLCBpc0V4Y2x1ZGVGaWxlKVxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5BdXRvRm9ybWF0ICYmIG5vdFNlbGVjdGVkICYmICFpc0V4Y2x1ZGVGaWxlICYmXG5cdFx0XHRcdFx0IChjaGFuZ2VUeXBlICE9ICdub25lJyB8fCBpbnNlcnRlZFN0cj09XCJcXG5cIikpIHtcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRpZiAoZ2V0UG9zTGluZVR5cGUodXBkYXRlLnZpZXcuc3RhdGUsIGNoYW5nZV9mcm9tKSA9PSBMaW5lVHlwZS50ZXh0IHx8IGdldFBvc0xpbmVUeXBlKHVwZGF0ZS52aWV3LnN0YXRlLCBjaGFuZ2VfZnJvbSkgPT0gTGluZVR5cGUudGFibGUpe1xuXHRcdFx0XHRcdFx0bGV0IGNoYW5nZXMgPSB0aGlzLkZvcm1hdGVyLmZvcm1hdExpbmVPZkRvYyh1cGRhdGUuc3RhdGUsIHRoaXMuc2V0dGluZ3MsIGNoYW5nZV9mcm9tLCBjdXJzb3IuYW5jaG9yLCBpbnNlcnRlZFN0cik7XG5cdFx0XHRcdFx0XHRpZiAoY2hhbmdlcyAhPSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdHVwZGF0ZS52aWV3LmRpc3BhdGNoKC4uLmNoYW5nZXNbMF0pO1xuXHRcdFx0XHRcdFx0XHR1cGRhdGUudmlldy5kaXNwYXRjaChjaGFuZ2VzWzFdKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBcdTdDOThcdThEMzRcdTY1RjZcdTgxRUFcdTUyQThcdTY4M0NcdTVGMEZcdTUzMTZcblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLkF1dG9Gb3JtYXQgJiYgIWlzRXhjbHVkZUZpbGUgJiYgY2hhbmdlVHlwZSA9PSBcImlucHV0LnBhc3RlXCIgJiYgIVBsYXRmb3JtLmlzSW9zQXBwKSB7XG5cdFx0XHRcdGxldCB1cGRhdGVMaW5lU3RhcnQgPSB1cGRhdGUuc3RhdGUuZG9jLmxpbmVBdChmcm9tQikubnVtYmVyO1xuXHRcdFx0XHRsZXQgdXBkYXRlTGluZUVuZCA9IHVwZGF0ZS5zdGF0ZS5kb2MubGluZUF0KHRvQikubnVtYmVyO1xuXHRcdFx0XHRpZiAodXBkYXRlTGluZVN0YXJ0ID09IHVwZGF0ZUxpbmVFbmQgJiYgZ2V0UG9zTGluZVR5cGUodXBkYXRlLnZpZXcuc3RhdGUsIHRvQikgPT0gTGluZVR5cGUudGV4dCkge1xuXHRcdFx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5Gb3JtYXRlci5mb3JtYXRMaW5lT2ZEb2ModXBkYXRlLnN0YXRlLCB0aGlzLnNldHRpbmdzLCBmcm9tQiwgdG9CLCBpbnNlcnRlZFN0cik7XG5cdFx0XHRcdFx0aWYgKGNoYW5nZXMgIT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0dXBkYXRlLnZpZXcuZGlzcGF0Y2goLi4uY2hhbmdlc1swXSk7XG5cdFx0XHRcdFx0XHQvLyB1cGRhdGUudmlldy5kaXNwYXRjaChjaGFuZ2VzWzFdKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0bGV0IGFsbF9jaGFuZ2VzOiBUcmFuc2FjdGlvblNwZWNbXSA9IFtdO1xuXHRcdFx0XHRcdGxldCBpbnNlcnRlZF9hcnJheSA9IGluc2VydGVkU3RyLnNwbGl0KFwiXFxuXCIpO1xuXHRcdFx0XHRcdGxldCB1cGRhdGVfc3RhcnQgPSBmcm9tQlxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSB1cGRhdGVMaW5lU3RhcnQ7IGkgPD0gdXBkYXRlTGluZUVuZDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRsZXQgcmVhbF9pbnNlcnRlZCA9IGluc2VydGVkX2FycmF5W2kgLSB1cGRhdGVMaW5lU3RhcnRdO1xuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ3JlYWxfaW5zZXJ0ZWQnLCByZWFsX2luc2VydGVkLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKSlcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCd1cGRhdGVfZG9jX3RleHQnLCB1cGRhdGUuc3RhdGUuZG9jLnNsaWNlU3RyaW5nKHVwZGF0ZV9zdGFydCwgdXBkYXRlX3N0YXJ0ICsgcmVhbF9pbnNlcnRlZC5sZW5ndGgpLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKSlcblx0XHRcdFx0XHRcdGxldCBjaGFuZ2VzID0gdGhpcy5Gb3JtYXRlci5mb3JtYXRMaW5lT2ZEb2ModXBkYXRlLnN0YXRlLCB0aGlzLnNldHRpbmdzLCB1cGRhdGVfc3RhcnQsIHVwZGF0ZV9zdGFydCArIHJlYWxfaW5zZXJ0ZWQubGVuZ3RoLCByZWFsX2luc2VydGVkKTtcblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdjaGFuZ2VzJywgY2hhbmdlcylcblx0XHRcdFx0XHRcdGlmIChjaGFuZ2VzICE9IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0YWxsX2NoYW5nZXMucHVzaCguLi5jaGFuZ2VzWzBdKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHVwZGF0ZV9zdGFydCArPSByZWFsX2luc2VydGVkLmxlbmd0aCArIDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChhbGxfY2hhbmdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHR1cGRhdGUudmlldy5kaXNwYXRjaCguLi5hbGxfY2hhbmdlcyk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XHQvLyBpdGVyY2hhbmdlcyBlbmRcblx0fVxuXG5cdHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlVGFiRG93biA9ICh2aWV3OiBFZGl0b3JWaWV3KSA9PiB7XG5cdFx0aWYgKGNvbnN1bWVBbmRHb3RvTmV4dFRhYnN0b3Aodmlldykpe1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzLlRhYm91dCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0bGV0IHN0YXRlID0gdmlldy5zdGF0ZTtcblx0XHRsZXQgZG9jID0gc3RhdGUuZG9jXG5cdFx0Y29uc3QgdHJlZSA9IHN5bnRheFRyZWUoc3RhdGUpO1xuXHRcdGNvbnN0IHMgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcblx0XHRpZiAocy5yYW5nZXMubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXHRcdGNvbnN0IHBvcyA9IHMubWFpbi50bztcblx0XHRsZXQgbGluZSA9IGRvYy5saW5lQXQocG9zKVxuXG5cdFx0Ly8gRGVidWcgaW5mb1xuXHRcdC8vIGNvbnNvbGUubG9nKGxpbmUudGV4dClcblx0XHQvLyBmb3IgKGxldCBwPWxpbmUuZnJvbTsgcDw9bGluZS50bzsgcCs9MSl7XG5cdFx0Ly8gXHRjb25zdCB0b2tlbiA9IHRyZWUucmVzb2x2ZShwLCAxKS5uYW1lXG5cdFx0Ly8gXHRjb25zb2xlLmxvZyhwLWxpbmUuZnJvbSwgdG9rZW4pXG5cdFx0Ly8gfVxuXHRcdC8vIHJldHVybiB0cnVlO1xuXG5cdFx0aWYgKHMubWFpbi5mcm9tPT1zLm1haW4udG8gJiYgaXNDb2RlQmxvY2tJblBvcyhzdGF0ZSwgcG9zKSl7XG5cdFx0XHRjb25zdCBkZWZhdWx0X2luZGVudCA9IHRoaXMuZ2V0RGVmYXVsdEluZGVudENoYXIoKTtcblx0XHRcdHZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0ZnJvbTogcy5tYWluLmZyb20sXG5cdFx0XHRcdFx0aW5zZXJ0OiBkZWZhdWx0X2luZGVudFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZWxlY3Rpb246IHtcblx0XHRcdFx0XHRhbmNob3I6IHMubWFpbi5mcm9tICsgZGVmYXVsdF9pbmRlbnQubGVuZ3RoXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0Ly8gcmV0dXJuIHRydWU7XG5cblx0XHQvLyBcdTVGNTNcdTUxNDlcdTY4MDdcdTU3MjhcdTg4NENcdTUxODVcdTRFRTNcdTc4MDFcdTUxODVcdTkwRThcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5CZXR0ZXJDb2RlRWRpdCAmJiBwb3MgLSBsaW5lLmZyb20gIT0gMCAmJiB0cmVlLnJlc29sdmUocG9zIC0gMSwgMSkubmFtZS5jb250YWlucygnaW5saW5lLWNvZGUnKSkge1xuXHRcdFx0aWYgKHRyZWUucmVzb2x2ZShwb3MsIDEpLm5hbWUuY29udGFpbnMoJ2Zvcm1hdHRpbmctY29kZV9pbmxpbmUtY29kZScpKSB7XG5cdFx0XHRcdHZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHBvcyArIDEsIGhlYWQ6IHBvcyArIDEgfVxuXHRcdFx0XHR9KVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChsZXQgcCA9IHBvcyArIDE7IHAgPCBsaW5lLnRvICYmIHRyZWUucmVzb2x2ZShwLCAxKS5uYW1lLmNvbnRhaW5zKCdpbmxpbmUtY29kZScpOyBwICs9IDEpIHtcblx0XHRcdFx0Ly8gXHU1OTgyXHU2NzlDXHU2MjdFXHU1MjMwIGAgXHU1MjE5XHU1MTQ5XHU2ODA3XHU4REYzXHU1MjMwXHU1MTc2XHU1NDBFXG5cdFx0XHRcdGlmICh0cmVlLnJlc29sdmUocCwgMSkubmFtZS5jb250YWlucygnZm9ybWF0dGluZy1jb2RlX2lubGluZS1jb2RlJykpIHtcblx0XHRcdFx0XHR2aWV3LmRpc3BhdGNoKHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHAsIGhlYWQ6IHAgfVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gXHU1OTgyXHU2NzlDXHU2Q0ExXHU2MjdFXHU1MjMwIGAgXHU1MjE5XHU3NkY0XHU2M0E1XHU4REYzXHU1MjMwXHU4ODRDXHU1QzNFXG5cdFx0XHRcdGlmIChwID09IGxpbmUudG8gLSAxICYmIHRyZWUucmVzb2x2ZShwLCAxKS5uYW1lLmNvbnRhaW5zKCdpbmxpbmUtY29kZScpKSB7XG5cdFx0XHRcdFx0dmlldy5kaXNwYXRjaCh7XG5cdFx0XHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBwICsgMSwgaGVhZDogcCArIDEgfVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBcdTVGNTNcdTUxNDlcdTY4MDdcdTU3MjhcdTg4NENcdTUxODVcdTRFRTNcdTc4MDFcdTU5MTZcdTkwRThcdUZGMENcdTVFNzZcdTU3MjhcdTkwMDlcdTRFMkRcdTY1ODdcdTY3MkNcdTc2ODRcdTYwQzVcdTUxQjVcdTRFMEJcdUZGMEN0YWJcdTVDMDZcdTRGMUFcdThERjNcdTUxRkFcdTUyMzBwYWlyc3RyaW5nXHU3Njg0XHU1OTE2XHU5MEU4XG5cdFx0bGV0IHNlbGVjdGlvbiA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFzU2luZ2xlKCkubWFpbjtcblx0XHRsZXQgc2VsZWN0ZWQgPSBzZWxlY3Rpb24uYW5jaG9yICE9IHNlbGVjdGlvbi5oZWFkO1xuXHRcdGlmIChzZWxlY3RlZCl7XG5cdFx0XHRsZXQgbmV3X2FuY2hvciA9IHNlbGVjdGlvbi5hbmNob3I8c2VsZWN0aW9uLmhlYWQ/c2VsZWN0aW9uLmFuY2hvcjpzZWxlY3Rpb24uaGVhZDtcblx0XHRcdGxldCBuZXdfaGVhZCA9IHNlbGVjdGlvbi5hbmNob3I+c2VsZWN0aW9uLmhlYWQ/c2VsZWN0aW9uLmFuY2hvcjpzZWxlY3Rpb24uaGVhZDtcblx0XHRcdC8vIGNvbnNvbGUubG9nKFwic2VsZWN0aW9uXCIsIHNlbGVjdGlvbi5hbmNob3IsIHNlbGVjdGlvbi5oZWFkKVxuXG5cdFx0XHRmb3IgKGxldCBwc3RyIG9mIHRoaXMuVGFib3V0UGFpclN0cnMpe1xuXHRcdFx0XHRpZiAoZG9jLnNsaWNlU3RyaW5nKG5ld19hbmNob3ItcHN0ci5sZWZ0Lmxlbmd0aCwgbmV3X2FuY2hvcikgPT0gcHN0ci5sZWZ0ICYmXG5cdFx0XHRcdFx0ZG9jLnNsaWNlU3RyaW5nKG5ld19oZWFkLCBuZXdfaGVhZCtwc3RyLnJpZ2h0Lmxlbmd0aCkgPT0gcHN0ci5yaWdodCl7XG5cdFx0XHRcdFx0XHR2aWV3LmRpc3BhdGNoKHtcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uOiB7IGFuY2hvcjogbmV3X2hlYWQrcHN0ci5yaWdodC5sZW5ndGgsIGhlYWQ6IG5ld19oZWFkK3BzdHIucmlnaHQubGVuZ3RoIH1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IHRhYm91dFJlcyA9IHRhYm91dEN1cnNvckluUGFpcmVkU3RyaW5nKGxpbmUudGV4dCwgcG9zLWxpbmUuZnJvbSwgdGhpcy5UYWJvdXRQYWlyU3Rycyk7XG5cdFx0XHRpZiAodGFib3V0UmVzLmlzU3VjY2Vzcyl7XG5cdFx0XHRcdHZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRcdHNlbGVjdGlvbjogeyBhbmNob3I6IHRhYm91dFJlcy5uZXdQb3NpdGlvbitsaW5lLmZyb20gfVxuXHRcdFx0XHR9KVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlRW50ZXIgPSAodmlldzogRWRpdG9yVmlldykgPT4ge1xuXHRcdC8vIGNvbnNvbGUubG9nKFwidGhpcy5zZXR0aW5ncy5FbnRlclR3aWNlXCIsIHRoaXMuc2V0dGluZ3MuRW50ZXJUd2ljZSlcblx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuRW50ZXJUd2ljZSkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0bGV0IHN0cmljdExpbmVCcmVha3MgPSB0aGlzLmFwcC52YXVsdC5jb25maWcuc3RyaWN0TGluZUJyZWFrcyB8fCBmYWxzZTtcblx0XHRpZiAoIXN0cmljdExpbmVCcmVha3MpIHJldHVybiBmYWxzZTtcblxuXHRcdGxldCBzdGF0ZSA9IHZpZXcuc3RhdGU7XG5cdFx0bGV0IGRvYyA9IHN0YXRlLmRvY1xuXHRcdGNvbnN0IHRyZWUgPSBzeW50YXhUcmVlKHN0YXRlKTtcblx0XHRjb25zdCBzID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG5cdFx0aWYgKHMucmFuZ2VzLmxlbmd0aCA+IDEpIHJldHVybiBmYWxzZTtcblx0XHRjb25zdCBwb3MgPSBzLm1haW4udG87XG5cdFx0bGV0IGxpbmUgPSBkb2MubGluZUF0KHBvcyk7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhsaW5lLnRleHQsIGdldFBvc0xpbmVUeXBlMihzdGF0ZSwgcG9zKSlcblx0XHQvLyBmb3IgKGxldCBwPWxpbmUuZnJvbTsgcDw9bGluZS50bzsgcCs9MSl7XG5cdFx0Ly8gXHRjb25zdCB0b2tlbiA9IHRyZWUucmVzb2x2ZShwLCAxKS5uYW1lXG5cdFx0Ly8gXHRjb25zb2xlLmxvZyhwLWxpbmUuZnJvbSwgdG9rZW4pXG5cdFx0Ly8gfVxuXHRcdC8vIFx1NTk4Mlx1Njc5Q1x1NUY1M1x1NTI0RFx1ODg0Q1x1NEUzQVx1N0E3QVx1NzY3RFx1ODg0Q1x1RkYwQ1x1NEUwRFx1NTA1QVx1NTkwNFx1NzQwNlxuXHRcdGlmICgvXlxccyokLy50ZXN0KGxpbmUudGV4dCkpIHJldHVybiBmYWxzZTtcblxuXHRcdC8vIFx1NTk4Mlx1Njc5Q1x1NTE0OVx1NjgwN1x1NTcyOFx1NUY1M1x1NTI0RFx1ODg0Q1x1OTk5Nlx1RkYwQ1x1NEUwRFx1NTA1QVx1NTkwNFx1NzQwNlxuXHRcdGlmIChwb3M9PWxpbmUuZnJvbSkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8gXHU1OTgyXHU0RTBCXHU0RTAwXHU4ODRDXHU5NzVFXHU3QTdBXHU3NjdEXHU4ODRDXHVGRjBDXHU0RTBEXHU1MDVBXHU1OTA0XHU3NDA2XG5cdFx0aWYgKGxpbmUubnVtYmVyIDwgZG9jLmxpbmVzICYmICEvXlxccyokLy50ZXN0KGRvYy5saW5lKGxpbmUubnVtYmVyKzEpLnRleHQpKSByZXR1cm4gZmFsc2U7XG5cblx0XHRpZiAoZ2V0UG9zTGluZVR5cGUyKHN0YXRlLCBwb3MpID09IExpbmVUeXBlLnRleHQpIHtcblx0XHRcdHZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0ZnJvbTogcG9zLFxuXHRcdFx0XHRcdHRvOiBwb3MsXG5cdFx0XHRcdFx0aW5zZXJ0OiAnXFxuXFxuJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZWxlY3Rpb246IHsgYW5jaG9yOiBwb3MgKyAyIH0sXG5cdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHR9KVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblxuXHRwcml2YXRlIHJlYWRvbmx5IGhhbmRsZU1vZEFJbkNvZGVCbG9jayA9ICh2aWV3OiBFZGl0b3JWaWV3KSA9PiB7XG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzLkJldHRlckNvZGVFZGl0KSByZXR1cm4gZmFsc2U7XG5cdFx0bGV0IHNlbGVjdGVkID0gZmFsc2U7XG5cdFx0bGV0IG1haW5TZWxlY3Rpb24gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW47XG5cdFx0aWYgKG1haW5TZWxlY3Rpb24uYW5jaG9yICE9IG1haW5TZWxlY3Rpb24uaGVhZCkgc2VsZWN0ZWQgPSB0cnVlO1xuXHRcdGlmIChzZWxlY3RlZCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0bGV0IGN1cnNvcl9wb3MgPSBtYWluU2VsZWN0aW9uLmFuY2hvcjtcblxuXHRcdHJldHVybiBzZWxlY3RDb2RlQmxvY2tJblBvcyh2aWV3LCBjdXJzb3JfcG9zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVhZG9ubHkgb25LZXl1cCA9IChldmVudDogS2V5Ym9hcmRFdmVudCwgdmlldzogRWRpdG9yVmlldykgPT4ge1xuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnKSB7XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcIktleXVwOlwiLCBldmVudC5rZXksIGV2ZW50LnNoaWZ0S2V5LCBldmVudC5jdHJsS2V5fHxldmVudC5tZXRhS2V5KTtcblx0XHRcdGNvbnNvbGUubG9nKFwiS2V5dXA6XCIsIGV2ZW50LmtleSk7XG5cdFx0fVxuXHRcdHRoaXMuaGFuZGxlRW5kQ29tcG9zZVR5cGVLZXkoZXZlbnQsIHZpZXcpO1xuXHR9XG5cblx0dHJpZ2dlclVzZXJDdnRSdWxlID0gKHZpZXc6IEVkaXRvclZpZXcsIGN1cnNvcl9wb3M6IG51bWJlcik6Ym9vbGVhbiA9PiB7XG5cdFx0Zm9yIChsZXQgcnVsZSBvZiB0aGlzLlVzZXJDb252ZXJ0UnVsZXMpIHtcblx0XHRcdGxldCBsZWZ0RG9jU3RyID0gdmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoMCwgY3Vyc29yX3Bvcyk7XG5cdFx0XHRsZXQgcmlnaHREb2NTdHIgPSB2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyhjdXJzb3JfcG9zKTtcblx0XHRcdGxldCBsZWZ0UmVnZXhwU3RyID0gcnVsZS5iZWZvcmUubGVmdDtcblx0XHRcdGlmIChpc1JlZ2V4cChydWxlLmJlZm9yZS5sZWZ0KSl7XG5cdFx0XHRcdGxlZnRSZWdleHBTdHIgPSBsZWZ0UmVnZXhwU3RyLnNsaWNlKDIsIC0xKTtcblx0XHRcdH1lbHNle1xuXHRcdFx0XHRsZWZ0UmVnZXhwU3RyID0gbGVmdFJlZ2V4cFN0ci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRsZXQgbGVmdFJlZ2V4cCA9IG5ldyBSZWdFeHAobGVmdFJlZ2V4cFN0citcIiRcIik7XG5cdFx0XHRsZXQgbGVmdE1hdGNoID0gbGVmdERvY1N0ci5tYXRjaChsZWZ0UmVnZXhwKTtcblx0XHRcdGlmIChsZWZ0TWF0Y2gpe1xuXHRcdFx0XHRsZXQgbGVmdE1hdGNoU3RyID0gbGVmdE1hdGNoWzBdO1xuXHRcdFx0XHQvLyBcdTkwMDlcdTYyRTkgbGVmdE1hdGNoWzBdIFx1NEU0Qlx1NTQwRVx1NzY4NFx1NjI0MFx1NjcwOVx1NTMzOVx1OTE0RFxuXHRcdFx0XHRsZXQgbWF0Y2hMaXN0ID0gbGVmdE1hdGNoLnNsaWNlKDEpO1xuXHRcdFx0XHRsZXQgbWF0Y2hQb3NCZWdpbiA9IGN1cnNvcl9wb3MgLSBsZWZ0TWF0Y2hTdHIubGVuZ3RoO1xuXHRcdFx0XHRsZXQgcmlnaHRSZWdleHBTdHIgPSBydWxlLmJlZm9yZS5yaWdodDtcblx0XHRcdFx0aWYgKGlzUmVnZXhwKHJ1bGUuYmVmb3JlLnJpZ2h0KSl7XG5cdFx0XHRcdFx0cmlnaHRSZWdleHBTdHIgPSByaWdodFJlZ2V4cFN0ci5zbGljZSgyLCAtMSk7XG5cdFx0XHRcdH1lbHNle1xuXHRcdFx0XHRcdC8vICQmIFx1ODg2OFx1NzkzQVx1NTMzOVx1OTE0RFx1NzY4NFx1NUI1MFx1NEUzMlxuXHRcdFx0XHRcdHJpZ2h0UmVnZXhwU3RyID0gcmlnaHRSZWdleHBTdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsZXQgcmlnaHRSZWdleHAgPSBuZXcgUmVnRXhwKCdeJytyaWdodFJlZ2V4cFN0cik7XG5cdFx0XHRcdGxldCByaWdodE1hdGNoID0gcmlnaHREb2NTdHIubWF0Y2gocmlnaHRSZWdleHApO1xuXHRcdFx0XHRpZihyaWdodE1hdGNoKXtcblx0XHRcdFx0XHRsZXQgcmlnaHRNYXRjaFN0ciA9IHJpZ2h0TWF0Y2hbMF07XG5cdFx0XHRcdFx0bGV0IG1hdGNoUG9zRW5kID0gY3Vyc29yX3BvcyArIHJpZ2h0TWF0Y2hTdHIubGVuZ3RoO1xuXHRcdFx0XHRcdG1hdGNoTGlzdC5wdXNoKC4uLnJpZ2h0TWF0Y2guc2xpY2UoMSkpO1xuXHRcdFx0XHRcdC8vIFx1NURFNlx1NTNGM1x1OTBGRFx1NTMzOVx1OTE0RFx1NjIxMFx1NTI5Rlx1RkYwQ1x1NUYwMFx1NTlDQlx1NjZGRlx1NjM2Mlx1NUI1N1x1N0IyNlx1NEUzMlxuXHRcdFx0XHRcdC8vIGxldCByZXBsYWNlTGVmdCA9IHJlcGxhY2VQbGFjZWhvbGRlcnMocnVsZS5hZnRlci5sZWZ0LCBtYXRjaExpc3QpO1xuXHRcdFx0XHRcdC8vIGxldCByZXBsYWNlUmlnaHQgPSByZXBsYWNlUGxhY2Vob2xkZXJzKHJ1bGUuYWZ0ZXIucmlnaHQsIG1hdGNoTGlzdCk7XG5cdFx0XHRcdFx0bGV0IFtuZXdfc3RyaW5nLCB0YWJzdG9wc10gPSBwYXJzZVRoZUFmdGVyUGF0dGVybihydWxlLmFmdGVyX3BhdHRlcm4sIG1hdGNoTGlzdCk7XG5cdFx0XHRcdFx0Y29uc3QgdXBkYXRlZFRhYnN0b3BzID0gdGFic3RvcHMubWFwKHRhYnN0b3AgPT4gKHtcblx0XHRcdFx0XHRcdC4uLnRhYnN0b3AsIC8vIFx1NUM1NVx1NUYwMFx1NzNCMFx1NjcwOVx1NzY4NFx1NUM1RVx1NjAyN1xuXHRcdFx0XHRcdFx0ZnJvbTogdGFic3RvcC5mcm9tICsgbWF0Y2hQb3NCZWdpbiwgLy8gXHU1ODlFXHU1MkEwZnJvbVx1NUM1RVx1NjAyN1x1NzY4NFx1NTAzQ1xuXHRcdFx0XHRcdFx0dG86IHRhYnN0b3AudG8gKyBtYXRjaFBvc0JlZ2luIC8vIFx1NTg5RVx1NTJBMHRvXHU1QzVFXHU2MDI3XHU3Njg0XHU1MDNDXG5cdFx0XHRcdFx0fSkpO1xuXHRcdFx0XHRcdHZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdFx0XHRmcm9tOiBtYXRjaFBvc0JlZ2luLFxuXHRcdFx0XHRcdFx0XHR0bzogbWF0Y2hQb3NFbmQsXG5cdFx0XHRcdFx0XHRcdGluc2VydDogbmV3X3N0cmluZ1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHVzZXJFdmVudDogXCJFYXN5VHlwaW5nLmNoYW5nZVwiXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YWRkVGFic3RvcHNBbmRTZWxlY3QodmlldywgdGFic3RvcFNwZWNzVG9UYWJzdG9wR3JvdXBzKHVwZGF0ZWRUYWJzdG9wcykpO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHRyaWdnZXJQdW5jUmVjdGlmeSA9ICh2aWV3OiBFZGl0b3JWaWV3LCBjaGFuZ2VfZnJvbV9wb3M6IG51bWJlcik6Ym9vbGVhbiA9PiB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuUHVuY1JlY3RpZnkgJiZcblx0XHRcdC9bLC4/IV0vLnRlc3Qodmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoY2hhbmdlX2Zyb21fcG9zIC0gMSwgY2hhbmdlX2Zyb21fcG9zKSkpIHtcblx0XHRcdGxldCBwdW5jID0gdmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcoY2hhbmdlX2Zyb21fcG9zIC0gMSwgY2hhbmdlX2Zyb21fcG9zKVxuXHRcdFx0aWYgKGNoYW5nZV9mcm9tX3BvcyA+IDIgJiYgL1teXFx1NGUwMC1cXHU5ZmE1XS8udGVzdCh2aWV3LnN0YXRlLmRvYy5zbGljZVN0cmluZyhjaGFuZ2VfZnJvbV9wb3MgLSAyLCBjaGFuZ2VfZnJvbV9wb3MgLSAxKSkpIHsgfVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHZpZXcuZGlzcGF0Y2goe1xuXHRcdFx0XHRcdGNoYW5nZXM6IHtcblx0XHRcdFx0XHRcdGZyb206IGNoYW5nZV9mcm9tX3BvcyAtIDEsXG5cdFx0XHRcdFx0XHR0bzogY2hhbmdlX2Zyb21fcG9zLFxuXHRcdFx0XHRcdFx0aW5zZXJ0OiB0aGlzLmhhbGZUb0Z1bGxTeW1ib2xNYXAuZ2V0KHB1bmMpXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQvLyBzZWxlY3Rpb246IHsgYW5jaG9yOiB0b0IgLSBydWxlLmJlZm9yZS5sZWZ0Lmxlbmd0aCArIHJ1bGUuYWZ0ZXIubGVmdC5sZW5ndGggfSxcblx0XHRcdFx0XHR1c2VyRXZlbnQ6IFwiRWFzeVR5cGluZy5jaGFuZ2VcIlxuXHRcdFx0XHR9KVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aGFuZGxlRW5kQ29tcG9zZVR5cGVLZXkgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHZpZXc6IEVkaXRvclZpZXcpID0+IHtcblx0XHRpZiAoKFsnRW50ZXInLCAnUHJvY2VzcycsICcgJywgJ1NoaWZ0J10uY29udGFpbnMoZXZlbnQua2V5KSB8fCAvXFxkLy50ZXN0KGV2ZW50LmtleSkpICYmXG5cdFx0XHR0aGlzLmNvbXBvc2VfbmVlZF9oYW5kbGUpIHtcblx0XHRcdGxldCBjdXJzb3IgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5hc1NpbmdsZSgpLm1haW47XG5cdFx0XHRpZiAoY3Vyc29yLmhlYWQgIT0gY3Vyc29yLmFuY2hvcikgcmV0dXJuO1xuXHRcdFx0bGV0IGluc2VydGVkU3RyID0gdmlldy5zdGF0ZS5kb2Muc2xpY2VTdHJpbmcodGhpcy5jb21wb3NlX2JlZ2luX3BvcywgY3Vyc29yLmFuY2hvcik7XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImluc2VydGVkIHN0clwiLCBpbnNlcnRlZFN0cik7XG5cdFx0XHR0aGlzLmNvbXBvc2VfbmVlZF9oYW5kbGUgPSBmYWxzZTtcblx0XHRcdGlmICh0aGlzLnRyaWdnZXJVc2VyQ3Z0UnVsZSh2aWV3LCBjdXJzb3IuYW5jaG9yKSkgcmV0dXJuO1xuXHRcdFx0aWYgKHRoaXMudHJpZ2dlclB1bmNSZWN0aWZ5KHZpZXcsIHRoaXMuY29tcG9zZV9iZWdpbl9wb3MpKSByZXR1cm47XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5BdXRvRm9ybWF0ICYmICF0aGlzLmlzQ3VycmVudEZpbGVFeGNsdWRlKCkpe1xuXHRcdFx0XHRpZiAoZ2V0UG9zTGluZVR5cGUodmlldy5zdGF0ZSwgY3Vyc29yLmFuY2hvcikgIT0gTGluZVR5cGUudGV4dCkgcmV0dXJuO1xuXHRcdFx0XHRsZXQgY2hhbmdlcyA9IHRoaXMuRm9ybWF0ZXIuZm9ybWF0TGluZU9mRG9jKHZpZXcuc3RhdGUsIHRoaXMuc2V0dGluZ3MsXG5cdFx0XHRcdFx0dGhpcy5jb21wb3NlX2JlZ2luX3BvcywgY3Vyc29yLmFuY2hvciwgaW5zZXJ0ZWRTdHIpO1xuXHRcdFx0XHRpZiAoY2hhbmdlcyAhPSBudWxsKSB7XG5cdFx0XHRcdFx0dmlldy5kaXNwYXRjaCguLi5jaGFuZ2VzWzBdKTtcblx0XHRcdFx0XHR2aWV3LmRpc3BhdGNoKGNoYW5nZXNbMV0pO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGZvcm1hdEFydGljbGUgPSAoZWRpdG9yOiBFZGl0b3IsIHZpZXc6IE1hcmtkb3duVmlldyk6IHZvaWQgPT4ge1xuXHRcdGNvbnN0IGVkaXRvclZpZXcgPSBlZGl0b3IuY20gYXMgRWRpdG9yVmlldztcblx0XHRjb25zdCB0cmVlID0gZW5zdXJlU3ludGF4VHJlZShlZGl0b3JWaWV3LnN0YXRlLCBlZGl0b3JWaWV3LnN0YXRlLmRvYy5sZW5ndGgpO1xuXHRcdGlmICghdHJlZSl7XG5cdFx0XHRuZXcgTm90aWNlKCdFYXN5VHlwaW5nOiBTeW50YXggdHJlZSBpcyBub3QgcmVhZHkgeWV0LCBwbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluIGxhdGVyIScsIDUwMDApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMub25Gb3JtYXRBcnRpY2xlID0gdHJ1ZTtcblx0XHRcblx0XHRsZXQgbGluZUNvdW50ID0gZWRpdG9yLmxpbmVDb3VudCgpO1xuXHRcdGxldCBuZXdfYXJ0aWNsZSA9IFwiXCI7XG5cdFx0bGV0IGNzID0gZWRpdG9yLmdldEN1cnNvcigpO1xuXHRcdGxldCBjaCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykge1xuXHRcdFx0aWYgKGkgIT0gMCkgbmV3X2FydGljbGUgKz0gJ1xcbic7XG5cdFx0XHRpZiAoaSAhPSBjcy5saW5lKSB7XG5cdFx0XHRcdG5ld19hcnRpY2xlICs9IHRoaXMucHJlRm9ybWF0T25lTGluZShlZGl0b3IsIGkgKyAxKVswXTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRsZXQgbmV3RGF0YSA9IHRoaXMucHJlRm9ybWF0T25lTGluZShlZGl0b3IsIGkgKyAxLCBjcy5jaCk7XG5cdFx0XHRcdG5ld19hcnRpY2xlICs9IG5ld0RhdGFbMF07XG5cdFx0XHRcdGNoID0gbmV3RGF0YVsxXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWRpdG9yLnNldFZhbHVlKG5ld19hcnRpY2xlKTtcblx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogY3MubGluZSwgY2g6IGNoIH0pO1xuXG5cdFx0dGhpcy5vbkZvcm1hdEFydGljbGUgPSBmYWxzZTtcblxuXHRcdG5ldyBOb3RpY2UoXCJFYXN5VHlwaW5nOiBGb3JtYXQgQXJ0aWNsZSBEb25lIVwiKTtcblx0fVxuXG5cdGlzQ3VycmVudEZpbGVFeGNsdWRlKCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLkN1ckFjdGl2ZU1hcmtkb3duID09IFwiXCIpIHtcblx0XHRcdGxldCBmaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblx0XHRcdGlmIChmaWxlICE9IG51bGwgJiYgdGhpcy5DdXJBY3RpdmVNYXJrZG93biAhPSBmaWxlLnBhdGgpIHtcblx0XHRcdFx0dGhpcy5DdXJBY3RpdmVNYXJrZG93biA9IGZpbGUucGF0aDtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0bGV0IGV4Y2x1ZGVQYXRocyA9IHRoaXMuc2V0dGluZ3MuRXhjbHVkZUZpbGVzLnNwbGl0KCdcXG4nKTtcblx0XHRmb3IgKGxldCBlcGF0aCBvZiBleGNsdWRlUGF0aHMpIHtcblx0XHRcdGlmIChlcGF0aC5jaGFyQXQoMCkgPT0gJy8nKSBlcGF0aCA9IGVwYXRoLnN1YnN0cmluZygxKTtcblx0XHRcdGlmICh0aGlzLkN1ckFjdGl2ZU1hcmtkb3duID09IGVwYXRoKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGxldCBsZW4gPSBlcGF0aC5sZW5ndGg7XG5cdFx0XHRpZiAodGhpcy5DdXJBY3RpdmVNYXJrZG93bi5zdWJzdHJpbmcoMCwgbGVuKSA9PSBlcGF0aCAmJiAodGhpcy5DdXJBY3RpdmVNYXJrZG93bi5jaGFyQXQobGVuKSA9PSAnLycgfHwgdGhpcy5DdXJBY3RpdmVNYXJrZG93bi5jaGFyQXQobGVuKSA9PSAnXFxcXCcgfHxcblx0XHRcdFx0ZXBhdGguY2hhckF0KGxlbiAtIDEpID09IFwiL1wiIHx8IGVwYXRoLmNoYXJBdChsZW4gLSAxKSA9PSBcIlxcXFxcIikpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZvcm1hdFNlbGVjdGlvbk9yQ3VyTGluZSA9IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KTogdm9pZCA9PiB7XG5cdFx0aWYgKCFlZGl0b3Iuc29tZXRoaW5nU2VsZWN0ZWQoKSB8fCBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkgPT09ICcnKSB7XG5cdFx0XHRsZXQgbGluZU51bWJlciA9IGVkaXRvci5nZXRDdXJzb3IoKS5saW5lO1xuXHRcdFx0bGV0IG5ld0xpbmVEYXRhID0gdGhpcy5wcmVGb3JtYXRPbmVMaW5lKGVkaXRvciwgbGluZU51bWJlciArIDEsIGVkaXRvci5nZXRDdXJzb3IoKS5jaCk7XG5cdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKG5ld0xpbmVEYXRhWzBdLCB7IGxpbmU6IGxpbmVOdW1iZXIsIGNoOiAwIH0sIHsgbGluZTogbGluZU51bWJlciwgY2g6IGVkaXRvci5nZXRMaW5lKGxpbmVOdW1iZXIpLmxlbmd0aCB9KTtcblx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oeyBsaW5lOiBsaW5lTnVtYmVyLCBjaDogbmV3TGluZURhdGFbMV0gfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGxldCBzZWxlY3Rpb24gPSBlZGl0b3IubGlzdFNlbGVjdGlvbnMoKVswXTtcblx0XHRsZXQgYmVnaW4gPSBzZWxlY3Rpb24uYW5jaG9yLmxpbmU7XG5cdFx0bGV0IGVuZCA9IHNlbGVjdGlvbi5oZWFkLmxpbmU7XG5cdFx0aWYgKGJlZ2luID4gZW5kKSB7XG5cdFx0XHRsZXQgdGVtcCA9IGJlZ2luO1xuXHRcdFx0YmVnaW4gPSBlbmQ7XG5cdFx0XHRlbmQgPSB0ZW1wO1xuXHRcdH1cblx0XHQvLyBjb25zb2xlLmxvZyhiZWdpbiwgZW5kKVxuXHRcdGxldCBuZXdfbGluZXMgPSBcIlwiO1xuXHRcdGZvciAobGV0IGkgPSBiZWdpbjsgaSA8PSBlbmQ7IGkrKykge1xuXHRcdFx0aWYgKGkgIT0gYmVnaW4pIG5ld19saW5lcyArPSAnXFxuJztcblx0XHRcdG5ld19saW5lcyArPSB0aGlzLnByZUZvcm1hdE9uZUxpbmUoZWRpdG9yLCBpICsgMSlbMF07XG5cdFx0fVxuXHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UobmV3X2xpbmVzLCB7IGxpbmU6IGJlZ2luLCBjaDogMCB9LCB7IGxpbmU6IGVuZCwgY2g6IGVkaXRvci5nZXRMaW5lKGVuZCkubGVuZ3RoIH0pO1xuXHRcdGlmIChzZWxlY3Rpb24uYW5jaG9yLmxpbmUgPCBzZWxlY3Rpb24uaGVhZC5saW5lKSB7XG5cdFx0XHRlZGl0b3Iuc2V0U2VsZWN0aW9uKHsgbGluZTogc2VsZWN0aW9uLmFuY2hvci5saW5lLCBjaDogMCB9LCB7IGxpbmU6IHNlbGVjdGlvbi5oZWFkLmxpbmUsIGNoOiBlZGl0b3IuZ2V0TGluZShzZWxlY3Rpb24uaGVhZC5saW5lKS5sZW5ndGggfSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7IGxpbmU6IHNlbGVjdGlvbi5hbmNob3IubGluZSwgY2g6IGVkaXRvci5nZXRMaW5lKHNlbGVjdGlvbi5hbmNob3IubGluZSkubGVuZ3RoIH0sIHsgbGluZTogc2VsZWN0aW9uLmhlYWQubGluZSwgY2g6IDAgfSk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gcGFyYW06IGxpbmVOdW1iZXIgaXMgKDEtYmFzZWQpLCBcdTVFOUZcdTVGMDNcdTUxRkRcdTY1NzBcblx0Zm9ybWF0T25lTGluZSA9IChlZGl0b3I6IEVkaXRvciwgbGluZU51bWJlcjogbnVtYmVyKTogdm9pZCA9PiB7XG5cdFx0Y29uc3QgZWRpdG9yVmlldyA9IGVkaXRvci5jbSBhcyBFZGl0b3JWaWV3O1xuXHRcdGxldCBzdGF0ZSA9IGVkaXRvclZpZXcuc3RhdGU7XG5cdFx0bGV0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShsaW5lTnVtYmVyKVxuXG5cdFx0aWYgKGdldFBvc0xpbmVUeXBlKHN0YXRlLCBsaW5lLmZyb20pID09IExpbmVUeXBlLnRleHQgfHwgZ2V0UG9zTGluZVR5cGUoc3RhdGUsIGxpbmUuZnJvbSkgPT0gTGluZVR5cGUudGFibGUpIHtcblx0XHRcdGxldCBvbGRMaW5lID0gbGluZS50ZXh0O1xuXHRcdFx0bGV0IG5ld0xpbmUgPSB0aGlzLkZvcm1hdGVyLmZvcm1hdExpbmUoc3RhdGUsIGxpbmVOdW1iZXIsIHRoaXMuc2V0dGluZ3MsIG9sZExpbmUubGVuZ3RoLCAwKVswXTtcblx0XHRcdGlmIChvbGRMaW5lICE9IG5ld0xpbmUpIHtcblx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShuZXdMaW5lLCB7IGxpbmU6IGxpbmVOdW1iZXIgLSAxLCBjaDogMCB9LCB7IGxpbmU6IGxpbmVOdW1iZXIgLSAxLCBjaDogb2xkTGluZS5sZW5ndGggfSk7XG5cdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBsaW5lTnVtYmVyIC0gMSwgY2g6IGVkaXRvci5nZXRMaW5lKGxpbmVOdW1iZXIgLSAxKS5sZW5ndGggfSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIHBhcmFtOiBsaW5lTnVtYmVyIGlzICgxLWJhc2VkKVxuXHRwcmVGb3JtYXRPbmVMaW5lID0gKGVkaXRvcjogRWRpdG9yLCBsaW5lTnVtYmVyOiBudW1iZXIsIGNoOiBudW1iZXIgPSAtMSk6IFtzdHJpbmcsIG51bWJlcl0gPT4ge1xuXHRcdGNvbnN0IGVkaXRvclZpZXcgPSBlZGl0b3IuY20gYXMgRWRpdG9yVmlldztcblx0XHRsZXQgc3RhdGUgPSBlZGl0b3JWaWV3LnN0YXRlO1xuXHRcdGxldCBsaW5lID0gc3RhdGUuZG9jLmxpbmUobGluZU51bWJlcilcblxuXHRcdGxldCBuZXdMaW5lID0gbGluZS50ZXh0O1xuXHRcdGxldCBuZXdDaCA9IDA7XG5cdFx0bGV0IGN1ckNoID0gbGluZS50ZXh0Lmxlbmd0aDtcblx0XHRpZiAoY2ggIT0gLTEpIHtcblx0XHRcdGN1ckNoID0gY2g7XG5cdFx0fVxuXHRcdGlmIChnZXRQb3NMaW5lVHlwZShzdGF0ZSwgbGluZS5mcm9tKSA9PSBMaW5lVHlwZS50ZXh0IHx8IGdldFBvc0xpbmVUeXBlKHN0YXRlLCBsaW5lLmZyb20pID09IExpbmVUeXBlLnRhYmxlKSB7XG5cdFx0XHRsZXQgbmV3TGluZURhdGEgPSB0aGlzLkZvcm1hdGVyLmZvcm1hdExpbmUoc3RhdGUsIGxpbmVOdW1iZXIsIHRoaXMuc2V0dGluZ3MsIGN1ckNoLCAwKTtcblx0XHRcdG5ld0xpbmUgPSBuZXdMaW5lRGF0YVswXTtcblx0XHRcdG5ld0NoID0gbmV3TGluZURhdGFbMV07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtuZXdMaW5lLCBuZXdDaF07XG5cdH1cblxuXHRkZWxldGVCbGFua0xpbmVzID0gKGVkaXRvcjogRWRpdG9yKTogdm9pZCA9PiB7XG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuZGVidWcpIHtcblx0XHRcdGNvbnNvbGUubG9nKCdjb25maWcuc3RyaWN0TGluZUJyZWFrcycsIHRoaXMuYXBwLnZhdWx0LmdldENvbmZpZyhcInN0cmljdExpbmVCcmVha3NcIikpO1xuXHRcdFx0Ly8gcmV0dXJuO1xuXHRcdH1cblx0XHRsZXQgc3RyaWN0TGluZUJyZWFrcyA9IHRoaXMuYXBwLnZhdWx0LmNvbmZpZy5zdHJpY3RMaW5lQnJlYWtzIHx8IGZhbHNlO1xuXG5cdFx0Y29uc3QgZWRpdG9yVmlldyA9IGVkaXRvci5jbSBhcyBFZGl0b3JWaWV3O1xuXHRcdGxldCBzdGF0ZSA9IGVkaXRvclZpZXcuc3RhdGU7XG5cdFx0bGV0IGRvYyA9IHN0YXRlLmRvY1xuXHRcdFxuXHRcdGNvbnN0IHRyZWUgPSBlbnN1cmVTeW50YXhUcmVlKHN0YXRlLCBkb2MubGVuZ3RoKTtcblx0XHRpZiAoIXRyZWUpe1xuXHRcdFx0bmV3IE5vdGljZSgnRWFzeVR5cGluZzogU3ludGF4IHRyZWUgaXMgbm90IHJlYWR5IHlldCwgcGxlYXNlIHdhaXQgYSBtb21lbnQgYW5kIHRyeSBhZ2FpbiBsYXRlciEnLCA1MDAwKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0XG5cdFx0bGV0IHN0YXJ0X2xpbmUgPSAxO1xuXHRcdGxldCBlbmRfbGluZSA9IGRvYy5saW5lcztcblx0XHRsZXQgbGluZV9udW0gPSBkb2MubGluZXM7XG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSBlZGl0b3Iuc29tZXRoaW5nU2VsZWN0ZWQoKSAmJiBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkgIT0gJyc7XG5cdFx0aWYgKHNlbGVjdGVkKSB7XG5cdFx0XHRsZXQgc2VsZWN0aW9uID0gZWRpdG9yLmxpc3RTZWxlY3Rpb25zKClbMF07XG5cdFx0XHRsZXQgYmVnaW4gPSBzZWxlY3Rpb24uYW5jaG9yLmxpbmUgKyAxO1xuXHRcdFx0bGV0IGVuZCA9IHNlbGVjdGlvbi5oZWFkLmxpbmUgKyAxO1xuXHRcdFx0aWYgKGJlZ2luID4gZW5kKSB7XG5cdFx0XHRcdGxldCB0ZW1wID0gYmVnaW47XG5cdFx0XHRcdGJlZ2luID0gZW5kO1xuXHRcdFx0XHRlbmQgPSB0ZW1wO1xuXHRcdFx0fVxuXHRcdFx0c3RhcnRfbGluZSA9IGJlZ2luO1xuXHRcdFx0ZW5kX2xpbmUgPSBlbmRcblx0XHR9XG5cblx0XHQvLyBpZih0aGlzLnNldHRpbmdzLmRlYnVnKXtcblx0XHQvLyBcdGxldCBsaW5lX2luZGV4ID0gZWRpdG9yLmdldEN1cnNvcigpLmxpbmUgKyAxO1xuXHRcdC8vIFx0bGV0IGNvbnRlbnQgPSBlZGl0b3IuZ2V0TGluZShlZGl0b3IuZ2V0Q3Vyc29yKCkubGluZSk7XG5cdFx0Ly8gXHRjb25zb2xlLmxvZyhjb250ZW50KTtcblx0XHQvLyBcdGZvciAobGV0IGk9MDtpPGNvbnRlbnQubGVuZ3RoO2krKyl7XG5cdFx0Ly8gXHRcdGxldCBub2RlID0gdHJlZS5yZXNvbHZlKGRvYy5saW5lKGxpbmVfaW5kZXgpLmZyb20raSwgMSk7XG5cdFx0Ly8gXHRcdGNvbnNvbGUubG9nKGksIG5vZGUubmFtZSlcblx0XHQvLyBcdH1cblx0XHQvLyBcdHJldHVybjtcblx0XHQvLyB9XG5cblx0XHRsZXQgZGVsZXRlX2luZGV4OiBudW1iZXJbXSA9IFtdO1xuXHRcdGxldCBibGFua19yZWcgPSAvXlxccyokLztcblx0XHRsZXQgcmVtYWluX25leHRfYmxhbmsgPSBmYWxzZTtcblxuXHRcdGlmIChzdGFydF9saW5lICE9IDEpIHtcblx0XHRcdGxldCBub2RlID0gdHJlZS5yZXNvbHZlKGRvYy5saW5lKHN0YXJ0X2xpbmUgLSAxKS5mcm9tLCAxKTtcblx0XHRcdGlmIChub2RlLm5hbWUuY29udGFpbnMoJ2xpc3QnKSB8fCBub2RlLm5hbWUuY29udGFpbnMoJ3F1b3RlJykgfHwgbm9kZS5uYW1lLmNvbnRhaW5zKCdibG9ja2lkJykpIHtcblx0XHRcdFx0cmVtYWluX25leHRfYmxhbmsgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoZW5kX2xpbmUgIT0gbGluZV9udW0gJiYgIWJsYW5rX3JlZy50ZXN0KGRvYy5saW5lKGVuZF9saW5lICsgMSkudGV4dCkpIHtcblx0XHRcdGVuZF9saW5lICs9IDE7XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaSA9IHN0YXJ0X2xpbmU7IGkgPD0gZW5kX2xpbmU7IGkrKykge1xuXHRcdFx0bGV0IGxpbmUgPSBkb2MubGluZShpKTtcblx0XHRcdGxldCBwb3MgPSBsaW5lLmZyb207XG5cdFx0XHRsZXQgbm9kZSA9IHRyZWUucmVzb2x2ZShwb3MsIDEpO1xuXG5cdFx0XHQvLyBcdTVCRjlcdTRFOEVcdTdBN0FcdTc2N0RcdTg4NENcblx0XHRcdGlmIChibGFua19yZWcudGVzdChsaW5lLnRleHQpICYmICFyZW1haW5fbmV4dF9ibGFuaykge1xuXHRcdFx0XHRkZWxldGVfaW5kZXgucHVzaChpKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChibGFua19yZWcudGVzdChsaW5lLnRleHQpICYmIHJlbWFpbl9uZXh0X2JsYW5rKSB7XG5cdFx0XHRcdHJlbWFpbl9uZXh0X2JsYW5rID0gZmFsc2U7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobm9kZS5uYW1lLmNvbnRhaW5zKCdocicpICYmIGRlbGV0ZV9pbmRleFtkZWxldGVfaW5kZXgubGVuZ3RoIC0gMV0gPT0gaSAtIDEpIHtcblx0XHRcdFx0ZGVsZXRlX2luZGV4LnBvcCgpXG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChub2RlLm5hbWUuY29udGFpbnMoJ2xpc3QnKSB8fCBub2RlLm5hbWUuY29udGFpbnMoJ3F1b3RlJykgfHwgbm9kZS5uYW1lLmNvbnRhaW5zKCdibG9ja2lkJykpIHtcblx0XHRcdFx0cmVtYWluX25leHRfYmxhbmsgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHJlbWFpbl9uZXh0X2JsYW5rID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIGNvbnNvbGUubG9nKFwiZGVsZXRlX2luZGV4XCIsZGVsZXRlX2luZGV4KVxuXHRcdGxldCBuZXdDb250ZW50ID0gXCJcIjtcblx0XHRmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVfbnVtOyBpKyspIHtcblx0XHRcdGlmICghZGVsZXRlX2luZGV4LmNvbnRhaW5zKGkpKSB7XG5cdFx0XHRcdG5ld0NvbnRlbnQgKz0gZG9jLmxpbmUoaSkudGV4dCArICdcXG4nO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIWRlbGV0ZV9pbmRleC5jb250YWlucyhsaW5lX251bSkpIHtcblx0XHRcdG5ld0NvbnRlbnQgKz0gZG9jLmxpbmUobGluZV9udW0pLnRleHRcblx0XHR9XG5cblx0XHRlZGl0b3Iuc2V0VmFsdWUobmV3Q29udGVudCk7XG5cdFx0Ly8gdGhpcy5Db250ZW50UGFyc2VyLnJlcGFyc2UoZWRpdG9yLmdldFZhbHVlKCksIDApO1xuXHR9XG5cblx0c3dpdGNoQXV0b0Zvcm1hdHRpbmcoKSB7XG5cdFx0dGhpcy5zZXR0aW5ncy5BdXRvRm9ybWF0ID0gIXRoaXMuc2V0dGluZ3MuQXV0b0Zvcm1hdDtcblx0XHRsZXQgc3RhdHVzID0gdGhpcy5zZXR0aW5ncy5BdXRvRm9ybWF0ID8gJ29uJyA6ICdvZmYnO1xuXHRcdG5ldyBOb3RpY2UoJ0Vhc3lUeXBpbmc6IEF1dG9mb3JtYXQgaXMgJyArIHN0YXR1cyArICchJyk7XG5cdH1cblxuXHRjb252ZXJ0MkNvZGVCbG9jayhlZGl0b3I6IEVkaXRvcikge1xuXHRcdGlmICh0aGlzLnNldHRpbmdzLmRlYnVnKSBjb25zb2xlLmxvZyhcIi0tLS0tIEVhc3lUeXBpbmc6IGluc2VydCBjb2RlIGJsb2NrLS0tLS1cIik7XG5cdFx0aWYgKGVkaXRvci5zb21ldGhpbmdTZWxlY3RlZCAmJiBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkgIT0gXCJcIikge1xuXHRcdFx0bGV0IHNlbGVjdGVkID0gZWRpdG9yLmdldFNlbGVjdGlvbigpO1xuXHRcdFx0bGV0IHNlbGVjdGVkUmFuZ2UgPSBlZGl0b3IubGlzdFNlbGVjdGlvbnMoKVswXTtcblx0XHRcdGxldCBhbmNob3IgPSBzZWxlY3RlZFJhbmdlLmFuY2hvcjtcblx0XHRcdGxldCBoZWFkID0gc2VsZWN0ZWRSYW5nZS5oZWFkO1xuXG5cdFx0XHRsZXQgcmVwbGFjZW1lbnQgPSBcImBgYFxcblwiICsgc2VsZWN0ZWQgKyBcIlxcbmBgYFwiO1xuXHRcdFx0Ly8gbWFrZSBzdXJlIGFuY2hvciA8IGhlYWRcblx0XHRcdGlmIChhbmNob3IubGluZSA+IGhlYWQubGluZSB8fCAoYW5jaG9yLmxpbmUgPT0gaGVhZC5saW5lICYmIGFuY2hvci5jaCA+IGhlYWQuY2gpKSB7XG5cdFx0XHRcdGxldCB0ZW1wID0gYW5jaG9yO1xuXHRcdFx0XHRhbmNob3IgPSBoZWFkO1xuXHRcdFx0XHRoZWFkID0gdGVtcDtcblx0XHRcdH1cblx0XHRcdGxldCBkc3RMaW5lID0gYW5jaG9yLmxpbmU7XG5cdFx0XHRpZiAoYW5jaG9yLmNoICE9IDApIHtcblx0XHRcdFx0cmVwbGFjZW1lbnQgPSAnXFxuJyArIHJlcGxhY2VtZW50O1xuXHRcdFx0XHRkc3RMaW5lICs9IDE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaGVhZC5jaCAhPSBlZGl0b3IuZ2V0TGluZShoZWFkLmxpbmUpLmxlbmd0aCkge1xuXHRcdFx0XHRyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50ICsgJ1xcbic7XG5cdFx0XHR9XG5cdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihyZXBsYWNlbWVudCk7XG5cdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogZHN0TGluZSwgY2g6IDMgfSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IGNzID0gZWRpdG9yLmdldEN1cnNvcigpO1xuXHRcdFx0bGV0IHJlcGxhY2UgPSBcImBgYFxcbmBgYFwiO1xuXHRcdFx0bGV0IGRzdExpbmUgPSBjcy5saW5lO1xuXHRcdFx0aWYgKGNzLmNoICE9IDApIHtcblx0XHRcdFx0cmVwbGFjZSA9IFwiXFxuXCIgKyByZXBsYWNlO1xuXHRcdFx0XHRkc3RMaW5lICs9IDE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY3MuY2ggIT0gZWRpdG9yLmdldExpbmUoY3MubGluZSkubGVuZ3RoKSB7XG5cdFx0XHRcdHJlcGxhY2UgPSByZXBsYWNlICsgJ1xcbic7XG5cdFx0XHR9XG5cdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKHJlcGxhY2UsIGNzKTtcblx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBkc3RMaW5lLCBjaDogMyB9KTtcblx0XHR9XG5cblx0fVxuXG5cdHJlZnJlc2hTZWxlY3Rpb25SZXBsYWNlUnVsZSgpIHtcblx0XHR0aGlzLlNlbGVjdGlvblJlcGxhY2VNYXAgPSBuZXcgTWFwKHRoaXMuc2VsZWN0aW9uUmVwbGFjZU1hcEluaXRhbERhdGEpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXIubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCB0cmlnZ2VyID0gdGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXJbaV07XG5cdFx0XHRsZXQgbGVmdHMgPSB0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVmFsdWVbaV0ubGVmdDtcblx0XHRcdGxldCByaWdodHMgPSB0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVmFsdWVbaV0ucmlnaHQ7XG5cblx0XHRcdHRoaXMuU2VsZWN0aW9uUmVwbGFjZU1hcC5zZXQodHJpZ2dlciwgeyBsZWZ0OiBsZWZ0cywgcmlnaHQ6IHJpZ2h0cyB9KTtcblx0XHR9XG5cdH1cblxuXHRhZGRVc2VyU2VsZWN0aW9uUmVwUnVsZSh0cmlnZ2VyOiBzdHJpbmcsIGxlZnQ6IHN0cmluZywgcmlnaHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlci5pbmNsdWRlcyh0cmlnZ2VyKSkgcmV0dXJuIGZhbHNlO1xuXHRcdHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVUcmlnZ2VyLnB1c2godHJpZ2dlcilcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVmFsdWUucHVzaCh7IGxlZnQ6IGxlZnQsIHJpZ2h0OiByaWdodCB9KTtcblx0XHR0aGlzLnJlZnJlc2hTZWxlY3Rpb25SZXBsYWNlUnVsZSgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0ZGVsZXRlVXNlclNlbGVjdGlvblJlcFJ1bGUoaWR4OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAoaWR4IDwgMCB8fCBpZHggPj0gdGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXIubGVuZ3RoKSByZXR1cm47XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXIuc3BsaWNlKGlkeCwgMSk7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVZhbHVlLnNwbGljZShpZHgsIDEpO1xuXHRcdHRoaXMucmVmcmVzaFNlbGVjdGlvblJlcGxhY2VSdWxlKCk7XG5cdH1cblxuXHR1cGRhdGVVc2VyU2VsZWN0aW9uUmVwUnVsZShpZHg6IG51bWJlciwgbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nKSB7XG5cdFx0aWYgKGlkeCA8IDAgfHwgaWR4ID49IHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVUcmlnZ2VyLmxlbmd0aCkgcmV0dXJuO1xuXHRcdHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZVtpZHhdLmxlZnQgPSBsZWZ0O1xuXHRcdHRoaXMuc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZVtpZHhdLnJpZ2h0ID0gcmlnaHQ7XG5cdFx0dGhpcy5yZWZyZXNoU2VsZWN0aW9uUmVwbGFjZVJ1bGUoKTtcblx0fVxuXG5cdHJlZnJlc2hVc2VyRGVsZXRlUnVsZSgpIHtcblx0XHR0aGlzLlVzZXJEZWxldGVSdWxlcyA9IHJ1bGVTdHJpbmdMaXN0MlJ1bGVMaXN0KHRoaXMuc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdCk7XG5cdH1cblxuXHRhZGRVc2VyRGVsZXRlUnVsZShiZWZvcmU6IHN0cmluZywgYWZ0ZXI6IHN0cmluZykge1xuXHRcdHRoaXMuc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdC5wdXNoKFtiZWZvcmUsIGFmdGVyXSk7XG5cdFx0dGhpcy5yZWZyZXNoVXNlckRlbGV0ZVJ1bGUoKTtcblx0fVxuXG5cdGRlbGV0ZVVzZXJEZWxldGVSdWxlKGlkeDogbnVtYmVyKSB7XG5cdFx0aWYgKGlkeCA+PSB0aGlzLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3QubGVuZ3RoIHx8IGlkeCA8IDApIHJldHVybjtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3Quc3BsaWNlKGlkeCwgMSk7XG5cdFx0dGhpcy5yZWZyZXNoVXNlckRlbGV0ZVJ1bGUoKTtcblx0fVxuXG5cdHVwZGF0ZVVzZXJEZWxldGVSdWxlKGlkeDogbnVtYmVyLCBiZWZvcmU6IHN0cmluZywgYWZ0ZXI6IHN0cmluZykge1xuXHRcdGlmIChpZHggPj0gdGhpcy5zZXR0aW5ncy51c2VyRGVsZXRlUnVsZXNTdHJMaXN0Lmxlbmd0aCB8fCBpZHggPCAwKSByZXR1cm47XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyRGVsZXRlUnVsZXNTdHJMaXN0W2lkeF1bMF0gPSBiZWZvcmU7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyRGVsZXRlUnVsZXNTdHJMaXN0W2lkeF1bMV0gPSBhZnRlcjtcblx0XHR0aGlzLnJlZnJlc2hVc2VyRGVsZXRlUnVsZSgpO1xuXHR9XG5cblx0cmVmcmVzaFVzZXJDb252ZXJ0UnVsZSgpIHtcblx0XHR0aGlzLlVzZXJDb252ZXJ0UnVsZXMgPSBydWxlU3RyaW5nTGlzdDJSdWxlTGlzdCh0aGlzLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0KTtcblx0fVxuXG5cdGFkZFVzZXJDb252ZXJ0UnVsZShiZWZvcmU6IHN0cmluZywgYWZ0ZXI6IHN0cmluZykge1xuXHRcdHRoaXMuc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3QucHVzaChbYmVmb3JlLCBhZnRlcl0pO1xuXHRcdHRoaXMucmVmcmVzaFVzZXJDb252ZXJ0UnVsZSgpO1xuXHR9XG5cblx0ZGVsZXRlVXNlckNvbnZlcnRSdWxlKGlkeDogbnVtYmVyKSB7XG5cdFx0aWYgKGlkeCA+PSB0aGlzLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0Lmxlbmd0aCB8fCBpZHggPCAwKSByZXR1cm47XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyQ29udmVydFJ1bGVzU3RyTGlzdC5zcGxpY2UoaWR4LCAxKTtcblx0XHR0aGlzLnJlZnJlc2hVc2VyQ29udmVydFJ1bGUoKTtcblx0fVxuXG5cdGdldENvbW1hbmROYW1lTWFwKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuXHRcdGNvbnN0IGxhbmcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmd1YWdlJyk7XG5cblx0XHRsZXQgY29tbWFuZF9uYW1lX21hcF9lbiA9IG5ldyBNYXAoW1xuXHRcdFx0W1wiZm9ybWF0X2FydGljbGVcIiwgXCJGb3JtYXQgY3VycmVudCBhcnRpY2xlXCJdLFxuXHRcdFx0W1wiZm9ybWF0X3NlbGVjdGlvblwiLCBcIkZvcm1hdCBzZWxlY3RlZCB0ZXh0IG9yIGN1cnJlbnQgbGluZVwiXSxcblx0XHRcdFtcImRlbGV0ZV9ibGFua19saW5lXCIsIFwiRGVsZXRlIGJsYW5rIGxpbmVzIG9mIHRoZSBzZWxlY3RlZCBvciB3aG9sZSBhcnRpY2xlXCJdLFxuXHRcdFx0W1wiaW5zZXJ0X2NvZGVibG9ja1wiLCBcIkluc2VydCBjb2RlIGJsb2NrIHcvd28gc2VsZWN0aW9uXCJdLFxuXHRcdFx0W1wic3dpdGNoX2F1dG9mb3JtYXRcIiwgXCJTd2l0Y2ggYXV0b2Zvcm1hdFwiXSxcblx0XHRcdFtcInBhc3RlX3dvX2Zvcm1hdFwiLCBcIlBhc3RlIHdpdGhvdXQgZm9ybWF0XCJdLFxuXHRcdF0pO1xuXG5cdFx0bGV0IGNvbW1hbmRfbmFtZV9tYXBfemhfVFcgPSBuZXcgTWFwKFtcblx0XHRcdFtcImZvcm1hdF9hcnRpY2xlXCIsIFwiXHU2ODNDXHU1RjBGXHU1MzE2XHU1MTY4XHU2NTg3XCJdLFxuXHRcdFx0W1wiZm9ybWF0X3NlbGVjdGlvblwiLCBcIlx1NjgzQ1x1NUYwRlx1NTMxNlx1OTA3OFx1NEUyRFx1OTBFOFx1NTIwNi9cdTc1NzZcdTUyNERcdTg4NENcIl0sXG5cdFx0XHRbXCJkZWxldGVfYmxhbmtfbGluZVwiLCBcIlx1NTIyQVx1OTY2NFx1OTA3OFx1NEUyRFx1OTBFOFx1NTIwNi9cdTUxNjhcdTY1ODdcdTc2ODRcdTU5MUFcdTk5MThcdTdBN0FcdTc2N0RcdTg4NENcIl0sXG5cdFx0XHRbXCJpbnNlcnRfY29kZWJsb2NrXCIsIFwiXHU2M0QyXHU1MTY1XHU0RUUzXHU3OEJDXHU1ODRBXCJdLFxuXHRcdFx0W1wic3dpdGNoX2F1dG9mb3JtYXRcIiwgXCJcdTUyMDdcdTYzREJcdTgxRUFcdTUyRDVcdTY4M0NcdTVGMEZcdTUzMTZcdTk1OEJcdTk1RENcIl0sXG5cdFx0XHRbXCJwYXN0ZV93b19mb3JtYXRcIiwgXCJcdTcxMjFcdTY4M0NcdTVGMEZcdTUzMTZcdTdDOThcdThDQkNcIl0sXG5cdFx0XSk7XG5cblx0XHRsZXQgY29tbWFuZF9uYW1lX21hcF96aCA9IG5ldyBNYXAoW1xuXHRcdFx0W1wiZm9ybWF0X2FydGljbGVcIiwgXCJcdTY4M0NcdTVGMEZcdTUzMTZcdTUxNjhcdTY1ODdcIl0sXG5cdFx0XHRbXCJmb3JtYXRfc2VsZWN0aW9uXCIsIFwiXHU2ODNDXHU1RjBGXHU1MzE2XHU5MDA5XHU0RTJEXHU5MEU4XHU1MjA2L1x1NUY1M1x1NTI0RFx1ODg0Q1wiXSxcblx0XHRcdFtcImRlbGV0ZV9ibGFua19saW5lXCIsIFwiXHU1MjJBXHU5NjY0XHU5MDA5XHU0RTJEXHU5MEU4XHU1MjA2L1x1NTE2OFx1NjU4N1x1NzY4NFx1NTkxQVx1NEY1OVx1N0E3QVx1NzY3RFx1ODg0Q1wiXSxcblx0XHRcdFtcImluc2VydF9jb2RlYmxvY2tcIiwgXCJcdTYzRDJcdTUxNjVcdTRFRTNcdTc4MDFcdTU3NTdcIl0sXG5cdFx0XHRbXCJzd2l0Y2hfYXV0b2Zvcm1hdFwiLCBcIlx1NTIwN1x1NjM2Mlx1ODFFQVx1NTJBOFx1NjgzQ1x1NUYwRlx1NTMxNlx1NUYwMFx1NTE3M1wiXSxcblx0XHRcdFtcInBhc3RlX3dvX2Zvcm1hdFwiLCBcIlx1NjVFMFx1NjgzQ1x1NUYwRlx1NTMxNlx1N0M5OFx1OEQzNFwiXSxcblx0XHRdKTtcblxuXHRcdGxldCBjb21tYW5kX25hbWVfbWFwX3J1ID0gbmV3IE1hcChbXG5cdFx0XHRbXCJmb3JtYXRfYXJ0aWNsZVwiLCBcIlx1MDQyNFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0NDNcdTA0NEUgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDRDXHUwNDRFXCJdLFxuXHRcdFx0W1wiZm9ybWF0X3NlbGVjdGlvblwiLCBcIlx1MDQyNFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0NDNcdTA0NEUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDQzXCJdLFxuXHRcdFx0W1wiZGVsZXRlX2JsYW5rX2xpbmVcIiwgXCJcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDRCXHUwNDM1IFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzOCBcdTA0MzIgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDNDIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0MzJcdTA0NDFcdTA0MzVcdTA0MzkgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDRDXHUwNDM1XCJdLFxuXHRcdFx0W1wiaW5zZXJ0X2NvZGVibG9ja1wiLCBcIlx1MDQxMlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0EgXHUwNDNBXHUwNDNFXHUwNDM0XHUwNDMwIFx1MDQ0MS9cdTA0MzFcdTA0MzVcdTA0MzcgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1XHUwNDNDXCJdLFxuXHRcdFx0W1wic3dpdGNoX2F1dG9mb3JtYXRcIiwgXCJcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1XCJdLFxuXHRcdFx0W1wicGFzdGVfd29fZm9ybWF0XCIsIFwiXHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMVx1MDQzNVx1MDQzNyBcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEZcIl0sXG5cdFx0XSk7XG5cblx0XHRsZXQgY29tbWFuZF9uYW1lX21hcCA9IGNvbW1hbmRfbmFtZV9tYXBfZW47XG5cdFx0aWYgKGxhbmcgPT0gJ3poJykge1xuXHRcdFx0Y29tbWFuZF9uYW1lX21hcCA9IGNvbW1hbmRfbmFtZV9tYXBfemg7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGxhbmcgPT0gJ3poLVRXJykge1xuXHRcdFx0Y29tbWFuZF9uYW1lX21hcCA9IGNvbW1hbmRfbmFtZV9tYXBfemhfVFc7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGxhbmcgPT0gXCJydVwiKSB7XG5cdFx0XHRjb21tYW5kX25hbWVfbWFwID0gY29tbWFuZF9uYW1lX21hcF9ydTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29tbWFuZF9uYW1lX21hcDtcblx0fVxuXG5cdHVwZGF0ZVVzZXJDb252ZXJ0UnVsZShpZHg6IG51bWJlciwgYmVmb3JlOiBzdHJpbmcsIGFmdGVyOiBzdHJpbmcpIHtcblx0XHRpZiAoaWR4ID49IHRoaXMuc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3QubGVuZ3RoIHx8IGlkeCA8IDApIHJldHVybjtcblx0XHR0aGlzLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0W2lkeF1bMF0gPSBiZWZvcmU7XG5cdFx0dGhpcy5zZXR0aW5ncy51c2VyQ29udmVydFJ1bGVzU3RyTGlzdFtpZHhdWzFdID0gYWZ0ZXI7XG5cdFx0dGhpcy5yZWZyZXNoVXNlckNvbnZlcnRSdWxlKCk7XG5cdH1cblxuXHRnZXRFZGl0b3IgPSAoKTogRWRpdG9yIHwgbnVsbCA9PiB7XG5cdFx0bGV0IGVkaXRvciA9IG51bGw7XG5cdFx0bGV0IG1hcmtkb3duVmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG5cdFx0aWYgKG1hcmtkb3duVmlldykge1xuXHRcdFx0ZWRpdG9yID0gbWFya2Rvd25WaWV3LmVkaXRvcjtcblx0XHR9XG5cdFx0aWYgKGVkaXRvciA9PT0gbnVsbCkgY29uc29sZS5sb2coJ2NhblxcJ3QgZ2V0IGVkaXRvcicpO1xuXHRcdHJldHVybiBlZGl0b3I7XG5cdH1cblxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG5cdH1cblxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcblx0fVxufSIsICJpbXBvcnQgeyBOb3RpY2V9IGZyb20gXCJvYnNpZGlhblwiXG5pbXBvcnQgeyBFYXN5VHlwaW5nU2V0dGluZ3MsIFdvcmtNb2RlIH0gZnJvbSAnLi9zZXR0aW5ncydcbmltcG9ydCB7IEFubm90YXRpb24sIEVkaXRvclN0YXRlLCBFeHRlbnNpb24sIFN0YXRlRmllbGQsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvblNwZWMsIFRleHQsIExpbmUgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBvZmZzZXRUb1BvcywgcG9zVG9PZmZzZXQsIHN0cmluZ0RlbGV0ZUF0LCBzdHJpbmdJbnNlcnRBdCwgaXNQYXJhbURlZmluZWR9IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgeyBlbnN1cmVTeW50YXhUcmVlLCBzeW50YXhUcmVlIH0gZnJvbSBcIkBjb2RlbWlycm9yL2xhbmd1YWdlXCI7XG5pbXBvcnQgeyBwcmludCB9IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IGVudW0gTGluZVR5cGUgeyB0ZXh0ID0gJ3RleHQnLCBjb2RlYmxvY2sgPSAnY29kZWJsb2NrJywgZm9ybXVsYSA9ICdmb3JtdWxhJywgXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlX3N0YXJ0ID0gJ2NvZGVfYmxvY2tfc3RhcnQnLCBjb2RlX2VuZCA9ICdjb2RlX2Jsb2NrX2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBub25lID0gJ25vbmUnLCBmcm9udG1hdHRlcj1cImZyb250bWF0dGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdW90ZT0ncXVvdGUnLCBjYWxsb3V0X3RpdGxlPSdjYWxsb3V0X3RpdGxlJywgbGlzdD0nbGlzdCcsIHRhYmxlPSAndGFibGUnIH1cblxuZXhwb3J0IGVudW0gU3BhY2VTdGF0ZSB7XG4gICAgbm9uZSxcbiAgICBzb2Z0LFxuICAgIHN0cmljdFxufVxuXG5leHBvcnQgZW51bSBJbmxpbmVUeXBlIHtcbiAgICB0ZXh0ID0gJ3RleHQnLCBjb2RlID0gJ2NvZGUnLCBmb3JtdWxhID0gJ2Zvcm11bGEnLFxuICAgIHdpa2lsaW5rID0gJ3dpa2lsaW5rJywgbWRsaW5rID0gXCJtZGxpbmtcIixcbiAgICB1c2VyID0gJ3VzZXItZGVmaW5lZCcsIG5vbmUgPSAnbm9uZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVDaGFuZ2Uge1xuICAgIHRleHQ6IHN0cmluZyxcbiAgICBiZWdpbjogbnVtYmVyLFxuICAgIGVuZDogbnVtYmVyLFxuICAgIG9yaWdpbjogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJ0aWNsZVBhcnQge1xuICAgIHR5cGU6IExpbmVUeXBlO1xuICAgIGJlZ2luOiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVQYXJ0IHtcbiAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgdHlwZTogSW5saW5lVHlwZTtcbiAgICBiZWdpbjogbnVtYmVyO1xuICAgIGVuZDogbnVtYmVyO1xuICAgIGxlZnRTcGFjZVJlcXVpcmU6IFNwYWNlU3RhdGU7XG4gICAgcmlnaHRTcGFjZVJlcXVpcmU6IFNwYWNlU3RhdGU7XG59XG5cbmV4cG9ydCBjbGFzcyBMaW5lRm9ybWF0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgc3ludGF4VHJlZU5vZGVOYW1lVHlwZShuYW1lOnN0cmluZyk6SW5saW5lVHlwZXtcbiAgICAgICAgaWYobmFtZS5jb250YWlucygnY29kZScpICYmICFuYW1lLmNvbnRhaW5zKFwibGlua1wiKSl7XG4gICAgICAgICAgICByZXR1cm4gSW5saW5lVHlwZS5jb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYobmFtZS5jb250YWlucygnbWF0aCcpKXtcbiAgICAgICAgICAgIHJldHVybiBJbmxpbmVUeXBlLmZvcm11bGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIHJldHVybiBJbmxpbmVUeXBlLnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwYXJhbSBsaW5lTnVtOiAxLWJhc2VkIGxpbmUgbnVtYmVyXG4gICAgcGFyc2VMaW5lV2l0aFN5bnRheFRyZWUoc3RhdGU6IEVkaXRvclN0YXRlLCBsaW5lTnVtOm51bWJlciwgcmVnUmVnRXhwPzogc3RyaW5nKXtcbiAgICAgICAgbGV0IGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGE6IElubGluZVBhcnRbXSA9IFtdO1xuICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lKGxpbmVOdW0pO1xuICAgICAgICBjb25zdCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSk7XG4gICAgICAgIGxldCBwb3MgPSBsaW5lLmZyb207XG4gICAgICAgIGxldCBwcmV2Tm9kZVR5cGU6SW5saW5lVHlwZSA9IElubGluZVR5cGUubm9uZTtcbiAgICAgICAgbGV0IHByZXZCZWdpbklkeCA9IDA7XG4gICAgICAgIHdoaWxlKHBvczxsaW5lLnRvKXtcbiAgICAgICAgICAgIGxldCBub2RlID0gdHJlZS5yZXNvbHZlKHBvcywgMSk7XG4gICAgICAgICAgICBsZXQgY3VyTm9kZVR5cGUgPSB0aGlzLnN5bnRheFRyZWVOb2RlTmFtZVR5cGUobm9kZS5uYW1lKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZihwcmV2Tm9kZVR5cGU9PUlubGluZVR5cGUubm9uZSl7XG4gICAgICAgICAgICAgICAgcHJldk5vZGVUeXBlPWN1ck5vZGVUeXBlO1xuICAgICAgICAgICAgICAgIHByZXZCZWdpbklkeD0wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZihwcmV2Tm9kZVR5cGU9PWN1ck5vZGVUeXBlKXt9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6bGluZS50ZXh0LnN1YnN0cmluZyhwcmV2QmVnaW5JZHgsIHBvcy1saW5lLmZyb20pLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOnByZXZOb2RlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgYmVnaW46cHJldkJlZ2luSWR4LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6cG9zLWxpbmUuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNwYWNlUmVxdWlyZTpTcGFjZVN0YXRlLm5vbmUsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0U3BhY2VSZXF1aXJlOlNwYWNlU3RhdGUubm9uZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcHJldk5vZGVUeXBlID0gY3VyTm9kZVR5cGU7XG4gICAgICAgICAgICAgICAgcHJldkJlZ2luSWR4ID0gcG9zLWxpbmUuZnJvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBuZXh0IHBvc1xuICAgICAgICAgICAgaWYgKGN1ck5vZGVUeXBlID09IElubGluZVR5cGUudGV4dCl7XG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICAgIHBvcyA9IG5vZGUudG87XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKHBvcz09bGluZS50byl7XG4gICAgICAgICAgICAgICAgbGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDpsaW5lLnRleHQuc3Vic3RyaW5nKHByZXZCZWdpbklkeCwgcG9zLWxpbmUuZnJvbSksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6cHJldk5vZGVUeXBlLFxuICAgICAgICAgICAgICAgICAgICBiZWdpbjpwcmV2QmVnaW5JZHgsXG4gICAgICAgICAgICAgICAgICAgIGVuZDpwb3MtbGluZS5mcm9tLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0U3BhY2VSZXF1aXJlOlNwYWNlU3RhdGUubm9uZSxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRTcGFjZVJlcXVpcmU6U3BhY2VTdGF0ZS5ub25lXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxpbmUgcGFydHM6IFwiLCBsaW5lUGFydHNPZlR4dENvZGVGb3JtdWxhKTtcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIGxldCByZXRBcnJheTogSW5saW5lUGFydFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGFbaV0udHlwZSAhPSBJbmxpbmVUeXBlLnRleHQpIHtcbiAgICAgICAgICAgICAgICByZXRBcnJheS5wdXNoKGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGFbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRlbXBBcnJheTogSW5saW5lUGFydFtdO1xuICAgICAgICAgICAgICAgIGlmIChpc1BhcmFtRGVmaW5lZChyZWdSZWdFeHApKVxuICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkgPSBzcGxpdFRleHRXaXRoTGlua0FuZFVzZXJEZWZpbmVkKGxpbmVQYXJ0c09mVHh0Q29kZUZvcm11bGFbaV0uY29udGVudCwgcmVnUmVnRXhwKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheSA9IHNwbGl0VGV4dFdpdGhMaW5rQW5kVXNlckRlZmluZWQobGluZVBhcnRzT2ZUeHRDb2RlRm9ybXVsYVtpXS5jb250ZW50KTtcbiAgICBcbiAgICAgICAgICAgICAgICB0ZW1wQXJyYXkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5iZWdpbiArPSBsaW5lUGFydHNPZlR4dENvZGVGb3JtdWxhW2ldLmJlZ2luO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmVuZCArPSBsaW5lUGFydHNPZlR4dENvZGVGb3JtdWxhW2ldLmJlZ2luO1xuICAgICAgICAgICAgICAgICAgICByZXRBcnJheS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHJldEFycmF5KVxuICAgICAgICByZXR1cm4gcmV0QXJyYXk7XG4gICAgfVxuXG4gICAgZm9ybWF0TGluZU9mRG9jKHN0YXRlOiBFZGl0b3JTdGF0ZSwgc2V0dGluZ3M6IEVhc3lUeXBpbmdTZXR0aW5ncywgZnJvbUI6IG51bWJlciwgdG9COiBudW1iZXIsIGluc2VydGVkU3RyOiBzdHJpbmcpOiBbVHJhbnNhY3Rpb25TcGVjW10sIFRyYW5zYWN0aW9uU3BlY10gfCBudWxsIHtcbiAgICAgICAgbGV0IGRvYyA9IHN0YXRlLmRvYztcbiAgICAgICAgbGV0IGxpbmUgPSBkb2MubGluZUF0KGZyb21CKS50ZXh0O1xuICAgICAgICBsZXQgcmVzID0gbnVsbFxuICAgICAgICBpZiAoaW5zZXJ0ZWRTdHIuY29udGFpbnMoXCJcXG5cIikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdGcm9tQiwgVG9CJywgZnJvbUIsIHRvQilcbiAgICAgICAgICAgIHJlcyA9IHRoaXMuZm9ybWF0TGluZShzdGF0ZSwgZG9jLmxpbmVBdChmcm9tQikubnVtYmVyLCBzZXR0aW5ncywgb2Zmc2V0VG9Qb3MoZG9jLCBmcm9tQikuY2gsIG9mZnNldFRvUG9zKGRvYywgZnJvbUIpLmNoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlcyA9IHRoaXMuZm9ybWF0TGluZShzdGF0ZSwgZG9jLmxpbmVBdChmcm9tQikubnVtYmVyLCBzZXR0aW5ncywgb2Zmc2V0VG9Qb3MoZG9jLCB0b0IpLmNoLCBvZmZzZXRUb1Bvcyhkb2MsIGZyb21CKS5jaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcyA9PT1udWxsIHx8IHJlc1syXS5sZW5ndGg9PTApIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IG5ld2xpbmUgPSBzdHJpbmdJbnNlcnRBdChyZXNbMF0sIHJlc1sxXSwgXCJ8XCIpO1xuICAgICAgICAvLyBpZiAoc2V0dGluZ3MuZGVidWcpIGNvbnNvbGUubG9nKFwiRWFzeVR5cGluZzogTmV3IExpbmUgU3RyaW5nOlwiLCBuZXdsaW5lKVxuXG4gICAgICAgIGxldCBjaGFuZ2VzOiBUcmFuc2FjdGlvblNwZWNbXSA9IFtdO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gZG9jLmxpbmVBdChmcm9tQikuZnJvbTtcblxuICAgICAgICBmb3IobGV0IGNoYW5nZUl0ZW0gb2YgcmVzWzJdKVxuICAgICAgICB7XG4gICAgICAgICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIGNoYW5nZXM6e2Zyb206IG9mZnNldCtjaGFuZ2VJdGVtLmJlZ2luLCB0bzpvZmZzZXQrY2hhbmdlSXRlbS5lbmQsIGluc2VydDpjaGFuZ2VJdGVtLnRleHR9LCB1c2VyRXZlbnQ6XCJFYXN5VHlwaW5nLmNoYW5nZVwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnNlcnRlZFN0ci5jb250YWlucyhcIlxcblwiKSl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImluc2VydFN0clwiLCBpbnNlcnRlZFN0cilcbiAgICAgICAgICAgIHJlc1sxXSs9IGluc2VydGVkU3RyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NoYW5nZXMsIHtzZWxlY3Rpb246e2FuY2hvcjpvZmZzZXQrcmVzWzFdfSwgdXNlckV2ZW50OlwiRWFzeVR5cGluZy5jaGFuZ2VcIn1dO1xuICAgIH1cblxuICAgIC8vIFx1OEZENFx1NTZERVx1NTAzQ1x1RkYxQSBbXHU2NzAwXHU3RUM4XHU3Njg0XHU4ODRDXHVGRjBDXHU2NzAwXHU3RUM4XHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXHVGRjBDXHU1MTg1XHU1QkI5XHU2NTM5XHU1M0Q4XVxuICAgIC8vIHBhcmFtIGxpbmVOdW06IDEtYmFzZWQgbGluZSBudW1iZXJcbiAgICAvLyBjdXJDaDogXHU1MTQ5XHU2ODA3XHU1NzI4XHU1RjUzXHU1MjREXHU4ODRDXHU3Njg0XHU0RjREXHU3RjZFXG4gICAgLy8gcHJldkNoOiBcdTUxNDlcdTY4MDdcdTU3MjhcdTUyNERcdTRFMDBcdTY1RjZcdTUyM0JcdTU3MjhcdTVGNTNcdTUyNERcdTg4NENcdTc2ODRcdTRGNERcdTdGNkVcbiAgICBmb3JtYXRMaW5lKHN0YXRlOiBFZGl0b3JTdGF0ZSwgbGluZU51bTpudW1iZXIsIHNldHRpbmdzOiBFYXN5VHlwaW5nU2V0dGluZ3MsIGN1ckNoOiBudW1iZXIsIHByZXZDaD86IG51bWJlcik6IFtzdHJpbmcsIG51bWJlciwgSW5saW5lQ2hhbmdlW11dIHwgbnVsbCB7XG4gICAgICAgIC8vIG5ldyBOb3RpY2UoXCJmb3JtYXQtbm93XCIpO1xuICAgICAgICBsZXQgbGluZSA9IHN0YXRlLmRvYy5saW5lKGxpbmVOdW0pLnRleHQ7XG4gICAgICAgIGxldCByZWdOdWxsID0gL15cXHMqJC9nO1xuICAgICAgICBpZiAocmVnTnVsbC50ZXN0KGxpbmUpKSByZXR1cm4gW2xpbmUsIGN1ckNoLCBbXV07XG4gICAgICAgIC8vIDEuIFx1NTIxMlx1NTIwNlx1NEUwMFx1ODg0Q1x1NjU4N1x1NUI1N1x1NzY4NFx1NTE4NVx1OTBFOFx1NEUwRFx1NTQwQ1x1NkEyMVx1NTc1N1x1NTMzQVx1NTdERlxuXG4gICAgICAgIGxldCBsaW5lUGFydHMgPSBzZXR0aW5ncy5Vc2VyRGVmaW5lZFJlZ1N3aXRjaFxuICAgICAgICA/IHRoaXMucGFyc2VMaW5lV2l0aFN5bnRheFRyZWUoc3RhdGUsIGxpbmVOdW0sIHNldHRpbmdzLlVzZXJEZWZpbmVkUmVnRXhwKVxuICAgICAgICA6IHRoaXMucGFyc2VMaW5lV2l0aFN5bnRheFRyZWUoc3RhdGUsIGxpbmVOdW0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKHNldHRpbmdzLmRlYnVnKSBjb25zb2xlLmxvZyhcImxpbmUgcGFydHNcXG5cIiwgbGluZVBhcnRzKTtcblxuICAgICAgICAvLyBcdTU5MDdcdTRFRkRcdTUzOUZcdTY3NjVcdTc2ODRsaW5lUGFydHMsIFx1NkRGMVx1NjJGN1x1OEQxRFxuICAgICAgICBsZXQgbGluZVBhcnRzT3JpZ2luID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsaW5lUGFydHMpKTtcbiAgICAgICAgbGV0IGlubGluZUNoYW5nZUxpc3Q6IElubGluZUNoYW5nZVtdID0gW107XG5cbiAgICAgICAgbGV0IGN1cnNvckxpbmVQYXJ0SW5kZXggPSAtMTtcbiAgICAgICAgbGV0IGN1cnNvclJlbGF0aXZlSW5kZXggPSAtMTtcbiAgICAgICAgbGV0IHJlc3VsdEN1cnNvckNoID0gMDsgICAgIC8vIFx1OEY5M1x1NTFGQVx1NzY4NFx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVxuXG4gICAgICAgIC8vIDIuIFx1NjI3RVx1NTIzMFx1NTE0OVx1NjgwN1x1NjI0MFx1NTcyOFx1NzY4NFx1OTBFOFx1NTIwNlx1RkYwQ1x1NTk4Mlx1Njc5Q1x1NjYyRiBJbmxpbmVQYXJ0LnRleHRcdUZGMENcdTUyMTlcdTU3MjhcdTUxNDlcdTY4MDdcdTU5MDRcdTYzRDJcdTUxNjUnXFwwJ1x1Njc2NVx1NjgwN1x1OEJCMFx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVQYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGN1ckNoID4gbGluZVBhcnRzW2ldLmJlZ2luICYmIGN1ckNoIDw9IGxpbmVQYXJ0c1tpXS5lbmQpIHtcbiAgICAgICAgICAgICAgICBjdXJzb3JMaW5lUGFydEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBjdXJzb3JSZWxhdGl2ZUluZGV4ID0gY3VyQ2ggLSBsaW5lUGFydHNbaV0uYmVnaW47XG4gICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS50eXBlID09PSBJbmxpbmVUeXBlLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSBzdHJpbmdJbnNlcnRBdChsaW5lUGFydHNbaV0uY29udGVudCwgY3Vyc29yUmVsYXRpdmVJbmRleCwgJ1xcMCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0TGluZSA9ICcnO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgLy8gXHU0RkREXHU1QjU4XHU1MjREXHU0RTAwXHU5MEU4XHU1MjA2XHU3Njg0XHU1MzNBXHU1NzU3XHU3QzdCXHU1NzhCXHVGRjBDSW5saW5lVHlwZS5ub25lIFx1NEVFM1x1ODg2OFx1NEUwMFx1ODg0Q1x1NzY4NFx1NUYwMFx1NTlDQlxuICAgICAgICBsZXQgcHJldlBhcnRUeXBlOiBzdHJpbmcgPSBJbmxpbmVUeXBlLm5vbmU7XG4gICAgICAgIGxldCBwcmV2VGV4dEVuZFNwYWNlU3RhdGUgPSBTcGFjZVN0YXRlLm5vbmU7XG5cbiAgICAgICAgLy8gMy4gXHU5MDREXHU1Mzg2XHU2QkNGXHU0RTJBXHU4ODRDXHU5MEU4XHU1MjA2XHVGRjBDXHU4RkRCXHU4ODRDXHU2ODNDXHU1RjBGXHU1MzE2XHU1OTA0XHU3NDA2XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyAzLjEgXHU1OTgyXHU2NzlDXHU4ODRDXHU1MTg1XHU3QjJDXHU0RTAwXHU5MEU4XHU1MjA2XHU0RTNBXHU2NTg3XHU2NzJDXHVGRjBDXHU1MjE5XHU1OTA0XHU3NDA2XHU1M0U1XHU5OTk2XHU1QjU3XHU2QkNEXHU1OTI3XHU1MTk5XHU3Njg0XHU5MEU4XHU1MjA2XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBsaW5lUGFydHNbaV0udHlwZSA9PT0gSW5saW5lVHlwZS50ZXh0ICYmIHNldHRpbmdzLkF1dG9DYXBpdGFsKSB7XG4gICAgICAgICAgICAgICAgLy8gMy4xLjEgXHU1OTgyXHU2NzlDIHByZXZDdXJzb3IgXHU0RTE0XHU1MTQ5XHU2ODA3XHU0RTBEXHU1NzI4XHU2QjY0XHU5MEU4XHU1MjA2XHVGRjBDXHU1MjE5XHU4REYzXHU4RkM3XG4gICAgICAgICAgICAgICAgaWYgKGlzUGFyYW1EZWZpbmVkKHByZXZDaCkgJiYgY3Vyc29yTGluZVBhcnRJbmRleCAhPSAwKSB7IH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0ZpcnN0U2VudGVuY2UgPSAvXlxccyooXFwtIChcXFtbeCBdXFxdICk/KT9cdTIwMUM/W2EtelxcdTA0MDFcXHUwNDUxXFx1MDQxMC1cXHUwNDRmXS9nO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnSGVhZGVyU2VudGVuY2UgPSAvXigjKyB8PisgP3xcdTIwMUMpW2EtelxcdTA0MDFcXHUwNDUxXFx1MDQxMC1cXHUwNDRmXS9nO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dGNvcHkgPSBsaW5lUGFydHNbMF0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gcmVnRmlyc3RTZW50ZW5jZS5leGVjKHRleHRjb3B5KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoSGVhZGVyID0gcmVnSGVhZGVyU2VudGVuY2UuZXhlYyh0ZXh0Y29weSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkc3RDaGFySW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkc3RDaGFySW5kZXggPSByZWdGaXJzdFNlbnRlbmNlLmxhc3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRzdENoYXJJbmRleCA9IHJlZ0hlYWRlclNlbnRlbmNlLmxhc3RJbmRleCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQXV0b0NhcGl0YWxNb2RlID09IFdvcmtNb2RlLkdsb2JhbGx5IHx8IChpc1BhcmFtRGVmaW5lZChwcmV2Q2gpICYmIGRzdENoYXJJbmRleCA+PSBwcmV2Q2ggJiYgZHN0Q2hhckluZGV4IDwgY3VyQ2gpKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkc3RDaGFySW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkc3RDaGFySW5kZXggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzWzBdLmNvbnRlbnQgPSB0ZXh0Y29weS5zdWJzdHJpbmcoMCwgZHN0Q2hhckluZGV4KSArIHRleHRjb3B5LmNoYXJBdChkc3RDaGFySW5kZXgpLnRvVXBwZXJDYXNlKCkgKyB0ZXh0Y29weS5zdWJzdHJpbmcoZHN0Q2hhckluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAobGluZVBhcnRzW2ldLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyAzLjIuMSBcdTU5MDRcdTc0MDZcdTY1ODdcdTY3MkNcdTUzM0FcdTU3NTdcbiAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudGV4dDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC40IFx1NTkwNFx1NzQwNlx1NTNFNVx1OTk5Nlx1NUI1N1x1NkJDRFx1NTkyN1x1NTE5OVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQXV0b0NhcGl0YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWcgPSAvW1xcLlxcP1xcIVx1MzAwMlx1RkYwMVx1RkYxRl0oW1xcc10qKVthLXpcXHUwNDAxXFx1MDQ1MVxcdTA0MTAtXFx1MDQ0Zl0vZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gcmVnLmV4ZWMoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBJbmRleCA9IHJlZy5sYXN0SW5kZXggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicHJldkNoLCBjdXJDaCwgb2Zmc2V0LCB0ZW1wSW5kZXhcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhwcmV2Q2gsIGN1ckNoLCBvZmZzZXQsIHRlbXBJbmRleClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNTcGFjZURvdCA9IHRlbXBJbmRleC0yPDAgfHwgY29udGVudC5zdWJzdHJpbmcodGVtcEluZGV4LTIsIHRlbXBJbmRleCk9PScgLic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLkF1dG9DYXBpdGFsTW9kZSA9PSBXb3JrTW9kZS5HbG9iYWxseSAmJiAhaXNTcGFjZURvdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIHRlbXBJbmRleCkgKyBjb250ZW50LmNoYXJBdCh0ZW1wSW5kZXgpLnRvVXBwZXJDYXNlKCkgKyBjb250ZW50LnN1YnN0cmluZyhyZWcubGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1BhcmFtRGVmaW5lZChwcmV2Q2gpICYmIHRlbXBJbmRleCA+PSBwcmV2Q2ggLSBvZmZzZXQgJiYgdGVtcEluZGV4IDwgY3VyQ2ggLSBvZmZzZXQgJiYgIWlzU3BhY2VEb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZygwLCB0ZW1wSW5kZXgpICsgY29udGVudC5jaGFyQXQodGVtcEluZGV4KS50b1VwcGVyQ2FzZSgpICsgY29udGVudC5zdWJzdHJpbmcocmVnLmxhc3RJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gICBcblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbnNlcnRTcGFjZShjb250ZW50OiBzdHJpbmcsIHJlZzogUmVnRXhwLCBwcmV2Q2g6IG51bWJlciwgY3VyQ2g6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpOiBbc3RyaW5nLCBudW1iZXJdIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gcmVnLmV4ZWMoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBJbmRleCA9IHJlZy5sYXN0SW5kZXggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1BhcmFtRGVmaW5lZChwcmV2Q2gpICYmIHRlbXBJbmRleCA+PSBwcmV2Q2ggLSBvZmZzZXQgJiYgdGVtcEluZGV4IDwgY3VyQ2ggLSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIHRlbXBJbmRleCkgKyBcIiBcIiArIGNvbnRlbnQuc3Vic3RyaW5nKHRlbXBJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckNoICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjb250ZW50LCBjdXJDaF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUZXh0LjEgXHU1OTA0XHU3NDA2XHU0RTJEXHU4MkYxXHU2NTg3XHU0RTRCXHU5NUY0XHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5DaGluZXNlRW5nbGlzaFNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnMSA9IC8oW0EtWmEtel0pKFtcXHU0ZTAwLVxcdTlmYTVdKS9naTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWcyID0gLyhbXFx1NGUwMC1cXHU5ZmE1XSkoW0EtWmEtel0pL2dpO1xuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnQsIGN1ckNoXSA9IGluc2VydFNwYWNlKGNvbnRlbnQsIHJlZzEsIHByZXZDaCwgY3VyQ2gsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudCwgY3VyQ2hdID0gaW5zZXJ0U3BhY2UoY29udGVudCwgcmVnMiwgcHJldkNoLCBjdXJDaCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5DaGluZXNlTnVtYmVyU3BhY2Upe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oWzAtOV0pKFtcXHU0ZTAwLVxcdTlmYTVdKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZzEgPSAvKFtcXHU0ZTAwLVxcdTlmYTVdKShbMC05XSkvZztcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50LCBjdXJDaF0gPSBpbnNlcnRTcGFjZShjb250ZW50LCByZWcsIHByZXZDaCwgY3VyQ2gsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudCwgY3VyQ2hdID0gaW5zZXJ0U3BhY2UoY29udGVudCwgcmVnMSwgcHJldkNoLCBjdXJDaCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5FbmdsaXNoTnVtYmVyU3BhY2Upe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oW0EtWmEtel0pKFxcZCkvZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWcxID0gLyhcXGQpKFtBLVphLXpdKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnQsIGN1ckNoXSA9IGluc2VydFNwYWNlKGNvbnRlbnQsIHJlZywgcHJldkNoLCBjdXJDaCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50LCBjdXJDaF0gPSBpbnNlcnRTcGFjZShjb250ZW50LCByZWcxLCBwcmV2Q2gsIGN1ckNoLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC4yIFx1NTkwNFx1NzQwNlx1NEUyRFx1NjU4N1x1OTVGNFx1NjVFMFx1N0E3QVx1NjgzQ1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuQ2hpbmVzZU5vU3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWcgPSAvKFtcXHU0ZTAwLVxcdTlmYTVcdUZGMENcdTMwMDJcdTMwMDFcdUZGMDFcdUZGMUJcdTIwMThcdTIwMTlcdTMwMEFcdTMwMEJdKykoXFxzKykoW1xcdTRlMDAtXFx1OWZhNVx1RkYwQ1x1MzAwMlx1MzAwMVx1RkYwMVx1RkYxQlx1MjAxOFx1MjAxOVx1MzAwQVx1MzAwQl0rKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlZy5leGVjKGNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UocmVnLCBcIiQxJDNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gXHU2ODA3XHU3MEI5XHU0RTBFXHU2NTg3XHU2NzJDXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5QdW5jdHVhdGlvblNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0LjMgXHU1OTA0XHU3NDA2XHU2ODA3XHU3MEI5XHU0RTBFXHU2NTg3XHU2NzJDXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihzZXR0aW5ncy5FbmdsaXNoU3BhY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZyA9IC8oWyxcXC47XFw/XFwhXFwpXSkoWzAtOUEtWmEtelxcdTA0MDFcXHUwNDUxXFx1MDQxMC1cXHUwNDRmXFx1NGUwMC1cXHU5ZmE1XSl8KFtBLVphLXowLTlcXHU0ZTAwLVxcdTlmYTU6LFxcLlxcP1xcISdcIl0rKShcXCgpfFssXFwuO1xcPzohXVtcXHU0ZTAwLVxcdTlmYTVdL2dpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHJlZy5leGVjKGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBJbmRleCA9IHJlZy5sYXN0SW5kZXggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNTcGFjZURvdCA9ICchLj87LCcuY29udGFpbnMoY29udGVudC5jaGFyQXQodGVtcEluZGV4LTEpKSAmJiAoKHRlbXBJbmRleC0yPDAgJiYgaT09MCkgfHwgY29udGVudC5jaGFyQXQodGVtcEluZGV4LTIpPT0nICcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNOdW1QdW5jTnVtID0gL1ssLl1cXGQvLnRlc3QoY29udGVudC5zdWJzdHJpbmcodGVtcEluZGV4LTEsIHRlbXBJbmRleCsxKSkgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBJbmRleC0yPDAgfHwgL1xcZC8udGVzdChjb250ZW50LmNoYXJBdCh0ZW1wSW5kZXgtMikpKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5QdW5jdHVhdGlvblNwYWNlTW9kZSA9PSBXb3JrTW9kZS5HbG9iYWxseSAmJiAhaXNTcGFjZURvdCAmJiAhaXNOdW1QdW5jTnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoMCwgdGVtcEluZGV4KSArIFwiIFwiICsgY29udGVudC5zdWJzdHJpbmcodGVtcEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1BhcmFtRGVmaW5lZChwcmV2Q2gpICYmIHRlbXBJbmRleCA+PSBwcmV2Q2ggLSBvZmZzZXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcEluZGV4IDwgY3VyQ2ggLSBvZmZzZXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWlzU3BhY2VEb3QgJiYgIWlzTnVtUHVuY051bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsIHRlbXBJbmRleCkgKyBcIiBcIiArIGNvbnRlbnQuc3Vic3RyaW5nKHRlbXBJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJDaCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXHU1MzU1XHU3MkVDXHU1OTA0XHU3NDA2XHU1MTkyXHU1M0Y3XHU1NDBFXHU2NTg3XHU2NzJDXHU3Njg0XHU4MUVBXHU1MkE4XHU3QTdBXHU2ODNDXHVGRjBDXHU0RTNBXHU0RTg2XHU1MTdDXHU1QkI5IDplbW9qaTogXHU2ODNDXHU1RjBGXHU3Njg0XHU4RjkzXHU1MTY1XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZzIgPSAvKDopKFtBLVphLXowLTlfXStbICxcXC5cXD9cXFxcXFwvOydcIlx1RkYwQ1x1MzAwMlx1RkYxRlx1RkYxQlx1MjAxOFx1MjAxQ1x1MjAxRFx1MjAxOVx1MzAwMVxcW1xcXVxcLVxce1xcfV0pL2dpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gY29udGVudC5yZXBsYWNlKHJlZzIsIFwiJDEgJDJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZzMgPSAvKDopKFtcIiddKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gY29udGVudC5yZXBsYWNlKHJlZzMsIFwiJDEgJDJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC43IFx1NUY5N1x1NTIzMFx1NjU4N1x1NjcyQ1x1OTBFOFx1NTIwNlx1NjYyRlx1NTQyNlx1NEVFNVx1N0E3QVx1NzY3RFx1N0IyNlx1NUYwMFx1NTlDQlx1NjIxNlx1N0VEM1x1Njc1Rlx1RkYwQ1x1NzUyOFx1Njc2NVx1NTIyNFx1NjVBRFx1NTQwRVx1N0VFRFx1NjU4N1x1NjcyQ1x1NTI0RFx1NTQwRVx1NjYyRlx1NTQyNlx1OTcwMFx1ODk4MVx1NkRGQlx1NTJBMFx1N0E3QVx1NjgzQ1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnU3RyaWN0U3BhY2VTdGFydCA9IC9eXFwwP1xccy87XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdTdHJpY3RTcGFjZUVuZCA9IC9cXHNcXDA/JC87XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdTdGFydFdpdGhTcGFjZSA9IC9eXFwwP1tcXHMsXFwuO1xcP1xcIVx1RkYwQ1x1MzAwMlx1RkYxQlx1MzAwQlx1RkYxRlx1RkYxQTpcdUZGMDF+XFwqXHUzMDAxXHVGRjA4XHVGRjA5XCJcdTIwMURcXFtcXF1cXClcXHtcXH1dLztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0VuZFdpdGhTcGFjZSA9IC9bXFxzXHVGRjBDXHUzMDAyXHUzMDAxXHVGRjFBXHVGRjFCXHVGRjFGXHVGRjAxXHVGRjA4XHVGRjA5flxcKlwiXHUzMDBBXHUyMDFDXFxbXFxdXFwoXFx7XFx9XVxcMD8kLztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR4dFN0YXJ0U3BhY2VTYXRlID0gU3BhY2VTdGF0ZS5ub25lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ1N0YXJ0V2l0aFNwYWNlLnRlc3QoY29udGVudCl8fGNvbnRlbnQuc3RhcnRzV2l0aChcIjxicj5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWdTdHJpY3RTcGFjZVN0YXJ0LnRlc3QoY29udGVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0U3RhcnRTcGFjZVNhdGUgPSBTcGFjZVN0YXRlLnN0cmljdFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dFN0YXJ0U3BhY2VTYXRlID0gU3BhY2VTdGF0ZS5zb2Z0XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVnRW5kV2l0aFNwYWNlLnRlc3QoY29udGVudCkgfHwgY29udGVudC5lbmRzV2l0aChcIjxicj5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWdTdHJpY3RTcGFjZUVuZC50ZXN0KGNvbnRlbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dEVuZFNwYWNlU3RhdGUgPSBTcGFjZVN0YXRlLnN0cmljdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRFbmRTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5zb2Z0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC44IFx1NjgzOVx1NjM2RVx1NTI0RFx1NEUwMFx1OTBFOFx1NTIwNlx1NzY4NFx1NTMzQVx1NTc1N1x1N0M3Qlx1NTc4Qlx1NTkwNFx1NzQwNlx1N0E3QVx1NjgzQ1x1NkRGQlx1NTJBMFx1NzY4NFx1OTVFRVx1OTg5OFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHByZXZQYXJ0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm5vbmU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuY29kZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZSA+IHR4dFN0YXJ0U3BhY2VTYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gJyAnICsgY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5mb3JtdWxhOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlID4gdHh0U3RhcnRTcGFjZVNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSAnICcgKyBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLndpa2lsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm1kbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLklubGluZUxpbmtTbWFydFNwYWNlICYmIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGUgPiB0eHRTdGFydFNwYWNlU2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9ICcgJyArIGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgJiYgdHh0U3RhcnRTcGFjZVNhdGUgPT0gU3BhY2VTdGF0ZS5ub25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyQXRUZXh0QmVnaW4gPSBjb250ZW50LmNoYXJBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ01kTGlua0VuZCA9IC9cXF0vO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hhckF0TGlua0VuZEluZGV4ID0gbGluZVBhcnRzW2kgLSAxXS5jb250ZW50LnNlYXJjaChyZWdNZExpbmtFbmQpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJBdExpbmtFbmQgPSBsaW5lUGFydHNbaSAtIDFdLmNvbnRlbnQuY2hhckF0KGNoYXJBdExpbmtFbmRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQXRMaW5rRW5kID09PSAnWycpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHdvTmVpZ2hib3JDaGFycyA9IGNoYXJBdExpbmtFbmQgKyBjaGFyQXRUZXh0QmVnaW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdOb3ROZWVkU3BhY2UgPSAvW1xcdTRlMDAtXFx1OWZhNVx1RkYwQ1x1MzAwMlx1RkYxRlx1RkYxQVx1RkYxQlx1MjAxRFx1MjAxQ1x1MjAxOVx1MjAxOC1cdUZGMDl9XVtcXHU0ZTAwLVxcdTlmYTVdL2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVnTm90TmVlZFNwYWNlLnRlc3QodHdvTmVpZ2hib3JDaGFycykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQYXJ0c1tpXS5jb250ZW50ID0gJyAnICsgY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS51c2VyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaSAtIDFdLnJpZ2h0U3BhY2VSZXF1aXJlID4gdHh0U3RhcnRTcGFjZVNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ldLmNvbnRlbnQgPSAnICcgKyBjb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dC45IFx1NTk4Mlx1Njc5Q1x1NTE0OVx1NjgwN1x1NTcyOFx1OEJFNVx1NTMzQVx1NTc1N1x1RkYwQ1x1NTIxOVx1OEJBMVx1N0I5N1x1NjcwMFx1N0VDOFx1NTE0OVx1NjgwN1x1NzY4NFx1NEY0RFx1N0Y2RVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gY3Vyc29yTGluZVBhcnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZyA9ICdcXDAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSBjb250ZW50LnNlYXJjaChyZWcpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDdXJzb3JDaCA9IG9mZnNldCArIG47XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcdTUyMjBcdTk2NjQgXFwwXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaV0uY29udGVudCA9IHN0cmluZ0RlbGV0ZUF0KGNvbnRlbnQsIG4pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgcHJldlBhcnRUeXBlID0gSW5saW5lVHlwZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICBwcmV2VGV4dEVuZFNwYWNlU3RhdGUgPSB0eHRFbmRTcGFjZVN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyAzLjIuMiBcdTU5MDRcdTc0MDZcdTg4NENcdTUxODVcdTRFRTNcdTc4MDFcdTU3NTdcdTkwRThcdTUyMDZcbiAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuY29kZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29kZS4xIFx1NjgzOVx1NjM2RVx1NTI0RFx1NEUwMFx1NTMzQVx1NTc1N1x1N0M3Qlx1NTc4Qlx1NTQ4Q3NldHRpbmdzXHU2REZCXHU1MkEwXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwcmV2UGFydFR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5ub25lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnRleHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUNvZGVTcGFjZU1vZGUgPiBwcmV2VGV4dEVuZFNwYWNlU3RhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5jb2RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmZvcm11bGE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUNvZGVTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVGb3JtdWxhU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm1kbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS53aWtpbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudXNlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0ucmlnaHRTcGFjZVJlcXVpcmU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29kZS4yIFx1NTk4Mlx1Njc5Q1x1NTE0OVx1NjgwN1x1NTcyOFx1OEJFNVx1NTMzQVx1NTc1N1x1RkYwQ1x1NTIxOVx1OEJBMVx1N0I5N1x1NjcwMFx1N0VDOFx1NTE0OVx1NjgwN1x1NzY4NFx1NEY0RFx1N0Y2RVxuICAgICAgICAgICAgICAgICAgICBpZihpID09PSBjdXJzb3JMaW5lUGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDdXJzb3JDaCA9IG9mZnNldCArIGN1cnNvclJlbGF0aXZlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ29kZS4zIFx1NTNEOFx1OTFDRlx1NjZGNFx1NjVCMFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBwcmV2UGFydFR5cGUgPSBJbmxpbmVUeXBlLmNvZGU7XG4gICAgICAgICAgICAgICAgICAgIHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gMy4yLjMgXHU1OTA0XHU3NDA2XHU4ODRDXHU1MTg1XHU1MTZDXHU1RjBGXHU3Njg0XHU5MEU4XHU1MjA2XG4gICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLmZvcm11bGE6XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaV0uY29udGVudCA9PSBcIiRcXFxccXF1YWQkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZQYXJ0VHlwZSA9IElubGluZVR5cGUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUuc3RyaWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9ybXVsYS4xIFx1NjgzOVx1NjM2RVx1NTI0RFx1NEUwMFx1NTMzQVx1NTc1N1x1N0M3Qlx1NTc4Qlx1NTQ4Q3NldHRpbmdzXHU2REZCXHU1MkEwXHU3QTdBXHU2ODNDXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChwcmV2UGFydFR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5ub25lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnRleHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGU+cHJldlRleHRFbmRTcGFjZVN0YXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0uY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuY29kZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5mb3JtdWxhOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVDb2RlU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm1kbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS53aWtpbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudXNlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0ucmlnaHRTcGFjZVJlcXVpcmU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9ybXVsYS4yIFx1NTk4Mlx1Njc5Q1x1NTE0OVx1NjgwN1x1NTcyOFx1OEJFNVx1NTMzQVx1NTc1N1x1RkYwQ1x1NTIxOVx1OEJBMVx1N0I5N1x1NjcwMFx1N0VDOFx1NTE0OVx1NjgwN1x1NzY4NFx1NEY0RFx1N0Y2RVxuICAgICAgICAgICAgICAgICAgICBpZihpID09PSBjdXJzb3JMaW5lUGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDdXJzb3JDaCA9IG9mZnNldCArIGN1cnNvclJlbGF0aXZlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9ybXVsYS4zIFx1NTNEOFx1OTFDRlx1NjZGNFx1NjVCMFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBwcmV2UGFydFR5cGUgPSBJbmxpbmVUeXBlLmZvcm11bGE7XG4gICAgICAgICAgICAgICAgICAgIHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubWRsaW5rOlxuICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS53aWtpbGluazpcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHByZXZQYXJ0VHlwZSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLm5vbmU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUudGV4dDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldlRleHRFbmRTcGFjZVN0YXRlPj1zZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlICYmICAhc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2VGV4dEVuZFNwYWNlU3RhdGU9PVNwYWNlU3RhdGUuc3RyaWN0ICYmIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU9PVNwYWNlU3RhdGUuc3RyaWN0KSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hhckF0VGV4dEVuZCA9IGxpbmVQYXJ0c1tpIC0gMV0uY29udGVudC5jaGFyQXQobGluZVBhcnRzW2kgLSAxXS5jb250ZW50Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyQXRMaW5rQmVnaW46IHN0cmluZyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS50eXBlID09IElubGluZVR5cGUud2lraWxpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0FsaWFzID0gL1xcfC87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGFyT2ZBbGlhc0JlZ2luID0gbGluZVBhcnRzW2ldLmNvbnRlbnQuc2VhcmNoKHJlZ0FsaWFzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGFyT2ZBbGlhc0JlZ2luXCIsY2hhck9mQWxpYXNCZWdpbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJlZ2luSW5kZXggPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZVBhcnRzW2ldLmNvbnRlbnQuY2hhckF0KDApID09PSAnIScpIGJlZ2luSW5kZXggPSAzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyT2ZBbGlhc0JlZ2luICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbkluZGV4ID0gY2hhck9mQWxpYXNCZWdpbiArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGluZVBhcnRzW2ldLmNvbnRlbnQuY2hhckF0KGJlZ2luSW5kZXgpID09ICcjJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5JbmRleCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhckF0TGlua0JlZ2luID0gbGluZVBhcnRzW2ldLmNvbnRlbnQuY2hhckF0KGJlZ2luSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImJlZ2luSW5kZXhcIiwgYmVnaW5JbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQXRMaW5rQmVnaW4gPT0gJ10nKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdNZExpbmtCZWdpbiA9IC9cXFsvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hhckF0TGlua0JlZ2luSW5kZXggPSBsaW5lUGFydHNbaV0uY29udGVudC5zZWFyY2gocmVnTWRMaW5rQmVnaW4pICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhckF0TGlua0JlZ2luID0gbGluZVBhcnRzW2ldLmNvbnRlbnQuY2hhckF0KGNoYXJBdExpbmtCZWdpbkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJBdExpbmtCZWdpbiA9PT0gJ10nKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IFxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZT09U3BhY2VTdGF0ZS5zdHJpY3QgJiYgcHJldlRleHRFbmRTcGFjZVN0YXRlPFNwYWNlU3RhdGUuc3RyaWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0uY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgJiYgbGluZVBhcnRzW2ktMV0uY29udGVudC5lbmRzV2l0aCgnICcpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXBDb250ZW50ID0gbGluZVBhcnRzW2ktMV0uY29udGVudCtjaGFyQXRMaW5rQmVnaW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdSZXZlcnRTcGFjZSA9IC9bXFx1NGUwMC1cXHU5ZmE1XSBbXFx1NGUwMC1cXHU5ZmE1XSQvO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnUmV2ZXJ0U3BhY2UudGVzdCh0ZW1wQ29udGVudCkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0uY29udGVudCA9IGxpbmVQYXJ0c1tpLTFdLmNvbnRlbnQuc3Vic3RyaW5nKDAsIGxpbmVQYXJ0c1tpLTFdLmNvbnRlbnQubGVuZ3RoLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSA9IHJlc3VsdExpbmUuc3Vic3RyaW5nKDAsIHJlc3VsdExpbmUubGVuZ3RoLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgJiYgcHJldlRleHRFbmRTcGFjZVN0YXRlPT1TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVnTm9OZWVkU3BhY2UgPSAvW1xcdTRlMDAtXFx1OWZhNV1bXFx1NGUwMC1cXHU5ZmE1XS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHdvTmVpZ2hib3JDaGFycyA9IGNoYXJBdFRleHRFbmQrY2hhckF0TGlua0JlZ2luO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcmVnTm9OZWVkU3BhY2UudGVzdCh0d29OZWlnaGJvckNoYXJzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0uY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIXNldHRpbmdzLklubGluZUxpbmtTbWFydFNwYWNlICYmIHNldHRpbmdzLklubGluZUxpbmtTcGFjZU1vZGU+cHJldlRleHRFbmRTcGFjZVN0YXRlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVBhcnRzW2ktMV0uY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUuY29kZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuSW5saW5lTGlua1NwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5mb3JtdWxhOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZXx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGU+U3BhY2VTdGF0ZS5ub25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lQ2hhbmdlTGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6JyAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNbaV0uYmVnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOicnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubWRsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLndpa2lsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnVzZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpLTFdLnJpZ2h0U3BhY2VSZXF1aXJlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIExpbmsuMiBcdTU5ODJcdTY3OUNcdThCRTVcdTUzM0FcdTU3NTdcdTY3MDlcdTUxNDlcdTY4MDdcdUZGMENcdTUyMTlcdThCQTFcdTdCOTdcdTY3MDBcdTdFQzhcdTUxNDlcdTY4MDdcdTRGNERcdTdGNkVcbiAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gY3Vyc29yTGluZVBhcnRJbmRleClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q3Vyc29yQ2ggPSBvZmZzZXQgKyBjdXJzb3JSZWxhdGl2ZUluZGV4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIExpbmsuMyBcdTY2RjRcdTY1QjBcdTUzRDhcdTkxQ0ZcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSBsaW5lUGFydHNbaV0uY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpbmVQYXJ0c1tpXS5jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgcHJldlBhcnRUeXBlID0gbGluZVBhcnRzW2ldLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHByZXZUZXh0RW5kU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gMy4yLjUgXHU1OTA0XHU3NDA2XHU3NTI4XHU2MjM3XHU4MUVBXHU1QjlBXHU0RTQ5XHU1MzNBXHU1NzU3XHU3Njg0XHU5MEU4XHU1MjA2XG4gICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnVzZXI6XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZXIuMSBcdTY4MzlcdTYzNkVcdTUyNERcdTRFMDBcdTUzM0FcdTU3NTdcdTdDN0JcdTU3OEJcdTU0OENzZXR0aW5nc1x1NkRGQlx1NTJBMFx1N0E3QVx1NjgzQ1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocHJldlBhcnRUeXBlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUubm9uZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS50ZXh0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaV0ubGVmdFNwYWNlUmVxdWlyZT5wcmV2VGV4dEVuZFNwYWNlU3RhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5jb250ZW50ICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5jb2RlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaV0ubGVmdFNwYWNlUmVxdWlyZT5TcGFjZVN0YXRlLm5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lQ29kZVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5mb3JtdWxhOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydHNbaV0ubGVmdFNwYWNlUmVxdWlyZT5TcGFjZVN0YXRlLm5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuSW5saW5lRm9ybXVsYVNwYWNlTW9kZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5saW5lVHlwZS5tZGxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElubGluZVR5cGUud2lraWxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS5sZWZ0U3BhY2VSZXF1aXJlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlPlNwYWNlU3RhdGUubm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OicgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbGluZVBhcnRzW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjonJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaW5lICs9ICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJbmxpbmVUeXBlLnVzZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVQYXJ0c1tpXS5sZWZ0U3BhY2VSZXF1aXJlPlNwYWNlU3RhdGUubm9uZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lUGFydHNbaS0xXS5yaWdodFNwYWNlUmVxdWlyZT5TcGFjZVN0YXRlLm5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDaGFuZ2VMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDonICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW46IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGxpbmVQYXJ0c1tpXS5iZWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46JydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBVc2VyLjIgXHU1OTgyXHU2NzlDXHU4QkU1XHU1MzNBXHU1NzU3XHU2NzA5XHU1MTQ5XHU2ODA3XHVGRjBDXHU1MjE5XHU4QkExXHU3Qjk3XHU2NzAwXHU3RUM4XHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXG4gICAgICAgICAgICAgICAgICAgIGlmKGkgPT09IGN1cnNvckxpbmVQYXJ0SW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEN1cnNvckNoID0gb2Zmc2V0ICsgY3Vyc29yUmVsYXRpdmVJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBMaW5rLjMgXHU2NkY0XHU2NUIwXHU1M0Q4XHU5MUNGXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdExpbmUgKz0gbGluZVBhcnRzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaW5lUGFydHNbaV0uY29udGVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHByZXZQYXJ0VHlwZSA9IElubGluZVR5cGUudXNlcjtcbiAgICAgICAgICAgICAgICAgICAgcHJldlRleHRFbmRTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5ub25lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihsZXQgaT0wO2k8bGluZVBhcnRzLmxlbmd0aDtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKGxpbmVQYXJ0c1tpXS50eXBlID09PSBJbmxpbmVUeXBlLnRleHQgJiYgbGluZVBhcnRzW2ldLmNvbnRlbnQhPWxpbmVQYXJ0c09yaWdpbltpXS5jb250ZW50KVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlubGluZUNoYW5nZUxpc3QucHVzaChcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogbGluZVBhcnRzW2ldLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWdpbjogbGluZVBhcnRzT3JpZ2luW2ldLmJlZ2luLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBsaW5lUGFydHNPcmlnaW5baV0uZW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBsaW5lUGFydHNPcmlnaW5baV0uY29udGVudFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIGlubGluZUNoYW5nZUxpc3QgPSBpbmxpbmVDaGFuZ2VMaXN0LnNvcnQoKGEsIGIpOm51bWJlcj0+YS5iZWdpbi1iLmJlZ2luKTtcbiAgICAgICAgcmV0dXJuIFtyZXN1bHRMaW5lLCByZXN1bHRDdXJzb3JDaCwgaW5saW5lQ2hhbmdlTGlzdF07XG4gICAgfVxuICAgIFxufVxuXG5cbmV4cG9ydCBjbGFzcyBNYXJrZG93blBhcnNlcntcbiAgICBjb25zdHJ1Y3Rvcigpe31cblxufVxuXG5mdW5jdGlvbiBtYXRjaFdpdGhSZWcodGV4dDogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCwgdHlwZTogSW5saW5lVHlwZSwgaW5saW5lVHlwZUFycmF5OiBJbmxpbmVQYXJ0W10sXG4gICAgY2hlY2tBcnJheSA9IGZhbHNlLCBsZWZ0U3BhY2VSZTogU3BhY2VTdGF0ZSA9IFNwYWNlU3RhdGUubm9uZSwgcmlnaHRTcGFjZVJlOiBTcGFjZVN0YXRlID0gU3BhY2VTdGF0ZS5ub25lKTogSW5saW5lUGFydFtdIHtcbiAgICBsZXQgcmV0QXJyYXkgPSBpbmxpbmVUeXBlQXJyYXk7XG4gICAgbGV0IG1hdGNoQXJyYXk6IElubGluZVBhcnRbXSA9IFtdO1xuICAgIHJldEFycmF5ID0gcmV0QXJyYXkuc29ydCgoYSwgYik6IG51bWJlciA9PiBhLmJlZ2luIC0gYi5iZWdpbik7XG4gICAgLy8gY29uc29sZS5sb2coJ2JlZm9yZS0tLS0tLS0tLS0tXFxuJyxyZXRBcnJheSlcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSByZWdFeHAuZXhlYyh0ZXh0KTtcbiAgICAgICAgaWYgKCFtYXRjaCkgYnJlYWs7XG4gICAgICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgICAgIC8vIFx1NjhDMFx1NjdFNVx1NTFCMlx1N0E4MVxuICAgICAgICBpZiAoY2hlY2tBcnJheSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmKHJlZ0V4cC5sYXN0SW5kZXg+cmV0QXJyYXlbaV0uYmVnaW4gJiYgcmV0QXJyYXlbaV0uZW5kPm1hdGNoLmluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsaWQpIGNvbnRpbnVlO1xuICAgICAgICBtYXRjaEFycmF5LnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGVudDogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBiZWdpbjogbWF0Y2guaW5kZXgsXG4gICAgICAgICAgICAgICAgZW5kOiByZWdFeHAubGFzdEluZGV4LFxuICAgICAgICAgICAgICAgIGxlZnRTcGFjZVJlcXVpcmU6IGxlZnRTcGFjZVJlLFxuICAgICAgICAgICAgICAgIHJpZ2h0U3BhY2VSZXF1aXJlOiByaWdodFNwYWNlUmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0QXJyYXkgPSByZXRBcnJheS5jb25jYXQobWF0Y2hBcnJheSk7XG4gICAgLy8gY29uc29sZS5sb2coJ0FmdGVyPT09PT09PT09PT1cXG4nLCByZXRBcnJheSk7XG4gICAgcmV0dXJuIHJldEFycmF5O1xufVxuXG5mdW5jdGlvbiBtYXRjaFdpdGhBYmJyKHRleHQ6IHN0cmluZywgdHlwZTogSW5saW5lVHlwZSwgaW5saW5lVHlwZUFycmF5OiBJbmxpbmVQYXJ0W10sIGNoZWNrQXJyYXkgPSBmYWxzZSl7XG4gICAgbGV0IHJldEFycmF5ID0gaW5saW5lVHlwZUFycmF5O1xuICAgIGxldCBtYXRjaEFycmF5OiBJbmxpbmVQYXJ0W10gPSBbXTtcbiAgICByZXRBcnJheSA9IHJldEFycmF5LnNvcnQoKGEsIGIpOiBudW1iZXIgPT4gYS5iZWdpbiAtIGIuYmVnaW4pO1xuICAgIGxldCByZWdBYmJyID0gLyhbYS16QS1aXVxcLikrL2c7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gcmVnQWJici5leGVjKHRleHQpO1xuICAgICAgICBpZiAoIW1hdGNoKSBicmVhaztcbiAgICAgICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGlzSW5CbG9ja0JlZ2luOmJvb2xlYW4gPSAobWF0Y2guaW5kZXg9PTApO1xuICAgICAgICAvLyBcdTY4QzBcdTY3RTVcdTUxQjJcdTdBODFcbiAgICAgICAgaWYgKGNoZWNrQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZihtYXRjaC5pbmRleCA9PSByZXRBcnJheVtpXS5lbmQpe1xuICAgICAgICAgICAgICAgICAgICBpc0luQmxvY2tCZWdpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHJlZ0FiYnIubGFzdEluZGV4PnJldEFycmF5W2ldLmJlZ2luICYmIHJldEFycmF5W2ldLmVuZD5tYXRjaC5pbmRleCl7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZighaXNJbkJsb2NrQmVnaW4gJiYgdmFsaWQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCByZWdDaGFyID0gL1thLXpBLVowLTldLztcbiAgICAgICAgICAgIGlmKHJlZ0NoYXIudGVzdCh0ZXh0LmNoYXJBdChtYXRjaC5pbmRleC0xKSkpe1xuICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXZhbGlkKSBjb250aW51ZTtcbiAgICAgICAgbWF0Y2hBcnJheS5wdXNoKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IG1hdGNoWzBdLFxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgYmVnaW46IG1hdGNoLmluZGV4LFxuICAgICAgICAgICAgICAgIGVuZDogcmVnQWJici5sYXN0SW5kZXgsXG4gICAgICAgICAgICAgICAgbGVmdFNwYWNlUmVxdWlyZTogU3BhY2VTdGF0ZS5ub25lLFxuICAgICAgICAgICAgICAgIHJpZ2h0U3BhY2VSZXF1aXJlOiBTcGFjZVN0YXRlLm5vbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0QXJyYXkgPSByZXRBcnJheS5jb25jYXQobWF0Y2hBcnJheSk7XG4gICAgLy8gY29uc29sZS5sb2coJ0FmdGVyPT09PT09PT09PT1cXG4nLCByZXRBcnJheSk7XG4gICAgcmV0dXJuIHJldEFycmF5O1xufVxuXG4vKipcbiAqIFx1NTIwNlx1NTI3Mlx1NEUwMFx1ODg0Q1x1NjU4N1x1NjcyQ1x1NEUyRFx1NzY4NFx1OTRGRVx1NjNBNVx1NTQ4Q1x1NzUyOFx1NjIzN1x1ODFFQVx1NUI5QVx1NEU0OVx1NzY4NFx1NkI2M1x1NTIxOVx1OTBFOFx1NTIwNlx1RkYwQ1x1NUY5N1x1NTIzMCBJbmxpbmVQYXJ0IFx1NzY4NFx1NEUwRFx1NTQwQ1x1NTMzQVx1NTdERlxuICovXG5mdW5jdGlvbiBzcGxpdFRleHRXaXRoTGlua0FuZFVzZXJEZWZpbmVkKHRleHQ6IHN0cmluZywgcmVnRXhwcz86IHN0cmluZyk6IElubGluZVBhcnRbXSB7XG4gICAgbGV0IHJldEFycmF5OiBJbmxpbmVQYXJ0W10gPSBbXTtcbiAgICBsZXQgcmVnV2lraUxpbmsgPSAvXFwhezAsMn1cXFtcXFtbXlxcW1xcXV0qP1xcXVxcXS9nO1xuICAgIGxldCByZWdNZExpbmsgPSAvXFwhezAsMn1cXFtbXlxcW1xcXV0qP1xcXVxcKFteXFxzXFwpXFwoXFxbXFxdXFx7XFx9J10qXFwpL2c7XG4gICAgLy8gbGV0IHJlZ0JhcmVMaW5rID0gLyhodHRwcz86XFwvXFwvfGZ0cDpcXC9cXC98b2JzaWRpYW46XFwvXFwvfHpvdGVybzpcXC9cXC98d3d3LilbXlxcc1x1RkYwOFx1RkYwOVx1MzAwQVx1MzAwQlx1MzAwMlx1RkYwQ1x1RkYwMVx1RkYxRlx1RkYxQlx1RkYxQVx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVxcKVxcKFxcW1xcXVxce1xcfSddKy9nO1xuXG4gICAgLy8gMS4gXHU1MzM5XHU5MTREd2lraWxpbmtcbiAgICByZXRBcnJheSA9IG1hdGNoV2l0aFJlZyh0ZXh0LCByZWdXaWtpTGluaywgSW5saW5lVHlwZS53aWtpbGluaywgcmV0QXJyYXkpO1xuICAgIC8vIDIuIFx1NTMzOVx1OTE0RG1kbGlua1xuICAgIHJldEFycmF5ID0gbWF0Y2hXaXRoUmVnKHRleHQsIHJlZ01kTGluaywgSW5saW5lVHlwZS5tZGxpbmssIHJldEFycmF5KTtcblxuICAgIC8vIDMuIFx1NTMzOVx1OTE0RFx1NzUyOFx1NjIzN1x1ODFFQVx1NUI5QVx1NEU0OVx1NkI2M1x1NTIxOVxuICAgIGxldCByZWdFeHBMaXN0OiBSZWdFeHBbXSA9IFtdO1xuICAgIGxldCBsZWZ0U1JlcXVpcmVMaXN0OiBTcGFjZVN0YXRlW10gPSBbXTtcbiAgICBsZXQgcmlnaHRTUmVxdWlyZUxpc3Q6IFNwYWNlU3RhdGVbXSA9IFtdO1xuICAgIGxldCByZWdOdWxsID0gL15cXHMqJHxeXFwvXFwvL2c7XG4gICAgbGV0IHJlZ1NSZXF1aXJlID0gL1xcfFtcXC09XFwrXVtcXC09XFwrXSQvO1xuICAgIGlmIChyZWdFeHBzKSB7XG4gICAgICAgIGxldCByZWdzID0gcmVnRXhwcy5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVncy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICBpZiAocmVnTnVsbC50ZXN0KHJlZ3NbaV0pKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKCghcmVnU1JlcXVpcmUudGVzdChyZWdzW2ldKSkgfHwgcmVnc1tpXS5sZW5ndGggPD0gMykge1xuICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJFYXN5VHlwaW5nOiBcdTdCMkNcIiArIFN0cmluZyhpKSArIFwiXHU4ODRDXHU4MUVBXHU1QjlBXHU0RTQ5XHU2QjYzXHU1MjE5XHU0RTBEXHU3QjI2XHU1NDA4XHU4OUM0XHU4MzAzXFxuXCIrcmVnc1tpXSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVnSXRlbSA9IHJlZ3NbaV0uc3Vic3RyaW5nKDAsIHJlZ3NbaV0ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICBsZXQgc3BhY2VSZXFTdHJpbmcgPSByZWdzW2ldLnN1YnN0cmluZyhyZWdzW2ldLmxlbmd0aCAtIDMpO1xuXG4gICAgICAgICAgICBsZXQgaXNWYWxpZFJlZyA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCByZWdUZW1wID0gbmV3IFJlZ0V4cChyZWdJdGVtLCAnZycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpc1ZhbGlkUmVnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5zZXR0aW5ncy5kZWJ1Zyl7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UoXCJFYXN1VHlwaW5nOiBCYWQgUmVnRXhwOlxcblwiICsgcmVnSXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNWYWxpZFJlZykge1xuICAgICAgICAgICAgICAgIHJlZ0V4cExpc3QucHVzaChuZXcgUmVnRXhwKHJlZ0l0ZW0sICdnJykpO1xuICAgICAgICAgICAgICAgIGxlZnRTUmVxdWlyZUxpc3QucHVzaChzdHIyU3BhY2VTdGF0ZShzcGFjZVJlcVN0cmluZy5jaGFyQXQoMSkpKTtcbiAgICAgICAgICAgICAgICByaWdodFNSZXF1aXJlTGlzdC5wdXNoKHN0cjJTcGFjZVN0YXRlKHNwYWNlUmVxU3RyaW5nLmNoYXJBdCgyKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZWdMZW4gPSByZWdFeHBMaXN0Lmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZ0xlbjsgaSsrKSB7XG4gICAgICAgICAgICByZXRBcnJheSA9IG1hdGNoV2l0aFJlZyh0ZXh0LCByZWdFeHBMaXN0W2ldLCBJbmxpbmVUeXBlLnVzZXIsIHJldEFycmF5LCB0cnVlLCBsZWZ0U1JlcXVpcmVMaXN0W2ldLCByaWdodFNSZXF1aXJlTGlzdFtpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTUzMzlcdTkxNERcdTY1RjZcdTk1RjRcdTYyMzNcbiAgICByZXRBcnJheSA9IG1hdGNoV2l0aFJlZyh0ZXh0LCAvXFxkezEsMn06XFxkezEsMn0oOlxcZHswLDJ9KXswLDF9L2csIElubGluZVR5cGUudXNlciwgcmV0QXJyYXksIHRydWUsIFNwYWNlU3RhdGUubm9uZSwgU3BhY2VTdGF0ZS5ub25lKTtcblxuICAgIC8vIDQuIFx1NTMzOVx1OTE0RFx1N0YyOVx1NTE5OVx1NTk4MiBhLm0uXG4gICAgcmV0QXJyYXkgPSBtYXRjaFdpdGhBYmJyKHRleHQsIElubGluZVR5cGUudXNlciwgcmV0QXJyYXksIHRydWUpO1xuXG4gICAgLy8gNS4gXHU1Rjk3XHU1MjMwXHU1MjY5XHU0RjU5XHU3Njg0XHU2NTg3XHU2NzJDXHU5MEU4XHU1MjA2XG4gICAgcmV0QXJyYXkgPSByZXRBcnJheS5zb3J0KChhLCBiKTogbnVtYmVyID0+IGEuYmVnaW4gLSBiLmJlZ2luKTtcblxuICAgIGxldCB0ZXh0QXJyYXk6IElubGluZVBhcnRbXSA9IFtdO1xuICAgIGxldCB0ZXh0QmVnaW4gPSAwO1xuICAgIGxldCB0ZXh0RW5kID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJldEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0QmVnaW4gPCByZXRBcnJheVtpXS5iZWdpbikge1xuICAgICAgICAgICAgdGV4dEVuZCA9IHJldEFycmF5W2ldLmJlZ2luO1xuICAgICAgICAgICAgdGV4dEFycmF5LnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0ZXh0LnN1YnN0cmluZyh0ZXh0QmVnaW4sIHRleHRFbmQpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBJbmxpbmVUeXBlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGJlZ2luOiB0ZXh0QmVnaW4sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dEVuZCxcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNwYWNlUmVxdWlyZTogU3BhY2VTdGF0ZS5ub25lLFxuICAgICAgICAgICAgICAgICAgICByaWdodFNwYWNlUmVxdWlyZTogU3BhY2VTdGF0ZS5ub25lXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0ZXh0QmVnaW4gPSByZXRBcnJheVtpXS5lbmQ7XG4gICAgfVxuXG4gICAgaWYgKHRleHRCZWdpbiAhPSB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICB0ZXh0QXJyYXkucHVzaChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0ZXh0LnN1YnN0cmluZyh0ZXh0QmVnaW4sIHRleHQubGVuZ3RoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBJbmxpbmVUeXBlLnRleHQsXG4gICAgICAgICAgICAgICAgYmVnaW46IHRleHRCZWdpbixcbiAgICAgICAgICAgICAgICBlbmQ6IHRleHQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGxlZnRTcGFjZVJlcXVpcmU6IFNwYWNlU3RhdGUubm9uZSxcbiAgICAgICAgICAgICAgICByaWdodFNwYWNlUmVxdWlyZTogU3BhY2VTdGF0ZS5ub25lXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNi4gXHU1NDA4XHU1RTc2XHU2NTg3XHU2NzJDXHU5MEU4XHU1MjA2XHU1NDhDXHU1MTc2XHU0RUQ2XHU5MEU4XHU1MjA2XG4gICAgcmV0QXJyYXkgPSByZXRBcnJheS5jb25jYXQodGV4dEFycmF5KTtcbiAgICByZXRBcnJheSA9IHJldEFycmF5LnNvcnQoKGEsIGIpOiBudW1iZXIgPT4gYS5iZWdpbiAtIGIuYmVnaW4pO1xuICAgIHJldHVybiByZXRBcnJheVxufVxuXG4vLyBcdTVCNTdcdTdCMjZcdThGNkNcdTUzMTZcdTYyMTBcdTdBN0FcdTY4M0NcdTcyQjZcdTYwMDFcdTg5ODFcdTZDNDJcbmZ1bmN0aW9uIHN0cjJTcGFjZVN0YXRlKHM6IHN0cmluZyk6IFNwYWNlU3RhdGUge1xuICAgIHN3aXRjaCAocykge1xuICAgICAgICBjYXNlIFwiK1wiOlxuICAgICAgICAgICAgcmV0dXJuIFNwYWNlU3RhdGUuc3RyaWN0O1xuICAgICAgICBjYXNlICc9JzpcbiAgICAgICAgICAgIHJldHVybiBTcGFjZVN0YXRlLnNvZnQ7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFNwYWNlU3RhdGUubm9uZTtcbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZzJTcGFjZVN0YXRlKHM6c3RyaW5nKTpTcGFjZVN0YXRlXG57XG4gICAgaWYoTnVtYmVyKHMpPT1TcGFjZVN0YXRlLm5vbmUpIHJldHVybiBTcGFjZVN0YXRlLm5vbmU7XG4gICAgaWYoTnVtYmVyKHMpPT1TcGFjZVN0YXRlLnNvZnQpIHJldHVybiBTcGFjZVN0YXRlLnNvZnQ7XG4gICAgaWYoTnVtYmVyKHMpPT1TcGFjZVN0YXRlLnN0cmljdCkgcmV0dXJuIFNwYWNlU3RhdGUuc3RyaWN0O1xuICAgIHJldHVybiBTcGFjZVN0YXRlLm5vbmU7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc0xpbmVUeXBlKHN0YXRlOiBFZGl0b3JTdGF0ZSwgcG9zOiBudW1iZXIpOkxpbmVUeXBlIHtcbiAgICBjb25zdCBsaW5lID0gc3RhdGUuZG9jLmxpbmVBdChwb3MpXG4gICAgbGV0IGxpbmVfbnVtYmVyID0gbGluZS5udW1iZXJcbiAgICAvLyBjb25zdCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSk7XG4gICAgY29uc3QgdHJlZSA9IGVuc3VyZVN5bnRheFRyZWUoc3RhdGUsIGxpbmUudG8pO1xuICAgIGNvbnN0IHRva2VuID0gdHJlZS5yZXNvbHZlKGxpbmUuZnJvbSwgMSkubmFtZVxuXG4gICAgLy8gZm9yIChsZXQgcD1saW5lLmZyb207IHA8bGluZS50bzsgcCs9MSl7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKHAtbGluZS5mcm9tLCB0cmVlLnJlc29sdmUocCwgMSkubmFtZSlcbiAgICAvLyB9XG5cbiAgICBpZiAodG9rZW4uY29udGFpbnMoJ3RhYmxlJykpe1xuICAgICAgICByZXR1cm4gTGluZVR5cGUudGFibGU7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLmNvbnRhaW5zKCdobWQtZnJvbnRtYXR0ZXInKSl7XG4gICAgICAgIHJldHVybiBMaW5lVHlwZS5mcm9udG1hdHRlcjtcbiAgICB9XG5cbiAgICBpZih0b2tlbi5jb250YWlucygnbWF0aCcpKXtcbiAgICAgICAgZm9yKGxldCBwPWxpbmUuZnJvbSsxO3A8bGluZS50bztwKz0xKXtcbiAgICAgICAgICAgIGlmKCF0cmVlLnJlc29sdmUocCwgMSkubmFtZS5jb250YWlucygnbWF0aCcpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gTGluZVR5cGUudGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTGluZVR5cGUuZm9ybXVsYVxuICAgIH1cbiAgICBlbHNlIGlmKHRva2VuLmNvbnRhaW5zKCdjb2RlJykgJiYgdG9rZW4uY29udGFpbnMoJ2Jsb2NrJykpe1xuICAgICAgICBmb3IobGV0IHA9bGluZS5mcm9tKzE7cDxsaW5lLnRvO3ArPTEpe1xuICAgICAgICAgICAgbGV0IHQgPSB0cmVlLnJlc29sdmUocCwgMSkubmFtZVxuICAgICAgICAgICAgaWYoISh0LmNvbnRhaW5zKCdjb2RlJykgJiYgdC5jb250YWlucygnYmxvY2snKSkpe1xuICAgICAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS50ZXh0XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExpbmVUeXBlLmNvZGVibG9ja1xuICAgIH1cbiAgICBlbHNlIGlmKHRva2VuLmNvbnRhaW5zKCdxdW90ZScpICYmICF0b2tlbi5jb250YWlucygnY2FsbG91dCcpKXtcbiAgICAgICAgLy8gXHU2M0E1XHU0RTBCXHU2NzY1XHU1MjI0XHU2NUFEXHU4QkU1XHU4ODRDXHU2NjJGXHU1NDI2XHU0RTNBY2FsbG91dFx1NTc1N1x1NTE4NVx1NzY4NFx1NEVFM1x1NzgwMVx1NTc1N1xuICAgICAgICAvLyBcdTk5OTZcdTUxNDhcdTUyMjRcdTY1QURcdTY2MkZcdTU0MjZcdTRFM0FjYWxsb3V0XG4gICAgICAgIGxldCBjYWxsb3V0X3N0YXJ0X2xpbmUgPSAtMTtcbiAgICAgICAgZm9yKGxldCBsPWxpbmVfbnVtYmVyLTE7IGw+PTE7IGwtPTEpe1xuICAgICAgICAgICAgbGV0IGxfbGluZSA9IHN0YXRlLmRvYy5saW5lKGwpXG4gICAgICAgICAgICBsZXQgbF90b2tlbiA9IHRyZWUucmVzb2x2ZShsX2xpbmUuZnJvbSwgMSkubmFtZVxuICAgICAgICAgICAgaWYoIWxfdG9rZW4uY29udGFpbnMoJ3F1b3RlJykpe1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxfdG9rZW4uY29udGFpbnMoJ2NhbGxvdXQnKSl7XG4gICAgICAgICAgICAgICAgY2FsbG91dF9zdGFydF9saW5lID0gbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsbG91dF9zdGFydF9saW5lPT0tMSkgcmV0dXJuIExpbmVUeXBlLnRleHQ7XG4gICAgICAgIFxuICAgICAgICAvLyBcdTcxMzZcdTU0MEVcdTUyMjRcdTY1QURcdTY2MkZcdTU0MjZcdTRFM0FcdTRFRTNcdTc4MDFcdTU3NTdcbiAgICAgICAgbGV0IGlzX2NvZGVfYmxvY2s6Ym9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVzZXQ6Ym9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVnX2NvZGVfYmVnaW4gPSAvXj4rIGBgYC87XG4gICAgICAgIGxldCByZWdfY29kZV9lbmQgPSAvXj4rIGBgYCQvO1xuICAgICAgICBmb3IgKGxldCBsPWNhbGxvdXRfc3RhcnRfbGluZSsxOyBsPD1saW5lX251bWJlcjsgbCs9MSl7XG4gICAgICAgICAgICBsZXQgbF9saW5lID0gc3RhdGUuZG9jLmxpbmUobClcbiAgICAgICAgICAgIGlmIChyZXNldCl7XG4gICAgICAgICAgICAgICAgaXNfY29kZV9ibG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihpc19jb2RlX2Jsb2NrICYmIHJlZ19jb2RlX2VuZC50ZXN0KGxfbGluZS50ZXh0KSl7XG4gICAgICAgICAgICAgICAgaXNfY29kZV9ibG9jayA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzZXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZighaXNfY29kZV9ibG9jayAmJiByZWdfY29kZV9iZWdpbi50ZXN0KGxfbGluZS50ZXh0KSl7XG4gICAgICAgICAgICAgICAgaXNfY29kZV9ibG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzX2NvZGVfYmxvY2spIHtcbiAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS5jb2RlYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSByZXR1cm4gTGluZVR5cGUudGV4dDtcbiAgICB9XG4gICAgZWxzZSBpZih0b2tlbi5jb250YWlucygnbGlzdCcpKXtcbiAgICAgICAgZm9yKGxldCBwPWxpbmUuZnJvbSsxO3A8bGluZS50bztwKz0xKXtcbiAgICAgICAgICAgIGxldCB0ID0gdHJlZS5yZXNvbHZlKHAsIDEpLm5hbWVcbiAgICAgICAgICAgIGlmKCh0LmNvbnRhaW5zKCdjb2RlJykgJiYgdC5jb250YWlucygnYmxvY2snKSkpe1xuICAgICAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS5jb2RlYmxvY2tcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTGluZVR5cGUudGV4dFxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb3NMaW5lVHlwZTIoc3RhdGU6IEVkaXRvclN0YXRlLCBwb3M6IG51bWJlcik6TGluZVR5cGUge1xuICAgIGNvbnN0IGxpbmUgPSBzdGF0ZS5kb2MubGluZUF0KHBvcylcbiAgICBjb25zdCB0cmVlID0gc3ludGF4VHJlZShzdGF0ZSk7XG4gICAgY29uc3QgdG9rZW4gPSB0cmVlLnJlc29sdmUobGluZS5mcm9tLCAxKS5uYW1lXG4gICAgaWYgKHRva2VuLmNvbnRhaW5zKCdobWQtZnJvbnRtYXR0ZXInKSl7XG4gICAgICAgIHJldHVybiBMaW5lVHlwZS5mcm9udG1hdHRlclxuICAgIH1cblxuICAgIGlmKHRva2VuLmNvbnRhaW5zKCdtYXRoJykpe1xuICAgICAgICBmb3IobGV0IHA9bGluZS5mcm9tKzE7cDxsaW5lLnRvO3ArPTEpe1xuICAgICAgICAgICAgaWYoIXRyZWUucmVzb2x2ZShwLCAxKS5uYW1lLmNvbnRhaW5zKCdtYXRoJykpe1xuICAgICAgICAgICAgICAgIHJldHVybiBMaW5lVHlwZS50ZXh0XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExpbmVUeXBlLmZvcm11bGFcbiAgICB9XG4gICAgZWxzZSBpZih0b2tlbi5jb250YWlucygnY29kZScpICYmIHRva2VuLmNvbnRhaW5zKCdibG9jaycpKXtcbiAgICAgICAgZm9yKGxldCBwPWxpbmUuZnJvbSsxO3A8bGluZS50bztwKz0xKXtcbiAgICAgICAgICAgIGxldCB0ID0gdHJlZS5yZXNvbHZlKHAsIDEpLm5hbWVcbiAgICAgICAgICAgIGlmKCEodC5jb250YWlucygnY29kZScpICYmIHQuY29udGFpbnMoJ2Jsb2NrJykpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gTGluZVR5cGUudGV4dFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMaW5lVHlwZS5jb2RlYmxvY2tcbiAgICB9XG5cbiAgICBmb3IobGV0IHA9bGluZS5mcm9tO3A8bGluZS50bztwKz0xKXtcbiAgICAgICAgaWYodHJlZS5yZXNvbHZlKHAsIDEpLm5hbWUuY29udGFpbnMoJ2xpc3QnKSl7XG4gICAgICAgICAgICByZXR1cm4gTGluZVR5cGUubGlzdFxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodHJlZS5yZXNvbHZlKHAsIDEpLm5hbWUuY29udGFpbnMoJ2NhbGxvdXQnKSl7XG4gICAgICAgICAgICByZXR1cm4gTGluZVR5cGUuY2FsbG91dF90aXRsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmKHRva2VuLmNvbnRhaW5zKCdxdW90ZScpKXtcbiAgICAgICAgcmV0dXJuIExpbmVUeXBlLnF1b3RlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gTGluZVR5cGUudGV4dFxufSIsICJpbXBvcnQgeyBBbm5vdGF0aW9uLCBFZGl0b3JTdGF0ZSwgRXh0ZW5zaW9uLCBTdGF0ZUZpZWxkLCBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25TcGVjLCBUZXh0fSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBFYXN5VHlwaW5nU2V0dGluZ1RhYiwgRWFzeVR5cGluZ1NldHRpbmdzLCBQYWlyU3RyaW5nLCBDb252ZXJ0UnVsZX0gZnJvbSBcIi4vc2V0dGluZ3NcIlxuaW1wb3J0IHsgQXBwLCBQbHVnaW4sIFBsYXRmb3JtIH0gZnJvbSAnb2JzaWRpYW4nXG5pbXBvcnQgeyBUYWJzdG9wU3BlYyB9IGZyb20gJy4vdGFic3RvcCc7XG5cbmxldCBERUJVRyA9IHRydWU7XG5cbmV4cG9ydCBjb25zdCBwcmludD0obWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PntcbiAgICBpZiAoREVCVUcpIHtcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvc1RvT2Zmc2V0KGRvYzpUZXh0LCBwb3M6e2xpbmU6bnVtYmVyLCBjaDpudW1iZXJ9KSB7XG5cdHJldHVybiBkb2MubGluZShwb3MubGluZSArIDEpLmZyb20gKyBwb3MuY2hcbn1cbmV4cG9ydCBmdW5jdGlvbiBvZmZzZXRUb1Bvcyhkb2M6VGV4dCwgb2Zmc2V0Om51bWJlcikge1xuXHRsZXQgbGluZSA9IGRvYy5saW5lQXQob2Zmc2V0KVxuXHRyZXR1cm4ge2xpbmU6IGxpbmUubnVtYmVyIC0gMSwgY2g6IG9mZnNldCAtIGxpbmUuZnJvbX1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVTdHJPZlRyYW5zYWModHI6IFRyYW5zYWN0aW9uKTogc3RyaW5nIHtcblx0bGV0IFRyYW5zYWNUeXBlQXJyYXk6c3RyaW5nW10gPSBbXCJFYXN5VHlwaW5nLmNoYW5nZVwiLCBcIkVhc3lUeXBpbmcucGFzdGVcIixcblx0XHRcdFx0XHRcdFx0XCJpbnB1dC50eXBlLmNvbXBvc2VcIiwgXCJpbnB1dC50eXBlXCIsIFwiaW5wdXQucGFzdGVcIiwgXCJpbnB1dC5kcm9wXCIsIFwiaW5wdXQuY29tcGxldGVcIiwgXCJpbnB1dFwiLFxuXHRcdFx0XHRcdFx0XHRcImRlbGV0ZS5zZWxlY3Rpb25cIiwgXCJkZWxldGUuZm9yd2FyZFwiLCBcImRlbGV0ZS5iYWNrd2FyZFwiLCBcImRlbGV0ZS5jdXRcIiwgXCJkZWxldGVcIixcblx0XHRcdFx0XHRcdFx0XCJtb3ZlLmRyb3BcIixcblx0XHRcdFx0XHRcdFx0XCJ1bmRvXCIsIFwicmVkb1wiLFxuXHRcdFx0XHRcdFx0XHRcInNlbGVjdC5wb2ludGVyXCJdO1xuXHRmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgVHJhbnNhY1R5cGVBcnJheS5sZW5ndGg7IGkrKylcblx0e1xuXHRcdGlmICh0ci5pc1VzZXJFdmVudChUcmFuc2FjVHlwZUFycmF5W2ldKSlcblx0XHRcdHJldHVybiBUcmFuc2FjVHlwZUFycmF5W2ldO1xuXHR9XG5cdHJldHVybiBcIm5vbmVcIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nMnBhaXJzdHJpbmcoczogc3RyaW5nKTpQYWlyU3RyaW5ne1xuXHRsZXQgY3Vyc29ySWR4ID0gZmluZEZpcnN0UGlwZU5vdFByZWNlZGVkQnlCYWNrc2xhc2gocyk7XG5cdGxldCBsZWZ0ID0gcy5zdWJzdHJpbmcoMCwgY3Vyc29ySWR4KTtcblx0bGV0IF9sZWZ0ID0gaXNSZWdleHAobGVmdCkgPyBsZWZ0IDogY29udmVydEVzY2FwZUNoYXIobGVmdCk7XG5cdGxldCByaWdodCA9IHMuc3Vic3RyaW5nKGN1cnNvcklkeCsxKTtcblx0bGV0IF9yaWdodCA9IGlzUmVnZXhwKHJpZ2h0KSA/IHJpZ2h0IDogY29udmVydEVzY2FwZUNoYXIocmlnaHQpXG5cdHJldHVybiB7bGVmdDpfbGVmdCwgcmlnaHQ6X3JpZ2h0fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VQbGFjZWhvbGRlcnMoc3RyOiBzdHJpbmcsIHJlcGxhY2VtZW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRsZXQgcmVwbGFjZV9tYXRjaGVzID0gc3RyLnJlcGxhY2UoL1xcW1xcWyhcXGQrKVxcXVxcXS9nLCBmdW5jdGlvbiAobWF0Y2gsIGluZGV4KSB7XG5cdFx0cmV0dXJuIHJlcGxhY2VtZW50c1twYXJzZUludChpbmRleCwgMTApXSB8fCBtYXRjaDtcblx0fSk7XG5cdHJldHVybiByZXBsYWNlX21hdGNoZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlUGxhY2Vob2xkZXJzQW5kVGFic3RvcHMoc3RyOiBzdHJpbmcsIHJlcGxhY2VtZW50czogc3RyaW5nW10pOiBbc3RyaW5nLCBUYWJzdG9wU3BlY1tdXXtcblx0bGV0IHRhYnN0b3BzOiBUYWJzdG9wU3BlY1tdID0gW107XG5cdGNvbnN0IHJlZ2V4ID0gL1xcJChcXGQrKXxcXCRcXHsoXFxkKyk6ICooW14ge31dKj8pXFx9fFxcW1xcWyhcXGQrKVxcXVxcXS9nO1xuXHRsZXQgbWF0Y2g7XG5cdGludGVyZmFjZSBSZXBsYWNlU3RyaW5nIHtcblx0XHRmcm9tOiBudW1iZXI7XG5cdFx0dG86IG51bWJlcjtcblx0XHRyZXBsYWNlbWVudDogc3RyaW5nO1xuXHRcdHRhYnN0b3A6IGJvb2xlYW47XG5cdFx0dGFic3RvcE51bWJlcj86IG51bWJlcjtcblx0fVxuXG5cdGxldCByZXBsYWNlU3RyaW5nczogUmVwbGFjZVN0cmluZ1tdID0gW107XG5cdHdoaWxlICgobWF0Y2ggPSByZWdleC5leGVjKHN0cikpICE9PSBudWxsKSB7XG5cdFx0Ly8gXHU2OEMwXHU2N0U1XHU2NjJGXHU1NEVBXHU3OUNEXHU2QTIxXHU1RjBGXHU3Njg0XHU1MzM5XHU5MTREXG5cdFx0Y29uc3QgaXNTaW1wbGVWYXIgPSBtYXRjaFsxXTsgLy8gXHU3NTI4XHU0RThFICRuIFx1NUY2Mlx1NUYwRlxuXHRcdGNvbnN0IGlzTmFtZWRWYXIgPSBtYXRjaFsyXTsgLy8gXHU3NTI4XHU0RThFICR7bjogXHU1MTg1XHU1QkI5fSBcdTVGNjJcdTVGMEZcblx0XHRjb25zdCBjb250ZW50ID0gbWF0Y2hbM107IC8vIFx1NzUyOFx1NEU4RSAke246IFx1NTE4NVx1NUJCOX0gXHU1RjYyXHU1RjBGXHU3Njg0XHU1MTg1XHU1QkI5XG5cdFx0Y29uc3QgcmVwbGFjZU4gPSBtYXRjaFs0XTsgLy8gXHU3NTI4XHU0RThFIFtbbl1dIFx1NUY2Mlx1NUYwRlxuXG5cdFx0Y29uc3QgdGFic3RvcE4gPSBpc1NpbXBsZVZhciB8fCBpc05hbWVkVmFyOyAvLyBcdTUzRDYgbiBcdTc2ODRcdTUwM0NcdUZGMENcdTY1RTBcdThCQkFcdTY2MkZcdTdCODBcdTUzNTVcdThGRDhcdTY2MkZcdTU0N0RcdTU0MERcdTUzRDhcdTkxQ0Zcblx0XHRjb25zdCBzdGFydEluZGV4ID0gbWF0Y2guaW5kZXg7XG5cdFx0Y29uc3QgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoO1xuXHRcdGlmIChyZXBsYWNlTil7XG5cdFx0XHRsZXQgbWF0Y2hlZE4gPSBwYXJzZUludChyZXBsYWNlTiwgMTApO1xuXHRcdFx0aWYobWF0Y2hlZE4gPCByZXBsYWNlbWVudHMubGVuZ3RoKXtcblx0XHRcdFx0cmVwbGFjZVN0cmluZ3MucHVzaCh7ZnJvbTogc3RhcnRJbmRleCwgdG86IGVuZEluZGV4LCByZXBsYWNlbWVudDogcmVwbGFjZW1lbnRzW21hdGNoZWROXSwgdGFic3RvcDpmYWxzZX0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGxldCBuID0gcGFyc2VJbnQodGFic3RvcE4sIDEwKTtcblx0XHRcdGxldCBjb250ZW50U3RyID0gcmVwbGFjZVBsYWNlaG9sZGVycyhjb250ZW50P2NvbnRlbnQ6XCJcIiwgcmVwbGFjZW1lbnRzKTtcblx0XHRcdHJlcGxhY2VTdHJpbmdzLnB1c2goe2Zyb206IHN0YXJ0SW5kZXgsIHRvOiBlbmRJbmRleCwgcmVwbGFjZW1lbnQ6IGNvbnRlbnRTdHIsIHRhYnN0b3A6dHJ1ZSwgdGFic3RvcE51bWJlcjogbn0pO1xuXHRcdH1cblx0fVxuXG5cdGxldCBuZXdTdHJpbmcgPSBzdHI7XG5cdGxldCBvZmZzZXQgPSAwO1xuXHRmb3IgKGxldCBpPTA7IGk8cmVwbGFjZVN0cmluZ3MubGVuZ3RoOyBpKyspe1xuXHRcdGxldCByZXBsYWNlU3RyaW5nID0gcmVwbGFjZVN0cmluZ3NbaV07XG5cdFx0bmV3U3RyaW5nID0gbmV3U3RyaW5nLnN1YnN0cmluZygwLCByZXBsYWNlU3RyaW5nLmZyb20gKyBvZmZzZXQpICsgcmVwbGFjZVN0cmluZy5yZXBsYWNlbWVudCArIG5ld1N0cmluZy5zdWJzdHJpbmcocmVwbGFjZVN0cmluZy50byArIG9mZnNldCk7XG5cdFx0aWYgKHJlcGxhY2VTdHJpbmcudGFic3RvcCl7XG5cdFx0XHRsZXQgdGFic3RvcDogVGFic3RvcFNwZWMgPSB7XG5cdFx0XHRcdGZyb206IHJlcGxhY2VTdHJpbmcuZnJvbSArIG9mZnNldCxcblx0XHRcdFx0dG86IHJlcGxhY2VTdHJpbmcuZnJvbSArIG9mZnNldCArIHJlcGxhY2VTdHJpbmcucmVwbGFjZW1lbnQubGVuZ3RoLFxuXHRcdFx0XHRudW1iZXI6IHJlcGxhY2VTdHJpbmcudGFic3RvcE51bWJlcixcblx0XHRcdH1cblx0XHRcdHRhYnN0b3BzLnB1c2godGFic3RvcCk7XG5cdFx0fVxuXHRcdG9mZnNldCArPSByZXBsYWNlU3RyaW5nLnJlcGxhY2VtZW50Lmxlbmd0aCAtIChyZXBsYWNlU3RyaW5nLnRvIC0gcmVwbGFjZVN0cmluZy5mcm9tKTtcblx0fVxuXG5cdHJldHVybiBbbmV3U3RyaW5nLCB0YWJzdG9wc107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRoZUFmdGVyUGF0dGVybihwYXR0ZXJuOiBzdHJpbmcsIHJlcGxhY2VtZW50czogc3RyaW5nW10pOiBbc3RyaW5nLCBUYWJzdG9wU3BlY1tdXXtcblx0bGV0IHNpbmdsZV9jdXJzb3JfcG9zID0gZmluZEZpcnN0UGlwZU5vdFByZWNlZGVkQnlCYWNrc2xhc2gocGF0dGVybik7XG5cdGxldCBnZW5lcmFsX2N1cnNvcl9maW5kID0gL1xcJChcXGQrKXxcXCRcXHsoXFxkKyk6ICooW14ge31dKj8pXFx9Ly50ZXN0KHBhdHRlcm4pO1xuXHRsZXQgc2luZ2xlX2N1cnNvcl9maW5kID0gc2luZ2xlX2N1cnNvcl9wb3MgIT09IC0xO1xuXHRsZXQgZmluYWxfcGF0dGVybiA9IHBhdHRlcm47XG5cdGlmIChnZW5lcmFsX2N1cnNvcl9maW5kKXtcblx0XHRmaW5hbF9wYXR0ZXJuID0gcGF0dGVybjtcblx0fWVsc2UgaWYgKHNpbmdsZV9jdXJzb3JfZmluZCl7XG5cdFx0ZmluYWxfcGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyaW5nKDAsIHNpbmdsZV9jdXJzb3JfcG9zKSArIFwiJDBcIiArIHBhdHRlcm4uc3Vic3RyaW5nKHNpbmdsZV9jdXJzb3JfcG9zKzEpO1xuXHR9ZWxzZSB7XG5cdFx0ZmluYWxfcGF0dGVybiA9IHBhdHRlcm4gKyBcIiQwXCI7XG5cdH1cblx0cmV0dXJuIHJlcGxhY2VQbGFjZWhvbGRlcnNBbmRUYWJzdG9wcyhjb252ZXJ0RXNjYXBlQ2hhcihmaW5hbF9wYXR0ZXJuKSwgcmVwbGFjZW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnZXhwKHM6IHN0cmluZyk6Ym9vbGVhbntcblx0cmV0dXJuIHMuc3RhcnRzV2l0aChcInIvXCIpICYmIHMuZW5kc1dpdGgoXCIvXCIpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RXNjYXBlQ2hhcihzOiBzdHJpbmcpOnN0cmluZ3tcblx0cmV0dXJuIHMucmVwbGFjZSgvXFxcXFxcfC9nLCBcInxcIilcblx0XHRcdC5yZXBsYWNlKC9cXFxcbi9nLCAnXFxuJykucmVwbGFjZSgvXFxcXHIvZywgJ1xccicpLnJlcGxhY2UoL1xcXFx0L2csICdcXHQnKVxuXHRcdFx0LnJlcGxhY2UoL1xcXFxcXG4vZywgJ1xcXFxuJykucmVwbGFjZSgvXFxcXFxcci9nLCAnXFxcXHInKS5yZXBsYWNlKC9cXFxcXFx0L2csICdcXFxcdCcpXG5cdFx0XHQucmVwbGFjZSgvXFxcXFxcXFwvZywgXCJcXFxcXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVsZVN0cmluZ0xpc3QyUnVsZUxpc3QobGlzdDogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4pOkNvbnZlcnRSdWxlW10ge1xuXHRsZXQgcmVzOkNvbnZlcnRSdWxlW10gPSBbXTtcblx0Zm9yIChsZXQgaSBpbiBsaXN0KXtcblx0XHRyZXNbaV0gPSB7YmVmb3JlOiBzdHJpbmcycGFpcnN0cmluZyhsaXN0W2ldWzBdKSwgYWZ0ZXI6IHN0cmluZzJwYWlyc3RyaW5nKGxpc3RbaV1bMV0pLCBhZnRlcl9wYXR0ZXJuOiBsaXN0W2ldWzFdfVxuXHR9XG5cdHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRmlyc3RQaXBlTm90UHJlY2VkZWRCeUJhY2tzbGFzaChzOiBzdHJpbmcpOiBudW1iZXIge1xuXHRsZXQgcmVnZXggPSAvXnJcXC9bXl0qP1xcL1xcfC87XG5cdGxldCByZWdNYXRjaCA9IHMubWF0Y2gocmVnZXgpO1xuXHRpZiAocmVnTWF0Y2gpIHJldHVybiByZWdNYXRjaFswXS5sZW5ndGggLSAxO1xuICAgIGNvbnN0IG1hdGNoID0gcy5tYXRjaCgvKChefFteXFxcXF0pKFxcXFxcXFxcKSopXFx8Lyk7XG4gICAgcmV0dXJuIG1hdGNoID8gcy5pbmRleE9mKG1hdGNoWzBdKSArIG1hdGNoWzFdLmxlbmd0aCA6IC0xO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nRGVsZXRlQXQoc3RyOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOnN0cmluZ1xue1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KStzdHIuc3Vic3RyaW5nKGluZGV4KzEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nSW5zZXJ0QXQoc3RyOnN0cmluZywgaW5kZXg6IG51bWJlciwgczogc3RyaW5nKTpzdHJpbmdcbntcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBpbmRleCkrcytzdHIuc3Vic3RyaW5nKGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUGFyYW1EZWZpbmVkKHBhcmFtOiBhbnkpOmJvb2xlYW5cbntcblx0cmV0dXJuIHR5cGVvZiBwYXJhbSE9PVwidW5kZWZpbmVkXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG93U3RyaW5nKHM6IHN0cmluZyk6c3RyaW5ne1xuXHRyZXR1cm4gcy5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJyk7XG59XG5cblxudHlwZSBUYWJPdXRSZXN1bHQgPSB7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIG5ld1Bvc2l0aW9uOiBudW1iZXI7XG59O1xuXG5cblxuXG5leHBvcnQgZnVuY3Rpb24gdGFib3V0Q3Vyc29ySW5QYWlyZWRTdHJpbmcoaW5wdXQ6IHN0cmluZywgY3Vyc29yUG9zaXRpb246IG51bWJlciwgc3ltYm9sUGFpcnM6IFBhaXJTdHJpbmdbXSk6IFRhYk91dFJlc3VsdCB7XG4gICAgbGV0IHN0YWNrOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBmYWlsOiBUYWJPdXRSZXN1bHQgPSB7IGlzU3VjY2VzczogZmFsc2UsIG5ld1Bvc2l0aW9uOiAwIH07XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnNvclBvc2l0aW9uOyBpKyspIHtcbiAgICAgICAgZm9yIChjb25zdCB7IGxlZnQ6IG9wZW4sIHJpZ2h0OiBjbG9zZSB9IG9mIHN5bWJvbFBhaXJzKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aChvcGVuLCBpKSAmJiAob3BlbiAhPT0gY2xvc2UgfHwgc3RhY2subGFzdEluZGV4T2Yob3BlbikgPT09IC0xKSkge1xuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gob3Blbik7XG4gICAgICAgICAgICAgICAgaSArPSBvcGVuLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0LnN0YXJ0c1dpdGgoY2xvc2UsIGkpICYmIHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0T3BlbkluZGV4ID0gc3RhY2subGFzdEluZGV4T2Yob3Blbik7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RPcGVuSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2suc2xpY2UoMCwgbGFzdE9wZW5JbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkgKz0gY2xvc2UubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWw7XG4gICAgfVxuXG4gICAgbGV0IHRlbXBTdGFjazogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gY3Vyc29yUG9zaXRpb247IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGNvbnN0IHsgbGVmdDogb3BlbiwgcmlnaHQ6IGNsb3NlIH0gb2Ygc3ltYm9sUGFpcnMpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5zdGFydHNXaXRoKG9wZW4sIGkpICYmIChvcGVuICE9PSBjbG9zZSB8fCAoc3RhY2subGFzdEluZGV4T2Yob3BlbikgPT09IC0xICYmIHRlbXBTdGFjay5sYXN0SW5kZXhPZihvcGVuKSA9PT0gLTEpKSkge1xuICAgICAgICAgICAgICAgIHRlbXBTdGFjay5wdXNoKG9wZW4pO1xuICAgICAgICAgICAgICAgIGkgKz0gb3Blbi5sZW5ndGggLSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dC5zdGFydHNXaXRoKGNsb3NlLCBpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RPcGVuSW5kZXggPSB0ZW1wU3RhY2subGFzdEluZGV4T2Yob3Blbik7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RPcGVuSW5kZXggPT09IC0xICYmIHN0YWNrLmxhc3RJbmRleE9mKG9wZW4pICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBpc1N1Y2Nlc3M6IHRydWUsIG5ld1Bvc2l0aW9uOiBjdXJzb3JQb3NpdGlvbiA9PT0gaSA/IGkgKyBjbG9zZS5sZW5ndGggOiBpIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0T3BlbkluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhY2sgPSB0ZW1wU3RhY2suc2xpY2UoMCwgbGFzdE9wZW5JbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkgKz0gY2xvc2UubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWlsO1xufSIsICJpbXBvcnQgeyBTcGFjZVN0YXRlLCBzdHJpbmcyU3BhY2VTdGF0ZSB9IGZyb20gJ3NyYy9jb3JlJztcbmltcG9ydCB7IEFwcCwgVGV4dENvbXBvbmVudCwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIFdvcmtzcGFjZSwgV29ya3NwYWNlTGVhZiwgVGV4dEFyZWFDb21wb25lbnQsIG1vbWVudCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBFYXN5VHlwaW5nUGx1Z2luIGZyb20gJy4vbWFpbic7XG5pbXBvcnQgeyBzaG93U3RyaW5nLCBmaW5kRmlyc3RQaXBlTm90UHJlY2VkZWRCeUJhY2tzbGFzaCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZW5VUywgcnVSVSwgemhDTiwgemhUVyB9IGZyb20gJy4vbGFuZy9sb2NhbGUnO1xuaW1wb3J0IHtzcHJpbnRmfSBmcm9tIFwic3ByaW50Zi1qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhaXJTdHJpbmcge1xuXHRsZWZ0OiBzdHJpbmc7XG5cdHJpZ2h0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydFJ1bGUge1xuXHRiZWZvcmU6IFBhaXJTdHJpbmc7XG5cdGFmdGVyOiBQYWlyU3RyaW5nO1xuXHRhZnRlcl9wYXR0ZXJuPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBSdWxlVHlwZSB7ZGVsZXRlPSBcIkRlbGV0ZSBSdWxlXCIsIGNvbnZlcnQ9J0NvbnZlcnQgUnVsZSd9XG5leHBvcnQgZW51bSBXb3JrTW9kZSB7IE9ubHlXaGVuVHlwaW5nID0gXCJ0eXBpbmdcIiwgR2xvYmFsbHkgPSBcImdsb2JhbFwiIH1cblxuZXhwb3J0IGludGVyZmFjZSBFYXN5VHlwaW5nU2V0dGluZ3Mge1xuXHRUYWJvdXQ6IGJvb2xlYW47XG5cdFNlbGVjdGlvbkVuaGFuY2U6IGJvb2xlYW47XG5cdEludHJpbnNpY1N5bWJvbFBhaXJzOiBib29sZWFuO1xuXHRCYXNlT2JFZGl0RW5oYW5jZTogYm9vbGVhbjtcblx0RlcySFdFbmhhbmNlOiBib29sZWFuO1xuXHRCZXR0ZXJDb2RlRWRpdDogYm9vbGVhbjtcblx0QXV0b0Zvcm1hdDogYm9vbGVhbjtcblx0RXhjbHVkZUZpbGVzOiBzdHJpbmc7XG5cdEF1dG9DYXBpdGFsOiBib29sZWFuO1xuXHRBdXRvQ2FwaXRhbE1vZGU6IFdvcmtNb2RlO1xuXHRDaGluZXNlRW5nbGlzaFNwYWNlOiBib29sZWFuO1xuXHRFbmdsaXNoTnVtYmVyU3BhY2U6IGJvb2xlYW47XG5cdENoaW5lc2VOb1NwYWNlOiBib29sZWFuO1xuXHRDaGluZXNlTnVtYmVyU3BhY2U6IGJvb2xlYW47XG5cdFB1bmN0dWF0aW9uU3BhY2U6IGJvb2xlYW47XG5cdFB1bmN0dWF0aW9uU3BhY2VNb2RlOiBXb3JrTW9kZTtcblx0SW5saW5lQ29kZVNwYWNlTW9kZTogU3BhY2VTdGF0ZTtcblx0SW5saW5lRm9ybXVsYVNwYWNlTW9kZTogU3BhY2VTdGF0ZTtcblx0SW5saW5lTGlua1NwYWNlTW9kZTogU3BhY2VTdGF0ZTtcblx0SW5saW5lTGlua1NtYXJ0U3BhY2U6IGJvb2xlYW47XG5cdFVzZXJEZWZpbmVkUmVnU3dpdGNoOiBib29sZWFuO1xuXHRVc2VyRGVmaW5lZFJlZ0V4cDogc3RyaW5nO1xuXHRkZWJ1ZzogYm9vbGVhbjtcblxuXHR1c2VyU2VsUmVwUnVsZVRyaWdnZXI6IHN0cmluZ1tdO1xuXHR1c2VyU2VsUmVwUnVsZVZhbHVlOiBQYWlyU3RyaW5nW107XG5cdHVzZXJEZWxldGVSdWxlc1N0ckxpc3Q6IFtzdHJpbmcsIHN0cmluZ11bXTtcblx0dXNlckNvbnZlcnRSdWxlc1N0ckxpc3Q6IFtzdHJpbmcsIHN0cmluZ11bXTtcblx0dXNlclNlbFJ1bGVTZXR0aW5nc09wZW46IGJvb2xlYW47XG5cdHVzZXJEZWxSdWxlU2V0dGluZ3NPcGVuOiBib29sZWFuO1xuXHR1c2VyQ3Z0UnVsZVNldHRpbmdzT3BlbjogYm9vbGVhbjtcblxuXHRFbnRlclR3aWNlOiBib29sZWFuO1xuXHRQdW5jUmVjdGlmeTogYm9vbGVhbjtcblx0VHJ5Rml4Q2hpbmVzZUlNOiBib29sZWFuO1xuXHRGaXhNYWNPU0NvbnRleHRNZW51OiBib29sZWFuO1xuXHRUcnlGaXhNU0lNRTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IEVhc3lUeXBpbmdTZXR0aW5ncyA9IHtcblx0VGFib3V0OiB0cnVlLFxuXHRTZWxlY3Rpb25FbmhhbmNlOiB0cnVlLFxuXHRJbnRyaW5zaWNTeW1ib2xQYWlyczogdHJ1ZSxcblx0QmFzZU9iRWRpdEVuaGFuY2U6IHRydWUsXG5cdEZXMkhXRW5oYW5jZTogdHJ1ZSxcblx0QmV0dGVyQ29kZUVkaXQ6IHRydWUsXG5cblx0QXV0b0Zvcm1hdDogdHJ1ZSxcblx0RXhjbHVkZUZpbGVzOiBcIlwiLFxuXHRDaGluZXNlRW5nbGlzaFNwYWNlOiB0cnVlLFxuXHRDaGluZXNlTnVtYmVyU3BhY2U6IHRydWUsXG5cdEVuZ2xpc2hOdW1iZXJTcGFjZTogdHJ1ZSxcblx0Q2hpbmVzZU5vU3BhY2U6IHRydWUsXG5cdFB1bmN0dWF0aW9uU3BhY2U6IHRydWUsXG5cdEF1dG9DYXBpdGFsOiB0cnVlLFxuXHRBdXRvQ2FwaXRhbE1vZGU6IFdvcmtNb2RlLk9ubHlXaGVuVHlwaW5nLFxuXHRQdW5jdHVhdGlvblNwYWNlTW9kZTogV29ya01vZGUuT25seVdoZW5UeXBpbmcsXG5cdElubGluZUNvZGVTcGFjZU1vZGU6IFNwYWNlU3RhdGUuc29mdCxcblx0SW5saW5lRm9ybXVsYVNwYWNlTW9kZTogU3BhY2VTdGF0ZS5zb2Z0LFxuXHRJbmxpbmVMaW5rU3BhY2VNb2RlOiBTcGFjZVN0YXRlLnNvZnQsXG5cdElubGluZUxpbmtTbWFydFNwYWNlOiB0cnVlLFxuXHRVc2VyRGVmaW5lZFJlZ1N3aXRjaDogdHJ1ZSxcblx0VXNlckRlZmluZWRSZWdFeHA6IFwie3suKj99fXwrK1xcblwiK1xuXHRcdFwiPC4qPz58LS1cXG5cIiArXG5cdFx0XCJcXFxcW1xcXFwhLio/XFxcXF1bLStdezAsMX18LStcXG5cIitcblx0XHRcIihmaWxlOi8vL3xodHRwcz86Ly98ZnRwOi8vfG9ic2lkaWFuOi8vfHpvdGVybzovL3x3d3cuKVteXFxcXHNcdUZGMDhcdUZGMDlcdTMwMEFcdTMwMEJcdTMwMDIsXHVGRjBDXHVGRjAxXHVGRjFGO1x1RkYxQlx1RkYxQVx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVxcXFwpXFxcXChcXFxcW1xcXFxdXFxcXHtcXFxcfSddK3wtLVxcblwiK1xuXHRcdFwiXFxuW2EtekEtWjAtOV9cXFxcLS5dK0BbYS16QS1aMC05X1xcXFwtLl0rfCsrXFxuXCIrXG5cdFx0XCIoPzwhIykjW1xcXFx1NGUwMC1cXFxcdTlmYTVcXFxcdy1cXFxcL10rfCsrXCIsXG5cdGRlYnVnOiBmYWxzZSxcblx0dXNlclNlbFJlcFJ1bGVUcmlnZ2VyOiBbXCItXCIsIFwiI1wiXSxcblx0dXNlclNlbFJlcFJ1bGVWYWx1ZTogW3tsZWZ0Olwifn5cIiwgcmlnaHQ6XCJ+flwifSwge2xlZnQ6XCIjXCIsIHJpZ2h0OlwiIFwifV0sXG5cdHVzZXJEZWxldGVSdWxlc1N0ckxpc3Q6IFtbXCJkZW1vfFwiLCBcInxcIl1dLFxuXHR1c2VyQ29udmVydFJ1bGVzU3RyTGlzdDogW1tcIjopfFwiLFwiXHVEODNEXHVERTAwfFwiXV0sXG5cdHVzZXJTZWxSdWxlU2V0dGluZ3NPcGVuOiB0cnVlLFxuXHR1c2VyRGVsUnVsZVNldHRpbmdzT3BlbjogdHJ1ZSxcblx0dXNlckN2dFJ1bGVTZXR0aW5nc09wZW46IHRydWUsXG5cblx0RW50ZXJUd2ljZTogZmFsc2UsXG5cdFRyeUZpeENoaW5lc2VJTTogdHJ1ZSxcblx0UHVuY1JlY3RpZnk6IGZhbHNlLFxuXHRGaXhNYWNPU0NvbnRleHRNZW51OiBmYWxzZSxcblx0VHJ5Rml4TVNJTUU6IGZhbHNlLFxufVxuXG52YXIgbG9jYWxlID0gZW5VUztcblxuZXhwb3J0IGNsYXNzIEVhc3lUeXBpbmdTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG5cdHBsdWdpbjogRWFzeVR5cGluZ1BsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBFYXN5VHlwaW5nUGx1Z2luKSB7XG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXHR9XG5cblx0ZGlzcGxheSgpOiB2b2lkIHtcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG5cdFx0Ly8gbmV3IE5vdGljZShcIm1vbWVudC5sb2NhbGUoKSBcIittb21lbnQubG9jYWxlKCkpXG5cblx0XHRpZiAobW9tZW50LmxvY2FsZSgpID09IFwiemhcIiB8fCBtb21lbnQubG9jYWxlKCkgPT0gXCJ6aC1jblwiKSB7XG5cdFx0XHRsb2NhbGUgPSB6aENOO1xuXHRcdH1cblx0XHRlbHNlIGlmIChtb21lbnQubG9jYWxlKCkudG9Mb3dlckNhc2UoKSA9PSBcInpoLXR3XCIpe1xuXHRcdFx0bG9jYWxlID0gemhUVztcblx0XHR9XG5cdFx0ZWxzZSBpZiAobW9tZW50LmxvY2FsZSgpID09IFwicnVcIikge1xuXHRcdFx0bG9jYWxlID0gcnVSVTtcblx0XHR9XG5cblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMVwiLCB7IHRleHQ6IGxvY2FsZS5oZWFkZXJzLm1haW4gfSk7XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHsgdGV4dDogbG9jYWxlLmhlYWRlcnMuZ2l0aHViRGV0YWlsIH0pLmNyZWF0ZUVsKFwiYVwiLCB7XG5cdFx0XHR0ZXh0OiBcImVhc3ktdHlwaW5nLW9ic2lkaWFuXCIsXG5cdFx0XHRocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ZYW96aHV3YS9lYXN5LXR5cGluZy1vYnNpZGlhblwiLFxuXHRcdH0pO1xuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiBsb2NhbGUuaGVhZGVycy5lbmhhbmNlZEVkaXRpbmcgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5zeW1ib2xBdXRvUGFpci5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnN5bWJvbEF1dG9QYWlyLmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkludHJpbnNpY1N5bWJvbFBhaXJzKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkludHJpbnNpY1N5bWJvbFBhaXJzID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3Muc2VsZWN0aW9uUmVwbGFjZS5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnNlbGVjdGlvblJlcGxhY2UuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuU2VsZWN0aW9uRW5oYW5jZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5TZWxlY3Rpb25FbmhhbmNlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MuZnVsbFdpZHRoVG9IYWxmV2lkdGgubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5mdWxsV2lkdGhUb0hhbGZXaWR0aC5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5GVzJIV0VuaGFuY2UpXG5cdFx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuRlcySFdFbmhhbmNlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MuYmFzaWNJbnB1dEVuaGFuY2UubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5iYXNpY0lucHV0RW5oYW5jZS5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5CYXNlT2JFZGl0RW5oYW5jZSlcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5CYXNlT2JFZGl0RW5oYW5jZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLmNvZGVibG9ja0VkaXQubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5jb2RlYmxvY2tFZGl0LmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLkJldHRlckNvZGVFZGl0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkJldHRlckNvZGVFZGl0ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MudGFiT3V0Lm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MudGFiT3V0LmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlRhYm91dClcblx0XHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5UYWJvdXQgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IGxvY2FsZS5oZWFkZXJzLmN1c3RvbWl6ZUVkaXRSdWxlIH0pO1xuXHRcdHRoaXMuYnVpbGRVc2VyU2VsUmVwUnVsZVNldHRpbmcodGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImRldGFpbHNcIiwge1xuXHRcdFx0Y2xzOiBcImVhc3l0eXBpbmctbmVzdGVkLXNldHRpbmdzXCIsXG5cdFx0XHRhdHRyOiB7XG5cdFx0XHRcdC4uLih0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyU2VsUnVsZVNldHRpbmdzT3Blbj97IG9wZW46IHRydWUgfTp7fSlcblx0XHRcdH1cblx0XHR9KSlcblxuXHRcdHRoaXMuYnVpbGRVc2VyRGVsZXRlUnVsZVNldHRpbmcodGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImRldGFpbHNcIiwge1xuXHRcdFx0Y2xzOiBcImVhc3l0eXBpbmctbmVzdGVkLXNldHRpbmdzXCIsXG5cdFx0XHRhdHRyOiB7XG5cdFx0XHRcdC4uLih0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyRGVsUnVsZVNldHRpbmdzT3Blbj97IG9wZW46IHRydWUgfTp7fSlcblx0XHRcdH1cblx0XHR9KSlcblxuXHRcdHRoaXMuYnVpbGRVc2VyQ29udmVydFJ1bGVTZXR0aW5nKHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJkZXRhaWxzXCIsIHtcblx0XHRcdGNsczogXCJlYXN5dHlwaW5nLW5lc3RlZC1zZXR0aW5nc1wiLFxuXHRcdFx0YXR0cjoge1xuXHRcdFx0XHQuLi4odGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckN2dFJ1bGVTZXR0aW5nc09wZW4/eyBvcGVuOiB0cnVlIH06e30pXG5cdFx0XHR9XG5cdFx0fSkpXG5cdFx0XG5cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IGxvY2FsZS5oZWFkZXJzLmF1dG9mb3JtYXRTZXR0aW5nIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MuYXV0b0Zvcm1hdHRpbmcubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5hdXRvRm9ybWF0dGluZy5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvRm9ybWF0KVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkF1dG9Gb3JtYXQgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ3AnLCB7IHRleHQ6IGxvY2FsZS5oZWFkZXJzLmRldGFpbGVkU2V0dGluZyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnNwYWNlQmV0d2VlbkNoaW5lc2VFbmdsaXNoLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3Muc3BhY2VCZXR3ZWVuQ2hpbmVzZUVuZ2xpc2guZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQ2hpbmVzZUVuZ2xpc2hTcGFjZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuQ2hpbmVzZUVuZ2xpc2hTcGFjZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3Muc3BhY2VCZXR3ZWVuQ2hpbmVzZU51bWJlci5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnNwYWNlQmV0d2VlbkNoaW5lc2VOdW1iZXIuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQ2hpbmVzZU51bWJlclNwYWNlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5DaGluZXNlTnVtYmVyU3BhY2UgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5zcGFjZUJldHdlZW5FbmdsaXNoTnVtYmVyLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3Muc3BhY2VCZXR3ZWVuRW5nbGlzaE51bWJlci5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5FbmdsaXNoTnVtYmVyU3BhY2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkVuZ2xpc2hOdW1iZXJTcGFjZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MuZGVsZXRlU3BhY2VCZXR3ZWVuQ2hpbmVzZS5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLmRlbGV0ZVNwYWNlQmV0d2VlbkNoaW5lc2UuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQ2hpbmVzZU5vU3BhY2UpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkNoaW5lc2VOb1NwYWNlID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIuZGVzYylcblx0XHRcdC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFdvcmtNb2RlLk9ubHlXaGVuVHlwaW5nLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLm9ubHlXaGVuVHlwaW5nKTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFdvcmtNb2RlLkdsb2JhbGx5LCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLmdsb2JhbGx5KTtcblx0XHRcdFx0ZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQXV0b0NhcGl0YWxNb2RlKTtcblx0XHRcdFx0ZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKHY6IFdvcmtNb2RlLk9ubHlXaGVuVHlwaW5nIHwgV29ya01vZGUuR2xvYmFsbHkpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5BdXRvQ2FwaXRhbE1vZGUgPSB2O1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VG9vbHRpcChsb2NhbGUudG9vbFRpcC5zd2l0Y2gpO1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuQXV0b0NhcGl0YWwpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkF1dG9DYXBpdGFsID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5zbWFydEluc2VydFNwYWNlLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3Muc21hcnRJbnNlcnRTcGFjZS5kZXNjKVxuXHRcdFx0LmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oV29ya01vZGUuT25seVdoZW5UeXBpbmcsIGxvY2FsZS5kcm9wZG93bk9wdGlvbnMub25seVdoZW5UeXBpbmcpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oV29ya01vZGUuR2xvYmFsbHksIGxvY2FsZS5kcm9wZG93bk9wdGlvbnMuZ2xvYmFsbHkpO1xuXHRcdFx0XHRkcm9wZG93bi5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5QdW5jdHVhdGlvblNwYWNlTW9kZSk7XG5cdFx0XHRcdGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2OiBXb3JrTW9kZS5Pbmx5V2hlblR5cGluZyB8IFdvcmtNb2RlLkdsb2JhbGx5KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY3R1YXRpb25TcGFjZU1vZGUgPSB2O1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY3R1YXRpb25TcGFjZSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY3R1YXRpb25TcGFjZSA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3Muc3BhY2VTdHJhdGVneUlubGluZUNvZGUubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5zcGFjZVN0cmF0ZWd5SW5saW5lQ29kZS5kZXNjKVxuXHRcdFx0LmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKFNwYWNlU3RhdGUubm9uZSksIGxvY2FsZS5kcm9wZG93bk9wdGlvbnMubm9SZXF1aXJlKTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLnNvZnQpLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLnNvZnRTcGFjZSk7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihTdHJpbmcoU3BhY2VTdGF0ZS5zdHJpY3QpLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLnN0cmljdFNwYWNlKTtcblx0XHRcdFx0ZHJvcGRvd24uc2V0VmFsdWUoU3RyaW5nKHRoaXMucGx1Z2luLnNldHRpbmdzLklubGluZUNvZGVTcGFjZU1vZGUpKTtcblx0XHRcdFx0ZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKHY6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLklubGluZUNvZGVTcGFjZU1vZGUgPSBzdHJpbmcyU3BhY2VTdGF0ZSh2KTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSlcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3Muc3BhY2VTdHJhdGVneUlubGluZUZvcm11bGEubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5zcGFjZVN0cmF0ZWd5SW5saW5lRm9ybXVsYS5kZXNjKVxuXHRcdFx0LmFkZERyb3Bkb3duKChkcm9wZG93bikgPT4ge1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKFNwYWNlU3RhdGUubm9uZSksIGxvY2FsZS5kcm9wZG93bk9wdGlvbnMubm9SZXF1aXJlKTtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLnNvZnQpLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLnNvZnRTcGFjZSk7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihTdHJpbmcoU3BhY2VTdGF0ZS5zdHJpY3QpLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLnN0cmljdFNwYWNlKTtcblx0XHRcdFx0ZHJvcGRvd24uc2V0VmFsdWUoU3RyaW5nKHRoaXMucGx1Z2luLnNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGUpKTtcblx0XHRcdFx0ZHJvcGRvd24ub25DaGFuZ2UoYXN5bmMgKHY6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLklubGluZUZvcm11bGFTcGFjZU1vZGUgPSBzdHJpbmcyU3BhY2VTdGF0ZSh2KTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSlcblx0XHRcdH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3Muc3BhY2VTdHJhdGVneUxpbmtUZXh0Lm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3Muc3BhY2VTdHJhdGVneUxpbmtUZXh0LmRlc2MpXG5cdFx0XHQuYWRkRHJvcGRvd24oKGRyb3Bkb3duKSA9PiB7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihcImR1bW15XCIsIGxvY2FsZS5kcm9wZG93bk9wdGlvbnMuZHVtbXkpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oXCJzbWFydFwiLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLnNtYXJ0KTtcblx0XHRcdFx0ZHJvcGRvd24uc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgPyBcInNtYXJ0XCIgOiBcImR1bW15XCIpO1xuXHRcdFx0XHRkcm9wZG93bi5vbkNoYW5nZShhc3luYyAodjogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuSW5saW5lTGlua1NtYXJ0U3BhY2UgPSB2ID09IFwic21hcnRcIiA/IHRydWUgOiBmYWxzZTtcblx0XHRcdFx0XHQvLyBuZXcgTm90aWNlKFN0cmluZyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVMaW5rU21hcnRTcGFjZSkpO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KVxuXHRcdFx0fSlcblx0XHRcdC5hZGREcm9wZG93bigoZHJvcGRvd24pID0+IHtcblx0XHRcdFx0ZHJvcGRvd24uYWRkT3B0aW9uKFN0cmluZyhTcGFjZVN0YXRlLm5vbmUpLCBsb2NhbGUuZHJvcGRvd25PcHRpb25zLm5vUmVxdWlyZSk7XG5cdFx0XHRcdGRyb3Bkb3duLmFkZE9wdGlvbihTdHJpbmcoU3BhY2VTdGF0ZS5zb2Z0KSwgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5zb2Z0U3BhY2UpO1xuXHRcdFx0XHRkcm9wZG93bi5hZGRPcHRpb24oU3RyaW5nKFNwYWNlU3RhdGUuc3RyaWN0KSwgbG9jYWxlLmRyb3Bkb3duT3B0aW9ucy5zdHJpY3RTcGFjZSk7XG5cdFx0XHRcdGRyb3Bkb3duLnNldFZhbHVlKFN0cmluZyh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlKSk7XG5cdFx0XHRcdGRyb3Bkb3duLm9uQ2hhbmdlKGFzeW5jICh2OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5JbmxpbmVMaW5rU3BhY2VNb2RlID0gc3RyaW5nMlNwYWNlU3RhdGUodik7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiBsb2NhbGUuaGVhZGVycy5jdXN0b21SZWdleHBCbG9jayB9KTtcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy51c2VyRGVmaW5lZFJlZ2V4cFN3aXRjaC5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLnVzZXJEZWZpbmVkUmVnZXhwU3dpdGNoLmRlc2MpXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcblx0XHRcdFx0dG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZXJEZWZpbmVkUmVnU3dpdGNoKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VyRGVmaW5lZFJlZ1N3aXRjaCA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHsgdGV4dDogbG9jYWxlLmhlYWRlcnMuYWJvdXRSZWdleHAuaGVhZGVyIH0pLmNyZWF0ZUVsKFwiYVwiLCB7XG5cdFx0XHR0ZXh0OiBsb2NhbGUuaGVhZGVycy5hYm91dFJlZ2V4cC50ZXh0LFxuXHRcdFx0aHJlZjogXCJodHRwczovL2phdmFzY3JpcHQucnVhbnlpZmVuZy5jb20vc3RkbGliL3JlZ2V4cC5odG1sI1wiLFxuXHRcdH0pO1xuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHsgdGV4dDogbG9jYWxlLmhlYWRlcnMuaW5zdHJ1Y3Rpb25zUmVnZXhwLmhlYWRlciB9KS5jcmVhdGVFbChcImFcIiwge1xuXHRcdFx0dGV4dDogbG9jYWxlLmhlYWRlcnMuaW5zdHJ1Y3Rpb25zUmVnZXhwLnRleHQsXG5cdFx0XHRocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ZYW96aHV3YS9lYXN5LXR5cGluZy1vYnNpZGlhbi9ibG9iL21hc3Rlci9Vc2VyRGVmaW5lZFJlZ0V4cC5tZFwiLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgcmVnQ29udGVudEFyZWFTZXR0aW5nID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpO1xuXHRcdHJlZ0NvbnRlbnRBcmVhU2V0dGluZy5zZXR0aW5nRWwuc2V0QXR0cmlidXRlKFxuXHRcdFx0XCJzdHlsZVwiLFxuXHRcdFx0XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcIlxuXHRcdCk7XG5cdFx0cmVnQ29udGVudEFyZWFTZXR0aW5nXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MudXNlckRlZmluZWRSZWdleHAubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy51c2VyRGVmaW5lZFJlZ2V4cC5kZXNjKTtcblx0XHRjb25zdCByZWdDb250ZW50QXJlYSA9IG5ldyBUZXh0QXJlYUNvbXBvbmVudChcblx0XHRcdHJlZ0NvbnRlbnRBcmVhU2V0dGluZy5jb250cm9sRWxcblx0XHQpO1xuXG5cdFx0c2V0QXR0cmlidXRlcyhyZWdDb250ZW50QXJlYS5pbnB1dEVsLCB7XG5cdFx0XHRzdHlsZTogXCJtYXJnaW4tdG9wOiAxMnB4OyB3aWR0aDogMTAwJTsgIGhlaWdodDogMzB2aDtcIixcblx0XHRcdC8vIGNsYXNzOiBcIm1zLWNzcy1lZGl0b3JcIixcblx0XHR9KTtcblx0XHRyZWdDb250ZW50QXJlYVxuXHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLlVzZXJEZWZpbmVkUmVnRXhwKVxuXHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5Vc2VyRGVmaW5lZFJlZ0V4cCA9IHZhbHVlO1xuXHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdH0pO1xuXG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiBsb2NhbGUuaGVhZGVycy5leGNsdWRlRm9sZGVyc0ZpbGVzIH0pO1xuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLmV4Y2x1ZGVGb2xkZXJzRmlsZXMubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5leGNsdWRlRm9sZGVyc0ZpbGVzLmRlc2MpXG5cdFx0XHQuYWRkVGV4dEFyZWEoKHRleHQpID0+XG5cdFx0XHRcdHRleHRcblx0XHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuRXhjbHVkZUZpbGVzKVxuXHRcdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLkV4Y2x1ZGVGaWxlcyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XG5cdFx0Y29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiBsb2NhbGUuaGVhZGVycy5leHBlcmltZW50YWxGZWF0dXJlcyB9KTtcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5maXhNYWNPU0NvbnRleHRNZW51Lm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MuZml4TWFjT1NDb250ZXh0TWVudS5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5GaXhNYWNPU0NvbnRleHRNZW51KS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5GaXhNYWNPU0NvbnRleHRNZW51ID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5maXhNaWNyb3NvZnRJTUUubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5maXhNaWNyb3NvZnRJTUUuZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuVHJ5Rml4TVNJTUUpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLlRyeUZpeE1TSU1FID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5zdHJpY3RMaW5lQnJlYWtzLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3Muc3RyaWN0TGluZUJyZWFrcy5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5FbnRlclR3aWNlKS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5FbnRlclR3aWNlID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MucHVuY1JlY3RpZnkubmFtZSlcblx0XHRcdC5zZXREZXNjKGxvY2FsZS5zZXR0aW5ncy5wdW5jUmVjdGlmeS5kZXNjKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5QdW5jUmVjdGlmeSkub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuUHVuY1JlY3RpZnkgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnByaW50RGVidWdJbmZvLm5hbWUpXG5cdFx0XHQuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3MucHJpbnREZWJ1Z0luZm8uZGVzYylcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuXHRcdFx0XHR0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZGVidWcpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmRlYnVnID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRidWlsZFVzZXJTZWxSZXBSdWxlU2V0dGluZyhjb250YWluZXJFbDogSFRNTERldGFpbHNFbGVtZW50KXtcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuICAgICAgICBjb250YWluZXJFbC5vbnRvZ2dsZSA9IGFzeW5jICgpID0+IHtcblx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJTZWxSdWxlU2V0dGluZ3NPcGVuID0gY29udGFpbmVyRWwub3Blbjtcblx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICB9O1xuXHRcdFxuXHRcdGNvbnN0IHN1bW1hcnkgPSBjb250YWluZXJFbC5jcmVhdGVFbChcInN1bW1hcnlcIiwge2NsczogXCJlYXN5dHlwaW5nLW5lc3RlZC1zZXR0aW5nc1wifSk7XG5cdFx0c3VtbWFyeS5zZXRUZXh0KGxvY2FsZS5oZWFkZXJzLmN1c3RvbWl6ZVNlbGVjdGlvblJ1bGUpXG5cbiAgICAgICAgLy8gc3VtbWFyeS5zZXRIZWFkaW5nKCkuc2V0TmFtZShcIlVzZXIgZGVmaW5lZCBTZWxlY3Rpb24gUmVwbGFjZSBSdWxlXCIpO1xuICAgICAgICAvLyBzdW1tYXJ5LmNyZWF0ZURpdihcImNvbGxhcHNlclwiKS5jcmVhdGVEaXYoXCJoYW5kbGVcIik7XG5cblx0XHRjb25zdCBzZWxlY3Rpb25SdWxlU2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKTtcblx0XHRzZWxlY3Rpb25SdWxlU2V0dGluZ1xuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLnNlbGVjdGlvblJlcGxhY2VSdWxlLm5hbWUpXG5cdFx0XHQvLyAuc2V0RGVzYyhsb2NhbGUuc2V0dGluZ3Muc2VsZWN0aW9uUmVwbGFjZVJ1bGUuZGVzYylcblxuXHRcdGNvbnN0IHJlcGxhY2VSdWxlVHJpZ2dlciA9IG5ldyBUZXh0Q29tcG9uZW50KHNlbGVjdGlvblJ1bGVTZXR0aW5nLmNvbnRyb2xFbCk7XG5cdFx0cmVwbGFjZVJ1bGVUcmlnZ2VyLnNldFBsYWNlaG9sZGVyKGxvY2FsZS5wbGFjZUhvbGRlci50cmlnZ2VyU3ltYm9sKTtcblxuXHRcdGNvbnN0IHJlcGxhY2VMZWZ0U3RyaW5nID0gbmV3IFRleHRDb21wb25lbnQoc2VsZWN0aW9uUnVsZVNldHRpbmcuY29udHJvbEVsKTtcblx0XHRyZXBsYWNlTGVmdFN0cmluZy5zZXRQbGFjZWhvbGRlcihsb2NhbGUucGxhY2VIb2xkZXIubmV3TGVmdFNpZGVTdHJpbmcpO1xuXG5cdFx0Y29uc3QgcmVwbGFjZVJpZ2h0U3RyaW5nID0gbmV3IFRleHRDb21wb25lbnQoc2VsZWN0aW9uUnVsZVNldHRpbmcuY29udHJvbEVsKTtcblx0XHRyZXBsYWNlUmlnaHRTdHJpbmcuc2V0UGxhY2Vob2xkZXIobG9jYWxlLnBsYWNlSG9sZGVyLm5ld1JpZ2h0U2lkZVN0cmluZyk7XG5cblx0XHRzZWxlY3Rpb25SdWxlU2V0dGluZ1xuXHRcdFx0LmFkZEJ1dHRvbigoYnV0dG9uKSA9PiB7XG5cdFx0XHRcdGJ1dHRvblxuXHRcdFx0XHRcdC5zZXRCdXR0b25UZXh0KFwiK1wiKVxuXHRcdFx0XHRcdC5zZXRUb29sdGlwKGxvY2FsZS5wbGFjZUhvbGRlci5hZGRSdWxlKVxuXHRcdFx0XHRcdC5vbkNsaWNrKGFzeW5jIChidXR0b25FbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRsZXQgdHJpZ2dlciA9IHJlcGxhY2VSdWxlVHJpZ2dlci5pbnB1dEVsLnZhbHVlO1xuXHRcdFx0XHRcdFx0bGV0IGxlZnQgPSByZXBsYWNlTGVmdFN0cmluZy5pbnB1dEVsLnZhbHVlO1xuXHRcdFx0XHRcdFx0bGV0IHJpZ2h0ID0gcmVwbGFjZVJpZ2h0U3RyaW5nLmlucHV0RWwudmFsdWU7XG5cdFx0XHRcdFx0XHRpZiAodHJpZ2dlciAmJiAobGVmdCB8fCByaWdodCkpIHtcblx0XHRcdFx0XHRcdFx0aWYodHJpZ2dlci5sZW5ndGghPTEgJiYgdHJpZ2dlciE9XCJcdTIwMTRcdTIwMTRcIiAmJiB0cmlnZ2VyIT1cIlx1MjAyNlx1MjAyNlwiKXtcblx0XHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKGxvY2FsZS5wbGFjZUhvbGRlci5ub3RpY2VJbnZhaWRUcmlnZ2VyKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMucGx1Z2luLmFkZFVzZXJTZWxlY3Rpb25SZXBSdWxlKHRyaWdnZXIsIGxlZnQsIHJpZ2h0KSl7XG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZXtcblx0XHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKHNwcmludGYobG9jYWxlLnBsYWNlSG9sZGVyLm5vdGljZVdhcm5UcmlnZ2VyRXhpc3RzLCB0cmlnZ2VyKSlcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UobG9jYWxlLnBsYWNlSG9sZGVyLm5vdGljZU1pc3NpbmdJbnB1dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdC8vIGNvbnN0IHNlbFJlcFJ1bGVDb250YWluZXIgPSBjb250YWluZXJFbC5jcmVhdGVFbChcImRpdlwiKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJTZWxSZXBSdWxlVHJpZ2dlci5sZW5ndGg7IGkrKykge1xuXHRcdFx0bGV0IHRyaWdnZXIgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVRyaWdnZXJbaV07XG5cdFx0XHRsZXQgbGVmdF9zID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlclNlbFJlcFJ1bGVWYWx1ZVtpXS5sZWZ0O1xuXHRcdFx0bGV0IHJpZ2h0X3MgPSB0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyU2VsUmVwUnVsZVZhbHVlW2ldLnJpZ2h0O1xuXHRcdFx0bGV0IHNob3dTdHIgPSBcIlRyaWdnZXI6IFwiICsgdHJpZ2dlciArIFwiIFx1MjE5MiBcIiArIHNob3dTdHJpbmcobGVmdF9zKSArIFwic2VsZWN0ZWRcIiArIHNob3dTdHJpbmcocmlnaHRfcyk7XG5cdFx0XHQvLyBjb25zdCBzZXR0aW5nSXRlbSA9IHNlbFJlcFJ1bGVDb250YWluZXIuY3JlYXRlRWwoXCJkaXZcIik7XG5cdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdFx0LnNldE5hbWUoc2hvd1N0cilcblx0XHRcdFx0LmFkZEV4dHJhQnV0dG9uKGJ1dHRvbiA9PiB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEljb24oXCJnZWFyXCIpXG5cdFx0XHRcdFx0XHQuc2V0VG9vbHRpcChsb2NhbGUudG9vbFRpcC5lZGl0UnVsZSlcblx0XHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0bmV3IFNlbGVjdFJ1bGVFZGl0TW9kYWwodGhpcy5hcHAsIHRyaWdnZXIsbGVmdF9zLCByaWdodF9zLCBhc3luYyAobmV3X2xlZnQsIG5ld19yaWdodCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnVwZGF0ZVVzZXJTZWxlY3Rpb25SZXBSdWxlKGksIG5ld19sZWZ0LCBuZXdfcmlnaHQpO1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0XHR9KS5vcGVuKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuYWRkRXh0cmFCdXR0b24oYnV0dG9uID0+IHtcblx0XHRcdFx0XHRidXR0b24uc2V0SWNvbihcInRyYXNoXCIpXG5cdFx0XHRcdFx0XHQuc2V0VG9vbHRpcChsb2NhbGUudG9vbFRpcC5yZW1vdmVSdWxlKVxuXHRcdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5kZWxldGVVc2VyU2VsZWN0aW9uUmVwUnVsZShpKTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cblx0fVxuXG5cdGJ1aWxkVXNlckRlbGV0ZVJ1bGVTZXR0aW5nKGNvbnRhaW5lckVsOiBIVE1MRGV0YWlsc0VsZW1lbnQpe1xuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG4gICAgICAgIGNvbnRhaW5lckVsLm9udG9nZ2xlID0gYXN5bmMgKCkgPT4ge1xuXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckRlbFJ1bGVTZXR0aW5nc09wZW4gPSBjb250YWluZXJFbC5vcGVuO1xuXHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgIH07XG5cdFx0Y29uc3Qgc3VtbWFyeSA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwic3VtbWFyeVwiLCB7Y2xzOiBcImVhc3l0eXBpbmctbmVzdGVkLXNldHRpbmdzXCJ9KTtcblx0XHRzdW1tYXJ5LnNldFRleHQobG9jYWxlLmhlYWRlcnMuY3VzdG9taXplRGVsZXRlUnVsZSlcblxuXHRcdGNvbnN0IGRlbGV0ZVJ1bGVTZXR0aW5nID0gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpO1xuXHRcdGRlbGV0ZVJ1bGVTZXR0aW5nXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MuZGVsZXRlUnVsZS5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLmRlbGV0ZVJ1bGUuZGVzYylcblxuXHRcdGNvbnN0IHBhdHRlcm5CZWZvcmUgPSBuZXcgVGV4dEFyZWFDb21wb25lbnQoZGVsZXRlUnVsZVNldHRpbmcuY29udHJvbEVsKTtcblx0XHRwYXR0ZXJuQmVmb3JlLnNldFBsYWNlaG9sZGVyKGxvY2FsZS5wbGFjZUhvbGRlci5iZWZvcmVEZWxldGUpO1xuXG5cdFx0Y29uc3QgcGF0dGVybkFmdGVyID0gbmV3IFRleHRBcmVhQ29tcG9uZW50KGRlbGV0ZVJ1bGVTZXR0aW5nLmNvbnRyb2xFbCk7XG5cdFx0cGF0dGVybkFmdGVyLnNldFBsYWNlaG9sZGVyKGxvY2FsZS5wbGFjZUhvbGRlci5uZXdQYXR0ZXJuKTtcblxuXHRcdGRlbGV0ZVJ1bGVTZXR0aW5nXG5cdFx0XHQuYWRkQnV0dG9uKChidXR0b24pID0+IHtcblx0XHRcdFx0YnV0dG9uXG5cdFx0XHRcdFx0LnNldEJ1dHRvblRleHQoXCIrXCIpXG5cdFx0XHRcdFx0LnNldFRvb2x0aXAobG9jYWxlLnRvb2xUaXAuYWRkUnVsZSlcblx0XHRcdFx0XHQub25DbGljayhhc3luYyAoYnV0dG9uRWw6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IGJlZm9yZSA9IHBhdHRlcm5CZWZvcmUuaW5wdXRFbC52YWx1ZTtcblx0XHRcdFx0XHRcdGxldCBhZnRlciA9IHBhdHRlcm5BZnRlci5pbnB1dEVsLnZhbHVlO1xuXHRcdFx0XHRcdFx0aWYgKGJlZm9yZSAmJiBhZnRlcikge1xuXHRcdFx0XHRcdFx0XHRpZihmaW5kRmlyc3RQaXBlTm90UHJlY2VkZWRCeUJhY2tzbGFzaChiZWZvcmUpPT0tMSl7XG5cdFx0XHRcdFx0XHRcdFx0bmV3IE5vdGljZShsb2NhbGUucGxhY2VIb2xkZXIubm90aWNlSW52YWlkVHJpZ2dlclBhdHRlcm5Db250YWluU3ltYm9sKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZXtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5hZGRVc2VyRGVsZXRlUnVsZShiZWZvcmUsIGFmdGVyKTtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UobG9jYWxlLnBsYWNlSG9sZGVyLm5vdGljZU1pc3NpbmdJbnB1dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdC5sZW5ndGg7IGkrKyl7XG5cdFx0XHRsZXQgYmVmb3JlID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckRlbGV0ZVJ1bGVzU3RyTGlzdFtpXVswXTtcblx0XHRcdGxldCBhZnRlciA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJEZWxldGVSdWxlc1N0ckxpc3RbaV1bMV07XG5cdFx0XHRsZXQgc2hvd1N0ciA9IFwiXFxcIlwiICsgc2hvd1N0cmluZyhiZWZvcmUpICsgXCJcXFwiICBkZWxldGUuYmFja3dhcmRzICBcdTIxOTIgXFxcIlwiKyBzaG93U3RyaW5nKGFmdGVyKStcIlxcXCJcIjsgXG5cdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdFx0LnNldE5hbWUoc2hvd1N0cilcblx0XHRcdFx0LmFkZEV4dHJhQnV0dG9uKGJ1dHRvbiA9PiB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEljb24oXCJnZWFyXCIpXG5cdFx0XHRcdFx0XHQuc2V0VG9vbHRpcChsb2NhbGUudG9vbFRpcC5lZGl0UnVsZSlcblx0XHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0bmV3IEVkaXRDb252ZXJ0UnVsZU1vZGFsKHRoaXMuYXBwLCBSdWxlVHlwZS5kZWxldGUsIGJlZm9yZSwgYWZ0ZXIsIGFzeW5jIChuZXdfYmVmb3JlLCBuZXdfYWZ0ZXIpID0+IHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi51cGRhdGVVc2VyRGVsZXRlUnVsZShpLCBuZXdfYmVmb3JlLCBuZXdfYWZ0ZXIpO1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0XHR9KS5vcGVuKCk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuYWRkRXh0cmFCdXR0b24oYnV0dG9uID0+IHtcblx0XHRcdFx0XHRidXR0b24uc2V0SWNvbihcInRyYXNoXCIpXG5cdFx0XHRcdFx0XHQuc2V0VG9vbHRpcChsb2NhbGUudG9vbFRpcC5yZW1vdmVSdWxlKVxuXHRcdFx0XHRcdFx0Lm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnBsdWdpbi5kZWxldGVVc2VyRGVsZXRlUnVsZShpKTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0fSk7XG5cdFx0fVxuXG5cdH1cblxuXHRidWlsZFVzZXJDb252ZXJ0UnVsZVNldHRpbmcoY29udGFpbmVyRWw6IEhUTUxEZXRhaWxzRWxlbWVudCl7XG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICAgICAgY29udGFpbmVyRWwub250b2dnbGUgPSBhc3luYyAoKSA9PiB7XG5cdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy51c2VyQ3Z0UnVsZVNldHRpbmdzT3BlbiA9IGNvbnRhaW5lckVsLm9wZW47XG5cdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgfTtcblx0XHRjb25zdCBzdW1tYXJ5ID0gY29udGFpbmVyRWwuY3JlYXRlRWwoXCJzdW1tYXJ5XCIsIHtjbHM6IFwiZWFzeXR5cGluZy1uZXN0ZWQtc2V0dGluZ3NcIn0pO1xuXHRcdHN1bW1hcnkuc2V0VGV4dChsb2NhbGUuaGVhZGVycy5jdXN0b21pemVDb252ZXJ0UnVsZSlcblxuXHRcdGNvbnN0IGNvbnZlcnRSdWxlU2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKTtcblx0XHRjb252ZXJ0UnVsZVNldHRpbmdcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5jb252ZXJ0UnVsZS5uYW1lKVxuXHRcdFx0LnNldERlc2MobG9jYWxlLnNldHRpbmdzLmNvbnZlcnRSdWxlLmRlc2MpXG5cblx0XHRjb25zdCBwYXR0ZXJuQmVmb3JlID0gbmV3IFRleHRBcmVhQ29tcG9uZW50KGNvbnZlcnRSdWxlU2V0dGluZy5jb250cm9sRWwpO1xuXHRcdHBhdHRlcm5CZWZvcmUuc2V0UGxhY2Vob2xkZXIobG9jYWxlLnBsYWNlSG9sZGVyLmJlZm9yZUNvbnZlcnQpO1xuXG5cdFx0Y29uc3QgcGF0dGVybkFmdGVyID0gbmV3IFRleHRBcmVhQ29tcG9uZW50KGNvbnZlcnRSdWxlU2V0dGluZy5jb250cm9sRWwpO1xuXHRcdHBhdHRlcm5BZnRlci5zZXRQbGFjZWhvbGRlcihsb2NhbGUucGxhY2VIb2xkZXIubmV3UGF0dGVybik7XG5cblx0XHRjb252ZXJ0UnVsZVNldHRpbmdcblx0XHRcdC5hZGRCdXR0b24oKGJ1dHRvbikgPT4ge1xuXHRcdFx0XHRidXR0b25cblx0XHRcdFx0XHQuc2V0QnV0dG9uVGV4dChcIitcIilcblx0XHRcdFx0XHQuc2V0VG9vbHRpcChsb2NhbGUudG9vbFRpcC5hZGRSdWxlKVxuXHRcdFx0XHRcdC5vbkNsaWNrKGFzeW5jIChidXR0b25FbDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRsZXQgYmVmb3JlID0gcGF0dGVybkJlZm9yZS5pbnB1dEVsLnZhbHVlO1xuXHRcdFx0XHRcdFx0bGV0IGFmdGVyID0gcGF0dGVybkFmdGVyLmlucHV0RWwudmFsdWU7XG5cdFx0XHRcdFx0XHRpZiAoYmVmb3JlICYmIGFmdGVyKSB7XG5cdFx0XHRcdFx0XHRcdGlmKGZpbmRGaXJzdFBpcGVOb3RQcmVjZWRlZEJ5QmFja3NsYXNoKGJlZm9yZSk9PS0xKXtcblx0XHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKGxvY2FsZS5wbGFjZUhvbGRlci5ub3RpY2VJbnZhaWRUcmlnZ2VyUGF0dGVybkNvbnRhaW5TeW1ib2wpO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNle1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmFkZFVzZXJDb252ZXJ0UnVsZShiZWZvcmUsIGFmdGVyKTtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG5ldyBOb3RpY2UobG9jYWxlLnBsYWNlSG9sZGVyLm5vdGljZU1pc3NpbmdJbnB1dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3QubGVuZ3RoOyBpKyspe1xuXHRcdFx0bGV0IGJlZm9yZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzLnVzZXJDb252ZXJ0UnVsZXNTdHJMaXN0W2ldWzBdO1xuXHRcdFx0bGV0IGFmdGVyID0gdGhpcy5wbHVnaW4uc2V0dGluZ3MudXNlckNvbnZlcnRSdWxlc1N0ckxpc3RbaV1bMV07XG5cdFx0XHRsZXQgc2hvd1N0ciA9IFwiXFxcIlwiICsgc2hvd1N0cmluZyhiZWZvcmUpICsgXCJcXFwiICBhdXRvIGNvbnZlcnQgdG8gXFxcIlwiKyBzaG93U3RyaW5nKGFmdGVyKStcIlxcXCJcIjsgXG5cdFx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdFx0LnNldE5hbWUoc2hvd1N0cilcblx0XHRcdFx0LmFkZEV4dHJhQnV0dG9uKGJ1dHRvbiA9PiB7XG5cdFx0XHRcdFx0YnV0dG9uLnNldEljb24oXCJnZWFyXCIpXG5cdFx0XHRcdFx0XHQuc2V0VG9vbHRpcChsb2NhbGUudG9vbFRpcC5lZGl0UnVsZSlcblx0XHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0bmV3IEVkaXRDb252ZXJ0UnVsZU1vZGFsKHRoaXMuYXBwLCBSdWxlVHlwZS5jb252ZXJ0LCBiZWZvcmUsIGFmdGVyLCBhc3luYyAobmV3X2JlZm9yZSwgbmV3X2FmdGVyKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4udXBkYXRlVXNlckNvbnZlcnRSdWxlKGksIG5ld19iZWZvcmUsIG5ld19hZnRlcik7XG5cdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XG5cdFx0XHRcdFx0XHRcdH0pLm9wZW4oKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5hZGRFeHRyYUJ1dHRvbihidXR0b24gPT4ge1xuXHRcdFx0XHRcdGJ1dHRvbi5zZXRJY29uKFwidHJhc2hcIilcblx0XHRcdFx0XHRcdC5zZXRUb29sdGlwKGxvY2FsZS50b29sVGlwLnJlbW92ZVJ1bGUpXG5cdFx0XHRcdFx0XHQub25DbGljayhhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLmRlbGV0ZVVzZXJDb252ZXJ0UnVsZShpKTtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cbn1cblxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzKGVsZW1lbnQ6IGFueSwgYXR0cmlidXRlczogYW55KSB7XG5cdGZvciAobGV0IGtleSBpbiBhdHRyaWJ1dGVzKSB7XG5cdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuXHR9XG59XG5cblxuZXhwb3J0IGNsYXNzIFNlbGVjdFJ1bGVFZGl0TW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG5cdHRyaWdnZXI6IHN0cmluZztcblx0b2xkX2xlZnQ6IHN0cmluZztcblx0b2xkX3JpZ2h0OiBzdHJpbmc7XG5cdG5ld19sZWZ0OiBzdHJpbmc7XG5cdG5ld19yaWdodDogc3RyaW5nO1xuXHRvblN1Ym1pdDogKG5ld19sZWZ0OiBzdHJpbmcsIG5ld19yaWdodDpzdHJpbmcpID0+IHZvaWQ7XG5cblx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIHRyaWdnZXI6IHN0cmluZywgbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nLCBvblN1Ym1pdDogKG5ld19sZWZ0OiBzdHJpbmcsIG5ld19yaWdodDpzdHJpbmcpID0+IHZvaWQpIHtcblx0XHRzdXBlcihhcHApO1xuXHRcdHRoaXMudHJpZ2dlciA9IHRyaWdnZXI7XG5cdFx0dGhpcy5vbGRfbGVmdCA9IGxlZnQ7XG5cdFx0dGhpcy5vbGRfcmlnaHQgPSByaWdodDtcblx0XHR0aGlzLm5ld19sZWZ0ID0gbGVmdDtcblx0XHR0aGlzLm5ld19yaWdodCA9IHJpZ2h0O1xuXG5cdFx0dGhpcy5vblN1Ym1pdCA9IG9uU3VibWl0O1xuXHR9XG5cblx0b25PcGVuKCkge1xuXHRcdGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXG5cdFx0Y29udGVudEVsLmNyZWF0ZUVsKFwiaDFcIiwgeyB0ZXh0OiBsb2NhbGUuaGVhZGVycy5lZGl0U2VsZWN0aW9uUmVwbGFjZVJ1bGUgfSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MudHJpZ2dlci5uYW1lKVxuXHRcdFx0LmFkZFRleHQoKHRleHQpID0+IHtcblx0XHRcdFx0dGV4dC5zZXRWYWx1ZSh0aGlzLnRyaWdnZXIpO1xuXHRcdFx0XHR0ZXh0LnNldERpc2FibGVkKHRydWUpO1xuXHRcdFx0fSlcblx0XHRcblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuc2V0TmFtZShsb2NhbGUuc2V0dGluZ3MubGVmdC5uYW1lKVxuXHRcdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PiB7XG5cdFx0XHRcdHRleHQuc2V0VmFsdWUodGhpcy5vbGRfbGVmdCk7XG5cdFx0XHRcdHRleHQub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5uZXdfbGVmdCA9IHZhbHVlXG5cdFx0XHRcdH0pXG5cdFx0XHR9KVxuXHRcdG5ldyBTZXR0aW5nKGNvbnRlbnRFbClcblx0XHRcdC5zZXROYW1lKGxvY2FsZS5zZXR0aW5ncy5yaWdodC5uYW1lKVxuXHRcdFx0LmFkZFRleHRBcmVhKCh0ZXh0KSA9PiB7XG5cdFx0XHRcdHRleHQuc2V0VmFsdWUodGhpcy5vbGRfcmlnaHQpO1xuXHRcdFx0XHR0ZXh0Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubmV3X3JpZ2h0ID0gdmFsdWVcblx0XHRcdFx0fSlcblx0XHRcdH0pO1xuXG5cblx0XHRuZXcgU2V0dGluZyhjb250ZW50RWwpXG5cdFx0XHQuYWRkQnV0dG9uKChidG4pID0+XG5cdFx0XHRcdGJ0blxuXHRcdFx0XHRcdC5zZXRCdXR0b25UZXh0KGxvY2FsZS5idXR0b24udXBkYXRlKVxuXHRcdFx0XHRcdC5zZXRDdGEoKVxuXHRcdFx0XHRcdC5vbkNsaWNrKCgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHRoaXMub25TdWJtaXQodGhpcy5uZXdfbGVmdCwgdGhpcy5uZXdfcmlnaHQpO1xuXHRcdFx0XHRcdH0pKTtcblx0fVxuXG5cdG9uQ2xvc2UoKSB7XG5cdFx0bGV0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xuXHR9XG59XG5cblxuXG5leHBvcnQgY2xhc3MgRWRpdENvbnZlcnRSdWxlTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG5cdHR5cGU6IFJ1bGVUeXBlO1xuXHRvbGRfYmVmb3JlOiBzdHJpbmc7XG5cdG9sZF9hZnRlcjogc3RyaW5nO1xuXHRuZXdfYmVmb3JlOiBzdHJpbmc7XG5cdG5ld19hZnRlcjogc3RyaW5nO1xuXHRvblN1Ym1pdDogKG5ld19iZWZvcmU6IHN0cmluZywgbmV3X2FmdGVyOnN0cmluZykgPT4gdm9pZDtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgdHlwZTogUnVsZVR5cGUsIGJlZm9yZTogc3RyaW5nLCBhZnRlcjogc3RyaW5nLCBvblN1Ym1pdDogKG5ld19iZWZvcmU6IHN0cmluZywgbmV3X2FmdGVyOnN0cmluZykgPT4gdm9pZCkge1xuXHRcdHN1cGVyKGFwcCk7XG5cdFx0dGhpcy50eXBlID0gdHlwZTtcblx0XHR0aGlzLm9sZF9iZWZvcmUgPSBiZWZvcmU7XG5cdFx0dGhpcy5vbGRfYWZ0ZXIgPSBhZnRlcjtcblx0XHR0aGlzLm5ld19iZWZvcmUgPSBiZWZvcmU7XG5cdFx0dGhpcy5uZXdfYWZ0ZXIgPSBhZnRlcjtcblxuXHRcdHRoaXMub25TdWJtaXQgPSBvblN1Ym1pdDtcblx0fVxuXG5cdG9uT3BlbigpIHtcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblxuXHRcdGNvbnRlbnRFbC5jcmVhdGVFbChcImgxXCIsIHsgdGV4dDogXCJFZGl0IFwiICsgdGhpcy50eXBlfSk7XG5cdFx0XG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLm9sZFBhdHRlcm4ubmFtZSlcblx0XHRcdC5hZGRUZXh0QXJlYSgodGV4dCkgPT4ge1xuXHRcdFx0XHR0ZXh0LnNldFZhbHVlKHRoaXMub2xkX2JlZm9yZSk7XG5cdFx0XHRcdHRleHQub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5uZXdfYmVmb3JlID0gdmFsdWVcblx0XHRcdFx0fSlcblx0XHRcdH0pXG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LnNldE5hbWUobG9jYWxlLnNldHRpbmdzLm5ld1BhdHRlcm4ubmFtZSlcblx0XHRcdC5hZGRUZXh0QXJlYSgodGV4dCkgPT4ge1xuXHRcdFx0XHR0ZXh0LnNldFZhbHVlKHRoaXMub2xkX2FmdGVyKTtcblx0XHRcdFx0dGV4dC5vbkNoYW5nZSgodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLm5ld19hZnRlciA9IHZhbHVlXG5cdFx0XHRcdH0pXG5cdFx0XHR9KTtcblxuXG5cdFx0bmV3IFNldHRpbmcoY29udGVudEVsKVxuXHRcdFx0LmFkZEJ1dHRvbigoYnRuKSA9PlxuXHRcdFx0XHRidG5cblx0XHRcdFx0XHQuc2V0QnV0dG9uVGV4dChsb2NhbGUuYnV0dG9uLnVwZGF0ZSlcblx0XHRcdFx0XHQuc2V0Q3RhKClcblx0XHRcdFx0XHQub25DbGljaygoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5jaGVja0NvbnZlcnRQYXR0ZXJuU3RyaW5nKHRoaXMubmV3X2JlZm9yZSwgdGhpcy5uZXdfYWZ0ZXIpKVxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMub25TdWJtaXQodGhpcy5uZXdfYmVmb3JlLCB0aGlzLm5ld19hZnRlcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNle1xuXHRcdFx0XHRcdFx0XHRuZXcgTm90aWNlKGxvY2FsZS5wbGFjZUhvbGRlci5ub3RpY2VJbnZhbGlkUGF0dGVyblN0cmluZyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHR9KSk7XG5cdH1cblxuXHRjaGVja0NvbnZlcnRQYXR0ZXJuU3RyaW5nKGJlZm9yZTogc3RyaW5nLCBhZnRlcjpzdHJpbmcpOmJvb2xlYW57XG5cdFx0aWYoZmluZEZpcnN0UGlwZU5vdFByZWNlZGVkQnlCYWNrc2xhc2goYmVmb3JlKT09LTEpIHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdG9uQ2xvc2UoKSB7XG5cdFx0bGV0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xuXHR9XG59XG5cbiIsICJjb25zdCBsb2NhbGUgPSB7XG4gICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc3ltYm9sQXV0b1BhaXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3ltYm9sIGF1dG8gcGFpciBhbmQgZGVsZXRlIHdpdGggcGFpclwiLFxuICAgICAgICAgICAgZGVzYzogXCJBZGQgYXV0by1wYWlyaW5nIGFuZCBhdXRvLWRlbGV0aW9uIGZvciB2YXJpb3VzIHN5bWJvbHMgc3VjaCBhcyBcdTMwMEFcdTMwMEIsIFx1MjAxQ1x1MjAxRCwgXHUzMDBDXHUzMDBELCBcdTMwMEVcdTMwMEYsIFx1MzAxMFx1MzAxMSwgZXRjLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvblJlcGxhY2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU2VsZWN0aW9uIFJlcGxhY2UgRW5oYW5jZW1lbnRcIixcbiAgICAgICAgICAgIGRlc2M6IFwiRW5oYW5jZWQgZWRpdGluZyBmb3Igc2VsZWN0ZWQgdGV4dCwgZS5nLiwgcHJlc3NpbmcgXHVGRkU1IFx1MjE5MiAkc2VsZWN0ZWQgdGV4dCQsIHByZXNzaW5nIFx1MDBCNyBcdTIxOTIgYHNlbGVjdGVkIHRleHRgLCBcdTMwMEEgXHUyMTkyIFx1MzAwQXNlbGVjdGVkIHRleHRcdTMwMEIsIGV0Yy5cIlxuICAgICAgICB9LFxuICAgICAgICBmdWxsV2lkdGhUb0hhbGZXaWR0aDoge1xuICAgICAgICAgICAgbmFtZTogXCJDb252ZXJ0IHN1Y2Nlc3NpdmUgZnVsbCB3aWR0aCBzeW1ib2wgdG8gaGFsZiB3aWR0aCBzeW1ib2xcIixcbiAgICAgICAgICAgIGRlc2M6IFwiQ29udmVydCBjb25zZWN1dGl2ZSBmdWxsLXdpZHRoIHN5bWJvbHMgdG8gaGFsZi13aWR0aCwgZS5nLiwgXHUzMDAyXHUzMDAyXHUyMTkyIC4sIFx1RkYwMVx1RkYwMVx1MjE5MiAhLCBcdTMwMEJcdTMwMEJcdTIxOTIgPlwiXG4gICAgICAgIH0sXG4gICAgICAgIGJhc2ljSW5wdXRFbmhhbmNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJhc2ljIHN5bWJvbCBpbnB1dCBlbmhhbmNlIGZvciBPYnNpZGlhblwiLFxuICAgICAgICAgICAgZGVzYzogXCJCYXNpYyBpbnB1dCBlbmhhbmNlbWVudCBmb3IgT2JzaWRpYW4sIGUuZy4sIFx1MzAxMFx1MzAxMHwgXHUyMTkyIFtbfF1dLCBzdGFydGluZyB3aXRoIFx1MzAwMVx1MjE5MiAvLCBzdGFydGluZyB3aXRoIFx1MzAwQlx1MjE5MiA+LCBcdTAwQjdcdTAwQjd8IFx1MjE5MiBgfGAsIGBcdTAwQjd8YCBiZWNvbWVzIGNvZGUgYmxvY2ssIFx1RkZFNVx1RkZFNXwgXHUyMTkyICR8JFwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVibG9ja0VkaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW5oYW5jZSBjb2RlYmxvY2sgZWRpdFwiLFxuICAgICAgICAgICAgZGVzYzogXCJJbXByb3ZlIGVkaXRpbmcgaW4gY29kZWJsb2NrcyAoVGFiLCBkZWxldGUsIHBhc3RlLCBDbWQvQ3RybCtBIHNlbGVjdCkuXCJcbiAgICAgICAgfSxcbiAgICAgICAgdGFiT3V0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlRhYm91dFwiLFxuICAgICAgICAgICAgZGVzYzogXCJUYWIgb3V0IG9mIGlubGluZSBjb2RlIG9yIHBhaXJlZCBzeW1ib2xzICh3aGVuIHNlbGVjdGVkKS5cIlxuICAgICAgICB9LFxuICAgICAgICBhdXRvRm9ybWF0dGluZzoge1xuICAgICAgICAgICAgbmFtZTogXCJBdXRvIGZvcm1hdHRpbmcgd2hlbiB0eXBpbmdcIixcbiAgICAgICAgICAgIGRlc2M6IFwiVG9nZ2xlIGF1dG8tZm9ybWF0dGluZyBvZiB0ZXh0IHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50LlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkNoaW5lc2VFbmdsaXNoOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlNwYWNlIGJldHdlZW4gQ2hpbmVzZSBhbmQgRW5nbGlzaFwiLFxuICAgICAgICAgICAgZGVzYzogXCJJbnNlcnQgc3BhY2UgYmV0d2VlbiBDaGluZXNlIGFuZCBFbmdsaXNoIGNoYXJhY3RlcnMuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VCZXR3ZWVuQ2hpbmVzZU51bWJlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJTcGFjZSBiZXR3ZWVuIENoaW5lc2UgYW5kIE51bWJlclwiLFxuICAgICAgICAgICAgZGVzYzogXCJJbnNlcnQgc3BhY2UgYmV0d2VlbiBDaGluZXNlIGNoYXJhY3RlcnMgYW5kIG51bWJlcnMuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VCZXR3ZWVuRW5nbGlzaE51bWJlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJTcGFjZSBiZXR3ZWVuIEVuZ2xpc2ggYW5kIE51bWJlclwiLFxuICAgICAgICAgICAgZGVzYzogXCJJbnNlcnQgc3BhY2UgYmV0d2VlbiBFbmdsaXNoIGNoYXJhY3RlcnMgYW5kIG51bWJlcnMuXCJcbiAgICAgICAgfSxcbiAgICAgICAgZGVsZXRlU3BhY2VCZXR3ZWVuQ2hpbmVzZToge1xuICAgICAgICAgICAgbmFtZTogXCJEZWxldGUgdGhlIFNwYWNlIGJldHdlZW4gQ2hpbmVzZSBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlJlbW92ZSBzcGFjZXMgYmV0d2VlbiBDaGluZXNlIGNoYXJhY3RlcnMuXCJcbiAgICAgICAgfSxcbiAgICAgICAgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiBldmVyeSBzZW50ZW5jZVwiLFxuICAgICAgICAgICAgZGVzYzogXCJDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCBzZW50ZW5jZSBpbiBFbmdsaXNoLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNtYXJ0SW5zZXJ0U3BhY2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU21hcnRseSBpbnNlcnQgc3BhY2UgYmV0d2VlbiB0ZXh0IGFuZCBwdW5jdHVhdGlvblwiLFxuICAgICAgICAgICAgZGVzYzogXCJJbnNlcnQgc3BhY2UgYmV0d2VlbiB0ZXh0IGFuZCBwdW5jdHVhdGlvbiBpbnRlbGxpZ2VudGx5LlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlU3RyYXRlZ3lJbmxpbmVDb2RlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlNwYWNlIHN0cmF0ZWd5IGJldHdlZW4gaW5saW5lIGNvZGUgYW5kIHRleHRcIixcbiAgICAgICAgICAgIGRlc2M6IFwiTm8gcmVxdWlyZW1lbnQ6IE5vIHNwYWNlIHJlcXVpcmVtZW50IGJldHdlZW4gdGhpcyBjYXRlZ29yeSBibG9jayBhbmQgdGhlIHN1cnJvdW5kaW5nIHRleHQuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcIlNvZnQgc3BhY2U6IE9ubHkgcmVxdWlyZXMgYSBzb2Z0IHNwYWNlIGJldHdlZW4gdGhpcyBjYXRlZ29yeSBibG9jayBhbmQgdGhlIHN1cnJvdW5kaW5nIGJsb2Nrcy4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiU29mdCBzcGFjZSBleGFtcGxlOiBJZiB0aGUgYWRqYWNlbnQgdGV4dCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBjdXJyZW50IGJsb2NrIGlzIGZ1bGwtd2lkdGggcHVuY3R1YXRpb24gbGlrZSAuICwgOyA/IGV0Yy4sIGFuZCB0aGUgYWRqYWNlbnQgdGV4dCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgY3VycmVudCBibG9jayBpcyBhbGwgZnVsbC13aWR0aCBvciBoYWxmLXdpZHRoIHB1bmN0dWF0aW9uLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgXCJTdHJpY3Qgc3BhY2U6IFN0cmljdGx5IGFkZCBzcGFjZXMgYmV0d2VlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIGFkamFjZW50IHRleHQuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VTdHJhdGVneUlubGluZUZvcm11bGE6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3BhY2Ugc3RyYXRlZ3kgYmV0d2VlbiBpbmxpbmUgZm9ybXVsYSBhbmQgdGV4dFwiLFxuICAgICAgICAgICAgZGVzYzogXCJEZWZpbmUgdGhlIHNwYWNpbmcgc3RyYXRlZ3kgYmV0d2VlbiBpbmxpbmUgZm9ybXVsYXMgYW5kIHRleHQuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VTdHJhdGVneUxpbmtUZXh0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlNwYWNlIHN0cmF0ZWd5IGJldHdlZW4gbGluayBhbmQgdGV4dFwiLFxuICAgICAgICAgICAgZGVzYzogXCJEZWZpbmUgdGhlIHNwYWNpbmcgc3RyYXRlZ3kgYmV0d2VlbiBbW3dpa2lsaW5rXV0gW21kbGlua10oLi4uKSBhbmQgdGV4dC5cIlxuICAgICAgICB9LFxuICAgICAgICB1c2VyRGVmaW5lZFJlZ2V4cFN3aXRjaDoge1xuICAgICAgICAgICAgbmFtZTogXCJVc2VyIERlZmluZWQgUmVnRXhwIFN3aXRjaFwiLFxuICAgICAgICAgICAgZGVzYzogXCJUb2dnbGUgY3VzdG9tIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHByZXZlbnRpbmcgZm9ybWF0dGluZyBhbmQgc2V0dGluZyBzcGFjZSBzdHJhdGVneSBiZXR3ZWVuIG1hdGNoZWQgY29udGVudCBhbmQgb3RoZXIgdGV4dC5cIlxuICAgICAgICB9LFxuICAgICAgICB1c2VyRGVmaW5lZFJlZ2V4cDoge1xuICAgICAgICAgICAgbmFtZTogXCJVc2VyLWRlZmluZWQgUmVndWxhciBFeHByZXNzaW9uLCBvbmUgZXhwcmVzc2lvbiBwZXIgbGluZVwiLFxuICAgICAgICAgICAgZGVzYzogXCJVc2VyLWRlZmluZWQgcmVndWxhciBleHByZXNzaW9uLCBtYXRjaGVkIHRvIHRoZSBjb250ZW50IGlzIG5vdCBmb3JtYXR0ZWQsIG9uZSBleHByZXNzaW9uIHBlciBsaW5lLCBkbyBub3QgZmVlbCBmcmVlIHRvIGFkZCBzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS5cIitcbiAgICAgICAgICAgICAgICBcIlRoZSBlbmQgb2YgZWFjaCBsaW5lIG9mIHRocmVlIGNoYXJhY3RlcnMgZml4ZWQgYXMgfCBhbmQgdHdvIHNwYWNlIHN0cmF0ZWd5IHN5bWJvbHMsIHNwYWNlIHN0cmF0ZWd5IHN5bWJvbHMgZm9yIC0gPSArLCByZXNwZWN0aXZlbHksIG9uIGJlaGFsZiBvZiBub3QgcmVxdWlyaW5nIHNwYWNlcyAoLSksIHNvZnQgc3BhY2VzICg9KSwgc3RyaWN0IHNwYWNlcyAoKykuXCIrXG4gICAgICAgICAgICAgICAgXCJUaGVzZSB0d28gc3BhY2Ugc3RyYXRlZ3kgc3ltYm9scyBhcmUgdGhlIHNwYWNlIHN0cmF0ZWd5IGZvciB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgb2YgdGhlIG1hdGNoaW5nIGJsb2NrIHJlc3BlY3RpdmVseVwiXG4gICAgICAgIH0sXG4gICAgICAgIGV4Y2x1ZGVGb2xkZXJzRmlsZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRXhjbHVkZSBGb2xkZXJzL0ZpbGVzXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlRoaXMgcGx1Z2luIHdpbGwgcGFyc2UgZWFjaCBsaW5lIGFzIGFuIGV4Y2x1ZGUgZm9sZGVyIG9yIGZpbGUuIEZvciBleGFtcGxlOiBEYWlseU5vdGUvLCBEYWlseU5vdGUvV2Vla05vdGVzLywgRGFpbHlOb3RlL3Rlc3QubWRcIlxuICAgICAgICB9LFxuICAgICAgICBmaXhNYWNPU0NvbnRleHRNZW51OiB7XG4gICAgICAgICAgICBuYW1lOiBcIkZpeCBNYWNPUyBjb250ZXh0LW1lbnUgY3Vyc29yIHBvc2l0aW9uIChOZWVkIHRvIHJlc3RhcnQgT2JzaWRpYW4pXCIsXG4gICAgICAgICAgICBkZXNjOiBcIkZpeCB0aGUgaXNzdWUgd2hlcmUgdGhlIGN1cnNvciBqdW1wcyB0byB0aGUgbmV4dCBsaW5lIHdoZW4gdGhlIGNvbnRleHQgbWVudSBpcyBpbnZva2VkIG9uIE1hY09TIChyZXF1aXJlcyByZXN0YXJ0aW5nIE9ic2lkaWFuKS5cIlxuICAgICAgICB9LFxuICAgICAgICBmaXhNaWNyb3NvZnRJTUU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRml4IE1pY3Jvc29mdCBJbnB1dCBNZXRob2QgSXNzdWVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiQWRhcHQgZm9yIG9sZGVyIHZlcnNpb25zIG9mIE1pY3Jvc29mdCBJbnB1dCBNZXRob2QuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3RyaWN0TGluZUJyZWFrczoge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpY3QgTGluZSBicmVha3MgTW9kZSBFbnRlciBUd2ljZVwiLFxuICAgICAgICAgICAgZGVzYzogXCJJbiBzdHJpY3QgbGluZSBicmVha3MgbW9kZSwgcHJlc3NpbmcgRW50ZXIgb25jZSBpbiBub3JtYWwgdGV4dCBsaW5lcyB3aWxsIHByb2R1Y2UgdHdvIGxpbmUgYnJlYWtzLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHB1bmNSZWN0aWZ5OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlB1bmMgcmVjdGlmeVwiLFxuICAgICAgICAgICAgZGVzYzogXCJBdXRvbWF0aWNhbGx5IGNvbnZlcnQgRW5nbGlzaCBwdW5jdHVhdGlvbiAoLCAuID8gISkgYmV0d2VlbiBDaGluZXNlIGNoYXJhY3RlcnMgdG8gZnVsbC13aWR0aCBwdW5jdHVhdGlvbiBkdXJpbmcgdHlwaW5nIChyZXZlcnNpYmxlKS5cIlxuICAgICAgICB9LFxuICAgICAgICBwcmludERlYnVnSW5mbzoge1xuICAgICAgICAgICAgbmFtZTogXCJQcmludCBkZWJ1ZyBpbmZvIGluIGNvbnNvbGVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiUHJpbnQgZGVidWcgaW5mb3JtYXRpb24gaW4gdGhlIGNvbnNvbGUuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uUmVwbGFjZVJ1bGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU2VsZWN0aW9uIFJlcGxhY2UgUnVsZVwiLFxuICAgICAgICAgICAgZGVzYzogXCJVc2VyIGRlZmluZWQgU2VsZWN0aW9uIFJlcGxhY2UgUnVsZVwiXG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVJ1bGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGVsZXRlIFJ1bGVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiUnVsZTogVXNlIHwgdG8gaW5kaWNhdGUgdGhlIGN1cnNvciBwb3NpdGlvbi4gVGlwczogVXNpbmcgfCB0byBpbmRpY2F0ZSB0aGUgY3Vyc29yIHBvc2l0aW9uLlwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnZlcnRSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkNvbnZlcnQgUnVsZVwiLFxuICAgICAgICAgICAgZGVzYzogXCJSdWxlOiBVc2UgfCB0byBpbmRpY2F0ZSB0aGUgY3Vyc29yIHBvc2l0aW9uLiBUaXBzOiBVc2luZyB8IHRvIGluZGljYXRlIHRoZSBjdXJzb3IgcG9zaXRpb24uXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHJpZ2dlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJUcmlnZ2VyXCJcbiAgICAgICAgfSxcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgICAgbmFtZTogXCJMZWZ0XCJcbiAgICAgICAgfSxcbiAgICAgICAgcmlnaHQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiUmlnaHRcIlxuICAgICAgICB9LFxuICAgICAgICBvbGRQYXR0ZXJuOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk9sZCBQYXR0ZXJuXCJcbiAgICAgICAgfSxcbiAgICAgICAgbmV3UGF0dGVybjoge1xuICAgICAgICAgICAgbmFtZTogXCJOZXcgUGF0dGVyblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgbWFpbjogXCJPYnNpZGlhbiBFYXN5VHlwaW5nIFBsdWdpblwiLFxuICAgICAgICBnaXRodWJEZXRhaWw6IFwiTW9yZSBkZXRhaWwgaXMgaW4gR2l0aHViOiBcIixcbiAgICAgICAgZW5oYW5jZWRFZGl0aW5nOiBcIkVuaGFuY2VkIEVkaXRpbmcgU2V0dGluZ1wiLFxuICAgICAgICBjdXN0b21pemVFZGl0UnVsZTogXCJDdXN0b21pemUgRWRpdCBDb252ZXJ0aW9uIFJ1bGVcIixcbiAgICAgICAgYXV0b2Zvcm1hdFNldHRpbmc6IFwiQXV0b2Zvcm1hdCBTZXR0aW5nXCIsXG4gICAgICAgIGRldGFpbGVkU2V0dGluZzogXCJEZXRhaWxlZCBTZXR0aW5nIEJlbG93XCIsXG4gICAgICAgIGN1c3RvbVJlZ2V4cEJsb2NrOiBcIkN1c3RvbSByZWd1bGFyIGV4cHJlc3Npb25zIGJsb2NrXCIsXG4gICAgICAgIGV4Y2x1ZGVGb2xkZXJzRmlsZXM6IFwiRXhjbHVkZSBGb2xkZXJzL0ZpbGVzXCIsXG4gICAgICAgIGV4cGVyaW1lbnRhbEZlYXR1cmVzOiBcIkV4cGVyaW1lbnRhbCBGZWF0dXJlc1wiLFxuICAgICAgICBhYm91dFJlZ2V4cDoge1xuICAgICAgICAgICAgaGVhZGVyOiBcIkZvciBrbm93bGVkZ2UgYWJvdXQgcmVndWxhciBleHByZXNzaW9ucywgc2VlIFwiLFxuICAgICAgICAgICAgdGV4dDogXCJZaWZlbmcgTmd1eWVuOiBBIENvbmNpc2UgVHV0b3JpYWwgb24gUmVndWxhciBFeHByZXNzaW9uc1wiLFxuICAgICAgICB9LFxuICAgICAgICBpbnN0cnVjdGlvbnNSZWdleHA6IHtcbiAgICAgICAgICAgIGhlYWRlcjogXCJJbnN0cnVjdGlvbnMgYW5kIGV4YW1wbGVzIGZvciB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24gcnVsZXM6IFwiLFxuICAgICAgICAgICAgdGV4dDpcIkN1c3RvbWl6aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbiBSdWxlc1wiLFxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21pemVTZWxlY3Rpb25SdWxlOiBcIkN1c3RvbWl6ZSBTZWxlY3Rpb24gUmVwbGFjZSBSdWxlXCIsXG4gICAgICAgIGN1c3RvbWl6ZURlbGV0ZVJ1bGU6IFwiQ3VzdG9taXplIERlbGV0ZSBSdWxlXCIsXG4gICAgICAgIGN1c3RvbWl6ZUNvbnZlcnRSdWxlOiBcIkN1c3RvbWl6ZSBDb252ZXJ0IFJ1bGVcIixcbiAgICAgICAgZWRpdFNlbGVjdGlvblJlcGxhY2VSdWxlOiBcIkVkaXQgU2VsZWN0aW9uIFJlcGxhY2UgUnVsZVwiLFxuICAgIH0sXG4gICAgZHJvcGRvd25PcHRpb25zOiB7XG4gICAgICAgIG9ubHlXaGVuVHlwaW5nOiBcIk9ubHkgV2hlbiBUeXBpbmdcIixcbiAgICAgICAgZ2xvYmFsbHk6IFwiV29yayBHbG9iYWxseVwiLFxuICAgICAgICBub1JlcXVpcmU6IFwiTm8gUmVxdWlyZVwiLFxuICAgICAgICBzb2Z0U3BhY2U6IFwiU29mdCBTcGFjZVwiLFxuICAgICAgICBzdHJpY3RTcGFjZTogXCJTdHJpY3QgU3BhY2VcIixcbiAgICAgICAgZHVtbXk6IFwiRHVtbXlcIixcbiAgICAgICAgc21hcnQ6IFwiU21hcnRcIlxuICAgIH0sXG4gICAgdG9vbFRpcDoge1xuICAgICAgICBzd2l0Y2g6IFwiU3dpdGNoXCIsXG4gICAgICAgIGVkaXRSdWxlOiBcIkVkaXQgcnVsZVwiLFxuICAgICAgICByZW1vdmVSdWxlOiBcIlJlbW92ZSBydWxlXCIsXG4gICAgICAgIGFkZFJ1bGU6IFwiQWRkIFJ1bGVcIixcbiAgICB9LFxuICAgIHBsYWNlSG9sZGVyOiB7XG4gICAgICAgIHRyaWdnZXJTeW1ib2w6IFwiVHJpZ2dlciBTeW1ib2xcIixcbiAgICAgICAgbmV3TGVmdFNpZGVTdHJpbmc6IFwiTmV3IExlZnQgU2lkZSBTdHJpbmdcIixcbiAgICAgICAgbmV3UmlnaHRTaWRlU3RyaW5nOiBcIk5ldyBSaWdodCBTaWRlIFN0cmluZ1wiLFxuICAgICAgICBhZGRSdWxlOiBcIkFkZCBSdWxlXCIsXG4gICAgICAgIG5vdGljZUludmFpZFRyaWdnZXI6IFwiSW5sdmFsaWQgdHJpZ2dlciwgdHJpZ2dlciBtdXN0IGJlIGEgc3ltYm9sIG9mIGxlbmd0aCAxIG9yIHN5bWJvbCBcdTIwMTRcdTIwMTQsIFx1MjAyNlx1MjAyNlwiLFxuICAgICAgICBub3RpY2VXYXJuVHJpZ2dlckV4aXN0czogXCJ3YXJuaW5nISBUcmlnZ2VyICVzIGlzIGFscmVhZHkgZXhpc3QhXCIsXG4gICAgICAgIG5vdGljZU1pc3NpbmdJbnB1dDogXCJtaXNzaW5nIGlucHV0XCIsXG4gICAgICAgIGJlZm9yZURlbGV0ZTogXCJCZWZvcmUgRGVsZXRlXCIsXG5cdFx0bmV3UGF0dGVybjogXCJOZXcgUGF0dGVyblwiLFxuICAgICAgICBub3RpY2VJbnZhaWRUcmlnZ2VyUGF0dGVybkNvbnRhaW5TeW1ib2w6IFwiSW5sdmFsaWQgdHJpZ2dlciwgcGF0dGVybiBtdXN0IGNvbnRhaW4gc3ltYm9sIFxcfCB3aGljaCBpbmRpY2F0ZSBjdXJzb3IgcG9zaXRpb25cIixcbiAgICAgICAgYmVmb3JlQ29udmVydDogXCJCZWZvcmUgQ29udmVydFwiLFxuICAgICAgICBub3RpY2VJbnZhbGlkUGF0dGVyblN0cmluZzpcIkludmFsaWQgcGF0dGVybiBzdHJpbmchXCIsXG4gICAgfSxcbiAgICBidXR0b246IHtcbiAgICAgICAgdXBkYXRlOiBcIlVwZGF0ZVwiLFxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvY2FsZTtcbiIsICJpbXBvcnQgeyBlblVTIH0gZnJvbSBcIi5cIjtcblxuY29uc3QgbG9jYWxlOiB0eXBlb2YgZW5VUyA9IHtcbiAgICBzZXR0aW5nczoge1xuICAgICAgICBzeW1ib2xBdXRvUGFpcjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTdCMjZcdTUzRjdcdTgxRUFcdTUyQThcdTkxNERcdTVCRjlcdTUzQ0FcdTUyMjBcdTk2NjRcdTkxNERcdTVCRjlcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1ODlFXHU1MkEwXHU1OTFBXHU3OUNEXHU3QjI2XHU1M0Y3XHU5MTREXHU1QkY5XHU4RjkzXHU1MTY1XHVGRjBDXHU5MTREXHU1QkY5XHU1MjIwXHU5NjY0XHVGRjBDXHU1OTgyXHUzMDBBXHUzMDBCLCBcdTIwMUNcdTIwMUQsIFx1MzAwQ1x1MzAwRCwgXHUzMDBFXHUzMDBGLCBcdTMwMTBcdTMwMTFcdTdCNDlcIlxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25SZXBsYWNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OTAwOVx1NEUyRFx1NjU4N1x1NjcyQ1x1NjZGRlx1NjM2Mlx1NTg5RVx1NUYzQVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTkwMDlcdTRFMkRcdTY1ODdcdTY3MkNcdTYwQzVcdTUxQjVcdTRFMEJcdTc2ODRcdTdGMTZcdThGOTFcdTU4OUVcdTVGM0FcdUZGMENcdTYzMDlcdUZGRTVcdTIxOTIkXHU5MDA5XHU0RTJEXHU3Njg0XHU2NTg3XHU2NzJDJCwgXHU2MzA5XHUwMEI3XHUyMTkyYFx1OTAwOVx1NEUyRFx1NzY4NFx1NjU4N1x1NjcyQ2BcdUZGMENcdTMwMEEgXHUyMTkyIFx1MzAwQVx1OTAwOVx1NEUyRFx1NzY4NFx1NjU4N1x1NjcyQ1x1MzAwQlx1N0I0OVx1N0I0OVwiXG4gICAgICAgIH0sXG4gICAgICAgIGZ1bGxXaWR0aFRvSGFsZldpZHRoOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OEZERVx1N0VFRFx1OEY5M1x1NTE2NVx1NTE2OFx1ODlEMlx1N0IyNlx1NTNGN1x1OEY2Q1x1NTM0QVx1ODlEMlx1N0IyNlx1NTNGN1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdThGREVcdTdFRURcdThGOTNcdTUxNjVcdTUxNjhcdTg5RDJcdTdCMjZcdTUzRjdcdThGNkNcdTUzNEFcdTg5RDJcdUZGMENcdTMwMDJcdTMwMDJcdTIxOTIgLlx1RkYwQ1x1RkYwMVx1RkYwMVx1MjE5MiAhXHVGRjBDIFx1MzAwQlx1MzAwQlx1MjE5MiA+XCJcbiAgICAgICAgfSxcbiAgICAgICAgYmFzaWNJbnB1dEVuaGFuY2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiT2JzaWRpYW4gXHU3Njg0XHU1N0ZBXHU3ODQwXHU3QjI2XHU1M0Y3XHU4RjkzXHU1MTY1XHU1ODlFXHU1RjNBXCIsXG4gICAgICAgICAgICBkZXNjOiBcIk9ic2lkaWFuIFx1NzY4NFx1NTdGQVx1Nzg0MFx1OEY5M1x1NTE2NVx1NTg5RVx1NUYzQVx1RkYwQ1x1NTk4Mlx1MzAxMFx1MzAxMHwgXHUyMTkyIFtbfF1dXHVGRjBDXHU1M0U1XHU5OTk2XHU3Njg0XHUzMDAxXHUyMTkyIC9cdUZGMENcdTUzRTVcdTk5OTZcdTc2ODRcdTMwMEJcdTIxOTIgPlx1RkYwQ1x1MDBCN1x1MDBCN3wgXHUyMTkyIGB8YFx1RkYwQyBgXHUwMEI3fGAgXHU1M0Q4XHU2MjEwXHU0RUUzXHU3ODAxXHU1NzU3XHVGRjBDXHVGRkU1XHVGRkU1fCBcdTIxOTIgJHwkXCJcbiAgICAgICAgfSxcbiAgICAgICAgY29kZWJsb2NrRWRpdDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTU4OUVcdTVGM0FcdTRFRTNcdTc4MDFcdTU3NTdcdTdGMTZcdThGOTFcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1ODlFXHU1RjNBXHU0RUUzXHU3ODAxXHU1NzU3XHU1MTg1XHU3Njg0XHU3RjE2XHU4RjkxXHVGRjA4Q21kL0N0cmwrQSBcdTkwMDlcdTRFMkRcdTMwMDFUYWJcdTMwMDFcdTUyMjBcdTk2NjRcdTMwMDFcdTdDOThcdThEMzRcdUZGMDlcIlxuICAgICAgICB9LFxuICAgICAgICB0YWJPdXQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU4REYzXHU1MUZBXHU0RUUzXHU3ODAxXHU1NzU3XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlRhYiBcdThERjNcdTUxRkFcdTg4NENcdTUxODVcdTRFRTNcdTc4MDFcdTU3NTdcdTYyMTZcdTkxNERcdTVCRjlcdTdCMjZcdTUzRjdcdTU3NTcoXHU5MDA5XHU0RTJEXHU2NUY2KVwiXG4gICAgICAgIH0sXG4gICAgICAgIGF1dG9Gb3JtYXR0aW5nOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OEY5M1x1NTE2NVx1NjVGNlx1ODFFQVx1NTJBOFx1NjgzQ1x1NUYwRlx1NTMxNlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTY2MkZcdTU0MjZcdTU3MjhcdTdGMTZcdThGOTFcdTY1ODdcdTY4NjNcdTY1RjZcdTgxRUFcdTUyQThcdTY4M0NcdTVGMEZcdTUzMTZcdTY1ODdcdTY3MkNcdUZGMENcdTgxRUFcdTUyQThcdTY4M0NcdTVGMEZcdTUzMTZcdTc2ODRcdTYwM0JcdTVGMDBcdTUxNzNcIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZUJldHdlZW5DaGluZXNlRW5nbGlzaDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTRFMkRcdTY1ODdcdTRFMEVcdTgyRjFcdTY1ODdcdTRFNEJcdTk1RjRcdTc2ODRcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1NzI4XHU0RTJEXHU2NTg3XHU1NDhDXHU4MkYxXHU2NTg3XHU0RTRCXHU5NUY0XHU2M0QyXHU1MTY1XHU3QTdBXHU2ODNDXHVGRjBDXHU1M0VGXHU2NEE0XHU5NTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VCZXR3ZWVuQ2hpbmVzZU51bWJlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTRFMkRcdTY1ODdcdTRFMEVcdTY1NzBcdTVCNTdcdTRFNEJcdTk1RjRcdTc2ODRcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1NzI4XHU0RTJEXHU2NTg3XHU1NDhDXHU2NTcwXHU1QjU3XHU0RTRCXHU5NUY0XHU2M0QyXHU1MTY1XHU3QTdBXHU2ODNDXHVGRjBDXHU1M0VGXHU2NEE0XHU5NTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VCZXR3ZWVuRW5nbGlzaE51bWJlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTgyRjFcdTY1ODdcdTRFMEVcdTY1NzBcdTVCNTdcdTRFNEJcdTk1RjRcdTc2ODRcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1NzI4XHU4MkYxXHU2NTg3XHU1NDhDXHU2NTcwXHU1QjU3XHU0RTRCXHU5NUY0XHU2M0QyXHU1MTY1XHU3QTdBXHU2ODNDXHVGRjBDXHU1M0VGXHU2NEE0XHU5NTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgZGVsZXRlU3BhY2VCZXR3ZWVuQ2hpbmVzZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTUyMjBcdTk2NjRcdTRFMkRcdTY1ODdcdTVCNTdcdTdCMjZcdTk1RjRcdTc2ODRcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1M0JCXHU5NjY0XHU0RTJEXHU2NTg3XHU1QjU3XHU3QjI2XHU0RTRCXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXHVGRjBDXHU0RTBEXHU1M0VGXHU2NEE0XHU5NTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NTNFNVx1OTk5Nlx1NUI1N1x1NkJDRFx1NTkyN1x1NTE5OVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTgyRjFcdTY1ODdcdTZCQ0ZcdTRFMkFcdTUzRTVcdTk5OTZcdTVCNTdcdTZCQ0RcdTU5MjdcdTUxOTlcdUZGMENcdTUzRUZcdTY0QTRcdTk1MDBcIlxuICAgICAgICB9LFxuICAgICAgICBzbWFydEluc2VydFNwYWNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NjY3QVx1ODBGRFx1NjNEMlx1NTE2NVx1N0E3QVx1NjgzQ1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTU3MjhcdTY1ODdcdTY3MkNcdTU0OENcdTY4MDdcdTcwQjlcdTRFNEJcdTk1RjRcdTY2N0FcdTgwRkRcdTYzRDJcdTUxNjVcdTdBN0FcdTY4M0NcIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZVN0cmF0ZWd5SW5saW5lQ29kZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTg4NENcdTUxODVcdTRFRTNcdTc4MDFcdTU0OENcdTY1ODdcdTY3MkNcdTRFNEJcdTk1RjRcdTc2ODRcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU2NUUwXHU4OTgxXHU2QzQyXHVGRjFBXHU1QkY5XHU2NzJDXHU3QzdCXHU1MjJCXHU1NzU3XHU0RTBFXHU1REU2XHU1M0YzXHU2NTg3XHU2NzJDXHU2Q0ExXHU2NzA5XHU3QTdBXHU2ODNDXHU3Njg0XHU4OTgxXHU2QzQyXHVGRjBDXCIgK1xuICAgICAgICAgICAgICAgICAgICAgXCJcdThGNkZcdTdBN0FcdTY4M0NcdUZGMUFcdTVCRjlcdTY3MkNcdTdDN0JcdTUyMkJcdTU3NTdcdTRFMEVcdTU0NjhcdTU2RjRcdTUzM0FcdTU3NTdcdTUzRUFcdTg5ODFcdTZDNDJcdTY3MDlcdThGNkZcdTdBN0FcdTY4M0NcdUZGMENcdThGNkZcdTdBN0FcdTY4M0NcdTU5ODJcdTVGNTNcdTUyNERcdTU3NTdcdTVERTZcdThGQjlcdTc2ODRcdTRFMzRcdThGRDFcdTY1ODdcdTY3MkNcdTRFM0FcdTMwMDJcdUZGMENcdUZGMUJcdUZGMUZcdTdCNDlcdTUxNjhcdTg5RDJcdTY4MDdcdTcwQjlcdUZGMENcdTVGNTNcdTUyNERcdTU3NTdcdTUzRjNcdThGQjlcdTc2ODRcdTRFMzRcdThGRDFcdTY1ODdcdTY3MkNcdTRFM0FcdTYyNDBcdTY3MDlcdTUxNjhcdTUzNEFcdTg5RDJcdTY4MDdcdTcwQjlcdUZGMENcIiArXG4gICAgICAgICAgICAgICAgICAgICBcIlx1NEUyNVx1NjgzQ1x1N0E3QVx1NjgzQ1x1RkYxQVx1NUY1M1x1NTI0RFx1NTc1N1x1NEUwRVx1NEUzNFx1OEZEMVx1NjU4N1x1NjcyQ1x1NEU0Qlx1OTVGNFx1NEUyNVx1NjgzQ1x1NkRGQlx1NTJBMFx1N0E3QVx1NjgzQ1x1MzAwMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlU3RyYXRlZ3lJbmxpbmVGb3JtdWxhOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1ODg0Q1x1NTE4NVx1NTE2Q1x1NUYwRlx1NTQ4Q1x1NjU4N1x1NjcyQ1x1NEU0Qlx1OTVGNFx1NzY4NFx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTVCOUFcdTRFNDlcdTg4NENcdTUxODVcdTUxNkNcdTVGMEZcdTU0OENcdTY1ODdcdTY3MkNcdTRFNEJcdTk1RjRcdTc2ODRcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZVN0cmF0ZWd5TGlua1RleHQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU5NEZFXHU2M0E1XHU1NDhDXHU2NTg3XHU2NzJDXHU0RTRCXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NUI5QVx1NEU0OSBbW3dpa2lsaW5rXV0gW21kbGlua10oLi4uKSBcdTU0OENcdTY1ODdcdTY3MkNcdTRFNEJcdTk1RjRcdTc2ODRcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcIlxuICAgICAgICB9LFxuICAgICAgICB1c2VyRGVmaW5lZFJlZ2V4cFN3aXRjaDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTc1MjhcdTYyMzdcdTVCOUFcdTRFNDlcdTc2ODRcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdTVGMDBcdTUxNzNcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU4MUVBXHU1QjlBXHU0RTQ5XHU2QjYzXHU1MjE5XHU4ODY4XHU4RkJFXHU1RjBGXHU1RjAwXHU1MTczXHVGRjBDXHU1MzM5XHU5MTREXHU1MjMwXHU3Njg0XHU1MTg1XHU1QkI5XHU0RTBEXHU4RkRCXHU4ODRDXHU2ODNDXHU1RjBGXHU1MzE2XHVGRjBDXHU0RTE0XHU1M0VGXHU0RUU1XHU4QkJFXHU3RjZFXHU1MzM5XHU5MTREXHU1MjMwXHU3Njg0XHU1MTg1XHU1QkI5XHU1NzU3XHU0RTBFXHU1MTc2XHU0RUQ2XHU1MTg1XHU1QkI5XHU0RTRCXHU5NUY0XHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCJcbiAgICAgICAgfSxcbiAgICAgICAgdXNlckRlZmluZWRSZWdleHA6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU3NTI4XHU2MjM3XHU1QjlBXHU0RTQ5XHU3Njg0XHU2QjYzXHU1MjE5XHU4ODY4XHU4RkJFXHU1RjBGXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NzUyOFx1NjIzN1x1ODFFQVx1NUI5QVx1NEU0OVx1NkI2M1x1NTIxOVx1ODg2OFx1OEZCRVx1NUYwRlx1RkYwQ1x1NTMzOVx1OTE0RFx1NTIzMFx1NzY4NFx1NTE4NVx1NUJCOVx1NEUwRFx1OEZEQlx1ODg0Q1x1NjgzQ1x1NUYwRlx1NTMxNlx1RkYwQ1x1NkJDRlx1ODg0Q1x1NEUwMFx1NEUyQVx1ODg2OFx1OEZCRVx1NUYwRlx1RkYwQ1x1ODg0Q1x1NUMzRVx1NEUwRFx1ODk4MVx1OTY4Rlx1NjEwRlx1NTJBMFx1N0E3QVx1NjgzQ1x1MzAwMlwiICtcblx0XHRcdFx0XCJcdTZCQ0ZcdTg4NENcdTY3MkJcdTVDM0UzXHU0RTJBXHU1QjU3XHU3QjI2XHU3Njg0XHU1NkZBXHU1QjlBXHU0RTNBfFx1NTQ4Q1x1NEUyNFx1NEUyQVx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVx1N0IyNlx1NTNGN1x1RkYwQ1x1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVx1N0IyNlx1NTNGN1x1NEUzQS09K1x1RkYwQ1x1NTIwNlx1NTIyQlx1NEVFM1x1ODg2OFx1NEUwRFx1ODk4MVx1NkM0Mlx1N0E3QVx1NjgzQygtKVx1RkYwQ1x1OEY2Rlx1N0E3QVx1NjgzQyg9KVx1RkYwQ1x1NEUyNVx1NjgzQ1x1N0E3QVx1NjgzQygrKVx1MzAwMlwiICtcblx0XHRcdFx0XCJcdThGRDlcdTRFMjRcdTRFMkFcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcdTdCMjZcdTUzRjdcdTUyMDZcdTUyMkJcdTRFM0FcdTUzMzlcdTkxNERcdTUzM0FcdTU3NTdcdTc2ODRcdTVERTZcdTUzRjNcdTRFMjRcdThGQjlcdTc2ODRcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcIlxuICAgICAgICB9LFxuICAgICAgICBleGNsdWRlRm9sZGVyc0ZpbGVzOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NjM5Mlx1OTY2NFx1NjU4N1x1NEVGNlx1NTkzOS9cdTY1ODdcdTRFRjZcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU4QkU1XHU2M0QyXHU0RUY2XHU1QzA2XHU2QkNGXHU4ODRDXHU4OUUzXHU2NzkwXHU0RTNBXHU0RTAwXHU0RTJBXHU2MzkyXHU5NjY0XHU2NTg3XHU0RUY2XHU1OTM5XHU2MjE2XHU2NTg3XHU0RUY2XHUzMDAyXHU0RjhCXHU1OTgyXHVGRjFBRGFpbHlOb3RlLywgRGFpbHlOb3RlL1dlZWtOb3Rlcy8sIERhaWx5Tm90ZS90ZXN0Lm1kXCJcbiAgICAgICAgfSxcbiAgICAgICAgZml4TWFjT1NDb250ZXh0TWVudToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTRGRUVcdTU5MEQgTWFjT1MgXHU1M0YzXHU5NTJFXHU4M0RDXHU1MzU1XHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NEZFRVx1NTkwRCBNYWNPUyBcdTlGMjBcdTY4MDdcdTUzRjNcdTk1MkVcdTU0N0NcdTUxRkFcdTgzRENcdTUzNTVcdTY1RjZcdTUxNDlcdTY4MDdcdThERjNcdTUyMzBcdTRFMEJcdTRFMDBcdTg4NENcdTc2ODRcdTk1RUVcdTk4OTggKFx1OTcwMFx1ODk4MVx1OTFDRFx1NTQyRiBPYnNpZGlhbiBcdTc1MUZcdTY1NDgpXCJcbiAgICAgICAgfSxcbiAgICAgICAgZml4TWljcm9zb2Z0SU1FOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NEZFRVx1NTkwRFx1NUZBRVx1OEY2Rlx1OEY5M1x1NTE2NVx1NkNENVx1OTVFRVx1OTg5OFwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTkwMDJcdTkxNERcdTY1RTdcdTcyNDhcdTVGQUVcdThGNkZcdThGOTNcdTUxNjVcdTZDRDVcIlxuICAgICAgICB9LFxuICAgICAgICBzdHJpY3RMaW5lQnJlYWtzOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NEUyNVx1NjgzQ1x1NjM2Mlx1ODg0Q1x1NkEyMVx1NUYwRlx1NEUwQlx1NjMwOVx1NEUyNFx1NkIyMVx1NTZERVx1OEY2NlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTRFMjVcdTY4M0NcdTYzNjJcdTg4NENcdTc2ODRcdThCQkVcdTdGNkVcdTRFMEJcdUZGMENcdTU3MjhcdTY2NkVcdTkwMUFcdTY1ODdcdTY3MkNcdTg4NENcdThGREJcdTg4NENcdTRFMDBcdTZCMjFcdTU2REVcdThGNjZcdTRGMUFcdTRFQTdcdTc1MUZcdTRFMjRcdTRFMkFcdTYzNjJcdTg4NENcdTdCMjZcIlxuICAgICAgICB9LFxuICAgICAgICBwdW5jUmVjdGlmeToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTY4MDdcdTcwQjlcdTc3RUJcdTZCNjNcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU0RUM1XHU1NzI4XHU4RjkzXHU1MTY1XHU4RkM3XHU3QTBCXHU0RTJEXHVGRjBDXHU0RTJEXHU2NTg3XHU5NUY0XHU3Njg0XHU4MkYxXHU2NTg3XHU2ODA3XHU3MEI5XHVGRjA4LC4/IVx1RkYwOVx1ODFFQVx1NTJBOFx1OEY2Q1x1NjM2Mlx1NEUzQVx1NTE2OFx1ODlEMlx1RkYwOFx1NTNFRlx1NjRBNFx1OTUwMFx1RkYwOVwiXG4gICAgICAgIH0sXG4gICAgICAgIHByaW50RGVidWdJbmZvOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NTcyOFx1NjNBN1x1NTIzNlx1NTNGMFx1OEY5M1x1NTFGQVx1OEMwM1x1OEJENVx1NEZFMVx1NjA2RlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTU3MjhcdTYzQTdcdTUyMzZcdTUzRjBcdThGOTNcdTUxRkFcdThDMDNcdThCRDVcdTRGRTFcdTYwNkZcIlxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25SZXBsYWNlUnVsZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTkwMDlcdTRFMkRcdTY2RkZcdTYzNjJcdTg5QzRcdTUyMTlcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU3NTI4XHU2MjM3XHU1QjlBXHU0RTQ5XHU3Njg0XHU5MDA5XHU2MkU5XHU2NkZGXHU2MzYyXHU4OUM0XHU1MjE5XCJcbiAgICAgICAgfSxcbiAgICAgICAgZGVsZXRlUnVsZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTUyMjBcdTk2NjRcdTg5QzRcdTUyMTlcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU4OUM0XHU1MjE5XHVGRjFBXHU3NTI4IHwgXHU0RUUzXHU4ODY4XHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXHVGRjBDXHU1RkM1XHU5ODdCXHU1MzA1XHU1NDJCXHU1MTQ5XHU2ODA3XHUzMDAyXHU2M0QwXHU3OTNBXHVGRjFBXHU0RjdGXHU3NTI4IHwgXHU4ODY4XHU3OTNBXHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXHUzMDAyXCJcbiAgICAgICAgfSxcbiAgICAgICAgY29udmVydFJ1bGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU4RjZDXHU2MzYyXHU4OUM0XHU1MjE5XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1ODlDNFx1NTIxOVx1RkYxQVx1NzUyOCB8IFx1NEVFM1x1ODg2OFx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVx1RkYwQ1x1NUZDNVx1OTg3Qlx1NTMwNVx1NTQyQlx1NTE0OVx1NjgwN1x1MzAwMlx1NjNEMFx1NzkzQVx1RkYxQVx1NEY3Rlx1NzUyOCB8IFx1ODg2OFx1NzkzQVx1NTE0OVx1NjgwN1x1NEY0RFx1N0Y2RVx1MzAwMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHRyaWdnZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU4OUU2XHU1M0QxXHU1NjY4XCJcbiAgICAgICAgfSxcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTVERTZcIlxuICAgICAgICB9LFxuICAgICAgICByaWdodDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTUzRjNcIlxuICAgICAgICB9LFxuICAgICAgICBvbGRQYXR0ZXJuOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NjVFN1x1NkEyMVx1NUYwRlwiXG4gICAgICAgIH0sXG4gICAgICAgIG5ld1BhdHRlcm46IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU2NUIwXHU2QTIxXHU1RjBGXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVhZGVyczoge1xuICAgICAgICBtYWluOiBcIk9ic2lkaWFuIEVhc3lUeXBpbmcgXHU2M0QyXHU0RUY2XCIsXG4gICAgICAgIGdpdGh1YkRldGFpbDogXCJcdThCRTZcdTYwQzVcdTg5QzEgR2l0aHViXHVGRjFBXCIsXG4gICAgICAgIGVuaGFuY2VkRWRpdGluZzogXCJcdTU4OUVcdTVGM0FcdTdGMTZcdThGOTFcdThCQkVcdTdGNkVcIixcbiAgICAgICAgY3VzdG9taXplRWRpdFJ1bGU6IFwiXHU4MUVBXHU1QjlBXHU0RTQ5XHU3RjE2XHU4RjkxXHU4RjZDXHU2MzYyXHU4OUM0XHU1MjE5XCIsXG4gICAgICAgIGF1dG9mb3JtYXRTZXR0aW5nOiBcIlx1ODFFQVx1NTJBOFx1NjgzQ1x1NUYwRlx1NTMxNlx1OEJCRVx1N0Y2RVwiLFxuICAgICAgICBkZXRhaWxlZFNldHRpbmc6IFwiXHU4QkU2XHU3RUM2XHU4QkJFXHU3RjZFXHU1OTgyXHU0RTBCXCIsXG4gICAgICAgIGN1c3RvbVJlZ2V4cEJsb2NrOiBcIlx1ODFFQVx1NUI5QVx1NEU0OVx1NkI2M1x1NTIxOVx1NTMzQVx1NTc1N1wiLFxuICAgICAgICBleGNsdWRlRm9sZGVyc0ZpbGVzOiBcIlx1NjMwN1x1NUI5QVx1NjU4N1x1NEVGNlx1NEUwRFx1ODFFQVx1NTJBOFx1NjgzQ1x1NUYwRlx1NTMxNlwiLFxuICAgICAgICBleHBlcmltZW50YWxGZWF0dXJlczogXCJcdTVCOUVcdTlBOENcdTUyOUZcdTgwRkRcIixcbiAgICAgICAgYWJvdXRSZWdleHA6IHtcbiAgICAgICAgICAgIGhlYWRlcjpcIlx1NkI2M1x1NTIxOVx1ODg2OFx1OEZCRVx1NUYwRlx1NzZGOFx1NTE3M1x1NzdFNVx1OEJDNlx1RkYwQ1x1ODlDMSBcIixcbiAgICAgICAgICAgIHRleHQ6IFwiXHUzMDBBXHU5NjJFXHU0RTAwXHU1Q0YwXHVGRjFBXHU2QjYzXHU1MjE5XHU4ODY4XHU4RkJFXHU1RjBGXHU3QjgwXHU2NjBFXHU2NTU5XHU3QTBCXHUzMDBCXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGluc3RydWN0aW9uc1JlZ2V4cDoge1xuICAgICAgICAgICAgaGVhZGVyOiBcIlx1NkI2M1x1NTIxOVx1ODg2OFx1OEZCRVx1NUYwRlx1ODlDNFx1NTIxOVx1NEY3Rlx1NzUyOFx1OEJGNFx1NjYwRVx1NEUwRVx1NzkzQVx1NEY4Qlx1RkYxQSBcIixcbiAgICAgICAgICAgIHRleHQ6XCJcdTgxRUFcdTVCOUFcdTRFNDlcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdTg5QzRcdTUyMTlcIixcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9taXplU2VsZWN0aW9uUnVsZTogXCJcdTgxRUFcdTVCOUFcdTRFNDlcdTkwMDlcdTRFMkRcdTY1ODdcdTY3MkNcdTdGMTZcdThGOTFcdTU4OUVcdTVGM0FcdTg5QzRcdTUyMTlcIixcbiAgICAgICAgY3VzdG9taXplRGVsZXRlUnVsZTogXCJcdTgxRUFcdTVCOUFcdTRFNDlcdTUyMjBcdTk2NjRcdTdGMTZcdThGOTFcdTU4OUVcdTVGM0FcdTg5QzRcdTUyMTlcIixcbiAgICAgICAgY3VzdG9taXplQ29udmVydFJ1bGU6IFwiXHU4MUVBXHU1QjlBXHU0RTQ5XHU3RjE2XHU4RjkxXHU4RjZDXHU2MzYyXHU4OUM0XHU1MjE5XCIsXG4gICAgICAgIGVkaXRTZWxlY3Rpb25SZXBsYWNlUnVsZTogXCJcdTdGMTZcdThGOTFcdTkwMDlcdTRFMkRcdTY2RkZcdTYzNjJcdTg5QzRcdTUyMTlcIixcbiAgICB9LFxuICAgIGRyb3Bkb3duT3B0aW9uczoge1xuICAgICAgICBvbmx5V2hlblR5cGluZzogXCJcdThGOTNcdTUxNjVcdTY1RjZcdTc1MUZcdTY1NDhcIixcbiAgICAgICAgZ2xvYmFsbHk6IFwiXHU1MTY4XHU1QzQwXHU3NTFGXHU2NTQ4XCIsXG4gICAgICAgIG5vUmVxdWlyZTogXCJcdTY1RTBcdTg5ODFcdTZDNDJcIixcbiAgICAgICAgc29mdFNwYWNlOiBcIlx1OEY2Rlx1N0E3QVx1NjgzQ1wiLFxuICAgICAgICBzdHJpY3RTcGFjZTogXCJcdTRFMjVcdTY4M0NcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgZHVtbXk6IFwiXHU1NDQ2XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgIHNtYXJ0OiBcIlx1NjY3QVx1ODBGRFx1N0E3QVx1NjgzQ1wiXG4gICAgfSxcbiAgICB0b29sVGlwOiB7XG4gICAgICAgIHN3aXRjaDogXCJcdTUyOUZcdTgwRkRcdTVGMDBcdTUxNzNcIixcbiAgICAgICAgZWRpdFJ1bGU6IFwiXHU3RjE2XHU4RjkxXHU4OUM0XHU1MjE5XCIsXG4gICAgICAgIHJlbW92ZVJ1bGU6IFwiXHU1MjIwXHU5NjY0XHU4OUM0XHU1MjE5XCIsXG4gICAgICAgIGFkZFJ1bGU6IFwiXHU2REZCXHU1MkEwXHU4OUM0XHU1MjE5XCIsXG4gICAgfSxcbiAgICBwbGFjZUhvbGRlcjoge1xuICAgICAgICB0cmlnZ2VyU3ltYm9sOiBcIlx1ODlFNlx1NTNEMVx1N0IyNlwiLFxuICAgICAgICBuZXdMZWZ0U2lkZVN0cmluZzogXCJcdTVERTZcdThGQjlcdTdCMjZcdTUzRjdcIixcbiAgICAgICAgbmV3UmlnaHRTaWRlU3RyaW5nOiBcIlx1NTNGM1x1OEZCOVx1N0IyNlx1NTNGN1wiLFxuICAgICAgICBhZGRSdWxlOiBcIlx1NkRGQlx1NTJBMFx1ODlDNFx1NTIxOVwiLFxuICAgICAgICBub3RpY2VJbnZhaWRUcmlnZ2VyOiBcIlx1NjVFMFx1NjU0OFx1NzY4NFx1ODlFNlx1NTNEMVx1N0IyNiwgXHU4OUU2XHU1M0QxXHU3QjI2XHU1RkM1XHU5ODdCXHU2NjJGXHU1MzU1XHU1QjU3XHU3QjI2XHU2MjE2XHU4MDA1XHU2NjJGIFx1MjAxNFx1MjAxNFx1MzAwMVx1MjAyNlx1MjAyNlwiLFxuICAgICAgICBub3RpY2VXYXJuVHJpZ2dlckV4aXN0czogXCJcdTY1RTBcdTY1NDhcdTg5QzRcdTUyMTkhIFx1ODlFNlx1NTNEMVx1N0IyNiAlcyBcdTVERjJcdTVCNThcdTU3MjhcIixcbiAgICAgICAgbm90aWNlTWlzc2luZ0lucHV0OiBcIm1pc3NpbmcgaW5wdXRcIixcbiAgICAgICAgYmVmb3JlRGVsZXRlOiBcIlx1NTIyMFx1OTY2NFx1NTI0RHxcIixcbiAgICAgICAgbmV3UGF0dGVybjogXCJcdTg5RTZcdTUzRDFcdTg5QzRcdTUyMTlcdTU0MEVcdTVCNTdcdTdCMjZcdTRFMzJcdTZBMjFcdTVGMEZcIixcbiAgICAgICAgbm90aWNlSW52YWlkVHJpZ2dlclBhdHRlcm5Db250YWluU3ltYm9sOiBcIlx1NjVFMFx1NjU0OFx1ODlDNFx1NTIxOSwgXHU4RjZDXHU2MzYyXHU1MjREXHU2QTIxXHU1RjBGXHU1RkM1XHU5ODdCXHU1MzA1XHU1NDJCXHU0RUUzXHU4ODY4XHU1MTQ5XHU2ODA3XHU0RjREXHU3RjZFXHU3Njg0XHU3QjI2XHU1M0Y3IFxcfFwiLFxuICAgICAgICBiZWZvcmVDb252ZXJ0OiBcIlx1OEY2Q1x1NjM2Mlx1NTI0RHxcIixcbiAgICAgICAgbm90aWNlSW52YWxpZFBhdHRlcm5TdHJpbmc6XCJJbnZhbGlkIHBhdHRlcm4gc3RyaW5nIVwiLFxuICAgIH0sXG4gICAgYnV0dG9uOiB7XG4gICAgICAgIHVwZGF0ZTogXCJcdTY2RjRcdTY1QjBcIixcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7XG4iLCAiaW1wb3J0IHsgZW5VUyB9IGZyb20gXCIuXCI7XG5cbi8vIG1hY2hpbmUgdHJhbnNsYXRpb25cbmNvbnN0IGxvY2FsZTogdHlwZW9mIGVuVVMgPSB7XG4gICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc3ltYm9sQXV0b1BhaXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDEwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDNFXHUwNDM1IFx1MDQzNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzggXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0M0ZcdTA0MzBcdTA0NDBcdTA0MzBcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDE0XHUwNDNFXHUwNDMxXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQzN1x1MDQzMFx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTA0MzggXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDM3XHUwNDMwXHUwNDNBXHUwNDQwXHUwNDRCXHUwNDQyXHUwNDM4XHUwNDM1IFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0JcdTA0MzhcdTA0NDdcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDMyLCBcdTA0NDJcdTA0MzBcdTA0M0FcdTA0MzhcdTA0NDUgXHUwNDNBXHUwNDMwXHUwNDNBIFx1MzAwQVx1MzAwQiwgXHUyMDFDXHUyMDFELCBcdTMwMENcdTMwMEQsIFx1MzAwRVx1MzAwRiwgXHUzMDEwXHUzMDExIFx1MDQzOCBcdTA0NDIuXHUwNDM0LlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvblJlcGxhY2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDIzXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDQ4XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0QiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQyM1x1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMCwgXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwLCBcdTA0M0RcdTA0MzBcdTA0MzZcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzUgXHVGRkU1IFx1MjE5MiAkXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiQsIFx1MDQzRFx1MDQzMFx1MDQzNlx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzNSBcdTAwQjcgXHUyMTkyIGBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyYCwgXHUzMDBBIFx1MjE5MiBcdTMwMEFcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUzMDBCIFx1MDQzOCBcdTA0NDIuXHUwNDM0LlwiXG4gICAgICAgIH0sXG4gICAgICAgIGZ1bGxXaWR0aFRvSGFsZldpZHRoOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxQVx1MDQzRVx1MDQzRFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzRcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDNFXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxQVx1MDQzRVx1MDQzRFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzRcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDNFXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1LCBcdTA0M0RcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDAsIFx1MzAwMlx1MzAwMlx1MjE5MiAuLCBcdUZGMDFcdUZGMDFcdTIxOTIgISwgXHUzMDBCXHUzMDBCXHUyMTkyID5cIlxuICAgICAgICB9LFxuICAgICAgICBiYXNpY0lucHV0RW5oYW5jZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MjNcdTA0M0JcdTA0NDNcdTA0NDdcdTA0NDhcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDMxXHUwNDMwXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzMlx1MDQzMlx1MDQzRVx1MDQzNFx1MDQzMCBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDM0XHUwNDNCXHUwNDRGIE9ic2lkaWFuXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQyM1x1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0MzFcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDMyXHUwNDMyXHUwNDNFXHUwNDM0XHUwNDMwIFx1MDQzNFx1MDQzQlx1MDQ0RiBPYnNpZGlhbiwgXHUwNDNEXHUwNDMwXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwLCBcdTMwMTBcdTMwMTB8IFx1MjE5MiBbW3xdXSwgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDNFIFx1MDQ0MSBcdTMwMDFcdTIxOTIgLywgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDNFIFx1MDQ0MSBcdTMwMEJcdTIxOTIgPiwgXHUwMEI3XHUwMEI3fCBcdTIxOTIgYHxgLCBgXHUwMEI3fGAgXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzQVx1MDQzRVx1MDQzNFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzQyBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0FcdTA0M0VcdTA0M0MsIFx1RkZFNVx1RkZFNXwgXHUyMTkyICR8JFwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVibG9ja0VkaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDIzXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDQ4XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0FcdTA0M0VcdTA0MzRcdTA0M0VcdTA0MzJcdTA0NEJcdTA0NDUgXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDMyXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQyM1x1MDQzQlx1MDQ0M1x1MDQ0N1x1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDMyIFx1MDQzQVx1MDQzRVx1MDQzNFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQ0NSBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0FcdTA0MzBcdTA0NDUgKFRhYiwgXHUwNDQzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1LCBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0FcdTA0MzAsIENtZC9DdHJsK0EgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1KS5cIlxuICAgICAgICB9LFxuICAgICAgICB0YWJPdXQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiVGFib3V0XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMlx1MDQ0Qlx1MDQzOVx1MDQ0Mlx1MDQzOCBcdTA0MzhcdTA0MzcgXHUwNDMyXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzQVx1MDQzRVx1MDQzNFx1MDQzMCBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDMwXHUwNDQwXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzMiAoXHUwNDNBXHUwNDNFXHUwNDMzXHUwNDM0XHUwNDMwIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRSkuXCJcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b0Zvcm1hdHRpbmc6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDEwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0RcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDBcdTA0MzUgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNS9cdTA0MzJcdTA0NEJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMCBcdTA0MzJcdTA0M0UgXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzRcdTA0M0VcdTA0M0FcdTA0NDNcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzAuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VCZXR3ZWVuQ2hpbmVzZUVuZ2xpc2g6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0M0FcdTA0MzhcdTA0NDJcdTA0MzBcdTA0MzlcdTA0NDFcdTA0M0FcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDM4IFx1MDQzMFx1MDQzRFx1MDQzM1x1MDQzQlx1MDQzOFx1MDQzOVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzQ1x1MDQzOCBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzhcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzMCBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDNBXHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQzOCBcdTA0MzBcdTA0M0RcdTA0MzNcdTA0M0JcdTA0MzhcdTA0MzlcdTA0NDFcdTA0M0FcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4LlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkNoaW5lc2VOdW1iZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0M0FcdTA0MzhcdTA0NDJcdTA0MzBcdTA0MzlcdTA0NDFcdTA0M0FcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzOCBcdTA0NDdcdTA0MzhcdTA0NDFcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzhcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzMCBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDNBXHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOCBcdTA0MzggXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4LlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkVuZ2xpc2hOdW1iZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDFGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0MzBcdTA0M0RcdTA0MzNcdTA0M0JcdTA0MzhcdTA0MzlcdTA0NDFcdTA0M0FcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzOCBcdTA0NDdcdTA0MzhcdTA0NDFcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzhcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDEyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzMCBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDMwXHUwNDNEXHUwNDMzXHUwNDNCXHUwNDM4XHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOCBcdTA0MzggXHUwNDQ3XHUwNDM4XHUwNDQxXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4LlwiXG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVNwYWNlQmV0d2VlbkNoaW5lc2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDIzXHUwNDM0XHUwNDMwXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzMCBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDNBXHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOFwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MjNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0M0FcdTA0MzhcdTA0NDJcdTA0MzBcdTA0MzlcdTA0NDFcdTA0M0FcdTA0MzhcdTA0M0NcdTA0MzggXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4LlwiXG4gICAgICAgIH0sXG4gICAgICAgIGNhcGl0YWxpemVGaXJzdExldHRlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MTdcdTA0MzBcdTA0MzNcdTA0M0JcdTA0MzBcdTA0MzJcdTA0M0RcdTA0MzBcdTA0NEYgXHUwNDMxXHUwNDQzXHUwNDNBXHUwNDMyXHUwNDMwIFx1MDQzMiBcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0MzUgXHUwNDNBXHUwNDMwXHUwNDM2XHUwNDM0XHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MUZcdTA0NDBcdTA0MzVcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDMyXHUwNDNFXHUwNDM5IFx1MDQzMVx1MDQ0M1x1MDQzQVx1MDQzMlx1MDQ0QiBcdTA0M0FcdTA0MzBcdTA0MzZcdTA0MzRcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDNCXHUwNDNFXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMiBcdTA0MzBcdTA0M0RcdTA0MzNcdTA0M0JcdTA0MzhcdTA0MzlcdTA0NDFcdTA0M0FcdTA0M0VcdTA0M0MgXHUwNDMyIFx1MDQzN1x1MDQzMFx1MDQzM1x1MDQzQlx1MDQzMFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0RS5cIlxuICAgICAgICB9LFxuICAgICAgICBzbWFydEluc2VydFNwYWNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxOFx1MDQzRFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQzQlx1MDQzNVx1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzMFx1MDQ0RiBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0MzBcdTA0MzJcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDMwIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0MgXHUwNDM4IFx1MDQzRlx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzNVx1MDQzOVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MThcdTA0M0RcdTA0NDJcdTA0MzVcdTA0M0JcdTA0M0JcdTA0MzVcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0MzBcdTA0NEYgXHUwNDMyXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyXHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzMCBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDIFx1MDQzOCBcdTA0M0ZcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzVcdTA0MzkuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VTdHJhdGVneUlubGluZUNvZGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDIxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDRGIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDMyXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDNDIFx1MDQzQVx1MDQzRVx1MDQzNFx1MDQzRVx1MDQzQyBcdTA0MzggXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxRFx1MDQzNVx1MDQ0MiBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0Mzk6IFx1MDQxRFx1MDQzNVx1MDQ0MiBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzkgXHUwNDNBIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzMFx1MDQzQyBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDREXHUwNDQyXHUwNDM4XHUwNDNDIFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQyBcdTA0M0FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzggXHUwNDM4IFx1MDQzRVx1MDQzQVx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzQyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0MuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcIlx1MDQxQ1x1MDQ0Rlx1MDQzM1x1MDQzQVx1MDQzOFx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0I6IFx1MDQyMlx1MDQ0MFx1MDQzNVx1MDQzMVx1MDQ0M1x1MDQzNVx1MDQ0Mlx1MDQ0MVx1MDQ0RiBcdTA0NDJcdTA0M0VcdTA0M0JcdTA0NENcdTA0M0FcdTA0M0UgXHUwNDNDXHUwNDRGXHUwNDMzXHUwNDNBXHUwNDM4XHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDREXHUwNDQyXHUwNDM4XHUwNDNDIFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzQVx1MDQzRVx1MDQzQyBcdTA0M0FcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0M0VcdTA0NDBcdTA0MzhcdTA0MzggXHUwNDM4IFx1MDQzRVx1MDQzQVx1MDQ0MFx1MDQ0M1x1MDQzNlx1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzQ1x1MDQzOCBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0FcdTA0MzBcdTA0M0NcdTA0MzguIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcIlx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MCBcdTA0M0NcdTA0NEZcdTA0MzNcdTA0M0FcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDMwOiBcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNCXHUwNDM1XHUwNDMzXHUwNDMwXHUwNDRFXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0MiBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzJcdTA0MzAgXHUwNDNFXHUwNDQyIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0FcdTA0MzAgLSBcdTA0NERcdTA0NDJcdTA0M0UgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDNFXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDNEXHUwNDMwXHUwNDRGIFx1MDQzRlx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiwgXHUwNDQyXHUwNDMwXHUwNDNBXHUwNDMwXHUwNDRGIFx1MDQzQVx1MDQzMFx1MDQzQSAuICwgOyA/IFx1MDQzOCBcdTA0NDIuXHUwNDM0LiwgXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQlx1MDQzNVx1MDQzM1x1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDIgXHUwNDQxXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwIFx1MDQzRVx1MDQ0MiBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNBXHUwNDMwIC0gXHUwNDREXHUwNDQyXHUwNDNFIFx1MDQzMlx1MDQ0MVx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0RcdTA0M0VcdTA0NDhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0M0RcdTA0MzBcdTA0NEYgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0M1x1MDQ0OFx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzRFx1MDQzRFx1MDQzMFx1MDQ0RiBcdTA0M0ZcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0NDZcdTA0MzhcdTA0NEYuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBcIlx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzM1x1MDQzOFx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0I6IFx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzM1x1MDQzRVx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDNcdTA0NDlcdTA0MzhcdTA0M0MgXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNDIFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0JcdTA0MzVcdTA0MzNcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzhcdTA0M0MgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlU3RyYXRlZ3lJbmxpbmVGb3JtdWxhOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0M0VcdTA0MzIgXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDM0XHUwNDQzIFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0NDNcdTA0M0JcdTA0M0VcdTA0MzkgXHUwNDM4IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQ1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MUVcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDMyXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDNDXHUwNDM4IFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQ0M1x1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOCBcdTA0MzggXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlU3RyYXRlZ3lMaW5rVGV4dDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MjFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0M0VcdTA0MzkgXHUwNDM4IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzQ1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MUVcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgW1tcdTA0MzJcdTA0MzhcdTA0M0FcdTA0MzhcdTA0NDFcdTA0NDFcdTA0NEJcdTA0M0JcdTA0M0FcdTA0MzBcdTA0M0NcdTA0MzhdXSBbbWFya2Rvd24tXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDMwXHUwNDNDXHUwNDM4XSguLi4pIFx1MDQzOCBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0MuXCJcbiAgICAgICAgfSxcbiAgICAgICAgdXNlckRlZmluZWRSZWdleHBTd2l0Y2g6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDFGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzOFx1MDQ0NSBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0NDNcdTA0M0JcdTA0NEZcdTA0NDBcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNS9cdTA0MzJcdTA0NEJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDQ1IFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQ0M1x1MDQzQlx1MDQ0Rlx1MDQ0MFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0MzJcdTA0NEJcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzksIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQ0MFx1MDQzMFx1MDQ0OVx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDM4IFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRVx1MDQzMlx1MDQzQVx1MDQzMCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0NDJcdTA0MzVcdTA0MzNcdTA0MzhcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDNFXHUwNDMyIFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0NDFcdTA0M0VcdTA0MzJcdTA0M0ZcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NEVcdTA0NDlcdTA0MzhcdTA0M0MgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDRCXHUwNDNDIFx1MDQzOCBcdTA0MzRcdTA0NDBcdTA0NDNcdTA0MzNcdTA0MzhcdTA0M0MgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDNDLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHVzZXJEZWZpbmVkUmVnZXhwOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzNSBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0NDNcdTA0M0JcdTA0NEZcdTA0NDBcdTA0M0RcdTA0M0VcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1LCBcdTA0M0VcdTA0MzRcdTA0M0RcdTA0M0UgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRFx1MDQzMCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDNcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDFGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDNFXHUwNDM1IFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQ0M1x1MDQzQlx1MDQ0Rlx1MDQ0MFx1MDQzRFx1MDQzRVx1MDQzNSBcdTA0MzJcdTA0NEJcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUsIFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzRlx1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzNVx1MDQzNSBcdTA0NDEgXHUwNDQxXHUwNDNFXHUwNDM0XHUwNDM1XHUwNDQwXHUwNDM2XHUwNDM4XHUwNDNDXHUwNDRCXHUwNDNDLCBcdTA0M0RcdTA0MzUgXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGLCBcdTA0M0VcdTA0MzRcdTA0M0RcdTA0M0UgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRFx1MDQzMCBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDMsIFx1MDQzRFx1MDQzNSBcdTA0MzRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0M0JcdTA0NEZcdTA0MzlcdTA0NDJcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDRCIFx1MDQzMiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDZcdTA0MzUgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDM4LlwiK1xuICAgICAgICAgICAgICAgIFwiXHUwNDFBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ2IFx1MDQzQVx1MDQzMFx1MDQzNlx1MDQzNFx1MDQzRVx1MDQzOSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0MzggXHUwNDQ0XHUwNDM4XHUwNDNBXHUwNDQxXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEIFx1MDQ0Mlx1MDQ0MFx1MDQzNVx1MDQzQ1x1MDQ0RiBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0MzBcdTA0M0NcdTA0Mzg6IHwgXHUwNDM4IFx1MDQzNFx1MDQzMlx1MDQ0M1x1MDQzQ1x1MDQ0RiBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiwgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCXHUwNDRCIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzM1x1MDQzOFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0M0VcdTA0MzIgLSBcdTA0NERcdTA0NDJcdTA0M0UgLSA9ICssIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQ0Qlx1MDQzNSBcdTA0NDFcdTA0M0VcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0UgXHUwNDNFXHUwNDMxXHUwNDNFXHUwNDM3XHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDRFXHUwNDQyIFx1MDQzRVx1MDQ0Mlx1MDQ0MVx1MDQ0M1x1MDQ0Mlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQzNSBcdTA0NDJcdTA0NDBcdTA0MzVcdTA0MzFcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDNFXHUwNDMyICgtKSwgXHUwNDNDXHUwNDRGXHUwNDMzXHUwNDNBXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQ0QiAoPSksIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzM1x1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcdTA0NEIgKCspLlwiK1xuICAgICAgICAgICAgICAgIFwiXHUwNDJEXHUwNDQyXHUwNDM4IFx1MDQzNFx1MDQzMlx1MDQzMCBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0NEZcdTA0MzJcdTA0M0JcdTA0NEZcdTA0NEVcdTA0NDJcdTA0NDFcdTA0NEYgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDMzXHUwNDM4XHUwNDM1XHUwNDM5IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzMiBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNCXHUwNDM1XHUwNDMyXHUwNDNFXHUwNDM5IFx1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0M0VcdTA0MzkgXHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDNFXHUwNDNEIFx1MDQ0MVx1MDQzRVx1MDQzMlx1MDQzRlx1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0RVx1MDQ0OVx1MDQzNVx1MDQzM1x1MDQzRSBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDQxXHUwNDNFXHUwNDNFXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXCJcbiAgICAgICAgfSxcbiAgICAgICAgZXhjbHVkZUZvbGRlcnNGaWxlczoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MThcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM4L1x1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0QlwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTA0MkRcdTA0NDJcdTA0M0VcdTA0NDIgXHUwNDNGXHUwNDNCXHUwNDMwXHUwNDMzXHUwNDM4XHUwNDNEIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzFcdTA0MzBcdTA0NDJcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDMwXHUwNDM2XHUwNDM0XHUwNDQzXHUwNDRFIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQ0MyBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDMwXHUwNDM1XHUwNDNDXHUwNDQzXHUwNDRFIFx1MDQzRlx1MDQzMFx1MDQzRlx1MDQzQVx1MDQ0MyBcdTA0MzhcdTA0M0JcdTA0MzggXHUwNDQ0XHUwNDMwXHUwNDM5XHUwNDNCLiBcdTA0MURcdTA0MzBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6IERhaWx5Tm90ZS8sIERhaWx5Tm90ZS9XZWVrTm90ZXMvLCBEYWlseU5vdGUvdGVzdC5tZFwiXG4gICAgICAgIH0sXG4gICAgICAgIGZpeE1hY09TQ29udGV4dE1lbnU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0RSBNYWNPUyAoXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzN1x1MDQzMFx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQSBPYnNpZGlhbilcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNCXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzQlx1MDQzNVx1MDQzQ1x1MDQ0QiwgXHUwNDNBXHUwNDNFXHUwNDMzXHUwNDM0XHUwNDMwIFx1MDQzQVx1MDQ0M1x1MDQ0MFx1MDQ0MVx1MDQzRVx1MDQ0MCBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0NDFcdTA0M0FcdTA0MzBcdTA0M0FcdTA0MzhcdTA0MzJcdTA0MzBcdTA0MzVcdTA0NDIgXHUwNDNEXHUwNDMwIFx1MDQ0MVx1MDQzQlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQ0M1x1MDQ0RSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0NDMgXHUwNDNGXHUwNDQwXHUwNDM4IFx1MDQzMlx1MDQ0Qlx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzNSBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRFIFx1MDQzRFx1MDQzMCBNYWNPUyAoXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDQzXHUwNDM1XHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzN1x1MDQzMFx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQSBPYnNpZGlhbikuXCJcbiAgICAgICAgfSxcbiAgICAgICAgZml4TWljcm9zb2Z0SU1FOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxOFx1MDQ0MVx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0M0JcdTA0MzVcdTA0M0NcdTA0NEIgXHUwNDQxIE1pY3Jvc29mdCBJbnB1dCBNZXRob2RcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDEwXHUwNDM0XHUwNDMwXHUwNDNGXHUwNDQyXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0NDFcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NEJcdTA0NDUgXHUwNDMyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDM5IE1pY3Jvc29mdCBJbnB1dCBNZXRob2QuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3RyaWN0TGluZUJyZWFrczoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MjBcdTA0MzVcdTA0MzZcdTA0MzhcdTA0M0MgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDMzXHUwNDM4XHUwNDQ1IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQ0MFx1MDQ0Qlx1MDQzMlx1MDQzRVx1MDQzMiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0EsIFx1MDQzNFx1MDQzMlx1MDQzMFx1MDQzNlx1MDQzNFx1MDQ0QiBcdTA0M0RcdTA0MzBcdTA0MzZcdTA0M0NcdTA0MzhcdTA0NDJcdTA0MzUgRW50ZXJcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDEyIFx1MDQ0MFx1MDQzNVx1MDQzNlx1MDQzOFx1MDQzQ1x1MDQzNSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzNcdTA0MzhcdTA0NDUgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDRCXHUwNDMyXHUwNDNFXHUwNDMyIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQSwgXHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFXHUwNDNBXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDNEXHUwNDNFXHUwNDM1IFx1MDQzRFx1MDQzMFx1MDQzNlx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQzNSBFbnRlciBcdTA0MzIgXHUwNDNFXHUwNDMxXHUwNDRCXHUwNDQ3XHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQ0NSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0MzBcdTA0NDUgXHUwNDQxXHUwNDNFXHUwNDM3XHUwNDM0XHUwNDMwXHUwNDQxXHUwNDQyIFx1MDQzNFx1MDQzMlx1MDQzMCBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDM4LlwiXG4gICAgICAgIH0sXG4gICAgICAgIHB1bmNSZWN0aWZ5OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxQVx1MDQzRVx1MDQ0MFx1MDQ0MFx1MDQzNVx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDJcdTA0NDNcdTA0MzBcdTA0NDZcdTA0MzhcdTA0MzhcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDEwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDNBXHUwNDMwXHUwNDRGIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0MzBcdTA0M0RcdTA0MzNcdTA0M0JcdTA0MzhcdTA0MzlcdTA0NDFcdTA0M0FcdTA0M0VcdTA0MzkgXHUwNDNGXHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4ICgsIC4gPyAhKSBcdTA0M0NcdTA0MzVcdTA0MzZcdTA0MzRcdTA0NDMgXHUwNDNBXHUwNDM4XHUwNDQyXHUwNDMwXHUwNDM5XHUwNDQxXHUwNDNBXHUwNDM4XHUwNDNDXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzMFx1MDQzQ1x1MDQzOCBcdTA0MzIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDNFXHUwNDQ4XHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNEXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQzRlx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RSBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNEXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDM1IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMCAoXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDNDXHUwNDNFKS5cIlxuICAgICAgICB9LFxuICAgICAgICBwcmludERlYnVnSW5mbzoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MTJcdTA0NEJcdTA0MzJcdTA0M0VcdTA0MzQgXHUwNDNFXHUwNDQyXHUwNDNCXHUwNDMwXHUwNDM0XHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzIgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQxXHUwNDNFXHUwNDNCXHUwNDRDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxMlx1MDQ0Qlx1MDQzMlx1MDQzRVx1MDQzNCBcdTA0M0VcdTA0NDJcdTA0M0JcdTA0MzBcdTA0MzRcdTA0M0VcdTA0NDdcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDM4XHUwNDNEXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDM4IFx1MDQzMiBcdTA0M0FcdTA0M0VcdTA0M0RcdTA0NDFcdTA0M0VcdTA0M0JcdTA0NEMuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uUmVwbGFjZVJ1bGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDFGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDNFIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0QiBcdTA0MzJcdTA0NEJcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyXHUwNDMwXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1MDQxRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzRVx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0M0UgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRCIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzBcIlxuICAgICAgICB9LFxuICAgICAgICBkZWxldGVSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzRSBcdTA0NDNcdTA0MzRcdTA0MzBcdTA0M0JcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDFGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDNFOiBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzlcdTA0NDJcdTA0MzUgfCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQzXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAuIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQ0MVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQzQVx1MDQzMDogXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1IHwgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzQVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwLlwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnZlcnRSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzRSBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEZcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHUwNDFGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDNFOiBcdTA0MThcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0NDNcdTA0MzlcdTA0NDJcdTA0MzUgfCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDQzXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzOFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M0FcdTA0NDNcdTA0NDBcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAuIFx1MDQxRlx1MDQzRVx1MDQzNFx1MDQ0MVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQzQVx1MDQzMDogXHUwNDE4XHUwNDQxXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1IHwgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQ0M1x1MDQzQVx1MDQzMFx1MDQzN1x1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwLlwiXG4gICAgICAgIH0sXG4gICAgICAgIHRyaWdnZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHUwNDIyXHUwNDQwXHUwNDM4XHUwNDMzXHUwNDMzXHUwNDM1XHUwNDQwXCJcbiAgICAgICAgfSxcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MUJcdTA0MzVcdTA0MzJcdTA0NEJcdTA0MzlcIlxuICAgICAgICB9LFxuICAgICAgICByaWdodDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTA0MUZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0NEJcdTA0MzlcIlxuICAgICAgICB9LFxuICAgICAgICBvbGRQYXR0ZXJuOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQyMVx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0Qlx1MDQzOSBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0RcIlxuICAgICAgICB9LFxuICAgICAgICBuZXdQYXR0ZXJuOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1MDQxRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOSBcdTA0NDhcdTA0MzBcdTA0MzFcdTA0M0JcdTA0M0VcdTA0M0RcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAgIG1haW46IFwiXHUwNDFGXHUwNDNCXHUwNDMwXHUwNDMzXHUwNDM4XHUwNDNEIE9ic2lkaWFuIEVhc3lUeXBpbmdcIixcbiAgICAgICAgZ2l0aHViRGV0YWlsOiBcIlx1MDQxRlx1MDQzRVx1MDQzNFx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzRFx1MDQzNVx1MDQzNSBcdTA0M0RcdTA0MzAgR2l0aHViOiBcIixcbiAgICAgICAgZW5oYW5jZWRFZGl0aW5nOiBcIlx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzMCBcdTA0NDNcdTA0M0JcdTA0NDNcdTA0NDdcdTA0NDhcdTA0MzVcdTA0M0RcdTA0M0RcdTA0M0VcdTA0MzNcdTA0M0UgXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGXCIsXG4gICAgICAgIGN1c3RvbWl6ZUVkaXRSdWxlOiBcIlx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzMFx1MDQzQVx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgICAgICBhdXRvZm9ybWF0U2V0dGluZzogXCJcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzAgXHUwNDMwXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQ0XHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGXCIsXG4gICAgICAgIGRldGFpbGVkU2V0dGluZzogXCJcdTA0MUZcdTA0M0VcdTA0MzRcdTA0NDBcdTA0M0VcdTA0MzFcdTA0M0RcdTA0MzBcdTA0NEYgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDMwIFx1MDQzRFx1MDQzOFx1MDQzNlx1MDQzNVwiLFxuICAgICAgICBjdXN0b21SZWdleHBCbG9jazogXCJcdTA0MTFcdTA0M0JcdTA0M0VcdTA0M0EgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDQxXHUwNDNBXHUwNDM4XHUwNDQ1IFx1MDQ0MFx1MDQzNVx1MDQzM1x1MDQ0M1x1MDQzQlx1MDQ0Rlx1MDQ0MFx1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0MzJcdTA0NEJcdTA0NDBcdTA0MzBcdTA0MzZcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzlcIixcbiAgICAgICAgZXhjbHVkZUZvbGRlcnNGaWxlczogXCJcdTA0MThcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDM4L1x1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQ0QlwiLFxuICAgICAgICBleHBlcmltZW50YWxGZWF0dXJlczogXCJcdTA0MkRcdTA0M0FcdTA0NDFcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQ0XHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQ2XHUwNDM4XHUwNDM4XCIsXG4gICAgICAgIGFib3V0UmVnZXhwOiB7XG4gICAgICAgICAgICBoZWFkZXI6IFwiXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0M0UgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDQzXHUwNDNCXHUwNDRGXHUwNDQwXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Rlx1MDQ0NSBcdTA0NDFcdTA0M0MuIFwiLFxuICAgICAgICAgICAgdGV4dDogXCJZaWZlbmcgTmd1eWVuOiBcdTA0MUFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0M0FcdTA0M0VcdTA0MzUgXHUwNDQwXHUwNDQzXHUwNDNBXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNFIFx1MDQzRlx1MDQzRSBcdTA0NDBcdTA0MzVcdTA0MzNcdTA0NDNcdTA0M0JcdTA0NEZcdTA0NDBcdTA0M0RcdTA0NEJcdTA0M0MgXHUwNDMyXHUwNDRCXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXHUwNDNDXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGluc3RydWN0aW9uc1JlZ2V4cDoge1xuICAgICAgICAgICAgaGVhZGVyOiBcIlx1MDQxOFx1MDQzRFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzOCBcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwXHUwNDRCIFx1MDQzOFx1MDQ0MVx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0IgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDQzXHUwNDNCXHUwNDRGXHUwNDQwXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOTogXCIsXG4gICAgICAgICAgICB0ZXh0OlwiXHUwNDFEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDMwIFx1MDQzRlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQ0MVx1MDQzQVx1MDQzOFx1MDQ0NSBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0IgXHUwNDQwXHUwNDM1XHUwNDMzXHUwNDQzXHUwNDNCXHUwNDRGXHUwNDQwXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzMlx1MDQ0Qlx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzOVwiLFxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21pemVTZWxlY3Rpb25SdWxlOiBcIlx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRCIFx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJcdTA0MzBcIixcbiAgICAgICAgY3VzdG9taXplRGVsZXRlUnVsZTogXCJcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDMwIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgICAgICBjdXN0b21pemVDb252ZXJ0UnVsZTogXCJcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzAgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgICAgICBlZGl0U2VsZWN0aW9uUmVwbGFjZVJ1bGU6IFwiXHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0M0RcdTA0NEIgXHUwNDMyXHUwNDRCXHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMFwiLFxuICAgIH0sXG4gICAgZHJvcGRvd25PcHRpb25zOiB7XG4gICAgICAgIG9ubHlXaGVuVHlwaW5nOiBcIlx1MDQyMlx1MDQzRVx1MDQzQlx1MDQ0Q1x1MDQzQVx1MDQzRSBcdTA0M0ZcdTA0NDBcdTA0MzggXHUwNDNEXHUwNDMwXHUwNDMxXHUwNDNFXHUwNDQwXHUwNDM1IFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMFwiLFxuICAgICAgICBnbG9iYWxseTogXCJcdTA0MjBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDMzXHUwNDNCXHUwNDNFXHUwNDMxXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXCIsXG4gICAgICAgIG5vUmVxdWlyZTogXCJcdTA0MURcdTA0MzVcdTA0NDIgXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDMxXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM5XCIsXG4gICAgICAgIHNvZnRTcGFjZTogXCJcdTA0MUNcdTA0NEZcdTA0MzNcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXCIsXG4gICAgICAgIHN0cmljdFNwYWNlOiBcIlx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzM1x1MDQzOFx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzFcdTA0MzVcdTA0M0JcIixcbiAgICAgICAgZHVtbXk6IFwiXHUwNDI0XHUwNDM4XHUwNDNBXHUwNDQyXHUwNDM4XHUwNDMyXHUwNDNEXHUwNDRCXHUwNDM5XCIsXG4gICAgICAgIHNtYXJ0OiBcIlx1MDQyM1x1MDQzQ1x1MDQzRFx1MDQ0Qlx1MDQzOVwiXG4gICAgfSxcbiAgICB0b29sVGlwOiB7XG4gICAgICAgIHN3aXRjaDogXCJcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0NENcIixcbiAgICAgICAgZWRpdFJ1bGU6IFwiXHUwNDIwXHUwNDM1XHUwNDM0XHUwNDMwXHUwNDNBXHUwNDQyXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzOFx1MDQzQlx1MDQzRVwiLFxuICAgICAgICByZW1vdmVSdWxlOiBcIlx1MDQyM1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0M0VcIixcbiAgICAgICAgYWRkUnVsZTogXCJcdTA0MTRcdTA0M0VcdTA0MzFcdTA0MzBcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDM4XHUwNDNCXHUwNDNFXCIsXG4gICAgfSxcbiAgICBwbGFjZUhvbGRlcjoge1xuICAgICAgICB0cmlnZ2VyU3ltYm9sOiBcIlx1MDQyMVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQiBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzNcdTA0MzNcdTA0MzVcdTA0NDBcdTA0MzBcIixcbiAgICAgICAgbmV3TGVmdFNpZGVTdHJpbmc6IFwiXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDRGIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzMCBcdTA0NDEgXHUwNDNCXHUwNDM1XHUwNDMyXHUwNDNFXHUwNDM5IFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzRVx1MDQzRFx1MDQ0QlwiLFxuICAgICAgICBuZXdSaWdodFNpZGVTdHJpbmc6IFwiXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDRGIFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzQVx1MDQzMCBcdTA0NDEgXHUwNDNGXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDNFXHUwNDM5IFx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzRVx1MDQzRFx1MDQ0QlwiLFxuICAgICAgICBhZGRSdWxlOiBcIlx1MDQxNFx1MDQzRVx1MDQzMVx1MDQzMFx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0M0VcIixcbiAgICAgICAgbm90aWNlSW52YWlkVHJpZ2dlcjogXCJcdTA0MURcdTA0MzVcdTA0MzRcdTA0MzVcdTA0MzlcdTA0NDFcdTA0NDJcdTA0MzJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDMzXHUwNDMzXHUwNDM1XHUwNDQwLCBcdTA0NDJcdTA0NDBcdTA0MzhcdTA0MzNcdTA0MzNcdTA0MzVcdTA0NDAgXHUwNDM0XHUwNDNFXHUwNDNCXHUwNDM2XHUwNDM1XHUwNDNEIFx1MDQzMVx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzJcdTA0M0VcdTA0M0JcdTA0M0VcdTA0M0MgXHUwNDM0XHUwNDNCXHUwNDM4XHUwNDNEXHUwNDNFXHUwNDM5IDEgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzQyBcdTIwMTRcdTIwMTQsIFx1MjAyNlx1MjAyNlwiLFxuICAgICAgICBub3RpY2VXYXJuVHJpZ2dlckV4aXN0czogXCJcdTA0MTJcdTA0M0RcdTA0MzhcdTA0M0NcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUhIFx1MDQyMlx1MDQ0MFx1MDQzOFx1MDQzM1x1MDQzM1x1MDQzNVx1MDQ0MCAlcyBcdTA0NDNcdTA0MzZcdTA0MzUgXHUwNDQxXHUwNDQzXHUwNDQ5XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyIVwiLFxuICAgICAgICBub3RpY2VNaXNzaW5nSW5wdXQ6IFwiXHUwNDFFXHUwNDQyXHUwNDQxXHUwNDQzXHUwNDQyXHUwNDQxXHUwNDQyXHUwNDMyXHUwNDQzXHUwNDM1XHUwNDQyIFx1MDQzMlx1MDQzMlx1MDQzRVx1MDQzNFwiLFxuICAgICAgICBiZWZvcmVEZWxldGU6IFwiXHUwNDE0XHUwNDNFIFx1MDQ0M1x1MDQzNFx1MDQzMFx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuXHRcdG5ld1BhdHRlcm46IFwiXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM5IFx1MDQ0OFx1MDQzMFx1MDQzMVx1MDQzQlx1MDQzRVx1MDQzRFwiLFxuICAgICAgICBub3RpY2VJbnZhaWRUcmlnZ2VyUGF0dGVybkNvbnRhaW5TeW1ib2w6IFwiXHUwNDFEXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQzM1x1MDQzM1x1MDQzNVx1MDQ0MCwgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNEIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzNVx1MDQzRCBcdTA0NDFcdTA0M0VcdTA0MzRcdTA0MzVcdTA0NDBcdTA0MzZcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMyXHUwNDNFXHUwNDNCIFxcfCwgXHUwNDQzXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDRCXHUwNDMyXHUwNDMwXHUwNDRFXHUwNDQ5XHUwNDM4XHUwNDM5IFx1MDQzRFx1MDQzMCBcdTA0M0ZcdTA0M0VcdTA0MzdcdTA0MzhcdTA0NDZcdTA0MzhcdTA0NEUgXHUwNDNBXHUwNDQzXHUwNDQwXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwXCIsXG4gICAgICAgIGJlZm9yZUNvbnZlcnQ6IFwiXHUwNDE0XHUwNDNFIFx1MDQzRlx1MDQ0MFx1MDQzNVx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgICAgICBub3RpY2VJbnZhbGlkUGF0dGVyblN0cmluZzpcIlx1MDQxRFx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzMFx1MDQ0RiBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0M0FcdTA0MzAgXHUwNDQ4XHUwNDMwXHUwNDMxXHUwNDNCXHUwNDNFXHUwNDNEXHUwNDMwIVwiLFxuICAgIH0sXG4gICAgYnV0dG9uOiB7XG4gICAgICAgIHVwZGF0ZTogXCJcdTA0MUVcdTA0MzFcdTA0M0RcdTA0M0VcdTA0MzJcdTA0MzhcdTA0NDJcdTA0NENcIixcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBsb2NhbGU7XG4iLCAiaW1wb3J0IHsgZW5VUyB9IGZyb20gXCIuXCI7XG5cbmNvbnN0IGxvY2FsZTogdHlwZW9mIGVuVVMgPSB7XG4gICAgc2V0dGluZ3M6IHtcbiAgICAgICAgc3ltYm9sQXV0b1BhaXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU3QjI2XHU4NjVGXHU4MUVBXHU1MkQ1XHU5MTREXHU1QzBEXHU1M0NBXHU1MjJBXHU5NjY0XHU5MTREXHU1QzBEXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTg5RVx1NTJBMFx1NTkxQVx1N0EyRVx1N0IyNlx1ODY1Rlx1OTE0RFx1NUMwRFx1OEYzOFx1NTE2NVx1RkYwQ1x1OTE0RFx1NUMwRFx1NTIyQVx1OTY2NFx1RkYwQ1x1NTk4Mlx1MzAwQVx1MzAwQiwgXHUyMDFDXHUyMDFELCBcdTMwMENcdTMwMEQsIFx1MzAwRVx1MzAwRiwgXHUzMDEwXHUzMDExXHU3QjQ5XCJcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uUmVwbGFjZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTkwNzhcdTRFMkRcdTY1ODdcdTY3MkNcdTY2RkZcdTYzREJcdTU4OUVcdTVGM0FcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU5MDc4XHU0RTJEXHU2NTg3XHU2NzJDXHU2MEM1XHU2Q0MxXHU0RTBCXHU3Njg0XHU3REU4XHU4RjJGXHU1ODlFXHU1RjNBXHVGRjBDXHU2MzA5XHVGRkU1XHUyMTkyJFx1OTA3OFx1NEUyRFx1NzY4NFx1NjU4N1x1NjcyQyQsIFx1NjMwOVx1MDBCN1x1MjE5MmBcdTkwNzhcdTRFMkRcdTc2ODRcdTY1ODdcdTY3MkNgXHVGRjBDXHUzMDBBIFx1MjE5MiBcdTMwMEFcdTkwNzhcdTRFMkRcdTc2ODRcdTY1ODdcdTY3MkNcdTMwMEJcdTdCNDlcdTdCNDlcIlxuICAgICAgICB9LFxuICAgICAgICBmdWxsV2lkdGhUb0hhbGZXaWR0aDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTkwMjNcdTdFOENcdThGMzhcdTUxNjVcdTUxNjhcdTg5RDJcdTdCMjZcdTg2NUZcdThGNDlcdTUzNEFcdTg5RDJcdTdCMjZcdTg2NUZcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU5MDIzXHU3RThDXHU4RjM4XHU1MTY1XHU1MTY4XHU4OUQyXHU3QjI2XHU4NjVGXHU4RjQ5XHU1MzRBXHU4OUQyXHVGRjBDXHUzMDAyXHUzMDAyXHUyMTkyIC5cdUZGMENcdUZGMDFcdUZGMDFcdTIxOTIgIVx1RkYwQyBcdTMwMEJcdTMwMEJcdTIxOTIgPlwiXG4gICAgICAgIH0sXG4gICAgICAgIGJhc2ljSW5wdXRFbmhhbmNlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk9ic2lkaWFuIFx1NzY4NFx1NTdGQVx1NzkwRVx1N0IyNlx1ODY1Rlx1OEYzOFx1NTE2NVx1NTg5RVx1NUYzQVwiLFxuICAgICAgICAgICAgZGVzYzogXCJPYnNpZGlhbiBcdTc2ODRcdTU3RkFcdTc5MEVcdThGMzhcdTUxNjVcdTU4OUVcdTVGM0FcdUZGMENcdTU5ODJcdTMwMTBcdTMwMTB8IFx1MjE5MiBbW3xdXVx1RkYwQ1x1NTNFNVx1OTk5Nlx1NzY4NFx1MzAwMVx1MjE5MiAvXHVGRjBDXHU1M0U1XHU5OTk2XHU3Njg0XHUzMDBCXHUyMTkyID5cdUZGMENcdTAwQjdcdTAwQjd8IFx1MjE5MiBgfGBcdUZGMEMgYFx1MDBCN3xgIFx1OEI4QVx1NjIxMFx1NEVFM1x1NzhCQ1x1NTg0QVx1RkYwQ1x1RkZFNVx1RkZFNXwgXHUyMTkyICR8JFwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVibG9ja0VkaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1ODlFXHU1RjNBXHU0RUUzXHU3OEJDXHU1ODRBXHU3REU4XHU4RjJGXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTg5RVx1NUYzQVx1NEVFM1x1NzhCQ1x1NTg0QVx1NTE2N1x1NzY4NFx1N0RFOFx1OEYyRlx1RkYwOENtZC9DdHJsK0EgXHU5MDc4XHU0RTJEXHUzMDAxVGFiXHUzMDAxXHU1MjJBXHU5NjY0XHUzMDAxXHU3Qzk4XHU4Q0JDXHVGRjA5XCJcbiAgICAgICAgfSxcbiAgICAgICAgdGFiT3V0OiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OERGM1x1NTFGQVx1NEVFM1x1NzhCQ1x1NTg0QVwiLFxuICAgICAgICAgICAgZGVzYzogXCJUYWIgXHU4REYzXHU1MUZBXHU4ODRDXHU1MTY3XHU0RUUzXHU3OEJDXHU1ODRBXHU2MjE2XHU5MTREXHU1QzBEXHU3QjI2XHU4NjVGXHU1ODRBKFx1OTA3OFx1NEUyRFx1NjY0MilcIlxuICAgICAgICB9LFxuICAgICAgICBhdXRvRm9ybWF0dGluZzoge1xuICAgICAgICAgICAgbmFtZTogXCJcdThGMzhcdTUxNjVcdTY2NDJcdTgxRUFcdTUyRDVcdTY4M0NcdTVGMEZcdTUzMTZcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU2NjJGXHU1NDI2XHU1NzI4XHU3REU4XHU4RjJGXHU2NTg3XHU2QTk0XHU2NjQyXHU4MUVBXHU1MkQ1XHU2ODNDXHU1RjBGXHU1MzE2XHU2NTg3XHU2NzJDXHVGRjBDXHU4MUVBXHU1MkQ1XHU2ODNDXHU1RjBGXHU1MzE2XHU3Njg0XHU3RTNEXHU5NThCXHU5NURDXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VCZXR3ZWVuQ2hpbmVzZUVuZ2xpc2g6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU0RTJEXHU2NTg3XHU4MjA3XHU4MkYxXHU2NTg3XHU0RTRCXHU5NTkzXHU3Njg0XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTcyOFx1NEUyRFx1NjU4N1x1NTQ4Q1x1ODJGMVx1NjU4N1x1NEU0Qlx1OTU5M1x1NjNEMlx1NTE2NVx1N0E3QVx1NjgzQ1x1RkYwQ1x1NTNFRlx1NTNENlx1NkQ4OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkNoaW5lc2VOdW1iZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU0RTJEXHU2NTg3XHU4MjA3XHU2NTc4XHU1QjU3XHU0RTRCXHU5NTkzXHU3Njg0XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTcyOFx1NEUyRFx1NjU4N1x1NTQ4Q1x1NjU3OFx1NUI1N1x1NEU0Qlx1OTU5M1x1NjNEMlx1NTE2NVx1N0E3QVx1NjgzQ1x1RkYwQ1x1NTNFRlx1NTNENlx1NkQ4OFwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlQmV0d2VlbkVuZ2xpc2hOdW1iZXI6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU4MkYxXHU2NTg3XHU4MjA3XHU2NTc4XHU1QjU3XHU0RTRCXHU5NTkzXHU3Njg0XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTcyOFx1ODJGMVx1NjU4N1x1NTQ4Q1x1NjU3OFx1NUI1N1x1NEU0Qlx1OTU5M1x1NjNEMlx1NTE2NVx1N0E3QVx1NjgzQ1x1RkYwQ1x1NTNFRlx1NTNENlx1NkQ4OFwiXG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVNwYWNlQmV0d2VlbkNoaW5lc2U6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1MjJBXHU5NjY0XHU0RTJEXHU2NTg3XHU1QjU3XHU3QjI2XHU5NTkzXHU3Njg0XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTNCQlx1OTY2NFx1NEUyRFx1NjU4N1x1NUI1N1x1N0IyNlx1NEU0Qlx1OTU5M1x1NzY4NFx1N0E3QVx1NjgzQ1x1RkYwQ1x1NEUwRFx1NTNFRlx1NTNENlx1NkQ4OFwiXG4gICAgICAgIH0sXG4gICAgICAgIGNhcGl0YWxpemVGaXJzdExldHRlcjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTUzRTVcdTk5OTZcdTVCNTdcdTZCQ0RcdTU5MjdcdTVCRUJcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU4MkYxXHU2NTg3XHU2QkNGXHU1MDBCXHU1M0U1XHU5OTk2XHU1QjU3XHU2QkNEXHU1OTI3XHU1QkVCXHVGRjBDXHU1M0VGXHU1M0Q2XHU2RDg4XCJcbiAgICAgICAgfSxcbiAgICAgICAgc21hcnRJbnNlcnRTcGFjZToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTY2N0FcdTgwRkRcdTYzRDJcdTUxNjVcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1NzI4XHU2NTg3XHU2NzJDXHU1NDhDXHU2QTE5XHU5RURFXHU0RTRCXHU5NTkzXHU2NjdBXHU4MEZEXHU2M0QyXHU1MTY1XHU3QTdBXHU2ODNDXCJcbiAgICAgICAgfSxcbiAgICAgICAgc3BhY2VTdHJhdGVneUlubGluZUNvZGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU4ODRDXHU1MTY3XHU0RUUzXHU3OEJDXHU1NDhDXHU2NTg3XHU2NzJDXHU0RTRCXHU5NTkzXHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NzEyMVx1ODk4MVx1NkM0Mlx1RkYxQVx1NUMwRFx1NjcyQ1x1OTg1RVx1NTIyNVx1NTg0QVx1ODIwN1x1NURFNlx1NTNGM1x1NjU4N1x1NjcyQ1x1NkM5Mlx1NjcwOVx1N0E3QVx1NjgzQ1x1NzY4NFx1ODk4MVx1NkM0Mlx1RkYwQ1wiICtcbiAgICAgICAgICAgICAgICBcIlx1OEVERlx1N0E3QVx1NjgzQ1x1RkYxQVx1NUMwRFx1NjcyQ1x1OTg1RVx1NTIyNVx1NTg0QVx1ODIwN1x1NTQ2OFx1NTcwRFx1NTM0MFx1NTg0QVx1NTNFQVx1ODk4MVx1NkM0Mlx1NjcwOVx1OEVERlx1N0E3QVx1NjgzQ1x1RkYwQ1x1OEVERlx1N0E3QVx1NjgzQ1x1NTk4Mlx1NzU3Nlx1NTI0RFx1NTg0QVx1NURFNlx1OTA4QVx1NzY4NFx1ODFFOFx1OEZEMVx1NjU4N1x1NjcyQ1x1NzBCQVx1MzAwMlx1RkYwQ1x1RkYxQlx1RkYxRlx1N0I0OVx1NTE2OFx1ODlEMlx1NkExOVx1OUVERVx1RkYwQ1x1NzU3Nlx1NTI0RFx1NTg0QVx1NTNGM1x1OTA4QVx1NzY4NFx1ODFFOFx1OEZEMVx1NjU4N1x1NjcyQ1x1NzBCQVx1NjI0MFx1NjcwOVx1NTE2OFx1NTM0QVx1ODlEMlx1NkExOVx1OUVERVx1RkYwQ1wiICtcbiAgICAgICAgICAgICAgICBcIlx1NTZCNFx1NjgzQ1x1N0E3QVx1NjgzQ1x1RkYxQVx1NzU3Nlx1NTI0RFx1NTg0QVx1ODIwN1x1ODFFOFx1OEZEMVx1NjU4N1x1NjcyQ1x1NEU0Qlx1OTU5M1x1NTZCNFx1NjgzQ1x1NkRGQlx1NTJBMFx1N0E3QVx1NjgzQ1x1MzAwMlwiXG4gICAgICAgIH0sXG4gICAgICAgIHNwYWNlU3RyYXRlZ3lJbmxpbmVGb3JtdWxhOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1ODg0Q1x1NTE2N1x1NTE2Q1x1NUYwRlx1NTQ4Q1x1NjU4N1x1NjcyQ1x1NEU0Qlx1OTU5M1x1NzY4NFx1N0E3QVx1NjgzQ1x1N0I1Nlx1NzU2NVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTVCOUFcdTdGQTlcdTg4NENcdTUxNjdcdTUxNkNcdTVGMEZcdTU0OENcdTY1ODdcdTY3MkNcdTRFNEJcdTk1OTNcdTc2ODRcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcIlxuICAgICAgICB9LFxuICAgICAgICBzcGFjZVN0cmF0ZWd5TGlua1RleHQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU5MDIzXHU3RDUwXHU1NDhDXHU2NTg3XHU2NzJDXHU0RTRCXHU5NTkzXHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NUI5QVx1N0ZBOSBbW3dpa2lsaW5rXV0gW21kbGlua10oLi4uKSBcdTU0OENcdTY1ODdcdTY3MkNcdTRFNEJcdTk1OTNcdTc2ODRcdTdBN0FcdTY4M0NcdTdCNTZcdTc1NjVcIlxuICAgICAgICB9LFxuICAgICAgICB1c2VyRGVmaW5lZFJlZ2V4cFN3aXRjaDoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTc1MjhcdTYyMzZcdTVCOUFcdTdGQTlcdTc2ODRcdTZCNjNcdTUyNDdcdTg4NjhcdTkwNTRcdTVGMEZcdTk1OEJcdTk1RENcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU4MUVBXHU1QjlBXHU3RkE5XHU2QjYzXHU1MjQ3XHU4ODY4XHU5MDU0XHU1RjBGXHU5NThCXHU5NURDXHVGRjBDXHU1MzM5XHU5MTREXHU1MjMwXHU3Njg0XHU1MTY3XHU1QkI5XHU0RTBEXHU5MDMyXHU4ODRDXHU2ODNDXHU1RjBGXHU1MzE2XHVGRjBDXHU0RTE0XHU1M0VGXHU0RUU1XHU4QTJEXHU3RjZFXHU1MzM5XHU5MTREXHU1MjMwXHU3Njg0XHU1MTY3XHU1QkI5XHU1ODRBXHU4MjA3XHU1MTc2XHU0RUQ2XHU1MTY3XHU1QkI5XHU0RTRCXHU5NTkzXHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCJcbiAgICAgICAgfSxcbiAgICAgICAgdXNlckRlZmluZWRSZWdleHA6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU3NTI4XHU2MjM2XHU1QjlBXHU3RkE5XHU3Njg0XHU2QjYzXHU1MjQ3XHU4ODY4XHU5MDU0XHU1RjBGXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NzUyOFx1NjIzNlx1ODFFQVx1NUI5QVx1N0ZBOVx1NkI2M1x1NTI0N1x1ODg2OFx1OTA1NFx1NUYwRlx1RkYwQ1x1NTMzOVx1OTE0RFx1NTIzMFx1NzY4NFx1NTE2N1x1NUJCOVx1NEUwRFx1OTAzMlx1ODg0Q1x1NjgzQ1x1NUYwRlx1NTMxNlx1RkYwQ1x1NkJDRlx1ODg0Q1x1NEUwMFx1NTAwQlx1ODg2OFx1OTA1NFx1NUYwRlx1RkYwQ1x1ODg0Q1x1NUMzRVx1NEUwRFx1ODk4MVx1OTZBOFx1NjEwRlx1NTJBMFx1N0E3QVx1NjgzQ1x1MzAwMlwiICtcbiAgICAgICAgICAgICAgICBcIlx1NkJDRlx1ODg0Q1x1NjcyQlx1NUMzRTNcdTUwMEJcdTVCNTdcdTdCMjZcdTc2ODRcdTU2RkFcdTVCOUFcdTcwQkF8XHU1NDhDXHU1MTY5XHU1MDBCXHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XHU3QjI2XHU4NjVGXHVGRjBDXHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XHU3QjI2XHU4NjVGXHU3MEJBLT0rXHVGRjBDXHU1MjA2XHU1MjI1XHU0RUUzXHU4ODY4XHU0RTBEXHU4OTgxXHU2QzQyXHU3QTdBXHU2ODNDKC0pXHVGRjBDXHU4RURGXHU3QTdBXHU2ODNDKD0pXHVGRjBDXHU1NkI0XHU2ODNDXHU3QTdBXHU2ODNDKCspXHUzMDAyXCIgK1xuICAgICAgICAgICAgICAgIFwiXHU5MDE5XHU1MTY5XHU1MDBCXHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XHU3QjI2XHU4NjVGXHU1MjA2XHU1MjI1XHU3MEJBXHU1MzM5XHU5MTREXHU1MzQwXHU1ODRBXHU3Njg0XHU1REU2XHU1M0YzXHU1MTY5XHU5MDhBXHU3Njg0XHU3QTdBXHU2ODNDXHU3QjU2XHU3NTY1XCJcbiAgICAgICAgfSxcbiAgICAgICAgZXhjbHVkZUZvbGRlcnNGaWxlczoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTYzOTJcdTk2NjRcdTY1ODdcdTRFRjZcdTU5M0UvXHU2NTg3XHU0RUY2XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1OEE3Mlx1NjNEMlx1NEVGNlx1NUMwN1x1NkJDRlx1ODg0Q1x1ODlFM1x1Njc5MFx1NzBCQVx1NEUwMFx1NTAwQlx1NjM5Mlx1OTY2NFx1NjU4N1x1NEVGNlx1NTkzRVx1NjIxNlx1NjU4N1x1NEVGNlx1MzAwMlx1NEY4Qlx1NTk4Mlx1RkYxQURhaWx5Tm90ZS8sIERhaWx5Tm90ZS9XZWVrTm90ZXMvLCBEYWlseU5vdGUvdGVzdC5tZFwiXG4gICAgICAgIH0sXG4gICAgICAgIGZpeE1hY09TQ29udGV4dE1lbnU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU0RkVFXHU1RkE5IE1hY09TIFx1NTNGM1x1OTM3NVx1ODNEQ1x1NTVBRVx1NTE0OVx1NkExOVx1NEY0RFx1N0Y2RVwiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTRGRUVcdTVGQTkgTWFjT1MgXHU5RjIwXHU2QTE5XHU1M0YzXHU5Mzc1XHU1NDdDXHU1MUZBXHU4M0RDXHU1NUFFXHU2NjQyXHU1MTQ5XHU2QTE5XHU4REYzXHU1MjMwXHU0RTBCXHU0RTAwXHU4ODRDXHU3Njg0XHU1NTRGXHU5ODRDIChcdTk3MDBcdTg5ODFcdTkxQ0RcdTU1NUYgT2JzaWRpYW4gXHU3NTFGXHU2NTQ4KVwiXG4gICAgICAgIH0sXG4gICAgICAgIGZpeE1pY3Jvc29mdElNRToge1xuICAgICAgICAgICAgbmFtZTogXCJcdTRGRUVcdTVGQTlcdTVGQUVcdThFREZcdThGMzhcdTUxNjVcdTZDRDVcdTU1NEZcdTk4NENcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU5MDY5XHU5MTREXHU4MjBBXHU3MjQ4XHU1RkFFXHU4RURGXHU4RjM4XHU1MTY1XHU2Q0Q1XCJcbiAgICAgICAgfSxcbiAgICAgICAgc3RyaWN0TGluZUJyZWFrczoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTU2QjRcdTY4M0NcdTYzREJcdTg4NENcdTZBMjFcdTVGMEZcdTRFMEJcdTYzMDlcdTUxNjlcdTZCMjFcdTU2REVcdThFQ0FcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1NkI0XHU2ODNDXHU2M0RCXHU4ODRDXHU3Njg0XHU4QTJEXHU3RjZFXHU0RTBCXHVGRjBDXHU1NzI4XHU2NjZFXHU5MDFBXHU2NTg3XHU2NzJDXHU4ODRDXHU5MDMyXHU4ODRDXHU0RTAwXHU2QjIxXHU1NkRFXHU4RUNBXHU2NzAzXHU3NTIyXHU3NTFGXHU1MTY5XHU1MDBCXHU2M0RCXHU4ODRDXHU3QjI2XCJcbiAgICAgICAgfSxcbiAgICAgICAgcHVuY1JlY3RpZnk6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU2QTE5XHU5RURFXHU3N0VCXHU2QjYzXCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NTBDNVx1NTcyOFx1OEYzOFx1NTE2NVx1OTA0RVx1N0EwQlx1NEUyRFx1RkYwQ1x1NEUyRFx1NjU4N1x1OTU5M1x1NzY4NFx1ODJGMVx1NjU4N1x1NkExOVx1OUVERVx1RkYwOCwuPyFcdUZGMDlcdTgxRUFcdTUyRDVcdThGNDlcdTYzREJcdTcwQkFcdTUxNjhcdTg5RDJcdUZGMDhcdTUzRUZcdTUzRDZcdTZEODhcdUZGMDlcIlxuICAgICAgICB9LFxuICAgICAgICBwcmludERlYnVnSW5mbzoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTU3MjhcdTYzQTdcdTUyMzZcdTUzRjBcdThGMzhcdTUxRkFcdThBQkZcdThBNjZcdThDQzdcdThBMEFcIixcbiAgICAgICAgICAgIGRlc2M6IFwiXHU1NzI4XHU2M0E3XHU1MjM2XHU1M0YwXHU4RjM4XHU1MUZBXHU4QUJGXHU4QTY2XHU4Q0M3XHU4QTBBXCJcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uUmVwbGFjZVJ1bGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU5MDc4XHU0RTJEXHU2NkZGXHU2M0RCXHU4OThGXHU1MjQ3XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1NzUyOFx1NjIzNlx1NUI5QVx1N0ZBOVx1NzY4NFx1OTA3OFx1NEUyRFx1NjZGRlx1NjNEQlx1ODk4Rlx1NTI0N1wiXG4gICAgICAgIH0sXG4gICAgICAgIGRlbGV0ZVJ1bGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1MjJBXHU5NjY0XHU4OThGXHU1MjQ3XCIsXG4gICAgICAgICAgICBkZXNjOiBcIlx1ODk4Rlx1NTI0N1x1RkYxQVx1NzUyOCB8IFx1NEVFM1x1ODg2OFx1NTE0OVx1NkExOVx1NEY0RFx1N0Y2RVx1RkYwQ1x1NUZDNVx1OTgwOFx1NTMwNVx1NTQyQlx1NTE0OVx1NkExOVx1MzAwMlx1NjNEMFx1NzkzQVx1RkYxQVx1NEY3Rlx1NzUyOCB8IFx1ODg2OFx1NzkzQVx1NTE0OVx1NkExOVx1NEY0RFx1N0Y2RVx1MzAwMlwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnZlcnRSdWxlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1OEY0OVx1NjNEQlx1ODk4Rlx1NTI0N1wiLFxuICAgICAgICAgICAgZGVzYzogXCJcdTg5OEZcdTUyNDdcdUZGMUFcdTc1MjggfCBcdTRFRTNcdTg4NjhcdTUxNDlcdTZBMTlcdTRGNERcdTdGNkVcdUZGMENcdTVGQzVcdTk4MDhcdTUzMDVcdTU0MkJcdTUxNDlcdTZBMTlcdTMwMDJcdTYzRDBcdTc5M0FcdUZGMUFcdTRGN0ZcdTc1MjggfCBcdTg4NjhcdTc5M0FcdTUxNDlcdTZBMTlcdTRGNERcdTdGNkVcdTMwMDJcIlxuICAgICAgICB9LFxuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1ODlGOFx1NzY3Q1x1NTY2OFwiXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1REU2XCJcbiAgICAgICAgfSxcbiAgICAgICAgcmlnaHQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiXHU1M0YzXCJcbiAgICAgICAgfSxcbiAgICAgICAgb2xkUGF0dGVybjoge1xuICAgICAgICAgICAgbmFtZTogXCJcdTgyMEFcdTZBMjFcdTVGMEZcIlxuICAgICAgICB9LFxuICAgICAgICBuZXdQYXR0ZXJuOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlx1NjVCMFx1NkEyMVx1NUYwRlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICAgbWFpbjogXCJPYnNpZGlhbiBFYXN5VHlwaW5nIFx1NjNEMlx1NEVGNlwiLFxuICAgICAgICBnaXRodWJEZXRhaWw6IFwiXHU4QTczXHU2MEM1XHU4OThCIEdpdGh1Ylx1RkYxQVwiLFxuICAgICAgICBlbmhhbmNlZEVkaXRpbmc6IFwiXHU1ODlFXHU1RjM3XHU3REU4XHU4RjJGXHU4QTJEXHU3RjZFXCIsXG4gICAgICAgIGN1c3RvbWl6ZUVkaXRSdWxlOiBcIlx1ODFFQVx1NUI5QVx1N0ZBOVx1N0RFOFx1OEYyRlx1OEY0OVx1NjNEQlx1ODk4Rlx1NTI0N1wiLFxuICAgICAgICBhdXRvZm9ybWF0U2V0dGluZzogXCJcdTgxRUFcdTUyRDVcdTY4M0NcdTVGMEZcdTUzMTZcdThBMkRcdTdGNkVcIixcbiAgICAgICAgZGV0YWlsZWRTZXR0aW5nOiBcIlx1OEE3M1x1N0QzMFx1OEEyRFx1N0Y2RVx1NTk4Mlx1NEUwQlwiLFxuICAgICAgICBjdXN0b21SZWdleHBCbG9jazogXCJcdTgxRUFcdTVCOUFcdTdGQTlcdTZCNjNcdTUyNDdcdTUzNDBcdTU4NEFcIixcbiAgICAgICAgZXhjbHVkZUZvbGRlcnNGaWxlczogXCJcdTYzMDdcdTVCOUFcdTY1ODdcdTRFRjZcdTRFMERcdTgxRUFcdTUyRDVcdTY4M0NcdTVGMEZcdTUzMTZcIixcbiAgICAgICAgZXhwZXJpbWVudGFsRmVhdHVyZXM6IFwiXHU1QkU2XHU5QTU3XHU1MjlGXHU4MEZEXCIsXG4gICAgICAgIGFib3V0UmVnZXhwOiB7XG4gICAgICAgICAgICBoZWFkZXI6IFwiXHU2QjYzXHU1MjQ3XHU4ODY4XHU5MDU0XHU1RjBGXHU3NkY4XHU5NURDXHU3N0U1XHU4QjU4XHVGRjBDXHU4OThCIFwiLFxuICAgICAgICAgICAgdGV4dDogXCJcdTMwMEFcdTk2MkVcdTRFMDBcdTVDRjBcdUZGMUFcdTZCNjNcdTUyNDdcdTg4NjhcdTkwNTRcdTVGMEZcdTdDMjFcdTY2MEVcdTY1NTlcdTdBMEJcdTMwMEJcIixcbiAgICAgICAgfSxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zUmVnZXhwOiB7XG4gICAgICAgICAgICBoZWFkZXI6IFwiXHU2QjYzXHU1MjQ3XHU4ODY4XHU5MDU0XHU1RjBGXHU4OThGXHU1MjQ3XHU0RjdGXHU3NTI4XHU4QUFBXHU2NjBFXHU4MjA3XHU3OTNBXHU0RjhCXHVGRjFBIFwiLFxuICAgICAgICAgICAgdGV4dDogXCJcdTgxRUFcdTVCOUFcdTdGQTlcdTZCNjNcdTUyNDdcdTg4NjhcdTkwNTRcdTVGMEZcdTg5OEZcdTUyNDdcIixcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9taXplU2VsZWN0aW9uUnVsZTogXCJcdTgxRUFcdTVCOUFcdTdGQTlcdTkwNzhcdTRFMkRcdTY1ODdcdTY3MkNcdTdERThcdThGMkZcdTU4OUVcdTVGM0FcdTg5OEZcdTUyNDdcIixcbiAgICAgICAgY3VzdG9taXplRGVsZXRlUnVsZTogXCJcdTgxRUFcdTVCOUFcdTdGQTlcdTUyMkFcdTk2NjRcdTdERThcdThGMkZcdTU4OUVcdTVGM0FcdTg5OEZcdTUyNDdcIixcbiAgICAgICAgY3VzdG9taXplQ29udmVydFJ1bGU6IFwiXHU4MUVBXHU1QjlBXHU3RkE5XHU3REU4XHU4RjJGXHU4RjQ5XHU2M0RCXHU4OThGXHU1MjQ3XCIsXG4gICAgICAgIGVkaXRTZWxlY3Rpb25SZXBsYWNlUnVsZTogXCJcdTdERThcdThGMkZcdTkwNzhcdTRFMkRcdTY2RkZcdTYzREJcdTg5OEZcdTUyNDdcIixcbiAgICB9LFxuICAgIGRyb3Bkb3duT3B0aW9uczoge1xuICAgICAgICBvbmx5V2hlblR5cGluZzogXCJcdThGMzhcdTUxNjVcdTY2NDJcdTc1MUZcdTY1NDhcIixcbiAgICAgICAgZ2xvYmFsbHk6IFwiXHU1MTY4XHU1QzQwXHU3NTFGXHU2NTQ4XCIsXG4gICAgICAgIG5vUmVxdWlyZTogXCJcdTcxMjFcdTg5ODFcdTZDNDJcIixcbiAgICAgICAgc29mdFNwYWNlOiBcIlx1OEVERlx1N0E3QVx1NjgzQ1wiLFxuICAgICAgICBzdHJpY3RTcGFjZTogXCJcdTU2QjRcdTY4M0NcdTdBN0FcdTY4M0NcIixcbiAgICAgICAgZHVtbXk6IFwiXHU1NDQ2XHU3QTdBXHU2ODNDXCIsXG4gICAgICAgIHNtYXJ0OiBcIlx1NjY3QVx1ODBGRFx1N0E3QVx1NjgzQ1wiXG4gICAgfSxcbiAgICB0b29sVGlwOiB7XG4gICAgICAgIHN3aXRjaDogXCJcdTUyOUZcdTgwRkRcdTk1OEJcdTk1RENcIixcbiAgICAgICAgZWRpdFJ1bGU6IFwiXHU3REU4XHU4RjJGXHU4OThGXHU1MjQ3XCIsXG4gICAgICAgIHJlbW92ZVJ1bGU6IFwiXHU1MjJBXHU5NjY0XHU4OThGXHU1MjQ3XCIsXG4gICAgICAgIGFkZFJ1bGU6IFwiXHU2REZCXHU1MkEwXHU4OThGXHU1MjQ3XCIsXG4gICAgfSxcbiAgICBwbGFjZUhvbGRlcjoge1xuICAgICAgICB0cmlnZ2VyU3ltYm9sOiBcIlx1ODlGOFx1NzY3Q1x1N0IyNlwiLFxuICAgICAgICBuZXdMZWZ0U2lkZVN0cmluZzogXCJcdTVERTZcdTkwOEFcdTdCMjZcdTg2NUZcIixcbiAgICAgICAgbmV3UmlnaHRTaWRlU3RyaW5nOiBcIlx1NTNGM1x1OTA4QVx1N0IyNlx1ODY1RlwiLFxuICAgICAgICBhZGRSdWxlOiBcIlx1NkRGQlx1NTJBMFx1ODk4Rlx1NTI0N1wiLFxuICAgICAgICBub3RpY2VJbnZhaWRUcmlnZ2VyOiBcIlx1NzEyMVx1NjU0OFx1NzY4NFx1ODlGOFx1NzY3Q1x1N0IyNiwgXHU4OUY4XHU3NjdDXHU3QjI2XHU1RkM1XHU5ODA4XHU2NjJGXHU1NUFFXHU1QjU3XHU3QjI2XHU2MjE2XHU4MDA1XHU2NjJGIFx1MjAxNFx1MjAxNFx1MzAwMVx1MjAyNlx1MjAyNlwiLFxuICAgICAgICBub3RpY2VXYXJuVHJpZ2dlckV4aXN0czogXCJcdTcxMjFcdTY1NDhcdTg5OEZcdTUyNDchIFx1ODlGOFx1NzY3Q1x1N0IyNiAlcyBcdTVERjJcdTVCNThcdTU3MjhcIixcbiAgICAgICAgbm90aWNlTWlzc2luZ0lucHV0OiBcIm1pc3NpbmcgaW5wdXRcIixcbiAgICAgICAgYmVmb3JlRGVsZXRlOiBcIlx1NTIyQVx1OTY2NFx1NTI0RHxcIixcbiAgICAgICAgbmV3UGF0dGVybjogXCJcdTg5RjhcdTc2N0NcdTg5OEZcdTUyNDdcdTVGOENcdTVCNTdcdTRFMzJcdTZBMjFcdTVGMEZcIixcbiAgICAgICAgbm90aWNlSW52YWlkVHJpZ2dlclBhdHRlcm5Db250YWluU3ltYm9sOiBcIlx1NzEyMVx1NjU0OFx1ODk4Rlx1NTI0NywgXHU4RjQ5XHU2M0RCXHU1MjREXHU2QTIxXHU1RjBGXHU1RkM1XHU5ODA4XHU1MzA1XHU1NDJCXHU0RUUzXHU4ODY4XHU1MTQ5XHU2QTE5XHU0RjREXHU3RjZFXHU3Njg0XHU3QjI2XHU4NjVGIHxcIixcbiAgICAgICAgYmVmb3JlQ29udmVydDogXCJcdThGNDlcdTYzREJcdTUyNER8XCIsXG4gICAgICAgIG5vdGljZUludmFsaWRQYXR0ZXJuU3RyaW5nOiBcIkludmFsaWQgcGF0dGVybiBzdHJpbmchXCIsXG4gICAgfSxcbiAgICBidXR0b246IHtcbiAgICAgICAgdXBkYXRlOiBcIlx1NjZGNFx1NjVCMFwiLFxuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvY2FsZTsiLCAiaW1wb3J0IHsgZW5zdXJlU3ludGF4VHJlZSwgc3ludGF4VHJlZSB9IGZyb20gXCJAY29kZW1pcnJvci9sYW5ndWFnZVwiO1xuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5leHBvcnQgaW50ZXJmYWNlIENvZGVCbG9ja0luZm8ge1xuICAgIHN0YXJ0X3BvczogbnVtYmVyO1xuICAgIGVuZF9wb3M6IG51bWJlcjtcbiAgICBjb2RlX3N0YXJ0X3BvczogbnVtYmVyO1xuICAgIGNvZGVfZW5kX3BvczogbnVtYmVyO1xuICAgIGxhbmd1YWdlOiBzdHJpbmc7XG4gICAgaW5kZW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvZGVCbG9ja0luUG9zKHN0YXRlOiBFZGl0b3JTdGF0ZSwgcG9zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBsZXQgY29kZUJsb2NrSW5mb3MgPSBnZXRDb2RlQmxvY2tzSW5mb3Moc3RhdGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZUJsb2NrSW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvcyA+PSBjb2RlQmxvY2tJbmZvc1tpXS5zdGFydF9wb3MgJiYgcG9zIDw9IGNvZGVCbG9ja0luZm9zW2ldLmVuZF9wb3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvZGVCbG9ja0luZm9JblBvcyhzdGF0ZTogRWRpdG9yU3RhdGUsIHBvczogbnVtYmVyKTogQ29kZUJsb2NrSW5mbyB8IG51bGwge1xuICAgIGxldCBjb2RlQmxvY2tJbmZvcyA9IGdldENvZGVCbG9ja3NJbmZvcyhzdGF0ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2RlQmxvY2tJbmZvcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocG9zID49IGNvZGVCbG9ja0luZm9zW2ldLnN0YXJ0X3BvcyAmJiBwb3MgPD0gY29kZUJsb2NrSW5mb3NbaV0uZW5kX3Bvcykge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVCbG9ja0luZm9zW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Q29kZUJsb2NrSW5Qb3ModmlldzogRWRpdG9yVmlldywgcG9zOiBudW1iZXIpOmJvb2xlYW4ge1xuICAgIGxldCBjb2RlQmxvY2tJbmZvcyA9IGdldENvZGVCbG9ja3NJbmZvcyh2aWV3LnN0YXRlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVCbG9ja0luZm9zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwb3MgPj0gY29kZUJsb2NrSW5mb3NbaV0uc3RhcnRfcG9zICYmIHBvcyA8PSBjb2RlQmxvY2tJbmZvc1tpXS5lbmRfcG9zKSB7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yOiBjb2RlQmxvY2tJbmZvc1tpXS5jb2RlX3N0YXJ0X3BvcyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZDogY29kZUJsb2NrSW5mb3NbaV0uY29kZV9lbmRfcG9zXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2RlQmxvY2tzSW5mb3Moc3RhdGU6IEVkaXRvclN0YXRlKTogQ29kZUJsb2NrSW5mb1tde1xuICAgIGxldCBpc0NvZGVCbG9ja0JlZ2luID0gZmFsc2U7XG4gICAgbGV0IGNvZGVCbG9ja0luZm9zOiBDb2RlQmxvY2tJbmZvW10gPSBbXTtcbiAgICBsZXQgY3VyQ29kZUJsb2NrSW5mbzogQ29kZUJsb2NrSW5mbyB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGRvYyA9IHN0YXRlLmRvYztcblxuICAgIHN5bnRheFRyZWUoc3RhdGUpLml0ZXJhdGUoe1xuICAgICAgICBlbnRlcihub2RlKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IG5vZGUubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVGcm9tID0gbm9kZS5mcm9tO1xuICAgICAgICAgICAgY29uc3Qgbm9kZVRvID0gbm9kZS50bztcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUZXh0ID0gc3RhdGUuc2xpY2VEb2Mobm9kZUZyb20sIG5vZGVUbyk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhub2RlTmFtZSwgbm9kZUZyb20sIG5vZGVUbywgbm9kZVRleHQpO1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lLmluY2x1ZGVzKCdjb2RlYmxvY2stYmVnaW4nKSkge1xuICAgICAgICAgICAgICAgIGlzQ29kZUJsb2NrQmVnaW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydF9wb3MgPSBub2RlRnJvbSArIG5vZGVUZXh0LmluZGV4T2YoJ2AnKTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZW50ID0gc3RhcnRfcG9zIC0gc3RhdGUuZG9jLmxpbmVBdChzdGFydF9wb3MpLmZyb207XG4gICAgICAgICAgICAgICAgbGV0IGxhbmd1YWdlID0gbm9kZVRleHQudHJpbSgpLnN1YnN0cmluZygzKTtcbiAgICAgICAgICAgICAgICBjdXJDb2RlQmxvY2tJbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3M6IHN0YXJ0X3BvcyxcbiAgICAgICAgICAgICAgICAgICAgZW5kX3BvczogLTEsXG4gICAgICAgICAgICAgICAgICAgIGNvZGVfc3RhcnRfcG9zOiAtMSxcbiAgICAgICAgICAgICAgICAgICAgY29kZV9lbmRfcG9zOiAtMSxcbiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IGluZGVudFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUuaW5jbHVkZXMoJ2NvZGVibG9jay1lbmQnKSkge1xuICAgICAgICAgICAgICAgIGlzQ29kZUJsb2NrQmVnaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoY3VyQ29kZUJsb2NrSW5mbyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ckNvZGVCbG9ja0luZm8uZW5kX3BvcyA9IG5vZGVUbztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvYy5saW5lQXQoY3VyQ29kZUJsb2NrSW5mby5zdGFydF9wb3MpLm51bWJlciA9PVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jLmxpbmVBdChjdXJDb2RlQmxvY2tJbmZvLmVuZF9wb3MpLm51bWJlciAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckNvZGVCbG9ja0luZm8uY29kZV9zdGFydF9wb3MgPSBkb2MubGluZUF0KGN1ckNvZGVCbG9ja0luZm8uc3RhcnRfcG9zKS50bztcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckNvZGVCbG9ja0luZm8uY29kZV9lbmRfcG9zID0gZG9jLmxpbmVBdChjdXJDb2RlQmxvY2tJbmZvLnN0YXJ0X3BvcykudG87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29kZV9zdGFydF9saW5lID0gZG9jLmxpbmVBdChjdXJDb2RlQmxvY2tJbmZvLnN0YXJ0X3BvcykubnVtYmVyICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2RlX2VuZF9saW5lID0gZG9jLmxpbmVBdChjdXJDb2RlQmxvY2tJbmZvLmVuZF9wb3MpLm51bWJlciAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDb2RlQmxvY2tJbmZvLmNvZGVfc3RhcnRfcG9zID0gZG9jLmxpbmUoY29kZV9zdGFydF9saW5lKS5mcm9tICsgY3VyQ29kZUJsb2NrSW5mby5pbmRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJDb2RlQmxvY2tJbmZvLmNvZGVfZW5kX3BvcyA9IGRvYy5saW5lKGNvZGVfZW5kX2xpbmUpLnRvO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvZGVCbG9ja0luZm9zLnB1c2goY3VyQ29kZUJsb2NrSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIGN1ckNvZGVCbG9ja0luZm8gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGlzQ29kZUJsb2NrQmVnaW4gJiYgY3VyQ29kZUJsb2NrSW5mbykge1xuICAgICAgICBjdXJDb2RlQmxvY2tJbmZvLmVuZF9wb3MgPSBkb2MubGVuZ3RoO1xuICAgICAgICBjdXJDb2RlQmxvY2tJbmZvLmNvZGVfZW5kX3BvcyA9IGRvYy5sZW5ndGg7XG4gICAgICAgIGlmIChkb2MubGluZXMgPiBkb2MubGluZUF0KGN1ckNvZGVCbG9ja0luZm8uc3RhcnRfcG9zKS5udW1iZXIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydF9saW5lID0gZG9jLmxpbmVBdChjdXJDb2RlQmxvY2tJbmZvLnN0YXJ0X3BvcykubnVtYmVyICsgMTtcbiAgICAgICAgICAgIGxldCBjb2RlX3N0YXJ0X3BvcyA9IGRvYy5saW5lKHN0YXJ0X2xpbmUpLmZyb20gKyBjdXJDb2RlQmxvY2tJbmZvLmluZGVudDtcbiAgICAgICAgICAgIGN1ckNvZGVCbG9ja0luZm8uY29kZV9zdGFydF9wb3MgPSBjb2RlX3N0YXJ0X3BvcyA8IGRvYy5sZW5ndGggPyBjb2RlX3N0YXJ0X3BvcyA6XG4gICAgICAgICAgICAgICAgZG9jLmxpbmVBdChjdXJDb2RlQmxvY2tJbmZvLnN0YXJ0X3BvcyArIDEpLmZyb20gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VyQ29kZUJsb2NrSW5mby5jb2RlX3N0YXJ0X3BvcyA9IGRvYy5saW5lQXQoY3VyQ29kZUJsb2NrSW5mby5zdGFydF9wb3MpLnRvO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVCbG9ja0luZm9zLnB1c2goY3VyQ29kZUJsb2NrSW5mbyk7XG4gICAgICAgIGN1ckNvZGVCbG9ja0luZm8gPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY29kZUJsb2NrSW5mb3M7XG59XG5cbiIsICJpbXBvcnQgeyBFZGl0b3JWaWV3LCBEZWNvcmF0aW9uIH0gZnJvbSBcIkBjb2RlbWlycm9yL3ZpZXdcIjtcbmltcG9ydCB7IEVkaXRvclNlbGVjdGlvbiwgU3RhdGVFZmZlY3QsIFN0YXRlRmllbGQsIFRyYW5zYWN0aW9uIH0gZnJvbSBcIkBjb2RlbWlycm9yL3N0YXRlXCI7XG5pbXBvcnQgeyBUYWJzdG9wR3JvdXAgfSBmcm9tIFwiLi90YWJzdG9wXCI7XG5cbmV4cG9ydCBjb25zdCBhZGRUYWJzdG9wc0VmZmVjdCA9IFN0YXRlRWZmZWN0LmRlZmluZTxUYWJzdG9wR3JvdXBbXT4oKTtcbmNvbnN0IHJlbW92ZVRhYnN0b3BFZmZlY3QgPSBTdGF0ZUVmZmVjdC5kZWZpbmUoKTtcbmNvbnN0IHJlbW92ZUFsbFRhYnN0b3BzRWZmZWN0ID0gU3RhdGVFZmZlY3QuZGVmaW5lKCk7XG5cbmV4cG9ydCBjb25zdCB0YWJzdG9wc1N0YXRlRmllbGQgPSBTdGF0ZUZpZWxkLmRlZmluZTxUYWJzdG9wR3JvdXBbXT4oe1xuICAgIGNyZWF0ZSgpe1xuICAgICAgICByZXR1cm4gW107XG4gICAgfSxcblxuICAgIHVwZGF0ZSh2YWx1ZTogVGFic3RvcEdyb3VwW10sIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbil7XG4gICAgICAgIGxldCB0YWJzdG9wR3JvdXBzID0gdmFsdWU7XG5cdFx0dGFic3RvcEdyb3Vwcy5mb3JFYWNoKGdycCA9PiBncnAubWFwKHRyYW5zYWN0aW9uLmNoYW5nZXMpKTtcblxuXHRcdGZvciAoY29uc3QgZWZmZWN0IG9mIHRyYW5zYWN0aW9uLmVmZmVjdHMpIHtcblx0XHRcdGlmIChlZmZlY3QuaXMoYWRkVGFic3RvcHNFZmZlY3QpKSB7XG4gICAgICAgICAgICAgICAgdGFic3RvcEdyb3VwcyA9IFtdO1xuXHRcdFx0XHR0YWJzdG9wR3JvdXBzLnVuc2hpZnQoLi4uZWZmZWN0LnZhbHVlKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGVmZmVjdC5pcyhyZW1vdmVUYWJzdG9wRWZmZWN0KSkge1xuXHRcdFx0XHR0YWJzdG9wR3JvdXBzLnNoaWZ0KCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChlZmZlY3QuaXMocmVtb3ZlQWxsVGFic3RvcHNFZmZlY3QpKSB7XG5cdFx0XHRcdHRhYnN0b3BHcm91cHMgPSBbXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFic3RvcEdyb3VwcztcbiAgICB9LFxuXG4gICAgcHJvdmlkZTogKGZpZWxkKSA9PiB7XG5cdFx0cmV0dXJuIEVkaXRvclZpZXcuZGVjb3JhdGlvbnMub2YodmlldyA9PiB7XG5cdFx0XHQvLyBcIkZsYXR0ZW5cIiB0aGUgYXJyYXkgb2YgRGVjb3JhdGlvblNldHMgdG8gcHJvZHVjZSBhIHNpbmdsZSBEZWNvcmF0aW9uU2V0XG5cdFx0XHRjb25zdCB0YWJzdG9wR3JvdXBzID0gdmlldy5zdGF0ZS5maWVsZChmaWVsZCk7XG4gICAgICAgICAgICBcblx0XHRcdGNvbnN0IGRlY29zID0gW107XG5cblx0XHRcdGlmICh0YWJzdG9wR3JvdXBzLmxlbmd0aCA+PSAyKXtcblx0XHRcdFx0ZGVjb3MucHVzaCguLi50YWJzdG9wR3JvdXBzWzFdLmdldERlY29SYW5nZXMoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBEZWNvcmF0aW9uLnNldChkZWNvcywgdHJ1ZSk7XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJzdG9wR3JvdXBzRnJvbVZpZXcodmlldzogRWRpdG9yVmlldykge1xuXHRjb25zdCBjdXJyZW50VGFic3RvcEdyb3VwcyA9IHZpZXcuc3RhdGUuZmllbGQodGFic3RvcHNTdGF0ZUZpZWxkKTtcblxuXHRyZXR1cm4gY3VycmVudFRhYnN0b3BHcm91cHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRUYWJzdG9wcyh2aWV3OiBFZGl0b3JWaWV3LCB0YWJzdG9wR3JvdXBzOiBUYWJzdG9wR3JvdXBbXSkge1xuXHR2aWV3LmRpc3BhdGNoKHtcblx0XHRlZmZlY3RzOiBbYWRkVGFic3RvcHNFZmZlY3Qub2YodGFic3RvcEdyb3VwcyldLFxuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRhYnN0b3AodmlldzogRWRpdG9yVmlldykge1xuXHR2aWV3LmRpc3BhdGNoKHtcblx0XHRlZmZlY3RzOiBbcmVtb3ZlVGFic3RvcEVmZmVjdC5vZihudWxsKV0sXG5cdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQWxsVGFic3RvcHModmlldzogRWRpdG9yVmlldykge1xuXHR2aWV3LmRpc3BhdGNoKHtcblx0XHRlZmZlY3RzOiBbcmVtb3ZlQWxsVGFic3RvcHNFZmZlY3Qub2YobnVsbCldLFxuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRhYnN0b3BzQW5kU2VsZWN0KHZpZXc6IEVkaXRvclZpZXcsIHRhYnN0b3BHcm91cHM6IFRhYnN0b3BHcm91cFtdKSB7XG4gICAgYWRkVGFic3RvcHModmlldywgdGFic3RvcEdyb3Vwcyk7XG4gICAgdGFic3RvcEdyb3Vwc1swXS5zZWxlY3QodmlldywgZmFsc2UpO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB0aWR5VGFic3RvcHModmlldzogRWRpdG9yVmlldykge1xuXHQvLyBDbGVhciBhbGwgdGFic3RvcCBncm91cHMgaWYgdGhlcmUncyBqdXN0IG9uZSByZW1haW5pbmdcblx0Y29uc3QgY3VycmVudFRhYnN0b3BHcm91cHMgPSBnZXRUYWJzdG9wR3JvdXBzRnJvbVZpZXcodmlldyk7XG5cblx0aWYgKGN1cnJlbnRUYWJzdG9wR3JvdXBzLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJlbW92ZUFsbFRhYnN0b3BzKHZpZXcpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luc2lkZUFUYWJzdG9wKHZpZXc6IEVkaXRvclZpZXcpOmJvb2xlYW4ge1xuXHRjb25zdCBjdXJyZW50VGFic3RvcEdyb3VwcyA9IGdldFRhYnN0b3BHcm91cHNGcm9tVmlldyh2aWV3KTtcblxuXHRmb3IgKGNvbnN0IHRhYnN0b3BHcm91cCBvZiBjdXJyZW50VGFic3RvcEdyb3Vwcykge1xuXHRcdGlmICh0YWJzdG9wR3JvdXAuY29udGFpbnNTZWxlY3Rpb24odmlldy5zdGF0ZS5zZWxlY3Rpb24pKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luc2lkZUN1clRhYnN0b3AodmlldzogRWRpdG9yVmlldyk6Ym9vbGVhbiB7XG5cdGNvbnN0IGN1cnJlbnRUYWJzdG9wR3JvdXBzID0gZ2V0VGFic3RvcEdyb3Vwc0Zyb21WaWV3KHZpZXcpO1xuXG5cdGlmIChjdXJyZW50VGFic3RvcEdyb3Vwcy5sZW5ndGg+MSAmJiBjdXJyZW50VGFic3RvcEdyb3Vwc1swXS5jb250YWluc1NlbGVjdGlvbih2aWV3LnN0YXRlLnNlbGVjdGlvbikpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVBbmRHb3RvTmV4dFRhYnN0b3AodmlldzogRWRpdG9yVmlldyk6IGJvb2xlYW4ge1xuICAgIC8vIGNvbnNvbGUubG9nKCdiZWZvcmUtY29uc3VtZScsIGdldFRhYnN0b3BHcm91cHNGcm9tVmlldyh2aWV3KSlcblx0Ly8gQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgY3VycmVudGx5IGFueSB0YWJzdG9wc1xuXHRpZiAoZ2V0VGFic3RvcEdyb3Vwc0Zyb21WaWV3KHZpZXcpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG5cdC8vIFJlbW92ZSB0aGUgdGFic3RvcCB0aGF0IHdlJ3JlIGluc2lkZSBvZlxuXHRyZW1vdmVUYWJzdG9wKHZpZXcpO1xuXG5cdC8vIFNlbGVjdCB0aGUgbmV4dCB0YWJzdG9wXG5cdGNvbnN0IG9sZFNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuXHRjb25zdCBuZXh0R3JwID0gZ2V0VGFic3RvcEdyb3Vwc0Zyb21WaWV3KHZpZXcpWzBdO1xuXHRpZiAoIW5leHRHcnApIHJldHVybiBmYWxzZTtcblxuXHQvLyBJZiB0aGUgb2xkIHRhYnN0b3AocykgbGllIHdpdGhpbiB0aGUgbmV3IHRhYnN0b3AocyksIHNpbXBseSBtb3ZlIHRoZSBjdXJzb3Jcblx0Y29uc3Qgc2hvdWxkTW92ZVRvRW5kcG9pbnRzID0gbmV4dEdycC5jb250YWluc1NlbGVjdGlvbihvbGRTZWwpO1xuXHRuZXh0R3JwLnNlbGVjdCh2aWV3LCBzaG91bGRNb3ZlVG9FbmRwb2ludHMpO1xuXG5cdC8vIElmIHdlIGhhdmVuJ3QgbW92ZWQsIGdvIGFnYWluXG5cdGNvbnN0IG5ld1NlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuXG5cdGlmIChvbGRTZWwuZXEobmV3U2VsKSlcblx0XHRyZXR1cm4gY29uc3VtZUFuZEdvdG9OZXh0VGFic3RvcCh2aWV3KTtcblxuXHQvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCB0YWJzdG9wIGdyb3VwIHdhaXRpbmcgdG8gYmUgc2VsZWN0ZWQsIHJlbW92ZSBpdFxuXHR0aWR5VGFic3RvcHModmlldyk7XG4gICAgLy8gY29uc29sZS5sb2coJ2FmdGVyLWNvbnN1bWUnLCBnZXRUYWJzdG9wR3JvdXBzRnJvbVZpZXcodmlldykpXG5cdHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCB7IENoYW5nZURlc2MsIEVkaXRvclNlbGVjdGlvbiwgU2VsZWN0aW9uUmFuZ2UgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivc3RhdGVcIjtcbmltcG9ydCB7IERlY29yYXRpb24sIERlY29yYXRpb25TZXQsIEVkaXRvclZpZXcsIFdpZGdldFR5cGUgfSBmcm9tIFwiQGNvZGVtaXJyb3Ivdmlld1wiO1xuXG5cbmNvbnN0IFRBQlNUT1BfREVDT19DTEFTUyA9IFwiZWFzeS10eXBpbmctdGFic3RvcHNcIjtcbmNvbnN0IENVUlNPUl9XSURHRVRfQ0xBU1MgPSBcImVhc3ktdHlwaW5nLWN1cnNvci13aWRnZXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUYWJzdG9wU3BlYyB7XG4gICAgbnVtYmVyOiBudW1iZXIsXG4gICAgZnJvbTogbnVtYmVyLFxuICAgIHRvOiBudW1iZXJcbn1cblxuZnVuY3Rpb24gZ2V0TWFya2VyRGVjb3JhdGlvbihmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBgJHtUQUJTVE9QX0RFQ09fQ0xBU1N9YDtcblxuICAgIGlmIChmcm9tPT10byl7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uLndpZGdldCh7XG4gICAgICAgICAgICB3aWRnZXQ6IG5ldyBDdXJzb3JXaWRnZXQoKSxcbiAgICAgICAgICAgIHNpZGU6IDEsXG4gICAgICAgIH0pLnJhbmdlKGZyb20pO1xuICAgIH1cblxuICAgIHJldHVybiBEZWNvcmF0aW9uLm1hcmsoe1xuICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgIGNsYXNzOiBjbGFzc05hbWUsXG4gICAgfSkucmFuZ2UoZnJvbSwgdG8pO1xufVxuXG5leHBvcnQgY2xhc3MgVGFic3RvcEdyb3VwIHtcbiAgICBkZWNvczogRGVjb3JhdGlvblNldDtcbiAgICBzZWxlY3Rpb25zOiBTZWxlY3Rpb25SYW5nZVtdO1xuXG4gICAgY29uc3RydWN0b3IodGFic3RvcFNwZWNzOiBUYWJzdG9wU3BlY1tdKSB7XG4gICAgICAgIC8vIGNvbnN0IHRhYnN0b3BTcGVjc1JhbmdlID0gdGFic3RvcFNwZWNzLmZpbHRlcihzcGVjID0+IHNwZWMuZnJvbSAhPSBzcGVjLnRvKTtcbiAgICAgICAgY29uc3QgZGVjb3MgPSB0YWJzdG9wU3BlY3MubWFwKHNwZWMgPT4gZ2V0TWFya2VyRGVjb3JhdGlvbihzcGVjLmZyb20sIHNwZWMudG8pKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zID0gdGFic3RvcFNwZWNzLm1hcChzcGVjID0+IEVkaXRvclNlbGVjdGlvbi5yYW5nZShzcGVjLmZyb20sIHNwZWMudG8pKTtcbiAgICAgICAgdGhpcy5kZWNvcyA9IERlY29yYXRpb24uc2V0KGRlY29zLCB0cnVlKTtcbiAgICB9XG5cbiAgICBzZWxlY3QodmlldzogRWRpdG9yVmlldywgc2VsZWN0RW5kcG9pbnRzOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHNlbCA9IHRoaXMudG9FZGl0b3JTZWxlY3Rpb24oKTtcbiAgICAgICAgY29uc3QgdG9TZWxlY3QgPSBzZWxlY3RFbmRwb2ludHMgPyBnZXRFZGl0b3JTZWxlY3Rpb25FbmRwb2ludHMoc2VsKSA6IHNlbDtcblxuICAgICAgICB2aWV3LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHNlbGVjdGlvbjogdG9TZWxlY3QsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvU2VsZWN0aW9uUmFuZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zO1xuICAgIH1cblxuICAgIHRvRWRpdG9yU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLmNyZWF0ZSh0aGlzLnRvU2VsZWN0aW9uUmFuZ2VzKCkpO1xuICAgIH1cblxuICAgIGNvbnRhaW5zU2VsZWN0aW9uKHNlbGVjdGlvbjogRWRpdG9yU2VsZWN0aW9uKSB7XG4gICAgICAgIGZ1bmN0aW9uIHJhbmdlTGllc1dpdGhpblNlbGVjdGlvbihyYW5nZTogU2VsZWN0aW9uUmFuZ2UsIHNlbDogU2VsZWN0aW9uUmFuZ2VbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZWxSYW5nZSBvZiBzZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsUmFuZ2UuZnJvbSA8PSByYW5nZS5mcm9tICYmIHNlbFJhbmdlLnRvID49IHJhbmdlLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCB0YWJzdG9wUmFuZ2VzID0gdGhpcy50b1NlbGVjdGlvblJhbmdlcygpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICBcbiAgICAgICAgZm9yIChjb25zdCByYW5nZSBvZiBzZWxlY3Rpb24ucmFuZ2VzKSB7XG4gICAgICAgICAgICBpZiAoIXJhbmdlTGllc1dpdGhpblNlbGVjdGlvbihyYW5nZSwgdGFic3RvcFJhbmdlcykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIG1hcChjaGFuZ2VzOiBDaGFuZ2VEZXNjKSB7XG4gICAgICAgIHRoaXMuZGVjb3MgPSB0aGlzLmRlY29zLm1hcChjaGFuZ2VzKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zID0gdGhpcy5zZWxlY3Rpb25zLm1hcChyYW5nZSA9PiB7XG4gICAgICAgICAgICBsZXQgcmFuZ2VGcm9tID0gY2hhbmdlcy5tYXBQb3MocmFuZ2UuZnJvbSwgLTEpO1xuICAgICAgICAgICAgbGV0IHJhbmdlVG8gPSBjaGFuZ2VzLm1hcFBvcyhyYW5nZS50bywgMSk7XG4gICAgICAgICAgICByZXR1cm4gRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHJhbmdlRnJvbSwgcmFuZ2VUbyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBnZXREZWNvUmFuZ2VzKCkge1xuICAgICAgICBjb25zdCByYW5nZXMgPSBbXTtcbiAgICAgICAgY29uc3QgY3VyID0gdGhpcy5kZWNvcy5pdGVyKCk7XG5cbiAgICAgICAgd2hpbGUgKGN1ci52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3VyLmZyb20gIT0gY3VyLnRvKXtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChjdXIudmFsdWUucmFuZ2UoY3VyLmZyb20sIGN1ci50bykpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2goY3VyLnZhbHVlLnJhbmdlKGN1ci5mcm9tKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByYW5nZXMucHVzaChjdXIudmFsdWUucmFuZ2UoY3VyLmZyb20sIGN1ci50bykpO1xuICAgICAgICAgICAgY3VyLm5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByYW5nZXM7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFic3RvcFNwZWNzVG9UYWJzdG9wR3JvdXBzKHRhYnN0b3BzOiBUYWJzdG9wU3BlY1tdKTpUYWJzdG9wR3JvdXBbXSB7XG4gICAgY29uc3QgdGFic3RvcHNCeU51bWJlcjoge1tuOiBzdHJpbmddOiBUYWJzdG9wU3BlY1tdfSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCB0YWJzdG9wIG9mIHRhYnN0b3BzKSB7XG4gICAgICAgIGNvbnN0IG4gPSBTdHJpbmcodGFic3RvcC5udW1iZXIpO1xuXG4gICAgICAgIGlmICh0YWJzdG9wc0J5TnVtYmVyW25dKSB7XG4gICAgICAgICAgICB0YWJzdG9wc0J5TnVtYmVyW25dLnB1c2godGFic3RvcCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuICAgICAgICAgICAgdGFic3RvcHNCeU51bWJlcltuXSA9IFt0YWJzdG9wXTtcblx0XHR9XG5cdH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IG51bWJlcnMgPSBPYmplY3Qua2V5cyh0YWJzdG9wc0J5TnVtYmVyKTtcbiAgICBudW1iZXJzLnNvcnQoKGEsYikgPT4gcGFyc2VJbnQoYSkgLSBwYXJzZUludChiKSk7XG5cbiAgICBmb3IgKGNvbnN0IG51bWJlciBvZiBudW1iZXJzKSB7XG4gICAgICAgIGNvbnN0IGdycCA9IG5ldyBUYWJzdG9wR3JvdXAodGFic3RvcHNCeU51bWJlcltudW1iZXJdKTtcbiAgICAgICAgcmVzdWx0LnB1c2goZ3JwKTtcbiAgICB9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkaXRvclNlbGVjdGlvbkVuZHBvaW50cyhzZWw6IEVkaXRvclNlbGVjdGlvbikge1xuICAgIGNvbnN0IGVuZHBvaW50cyA9IHNlbC5yYW5nZXMubWFwKHJhbmdlID0+IEVkaXRvclNlbGVjdGlvbi5yYW5nZShyYW5nZS50bywgcmFuZ2UudG8pKTtcblxuICAgIHJldHVybiBFZGl0b3JTZWxlY3Rpb24uY3JlYXRlKGVuZHBvaW50cyk7XG59XG5cbmNsYXNzIEN1cnNvcldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuXG4gICAgZXEod2lkZ2V0OiBXaWRnZXRUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRvRE9NKHZpZXc6IEVkaXRvclZpZXcpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGN1cnNvckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIGN1cnNvckVsLmNsYXNzTmFtZSA9IGAke0NVUlNPUl9XSURHRVRfQ0xBU1N9YDtcbiAgICAgICAgY3Vyc29yRWwudGV4dENvbnRlbnQgPSAnfCc7XG4gICAgICAgIHJldHVybiBjdXJzb3JFbDtcbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBRUEsS0FBQyxXQUFXO0FBQ1I7QUFFQSxVQUFJLEtBQUs7QUFBQSxRQUNMLFlBQVk7QUFBQSxRQUNaLFVBQVU7QUFBQSxRQUNWLFVBQVU7QUFBQSxRQUNWLGVBQWU7QUFBQSxRQUNmLFFBQVE7QUFBQSxRQUNSLGFBQWE7QUFBQSxRQUNiLE1BQU07QUFBQSxRQUNOLFVBQVU7QUFBQSxRQUNWLE1BQU07QUFBQSxRQUNOLFFBQVE7QUFBQSxRQUNSLGFBQWE7QUFBQSxRQUNiLEtBQUs7QUFBQSxRQUNMLFlBQVk7QUFBQSxRQUNaLGNBQWM7QUFBQSxRQUNkLE1BQU07QUFBQSxNQUNWO0FBRUEsd0JBQWlCLEtBQUs7QUFFbEIsZUFBTyxlQUFlLGNBQWMsR0FBRyxHQUFHLFNBQVM7QUFBQSxNQUN2RDtBQUVBLHdCQUFrQixLQUFLLE1BQU07QUFDekIsZUFBTyxTQUFRLE1BQU0sTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFBQSxNQUN2RDtBQUVBLDhCQUF3QixZQUFZLE1BQU07QUFDdEMsWUFBSSxTQUFTLEdBQUcsY0FBYyxXQUFXLFFBQVEsS0FBSyxTQUFTLElBQUksR0FBRyxHQUFHLElBQUksS0FBSyxlQUFlLFlBQVksYUFBYTtBQUMxSCxhQUFLLElBQUksR0FBRyxJQUFJLGFBQWEsS0FBSztBQUM5QixjQUFJLE9BQU8sV0FBVyxPQUFPLFVBQVU7QUFDbkMsc0JBQVUsV0FBVztBQUFBLFVBQ3pCLFdBQ1MsT0FBTyxXQUFXLE9BQU8sVUFBVTtBQUN4QyxpQkFBSyxXQUFXO0FBQ2hCLGdCQUFJLEdB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
|