You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
802 lines
164 KiB
802 lines
164 KiB
'use strict';
|
|
|
|
var obsidian = require('obsidian');
|
|
|
|
/******************************************************************************
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
***************************************************************************** */
|
|
|
|
function __awaiter(thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
}
|
|
|
|
function getAllExpandersQuery(content) {
|
|
let accum = [];
|
|
for (var i = 0; i < content.length; i++) {
|
|
const line = content[i];
|
|
if (line === '```expander') {
|
|
for (var e = 0; e < content.length - i; e++) {
|
|
const nextline = content[i + e];
|
|
if (nextline === '```') {
|
|
accum.push({
|
|
start: i,
|
|
end: i + e,
|
|
query: content[i + 1],
|
|
template: e > 2 ? content.slice(i + 2, i + e).join('\n') : ''
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return accum;
|
|
}
|
|
function getClosestQuery(queries, lineNumber) {
|
|
if (queries.length === 0) {
|
|
return undefined;
|
|
}
|
|
return queries.reduce((a, b) => {
|
|
return Math.abs(b.start - lineNumber) < Math.abs(a.start - lineNumber) ? b : a;
|
|
});
|
|
}
|
|
function getLastLineToReplace(content, query, endline) {
|
|
const lineFrom = query.end;
|
|
for (var i = lineFrom + 1; i < content.length; i++) {
|
|
if (content[i] === endline) {
|
|
return i;
|
|
}
|
|
}
|
|
return lineFrom + 1;
|
|
}
|
|
const pick = (obj, arr) => arr.reduce((acc, curr) => {
|
|
return (curr in obj)
|
|
? Object.assign({}, acc, { [curr]: obj[curr] })
|
|
: acc;
|
|
}, {});
|
|
|
|
// Functions for string processing
|
|
function splitByLines(content) {
|
|
return content.split('\n');
|
|
}
|
|
function removeEmptyLines(s) {
|
|
const lines = s.split('\n').map(e => e.trim());
|
|
if (lines.length < 2) {
|
|
return s;
|
|
}
|
|
else if (lines.indexOf('') === 0) {
|
|
return removeEmptyLines(lines.slice(1).join('\n'));
|
|
}
|
|
return s;
|
|
}
|
|
function removeFrontMatter(s, lookEnding = false) {
|
|
const lines = s.split('\n');
|
|
if (lookEnding && lines.indexOf('---') === 0) {
|
|
return lines.slice(1).join('\n');
|
|
}
|
|
else if (lookEnding) {
|
|
return removeFrontMatter(lines.slice(1).join('\n'), true);
|
|
}
|
|
else if (lines.indexOf('---') === 0) {
|
|
return removeFrontMatter(lines.slice(1).join('\n'), true);
|
|
}
|
|
return s;
|
|
}
|
|
function trimContent(content) {
|
|
return removeFrontMatter(removeEmptyLines(content));
|
|
}
|
|
|
|
function getFrontMatter(file, plugin, s) {
|
|
const { frontmatter = null } = plugin.app.metadataCache.getCache(file.path);
|
|
if (frontmatter) {
|
|
return frontmatter[s.split(':')[1]] || '';
|
|
}
|
|
return '';
|
|
}
|
|
function getFileInfo(plugin, file) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
const info = Object.assign({}, file, {
|
|
content: file.extension === 'md' ? yield plugin.app.vault.cachedRead(file) : '',
|
|
link: plugin.app.fileManager.generateMarkdownLink(file, file.name).replace(/^!/, '')
|
|
}, plugin.app.metadataCache.getFileCache(file));
|
|
return pick(info, [
|
|
'basename',
|
|
'content',
|
|
'extension',
|
|
'headings',
|
|
'link', 'name',
|
|
'path', 'sections', 'stat',
|
|
'frontmatter',
|
|
'links',
|
|
'listItems'
|
|
]);
|
|
});
|
|
}
|
|
|
|
function highlight(lineStart, lineEnd, matchStart, matchEnd, lineContent) {
|
|
return [
|
|
...lineContent.slice(0, matchStart - lineStart),
|
|
'==',
|
|
...lineContent.slice(matchStart - lineStart, (matchStart - lineStart) + (matchEnd - matchStart)),
|
|
'==',
|
|
...lineContent.slice((matchStart - lineStart) + (matchEnd - matchStart)),
|
|
].join('');
|
|
}
|
|
const sequences = [
|
|
{
|
|
name: '\\$count',
|
|
loop: true,
|
|
format: (_p, _s, _content, _file, _d, index) => index ? String(index + 1) : String(1),
|
|
desc: 'add index number to each produced file'
|
|
},
|
|
{
|
|
name: '\\$filename',
|
|
loop: true,
|
|
format: (_p, _s, _content, file) => file.basename,
|
|
desc: 'name of the founded file'
|
|
},
|
|
{
|
|
name: '\\$link',
|
|
loop: true,
|
|
format: (p, _s, _content, file) => p.app.fileManager.generateMarkdownLink(file, file.path).replace('![[', '[['),
|
|
desc: 'link based on Obsidian settings'
|
|
},
|
|
{
|
|
name: '\\$lines:\\d+',
|
|
loop: true,
|
|
readContent: true,
|
|
format: (p, s, content, _file) => {
|
|
const digits = Number(s.split(':')[1]);
|
|
return trimContent(content)
|
|
.split('\n')
|
|
.filter((_, i) => i < digits)
|
|
.join('\n')
|
|
.replace(new RegExp(p.config.lineEnding, 'g'), '');
|
|
},
|
|
desc: 'specified count of lines from the found file'
|
|
},
|
|
{
|
|
name: '\\$characters:\\d+',
|
|
loop: true,
|
|
readContent: true,
|
|
format: (p, s, content, _file) => {
|
|
const digits = Number(s.split(':')[1]);
|
|
return trimContent(content)
|
|
.split('')
|
|
.filter((_, i) => i < digits)
|
|
.join('')
|
|
.replace(new RegExp(p.config.lineEnding, 'g'), '');
|
|
},
|
|
desc: 'specified count of lines from the found file'
|
|
},
|
|
{
|
|
name: '\\$frontmatter:[\\p\{L\}_-]+',
|
|
loop: true,
|
|
format: (p, s, _content, file) => getFrontMatter(file, p, s),
|
|
desc: 'value from the frontmatter key in the found file'
|
|
},
|
|
{
|
|
name: '\\$lines+',
|
|
loop: true,
|
|
readContent: true,
|
|
format: (p, s, content, _file) => content.replace(new RegExp(p.config.lineEnding, 'g'), ''),
|
|
desc: 'all content from the found file'
|
|
},
|
|
{
|
|
name: '\\$ext',
|
|
loop: true,
|
|
format: (_p, s, content, file) => file.extension,
|
|
desc: 'return file extension'
|
|
},
|
|
{
|
|
name: '\\$created:format:date',
|
|
loop: true,
|
|
format: (_p, s, content, file) => String(new Date(file.stat.ctime).toISOString()).split('T')[0],
|
|
desc: 'created time formatted'
|
|
},
|
|
{
|
|
name: '\\$created:format:time',
|
|
loop: true,
|
|
format: (_p, s, content, file) => String(new Date(file.stat.ctime).toISOString()).split(/([.T])/)[2],
|
|
desc: 'created time formatted'
|
|
},
|
|
{
|
|
name: '\\$created:format',
|
|
loop: true,
|
|
format: (_p, s, content, file) => String(new Date(file.stat.ctime).toISOString()),
|
|
desc: 'created time formatted'
|
|
},
|
|
{
|
|
name: '\\$created',
|
|
loop: true,
|
|
format: (_p, s, content, file) => String(file.stat.ctime),
|
|
desc: 'created time'
|
|
},
|
|
{
|
|
name: '\\$size',
|
|
loop: true,
|
|
format: (_p, s, content, file) => String(file.stat.size),
|
|
desc: 'size of the file'
|
|
},
|
|
{
|
|
name: '\\$path',
|
|
loop: true,
|
|
format: (_p, s, content, file) => file.path,
|
|
desc: 'path to the found file'
|
|
},
|
|
{
|
|
name: '\\$parent',
|
|
loop: true,
|
|
format: (_p, s, content, file) => file.parent.name,
|
|
desc: 'parent folder name'
|
|
},
|
|
{
|
|
name: '^(.+|)\\$header:.+',
|
|
loop: true,
|
|
format: (p, s, content, file) => {
|
|
var _a;
|
|
const prefix = s.slice(0, s.indexOf('$'));
|
|
const header = s.slice(s.indexOf('$')).replace('$header:', '').replace(/"/g, '');
|
|
const neededLevel = header.split("#").length - 1;
|
|
const neededTitle = header.replace(/^#+/g, '').trim();
|
|
const metadata = p.app.metadataCache.getFileCache(file);
|
|
return ((_a = metadata.headings) === null || _a === void 0 ? void 0 : _a.filter(e => {
|
|
const tests = [
|
|
[neededTitle, e.heading.includes(neededTitle)],
|
|
[neededLevel, e.level === neededLevel]
|
|
].filter(e => e[0]);
|
|
if (tests.length) {
|
|
return tests.map(e => e[1]).every(e => e === true);
|
|
}
|
|
return true;
|
|
}).map(h => p.app.fileManager.generateMarkdownLink(file, file.basename, '#' + h.heading)).map(link => prefix + link).join('\n')) || '';
|
|
},
|
|
desc: 'headings from founded files. $header:## - return all level 2 headings. $header:Title - return all heading which match the string. Can be prepended like: - !$header:## to transclude the headings.'
|
|
},
|
|
{
|
|
name: '^(.+|)\\$blocks',
|
|
readContent: true,
|
|
loop: true,
|
|
format: (p, s, content, file) => {
|
|
const prefix = s.slice(0, s.indexOf('$'));
|
|
return content
|
|
.split('\n')
|
|
.filter(e => /\^\w+$/.test(e))
|
|
.map(e => prefix + p.app.fileManager.generateMarkdownLink(file, file.basename, '#' + e.replace(/^.+?(\^\w+$)/, '$1')))
|
|
.join('\n');
|
|
},
|
|
desc: 'block ids from the found files. Can be prepended.'
|
|
},
|
|
{
|
|
name: '^(.+|)\\$match:header', loop: true, format: (p, s, content, file, results) => {
|
|
var _a;
|
|
const prefix = s.slice(0, s.indexOf('$'));
|
|
const metadata = p.app.metadataCache.getFileCache(file);
|
|
const headings = (_a = metadata.headings) === null || _a === void 0 ? void 0 : _a.filter(h => results.result.content.filter(c => h.position.end.offset < c[0]).some(e => e)).slice(-1);
|
|
return headings
|
|
.map(h => p.app.fileManager.generateMarkdownLink(file, file.basename, '#' + h.heading))
|
|
.map(link => prefix + link)
|
|
.join('\n') || '';
|
|
}, desc: 'extract found selections'
|
|
},
|
|
{
|
|
name: '^(.+|)\\$matchline(:(\\+|-|)\\d+:\\d+|:(\\+|-|)\\d+|)',
|
|
loop: true,
|
|
format: (_p, s, content, file, results) => {
|
|
const prefix = s.slice(0, s.indexOf('$matchline'));
|
|
const [keyword, context, limit] = s.slice(s.indexOf('$matchline')).split(':');
|
|
const value = context || '';
|
|
const limitValue = Number(limit);
|
|
const isPlus = value.contains('+');
|
|
const isMinus = value.contains('-');
|
|
const isContext = !isPlus && !isMinus;
|
|
const offset = Number(value.replace(/[+-]/, ''));
|
|
const lines = results.content.split('\n');
|
|
// Grab info about line content, index, text length and start/end character position
|
|
const lineInfos = [];
|
|
for (let i = 0; i < lines.length; i++) {
|
|
const text = lines[i];
|
|
if (i === 0) {
|
|
lineInfos.push({
|
|
num: 0,
|
|
start: 0,
|
|
end: text.length,
|
|
text
|
|
});
|
|
continue;
|
|
}
|
|
const start = lineInfos[i - 1].end + 1;
|
|
lineInfos.push({
|
|
num: i,
|
|
start,
|
|
text,
|
|
end: text.length + start
|
|
});
|
|
}
|
|
return results.result.content.map(([from, to]) => {
|
|
const matchedLines = lineInfos
|
|
.filter(({ start, end }) => start <= from && end >= to)
|
|
.map((line) => {
|
|
return Object.assign(Object.assign({}, line), { text: highlight(line.start, line.end, from, to, line.text) });
|
|
});
|
|
const resultLines = [];
|
|
for (const matchedLine of matchedLines) {
|
|
const prevLines = isMinus || isContext
|
|
? lineInfos.filter(l => matchedLine.num - l.num > 0 && matchedLine.num - l.num < offset)
|
|
: [];
|
|
const nextLines = isPlus || isContext
|
|
? lineInfos.filter(l => l.num - matchedLine.num > 0 && l.num - matchedLine.num < offset)
|
|
: [];
|
|
resultLines.push(...prevLines, matchedLine, ...nextLines);
|
|
}
|
|
return prefix + resultLines.map(e => e.text).join('\n');
|
|
}).map(line => limitValue ? line.slice(0, limitValue) : line).join('\n');
|
|
}, desc: 'extract line with matches'
|
|
},
|
|
{
|
|
name: '^(.+|)\\$searchresult',
|
|
loop: true,
|
|
desc: '',
|
|
format: (_p, s, content, file, results) => {
|
|
const prefix = s.slice(0, s.indexOf('$searchresult'));
|
|
return results.children.map(matchedFile => {
|
|
return prefix + matchedFile.el.innerText;
|
|
}).join('\n');
|
|
}
|
|
},
|
|
{
|
|
name: '^(.+|)\\$match', loop: true, format: (_p, s, content, file, results) => {
|
|
if (!results.result.content) {
|
|
console.warn('There is no content in results');
|
|
return '';
|
|
}
|
|
function appendPrefix(prefix, line) {
|
|
return prefix + line;
|
|
}
|
|
const prefixContent = s.slice(0, s.indexOf('$'));
|
|
return results.result.content
|
|
.map(([from, to]) => results.content.slice(from, to))
|
|
.map(line => appendPrefix(prefixContent, line))
|
|
.join('\n');
|
|
}, desc: 'extract found selections'
|
|
},
|
|
];
|
|
|
|
function extractFilesFromSearchResults(searchResults, currentFileName, excludeCurrent = true) {
|
|
const files = Array.from(searchResults.keys());
|
|
return excludeCurrent
|
|
? files.filter(file => file.basename !== currentFileName)
|
|
: files;
|
|
}
|
|
|
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
|
|
function createCommonjsModule(fn, basedir, module) {
|
|
return module = {
|
|
path: basedir,
|
|
exports: {},
|
|
require: function (path, base) {
|
|
return commonjsRequire(path, (base === undefined || base === null) ? module.path : base);
|
|
}
|
|
}, fn(module, module.exports), module.exports;
|
|
}
|
|
|
|
function commonjsRequire () {
|
|
throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
|
|
}
|
|
|
|
var eta_min = createCommonjsModule(function (module, exports) {
|
|
!function(e,n){n(exports);}(commonjsGlobal,(function(e){function n(e){var t,r,i=new Error(e);return t=i,r=n.prototype,Object.setPrototypeOf?Object.setPrototypeOf(t,r):t.__proto__=r,i}function t(e,t,r){var i=t.slice(0,r).split(/\n/),a=i.length,o=i[a-1].length+1;throw n(e+=" at line "+a+" col "+o+":\n\n "+t.split(/\n/)[a-1]+"\n "+Array(o).join(" ")+"^")}n.prototype=Object.create(Error.prototype,{name:{value:"Eta Error",enumerable:!1}});var r=new Function("return this")().Promise;function i(e,n){for(var t in n)r=n,i=t,Object.prototype.hasOwnProperty.call(r,i)&&(e[t]=n[t]);var r,i;return e}function a(e,n,t,r){var i,a;return Array.isArray(n.autoTrim)?(i=n.autoTrim[1],a=n.autoTrim[0]):i=a=n.autoTrim,(t||!1===t)&&(i=t),(r||!1===r)&&(a=r),a||i?"slurp"===i&&"slurp"===a?e.trim():("_"===i||"slurp"===i?e=function(e){return String.prototype.trimLeft?e.trimLeft():e.replace(/^\s+/,"")}(e):"-"!==i&&"nl"!==i||(e=e.replace(/^(?:\r\n|\n|\r)/,"")),"_"===a||"slurp"===a?e=function(e){return String.prototype.trimRight?e.trimRight():e.replace(/\s+$/,"")}(e):"-"!==a&&"nl"!==a||(e=e.replace(/(?:\r\n|\n|\r)$/,"")),e):e}var o={"&":"&","<":"<",">":">",'"':""","'":"'"};function c(e){return o[e]}var s=/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\${)[^\\`])*`/g,l=/'(?:\\[\s\w"'\\`]|[^\n\r'\\])*?'/g,u=/"(?:\\[\s\w"'\\`]|[^\n\r"\\])*?"/g;function p(e){return e.replace(/[.*+\-?^${}()|[\]\\]/g,"\\$&")}function f(e,n){var r=[],i=!1,o=0,c=n.parse;if(n.plugins)for(var f=0;f<n.plugins.length;f++){(T=n.plugins[f]).processTemplate&&(e=T.processTemplate(e,n));}function d(e,t){e&&(e=a(e,n,i,t))&&(e=e.replace(/\\|'/g,"\\$&").replace(/\r\n|\n|\r/g,"\\n"),r.push(e));}n.rmWhitespace&&(e=e.replace(/[\r\n]+/g,"\n").replace(/^\s+|\s+$/gm,"")),s.lastIndex=0,l.lastIndex=0,u.lastIndex=0;for(var g,h=[c.exec,c.interpolate,c.raw].reduce((function(e,n){return e&&n?e+"|"+p(n):n?p(n):e}),""),m=new RegExp("([^]*?)"+p(n.tags[0])+"(-|_)?\\s*("+h+")?\\s*","g"),v=new RegExp("'|\"|`|\\/\\*|(\\s*(-|_)?"+p(n.tags[1])+")","g");g=m.exec(e);){o=g[0].length+g.index;var y=g[1],x=g[2],_=g[3]||"";d(y,x),v.lastIndex=o;for(var w=void 0,b=!1;w=v.exec(e);){if(w[1]){var E=e.slice(o,w.index);m.lastIndex=o=v.lastIndex,i=w[2],b={t:_===c.exec?"e":_===c.raw?"r":_===c.interpolate?"i":"",val:E};break}var I=w[0];if("/*"===I){var R=e.indexOf("*/",v.lastIndex);-1===R&&t("unclosed comment",e,w.index),v.lastIndex=R;}else if("'"===I){l.lastIndex=w.index,l.exec(e)?v.lastIndex=l.lastIndex:t("unclosed string",e,w.index);}else if('"'===I){u.lastIndex=w.index,u.exec(e)?v.lastIndex=u.lastIndex:t("unclosed string",e,w.index);}else if("`"===I){s.lastIndex=w.index,s.exec(e)?v.lastIndex=s.lastIndex:t("unclosed string",e,w.index);}}b?r.push(b):t("unclosed tag",e,g.index+y.length);}if(d(e.slice(o,e.length),!1),n.plugins)for(f=0;f<n.plugins.length;f++){var T;(T=n.plugins[f]).processAST&&(r=T.processAST(r,n));}return r}function d(e,n){var t=f(e,n),r="var tR='',__l,__lP"+(n.include?",include=E.include.bind(E)":"")+(n.includeFile?",includeFile=E.includeFile.bind(E)":"")+"\nfunction layout(p,d){__l=p;__lP=d}\n"+(n.useWith?"with("+n.varName+"||{}){":"")+function(e,n){var t=0,r=e.length,i="";for(;t<r;t++){var a=e[t];if("string"==typeof a){i+="tR+='"+a+"'\n";}else {var o=a.t,c=a.val||"";"r"===o?(n.filter&&(c="E.filter("+c+")"),i+="tR+="+c+"\n"):"i"===o?(n.filter&&(c="E.filter("+c+")"),n.autoEscape&&(c="E.e("+c+")"),i+="tR+="+c+"\n"):"e"===o&&(i+=c+"\n");}}return i}(t,n)+(n.includeFile?"if(__l)tR="+(n.async?"await ":"")+"includeFile(__l,Object.assign("+n.varName+",{body:tR},__lP))\n":n.include?"if(__l)tR="+(n.async?"await ":"")+"include(__l,Object.assign("+n.varName+",{body:tR},__lP))\n":"")+"if(cb){cb(null,tR)} return tR"+(n.useWith?"}":"");if(n.plugins)for(var i=0;i<n.plugins.length;i++){var a=n.plugins[i];a.processFnString&&(r=a.processFnString(r,n));}return r}var g=new(function(){function e(e){this.cache=e;}return e.prototype.define=function(e,n){this.cache[e]=n;},e.prototype.get=function(e){return this.cache[e]},e.prototype.remove=function(e){delete this.cache[e];},e.prototype.reset=function(){this.cache={};},e.prototype.load=function(e){i(this.cache,e);},e}())({});var h={async:!1,autoEscape:!0,autoTrim:[!1,"nl"],cache:!1,e:function(e){var n=String(e);return /[&<>"']/.test(n)?n.replace(/[&<>"']/g,c):n},include:function(e,t){var r=this.templates.get(e);if(!r)throw n('Could not fetch template "'+e+'"');return r(t,this)},parse:{exec:"",interpolate:"=",raw:"~"},plugins:[],rmWhitespace:!1,tags:["<%","%>"],templates:g,useWith:!1,varName:"it"};function m(e,n){var t={};return i(t,h),n&&i(t,n),e&&i(t,e),t}function v(e,t){var r=m(t||{}),i=r.async?function(){try{return new Function("return (async function(){}).constructor")()}catch(e){throw e instanceof SyntaxError?n("This environment doesn't support async/await"):e}}():Function;try{return new i(r.varName,"E","cb",d(e,r))}catch(t){throw t instanceof SyntaxError?n("Bad template syntax\n\n"+t.message+"\n"+Array(t.message.length+1).join("=")+"\n"+d(e,r)+"\n"):t}}function y(e,n){if(n.cache&&n.name&&n.templates.get(n.name))return n.templates.get(n.name);var t="function"==typeof e?e:v(e,n);return n.cache&&n.name&&n.templates.define(n.name,t),t}function x(e,t,i,a){var o=m(i||{});if(!o.async)return y(e,o)(t,o);if(!a){if("function"==typeof r)return new r((function(n,r){try{n(y(e,o)(t,o));}catch(e){r(e);}}));throw n("Please provide a callback function, this env doesn't support Promises")}try{y(e,o)(t,o,a);}catch(e){return a(e)}}e.compile=v,e.compileToString=d,e.config=h,e.configure=function(e){return i(h,e)},e.defaultConfig=h,e.getConfig=m,e.parse=f,e.render=x,e.renderAsync=function(e,n,t,r){return x(e,n,Object.assign({},t,{async:!0}),r)},e.templates=g,Object.defineProperty(e,"__esModule",{value:!0});}));
|
|
|
|
});
|
|
|
|
class TextExpander extends obsidian.Plugin {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.config = {
|
|
autoExpand: false,
|
|
defaultTemplate: '- $link',
|
|
delay: 300,
|
|
excludeCurrent: true,
|
|
lineEnding: '<-->',
|
|
prefixes: {
|
|
header: '^',
|
|
footer: '>'
|
|
}
|
|
};
|
|
this.seqs = sequences;
|
|
this.leftPanelInfo = {
|
|
collapsed: false,
|
|
tab: 0,
|
|
text: ''
|
|
};
|
|
this.search = this.search.bind(this);
|
|
this.init = this.init.bind(this);
|
|
this.autoExpand = this.autoExpand.bind(this);
|
|
}
|
|
autoExpand() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
if (!this.config.autoExpand) {
|
|
return;
|
|
}
|
|
const activeLeaf = this.app.workspace.activeLeaf;
|
|
if (!activeLeaf) {
|
|
return;
|
|
}
|
|
const activeView = activeLeaf.view;
|
|
const isAllowedView = activeView instanceof obsidian.MarkdownView;
|
|
if (!isAllowedView) {
|
|
return;
|
|
}
|
|
yield this.init(true);
|
|
});
|
|
}
|
|
onload() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
this.addSettingTab(new SettingTab(this.app, this));
|
|
this.registerMarkdownCodeBlockProcessor('expander', (source, el, ctx) => {
|
|
el
|
|
.createDiv()
|
|
.createEl('button', { text: 'Run expand query' })
|
|
.addEventListener('click', this.init.bind(this, false, ctx.getSectionInfo(el).lineStart));
|
|
});
|
|
this.addCommand({
|
|
id: 'editor-expand',
|
|
name: 'expand',
|
|
callback: this.init,
|
|
hotkeys: []
|
|
});
|
|
this.addCommand({
|
|
id: 'editor-expand-all',
|
|
name: 'expand all',
|
|
callback: () => this.init(true),
|
|
hotkeys: []
|
|
});
|
|
this.app.workspace.on('file-open', this.autoExpand);
|
|
const data = yield this.loadData();
|
|
if (data) {
|
|
this.config = Object.assign(Object.assign({}, this.config), data);
|
|
}
|
|
});
|
|
}
|
|
onunload() {
|
|
console.log('unloading plugin');
|
|
this.app.workspace.off('file-open', this.autoExpand);
|
|
}
|
|
saveSettings() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
yield this.saveData(this.config);
|
|
});
|
|
}
|
|
init(proceedAllQueriesOnPage = false, lineToStart) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
const currentView = this.app.workspace.activeLeaf.view;
|
|
// Is on editable view
|
|
if (!(currentView instanceof obsidian.MarkdownView)) {
|
|
return;
|
|
}
|
|
const cmDoc = this.cm = currentView.editor;
|
|
const curNum = lineToStart || cmDoc.getCursor().line;
|
|
const content = cmDoc.getValue();
|
|
if (lineToStart) {
|
|
cmDoc.setCursor(lineToStart ? lineToStart - 1 : 0);
|
|
}
|
|
const formatted = splitByLines(content);
|
|
const findQueries = getAllExpandersQuery(formatted);
|
|
const closestQuery = getClosestQuery(findQueries, curNum);
|
|
if (proceedAllQueriesOnPage) {
|
|
yield findQueries.reduce((promise, query, i) => promise.then(() => {
|
|
const newContent = splitByLines(cmDoc.getValue());
|
|
const updatedQueries = getAllExpandersQuery(newContent);
|
|
return this.runExpanderCodeBlock(updatedQueries[i], newContent, currentView);
|
|
}), Promise.resolve());
|
|
}
|
|
else {
|
|
yield this.runExpanderCodeBlock(closestQuery, formatted, currentView);
|
|
}
|
|
});
|
|
}
|
|
runExpanderCodeBlock(query, content, view) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
const { lineEnding, prefixes } = this.config;
|
|
if (!query) {
|
|
new Notification('Expand query not found');
|
|
return Promise.resolve();
|
|
}
|
|
this.clearOldResultsInFile(content, query, lineEnding);
|
|
const newContent = splitByLines(this.cm.getValue());
|
|
if (query.query !== '') {
|
|
this.search(query.query);
|
|
}
|
|
return yield this.runTemplateProcessing(query, getLastLineToReplace(newContent, query, this.config.lineEnding), prefixes, view);
|
|
});
|
|
}
|
|
runTemplateProcessing(query, lastLine, prefixes, currentView) {
|
|
var _a;
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
let currentFileName = '';
|
|
const templateContent = query.template.split('\n');
|
|
const { heading, footer, repeatableContent } = this.parseTemplate(prefixes, templateContent);
|
|
if (currentView instanceof obsidian.FileView) {
|
|
currentFileName = currentView.file.basename;
|
|
}
|
|
this.saveLeftPanelState();
|
|
const searchResults = yield this.getFoundAfterDelay(query.query === '');
|
|
const files = extractFilesFromSearchResults(searchResults, currentFileName, this.config.excludeCurrent);
|
|
this.restoreLeftPanelState();
|
|
currentView.editor.focus();
|
|
const currentFileInfo = (currentView instanceof obsidian.FileView)
|
|
? yield getFileInfo(this, currentView.file)
|
|
: {};
|
|
const filesInfo = yield Promise.all(files.map(file => getFileInfo(this, file)));
|
|
let changed;
|
|
if (query.template.contains("<%")) {
|
|
const templateToRender = repeatableContent.join('\n');
|
|
const dataToRender = {
|
|
current: currentFileInfo,
|
|
files: filesInfo
|
|
};
|
|
changed = yield eta_min.render(templateToRender, dataToRender, { autoEscape: false });
|
|
// changed = doT.template(templateToRender, {strip: false})(dataToRender)
|
|
}
|
|
else {
|
|
changed = yield this.generateTemplateFromSequences(files, repeatableContent, searchResults);
|
|
}
|
|
let result = [
|
|
heading,
|
|
changed,
|
|
footer,
|
|
this.config.lineEnding
|
|
].filter(e => e).join('\n');
|
|
// Do not paste generated content if used changed activeLeaf
|
|
const viewBeforeReplace = this.app.workspace.activeLeaf.view;
|
|
if (!(viewBeforeReplace instanceof obsidian.MarkdownView) || viewBeforeReplace.file.basename !== currentFileName) {
|
|
return;
|
|
}
|
|
currentView.editor.replaceRange(result, { line: query.end + 1, ch: 0 }, { line: lastLine, ch: ((_a = this.cm.getLine(lastLine)) === null || _a === void 0 ? void 0 : _a.length) || 0 });
|
|
return Promise.resolve();
|
|
});
|
|
}
|
|
generateTemplateFromSequences(files, repeatableContent, searchResults) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
if (!searchResults) {
|
|
return '';
|
|
}
|
|
const changed = yield Promise.all(files
|
|
.map((file, i) => __awaiter(this, void 0, void 0, function* () {
|
|
const result = yield Promise.all(repeatableContent.map((s) => __awaiter(this, void 0, void 0, function* () { return yield this.applyTemplateToSearchResults(searchResults, file, s, i); })));
|
|
return result.join('\n');
|
|
})));
|
|
return changed.join('\n');
|
|
});
|
|
}
|
|
parseTemplate(prefixes, templateContent) {
|
|
const isHeader = (line) => line.startsWith(prefixes.header);
|
|
const isFooter = (line) => line.startsWith(prefixes.footer);
|
|
const isRepeat = (line) => !isHeader(line) && !isFooter(line);
|
|
const heading = templateContent.filter(isHeader).map((s) => s.slice(1)).join('\n');
|
|
const footer = templateContent.filter(isFooter).map((s) => s.slice(1)).join('\n');
|
|
const repeatableContent = templateContent.filter(isRepeat).filter(e => e).length === 0
|
|
? [this.config.defaultTemplate]
|
|
: templateContent.filter(isRepeat).filter(e => e);
|
|
return { heading, footer, repeatableContent };
|
|
}
|
|
saveLeftPanelState() {
|
|
this.leftPanelInfo = {
|
|
collapsed: this.app.workspace.leftSplit.collapsed,
|
|
tab: this.getSearchTabIndex(),
|
|
text: this.getSearchValue(),
|
|
};
|
|
}
|
|
restoreLeftPanelState() {
|
|
const { collapsed, tab, text } = this.leftPanelInfo;
|
|
const splitChildren = this.getLeftSplitElement();
|
|
this.getSearchView().searchComponent.setValue(text);
|
|
if (tab !== splitChildren.currentTab) {
|
|
splitChildren.selectTabIndex(tab);
|
|
}
|
|
if (collapsed) {
|
|
this.app.workspace.leftSplit.collapse();
|
|
}
|
|
}
|
|
search(s) {
|
|
// @ts-ignore
|
|
const globalSearchFn = this.app.internalPlugins.getPluginById('global-search').instance.openGlobalSearch.bind(this);
|
|
const search = (query) => globalSearchFn(query);
|
|
search(s);
|
|
}
|
|
getLeftSplitElement() {
|
|
// @ts-ignore
|
|
return this.app.workspace.leftSplit.children[0];
|
|
}
|
|
getSearchView() {
|
|
const view = this.getLeftSplitElement().children.filter(e => e.getViewState().type === 'search')[0].view;
|
|
if ('searchComponent' in view) {
|
|
return view;
|
|
}
|
|
return undefined;
|
|
}
|
|
getSearchValue() {
|
|
const view = this.getSearchView();
|
|
if (view) {
|
|
return view.searchComponent.getValue();
|
|
}
|
|
return '';
|
|
}
|
|
getSearchTabIndex() {
|
|
const leftTabs = this.getLeftSplitElement().children;
|
|
let searchTabId;
|
|
this.app.workspace.iterateAllLeaves((leaf) => {
|
|
if (leaf.getViewState().type == "search") {
|
|
searchTabId = leaf.id;
|
|
}
|
|
});
|
|
return leftTabs.findIndex((item, _index, _array) => {
|
|
if (item.id == searchTabId) {
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
;
|
|
getFoundAfterDelay(immediate) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
const searchLeaf = this.app.workspace.getLeavesOfType('search')[0];
|
|
const view = yield searchLeaf.open(searchLeaf.view);
|
|
if (immediate) {
|
|
// @ts-ignore
|
|
return Promise.resolve(view.dom.resultDomLookup);
|
|
}
|
|
return new Promise(resolve => {
|
|
setTimeout(() => {
|
|
// @ts-ignore
|
|
return resolve(view.dom.resultDomLookup);
|
|
}, this.config.delay);
|
|
});
|
|
});
|
|
}
|
|
applyTemplateToSearchResults(searchResults, file, template, index) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
const fileContent = (new RegExp(this.seqs.filter(e => e.readContent).map(e => e.name).join('|')).test(template))
|
|
? yield this.app.vault.cachedRead(file)
|
|
: '';
|
|
return this.seqs.reduce((acc, seq) => acc.replace(new RegExp(seq.name, 'gu'), replace => seq.format(this, replace, fileContent, file, searchResults.get(file), index)), template);
|
|
});
|
|
}
|
|
clearOldResultsInFile(content, query, lineEnding) {
|
|
var _a;
|
|
const lastLine = getLastLineToReplace(content, query, this.config.lineEnding);
|
|
this.cm.replaceRange('\n' + lineEnding, { line: query.end + 1, ch: 0 }, { line: lastLine, ch: ((_a = this.cm.getLine(lastLine)) === null || _a === void 0 ? void 0 : _a.length) || 0 });
|
|
}
|
|
}
|
|
class SettingTab extends obsidian.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.app = app;
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
let { containerEl } = this;
|
|
containerEl.empty();
|
|
containerEl.createEl('h2', { text: 'Settings for Text Expander' });
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Auto Expand')
|
|
.setDesc('Expand all queries in a file once you open it')
|
|
.addToggle(toggle => {
|
|
toggle
|
|
.setValue(this.plugin.config.autoExpand)
|
|
.onChange(value => {
|
|
this.plugin.config.autoExpand = value;
|
|
this.plugin.saveSettings();
|
|
});
|
|
});
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Delay')
|
|
.setDesc('Text expander don\' wait until search completed. It waits for a delay and paste result after that.')
|
|
.addSlider(slider => {
|
|
slider.setLimits(100, 10000, 100);
|
|
slider.setValue(this.plugin.config.delay);
|
|
slider.onChange(value => {
|
|
this.plugin.config.delay = value;
|
|
this.plugin.saveSettings();
|
|
});
|
|
slider.setDynamicTooltip();
|
|
});
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Line ending')
|
|
.setDesc('You can specify the text which will appear at the bottom of the generated text.')
|
|
.addText(text => {
|
|
text.setValue(this.plugin.config.lineEnding)
|
|
.onChange(val => {
|
|
this.plugin.config.lineEnding = val;
|
|
this.plugin.saveSettings();
|
|
});
|
|
});
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Default template')
|
|
.setDesc('You can specify default template')
|
|
.addTextArea(text => {
|
|
text.setValue(this.plugin.config.defaultTemplate)
|
|
.onChange(val => {
|
|
this.plugin.config.defaultTemplate = val;
|
|
this.plugin.saveSettings();
|
|
});
|
|
});
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Exclude current file')
|
|
.setDesc('You can specify should text expander exclude results from current file or not')
|
|
.addToggle(toggle => {
|
|
toggle
|
|
.setValue(this.plugin.config.excludeCurrent)
|
|
.onChange(value => {
|
|
this.plugin.config.excludeCurrent = value;
|
|
this.plugin.saveSettings();
|
|
});
|
|
});
|
|
new obsidian.Setting(containerEl)
|
|
.setHeading()
|
|
.setName('Prefixes');
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Header')
|
|
.setDesc('Line prefixed by this symbol will be recognized as header')
|
|
.addText(text => {
|
|
text.setValue(this.plugin.config.prefixes.header)
|
|
.onChange(val => {
|
|
this.plugin.config.prefixes.header = val;
|
|
this.plugin.saveSettings();
|
|
});
|
|
});
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Footer')
|
|
.setDesc('Line prefixed by this symbol will be recognized as footer')
|
|
.addText(text => {
|
|
text.setValue(this.plugin.config.prefixes.footer)
|
|
.onChange(val => {
|
|
this.plugin.config.prefixes.footer = val;
|
|
this.plugin.saveSettings();
|
|
});
|
|
});
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Sequences')
|
|
.setDesc('REGEXP - DESCRIPTION')
|
|
.setDesc((() => {
|
|
const fragment = new DocumentFragment();
|
|
const div = fragment.createEl('div');
|
|
this.plugin.seqs
|
|
.map(e => e.name + ' - ' + (e.desc || ''))
|
|
.map(e => {
|
|
const el = fragment.createEl('div');
|
|
el.setText(e);
|
|
el.setAttribute('style', `
|
|
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
|
margin-bottom: 0.5rem;
|
|
padding-bottom: 0.5rem;
|
|
`);
|
|
return el;
|
|
}).forEach(el => {
|
|
div.appendChild(el);
|
|
});
|
|
fragment.appendChild(div);
|
|
return fragment;
|
|
})());
|
|
}
|
|
}
|
|
|
|
module.exports = TextExpander;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9oZWxwZXJzL2hlbHBlcnMudHMiLCJzcmMvaGVscGVycy9zdHJpbmcudHMiLCJzcmMvaGVscGVycy90ZmlsZS50cyIsInNyYy9zZXF1ZW5jZXMvc2VxdWVuY2VzLnRzIiwic3JjL2hlbHBlcnMvc2VhcmNoLXJlc3VsdHMudHMiLCJub2RlX21vZHVsZXMvZXRhL2Rpc3QvYnJvd3Nlci9ldGEubWluLmpzIiwic3JjL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xyXG4gICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG59XHJcbiIsImV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kZXJRdWVyeSB7XG4gICAgc3RhcnQ6IG51bWJlclxuICAgIGVuZDogbnVtYmVyXG4gICAgdGVtcGxhdGU6IHN0cmluZ1xuICAgIHF1ZXJ5OiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEV4cGFuZGVyc1F1ZXJ5KGNvbnRlbnQ6IHN0cmluZ1tdKTogRXhwYW5kZXJRdWVyeVtdIHtcbiAgICBsZXQgYWNjdW06IEV4cGFuZGVyUXVlcnlbXSA9IFtdXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBjb250ZW50W2ldXG5cbiAgICAgICAgaWYgKGxpbmUgPT09ICdgYGBleHBhbmRlcicpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgY29udGVudC5sZW5ndGggLSBpOyBlKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0bGluZSA9IGNvbnRlbnRbaSArIGVdXG4gICAgICAgICAgICAgICAgaWYgKG5leHRsaW5lID09PSAnYGBgJykge1xuICAgICAgICAgICAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogaSArIGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IGNvbnRlbnRbaSArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBlID4gMiA/IGNvbnRlbnQuc2xpY2UoaSArIDIsIGkgKyBlKS5qb2luKCdcXG4nKSA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWNjdW1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsb3Nlc3RRdWVyeShxdWVyaWVzOiBFeHBhbmRlclF1ZXJ5W10sIGxpbmVOdW1iZXI6IG51bWJlcik6IEV4cGFuZGVyUXVlcnkgfCB1bmRlZmluZWQge1xuICAgIGlmIChxdWVyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJpZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhiLnN0YXJ0IC0gbGluZU51bWJlcikgPCBNYXRoLmFicyhhLnN0YXJ0IC0gbGluZU51bWJlcikgPyBiIDogYTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3RMaW5lVG9SZXBsYWNlKGNvbnRlbnQ6IHN0cmluZ1tdLCBxdWVyeTogRXhwYW5kZXJRdWVyeSwgZW5kbGluZTogc3RyaW5nKSB7XG4gICAgY29uc3QgbGluZUZyb20gPSBxdWVyeS5lbmRcblxuICAgIGZvciAodmFyIGkgPSBsaW5lRnJvbSArIDE7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjb250ZW50W2ldID09PSBlbmRsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gaVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVGcm9tICsgMVxufVxuXG50eXBlIExvb3NlT2JqZWN0PFQgPSBhbnk+ID0geyBba2V5OiBzdHJpbmddOiBUIH1cblxuZXhwb3J0IGNvbnN0IHBpY2sgPSAob2JqOiB7W2s6IHN0cmluZ106IGFueX0sIGFycjogc3RyaW5nW10pID0+XG4gICAgYXJyLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XG4gICAgICAgIHJldHVybiAoY3VyciBpbiBvYmopXG4gICAgICAgICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGFjYywgeyBbY3Vycl06IG9ialtjdXJyXSB9KVxuICAgICAgICAgICAgOiBhY2NcbiAgICB9LCA8TG9vc2VPYmplY3Q+e30pO1xuXG5cbiIsIi8vIEZ1bmN0aW9ucyBmb3Igc3RyaW5nIHByb2Nlc3NpbmdcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5TGluZXMoY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBjb250ZW50LnNwbGl0KCdcXG4nKVxufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eUxpbmVzKHM6IHN0cmluZyk6IHN0cmluZyAge1xuICAgICAgICBjb25zdCBsaW5lcyA9IHMuc3BsaXQoJ1xcbicpLm1hcChlID0+IGUudHJpbSgpKVxuXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gc1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVzLmluZGV4T2YoJycpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlRW1wdHlMaW5lcyhsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzXG59XG5cbmZ1bmN0aW9uIHJlbW92ZUZyb250TWF0dGVyIChzOiBzdHJpbmcsIGxvb2tFbmRpbmc6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXMgPSBzLnNwbGl0KCdcXG4nKVxuXG4gICAgaWYgKGxvb2tFbmRpbmcgJiYgbGluZXMuaW5kZXhPZignLS0tJykgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGxpbmVzLnNsaWNlKDEpLmpvaW4oJ1xcbicpXG4gICAgfSBlbHNlIGlmIChsb29rRW5kaW5nKSB7XG4gICAgICAgIHJldHVybiByZW1vdmVGcm9udE1hdHRlcihsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKSwgdHJ1ZSlcbiAgICB9IGVsc2UgaWYgKGxpbmVzLmluZGV4T2YoJy0tLScpID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZW1vdmVGcm9udE1hdHRlcihsaW5lcy5zbGljZSgxKS5qb2luKCdcXG4nKSwgdHJ1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJpbUNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVtb3ZlRnJvbnRNYXR0ZXIocmVtb3ZlRW1wdHlMaW5lcyhjb250ZW50KSlcbn1cbiIsImltcG9ydCB7UGx1Z2luLCBURmlsZX0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge3BpY2t9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7RmlsZVBhcmFtZXRlcnN9IGZyb20gXCIuLi9tYWluXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGcm9udE1hdHRlcihmaWxlOiBURmlsZSwgcGx1Z2luOiBQbHVnaW4sIHM6IHN0cmluZykge1xuICAgIGNvbnN0IHtmcm9udG1hdHRlciA9IG51bGx9ID0gcGx1Z2luLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKGZpbGUucGF0aClcblxuICAgIGlmIChmcm9udG1hdHRlcikge1xuICAgICAgICByZXR1cm4gZnJvbnRtYXR0ZXJbcy5zcGxpdCgnOicpWzFdXSB8fCAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gJydcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZpbGVJbmZvKHRoaXM6IHZvaWQsIHBsdWdpbjogUGx1Z2luLCBmaWxlOiBURmlsZSk6IFByb21pc2U8RmlsZVBhcmFtZXRlcnM+IHtcbiAgICBjb25zdCBpbmZvID0gT2JqZWN0LmFzc2lnbih7fSwgZmlsZSwge1xuICAgICAgICAgICAgY29udGVudDogZmlsZS5leHRlbnNpb24gPT09ICdtZCcgPyBhd2FpdCBwbHVnaW4uYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiAnJyxcbiAgICAgICAgICAgIGxpbms6IHBsdWdpbi5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5uYW1lKS5yZXBsYWNlKC9eIS8sICcnKVxuICAgICAgICB9LFxuICAgICAgICBwbHVnaW4uYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpXG4gICAgKVxuICAgIHJldHVybiBwaWNrKGluZm8sIFtcbiAgICAgICAgJ2Jhc2VuYW1lJyxcbiAgICAgICAgJ2NvbnRlbnQnLFxuICAgICAgICAnZXh0ZW5zaW9uJyxcbiAgICAgICAgJ2hlYWRpbmdzJyxcbiAgICAgICAgJ2xpbmsnLCAnbmFtZScsXG4gICAgICAgICdwYXRoJywgJ3NlY3Rpb25zJywgJ3N0YXQnLFxuICAgICAgICAnZnJvbnRtYXR0ZXInLFxuICAgICAgICAnbGlua3MnLFxuICAgICAgICAnbGlzdEl0ZW1zJ1xuICAgIF0pXG59IiwiaW1wb3J0IHtURmlsZX0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgVGV4dEV4cGFuZGVyLCB7U2VhcmNoRGV0YWlsc30gZnJvbSBcIi4uL21haW5cIjtcbmltcG9ydCB7dHJpbUNvbnRlbnR9IGZyb20gXCIuLi9oZWxwZXJzL3N0cmluZ1wiO1xuaW1wb3J0IHtnZXRGcm9udE1hdHRlcn0gZnJvbSBcIi4uL2hlbHBlcnMvdGZpbGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZXMge1xuICAgIGxvb3A6IGJvb2xlYW5cbiAgICBuYW1lOiBzdHJpbmdcbiAgICBmb3JtYXQ6IChwbHVnaW46IFRleHRFeHBhbmRlciwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlLCByZXN1bHRzPzogU2VhcmNoRGV0YWlscywgaW5kZXg/OiBudW1iZXIpID0+IHN0cmluZ1xuICAgIGRlc2M6IHN0cmluZ1xuICAgIHJlYWRDb250ZW50PzogYm9vbGVhblxuICAgIHVzaW5nU2VhcmNoPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgTGluZUluZm8ge1xuICAgIHRleHQ6IHN0cmluZ1xuICAgIG51bTogbnVtYmVyXG4gICAgc3RhcnQ6IG51bWJlclxuICAgIGVuZDogbnVtYmVyXG59XG5cbmZ1bmN0aW9uIGhpZ2hsaWdodChsaW5lU3RhcnQ6IG51bWJlciwgbGluZUVuZDogbnVtYmVyLCBtYXRjaFN0YXJ0OiBudW1iZXIsIG1hdGNoRW5kOiBudW1iZXIsIGxpbmVDb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5saW5lQ29udGVudC5zbGljZSgwLCBtYXRjaFN0YXJ0IC0gbGluZVN0YXJ0KSxcbiAgICAgICAgJz09JyxcbiAgICAgICAgLi4ubGluZUNvbnRlbnQuc2xpY2UobWF0Y2hTdGFydCAtIGxpbmVTdGFydCwgKG1hdGNoU3RhcnQgLSBsaW5lU3RhcnQpICsgKG1hdGNoRW5kIC0gbWF0Y2hTdGFydCkpLFxuICAgICAgICAnPT0nLFxuICAgICAgICAuLi5saW5lQ29udGVudC5zbGljZSgobWF0Y2hTdGFydCAtIGxpbmVTdGFydCkgKyAobWF0Y2hFbmQgLSBtYXRjaFN0YXJ0KSksXG4gICAgXS5qb2luKCcnKVxufVxuXG5jb25zdCBzZXF1ZW5jZXM6IFNlcXVlbmNlc1tdID0gW1xuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkY291bnQnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgX3M6IHN0cmluZywgX2NvbnRlbnQ6IHN0cmluZywgX2ZpbGU6IFRGaWxlLCBfZCwgaW5kZXgpID0+IGluZGV4ID8gU3RyaW5nKGluZGV4ICsgMSkgOiBTdHJpbmcoMSksXG4gICAgICAgIGRlc2M6ICdhZGQgaW5kZXggbnVtYmVyIHRvIGVhY2ggcHJvZHVjZWQgZmlsZSdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkZmlsZW5hbWUnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgX3M6IHN0cmluZywgX2NvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IGZpbGUuYmFzZW5hbWUsXG4gICAgICAgIGRlc2M6ICduYW1lIG9mIHRoZSBmb3VuZGVkIGZpbGUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGxpbmsnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChwLCBfczogc3RyaW5nLCBfY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gcC5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5wYXRoKS5yZXBsYWNlKCchW1snLCAnW1snKSxcbiAgICAgICAgZGVzYzogJ2xpbmsgYmFzZWQgb24gT2JzaWRpYW4gc2V0dGluZ3MnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGxpbmVzOlxcXFxkKycsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIHJlYWRDb250ZW50OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChwLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgX2ZpbGU6IFRGaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaWdpdHMgPSBOdW1iZXIocy5zcGxpdCgnOicpWzFdKVxuXG4gICAgICAgICAgICByZXR1cm4gdHJpbUNvbnRlbnQoY29udGVudClcbiAgICAgICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoXzogc3RyaW5nLCBpOiBudW1iZXIpID0+IGkgPCBkaWdpdHMpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChwLmNvbmZpZy5saW5lRW5kaW5nLCAnZycpLCAnJylcbiAgICAgICAgfSxcbiAgICAgICAgZGVzYzogJ3NwZWNpZmllZCBjb3VudCBvZiBsaW5lcyBmcm9tIHRoZSBmb3VuZCBmaWxlJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRjaGFyYWN0ZXJzOlxcXFxkKycsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIHJlYWRDb250ZW50OiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChwLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgX2ZpbGU6IFRGaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaWdpdHMgPSBOdW1iZXIocy5zcGxpdCgnOicpWzFdKVxuXG4gICAgICAgICAgICByZXR1cm4gdHJpbUNvbnRlbnQoY29udGVudClcbiAgICAgICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoXzogc3RyaW5nLCBpOiBudW1iZXIpID0+IGkgPCBkaWdpdHMpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChwLmNvbmZpZy5saW5lRW5kaW5nLCAnZycpLCAnJylcbiAgICAgICAgfSxcbiAgICAgICAgZGVzYzogJ3NwZWNpZmllZCBjb3VudCBvZiBsaW5lcyBmcm9tIHRoZSBmb3VuZCBmaWxlJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRmcm9udG1hdHRlcjpbXFxcXHBcXHtMXFx9Xy1dKycsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIHM6IHN0cmluZywgX2NvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IGdldEZyb250TWF0dGVyKGZpbGUsIHAsIHMpLFxuICAgICAgICBkZXNjOiAndmFsdWUgZnJvbSB0aGUgZnJvbnRtYXR0ZXIga2V5IGluIHRoZSBmb3VuZCBmaWxlJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRsaW5lcysnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICByZWFkQ29udGVudDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAocCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIF9maWxlOiBURmlsZSkgPT4gY29udGVudC5yZXBsYWNlKG5ldyBSZWdFeHAocC5jb25maWcubGluZUVuZGluZywgJ2cnKSwgJycpLFxuICAgICAgICBkZXNjOiAnYWxsIGNvbnRlbnQgZnJvbSB0aGUgZm91bmQgZmlsZSdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkZXh0JyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gZmlsZS5leHRlbnNpb24sXG4gICAgICAgIGRlc2M6ICdyZXR1cm4gZmlsZSBleHRlbnNpb24nXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGNyZWF0ZWQ6Zm9ybWF0OmRhdGUnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBTdHJpbmcobmV3IERhdGUoZmlsZS5zdGF0LmN0aW1lKS50b0lTT1N0cmluZygpKS5zcGxpdCgnVCcpWzBdLFxuICAgICAgICBkZXNjOiAnY3JlYXRlZCB0aW1lIGZvcm1hdHRlZCdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkY3JlYXRlZDpmb3JtYXQ6dGltZScsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IFN0cmluZyhuZXcgRGF0ZShmaWxlLnN0YXQuY3RpbWUpLnRvSVNPU3RyaW5nKCkpLnNwbGl0KC8oWy5UXSkvKVsyXSxcbiAgICAgICAgZGVzYzogJ2NyZWF0ZWQgdGltZSBmb3JtYXR0ZWQnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJGNyZWF0ZWQ6Zm9ybWF0JyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gU3RyaW5nKG5ldyBEYXRlKGZpbGUuc3RhdC5jdGltZSkudG9JU09TdHJpbmcoKSksXG4gICAgICAgIGRlc2M6ICdjcmVhdGVkIHRpbWUgZm9ybWF0dGVkJ1xuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnXFxcXCRjcmVhdGVkJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4gU3RyaW5nKGZpbGUuc3RhdC5jdGltZSksXG4gICAgICAgIGRlc2M6ICdjcmVhdGVkIHRpbWUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJHNpemUnLFxuICAgICAgICBsb29wOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6IChfcCwgczogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGZpbGU6IFRGaWxlKSA9PiBTdHJpbmcoZmlsZS5zdGF0LnNpemUpLFxuICAgICAgICBkZXNjOiAnc2l6ZSBvZiB0aGUgZmlsZSdcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1xcXFwkcGF0aCcsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IGZpbGUucGF0aCxcbiAgICAgICAgZGVzYzogJ3BhdGggdG8gdGhlIGZvdW5kIGZpbGUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdcXFxcJHBhcmVudCcsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUpID0+IGZpbGUucGFyZW50Lm5hbWUsXG4gICAgICAgIGRlc2M6ICdwYXJlbnQgZm9sZGVyIG5hbWUnXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdeKC4rfClcXFxcJGhlYWRlcjouKycsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyQnKSlcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHMuc2xpY2Uocy5pbmRleE9mKCckJykpLnJlcGxhY2UoJyRoZWFkZXI6JywgJycpLnJlcGxhY2UoL1wiL2csICcnKVxuICAgICAgICAgICAgY29uc3QgbmVlZGVkTGV2ZWwgPSBoZWFkZXIuc3BsaXQoXCIjXCIpLmxlbmd0aCAtIDFcbiAgICAgICAgICAgIGNvbnN0IG5lZWRlZFRpdGxlID0gaGVhZGVyLnJlcGxhY2UoL14jKy9nLCAnJykudHJpbSgpXG5cbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcC5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSlcblxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmhlYWRpbmdzPy5maWx0ZXIoZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdHMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFtuZWVkZWRUaXRsZSwgZS5oZWFkaW5nLmluY2x1ZGVzKG5lZWRlZFRpdGxlKV0sXG4gICAgICAgICAgICAgICAgICAgIFtuZWVkZWRMZXZlbCwgZS5sZXZlbCA9PT0gbmVlZGVkTGV2ZWxdXG4gICAgICAgICAgICAgICAgXS5maWx0ZXIoZSA9PiBlWzBdKVxuXG4gICAgICAgICAgICAgICAgaWYgKHRlc3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVzdHMubWFwKGUgPT4gZVsxXSkuZXZlcnkoZSA9PiBlID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5tYXAoaCA9PiBwLmFwcC5maWxlTWFuYWdlci5nZW5lcmF0ZU1hcmtkb3duTGluayhmaWxlLCBmaWxlLmJhc2VuYW1lLCAnIycgKyBoLmhlYWRpbmcpKVxuICAgICAgICAgICAgICAgIC5tYXAobGluayA9PiBwcmVmaXggKyBsaW5rKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSB8fCAnJ1xuXG4gICAgICAgIH0sXG4gICAgICAgIGRlc2M6ICdoZWFkaW5ncyBmcm9tIGZvdW5kZWQgZmlsZXMuICRoZWFkZXI6IyMgLSByZXR1cm4gYWxsIGxldmVsIDIgaGVhZGluZ3MuICRoZWFkZXI6VGl0bGUgLSByZXR1cm4gYWxsIGhlYWRpbmcgd2hpY2ggbWF0Y2ggdGhlIHN0cmluZy4gQ2FuIGJlIHByZXBlbmRlZCBsaWtlOiAtICEkaGVhZGVyOiMjIHRvIHRyYW5zY2x1ZGUgdGhlIGhlYWRpbmdzLidcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkYmxvY2tzJyxcbiAgICAgICAgcmVhZENvbnRlbnQ6IHRydWUsXG4gICAgICAgIGxvb3A6IHRydWUsXG4gICAgICAgIGZvcm1hdDogKHAsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyQnKSlcblxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihlID0+IC9cXF5cXHcrJC8udGVzdChlKSlcbiAgICAgICAgICAgICAgICAubWFwKGUgPT5cbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgcC5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5iYXNlbmFtZSwgJyMnICsgZS5yZXBsYWNlKC9eLis/KFxcXlxcdyskKS8sICckMScpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJylcbiAgICAgICAgfSxcbiAgICAgICAgZGVzYzogJ2Jsb2NrIGlkcyBmcm9tIHRoZSBmb3VuZCBmaWxlcy4gQ2FuIGJlIHByZXBlbmRlZC4nXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdeKC4rfClcXFxcJG1hdGNoOmhlYWRlcicsIGxvb3A6IHRydWUsIGZvcm1hdDogKHAsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSwgcmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyQnKSlcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcC5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSlcblxuICAgICAgICAgICAgY29uc3QgaGVhZGluZ3MgPSBtZXRhZGF0YS5oZWFkaW5nc1xuICAgICAgICAgICAgICAgID8uZmlsdGVyKGggPT4gcmVzdWx0cy5yZXN1bHQuY29udGVudC5maWx0ZXIoYyA9PiBoLnBvc2l0aW9uLmVuZC5vZmZzZXQgPCBjWzBdKS5zb21lKGUgPT4gZSkpXG4gICAgICAgICAgICAgICAgLnNsaWNlKC0xKVxuXG4gICAgICAgICAgICByZXR1cm4gaGVhZGluZ3NcbiAgICAgICAgICAgICAgICAubWFwKGggPT4gcC5hcHAuZmlsZU1hbmFnZXIuZ2VuZXJhdGVNYXJrZG93bkxpbmsoZmlsZSwgZmlsZS5iYXNlbmFtZSwgJyMnICsgaC5oZWFkaW5nKSlcbiAgICAgICAgICAgICAgICAubWFwKGxpbmsgPT4gcHJlZml4ICsgbGluaylcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJykgfHwgJydcbiAgICAgICAgfSwgZGVzYzogJ2V4dHJhY3QgZm91bmQgc2VsZWN0aW9ucydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkbWF0Y2hsaW5lKDooXFxcXCt8LXwpXFxcXGQrOlxcXFxkK3w6KFxcXFwrfC18KVxcXFxkK3wpJyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSwgcmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gcy5zbGljZSgwLCBzLmluZGV4T2YoJyRtYXRjaGxpbmUnKSk7XG4gICAgICAgICAgICBjb25zdCBba2V5d29yZCwgY29udGV4dCwgbGltaXRdID0gcy5zbGljZShzLmluZGV4T2YoJyRtYXRjaGxpbmUnKSkuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250ZXh0IHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgbGltaXRWYWx1ZSA9IE51bWJlcihsaW1pdClcbiAgICAgICAgICAgIGNvbnN0IGlzUGx1cyA9IHZhbHVlLmNvbnRhaW5zKCcrJyk7XG4gICAgICAgICAgICBjb25zdCBpc01pbnVzID0gdmFsdWUuY29udGFpbnMoJy0nKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29udGV4dCA9ICFpc1BsdXMgJiYgIWlzTWludXM7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBOdW1iZXIodmFsdWUucmVwbGFjZSgvWystXS8sICcnKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gcmVzdWx0cy5jb250ZW50LnNwbGl0KCdcXG4nKTtcblxuICAgICAgICAgICAgLy8gR3JhYiBpbmZvIGFib3V0IGxpbmUgY29udGVudCwgaW5kZXgsIHRleHQgbGVuZ3RoIGFuZCBzdGFydC9lbmQgY2hhcmFjdGVyIHBvc2l0aW9uXG4gICAgICAgICAgICBjb25zdCBsaW5lSW5mb3M6IEFycmF5PExpbmVJbmZvPiA9IFtdXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGxpbmVzW2ldXG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW06IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGxpbmVJbmZvc1tpLTFdLmVuZCArIDFcbiAgICAgICAgICAgICAgICBsaW5lSW5mb3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG51bTogaSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGV4dC5sZW5ndGggKyBzdGFydFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzLnJlc3VsdC5jb250ZW50Lm1hcCgoW2Zyb20sIHRvXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRMaW5lcyA9IGxpbmVJbmZvc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh7IHN0YXJ0LCBlbmQgfSkgPT4gc3RhcnQgPD0gZnJvbSAmJiBlbmQgPj0gdG8pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBoaWdobGlnaHQobGluZS5zdGFydCwgbGluZS5lbmQsIGZyb20sIHRvLCBsaW5lLnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRMaW5lczogTGluZUluZm9bXSA9IFtdXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGVkTGluZSBvZiBtYXRjaGVkTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkxpbmVzID0gaXNNaW51cyB8fCBpc0NvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaW5lSW5mb3MuZmlsdGVyKGwgPT4gbWF0Y2hlZExpbmUubnVtIC0gbC5udW0gPiAwICYmIG1hdGNoZWRMaW5lLm51bSAtIGwubnVtIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRMaW5lcyA9IGlzUGx1cyB8fCBpc0NvbnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaW5lSW5mb3MuZmlsdGVyKGwgPT4gbC5udW0gLSBtYXRjaGVkTGluZS5udW0gPiAwICYmIGwubnVtIC0gbWF0Y2hlZExpbmUubnVtIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdXG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGluZXMucHVzaCggLi4ucHJldkxpbmVzLCBtYXRjaGVkTGluZSwgLi4ubmV4dExpbmVzIClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgcmVzdWx0TGluZXMubWFwKGUgPT4gZS50ZXh0KS5qb2luKCdcXG4nKVxuICAgICAgICAgICAgfSkubWFwKGxpbmUgPT4gbGltaXRWYWx1ZSA/IGxpbmUuc2xpY2UoMCwgbGltaXRWYWx1ZSkgOiBsaW5lKS5qb2luKCdcXG4nKVxuICAgICAgICB9LCBkZXNjOiAnZXh0cmFjdCBsaW5lIHdpdGggbWF0Y2hlcydcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ14oLit8KVxcXFwkc2VhcmNocmVzdWx0JyxcbiAgICAgICAgbG9vcDogdHJ1ZSxcbiAgICAgICAgZGVzYzogJycsXG4gICAgICAgIGZvcm1hdDogKF9wLCBzOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgZmlsZTogVEZpbGUsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHMuc2xpY2UoMCwgcy5pbmRleE9mKCckc2VhcmNocmVzdWx0JykpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuY2hpbGRyZW4ubWFwKG1hdGNoZWRGaWxlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgbWF0Y2hlZEZpbGUuZWwuaW5uZXJUZXh0XG4gICAgICAgICAgICB9KS5qb2luKCdcXG4nKVxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdeKC4rfClcXFxcJG1hdGNoJywgbG9vcDogdHJ1ZSwgZm9ybWF0OiAoX3AsIHM6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBmaWxlOiBURmlsZSwgcmVzdWx0cykgPT4ge1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdHMucmVzdWx0LmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RoZXJlIGlzIG5vIGNvbnRlbnQgaW4gcmVzdWx0cycpXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGVuZFByZWZpeChwcmVmaXg6IHN0cmluZywgbGluZTogc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIGxpbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByZWZpeENvbnRlbnQgPSBzLnNsaWNlKDAsIHMuaW5kZXhPZignJCcpKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMucmVzdWx0LmNvbnRlbnRcbiAgICAgICAgICAgICAgICAubWFwKChbZnJvbSwgdG9dKSA9PiByZXN1bHRzLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pKVxuICAgICAgICAgICAgICAgIC5tYXAobGluZSA9PiBhcHBlbmRQcmVmaXgocHJlZml4Q29udGVudCwgbGluZSkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgIH0sIGRlc2M6ICdleHRyYWN0IGZvdW5kIHNlbGVjdGlvbnMnXG4gICAgfSxcbl1cblxuZXhwb3J0IGRlZmF1bHQgc2VxdWVuY2VzIiwiaW1wb3J0IHtURmlsZX0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQge1NlYXJjaERldGFpbHN9IGZyb20gXCIuLi9tYWluXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RmlsZXNGcm9tU2VhcmNoUmVzdWx0cyhzZWFyY2hSZXN1bHRzOiBNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+LCBjdXJyZW50RmlsZU5hbWU6IHN0cmluZywgZXhjbHVkZUN1cnJlbnQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKHNlYXJjaFJlc3VsdHMua2V5cygpKVxuXG4gICAgcmV0dXJuIGV4Y2x1ZGVDdXJyZW50XG4gICAgICAgID8gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5iYXNlbmFtZSAhPT0gY3VycmVudEZpbGVOYW1lKVxuICAgICAgICA6IGZpbGVzO1xufSIsIiFmdW5jdGlvbihlLG4pe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJleHBvcnRzXCJdLG4pOm4oKGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5FdGE9e30pfSh0aGlzLChmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBuKGUpe3ZhciB0LHIsaT1uZXcgRXJyb3IoZSk7cmV0dXJuIHQ9aSxyPW4ucHJvdG90eXBlLE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxyKTp0Ll9fcHJvdG9fXz1yLGl9ZnVuY3Rpb24gdChlLHQscil7dmFyIGk9dC5zbGljZSgwLHIpLnNwbGl0KC9cXG4vKSxhPWkubGVuZ3RoLG89aVthLTFdLmxlbmd0aCsxO3Rocm93IG4oZSs9XCIgYXQgbGluZSBcIithK1wiIGNvbCBcIitvK1wiOlxcblxcbiAgXCIrdC5zcGxpdCgvXFxuLylbYS0xXStcIlxcbiAgXCIrQXJyYXkobykuam9pbihcIiBcIikrXCJeXCIpfW4ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLHtuYW1lOnt2YWx1ZTpcIkV0YSBFcnJvclwiLGVudW1lcmFibGU6ITF9fSk7dmFyIHI9bmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKS5Qcm9taXNlO2Z1bmN0aW9uIGkoZSxuKXtmb3IodmFyIHQgaW4gbilyPW4saT10LE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLGkpJiYoZVt0XT1uW3RdKTt2YXIgcixpO3JldHVybiBlfWZ1bmN0aW9uIGEoZSxuLHQscil7dmFyIGksYTtyZXR1cm4gQXJyYXkuaXNBcnJheShuLmF1dG9UcmltKT8oaT1uLmF1dG9UcmltWzFdLGE9bi5hdXRvVHJpbVswXSk6aT1hPW4uYXV0b1RyaW0sKHR8fCExPT09dCkmJihpPXQpLChyfHwhMT09PXIpJiYoYT1yKSxhfHxpP1wic2x1cnBcIj09PWkmJlwic2x1cnBcIj09PWE/ZS50cmltKCk6KFwiX1wiPT09aXx8XCJzbHVycFwiPT09aT9lPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0P2UudHJpbUxlZnQoKTplLnJlcGxhY2UoL15cXHMrLyxcIlwiKX0oZSk6XCItXCIhPT1pJiZcIm5sXCIhPT1pfHwoZT1lLnJlcGxhY2UoL14oPzpcXHJcXG58XFxufFxccikvLFwiXCIpKSxcIl9cIj09PWF8fFwic2x1cnBcIj09PWE/ZT1mdW5jdGlvbihlKXtyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS50cmltUmlnaHQ/ZS50cmltUmlnaHQoKTplLnJlcGxhY2UoL1xccyskLyxcIlwiKX0oZSk6XCItXCIhPT1hJiZcIm5sXCIhPT1hfHwoZT1lLnJlcGxhY2UoLyg/OlxcclxcbnxcXG58XFxyKSQvLFwiXCIpKSxlKTplfXZhciBvPXtcIiZcIjpcIiZhbXA7XCIsXCI8XCI6XCImbHQ7XCIsXCI+XCI6XCImZ3Q7XCIsJ1wiJzpcIiZxdW90O1wiLFwiJ1wiOlwiJiMzOTtcIn07ZnVuY3Rpb24gYyhlKXtyZXR1cm4gb1tlXX12YXIgcz0vYCg/OlxcXFxbXFxzXFxTXXxcXCR7KD86W157fV18eyg/Oltee31dfHtbXn1dKn0pKn0pKn18KD8hXFwkeylbXlxcXFxgXSkqYC9nLGw9LycoPzpcXFxcW1xcc1xcd1wiJ1xcXFxgXXxbXlxcblxccidcXFxcXSkqPycvZyx1PS9cIig/OlxcXFxbXFxzXFx3XCInXFxcXGBdfFteXFxuXFxyXCJcXFxcXSkqP1wiL2c7ZnVuY3Rpb24gcChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bLiorXFwtP14ke30oKXxbXFxdXFxcXF0vZyxcIlxcXFwkJlwiKX1mdW5jdGlvbiBmKGUsbil7dmFyIHI9W10saT0hMSxvPTAsYz1uLnBhcnNlO2lmKG4ucGx1Z2lucylmb3IodmFyIGY9MDtmPG4ucGx1Z2lucy5sZW5ndGg7ZisrKXsoVD1uLnBsdWdpbnNbZl0pLnByb2Nlc3NUZW1wbGF0ZSYmKGU9VC5wcm9jZXNzVGVtcGxhdGUoZSxuKSl9ZnVuY3Rpb24gZChlLHQpe2UmJihlPWEoZSxuLGksdCkpJiYoZT1lLnJlcGxhY2UoL1xcXFx8Jy9nLFwiXFxcXCQmXCIpLnJlcGxhY2UoL1xcclxcbnxcXG58XFxyL2csXCJcXFxcblwiKSxyLnB1c2goZSkpfW4ucm1XaGl0ZXNwYWNlJiYoZT1lLnJlcGxhY2UoL1tcXHJcXG5dKy9nLFwiXFxuXCIpLnJlcGxhY2UoL15cXHMrfFxccyskL2dtLFwiXCIpKSxzLmxhc3RJbmRleD0wLGwubGFzdEluZGV4PTAsdS5sYXN0SW5kZXg9MDtmb3IodmFyIGcsaD1bYy5leGVjLGMuaW50ZXJwb2xhdGUsYy5yYXddLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSYmbj9lK1wifFwiK3Aobik6bj9wKG4pOmV9KSxcIlwiKSxtPW5ldyBSZWdFeHAoXCIoW15dKj8pXCIrcChuLnRhZ3NbMF0pK1wiKC18Xyk/XFxcXHMqKFwiK2grXCIpP1xcXFxzKlwiLFwiZ1wiKSx2PW5ldyBSZWdFeHAoXCInfFxcXCJ8YHxcXFxcL1xcXFwqfChcXFxccyooLXxfKT9cIitwKG4udGFnc1sxXSkrXCIpXCIsXCJnXCIpO2c9bS5leGVjKGUpOyl7bz1nWzBdLmxlbmd0aCtnLmluZGV4O3ZhciB5PWdbMV0seD1nWzJdLF89Z1szXXx8XCJcIjtkKHkseCksdi5sYXN0SW5kZXg9bztmb3IodmFyIHc9dm9pZCAwLGI9ITE7dz12LmV4ZWMoZSk7KXtpZih3WzFdKXt2YXIgRT1lLnNsaWNlKG8sdy5pbmRleCk7bS5sYXN0SW5kZXg9bz12Lmxhc3RJbmRleCxpPXdbMl0sYj17dDpfPT09Yy5leGVjP1wiZVwiOl89PT1jLnJhdz9cInJcIjpfPT09Yy5pbnRlcnBvbGF0ZT9cImlcIjpcIlwiLHZhbDpFfTticmVha312YXIgST13WzBdO2lmKFwiLypcIj09PUkpe3ZhciBSPWUuaW5kZXhPZihcIiovXCIsdi5sYXN0SW5kZXgpOy0xPT09UiYmdChcInVuY2xvc2VkIGNvbW1lbnRcIixlLHcuaW5kZXgpLHYubGFzdEluZGV4PVJ9ZWxzZSBpZihcIidcIj09PUkpe2wubGFzdEluZGV4PXcuaW5kZXgsbC5leGVjKGUpP3YubGFzdEluZGV4PWwubGFzdEluZGV4OnQoXCJ1bmNsb3NlZCBzdHJpbmdcIixlLHcuaW5kZXgpfWVsc2UgaWYoJ1wiJz09PUkpe3UubGFzdEluZGV4PXcuaW5kZXgsdS5leGVjKGUpP3YubGFzdEluZGV4PXUubGFzdEluZGV4OnQoXCJ1bmNsb3NlZCBzdHJpbmdcIixlLHcuaW5kZXgpfWVsc2UgaWYoXCJgXCI9PT1JKXtzLmxhc3RJbmRleD13LmluZGV4LHMuZXhlYyhlKT92Lmxhc3RJbmRleD1zLmxhc3RJbmRleDp0KFwidW5jbG9zZWQgc3RyaW5nXCIsZSx3LmluZGV4KX19Yj9yLnB1c2goYik6dChcInVuY2xvc2VkIHRhZ1wiLGUsZy5pbmRleCt5Lmxlbmd0aCl9aWYoZChlLnNsaWNlKG8sZS5sZW5ndGgpLCExKSxuLnBsdWdpbnMpZm9yKGY9MDtmPG4ucGx1Z2lucy5sZW5ndGg7ZisrKXt2YXIgVDsoVD1uLnBsdWdpbnNbZl0pLnByb2Nlc3NBU1QmJihyPVQucHJvY2Vzc0FTVChyLG4pKX1yZXR1cm4gcn1mdW5jdGlvbiBkKGUsbil7dmFyIHQ9ZihlLG4pLHI9XCJ2YXIgdFI9JycsX19sLF9fbFBcIisobi5pbmNsdWRlP1wiLGluY2x1ZGU9RS5pbmNsdWRlLmJpbmQoRSlcIjpcIlwiKSsobi5pbmNsdWRlRmlsZT9cIixpbmNsdWRlRmlsZT1FLmluY2x1ZGVGaWxlLmJpbmQoRSlcIjpcIlwiKStcIlxcbmZ1bmN0aW9uIGxheW91dChwLGQpe19fbD1wO19fbFA9ZH1cXG5cIisobi51c2VXaXRoP1wid2l0aChcIituLnZhck5hbWUrXCJ8fHt9KXtcIjpcIlwiKStmdW5jdGlvbihlLG4pe3ZhciB0PTAscj1lLmxlbmd0aCxpPVwiXCI7Zm9yKDt0PHI7dCsrKXt2YXIgYT1lW3RdO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXtpKz1cInRSKz0nXCIrYStcIidcXG5cIn1lbHNle3ZhciBvPWEudCxjPWEudmFsfHxcIlwiO1wiclwiPT09bz8obi5maWx0ZXImJihjPVwiRS5maWx0ZXIoXCIrYytcIilcIiksaSs9XCJ0Uis9XCIrYytcIlxcblwiKTpcImlcIj09PW8/KG4uZmlsdGVyJiYoYz1cIkUuZmlsdGVyKFwiK2MrXCIpXCIpLG4uYXV0b0VzY2FwZSYmKGM9XCJFLmUoXCIrYytcIilcIiksaSs9XCJ0Uis9XCIrYytcIlxcblwiKTpcImVcIj09PW8mJihpKz1jK1wiXFxuXCIpfX1yZXR1cm4gaX0odCxuKSsobi5pbmNsdWRlRmlsZT9cImlmKF9fbCl0Uj1cIisobi5hc3luYz9cImF3YWl0IFwiOlwiXCIpK1wiaW5jbHVkZUZpbGUoX19sLE9iamVjdC5hc3NpZ24oXCIrbi52YXJOYW1lK1wiLHtib2R5OnRSfSxfX2xQKSlcXG5cIjpuLmluY2x1ZGU/XCJpZihfX2wpdFI9XCIrKG4uYXN5bmM/XCJhd2FpdCBcIjpcIlwiKStcImluY2x1ZGUoX19sLE9iamVjdC5hc3NpZ24oXCIrbi52YXJOYW1lK1wiLHtib2R5OnRSfSxfX2xQKSlcXG5cIjpcIlwiKStcImlmKGNiKXtjYihudWxsLHRSKX0gcmV0dXJuIHRSXCIrKG4udXNlV2l0aD9cIn1cIjpcIlwiKTtpZihuLnBsdWdpbnMpZm9yKHZhciBpPTA7aTxuLnBsdWdpbnMubGVuZ3RoO2krKyl7dmFyIGE9bi5wbHVnaW5zW2ldO2EucHJvY2Vzc0ZuU3RyaW5nJiYocj1hLnByb2Nlc3NGblN0cmluZyhyLG4pKX1yZXR1cm4gcn12YXIgZz1uZXcoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuY2FjaGU9ZX1yZXR1cm4gZS5wcm90b3R5cGUuZGVmaW5lPWZ1bmN0aW9uKGUsbil7dGhpcy5jYWNoZVtlXT1ufSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2FjaGVbZV19LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXtkZWxldGUgdGhpcy5jYWNoZVtlXX0sZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPXt9fSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGUpe2kodGhpcy5jYWNoZSxlKX0sZX0oKSkoe30pO3ZhciBoPXthc3luYzohMSxhdXRvRXNjYXBlOiEwLGF1dG9UcmltOlshMSxcIm5sXCJdLGNhY2hlOiExLGU6ZnVuY3Rpb24oZSl7dmFyIG49U3RyaW5nKGUpO3JldHVybi9bJjw+XCInXS8udGVzdChuKT9uLnJlcGxhY2UoL1smPD5cIiddL2csYyk6bn0saW5jbHVkZTpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMudGVtcGxhdGVzLmdldChlKTtpZighcil0aHJvdyBuKCdDb3VsZCBub3QgZmV0Y2ggdGVtcGxhdGUgXCInK2UrJ1wiJyk7cmV0dXJuIHIodCx0aGlzKX0scGFyc2U6e2V4ZWM6XCJcIixpbnRlcnBvbGF0ZTpcIj1cIixyYXc6XCJ+XCJ9LHBsdWdpbnM6W10scm1XaGl0ZXNwYWNlOiExLHRhZ3M6W1wiPCVcIixcIiU+XCJdLHRlbXBsYXRlczpnLHVzZVdpdGg6ITEsdmFyTmFtZTpcIml0XCJ9O2Z1bmN0aW9uIG0oZSxuKXt2YXIgdD17fTtyZXR1cm4gaSh0LGgpLG4mJmkodCxuKSxlJiZpKHQsZSksdH1mdW5jdGlvbiB2KGUsdCl7dmFyIHI9bSh0fHx7fSksaT1yLmFzeW5jP2Z1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gKGFzeW5jIGZ1bmN0aW9uKCl7fSkuY29uc3RydWN0b3JcIikoKX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgU3ludGF4RXJyb3I/bihcIlRoaXMgZW52aXJvbm1lbnQgZG9lc24ndCBzdXBwb3J0IGFzeW5jL2F3YWl0XCIpOmV9fSgpOkZ1bmN0aW9uO3RyeXtyZXR1cm4gbmV3IGkoci52YXJOYW1lLFwiRVwiLFwiY2JcIixkKGUscikpfWNhdGNoKHQpe3Rocm93IHQgaW5zdGFuY2VvZiBTeW50YXhFcnJvcj9uKFwiQmFkIHRlbXBsYXRlIHN5bnRheFxcblxcblwiK3QubWVzc2FnZStcIlxcblwiK0FycmF5KHQubWVzc2FnZS5sZW5ndGgrMSkuam9pbihcIj1cIikrXCJcXG5cIitkKGUscikrXCJcXG5cIik6dH19ZnVuY3Rpb24geShlLG4pe2lmKG4uY2FjaGUmJm4ubmFtZSYmbi50ZW1wbGF0ZXMuZ2V0KG4ubmFtZSkpcmV0dXJuIG4udGVtcGxhdGVzLmdldChuLm5hbWUpO3ZhciB0PVwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTp2KGUsbik7cmV0dXJuIG4uY2FjaGUmJm4ubmFtZSYmbi50ZW1wbGF0ZXMuZGVmaW5lKG4ubmFtZSx0KSx0fWZ1bmN0aW9uIHgoZSx0LGksYSl7dmFyIG89bShpfHx7fSk7aWYoIW8uYXN5bmMpcmV0dXJuIHkoZSxvKSh0LG8pO2lmKCFhKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiByKXJldHVybiBuZXcgcigoZnVuY3Rpb24obixyKXt0cnl7bih5KGUsbykodCxvKSl9Y2F0Y2goZSl7cihlKX19KSk7dGhyb3cgbihcIlBsZWFzZSBwcm92aWRlIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHRoaXMgZW52IGRvZXNuJ3Qgc3VwcG9ydCBQcm9taXNlc1wiKX10cnl7eShlLG8pKHQsbyxhKX1jYXRjaChlKXtyZXR1cm4gYShlKX19ZS5jb21waWxlPXYsZS5jb21waWxlVG9TdHJpbmc9ZCxlLmNvbmZpZz1oLGUuY29uZmlndXJlPWZ1bmN0aW9uKGUpe3JldHVybiBpKGgsZSl9LGUuZGVmYXVsdENvbmZpZz1oLGUuZ2V0Q29uZmlnPW0sZS5wYXJzZT1mLGUucmVuZGVyPXgsZS5yZW5kZXJBc3luYz1mdW5jdGlvbihlLG4sdCxyKXtyZXR1cm4geChlLG4sT2JqZWN0LmFzc2lnbih7fSx0LHthc3luYzohMH0pLHIpfSxlLnRlbXBsYXRlcz1nLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXRhLm1pbi5qcy5tYXBcbiIsImltcG9ydCB7XG4gICAgRXhwYW5kZXJRdWVyeSxcbiAgICBnZXRBbGxFeHBhbmRlcnNRdWVyeSxcbiAgICBnZXRDbG9zZXN0UXVlcnksXG4gICAgZ2V0TGFzdExpbmVUb1JlcGxhY2Vcbn0gZnJvbSAnc3JjL2hlbHBlcnMvaGVscGVycyc7XG5pbXBvcnQge1xuICAgIEFwcCwgRWRpdG9yLFxuICAgIEZpbGVWaWV3LFxuICAgIE1hcmtkb3duVmlldyxcbiAgICBQbHVnaW4sXG4gICAgUGx1Z2luTWFuaWZlc3QsXG4gICAgUGx1Z2luU2V0dGluZ1RhYixcbiAgICBTZXR0aW5nLFxuICAgIFRGaWxlLCBWaWV3LCBXb3Jrc3BhY2VMZWFmXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCBzZXF1ZW5jZXMsIHtTZXF1ZW5jZXN9IGZyb20gXCIuL3NlcXVlbmNlcy9zZXF1ZW5jZXNcIjtcbmltcG9ydCB7c3BsaXRCeUxpbmVzfSBmcm9tIFwiLi9oZWxwZXJzL3N0cmluZ1wiO1xuaW1wb3J0IHtleHRyYWN0RmlsZXNGcm9tU2VhcmNoUmVzdWx0c30gZnJvbSBcIi4vaGVscGVycy9zZWFyY2gtcmVzdWx0c1wiO1xuaW1wb3J0IHtyZW5kZXJ9IGZyb20gXCJldGFcIjtcbmltcG9ydCB7Z2V0RmlsZUluZm99IGZyb20gXCIuL2hlbHBlcnMvdGZpbGVcIjtcblxuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzIHtcbiAgICBkZWxheTogbnVtYmVyXG4gICAgbGluZUVuZGluZzogc3RyaW5nXG4gICAgZGVmYXVsdFRlbXBsYXRlOiBzdHJpbmdcbiAgICBleGNsdWRlQ3VycmVudDogYm9vbGVhblxuICAgIGF1dG9FeHBhbmQ6IGJvb2xlYW5cbiAgICBwcmVmaXhlczoge1xuICAgICAgICBoZWFkZXI6IHN0cmluZ1xuICAgICAgICBmb290ZXI6IHN0cmluZ1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIFNlYXJjaExlYWYgZXh0ZW5kcyBXb3Jrc3BhY2VMZWFmIHtcbiAgICB2aWV3OiBWaWV3ICYge1xuICAgICAgICBzZWFyY2hDb21wb25lbnQ6IHtcbiAgICAgICAgICAgIGdldFZhbHVlOiAoKSA9PiBzdHJpbmdcbiAgICAgICAgICAgIHNldFZhbHVlOiAoczogc3RyaW5nKSA9PiB2b2lkXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVBhcmFtZXRlcnMge1xuICAgIGJhc2VuYW1lOiBzdHJpbmdcbiAgICBjb250ZW50OiBzdHJpbmdcbiAgICBleHRlbnNpb246IHN0cmluZ1xuICAgIGhlYWRpbmdzOiBBcnJheTxhbnk+XG4gICAgbGluazogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgcGF0aDogc3RyaW5nXG4gICAgc2VjdGlvbnM6IEFycmF5PGFueT5cbiAgICBzdGF0OiB7fVxuICAgIGZyb250bWF0dGVyOiB7IFtrOiBzdHJpbmddOiBhbnkgfVxuICAgIGxpbmtzOiBBcnJheTxhbnk+XG4gICAgbGlzdEl0ZW1zOiBBcnJheTxhbnk+XG59XG5cbnR5cGUgTnVtYmVyVHVwbGUgPSBbbnVtYmVyLCBudW1iZXJdXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoRGV0YWlscyB7XG4gICAgYXBwOiBBcHBcbiAgICBjaGlsZHJlbjogYW55W11cbiAgICBjaGlsZHJlbkVsOiBIVE1MRWxlbWVudFxuICAgIGNvbGxhcHNlRWw6IEhUTUxFbGVtZW50XG4gICAgY29sbGFwc2VkOiBib29sZWFuXG4gICAgY29sbGFwc2libGU6IGJvb2xlYW5cbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnRcbiAgICBjb250ZW50OiBzdHJpbmdcbiAgICBkb206IGFueVxuICAgIGVsOiBIVE1MRWxlbWVudFxuICAgIGV4dHJhQ29udGV4dDogKCkgPT4gYm9vbGVhblxuICAgIGZpbGU6IFRGaWxlXG4gICAgaW5mbzogYW55XG4gICAgb25NYXRjaFJlbmRlcjogYW55XG4gICAgcHVzaGVyRWw6IEhUTUxFbGVtZW50XG4gICAgcmVzdWx0OiB7XG4gICAgICAgIGZpbGVuYW1lPzogTnVtYmVyVHVwbGVbXVxuICAgICAgICBjb250ZW50PzogTnVtYmVyVHVwbGVbXVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGV4dEV4cGFuZGVyIGV4dGVuZHMgUGx1Z2luIHtcbiAgICBjbTogRWRpdG9yXG5cbiAgICBjb25maWc6IFBsdWdpblNldHRpbmdzID0ge1xuICAgICAgICBhdXRvRXhwYW5kOiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdFRlbXBsYXRlOiAnLSAkbGluaycsXG4gICAgICAgIGRlbGF5OiAzMDAsXG4gICAgICAgIGV4Y2x1ZGVDdXJyZW50OiB0cnVlLFxuICAgICAgICBsaW5lRW5kaW5nOiAnPC0tPicsXG4gICAgICAgIHByZWZpeGVzOiB7XG4gICAgICAgICAgICBoZWFkZXI6ICdeJyxcbiAgICAgICAgICAgIGZvb3RlcjogJz4nXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXFzOiBTZXF1ZW5jZXNbXSA9IHNlcXVlbmNlc1xuXG4gICAgbGVmdFBhbmVsSW5mbzoge1xuICAgICAgICBjb2xsYXBzZWQ6IGJvb2xlYW5cbiAgICAgICAgdGFiOiBudW1iZXJcbiAgICAgICAgdGV4dDogc3RyaW5nXG4gICAgfSA9IHtcbiAgICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgICAgdGFiOiAwLFxuICAgICAgICB0ZXh0OiAnJ1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFBsdWdpbk1hbmlmZXN0KSB7XG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcblxuICAgICAgICB0aGlzLnNlYXJjaCA9IHRoaXMuc2VhcmNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmF1dG9FeHBhbmQgPSB0aGlzLmF1dG9FeHBhbmQuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBhc3luYyBhdXRvRXhwYW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG9FeHBhbmQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aXZlTGVhZiA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmXG4gICAgICAgIGlmICghYWN0aXZlTGVhZikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3RpdmVWaWV3ID0gYWN0aXZlTGVhZi52aWV3XG4gICAgICAgIGNvbnN0IGlzQWxsb3dlZFZpZXcgPSBhY3RpdmVWaWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3XG4gICAgICAgIGlmICghaXNBbGxvd2VkVmlldykge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSlcbiAgICB9XG5cbiAgICBhc3luYyBvbmxvYWQoKSB7XG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJNYXJrZG93bkNvZGVCbG9ja1Byb2Nlc3NvcignZXhwYW5kZXInLCAoc291cmNlLCBlbCwgY3R4KSA9PiB7XG4gICAgICAgICAgICBlbFxuICAgICAgICAgICAgICAgIC5jcmVhdGVEaXYoKVxuICAgICAgICAgICAgICAgIC5jcmVhdGVFbCgnYnV0dG9uJywge3RleHQ6ICdSdW4gZXhwYW5kIHF1ZXJ5J30pXG4gICAgICAgICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5pbml0LmJpbmQodGhpcywgZmFsc2UsIGN0eC5nZXRTZWN0aW9uSW5mbyhlbCkubGluZVN0YXJ0KSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiAnZWRpdG9yLWV4cGFuZCcsXG4gICAgICAgICAgICBuYW1lOiAnZXhwYW5kJyxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmluaXQsXG4gICAgICAgICAgICBob3RrZXlzOiBbXVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6ICdlZGl0b3ItZXhwYW5kLWFsbCcsXG4gICAgICAgICAgICBuYW1lOiAnZXhwYW5kIGFsbCcsXG4gICAgICAgICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5pbml0KHRydWUpLFxuICAgICAgICAgICAgaG90a2V5czogW11cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLmF1dG9FeHBhbmQpO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKCkgYXMgUGx1Z2luU2V0dGluZ3NcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgICAgICAgIC4uLmRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9udW5sb2FkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygndW5sb2FkaW5nIHBsdWdpbicpO1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub2ZmKCdmaWxlLW9wZW4nLCB0aGlzLmF1dG9FeHBhbmQpO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLmNvbmZpZylcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXQocHJvY2VlZEFsbFF1ZXJpZXNPblBhZ2UgPSBmYWxzZSwgbGluZVRvU3RhcnQ/OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3XG5cbiAgICAgICAgLy8gSXMgb24gZWRpdGFibGUgdmlld1xuICAgICAgICBpZiAoIShjdXJyZW50VmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY21Eb2M6IEVkaXRvciA9IHRoaXMuY20gPSBjdXJyZW50Vmlldy5lZGl0b3JcblxuICAgICAgICBjb25zdCBjdXJOdW0gPSBsaW5lVG9TdGFydCB8fCBjbURvYy5nZXRDdXJzb3IoKS5saW5lXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjbURvYy5nZXRWYWx1ZSgpXG5cbiAgICAgICAgaWYgKGxpbmVUb1N0YXJ0KSB7XG4gICAgICAgICAgICBjbURvYy5zZXRDdXJzb3IobGluZVRvU3RhcnQgPyBsaW5lVG9TdGFydCAtIDEgOiAwKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gc3BsaXRCeUxpbmVzKGNvbnRlbnQpXG4gICAgICAgIGNvbnN0IGZpbmRRdWVyaWVzID0gZ2V0QWxsRXhwYW5kZXJzUXVlcnkoZm9ybWF0dGVkKVxuICAgICAgICBjb25zdCBjbG9zZXN0UXVlcnkgPSBnZXRDbG9zZXN0UXVlcnkoZmluZFF1ZXJpZXMsIGN1ck51bSlcblxuICAgICAgICBpZiAocHJvY2VlZEFsbFF1ZXJpZXNPblBhZ2UpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmRRdWVyaWVzLnJlZHVjZSgocHJvbWlzZSwgcXVlcnksIGkpID0+XG4gICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IHNwbGl0QnlMaW5lcyhjbURvYy5nZXRWYWx1ZSgpKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkUXVlcmllcyA9IGdldEFsbEV4cGFuZGVyc1F1ZXJ5KG5ld0NvbnRlbnQpXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuRXhwYW5kZXJDb2RlQmxvY2sodXBkYXRlZFF1ZXJpZXNbaV0sIG5ld0NvbnRlbnQsIGN1cnJlbnRWaWV3KVxuICAgICAgICAgICAgICAgIH0pLCBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5FeHBhbmRlckNvZGVCbG9jayhjbG9zZXN0UXVlcnksIGZvcm1hdHRlZCwgY3VycmVudFZpZXcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1bkV4cGFuZGVyQ29kZUJsb2NrKHF1ZXJ5OiBFeHBhbmRlclF1ZXJ5LCBjb250ZW50OiBzdHJpbmdbXSwgdmlldzogTWFya2Rvd25WaWV3KSB7XG4gICAgICAgIGNvbnN0IHtsaW5lRW5kaW5nLCBwcmVmaXhlc30gPSB0aGlzLmNvbmZpZ1xuXG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24oJ0V4cGFuZCBxdWVyeSBub3QgZm91bmQnKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyT2xkUmVzdWx0c0luRmlsZShjb250ZW50LCBxdWVyeSwgbGluZUVuZGluZyk7XG5cbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IHNwbGl0QnlMaW5lcyh0aGlzLmNtLmdldFZhbHVlKCkpO1xuXG4gICAgICAgIGlmIChxdWVyeS5xdWVyeSAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoKHF1ZXJ5LnF1ZXJ5KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1blRlbXBsYXRlUHJvY2Vzc2luZyhxdWVyeSwgZ2V0TGFzdExpbmVUb1JlcGxhY2UobmV3Q29udGVudCwgcXVlcnksIHRoaXMuY29uZmlnLmxpbmVFbmRpbmcpLCBwcmVmaXhlcywgdmlldylcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJ1blRlbXBsYXRlUHJvY2Vzc2luZyhxdWVyeTogRXhwYW5kZXJRdWVyeSwgbGFzdExpbmU6IG51bWJlciwgcHJlZml4ZXM6IFBsdWdpblNldHRpbmdzW1wicHJlZml4ZXNcIl0sIGN1cnJlbnRWaWV3OiBNYXJrZG93blZpZXcpIHtcbiAgICAgICAgbGV0IGN1cnJlbnRGaWxlTmFtZSA9ICcnXG5cbiAgICAgICAgY29uc3QgdGVtcGxhdGVDb250ZW50ID0gcXVlcnkudGVtcGxhdGUuc3BsaXQoJ1xcbicpXG5cbiAgICAgICAgY29uc3Qge2hlYWRpbmcsIGZvb3RlciwgcmVwZWF0YWJsZUNvbnRlbnR9ID0gdGhpcy5wYXJzZVRlbXBsYXRlKHByZWZpeGVzLCB0ZW1wbGF0ZUNvbnRlbnQpO1xuXG4gICAgICAgIGlmIChjdXJyZW50VmlldyBpbnN0YW5jZW9mIEZpbGVWaWV3KSB7XG4gICAgICAgICAgICBjdXJyZW50RmlsZU5hbWUgPSBjdXJyZW50Vmlldy5maWxlLmJhc2VuYW1lXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVMZWZ0UGFuZWxTdGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSBhd2FpdCB0aGlzLmdldEZvdW5kQWZ0ZXJEZWxheShxdWVyeS5xdWVyeSA9PT0gJycpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGV4dHJhY3RGaWxlc0Zyb21TZWFyY2hSZXN1bHRzKHNlYXJjaFJlc3VsdHMsIGN1cnJlbnRGaWxlTmFtZSwgdGhpcy5jb25maWcuZXhjbHVkZUN1cnJlbnQpO1xuXG4gICAgICAgIHRoaXMucmVzdG9yZUxlZnRQYW5lbFN0YXRlKCk7XG5cbiAgICAgICAgY3VycmVudFZpZXcuZWRpdG9yLmZvY3VzKCk7XG5cbiAgICAgICAgY29uc3QgY3VycmVudEZpbGVJbmZvOiB7fSA9IChjdXJyZW50VmlldyBpbnN0YW5jZW9mIEZpbGVWaWV3KVxuICAgICAgICAgICAgPyBhd2FpdCBnZXRGaWxlSW5mbyh0aGlzLCBjdXJyZW50Vmlldy5maWxlKVxuICAgICAgICAgICAgOiB7fVxuICAgICAgICBjb25zdCBmaWxlc0luZm8gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGZpbGVzLm1hcChmaWxlID0+IGdldEZpbGVJbmZvKHRoaXMsIGZpbGUpKVxuICAgICAgICApXG5cbiAgICAgICAgbGV0IGNoYW5nZWQ7XG5cbiAgICAgICAgaWYgKHF1ZXJ5LnRlbXBsYXRlLmNvbnRhaW5zKFwiPCVcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlVG9SZW5kZXIgPSByZXBlYXRhYmxlQ29udGVudC5qb2luKCdcXG4nKVxuICAgICAgICAgICAgY29uc3QgZGF0YVRvUmVuZGVyID0ge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IGN1cnJlbnRGaWxlSW5mbyxcbiAgICAgICAgICAgICAgICBmaWxlczogZmlsZXNJbmZvXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoYW5nZWQgPSBhd2FpdCByZW5kZXIodGVtcGxhdGVUb1JlbmRlciwgZGF0YVRvUmVuZGVyLCB7YXV0b0VzY2FwZTogZmFsc2V9KVxuICAgICAgICAgICAgLy8gY2hhbmdlZCA9IGRvVC50ZW1wbGF0ZSh0ZW1wbGF0ZVRvUmVuZGVyLCB7c3RyaXA6IGZhbHNlfSkoZGF0YVRvUmVuZGVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hhbmdlZCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVUZW1wbGF0ZUZyb21TZXF1ZW5jZXMoZmlsZXMsIHJlcGVhdGFibGVDb250ZW50LCBzZWFyY2hSZXN1bHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSBbXG4gICAgICAgICAgICBoZWFkaW5nLFxuICAgICAgICAgICAgY2hhbmdlZCxcbiAgICAgICAgICAgIGZvb3RlcixcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmxpbmVFbmRpbmdcbiAgICAgICAgXS5maWx0ZXIoZSA9PiBlKS5qb2luKCdcXG4nKVxuXG4gICAgICAgIC8vIERvIG5vdCBwYXN0ZSBnZW5lcmF0ZWQgY29udGVudCBpZiB1c2VkIGNoYW5nZWQgYWN0aXZlTGVhZlxuICAgICAgICBjb25zdCB2aWV3QmVmb3JlUmVwbGFjZSA9IHRoaXMuYXBwLndvcmtzcGFjZS5hY3RpdmVMZWFmLnZpZXdcbiAgICAgICAgaWYgKCEodmlld0JlZm9yZVJlcGxhY2UgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpIHx8IHZpZXdCZWZvcmVSZXBsYWNlLmZpbGUuYmFzZW5hbWUgIT09IGN1cnJlbnRGaWxlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50Vmlldy5lZGl0b3IucmVwbGFjZVJhbmdlKHJlc3VsdCxcbiAgICAgICAgICAgIHtsaW5lOiBxdWVyeS5lbmQgKyAxLCBjaDogMH0sXG4gICAgICAgICAgICB7bGluZTogbGFzdExpbmUsIGNoOiB0aGlzLmNtLmdldExpbmUobGFzdExpbmUpPy5sZW5ndGggfHwgMH0pXG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlRnJvbVNlcXVlbmNlcyhmaWxlczogVEZpbGVbXSwgcmVwZWF0YWJsZUNvbnRlbnQ6IHN0cmluZ1tdLCBzZWFyY2hSZXN1bHRzPzogTWFwPFRGaWxlLCBTZWFyY2hEZXRhaWxzPik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICghc2VhcmNoUmVzdWx0cykge1xuICAgICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFuZ2VkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBmaWxlc1xuICAgICAgICAgICAgICAgIC5tYXAoYXN5bmMgKGZpbGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwocmVwZWF0YWJsZUNvbnRlbnQubWFwKGFzeW5jIChzKSA9PiBhd2FpdCB0aGlzLmFwcGx5VGVtcGxhdGVUb1NlYXJjaFJlc3VsdHMoc2VhcmNoUmVzdWx0cywgZmlsZSwgcywgaSkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBjaGFuZ2VkLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VUZW1wbGF0ZShwcmVmaXhlczogeyBoZWFkZXI6IHN0cmluZzsgZm9vdGVyOiBzdHJpbmcgfSwgdGVtcGxhdGVDb250ZW50OiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBpc0hlYWRlciA9IChsaW5lOiBzdHJpbmcpID0+IGxpbmUuc3RhcnRzV2l0aChwcmVmaXhlcy5oZWFkZXIpXG4gICAgICAgIGNvbnN0IGlzRm9vdGVyID0gKGxpbmU6IHN0cmluZykgPT4gbGluZS5zdGFydHNXaXRoKHByZWZpeGVzLmZvb3RlcilcbiAgICAgICAgY29uc3QgaXNSZXBlYXQgPSAobGluZTogc3RyaW5nKSA9PiAhaXNIZWFkZXIobGluZSkgJiYgIWlzRm9vdGVyKGxpbmUpXG5cbiAgICAgICAgY29uc3QgaGVhZGluZyA9IHRlbXBsYXRlQ29udGVudC5maWx0ZXIoaXNIZWFkZXIpLm1hcCgocykgPT4gcy5zbGljZSgxKSkuam9pbignXFxuJylcbiAgICAgICAgY29uc3QgZm9vdGVyID0gdGVtcGxhdGVDb250ZW50LmZpbHRlcihpc0Zvb3RlcikubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5qb2luKCdcXG4nKVxuICAgICAgICBjb25zdCByZXBlYXRhYmxlQ29udGVudCA9XG4gICAgICAgICAgICB0ZW1wbGF0ZUNvbnRlbnQuZmlsdGVyKGlzUmVwZWF0KS5maWx0ZXIoZSA9PiBlKS5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICA/IFt0aGlzLmNvbmZpZy5kZWZhdWx0VGVtcGxhdGVdXG4gICAgICAgICAgICAgICAgOiB0ZW1wbGF0ZUNvbnRlbnQuZmlsdGVyKGlzUmVwZWF0KS5maWx0ZXIoZSA9PiBlKVxuICAgICAgICByZXR1cm4ge2hlYWRpbmcsIGZvb3RlciwgcmVwZWF0YWJsZUNvbnRlbnR9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZUxlZnRQYW5lbFN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxlZnRQYW5lbEluZm8gPSB7XG4gICAgICAgICAgICBjb2xsYXBzZWQ6IHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY29sbGFwc2VkLFxuICAgICAgICAgICAgdGFiOiB0aGlzLmdldFNlYXJjaFRhYkluZGV4KCksXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLmdldFNlYXJjaFZhbHVlKCksXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc3RvcmVMZWZ0UGFuZWxTdGF0ZSgpIHtcbiAgICAgICAgY29uc3Qge2NvbGxhcHNlZCwgdGFiLCB0ZXh0fSA9IHRoaXMubGVmdFBhbmVsSW5mbztcbiAgICAgICAgY29uc3Qgc3BsaXRDaGlsZHJlbiA9IHRoaXMuZ2V0TGVmdFNwbGl0RWxlbWVudCgpXG5cbiAgICAgICAgdGhpcy5nZXRTZWFyY2hWaWV3KCkuc2VhcmNoQ29tcG9uZW50LnNldFZhbHVlKHRleHQpXG5cbiAgICAgICAgaWYgKHRhYiAhPT0gc3BsaXRDaGlsZHJlbi5jdXJyZW50VGFiKSB7XG4gICAgICAgICAgICBzcGxpdENoaWxkcmVuLnNlbGVjdFRhYkluZGV4KHRhYilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5sZWZ0U3BsaXQuY29sbGFwc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWFyY2goczogc3RyaW5nKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgZ2xvYmFsU2VhcmNoRm4gPSB0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0UGx1Z2luQnlJZCgnZ2xvYmFsLXNlYXJjaCcpLmluc3RhbmNlLm9wZW5HbG9iYWxTZWFyY2guYmluZCh0aGlzKVxuICAgICAgICBjb25zdCBzZWFyY2ggPSAocXVlcnk6IHN0cmluZykgPT4gZ2xvYmFsU2VhcmNoRm4ocXVlcnkpXG5cbiAgICAgICAgc2VhcmNoKHMpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRMZWZ0U3BsaXRFbGVtZW50KCk6IHtcbiAgICAgICAgY3VycmVudFRhYjogbnVtYmVyXG4gICAgICAgIHNlbGVjdFRhYkluZGV4OiAobjogbnVtYmVyKSA9PiB2b2lkXG4gICAgICAgIGNoaWxkcmVuOiBBcnJheTxXb3Jrc3BhY2VMZWFmIHwgU2VhcmNoTGVhZj5cbiAgICB9IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gdGhpcy5hcHAud29ya3NwYWNlLmxlZnRTcGxpdC5jaGlsZHJlblswXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlYXJjaFZpZXcoKTogU2VhcmNoTGVhZlsndmlldyddIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0TGVmdFNwbGl0RWxlbWVudCgpLmNoaWxkcmVuLmZpbHRlcihlID0+IGUuZ2V0Vmlld1N0YXRlKCkudHlwZSA9PT0gJ3NlYXJjaCcpWzBdLnZpZXdcblxuICAgICAgICBpZiAoJ3NlYXJjaENvbXBvbmVudCcgaW4gdmlldykge1xuICAgICAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VhcmNoVmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuZ2V0U2VhcmNoVmlldygpO1xuXG4gICAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5zZWFyY2hDb21wb25lbnQuZ2V0VmFsdWUoKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZWFyY2hUYWJJbmRleCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBsZWZ0VGFicyA9IHRoaXMuZ2V0TGVmdFNwbGl0RWxlbWVudCgpLmNoaWxkcmVuO1xuICAgICAgICBsZXQgc2VhcmNoVGFiSWQ6IHN0cmluZztcblxuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UuaXRlcmF0ZUFsbExlYXZlcygobGVhZjogV29ya3NwYWNlTGVhZiAmIHsgaWQ6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICBpZiAobGVhZi5nZXRWaWV3U3RhdGUoKS50eXBlID09IFwic2VhcmNoXCIpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hUYWJJZCA9IGxlYWYuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGVmdFRhYnMuZmluZEluZGV4KChpdGVtOiBhbnksIF9pbmRleDogbnVtYmVyLCBfYXJyYXk6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5pZCA9PSBzZWFyY2hUYWJJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRGb3VuZEFmdGVyRGVsYXkoaW1tZWRpYXRlOiBib29sZWFuKTogUHJvbWlzZTxNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaExlYWYgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKCdzZWFyY2gnKVswXVxuICAgICAgICBjb25zdCB2aWV3ID0gYXdhaXQgc2VhcmNoTGVhZi5vcGVuKHNlYXJjaExlYWYudmlldylcblxuICAgICAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZpZXcuZG9tLnJlc3VsdERvbUxvb2t1cCBhcyBNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh2aWV3LmRvbS5yZXN1bHREb21Mb29rdXAgYXMgTWFwPFRGaWxlLCBTZWFyY2hEZXRhaWxzPilcbiAgICAgICAgICAgIH0sIHRoaXMuY29uZmlnLmRlbGF5KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXBwbHlUZW1wbGF0ZVRvU2VhcmNoUmVzdWx0cyhzZWFyY2hSZXN1bHRzOiBNYXA8VEZpbGUsIFNlYXJjaERldGFpbHM+LCBmaWxlOiBURmlsZSwgdGVtcGxhdGU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IChuZXcgUmVnRXhwKHRoaXMuc2Vxcy5maWx0ZXIoZSA9PiBlLnJlYWRDb250ZW50KS5tYXAoZSA9PiBlLm5hbWUpLmpvaW4oJ3wnKSkudGVzdCh0ZW1wbGF0ZSkpXG4gICAgICAgICAgICA/IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSlcbiAgICAgICAgICAgIDogJydcblxuICAgICAgICByZXR1cm4gdGhpcy5zZXFzLnJlZHVjZSgoYWNjLCBzZXEpID0+XG4gICAgICAgICAgICBhY2MucmVwbGFjZShuZXcgUmVnRXhwKHNlcS5uYW1lLCAnZ3UnKSwgcmVwbGFjZSA9PiBzZXEuZm9ybWF0KHRoaXMsIHJlcGxhY2UsIGZpbGVDb250ZW50LCBmaWxlLCBzZWFyY2hSZXN1bHRzLmdldChmaWxlKSwgaW5kZXgpKSwgdGVtcGxhdGUpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhck9sZFJlc3VsdHNJbkZpbGUoY29udGVudDogc3RyaW5nW10sIHF1ZXJ5OiBFeHBhbmRlclF1ZXJ5LCBsaW5lRW5kaW5nOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGFzdExpbmUgPSBnZXRMYXN0TGluZVRvUmVwbGFjZShjb250ZW50LCBxdWVyeSwgdGhpcy5jb25maWcubGluZUVuZGluZylcbiAgICAgICAgdGhpcy5jbS5yZXBsYWNlUmFuZ2UoJ1xcbicgKyBsaW5lRW5kaW5nLFxuICAgICAgICAgICAge2xpbmU6IHF1ZXJ5LmVuZCArIDEsIGNoOiAwfSxcbiAgICAgICAgICAgIHtsaW5lOiBsYXN0TGluZSwgY2g6IHRoaXMuY20uZ2V0TGluZShsYXN0TGluZSk/Lmxlbmd0aCB8fCAwfSlcbiAgICB9XG59XG5cbmNsYXNzIFNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgICBwbHVnaW46IFRleHRFeHBhbmRlclxuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogVGV4dEV4cGFuZGVyKSB7XG4gICAgICAgIHN1cGVyKGFwcCwgcGx1Z2luKTtcblxuICAgICAgICB0aGlzLmFwcCA9IGFwcFxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpblxuICAgIH1cblxuICAgIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgICAgIGxldCB7Y29udGFpbmVyRWx9ID0gdGhpcztcblxuICAgICAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdoMicsIHt0ZXh0OiAnU2V0dGluZ3MgZm9yIFRleHQgRXhwYW5kZXInfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnQXV0byBFeHBhbmQnKVxuICAgICAgICAgICAgLnNldERlc2MoJ0V4cGFuZCBhbGwgcXVlcmllcyBpbiBhIGZpbGUgb25jZSB5b3Ugb3BlbiBpdCcpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB7XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcuYXV0b0V4cGFuZClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5hdXRvRXhwYW5kID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0RlbGF5JylcbiAgICAgICAgICAgIC5zZXREZXNjKCdUZXh0IGV4cGFuZGVyIGRvblxcJyB3YWl0IHVudGlsIHNlYXJjaCBjb21wbGV0ZWQuIEl0IHdhaXRzIGZvciBhIGRlbGF5IGFuZCBwYXN0ZSByZXN1bHQgYWZ0ZXIgdGhhdC4nKVxuICAgICAgICAgICAgLmFkZFNsaWRlcihzbGlkZXIgPT4ge1xuICAgICAgICAgICAgICAgIHNsaWRlci5zZXRMaW1pdHMoMTAwLCAxMDAwMCwgMTAwKVxuICAgICAgICAgICAgICAgIHNsaWRlci5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcuZGVsYXkpXG4gICAgICAgICAgICAgICAgc2xpZGVyLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmRlbGF5ID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHNsaWRlci5zZXREeW5hbWljVG9vbHRpcCgpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0xpbmUgZW5kaW5nJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdZb3UgY2FuIHNwZWNpZnkgdGhlIHRleHQgd2hpY2ggd2lsbCBhcHBlYXIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZ2VuZXJhdGVkIHRleHQuJylcbiAgICAgICAgICAgIC5hZGRUZXh0KHRleHQgPT4ge1xuICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uY29uZmlnLmxpbmVFbmRpbmcpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmxpbmVFbmRpbmcgPSB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0RlZmF1bHQgdGVtcGxhdGUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1lvdSBjYW4gc3BlY2lmeSBkZWZhdWx0IHRlbXBsYXRlJylcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYSh0ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICB0ZXh0LnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5kZWZhdWx0VGVtcGxhdGUpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSh2YWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uY29uZmlnLmRlZmF1bHRUZW1wbGF0ZSA9IHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnRXhjbHVkZSBjdXJyZW50IGZpbGUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1lvdSBjYW4gc3BlY2lmeSBzaG91bGQgdGV4dCBleHBhbmRlciBleGNsdWRlIHJlc3VsdHMgZnJvbSBjdXJyZW50IGZpbGUgb3Igbm90JylcbiAgICAgICAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmNvbmZpZy5leGNsdWRlQ3VycmVudClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5leGNsdWRlQ3VycmVudCA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXRIZWFkaW5nKClcbiAgICAgICAgICAgIC5zZXROYW1lKCdQcmVmaXhlcycpXG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnSGVhZGVyJylcbiAgICAgICAgICAgIC5zZXREZXNjKCdMaW5lIHByZWZpeGVkIGJ5IHRoaXMgc3ltYm9sIHdpbGwgYmUgcmVjb2duaXplZCBhcyBoZWFkZXInKVxuICAgICAgICAgICAgLmFkZFRleHQodGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5jb25maWcucHJlZml4ZXMuaGVhZGVyKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UodmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmNvbmZpZy5wcmVmaXhlcy5oZWFkZXIgPSB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0Zvb3RlcicpXG4gICAgICAgICAgICAuc2V0RGVzYygnTGluZSBwcmVmaXhlZCBieSB0aGlzIHN5bWJvbCB3aWxsIGJlIHJlY29nbml6ZWQgYXMgZm9vdGVyJylcbiAgICAgICAgICAgIC5hZGRUZXh0KHRleHQgPT4ge1xuICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uY29uZmlnLnByZWZpeGVzLmZvb3RlcilcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5jb25maWcucHJlZml4ZXMuZm9vdGVyID0gdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdTZXF1ZW5jZXMnKVxuICAgICAgICAgICAgLnNldERlc2MoJ1JFR0VYUCAtIERFU0NSSVBUSU9OJylcbiAgICAgICAgICAgIC5zZXREZXNjKFxuICAgICAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbmV3IERvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSBmcmFnbWVudC5jcmVhdGVFbCgnZGl2JylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2Vxc1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChlID0+IGUubmFtZSArICcgLSAnICsgKGUuZGVzYyB8fCAnJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZnJhZ21lbnQuY3JlYXRlRWwoJ2RpdicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0VGV4dChlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDAuNXJlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZWwpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGRpdilcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnRcbiAgICAgICAgICAgICAgICB9KSgpXG4gICAgICAgICAgICApXG4gICAgfVxufVxuIl0sIm5hbWVzIjpbInRoaXMiLCJQbHVnaW4iLCJNYXJrZG93blZpZXciLCJGaWxlVmlldyIsInJlbmRlciIsIlBsdWdpblNldHRpbmdUYWIiLCJTZXR0aW5nIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVB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LE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsb0VBQW9FLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLENBQUMsQ0FBQyx3Q0FBd0MsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFLLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxXQUFXLENBQUMsQ0FBQyxDQUFDLDhDQUE4QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksV0FBVyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsdUVBQXVFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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
|