15894 lines
2.3 MiB
Plaintext
15894 lines
2.3 MiB
Plaintext
'use strict';
|
||
|
||
var logger = require('./logger-kbUbohEP.js');
|
||
var fs = require('fs-extra');
|
||
var path = require('path');
|
||
var tsMorph = require('ts-morph');
|
||
var LiveServer = require('@compodoc/live-server');
|
||
var _ = require('lodash');
|
||
var ts = require('typescript');
|
||
var semver = require('semver');
|
||
var JSON5 = require('json5');
|
||
var htmlEntities = require('html-entities');
|
||
var cheerio = require('cheerio');
|
||
var uuid = require('uuid');
|
||
var cosmiconfig = require('cosmiconfig');
|
||
|
||
function _interopNamespaceDefault(e) {
|
||
var n = Object.create(null);
|
||
if (e) {
|
||
Object.keys(e).forEach(function (k) {
|
||
if (k !== 'default') {
|
||
var d = Object.getOwnPropertyDescriptor(e, k);
|
||
Object.defineProperty(n, k, d.get ? d : {
|
||
enumerable: true,
|
||
get: function () { return e[k]; }
|
||
});
|
||
}
|
||
});
|
||
}
|
||
n.default = e;
|
||
return Object.freeze(n);
|
||
}
|
||
|
||
var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
|
||
var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
|
||
var LiveServer__namespace = /*#__PURE__*/_interopNamespaceDefault(LiveServer);
|
||
var ___namespace = /*#__PURE__*/_interopNamespaceDefault(_);
|
||
var ts__namespace = /*#__PURE__*/_interopNamespaceDefault(ts);
|
||
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
||
var JSON5__namespace = /*#__PURE__*/_interopNamespaceDefault(JSON5);
|
||
var cheerio__namespace = /*#__PURE__*/_interopNamespaceDefault(cheerio);
|
||
|
||
var COMPODOC_DEFAULTS = {
|
||
title: 'Application documentation',
|
||
additionalEntryName: 'Additional documentation',
|
||
additionalEntryPath: 'additional-documentation',
|
||
folder: './documentation/',
|
||
hostname: '127.0.0.1',
|
||
port: 8080,
|
||
theme: 'gitbook',
|
||
exportFormat: 'html',
|
||
exportFormatsSupported: ['html', 'json'],
|
||
base: '/',
|
||
defaultCoverageThreshold: 70,
|
||
defaultCoverageMinimumPerFile: 0,
|
||
coverageTestThresholdFail: true,
|
||
toggleMenuItems: ['all'],
|
||
navTabConfig: [],
|
||
disableSearch: false,
|
||
disableSourceCode: false,
|
||
disableDomTree: false,
|
||
disableTemplateTab: false,
|
||
disableStyleTab: false,
|
||
disableGraph: false,
|
||
disableMainGraph: false,
|
||
disableCoverage: false,
|
||
disablePrivate: false,
|
||
disableProtected: false,
|
||
disableInternal: false,
|
||
disableLifeCycleHooks: false,
|
||
disableConstructors: false,
|
||
disableRoutesGraph: false,
|
||
disableDependencies: false,
|
||
disableProperties: false,
|
||
disableFilePath: false,
|
||
disableOverview: false,
|
||
hideGenerator: false,
|
||
hideDarkModeToggle: false,
|
||
minimal: false,
|
||
silent: false,
|
||
serve: false,
|
||
watch: false,
|
||
PAGE_TYPES: {
|
||
ROOT: 'root',
|
||
INTERNAL: 'internal'
|
||
},
|
||
gaSite: 'auto',
|
||
coverageTestShowOnlyFailed: false,
|
||
language: 'en-US',
|
||
maxSearchResults: 15
|
||
};
|
||
|
||
var Configuration = /** @class */ (function () {
|
||
function Configuration() {
|
||
this._pages = [];
|
||
this._mainData = {
|
||
output: COMPODOC_DEFAULTS.folder,
|
||
theme: COMPODOC_DEFAULTS.theme,
|
||
extTheme: '',
|
||
serve: false,
|
||
templatePlayground: false,
|
||
hostname: COMPODOC_DEFAULTS.hostname,
|
||
host: '',
|
||
port: COMPODOC_DEFAULTS.port,
|
||
open: false,
|
||
assetsFolder: '',
|
||
documentationMainName: COMPODOC_DEFAULTS.title,
|
||
documentationMainDescription: '',
|
||
base: COMPODOC_DEFAULTS.base,
|
||
hideGenerator: false,
|
||
hideDarkModeToggle: false,
|
||
hasFilesToCoverage: false,
|
||
modules: [],
|
||
readme: false,
|
||
changelog: '',
|
||
contributing: '',
|
||
license: '',
|
||
todo: '',
|
||
markdowns: [],
|
||
additionalPages: [],
|
||
pipes: [],
|
||
classes: [],
|
||
interfaces: [],
|
||
components: [],
|
||
controllers: [],
|
||
entities: [],
|
||
directives: [],
|
||
injectables: [],
|
||
interceptors: [],
|
||
guards: [],
|
||
miscellaneous: [],
|
||
routes: [],
|
||
tsconfig: '',
|
||
toggleMenuItems: COMPODOC_DEFAULTS.toggleMenuItems,
|
||
navTabConfig: [],
|
||
templates: '',
|
||
includes: '',
|
||
includesName: COMPODOC_DEFAULTS.additionalEntryName,
|
||
includesFolder: COMPODOC_DEFAULTS.additionalEntryPath,
|
||
disableSourceCode: COMPODOC_DEFAULTS.disableSourceCode,
|
||
disableDomTree: COMPODOC_DEFAULTS.disableDomTree,
|
||
disableTemplateTab: COMPODOC_DEFAULTS.disableTemplateTab,
|
||
disableStyleTab: COMPODOC_DEFAULTS.disableStyleTab,
|
||
disableGraph: COMPODOC_DEFAULTS.disableGraph,
|
||
disableMainGraph: COMPODOC_DEFAULTS.disableMainGraph,
|
||
disableCoverage: COMPODOC_DEFAULTS.disableCoverage,
|
||
disablePrivate: COMPODOC_DEFAULTS.disablePrivate,
|
||
disableInternal: COMPODOC_DEFAULTS.disableInternal,
|
||
disableProtected: COMPODOC_DEFAULTS.disableProtected,
|
||
disableLifeCycleHooks: COMPODOC_DEFAULTS.disableLifeCycleHooks,
|
||
disableConstructors: COMPODOC_DEFAULTS.disableConstructors,
|
||
disableRoutesGraph: COMPODOC_DEFAULTS.disableRoutesGraph,
|
||
disableSearch: false,
|
||
disableDependencies: COMPODOC_DEFAULTS.disableDependencies,
|
||
disableProperties: COMPODOC_DEFAULTS.disableProperties,
|
||
disableFilePath: COMPODOC_DEFAULTS.disableFilePath,
|
||
disableOverview: COMPODOC_DEFAULTS.disableOverview,
|
||
watch: false,
|
||
mainGraph: '',
|
||
coverageTest: false,
|
||
coverageTestThreshold: COMPODOC_DEFAULTS.defaultCoverageThreshold,
|
||
coverageTestThresholdFail: COMPODOC_DEFAULTS.coverageTestThresholdFail,
|
||
coverageTestPerFile: false,
|
||
coverageMinimumPerFile: COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile,
|
||
unitTestCoverage: '',
|
||
unitTestData: undefined,
|
||
coverageTestShowOnlyFailed: COMPODOC_DEFAULTS.coverageTestShowOnlyFailed,
|
||
routesLength: 0,
|
||
angularVersion: '',
|
||
exportFormat: COMPODOC_DEFAULTS.exportFormat,
|
||
coverageData: {},
|
||
customFavicon: '',
|
||
customLogo: '',
|
||
packageDependencies: [],
|
||
packagePeerDependencies: [],
|
||
packageProperties: {},
|
||
gaID: '',
|
||
gaSite: '',
|
||
angularProject: false,
|
||
angularJSProject: false,
|
||
language: COMPODOC_DEFAULTS.language,
|
||
maxSearchResults: 15,
|
||
publicApiOnly: '',
|
||
publicApiExports: new Map()
|
||
};
|
||
}
|
||
Configuration.getInstance = function () {
|
||
if (!Configuration.instance) {
|
||
Configuration.instance = new Configuration();
|
||
}
|
||
return Configuration.instance;
|
||
};
|
||
Configuration.prototype.addPage = function (page) {
|
||
var indexPage = ___namespace.findIndex(this._pages, { name: page.name });
|
||
if (indexPage === -1) {
|
||
this._pages.push(page);
|
||
}
|
||
};
|
||
Configuration.prototype.hasPage = function (name) {
|
||
var indexPage = ___namespace.findIndex(this._pages, { name: name });
|
||
return indexPage !== -1;
|
||
};
|
||
Configuration.prototype.addAdditionalPage = function (page) {
|
||
this._mainData.additionalPages.push(page);
|
||
};
|
||
Configuration.prototype.getAdditionalPageById = function (id) {
|
||
return this._mainData.additionalPages.find(function (page) { return page.id === id; });
|
||
};
|
||
Configuration.prototype.resetPages = function () {
|
||
this._pages = [];
|
||
};
|
||
Configuration.prototype.resetAdditionalPages = function () {
|
||
this._mainData.additionalPages = [];
|
||
};
|
||
Configuration.prototype.resetRootMarkdownPages = function () {
|
||
var indexPage = ___namespace.findIndex(this._pages, { name: 'index' });
|
||
this._pages.splice(indexPage, 1);
|
||
indexPage = ___namespace.findIndex(this._pages, { name: 'changelog' });
|
||
this._pages.splice(indexPage, 1);
|
||
indexPage = ___namespace.findIndex(this._pages, { name: 'contributing' });
|
||
this._pages.splice(indexPage, 1);
|
||
indexPage = ___namespace.findIndex(this._pages, { name: 'license' });
|
||
this._pages.splice(indexPage, 1);
|
||
indexPage = ___namespace.findIndex(this._pages, { name: 'todo' });
|
||
this._pages.splice(indexPage, 1);
|
||
this._mainData.markdowns = [];
|
||
};
|
||
Object.defineProperty(Configuration.prototype, "pages", {
|
||
get: function () {
|
||
return this._pages;
|
||
},
|
||
set: function (pages) {
|
||
this._pages = [];
|
||
},
|
||
enumerable: false,
|
||
configurable: true
|
||
});
|
||
Object.defineProperty(Configuration.prototype, "markDownPages", {
|
||
get: function () {
|
||
return this._pages.filter(function (page) { return page.markdown; });
|
||
},
|
||
enumerable: false,
|
||
configurable: true
|
||
});
|
||
Object.defineProperty(Configuration.prototype, "mainData", {
|
||
get: function () {
|
||
return this._mainData;
|
||
},
|
||
set: function (data) {
|
||
Object.assign(this._mainData, data);
|
||
},
|
||
enumerable: false,
|
||
configurable: true
|
||
});
|
||
return Configuration;
|
||
}());
|
||
var Configuration$1 = Configuration.getInstance();
|
||
|
||
// Try multiple paths to find api-list.json - supports both source and bundled contexts
|
||
var apiListPath = '../src/data/api-list.json';
|
||
try {
|
||
// First try relative path (works from source)
|
||
require.resolve(apiListPath);
|
||
}
|
||
catch (e) {
|
||
// Fallback to absolute path from cwd (works from bundled/test contexts)
|
||
apiListPath = path__namespace.join(process.cwd(), 'src/data/api-list.json');
|
||
}
|
||
var AngularAPIs = require(apiListPath);
|
||
var AngularApiUtil = /** @class */ (function () {
|
||
function AngularApiUtil() {
|
||
}
|
||
AngularApiUtil.getInstance = function () {
|
||
if (!AngularApiUtil.instance) {
|
||
AngularApiUtil.instance = new AngularApiUtil();
|
||
}
|
||
return AngularApiUtil.instance;
|
||
};
|
||
AngularApiUtil.prototype.findApi = function (type) {
|
||
var foundedApi;
|
||
___namespace.forEach(AngularAPIs, function (mainApi) {
|
||
___namespace.forEach(mainApi.items, function (api) {
|
||
if (api.title === type) {
|
||
foundedApi = api;
|
||
}
|
||
});
|
||
});
|
||
return {
|
||
source: 'external',
|
||
data: foundedApi,
|
||
score: foundedApi ? 1 : 0
|
||
};
|
||
};
|
||
return AngularApiUtil;
|
||
}());
|
||
var AngularApiUtil$1 = AngularApiUtil.getInstance();
|
||
|
||
function extractLeadingText(string, completeTag) {
|
||
var tagIndex = string.indexOf(completeTag);
|
||
var leadingText = undefined;
|
||
var leadingTextRegExp = /\[(.+?)\]/g;
|
||
var leadingTextInfo = leadingTextRegExp.exec(string);
|
||
// did we find leading text, and if so, does it immediately precede the tag?
|
||
while (leadingTextInfo && leadingTextInfo.length) {
|
||
if (leadingTextInfo.index + leadingTextInfo[0].length === tagIndex) {
|
||
string = string.replace(leadingTextInfo[0], '');
|
||
leadingText = leadingTextInfo[1];
|
||
break;
|
||
}
|
||
leadingTextInfo = leadingTextRegExp.exec(string);
|
||
}
|
||
return {
|
||
leadingText: leadingText,
|
||
string: string
|
||
};
|
||
}
|
||
function splitLinkText(text) {
|
||
var linkText;
|
||
var target;
|
||
var splitIndex;
|
||
// if a pipe is not present, we split on the first space
|
||
splitIndex = text.indexOf('|');
|
||
if (splitIndex === -1) {
|
||
splitIndex = text.search(/\s/);
|
||
}
|
||
if (splitIndex !== -1) {
|
||
linkText = text.substr(splitIndex + 1);
|
||
// Normalize subsequent newlines to a single space.
|
||
linkText = linkText.replace(/\n+/, ' ');
|
||
target = text.substr(0, splitIndex);
|
||
}
|
||
return {
|
||
linkText: linkText,
|
||
target: target || text
|
||
};
|
||
}
|
||
var LinkParser = (function () {
|
||
var processTheLink = function (string, tagInfo, leadingText) {
|
||
var leading = extractLeadingText(string, tagInfo.completeTag), linkText, split, target, stringtoReplace;
|
||
linkText = leadingText ? leadingText : leading.leadingText || '';
|
||
split = splitLinkText(tagInfo.text);
|
||
target = split.target;
|
||
if (leading.leadingText !== undefined) {
|
||
stringtoReplace = '[' + leading.leadingText + ']' + tagInfo.completeTag;
|
||
}
|
||
else if (typeof split.linkText !== 'undefined') {
|
||
stringtoReplace = tagInfo.completeTag;
|
||
linkText = split.linkText;
|
||
}
|
||
if (linkText === '' || linkText == null || target == null) {
|
||
return string;
|
||
}
|
||
return string.replace(stringtoReplace, '[' + linkText + '](' + target + ')');
|
||
};
|
||
/**
|
||
* Convert
|
||
* {@link http://www.google.com|Google} or {@link https://github.com GitHub} or [Github]{@link https://github.com} to [Github](https://github.com)
|
||
*/
|
||
var replaceLinkTag = function (str) {
|
||
if (typeof str === 'undefined') {
|
||
return {
|
||
newString: ''
|
||
};
|
||
}
|
||
// new RegExp('\\[((?:.|\n)+?)]\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TO DO]{@link Todo} fo') -> "[TO DO]{@link Todo}", "TO DO", "Todo"
|
||
// new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TODO]{@link Todo} fo') -> "{@link Todo}", "Todo"
|
||
var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExp, matches, previousString;
|
||
tagRegExp = str.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
|
||
function replaceMatch(replacer, tag, match, text, linkText) {
|
||
var matchedTag = {
|
||
completeTag: match,
|
||
tag: tag,
|
||
text: text
|
||
};
|
||
if (linkText) {
|
||
return replacer(str, matchedTag, linkText);
|
||
}
|
||
else {
|
||
return replacer(str, matchedTag);
|
||
}
|
||
}
|
||
do {
|
||
matches = tagRegExp.exec(str);
|
||
if (matches) {
|
||
previousString = str;
|
||
if (matches.length === 2) {
|
||
str = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
|
||
}
|
||
if (matches.length === 3) {
|
||
str = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
|
||
}
|
||
}
|
||
} while (matches && previousString !== str);
|
||
return {
|
||
newString: str
|
||
};
|
||
};
|
||
var _resolveLinks = function (str) {
|
||
return replaceLinkTag(str).newString;
|
||
};
|
||
return {
|
||
resolveLinks: _resolveLinks
|
||
};
|
||
})();
|
||
|
||
var AngularLifecycleHooks;
|
||
(function (AngularLifecycleHooks) {
|
||
AngularLifecycleHooks[AngularLifecycleHooks["ngOnChanges"] = 0] = "ngOnChanges";
|
||
AngularLifecycleHooks[AngularLifecycleHooks["ngOnInit"] = 1] = "ngOnInit";
|
||
AngularLifecycleHooks[AngularLifecycleHooks["ngDoCheck"] = 2] = "ngDoCheck";
|
||
AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentInit"] = 3] = "ngAfterContentInit";
|
||
AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentChecked"] = 4] = "ngAfterContentChecked";
|
||
AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewInit"] = 5] = "ngAfterViewInit";
|
||
AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewChecked"] = 6] = "ngAfterViewChecked";
|
||
AngularLifecycleHooks[AngularLifecycleHooks["ngOnDestroy"] = 7] = "ngOnDestroy";
|
||
})(AngularLifecycleHooks || (AngularLifecycleHooks = {}));
|
||
|
||
var KindType;
|
||
(function (KindType) {
|
||
KindType["UNKNOWN"] = "unknown";
|
||
KindType["STRING"] = "string";
|
||
KindType["NUMBER"] = "number";
|
||
KindType["ARRAY"] = "[]";
|
||
KindType["VOID"] = "void";
|
||
KindType["FUNCTION"] = "function";
|
||
KindType["TEMPLATE_LITERAL"] = "template literal type";
|
||
KindType["LITERAL"] = "literal type";
|
||
KindType["BOOLEAN"] = "boolean";
|
||
KindType["ANY"] = "any";
|
||
KindType["NULL"] = "null";
|
||
KindType["SYMBOL"] = "symbol";
|
||
KindType["NEVER"] = "never";
|
||
KindType["UNDEFINED"] = "undefined";
|
||
KindType["OBJECT"] = "object";
|
||
})(KindType || (KindType = {}));
|
||
var IsKindType = {
|
||
ANY: function (kind) {
|
||
return kindToType(kind) === KindType.ANY;
|
||
},
|
||
ARRAY: function (kind) {
|
||
return kindToType(kind) === KindType.ARRAY;
|
||
},
|
||
BOOLEAN: function (kind) {
|
||
return kindToType(kind) === KindType.BOOLEAN;
|
||
},
|
||
FUNCTION: function (kind) {
|
||
return kindToType(kind) === KindType.FUNCTION;
|
||
},
|
||
LITERAL: function (kind) {
|
||
return kindToType(kind) === KindType.LITERAL;
|
||
},
|
||
NEVER: function (kind) {
|
||
return kindToType(kind) === KindType.NEVER;
|
||
},
|
||
NULL: function (kind) {
|
||
return kindToType(kind) === KindType.NULL;
|
||
},
|
||
NUMBER: function (kind) {
|
||
return kindToType(kind) === KindType.NUMBER;
|
||
},
|
||
OBJECT: function (kind) {
|
||
return kindToType(kind) === KindType.OBJECT;
|
||
},
|
||
STRING: function (kind) {
|
||
return kindToType(kind) === KindType.STRING;
|
||
},
|
||
SYMBOL: function (kind) {
|
||
return kindToType(kind) === KindType.SYMBOL;
|
||
},
|
||
TEMPLATE_LITERAL: function (kind) {
|
||
return kindToType(kind) === KindType.TEMPLATE_LITERAL;
|
||
},
|
||
UNDEFINED: function (kind) {
|
||
return kindToType(kind) === KindType.UNDEFINED;
|
||
},
|
||
UNKNOWN: function (kind) {
|
||
return kindToType(kind) === KindType.UNKNOWN;
|
||
},
|
||
VOID: function (kind) {
|
||
return kindToType(kind) === KindType.VOID;
|
||
}
|
||
};
|
||
function kindToType(kind) {
|
||
var _type = KindType.UNKNOWN;
|
||
switch (kind) {
|
||
case tsMorph.SyntaxKind.StringKeyword:
|
||
case tsMorph.SyntaxKind.StringLiteral:
|
||
_type = KindType.STRING;
|
||
break;
|
||
case tsMorph.SyntaxKind.NumberKeyword:
|
||
case tsMorph.SyntaxKind.NumericLiteral:
|
||
_type = KindType.NUMBER;
|
||
break;
|
||
case tsMorph.SyntaxKind.ArrayType:
|
||
case tsMorph.SyntaxKind.ArrayLiteralExpression:
|
||
_type = KindType.ARRAY;
|
||
break;
|
||
case tsMorph.SyntaxKind.VoidKeyword:
|
||
_type = KindType.VOID;
|
||
break;
|
||
case tsMorph.SyntaxKind.FunctionType:
|
||
_type = KindType.FUNCTION;
|
||
break;
|
||
case tsMorph.SyntaxKind.TemplateLiteralType:
|
||
_type = KindType.TEMPLATE_LITERAL;
|
||
break;
|
||
case tsMorph.SyntaxKind.TypeLiteral:
|
||
_type = KindType.LITERAL;
|
||
break;
|
||
case tsMorph.SyntaxKind.BooleanKeyword:
|
||
_type = KindType.BOOLEAN;
|
||
break;
|
||
case tsMorph.SyntaxKind.AnyKeyword:
|
||
_type = KindType.ANY;
|
||
break;
|
||
case tsMorph.SyntaxKind.NullKeyword:
|
||
_type = KindType.NULL;
|
||
break;
|
||
case tsMorph.SyntaxKind.SymbolKeyword:
|
||
_type = KindType.SYMBOL;
|
||
break;
|
||
case tsMorph.SyntaxKind.NeverKeyword:
|
||
_type = KindType.NEVER;
|
||
break;
|
||
case tsMorph.SyntaxKind.UnknownKeyword:
|
||
_type = KindType.UNKNOWN;
|
||
break;
|
||
case tsMorph.SyntaxKind.UndefinedKeyword:
|
||
_type = KindType.UNDEFINED;
|
||
break;
|
||
case tsMorph.SyntaxKind.ObjectKeyword:
|
||
case tsMorph.SyntaxKind.ObjectLiteralExpression:
|
||
_type = KindType.OBJECT;
|
||
break;
|
||
}
|
||
return _type;
|
||
}
|
||
|
||
var tsany = ts__namespace;
|
||
// https://github.com/Microsoft/TypeScript/blob/v2.1.4/src/compiler/utilities.ts#L1423
|
||
function getJSDocCommentRanges(node, text) {
|
||
return tsany.getJSDocCommentRanges.apply(this, arguments);
|
||
}
|
||
|
||
var JsdocParserUtil = /** @class */ (function () {
|
||
function JsdocParserUtil() {
|
||
}
|
||
JsdocParserUtil.prototype.isVariableLike = function (node) {
|
||
if (node) {
|
||
switch (node.kind) {
|
||
case tsMorph.SyntaxKind.BindingElement:
|
||
case tsMorph.SyntaxKind.EnumMember:
|
||
case tsMorph.SyntaxKind.Parameter:
|
||
case tsMorph.SyntaxKind.PropertyAssignment:
|
||
case tsMorph.SyntaxKind.PropertyDeclaration:
|
||
case tsMorph.SyntaxKind.PropertySignature:
|
||
case tsMorph.SyntaxKind.ShorthandPropertyAssignment:
|
||
case tsMorph.SyntaxKind.VariableDeclaration:
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
JsdocParserUtil.prototype.isTopmostModuleDeclaration = function (node) {
|
||
if (node.nextContainer && node.nextContainer.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
|
||
var next = node.nextContainer;
|
||
if (node.name.end + 1 === next.name.pos) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
};
|
||
JsdocParserUtil.prototype.getRootModuleDeclaration = function (node) {
|
||
while (node.parent && node.parent.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
|
||
var parent = node.parent;
|
||
if (node.name.pos === parent.name.end + 1) {
|
||
node = parent;
|
||
}
|
||
else {
|
||
break;
|
||
}
|
||
}
|
||
return node;
|
||
};
|
||
JsdocParserUtil.prototype.getMainCommentOfNode = function (node, sourceFile) {
|
||
var description = '';
|
||
if (node.parent && node.parent.kind === tsMorph.ts.SyntaxKind.VariableDeclarationList) {
|
||
node = node.parent.parent;
|
||
}
|
||
else if (node.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
|
||
if (!this.isTopmostModuleDeclaration(node)) {
|
||
return null;
|
||
}
|
||
else {
|
||
node = this.getRootModuleDeclaration(node);
|
||
}
|
||
}
|
||
var comments = getJSDocCommentRanges(node, sourceFile.text);
|
||
if (comments && comments.length) {
|
||
var comment = void 0;
|
||
if (node.kind === tsMorph.ts.SyntaxKind.SourceFile) {
|
||
if (comments.length === 1) {
|
||
return null;
|
||
}
|
||
comment = comments[0];
|
||
}
|
||
else {
|
||
comment = comments[comments.length - 1];
|
||
}
|
||
description = sourceFile.text.substring(comment.pos, comment.end);
|
||
}
|
||
return description;
|
||
};
|
||
JsdocParserUtil.prototype.parseComment = function (text) {
|
||
var comment = '';
|
||
function readBareLine(line) {
|
||
comment += '\n' + line;
|
||
}
|
||
var CODE_FENCE = /^\s*```(?!.*```)/;
|
||
var inCode = false;
|
||
var inExample = false; // first line with @example, end line with empty string or string or */
|
||
var exampleHasCodeFence = false; // track if the example already has code fences
|
||
function readLine(line, index) {
|
||
line = line.replace(/^\s*\*? ?/, '');
|
||
line = line.replace(/\s*$/, '');
|
||
if (CODE_FENCE.test(line)) {
|
||
inCode = !inCode;
|
||
if (inExample) {
|
||
exampleHasCodeFence = true;
|
||
}
|
||
}
|
||
if (line.indexOf('@example') !== -1) {
|
||
inExample = true;
|
||
exampleHasCodeFence = false;
|
||
// Check if the next non-empty line has a code fence
|
||
var lines = text.split(/\r\n?|\n/);
|
||
for (var i = index + 1; i < lines.length; i++) {
|
||
var nextLine = lines[i].replace(/^\s*\*? ?/, '').replace(/\s*$/, '');
|
||
if (nextLine === '')
|
||
continue; // Skip empty lines
|
||
if (CODE_FENCE.test(nextLine)) {
|
||
exampleHasCodeFence = true;
|
||
}
|
||
break; // Only check the first non-empty line
|
||
}
|
||
if (!exampleHasCodeFence) {
|
||
line = '```html';
|
||
}
|
||
else {
|
||
// Skip the @example line if it already has code fences
|
||
return;
|
||
}
|
||
}
|
||
// Preserve empty lines within code blocks by using a placeholder
|
||
if (inCode && inExample && exampleHasCodeFence && line === '') {
|
||
line = '___COMPODOC_EMPTY_LINE___';
|
||
}
|
||
if (inExample && line === '') {
|
||
inExample = false;
|
||
if (!exampleHasCodeFence) {
|
||
line = '```';
|
||
}
|
||
else {
|
||
// Don't add closing fence if example has its own
|
||
return;
|
||
}
|
||
}
|
||
if (!inCode) {
|
||
var tag = /^@(\S+)/.exec(line);
|
||
var SeeTag = /^@see/.exec(line);
|
||
if (SeeTag) {
|
||
line = line.replace(/^@see/, 'See');
|
||
}
|
||
if (tag && !SeeTag) {
|
||
return;
|
||
}
|
||
}
|
||
readBareLine(line);
|
||
}
|
||
text = text.replace(/^\s*\/\*+/, '');
|
||
text = text.replace(/\*+\/\s*$/, '');
|
||
text.split(/\r\n?|\n/).forEach(function (line, index) { return readLine(line, index); });
|
||
return comment;
|
||
};
|
||
JsdocParserUtil.prototype.getJSDocTags = function (node, kind) {
|
||
var e_1, _a;
|
||
var docs = this.getJSDocs(node);
|
||
if (docs) {
|
||
var result = [];
|
||
try {
|
||
for (var docs_1 = logger.__values(docs), docs_1_1 = docs_1.next(); !docs_1_1.done; docs_1_1 = docs_1.next()) {
|
||
var doc = docs_1_1.value;
|
||
if (tsMorph.ts.isJSDocParameterTag(doc)) {
|
||
if (doc.kind === kind) {
|
||
result.push(doc);
|
||
}
|
||
}
|
||
else if (tsMorph.ts.isJSDoc(doc)) {
|
||
result.push.apply(result, logger.__spreadArray([], logger.__read(___namespace.filter(doc.tags, function (tag) { return tag.kind === kind; })), false));
|
||
}
|
||
else {
|
||
throw new Error('Unexpected type');
|
||
}
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (docs_1_1 && !docs_1_1.done && (_a = docs_1.return)) _a.call(docs_1);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
return result;
|
||
}
|
||
};
|
||
JsdocParserUtil.prototype.getJSDocs = function (node) {
|
||
// TODO: jsDocCache is internal, see if there's a way around it
|
||
var cache = node.jsDocCache;
|
||
if (!cache) {
|
||
cache = this.getJSDocsWorker(node, []).filter(function (x) { return x; });
|
||
node.jsDocCache = cache;
|
||
}
|
||
return cache;
|
||
};
|
||
// Try to recognize this pattern when node is initializer
|
||
// of variable declaration and JSDoc comments are on containing variable statement.
|
||
// /**
|
||
// * @param {number} name
|
||
// * @returns {number}
|
||
// */
|
||
// var x = function(name) { return name.length; }
|
||
JsdocParserUtil.prototype.getJSDocsWorker = function (node, cache) {
|
||
var parent = node.parent;
|
||
var isInitializerOfVariableDeclarationInStatement = this.isVariableLike(parent) &&
|
||
parent.initializer === node &&
|
||
tsMorph.ts.isVariableStatement(parent.parent.parent);
|
||
var isVariableOfVariableDeclarationStatement = this.isVariableLike(node) && tsMorph.ts.isVariableStatement(parent.parent);
|
||
var variableStatementNode = isInitializerOfVariableDeclarationInStatement
|
||
? parent.parent.parent
|
||
: isVariableOfVariableDeclarationStatement
|
||
? parent.parent
|
||
: undefined;
|
||
if (variableStatementNode) {
|
||
cache = this.getJSDocsWorker(variableStatementNode, cache);
|
||
}
|
||
// Also recognize when the node is the RHS of an assignment expression
|
||
var isSourceOfAssignmentExpressionStatement = parent &&
|
||
parent.parent &&
|
||
tsMorph.ts.isBinaryExpression(parent) &&
|
||
parent.operatorToken.kind === tsMorph.SyntaxKind.EqualsToken &&
|
||
tsMorph.ts.isExpressionStatement(parent.parent);
|
||
if (isSourceOfAssignmentExpressionStatement) {
|
||
cache = this.getJSDocsWorker(parent.parent, cache);
|
||
}
|
||
var isModuleDeclaration = tsMorph.ts.isModuleDeclaration(node) && parent && tsMorph.ts.isModuleDeclaration(parent);
|
||
var isPropertyAssignmentExpression = parent && tsMorph.ts.isPropertyAssignment(parent);
|
||
if (isModuleDeclaration || isPropertyAssignmentExpression) {
|
||
cache = this.getJSDocsWorker(parent, cache);
|
||
}
|
||
// Pull parameter comments from declaring function as well
|
||
if (tsMorph.ts.isParameter(node)) {
|
||
cache = ___namespace.concat(cache, this.getJSDocParameterTags(node));
|
||
}
|
||
if (this.isVariableLike(node) && node.initializer) {
|
||
var initializerJsDoc = node.initializer.jsDoc;
|
||
if (initializerJsDoc) {
|
||
cache = ___namespace.concat(cache, initializerJsDoc);
|
||
}
|
||
}
|
||
var nodeJsDoc = node.jsDoc;
|
||
if (nodeJsDoc) {
|
||
cache = ___namespace.concat(cache, nodeJsDoc);
|
||
}
|
||
return cache;
|
||
};
|
||
JsdocParserUtil.prototype.getJSDocParameterTags = function (param) {
|
||
var func = param.parent;
|
||
var tags = this.getJSDocTags(func, tsMorph.SyntaxKind.JSDocParameterTag);
|
||
if (!param.name) {
|
||
// this is an anonymous jsdoc param from a `function(type1, type2): type3` specification
|
||
var i = func.parameters.indexOf(param);
|
||
var paramTags = ___namespace.filter(tags, function (tag) { return tsMorph.ts.isJSDocParameterTag(tag); });
|
||
if (paramTags && 0 <= i && i < paramTags.length) {
|
||
return [paramTags[i]];
|
||
}
|
||
}
|
||
else if (tsMorph.ts.isIdentifier(param.name)) {
|
||
var name_1 = param.name.text;
|
||
return ___namespace.filter(tags, function (tag) {
|
||
if (tsMorph.ts && tsMorph.ts.isJSDocParameterTag(tag)) {
|
||
var t = tag;
|
||
if (typeof t.parameterName !== 'undefined') {
|
||
return t.parameterName.text === name_1;
|
||
}
|
||
else if (typeof t.name !== 'undefined') {
|
||
if (typeof t.name.escapedText !== 'undefined') {
|
||
return t.name.escapedText === name_1;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
else {
|
||
// TODO: it's a destructured parameter, so it should look up an "object type" series of multiple lines
|
||
// But multi-line object types aren't supported yet either
|
||
return undefined;
|
||
}
|
||
};
|
||
JsdocParserUtil.prototype.parseJSDocNode = function (node) {
|
||
var rawDescription = '';
|
||
if (typeof node.comment === 'string') {
|
||
rawDescription += node.comment;
|
||
}
|
||
else {
|
||
if (node.comment) {
|
||
var len = node.comment.length;
|
||
for (var i = 0; i < len; i++) {
|
||
var JSDocNode = node.comment[i];
|
||
switch (JSDocNode.kind) {
|
||
case tsMorph.SyntaxKind.JSDocComment:
|
||
rawDescription += JSDocNode.comment;
|
||
break;
|
||
case tsMorph.SyntaxKind.JSDocText:
|
||
rawDescription += JSDocNode.text;
|
||
break;
|
||
case tsMorph.SyntaxKind.JSDocLink:
|
||
if (JSDocNode.name) {
|
||
var text = JSDocNode.name.escapedText;
|
||
if (text === undefined &&
|
||
JSDocNode.name.left &&
|
||
JSDocNode.name.right) {
|
||
text =
|
||
JSDocNode.name.left.escapedText +
|
||
'.' +
|
||
JSDocNode.name.right.escapedText;
|
||
}
|
||
rawDescription += JSDocNode.text + '{@link ' + text + '}';
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return rawDescription;
|
||
};
|
||
return JsdocParserUtil;
|
||
}());
|
||
|
||
var marked = require('marked').marked;
|
||
marked.use({
|
||
mangle: false,
|
||
headerIds: false
|
||
});
|
||
var markedAcl = marked;
|
||
|
||
var getCurrentDirectory = tsMorph.ts.sys.getCurrentDirectory;
|
||
var useCaseSensitiveFileNames = tsMorph.ts.sys.useCaseSensitiveFileNames;
|
||
var newLine = tsMorph.ts.sys.newLine;
|
||
function getNewLine() {
|
||
return newLine;
|
||
}
|
||
function cleanNameWithoutSpaceAndToLowerCase(name) {
|
||
return name.toLowerCase().replace(/ /g, '-');
|
||
}
|
||
function getCanonicalFileName(fileName) {
|
||
return useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
|
||
}
|
||
var formatDiagnosticsHost = {
|
||
getCurrentDirectory: getCurrentDirectory,
|
||
getCanonicalFileName: getCanonicalFileName,
|
||
getNewLine: getNewLine
|
||
};
|
||
function markedtags(tags) {
|
||
var jsdocParserUtil = new JsdocParserUtil();
|
||
var mtags = tags;
|
||
___namespace.forEach(mtags, function (tag) {
|
||
var rawComment = jsdocParserUtil.parseJSDocNode(tag);
|
||
tag.comment = markedAcl(LinkParser.resolveLinks(rawComment));
|
||
});
|
||
return mtags;
|
||
}
|
||
function mergeTagsAndArgs(args, jsdoctags) {
|
||
var margs = ___namespace.cloneDeep(args);
|
||
___namespace.forEach(margs, function (arg) {
|
||
arg.tagName = {
|
||
text: 'param'
|
||
};
|
||
if (jsdoctags) {
|
||
___namespace.forEach(jsdoctags, function (jsdoctag) {
|
||
if (jsdoctag.name && jsdoctag.name.text === arg.name) {
|
||
arg.tagName = jsdoctag.tagName;
|
||
arg.name = jsdoctag.name;
|
||
arg.comment = jsdoctag.comment;
|
||
arg.typeExpression = jsdoctag.typeExpression;
|
||
}
|
||
});
|
||
}
|
||
});
|
||
// Add example & returns & private
|
||
if (jsdoctags) {
|
||
___namespace.forEach(jsdoctags, function (jsdoctag) {
|
||
if (jsdoctag.tagName &&
|
||
(jsdoctag.tagName.text === 'example' || jsdoctag.tagName.text === 'private')) {
|
||
margs.push({
|
||
tagName: jsdoctag.tagName,
|
||
comment: jsdoctag.comment
|
||
});
|
||
}
|
||
if (jsdoctag.tagName &&
|
||
(jsdoctag.tagName.text === 'returns' || jsdoctag.tagName.text === 'return')) {
|
||
var ret = {
|
||
tagName: jsdoctag.tagName,
|
||
comment: jsdoctag.comment
|
||
};
|
||
if (jsdoctag.typeExpression && jsdoctag.typeExpression.type) {
|
||
ret.returnType = kindToType(jsdoctag.typeExpression.type.kind);
|
||
}
|
||
margs.push(ret);
|
||
}
|
||
});
|
||
}
|
||
return margs;
|
||
}
|
||
function readConfig(configFile) {
|
||
var result = tsMorph.ts.readConfigFile(configFile, tsMorph.ts.sys.readFile);
|
||
if (result.error) {
|
||
var message = tsMorph.ts.formatDiagnostics([result.error], formatDiagnosticsHost);
|
||
throw new Error(message);
|
||
}
|
||
return result.config;
|
||
}
|
||
function stripBom(source) {
|
||
if (source.charCodeAt(0) === 0xfeff) {
|
||
return source.slice(1);
|
||
}
|
||
return source;
|
||
}
|
||
function hasBom(source) {
|
||
return source.charCodeAt(0) === 0xfeff;
|
||
}
|
||
function cleanLifecycleHooksFromMethods(methods) {
|
||
var result = [];
|
||
if (typeof methods !== 'undefined') {
|
||
var i = 0;
|
||
var len = methods.length;
|
||
for (i; i < len; i++) {
|
||
if (!(methods[i].name in AngularLifecycleHooks)) {
|
||
result.push(methods[i]);
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
function cleanSourcesForWatch(list) {
|
||
return list.filter(function (element) {
|
||
if (fs__namespace.existsSync(process.cwd() + path__namespace.sep + element)) {
|
||
return element;
|
||
}
|
||
});
|
||
}
|
||
function getNamesCompareFn(name) {
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
name = name || 'name';
|
||
var t = function (a, b) {
|
||
if (a[name]) {
|
||
return a[name].localeCompare(b[name]);
|
||
}
|
||
else {
|
||
return 0;
|
||
}
|
||
};
|
||
return t;
|
||
}
|
||
function isIgnore(member) {
|
||
var e_1, _a, e_2, _b;
|
||
if (member.jsDoc) {
|
||
try {
|
||
for (var _c = logger.__values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
|
||
var doc = _d.value;
|
||
if (doc.tags) {
|
||
try {
|
||
for (var _e = (e_2 = void 0, logger.__values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
||
var tag = _f.value;
|
||
if (tag.tagName.text.indexOf('ignore') > -1) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
||
finally {
|
||
try {
|
||
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
||
}
|
||
finally { if (e_2) throw e_2.error; }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
// https://tc39.github.io/ecma262/#sec-array.prototype.includes
|
||
if (!Array.prototype.includes) {
|
||
Object.defineProperty(Array.prototype, 'includes', {
|
||
value: function (searchElement, fromIndex) {
|
||
if (this == null) {
|
||
throw new TypeError('"this" is null or not defined');
|
||
}
|
||
// 1. Let O be ? ToObject(this value).
|
||
var o = Object(this);
|
||
// 2. Let len be ? ToLength(? Get(O, "length")).
|
||
var len = o.length >>> 0;
|
||
// 3. If len is 0, return false.
|
||
if (len === 0) {
|
||
return false;
|
||
}
|
||
// 4. Let n be ? ToInteger(fromIndex).
|
||
// (If fromIndex is undefined, this step produces the value 0.)
|
||
var n = fromIndex | 0;
|
||
// 5. If n ≥ 0, then
|
||
// a. Let k be n.
|
||
// 6. Else n < 0,
|
||
// a. Let k be len + n.
|
||
// b. If k < 0, let k be 0.
|
||
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
|
||
function sameValueZero(x, y) {
|
||
return (x === y ||
|
||
(typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)));
|
||
}
|
||
// 7. Repeat, while k < len
|
||
while (k < len) {
|
||
// a. Let elementK be the result of ? Get(O, ! ToString(k)).
|
||
// b. If SameValueZero(searchElement, elementK) is true, return true.
|
||
if (sameValueZero(o[k], searchElement)) {
|
||
return true;
|
||
}
|
||
// c. Increase k by 1.
|
||
k++;
|
||
}
|
||
// 8. Return false
|
||
return false;
|
||
}
|
||
});
|
||
}
|
||
function findMainSourceFolder(files) {
|
||
var mainFolder = '';
|
||
var mainFolderCount = 0;
|
||
var rawFolders = files.map(function (filepath) {
|
||
var shortPath = filepath.replace(process.cwd() + path__namespace.sep, '');
|
||
return path__namespace.dirname(shortPath);
|
||
});
|
||
var folders = {};
|
||
rawFolders = ___namespace.uniq(rawFolders);
|
||
for (var i = 0; i < rawFolders.length; i++) {
|
||
var sep = rawFolders[i].split(path__namespace.sep);
|
||
sep.forEach(function (folder) {
|
||
if (folders[folder]) {
|
||
folders[folder] += 1;
|
||
}
|
||
else {
|
||
folders[folder] = 1;
|
||
}
|
||
});
|
||
}
|
||
for (var f in folders) {
|
||
if (folders[f] > mainFolderCount) {
|
||
mainFolderCount = folders[f];
|
||
mainFolder = f;
|
||
}
|
||
}
|
||
return mainFolder;
|
||
}
|
||
// Create a compilerHost object to allow the compiler to read and write files
|
||
function compilerHost(transpileOptions) {
|
||
var inputFileName = transpileOptions.fileName || (transpileOptions.jsx ? 'module.tsx' : 'module.ts');
|
||
var toReturn = {
|
||
getSourceFile: function (fileName) {
|
||
if (fileName.lastIndexOf('.ts') !== -1 || fileName.lastIndexOf('.js') !== -1) {
|
||
if (fileName === 'lib.d.ts') {
|
||
return undefined;
|
||
}
|
||
if (fileName.substr(-5) === '.d.ts') {
|
||
return undefined;
|
||
}
|
||
if (path__namespace.isAbsolute(fileName) === false) {
|
||
fileName = path__namespace.join(transpileOptions.tsconfigDirectory, fileName);
|
||
}
|
||
if (!fs__namespace.existsSync(fileName)) {
|
||
return undefined;
|
||
}
|
||
var libSource = '';
|
||
try {
|
||
libSource = fs__namespace.readFileSync(fileName).toString();
|
||
if (hasBom(libSource)) {
|
||
libSource = stripBom(libSource);
|
||
}
|
||
}
|
||
catch (e) {
|
||
logger.logger.debug(e, fileName);
|
||
}
|
||
return tsMorph.ts.createSourceFile(fileName, libSource, transpileOptions.target, false);
|
||
}
|
||
return undefined;
|
||
},
|
||
writeFile: function (name, text) { },
|
||
getDefaultLibFileName: function () { return 'lib.d.ts'; },
|
||
useCaseSensitiveFileNames: function () { return false; },
|
||
getCanonicalFileName: function (fileName) { return fileName; },
|
||
getCurrentDirectory: function () { return ''; },
|
||
getNewLine: function () { return '\n'; },
|
||
fileExists: function (fileName) { return fileName === inputFileName; },
|
||
readFile: function () { return ''; },
|
||
directoryExists: function () { return true; },
|
||
getDirectories: function () { return []; }
|
||
};
|
||
return toReturn;
|
||
}
|
||
function detectIndent(str, count) {
|
||
var stripIndent = function (stripedString) {
|
||
var match = stripedString.match(/^[ \t]*(?=\S)/gm);
|
||
if (!match) {
|
||
return stripedString;
|
||
}
|
||
var indent = Math.min.apply(Math, logger.__spreadArray([], logger.__read(match.map(function (x) { return x.length; })), false));
|
||
var re = new RegExp("^[ \\t]{".concat(indent, "}"), 'gm');
|
||
return indent > 0 ? stripedString.replace(re, '') : stripedString;
|
||
};
|
||
var repeating = function (n, repeatString) {
|
||
repeatString = repeatString === undefined ? ' ' : repeatString;
|
||
if (typeof repeatString !== 'string') {
|
||
throw new TypeError("Expected `input` to be a `string`, got `".concat(typeof repeatString, "`"));
|
||
}
|
||
if (n < 0) {
|
||
throw new TypeError("Expected `count` to be a positive finite number, got `".concat(n, "`"));
|
||
}
|
||
var ret = '';
|
||
do {
|
||
if (n & 1) {
|
||
ret += repeatString;
|
||
}
|
||
repeatString += repeatString;
|
||
} while ((n >>= 1));
|
||
return ret;
|
||
};
|
||
var indentString = function (indentedString, indentCount) {
|
||
var indent = ' ';
|
||
indentCount = indentCount === undefined ? 1 : indentCount;
|
||
if (typeof indentedString !== 'string') {
|
||
throw new TypeError("Expected `input` to be a `string`, got `".concat(typeof indentedString, "`"));
|
||
}
|
||
if (typeof indentCount !== 'number') {
|
||
throw new TypeError("Expected `count` to be a `number`, got `".concat(typeof indentCount, "`"));
|
||
}
|
||
if (typeof indent !== 'string') {
|
||
throw new TypeError("Expected `indent` to be a `string`, got `".concat(typeof indent, "`"));
|
||
}
|
||
if (indentCount === 0) {
|
||
return indentedString;
|
||
}
|
||
indent = indentCount > 1 ? repeating(indentCount, indent) : indent;
|
||
return indentedString.replace(/^(?!\s*$)/gm, indent);
|
||
};
|
||
return indentString(stripIndent(str), 0);
|
||
}
|
||
var INCLUDE_PATTERNS = ['**/*.ts', '**/*.tsx'];
|
||
var EXCLUDE_PATTERNS = ['**/.git', '**/node_modules', '**/*.d.ts', '**/*.spec.ts'];
|
||
|
||
var traverse$3 = require('neotraverse/legacy');
|
||
var DependenciesEngine = /** @class */ (function () {
|
||
function DependenciesEngine() {
|
||
this.miscellaneous = {
|
||
variables: [],
|
||
functions: [],
|
||
typealiases: [],
|
||
enumerations: [],
|
||
groupedVariables: [],
|
||
groupedFunctions: [],
|
||
groupedEnumerations: [],
|
||
groupedTypeAliases: []
|
||
};
|
||
}
|
||
DependenciesEngine.getInstance = function () {
|
||
if (!DependenciesEngine.instance) {
|
||
DependenciesEngine.instance = new DependenciesEngine();
|
||
}
|
||
return DependenciesEngine.instance;
|
||
};
|
||
DependenciesEngine.prototype.updateModulesDeclarationsExportsTypes = function () {
|
||
var _this = this;
|
||
var mergeTypes = function (entry) {
|
||
var directive = _this.findInCompodocDependencies(entry.name, _this.directives, entry.file);
|
||
if (typeof directive.data !== 'undefined') {
|
||
entry.type = 'directive';
|
||
entry.id = directive.data.id;
|
||
}
|
||
var component = _this.findInCompodocDependencies(entry.name, _this.components, entry.file);
|
||
if (typeof component.data !== 'undefined') {
|
||
entry.type = 'component';
|
||
entry.id = component.data.id;
|
||
}
|
||
var pipe = _this.findInCompodocDependencies(entry.name, _this.pipes, entry.file);
|
||
if (typeof pipe.data !== 'undefined') {
|
||
entry.type = 'pipe';
|
||
entry.id = pipe.data.id;
|
||
}
|
||
};
|
||
this.modules.forEach(function (module) {
|
||
module.declarations.forEach(function (declaration) {
|
||
mergeTypes(declaration);
|
||
});
|
||
module.exports.forEach(function (expt) {
|
||
mergeTypes(expt);
|
||
});
|
||
module.entryComponents.forEach(function (ent) {
|
||
mergeTypes(ent);
|
||
});
|
||
});
|
||
};
|
||
DependenciesEngine.prototype.init = function (data) {
|
||
traverse$3(data).forEach(function (node) {
|
||
if (node) {
|
||
if (node.parent) {
|
||
delete node.parent;
|
||
}
|
||
if (node.initializer) {
|
||
delete node.initializer;
|
||
}
|
||
}
|
||
});
|
||
this.rawData = data;
|
||
this.modules = ___namespace.sortBy(this.rawData.modules, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.rawModulesForOverview = ___namespace.sortBy(data.modulesForGraph, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.rawModules = ___namespace.sortBy(data.modulesForGraph, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.components = ___namespace.sortBy(this.rawData.components, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.controllers = ___namespace.sortBy(this.rawData.controllers, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.entities = ___namespace.sortBy(this.rawData.entities, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.directives = ___namespace.sortBy(this.rawData.directives, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.injectables = ___namespace.sortBy(this.rawData.injectables, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.interceptors = ___namespace.sortBy(this.rawData.interceptors, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.guards = ___namespace.sortBy(this.rawData.guards, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.interfaces = ___namespace.sortBy(this.rawData.interfaces, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.pipes = ___namespace.sortBy(this.rawData.pipes, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.classes = ___namespace.sortBy(this.rawData.classes, [function (el) { return el.name.toLowerCase(); }]);
|
||
this.miscellaneous = this.rawData.miscellaneous;
|
||
this.prepareMiscellaneous();
|
||
this.updateModulesDeclarationsExportsTypes();
|
||
this.routes = this.rawData.routesTree;
|
||
this.manageDuplicatesName();
|
||
this.cleanRawModulesNames();
|
||
};
|
||
DependenciesEngine.prototype.cleanRawModulesNames = function () {
|
||
this.rawModulesForOverview = this.rawModulesForOverview.map(function (module) {
|
||
module.name = module.name.replace('$', '');
|
||
return module;
|
||
});
|
||
};
|
||
DependenciesEngine.prototype.findInCompodocDependencies = function (name, data, file) {
|
||
var _result = {
|
||
source: 'internal',
|
||
data: undefined,
|
||
score: 0
|
||
};
|
||
var nameFoundCounter = 0;
|
||
if (data && data.length > 0) {
|
||
for (var i = 0; i < data.length; i++) {
|
||
if (typeof name !== 'undefined') {
|
||
if (typeof file !== 'undefined') {
|
||
if (name === data[i].name &&
|
||
file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
|
||
nameFoundCounter += 1;
|
||
_result.data = data[i];
|
||
_result.score = 2;
|
||
}
|
||
else if (name.indexOf(data[i].name) !== -1 &&
|
||
file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
|
||
nameFoundCounter += 1;
|
||
_result.data = data[i];
|
||
_result.score = 1;
|
||
}
|
||
}
|
||
else {
|
||
if (name === data[i].name) {
|
||
nameFoundCounter += 1;
|
||
_result.data = data[i];
|
||
_result.score = 2;
|
||
}
|
||
else if (name.indexOf(data[i].name) !== -1) {
|
||
nameFoundCounter += 1;
|
||
_result.data = data[i];
|
||
_result.score = 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// Prevent wrong matching like MultiSelectOptionDirective with SelectOptionDirective, or QueryParamGroupService with QueryParamGroup
|
||
if (nameFoundCounter > 1) {
|
||
var found = false;
|
||
for (var i = 0; i < data.length; i++) {
|
||
if (typeof name !== 'undefined') {
|
||
if (typeof file !== 'undefined') {
|
||
if (name === data[i].name) {
|
||
found = true;
|
||
_result.data = data[i];
|
||
_result.score = 2;
|
||
}
|
||
}
|
||
else {
|
||
if (name === data[i].name) {
|
||
found = true;
|
||
_result.data = data[i];
|
||
_result.score = 2;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (!found) {
|
||
_result = {
|
||
source: 'internal',
|
||
data: undefined,
|
||
score: 0
|
||
};
|
||
}
|
||
}
|
||
}
|
||
return _result;
|
||
};
|
||
DependenciesEngine.prototype.manageDuplicatesName = function () {
|
||
var processDuplicates = function (element, index, array) {
|
||
var elementsWithSameName = ___namespace.filter(array, { name: element.name });
|
||
if (elementsWithSameName.length > 1) {
|
||
// First element is the reference for duplicates
|
||
for (var i = 1; i < elementsWithSameName.length; i++) {
|
||
var elementToEdit = elementsWithSameName[i];
|
||
if (typeof elementToEdit.isDuplicate === 'undefined') {
|
||
elementToEdit.isDuplicate = true;
|
||
elementToEdit.duplicateId = i;
|
||
elementToEdit.duplicateName =
|
||
elementToEdit.name + '-' + elementToEdit.duplicateId;
|
||
elementToEdit.id = elementToEdit.id + '-' + elementToEdit.duplicateId;
|
||
}
|
||
}
|
||
}
|
||
return element;
|
||
};
|
||
this.classes = this.classes.map(processDuplicates);
|
||
this.interfaces = this.interfaces.map(processDuplicates);
|
||
this.injectables = this.injectables.map(processDuplicates);
|
||
this.pipes = this.pipes.map(processDuplicates);
|
||
this.interceptors = this.interceptors.map(processDuplicates);
|
||
this.guards = this.guards.map(processDuplicates);
|
||
this.modules = this.modules.map(processDuplicates);
|
||
this.components = this.components.map(processDuplicates);
|
||
this.controllers = this.controllers.map(processDuplicates);
|
||
this.entities = this.entities.map(processDuplicates);
|
||
this.directives = this.directives.map(processDuplicates);
|
||
};
|
||
DependenciesEngine.prototype.find = function (name) {
|
||
var e_1, _a;
|
||
var _this = this;
|
||
var searchFunctions = [
|
||
function () { return _this.findInCompodocDependencies(name, _this.modules); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.injectables); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.interceptors); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.guards); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.interfaces); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.classes); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.components); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.controllers); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.entities); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.directives); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.variables); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.functions); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.typealiases); },
|
||
function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.enumerations); },
|
||
function () { return AngularApiUtil$1.findApi(name); }
|
||
];
|
||
var bestScore = 0;
|
||
var bestResult = undefined;
|
||
try {
|
||
for (var searchFunctions_1 = logger.__values(searchFunctions), searchFunctions_1_1 = searchFunctions_1.next(); !searchFunctions_1_1.done; searchFunctions_1_1 = searchFunctions_1.next()) {
|
||
var searchFunction = searchFunctions_1_1.value;
|
||
var result = searchFunction();
|
||
if (result.data && result.score > bestScore) {
|
||
bestScore = result.score;
|
||
bestResult = result;
|
||
}
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (searchFunctions_1_1 && !searchFunctions_1_1.done && (_a = searchFunctions_1.return)) _a.call(searchFunctions_1);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
return bestResult;
|
||
};
|
||
DependenciesEngine.prototype.update = function (updatedData) {
|
||
var _this = this;
|
||
if (updatedData.modules.length > 0) {
|
||
___namespace.forEach(updatedData.modules, function (module) {
|
||
var _index = ___namespace.findIndex(_this.modules, { name: module.name });
|
||
_this.modules[_index] = module;
|
||
});
|
||
}
|
||
if (updatedData.components.length > 0) {
|
||
___namespace.forEach(updatedData.components, function (component) {
|
||
var _index = ___namespace.findIndex(_this.components, { name: component.name });
|
||
_this.components[_index] = component;
|
||
});
|
||
}
|
||
if (updatedData.controllers.length > 0) {
|
||
___namespace.forEach(updatedData.controllers, function (controller) {
|
||
var _index = ___namespace.findIndex(_this.controllers, { name: controller.name });
|
||
_this.controllers[_index] = controller;
|
||
});
|
||
}
|
||
if (updatedData.entities.length > 0) {
|
||
___namespace.forEach(updatedData.entities, function (entity) {
|
||
var _index = ___namespace.findIndex(_this.entities, { name: entity.name });
|
||
_this.entities[_index] = entity;
|
||
});
|
||
}
|
||
if (updatedData.directives.length > 0) {
|
||
___namespace.forEach(updatedData.directives, function (directive) {
|
||
var _index = ___namespace.findIndex(_this.directives, { name: directive.name });
|
||
_this.directives[_index] = directive;
|
||
});
|
||
}
|
||
if (updatedData.injectables.length > 0) {
|
||
___namespace.forEach(updatedData.injectables, function (injectable) {
|
||
var _index = ___namespace.findIndex(_this.injectables, { name: injectable.name });
|
||
_this.injectables[_index] = injectable;
|
||
});
|
||
}
|
||
if (updatedData.interceptors.length > 0) {
|
||
___namespace.forEach(updatedData.interceptors, function (interceptor) {
|
||
var _index = ___namespace.findIndex(_this.interceptors, { name: interceptor.name });
|
||
_this.interceptors[_index] = interceptor;
|
||
});
|
||
}
|
||
if (updatedData.guards.length > 0) {
|
||
___namespace.forEach(updatedData.guards, function (guard) {
|
||
var _index = ___namespace.findIndex(_this.guards, { name: guard.name });
|
||
_this.guards[_index] = guard;
|
||
});
|
||
}
|
||
if (updatedData.interfaces.length > 0) {
|
||
___namespace.forEach(updatedData.interfaces, function (int) {
|
||
var _index = ___namespace.findIndex(_this.interfaces, { name: int.name });
|
||
_this.interfaces[_index] = int;
|
||
});
|
||
}
|
||
if (updatedData.pipes.length > 0) {
|
||
___namespace.forEach(updatedData.pipes, function (pipe) {
|
||
var _index = ___namespace.findIndex(_this.pipes, { name: pipe.name });
|
||
_this.pipes[_index] = pipe;
|
||
});
|
||
}
|
||
if (updatedData.classes.length > 0) {
|
||
___namespace.forEach(updatedData.classes, function (classe) {
|
||
var _index = ___namespace.findIndex(_this.classes, { name: classe.name });
|
||
_this.classes[_index] = classe;
|
||
});
|
||
}
|
||
/**
|
||
* Miscellaneous update
|
||
*/
|
||
if (updatedData.miscellaneous.variables.length > 0) {
|
||
___namespace.forEach(updatedData.miscellaneous.variables, function (variable) {
|
||
var _index = ___namespace.findIndex(_this.miscellaneous.variables, {
|
||
name: variable.name,
|
||
file: variable.file
|
||
});
|
||
_this.miscellaneous.variables[_index] = variable;
|
||
});
|
||
}
|
||
if (updatedData.miscellaneous.functions.length > 0) {
|
||
___namespace.forEach(updatedData.miscellaneous.functions, function (func) {
|
||
var _index = ___namespace.findIndex(_this.miscellaneous.functions, {
|
||
name: func.name,
|
||
file: func.file
|
||
});
|
||
_this.miscellaneous.functions[_index] = func;
|
||
});
|
||
}
|
||
if (updatedData.miscellaneous.typealiases.length > 0) {
|
||
___namespace.forEach(updatedData.miscellaneous.typealiases, function (typealias) {
|
||
var _index = ___namespace.findIndex(_this.miscellaneous.typealiases, {
|
||
name: typealias.name,
|
||
file: typealias.file
|
||
});
|
||
_this.miscellaneous.typealiases[_index] = typealias;
|
||
});
|
||
}
|
||
if (updatedData.miscellaneous.enumerations.length > 0) {
|
||
___namespace.forEach(updatedData.miscellaneous.enumerations, function (enumeration) {
|
||
var _index = ___namespace.findIndex(_this.miscellaneous.enumerations, {
|
||
name: enumeration.name,
|
||
file: enumeration.file
|
||
});
|
||
_this.miscellaneous.enumerations[_index] = enumeration;
|
||
});
|
||
}
|
||
this.prepareMiscellaneous();
|
||
};
|
||
DependenciesEngine.prototype.findInCompodoc = function (name) {
|
||
var mergedData = ___namespace.concat([], this.modules, this.components, this.controllers, this.entities, this.directives, this.injectables, this.interceptors, this.guards, this.interfaces, this.pipes, this.classes, this.miscellaneous.enumerations, this.miscellaneous.typealiases, this.miscellaneous.variables, this.miscellaneous.functions);
|
||
var result = ___namespace.find(mergedData, { name: name });
|
||
return result || false;
|
||
};
|
||
DependenciesEngine.prototype.prepareMiscellaneous = function () {
|
||
this.miscellaneous.variables.sort(getNamesCompareFn());
|
||
this.miscellaneous.functions.sort(getNamesCompareFn());
|
||
this.miscellaneous.enumerations.sort(getNamesCompareFn());
|
||
this.miscellaneous.typealiases.sort(getNamesCompareFn());
|
||
// group each subgoup by file
|
||
this.miscellaneous.groupedVariables = ___namespace.groupBy(this.miscellaneous.variables, 'file');
|
||
this.miscellaneous.groupedFunctions = ___namespace.groupBy(this.miscellaneous.functions, 'file');
|
||
this.miscellaneous.groupedEnumerations = ___namespace.groupBy(this.miscellaneous.enumerations, 'file');
|
||
this.miscellaneous.groupedTypeAliases = ___namespace.groupBy(this.miscellaneous.typealiases, 'file');
|
||
};
|
||
DependenciesEngine.prototype.getModule = function (name) {
|
||
return ___namespace.find(this.modules, ['name', name]);
|
||
};
|
||
DependenciesEngine.prototype.getRawModule = function (name) {
|
||
return ___namespace.find(this.rawModules, ['name', name]);
|
||
};
|
||
DependenciesEngine.prototype.getModules = function () {
|
||
return this.modules;
|
||
};
|
||
DependenciesEngine.prototype.getComponents = function () {
|
||
return this.components;
|
||
};
|
||
DependenciesEngine.prototype.getControllers = function () {
|
||
return this.controllers;
|
||
};
|
||
DependenciesEngine.prototype.getEntities = function () {
|
||
return this.entities;
|
||
};
|
||
DependenciesEngine.prototype.getDirectives = function () {
|
||
return this.directives;
|
||
};
|
||
DependenciesEngine.prototype.getInjectables = function () {
|
||
return this.injectables;
|
||
};
|
||
DependenciesEngine.prototype.getInterceptors = function () {
|
||
return this.interceptors;
|
||
};
|
||
DependenciesEngine.prototype.getGuards = function () {
|
||
return this.guards;
|
||
};
|
||
DependenciesEngine.prototype.getInterfaces = function () {
|
||
return this.interfaces;
|
||
};
|
||
DependenciesEngine.prototype.getRoutes = function () {
|
||
return this.routes;
|
||
};
|
||
DependenciesEngine.prototype.getPipes = function () {
|
||
return this.pipes;
|
||
};
|
||
DependenciesEngine.prototype.getClasses = function () {
|
||
return this.classes;
|
||
};
|
||
DependenciesEngine.prototype.getMiscellaneous = function () {
|
||
return this.miscellaneous;
|
||
};
|
||
return DependenciesEngine;
|
||
}());
|
||
var DependenciesEngine$1 = DependenciesEngine.getInstance();
|
||
|
||
var FileEngine = /** @class */ (function () {
|
||
function FileEngine() {
|
||
}
|
||
FileEngine.getInstance = function () {
|
||
if (!FileEngine.instance) {
|
||
FileEngine.instance = new FileEngine();
|
||
}
|
||
return FileEngine.instance;
|
||
};
|
||
FileEngine.prototype.get = function (filepath) {
|
||
return new Promise(function (resolve, reject) {
|
||
fs__namespace.readFile(path__namespace.resolve(filepath), 'utf8', function (err, data) {
|
||
if (err) {
|
||
reject('Error during ' + filepath + ' read');
|
||
}
|
||
else {
|
||
resolve(data);
|
||
}
|
||
});
|
||
});
|
||
};
|
||
FileEngine.prototype.write = function (filepath, contents) {
|
||
return new Promise(function (resolve, reject) {
|
||
fs__namespace.outputFile(path__namespace.resolve(filepath), contents, function (err) {
|
||
if (err) {
|
||
reject(err);
|
||
}
|
||
else {
|
||
resolve();
|
||
}
|
||
});
|
||
});
|
||
};
|
||
FileEngine.prototype.writeSync = function (filepath, contents) {
|
||
fs__namespace.outputFileSync(filepath, contents);
|
||
};
|
||
FileEngine.prototype.getSync = function (filepath) {
|
||
return fs__namespace.readFileSync(path__namespace.resolve(filepath), 'utf8');
|
||
};
|
||
/**
|
||
* @param file The file to check
|
||
*/
|
||
FileEngine.prototype.existsSync = function (file) {
|
||
return fs__namespace.existsSync(file);
|
||
};
|
||
return FileEngine;
|
||
}());
|
||
var FileEngine$1 = FileEngine.getInstance();
|
||
|
||
var traverse$2 = require('neotraverse/legacy');
|
||
var ExportJsonEngine = /** @class */ (function () {
|
||
function ExportJsonEngine() {
|
||
}
|
||
ExportJsonEngine.getInstance = function () {
|
||
if (!ExportJsonEngine.instance) {
|
||
ExportJsonEngine.instance = new ExportJsonEngine();
|
||
}
|
||
return ExportJsonEngine.instance;
|
||
};
|
||
ExportJsonEngine.prototype.export = function (outputFolder, data) {
|
||
var exportData = {};
|
||
traverse$2(data).forEach(function (node) {
|
||
if (node) {
|
||
if (node.parent) {
|
||
delete node.parent;
|
||
}
|
||
if (node.initializer) {
|
||
delete node.initializer;
|
||
}
|
||
if (Configuration$1.mainData.disableSourceCode) {
|
||
delete node.sourceCode;
|
||
delete node.templateData;
|
||
delete node.styleUrlsData;
|
||
delete node.stylesData;
|
||
}
|
||
}
|
||
});
|
||
exportData.pipes = data.pipes;
|
||
exportData.interfaces = data.interfaces;
|
||
exportData.injectables = data.injectables;
|
||
exportData.guards = data.guards;
|
||
exportData.interceptors = data.interceptors;
|
||
exportData.classes = data.classes;
|
||
exportData.directives = data.directives;
|
||
exportData.components = data.components;
|
||
exportData.modules = this.processModules();
|
||
exportData.miscellaneous = data.miscellaneous;
|
||
if (!Configuration$1.mainData.disableRoutesGraph) {
|
||
exportData.routes = data.routes;
|
||
}
|
||
if (!Configuration$1.mainData.disableCoverage) {
|
||
exportData.coverage = data.coverageData;
|
||
}
|
||
return FileEngine$1.write(outputFolder + path__namespace.sep + '/documentation.json', JSON.stringify(exportData, undefined, 4)).catch(function (err) {
|
||
logger.logger.error('Error during export file generation ', err);
|
||
return Promise.reject(err);
|
||
});
|
||
};
|
||
ExportJsonEngine.prototype.processModules = function () {
|
||
var modules = DependenciesEngine$1.getModules();
|
||
var _resultedModules = [];
|
||
for (var moduleNr = 0; moduleNr < modules.length; moduleNr++) {
|
||
var module_1 = modules[moduleNr];
|
||
var moduleElement = {
|
||
name: module_1.name,
|
||
id: module_1.id,
|
||
description: module_1.description,
|
||
rawDescription: module_1.rawDescription,
|
||
deprecationMessage: module_1.deprecationMessage,
|
||
deprecated: module_1.deprecated,
|
||
file: module_1.file,
|
||
methods: module_1.methods,
|
||
sourceCode: module_1.sourceCode,
|
||
children: [
|
||
{
|
||
type: 'providers',
|
||
elements: []
|
||
},
|
||
{
|
||
type: 'declarations',
|
||
elements: []
|
||
},
|
||
{
|
||
type: 'imports',
|
||
elements: []
|
||
},
|
||
{
|
||
type: 'exports',
|
||
elements: []
|
||
},
|
||
{
|
||
type: 'bootstrap',
|
||
elements: []
|
||
},
|
||
{
|
||
type: 'classes',
|
||
elements: []
|
||
}
|
||
]
|
||
};
|
||
for (var k = 0; k < module_1.providers.length; k++) {
|
||
var providerElement = {
|
||
name: module_1.providers[k].name
|
||
};
|
||
moduleElement.children[0].elements.push(providerElement);
|
||
}
|
||
for (var k = 0; k < module_1.declarations.length; k++) {
|
||
var declarationElement = {
|
||
name: module_1.declarations[k].name
|
||
};
|
||
moduleElement.children[1].elements.push(declarationElement);
|
||
}
|
||
for (var k = 0; k < module_1.imports.length; k++) {
|
||
var importElement = {
|
||
name: module_1.imports[k].name
|
||
};
|
||
moduleElement.children[2].elements.push(importElement);
|
||
}
|
||
for (var k = 0; k < module_1.exports.length; k++) {
|
||
var exportElement = {
|
||
name: module_1.exports[k].name
|
||
};
|
||
moduleElement.children[3].elements.push(exportElement);
|
||
}
|
||
for (var k = 0; k < module_1.bootstrap.length; k++) {
|
||
var bootstrapElement = {
|
||
name: module_1.bootstrap[k].name
|
||
};
|
||
moduleElement.children[4].elements.push(bootstrapElement);
|
||
}
|
||
_resultedModules.push(moduleElement);
|
||
}
|
||
return _resultedModules;
|
||
};
|
||
return ExportJsonEngine;
|
||
}());
|
||
var ExportJsonEngine$1 = ExportJsonEngine.getInstance();
|
||
|
||
var ExportEngine = /** @class */ (function () {
|
||
function ExportEngine() {
|
||
}
|
||
ExportEngine.getInstance = function () {
|
||
if (!ExportEngine.instance) {
|
||
ExportEngine.instance = new ExportEngine();
|
||
}
|
||
return ExportEngine.instance;
|
||
};
|
||
ExportEngine.prototype.export = function (outputFolder, data) {
|
||
switch (Configuration$1.mainData.exportFormat) {
|
||
case 'json':
|
||
return ExportJsonEngine$1.export(outputFolder, data);
|
||
/*case 'pdf':
|
||
return ExportPdfEngine.export(outputFolder);*/
|
||
}
|
||
};
|
||
return ExportEngine;
|
||
}());
|
||
var ExportEngine$1 = ExportEngine.getInstance();
|
||
|
||
var Handlebars$9 = require('handlebars');
|
||
var BreakCommaHelper = /** @class */ (function () {
|
||
function BreakCommaHelper(bars) {
|
||
this.bars = bars;
|
||
}
|
||
BreakCommaHelper.prototype.helperFunc = function (context, text) {
|
||
text = this.bars.Utils.escapeExpression(text);
|
||
text = text.replace(/,/g, ',<br>');
|
||
return new Handlebars$9.SafeString(text);
|
||
};
|
||
return BreakCommaHelper;
|
||
}());
|
||
|
||
var Handlebars$8 = require('handlebars');
|
||
var BreakLinesHelper = /** @class */ (function () {
|
||
function BreakLinesHelper(bars) {
|
||
this.bars = bars;
|
||
}
|
||
BreakLinesHelper.prototype.helperFunc = function (context, text) {
|
||
text = this.bars.Utils.escapeExpression(text);
|
||
text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
|
||
text = text.replace(/ /gm, ' ');
|
||
text = text.replace(/ /gm, ' ');
|
||
return new Handlebars$8.SafeString(text);
|
||
};
|
||
return BreakLinesHelper;
|
||
}());
|
||
|
||
require('handlebars');
|
||
var CapitalizeHelper = /** @class */ (function () {
|
||
function CapitalizeHelper() {
|
||
}
|
||
CapitalizeHelper.prototype.helperFunc = function (context, text) {
|
||
return text.charAt(0).toUpperCase() + text.slice(1);
|
||
};
|
||
return CapitalizeHelper;
|
||
}());
|
||
|
||
var Handlebars$7 = require('handlebars');
|
||
var CleanParagraphHelper = /** @class */ (function () {
|
||
function CleanParagraphHelper() {
|
||
}
|
||
CleanParagraphHelper.prototype.helperFunc = function (context, text) {
|
||
text = text.replace(/<p>/gm, '');
|
||
text = text.replace(/<\/p>/gm, '');
|
||
return new Handlebars$7.SafeString(text);
|
||
};
|
||
return CleanParagraphHelper;
|
||
}());
|
||
|
||
var CompareHelper = /** @class */ (function () {
|
||
function CompareHelper() {
|
||
}
|
||
CompareHelper.prototype.helperFunc = function (context, a, operator, b, options) {
|
||
if (arguments.length < 4) {
|
||
throw new Error('handlebars Helper {{compare}} expects 4 arguments');
|
||
}
|
||
var result;
|
||
switch (operator) {
|
||
case 'indexof':
|
||
result = b.indexOf(a) !== -1;
|
||
break;
|
||
case '===':
|
||
result = a === b;
|
||
break;
|
||
case '!==':
|
||
result = a !== b;
|
||
break;
|
||
case '>':
|
||
result = a > b;
|
||
break;
|
||
default: {
|
||
throw new Error('helper {{compare}}: invalid operator: `' + operator + '`');
|
||
}
|
||
}
|
||
if (result === false) {
|
||
return options.inverse(context);
|
||
}
|
||
return options.fn(context);
|
||
};
|
||
return CompareHelper;
|
||
}());
|
||
|
||
var DebugHelper = /** @class */ (function () {
|
||
function DebugHelper() {
|
||
}
|
||
DebugHelper.prototype.helperFunc = function (context, optionalValue) {
|
||
console.log('Current Context');
|
||
console.log('====================');
|
||
console.log(context);
|
||
if (optionalValue) {
|
||
console.log('OptionalValue');
|
||
console.log('====================');
|
||
console.log(optionalValue);
|
||
}
|
||
};
|
||
return DebugHelper;
|
||
}());
|
||
|
||
var ElementAloneHelper = /** @class */ (function () {
|
||
function ElementAloneHelper() {
|
||
}
|
||
ElementAloneHelper.prototype.helperFunc = function (context, elements, elementType, options) {
|
||
var alones = [];
|
||
var modules = DependenciesEngine$1.modules;
|
||
elements.forEach(function (element) {
|
||
var foundInOneModule = false;
|
||
modules.forEach(function (module) {
|
||
module.declarations.forEach(function (declaration) {
|
||
if (declaration.id === element.id) {
|
||
foundInOneModule = true;
|
||
}
|
||
if (declaration.file === element.file) {
|
||
foundInOneModule = true;
|
||
}
|
||
});
|
||
module.bootstrap.forEach(function (boostrapedElement) {
|
||
if (boostrapedElement.id === element.id) {
|
||
foundInOneModule = true;
|
||
}
|
||
if (boostrapedElement.file === element.file) {
|
||
foundInOneModule = true;
|
||
}
|
||
});
|
||
module.controllers.forEach(function (controller) {
|
||
if (controller.id === element.id) {
|
||
foundInOneModule = true;
|
||
}
|
||
if (controller.file === element.file) {
|
||
foundInOneModule = true;
|
||
}
|
||
});
|
||
module.providers.forEach(function (provider) {
|
||
if (provider.id === element.id) {
|
||
foundInOneModule = true;
|
||
}
|
||
if (provider.file === element.file) {
|
||
foundInOneModule = true;
|
||
}
|
||
});
|
||
});
|
||
if (!foundInOneModule) {
|
||
alones.push(element);
|
||
}
|
||
});
|
||
if (alones.length > 0) {
|
||
switch (elementType) {
|
||
case 'component':
|
||
context.components = alones;
|
||
break;
|
||
case 'directive':
|
||
context.directives = alones;
|
||
break;
|
||
case 'controller':
|
||
context.controllers = alones;
|
||
break;
|
||
case 'injectable':
|
||
context.injectables = alones;
|
||
break;
|
||
case 'pipe':
|
||
context.pipes = alones;
|
||
break;
|
||
}
|
||
return options.fn(context);
|
||
}
|
||
};
|
||
return ElementAloneHelper;
|
||
}());
|
||
|
||
var EscapeSimpleQuoteHelper = /** @class */ (function () {
|
||
function EscapeSimpleQuoteHelper() {
|
||
}
|
||
EscapeSimpleQuoteHelper.prototype.helperFunc = function (context, text) {
|
||
if (!text) {
|
||
return;
|
||
}
|
||
text = text.replace(/'/g, "\\'");
|
||
text = text.replace(/(\r\n|\n|\r)/gm, '');
|
||
return text;
|
||
};
|
||
return EscapeSimpleQuoteHelper;
|
||
}());
|
||
|
||
var FilterAngular2ModulesHelper = /** @class */ (function () {
|
||
function FilterAngular2ModulesHelper() {
|
||
}
|
||
FilterAngular2ModulesHelper.prototype.helperFunc = function (context, text, options) {
|
||
var NG2_MODULES = [
|
||
'BrowserModule',
|
||
'FormsModule',
|
||
'HttpModule',
|
||
'RouterModule'
|
||
];
|
||
var len = NG2_MODULES.length;
|
||
var i = 0;
|
||
var result = false;
|
||
for (i; i < len; i++) {
|
||
if (text.indexOf(NG2_MODULES[i]) > -1) {
|
||
result = true;
|
||
}
|
||
}
|
||
if (result) {
|
||
return options.fn(context);
|
||
}
|
||
else {
|
||
return options.inverse(context);
|
||
}
|
||
};
|
||
return FilterAngular2ModulesHelper;
|
||
}());
|
||
|
||
var AngularVersionUtil = /** @class */ (function () {
|
||
function AngularVersionUtil() {
|
||
}
|
||
AngularVersionUtil.getInstance = function () {
|
||
if (!AngularVersionUtil.instance) {
|
||
AngularVersionUtil.instance = new AngularVersionUtil();
|
||
}
|
||
return AngularVersionUtil.instance;
|
||
};
|
||
AngularVersionUtil.prototype.cleanVersion = function (version) {
|
||
return version
|
||
.replace('~', '')
|
||
.replace('^', '')
|
||
.replace('=', '')
|
||
.replace('<', '')
|
||
.replace('>', '');
|
||
};
|
||
AngularVersionUtil.prototype.getAngularVersionOfProject = function (packageData) {
|
||
var _result = '';
|
||
if (packageData.dependencies) {
|
||
var angularCore = packageData.dependencies[AngularVersionUtil.CorePackage];
|
||
if (angularCore) {
|
||
_result = this.cleanVersion(angularCore);
|
||
}
|
||
}
|
||
return _result;
|
||
};
|
||
AngularVersionUtil.prototype.isAngularVersionArchived = function (version) {
|
||
var result;
|
||
try {
|
||
result = semver__namespace.compare(version, '2.4.10') <= 0;
|
||
}
|
||
catch (e) { }
|
||
return result;
|
||
};
|
||
AngularVersionUtil.prototype.prefixOfficialDoc = function (version) {
|
||
// Handle empty, undefined, or invalid version strings
|
||
if (!version || typeof version !== 'string' || version.trim() === '') {
|
||
return '';
|
||
}
|
||
return this.isAngularVersionArchived(version) ? 'v2.' : '';
|
||
};
|
||
AngularVersionUtil.prototype.getApiLink = function (api, angularVersion) {
|
||
var angularDocPrefix = this.prefixOfficialDoc(angularVersion);
|
||
return "https://".concat(angularDocPrefix, "angular.io/").concat(api.path);
|
||
};
|
||
AngularVersionUtil.CorePackage = '@angular/core';
|
||
return AngularVersionUtil;
|
||
}());
|
||
var AngularVersionUtil$1 = AngularVersionUtil.getInstance();
|
||
|
||
var BasicTypes;
|
||
(function (BasicTypes) {
|
||
BasicTypes[BasicTypes["number"] = 0] = "number";
|
||
BasicTypes[BasicTypes["boolean"] = 1] = "boolean";
|
||
BasicTypes[BasicTypes["string"] = 2] = "string";
|
||
BasicTypes[BasicTypes["object"] = 3] = "object";
|
||
BasicTypes[BasicTypes["date"] = 4] = "date";
|
||
BasicTypes[BasicTypes["function"] = 5] = "function";
|
||
})(BasicTypes || (BasicTypes = {}));
|
||
var BasicTypeScriptTypes;
|
||
(function (BasicTypeScriptTypes) {
|
||
BasicTypeScriptTypes[BasicTypeScriptTypes["any"] = 0] = "any";
|
||
BasicTypeScriptTypes[BasicTypeScriptTypes["void"] = 1] = "void";
|
||
})(BasicTypeScriptTypes || (BasicTypeScriptTypes = {}));
|
||
var BasicTypeUtil = /** @class */ (function () {
|
||
function BasicTypeUtil() {
|
||
}
|
||
BasicTypeUtil.getInstance = function () {
|
||
if (!BasicTypeUtil.instance) {
|
||
BasicTypeUtil.instance = new BasicTypeUtil();
|
||
}
|
||
return BasicTypeUtil.instance;
|
||
};
|
||
/**
|
||
* Checks if a given types is a basic javascript type
|
||
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
|
||
* @param type The type to check
|
||
*/
|
||
BasicTypeUtil.prototype.isJavascriptType = function (type) {
|
||
if (typeof type !== 'undefined' && type.toLowerCase) {
|
||
return type.toLowerCase() in BasicTypes;
|
||
}
|
||
else {
|
||
return false;
|
||
}
|
||
};
|
||
/**
|
||
* Checks if a given type is a typescript type (That is not a javascript type)
|
||
* https://www.typescriptlang.org/docs/handbook/basic-types.html
|
||
* @param type The type to check
|
||
*/
|
||
BasicTypeUtil.prototype.isTypeScriptType = function (type) {
|
||
if (typeof type !== 'undefined' && type.toLowerCase) {
|
||
return type.toLowerCase() in BasicTypeScriptTypes;
|
||
}
|
||
else {
|
||
return false;
|
||
}
|
||
};
|
||
/**
|
||
* Check if the type is a typescript or javascript type
|
||
* @param type The type to check
|
||
*/
|
||
BasicTypeUtil.prototype.isKnownType = function (type) {
|
||
return this.isJavascriptType(type) || this.isTypeScriptType(type);
|
||
};
|
||
/**
|
||
* Returns a official documentation link to either the javascript or typescript type
|
||
* @param type The type to check
|
||
* @returns The documentation link or undefined if type not found
|
||
*/
|
||
BasicTypeUtil.prototype.getTypeUrl = function (type) {
|
||
if (this.isJavascriptType(type)) {
|
||
return "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/".concat(type);
|
||
}
|
||
if (this.isTypeScriptType(type)) {
|
||
return "https://www.typescriptlang.org/docs/handbook/basic-types.html";
|
||
}
|
||
return undefined;
|
||
};
|
||
return BasicTypeUtil;
|
||
}());
|
||
var BasicTypeUtil$1 = BasicTypeUtil.getInstance();
|
||
|
||
var Handlebars$6 = require('handlebars');
|
||
var FunctionSignatureHelper = /** @class */ (function () {
|
||
function FunctionSignatureHelper() {
|
||
}
|
||
/**
|
||
* Generates the correct href for internal type links
|
||
* Handles both regular types and miscellaneous types (typealias, enum, function, variable)
|
||
*/
|
||
FunctionSignatureHelper.prototype.buildHrefForInternalType = function (resultData) {
|
||
if (resultData.type === 'miscellaneous' ||
|
||
(resultData.ctype && resultData.ctype === 'miscellaneous')) {
|
||
var mainpage = '';
|
||
switch (resultData.subtype) {
|
||
case 'enum':
|
||
mainpage = 'enumerations';
|
||
break;
|
||
case 'function':
|
||
mainpage = 'functions';
|
||
break;
|
||
case 'typealias':
|
||
mainpage = 'typealiases';
|
||
break;
|
||
case 'variable':
|
||
mainpage = 'variables';
|
||
break;
|
||
}
|
||
return "../miscellaneous/".concat(mainpage, ".html#").concat(resultData.name);
|
||
}
|
||
else {
|
||
var path = resultData.type;
|
||
if (resultData.type === 'class') {
|
||
path = 'classe';
|
||
}
|
||
return "../".concat(path, "s/").concat(resultData.name, ".html");
|
||
}
|
||
};
|
||
FunctionSignatureHelper.prototype.handleFunction = function (arg) {
|
||
var _this = this;
|
||
if (arg.function.length === 0) {
|
||
return "".concat(arg.name).concat(this.getOptionalString(arg), ": () => void");
|
||
}
|
||
var argums = arg.function.map(function (argu) {
|
||
var _result = DependenciesEngine$1.find(argu.type);
|
||
if (_result) {
|
||
if (_result.source === 'internal') {
|
||
var href = _this.buildHrefForInternalType(_result.data);
|
||
return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(href, "\">").concat(argu.type, "</a>");
|
||
}
|
||
else {
|
||
var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
|
||
return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
|
||
}
|
||
}
|
||
else if (BasicTypeUtil$1.isKnownType(argu.type)) {
|
||
var path = BasicTypeUtil$1.getTypeUrl(argu.type);
|
||
return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
|
||
}
|
||
else {
|
||
if (argu.name && argu.type) {
|
||
return "".concat(argu.name).concat(_this.getOptionalString(arg), ": ").concat(argu.type);
|
||
}
|
||
else {
|
||
if (argu.name) {
|
||
return "".concat(argu.name.text);
|
||
}
|
||
else {
|
||
return '';
|
||
}
|
||
}
|
||
}
|
||
});
|
||
return "".concat(arg.name).concat(this.getOptionalString(arg), ": (").concat(argums.join(', '), ") => void");
|
||
};
|
||
FunctionSignatureHelper.prototype.getOptionalString = function (arg) {
|
||
return arg.optional ? '?' : '';
|
||
};
|
||
FunctionSignatureHelper.prototype.helperFunc = function (context, method) {
|
||
var _this = this;
|
||
var args = '';
|
||
var argDestructuredCounterInitial = 0;
|
||
var argDestructuredCounterReal = 0;
|
||
if (method.args) {
|
||
method.args.forEach(function (arg) {
|
||
if (arg.destructuredParameter) {
|
||
argDestructuredCounterInitial += 1;
|
||
}
|
||
});
|
||
method.args.forEach(function (arg, index) {
|
||
var _result = DependenciesEngine$1.find(arg.type);
|
||
if (arg.destructuredParameter) {
|
||
if (argDestructuredCounterReal === 0) {
|
||
args += '__namedParameters: {';
|
||
}
|
||
argDestructuredCounterReal += 1;
|
||
}
|
||
if (_result) {
|
||
if (_result.source === 'internal') {
|
||
var href = _this.buildHrefForInternalType(_result.data);
|
||
args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(href, "\" target=\"_self\">").concat(Handlebars$6.escapeExpression(arg.type), "</a>");
|
||
}
|
||
else {
|
||
var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
|
||
args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(Handlebars$6.escapeExpression(arg.type), "</a>");
|
||
}
|
||
}
|
||
else if (arg.dotDotDotToken) {
|
||
args += "...".concat(arg.name, ": ").concat(arg.type);
|
||
}
|
||
else if (arg.function) {
|
||
args += _this.handleFunction(arg);
|
||
}
|
||
else if (BasicTypeUtil$1.isKnownType(arg.type)) {
|
||
var path = BasicTypeUtil$1.getTypeUrl(arg.type);
|
||
args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(Handlebars$6.escapeExpression(arg.type), "</a>");
|
||
}
|
||
else {
|
||
if (arg.type) {
|
||
args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": ").concat(arg.type);
|
||
}
|
||
else {
|
||
args += "".concat(arg.name).concat(_this.getOptionalString(arg));
|
||
}
|
||
}
|
||
if (arg.destructuredParameter) {
|
||
if (argDestructuredCounterReal === argDestructuredCounterInitial) {
|
||
args += '}';
|
||
}
|
||
}
|
||
if (index < method.args.length - 1) {
|
||
args += ', ';
|
||
}
|
||
});
|
||
}
|
||
if (method.name) {
|
||
return "".concat(method.name, "(").concat(args, ")");
|
||
}
|
||
else {
|
||
return "(".concat(args, ")");
|
||
}
|
||
};
|
||
return FunctionSignatureHelper;
|
||
}());
|
||
|
||
var HasOwnHelper = /** @class */ (function () {
|
||
function HasOwnHelper() {
|
||
}
|
||
HasOwnHelper.prototype.helperFunc = function (context, entity, key, options) {
|
||
if (Object.hasOwnProperty.call(entity, key)) {
|
||
return options.fn(context);
|
||
}
|
||
else {
|
||
return options.inverse(context);
|
||
}
|
||
};
|
||
return HasOwnHelper;
|
||
}());
|
||
|
||
var TRANSLATION_BG_BG = {
|
||
accessors: 'Accessors',
|
||
arguments: 'Аргументи',
|
||
bootstrap: 'Bootstrap',
|
||
branches: 'Branches',
|
||
browse: 'Търсене',
|
||
classe: 'Клас',
|
||
classes: 'Класове',
|
||
component: 'Компонент',
|
||
components: 'Компоненти',
|
||
constructor: 'Конструктор',
|
||
controllers: 'Контролери',
|
||
controller: 'Контролер',
|
||
'coverage-page-title': 'Coverage на документацията',
|
||
declarations: 'Декларации',
|
||
decorators: 'Декоратори',
|
||
'default-value': 'Стойност по подразбиране',
|
||
'defined-in': 'Дефинирана в',
|
||
dependencies: 'Зависимости',
|
||
deprecated: 'Deprecated',
|
||
description: 'Описание',
|
||
directive: 'Директива',
|
||
directives: 'Директиви',
|
||
'dom tree': 'DOM-дърво',
|
||
entities: 'Entities',
|
||
entity: 'Entity',
|
||
entrycomponents: 'EntryComponents',
|
||
enumerations: 'Enumerations',
|
||
enums: 'Enums',
|
||
example: 'Пример',
|
||
examples: 'Примери',
|
||
exports: 'Exports',
|
||
extends: 'Extends',
|
||
file: 'Файл',
|
||
functions: 'Функции',
|
||
'generated-using': 'Документацията е генерирана, използвайки',
|
||
'getting-started': 'Начало',
|
||
guard: 'Guard',
|
||
guards: 'Guards',
|
||
hostbindings: 'HostBindings',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListeners',
|
||
'html-element': 'HTML-елемент',
|
||
'html-element-with-directive': 'HTML-елемент с директива',
|
||
identifier: 'Идентификатор',
|
||
implements: 'Имплементира',
|
||
imports: 'Imports',
|
||
index: 'Индекс',
|
||
indexable: 'Индексируем',
|
||
info: 'Информация',
|
||
'inherited-from': 'Наследен от',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: 'Inputs',
|
||
interceptors: 'Interceptors',
|
||
interface: 'Interface',
|
||
interfaces: 'Interfaces',
|
||
legend: 'Легенда',
|
||
license: 'Лиценз',
|
||
lines: 'Редове',
|
||
metadata: 'Metadata',
|
||
methods: 'Методи',
|
||
miscellaneous: 'Други',
|
||
module: 'Модул',
|
||
modules: 'Модули',
|
||
name: 'Име',
|
||
no: 'Не',
|
||
'no-graph': 'Няма наличен граф.',
|
||
'no-iframe': 'Браузърът Ви не поддържа iframe.',
|
||
'no-result-matching': 'Няма намерени резултати.',
|
||
'no-svg': 'Браузърът Ви не поддържа SVG.',
|
||
optional: 'Незадължително',
|
||
outputs: 'Outputs',
|
||
overview: 'Преглед',
|
||
parameters: 'Параметри',
|
||
'peer-dependencies': 'Peer-зависимости',
|
||
pipe: 'Pipe',
|
||
pipes: 'Pipes',
|
||
prefix: 'Префикс',
|
||
properties: 'Properties',
|
||
providers: 'Providers',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: 'Задължително',
|
||
reset: 'Нулиране',
|
||
'results-matching': 'намерени резултати',
|
||
returns: 'Returns',
|
||
route: 'Път',
|
||
routes: 'Пътища',
|
||
schemas: 'Схеми',
|
||
'search-placeholder': 'Търсене',
|
||
selector: 'Селектор',
|
||
signature: 'Подпис',
|
||
source: 'Източник',
|
||
standalone: 'Standalone',
|
||
statements: 'Statements',
|
||
styles: 'Стилове',
|
||
template: 'Шаблон',
|
||
type: 'Тип',
|
||
'type-aliases': 'Type aliases',
|
||
'type-parameters': 'Type parameters',
|
||
types: 'Типове',
|
||
'unamed-property': 'Неназовано property',
|
||
'unit-test-coverage': 'Покритие на Unit-тестовете',
|
||
value: 'Стойност',
|
||
variables: 'Променливи',
|
||
yes: 'Да',
|
||
zoomin: 'Zoom in',
|
||
zoomout: 'Zoom out'
|
||
};
|
||
|
||
var TRANSLATION_DE_DE = {
|
||
accessors: 'Accessors',
|
||
arguments: 'Argumente',
|
||
bootstrap: 'Bootstrap',
|
||
branches: 'Branches',
|
||
browse: 'Durchsuche',
|
||
classe: 'Klasse',
|
||
classes: 'Klassen',
|
||
component: 'Komponente',
|
||
components: 'Komponenten',
|
||
constructor: 'Konstruktor',
|
||
controllers: 'Controllers',
|
||
controller: 'Controller',
|
||
'coverage-page-title': 'Dokumentation Abdeckung',
|
||
declarations: 'Declarations',
|
||
decorators: 'Decorators',
|
||
'default-value': 'Standardwert',
|
||
'defined-in': 'Definiert in',
|
||
dependencies: 'Abhängigkeiten',
|
||
deprecated: 'Veraltet',
|
||
description: 'Beschreibung',
|
||
directive: 'Direktive',
|
||
directives: 'Direktiven',
|
||
'dom tree': 'DOM baum',
|
||
entities: 'Entities',
|
||
entity: 'Entity',
|
||
entrycomponents: 'EntryComponents',
|
||
enumerations: 'Enumerations',
|
||
enums: 'Enums',
|
||
example: 'Beispiel',
|
||
examples: 'Beispiele',
|
||
exports: 'Exportiert',
|
||
extends: 'Erweitert',
|
||
file: 'Datei',
|
||
functions: 'Funktionen',
|
||
'generated-using': 'Dokumentation generiert mit',
|
||
'getting-started': "Los geht's",
|
||
guard: 'Guard',
|
||
guards: 'Guards',
|
||
hostbindings: 'HostBindings',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListeners',
|
||
'html-element': 'Html Element',
|
||
'html-element-with-directive': 'Html-Element mit Direktive',
|
||
identifier: 'Kennung',
|
||
implements: 'Implementiert',
|
||
imports: 'Importiert',
|
||
index: 'Index',
|
||
indexable: 'Indizierbar',
|
||
info: 'Information',
|
||
'inherited-from': 'Geerbt von',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: 'Inputs',
|
||
interceptors: 'Interceptors',
|
||
interface: 'Interface',
|
||
interfaces: 'Interfaces',
|
||
legend: 'Legende',
|
||
license: 'Lizenz',
|
||
lines: 'Linien',
|
||
metadata: 'Metadata',
|
||
methods: 'Methoden',
|
||
miscellaneous: 'Verschiedenes',
|
||
module: 'Modul',
|
||
modules: 'Module',
|
||
name: 'Name',
|
||
no: 'Nein',
|
||
'no-graph': 'Kein Graph verfügbar.',
|
||
'no-iframe': 'Dein Browser unterstützt keine iframes.',
|
||
'no-result-matching': 'Kein passendes Ergebnis',
|
||
'no-svg': 'Dein Browser unterstützt kein SVG',
|
||
optional: 'Optional',
|
||
outputs: 'Ausgaben',
|
||
overview: 'Übersicht',
|
||
parameters: 'Parameter',
|
||
'peer-dependencies': 'Peer-Abhängigkeiten',
|
||
pipe: 'Pipe',
|
||
pipes: 'Pipes',
|
||
prefix: 'Präfix',
|
||
properties: 'Eigenschaften',
|
||
providers: 'Providers',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: 'Erforderlich',
|
||
reset: 'Zurücksetzen',
|
||
'results-matching': 'übereinstimmende Ergebnisse',
|
||
returns: 'Returns',
|
||
route: 'Route',
|
||
routes: 'Routen',
|
||
schemas: 'Schemata',
|
||
'search-placeholder': 'Eingeben zur Suche',
|
||
selector: 'Selektor',
|
||
signature: 'Unterschrift',
|
||
source: 'Quelle',
|
||
standalone: 'Standalone',
|
||
statements: 'Statements',
|
||
styles: 'Stile',
|
||
template: 'Vorlage',
|
||
type: 'Typ',
|
||
'type-aliases': 'Typ Aliase',
|
||
'type-parameters': 'Typ Parameter',
|
||
types: 'Typen',
|
||
'unamed-property': 'Unbenannte Eigenschaft',
|
||
'unit-test-coverage': 'Unit-Test-Abdeckung',
|
||
value: 'Wert',
|
||
variables: 'Variablen',
|
||
yes: 'Ja',
|
||
zoomin: 'Vergrößern',
|
||
zoomout: 'Verkleinern'
|
||
};
|
||
|
||
var TRANSLATION_EN_US = {
|
||
accessors: 'Accessors',
|
||
arguments: 'Arguments',
|
||
bootstrap: 'Bootstrap',
|
||
branches: 'Branches',
|
||
browse: 'Browse',
|
||
classe: 'Class',
|
||
classes: 'Classes',
|
||
component: 'Component',
|
||
components: 'Components',
|
||
constructor: 'Constructor',
|
||
controllers: 'Controllers',
|
||
controller: 'Controller',
|
||
'coverage-page-title': 'Documentation coverage',
|
||
declarations: 'Declarations',
|
||
decorators: 'Decorators',
|
||
'default-value': 'Default value',
|
||
'defined-in': 'Defined in',
|
||
dependencies: 'Dependencies',
|
||
deprecated: 'Deprecated',
|
||
description: 'Description',
|
||
directive: 'Directive',
|
||
directives: 'Directives',
|
||
'dom tree': 'DOM tree',
|
||
entities: 'Entities',
|
||
entity: 'Entity',
|
||
entrycomponents: 'EntryComponents',
|
||
enumerations: 'Enumerations',
|
||
enums: 'Enums',
|
||
example: 'Example',
|
||
examples: 'Examples',
|
||
exports: 'Exports',
|
||
extends: 'Extends',
|
||
file: 'File',
|
||
functions: 'Functions',
|
||
'generated-using': 'Documentation generated using',
|
||
'getting-started': 'Getting started',
|
||
guard: 'Guard',
|
||
guards: 'Guards',
|
||
hostbindings: 'HostBindings',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListeners',
|
||
'html-element': 'Html element',
|
||
'html-element-with-directive': 'Html element with directive',
|
||
identifier: 'Identifier',
|
||
implements: 'Implements',
|
||
imports: 'Imports',
|
||
index: 'Index',
|
||
indexable: 'Indexable',
|
||
info: 'Information',
|
||
'inherited-from': 'Inherited from',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: 'Inputs',
|
||
interceptors: 'Interceptors',
|
||
interface: 'Interface',
|
||
interfaces: 'Interfaces',
|
||
legend: 'Legend',
|
||
license: 'License',
|
||
lines: 'Lines',
|
||
metadata: 'Metadata',
|
||
methods: 'Methods',
|
||
miscellaneous: 'Miscellaneous',
|
||
module: 'Module',
|
||
modules: 'Modules',
|
||
name: 'Name',
|
||
no: 'No',
|
||
'no-graph': 'No graph available.',
|
||
'no-iframe': 'Your browser does not support iframes.',
|
||
'no-result-matching': 'No results matching',
|
||
'no-svg': 'Your browser does not support SVG',
|
||
optional: 'Optional',
|
||
outputs: 'Outputs',
|
||
overview: 'Overview',
|
||
parameters: 'Parameters',
|
||
'peer-dependencies': 'Peer dependencies',
|
||
pipe: 'Pipe',
|
||
pipes: 'Pipes',
|
||
prefix: 'Prefix',
|
||
properties: 'Properties',
|
||
providers: 'Providers',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: 'Required',
|
||
reset: 'Reset',
|
||
'results-matching': 'results matching',
|
||
returns: 'Returns',
|
||
route: 'Route',
|
||
routes: 'Routes',
|
||
schemas: 'Schemas',
|
||
'search-placeholder': 'Type to search',
|
||
selector: 'Selector',
|
||
signature: 'Signature',
|
||
source: 'Source',
|
||
standalone: 'Standalone',
|
||
statements: 'Statements',
|
||
styles: 'Styles',
|
||
template: 'Template',
|
||
type: 'Type',
|
||
'type-aliases': 'Type aliases',
|
||
'type-parameters': 'Type parameters',
|
||
types: 'Types',
|
||
'unamed-property': 'Unamed property',
|
||
'unit-test-coverage': 'Unit test coverage',
|
||
value: 'Value',
|
||
variables: 'Variables',
|
||
yes: 'Yes',
|
||
zoomin: 'Zoom in',
|
||
zoomout: 'Zoom out'
|
||
};
|
||
|
||
var TRANSLATION_ES_ES = {
|
||
accessors: 'Accesorios',
|
||
arguments: 'Argumentos',
|
||
bootstrap: 'Arranque',
|
||
branches: 'Ramas',
|
||
browse: 'Navegar',
|
||
classe: 'Clase',
|
||
classes: 'Clases',
|
||
component: 'Componente',
|
||
components: 'Componentes',
|
||
constructor: 'Constructor',
|
||
controllers: 'Controladores',
|
||
controller: 'Controlador',
|
||
'coverage-page-title': 'Cobertura de la documentación',
|
||
declarations: 'Declaraciones',
|
||
decorators: 'Decoradores',
|
||
'default-value': 'Valor por defecto',
|
||
'defined-in': 'Definido en',
|
||
dependencies: 'Dependencias',
|
||
deprecated: 'Obsoleta',
|
||
description: 'Descripción',
|
||
directive: 'Directiva',
|
||
directives: 'Directivas',
|
||
'dom tree': 'DOM arbol',
|
||
entities: 'Entidades',
|
||
entity: 'Entidad',
|
||
entrycomponents: 'Componentes de entrada',
|
||
enumerations: 'Enumeraciones',
|
||
enums: 'Enums',
|
||
example: 'Ejemplo',
|
||
examples: 'Ejemplos',
|
||
exports: 'Exporta',
|
||
extends: 'Extiende',
|
||
file: 'Fichero',
|
||
functions: 'Funciones',
|
||
'generated-using': 'Documentación generada utilizando',
|
||
'getting-started': 'Comenzando',
|
||
guard: 'Guardia',
|
||
guards: 'Guardias',
|
||
hostbindings: 'Fijaciones de Host',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'Escuchadores de Host',
|
||
'html-element': 'Elemento Html',
|
||
'html-element-with-directive': 'Elemento Html con directiva',
|
||
identifier: 'Identificador',
|
||
implements: 'Implementa',
|
||
imports: 'Importa',
|
||
index: 'Índice',
|
||
indexable: 'Indexable',
|
||
info: 'Información',
|
||
'inherited-from': 'Heredado desde',
|
||
injectable: 'Inyectable',
|
||
injectables: 'Inyectables',
|
||
inputs: 'Entradas',
|
||
interceptors: 'Interceptores',
|
||
interface: 'Interfaz',
|
||
interfaces: 'Interfaces',
|
||
legend: 'Leyenda',
|
||
license: 'Licencia',
|
||
lines: 'Líneas',
|
||
metadata: 'Meta datos',
|
||
methods: 'Métodos',
|
||
miscellaneous: 'Miscelánea',
|
||
module: 'Módulo',
|
||
modules: 'Módulos',
|
||
name: 'Nombre',
|
||
no: 'No',
|
||
'no-graph': 'No hay gráfica disponible.',
|
||
'no-iframe': 'Tu navegador no soporta iframes.',
|
||
'no-result-matching': 'No hay resultados que coincidan',
|
||
'no-svg': 'Tu navegador no soporta SVG',
|
||
optional: 'Opcional',
|
||
outputs: 'Salidas',
|
||
overview: 'Descripción general',
|
||
parameters: 'Parámetros',
|
||
'peer-dependencies': 'Dependencias entre pares',
|
||
pipe: 'Tubería',
|
||
pipes: 'Tuberías',
|
||
prefix: 'Prefijo',
|
||
properties: 'Propiedades',
|
||
providers: 'Proveedores',
|
||
pure: 'Puro',
|
||
readme: 'Léeme',
|
||
required: 'Requerido',
|
||
reset: 'Restablecer',
|
||
'results-matching': 'comparación de resultados',
|
||
returns: 'Devuelve',
|
||
route: 'Ruta',
|
||
routes: 'Rutas',
|
||
schemas: 'Esquemas',
|
||
'search-placeholder': 'Escribe para buscar',
|
||
selector: 'Selector',
|
||
signature: 'Firma',
|
||
source: 'Fuente',
|
||
standalone: 'Standalone',
|
||
statements: 'Declaraciones',
|
||
styles: 'Estilos',
|
||
template: 'Plantilla',
|
||
type: 'Tipo',
|
||
'type-aliases': 'Alias de tipo',
|
||
'type-parameters': 'Parámetros de tipo',
|
||
types: 'Tipos',
|
||
'unamed-property': 'Propiedad sin nombre',
|
||
'unit-test-coverage': 'Cobertura de las pruebas unitarias',
|
||
value: 'Valor',
|
||
variables: 'Variables',
|
||
yes: 'Si',
|
||
zoomin: 'Ampliar',
|
||
zoomout: 'Alejar'
|
||
};
|
||
|
||
var TRANSLATION_FR_FR = {
|
||
accessors: 'Accesseurs',
|
||
arguments: 'Arguments',
|
||
bootstrap: 'Bootstrap',
|
||
branches: 'Branches',
|
||
browse: 'Parcourir',
|
||
classe: 'Class',
|
||
classes: 'Classes',
|
||
component: 'Composant',
|
||
components: 'Composants',
|
||
constructor: 'Constructeur',
|
||
controllers: 'Contrôleurs',
|
||
controller: 'Contrôleur',
|
||
'coverage-page-title': 'Couverture de documentation',
|
||
declarations: 'Déclarations',
|
||
decorators: 'Décorateurs',
|
||
'default-value': 'Valeur par défaut',
|
||
'defined-in': 'Défini dans',
|
||
dependencies: 'Dépendances',
|
||
deprecated: 'Obsolète',
|
||
description: 'Description',
|
||
directive: 'Directive',
|
||
directives: 'Directives',
|
||
'dom tree': 'Arbre DOM',
|
||
entities: 'Entités',
|
||
entity: 'Entité',
|
||
entrycomponents: "Composants d'entrée",
|
||
enumerations: 'Enumérations',
|
||
enums: 'Enumérations',
|
||
example: 'Example',
|
||
examples: 'Examples',
|
||
exports: 'Exports',
|
||
extends: 'Etend',
|
||
file: 'Fichier',
|
||
functions: 'Fonctions',
|
||
'generated-using': 'Documentation générée avec',
|
||
'getting-started': 'Démarrage',
|
||
guard: 'Garde',
|
||
guards: 'Gardes',
|
||
hostbindings: 'HostBindings',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListeners',
|
||
'html-element': 'Elément Html',
|
||
'html-element-with-directive': 'Elément Html avec une directive',
|
||
identifier: 'Identifiant',
|
||
implements: 'Implémente',
|
||
imports: 'Imports',
|
||
index: 'Index',
|
||
indexable: 'Indexable',
|
||
info: 'Information',
|
||
'inherited-from': 'Hérité de',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: 'Entrées',
|
||
interceptors: 'Intercepteurs',
|
||
interface: 'Interface',
|
||
interfaces: 'Interfaces',
|
||
legend: 'Légende',
|
||
license: 'License',
|
||
lines: 'Lignes',
|
||
metadata: 'Métadonnées',
|
||
methods: 'Méthodes',
|
||
miscellaneous: 'Divers',
|
||
module: 'Module',
|
||
modules: 'Modules',
|
||
name: 'Nom',
|
||
no: 'Non',
|
||
'no-graph': 'Aucun graphique disponible.',
|
||
'no-iframe': 'Votre navigateur ne supporte pas les iframes.',
|
||
'no-result-matching': 'Aucun résultat matchant',
|
||
'no-svg': 'Votre navigateur ne supporte pas le SVG',
|
||
optional: 'Optionnel',
|
||
outputs: 'Sorties',
|
||
overview: "Vue d'ensemble",
|
||
parameters: 'Paramètres',
|
||
'peer-dependencies': 'Dépendances de pair',
|
||
pipe: 'Pipe',
|
||
pipes: 'Pipes',
|
||
prefix: 'Préfixe',
|
||
properties: 'Propriétés',
|
||
providers: 'Providers',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: 'Requis',
|
||
reset: 'Remise à zéro',
|
||
'results-matching': 'résultats matchant',
|
||
returns: 'Renvoie',
|
||
route: 'Route',
|
||
routes: 'Routes',
|
||
schemas: 'Schémas',
|
||
'search-placeholder': 'Saisissez un texte',
|
||
selector: 'Sélecteur',
|
||
signature: 'Signature',
|
||
source: 'Source',
|
||
standalone: 'Standalone',
|
||
statements: 'Déclarations',
|
||
styles: 'Styles',
|
||
template: 'Template',
|
||
'table-of-contents': 'Table des matières',
|
||
type: 'Type',
|
||
'type-aliases': 'Alias de type',
|
||
'type-parameters': 'Paramètres de type',
|
||
types: 'Types',
|
||
'unamed-property': 'Propriété non nommée',
|
||
'unit-test-coverage': 'Couverture de test unitaire',
|
||
value: 'Valeur',
|
||
variables: 'Variables',
|
||
yes: 'Oui',
|
||
zoomin: 'Zoom avant',
|
||
zoomout: 'Zoom arrière'
|
||
};
|
||
|
||
var TRANSLATION_HU_HU = {
|
||
accessors: 'Getter/setter metódusok',
|
||
arguments: 'Argumentumok',
|
||
bootstrap: 'Betöltés',
|
||
branches: 'Branchek',
|
||
browse: 'Böngészés',
|
||
classe: 'Osztály',
|
||
classes: 'Osztályok',
|
||
component: 'Komponens',
|
||
components: 'Komponensek',
|
||
constructor: 'Konstruktor',
|
||
controllers: 'Kontrollerek',
|
||
controller: 'Kontroller',
|
||
'coverage-page-title': 'Dokumentáció lefedettség',
|
||
declarations: 'Deklarációk',
|
||
decorators: 'Dekorátorok',
|
||
'default-value': 'Alapértelmezett érték',
|
||
'defined-in': 'Definíció helye:',
|
||
dependencies: 'Függőségek',
|
||
deprecated: 'Elavult',
|
||
description: 'Leírás',
|
||
directive: 'Direktíva',
|
||
directives: 'Direktívák',
|
||
'dom tree': 'DOM fa',
|
||
entities: 'Entitások',
|
||
entity: 'Entitás',
|
||
entrycomponents: 'Entry komponensek',
|
||
enumerations: 'Enumerációk',
|
||
enums: 'Enumok',
|
||
example: 'Példa',
|
||
examples: 'Példák',
|
||
exports: 'Exportok',
|
||
extends: 'Ősosztály',
|
||
file: 'File',
|
||
functions: 'Függvények',
|
||
'generated-using': 'A dokumentációt generálta:',
|
||
'getting-started': 'Bevezető',
|
||
guard: 'Guard',
|
||
guards: 'Guardok',
|
||
hostbindings: 'HostBindingok',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListenerek',
|
||
'html-element': 'Html elem',
|
||
'html-element-with-directive': 'Html elem direktívával',
|
||
identifier: 'Azonosító',
|
||
implements: 'Implementált interfészek',
|
||
imports: 'Importok',
|
||
index: 'Tartalomjegyzék',
|
||
indexable: 'Indexelhető',
|
||
info: 'Információ',
|
||
'inherited-from': 'Örökölve innen:',
|
||
injectable: 'Injektálható',
|
||
injectables: 'Injektálhatók',
|
||
inputs: 'Bemenetek',
|
||
interceptors: 'Interceptorok',
|
||
interface: 'Interfész',
|
||
interfaces: 'Interfészek',
|
||
legend: 'Jelmagyarázat',
|
||
license: 'Licenc',
|
||
lines: 'Sorok',
|
||
metadata: 'Metaadatok',
|
||
methods: 'Metódusok',
|
||
miscellaneous: 'Egyéb',
|
||
module: 'Modul',
|
||
modules: 'Modulok',
|
||
name: 'Név',
|
||
no: 'Nem',
|
||
'no-graph': 'Grafikon nem elérhető.',
|
||
'no-iframe': 'A böngészője nem támogatja az iframe-eket.',
|
||
'no-result-matching': 'Nincs találat',
|
||
'no-svg': 'A böngészője nem támogatja az SVG formátumot.',
|
||
optional: 'Opcionális',
|
||
outputs: 'Kimenetek',
|
||
overview: 'Áttekintés',
|
||
parameters: 'Paraméterek',
|
||
'peer-dependencies': 'Peer függőségek',
|
||
pipe: 'Pipe',
|
||
pipes: 'Pipe-ok',
|
||
prefix: 'Előtag',
|
||
properties: 'Tagváltozók',
|
||
providers: 'Providerek',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: 'Kívánt',
|
||
reset: 'Visszaállít',
|
||
'results-matching': 'találat',
|
||
returns: 'Visszatérési érték',
|
||
route: 'Útvonal',
|
||
routes: 'Útvonalak',
|
||
schemas: 'Sémák',
|
||
'search-placeholder': 'Keresendő kifejezés',
|
||
selector: 'Szelektor',
|
||
signature: 'Aláírás',
|
||
source: 'Forrás',
|
||
standalone: 'Standalone',
|
||
statements: 'Utasítások',
|
||
styles: 'Stílusok',
|
||
template: 'Sablon',
|
||
type: 'Típus',
|
||
'type-aliases': 'Típus álnév',
|
||
'type-parameters': 'Típus paraméterek',
|
||
types: 'Típusok',
|
||
'unamed-property': 'Névtelen property',
|
||
'unit-test-coverage': 'Unit teszt lefedettség',
|
||
value: 'Érték',
|
||
variables: 'Változók',
|
||
yes: 'Igen',
|
||
zoomin: 'Nagyítás',
|
||
zoomout: 'Kicsinyítés'
|
||
};
|
||
|
||
var TRANSLATION_IT_IT = {
|
||
accessors: 'Accessori',
|
||
arguments: 'Argomenti',
|
||
bootstrap: 'Bootstrap',
|
||
branches: 'Rami',
|
||
browse: 'Cerca',
|
||
classe: 'Classe',
|
||
classes: 'Classi',
|
||
component: 'Componente',
|
||
components: 'Componenti',
|
||
constructor: 'Costruttore',
|
||
controllers: 'Controllers',
|
||
controller: 'Controller',
|
||
'coverage-page-title': 'Copertura codice',
|
||
declarations: 'Dichiarazioni',
|
||
decorators: 'Decorators',
|
||
'default-value': 'Valore predefinito',
|
||
'defined-in': 'Definito in',
|
||
dependencies: 'Dependencies',
|
||
deprecated: 'Deprecata',
|
||
description: 'Descrizione',
|
||
directive: 'Direttiva',
|
||
directives: 'Direttive',
|
||
'dom tree': 'Albero DOM',
|
||
entities: 'Entità',
|
||
entity: 'Entità',
|
||
entrycomponents: 'EntryComponents',
|
||
enumerations: 'Enumerations',
|
||
enums: 'Enums',
|
||
example: 'Esempio',
|
||
examples: 'Esempi',
|
||
exports: 'Exports',
|
||
extends: 'Extends',
|
||
file: 'File',
|
||
functions: 'Funzioni',
|
||
'generated-using': 'Documentazione generata usando',
|
||
'getting-started': 'Iniziamo',
|
||
guard: 'Guardia',
|
||
guards: 'Guardie',
|
||
hostbindings: 'HostBindings',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListeners',
|
||
'html-element': 'Elemento Html',
|
||
'html-element-with-directive': 'Elemento html con direttive',
|
||
identifier: 'Identificatore',
|
||
implements: 'Implementa',
|
||
imports: 'Importa',
|
||
index: 'Indice',
|
||
indexable: 'Indicizzabile',
|
||
info: 'Informazione',
|
||
'inherited-from': 'ereditato da',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: 'Input',
|
||
interceptors: 'Interceptors',
|
||
interface: 'Interfaccia',
|
||
interfaces: 'Interfacce',
|
||
legend: 'Legenda',
|
||
license: 'Licenza',
|
||
lines: 'Linee',
|
||
metadata: 'Metadati',
|
||
methods: 'Metodi',
|
||
miscellaneous: 'Varie',
|
||
module: 'Modulo',
|
||
modules: 'Moduli',
|
||
name: 'Nome',
|
||
no: 'No',
|
||
'no-graph': 'Grafico non disponibile.',
|
||
'no-iframe': 'Il tuo browser non supporta iframe.',
|
||
'no-result-matching': 'Nessun risultato corrispondente',
|
||
'no-svg': 'Il tuo browser non supporta SVG',
|
||
optional: 'Opzionale',
|
||
outputs: 'Output',
|
||
overview: 'Sommario',
|
||
parameters: 'Parametri',
|
||
'peer-dependencies': 'Peer dependencies',
|
||
pipe: 'Pipe',
|
||
pipes: 'Pipes',
|
||
prefix: 'Prefisso',
|
||
properties: 'Proprietà',
|
||
providers: 'Providers',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: 'Necessario',
|
||
reset: 'Reset',
|
||
'results-matching': 'corrispondenza',
|
||
returns: 'Returns',
|
||
route: 'Route',
|
||
routes: 'Routes',
|
||
schemas: 'Schemas',
|
||
'search-placeholder': 'Digita per avviare la ricerca',
|
||
selector: 'Selector',
|
||
signature: 'Signature',
|
||
source: 'Fonte',
|
||
standalone: 'Standalone',
|
||
statements: 'Statements',
|
||
styles: 'Stili',
|
||
template: 'Modello',
|
||
type: 'Tipo',
|
||
'type-aliases': 'Type aliases',
|
||
'type-parameters': 'Type parameters',
|
||
types: 'Tipi',
|
||
'unamed-property': 'Proprietà senza nome',
|
||
'unit-test-coverage': 'Copertura unit test',
|
||
value: 'Valori',
|
||
variables: 'Variabili',
|
||
yes: 'Si',
|
||
zoomin: 'Ingrandisci',
|
||
zoomout: 'Rimpocciolisci'
|
||
};
|
||
|
||
var TRANSLATION_JA_JP = {
|
||
accessors: 'アクセサ',
|
||
arguments: '引数',
|
||
bootstrap: 'ブートストラップ',
|
||
branches: 'ブランチ',
|
||
browse: 'ブラウズ',
|
||
classe: 'クラス',
|
||
classes: 'クラス',
|
||
component: 'コンポーネント',
|
||
components: 'コンポーネント',
|
||
constructor: 'コンストラクタ',
|
||
controllers: 'コントローラー',
|
||
controller: 'コントローラー',
|
||
'coverage-page-title': 'カバレッジ',
|
||
declarations: '宣言',
|
||
decorators: 'デコレーター',
|
||
'default-value': '初期値',
|
||
'defined-in': 'Defined in',
|
||
dependencies: '依存関係',
|
||
deprecated: '非推奨',
|
||
description: '説明',
|
||
directive: 'ディレクティブ',
|
||
directives: 'ディレクティブ',
|
||
'dom tree': 'DOM ツリー',
|
||
entities: 'エンティティ',
|
||
entity: '実在物',
|
||
entrycomponents: 'エントリーコンポーネント',
|
||
enumerations: '列挙型',
|
||
enums: 'Enums',
|
||
example: '例',
|
||
examples: '例',
|
||
exports: 'エクスポート',
|
||
extends: '継承',
|
||
file: 'ファイル',
|
||
functions: '関数',
|
||
'generated-using': 'このドキュメントは以下を使用して生成されています',
|
||
'getting-started': 'はじめに',
|
||
guard: 'ガード',
|
||
guards: 'ガード',
|
||
hostbindings: 'ホストバインディング',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'ホストリスナー',
|
||
'html-element': 'Html要素',
|
||
'html-element-with-directive': 'ディレクティブHtml要素',
|
||
identifier: '識別子',
|
||
implements: '実装',
|
||
imports: 'インポート',
|
||
index: '索引',
|
||
indexable: 'インデクサブル',
|
||
info: '情報',
|
||
'inherited-from': 'Inherited from',
|
||
injectable: 'インジェクタブル',
|
||
injectables: 'インジェクタブル',
|
||
inputs: '入力',
|
||
interceptors: 'インターセプター',
|
||
interface: 'インターフェイス',
|
||
interfaces: 'インターフェイス',
|
||
legend: '凡例',
|
||
license: 'ライセンス',
|
||
lines: '行数',
|
||
metadata: 'メタデータ',
|
||
methods: 'メソッド',
|
||
miscellaneous: 'その他',
|
||
module: 'モジュール',
|
||
modules: 'モジュール',
|
||
name: '名前',
|
||
no: 'いいえ',
|
||
'no-graph': '使用できるグラフがありません',
|
||
'no-iframe': 'ブラウザがiframeを対応していません',
|
||
'no-result-matching': '見つかりませんでした',
|
||
'no-svg': 'ブラウザがSVGに対応してません',
|
||
optional: 'オプション',
|
||
outputs: '出力',
|
||
overview: '概要',
|
||
parameters: 'パラメータ',
|
||
'peer-dependencies': 'Peer dependencies',
|
||
pipe: 'パイプ',
|
||
pipes: 'パイプ',
|
||
prefix: '接頭辞',
|
||
properties: 'プロパティ',
|
||
providers: 'プロバイダー',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: '必要',
|
||
reset: 'リセット',
|
||
'results-matching': '件の結果が一致しました',
|
||
returns: '戻り値',
|
||
route: 'ルート',
|
||
routes: 'ルート',
|
||
schemas: 'スキーマ',
|
||
'search-placeholder': '入力して検索',
|
||
selector: 'セレクタ',
|
||
signature: 'シグネチャ',
|
||
source: 'ソース',
|
||
standalone: 'Standalone',
|
||
statements: '文',
|
||
styles: 'スタイル',
|
||
template: 'テンプレート',
|
||
type: '型',
|
||
'type-aliases': 'タイプエイリアス',
|
||
'type-parameters': '型パラメーター',
|
||
types: '型',
|
||
'unamed-property': '匿名プロパティ',
|
||
'unit-test-coverage': 'ユニットテストカバレッジ',
|
||
value: '値',
|
||
variables: '変数',
|
||
yes: 'はい',
|
||
zoomin: '拡大',
|
||
zoomout: '縮小'
|
||
};
|
||
|
||
var TRANSLATION_KA_GE = {
|
||
accessors: 'აქსესორი',
|
||
arguments: 'არგუმენტები',
|
||
bootstrap: 'ჩამტვირთავი',
|
||
branches: 'ტოტები',
|
||
browse: 'დაათვალიერე',
|
||
classe: 'კლასი',
|
||
classes: 'კლასები',
|
||
component: 'კომპონენტი',
|
||
components: 'კომპონენტები',
|
||
constructor: 'კონსტრუქტორი',
|
||
controllers: 'კონტროლერები',
|
||
controller: 'კონტროლერი',
|
||
'coverage-page-title': 'დოკუმენტაციის გაშუქება',
|
||
declarations: 'დეკლარაციები',
|
||
decorators: 'დეკორატორები',
|
||
'default-value': 'ნაგულისხმევი მნიშვნელობა',
|
||
'defined-in': 'აღწერილია',
|
||
dependencies: 'დამოკიდებულებები',
|
||
deprecated: 'მოძველებულია',
|
||
description: 'აღწერა',
|
||
directive: 'დირექტივა',
|
||
directives: 'დირექტივები',
|
||
'dom tree': 'DOM ხე',
|
||
entities: 'სუბიექტები',
|
||
entity: 'სუბიექტი',
|
||
entrycomponents: 'შესვლის კომპონენტები',
|
||
enumerations: 'ჩამოთვლები',
|
||
enums: 'ენამები',
|
||
example: 'მაგალითი',
|
||
examples: 'მაგალითები',
|
||
exports: 'ექსპორტი',
|
||
extends: 'აგრძელებს',
|
||
file: 'ფაილი',
|
||
functions: 'ფუნქციები',
|
||
'generated-using': 'დოკუმენტაცია დაგენერირდა გამოყენებით',
|
||
'getting-started': 'ვიწყებთ',
|
||
guard: 'მცველი',
|
||
guards: 'მცველები',
|
||
hostbindings: 'ჰოსტის დამაკავშირებლები',
|
||
hostdirectives: 'ჰოსტის დირექტივები',
|
||
hostlisteners: 'ჰოსტის მსმენელები',
|
||
'html-element': 'Html ელემენტი',
|
||
'html-element-with-directive': 'Html ელემენტი დირექტივით',
|
||
identifier: 'იდენტიფიკატორი',
|
||
implements: 'ახორციელებს',
|
||
imports: 'იმპორტი',
|
||
index: 'ინდექსი',
|
||
indexable: 'ინდექსირებადი',
|
||
info: 'ინფორმაცია',
|
||
'inherited-from': 'მემკვიდრეობით მიიღო',
|
||
injectable: 'ინექცია',
|
||
injectables: 'საინექციო საშუალებები',
|
||
inputs: 'შეყვანები',
|
||
interceptors: 'ჩამჭრელები',
|
||
interface: 'ინტერფეისი',
|
||
interfaces: 'ინტერფეისები',
|
||
legend: 'ლეგენდა',
|
||
license: 'ლიცენზია',
|
||
lines: 'ხაზები',
|
||
metadata: 'მეტამონაცემები',
|
||
methods: 'მეთოდები',
|
||
miscellaneous: 'სხვადასხვა',
|
||
module: 'მოდული',
|
||
modules: 'მოდულები',
|
||
name: 'სახელები',
|
||
no: 'არა',
|
||
'no-graph': 'გრაფი არ არის ხელმისაწვდომი.',
|
||
'no-iframe': 'თქვენს ბრაუზერს არ აქვს iframes-ის მხარდაჭერა.',
|
||
'no-result-matching': 'არ არის შესაბამისი შედეგები',
|
||
'no-svg': 'თქვენს ბრაუზერს არ აქვს SVG მხარდაჭერა',
|
||
optional: 'სურვილისამებრ',
|
||
outputs: 'შედეგები',
|
||
overview: 'მიმოხილვა',
|
||
parameters: 'პარამეტრები',
|
||
'peer-dependencies': 'თანატოლებთან დამოკიდებულებები',
|
||
pipe: 'მილი',
|
||
pipes: 'მილები',
|
||
prefix: 'პრეფიქსი',
|
||
properties: 'თვისება',
|
||
providers: 'პროვაიდერი',
|
||
pure: 'წმინდა',
|
||
readme: 'README',
|
||
required: 'აუცილებელი',
|
||
reset: 'გადატვირთვა',
|
||
'results-matching': 'შედეგები ემთხვევა',
|
||
returns: 'ბრუნდება',
|
||
route: 'მარშრუტი',
|
||
routes: 'მარშრუტები',
|
||
schemas: 'სქემები',
|
||
'search-placeholder': 'დაწერე მოსაძებნად',
|
||
selector: 'სელექტორი',
|
||
signature: 'ხელმოწერა',
|
||
source: 'წყარო',
|
||
standalone: 'დამოუკიდებელი',
|
||
statements: 'განცხადებები',
|
||
styles: 'სტილები',
|
||
template: 'შაბლონი',
|
||
type: 'ტიპი',
|
||
'type-aliases': 'მეტსახელის ტიპი',
|
||
'type-parameters': 'პარამეტრების ტიპი',
|
||
types: 'ტიპები',
|
||
'unamed-property': 'უსახელო თვისება',
|
||
'unit-test-coverage': 'ერთეული ტესტის გაშუქება',
|
||
value: 'მნიშვნელობა',
|
||
variables: 'ცვლადები',
|
||
yes: 'კი',
|
||
zoomin: 'მიახლოვება',
|
||
zoomout: 'მასშტაბირება'
|
||
};
|
||
|
||
var TRANSLATION_KO_KR = {
|
||
accessors: '접근자',
|
||
arguments: '인수',
|
||
bootstrap: 'Bootstrap',
|
||
branches: '브랜치',
|
||
browse: '탐색',
|
||
classe: '클래스',
|
||
classes: '클래스',
|
||
component: '컴포넌트',
|
||
components: '컴포넌트',
|
||
constructor: '생성자',
|
||
controllers: '컨트롤러',
|
||
controller: '컨트롤러',
|
||
'coverage-page-title': '문서 커버리지',
|
||
declarations: '선언',
|
||
decorators: '데코레이터',
|
||
'default-value': '기본 값',
|
||
'defined-in': '다음에 정의됨',
|
||
dependencies: '의존성',
|
||
deprecated: '비추천',
|
||
description: '설명',
|
||
directive: 'Directive',
|
||
directives: 'Directives',
|
||
'dom tree': '돔 트리',
|
||
entities: '엔티티',
|
||
entity: '실재',
|
||
entrycomponents: 'EntryComponents',
|
||
enumerations: '열거',
|
||
enums: 'Enums',
|
||
example: '예시',
|
||
examples: '예',
|
||
exports: '내보내기',
|
||
extends: 'Extends',
|
||
file: '파일',
|
||
functions: '함수',
|
||
'generated-using': '이 문서는 다음을 이용하여 생성되었습니다',
|
||
'getting-started': '시작하기',
|
||
guard: '가드',
|
||
guards: '가드',
|
||
hostbindings: 'HostBindings',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListeners',
|
||
'html-element': 'HTML 요소',
|
||
'html-element-with-directive': '지시어가 있는 HTML 요소',
|
||
identifier: '식별자',
|
||
implements: '구현',
|
||
imports: '가져오기',
|
||
index: '색인',
|
||
indexable: 'Indexable',
|
||
info: '정보',
|
||
'inherited-from': '다음에서 상속됨',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: '입력',
|
||
interceptors: 'Interceptors',
|
||
interface: '인터페이스',
|
||
interfaces: '인터페이스',
|
||
legend: '범례',
|
||
license: '라이선스',
|
||
lines: '줄',
|
||
metadata: '메타데이터',
|
||
methods: '메소드',
|
||
miscellaneous: '기타',
|
||
module: '모듈',
|
||
modules: '모듈',
|
||
name: '이름',
|
||
no: '아니오',
|
||
'no-graph': '사용할 수 있는 그래프가 없습니다.',
|
||
'no-iframe': '사용중인 브라우저가 iframe을 지원하지 않습니다',
|
||
'no-result-matching': '검색 결과가 없습니다',
|
||
'no-svg': '브라우저가 SVG를 지원하지 않습니다',
|
||
optional: '선택적',
|
||
outputs: '결과물',
|
||
overview: '개요',
|
||
parameters: '매개변수',
|
||
'peer-dependencies': '상호 의존성',
|
||
pipe: '파이프',
|
||
pipes: '파이프',
|
||
prefix: '접두어',
|
||
properties: '속성',
|
||
providers: '제공자',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: '필수의',
|
||
reset: '초기화',
|
||
'results-matching': '개의 결과가 일치했습니다',
|
||
returns: '반환',
|
||
route: 'Route',
|
||
routes: 'Routes',
|
||
schemas: '스키마',
|
||
'search-placeholder': '검색어 입력',
|
||
selector: '선택자',
|
||
signature: 'Signature',
|
||
source: '출처',
|
||
standalone: 'Standalone',
|
||
statements: 'Statements',
|
||
styles: '스타일',
|
||
template: '주형',
|
||
type: '타입',
|
||
'type-aliases': '타입 별칭',
|
||
'type-parameters': '타입 매개 변수',
|
||
types: '타입',
|
||
'unamed-property': '익명 속성',
|
||
'unit-test-coverage': '단위 테스트 커버리지',
|
||
value: '값',
|
||
variables: '변수',
|
||
yes: '네',
|
||
zoomin: '확대',
|
||
zoomout: '축소'
|
||
};
|
||
|
||
var TRANSLATION_NL_NL = {
|
||
accessors: 'Accessors',
|
||
arguments: 'Argumenten',
|
||
bootstrap: 'Bootstrap',
|
||
branches: 'Branches',
|
||
browse: 'Browse',
|
||
classe: 'Klasse',
|
||
classes: 'Klassen',
|
||
component: 'Component',
|
||
components: 'Componenten',
|
||
constructor: 'Constructor',
|
||
controllers: 'Controllers',
|
||
controller: 'Controller',
|
||
'coverage-page-title': 'Documentatie coverage',
|
||
declarations: 'Declaraties',
|
||
decorators: 'Decorators',
|
||
'default-value': 'Default waarde',
|
||
'defined-in': 'Gedefinieerd in',
|
||
dependencies: 'Dependencies',
|
||
deprecated: 'Verouderd',
|
||
description: 'Omschrijving',
|
||
directive: 'Directive',
|
||
directives: 'Directives',
|
||
'dom tree': 'DOM boom',
|
||
entities: 'Entiteiten',
|
||
entity: 'Entiteit',
|
||
entrycomponents: 'EntryComponents',
|
||
enumerations: 'Enumerations',
|
||
enums: 'Enums',
|
||
example: 'Voorbeeld',
|
||
examples: 'Voorbeelden',
|
||
exports: 'Exports',
|
||
extends: 'Extends',
|
||
file: 'Bestand',
|
||
functions: 'Functies',
|
||
'generated-using': 'Documentatie gegenereed met',
|
||
'getting-started': 'Aan de slag',
|
||
guard: 'Guard',
|
||
guards: 'Guards',
|
||
hostbindings: 'HostBindings',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListeners',
|
||
'html-element': 'Html element',
|
||
'html-element-with-directive': 'Html element met directive',
|
||
identifier: 'Identifier',
|
||
implements: 'Implementeert',
|
||
imports: 'Imports',
|
||
index: 'Index',
|
||
indexable: 'Indexeerbaar',
|
||
info: 'Informatie',
|
||
'inherited-from': 'Inherited van',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: 'Inputs',
|
||
interceptors: 'Interceptors',
|
||
interface: 'Interface',
|
||
interfaces: 'Interfaces',
|
||
legend: 'Legenda',
|
||
license: 'Licentie',
|
||
lines: 'Regels',
|
||
metadata: 'Metadata',
|
||
methods: 'Methods',
|
||
miscellaneous: 'Diversen',
|
||
module: 'Module',
|
||
modules: 'Modules',
|
||
name: 'Naam',
|
||
no: 'Nee',
|
||
'no-graph': 'Geen diagram beschikbaar.',
|
||
'no-iframe': 'Uw browser ondersteund geen iframes.',
|
||
'no-result-matching': 'Geen overeenkomende resultaten',
|
||
'no-svg': 'Uw browser ondersteund geen SVG',
|
||
optional: 'Optioneel',
|
||
outputs: 'Outputs',
|
||
overview: 'Overzicht',
|
||
parameters: 'Parameters',
|
||
'peer-dependencies': 'Peer dependencies',
|
||
pipe: 'Pipe',
|
||
pipes: 'Pipes',
|
||
prefix: 'Voorvoegsel',
|
||
properties: 'Properties',
|
||
providers: 'Providers',
|
||
pure: 'Puur',
|
||
readme: 'README',
|
||
required: 'Vereist',
|
||
reset: 'Reset',
|
||
'results-matching': 'overeenkomende resultaten',
|
||
returns: 'Returns',
|
||
route: 'Route',
|
||
routes: 'Routes',
|
||
schemas: "Schema's",
|
||
'search-placeholder': 'Type om te zoeken',
|
||
selector: 'Selector',
|
||
signature: 'Handtekening',
|
||
source: 'Bron',
|
||
standalone: 'Standalone',
|
||
statements: 'Statements',
|
||
styles: 'Stijlen',
|
||
template: 'Sjabloon',
|
||
type: 'Type',
|
||
'type-aliases': 'Type aliassen',
|
||
'type-parameters': 'Type parameters',
|
||
types: 'Types',
|
||
'unamed-property': 'Naamloze property',
|
||
'unit-test-coverage': 'Unit test coverage',
|
||
value: 'Waarde',
|
||
variables: 'Variabelen',
|
||
yes: 'Ja',
|
||
zoomin: 'Zoom in',
|
||
zoomout: 'Zoom uit'
|
||
};
|
||
|
||
var TRANSLATION_PL_PL = {
|
||
accessors: 'Akcesor',
|
||
arguments: 'Argumenty',
|
||
bootstrap: 'Uruchomienie',
|
||
branches: 'Gałęzie',
|
||
browse: 'Przeglądaj',
|
||
classe: 'Klasa',
|
||
classes: 'Klasy',
|
||
component: 'Komponent',
|
||
components: 'Komponenty',
|
||
constructor: 'Konstruktor',
|
||
controllers: 'Kontrolery',
|
||
controller: 'Kontroler',
|
||
'coverage-page-title': 'Pokrycie dokumentacją',
|
||
declarations: 'Deklaracje',
|
||
decorators: 'Dekoratory',
|
||
'default-value': 'Domyślna wartość',
|
||
'defined-in': 'Zdefiniowane w',
|
||
dependencies: 'Biblioteki',
|
||
deprecated: 'Przestarzałe',
|
||
description: 'Opis',
|
||
directive: 'Dyrektywa',
|
||
directives: 'Dyrektywy',
|
||
'dom tree': 'DOM drzewo',
|
||
entities: 'Podmioty',
|
||
entity: 'Podmiot',
|
||
entrycomponents: 'EntryComponents',
|
||
enumerations: 'Enumeracje',
|
||
enums: 'Enumy',
|
||
example: 'Przykład',
|
||
examples: 'Przykłady',
|
||
exports: 'Exporty',
|
||
extends: 'Rozszerza',
|
||
file: 'Plik',
|
||
functions: 'Funkcje',
|
||
'generated-using': 'Dokumentacja wygenerowana przy użyciu',
|
||
'getting-started': 'Start',
|
||
guard: 'Guard',
|
||
guards: "Guard'y",
|
||
hostbindings: 'HostBindingi',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListenery',
|
||
'html-element': 'Html element',
|
||
'html-element-with-directive': 'Html element z dyrektywą',
|
||
identifier: 'Identyfikator',
|
||
implements: 'Implementuje',
|
||
imports: 'Importuje',
|
||
index: 'Indeks',
|
||
indexable: 'Indeksowany',
|
||
info: 'Informatie',
|
||
'inherited-from': 'Dziedziczy z',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: 'Inputy',
|
||
interceptors: 'Interceptory',
|
||
interface: 'Interfejs',
|
||
interfaces: 'Interfejsy',
|
||
legend: 'Legenda',
|
||
license: 'Licencja',
|
||
lines: 'Linie',
|
||
metadata: 'Metadane',
|
||
methods: 'Metody',
|
||
miscellaneous: 'Różne',
|
||
module: 'Moduł',
|
||
modules: 'Moduły',
|
||
name: 'Nazwa',
|
||
no: 'Nie',
|
||
'no-graph': 'Graf niedostępny.',
|
||
'no-iframe': "Twoja przeglądarka nie wspiera iframe'ów.",
|
||
'no-result-matching': 'Brak pasujących wyników',
|
||
'no-svg': 'Twoja przeglądarka nie wspiera SVG',
|
||
optional: 'Opcjonalne',
|
||
outputs: 'Outputy',
|
||
overview: 'Przegląd',
|
||
parameters: 'Parametry',
|
||
'peer-dependencies': 'Biblioteki zależne',
|
||
pipe: 'Pipe',
|
||
pipes: "Pipe'y",
|
||
prefix: 'Prefiks',
|
||
properties: 'Włąściwości',
|
||
providers: 'Dostarczyciele',
|
||
pure: 'Czysty',
|
||
readme: 'README',
|
||
required: 'Wymagany',
|
||
reset: 'Reset',
|
||
'results-matching': 'pasujących wyników',
|
||
returns: 'Zwraca',
|
||
route: 'Route',
|
||
routes: "Route'y",
|
||
schemas: 'Schematy',
|
||
'search-placeholder': 'Wprowadź tekst wyszukiwania',
|
||
selector: 'Selektor',
|
||
signature: 'Podpis',
|
||
source: 'Source',
|
||
standalone: 'Standalone',
|
||
statements: 'Instrukcje',
|
||
styles: 'Estilos',
|
||
template: 'Modelo',
|
||
type: 'Typ',
|
||
'type-aliases': 'Aliasy typów',
|
||
'type-parameters': 'Parametry typów',
|
||
types: 'Typy',
|
||
'unamed-property': 'Nienazwana właśność',
|
||
'unit-test-coverage': 'Pokrycie testami jednostkowymi',
|
||
value: 'Wartość',
|
||
variables: 'Zmienne',
|
||
yes: 'Tak',
|
||
zoomin: 'Przybliż',
|
||
zoomout: 'Oddal'
|
||
};
|
||
|
||
var TRANSLATION_PT_BR = {
|
||
accessors: 'Acessores',
|
||
arguments: 'Argumentos',
|
||
bootstrap: 'Bootstrap',
|
||
branches: 'Branches',
|
||
browse: 'Navegar',
|
||
classe: 'Classe',
|
||
classes: 'Classes',
|
||
component: 'Componente',
|
||
components: 'Componentes',
|
||
constructor: 'Construtor',
|
||
controllers: 'Controladores',
|
||
controller: 'Controlador',
|
||
'coverage-page-title': 'Cobertura da documentação',
|
||
declarations: 'Declarações',
|
||
decorators: 'Decoradores',
|
||
'default-value': 'Valor padrão',
|
||
'defined-in': 'Definido em',
|
||
dependencies: 'Dependências',
|
||
deprecated: 'Descontinuada',
|
||
description: 'Descrição',
|
||
directive: 'Diretiva',
|
||
directives: 'Diretivas',
|
||
'dom tree': 'Arvore DOM',
|
||
entities: 'Entidades',
|
||
entity: 'Entidade',
|
||
entrycomponents: 'EntryComponents',
|
||
enumerations: 'Enumerações',
|
||
enums: 'Enums',
|
||
example: 'Exemplo',
|
||
examples: 'Exemplos',
|
||
exports: 'Exports',
|
||
extends: 'Extende',
|
||
file: 'Arquivo',
|
||
functions: 'Funções',
|
||
'generated-using': 'Documentação gerada usando',
|
||
'getting-started': 'Começando',
|
||
guard: 'Guarda',
|
||
guards: 'Guardas',
|
||
hostbindings: 'HostBindings',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListeners',
|
||
'html-element': 'Elemento HTML',
|
||
'html-element-with-directive': 'Elemento HTML com diretiva',
|
||
identifier: 'Identificador',
|
||
implements: 'Implementa',
|
||
imports: 'Imports',
|
||
index: 'Index',
|
||
indexable: 'Indexável',
|
||
info: 'Informação',
|
||
'inherited-from': 'Herdado de',
|
||
injectable: 'Injetável',
|
||
injectables: 'Injetáveis',
|
||
inputs: 'Inputs',
|
||
interceptors: 'Interceptors',
|
||
interface: 'Interface',
|
||
interfaces: 'Interfaces',
|
||
legend: 'Legend',
|
||
license: 'Licença',
|
||
lines: 'Linhas',
|
||
metadata: 'Metadata',
|
||
methods: 'Métodos',
|
||
miscellaneous: 'Miscelânea',
|
||
module: 'Módulo',
|
||
modules: 'Módulos',
|
||
name: 'Nome',
|
||
no: 'Não',
|
||
'no-graph': 'Sem gráfico disponível.',
|
||
'no-iframe': 'Seu browser não tem suporte a iframes.',
|
||
'no-result-matching': 'Nenhum resultado correspondente',
|
||
'no-svg': 'Seu browser não tem suporte a SVG',
|
||
optional: 'Opcional',
|
||
outputs: 'Outputs',
|
||
overview: 'Visão geral',
|
||
parameters: 'Parâmetros',
|
||
'peer-dependencies': 'Peer dependencies',
|
||
pipe: 'Pipe',
|
||
pipes: 'Pipes',
|
||
prefix: 'Prefixo',
|
||
properties: 'Propriedades',
|
||
providers: 'Providers',
|
||
pure: 'Puro',
|
||
readme: 'README',
|
||
required: 'Obrigatório',
|
||
reset: 'Resetar',
|
||
'results-matching': 'resultados correspondentes',
|
||
returns: 'Retorna',
|
||
route: 'Rota',
|
||
routes: 'Rotas',
|
||
schemas: 'Esquemas',
|
||
'search-placeholder': 'Digite para pesquisar',
|
||
selector: 'Seletor',
|
||
signature: 'Assinatura',
|
||
source: 'Fonte',
|
||
standalone: 'Standalone',
|
||
statements: 'Statements',
|
||
styles: 'Estilos',
|
||
template: 'Modelo',
|
||
type: 'Tipo',
|
||
'type-aliases': 'Aliases de tipo',
|
||
'type-parameters': 'Parâmetros de tipo',
|
||
types: 'Tipos',
|
||
'unamed-property': 'Propriedade não-nomeada',
|
||
'unit-test-coverage': 'Cobertura de teste unitário',
|
||
value: 'Valor',
|
||
variables: 'Variáveis',
|
||
yes: 'Sim',
|
||
zoomin: 'Zoom in',
|
||
zoomout: 'Zoom out'
|
||
};
|
||
|
||
var TRANSLATION_RU_RU = {
|
||
accessors: 'Аксессор',
|
||
arguments: 'Аргументы',
|
||
bootstrap: 'Загрузчик',
|
||
branches: 'Ветки',
|
||
browse: 'Обзор',
|
||
classe: 'Класс',
|
||
classes: 'Классы',
|
||
component: 'Компонент',
|
||
components: 'Компоненты',
|
||
constructor: 'Конструктор',
|
||
controllers: 'Контроллеры',
|
||
controller: 'Контроллер',
|
||
'coverage-page-title': 'Покрытие документацией',
|
||
declarations: 'Декларации',
|
||
decorators: 'Декораторы',
|
||
'default-value': 'Значение по умолчанию',
|
||
'defined-in': 'Определен в',
|
||
dependencies: 'Зависимости',
|
||
deprecated: 'Устаревшая',
|
||
description: 'Описание',
|
||
directive: 'Директива',
|
||
directives: 'Директивы',
|
||
'dom tree': 'DOM-дерево',
|
||
entities: 'Сущности',
|
||
entity: 'Сущность',
|
||
entrycomponents: 'Входные компоненты',
|
||
enumerations: 'Перечисления',
|
||
enums: 'Перечисления',
|
||
example: 'Пример',
|
||
examples: 'Примеры',
|
||
exports: 'Экспорт',
|
||
extends: 'Расширяет',
|
||
file: 'Файл',
|
||
functions: 'Функции',
|
||
'generated-using': 'Документация создана с помощью',
|
||
'getting-started': 'Начало работы',
|
||
guard: 'Защитник',
|
||
guards: 'Защитники',
|
||
hostbindings: 'Привязки хоста',
|
||
hostdirectives: 'Директивы хоста',
|
||
hostlisteners: 'Слушатели хоста',
|
||
'html-element': 'Html-элемент',
|
||
'html-element-with-directive': 'Html-элемент с директивой',
|
||
identifier: 'Идентификатор',
|
||
implements: 'Реализует',
|
||
imports: 'Импорт',
|
||
index: 'Индекс',
|
||
indexable: 'Индексируемый',
|
||
info: 'Информация',
|
||
'inherited-from': 'Наследуемый из',
|
||
injectable: 'Внедрение',
|
||
injectables: 'Внедрения',
|
||
inputs: 'Входные данные',
|
||
interceptors: 'Перехватчики',
|
||
interface: 'Интерфейс',
|
||
interfaces: 'Интерфейсы',
|
||
legend: 'Легенда',
|
||
license: 'Лицензия',
|
||
lines: 'Строки',
|
||
metadata: 'Метаданные',
|
||
methods: 'Методы',
|
||
miscellaneous: 'Разное',
|
||
module: 'Модуль',
|
||
modules: 'Модули',
|
||
name: 'Имя',
|
||
no: 'Нет',
|
||
'no-graph': 'Диаграмма недоступна.',
|
||
'no-iframe': 'Браузер не поддерживает iframes.',
|
||
'no-result-matching': 'Результаты не найдены',
|
||
'no-svg': 'Браузер не поддерживает SVG',
|
||
optional: 'Опциональный',
|
||
outputs: 'Выходные данные',
|
||
overview: 'Обзор',
|
||
parameters: 'Параметры',
|
||
'peer-dependencies': 'Одноранговые зависимости',
|
||
pipe: 'Конвейер',
|
||
pipes: 'Конвейеры',
|
||
prefix: 'Префикс',
|
||
properties: 'Свойства',
|
||
providers: 'Провайдеры',
|
||
pure: 'Чистый',
|
||
readme: 'README',
|
||
required: 'Требуемый',
|
||
reset: 'Сброс',
|
||
'results-matching': 'результатов найдено',
|
||
returns: 'Тип возвращаемого значения',
|
||
route: 'Маршрут',
|
||
routes: 'Маршруты',
|
||
schemas: 'Схемы',
|
||
'search-placeholder': 'Введите для поиска',
|
||
selector: 'Селектор',
|
||
signature: 'Сигнатура',
|
||
source: 'Источник',
|
||
standalone: 'Автономный',
|
||
statements: 'Утверждения',
|
||
styles: 'Стили',
|
||
template: 'Шаблон',
|
||
type: 'Тип',
|
||
'type-aliases': 'Псевдонимы типов',
|
||
'type-parameters': 'Типы параметров',
|
||
types: 'Типы',
|
||
'unamed-property': 'Безымянное свойство',
|
||
'unit-test-coverage': 'Покрытие модульными тестами',
|
||
value: 'Значение',
|
||
variables: 'Переменные',
|
||
yes: 'Да',
|
||
zoomin: 'Приблизить',
|
||
zoomout: 'Отдалить'
|
||
};
|
||
|
||
var TRANSLATION_SK_SK = {
|
||
accessors: 'Modifikátory prístupu',
|
||
arguments: 'Argumenty',
|
||
bootstrap: 'Bootstrap',
|
||
branches: 'Vetvy',
|
||
browse: 'Prezerať',
|
||
classe: 'Trieda',
|
||
classes: 'Triedy',
|
||
component: 'Komponent',
|
||
components: 'Komponenty',
|
||
constructor: 'Konštruktor',
|
||
controllers: 'Controllers',
|
||
controller: 'Controller',
|
||
'coverage-page-title': 'Pokrytie dokumentáciou',
|
||
declarations: 'Deklarácie',
|
||
decorators: 'Dekorátory',
|
||
'default-value': 'Predvolená hodnota',
|
||
'defined-in': 'Definované v',
|
||
dependencies: 'Závislosti',
|
||
deprecated: 'Zastarel',
|
||
description: 'Popis',
|
||
directive: 'Direktíva',
|
||
directives: 'Direktívy',
|
||
'dom tree': 'DOM strom',
|
||
entities: 'Subjektov',
|
||
entity: 'Subjekt',
|
||
entrycomponents: 'EntryComponents',
|
||
enumerations: 'Enumerátory',
|
||
enums: 'Enumerátory',
|
||
example: 'Príklad',
|
||
examples: 'Príklady',
|
||
exports: 'Exporty',
|
||
extends: 'Rozširuje',
|
||
file: 'Súbor',
|
||
functions: 'Funkcie',
|
||
'generated-using': 'Dokumentácia vytvorená pomocou',
|
||
'getting-started': 'Začíname',
|
||
guard: 'Guard',
|
||
guards: 'Guards',
|
||
hostbindings: 'HostBindings',
|
||
hostdirectives: 'HostDirectives',
|
||
hostlisteners: 'HostListeners',
|
||
'html-element': 'HTML element',
|
||
'html-element-with-directive': 'HTML element s direktívou',
|
||
identifier: 'Identifikátor',
|
||
implements: 'Implementuje',
|
||
imports: 'Importuje',
|
||
index: 'Index',
|
||
indexable: 'Indexovateľný',
|
||
info: 'Informácie',
|
||
'inherited-from': 'Zdedené od',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: 'Vstupy',
|
||
interceptors: 'Interceptors',
|
||
interface: 'Rozhranie',
|
||
interfaces: 'Rozhrania',
|
||
legend: 'Legenda',
|
||
license: 'Licencia',
|
||
lines: 'Riadky',
|
||
metadata: 'Metadáta',
|
||
methods: 'Metódy',
|
||
miscellaneous: 'Rôzne',
|
||
module: 'Modul',
|
||
modules: 'Moduly',
|
||
name: 'Názov',
|
||
no: 'Nie',
|
||
'no-graph': 'Nie je k dispozícii žiadny graf.',
|
||
'no-iframe': 'Váš prehliadač nepodporuje iframe',
|
||
'no-result-matching': 'Nenájdené žiadne výsledky pre',
|
||
'no-svg': 'Váš prehliadač nepodporuje SVG',
|
||
optional: 'Voliteľný',
|
||
outputs: 'Výstupy',
|
||
overview: 'Prehľad',
|
||
parameters: 'Parametre',
|
||
'peer-dependencies': 'Peer dependencies',
|
||
pipe: 'Pipe',
|
||
pipes: 'Pipes',
|
||
prefix: 'Prefix',
|
||
properties: 'Vlastnosti',
|
||
providers: 'Providers',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: 'Požadovaný',
|
||
reset: 'Resetovať',
|
||
'results-matching': 'výsledkov pre',
|
||
returns: 'Návratová hodnota',
|
||
route: 'Route',
|
||
routes: 'Routes',
|
||
schemas: 'Schémy',
|
||
'search-placeholder': 'Zadajte hľadaný text',
|
||
selector: 'Selektor',
|
||
signature: 'Podpis',
|
||
source: 'Zdroj',
|
||
standalone: 'Standalone',
|
||
statements: 'Statements',
|
||
styles: 'Štýly',
|
||
template: 'Šablóna',
|
||
type: 'Typ',
|
||
'type-aliases': 'Type aliases',
|
||
'type-parameters': 'Type parameters',
|
||
types: 'Typy',
|
||
'unamed-property': 'Nepomenovaný atribút',
|
||
'unit-test-coverage': 'Pokrytie unit testami',
|
||
value: 'Hodnota',
|
||
variables: 'Premenné',
|
||
yes: 'Áno',
|
||
zoomin: 'Priblížiť',
|
||
zoomout: 'Oddialiť'
|
||
};
|
||
|
||
var TRANSLATION_ZH_CN = {
|
||
accessors: '存取器',
|
||
arguments: 'Arguments',
|
||
bootstrap: '根组件',
|
||
branches: '分支',
|
||
browse: '查看',
|
||
classe: '类',
|
||
classes: '类列表',
|
||
component: '组件',
|
||
components: '组件列表',
|
||
constructor: '构造方法',
|
||
controllers: 'Controllers',
|
||
controller: 'Controller',
|
||
'coverage-page-title': '文档概览',
|
||
declarations: '可声明对象列表',
|
||
decorators: '装饰器列表',
|
||
'default-value': '缺省值',
|
||
'defined-in': '被定义在',
|
||
dependencies: '依赖项',
|
||
deprecated: '已弃用',
|
||
description: '描述',
|
||
directive: '指令',
|
||
directives: '指令列表',
|
||
'dom tree': 'DOM 树',
|
||
entities: '实体',
|
||
entity: '实体',
|
||
entrycomponents: '入口组件列表',
|
||
enumerations: '列举',
|
||
enums: '枚举列表',
|
||
example: '例子',
|
||
examples: '例子',
|
||
exports: '导出',
|
||
extends: '继承',
|
||
file: '文件',
|
||
functions: '函数',
|
||
'generated-using': '文档生成使用',
|
||
'getting-started': '入门指南',
|
||
guard: '路由守卫',
|
||
guards: '路由守卫列表',
|
||
hostbindings: '宿主绑定',
|
||
hostdirectives: 'Host Directives',
|
||
hostlisteners: '宿主监听',
|
||
'html-element': 'Html 元素',
|
||
'html-element-with-directive': '带指令的Html元素',
|
||
identifier: '标识符',
|
||
implements: '实现',
|
||
imports: '引入',
|
||
index: '索引',
|
||
indexable: 'Indexable',
|
||
info: '信息',
|
||
'inherited-from': '继承自',
|
||
injectable: '可注入的',
|
||
injectables: '可注入的',
|
||
inputs: '输入属性',
|
||
interceptors: '拦截器',
|
||
interface: '接口',
|
||
interfaces: '接口',
|
||
legend: '图例',
|
||
license: '许可协议',
|
||
lines: 'Lines',
|
||
metadata: '元数据',
|
||
methods: '方法',
|
||
miscellaneous: '其他',
|
||
module: '模块',
|
||
modules: '模块列表',
|
||
name: '名称',
|
||
no: '否',
|
||
'no-graph': '无数据显示',
|
||
'no-iframe': '你的浏览器不支持iframes',
|
||
'no-result-matching': '无匹配的结果',
|
||
'no-svg': '你的浏览器不支持SVG',
|
||
optional: '可选的',
|
||
outputs: '输出属性',
|
||
overview: '概述',
|
||
parameters: '参数列表',
|
||
'peer-dependencies': '同级依赖',
|
||
pipe: '管道',
|
||
pipes: '管道列表',
|
||
prefix: '字首',
|
||
properties: '属性列表',
|
||
providers: '提供商列表',
|
||
pure: 'Pure',
|
||
readme: '手册',
|
||
required: '必需的',
|
||
reset: '重置',
|
||
'results-matching': '匹配的结果',
|
||
returns: '返回',
|
||
route: '路由',
|
||
routes: '路由列表',
|
||
schemas: '模式',
|
||
'search-placeholder': '请输入查询关键字',
|
||
selector: '选择器',
|
||
signature: '签名',
|
||
source: '来源',
|
||
standalone: 'Standalone',
|
||
statements: '注释',
|
||
styles: '样式',
|
||
template: '模板',
|
||
type: '类型',
|
||
'type-aliases': '类型别名',
|
||
'type-parameters': '类型参数',
|
||
types: '类型',
|
||
'unamed-property': '未命名属性',
|
||
'unit-test-coverage': '单元测试概览',
|
||
value: '值',
|
||
variables: '变量',
|
||
yes: '是',
|
||
zoomin: '放大',
|
||
zoomout: '缩小'
|
||
};
|
||
|
||
var TRANSLATION_ZH_TW = {
|
||
accessors: '存取器',
|
||
arguments: '參數',
|
||
bootstrap: '根元件',
|
||
branches: '分支',
|
||
browse: '瀏覽',
|
||
classe: '類別',
|
||
classes: '類別',
|
||
component: '元件',
|
||
components: '元件列表',
|
||
constructor: '建構式方法',
|
||
controllers: 'Controllers',
|
||
controller: 'Controller',
|
||
'coverage-page-title': '覆蓋率頁面標題',
|
||
declarations: 'Declarations',
|
||
decorators: '裝飾器列表',
|
||
'default-value': '預設值',
|
||
'defined-in': '被定義在',
|
||
dependencies: '依賴項',
|
||
deprecated: '已棄用',
|
||
description: '描述',
|
||
directive: '指令 (Directive)',
|
||
directives: '指令 (Directives)',
|
||
'dom tree': 'DOM 樹',
|
||
entities: '實體',
|
||
entity: '實體',
|
||
entrycomponents: 'Entrycomponents',
|
||
enumerations: '列舉',
|
||
enums: '枚舉列表',
|
||
example: '範例',
|
||
examples: '範例',
|
||
exports: '匯出',
|
||
extends: '繼承',
|
||
file: '檔案',
|
||
functions: '函數',
|
||
'generated-using': '產生文件使用',
|
||
'getting-started': '快速上手',
|
||
guard: '路由守衛',
|
||
guards: '路由守衛列表',
|
||
hostbindings: 'Host Bindings',
|
||
hostdirectives: 'Host Directives',
|
||
hostlisteners: 'Host Listeners',
|
||
'html-element': 'HTML 元素',
|
||
'html-element-with-directive': '帶指令的 HTML 元素',
|
||
identifier: '識別符號',
|
||
implements: '實作',
|
||
imports: '匯入',
|
||
index: '索引',
|
||
indexable: 'Indexable',
|
||
info: '資訊',
|
||
'inherited-from': '繼承自',
|
||
injectable: 'Injectable',
|
||
injectables: 'Injectables',
|
||
inputs: '輸入屬性',
|
||
interceptors: '攔截器',
|
||
interface: '介面',
|
||
interfaces: '介面',
|
||
legend: '圖例',
|
||
license: '授權協議',
|
||
lines: 'Lines',
|
||
metadata: '元數據',
|
||
methods: '方法',
|
||
miscellaneous: '其他',
|
||
module: '模組',
|
||
modules: '模組列表',
|
||
name: '名稱',
|
||
no: '否',
|
||
'no-graph': '無數據顯示',
|
||
'no-iframe': '你的瀏覽器不支援 iframes',
|
||
'no-result-matching': '無匹配的結果',
|
||
'no-svg': '你的瀏覽器不支援 SVG',
|
||
optional: '可選的',
|
||
outputs: '輸出屬性',
|
||
overview: '概述',
|
||
parameters: '參數列表',
|
||
'peer-dependencies': 'Peer Dependencies',
|
||
pipe: '管道',
|
||
pipes: '管道列表',
|
||
prefix: '前置詞',
|
||
properties: '屬性列表',
|
||
providers: '提供者列表',
|
||
pure: 'Pure',
|
||
readme: 'README',
|
||
required: '必需的',
|
||
reset: '重設',
|
||
'results-matching': '匹配的結果',
|
||
returns: '回傳值',
|
||
route: '路由',
|
||
routes: '路由列表',
|
||
schemas: 'Schemas',
|
||
'search-placeholder': '請輸入查詢關鍵字',
|
||
selector: '選擇器',
|
||
signature: '簽名',
|
||
source: '來源',
|
||
standalone: 'Standalone',
|
||
statements: '陳述式',
|
||
styles: '樣式',
|
||
template: '範本',
|
||
type: '型別',
|
||
'type-aliases': '型別別名',
|
||
'type-parameters': '型別參數',
|
||
types: '型別',
|
||
'unamed-property': '未命名屬性',
|
||
'unit-test-coverage': '單元測試覆蓋率',
|
||
value: '值',
|
||
variables: '變數',
|
||
yes: '是',
|
||
zoomin: '放大',
|
||
zoomout: '縮小'
|
||
};
|
||
|
||
// https://github.com/i18next/i18next/blob/master/CHANGELOG.md#1700
|
||
// https://github.com/i18next/i18next/commit/57da10888760932f9df4df93fa79f9a6e459e6ed
|
||
var i18next = require('i18next');
|
||
var I18nEngine = /** @class */ (function () {
|
||
function I18nEngine() {
|
||
this.availablesLanguages = {
|
||
'bg-BG': 'bg-BG',
|
||
'de-DE': 'de-DE',
|
||
'en-US': 'en-US',
|
||
'es-ES': 'es-ES',
|
||
'fr-FR': 'fr-FR',
|
||
'hu-HU': 'hu-HU',
|
||
'it-IT': 'it-IT',
|
||
'ja-JP': 'ja-JP',
|
||
'ka-GE': 'ka-GE',
|
||
'ko-KR': 'ko-KR',
|
||
'nl-NL': 'nl-NL',
|
||
'pl-PL': 'pl-PL',
|
||
'pt-BR': 'pt-BR',
|
||
'ru-RU': 'ru-RU',
|
||
'sk-SK': 'sk-SK',
|
||
'zh-CN': 'zh-CN',
|
||
'zh-TW': 'zh-TW'
|
||
};
|
||
this.fallbackLanguage = 'en-US';
|
||
}
|
||
I18nEngine.getInstance = function () {
|
||
if (!I18nEngine.instance) {
|
||
I18nEngine.instance = new I18nEngine();
|
||
}
|
||
return I18nEngine.instance;
|
||
};
|
||
I18nEngine.prototype.init = function (language) {
|
||
i18next.init({
|
||
lng: language,
|
||
fallbackLng: this.fallbackLanguage,
|
||
interpolation: {
|
||
skipOnVariables: false
|
||
}
|
||
});
|
||
i18next.addResources('bg-BG', 'translation', TRANSLATION_BG_BG);
|
||
i18next.addResources('de-DE', 'translation', TRANSLATION_DE_DE);
|
||
i18next.addResources('en-US', 'translation', TRANSLATION_EN_US);
|
||
i18next.addResources('es-ES', 'translation', TRANSLATION_ES_ES);
|
||
i18next.addResources('fr-FR', 'translation', TRANSLATION_FR_FR);
|
||
i18next.addResources('hu-HU', 'translation', TRANSLATION_HU_HU);
|
||
i18next.addResources('it-IT', 'translation', TRANSLATION_IT_IT);
|
||
i18next.addResources('ja-JP', 'translation', TRANSLATION_JA_JP);
|
||
i18next.addResources('ka-GE', 'translation', TRANSLATION_KA_GE);
|
||
i18next.addResources('ko-KR', 'translation', TRANSLATION_KO_KR);
|
||
i18next.addResources('nl-NL', 'translation', TRANSLATION_NL_NL);
|
||
i18next.addResources('pl-PL', 'translation', TRANSLATION_PL_PL);
|
||
i18next.addResources('pt-BR', 'translation', TRANSLATION_PT_BR);
|
||
i18next.addResources('ru-RU', 'translation', TRANSLATION_RU_RU);
|
||
i18next.addResources('sk-SK', 'translation', TRANSLATION_SK_SK);
|
||
i18next.addResources('zh-CN', 'translation', TRANSLATION_ZH_CN);
|
||
i18next.addResources('zh-TW', 'translation', TRANSLATION_ZH_TW);
|
||
};
|
||
I18nEngine.prototype.translate = function (key) {
|
||
return i18next.t(key);
|
||
};
|
||
I18nEngine.prototype.exists = function (key) {
|
||
return i18next.exists(key);
|
||
};
|
||
I18nEngine.prototype.supportLanguage = function (language) {
|
||
return typeof this.availablesLanguages[language] !== 'undefined';
|
||
};
|
||
return I18nEngine;
|
||
}());
|
||
var I18nEngine$1 = I18nEngine.getInstance();
|
||
|
||
require('handlebars');
|
||
var I18nHelper = /** @class */ (function () {
|
||
function I18nHelper() {
|
||
}
|
||
I18nHelper.prototype.helperFunc = function (context, i18n_key) {
|
||
if (I18nEngine$1.exists(i18n_key)) {
|
||
return I18nEngine$1.translate(i18n_key.toLowerCase());
|
||
}
|
||
else {
|
||
return i18n_key;
|
||
}
|
||
};
|
||
return I18nHelper;
|
||
}());
|
||
|
||
var IfStringHelper = /** @class */ (function () {
|
||
function IfStringHelper() {
|
||
}
|
||
IfStringHelper.prototype.helperFunc = function (context, a, options) {
|
||
if (typeof a === 'string') {
|
||
return options.fn(context);
|
||
}
|
||
return options.inverse(context);
|
||
};
|
||
return IfStringHelper;
|
||
}());
|
||
|
||
var IndexableSignatureHelper = /** @class */ (function () {
|
||
function IndexableSignatureHelper() {
|
||
}
|
||
IndexableSignatureHelper.prototype.helperFunc = function (context, method) {
|
||
var args = method.args.map(function (arg) { return "".concat(arg.name, ": ").concat(arg.type); }).join(', ');
|
||
if (method.name) {
|
||
return "".concat(method.name, "[").concat(args, "]");
|
||
}
|
||
else {
|
||
return "[".concat(args, "]");
|
||
}
|
||
};
|
||
return IndexableSignatureHelper;
|
||
}());
|
||
|
||
var IsInitialTabHelper = /** @class */ (function () {
|
||
function IsInitialTabHelper() {
|
||
}
|
||
IsInitialTabHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
|
||
return tabs[0].id === tabId ? options.fn(context) : options.inverse(context);
|
||
};
|
||
return IsInitialTabHelper;
|
||
}());
|
||
|
||
var IsNotToggleHelper = /** @class */ (function () {
|
||
function IsNotToggleHelper() {
|
||
}
|
||
IsNotToggleHelper.prototype.helperFunc = function (context, type, options) {
|
||
var result = Configuration$1.mainData.toggleMenuItems.indexOf(type);
|
||
if (Configuration$1.mainData.toggleMenuItems.indexOf('all') !== -1) {
|
||
return options.inverse(context);
|
||
}
|
||
else if (result !== -1) {
|
||
return options.fn(context);
|
||
}
|
||
else {
|
||
return options.inverse(context);
|
||
}
|
||
};
|
||
return IsNotToggleHelper;
|
||
}());
|
||
|
||
var IsTabEnabledHelper = /** @class */ (function () {
|
||
function IsTabEnabledHelper() {
|
||
}
|
||
IsTabEnabledHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
|
||
var isTabEnabled = -1 !== ___namespace.findIndex(tabs, { id: tabId });
|
||
return isTabEnabled ? options.fn(context) : options.inverse(context);
|
||
};
|
||
return IsTabEnabledHelper;
|
||
}());
|
||
|
||
var JsdocCodeExampleHelper = /** @class */ (function () {
|
||
function JsdocCodeExampleHelper() {
|
||
}
|
||
JsdocCodeExampleHelper.prototype.cleanTag = function (comment) {
|
||
if (comment.charAt(0) === '*') {
|
||
comment = comment.substring(1, comment.length);
|
||
}
|
||
if (comment.charAt(0) === ' ') {
|
||
comment = comment.substring(1, comment.length);
|
||
}
|
||
if (comment.indexOf('<p>') === 0) {
|
||
comment = comment.substring(3, comment.length);
|
||
}
|
||
if (comment.substr(-1) === '\n') {
|
||
comment = comment.substring(0, comment.length - 1);
|
||
}
|
||
if (comment.substr(-4) === '</p>') {
|
||
comment = comment.substring(0, comment.length - 4);
|
||
}
|
||
return comment;
|
||
};
|
||
JsdocCodeExampleHelper.prototype.getHtmlEntities = function (str) {
|
||
return String(str)
|
||
.replace(/&/g, '&')
|
||
.replace(/</g, '<')
|
||
.replace(/>/g, '>')
|
||
.replace(/"/g, '"');
|
||
};
|
||
JsdocCodeExampleHelper.prototype.parseCodeFences = function (comment) {
|
||
var codeFenceRegex = /```(\w+)?\s*\n([\s\S]*?)```/g;
|
||
var blocks = [];
|
||
var match;
|
||
var hasCodeFences = false;
|
||
// Find all code fences
|
||
while ((match = codeFenceRegex.exec(comment)) !== null) {
|
||
hasCodeFences = true;
|
||
var language = (match[1] || 'html').toLowerCase();
|
||
if (language === 'js')
|
||
language = 'javascript';
|
||
if (language === 'ts')
|
||
language = 'typescript';
|
||
var code = match[2];
|
||
// Convert placeholder back to empty lines first
|
||
code = code.replace(/___COMPODOC_EMPTY_LINE___/g, '\n');
|
||
// Trim leading and trailing whitespace, but preserve internal empty lines
|
||
code = code.trim();
|
||
code = code.replace(/```[\s\S]*?```/g, '');
|
||
if (code.length === 0) {
|
||
continue;
|
||
}
|
||
blocks.push({
|
||
language: language,
|
||
code: code
|
||
});
|
||
}
|
||
if (!hasCodeFences) {
|
||
var trimmedComment = comment.trim();
|
||
if (trimmedComment.length > 0) {
|
||
blocks.push({
|
||
language: 'html',
|
||
code: trimmedComment
|
||
});
|
||
}
|
||
}
|
||
return blocks;
|
||
};
|
||
JsdocCodeExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
||
var e_1, _a;
|
||
var i = 0;
|
||
var len = jsdocTags.length;
|
||
var tags = [];
|
||
for (i; i < len; i++) {
|
||
if (jsdocTags[i].tagName) {
|
||
if (jsdocTags[i].tagName.text === 'example') {
|
||
if (jsdocTags[i].comment) {
|
||
// DEBUG: Log the comment for each @example tag
|
||
// eslint-disable-next-line no-console
|
||
// console.log('helperFunc @example comment:', JSON.stringify(jsdocTags[i].comment));
|
||
var comment = jsdocTags[i].comment;
|
||
var caption = '';
|
||
// Extract and render caption if present
|
||
var captionMatch = comment.match(/<caption>([\s\S]*?)<\/caption>/);
|
||
if (captionMatch) {
|
||
caption = captionMatch[1];
|
||
// Remove caption from comment
|
||
comment = comment.replace(/<caption>[\s\S]*?<\/caption>/, '').trim();
|
||
// Render caption as a separate tag
|
||
var captionTag = {};
|
||
captionTag.comment = "<b><i>".concat(caption, "</i></b>");
|
||
tags.push(captionTag);
|
||
}
|
||
// Parse code fences for the rest of the comment
|
||
var codeBlocks = this.parseCodeFences(comment);
|
||
try {
|
||
for (var codeBlocks_1 = (e_1 = void 0, logger.__values(codeBlocks)), codeBlocks_1_1 = codeBlocks_1.next(); !codeBlocks_1_1.done; codeBlocks_1_1 = codeBlocks_1.next()) {
|
||
var block = codeBlocks_1_1.value;
|
||
var tag = {};
|
||
tag.comment =
|
||
"<pre class=\"line-numbers\"><code class=\"language-".concat(block.language, "\">") +
|
||
this.getHtmlEntities(block.code) +
|
||
"</code></pre>";
|
||
tags.push(tag);
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (codeBlocks_1_1 && !codeBlocks_1_1.done && (_a = codeBlocks_1.return)) _a.call(codeBlocks_1);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (tags.length > 0) {
|
||
context.tags = tags;
|
||
return options.fn(context);
|
||
}
|
||
};
|
||
return JsdocCodeExampleHelper;
|
||
}());
|
||
|
||
var JsdocDefaultHelper = /** @class */ (function () {
|
||
function JsdocDefaultHelper() {
|
||
}
|
||
JsdocDefaultHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
||
if (jsdocTags) {
|
||
var i = 0;
|
||
var len = jsdocTags.length;
|
||
var tag = {};
|
||
var defaultValue = false;
|
||
for (i; i < len; i++) {
|
||
if (jsdocTags[i].tagName) {
|
||
if (jsdocTags[i].tagName.text === 'default') {
|
||
defaultValue = true;
|
||
if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
|
||
tag.type = jsdocTags[i].typeExpression.type.name.text;
|
||
}
|
||
if (jsdocTags[i].comment) {
|
||
tag.comment = jsdocTags[i].comment;
|
||
}
|
||
if (jsdocTags[i].name) {
|
||
tag.name = jsdocTags[i].name.text;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (defaultValue) {
|
||
context.tag = tag;
|
||
return options.fn(context);
|
||
}
|
||
}
|
||
};
|
||
return JsdocDefaultHelper;
|
||
}());
|
||
|
||
var JsdocExampleHelper = /** @class */ (function () {
|
||
function JsdocExampleHelper() {
|
||
}
|
||
JsdocExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
||
var i = 0;
|
||
var len = jsdocTags.length;
|
||
var tags = [];
|
||
for (i; i < len; i++) {
|
||
if (jsdocTags[i].tagName) {
|
||
if (jsdocTags[i].tagName.text === 'example') {
|
||
var tag = {};
|
||
if (jsdocTags[i].comment) {
|
||
tag.comment = jsdocTags[i].comment
|
||
.replace(/<caption>/g, '<b><i>')
|
||
.replace(/\/caption>/g, '/b></i>');
|
||
}
|
||
tags.push(tag);
|
||
}
|
||
}
|
||
}
|
||
if (tags.length > 0) {
|
||
context.tags = tags;
|
||
return options.fn(context);
|
||
}
|
||
};
|
||
return JsdocExampleHelper;
|
||
}());
|
||
|
||
var JsdocParamsValidHelper = /** @class */ (function () {
|
||
function JsdocParamsValidHelper() {
|
||
}
|
||
JsdocParamsValidHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
||
var i = 0;
|
||
var len = jsdocTags.length;
|
||
var valid = false;
|
||
for (i; i < len; i++) {
|
||
if (jsdocTags[i].tagName) {
|
||
if (jsdocTags[i].tagName.text === 'param') {
|
||
valid = true;
|
||
}
|
||
}
|
||
}
|
||
if (valid) {
|
||
return options.fn(context);
|
||
}
|
||
else {
|
||
return options.inverse(context);
|
||
}
|
||
};
|
||
return JsdocParamsValidHelper;
|
||
}());
|
||
|
||
var JsdocParamsHelper = /** @class */ (function () {
|
||
function JsdocParamsHelper() {
|
||
}
|
||
JsdocParamsHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
||
var i = 0;
|
||
var len = jsdocTags.length;
|
||
var tags = [];
|
||
for (i; i < len; i++) {
|
||
if (jsdocTags[i].tagName) {
|
||
if (jsdocTags[i].tagName.text === 'param') {
|
||
var tag = {};
|
||
if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.kind) {
|
||
tag.type = kindToType(jsdocTags[i].typeExpression.type.kind);
|
||
}
|
||
if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
|
||
tag.type = jsdocTags[i].typeExpression.type.name.text;
|
||
}
|
||
else {
|
||
tag.type = jsdocTags[i].type;
|
||
}
|
||
if (jsdocTags[i].comment) {
|
||
tag.comment = jsdocTags[i].comment;
|
||
}
|
||
if (jsdocTags[i].defaultValue) {
|
||
tag.defaultValue = jsdocTags[i].defaultValue;
|
||
}
|
||
if (jsdocTags[i].name) {
|
||
if (jsdocTags[i].name.text) {
|
||
tag.name = jsdocTags[i].name.text;
|
||
}
|
||
else {
|
||
tag.name = jsdocTags[i].name;
|
||
}
|
||
}
|
||
if (jsdocTags[i].optional) {
|
||
tag.optional = true;
|
||
}
|
||
tags.push(tag);
|
||
}
|
||
}
|
||
}
|
||
if (tags.length >= 1) {
|
||
context.tags = tags;
|
||
return options.fn(context);
|
||
}
|
||
};
|
||
return JsdocParamsHelper;
|
||
}());
|
||
|
||
var JsdocReturnsCommentHelper = /** @class */ (function () {
|
||
function JsdocReturnsCommentHelper() {
|
||
}
|
||
JsdocReturnsCommentHelper.prototype.helperFunc = function (context, jsdocTags, options) {
|
||
var i = 0;
|
||
var len = jsdocTags.length;
|
||
var result;
|
||
for (i; i < len; i++) {
|
||
if (jsdocTags[i].tagName) {
|
||
if (jsdocTags[i].tagName.text === 'returns' ||
|
||
jsdocTags[i].tagName.text === 'return') {
|
||
result = jsdocTags[i].comment;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
return JsdocReturnsCommentHelper;
|
||
}());
|
||
|
||
var ast$1 = new tsMorph.Project();
|
||
var ImportsUtil = /** @class */ (function () {
|
||
function ImportsUtil() {
|
||
}
|
||
ImportsUtil.getInstance = function () {
|
||
if (!ImportsUtil.instance) {
|
||
ImportsUtil.instance = new ImportsUtil();
|
||
}
|
||
return ImportsUtil.instance;
|
||
};
|
||
/**
|
||
* Find for a sourceFile a variable value in a local enum
|
||
* @param srcFile
|
||
* @param variableName
|
||
* @param variableValue
|
||
*/
|
||
ImportsUtil.prototype.findInEnums = function (srcFile, variableName, variableValue) {
|
||
var res = '';
|
||
srcFile.getEnum(function (e) {
|
||
if (e.getName() === variableName) {
|
||
e.getMember(function (m) {
|
||
if (m.getName() === variableValue) {
|
||
res = m.getValue();
|
||
}
|
||
});
|
||
}
|
||
});
|
||
return res;
|
||
};
|
||
/**
|
||
* Find for a sourceFile a variable value in a local static class
|
||
* @param srcFile
|
||
* @param variableName
|
||
* @param variableValue
|
||
*/
|
||
ImportsUtil.prototype.findInClasses = function (srcFile, variableName, variableValue) {
|
||
var res = '';
|
||
srcFile.getClass(function (c) {
|
||
var staticProperty = c.getStaticProperty(variableValue);
|
||
if (staticProperty) {
|
||
if (staticProperty.getInitializer()) {
|
||
res = staticProperty.getInitializer().getText();
|
||
}
|
||
}
|
||
});
|
||
return res;
|
||
};
|
||
/**
|
||
* Find a value in a local variable declaration like an object
|
||
* @param variableDeclaration
|
||
* @param variablesAttributes
|
||
*/
|
||
ImportsUtil.prototype.findInObjectVariableDeclaration = function (variableDeclaration, variablesAttributes) {
|
||
var variableKind = variableDeclaration.getKind();
|
||
if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
|
||
var initializer = variableDeclaration.getInitializer();
|
||
if (initializer) {
|
||
var initializerKind = initializer.getKind();
|
||
if (initializerKind && initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
||
var compilerNode = initializer.compilerNode, finalValue_1 = '';
|
||
// Find thestring from AVAR.BVAR.thestring inside properties
|
||
var depth_1 = 0;
|
||
var loopProperties_1 = function (properties) {
|
||
properties.forEach(function (prop) {
|
||
if (prop.name) {
|
||
if (variablesAttributes[depth_1 + 1]) {
|
||
if (prop.name.getText() === variablesAttributes[depth_1 + 1]) {
|
||
if (prop.initializer) {
|
||
if (prop.initializer.properties) {
|
||
depth_1 += 1;
|
||
loopProperties_1(prop.initializer.properties);
|
||
}
|
||
else {
|
||
finalValue_1 = prop.initializer.text;
|
||
}
|
||
}
|
||
else {
|
||
finalValue_1 = prop.initializer.text;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|
||
};
|
||
loopProperties_1(compilerNode.properties);
|
||
return finalValue_1;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* Find in imports something like myvar
|
||
* @param {string} inputVariableName like myvar
|
||
* @return {[type]} myvar value
|
||
*/
|
||
ImportsUtil.prototype.findValueInImportOrLocalVariables = function (inputVariableName, sourceFile, decoratorType) {
|
||
var e_1, _a;
|
||
var metadataVariableName = inputVariableName, searchedImport, aliasOriginalName = '', foundWithNamedImport = false, foundWithAlias = false;
|
||
var file = typeof ast$1.getSourceFile(sourceFile.fileName) !== 'undefined'
|
||
? ast$1.getSourceFile(sourceFile.fileName)
|
||
: ast$1.addSourceFileAtPathIfExists(sourceFile.fileName); // tslint:disable-line
|
||
var imports = file.getImportDeclarations();
|
||
/**
|
||
* Loop through all imports, and find one matching inputVariableName
|
||
*/
|
||
imports.forEach(function (i) {
|
||
var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
||
if (namedImportsLength > 0) {
|
||
for (j; j < namedImportsLength; j++) {
|
||
var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
||
if (namedImports[j].getAliasNode()) {
|
||
importAlias = namedImports[j].getAliasNode().getText();
|
||
}
|
||
if (importName === metadataVariableName) {
|
||
foundWithNamedImport = true;
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
if (importAlias === metadataVariableName) {
|
||
foundWithNamedImport = true;
|
||
foundWithAlias = true;
|
||
aliasOriginalName = importName;
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
var namespaceImport = i.getNamespaceImport();
|
||
if (namespaceImport) {
|
||
var namespaceImportLocalName = namespaceImport.getText();
|
||
if (namespaceImportLocalName === metadataVariableName) {
|
||
searchedImport = i;
|
||
}
|
||
}
|
||
if (!foundWithNamedImport) {
|
||
var defaultImport = i.getDefaultImport();
|
||
if (defaultImport) {
|
||
var defaultImportText = defaultImport.getText();
|
||
if (defaultImportText === metadataVariableName) {
|
||
searchedImport = i;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
function hasFoundValues(variableDeclaration) {
|
||
var variableKind = variableDeclaration.getKind();
|
||
if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
|
||
var initializer = variableDeclaration.getInitializer();
|
||
if (initializer) {
|
||
var initializerKind = initializer.getKind();
|
||
if (initializerKind && initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
||
var compilerNode = initializer.compilerNode;
|
||
return compilerNode.properties;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (typeof searchedImport !== 'undefined') {
|
||
var importPathReference = searchedImport.getModuleSpecifierSourceFile();
|
||
var importPath = void 0;
|
||
if (typeof importPathReference !== 'undefined') {
|
||
importPath = importPathReference.compilerNode.fileName;
|
||
var sourceFileImport = typeof ast$1.getSourceFile(importPath) !== 'undefined'
|
||
? ast$1.getSourceFile(importPath)
|
||
: ast$1.addSourceFileAtPathIfExists(importPath); // tslint:disable-line
|
||
if (sourceFileImport) {
|
||
var variableName_1 = foundWithAlias ? aliasOriginalName : metadataVariableName;
|
||
var variableDeclaration = sourceFileImport.getVariableDeclaration(variableName_1);
|
||
if (variableDeclaration) {
|
||
return hasFoundValues(variableDeclaration);
|
||
}
|
||
else {
|
||
// Try with exports
|
||
var exportDeclarations = sourceFileImport.getExportedDeclarations();
|
||
if (exportDeclarations && exportDeclarations.size > 0) {
|
||
try {
|
||
for (var exportDeclarations_1 = logger.__values(exportDeclarations), exportDeclarations_1_1 = exportDeclarations_1.next(); !exportDeclarations_1_1.done; exportDeclarations_1_1 = exportDeclarations_1.next()) {
|
||
var _b = logger.__read(exportDeclarations_1_1.value, 2), exportDeclarationKey = _b[0], exportDeclarationValues = _b[1];
|
||
exportDeclarationValues.forEach(function (exportDeclarationValue) {
|
||
if (exportDeclarationValue instanceof tsMorph.VariableDeclaration &&
|
||
exportDeclarationValue.getName() === variableName_1) {
|
||
return hasFoundValues(exportDeclarationValue);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (exportDeclarations_1_1 && !exportDeclarations_1_1.done && (_a = exportDeclarations_1.return)) _a.call(exportDeclarations_1);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (!importPathReference &&
|
||
decoratorType === 'template' &&
|
||
searchedImport.getModuleSpecifierValue().indexOf('.html') !== -1) {
|
||
// @ts-ignore
|
||
var originalSourceFilePath = sourceFile.path;
|
||
var originalSourceFilePathFolder = originalSourceFilePath.substring(0, originalSourceFilePath.lastIndexOf('/'));
|
||
var finalImportedPath = originalSourceFilePathFolder + '/' + searchedImport.getModuleSpecifierValue();
|
||
var finalImportedPathData = FileEngine$1.getSync(finalImportedPath);
|
||
return finalImportedPathData;
|
||
}
|
||
}
|
||
else {
|
||
// Find in local variables of the file
|
||
var variableDeclaration = file.getVariableDeclaration(metadataVariableName);
|
||
if (variableDeclaration) {
|
||
var variableKind = variableDeclaration.getKind();
|
||
if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
|
||
var initializer = variableDeclaration.getInitializer();
|
||
if (initializer) {
|
||
var initializerKind = initializer.getKind();
|
||
if (initializerKind &&
|
||
initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
||
var compilerNode = initializer.compilerNode;
|
||
return compilerNode.properties;
|
||
}
|
||
else if (initializerKind &&
|
||
(initializerKind === tsMorph.SyntaxKind.StringLiteral ||
|
||
initializerKind === tsMorph.SyntaxKind.NoSubstitutionTemplateLiteral)) {
|
||
if (decoratorType === 'template') {
|
||
return initializer.getText();
|
||
}
|
||
else {
|
||
return variableDeclaration.compilerNode;
|
||
}
|
||
}
|
||
else if (initializerKind) {
|
||
return variableDeclaration.compilerNode;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return [];
|
||
};
|
||
ImportsUtil.prototype.getFileNameOfImport = function (variableName, sourceFile) {
|
||
var file = typeof ast$1.getSourceFile(sourceFile.fileName) !== 'undefined'
|
||
? ast$1.getSourceFile(sourceFile.fileName)
|
||
: ast$1.addSourceFileAtPath(sourceFile.fileName); // tslint:disable-line
|
||
var imports = file.getImportDeclarations();
|
||
var searchedImport, finalPath = '';
|
||
imports.forEach(function (i) {
|
||
var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
||
if (namedImportsLength > 0) {
|
||
for (j; j < namedImportsLength; j++) {
|
||
var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
||
if (namedImports[j].getAliasNode()) {
|
||
importAlias = namedImports[j].getAliasNode().getText();
|
||
}
|
||
if (importName === variableName) {
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
if (importAlias === variableName) {
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
if (typeof searchedImport !== 'undefined') {
|
||
var importPath = path__namespace.resolve(path__namespace.dirname(sourceFile.fileName) +
|
||
'/' +
|
||
searchedImport.getModuleSpecifierValue() +
|
||
'.ts');
|
||
var cleaner = (process.cwd() + path__namespace.sep).replace(/\\/g, '/');
|
||
finalPath = importPath.replace(cleaner, '');
|
||
}
|
||
return finalPath;
|
||
};
|
||
/**
|
||
* Find the file path of imported variable
|
||
* @param {string} inputVariableName like thestring
|
||
* @return {[type]} thestring destination path
|
||
*/
|
||
ImportsUtil.prototype.findFilePathOfImportedVariable = function (inputVariableName, sourceFilePath) {
|
||
var searchedImport, finalPath = '';
|
||
var file = typeof ast$1.getSourceFile(sourceFilePath) !== 'undefined'
|
||
? ast$1.getSourceFile(sourceFilePath)
|
||
: ast$1.addSourceFileAtPath(sourceFilePath); // tslint:disable-line
|
||
var imports = file.getImportDeclarations();
|
||
/**
|
||
* Loop through all imports, and find one matching inputVariableName
|
||
*/
|
||
imports.forEach(function (i) {
|
||
var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
||
if (namedImportsLength > 0) {
|
||
for (j; j < namedImportsLength; j++) {
|
||
var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
||
if (namedImports[j].getAliasNode()) {
|
||
importAlias = namedImports[j].getAliasNode().getText();
|
||
}
|
||
if (importName === inputVariableName) {
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
if (importAlias === inputVariableName) {
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
if (typeof searchedImport !== 'undefined') {
|
||
finalPath = path__namespace.resolve(path__namespace.dirname(sourceFilePath) +
|
||
'/' +
|
||
searchedImport.getModuleSpecifierValue() +
|
||
'.ts');
|
||
}
|
||
return finalPath;
|
||
};
|
||
/**
|
||
* Find in imports something like VAR.AVAR.BVAR.thestring
|
||
* @param {string} inputVariableName like VAR.AVAR.BVAR.thestring
|
||
* @return {[type]} thestring value
|
||
*/
|
||
ImportsUtil.prototype.findPropertyValueInImportOrLocalVariables = function (inputVariableName, sourceFile) {
|
||
var variablesAttributes = inputVariableName.split('.'), metadataVariableName = variablesAttributes[0], searchedImport, aliasOriginalName = '', foundWithAlias = false;
|
||
var file = typeof ast$1.getSourceFile(sourceFile.fileName) !== 'undefined'
|
||
? ast$1.getSourceFile(sourceFile.fileName)
|
||
: ast$1.addSourceFileAtPath(sourceFile.fileName); // tslint:disable-line
|
||
var imports = file.getImportDeclarations();
|
||
/**
|
||
* Loop through all imports, and find one matching inputVariableName
|
||
*/
|
||
imports.forEach(function (i) {
|
||
var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
||
if (namedImportsLength > 0) {
|
||
for (j; j < namedImportsLength; j++) {
|
||
var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
||
if (namedImports[j].getAliasNode()) {
|
||
importAlias = namedImports[j].getAliasNode().getText();
|
||
}
|
||
if (importName === metadataVariableName) {
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
if (importAlias === metadataVariableName) {
|
||
foundWithAlias = true;
|
||
aliasOriginalName = importName;
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
var fileToSearchIn, variableDeclaration;
|
||
if (typeof searchedImport !== 'undefined') {
|
||
var importPath = path__namespace.resolve(path__namespace.dirname(sourceFile.fileName) +
|
||
'/' +
|
||
searchedImport.getModuleSpecifierValue() +
|
||
'.ts');
|
||
var sourceFileImport = typeof ast$1.getSourceFile(importPath) !== 'undefined'
|
||
? ast$1.getSourceFile(importPath)
|
||
: ast$1.addSourceFileAtPath(importPath); // tslint:disable-line
|
||
if (sourceFileImport) {
|
||
fileToSearchIn = sourceFileImport;
|
||
var variableName = foundWithAlias ? aliasOriginalName : metadataVariableName;
|
||
variableDeclaration = fileToSearchIn.getVariableDeclaration(variableName);
|
||
}
|
||
}
|
||
else {
|
||
fileToSearchIn = file;
|
||
// Find in local variables of the file
|
||
variableDeclaration = fileToSearchIn.getVariableDeclaration(metadataVariableName);
|
||
}
|
||
if (variableDeclaration) {
|
||
return this.findInObjectVariableDeclaration(variableDeclaration, variablesAttributes);
|
||
}
|
||
// Try find it in enums
|
||
if (variablesAttributes.length > 0) {
|
||
if (typeof fileToSearchIn !== 'undefined') {
|
||
var val = this.findInEnums(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
|
||
if (val !== '') {
|
||
return val;
|
||
}
|
||
val = this.findInClasses(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
|
||
if (val !== '') {
|
||
return val;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
return ImportsUtil;
|
||
}());
|
||
var ImportsUtil$1 = ImportsUtil.getInstance();
|
||
|
||
var Handlebars$5 = require('handlebars');
|
||
var traverse$1 = require('neotraverse/legacy');
|
||
var ast = new tsMorph.Project();
|
||
var RouterParserUtil = /** @class */ (function () {
|
||
function RouterParserUtil() {
|
||
this.scannedFiles = [];
|
||
this.routes = [];
|
||
this.incompleteRoutes = [];
|
||
this.modules = [];
|
||
this.modulesWithRoutes = [];
|
||
this.transformAngular8ImportSyntax = /(['"]loadChildren['"]:)\(\)(:[^)]+?)?=>"import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)\.then\(\(?\w+?\)?=>\S+?\.([^)]+?)\)(\\'|'|")/g;
|
||
this.transformAngular8ImportSyntaxComponent = /(['"]loadComponent['"]:)\(\)(:[^)]+?)?=>"import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)\.then\(\(?\w+?\)?=>\S+?\.([^)]+?)\)(\\'|'|")/g;
|
||
this.transformAngular8ImportSyntaxAsyncAwait = /(['"]loadChildren['"]:)\(\)(:[^)]+?)?=>\("import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)"\)\.['"]([^)]+?)['"]/g;
|
||
this.transformAngular8ImportSyntaxComponentAsyncAwait = /(['"]loadComponent['"]:)\(\)(:[^)]+?)?=>\("import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)"\)\.['"]([^)]+?)['"]/g;
|
||
this.trailingComma = /,\s*([\]})])/g;
|
||
}
|
||
RouterParserUtil.getInstance = function () {
|
||
if (!RouterParserUtil.instance) {
|
||
RouterParserUtil.instance = new RouterParserUtil();
|
||
}
|
||
return RouterParserUtil.instance;
|
||
};
|
||
RouterParserUtil.prototype.addRoute = function (route) {
|
||
this.routes.push(route);
|
||
this.routes = ___namespace.sortBy(___namespace.uniqWith(this.routes, ___namespace.isEqual), ['name']);
|
||
};
|
||
RouterParserUtil.prototype.addIncompleteRoute = function (route) {
|
||
this.incompleteRoutes.push(route);
|
||
this.incompleteRoutes = ___namespace.sortBy(___namespace.uniqWith(this.incompleteRoutes, ___namespace.isEqual), ['name']);
|
||
};
|
||
RouterParserUtil.prototype.addModuleWithRoutes = function (moduleName, moduleImports, filename) {
|
||
this.modulesWithRoutes.push({
|
||
name: moduleName,
|
||
importsNode: moduleImports,
|
||
filename: filename
|
||
});
|
||
this.modulesWithRoutes = ___namespace.sortBy(___namespace.uniqWith(this.modulesWithRoutes, ___namespace.isEqual), ['name']);
|
||
};
|
||
RouterParserUtil.prototype.addModule = function (moduleName, moduleImports) {
|
||
this.modules.push({
|
||
name: moduleName,
|
||
importsNode: moduleImports
|
||
});
|
||
this.modules = ___namespace.sortBy(___namespace.uniqWith(this.modules, ___namespace.isEqual), ['name']);
|
||
};
|
||
RouterParserUtil.prototype.cleanRawRouteParsed = function (route) {
|
||
try {
|
||
return JSON5__namespace.parse(this.cleanRawRoute(route));
|
||
}
|
||
catch (parseError) {
|
||
logger.logger.error("Failed to parse route data. This may be caused by special characters in file paths or route configurations.");
|
||
logger.logger.debug("Raw route data: ".concat(route));
|
||
logger.logger.debug("Cleaned route data: ".concat(this.cleanRawRoute(route)));
|
||
logger.logger.debug("Parse error: ".concat(parseError.message));
|
||
throw parseError;
|
||
}
|
||
};
|
||
RouterParserUtil.prototype.cleanRawRoute = function (route) {
|
||
var cleaned = route
|
||
.replace(/\s/g, '')
|
||
.replace(this.trailingComma, '$1')
|
||
.replace(this.transformAngular8ImportSyntax, '$1"$4#$6"')
|
||
.replace(this.transformAngular8ImportSyntaxAsyncAwait, '$1"$4#$6"')
|
||
.replace(this.transformAngular8ImportSyntaxComponent, '$1"$4#$6"')
|
||
.replace(this.transformAngular8ImportSyntaxComponentAsyncAwait, '$1"$4#$6"');
|
||
// Additional cleaning for special characters that cause JSON5 parsing issues
|
||
// Handle unescaped characters in string literals
|
||
cleaned = cleaned
|
||
// Fix template literal expressions that get converted incorrectly
|
||
// Convert ${VAR}/something patterns to "VAR/something" format
|
||
.replace(/\$\{([^}]+)\}\/([^"',}\s]+)/g, '"$1/$2"')
|
||
.replace(/\$\{([^}]+)\}/g, '"$1"')
|
||
// Fix malformed string concatenations from template literals
|
||
.replace(/"([^"]*?)"\/"([^"]*?)"/g, '"$1/$2"')
|
||
.replace(/"([^"]*?)"\+([^"]*?)\+"([^"]*?)"/g, '"$1+$2+$3"')
|
||
// Fix double quotes issues in path strings
|
||
.replace(/""([^"]*?)""/g, '"$1"')
|
||
// Fix malformed string concatenations
|
||
.replace(/([^"])"([^"]*?)\.([^"]*?)"([^"])/g, '$1"$2\\.$3"$4')
|
||
// Fix unescaped plus signs in string literals
|
||
.replace(/([^"])"([^"]*?)\+([^"]*?)"([^"])/g, '$1"$2\\+$3"$4')
|
||
// Fix unescaped parentheses in string literals
|
||
.replace(/([^"])"([^"]*?)\(([^"]*?)"([^"])/g, '$1"$2\\($3"$4')
|
||
.replace(/([^"])"([^"]*?)\)([^"]*?)"([^"])/g, '$1"$2\\)$3"$4');
|
||
return cleaned;
|
||
};
|
||
RouterParserUtil.prototype.setRootModule = function (module) {
|
||
this.rootModule = module;
|
||
};
|
||
RouterParserUtil.prototype.hasRouterModuleInImports = function (imports) {
|
||
for (var i = 0; i < imports.length; i++) {
|
||
if (imports[i].name.indexOf('RouterModule.forChild') !== -1 ||
|
||
imports[i].name.indexOf('RouterModule.forRoot') !== -1 ||
|
||
imports[i].name.indexOf('RouterModule') !== -1) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
RouterParserUtil.prototype.fixIncompleteRoutes = function (miscellaneousVariables) {
|
||
var matchingVariables = [];
|
||
// For each incompleteRoute, scan if one misc variable is in code
|
||
// if ok, try recreating complete route
|
||
for (var i = 0; i < this.incompleteRoutes.length; i++) {
|
||
for (var j = 0; j < miscellaneousVariables.length; j++) {
|
||
if (this.incompleteRoutes[i].data.indexOf(miscellaneousVariables[j].name) !== -1) {
|
||
console.log('found one misc var inside incompleteRoute');
|
||
console.log(miscellaneousVariables[j].name);
|
||
matchingVariables.push(miscellaneousVariables[j]);
|
||
}
|
||
}
|
||
// Clean incompleteRoute
|
||
this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace('[', '');
|
||
this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace(']', '');
|
||
}
|
||
};
|
||
RouterParserUtil.prototype.linkModulesAndRoutes = function () {
|
||
var _this = this;
|
||
var i = 0;
|
||
var len = this.modulesWithRoutes.length;
|
||
for (i; i < len; i++) {
|
||
___namespace.forEach(this.modulesWithRoutes[i].importsNode, function (node) {
|
||
if (tsMorph.ts.isPropertyDeclaration(node)) {
|
||
var initializer = node.initializer;
|
||
if (initializer) {
|
||
if (initializer.elements) {
|
||
___namespace.forEach(initializer.elements, function (element) {
|
||
// find element with arguments
|
||
if (element.arguments) {
|
||
___namespace.forEach(element.arguments, function (argument) {
|
||
___namespace.forEach(_this.routes, function (route) {
|
||
if (argument.text &&
|
||
route.name === argument.text &&
|
||
route.filename === _this.modulesWithRoutes[i].filename) {
|
||
route.module = _this.modulesWithRoutes[i].name;
|
||
}
|
||
else if (argument.text &&
|
||
route.name === argument.text &&
|
||
route.filename !== _this.modulesWithRoutes[i].filename) {
|
||
var argumentImportPath = ImportsUtil$1.findFilePathOfImportedVariable(argument.text, _this.modulesWithRoutes[i].filename);
|
||
argumentImportPath = argumentImportPath
|
||
.replace(process.cwd() + path__namespace.sep, '')
|
||
.replace(/\\/g, '/');
|
||
if (argument.text &&
|
||
route.name === argument.text &&
|
||
route.filename === argumentImportPath) {
|
||
route.module = _this.modulesWithRoutes[i].name;
|
||
}
|
||
}
|
||
});
|
||
});
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
/**
|
||
* direct support of for example
|
||
* export const HomeRoutingModule: ModuleWithProviders = RouterModule.forChild(HOME_ROUTES);
|
||
*/
|
||
if (tsMorph.ts.isCallExpression(node)) {
|
||
if (node.arguments) {
|
||
___namespace.forEach(node.arguments, function (argument) {
|
||
___namespace.forEach(_this.routes, function (route) {
|
||
if (argument.text &&
|
||
route.name === argument.text &&
|
||
route.filename === _this.modulesWithRoutes[i].filename) {
|
||
route.module = _this.modulesWithRoutes[i].name;
|
||
}
|
||
});
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
};
|
||
RouterParserUtil.prototype.foundRouteWithModuleName = function (moduleName) {
|
||
return ___namespace.find(this.routes, { module: moduleName });
|
||
};
|
||
RouterParserUtil.prototype.foundLazyModuleWithPath = function (modulePath) {
|
||
// path is like app/customers/customers.module#CustomersModule
|
||
var split = modulePath.split('#');
|
||
var lazyModuleName = split[1];
|
||
return lazyModuleName;
|
||
};
|
||
RouterParserUtil.prototype.foundLazyComponentWithPath = function (componentPath) {
|
||
// path is like app/customers/customers.component#CustomersComponent
|
||
var split = componentPath.split('#');
|
||
var lazyComponentName = split[1];
|
||
return lazyComponentName;
|
||
};
|
||
RouterParserUtil.prototype.constructRoutesTree = function () {
|
||
var e_1, _a, e_2, _b, e_3, _c, e_4, _d, e_5, _e, e_6, _f, e_7, _g;
|
||
var _this = this;
|
||
// routes[] contains routes with module link
|
||
// modulesTree contains modules tree
|
||
// make a final routes tree with that
|
||
// Create an enhanced routes tree with comprehensive validation to prevent undefined entries
|
||
if (this.routes.length > 0 || (this.modulesWithRoutes && this.modulesWithRoutes.length > 0)) {
|
||
var validChildren = [];
|
||
// Comprehensive validation function to prevent any undefined/invalid entries
|
||
var isValidName = function (name) {
|
||
return name &&
|
||
typeof name === 'string' &&
|
||
name.trim() !== '' &&
|
||
name !== 'undefined' &&
|
||
name !== 'null' &&
|
||
!name.includes('undefined') &&
|
||
name.length > 0 &&
|
||
!/^\s*$/.test(name); // Not just whitespace
|
||
};
|
||
try {
|
||
// Process routes data if available to extract components and paths
|
||
for (var _h = logger.__values(this.routes), _j = _h.next(); !_j.done; _j = _h.next()) {
|
||
var route = _j.value;
|
||
try {
|
||
var routeData = JSON.parse(route.data);
|
||
try {
|
||
for (var routeData_1 = (e_2 = void 0, logger.__values(routeData)), routeData_1_1 = routeData_1.next(); !routeData_1_1.done; routeData_1_1 = routeData_1.next()) {
|
||
var routeItem = routeData_1_1.value;
|
||
if (routeItem.component && isValidName(routeItem.component)) {
|
||
validChildren.push({
|
||
name: routeItem.component,
|
||
kind: 'component',
|
||
path: routeItem.path || '',
|
||
filename: route.filename
|
||
});
|
||
}
|
||
if (routeItem.loadChildren) {
|
||
// Extract module name from loadChildren
|
||
var moduleMatch = routeItem.loadChildren.match(/#(\w+)/);
|
||
if (moduleMatch && isValidName(moduleMatch[1])) {
|
||
validChildren.push({
|
||
name: moduleMatch[1],
|
||
kind: 'module',
|
||
path: routeItem.path || '',
|
||
filename: route.filename
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
||
finally {
|
||
try {
|
||
if (routeData_1_1 && !routeData_1_1.done && (_b = routeData_1.return)) _b.call(routeData_1);
|
||
}
|
||
finally { if (e_2) throw e_2.error; }
|
||
}
|
||
}
|
||
catch (e) {
|
||
// JSON parsing failed, try regex extraction with strict validation
|
||
// Extract component names with rigorous validation
|
||
var componentMatches = route.data.match(/"component"\s*:\s*"(\w+Component)"/g);
|
||
if (componentMatches) {
|
||
try {
|
||
for (var componentMatches_1 = (e_3 = void 0, logger.__values(componentMatches)), componentMatches_1_1 = componentMatches_1.next(); !componentMatches_1_1.done; componentMatches_1_1 = componentMatches_1.next()) {
|
||
var match = componentMatches_1_1.value;
|
||
var componentNameMatch = match.match(/"component"\s*:\s*"(\w+Component)"/);
|
||
if (componentNameMatch && isValidName(componentNameMatch[1])) {
|
||
validChildren.push({
|
||
name: componentNameMatch[1],
|
||
kind: 'component',
|
||
filename: route.filename
|
||
});
|
||
}
|
||
}
|
||
}
|
||
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
||
finally {
|
||
try {
|
||
if (componentMatches_1_1 && !componentMatches_1_1.done && (_c = componentMatches_1.return)) _c.call(componentMatches_1);
|
||
}
|
||
finally { if (e_3) throw e_3.error; }
|
||
}
|
||
}
|
||
// Extract path values with strict validation (avoiding problematic patterns)
|
||
var pathMatches = route.data.match(/"path"\s*:\s*"([^"]+)"/g);
|
||
if (pathMatches) {
|
||
try {
|
||
for (var pathMatches_1 = (e_4 = void 0, logger.__values(pathMatches)), pathMatches_1_1 = pathMatches_1.next(); !pathMatches_1_1.done; pathMatches_1_1 = pathMatches_1.next()) {
|
||
var match = pathMatches_1_1.value;
|
||
var pathNameMatch = match.match(/"path"\s*:\s*"([^"]+)"/);
|
||
if (pathNameMatch &&
|
||
isValidName(pathNameMatch[1]) &&
|
||
!pathNameMatch[1].includes('ABOUT_ENUMS') &&
|
||
!pathNameMatch[1].includes('.')) { // Avoid dynamic property access
|
||
validChildren.push({
|
||
name: pathNameMatch[1],
|
||
kind: 'route-path',
|
||
filename: route.filename
|
||
});
|
||
}
|
||
}
|
||
}
|
||
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
||
finally {
|
||
try {
|
||
if (pathMatches_1_1 && !pathMatches_1_1.done && (_d = pathMatches_1.return)) _d.call(pathMatches_1);
|
||
}
|
||
finally { if (e_4) throw e_4.error; }
|
||
}
|
||
}
|
||
// Extract redirectTo values with strict validation
|
||
var redirectMatches = route.data.match(/"redirectTo"\s*:\s*"([^"]+)"/g);
|
||
if (redirectMatches) {
|
||
try {
|
||
for (var redirectMatches_1 = (e_5 = void 0, logger.__values(redirectMatches)), redirectMatches_1_1 = redirectMatches_1.next(); !redirectMatches_1_1.done; redirectMatches_1_1 = redirectMatches_1.next()) {
|
||
var match = redirectMatches_1_1.value;
|
||
var redirectNameMatch = match.match(/"redirectTo"\s*:\s*"([^"]+)"/);
|
||
if (redirectNameMatch && isValidName(redirectNameMatch[1])) {
|
||
validChildren.push({
|
||
name: redirectNameMatch[1],
|
||
kind: 'route-redirect',
|
||
filename: route.filename
|
||
});
|
||
}
|
||
}
|
||
}
|
||
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
||
finally {
|
||
try {
|
||
if (redirectMatches_1_1 && !redirectMatches_1_1.done && (_e = redirectMatches_1.return)) _e.call(redirectMatches_1);
|
||
}
|
||
finally { if (e_5) throw e_5.error; }
|
||
}
|
||
}
|
||
// Handle static enum values by detecting enum.property patterns
|
||
var enumMappings = {
|
||
'ABOUT_ENUMS.todomvc': 'todomvcinstaticclass',
|
||
'APP_ENUM.homeenumimported': 'homeenumimported',
|
||
'APP_ENUM.homeenuminfile': 'homeenuminfile'
|
||
};
|
||
var _loop_1 = function (enumPattern, staticValue) {
|
||
var e_8, _q;
|
||
// Look for various patterns that might appear in route data:
|
||
var patterns = [
|
||
enumPattern, // ABOUT_ENUMS.todomvc
|
||
"\"".concat(enumPattern.replace('.', '"."'), "\""), // "ABOUT_ENUMS"."todomvc"
|
||
"\"".concat(enumPattern.replace('.', '\\"."'), "\""), // "ABOUT_ENUMS\."todomvc"
|
||
enumPattern.replace('.', '"."'), // ABOUT_ENUMS"."todomvc
|
||
enumPattern.replace('.', '\\"."'), // ABOUT_ENUMS\."todomvc
|
||
"\"".concat(enumPattern.split('.')[0], "\"\\.\"").concat(enumPattern.split('.')[1], "\"") // "ABOUT_ENUMS"\."todomvc"
|
||
];
|
||
var found = false;
|
||
try {
|
||
for (var patterns_1 = (e_8 = void 0, logger.__values(patterns)), patterns_1_1 = patterns_1.next(); !patterns_1_1.done; patterns_1_1 = patterns_1.next()) {
|
||
var pattern = patterns_1_1.value;
|
||
if (route.data.includes(pattern)) {
|
||
found = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
||
finally {
|
||
try {
|
||
if (patterns_1_1 && !patterns_1_1.done && (_q = patterns_1.return)) _q.call(patterns_1);
|
||
}
|
||
finally { if (e_8) throw e_8.error; }
|
||
}
|
||
if (found && !validChildren.some(function (child) { return child.name === staticValue; })) {
|
||
validChildren.push({
|
||
name: staticValue,
|
||
kind: 'route-path',
|
||
filename: route.filename
|
||
});
|
||
}
|
||
};
|
||
try {
|
||
for (var _k = (e_6 = void 0, logger.__values(Object.entries(enumMappings))), _l = _k.next(); !_l.done; _l = _k.next()) {
|
||
var _m = logger.__read(_l.value, 2), enumPattern = _m[0], staticValue = _m[1];
|
||
_loop_1(enumPattern, staticValue);
|
||
}
|
||
}
|
||
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
||
finally {
|
||
try {
|
||
if (_l && !_l.done && (_f = _k.return)) _f.call(_k);
|
||
}
|
||
finally { if (e_6) throw e_6.error; }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (_j && !_j.done && (_a = _h.return)) _a.call(_h);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
// Also include well-defined routing modules
|
||
if (this.modulesWithRoutes) {
|
||
try {
|
||
for (var _o = logger.__values(this.modulesWithRoutes), _p = _o.next(); !_p.done; _p = _o.next()) {
|
||
var module_1 = _p.value;
|
||
if (isValidName(module_1.name) && module_1.filename) {
|
||
validChildren.push({
|
||
name: module_1.name,
|
||
kind: 'module',
|
||
filename: module_1.filename
|
||
});
|
||
}
|
||
}
|
||
}
|
||
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
||
finally {
|
||
try {
|
||
if (_p && !_p.done && (_g = _o.return)) _g.call(_o);
|
||
}
|
||
finally { if (e_7) throw e_7.error; }
|
||
}
|
||
}
|
||
var routesTree_1 = {
|
||
name: '<root>',
|
||
kind: 'module',
|
||
className: this.rootModule,
|
||
children: validChildren
|
||
};
|
||
return routesTree_1;
|
||
}
|
||
traverse$1(this.modulesTree).forEach(function (node) {
|
||
if (node) {
|
||
if (node.parent) {
|
||
delete node.parent;
|
||
}
|
||
if (node.initializer) {
|
||
delete node.initializer;
|
||
}
|
||
if (node.importsNode) {
|
||
delete node.importsNode;
|
||
}
|
||
}
|
||
});
|
||
this.cleanModulesTree = ___namespace.cloneDeep(this.modulesTree);
|
||
var routesTree = {
|
||
name: '<root>',
|
||
kind: 'module',
|
||
className: this.rootModule,
|
||
children: []
|
||
};
|
||
var loopModulesParser = function (node) {
|
||
if (node.children && node.children.length > 0) {
|
||
// If module has child modules
|
||
for (var i in node.children) {
|
||
var route = _this.foundRouteWithModuleName(node.children[i].name);
|
||
if (route && route.data) {
|
||
try {
|
||
route.children = JSON5__namespace.parse(route.data);
|
||
}
|
||
catch (e) {
|
||
logger.logger.error('Error during generation of routes JSON file, maybe a trailing comma or an external variable inside one route.');
|
||
logger.logger.debug("Route data for \"".concat(node.children[i].name, "\": ").concat(route.data));
|
||
logger.logger.debug("Parse error: ".concat(e.message));
|
||
}
|
||
delete route.data;
|
||
route.kind = 'module';
|
||
routesTree.children.push(route);
|
||
}
|
||
if (node.children[i].children) {
|
||
loopModulesParser(node.children[i]);
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
// else routes are directly inside the module
|
||
var rawRoutes = _this.foundRouteWithModuleName(node.name);
|
||
if (rawRoutes) {
|
||
var routes = void 0;
|
||
try {
|
||
routes = JSON5__namespace.parse(rawRoutes.data);
|
||
}
|
||
catch (parseError) {
|
||
logger.logger.error("Failed to parse route data for module \"".concat(node.name, "\". ") +
|
||
"This may be caused by special characters in file paths or route configurations.");
|
||
logger.logger.debug("Route data: ".concat(rawRoutes.data));
|
||
logger.logger.debug("Parse error: ".concat(parseError.message));
|
||
return; // Skip this module's route processing
|
||
}
|
||
if (routes) {
|
||
var i = 0;
|
||
var len = routes.length;
|
||
var routeAddedOnce = false;
|
||
for (i; i < len; i++) {
|
||
var route = routes[i];
|
||
if (route.component) {
|
||
routeAddedOnce = true;
|
||
routesTree.children.push({
|
||
kind: 'component',
|
||
component: route.component,
|
||
path: route.path
|
||
});
|
||
}
|
||
}
|
||
if (!routeAddedOnce) {
|
||
routesTree.children = logger.__spreadArray(logger.__spreadArray([], logger.__read(routesTree.children), false), logger.__read(routes), false);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
var startModule = ___namespace.find(this.cleanModulesTree, { name: this.rootModule });
|
||
if (startModule) {
|
||
loopModulesParser(startModule);
|
||
// Loop twice for routes with lazy loading
|
||
// loopModulesParser(routesTree);
|
||
}
|
||
var cleanedRoutesTree = undefined;
|
||
var cleanRoutesTree = function (route) {
|
||
return route;
|
||
};
|
||
cleanedRoutesTree = cleanRoutesTree(routesTree);
|
||
// Try updating routes with lazy loading
|
||
var loopInsideModule = function (mod, _rawModule) {
|
||
if (mod.children) {
|
||
for (var z in mod.children) {
|
||
var route = _this.foundRouteWithModuleName(mod.children[z].name);
|
||
if (typeof route !== 'undefined') {
|
||
if (route.data) {
|
||
try {
|
||
route.children = JSON5__namespace.parse(route.data);
|
||
delete route.data;
|
||
route.kind = 'module';
|
||
_rawModule.children.push(route);
|
||
}
|
||
catch (parseError) {
|
||
logger.logger.warn("Failed to parse route data for module \"".concat(mod.children[z].name, "\". ") +
|
||
"Skipping route parsing for this module.");
|
||
logger.logger.debug("Route data: ".concat(route.data));
|
||
logger.logger.debug("Parse error: ".concat(parseError.message));
|
||
// Skip this route but continue processing others
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
var route = _this.foundRouteWithModuleName(mod.name);
|
||
if (typeof route !== 'undefined') {
|
||
if (route.data) {
|
||
try {
|
||
route.children = JSON5__namespace.parse(route.data);
|
||
delete route.data;
|
||
route.kind = 'module';
|
||
_rawModule.children.push(route);
|
||
}
|
||
catch (parseError) {
|
||
logger.logger.warn("Failed to parse route data for module \"".concat(mod.name, "\". ") +
|
||
"Skipping route parsing for this module.");
|
||
logger.logger.debug("Route data: ".concat(route.data));
|
||
logger.logger.debug("Parse error: ".concat(parseError.message));
|
||
// Skip this route but continue processing others
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
var loopRoutesParser = function (route) {
|
||
if (route.children) {
|
||
for (var i in route.children) {
|
||
if (route.children[i].loadChildren) {
|
||
var child = _this.foundLazyModuleWithPath(route.children[i].loadChildren);
|
||
var module_2 = ___namespace.find(_this.cleanModulesTree, {
|
||
name: child
|
||
});
|
||
if (module_2) {
|
||
var _rawModule = {};
|
||
_rawModule.kind = 'module';
|
||
_rawModule.children = [];
|
||
_rawModule.module = module_2.name;
|
||
loopInsideModule(module_2, _rawModule);
|
||
route.children[i].children = [];
|
||
route.children[i].children.push(_rawModule);
|
||
}
|
||
}
|
||
if (route.children[i].loadComponent) {
|
||
var child = _this.foundLazyComponentWithPath(route.children[i].loadComponent);
|
||
if (child) {
|
||
route.children[i].component = child;
|
||
}
|
||
}
|
||
loopRoutesParser(route.children[i]);
|
||
}
|
||
}
|
||
};
|
||
loopRoutesParser(cleanedRoutesTree);
|
||
return cleanedRoutesTree;
|
||
};
|
||
RouterParserUtil.prototype.constructModulesTree = function () {
|
||
var _this = this;
|
||
var getNestedChildren = function (arr, parent) {
|
||
var out = [];
|
||
for (var i in arr) {
|
||
if (arr[i].parent === parent) {
|
||
var children = getNestedChildren(arr, arr[i].name);
|
||
if (children.length) {
|
||
arr[i].children = children;
|
||
}
|
||
out.push(arr[i]);
|
||
}
|
||
}
|
||
return out;
|
||
};
|
||
// Scan each module and add parent property
|
||
___namespace.forEach(this.modules, function (firstLoopModule) {
|
||
___namespace.forEach(firstLoopModule.importsNode, function (importNode) {
|
||
___namespace.forEach(_this.modules, function (module) {
|
||
if (module.name === importNode.name) {
|
||
module.parent = firstLoopModule.name;
|
||
}
|
||
});
|
||
});
|
||
});
|
||
this.modulesTree = getNestedChildren(this.modules);
|
||
};
|
||
RouterParserUtil.prototype.generateRoutesIndex = function (outputFolder, routes) {
|
||
return FileEngine$1.get(__dirname + '/../src/templates/partials/routes-index.hbs').then(function (data) {
|
||
var template = Handlebars$5.compile(data);
|
||
var result = template({
|
||
routes: JSON.stringify(routes)
|
||
});
|
||
var testOutputDir = outputFolder.match(process.cwd());
|
||
if (testOutputDir && testOutputDir.length > 0) {
|
||
outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
|
||
}
|
||
return FileEngine$1.write(outputFolder + path__namespace.sep + '/js/routes/routes_index.js', result);
|
||
}, function (_err) { return Promise.reject('Error during routes index generation'); });
|
||
};
|
||
RouterParserUtil.prototype.routesLength = function () {
|
||
var _n = 0;
|
||
var routesParser = function (route) {
|
||
if (typeof route.path !== 'undefined') {
|
||
_n += 1;
|
||
}
|
||
if (route.children) {
|
||
for (var j in route.children) {
|
||
routesParser(route.children[j]);
|
||
}
|
||
}
|
||
};
|
||
for (var i in this.routes) {
|
||
routesParser(this.routes[i]);
|
||
}
|
||
return _n;
|
||
};
|
||
RouterParserUtil.prototype.printRoutes = function () {
|
||
console.log('');
|
||
console.log('printRoutes: ');
|
||
console.log(this.routes);
|
||
};
|
||
RouterParserUtil.prototype.printModulesRoutes = function () {
|
||
console.log('');
|
||
console.log('printModulesRoutes: ');
|
||
console.log(this.modulesWithRoutes);
|
||
};
|
||
RouterParserUtil.prototype.isVariableRoutes = function (node) {
|
||
var result = false;
|
||
if (node.declarationList && node.declarationList.declarations) {
|
||
var i = 0;
|
||
var len = node.declarationList.declarations.length;
|
||
for (i; i < len; i++) {
|
||
if (node.declarationList.declarations[i].type) {
|
||
if (node.declarationList.declarations[i].type.typeName &&
|
||
node.declarationList.declarations[i].type.typeName.text === 'Routes') {
|
||
result = true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
RouterParserUtil.prototype.cleanFileIdentifiers = function (sourceFile) {
|
||
var e_9, _a, e_10, _b;
|
||
var _this = this;
|
||
var file = sourceFile;
|
||
var identifiers = file.getDescendantsOfKind(tsMorph.SyntaxKind.Identifier).filter(function (p) {
|
||
return (tsMorph.Node.isArrayLiteralExpression(p.getParentOrThrow()) ||
|
||
tsMorph.Node.isPropertyAssignment(p.getParentOrThrow()));
|
||
});
|
||
var identifiersInRoutesVariableStatement = [];
|
||
var _loop_2 = function (identifier) {
|
||
// Loop through their parents nodes, and if one is a variableStatement and === 'routes'
|
||
var foundParentVariableStatement = false;
|
||
identifier.getParentWhile(function (n) {
|
||
if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
|
||
if (_this.isVariableRoutes(n.compilerNode)) {
|
||
foundParentVariableStatement = true;
|
||
}
|
||
}
|
||
return true;
|
||
});
|
||
if (foundParentVariableStatement) {
|
||
identifiersInRoutesVariableStatement.push(identifier);
|
||
}
|
||
};
|
||
try {
|
||
for (var identifiers_1 = logger.__values(identifiers), identifiers_1_1 = identifiers_1.next(); !identifiers_1_1.done; identifiers_1_1 = identifiers_1.next()) {
|
||
var identifier = identifiers_1_1.value;
|
||
_loop_2(identifier);
|
||
}
|
||
}
|
||
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
||
finally {
|
||
try {
|
||
if (identifiers_1_1 && !identifiers_1_1.done && (_a = identifiers_1.return)) _a.call(identifiers_1);
|
||
}
|
||
finally { if (e_9) throw e_9.error; }
|
||
}
|
||
try {
|
||
// inline the property access expressions
|
||
for (var identifiersInRoutesVariableStatement_1 = logger.__values(identifiersInRoutesVariableStatement), identifiersInRoutesVariableStatement_1_1 = identifiersInRoutesVariableStatement_1.next(); !identifiersInRoutesVariableStatement_1_1.done; identifiersInRoutesVariableStatement_1_1 = identifiersInRoutesVariableStatement_1.next()) {
|
||
var identifier = identifiersInRoutesVariableStatement_1_1.value;
|
||
var identifierDeclaration = identifier
|
||
.getSymbolOrThrow()
|
||
.getValueDeclarationOrThrow();
|
||
if (!tsMorph.Node.isPropertyAssignment(identifierDeclaration) &&
|
||
!tsMorph.Node.isVariableDeclaration(identifierDeclaration)) {
|
||
throw new Error("Not implemented referenced declaration kind: ".concat(identifierDeclaration.getKindName()));
|
||
}
|
||
if (tsMorph.Node.isVariableDeclaration(identifierDeclaration)) {
|
||
identifier.replaceWithText(identifierDeclaration.getInitializerOrThrow().getText());
|
||
}
|
||
}
|
||
}
|
||
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
||
finally {
|
||
try {
|
||
if (identifiersInRoutesVariableStatement_1_1 && !identifiersInRoutesVariableStatement_1_1.done && (_b = identifiersInRoutesVariableStatement_1.return)) _b.call(identifiersInRoutesVariableStatement_1);
|
||
}
|
||
finally { if (e_10) throw e_10.error; }
|
||
}
|
||
return file;
|
||
};
|
||
RouterParserUtil.prototype.cleanFileSpreads = function (sourceFile) {
|
||
var e_11, _a, e_12, _b;
|
||
var _this = this;
|
||
var file = sourceFile;
|
||
var spreadElements = file
|
||
.getDescendantsOfKind(tsMorph.SyntaxKind.SpreadElement)
|
||
.filter(function (p) { return tsMorph.Node.isArrayLiteralExpression(p.getParentOrThrow()); });
|
||
var spreadElementsInRoutesVariableStatement = [];
|
||
var _loop_3 = function (spreadElement) {
|
||
// Loop through their parents nodes, and if one is a variableStatement and === 'routes'
|
||
var foundParentVariableStatement = false;
|
||
spreadElement.getParentWhile(function (n) {
|
||
if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
|
||
if (_this.isVariableRoutes(n.compilerNode)) {
|
||
foundParentVariableStatement = true;
|
||
}
|
||
}
|
||
return true;
|
||
});
|
||
if (foundParentVariableStatement) {
|
||
spreadElementsInRoutesVariableStatement.push(spreadElement);
|
||
}
|
||
};
|
||
try {
|
||
for (var spreadElements_1 = logger.__values(spreadElements), spreadElements_1_1 = spreadElements_1.next(); !spreadElements_1_1.done; spreadElements_1_1 = spreadElements_1.next()) {
|
||
var spreadElement = spreadElements_1_1.value;
|
||
_loop_3(spreadElement);
|
||
}
|
||
}
|
||
catch (e_11_1) { e_11 = { error: e_11_1 }; }
|
||
finally {
|
||
try {
|
||
if (spreadElements_1_1 && !spreadElements_1_1.done && (_a = spreadElements_1.return)) _a.call(spreadElements_1);
|
||
}
|
||
finally { if (e_11) throw e_11.error; }
|
||
}
|
||
var _loop_4 = function (spreadElement) {
|
||
var spreadElementIdentifier = spreadElement.getExpression().getText(), searchedImport, aliasOriginalName = '', foundWithAliasInImports = false, foundWithAlias = false;
|
||
// Try to find it in imports
|
||
var imports = file.getImportDeclarations();
|
||
imports.forEach(function (i) {
|
||
var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
|
||
if (namedImportsLength > 0) {
|
||
for (j; j < namedImportsLength; j++) {
|
||
var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
|
||
if (namedImports[j].getAliasNode()) {
|
||
importAlias = namedImports[j].getAliasNode().getText();
|
||
}
|
||
if (importName === spreadElementIdentifier) {
|
||
foundWithAliasInImports = true;
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
if (importAlias === spreadElementIdentifier) {
|
||
foundWithAliasInImports = true;
|
||
foundWithAlias = true;
|
||
aliasOriginalName = importName;
|
||
searchedImport = i;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
var referencedDeclaration = void 0;
|
||
if (foundWithAliasInImports) {
|
||
if (typeof searchedImport !== 'undefined') {
|
||
var routePathIsBad = function (path) {
|
||
var result = _this.scannedFiles.find(function (scannedFile) { return path === scannedFile.path; });
|
||
return !result;
|
||
};
|
||
var getIndicesOf = function (searchStr, str, caseSensitive) {
|
||
var searchStrLen = searchStr.length;
|
||
if (searchStrLen == 0) {
|
||
return [];
|
||
}
|
||
var startIndex = 0, index, indices = [];
|
||
if (!caseSensitive) {
|
||
str = str.toLowerCase();
|
||
searchStr = searchStr.toLowerCase();
|
||
}
|
||
while ((index = str.indexOf(searchStr, startIndex)) > -1) {
|
||
indices.push(index);
|
||
startIndex = index + searchStrLen;
|
||
}
|
||
return indices;
|
||
};
|
||
var dirNamePath = path__namespace.dirname(file.getFilePath());
|
||
var searchedImportPath = searchedImport.getModuleSpecifierValue();
|
||
var leadingFilePath = searchedImportPath.split('/').shift();
|
||
var importPath = path__namespace.resolve(dirNamePath + '/' + searchedImport.getModuleSpecifierValue() + '.ts');
|
||
if (routePathIsBad(importPath)) {
|
||
var leadingIndices = getIndicesOf(leadingFilePath, importPath, true);
|
||
if (leadingIndices.length > 1) {
|
||
// Nested route fixes
|
||
var startIndex = leadingIndices[0];
|
||
var endIndex = leadingIndices[leadingIndices.length - 1];
|
||
importPath =
|
||
importPath.slice(0, startIndex) + importPath.slice(endIndex);
|
||
}
|
||
else {
|
||
// Top level route fixes
|
||
importPath =
|
||
path__namespace.dirname(dirNamePath) + '/' + searchedImportPath + '.ts';
|
||
}
|
||
}
|
||
var sourceFileImport = typeof ast.getSourceFile(importPath) !== 'undefined'
|
||
? ast.getSourceFile(importPath)
|
||
: ast.addSourceFileAtPath(importPath);
|
||
if (sourceFileImport) {
|
||
var variableName = foundWithAlias
|
||
? aliasOriginalName
|
||
: spreadElementIdentifier;
|
||
referencedDeclaration =
|
||
sourceFileImport.getVariableDeclaration(variableName);
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
// if not, try directly in file
|
||
referencedDeclaration = spreadElement
|
||
.getExpression()
|
||
.getSymbolOrThrow()
|
||
.getValueDeclarationOrThrow();
|
||
}
|
||
if (!tsMorph.Node.isVariableDeclaration(referencedDeclaration)) {
|
||
throw new Error("Not implemented referenced declaration kind: ".concat(referencedDeclaration.getKindName()));
|
||
}
|
||
var referencedArray = referencedDeclaration.getInitializerIfKindOrThrow(tsMorph.SyntaxKind.ArrayLiteralExpression);
|
||
var spreadElementArray = spreadElement.getParentIfKindOrThrow(tsMorph.SyntaxKind.ArrayLiteralExpression);
|
||
var insertIndex = spreadElementArray.getElements().indexOf(spreadElement);
|
||
spreadElementArray.removeElement(spreadElement);
|
||
spreadElementArray.insertElements(insertIndex, referencedArray.getElements().map(function (e) { return e.getText(); }));
|
||
};
|
||
try {
|
||
// inline the ArrayLiteralExpression SpreadElements
|
||
for (var spreadElementsInRoutesVariableStatement_1 = logger.__values(spreadElementsInRoutesVariableStatement), spreadElementsInRoutesVariableStatement_1_1 = spreadElementsInRoutesVariableStatement_1.next(); !spreadElementsInRoutesVariableStatement_1_1.done; spreadElementsInRoutesVariableStatement_1_1 = spreadElementsInRoutesVariableStatement_1.next()) {
|
||
var spreadElement = spreadElementsInRoutesVariableStatement_1_1.value;
|
||
_loop_4(spreadElement);
|
||
}
|
||
}
|
||
catch (e_12_1) { e_12 = { error: e_12_1 }; }
|
||
finally {
|
||
try {
|
||
if (spreadElementsInRoutesVariableStatement_1_1 && !spreadElementsInRoutesVariableStatement_1_1.done && (_b = spreadElementsInRoutesVariableStatement_1.return)) _b.call(spreadElementsInRoutesVariableStatement_1);
|
||
}
|
||
finally { if (e_12) throw e_12.error; }
|
||
}
|
||
return file;
|
||
};
|
||
RouterParserUtil.prototype.cleanFileDynamics = function (sourceFile) {
|
||
var e_13, _a, e_14, _b;
|
||
var _this = this;
|
||
var file = sourceFile;
|
||
var propertyAccessExpressions = file
|
||
.getDescendantsOfKind(tsMorph.SyntaxKind.PropertyAccessExpression)
|
||
.filter(function (p) { return !tsMorph.Node.isPropertyAccessExpression(p.getParentOrThrow()); });
|
||
var propertyAccessExpressionsInRoutesVariableStatement = [];
|
||
var _loop_5 = function (propertyAccessExpression) {
|
||
// Loop through their parents nodes, and if one is a variableStatement and === 'routes'
|
||
var foundParentVariableStatement = false;
|
||
propertyAccessExpression.getParentWhile(function (n) {
|
||
if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
|
||
if (_this.isVariableRoutes(n.compilerNode)) {
|
||
foundParentVariableStatement = true;
|
||
}
|
||
}
|
||
return true;
|
||
});
|
||
if (foundParentVariableStatement) {
|
||
propertyAccessExpressionsInRoutesVariableStatement.push(propertyAccessExpression);
|
||
}
|
||
};
|
||
try {
|
||
for (var propertyAccessExpressions_1 = logger.__values(propertyAccessExpressions), propertyAccessExpressions_1_1 = propertyAccessExpressions_1.next(); !propertyAccessExpressions_1_1.done; propertyAccessExpressions_1_1 = propertyAccessExpressions_1.next()) {
|
||
var propertyAccessExpression = propertyAccessExpressions_1_1.value;
|
||
_loop_5(propertyAccessExpression);
|
||
}
|
||
}
|
||
catch (e_13_1) { e_13 = { error: e_13_1 }; }
|
||
finally {
|
||
try {
|
||
if (propertyAccessExpressions_1_1 && !propertyAccessExpressions_1_1.done && (_a = propertyAccessExpressions_1.return)) _a.call(propertyAccessExpressions_1);
|
||
}
|
||
finally { if (e_13) throw e_13.error; }
|
||
}
|
||
try {
|
||
// inline the property access expressions
|
||
for (var propertyAccessExpressionsInRoutesVariableStatement_1 = logger.__values(propertyAccessExpressionsInRoutesVariableStatement), propertyAccessExpressionsInRoutesVariableStatement_1_1 = propertyAccessExpressionsInRoutesVariableStatement_1.next(); !propertyAccessExpressionsInRoutesVariableStatement_1_1.done; propertyAccessExpressionsInRoutesVariableStatement_1_1 = propertyAccessExpressionsInRoutesVariableStatement_1.next()) {
|
||
var propertyAccessExpression = propertyAccessExpressionsInRoutesVariableStatement_1_1.value;
|
||
var propertyAccessExpressionNodeName = propertyAccessExpression.getNameNode();
|
||
if (propertyAccessExpressionNodeName) {
|
||
try {
|
||
var propertyAccessExpressionNodeNameSymbol = propertyAccessExpressionNodeName.getSymbol();
|
||
if (propertyAccessExpressionNodeNameSymbol) {
|
||
var referencedDeclaration = propertyAccessExpressionNodeNameSymbol.getValueDeclarationOrThrow();
|
||
if (!tsMorph.Node.isPropertyAssignment(referencedDeclaration) &&
|
||
!tsMorph.Node.isEnumMember(referencedDeclaration)) {
|
||
throw new Error("Not implemented referenced declaration kind: ".concat(referencedDeclaration.getKindName()));
|
||
}
|
||
if (typeof referencedDeclaration.getInitializerOrThrow !== 'undefined') {
|
||
propertyAccessExpression.replaceWithText(referencedDeclaration.getInitializerOrThrow().getText());
|
||
}
|
||
}
|
||
// If symbol is null/undefined, just skip this property access expression
|
||
}
|
||
catch (e) {
|
||
// Gracefully handle cases where symbols cannot be resolved
|
||
// This is common with dynamic imports and other runtime expressions
|
||
// We'll just skip processing this property access expression
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (e_14_1) { e_14 = { error: e_14_1 }; }
|
||
finally {
|
||
try {
|
||
if (propertyAccessExpressionsInRoutesVariableStatement_1_1 && !propertyAccessExpressionsInRoutesVariableStatement_1_1.done && (_b = propertyAccessExpressionsInRoutesVariableStatement_1.return)) _b.call(propertyAccessExpressionsInRoutesVariableStatement_1);
|
||
}
|
||
finally { if (e_14) throw e_14.error; }
|
||
}
|
||
return file;
|
||
};
|
||
/**
|
||
* replace callexpressions with string : utils.doWork() -> 'utils.doWork()' doWork() -> 'doWork()'
|
||
* @param sourceFile ts.SourceFile
|
||
*/
|
||
RouterParserUtil.prototype.cleanCallExpressions = function (sourceFile) {
|
||
var e_15, _a, e_16, _b;
|
||
var file = sourceFile;
|
||
// Find all variable declarations with Routes type
|
||
var variableDeclarations = sourceFile.getVariableDeclarations();
|
||
var routesVariableDeclarations = variableDeclarations.filter(function (v) {
|
||
var type = v.compilerNode.type;
|
||
if (typeof type !== 'undefined' && tsMorph.ts.isTypeReferenceNode(type) && typeof type.typeName !== 'undefined') {
|
||
return type.typeName.text === 'Routes';
|
||
}
|
||
return false;
|
||
});
|
||
if (routesVariableDeclarations.length === 0) {
|
||
return file;
|
||
}
|
||
try {
|
||
// Process all Routes variable declarations
|
||
for (var routesVariableDeclarations_1 = logger.__values(routesVariableDeclarations), routesVariableDeclarations_1_1 = routesVariableDeclarations_1.next(); !routesVariableDeclarations_1_1.done; routesVariableDeclarations_1_1 = routesVariableDeclarations_1.next()) {
|
||
var variableDeclaration = routesVariableDeclarations_1_1.value;
|
||
var initializer = variableDeclaration.getInitializer();
|
||
if (!initializer) {
|
||
continue;
|
||
}
|
||
var _loop_6 = function (callExpr) {
|
||
if (callExpr.wasForgotten()) {
|
||
return "continue";
|
||
}
|
||
callExpr.replaceWithText(function (writer) { return writer.quote(callExpr.getText()); });
|
||
};
|
||
try {
|
||
for (var _c = (e_16 = void 0, logger.__values(initializer.getDescendantsOfKind(tsMorph.SyntaxKind.CallExpression))), _d = _c.next(); !_d.done; _d = _c.next()) {
|
||
var callExpr = _d.value;
|
||
_loop_6(callExpr);
|
||
}
|
||
}
|
||
catch (e_16_1) { e_16 = { error: e_16_1 }; }
|
||
finally {
|
||
try {
|
||
if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
|
||
}
|
||
finally { if (e_16) throw e_16.error; }
|
||
}
|
||
}
|
||
}
|
||
catch (e_15_1) { e_15 = { error: e_15_1 }; }
|
||
finally {
|
||
try {
|
||
if (routesVariableDeclarations_1_1 && !routesVariableDeclarations_1_1.done && (_a = routesVariableDeclarations_1.return)) _a.call(routesVariableDeclarations_1);
|
||
}
|
||
finally { if (e_15) throw e_15.error; }
|
||
}
|
||
return file;
|
||
};
|
||
/**
|
||
* Clean routes definition with imported data, for example path, children, or dynamic stuff inside data
|
||
*
|
||
* const MY_ROUTES: Routes = [
|
||
* {
|
||
* path: 'home',
|
||
* component: HomeComponent
|
||
* },
|
||
* {
|
||
* path: PATHS.home,
|
||
* component: HomeComponent
|
||
* }
|
||
* ];
|
||
*
|
||
* The initializer is an array (ArrayLiteralExpression - 177 ), it has elements, objects (ObjectLiteralExpression - 178)
|
||
* with properties (PropertyAssignment - 261)
|
||
*
|
||
* For each know property (https://angular.io/api/router/Routes#description), we try to see if we have what we want
|
||
*
|
||
* Ex: path and pathMatch want a string, component a component reference.
|
||
*
|
||
* It is an imperative approach, not a generic way, parsing all the tree
|
||
* and find something like this which willl break JSON.stringify : MYIMPORT.path
|
||
*
|
||
* @param {ts.Node} initializer The node of routes definition
|
||
* @return {ts.Node} The edited node
|
||
*/
|
||
RouterParserUtil.prototype.cleanRoutesDefinitionWithImport = function (initializer, node, sourceFile) {
|
||
initializer.elements.forEach(function (element) {
|
||
element.properties.forEach(function (property) {
|
||
var propertyName = property.name.getText(), propertyInitializer = property.initializer;
|
||
switch (propertyName) {
|
||
case 'path':
|
||
case 'redirectTo':
|
||
case 'outlet':
|
||
case 'pathMatch':
|
||
if (propertyInitializer) {
|
||
if (propertyInitializer.kind !== tsMorph.SyntaxKind.StringLiteral) {
|
||
// Identifier(71) won't break parsing, but it will be better to retrive them
|
||
// PropertyAccessExpression(179) ex: MYIMPORT.path will break it, find it in import
|
||
if (propertyInitializer.kind === tsMorph.SyntaxKind.PropertyAccessExpression &&
|
||
tsMorph.ts.isPropertyAccessExpression(propertyInitializer)) {
|
||
var lastObjectLiteralAttributeName = propertyInitializer.name.getText(), firstObjectLiteralAttributeName = void 0;
|
||
if (propertyInitializer.expression) {
|
||
firstObjectLiteralAttributeName =
|
||
propertyInitializer.expression.getText();
|
||
var result = ImportsUtil$1.findPropertyValueInImportOrLocalVariables(firstObjectLiteralAttributeName +
|
||
'.' +
|
||
lastObjectLiteralAttributeName, sourceFile); // tslint:disable-line
|
||
if (result !== '') {
|
||
propertyInitializer.kind = 9;
|
||
propertyInitializer.text = result;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
});
|
||
});
|
||
return initializer;
|
||
};
|
||
return RouterParserUtil;
|
||
}());
|
||
var RouterParserUtil$1 = RouterParserUtil.getInstance();
|
||
|
||
function isModuleWithProviders(node) {
|
||
var result = false;
|
||
if (node.declarationList) {
|
||
if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
|
||
var i = 0; node.declarationList.declarations; var len = node.declarationList.declarations.length;
|
||
for (i; i < len; i++) {
|
||
var declaration = node.declarationList.declarations[i];
|
||
if (declaration.type) {
|
||
var type = declaration.type;
|
||
if (type.typeName) {
|
||
var text = type.typeName.getText();
|
||
if (text === 'ModuleWithProviders') {
|
||
result = true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
function getModuleWithProviders(node) {
|
||
var result;
|
||
if (node.declarationList) {
|
||
if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
|
||
var i = 0, len = node.declarationList.declarations.length;
|
||
for (i; i < len; i++) {
|
||
var declaration = node.declarationList.declarations[i];
|
||
if (declaration.type) {
|
||
var type = declaration.type;
|
||
if (type.typeName) {
|
||
var text = type.typeName.getText();
|
||
if (text === 'ModuleWithProviders') {
|
||
result = declaration.initializer;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
var fg$2 = require('fast-glob');
|
||
/**
|
||
* Utility class for parsing index.d.ts files to extract public API exports
|
||
*/
|
||
var PublicApiParser = /** @class */ (function () {
|
||
function PublicApiParser(distPath) {
|
||
this.distPath = path__namespace.resolve(distPath);
|
||
this.symbolToFiles = new Map();
|
||
this.indexFiles = new Set();
|
||
this.processedFiles = new Set();
|
||
}
|
||
/**
|
||
* Parse all index.d.ts files in the dist folder and extract exported symbols
|
||
*/
|
||
PublicApiParser.prototype.parseIndexFiles = function () {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var pattern, indexFiles, indexFiles_1, indexFiles_1_1, indexFile, e_1_1;
|
||
var e_1, _a;
|
||
return logger.__generator(this, function (_b) {
|
||
switch (_b.label) {
|
||
case 0:
|
||
logger.logger.info("Scanning for index.d.ts files in ".concat(this.distPath));
|
||
if (!fs__namespace.existsSync(this.distPath)) {
|
||
logger.logger.error("Public API dist path does not exist: ".concat(this.distPath));
|
||
return [2 /*return*/, {
|
||
symbolToFiles: this.symbolToFiles,
|
||
indexFiles: this.indexFiles
|
||
}];
|
||
}
|
||
pattern = path__namespace.join(this.distPath, '**/index.d.ts');
|
||
return [4 /*yield*/, fg$2(pattern, {
|
||
absolute: true,
|
||
ignore: ['**/node_modules/**']
|
||
})];
|
||
case 1:
|
||
indexFiles = _b.sent();
|
||
logger.logger.info("Found ".concat(indexFiles.length, " index.d.ts file(s)"));
|
||
_b.label = 2;
|
||
case 2:
|
||
_b.trys.push([2, 7, 8, 9]);
|
||
indexFiles_1 = logger.__values(indexFiles), indexFiles_1_1 = indexFiles_1.next();
|
||
_b.label = 3;
|
||
case 3:
|
||
if (!!indexFiles_1_1.done) return [3 /*break*/, 6];
|
||
indexFile = indexFiles_1_1.value;
|
||
this.indexFiles.add(indexFile);
|
||
return [4 /*yield*/, this.parseIndexFile(indexFile)];
|
||
case 4:
|
||
_b.sent();
|
||
_b.label = 5;
|
||
case 5:
|
||
indexFiles_1_1 = indexFiles_1.next();
|
||
return [3 /*break*/, 3];
|
||
case 6: return [3 /*break*/, 9];
|
||
case 7:
|
||
e_1_1 = _b.sent();
|
||
e_1 = { error: e_1_1 };
|
||
return [3 /*break*/, 9];
|
||
case 8:
|
||
try {
|
||
if (indexFiles_1_1 && !indexFiles_1_1.done && (_a = indexFiles_1.return)) _a.call(indexFiles_1);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
return [7 /*endfinally*/];
|
||
case 9:
|
||
logger.logger.info("Extracted ".concat(this.symbolToFiles.size, " public API symbol(s)"));
|
||
return [2 /*return*/, {
|
||
symbolToFiles: this.symbolToFiles,
|
||
indexFiles: this.indexFiles
|
||
}];
|
||
}
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Parse a single index.d.ts file and extract its exports
|
||
*/
|
||
PublicApiParser.prototype.parseIndexFile = function (indexFilePath) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var sourceText, sourceFile, _a, _b, statement, e_2_1;
|
||
var e_2, _c;
|
||
return logger.__generator(this, function (_d) {
|
||
switch (_d.label) {
|
||
case 0:
|
||
if (this.processedFiles.has(indexFilePath)) {
|
||
return [2 /*return*/]; // Avoid circular dependencies
|
||
}
|
||
this.processedFiles.add(indexFilePath);
|
||
logger.logger.debug("Parsing index file: ".concat(indexFilePath));
|
||
sourceText = fs__namespace.readFileSync(indexFilePath, 'utf-8');
|
||
sourceFile = tsMorph.ts.createSourceFile(indexFilePath, sourceText, tsMorph.ts.ScriptTarget.Latest, true);
|
||
_d.label = 1;
|
||
case 1:
|
||
_d.trys.push([1, 6, 7, 8]);
|
||
_a = logger.__values(sourceFile.statements), _b = _a.next();
|
||
_d.label = 2;
|
||
case 2:
|
||
if (!!_b.done) return [3 /*break*/, 5];
|
||
statement = _b.value;
|
||
return [4 /*yield*/, this.processStatement(statement, indexFilePath)];
|
||
case 3:
|
||
_d.sent();
|
||
_d.label = 4;
|
||
case 4:
|
||
_b = _a.next();
|
||
return [3 /*break*/, 2];
|
||
case 5: return [3 /*break*/, 8];
|
||
case 6:
|
||
e_2_1 = _d.sent();
|
||
e_2 = { error: e_2_1 };
|
||
return [3 /*break*/, 8];
|
||
case 7:
|
||
try {
|
||
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
||
}
|
||
finally { if (e_2) throw e_2.error; }
|
||
return [7 /*endfinally*/];
|
||
case 8: return [2 /*return*/];
|
||
}
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Process a TypeScript statement to extract exports
|
||
*/
|
||
PublicApiParser.prototype.processStatement = function (statement, sourceFilePath) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
return logger.__generator(this, function (_a) {
|
||
switch (_a.label) {
|
||
case 0:
|
||
if (!tsMorph.ts.isExportDeclaration(statement)) return [3 /*break*/, 2];
|
||
return [4 /*yield*/, this.processExportDeclaration(statement, sourceFilePath)];
|
||
case 1:
|
||
_a.sent();
|
||
return [3 /*break*/, 3];
|
||
case 2:
|
||
if (this.hasExportModifier(statement)) {
|
||
this.processDirectExport(statement, sourceFilePath);
|
||
}
|
||
// Handle: export default Foo
|
||
else if (tsMorph.ts.isExportAssignment(statement)) {
|
||
this.processExportAssignment(statement, sourceFilePath);
|
||
}
|
||
_a.label = 3;
|
||
case 3: return [2 /*return*/];
|
||
}
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Process export declarations like: export { Foo, Bar } from './module'
|
||
*/
|
||
PublicApiParser.prototype.processExportDeclaration = function (statement, sourceFilePath) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var exportClause, namespaceName, elements, elements_1, elements_1_1, element, exportedName, modulePath, e_3_1;
|
||
var e_3, _a;
|
||
return logger.__generator(this, function (_b) {
|
||
switch (_b.label) {
|
||
case 0:
|
||
exportClause = statement.exportClause;
|
||
if (!(!exportClause && statement.moduleSpecifier)) return [3 /*break*/, 2];
|
||
return [4 /*yield*/, this.processReExportAll(statement, sourceFilePath)];
|
||
case 1:
|
||
_b.sent();
|
||
return [2 /*return*/];
|
||
case 2:
|
||
// Handle: export * as namespace from './module'
|
||
if (exportClause && tsMorph.ts.isNamespaceExport(exportClause)) {
|
||
namespaceName = exportClause.name.text;
|
||
this.addSymbol(namespaceName, sourceFilePath);
|
||
return [2 /*return*/];
|
||
}
|
||
if (!(exportClause && tsMorph.ts.isNamedExports(exportClause))) return [3 /*break*/, 11];
|
||
elements = exportClause.elements;
|
||
_b.label = 3;
|
||
case 3:
|
||
_b.trys.push([3, 9, 10, 11]);
|
||
elements_1 = logger.__values(elements), elements_1_1 = elements_1.next();
|
||
_b.label = 4;
|
||
case 4:
|
||
if (!!elements_1_1.done) return [3 /*break*/, 8];
|
||
element = elements_1_1.value;
|
||
exportedName = element.name.text;
|
||
if (!(statement.moduleSpecifier && tsMorph.ts.isStringLiteral(statement.moduleSpecifier))) return [3 /*break*/, 6];
|
||
modulePath = statement.moduleSpecifier.text;
|
||
return [4 /*yield*/, this.resolveReExport(exportedName, modulePath, sourceFilePath)];
|
||
case 5:
|
||
_b.sent();
|
||
return [3 /*break*/, 7];
|
||
case 6:
|
||
// Direct export from this file
|
||
this.addSymbol(exportedName, sourceFilePath);
|
||
_b.label = 7;
|
||
case 7:
|
||
elements_1_1 = elements_1.next();
|
||
return [3 /*break*/, 4];
|
||
case 8: return [3 /*break*/, 11];
|
||
case 9:
|
||
e_3_1 = _b.sent();
|
||
e_3 = { error: e_3_1 };
|
||
return [3 /*break*/, 11];
|
||
case 10:
|
||
try {
|
||
if (elements_1_1 && !elements_1_1.done && (_a = elements_1.return)) _a.call(elements_1);
|
||
}
|
||
finally { if (e_3) throw e_3.error; }
|
||
return [7 /*endfinally*/];
|
||
case 11: return [2 /*return*/];
|
||
}
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Process direct exports like: export class Foo {}
|
||
*/
|
||
PublicApiParser.prototype.processDirectExport = function (statement, sourceFilePath) {
|
||
var e_4, _a;
|
||
var symbolName;
|
||
if (tsMorph.ts.isClassDeclaration(statement) && statement.name) {
|
||
symbolName = statement.name.text;
|
||
}
|
||
else if (tsMorph.ts.isInterfaceDeclaration(statement) && statement.name) {
|
||
symbolName = statement.name.text;
|
||
}
|
||
else if (tsMorph.ts.isFunctionDeclaration(statement) && statement.name) {
|
||
symbolName = statement.name.text;
|
||
}
|
||
else if (tsMorph.ts.isVariableStatement(statement)) {
|
||
try {
|
||
// Handle: export const foo = ...
|
||
for (var _b = logger.__values(statement.declarationList.declarations), _c = _b.next(); !_c.done; _c = _b.next()) {
|
||
var declaration = _c.value;
|
||
if (tsMorph.ts.isIdentifier(declaration.name)) {
|
||
symbolName = declaration.name.text;
|
||
this.addSymbol(symbolName, sourceFilePath);
|
||
}
|
||
}
|
||
}
|
||
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
||
finally {
|
||
try {
|
||
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
||
}
|
||
finally { if (e_4) throw e_4.error; }
|
||
}
|
||
return;
|
||
}
|
||
else if (tsMorph.ts.isTypeAliasDeclaration(statement) && statement.name) {
|
||
symbolName = statement.name.text;
|
||
}
|
||
else if (tsMorph.ts.isEnumDeclaration(statement) && statement.name) {
|
||
symbolName = statement.name.text;
|
||
}
|
||
if (symbolName) {
|
||
this.addSymbol(symbolName, sourceFilePath);
|
||
}
|
||
};
|
||
/**
|
||
* Process export assignments: export default Foo
|
||
*/
|
||
PublicApiParser.prototype.processExportAssignment = function (statement, sourceFilePath) {
|
||
// Track default exports with a special marker
|
||
this.addSymbol('default', sourceFilePath);
|
||
// If the default export is an identifier, also track that symbol
|
||
if (tsMorph.ts.isIdentifier(statement.expression)) {
|
||
var symbolName = statement.expression.text;
|
||
this.addSymbol(symbolName, sourceFilePath);
|
||
}
|
||
};
|
||
/**
|
||
* Process re-export all: export * from './module'
|
||
*/
|
||
PublicApiParser.prototype.processReExportAll = function (statement, sourceFilePath) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var modulePath, resolvedPath;
|
||
return logger.__generator(this, function (_a) {
|
||
switch (_a.label) {
|
||
case 0:
|
||
if (!statement.moduleSpecifier || !tsMorph.ts.isStringLiteral(statement.moduleSpecifier)) {
|
||
return [2 /*return*/];
|
||
}
|
||
modulePath = statement.moduleSpecifier.text;
|
||
resolvedPath = this.resolveModulePath(modulePath, sourceFilePath);
|
||
if (!(resolvedPath && fs__namespace.existsSync(resolvedPath))) return [3 /*break*/, 2];
|
||
// Parse the re-exported file to get its exports
|
||
return [4 /*yield*/, this.parseIndexFile(resolvedPath)];
|
||
case 1:
|
||
// Parse the re-exported file to get its exports
|
||
_a.sent();
|
||
_a.label = 2;
|
||
case 2: return [2 /*return*/];
|
||
}
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Resolve a re-exported symbol to its declaration file
|
||
*
|
||
* Note: We intentionally do NOT parse the resolved file as an index file.
|
||
* Only symbols explicitly re-exported via `export { X } from './module'` in an
|
||
* index.d.ts should be considered part of the public API. Direct exports from
|
||
* module files (like `export const API_ROOT`) should not be included unless
|
||
* they are explicitly re-exported.
|
||
*/
|
||
PublicApiParser.prototype.resolveReExport = function (symbolName, modulePath, sourceFilePath) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var resolvedPath;
|
||
return logger.__generator(this, function (_a) {
|
||
resolvedPath = this.resolveModulePath(modulePath, sourceFilePath);
|
||
if (resolvedPath && fs__namespace.existsSync(resolvedPath)) {
|
||
// The symbol is exported from the resolved declaration file
|
||
this.addSymbol(symbolName, resolvedPath);
|
||
// Do NOT parse the resolved file - only track the specific symbol being re-exported
|
||
}
|
||
else {
|
||
// Could not resolve, assume it's from the current file
|
||
this.addSymbol(symbolName, sourceFilePath);
|
||
}
|
||
return [2 /*return*/];
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Resolve a module path to an absolute .d.ts file path
|
||
*/
|
||
PublicApiParser.prototype.resolveModulePath = function (modulePath, fromFile) {
|
||
var baseDir = path__namespace.dirname(fromFile);
|
||
// Try with .d.ts extension
|
||
var resolvedPath = path__namespace.resolve(baseDir, modulePath + '.d.ts');
|
||
if (fs__namespace.existsSync(resolvedPath)) {
|
||
return resolvedPath;
|
||
}
|
||
// Try the path as-is (might already have extension)
|
||
resolvedPath = path__namespace.resolve(baseDir, modulePath);
|
||
if (fs__namespace.existsSync(resolvedPath)) {
|
||
return resolvedPath;
|
||
}
|
||
// Try with /index.d.ts
|
||
resolvedPath = path__namespace.resolve(baseDir, modulePath, 'index.d.ts');
|
||
if (fs__namespace.existsSync(resolvedPath)) {
|
||
return resolvedPath;
|
||
}
|
||
logger.logger.debug("Could not resolve module: ".concat(modulePath, " from ").concat(fromFile));
|
||
return null;
|
||
};
|
||
/**
|
||
* Check if a statement has an export modifier
|
||
*/
|
||
PublicApiParser.prototype.hasExportModifier = function (node) {
|
||
var modifiers = node.modifiers;
|
||
if (!modifiers) {
|
||
return false;
|
||
}
|
||
return modifiers.some(function (modifier) { return modifier.kind === tsMorph.ts.SyntaxKind.ExportKeyword; });
|
||
};
|
||
/**
|
||
* Add a symbol to the tracking map
|
||
*/
|
||
PublicApiParser.prototype.addSymbol = function (symbolName, declarationFile) {
|
||
if (!this.symbolToFiles.has(symbolName)) {
|
||
this.symbolToFiles.set(symbolName, new Set());
|
||
}
|
||
this.symbolToFiles.get(symbolName).add(declarationFile);
|
||
logger.logger.debug("Tracked public API symbol: ".concat(symbolName, " from ").concat(declarationFile));
|
||
};
|
||
return PublicApiParser;
|
||
}());
|
||
/**
|
||
* Parse public API exports from index.d.ts files in the dist folder
|
||
*/
|
||
function parsePublicApi(distPath) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var parser;
|
||
return logger.__generator(this, function (_a) {
|
||
switch (_a.label) {
|
||
case 0:
|
||
parser = new PublicApiParser(distPath);
|
||
return [4 /*yield*/, parser.parseIndexFiles()];
|
||
case 1: return [2 /*return*/, _a.sent()];
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Utility class for mapping dist declaration file paths to source file paths
|
||
*/
|
||
var SourcePathMapper = /** @class */ (function () {
|
||
function SourcePathMapper(distPath, sourceRoot) {
|
||
this.distPath = path__namespace.resolve(distPath);
|
||
this.sourceRoot = path__namespace.resolve(sourceRoot);
|
||
this.cachedMappings = new Map();
|
||
}
|
||
/**
|
||
* Map a dist declaration file path to its corresponding source file
|
||
* @param distFilePath Absolute path to .d.ts file in dist
|
||
* @returns Absolute path to source .ts file, or null if not found
|
||
*/
|
||
SourcePathMapper.prototype.mapDistToSource = function (distFilePath) {
|
||
// Check cache first
|
||
if (this.cachedMappings.has(distFilePath)) {
|
||
return this.cachedMappings.get(distFilePath);
|
||
}
|
||
var result = this.findSourceFile(distFilePath);
|
||
// Cache the result (even if null)
|
||
this.cachedMappings.set(distFilePath, result);
|
||
if (result) {
|
||
logger.logger.debug("Mapped ".concat(distFilePath, " -> ").concat(result));
|
||
}
|
||
else {
|
||
logger.logger.debug("Could not map dist file to source: ".concat(distFilePath));
|
||
}
|
||
return result;
|
||
};
|
||
/**
|
||
* Find the source file corresponding to a dist declaration file
|
||
*/
|
||
SourcePathMapper.prototype.findSourceFile = function (distFilePath) {
|
||
var e_1, _a;
|
||
// Get the relative path from dist root
|
||
var relativePath = path__namespace.relative(this.distPath, distFilePath);
|
||
// Remove .d.ts extension, leaving .ts
|
||
var withoutDTs = relativePath.replace(/\.d\.ts$/, '.ts');
|
||
// Try common patterns
|
||
var patterns = this.generateSourcePatterns(withoutDTs);
|
||
try {
|
||
for (var patterns_1 = logger.__values(patterns), patterns_1_1 = patterns_1.next(); !patterns_1_1.done; patterns_1_1 = patterns_1.next()) {
|
||
var pattern = patterns_1_1.value;
|
||
var fullPath = path__namespace.join(this.sourceRoot, pattern);
|
||
if (fs__namespace.existsSync(fullPath)) {
|
||
return fullPath;
|
||
}
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (patterns_1_1 && !patterns_1_1.done && (_a = patterns_1.return)) _a.call(patterns_1);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
return null;
|
||
};
|
||
/**
|
||
* Generate possible source file path patterns
|
||
* Handles common library build structures
|
||
*/
|
||
SourcePathMapper.prototype.generateSourcePatterns = function (relativePath) {
|
||
var patterns = [];
|
||
// Pattern 1: Direct mapping
|
||
// dist/libs/my-lib/core/index.d.ts -> libs/my-lib/core/src/index.ts
|
||
patterns.push(relativePath);
|
||
// Pattern 2: Add 'src' directory
|
||
// dist/libs/my-lib/core/index.d.ts -> libs/my-lib/core/src/index.ts
|
||
var parts = relativePath.split(path__namespace.sep);
|
||
if (parts.length > 1) {
|
||
// Insert 'src' before the last part (filename)
|
||
var filename = parts[parts.length - 1];
|
||
var dirs = parts.slice(0, -1);
|
||
patterns.push(path__namespace.join.apply(path__namespace, logger.__spreadArray(logger.__spreadArray([], logger.__read(dirs), false), ['src', filename], false)));
|
||
}
|
||
// Pattern 3: ng-packagr pattern - remove dist prefix and add src
|
||
// dist/libs/my-lib/core/core.module.d.ts -> libs/my-lib/core/src/core.module.ts
|
||
if (relativePath.startsWith('libs' + path__namespace.sep) || relativePath.startsWith('packages' + path__namespace.sep)) {
|
||
var withoutLeading = relativePath;
|
||
var pathParts = withoutLeading.split(path__namespace.sep);
|
||
if (pathParts.length > 2) {
|
||
var filename = pathParts[pathParts.length - 1];
|
||
var dirs = pathParts.slice(0, -1);
|
||
patterns.push(path__namespace.join.apply(path__namespace, logger.__spreadArray(logger.__spreadArray([], logger.__read(dirs), false), ['src', filename], false)));
|
||
}
|
||
}
|
||
// Pattern 4: Flat structure with src
|
||
// dist/core/index.d.ts -> src/core/index.ts
|
||
patterns.push(path__namespace.join('src', relativePath));
|
||
// Pattern 5: Handle esm2022 and fesm2022 folders (skip them)
|
||
// dist/esm2022/core/index.mjs -> libs/core/src/index.ts
|
||
var cleanedPath = relativePath
|
||
.replace(/^esm\d+[/\\]/, '')
|
||
.replace(/^fesm\d+[/\\]/, '')
|
||
.replace(/\.mjs$/, '.ts');
|
||
patterns.push(cleanedPath);
|
||
patterns.push(path__namespace.join('src', cleanedPath));
|
||
return patterns;
|
||
};
|
||
/**
|
||
* Map multiple dist files to source files
|
||
*/
|
||
SourcePathMapper.prototype.mapMultipleDistToSource = function (distFiles) {
|
||
var e_2, _a;
|
||
var result = new Map();
|
||
try {
|
||
for (var distFiles_1 = logger.__values(distFiles), distFiles_1_1 = distFiles_1.next(); !distFiles_1_1.done; distFiles_1_1 = distFiles_1.next()) {
|
||
var distFile = distFiles_1_1.value;
|
||
var sourceFile = this.mapDistToSource(distFile);
|
||
if (sourceFile) {
|
||
result.set(distFile, sourceFile);
|
||
}
|
||
}
|
||
}
|
||
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
||
finally {
|
||
try {
|
||
if (distFiles_1_1 && !distFiles_1_1.done && (_a = distFiles_1.return)) _a.call(distFiles_1);
|
||
}
|
||
finally { if (e_2) throw e_2.error; }
|
||
}
|
||
return result;
|
||
};
|
||
/**
|
||
* Get source files for all declaration files that export a given symbol
|
||
*/
|
||
SourcePathMapper.prototype.getSourceFilesForSymbol = function (symbolName, symbolToFiles) {
|
||
var e_3, _a;
|
||
var sourceFiles = new Set();
|
||
var declarationFiles = symbolToFiles.get(symbolName);
|
||
if (!declarationFiles) {
|
||
return sourceFiles;
|
||
}
|
||
try {
|
||
for (var declarationFiles_1 = logger.__values(declarationFiles), declarationFiles_1_1 = declarationFiles_1.next(); !declarationFiles_1_1.done; declarationFiles_1_1 = declarationFiles_1.next()) {
|
||
var declFile = declarationFiles_1_1.value;
|
||
var sourceFile = this.mapDistToSource(declFile);
|
||
if (sourceFile) {
|
||
sourceFiles.add(sourceFile);
|
||
}
|
||
}
|
||
}
|
||
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
||
finally {
|
||
try {
|
||
if (declarationFiles_1_1 && !declarationFiles_1_1.done && (_a = declarationFiles_1.return)) _a.call(declarationFiles_1);
|
||
}
|
||
finally { if (e_3) throw e_3.error; }
|
||
}
|
||
return sourceFiles;
|
||
};
|
||
return SourcePathMapper;
|
||
}());
|
||
/**
|
||
* Create a source path mapper instance
|
||
*/
|
||
function createSourcePathMapper(distPath, sourceRoot) {
|
||
if (sourceRoot === void 0) { sourceRoot = process.cwd(); }
|
||
return new SourcePathMapper(distPath, sourceRoot);
|
||
}
|
||
|
||
var ExtendsMerger = /** @class */ (function () {
|
||
function ExtendsMerger() {
|
||
}
|
||
ExtendsMerger.getInstance = function () {
|
||
if (!ExtendsMerger.instance) {
|
||
ExtendsMerger.instance = new ExtendsMerger();
|
||
}
|
||
return ExtendsMerger.instance;
|
||
};
|
||
ExtendsMerger.prototype.merge = function (deps) {
|
||
var _this = this;
|
||
this.components = deps.components;
|
||
this.classes = deps.classes;
|
||
this.injectables = deps.injectables;
|
||
this.directives = deps.directives;
|
||
this.controllers = deps.controllers;
|
||
this.aliases = deps.aliases;
|
||
var mergeExtendedProperties = function (component) {
|
||
var ext;
|
||
if (typeof component.extends !== 'undefined') {
|
||
ext = _this.findInDependencies(component.extends[0]);
|
||
if (ext) {
|
||
var recursiveScanWithInheritance_1 = function (cls) {
|
||
// From class to component
|
||
if (typeof cls.methods !== 'undefined' && cls.methods.length > 0) {
|
||
var newMethods = _.cloneDeep(cls.methods);
|
||
newMethods = _this.markInheritance(newMethods, cls);
|
||
if (typeof component.methodsClass !== 'undefined') {
|
||
_this.mergeInheritance(component, 'methodsClass', newMethods);
|
||
}
|
||
}
|
||
if (typeof cls.properties !== 'undefined' && cls.properties.length > 0) {
|
||
var newProperties = _.cloneDeep(cls.properties);
|
||
newProperties = _this.markInheritance(newProperties, cls);
|
||
if (typeof component.propertiesClass !== 'undefined') {
|
||
_this.mergeInheritance(component, 'propertiesClass', newProperties);
|
||
}
|
||
}
|
||
// From component to component or directive to component
|
||
if (typeof cls.inputsClass !== 'undefined' && cls.inputsClass.length > 0) {
|
||
var newInputs = _.cloneDeep(cls.inputsClass);
|
||
newInputs = _this.markInheritance(newInputs, cls);
|
||
if (typeof component.inputsClass !== 'undefined') {
|
||
_this.mergeInheritance(component, 'inputsClass', newInputs);
|
||
}
|
||
}
|
||
if (typeof cls.outputsClass !== 'undefined' &&
|
||
cls.outputsClass.length > 0) {
|
||
var newOutputs = _.cloneDeep(cls.outputsClass);
|
||
newOutputs = _this.markInheritance(newOutputs, cls);
|
||
if (typeof component.outputsClass !== 'undefined') {
|
||
_this.mergeInheritance(component, 'outputsClass', newOutputs);
|
||
}
|
||
}
|
||
if (typeof cls.methodsClass !== 'undefined' &&
|
||
cls.methodsClass.length > 0) {
|
||
var newMethods = _.cloneDeep(cls.methodsClass);
|
||
newMethods = _this.markInheritance(newMethods, cls);
|
||
if (typeof component.methodsClass !== 'undefined') {
|
||
_this.mergeInheritance(component, 'methodsClass', newMethods);
|
||
}
|
||
}
|
||
if (typeof cls.propertiesClass !== 'undefined' &&
|
||
cls.propertiesClass.length > 0) {
|
||
var newProperties = _.cloneDeep(cls.propertiesClass);
|
||
newProperties = _this.markInheritance(newProperties, cls);
|
||
if (typeof component.propertiesClass !== 'undefined') {
|
||
_this.mergeInheritance(component, 'propertiesClass', newProperties);
|
||
}
|
||
}
|
||
if (typeof cls.hostBindings !== 'undefined' &&
|
||
cls.hostBindings.length > 0) {
|
||
var newHostBindings = _.cloneDeep(cls.hostBindings);
|
||
newHostBindings = _this.markInheritance(newHostBindings, cls);
|
||
if (typeof component.hostBindings !== 'undefined') {
|
||
_this.mergeInheritance(component, 'hostBindings', newHostBindings);
|
||
}
|
||
}
|
||
if (typeof cls.hostListeners !== 'undefined' &&
|
||
cls.hostListeners.length > 0) {
|
||
var newHostListeners = _.cloneDeep(cls.hostListeners);
|
||
newHostListeners = _this.markInheritance(newHostListeners, cls);
|
||
if (typeof component.hostListeners !== 'undefined') {
|
||
_this.mergeInheritance(component, 'hostListeners', newHostListeners);
|
||
}
|
||
}
|
||
if (Configuration$1.mainData.disableLifeCycleHooks) {
|
||
component.methodsClass = cleanLifecycleHooksFromMethods(component.methodsClass);
|
||
}
|
||
if (cls.extends) {
|
||
recursiveScanWithInheritance_1(_this.findInDependencies(cls.extends[0]));
|
||
}
|
||
};
|
||
// From class to class
|
||
recursiveScanWithInheritance_1(ext);
|
||
}
|
||
}
|
||
};
|
||
this.components.forEach(mergeExtendedProperties);
|
||
this.directives.forEach(mergeExtendedProperties);
|
||
this.controllers.forEach(mergeExtendedProperties);
|
||
var mergeExtendedClasses = function (el) {
|
||
var ext;
|
||
if (typeof el.extends !== 'undefined') {
|
||
ext = _this.findInDependencies(el.extends[0]);
|
||
if (ext) {
|
||
var recursiveScanWithInheritance_2 = function (cls) {
|
||
if (typeof cls.methods !== 'undefined' && cls.methods.length > 0) {
|
||
var newMethods = _.cloneDeep(cls.methods);
|
||
newMethods = _this.markInheritance(newMethods, cls);
|
||
if (typeof el.methods !== 'undefined') {
|
||
_this.mergeInheritance(el, 'methods', newMethods);
|
||
}
|
||
}
|
||
if (typeof cls.properties !== 'undefined' && cls.properties.length > 0) {
|
||
var newProperties = _.cloneDeep(cls.properties);
|
||
newProperties = _this.markInheritance(newProperties, cls);
|
||
if (typeof el.properties !== 'undefined') {
|
||
_this.mergeInheritance(el, 'properties', newProperties);
|
||
}
|
||
}
|
||
if (cls.extends) {
|
||
recursiveScanWithInheritance_2(_this.findInDependencies(cls.extends[0]));
|
||
}
|
||
};
|
||
// From elss to elss
|
||
recursiveScanWithInheritance_2(ext);
|
||
}
|
||
}
|
||
};
|
||
this.classes.forEach(mergeExtendedClasses);
|
||
this.injectables.forEach(mergeExtendedClasses);
|
||
this.directives.forEach(mergeExtendedClasses);
|
||
this.controllers.forEach(mergeExtendedClasses);
|
||
return deps;
|
||
};
|
||
ExtendsMerger.prototype.markInheritance = function (data, originalource) {
|
||
return data.map(function (el) {
|
||
var newElement = el;
|
||
newElement.inheritance = {
|
||
file: originalource.name
|
||
};
|
||
return newElement;
|
||
});
|
||
};
|
||
ExtendsMerger.prototype.mergeInheritance = function (component, metaPropertyId, newMembers) {
|
||
newMembers.forEach(function (newMember) {
|
||
var overriddenMethod = component[metaPropertyId].find(function (componentMember) { return componentMember.name === newMember.name; });
|
||
if (overriddenMethod) {
|
||
overriddenMethod.inheritance = newMember.inheritance;
|
||
}
|
||
else {
|
||
component[metaPropertyId].push(newMember);
|
||
}
|
||
});
|
||
};
|
||
ExtendsMerger.prototype.findInDependencies = function (name) {
|
||
var mergedData = _.concat([], this.components, this.classes, this.injectables, this.directives, this.controllers);
|
||
var result = _.find(mergedData, { name: name });
|
||
// Find in aliases ?
|
||
if (!result) {
|
||
var aliases = Object.values(this.aliases);
|
||
var isInAlias = aliases.includes(name);
|
||
if (isInAlias) {
|
||
var finalOriginalName = this.findInAliases(name);
|
||
if (finalOriginalName) {
|
||
result = _.find(mergedData, { name: finalOriginalName });
|
||
}
|
||
}
|
||
}
|
||
return result || false;
|
||
};
|
||
ExtendsMerger.prototype.findInAliases = function (name) {
|
||
var finalOriginalName = null;
|
||
for (var originalName in this.aliases) {
|
||
if (this.aliases[originalName].includes(name)) {
|
||
finalOriginalName = originalName;
|
||
}
|
||
}
|
||
return finalOriginalName;
|
||
};
|
||
return ExtendsMerger;
|
||
}());
|
||
var ExtendsMerger$1 = ExtendsMerger.getInstance();
|
||
|
||
var LinkTypeHelper = /** @class */ (function () {
|
||
function LinkTypeHelper() {
|
||
}
|
||
LinkTypeHelper.prototype.helperFunc = function (context, name, options) {
|
||
var _result = DependenciesEngine$1.find(name);
|
||
// Find in aliases ?
|
||
if (!_result) {
|
||
var potentialAlias = ExtendsMerger$1.findInAliases(name);
|
||
if (potentialAlias) {
|
||
_result = DependenciesEngine$1.find(potentialAlias);
|
||
}
|
||
}
|
||
var angularDocPrefix = AngularVersionUtil$1.prefixOfficialDoc(Configuration$1.mainData.angularVersion);
|
||
if (_result) {
|
||
context.type = {
|
||
raw: name,
|
||
indexKey: ''
|
||
};
|
||
if (_result.source === 'internal') {
|
||
if (_result.data.type === 'class') {
|
||
_result.data.type = 'classe';
|
||
}
|
||
context.type.href = '../' + _result.data.type + 's/' + _result.data.name + '.html';
|
||
if (context.indexKey !== '' && context.indexKey !== undefined) {
|
||
context.type.href += '#' + context.indexKey;
|
||
context.type.indexKey = context.indexKey;
|
||
}
|
||
if (_result.data.type === 'miscellaneous' ||
|
||
(_result.data.ctype && _result.data.ctype === 'miscellaneous')) {
|
||
var mainpage = '';
|
||
switch (_result.data.subtype) {
|
||
case 'enum':
|
||
mainpage = 'enumerations';
|
||
break;
|
||
case 'function':
|
||
mainpage = 'functions';
|
||
break;
|
||
case 'typealias':
|
||
mainpage = 'typealiases';
|
||
break;
|
||
case 'variable':
|
||
mainpage = 'variables';
|
||
}
|
||
context.type.href = '../' + _result.data.ctype + '/' + mainpage + '.html';
|
||
if (_result.data && _result.data.name) {
|
||
context.type.href += '#' + _result.data.name;
|
||
}
|
||
}
|
||
if (!context.type.indexKey) {
|
||
context.type.indexKey = '';
|
||
}
|
||
context.type.target = '_self';
|
||
}
|
||
else {
|
||
context.type.href = "https://".concat(angularDocPrefix, "angular.io/").concat(_result.data.path);
|
||
context.type.target = '_blank';
|
||
}
|
||
return options.fn(context);
|
||
}
|
||
else if (BasicTypeUtil$1.isKnownType(name)) {
|
||
context.type = {
|
||
raw: name,
|
||
indexKey: ''
|
||
};
|
||
context.type.target = '_blank';
|
||
context.type.href = BasicTypeUtil$1.getTypeUrl(name);
|
||
return options.fn(context);
|
||
}
|
||
else {
|
||
return options.inverse(context);
|
||
}
|
||
};
|
||
return LinkTypeHelper;
|
||
}());
|
||
|
||
var ModifIconHelper = /** @class */ (function () {
|
||
function ModifIconHelper() {
|
||
}
|
||
ModifIconHelper.prototype.helperFunc = function (context, kind) {
|
||
var _kindText = '';
|
||
switch (kind) {
|
||
case tsMorph.SyntaxKind.PrivateKeyword:
|
||
_kindText = 'lock'; // private
|
||
break;
|
||
case tsMorph.SyntaxKind.ProtectedKeyword:
|
||
_kindText = 'lock'; // protected
|
||
break;
|
||
case tsMorph.SyntaxKind.StaticKeyword:
|
||
_kindText = 'reset'; // static
|
||
break;
|
||
case tsMorph.SyntaxKind.ExportKeyword:
|
||
_kindText = 'export'; // export
|
||
break;
|
||
default:
|
||
_kindText = 'reset';
|
||
break;
|
||
}
|
||
return _kindText;
|
||
};
|
||
return ModifIconHelper;
|
||
}());
|
||
|
||
var Handlebars$4 = require('handlebars');
|
||
var ModifKindHelper = /** @class */ (function () {
|
||
function ModifKindHelper() {
|
||
}
|
||
/**
|
||
* Transform SyntaxKind into string
|
||
* @param {any} context Handlebars context
|
||
* @param {SyntaxKind[]} kind SyntaxKind concatenated
|
||
* @return {string} Parsed string
|
||
*/
|
||
ModifKindHelper.prototype.helperFunc = function (context, kind) {
|
||
var _kindText = '';
|
||
switch (kind) {
|
||
case tsMorph.SyntaxKind.PrivateKeyword:
|
||
_kindText = 'Private';
|
||
break;
|
||
case tsMorph.SyntaxKind.ReadonlyKeyword:
|
||
_kindText = 'Readonly';
|
||
break;
|
||
case tsMorph.SyntaxKind.ProtectedKeyword:
|
||
_kindText = 'Protected';
|
||
break;
|
||
case tsMorph.SyntaxKind.PublicKeyword:
|
||
_kindText = 'Public';
|
||
break;
|
||
case tsMorph.SyntaxKind.StaticKeyword:
|
||
_kindText = 'Static';
|
||
break;
|
||
case tsMorph.SyntaxKind.AsyncKeyword:
|
||
_kindText = 'Async';
|
||
break;
|
||
case tsMorph.SyntaxKind.AbstractKeyword:
|
||
_kindText = 'Abstract';
|
||
break;
|
||
}
|
||
return new Handlebars$4.SafeString(_kindText);
|
||
};
|
||
return ModifKindHelper;
|
||
}());
|
||
|
||
var ObjectLengthHelper = /** @class */ (function () {
|
||
function ObjectLengthHelper() {
|
||
}
|
||
ObjectLengthHelper.prototype.helperFunc = function (context, obj, operator, length) {
|
||
var len = arguments.length - 1;
|
||
var options = arguments[len];
|
||
if (typeof obj !== 'object') {
|
||
return options.inverse(context);
|
||
}
|
||
var size = 0, key;
|
||
for (key in obj) {
|
||
if (obj.hasOwnProperty(key)) {
|
||
size++;
|
||
}
|
||
}
|
||
var result;
|
||
switch (operator) {
|
||
case '===':
|
||
result = size === length;
|
||
break;
|
||
case '!==':
|
||
result = size !== length;
|
||
break;
|
||
case '>':
|
||
result = size > length;
|
||
break;
|
||
default: {
|
||
throw new Error('helper {{objectLength}}: invalid operator: `' + operator + '`');
|
||
}
|
||
}
|
||
if (result === false) {
|
||
return options.inverse(context);
|
||
}
|
||
return options.fn(context);
|
||
};
|
||
return ObjectLengthHelper;
|
||
}());
|
||
|
||
var Handlebars$3 = require('handlebars');
|
||
var ObjectHelper = /** @class */ (function () {
|
||
function ObjectHelper() {
|
||
}
|
||
ObjectHelper.prototype.helperFunc = function (context, text) {
|
||
text = JSON.stringify(text);
|
||
text = text.replace(/{"/, '{<br> "');
|
||
text = text.replace(/,"/, ',<br> "');
|
||
text = text.replace(/}$/, '<br>}');
|
||
return new Handlebars$3.SafeString(text);
|
||
};
|
||
return ObjectHelper;
|
||
}());
|
||
|
||
var OneParameterHasHelper = /** @class */ (function () {
|
||
function OneParameterHasHelper() {
|
||
}
|
||
OneParameterHasHelper.prototype.helperFunc = function (context, tags, typeToCheck) {
|
||
var result = false;
|
||
var len = arguments.length - 1;
|
||
var options = arguments[len];
|
||
var i = 0, leng = tags.length;
|
||
for (i; i < leng; i++) {
|
||
if (typeof tags[i][typeToCheck] !== 'undefined' && tags[i][typeToCheck] !== '') {
|
||
result = true;
|
||
}
|
||
}
|
||
if (result) {
|
||
return options.fn(context);
|
||
}
|
||
else {
|
||
return options.inverse(context);
|
||
}
|
||
};
|
||
return OneParameterHasHelper;
|
||
}());
|
||
|
||
var OrLengthHelper = /** @class */ (function () {
|
||
function OrLengthHelper() {
|
||
}
|
||
OrLengthHelper.prototype.helperFunc = function (context /* any, any, ..., options */) {
|
||
var len = arguments.length - 1;
|
||
var options = arguments[len];
|
||
// We start at 1 because of options
|
||
for (var i = 1; i < len; i++) {
|
||
if (typeof arguments[i] !== 'undefined') {
|
||
if (Object.keys(arguments[i]).length > 0) {
|
||
return options.fn(context);
|
||
}
|
||
}
|
||
}
|
||
return options.inverse(context);
|
||
};
|
||
return OrLengthHelper;
|
||
}());
|
||
|
||
var OrHelper = /** @class */ (function () {
|
||
function OrHelper() {
|
||
}
|
||
OrHelper.prototype.helperFunc = function (context /* any, any, ..., options */) {
|
||
var len = arguments.length - 1;
|
||
var options = arguments[len];
|
||
// We start at 1 because of options
|
||
for (var i = 1; i < len; i++) {
|
||
if (arguments[i]) {
|
||
return options.fn(context);
|
||
}
|
||
}
|
||
return options.inverse(context);
|
||
};
|
||
return OrHelper;
|
||
}());
|
||
|
||
var ParseDescriptionHelper = /** @class */ (function () {
|
||
function ParseDescriptionHelper() {
|
||
}
|
||
ParseDescriptionHelper.prototype.helperFunc = function (context, description, depth) {
|
||
var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
|
||
var tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
|
||
var tagRegExp;
|
||
var matches;
|
||
var previousString;
|
||
tagRegExp = description.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
|
||
var processTheLink = function (originalDescription, matchedTag, leadingText) {
|
||
var leading = extractLeadingText(originalDescription, matchedTag.completeTag);
|
||
var split;
|
||
var resultInCompodoc;
|
||
var newLink;
|
||
var rootPath;
|
||
var stringtoReplace;
|
||
var anchor = '';
|
||
var label;
|
||
var pageName;
|
||
split = splitLinkText(matchedTag.text);
|
||
if (typeof split.linkText !== 'undefined') {
|
||
resultInCompodoc = DependenciesEngine$1.findInCompodoc(split.target);
|
||
}
|
||
else {
|
||
var info = matchedTag.text;
|
||
if (matchedTag.text.indexOf('#') !== -1) {
|
||
anchor = matchedTag.text.substr(matchedTag.text.indexOf('#'), matchedTag.text.length);
|
||
info = matchedTag.text.substr(0, matchedTag.text.indexOf('#'));
|
||
}
|
||
resultInCompodoc = DependenciesEngine$1.findInCompodoc(info);
|
||
}
|
||
if (resultInCompodoc) {
|
||
label = resultInCompodoc.name;
|
||
pageName = resultInCompodoc.name;
|
||
if (leadingText) {
|
||
stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
||
}
|
||
else if (leading.leadingText !== undefined) {
|
||
stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
||
}
|
||
else if (typeof split.linkText !== 'undefined') {
|
||
stringtoReplace = matchedTag.completeTag;
|
||
}
|
||
else {
|
||
stringtoReplace = matchedTag.completeTag;
|
||
}
|
||
if (resultInCompodoc.type === 'class') {
|
||
resultInCompodoc.type = 'classes';
|
||
}
|
||
else if (resultInCompodoc.type === 'miscellaneous' ||
|
||
(resultInCompodoc.ctype && resultInCompodoc.ctype === 'miscellaneous')) {
|
||
resultInCompodoc.type = 'miscellaneous'; // Not a typo, it is for matching other single types : component, module etc
|
||
label = resultInCompodoc.name;
|
||
anchor = '#' + resultInCompodoc.name;
|
||
if (resultInCompodoc.subtype === 'enum') {
|
||
pageName = 'enumerations';
|
||
}
|
||
else if (resultInCompodoc.subtype === 'function') {
|
||
pageName = 'functions';
|
||
}
|
||
else if (resultInCompodoc.subtype === 'typealias') {
|
||
pageName = 'typealiases';
|
||
}
|
||
else if (resultInCompodoc.subtype === 'variable') {
|
||
pageName = 'variables';
|
||
}
|
||
}
|
||
rootPath = '';
|
||
switch (depth) {
|
||
case 0:
|
||
rootPath = './';
|
||
break;
|
||
case 1:
|
||
case 2:
|
||
case 3:
|
||
case 4:
|
||
case 5:
|
||
rootPath = '../'.repeat(depth);
|
||
break;
|
||
}
|
||
if (leading.leadingText !== undefined) {
|
||
label = leading.leadingText;
|
||
}
|
||
if (typeof split.linkText !== 'undefined') {
|
||
label = split.linkText;
|
||
}
|
||
if (resultInCompodoc.type === 'miscellaneous' ||
|
||
resultInCompodoc.type === 'classes') {
|
||
newLink = "<a href=\"".concat(rootPath).concat(resultInCompodoc.type, "/").concat(pageName, ".html").concat(anchor, "\">").concat(label, "</a>");
|
||
}
|
||
else {
|
||
newLink = "<a href=\"".concat(rootPath).concat(resultInCompodoc.type, "s/").concat(pageName, ".html").concat(anchor, "\">").concat(label, "</a>");
|
||
}
|
||
return originalDescription.replace(stringtoReplace, newLink);
|
||
}
|
||
else if (!resultInCompodoc && typeof split.linkText !== 'undefined') {
|
||
newLink = "<a href=\"".concat(split.target, "\">").concat(split.linkText, "</a>");
|
||
if (leadingText) {
|
||
stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
||
}
|
||
else if (leading.leadingText !== undefined) {
|
||
stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
||
}
|
||
else if (typeof split.linkText !== 'undefined') {
|
||
stringtoReplace = matchedTag.completeTag;
|
||
}
|
||
else {
|
||
stringtoReplace = matchedTag.completeTag;
|
||
}
|
||
return originalDescription.replace(stringtoReplace, newLink);
|
||
}
|
||
else if (!resultInCompodoc && leading && typeof leading.leadingText !== 'undefined') {
|
||
newLink = "<a href=\"".concat(split.target, "\">").concat(leading.leadingText, "</a>");
|
||
if (leadingText) {
|
||
stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
||
}
|
||
else if (leading.leadingText !== undefined) {
|
||
stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
||
}
|
||
else if (typeof split.linkText !== 'undefined') {
|
||
stringtoReplace = matchedTag.completeTag;
|
||
}
|
||
else {
|
||
stringtoReplace = matchedTag.completeTag;
|
||
}
|
||
return originalDescription.replace(stringtoReplace, newLink);
|
||
}
|
||
else if (!resultInCompodoc && typeof split.linkText === 'undefined') {
|
||
newLink = "<a href=\"".concat(split.target, "\">").concat(split.target, "</a>");
|
||
if (leadingText) {
|
||
stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
|
||
}
|
||
else if (leading.leadingText !== undefined) {
|
||
stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
|
||
}
|
||
else {
|
||
stringtoReplace = matchedTag.completeTag;
|
||
}
|
||
return originalDescription.replace(stringtoReplace, newLink);
|
||
}
|
||
else {
|
||
return originalDescription;
|
||
}
|
||
};
|
||
function replaceMatch(replacer, tag, match, text, linkText) {
|
||
var matchedTag = {
|
||
completeTag: match,
|
||
tag: tag,
|
||
text: text
|
||
};
|
||
if (linkText) {
|
||
return replacer(description, matchedTag, linkText);
|
||
}
|
||
else {
|
||
return replacer(description, matchedTag);
|
||
}
|
||
}
|
||
// Clean description for marked a tag parsed too early
|
||
if (description.indexOf('href=') !== -1) {
|
||
var insideMarkedATagResults = description.match(/<a [^>]+>([^<]+)<\/a>/g);
|
||
if (insideMarkedATagResults && insideMarkedATagResults.length > 0) {
|
||
for (var i = 0; i < insideMarkedATagResults.length; i++) {
|
||
var markedATagRegExp = new RegExp('<a [^>]+>([^<]+)</a>', 'gm');
|
||
var parsedATag = markedATagRegExp.exec(description);
|
||
if (parsedATag && parsedATag.length === 2) {
|
||
var insideMarkedATag = parsedATag[1];
|
||
description = description.replace("{@link <a href=\"".concat(encodeURI(insideMarkedATag), "\">").concat(insideMarkedATag, "</a>"), "{@link ".concat(insideMarkedATag));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
do {
|
||
matches = tagRegExp.exec(description);
|
||
// Did we have {@link ?
|
||
if (matches) {
|
||
previousString = description;
|
||
if (matches.length === 2) {
|
||
description = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
|
||
}
|
||
if (matches.length === 3) {
|
||
description = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
|
||
}
|
||
}
|
||
} while (matches && previousString !== description);
|
||
// Convert empty line placeholders back to actual empty lines
|
||
description = description.replace(/___COMPODOC_EMPTY_LINE___/g, '\n');
|
||
return description;
|
||
};
|
||
return ParseDescriptionHelper;
|
||
}());
|
||
|
||
require('handlebars');
|
||
var ParsePropertyHelper = /** @class */ (function () {
|
||
function ParsePropertyHelper() {
|
||
}
|
||
ParsePropertyHelper.prototype.helperFunc = function (context, text) {
|
||
var prop = text;
|
||
if (!!text && text.constructor === Object && text['url'] !== undefined) {
|
||
prop = text['url'];
|
||
}
|
||
if (!!text && text.constructor === Object && text['name'] !== undefined) {
|
||
prop = text['name'];
|
||
}
|
||
if (!!text && text.constructor === Object && Object.keys(text).length === 0) {
|
||
prop = '';
|
||
}
|
||
if (prop instanceof String && prop !== '' && prop.indexOf('https') !== -1) {
|
||
return "<a href=\"".concat(prop, "\" target=\"_blank\">").concat(prop, "</a>");
|
||
}
|
||
else if (prop !== '' && prop instanceof Array && prop.length > 0) {
|
||
prop = JSON.stringify(prop);
|
||
prop = prop.replace(/","/g, ', ');
|
||
prop = prop.replace(/\["/g, '');
|
||
prop = prop.replace(/"]/g, '');
|
||
return prop;
|
||
}
|
||
else {
|
||
return prop;
|
||
}
|
||
};
|
||
return ParsePropertyHelper;
|
||
}());
|
||
|
||
var RelativeURLHelper = /** @class */ (function () {
|
||
function RelativeURLHelper() {
|
||
}
|
||
RelativeURLHelper.prototype.helperFunc = function (context, currentDepth, options) {
|
||
switch (currentDepth) {
|
||
case 0:
|
||
return './';
|
||
case 1:
|
||
case 2:
|
||
case 3:
|
||
case 4:
|
||
case 5:
|
||
return '../'.repeat(currentDepth);
|
||
}
|
||
return '';
|
||
};
|
||
return RelativeURLHelper;
|
||
}());
|
||
|
||
var ShortURLHelper = /** @class */ (function () {
|
||
function ShortURLHelper() {
|
||
}
|
||
ShortURLHelper.prototype.helperFunc = function (context, url, options) {
|
||
var newUrl = url;
|
||
var firstIndexOfSlash = newUrl.indexOf('/');
|
||
var lastIndexOfSlash = newUrl.lastIndexOf('/');
|
||
if (firstIndexOfSlash !== -1 || lastIndexOfSlash !== -1) {
|
||
newUrl =
|
||
newUrl.substr(0, firstIndexOfSlash + 1) +
|
||
'...' +
|
||
newUrl.substr(lastIndexOfSlash, newUrl.length);
|
||
}
|
||
return newUrl;
|
||
};
|
||
return ShortURLHelper;
|
||
}());
|
||
|
||
var StripURLHelper = /** @class */ (function () {
|
||
function StripURLHelper() {
|
||
}
|
||
StripURLHelper.prototype.helperFunc = function (context, prefix, url, options) {
|
||
return prefix + url.split("/").pop();
|
||
};
|
||
return StripURLHelper;
|
||
}());
|
||
|
||
var IfEqualStringHelper = /** @class */ (function () {
|
||
function IfEqualStringHelper() {
|
||
}
|
||
IfEqualStringHelper.prototype.helperFunc = function (context, a, b, options) {
|
||
if (a == b) {
|
||
return options.fn(context);
|
||
}
|
||
return options.inverse(context);
|
||
};
|
||
return IfEqualStringHelper;
|
||
}());
|
||
|
||
var Handlebars$2 = require('handlebars');
|
||
var HtmlEngineHelpers = /** @class */ (function () {
|
||
function HtmlEngineHelpers() {
|
||
}
|
||
HtmlEngineHelpers.prototype.registerHelpers = function (bars) {
|
||
this.registerHelper(bars, 'compare', new CompareHelper());
|
||
this.registerHelper(bars, 'or', new OrHelper());
|
||
this.registerHelper(bars, 'functionSignature', new FunctionSignatureHelper());
|
||
this.registerHelper(bars, 'isNotToggle', new IsNotToggleHelper());
|
||
this.registerHelper(bars, 'isInitialTab', new IsInitialTabHelper());
|
||
this.registerHelper(bars, 'isTabEnabled', new IsTabEnabledHelper());
|
||
this.registerHelper(bars, 'ifString', new IfStringHelper());
|
||
this.registerHelper(bars, 'ifEqualString', new IfEqualStringHelper());
|
||
this.registerHelper(bars, 'orLength', new OrLengthHelper());
|
||
this.registerHelper(bars, 'filterAngular2Modules', new FilterAngular2ModulesHelper());
|
||
this.registerHelper(bars, 'debug', new DebugHelper());
|
||
this.registerHelper(bars, 'breaklines', new BreakLinesHelper(bars));
|
||
this.registerHelper(bars, 'clean-paragraph', new CleanParagraphHelper());
|
||
this.registerHelper(bars, 'escapeSimpleQuote', new EscapeSimpleQuoteHelper());
|
||
this.registerHelper(bars, 'breakComma', new BreakCommaHelper(bars));
|
||
this.registerHelper(bars, 'modifKind', new ModifKindHelper());
|
||
this.registerHelper(bars, 'modifIcon', new ModifIconHelper());
|
||
this.registerHelper(bars, 'relativeURL', new RelativeURLHelper());
|
||
this.registerHelper(bars, 'jsdoc-returns-comment', new JsdocReturnsCommentHelper());
|
||
this.registerHelper(bars, 'jsdoc-code-example', new JsdocCodeExampleHelper());
|
||
this.registerHelper(bars, 'jsdoc-example', new JsdocExampleHelper());
|
||
this.registerHelper(bars, 'jsdoc-params', new JsdocParamsHelper());
|
||
this.registerHelper(bars, 'jsdoc-params-valid', new JsdocParamsValidHelper());
|
||
this.registerHelper(bars, 'jsdoc-default', new JsdocDefaultHelper());
|
||
this.registerHelper(bars, 'linkType', new LinkTypeHelper());
|
||
this.registerHelper(bars, 'indexableSignature', new IndexableSignatureHelper());
|
||
this.registerHelper(bars, 'object', new ObjectHelper());
|
||
this.registerHelper(bars, 'objectLength', new ObjectLengthHelper());
|
||
this.registerHelper(bars, 'parseDescription', new ParseDescriptionHelper());
|
||
this.registerHelper(bars, 'one-parameter-has', new OneParameterHasHelper());
|
||
this.registerHelper(bars, 'element-alone', new ElementAloneHelper());
|
||
this.registerHelper(bars, 'hasOwn', new HasOwnHelper());
|
||
this.registerHelper(bars, 'short-url', new ShortURLHelper());
|
||
this.registerHelper(bars, 'strip-url', new StripURLHelper());
|
||
this.registerHelper(bars, 't', new I18nHelper());
|
||
this.registerHelper(bars, 'capitalize', new CapitalizeHelper());
|
||
this.registerHelper(bars, 'parse-property', new ParsePropertyHelper());
|
||
};
|
||
HtmlEngineHelpers.prototype.registerHelper = function (bars, key, helper) {
|
||
Handlebars$2.registerHelper(key, function () {
|
||
// tslint:disable-next-line:no-invalid-this
|
||
return helper.helperFunc.apply(helper, logger.__spreadArray([this], logger.__read(___namespace.slice(arguments)), false));
|
||
});
|
||
};
|
||
return HtmlEngineHelpers;
|
||
}());
|
||
|
||
var Handlebars$1 = require('handlebars');
|
||
var HtmlEngine = /** @class */ (function () {
|
||
function HtmlEngine() {
|
||
this.cache = {};
|
||
var helper = new HtmlEngineHelpers();
|
||
helper.registerHelpers(Handlebars$1);
|
||
}
|
||
HtmlEngine.getInstance = function () {
|
||
if (!HtmlEngine.instance) {
|
||
HtmlEngine.instance = new HtmlEngine();
|
||
}
|
||
return HtmlEngine.instance;
|
||
};
|
||
HtmlEngine.prototype.init = function (templatePath) {
|
||
var _this = this;
|
||
var partials = [
|
||
'overview',
|
||
'markdown',
|
||
'modules',
|
||
'module',
|
||
'component',
|
||
'controller',
|
||
'entity',
|
||
'component-detail',
|
||
'directive',
|
||
'injectable',
|
||
'interceptor',
|
||
'guard',
|
||
'pipe',
|
||
'class',
|
||
'interface',
|
||
'routes',
|
||
'index',
|
||
'index-misc',
|
||
'search-results',
|
||
'search-input',
|
||
'link-type',
|
||
'block-method',
|
||
'block-host-listener',
|
||
'block-enum',
|
||
'block-property',
|
||
'block-index',
|
||
'block-constructor',
|
||
'block-typealias',
|
||
'block-accessors',
|
||
'block-input',
|
||
'block-output',
|
||
'coverage-report',
|
||
'unit-test-report',
|
||
'miscellaneous-functions',
|
||
'miscellaneous-variables',
|
||
'miscellaneous-typealiases',
|
||
'miscellaneous-enumerations',
|
||
'additional-page',
|
||
'package-dependencies',
|
||
'package-properties'
|
||
];
|
||
if (templatePath) {
|
||
// Check if templatePath is absolute or relative
|
||
var resolvedTemplatePath = path__namespace.isAbsolute(templatePath)
|
||
? templatePath
|
||
: path__namespace.resolve(process.cwd() + path__namespace.sep + templatePath);
|
||
if (FileEngine$1.existsSync(resolvedTemplatePath) === false) {
|
||
logger.logger.warn('Template path specificed but does not exist...using default templates');
|
||
}
|
||
}
|
||
return Promise.all(partials.map(function (partial) {
|
||
var partialPath = _this.determineTemplatePath(templatePath, 'partials/' + partial + '.hbs');
|
||
return FileEngine$1.get(partialPath).then(function (data) {
|
||
return Handlebars$1.registerPartial(partial, data);
|
||
});
|
||
}))
|
||
.then(function () {
|
||
var pagePath = _this.determineTemplatePath(templatePath, 'page.hbs');
|
||
return FileEngine$1.get(pagePath).then(function (data) {
|
||
_this.cache.page = data;
|
||
_this.compiledPage = Handlebars$1.compile(_this.cache.page, {
|
||
preventIndent: true,
|
||
strict: true
|
||
});
|
||
});
|
||
})
|
||
.then(function () {
|
||
var menuPath = _this.determineTemplatePath(templatePath, 'partials/menu.hbs');
|
||
return FileEngine$1.get(menuPath).then(function (menuTemplate) {
|
||
_this.precompiledMenu = Handlebars$1.compile(menuTemplate, {
|
||
preventIndent: true,
|
||
strict: true
|
||
});
|
||
});
|
||
});
|
||
};
|
||
HtmlEngine.prototype.renderMenu = function (templatePath, data) {
|
||
var menuPath = this.determineTemplatePath(templatePath, 'partials/menu.hbs');
|
||
return FileEngine$1.get(menuPath).then(function (menuTemplate) {
|
||
data.menu = 'normal';
|
||
return Handlebars$1.compile(menuTemplate, {
|
||
preventIndent: true,
|
||
strict: true
|
||
})(logger.__assign({}, data));
|
||
});
|
||
};
|
||
HtmlEngine.prototype.render = function (mainData, page) {
|
||
var o = mainData;
|
||
Object.assign(o, page);
|
||
// let mem = process.memoryUsage();
|
||
// console.log(`heapTotal: ${mem.heapTotal} | heapUsed: ${mem.heapUsed}`);
|
||
return this.compiledPage({
|
||
data: o
|
||
});
|
||
};
|
||
HtmlEngine.prototype.determineTemplatePath = function (templatePath, filePath) {
|
||
var outPath = path__namespace.resolve(__dirname + '/../src/templates/' + filePath);
|
||
if (templatePath) {
|
||
// Handle both absolute and relative template paths correctly
|
||
var baseTemplatePath = path__namespace.isAbsolute(templatePath)
|
||
? templatePath
|
||
: path__namespace.resolve(process.cwd() + path__namespace.sep + templatePath);
|
||
var testPath = path__namespace.resolve(baseTemplatePath + path__namespace.sep + filePath);
|
||
outPath = FileEngine$1.existsSync(testPath) ? testPath : outPath;
|
||
}
|
||
return outPath;
|
||
};
|
||
HtmlEngine.prototype.generateCoverageBadge = function (outputFolder, label, coverageData) {
|
||
return FileEngine$1.get(path__namespace.resolve(__dirname + '/../src/templates/partials/coverage-badge.hbs')).then(function (data) {
|
||
var template = Handlebars$1.compile(data);
|
||
coverageData.label = label;
|
||
var result = template({
|
||
data: coverageData
|
||
});
|
||
var testOutputDir = outputFolder.match(process.cwd());
|
||
if (testOutputDir && testOutputDir.length > 0) {
|
||
outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
|
||
}
|
||
return FileEngine$1.write(outputFolder + path__namespace.sep + '/images/coverage-badge-' + label + '.svg', result).catch(function (err) {
|
||
logger.logger.error('Error during coverage badge ' + label + ' file generation ', err);
|
||
return Promise.reject(err);
|
||
});
|
||
}, function (err) { return Promise.reject('Error during coverage badge generation'); });
|
||
};
|
||
return HtmlEngine;
|
||
}());
|
||
var HtmlEngine$1 = HtmlEngine.getInstance();
|
||
|
||
var decache = require('decache');
|
||
var MarkdownEngine = /** @class */ (function () {
|
||
function MarkdownEngine() {
|
||
var _this = this;
|
||
/**
|
||
* List of markdown files without .md extension
|
||
*/
|
||
this.markdownFiles = ['README', 'CHANGELOG', 'LICENSE', 'CONTRIBUTING', 'TODO'];
|
||
decache('marked');
|
||
this.markedInstance = markedAcl;
|
||
var renderer = new this.markedInstance.Renderer();
|
||
renderer.code = function (code, language) {
|
||
var highlighted = code;
|
||
if (!language) {
|
||
language = 'none';
|
||
}
|
||
highlighted = _this.escape(code);
|
||
return "<b>".concat(I18nEngine$1.translate('example'), " :</b><div><pre class=\"line-numbers\"><code class=\"language-").concat(language, "\">").concat(highlighted, "</code></pre></div>");
|
||
};
|
||
renderer.table = function (header, body) {
|
||
return ('<table class="table table-bordered compodoc-table">\n' +
|
||
'<thead>\n' +
|
||
header +
|
||
'</thead>\n' +
|
||
'<tbody>\n' +
|
||
body +
|
||
'</tbody>\n' +
|
||
'</table>\n');
|
||
};
|
||
renderer.image = function (href, title, text) {
|
||
var out = '<img src="' + href + '" alt="' + text + '" class="img-responsive"';
|
||
if (title) {
|
||
out += ' title="' + title + '"';
|
||
}
|
||
out += '>';
|
||
return out;
|
||
};
|
||
this.markedInstance.setOptions({
|
||
renderer: renderer,
|
||
gfm: true,
|
||
breaks: false
|
||
});
|
||
}
|
||
MarkdownEngine.getInstance = function () {
|
||
if (!MarkdownEngine.instance) {
|
||
MarkdownEngine.instance = new MarkdownEngine();
|
||
}
|
||
return MarkdownEngine.instance;
|
||
};
|
||
MarkdownEngine.prototype.getTraditionalMarkdown = function (filepath) {
|
||
var _this = this;
|
||
return FileEngine$1.get(process.cwd() + path__namespace.sep + filepath + '.md')
|
||
.catch(function (err) { return FileEngine$1.get(process.cwd() + path__namespace.sep + filepath); })
|
||
.then(function (data) {
|
||
var returnedData = {
|
||
markdown: _this.markedInstance(data),
|
||
rawData: data
|
||
};
|
||
return returnedData;
|
||
});
|
||
};
|
||
MarkdownEngine.prototype.getTraditionalMarkdownSync = function (filepath) {
|
||
return this.markedInstance(FileEngine$1.getSync(process.cwd() + path__namespace.sep + filepath));
|
||
};
|
||
MarkdownEngine.prototype.getReadmeFile = function () {
|
||
var _this = this;
|
||
return FileEngine$1.get(process.cwd() + path__namespace.sep + 'README.md').then(function (data) {
|
||
return _this.markedInstance(data);
|
||
});
|
||
};
|
||
MarkdownEngine.prototype.readNeighbourReadmeFile = function (file) {
|
||
var dirname = path__namespace.dirname(file);
|
||
var readmeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
|
||
return fs__namespace.readFileSync(readmeFile, 'utf8');
|
||
};
|
||
MarkdownEngine.prototype.hasNeighbourReadmeFile = function (file) {
|
||
var dirname = path__namespace.dirname(file);
|
||
var readmeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
|
||
return FileEngine$1.existsSync(readmeFile);
|
||
};
|
||
MarkdownEngine.prototype.componentReadmeFile = function (file) {
|
||
var dirname = path__namespace.dirname(file);
|
||
var readmeFile = dirname + path__namespace.sep + 'README.md';
|
||
var readmeAlternativeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
|
||
var finalPath = '';
|
||
if (FileEngine$1.existsSync(readmeFile)) {
|
||
finalPath = readmeFile;
|
||
}
|
||
else {
|
||
finalPath = readmeAlternativeFile;
|
||
}
|
||
return finalPath;
|
||
};
|
||
/**
|
||
* Checks if any of the markdown files is exists with or without endings
|
||
*/
|
||
MarkdownEngine.prototype.hasRootMarkdowns = function () {
|
||
return this.addEndings(this.markdownFiles).some(function (x) {
|
||
return FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x);
|
||
});
|
||
};
|
||
MarkdownEngine.prototype.listRootMarkdowns = function () {
|
||
var foundFiles = this.markdownFiles.filter(function (x) {
|
||
return FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x + '.md') ||
|
||
FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x);
|
||
});
|
||
return this.addEndings(foundFiles);
|
||
};
|
||
MarkdownEngine.prototype.escape = function (html) {
|
||
return html
|
||
.replace(/&/g, '&')
|
||
.replace(/</g, '<')
|
||
.replace(/>/g, '>')
|
||
.replace(/"/g, '"')
|
||
.replace(/'/g, ''')
|
||
.replace(/@/g, '@');
|
||
};
|
||
/**
|
||
* ['README'] => ['README', 'README.md']
|
||
*/
|
||
MarkdownEngine.prototype.addEndings = function (files) {
|
||
return ___namespace.flatMap(files, function (x) { return [x, x + '.md']; });
|
||
};
|
||
return MarkdownEngine;
|
||
}());
|
||
var MarkdownEngine$1 = MarkdownEngine.getInstance();
|
||
|
||
var ngdT = require('@compodoc/ngd-transformer');
|
||
var NgdEngine = /** @class */ (function () {
|
||
function NgdEngine() {
|
||
}
|
||
NgdEngine.getInstance = function () {
|
||
if (!NgdEngine.instance) {
|
||
NgdEngine.instance = new NgdEngine();
|
||
}
|
||
return NgdEngine.instance;
|
||
};
|
||
NgdEngine.prototype.init = function (outputpath) {
|
||
this.engine = new ngdT.DotEngine({
|
||
output: outputpath,
|
||
displayLegend: true,
|
||
outputFormats: 'svg',
|
||
silent: true
|
||
});
|
||
};
|
||
NgdEngine.prototype.renderGraph = function (filepath, outputpath, type, name) {
|
||
this.engine.updateOutput(outputpath);
|
||
if (type === 'f') {
|
||
return this.engine.generateGraph([DependenciesEngine$1.getRawModule(name)]);
|
||
}
|
||
else {
|
||
return this.engine.generateGraph(DependenciesEngine$1.rawModulesForOverview);
|
||
}
|
||
};
|
||
NgdEngine.prototype.readGraph = function (filepath, name) {
|
||
return FileEngine$1.get(filepath).catch(function (err) {
|
||
return Promise.reject('Error during graph read ' + name);
|
||
});
|
||
};
|
||
return NgdEngine;
|
||
}());
|
||
var NgdEngine$1 = NgdEngine.getInstance();
|
||
|
||
var COMPODOC_CONSTANTS = {
|
||
navTabDefinitions: [
|
||
{
|
||
id: 'info',
|
||
href: '#info',
|
||
'data-link': 'info',
|
||
label: 'Info',
|
||
depTypes: ['all']
|
||
},
|
||
{
|
||
id: 'readme',
|
||
href: '#readme',
|
||
'data-link': 'readme',
|
||
label: 'README',
|
||
depTypes: ['all']
|
||
},
|
||
{
|
||
id: 'source',
|
||
href: '#source',
|
||
'data-link': 'source',
|
||
label: 'Source',
|
||
depTypes: ['all']
|
||
},
|
||
{
|
||
id: 'templateData',
|
||
href: '#templateData',
|
||
'data-link': 'template',
|
||
label: 'Template',
|
||
depTypes: ['component']
|
||
},
|
||
{
|
||
id: 'styleData',
|
||
href: '#styleData',
|
||
'data-link': 'style',
|
||
label: 'Styles',
|
||
depTypes: ['component']
|
||
},
|
||
{
|
||
id: 'tree',
|
||
href: '#tree',
|
||
'data-link': 'dom-tree',
|
||
label: 'DOM Tree',
|
||
depTypes: ['component']
|
||
},
|
||
{
|
||
id: 'example',
|
||
href: '#example',
|
||
'data-link': 'example',
|
||
label: 'Examples',
|
||
depTypes: ['component', 'directive', 'injectable', 'pipe']
|
||
}
|
||
]
|
||
};
|
||
/**
|
||
* Max length for the string of a file during Lunr search engine indexing.
|
||
* Prevent stack size exceeded
|
||
*/
|
||
var MAX_SIZE_FILE_SEARCH_INDEX = 50000;
|
||
/**
|
||
* Max length for the string of a file during cheerio parsing.
|
||
* Prevent stack size exceeded
|
||
*/
|
||
var MAX_SIZE_FILE_CHEERIO_PARSING = 400000000;
|
||
|
||
var Handlebars = require('handlebars');
|
||
var lunr = require('lunr');
|
||
var SearchEngine = /** @class */ (function () {
|
||
function SearchEngine() {
|
||
this.searchDocuments = [];
|
||
this.documentsStore = {};
|
||
this.amountOfMemory = 0;
|
||
}
|
||
SearchEngine.getInstance = function () {
|
||
if (!SearchEngine.instance) {
|
||
SearchEngine.instance = new SearchEngine();
|
||
}
|
||
return SearchEngine.instance;
|
||
};
|
||
SearchEngine.prototype.indexPage = function (page) {
|
||
var text;
|
||
this.amountOfMemory += page.rawData.length;
|
||
if (this.amountOfMemory < MAX_SIZE_FILE_CHEERIO_PARSING) {
|
||
var indexStartContent = page.rawData.indexOf('<!-- START CONTENT -->');
|
||
var indexEndContent = page.rawData.indexOf('<!-- END CONTENT -->');
|
||
var $ = cheerio__namespace.load(page.rawData.substring(indexStartContent + 1, indexEndContent));
|
||
text = $('.content').html();
|
||
text = htmlEntities.decode(text);
|
||
text = text.replace(/(<([^>]+)>)/gi, '');
|
||
page.url = page.url.replace(Configuration$1.mainData.output, '');
|
||
var doc = {
|
||
url: page.url,
|
||
title: page.infos.context + ' - ' + page.infos.name,
|
||
body: text
|
||
};
|
||
if (!this.documentsStore.hasOwnProperty(doc.url) &&
|
||
doc.body.length < MAX_SIZE_FILE_SEARCH_INDEX) {
|
||
this.documentsStore[doc.url] = doc;
|
||
this.searchDocuments.push(doc);
|
||
}
|
||
}
|
||
};
|
||
SearchEngine.prototype.generateSearchIndexJson = function (outputFolder) {
|
||
var _this = this;
|
||
var that = this;
|
||
var searchIndex = lunr(function () {
|
||
/* tslint:disable:no-invalid-this */
|
||
this.ref('url');
|
||
this.field('title');
|
||
this.field('body');
|
||
this.pipeline.remove(lunr.stemmer);
|
||
var i = 0;
|
||
var len = that.searchDocuments.length;
|
||
for (i; i < len; i++) {
|
||
this.add(that.searchDocuments[i]);
|
||
}
|
||
});
|
||
return FileEngine$1.get(__dirname + '/../src/templates/partials/search-index.hbs').then(function (data) {
|
||
var template = Handlebars.compile(data);
|
||
var result = template({
|
||
index: JSON.stringify(searchIndex),
|
||
store: JSON.stringify(_this.documentsStore)
|
||
});
|
||
var testOutputDir = outputFolder.match(process.cwd());
|
||
if (testOutputDir && testOutputDir.length > 0) {
|
||
outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
|
||
}
|
||
return FileEngine$1.write(outputFolder + path__namespace.sep + '/js/search/search_index.js', result).catch(function (err) {
|
||
logger.logger.error('Error during search index file generation ', err);
|
||
return Promise.reject(err);
|
||
});
|
||
}, function (err) { return Promise.reject('Error during search index generation'); });
|
||
};
|
||
return SearchEngine;
|
||
}());
|
||
var SearchEngine$1 = SearchEngine.getInstance();
|
||
|
||
var ComponentsTreeEngine = /** @class */ (function () {
|
||
function ComponentsTreeEngine() {
|
||
this.components = [];
|
||
this.componentsForTree = [];
|
||
}
|
||
ComponentsTreeEngine.getInstance = function () {
|
||
if (!ComponentsTreeEngine.instance) {
|
||
ComponentsTreeEngine.instance = new ComponentsTreeEngine();
|
||
}
|
||
return ComponentsTreeEngine.instance;
|
||
};
|
||
ComponentsTreeEngine.prototype.addComponent = function (component) {
|
||
this.components.push(component);
|
||
};
|
||
ComponentsTreeEngine.prototype.readTemplates = function () {
|
||
var _this = this;
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = _this.componentsForTree.length;
|
||
var loop = function () {
|
||
if (i <= len - 1) {
|
||
if (_this.componentsForTree[i].templateUrl) {
|
||
var filePath = process.cwd() +
|
||
path__namespace.sep +
|
||
path__namespace.dirname(_this.componentsForTree[i].file) +
|
||
path__namespace.sep +
|
||
_this.componentsForTree[i].templateUrl;
|
||
FileEngine$1.get(filePath).then(function (templateData) {
|
||
_this.componentsForTree[i].templateData = templateData;
|
||
i++;
|
||
loop();
|
||
}, function (e) {
|
||
logger.logger.error(e);
|
||
reject();
|
||
});
|
||
}
|
||
else {
|
||
_this.componentsForTree[i].templateData = _this.componentsForTree[i].template;
|
||
i++;
|
||
loop();
|
||
}
|
||
}
|
||
else {
|
||
resolve();
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
ComponentsTreeEngine.prototype.findChildrenAndParents = function () {
|
||
var _this = this;
|
||
return new Promise(function (resolve, reject) {
|
||
___namespace.forEach(_this.componentsForTree, function (component) {
|
||
var $component = cheerio__namespace(component.templateData);
|
||
___namespace.forEach(_this.componentsForTree, function (componentToFind) {
|
||
if ($component.find(componentToFind.selector).length > 0) {
|
||
console.log(componentToFind.name + ' found in ' + component.name);
|
||
component.children.push(componentToFind.name);
|
||
}
|
||
});
|
||
});
|
||
resolve();
|
||
});
|
||
};
|
||
ComponentsTreeEngine.prototype.createTreesForComponents = function () {
|
||
var _this = this;
|
||
return new Promise(function (resolve, reject) {
|
||
___namespace.forEach(_this.components, function (component) {
|
||
var _component = {
|
||
name: component.name,
|
||
file: component.file,
|
||
selector: component.selector,
|
||
children: [],
|
||
template: '',
|
||
templateUrl: ''
|
||
};
|
||
if (typeof component.template !== 'undefined') {
|
||
_component.template = component.template;
|
||
}
|
||
if (component.templateUrl.length > 0) {
|
||
_component.templateUrl = component.templateUrl[0];
|
||
}
|
||
_this.componentsForTree.push(_component);
|
||
});
|
||
_this.readTemplates().then(function () {
|
||
_this.findChildrenAndParents().then(function () {
|
||
// console.log('this.componentsForTree: ', this.componentsForTree);
|
||
resolve();
|
||
}, function (e) {
|
||
logger.logger.error(e);
|
||
reject();
|
||
});
|
||
}, function (e) {
|
||
logger.logger.error(e);
|
||
});
|
||
});
|
||
};
|
||
return ComponentsTreeEngine;
|
||
}());
|
||
var ComponentsTreeEngine$1 = ComponentsTreeEngine.getInstance();
|
||
|
||
function StringifyArrowFunction(af) {
|
||
var i = 0, result = '(';
|
||
var len = af.parameters.length;
|
||
if (len === 1) {
|
||
result = '';
|
||
}
|
||
for (i; i < len; i++) {
|
||
if (af.parameters[i].name && af.parameters[i].name.escapedText) {
|
||
result += af.parameters[i].name.escapedText;
|
||
}
|
||
if (i < len - 1) {
|
||
result += ', ';
|
||
}
|
||
}
|
||
if (len > 1 || len === 0) {
|
||
result += ')';
|
||
}
|
||
// body
|
||
result += ' => ';
|
||
if (af.body) {
|
||
if (af.body.kind === tsMorph.SyntaxKind.Identifier && af.body.escapedText) {
|
||
result += af.body.escapedText;
|
||
}
|
||
else if (af.body.kind === tsMorph.SyntaxKind.PropertyAccessExpression &&
|
||
af.body.expression &&
|
||
af.body.name) {
|
||
result += af.body.expression.escapedText;
|
||
result += '.' + af.body.name.escapedText;
|
||
}
|
||
else if (af.body.kind === tsMorph.SyntaxKind.StringLiteral && af.body.text) {
|
||
result += af.body.text;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
function StringifyObjectLiteralExpression(ole) {
|
||
var returnedString = '{';
|
||
if (ole.properties && ole.properties.length > 0) {
|
||
ole.properties.forEach(function (property, index) {
|
||
if (property.name) {
|
||
returnedString += property.name.text + ': ';
|
||
}
|
||
if (property.initializer) {
|
||
if (property.initializer.kind === tsMorph.SyntaxKind.StringLiteral) {
|
||
returnedString += "'" + property.initializer.text + "'";
|
||
}
|
||
else if (property.initializer.kind === tsMorph.SyntaxKind.TrueKeyword) {
|
||
returnedString += "true";
|
||
}
|
||
else if (property.initializer.kind === tsMorph.SyntaxKind.FalseKeyword) {
|
||
returnedString += "false";
|
||
}
|
||
else if (property.initializer.kind === tsMorph.SyntaxKind.ArrowFunction) {
|
||
returnedString += StringifyArrowFunction(property.initializer);
|
||
}
|
||
else {
|
||
returnedString += property.initializer.text;
|
||
}
|
||
}
|
||
if (index < ole.properties.length - 1) {
|
||
returnedString += ', ';
|
||
}
|
||
});
|
||
}
|
||
returnedString += '}';
|
||
return returnedString;
|
||
}
|
||
|
||
function nodeHasDecorator(node) {
|
||
// In TypeScript 5.x, decorators are accessed via ts.getDecorators(), not ts.getModifiers()
|
||
var decorators = tsMorph.ts.getDecorators(node);
|
||
return decorators !== undefined && decorators.length > 0;
|
||
}
|
||
function getNodeDecorators(node) {
|
||
// In TypeScript 5.x, decorators are accessed via ts.getDecorators(), not ts.getModifiers()
|
||
var decorators = tsMorph.ts.getDecorators(node);
|
||
return decorators ? logger.__spreadArray([], logger.__read(decorators), false) : [];
|
||
}
|
||
|
||
var crypto$7 = require('crypto');
|
||
var ClassHelper = /** @class */ (function () {
|
||
function ClassHelper(typeChecker) {
|
||
this.typeChecker = typeChecker;
|
||
this.jsdocParserUtil = new JsdocParserUtil();
|
||
}
|
||
/**
|
||
* HELPERS
|
||
*/
|
||
ClassHelper.prototype.stringifyDefaultValue = function (node) {
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
if (node && node.getText && node.getText()) {
|
||
return node.getText();
|
||
}
|
||
else if (node && node.kind === tsMorph.SyntaxKind.FalseKeyword) {
|
||
return 'false';
|
||
}
|
||
else if (node && node.kind === tsMorph.SyntaxKind.TrueKeyword) {
|
||
return 'true';
|
||
}
|
||
return '';
|
||
};
|
||
ClassHelper.prototype.checkForDeprecation = function (tags, result) {
|
||
___namespace.forEach(tags, function (tag) {
|
||
if (tag.tagName && tag.tagName.text && tag.tagName.text.indexOf('deprecated') > -1) {
|
||
result.deprecated = true;
|
||
result.deprecationMessage = tag.comment || '';
|
||
}
|
||
});
|
||
};
|
||
/**
|
||
* Process JSDoc tags and apply them to a result object
|
||
*/
|
||
ClassHelper.prototype.processJSDocTags = function (jsdoctags, result, includeTagsArray) {
|
||
if (includeTagsArray === void 0) { includeTagsArray = true; }
|
||
if (jsdoctags && jsdoctags.length >= 1) {
|
||
var jsdoc = jsdoctags[0];
|
||
if (jsdoc && jsdoc.tags) {
|
||
this.checkForDeprecation(jsdoc.tags, result);
|
||
if (includeTagsArray) {
|
||
result.jsdoctags = markedtags(jsdoc.tags);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* Extract and process JSDoc comment for a node
|
||
*/
|
||
ClassHelper.prototype.extractAndProcessJSDocComment = function (node, sourceFile, result) {
|
||
if (node.jsDoc) {
|
||
var comment = this.jsdocParserUtil.getMainCommentOfNode(node, sourceFile);
|
||
if (typeof comment !== 'undefined') {
|
||
var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
|
||
result.rawdescription = cleanedDescription;
|
||
result.description = markedAcl(cleanedDescription);
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* Initialize common fields for documented items
|
||
*/
|
||
ClassHelper.prototype.initializeDocumentationFields = function () {
|
||
return {
|
||
deprecated: false,
|
||
deprecationMessage: ''
|
||
};
|
||
};
|
||
/**
|
||
* Extract and filter modifier kinds from a node
|
||
*/
|
||
ClassHelper.prototype.extractModifierKinds = function (node) {
|
||
if (!node.modifiers || node.modifiers.length === 0) {
|
||
return undefined;
|
||
}
|
||
var kinds = node.modifiers.map(function (modifier) { return modifier.kind; });
|
||
if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
|
||
___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
|
||
kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
|
||
}
|
||
return kinds;
|
||
};
|
||
/**
|
||
* Ensure private keyword is added for ECMAScript private fields
|
||
*/
|
||
ClassHelper.prototype.ensurePrivateKeyword = function (result, node) {
|
||
if (this.isPrivate(node)) {
|
||
if (!result.modifierKind) {
|
||
result.modifierKind = [];
|
||
}
|
||
var hasAlreadyPrivateKeyword = result.modifierKind.includes(tsMorph.SyntaxKind.PrivateKeyword);
|
||
if (!hasAlreadyPrivateKeyword) {
|
||
result.modifierKind.push(tsMorph.SyntaxKind.PrivateKeyword);
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* Set fallback description from jsDoc[0].comment if no description exists
|
||
*/
|
||
ClassHelper.prototype.setFallbackDescription = function (result, node) {
|
||
if (!result.description && node.jsDoc && node.jsDoc.length > 0) {
|
||
if (typeof node.jsDoc[0].comment !== 'undefined') {
|
||
var rawDescription = node.jsDoc[0].comment;
|
||
result.rawdescription = rawDescription;
|
||
result.description = markedAcl(rawDescription);
|
||
}
|
||
}
|
||
};
|
||
ClassHelper.prototype.getDecoratorOfType = function (node, decoratorType) {
|
||
var decorators = getNodeDecorators(node) || [];
|
||
var result = [];
|
||
var len = decorators.length;
|
||
if (len > 1) {
|
||
for (var i = 0; i < decorators.length; i++) {
|
||
var expr = decorators[i].expression;
|
||
if (expr.expression) {
|
||
if (expr.expression.text === decoratorType) {
|
||
result.push(decorators[i]);
|
||
}
|
||
}
|
||
}
|
||
if (result.length > 0) {
|
||
return result;
|
||
}
|
||
}
|
||
else {
|
||
if (len === 1) {
|
||
var expr = decorators[0].expression;
|
||
if (expr && expr.expression) {
|
||
if (expr.expression.text === decoratorType) {
|
||
result.push(decorators[0]);
|
||
return result;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return undefined;
|
||
};
|
||
ClassHelper.prototype.formatDecorators = function (decorators) {
|
||
var _this = this;
|
||
var _decorators = [];
|
||
___namespace.forEach(decorators, function (decorator) {
|
||
if (decorator.expression) {
|
||
if (decorator.expression.text) {
|
||
_decorators.push({ name: decorator.expression.text });
|
||
}
|
||
if (decorator.expression.expression) {
|
||
var info = { name: decorator.expression.expression.text };
|
||
if (decorator.expression.arguments) {
|
||
info.stringifiedArguments = _this.stringifyArguments(decorator.expression.arguments);
|
||
}
|
||
_decorators.push(info);
|
||
}
|
||
}
|
||
});
|
||
return _decorators;
|
||
};
|
||
ClassHelper.prototype.handleFunction = function (arg) {
|
||
var _this = this;
|
||
if (arg.function.length === 0) {
|
||
return "".concat(arg.name).concat(this.getOptionalString(arg), ": () => void");
|
||
}
|
||
var argums = arg.function.map(function (argu) {
|
||
var _result = DependenciesEngine$1.find(argu.type);
|
||
if (_result) {
|
||
if (_result.source === 'internal') {
|
||
var path = _result.data.type;
|
||
if (_result.data.type === 'class') {
|
||
path = 'classe';
|
||
}
|
||
return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"../").concat(path, "s/").concat(_result.data.name, ".html\">").concat(argu.type, "</a>");
|
||
}
|
||
else {
|
||
var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
|
||
return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
|
||
}
|
||
}
|
||
else if (BasicTypeUtil$1.isKnownType(argu.type)) {
|
||
var path = BasicTypeUtil$1.getTypeUrl(argu.type);
|
||
return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
|
||
}
|
||
else {
|
||
if (argu.name && argu.type) {
|
||
return "".concat(argu.name).concat(_this.getOptionalString(arg), ": ").concat(argu.type);
|
||
}
|
||
else {
|
||
if (argu.name) {
|
||
return "".concat(argu.name.text);
|
||
}
|
||
else {
|
||
return '';
|
||
}
|
||
}
|
||
}
|
||
});
|
||
return "".concat(arg.name).concat(this.getOptionalString(arg), ": (").concat(argums, ") => void");
|
||
};
|
||
ClassHelper.prototype.getOptionalString = function (arg) {
|
||
return arg.optional ? '?' : '';
|
||
};
|
||
ClassHelper.prototype.stringifyArguments = function (args) {
|
||
var _this = this;
|
||
var stringifyArgs = [];
|
||
stringifyArgs = args
|
||
.map(function (arg) {
|
||
var _result = DependenciesEngine$1.find(arg.type);
|
||
if (_result) {
|
||
if (_result.source === 'internal') {
|
||
var path = _result.data.type;
|
||
if (_result.data.type === 'class') {
|
||
path = 'classe';
|
||
}
|
||
return "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"../").concat(path, "s/").concat(_result.data.name, ".html\">").concat(arg.type, "</a>");
|
||
}
|
||
else {
|
||
var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
|
||
return "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(arg.type, "</a>");
|
||
}
|
||
}
|
||
else if (arg.dotDotDotToken) {
|
||
return "...".concat(arg.name, ": ").concat(arg.type);
|
||
}
|
||
else if (arg.function) {
|
||
return _this.handleFunction(arg);
|
||
}
|
||
else if (arg.expression && arg.name) {
|
||
return arg.expression.text + '.' + arg.name.text;
|
||
}
|
||
else if (arg.expression && arg.kind === tsMorph.SyntaxKind.NewExpression) {
|
||
return 'new ' + arg.expression.text + '()';
|
||
}
|
||
else if (arg.kind && arg.kind === tsMorph.SyntaxKind.StringLiteral) {
|
||
return "'" + arg.text + "'";
|
||
}
|
||
else if (arg.kind &&
|
||
arg.kind === tsMorph.SyntaxKind.ArrayLiteralExpression &&
|
||
arg.elements &&
|
||
arg.elements.length > 0) {
|
||
var i = 0, len = arg.elements.length, result = '[';
|
||
for (i; i < len; i++) {
|
||
result += "'" + arg.elements[i].text + "'";
|
||
if (i < len - 1) {
|
||
result += ', ';
|
||
}
|
||
}
|
||
result += ']';
|
||
return result;
|
||
}
|
||
else if (arg.kind &&
|
||
arg.kind === tsMorph.SyntaxKind.ArrowFunction &&
|
||
arg.parameters &&
|
||
arg.parameters.length > 0) {
|
||
return StringifyArrowFunction(arg);
|
||
}
|
||
else if (arg.kind && arg.kind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
||
return StringifyObjectLiteralExpression(arg);
|
||
}
|
||
else if (BasicTypeUtil$1.isKnownType(arg.type)) {
|
||
var path = BasicTypeUtil$1.getTypeUrl(arg.type);
|
||
return "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(arg.type, "</a>");
|
||
}
|
||
else {
|
||
if (arg.type) {
|
||
var finalStringifiedArgument = '';
|
||
var separator = ':';
|
||
if (arg.name) {
|
||
finalStringifiedArgument += arg.name;
|
||
}
|
||
if (arg.kind === tsMorph.SyntaxKind.AsExpression &&
|
||
arg.expression &&
|
||
arg.expression.text) {
|
||
finalStringifiedArgument += arg.expression.text;
|
||
separator = ' as';
|
||
}
|
||
if (arg.optional) {
|
||
finalStringifiedArgument += _this.getOptionalString(arg);
|
||
}
|
||
if (arg.type) {
|
||
finalStringifiedArgument += separator + ' ' + _this.visitType(arg.type);
|
||
}
|
||
return finalStringifiedArgument;
|
||
}
|
||
else if (arg.text) {
|
||
return "".concat(arg.text);
|
||
}
|
||
else {
|
||
return "".concat(arg.name).concat(_this.getOptionalString(arg));
|
||
}
|
||
}
|
||
})
|
||
.join(', ');
|
||
return stringifyArgs;
|
||
};
|
||
ClassHelper.prototype.getPosition = function (node, sourceFile) {
|
||
var position;
|
||
if (node.name && node.name.end) {
|
||
position = tsMorph.ts.getLineAndCharacterOfPosition(sourceFile, node.name.end);
|
||
}
|
||
else {
|
||
position = tsMorph.ts.getLineAndCharacterOfPosition(sourceFile, node.pos);
|
||
}
|
||
return position;
|
||
};
|
||
ClassHelper.prototype.addAccessor = function (accessors, nodeAccessor, sourceFile) {
|
||
var _this = this;
|
||
var nodeName = '';
|
||
if (nodeAccessor.name) {
|
||
nodeName = nodeAccessor.name.text;
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(nodeAccessor);
|
||
if (!accessors[nodeName]) {
|
||
accessors[nodeName] = {
|
||
name: nodeName,
|
||
setSignature: undefined,
|
||
getSignature: undefined
|
||
};
|
||
}
|
||
if (nodeAccessor.kind === tsMorph.SyntaxKind.SetAccessor) {
|
||
var setSignature = logger.__assign(logger.__assign({ name: nodeName, type: 'void' }, this.initializeDocumentationFields()), { args: nodeAccessor.parameters.map(function (param) { return _this.visitArgument(param); }), returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : 'void', line: this.getPosition(nodeAccessor, sourceFile).line + 1 });
|
||
this.extractAndProcessJSDocComment(nodeAccessor, sourceFile, setSignature);
|
||
this.processJSDocTags(jsdoctags, setSignature);
|
||
if (setSignature.jsdoctags && setSignature.jsdoctags.length > 0) {
|
||
setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args, setSignature.jsdoctags);
|
||
}
|
||
else if (setSignature.args && setSignature.args.length > 0) {
|
||
setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args);
|
||
}
|
||
accessors[nodeName].setSignature = setSignature;
|
||
}
|
||
if (nodeAccessor.kind === tsMorph.SyntaxKind.GetAccessor) {
|
||
var getSignature = {
|
||
name: nodeName,
|
||
type: nodeAccessor.type ? kindToType(nodeAccessor.type.kind) : '',
|
||
returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : '',
|
||
line: this.getPosition(nodeAccessor, sourceFile).line + 1
|
||
};
|
||
this.extractAndProcessJSDocComment(nodeAccessor, sourceFile, getSignature);
|
||
this.processJSDocTags(jsdoctags, getSignature);
|
||
accessors[nodeName].getSignature = getSignature;
|
||
}
|
||
}
|
||
};
|
||
ClassHelper.prototype.hasDecoratorType = function (decorator) {
|
||
var types = [];
|
||
for (var _i = 1; _i < arguments.length; _i++) {
|
||
types[_i - 1] = arguments[_i];
|
||
}
|
||
if (decorator.expression.expression) {
|
||
var decoratorText = decorator.expression.expression.text;
|
||
return types.includes(decoratorText);
|
||
}
|
||
return false;
|
||
};
|
||
ClassHelper.prototype.isDirectiveDecorator = function (decorator) {
|
||
return this.hasDecoratorType(decorator, 'Directive', 'Component');
|
||
};
|
||
ClassHelper.prototype.isServiceDecorator = function (decorator) {
|
||
return this.hasDecoratorType(decorator, 'Injectable');
|
||
};
|
||
ClassHelper.prototype.isPrivate = function (member) {
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
if (member.modifiers) {
|
||
var isPrivate = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.PrivateKeyword; });
|
||
if (isPrivate) {
|
||
return true;
|
||
}
|
||
}
|
||
// Check for ECMAScript Private Fields
|
||
if (member.name && member.name.escapedText) {
|
||
var isPrivate = member.name.escapedText.indexOf('#') === 0;
|
||
if (isPrivate) {
|
||
return true;
|
||
}
|
||
}
|
||
return this.isHiddenMember(member);
|
||
};
|
||
ClassHelper.prototype.isProtected = function (member) {
|
||
if (member.modifiers) {
|
||
var isProtected = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.ProtectedKeyword; });
|
||
if (isProtected) {
|
||
return true;
|
||
}
|
||
}
|
||
return this.isHiddenMember(member);
|
||
};
|
||
ClassHelper.prototype.isInternal = function (member) {
|
||
var e_1, _a, e_2, _b;
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
var internalTags = ['internal'];
|
||
if (member.jsDoc) {
|
||
try {
|
||
for (var _c = logger.__values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
|
||
var doc = _d.value;
|
||
if (doc.tags) {
|
||
try {
|
||
for (var _e = (e_2 = void 0, logger.__values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
||
var tag = _f.value;
|
||
if (internalTags.indexOf(tag.tagName.text) > -1) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
||
finally {
|
||
try {
|
||
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
||
}
|
||
finally { if (e_2) throw e_2.error; }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
ClassHelper.prototype.isPublic = function (member) {
|
||
if (member.modifiers) {
|
||
var isPublic = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.PublicKeyword; });
|
||
if (isPublic) {
|
||
return true;
|
||
}
|
||
}
|
||
return this.isHiddenMember(member);
|
||
};
|
||
ClassHelper.prototype.isHiddenMember = function (member) {
|
||
var e_3, _a, e_4, _b;
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
var internalTags = ['hidden'];
|
||
if (member.jsDoc) {
|
||
try {
|
||
for (var _c = logger.__values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
|
||
var doc = _d.value;
|
||
if (doc.tags) {
|
||
try {
|
||
for (var _e = (e_4 = void 0, logger.__values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
||
var tag = _f.value;
|
||
if (internalTags.indexOf(tag.tagName.text) > -1) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
||
finally {
|
||
try {
|
||
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
||
}
|
||
finally { if (e_4) throw e_4.error; }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
||
finally {
|
||
try {
|
||
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
||
}
|
||
finally { if (e_3) throw e_3.error; }
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
ClassHelper.prototype.isPipeDecorator = function (decorator) {
|
||
return this.hasDecoratorType(decorator, 'Pipe');
|
||
};
|
||
ClassHelper.prototype.isControllerDecorator = function (decorator) {
|
||
return this.hasDecoratorType(decorator, 'Controller');
|
||
};
|
||
ClassHelper.prototype.isModuleDecorator = function (decorator) {
|
||
return this.hasDecoratorType(decorator, 'NgModule', 'Module');
|
||
};
|
||
/**
|
||
* VISITERS
|
||
*/
|
||
ClassHelper.prototype.visitClassDeclaration = function (fileName, classDeclaration, sourceFile, astFile) {
|
||
var symbol = this.typeChecker.getSymbolAtLocation(classDeclaration.name);
|
||
var rawdescription = '';
|
||
var deprecation = this.initializeDocumentationFields();
|
||
var description = '';
|
||
var jsdoctags = [];
|
||
if (symbol) {
|
||
var comment = this.jsdocParserUtil.getMainCommentOfNode(classDeclaration, sourceFile);
|
||
rawdescription = this.jsdocParserUtil.parseComment(comment);
|
||
description = markedAcl(rawdescription);
|
||
if (symbol.valueDeclaration && isIgnore(symbol.valueDeclaration)) {
|
||
return [{ ignore: true }];
|
||
}
|
||
if (symbol.declarations && symbol.declarations.length > 0) {
|
||
var declarationsjsdoctags = this.jsdocParserUtil.getJSDocs(symbol.declarations[0]);
|
||
this.processJSDocTags(declarationsjsdoctags, deprecation, false);
|
||
if (isIgnore(symbol.declarations[0])) {
|
||
return [{ ignore: true }];
|
||
}
|
||
}
|
||
if (symbol.valueDeclaration) {
|
||
jsdoctags = this.jsdocParserUtil.getJSDocs(symbol.valueDeclaration);
|
||
if (jsdoctags && jsdoctags.length >= 1) {
|
||
var jsdoc = jsdoctags[0];
|
||
if (jsdoc && jsdoc.tags) {
|
||
var tempDeprecation = this.initializeDocumentationFields();
|
||
this.checkForDeprecation(jsdoc.tags, tempDeprecation);
|
||
deprecation = tempDeprecation;
|
||
jsdoctags = markedtags(jsdoc.tags);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
var className = classDeclaration.name.text;
|
||
var members;
|
||
var implementsElements = [];
|
||
var extendsElements = [];
|
||
if (typeof tsMorph.ts.getEffectiveImplementsTypeNodes !== 'undefined') {
|
||
var implementedTypes = tsMorph.ts.getEffectiveImplementsTypeNodes(classDeclaration);
|
||
if (implementedTypes) {
|
||
var i = 0;
|
||
var len = implementedTypes.length;
|
||
for (i; i < len; i++) {
|
||
if (implementedTypes[i].expression) {
|
||
implementsElements.push(implementedTypes[i].expression.text);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (typeof tsMorph.ts.getClassExtendsHeritageElement !== 'undefined') {
|
||
if (astFile) {
|
||
var interfaceOrClassNode = astFile.getInterface(className);
|
||
if (!interfaceOrClassNode) {
|
||
interfaceOrClassNode = astFile.getClass(className);
|
||
}
|
||
if (interfaceOrClassNode) {
|
||
var extendsListRaw = interfaceOrClassNode.getExtends();
|
||
var extendsList_1 = [];
|
||
if (extendsListRaw) {
|
||
if (Array.isArray(extendsListRaw)) {
|
||
if (extendsListRaw.length > 0) {
|
||
extendsListRaw.forEach(function (extendElement) {
|
||
var extendElementExpression = extendElement.getExpression();
|
||
if (extendElementExpression) {
|
||
var text = extendElementExpression.getText();
|
||
if (text) {
|
||
extendsList_1.push(text);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
else {
|
||
var extendElementExpression = extendsListRaw.getExpression();
|
||
if (extendElementExpression) {
|
||
var text = extendElementExpression.getText();
|
||
if (text) {
|
||
extendsList_1.push(text);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
extendsElements = extendsList_1;
|
||
}
|
||
}
|
||
}
|
||
members = this.visitMembers(classDeclaration.members, sourceFile);
|
||
if (nodeHasDecorator(classDeclaration)) {
|
||
var classDecorators = getNodeDecorators(classDeclaration);
|
||
// Loop and search for official decorators at top-level :
|
||
// Angular : @NgModule, @Component, @Directive, @Injectable, @Pipe
|
||
// Nestjs : @Controller, @Module, @Injectable
|
||
// Stencil : @Component
|
||
var isDirective = false;
|
||
var isService = false;
|
||
var isPipe = false;
|
||
var isModule = false;
|
||
var isController = false;
|
||
for (var a = 0; a < classDecorators.length; a++) {
|
||
//console.log(classDeclaration.decorators[i].expression);
|
||
// RETURN TOO EARLY FOR MANY DECORATORS !!!!
|
||
// iterating through the decorators array we have to keep the flags `true` values from the previous loop iteration
|
||
isDirective = isDirective || this.isDirectiveDecorator(classDecorators[a]);
|
||
isService = isService || this.isServiceDecorator(classDecorators[a]);
|
||
isPipe = isPipe || this.isPipeDecorator(classDecorators[a]);
|
||
isModule = isModule || this.isModuleDecorator(classDecorators[a]);
|
||
isController = isController || this.isControllerDecorator(classDecorators[a]);
|
||
}
|
||
if (isDirective) {
|
||
return {
|
||
deprecated: deprecation.deprecated,
|
||
deprecationMessage: deprecation.deprecationMessage,
|
||
description: description,
|
||
rawdescription: rawdescription,
|
||
inputs: members.inputs,
|
||
outputs: members.outputs,
|
||
hostBindings: members.hostBindings,
|
||
hostListeners: members.hostListeners,
|
||
properties: members.properties,
|
||
methods: members.methods,
|
||
indexSignatures: members.indexSignatures,
|
||
kind: members.kind,
|
||
constructor: members.constructor,
|
||
jsdoctags: jsdoctags,
|
||
extends: extendsElements,
|
||
implements: implementsElements,
|
||
accessors: members.accessors
|
||
};
|
||
}
|
||
else if (isService) {
|
||
return [
|
||
{
|
||
fileName: fileName,
|
||
className: className,
|
||
deprecated: deprecation.deprecated,
|
||
deprecationMessage: deprecation.deprecationMessage,
|
||
description: description,
|
||
rawdescription: rawdescription,
|
||
methods: members.methods,
|
||
indexSignatures: members.indexSignatures,
|
||
properties: members.properties,
|
||
kind: members.kind,
|
||
constructor: members.constructor,
|
||
jsdoctags: jsdoctags,
|
||
extends: extendsElements,
|
||
implements: implementsElements,
|
||
accessors: members.accessors
|
||
}
|
||
];
|
||
}
|
||
else if (isPipe) {
|
||
return [
|
||
{
|
||
fileName: fileName,
|
||
className: className,
|
||
deprecated: deprecation.deprecated,
|
||
deprecationMessage: deprecation.deprecationMessage,
|
||
description: description,
|
||
rawdescription: rawdescription,
|
||
jsdoctags: jsdoctags,
|
||
properties: members.properties,
|
||
methods: members.methods
|
||
}
|
||
];
|
||
}
|
||
else if (isModule) {
|
||
return [
|
||
{
|
||
fileName: fileName,
|
||
className: className,
|
||
deprecated: deprecation.deprecated,
|
||
deprecationMessage: deprecation.deprecationMessage,
|
||
description: description,
|
||
rawdescription: rawdescription,
|
||
jsdoctags: jsdoctags,
|
||
methods: members.methods
|
||
}
|
||
];
|
||
}
|
||
else {
|
||
return [
|
||
{
|
||
deprecated: deprecation.deprecated,
|
||
deprecationMessage: deprecation.deprecationMessage,
|
||
description: description,
|
||
rawdescription: rawdescription,
|
||
methods: members.methods,
|
||
indexSignatures: members.indexSignatures,
|
||
properties: members.properties,
|
||
kind: members.kind,
|
||
constructor: members.constructor,
|
||
jsdoctags: jsdoctags,
|
||
extends: extendsElements,
|
||
implements: implementsElements,
|
||
accessors: members.accessors
|
||
}
|
||
];
|
||
}
|
||
}
|
||
if (description) {
|
||
return [
|
||
{
|
||
deprecated: deprecation.deprecated,
|
||
deprecationMessage: deprecation.deprecationMessage,
|
||
description: description,
|
||
rawdescription: rawdescription,
|
||
inputs: members.inputs,
|
||
outputs: members.outputs,
|
||
hostBindings: members.hostBindings,
|
||
hostListeners: members.hostListeners,
|
||
methods: members.methods,
|
||
indexSignatures: members.indexSignatures,
|
||
properties: members.properties,
|
||
kind: members.kind,
|
||
constructor: members.constructor,
|
||
jsdoctags: jsdoctags,
|
||
extends: extendsElements,
|
||
implements: implementsElements,
|
||
accessors: members.accessors
|
||
}
|
||
];
|
||
}
|
||
else {
|
||
return [
|
||
{
|
||
deprecated: deprecation.deprecated,
|
||
deprecationMessage: deprecation.deprecationMessage,
|
||
methods: members.methods,
|
||
inputs: members.inputs,
|
||
outputs: members.outputs,
|
||
hostBindings: members.hostBindings,
|
||
hostListeners: members.hostListeners,
|
||
indexSignatures: members.indexSignatures,
|
||
properties: members.properties,
|
||
kind: members.kind,
|
||
constructor: members.constructor,
|
||
jsdoctags: jsdoctags,
|
||
extends: extendsElements,
|
||
implements: implementsElements,
|
||
accessors: members.accessors
|
||
}
|
||
];
|
||
}
|
||
};
|
||
ClassHelper.prototype.visitMembers = function (members, sourceFile) {
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
var inputs = [];
|
||
var outputs = [];
|
||
var methods = [];
|
||
var properties = [];
|
||
var indexSignatures = [];
|
||
var kind;
|
||
var inputDecorator;
|
||
var hostBindings = [];
|
||
var hostListeners = [];
|
||
var constructor;
|
||
var outputDecorator;
|
||
var accessors = {};
|
||
var result = {};
|
||
for (var i = 0; i < members.length; i++) {
|
||
// Allows typescript guess type when using ts.is*
|
||
var member = members[i];
|
||
inputDecorator = this.getDecoratorOfType(member, 'Input');
|
||
outputDecorator = this.getDecoratorOfType(member, 'Output');
|
||
var parsedHostBindings = this.getDecoratorOfType(member, 'HostBinding');
|
||
var parsedHostListeners = this.getDecoratorOfType(member, 'HostListener');
|
||
kind = member.kind;
|
||
if (isIgnore(member)) {
|
||
continue;
|
||
}
|
||
if (this.isInternal(member) && Configuration$1.mainData.disableInternal) {
|
||
continue;
|
||
}
|
||
if (inputDecorator && inputDecorator.length > 0) {
|
||
inputs.push(this.visitInputAndHostBinding(member, inputDecorator[0], sourceFile));
|
||
if (tsMorph.ts.isSetAccessorDeclaration(member)) {
|
||
this.addAccessor(accessors, members[i], sourceFile);
|
||
}
|
||
}
|
||
else if (outputDecorator && outputDecorator.length > 0) {
|
||
outputs.push(this.visitOutput(member, outputDecorator[0], sourceFile));
|
||
}
|
||
else if (parsedHostBindings && parsedHostBindings.length > 0) {
|
||
var k = 0;
|
||
var lenHB = parsedHostBindings.length;
|
||
for (k; k < lenHB; k++) {
|
||
hostBindings.push(this.visitInputAndHostBinding(member, parsedHostBindings[k], sourceFile));
|
||
}
|
||
}
|
||
else if (parsedHostListeners && parsedHostListeners.length > 0) {
|
||
var l = 0;
|
||
var lenHL = parsedHostListeners.length;
|
||
for (l; l < lenHL; l++) {
|
||
hostListeners.push(this.visitHostListener(member, parsedHostListeners[l], sourceFile));
|
||
}
|
||
}
|
||
if (!this.isHiddenMember(member)) {
|
||
if (!(this.isPrivate(member) && Configuration$1.mainData.disablePrivate)) {
|
||
if (!(this.isInternal(member) && Configuration$1.mainData.disableInternal)) {
|
||
if (!(this.isProtected(member) && Configuration$1.mainData.disableProtected)) {
|
||
if (tsMorph.ts.isMethodDeclaration(member) || tsMorph.ts.isMethodSignature(member)) {
|
||
methods.push(this.visitMethodDeclaration(member, sourceFile));
|
||
}
|
||
else if (tsMorph.ts.isPropertyDeclaration(member) ||
|
||
tsMorph.ts.isPropertySignature(member)) {
|
||
if (!inputDecorator && !outputDecorator) {
|
||
properties.push(this.visitProperty(member, sourceFile));
|
||
}
|
||
}
|
||
else if (tsMorph.ts.isCallSignatureDeclaration(member)) {
|
||
properties.push(this.visitCallDeclaration(member, sourceFile));
|
||
}
|
||
else if (tsMorph.ts.isGetAccessorDeclaration(member) ||
|
||
tsMorph.ts.isSetAccessorDeclaration(member)) {
|
||
this.addAccessor(accessors, members[i], sourceFile);
|
||
}
|
||
else if (tsMorph.ts.isIndexSignatureDeclaration(member)) {
|
||
indexSignatures.push(this.visitIndexDeclaration(member, sourceFile));
|
||
}
|
||
else if (tsMorph.ts.isConstructorDeclaration(member)) {
|
||
var _constructorProperties = this.visitConstructorProperties(member, sourceFile);
|
||
var j = 0;
|
||
var len = _constructorProperties.length;
|
||
for (j; j < len; j++) {
|
||
properties.push(_constructorProperties[j]);
|
||
}
|
||
constructor = this.visitConstructorDeclaration(member, sourceFile);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
inputs.sort(getNamesCompareFn());
|
||
outputs.sort(getNamesCompareFn());
|
||
hostBindings.sort(getNamesCompareFn());
|
||
hostListeners.sort(getNamesCompareFn());
|
||
properties.sort(getNamesCompareFn());
|
||
methods.sort(getNamesCompareFn());
|
||
indexSignatures.sort(getNamesCompareFn());
|
||
result = {
|
||
inputs: inputs,
|
||
outputs: outputs,
|
||
hostBindings: hostBindings,
|
||
hostListeners: hostListeners,
|
||
methods: methods,
|
||
properties: properties,
|
||
indexSignatures: indexSignatures,
|
||
kind: kind,
|
||
constructor: constructor
|
||
};
|
||
if (Object.keys(accessors).length) {
|
||
result['accessors'] = accessors;
|
||
}
|
||
return result;
|
||
};
|
||
ClassHelper.prototype.visitTypeName = function (typeName) {
|
||
if (typeName.escapedText) {
|
||
return typeName.escapedText;
|
||
}
|
||
if (typeName.text) {
|
||
return typeName.text;
|
||
}
|
||
if (typeName.left && typeName.right) {
|
||
return this.visitTypeName(typeName.left) + '.' + this.visitTypeName(typeName.right);
|
||
}
|
||
return '';
|
||
};
|
||
ClassHelper.prototype.visitTypeIndex = function (node) {
|
||
var _return = '';
|
||
if (!node) {
|
||
return _return;
|
||
}
|
||
if (node.type &&
|
||
node.type.kind === tsMorph.SyntaxKind.IndexedAccessType &&
|
||
node.type.indexType &&
|
||
node.type.indexType.literal) {
|
||
return this.visitTypeName(node.type.indexType.literal);
|
||
}
|
||
return _return;
|
||
};
|
||
ClassHelper.prototype.visitType = function (node) {
|
||
var e_5, _a;
|
||
var _this = this;
|
||
var _return = 'void';
|
||
if (!node) {
|
||
return _return;
|
||
}
|
||
if (node.typeName) {
|
||
_return = this.visitTypeName(node.typeName);
|
||
}
|
||
else if (node.type) {
|
||
if (node.type.kind &&
|
||
!tsMorph.ts.isUnionTypeNode(node.type) &&
|
||
!tsMorph.ts.isTupleTypeNode(node.type)) {
|
||
_return = kindToType(node.type.kind);
|
||
}
|
||
if (node.type.typeName) {
|
||
_return = this.visitTypeName(node.type.typeName);
|
||
}
|
||
if (node.type.typeArguments) {
|
||
_return += '<';
|
||
var typeArguments = [];
|
||
try {
|
||
for (var _b = logger.__values(node.type.typeArguments), _c = _b.next(); !_c.done; _c = _b.next()) {
|
||
var argument = _c.value;
|
||
typeArguments.push(this.visitType(argument));
|
||
}
|
||
}
|
||
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
||
finally {
|
||
try {
|
||
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
||
}
|
||
finally { if (e_5) throw e_5.error; }
|
||
}
|
||
_return += typeArguments.join(' | ');
|
||
_return += '>';
|
||
}
|
||
if (node.type.elementType) {
|
||
var _firstPart = this.visitType(node.type.elementType);
|
||
_return = _firstPart + kindToType(node.type.kind);
|
||
if (node.type.elementType.kind === tsMorph.SyntaxKind.ParenthesizedType) {
|
||
_return = '(' + _firstPart + ')' + kindToType(node.type.kind);
|
||
}
|
||
}
|
||
var parseTypesOrElements = function (arr, separator) {
|
||
var e_6, _a;
|
||
var i = 0;
|
||
var len = arr.length;
|
||
for (i; i < len; i++) {
|
||
var type = arr[i];
|
||
if (type.elementType) {
|
||
var _firstPart = _this.visitType(type.elementType);
|
||
if (type.elementType.kind === tsMorph.SyntaxKind.ParenthesizedType) {
|
||
_return += '(' + _firstPart + ')' + kindToType(type.kind);
|
||
}
|
||
else {
|
||
_return += _firstPart + kindToType(type.kind);
|
||
}
|
||
}
|
||
else {
|
||
if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
|
||
if (type.literal.text) {
|
||
_return += '"' + type.literal.text + '"';
|
||
}
|
||
else {
|
||
_return += kindToType(type.literal.kind);
|
||
}
|
||
}
|
||
else if (type.typeName) {
|
||
_return += _this.visitTypeName(type.typeName);
|
||
}
|
||
else if (type.kind === tsMorph.SyntaxKind.RestType && type.type) {
|
||
_return += '...' + _this.visitType(type.type);
|
||
}
|
||
else {
|
||
_return += kindToType(type.kind);
|
||
}
|
||
if (type.typeArguments) {
|
||
_return += '<';
|
||
var typeArguments = [];
|
||
try {
|
||
for (var _b = (e_6 = void 0, logger.__values(type.typeArguments)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
||
var argument = _c.value;
|
||
typeArguments.push(_this.visitType(argument));
|
||
}
|
||
}
|
||
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
||
finally {
|
||
try {
|
||
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
||
}
|
||
finally { if (e_6) throw e_6.error; }
|
||
}
|
||
_return += typeArguments.join(separator);
|
||
_return += '>';
|
||
}
|
||
}
|
||
if (i < len - 1) {
|
||
_return += separator;
|
||
}
|
||
}
|
||
};
|
||
if (node.type.elements && tsMorph.ts.isTupleTypeNode(node.type)) {
|
||
_return = '[';
|
||
parseTypesOrElements(node.type.elements, ', ');
|
||
_return += ']';
|
||
}
|
||
if (node.type.types && tsMorph.ts.isUnionTypeNode(node.type)) {
|
||
_return = '';
|
||
parseTypesOrElements(node.type.types, ' | ');
|
||
}
|
||
if (node.type.elementTypes) {
|
||
var elementTypes = node.type.elementTypes;
|
||
var i = 0;
|
||
var len = elementTypes.length;
|
||
if (len > 0) {
|
||
_return = '[';
|
||
for (i; i < len; i++) {
|
||
var type = elementTypes[i];
|
||
if (type.kind === tsMorph.SyntaxKind.ArrayType && type.elementType) {
|
||
_return += kindToType(type.elementType.kind);
|
||
_return += kindToType(type.kind);
|
||
}
|
||
else if (type.typeName) {
|
||
// For type references, use the type name directly instead of kindToType + typeName
|
||
_return += this.visitTypeName(type.typeName);
|
||
}
|
||
else {
|
||
_return += kindToType(type.kind);
|
||
}
|
||
if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
|
||
if (type.literal.text) {
|
||
_return += '"' + type.literal.text + '"';
|
||
}
|
||
else {
|
||
_return += kindToType(type.literal.kind);
|
||
}
|
||
}
|
||
if (type.kind === tsMorph.SyntaxKind.RestType && type.type) {
|
||
_return += '...' + this.visitType(type.type);
|
||
}
|
||
if (type.kind === tsMorph.SyntaxKind.TypeReference &&
|
||
type.typeName &&
|
||
typeof type.typeName.escapedText !== 'undefined' &&
|
||
type.typeName.escapedText === '') {
|
||
continue;
|
||
}
|
||
if (i < len - 1) {
|
||
_return += ', ';
|
||
}
|
||
}
|
||
_return += ']';
|
||
}
|
||
}
|
||
if (node.type &&
|
||
node.type.kind === tsMorph.SyntaxKind.IndexedAccessType &&
|
||
node.type.objectType &&
|
||
node.type.objectType.typeName) {
|
||
_return = this.visitTypeName(node.type.objectType.typeName);
|
||
}
|
||
}
|
||
else if (node.elementType) {
|
||
_return = kindToType(node.elementType.kind) + kindToType(node.kind);
|
||
if (node.elementType.typeName) {
|
||
_return = this.visitTypeName(node.elementType.typeName) + kindToType(node.kind);
|
||
}
|
||
}
|
||
else if (node.types && tsMorph.ts.isUnionTypeNode(node)) {
|
||
_return = '';
|
||
var i = 0;
|
||
var len = node.types.length;
|
||
for (i; i < len; i++) {
|
||
var type = node.types[i];
|
||
if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
|
||
if (type.literal.text) {
|
||
_return += '"' + type.literal.text + '"';
|
||
}
|
||
else {
|
||
_return += kindToType(type.literal.kind);
|
||
}
|
||
}
|
||
else if (type.typeName) {
|
||
_return += this.visitTypeName(type.typeName);
|
||
}
|
||
else {
|
||
_return += kindToType(type.kind);
|
||
}
|
||
if (i < len - 1) {
|
||
_return += ' | ';
|
||
}
|
||
}
|
||
}
|
||
else if (node.dotDotDotToken) {
|
||
_return = 'any[]';
|
||
}
|
||
else {
|
||
_return = kindToType(node.kind);
|
||
if ((_return === '' || _return === 'unknown') &&
|
||
node.initializer &&
|
||
node.initializer.kind &&
|
||
(node.kind === tsMorph.SyntaxKind.PropertyDeclaration || node.kind === tsMorph.SyntaxKind.Parameter)) {
|
||
_return = kindToType(node.initializer.kind);
|
||
}
|
||
if (node.kind === tsMorph.SyntaxKind.TypeParameter) {
|
||
_return = node.name.text;
|
||
}
|
||
if (node.kind === tsMorph.SyntaxKind.LiteralType) {
|
||
_return = node.literal.text;
|
||
}
|
||
}
|
||
if (node.typeArguments && node.typeArguments.length > 0) {
|
||
_return += '<';
|
||
var i = 0, len = node.typeArguments.length;
|
||
for (i; i < len; i++) {
|
||
var argument = node.typeArguments[i];
|
||
_return += this.visitType(argument);
|
||
if (i >= 0 && i < len - 1) {
|
||
_return += ', ';
|
||
}
|
||
}
|
||
_return += '>';
|
||
}
|
||
return _return;
|
||
};
|
||
ClassHelper.prototype.visitCallDeclaration = function (method, sourceFile) {
|
||
var _this = this;
|
||
var sourceCode = sourceFile.getText();
|
||
var hash = crypto$7.createHash('sha512').update(sourceCode).digest('hex');
|
||
var result = logger.__assign({ id: 'call-declaration-' + hash, args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [], returnType: this.visitType(method.type), line: this.getPosition(method, sourceFile).line + 1 }, this.initializeDocumentationFields());
|
||
this.extractAndProcessJSDocComment(method, sourceFile, result);
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
||
this.processJSDocTags(jsdoctags, result);
|
||
return result;
|
||
};
|
||
ClassHelper.prototype.visitIndexDeclaration = function (method, sourceFile) {
|
||
var _this = this;
|
||
var sourceCode = sourceFile.getText();
|
||
var hash = crypto$7.createHash('sha512').update(sourceCode).digest('hex');
|
||
var result = logger.__assign({ id: 'index-declaration-' + hash, args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [], returnType: this.visitType(method.type), line: this.getPosition(method, sourceFile).line + 1 }, this.initializeDocumentationFields());
|
||
this.extractAndProcessJSDocComment(method, sourceFile, result);
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
||
this.processJSDocTags(jsdoctags, result);
|
||
return result;
|
||
};
|
||
ClassHelper.prototype.visitConstructorDeclaration = function (method, sourceFile) {
|
||
var _this = this;
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
var result = logger.__assign(logger.__assign({ name: 'constructor', description: '' }, this.initializeDocumentationFields()), { args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [], line: this.getPosition(method, sourceFile).line + 1 });
|
||
this.extractAndProcessJSDocComment(method, sourceFile, result);
|
||
var kinds = this.extractModifierKinds(method);
|
||
if (kinds) {
|
||
result.modifierKind = kinds;
|
||
}
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
||
this.processJSDocTags(jsdoctags, result);
|
||
if (result.jsdoctags && result.jsdoctags.length > 0) {
|
||
result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
|
||
}
|
||
else if (result.args.length > 0) {
|
||
result.jsdoctags = mergeTagsAndArgs(result.args);
|
||
}
|
||
return result;
|
||
};
|
||
ClassHelper.prototype.visitProperty = function (property, sourceFile) {
|
||
// PropertySignature (interfaces) don't have initializer, PropertyDeclaration (classes) do
|
||
var initializer = tsMorph.ts.isPropertyDeclaration(property) ? property.initializer : undefined;
|
||
// Extract property name, handling different node types:
|
||
// - Identifier: regular property names
|
||
// - PrivateIdentifier: ECMAScript private fields like #privateField
|
||
// - ComputedPropertyName: computed names like ['__allAnd']
|
||
var propertyName = '';
|
||
// Check for mock objects first (for testing)
|
||
if (property.name.text) {
|
||
propertyName = property.name.text;
|
||
}
|
||
else if (tsMorph.ts.isIdentifier(property.name)) {
|
||
propertyName = property.name.text;
|
||
}
|
||
else if (tsMorph.ts.isPrivateIdentifier(property.name)) {
|
||
propertyName = property.name.text; // includes the # prefix
|
||
}
|
||
else if (tsMorph.ts.isComputedPropertyName(property.name)) {
|
||
// Handle computed property names like ['__allAnd']
|
||
if (tsMorph.ts.isStringLiteral(property.name.expression)) {
|
||
propertyName = property.name.expression.text;
|
||
}
|
||
else if (tsMorph.ts.isIdentifier(property.name.expression)) {
|
||
propertyName = property.name.expression.text;
|
||
}
|
||
}
|
||
var result = logger.__assign(logger.__assign({ name: propertyName, defaultValue: initializer
|
||
? this.stringifyDefaultValue(initializer)
|
||
: undefined }, this.initializeDocumentationFields()), { type: this.visitType(property), indexKey: this.visitTypeIndex(property), optional: typeof property.questionToken !== 'undefined', description: '', line: this.getPosition(property, sourceFile).line + 1 });
|
||
if (initializer && initializer.kind === tsMorph.SyntaxKind.ArrowFunction) {
|
||
result.defaultValue = '() => {...}';
|
||
}
|
||
if (typeof result.name === 'undefined' && property.name.expression) {
|
||
result.name = property.name.expression.text;
|
||
}
|
||
this.extractAndProcessJSDocComment(property, sourceFile, result);
|
||
if (nodeHasDecorator(property)) {
|
||
var propertyDecorators = getNodeDecorators(property);
|
||
result.decorators = this.formatDecorators(propertyDecorators);
|
||
}
|
||
var kinds = this.extractModifierKinds(property);
|
||
if (kinds) {
|
||
result.modifierKind = kinds;
|
||
}
|
||
// Check for ECMAScript Private Fields
|
||
this.ensurePrivateKeyword(result, property);
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
|
||
if (jsdoctags && jsdoctags.length >= 1) {
|
||
var jsdoc = jsdoctags[0];
|
||
if (jsdoc && jsdoc.tags) {
|
||
this.checkForDeprecation(jsdoc.tags, result);
|
||
if (property.jsDoc) {
|
||
result.jsdoctags = markedtags(jsdoc.tags);
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
ClassHelper.prototype.visitConstructorProperties = function (constr, sourceFile) {
|
||
if (constr.parameters) {
|
||
var _parameters_1 = [];
|
||
var i = 0;
|
||
var len = constr.parameters.length;
|
||
for (i; i < len; i++) {
|
||
var parameterOfConstructor = constr.parameters[i];
|
||
if (isIgnore(parameterOfConstructor)) {
|
||
continue;
|
||
}
|
||
if (this.isInternal(parameterOfConstructor) &&
|
||
Configuration$1.mainData.disableInternal) {
|
||
continue;
|
||
}
|
||
if (this.isPublic(parameterOfConstructor)) {
|
||
_parameters_1.push(this.visitProperty(constr.parameters[i], sourceFile));
|
||
}
|
||
}
|
||
/**
|
||
* Merge JSDoc tags description from constructor with parameters
|
||
*/
|
||
if (constr.jsDoc) {
|
||
if (constr.jsDoc.length > 0) {
|
||
var constrTags = constr.jsDoc[0].tags;
|
||
if (constrTags && constrTags.length > 0) {
|
||
constrTags.forEach(function (tag) {
|
||
_parameters_1.forEach(function (param) {
|
||
if (tag.tagName &&
|
||
tag.tagName.escapedText &&
|
||
tag.tagName.escapedText === 'param') {
|
||
if (tag.name &&
|
||
tag.name.escapedText &&
|
||
tag.name.escapedText === param.name) {
|
||
param.description = tag.comment;
|
||
}
|
||
}
|
||
});
|
||
});
|
||
}
|
||
}
|
||
}
|
||
return _parameters_1;
|
||
}
|
||
else {
|
||
return [];
|
||
}
|
||
};
|
||
ClassHelper.prototype.visitMethodDeclaration = function (method, sourceFile) {
|
||
var _this = this;
|
||
var result = logger.__assign({ name: method.name.text || (tsMorph.ts.isIdentifier(method.name) ? method.name.text : ''), args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [], optional: typeof method.questionToken !== 'undefined', returnType: this.visitType(method.type), typeParameters: [], line: this.getPosition(method, sourceFile).line + 1 }, this.initializeDocumentationFields());
|
||
if (typeof method.type === 'undefined') {
|
||
// Try to get inferred type
|
||
if (method.symbol) {
|
||
var symbol = method.symbol;
|
||
if (symbol.valueDeclaration) {
|
||
var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
|
||
if (symbolType) {
|
||
try {
|
||
var signature = this.typeChecker.getSignatureFromDeclaration(method);
|
||
var returnType = signature.getReturnType();
|
||
result.returnType = this.typeChecker.typeToString(returnType);
|
||
// tslint:disable-next-line:no-empty
|
||
}
|
||
catch (error) { }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (method.typeParameters && method.typeParameters.length > 0) {
|
||
result.typeParameters = method.typeParameters.map(function (typeParameter) {
|
||
return _this.visitType(typeParameter);
|
||
});
|
||
}
|
||
this.extractAndProcessJSDocComment(method, sourceFile, result);
|
||
if (nodeHasDecorator(method)) {
|
||
var methodDecorators = getNodeDecorators(method);
|
||
result.decorators = this.formatDecorators(methodDecorators);
|
||
}
|
||
var kinds = this.extractModifierKinds(method);
|
||
if (kinds) {
|
||
result.modifierKind = kinds;
|
||
}
|
||
// Check for ECMAScript Private Fields
|
||
this.ensurePrivateKeyword(result, method);
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
||
this.processJSDocTags(jsdoctags, result);
|
||
if (result.jsdoctags && result.jsdoctags.length > 0) {
|
||
result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
|
||
}
|
||
else if (result.args.length > 0) {
|
||
result.jsdoctags = mergeTagsAndArgs(result.args);
|
||
}
|
||
return result;
|
||
};
|
||
ClassHelper.prototype.visitOutput = function (property, outDecorator, sourceFile) {
|
||
var inArgs = outDecorator.expression.arguments;
|
||
var _return = logger.__assign({ name: inArgs.length > 0 ? inArgs[0].text : (property.name.text || (tsMorph.ts.isIdentifier(property.name) ? property.name.text : '')), defaultValue: property.initializer
|
||
? this.stringifyDefaultValue(property.initializer)
|
||
: undefined }, this.initializeDocumentationFields());
|
||
if (property.jsDoc) {
|
||
this.extractAndProcessJSDocComment(property, sourceFile, _return);
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
|
||
this.processJSDocTags(jsdoctags, _return);
|
||
}
|
||
this.setFallbackDescription(_return, property);
|
||
_return.line = this.getPosition(property, sourceFile).line + 1;
|
||
if (property.type) {
|
||
_return.type = this.visitType(property);
|
||
}
|
||
else {
|
||
// handle NewExpression
|
||
if (property.initializer) {
|
||
if (tsMorph.ts.isNewExpression(property.initializer)) {
|
||
if (property.initializer.expression) {
|
||
_return.type = property.initializer.expression.text;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return _return;
|
||
};
|
||
ClassHelper.prototype.visitArgument = function (arg) {
|
||
var _this = this;
|
||
var _result = logger.__assign({ name: arg.name.text || (tsMorph.ts.isIdentifier(arg.name) ? arg.name.text : ''), type: this.visitType(arg), optional: !!arg.questionToken, dotDotDotToken: !!arg.dotDotDotToken }, this.initializeDocumentationFields());
|
||
if (arg.type && arg.type.kind && tsMorph.ts.isFunctionTypeNode(arg.type)) {
|
||
_result.function = arg.type.parameters
|
||
? arg.type.parameters.map(function (prop) { return _this.visitArgument(prop); })
|
||
: [];
|
||
}
|
||
if (arg.initializer) {
|
||
_result.defaultValue = this.stringifyDefaultValue(arg.initializer);
|
||
}
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(arg);
|
||
this.processJSDocTags(jsdoctags, _result, false);
|
||
return _result;
|
||
};
|
||
ClassHelper.prototype.visitInputAndHostBinding = function (property, inDecorator, sourceFile) {
|
||
var inArgs = inDecorator.expression.arguments;
|
||
var _return = {};
|
||
var isInputConfigStringLiteral = false;
|
||
var isInputConfigObjectLiteralExpression = false;
|
||
var hasRequiredField = false;
|
||
var hasAlias = false;
|
||
var getRequiredField = function () {
|
||
return inArgs[0].properties.find(function (property) { return property.name.escapedText === 'required'; });
|
||
};
|
||
var getAliasProperty = function () {
|
||
return inArgs[0].properties.find(function (property) { return property.name.escapedText === 'alias'; });
|
||
};
|
||
if (inArgs.length > 0) {
|
||
isInputConfigStringLiteral = inArgs[0] && tsMorph.ts.isStringLiteral(inArgs[0]);
|
||
isInputConfigObjectLiteralExpression =
|
||
inArgs[0] && tsMorph.ts.isObjectLiteralExpression(inArgs[0]);
|
||
if (isInputConfigObjectLiteralExpression && inArgs[0].properties) {
|
||
hasRequiredField = isInputConfigObjectLiteralExpression && !!getRequiredField();
|
||
hasAlias = isInputConfigObjectLiteralExpression ? !!getAliasProperty() : false;
|
||
_return.required = !!getRequiredField();
|
||
}
|
||
_return.name = isInputConfigStringLiteral
|
||
? inArgs[0].text
|
||
: hasAlias
|
||
? getAliasProperty().initializer.text
|
||
: property.name.text;
|
||
}
|
||
else {
|
||
_return.name = property.name.text;
|
||
}
|
||
_return.defaultValue = property.initializer
|
||
? this.stringifyDefaultValue(property.initializer)
|
||
: undefined;
|
||
Object.assign(_return, this.initializeDocumentationFields());
|
||
if (inArgs.length > 0 && inArgs[0].properties && hasRequiredField) {
|
||
_return.optional = getRequiredField().initializer.kind !== tsMorph.SyntaxKind.TrueKeyword;
|
||
}
|
||
if (!_return.description && property.jsDoc && property.jsDoc.length > 0) {
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
|
||
this.processJSDocTags(jsdoctags, _return);
|
||
this.extractAndProcessJSDocComment(property, sourceFile, _return);
|
||
}
|
||
_return.line = this.getPosition(property, sourceFile).line + 1;
|
||
if (property.type) {
|
||
_return.type = this.visitType(property);
|
||
}
|
||
else {
|
||
// handle NewExpression
|
||
if (property.initializer) {
|
||
if (tsMorph.ts.isNewExpression(property.initializer)) {
|
||
if (property.initializer.expression) {
|
||
_return.type = property.initializer.expression.text;
|
||
}
|
||
}
|
||
}
|
||
// Try to get inferred type
|
||
if (property.symbol) {
|
||
var symbol = property.symbol;
|
||
if (symbol.valueDeclaration) {
|
||
var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
|
||
if (symbolType) {
|
||
_return.type = this.typeChecker.typeToString(symbolType);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (property.kind === tsMorph.SyntaxKind.SetAccessor) {
|
||
// For setter accessor, find type in first parameter
|
||
if (property.parameters && property.parameters.length === 1) {
|
||
if (property.parameters[0].type) {
|
||
_return.type = this.visitType(property.parameters[0].type);
|
||
}
|
||
}
|
||
}
|
||
if (nodeHasDecorator(property)) {
|
||
var propertyDecorators = getNodeDecorators(property);
|
||
_return.decorators = this.formatDecorators(propertyDecorators).filter(function (item) { return item.name !== 'Input' && item.name !== 'HostBinding'; });
|
||
}
|
||
return _return;
|
||
};
|
||
ClassHelper.prototype.visitHostListener = function (property, hostListenerDecorator, sourceFile) {
|
||
var _this = this;
|
||
var inArgs = hostListenerDecorator.expression.arguments;
|
||
var _return = {};
|
||
_return.name = inArgs.length > 0 ? inArgs[0].text : property.name.text;
|
||
_return.args = property.parameters
|
||
? property.parameters.map(function (prop) { return _this.visitArgument(prop); })
|
||
: [];
|
||
_return.argsDecorator =
|
||
inArgs.length > 1
|
||
? inArgs[1].elements.map(function (prop) {
|
||
return prop.text;
|
||
})
|
||
: [];
|
||
Object.assign(_return, this.initializeDocumentationFields());
|
||
if (property.jsDoc) {
|
||
this.extractAndProcessJSDocComment(property, sourceFile, _return);
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
|
||
this.processJSDocTags(jsdoctags, _return);
|
||
}
|
||
this.setFallbackDescription(_return, property);
|
||
_return.line = this.getPosition(property, sourceFile).line + 1;
|
||
return _return;
|
||
};
|
||
return ClassHelper;
|
||
}());
|
||
|
||
var TsPrinterUtil = /** @class */ (function () {
|
||
function TsPrinterUtil() {
|
||
this.printer = tsMorph.ts.createPrinter({
|
||
newLine: tsMorph.ts.NewLineKind.LineFeed
|
||
});
|
||
}
|
||
TsPrinterUtil.prototype.print = function (node) {
|
||
return this.printer.printNode(tsMorph.ts.EmitHint.Unspecified, node, tsMorph.ts.createSourceFile('', '', tsMorph.ts.ScriptTarget.Latest));
|
||
};
|
||
return TsPrinterUtil;
|
||
}());
|
||
|
||
// @ts-nocheck
|
||
var AngularProviderConfigProperties;
|
||
(function (AngularProviderConfigProperties) {
|
||
AngularProviderConfigProperties["Useclass"] = "useClass";
|
||
AngularProviderConfigProperties["UseValue"] = "useValue";
|
||
AngularProviderConfigProperties["UseFactory"] = "useFactory";
|
||
AngularProviderConfigProperties["UseExisting"] = "useExisting";
|
||
})(AngularProviderConfigProperties || (AngularProviderConfigProperties = {}));
|
||
var SymbolHelper = /** @class */ (function () {
|
||
function SymbolHelper() {
|
||
this.unknown = '???';
|
||
}
|
||
SymbolHelper.prototype.parseDeepIndentifier = function (name, srcFile) {
|
||
var result = {
|
||
name: '',
|
||
type: ''
|
||
};
|
||
if (typeof name === 'undefined') {
|
||
return result;
|
||
}
|
||
var nsModule = name.split('.');
|
||
var type = this.getType(name);
|
||
if (nsModule.length > 1) {
|
||
result.ns = nsModule[0];
|
||
result.name = name;
|
||
result.type = type;
|
||
return result;
|
||
}
|
||
if (typeof srcFile !== 'undefined') {
|
||
result.file = ImportsUtil$1.getFileNameOfImport(name, srcFile);
|
||
}
|
||
result.name = name;
|
||
result.type = type;
|
||
return result;
|
||
};
|
||
SymbolHelper.prototype.getType = function (name) {
|
||
var type;
|
||
if (name.toLowerCase().indexOf('component') !== -1) {
|
||
type = 'component';
|
||
}
|
||
else if (name.toLowerCase().indexOf('pipe') !== -1) {
|
||
type = 'pipe';
|
||
}
|
||
else if (name.toLowerCase().indexOf('controller') !== -1) {
|
||
type = 'controller';
|
||
}
|
||
else if (name.toLowerCase().indexOf('module') !== -1) {
|
||
type = 'module';
|
||
}
|
||
else if (name.toLowerCase().indexOf('directive') !== -1) {
|
||
type = 'directive';
|
||
}
|
||
else if (name.toLowerCase().indexOf('injectable') !== -1 ||
|
||
name.toLowerCase().indexOf('service') !== -1) {
|
||
type = 'injectable';
|
||
}
|
||
return type;
|
||
};
|
||
/**
|
||
* Output
|
||
* RouterModule.forRoot 179
|
||
*/
|
||
SymbolHelper.prototype.buildIdentifierName = function (node, name) {
|
||
if (tsMorph.ts.isIdentifier(node) && !tsMorph.ts.isPropertyAccessExpression(node)) {
|
||
return "".concat(node.text, ".").concat(name);
|
||
}
|
||
name = name ? ".".concat(name) : '';
|
||
var nodeName = this.unknown;
|
||
if (node.name) {
|
||
nodeName = node.name.text;
|
||
}
|
||
else if (node.text) {
|
||
nodeName = node.text;
|
||
}
|
||
else if (node.expression) {
|
||
if (node.expression.text) {
|
||
nodeName = node.expression.text;
|
||
}
|
||
else if (node.expression.elements) {
|
||
if (tsMorph.ts.isArrayLiteralExpression(node.expression)) {
|
||
nodeName = node.expression.elements.map(function (el) { return el.text; }).join(', ');
|
||
nodeName = "[".concat(nodeName, "]");
|
||
}
|
||
}
|
||
}
|
||
if (tsMorph.ts.isSpreadElement(node)) {
|
||
return "...".concat(nodeName);
|
||
}
|
||
return "".concat(this.buildIdentifierName(node.expression, nodeName)).concat(name);
|
||
};
|
||
/**
|
||
* parse expressions such as:
|
||
* { provide: APP_BASE_HREF, useValue: '/' }
|
||
* { provide: 'Date', useFactory: (d1, d2) => new Date(), deps: ['d1', 'd2'] }
|
||
*/
|
||
SymbolHelper.prototype.parseProviderConfiguration = function (node) {
|
||
if (node.kind && node.kind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
|
||
var provideProperty = node.properties.find(function (props) { return props.name.getText() === 'provide'; });
|
||
if (!provideProperty) {
|
||
throw new Error("provide property not found in provider object config");
|
||
}
|
||
var providerObjectProps = Object.values(AngularProviderConfigProperties);
|
||
var _loop_1 = function (i) {
|
||
var providerProp = providerObjectProps[i];
|
||
var prop = node.properties.find(function (props) { return props.name.getText() === providerProp; });
|
||
if (prop) {
|
||
return { value: prop.getLastToken().getText() };
|
||
}
|
||
};
|
||
for (var i = 0; i < providerObjectProps.length; i++) {
|
||
var state_1 = _loop_1(i);
|
||
if (typeof state_1 === "object")
|
||
return state_1.value;
|
||
}
|
||
}
|
||
return new TsPrinterUtil().print(node);
|
||
};
|
||
/**
|
||
* Kind
|
||
* 181 CallExpression => "RouterModule.forRoot(args)"
|
||
* 71 Identifier => "RouterModule" "TodoStore"
|
||
* 9 StringLiteral => "./app.component.css" "./tab.scss"
|
||
*/
|
||
SymbolHelper.prototype.parseSymbolElements = function (node) {
|
||
// parse expressions such as: AngularFireModule.initializeApp(firebaseConfig)
|
||
// if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {
|
||
if ((tsMorph.ts.isCallExpression(node) && tsMorph.ts.isPropertyAccessExpression(node.expression)) ||
|
||
(tsMorph.ts.isNewExpression(node) && tsMorph.ts.isElementAccessExpression(node.expression))) {
|
||
var className = this.buildIdentifierName(node.expression);
|
||
// function arguments could be really complex. There are so
|
||
// many use cases that we can't handle. Just print "args" to indicate
|
||
// that we have arguments.
|
||
var functionArgs = node.arguments.length > 0 ? 'args' : '';
|
||
var text = "".concat(className, "(").concat(functionArgs, ")");
|
||
return text;
|
||
}
|
||
else if (tsMorph.ts.isPropertyAccessExpression(node)) {
|
||
// parse expressions such as: Shared.Module
|
||
return this.buildIdentifierName(node);
|
||
}
|
||
else if (tsMorph.ts.isIdentifier(node)) {
|
||
// parse expressions such as: MyComponent
|
||
if (node.text) {
|
||
return node.text;
|
||
}
|
||
if (node.escapedText) {
|
||
return node.escapedText;
|
||
}
|
||
}
|
||
else if (tsMorph.ts.isSpreadElement(node)) {
|
||
// parse expressions such as: ...MYARRAY
|
||
// Resolve MYARRAY in imports or local file variables after full scan, just return the name of the variable
|
||
if (node.expression && node.expression.text) {
|
||
return node.expression.text;
|
||
}
|
||
}
|
||
return node.text ? node.text : this.parseProviderConfiguration(node);
|
||
};
|
||
/**
|
||
* Kind
|
||
* 177 ArrayLiteralExpression
|
||
* 122 BooleanKeyword
|
||
* 9 StringLiteral
|
||
*/
|
||
SymbolHelper.prototype.parseSymbols = function (node, srcFile, decoratorType) {
|
||
var _this = this;
|
||
var localNode = node;
|
||
if (tsMorph.ts.isShorthandPropertyAssignment(localNode) && decoratorType !== 'template') {
|
||
localNode = ImportsUtil$1.findValueInImportOrLocalVariables(node.name.text, srcFile, decoratorType);
|
||
}
|
||
if (tsMorph.ts.isShorthandPropertyAssignment(localNode) && decoratorType === 'template') {
|
||
var data = ImportsUtil$1.findValueInImportOrLocalVariables(node.name.text, srcFile, decoratorType);
|
||
return [data];
|
||
}
|
||
if (localNode.initializer && tsMorph.ts.isArrayLiteralExpression(localNode.initializer)) {
|
||
return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
|
||
}
|
||
else if ((localNode.initializer && tsMorph.ts.isStringLiteral(localNode.initializer)) ||
|
||
(localNode.initializer && tsMorph.ts.isTemplateLiteral(localNode.initializer)) ||
|
||
(localNode.initializer &&
|
||
tsMorph.ts.isPropertyAssignment(localNode) &&
|
||
localNode.initializer.text)) {
|
||
return [localNode.initializer.text];
|
||
}
|
||
else if (localNode.initializer &&
|
||
localNode.initializer.kind &&
|
||
(localNode.initializer.kind === tsMorph.SyntaxKind.TrueKeyword ||
|
||
localNode.initializer.kind === tsMorph.SyntaxKind.FalseKeyword)) {
|
||
return [localNode.initializer.kind === tsMorph.SyntaxKind.TrueKeyword ? true : false];
|
||
}
|
||
else if (localNode.initializer && tsMorph.ts.isPropertyAccessExpression(localNode.initializer)) {
|
||
var identifier = this.parseSymbolElements(localNode.initializer);
|
||
return [identifier];
|
||
}
|
||
else if (localNode.initializer &&
|
||
localNode.initializer.elements &&
|
||
localNode.initializer.elements.length > 0) {
|
||
// Node replaced by ts-simple-ast & kind = 265
|
||
return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
|
||
}
|
||
};
|
||
SymbolHelper.prototype.getSymbolDeps = function (props, decoratorType, srcFile, multiLine) {
|
||
var _this = this;
|
||
if (props.length === 0) {
|
||
return [];
|
||
}
|
||
var i = 0, len = props.length, filteredProps = [];
|
||
for (i; i < len; i++) {
|
||
if (props[i].name && props[i].name.text === decoratorType) {
|
||
filteredProps.push(props[i]);
|
||
}
|
||
}
|
||
return filteredProps.map(function (x) { return _this.parseSymbols(x, srcFile, decoratorType); }).pop() || [];
|
||
};
|
||
SymbolHelper.prototype.getSymbolDepsRaw = function (props, type, multiLine) {
|
||
return props.filter(function (node) { return node.name.getText() === type; });
|
||
};
|
||
return SymbolHelper;
|
||
}());
|
||
|
||
var ComponentHelper = /** @class */ (function () {
|
||
function ComponentHelper(classHelper, symbolHelper) {
|
||
if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
|
||
this.classHelper = classHelper;
|
||
this.symbolHelper = symbolHelper;
|
||
}
|
||
ComponentHelper.prototype.getComponentChangeDetection = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'changeDetection', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentEncapsulation = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'encapsulation', srcFile);
|
||
};
|
||
ComponentHelper.prototype.getComponentPure = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'pure', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentName = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'name', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentExportAs = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'exportAs', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentHostDirectives = function (props) {
|
||
var hostDirectiveSymbolParsed = this.symbolHelper.getSymbolDepsRaw(props, 'hostDirectives');
|
||
var hostDirectiveSymbol = null;
|
||
if (hostDirectiveSymbolParsed.length > 0) {
|
||
hostDirectiveSymbol = hostDirectiveSymbolParsed.pop();
|
||
}
|
||
var result = [];
|
||
if (hostDirectiveSymbol &&
|
||
hostDirectiveSymbol.initializer &&
|
||
hostDirectiveSymbol.initializer.elements &&
|
||
hostDirectiveSymbol.initializer.elements.length > 0) {
|
||
hostDirectiveSymbol.initializer.elements.forEach(function (element) {
|
||
if (element.kind === tsMorph.SyntaxKind.Identifier) {
|
||
result.push({
|
||
name: element.escapedText
|
||
});
|
||
}
|
||
else if (element.kind === tsMorph.SyntaxKind.ObjectLiteralExpression &&
|
||
element.properties &&
|
||
element.properties.length > 0) {
|
||
var parsedDirective_1 = {
|
||
name: '',
|
||
inputs: [],
|
||
outputs: []
|
||
};
|
||
element.properties.forEach(function (property) {
|
||
if (property.name.escapedText === 'directive') {
|
||
parsedDirective_1.name = property.initializer.escapedText;
|
||
}
|
||
else if (property.name.escapedText === 'inputs') {
|
||
if (property.initializer &&
|
||
property.initializer.elements &&
|
||
property.initializer.elements.length > 0) {
|
||
property.initializer.elements.forEach(function (propertyElement) {
|
||
parsedDirective_1.inputs.push(propertyElement.text);
|
||
});
|
||
}
|
||
}
|
||
else if (property.name.escapedText === 'outputs') {
|
||
if (property.initializer &&
|
||
property.initializer.elements &&
|
||
property.initializer.elements.length > 0) {
|
||
property.initializer.elements.forEach(function (propertyElement) {
|
||
parsedDirective_1.outputs.push(propertyElement.text);
|
||
});
|
||
}
|
||
}
|
||
});
|
||
result.push(parsedDirective_1);
|
||
}
|
||
});
|
||
}
|
||
return result;
|
||
};
|
||
ComponentHelper.prototype.getComponentHost = function (props) {
|
||
return this.getSymbolDepsObject(props, 'host');
|
||
};
|
||
ComponentHelper.prototype.getComponentTag = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'tag', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentInputsMetadata = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'inputs', srcFile);
|
||
};
|
||
ComponentHelper.prototype.getInputOutputSignals = function (props) {
|
||
var _this = this;
|
||
var inputSignals = [];
|
||
var outputSignals = [];
|
||
var properties = [];
|
||
props.forEach(function (prop) {
|
||
var inputSignal = _this.getInputSignal(prop);
|
||
if (inputSignal) {
|
||
inputSignals.push(inputSignal);
|
||
}
|
||
var outputSignal = _this.getOutputSignal(prop);
|
||
if (outputSignal) {
|
||
outputSignals.push(outputSignal);
|
||
}
|
||
if (!inputSignal && !outputSignal) {
|
||
properties.push(prop);
|
||
}
|
||
});
|
||
return { inputSignals: inputSignals, outputSignals: outputSignals, properties: properties };
|
||
};
|
||
ComponentHelper.prototype.getInputSignal = function (prop) {
|
||
var _a;
|
||
var config = (_a = this.getSignalConfig('input', prop.defaultValue)) !== null && _a !== void 0 ? _a : this.getSignalConfig('model', prop.defaultValue);
|
||
if (config) {
|
||
return logger.__assign(logger.__assign({}, prop), config);
|
||
}
|
||
return undefined;
|
||
};
|
||
ComponentHelper.prototype.getOutputSignal = function (prop) {
|
||
var _a;
|
||
var config = (_a = this.getSignalConfig('output', prop.defaultValue)) !== null && _a !== void 0 ? _a : this.getSignalConfig('model', prop.defaultValue);
|
||
if (config) {
|
||
return logger.__assign(logger.__assign({}, prop), config);
|
||
}
|
||
return undefined;
|
||
};
|
||
ComponentHelper.prototype.getSignalConfig = function (type, defaultValue) {
|
||
var _a;
|
||
// Matches a quote mark
|
||
var quotePattern = "['\"`]";
|
||
// Matches a value for the input
|
||
var valuePattern = function (capture) {
|
||
if (capture === void 0) { capture = true; }
|
||
return "(".concat(capture ? '' : '?:', "[^()]*(?:\\([^()]*\\)[^()]*)*)");
|
||
};
|
||
// Matches an optional space
|
||
var spacePattern = "(?: )*";
|
||
// Matches the input's type
|
||
var typesPattern = "(?:<((?:".concat(valuePattern(false), "(?:").concat(spacePattern, "\\|").concat(spacePattern, ")?)+)>)?");
|
||
// Matches the alias provided in the options
|
||
var aliasRegExp = new RegExp("alias:".concat(spacePattern).concat(quotePattern, "(\\w+)").concat(quotePattern));
|
||
// Matches a signal of the provided type
|
||
var signalRegExp = new RegExp("".concat(type, "(.required)?").concat(typesPattern, "\\(").concat(valuePattern(), "?(?:,").concat(spacePattern, "({.+}))?\\)"));
|
||
var matches = signalRegExp.exec(defaultValue === null || defaultValue === void 0 ? void 0 : defaultValue.replace(/\n/g, ''));
|
||
if (matches) {
|
||
var _b = logger.__read(matches, 5); _b[0]; var required = _b[1], type_1 = _b[2], defaultValue_1 = _b[3], options = _b[4];
|
||
var name = (_a = options === null || options === void 0 ? void 0 : options.match(aliasRegExp)) === null || _a === void 0 ? void 0 : _a[1];
|
||
var result = {
|
||
required: !!required,
|
||
type: this.parseSignalType(type_1),
|
||
defaultValue: defaultValue_1
|
||
};
|
||
if (name) {
|
||
return logger.__assign(logger.__assign({}, result), { name: name });
|
||
}
|
||
return result;
|
||
}
|
||
};
|
||
ComponentHelper.prototype.parseSignalType = function (type) {
|
||
if (!type) {
|
||
return type;
|
||
}
|
||
// adjust union string expression like: 'foo' | 'bar' | 'test'
|
||
// which should be outputed as: "foo" | "bar" | "test"
|
||
var unionTypeRegex = /^'([\w-]+)'\s?\|\s?('([\w-]+)'|.*)$/;
|
||
var typeRest = type;
|
||
var newType = "";
|
||
var typeMatch;
|
||
while ((typeMatch = typeRest.match(unionTypeRegex))) {
|
||
var _a = logger.__read(typeMatch, 4), first = _a[1], rest = _a[2], second = _a[3];
|
||
if (second) {
|
||
newType += "\"".concat(first, "\" | \"").concat(second, "\"");
|
||
type = newType;
|
||
break;
|
||
}
|
||
newType += "\"".concat(first, "\" | ");
|
||
typeRest = rest;
|
||
}
|
||
return type;
|
||
};
|
||
ComponentHelper.prototype.getComponentStandalone = function (props, srcFile) {
|
||
var result = null;
|
||
var parsedData = this.symbolHelper.getSymbolDeps(props, 'standalone', srcFile);
|
||
if (parsedData.length === 1) {
|
||
result = JSON.parse(parsedData[0]);
|
||
}
|
||
return result;
|
||
};
|
||
ComponentHelper.prototype.getComponentTemplate = function (props, srcFile) {
|
||
var t = this.symbolHelper.getSymbolDeps(props, 'template', srcFile, true).pop();
|
||
if (t) {
|
||
t = detectIndent(t);
|
||
t = t.replace(/\n/, '');
|
||
t = t.replace(/ +$/gm, '');
|
||
}
|
||
return t;
|
||
};
|
||
ComponentHelper.prototype.getComponentStyleUrls = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'styleUrls', srcFile);
|
||
};
|
||
ComponentHelper.prototype.getComponentStyleUrl = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'styleUrl', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentShadow = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'shadow', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentScoped = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'scoped', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentAssetsDir = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'assetsDir', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentAssetsDirs = function (props, srcFile) {
|
||
return this.sanitizeUrls(this.symbolHelper.getSymbolDeps(props, 'assetsDir', srcFile));
|
||
};
|
||
ComponentHelper.prototype.getComponentStyles = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'styles', srcFile);
|
||
};
|
||
ComponentHelper.prototype.getComponentModuleId = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'moduleId', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentOutputs = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'outputs', srcFile);
|
||
};
|
||
ComponentHelper.prototype.getComponentProviders = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper
|
||
.getSymbolDeps(props, 'providers', srcFile)
|
||
.map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
||
};
|
||
ComponentHelper.prototype.getComponentImports = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper
|
||
.getSymbolDeps(props, 'imports', srcFile)
|
||
.map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
||
};
|
||
ComponentHelper.prototype.getComponentEntryComponents = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper
|
||
.getSymbolDeps(props, 'entryComponents', srcFile)
|
||
.map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
||
};
|
||
ComponentHelper.prototype.getComponentViewProviders = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper
|
||
.getSymbolDeps(props, 'viewProviders', srcFile)
|
||
.map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
||
};
|
||
ComponentHelper.prototype.getComponentTemplateUrl = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'templateUrl', srcFile);
|
||
};
|
||
ComponentHelper.prototype.getComponentExampleUrls = function (text) {
|
||
var exampleUrlsMatches = text.match(/<example-url>(.*?)<\/example-url>/g);
|
||
var exampleUrls = undefined;
|
||
if (exampleUrlsMatches && exampleUrlsMatches.length) {
|
||
exampleUrls = exampleUrlsMatches.map(function (val) {
|
||
return val.replace(/<\/?example-url>/g, '');
|
||
});
|
||
}
|
||
return exampleUrls;
|
||
};
|
||
ComponentHelper.prototype.getComponentPreserveWhitespaces = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'preserveWhitespaces', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentSelector = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDeps(props, 'selector', srcFile).pop();
|
||
};
|
||
ComponentHelper.prototype.parseProperties = function (node) {
|
||
var _a;
|
||
var obj = new Map();
|
||
var element = node;
|
||
var properties = ((_a = element.initializer) === null || _a === void 0 ? void 0 : _a.properties) || [];
|
||
properties.forEach(function (prop) {
|
||
var _a, _b;
|
||
obj.set((_a = prop.name) === null || _a === void 0 ? void 0 : _a.text, (_b = prop.initializer) === null || _b === void 0 ? void 0 : _b.text);
|
||
});
|
||
return obj;
|
||
};
|
||
ComponentHelper.prototype.getSymbolDepsObject = function (props, type, multiLine) {
|
||
var _this = this;
|
||
var i = 0, len = props.length, filteredProps = [];
|
||
for (i; i < len; i++) {
|
||
if (props[i].name && props[i].name.text === type) {
|
||
filteredProps.push(props[i]);
|
||
}
|
||
}
|
||
return filteredProps.map(function (x) { return _this.parseProperties(x); }).pop();
|
||
};
|
||
ComponentHelper.prototype.getComponentIO = function (filename, sourceFile, node, fileBody, astFile) {
|
||
var _this = this;
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
|
||
var res = reducedSource.reduce(function (directive, statement) {
|
||
if (tsMorph.ts.isClassDeclaration(statement)) {
|
||
if (statement.pos === node.pos && statement.end === node.end) {
|
||
return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile, astFile));
|
||
}
|
||
}
|
||
return directive;
|
||
}, []);
|
||
return res[0] || {};
|
||
};
|
||
ComponentHelper.prototype.sanitizeUrls = function (urls) {
|
||
return urls.map(function (url) { return url.replace('./', ''); });
|
||
};
|
||
return ComponentHelper;
|
||
}());
|
||
var ComponentCache = /** @class */ (function () {
|
||
function ComponentCache() {
|
||
this.cache = new Map();
|
||
}
|
||
ComponentCache.prototype.get = function (key) {
|
||
return this.cache.get(key);
|
||
};
|
||
ComponentCache.prototype.set = function (key, value) {
|
||
this.cache.set(key, value);
|
||
};
|
||
return ComponentCache;
|
||
}());
|
||
|
||
var FrameworkDependencies = /** @class */ (function () {
|
||
function FrameworkDependencies(files, options) {
|
||
this.files = files;
|
||
var transpileOptions = {
|
||
target: tsMorph.ts.ScriptTarget.ES5,
|
||
module: tsMorph.ts.ModuleKind.CommonJS,
|
||
tsconfigDirectory: options.tsconfigDirectory,
|
||
allowJs: true
|
||
};
|
||
this.program = tsMorph.ts.createProgram(this.files, transpileOptions, compilerHost(transpileOptions));
|
||
this.typeChecker = this.program.getTypeChecker();
|
||
this.classHelper = new ClassHelper(this.typeChecker);
|
||
this.componentHelper = new ComponentHelper(this.classHelper);
|
||
}
|
||
return FrameworkDependencies;
|
||
}());
|
||
|
||
var CodeGenerator = /** @class */ (function () {
|
||
function CodeGenerator() {
|
||
}
|
||
CodeGenerator.prototype.generate = function (node) {
|
||
return this.visitAndRecognize(node, []).join('');
|
||
};
|
||
CodeGenerator.prototype.visitAndRecognize = function (node, code, depth) {
|
||
var _this = this;
|
||
if (depth === void 0) { depth = 0; }
|
||
this.recognize(node, code);
|
||
node.getChildren().forEach(function (c) { return _this.visitAndRecognize(c, code, depth + 1); });
|
||
return code;
|
||
};
|
||
CodeGenerator.prototype.recognize = function (node, code) {
|
||
var _this = this;
|
||
var conversion = TsKindConversion.find(function (x) { return x.kinds.some(function (z) { return z === node.kind; }); });
|
||
if (conversion) {
|
||
var result = conversion.output(node);
|
||
result.forEach(function (text) { return _this.gen(text, code); });
|
||
}
|
||
};
|
||
CodeGenerator.prototype.gen = function (token, code) {
|
||
if (!token) {
|
||
return;
|
||
}
|
||
if (token === '\n') {
|
||
code.push('');
|
||
}
|
||
else {
|
||
code.push(token);
|
||
}
|
||
};
|
||
return CodeGenerator;
|
||
}());
|
||
var TsKindsToText = /** @class */ (function () {
|
||
function TsKindsToText(output, kinds) {
|
||
this.output = output;
|
||
this.kinds = kinds;
|
||
}
|
||
return TsKindsToText;
|
||
}());
|
||
var TsKindConversion = [
|
||
new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [tsMorph.SyntaxKind.FirstLiteralToken, tsMorph.SyntaxKind.Identifier]),
|
||
new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [tsMorph.SyntaxKind.StringLiteral]),
|
||
new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.ArrayLiteralExpression]),
|
||
new TsKindsToText(function (node) { return ['import', ' ']; }, [tsMorph.SyntaxKind.ImportKeyword]),
|
||
new TsKindsToText(function (node) { return ['from', ' ']; }, [tsMorph.SyntaxKind.FromKeyword]),
|
||
new TsKindsToText(function (node) { return ['\n', 'export', ' ']; }, [tsMorph.SyntaxKind.ExportKeyword]),
|
||
new TsKindsToText(function (node) { return ['class', ' ']; }, [tsMorph.SyntaxKind.ClassKeyword]),
|
||
new TsKindsToText(function (node) { return ['this']; }, [tsMorph.SyntaxKind.ThisKeyword]),
|
||
new TsKindsToText(function (node) { return ['constructor']; }, [tsMorph.SyntaxKind.ConstructorKeyword]),
|
||
new TsKindsToText(function (node) { return ['false']; }, [tsMorph.SyntaxKind.FalseKeyword]),
|
||
new TsKindsToText(function (node) { return ['true']; }, [tsMorph.SyntaxKind.TrueKeyword]),
|
||
new TsKindsToText(function (node) { return ['null']; }, [tsMorph.SyntaxKind.NullKeyword]),
|
||
new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.AtToken]),
|
||
new TsKindsToText(function (node) { return ['+']; }, [tsMorph.SyntaxKind.PlusToken]),
|
||
new TsKindsToText(function (node) { return [' => ']; }, [tsMorph.SyntaxKind.EqualsGreaterThanToken]),
|
||
new TsKindsToText(function (node) { return ['(']; }, [tsMorph.SyntaxKind.OpenParenToken]),
|
||
new TsKindsToText(function (node) { return ['{', ' ']; }, [tsMorph.SyntaxKind.ImportClause, tsMorph.SyntaxKind.ObjectLiteralExpression]),
|
||
new TsKindsToText(function (node) { return ['{', '\n']; }, [tsMorph.SyntaxKind.Block]),
|
||
new TsKindsToText(function (node) { return ['}']; }, [tsMorph.SyntaxKind.CloseBraceToken]),
|
||
new TsKindsToText(function (node) { return [')']; }, [tsMorph.SyntaxKind.CloseParenToken]),
|
||
new TsKindsToText(function (node) { return ['[']; }, [tsMorph.SyntaxKind.OpenBracketToken]),
|
||
new TsKindsToText(function (node) { return [']']; }, [tsMorph.SyntaxKind.CloseBracketToken]),
|
||
new TsKindsToText(function (node) { return [';', '\n']; }, [tsMorph.SyntaxKind.SemicolonToken]),
|
||
new TsKindsToText(function (node) { return [',', ' ']; }, [tsMorph.SyntaxKind.CommaToken]),
|
||
new TsKindsToText(function (node) { return [' ', ':', ' ']; }, [tsMorph.SyntaxKind.ColonToken]),
|
||
new TsKindsToText(function (node) { return ['.']; }, [tsMorph.SyntaxKind.DotToken]),
|
||
new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.DoStatement]),
|
||
new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.Decorator]),
|
||
new TsKindsToText(function (node) { return [' = ']; }, [tsMorph.SyntaxKind.FirstAssignment]),
|
||
new TsKindsToText(function (node) { return [' ']; }, [tsMorph.SyntaxKind.FirstPunctuation]),
|
||
new TsKindsToText(function (node) { return ['private', ' ']; }, [tsMorph.SyntaxKind.PrivateKeyword]),
|
||
new TsKindsToText(function (node) { return ['public', ' ']; }, [tsMorph.SyntaxKind.PublicKeyword])
|
||
];
|
||
|
||
var crypto$6 = require('crypto');
|
||
var ComponentDepFactory = /** @class */ (function () {
|
||
function ComponentDepFactory(helper) {
|
||
this.helper = helper;
|
||
}
|
||
ComponentDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
|
||
// console.log(util.inspect(props, { showHidden: true, depth: 10 }));
|
||
var sourceCode = srcFile.getText();
|
||
var hash = crypto$6.createHash('sha512').update(sourceCode).digest('hex');
|
||
var componentDep = {
|
||
name: name,
|
||
id: 'component-' + name + '-' + hash,
|
||
file: file,
|
||
// animations?: string[]; // TODO
|
||
changeDetection: this.helper.getComponentChangeDetection(props, srcFile),
|
||
encapsulation: this.helper.getComponentEncapsulation(props, srcFile),
|
||
entryComponents: this.helper.getComponentEntryComponents(props, srcFile),
|
||
exportAs: this.helper.getComponentExportAs(props, srcFile),
|
||
host: this.helper.getComponentHost(props),
|
||
inputs: this.helper.getComponentInputsMetadata(props, srcFile),
|
||
// interpolation?: string; // TODO waiting doc infos
|
||
moduleId: this.helper.getComponentModuleId(props, srcFile),
|
||
outputs: this.helper.getComponentOutputs(props, srcFile),
|
||
providers: this.helper.getComponentProviders(props, srcFile),
|
||
// queries?: Deps[]; // TODO
|
||
selector: this.helper.getComponentSelector(props, srcFile),
|
||
styleUrls: this.helper.getComponentStyleUrls(props, srcFile),
|
||
styles: this.helper.getComponentStyles(props, srcFile), // TODO fix args
|
||
template: this.helper.getComponentTemplate(props, srcFile),
|
||
templateUrl: this.helper.getComponentTemplateUrl(props, srcFile),
|
||
viewProviders: this.helper.getComponentViewProviders(props, srcFile),
|
||
hostDirectives: logger.__spreadArray([], logger.__read(this.helper.getComponentHostDirectives(props)), false),
|
||
inputsClass: IO.inputs,
|
||
outputsClass: IO.outputs,
|
||
propertiesClass: IO.properties,
|
||
methodsClass: IO.methods,
|
||
deprecated: IO.deprecated,
|
||
deprecationMessage: IO.deprecationMessage,
|
||
hostBindings: IO.hostBindings,
|
||
hostListeners: IO.hostListeners,
|
||
standalone: this.helper.getComponentStandalone(props, srcFile) ? true : false,
|
||
imports: this.helper.getComponentImports(props, srcFile),
|
||
description: IO.description,
|
||
rawdescription: IO.rawdescription,
|
||
type: 'component',
|
||
sourceCode: srcFile.getText(),
|
||
exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText()),
|
||
tag: this.helper.getComponentTag(props, srcFile),
|
||
styleUrl: this.helper.getComponentStyleUrl(props, srcFile),
|
||
shadow: this.helper.getComponentShadow(props, srcFile),
|
||
scoped: this.helper.getComponentScoped(props, srcFile),
|
||
assetsDir: this.helper.getComponentAssetsDir(props, srcFile),
|
||
assetsDirs: this.helper.getComponentAssetsDirs(props, srcFile),
|
||
styleUrlsData: '',
|
||
stylesData: ''
|
||
};
|
||
if (typeof this.helper.getComponentPreserveWhitespaces(props, srcFile) !== 'undefined') {
|
||
componentDep.preserveWhitespaces = this.helper.getComponentPreserveWhitespaces(props, srcFile);
|
||
}
|
||
if (Configuration$1.mainData.disableLifeCycleHooks) {
|
||
componentDep.methodsClass = cleanLifecycleHooksFromMethods(componentDep.methodsClass);
|
||
}
|
||
if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
||
componentDep.jsdoctags = IO.jsdoctags[0].tags;
|
||
}
|
||
if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
|
||
componentDep.constructorObj = IO.constructor;
|
||
}
|
||
if (IO.extends) {
|
||
componentDep.extends = IO.extends;
|
||
}
|
||
if (IO.implements && IO.implements.length > 0) {
|
||
componentDep.implements = IO.implements;
|
||
}
|
||
if (IO.accessors) {
|
||
componentDep.accessors = IO.accessors;
|
||
}
|
||
if (IO.properties) {
|
||
var _a = this.helper.getInputOutputSignals(IO.properties), inputSignals = _a.inputSignals, outputSignals = _a.outputSignals, properties = _a.properties;
|
||
componentDep.inputsClass = componentDep.inputsClass.concat(inputSignals);
|
||
componentDep.outputsClass = componentDep.outputsClass.concat(outputSignals);
|
||
componentDep.propertiesClass = properties;
|
||
}
|
||
return componentDep;
|
||
};
|
||
return ComponentDepFactory;
|
||
}());
|
||
|
||
var crypto$5 = require('crypto');
|
||
var ControllerDepFactory = /** @class */ (function () {
|
||
function ControllerDepFactory() {
|
||
}
|
||
ControllerDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
|
||
var sourceCode = srcFile.getText();
|
||
var hash = crypto$5.createHash('sha512').update(sourceCode).digest('hex');
|
||
var infos = {
|
||
name: name,
|
||
id: 'controller-' + name + '-' + hash,
|
||
file: file,
|
||
methodsClass: IO.methods,
|
||
type: 'controller',
|
||
description: IO.description,
|
||
rawdescription: IO.rawdescription,
|
||
sourceCode: srcFile.text,
|
||
deprecated: IO.deprecated,
|
||
deprecationMessage: IO.deprecationMessage
|
||
};
|
||
if (properties && properties.length === 1) {
|
||
if (properties[0].text) {
|
||
infos.prefix = properties[0].text;
|
||
}
|
||
}
|
||
if (IO.extends) {
|
||
infos.extends = IO.extends;
|
||
}
|
||
return infos;
|
||
};
|
||
return ControllerDepFactory;
|
||
}());
|
||
|
||
var crypto$4 = require('crypto');
|
||
var DirectiveDepFactory = /** @class */ (function () {
|
||
function DirectiveDepFactory(helper) {
|
||
this.helper = helper;
|
||
}
|
||
DirectiveDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
|
||
var sourceCode = srcFile.getText();
|
||
var hash = crypto$4.createHash('sha512').update(sourceCode).digest('hex');
|
||
var directiveDeps = {
|
||
name: name,
|
||
id: 'directive-' + name + '-' + hash,
|
||
file: file,
|
||
type: 'directive',
|
||
description: IO.description,
|
||
rawdescription: IO.rawdescription,
|
||
sourceCode: srcFile.getText(),
|
||
selector: this.helper.getComponentSelector(props, srcFile),
|
||
providers: this.helper.getComponentProviders(props, srcFile),
|
||
exportAs: this.helper.getComponentExportAs(props, srcFile),
|
||
hostDirectives: logger.__spreadArray([], logger.__read(this.helper.getComponentHostDirectives(props)), false),
|
||
standalone: this.helper.getComponentStandalone(props, srcFile) ? true : false,
|
||
inputsClass: IO.inputs,
|
||
outputsClass: IO.outputs,
|
||
deprecated: IO.deprecated,
|
||
deprecationMessage: IO.deprecationMessage,
|
||
hostBindings: IO.hostBindings,
|
||
hostListeners: IO.hostListeners,
|
||
propertiesClass: IO.properties,
|
||
methodsClass: IO.methods,
|
||
exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText())
|
||
};
|
||
if (Configuration$1.mainData.disableLifeCycleHooks) {
|
||
directiveDeps.methodsClass = cleanLifecycleHooksFromMethods(directiveDeps.methodsClass);
|
||
}
|
||
if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
||
directiveDeps.jsdoctags = IO.jsdoctags[0].tags;
|
||
}
|
||
if (IO.extends) {
|
||
directiveDeps.extends = IO.extends;
|
||
}
|
||
if (IO.implements && IO.implements.length > 0) {
|
||
directiveDeps.implements = IO.implements;
|
||
}
|
||
if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
|
||
directiveDeps.constructorObj = IO.constructor;
|
||
}
|
||
if (IO.accessors) {
|
||
directiveDeps.accessors = IO.accessors;
|
||
}
|
||
if (IO.properties) {
|
||
var _a = this.helper.getInputOutputSignals(IO.properties), inputSignals = _a.inputSignals, outputSignals = _a.outputSignals, properties = _a.properties;
|
||
directiveDeps.inputsClass = directiveDeps.inputsClass.concat(inputSignals);
|
||
directiveDeps.outputsClass = directiveDeps.outputsClass.concat(outputSignals);
|
||
directiveDeps.propertiesClass = properties;
|
||
}
|
||
return directiveDeps;
|
||
};
|
||
return DirectiveDepFactory;
|
||
}());
|
||
|
||
var JsDocHelper = /** @class */ (function () {
|
||
function JsDocHelper() {
|
||
}
|
||
JsDocHelper.prototype.hasJSDocInternalTag = function (filename, sourceFile, node) {
|
||
if (typeof sourceFile.statements !== 'undefined') {
|
||
return this.checkStatements(sourceFile.statements, node);
|
||
}
|
||
return false;
|
||
};
|
||
JsDocHelper.prototype.checkStatements = function (statements, node) {
|
||
var _this = this;
|
||
return statements.some(function (x) { return _this.checkStatement(x, node); });
|
||
};
|
||
JsDocHelper.prototype.checkStatement = function (statement, node) {
|
||
if (statement.pos === node.pos && statement.end === node.end) {
|
||
if (node.jsDoc && node.jsDoc.length > 0) {
|
||
return this.checkJsDocs(node.jsDoc);
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
JsDocHelper.prototype.checkJsDocs = function (jsDocs) {
|
||
var _this = this;
|
||
return jsDocs
|
||
.filter(function (x) { return x.tags && x.tags.length > 0; })
|
||
.some(function (x) { return _this.checkJsDocTags(x.tags); });
|
||
};
|
||
JsDocHelper.prototype.checkJsDocTags = function (tags) {
|
||
return tags.some(function (x) { return x.tagName && x.tagName.text === 'internal'; });
|
||
};
|
||
return JsDocHelper;
|
||
}());
|
||
|
||
var ModuleHelper = /** @class */ (function () {
|
||
function ModuleHelper(cache, symbolHelper) {
|
||
if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
|
||
this.cache = cache;
|
||
this.symbolHelper = symbolHelper;
|
||
}
|
||
ModuleHelper.prototype.getModuleProviders = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper
|
||
.getSymbolDeps(props, 'providers', srcFile)
|
||
.map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
|
||
};
|
||
ModuleHelper.prototype.getModuleControllers = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper
|
||
.getSymbolDeps(props, 'controllers', srcFile)
|
||
.map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
|
||
};
|
||
ModuleHelper.prototype.getModuleDeclarations = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper.getSymbolDeps(props, 'declarations', srcFile).map(function (name) {
|
||
var component = _this.cache.get(name);
|
||
if (component) {
|
||
return component;
|
||
}
|
||
return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
|
||
});
|
||
};
|
||
ModuleHelper.prototype.getModuleEntryComponents = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper.getSymbolDeps(props, 'entryComponents', srcFile).map(function (name) {
|
||
var component = _this.cache.get(name);
|
||
if (component) {
|
||
return component;
|
||
}
|
||
return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
|
||
});
|
||
};
|
||
ModuleHelper.prototype.cleanImportForRootForChild = function (name) {
|
||
var nsModule = name.split('.');
|
||
if (nsModule.length > 0) {
|
||
name = nsModule[0];
|
||
}
|
||
return name;
|
||
};
|
||
ModuleHelper.prototype.getModuleImports = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper
|
||
.getSymbolDeps(props, 'imports', srcFile)
|
||
.map(function (name) { return _this.cleanImportForRootForChild(name); })
|
||
.map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
|
||
};
|
||
ModuleHelper.prototype.getModuleExports = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper
|
||
.getSymbolDeps(props, 'exports', srcFile)
|
||
.map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
|
||
};
|
||
ModuleHelper.prototype.getModuleImportsRaw = function (props, srcFile) {
|
||
return this.symbolHelper.getSymbolDepsRaw(props, 'imports');
|
||
};
|
||
ModuleHelper.prototype.getModuleId = function (props, srcFile) {
|
||
var _id = this.symbolHelper.getSymbolDeps(props, 'id', srcFile), id;
|
||
if (_id.length === 1) {
|
||
id = _id[0];
|
||
}
|
||
return id;
|
||
};
|
||
ModuleHelper.prototype.getModuleSchemas = function (props, srcFile) {
|
||
var schemas = this.symbolHelper.getSymbolDeps(props, 'schemas', srcFile);
|
||
return schemas;
|
||
};
|
||
ModuleHelper.prototype.getModuleBootstrap = function (props, srcFile) {
|
||
var _this = this;
|
||
return this.symbolHelper
|
||
.getSymbolDeps(props, 'bootstrap', srcFile)
|
||
.map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
|
||
};
|
||
return ModuleHelper;
|
||
}());
|
||
|
||
var crypto$3 = require('crypto');
|
||
var ModuleDepFactory = /** @class */ (function () {
|
||
function ModuleDepFactory(moduleHelper) {
|
||
this.moduleHelper = moduleHelper;
|
||
}
|
||
ModuleDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
|
||
var sourceCode = srcFile.getText();
|
||
var hash = crypto$3.createHash('sha512').update(sourceCode).digest('hex');
|
||
return {
|
||
name: name,
|
||
id: 'module-' + name + '-' + hash,
|
||
file: file,
|
||
ngid: this.moduleHelper.getModuleId(properties, srcFile),
|
||
providers: this.moduleHelper.getModuleProviders(properties, srcFile),
|
||
declarations: this.moduleHelper.getModuleDeclarations(properties, srcFile),
|
||
controllers: this.moduleHelper.getModuleControllers(properties, srcFile),
|
||
entryComponents: this.moduleHelper.getModuleEntryComponents(properties, srcFile),
|
||
imports: this.moduleHelper.getModuleImports(properties, srcFile),
|
||
exports: this.moduleHelper.getModuleExports(properties, srcFile),
|
||
schemas: this.moduleHelper.getModuleSchemas(properties, srcFile),
|
||
bootstrap: this.moduleHelper.getModuleBootstrap(properties, srcFile),
|
||
type: 'module',
|
||
rawdescription: IO.rawdescription,
|
||
methods: IO.methods,
|
||
description: IO.description,
|
||
sourceCode: srcFile.text,
|
||
deprecated: IO.deprecated,
|
||
deprecationMessage: IO.deprecationMessage
|
||
};
|
||
};
|
||
return ModuleDepFactory;
|
||
}());
|
||
|
||
var crypto$2 = require('crypto');
|
||
var EntityDepFactory = /** @class */ (function () {
|
||
function EntityDepFactory() {
|
||
}
|
||
EntityDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
|
||
var sourceCode = srcFile.getText();
|
||
var hash = crypto$2.createHash('sha512').update(sourceCode).digest('hex');
|
||
var infos = {
|
||
name: name,
|
||
id: 'controller-' + name + '-' + hash,
|
||
file: file,
|
||
type: 'entity',
|
||
description: IO.description,
|
||
rawdescription: IO.rawdescription,
|
||
sourceCode: srcFile.text,
|
||
deprecated: IO.deprecated,
|
||
deprecationMessage: IO.deprecationMessage,
|
||
properties: IO.properties
|
||
};
|
||
return infos;
|
||
};
|
||
return EntityDepFactory;
|
||
}());
|
||
|
||
var crypto$1 = require('crypto');
|
||
var project = new tsMorph.Project();
|
||
// TypeScript reference : https://github.com/Microsoft/TypeScript/blob/master/lib/typescript.d.ts
|
||
var AngularDependencies = /** @class */ (function (_super) {
|
||
logger.__extends(AngularDependencies, _super);
|
||
function AngularDependencies(files, options) {
|
||
var _this = _super.call(this, files, options) || this;
|
||
_this.cache = new ComponentCache();
|
||
_this.moduleHelper = new ModuleHelper(_this.cache);
|
||
_this.jsDocHelper = new JsDocHelper();
|
||
_this.symbolHelper = new SymbolHelper();
|
||
_this.jsdocParserUtil = new JsdocParserUtil();
|
||
_this.allowedSymbols = new Set();
|
||
_this.allowedFiles = new Set();
|
||
_this.initializePublicApiFiltering();
|
||
return _this;
|
||
}
|
||
/**
|
||
* Initialize public API filtering if enabled
|
||
*/
|
||
AngularDependencies.prototype.initializePublicApiFiltering = function () {
|
||
var e_1, _a, e_2, _b;
|
||
if (Configuration$1.mainData.publicApiOnly && Configuration$1.mainData.publicApiExports.size > 0) {
|
||
logger.logger.info('Public API filtering enabled');
|
||
try {
|
||
// Build set of allowed symbols and files
|
||
for (var _c = logger.__values(Configuration$1.mainData.publicApiExports), _d = _c.next(); !_d.done; _d = _c.next()) {
|
||
var _e = logger.__read(_d.value, 2), symbolName = _e[0], sourceFiles = _e[1];
|
||
this.allowedSymbols.add(symbolName);
|
||
try {
|
||
for (var sourceFiles_1 = (e_2 = void 0, logger.__values(sourceFiles)), sourceFiles_1_1 = sourceFiles_1.next(); !sourceFiles_1_1.done; sourceFiles_1_1 = sourceFiles_1.next()) {
|
||
var sourceFile = sourceFiles_1_1.value;
|
||
this.allowedFiles.add(path__namespace.resolve(sourceFile));
|
||
}
|
||
}
|
||
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
||
finally {
|
||
try {
|
||
if (sourceFiles_1_1 && !sourceFiles_1_1.done && (_b = sourceFiles_1.return)) _b.call(sourceFiles_1);
|
||
}
|
||
finally { if (e_2) throw e_2.error; }
|
||
}
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
logger.logger.info("Allowed ".concat(this.allowedSymbols.size, " public API symbol(s) from ").concat(this.allowedFiles.size, " file(s)"));
|
||
}
|
||
};
|
||
/**
|
||
* Check if a symbol is part of the public API
|
||
*/
|
||
AngularDependencies.prototype.isSymbolAllowed = function (symbolName, fileName) {
|
||
// If public API filtering is not enabled, allow all symbols
|
||
if (!Configuration$1.mainData.publicApiOnly) {
|
||
return true;
|
||
}
|
||
// If no symbols are defined, allow all (fallback)
|
||
if (this.allowedSymbols.size === 0) {
|
||
return true;
|
||
}
|
||
var resolvedFileName = path__namespace.resolve(fileName);
|
||
// Check if the symbol is explicitly allowed
|
||
if (this.allowedSymbols.has(symbolName)) {
|
||
// Verify the symbol is from an allowed file
|
||
var allowedSourceFiles = Configuration$1.mainData.publicApiExports.get(symbolName);
|
||
if (allowedSourceFiles && allowedSourceFiles.has(resolvedFileName)) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
/**
|
||
* Check if dependencies of an allowed symbol should be included
|
||
*/
|
||
AngularDependencies.prototype.isDependencyOfAllowedSymbol = function (symbolName, fileName) {
|
||
// If public API filtering is not enabled, allow all
|
||
if (!Configuration$1.mainData.publicApiOnly) {
|
||
return true;
|
||
}
|
||
// Check if the file contains any allowed symbols
|
||
var resolvedFileName = path__namespace.resolve(fileName);
|
||
return this.allowedFiles.has(resolvedFileName);
|
||
};
|
||
AngularDependencies.prototype.getDependencies = function () {
|
||
var _this = this;
|
||
var deps = {
|
||
aliases: {},
|
||
modules: [],
|
||
modulesForGraph: [],
|
||
components: [],
|
||
controllers: [],
|
||
entities: [],
|
||
injectables: [],
|
||
interceptors: [],
|
||
guards: [],
|
||
pipes: [],
|
||
directives: [],
|
||
routes: [],
|
||
classes: [],
|
||
interfaces: [],
|
||
typescriptImports: [],
|
||
miscellaneous: {
|
||
variables: [],
|
||
functions: [],
|
||
typealiases: [],
|
||
enumerations: []
|
||
},
|
||
routesTree: undefined
|
||
};
|
||
var sourceFiles = this.program.getSourceFiles() || [];
|
||
RouterParserUtil$1.scannedFiles = sourceFiles;
|
||
sourceFiles.map(function (file) {
|
||
var filePath = file.fileName;
|
||
if (path__namespace.extname(filePath) === '.ts' || path__namespace.extname(filePath) === '.tsx') {
|
||
if (!Configuration$1.mainData.angularJSProject && path__namespace.extname(filePath) === '.js') {
|
||
logger.logger.info('parsing', filePath);
|
||
_this.getSourceFileDecorators(file, deps);
|
||
}
|
||
else {
|
||
if (filePath.lastIndexOf('.d.ts') === -1 &&
|
||
filePath.lastIndexOf('spec.ts') === -1) {
|
||
logger.logger.info('parsing', filePath);
|
||
_this.getTypescriptExportsAliases(file, deps);
|
||
_this.getTypescriptImportsAliases(file, deps);
|
||
_this.getSourceFileDecorators(file, deps);
|
||
}
|
||
}
|
||
}
|
||
return deps;
|
||
});
|
||
// End of file scanning
|
||
// Try merging inside the same file declarated variables & modules with imports | exports | declarations | providers
|
||
if (deps.miscellaneous.variables.length > 0) {
|
||
deps.miscellaneous.variables.forEach(function (_variable) {
|
||
var newVar = [];
|
||
// link ...VAR to VAR values, recursively
|
||
(function (_var, _newVar) {
|
||
// getType pr reconstruire....
|
||
var elementsMatcher = function (variabelToReplace) {
|
||
if (variabelToReplace.initializer) {
|
||
if (variabelToReplace.initializer.elements) {
|
||
if (variabelToReplace.initializer.elements.length > 0) {
|
||
variabelToReplace.initializer.elements.forEach(function (element) {
|
||
// Direct value -> Kind 79
|
||
if (element.text &&
|
||
element.kind === tsMorph.SyntaxKind.Identifier) {
|
||
newVar.push({
|
||
name: element.text,
|
||
type: _this.symbolHelper.getType(element.text)
|
||
});
|
||
}
|
||
// if _variable is ArrayLiteralExpression 203
|
||
// and has SpreadElements in his elements
|
||
// merge them
|
||
if (element.kind === tsMorph.SyntaxKind.SpreadElement &&
|
||
element.expression) {
|
||
var el = deps.miscellaneous.variables.find(function (variable) {
|
||
return variable.name === element.expression.text;
|
||
});
|
||
if (el) {
|
||
elementsMatcher(el);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
};
|
||
elementsMatcher(_var);
|
||
})(_variable);
|
||
var onLink = function (mod) {
|
||
var process = function (initialArray, _var) {
|
||
var indexToClean = 0;
|
||
var found = false;
|
||
var findVariableInArray = function (el, index) {
|
||
if (el.name === _var.name) {
|
||
indexToClean = index;
|
||
found = true;
|
||
}
|
||
};
|
||
initialArray.forEach(findVariableInArray);
|
||
// Clean indexes to replace
|
||
if (found) {
|
||
initialArray.splice(indexToClean, 1);
|
||
// Add variable
|
||
newVar.forEach(function (newEle) {
|
||
if (typeof ___namespace.find(initialArray, { name: newEle.name }) ===
|
||
'undefined') {
|
||
initialArray.push(newEle);
|
||
}
|
||
});
|
||
}
|
||
};
|
||
process(mod.imports, _variable);
|
||
process(mod.exports, _variable);
|
||
process(mod.controllers, _variable);
|
||
process(mod.declarations, _variable);
|
||
process(mod.providers, _variable);
|
||
};
|
||
deps.modules.forEach(onLink);
|
||
deps.modulesForGraph.forEach(onLink);
|
||
});
|
||
}
|
||
/**
|
||
* If one thing extends another, merge them, only for internal sources
|
||
* - classes
|
||
* - components
|
||
* - injectables
|
||
* - directives
|
||
* for
|
||
* - inputs
|
||
* - outputs
|
||
* - properties
|
||
* - methods
|
||
*/
|
||
deps = ExtendsMerger$1.merge(deps);
|
||
// RouterParserUtil.printModulesRoutes();
|
||
// RouterParserUtil.printRoutes();
|
||
if (!Configuration$1.mainData.disableRoutesGraph) {
|
||
RouterParserUtil$1.linkModulesAndRoutes();
|
||
RouterParserUtil$1.constructModulesTree();
|
||
deps.routesTree = RouterParserUtil$1.constructRoutesTree();
|
||
}
|
||
return deps;
|
||
};
|
||
AngularDependencies.prototype.processClass = function (node, file, srcFile, outputSymbols, fileBody, astFile) {
|
||
var _a, _b;
|
||
var name = this.getSymboleName(node);
|
||
var IO = this.getClassIO(file, srcFile, node, fileBody, astFile);
|
||
var sourceCode = srcFile.getText();
|
||
var hash = crypto$1.createHash('sha512').update(sourceCode).digest('hex');
|
||
var deps = {
|
||
name: name,
|
||
id: 'class-' + name + '-' + hash,
|
||
file: file,
|
||
deprecated: IO.deprecated,
|
||
deprecationMessage: IO.deprecationMessage,
|
||
type: 'class',
|
||
sourceCode: srcFile.getText()
|
||
};
|
||
var excludeFromClassArray = false;
|
||
if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
|
||
deps.constructorObj = IO.constructor;
|
||
}
|
||
deps.inputsClass = (_a = IO.inputs) !== null && _a !== void 0 ? _a : [];
|
||
deps.outputsClass = (_b = IO.outputs) !== null && _b !== void 0 ? _b : [];
|
||
if (IO.properties) {
|
||
var _c = this.componentHelper.getInputOutputSignals(IO.properties), inputSignals = _c.inputSignals, outputSignals = _c.outputSignals, properties = _c.properties;
|
||
deps.inputsClass = deps.inputsClass.concat(inputSignals);
|
||
deps.outputsClass = deps.outputsClass.concat(outputSignals);
|
||
deps.properties = properties;
|
||
}
|
||
if (IO.description) {
|
||
deps.description = IO.description;
|
||
}
|
||
if (IO.rawdescription) {
|
||
deps.rawdescription = IO.rawdescription;
|
||
}
|
||
if (IO.methods) {
|
||
deps.methods = IO.methods;
|
||
}
|
||
if (IO.indexSignatures) {
|
||
deps.indexSignatures = IO.indexSignatures;
|
||
}
|
||
if (IO.extends) {
|
||
deps.extends = IO.extends;
|
||
}
|
||
if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
||
deps.jsdoctags = IO.jsdoctags[0].tags;
|
||
}
|
||
if (IO.accessors) {
|
||
deps.accessors = IO.accessors;
|
||
}
|
||
if (IO.hostBindings) {
|
||
deps.hostBindings = IO.hostBindings;
|
||
}
|
||
if (IO.hostListeners) {
|
||
deps.hostListeners = IO.hostListeners;
|
||
}
|
||
if (Configuration$1.mainData.disableLifeCycleHooks) {
|
||
deps.methods = cleanLifecycleHooksFromMethods(deps.methods);
|
||
}
|
||
if (IO.implements && IO.implements.length > 0) {
|
||
deps.implements = IO.implements;
|
||
if (this.isGuard(IO.implements)) {
|
||
// We don't want the Guard to show up in the Classes menu
|
||
excludeFromClassArray = true;
|
||
deps.type = 'guard';
|
||
outputSymbols.guards.push(deps);
|
||
}
|
||
}
|
||
if (typeof IO.ignore === 'undefined') {
|
||
this.debug(deps);
|
||
if (!excludeFromClassArray) {
|
||
outputSymbols.classes.push(deps);
|
||
}
|
||
}
|
||
else {
|
||
this.ignore(deps);
|
||
}
|
||
};
|
||
AngularDependencies.prototype.getTypescriptImportsAliases = function (initialSrcFile, outputSymbols) {
|
||
var astFile = typeof project.getSourceFile(initialSrcFile.fileName) !== 'undefined'
|
||
? project.getSourceFile(initialSrcFile.fileName)
|
||
: project.addSourceFileAtPath(initialSrcFile.fileName);
|
||
if (astFile) {
|
||
var importDeclarations = astFile.getImportDeclarations();
|
||
if (importDeclarations && importDeclarations.length > 0) {
|
||
importDeclarations.forEach(function (importDeclaration) {
|
||
var namedImports = importDeclaration.getNamedImports();
|
||
if (namedImports && namedImports.length > 0) {
|
||
namedImports.forEach(function (namedImport) {
|
||
if (namedImport.getAliasNode()) {
|
||
if (outputSymbols.aliases.hasOwnProperty(namedImport.getName())) {
|
||
outputSymbols.aliases[namedImport.getName()].push(namedImport.getAliasNode().getText());
|
||
}
|
||
else {
|
||
outputSymbols.aliases[namedImport.getName()] = [
|
||
namedImport.getAliasNode().getText()
|
||
];
|
||
}
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
}
|
||
};
|
||
AngularDependencies.prototype.getTypescriptExportsAliases = function (initialSrcFile, outputSymbols) {
|
||
var astFile = typeof project.getSourceFile(initialSrcFile.fileName) !== 'undefined'
|
||
? project.getSourceFile(initialSrcFile.fileName)
|
||
: project.addSourceFileAtPath(initialSrcFile.fileName);
|
||
if (astFile) {
|
||
var exportDeclarations = astFile.getExportDeclarations();
|
||
if (exportDeclarations && exportDeclarations.length > 0) {
|
||
exportDeclarations.forEach(function (exportDeclaration) {
|
||
var hasNamedExports = exportDeclaration.hasNamedExports();
|
||
if (hasNamedExports) {
|
||
var namedExports = exportDeclaration.getNamedExports();
|
||
if (namedExports && namedExports.length > 0) {
|
||
namedExports.forEach(function (namedExport) {
|
||
if (namedExport.getAliasNode()) {
|
||
if (outputSymbols.aliases.hasOwnProperty(namedExport.getName())) {
|
||
outputSymbols.aliases[namedExport.getName()].push(namedExport.getAliasNode().getText());
|
||
}
|
||
else {
|
||
outputSymbols.aliases[namedExport.getName()] = [
|
||
namedExport.getAliasNode().getText()
|
||
];
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|
||
};
|
||
AngularDependencies.prototype.getSourceFileDecorators = function (initialSrcFile, outputSymbols) {
|
||
var _this = this;
|
||
var cleaner = (process.cwd() + path__namespace.sep).replace(/\\/g, '/');
|
||
var fileName = initialSrcFile.fileName.replace(cleaner, '');
|
||
var scannedFile = initialSrcFile;
|
||
// Search in file for variable statement as routes definitions
|
||
var astFile = typeof project.getSourceFile(initialSrcFile.fileName) !== 'undefined'
|
||
? project.getSourceFile(initialSrcFile.fileName)
|
||
: project.addSourceFileAtPath(initialSrcFile.fileName);
|
||
var variableRoutesStatements = astFile.getVariableStatements();
|
||
var hasRoutesStatements = false;
|
||
if (variableRoutesStatements.length > 0) {
|
||
// Clean file for spread and dynamics inside routes definitions
|
||
variableRoutesStatements.forEach(function (s) {
|
||
var variableDeclarations = s.getDeclarations();
|
||
var len = variableDeclarations.length;
|
||
var i = 0;
|
||
for (i; i < len; i++) {
|
||
if (variableDeclarations[i].compilerNode.type) {
|
||
if (variableDeclarations[i].compilerNode.type.typeName &&
|
||
variableDeclarations[i].compilerNode.type.typeName.text === 'Routes') {
|
||
hasRoutesStatements = true;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
if (hasRoutesStatements && !Configuration$1.mainData.disableRoutesGraph) {
|
||
// Clean file for spread and dynamics inside routes definitions
|
||
logger.logger.info('Analysing routes definitions and clean them if necessary');
|
||
// scannedFile = RouterParserUtil.cleanFileIdentifiers(astFile).compilerNode;
|
||
RouterParserUtil$1.cleanFileSpreads(astFile);
|
||
astFile = RouterParserUtil$1.cleanCallExpressions(astFile);
|
||
scannedFile = RouterParserUtil$1.cleanFileDynamics(astFile).compilerNode;
|
||
scannedFile.kind = tsMorph.SyntaxKind.SourceFile;
|
||
}
|
||
tsMorph.ts.forEachChild(scannedFile, function (initialNode) {
|
||
if (_this.jsDocHelper.hasJSDocInternalTag(fileName, scannedFile, initialNode) &&
|
||
Configuration$1.mainData.disableInternal) {
|
||
return;
|
||
}
|
||
var parseNode = function (file, srcFile, node, fileBody, astFile) {
|
||
var sourceCode = srcFile.getText();
|
||
var hash = crypto$1.createHash('sha512').update(sourceCode).digest('hex');
|
||
if (nodeHasDecorator(node)) {
|
||
var classWithCustomDecorator_1 = false;
|
||
var nodeDecorators_1 = getNodeDecorators(node);
|
||
var visitDecorator = function (visitedDecorator, index) {
|
||
var deps;
|
||
var name = _this.getSymboleName(node);
|
||
// Check if this decorated class is allowed by public API filter
|
||
if (!_this.isSymbolAllowed(name, file)) {
|
||
logger.logger.debug("Skipping decorated class ".concat(name, " (not in public API)"));
|
||
return;
|
||
}
|
||
var props = _this.findProperties(visitedDecorator, srcFile);
|
||
var IO = _this.componentHelper.getComponentIO(file, srcFile, node, fileBody, astFile);
|
||
if (_this.isModule(visitedDecorator)) {
|
||
var moduleDep = new ModuleDepFactory(_this.moduleHelper).create(file, srcFile, name, props, IO);
|
||
if (RouterParserUtil$1.hasRouterModuleInImports(moduleDep.imports)) {
|
||
RouterParserUtil$1.addModuleWithRoutes(name, _this.moduleHelper.getModuleImportsRaw(props, srcFile), file);
|
||
}
|
||
deps = moduleDep;
|
||
if (typeof IO.ignore === 'undefined') {
|
||
RouterParserUtil$1.addModule(name, moduleDep.imports);
|
||
outputSymbols.modules.push(moduleDep);
|
||
outputSymbols.modulesForGraph.push(moduleDep);
|
||
}
|
||
}
|
||
else if (_this.isComponent(visitedDecorator)) {
|
||
if (props.length === 0) {
|
||
return;
|
||
}
|
||
var componentDep = new ComponentDepFactory(_this.componentHelper).create(file, srcFile, name, props, IO);
|
||
deps = componentDep;
|
||
if (typeof IO.ignore === 'undefined') {
|
||
ComponentsTreeEngine$1.addComponent(componentDep);
|
||
outputSymbols.components.push(componentDep);
|
||
}
|
||
}
|
||
else if (_this.isController(visitedDecorator)) {
|
||
var controllerDep = new ControllerDepFactory().create(file, srcFile, name, props, IO);
|
||
deps = controllerDep;
|
||
if (typeof IO.ignore === 'undefined') {
|
||
outputSymbols.controllers.push(controllerDep);
|
||
}
|
||
}
|
||
else if (_this.isEntity(visitedDecorator)) {
|
||
var entityDep = new EntityDepFactory().create(file, srcFile, name, props, IO);
|
||
deps = entityDep;
|
||
if (typeof IO.ignore === 'undefined') {
|
||
outputSymbols.entities.push(entityDep);
|
||
}
|
||
}
|
||
else if (_this.isInjectable(visitedDecorator)) {
|
||
var injectableDeps = {
|
||
name: name,
|
||
id: 'injectable-' + name + '-' + hash,
|
||
file: file,
|
||
properties: IO.properties,
|
||
methods: IO.methods,
|
||
deprecated: IO.deprecated,
|
||
deprecationMessage: IO.deprecationMessage,
|
||
description: IO.description,
|
||
rawdescription: IO.rawdescription,
|
||
sourceCode: srcFile.getText(),
|
||
exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
|
||
};
|
||
if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
|
||
injectableDeps.constructorObj = IO.constructor;
|
||
}
|
||
if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
||
injectableDeps.jsdoctags = IO.jsdoctags[0].tags;
|
||
}
|
||
if (IO.accessors) {
|
||
injectableDeps.accessors = IO.accessors;
|
||
}
|
||
if (IO.extends) {
|
||
injectableDeps.extends = IO.extends;
|
||
}
|
||
if (Configuration$1.mainData.disableLifeCycleHooks) {
|
||
injectableDeps.methods = cleanLifecycleHooksFromMethods(injectableDeps.methods);
|
||
}
|
||
deps = injectableDeps;
|
||
if (typeof IO.ignore === 'undefined') {
|
||
if (___namespace.includes(IO.implements, 'HttpInterceptor')) {
|
||
injectableDeps.type = 'interceptor';
|
||
outputSymbols.interceptors.push(injectableDeps);
|
||
}
|
||
else if (_this.isGuard(IO.implements)) {
|
||
injectableDeps.type = 'guard';
|
||
outputSymbols.guards.push(injectableDeps);
|
||
}
|
||
else {
|
||
injectableDeps.type = 'injectable';
|
||
_this.addNewEntityInStore(injectableDeps, outputSymbols.injectables);
|
||
}
|
||
}
|
||
}
|
||
else if (_this.isPipe(visitedDecorator)) {
|
||
var pipeDeps = {
|
||
name: name,
|
||
id: 'pipe-' + name + '-' + hash,
|
||
file: file,
|
||
type: 'pipe',
|
||
deprecated: IO.deprecated,
|
||
deprecationMessage: IO.deprecationMessage,
|
||
description: IO.description,
|
||
rawdescription: IO.rawdescription,
|
||
properties: IO.properties,
|
||
methods: IO.methods,
|
||
standalone: _this.componentHelper.getComponentStandalone(props, srcFile)
|
||
? true
|
||
: false,
|
||
pure: _this.componentHelper.getComponentPure(props, srcFile),
|
||
ngname: _this.componentHelper.getComponentName(props, srcFile),
|
||
sourceCode: srcFile.getText(),
|
||
exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
|
||
};
|
||
if (Configuration$1.mainData.disableLifeCycleHooks) {
|
||
pipeDeps.methods = cleanLifecycleHooksFromMethods(pipeDeps.methods);
|
||
}
|
||
if (IO.jsdoctags && IO.jsdoctags.length > 0) {
|
||
pipeDeps.jsdoctags = IO.jsdoctags[0].tags;
|
||
}
|
||
deps = pipeDeps;
|
||
if (typeof IO.ignore === 'undefined') {
|
||
outputSymbols.pipes.push(pipeDeps);
|
||
}
|
||
}
|
||
else if (_this.isDirective(visitedDecorator)) {
|
||
var directiveDeps = new DirectiveDepFactory(_this.componentHelper).create(file, srcFile, name, props, IO);
|
||
deps = directiveDeps;
|
||
if (typeof IO.ignore === 'undefined') {
|
||
outputSymbols.directives.push(directiveDeps);
|
||
}
|
||
}
|
||
else {
|
||
var hasMultipleDecoratorsWithInternalOne = _this.hasInternalDecorator(nodeDecorators_1);
|
||
// Just a class
|
||
if (!classWithCustomDecorator_1 &&
|
||
!hasMultipleDecoratorsWithInternalOne) {
|
||
classWithCustomDecorator_1 = true;
|
||
_this.processClass(node, file, srcFile, outputSymbols, fileBody);
|
||
}
|
||
}
|
||
_this.cache.set(name, deps);
|
||
if (typeof IO.ignore === 'undefined') {
|
||
_this.debug(deps);
|
||
}
|
||
else {
|
||
_this.ignore(deps);
|
||
}
|
||
};
|
||
var filterByDecorators = function (filteredNode) {
|
||
if (filteredNode.expression && filteredNode.expression.expression) {
|
||
var _test = /(NgModule|Component|Injectable|Pipe|Directive)/.test(filteredNode.expression.expression.text);
|
||
if (!_test && tsMorph.ts.isClassDeclaration(node)) {
|
||
_test = true;
|
||
}
|
||
return _test;
|
||
}
|
||
if (tsMorph.ts.isClassDeclaration(node)) {
|
||
return true;
|
||
}
|
||
return false;
|
||
};
|
||
nodeDecorators_1.filter(filterByDecorators).forEach(visitDecorator);
|
||
}
|
||
else if (node.symbol) {
|
||
if (node.symbol.flags === tsMorph.ts.SymbolFlags.Class) {
|
||
// Check if class is allowed by public API filter
|
||
var className = _this.getSymboleName(node);
|
||
if (!_this.isSymbolAllowed(className, file)) {
|
||
logger.logger.debug("Skipping class ".concat(className, " (not in public API)"));
|
||
return;
|
||
}
|
||
_this.processClass(node, file, srcFile, outputSymbols, fileBody, astFile);
|
||
}
|
||
else if (node.symbol.flags === tsMorph.ts.SymbolFlags.Interface) {
|
||
var name = _this.getSymboleName(node);
|
||
// Check if interface is allowed by public API filter
|
||
if (!_this.isSymbolAllowed(name, file)) {
|
||
logger.logger.debug("Skipping interface ".concat(name, " (not in public API)"));
|
||
return;
|
||
}
|
||
var IO = _this.getInterfaceIO(file, srcFile, node, fileBody, astFile);
|
||
var interfaceDeps = {
|
||
name: name,
|
||
id: 'interface-' + name + '-' + hash,
|
||
file: file,
|
||
deprecated: IO.deprecated,
|
||
deprecationMessage: IO.deprecationMessage,
|
||
type: 'interface',
|
||
sourceCode: srcFile.getText()
|
||
};
|
||
if (IO.properties) {
|
||
interfaceDeps.properties = IO.properties;
|
||
}
|
||
if (IO.indexSignatures) {
|
||
interfaceDeps.indexSignatures = IO.indexSignatures;
|
||
}
|
||
if (IO.kind) {
|
||
interfaceDeps.kind = IO.kind;
|
||
}
|
||
if (IO.description) {
|
||
interfaceDeps.description = IO.description;
|
||
interfaceDeps.rawdescription = IO.rawdescription;
|
||
}
|
||
if (IO.methods) {
|
||
interfaceDeps.methods = IO.methods;
|
||
}
|
||
if (IO.extends) {
|
||
interfaceDeps.extends = IO.extends;
|
||
}
|
||
if (typeof IO.ignore === 'undefined') {
|
||
_this.debug(interfaceDeps);
|
||
outputSymbols.interfaces.push(interfaceDeps);
|
||
}
|
||
else {
|
||
_this.ignore(interfaceDeps);
|
||
}
|
||
}
|
||
else if (tsMorph.ts.isFunctionDeclaration(node)) {
|
||
var infos = _this.visitFunctionDeclaration(node);
|
||
var name = infos.name;
|
||
// Check if function is allowed by public API filter
|
||
if (!_this.isSymbolAllowed(name, file)) {
|
||
logger.logger.debug("Skipping function ".concat(name, " (not in public API)"));
|
||
return;
|
||
}
|
||
var deprecated = infos.deprecated;
|
||
var deprecationMessage = infos.deprecationMessage;
|
||
var functionDep = {
|
||
name: name,
|
||
file: file,
|
||
ctype: 'miscellaneous',
|
||
subtype: 'function',
|
||
deprecated: deprecated,
|
||
deprecationMessage: deprecationMessage,
|
||
description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
||
};
|
||
if (infos.args) {
|
||
functionDep.args = infos.args;
|
||
}
|
||
if (infos.returnType) {
|
||
functionDep.returnType = infos.returnType;
|
||
}
|
||
if (infos.jsdoctags && infos.jsdoctags.length > 0) {
|
||
functionDep.jsdoctags = infos.jsdoctags;
|
||
}
|
||
if (typeof infos.ignore === 'undefined') {
|
||
if (!(_this.hasPrivateJSDocTag(functionDep.jsdoctags) &&
|
||
Configuration$1.mainData.disablePrivate)) {
|
||
_this.debug(functionDep);
|
||
outputSymbols.miscellaneous.functions.push(functionDep);
|
||
}
|
||
}
|
||
}
|
||
else if (tsMorph.ts.isEnumDeclaration(node)) {
|
||
var infos = _this.visitEnumDeclaration(node);
|
||
var name = infos.name;
|
||
// Check if enum is allowed by public API filter
|
||
if (!_this.isSymbolAllowed(name, file)) {
|
||
logger.logger.debug("Skipping enum ".concat(name, " (not in public API)"));
|
||
return;
|
||
}
|
||
var deprecated = infos.deprecated;
|
||
var deprecationMessage = infos.deprecationMessage;
|
||
var enumDeps = {
|
||
name: name,
|
||
childs: infos.members,
|
||
ctype: 'miscellaneous',
|
||
subtype: 'enum',
|
||
deprecated: deprecated,
|
||
deprecationMessage: deprecationMessage,
|
||
description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
|
||
file: file
|
||
};
|
||
if (!isIgnore(node)) {
|
||
_this.debug(enumDeps);
|
||
outputSymbols.miscellaneous.enumerations.push(enumDeps);
|
||
}
|
||
}
|
||
else if (tsMorph.ts.isTypeAliasDeclaration(node)) {
|
||
var infos = _this.visitTypeDeclaration(node);
|
||
var name = infos.name;
|
||
// Check if type alias is allowed by public API filter
|
||
if (!_this.isSymbolAllowed(name, file)) {
|
||
logger.logger.debug("Skipping type alias ".concat(name, " (not in public API)"));
|
||
return;
|
||
}
|
||
var deprecated = infos.deprecated;
|
||
var deprecationMessage = infos.deprecationMessage;
|
||
var typeAliasDeps = {
|
||
name: name,
|
||
ctype: 'miscellaneous',
|
||
subtype: 'typealias',
|
||
rawtype: _this.classHelper.visitType(node),
|
||
file: file,
|
||
deprecated: deprecated,
|
||
deprecationMessage: deprecationMessage,
|
||
description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
||
};
|
||
if (node.type) {
|
||
typeAliasDeps.kind = node.type.kind;
|
||
if (typeAliasDeps.rawtype === '') {
|
||
typeAliasDeps.rawtype = _this.classHelper.visitType(node);
|
||
}
|
||
}
|
||
if (typeAliasDeps.kind &&
|
||
typeAliasDeps.kind === tsMorph.SyntaxKind.TemplateLiteralType &&
|
||
node.type) {
|
||
typeAliasDeps.rawtype = srcFile.text.substring(node.type.pos, node.type.end);
|
||
}
|
||
if (!isIgnore(node)) {
|
||
outputSymbols.miscellaneous.typealiases.push(typeAliasDeps);
|
||
}
|
||
if (typeof infos.ignore === 'undefined') {
|
||
_this.debug(typeAliasDeps);
|
||
}
|
||
}
|
||
else if (tsMorph.ts.isModuleDeclaration(node)) {
|
||
if (node.body) {
|
||
if (node.body.statements && node.body.statements.length > 0) {
|
||
node.body.statements.forEach(function (statement) {
|
||
return parseNode(file, srcFile, statement, node.body, astFile);
|
||
});
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
var IO = _this.getRouteIO(file, srcFile, node);
|
||
if (IO.routes) {
|
||
var newRoutes = void 0;
|
||
try {
|
||
newRoutes = RouterParserUtil$1.cleanRawRouteParsed(IO.routes);
|
||
}
|
||
catch (e) {
|
||
// tslint:disable-next-line:max-line-length
|
||
logger.logger.error('Routes parsing error, maybe a trailing comma or an external variable, trying to fix that later after sources scanning.');
|
||
newRoutes = IO.routes.replace(/ /gm, '');
|
||
RouterParserUtil$1.addIncompleteRoute({
|
||
data: newRoutes,
|
||
file: file
|
||
});
|
||
return true;
|
||
}
|
||
outputSymbols.routes = logger.__spreadArray(logger.__spreadArray([], logger.__read(outputSymbols.routes), false), logger.__read(newRoutes), false);
|
||
}
|
||
if (tsMorph.ts.isClassDeclaration(node)) {
|
||
_this.processClass(node, file, srcFile, outputSymbols, fileBody);
|
||
}
|
||
if (tsMorph.ts.isExpressionStatement(node) || tsMorph.ts.isIfStatement(node)) {
|
||
var bootstrapModuleReference = 'bootstrapModule';
|
||
// Find the root module with bootstrapModule call
|
||
// 1. find a simple call : platformBrowserDynamic().bootstrapModule(AppModule);
|
||
// 2. or inside a call :
|
||
// () => {
|
||
// platformBrowserDynamic().bootstrapModule(AppModule);
|
||
// });
|
||
// 3. with a catch : platformBrowserDynamic().bootstrapModule(AppModule).catch(error => console.error(error));
|
||
// 4. with parameters : platformBrowserDynamic().bootstrapModule(AppModule, {}).catch(error => console.error(error));
|
||
// Find recusively in expression nodes one with name 'bootstrapModule'
|
||
var rootModule_1;
|
||
var resultNode = void 0;
|
||
if (srcFile.text.indexOf(bootstrapModuleReference) !== -1) {
|
||
if (node.expression) {
|
||
resultNode = _this.findExpressionByNameInExpressions(node.expression, 'bootstrapModule');
|
||
}
|
||
if (typeof node.thenStatement !== 'undefined') {
|
||
if (node.thenStatement.statements &&
|
||
node.thenStatement.statements.length > 0) {
|
||
var firstStatement = node.thenStatement.statements[0];
|
||
resultNode = _this.findExpressionByNameInExpressions(firstStatement.expression, 'bootstrapModule');
|
||
}
|
||
}
|
||
if (!resultNode) {
|
||
if (node.expression &&
|
||
node.expression.arguments &&
|
||
node.expression.arguments.length > 0) {
|
||
resultNode = _this.findExpressionByNameInExpressionArguments(node.expression.arguments, 'bootstrapModule');
|
||
}
|
||
}
|
||
if (resultNode) {
|
||
if (resultNode.arguments.length > 0) {
|
||
___namespace.forEach(resultNode.arguments, function (argument) {
|
||
if (argument.text) {
|
||
rootModule_1 = argument.text;
|
||
}
|
||
});
|
||
}
|
||
if (rootModule_1) {
|
||
RouterParserUtil$1.setRootModule(rootModule_1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (tsMorph.ts.isVariableStatement(node)) {
|
||
var isRoutesVariable = RouterParserUtil$1.isVariableRoutes(node);
|
||
// Process all variables, including exported routes variables for miscellaneous
|
||
if (!isRoutesVariable || _this.isExportedVariable(node)) {
|
||
var isDestructured = false;
|
||
// Check for destructuring array
|
||
var nodeVariableDeclarations = node.declarationList.declarations;
|
||
if (nodeVariableDeclarations) {
|
||
if (nodeVariableDeclarations.length > 0) {
|
||
if (nodeVariableDeclarations[0].name &&
|
||
nodeVariableDeclarations[0].name.kind ===
|
||
tsMorph.SyntaxKind.ArrayBindingPattern) {
|
||
isDestructured = true;
|
||
}
|
||
}
|
||
}
|
||
var visitVariableNode = function (variableNode) {
|
||
var infos = _this.visitVariableDeclaration(variableNode);
|
||
if (infos) {
|
||
var name = infos.name;
|
||
var deprecated = infos.deprecated;
|
||
var deprecationMessage = infos.deprecationMessage;
|
||
var deps = {
|
||
name: name,
|
||
ctype: 'miscellaneous',
|
||
subtype: 'variable',
|
||
file: file,
|
||
deprecated: deprecated,
|
||
deprecationMessage: deprecationMessage
|
||
};
|
||
deps.type = infos.type ? infos.type : '';
|
||
if (infos.defaultValue) {
|
||
deps.defaultValue = infos.defaultValue;
|
||
}
|
||
if (infos.initializer) {
|
||
deps.initializer = infos.initializer;
|
||
}
|
||
if (variableNode.jsDoc &&
|
||
variableNode.jsDoc.length > 0 &&
|
||
variableNode.jsDoc[0].comment) {
|
||
var rawDescription = _this.jsdocParserUtil.parseJSDocNode(variableNode.jsDoc[0]);
|
||
deps.rawdescription = rawDescription;
|
||
deps.description = markedAcl(rawDescription);
|
||
}
|
||
if (isModuleWithProviders(variableNode)) {
|
||
var routingInitializer = getModuleWithProviders(variableNode);
|
||
RouterParserUtil$1.addModuleWithRoutes(name, [routingInitializer], file);
|
||
RouterParserUtil$1.addModule(name, [routingInitializer]);
|
||
}
|
||
if (!isIgnore(variableNode)) {
|
||
// Check if variable is allowed by public API filter
|
||
if (!_this.isSymbolAllowed(name, file)) {
|
||
logger.logger.debug("Skipping variable ".concat(name, " (not in public API)"));
|
||
return;
|
||
}
|
||
_this.debug(deps);
|
||
outputSymbols.miscellaneous.variables.push(deps);
|
||
}
|
||
}
|
||
};
|
||
if (isDestructured) {
|
||
if (nodeVariableDeclarations[0].name.elements) {
|
||
var destructuredVariables = nodeVariableDeclarations[0].name.elements;
|
||
for (var i = 0; i < destructuredVariables.length; i++) {
|
||
var destructuredVariable = destructuredVariables[i];
|
||
var name = destructuredVariable.name
|
||
? destructuredVariable.name.escapedText
|
||
: '';
|
||
var deps = {
|
||
name: name,
|
||
ctype: 'miscellaneous',
|
||
subtype: 'variable',
|
||
file: file
|
||
};
|
||
if (nodeVariableDeclarations[0].initializer) {
|
||
if (nodeVariableDeclarations[0].initializer.elements) {
|
||
deps.initializer =
|
||
nodeVariableDeclarations[0].initializer.elements[i];
|
||
}
|
||
deps.defaultValue = deps.initializer
|
||
? _this.classHelper.stringifyDefaultValue(deps.initializer)
|
||
: undefined;
|
||
}
|
||
if (!isIgnore(destructuredVariables[i])) {
|
||
// Check if variable is allowed by public API filter
|
||
if (!_this.isSymbolAllowed(name, file)) {
|
||
logger.logger.debug("Skipping destructured variable ".concat(name, " (not in public API)"));
|
||
continue;
|
||
}
|
||
_this.debug(deps);
|
||
outputSymbols.miscellaneous.variables.push(deps);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
visitVariableNode(node);
|
||
}
|
||
} // End of new if condition for isRoutesVariable || isExportedVariable
|
||
}
|
||
if (tsMorph.ts.isTypeAliasDeclaration(node)) {
|
||
var infos = _this.visitTypeDeclaration(node);
|
||
var name = infos.name;
|
||
var deprecated = infos.deprecated;
|
||
var deprecationMessage = infos.deprecationMessage;
|
||
var deps = {
|
||
name: name,
|
||
ctype: 'miscellaneous',
|
||
subtype: 'typealias',
|
||
rawtype: _this.classHelper.visitType(node),
|
||
file: file,
|
||
deprecated: deprecated,
|
||
deprecationMessage: deprecationMessage,
|
||
description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
||
};
|
||
if (node.type) {
|
||
deps.kind = node.type.kind;
|
||
}
|
||
if (deps.kind &&
|
||
deps.kind === tsMorph.SyntaxKind.TemplateLiteralType &&
|
||
node.type) {
|
||
deps.rawtype = srcFile.text.substring(node.type.pos, node.type.end);
|
||
}
|
||
if (!isIgnore(node)) {
|
||
_this.debug(deps);
|
||
outputSymbols.miscellaneous.typealiases.push(deps);
|
||
}
|
||
}
|
||
if (tsMorph.ts.isFunctionDeclaration(node)) {
|
||
var infos = _this.visitFunctionDeclaration(node);
|
||
var name = infos.name;
|
||
var deprecated = infos.deprecated;
|
||
var deprecationMessage = infos.deprecationMessage;
|
||
var functionDep = {
|
||
name: name,
|
||
ctype: 'miscellaneous',
|
||
subtype: 'function',
|
||
file: file,
|
||
deprecated: deprecated,
|
||
deprecationMessage: deprecationMessage,
|
||
description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
|
||
};
|
||
if (infos.args) {
|
||
functionDep.args = infos.args;
|
||
}
|
||
if (infos.returnType) {
|
||
functionDep.returnType = infos.returnType;
|
||
}
|
||
if (infos.jsdoctags && infos.jsdoctags.length > 0) {
|
||
functionDep.jsdoctags = infos.jsdoctags;
|
||
}
|
||
if (typeof infos.ignore === 'undefined') {
|
||
if (!(_this.hasPrivateJSDocTag(functionDep.jsdoctags) &&
|
||
Configuration$1.mainData.disablePrivate)) {
|
||
_this.debug(functionDep);
|
||
outputSymbols.miscellaneous.functions.push(functionDep);
|
||
}
|
||
}
|
||
}
|
||
if (tsMorph.ts.isEnumDeclaration(node)) {
|
||
var infos = _this.visitEnumDeclaration(node);
|
||
var name = infos.name;
|
||
var deprecated = infos.deprecated;
|
||
var deprecationMessage = infos.deprecationMessage;
|
||
var enumDeps = {
|
||
name: name,
|
||
childs: infos.members,
|
||
ctype: 'miscellaneous',
|
||
subtype: 'enum',
|
||
deprecated: deprecated,
|
||
deprecationMessage: deprecationMessage,
|
||
description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
|
||
file: file
|
||
};
|
||
if (!isIgnore(node)) {
|
||
_this.debug(enumDeps);
|
||
outputSymbols.miscellaneous.enumerations.push(enumDeps);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
parseNode(fileName, scannedFile, initialNode, null, astFile);
|
||
});
|
||
};
|
||
/**
|
||
* Function to in a specific store an entity, and check before is there is not the same one
|
||
* in that store : same name, id and file
|
||
* @param entity Entity to store
|
||
* @param store Store
|
||
*/
|
||
AngularDependencies.prototype.addNewEntityInStore = function (entity, store) {
|
||
var findSameEntityInStore = ___namespace.filter(store, {
|
||
name: entity.name,
|
||
id: entity.id,
|
||
file: entity.file
|
||
});
|
||
if (findSameEntityInStore.length === 0) {
|
||
store.push(entity);
|
||
}
|
||
};
|
||
AngularDependencies.prototype.debug = function (deps) {
|
||
if (deps) {
|
||
logger.logger.debug('found', "".concat(deps.name));
|
||
}
|
||
else {
|
||
return;
|
||
}
|
||
['imports', 'exports', 'declarations', 'providers', 'bootstrap'].forEach(function (symbols) {
|
||
if (deps[symbols] && deps[symbols].length > 0) {
|
||
logger.logger.debug('', "- ".concat(symbols, ":"));
|
||
deps[symbols]
|
||
.map(function (i) { return i.name; })
|
||
.forEach(function (d) {
|
||
logger.logger.debug('', "\t- ".concat(d));
|
||
});
|
||
}
|
||
});
|
||
};
|
||
AngularDependencies.prototype.ignore = function (deps) {
|
||
if (deps) {
|
||
logger.logger.warn('ignore', "".concat(deps.name));
|
||
}
|
||
else {
|
||
return;
|
||
}
|
||
};
|
||
AngularDependencies.prototype.checkForDeprecation = function (tags, result) {
|
||
___namespace.forEach(tags, function (tag) {
|
||
if (tag.tagName && tag.tagName.text && tag.tagName.text.indexOf('deprecated') > -1) {
|
||
result.deprecated = true;
|
||
result.deprecationMessage = tag.comment || '';
|
||
}
|
||
});
|
||
};
|
||
AngularDependencies.prototype.findExpressionByNameInExpressions = function (entryNode, name) {
|
||
var result;
|
||
var loop = function (node, z) {
|
||
if (node) {
|
||
if (node.expression && !node.expression.name) {
|
||
loop(node.expression, z);
|
||
}
|
||
if (node.expression && node.expression.name) {
|
||
if (node.expression.name.text === z) {
|
||
result = node;
|
||
}
|
||
else {
|
||
loop(node.expression, z);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
loop(entryNode, name);
|
||
return result;
|
||
};
|
||
AngularDependencies.prototype.findExpressionByNameInExpressionArguments = function (arg, name) {
|
||
var result;
|
||
var that = this;
|
||
var i = 0;
|
||
var len = arg.length;
|
||
var loop = function (node, z) {
|
||
if (node.body) {
|
||
if (node.body.statements && node.body.statements.length > 0) {
|
||
var j = 0;
|
||
var leng = node.body.statements.length;
|
||
for (j; j < leng; j++) {
|
||
result = that.findExpressionByNameInExpressions(node.body.statements[j], z);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
for (i; i < len; i++) {
|
||
loop(arg[i], name);
|
||
}
|
||
return result;
|
||
};
|
||
AngularDependencies.prototype.parseDecorators = function (decorators, type) {
|
||
var result = false;
|
||
if (decorators.length > 1) {
|
||
___namespace.forEach(decorators, function (decorator) {
|
||
if (decorator.expression.expression) {
|
||
if (decorator.expression.expression.text === type) {
|
||
result = true;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
else {
|
||
if (decorators[0].expression.expression) {
|
||
if (decorators[0].expression.expression.text === type) {
|
||
result = true;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
AngularDependencies.prototype.parseDecorator = function (decorator, type) {
|
||
var result = false;
|
||
if (decorator.expression.expression) {
|
||
if (decorator.expression.expression.text === type) {
|
||
result = true;
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
AngularDependencies.prototype.isController = function (metadata) {
|
||
return this.parseDecorator(metadata, 'Controller');
|
||
};
|
||
AngularDependencies.prototype.isEntity = function (metadata) {
|
||
return this.parseDecorator(metadata, 'Entity');
|
||
};
|
||
AngularDependencies.prototype.isComponent = function (metadata) {
|
||
return this.parseDecorator(metadata, 'Component');
|
||
};
|
||
AngularDependencies.prototype.isPipe = function (metadata) {
|
||
return this.parseDecorator(metadata, 'Pipe');
|
||
};
|
||
AngularDependencies.prototype.isDirective = function (metadata) {
|
||
return this.parseDecorator(metadata, 'Directive');
|
||
};
|
||
AngularDependencies.prototype.isInjectable = function (metadata) {
|
||
return this.parseDecorator(metadata, 'Injectable');
|
||
};
|
||
AngularDependencies.prototype.isModule = function (metadata) {
|
||
return this.parseDecorator(metadata, 'NgModule') || this.parseDecorator(metadata, 'Module');
|
||
};
|
||
AngularDependencies.prototype.hasInternalDecorator = function (metadatas) {
|
||
return (this.parseDecorators(metadatas, 'Controller') ||
|
||
this.parseDecorators(metadatas, 'Component') ||
|
||
this.parseDecorators(metadatas, 'Pipe') ||
|
||
this.parseDecorators(metadatas, 'Directive') ||
|
||
this.parseDecorators(metadatas, 'Injectable') ||
|
||
this.parseDecorators(metadatas, 'NgModule') ||
|
||
this.parseDecorators(metadatas, 'Module'));
|
||
};
|
||
AngularDependencies.prototype.isGuard = function (ioImplements) {
|
||
return (___namespace.includes(ioImplements, 'CanActivate') ||
|
||
___namespace.includes(ioImplements, 'CanActivateChild') ||
|
||
___namespace.includes(ioImplements, 'CanDeactivate') ||
|
||
___namespace.includes(ioImplements, 'Resolve') ||
|
||
___namespace.includes(ioImplements, 'CanLoad'));
|
||
};
|
||
AngularDependencies.prototype.getSymboleName = function (node) {
|
||
return node.name.text;
|
||
};
|
||
AngularDependencies.prototype.findProperties = function (visitedNode, sourceFile) {
|
||
if (visitedNode.expression &&
|
||
visitedNode.expression.arguments &&
|
||
visitedNode.expression.arguments.length > 0) {
|
||
var pop = visitedNode.expression.arguments[0];
|
||
if (pop && pop.properties && pop.properties.length >= 0) {
|
||
return pop.properties;
|
||
}
|
||
else if (pop && pop.kind && pop.kind === tsMorph.SyntaxKind.StringLiteral) {
|
||
return [pop];
|
||
}
|
||
else {
|
||
logger.logger.warn('Empty metadatas, trying to find it with imports.');
|
||
return ImportsUtil$1.findValueInImportOrLocalVariables(pop.text, sourceFile);
|
||
}
|
||
}
|
||
return [];
|
||
};
|
||
AngularDependencies.prototype.isAngularLifecycleHook = function (methodName) {
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
var ANGULAR_LIFECYCLE_METHODS = [
|
||
'ngOnInit',
|
||
'ngOnChanges',
|
||
'ngDoCheck',
|
||
'ngOnDestroy',
|
||
'ngAfterContentInit',
|
||
'ngAfterContentChecked',
|
||
'ngAfterViewInit',
|
||
'ngAfterViewChecked',
|
||
'writeValue',
|
||
'registerOnChange',
|
||
'registerOnTouched',
|
||
'setDisabledState'
|
||
];
|
||
return ANGULAR_LIFECYCLE_METHODS.indexOf(methodName) >= 0;
|
||
};
|
||
AngularDependencies.prototype.visitTypeDeclaration = function (node) {
|
||
var result = {
|
||
deprecated: false,
|
||
deprecationMessage: '',
|
||
name: node.name.text,
|
||
kind: node.kind
|
||
};
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
|
||
if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
||
this.checkForDeprecation(jsdoctags[0].tags, result);
|
||
result.jsdoctags = markedtags(jsdoctags[0].tags);
|
||
}
|
||
return result;
|
||
};
|
||
AngularDependencies.prototype.visitArgument = function (arg) {
|
||
var _this = this;
|
||
if (arg.name && arg.name.kind == tsMorph.SyntaxKind.ObjectBindingPattern) {
|
||
var results = [];
|
||
var destrucuredGroupId_1 = uuid.v4();
|
||
results = arg.name.elements.map(function (element) { return _this.visitArgument(element); });
|
||
results = results.map(function (result) {
|
||
result.destrucuredGroupId = destrucuredGroupId_1;
|
||
return result;
|
||
});
|
||
if (arg.name.elements && arg.type && arg.type.members) {
|
||
if (arg.name.elements.length === arg.type.members.length) {
|
||
for (var i = 0; i < arg.name.elements.length; i++) {
|
||
results[i].type = this.classHelper.visitType(arg.type.members[i]);
|
||
}
|
||
}
|
||
}
|
||
if (arg.name.elements && arg.type && arg.type.typeName) {
|
||
results[0].type = this.classHelper.visitType(arg.type);
|
||
}
|
||
return results;
|
||
}
|
||
else {
|
||
var result = {
|
||
name: arg.name.text,
|
||
type: this.classHelper.visitType(arg),
|
||
deprecated: false,
|
||
deprecationMessage: ''
|
||
};
|
||
if (arg.dotDotDotToken) {
|
||
result.dotDotDotToken = true;
|
||
}
|
||
if (arg.questionToken) {
|
||
result.optional = true;
|
||
}
|
||
if (arg.initializer) {
|
||
result.defaultValue = arg.initializer
|
||
? this.classHelper.stringifyDefaultValue(arg.initializer)
|
||
: undefined;
|
||
}
|
||
if (arg.type) {
|
||
result.type = this.mapType(arg.type.kind);
|
||
if (arg.type.kind === tsMorph.SyntaxKind.TypeReference) {
|
||
// try replace TypeReference with typeName
|
||
if (arg.type.typeName) {
|
||
result.type = arg.type.typeName.text;
|
||
}
|
||
}
|
||
}
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(arg);
|
||
if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
||
this.checkForDeprecation(jsdoctags[0].tags, result);
|
||
}
|
||
return result;
|
||
}
|
||
};
|
||
AngularDependencies.prototype.mapType = function (type) {
|
||
switch (type) {
|
||
case tsMorph.SyntaxKind.NullKeyword:
|
||
return 'null';
|
||
case tsMorph.SyntaxKind.AnyKeyword:
|
||
return 'any';
|
||
case tsMorph.SyntaxKind.BooleanKeyword:
|
||
return 'boolean';
|
||
case tsMorph.SyntaxKind.NeverKeyword:
|
||
return 'never';
|
||
case tsMorph.SyntaxKind.NumberKeyword:
|
||
return 'number';
|
||
case tsMorph.SyntaxKind.StringKeyword:
|
||
return 'string';
|
||
case tsMorph.SyntaxKind.UndefinedKeyword:
|
||
return 'undefined';
|
||
case tsMorph.SyntaxKind.TypeReference:
|
||
return 'typeReference';
|
||
}
|
||
};
|
||
AngularDependencies.prototype.hasPrivateJSDocTag = function (tags) {
|
||
var result = false;
|
||
if (tags) {
|
||
tags.forEach(function (tag) {
|
||
if (tag.tagName && tag.tagName.text && tag.tagName.text === 'private') {
|
||
result = true;
|
||
}
|
||
});
|
||
}
|
||
return result;
|
||
};
|
||
AngularDependencies.prototype.visitFunctionDeclaration = function (method) {
|
||
var methodName = method.name ? method.name.text : 'Unnamed function';
|
||
var resultArguments = [];
|
||
var result = {
|
||
deprecated: false,
|
||
deprecationMessage: '',
|
||
name: methodName
|
||
};
|
||
for (var i = 0; i < method.parameters.length; i++) {
|
||
var argument = method.parameters[i];
|
||
if (argument) {
|
||
var argumentParsed = this.visitArgument(argument);
|
||
if (argumentParsed.length > 0) {
|
||
for (var j = 0; j < argumentParsed.length; j++) {
|
||
var argumentParsedInside = argumentParsed[j];
|
||
argumentParsedInside.destructuredParameter = true;
|
||
resultArguments.push(argumentParsedInside);
|
||
}
|
||
}
|
||
else {
|
||
resultArguments.push(argumentParsed);
|
||
}
|
||
}
|
||
}
|
||
result.args = resultArguments;
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
|
||
if (typeof method.type !== 'undefined') {
|
||
result.returnType = this.classHelper.visitType(method.type);
|
||
}
|
||
if (method.modifiers) {
|
||
if (method.modifiers.length > 0) {
|
||
var kinds = method.modifiers
|
||
.map(function (modifier) {
|
||
return modifier.kind;
|
||
})
|
||
.reverse();
|
||
if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
|
||
___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
|
||
kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
|
||
}
|
||
}
|
||
}
|
||
if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
||
this.checkForDeprecation(jsdoctags[0].tags, result);
|
||
result.jsdoctags = markedtags(jsdoctags[0].tags);
|
||
___namespace.forEach(jsdoctags[0].tags, function (tag) {
|
||
if (tag.tagName) {
|
||
if (tag.tagName.text) {
|
||
if (tag.tagName.text.indexOf('ignore') > -1) {
|
||
result.ignore = true;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
if (result.jsdoctags && result.jsdoctags.length > 0) {
|
||
result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
|
||
}
|
||
else if (result.args.length > 0) {
|
||
result.jsdoctags = mergeTagsAndArgs(result.args);
|
||
}
|
||
return result;
|
||
};
|
||
AngularDependencies.prototype.visitVariableDeclaration = function (node) {
|
||
if (node.declarationList && node.declarationList.declarations) {
|
||
var i = 0;
|
||
var len = node.declarationList.declarations.length;
|
||
for (i; i < len; i++) {
|
||
var result = {
|
||
name: node.declarationList.declarations[i].name.text,
|
||
defaultValue: node.declarationList.declarations[i].initializer
|
||
? this.classHelper.stringifyDefaultValue(node.declarationList.declarations[i].initializer)
|
||
: undefined,
|
||
deprecated: false,
|
||
deprecationMessage: ''
|
||
};
|
||
if (node.declarationList.declarations[i].initializer) {
|
||
result.initializer = node.declarationList.declarations[i].initializer;
|
||
}
|
||
if (node.declarationList.declarations[i].type) {
|
||
result.type = this.classHelper.visitType(node.declarationList.declarations[i].type);
|
||
}
|
||
if (typeof result.type === 'undefined' && result.initializer) {
|
||
result.type = kindToType(result.initializer.kind);
|
||
}
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(node.declarationList.declarations[i]);
|
||
if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
||
this.checkForDeprecation(jsdoctags[0].tags, result);
|
||
}
|
||
return result;
|
||
}
|
||
}
|
||
};
|
||
AngularDependencies.prototype.visitEnumTypeAliasFunctionDeclarationDescription = function (node) {
|
||
var description = '';
|
||
if (node.jsDoc) {
|
||
if (node.jsDoc.length > 0) {
|
||
if (typeof node.jsDoc[0].comment !== 'undefined') {
|
||
var rawDescription = this.jsdocParserUtil.parseJSDocNode(node.jsDoc[0]);
|
||
description = markedAcl(rawDescription);
|
||
}
|
||
}
|
||
}
|
||
return description;
|
||
};
|
||
AngularDependencies.prototype.visitEnumDeclaration = function (node) {
|
||
var result = {
|
||
deprecated: false,
|
||
deprecationMessage: '',
|
||
name: node.name.text,
|
||
members: []
|
||
};
|
||
if (node.members) {
|
||
var i = 0;
|
||
var len = node.members.length;
|
||
var memberjsdoctags = [];
|
||
for (i; i < len; i++) {
|
||
var member = {
|
||
name: node.members[i].name.text,
|
||
deprecated: false,
|
||
deprecationMessage: ''
|
||
};
|
||
if (node.members[i].initializer) {
|
||
// if the initializer kind is a number do cast to the number type
|
||
member.value = IsKindType.NUMBER(node.members[i].initializer.kind)
|
||
? Number(node.members[i].initializer.text)
|
||
: node.members[i].initializer.text;
|
||
}
|
||
memberjsdoctags = this.jsdocParserUtil.getJSDocs(node.members[i]);
|
||
if (memberjsdoctags && memberjsdoctags.length >= 1 && memberjsdoctags[0].tags) {
|
||
this.checkForDeprecation(memberjsdoctags[0].tags, member);
|
||
}
|
||
result.members.push(member);
|
||
}
|
||
}
|
||
var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
|
||
if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
|
||
this.checkForDeprecation(jsdoctags[0].tags, result);
|
||
}
|
||
return result;
|
||
};
|
||
AngularDependencies.prototype.visitEnumDeclarationForRoutes = function (fileName, node) {
|
||
if (node.declarationList.declarations) {
|
||
var i = 0;
|
||
var len = node.declarationList.declarations.length;
|
||
for (i; i < len; i++) {
|
||
var routesInitializer = node.declarationList.declarations[i].initializer;
|
||
var data = new CodeGenerator().generate(routesInitializer);
|
||
RouterParserUtil$1.addRoute({
|
||
name: node.declarationList.declarations[i].name.text,
|
||
data: RouterParserUtil$1.cleanRawRoute(data),
|
||
filename: fileName
|
||
});
|
||
return [
|
||
{
|
||
routes: data
|
||
}
|
||
];
|
||
}
|
||
}
|
||
return [];
|
||
};
|
||
AngularDependencies.prototype.getRouteIO = function (filename, sourceFile, node) {
|
||
var _this = this;
|
||
var res;
|
||
if (sourceFile.statements) {
|
||
res = sourceFile.statements.reduce(function (directive, statement) {
|
||
if (RouterParserUtil$1.isVariableRoutes(statement)) {
|
||
if (statement.pos === node.pos && statement.end === node.end) {
|
||
return directive.concat(_this.visitEnumDeclarationForRoutes(filename, statement));
|
||
}
|
||
}
|
||
return directive;
|
||
}, []);
|
||
return res[0] || {};
|
||
}
|
||
else {
|
||
return {};
|
||
}
|
||
};
|
||
AngularDependencies.prototype.getClassIO = function (filename, sourceFile, node, fileBody, astFile) {
|
||
var _this = this;
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
|
||
var res = reducedSource.reduce(function (directive, statement) {
|
||
if (tsMorph.ts.isClassDeclaration(statement)) {
|
||
if (statement.pos === node.pos && statement.end === node.end) {
|
||
return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile, astFile));
|
||
}
|
||
}
|
||
return directive;
|
||
}, []);
|
||
return res[0] || {};
|
||
};
|
||
AngularDependencies.prototype.getInterfaceIO = function (filename, sourceFile, node, fileBody, astFile) {
|
||
var _this = this;
|
||
/**
|
||
* Copyright https://github.com/ng-bootstrap/ng-bootstrap
|
||
*/
|
||
var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
|
||
var res = reducedSource.reduce(function (directive, statement) {
|
||
if (tsMorph.ts.isInterfaceDeclaration(statement)) {
|
||
if (statement.pos === node.pos && statement.end === node.end) {
|
||
return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile, astFile));
|
||
}
|
||
}
|
||
return directive;
|
||
}, []);
|
||
return res[0] || {};
|
||
};
|
||
/**
|
||
* Check if a variable statement is exported
|
||
*/
|
||
AngularDependencies.prototype.isExportedVariable = function (node) {
|
||
// Check if the node has export modifiers
|
||
return !!(node.modifiers && node.modifiers.some(function (modifier) {
|
||
return modifier.kind === tsMorph.SyntaxKind.ExportKeyword;
|
||
}));
|
||
};
|
||
return AngularDependencies;
|
||
}(FrameworkDependencies));
|
||
|
||
var AngularJSDependencies = /** @class */ (function (_super) {
|
||
logger.__extends(AngularJSDependencies, _super);
|
||
function AngularJSDependencies(files, options) {
|
||
var _this = _super.call(this, files, options) || this;
|
||
_this.cache = new ComponentCache();
|
||
_this.moduleHelper = new ModuleHelper(_this.cache);
|
||
_this.jsDocHelper = new JsDocHelper();
|
||
_this.symbolHelper = new SymbolHelper();
|
||
return _this;
|
||
}
|
||
AngularJSDependencies.prototype.getDependencies = function () {
|
||
var deps = {
|
||
modules: [],
|
||
modulesForGraph: [],
|
||
components: [],
|
||
injectables: [],
|
||
interceptors: [],
|
||
pipes: [],
|
||
directives: [],
|
||
routes: [],
|
||
classes: [],
|
||
interfaces: [],
|
||
miscellaneous: {
|
||
variables: [],
|
||
functions: [],
|
||
typealiases: [],
|
||
enumerations: []
|
||
},
|
||
routesTree: undefined
|
||
};
|
||
return deps;
|
||
};
|
||
return AngularJSDependencies;
|
||
}(FrameworkDependencies));
|
||
|
||
function promiseSequential(promises) {
|
||
if (!Array.isArray(promises)) {
|
||
throw new Error('First argument need to be an array of Promises');
|
||
}
|
||
return new Promise(function (resolve, reject) {
|
||
var count = 0;
|
||
var results = [];
|
||
var iterateeFunc = function (previousPromise, currentPromise) {
|
||
return previousPromise
|
||
.then(function (result) {
|
||
if (count++ !== 0) {
|
||
results = results.concat(result);
|
||
}
|
||
return currentPromise(result, results, count);
|
||
})
|
||
.catch(function (err) {
|
||
return reject(err);
|
||
});
|
||
};
|
||
promises = promises.concat(function () { return Promise.resolve(); });
|
||
promises.reduce(iterateeFunc, Promise.resolve(false)).then(function (res) {
|
||
resolve(results);
|
||
});
|
||
});
|
||
}
|
||
|
||
var chokidar = require('chokidar');
|
||
var traverse = require('neotraverse/legacy');
|
||
var crypto = require('crypto');
|
||
var babel = require('@babel/core');
|
||
var cwd$1 = process.cwd();
|
||
var startTime = new Date();
|
||
var generationPromiseResolve;
|
||
var generationPromiseReject;
|
||
var generationPromise = new Promise(function (resolve, reject) {
|
||
generationPromiseResolve = resolve;
|
||
generationPromiseReject = reject;
|
||
});
|
||
var Application = /** @class */ (function () {
|
||
/**
|
||
* Create a new compodoc application instance.
|
||
*
|
||
* @param options An object containing the options that should be used.
|
||
*/
|
||
function Application(options) {
|
||
var _this = this;
|
||
/**
|
||
* Files changed during watch scanning
|
||
*/
|
||
this.watchChangedFiles = [];
|
||
/**
|
||
* Boolean for watching status
|
||
* @type {boolean}
|
||
*/
|
||
this.isWatching = false;
|
||
/**
|
||
* Store package.json data
|
||
*/
|
||
this.packageJsonData = {};
|
||
this.preparePipes = function (somePipes) {
|
||
logger.logger.info('Prepare pipes');
|
||
Configuration$1.mainData.pipes = somePipes ? somePipes : DependenciesEngine$1.getPipes();
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.pipes.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
var pipe = Configuration$1.mainData.pipes[i];
|
||
if (MarkdownEngine$1.hasNeighbourReadmeFile(pipe.file)) {
|
||
logger.logger.info(" ".concat(pipe.name, " has a README file, include it"));
|
||
var readme = MarkdownEngine$1.readNeighbourReadmeFile(pipe.file);
|
||
pipe.readme = markedAcl(readme);
|
||
}
|
||
var page = {
|
||
path: 'pipes',
|
||
name: pipe.name,
|
||
id: pipe.id,
|
||
navTabs: _this.getNavTabs(pipe),
|
||
context: 'pipe',
|
||
pipe: pipe,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (pipe.isDuplicate) {
|
||
page.name += '-' + pipe.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve(true);
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
this.prepareClasses = function (someClasses) {
|
||
logger.logger.info('Prepare classes');
|
||
Configuration$1.mainData.classes = someClasses
|
||
? someClasses
|
||
: DependenciesEngine$1.getClasses();
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.classes.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
var classe = Configuration$1.mainData.classes[i];
|
||
if (MarkdownEngine$1.hasNeighbourReadmeFile(classe.file)) {
|
||
logger.logger.info(" ".concat(classe.name, " has a README file, include it"));
|
||
var readme = MarkdownEngine$1.readNeighbourReadmeFile(classe.file);
|
||
classe.readme = markedAcl(readme);
|
||
}
|
||
var page = {
|
||
path: 'classes',
|
||
name: classe.name,
|
||
id: classe.id,
|
||
navTabs: _this.getNavTabs(classe),
|
||
context: 'class',
|
||
class: classe,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (classe.isDuplicate) {
|
||
page.name += '-' + classe.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve(true);
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
for (var option in options) {
|
||
if (typeof Configuration$1.mainData[option] !== 'undefined') {
|
||
Configuration$1.mainData[option] = options[option];
|
||
}
|
||
// For documentationMainName, process it outside the loop, for handling conflict with pages name
|
||
if (option === 'name') {
|
||
Configuration$1.mainData.documentationMainName = options[option];
|
||
}
|
||
// For documentationMainName, process it outside the loop, for handling conflict with pages name
|
||
if (option === 'silent') {
|
||
logger.logger.silent = false;
|
||
}
|
||
}
|
||
}
|
||
/**
|
||
* Start compodoc process
|
||
*/
|
||
Application.prototype.generate = function () {
|
||
var _this = this;
|
||
process.on('unhandledRejection', this.unhandledRejectionListener);
|
||
process.on('uncaughtException', this.uncaughtExceptionListener);
|
||
I18nEngine$1.init(Configuration$1.mainData.language);
|
||
if (Configuration$1.mainData.output.charAt(Configuration$1.mainData.output.length - 1) !== '/') {
|
||
Configuration$1.mainData.output += '/';
|
||
}
|
||
if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
||
this.processPackageJson();
|
||
}
|
||
else {
|
||
HtmlEngine$1.init(Configuration$1.mainData.templates).then(function () { return _this.processPackageJson(); });
|
||
}
|
||
return generationPromise;
|
||
};
|
||
Application.prototype.endCallback = function () {
|
||
process.removeListener('unhandledRejection', this.unhandledRejectionListener);
|
||
process.removeListener('uncaughtException', this.uncaughtExceptionListener);
|
||
};
|
||
Application.prototype.unhandledRejectionListener = function (err, p) {
|
||
console.log('Unhandled Rejection at:', p, 'reason:', err);
|
||
logger.logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
|
||
process.exit(1);
|
||
};
|
||
Application.prototype.uncaughtExceptionListener = function (err) {
|
||
logger.logger.error(err);
|
||
logger.logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
|
||
process.exit(1);
|
||
};
|
||
/**
|
||
* Start compodoc documentation coverage
|
||
*/
|
||
Application.prototype.testCoverage = function () {
|
||
this.getDependenciesData();
|
||
};
|
||
/**
|
||
* Store files for initial processing
|
||
* @param {Array<string>} files Files found during source folder and tsconfig scan
|
||
*/
|
||
Application.prototype.setFiles = function (files) {
|
||
this.files = files;
|
||
};
|
||
/**
|
||
* Store files for watch processing
|
||
* @param {Array<string>} files Files found during source folder and tsconfig scan
|
||
*/
|
||
Application.prototype.setUpdatedFiles = function (files) {
|
||
this.updatedFiles = files;
|
||
};
|
||
/**
|
||
* Return a boolean indicating presence of one TypeScript file in updatedFiles list
|
||
* @return {boolean} Result of scan
|
||
*/
|
||
Application.prototype.hasWatchedFilesTSFiles = function () {
|
||
var result = false;
|
||
___namespace.forEach(this.updatedFiles, function (file) {
|
||
if (path__namespace.extname(file) === '.ts') {
|
||
result = true;
|
||
}
|
||
});
|
||
return result;
|
||
};
|
||
/**
|
||
* Return a boolean indicating presence of one root markdown files in updatedFiles list
|
||
* @return {boolean} Result of scan
|
||
*/
|
||
Application.prototype.hasWatchedFilesRootMarkdownFiles = function () {
|
||
var result = false;
|
||
___namespace.forEach(this.updatedFiles, function (file) {
|
||
if (path__namespace.extname(file) === '.md' && path__namespace.dirname(file) === cwd$1) {
|
||
result = true;
|
||
}
|
||
});
|
||
return result;
|
||
};
|
||
/**
|
||
* Clear files for watch processing
|
||
*/
|
||
Application.prototype.clearUpdatedFiles = function () {
|
||
this.updatedFiles = [];
|
||
this.watchChangedFiles = [];
|
||
};
|
||
Application.prototype.processPackageJson = function () {
|
||
var _this = this;
|
||
logger.logger.info('Searching package.json file');
|
||
FileEngine$1.get(cwd$1 + path__namespace.sep + 'package.json').then(function (packageData) {
|
||
var parsedData = JSON.parse(packageData);
|
||
_this.packageJsonData = parsedData;
|
||
if (typeof parsedData.name !== 'undefined' &&
|
||
Configuration$1.mainData.documentationMainName === COMPODOC_DEFAULTS.title) {
|
||
Configuration$1.mainData.documentationMainName =
|
||
parsedData.name + ' documentation';
|
||
}
|
||
if (typeof parsedData.description !== 'undefined') {
|
||
Configuration$1.mainData.documentationMainDescription = parsedData.description;
|
||
}
|
||
Configuration$1.mainData.angularVersion =
|
||
AngularVersionUtil$1.getAngularVersionOfProject(parsedData);
|
||
logger.logger.info('package.json file found');
|
||
if (!Configuration$1.mainData.disableDependencies) {
|
||
if (typeof parsedData.dependencies !== 'undefined') {
|
||
_this.processPackageDependencies(parsedData.dependencies);
|
||
}
|
||
if (typeof parsedData.peerDependencies !== 'undefined') {
|
||
_this.processPackagePeerDependencies(parsedData.peerDependencies);
|
||
}
|
||
}
|
||
if (!Configuration$1.mainData.disableProperties) {
|
||
var propertiesToCheck = [
|
||
'version',
|
||
'description',
|
||
'keywords',
|
||
'homepage',
|
||
'bugs',
|
||
'license',
|
||
'repository',
|
||
'author'
|
||
];
|
||
var hasOneOfCheckedProperties_1 = false;
|
||
propertiesToCheck.forEach(function (prop) {
|
||
if (prop in parsedData) {
|
||
hasOneOfCheckedProperties_1 = true;
|
||
Configuration$1.mainData.packageProperties[prop] = parsedData[prop];
|
||
}
|
||
});
|
||
if (hasOneOfCheckedProperties_1) {
|
||
Configuration$1.addPage({
|
||
name: 'properties',
|
||
id: 'packageProperties',
|
||
context: 'package-properties',
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
}
|
||
}
|
||
_this.processMarkdowns().then(function () {
|
||
_this.getDependenciesData();
|
||
}, function (errorMessage) {
|
||
logger.logger.error(errorMessage);
|
||
process.exit(1);
|
||
});
|
||
}, function (errorMessage) {
|
||
logger.logger.error(errorMessage);
|
||
logger.logger.error('Continuing without package.json file');
|
||
_this.processMarkdowns().then(function () {
|
||
_this.getDependenciesData();
|
||
}, function (errorMessage1) {
|
||
logger.logger.error(errorMessage1);
|
||
process.exit(1);
|
||
});
|
||
});
|
||
};
|
||
Application.prototype.processPackagePeerDependencies = function (dependencies) {
|
||
logger.logger.info('Processing package.json peerDependencies');
|
||
Configuration$1.mainData.packagePeerDependencies = dependencies;
|
||
if (!Configuration$1.hasPage('dependencies')) {
|
||
Configuration$1.addPage({
|
||
name: 'dependencies',
|
||
id: 'packageDependencies',
|
||
context: 'package-dependencies',
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
}
|
||
};
|
||
Application.prototype.processPackageDependencies = function (dependencies) {
|
||
logger.logger.info('Processing package.json dependencies');
|
||
Configuration$1.mainData.packageDependencies = dependencies;
|
||
Configuration$1.addPage({
|
||
name: 'dependencies',
|
||
id: 'packageDependencies',
|
||
context: 'package-dependencies',
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
};
|
||
Application.prototype.processMarkdowns = function () {
|
||
logger.logger.info('Searching README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md files');
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var markdowns = ['readme', 'changelog', 'contributing', 'license', 'todo'];
|
||
var numberOfMarkdowns = 5;
|
||
var loop = function () {
|
||
if (i < numberOfMarkdowns) {
|
||
MarkdownEngine$1.getTraditionalMarkdown(markdowns[i].toUpperCase()).then(function (readmeData) {
|
||
logger.logger.info("".concat(markdowns[i].toUpperCase(), ".md file found"));
|
||
if (markdowns[i] === 'readme') {
|
||
Configuration$1.mainData.readme = true;
|
||
// Always create index.html as main page with README content
|
||
Configuration$1.addPage({
|
||
name: 'index',
|
||
context: 'readme',
|
||
id: 'index',
|
||
markdown: readmeData.markdown,
|
||
data: readmeData.rawData,
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
// If overview is not disabled, also create separate overview page
|
||
if (!Configuration$1.mainData.disableOverview) {
|
||
Configuration$1.addPage({
|
||
name: 'overview',
|
||
context: 'overview',
|
||
id: 'overview',
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
}
|
||
}
|
||
else {
|
||
// For other markdown files (changelog, contributing, etc.)
|
||
Configuration$1.addPage({
|
||
name: markdowns[i],
|
||
context: markdowns[i],
|
||
id: markdowns[i],
|
||
markdown: readmeData.markdown,
|
||
data: readmeData.rawData,
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
Configuration$1.mainData.markdowns.push({
|
||
name: markdowns[i],
|
||
uppername: markdowns[i].toUpperCase(),
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
}
|
||
i++;
|
||
loop();
|
||
}).catch(function (errorMessage) {
|
||
logger.logger.warn(errorMessage);
|
||
logger.logger.warn("Continuing without ".concat(markdowns[i].toUpperCase(), ".md file"));
|
||
if (markdowns[i] === 'readme') {
|
||
if (!Configuration$1.mainData.disableOverview) {
|
||
Configuration$1.addPage({
|
||
name: 'index',
|
||
id: 'index',
|
||
context: 'overview',
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
}
|
||
else {
|
||
// When README doesn't exist and overview is disabled,
|
||
// generate overview page anyway but show warning
|
||
logger.logger.warn('No README.md found and --disableOverview is enabled.');
|
||
logger.logger.warn('Generating overview page as landing page. Consider adding a README.md file.');
|
||
Configuration$1.addPage({
|
||
name: 'index',
|
||
id: 'index',
|
||
context: 'overview',
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
}
|
||
}
|
||
i++;
|
||
loop();
|
||
});
|
||
}
|
||
else {
|
||
resolve(true);
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.rebuildRootMarkdowns = function () {
|
||
var _this = this;
|
||
logger.logger.info('Regenerating README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md pages');
|
||
var actions = [];
|
||
Configuration$1.resetRootMarkdownPages();
|
||
actions.push(function () {
|
||
return _this.processMarkdowns();
|
||
});
|
||
promiseSequential(actions)
|
||
.then(function (res) {
|
||
_this.processPages();
|
||
_this.clearUpdatedFiles();
|
||
})
|
||
.catch(function (errorMessage) {
|
||
logger.logger.error(errorMessage);
|
||
});
|
||
};
|
||
/**
|
||
* Get dependency data for small group of updated files during watch process
|
||
*/
|
||
Application.prototype.getMicroDependenciesData = function () {
|
||
logger.logger.info('Get diff dependencies data');
|
||
var dependenciesClass = AngularDependencies;
|
||
Configuration$1.mainData.angularProject = true;
|
||
if (this.detectAngularJSProjects()) {
|
||
logger.logger.info('AngularJS project detected');
|
||
Configuration$1.mainData.angularProject = false;
|
||
Configuration$1.mainData.angularJSProject = true;
|
||
dependenciesClass = AngularJSDependencies;
|
||
}
|
||
var crawler = new dependenciesClass(this.updatedFiles, {
|
||
tsconfigDirectory: path__namespace.dirname(Configuration$1.mainData.tsconfig)
|
||
}, Configuration$1, RouterParserUtil$1);
|
||
var dependenciesData = crawler.getDependencies();
|
||
DependenciesEngine$1.update(dependenciesData);
|
||
this.prepareJustAFewThings(dependenciesData);
|
||
};
|
||
/**
|
||
* Rebuild external documentation during watch process
|
||
*/
|
||
Application.prototype.rebuildExternalDocumentation = function () {
|
||
var _this = this;
|
||
logger.logger.info('Rebuild external documentation');
|
||
var actions = [];
|
||
Configuration$1.resetAdditionalPages();
|
||
if (Configuration$1.mainData.includes !== '') {
|
||
actions.push(function () {
|
||
return _this.prepareExternalIncludes();
|
||
});
|
||
}
|
||
promiseSequential(actions)
|
||
.then(function (res) {
|
||
_this.processPages();
|
||
_this.clearUpdatedFiles();
|
||
})
|
||
.catch(function (errorMessage) {
|
||
logger.logger.error(errorMessage);
|
||
});
|
||
};
|
||
Application.prototype.detectAngularJSProjects = function () {
|
||
var result = false;
|
||
if (typeof this.packageJsonData.dependencies !== 'undefined') {
|
||
if (typeof this.packageJsonData.dependencies.angular !== 'undefined') {
|
||
result = true;
|
||
}
|
||
else {
|
||
var countJSFiles_1 = 0;
|
||
this.files.forEach(function (file) {
|
||
if (path__namespace.extname(file) === '.js') {
|
||
countJSFiles_1 += 1;
|
||
}
|
||
});
|
||
var percentOfJSFiles = (countJSFiles_1 * 100) / this.files.length;
|
||
if (percentOfJSFiles >= 75) {
|
||
result = true;
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
};
|
||
Application.prototype.getDependenciesData = function () {
|
||
logger.logger.info('Get dependencies data');
|
||
/**
|
||
* AngularJS detection strategy :
|
||
* - if in package.json
|
||
* - if 75% of scanned files are *.js files
|
||
*/
|
||
var dependenciesClass = AngularDependencies;
|
||
Configuration$1.mainData.angularProject = true;
|
||
if (this.detectAngularJSProjects()) {
|
||
logger.logger.info('AngularJS project detected');
|
||
Configuration$1.mainData.angularProject = false;
|
||
Configuration$1.mainData.angularJSProject = true;
|
||
dependenciesClass = AngularJSDependencies;
|
||
}
|
||
var crawler = new dependenciesClass(this.files, {
|
||
tsconfigDirectory: path__namespace.dirname(Configuration$1.mainData.tsconfig)
|
||
}, Configuration$1, RouterParserUtil$1);
|
||
var dependenciesData = crawler.getDependencies();
|
||
DependenciesEngine$1.init(dependenciesData);
|
||
Configuration$1.mainData.routesLength = RouterParserUtil$1.routesLength();
|
||
this.printStatistics();
|
||
this.prepareEverything();
|
||
};
|
||
Application.prototype.prepareJustAFewThings = function (diffCrawledData) {
|
||
var _this = this;
|
||
var actions = [];
|
||
Configuration$1.resetPages();
|
||
if (!Configuration$1.mainData.disableRoutesGraph) {
|
||
actions.push(function () { return _this.prepareRoutes(); });
|
||
}
|
||
if (diffCrawledData.components.length > 0) {
|
||
actions.push(function () { return _this.prepareComponents(); });
|
||
}
|
||
if (diffCrawledData.controllers.length > 0) {
|
||
actions.push(function () { return _this.prepareControllers(); });
|
||
}
|
||
if (diffCrawledData.entities.length > 0) {
|
||
actions.push(function () { return _this.prepareEntities(); });
|
||
}
|
||
if (diffCrawledData.modules.length > 0) {
|
||
actions.push(function () { return _this.prepareModules(); });
|
||
}
|
||
if (diffCrawledData.directives.length > 0) {
|
||
actions.push(function () { return _this.prepareDirectives(); });
|
||
}
|
||
if (diffCrawledData.injectables.length > 0) {
|
||
actions.push(function () { return _this.prepareInjectables(); });
|
||
}
|
||
if (diffCrawledData.interceptors.length > 0) {
|
||
actions.push(function () { return _this.prepareInterceptors(); });
|
||
}
|
||
if (diffCrawledData.guards.length > 0) {
|
||
actions.push(function () { return _this.prepareGuards(); });
|
||
}
|
||
if (diffCrawledData.pipes.length > 0) {
|
||
actions.push(function () { return _this.preparePipes(); });
|
||
}
|
||
if (diffCrawledData.classes.length > 0) {
|
||
actions.push(function () { return _this.prepareClasses(); });
|
||
}
|
||
if (diffCrawledData.interfaces.length > 0) {
|
||
actions.push(function () { return _this.prepareInterfaces(); });
|
||
}
|
||
if (diffCrawledData.miscellaneous.variables.length > 0 ||
|
||
diffCrawledData.miscellaneous.functions.length > 0 ||
|
||
diffCrawledData.miscellaneous.typealiases.length > 0 ||
|
||
diffCrawledData.miscellaneous.enumerations.length > 0) {
|
||
actions.push(function () { return _this.prepareMiscellaneous(); });
|
||
}
|
||
if (!Configuration$1.mainData.disableCoverage) {
|
||
actions.push(function () { return _this.prepareCoverage(); });
|
||
}
|
||
promiseSequential(actions)
|
||
.then(function (res) {
|
||
if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
||
if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(Configuration$1.mainData.exportFormat) > -1) {
|
||
logger.logger.info("Generating documentation in export format ".concat(Configuration$1.mainData.exportFormat));
|
||
ExportEngine$1.export(Configuration$1.mainData.output, Configuration$1.mainData).then(function () {
|
||
generationPromiseResolve(true);
|
||
_this.endCallback();
|
||
logger.logger.info('Documentation generated in ' +
|
||
Configuration$1.mainData.output +
|
||
' in ' +
|
||
_this.getElapsedTime() +
|
||
' seconds');
|
||
if (Configuration$1.mainData.serve) {
|
||
logger.logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(Configuration$1.mainData.port));
|
||
_this.runWebServer(Configuration$1.mainData.output);
|
||
}
|
||
});
|
||
}
|
||
else {
|
||
logger.logger.warn("Exported format not supported");
|
||
}
|
||
}
|
||
else {
|
||
_this.processGraphs();
|
||
_this.clearUpdatedFiles();
|
||
}
|
||
})
|
||
.catch(function (errorMessage) {
|
||
logger.logger.error(errorMessage);
|
||
});
|
||
};
|
||
Application.prototype.printStatistics = function () {
|
||
logger.logger.info('-------------------');
|
||
logger.logger.info('Project statistics ');
|
||
if (DependenciesEngine$1.modules.length > 0) {
|
||
logger.logger.info("- files : ".concat(this.files.length));
|
||
}
|
||
if (DependenciesEngine$1.modules.length > 0) {
|
||
logger.logger.info("- module : ".concat(DependenciesEngine$1.modules.length));
|
||
}
|
||
if (DependenciesEngine$1.components.length > 0) {
|
||
logger.logger.info("- component : ".concat(DependenciesEngine$1.components.length));
|
||
}
|
||
if (DependenciesEngine$1.controllers.length > 0) {
|
||
logger.logger.info("- controller : ".concat(DependenciesEngine$1.controllers.length));
|
||
}
|
||
if (DependenciesEngine$1.entities.length > 0) {
|
||
logger.logger.info("- entity : ".concat(DependenciesEngine$1.entities.length));
|
||
}
|
||
if (DependenciesEngine$1.directives.length > 0) {
|
||
logger.logger.info("- directive : ".concat(DependenciesEngine$1.directives.length));
|
||
}
|
||
if (DependenciesEngine$1.injectables.length > 0) {
|
||
logger.logger.info("- injectable : ".concat(DependenciesEngine$1.injectables.length));
|
||
}
|
||
if (DependenciesEngine$1.interceptors.length > 0) {
|
||
logger.logger.info("- injector : ".concat(DependenciesEngine$1.interceptors.length));
|
||
}
|
||
if (DependenciesEngine$1.guards.length > 0) {
|
||
logger.logger.info("- guard : ".concat(DependenciesEngine$1.guards.length));
|
||
}
|
||
if (DependenciesEngine$1.pipes.length > 0) {
|
||
logger.logger.info("- pipe : ".concat(DependenciesEngine$1.pipes.length));
|
||
}
|
||
if (DependenciesEngine$1.classes.length > 0) {
|
||
logger.logger.info("- class : ".concat(DependenciesEngine$1.classes.length));
|
||
}
|
||
if (DependenciesEngine$1.interfaces.length > 0) {
|
||
logger.logger.info("- interface : ".concat(DependenciesEngine$1.interfaces.length));
|
||
}
|
||
if (Configuration$1.mainData.routesLength > 0) {
|
||
logger.logger.info("- route : ".concat(Configuration$1.mainData.routesLength));
|
||
}
|
||
if (DependenciesEngine$1.miscellaneous.typealiases.length > 0) {
|
||
logger.logger.info("- type aliases : ".concat(DependenciesEngine$1.miscellaneous.typealiases.length));
|
||
}
|
||
logger.logger.info('-------------------');
|
||
};
|
||
Application.prototype.prepareEverything = function () {
|
||
var _this = this;
|
||
var actions = [];
|
||
actions.push(function () {
|
||
return _this.prepareComponents();
|
||
});
|
||
actions.push(function () {
|
||
return _this.prepareModules();
|
||
});
|
||
if (DependenciesEngine$1.directives.length > 0) {
|
||
actions.push(function () {
|
||
return _this.prepareDirectives();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.controllers.length > 0) {
|
||
actions.push(function () {
|
||
return _this.prepareControllers();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.entities.length > 0) {
|
||
actions.push(function () {
|
||
return _this.prepareEntities();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.injectables.length > 0) {
|
||
actions.push(function () {
|
||
return _this.prepareInjectables();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.interceptors.length > 0) {
|
||
actions.push(function () {
|
||
return _this.prepareInterceptors();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.guards.length > 0) {
|
||
actions.push(function () {
|
||
return _this.prepareGuards();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.routes &&
|
||
!Configuration$1.mainData.disableRoutesGraph) {
|
||
actions.push(function () {
|
||
return _this.prepareRoutes();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.pipes.length > 0) {
|
||
actions.push(function () {
|
||
return _this.preparePipes();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.classes.length > 0) {
|
||
actions.push(function () {
|
||
return _this.prepareClasses();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.interfaces.length > 0) {
|
||
actions.push(function () {
|
||
return _this.prepareInterfaces();
|
||
});
|
||
}
|
||
if (DependenciesEngine$1.miscellaneous.variables.length > 0 ||
|
||
DependenciesEngine$1.miscellaneous.functions.length > 0 ||
|
||
DependenciesEngine$1.miscellaneous.typealiases.length > 0 ||
|
||
DependenciesEngine$1.miscellaneous.enumerations.length > 0) {
|
||
actions.push(function () {
|
||
return _this.prepareMiscellaneous();
|
||
});
|
||
}
|
||
if (!Configuration$1.mainData.disableCoverage) {
|
||
actions.push(function () {
|
||
return _this.prepareCoverage();
|
||
});
|
||
}
|
||
if (Configuration$1.mainData.unitTestCoverage !== '') {
|
||
actions.push(function () {
|
||
return _this.prepareUnitTestCoverage();
|
||
});
|
||
}
|
||
if (Configuration$1.mainData.includes !== '') {
|
||
actions.push(function () {
|
||
return _this.prepareExternalIncludes();
|
||
});
|
||
}
|
||
promiseSequential(actions)
|
||
.then(function (res) {
|
||
if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
||
if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(Configuration$1.mainData.exportFormat) > -1) {
|
||
logger.logger.info("Generating documentation in export format ".concat(Configuration$1.mainData.exportFormat));
|
||
ExportEngine$1.export(Configuration$1.mainData.output, Configuration$1.mainData).then(function () {
|
||
generationPromiseResolve(true);
|
||
_this.endCallback();
|
||
logger.logger.info('Documentation generated in ' +
|
||
Configuration$1.mainData.output +
|
||
' in ' +
|
||
_this.getElapsedTime() +
|
||
' seconds');
|
||
if (Configuration$1.mainData.serve) {
|
||
logger.logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(Configuration$1.mainData.port));
|
||
_this.runWebServer(Configuration$1.mainData.output);
|
||
}
|
||
});
|
||
}
|
||
else {
|
||
logger.logger.warn("Exported format not supported");
|
||
}
|
||
}
|
||
else {
|
||
_this.processGraphs();
|
||
}
|
||
})
|
||
.catch(function (errorMessage) {
|
||
logger.logger.error(errorMessage);
|
||
process.exit(1);
|
||
});
|
||
};
|
||
Application.prototype.getIncludedPathForFile = function (file) {
|
||
return path__namespace.join(Configuration$1.mainData.includes, file);
|
||
};
|
||
Application.prototype.prepareExternalIncludes = function () {
|
||
var _this = this;
|
||
logger.logger.info('Adding external markdown files');
|
||
// Scan include folder for files detailed in summary.json
|
||
// For each file, add to Configuration.mainData.additionalPages
|
||
// Each file will be converted to html page, inside COMPODOC_DEFAULTS.additionalEntryPath
|
||
return new Promise(function (resolve, reject) {
|
||
FileEngine$1.get(_this.getIncludedPathForFile('summary.json')).then(function (summaryData) {
|
||
logger.logger.info('Additional documentation: summary.json file found');
|
||
var parsedSummaryData = JSON.parse(summaryData);
|
||
var that = _this;
|
||
var lastLevelOnePage = undefined;
|
||
traverse(parsedSummaryData).forEach(function () {
|
||
// tslint:disable-next-line:no-invalid-this
|
||
if (this.notRoot && typeof this.node === 'object') {
|
||
// tslint:disable-next-line:no-invalid-this
|
||
var rawPath = this.path;
|
||
// tslint:disable-next-line:no-invalid-this
|
||
var additionalNode = this.node;
|
||
var file = additionalNode.file;
|
||
var title = additionalNode.title;
|
||
var finalPath_1 = Configuration$1.mainData.includesFolder;
|
||
var finalDepth = rawPath.filter(function (el) {
|
||
return !isNaN(parseInt(el, 10));
|
||
});
|
||
if (typeof file !== 'undefined' && typeof title !== 'undefined') {
|
||
var url = cleanNameWithoutSpaceAndToLowerCase(title);
|
||
/**
|
||
* Id created with title + file path hash, seems to be hypothetically unique here
|
||
*/
|
||
var id = crypto
|
||
.createHash('sha512')
|
||
.update(title + file)
|
||
.digest('hex');
|
||
// tslint:disable-next-line:no-invalid-this
|
||
this.node.id = id;
|
||
var lastElementRootTree_1 = undefined;
|
||
finalDepth.forEach(function (el) {
|
||
var elementTree = typeof lastElementRootTree_1 === 'undefined'
|
||
? parsedSummaryData
|
||
: lastElementRootTree_1;
|
||
if (typeof elementTree.children !== 'undefined') {
|
||
elementTree = elementTree.children[el];
|
||
}
|
||
else {
|
||
elementTree = elementTree[el];
|
||
}
|
||
finalPath_1 +=
|
||
'/' +
|
||
cleanNameWithoutSpaceAndToLowerCase(elementTree.title);
|
||
lastElementRootTree_1 = elementTree;
|
||
});
|
||
finalPath_1 = finalPath_1.replace('/' + url, '');
|
||
var markdownFile = MarkdownEngine$1.getTraditionalMarkdownSync(that.getIncludedPathForFile(file));
|
||
if (finalDepth.length > 5) {
|
||
logger.logger.error('Only 5 levels of depth are supported');
|
||
}
|
||
else {
|
||
var _page = {
|
||
name: title,
|
||
id: id,
|
||
filename: url,
|
||
context: 'additional-page',
|
||
path: finalPath_1,
|
||
additionalPage: markdownFile,
|
||
depth: finalDepth.length,
|
||
childrenLength: additionalNode.children
|
||
? additionalNode.children.length
|
||
: 0,
|
||
children: [],
|
||
lastChild: false,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (finalDepth.length === 1) {
|
||
lastLevelOnePage = _page;
|
||
}
|
||
if (finalDepth.length > 1) {
|
||
// store all child pages of the last root level 1 page inside it
|
||
lastLevelOnePage.children.push(_page);
|
||
}
|
||
else {
|
||
Configuration$1.addAdditionalPage(_page);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|
||
resolve(true);
|
||
}, function (errorMessage) {
|
||
logger.logger.error(errorMessage);
|
||
reject('Error during Additional documentation generation');
|
||
});
|
||
});
|
||
};
|
||
Application.prototype.prepareModules = function (someModules) {
|
||
var _this = this;
|
||
logger.logger.info('Prepare modules');
|
||
var i = 0;
|
||
var _modules = someModules ? someModules : DependenciesEngine$1.getModules();
|
||
return new Promise(function (resolve, reject) {
|
||
Configuration$1.mainData.modules = _modules.map(function (ngModule) {
|
||
ngModule.compodocLinks = {
|
||
components: [],
|
||
controllers: [],
|
||
directives: [],
|
||
injectables: [],
|
||
pipes: []
|
||
};
|
||
['declarations', 'bootstrap', 'imports', 'exports', 'controllers'].forEach(function (metadataType) {
|
||
ngModule[metadataType] = ngModule[metadataType].filter(function (metaDataItem) {
|
||
switch (metaDataItem.type) {
|
||
case 'directive':
|
||
return DependenciesEngine$1.getDirectives().some(function (directive) {
|
||
var selectedDirective;
|
||
if (typeof metaDataItem.id !== 'undefined') {
|
||
selectedDirective =
|
||
directive.id === metaDataItem.id;
|
||
}
|
||
else {
|
||
selectedDirective =
|
||
directive.name === metaDataItem.name;
|
||
}
|
||
if (selectedDirective &&
|
||
!ngModule.compodocLinks.directives.includes(directive)) {
|
||
ngModule.compodocLinks.directives.push(directive);
|
||
}
|
||
return selectedDirective;
|
||
});
|
||
case 'component':
|
||
return DependenciesEngine$1.getComponents().some(function (component) {
|
||
var selectedComponent;
|
||
if (typeof metaDataItem.id !== 'undefined') {
|
||
selectedComponent =
|
||
component.id === metaDataItem.id;
|
||
}
|
||
else {
|
||
selectedComponent =
|
||
component.name === metaDataItem.name;
|
||
}
|
||
if (selectedComponent &&
|
||
!ngModule.compodocLinks.components.includes(component)) {
|
||
if (!component.standalone) {
|
||
ngModule.compodocLinks.components.push(component);
|
||
}
|
||
}
|
||
return selectedComponent;
|
||
});
|
||
case 'controller':
|
||
return DependenciesEngine$1.getControllers().some(function (controller) {
|
||
var selectedController;
|
||
if (typeof metaDataItem.id !== 'undefined') {
|
||
selectedController =
|
||
controller.id === metaDataItem.id;
|
||
}
|
||
else {
|
||
selectedController =
|
||
controller.name === metaDataItem.name;
|
||
}
|
||
if (selectedController &&
|
||
!ngModule.compodocLinks.controllers.includes(controller)) {
|
||
ngModule.compodocLinks.controllers.push(controller);
|
||
}
|
||
return selectedController;
|
||
});
|
||
case 'module':
|
||
return DependenciesEngine$1.getModules().some(function (module) { return module.name === metaDataItem.name; });
|
||
case 'pipe':
|
||
return DependenciesEngine$1.getPipes().some(function (pipe) {
|
||
var selectedPipe;
|
||
if (typeof metaDataItem.id !== 'undefined') {
|
||
selectedPipe = pipe.id === metaDataItem.id;
|
||
}
|
||
else {
|
||
selectedPipe = pipe.name === metaDataItem.name;
|
||
}
|
||
if (selectedPipe &&
|
||
!ngModule.compodocLinks.pipes.includes(pipe)) {
|
||
ngModule.compodocLinks.pipes.push(pipe);
|
||
}
|
||
return selectedPipe;
|
||
});
|
||
default:
|
||
return true;
|
||
}
|
||
});
|
||
});
|
||
ngModule.providers = ngModule.providers.filter(function (provider) {
|
||
return (DependenciesEngine$1.getInjectables().some(function (injectable) {
|
||
var selectedInjectable = injectable.name === provider.name;
|
||
if (selectedInjectable &&
|
||
!ngModule.compodocLinks.injectables.includes(injectable)) {
|
||
ngModule.compodocLinks.injectables.push(injectable);
|
||
}
|
||
return selectedInjectable;
|
||
}) ||
|
||
DependenciesEngine$1.getInterceptors().some(function (interceptor) { return interceptor.name === provider.name; }));
|
||
});
|
||
// Try fixing type undefined for each providers
|
||
___namespace.forEach(ngModule.providers, function (provider) {
|
||
if (DependenciesEngine$1.getInjectables().find(function (injectable) { return injectable.name === provider.name; })) {
|
||
provider.type = 'injectable';
|
||
}
|
||
if (DependenciesEngine$1.getInterceptors().find(function (interceptor) { return interceptor.name === provider.name; })) {
|
||
provider.type = 'interceptor';
|
||
}
|
||
});
|
||
// Order things
|
||
ngModule.compodocLinks.components = ___namespace.sortBy(ngModule.compodocLinks.components, [
|
||
'name'
|
||
]);
|
||
ngModule.compodocLinks.controllers = ___namespace.sortBy(ngModule.compodocLinks.controllers, [
|
||
'name'
|
||
]);
|
||
ngModule.compodocLinks.directives = ___namespace.sortBy(ngModule.compodocLinks.directives, [
|
||
'name'
|
||
]);
|
||
ngModule.compodocLinks.injectables = ___namespace.sortBy(ngModule.compodocLinks.injectables, [
|
||
'name'
|
||
]);
|
||
ngModule.compodocLinks.pipes = ___namespace.sortBy(ngModule.compodocLinks.pipes, ['name']);
|
||
ngModule.declarations = ___namespace.sortBy(ngModule.declarations, ['name']);
|
||
ngModule.entryComponents = ___namespace.sortBy(ngModule.entryComponents, ['name']);
|
||
ngModule.providers = ___namespace.sortBy(ngModule.providers, ['name']);
|
||
ngModule.imports = ___namespace.sortBy(ngModule.imports, ['name']);
|
||
ngModule.exports = ___namespace.sortBy(ngModule.exports, ['name']);
|
||
return ngModule;
|
||
});
|
||
Configuration$1.addPage({
|
||
name: 'modules',
|
||
id: 'modules',
|
||
context: 'modules',
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
var len = Configuration$1.mainData.modules.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
if (MarkdownEngine$1.hasNeighbourReadmeFile(Configuration$1.mainData.modules[i].file)) {
|
||
logger.logger.info(" ".concat(Configuration$1.mainData.modules[i].name, " has a README file, include it"));
|
||
var readme = MarkdownEngine$1.readNeighbourReadmeFile(Configuration$1.mainData.modules[i].file);
|
||
Configuration$1.mainData.modules[i].readme = markedAcl(readme);
|
||
}
|
||
Configuration$1.addPage({
|
||
path: 'modules',
|
||
name: Configuration$1.mainData.modules[i].name,
|
||
id: Configuration$1.mainData.modules[i].id,
|
||
navTabs: _this.getNavTabs(Configuration$1.mainData.modules[i]),
|
||
context: 'module',
|
||
module: Configuration$1.mainData.modules[i],
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
});
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve(true);
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.prepareInterfaces = function (someInterfaces) {
|
||
var _this = this;
|
||
logger.logger.info('Prepare interfaces');
|
||
Configuration$1.mainData.interfaces = someInterfaces
|
||
? someInterfaces
|
||
: DependenciesEngine$1.getInterfaces();
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.interfaces.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
var interf = Configuration$1.mainData.interfaces[i];
|
||
if (MarkdownEngine$1.hasNeighbourReadmeFile(interf.file)) {
|
||
logger.logger.info(" ".concat(interf.name, " has a README file, include it"));
|
||
var readme = MarkdownEngine$1.readNeighbourReadmeFile(interf.file);
|
||
interf.readme = markedAcl(readme);
|
||
}
|
||
var page = {
|
||
path: 'interfaces',
|
||
name: interf.name,
|
||
id: interf.id,
|
||
navTabs: _this.getNavTabs(interf),
|
||
context: 'interface',
|
||
interface: interf,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (interf.isDuplicate) {
|
||
page.name += '-' + interf.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve(true);
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.prepareMiscellaneous = function (someMisc) {
|
||
logger.logger.info('Prepare miscellaneous');
|
||
Configuration$1.mainData.miscellaneous = someMisc
|
||
? someMisc
|
||
: DependenciesEngine$1.getMiscellaneous();
|
||
return new Promise(function (resolve, reject) {
|
||
if (Configuration$1.mainData.miscellaneous.functions.length > 0) {
|
||
Configuration$1.addPage({
|
||
path: 'miscellaneous',
|
||
name: 'functions',
|
||
id: 'miscellaneous-functions',
|
||
context: 'miscellaneous-functions',
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
});
|
||
}
|
||
if (Configuration$1.mainData.miscellaneous.variables.length > 0) {
|
||
Configuration$1.addPage({
|
||
path: 'miscellaneous',
|
||
name: 'variables',
|
||
id: 'miscellaneous-variables',
|
||
context: 'miscellaneous-variables',
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
});
|
||
}
|
||
if (Configuration$1.mainData.miscellaneous.typealiases.length > 0) {
|
||
Configuration$1.addPage({
|
||
path: 'miscellaneous',
|
||
name: 'typealiases',
|
||
id: 'miscellaneous-typealiases',
|
||
context: 'miscellaneous-typealiases',
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
});
|
||
}
|
||
if (Configuration$1.mainData.miscellaneous.enumerations.length > 0) {
|
||
Configuration$1.addPage({
|
||
path: 'miscellaneous',
|
||
name: 'enumerations',
|
||
id: 'miscellaneous-enumerations',
|
||
context: 'miscellaneous-enumerations',
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
});
|
||
}
|
||
resolve(true);
|
||
});
|
||
};
|
||
Application.prototype.handleTemplateurl = function (component) {
|
||
var dirname = path__namespace.dirname(component.file);
|
||
var templatePath = path__namespace.resolve(dirname + path__namespace.sep + component.templateUrl);
|
||
if (!FileEngine$1.existsSync(templatePath)) {
|
||
var err = "Cannot read template for ".concat(component.name);
|
||
logger.logger.error(err);
|
||
return new Promise(function (resolve, reject) { });
|
||
}
|
||
return FileEngine$1.get(templatePath).then(function (data) { return (component.templateData = data); }, function (err) {
|
||
logger.logger.error(err);
|
||
return Promise.reject('');
|
||
});
|
||
};
|
||
Application.prototype.handleStyles = function (component) {
|
||
var styles = component.styles;
|
||
component.stylesData = '';
|
||
return new Promise(function (resolveStyles, rejectStyles) {
|
||
styles.forEach(function (style) {
|
||
component.stylesData = component.stylesData + style + '\n';
|
||
});
|
||
resolveStyles(true);
|
||
});
|
||
};
|
||
Application.prototype.handleStyleurls = function (component) {
|
||
var dirname = path__namespace.dirname(component.file);
|
||
var styleDataPromise = component.styleUrls.map(function (styleUrl) {
|
||
var stylePath = path__namespace.resolve(dirname + path__namespace.sep + styleUrl);
|
||
if (!FileEngine$1.existsSync(stylePath)) {
|
||
var err = "Cannot read style url ".concat(stylePath, " for ").concat(component.name);
|
||
logger.logger.error(err);
|
||
return Promise.resolve(null);
|
||
}
|
||
return new Promise(function (resolve, reject) {
|
||
FileEngine$1.get(stylePath).then(function (data) {
|
||
resolve({
|
||
data: data,
|
||
styleUrl: styleUrl
|
||
});
|
||
});
|
||
});
|
||
});
|
||
return Promise.all(styleDataPromise).then(function (data) { return (component.styleUrlsData = data.filter(function (item) { return item !== null; })); }, function (err) {
|
||
logger.logger.error(err);
|
||
return Promise.reject('');
|
||
});
|
||
};
|
||
Application.prototype.getNavTabs = function (dependency) {
|
||
var navTabConfig = Configuration$1.mainData.navTabConfig;
|
||
var hasCustomNavTabConfig = navTabConfig.length !== 0;
|
||
navTabConfig =
|
||
navTabConfig.length === 0
|
||
? ___namespace.cloneDeep(COMPODOC_CONSTANTS.navTabDefinitions)
|
||
: navTabConfig;
|
||
var matchDepType = function (depType) {
|
||
return depType === 'all' || depType === dependency.type;
|
||
};
|
||
var navTabs = [];
|
||
___namespace.forEach(navTabConfig, function (customTab) {
|
||
var navTab = ___namespace.find(COMPODOC_CONSTANTS.navTabDefinitions, { id: customTab.id });
|
||
if (!navTab) {
|
||
throw new Error("Invalid tab ID '".concat(customTab.id, "' specified in tab configuration"));
|
||
}
|
||
navTab.label = customTab.label;
|
||
if (hasCustomNavTabConfig) {
|
||
navTab.custom = true;
|
||
}
|
||
// is tab applicable to target dependency?
|
||
if (-1 === ___namespace.findIndex(navTab.depTypes, matchDepType)) {
|
||
return;
|
||
}
|
||
// global config
|
||
if (customTab.id === 'tree' && Configuration$1.mainData.disableDomTree) {
|
||
return;
|
||
}
|
||
if (customTab.id === 'source' && Configuration$1.mainData.disableSourceCode) {
|
||
return;
|
||
}
|
||
if (customTab.id === 'templateData' && Configuration$1.mainData.disableTemplateTab) {
|
||
return;
|
||
}
|
||
if (customTab.id === 'styleData' && Configuration$1.mainData.disableStyleTab) {
|
||
return;
|
||
}
|
||
// per dependency config
|
||
if (customTab.id === 'readme' && !dependency.readme) {
|
||
return;
|
||
}
|
||
if (customTab.id === 'example' && !dependency.exampleUrls) {
|
||
return;
|
||
}
|
||
if (customTab.id === 'templateData' &&
|
||
(!dependency.templateUrl || dependency.templateUrl.length === 0)) {
|
||
return;
|
||
}
|
||
if (customTab.id === 'styleData' &&
|
||
(!dependency.styleUrls || dependency.styleUrls.length === 0) &&
|
||
(!dependency.styles || dependency.styles.length === 0)) {
|
||
return;
|
||
}
|
||
navTabs.push(navTab);
|
||
});
|
||
if (navTabs.length === 0) {
|
||
throw new Error("No valid navigation tabs have been defined for dependency type '".concat(dependency.type, "'. Specify at least one config for the 'info' or 'source' tab in --navTabConfig."));
|
||
}
|
||
return navTabs;
|
||
};
|
||
Application.prototype.prepareControllers = function (someControllers) {
|
||
var _this = this;
|
||
logger.logger.info('Prepare controllers');
|
||
Configuration$1.mainData.controllers = someControllers
|
||
? someControllers
|
||
: DependenciesEngine$1.getControllers();
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.controllers.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
var controller = Configuration$1.mainData.controllers[i];
|
||
var page = {
|
||
path: 'controllers',
|
||
name: controller.name,
|
||
id: controller.id,
|
||
navTabs: _this.getNavTabs(controller),
|
||
context: 'controller',
|
||
controller: controller,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (controller.isDuplicate) {
|
||
page.name += '-' + controller.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve(true);
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.prepareEntities = function (someEntities) {
|
||
var _this = this;
|
||
logger.logger.info('Prepare entities');
|
||
Configuration$1.mainData.entities = someEntities
|
||
? someEntities
|
||
: DependenciesEngine$1.getEntities();
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.entities.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
var entity = Configuration$1.mainData.entities[i];
|
||
var page = {
|
||
path: 'entities',
|
||
name: entity.name,
|
||
id: entity.id,
|
||
navTabs: _this.getNavTabs(entity),
|
||
context: 'entity',
|
||
entity: entity,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (entity.isDuplicate) {
|
||
page.name += '-' + entity.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve(true);
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.prepareComponents = function (someComponents) {
|
||
var _this = this;
|
||
logger.logger.info('Prepare components');
|
||
Configuration$1.mainData.components = someComponents
|
||
? someComponents
|
||
: DependenciesEngine$1.getComponents();
|
||
return new Promise(function (mainPrepareComponentResolve, mainPrepareComponentReject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.components.length;
|
||
var loop = function () {
|
||
if (i <= len - 1) {
|
||
var component_1 = Configuration$1.mainData.components[i];
|
||
if (MarkdownEngine$1.hasNeighbourReadmeFile(component_1.file)) {
|
||
logger.logger.info(" ".concat(component_1.name, " has a README file, include it"));
|
||
var readmeFile = MarkdownEngine$1.readNeighbourReadmeFile(component_1.file);
|
||
component_1.readme = markedAcl(readmeFile);
|
||
}
|
||
var page = {
|
||
path: 'components',
|
||
name: component_1.name,
|
||
id: component_1.id,
|
||
navTabs: _this.getNavTabs(component_1),
|
||
context: 'component',
|
||
component: component_1,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (component_1.isDuplicate) {
|
||
page.name += '-' + component_1.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
var componentTemplateUrlPromise = new Promise(function (componentTemplateUrlResolve, componentTemplateUrlReject) {
|
||
if (component_1.templateUrl.length > 0) {
|
||
logger.logger.info(" ".concat(component_1.name, " has a templateUrl, include it"));
|
||
_this.handleTemplateurl(component_1).then(function () {
|
||
componentTemplateUrlResolve(true);
|
||
}, function (e) {
|
||
logger.logger.error(e);
|
||
componentTemplateUrlReject();
|
||
});
|
||
}
|
||
else {
|
||
componentTemplateUrlResolve(true);
|
||
}
|
||
});
|
||
var componentStyleUrlsPromise = new Promise(function (componentStyleUrlsResolve, componentStyleUrlsReject) {
|
||
if (component_1.styleUrls.length > 0) {
|
||
logger.logger.info(" ".concat(component_1.name, " has styleUrls, include them"));
|
||
_this.handleStyleurls(component_1).then(function () {
|
||
componentStyleUrlsResolve(true);
|
||
}, function (e) {
|
||
logger.logger.error(e);
|
||
componentStyleUrlsReject();
|
||
});
|
||
}
|
||
else {
|
||
componentStyleUrlsResolve(true);
|
||
}
|
||
});
|
||
var componentStylesPromise = new Promise(function (componentStylesResolve, componentStylesReject) {
|
||
if (component_1.styles.length > 0) {
|
||
logger.logger.info(" ".concat(component_1.name, " has styles, include them"));
|
||
_this.handleStyles(component_1).then(function () {
|
||
componentStylesResolve(true);
|
||
}, function (e) {
|
||
logger.logger.error(e);
|
||
componentStylesReject();
|
||
});
|
||
}
|
||
else {
|
||
componentStylesResolve(true);
|
||
}
|
||
});
|
||
Promise.all([
|
||
componentTemplateUrlPromise,
|
||
componentStyleUrlsPromise,
|
||
componentStylesPromise
|
||
]).then(function () {
|
||
i++;
|
||
loop();
|
||
});
|
||
}
|
||
else {
|
||
mainPrepareComponentResolve(true);
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.prepareDirectives = function (someDirectives) {
|
||
var _this = this;
|
||
logger.logger.info('Prepare directives');
|
||
Configuration$1.mainData.directives = someDirectives
|
||
? someDirectives
|
||
: DependenciesEngine$1.getDirectives();
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.directives.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
var directive = Configuration$1.mainData.directives[i];
|
||
if (MarkdownEngine$1.hasNeighbourReadmeFile(directive.file)) {
|
||
logger.logger.info(" ".concat(directive.name, " has a README file, include it"));
|
||
var readme = MarkdownEngine$1.readNeighbourReadmeFile(directive.file);
|
||
directive.readme = markedAcl(readme);
|
||
}
|
||
var page = {
|
||
path: 'directives',
|
||
name: directive.name,
|
||
id: directive.id,
|
||
navTabs: _this.getNavTabs(directive),
|
||
context: 'directive',
|
||
directive: directive,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (directive.isDuplicate) {
|
||
page.name += '-' + directive.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve(true);
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.prepareInjectables = function (someInjectables) {
|
||
var _this = this;
|
||
logger.logger.info('Prepare injectables');
|
||
Configuration$1.mainData.injectables = someInjectables
|
||
? someInjectables
|
||
: DependenciesEngine$1.getInjectables();
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.injectables.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
var injec = Configuration$1.mainData.injectables[i];
|
||
if (MarkdownEngine$1.hasNeighbourReadmeFile(injec.file)) {
|
||
logger.logger.info(" ".concat(injec.name, " has a README file, include it"));
|
||
var readme = MarkdownEngine$1.readNeighbourReadmeFile(injec.file);
|
||
injec.readme = markedAcl(readme);
|
||
}
|
||
var page = {
|
||
path: 'injectables',
|
||
name: injec.name,
|
||
id: injec.id,
|
||
navTabs: _this.getNavTabs(injec),
|
||
context: 'injectable',
|
||
injectable: injec,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (injec.isDuplicate) {
|
||
page.name += '-' + injec.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve();
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.prepareInterceptors = function (someInterceptors) {
|
||
var _this = this;
|
||
logger.logger.info('Prepare interceptors');
|
||
Configuration$1.mainData.interceptors = someInterceptors
|
||
? someInterceptors
|
||
: DependenciesEngine$1.getInterceptors();
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.interceptors.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
var interceptor = Configuration$1.mainData.interceptors[i];
|
||
if (MarkdownEngine$1.hasNeighbourReadmeFile(interceptor.file)) {
|
||
logger.logger.info(" ".concat(interceptor.name, " has a README file, include it"));
|
||
var readme = MarkdownEngine$1.readNeighbourReadmeFile(interceptor.file);
|
||
interceptor.readme = markedAcl(readme);
|
||
}
|
||
var page = {
|
||
path: 'interceptors',
|
||
name: interceptor.name,
|
||
id: interceptor.id,
|
||
navTabs: _this.getNavTabs(interceptor),
|
||
context: 'interceptor',
|
||
injectable: interceptor,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (interceptor.isDuplicate) {
|
||
page.name += '-' + interceptor.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve();
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.prepareGuards = function (someGuards) {
|
||
var _this = this;
|
||
logger.logger.info('Prepare guards');
|
||
Configuration$1.mainData.guards = someGuards ? someGuards : DependenciesEngine$1.getGuards();
|
||
return new Promise(function (resolve, reject) {
|
||
var i = 0;
|
||
var len = Configuration$1.mainData.guards.length;
|
||
var loop = function () {
|
||
if (i < len) {
|
||
var guard = Configuration$1.mainData.guards[i];
|
||
if (MarkdownEngine$1.hasNeighbourReadmeFile(guard.file)) {
|
||
logger.logger.info(" ".concat(guard.name, " has a README file, include it"));
|
||
var readme = MarkdownEngine$1.readNeighbourReadmeFile(guard.file);
|
||
guard.readme = markedAcl(readme);
|
||
}
|
||
var page = {
|
||
path: 'guards',
|
||
name: guard.name,
|
||
id: guard.id,
|
||
navTabs: _this.getNavTabs(guard),
|
||
context: 'guard',
|
||
injectable: guard,
|
||
depth: 1,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
|
||
};
|
||
if (guard.isDuplicate) {
|
||
page.name += '-' + guard.duplicateId;
|
||
}
|
||
Configuration$1.addPage(page);
|
||
i++;
|
||
loop();
|
||
}
|
||
else {
|
||
resolve();
|
||
}
|
||
};
|
||
loop();
|
||
});
|
||
};
|
||
Application.prototype.prepareRoutes = function () {
|
||
logger.logger.info('Process routes');
|
||
Configuration$1.mainData.routes = DependenciesEngine$1.getRoutes();
|
||
return new Promise(function (resolve, reject) {
|
||
Configuration$1.addPage({
|
||
name: 'routes',
|
||
id: 'routes',
|
||
context: 'routes',
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
|
||
RouterParserUtil$1.generateRoutesIndex(Configuration$1.mainData.output, Configuration$1.mainData.routes).then(function () {
|
||
logger.logger.info(' Routes index generated');
|
||
resolve();
|
||
}, function (e) {
|
||
logger.logger.error(e);
|
||
reject();
|
||
});
|
||
}
|
||
else {
|
||
resolve();
|
||
}
|
||
});
|
||
};
|
||
Application.prototype.prepareCoverage = function () {
|
||
logger.logger.info('Process documentation coverage report');
|
||
return new Promise(function (resolve, reject) {
|
||
/*
|
||
* loop with components, directives, controllers, entities, classes, injectables, interfaces, pipes, guards, misc functions variables
|
||
*/
|
||
var files = [];
|
||
var totalProjectStatementDocumented = 0;
|
||
var getStatus = function (percent) {
|
||
var status;
|
||
if (percent <= 25) {
|
||
status = 'low';
|
||
}
|
||
else if (percent > 25 && percent <= 50) {
|
||
status = 'medium';
|
||
}
|
||
else if (percent > 50 && percent <= 75) {
|
||
status = 'good';
|
||
}
|
||
else {
|
||
status = 'very-good';
|
||
}
|
||
return status;
|
||
};
|
||
var processComponentsAndDirectivesAndControllersAndEntities = function (list) {
|
||
___namespace.forEach(list, function (el) {
|
||
var element = Object.assign({}, el);
|
||
if (!element.propertiesClass) {
|
||
element.propertiesClass = [];
|
||
}
|
||
if (!element.methodsClass) {
|
||
element.methodsClass = [];
|
||
}
|
||
if (!element.hostBindings) {
|
||
element.hostBindings = [];
|
||
}
|
||
if (!element.hostListeners) {
|
||
element.hostListeners = [];
|
||
}
|
||
if (!element.inputsClass) {
|
||
element.inputsClass = [];
|
||
}
|
||
if (!element.outputsClass) {
|
||
element.outputsClass = [];
|
||
}
|
||
var cl = {
|
||
filePath: element.file,
|
||
type: element.type,
|
||
linktype: element.type,
|
||
name: element.name
|
||
};
|
||
var totalStatementDocumented = 0;
|
||
var totalStatements = element.propertiesClass.length +
|
||
element.methodsClass.length +
|
||
element.inputsClass.length +
|
||
element.hostBindings.length +
|
||
element.hostListeners.length +
|
||
element.outputsClass.length +
|
||
1; // +1 for element decorator comment
|
||
if (element.constructorObj) {
|
||
totalStatements += 1;
|
||
if (element.constructorObj &&
|
||
element.constructorObj.description &&
|
||
element.constructorObj.description !== '') {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
}
|
||
if (element.description && element.description !== '') {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
___namespace.forEach(element.propertiesClass, function (property) {
|
||
if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
||
// Doesn't handle private for coverage
|
||
totalStatements -= 1;
|
||
}
|
||
if (property.description &&
|
||
property.description !== '' &&
|
||
property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
});
|
||
___namespace.forEach(element.methodsClass, function (method) {
|
||
if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
||
// Doesn't handle private for coverage
|
||
totalStatements -= 1;
|
||
}
|
||
if (method.description &&
|
||
method.description !== '' &&
|
||
method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
});
|
||
___namespace.forEach(element.hostBindings, function (property) {
|
||
if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
||
// Doesn't handle private for coverage
|
||
totalStatements -= 1;
|
||
}
|
||
if (property.description &&
|
||
property.description !== '' &&
|
||
property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
});
|
||
___namespace.forEach(element.hostListeners, function (method) {
|
||
if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
||
// Doesn't handle private for coverage
|
||
totalStatements -= 1;
|
||
}
|
||
if (method.description &&
|
||
method.description !== '' &&
|
||
method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
});
|
||
___namespace.forEach(element.inputsClass, function (input) {
|
||
if (input.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
||
// Doesn't handle private for coverage
|
||
totalStatements -= 1;
|
||
}
|
||
if (input.description &&
|
||
input.description !== '' &&
|
||
input.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
});
|
||
___namespace.forEach(element.outputsClass, function (output) {
|
||
if (output.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
||
// Doesn't handle private for coverage
|
||
totalStatements -= 1;
|
||
}
|
||
if (output.description &&
|
||
output.description !== '' &&
|
||
output.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
});
|
||
cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
|
||
if (totalStatements === 0) {
|
||
cl.coveragePercent = 0;
|
||
}
|
||
cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
||
cl.status = getStatus(cl.coveragePercent);
|
||
totalProjectStatementDocumented += cl.coveragePercent;
|
||
files.push(cl);
|
||
});
|
||
};
|
||
var processCoveragePerFile = function () {
|
||
logger.logger.info('Process documentation coverage per file');
|
||
logger.logger.info('-------------------');
|
||
var overFiles = files.filter(function (f) {
|
||
var overTest = f.coveragePercent >= Configuration$1.mainData.coverageMinimumPerFile;
|
||
if (overTest && !Configuration$1.mainData.coverageTestShowOnlyFailed) {
|
||
logger.logger.info("".concat(f.coveragePercent, " % for file ").concat(f.filePath, " - ").concat(f.name, " - over minimum per file"));
|
||
}
|
||
return overTest;
|
||
});
|
||
var underFiles = files.filter(function (f) {
|
||
var underTest = f.coveragePercent < Configuration$1.mainData.coverageMinimumPerFile;
|
||
if (underTest) {
|
||
logger.logger.error("".concat(f.coveragePercent, " % for file ").concat(f.filePath, " - ").concat(f.name, " - under minimum per file"));
|
||
}
|
||
return underTest;
|
||
});
|
||
logger.logger.info('-------------------');
|
||
return {
|
||
overFiles: overFiles,
|
||
underFiles: underFiles
|
||
};
|
||
};
|
||
var processFunctionsAndVariables = function (id, type) {
|
||
___namespace.forEach(id, function (el) {
|
||
var cl = {
|
||
filePath: el.file,
|
||
type: type,
|
||
linktype: el.type,
|
||
linksubtype: el.subtype,
|
||
name: el.name
|
||
};
|
||
if (type === 'variable' || type === 'function' || type === 'type alias') {
|
||
cl.linktype = 'miscellaneous';
|
||
}
|
||
var totalStatementDocumented = 0;
|
||
var totalStatements = 1;
|
||
if (el.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
||
// Doesn't handle private for coverage
|
||
totalStatements -= 1;
|
||
}
|
||
if (el.description &&
|
||
el.description !== '' &&
|
||
el.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
|
||
cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
||
cl.status = getStatus(cl.coveragePercent);
|
||
totalProjectStatementDocumented += cl.coveragePercent;
|
||
files.push(cl);
|
||
});
|
||
};
|
||
var processClasses = function (list, type, linktype) {
|
||
___namespace.forEach(list, function (cl) {
|
||
var element = Object.assign({}, cl);
|
||
if (!element.properties) {
|
||
element.properties = [];
|
||
}
|
||
if (!element.methods) {
|
||
element.methods = [];
|
||
}
|
||
var cla = {
|
||
filePath: element.file,
|
||
type: type,
|
||
linktype: linktype,
|
||
name: element.name
|
||
};
|
||
var totalStatementDocumented = 0;
|
||
var totalStatements = element.properties.length + element.methods.length + 1; // +1 for element itself
|
||
if (element.constructorObj) {
|
||
totalStatements += 1;
|
||
if (element.constructorObj &&
|
||
element.constructorObj.description &&
|
||
element.constructorObj.description !== '') {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
}
|
||
if (element.description && element.description !== '') {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
___namespace.forEach(element.properties, function (property) {
|
||
if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
||
// Doesn't handle private for coverage
|
||
totalStatements -= 1;
|
||
}
|
||
if (property.description &&
|
||
property.description !== '' &&
|
||
property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
});
|
||
___namespace.forEach(element.methods, function (method) {
|
||
if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
|
||
// Doesn't handle private for coverage
|
||
totalStatements -= 1;
|
||
}
|
||
if (method.description &&
|
||
method.description !== '' &&
|
||
method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
});
|
||
cla.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
|
||
if (totalStatements === 0) {
|
||
cla.coveragePercent = 0;
|
||
}
|
||
cla.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
||
cla.status = getStatus(cla.coveragePercent);
|
||
totalProjectStatementDocumented += cla.coveragePercent;
|
||
files.push(cla);
|
||
});
|
||
};
|
||
processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.components);
|
||
processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.directives);
|
||
processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.controllers);
|
||
processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.entities);
|
||
processClasses(Configuration$1.mainData.classes, 'class', 'classe');
|
||
processClasses(Configuration$1.mainData.injectables, 'injectable', 'injectable');
|
||
processClasses(Configuration$1.mainData.interfaces, 'interface', 'interface');
|
||
processClasses(Configuration$1.mainData.guards, 'guard', 'guard');
|
||
processClasses(Configuration$1.mainData.interceptors, 'interceptor', 'interceptor');
|
||
___namespace.forEach(Configuration$1.mainData.pipes, function (pipe) {
|
||
var cl = {
|
||
filePath: pipe.file,
|
||
type: pipe.type,
|
||
linktype: pipe.type,
|
||
name: pipe.name
|
||
};
|
||
var totalStatementDocumented = 0;
|
||
var totalStatements = 1;
|
||
if (pipe.description && pipe.description !== '') {
|
||
totalStatementDocumented += 1;
|
||
}
|
||
cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
|
||
cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
|
||
cl.status = getStatus(cl.coveragePercent);
|
||
totalProjectStatementDocumented += cl.coveragePercent;
|
||
files.push(cl);
|
||
});
|
||
processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.functions, 'function');
|
||
processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.variables, 'variable');
|
||
processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.typealiases, 'type alias');
|
||
files = ___namespace.sortBy(files, ['filePath']);
|
||
var coverageData = {
|
||
count: files.length > 0
|
||
? Math.floor(totalProjectStatementDocumented / files.length)
|
||
: 0,
|
||
status: '',
|
||
files: files
|
||
};
|
||
coverageData.status = getStatus(coverageData.count);
|
||
Configuration$1.addPage({
|
||
name: 'coverage',
|
||
id: 'coverage',
|
||
context: 'coverage',
|
||
files: files,
|
||
data: coverageData,
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
coverageData.files = files;
|
||
Configuration$1.mainData.coverageData = coverageData;
|
||
if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
|
||
HtmlEngine$1.generateCoverageBadge(Configuration$1.mainData.output, 'documentation', coverageData);
|
||
}
|
||
files = ___namespace.sortBy(files, ['coveragePercent']);
|
||
var coverageTestPerFileResults;
|
||
if (Configuration$1.mainData.coverageTest &&
|
||
!Configuration$1.mainData.coverageTestPerFile) {
|
||
// Global coverage test and not per file
|
||
if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold) {
|
||
logger.logger.info("Documentation coverage (".concat(coverageData.count, "%) is over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"));
|
||
generationPromiseResolve(true);
|
||
process.exit(0);
|
||
}
|
||
else {
|
||
var message = "Documentation coverage (".concat(coverageData.count, "%) is not over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)");
|
||
generationPromiseReject();
|
||
if (Configuration$1.mainData.coverageTestThresholdFail) {
|
||
logger.logger.error(message);
|
||
process.exit(1);
|
||
}
|
||
else {
|
||
logger.logger.warn(message);
|
||
process.exit(0);
|
||
}
|
||
}
|
||
}
|
||
else if (!Configuration$1.mainData.coverageTest &&
|
||
Configuration$1.mainData.coverageTestPerFile) {
|
||
coverageTestPerFileResults = processCoveragePerFile();
|
||
// Per file coverage test and not global
|
||
if (coverageTestPerFileResults.underFiles.length > 0) {
|
||
var message = "Documentation coverage per file is not over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
|
||
generationPromiseReject();
|
||
if (Configuration$1.mainData.coverageTestThresholdFail) {
|
||
logger.logger.error(message);
|
||
process.exit(1);
|
||
}
|
||
else {
|
||
logger.logger.warn(message);
|
||
process.exit(0);
|
||
}
|
||
}
|
||
else {
|
||
logger.logger.info("Documentation coverage per file is over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)"));
|
||
generationPromiseResolve(true);
|
||
process.exit(0);
|
||
}
|
||
}
|
||
else if (Configuration$1.mainData.coverageTest &&
|
||
Configuration$1.mainData.coverageTestPerFile) {
|
||
// Per file coverage test and global
|
||
coverageTestPerFileResults = processCoveragePerFile();
|
||
if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold &&
|
||
coverageTestPerFileResults.underFiles.length === 0) {
|
||
logger.logger.info("Documentation coverage (".concat(coverageData.count, "%) is over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"));
|
||
logger.logger.info("Documentation coverage per file is over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)"));
|
||
generationPromiseResolve(true);
|
||
process.exit(0);
|
||
}
|
||
else if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold &&
|
||
coverageTestPerFileResults.underFiles.length > 0) {
|
||
logger.logger.info("Documentation coverage (".concat(coverageData.count, "%) is over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"));
|
||
var message = "Documentation coverage per file is not over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
|
||
generationPromiseReject();
|
||
if (Configuration$1.mainData.coverageTestThresholdFail) {
|
||
logger.logger.error(message);
|
||
process.exit(1);
|
||
}
|
||
else {
|
||
logger.logger.warn(message);
|
||
process.exit(0);
|
||
}
|
||
}
|
||
else if (coverageData.count < Configuration$1.mainData.coverageTestThreshold &&
|
||
coverageTestPerFileResults.underFiles.length > 0) {
|
||
var messageGlobal = "Documentation coverage (".concat(coverageData.count, "%) is not over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"), messagePerFile = "Documentation coverage per file is not over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
|
||
generationPromiseReject();
|
||
if (Configuration$1.mainData.coverageTestThresholdFail) {
|
||
logger.logger.error(messageGlobal);
|
||
logger.logger.error(messagePerFile);
|
||
process.exit(1);
|
||
}
|
||
else {
|
||
logger.logger.warn(messageGlobal);
|
||
logger.logger.warn(messagePerFile);
|
||
process.exit(0);
|
||
}
|
||
}
|
||
else {
|
||
var message = "Documentation coverage (".concat(coverageData.count, "%) is not over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"), messagePerFile = "Documentation coverage per file is over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
|
||
generationPromiseReject();
|
||
if (Configuration$1.mainData.coverageTestThresholdFail) {
|
||
logger.logger.error(message);
|
||
logger.logger.info(messagePerFile);
|
||
process.exit(1);
|
||
}
|
||
else {
|
||
logger.logger.warn(message);
|
||
logger.logger.info(messagePerFile);
|
||
process.exit(0);
|
||
}
|
||
}
|
||
}
|
||
else {
|
||
resolve(true);
|
||
}
|
||
});
|
||
};
|
||
Application.prototype.prepareUnitTestCoverage = function () {
|
||
logger.logger.info('Process unit test coverage report');
|
||
return new Promise(function (resolve, reject) {
|
||
var covDat, covFileNames;
|
||
var coverageData = Configuration$1.mainData.coverageData;
|
||
if (!coverageData.files) {
|
||
logger.logger.warn('Missing documentation coverage data');
|
||
}
|
||
else {
|
||
covDat = {};
|
||
covFileNames = ___namespace.map(coverageData.files, function (el) {
|
||
var fileName = path__namespace.normalize(el.filePath);
|
||
covDat[fileName] = {
|
||
type: el.type,
|
||
linktype: el.linktype,
|
||
linksubtype: el.linksubtype,
|
||
name: el.name
|
||
};
|
||
return fileName;
|
||
});
|
||
}
|
||
// read coverage summary file and data
|
||
var unitTestSummary = {};
|
||
var fileDat = FileEngine$1.getSync(Configuration$1.mainData.unitTestCoverage);
|
||
if (fileDat) {
|
||
unitTestSummary = JSON.parse(fileDat);
|
||
}
|
||
else {
|
||
return Promise.reject('Error reading unit test coverage file');
|
||
}
|
||
var getCovStatus = function (percent, totalLines) {
|
||
var status;
|
||
if (totalLines === 0) {
|
||
status = 'uncovered';
|
||
}
|
||
else if (percent <= 25) {
|
||
status = 'low';
|
||
}
|
||
else if (percent > 25 && percent <= 50) {
|
||
status = 'medium';
|
||
}
|
||
else if (percent > 50 && percent <= 75) {
|
||
status = 'good';
|
||
}
|
||
else {
|
||
status = 'very-good';
|
||
}
|
||
return status;
|
||
};
|
||
var getCoverageData = function (data, fileName) {
|
||
var out = {};
|
||
if (fileName !== 'total') {
|
||
if (covDat === undefined) {
|
||
// need a name to include in output but this isn't visible
|
||
out = { name: fileName, filePath: fileName };
|
||
}
|
||
else {
|
||
var findMatch = ___namespace.filter(covFileNames, function (el) {
|
||
var normalizedFilename = path__namespace.normalize(fileName).replace(/\\/g, '/');
|
||
return el.includes(fileName) || normalizedFilename.includes(el);
|
||
});
|
||
if (findMatch.length > 0) {
|
||
out = ___namespace.clone(covDat[findMatch[0]]);
|
||
out['filePath'] = fileName;
|
||
}
|
||
}
|
||
}
|
||
var keysToGet = ['statements', 'branches', 'functions', 'lines'];
|
||
___namespace.forEach(keysToGet, function (key) {
|
||
if (data[key]) {
|
||
var t = data[key];
|
||
out[key] = {
|
||
coveragePercent: Math.round(t.pct),
|
||
coverageCount: '' + t.covered + '/' + t.total,
|
||
status: getCovStatus(t.pct, t.total)
|
||
};
|
||
}
|
||
});
|
||
return out;
|
||
};
|
||
var unitTestData = {};
|
||
var files = [];
|
||
for (var file in unitTestSummary) {
|
||
var dat = getCoverageData(unitTestSummary[file], file);
|
||
if (file === 'total') {
|
||
unitTestData['total'] = dat;
|
||
}
|
||
else {
|
||
files.push(dat);
|
||
}
|
||
}
|
||
unitTestData['files'] = files;
|
||
unitTestData['idColumn'] = covDat !== undefined; // should we include the id column
|
||
Configuration$1.mainData.unitTestData = unitTestData;
|
||
Configuration$1.addPage({
|
||
name: 'unit-test',
|
||
id: 'unit-test',
|
||
context: 'unit-test',
|
||
files: files,
|
||
data: unitTestData,
|
||
depth: 0,
|
||
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
|
||
});
|
||
if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
|
||
var keysToGet = ['statements', 'branches', 'functions', 'lines'];
|
||
___namespace.forEach(keysToGet, function (key) {
|
||
if (unitTestData['total'][key]) {
|
||
HtmlEngine$1.generateCoverageBadge(Configuration$1.mainData.output, key, {
|
||
count: unitTestData['total'][key]['coveragePercent'],
|
||
status: unitTestData['total'][key]['status']
|
||
});
|
||
}
|
||
});
|
||
}
|
||
resolve(true);
|
||
});
|
||
};
|
||
Application.prototype.processPage = function (page) {
|
||
logger.logger.info('Process page', page.name);
|
||
var htmlData = HtmlEngine$1.render(Configuration$1.mainData, page);
|
||
var finalPath = Configuration$1.mainData.output;
|
||
if (Configuration$1.mainData.output.lastIndexOf('/') === -1) {
|
||
finalPath += '/';
|
||
}
|
||
if (page.path) {
|
||
finalPath += page.path + '/';
|
||
}
|
||
if (page.filename) {
|
||
finalPath += page.filename + '.html';
|
||
}
|
||
else {
|
||
finalPath += page.name + '.html';
|
||
}
|
||
if (!Configuration$1.mainData.disableSearch) {
|
||
SearchEngine$1.indexPage({
|
||
infos: page,
|
||
rawData: htmlData,
|
||
url: finalPath
|
||
});
|
||
}
|
||
FileEngine$1.writeSync(finalPath, htmlData);
|
||
return Promise.resolve(true);
|
||
};
|
||
Application.prototype.processTemplatePlayground = function () {
|
||
logger.logger.info('Process template playground');
|
||
// Generate a comprehensive template playground page with all required dependencies
|
||
var htmlContent = "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <title>Template Playground - ".concat(Configuration$1.mainData.documentationMainName || 'Documentation', "</title>\n <meta name=\"description\" content=\"Template playground for customizing Compodoc templates\">\n <link rel=\"stylesheet\" href=\"styles/template-playground.css\">\n <script src=\"js/libs/monaco-editor/min/vs/loader.js\"></script>\n <script src=\"js/libs/handlebars.min.js\"></script>\n <script src=\"js/libs/jszip.min.js\"></script>\n</head>\n<body>\n <div id=\"template-playground-root\">\n <div class=\"template-playground-container\">\n <h1>Template Playground</h1>\n <p>Welcome to the Template Playground! This tool allows you to customize and preview Compodoc templates.</p>\n \n <div class=\"features\">\n <h2>Features</h2>\n <ul>\n <li>Live template editing with monaco-editor</li>\n <li>Real-time preview using handlebars.min.js</li>\n <li>Template export and download with jszip.min.js</li>\n <li>Session-based customization</li>\n </ul>\n </div>\n \n <div class=\"usage\">\n <h2>How to Use</h2>\n <ol>\n <li>Start the template playground server</li>\n <li>Edit templates in the Monaco editor</li>\n <li>Preview changes in real-time</li>\n <li>Download customized template package</li>\n </ol>\n </div>\n </div>\n </div>\n \n <script src=\"js/template-playground.js\"></script>\n</body>\n</html>");
|
||
var finalPath = Configuration$1.mainData.output;
|
||
if (Configuration$1.mainData.output.lastIndexOf('/') === -1) {
|
||
finalPath += '/';
|
||
}
|
||
finalPath += 'template-playground.html';
|
||
FileEngine$1.writeSync(finalPath, htmlContent);
|
||
logger.logger.info('Template playground page generated');
|
||
// Generate required JavaScript file
|
||
var jsPath = path__namespace.join(Configuration$1.mainData.output, 'js', 'template-playground.js');
|
||
var jsContent = "// Template Playground JavaScript\n(function() {\n 'use strict';\n \n // Initialize template playground\n document.addEventListener('DOMContentLoaded', function() {\n console.log('Template Playground initialized');\n \n // Initialize Monaco Editor when available\n if (typeof require !== 'undefined') {\n require.config({ paths: { 'vs': 'js/libs/monaco-editor/min/vs' }});\n require(['vs/editor/editor.main'], function() {\n console.log('Monaco Editor loaded');\n });\n }\n \n // Initialize Handlebars when available\n if (typeof Handlebars !== 'undefined') {\n console.log('Handlebars loaded');\n }\n \n // Initialize JSZip when available\n if (typeof JSZip !== 'undefined') {\n console.log('JSZip loaded');\n }\n });\n})();";
|
||
// Ensure js directory exists
|
||
var jsDir = path__namespace.join(Configuration$1.mainData.output, 'js');
|
||
if (!fs__namespace.existsSync(jsDir)) {
|
||
fs__namespace.mkdirSync(jsDir, { recursive: true });
|
||
}
|
||
FileEngine$1.writeSync(jsPath, jsContent);
|
||
logger.logger.info('Template playground JavaScript generated');
|
||
// Generate required CSS file
|
||
var cssPath = path__namespace.join(Configuration$1.mainData.output, 'styles', 'template-playground.css');
|
||
var cssContent = "/* Template Playground Styles */\n.template-playground-container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n#template-playground-root {\n min-height: 100vh;\n background: #f8f9fa;\n}\n\n.template-playground-container h1 {\n color: #2c3e50;\n border-bottom: 2px solid #3498db;\n padding-bottom: 10px;\n}\n\n.features, .usage {\n background: white;\n padding: 20px;\n margin: 20px 0;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.features h2, .usage h2 {\n color: #34495e;\n margin-top: 0;\n}\n\n.features ul, .usage ol {\n line-height: 1.6;\n}\n\n.features li, .usage li {\n margin: 8px 0;\n}";
|
||
// Ensure styles directory exists
|
||
var stylesDir = path__namespace.join(Configuration$1.mainData.output, 'styles');
|
||
if (!fs__namespace.existsSync(stylesDir)) {
|
||
fs__namespace.mkdirSync(stylesDir, { recursive: true });
|
||
}
|
||
FileEngine$1.writeSync(cssPath, cssContent);
|
||
logger.logger.info('Template playground CSS generated');
|
||
};
|
||
Application.prototype.processPages = function () {
|
||
var _this = this;
|
||
var pages = ___namespace.sortBy(Configuration$1.pages, ['name']);
|
||
logger.logger.info('Process pages');
|
||
Promise.all(pages.map(function (page) { return _this.processPage(page); }))
|
||
.then(function () {
|
||
var callbacksAfterGenerateSearchIndexJson = function () {
|
||
// Process template playground if enabled
|
||
if (Configuration$1.mainData.templatePlayground) {
|
||
_this.processTemplatePlayground();
|
||
}
|
||
if (Configuration$1.mainData.additionalPages.length > 0) {
|
||
_this.processAdditionalPages();
|
||
}
|
||
else {
|
||
if (Configuration$1.mainData.assetsFolder !== '') {
|
||
_this.processAssetsFolder();
|
||
}
|
||
_this.processResources();
|
||
}
|
||
};
|
||
if (!Configuration$1.mainData.disableSearch) {
|
||
SearchEngine$1.generateSearchIndexJson(Configuration$1.mainData.output).then(function () {
|
||
callbacksAfterGenerateSearchIndexJson();
|
||
}, function (e) {
|
||
logger.logger.error(e);
|
||
});
|
||
}
|
||
else {
|
||
callbacksAfterGenerateSearchIndexJson();
|
||
}
|
||
})
|
||
.then(function () {
|
||
return _this.processMenu(Configuration$1.mainData);
|
||
})
|
||
.catch(function (e) {
|
||
logger.logger.error(e);
|
||
});
|
||
};
|
||
Application.prototype.transpileMenuWCToES5 = function (es6Code) {
|
||
return babel.transformAsync(es6Code, {
|
||
cwd: __dirname,
|
||
filename: 'menu-wc_es5.js',
|
||
presets: [
|
||
[
|
||
'@babel/preset-env',
|
||
{
|
||
targets: {
|
||
ie: '11'
|
||
}
|
||
}
|
||
]
|
||
],
|
||
plugins: [
|
||
[
|
||
'@babel/plugin-transform-private-methods',
|
||
{
|
||
loose: false
|
||
}
|
||
]
|
||
]
|
||
});
|
||
};
|
||
Application.prototype.processMenu = function (mainData) {
|
||
var _this = this;
|
||
logger.logger.info('Process menu...');
|
||
return new Promise(function (resolveProcessMenu, rejectProcessMenu) {
|
||
var output = mainData.output.slice();
|
||
var outputLastCharacter = output.lastIndexOf('/');
|
||
if (outputLastCharacter !== -1) {
|
||
output = output.slice(0, -1);
|
||
}
|
||
var finalPathES6 = "".concat(output, "/js/menu-wc.js");
|
||
var finalPathES5 = "".concat(output, "/js/menu-wc_es5.js");
|
||
HtmlEngine$1.renderMenu(Configuration$1.mainData.templates, mainData)
|
||
.then(function (htmlData) {
|
||
FileEngine$1.write(finalPathES6, htmlData)
|
||
.then(function () {
|
||
_this.transpileMenuWCToES5(htmlData)
|
||
.then(function (es5Data) {
|
||
FileEngine$1.write(finalPathES5, es5Data.code)
|
||
.then(function () {
|
||
resolveProcessMenu();
|
||
})
|
||
.catch(function (err) {
|
||
logger.logger.error('Error during ' + finalPathES5 + ' page generation');
|
||
logger.logger.error(err);
|
||
return rejectProcessMenu('');
|
||
});
|
||
})
|
||
.catch(function (err) {
|
||
logger.logger.error('Error during ' + finalPathES5 + ' page generation');
|
||
logger.logger.error(err);
|
||
return rejectProcessMenu('');
|
||
});
|
||
})
|
||
.catch(function (err) {
|
||
logger.logger.error('Error during ' + finalPathES6 + ' page generation');
|
||
logger.logger.error(err);
|
||
return rejectProcessMenu('');
|
||
});
|
||
})
|
||
.catch(function (err) {
|
||
logger.logger.error('Error during ' + finalPathES6 + ' page generation');
|
||
logger.logger.error(err);
|
||
return rejectProcessMenu('');
|
||
});
|
||
});
|
||
};
|
||
Application.prototype.processAdditionalPages = function () {
|
||
var _this = this;
|
||
logger.logger.info('Process additional pages');
|
||
var pages = Configuration$1.mainData.additionalPages;
|
||
Promise.all(pages.map(function (page) {
|
||
if (page.children.length > 0) {
|
||
return Promise.all(logger.__spreadArray([
|
||
_this.processPage(page)
|
||
], logger.__read(page.children.map(function (childPage) { return _this.processPage(childPage); })), false));
|
||
}
|
||
else {
|
||
return _this.processPage(page);
|
||
}
|
||
}))
|
||
.then(function () {
|
||
SearchEngine$1.generateSearchIndexJson(Configuration$1.mainData.output).then(function () {
|
||
if (Configuration$1.mainData.assetsFolder !== '') {
|
||
_this.processAssetsFolder();
|
||
}
|
||
_this.processResources();
|
||
});
|
||
})
|
||
.catch(function (e) {
|
||
logger.logger.error(e);
|
||
return Promise.reject(e);
|
||
});
|
||
};
|
||
Application.prototype.processAssetsFolder = function () {
|
||
logger.logger.info('Copy assets folder');
|
||
if (!FileEngine$1.existsSync(Configuration$1.mainData.assetsFolder)) {
|
||
logger.logger.error("Provided assets folder ".concat(Configuration$1.mainData.assetsFolder, " did not exist"));
|
||
}
|
||
else {
|
||
var finalOutput = Configuration$1.mainData.output;
|
||
var testOutputDir = Configuration$1.mainData.output.match(cwd$1);
|
||
if (testOutputDir && testOutputDir.length > 0) {
|
||
finalOutput = Configuration$1.mainData.output.replace(cwd$1 + path__namespace.sep, '');
|
||
}
|
||
var destination = path__namespace.join(finalOutput, path__namespace.basename(Configuration$1.mainData.assetsFolder));
|
||
fs__namespace.copy(path__namespace.resolve(Configuration$1.mainData.assetsFolder), path__namespace.resolve(destination), function (err) {
|
||
if (err) {
|
||
logger.logger.error('Error during resources copy ', err);
|
||
}
|
||
});
|
||
}
|
||
};
|
||
Application.prototype.processResources = function () {
|
||
var _this = this;
|
||
logger.logger.info('Copy main resources');
|
||
var onComplete = function () {
|
||
logger.logger.info('Documentation generated in ' +
|
||
Configuration$1.mainData.output +
|
||
' in ' +
|
||
_this.getElapsedTime() +
|
||
' seconds using ' +
|
||
Configuration$1.mainData.theme +
|
||
' theme');
|
||
if (Configuration$1.mainData.serve) {
|
||
logger.logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(Configuration$1.mainData.port));
|
||
_this.runWebServer(Configuration$1.mainData.output);
|
||
}
|
||
else {
|
||
generationPromiseResolve(true);
|
||
_this.endCallback();
|
||
}
|
||
};
|
||
var finalOutput = Configuration$1.mainData.output;
|
||
var testOutputDir = Configuration$1.mainData.output.match(cwd$1);
|
||
if (testOutputDir && testOutputDir.length > 0) {
|
||
finalOutput = Configuration$1.mainData.output.replace(cwd$1 + path__namespace.sep, '');
|
||
}
|
||
fs__namespace.copy(path__namespace.resolve(__dirname + '/../src/resources/'), path__namespace.resolve(finalOutput), function (errorCopy) {
|
||
if (errorCopy) {
|
||
logger.logger.error('Error during resources copy ', errorCopy);
|
||
}
|
||
else {
|
||
var extThemePromise = new Promise(function (extThemeResolve, extThemeReject) {
|
||
if (Configuration$1.mainData.extTheme) {
|
||
fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.extTheme), path__namespace.resolve(finalOutput + '/styles/'), function (errorCopyTheme) {
|
||
if (errorCopyTheme) {
|
||
logger.logger.error('Error during external styling theme copy ', errorCopyTheme);
|
||
extThemeReject();
|
||
}
|
||
else {
|
||
logger.logger.info('External styling theme copy succeeded');
|
||
extThemeResolve(true);
|
||
}
|
||
});
|
||
}
|
||
else {
|
||
extThemeResolve(true);
|
||
}
|
||
});
|
||
var customFaviconPromise = new Promise(function (customFaviconResolve, customFaviconReject) {
|
||
if (Configuration$1.mainData.customFavicon !== '') {
|
||
logger.logger.info("Custom favicon supplied");
|
||
fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.customFavicon), path__namespace.resolve(finalOutput + '/images/favicon.ico'), function (errorCopyFavicon) {
|
||
// tslint:disable-line
|
||
if (errorCopyFavicon) {
|
||
logger.logger.error('Error during resources copy of favicon', errorCopyFavicon);
|
||
customFaviconReject();
|
||
}
|
||
else {
|
||
logger.logger.info('External custom favicon copy succeeded');
|
||
customFaviconResolve(true);
|
||
}
|
||
});
|
||
}
|
||
else {
|
||
customFaviconResolve(true);
|
||
}
|
||
});
|
||
var customLogoPromise = new Promise(function (customLogoResolve, customLogoReject) {
|
||
if (Configuration$1.mainData.customLogo !== '') {
|
||
logger.logger.info("Custom logo supplied");
|
||
fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.customLogo), path__namespace.resolve(finalOutput +
|
||
'/images/' +
|
||
Configuration$1.mainData.customLogo.split('/').pop()), function (errorCopyLogo) {
|
||
// tslint:disable-line
|
||
if (errorCopyLogo) {
|
||
logger.logger.error('Error during resources copy of logo', errorCopyLogo);
|
||
customLogoReject();
|
||
}
|
||
else {
|
||
logger.logger.info('External custom logo copy succeeded');
|
||
customLogoResolve(true);
|
||
}
|
||
});
|
||
}
|
||
else {
|
||
customLogoResolve(true);
|
||
}
|
||
});
|
||
Promise.all([extThemePromise, customFaviconPromise, customLogoPromise]).then(function () {
|
||
onComplete();
|
||
});
|
||
}
|
||
});
|
||
};
|
||
/**
|
||
* Calculates the elapsed time since the program was started.
|
||
*
|
||
* @returns {number}
|
||
*/
|
||
Application.prototype.getElapsedTime = function () {
|
||
return (new Date().valueOf() - startTime.valueOf()) / 1000;
|
||
};
|
||
Application.prototype.processGraphs = function () {
|
||
var _this = this;
|
||
if (Configuration$1.mainData.disableGraph) {
|
||
logger.logger.info('Graph generation disabled');
|
||
this.processPages();
|
||
}
|
||
else {
|
||
logger.logger.info('Process main graph');
|
||
var modules_1 = Configuration$1.mainData.modules;
|
||
var i_1 = 0;
|
||
var len_1 = modules_1.length;
|
||
var loop_1 = function () {
|
||
if (i_1 <= len_1 - 1) {
|
||
logger.logger.info('Process module graph ', modules_1[i_1].name);
|
||
var finalPath_2 = Configuration$1.mainData.output;
|
||
if (Configuration$1.mainData.output.lastIndexOf('/') === -1) {
|
||
finalPath_2 += '/';
|
||
}
|
||
finalPath_2 += 'modules/' + modules_1[i_1].name;
|
||
var _rawModule = DependenciesEngine$1.getRawModule(modules_1[i_1].name);
|
||
if (_rawModule.declarations.length > 0 ||
|
||
_rawModule.bootstrap.length > 0 ||
|
||
_rawModule.imports.length > 0 ||
|
||
_rawModule.exports.length > 0 ||
|
||
_rawModule.providers.length > 0) {
|
||
NgdEngine$1.renderGraph(modules_1[i_1].file, finalPath_2, 'f', modules_1[i_1].name).then(function () {
|
||
NgdEngine$1.readGraph(path__namespace.resolve(finalPath_2 + path__namespace.sep + 'dependencies.svg'), modules_1[i_1].name).then(function (data) {
|
||
modules_1[i_1].graph = data;
|
||
i_1++;
|
||
loop_1();
|
||
}, function (err) {
|
||
logger.logger.error('Error during graph read: ', err);
|
||
});
|
||
}, function (errorMessage) {
|
||
logger.logger.error(errorMessage);
|
||
});
|
||
}
|
||
else {
|
||
i_1++;
|
||
loop_1();
|
||
}
|
||
}
|
||
else {
|
||
_this.processPages();
|
||
}
|
||
};
|
||
var finalMainGraphPath_1 = Configuration$1.mainData.output;
|
||
if (finalMainGraphPath_1.lastIndexOf('/') === -1) {
|
||
finalMainGraphPath_1 += '/';
|
||
}
|
||
finalMainGraphPath_1 += 'graph';
|
||
NgdEngine$1.init(path__namespace.resolve(finalMainGraphPath_1));
|
||
NgdEngine$1.renderGraph(Configuration$1.mainData.tsconfig, path__namespace.resolve(finalMainGraphPath_1), 'p').then(function () {
|
||
NgdEngine$1.readGraph(path__namespace.resolve(finalMainGraphPath_1 + path__namespace.sep + 'dependencies.svg'), 'Main graph').then(function (data) {
|
||
Configuration$1.mainData.mainGraph = data;
|
||
loop_1();
|
||
}, function (err) {
|
||
logger.logger.error('Error during main graph reading : ', err);
|
||
Configuration$1.mainData.disableMainGraph = true;
|
||
loop_1();
|
||
});
|
||
}, function (err) {
|
||
logger.logger.error('Ooops error during main graph generation, moving on next part with main graph disabled : ', err);
|
||
Configuration$1.mainData.disableMainGraph = true;
|
||
loop_1();
|
||
});
|
||
}
|
||
};
|
||
Application.prototype.runWebServer = function (folder) {
|
||
if (!this.isWatching) {
|
||
var liveServerConfiguration = {
|
||
root: folder,
|
||
open: Configuration$1.mainData.open,
|
||
quiet: true,
|
||
logLevel: 0,
|
||
wait: 1000,
|
||
port: Configuration$1.mainData.port
|
||
};
|
||
if (Configuration$1.mainData.host !== '') {
|
||
liveServerConfiguration.host = Configuration$1.mainData.host;
|
||
}
|
||
LiveServer__namespace.start(liveServerConfiguration);
|
||
}
|
||
if (Configuration$1.mainData.watch && !this.isWatching) {
|
||
if (typeof this.files === 'undefined') {
|
||
logger.logger.error('No sources files available, please use -p flag');
|
||
generationPromiseReject();
|
||
process.exit(1);
|
||
}
|
||
else {
|
||
this.runWatch();
|
||
}
|
||
}
|
||
else if (Configuration$1.mainData.watch && this.isWatching) {
|
||
var srcFolder = findMainSourceFolder(this.files);
|
||
logger.logger.info("Already watching sources in ".concat(srcFolder, " folder"));
|
||
}
|
||
};
|
||
Application.prototype.runWatch = function () {
|
||
var _this = this;
|
||
var sources = [findMainSourceFolder(this.files)];
|
||
var watcherReady = false;
|
||
this.isWatching = true;
|
||
logger.logger.info("Watching sources in ".concat(findMainSourceFolder(this.files), " folder"));
|
||
if (MarkdownEngine$1.hasRootMarkdowns()) {
|
||
sources = sources.concat(MarkdownEngine$1.listRootMarkdowns());
|
||
}
|
||
if (Configuration$1.mainData.includes !== '') {
|
||
sources = sources.concat(Configuration$1.mainData.includes);
|
||
}
|
||
// Check all elements of sources list exist
|
||
sources = cleanSourcesForWatch(sources);
|
||
var watcher = chokidar.watch(sources, {
|
||
awaitWriteFinish: true,
|
||
ignoreInitial: true,
|
||
ignored: /(spec|\.d)\.ts/
|
||
});
|
||
var timerAddAndRemoveRef;
|
||
var timerChangeRef;
|
||
var runnerAddAndRemove = function () {
|
||
startTime = new Date();
|
||
_this.generate();
|
||
};
|
||
var waiterAddAndRemove = function () {
|
||
clearTimeout(timerAddAndRemoveRef);
|
||
timerAddAndRemoveRef = setTimeout(runnerAddAndRemove, 1000);
|
||
};
|
||
var runnerChange = function () {
|
||
startTime = new Date();
|
||
_this.setUpdatedFiles(_this.watchChangedFiles);
|
||
if (_this.hasWatchedFilesTSFiles()) {
|
||
_this.getMicroDependenciesData();
|
||
}
|
||
else if (_this.hasWatchedFilesRootMarkdownFiles()) {
|
||
_this.rebuildRootMarkdowns();
|
||
}
|
||
else {
|
||
_this.rebuildExternalDocumentation();
|
||
}
|
||
};
|
||
var waiterChange = function () {
|
||
clearTimeout(timerChangeRef);
|
||
timerChangeRef = setTimeout(runnerChange, 1000);
|
||
};
|
||
watcher.on('ready', function () {
|
||
if (!watcherReady) {
|
||
watcherReady = true;
|
||
watcher
|
||
.on('add', function (file) {
|
||
logger.logger.debug("File ".concat(file, " has been added"));
|
||
// Test extension, if ts
|
||
// rescan everything
|
||
if (path__namespace.extname(file) === '.ts') {
|
||
waiterAddAndRemove();
|
||
}
|
||
})
|
||
.on('change', function (file) {
|
||
logger.logger.debug("File ".concat(file, " has been changed"));
|
||
// Test extension, if ts
|
||
// rescan only file
|
||
if (path__namespace.extname(file) === '.ts' ||
|
||
path__namespace.extname(file) === '.md' ||
|
||
path__namespace.extname(file) === '.json') {
|
||
_this.watchChangedFiles.push(path__namespace.join(cwd$1 + path__namespace.sep + file));
|
||
waiterChange();
|
||
}
|
||
})
|
||
.on('unlink', function (file) {
|
||
logger.logger.debug("File ".concat(file, " has been removed"));
|
||
// Test extension, if ts
|
||
// rescan everything
|
||
if (path__namespace.extname(file) === '.ts') {
|
||
waiterAddAndRemove();
|
||
}
|
||
});
|
||
}
|
||
});
|
||
};
|
||
Object.defineProperty(Application.prototype, "application", {
|
||
/**
|
||
* Return the application / root component instance.
|
||
*/
|
||
get: function () {
|
||
return this;
|
||
},
|
||
enumerable: false,
|
||
configurable: true
|
||
});
|
||
Object.defineProperty(Application.prototype, "isCLI", {
|
||
get: function () {
|
||
return false;
|
||
},
|
||
enumerable: false,
|
||
configurable: true
|
||
});
|
||
return Application;
|
||
}());
|
||
|
||
var fg$1 = require('fast-glob');
|
||
/**
|
||
* Utility class for parsing *.api.md files generated by API Extractor
|
||
*/
|
||
var ApiMarkdownParser = /** @class */ (function () {
|
||
function ApiMarkdownParser(sourceRoot) {
|
||
this.sourceRoot = path__namespace.resolve(sourceRoot);
|
||
this.symbolToFiles = new Map();
|
||
this.apiMdFiles = new Set();
|
||
}
|
||
/**
|
||
* Parse all *.api.md files in the source root and extract exported symbols
|
||
*/
|
||
ApiMarkdownParser.prototype.parseApiMarkdownFiles = function () {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var pattern, apiMdFiles, apiMdFiles_1, apiMdFiles_1_1, apiMdFile, e_1_1;
|
||
var e_1, _a;
|
||
return logger.__generator(this, function (_b) {
|
||
switch (_b.label) {
|
||
case 0:
|
||
logger.logger.info("Scanning for *.api.md files in ".concat(this.sourceRoot));
|
||
if (!fs__namespace.existsSync(this.sourceRoot)) {
|
||
logger.logger.error("Source root path does not exist: ".concat(this.sourceRoot));
|
||
return [2 /*return*/, {
|
||
symbolToFiles: this.symbolToFiles,
|
||
apiMdFiles: this.apiMdFiles
|
||
}];
|
||
}
|
||
pattern = path__namespace.join(this.sourceRoot, '**/*.api.md');
|
||
return [4 /*yield*/, fg$1(pattern, {
|
||
absolute: true,
|
||
ignore: ['**/node_modules/**']
|
||
})];
|
||
case 1:
|
||
apiMdFiles = _b.sent();
|
||
logger.logger.info("Found ".concat(apiMdFiles.length, " *.api.md file(s)"));
|
||
_b.label = 2;
|
||
case 2:
|
||
_b.trys.push([2, 9, 10, 11]);
|
||
apiMdFiles_1 = logger.__values(apiMdFiles), apiMdFiles_1_1 = apiMdFiles_1.next();
|
||
_b.label = 3;
|
||
case 3:
|
||
if (!!apiMdFiles_1_1.done) return [3 /*break*/, 8];
|
||
apiMdFile = apiMdFiles_1_1.value;
|
||
return [4 /*yield*/, this.isRelevantApiMarkdownFile(apiMdFile)];
|
||
case 4:
|
||
if (!_b.sent()) return [3 /*break*/, 6];
|
||
this.apiMdFiles.add(apiMdFile);
|
||
return [4 /*yield*/, this.parseApiMarkdownFile(apiMdFile)];
|
||
case 5:
|
||
_b.sent();
|
||
return [3 /*break*/, 7];
|
||
case 6:
|
||
logger.logger.debug("Skipping irrelevant API markdown file: ".concat(apiMdFile));
|
||
_b.label = 7;
|
||
case 7:
|
||
apiMdFiles_1_1 = apiMdFiles_1.next();
|
||
return [3 /*break*/, 3];
|
||
case 8: return [3 /*break*/, 11];
|
||
case 9:
|
||
e_1_1 = _b.sent();
|
||
e_1 = { error: e_1_1 };
|
||
return [3 /*break*/, 11];
|
||
case 10:
|
||
try {
|
||
if (apiMdFiles_1_1 && !apiMdFiles_1_1.done && (_a = apiMdFiles_1.return)) _a.call(apiMdFiles_1);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
return [7 /*endfinally*/];
|
||
case 11:
|
||
logger.logger.info("Extracted ".concat(this.symbolToFiles.size, " public API symbol(s) from ").concat(this.apiMdFiles.size, " relevant *.api.md file(s)"));
|
||
return [2 /*return*/, {
|
||
symbolToFiles: this.symbolToFiles,
|
||
apiMdFiles: this.apiMdFiles
|
||
}];
|
||
}
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Check if an API markdown file is relevant (contains meaningful exports)
|
||
* A file is relevant if it contains at least one export that is:
|
||
* - A class, interface, function, type, enum, or variable
|
||
* - Not a default export of an empty object
|
||
* - Not an Angular internal symbol (ɵfac, ɵinj, ɵmod)
|
||
*/
|
||
ApiMarkdownParser.prototype.isRelevantApiMarkdownFile = function (filePath) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var content, tsCodeBlock, sourceFile, _a, _b, statement;
|
||
var e_2, _c;
|
||
return logger.__generator(this, function (_d) {
|
||
try {
|
||
content = fs__namespace.readFileSync(filePath, 'utf-8');
|
||
tsCodeBlock = this.extractTypeScriptCodeBlock(content);
|
||
if (!tsCodeBlock) {
|
||
logger.logger.debug("No TypeScript code block found in ".concat(filePath));
|
||
return [2 /*return*/, false];
|
||
}
|
||
sourceFile = tsMorph.ts.createSourceFile(filePath, tsCodeBlock, tsMorph.ts.ScriptTarget.Latest, true);
|
||
try {
|
||
// Check each top-level statement
|
||
for (_a = logger.__values(sourceFile.statements), _b = _a.next(); !_b.done; _b = _a.next()) {
|
||
statement = _b.value;
|
||
if (this.isMeaningfulExport(statement)) {
|
||
return [2 /*return*/, true];
|
||
}
|
||
}
|
||
}
|
||
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
||
finally {
|
||
try {
|
||
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
||
}
|
||
finally { if (e_2) throw e_2.error; }
|
||
}
|
||
return [2 /*return*/, false];
|
||
}
|
||
catch (error) {
|
||
logger.logger.error("Error checking relevance of ".concat(filePath, ": ").concat(error));
|
||
return [2 /*return*/, false];
|
||
}
|
||
return [2 /*return*/];
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Check if a statement is a meaningful export
|
||
* Exclude default exports of empty objects and Angular internal symbols
|
||
*/
|
||
ApiMarkdownParser.prototype.isMeaningfulExport = function (statement) {
|
||
var e_3, _a, e_4, _b;
|
||
var _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
||
// Handle: export class Foo {}
|
||
if (tsMorph.ts.isClassDeclaration(statement)) {
|
||
var name = (_c = statement.name) === null || _c === void 0 ? void 0 : _c.text;
|
||
return !!name && !this.isAngularInternalSymbol(name);
|
||
}
|
||
// Handle: export interface Bar {}
|
||
if (tsMorph.ts.isInterfaceDeclaration(statement)) {
|
||
var name = (_d = statement.name) === null || _d === void 0 ? void 0 : _d.text;
|
||
return !!name;
|
||
}
|
||
// Handle: export const baz = ...
|
||
if (tsMorph.ts.isVariableStatement(statement)) {
|
||
var hasExportModifier = (_e = statement.modifiers) === null || _e === void 0 ? void 0 : _e.some(function (m) { return m.kind === tsMorph.ts.SyntaxKind.ExportKeyword; });
|
||
if (hasExportModifier) {
|
||
try {
|
||
// Check if it's not just a default export of an empty object
|
||
for (var _m = logger.__values(((_f = statement.declarationList) === null || _f === void 0 ? void 0 : _f.declarations) || []), _o = _m.next(); !_o.done; _o = _m.next()) {
|
||
var decl = _o.value;
|
||
var name = (_g = decl.name) === null || _g === void 0 ? void 0 : _g.text;
|
||
if (name && !this.isAngularInternalSymbol(name) && name !== '_default') {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
||
finally {
|
||
try {
|
||
if (_o && !_o.done && (_a = _m.return)) _a.call(_m);
|
||
}
|
||
finally { if (e_3) throw e_3.error; }
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
// Handle: export function foo() {}
|
||
if (tsMorph.ts.isFunctionDeclaration(statement)) {
|
||
var name = (_h = statement.name) === null || _h === void 0 ? void 0 : _h.text;
|
||
return !!name && !this.isAngularInternalSymbol(name);
|
||
}
|
||
// Handle: export type FooType = ...
|
||
if (tsMorph.ts.isTypeAliasDeclaration(statement)) {
|
||
var name = (_j = statement.name) === null || _j === void 0 ? void 0 : _j.text;
|
||
return !!name;
|
||
}
|
||
// Handle: export enum FooEnum {}
|
||
if (tsMorph.ts.isEnumDeclaration(statement)) {
|
||
var name = (_k = statement.name) === null || _k === void 0 ? void 0 : _k.text;
|
||
return !!name;
|
||
}
|
||
// Handle: export { Foo, Bar }
|
||
if (tsMorph.ts.isExportDeclaration(statement)) {
|
||
var exportClause = statement.exportClause;
|
||
// Skip: export default _default
|
||
if (statement.isTypeOnly) {
|
||
return false;
|
||
}
|
||
// Check if it's a named export declaration
|
||
if (exportClause && tsMorph.ts.isNamedExports(exportClause)) {
|
||
var elements = exportClause.elements;
|
||
try {
|
||
for (var elements_1 = logger.__values(elements), elements_1_1 = elements_1.next(); !elements_1_1.done; elements_1_1 = elements_1.next()) {
|
||
var element = elements_1_1.value;
|
||
var name = (_l = element.name) === null || _l === void 0 ? void 0 : _l.text;
|
||
if (name && !this.isAngularInternalSymbol(name) && name !== '_default') {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
||
finally {
|
||
try {
|
||
if (elements_1_1 && !elements_1_1.done && (_b = elements_1.return)) _b.call(elements_1);
|
||
}
|
||
finally { if (e_4) throw e_4.error; }
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
// Handle: export default Foo
|
||
if (tsMorph.ts.isExportAssignment(statement)) {
|
||
// export default _default is not meaningful
|
||
if (tsMorph.ts.isIdentifier(statement.expression)) {
|
||
var name = statement.expression.text;
|
||
if (name === '_default') {
|
||
return false;
|
||
}
|
||
return !this.isAngularInternalSymbol(name);
|
||
}
|
||
return false;
|
||
}
|
||
return false;
|
||
};
|
||
/**
|
||
* Check if a symbol is an Angular internal symbol
|
||
*/
|
||
ApiMarkdownParser.prototype.isAngularInternalSymbol = function (symbolName) {
|
||
// Angular internal symbols start with ɵ
|
||
return symbolName.startsWith('ɵ');
|
||
};
|
||
/**
|
||
* Extract the TypeScript code block from a markdown file
|
||
* API Extractor markdown files have TypeScript code in a ```ts block
|
||
*
|
||
* Note: Uses string-based parsing instead of regex to avoid ReDoS vulnerabilities
|
||
* that can occur with patterns like /```ts\s*\n([\s\S]*?)\n```/ on malformed input.
|
||
*/
|
||
ApiMarkdownParser.prototype.extractTypeScriptCodeBlock = function (content) {
|
||
var e_5, _a;
|
||
// Find the opening marker (```ts or ```typescript)
|
||
var openMarkers = ['```ts\n', '```ts\r\n', '```typescript\n', '```typescript\r\n'];
|
||
var startIndex = -1;
|
||
var markerLength = 0;
|
||
try {
|
||
for (var openMarkers_1 = logger.__values(openMarkers), openMarkers_1_1 = openMarkers_1.next(); !openMarkers_1_1.done; openMarkers_1_1 = openMarkers_1.next()) {
|
||
var marker = openMarkers_1_1.value;
|
||
var idx = content.indexOf(marker);
|
||
if (idx !== -1 && (startIndex === -1 || idx < startIndex)) {
|
||
startIndex = idx;
|
||
markerLength = marker.length;
|
||
}
|
||
}
|
||
}
|
||
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
||
finally {
|
||
try {
|
||
if (openMarkers_1_1 && !openMarkers_1_1.done && (_a = openMarkers_1.return)) _a.call(openMarkers_1);
|
||
}
|
||
finally { if (e_5) throw e_5.error; }
|
||
}
|
||
if (startIndex === -1) {
|
||
return null;
|
||
}
|
||
// Find the closing marker (``` at the start of a line)
|
||
var contentStart = startIndex + markerLength;
|
||
var closeMarker = '\n```';
|
||
var endIndex = content.indexOf(closeMarker, contentStart);
|
||
if (endIndex === -1) {
|
||
return null;
|
||
}
|
||
var codeBlock = content.slice(contentStart, endIndex);
|
||
// Return null for empty code blocks
|
||
if (!codeBlock.trim()) {
|
||
return null;
|
||
}
|
||
return codeBlock;
|
||
};
|
||
/**
|
||
* Parse a single *.api.md file and extract its exports
|
||
*/
|
||
ApiMarkdownParser.prototype.parseApiMarkdownFile = function (filePath) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var content, tsCodeBlock, sourceFile, _a, _b, statement;
|
||
var e_6, _c;
|
||
return logger.__generator(this, function (_d) {
|
||
logger.logger.debug("Parsing API markdown file: ".concat(filePath));
|
||
try {
|
||
content = fs__namespace.readFileSync(filePath, 'utf-8');
|
||
tsCodeBlock = this.extractTypeScriptCodeBlock(content);
|
||
if (!tsCodeBlock) {
|
||
logger.logger.debug("No TypeScript code block found in ".concat(filePath));
|
||
return [2 /*return*/];
|
||
}
|
||
sourceFile = tsMorph.ts.createSourceFile(filePath, tsCodeBlock, tsMorph.ts.ScriptTarget.Latest, true);
|
||
try {
|
||
// Process all top-level statements in the file
|
||
for (_a = logger.__values(sourceFile.statements), _b = _a.next(); !_b.done; _b = _a.next()) {
|
||
statement = _b.value;
|
||
this.processStatement(statement, filePath);
|
||
}
|
||
}
|
||
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
||
finally {
|
||
try {
|
||
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
||
}
|
||
finally { if (e_6) throw e_6.error; }
|
||
}
|
||
}
|
||
catch (error) {
|
||
logger.logger.error("Error parsing API markdown file ".concat(filePath, ": ").concat(error));
|
||
}
|
||
return [2 /*return*/];
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Process a TypeScript statement to extract exports
|
||
*/
|
||
ApiMarkdownParser.prototype.processStatement = function (statement, sourceFilePath) {
|
||
var e_7, _a, e_8, _b;
|
||
var _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
||
// Handle: export class Foo {}
|
||
if (tsMorph.ts.isClassDeclaration(statement)) {
|
||
var name = (_c = statement.name) === null || _c === void 0 ? void 0 : _c.text;
|
||
if (name && !this.isAngularInternalSymbol(name)) {
|
||
this.addSymbol(name, sourceFilePath);
|
||
}
|
||
}
|
||
// Handle: export interface Bar {}
|
||
else if (tsMorph.ts.isInterfaceDeclaration(statement)) {
|
||
var name = (_d = statement.name) === null || _d === void 0 ? void 0 : _d.text;
|
||
if (name) {
|
||
this.addSymbol(name, sourceFilePath);
|
||
}
|
||
}
|
||
// Handle: export const baz = ...
|
||
else if (tsMorph.ts.isVariableStatement(statement)) {
|
||
var hasExportModifier = (_e = statement.modifiers) === null || _e === void 0 ? void 0 : _e.some(function (m) { return m.kind === tsMorph.ts.SyntaxKind.ExportKeyword; });
|
||
if (hasExportModifier) {
|
||
try {
|
||
for (var _m = logger.__values(((_f = statement.declarationList) === null || _f === void 0 ? void 0 : _f.declarations) || []), _o = _m.next(); !_o.done; _o = _m.next()) {
|
||
var decl = _o.value;
|
||
var name = (_g = decl.name) === null || _g === void 0 ? void 0 : _g.text;
|
||
if (name && !this.isAngularInternalSymbol(name) && name !== '_default') {
|
||
this.addSymbol(name, sourceFilePath);
|
||
}
|
||
}
|
||
}
|
||
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
||
finally {
|
||
try {
|
||
if (_o && !_o.done && (_a = _m.return)) _a.call(_m);
|
||
}
|
||
finally { if (e_7) throw e_7.error; }
|
||
}
|
||
}
|
||
}
|
||
// Handle: export function foo() {}
|
||
else if (tsMorph.ts.isFunctionDeclaration(statement)) {
|
||
var name = (_h = statement.name) === null || _h === void 0 ? void 0 : _h.text;
|
||
if (name && !this.isAngularInternalSymbol(name)) {
|
||
this.addSymbol(name, sourceFilePath);
|
||
}
|
||
}
|
||
// Handle: export type FooType = ...
|
||
else if (tsMorph.ts.isTypeAliasDeclaration(statement)) {
|
||
var name = (_j = statement.name) === null || _j === void 0 ? void 0 : _j.text;
|
||
if (name) {
|
||
this.addSymbol(name, sourceFilePath);
|
||
}
|
||
}
|
||
// Handle: export enum FooEnum {}
|
||
else if (tsMorph.ts.isEnumDeclaration(statement)) {
|
||
var name = (_k = statement.name) === null || _k === void 0 ? void 0 : _k.text;
|
||
if (name) {
|
||
this.addSymbol(name, sourceFilePath);
|
||
}
|
||
}
|
||
// Handle: export { Foo, Bar }
|
||
else if (tsMorph.ts.isExportDeclaration(statement)) {
|
||
var exportClause = statement.exportClause;
|
||
if (exportClause && tsMorph.ts.isNamedExports(exportClause)) {
|
||
var elements = exportClause.elements;
|
||
try {
|
||
for (var elements_2 = logger.__values(elements), elements_2_1 = elements_2.next(); !elements_2_1.done; elements_2_1 = elements_2.next()) {
|
||
var element = elements_2_1.value;
|
||
var name = (_l = element.name) === null || _l === void 0 ? void 0 : _l.text;
|
||
if (name && !this.isAngularInternalSymbol(name) && name !== '_default') {
|
||
this.addSymbol(name, sourceFilePath);
|
||
}
|
||
}
|
||
}
|
||
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
||
finally {
|
||
try {
|
||
if (elements_2_1 && !elements_2_1.done && (_b = elements_2.return)) _b.call(elements_2);
|
||
}
|
||
finally { if (e_8) throw e_8.error; }
|
||
}
|
||
}
|
||
}
|
||
// Handle: export default Foo
|
||
else if (tsMorph.ts.isExportAssignment(statement)) {
|
||
if (tsMorph.ts.isIdentifier(statement.expression)) {
|
||
var name = statement.expression.text;
|
||
if (name !== '_default' && !this.isAngularInternalSymbol(name)) {
|
||
this.addSymbol(name, sourceFilePath);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
/**
|
||
* Add a symbol to the tracking map
|
||
*/
|
||
ApiMarkdownParser.prototype.addSymbol = function (symbolName, declarationFile) {
|
||
if (!this.symbolToFiles.has(symbolName)) {
|
||
this.symbolToFiles.set(symbolName, new Set());
|
||
}
|
||
this.symbolToFiles.get(symbolName).add(declarationFile);
|
||
logger.logger.debug("Tracked API markdown symbol: ".concat(symbolName, " from ").concat(declarationFile));
|
||
};
|
||
return ApiMarkdownParser;
|
||
}());
|
||
/**
|
||
* Parse public API exports from *.api.md files in the source root
|
||
*/
|
||
function parseApiMarkdownExports(sourceRoot) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var parser;
|
||
return logger.__generator(this, function (_a) {
|
||
switch (_a.label) {
|
||
case 0:
|
||
parser = new ApiMarkdownParser(sourceRoot);
|
||
return [4 /*yield*/, parser.parseApiMarkdownFiles()];
|
||
case 1: return [2 /*return*/, _a.sent()];
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
var fg = require('fast-glob');
|
||
var os = require('os');
|
||
var osName = require('os-name');
|
||
var pkg = require('../package.json');
|
||
var program = require('commander').program;
|
||
var cosmiconfigModuleName = 'compodoc';
|
||
var scannedFiles = [];
|
||
var excludeFiles = EXCLUDE_PATTERNS;
|
||
var includeFiles = [];
|
||
var cwd = process.cwd();
|
||
process.setMaxListeners(0);
|
||
var CliApplication = /** @class */ (function (_super) {
|
||
logger.__extends(CliApplication, _super);
|
||
function CliApplication() {
|
||
return _super !== null && _super.apply(this, arguments) || this;
|
||
}
|
||
/**
|
||
* Run compodoc from the command line.
|
||
*/
|
||
CliApplication.prototype.start = function () {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
function list(val) {
|
||
return val.split(',');
|
||
}
|
||
var outputHelp, configExplorer, configExplorerResult, configFile, programOptions, configFilePath, testConfigFilePath, packageData, parsedData, projectDevDependencies, tsProjectVersion, argv, testTsConfigPath, sourceFolder, testTsConfigPath_1, _file, tsConfigFile, stream;
|
||
var _this = this;
|
||
return logger.__generator(this, function (_a) {
|
||
switch (_a.label) {
|
||
case 0:
|
||
program
|
||
.version(pkg.version)
|
||
.usage('<src> [options]')
|
||
.option('-c, --config [config]', 'A configuration file : .compodocrc, .compodocrc.json, .compodocrc.yaml or compodoc property in package.json')
|
||
.option('-p, --tsconfig [config]', 'A tsconfig.json file')
|
||
.option('-d, --output [folder]', 'Where to store the generated documentation', COMPODOC_DEFAULTS.folder)
|
||
.option('-y, --extTheme [file]', 'External styling theme file')
|
||
.option('-n, --name [name]', 'Title documentation', COMPODOC_DEFAULTS.title)
|
||
.option('-a, --assetsFolder [folder]', 'External assets folder to copy in generated documentation folder')
|
||
.option('-o, --open [value]', 'Open the generated documentation')
|
||
.option('-t, --silent', "In silent mode, log messages aren't logged in the console", COMPODOC_DEFAULTS.silent)
|
||
.option('-s, --serve', 'Serve generated documentation (default http://localhost:8080/)', COMPODOC_DEFAULTS.serve)
|
||
.option('--host [host]', 'Change default host address')
|
||
.option('-r, --port [port]', 'Change default serving port', COMPODOC_DEFAULTS.port)
|
||
.option('-w, --watch', 'Watch source files after serve and force documentation rebuild', COMPODOC_DEFAULTS.watch)
|
||
.option('-e, --exportFormat [format]', 'Export in specified format (json, html)', COMPODOC_DEFAULTS.exportFormat)
|
||
.option('--files [files]', 'Files provided by external tool, used for coverage test')
|
||
.option('--language [language]', 'Language used for the generated documentation (bg-BG, de-DE, en-US, es-ES, fr-FR, hu-HU, it-IT, ja-JP, ka-GE, ko-KR, nl-NL, pl-PL, pt-BR, ru-RU, sk-SK, zh-CN, zh-TW)', COMPODOC_DEFAULTS.language)
|
||
.option('--theme [theme]', "Choose one of available themes, default is 'gitbook' (laravel, original, material, postmark, readthedocs, stripe, vagrant)")
|
||
.option('--hideGenerator', 'Do not print the Compodoc link at the bottom of the page', COMPODOC_DEFAULTS.hideGenerator)
|
||
.option('--hideDarkModeToggle', 'Do not show dark mode toggle button at the top right position of the page', COMPODOC_DEFAULTS.hideDarkModeToggle)
|
||
.option('--toggleMenuItems <items>', "Close by default items in the menu values : ['all'] or one of these ['modules','components','directives','controllers','entities','classes','injectables','guards','interfaces','interceptors','pipes','miscellaneous','additionalPages']", list, COMPODOC_DEFAULTS.toggleMenuItems)
|
||
.option('--navTabConfig <tab configs>', "List navigation tab objects in the desired order with two string properties (\"id\" and \"label\"). Double-quotes must be escaped with '\\'. Available tab IDs are \"info\", \"readme\", \"source\", \"templateData\", \"styleData\", \"tree\", and \"example\". Note: Certain tabs will only be shown if applicable to a given dependency", list, JSON.stringify(COMPODOC_DEFAULTS.navTabConfig))
|
||
.option('--templates [folder]', 'Path to directory of Handlebars templates to override built-in templates')
|
||
.option('--includes [path]', 'Path of external markdown files to include')
|
||
.option('--includesName [name]', 'Name of item menu of externals markdown files', COMPODOC_DEFAULTS.additionalEntryName)
|
||
.option('--coverageTest [threshold]', 'Test command of documentation coverage with a threshold (default 70)')
|
||
.option('--coverageMinimumPerFile [minimum]', 'Test command of documentation coverage per file with a minimum (default 0)')
|
||
.option('--coverageTestThresholdFail [true|false]', 'Test command of documentation coverage (global or per file) will fail with error or just warn user (true: error, false: warn)', COMPODOC_DEFAULTS.coverageTestThresholdFail)
|
||
.option('--coverageTestShowOnlyFailed', 'Display only failed files for a coverage test')
|
||
.option('--unitTestCoverage [json-summary]', 'To include unit test coverage, specify istanbul JSON coverage summary file')
|
||
.option('--disableSourceCode', 'Do not add source code tab and links to source code', COMPODOC_DEFAULTS.disableSourceCode)
|
||
.option('--disableDomTree', 'Do not add dom tree tab', COMPODOC_DEFAULTS.disableDomTree)
|
||
.option('--disableTemplateTab', 'Do not add template tab', COMPODOC_DEFAULTS.disableTemplateTab)
|
||
.option('--disableStyleTab', 'Do not add style tab', COMPODOC_DEFAULTS.disableStyleTab)
|
||
.option('--disableGraph', 'Do not add the dependency graph', COMPODOC_DEFAULTS.disableGraph)
|
||
.option('--disableCoverage', 'Do not add the documentation coverage report', COMPODOC_DEFAULTS.disableCoverage)
|
||
.option('--disablePrivate', 'Do not show private in generated documentation', COMPODOC_DEFAULTS.disablePrivate)
|
||
.option('--disableProtected', 'Do not show protected in generated documentation', COMPODOC_DEFAULTS.disableProtected)
|
||
.option('--disableInternal', 'Do not show @internal in generated documentation', COMPODOC_DEFAULTS.disableInternal)
|
||
.option('--disableLifeCycleHooks', 'Do not show Angular lifecycle hooks in generated documentation', COMPODOC_DEFAULTS.disableLifeCycleHooks)
|
||
.option('--disableConstructors', 'Do not show constructors in generated documentation', COMPODOC_DEFAULTS.disableConstructors)
|
||
.option('--disableRoutesGraph', 'Do not add the routes graph', COMPODOC_DEFAULTS.disableRoutesGraph)
|
||
.option('--disableSearch', 'Do not add the search input', COMPODOC_DEFAULTS.disableSearch)
|
||
.option('--disableDependencies', 'Do not add the dependencies list', COMPODOC_DEFAULTS.disableDependencies)
|
||
.option('--disableProperties', 'Do not add the properties list', COMPODOC_DEFAULTS.disableProperties)
|
||
.option('--disableFilePath', 'Do not add the file path', COMPODOC_DEFAULTS.disableFilePath)
|
||
.option('--disableOverview', 'Do not add the overview page', COMPODOC_DEFAULTS.disableOverview)
|
||
.option('--templatePlayground', 'Generate template playground page for customizing templates', false)
|
||
.option('--minimal', 'Minimal mode with only documentation. No search, no graph, no coverage.', COMPODOC_DEFAULTS.minimal)
|
||
.option('--customFavicon [path]', 'Use a custom favicon')
|
||
.option('--customLogo [path]', 'Use a custom logo')
|
||
.option('--gaID [id]', 'Google Analytics tracking ID')
|
||
.option('--gaSite [site]', 'Google Analytics site name', COMPODOC_DEFAULTS.gaSite)
|
||
.option('--publicApiOnly [path]', 'Document only symbols exported from index.d.ts files in the specified dist folder')
|
||
.option('--maxSearchResults [maxSearchResults]', 'Max search results on the results page. To show all results, set to 0', COMPODOC_DEFAULTS.maxSearchResults)
|
||
.allowExcessArguments()
|
||
.parse(process.argv);
|
||
outputHelp = function () {
|
||
program.outputHelp();
|
||
process.exit(1);
|
||
};
|
||
configExplorer = cosmiconfig.cosmiconfigSync(cosmiconfigModuleName);
|
||
configFile = {};
|
||
programOptions = program.opts();
|
||
if (programOptions.config) {
|
||
configFilePath = programOptions.config;
|
||
testConfigFilePath = configFilePath.match(process.cwd());
|
||
if (testConfigFilePath && testConfigFilePath.length > 0) {
|
||
configFilePath = configFilePath.replace(process.cwd() + path__namespace.sep, '');
|
||
}
|
||
configExplorerResult = configExplorer.load(path__namespace.resolve(configFilePath));
|
||
}
|
||
else {
|
||
configExplorerResult = configExplorer.search();
|
||
}
|
||
if (configExplorerResult) {
|
||
if (typeof configExplorerResult.config !== 'undefined') {
|
||
configFile = configExplorerResult.config;
|
||
}
|
||
}
|
||
if (configFile.output) {
|
||
Configuration$1.mainData.output = configFile.output;
|
||
}
|
||
if (programOptions.output && programOptions.output !== COMPODOC_DEFAULTS.folder) {
|
||
Configuration$1.mainData.output = programOptions.output;
|
||
}
|
||
if (configFile.extTheme) {
|
||
Configuration$1.mainData.extTheme = configFile.extTheme;
|
||
}
|
||
if (programOptions.extTheme) {
|
||
Configuration$1.mainData.extTheme = programOptions.extTheme;
|
||
}
|
||
if (configFile.language) {
|
||
Configuration$1.mainData.language = configFile.language;
|
||
}
|
||
if (programOptions.language) {
|
||
Configuration$1.mainData.language = programOptions.language;
|
||
}
|
||
if (configFile.theme) {
|
||
Configuration$1.mainData.theme = configFile.theme;
|
||
}
|
||
if (programOptions.theme) {
|
||
Configuration$1.mainData.theme = programOptions.theme;
|
||
}
|
||
if (configFile.name) {
|
||
Configuration$1.mainData.documentationMainName = configFile.name;
|
||
}
|
||
if (programOptions.name && programOptions.name !== COMPODOC_DEFAULTS.title) {
|
||
Configuration$1.mainData.documentationMainName = programOptions.name;
|
||
}
|
||
if (configFile.assetsFolder) {
|
||
Configuration$1.mainData.assetsFolder = configFile.assetsFolder;
|
||
}
|
||
if (programOptions.assetsFolder) {
|
||
Configuration$1.mainData.assetsFolder = programOptions.assetsFolder;
|
||
}
|
||
if (configFile.open) {
|
||
Configuration$1.mainData.open = configFile.open;
|
||
}
|
||
if (programOptions.open) {
|
||
Configuration$1.mainData.open = programOptions.open;
|
||
}
|
||
if (configFile.toggleMenuItems) {
|
||
Configuration$1.mainData.toggleMenuItems = configFile.toggleMenuItems;
|
||
}
|
||
if (programOptions.toggleMenuItems &&
|
||
programOptions.toggleMenuItems !== COMPODOC_DEFAULTS.toggleMenuItems) {
|
||
Configuration$1.mainData.toggleMenuItems = programOptions.toggleMenuItems;
|
||
}
|
||
if (configFile.templates) {
|
||
Configuration$1.mainData.templates = configFile.templates;
|
||
}
|
||
if (programOptions.templates) {
|
||
Configuration$1.mainData.templates = programOptions.templates;
|
||
}
|
||
if (configFile.navTabConfig) {
|
||
Configuration$1.mainData.navTabConfig = configFile.navTabConfig;
|
||
}
|
||
if (programOptions.navTabConfig &&
|
||
JSON.parse(programOptions.navTabConfig).length !== COMPODOC_DEFAULTS.navTabConfig.length) {
|
||
Configuration$1.mainData.navTabConfig = JSON.parse(programOptions.navTabConfig);
|
||
}
|
||
if (configFile.includes) {
|
||
Configuration$1.mainData.includes = configFile.includes;
|
||
}
|
||
if (programOptions.includes) {
|
||
Configuration$1.mainData.includes = programOptions.includes;
|
||
}
|
||
if (configFile.includesName) {
|
||
Configuration$1.mainData.includesName = configFile.includesName;
|
||
}
|
||
if (programOptions.includesName &&
|
||
programOptions.includesName !== COMPODOC_DEFAULTS.additionalEntryName) {
|
||
Configuration$1.mainData.includesName = programOptions.includesName;
|
||
}
|
||
if (configFile.silent) {
|
||
logger.logger.silent = false;
|
||
}
|
||
if (programOptions.silent) {
|
||
logger.logger.silent = false;
|
||
}
|
||
if (configFile.serve) {
|
||
Configuration$1.mainData.serve = configFile.serve;
|
||
}
|
||
if (programOptions.serve) {
|
||
Configuration$1.mainData.serve = programOptions.serve;
|
||
}
|
||
if (configFile.templatePlayground) {
|
||
Configuration$1.mainData.templatePlayground = configFile.templatePlayground;
|
||
}
|
||
if (programOptions.templatePlayground) {
|
||
Configuration$1.mainData.templatePlayground = programOptions.templatePlayground;
|
||
}
|
||
if (configFile.host) {
|
||
Configuration$1.mainData.host = configFile.host;
|
||
Configuration$1.mainData.hostname = configFile.host;
|
||
}
|
||
if (programOptions.host) {
|
||
Configuration$1.mainData.host = programOptions.host;
|
||
Configuration$1.mainData.hostname = programOptions.host;
|
||
}
|
||
if (configFile.port) {
|
||
Configuration$1.mainData.port = configFile.port;
|
||
}
|
||
if (programOptions.port && programOptions.port !== COMPODOC_DEFAULTS.port) {
|
||
Configuration$1.mainData.port = programOptions.port;
|
||
}
|
||
if (configFile.watch) {
|
||
Configuration$1.mainData.watch = configFile.watch;
|
||
}
|
||
if (programOptions.watch) {
|
||
Configuration$1.mainData.watch = programOptions.watch;
|
||
}
|
||
if (configFile.exportFormat) {
|
||
Configuration$1.mainData.exportFormat = configFile.exportFormat;
|
||
}
|
||
if (programOptions.exportFormat &&
|
||
programOptions.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
|
||
Configuration$1.mainData.exportFormat = programOptions.exportFormat;
|
||
}
|
||
if (configFile.hideGenerator) {
|
||
Configuration$1.mainData.hideGenerator = configFile.hideGenerator;
|
||
}
|
||
if (programOptions.hideGenerator) {
|
||
Configuration$1.mainData.hideGenerator = programOptions.hideGenerator;
|
||
}
|
||
if (configFile.hideDarkModeToggle) {
|
||
Configuration$1.mainData.hideDarkModeToggle = configFile.hideDarkModeToggle;
|
||
}
|
||
if (programOptions.hideDarkModeToggle) {
|
||
Configuration$1.mainData.hideDarkModeToggle = programOptions.hideDarkModeToggle;
|
||
}
|
||
if (configFile.coverageTest) {
|
||
Configuration$1.mainData.coverageTest = true;
|
||
Configuration$1.mainData.coverageTestThreshold =
|
||
typeof configFile.coverageTest === 'string'
|
||
? parseInt(configFile.coverageTest, 10)
|
||
: COMPODOC_DEFAULTS.defaultCoverageThreshold;
|
||
}
|
||
if (programOptions.coverageTest) {
|
||
Configuration$1.mainData.coverageTest = true;
|
||
Configuration$1.mainData.coverageTestThreshold =
|
||
typeof programOptions.coverageTest === 'string'
|
||
? parseInt(programOptions.coverageTest, 10)
|
||
: COMPODOC_DEFAULTS.defaultCoverageThreshold;
|
||
}
|
||
if (configFile.coverageMinimumPerFile) {
|
||
Configuration$1.mainData.coverageTestPerFile = true;
|
||
Configuration$1.mainData.coverageMinimumPerFile =
|
||
typeof configFile.coverageMinimumPerFile === 'string'
|
||
? parseInt(configFile.coverageMinimumPerFile, 10)
|
||
: COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
|
||
}
|
||
if (programOptions.coverageMinimumPerFile) {
|
||
Configuration$1.mainData.coverageTestPerFile = true;
|
||
Configuration$1.mainData.coverageMinimumPerFile =
|
||
typeof programOptions.coverageMinimumPerFile === 'string'
|
||
? parseInt(programOptions.coverageMinimumPerFile, 10)
|
||
: COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
|
||
}
|
||
if (configFile.coverageTestThresholdFail) {
|
||
Configuration$1.mainData.coverageTestThresholdFail =
|
||
configFile.coverageTestThresholdFail === 'false' ? false : true;
|
||
}
|
||
if (programOptions.coverageTestThresholdFail) {
|
||
Configuration$1.mainData.coverageTestThresholdFail =
|
||
programOptions.coverageTestThresholdFail === 'false' ? false : true;
|
||
}
|
||
if (configFile.coverageTestShowOnlyFailed) {
|
||
Configuration$1.mainData.coverageTestShowOnlyFailed =
|
||
configFile.coverageTestShowOnlyFailed;
|
||
}
|
||
if (programOptions.coverageTestShowOnlyFailed) {
|
||
Configuration$1.mainData.coverageTestShowOnlyFailed =
|
||
programOptions.coverageTestShowOnlyFailed;
|
||
}
|
||
if (configFile.unitTestCoverage) {
|
||
Configuration$1.mainData.unitTestCoverage = configFile.unitTestCoverage;
|
||
}
|
||
if (programOptions.unitTestCoverage) {
|
||
Configuration$1.mainData.unitTestCoverage = programOptions.unitTestCoverage;
|
||
}
|
||
if (configFile.disableSourceCode) {
|
||
Configuration$1.mainData.disableSourceCode = configFile.disableSourceCode;
|
||
}
|
||
if (programOptions.disableSourceCode) {
|
||
Configuration$1.mainData.disableSourceCode = programOptions.disableSourceCode;
|
||
}
|
||
if (configFile.disableDomTree) {
|
||
Configuration$1.mainData.disableDomTree = configFile.disableDomTree;
|
||
}
|
||
if (programOptions.disableDomTree) {
|
||
Configuration$1.mainData.disableDomTree = programOptions.disableDomTree;
|
||
}
|
||
if (configFile.disableTemplateTab) {
|
||
Configuration$1.mainData.disableTemplateTab = configFile.disableTemplateTab;
|
||
}
|
||
if (programOptions.disableTemplateTab) {
|
||
Configuration$1.mainData.disableTemplateTab = programOptions.disableTemplateTab;
|
||
}
|
||
if (configFile.disableStyleTab) {
|
||
Configuration$1.mainData.disableStyleTab = configFile.disableStyleTab;
|
||
}
|
||
if (programOptions.disableStyleTab) {
|
||
Configuration$1.mainData.disableStyleTab = programOptions.disableStyleTab;
|
||
}
|
||
if (configFile.disableGraph) {
|
||
Configuration$1.mainData.disableGraph = configFile.disableGraph;
|
||
}
|
||
if (programOptions.disableGraph) {
|
||
Configuration$1.mainData.disableGraph = programOptions.disableGraph;
|
||
}
|
||
if (configFile.disableCoverage) {
|
||
Configuration$1.mainData.disableCoverage = configFile.disableCoverage;
|
||
}
|
||
if (programOptions.disableCoverage) {
|
||
Configuration$1.mainData.disableCoverage = programOptions.disableCoverage;
|
||
}
|
||
if (configFile.disablePrivate) {
|
||
Configuration$1.mainData.disablePrivate = configFile.disablePrivate;
|
||
}
|
||
if (programOptions.disablePrivate) {
|
||
Configuration$1.mainData.disablePrivate = programOptions.disablePrivate;
|
||
}
|
||
if (configFile.disableProtected) {
|
||
Configuration$1.mainData.disableProtected = configFile.disableProtected;
|
||
}
|
||
if (programOptions.disableProtected) {
|
||
Configuration$1.mainData.disableProtected = programOptions.disableProtected;
|
||
}
|
||
if (configFile.disableInternal) {
|
||
Configuration$1.mainData.disableInternal = configFile.disableInternal;
|
||
}
|
||
if (programOptions.disableInternal) {
|
||
Configuration$1.mainData.disableInternal = programOptions.disableInternal;
|
||
}
|
||
if (configFile.disableLifeCycleHooks) {
|
||
Configuration$1.mainData.disableLifeCycleHooks = configFile.disableLifeCycleHooks;
|
||
}
|
||
if (programOptions.disableLifeCycleHooks) {
|
||
Configuration$1.mainData.disableLifeCycleHooks = programOptions.disableLifeCycleHooks;
|
||
}
|
||
if (configFile.disableConstructors) {
|
||
Configuration$1.mainData.disableConstructors = configFile.disableConstructors;
|
||
}
|
||
if (programOptions.disableConstructors) {
|
||
Configuration$1.mainData.disableConstructors = programOptions.disableConstructors;
|
||
}
|
||
if (configFile.disableRoutesGraph) {
|
||
Configuration$1.mainData.disableRoutesGraph = configFile.disableRoutesGraph;
|
||
}
|
||
if (programOptions.disableRoutesGraph) {
|
||
Configuration$1.mainData.disableRoutesGraph = programOptions.disableRoutesGraph;
|
||
}
|
||
if (configFile.disableSearch) {
|
||
Configuration$1.mainData.disableSearch = configFile.disableSearch;
|
||
}
|
||
if (programOptions.disableSearch) {
|
||
Configuration$1.mainData.disableSearch = programOptions.disableSearch;
|
||
}
|
||
if (configFile.disableDependencies) {
|
||
Configuration$1.mainData.disableDependencies = configFile.disableDependencies;
|
||
}
|
||
if (programOptions.disableDependencies) {
|
||
Configuration$1.mainData.disableDependencies = programOptions.disableDependencies;
|
||
}
|
||
if (configFile.disableProperties) {
|
||
Configuration$1.mainData.disableProperties = configFile.disableProperties;
|
||
}
|
||
if (programOptions.disableProperties) {
|
||
Configuration$1.mainData.disableProperties = programOptions.disableProperties;
|
||
}
|
||
if (configFile.disableFilePath) {
|
||
Configuration$1.mainData.disableFilePath = configFile.disableFilePath;
|
||
}
|
||
if (programOptions.disableFilePath) {
|
||
Configuration$1.mainData.disableFilePath = programOptions.disableFilePath;
|
||
}
|
||
if (configFile.disableOverview) {
|
||
Configuration$1.mainData.disableOverview = configFile.disableOverview;
|
||
}
|
||
if (programOptions.disableOverview) {
|
||
Configuration$1.mainData.disableOverview = programOptions.disableOverview;
|
||
}
|
||
if (configFile.minimal) {
|
||
Configuration$1.mainData.disableSearch = true;
|
||
Configuration$1.mainData.disableRoutesGraph = true;
|
||
Configuration$1.mainData.disableGraph = true;
|
||
Configuration$1.mainData.disableCoverage = true;
|
||
}
|
||
if (programOptions.minimal) {
|
||
Configuration$1.mainData.disableSearch = true;
|
||
Configuration$1.mainData.disableRoutesGraph = true;
|
||
Configuration$1.mainData.disableGraph = true;
|
||
Configuration$1.mainData.disableCoverage = true;
|
||
}
|
||
if (configFile.customFavicon) {
|
||
Configuration$1.mainData.customFavicon = configFile.customFavicon;
|
||
}
|
||
if (programOptions.customFavicon) {
|
||
Configuration$1.mainData.customFavicon = programOptions.customFavicon;
|
||
}
|
||
if (configFile.customLogo) {
|
||
Configuration$1.mainData.customLogo = configFile.customLogo;
|
||
}
|
||
if (programOptions.customLogo) {
|
||
Configuration$1.mainData.customLogo = programOptions.customLogo;
|
||
}
|
||
if (configFile.gaID) {
|
||
Configuration$1.mainData.gaID = configFile.gaID;
|
||
}
|
||
if (programOptions.gaID) {
|
||
Configuration$1.mainData.gaID = programOptions.gaID;
|
||
}
|
||
if (configFile.gaSite) {
|
||
Configuration$1.mainData.gaSite = configFile.gaSite;
|
||
}
|
||
if (programOptions.gaSite && programOptions.gaSite !== COMPODOC_DEFAULTS.gaSite) {
|
||
Configuration$1.mainData.gaSite = programOptions.gaSite;
|
||
}
|
||
if (configFile.publicApiOnly) {
|
||
Configuration$1.mainData.publicApiOnly = configFile.publicApiOnly;
|
||
}
|
||
if (programOptions.publicApiOnly) {
|
||
Configuration$1.mainData.publicApiOnly = programOptions.publicApiOnly;
|
||
}
|
||
if (!this.isWatching) {
|
||
if (!logger.logger.silent) {
|
||
console.log("Compodoc v".concat(pkg.version));
|
||
}
|
||
else {
|
||
console.log(fs__namespace.readFileSync(path__namespace.join(__dirname, '../src/banner')).toString());
|
||
console.log(pkg.version);
|
||
console.log('');
|
||
console.log("TypeScript version used by Compodoc : ".concat(tsMorph.ts.version));
|
||
console.log('');
|
||
if (FileEngine$1.existsSync(cwd + path__namespace.sep + 'package.json')) {
|
||
packageData = FileEngine$1.getSync(cwd + path__namespace.sep + 'package.json');
|
||
if (packageData) {
|
||
parsedData = JSON.parse(packageData);
|
||
projectDevDependencies = parsedData.devDependencies;
|
||
if (projectDevDependencies && projectDevDependencies.typescript) {
|
||
tsProjectVersion = AngularVersionUtil$1.cleanVersion(projectDevDependencies.typescript);
|
||
console.log("TypeScript version of current project : ".concat(tsProjectVersion));
|
||
console.log('');
|
||
}
|
||
}
|
||
}
|
||
console.log("Node.js version : ".concat(process.version));
|
||
console.log('');
|
||
console.log("Operating system : ".concat(osName(os.platform(), os.release())));
|
||
console.log('');
|
||
}
|
||
}
|
||
if (configExplorerResult) {
|
||
if (typeof configExplorerResult.config !== 'undefined') {
|
||
logger.logger.info("Using configuration file : ".concat(configExplorerResult.filepath));
|
||
}
|
||
}
|
||
if (!configExplorerResult) {
|
||
logger.logger.warn("No configuration file found, switching to CLI flags.");
|
||
}
|
||
if (programOptions.language && !I18nEngine$1.supportLanguage(programOptions.language)) {
|
||
logger.logger.warn("The language ".concat(programOptions.language, " is not available, falling back to ").concat(I18nEngine$1.fallbackLanguage));
|
||
}
|
||
if (programOptions.tsconfig && typeof programOptions.tsconfig === 'boolean') {
|
||
logger.logger.error("Please provide a tsconfig file.");
|
||
process.exit(1);
|
||
}
|
||
if (configFile.tsconfig) {
|
||
Configuration$1.mainData.tsconfig = configFile.tsconfig;
|
||
}
|
||
if (programOptions.tsconfig) {
|
||
Configuration$1.mainData.tsconfig = programOptions.tsconfig;
|
||
}
|
||
if (programOptions.maxSearchResults) {
|
||
Configuration$1.mainData.maxSearchResults = programOptions.maxSearchResults;
|
||
}
|
||
if (configFile.files) {
|
||
scannedFiles = configFile.files;
|
||
}
|
||
if (configFile.exclude) {
|
||
excludeFiles = configFile.exclude;
|
||
}
|
||
if (configFile.include) {
|
||
includeFiles = configFile.include;
|
||
}
|
||
argv = require('minimist')(process.argv.slice(2));
|
||
if (argv && argv.files) {
|
||
Configuration$1.mainData.hasFilesToCoverage = true;
|
||
if (typeof argv.files === 'string') {
|
||
_super.prototype.setFiles.call(this, [argv.files]);
|
||
}
|
||
else {
|
||
_super.prototype.setFiles.call(this, argv.files);
|
||
}
|
||
}
|
||
if (!(programOptions.serve && !Configuration$1.mainData.tsconfig && programOptions.output)) return [3 /*break*/, 1];
|
||
// if -s & -d, serve it
|
||
if (!FileEngine$1.existsSync(Configuration$1.mainData.output)) {
|
||
logger.logger.error("".concat(Configuration$1.mainData.output, " folder doesn't exist"));
|
||
process.exit(1);
|
||
}
|
||
else {
|
||
logger.logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(programOptions.port));
|
||
_super.prototype.runWebServer.call(this, Configuration$1.mainData.output);
|
||
}
|
||
return [3 /*break*/, 9];
|
||
case 1:
|
||
if (!(programOptions.serve &&
|
||
!Configuration$1.mainData.tsconfig &&
|
||
!programOptions.output)) return [3 /*break*/, 2];
|
||
// if only -s find ./documentation, if ok serve, else error provide -d
|
||
if (!FileEngine$1.existsSync(Configuration$1.mainData.output)) {
|
||
logger.logger.error('Provide output generated folder with -d flag');
|
||
process.exit(1);
|
||
}
|
||
else {
|
||
logger.logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(programOptions.port));
|
||
_super.prototype.runWebServer.call(this, Configuration$1.mainData.output);
|
||
}
|
||
return [3 /*break*/, 9];
|
||
case 2:
|
||
if (!Configuration$1.mainData.hasFilesToCoverage) return [3 /*break*/, 3];
|
||
if (programOptions.coverageMinimumPerFile) {
|
||
logger.logger.info('Run documentation coverage test for files');
|
||
_super.prototype.testCoverage.call(this);
|
||
}
|
||
else {
|
||
logger.logger.error('Missing coverage configuration');
|
||
}
|
||
return [3 /*break*/, 9];
|
||
case 3:
|
||
if (programOptions.hideGenerator) {
|
||
Configuration$1.mainData.hideGenerator = true;
|
||
}
|
||
if (!Configuration$1.mainData.tsconfig) return [3 /*break*/, 8];
|
||
testTsConfigPath = Configuration$1.mainData.tsconfig.indexOf(process.cwd());
|
||
if (testTsConfigPath !== -1) {
|
||
Configuration$1.mainData.tsconfig = Configuration$1.mainData.tsconfig.replace(process.cwd() + path__namespace.sep, '');
|
||
}
|
||
sourceFolder = void 0;
|
||
if (program.args.length > 0) {
|
||
testTsConfigPath_1 = Configuration$1.mainData.tsconfig.indexOf(process.cwd());
|
||
if (testTsConfigPath_1 !== -1) {
|
||
Configuration$1.mainData.tsconfig = Configuration$1.mainData.tsconfig.replace(process.cwd() + path__namespace.sep, '');
|
||
}
|
||
sourceFolder = program.args[0];
|
||
if (!FileEngine$1.existsSync(sourceFolder)) {
|
||
logger.logger.error("Provided source folder ".concat(sourceFolder, " was not found in the current directory"));
|
||
process.exit(1);
|
||
}
|
||
else {
|
||
logger.logger.info('Using provided source folder');
|
||
}
|
||
}
|
||
if (!!FileEngine$1.existsSync(Configuration$1.mainData.tsconfig)) return [3 /*break*/, 4];
|
||
logger.logger.error("\"".concat(Configuration$1.mainData.tsconfig, "\" file was not found in the current directory"));
|
||
process.exit(1);
|
||
return [3 /*break*/, 7];
|
||
case 4:
|
||
_file = path__namespace.join(path__namespace.join(process.cwd(), path__namespace.dirname(Configuration$1.mainData.tsconfig)), path__namespace.basename(Configuration$1.mainData.tsconfig));
|
||
// use the current directory of tsconfig.json as a working directory
|
||
cwd = _file.split(path__namespace.sep).slice(0, -1).join(path__namespace.sep);
|
||
logger.logger.info('Using tsconfig file ', _file);
|
||
tsConfigFile = readConfig(_file);
|
||
if (tsConfigFile.files) {
|
||
scannedFiles = tsConfigFile.files;
|
||
// Normalize path of these files
|
||
scannedFiles = scannedFiles.map(function (scannedFile) {
|
||
return cwd + path__namespace.sep + scannedFile;
|
||
});
|
||
}
|
||
// even if files are supplied with "files" attributes, enhance the array with includes
|
||
excludeFiles = logger.__spreadArray(logger.__spreadArray([], logger.__read(excludeFiles), false), logger.__read((tsConfigFile.exclude || [])), false);
|
||
includeFiles = logger.__spreadArray(logger.__spreadArray([], logger.__read(includeFiles), false), logger.__read((tsConfigFile.include || [])), false);
|
||
if (scannedFiles.length > 0) {
|
||
includeFiles = logger.__spreadArray(logger.__spreadArray([], logger.__read(includeFiles), false), logger.__read(scannedFiles), false);
|
||
}
|
||
if (!includeFiles.length) {
|
||
includeFiles = INCLUDE_PATTERNS;
|
||
}
|
||
if (!Configuration$1.mainData.publicApiOnly) return [3 /*break*/, 6];
|
||
return [4 /*yield*/, this.processPublicApi(Configuration$1.mainData.publicApiOnly, cwd)];
|
||
case 5:
|
||
_a.sent();
|
||
_a.label = 6;
|
||
case 6:
|
||
stream = fg.stream(includeFiles, {
|
||
cwd: sourceFolder || cwd,
|
||
ignore: excludeFiles,
|
||
absolute: true
|
||
});
|
||
stream.on('data', function (file) {
|
||
if (path__namespace.extname(file) === '.ts' || path__namespace.extname(file) === '.tsx') {
|
||
logger.logger.debug('Including', file);
|
||
scannedFiles.push(file);
|
||
}
|
||
else {
|
||
logger.logger.warn('Excluding', file);
|
||
}
|
||
});
|
||
stream.on('end', function () {
|
||
_super.prototype.setFiles.call(_this, scannedFiles);
|
||
if (programOptions.coverageTest || programOptions.coverageTestPerFile) {
|
||
logger.logger.info('Run documentation coverage test');
|
||
_super.prototype.testCoverage.call(_this);
|
||
}
|
||
else {
|
||
_super.prototype.generate.call(_this);
|
||
}
|
||
});
|
||
_a.label = 7;
|
||
case 7: return [3 /*break*/, 9];
|
||
case 8:
|
||
logger.logger.error('tsconfig.json file was not found, please use -p flag');
|
||
outputHelp();
|
||
_a.label = 9;
|
||
case 9: return [2 /*return*/];
|
||
}
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Process public API exports from dist folder or API markdown files
|
||
*/
|
||
CliApplication.prototype.processPublicApi = function (distPath, sourceRoot) {
|
||
return logger.__awaiter(this, void 0, void 0, function () {
|
||
var apiMarkdownExports, symbolToSourceFiles, _a, _b, _c, symbolName, sourceFiles, sourceFile, publicApiExports, mapper, symbolToSourceFiles, _d, _e, _f, symbolName, declFiles, sourceFiles, declFiles_1, declFiles_1_1, declFile, sourceFile, error_1;
|
||
var e_1, _g, e_2, _h, e_3, _j;
|
||
return logger.__generator(this, function (_k) {
|
||
switch (_k.label) {
|
||
case 0:
|
||
logger.logger.info('Processing public API exports');
|
||
_k.label = 1;
|
||
case 1:
|
||
_k.trys.push([1, 6, , 7]);
|
||
// First, try to parse API markdown files from the source root
|
||
logger.logger.info('Checking for *.api.md files in source root');
|
||
return [4 /*yield*/, parseApiMarkdownExports(sourceRoot)];
|
||
case 2:
|
||
apiMarkdownExports = _k.sent();
|
||
if (!(apiMarkdownExports.apiMdFiles.size > 0 && apiMarkdownExports.symbolToFiles.size > 0)) return [3 /*break*/, 3];
|
||
logger.logger.info("Found ".concat(apiMarkdownExports.apiMdFiles.size, " relevant *.api.md file(s) with ").concat(apiMarkdownExports.symbolToFiles.size, " symbol(s)"));
|
||
symbolToSourceFiles = new Map();
|
||
try {
|
||
for (_a = logger.__values(apiMarkdownExports.symbolToFiles), _b = _a.next(); !_b.done; _b = _a.next()) {
|
||
_c = logger.__read(_b.value, 1), symbolName = _c[0];
|
||
sourceFiles = new Set();
|
||
sourceFile = this.findSourceFileForSymbol(symbolName, sourceRoot);
|
||
if (sourceFile) {
|
||
sourceFiles.add(sourceFile);
|
||
}
|
||
if (sourceFiles.size > 0) {
|
||
symbolToSourceFiles.set(symbolName, sourceFiles);
|
||
logger.logger.debug("Public API symbol: ".concat(symbolName, " -> ").concat(Array.from(sourceFiles).join(', ')));
|
||
}
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (_b && !_b.done && (_g = _a.return)) _g.call(_a);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
// Store in configuration
|
||
Configuration$1.mainData.publicApiExports = symbolToSourceFiles;
|
||
logger.logger.info("Loaded ".concat(symbolToSourceFiles.size, " public API symbol(s) from ").concat(apiMarkdownExports.apiMdFiles.size, " *.api.md file(s) (using API Markdown parser)"));
|
||
return [3 /*break*/, 5];
|
||
case 3:
|
||
// Fall back to index.d.ts parsing
|
||
logger.logger.info('No relevant *.api.md files found, falling back to index.d.ts parsing');
|
||
return [4 /*yield*/, parsePublicApi(distPath)];
|
||
case 4:
|
||
publicApiExports = _k.sent();
|
||
if (publicApiExports.symbolToFiles.size === 0) {
|
||
logger.logger.warn('No public API exports found in dist folder. Documentation will be empty.');
|
||
return [2 /*return*/];
|
||
}
|
||
mapper = createSourcePathMapper(distPath, sourceRoot);
|
||
symbolToSourceFiles = new Map();
|
||
try {
|
||
for (_d = logger.__values(publicApiExports.symbolToFiles), _e = _d.next(); !_e.done; _e = _d.next()) {
|
||
_f = logger.__read(_e.value, 2), symbolName = _f[0], declFiles = _f[1];
|
||
sourceFiles = new Set();
|
||
try {
|
||
for (declFiles_1 = (e_3 = void 0, logger.__values(declFiles)), declFiles_1_1 = declFiles_1.next(); !declFiles_1_1.done; declFiles_1_1 = declFiles_1.next()) {
|
||
declFile = declFiles_1_1.value;
|
||
sourceFile = mapper.mapDistToSource(declFile);
|
||
if (sourceFile) {
|
||
sourceFiles.add(sourceFile);
|
||
}
|
||
}
|
||
}
|
||
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
||
finally {
|
||
try {
|
||
if (declFiles_1_1 && !declFiles_1_1.done && (_j = declFiles_1.return)) _j.call(declFiles_1);
|
||
}
|
||
finally { if (e_3) throw e_3.error; }
|
||
}
|
||
if (sourceFiles.size > 0) {
|
||
symbolToSourceFiles.set(symbolName, sourceFiles);
|
||
logger.logger.debug("Public API symbol: ".concat(symbolName, " -> ").concat(Array.from(sourceFiles).join(', ')));
|
||
}
|
||
}
|
||
}
|
||
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
||
finally {
|
||
try {
|
||
if (_e && !_e.done && (_h = _d.return)) _h.call(_d);
|
||
}
|
||
finally { if (e_2) throw e_2.error; }
|
||
}
|
||
// Store in configuration
|
||
Configuration$1.mainData.publicApiExports = symbolToSourceFiles;
|
||
logger.logger.info("Loaded ".concat(symbolToSourceFiles.size, " public API symbol(s) from ").concat(publicApiExports.indexFiles.size, " index.d.ts file(s) (using index.d.ts parser)"));
|
||
_k.label = 5;
|
||
case 5: return [3 /*break*/, 7];
|
||
case 6:
|
||
error_1 = _k.sent();
|
||
logger.logger.error('Error processing public API:', error_1);
|
||
throw error_1;
|
||
case 7: return [2 /*return*/];
|
||
}
|
||
});
|
||
});
|
||
};
|
||
/**
|
||
* Find the source file for a given symbol by searching through the source files
|
||
*/
|
||
CliApplication.prototype.findSourceFileForSymbol = function (symbolName, sourceRoot) {
|
||
var e_4, _a, e_5, _b;
|
||
// Try to find the symbol in source files
|
||
// This is a simplified approach - look for files that contain the symbol export
|
||
var sourceFolder = sourceRoot;
|
||
try {
|
||
var files = fg.sync(path__namespace.join(sourceFolder, '**/*.ts'), {
|
||
ignore: ['**/node_modules/**', '**/*.spec.ts', '**/*.d.ts']
|
||
});
|
||
try {
|
||
for (var files_1 = logger.__values(files), files_1_1 = files_1.next(); !files_1_1.done; files_1_1 = files_1.next()) {
|
||
var file = files_1_1.value;
|
||
var content = fs__namespace.readFileSync(file, 'utf-8');
|
||
// Look for export patterns that match the symbol name
|
||
var patterns = [
|
||
"export class ".concat(symbolName),
|
||
"export interface ".concat(symbolName),
|
||
"export const ".concat(symbolName),
|
||
"export function ".concat(symbolName),
|
||
"export type ".concat(symbolName),
|
||
"export enum ".concat(symbolName),
|
||
"export { ".concat(symbolName),
|
||
"export default ".concat(symbolName)
|
||
];
|
||
try {
|
||
for (var patterns_1 = (e_5 = void 0, logger.__values(patterns)), patterns_1_1 = patterns_1.next(); !patterns_1_1.done; patterns_1_1 = patterns_1.next()) {
|
||
var pattern = patterns_1_1.value;
|
||
if (content.includes(pattern)) {
|
||
return file;
|
||
}
|
||
}
|
||
}
|
||
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
||
finally {
|
||
try {
|
||
if (patterns_1_1 && !patterns_1_1.done && (_b = patterns_1.return)) _b.call(patterns_1);
|
||
}
|
||
finally { if (e_5) throw e_5.error; }
|
||
}
|
||
}
|
||
}
|
||
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
||
finally {
|
||
try {
|
||
if (files_1_1 && !files_1_1.done && (_a = files_1.return)) _a.call(files_1);
|
||
}
|
||
finally { if (e_4) throw e_4.error; }
|
||
}
|
||
}
|
||
catch (error) {
|
||
logger.logger.debug("Error searching for symbol ".concat(symbolName, ": ").concat(error));
|
||
}
|
||
return null;
|
||
};
|
||
return CliApplication;
|
||
}(Application));
|
||
|
||
exports.Application = Application;
|
||
exports.CliApplication = CliApplication;
|
||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtY2xpLWo1OHVzOHpVLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZGVmYXVsdHMudHMiLCIuLi9zcmMvYXBwL2NvbmZpZ3VyYXRpb24udHMiLCIuLi9zcmMvdXRpbHMvYW5ndWxhci1hcGkudXRpbC50cyIsIi4uL3NyYy91dGlscy9saW5rLXBhcnNlci50cyIsIi4uL3NyYy91dGlscy9hbmd1bGFyLWxpZmVjeWNsZXMtaG9va3MudHMiLCIuLi9zcmMvdXRpbHMva2luZC10by10eXBlLnRzIiwiLi4vc3JjL3V0aWxzL3RzLWludGVybmFsLnRzIiwiLi4vc3JjL3V0aWxzL2pzZG9jLXBhcnNlci51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL21hcmtlZC5hY2wudHMiLCIuLi9zcmMvdXRpbHMvdXRpbHMudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvZGVwZW5kZW5jaWVzLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9maWxlLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9leHBvcnQtanNvbi5lbmdpbmUudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvZXhwb3J0LmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2JyZWFrLWNvbW1hLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2JyZWFrLWxpbmVzLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2NhcGl0YWxpemUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvY2xlYW4tcGFyYWdyYXBoLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2NvbXBhcmUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZGVidWcuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZWxlbWVudC1hbG9uZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9lc2NhcGUtc2ltcGxlLXF1b3RlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2ZpbHRlci1hbmd1bGFyMi1tb2R1bGVzLmhlbHBlci50cyIsIi4uL3NyYy91dGlscy9hbmd1bGFyLXZlcnNpb24udXRpbC50cyIsIi4uL3NyYy91dGlscy9iYXNpYy10eXBlLnV0aWwudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9mdW5jdGlvbi1zaWduYXR1cmUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaGFzLW93bi5oZWxwZXIudHMiLCIuLi9zcmMvbG9jYWxlcy9iZy1CRy50cyIsIi4uL3NyYy9sb2NhbGVzL2RlLURFLnRzIiwiLi4vc3JjL2xvY2FsZXMvZW4tVVMudHMiLCIuLi9zcmMvbG9jYWxlcy9lcy1FUy50cyIsIi4uL3NyYy9sb2NhbGVzL2ZyLUZSLnRzIiwiLi4vc3JjL2xvY2FsZXMvaHUtSFUudHMiLCIuLi9zcmMvbG9jYWxlcy9pdC1JVC50cyIsIi4uL3NyYy9sb2NhbGVzL2phLUpQLnRzIiwiLi4vc3JjL2xvY2FsZXMva2EtR0UudHMiLCIuLi9zcmMvbG9jYWxlcy9rby1LUi50cyIsIi4uL3NyYy9sb2NhbGVzL25sLU5MLnRzIiwiLi4vc3JjL2xvY2FsZXMvcGwtUEwudHMiLCIuLi9zcmMvbG9jYWxlcy9wdC1CUi50cyIsIi4uL3NyYy9sb2NhbGVzL3J1LVJVLnRzIiwiLi4vc3JjL2xvY2FsZXMvc2stU0sudHMiLCIuLi9zcmMvbG9jYWxlcy96aC1DTi50cyIsIi4uL3NyYy9sb2NhbGVzL3poLVRXLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2kxOG4uZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaTE4bi5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pZi1zdHJpbmcuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaW5kZXhhYmxlLXNpZ25hdHVyZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pcy1pbml0aWFsLXRhYi5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pcy1ub3QtdG9nZ2xlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2lzLXRhYi1lbmFibGVkLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWNvZGUtZXhhbXBsZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1kZWZhdWx0LmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWV4YW1wbGUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtcGFyYW1zLXZhbGlkLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXBhcmFtcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1yZXR1cm5zLWNvbW1lbnQuaGVscGVyLnRzIiwiLi4vc3JjL3V0aWxzL2ltcG9ydHMudXRpbC50cyIsIi4uL3NyYy91dGlscy9yb3V0ZXItcGFyc2VyLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvaXMtbW9kdWxlLXdpdGgtcHJvdmlkZXJzLnRzIiwiLi4vc3JjL3V0aWxzL2dldC1tb2R1bGUtd2l0aC1wcm92aWRlcnMudHMiLCIuLi9zcmMvdXRpbHMvcHVibGljLWFwaS1wYXJzZXIudXRpbC50cyIsIi4uL3NyYy91dGlscy9zb3VyY2UtcGF0aC1tYXBwZXIudXRpbC50cyIsIi4uL3NyYy91dGlscy9leHRlbmRzLW1lcmdlci51dGlsLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvbGluay10eXBlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWljb24uaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvbW9kaWYta2luZC1oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9vYmplY3QtbGVuZ3RoLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL29iamVjdC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9vbmUtcGFyYW1ldGVyLWhhcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9vci1sZW5ndGguaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvb3IuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcGFyc2UtZGVzY3JpcHRpb24uaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcGFyc2UtcHJvcGVydHkuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcmVsYXRpdmUtdXJsLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL3Nob3J0LXVybC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9zdHJpcC11cmwuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaWYtZXF1YWwtc3RyaW5nLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLmVuZ2luZS5oZWxwZXJzLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwuZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL21hcmtkb3duLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9uZ2QuZW5naW5lLnRzIiwiLi4vc3JjL3V0aWxzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9zZWFyY2guZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2NvbXBvbmVudHMtdHJlZS5lbmdpbmUudHMiLCIuLi9zcmMvdXRpbHMvYXJyb3ctZnVuY3Rpb24udXRpbC50cyIsIi4uL3NyYy91dGlscy9vYmplY3QtbGl0ZXJhbC1leHByZXNzaW9uLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvbm9kZS51dGlsLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9jbGFzcy1oZWxwZXIudHMiLCIuLi9zcmMvdXRpbHMvdHMtcHJpbnRlci51dGlsLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9zeW1ib2wtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9jb21wb25lbnQtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9mcmFtZXdvcmstZGVwZW5kZW5jaWVzLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2NvZGUtZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvY29tcG9uZW50LWRlcC5mYWN0b3J5LnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvY29udHJvbGxlci1kZXAuZmFjdG9yeS50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL2RpcmVjdGl2ZS1kZXAuZmFjdG9yeS50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL2hlbHBlcnMvanMtZG9jLWhlbHBlci50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL2hlbHBlcnMvbW9kdWxlLWhlbHBlci50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL21vZHVsZS1kZXAuZmFjdG9yeS50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL2VudGl0eS1kZXAuZmFjdG9yeS50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci1kZXBlbmRlbmNpZXMudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXJqcy1kZXBlbmRlbmNpZXMudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZS1zZXF1ZW50aWFsLnRzIiwiLi4vc3JjL2FwcC9hcHBsaWNhdGlvbi50cyIsIi4uL3NyYy91dGlscy9hcGktbWFya2Rvd24tcGFyc2VyLnV0aWwudHMiLCIuLi9zcmMvaW5kZXgtY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBDT01QT0RPQ19ERUZBVUxUUyA9IHtcbiAgICB0aXRsZTogJ0FwcGxpY2F0aW9uIGRvY3VtZW50YXRpb24nLFxuICAgIGFkZGl0aW9uYWxFbnRyeU5hbWU6ICdBZGRpdGlvbmFsIGRvY3VtZW50YXRpb24nLFxuICAgIGFkZGl0aW9uYWxFbnRyeVBhdGg6ICdhZGRpdGlvbmFsLWRvY3VtZW50YXRpb24nLFxuICAgIGZvbGRlcjogJy4vZG9jdW1lbnRhdGlvbi8nLFxuICAgIGhvc3RuYW1lOiAnMTI3LjAuMC4xJyxcbiAgICBwb3J0OiA4MDgwLFxuICAgIHRoZW1lOiAnZ2l0Ym9vaycsXG4gICAgZXhwb3J0Rm9ybWF0OiAnaHRtbCcsXG4gICAgZXhwb3J0Rm9ybWF0c1N1cHBvcnRlZDogWydodG1sJywgJ2pzb24nXSxcbiAgICBiYXNlOiAnLycsXG4gICAgZGVmYXVsdENvdmVyYWdlVGhyZXNob2xkOiA3MCxcbiAgICBkZWZhdWx0Q292ZXJhZ2VNaW5pbXVtUGVyRmlsZTogMCxcbiAgICBjb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsOiB0cnVlLFxuICAgIHRvZ2dsZU1lbnVJdGVtczogWydhbGwnXSxcbiAgICBuYXZUYWJDb25maWc6IFtdLFxuICAgIGRpc2FibGVTZWFyY2g6IGZhbHNlLFxuICAgIGRpc2FibGVTb3VyY2VDb2RlOiBmYWxzZSxcbiAgICBkaXNhYmxlRG9tVHJlZTogZmFsc2UsXG4gICAgZGlzYWJsZVRlbXBsYXRlVGFiOiBmYWxzZSxcbiAgICBkaXNhYmxlU3R5bGVUYWI6IGZhbHNlLFxuICAgIGRpc2FibGVHcmFwaDogZmFsc2UsXG4gICAgZGlzYWJsZU1haW5HcmFwaDogZmFsc2UsXG4gICAgZGlzYWJsZUNvdmVyYWdlOiBmYWxzZSxcbiAgICBkaXNhYmxlUHJpdmF0ZTogZmFsc2UsXG4gICAgZGlzYWJsZVByb3RlY3RlZDogZmFsc2UsXG4gICAgZGlzYWJsZUludGVybmFsOiBmYWxzZSxcbiAgICBkaXNhYmxlTGlmZUN5Y2xlSG9va3M6IGZhbHNlLFxuICAgIGRpc2FibGVDb25zdHJ1Y3RvcnM6IGZhbHNlLFxuICAgIGRpc2FibGVSb3V0ZXNHcmFwaDogZmFsc2UsXG4gICAgZGlzYWJsZURlcGVuZGVuY2llczogZmFsc2UsXG4gICAgZGlzYWJsZVByb3BlcnRpZXM6IGZhbHNlLFxuICAgIGRpc2FibGVGaWxlUGF0aDogZmFsc2UsXG4gICAgZGlzYWJsZU92ZXJ2aWV3OiBmYWxzZSxcbiAgICBoaWRlR2VuZXJhdG9yOiBmYWxzZSxcbiAgICBoaWRlRGFya01vZGVUb2dnbGU6IGZhbHNlLFxuICAgIG1pbmltYWw6IGZhbHNlLFxuICAgIHNpbGVudDogZmFsc2UsXG4gICAgc2VydmU6IGZhbHNlLFxuICAgIHdhdGNoOiBmYWxzZSxcbiAgICBQQUdFX1RZUEVTOiB7XG4gICAgICAgIFJPT1Q6ICdyb290JyxcbiAgICAgICAgSU5URVJOQUw6ICdpbnRlcm5hbCdcbiAgICB9LFxuICAgIGdhU2l0ZTogJ2F1dG8nLFxuICAgIGNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkOiBmYWxzZSxcbiAgICBsYW5ndWFnZTogJ2VuLVVTJyxcbiAgICBtYXhTZWFyY2hSZXN1bHRzOiAxNVxufTtcbiIsImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgQ09NUE9ET0NfREVGQVVMVFMgfSBmcm9tICcuLi91dGlscy9kZWZhdWx0cyc7XG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ292ZXJhZ2VEYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvdmVyYWdlRGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWFpbkRhdGFJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvbWFpbi1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQYWdlSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BhZ2UuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIHtcbiAgICBwcml2YXRlIF9wYWdlczogUGFnZUludGVyZmFjZVtdID0gW107XG4gICAgcHJpdmF0ZSBfbWFpbkRhdGE6IE1haW5EYXRhSW50ZXJmYWNlID0ge1xuICAgICAgICBvdXRwdXQ6IENPTVBPRE9DX0RFRkFVTFRTLmZvbGRlcixcbiAgICAgICAgdGhlbWU6IENPTVBPRE9DX0RFRkFVTFRTLnRoZW1lLFxuICAgICAgICBleHRUaGVtZTogJycsXG4gICAgICAgIHNlcnZlOiBmYWxzZSxcbiAgICAgICAgdGVtcGxhdGVQbGF5Z3JvdW5kOiBmYWxzZSxcbiAgICAgICAgaG9zdG5hbWU6IENPTVBPRE9DX0RFRkFVTFRTLmhvc3RuYW1lLFxuICAgICAgICBob3N0OiAnJyxcbiAgICAgICAgcG9ydDogQ09NUE9ET0NfREVGQVVMVFMucG9ydCxcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICAgIGFzc2V0c0ZvbGRlcjogJycsXG4gICAgICAgIGRvY3VtZW50YXRpb25NYWluTmFtZTogQ09NUE9ET0NfREVGQVVMVFMudGl0bGUsXG4gICAgICAgIGRvY3VtZW50YXRpb25NYWluRGVzY3JpcHRpb246ICcnLFxuICAgICAgICBiYXNlOiBDT01QT0RPQ19ERUZBVUxUUy5iYXNlLFxuICAgICAgICBoaWRlR2VuZXJhdG9yOiBmYWxzZSxcbiAgICAgICAgaGlkZURhcmtNb2RlVG9nZ2xlOiBmYWxzZSxcbiAgICAgICAgaGFzRmlsZXNUb0NvdmVyYWdlOiBmYWxzZSxcbiAgICAgICAgbW9kdWxlczogW10sXG4gICAgICAgIHJlYWRtZTogZmFsc2UsXG4gICAgICAgIGNoYW5nZWxvZzogJycsXG4gICAgICAgIGNvbnRyaWJ1dGluZzogJycsXG4gICAgICAgIGxpY2Vuc2U6ICcnLFxuICAgICAgICB0b2RvOiAnJyxcbiAgICAgICAgbWFya2Rvd25zOiBbXSxcbiAgICAgICAgYWRkaXRpb25hbFBhZ2VzOiBbXSxcbiAgICAgICAgcGlwZXM6IFtdLFxuICAgICAgICBjbGFzc2VzOiBbXSxcbiAgICAgICAgaW50ZXJmYWNlczogW10sXG4gICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICBjb250cm9sbGVyczogW10sXG4gICAgICAgIGVudGl0aWVzOiBbXSxcbiAgICAgICAgZGlyZWN0aXZlczogW10sXG4gICAgICAgIGluamVjdGFibGVzOiBbXSxcbiAgICAgICAgaW50ZXJjZXB0b3JzOiBbXSxcbiAgICAgICAgZ3VhcmRzOiBbXSxcbiAgICAgICAgbWlzY2VsbGFuZW91czogW10sXG4gICAgICAgIHJvdXRlczogW10sXG4gICAgICAgIHRzY29uZmlnOiAnJyxcbiAgICAgICAgdG9nZ2xlTWVudUl0ZW1zOiBDT01QT0RPQ19ERUZBVUxUUy50b2dnbGVNZW51SXRlbXMsXG4gICAgICAgIG5hdlRhYkNvbmZpZzogW10sXG4gICAgICAgIHRlbXBsYXRlczogJycsXG4gICAgICAgIGluY2x1ZGVzOiAnJyxcbiAgICAgICAgaW5jbHVkZXNOYW1lOiBDT01QT0RPQ19ERUZBVUxUUy5hZGRpdGlvbmFsRW50cnlOYW1lLFxuICAgICAgICBpbmNsdWRlc0ZvbGRlcjogQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5UGF0aCxcbiAgICAgICAgZGlzYWJsZVNvdXJjZUNvZGU6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVTb3VyY2VDb2RlLFxuICAgICAgICBkaXNhYmxlRG9tVHJlZTogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZURvbVRyZWUsXG4gICAgICAgIGRpc2FibGVUZW1wbGF0ZVRhYjogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVRlbXBsYXRlVGFiLFxuICAgICAgICBkaXNhYmxlU3R5bGVUYWI6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVTdHlsZVRhYixcbiAgICAgICAgZGlzYWJsZUdyYXBoOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlR3JhcGgsXG4gICAgICAgIGRpc2FibGVNYWluR3JhcGg6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVNYWluR3JhcGgsXG4gICAgICAgIGRpc2FibGVDb3ZlcmFnZTogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZUNvdmVyYWdlLFxuICAgICAgICBkaXNhYmxlUHJpdmF0ZTogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVByaXZhdGUsXG4gICAgICAgIGRpc2FibGVJbnRlcm5hbDogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZUludGVybmFsLFxuICAgICAgICBkaXNhYmxlUHJvdGVjdGVkOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlUHJvdGVjdGVkLFxuICAgICAgICBkaXNhYmxlTGlmZUN5Y2xlSG9va3M6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVMaWZlQ3ljbGVIb29rcyxcbiAgICAgICAgZGlzYWJsZUNvbnN0cnVjdG9yczogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZUNvbnN0cnVjdG9ycyxcbiAgICAgICAgZGlzYWJsZVJvdXRlc0dyYXBoOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlUm91dGVzR3JhcGgsXG4gICAgICAgIGRpc2FibGVTZWFyY2g6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlRGVwZW5kZW5jaWVzOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlRGVwZW5kZW5jaWVzLFxuICAgICAgICBkaXNhYmxlUHJvcGVydGllczogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVByb3BlcnRpZXMsXG4gICAgICAgIGRpc2FibGVGaWxlUGF0aDogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZUZpbGVQYXRoLFxuICAgICAgICBkaXNhYmxlT3ZlcnZpZXc6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVPdmVydmlldyxcbiAgICAgICAgd2F0Y2g6IGZhbHNlLFxuICAgICAgICBtYWluR3JhcGg6ICcnLFxuICAgICAgICBjb3ZlcmFnZVRlc3Q6IGZhbHNlLFxuICAgICAgICBjb3ZlcmFnZVRlc3RUaHJlc2hvbGQ6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZCxcbiAgICAgICAgY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbDogQ09NUE9ET0NfREVGQVVMVFMuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCxcbiAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZTogZmFsc2UsXG4gICAgICAgIGNvdmVyYWdlTWluaW11bVBlckZpbGU6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZU1pbmltdW1QZXJGaWxlLFxuICAgICAgICB1bml0VGVzdENvdmVyYWdlOiAnJyxcbiAgICAgICAgdW5pdFRlc3REYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkOiBDT01QT0RPQ19ERUZBVUxUUy5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCxcbiAgICAgICAgcm91dGVzTGVuZ3RoOiAwLFxuICAgICAgICBhbmd1bGFyVmVyc2lvbjogJycsXG4gICAgICAgIGV4cG9ydEZvcm1hdDogQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0LFxuICAgICAgICBjb3ZlcmFnZURhdGE6IHt9IGFzIENvdmVyYWdlRGF0YSxcbiAgICAgICAgY3VzdG9tRmF2aWNvbjogJycsXG4gICAgICAgIGN1c3RvbUxvZ286ICcnLFxuICAgICAgICBwYWNrYWdlRGVwZW5kZW5jaWVzOiBbXSxcbiAgICAgICAgcGFja2FnZVBlZXJEZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICBwYWNrYWdlUHJvcGVydGllczoge30sXG4gICAgICAgIGdhSUQ6ICcnLFxuICAgICAgICBnYVNpdGU6ICcnLFxuICAgICAgICBhbmd1bGFyUHJvamVjdDogZmFsc2UsXG4gICAgICAgIGFuZ3VsYXJKU1Byb2plY3Q6IGZhbHNlLFxuICAgICAgICBsYW5ndWFnZTogQ09NUE9ET0NfREVGQVVMVFMubGFuZ3VhZ2UsXG4gICAgICAgIG1heFNlYXJjaFJlc3VsdHM6IDE1LFxuICAgICAgICBwdWJsaWNBcGlPbmx5OiAnJyxcbiAgICAgICAgcHVibGljQXBpRXhwb3J0czogbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpXG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb25maWd1cmF0aW9uO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5pbnN0YW5jZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5pbnN0YW5jZSA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb24uaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFBhZ2UocGFnZTogUGFnZUludGVyZmFjZSkge1xuICAgICAgICBsZXQgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogcGFnZS5uYW1lIH0pO1xuICAgICAgICBpZiAoaW5kZXhQYWdlID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fcGFnZXMucHVzaChwYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNQYWdlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogbmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIGluZGV4UGFnZSAhPT0gLTE7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEFkZGl0aW9uYWxQYWdlKHBhZ2U6IFBhZ2VJbnRlcmZhY2UpIHtcbiAgICAgICAgdGhpcy5fbWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzLnB1c2gocGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFkZGl0aW9uYWxQYWdlQnlJZChpZCk6IFBhZ2VJbnRlcmZhY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzLmZpbmQocGFnZSA9PiBwYWdlLmlkID09PSBpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0UGFnZXMoKSB7XG4gICAgICAgIHRoaXMuX3BhZ2VzID0gW107XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0QWRkaXRpb25hbFBhZ2VzKCkge1xuICAgICAgICB0aGlzLl9tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXMgPSBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRSb290TWFya2Rvd25QYWdlcygpIHtcbiAgICAgICAgbGV0IGluZGV4UGFnZSA9IF8uZmluZEluZGV4KHRoaXMuX3BhZ2VzLCB7IG5hbWU6ICdpbmRleCcgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiAnY2hhbmdlbG9nJyB9KTtcbiAgICAgICAgdGhpcy5fcGFnZXMuc3BsaWNlKGluZGV4UGFnZSwgMSk7XG4gICAgICAgIGluZGV4UGFnZSA9IF8uZmluZEluZGV4KHRoaXMuX3BhZ2VzLCB7IG5hbWU6ICdjb250cmlidXRpbmcnIH0pO1xuICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXhQYWdlLCAxKTtcbiAgICAgICAgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ2xpY2Vuc2UnIH0pO1xuICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXhQYWdlLCAxKTtcbiAgICAgICAgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ3RvZG8nIH0pO1xuICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXhQYWdlLCAxKTtcbiAgICAgICAgdGhpcy5fbWFpbkRhdGEubWFya2Rvd25zID0gW107XG4gICAgfVxuXG4gICAgZ2V0IHBhZ2VzKCk6IFBhZ2VJbnRlcmZhY2VbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlcztcbiAgICB9XG4gICAgc2V0IHBhZ2VzKHBhZ2VzOiBQYWdlSW50ZXJmYWNlW10pIHtcbiAgICAgICAgdGhpcy5fcGFnZXMgPSBbXTtcbiAgICB9XG5cbiAgICBnZXQgbWFya0Rvd25QYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzLmZpbHRlcihwYWdlID0+IHBhZ2UubWFya2Rvd24pO1xuICAgIH1cblxuICAgIGdldCBtYWluRGF0YSgpOiBNYWluRGF0YUludGVyZmFjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWluRGF0YTtcbiAgICB9XG4gICAgc2V0IG1haW5EYXRhKGRhdGE6IE1haW5EYXRhSW50ZXJmYWNlKSB7XG4gICAgICAgIChPYmplY3QgYXMgYW55KS5hc3NpZ24odGhpcy5fbWFpbkRhdGEsIGRhdGEpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29uZmlndXJhdGlvbi5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSUFwaVNvdXJjZVJlc3VsdCB9IGZyb20gJy4vYXBpLXNvdXJjZS1yZXN1bHQuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbi8vIFRyeSBtdWx0aXBsZSBwYXRocyB0byBmaW5kIGFwaS1saXN0Lmpzb24gLSBzdXBwb3J0cyBib3RoIHNvdXJjZSBhbmQgYnVuZGxlZCBjb250ZXh0c1xubGV0IGFwaUxpc3RQYXRoID0gJy4uL3NyYy9kYXRhL2FwaS1saXN0Lmpzb24nO1xudHJ5IHtcbiAgICAvLyBGaXJzdCB0cnkgcmVsYXRpdmUgcGF0aCAod29ya3MgZnJvbSBzb3VyY2UpXG4gICAgcmVxdWlyZS5yZXNvbHZlKGFwaUxpc3RQYXRoKTtcbn0gY2F0Y2ggKGUpIHtcbiAgICAvLyBGYWxsYmFjayB0byBhYnNvbHV0ZSBwYXRoIGZyb20gY3dkICh3b3JrcyBmcm9tIGJ1bmRsZWQvdGVzdCBjb250ZXh0cylcbiAgICBhcGlMaXN0UGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnc3JjL2RhdGEvYXBpLWxpc3QuanNvbicpO1xufVxuXG5jb25zdCBBbmd1bGFyQVBJczogQXJyYXk8SUFuZ3VsYXJNYWluQXBpPiA9IHJlcXVpcmUoYXBpTGlzdFBhdGgpO1xuXG5leHBvcnQgY2xhc3MgQW5ndWxhckFwaVV0aWwge1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBBbmd1bGFyQXBpVXRpbDtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUFuZ3VsYXJBcGlVdGlsLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBBbmd1bGFyQXBpVXRpbC5pbnN0YW5jZSA9IG5ldyBBbmd1bGFyQXBpVXRpbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBbmd1bGFyQXBpVXRpbC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZEFwaSh0eXBlOiBzdHJpbmcpOiBJQXBpU291cmNlUmVzdWx0PElBbmd1bGFyTWFpbkFwaT4ge1xuICAgICAgICBsZXQgZm91bmRlZEFwaTtcbiAgICAgICAgXy5mb3JFYWNoKEFuZ3VsYXJBUElzLCBtYWluQXBpID0+IHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChtYWluQXBpLml0ZW1zLCBhcGkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhcGkudGl0bGUgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRlZEFwaSA9IGFwaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2U6ICdleHRlcm5hbCcsXG4gICAgICAgICAgICBkYXRhOiBmb3VuZGVkQXBpLFxuICAgICAgICAgICAgc2NvcmU6IGZvdW5kZWRBcGkgPyAxIDogMFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5ndWxhckFwaVV0aWwuZ2V0SW5zdGFuY2UoKTtcblxuZXhwb3J0IGludGVyZmFjZSBJQW5ndWxhck1haW5BcGkge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGl0ZW1zOiBJQW5ndWxhckFwaVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBbmd1bGFyQXBpIHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBkb2NUeXBlOiBzdHJpbmc7XG4gICAgc3RhYmlsaXR5OiBzdHJpbmc7XG4gICAgc2VjdXJlOiBzdHJpbmc7XG4gICAgYmFycmVsOiBzdHJpbmc7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZXh0cmFjdExlYWRpbmdUZXh0KHN0cmluZywgY29tcGxldGVUYWcpIHtcbiAgICBsZXQgdGFnSW5kZXggPSBzdHJpbmcuaW5kZXhPZihjb21wbGV0ZVRhZyk7XG4gICAgbGV0IGxlYWRpbmdUZXh0ID0gdW5kZWZpbmVkO1xuICAgIGxldCBsZWFkaW5nVGV4dFJlZ0V4cCA9IC9cXFsoLis/KVxcXS9nO1xuICAgIGxldCBsZWFkaW5nVGV4dEluZm8gPSBsZWFkaW5nVGV4dFJlZ0V4cC5leGVjKHN0cmluZyk7XG5cbiAgICAvLyBkaWQgd2UgZmluZCBsZWFkaW5nIHRleHQsIGFuZCBpZiBzbywgZG9lcyBpdCBpbW1lZGlhdGVseSBwcmVjZWRlIHRoZSB0YWc/XG4gICAgd2hpbGUgKGxlYWRpbmdUZXh0SW5mbyAmJiBsZWFkaW5nVGV4dEluZm8ubGVuZ3RoKSB7XG4gICAgICAgIGlmIChsZWFkaW5nVGV4dEluZm8uaW5kZXggKyBsZWFkaW5nVGV4dEluZm9bMF0ubGVuZ3RoID09PSB0YWdJbmRleCkge1xuICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobGVhZGluZ1RleHRJbmZvWzBdLCAnJyk7XG4gICAgICAgICAgICBsZWFkaW5nVGV4dCA9IGxlYWRpbmdUZXh0SW5mb1sxXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVhZGluZ1RleHRJbmZvID0gbGVhZGluZ1RleHRSZWdFeHAuZXhlYyhzdHJpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGxlYWRpbmdUZXh0OiBsZWFkaW5nVGV4dCxcbiAgICAgICAgc3RyaW5nOiBzdHJpbmdcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRMaW5rVGV4dCh0ZXh0KSB7XG4gICAgbGV0IGxpbmtUZXh0O1xuICAgIGxldCB0YXJnZXQ7XG4gICAgbGV0IHNwbGl0SW5kZXg7XG5cbiAgICAvLyBpZiBhIHBpcGUgaXMgbm90IHByZXNlbnQsIHdlIHNwbGl0IG9uIHRoZSBmaXJzdCBzcGFjZVxuICAgIHNwbGl0SW5kZXggPSB0ZXh0LmluZGV4T2YoJ3wnKTtcbiAgICBpZiAoc3BsaXRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgc3BsaXRJbmRleCA9IHRleHQuc2VhcmNoKC9cXHMvKTtcbiAgICB9XG5cbiAgICBpZiAoc3BsaXRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgbGlua1RleHQgPSB0ZXh0LnN1YnN0cihzcGxpdEluZGV4ICsgMSk7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBzdWJzZXF1ZW50IG5ld2xpbmVzIHRvIGEgc2luZ2xlIHNwYWNlLlxuICAgICAgICBsaW5rVGV4dCA9IGxpbmtUZXh0LnJlcGxhY2UoL1xcbisvLCAnICcpO1xuICAgICAgICB0YXJnZXQgPSB0ZXh0LnN1YnN0cigwLCBzcGxpdEluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsaW5rVGV4dDogbGlua1RleHQsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0IHx8IHRleHRcbiAgICB9O1xufVxuXG5leHBvcnQgbGV0IExpbmtQYXJzZXIgPSAoZnVuY3Rpb24oKSB7XG4gICAgbGV0IHByb2Nlc3NUaGVMaW5rID0gZnVuY3Rpb24oc3RyaW5nLCB0YWdJbmZvLCBsZWFkaW5nVGV4dCkge1xuICAgICAgICBsZXQgbGVhZGluZyA9IGV4dHJhY3RMZWFkaW5nVGV4dChzdHJpbmcsIHRhZ0luZm8uY29tcGxldGVUYWcpLFxuICAgICAgICAgICAgbGlua1RleHQsXG4gICAgICAgICAgICBzcGxpdCxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZTtcblxuICAgICAgICBsaW5rVGV4dCA9IGxlYWRpbmdUZXh0ID8gbGVhZGluZ1RleHQgOiBsZWFkaW5nLmxlYWRpbmdUZXh0IHx8ICcnO1xuXG4gICAgICAgIHNwbGl0ID0gc3BsaXRMaW5rVGV4dCh0YWdJbmZvLnRleHQpO1xuICAgICAgICB0YXJnZXQgPSBzcGxpdC50YXJnZXQ7XG5cbiAgICAgICAgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gJ1snICsgbGVhZGluZy5sZWFkaW5nVGV4dCArICddJyArIHRhZ0luZm8uY29tcGxldGVUYWc7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gdGFnSW5mby5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgIGxpbmtUZXh0ID0gc3BsaXQubGlua1RleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmtUZXh0ID09PSAnJyB8fCBsaW5rVGV4dCA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgJ1snICsgbGlua1RleHQgKyAnXSgnICsgdGFyZ2V0ICsgJyknKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydFxuICAgICAqIHtAbGluayBodHRwOi8vd3d3Lmdvb2dsZS5jb218R29vZ2xlfSBvciB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tIEdpdEh1Yn0gb3IgW0dpdGh1Yl17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tfSB0byBbR2l0aHViXShodHRwczovL2dpdGh1Yi5jb20pXG4gICAgICovXG5cbiAgICBsZXQgcmVwbGFjZUxpbmtUYWcgPSBmdW5jdGlvbihzdHI6IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmV3U3RyaW5nOiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5ldyBSZWdFeHAoJ1xcXFxbKCg/Oi58XFxuKSs/KV1cXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKS5leGVjKCdlZSBbVE8gRE9de0BsaW5rIFRvZG99IGZvJykgLT4gXCJbVE8gRE9de0BsaW5rIFRvZG99XCIsIFwiVE8gRE9cIiwgXCJUb2RvXCJcbiAgICAgICAgLy8gbmV3IFJlZ0V4cCgnXFxcXHtAbGlua1xcXFxzKygoPzoufFxcbikrPylcXFxcfScsICdpJykuZXhlYygnZWUgW1RPRE9de0BsaW5rIFRvZG99IGZvJykgLT4gXCJ7QGxpbmsgVG9kb31cIiwgXCJUb2RvXCJcblxuICAgICAgICBsZXQgdGFnUmVnRXhwTGlnaHQgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKSxcbiAgICAgICAgICAgIHRhZ1JlZ0V4cEZ1bGwgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKSxcbiAgICAgICAgICAgIHRhZ1JlZ0V4cCxcbiAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICBwcmV2aW91c1N0cmluZyxcbiAgICAgICAgICAgIHRhZ0luZm8gPSBbXTtcblxuICAgICAgICB0YWdSZWdFeHAgPSBzdHIuaW5kZXhPZignXXsnKSAhPT0gLTEgPyB0YWdSZWdFeHBGdWxsIDogdGFnUmVnRXhwTGlnaHQ7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZU1hdGNoKHJlcGxhY2VyLCB0YWcsIG1hdGNoLCB0ZXh0LCBsaW5rVGV4dD8pIHtcbiAgICAgICAgICAgIGxldCBtYXRjaGVkVGFnID0ge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlVGFnOiBtYXRjaCxcbiAgICAgICAgICAgICAgICB0YWc6IHRhZyxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGFnSW5mby5wdXNoKG1hdGNoZWRUYWcpO1xuICAgICAgICAgICAgaWYgKGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKHN0ciwgbWF0Y2hlZFRhZywgbGlua1RleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZXIoc3RyLCBtYXRjaGVkVGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG1hdGNoZXMgPSB0YWdSZWdFeHAuZXhlYyhzdHIpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1N0cmluZyA9IHN0cjtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcmVwbGFjZU1hdGNoKHByb2Nlc3NUaGVMaW5rLCAnbGluaycsIG1hdGNoZXNbMF0sIG1hdGNoZXNbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcmVwbGFjZU1hdGNoKHByb2Nlc3NUaGVMaW5rLCAnbGluaycsIG1hdGNoZXNbMF0sIG1hdGNoZXNbMl0sIG1hdGNoZXNbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobWF0Y2hlcyAmJiBwcmV2aW91c1N0cmluZyAhPT0gc3RyKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV3U3RyaW5nOiBzdHJcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgbGV0IF9yZXNvbHZlTGlua3MgPSBmdW5jdGlvbihzdHI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gcmVwbGFjZUxpbmtUYWcoc3RyKS5uZXdTdHJpbmc7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc29sdmVMaW5rczogX3Jlc29sdmVMaW5rc1xuICAgIH07XG59KSgpO1xuIiwiZXhwb3J0IGVudW0gQW5ndWxhckxpZmVjeWNsZUhvb2tzIHtcbiAgICBuZ09uQ2hhbmdlcyxcbiAgICBuZ09uSW5pdCxcbiAgICBuZ0RvQ2hlY2ssXG4gICAgbmdBZnRlckNvbnRlbnRJbml0LFxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgICBuZ0FmdGVyVmlld0luaXQsXG4gICAgbmdBZnRlclZpZXdDaGVja2VkLFxuICAgIG5nT25EZXN0cm95XG59XG4iLCJpbXBvcnQgeyBTeW50YXhLaW5kIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5leHBvcnQgZW51bSBLaW5kVHlwZSB7XG4gICAgVU5LTk9XTiA9ICd1bmtub3duJyxcbiAgICBTVFJJTkcgPSAnc3RyaW5nJyxcbiAgICBOVU1CRVIgPSAnbnVtYmVyJyxcbiAgICBBUlJBWSA9ICdbXScsXG4gICAgVk9JRCA9ICd2b2lkJyxcbiAgICBGVU5DVElPTiA9ICdmdW5jdGlvbicsXG4gICAgVEVNUExBVEVfTElURVJBTCA9ICd0ZW1wbGF0ZSBsaXRlcmFsIHR5cGUnLFxuICAgIExJVEVSQUwgPSAnbGl0ZXJhbCB0eXBlJyxcbiAgICBCT09MRUFOID0gJ2Jvb2xlYW4nLFxuICAgIEFOWSA9ICdhbnknLFxuICAgIE5VTEwgPSAnbnVsbCcsXG4gICAgU1lNQk9MID0gJ3N5bWJvbCcsXG4gICAgTkVWRVIgPSAnbmV2ZXInLFxuICAgIFVOREVGSU5FRCA9ICd1bmRlZmluZWQnLFxuICAgIE9CSkVDVCA9ICdvYmplY3QnXG59XG5cbmV4cG9ydCB0eXBlIElzS2luZFR5cGVNZXRob2RzID0ge1xuICAgIFtrZXkgaW4ga2V5b2YgdHlwZW9mIEtpbmRUeXBlXTogKGtpbmQ6IG51bWJlcikgPT4gYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBJc0tpbmRUeXBlOiBJc0tpbmRUeXBlTWV0aG9kcyA9IHtcbiAgICBBTlkoa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5BTlk7XG4gICAgfSxcbiAgICBBUlJBWShraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLkFSUkFZO1xuICAgIH0sXG4gICAgQk9PTEVBTihraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLkJPT0xFQU47XG4gICAgfSxcbiAgICBGVU5DVElPTihraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLkZVTkNUSU9OO1xuICAgIH0sXG4gICAgTElURVJBTChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLkxJVEVSQUw7XG4gICAgfSxcbiAgICBORVZFUihraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLk5FVkVSO1xuICAgIH0sXG4gICAgTlVMTChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLk5VTEw7XG4gICAgfSxcbiAgICBOVU1CRVIoa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5OVU1CRVI7XG4gICAgfSxcbiAgICBPQkpFQ1Qoa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5PQkpFQ1Q7XG4gICAgfSxcbiAgICBTVFJJTkcoa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5TVFJJTkc7XG4gICAgfSxcbiAgICBTWU1CT0woa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5TWU1CT0w7XG4gICAgfSxcbiAgICBURU1QTEFURV9MSVRFUkFMKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuVEVNUExBVEVfTElURVJBTDtcbiAgICB9LFxuICAgIFVOREVGSU5FRChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLlVOREVGSU5FRDtcbiAgICB9LFxuICAgIFVOS05PV04oa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5VTktOT1dOO1xuICAgIH0sXG4gICAgVk9JRChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLlZPSUQ7XG4gICAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGtpbmRUb1R5cGUoa2luZDogbnVtYmVyKTogS2luZFR5cGUge1xuICAgIGxldCBfdHlwZSA9IEtpbmRUeXBlLlVOS05PV047XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkOlxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuU1RSSU5HO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkOlxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuTnVtZXJpY0xpdGVyYWw6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLk5VTUJFUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQXJyYXlUeXBlOlxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbjpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuQVJSQVk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlZvaWRLZXl3b3JkOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5WT0lEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5GdW5jdGlvblR5cGU6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLkZVTkNUSU9OO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5UZW1wbGF0ZUxpdGVyYWxUeXBlOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5URU1QTEFURV9MSVRFUkFMO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5UeXBlTGl0ZXJhbDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuTElURVJBTDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLkJPT0xFQU47XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLkFueUtleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLkFOWTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuTnVsbEtleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLk5VTEw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlN5bWJvbEtleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLlNZTUJPTDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuTmV2ZXJLZXl3b3JkOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5ORVZFUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuVW5rbm93bktleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLlVOS05PV047XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLlVOREVGSU5FRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuT2JqZWN0S2V5d29yZDpcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5PQkpFQ1Q7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIF90eXBlO1xufVxuIiwiaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5jb25zdCB0c2FueSA9IHRzIGFzIGFueTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvdjIuMS40L3NyYy9jb21waWxlci91dGlsaXRpZXMudHMjTDE1MlxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZUZpbGVPZk5vZGUobm9kZTogdHMuTm9kZSk6IHRzLlNvdXJjZUZpbGUge1xuICAgIHJldHVybiB0c2FueS5nZXRTb3VyY2VGaWxlT2ZOb2RlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL3YyLjEuNC9zcmMvY29tcGlsZXIvdXRpbGl0aWVzLnRzI0wxNDIzXG5leHBvcnQgZnVuY3Rpb24gZ2V0SlNEb2NDb21tZW50UmFuZ2VzKG5vZGU6IHRzLk5vZGUsIHRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB0c2FueS5nZXRKU0RvY0NvbW1lbnRSYW5nZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbiIsImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5pbXBvcnQgKiBhcyBfdHMgZnJvbSAnLi90cy1pbnRlcm5hbCc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY1BhcnNlclV0aWwge1xuICAgIHB1YmxpYyBpc1ZhcmlhYmxlTGlrZShub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyB0cy5WYXJpYWJsZUxpa2VEZWNsYXJhdGlvbiB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5vZGUua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5CaW5kaW5nRWxlbWVudDpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuRW51bU1lbWJlcjpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUGFyYW1ldGVyOlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Qcm9wZXJ0eUFzc2lnbm1lbnQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3BlcnR5RGVjbGFyYXRpb246XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3BlcnR5U2lnbmF0dXJlOlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5TaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb246XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1RvcG1vc3RNb2R1bGVEZWNsYXJhdGlvbihub2RlOiB0cy5Nb2R1bGVEZWNsYXJhdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKG5vZGUgYXMgYW55KS5uZXh0Q29udGFpbmVyICYmIChub2RlIGFzIGFueSkubmV4dENvbnRhaW5lci5raW5kID09PSB0cy5TeW50YXhLaW5kLk1vZHVsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gPHRzLk1vZHVsZURlY2xhcmF0aW9uPihub2RlIGFzIGFueSkubmV4dENvbnRhaW5lcjtcbiAgICAgICAgICAgIGlmIChub2RlLm5hbWUuZW5kICsgMSA9PT0gbmV4dC5uYW1lLnBvcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldFJvb3RNb2R1bGVEZWNsYXJhdGlvbihub2RlOiB0cy5Nb2R1bGVEZWNsYXJhdGlvbik6IHRzLk5vZGUge1xuICAgICAgICB3aGlsZSAobm9kZS5wYXJlbnQgJiYgbm9kZS5wYXJlbnQua2luZCA9PT0gdHMuU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IDx0cy5Nb2R1bGVEZWNsYXJhdGlvbj5ub2RlLnBhcmVudDtcbiAgICAgICAgICAgIGlmIChub2RlLm5hbWUucG9zID09PSBwYXJlbnQubmFtZS5lbmQgKyAxKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFpbkNvbW1lbnRPZk5vZGUobm9kZTogdHMuTm9kZSwgc291cmNlRmlsZT86IHRzLlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuXG4gICAgICAgIGlmIChub2RlLnBhcmVudCAmJiBub2RlLnBhcmVudC5raW5kID09PSB0cy5TeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQucGFyZW50O1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PT0gdHMuU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVG9wbW9zdE1vZHVsZURlY2xhcmF0aW9uKDx0cy5Nb2R1bGVEZWNsYXJhdGlvbj5ub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gdGhpcy5nZXRSb290TW9kdWxlRGVjbGFyYXRpb24oPHRzLk1vZHVsZURlY2xhcmF0aW9uPm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbWVudHMgPSBfdHMuZ2V0SlNEb2NDb21tZW50UmFuZ2VzKG5vZGUsIHNvdXJjZUZpbGUudGV4dCk7XG4gICAgICAgIGlmIChjb21tZW50cyAmJiBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBjb21tZW50OiB0cy5Db21tZW50UmFuZ2U7XG4gICAgICAgICAgICBpZiAobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLlNvdXJjZUZpbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50c1tjb21tZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBzb3VyY2VGaWxlLnRleHQuc3Vic3RyaW5nKGNvbW1lbnQucG9zLCBjb21tZW50LmVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZUNvbW1lbnQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICAgICAgbGV0IHNob3J0VGV4dCA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVhZEJhcmVMaW5lKGxpbmU6IHN0cmluZykge1xuICAgICAgICAgICAgY29tbWVudCArPSAnXFxuJyArIGxpbmU7XG4gICAgICAgICAgICBpZiAobGluZSA9PT0gJycgJiYgc2hvcnRUZXh0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUgPT09ICcnICYmIHNob3J0VGV4dCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHNob3J0VGV4dCA9IDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzaG9ydFRleHQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCArPSAoY29tbWVudCA9PT0gJycgPyAnJyA6ICdcXG4nKSArIGxpbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgQ09ERV9GRU5DRSA9IC9eXFxzKmBgYCg/IS4qYGBgKS87XG4gICAgICAgIGxldCBpbkNvZGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IGluRXhhbXBsZSA9IGZhbHNlOyAvLyBmaXJzdCBsaW5lIHdpdGggQGV4YW1wbGUsIGVuZCBsaW5lIHdpdGggZW1wdHkgc3RyaW5nIG9yIHN0cmluZyBvciAqL1xuICAgICAgICBsZXQgZXhhbXBsZUhhc0NvZGVGZW5jZSA9IGZhbHNlOyAvLyB0cmFjayBpZiB0aGUgZXhhbXBsZSBhbHJlYWR5IGhhcyBjb2RlIGZlbmNlc1xuICAgICAgICBmdW5jdGlvbiByZWFkTGluZShsaW5lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTGluZSA9IGxpbmU7XG4gICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKC9eXFxzKlxcKj8gPy8sICcnKTtcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoL1xccyokLywgJycpO1xuXG4gICAgICAgICAgICBpZiAoQ09ERV9GRU5DRS50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgaW5Db2RlID0gIWluQ29kZTtcbiAgICAgICAgICAgICAgICBpZiAoaW5FeGFtcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4YW1wbGVIYXNDb2RlRmVuY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxpbmUuaW5kZXhPZignQGV4YW1wbGUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpbkV4YW1wbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGV4YW1wbGVIYXNDb2RlRmVuY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbmV4dCBub24tZW1wdHkgbGluZSBoYXMgYSBjb2RlIGZlbmNlXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KC9cXHJcXG4/fFxcbi8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbmRleCArIDE7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0TGluZSA9IGxpbmVzW2ldLnJlcGxhY2UoL15cXHMqXFwqPyA/LywgJycpLnJlcGxhY2UoL1xccyokLywgJycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dExpbmUgPT09ICcnKSBjb250aW51ZTsgLy8gU2tpcCBlbXB0eSBsaW5lc1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ09ERV9GRU5DRS50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZUhhc0NvZGVGZW5jZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIE9ubHkgY2hlY2sgdGhlIGZpcnN0IG5vbi1lbXB0eSBsaW5lXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFleGFtcGxlSGFzQ29kZUZlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnYGBgaHRtbCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgQGV4YW1wbGUgbGluZSBpZiBpdCBhbHJlYWR5IGhhcyBjb2RlIGZlbmNlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQcmVzZXJ2ZSBlbXB0eSBsaW5lcyB3aXRoaW4gY29kZSBibG9ja3MgYnkgdXNpbmcgYSBwbGFjZWhvbGRlclxuICAgICAgICAgICAgaWYgKGluQ29kZSAmJiBpbkV4YW1wbGUgJiYgZXhhbXBsZUhhc0NvZGVGZW5jZSAmJiBsaW5lID09PSAnJykge1xuICAgICAgICAgICAgICAgIGxpbmUgPSAnX19fQ09NUE9ET0NfRU1QVFlfTElORV9fXyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbkV4YW1wbGUgJiYgbGluZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBpbkV4YW1wbGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4YW1wbGVIYXNDb2RlRmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZSA9ICdgYGAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFkZCBjbG9zaW5nIGZlbmNlIGlmIGV4YW1wbGUgaGFzIGl0cyBvd25cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpbkNvZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSAvXkAoXFxTKykvLmV4ZWMobGluZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgU2VlVGFnID0gL15Ac2VlLy5leGVjKGxpbmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFNlZVRhZykge1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKC9eQHNlZS8sICdTZWUnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFnICYmICFTZWVUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVhZEJhcmVMaW5lKGxpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXlxccypcXC9cXCorLywgJycpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXCorXFwvXFxzKiQvLCAnJyk7XG5cbiAgICAgICAgdGV4dC5zcGxpdCgvXFxyXFxuP3xcXG4vKS5mb3JFYWNoKChsaW5lLCBpbmRleCkgPT4gcmVhZExpbmUobGluZSwgaW5kZXgpKTtcblxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEpTRG9jVGFncyhub2RlOiB0cy5Ob2RlLCBraW5kOiBTeW50YXhLaW5kKTogdHMuSlNEb2NUYWdbXSB7XG4gICAgICAgIGNvbnN0IGRvY3MgPSB0aGlzLmdldEpTRG9jcyhub2RlKTtcbiAgICAgICAgaWYgKGRvY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogdHMuSlNEb2NUYWdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc0pTRG9jUGFyYW1ldGVyVGFnKGRvYykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvYy5raW5kID09PSBraW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChkb2MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc0pTRG9jKGRvYykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uXy5maWx0ZXIoZG9jLnRhZ3MsIHRhZyA9PiB0YWcua2luZCA9PT0ga2luZCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB0eXBlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRKU0RvY3Mobm9kZTogdHMuTm9kZSk6IFJlYWRvbmx5QXJyYXk8dHMuSlNEb2MgfCB0cy5KU0RvY1RhZz4ge1xuICAgICAgICAvLyBUT0RPOiBqc0RvY0NhY2hlIGlzIGludGVybmFsLCBzZWUgaWYgdGhlcmUncyBhIHdheSBhcm91bmQgaXRcbiAgICAgICAgbGV0IGNhY2hlOiBSZWFkb25seUFycmF5PHRzLkpTRG9jIHwgdHMuSlNEb2NUYWc+ID0gKG5vZGUgYXMgYW55KS5qc0RvY0NhY2hlO1xuICAgICAgICBpZiAoIWNhY2hlKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKG5vZGUsIFtdKS5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgICAgIChub2RlIGFzIGFueSkuanNEb2NDYWNoZSA9IGNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gcmVjb2duaXplIHRoaXMgcGF0dGVybiB3aGVuIG5vZGUgaXMgaW5pdGlhbGl6ZXJcbiAgICAvLyBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhbmQgSlNEb2MgY29tbWVudHMgYXJlIG9uIGNvbnRhaW5pbmcgdmFyaWFibGUgc3RhdGVtZW50LlxuICAgIC8vIC8qKlxuICAgIC8vICAgKiBAcGFyYW0ge251bWJlcn0gbmFtZVxuICAgIC8vICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgIC8vICAgKi9cbiAgICAvLyB2YXIgeCA9IGZ1bmN0aW9uKG5hbWUpIHsgcmV0dXJuIG5hbWUubGVuZ3RoOyB9XG4gICAgcHJpdmF0ZSBnZXRKU0RvY3NXb3JrZXIobm9kZTogdHMuTm9kZSwgY2FjaGUpOiBSZWFkb25seUFycmF5PGFueT4ge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcbiAgICAgICAgY29uc3QgaXNJbml0aWFsaXplck9mVmFyaWFibGVEZWNsYXJhdGlvbkluU3RhdGVtZW50ID1cbiAgICAgICAgICAgIHRoaXMuaXNWYXJpYWJsZUxpa2UocGFyZW50KSAmJlxuICAgICAgICAgICAgKHBhcmVudCBhcyBhbnkpLmluaXRpYWxpemVyID09PSBub2RlICYmXG4gICAgICAgICAgICB0cy5pc1ZhcmlhYmxlU3RhdGVtZW50KHBhcmVudC5wYXJlbnQucGFyZW50KTtcbiAgICAgICAgY29uc3QgaXNWYXJpYWJsZU9mVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9XG4gICAgICAgICAgICB0aGlzLmlzVmFyaWFibGVMaWtlKG5vZGUpICYmIHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQocGFyZW50LnBhcmVudCk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlU3RhdGVtZW50Tm9kZSA9IGlzSW5pdGlhbGl6ZXJPZlZhcmlhYmxlRGVjbGFyYXRpb25JblN0YXRlbWVudFxuICAgICAgICAgICAgPyBwYXJlbnQucGFyZW50LnBhcmVudFxuICAgICAgICAgICAgOiBpc1ZhcmlhYmxlT2ZWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XG4gICAgICAgICAgICA/IHBhcmVudC5wYXJlbnRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodmFyaWFibGVTdGF0ZW1lbnROb2RlKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHZhcmlhYmxlU3RhdGVtZW50Tm9kZSwgY2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyByZWNvZ25pemUgd2hlbiB0aGUgbm9kZSBpcyB0aGUgUkhTIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvblxuICAgICAgICBjb25zdCBpc1NvdXJjZU9mQXNzaWdubWVudEV4cHJlc3Npb25TdGF0ZW1lbnQgPVxuICAgICAgICAgICAgcGFyZW50ICYmXG4gICAgICAgICAgICBwYXJlbnQucGFyZW50ICYmXG4gICAgICAgICAgICB0cy5pc0JpbmFyeUV4cHJlc3Npb24ocGFyZW50KSAmJlxuICAgICAgICAgICAgcGFyZW50Lm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgICAgICAgdHMuaXNFeHByZXNzaW9uU3RhdGVtZW50KHBhcmVudC5wYXJlbnQpO1xuICAgICAgICBpZiAoaXNTb3VyY2VPZkFzc2lnbm1lbnRFeHByZXNzaW9uU3RhdGVtZW50KSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHBhcmVudC5wYXJlbnQsIGNhY2hlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTW9kdWxlRGVjbGFyYXRpb24gPVxuICAgICAgICAgICAgdHMuaXNNb2R1bGVEZWNsYXJhdGlvbihub2RlKSAmJiBwYXJlbnQgJiYgdHMuaXNNb2R1bGVEZWNsYXJhdGlvbihwYXJlbnQpO1xuICAgICAgICBjb25zdCBpc1Byb3BlcnR5QXNzaWdubWVudEV4cHJlc3Npb24gPSBwYXJlbnQgJiYgdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocGFyZW50KTtcbiAgICAgICAgaWYgKGlzTW9kdWxlRGVjbGFyYXRpb24gfHwgaXNQcm9wZXJ0eUFzc2lnbm1lbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHBhcmVudCwgY2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHVsbCBwYXJhbWV0ZXIgY29tbWVudHMgZnJvbSBkZWNsYXJpbmcgZnVuY3Rpb24gYXMgd2VsbFxuICAgICAgICBpZiAodHMuaXNQYXJhbWV0ZXIobm9kZSkpIHtcbiAgICAgICAgICAgIGNhY2hlID0gXy5jb25jYXQoY2FjaGUsIHRoaXMuZ2V0SlNEb2NQYXJhbWV0ZXJUYWdzKG5vZGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVmFyaWFibGVMaWtlKG5vZGUpICYmIChub2RlIGFzIGFueSkuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxpemVySnNEb2MgPSAoKG5vZGUgYXMgYW55KS5pbml0aWFsaXplciBhcyBhbnkpLmpzRG9jO1xuICAgICAgICAgICAgaWYgKGluaXRpYWxpemVySnNEb2MpIHtcbiAgICAgICAgICAgICAgICBjYWNoZSA9IF8uY29uY2F0KGNhY2hlLCBpbml0aWFsaXplckpzRG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVKc0RvYyA9IChub2RlIGFzIGFueSkuanNEb2M7XG4gICAgICAgIGlmIChub2RlSnNEb2MpIHtcbiAgICAgICAgICAgIGNhY2hlID0gXy5jb25jYXQoY2FjaGUsIG5vZGVKc0RvYyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRKU0RvY1BhcmFtZXRlclRhZ3MoXG4gICAgICAgIHBhcmFtOiB0cy5QYXJhbWV0ZXJEZWNsYXJhdGlvblxuICAgICk6IFJlYWRvbmx5QXJyYXk8dHMuSlNEb2NQYXJhbWV0ZXJUYWc+IHtcbiAgICAgICAgY29uc3QgZnVuYyA9IHBhcmFtLnBhcmVudCBhcyB0cy5GdW5jdGlvbkxpa2VEZWNsYXJhdGlvbjtcbiAgICAgICAgY29uc3QgdGFncyA9IHRoaXMuZ2V0SlNEb2NUYWdzKFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgICAgIFN5bnRheEtpbmQuSlNEb2NQYXJhbWV0ZXJUYWdcbiAgICAgICAgKSBhcyB0cy5KU0RvY1BhcmFtZXRlclRhZ1tdO1xuXG4gICAgICAgIGlmICghcGFyYW0ubmFtZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBhbm9ueW1vdXMganNkb2MgcGFyYW0gZnJvbSBhIGBmdW5jdGlvbih0eXBlMSwgdHlwZTIpOiB0eXBlM2Agc3BlY2lmaWNhdGlvblxuICAgICAgICAgICAgY29uc3QgaSA9IGZ1bmMucGFyYW1ldGVycy5pbmRleE9mKHBhcmFtKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtVGFncyA9IF8uZmlsdGVyKHRhZ3MsIHRhZyA9PiB0cy5pc0pTRG9jUGFyYW1ldGVyVGFnKHRhZykpO1xuXG4gICAgICAgICAgICBpZiAocGFyYW1UYWdzICYmIDAgPD0gaSAmJiBpIDwgcGFyYW1UYWdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbcGFyYW1UYWdzW2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0cy5pc0lkZW50aWZpZXIocGFyYW0ubmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBwYXJhbS5uYW1lLnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gXy5maWx0ZXIodGFncywgdGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHMgJiYgdHMuaXNKU0RvY1BhcmFtZXRlclRhZyh0YWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0YWcgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQucGFyYW1ldGVyTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnBhcmFtZXRlck5hbWUudGV4dCA9PT0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdC5uYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0Lm5hbWUuZXNjYXBlZFRleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubmFtZS5lc2NhcGVkVGV4dCA9PT0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVE9ETzogaXQncyBhIGRlc3RydWN0dXJlZCBwYXJhbWV0ZXIsIHNvIGl0IHNob3VsZCBsb29rIHVwIGFuIFwib2JqZWN0IHR5cGVcIiBzZXJpZXMgb2YgbXVsdGlwbGUgbGluZXNcbiAgICAgICAgICAgIC8vIEJ1dCBtdWx0aS1saW5lIG9iamVjdCB0eXBlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldCBlaXRoZXJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VKU0RvY05vZGUobm9kZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCByYXdEZXNjcmlwdGlvbiA9ICcnO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZS5jb21tZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmF3RGVzY3JpcHRpb24gKz0gbm9kZS5jb21tZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG5vZGUuY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbiA9IG5vZGUuY29tbWVudC5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IEpTRG9jTm9kZSA9IG5vZGUuY29tbWVudFtpXTtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChKU0RvY05vZGUua2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkpTRG9jQ29tbWVudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdEZXNjcmlwdGlvbiArPSBKU0RvY05vZGUuY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5KU0RvY1RleHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3RGVzY3JpcHRpb24gKz0gSlNEb2NOb2RlLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuSlNEb2NMaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKU0RvY05vZGUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IEpTRG9jTm9kZS5uYW1lLmVzY2FwZWRUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRG9jTm9kZS5uYW1lLmxlZnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRG9jTm9kZS5uYW1lLnJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNEb2NOb2RlLm5hbWUubGVmdC5lc2NhcGVkVGV4dCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0RvY05vZGUubmFtZS5yaWdodC5lc2NhcGVkVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdEZXNjcmlwdGlvbiArPSBKU0RvY05vZGUudGV4dCArICd7QGxpbmsgJyArIHRleHQgKyAnfSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByYXdEZXNjcmlwdGlvbjtcbiAgICB9XG59XG4iLCJjb25zdCB7IG1hcmtlZCB9ID0gcmVxdWlyZSgnbWFya2VkJyk7XG5cbm1hcmtlZC51c2Uoe1xuICAgIG1hbmdsZTogZmFsc2UsXG4gICAgaGVhZGVySWRzOiBmYWxzZVxufSk7XG5cbmV4cG9ydCBjb25zdCBtYXJrZWRBY2wgPSBtYXJrZWQ7XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IExpbmtQYXJzZXIgfSBmcm9tICcuL2xpbmstcGFyc2VyJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5pbXBvcnQgeyBBbmd1bGFyTGlmZWN5Y2xlSG9va3MgfSBmcm9tICcuL2FuZ3VsYXItbGlmZWN5Y2xlcy1ob29rcyc7XG5pbXBvcnQgeyBraW5kVG9UeXBlIH0gZnJvbSAnLi9raW5kLXRvLXR5cGUnO1xuaW1wb3J0IHsgSnNkb2NQYXJzZXJVdGlsIH0gZnJvbSAnLi9qc2RvYy1wYXJzZXIudXRpbCc7XG5pbXBvcnQgeyBtYXJrZWRBY2wgfSBmcm9tICcuL21hcmtlZC5hY2wnO1xuXG5jb25zdCBnZXRDdXJyZW50RGlyZWN0b3J5ID0gdHMuc3lzLmdldEN1cnJlbnREaXJlY3Rvcnk7XG5jb25zdCB1c2VDYXNlU2Vuc2l0aXZlRmlsZU5hbWVzID0gdHMuc3lzLnVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXM7XG5jb25zdCBuZXdMaW5lID0gdHMuc3lzLm5ld0xpbmU7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdMaW5lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnLScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2Fub25pY2FsRmlsZU5hbWUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXMgPyBmaWxlTmFtZSA6IGZpbGVOYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREaWFnbm9zdGljc0hvc3Q6IHRzLkZvcm1hdERpYWdub3N0aWNzSG9zdCA9IHtcbiAgICBnZXRDdXJyZW50RGlyZWN0b3J5LFxuICAgIGdldENhbm9uaWNhbEZpbGVOYW1lLFxuICAgIGdldE5ld0xpbmVcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWR0YWdzKHRhZ3M6IEFycmF5PGFueT4pIHtcbiAgICBjb25zdCBqc2RvY1BhcnNlclV0aWwgPSBuZXcgSnNkb2NQYXJzZXJVdGlsKCk7XG4gICAgbGV0IG10YWdzID0gdGFncztcbiAgICBfLmZvckVhY2gobXRhZ3MsIHRhZyA9PiB7XG4gICAgICAgIGNvbnN0IHJhd0NvbW1lbnQgPSBqc2RvY1BhcnNlclV0aWwucGFyc2VKU0RvY05vZGUodGFnKTtcbiAgICAgICAgdGFnLmNvbW1lbnQgPSBtYXJrZWRBY2woTGlua1BhcnNlci5yZXNvbHZlTGlua3MocmF3Q29tbWVudCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBtdGFncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVGFnc0FuZEFyZ3MoYXJnczogQXJyYXk8YW55PiwganNkb2N0YWdzPzogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgIGxldCBtYXJncyA9IF8uY2xvbmVEZWVwKGFyZ3MpO1xuICAgIF8uZm9yRWFjaChtYXJncywgYXJnID0+IHtcbiAgICAgICAgYXJnLnRhZ05hbWUgPSB7XG4gICAgICAgICAgICB0ZXh0OiAncGFyYW0nXG4gICAgICAgIH07XG4gICAgICAgIGlmIChqc2RvY3RhZ3MpIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChqc2RvY3RhZ3MsIGpzZG9jdGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2N0YWcubmFtZSAmJiBqc2RvY3RhZy5uYW1lLnRleHQgPT09IGFyZy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZy50YWdOYW1lID0ganNkb2N0YWcudGFnTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYXJnLm5hbWUgPSBqc2RvY3RhZy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhcmcuY29tbWVudCA9IGpzZG9jdGFnLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGFyZy50eXBlRXhwcmVzc2lvbiA9IGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gQWRkIGV4YW1wbGUgJiByZXR1cm5zICYgcHJpdmF0ZVxuICAgIGlmIChqc2RvY3RhZ3MpIHtcbiAgICAgICAgXy5mb3JFYWNoKGpzZG9jdGFncywganNkb2N0YWcgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGpzZG9jdGFnLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAoanNkb2N0YWcudGFnTmFtZS50ZXh0ID09PSAnZXhhbXBsZScgfHwganNkb2N0YWcudGFnTmFtZS50ZXh0ID09PSAncHJpdmF0ZScpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBtYXJncy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGFnTmFtZToganNkb2N0YWcudGFnTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudDoganNkb2N0YWcuY29tbWVudFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGpzZG9jdGFnLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAoanNkb2N0YWcudGFnTmFtZS50ZXh0ID09PSAncmV0dXJucycgfHwganNkb2N0YWcudGFnTmFtZS50ZXh0ID09PSAncmV0dXJuJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldDogeyB0YWdOYW1lOiBzdHJpbmc7IGNvbW1lbnQ6IHN0cmluZzsgcmV0dXJuVHlwZT86IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgICAgICAgICB0YWdOYW1lOiBqc2RvY3RhZy50YWdOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBqc2RvY3RhZy5jb21tZW50XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2N0YWcudHlwZUV4cHJlc3Npb24gJiYganNkb2N0YWcudHlwZUV4cHJlc3Npb24udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXQucmV0dXJuVHlwZSA9IGtpbmRUb1R5cGUoanNkb2N0YWcudHlwZUV4cHJlc3Npb24udHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFyZ3MucHVzaChyZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbmZpZyhjb25maWdGaWxlOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCByZXN1bHQgPSB0cy5yZWFkQ29uZmlnRmlsZShjb25maWdGaWxlLCB0cy5zeXMucmVhZEZpbGUpO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0cy5mb3JtYXREaWFnbm9zdGljcyhbcmVzdWx0LmVycm9yXSwgZm9ybWF0RGlhZ25vc3RpY3NIb3N0KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LmNvbmZpZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwQm9tKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoMCkgPT09IDB4ZmVmZikge1xuICAgICAgICByZXR1cm4gc291cmNlLnNsaWNlKDEpO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQm9tKHNvdXJjZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNvdXJjZS5jaGFyQ29kZUF0KDApID09PSAweGZlZmY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQYXRoKGZpbGVzOiBBcnJheTxzdHJpbmc+LCBjd2Q6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xuICAgIGxldCBfZmlsZXMgPSBmaWxlcztcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGxlbiA9IGZpbGVzLmxlbmd0aDtcblxuICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChmaWxlc1tpXS5pbmRleE9mKGN3ZCkgPT09IC0xKSB7XG4gICAgICAgICAgICBmaWxlc1tpXSA9IHBhdGgucmVzb2x2ZShjd2QgKyBwYXRoLnNlcCArIGZpbGVzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBfZmlsZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMobWV0aG9kczogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBpZiAodHlwZW9mIG1ldGhvZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IG1ldGhvZHMubGVuZ3RoO1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKCEobWV0aG9kc1tpXS5uYW1lIGluIEFuZ3VsYXJMaWZlY3ljbGVIb29rcykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtZXRob2RzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5Tb3VyY2VzRm9yV2F0Y2gobGlzdCkge1xuICAgIHJldHVybiBsaXN0LmZpbHRlcihlbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lc0NvbXBhcmVGbihuYW1lPykge1xuICAgIC8qKlxuICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAqL1xuICAgIG5hbWUgPSBuYW1lIHx8ICduYW1lJztcbiAgICBjb25zdCB0ID0gKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGFbbmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBhW25hbWVdLmxvY2FsZUNvbXBhcmUoYltuYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lnbm9yZShtZW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAobWVtYmVyLmpzRG9jKSB7XG4gICAgICAgIGZvciAoY29uc3QgZG9jIG9mIG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgaWYgKGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy50YWdOYW1lLnRleHQuaW5kZXhPZignaWdub3JlJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbmlmICghQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ2luY2x1ZGVzJywge1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkge1xuICAgICAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widGhpc1wiIGlzIG51bGwgb3Igbm90IGRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMS4gTGV0IE8gYmUgPyBUb09iamVjdCh0aGlzIHZhbHVlKS5cbiAgICAgICAgICAgIGxldCBvID0gT2JqZWN0KHRoaXMpO1xuXG4gICAgICAgICAgICAvLyAyLiBMZXQgbGVuIGJlID8gVG9MZW5ndGgoPyBHZXQoTywgXCJsZW5ndGhcIikpLlxuICAgICAgICAgICAgbGV0IGxlbiA9IG8ubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgICAgICAvLyAzLiBJZiBsZW4gaXMgMCwgcmV0dXJuIGZhbHNlLlxuICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gNC4gTGV0IG4gYmUgPyBUb0ludGVnZXIoZnJvbUluZGV4KS5cbiAgICAgICAgICAgIC8vICAgIChJZiBmcm9tSW5kZXggaXMgdW5kZWZpbmVkLCB0aGlzIHN0ZXAgcHJvZHVjZXMgdGhlIHZhbHVlIDAuKVxuICAgICAgICAgICAgbGV0IG4gPSBmcm9tSW5kZXggfCAwO1xuXG4gICAgICAgICAgICAvLyA1LiBJZiBuIOKJpSAwLCB0aGVuXG4gICAgICAgICAgICAvLyAgYS4gTGV0IGsgYmUgbi5cbiAgICAgICAgICAgIC8vIDYuIEVsc2UgbiA8IDAsXG4gICAgICAgICAgICAvLyAgYS4gTGV0IGsgYmUgbGVuICsgbi5cbiAgICAgICAgICAgIC8vICBiLiBJZiBrIDwgMCwgbGV0IGsgYmUgMC5cbiAgICAgICAgICAgIGxldCBrID0gTWF0aC5tYXgobiA+PSAwID8gbiA6IGxlbiAtIE1hdGguYWJzKG4pLCAwKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gc2FtZVZhbHVlWmVybyh4LCB5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgeCA9PT0geSB8fFxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHggPT09ICdudW1iZXInICYmIHR5cGVvZiB5ID09PSAnbnVtYmVyJyAmJiBpc05hTih4KSAmJiBpc05hTih5KSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA3LiBSZXBlYXQsIHdoaWxlIGsgPCBsZW5cbiAgICAgICAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgLy8gYS4gTGV0IGVsZW1lbnRLIGJlIHRoZSByZXN1bHQgb2YgPyBHZXQoTywgISBUb1N0cmluZyhrKSkuXG4gICAgICAgICAgICAgICAgLy8gYi4gSWYgU2FtZVZhbHVlWmVybyhzZWFyY2hFbGVtZW50LCBlbGVtZW50SykgaXMgdHJ1ZSwgcmV0dXJuIHRydWUuXG4gICAgICAgICAgICAgICAgaWYgKHNhbWVWYWx1ZVplcm8ob1trXSwgc2VhcmNoRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGMuIEluY3JlYXNlIGsgYnkgMS5cbiAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDguIFJldHVybiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTWFpblNvdXJjZUZvbGRlcihmaWxlczogc3RyaW5nW10pIHtcbiAgICBsZXQgbWFpbkZvbGRlciA9ICcnO1xuICAgIGxldCBtYWluRm9sZGVyQ291bnQgPSAwO1xuICAgIGxldCByYXdGb2xkZXJzID0gZmlsZXMubWFwKGZpbGVwYXRoID0+IHtcbiAgICAgICAgbGV0IHNob3J0UGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIHJldHVybiBwYXRoLmRpcm5hbWUoc2hvcnRQYXRoKTtcbiAgICB9KTtcbiAgICBsZXQgZm9sZGVycyA9IHt9O1xuICAgIHJhd0ZvbGRlcnMgPSBfLnVuaXEocmF3Rm9sZGVycyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0ZvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNlcCA9IHJhd0ZvbGRlcnNbaV0uc3BsaXQocGF0aC5zZXApO1xuICAgICAgICBzZXAuZm9yRWFjaChmb2xkZXIgPT4ge1xuICAgICAgICAgICAgaWYgKGZvbGRlcnNbZm9sZGVyXSkge1xuICAgICAgICAgICAgICAgIGZvbGRlcnNbZm9sZGVyXSArPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb2xkZXJzW2ZvbGRlcl0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgZiBpbiBmb2xkZXJzKSB7XG4gICAgICAgIGlmIChmb2xkZXJzW2ZdID4gbWFpbkZvbGRlckNvdW50KSB7XG4gICAgICAgICAgICBtYWluRm9sZGVyQ291bnQgPSBmb2xkZXJzW2ZdO1xuICAgICAgICAgICAgbWFpbkZvbGRlciA9IGY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1haW5Gb2xkZXI7XG59XG5cbi8vIENyZWF0ZSBhIGNvbXBpbGVySG9zdCBvYmplY3QgdG8gYWxsb3cgdGhlIGNvbXBpbGVyIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZXJIb3N0KHRyYW5zcGlsZU9wdGlvbnM6IGFueSk6IHRzLkNvbXBpbGVySG9zdCB7XG4gICAgY29uc3QgaW5wdXRGaWxlTmFtZSA9XG4gICAgICAgIHRyYW5zcGlsZU9wdGlvbnMuZmlsZU5hbWUgfHwgKHRyYW5zcGlsZU9wdGlvbnMuanN4ID8gJ21vZHVsZS50c3gnIDogJ21vZHVsZS50cycpO1xuXG4gICAgY29uc3QgdG9SZXR1cm46IHRzLkNvbXBpbGVySG9zdCA9IHtcbiAgICAgICAgZ2V0U291cmNlRmlsZTogKGZpbGVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLnRzJykgIT09IC0xIHx8IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuanMnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgPT09ICdsaWIuZC50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLnN1YnN0cigtNSkgPT09ICcuZC50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0aC5pc0Fic29sdXRlKGZpbGVOYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBwYXRoLmpvaW4odHJhbnNwaWxlT3B0aW9ucy50c2NvbmZpZ0RpcmVjdG9yeSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGxpYlNvdXJjZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGliU291cmNlID0gZnMucmVhZEZpbGVTeW5jKGZpbGVOYW1lKS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNCb20obGliU291cmNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGliU291cmNlID0gc3RyaXBCb20obGliU291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGUsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHMuY3JlYXRlU291cmNlRmlsZShmaWxlTmFtZSwgbGliU291cmNlLCB0cmFuc3BpbGVPcHRpb25zLnRhcmdldCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgd3JpdGVGaWxlOiAobmFtZSwgdGV4dCkgPT4ge30sXG4gICAgICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKCkgPT4gJ2xpYi5kLnRzJyxcbiAgICAgICAgdXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lczogKCkgPT4gZmFsc2UsXG4gICAgICAgIGdldENhbm9uaWNhbEZpbGVOYW1lOiBmaWxlTmFtZSA9PiBmaWxlTmFtZSxcbiAgICAgICAgZ2V0Q3VycmVudERpcmVjdG9yeTogKCkgPT4gJycsXG4gICAgICAgIGdldE5ld0xpbmU6ICgpID0+ICdcXG4nLFxuICAgICAgICBmaWxlRXhpc3RzOiAoZmlsZU5hbWUpOiBib29sZWFuID0+IGZpbGVOYW1lID09PSBpbnB1dEZpbGVOYW1lLFxuICAgICAgICByZWFkRmlsZTogKCkgPT4gJycsXG4gICAgICAgIGRpcmVjdG9yeUV4aXN0czogKCkgPT4gdHJ1ZSxcbiAgICAgICAgZ2V0RGlyZWN0b3JpZXM6ICgpID0+IFtdXG4gICAgfTtcblxuICAgIHJldHVybiB0b1JldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHIsIGNvdW50KTogc3RyaW5nIHtcbiAgICBsZXQgc3RyaXBJbmRlbnQgPSAoc3RyaXBlZFN0cmluZzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3RyaXBlZFN0cmluZy5tYXRjaCgvXlsgXFx0XSooPz1cXFMpL2dtKTtcblxuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaXBlZFN0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGVudCA9IE1hdGgubWluKC4uLm1hdGNoLm1hcCh4ID0+IHgubGVuZ3RoKSk7XG4gICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXlsgXFxcXHRdeyR7aW5kZW50fX1gLCAnZ20nKTtcblxuICAgICAgICByZXR1cm4gaW5kZW50ID4gMCA/IHN0cmlwZWRTdHJpbmcucmVwbGFjZShyZSwgJycpIDogc3RyaXBlZFN0cmluZztcbiAgICB9O1xuXG4gICAgbGV0IHJlcGVhdGluZyA9IChuLCByZXBlYXRTdHJpbmcpID0+IHtcbiAgICAgICAgcmVwZWF0U3RyaW5nID0gcmVwZWF0U3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiByZXBlYXRTdHJpbmc7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXBlYXRTdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBcXGBpbnB1dFxcYCB0byBiZSBhIFxcYHN0cmluZ1xcYCwgZ290IFxcYCR7dHlwZW9mIHJlcGVhdFN0cmluZ31cXGBgXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjb3VudFxcYCB0byBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIsIGdvdCBcXGAke259XFxgYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0ID0gJyc7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKG4gJiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0ICs9IHJlcGVhdFN0cmluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVwZWF0U3RyaW5nICs9IHJlcGVhdFN0cmluZztcbiAgICAgICAgfSB3aGlsZSAoKG4gPj49IDEpKTtcblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICBsZXQgaW5kZW50U3RyaW5nID0gKGluZGVudGVkU3RyaW5nLCBpbmRlbnRDb3VudCkgPT4ge1xuICAgICAgICBsZXQgaW5kZW50ID0gJyAnO1xuICAgICAgICBpbmRlbnRDb3VudCA9IGluZGVudENvdW50ID09PSB1bmRlZmluZWQgPyAxIDogaW5kZW50Q291bnQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbmRlbnRlZFN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIFxcYGlucHV0XFxgIHRvIGJlIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2YgaW5kZW50ZWRTdHJpbmd9XFxgYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5kZW50Q291bnQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBcXGBjb3VudFxcYCB0byBiZSBhIFxcYG51bWJlclxcYCwgZ290IFxcYCR7dHlwZW9mIGluZGVudENvdW50fVxcYGBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGluZGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGluZGVudFxcYCB0byBiZSBhIFxcYHN0cmluZ1xcYCwgZ290IFxcYCR7dHlwZW9mIGluZGVudH1cXGBgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRlbnRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGluZGVudGVkU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZW50ID0gaW5kZW50Q291bnQgPiAxID8gcmVwZWF0aW5nKGluZGVudENvdW50LCBpbmRlbnQpIDogaW5kZW50O1xuXG4gICAgICAgIHJldHVybiBpbmRlbnRlZFN0cmluZy5yZXBsYWNlKC9eKD8hXFxzKiQpL2dtLCBpbmRlbnQpO1xuICAgIH07XG5cbiAgICByZXR1cm4gaW5kZW50U3RyaW5nKHN0cmlwSW5kZW50KHN0ciksIGNvdW50IHx8IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Vic3RyaW5nRnJvbU11bHRpbGluZVN0cmluZyhtdWx0aWxpbmVTdHJpbmc6IHN0cmluZywgc3RhcnRMaW5lOiBudW1iZXIsIHN0YXJ0Q29sdW1uOiBudW1iZXIsIGVuZExpbmU6IG51bWJlciwgZW5kQ29sdW1uOiBudW1iZXIpIHtcbiAgICAvLyBTcGxpdCB0aGUgc3RyaW5nIGludG8gbGluZXNcbiAgICBjb25zdCBsaW5lcyA9IG11bHRpbGluZVN0cmluZy5zcGxpdCgnXFxuJyk7XG5cbiAgICAvLyBTbGljZSB0aGUgbGluZXMgZnJvbSBzdGFydExpbmUgdG8gZW5kTGluZVxuICAgIGNvbnN0IHNlbGVjdGVkTGluZXMgPSBsaW5lcy5zbGljZShzdGFydExpbmUgLSAxLCBlbmRMaW5lKTtcblxuICAgIC8vIElmIHN0YXJ0TGluZSBhbmQgZW5kTGluZSBhcmUgdGhlIHNhbWUsIHNsaWNlIHRoZSBsaW5lIGZyb20gc3RhcnRDb2x1bW4gdG8gZW5kQ29sdW1uXG4gICAgaWYgKHN0YXJ0TGluZSA9PT0gZW5kTGluZSkge1xuICAgICAgICBzZWxlY3RlZExpbmVzWzBdID0gc2VsZWN0ZWRMaW5lc1swXS5zbGljZShzdGFydENvbHVtbiArIDEsIGVuZENvbHVtbiAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2xpY2UgdGhlIHN0YXJ0IGxpbmUgZnJvbSBzdGFydENvbHVtbiB0byB0aGUgZW5kXG4gICAgICAgIHNlbGVjdGVkTGluZXNbMF0gPSBzZWxlY3RlZExpbmVzWzBdLnNsaWNlKHN0YXJ0Q29sdW1uICsgMSk7XG5cbiAgICAgICAgLy8gQW5kIHNsaWNlIHRoZSBlbmQgbGluZSBmcm9tIHRoZSBzdGFydCB0byBlbmRDb2x1bW5cbiAgICAgICAgc2VsZWN0ZWRMaW5lc1tzZWxlY3RlZExpbmVzLmxlbmd0aCAtIDFdID0gc2VsZWN0ZWRMaW5lc1tzZWxlY3RlZExpbmVzLmxlbmd0aCAtIDFdLnNsaWNlKDAsIGVuZENvbHVtbiAtIDEpO1xuICAgIH1cblxuICAgIC8vIEpvaW4gdGhlIGxpbmVzIGJhY2sgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBzdHJpbmdcbiAgICByZXR1cm4gc2VsZWN0ZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZXhwb3J0IGNvbnN0IElOQ0xVREVfUEFUVEVSTlMgPSBbJyoqLyoudHMnLCAnKiovKi50c3gnXTtcblxuZXhwb3J0IGNvbnN0IEVYQ0xVREVfUEFUVEVSTlMgPSBbJyoqLy5naXQnLCAnKiovbm9kZV9tb2R1bGVzJywgJyoqLyouZC50cycsICcqKi8qLnNwZWMudHMnXTtcbiIsImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgTWlzY2VsbGFuZW91c0RhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL21pc2NlbGxhbmVvdXMtZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUGFyc2VkRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcGFyc2VkLWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJvdXRlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yb3V0ZXMuaW50ZXJmYWNlJztcblxuaW1wb3J0IEFuZ3VsYXJBcGlVdGlsIGZyb20gJy4uLy4uL3V0aWxzL2FuZ3VsYXItYXBpLnV0aWwnO1xuaW1wb3J0IHsgSUFwaVNvdXJjZVJlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL2FwaS1zb3VyY2UtcmVzdWx0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBnZXROYW1lc0NvbXBhcmVGbiB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgICBJRW51bURlY0RlcCxcbiAgICBJRnVuY3Rpb25EZWNEZXAsXG4gICAgSUd1YXJkRGVwLFxuICAgIElJbmplY3RhYmxlRGVwLFxuICAgIElJbnRlcmNlcHRvckRlcCxcbiAgICBJSW50ZXJmYWNlRGVwLFxuICAgIElQaXBlRGVwLFxuICAgIElUeXBlQWxpYXNEZWNEZXBcbn0gZnJvbSAnLi4vY29tcGlsZXIvYW5ndWxhci9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IElDb21wb25lbnREZXAgfSBmcm9tICcuLi9jb21waWxlci9hbmd1bGFyL2RlcHMvY29tcG9uZW50LWRlcC5mYWN0b3J5JztcbmltcG9ydCB7IElDb250cm9sbGVyRGVwIH0gZnJvbSAnLi4vY29tcGlsZXIvYW5ndWxhci9kZXBzL2NvbnRyb2xsZXItZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSURpcmVjdGl2ZURlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSU1vZHVsZURlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9tb2R1bGUtZGVwLmZhY3RvcnknO1xuXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ25lb3RyYXZlcnNlL2xlZ2FjeScpO1xuXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jaWVzRW5naW5lIHtcbiAgICBwdWJsaWMgcmF3RGF0YTogUGFyc2VkRGF0YTtcbiAgICBwdWJsaWMgbW9kdWxlczogT2JqZWN0W107XG4gICAgcHVibGljIHJhd01vZHVsZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyByYXdNb2R1bGVzRm9yT3ZlcnZpZXc6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBjb21wb25lbnRzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgY29udHJvbGxlcnM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBlbnRpdGllczogT2JqZWN0W107XG4gICAgcHVibGljIGRpcmVjdGl2ZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBpbmplY3RhYmxlczogT2JqZWN0W107XG4gICAgcHVibGljIGludGVyY2VwdG9yczogT2JqZWN0W107XG4gICAgcHVibGljIGd1YXJkczogT2JqZWN0W107XG4gICAgcHVibGljIGludGVyZmFjZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyByb3V0ZXM6IFJvdXRlSW50ZXJmYWNlO1xuICAgIHB1YmxpYyBwaXBlczogT2JqZWN0W107XG4gICAgcHVibGljIGNsYXNzZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBtaXNjZWxsYW5lb3VzOiBNaXNjZWxsYW5lb3VzRGF0YSA9IHtcbiAgICAgICAgdmFyaWFibGVzOiBbXSxcbiAgICAgICAgZnVuY3Rpb25zOiBbXSxcbiAgICAgICAgdHlwZWFsaWFzZXM6IFtdLFxuICAgICAgICBlbnVtZXJhdGlvbnM6IFtdLFxuICAgICAgICBncm91cGVkVmFyaWFibGVzOiBbXSxcbiAgICAgICAgZ3JvdXBlZEZ1bmN0aW9uczogW10sXG4gICAgICAgIGdyb3VwZWRFbnVtZXJhdGlvbnM6IFtdLFxuICAgICAgICBncm91cGVkVHlwZUFsaWFzZXM6IFtdXG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBEZXBlbmRlbmNpZXNFbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFEZXBlbmRlbmNpZXNFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5pbnN0YW5jZSA9IG5ldyBEZXBlbmRlbmNpZXNFbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVwZW5kZW5jaWVzRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTW9kdWxlc0RlY2xhcmF0aW9uc0V4cG9ydHNUeXBlcygpIHtcbiAgICAgICAgY29uc3QgbWVyZ2VUeXBlcyA9IGVudHJ5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZSA9IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMoXG4gICAgICAgICAgICAgICAgZW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgICAgZW50cnkuZmlsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGlyZWN0aXZlLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHlwZSA9ICdkaXJlY3RpdmUnO1xuICAgICAgICAgICAgICAgIGVudHJ5LmlkID0gZGlyZWN0aXZlLmRhdGEuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMoXG4gICAgICAgICAgICAgICAgZW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgZW50cnkuZmlsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHlwZSA9ICdjb21wb25lbnQnO1xuICAgICAgICAgICAgICAgIGVudHJ5LmlkID0gY29tcG9uZW50LmRhdGEuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBpcGUgPSB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKGVudHJ5Lm5hbWUsIHRoaXMucGlwZXMsIGVudHJ5LmZpbGUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwaXBlLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHlwZSA9ICdwaXBlJztcbiAgICAgICAgICAgICAgICBlbnRyeS5pZCA9IHBpcGUuZGF0YS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm1vZHVsZXMuZm9yRWFjaCgobW9kdWxlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIG1vZHVsZS5kZWNsYXJhdGlvbnMuZm9yRWFjaChkZWNsYXJhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2VUeXBlcyhkZWNsYXJhdGlvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzLmZvckVhY2goZXhwdCA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2VUeXBlcyhleHB0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW9kdWxlLmVudHJ5Q29tcG9uZW50cy5mb3JFYWNoKGVudCA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2VUeXBlcyhlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KGRhdGE6IFBhcnNlZERhdGEpIHtcbiAgICAgICAgdHJhdmVyc2UoZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUucGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJhd0RhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLm1vZHVsZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEubW9kdWxlcywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLnJhd01vZHVsZXNGb3JPdmVydmlldyA9IF8uc29ydEJ5KGRhdGEubW9kdWxlc0ZvckdyYXBoLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMucmF3TW9kdWxlcyA9IF8uc29ydEJ5KGRhdGEubW9kdWxlc0ZvckdyYXBoLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5jb21wb25lbnRzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuY29udHJvbGxlcnMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5lbnRpdGllcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5lbnRpdGllcywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuZGlyZWN0aXZlcywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLmluamVjdGFibGVzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmluamVjdGFibGVzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmludGVyY2VwdG9ycywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLmd1YXJkcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5ndWFyZHMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5pbnRlcmZhY2VzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmludGVyZmFjZXMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5waXBlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5waXBlcywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuY2xhc3NlcywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMgPSB0aGlzLnJhd0RhdGEubWlzY2VsbGFuZW91cztcbiAgICAgICAgdGhpcy5wcmVwYXJlTWlzY2VsbGFuZW91cygpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1vZHVsZXNEZWNsYXJhdGlvbnNFeHBvcnRzVHlwZXMoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXMgPSB0aGlzLnJhd0RhdGEucm91dGVzVHJlZTtcbiAgICAgICAgdGhpcy5tYW5hZ2VEdXBsaWNhdGVzTmFtZSgpO1xuICAgICAgICB0aGlzLmNsZWFuUmF3TW9kdWxlc05hbWVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhblJhd01vZHVsZXNOYW1lcygpIHtcbiAgICAgICAgdGhpcy5yYXdNb2R1bGVzRm9yT3ZlcnZpZXcgPSB0aGlzLnJhd01vZHVsZXNGb3JPdmVydmlldy5tYXAoKG1vZHVsZTogYW55KSA9PiB7XG4gICAgICAgICAgICBtb2R1bGUubmFtZSA9IG1vZHVsZS5uYW1lLnJlcGxhY2UoJyQnLCAnJyk7XG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIGRhdGEsIGZpbGU/KTogSUFwaVNvdXJjZVJlc3VsdDxhbnk+IHtcbiAgICAgICAgbGV0IF9yZXN1bHQgPSB7XG4gICAgICAgICAgICBzb3VyY2U6ICdpbnRlcm5hbCcsXG4gICAgICAgICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzY29yZTogMFxuICAgICAgICB9O1xuICAgICAgICBsZXQgbmFtZUZvdW5kQ291bnRlciA9IDA7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9PT0gZGF0YVtpXS5uYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykuaW5kZXhPZihkYXRhW2ldLmZpbGUpICE9PSAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUZvdW5kQ291bnRlciArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YSA9IGRhdGFbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5zY29yZSA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuaW5kZXhPZihkYXRhW2ldLm5hbWUpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpLmluZGV4T2YoZGF0YVtpXS5maWxlKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVGb3VuZENvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEgPSBkYXRhW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuc2NvcmUgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGRhdGFbaV0ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVGb3VuZENvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEgPSBkYXRhW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuc2NvcmUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmluZGV4T2YoZGF0YVtpXS5uYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lRm91bmRDb3VudGVyICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhID0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LnNjb3JlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJldmVudCB3cm9uZyBtYXRjaGluZyBsaWtlIE11bHRpU2VsZWN0T3B0aW9uRGlyZWN0aXZlIHdpdGggU2VsZWN0T3B0aW9uRGlyZWN0aXZlLCBvciBRdWVyeVBhcmFtR3JvdXBTZXJ2aWNlIHdpdGggUXVlcnlQYXJhbUdyb3VwXG4gICAgICAgICAgICBpZiAobmFtZUZvdW5kQ291bnRlciA+IDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBkYXRhW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEgPSBkYXRhW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LnNjb3JlID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBkYXRhW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEgPSBkYXRhW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LnNjb3JlID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaW50ZXJuYWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmU6IDBcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW5hZ2VEdXBsaWNhdGVzTmFtZSgpIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc0R1cGxpY2F0ZXMgPSAoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c1dpdGhTYW1lTmFtZSA9IF8uZmlsdGVyKGFycmF5LCB7IG5hbWU6IGVsZW1lbnQubmFtZSB9KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50c1dpdGhTYW1lTmFtZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgZWxlbWVudCBpcyB0aGUgcmVmZXJlbmNlIGZvciBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBlbGVtZW50c1dpdGhTYW1lTmFtZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFRvRWRpdCA9IGVsZW1lbnRzV2l0aFNhbWVOYW1lW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnRUb0VkaXQuaXNEdXBsaWNhdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9FZGl0LmlzRHVwbGljYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0VkaXQuZHVwbGljYXRlSWQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9FZGl0Lm5hbWUgKyAnLScgKyBlbGVtZW50VG9FZGl0LmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvRWRpdC5pZCA9IGVsZW1lbnRUb0VkaXQuaWQgKyAnLScgKyBlbGVtZW50VG9FZGl0LmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2xhc3NlcyA9IHRoaXMuY2xhc3Nlcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgICAgICB0aGlzLmludGVyZmFjZXMgPSB0aGlzLmludGVyZmFjZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5pbmplY3RhYmxlcyA9IHRoaXMuaW5qZWN0YWJsZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5waXBlcyA9IHRoaXMucGlwZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMgPSB0aGlzLmludGVyY2VwdG9ycy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgICAgICB0aGlzLmd1YXJkcyA9IHRoaXMuZ3VhcmRzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IHRoaXMubW9kdWxlcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IHRoaXMuY29udHJvbGxlcnMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5lbnRpdGllcyA9IHRoaXMuZW50aXRpZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gdGhpcy5kaXJlY3RpdmVzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmQobmFtZTogc3RyaW5nKTogSUFwaVNvdXJjZVJlc3VsdDxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRnVuY3Rpb25zOiBBcnJheTwoKSA9PiBJQXBpU291cmNlUmVzdWx0PGFueT4+ID0gW1xuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLm1vZHVsZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmluamVjdGFibGVzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5pbnRlcmNlcHRvcnMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmd1YXJkcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuaW50ZXJmYWNlcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuY2xhc3NlcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuY29udHJvbGxlcnMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmVudGl0aWVzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5kaXJlY3RpdmVzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zKSxcbiAgICAgICAgICAgICgpID0+IEFuZ3VsYXJBcGlVdGlsLmZpbmRBcGkobmFtZSlcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgYmVzdFNjb3JlID0gMDtcbiAgICAgICAgbGV0IGJlc3RSZXN1bHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgZm9yIChsZXQgc2VhcmNoRnVuY3Rpb24gb2Ygc2VhcmNoRnVuY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBzZWFyY2hGdW5jdGlvbigpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEgJiYgcmVzdWx0LnNjb3JlID4gYmVzdFNjb3JlKSB7XG4gICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gcmVzdWx0LnNjb3JlO1xuICAgICAgICAgICAgICAgIGJlc3RSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmVzdFJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKHVwZGF0ZWREYXRhKTogdm9pZCB7XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5tb2R1bGVzLCAobW9kdWxlOiBJTW9kdWxlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5tb2R1bGVzLCB7IG5hbWU6IG1vZHVsZS5uYW1lIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbX2luZGV4XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5jb21wb25lbnRzLCAoY29tcG9uZW50OiBJQ29tcG9uZW50RGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5jb21wb25lbnRzLCB7IG5hbWU6IGNvbXBvbmVudC5uYW1lIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbX2luZGV4XSA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuY29udHJvbGxlcnMsIChjb250cm9sbGVyOiBJQ29udHJvbGxlckRlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuY29udHJvbGxlcnMsIHsgbmFtZTogY29udHJvbGxlci5uYW1lIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW19pbmRleF0gPSBjb250cm9sbGVyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5lbnRpdGllcywgKGVudGl0eTogSUNvbnRyb2xsZXJEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmVudGl0aWVzLCB7IG5hbWU6IGVudGl0eS5uYW1lIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVudGl0aWVzW19pbmRleF0gPSBlbnRpdHk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuZGlyZWN0aXZlcywgKGRpcmVjdGl2ZTogSURpcmVjdGl2ZURlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuZGlyZWN0aXZlcywgeyBuYW1lOiBkaXJlY3RpdmUubmFtZSB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzW19pbmRleF0gPSBkaXJlY3RpdmU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmluamVjdGFibGVzLCAoaW5qZWN0YWJsZTogSUluamVjdGFibGVEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmluamVjdGFibGVzLCB7IG5hbWU6IGluamVjdGFibGUubmFtZSB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmplY3RhYmxlc1tfaW5kZXhdID0gaW5qZWN0YWJsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmludGVyY2VwdG9ycywgKGludGVyY2VwdG9yOiBJSW50ZXJjZXB0b3JEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmludGVyY2VwdG9ycywgeyBuYW1lOiBpbnRlcmNlcHRvci5uYW1lIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyY2VwdG9yc1tfaW5kZXhdID0gaW50ZXJjZXB0b3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5ndWFyZHMsIChndWFyZDogSUd1YXJkRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5ndWFyZHMsIHsgbmFtZTogZ3VhcmQubmFtZSB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ndWFyZHNbX2luZGV4XSA9IGd1YXJkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmludGVyZmFjZXMsIChpbnQ6IElJbnRlcmZhY2VEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmludGVyZmFjZXMsIHsgbmFtZTogaW50Lm5hbWUgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJmYWNlc1tfaW5kZXhdID0gaW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5waXBlcywgKHBpcGU6IElQaXBlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5waXBlcywgeyBuYW1lOiBwaXBlLm5hbWUgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIHRoaXMucGlwZXNbX2luZGV4XSA9IHBpcGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuY2xhc3NlcywgKGNsYXNzZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5jbGFzc2VzLCB7IG5hbWU6IGNsYXNzZS5uYW1lIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsYXNzZXNbX2luZGV4XSA9IGNsYXNzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNaXNjZWxsYW5lb3VzIHVwZGF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcywgKHZhcmlhYmxlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHZhcmlhYmxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IHZhcmlhYmxlLmZpbGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzW19pbmRleF0gPSB2YXJpYWJsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMsIChmdW5jOiBJRnVuY3Rpb25EZWNEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGZ1bmMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogZnVuYy5maWxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9uc1tfaW5kZXhdID0gZnVuYztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLCAodHlwZWFsaWFzOiBJVHlwZUFsaWFzRGVjRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHR5cGVhbGlhcy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlOiB0eXBlYWxpYXMuZmlsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlc1tfaW5kZXhdID0gdHlwZWFsaWFzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucywgKGVudW1lcmF0aW9uOiBJRW51bURlY0RlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZW51bWVyYXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogZW51bWVyYXRpb24uZmlsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnNbX2luZGV4XSA9IGVudW1lcmF0aW9uO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVwYXJlTWlzY2VsbGFuZW91cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kSW5Db21wb2RvYyhuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkRGF0YSA9IF8uY29uY2F0KFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB0aGlzLm1vZHVsZXMsXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzLFxuICAgICAgICAgICAgdGhpcy5lbnRpdGllcyxcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyxcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0YWJsZXMsXG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdG9ycyxcbiAgICAgICAgICAgIHRoaXMuZ3VhcmRzLFxuICAgICAgICAgICAgdGhpcy5pbnRlcmZhY2VzLFxuICAgICAgICAgICAgdGhpcy5waXBlcyxcbiAgICAgICAgICAgIHRoaXMuY2xhc3NlcyxcbiAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMsXG4gICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMsXG4gICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLFxuICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9uc1xuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBfLmZpbmQobWVyZ2VkRGF0YSwgeyBuYW1lOiBuYW1lIH0gYXMgYW55KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVNaXNjZWxsYW5lb3VzKCkge1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgLy8gZ3JvdXAgZWFjaCBzdWJnb3VwIGJ5IGZpbGVcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRWYXJpYWJsZXMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRGdW5jdGlvbnMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRFbnVtZXJhdGlvbnMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRUeXBlQWxpYXNlcyA9IF8uZ3JvdXBCeSh0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMsICdmaWxlJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIF8uZmluZCh0aGlzLm1vZHVsZXMsIFsnbmFtZScsIG5hbWVdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmF3TW9kdWxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiBfLmZpbmQodGhpcy5yYXdNb2R1bGVzLCBbJ25hbWUnLCBuYW1lXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbnRyb2xsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW50aXRpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREaXJlY3RpdmVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RpdmVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJbmplY3RhYmxlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0YWJsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEludGVyY2VwdG9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0b3JzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHdWFyZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1YXJkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SW50ZXJmYWNlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJmYWNlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Um91dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBpcGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waXBlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2xhc3NlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWlzY2VsbGFuZW91cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlzY2VsbGFuZW91cztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERlcGVuZGVuY2llc0VuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGNsYXNzIEZpbGVFbmdpbmUge1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBGaWxlRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghRmlsZUVuZ2luZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgRmlsZUVuZ2luZS5pbnN0YW5jZSA9IG5ldyBGaWxlRW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChmaWxlcGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGZzLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShmaWxlcGF0aCksICd1dGY4JywgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdFcnJvciBkdXJpbmcgJyArIGZpbGVwYXRoICsgJyByZWFkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGZpbGVwYXRoOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGZzLm91dHB1dEZpbGUocGF0aC5yZXNvbHZlKGZpbGVwYXRoKSwgY29udGVudHMsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN5bmMoZmlsZXBhdGg6IHN0cmluZywgY29udGVudHM6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBmcy5vdXRwdXRGaWxlU3luYyhmaWxlcGF0aCwgY29udGVudHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTeW5jKGZpbGVwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShmaWxlcGF0aCksICd1dGY4Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhpc3RzU3luYyhmaWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMoZmlsZSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCBEZXBlbmRlbmNpZXNFbmdpbmUgZnJvbSAnLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcblxuaW1wb3J0IHsgRXhwb3J0RGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXhwb3J0LWRhdGEuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgQW5ndWxhck5nTW9kdWxlTm9kZSB9IGZyb20gJy4uL25vZGVzL2FuZ3VsYXItbmdtb2R1bGUtbm9kZSc7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCduZW90cmF2ZXJzZS9sZWdhY3knKTtcblxuZXhwb3J0IGNsYXNzIEV4cG9ydEpzb25FbmdpbmUge1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBFeHBvcnRKc29uRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghRXhwb3J0SnNvbkVuZ2luZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgRXhwb3J0SnNvbkVuZ2luZS5pbnN0YW5jZSA9IG5ldyBFeHBvcnRKc29uRW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEV4cG9ydEpzb25FbmdpbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGV4cG9ydChvdXRwdXRGb2xkZXIsIGRhdGEpIHtcbiAgICAgICAgbGV0IGV4cG9ydERhdGE6IEV4cG9ydERhdGEgPSB7fTtcblxuICAgICAgICB0cmF2ZXJzZShkYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU291cmNlQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5zb3VyY2VDb2RlO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS50ZW1wbGF0ZURhdGE7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLnN0eWxlVXJsc0RhdGE7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLnN0eWxlc0RhdGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBleHBvcnREYXRhLnBpcGVzID0gZGF0YS5waXBlcztcbiAgICAgICAgZXhwb3J0RGF0YS5pbnRlcmZhY2VzID0gZGF0YS5pbnRlcmZhY2VzO1xuICAgICAgICBleHBvcnREYXRhLmluamVjdGFibGVzID0gZGF0YS5pbmplY3RhYmxlcztcbiAgICAgICAgZXhwb3J0RGF0YS5ndWFyZHMgPSBkYXRhLmd1YXJkcztcbiAgICAgICAgZXhwb3J0RGF0YS5pbnRlcmNlcHRvcnMgPSBkYXRhLmludGVyY2VwdG9ycztcbiAgICAgICAgZXhwb3J0RGF0YS5jbGFzc2VzID0gZGF0YS5jbGFzc2VzO1xuICAgICAgICBleHBvcnREYXRhLmRpcmVjdGl2ZXMgPSBkYXRhLmRpcmVjdGl2ZXM7XG4gICAgICAgIGV4cG9ydERhdGEuY29tcG9uZW50cyA9IGRhdGEuY29tcG9uZW50cztcbiAgICAgICAgZXhwb3J0RGF0YS5tb2R1bGVzID0gdGhpcy5wcm9jZXNzTW9kdWxlcygpO1xuICAgICAgICBleHBvcnREYXRhLm1pc2NlbGxhbmVvdXMgPSBkYXRhLm1pc2NlbGxhbmVvdXM7XG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGgpIHtcbiAgICAgICAgICAgIGV4cG9ydERhdGEucm91dGVzID0gZGF0YS5yb3V0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSkge1xuICAgICAgICAgICAgZXhwb3J0RGF0YS5jb3ZlcmFnZSA9IGRhdGEuY292ZXJhZ2VEYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUud3JpdGUoXG4gICAgICAgICAgICBvdXRwdXRGb2xkZXIgKyBwYXRoLnNlcCArICcvZG9jdW1lbnRhdGlvbi5qc29uJyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGV4cG9ydERhdGEsIHVuZGVmaW5lZCwgNClcbiAgICAgICAgKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgZXhwb3J0IGZpbGUgZ2VuZXJhdGlvbiAnLCBlcnIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcm9jZXNzTW9kdWxlcygpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlczogQW5ndWxhck5nTW9kdWxlTm9kZVtdID0gRGVwZW5kZW5jaWVzRW5naW5lLmdldE1vZHVsZXMoKTtcblxuICAgICAgICBsZXQgX3Jlc3VsdGVkTW9kdWxlcyA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IG1vZHVsZU5yID0gMDsgbW9kdWxlTnIgPCBtb2R1bGVzLmxlbmd0aDsgbW9kdWxlTnIrKykge1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlID0gbW9kdWxlc1ttb2R1bGVOcl07XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVFbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5uYW1lLFxuICAgICAgICAgICAgICAgIGlkOiBtb2R1bGUuaWQsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG1vZHVsZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICByYXdEZXNjcmlwdGlvbjogbW9kdWxlLnJhd0Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogbW9kdWxlLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBtb2R1bGUuZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICBmaWxlOiBtb2R1bGUuZmlsZSxcbiAgICAgICAgICAgICAgICBtZXRob2RzOiBtb2R1bGUubWV0aG9kcyxcbiAgICAgICAgICAgICAgICBzb3VyY2VDb2RlOiBtb2R1bGUuc291cmNlQ29kZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncHJvdmlkZXJzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVjbGFyYXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW1wb3J0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogW11cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2V4cG9ydHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdib290c3RyYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbGFzc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtb2R1bGUucHJvdmlkZXJzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvdmlkZXJFbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGUucHJvdmlkZXJzW2tdLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuY2hpbGRyZW5bMF0uZWxlbWVudHMucHVzaChwcm92aWRlckVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtb2R1bGUuZGVjbGFyYXRpb25zLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb25FbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGUuZGVjbGFyYXRpb25zW2tdLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuY2hpbGRyZW5bMV0uZWxlbWVudHMucHVzaChkZWNsYXJhdGlvbkVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtb2R1bGUuaW1wb3J0cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGltcG9ydEVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5pbXBvcnRzW2tdLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuY2hpbGRyZW5bMl0uZWxlbWVudHMucHVzaChpbXBvcnRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbW9kdWxlLmV4cG9ydHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBvcnRFbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGUuZXhwb3J0c1trXS5uYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtb2R1bGVFbGVtZW50LmNoaWxkcmVuWzNdLmVsZW1lbnRzLnB1c2goZXhwb3J0RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1vZHVsZS5ib290c3RyYXAubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBib290c3RyYXBFbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGUuYm9vdHN0cmFwW2tdLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuY2hpbGRyZW5bNF0uZWxlbWVudHMucHVzaChib290c3RyYXBFbGVtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3Jlc3VsdGVkTW9kdWxlcy5wdXNoKG1vZHVsZUVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9yZXN1bHRlZE1vZHVsZXM7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFeHBvcnRKc29uRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuaW1wb3J0IEV4cG9ydEpzb25FbmdpbmUgZnJvbSAnLi9leHBvcnQtanNvbi5lbmdpbmUnO1xuaW1wb3J0IEV4cG9ydFBkZkVuZ2luZSBmcm9tICcuL3BkZi1lbmdpbmUvZXhwb3J0LXBkZi5lbmdpbmUnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0RW5naW5lIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRXhwb3J0RW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghRXhwb3J0RW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBFeHBvcnRFbmdpbmUuaW5zdGFuY2UgPSBuZXcgRXhwb3J0RW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEV4cG9ydEVuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwb3J0KG91dHB1dEZvbGRlciwgZGF0YSkge1xuICAgICAgICBzd2l0Y2ggKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gRXhwb3J0SnNvbkVuZ2luZS5leHBvcnQob3V0cHV0Rm9sZGVyLCBkYXRhKTtcbiAgICAgICAgICAgIC8qY2FzZSAncGRmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gRXhwb3J0UGRmRW5naW5lLmV4cG9ydChvdXRwdXRGb2xkZXIpOyovXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV4cG9ydEVuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcblxuZXhwb3J0IGNsYXNzIEJyZWFrQ29tbWFIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBiYXJzKSB7fVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGV4dCA9IHRoaXMuYmFycy5VdGlscy5lc2NhcGVFeHByZXNzaW9uKHRleHQpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8sL2csICcsPGJyPicpO1xuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5jb25zdCBIYW5kbGViYXJzID0gcmVxdWlyZSgnaGFuZGxlYmFycycpO1xuXG5leHBvcnQgY2xhc3MgQnJlYWtMaW5lc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhcnMpIHt9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgICAgICB0ZXh0ID0gdGhpcy5iYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24odGV4dCk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sICc8YnI+Jyk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyAvZ20sICcmbmJzcDsnKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXHQvZ20sICcmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcodGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcblxuZXhwb3J0IGNsYXNzIENhcGl0YWxpemVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRleHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXh0LnNsaWNlKDEpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmNvbnN0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7XG5cbmV4cG9ydCBjbGFzcyBDbGVhblBhcmFncmFwaEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88cD4vZ20sICcnKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPFxcL3A+L2dtLCAnJyk7XG4gICAgICAgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKHRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgQ29tcGFyZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhcbiAgICAgICAgY29udGV4dDogYW55LFxuICAgICAgICBhOiBhbnksXG4gICAgICAgIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgICAgIGI6IGFueSxcbiAgICAgICAgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhbmRsZWJhcnMgSGVscGVyIHt7Y29tcGFyZX19IGV4cGVjdHMgNCBhcmd1bWVudHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgJ2luZGV4b2YnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGIuaW5kZXhPZihhKSAhPT0gLTE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGEgPT09IGI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICchPT0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGEgIT09IGI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhID4gYjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlbHBlciB7e2NvbXBhcmV9fTogaW52YWxpZCBvcGVyYXRvcjogYCcgKyBvcGVyYXRvciArICdgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBEZWJ1Z0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIG9wdGlvbmFsVmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zb2xlLmxvZygnQ3VycmVudCBDb250ZXh0Jyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PScpO1xuICAgICAgICBjb25zb2xlLmxvZyhjb250ZXh0KTtcblxuICAgICAgICBpZiAob3B0aW9uYWxWYWx1ZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ09wdGlvbmFsVmFsdWUnKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PScpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cob3B0aW9uYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCBEZXBlbmRlbmNpZXNFbmdpbmUgZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50QWxvbmVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBlbGVtZW50cywgZWxlbWVudFR5cGU6IHN0cmluZywgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGxldCBhbG9uZXMgPSBbXTtcbiAgICAgICAgbGV0IG1vZHVsZXMgPSBEZXBlbmRlbmNpZXNFbmdpbmUubW9kdWxlcztcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kSW5PbmVNb2R1bGUgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vZHVsZXMuZm9yRWFjaChtb2R1bGUgPT4ge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5kZWNsYXJhdGlvbnMuZm9yRWFjaChkZWNsYXJhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5pZCA9PT0gZWxlbWVudC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbk9uZU1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmZpbGUgPT09IGVsZW1lbnQuZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbk9uZU1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBtb2R1bGUuYm9vdHN0cmFwLmZvckVhY2goYm9vc3RyYXBlZEVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYm9vc3RyYXBlZEVsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChib29zdHJhcGVkRWxlbWVudC5maWxlID09PSBlbGVtZW50LmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbW9kdWxlLmNvbnRyb2xsZXJzLmZvckVhY2goY29udHJvbGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmlkID09PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5maWxlID09PSBlbGVtZW50LmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbW9kdWxlLnByb3ZpZGVycy5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmlkID09PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuZmlsZSA9PT0gZWxlbWVudC5maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kSW5PbmVNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICBhbG9uZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFsb25lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50JzpcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRzID0gYWxvbmVzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUnOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRyb2xsZXInOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbnRyb2xsZXJzID0gYWxvbmVzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdpbmplY3RhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5pbmplY3RhYmxlcyA9IGFsb25lcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncGlwZSc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucGlwZXMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBFc2NhcGVTaW1wbGVRdW90ZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIik7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sICcnKTtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJBbmd1bGFyMk1vZHVsZXNIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0ZXh0OiBzdHJpbmcsIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBjb25zdCBORzJfTU9EVUxFUzogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnQnJvd3Nlck1vZHVsZScsXG4gICAgICAgICAgICAnRm9ybXNNb2R1bGUnLFxuICAgICAgICAgICAgJ0h0dHBNb2R1bGUnLFxuICAgICAgICAgICAgJ1JvdXRlck1vZHVsZSdcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IGxlbiA9IE5HMl9NT0RVTEVTLmxlbmd0aDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGV4dC5pbmRleE9mKE5HMl9NT0RVTEVTW2ldKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IElBbmd1bGFyQXBpIH0gZnJvbSAnLi9hbmd1bGFyLWFwaS51dGlsJztcblxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJWZXJzaW9uVXRpbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ29yZVBhY2thZ2UgPSAnQGFuZ3VsYXIvY29yZSc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQW5ndWxhclZlcnNpb25VdGlsO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghQW5ndWxhclZlcnNpb25VdGlsLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBBbmd1bGFyVmVyc2lvblV0aWwuaW5zdGFuY2UgPSBuZXcgQW5ndWxhclZlcnNpb25VdGlsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFuZ3VsYXJWZXJzaW9uVXRpbC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5WZXJzaW9uKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgICAgICAgICAucmVwbGFjZSgnficsICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ14nLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCc9JywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnPCcsICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJz4nLCAnJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFuZ3VsYXJWZXJzaW9uT2ZQcm9qZWN0KHBhY2thZ2VEYXRhKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IF9yZXN1bHQgPSAnJztcblxuICAgICAgICBpZiAocGFja2FnZURhdGEuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICBsZXQgYW5ndWxhckNvcmUgPSBwYWNrYWdlRGF0YS5kZXBlbmRlbmNpZXNbQW5ndWxhclZlcnNpb25VdGlsLkNvcmVQYWNrYWdlXTtcbiAgICAgICAgICAgIGlmIChhbmd1bGFyQ29yZSkge1xuICAgICAgICAgICAgICAgIF9yZXN1bHQgPSB0aGlzLmNsZWFuVmVyc2lvbihhbmd1bGFyQ29yZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3Jlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQW5ndWxhclZlcnNpb25BcmNoaXZlZCh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gc2VtdmVyLmNvbXBhcmUodmVyc2lvbiwgJzIuNC4xMCcpIDw9IDA7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlZml4T2ZmaWNpYWxEb2ModmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gSGFuZGxlIGVtcHR5LCB1bmRlZmluZWQsIG9yIGludmFsaWQgdmVyc2lvbiBzdHJpbmdzXG4gICAgICAgIGlmICghdmVyc2lvbiB8fCB0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycgfHwgdmVyc2lvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5pc0FuZ3VsYXJWZXJzaW9uQXJjaGl2ZWQodmVyc2lvbikgPyAndjIuJyA6ICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBcGlMaW5rKGFwaTogSUFuZ3VsYXJBcGksIGFuZ3VsYXJWZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYW5ndWxhckRvY1ByZWZpeCA9IHRoaXMucHJlZml4T2ZmaWNpYWxEb2MoYW5ndWxhclZlcnNpb24pO1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vJHthbmd1bGFyRG9jUHJlZml4fWFuZ3VsYXIuaW8vJHthcGkucGF0aH1gO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5ndWxhclZlcnNpb25VdGlsLmdldEluc3RhbmNlKCk7XG4iLCJlbnVtIEJhc2ljVHlwZXMge1xuICAgIG51bWJlcixcbiAgICBib29sZWFuLFxuICAgIHN0cmluZyxcbiAgICBvYmplY3QsXG4gICAgZGF0ZSxcbiAgICBmdW5jdGlvblxufVxuXG5lbnVtIEJhc2ljVHlwZVNjcmlwdFR5cGVzIHtcbiAgICBhbnksXG4gICAgdm9pZFxufVxuXG5leHBvcnQgY2xhc3MgQmFzaWNUeXBlVXRpbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEJhc2ljVHlwZVV0aWw7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFCYXNpY1R5cGVVdGlsLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBCYXNpY1R5cGVVdGlsLmluc3RhbmNlID0gbmV3IEJhc2ljVHlwZVV0aWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmFzaWNUeXBlVXRpbC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlcyBpcyBhIGJhc2ljIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNKYXZhc2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlLnRvTG93ZXJDYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpIGluIEJhc2ljVHlwZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlIGlzIGEgdHlwZXNjcmlwdCB0eXBlIChUaGF0IGlzIG5vdCBhIGphdmFzY3JpcHQgdHlwZSlcbiAgICAgKiBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9iYXNpYy10eXBlcy5odG1sXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUeXBlU2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlLnRvTG93ZXJDYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpIGluIEJhc2ljVHlwZVNjcmlwdFR5cGVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHR5cGUgaXMgYSB0eXBlc2NyaXB0IG9yIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIGNoZWNrXG4gICAgICovXG4gICAgcHVibGljIGlzS25vd25UeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0phdmFzY3JpcHRUeXBlKHR5cGUpIHx8IHRoaXMuaXNUeXBlU2NyaXB0VHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBsaW5rIHRvIGVpdGhlciB0aGUgamF2YXNjcmlwdCBvciB0eXBlc2NyaXB0IHR5cGVcbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRoZSBkb2N1bWVudGF0aW9uIGxpbmsgb3IgdW5kZWZpbmVkIGlmIHR5cGUgbm90IGZvdW5kXG4gICAgICovXG4gICAgcHVibGljIGdldFR5cGVVcmwodHlwZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNKYXZhc2NyaXB0VHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy8ke3R5cGV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVHlwZVNjcmlwdFR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYmFzaWMtdHlwZXMuaHRtbGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFzaWNUeXBlVXRpbC5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcblxuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCBBbmd1bGFyVmVyc2lvblV0aWwgZnJvbSAnLi4vLi4vLi4vdXRpbHMvYW5ndWxhci12ZXJzaW9uLnV0aWwnO1xuaW1wb3J0IEJhc2ljVHlwZVV0aWwgZnJvbSAnLi4vLi4vLi4vdXRpbHMvYmFzaWMtdHlwZS51dGlsJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25TaWduYXR1cmVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBjb3JyZWN0IGhyZWYgZm9yIGludGVybmFsIHR5cGUgbGlua3NcbiAgICAgKiBIYW5kbGVzIGJvdGggcmVndWxhciB0eXBlcyBhbmQgbWlzY2VsbGFuZW91cyB0eXBlcyAodHlwZWFsaWFzLCBlbnVtLCBmdW5jdGlvbiwgdmFyaWFibGUpXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZEhyZWZGb3JJbnRlcm5hbFR5cGUocmVzdWx0RGF0YTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzdWx0RGF0YS50eXBlID09PSAnbWlzY2VsbGFuZW91cycgfHxcbiAgICAgICAgICAgIChyZXN1bHREYXRhLmN0eXBlICYmIHJlc3VsdERhdGEuY3R5cGUgPT09ICdtaXNjZWxsYW5lb3VzJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgbWFpbnBhZ2UgPSAnJztcbiAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0RGF0YS5zdWJ0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAgICAgICAgIG1haW5wYWdlID0gJ2VudW1lcmF0aW9ucyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgbWFpbnBhZ2UgPSAnZnVuY3Rpb25zJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndHlwZWFsaWFzJzpcbiAgICAgICAgICAgICAgICAgICAgbWFpbnBhZ2UgPSAndHlwZWFsaWFzZXMnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2YXJpYWJsZSc6XG4gICAgICAgICAgICAgICAgICAgIG1haW5wYWdlID0gJ3ZhcmlhYmxlcyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGAuLi9taXNjZWxsYW5lb3VzLyR7bWFpbnBhZ2V9Lmh0bWwjJHtyZXN1bHREYXRhLm5hbWV9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwYXRoID0gcmVzdWx0RGF0YS50eXBlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdERhdGEudHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgIHBhdGggPSAnY2xhc3NlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBgLi4vJHtwYXRofXMvJHtyZXN1bHREYXRhLm5hbWV9Lmh0bWxgO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVGdW5jdGlvbihhcmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYXJnLmZ1bmN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogKCkgPT4gdm9pZGA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmd1bXMgPSBhcmcuZnVuY3Rpb24ubWFwKGFyZ3UgPT4ge1xuICAgICAgICAgICAgY29uc3QgX3Jlc3VsdCA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kKGFyZ3UudHlwZSk7XG4gICAgICAgICAgICBpZiAoX3Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBocmVmID0gdGhpcy5idWlsZEhyZWZGb3JJbnRlcm5hbFR5cGUoX3Jlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06IDxhIGhyZWY9XCIke2hyZWZ9XCI+JHthcmd1LnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IEFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBcGlMaW5rKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyVmVyc2lvblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICApfTogPGEgaHJlZj1cIiR7cGF0aH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUoYXJndS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBCYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwoYXJndS50eXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgKX06IDxhIGhyZWY9XCIke3BhdGh9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHthcmd1LnR5cGV9PC9hPmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChhcmd1Lm5hbWUgJiYgYXJndS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAke2FyZ3UudHlwZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmd1Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWUudGV4dH1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogKCR7YXJndW1zLmpvaW4oJywgJyl9KSA9PiB2b2lkYDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9wdGlvbmFsU3RyaW5nKGFyZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBhcmcub3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIG1ldGhvZCkge1xuICAgICAgICBsZXQgYXJncyA9ICcnO1xuXG4gICAgICAgIGxldCBhcmdEZXN0cnVjdHVyZWRDb3VudGVySW5pdGlhbCA9IDA7XG4gICAgICAgIGxldCBhcmdEZXN0cnVjdHVyZWRDb3VudGVyUmVhbCA9IDA7XG5cbiAgICAgICAgaWYgKG1ldGhvZC5hcmdzKSB7XG4gICAgICAgICAgICBtZXRob2QuYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZy5kZXN0cnVjdHVyZWRQYXJhbWV0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnRGVzdHJ1Y3R1cmVkQ291bnRlckluaXRpYWwgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbWV0aG9kLmFyZ3MuZm9yRWFjaCgoYXJnLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9yZXN1bHQgPSBEZXBlbmRlbmNpZXNFbmdpbmUuZmluZChhcmcudHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZy5kZXN0cnVjdHVyZWRQYXJhbWV0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ0Rlc3RydWN0dXJlZENvdW50ZXJSZWFsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9ICdfX25hbWVkUGFyYW1ldGVyczogeyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJnRGVzdHJ1Y3R1cmVkQ291bnRlclJlYWwgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuc291cmNlID09PSAnaW50ZXJuYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBocmVmID0gdGhpcy5idWlsZEhyZWZGb3JJbnRlcm5hbFR5cGUoX3Jlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiA8YSBocmVmPVwiJHtocmVmfVwiIHRhcmdldD1cIl9zZWxmXCI+JHtIYW5kbGViYXJzLmVzY2FwZUV4cHJlc3Npb24oYXJnLnR5cGUpfTwvYT5gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhdGggPSBBbmd1bGFyVmVyc2lvblV0aWwuZ2V0QXBpTGluayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyVmVyc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKX06IDxhIGhyZWY9XCIke3BhdGh9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtIYW5kbGViYXJzLmVzY2FwZUV4cHJlc3Npb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICl9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5kb3REb3REb3RUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICBhcmdzICs9IGAuLi4ke2FyZy5uYW1lfTogJHthcmcudHlwZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gdGhpcy5oYW5kbGVGdW5jdGlvbihhcmcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQmFzaWNUeXBlVXRpbC5pc0tub3duVHlwZShhcmcudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IEJhc2ljVHlwZVV0aWwuZ2V0VHlwZVVybChhcmcudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7SGFuZGxlYmFycy5lc2NhcGVFeHByZXNzaW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgKX08L2E+YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAke2FyZy50eXBlfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9IGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFyZy5kZXN0cnVjdHVyZWRQYXJhbWV0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ0Rlc3RydWN0dXJlZENvdW50ZXJSZWFsID09PSBhcmdEZXN0cnVjdHVyZWRDb3VudGVySW5pdGlhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyArPSAnfSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgbWV0aG9kLmFyZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzICs9ICcsICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttZXRob2QubmFtZX0oJHthcmdzfSlgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAoJHthcmdzfSlgO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBIYXNPd25IZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBlbnRpdHksIGtleTogYW55LCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZW50aXR5LCBrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fQkdfQkcgPSB7XG4gICAgYWNjZXNzb3JzOiAnQWNjZXNzb3JzJyxcbiAgICBhcmd1bWVudHM6ICfQkNGA0LPRg9C80LXQvdGC0LgnLFxuICAgIGJvb3RzdHJhcDogJ0Jvb3RzdHJhcCcsXG4gICAgYnJhbmNoZXM6ICdCcmFuY2hlcycsXG4gICAgYnJvd3NlOiAn0KLRitGA0YHQtdC90LUnLFxuICAgIGNsYXNzZTogJ9Ca0LvQsNGBJyxcbiAgICBjbGFzc2VzOiAn0JrQu9Cw0YHQvtCy0LUnLFxuICAgIGNvbXBvbmVudDogJ9Ca0L7QvNC/0L7QvdC10L3RgicsXG4gICAgY29tcG9uZW50czogJ9Ca0L7QvNC/0L7QvdC10L3RgtC4JyxcbiAgICBjb25zdHJ1Y3RvcjogJ9Ca0L7QvdGB0YLRgNGD0LrRgtC+0YAnLFxuICAgIGNvbnRyb2xsZXJzOiAn0JrQvtC90YLRgNC+0LvQtdGA0LgnLFxuICAgIGNvbnRyb2xsZXI6ICfQmtC+0L3RgtGA0L7Qu9C10YAnLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0NvdmVyYWdlINC90LAg0LTQvtC60YPQvNC10L3RgtCw0YbQuNGP0YLQsCcsXG4gICAgZGVjbGFyYXRpb25zOiAn0JTQtdC60LvQsNGA0LDRhtC40LgnLFxuICAgIGRlY29yYXRvcnM6ICfQlNC10LrQvtGA0LDRgtC+0YDQuCcsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAn0KHRgtC+0LnQvdC+0YHRgiDQv9C+INC/0L7QtNGA0LDQt9Cx0LjRgNCw0L3QtScsXG4gICAgJ2RlZmluZWQtaW4nOiAn0JTQtdGE0LjQvdC40YDQsNC90LAg0LInLFxuICAgIGRlcGVuZGVuY2llczogJ9CX0LDQstC40YHQuNC80L7RgdGC0LgnLFxuICAgIGRlcHJlY2F0ZWQ6ICdEZXByZWNhdGVkJyxcbiAgICBkZXNjcmlwdGlvbjogJ9Ce0L/QuNGB0LDQvdC40LUnLFxuICAgIGRpcmVjdGl2ZTogJ9CU0LjRgNC10LrRgtC40LLQsCcsXG4gICAgZGlyZWN0aXZlczogJ9CU0LjRgNC10LrRgtC40LLQuCcsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTS3QtNGK0YDQstC+JyxcbiAgICBlbnRpdGllczogJ0VudGl0aWVzJyxcbiAgICBlbnRpdHk6ICdFbnRpdHknLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0VudHJ5Q29tcG9uZW50cycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyYXRpb25zJyxcbiAgICBlbnVtczogJ0VudW1zJyxcbiAgICBleGFtcGxlOiAn0J/RgNC40LzQtdGAJyxcbiAgICBleGFtcGxlczogJ9Cf0YDQuNC80LXRgNC4JyxcbiAgICBleHBvcnRzOiAnRXhwb3J0cycsXG4gICAgZXh0ZW5kczogJ0V4dGVuZHMnLFxuICAgIGZpbGU6ICfQpNCw0LnQuycsXG4gICAgZnVuY3Rpb25zOiAn0KTRg9C90LrRhtC40LgnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAn0JTQvtC60YPQvNC10L3RgtCw0YbQuNGP0YLQsCDQtSDQs9C10L3QtdGA0LjRgNCw0L3QsCwg0LjQt9C/0L7Qu9C30LLQsNC50LrQuCcsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICfQndCw0YfQsNC70L4nLFxuICAgIGd1YXJkOiAnR3VhcmQnLFxuICAgIGd1YXJkczogJ0d1YXJkcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdzJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3REaXJlY3RpdmVzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIVE1MLdC10LvQtdC80LXQvdGCJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0hUTUwt0LXQu9C10LzQtdC90YIg0YEg0LTQuNGA0LXQutGC0LjQstCwJyxcbiAgICBpZGVudGlmaWVyOiAn0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAnLFxuICAgIGltcGxlbWVudHM6ICfQmNC80L/Qu9C10LzQtdC90YLQuNGA0LAnLFxuICAgIGltcG9ydHM6ICdJbXBvcnRzJyxcbiAgICBpbmRleDogJ9CY0L3QtNC10LrRgScsXG4gICAgaW5kZXhhYmxlOiAn0JjQvdC00LXQutGB0LjRgNGD0LXQvCcsXG4gICAgaW5mbzogJ9CY0L3RhNC+0YDQvNCw0YbQuNGPJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAn0J3QsNGB0LvQtdC00LXQvSDQvtGCJyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWN0YWJsZScsXG4gICAgaW5qZWN0YWJsZXM6ICdJbmplY3RhYmxlcycsXG4gICAgaW5wdXRzOiAnSW5wdXRzJyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcnMnLFxuICAgIGludGVyZmFjZTogJ0ludGVyZmFjZScsXG4gICAgaW50ZXJmYWNlczogJ0ludGVyZmFjZXMnLFxuICAgIGxlZ2VuZDogJ9Cb0LXQs9C10L3QtNCwJyxcbiAgICBsaWNlbnNlOiAn0JvQuNGG0LXQvdC3JyxcbiAgICBsaW5lczogJ9Cg0LXQtNC+0LLQtScsXG4gICAgbWV0YWRhdGE6ICdNZXRhZGF0YScsXG4gICAgbWV0aG9kczogJ9Cc0LXRgtC+0LTQuCcsXG4gICAgbWlzY2VsbGFuZW91czogJ9CU0YDRg9Cz0LgnLFxuICAgIG1vZHVsZTogJ9Cc0L7QtNGD0LsnLFxuICAgIG1vZHVsZXM6ICfQnNC+0LTRg9C70LgnLFxuICAgIG5hbWU6ICfQmNC80LUnLFxuICAgIG5vOiAn0J3QtScsXG4gICAgJ25vLWdyYXBoJzogJ9Cd0Y/QvNCwINC90LDQu9C40YfQtdC9INCz0YDQsNGELicsXG4gICAgJ25vLWlmcmFtZSc6ICfQkdGA0LDRg9C30YrRgNGK0YIg0JLQuCDQvdC1INC/0L7QtNC00YrRgNC20LAgaWZyYW1lLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICfQndGP0LzQsCDQvdCw0LzQtdGA0LXQvdC4INGA0LXQt9GD0LvRgtCw0YLQuC4nLFxuICAgICduby1zdmcnOiAn0JHRgNCw0YPQt9GK0YDRitGCINCS0Lgg0L3QtSDQv9C+0LTQtNGK0YDQttCwIFNWRy4nLFxuICAgIG9wdGlvbmFsOiAn0J3QtdC30LDQtNGK0LvQttC40YLQtdC70L3QvicsXG4gICAgb3V0cHV0czogJ091dHB1dHMnLFxuICAgIG92ZXJ2aWV3OiAn0J/RgNC10LPQu9C10LQnLFxuICAgIHBhcmFtZXRlcnM6ICfQn9Cw0YDQsNC80LXRgtGA0LgnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdQZWVyLdC30LDQstC40YHQuNC80L7RgdGC0LgnLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGVzJyxcbiAgICBwcmVmaXg6ICfQn9GA0LXRhNC40LrRgScsXG4gICAgcHJvcGVydGllczogJ1Byb3BlcnRpZXMnLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVycycsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVxdWlyZWQ6ICfQl9Cw0LTRitC70LbQuNGC0LXQu9C90L4nLFxuICAgIHJlc2V0OiAn0J3Rg9C70LjRgNCw0L3QtScsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAn0L3QsNC80LXRgNC10L3QuCDRgNC10LfRg9C70YLQsNGC0LgnLFxuICAgIHJldHVybnM6ICdSZXR1cm5zJyxcbiAgICByb3V0ZTogJ9Cf0YrRgicsXG4gICAgcm91dGVzOiAn0J/RitGC0LjRidCwJyxcbiAgICBzY2hlbWFzOiAn0KHRhdC10LzQuCcsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICfQotGK0YDRgdC10L3QtScsXG4gICAgc2VsZWN0b3I6ICfQodC10LvQtdC60YLQvtGAJyxcbiAgICBzaWduYXR1cmU6ICfQn9C+0LTQv9C40YEnLFxuICAgIHNvdXJjZTogJ9CY0LfRgtC+0YfQvdC40LonLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAn0KHRgtC40LvQvtCy0LUnLFxuICAgIHRlbXBsYXRlOiAn0KjQsNCx0LvQvtC9JyxcbiAgICB0eXBlOiAn0KLQuNC/JyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ1R5cGUgYWxpYXNlcycsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdUeXBlIHBhcmFtZXRlcnMnLFxuICAgIHR5cGVzOiAn0KLQuNC/0L7QstC1JyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ9Cd0LXQvdCw0LfQvtCy0LDQvdC+IHByb3BlcnR5JyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ9Cf0L7QutGA0LjRgtC40LUg0L3QsCBVbml0LdGC0LXRgdGC0L7QstC10YLQtScsXG4gICAgdmFsdWU6ICfQodGC0L7QudC90L7RgdGCJyxcbiAgICB2YXJpYWJsZXM6ICfQn9GA0L7QvNC10L3Qu9C40LLQuCcsXG4gICAgeWVzOiAn0JTQsCcsXG4gICAgem9vbWluOiAnWm9vbSBpbicsXG4gICAgem9vbW91dDogJ1pvb20gb3V0J1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9ERV9ERSA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc3NvcnMnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50ZScsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ0JyYW5jaGVzJyxcbiAgICBicm93c2U6ICdEdXJjaHN1Y2hlJyxcbiAgICBjbGFzc2U6ICdLbGFzc2UnLFxuICAgIGNsYXNzZXM6ICdLbGFzc2VuJyxcbiAgICBjb21wb25lbnQ6ICdLb21wb25lbnRlJyxcbiAgICBjb21wb25lbnRzOiAnS29tcG9uZW50ZW4nLFxuICAgIGNvbnN0cnVjdG9yOiAnS29uc3RydWt0b3InLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdEb2t1bWVudGF0aW9uIEFiZGVja3VuZycsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVjbGFyYXRpb25zJyxcbiAgICBkZWNvcmF0b3JzOiAnRGVjb3JhdG9ycycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnU3RhbmRhcmR3ZXJ0JyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbmllcnQgaW4nLFxuICAgIGRlcGVuZGVuY2llczogJ0FiaMOkbmdpZ2tlaXRlbicsXG4gICAgZGVwcmVjYXRlZDogJ1ZlcmFsdGV0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0Jlc2NocmVpYnVuZycsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWt0aXZlJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWt0aXZlbicsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBiYXVtJyxcbiAgICBlbnRpdGllczogJ0VudGl0aWVzJyxcbiAgICBlbnRpdHk6ICdFbnRpdHknLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0VudHJ5Q29tcG9uZW50cycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyYXRpb25zJyxcbiAgICBlbnVtczogJ0VudW1zJyxcbiAgICBleGFtcGxlOiAnQmVpc3BpZWwnLFxuICAgIGV4YW1wbGVzOiAnQmVpc3BpZWxlJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0aWVydCcsXG4gICAgZXh0ZW5kczogJ0Vyd2VpdGVydCcsXG4gICAgZmlsZTogJ0RhdGVpJyxcbiAgICBmdW5jdGlvbnM6ICdGdW5rdGlvbmVuJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0Rva3VtZW50YXRpb24gZ2VuZXJpZXJ0IG1pdCcsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6IFwiTG9zIGdlaHQnc1wiLFxuICAgIGd1YXJkOiAnR3VhcmQnLFxuICAgIGd1YXJkczogJ0d1YXJkcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdzJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3REaXJlY3RpdmVzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIdG1sIEVsZW1lbnQnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnSHRtbC1FbGVtZW50IG1pdCBEaXJla3RpdmUnLFxuICAgIGlkZW50aWZpZXI6ICdLZW5udW5nJyxcbiAgICBpbXBsZW1lbnRzOiAnSW1wbGVtZW50aWVydCcsXG4gICAgaW1wb3J0czogJ0ltcG9ydGllcnQnLFxuICAgIGluZGV4OiAnSW5kZXgnLFxuICAgIGluZGV4YWJsZTogJ0luZGl6aWVyYmFyJyxcbiAgICBpbmZvOiAnSW5mb3JtYXRpb24nLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdHZWVyYnQgdm9uJyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWN0YWJsZScsXG4gICAgaW5qZWN0YWJsZXM6ICdJbmplY3RhYmxlcycsXG4gICAgaW5wdXRzOiAnSW5wdXRzJyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcnMnLFxuICAgIGludGVyZmFjZTogJ0ludGVyZmFjZScsXG4gICAgaW50ZXJmYWNlczogJ0ludGVyZmFjZXMnLFxuICAgIGxlZ2VuZDogJ0xlZ2VuZGUnLFxuICAgIGxpY2Vuc2U6ICdMaXplbnonLFxuICAgIGxpbmVzOiAnTGluaWVuJyxcbiAgICBtZXRhZGF0YTogJ01ldGFkYXRhJyxcbiAgICBtZXRob2RzOiAnTWV0aG9kZW4nLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdWZXJzY2hpZWRlbmVzJyxcbiAgICBtb2R1bGU6ICdNb2R1bCcsXG4gICAgbW9kdWxlczogJ01vZHVsZScsXG4gICAgbmFtZTogJ05hbWUnLFxuICAgIG5vOiAnTmVpbicsXG4gICAgJ25vLWdyYXBoJzogJ0tlaW4gR3JhcGggdmVyZsO8Z2Jhci4nLFxuICAgICduby1pZnJhbWUnOiAnRGVpbiBCcm93c2VyIHVudGVyc3TDvHR6dCBrZWluZSBpZnJhbWVzLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdLZWluIHBhc3NlbmRlcyBFcmdlYm5pcycsXG4gICAgJ25vLXN2Zyc6ICdEZWluIEJyb3dzZXIgdW50ZXJzdMO8dHp0IGtlaW4gU1ZHJyxcbiAgICBvcHRpb25hbDogJ09wdGlvbmFsJyxcbiAgICBvdXRwdXRzOiAnQXVzZ2FiZW4nLFxuICAgIG92ZXJ2aWV3OiAnw5xiZXJzaWNodCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtZXRlcicsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXItQWJow6RuZ2lna2VpdGVuJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHLDpGZpeCcsXG4gICAgcHJvcGVydGllczogJ0VpZ2Vuc2NoYWZ0ZW4nLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVycycsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVxdWlyZWQ6ICdFcmZvcmRlcmxpY2gnLFxuICAgIHJlc2V0OiAnWnVyw7xja3NldHplbicsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAnw7xiZXJlaW5zdGltbWVuZGUgRXJnZWJuaXNzZScsXG4gICAgcmV0dXJuczogJ1JldHVybnMnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogJ1JvdXRlbicsXG4gICAgc2NoZW1hczogJ1NjaGVtYXRhJyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ0VpbmdlYmVuIHp1ciBTdWNoZScsXG4gICAgc2VsZWN0b3I6ICdTZWxla3RvcicsXG4gICAgc2lnbmF0dXJlOiAnVW50ZXJzY2hyaWZ0JyxcbiAgICBzb3VyY2U6ICdRdWVsbGUnLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAnU3RpbGUnLFxuICAgIHRlbXBsYXRlOiAnVm9ybGFnZScsXG4gICAgdHlwZTogJ1R5cCcsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICdUeXAgQWxpYXNlJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1R5cCBQYXJhbWV0ZXInLFxuICAgIHR5cGVzOiAnVHlwZW4nLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnVW5iZW5hbm50ZSBFaWdlbnNjaGFmdCcsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICdVbml0LVRlc3QtQWJkZWNrdW5nJyxcbiAgICB2YWx1ZTogJ1dlcnQnLFxuICAgIHZhcmlhYmxlczogJ1ZhcmlhYmxlbicsXG4gICAgeWVzOiAnSmEnLFxuICAgIHpvb21pbjogJ1Zlcmdyw7bDn2VybicsXG4gICAgem9vbW91dDogJ1ZlcmtsZWluZXJuJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9FTl9VUyA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc3NvcnMnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50cycsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ0JyYW5jaGVzJyxcbiAgICBicm93c2U6ICdCcm93c2UnLFxuICAgIGNsYXNzZTogJ0NsYXNzJyxcbiAgICBjbGFzc2VzOiAnQ2xhc3NlcycsXG4gICAgY29tcG9uZW50OiAnQ29tcG9uZW50JyxcbiAgICBjb21wb25lbnRzOiAnQ29tcG9uZW50cycsXG4gICAgY29uc3RydWN0b3I6ICdDb25zdHJ1Y3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sbGVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0RvY3VtZW50YXRpb24gY292ZXJhZ2UnLFxuICAgIGRlY2xhcmF0aW9uczogJ0RlY2xhcmF0aW9ucycsXG4gICAgZGVjb3JhdG9yczogJ0RlY29yYXRvcnMnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ0RlZmF1bHQgdmFsdWUnLFxuICAgICdkZWZpbmVkLWluJzogJ0RlZmluZWQgaW4nLFxuICAgIGRlcGVuZGVuY2llczogJ0RlcGVuZGVuY2llcycsXG4gICAgZGVwcmVjYXRlZDogJ0RlcHJlY2F0ZWQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcHRpb24nLFxuICAgIGRpcmVjdGl2ZTogJ0RpcmVjdGl2ZScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmVjdGl2ZXMnLFxuICAgICdkb20gdHJlZSc6ICdET00gdHJlZScsXG4gICAgZW50aXRpZXM6ICdFbnRpdGllcycsXG4gICAgZW50aXR5OiAnRW50aXR5JyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcmF0aW9ucycsXG4gICAgZW51bXM6ICdFbnVtcycsXG4gICAgZXhhbXBsZTogJ0V4YW1wbGUnLFxuICAgIGV4YW1wbGVzOiAnRXhhbXBsZXMnLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRzJyxcbiAgICBleHRlbmRzOiAnRXh0ZW5kcycsXG4gICAgZmlsZTogJ0ZpbGUnLFxuICAgIGZ1bmN0aW9uczogJ0Z1bmN0aW9ucycsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICdEb2N1bWVudGF0aW9uIGdlbmVyYXRlZCB1c2luZycsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdHZXR0aW5nIHN0YXJ0ZWQnLFxuICAgIGd1YXJkOiAnR3VhcmQnLFxuICAgIGd1YXJkczogJ0d1YXJkcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdzJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3REaXJlY3RpdmVzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIdG1sIGVsZW1lbnQnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnSHRtbCBlbGVtZW50IHdpdGggZGlyZWN0aXZlJyxcbiAgICBpZGVudGlmaWVyOiAnSWRlbnRpZmllcicsXG4gICAgaW1wbGVtZW50czogJ0ltcGxlbWVudHMnLFxuICAgIGltcG9ydHM6ICdJbXBvcnRzJyxcbiAgICBpbmRleDogJ0luZGV4JyxcbiAgICBpbmRleGFibGU6ICdJbmRleGFibGUnLFxuICAgIGluZm86ICdJbmZvcm1hdGlvbicsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ0luaGVyaXRlZCBmcm9tJyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWN0YWJsZScsXG4gICAgaW5qZWN0YWJsZXM6ICdJbmplY3RhYmxlcycsXG4gICAgaW5wdXRzOiAnSW5wdXRzJyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcnMnLFxuICAgIGludGVyZmFjZTogJ0ludGVyZmFjZScsXG4gICAgaW50ZXJmYWNlczogJ0ludGVyZmFjZXMnLFxuICAgIGxlZ2VuZDogJ0xlZ2VuZCcsXG4gICAgbGljZW5zZTogJ0xpY2Vuc2UnLFxuICAgIGxpbmVzOiAnTGluZXMnLFxuICAgIG1ldGFkYXRhOiAnTWV0YWRhdGEnLFxuICAgIG1ldGhvZHM6ICdNZXRob2RzJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAnTWlzY2VsbGFuZW91cycsXG4gICAgbW9kdWxlOiAnTW9kdWxlJyxcbiAgICBtb2R1bGVzOiAnTW9kdWxlcycsXG4gICAgbmFtZTogJ05hbWUnLFxuICAgIG5vOiAnTm8nLFxuICAgICduby1ncmFwaCc6ICdObyBncmFwaCBhdmFpbGFibGUuJyxcbiAgICAnbm8taWZyYW1lJzogJ1lvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGlmcmFtZXMuJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ05vIHJlc3VsdHMgbWF0Y2hpbmcnLFxuICAgICduby1zdmcnOiAnWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgU1ZHJyxcbiAgICBvcHRpb25hbDogJ09wdGlvbmFsJyxcbiAgICBvdXRwdXRzOiAnT3V0cHV0cycsXG4gICAgb3ZlcnZpZXc6ICdPdmVydmlldycsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtZXRlcnMnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdQZWVyIGRlcGVuZGVuY2llcycsXG4gICAgcGlwZTogJ1BpcGUnLFxuICAgIHBpcGVzOiAnUGlwZXMnLFxuICAgIHByZWZpeDogJ1ByZWZpeCcsXG4gICAgcHJvcGVydGllczogJ1Byb3BlcnRpZXMnLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVycycsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVxdWlyZWQ6ICdSZXF1aXJlZCcsXG4gICAgcmVzZXQ6ICdSZXNldCcsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAncmVzdWx0cyBtYXRjaGluZycsXG4gICAgcmV0dXJuczogJ1JldHVybnMnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogJ1JvdXRlcycsXG4gICAgc2NoZW1hczogJ1NjaGVtYXMnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnVHlwZSB0byBzZWFyY2gnLFxuICAgIHNlbGVjdG9yOiAnU2VsZWN0b3InLFxuICAgIHNpZ25hdHVyZTogJ1NpZ25hdHVyZScsXG4gICAgc291cmNlOiAnU291cmNlJyxcbiAgICBzdGFuZGFsb25lOiAnU3RhbmRhbG9uZScsXG4gICAgc3RhdGVtZW50czogJ1N0YXRlbWVudHMnLFxuICAgIHN0eWxlczogJ1N0eWxlcycsXG4gICAgdGVtcGxhdGU6ICdUZW1wbGF0ZScsXG4gICAgdHlwZTogJ1R5cGUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVHlwZSBhbGlhc2VzJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1R5cGUgcGFyYW1ldGVycycsXG4gICAgdHlwZXM6ICdUeXBlcycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdVbmFtZWQgcHJvcGVydHknLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnVW5pdCB0ZXN0IGNvdmVyYWdlJyxcbiAgICB2YWx1ZTogJ1ZhbHVlJyxcbiAgICB2YXJpYWJsZXM6ICdWYXJpYWJsZXMnLFxuICAgIHllczogJ1llcycsXG4gICAgem9vbWluOiAnWm9vbSBpbicsXG4gICAgem9vbW91dDogJ1pvb20gb3V0J1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9FU19FUyA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc29yaW9zJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudG9zJyxcbiAgICBib290c3RyYXA6ICdBcnJhbnF1ZScsXG4gICAgYnJhbmNoZXM6ICdSYW1hcycsXG4gICAgYnJvd3NlOiAnTmF2ZWdhcicsXG4gICAgY2xhc3NlOiAnQ2xhc2UnLFxuICAgIGNsYXNzZXM6ICdDbGFzZXMnLFxuICAgIGNvbXBvbmVudDogJ0NvbXBvbmVudGUnLFxuICAgIGNvbXBvbmVudHM6ICdDb21wb25lbnRlcycsXG4gICAgY29uc3RydWN0b3I6ICdDb25zdHJ1Y3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sYWRvcmVzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGFkb3InLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0NvYmVydHVyYSBkZSBsYSBkb2N1bWVudGFjacOzbicsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVjbGFyYWNpb25lcycsXG4gICAgZGVjb3JhdG9yczogJ0RlY29yYWRvcmVzJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICdWYWxvciBwb3IgZGVmZWN0bycsXG4gICAgJ2RlZmluZWQtaW4nOiAnRGVmaW5pZG8gZW4nLFxuICAgIGRlcGVuZGVuY2llczogJ0RlcGVuZGVuY2lhcycsXG4gICAgZGVwcmVjYXRlZDogJ09ic29sZXRhJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXBjacOzbicsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWN0aXZhJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWN0aXZhcycsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBhcmJvbCcsXG4gICAgZW50aXRpZXM6ICdFbnRpZGFkZXMnLFxuICAgIGVudGl0eTogJ0VudGlkYWQnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0NvbXBvbmVudGVzIGRlIGVudHJhZGEnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcmFjaW9uZXMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdFamVtcGxvJyxcbiAgICBleGFtcGxlczogJ0VqZW1wbG9zJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0YScsXG4gICAgZXh0ZW5kczogJ0V4dGllbmRlJyxcbiAgICBmaWxlOiAnRmljaGVybycsXG4gICAgZnVuY3Rpb25zOiAnRnVuY2lvbmVzJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0RvY3VtZW50YWNpw7NuIGdlbmVyYWRhIHV0aWxpemFuZG8nLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnQ29tZW56YW5kbycsXG4gICAgZ3VhcmQ6ICdHdWFyZGlhJyxcbiAgICBndWFyZHM6ICdHdWFyZGlhcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnRmlqYWNpb25lcyBkZSBIb3N0JyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3REaXJlY3RpdmVzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnRXNjdWNoYWRvcmVzIGRlIEhvc3QnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnRWxlbWVudG8gSHRtbCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdFbGVtZW50byBIdG1sIGNvbiBkaXJlY3RpdmEnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWNhZG9yJyxcbiAgICBpbXBsZW1lbnRzOiAnSW1wbGVtZW50YScsXG4gICAgaW1wb3J0czogJ0ltcG9ydGEnLFxuICAgIGluZGV4OiAnw41uZGljZScsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICBpbmZvOiAnSW5mb3JtYWNpw7NuJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSGVyZWRhZG8gZGVzZGUnLFxuICAgIGluamVjdGFibGU6ICdJbnllY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0lueWVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdFbnRyYWRhcycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0b3JlcycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYXonLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmZhY2VzJyxcbiAgICBsZWdlbmQ6ICdMZXllbmRhJyxcbiAgICBsaWNlbnNlOiAnTGljZW5jaWEnLFxuICAgIGxpbmVzOiAnTMOtbmVhcycsXG4gICAgbWV0YWRhdGE6ICdNZXRhIGRhdG9zJyxcbiAgICBtZXRob2RzOiAnTcOpdG9kb3MnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdNaXNjZWzDoW5lYScsXG4gICAgbW9kdWxlOiAnTcOzZHVsbycsXG4gICAgbW9kdWxlczogJ03Ds2R1bG9zJyxcbiAgICBuYW1lOiAnTm9tYnJlJyxcbiAgICBubzogJ05vJyxcbiAgICAnbm8tZ3JhcGgnOiAnTm8gaGF5IGdyw6FmaWNhIGRpc3BvbmlibGUuJyxcbiAgICAnbm8taWZyYW1lJzogJ1R1IG5hdmVnYWRvciBubyBzb3BvcnRhIGlmcmFtZXMuJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ05vIGhheSByZXN1bHRhZG9zIHF1ZSBjb2luY2lkYW4nLFxuICAgICduby1zdmcnOiAnVHUgbmF2ZWdhZG9yIG5vIHNvcG9ydGEgU1ZHJyxcbiAgICBvcHRpb25hbDogJ09wY2lvbmFsJyxcbiAgICBvdXRwdXRzOiAnU2FsaWRhcycsXG4gICAgb3ZlcnZpZXc6ICdEZXNjcmlwY2nDs24gZ2VuZXJhbCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcsOhbWV0cm9zJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnRGVwZW5kZW5jaWFzIGVudHJlIHBhcmVzJyxcbiAgICBwaXBlOiAnVHViZXLDrWEnLFxuICAgIHBpcGVzOiAnVHViZXLDrWFzJyxcbiAgICBwcmVmaXg6ICdQcmVmaWpvJyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcGllZGFkZXMnLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZlZWRvcmVzJyxcbiAgICBwdXJlOiAnUHVybycsXG4gICAgcmVhZG1lOiAnTMOpZW1lJyxcbiAgICByZXF1aXJlZDogJ1JlcXVlcmlkbycsXG4gICAgcmVzZXQ6ICdSZXN0YWJsZWNlcicsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAnY29tcGFyYWNpw7NuIGRlIHJlc3VsdGFkb3MnLFxuICAgIHJldHVybnM6ICdEZXZ1ZWx2ZScsXG4gICAgcm91dGU6ICdSdXRhJyxcbiAgICByb3V0ZXM6ICdSdXRhcycsXG4gICAgc2NoZW1hczogJ0VzcXVlbWFzJyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ0VzY3JpYmUgcGFyYSBidXNjYXInLFxuICAgIHNlbGVjdG9yOiAnU2VsZWN0b3InLFxuICAgIHNpZ25hdHVyZTogJ0Zpcm1hJyxcbiAgICBzb3VyY2U6ICdGdWVudGUnLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAnRGVjbGFyYWNpb25lcycsXG4gICAgc3R5bGVzOiAnRXN0aWxvcycsXG4gICAgdGVtcGxhdGU6ICdQbGFudGlsbGEnLFxuICAgIHR5cGU6ICdUaXBvJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ0FsaWFzIGRlIHRpcG8nLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAnUGFyw6FtZXRyb3MgZGUgdGlwbycsXG4gICAgdHlwZXM6ICdUaXBvcycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdQcm9waWVkYWQgc2luIG5vbWJyZScsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICdDb2JlcnR1cmEgZGUgbGFzIHBydWViYXMgdW5pdGFyaWFzJyxcbiAgICB2YWx1ZTogJ1ZhbG9yJyxcbiAgICB2YXJpYWJsZXM6ICdWYXJpYWJsZXMnLFxuICAgIHllczogJ1NpJyxcbiAgICB6b29taW46ICdBbXBsaWFyJyxcbiAgICB6b29tb3V0OiAnQWxlamFyJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9GUl9GUiA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc3NldXJzJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudHMnLFxuICAgIGJvb3RzdHJhcDogJ0Jvb3RzdHJhcCcsXG4gICAgYnJhbmNoZXM6ICdCcmFuY2hlcycsXG4gICAgYnJvd3NlOiAnUGFyY291cmlyJyxcbiAgICBjbGFzc2U6ICdDbGFzcycsXG4gICAgY2xhc3NlczogJ0NsYXNzZXMnLFxuICAgIGNvbXBvbmVudDogJ0NvbXBvc2FudCcsXG4gICAgY29tcG9uZW50czogJ0NvbXBvc2FudHMnLFxuICAgIGNvbnN0cnVjdG9yOiAnQ29uc3RydWN0ZXVyJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyw7RsZXVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyw7RsZXVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdDb3V2ZXJ0dXJlIGRlIGRvY3VtZW50YXRpb24nLFxuICAgIGRlY2xhcmF0aW9uczogJ0TDqWNsYXJhdGlvbnMnLFxuICAgIGRlY29yYXRvcnM6ICdEw6ljb3JhdGV1cnMnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ1ZhbGV1ciBwYXIgZMOpZmF1dCcsXG4gICAgJ2RlZmluZWQtaW4nOiAnRMOpZmluaSBkYW5zJyxcbiAgICBkZXBlbmRlbmNpZXM6ICdEw6lwZW5kYW5jZXMnLFxuICAgIGRlcHJlY2F0ZWQ6ICdPYnNvbMOodGUnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcHRpb24nLFxuICAgIGRpcmVjdGl2ZTogJ0RpcmVjdGl2ZScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmVjdGl2ZXMnLFxuICAgICdkb20gdHJlZSc6ICdBcmJyZSBET00nLFxuICAgIGVudGl0aWVzOiAnRW50aXTDqXMnLFxuICAgIGVudGl0eTogJ0VudGl0w6knLFxuICAgIGVudHJ5Y29tcG9uZW50czogXCJDb21wb3NhbnRzIGQnZW50csOpZVwiLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW3DqXJhdGlvbnMnLFxuICAgIGVudW1zOiAnRW51bcOpcmF0aW9ucycsXG4gICAgZXhhbXBsZTogJ0V4YW1wbGUnLFxuICAgIGV4YW1wbGVzOiAnRXhhbXBsZXMnLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRzJyxcbiAgICBleHRlbmRzOiAnRXRlbmQnLFxuICAgIGZpbGU6ICdGaWNoaWVyJyxcbiAgICBmdW5jdGlvbnM6ICdGb25jdGlvbnMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhdGlvbiBnw6luw6lyw6llIGF2ZWMnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnRMOpbWFycmFnZScsXG4gICAgZ3VhcmQ6ICdHYXJkZScsXG4gICAgZ3VhcmRzOiAnR2FyZGVzJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0QmluZGluZ3MnLFxuICAgIGhvc3RkaXJlY3RpdmVzOiAnSG9zdERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0Vsw6ltZW50IEh0bWwnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnRWzDqW1lbnQgSHRtbCBhdmVjIHVuZSBkaXJlY3RpdmUnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWFudCcsXG4gICAgaW1wbGVtZW50czogJ0ltcGzDqW1lbnRlJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0cycsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICBpbmZvOiAnSW5mb3JtYXRpb24nLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdIw6lyaXTDqSBkZScsXG4gICAgaW5qZWN0YWJsZTogJ0luamVjdGFibGUnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZWN0YWJsZXMnLFxuICAgIGlucHV0czogJ0VudHLDqWVzJyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRldXJzJyxcbiAgICBpbnRlcmZhY2U6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmZhY2VzJyxcbiAgICBsZWdlbmQ6ICdMw6lnZW5kZScsXG4gICAgbGljZW5zZTogJ0xpY2Vuc2UnLFxuICAgIGxpbmVzOiAnTGlnbmVzJyxcbiAgICBtZXRhZGF0YTogJ03DqXRhZG9ubsOpZXMnLFxuICAgIG1ldGhvZHM6ICdNw6l0aG9kZXMnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdEaXZlcnMnLFxuICAgIG1vZHVsZTogJ01vZHVsZScsXG4gICAgbW9kdWxlczogJ01vZHVsZXMnLFxuICAgIG5hbWU6ICdOb20nLFxuICAgIG5vOiAnTm9uJyxcbiAgICAnbm8tZ3JhcGgnOiAnQXVjdW4gZ3JhcGhpcXVlIGRpc3BvbmlibGUuJyxcbiAgICAnbm8taWZyYW1lJzogJ1ZvdHJlIG5hdmlnYXRldXIgbmUgc3VwcG9ydGUgcGFzIGxlcyBpZnJhbWVzLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdBdWN1biByw6lzdWx0YXQgbWF0Y2hhbnQnLFxuICAgICduby1zdmcnOiAnVm90cmUgbmF2aWdhdGV1ciBuZSBzdXBwb3J0ZSBwYXMgbGUgU1ZHJyxcbiAgICBvcHRpb25hbDogJ09wdGlvbm5lbCcsXG4gICAgb3V0cHV0czogJ1NvcnRpZXMnLFxuICAgIG92ZXJ2aWV3OiBcIlZ1ZSBkJ2Vuc2VtYmxlXCIsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtw6h0cmVzJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnRMOpcGVuZGFuY2VzIGRlIHBhaXInLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGVzJyxcbiAgICBwcmVmaXg6ICdQcsOpZml4ZScsXG4gICAgcHJvcGVydGllczogJ1Byb3ByacOpdMOpcycsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ1JlcXVpcycsXG4gICAgcmVzZXQ6ICdSZW1pc2Ugw6AgesOpcm8nLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3LDqXN1bHRhdHMgbWF0Y2hhbnQnLFxuICAgIHJldHVybnM6ICdSZW52b2llJyxcbiAgICByb3V0ZTogJ1JvdXRlJyxcbiAgICByb3V0ZXM6ICdSb3V0ZXMnLFxuICAgIHNjaGVtYXM6ICdTY2jDqW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdTYWlzaXNzZXogdW4gdGV4dGUnLFxuICAgIHNlbGVjdG9yOiAnU8OpbGVjdGV1cicsXG4gICAgc2lnbmF0dXJlOiAnU2lnbmF0dXJlJyxcbiAgICBzb3VyY2U6ICdTb3VyY2UnLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAnRMOpY2xhcmF0aW9ucycsXG4gICAgc3R5bGVzOiAnU3R5bGVzJyxcbiAgICB0ZW1wbGF0ZTogJ1RlbXBsYXRlJyxcbiAgICAndGFibGUtb2YtY29udGVudHMnOiAnVGFibGUgZGVzIG1hdGnDqHJlcycsXG4gICAgdHlwZTogJ1R5cGUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnQWxpYXMgZGUgdHlwZScsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdQYXJhbcOodHJlcyBkZSB0eXBlJyxcbiAgICB0eXBlczogJ1R5cGVzJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ1Byb3ByacOpdMOpIG5vbiBub21tw6llJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ0NvdXZlcnR1cmUgZGUgdGVzdCB1bml0YWlyZScsXG4gICAgdmFsdWU6ICdWYWxldXInLFxuICAgIHZhcmlhYmxlczogJ1ZhcmlhYmxlcycsXG4gICAgeWVzOiAnT3VpJyxcbiAgICB6b29taW46ICdab29tIGF2YW50JyxcbiAgICB6b29tb3V0OiAnWm9vbSBhcnJpw6hyZSdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fSFVfSFUgPSB7XG4gICAgYWNjZXNzb3JzOiAnR2V0dGVyL3NldHRlciBtZXTDs2R1c29rJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudHVtb2snLFxuICAgIGJvb3RzdHJhcDogJ0JldMO2bHTDqXMnLFxuICAgIGJyYW5jaGVzOiAnQnJhbmNoZWsnLFxuICAgIGJyb3dzZTogJ0LDtm5nw6lzesOpcycsXG4gICAgY2xhc3NlOiAnT3N6dMOhbHknLFxuICAgIGNsYXNzZXM6ICdPc3p0w6FseW9rJyxcbiAgICBjb21wb25lbnQ6ICdLb21wb25lbnMnLFxuICAgIGNvbXBvbmVudHM6ICdLb21wb25lbnNlaycsXG4gICAgY29uc3RydWN0b3I6ICdLb25zdHJ1a3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdLb250cm9sbGVyZWsnLFxuICAgIGNvbnRyb2xsZXI6ICdLb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdEb2t1bWVudMOhY2nDsyBsZWZlZGV0dHPDqWcnLFxuICAgIGRlY2xhcmF0aW9uczogJ0Rla2xhcsOhY2nDs2snLFxuICAgIGRlY29yYXRvcnM6ICdEZWtvcsOhdG9yb2snLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ0FsYXDDqXJ0ZWxtZXpldHQgw6lydMOpaycsXG4gICAgJ2RlZmluZWQtaW4nOiAnRGVmaW7DrWNpw7MgaGVseWU6JyxcbiAgICBkZXBlbmRlbmNpZXM6ICdGw7xnZ8WRc8OpZ2VrJyxcbiAgICBkZXByZWNhdGVkOiAnRWxhdnVsdCcsXG4gICAgZGVzY3JpcHRpb246ICdMZcOtcsOhcycsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWt0w612YScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmVrdMOtdsOhaycsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBmYScsXG4gICAgZW50aXRpZXM6ICdFbnRpdMOhc29rJyxcbiAgICBlbnRpdHk6ICdFbnRpdMOhcycsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnkga29tcG9uZW5zZWsnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcsOhY2nDs2snLFxuICAgIGVudW1zOiAnRW51bW9rJyxcbiAgICBleGFtcGxlOiAnUMOpbGRhJyxcbiAgICBleGFtcGxlczogJ1DDqWxkw6FrJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0b2snLFxuICAgIGV4dGVuZHM6ICfFkHNvc3p0w6FseScsXG4gICAgZmlsZTogJ0ZpbGUnLFxuICAgIGZ1bmN0aW9uczogJ0bDvGdndsOpbnllaycsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICdBIGRva3VtZW50w6FjacOzdCBnZW5lcsOhbHRhOicsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdCZXZlemV0xZEnLFxuICAgIGd1YXJkOiAnR3VhcmQnLFxuICAgIGd1YXJkczogJ0d1YXJkb2snLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5nb2snLFxuICAgIGhvc3RkaXJlY3RpdmVzOiAnSG9zdERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJlaycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIdG1sIGVsZW0nLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnSHRtbCBlbGVtIGRpcmVrdMOtdsOhdmFsJyxcbiAgICBpZGVudGlmaWVyOiAnQXpvbm9zw610w7MnLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnTDoWx0IGludGVyZsOpc3playcsXG4gICAgaW1wb3J0czogJ0ltcG9ydG9rJyxcbiAgICBpbmRleDogJ1RhcnRhbG9tamVneXrDqWsnLFxuICAgIGluZGV4YWJsZTogJ0luZGV4ZWxoZXTFkScsXG4gICAgaW5mbzogJ0luZm9ybcOhY2nDsycsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ8OWcsO2a8O2bHZlIGlubmVuOicsXG4gICAgaW5qZWN0YWJsZTogJ0luamVrdMOhbGhhdMOzJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVrdMOhbGhhdMOzaycsXG4gICAgaW5wdXRzOiAnQmVtZW5ldGVrJyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcm9rJyxcbiAgICBpbnRlcmZhY2U6ICdJbnRlcmbDqXN6JyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmw6lzemVrJyxcbiAgICBsZWdlbmQ6ICdKZWxtYWd5YXLDoXphdCcsXG4gICAgbGljZW5zZTogJ0xpY2VuYycsXG4gICAgbGluZXM6ICdTb3JvaycsXG4gICAgbWV0YWRhdGE6ICdNZXRhYWRhdG9rJyxcbiAgICBtZXRob2RzOiAnTWV0w7NkdXNvaycsXG4gICAgbWlzY2VsbGFuZW91czogJ0VnecOpYicsXG4gICAgbW9kdWxlOiAnTW9kdWwnLFxuICAgIG1vZHVsZXM6ICdNb2R1bG9rJyxcbiAgICBuYW1lOiAnTsOpdicsXG4gICAgbm86ICdOZW0nLFxuICAgICduby1ncmFwaCc6ICdHcmFmaWtvbiBuZW0gZWzDqXJoZXTFkS4nLFxuICAgICduby1pZnJhbWUnOiAnQSBiw7ZuZ8Opc3rFkWplIG5lbSB0w6Ftb2dhdGphIGF6IGlmcmFtZS1la2V0LicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdOaW5jcyB0YWzDoWxhdCcsXG4gICAgJ25vLXN2Zyc6ICdBIGLDtm5nw6lzesWRamUgbmVtIHTDoW1vZ2F0amEgYXogU1ZHIGZvcm3DoXR1bW90LicsXG4gICAgb3B0aW9uYWw6ICdPcGNpb27DoWxpcycsXG4gICAgb3V0cHV0czogJ0tpbWVuZXRlaycsXG4gICAgb3ZlcnZpZXc6ICfDgXR0ZWtpbnTDqXMnLFxuICAgIHBhcmFtZXRlcnM6ICdQYXJhbcOpdGVyZWsnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdQZWVyIGbDvGdnxZFzw6lnZWsnLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGUtb2snLFxuICAgIHByZWZpeDogJ0VsxZF0YWcnLFxuICAgIHByb3BlcnRpZXM6ICdUYWd2w6FsdG96w7NrJyxcbiAgICBwcm92aWRlcnM6ICdQcm92aWRlcmVrJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ0vDrXbDoW50JyxcbiAgICByZXNldDogJ1Zpc3N6YcOhbGzDrXQnLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3RhbMOhbGF0JyxcbiAgICByZXR1cm5zOiAnVmlzc3phdMOpcsOpc2kgw6lydMOpaycsXG4gICAgcm91dGU6ICfDmnR2b25hbCcsXG4gICAgcm91dGVzOiAnw5p0dm9uYWxhaycsXG4gICAgc2NoZW1hczogJ1PDqW3DoWsnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnS2VyZXNlbmTFkSBraWZlamV6w6lzJyxcbiAgICBzZWxlY3RvcjogJ1N6ZWxla3RvcicsXG4gICAgc2lnbmF0dXJlOiAnQWzDocOtcsOhcycsXG4gICAgc291cmNlOiAnRm9ycsOhcycsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICdVdGFzw610w6Fzb2snLFxuICAgIHN0eWxlczogJ1N0w61sdXNvaycsXG4gICAgdGVtcGxhdGU6ICdTYWJsb24nLFxuICAgIHR5cGU6ICdUw61wdXMnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVMOtcHVzIMOhbG7DqXYnLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAnVMOtcHVzIHBhcmFtw6l0ZXJlaycsXG4gICAgdHlwZXM6ICdUw61wdXNvaycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdOw6l2dGVsZW4gcHJvcGVydHknLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnVW5pdCB0ZXN6dCBsZWZlZGV0dHPDqWcnLFxuICAgIHZhbHVlOiAnw4lydMOpaycsXG4gICAgdmFyaWFibGVzOiAnVsOhbHRvesOzaycsXG4gICAgeWVzOiAnSWdlbicsXG4gICAgem9vbWluOiAnTmFnecOtdMOhcycsXG4gICAgem9vbW91dDogJ0tpY3NpbnnDrXTDqXMnXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX0lUX0lUID0ge1xuICAgIGFjY2Vzc29yczogJ0FjY2Vzc29yaScsXG4gICAgYXJndW1lbnRzOiAnQXJnb21lbnRpJyxcbiAgICBib290c3RyYXA6ICdCb290c3RyYXAnLFxuICAgIGJyYW5jaGVzOiAnUmFtaScsXG4gICAgYnJvd3NlOiAnQ2VyY2EnLFxuICAgIGNsYXNzZTogJ0NsYXNzZScsXG4gICAgY2xhc3NlczogJ0NsYXNzaScsXG4gICAgY29tcG9uZW50OiAnQ29tcG9uZW50ZScsXG4gICAgY29tcG9uZW50czogJ0NvbXBvbmVudGknLFxuICAgIGNvbnN0cnVjdG9yOiAnQ29zdHJ1dHRvcmUnLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdDb3BlcnR1cmEgY29kaWNlJyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEaWNoaWFyYXppb25pJyxcbiAgICBkZWNvcmF0b3JzOiAnRGVjb3JhdG9ycycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnVmFsb3JlIHByZWRlZmluaXRvJyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbml0byBpbicsXG4gICAgZGVwZW5kZW5jaWVzOiAnRGVwZW5kZW5jaWVzJyxcbiAgICBkZXByZWNhdGVkOiAnRGVwcmVjYXRhJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXppb25lJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJldHRpdmEnLFxuICAgIGRpcmVjdGl2ZXM6ICdEaXJldHRpdmUnLFxuICAgICdkb20gdHJlZSc6ICdBbGJlcm8gRE9NJyxcbiAgICBlbnRpdGllczogJ0VudGl0w6AnLFxuICAgIGVudGl0eTogJ0VudGl0w6AnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0VudHJ5Q29tcG9uZW50cycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyYXRpb25zJyxcbiAgICBlbnVtczogJ0VudW1zJyxcbiAgICBleGFtcGxlOiAnRXNlbXBpbycsXG4gICAgZXhhbXBsZXM6ICdFc2VtcGknLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRzJyxcbiAgICBleHRlbmRzOiAnRXh0ZW5kcycsXG4gICAgZmlsZTogJ0ZpbGUnLFxuICAgIGZ1bmN0aW9uczogJ0Z1bnppb25pJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0RvY3VtZW50YXppb25lIGdlbmVyYXRhIHVzYW5kbycsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdJbml6aWFtbycsXG4gICAgZ3VhcmQ6ICdHdWFyZGlhJyxcbiAgICBndWFyZHM6ICdHdWFyZGllJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0QmluZGluZ3MnLFxuICAgIGhvc3RkaXJlY3RpdmVzOiAnSG9zdERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0VsZW1lbnRvIEh0bWwnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnRWxlbWVudG8gaHRtbCBjb24gZGlyZXR0aXZlJyxcbiAgICBpZGVudGlmaWVyOiAnSWRlbnRpZmljYXRvcmUnLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnRhJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0YScsXG4gICAgaW5kZXg6ICdJbmRpY2UnLFxuICAgIGluZGV4YWJsZTogJ0luZGljaXp6YWJpbGUnLFxuICAgIGluZm86ICdJbmZvcm1hemlvbmUnLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdlcmVkaXRhdG8gZGEnLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdJbnB1dCcsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0b3JzJyxcbiAgICBpbnRlcmZhY2U6ICdJbnRlcmZhY2NpYScsXG4gICAgaW50ZXJmYWNlczogJ0ludGVyZmFjY2UnLFxuICAgIGxlZ2VuZDogJ0xlZ2VuZGEnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbnphJyxcbiAgICBsaW5lczogJ0xpbmVlJyxcbiAgICBtZXRhZGF0YTogJ01ldGFkYXRpJyxcbiAgICBtZXRob2RzOiAnTWV0b2RpJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAnVmFyaWUnLFxuICAgIG1vZHVsZTogJ01vZHVsbycsXG4gICAgbW9kdWxlczogJ01vZHVsaScsXG4gICAgbmFtZTogJ05vbWUnLFxuICAgIG5vOiAnTm8nLFxuICAgICduby1ncmFwaCc6ICdHcmFmaWNvIG5vbiBkaXNwb25pYmlsZS4nLFxuICAgICduby1pZnJhbWUnOiAnSWwgdHVvIGJyb3dzZXIgbm9uIHN1cHBvcnRhIGlmcmFtZS4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnTmVzc3VuIHJpc3VsdGF0byBjb3JyaXNwb25kZW50ZScsXG4gICAgJ25vLXN2Zyc6ICdJbCB0dW8gYnJvd3NlciBub24gc3VwcG9ydGEgU1ZHJyxcbiAgICBvcHRpb25hbDogJ09wemlvbmFsZScsXG4gICAgb3V0cHV0czogJ091dHB1dCcsXG4gICAgb3ZlcnZpZXc6ICdTb21tYXJpbycsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtZXRyaScsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZGVwZW5kZW5jaWVzJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHJlZmlzc28nLFxuICAgIHByb3BlcnRpZXM6ICdQcm9wcmlldMOgJyxcbiAgICBwcm92aWRlcnM6ICdQcm92aWRlcnMnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlcXVpcmVkOiAnTmVjZXNzYXJpbycsXG4gICAgcmVzZXQ6ICdSZXNldCcsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAnY29ycmlzcG9uZGVuemEnLFxuICAgIHJldHVybnM6ICdSZXR1cm5zJyxcbiAgICByb3V0ZTogJ1JvdXRlJyxcbiAgICByb3V0ZXM6ICdSb3V0ZXMnLFxuICAgIHNjaGVtYXM6ICdTY2hlbWFzJyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ0RpZ2l0YSBwZXIgYXZ2aWFyZSBsYSByaWNlcmNhJyxcbiAgICBzZWxlY3RvcjogJ1NlbGVjdG9yJyxcbiAgICBzaWduYXR1cmU6ICdTaWduYXR1cmUnLFxuICAgIHNvdXJjZTogJ0ZvbnRlJyxcbiAgICBzdGFuZGFsb25lOiAnU3RhbmRhbG9uZScsXG4gICAgc3RhdGVtZW50czogJ1N0YXRlbWVudHMnLFxuICAgIHN0eWxlczogJ1N0aWxpJyxcbiAgICB0ZW1wbGF0ZTogJ01vZGVsbG8nLFxuICAgIHR5cGU6ICdUaXBvJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ1R5cGUgYWxpYXNlcycsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdUeXBlIHBhcmFtZXRlcnMnLFxuICAgIHR5cGVzOiAnVGlwaScsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdQcm9wcmlldMOgIHNlbnphIG5vbWUnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnQ29wZXJ0dXJhIHVuaXQgdGVzdCcsXG4gICAgdmFsdWU6ICdWYWxvcmknLFxuICAgIHZhcmlhYmxlczogJ1ZhcmlhYmlsaScsXG4gICAgeWVzOiAnU2knLFxuICAgIHpvb21pbjogJ0luZ3JhbmRpc2NpJyxcbiAgICB6b29tb3V0OiAnUmltcG9jY2lvbGlzY2knXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX0pBX0pQID0ge1xuICAgIGFjY2Vzc29yczogJ+OCouOCr+OCu+OCtScsXG4gICAgYXJndW1lbnRzOiAn5byV5pWwJyxcbiAgICBib290c3RyYXA6ICfjg5bjg7zjg4jjgrnjg4jjg6njg4Pjg5cnLFxuICAgIGJyYW5jaGVzOiAn44OW44Op44Oz44OBJyxcbiAgICBicm93c2U6ICfjg5bjg6njgqbjgronLFxuICAgIGNsYXNzZTogJ+OCr+ODqeOCuScsXG4gICAgY2xhc3NlczogJ+OCr+ODqeOCuScsXG4gICAgY29tcG9uZW50OiAn44Kz44Oz44Od44O844ON44Oz44OIJyxcbiAgICBjb21wb25lbnRzOiAn44Kz44Oz44Od44O844ON44Oz44OIJyxcbiAgICBjb25zdHJ1Y3RvcjogJ+OCs+ODs+OCueODiOODqeOCr+OCvycsXG4gICAgY29udHJvbGxlcnM6ICfjgrPjg7Pjg4jjg63jg7zjg6njg7wnLFxuICAgIGNvbnRyb2xsZXI6ICfjgrPjg7Pjg4jjg63jg7zjg6njg7wnLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ+OCq+ODkOODrOODg+OCuCcsXG4gICAgZGVjbGFyYXRpb25zOiAn5a6j6KiAJyxcbiAgICBkZWNvcmF0b3JzOiAn44OH44Kz44Os44O844K/44O8JyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICfliJ3mnJ/lgKQnLFxuICAgICdkZWZpbmVkLWluJzogJ0RlZmluZWQgaW4nLFxuICAgIGRlcGVuZGVuY2llczogJ+S+neWtmOmWouS/gicsXG4gICAgZGVwcmVjYXRlZDogJ+mdnuaOqOWlqCcsXG4gICAgZGVzY3JpcHRpb246ICfoqqzmmI4nLFxuICAgIGRpcmVjdGl2ZTogJ+ODh+OCo+ODrOOCr+ODhuOCo+ODlicsXG4gICAgZGlyZWN0aXZlczogJ+ODh+OCo+ODrOOCr+ODhuOCo+ODlicsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSDjg4Tjg6rjg7wnLFxuICAgIGVudGl0aWVzOiAn44Ko44Oz44OG44Kj44OG44KjJyxcbiAgICBlbnRpdHk6ICflrp/lnKjniaknLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ+OCqOODs+ODiOODquODvOOCs+ODs+ODneODvOODjeODs+ODiCcsXG4gICAgZW51bWVyYXRpb25zOiAn5YiX5oyZ5Z6LJyxcbiAgICBlbnVtczogJ0VudW1zJyxcbiAgICBleGFtcGxlOiAn5L6LJyxcbiAgICBleGFtcGxlczogJ+S+iycsXG4gICAgZXhwb3J0czogJ+OCqOOCr+OCueODneODvOODiCcsXG4gICAgZXh0ZW5kczogJ+e2meaJvycsXG4gICAgZmlsZTogJ+ODleOCoeOCpOODqycsXG4gICAgZnVuY3Rpb25zOiAn6Zai5pWwJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ+OBk+OBruODieOCreODpeODoeODs+ODiOOBr+S7peS4i+OCkuS9v+eUqOOBl+OBpueUn+aIkOOBleOCjOOBpuOBhOOBvuOBmScsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICfjga/jgZjjgoHjgasnLFxuICAgIGd1YXJkOiAn44Ks44O844OJJyxcbiAgICBndWFyZHM6ICfjgqzjg7zjg4knLFxuICAgIGhvc3RiaW5kaW5nczogJ+ODm+OCueODiOODkOOCpOODs+ODh+OCo+ODs+OCsCcsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0RGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ+ODm+OCueODiOODquOCueODiuODvCcsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIdG1s6KaB57SgJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ+ODh+OCo+ODrOOCr+ODhuOCo+ODlkh0bWzopoHntKAnLFxuICAgIGlkZW50aWZpZXI6ICforZjliKXlrZAnLFxuICAgIGltcGxlbWVudHM6ICflrp/oo4UnLFxuICAgIGltcG9ydHM6ICfjgqTjg7Pjg53jg7zjg4gnLFxuICAgIGluZGV4OiAn57Si5byVJyxcbiAgICBpbmRleGFibGU6ICfjgqTjg7Pjg4fjgq/jgrXjg5bjg6snLFxuICAgIGluZm86ICfmg4XloLEnLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdJbmhlcml0ZWQgZnJvbScsXG4gICAgaW5qZWN0YWJsZTogJ+OCpOODs+OCuOOCp+OCr+OCv+ODluODqycsXG4gICAgaW5qZWN0YWJsZXM6ICfjgqTjg7Pjgrjjgqfjgq/jgr/jg5bjg6snLFxuICAgIGlucHV0czogJ+WFpeWKmycsXG4gICAgaW50ZXJjZXB0b3JzOiAn44Kk44Oz44K/44O844K744OX44K/44O8JyxcbiAgICBpbnRlcmZhY2U6ICfjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrknLFxuICAgIGludGVyZmFjZXM6ICfjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrknLFxuICAgIGxlZ2VuZDogJ+WHoeS+iycsXG4gICAgbGljZW5zZTogJ+ODqeOCpOOCu+ODs+OCuScsXG4gICAgbGluZXM6ICfooYzmlbAnLFxuICAgIG1ldGFkYXRhOiAn44Oh44K/44OH44O844K/JyxcbiAgICBtZXRob2RzOiAn44Oh44K944OD44OJJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAn44Gd44Gu5LuWJyxcbiAgICBtb2R1bGU6ICfjg6Ljgrjjg6Xjg7zjg6snLFxuICAgIG1vZHVsZXM6ICfjg6Ljgrjjg6Xjg7zjg6snLFxuICAgIG5hbWU6ICflkI3liY0nLFxuICAgIG5vOiAn44GE44GE44GIJyxcbiAgICAnbm8tZ3JhcGgnOiAn5L2/55So44Gn44GN44KL44Kw44Op44OV44GM44GC44KK44G+44Gb44KTJyxcbiAgICAnbm8taWZyYW1lJzogJ+ODluODqeOCpuOCtuOBjGlmcmFtZeOCkuWvvuW/nOOBl+OBpuOBhOOBvuOBm+OCkycsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICfopovjgaTjgYvjgorjgb7jgZvjgpPjgafjgZfjgZ8nLFxuICAgICduby1zdmcnOiAn44OW44Op44Km44K244GMU1ZH44Gr5a++5b+c44GX44Gm44G+44Gb44KTJyxcbiAgICBvcHRpb25hbDogJ+OCquODl+OCt+ODp+ODsycsXG4gICAgb3V0cHV0czogJ+WHuuWKmycsXG4gICAgb3ZlcnZpZXc6ICfmpoLopoEnLFxuICAgIHBhcmFtZXRlcnM6ICfjg5Hjg6njg6Hjg7zjgr8nLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdQZWVyIGRlcGVuZGVuY2llcycsXG4gICAgcGlwZTogJ+ODkeOCpOODlycsXG4gICAgcGlwZXM6ICfjg5HjgqTjg5cnLFxuICAgIHByZWZpeDogJ+aOpemgrei+nicsXG4gICAgcHJvcGVydGllczogJ+ODl+ODreODkeODhuOCoycsXG4gICAgcHJvdmlkZXJzOiAn44OX44Ot44OQ44Kk44OA44O8JyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ+W/heimgScsXG4gICAgcmVzZXQ6ICfjg6rjgrvjg4Pjg4gnLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ+S7tuOBrue1kOaenOOBjOS4gOiHtOOBl+OBvuOBl+OBnycsXG4gICAgcmV0dXJuczogJ+aIu+OCiuWApCcsXG4gICAgcm91dGU6ICfjg6vjg7zjg4gnLFxuICAgIHJvdXRlczogJ+ODq+ODvOODiCcsXG4gICAgc2NoZW1hczogJ+OCueOCreODvOODnicsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICflhaXlipvjgZfjgabmpJzntKInLFxuICAgIHNlbGVjdG9yOiAn44K744Os44Kv44K/JyxcbiAgICBzaWduYXR1cmU6ICfjgrfjgrDjg43jg4Hjg6MnLFxuICAgIHNvdXJjZTogJ+OCveODvOOCuScsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICfmlocnLFxuICAgIHN0eWxlczogJ+OCueOCv+OCpOODqycsXG4gICAgdGVtcGxhdGU6ICfjg4bjg7Pjg5fjg6zjg7zjg4gnLFxuICAgIHR5cGU6ICflnosnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAn44K/44Kk44OX44Ko44Kk44Oq44Ki44K5JyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ+Wei+ODkeODqeODoeODvOOCv+ODvCcsXG4gICAgdHlwZXM6ICflnosnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAn5Yy/5ZCN44OX44Ot44OR44OG44KjJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ+ODpuODi+ODg+ODiOODhuOCueODiOOCq+ODkOODrOODg+OCuCcsXG4gICAgdmFsdWU6ICflgKQnLFxuICAgIHZhcmlhYmxlczogJ+WkieaVsCcsXG4gICAgeWVzOiAn44Gv44GEJyxcbiAgICB6b29taW46ICfmi6HlpKcnLFxuICAgIHpvb21vdXQ6ICfnuK7lsI8nXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX0tBX0dFID0ge1xuICBhY2Nlc3NvcnM6ICfhg5Dhg6Xhg6Hhg5Thg6Hhg53hg6Dhg5gnLFxuICBhcmd1bWVudHM6ICfhg5Dhg6Dhg5Lhg6Phg5vhg5Thg5zhg6Lhg5Thg5Hhg5gnLFxuICBib290c3RyYXA6ICfhg6nhg5Dhg5vhg6Lhg5Xhg5jhg6Dhg5fhg5Dhg5Xhg5gnLFxuICBicmFuY2hlczogJ+GDouGDneGDouGDlOGDkeGDmCcsXG4gIGJyb3dzZTogJ+GDk+GDkOGDkOGDl+GDleGDkOGDmuGDmOGDlOGDoOGDlCcsXG4gIGNsYXNzZTogJ+GDmeGDmuGDkOGDoeGDmCcsXG4gIGNsYXNzZXM6ICfhg5nhg5rhg5Dhg6Hhg5Thg5Hhg5gnLFxuICBjb21wb25lbnQ6ICfhg5nhg53hg5vhg57hg53hg5zhg5Thg5zhg6Lhg5gnLFxuICBjb21wb25lbnRzOiAn4YOZ4YOd4YOb4YOe4YOd4YOc4YOU4YOc4YOi4YOU4YOR4YOYJyxcbiAgY29uc3RydWN0b3I6ICfhg5nhg53hg5zhg6Hhg6Lhg6Dhg6Phg6Xhg6Lhg53hg6Dhg5gnLFxuICBjb250cm9sbGVyczogJ+GDmeGDneGDnOGDouGDoOGDneGDmuGDlOGDoOGDlOGDkeGDmCcsXG4gIGNvbnRyb2xsZXI6ICfhg5nhg53hg5zhg6Lhg6Dhg53hg5rhg5Thg6Dhg5gnLFxuICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICfhg5Phg53hg5nhg6Phg5vhg5Thg5zhg6Lhg5Dhg6rhg5jhg5jhg6Eg4YOS4YOQ4YOo4YOj4YOl4YOU4YOR4YOQJyxcbiAgZGVjbGFyYXRpb25zOiAn4YOT4YOU4YOZ4YOa4YOQ4YOg4YOQ4YOq4YOY4YOU4YOR4YOYJyxcbiAgZGVjb3JhdG9yczogJ+GDk+GDlOGDmeGDneGDoOGDkOGDouGDneGDoOGDlOGDkeGDmCcsXG4gICdkZWZhdWx0LXZhbHVlJzogJ+GDnOGDkOGDkuGDo+GDmuGDmOGDoeGDruGDm+GDlOGDleGDmCDhg5vhg5zhg5jhg6jhg5Xhg5zhg5Thg5rhg53hg5Hhg5AnLFxuICAnZGVmaW5lZC1pbic6ICfhg5Dhg6bhg6zhg5Thg6Dhg5jhg5rhg5jhg5AnLFxuICBkZXBlbmRlbmNpZXM6ICfhg5Phg5Dhg5vhg53hg5nhg5jhg5Phg5Thg5Hhg6Phg5rhg5Thg5Hhg5Thg5Hhg5gnLFxuICBkZXByZWNhdGVkOiAn4YOb4YOd4YOr4YOV4YOU4YOa4YOU4YOR4YOj4YOa4YOY4YOQJyxcbiAgZGVzY3JpcHRpb246ICfhg5Dhg6bhg6zhg5Thg6Dhg5AnLFxuICBkaXJlY3RpdmU6ICfhg5Phg5jhg6Dhg5Thg6Xhg6Lhg5jhg5Xhg5AnLFxuICBkaXJlY3RpdmVzOiAn4YOT4YOY4YOg4YOU4YOl4YOi4YOY4YOV4YOU4YOR4YOYJyxcbiAgJ2RvbSB0cmVlJzogJ0RPTSDhg67hg5QnLFxuICBlbnRpdGllczogJ+GDoeGDo+GDkeGDmOGDlOGDpeGDouGDlOGDkeGDmCcsXG4gIGVudGl0eTogJ+GDoeGDo+GDkeGDmOGDlOGDpeGDouGDmCcsXG4gIGVudHJ5Y29tcG9uZW50czogJ+GDqOGDlOGDoeGDleGDmuGDmOGDoSDhg5nhg53hg5vhg57hg53hg5zhg5Thg5zhg6Lhg5Thg5Hhg5gnLFxuICBlbnVtZXJhdGlvbnM6ICfhg6nhg5Dhg5vhg53hg5fhg5Xhg5rhg5Thg5Hhg5gnLFxuICBlbnVtczogJ+GDlOGDnOGDkOGDm+GDlOGDkeGDmCcsXG4gIGV4YW1wbGU6ICfhg5vhg5Dhg5Lhg5Dhg5rhg5jhg5fhg5gnLFxuICBleGFtcGxlczogJ+GDm+GDkOGDkuGDkOGDmuGDmOGDl+GDlOGDkeGDmCcsXG4gIGV4cG9ydHM6ICfhg5Thg6Xhg6Hhg57hg53hg6Dhg6Lhg5gnLFxuICBleHRlbmRzOiAn4YOQ4YOS4YOg4YOr4YOU4YOa4YOU4YOR4YOhJyxcbiAgZmlsZTogJ+GDpOGDkOGDmOGDmuGDmCcsXG4gIGZ1bmN0aW9uczogJ+GDpOGDo+GDnOGDpeGDquGDmOGDlOGDkeGDmCcsXG4gICdnZW5lcmF0ZWQtdXNpbmcnOiAn4YOT4YOd4YOZ4YOj4YOb4YOU4YOc4YOi4YOQ4YOq4YOY4YOQIOGDk+GDkOGDkuGDlOGDnOGDlOGDoOGDmOGDoOGDk+GDkCDhg5Lhg5Dhg5vhg53hg6fhg5Thg5zhg5Thg5Hhg5jhg5cnLFxuICAnZ2V0dGluZy1zdGFydGVkJzogJ+GDleGDmOGDrOGDp+GDlOGDkeGDlycsXG4gIGd1YXJkOiAn4YOb4YOq4YOV4YOU4YOa4YOYJyxcbiAgZ3VhcmRzOiAn4YOb4YOq4YOV4YOU4YOa4YOU4YOR4YOYJyxcbiAgaG9zdGJpbmRpbmdzOiAn4YOw4YOd4YOh4YOi4YOY4YOhIOGDk+GDkOGDm+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDmuGDlOGDkeGDmCcsXG4gIGhvc3RkaXJlY3RpdmVzOiAn4YOw4YOd4YOh4YOi4YOY4YOhIOGDk+GDmOGDoOGDlOGDpeGDouGDmOGDleGDlOGDkeGDmCcsXG4gIGhvc3RsaXN0ZW5lcnM6ICfhg7Dhg53hg6Hhg6Lhg5jhg6Eg4YOb4YOh4YOb4YOU4YOc4YOU4YOa4YOU4YOR4YOYJyxcbiAgJ2h0bWwtZWxlbWVudCc6ICdIdG1sIOGDlOGDmuGDlOGDm+GDlOGDnOGDouGDmCcsXG4gICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnSHRtbCDhg5Thg5rhg5Thg5vhg5Thg5zhg6Lhg5gg4YOT4YOY4YOg4YOU4YOl4YOi4YOY4YOV4YOY4YOXJyxcbiAgaWRlbnRpZmllcjogJ+GDmOGDk+GDlOGDnOGDouGDmOGDpOGDmOGDmeGDkOGDouGDneGDoOGDmCcsXG4gIGltcGxlbWVudHM6ICfhg5Dhg67hg53hg6Dhg6rhg5jhg5Thg5rhg5Thg5Hhg6EnLFxuICBpbXBvcnRzOiAn4YOY4YOb4YOe4YOd4YOg4YOi4YOYJyxcbiAgaW5kZXg6ICfhg5jhg5zhg5Phg5Thg6Xhg6Hhg5gnLFxuICBpbmRleGFibGU6ICfhg5jhg5zhg5Phg5Thg6Xhg6Hhg5jhg6Dhg5Thg5Hhg5Dhg5Phg5gnLFxuICBpbmZvOiAn4YOY4YOc4YOk4YOd4YOg4YOb4YOQ4YOq4YOY4YOQJyxcbiAgJ2luaGVyaXRlZC1mcm9tJzogJ+GDm+GDlOGDm+GDmeGDleGDmOGDk+GDoOGDlOGDneGDkeGDmOGDlyDhg5vhg5jhg5jhg6bhg50nLFxuICBpbmplY3RhYmxlOiAn4YOY4YOc4YOU4YOl4YOq4YOY4YOQJyxcbiAgaW5qZWN0YWJsZXM6ICfhg6Hhg5Dhg5jhg5zhg5Thg6Xhg6rhg5jhg50g4YOh4YOQ4YOo4YOj4YOQ4YOa4YOU4YOR4YOU4YOR4YOYJyxcbiAgaW5wdXRzOiAn4YOo4YOU4YOn4YOV4YOQ4YOc4YOU4YOR4YOYJyxcbiAgaW50ZXJjZXB0b3JzOiAn4YOp4YOQ4YOb4YOt4YOg4YOU4YOa4YOU4YOR4YOYJyxcbiAgaW50ZXJmYWNlOiAn4YOY4YOc4YOi4YOU4YOg4YOk4YOU4YOY4YOh4YOYJyxcbiAgaW50ZXJmYWNlczogJ+GDmOGDnOGDouGDlOGDoOGDpOGDlOGDmOGDoeGDlOGDkeGDmCcsXG4gIGxlZ2VuZDogJ+GDmuGDlOGDkuGDlOGDnOGDk+GDkCcsXG4gIGxpY2Vuc2U6ICfhg5rhg5jhg6rhg5Thg5zhg5bhg5jhg5AnLFxuICBsaW5lczogJ+GDruGDkOGDluGDlOGDkeGDmCcsXG4gIG1ldGFkYXRhOiAn4YOb4YOU4YOi4YOQ4YOb4YOd4YOc4YOQ4YOq4YOU4YOb4YOU4YOR4YOYJyxcbiAgbWV0aG9kczogJ+GDm+GDlOGDl+GDneGDk+GDlOGDkeGDmCcsXG4gIG1pc2NlbGxhbmVvdXM6ICfhg6Hhg67hg5Xhg5Dhg5Phg5Dhg6Hhg67hg5Xhg5AnLFxuICBtb2R1bGU6ICfhg5vhg53hg5Phg6Phg5rhg5gnLFxuICBtb2R1bGVzOiAn4YOb4YOd4YOT4YOj4YOa4YOU4YOR4YOYJyxcbiAgbmFtZTogJ+GDoeGDkOGDruGDlOGDmuGDlOGDkeGDmCcsXG4gIG5vOiAn4YOQ4YOg4YOQJyxcbiAgJ25vLWdyYXBoJzogJ+GDkuGDoOGDkOGDpOGDmCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhIOGDruGDlOGDmuGDm+GDmOGDoeGDkOGDrOGDleGDk+GDneGDm+GDmC4nLFxuICAnbm8taWZyYW1lJzogJ+GDl+GDpeGDleGDlOGDnOGDoSDhg5Hhg6Dhg5Dhg6Phg5bhg5Thg6Dhg6Eg4YOQ4YOgIOGDkOGDpeGDleGDoSBpZnJhbWVzLeGDmOGDoSDhg5vhg67hg5Dhg6Dhg5Phg5Dhg63hg5Thg6Dhg5AuJyxcbiAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICfhg5Dhg6Ag4YOQ4YOg4YOY4YOhIOGDqOGDlOGDoeGDkOGDkeGDkOGDm+GDmOGDoeGDmCDhg6jhg5Thg5Phg5Thg5Lhg5Thg5Hhg5gnLFxuICAnbm8tc3ZnJzogJ+GDl+GDpeGDleGDlOGDnOGDoSDhg5Hhg6Dhg5Dhg6Phg5bhg5Thg6Dhg6Eg4YOQ4YOgIOGDkOGDpeGDleGDoSBTVkcg4YOb4YOu4YOQ4YOg4YOT4YOQ4YOt4YOU4YOg4YOQJyxcbiAgb3B0aW9uYWw6ICfhg6Hhg6Phg6Dhg5Xhg5jhg5rhg5jhg6Hhg5Dhg5vhg5Thg5Hhg6AnLFxuICBvdXRwdXRzOiAn4YOo4YOU4YOT4YOU4YOS4YOU4YOR4YOYJyxcbiAgb3ZlcnZpZXc6ICfhg5vhg5jhg5vhg53hg67hg5jhg5rhg5Xhg5AnLFxuICBwYXJhbWV0ZXJzOiAn4YOe4YOQ4YOg4YOQ4YOb4YOU4YOi4YOg4YOU4YOR4YOYJyxcbiAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ+GDl+GDkOGDnOGDkOGDouGDneGDmuGDlOGDkeGDl+GDkOGDnCDhg5Phg5Dhg5vhg53hg5nhg5jhg5Phg5Thg5Hhg6Phg5rhg5Thg5Hhg5Thg5Hhg5gnLFxuICBwaXBlOiAn4YOb4YOY4YOa4YOYJyxcbiAgcGlwZXM6ICfhg5vhg5jhg5rhg5Thg5Hhg5gnLFxuICBwcmVmaXg6ICfhg57hg6Dhg5Thg6Thg5jhg6Xhg6Hhg5gnLFxuICBwcm9wZXJ0aWVzOiAn4YOX4YOV4YOY4YOh4YOU4YOR4YOQJyxcbiAgcHJvdmlkZXJzOiAn4YOe4YOg4YOd4YOV4YOQ4YOY4YOT4YOU4YOg4YOYJyxcbiAgcHVyZTogJ+GDrOGDm+GDmOGDnOGDk+GDkCcsXG4gIHJlYWRtZTogJ1JFQURNRScsXG4gIHJlcXVpcmVkOiAn4YOQ4YOj4YOq4YOY4YOa4YOU4YOR4YOU4YOa4YOYJyxcbiAgcmVzZXQ6ICfhg5Lhg5Dhg5Phg5Dhg6Lhg5Xhg5jhg6Dhg5fhg5Xhg5AnLFxuICAncmVzdWx0cy1tYXRjaGluZyc6ICfhg6jhg5Thg5Phg5Thg5Lhg5Thg5Hhg5gg4YOU4YOb4YOX4YOu4YOV4YOU4YOV4YOQJyxcbiAgcmV0dXJuczogJ+GDkeGDoOGDo+GDnOGDk+GDlOGDkeGDkCcsXG4gIHJvdXRlOiAn4YOb4YOQ4YOg4YOo4YOg4YOj4YOi4YOYJyxcbiAgcm91dGVzOiAn4YOb4YOQ4YOg4YOo4YOg4YOj4YOi4YOU4YOR4YOYJyxcbiAgc2NoZW1hczogJ+GDoeGDpeGDlOGDm+GDlOGDkeGDmCcsXG4gICdzZWFyY2gtcGxhY2Vob2xkZXInOiAn4YOT4YOQ4YOs4YOU4YOg4YOUIOGDm+GDneGDoeGDkOGDq+GDlOGDkeGDnOGDkOGDkycsXG4gIHNlbGVjdG9yOiAn4YOh4YOU4YOa4YOU4YOl4YOi4YOd4YOg4YOYJyxcbiAgc2lnbmF0dXJlOiAn4YOu4YOU4YOa4YOb4YOd4YOs4YOU4YOg4YOQJyxcbiAgc291cmNlOiAn4YOs4YOn4YOQ4YOg4YOdJyxcbiAgc3RhbmRhbG9uZTogJ+GDk+GDkOGDm+GDneGDo+GDmeGDmOGDk+GDlOGDkeGDlOGDmuGDmCcsXG4gIHN0YXRlbWVudHM6ICfhg5Lhg5Dhg5zhg6rhg67hg5Dhg5Phg5Thg5Hhg5Thg5Hhg5gnLFxuICBzdHlsZXM6ICfhg6Hhg6Lhg5jhg5rhg5Thg5Hhg5gnLFxuICB0ZW1wbGF0ZTogJ+GDqOGDkOGDkeGDmuGDneGDnOGDmCcsXG4gIHR5cGU6ICfhg6Lhg5jhg57hg5gnLFxuICAndHlwZS1hbGlhc2VzJzogJ+GDm+GDlOGDouGDoeGDkOGDruGDlOGDmuGDmOGDoSDhg6Lhg5jhg57hg5gnLFxuICAndHlwZS1wYXJhbWV0ZXJzJzogJ+GDnuGDkOGDoOGDkOGDm+GDlOGDouGDoOGDlOGDkeGDmOGDoSDhg6Lhg5jhg57hg5gnLFxuICB0eXBlczogJ+GDouGDmOGDnuGDlOGDkeGDmCcsXG4gICd1bmFtZWQtcHJvcGVydHknOiAn4YOj4YOh4YOQ4YOu4YOU4YOa4YOdIOGDl+GDleGDmOGDoeGDlOGDkeGDkCcsXG4gICd1bml0LXRlc3QtY292ZXJhZ2UnOiAn4YOU4YOg4YOX4YOU4YOj4YOa4YOYIOGDouGDlOGDoeGDouGDmOGDoSDhg5Lhg5Dhg6jhg6Phg6Xhg5Thg5Hhg5AnLFxuICB2YWx1ZTogJ+GDm+GDnOGDmOGDqOGDleGDnOGDlOGDmuGDneGDkeGDkCcsXG4gIHZhcmlhYmxlczogJ+GDquGDleGDmuGDkOGDk+GDlOGDkeGDmCcsXG4gIHllczogJ+GDmeGDmCcsXG4gIHpvb21pbjogJ+GDm+GDmOGDkOGDruGDmuGDneGDleGDlOGDkeGDkCcsXG4gIHpvb21vdXQ6ICfhg5vhg5Dhg6Hhg6jhg6Lhg5Dhg5Hhg5jhg6Dhg5Thg5Hhg5AnXG59OyIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9LT19LUiA9IHtcbiAgICBhY2Nlc3NvcnM6ICfsoJHqt7zsnpAnLFxuICAgIGFyZ3VtZW50czogJ+yduOyImCcsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ+u4jOuenOy5mCcsXG4gICAgYnJvd3NlOiAn7YOQ7IOJJyxcbiAgICBjbGFzc2U6ICftgbTrnpjsiqQnLFxuICAgIGNsYXNzZXM6ICftgbTrnpjsiqQnLFxuICAgIGNvbXBvbmVudDogJ+y7tO2PrOuEjO2KuCcsXG4gICAgY29tcG9uZW50czogJ+y7tO2PrOuEjO2KuCcsXG4gICAgY29uc3RydWN0b3I6ICfsg53shLHsnpAnLFxuICAgIGNvbnRyb2xsZXJzOiAn7Luo7Yq466Gk65+sJyxcbiAgICBjb250cm9sbGVyOiAn7Luo7Yq466Gk65+sJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICfrrLjshJwg7Luk67KE66as7KeAJyxcbiAgICBkZWNsYXJhdGlvbnM6ICfshKDslrgnLFxuICAgIGRlY29yYXRvcnM6ICfrjbDsvZTroIjsnbTthLAnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ+q4sOuzuCDqsJInLFxuICAgICdkZWZpbmVkLWluJzogJ+uLpOydjOyXkCDsoJXsnZjrkKgnLFxuICAgIGRlcGVuZGVuY2llczogJ+ydmOyhtOyEsScsXG4gICAgZGVwcmVjYXRlZDogJ+u5hOy2lOyynCcsXG4gICAgZGVzY3JpcHRpb246ICfshKTrqoUnLFxuICAgIGRpcmVjdGl2ZTogJ0RpcmVjdGl2ZScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmVjdGl2ZXMnLFxuICAgICdkb20gdHJlZSc6ICfrj5Qg7Yq466asJyxcbiAgICBlbnRpdGllczogJ+yXlO2LsO2LsCcsXG4gICAgZW50aXR5OiAn7Iuk7J6sJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ+yXtOqxsCcsXG4gICAgZW51bXM6ICdFbnVtcycsXG4gICAgZXhhbXBsZTogJ+yYiOyLnCcsXG4gICAgZXhhbXBsZXM6ICfsmIgnLFxuICAgIGV4cG9ydHM6ICfrgrTrs7TrgrTquLAnLFxuICAgIGV4dGVuZHM6ICdFeHRlbmRzJyxcbiAgICBmaWxlOiAn7YyM7J28JyxcbiAgICBmdW5jdGlvbnM6ICftlajsiJgnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAn7J20IOusuOyEnOuKlCDri6TsnYzsnYQg7J207Jqp7ZWY7JesIOyDneyEseuQmOyXiOyKteuLiOuLpCcsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICfsi5zsnpHtlZjquLAnLFxuICAgIGd1YXJkOiAn6rCA65OcJyxcbiAgICBndWFyZHM6ICfqsIDrk5wnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0RGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSFRNTCDsmpTshownLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAn7KeA7Iuc7Ja06rCAIOyeiOuKlCBIVE1MIOyalOyGjCcsXG4gICAgaWRlbnRpZmllcjogJ+yLneuzhOyekCcsXG4gICAgaW1wbGVtZW50czogJ+q1rO2YhCcsXG4gICAgaW1wb3J0czogJ+qwgOyguOyYpOq4sCcsXG4gICAgaW5kZXg6ICfsg4nsnbgnLFxuICAgIGluZGV4YWJsZTogJ0luZGV4YWJsZScsXG4gICAgaW5mbzogJ+ygleuztCcsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ+uLpOydjOyXkOyEnCDsg4Hsho3rkKgnLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICfsnoXroKUnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAn7J247YSw7Y6Y7J207IqkJyxcbiAgICBpbnRlcmZhY2VzOiAn7J247YSw7Y6Y7J207IqkJyxcbiAgICBsZWdlbmQ6ICfrspTroYAnLFxuICAgIGxpY2Vuc2U6ICfrnbzsnbTshKDsiqQnLFxuICAgIGxpbmVzOiAn7KSEJyxcbiAgICBtZXRhZGF0YTogJ+uplO2DgOuNsOydtO2EsCcsXG4gICAgbWV0aG9kczogJ+uplOyGjOuTnCcsXG4gICAgbWlzY2VsbGFuZW91czogJ+q4sO2DgCcsXG4gICAgbW9kdWxlOiAn66qo65OIJyxcbiAgICBtb2R1bGVzOiAn66qo65OIJyxcbiAgICBuYW1lOiAn7J2066aEJyxcbiAgICBubzogJ+yVhOuLiOyYpCcsXG4gICAgJ25vLWdyYXBoJzogJ+yCrOyaqe2VoCDsiJgg7J6I64qUIOq3uOuemO2UhOqwgCDsl4bsirXri4jri6QuJyxcbiAgICAnbm8taWZyYW1lJzogJ+yCrOyaqeykkeyduCDruIzrnbzsmrDsoIDqsIAgaWZyYW1l7J2EIOyngOybkO2VmOyngCDslYrsirXri4jri6QnLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAn6rKA7IOJIOqysOqzvOqwgCDsl4bsirXri4jri6QnLFxuICAgICduby1zdmcnOiAn67iM65287Jqw7KCA6rCAIFNWR+ulvCDsp4Dsm5DtlZjsp4Ag7JWK7Iq164uI64ukJyxcbiAgICBvcHRpb25hbDogJ+yEoO2DneyggScsXG4gICAgb3V0cHV0czogJ+qysOqzvOusvCcsXG4gICAgb3ZlcnZpZXc6ICfqsJzsmpQnLFxuICAgIHBhcmFtZXRlcnM6ICfrp6TqsJzrs4DsiJgnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICfsg4HtmLgg7J2Y7KG07ISxJyxcbiAgICBwaXBlOiAn7YyM7J207ZSEJyxcbiAgICBwaXBlczogJ+2MjOydtO2UhCcsXG4gICAgcHJlZml4OiAn7KCR65GQ7Ja0JyxcbiAgICBwcm9wZXJ0aWVzOiAn7IaN7ISxJyxcbiAgICBwcm92aWRlcnM6ICfsoJzqs7XsnpAnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlcXVpcmVkOiAn7ZWE7IiY7J2YJyxcbiAgICByZXNldDogJ+y0iOq4sO2ZlCcsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAn6rCc7J2YIOqysOqzvOqwgCDsnbzsuZjtlojsirXri4jri6QnLFxuICAgIHJldHVybnM6ICfrsJjtmZgnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogJ1JvdXRlcycsXG4gICAgc2NoZW1hczogJ+yKpO2CpOuniCcsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICfqsoDsg4nslrQg7J6F66ClJyxcbiAgICBzZWxlY3RvcjogJ+yEoO2DneyekCcsXG4gICAgc2lnbmF0dXJlOiAnU2lnbmF0dXJlJyxcbiAgICBzb3VyY2U6ICfstpzsspgnLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAn7Iqk7YOA7J28JyxcbiAgICB0ZW1wbGF0ZTogJ+yjvO2YlScsXG4gICAgdHlwZTogJ+2DgOyehScsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICftg4DsnoUg67OE7LmtJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ+2DgOyehSDrp6TqsJwg67OA7IiYJyxcbiAgICB0eXBlczogJ+2DgOyehScsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICfsnbXrqoUg7IaN7ISxJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ+uLqOychCDthYzsiqTtirgg7Luk67KE66as7KeAJyxcbiAgICB2YWx1ZTogJ+qwkicsXG4gICAgdmFyaWFibGVzOiAn67OA7IiYJyxcbiAgICB5ZXM6ICfrhKQnLFxuICAgIHpvb21pbjogJ+2ZleuMgCcsXG4gICAgem9vbW91dDogJ+y2leyGjCdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fTkxfTkwgPSB7XG4gICAgYWNjZXNzb3JzOiAnQWNjZXNzb3JzJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudGVuJyxcbiAgICBib290c3RyYXA6ICdCb290c3RyYXAnLFxuICAgIGJyYW5jaGVzOiAnQnJhbmNoZXMnLFxuICAgIGJyb3dzZTogJ0Jyb3dzZScsXG4gICAgY2xhc3NlOiAnS2xhc3NlJyxcbiAgICBjbGFzc2VzOiAnS2xhc3NlbicsXG4gICAgY29tcG9uZW50OiAnQ29tcG9uZW50JyxcbiAgICBjb21wb25lbnRzOiAnQ29tcG9uZW50ZW4nLFxuICAgIGNvbnN0cnVjdG9yOiAnQ29uc3RydWN0b3InLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdEb2N1bWVudGF0aWUgY292ZXJhZ2UnLFxuICAgIGRlY2xhcmF0aW9uczogJ0RlY2xhcmF0aWVzJyxcbiAgICBkZWNvcmF0b3JzOiAnRGVjb3JhdG9ycycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnRGVmYXVsdCB3YWFyZGUnLFxuICAgICdkZWZpbmVkLWluJzogJ0dlZGVmaW5pZWVyZCBpbicsXG4gICAgZGVwZW5kZW5jaWVzOiAnRGVwZW5kZW5jaWVzJyxcbiAgICBkZXByZWNhdGVkOiAnVmVyb3VkZXJkJyxcbiAgICBkZXNjcmlwdGlvbjogJ09tc2NocmlqdmluZycsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWN0aXZlJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWN0aXZlcycsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBib29tJyxcbiAgICBlbnRpdGllczogJ0VudGl0ZWl0ZW4nLFxuICAgIGVudGl0eTogJ0VudGl0ZWl0JyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcmF0aW9ucycsXG4gICAgZW51bXM6ICdFbnVtcycsXG4gICAgZXhhbXBsZTogJ1Zvb3JiZWVsZCcsXG4gICAgZXhhbXBsZXM6ICdWb29yYmVlbGRlbicsXG4gICAgZXhwb3J0czogJ0V4cG9ydHMnLFxuICAgIGV4dGVuZHM6ICdFeHRlbmRzJyxcbiAgICBmaWxlOiAnQmVzdGFuZCcsXG4gICAgZnVuY3Rpb25zOiAnRnVuY3RpZXMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhdGllIGdlZ2VuZXJlZWQgbWV0JyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ0FhbiBkZSBzbGFnJyxcbiAgICBndWFyZDogJ0d1YXJkJyxcbiAgICBndWFyZHM6ICdHdWFyZHMnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0RGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbCBlbGVtZW50JyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0h0bWwgZWxlbWVudCBtZXQgZGlyZWN0aXZlJyxcbiAgICBpZGVudGlmaWVyOiAnSWRlbnRpZmllcicsXG4gICAgaW1wbGVtZW50czogJ0ltcGxlbWVudGVlcnQnLFxuICAgIGltcG9ydHM6ICdJbXBvcnRzJyxcbiAgICBpbmRleDogJ0luZGV4JyxcbiAgICBpbmRleGFibGU6ICdJbmRleGVlcmJhYXInLFxuICAgIGluZm86ICdJbmZvcm1hdGllJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSW5oZXJpdGVkIHZhbicsXG4gICAgaW5qZWN0YWJsZTogJ0luamVjdGFibGUnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZWN0YWJsZXMnLFxuICAgIGlucHV0czogJ0lucHV0cycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0b3JzJyxcbiAgICBpbnRlcmZhY2U6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmZhY2VzJyxcbiAgICBsZWdlbmQ6ICdMZWdlbmRhJyxcbiAgICBsaWNlbnNlOiAnTGljZW50aWUnLFxuICAgIGxpbmVzOiAnUmVnZWxzJyxcbiAgICBtZXRhZGF0YTogJ01ldGFkYXRhJyxcbiAgICBtZXRob2RzOiAnTWV0aG9kcycsXG4gICAgbWlzY2VsbGFuZW91czogJ0RpdmVyc2VuJyxcbiAgICBtb2R1bGU6ICdNb2R1bGUnLFxuICAgIG1vZHVsZXM6ICdNb2R1bGVzJyxcbiAgICBuYW1lOiAnTmFhbScsXG4gICAgbm86ICdOZWUnLFxuICAgICduby1ncmFwaCc6ICdHZWVuIGRpYWdyYW0gYmVzY2hpa2JhYXIuJyxcbiAgICAnbm8taWZyYW1lJzogJ1V3IGJyb3dzZXIgb25kZXJzdGV1bmQgZ2VlbiBpZnJhbWVzLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdHZWVuIG92ZXJlZW5rb21lbmRlIHJlc3VsdGF0ZW4nLFxuICAgICduby1zdmcnOiAnVXcgYnJvd3NlciBvbmRlcnN0ZXVuZCBnZWVuIFNWRycsXG4gICAgb3B0aW9uYWw6ICdPcHRpb25lZWwnLFxuICAgIG91dHB1dHM6ICdPdXRwdXRzJyxcbiAgICBvdmVydmlldzogJ092ZXJ6aWNodCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtZXRlcnMnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdQZWVyIGRlcGVuZGVuY2llcycsXG4gICAgcGlwZTogJ1BpcGUnLFxuICAgIHBpcGVzOiAnUGlwZXMnLFxuICAgIHByZWZpeDogJ1Zvb3J2b2Vnc2VsJyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcGVydGllcycsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHV1cicsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ1ZlcmVpc3QnLFxuICAgIHJlc2V0OiAnUmVzZXQnLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ292ZXJlZW5rb21lbmRlIHJlc3VsdGF0ZW4nLFxuICAgIHJldHVybnM6ICdSZXR1cm5zJyxcbiAgICByb3V0ZTogJ1JvdXRlJyxcbiAgICByb3V0ZXM6ICdSb3V0ZXMnLFxuICAgIHNjaGVtYXM6IFwiU2NoZW1hJ3NcIixcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ1R5cGUgb20gdGUgem9la2VuJyxcbiAgICBzZWxlY3RvcjogJ1NlbGVjdG9yJyxcbiAgICBzaWduYXR1cmU6ICdIYW5kdGVrZW5pbmcnLFxuICAgIHNvdXJjZTogJ0Jyb24nLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAnU3RpamxlbicsXG4gICAgdGVtcGxhdGU6ICdTamFibG9vbicsXG4gICAgdHlwZTogJ1R5cGUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVHlwZSBhbGlhc3NlbicsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdUeXBlIHBhcmFtZXRlcnMnLFxuICAgIHR5cGVzOiAnVHlwZXMnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnTmFhbWxvemUgcHJvcGVydHknLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnVW5pdCB0ZXN0IGNvdmVyYWdlJyxcbiAgICB2YWx1ZTogJ1dhYXJkZScsXG4gICAgdmFyaWFibGVzOiAnVmFyaWFiZWxlbicsXG4gICAgeWVzOiAnSmEnLFxuICAgIHpvb21pbjogJ1pvb20gaW4nLFxuICAgIHpvb21vdXQ6ICdab29tIHVpdCdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fUExfUEwgPSB7XG4gICAgYWNjZXNzb3JzOiAnQWtjZXNvcicsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnR5JyxcbiAgICBib290c3RyYXA6ICdVcnVjaG9taWVuaWUnLFxuICAgIGJyYW5jaGVzOiAnR2HFgsSZemllJyxcbiAgICBicm93c2U6ICdQcnplZ2zEhWRhaicsXG4gICAgY2xhc3NlOiAnS2xhc2EnLFxuICAgIGNsYXNzZXM6ICdLbGFzeScsXG4gICAgY29tcG9uZW50OiAnS29tcG9uZW50JyxcbiAgICBjb21wb25lbnRzOiAnS29tcG9uZW50eScsXG4gICAgY29uc3RydWN0b3I6ICdLb25zdHJ1a3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdLb250cm9sZXJ5JyxcbiAgICBjb250cm9sbGVyOiAnS29udHJvbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdQb2tyeWNpZSBkb2t1bWVudGFjasSFJyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEZWtsYXJhY2plJyxcbiAgICBkZWNvcmF0b3JzOiAnRGVrb3JhdG9yeScsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnRG9tecWbbG5hIHdhcnRvxZvEhycsXG4gICAgJ2RlZmluZWQtaW4nOiAnWmRlZmluaW93YW5lIHcnLFxuICAgIGRlcGVuZGVuY2llczogJ0JpYmxpb3Rla2knLFxuICAgIGRlcHJlY2F0ZWQ6ICdQcnplc3RhcnphxYJlJyxcbiAgICBkZXNjcmlwdGlvbjogJ09waXMnLFxuICAgIGRpcmVjdGl2ZTogJ0R5cmVrdHl3YScsXG4gICAgZGlyZWN0aXZlczogJ0R5cmVrdHl3eScsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBkcnpld28nLFxuICAgIGVudGl0aWVzOiAnUG9kbWlvdHknLFxuICAgIGVudGl0eTogJ1BvZG1pb3QnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0VudHJ5Q29tcG9uZW50cycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyYWNqZScsXG4gICAgZW51bXM6ICdFbnVteScsXG4gICAgZXhhbXBsZTogJ1ByenlrxYJhZCcsXG4gICAgZXhhbXBsZXM6ICdQcnp5a8WCYWR5JyxcbiAgICBleHBvcnRzOiAnRXhwb3J0eScsXG4gICAgZXh0ZW5kczogJ1JvenN6ZXJ6YScsXG4gICAgZmlsZTogJ1BsaWsnLFxuICAgIGZ1bmN0aW9uczogJ0Z1bmtjamUnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9rdW1lbnRhY2phIHd5Z2VuZXJvd2FuYSBwcnp5IHXFvHljaXUnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnU3RhcnQnLFxuICAgIGd1YXJkOiAnR3VhcmQnLFxuICAgIGd1YXJkczogXCJHdWFyZCd5XCIsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdpJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3REaXJlY3RpdmVzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVyeScsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIdG1sIGVsZW1lbnQnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnSHRtbCBlbGVtZW50IHogZHlyZWt0eXfEhScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50eWZpa2F0b3InLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnR1amUnLFxuICAgIGltcG9ydHM6ICdJbXBvcnR1amUnLFxuICAgIGluZGV4OiAnSW5kZWtzJyxcbiAgICBpbmRleGFibGU6ICdJbmRla3Nvd2FueScsXG4gICAgaW5mbzogJ0luZm9ybWF0aWUnLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdEemllZHppY3p5IHonLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdJbnB1dHknLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9yeScsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmZWpzJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmZWpzeScsXG4gICAgbGVnZW5kOiAnTGVnZW5kYScsXG4gICAgbGljZW5zZTogJ0xpY2VuY2phJyxcbiAgICBsaW5lczogJ0xpbmllJyxcbiAgICBtZXRhZGF0YTogJ01ldGFkYW5lJyxcbiAgICBtZXRob2RzOiAnTWV0b2R5JyxcbiAgICBtaXNjZWxsYW5lb3VzOiAnUsOzxbxuZScsXG4gICAgbW9kdWxlOiAnTW9kdcWCJyxcbiAgICBtb2R1bGVzOiAnTW9kdcWCeScsXG4gICAgbmFtZTogJ05hendhJyxcbiAgICBubzogJ05pZScsXG4gICAgJ25vLWdyYXBoJzogJ0dyYWYgbmllZG9zdMSZcG55LicsXG4gICAgJ25vLWlmcmFtZSc6IFwiVHdvamEgcHJ6ZWdsxIVkYXJrYSBuaWUgd3NwaWVyYSBpZnJhbWUnw7N3LlwiLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnQnJhayBwYXN1asSFY3ljaCB3eW5pa8OzdycsXG4gICAgJ25vLXN2Zyc6ICdUd29qYSBwcnplZ2zEhWRhcmthIG5pZSB3c3BpZXJhIFNWRycsXG4gICAgb3B0aW9uYWw6ICdPcGNqb25hbG5lJyxcbiAgICBvdXRwdXRzOiAnT3V0cHV0eScsXG4gICAgb3ZlcnZpZXc6ICdQcnplZ2zEhWQnLFxuICAgIHBhcmFtZXRlcnM6ICdQYXJhbWV0cnknLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdCaWJsaW90ZWtpIHphbGXFvG5lJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6IFwiUGlwZSd5XCIsXG4gICAgcHJlZml4OiAnUHJlZmlrcycsXG4gICAgcHJvcGVydGllczogJ1fFgsSFxZtjaXdvxZtjaScsXG4gICAgcHJvdmlkZXJzOiAnRG9zdGFyY3p5Y2llbGUnLFxuICAgIHB1cmU6ICdDenlzdHknLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVxdWlyZWQ6ICdXeW1hZ2FueScsXG4gICAgcmVzZXQ6ICdSZXNldCcsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAncGFzdWrEhWN5Y2ggd3luaWvDs3cnLFxuICAgIHJldHVybnM6ICdad3JhY2EnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogXCJSb3V0ZSd5XCIsXG4gICAgc2NoZW1hczogJ1NjaGVtYXR5JyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ1dwcm93YWTFuiB0ZWtzdCB3eXN6dWtpd2FuaWEnLFxuICAgIHNlbGVjdG9yOiAnU2VsZWt0b3InLFxuICAgIHNpZ25hdHVyZTogJ1BvZHBpcycsXG4gICAgc291cmNlOiAnU291cmNlJyxcbiAgICBzdGFuZGFsb25lOiAnU3RhbmRhbG9uZScsXG4gICAgc3RhdGVtZW50czogJ0luc3RydWtjamUnLFxuICAgIHN0eWxlczogJ0VzdGlsb3MnLFxuICAgIHRlbXBsYXRlOiAnTW9kZWxvJyxcbiAgICB0eXBlOiAnVHlwJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ0FsaWFzeSB0eXDDs3cnLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAnUGFyYW1ldHJ5IHR5cMOzdycsXG4gICAgdHlwZXM6ICdUeXB5JyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ05pZW5hendhbmEgd8WCYcWbbm/Fm8SHJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ1Bva3J5Y2llIHRlc3RhbWkgamVkbm9zdGtvd3ltaScsXG4gICAgdmFsdWU6ICdXYXJ0b8WbxIcnLFxuICAgIHZhcmlhYmxlczogJ1ptaWVubmUnLFxuICAgIHllczogJ1RhaycsXG4gICAgem9vbWluOiAnUHJ6eWJsacW8JyxcbiAgICB6b29tb3V0OiAnT2RkYWwnXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX1BUX0JSID0ge1xuICAgIGFjY2Vzc29yczogJ0FjZXNzb3JlcycsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnRvcycsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ0JyYW5jaGVzJyxcbiAgICBicm93c2U6ICdOYXZlZ2FyJyxcbiAgICBjbGFzc2U6ICdDbGFzc2UnLFxuICAgIGNsYXNzZXM6ICdDbGFzc2VzJyxcbiAgICBjb21wb25lbnQ6ICdDb21wb25lbnRlJyxcbiAgICBjb21wb25lbnRzOiAnQ29tcG9uZW50ZXMnLFxuICAgIGNvbnN0cnVjdG9yOiAnQ29uc3RydXRvcicsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sYWRvcmVzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGFkb3InLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0NvYmVydHVyYSBkYSBkb2N1bWVudGHDp8OjbycsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVjbGFyYcOnw7VlcycsXG4gICAgZGVjb3JhdG9yczogJ0RlY29yYWRvcmVzJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICdWYWxvciBwYWRyw6NvJyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbmlkbyBlbScsXG4gICAgZGVwZW5kZW5jaWVzOiAnRGVwZW5kw6puY2lhcycsXG4gICAgZGVwcmVjYXRlZDogJ0Rlc2NvbnRpbnVhZGEnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3Jpw6fDo28nLFxuICAgIGRpcmVjdGl2ZTogJ0RpcmV0aXZhJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZXRpdmFzJyxcbiAgICAnZG9tIHRyZWUnOiAnQXJ2b3JlIERPTScsXG4gICAgZW50aXRpZXM6ICdFbnRpZGFkZXMnLFxuICAgIGVudGl0eTogJ0VudGlkYWRlJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcmHDp8O1ZXMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdFeGVtcGxvJyxcbiAgICBleGFtcGxlczogJ0V4ZW1wbG9zJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0cycsXG4gICAgZXh0ZW5kczogJ0V4dGVuZGUnLFxuICAgIGZpbGU6ICdBcnF1aXZvJyxcbiAgICBmdW5jdGlvbnM6ICdGdW7Dp8O1ZXMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhw6fDo28gZ2VyYWRhIHVzYW5kbycsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdDb21lw6dhbmRvJyxcbiAgICBndWFyZDogJ0d1YXJkYScsXG4gICAgZ3VhcmRzOiAnR3VhcmRhcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdzJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3REaXJlY3RpdmVzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdFbGVtZW50byBIVE1MJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0VsZW1lbnRvIEhUTUwgY29tIGRpcmV0aXZhJyxcbiAgICBpZGVudGlmaWVyOiAnSWRlbnRpZmljYWRvcicsXG4gICAgaW1wbGVtZW50czogJ0ltcGxlbWVudGEnLFxuICAgIGltcG9ydHM6ICdJbXBvcnRzJyxcbiAgICBpbmRleDogJ0luZGV4JyxcbiAgICBpbmRleGFibGU6ICdJbmRleMOhdmVsJyxcbiAgICBpbmZvOiAnSW5mb3JtYcOnw6NvJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSGVyZGFkbyBkZScsXG4gICAgaW5qZWN0YWJsZTogJ0luamV0w6F2ZWwnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZXTDoXZlaXMnLFxuICAgIGlucHV0czogJ0lucHV0cycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0b3JzJyxcbiAgICBpbnRlcmZhY2U6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmZhY2VzJyxcbiAgICBsZWdlbmQ6ICdMZWdlbmQnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbsOnYScsXG4gICAgbGluZXM6ICdMaW5oYXMnLFxuICAgIG1ldGFkYXRhOiAnTWV0YWRhdGEnLFxuICAgIG1ldGhvZHM6ICdNw6l0b2RvcycsXG4gICAgbWlzY2VsbGFuZW91czogJ01pc2NlbMOibmVhJyxcbiAgICBtb2R1bGU6ICdNw7NkdWxvJyxcbiAgICBtb2R1bGVzOiAnTcOzZHVsb3MnLFxuICAgIG5hbWU6ICdOb21lJyxcbiAgICBubzogJ07Do28nLFxuICAgICduby1ncmFwaCc6ICdTZW0gZ3LDoWZpY28gZGlzcG9uw612ZWwuJyxcbiAgICAnbm8taWZyYW1lJzogJ1NldSBicm93c2VyIG7Do28gdGVtIHN1cG9ydGUgYSBpZnJhbWVzLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdOZW5odW0gcmVzdWx0YWRvIGNvcnJlc3BvbmRlbnRlJyxcbiAgICAnbm8tc3ZnJzogJ1NldSBicm93c2VyIG7Do28gdGVtIHN1cG9ydGUgYSBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3BjaW9uYWwnLFxuICAgIG91dHB1dHM6ICdPdXRwdXRzJyxcbiAgICBvdmVydmlldzogJ1Zpc8OjbyBnZXJhbCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcsOibWV0cm9zJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnUGVlciBkZXBlbmRlbmNpZXMnLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGVzJyxcbiAgICBwcmVmaXg6ICdQcmVmaXhvJyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcHJpZWRhZGVzJyxcbiAgICBwcm92aWRlcnM6ICdQcm92aWRlcnMnLFxuICAgIHB1cmU6ICdQdXJvJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlcXVpcmVkOiAnT2JyaWdhdMOzcmlvJyxcbiAgICByZXNldDogJ1Jlc2V0YXInLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3Jlc3VsdGFkb3MgY29ycmVzcG9uZGVudGVzJyxcbiAgICByZXR1cm5zOiAnUmV0b3JuYScsXG4gICAgcm91dGU6ICdSb3RhJyxcbiAgICByb3V0ZXM6ICdSb3RhcycsXG4gICAgc2NoZW1hczogJ0VzcXVlbWFzJyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ0RpZ2l0ZSBwYXJhIHBlc3F1aXNhcicsXG4gICAgc2VsZWN0b3I6ICdTZWxldG9yJyxcbiAgICBzaWduYXR1cmU6ICdBc3NpbmF0dXJhJyxcbiAgICBzb3VyY2U6ICdGb250ZScsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICdTdGF0ZW1lbnRzJyxcbiAgICBzdHlsZXM6ICdFc3RpbG9zJyxcbiAgICB0ZW1wbGF0ZTogJ01vZGVsbycsXG4gICAgdHlwZTogJ1RpcG8nLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnQWxpYXNlcyBkZSB0aXBvJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1BhcsOibWV0cm9zIGRlIHRpcG8nLFxuICAgIHR5cGVzOiAnVGlwb3MnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnUHJvcHJpZWRhZGUgbsOjby1ub21lYWRhJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ0NvYmVydHVyYSBkZSB0ZXN0ZSB1bml0w6FyaW8nLFxuICAgIHZhbHVlOiAnVmFsb3InLFxuICAgIHZhcmlhYmxlczogJ1ZhcmnDoXZlaXMnLFxuICAgIHllczogJ1NpbScsXG4gICAgem9vbWluOiAnWm9vbSBpbicsXG4gICAgem9vbW91dDogJ1pvb20gb3V0J1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9SVV9SVSA9IHtcbiAgICBhY2Nlc3NvcnM6ICfQkNC60YHQtdGB0YHQvtGAJyxcbiAgICBhcmd1bWVudHM6ICfQkNGA0LPRg9C80LXQvdGC0YsnLFxuICAgIGJvb3RzdHJhcDogJ9CX0LDQs9GA0YPQt9GH0LjQuicsXG4gICAgYnJhbmNoZXM6ICfQktC10YLQutC4JyxcbiAgICBicm93c2U6ICfQntCx0LfQvtGAJyxcbiAgICBjbGFzc2U6ICfQmtC70LDRgdGBJyxcbiAgICBjbGFzc2VzOiAn0JrQu9Cw0YHRgdGLJyxcbiAgICBjb21wb25lbnQ6ICfQmtC+0LzQv9C+0L3QtdC90YInLFxuICAgIGNvbXBvbmVudHM6ICfQmtC+0LzQv9C+0L3QtdC90YLRiycsXG4gICAgY29uc3RydWN0b3I6ICfQmtC+0L3RgdGC0YDRg9C60YLQvtGAJyxcbiAgICBjb250cm9sbGVyczogJ9Ca0L7QvdGC0YDQvtC70LvQtdGA0YsnLFxuICAgIGNvbnRyb2xsZXI6ICfQmtC+0L3RgtGA0L7Qu9C70LXRgCcsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAn0J/QvtC60YDRi9GC0LjQtSDQtNC+0LrRg9C80LXQvdGC0LDRhtC40LXQuScsXG4gICAgZGVjbGFyYXRpb25zOiAn0JTQtdC60LvQsNGA0LDRhtC40LgnLFxuICAgIGRlY29yYXRvcnM6ICfQlNC10LrQvtGA0LDRgtC+0YDRiycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAn0JfQvdCw0YfQtdC90LjQtSDQv9C+INGD0LzQvtC70YfQsNC90LjRjicsXG4gICAgJ2RlZmluZWQtaW4nOiAn0J7Qv9GA0LXQtNC10LvQtdC9INCyJyxcbiAgICBkZXBlbmRlbmNpZXM6ICfQl9Cw0LLQuNGB0LjQvNC+0YHRgtC4JyxcbiAgICBkZXByZWNhdGVkOiAn0KPRgdGC0LDRgNC10LLRiNCw0Y8nLFxuICAgIGRlc2NyaXB0aW9uOiAn0J7Qv9C40YHQsNC90LjQtScsXG4gICAgZGlyZWN0aXZlOiAn0JTQuNGA0LXQutGC0LjQstCwJyxcbiAgICBkaXJlY3RpdmVzOiAn0JTQuNGA0LXQutGC0LjQstGLJyxcbiAgICAnZG9tIHRyZWUnOiAnRE9NLdC00LXRgNC10LLQvicsXG4gICAgZW50aXRpZXM6ICfQodGD0YnQvdC+0YHRgtC4JyxcbiAgICBlbnRpdHk6ICfQodGD0YnQvdC+0YHRgtGMJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICfQktGF0L7QtNC90YvQtSDQutC+0LzQv9C+0L3QtdC90YLRiycsXG4gICAgZW51bWVyYXRpb25zOiAn0J/QtdGA0LXRh9C40YHQu9C10L3QuNGPJyxcbiAgICBlbnVtczogJ9Cf0LXRgNC10YfQuNGB0LvQtdC90LjRjycsXG4gICAgZXhhbXBsZTogJ9Cf0YDQuNC80LXRgCcsXG4gICAgZXhhbXBsZXM6ICfQn9GA0LjQvNC10YDRiycsXG4gICAgZXhwb3J0czogJ9Ct0LrRgdC/0L7RgNGCJyxcbiAgICBleHRlbmRzOiAn0KDQsNGB0YjQuNGA0Y/QtdGCJyxcbiAgICBmaWxlOiAn0KTQsNC50LsnLFxuICAgIGZ1bmN0aW9uczogJ9Ck0YPQvdC60YbQuNC4JyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ9CU0L7QutGD0LzQtdC90YLQsNGG0LjRjyDRgdC+0LfQtNCw0L3QsCDRgSDQv9C+0LzQvtGJ0YzRjicsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICfQndCw0YfQsNC70L4g0YDQsNCx0L7RgtGLJyxcbiAgICBndWFyZDogJ9CX0LDRidC40YLQvdC40LonLFxuICAgIGd1YXJkczogJ9CX0LDRidC40YLQvdC40LrQuCcsXG4gICAgaG9zdGJpbmRpbmdzOiAn0J/RgNC40LLRj9C30LrQuCDRhdC+0YHRgtCwJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ9CU0LjRgNC10LrRgtC40LLRiyDRhdC+0YHRgtCwJyxcbiAgICBob3N0bGlzdGVuZXJzOiAn0KHQu9GD0YjQsNGC0LXQu9C4INGF0L7RgdGC0LAnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbC3RjdC70LXQvNC10L3RgicsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdIdG1sLdGN0LvQtdC80LXQvdGCINGBINC00LjRgNC10LrRgtC40LLQvtC5JyxcbiAgICBpZGVudGlmaWVyOiAn0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAnLFxuICAgIGltcGxlbWVudHM6ICfQoNC10LDQu9C40LfRg9C10YInLFxuICAgIGltcG9ydHM6ICfQmNC80L/QvtGA0YInLFxuICAgIGluZGV4OiAn0JjQvdC00LXQutGBJyxcbiAgICBpbmRleGFibGU6ICfQmNC90LTQtdC60YHQuNGA0YPQtdC80YvQuScsXG4gICAgaW5mbzogJ9CY0L3RhNC+0YDQvNCw0YbQuNGPJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAn0J3QsNGB0LvQtdC00YPQtdC80YvQuSDQuNC3JyxcbiAgICBpbmplY3RhYmxlOiAn0JLQvdC10LTRgNC10L3QuNC1JyxcbiAgICBpbmplY3RhYmxlczogJ9CS0L3QtdC00YDQtdC90LjRjycsXG4gICAgaW5wdXRzOiAn0JLRhdC+0LTQvdGL0LUg0LTQsNC90L3Ri9C1JyxcbiAgICBpbnRlcmNlcHRvcnM6ICfQn9C10YDQtdGF0LLQsNGC0YfQuNC60LgnLFxuICAgIGludGVyZmFjZTogJ9CY0L3RgtC10YDRhNC10LnRgScsXG4gICAgaW50ZXJmYWNlczogJ9CY0L3RgtC10YDRhNC10LnRgdGLJyxcbiAgICBsZWdlbmQ6ICfQm9C10LPQtdC90LTQsCcsXG4gICAgbGljZW5zZTogJ9Cb0LjRhtC10L3Qt9C40Y8nLFxuICAgIGxpbmVzOiAn0KHRgtGA0L7QutC4JyxcbiAgICBtZXRhZGF0YTogJ9Cc0LXRgtCw0LTQsNC90L3Ri9C1JyxcbiAgICBtZXRob2RzOiAn0JzQtdGC0L7QtNGLJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAn0KDQsNC30L3QvtC1JyxcbiAgICBtb2R1bGU6ICfQnNC+0LTRg9C70YwnLFxuICAgIG1vZHVsZXM6ICfQnNC+0LTRg9C70LgnLFxuICAgIG5hbWU6ICfQmNC80Y8nLFxuICAgIG5vOiAn0J3QtdGCJyxcbiAgICAnbm8tZ3JhcGgnOiAn0JTQuNCw0LPRgNCw0LzQvNCwINC90LXQtNC+0YHRgtGD0L/QvdCwLicsXG4gICAgJ25vLWlmcmFtZSc6ICfQkdGA0LDRg9C30LXRgCDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiBpZnJhbWVzLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICfQoNC10LfRg9C70YzRgtCw0YLRiyDQvdC1INC90LDQudC00LXQvdGLJyxcbiAgICAnbm8tc3ZnJzogJ9CR0YDQsNGD0LfQtdGAINC90LUg0L/QvtC00LTQtdGA0LbQuNCy0LDQtdGCIFNWRycsXG4gICAgb3B0aW9uYWw6ICfQntC/0YbQuNC+0L3QsNC70YzQvdGL0LknLFxuICAgIG91dHB1dHM6ICfQktGL0YXQvtC00L3Ri9C1INC00LDQvdC90YvQtScsXG4gICAgb3ZlcnZpZXc6ICfQntCx0LfQvtGAJyxcbiAgICBwYXJhbWV0ZXJzOiAn0J/QsNGA0LDQvNC10YLRgNGLJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAn0J7QtNC90L7RgNCw0L3Qs9C+0LLRi9C1INC30LDQstC40YHQuNC80L7RgdGC0LgnLFxuICAgIHBpcGU6ICfQmtC+0L3QstC10LnQtdGAJyxcbiAgICBwaXBlczogJ9Ca0L7QvdCy0LXQudC10YDRiycsXG4gICAgcHJlZml4OiAn0J/RgNC10YTQuNC60YEnLFxuICAgIHByb3BlcnRpZXM6ICfQodCy0L7QudGB0YLQstCwJyxcbiAgICBwcm92aWRlcnM6ICfQn9GA0L7QstCw0LnQtNC10YDRiycsXG4gICAgcHVyZTogJ9Cn0LjRgdGC0YvQuScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ9Ci0YDQtdCx0YPQtdC80YvQuScsXG4gICAgcmVzZXQ6ICfQodCx0YDQvtGBJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICfRgNC10LfRg9C70YzRgtCw0YLQvtCyINC90LDQudC00LXQvdC+JyxcbiAgICByZXR1cm5zOiAn0KLQuNC/INCy0L7Qt9Cy0YDQsNGJ0LDQtdC80L7Qs9C+INC30L3QsNGH0LXQvdC40Y8nLFxuICAgIHJvdXRlOiAn0JzQsNGA0YjRgNGD0YInLFxuICAgIHJvdXRlczogJ9Cc0LDRgNGI0YDRg9GC0YsnLFxuICAgIHNjaGVtYXM6ICfQodGF0LXQvNGLJyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ9CS0LLQtdC00LjRgtC1INC00LvRjyDQv9C+0LjRgdC60LAnLFxuICAgIHNlbGVjdG9yOiAn0KHQtdC70LXQutGC0L7RgCcsXG4gICAgc2lnbmF0dXJlOiAn0KHQuNCz0L3QsNGC0YPRgNCwJyxcbiAgICBzb3VyY2U6ICfQmNGB0YLQvtGH0L3QuNC6JyxcbiAgICBzdGFuZGFsb25lOiAn0JDQstGC0L7QvdC+0LzQvdGL0LknLFxuICAgIHN0YXRlbWVudHM6ICfQo9GC0LLQtdGA0LbQtNC10L3QuNGPJyxcbiAgICBzdHlsZXM6ICfQodGC0LjQu9C4JyxcbiAgICB0ZW1wbGF0ZTogJ9Co0LDQsdC70L7QvScsXG4gICAgdHlwZTogJ9Ci0LjQvycsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICfQn9GB0LXQstC00L7QvdC40LzRiyDRgtC40L/QvtCyJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ9Ci0LjQv9GLINC/0LDRgNCw0LzQtdGC0YDQvtCyJyxcbiAgICB0eXBlczogJ9Ci0LjQv9GLJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ9CR0LXQt9GL0LzRj9C90L3QvtC1INGB0LLQvtC50YHRgtCy0L4nLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAn0J/QvtC60YDRi9GC0LjQtSDQvNC+0LTRg9C70YzQvdGL0LzQuCDRgtC10YHRgtCw0LzQuCcsXG4gICAgdmFsdWU6ICfQl9C90LDRh9C10L3QuNC1JyxcbiAgICB2YXJpYWJsZXM6ICfQn9C10YDQtdC80LXQvdC90YvQtScsXG4gICAgeWVzOiAn0JTQsCcsXG4gICAgem9vbWluOiAn0J/RgNC40LHQu9C40LfQuNGC0YwnLFxuICAgIHpvb21vdXQ6ICfQntGC0LTQsNC70LjRgtGMJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9TS19TSyA9IHtcbiAgICBhY2Nlc3NvcnM6ICdNb2RpZmlrw6F0b3J5IHByw61zdHVwdScsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnR5JyxcbiAgICBib290c3RyYXA6ICdCb290c3RyYXAnLFxuICAgIGJyYW5jaGVzOiAnVmV0dnknLFxuICAgIGJyb3dzZTogJ1ByZXplcmHFpScsXG4gICAgY2xhc3NlOiAnVHJpZWRhJyxcbiAgICBjbGFzc2VzOiAnVHJpZWR5JyxcbiAgICBjb21wb25lbnQ6ICdLb21wb25lbnQnLFxuICAgIGNvbXBvbmVudHM6ICdLb21wb25lbnR5JyxcbiAgICBjb25zdHJ1Y3RvcjogJ0tvbsWhdHJ1a3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sbGVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ1Bva3J5dGllIGRva3VtZW50w6FjaW91JyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEZWtsYXLDoWNpZScsXG4gICAgZGVjb3JhdG9yczogJ0Rla29yw6F0b3J5JyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICdQcmVkdm9sZW7DoSBob2Rub3RhJyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbm92YW7DqSB2JyxcbiAgICBkZXBlbmRlbmNpZXM6ICdaw6F2aXNsb3N0aScsXG4gICAgZGVwcmVjYXRlZDogJ1phc3RhcmVsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BvcGlzJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJla3TDrXZhJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWt0w612eScsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSBzdHJvbScsXG4gICAgZW50aXRpZXM6ICdTdWJqZWt0b3YnLFxuICAgIGVudGl0eTogJ1N1Ympla3QnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0VudHJ5Q29tcG9uZW50cycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyw6F0b3J5JyxcbiAgICBlbnVtczogJ0VudW1lcsOhdG9yeScsXG4gICAgZXhhbXBsZTogJ1Byw61rbGFkJyxcbiAgICBleGFtcGxlczogJ1Byw61rbGFkeScsXG4gICAgZXhwb3J0czogJ0V4cG9ydHknLFxuICAgIGV4dGVuZHM6ICdSb3rFoWlydWplJyxcbiAgICBmaWxlOiAnU8O6Ym9yJyxcbiAgICBmdW5jdGlvbnM6ICdGdW5rY2llJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0Rva3VtZW50w6FjaWEgdnl0dm9yZW7DoSBwb21vY291JyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ1phxI3DrW5hbWUnLFxuICAgIGd1YXJkOiAnR3VhcmQnLFxuICAgIGd1YXJkczogJ0d1YXJkcycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdzJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3REaXJlY3RpdmVzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAnSG9zdExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIVE1MIGVsZW1lbnQnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnSFRNTCBlbGVtZW50IHMgZGlyZWt0w612b3UnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWvDoXRvcicsXG4gICAgaW1wbGVtZW50czogJ0ltcGxlbWVudHVqZScsXG4gICAgaW1wb3J0czogJ0ltcG9ydHVqZScsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhvdmF0ZcS+bsO9JyxcbiAgICBpbmZvOiAnSW5mb3Jtw6FjaWUnLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdaZGVkZW7DqSBvZCcsXG4gICAgaW5qZWN0YWJsZTogJ0luamVjdGFibGUnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZWN0YWJsZXMnLFxuICAgIGlucHV0czogJ1ZzdHVweScsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0b3JzJyxcbiAgICBpbnRlcmZhY2U6ICdSb3pocmFuaWUnLFxuICAgIGludGVyZmFjZXM6ICdSb3pocmFuaWEnLFxuICAgIGxlZ2VuZDogJ0xlZ2VuZGEnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbmNpYScsXG4gICAgbGluZXM6ICdSaWFka3knLFxuICAgIG1ldGFkYXRhOiAnTWV0YWTDoXRhJyxcbiAgICBtZXRob2RzOiAnTWV0w7NkeScsXG4gICAgbWlzY2VsbGFuZW91czogJ1LDtHpuZScsXG4gICAgbW9kdWxlOiAnTW9kdWwnLFxuICAgIG1vZHVsZXM6ICdNb2R1bHknLFxuICAgIG5hbWU6ICdOw6F6b3YnLFxuICAgIG5vOiAnTmllJyxcbiAgICAnbm8tZ3JhcGgnOiAnTmllIGplIGsgZGlzcG96w61jaWkgxb5pYWRueSBncmFmLicsXG4gICAgJ25vLWlmcmFtZSc6ICdWw6HFoSBwcmVobGlhZGHEjSBuZXBvZHBvcnVqZSBpZnJhbWUnLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnTmVuw6FqZGVuw6kgxb5pYWRuZSB2w71zbGVka3kgcHJlJyxcbiAgICAnbm8tc3ZnJzogJ1bDocWhIHByZWhsaWFkYcSNIG5lcG9kcG9ydWplIFNWRycsXG4gICAgb3B0aW9uYWw6ICdWb2xpdGXEvm7DvScsXG4gICAgb3V0cHV0czogJ1bDvXN0dXB5JyxcbiAgICBvdmVydmlldzogJ1ByZWjEvmFkJyxcbiAgICBwYXJhbWV0ZXJzOiAnUGFyYW1ldHJlJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnUGVlciBkZXBlbmRlbmNpZXMnLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGVzJyxcbiAgICBwcmVmaXg6ICdQcmVmaXgnLFxuICAgIHByb3BlcnRpZXM6ICdWbGFzdG5vc3RpJyxcbiAgICBwcm92aWRlcnM6ICdQcm92aWRlcnMnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlcXVpcmVkOiAnUG/FvmFkb3ZhbsO9JyxcbiAgICByZXNldDogJ1Jlc2V0b3ZhxaUnLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3bDvXNsZWRrb3YgcHJlJyxcbiAgICByZXR1cm5zOiAnTsOhdnJhdG92w6EgaG9kbm90YScsXG4gICAgcm91dGU6ICdSb3V0ZScsXG4gICAgcm91dGVzOiAnUm91dGVzJyxcbiAgICBzY2hlbWFzOiAnU2Now6lteScsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdaYWRhanRlIGjEvmFkYW7DvSB0ZXh0JyxcbiAgICBzZWxlY3RvcjogJ1NlbGVrdG9yJyxcbiAgICBzaWduYXR1cmU6ICdQb2RwaXMnLFxuICAgIHNvdXJjZTogJ1pkcm9qJyxcbiAgICBzdGFuZGFsb25lOiAnU3RhbmRhbG9uZScsXG4gICAgc3RhdGVtZW50czogJ1N0YXRlbWVudHMnLFxuICAgIHN0eWxlczogJ8WgdMO9bHknLFxuICAgIHRlbXBsYXRlOiAnxaBhYmzDs25hJyxcbiAgICB0eXBlOiAnVHlwJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ1R5cGUgYWxpYXNlcycsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdUeXBlIHBhcmFtZXRlcnMnLFxuICAgIHR5cGVzOiAnVHlweScsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdOZXBvbWVub3ZhbsO9IGF0cmliw7p0JyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ1Bva3J5dGllIHVuaXQgdGVzdGFtaScsXG4gICAgdmFsdWU6ICdIb2Rub3RhJyxcbiAgICB2YXJpYWJsZXM6ICdQcmVtZW5uw6knLFxuICAgIHllczogJ8OBbm8nLFxuICAgIHpvb21pbjogJ1ByaWJsw63FvmnFpScsXG4gICAgem9vbW91dDogJ09kZGlhbGnFpSdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fWkhfQ04gPSB7XG4gICAgYWNjZXNzb3JzOiAn5a2Y5Y+W5ZmoJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudHMnLFxuICAgIGJvb3RzdHJhcDogJ+aguee7hOS7ticsXG4gICAgYnJhbmNoZXM6ICfliIbmlK8nLFxuICAgIGJyb3dzZTogJ+afpeeciycsXG4gICAgY2xhc3NlOiAn57G7JyxcbiAgICBjbGFzc2VzOiAn57G75YiX6KGoJyxcbiAgICBjb21wb25lbnQ6ICfnu4Tku7YnLFxuICAgIGNvbXBvbmVudHM6ICfnu4Tku7bliJfooagnLFxuICAgIGNvbnN0cnVjdG9yOiAn5p6E6YCg5pa55rOVJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyb2xsZXJzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGxlcicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAn5paH5qGj5qaC6KeIJyxcbiAgICBkZWNsYXJhdGlvbnM6ICflj6/lo7DmmI7lr7nosaHliJfooagnLFxuICAgIGRlY29yYXRvcnM6ICfoo4XppbDlmajliJfooagnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ+e8uuecgeWAvCcsXG4gICAgJ2RlZmluZWQtaW4nOiAn6KKr5a6a5LmJ5ZyoJyxcbiAgICBkZXBlbmRlbmNpZXM6ICfkvp3otZbpobknLFxuICAgIGRlcHJlY2F0ZWQ6ICflt7LlvIPnlKgnLFxuICAgIGRlc2NyaXB0aW9uOiAn5o+P6L+wJyxcbiAgICBkaXJlY3RpdmU6ICfmjIfku6QnLFxuICAgIGRpcmVjdGl2ZXM6ICfmjIfku6TliJfooagnLFxuICAgICdkb20gdHJlZSc6ICdET00g5qCRJyxcbiAgICBlbnRpdGllczogJ+WunuS9kycsXG4gICAgZW50aXR5OiAn5a6e5L2TJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICflhaXlj6Pnu4Tku7bliJfooagnLFxuICAgIGVudW1lcmF0aW9uczogJ+WIl+S4vicsXG4gICAgZW51bXM6ICfmnprkuL7liJfooagnLFxuICAgIGV4YW1wbGU6ICfkvovlrZAnLFxuICAgIGV4YW1wbGVzOiAn5L6L5a2QJyxcbiAgICBleHBvcnRzOiAn5a+85Ye6JyxcbiAgICBleHRlbmRzOiAn57un5om/JyxcbiAgICBmaWxlOiAn5paH5Lu2JyxcbiAgICBmdW5jdGlvbnM6ICflh73mlbAnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAn5paH5qGj55Sf5oiQ5L2/55SoJyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ+WFpemXqOaMh+WNlycsXG4gICAgZ3VhcmQ6ICfot6/nlLHlrojljasnLFxuICAgIGd1YXJkczogJ+i3r+eUseWuiOWNq+WIl+ihqCcsXG4gICAgaG9zdGJpbmRpbmdzOiAn5a6/5Li757uR5a6aJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3QgRGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ+Wuv+S4u+ebkeWQrCcsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIdG1sIOWFg+e0oCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICfluKbmjIfku6TnmoRIdG1s5YWD57SgJyxcbiAgICBpZGVudGlmaWVyOiAn5qCH6K+G56ymJyxcbiAgICBpbXBsZW1lbnRzOiAn5a6e546wJyxcbiAgICBpbXBvcnRzOiAn5byV5YWlJyxcbiAgICBpbmRleDogJ+e0ouW8lScsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICBpbmZvOiAn5L+h5oGvJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAn57un5om/6IeqJyxcbiAgICBpbmplY3RhYmxlOiAn5Y+v5rOo5YWl55qEJyxcbiAgICBpbmplY3RhYmxlczogJ+WPr+azqOWFpeeahCcsXG4gICAgaW5wdXRzOiAn6L6T5YWl5bGe5oCnJyxcbiAgICBpbnRlcmNlcHRvcnM6ICfmi6bmiKrlmagnLFxuICAgIGludGVyZmFjZTogJ+aOpeWPoycsXG4gICAgaW50ZXJmYWNlczogJ+aOpeWPoycsXG4gICAgbGVnZW5kOiAn5Zu+5L6LJyxcbiAgICBsaWNlbnNlOiAn6K645Y+v5Y2P6K6uJyxcbiAgICBsaW5lczogJ0xpbmVzJyxcbiAgICBtZXRhZGF0YTogJ+WFg+aVsOaNricsXG4gICAgbWV0aG9kczogJ+aWueazlScsXG4gICAgbWlzY2VsbGFuZW91czogJ+WFtuS7licsXG4gICAgbW9kdWxlOiAn5qih5Z2XJyxcbiAgICBtb2R1bGVzOiAn5qih5Z2X5YiX6KGoJyxcbiAgICBuYW1lOiAn5ZCN56ewJyxcbiAgICBubzogJ+WQpicsXG4gICAgJ25vLWdyYXBoJzogJ+aXoOaVsOaNruaYvuekuicsXG4gICAgJ25vLWlmcmFtZSc6ICfkvaDnmoTmtY/op4jlmajkuI3mlK/mjIFpZnJhbWVzJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ+aXoOWMuemFjeeahOe7k+aenCcsXG4gICAgJ25vLXN2Zyc6ICfkvaDnmoTmtY/op4jlmajkuI3mlK/mjIFTVkcnLFxuICAgIG9wdGlvbmFsOiAn5Y+v6YCJ55qEJyxcbiAgICBvdXRwdXRzOiAn6L6T5Ye65bGe5oCnJyxcbiAgICBvdmVydmlldzogJ+amgui/sCcsXG4gICAgcGFyYW1ldGVyczogJ+WPguaVsOWIl+ihqCcsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ+WQjOe6p+S+nei1licsXG4gICAgcGlwZTogJ+euoemBkycsXG4gICAgcGlwZXM6ICfnrqHpgZPliJfooagnLFxuICAgIHByZWZpeDogJ+Wtl+mmlicsXG4gICAgcHJvcGVydGllczogJ+WxnuaAp+WIl+ihqCcsXG4gICAgcHJvdmlkZXJzOiAn5o+Q5L6b5ZWG5YiX6KGoJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAn5omL5YaMJyxcbiAgICByZXF1aXJlZDogJ+W/hemcgOeahCcsXG4gICAgcmVzZXQ6ICfph43nva4nLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ+WMuemFjeeahOe7k+aenCcsXG4gICAgcmV0dXJuczogJ+i/lOWbnicsXG4gICAgcm91dGU6ICfot6/nlLEnLFxuICAgIHJvdXRlczogJ+i3r+eUseWIl+ihqCcsXG4gICAgc2NoZW1hczogJ+aooeW8jycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICfor7fovpPlhaXmn6Xor6LlhbPplK7lrZcnLFxuICAgIHNlbGVjdG9yOiAn6YCJ5oup5ZmoJyxcbiAgICBzaWduYXR1cmU6ICfnrb7lkI0nLFxuICAgIHNvdXJjZTogJ+adpea6kCcsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICfms6jph4onLFxuICAgIHN0eWxlczogJ+agt+W8jycsXG4gICAgdGVtcGxhdGU6ICfmqKHmnb8nLFxuICAgIHR5cGU6ICfnsbvlnosnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAn57G75Z6L5Yir5ZCNJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ+exu+Wei+WPguaVsCcsXG4gICAgdHlwZXM6ICfnsbvlnosnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAn5pyq5ZG95ZCN5bGe5oCnJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ+WNleWFg+a1i+ivleamguiniCcsXG4gICAgdmFsdWU6ICflgLwnLFxuICAgIHZhcmlhYmxlczogJ+WPmOmHjycsXG4gICAgeWVzOiAn5pivJyxcbiAgICB6b29taW46ICfmlL7lpKcnLFxuICAgIHpvb21vdXQ6ICfnvKnlsI8nXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX1pIX1RXID0ge1xuICAgIGFjY2Vzc29yczogJ+WtmOWPluWZqCcsXG4gICAgYXJndW1lbnRzOiAn5Y+D5pW4JyxcbiAgICBib290c3RyYXA6ICfmoLnlhYPku7YnLFxuICAgIGJyYW5jaGVzOiAn5YiG5pSvJyxcbiAgICBicm93c2U6ICfngI/opr0nLFxuICAgIGNsYXNzZTogJ+mhnuWIpScsXG4gICAgY2xhc3NlczogJ+mhnuWIpScsXG4gICAgY29tcG9uZW50OiAn5YWD5Lu2JyxcbiAgICBjb21wb25lbnRzOiAn5YWD5Lu25YiX6KGoJyxcbiAgICBjb25zdHJ1Y3RvcjogJ+W7uuani+W8j+aWueazlScsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sbGVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ+imhuiTi+eOh+mggemdouaomemhjCcsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVjbGFyYXRpb25zJyxcbiAgICBkZWNvcmF0b3JzOiAn6KOd6aO+5Zmo5YiX6KGoJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICfpoJDoqK3lgLwnLFxuICAgICdkZWZpbmVkLWluJzogJ+iiq+Wumue+qeWcqCcsXG4gICAgZGVwZW5kZW5jaWVzOiAn5L6d6LO06aCFJyxcbiAgICBkZXByZWNhdGVkOiAn5bey5qOE55SoJyxcbiAgICBkZXNjcmlwdGlvbjogJ+aPj+i/sCcsXG4gICAgZGlyZWN0aXZlOiAn5oyH5LukIChEaXJlY3RpdmUpJyxcbiAgICBkaXJlY3RpdmVzOiAn5oyH5LukIChEaXJlY3RpdmVzKScsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSDmqLknLFxuICAgIGVudGl0aWVzOiAn5a+m6auUJyxcbiAgICBlbnRpdHk6ICflr6bpq5QnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0VudHJ5Y29tcG9uZW50cycsXG4gICAgZW51bWVyYXRpb25zOiAn5YiX6IiJJyxcbiAgICBlbnVtczogJ+aemuiIieWIl+ihqCcsXG4gICAgZXhhbXBsZTogJ+evhOS+iycsXG4gICAgZXhhbXBsZXM6ICfnr4TkvosnLFxuICAgIGV4cG9ydHM6ICfljK/lh7onLFxuICAgIGV4dGVuZHM6ICfnubzmib8nLFxuICAgIGZpbGU6ICfmqpTmoYgnLFxuICAgIGZ1bmN0aW9uczogJ+WHveaVuCcsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICfnlKLnlJ/mlofku7bkvb/nlKgnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAn5b+r6YCf5LiK5omLJyxcbiAgICBndWFyZDogJ+i3r+eUseWuiOihmycsXG4gICAgZ3VhcmRzOiAn6Lev55Sx5a6I6KGb5YiX6KGoJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0IEJpbmRpbmdzJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3QgRGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3QgTGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0hUTUwg5YWD57SgJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ+W4tuaMh+S7pOeahCBIVE1MIOWFg+e0oCcsXG4gICAgaWRlbnRpZmllcjogJ+itmOWIpeespuiZnycsXG4gICAgaW1wbGVtZW50czogJ+WvpuS9nCcsXG4gICAgaW1wb3J0czogJ+WMr+WFpScsXG4gICAgaW5kZXg6ICfntKLlvJUnLFxuICAgIGluZGV4YWJsZTogJ0luZGV4YWJsZScsXG4gICAgaW5mbzogJ+izh+ioiicsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ+e5vOaJv+iHqicsXG4gICAgaW5qZWN0YWJsZTogJ0luamVjdGFibGUnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZWN0YWJsZXMnLFxuICAgIGlucHV0czogJ+i8uOWFpeWxrOaApycsXG4gICAgaW50ZXJjZXB0b3JzOiAn5pSU5oiq5ZmoJyxcbiAgICBpbnRlcmZhY2U6ICfku4vpnaInLFxuICAgIGludGVyZmFjZXM6ICfku4vpnaInLFxuICAgIGxlZ2VuZDogJ+WcluS+iycsXG4gICAgbGljZW5zZTogJ+aOiOasiuWNlOitsCcsXG4gICAgbGluZXM6ICdMaW5lcycsXG4gICAgbWV0YWRhdGE6ICflhYPmlbjmk5onLFxuICAgIG1ldGhvZHM6ICfmlrnms5UnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICflhbbku5YnLFxuICAgIG1vZHVsZTogJ+aooee1hCcsXG4gICAgbW9kdWxlczogJ+aooee1hOWIl+ihqCcsXG4gICAgbmFtZTogJ+WQjeeosScsXG4gICAgbm86ICflkKYnLFxuICAgICduby1ncmFwaCc6ICfnhKHmlbjmk5rpoa/npLonLFxuICAgICduby1pZnJhbWUnOiAn5L2g55qE54CP6Ka95Zmo5LiN5pSv5o+0IGlmcmFtZXMnLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAn54Sh5Yy56YWN55qE57WQ5p6cJyxcbiAgICAnbm8tc3ZnJzogJ+S9oOeahOeAj+imveWZqOS4jeaUr+aPtCBTVkcnLFxuICAgIG9wdGlvbmFsOiAn5Y+v6YG455qEJyxcbiAgICBvdXRwdXRzOiAn6Ly45Ye65bGs5oCnJyxcbiAgICBvdmVydmlldzogJ+amgui/sCcsXG4gICAgcGFyYW1ldGVyczogJ+WPg+aVuOWIl+ihqCcsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgRGVwZW5kZW5jaWVzJyxcbiAgICBwaXBlOiAn566h6YGTJyxcbiAgICBwaXBlczogJ+euoemBk+WIl+ihqCcsXG4gICAgcHJlZml4OiAn5YmN572u6KmeJyxcbiAgICBwcm9wZXJ0aWVzOiAn5bGs5oCn5YiX6KGoJyxcbiAgICBwcm92aWRlcnM6ICfmj5DkvpvogIXliJfooagnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlcXVpcmVkOiAn5b+F6ZyA55qEJyxcbiAgICByZXNldDogJ+mHjeiorScsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAn5Yy56YWN55qE57WQ5p6cJyxcbiAgICByZXR1cm5zOiAn5Zue5YKz5YC8JyxcbiAgICByb3V0ZTogJ+i3r+eUsScsXG4gICAgcm91dGVzOiAn6Lev55Sx5YiX6KGoJyxcbiAgICBzY2hlbWFzOiAnU2NoZW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICfoq4vovLjlhaXmn6XoqaLpl5zpjbXlrZcnLFxuICAgIHNlbGVjdG9yOiAn6YG45pOH5ZmoJyxcbiAgICBzaWduYXR1cmU6ICfnsL3lkI0nLFxuICAgIHNvdXJjZTogJ+S+hua6kCcsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICfpmbPov7DlvI8nLFxuICAgIHN0eWxlczogJ+aoo+W8jycsXG4gICAgdGVtcGxhdGU6ICfnr4TmnKwnLFxuICAgIHR5cGU6ICflnovliKUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAn5Z6L5Yil5Yil5ZCNJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ+Wei+WIpeWPg+aVuCcsXG4gICAgdHlwZXM6ICflnovliKUnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAn5pyq5ZG95ZCN5bGs5oCnJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ+WWruWFg+a4rOippuimhuiTi+eOhycsXG4gICAgdmFsdWU6ICflgLwnLFxuICAgIHZhcmlhYmxlczogJ+iuiuaVuCcsXG4gICAgeWVzOiAn5pivJyxcbiAgICB6b29taW46ICfmlL7lpKcnLFxuICAgIHpvb21vdXQ6ICfnuK7lsI8nXG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2kxOG5leHQvaTE4bmV4dC9ibG9iL21hc3Rlci9DSEFOR0VMT0cubWQjMTcwMFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2kxOG5leHQvaTE4bmV4dC9jb21taXQvNTdkYTEwODg4NzYwOTMyZjlkZjRkZjkzZmE3OWY5YTZlNDU5ZTZlZFxuY29uc3QgaTE4bmV4dCA9IHJlcXVpcmUoJ2kxOG5leHQnKTtcblxuaW1wb3J0IHtcbiAgICBUUkFOU0xBVElPTl9CR19CRyxcbiAgICBUUkFOU0xBVElPTl9ERV9ERSxcbiAgICBUUkFOU0xBVElPTl9FTl9VUyxcbiAgICBUUkFOU0xBVElPTl9FU19FUyxcbiAgICBUUkFOU0xBVElPTl9GUl9GUixcbiAgICBUUkFOU0xBVElPTl9IVV9IVSxcbiAgICBUUkFOU0xBVElPTl9JVF9JVCxcbiAgICBUUkFOU0xBVElPTl9KQV9KUCxcbiAgICBUUkFOU0xBVElPTl9LT19LUixcbiAgICBUUkFOU0xBVElPTl9OTF9OTCxcbiAgICBUUkFOU0xBVElPTl9QTF9QTCxcbiAgICBUUkFOU0xBVElPTl9QVF9CUixcbiAgICBUUkFOU0xBVElPTl9SVV9SVSxcbiAgICBUUkFOU0xBVElPTl9TS19TSyxcbiAgICBUUkFOU0xBVElPTl9aSF9DTixcbiAgICBUUkFOU0xBVElPTl9aSF9UVyxcbiAgICBUUkFOU0xBVElPTl9LQV9HRVxufSBmcm9tICcuLi8uLi9sb2NhbGVzJztcblxuY2xhc3MgSTE4bkVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEkxOG5FbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFJMThuRW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBJMThuRW5naW5lLmluc3RhbmNlID0gbmV3IEkxOG5FbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSTE4bkVuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF2YWlsYWJsZXNMYW5ndWFnZXMgPSB7XG4gICAgICAgICdiZy1CRyc6ICdiZy1CRycsXG4gICAgICAgICdkZS1ERSc6ICdkZS1ERScsXG4gICAgICAgICdlbi1VUyc6ICdlbi1VUycsXG4gICAgICAgICdlcy1FUyc6ICdlcy1FUycsXG4gICAgICAgICdmci1GUic6ICdmci1GUicsXG4gICAgICAgICdodS1IVSc6ICdodS1IVScsXG4gICAgICAgICdpdC1JVCc6ICdpdC1JVCcsXG4gICAgICAgICdqYS1KUCc6ICdqYS1KUCcsXG4gICAgICAgICdrYS1HRSc6ICdrYS1HRScsXG4gICAgICAgICdrby1LUic6ICdrby1LUicsXG4gICAgICAgICdubC1OTCc6ICdubC1OTCcsXG4gICAgICAgICdwbC1QTCc6ICdwbC1QTCcsXG4gICAgICAgICdwdC1CUic6ICdwdC1CUicsXG4gICAgICAgICdydS1SVSc6ICdydS1SVScsXG4gICAgICAgICdzay1TSyc6ICdzay1TSycsXG4gICAgICAgICd6aC1DTic6ICd6aC1DTicsXG4gICAgICAgICd6aC1UVyc6ICd6aC1UVydcbiAgICB9O1xuXG4gICAgcHVibGljIGZhbGxiYWNrTGFuZ3VhZ2UgPSAnZW4tVVMnO1xuXG4gICAgcHVibGljIGluaXQobGFuZ3VhZ2U6IHN0cmluZykge1xuICAgICAgICBpMThuZXh0LmluaXQoe1xuICAgICAgICAgICAgbG5nOiBsYW5ndWFnZSxcbiAgICAgICAgICAgIGZhbGxiYWNrTG5nOiB0aGlzLmZhbGxiYWNrTGFuZ3VhZ2UsXG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2tpcE9uVmFyaWFibGVzOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2JnLUJHJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fQkdfQkcpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnZGUtREUnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9ERV9ERSk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdlbi1VUycsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX0VOX1VTKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2VzLUVTJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fRVNfRVMpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnZnItRlInLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9GUl9GUik7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdodS1IVScsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX0hVX0hVKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2l0LUlUJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fSVRfSVQpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnamEtSlAnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9KQV9KUCk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdrYS1HRScsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX0tBX0dFKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2tvLUtSJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fS09fS1IpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnbmwtTkwnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9OTF9OTCk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdwbC1QTCcsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX1BMX1BMKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ3B0LUJSJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fUFRfQlIpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygncnUtUlUnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9SVV9SVSk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdzay1TSycsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX1NLX1NLKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ3poLUNOJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fWkhfQ04pO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnemgtVFcnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9aSF9UVyk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zbGF0ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpMThuZXh0LnQoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhpc3RzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpMThuZXh0LmV4aXN0cyhrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuYXZhaWxhYmxlc0xhbmd1YWdlc1tsYW5ndWFnZV0gIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSTE4bkVuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcblxuaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmltcG9ydCBJMThuRW5naW5lIGZyb20gJy4uL2kxOG4uZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIEkxOG5IZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBpMThuX2tleTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChJMThuRW5naW5lLmV4aXN0cyhpMThuX2tleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBJMThuRW5naW5lLnRyYW5zbGF0ZShpMThuX2tleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpMThuX2tleTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSWZTdHJpbmdIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBhOiBhbnksIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5kZXhhYmxlU2lnbmF0dXJlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgbWV0aG9kKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBtZXRob2QuYXJncy5tYXAoYXJnID0+IGAke2FyZy5uYW1lfTogJHthcmcudHlwZX1gKS5qb2luKCcsICcpO1xuICAgICAgICBpZiAobWV0aG9kLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttZXRob2QubmFtZX1bJHthcmdzfV1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHthcmdzfV1gO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBJc0luaXRpYWxUYWJIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0YWJzOiBBcnJheTxhbnk+LCB0YWJJZDogU3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRhYnNbMF0uaWQgPT09IHRhYklkID8gb3B0aW9ucy5mbihjb250ZXh0KSA6IG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIElzTm90VG9nZ2xlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdHlwZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS50b2dnbGVNZW51SXRlbXMuaW5kZXhPZih0eXBlKTtcblxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS50b2dnbGVNZW51SXRlbXMuaW5kZXhPZignYWxsJykgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgY2xhc3MgSXNUYWJFbmFibGVkSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGFiczogQXJyYXk8YW55PiwgdGFiSWQ6IFN0cmluZywgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGxldCBpc1RhYkVuYWJsZWQgPSAtMSAhPT0gXy5maW5kSW5kZXgodGFicywgeyBpZDogdGFiSWQgfSk7XG4gICAgICAgIHJldHVybiBpc1RhYkVuYWJsZWQgPyBvcHRpb25zLmZuKGNvbnRleHQpIDogb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuXG5pbnRlcmZhY2UgQ29kZUJsb2NrIHtcbiAgICBsYW5ndWFnZTogc3RyaW5nO1xuICAgIGNvZGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEpzZG9jQ29kZUV4YW1wbGVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHJpdmF0ZSBjbGVhblRhZyhjb21tZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoY29tbWVudC5jaGFyQXQoMCkgPT09ICcqJykge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDEsIGNvbW1lbnQubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWVudC5jaGFyQXQoMCkgPT09ICcgJykge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDEsIGNvbW1lbnQubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWVudC5pbmRleE9mKCc8cD4nKSA9PT0gMCkge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDMsIGNvbW1lbnQubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWVudC5zdWJzdHIoLTEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDAsIGNvbW1lbnQubGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQuc3Vic3RyKC00KSA9PT0gJzwvcD4nKSB7XG4gICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5zdWJzdHJpbmcoMCwgY29tbWVudC5sZW5ndGggLSA0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEh0bWxFbnRpdGllcyhzdHIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHN0cilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VDb2RlRmVuY2VzKGNvbW1lbnQ6IHN0cmluZyk6IENvZGVCbG9ja1tdIHtcbiAgICAgICAgY29uc3QgY29kZUZlbmNlUmVnZXggPSAvYGBgKFxcdyspP1xccypcXG4oW1xcc1xcU10qPylgYGAvZztcbiAgICAgICAgY29uc3QgYmxvY2tzOiBDb2RlQmxvY2tbXSA9IFtdO1xuICAgICAgICBsZXQgbWF0Y2g7XG4gICAgICAgIGxldCBoYXNDb2RlRmVuY2VzID0gZmFsc2U7XG5cbiAgICAgICAgLy8gRmluZCBhbGwgY29kZSBmZW5jZXNcbiAgICAgICAgd2hpbGUgKChtYXRjaCA9IGNvZGVGZW5jZVJlZ2V4LmV4ZWMoY29tbWVudCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoYXNDb2RlRmVuY2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBsYW5ndWFnZSA9IChtYXRjaFsxXSB8fCAnaHRtbCcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobGFuZ3VhZ2UgPT09ICdqcycpIGxhbmd1YWdlID0gJ2phdmFzY3JpcHQnO1xuICAgICAgICAgICAgaWYgKGxhbmd1YWdlID09PSAndHMnKSBsYW5ndWFnZSA9ICd0eXBlc2NyaXB0JztcbiAgICAgICAgICAgIGxldCBjb2RlID0gbWF0Y2hbMl07XG4gICAgICAgICAgICAvLyBDb252ZXJ0IHBsYWNlaG9sZGVyIGJhY2sgdG8gZW1wdHkgbGluZXMgZmlyc3RcbiAgICAgICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoL19fX0NPTVBPRE9DX0VNUFRZX0xJTkVfX18vZywgJ1xcbicpO1xuICAgICAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBidXQgcHJlc2VydmUgaW50ZXJuYWwgZW1wdHkgbGluZXNcbiAgICAgICAgICAgIGNvZGUgPSBjb2RlLnRyaW0oKTtcbiAgICAgICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoL2BgYFtcXHNcXFNdKj9gYGAvZywgJycpO1xuICAgICAgICAgICAgaWYgKGNvZGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBibG9ja3MucHVzaCh7XG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLFxuICAgICAgICAgICAgICAgIGNvZGU6IGNvZGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNDb2RlRmVuY2VzKSB7XG4gICAgICAgICAgICBjb25zdCB0cmltbWVkQ29tbWVudCA9IGNvbW1lbnQudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRyaW1tZWRDb21tZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBibG9ja3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHRyaW1tZWRDb21tZW50XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmxvY2tzO1xuICAgIH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwganNkb2NUYWdzOiBKc2RvY1RhZ0ludGVyZmFjZVtdLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBjb25zdCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBjb25zdCB0YWdzID0gW107XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAnZXhhbXBsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBERUJVRzogTG9nIHRoZSBjb21tZW50IGZvciBlYWNoIEBleGFtcGxlIHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdoZWxwZXJGdW5jIEBleGFtcGxlIGNvbW1lbnQ6JywgSlNPTi5zdHJpbmdpZnkoanNkb2NUYWdzW2ldLmNvbW1lbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21tZW50ID0ganNkb2NUYWdzW2ldLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2FwdGlvbiA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBhbmQgcmVuZGVyIGNhcHRpb24gaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FwdGlvbk1hdGNoID0gY29tbWVudC5tYXRjaCgvPGNhcHRpb24+KFtcXHNcXFNdKj8pPFxcL2NhcHRpb24+Lyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdGlvbk1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9IGNhcHRpb25NYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgY2FwdGlvbiBmcm9tIGNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5yZXBsYWNlKC88Y2FwdGlvbj5bXFxzXFxTXSo/PFxcL2NhcHRpb24+LywgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW5kZXIgY2FwdGlvbiBhcyBhIHNlcGFyYXRlIHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcHRpb25UYWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uVGFnLmNvbW1lbnQgPSBgPGI+PGk+JHtjYXB0aW9ufTwvaT48L2I+YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdzLnB1c2goY2FwdGlvblRhZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZSBjb2RlIGZlbmNlcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVCbG9ja3MgPSB0aGlzLnBhcnNlQ29kZUZlbmNlcyhjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYmxvY2sgb2YgY29kZUJsb2Nrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IHt9IGFzIEpzZG9jVGFnSW50ZXJmYWNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5jb21tZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDxwcmUgY2xhc3M9XCJsaW5lLW51bWJlcnNcIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLSR7YmxvY2subGFuZ3VhZ2V9XCI+YCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0SHRtbEVudGl0aWVzKGJsb2NrLmNvZGUpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDwvY29kZT48L3ByZT5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MucHVzaCh0YWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29udGV4dC50YWdzID0gdGFncztcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBKc2RvY1RhZ0ludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvanNkb2MtdGFnLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY0RlZmF1bHRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBpZiAoanNkb2NUYWdzKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0ganNkb2NUYWdzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBmYWxzZTtcblxuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24gJiYganNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uLnR5cGUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50eXBlID0ganNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uLnR5cGUubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmNvbW1lbnQgPSBqc2RvY1RhZ3NbaV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5uYW1lID0ganNkb2NUYWdzW2ldLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnRhZyA9IHRhZztcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEpzZG9jVGFnSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9qc2RvYy10YWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSnNkb2NFeGFtcGxlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwganNkb2NUYWdzOiBKc2RvY1RhZ0ludGVyZmFjZVtdLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0ganNkb2NUYWdzLmxlbmd0aDtcbiAgICAgICAgbGV0IHRhZ3MgPSBbXTtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdleGFtcGxlJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFnID0ge30gYXMgSnNkb2NUYWdJbnRlcmZhY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmNvbW1lbnQgPSBqc2RvY1RhZ3NbaV0uY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88Y2FwdGlvbj4vZywgJzxiPjxpPicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcL2NhcHRpb24+L2csICcvYj48L2k+Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnRleHQudGFncyA9IHRhZ3M7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSnNkb2NQYXJhbXNWYWxpZEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGpzZG9jVGFnczogSnNkb2NUYWdJbnRlcmZhY2VbXSwgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IGpzZG9jVGFncy5sZW5ndGg7XG4gICAgICAgIGxldCB0YWdzID0gW107XG4gICAgICAgIGxldCB2YWxpZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ3BhcmFtJykge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBKc2RvY1RhZ0ludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvanNkb2MtdGFnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBraW5kVG9UeXBlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMva2luZC10by10eXBlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jUGFyYW1zSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKFxuICAgICAgICBjb250ZXh0OiBhbnksXG4gICAgICAgIGpzZG9jVGFnczogQXJyYXk8SnNkb2NUYWdJbnRlcmZhY2UgfCBhbnk+LFxuICAgICAgICBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnNcbiAgICApIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0ganNkb2NUYWdzLmxlbmd0aDtcbiAgICAgICAgbGV0IHRhZ3MgPSBbXTtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdwYXJhbScpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZyA9IHt9IGFzIEpzZG9jVGFnSW50ZXJmYWNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uICYmIGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbi50eXBlLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50eXBlID0ga2luZFRvVHlwZShqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uICYmIGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbi50eXBlLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50eXBlID0ganNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uLnR5cGUubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnR5cGUgPSBqc2RvY1RhZ3NbaV0udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5jb21tZW50ID0ganNkb2NUYWdzW2ldLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5kZWZhdWx0VmFsdWUgPSBqc2RvY1RhZ3NbaV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5uYW1lLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZSA9IGpzZG9jVGFnc1tpXS5uYW1lLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5uYW1lID0ganNkb2NUYWdzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRhZyBhcyBhbnkpLm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YWdzLnB1c2godGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIGNvbnRleHQudGFncyA9IHRhZ3M7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSnNkb2NSZXR1cm5zQ29tbWVudEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGpzZG9jVGFnczogQXJyYXk8YW55Piwgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IGpzZG9jVGFncy5sZW5ndGg7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdyZXR1cm5zJyB8fFxuICAgICAgICAgICAgICAgICAgICBqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAncmV0dXJuJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqc2RvY1RhZ3NbaV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgUHJvamVjdCwgdHMsIFByb3BlcnR5RGVjbGFyYXRpb24sIFN5bnRheEtpbmQsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICd0cy1tb3JwaCc7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuLi9hcHAvZW5naW5lcy9maWxlLmVuZ2luZSc7XG5cbmNvbnN0IGFzdCA9IG5ldyBQcm9qZWN0KCk7XG5cbmV4cG9ydCBjbGFzcyBJbXBvcnRzVXRpbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEltcG9ydHNVdGlsO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghSW1wb3J0c1V0aWwuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEltcG9ydHNVdGlsLmluc3RhbmNlID0gbmV3IEltcG9ydHNVdGlsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEltcG9ydHNVdGlsLmluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5kIGZvciBhIHNvdXJjZUZpbGUgYSB2YXJpYWJsZSB2YWx1ZSBpbiBhIGxvY2FsIGVudW1cbiAgICAgKiBAcGFyYW0gc3JjRmlsZVxuICAgICAqIEBwYXJhbSB2YXJpYWJsZU5hbWVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVWYWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEluRW51bXMoc3JjRmlsZSwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgIHNyY0ZpbGUuZ2V0RW51bShlID0+IHtcbiAgICAgICAgICAgIGlmIChlLmdldE5hbWUoKSA9PT0gdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgZS5nZXRNZW1iZXIobSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtLmdldE5hbWUoKSA9PT0gdmFyaWFibGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gbS5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgZm9yIGEgc291cmNlRmlsZSBhIHZhcmlhYmxlIHZhbHVlIGluIGEgbG9jYWwgc3RhdGljIGNsYXNzXG4gICAgICogQHBhcmFtIHNyY0ZpbGVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVOYW1lXG4gICAgICogQHBhcmFtIHZhcmlhYmxlVmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRJbkNsYXNzZXMoc3JjRmlsZSwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgIHNyY0ZpbGUuZ2V0Q2xhc3MoYyA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdGljUHJvcGVydHk6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBjLmdldFN0YXRpY1Byb3BlcnR5KHZhcmlhYmxlVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3BlcnR5LmdldEluaXRpYWxpemVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RhdGljUHJvcGVydHkuZ2V0SW5pdGlhbGl6ZXIoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgdmFsdWUgaW4gYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBsaWtlIGFuIG9iamVjdFxuICAgICAqIEBwYXJhbSB2YXJpYWJsZURlY2xhcmF0aW9uXG4gICAgICogQHBhcmFtIHZhcmlhYmxlc0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRJbk9iamVjdFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVEZWNsYXJhdGlvbiwgdmFyaWFibGVzQXR0cmlidXRlcykge1xuICAgICAgICBsZXQgdmFyaWFibGVLaW5kID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRLaW5kKCk7XG4gICAgICAgIGlmICh2YXJpYWJsZUtpbmQgJiYgdmFyaWFibGVLaW5kID09PSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGxldCBpbml0aWFsaXplciA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplcktpbmQgPSBpbml0aWFsaXplci5nZXRLaW5kKCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyS2luZCAmJiBpbml0aWFsaXplcktpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBpbGVyTm9kZSA9IGluaXRpYWxpemVyLmNvbXBpbGVyTm9kZSBhcyB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGVzdHJpbmcgZnJvbSBBVkFSLkJWQVIudGhlc3RyaW5nIGluc2lkZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb29wUHJvcGVydGllcyA9IHByb3BlcnRpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlc0F0dHJpYnV0ZXNbZGVwdGggKyAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AubmFtZS5nZXRUZXh0KCkgPT09IHZhcmlhYmxlc0F0dHJpYnV0ZXNbZGVwdGggKyAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmluaXRpYWxpemVyLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wUHJvcGVydGllcyhwcm9wLmluaXRpYWxpemVyLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxWYWx1ZSA9IHByb3AuaW5pdGlhbGl6ZXIudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSBwcm9wLmluaXRpYWxpemVyLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxvb3BQcm9wZXJ0aWVzKGNvbXBpbGVyTm9kZS5wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBpbiBpbXBvcnRzIHNvbWV0aGluZyBsaWtlIG15dmFyXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgICAgICAgICAgICAgbGlrZSBteXZhclxuICAgICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15dmFyIHZhbHVlXG4gICAgICovXG4gICAgcHVibGljIGZpbmRWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhcbiAgICAgICAgaW5wdXRWYXJpYWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgZGVjb3JhdG9yVHlwZT86IHN0cmluZ1xuICAgICkge1xuICAgICAgICBsZXQgbWV0YWRhdGFWYXJpYWJsZU5hbWUgPSBpbnB1dFZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSAnJyxcbiAgICAgICAgICAgIGZvdW5kV2l0aE5hbWVkSW1wb3J0ID0gZmFsc2UsXG4gICAgICAgICAgICBmb3VuZFdpdGhEZWZhdWx0SW1wb3J0ID0gZmFsc2UsXG4gICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGZpbGUgPVxuICAgICAgICAgICAgdHlwZW9mIGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZS5maWxlTmFtZSlcbiAgICAgICAgICAgICAgICA6IGFzdC5hZGRTb3VyY2VGaWxlQXRQYXRoSWZFeGlzdHMoc291cmNlRmlsZS5maWxlTmFtZSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb3AgdGhyb3VnaCBhbGwgaW1wb3J0cywgYW5kIGZpbmQgb25lIG1hdGNoaW5nIGlucHV0VmFyaWFibGVOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aE5hbWVkSW1wb3J0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRBbGlhcyA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aE5hbWVkSW1wb3J0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gaW1wb3J0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0ID0gaS5nZXROYW1lc3BhY2VJbXBvcnQoKTtcbiAgICAgICAgICAgIGlmIChuYW1lc3BhY2VJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lc3BhY2VJbXBvcnRMb2NhbE5hbWUgPSBuYW1lc3BhY2VJbXBvcnQuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VJbXBvcnRMb2NhbE5hbWUgPT09IG1ldGFkYXRhVmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZm91bmRXaXRoTmFtZWRJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0SW1wb3J0ID0gaS5nZXREZWZhdWx0SW1wb3J0KCk7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEltcG9ydFRleHQgPSBkZWZhdWx0SW1wb3J0LmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRJbXBvcnRUZXh0ID09PSBtZXRhZGF0YVZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoRGVmYXVsdEltcG9ydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhc0ZvdW5kVmFsdWVzKHZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGxldCB2YXJpYWJsZUtpbmQgPSB2YXJpYWJsZURlY2xhcmF0aW9uLmdldEtpbmQoKTtcblxuICAgICAgICAgICAgaWYgKHZhcmlhYmxlS2luZCAmJiB2YXJpYWJsZUtpbmQgPT09IFN5bnRheEtpbmQuVmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplciA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluaXRpYWxpemVyS2luZCA9IGluaXRpYWxpemVyLmdldEtpbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyS2luZCAmJiBpbml0aWFsaXplcktpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21waWxlck5vZGUgPSBpbml0aWFsaXplci5jb21waWxlck5vZGUgYXMgdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJOb2RlLnByb3BlcnRpZXM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGltcG9ydFBhdGhSZWZlcmVuY2UgPSBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJTb3VyY2VGaWxlKCk7XG4gICAgICAgICAgICBsZXQgaW1wb3J0UGF0aDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0UGF0aFJlZmVyZW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpbXBvcnRQYXRoID0gaW1wb3J0UGF0aFJlZmVyZW5jZS5jb21waWxlck5vZGUuZmlsZU5hbWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlSW1wb3J0ID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aElmRXhpc3RzKGltcG9ydFBhdGgpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG5cbiAgICAgICAgICAgICAgICBpZiAoc291cmNlRmlsZUltcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFyaWFibGVOYW1lID0gZm91bmRXaXRoQWxpYXMgPyBhbGlhc09yaWdpbmFsTmFtZSA6IG1ldGFkYXRhVmFyaWFibGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFyaWFibGVEZWNsYXJhdGlvbiA9IHNvdXJjZUZpbGVJbXBvcnQuZ2V0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzRm91bmRWYWx1ZXModmFyaWFibGVEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgd2l0aCBleHBvcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBvcnREZWNsYXJhdGlvbnMgPSBzb3VyY2VGaWxlSW1wb3J0LmdldEV4cG9ydGVkRGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBvcnREZWNsYXJhdGlvbnMgJiYgZXhwb3J0RGVjbGFyYXRpb25zLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvblZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gb2YgZXhwb3J0RGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9uVmFsdWVzLmZvckVhY2goZXhwb3J0RGVjbGFyYXRpb25WYWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb25WYWx1ZSBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvblZhbHVlLmdldE5hbWUoKSA9PT0gdmFyaWFibGVOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzRm91bmRWYWx1ZXMoZXhwb3J0RGVjbGFyYXRpb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhaW1wb3J0UGF0aFJlZmVyZW5jZSAmJlxuICAgICAgICAgICAgICAgIGRlY29yYXRvclR5cGUgPT09ICd0ZW1wbGF0ZScgJiZcbiAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpLmluZGV4T2YoJy5odG1sJykgIT09IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTb3VyY2VGaWxlUGF0aCA9IHNvdXJjZUZpbGUucGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFNvdXJjZUZpbGVQYXRoRm9sZGVyID0gb3JpZ2luYWxTb3VyY2VGaWxlUGF0aC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU291cmNlRmlsZVBhdGgubGFzdEluZGV4T2YoJy8nKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxJbXBvcnRlZFBhdGggPVxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFNvdXJjZUZpbGVQYXRoRm9sZGVyICsgJy8nICsgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbEltcG9ydGVkUGF0aERhdGEgPSBGaWxlRW5naW5lLmdldFN5bmMoZmluYWxJbXBvcnRlZFBhdGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbEltcG9ydGVkUGF0aERhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaW5kIGluIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZmlsZVxuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVEZWNsYXJhdGlvbiA9IGZpbGUuZ2V0VmFyaWFibGVEZWNsYXJhdGlvbihtZXRhZGF0YVZhcmlhYmxlTmFtZSk7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCB2YXJpYWJsZUtpbmQgPSB2YXJpYWJsZURlY2xhcmF0aW9uLmdldEtpbmQoKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUtpbmQgJiYgdmFyaWFibGVLaW5kID09PSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluaXRpYWxpemVyID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplcigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplcktpbmQgPSBpbml0aWFsaXplci5nZXRLaW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJLaW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJLaW5kID09PSBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcGlsZXJOb2RlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXIuY29tcGlsZXJOb2RlIGFzIHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlck5vZGUucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJLaW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluaXRpYWxpemVyS2luZCA9PT0gU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyS2luZCA9PT0gU3ludGF4S2luZC5Ob1N1YnN0aXR1dGlvblRlbXBsYXRlTGl0ZXJhbClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3JUeXBlID09PSAndGVtcGxhdGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbml0aWFsaXplci5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRpb24uY29tcGlsZXJOb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXJLaW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRpb24uY29tcGlsZXJOb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWxlTmFtZU9mSW1wb3J0KHZhcmlhYmxlTmFtZTogc3RyaW5nLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPVxuICAgICAgICAgICAgdHlwZW9mIGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZS5maWxlTmFtZSlcbiAgICAgICAgICAgICAgICA6IGFzdC5hZGRTb3VyY2VGaWxlQXRQYXRoKHNvdXJjZUZpbGUuZmlsZU5hbWUpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBmaWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpO1xuICAgICAgICBsZXQgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZmluYWxQYXRoID0gJycsXG4gICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IGZhbHNlO1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QWxpYXMgPT09IHZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcudHMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGNsZWFuZXIgPSAocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgICAgICBmaW5hbFBhdGggPSBpbXBvcnRQYXRoLnJlcGxhY2UoY2xlYW5lciwgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFBhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgZmlsZSBwYXRoIG9mIGltcG9ydGVkIHZhcmlhYmxlXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgbGlrZSB0aGVzdHJpbmdcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICB0aGVzdHJpbmcgZGVzdGluYXRpb24gcGF0aFxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kRmlsZVBhdGhPZkltcG9ydGVkVmFyaWFibGUoaW5wdXRWYXJpYWJsZU5hbWUsIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgZmluYWxQYXRoID0gJycsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZVBhdGgpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aChzb3VyY2VGaWxlUGF0aCk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb3AgdGhyb3VnaCBhbGwgaW1wb3J0cywgYW5kIGZpbmQgb25lIG1hdGNoaW5nIGlucHV0VmFyaWFibGVOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gaW5wdXRWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRBbGlhcyA9PT0gaW5wdXRWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gaW1wb3J0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2hlZEltcG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUoc291cmNlRmlsZVBhdGgpICtcbiAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcudHMnXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFBhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBpbiBpbXBvcnRzIHNvbWV0aGluZyBsaWtlIFZBUi5BVkFSLkJWQVIudGhlc3RyaW5nXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgICAgICAgICAgICAgICAgICBsaWtlIFZBUi5BVkFSLkJWQVIudGhlc3RyaW5nXG4gICAgICogQHJldHVybiB7W3R5cGVdfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlc3RyaW5nIHZhbHVlXG4gICAgICovXG4gICAgcHVibGljIGZpbmRQcm9wZXJ0eVZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKGlucHV0VmFyaWFibGVOYW1lLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCB2YXJpYWJsZXNBdHRyaWJ1dGVzID0gaW5wdXRWYXJpYWJsZU5hbWUuc3BsaXQoJy4nKSxcbiAgICAgICAgICAgIG1ldGFkYXRhVmFyaWFibGVOYW1lID0gdmFyaWFibGVzQXR0cmlidXRlc1swXSxcbiAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSAnJyxcbiAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZS5maWxlTmFtZSkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKVxuICAgICAgICAgICAgICAgIDogYXN0LmFkZFNvdXJjZUZpbGVBdFBhdGgoc291cmNlRmlsZS5maWxlTmFtZSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb3AgdGhyb3VnaCBhbGwgaW1wb3J0cywgYW5kIGZpbmQgb25lIG1hdGNoaW5nIGlucHV0VmFyaWFibGVOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRBbGlhcyA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gaW1wb3J0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZmlsZVRvU2VhcmNoSW4sIHZhcmlhYmxlRGVjbGFyYXRpb247XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoZWRJbXBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBsZXQgaW1wb3J0UGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUoc291cmNlRmlsZS5maWxlTmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICAnLycgK1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpICtcbiAgICAgICAgICAgICAgICAgICAgJy50cydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlSW1wb3J0ID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoaW1wb3J0UGF0aCkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoaW1wb3J0UGF0aClcbiAgICAgICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aChpbXBvcnRQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICBmaWxlVG9TZWFyY2hJbiA9IHNvdXJjZUZpbGVJbXBvcnQ7XG4gICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlTmFtZSA9IGZvdW5kV2l0aEFsaWFzID8gYWxpYXNPcmlnaW5hbE5hbWUgOiBtZXRhZGF0YVZhcmlhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uID0gZmlsZVRvU2VhcmNoSW4uZ2V0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmlsZVRvU2VhcmNoSW4gPSBmaWxlO1xuICAgICAgICAgICAgLy8gRmluZCBpbiBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZpbGVcbiAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb24gPSBmaWxlVG9TZWFyY2hJbi5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKG1ldGFkYXRhVmFyaWFibGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5PYmplY3RWYXJpYWJsZURlY2xhcmF0aW9uKHZhcmlhYmxlRGVjbGFyYXRpb24sIHZhcmlhYmxlc0F0dHJpYnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyeSBmaW5kIGl0IGluIGVudW1zXG4gICAgICAgIGlmICh2YXJpYWJsZXNBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZVRvU2VhcmNoSW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZmluZEluRW51bXMoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVUb1NlYXJjaEluLFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzQXR0cmlidXRlc1sxXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsID0gdGhpcy5maW5kSW5DbGFzc2VzKFxuICAgICAgICAgICAgICAgICAgICBmaWxlVG9TZWFyY2hJbixcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFWYXJpYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc0F0dHJpYnV0ZXNbMV1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbXBvcnRzVXRpbC5nZXRJbnN0YW5jZSgpO1xuIiwiY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcbmltcG9ydCAqIGFzIEpTT041IGZyb20gJ2pzb241JztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBQcm9qZWN0LCB0cywgU291cmNlRmlsZSwgU3ludGF4S2luZCwgTm9kZSB9IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IEZpbGVFbmdpbmUgZnJvbSAnLi4vYXBwL2VuZ2luZXMvZmlsZS5lbmdpbmUnO1xuaW1wb3J0IHsgUm91dGluZ0dyYXBoTm9kZSB9IGZyb20gJy4uL2FwcC9ub2Rlcy9yb3V0aW5nLWdyYXBoLW5vZGUnO1xuXG5pbXBvcnQgSW1wb3J0c1V0aWwgZnJvbSAnLi9pbXBvcnRzLnV0aWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ25lb3RyYXZlcnNlL2xlZ2FjeScpO1xuXG5jb25zdCBhc3QgPSBuZXcgUHJvamVjdCgpO1xuXG5leHBvcnQgY2xhc3MgUm91dGVyUGFyc2VyVXRpbCB7XG4gICAgcHVibGljIHNjYW5uZWRGaWxlczogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIHJvdXRlczogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIGluY29tcGxldGVSb3V0ZXMgPSBbXTtcbiAgICBwcml2YXRlIG1vZHVsZXMgPSBbXTtcbiAgICBwcml2YXRlIG1vZHVsZXNUcmVlO1xuICAgIHByaXZhdGUgcm9vdE1vZHVsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgY2xlYW5Nb2R1bGVzVHJlZTtcbiAgICBwcml2YXRlIG1vZHVsZXNXaXRoUm91dGVzID0gW107XG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheCA9XG4gICAgICAgIC8oWydcIl1sb2FkQ2hpbGRyZW5bJ1wiXTopXFwoXFwpKDpbXildKz8pPz0+XCJpbXBvcnRcXCgoXFxcXCd8J3xcInxgKShbXidcIl0rPykoXFxcXCd8J3xcInxgKVxcKVxcLnRoZW5cXChcXCg/XFx3Kz9cXCk/PT5cXFMrP1xcLihbXildKz8pXFwpKFxcXFwnfCd8XCIpL2c7XG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheENvbXBvbmVudCA9XG4gICAgICAgIC8oWydcIl1sb2FkQ29tcG9uZW50WydcIl06KVxcKFxcKSg6W14pXSs/KT89PlwiaW1wb3J0XFwoKFxcXFwnfCd8XCJ8YCkoW14nXCJdKz8pKFxcXFwnfCd8XCJ8YClcXClcXC50aGVuXFwoXFwoP1xcdys/XFwpPz0+XFxTKz9cXC4oW14pXSs/KVxcKShcXFxcJ3wnfFwiKS9nO1xuICAgIHByaXZhdGUgdHJhbnNmb3JtQW5ndWxhcjhJbXBvcnRTeW50YXhBc3luY0F3YWl0ID1cbiAgICAgICAgLyhbJ1wiXWxvYWRDaGlsZHJlblsnXCJdOilcXChcXCkoOlteKV0rPyk/PT5cXChcImltcG9ydFxcKChcXFxcJ3wnfFwifGApKFteJ1wiXSs/KShcXFxcJ3wnfFwifGApXFwpXCJcXClcXC5bJ1wiXShbXildKz8pWydcIl0vZztcbiAgICBwcml2YXRlIHRyYW5zZm9ybUFuZ3VsYXI4SW1wb3J0U3ludGF4Q29tcG9uZW50QXN5bmNBd2FpdCA9XG4gICAgICAgIC8oWydcIl1sb2FkQ29tcG9uZW50WydcIl06KVxcKFxcKSg6W14pXSs/KT89PlxcKFwiaW1wb3J0XFwoKFxcXFwnfCd8XCJ8YCkoW14nXCJdKz8pKFxcXFwnfCd8XCJ8YClcXClcIlxcKVxcLlsnXCJdKFteKV0rPylbJ1wiXS9nO1xuICAgIHByaXZhdGUgdHJhaWxpbmdDb21tYSA9IC8sXFxzKihbXFxdfSldKS9nO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFJvdXRlclBhcnNlclV0aWw7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFSb3V0ZXJQYXJzZXJVdGlsLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmluc3RhbmNlID0gbmV3IFJvdXRlclBhcnNlclV0aWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUm91dGVyUGFyc2VyVXRpbC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUm91dGUocm91dGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb3V0ZXMucHVzaChyb3V0ZSk7XG4gICAgICAgIHRoaXMucm91dGVzID0gXy5zb3J0QnkoXy51bmlxV2l0aCh0aGlzLnJvdXRlcywgXy5pc0VxdWFsKSwgWyduYW1lJ10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRJbmNvbXBsZXRlUm91dGUocm91dGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbmNvbXBsZXRlUm91dGVzLnB1c2gocm91dGUpO1xuICAgICAgICB0aGlzLmluY29tcGxldGVSb3V0ZXMgPSBfLnNvcnRCeShfLnVuaXFXaXRoKHRoaXMuaW5jb21wbGV0ZVJvdXRlcywgXy5pc0VxdWFsKSwgWyduYW1lJ10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRNb2R1bGVXaXRoUm91dGVzKG1vZHVsZU5hbWUsIG1vZHVsZUltcG9ydHMsIGZpbGVuYW1lKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgaW1wb3J0c05vZGU6IG1vZHVsZUltcG9ydHMsXG4gICAgICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMgPSBfLnNvcnRCeShfLnVuaXFXaXRoKHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMsIF8uaXNFcXVhbCksIFsnbmFtZSddKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTW9kdWxlKG1vZHVsZU5hbWU6IHN0cmluZywgbW9kdWxlSW1wb3J0cyk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZHVsZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgaW1wb3J0c05vZGU6IG1vZHVsZUltcG9ydHNcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IF8uc29ydEJ5KF8udW5pcVdpdGgodGhpcy5tb2R1bGVzLCBfLmlzRXF1YWwpLCBbJ25hbWUnXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFuUmF3Um91dGVQYXJzZWQocm91dGU6IHN0cmluZyk6IG9iamVjdCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTjUucGFyc2UodGhpcy5jbGVhblJhd1JvdXRlKHJvdXRlKSk7XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIHJvdXRlIGRhdGEuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gZmlsZSBwYXRocyBvciByb3V0ZSBjb25maWd1cmF0aW9ucy5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBSYXcgcm91dGUgZGF0YTogJHtyb3V0ZX1gKTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xlYW5lZCByb3V0ZSBkYXRhOiAke3RoaXMuY2xlYW5SYXdSb3V0ZShyb3V0ZSl9YCk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFBhcnNlIGVycm9yOiAke3BhcnNlRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIHRocm93IHBhcnNlRXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5SYXdSb3V0ZShyb3V0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGNsZWFuZWQgPSByb3V0ZVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xccy9nLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHRoaXMudHJhaWxpbmdDb21tYSwgJyQxJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHRoaXMudHJhbnNmb3JtQW5ndWxhcjhJbXBvcnRTeW50YXgsICckMVwiJDQjJDZcIicpXG4gICAgICAgICAgICAucmVwbGFjZSh0aGlzLnRyYW5zZm9ybUFuZ3VsYXI4SW1wb3J0U3ludGF4QXN5bmNBd2FpdCwgJyQxXCIkNCMkNlwiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHRoaXMudHJhbnNmb3JtQW5ndWxhcjhJbXBvcnRTeW50YXhDb21wb25lbnQsICckMVwiJDQjJDZcIicpXG4gICAgICAgICAgICAucmVwbGFjZSh0aGlzLnRyYW5zZm9ybUFuZ3VsYXI4SW1wb3J0U3ludGF4Q29tcG9uZW50QXN5bmNBd2FpdCwgJyQxXCIkNCMkNlwiJyk7XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBjbGVhbmluZyBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzIHRoYXQgY2F1c2UgSlNPTjUgcGFyc2luZyBpc3N1ZXNcbiAgICAgICAgLy8gSGFuZGxlIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIHN0cmluZyBsaXRlcmFsc1xuICAgICAgICBjbGVhbmVkID0gY2xlYW5lZFxuICAgICAgICAgICAgLy8gRml4IHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbnMgdGhhdCBnZXQgY29udmVydGVkIGluY29ycmVjdGx5XG4gICAgICAgICAgICAvLyBDb252ZXJ0ICR7VkFSfS9zb21ldGhpbmcgcGF0dGVybnMgdG8gXCJWQVIvc29tZXRoaW5nXCIgZm9ybWF0XG4gICAgICAgICAgICAucmVwbGFjZSgvXFwkXFx7KFtefV0rKVxcfVxcLyhbXlwiJyx9XFxzXSspL2csICdcIiQxLyQyXCInKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcJFxceyhbXn1dKylcXH0vZywgJ1wiJDFcIicpXG4gICAgICAgICAgICAvLyBGaXggbWFsZm9ybWVkIHN0cmluZyBjb25jYXRlbmF0aW9ucyBmcm9tIHRlbXBsYXRlIGxpdGVyYWxzXG4gICAgICAgICAgICAucmVwbGFjZSgvXCIoW15cIl0qPylcIlxcL1wiKFteXCJdKj8pXCIvZywgJ1wiJDEvJDJcIicpXG4gICAgICAgICAgICAucmVwbGFjZSgvXCIoW15cIl0qPylcIlxcKyhbXlwiXSo/KVxcK1wiKFteXCJdKj8pXCIvZywgJ1wiJDErJDIrJDNcIicpXG4gICAgICAgICAgICAvLyBGaXggZG91YmxlIHF1b3RlcyBpc3N1ZXMgaW4gcGF0aCBzdHJpbmdzXG4gICAgICAgICAgICAucmVwbGFjZSgvXCJcIihbXlwiXSo/KVwiXCIvZywgJ1wiJDFcIicpXG4gICAgICAgICAgICAvLyBGaXggbWFsZm9ybWVkIHN0cmluZyBjb25jYXRlbmF0aW9uc1xuICAgICAgICAgICAgLnJlcGxhY2UoLyhbXlwiXSlcIihbXlwiXSo/KVxcLihbXlwiXSo/KVwiKFteXCJdKS9nLCAnJDFcIiQyXFxcXC4kM1wiJDQnKVxuICAgICAgICAgICAgLy8gRml4IHVuZXNjYXBlZCBwbHVzIHNpZ25zIGluIHN0cmluZyBsaXRlcmFsc1xuICAgICAgICAgICAgLnJlcGxhY2UoLyhbXlwiXSlcIihbXlwiXSo/KVxcKyhbXlwiXSo/KVwiKFteXCJdKS9nLCAnJDFcIiQyXFxcXCskM1wiJDQnKVxuICAgICAgICAgICAgLy8gRml4IHVuZXNjYXBlZCBwYXJlbnRoZXNlcyBpbiBzdHJpbmcgbGl0ZXJhbHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oW15cIl0pXCIoW15cIl0qPylcXCgoW15cIl0qPylcIihbXlwiXSkvZywgJyQxXCIkMlxcXFwoJDNcIiQ0JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oW15cIl0pXCIoW15cIl0qPylcXCkoW15cIl0qPylcIihbXlwiXSkvZywgJyQxXCIkMlxcXFwpJDNcIiQ0Jyk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvb3RNb2R1bGUobW9kdWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb290TW9kdWxlID0gbW9kdWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNSb3V0ZXJNb2R1bGVJbkltcG9ydHMoaW1wb3J0czogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpbXBvcnRzW2ldLm5hbWUuaW5kZXhPZignUm91dGVyTW9kdWxlLmZvckNoaWxkJykgIT09IC0xIHx8XG4gICAgICAgICAgICAgICAgaW1wb3J0c1tpXS5uYW1lLmluZGV4T2YoJ1JvdXRlck1vZHVsZS5mb3JSb290JykgIT09IC0xIHx8XG4gICAgICAgICAgICAgICAgaW1wb3J0c1tpXS5uYW1lLmluZGV4T2YoJ1JvdXRlck1vZHVsZScpICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGZpeEluY29tcGxldGVSb3V0ZXMobWlzY2VsbGFuZW91c1ZhcmlhYmxlczogQXJyYXk8YW55Pik6IHZvaWQge1xuICAgICAgICBjb25zdCBtYXRjaGluZ1ZhcmlhYmxlcyA9IFtdO1xuICAgICAgICAvLyBGb3IgZWFjaCBpbmNvbXBsZXRlUm91dGUsIHNjYW4gaWYgb25lIG1pc2MgdmFyaWFibGUgaXMgaW4gY29kZVxuICAgICAgICAvLyBpZiBvaywgdHJ5IHJlY3JlYXRpbmcgY29tcGxldGUgcm91dGVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmluY29tcGxldGVSb3V0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWlzY2VsbGFuZW91c1ZhcmlhYmxlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluY29tcGxldGVSb3V0ZXNbaV0uZGF0YS5pbmRleE9mKG1pc2NlbGxhbmVvdXNWYXJpYWJsZXNbal0ubmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmb3VuZCBvbmUgbWlzYyB2YXIgaW5zaWRlIGluY29tcGxldGVSb3V0ZScpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtaXNjZWxsYW5lb3VzVmFyaWFibGVzW2pdLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ1ZhcmlhYmxlcy5wdXNoKG1pc2NlbGxhbmVvdXNWYXJpYWJsZXNbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENsZWFuIGluY29tcGxldGVSb3V0ZVxuICAgICAgICAgICAgdGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEgPSB0aGlzLmluY29tcGxldGVSb3V0ZXNbaV0uZGF0YS5yZXBsYWNlKCdbJywgJycpO1xuICAgICAgICAgICAgdGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEgPSB0aGlzLmluY29tcGxldGVSb3V0ZXNbaV0uZGF0YS5yZXBsYWNlKCddJywgJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxpbmtNb2R1bGVzQW5kUm91dGVzKCk6IHZvaWQge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGNvbnN0IGxlbiA9IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0uaW1wb3J0c05vZGUsIChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzUHJvcGVydHlEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IG5vZGUuaW5pdGlhbGl6ZXIgYXMgdHMuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goaW5pdGlhbGl6ZXIuZWxlbWVudHMsIChlbGVtZW50OiB0cy5DYWxsRXhwcmVzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGVsZW1lbnQgd2l0aCBhcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5hcmd1bWVudHMsIChhcmd1bWVudDogdHMuSWRlbnRpZmllcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnJvdXRlcywgcm91dGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5uYW1lID09PSBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5maWxlbmFtZSA9PT0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5maWxlbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1vZHVsZSA9IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm5hbWUgPT09IGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmZpbGVuYW1lICE9PSB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyZ3VtZW50SW1wb3J0UGF0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0c1V0aWwuZmluZEZpbGVQYXRoT2ZJbXBvcnRlZFZhcmlhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRJbXBvcnRQYXRoID0gYXJndW1lbnRJbXBvcnRQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQudGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm5hbWUgPT09IGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5maWxlbmFtZSA9PT0gYXJndW1lbnRJbXBvcnRQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tb2R1bGUgPSB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogZGlyZWN0IHN1cHBvcnQgb2YgZm9yIGV4YW1wbGVcbiAgICAgICAgICAgICAgICAgKiBleHBvcnQgY29uc3QgSG9tZVJvdXRpbmdNb2R1bGU6IE1vZHVsZVdpdGhQcm92aWRlcnMgPSBSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQoSE9NRV9ST1VURVMpO1xuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKG5vZGUuYXJndW1lbnRzLCAoYXJndW1lbnQ6IHRzLklkZW50aWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5yb3V0ZXMsIHJvdXRlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQudGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubmFtZSA9PT0gYXJndW1lbnQudGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuZmlsZW5hbWUgPT09IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0uZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tb2R1bGUgPSB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZm91bmRSb3V0ZVdpdGhNb2R1bGVOYW1lKG1vZHVsZU5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiBfLmZpbmQodGhpcy5yb3V0ZXMsIHsgbW9kdWxlOiBtb2R1bGVOYW1lIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3VuZExhenlNb2R1bGVXaXRoUGF0aChtb2R1bGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBwYXRoIGlzIGxpa2UgYXBwL2N1c3RvbWVycy9jdXN0b21lcnMubW9kdWxlI0N1c3RvbWVyc01vZHVsZVxuICAgICAgICBjb25zdCBzcGxpdCA9IG1vZHVsZVBhdGguc3BsaXQoJyMnKTtcbiAgICAgICAgY29uc3QgbGF6eU1vZHVsZU5hbWUgPSBzcGxpdFsxXTtcbiAgICAgICAgcmV0dXJuIGxhenlNb2R1bGVOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3VuZExhenlDb21wb25lbnRXaXRoUGF0aChjb21wb25lbnRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBwYXRoIGlzIGxpa2UgYXBwL2N1c3RvbWVycy9jdXN0b21lcnMuY29tcG9uZW50I0N1c3RvbWVyc0NvbXBvbmVudFxuICAgICAgICBjb25zdCBzcGxpdCA9IGNvbXBvbmVudFBhdGguc3BsaXQoJyMnKTtcbiAgICAgICAgY29uc3QgbGF6eUNvbXBvbmVudE5hbWUgPSBzcGxpdFsxXTtcbiAgICAgICAgcmV0dXJuIGxhenlDb21wb25lbnROYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RSb3V0ZXNUcmVlKCkge1xuICAgICAgICAvLyByb3V0ZXNbXSBjb250YWlucyByb3V0ZXMgd2l0aCBtb2R1bGUgbGlua1xuICAgICAgICAvLyBtb2R1bGVzVHJlZSBjb250YWlucyBtb2R1bGVzIHRyZWVcbiAgICAgICAgLy8gbWFrZSBhIGZpbmFsIHJvdXRlcyB0cmVlIHdpdGggdGhhdFxuICAgICAgICAvLyBDcmVhdGUgYW4gZW5oYW5jZWQgcm91dGVzIHRyZWUgd2l0aCBjb21wcmVoZW5zaXZlIHZhbGlkYXRpb24gdG8gcHJldmVudCB1bmRlZmluZWQgZW50cmllc1xuICAgICAgICBpZiAodGhpcy5yb3V0ZXMubGVuZ3RoID4gMCB8fCAodGhpcy5tb2R1bGVzV2l0aFJvdXRlcyAmJiB0aGlzLm1vZHVsZXNXaXRoUm91dGVzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZENoaWxkcmVuID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiBmdW5jdGlvbiB0byBwcmV2ZW50IGFueSB1bmRlZmluZWQvaW52YWxpZCBlbnRyaWVzXG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIFxuICAgICAgICAgICAgICAgICAgICAgICBuYW1lLnRyaW0oKSAhPT0gJycgJiYgXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWUgIT09ICd1bmRlZmluZWQnICYmIFxuICAgICAgICAgICAgICAgICAgICAgICBuYW1lICE9PSAnbnVsbCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIW5hbWUuaW5jbHVkZXMoJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWUubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAhL15cXHMqJC8udGVzdChuYW1lKTsgIC8vIE5vdCBqdXN0IHdoaXRlc3BhY2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFByb2Nlc3Mgcm91dGVzIGRhdGEgaWYgYXZhaWxhYmxlIHRvIGV4dHJhY3QgY29tcG9uZW50cyBhbmQgcGF0aHNcbiAgICAgICAgICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZURhdGEgPSBKU09OLnBhcnNlKHJvdXRlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvdXRlSXRlbSBvZiByb3V0ZURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZUl0ZW0uY29tcG9uZW50ICYmIGlzVmFsaWROYW1lKHJvdXRlSXRlbS5jb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRDaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcm91dGVJdGVtLmNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHJvdXRlSXRlbS5wYXRoIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcm91dGUuZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZUl0ZW0ubG9hZENoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBtb2R1bGUgbmFtZSBmcm9tIGxvYWRDaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZU1hdGNoID0gcm91dGVJdGVtLmxvYWRDaGlsZHJlbi5tYXRjaCgvIyhcXHcrKS8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGVNYXRjaCAmJiBpc1ZhbGlkTmFtZShtb2R1bGVNYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRDaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZU1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ21vZHVsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiByb3V0ZUl0ZW0ucGF0aCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiByb3V0ZS5maWxlbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEpTT04gcGFyc2luZyBmYWlsZWQsIHRyeSByZWdleCBleHRyYWN0aW9uIHdpdGggc3RyaWN0IHZhbGlkYXRpb25cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgY29tcG9uZW50IG5hbWVzIHdpdGggcmlnb3JvdXMgdmFsaWRhdGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRNYXRjaGVzID0gcm91dGUuZGF0YS5tYXRjaCgvXCJjb21wb25lbnRcIlxccyo6XFxzKlwiKFxcdytDb21wb25lbnQpXCIvZyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRNYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvbXBvbmVudE1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lTWF0Y2ggPSBtYXRjaC5tYXRjaCgvXCJjb21wb25lbnRcIlxccyo6XFxzKlwiKFxcdytDb21wb25lbnQpXCIvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZU1hdGNoICYmIGlzVmFsaWROYW1lKGNvbXBvbmVudE5hbWVNYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRDaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudE5hbWVNYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21wb25lbnQnLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiByb3V0ZS5maWxlbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgcGF0aCB2YWx1ZXMgd2l0aCBzdHJpY3QgdmFsaWRhdGlvbiAoYXZvaWRpbmcgcHJvYmxlbWF0aWMgcGF0dGVybnMpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhNYXRjaGVzID0gcm91dGUuZGF0YS5tYXRjaCgvXCJwYXRoXCJcXHMqOlxccypcIihbXlwiXSspXCIvZyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoTWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBwYXRoTWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhOYW1lTWF0Y2ggPSBtYXRjaC5tYXRjaCgvXCJwYXRoXCJcXHMqOlxccypcIihbXlwiXSspXCIvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aE5hbWVNYXRjaCAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZE5hbWUocGF0aE5hbWVNYXRjaFsxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBhdGhOYW1lTWF0Y2hbMV0uaW5jbHVkZXMoJ0FCT1VUX0VOVU1TJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBhdGhOYW1lTWF0Y2hbMV0uaW5jbHVkZXMoJy4nKSkgeyAgLy8gQXZvaWQgZHluYW1pYyBwcm9wZXJ0eSBhY2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRDaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhdGhOYW1lTWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAncm91dGUtcGF0aCcsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHJvdXRlLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCByZWRpcmVjdFRvIHZhbHVlcyB3aXRoIHN0cmljdCB2YWxpZGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0TWF0Y2hlcyA9IHJvdXRlLmRhdGEubWF0Y2goL1wicmVkaXJlY3RUb1wiXFxzKjpcXHMqXCIoW15cIl0rKVwiL2cpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RNYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHJlZGlyZWN0TWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0TmFtZU1hdGNoID0gbWF0Y2gubWF0Y2goL1wicmVkaXJlY3RUb1wiXFxzKjpcXHMqXCIoW15cIl0rKVwiLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZGlyZWN0TmFtZU1hdGNoICYmIGlzVmFsaWROYW1lKHJlZGlyZWN0TmFtZU1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZENoaWxkcmVuLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVkaXJlY3ROYW1lTWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAncm91dGUtcmVkaXJlY3QnLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiByb3V0ZS5maWxlbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBzdGF0aWMgZW51bSB2YWx1ZXMgYnkgZGV0ZWN0aW5nIGVudW0ucHJvcGVydHkgcGF0dGVybnNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bU1hcHBpbmdzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0FCT1VUX0VOVU1TLnRvZG9tdmMnOiAndG9kb212Y2luc3RhdGljY2xhc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FQUF9FTlVNLmhvbWVlbnVtaW1wb3J0ZWQnOiAnaG9tZWVudW1pbXBvcnRlZCcsIFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FQUF9FTlVNLmhvbWVlbnVtaW5maWxlJzogJ2hvbWVlbnVtaW5maWxlJ1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbZW51bVBhdHRlcm4sIHN0YXRpY1ZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnVtTWFwcGluZ3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29rIGZvciB2YXJpb3VzIHBhdHRlcm5zIHRoYXQgbWlnaHQgYXBwZWFyIGluIHJvdXRlIGRhdGE6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJucyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtUGF0dGVybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBQk9VVF9FTlVNUy50b2RvbXZjXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHtlbnVtUGF0dGVybi5yZXBsYWNlKCcuJywgJ1wiLlwiJyl9XCJgLCAgIC8vIFwiQUJPVVRfRU5VTVNcIi5cInRvZG9tdmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIiR7ZW51bVBhdHRlcm4ucmVwbGFjZSgnLicsICdcXFxcXCIuXCInKX1cImAsIC8vIFwiQUJPVVRfRU5VTVNcXC5cInRvZG9tdmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1QYXR0ZXJuLnJlcGxhY2UoJy4nLCAnXCIuXCInKSwgICAgICAgICAvLyBBQk9VVF9FTlVNU1wiLlwidG9kb212Y1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1QYXR0ZXJuLnJlcGxhY2UoJy4nLCAnXFxcXFwiLlwiJyksICAgICAgIC8vIEFCT1VUX0VOVU1TXFwuXCJ0b2RvbXZjXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHtlbnVtUGF0dGVybi5zcGxpdCgnLicpWzBdfVwiXFxcXC5cIiR7ZW51bVBhdHRlcm4uc3BsaXQoJy4nKVsxXX1cImAgLy8gXCJBQk9VVF9FTlVNU1wiXFwuXCJ0b2RvbXZjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlLmRhdGEuaW5jbHVkZXMocGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCAmJiAhdmFsaWRDaGlsZHJlbi5zb21lKGNoaWxkID0+IGNoaWxkLm5hbWUgPT09IHN0YXRpY1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkQ2hpbGRyZW4ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN0YXRpY1ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAncm91dGUtcGF0aCcsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcm91dGUuZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWxzbyBpbmNsdWRlIHdlbGwtZGVmaW5lZCByb3V0aW5nIG1vZHVsZXNcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZHVsZXNXaXRoUm91dGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgdGhpcy5tb2R1bGVzV2l0aFJvdXRlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZE5hbWUobW9kdWxlLm5hbWUpICYmIG1vZHVsZS5maWxlbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRDaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnbW9kdWxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogbW9kdWxlLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3Qgcm91dGVzVHJlZSA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnPHJvb3Q+JyxcbiAgICAgICAgICAgICAgICBraW5kOiAnbW9kdWxlJywgXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLnJvb3RNb2R1bGUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IHZhbGlkQ2hpbGRyZW5cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiByb3V0ZXNUcmVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0cmF2ZXJzZSh0aGlzLm1vZHVsZXNUcmVlKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5pbXBvcnRzTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5pbXBvcnRzTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2xlYW5Nb2R1bGVzVHJlZSA9IF8uY2xvbmVEZWVwKHRoaXMubW9kdWxlc1RyZWUpO1xuXG4gICAgICAgIGNvbnN0IHJvdXRlc1RyZWUgPSB7XG4gICAgICAgICAgICBuYW1lOiAnPHJvb3Q+JyxcbiAgICAgICAgICAgIGtpbmQ6ICdtb2R1bGUnLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLnJvb3RNb2R1bGUsXG4gICAgICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBsb29wTW9kdWxlc1BhcnNlciA9IG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbW9kdWxlIGhhcyBjaGlsZCBtb2R1bGVzXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShub2RlLmNoaWxkcmVuW2ldLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgJiYgcm91dGUuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5jaGlsZHJlbiA9IEpTT041LnBhcnNlKHJvdXRlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGR1cmluZyBnZW5lcmF0aW9uIG9mIHJvdXRlcyBKU09OIGZpbGUsIG1heWJlIGEgdHJhaWxpbmcgY29tbWEgb3IgYW4gZXh0ZXJuYWwgdmFyaWFibGUgaW5zaWRlIG9uZSByb3V0ZS4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFJvdXRlIGRhdGEgZm9yIFwiJHtub2RlLmNoaWxkcmVuW2ldLm5hbWV9XCI6ICR7cm91dGUuZGF0YX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFBhcnNlIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb3V0ZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUua2luZCA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzVHJlZS5jaGlsZHJlbi5wdXNoKHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbltpXS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcE1vZHVsZXNQYXJzZXIobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGVsc2Ugcm91dGVzIGFyZSBkaXJlY3RseSBpbnNpZGUgdGhlIG1vZHVsZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJhd1JvdXRlcyA9IHRoaXMuZm91bmRSb3V0ZVdpdGhNb2R1bGVOYW1lKG5vZGUubmFtZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmF3Um91dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb3V0ZXM7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXMgPSBKU09ONS5wYXJzZShyYXdSb3V0ZXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIHJvdXRlIGRhdGEgZm9yIG1vZHVsZSBcIiR7bm9kZS5uYW1lfVwiLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHNwZWNpYWwgY2hhcmFjdGVycyBpbiBmaWxlIHBhdGhzIG9yIHJvdXRlIGNvbmZpZ3VyYXRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFJvdXRlIGRhdGE6ICR7cmF3Um91dGVzLmRhdGF9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFBhcnNlIGVycm9yOiAke3BhcnNlRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gU2tpcCB0aGlzIG1vZHVsZSdzIHJvdXRlIHByb2Nlc3NpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSByb3V0ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRlQWRkZWRPbmNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gcm91dGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVBZGRlZE9uY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXNUcmVlLmNoaWxkcmVuLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHJvdXRlLmNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHJvdXRlLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3V0ZUFkZGVkT25jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlc1RyZWUuY2hpbGRyZW4gPSBbLi4ucm91dGVzVHJlZS5jaGlsZHJlbiwgLi4ucm91dGVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdGFydE1vZHVsZSA9IF8uZmluZCh0aGlzLmNsZWFuTW9kdWxlc1RyZWUsIHsgbmFtZTogdGhpcy5yb290TW9kdWxlIH0pO1xuXG4gICAgICAgIGlmIChzdGFydE1vZHVsZSkge1xuICAgICAgICAgICAgbG9vcE1vZHVsZXNQYXJzZXIoc3RhcnRNb2R1bGUpO1xuICAgICAgICAgICAgLy8gTG9vcCB0d2ljZSBmb3Igcm91dGVzIHdpdGggbGF6eSBsb2FkaW5nXG4gICAgICAgICAgICAvLyBsb29wTW9kdWxlc1BhcnNlcihyb3V0ZXNUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjbGVhbmVkUm91dGVzVHJlZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBjbGVhblJvdXRlc1RyZWUgPSByb3V0ZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcm91dGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgY2xlYW5lZFJvdXRlc1RyZWUgPSBjbGVhblJvdXRlc1RyZWUocm91dGVzVHJlZSk7XG5cbiAgICAgICAgLy8gVHJ5IHVwZGF0aW5nIHJvdXRlcyB3aXRoIGxhenkgbG9hZGluZ1xuXG4gICAgICAgIGNvbnN0IGxvb3BJbnNpZGVNb2R1bGUgPSAobW9kLCBfcmF3TW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAobW9kLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB6IGluIG1vZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuZm91bmRSb3V0ZVdpdGhNb2R1bGVOYW1lKG1vZC5jaGlsZHJlblt6XS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4gPSBKU09ONS5wYXJzZShyb3V0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvdXRlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmtpbmQgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5jaGlsZHJlbi5wdXNoKHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBwYXJzZSByb3V0ZSBkYXRhIGZvciBtb2R1bGUgXCIke21vZC5jaGlsZHJlblt6XS5uYW1lfVwiLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTa2lwcGluZyByb3V0ZSBwYXJzaW5nIGZvciB0aGlzIG1vZHVsZS5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgUm91dGUgZGF0YTogJHtyb3V0ZS5kYXRhfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFBhcnNlIGVycm9yOiAke3BhcnNlRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHJvdXRlIGJ1dCBjb250aW51ZSBwcm9jZXNzaW5nIG90aGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLmZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShtb2QubmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4gPSBKU09ONS5wYXJzZShyb3V0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm91dGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5raW5kID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5jaGlsZHJlbi5wdXNoKHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBwYXJzZSByb3V0ZSBkYXRhIGZvciBtb2R1bGUgXCIke21vZC5uYW1lfVwiLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNraXBwaW5nIHJvdXRlIHBhcnNpbmcgZm9yIHRoaXMgbW9kdWxlLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgUm91dGUgZGF0YTogJHtyb3V0ZS5kYXRhfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgUGFyc2UgZXJyb3I6ICR7cGFyc2VFcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyByb3V0ZSBidXQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBsb29wUm91dGVzUGFyc2VyID0gcm91dGUgPT4ge1xuICAgICAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbltpXS5sb2FkQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5mb3VuZExhenlNb2R1bGVXaXRoUGF0aChyb3V0ZS5jaGlsZHJlbltpXS5sb2FkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlOiBSb3V0aW5nR3JhcGhOb2RlID0gXy5maW5kKHRoaXMuY2xlYW5Nb2R1bGVzVHJlZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfcmF3TW9kdWxlOiBSb3V0aW5nR3JhcGhOb2RlID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5raW5kID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUubW9kdWxlID0gbW9kdWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEluc2lkZU1vZHVsZShtb2R1bGUsIF9yYXdNb2R1bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW5baV0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5jaGlsZHJlbltpXS5jaGlsZHJlbi5wdXNoKF9yYXdNb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbltpXS5sb2FkQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuZm91bmRMYXp5Q29tcG9uZW50V2l0aFBhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW5baV0ubG9hZENvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmNoaWxkcmVuW2ldLmNvbXBvbmVudCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxvb3BSb3V0ZXNQYXJzZXIocm91dGUuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbG9vcFJvdXRlc1BhcnNlcihjbGVhbmVkUm91dGVzVHJlZSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFuZWRSb3V0ZXNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RNb2R1bGVzVHJlZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ2V0TmVzdGVkQ2hpbGRyZW4gPSAoYXJyLCBwYXJlbnQ/KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBhcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJyW2ldLnBhcmVudCA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0TmVzdGVkQ2hpbGRyZW4oYXJyLCBhcnJbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycltpXS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKGFycltpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTY2FuIGVhY2ggbW9kdWxlIGFuZCBhZGQgcGFyZW50IHByb3BlcnR5XG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLm1vZHVsZXMsIGZpcnN0TG9vcE1vZHVsZSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2goZmlyc3RMb29wTW9kdWxlLmltcG9ydHNOb2RlLCBpbXBvcnROb2RlID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5tb2R1bGVzLCBtb2R1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlLm5hbWUgPT09IGltcG9ydE5vZGUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnBhcmVudCA9IGZpcnN0TG9vcE1vZHVsZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlc1RyZWUgPSBnZXROZXN0ZWRDaGlsZHJlbih0aGlzLm1vZHVsZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZVJvdXRlc0luZGV4KG91dHB1dEZvbGRlcjogc3RyaW5nLCByb3V0ZXM6IEFycmF5PGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KF9fZGlybmFtZSArICcvLi4vc3JjL3RlbXBsYXRlcy9wYXJ0aWFscy9yb3V0ZXMtaW5kZXguaGJzJykudGhlbihcbiAgICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlOiBhbnkgPSBIYW5kbGViYXJzLmNvbXBpbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGVtcGxhdGUoe1xuICAgICAgICAgICAgICAgICAgICByb3V0ZXM6IEpTT04uc3RyaW5naWZ5KHJvdXRlcylcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0T3V0cHV0RGlyID0gb3V0cHV0Rm9sZGVyLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRlc3RPdXRwdXREaXIgJiYgdGVzdE91dHB1dERpci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlci5yZXBsYWNlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxlRW5naW5lLndyaXRlKFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIgKyBwYXRoLnNlcCArICcvanMvcm91dGVzL3JvdXRlc19pbmRleC5qcycsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX2VyciA9PiBQcm9taXNlLnJlamVjdCgnRXJyb3IgZHVyaW5nIHJvdXRlcyBpbmRleCBnZW5lcmF0aW9uJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcm91dGVzTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBfbiA9IDA7XG4gICAgICAgIGNvbnN0IHJvdXRlc1BhcnNlciA9IHJvdXRlID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGUucGF0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBfbiArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBqIGluIHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdXRlc1BhcnNlcihyb3V0ZS5jaGlsZHJlbltqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiB0aGlzLnJvdXRlcykge1xuICAgICAgICAgICAgcm91dGVzUGFyc2VyKHRoaXMucm91dGVzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJpbnRSb3V0ZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3ByaW50Um91dGVzOiAnKTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5yb3V0ZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmludE1vZHVsZXNSb3V0ZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3ByaW50TW9kdWxlc1JvdXRlczogJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1ZhcmlhYmxlUm91dGVzKG5vZGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QgJiYgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLnR5cGUudHlwZU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS50eXBlLnR5cGVOYW1lLnRleHQgPT09ICdSb3V0ZXMnXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkZpbGVJZGVudGlmaWVycyhzb3VyY2VGaWxlOiBTb3VyY2VGaWxlKTogU291cmNlRmlsZSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBzb3VyY2VGaWxlO1xuICAgICAgICBjb25zdCBpZGVudGlmaWVycyA9IGZpbGUuZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5JZGVudGlmaWVyKS5maWx0ZXIocCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIE5vZGUuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKHAuZ2V0UGFyZW50T3JUaHJvdygpKSB8fFxuICAgICAgICAgICAgICAgIE5vZGUuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocC5nZXRQYXJlbnRPclRocm93KCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpZGVudGlmaWVyc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgaWRlbnRpZmllcnMpIHtcbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGVpciBwYXJlbnRzIG5vZGVzLCBhbmQgaWYgb25lIGlzIGEgdmFyaWFibGVTdGF0ZW1lbnQgYW5kID09PSAncm91dGVzJ1xuICAgICAgICAgICAgbGV0IGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlkZW50aWZpZXIuZ2V0UGFyZW50V2hpbGUobiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG4uZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLlZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFyaWFibGVSb3V0ZXMobi5jb21waWxlck5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQucHVzaChpZGVudGlmaWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlubGluZSB0aGUgcHJvcGVydHkgYWNjZXNzIGV4cHJlc3Npb25zXG4gICAgICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiBpZGVudGlmaWVyc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXJEZWNsYXJhdGlvbiA9IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAuZ2V0U3ltYm9sT3JUaHJvdygpXG4gICAgICAgICAgICAgICAgLmdldFZhbHVlRGVjbGFyYXRpb25PclRocm93KCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIU5vZGUuaXNQcm9wZXJ0eUFzc2lnbm1lbnQoaWRlbnRpZmllckRlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICFOb2RlLmlzVmFyaWFibGVEZWNsYXJhdGlvbihpZGVudGlmaWVyRGVjbGFyYXRpb24pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBOb3QgaW1wbGVtZW50ZWQgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbiBraW5kOiAke2lkZW50aWZpZXJEZWNsYXJhdGlvbi5nZXRLaW5kTmFtZSgpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE5vZGUuaXNWYXJpYWJsZURlY2xhcmF0aW9uKGlkZW50aWZpZXJEZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyLnJlcGxhY2VXaXRoVGV4dChpZGVudGlmaWVyRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXJPclRocm93KCkuZ2V0VGV4dCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkZpbGVTcHJlYWRzKHNvdXJjZUZpbGU6IFNvdXJjZUZpbGUpOiBTb3VyY2VGaWxlIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IHNwcmVhZEVsZW1lbnRzID0gZmlsZVxuICAgICAgICAgICAgLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuU3ByZWFkRWxlbWVudClcbiAgICAgICAgICAgIC5maWx0ZXIocCA9PiBOb2RlLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihwLmdldFBhcmVudE9yVGhyb3coKSkpO1xuXG4gICAgICAgIGNvbnN0IHNwcmVhZEVsZW1lbnRzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3ByZWFkRWxlbWVudCBvZiBzcHJlYWRFbGVtZW50cykge1xuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZWlyIHBhcmVudHMgbm9kZXMsIGFuZCBpZiBvbmUgaXMgYSB2YXJpYWJsZVN0YXRlbWVudCBhbmQgPT09ICdyb3V0ZXMnXG4gICAgICAgICAgICBsZXQgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgc3ByZWFkRWxlbWVudC5nZXRQYXJlbnRXaGlsZShuID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobi5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYXJpYWJsZVJvdXRlcyhuLmNvbXBpbGVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgIHNwcmVhZEVsZW1lbnRzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudC5wdXNoKHNwcmVhZEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5saW5lIHRoZSBBcnJheUxpdGVyYWxFeHByZXNzaW9uIFNwcmVhZEVsZW1lbnRzXG4gICAgICAgIGZvciAoY29uc3Qgc3ByZWFkRWxlbWVudCBvZiBzcHJlYWRFbGVtZW50c0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBzcHJlYWRFbGVtZW50SWRlbnRpZmllciA9IHNwcmVhZEVsZW1lbnQuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKSxcbiAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCxcbiAgICAgICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzSW5JbXBvcnRzID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgaXQgaW4gaW1wb3J0c1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgICAgIGltcG9ydHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZWRJbXBvcnRzTGVuZ3RoID0gbmFtZWRJbXBvcnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGo7IGogPCBuYW1lZEltcG9ydHNMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydE5hbWUgPSBuYW1lZEltcG9ydHNbal0uZ2V0TmFtZU5vZGUoKS5nZXRUZXh0KCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXMgPSBuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gc3ByZWFkRWxlbWVudElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhc0luSW1wb3J0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydEFsaWFzID09PSBzcHJlYWRFbGVtZW50SWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzSW5JbXBvcnRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgcmVmZXJlbmNlZERlY2xhcmF0aW9uO1xuXG4gICAgICAgICAgICBpZiAoZm91bmRXaXRoQWxpYXNJbkltcG9ydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZVBhdGhJc0JhZCA9IHBhdGggPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zY2FubmVkRmlsZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZSA9PiBwYXRoID09PSBzY2FubmVkRmlsZS5wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0SW5kaWNlc09mID0gKHNlYXJjaFN0ciwgc3RyLCBjYXNlU2Vuc2l0aXZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hTdHJMZW4gPSBzZWFyY2hTdHIubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaFN0ckxlbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFN0ciA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0ciwgc3RhcnRJbmRleCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleCArIHNlYXJjaFN0ckxlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRpY2VzO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpck5hbWVQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGUuZ2V0RmlsZVBhdGgoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaGVkSW1wb3J0UGF0aCA9IHNlYXJjaGVkSW1wb3J0LmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlYWRpbmdGaWxlUGF0aCA9IHNlYXJjaGVkSW1wb3J0UGF0aC5zcGxpdCgnLycpLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJOYW1lUGF0aCArICcvJyArIHNlYXJjaGVkSW1wb3J0LmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkgKyAnLnRzJ1xuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVBhdGhJc0JhZChpbXBvcnRQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVhZGluZ0luZGljZXMgPSBnZXRJbmRpY2VzT2YobGVhZGluZ0ZpbGVQYXRoLCBpbXBvcnRQYXRoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nSW5kaWNlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVzdGVkIHJvdXRlIGZpeGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGxlYWRpbmdJbmRpY2VzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gbGVhZGluZ0luZGljZXNbbGVhZGluZ0luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFBhdGguc2xpY2UoMCwgc3RhcnRJbmRleCkgKyBpbXBvcnRQYXRoLnNsaWNlKGVuZEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9wIGxldmVsIHJvdXRlIGZpeGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShkaXJOYW1lUGF0aCkgKyAnLycgKyBzZWFyY2hlZEltcG9ydFBhdGggKyAnLnRzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlSW1wb3J0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aChpbXBvcnRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IGZvdW5kV2l0aEFsaWFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhbGlhc09yaWdpbmFsTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3ByZWFkRWxlbWVudElkZW50aWZpZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkRGVjbGFyYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVJbXBvcnQuZ2V0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHRyeSBkaXJlY3RseSBpbiBmaWxlXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZERlY2xhcmF0aW9uID0gc3ByZWFkRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAuZ2V0RXhwcmVzc2lvbigpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRTeW1ib2xPclRocm93KClcbiAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlRGVjbGFyYXRpb25PclRocm93KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghTm9kZS5pc1ZhcmlhYmxlRGVjbGFyYXRpb24ocmVmZXJlbmNlZERlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYE5vdCBpbXBsZW1lbnRlZCByZWZlcmVuY2VkIGRlY2xhcmF0aW9uIGtpbmQ6ICR7cmVmZXJlbmNlZERlY2xhcmF0aW9uLmdldEtpbmROYW1lKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZWRBcnJheSA9IHJlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplcklmS2luZE9yVGhyb3coXG4gICAgICAgICAgICAgICAgU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgc3ByZWFkRWxlbWVudEFycmF5ID0gc3ByZWFkRWxlbWVudC5nZXRQYXJlbnRJZktpbmRPclRocm93KFxuICAgICAgICAgICAgICAgIFN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gc3ByZWFkRWxlbWVudEFycmF5LmdldEVsZW1lbnRzKCkuaW5kZXhPZihzcHJlYWRFbGVtZW50KTtcbiAgICAgICAgICAgIHNwcmVhZEVsZW1lbnRBcnJheS5yZW1vdmVFbGVtZW50KHNwcmVhZEVsZW1lbnQpO1xuICAgICAgICAgICAgc3ByZWFkRWxlbWVudEFycmF5Lmluc2VydEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgIGluc2VydEluZGV4LFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRBcnJheS5nZXRFbGVtZW50cygpLm1hcChlID0+IGUuZ2V0VGV4dCgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkZpbGVEeW5hbWljcyhzb3VyY2VGaWxlOiBTb3VyY2VGaWxlKTogU291cmNlRmlsZSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBzb3VyY2VGaWxlO1xuXG4gICAgICAgIGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbnMgPSBmaWxlXG4gICAgICAgICAgICAuZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24pXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gIU5vZGUuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24ocC5nZXRQYXJlbnRPclRocm93KCkpKTtcblxuICAgICAgICBjb25zdCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25zSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uIG9mIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGVpciBwYXJlbnRzIG5vZGVzLCBhbmQgaWYgb25lIGlzIGEgdmFyaWFibGVTdGF0ZW1lbnQgYW5kID09PSAncm91dGVzJ1xuICAgICAgICAgICAgbGV0IGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5nZXRQYXJlbnRXaGlsZShuID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobi5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYXJpYWJsZVJvdXRlcyhuLmNvbXBpbGVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbnNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50LnB1c2gocHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlubGluZSB0aGUgcHJvcGVydHkgYWNjZXNzIGV4cHJlc3Npb25zXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uIG9mIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbnNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25Ob2RlTmFtZSA9IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5nZXROYW1lTm9kZSgpO1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbk5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uTm9kZU5hbWVTeW1ib2wgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uTm9kZU5hbWUuZ2V0U3ltYm9sKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbk5vZGVOYW1lU3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VkRGVjbGFyYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbk5vZGVOYW1lU3ltYm9sLmdldFZhbHVlRGVjbGFyYXRpb25PclRocm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIU5vZGUuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocmVmZXJlbmNlZERlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFOb2RlLmlzRW51bU1lbWJlcihyZWZlcmVuY2VkRGVjbGFyYXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgaW1wbGVtZW50ZWQgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbiBraW5kOiAke3JlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRLaW5kTmFtZSgpfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWZlcmVuY2VkRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXJPclRocm93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbi5yZXBsYWNlV2l0aFRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplck9yVGhyb3coKS5nZXRUZXh0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHN5bWJvbCBpcyBudWxsL3VuZGVmaW5lZCwganVzdCBza2lwIHRoaXMgcHJvcGVydHkgYWNjZXNzIGV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdyYWNlZnVsbHkgaGFuZGxlIGNhc2VzIHdoZXJlIHN5bWJvbHMgY2Fubm90IGJlIHJlc29sdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgY29tbW9uIHdpdGggZHluYW1pYyBpbXBvcnRzIGFuZCBvdGhlciBydW50aW1lIGV4cHJlc3Npb25zXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIGp1c3Qgc2tpcCBwcm9jZXNzaW5nIHRoaXMgcHJvcGVydHkgYWNjZXNzIGV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVwbGFjZSBjYWxsZXhwcmVzc2lvbnMgd2l0aCBzdHJpbmcgOiB1dGlscy5kb1dvcmsoKSAtPiAndXRpbHMuZG9Xb3JrKCknIGRvV29yaygpIC0+ICdkb1dvcmsoKSdcbiAgICAgKiBAcGFyYW0gc291cmNlRmlsZSB0cy5Tb3VyY2VGaWxlXG4gICAgICovXG4gICAgcHVibGljIGNsZWFuQ2FsbEV4cHJlc3Npb25zKHNvdXJjZUZpbGU6IFNvdXJjZUZpbGUpOiBTb3VyY2VGaWxlIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHNvdXJjZUZpbGU7XG5cbiAgICAgICAgLy8gRmluZCBhbGwgdmFyaWFibGUgZGVjbGFyYXRpb25zIHdpdGggUm91dGVzIHR5cGVcbiAgICAgICAgY29uc3QgdmFyaWFibGVEZWNsYXJhdGlvbnMgPSBzb3VyY2VGaWxlLmdldFZhcmlhYmxlRGVjbGFyYXRpb25zKCk7XG4gICAgICAgIGNvbnN0IHJvdXRlc1ZhcmlhYmxlRGVjbGFyYXRpb25zID0gdmFyaWFibGVEZWNsYXJhdGlvbnMuZmlsdGVyKHYgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHYuY29tcGlsZXJOb2RlLnR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgIT09ICd1bmRlZmluZWQnICYmIHRzLmlzVHlwZVJlZmVyZW5jZU5vZGUodHlwZSkgJiYgdHlwZW9mIHR5cGUudHlwZU5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlLnR5cGVOYW1lIGFzIHRzLklkZW50aWZpZXIpLnRleHQgPT09ICdSb3V0ZXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGlmIChyb3V0ZXNWYXJpYWJsZURlY2xhcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvY2VzcyBhbGwgUm91dGVzIHZhcmlhYmxlIGRlY2xhcmF0aW9uc1xuICAgICAgICBmb3IgKGNvbnN0IHZhcmlhYmxlRGVjbGFyYXRpb24gb2Ygcm91dGVzVmFyaWFibGVEZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxpemVyID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplcigpO1xuICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxFeHByIG9mIGluaXRpYWxpemVyLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuQ2FsbEV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxFeHByLndhc0ZvcmdvdHRlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsRXhwci5yZXBsYWNlV2l0aFRleHQod3JpdGVyID0+IHdyaXRlci5xdW90ZShjYWxsRXhwci5nZXRUZXh0KCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFuIHJvdXRlcyBkZWZpbml0aW9uIHdpdGggaW1wb3J0ZWQgZGF0YSwgZm9yIGV4YW1wbGUgcGF0aCwgY2hpbGRyZW4sIG9yIGR5bmFtaWMgc3R1ZmYgaW5zaWRlIGRhdGFcbiAgICAgKlxuICAgICAqIGNvbnN0IE1ZX1JPVVRFUzogUm91dGVzID0gW1xuICAgICAqICAgICB7XG4gICAgICogICAgICAgICBwYXRoOiAnaG9tZScsXG4gICAgICogICAgICAgICBjb21wb25lbnQ6IEhvbWVDb21wb25lbnRcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgcGF0aDogUEFUSFMuaG9tZSxcbiAgICAgKiAgICAgICAgIGNvbXBvbmVudDogSG9tZUNvbXBvbmVudFxuICAgICAqICAgICB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIFRoZSBpbml0aWFsaXplciBpcyBhbiBhcnJheSAoQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiAtIDE3NyApLCBpdCBoYXMgZWxlbWVudHMsIG9iamVjdHMgKE9iamVjdExpdGVyYWxFeHByZXNzaW9uIC0gMTc4KVxuICAgICAqIHdpdGggcHJvcGVydGllcyAoUHJvcGVydHlBc3NpZ25tZW50IC0gMjYxKVxuICAgICAqXG4gICAgICogRm9yIGVhY2gga25vdyBwcm9wZXJ0eSAoaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9yb3V0ZXIvUm91dGVzI2Rlc2NyaXB0aW9uKSwgd2UgdHJ5IHRvIHNlZSBpZiB3ZSBoYXZlIHdoYXQgd2Ugd2FudFxuICAgICAqXG4gICAgICogRXg6IHBhdGggYW5kIHBhdGhNYXRjaCB3YW50IGEgc3RyaW5nLCBjb21wb25lbnQgYSBjb21wb25lbnQgcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogSXQgaXMgYW4gaW1wZXJhdGl2ZSBhcHByb2FjaCwgbm90IGEgZ2VuZXJpYyB3YXksIHBhcnNpbmcgYWxsIHRoZSB0cmVlXG4gICAgICogYW5kIGZpbmQgc29tZXRoaW5nIGxpa2UgdGhpcyB3aGljaCB3aWxsbCBicmVhayBKU09OLnN0cmluZ2lmeSA6IE1ZSU1QT1JULnBhdGhcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3RzLk5vZGV9IGluaXRpYWxpemVyIFRoZSBub2RlIG9mIHJvdXRlcyBkZWZpbml0aW9uXG4gICAgICogQHJldHVybiB7dHMuTm9kZX0gICAgICAgICAgICAgVGhlIGVkaXRlZCBub2RlXG4gICAgICovXG4gICAgcHVibGljIGNsZWFuUm91dGVzRGVmaW5pdGlvbldpdGhJbXBvcnQoXG4gICAgICAgIGluaXRpYWxpemVyOiB0cy5BcnJheUxpdGVyYWxFeHByZXNzaW9uLFxuICAgICAgICBub2RlOiB0cy5Ob2RlLFxuICAgICAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogdHMuTm9kZSB7XG5cbiAgICAgICAgaW5pdGlhbGl6ZXIuZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQucHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eTogdHMuUHJvcGVydHlBc3NpZ25tZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIgPSBwcm9wZXJ0eS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXRoJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVkaXJlY3RUbyc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ291dGxldCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BhdGhNYXRjaCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluaXRpYWxpemVyLmtpbmQgIT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmaWVyKDcxKSB3b24ndCBicmVhayBwYXJzaW5nLCBidXQgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gcmV0cml2ZSB0aGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbigxNzkpIGV4OiBNWUlNUE9SVC5wYXRoIHdpbGwgYnJlYWsgaXQsIGZpbmQgaXQgaW4gaW1wb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKHByb3BlcnR5SW5pdGlhbGl6ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RPYmplY3RMaXRlcmFsQXR0cmlidXRlTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIubmFtZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RPYmplY3RMaXRlcmFsQXR0cmlidXRlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluaXRpYWxpemVyLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbml0aWFsaXplci5leHByZXNzaW9uLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRzVXRpbC5maW5kUHJvcGVydHlWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0T2JqZWN0TGl0ZXJhbEF0dHJpYnV0ZU5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnR5SW5pdGlhbGl6ZXIgYXMgYW55KS5raW5kID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnR5SW5pdGlhbGl6ZXIgYXMgYW55KS50ZXh0ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluaXRpYWxpemVyO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUm91dGVyUGFyc2VyVXRpbC5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vZHVsZVdpdGhQcm92aWRlcnMobm9kZTogdHMuVmFyaWFibGVTdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0KSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMgJiYgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMgPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMsXG4gICAgICAgICAgICAgICAgbGVuID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbGFyYXRpb24gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZTogdHMuVHlwZVJlZmVyZW5jZU5vZGUgPSBkZWNsYXJhdGlvbi50eXBlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSB0eXBlLnR5cGVOYW1lLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnTW9kdWxlV2l0aFByb3ZpZGVycycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJpbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZVdpdGhQcm92aWRlcnMobm9kZTogdHMuVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdCkge1xuICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zICYmIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICAgICAgbGVuID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbGFyYXRpb24gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZTogdHMuVHlwZVJlZmVyZW5jZU5vZGUgPSBkZWNsYXJhdGlvbi50eXBlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSB0eXBlLnR5cGVOYW1lLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnTW9kdWxlV2l0aFByb3ZpZGVycycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWNsYXJhdGlvbi5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5jb25zdCBmZyA9IHJlcXVpcmUoJ2Zhc3QtZ2xvYicpO1xuXG4vKipcbiAqIFJlc3VsdCBvZiBwYXJzaW5nIHB1YmxpYyBBUEkgZXhwb3J0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1YmxpY0FwaUV4cG9ydHMge1xuICAgIC8vIE1hcCBvZiBzeW1ib2wgbmFtZSB0byB0aGUgc291cmNlIGRlY2xhcmF0aW9uIGZpbGUgcGF0aHMgd2hlcmUgaXQncyBleHBvcnRlZFxuICAgIHN5bWJvbFRvRmlsZXM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PjtcbiAgICAvLyBTZXQgb2YgYWxsIGluZGV4LmQudHMgZmlsZXMgZm91bmRcbiAgICBpbmRleEZpbGVzOiBTZXQ8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciBwYXJzaW5nIGluZGV4LmQudHMgZmlsZXMgdG8gZXh0cmFjdCBwdWJsaWMgQVBJIGV4cG9ydHNcbiAqL1xuZXhwb3J0IGNsYXNzIFB1YmxpY0FwaVBhcnNlciB7XG4gICAgcHJpdmF0ZSBkaXN0UGF0aDogc3RyaW5nO1xuICAgIHByaXZhdGUgc3ltYm9sVG9GaWxlczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+O1xuICAgIHByaXZhdGUgaW5kZXhGaWxlczogU2V0PHN0cmluZz47XG4gICAgcHJpdmF0ZSBwcm9jZXNzZWRGaWxlczogU2V0PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3RvcihkaXN0UGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZGlzdFBhdGggPSBwYXRoLnJlc29sdmUoZGlzdFBhdGgpO1xuICAgICAgICB0aGlzLnN5bWJvbFRvRmlsZXMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gICAgICAgIHRoaXMuaW5kZXhGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZEZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgYWxsIGluZGV4LmQudHMgZmlsZXMgaW4gdGhlIGRpc3QgZm9sZGVyIGFuZCBleHRyYWN0IGV4cG9ydGVkIHN5bWJvbHNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGFyc2VJbmRleEZpbGVzKCk6IFByb21pc2U8UHVibGljQXBpRXhwb3J0cz4ge1xuICAgICAgICBsb2dnZXIuaW5mbyhgU2Nhbm5pbmcgZm9yIGluZGV4LmQudHMgZmlsZXMgaW4gJHt0aGlzLmRpc3RQYXRofWApO1xuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmRpc3RQYXRoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBQdWJsaWMgQVBJIGRpc3QgcGF0aCBkb2VzIG5vdCBleGlzdDogJHt0aGlzLmRpc3RQYXRofWApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xUb0ZpbGVzOiB0aGlzLnN5bWJvbFRvRmlsZXMsXG4gICAgICAgICAgICAgICAgaW5kZXhGaWxlczogdGhpcy5pbmRleEZpbGVzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCBhbGwgaW5kZXguZC50cyBmaWxlcyByZWN1cnNpdmVseVxuICAgICAgICBjb25zdCBwYXR0ZXJuID0gcGF0aC5qb2luKHRoaXMuZGlzdFBhdGgsICcqKi9pbmRleC5kLnRzJyk7XG4gICAgICAgIGNvbnN0IGluZGV4RmlsZXMgPSBhd2FpdCBmZyhwYXR0ZXJuLCB7XG4gICAgICAgICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXVxuICAgICAgICB9KTtcblxuICAgICAgICBsb2dnZXIuaW5mbyhgRm91bmQgJHtpbmRleEZpbGVzLmxlbmd0aH0gaW5kZXguZC50cyBmaWxlKHMpYCk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoIGluZGV4LmQudHMgZmlsZVxuICAgICAgICBmb3IgKGNvbnN0IGluZGV4RmlsZSBvZiBpbmRleEZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4RmlsZXMuYWRkKGluZGV4RmlsZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBhcnNlSW5kZXhGaWxlKGluZGV4RmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuaW5mbyhgRXh0cmFjdGVkICR7dGhpcy5zeW1ib2xUb0ZpbGVzLnNpemV9IHB1YmxpYyBBUEkgc3ltYm9sKHMpYCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN5bWJvbFRvRmlsZXM6IHRoaXMuc3ltYm9sVG9GaWxlcyxcbiAgICAgICAgICAgIGluZGV4RmlsZXM6IHRoaXMuaW5kZXhGaWxlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGEgc2luZ2xlIGluZGV4LmQudHMgZmlsZSBhbmQgZXh0cmFjdCBpdHMgZXhwb3J0c1xuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcGFyc2VJbmRleEZpbGUoaW5kZXhGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3NlZEZpbGVzLmhhcyhpbmRleEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBBdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXNcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2Nlc3NlZEZpbGVzLmFkZChpbmRleEZpbGVQYXRoKTtcblxuICAgICAgICBsb2dnZXIuZGVidWcoYFBhcnNpbmcgaW5kZXggZmlsZTogJHtpbmRleEZpbGVQYXRofWApO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZVRleHQgPSBmcy5yZWFkRmlsZVN5bmMoaW5kZXhGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgICAgICAgICAgaW5kZXhGaWxlUGF0aCxcbiAgICAgICAgICAgIHNvdXJjZVRleHQsXG4gICAgICAgICAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgYWxsIHRvcC1sZXZlbCBzdGF0ZW1lbnRzIGluIHRoZSBmaWxlXG4gICAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHNvdXJjZUZpbGUuc3RhdGVtZW50cykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU3RhdGVtZW50KHN0YXRlbWVudCwgaW5kZXhGaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGEgVHlwZVNjcmlwdCBzdGF0ZW1lbnQgdG8gZXh0cmFjdCBleHBvcnRzXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzU3RhdGVtZW50KHN0YXRlbWVudDogdHMuTm9kZSwgc291cmNlRmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBIYW5kbGU6IGV4cG9ydCB7IEZvbywgQmFyIH0gZnJvbSAnLi9tb2R1bGUnXG4gICAgICAgIC8vIEhhbmRsZTogZXhwb3J0IHsgRm9vIH1cbiAgICAgICAgaWYgKHRzLmlzRXhwb3J0RGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzRXhwb3J0RGVjbGFyYXRpb24oc3RhdGVtZW50LCBzb3VyY2VGaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgY2xhc3MgRm9vIHt9XG4gICAgICAgIC8vIEhhbmRsZTogZXhwb3J0IGludGVyZmFjZSBCYXIge31cbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgY29uc3QgYmF6ID0gLi4uXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaGFzRXhwb3J0TW9kaWZpZXIoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGlyZWN0RXhwb3J0KHN0YXRlbWVudCwgc291cmNlRmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZTogZXhwb3J0IGRlZmF1bHQgRm9vXG4gICAgICAgIGVsc2UgaWYgKHRzLmlzRXhwb3J0QXNzaWdubWVudChzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NFeHBvcnRBc3NpZ25tZW50KHN0YXRlbWVudCwgc291cmNlRmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBleHBvcnQgZGVjbGFyYXRpb25zIGxpa2U6IGV4cG9ydCB7IEZvbywgQmFyIH0gZnJvbSAnLi9tb2R1bGUnXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzRXhwb3J0RGVjbGFyYXRpb24oXG4gICAgICAgIHN0YXRlbWVudDogdHMuRXhwb3J0RGVjbGFyYXRpb24sXG4gICAgICAgIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZXhwb3J0Q2xhdXNlID0gc3RhdGVtZW50LmV4cG9ydENsYXVzZTtcblxuICAgICAgICAvLyBIYW5kbGU6IGV4cG9ydCAqIGZyb20gJy4vbW9kdWxlJ1xuICAgICAgICBpZiAoIWV4cG9ydENsYXVzZSAmJiBzdGF0ZW1lbnQubW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NSZUV4cG9ydEFsbChzdGF0ZW1lbnQsIHNvdXJjZUZpbGVQYXRoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZTogZXhwb3J0ICogYXMgbmFtZXNwYWNlIGZyb20gJy4vbW9kdWxlJ1xuICAgICAgICBpZiAoZXhwb3J0Q2xhdXNlICYmIHRzLmlzTmFtZXNwYWNlRXhwb3J0KGV4cG9ydENsYXVzZSkpIHtcbiAgICAgICAgICAgIC8vIFdlIHRyYWNrIHRoZSBuYW1lc3BhY2UgbmFtZSBhcyBhbiBleHBvcnRlZCBzeW1ib2xcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZU5hbWUgPSBleHBvcnRDbGF1c2UubmFtZS50ZXh0O1xuICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2wobmFtZXNwYWNlTmFtZSwgc291cmNlRmlsZVBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgeyBGb28sIEJhciB9IG9yIGV4cG9ydCB7IEZvbywgQmFyIH0gZnJvbSAnLi9tb2R1bGUnXG4gICAgICAgIGlmIChleHBvcnRDbGF1c2UgJiYgdHMuaXNOYW1lZEV4cG9ydHMoZXhwb3J0Q2xhdXNlKSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBleHBvcnRDbGF1c2UuZWxlbWVudHM7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9ydGVkTmFtZSA9IGVsZW1lbnQubmFtZS50ZXh0O1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIG1vZHVsZSBzcGVjaWZpZXIsIHJlc29sdmUgdGhlIHJlLWV4cG9ydFxuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQubW9kdWxlU3BlY2lmaWVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChzdGF0ZW1lbnQubW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVQYXRoID0gc3RhdGVtZW50Lm1vZHVsZVNwZWNpZmllci50ZXh0O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc29sdmVSZUV4cG9ydChleHBvcnRlZE5hbWUsIG1vZHVsZVBhdGgsIHNvdXJjZUZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgZXhwb3J0IGZyb20gdGhpcyBmaWxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU3ltYm9sKGV4cG9ydGVkTmFtZSwgc291cmNlRmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgZGlyZWN0IGV4cG9ydHMgbGlrZTogZXhwb3J0IGNsYXNzIEZvbyB7fVxuICAgICAqL1xuICAgIHByaXZhdGUgcHJvY2Vzc0RpcmVjdEV4cG9ydChzdGF0ZW1lbnQ6IHRzLk5vZGUsIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbGV0IHN5bWJvbE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodHMuaXNDbGFzc0RlY2xhcmF0aW9uKHN0YXRlbWVudCkgJiYgc3RhdGVtZW50Lm5hbWUpIHtcbiAgICAgICAgICAgIHN5bWJvbE5hbWUgPSBzdGF0ZW1lbnQubmFtZS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzSW50ZXJmYWNlRGVjbGFyYXRpb24oc3RhdGVtZW50KSAmJiBzdGF0ZW1lbnQubmFtZSkge1xuICAgICAgICAgICAgc3ltYm9sTmFtZSA9IHN0YXRlbWVudC5uYW1lLnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNGdW5jdGlvbkRlY2xhcmF0aW9uKHN0YXRlbWVudCkgJiYgc3RhdGVtZW50Lm5hbWUpIHtcbiAgICAgICAgICAgIHN5bWJvbE5hbWUgPSBzdGF0ZW1lbnQubmFtZS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgY29uc3QgZm9vID0gLi4uXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN0YXRlbWVudC5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcihkZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xOYW1lID0gZGVjbGFyYXRpb24ubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFN5bWJvbChzeW1ib2xOYW1lLCBzb3VyY2VGaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24oc3RhdGVtZW50KSAmJiBzdGF0ZW1lbnQubmFtZSkge1xuICAgICAgICAgICAgc3ltYm9sTmFtZSA9IHN0YXRlbWVudC5uYW1lLnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNFbnVtRGVjbGFyYXRpb24oc3RhdGVtZW50KSAmJiBzdGF0ZW1lbnQubmFtZSkge1xuICAgICAgICAgICAgc3ltYm9sTmFtZSA9IHN0YXRlbWVudC5uYW1lLnRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ltYm9sTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2woc3ltYm9sTmFtZSwgc291cmNlRmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBleHBvcnQgYXNzaWdubWVudHM6IGV4cG9ydCBkZWZhdWx0IEZvb1xuICAgICAqL1xuICAgIHByaXZhdGUgcHJvY2Vzc0V4cG9ydEFzc2lnbm1lbnQoXG4gICAgICAgIHN0YXRlbWVudDogdHMuRXhwb3J0QXNzaWdubWVudCxcbiAgICAgICAgc291cmNlRmlsZVBhdGg6IHN0cmluZ1xuICAgICk6IHZvaWQge1xuICAgICAgICAvLyBUcmFjayBkZWZhdWx0IGV4cG9ydHMgd2l0aCBhIHNwZWNpYWwgbWFya2VyXG4gICAgICAgIHRoaXMuYWRkU3ltYm9sKCdkZWZhdWx0Jywgc291cmNlRmlsZVBhdGgpO1xuXG4gICAgICAgIC8vIElmIHRoZSBkZWZhdWx0IGV4cG9ydCBpcyBhbiBpZGVudGlmaWVyLCBhbHNvIHRyYWNrIHRoYXQgc3ltYm9sXG4gICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIoc3RhdGVtZW50LmV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xOYW1lID0gc3RhdGVtZW50LmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgIHRoaXMuYWRkU3ltYm9sKHN5bWJvbE5hbWUsIHNvdXJjZUZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgcmUtZXhwb3J0IGFsbDogZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUnXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzUmVFeHBvcnRBbGwoXG4gICAgICAgIHN0YXRlbWVudDogdHMuRXhwb3J0RGVjbGFyYXRpb24sXG4gICAgICAgIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFzdGF0ZW1lbnQubW9kdWxlU3BlY2lmaWVyIHx8ICF0cy5pc1N0cmluZ0xpdGVyYWwoc3RhdGVtZW50Lm1vZHVsZVNwZWNpZmllcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBzdGF0ZW1lbnQubW9kdWxlU3BlY2lmaWVyLnRleHQ7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHRoaXMucmVzb2x2ZU1vZHVsZVBhdGgobW9kdWxlUGF0aCwgc291cmNlRmlsZVBhdGgpO1xuXG4gICAgICAgIGlmIChyZXNvbHZlZFBhdGggJiYgZnMuZXhpc3RzU3luYyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgICAgICAgICAvLyBQYXJzZSB0aGUgcmUtZXhwb3J0ZWQgZmlsZSB0byBnZXQgaXRzIGV4cG9ydHNcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGFyc2VJbmRleEZpbGUocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgYSByZS1leHBvcnRlZCBzeW1ib2wgdG8gaXRzIGRlY2xhcmF0aW9uIGZpbGVcbiAgICAgKiBcbiAgICAgKiBOb3RlOiBXZSBpbnRlbnRpb25hbGx5IGRvIE5PVCBwYXJzZSB0aGUgcmVzb2x2ZWQgZmlsZSBhcyBhbiBpbmRleCBmaWxlLlxuICAgICAqIE9ubHkgc3ltYm9scyBleHBsaWNpdGx5IHJlLWV4cG9ydGVkIHZpYSBgZXhwb3J0IHsgWCB9IGZyb20gJy4vbW9kdWxlJ2AgaW4gYW5cbiAgICAgKiBpbmRleC5kLnRzIHNob3VsZCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuIERpcmVjdCBleHBvcnRzIGZyb21cbiAgICAgKiBtb2R1bGUgZmlsZXMgKGxpa2UgYGV4cG9ydCBjb25zdCBBUElfUk9PVGApIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgdW5sZXNzXG4gICAgICogdGhleSBhcmUgZXhwbGljaXRseSByZS1leHBvcnRlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHJlc29sdmVSZUV4cG9ydChcbiAgICAgICAgc3ltYm9sTmFtZTogc3RyaW5nLFxuICAgICAgICBtb2R1bGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmdcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gdGhpcy5yZXNvbHZlTW9kdWxlUGF0aChtb2R1bGVQYXRoLCBzb3VyY2VGaWxlUGF0aCk7XG5cbiAgICAgICAgaWYgKHJlc29sdmVkUGF0aCAmJiBmcy5leGlzdHNTeW5jKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSBzeW1ib2wgaXMgZXhwb3J0ZWQgZnJvbSB0aGUgcmVzb2x2ZWQgZGVjbGFyYXRpb24gZmlsZVxuICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2woc3ltYm9sTmFtZSwgcmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICAgIC8vIERvIE5PVCBwYXJzZSB0aGUgcmVzb2x2ZWQgZmlsZSAtIG9ubHkgdHJhY2sgdGhlIHNwZWNpZmljIHN5bWJvbCBiZWluZyByZS1leHBvcnRlZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ291bGQgbm90IHJlc29sdmUsIGFzc3VtZSBpdCdzIGZyb20gdGhlIGN1cnJlbnQgZmlsZVxuICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2woc3ltYm9sTmFtZSwgc291cmNlRmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBhIG1vZHVsZSBwYXRoIHRvIGFuIGFic29sdXRlIC5kLnRzIGZpbGUgcGF0aFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZU1vZHVsZVBhdGgobW9kdWxlUGF0aDogc3RyaW5nLCBmcm9tRmlsZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGJhc2VEaXIgPSBwYXRoLmRpcm5hbWUoZnJvbUZpbGUpO1xuXG4gICAgICAgIC8vIFRyeSB3aXRoIC5kLnRzIGV4dGVuc2lvblxuICAgICAgICBsZXQgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIG1vZHVsZVBhdGggKyAnLmQudHMnKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSB0aGUgcGF0aCBhcy1pcyAobWlnaHQgYWxyZWFkeSBoYXZlIGV4dGVuc2lvbilcbiAgICAgICAgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIG1vZHVsZVBhdGgpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhyZXNvbHZlZFBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IHdpdGggL2luZGV4LmQudHNcbiAgICAgICAgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIG1vZHVsZVBhdGgsICdpbmRleC5kLnRzJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuZGVidWcoYENvdWxkIG5vdCByZXNvbHZlIG1vZHVsZTogJHttb2R1bGVQYXRofSBmcm9tICR7ZnJvbUZpbGV9YCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgc3RhdGVtZW50IGhhcyBhbiBleHBvcnQgbW9kaWZpZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGhhc0V4cG9ydE1vZGlmaWVyKG5vZGU6IHRzLk5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbW9kaWZpZXJzID0gKG5vZGUgYXMgYW55KS5tb2RpZmllcnM7XG4gICAgICAgIGlmICghbW9kaWZpZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbW9kaWZpZXJzLnNvbWUoXG4gICAgICAgICAgICAobW9kaWZpZXI6IHRzLk1vZGlmaWVyKSA9PiBtb2RpZmllci5raW5kID09PSB0cy5TeW50YXhLaW5kLkV4cG9ydEtleXdvcmRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBzeW1ib2wgdG8gdGhlIHRyYWNraW5nIG1hcFxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkU3ltYm9sKHN5bWJvbE5hbWU6IHN0cmluZywgZGVjbGFyYXRpb25GaWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN5bWJvbFRvRmlsZXMuaGFzKHN5bWJvbE5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnN5bWJvbFRvRmlsZXMuc2V0KHN5bWJvbE5hbWUsIG5ldyBTZXQ8c3RyaW5nPigpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bWJvbFRvRmlsZXMuZ2V0KHN5bWJvbE5hbWUpIS5hZGQoZGVjbGFyYXRpb25GaWxlKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBUcmFja2VkIHB1YmxpYyBBUEkgc3ltYm9sOiAke3N5bWJvbE5hbWV9IGZyb20gJHtkZWNsYXJhdGlvbkZpbGV9YCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFBhcnNlIHB1YmxpYyBBUEkgZXhwb3J0cyBmcm9tIGluZGV4LmQudHMgZmlsZXMgaW4gdGhlIGRpc3QgZm9sZGVyXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVB1YmxpY0FwaShkaXN0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxQdWJsaWNBcGlFeHBvcnRzPiB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFB1YmxpY0FwaVBhcnNlcihkaXN0UGF0aCk7XG4gICAgcmV0dXJuIGF3YWl0IHBhcnNlci5wYXJzZUluZGV4RmlsZXMoKTtcbn1cblxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciBtYXBwaW5nIGRpc3QgZGVjbGFyYXRpb24gZmlsZSBwYXRocyB0byBzb3VyY2UgZmlsZSBwYXRoc1xuICovXG5leHBvcnQgY2xhc3MgU291cmNlUGF0aE1hcHBlciB7XG4gICAgcHJpdmF0ZSBkaXN0UGF0aDogc3RyaW5nO1xuICAgIHByaXZhdGUgc291cmNlUm9vdDogc3RyaW5nO1xuICAgIHByaXZhdGUgY2FjaGVkTWFwcGluZ3M6IE1hcDxzdHJpbmcsIHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3RvcihkaXN0UGF0aDogc3RyaW5nLCBzb3VyY2VSb290OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kaXN0UGF0aCA9IHBhdGgucmVzb2x2ZShkaXN0UGF0aCk7XG4gICAgICAgIHRoaXMuc291cmNlUm9vdCA9IHBhdGgucmVzb2x2ZShzb3VyY2VSb290KTtcbiAgICAgICAgdGhpcy5jYWNoZWRNYXBwaW5ncyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwIGEgZGlzdCBkZWNsYXJhdGlvbiBmaWxlIHBhdGggdG8gaXRzIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVcbiAgICAgKiBAcGFyYW0gZGlzdEZpbGVQYXRoIEFic29sdXRlIHBhdGggdG8gLmQudHMgZmlsZSBpbiBkaXN0XG4gICAgICogQHJldHVybnMgQWJzb2x1dGUgcGF0aCB0byBzb3VyY2UgLnRzIGZpbGUsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgcHVibGljIG1hcERpc3RUb1NvdXJjZShkaXN0RmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgICAgICBpZiAodGhpcy5jYWNoZWRNYXBwaW5ncy5oYXMoZGlzdEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkTWFwcGluZ3MuZ2V0KGRpc3RGaWxlUGF0aCkhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maW5kU291cmNlRmlsZShkaXN0RmlsZVBhdGgpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdCAoZXZlbiBpZiBudWxsKVxuICAgICAgICB0aGlzLmNhY2hlZE1hcHBpbmdzLnNldChkaXN0RmlsZVBhdGgsIHJlc3VsdCk7XG4gICAgICAgIFxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYE1hcHBlZCAke2Rpc3RGaWxlUGF0aH0gLT4gJHtyZXN1bHR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYENvdWxkIG5vdCBtYXAgZGlzdCBmaWxlIHRvIHNvdXJjZTogJHtkaXN0RmlsZVBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgc291cmNlIGZpbGUgY29ycmVzcG9uZGluZyB0byBhIGRpc3QgZGVjbGFyYXRpb24gZmlsZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZFNvdXJjZUZpbGUoZGlzdEZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgLy8gR2V0IHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gZGlzdCByb290XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5kaXN0UGF0aCwgZGlzdEZpbGVQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlbW92ZSAuZC50cyBleHRlbnNpb24sIGxlYXZpbmcgLnRzXG4gICAgICAgIGNvbnN0IHdpdGhvdXREVHMgPSByZWxhdGl2ZVBhdGgucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcudHMnKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFRyeSBjb21tb24gcGF0dGVybnNcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLmdlbmVyYXRlU291cmNlUGF0dGVybnMod2l0aG91dERUcyk7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHRoaXMuc291cmNlUm9vdCwgcGF0dGVybik7XG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmdWxsUGF0aCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVsbFBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIHBvc3NpYmxlIHNvdXJjZSBmaWxlIHBhdGggcGF0dGVybnNcbiAgICAgKiBIYW5kbGVzIGNvbW1vbiBsaWJyYXJ5IGJ1aWxkIHN0cnVjdHVyZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdlbmVyYXRlU291cmNlUGF0dGVybnMocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBcbiAgICAgICAgLy8gUGF0dGVybiAxOiBEaXJlY3QgbWFwcGluZ1xuICAgICAgICAvLyBkaXN0L2xpYnMvbXktbGliL2NvcmUvaW5kZXguZC50cyAtPiBsaWJzL215LWxpYi9jb3JlL3NyYy9pbmRleC50c1xuICAgICAgICBwYXR0ZXJucy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIFxuICAgICAgICAvLyBQYXR0ZXJuIDI6IEFkZCAnc3JjJyBkaXJlY3RvcnlcbiAgICAgICAgLy8gZGlzdC9saWJzL215LWxpYi9jb3JlL2luZGV4LmQudHMgLT4gbGlicy9teS1saWIvY29yZS9zcmMvaW5kZXgudHNcbiAgICAgICAgY29uc3QgcGFydHMgPSByZWxhdGl2ZVBhdGguc3BsaXQocGF0aC5zZXApO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0ICdzcmMnIGJlZm9yZSB0aGUgbGFzdCBwYXJ0IChmaWxlbmFtZSlcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBkaXJzID0gcGFydHMuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgcGF0dGVybnMucHVzaChwYXRoLmpvaW4oLi4uZGlycywgJ3NyYycsIGZpbGVuYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFBhdHRlcm4gMzogbmctcGFja2FnciBwYXR0ZXJuIC0gcmVtb3ZlIGRpc3QgcHJlZml4IGFuZCBhZGQgc3JjXG4gICAgICAgIC8vIGRpc3QvbGlicy9teS1saWIvY29yZS9jb3JlLm1vZHVsZS5kLnRzIC0+IGxpYnMvbXktbGliL2NvcmUvc3JjL2NvcmUubW9kdWxlLnRzXG4gICAgICAgIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnbGlicycgKyBwYXRoLnNlcCkgfHwgcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzJyArIHBhdGguc2VwKSkge1xuICAgICAgICAgICAgY29uc3Qgd2l0aG91dExlYWRpbmcgPSByZWxhdGl2ZVBhdGg7XG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSB3aXRob3V0TGVhZGluZy5zcGxpdChwYXRoLnNlcCk7XG4gICAgICAgICAgICBpZiAocGF0aFBhcnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgY29uc3QgZGlycyA9IHBhdGhQYXJ0cy5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgcGF0dGVybnMucHVzaChwYXRoLmpvaW4oLi4uZGlycywgJ3NyYycsIGZpbGVuYW1lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFBhdHRlcm4gNDogRmxhdCBzdHJ1Y3R1cmUgd2l0aCBzcmNcbiAgICAgICAgLy8gZGlzdC9jb3JlL2luZGV4LmQudHMgLT4gc3JjL2NvcmUvaW5kZXgudHNcbiAgICAgICAgcGF0dGVybnMucHVzaChwYXRoLmpvaW4oJ3NyYycsIHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBcbiAgICAgICAgLy8gUGF0dGVybiA1OiBIYW5kbGUgZXNtMjAyMiBhbmQgZmVzbTIwMjIgZm9sZGVycyAoc2tpcCB0aGVtKVxuICAgICAgICAvLyBkaXN0L2VzbTIwMjIvY29yZS9pbmRleC5tanMgLT4gbGlicy9jb3JlL3NyYy9pbmRleC50c1xuICAgICAgICBjb25zdCBjbGVhbmVkUGF0aCA9IHJlbGF0aXZlUGF0aFxuICAgICAgICAgICAgLnJlcGxhY2UoL15lc21cXGQrWy9cXFxcXS8sICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15mZXNtXFxkK1svXFxcXF0vLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC5tanMkLywgJy50cycpO1xuICAgICAgICBwYXR0ZXJucy5wdXNoKGNsZWFuZWRQYXRoKTtcbiAgICAgICAgcGF0dGVybnMucHVzaChwYXRoLmpvaW4oJ3NyYycsIGNsZWFuZWRQYXRoKSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gcGF0dGVybnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwIG11bHRpcGxlIGRpc3QgZmlsZXMgdG8gc291cmNlIGZpbGVzXG4gICAgICovXG4gICAgcHVibGljIG1hcE11bHRpcGxlRGlzdFRvU291cmNlKGRpc3RGaWxlczogU2V0PHN0cmluZz4pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgZGlzdEZpbGUgb2YgZGlzdEZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlID0gdGhpcy5tYXBEaXN0VG9Tb3VyY2UoZGlzdEZpbGUpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGRpc3RGaWxlLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc291cmNlIGZpbGVzIGZvciBhbGwgZGVjbGFyYXRpb24gZmlsZXMgdGhhdCBleHBvcnQgYSBnaXZlbiBzeW1ib2xcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U291cmNlRmlsZXNGb3JTeW1ib2woXG4gICAgICAgIHN5bWJvbE5hbWU6IHN0cmluZyxcbiAgICAgICAgc3ltYm9sVG9GaWxlczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+XG4gICAgKTogU2V0PHN0cmluZz4ge1xuICAgICAgICBjb25zdCBzb3VyY2VGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25GaWxlcyA9IHN5bWJvbFRvRmlsZXMuZ2V0KHN5bWJvbE5hbWUpO1xuICAgICAgICBpZiAoIWRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2VGaWxlcztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBkZWNsRmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlID0gdGhpcy5tYXBEaXN0VG9Tb3VyY2UoZGVjbEZpbGUpO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VGaWxlcy5hZGQoc291cmNlRmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzb3VyY2VGaWxlcztcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc291cmNlIHBhdGggbWFwcGVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTb3VyY2VQYXRoTWFwcGVyKFxuICAgIGRpc3RQYXRoOiBzdHJpbmcsXG4gICAgc291cmNlUm9vdDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKVxuKTogU291cmNlUGF0aE1hcHBlciB7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VQYXRoTWFwcGVyKGRpc3RQYXRoLCBzb3VyY2VSb290KTtcbn1cblxuIiwiaW1wb3J0IHsgY2xvbmVEZWVwLCBjb25jYXQsIGZpbmQgfSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMgfSBmcm9tICcuJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uL2FwcC9jb25maWd1cmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIEV4dGVuZHNNZXJnZXIge1xuICAgIHByaXZhdGUgY29tcG9uZW50cztcbiAgICBwcml2YXRlIGNsYXNzZXM7XG4gICAgcHJpdmF0ZSBpbmplY3RhYmxlcztcbiAgICBwcml2YXRlIGRpcmVjdGl2ZXM7XG4gICAgcHJpdmF0ZSBjb250cm9sbGVycztcbiAgICBwcml2YXRlIGFsaWFzZXM7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRXh0ZW5kc01lcmdlcjtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUV4dGVuZHNNZXJnZXIuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEV4dGVuZHNNZXJnZXIuaW5zdGFuY2UgPSBuZXcgRXh0ZW5kc01lcmdlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFeHRlbmRzTWVyZ2VyLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBtZXJnZShkZXBzKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IGRlcHMuY29tcG9uZW50cztcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gZGVwcy5jbGFzc2VzO1xuICAgICAgICB0aGlzLmluamVjdGFibGVzID0gZGVwcy5pbmplY3RhYmxlcztcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gZGVwcy5kaXJlY3RpdmVzO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzID0gZGVwcy5jb250cm9sbGVycztcbiAgICAgICAgdGhpcy5hbGlhc2VzID0gZGVwcy5hbGlhc2VzO1xuXG4gICAgICAgIGNvbnN0IG1lcmdlRXh0ZW5kZWRQcm9wZXJ0aWVzID0gY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGxldCBleHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5leHRlbmRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGV4dCA9IHRoaXMuZmluZEluRGVwZW5kZW5jaWVzKGNvbXBvbmVudC5leHRlbmRzWzBdKTtcblxuICAgICAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdXJzaXZlU2NhbldpdGhJbmhlcml0YW5jZSA9IGNscyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIGNsYXNzIHRvIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjbHMubWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY2xzLm1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdNZXRob2RzID0gY2xvbmVEZWVwKGNscy5tZXRob2RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXRob2RzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3TWV0aG9kcywgY2xzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5tZXRob2RzQ2xhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VJbmhlcml0YW5jZShjb21wb25lbnQsICdtZXRob2RzQ2xhc3MnLCBuZXdNZXRob2RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNscy5wcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiBjbHMucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1Byb3BlcnRpZXMgPSBjbG9uZURlZXAoY2xzLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdQcm9wZXJ0aWVzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ3Byb3BlcnRpZXNDbGFzcycsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZyb20gY29tcG9uZW50IHRvIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgdG8gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNscy5pbnB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY2xzLmlucHV0c0NsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SW5wdXRzID0gY2xvbmVEZWVwKGNscy5pbnB1dHNDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5wdXRzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3SW5wdXRzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmlucHV0c0NsYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50LCAnaW5wdXRzQ2xhc3MnLCBuZXdJbnB1dHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xzLm91dHB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMub3V0cHV0c0NsYXNzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdPdXRwdXRzID0gY2xvbmVEZWVwKGNscy5vdXRwdXRzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld091dHB1dHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdPdXRwdXRzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lm91dHB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ291dHB1dHNDbGFzcycsIG5ld091dHB1dHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xzLm1ldGhvZHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMubWV0aG9kc0NsYXNzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdNZXRob2RzID0gY2xvbmVEZWVwKGNscy5tZXRob2RzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGhvZHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdNZXRob2RzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lm1ldGhvZHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ21ldGhvZHNDbGFzcycsIG5ld01ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xzLnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMucHJvcGVydGllc0NsYXNzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9wZXJ0aWVzID0gY2xvbmVEZWVwKGNscy5wcm9wZXJ0aWVzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdQcm9wZXJ0aWVzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ3Byb3BlcnRpZXNDbGFzcycsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xzLmhvc3RCaW5kaW5ncyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuaG9zdEJpbmRpbmdzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdIb3N0QmluZGluZ3MgPSBjbG9uZURlZXAoY2xzLmhvc3RCaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SG9zdEJpbmRpbmdzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3SG9zdEJpbmRpbmdzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lmhvc3RCaW5kaW5ncyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ2hvc3RCaW5kaW5ncycsIG5ld0hvc3RCaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjbHMuaG9zdExpc3RlbmVycyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuaG9zdExpc3RlbmVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SG9zdExpc3RlbmVycyA9IGNsb25lRGVlcChjbHMuaG9zdExpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SG9zdExpc3RlbmVycyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld0hvc3RMaXN0ZW5lcnMsIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuaG9zdExpc3RlbmVycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ2hvc3RMaXN0ZW5lcnMnLCBuZXdIb3N0TGlzdGVuZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQubWV0aG9kc0NsYXNzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQubWV0aG9kc0NsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHMuZXh0ZW5kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5XaXRoSW5oZXJpdGFuY2UodGhpcy5maW5kSW5EZXBlbmRlbmNpZXMoY2xzLmV4dGVuZHNbMF0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRnJvbSBjbGFzcyB0byBjbGFzc1xuICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVTY2FuV2l0aEluaGVyaXRhbmNlKGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKG1lcmdlRXh0ZW5kZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzLmZvckVhY2gobWVyZ2VFeHRlbmRlZFByb3BlcnRpZXMpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzLmZvckVhY2gobWVyZ2VFeHRlbmRlZFByb3BlcnRpZXMpO1xuXG4gICAgICAgIGNvbnN0IG1lcmdlRXh0ZW5kZWRDbGFzc2VzID0gZWwgPT4ge1xuICAgICAgICAgICAgbGV0IGV4dDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWwuZXh0ZW5kcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBleHQgPSB0aGlzLmZpbmRJbkRlcGVuZGVuY2llcyhlbC5leHRlbmRzWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3Vyc2l2ZVNjYW5XaXRoSW5oZXJpdGFuY2UgPSBjbHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjbHMubWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY2xzLm1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdNZXRob2RzID0gY2xvbmVEZWVwKGNscy5tZXRob2RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXRob2RzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3TWV0aG9kcywgY2xzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsLm1ldGhvZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VJbmhlcml0YW5jZShlbCwgJ21ldGhvZHMnLCBuZXdNZXRob2RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNscy5wcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiBjbHMucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1Byb3BlcnRpZXMgPSBjbG9uZURlZXAoY2xzLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdQcm9wZXJ0aWVzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWwucHJvcGVydGllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGVsLCAncHJvcGVydGllcycsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHMuZXh0ZW5kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5XaXRoSW5oZXJpdGFuY2UodGhpcy5maW5kSW5EZXBlbmRlbmNpZXMoY2xzLmV4dGVuZHNbMF0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRnJvbSBlbHNzIHRvIGVsc3NcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlU2NhbldpdGhJbmhlcml0YW5jZShleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNsYXNzZXMuZm9yRWFjaChtZXJnZUV4dGVuZGVkQ2xhc3Nlcyk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZXMuZm9yRWFjaChtZXJnZUV4dGVuZGVkQ2xhc3Nlcyk7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcy5mb3JFYWNoKG1lcmdlRXh0ZW5kZWRDbGFzc2VzKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycy5mb3JFYWNoKG1lcmdlRXh0ZW5kZWRDbGFzc2VzKTtcblxuICAgICAgICByZXR1cm4gZGVwcztcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcmtJbmhlcml0YW5jZShkYXRhLCBvcmlnaW5hbG91cmNlKSB7XG4gICAgICAgIHJldHVybiBkYXRhLm1hcChlbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gZWw7XG4gICAgICAgICAgICBuZXdFbGVtZW50LmluaGVyaXRhbmNlID0ge1xuICAgICAgICAgICAgICAgIGZpbGU6IG9yaWdpbmFsb3VyY2UubmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50OiBhbnksIG1ldGFQcm9wZXJ0eUlkOiBzdHJpbmcsIG5ld01lbWJlcnM6IGFueSkge1xuICAgICAgICBuZXdNZW1iZXJzLmZvckVhY2gobmV3TWVtYmVyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRkZW5NZXRob2QgPSBjb21wb25lbnRbbWV0YVByb3BlcnR5SWRdLmZpbmQoXG4gICAgICAgICAgICAgICAgY29tcG9uZW50TWVtYmVyID0+IGNvbXBvbmVudE1lbWJlci5uYW1lID09PSBuZXdNZW1iZXIubmFtZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKG92ZXJyaWRkZW5NZXRob2QpIHtcbiAgICAgICAgICAgICAgICBvdmVycmlkZGVuTWV0aG9kLmluaGVyaXRhbmNlID0gbmV3TWVtYmVyLmluaGVyaXRhbmNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRbbWV0YVByb3BlcnR5SWRdLnB1c2gobmV3TWVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kSW5EZXBlbmRlbmNpZXMobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1lcmdlZERhdGEgPSBjb25jYXQoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyxcbiAgICAgICAgICAgIHRoaXMuY2xhc3NlcyxcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0YWJsZXMsXG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGZpbmQobWVyZ2VkRGF0YSwgeyBuYW1lOiBuYW1lIH0gYXMgYW55KTtcblxuICAgICAgICAvLyBGaW5kIGluIGFsaWFzZXMgP1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgY29uc3QgYWxpYXNlcyA9IE9iamVjdC52YWx1ZXModGhpcy5hbGlhc2VzKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5BbGlhcyA9IGFsaWFzZXMuaW5jbHVkZXMobmFtZSk7XG4gICAgICAgICAgICBpZiAoaXNJbkFsaWFzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxPcmlnaW5hbE5hbWUgPSB0aGlzLmZpbmRJbkFsaWFzZXMobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsT3JpZ2luYWxOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbmQobWVyZ2VkRGF0YSwgeyBuYW1lOiBmaW5hbE9yaWdpbmFsTmFtZSB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZEluQWxpYXNlcyhuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGZpbmFsT3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBvcmlnaW5hbE5hbWUgaW4gdGhpcy5hbGlhc2VzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGlhc2VzW29yaWdpbmFsTmFtZV0uaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmaW5hbE9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxPcmlnaW5hbE5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFeHRlbmRzTWVyZ2VyLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcblxuaW1wb3J0IEFuZ3VsYXJWZXJzaW9uVXRpbCBmcm9tICcuLi8uLi8uLi91dGlscy9hbmd1bGFyLXZlcnNpb24udXRpbCc7XG5pbXBvcnQgRXh0ZW5kc01lcmdlciBmcm9tICcuLi8uLi8uLi91dGlscy9leHRlbmRzLW1lcmdlci51dGlsJztcbmltcG9ydCBCYXNpY1R5cGVVdGlsIGZyb20gJy4uLy4uLy4uL3V0aWxzL2Jhc2ljLXR5cGUudXRpbCc7XG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgTGlua1R5cGVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kKG5hbWUpO1xuICAgICAgICAvLyBGaW5kIGluIGFsaWFzZXMgP1xuICAgICAgICBpZiAoIV9yZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvdGVudGlhbEFsaWFzID0gRXh0ZW5kc01lcmdlci5maW5kSW5BbGlhc2VzKG5hbWUpO1xuICAgICAgICAgICAgaWYgKHBvdGVudGlhbEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgX3Jlc3VsdCA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kKHBvdGVudGlhbEFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFuZ3VsYXJEb2NQcmVmaXggPSBBbmd1bGFyVmVyc2lvblV0aWwucHJlZml4T2ZmaWNpYWxEb2MoXG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uXG4gICAgICAgICk7XG4gICAgICAgIGlmIChfcmVzdWx0KSB7XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUgPSB7XG4gICAgICAgICAgICAgICAgcmF3OiBuYW1lLFxuICAgICAgICAgICAgICAgIGluZGV4S2V5OiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEudHlwZSA9ICdjbGFzc2UnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUuaHJlZiA9ICcuLi8nICsgX3Jlc3VsdC5kYXRhLnR5cGUgKyAncy8nICsgX3Jlc3VsdC5kYXRhLm5hbWUgKyAnLmh0bWwnO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmluZGV4S2V5ICE9PSAnJyAmJiBjb250ZXh0LmluZGV4S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgKz0gJyMnICsgY29udGV4dC5pbmRleEtleTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmluZGV4S2V5ID0gY29udGV4dC5pbmRleEtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnIHx8XG4gICAgICAgICAgICAgICAgICAgIChfcmVzdWx0LmRhdGEuY3R5cGUgJiYgX3Jlc3VsdC5kYXRhLmN0eXBlID09PSAnbWlzY2VsbGFuZW91cycpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYWlucGFnZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9yZXN1bHQuZGF0YS5zdWJ0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICdlbnVtZXJhdGlvbnMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wYWdlID0gJ2Z1bmN0aW9ucyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0eXBlYWxpYXMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wYWdlID0gJ3R5cGVhbGlhc2VzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhcmlhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICd2YXJpYWJsZXMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZS5ocmVmID0gJy4uLycgKyBfcmVzdWx0LmRhdGEuY3R5cGUgKyAnLycgKyBtYWlucGFnZSArICcuaHRtbCc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LmRhdGEgJiYgX3Jlc3VsdC5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZS5ocmVmICs9ICcjJyArIF9yZXN1bHQuZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29udGV4dC50eXBlLmluZGV4S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZS5pbmRleEtleSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUudGFyZ2V0ID0gJ19zZWxmJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgPSBgaHR0cHM6Ly8ke2FuZ3VsYXJEb2NQcmVmaXh9YW5ndWxhci5pby8ke19yZXN1bHQuZGF0YS5wYXRofWA7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChCYXNpY1R5cGVVdGlsLmlzS25vd25UeXBlKG5hbWUpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUgPSB7XG4gICAgICAgICAgICAgICAgcmF3OiBuYW1lLFxuICAgICAgICAgICAgICAgIGluZGV4S2V5OiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnRleHQudHlwZS50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIGNvbnRleHQudHlwZS5ocmVmID0gQmFzaWNUeXBlVXRpbC5nZXRUeXBlVXJsKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGNsYXNzIE1vZGlmSWNvbkhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGtpbmQ6IFN5bnRheEtpbmQpOiBzdHJpbmcge1xuICAgICAgICBsZXQgX2tpbmRUZXh0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdsb2NrJzsgLy8gcHJpdmF0ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ2xvY2snOyAvLyBwcm90ZWN0ZWRcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdyZXNldCc7IC8vIHN0YXRpY1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkV4cG9ydEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ2V4cG9ydCc7IC8vIGV4cG9ydFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfa2luZFRleHQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcblxuaW1wb3J0IHsgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBjbGFzcyBNb2RpZktpbmRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIFN5bnRheEtpbmQgaW50byBzdHJpbmdcbiAgICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICBjb250ZXh0IEhhbmRsZWJhcnMgY29udGV4dFxuICAgICAqIEBwYXJhbSAge1N5bnRheEtpbmRbXX0ga2luZCAgU3ludGF4S2luZCBjb25jYXRlbmF0ZWRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgIFBhcnNlZCBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGtpbmQ6IFN5bnRheEtpbmRbXSkge1xuICAgICAgICBsZXQgX2tpbmRUZXh0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdQcml2YXRlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5SZWFkb25seUtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1JlYWRvbmx5JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdQcm90ZWN0ZWQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1B1YmxpYyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RhdGljS2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnU3RhdGljJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Bc3luY0tleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ0FzeW5jJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5BYnN0cmFjdEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ0Fic3RyYWN0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyhfa2luZFRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgT2JqZWN0TGVuZ3RoSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgb2JqOiBPYmplY3QsIG9wZXJhdG9yOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyKSB7XG4gICAgICAgIGxldCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyA9IGFyZ3VtZW50c1tsZW5dO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaXplID0gMCxcbiAgICAgICAgICAgIGtleTtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNpemUgPT09IGxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZSAhPT0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZSA+IGxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlbHBlciB7e29iamVjdExlbmd0aH19OiBpbnZhbGlkIG9wZXJhdG9yOiBgJyArIG9wZXJhdG9yICsgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmNvbnN0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KHRleHQpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC97XCIvLCAnezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIicpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8sXCIvLCAnLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIicpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC99JC8sICc8YnI+fScpO1xuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIE9uZVBhcmFtZXRlckhhc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRhZ3MsIHR5cGVUb0NoZWNrKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICBsZW5nID0gdGFncy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuZzsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRhZ3NbaV1bdHlwZVRvQ2hlY2tdICE9PSAndW5kZWZpbmVkJyAmJiB0YWdzW2ldW3R5cGVUb0NoZWNrXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPckxlbmd0aEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnkgLyogYW55LCBhbnksIC4uLiwgb3B0aW9ucyAqLykge1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICAvLyBXZSBzdGFydCBhdCAxIGJlY2F1c2Ugb2Ygb3B0aW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYXJndW1lbnRzW2ldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPckhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnkgLyogYW55LCBhbnksIC4uLiwgb3B0aW9ucyAqLykge1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICAvLyBXZSBzdGFydCBhdCAxIGJlY2F1c2Ugb2Ygb3B0aW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IGV4dHJhY3RMZWFkaW5nVGV4dCwgc3BsaXRMaW5rVGV4dCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2xpbmstcGFyc2VyJztcbmltcG9ydCBEZXBlbmRlbmNpZXNFbmdpbmUgZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5cbmV4cG9ydCBjbGFzcyBQYXJzZURlc2NyaXB0aW9uSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgZGVzY3JpcHRpb246IHN0cmluZywgZGVwdGg6IG51bWJlcikge1xuICAgICAgICBsZXQgdGFnUmVnRXhwTGlnaHQgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKTtcbiAgICAgICAgbGV0IHRhZ1JlZ0V4cEZ1bGwgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKTtcbiAgICAgICAgbGV0IHRhZ1JlZ0V4cDtcbiAgICAgICAgbGV0IG1hdGNoZXM7XG4gICAgICAgIGxldCBwcmV2aW91c1N0cmluZztcbiAgICAgICAgbGV0IHRhZ0luZm8gPSBbXTtcblxuICAgICAgICB0YWdSZWdFeHAgPSBkZXNjcmlwdGlvbi5pbmRleE9mKCddeycpICE9PSAtMSA/IHRhZ1JlZ0V4cEZ1bGwgOiB0YWdSZWdFeHBMaWdodDtcblxuICAgICAgICBjb25zdCBwcm9jZXNzVGhlTGluayA9IChvcmlnaW5hbERlc2NyaXB0aW9uLCBtYXRjaGVkVGFnLCBsZWFkaW5nVGV4dCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxlYWRpbmcgPSBleHRyYWN0TGVhZGluZ1RleHQob3JpZ2luYWxEZXNjcmlwdGlvbiwgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZyk7XG4gICAgICAgICAgICBsZXQgc3BsaXQ7XG4gICAgICAgICAgICBsZXQgcmVzdWx0SW5Db21wb2RvYztcbiAgICAgICAgICAgIGxldCBuZXdMaW5rO1xuICAgICAgICAgICAgbGV0IHJvb3RQYXRoO1xuICAgICAgICAgICAgbGV0IHN0cmluZ3RvUmVwbGFjZTtcbiAgICAgICAgICAgIGxldCBhbmNob3IgPSAnJztcbiAgICAgICAgICAgIGxldCBsYWJlbDtcbiAgICAgICAgICAgIGxldCBwYWdlTmFtZTtcblxuICAgICAgICAgICAgc3BsaXQgPSBzcGxpdExpbmtUZXh0KG1hdGNoZWRUYWcudGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYyA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kSW5Db21wb2RvYyhzcGxpdC50YXJnZXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IG1hdGNoZWRUYWcudGV4dDtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZFRhZy50ZXh0LmluZGV4T2YoJyMnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gbWF0Y2hlZFRhZy50ZXh0LnN1YnN0cihcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUYWcudGV4dC5pbmRleE9mKCcjJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVGFnLnRleHQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGluZm8gPSBtYXRjaGVkVGFnLnRleHQuc3Vic3RyKDAsIG1hdGNoZWRUYWcudGV4dC5pbmRleE9mKCcjJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jID0gRGVwZW5kZW5jaWVzRW5naW5lLmZpbmRJbkNvbXBvZG9jKGluZm8pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzdWx0SW5Db21wb2RvYykge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuICAgICAgICAgICAgICAgIHBhZ2VOYW1lID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbkNvbXBvZG9jLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID0gJ2NsYXNzZXMnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdEluQ29tcG9kb2MudHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnIHx8XG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHRJbkNvbXBvZG9jLmN0eXBlICYmIHJlc3VsdEluQ29tcG9kb2MuY3R5cGUgPT09ICdtaXNjZWxsYW5lb3VzJylcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID0gJ21pc2NlbGxhbmVvdXMnOyAvLyBOb3QgYSB0eXBvLCBpdCBpcyBmb3IgbWF0Y2hpbmcgb3RoZXIgc2luZ2xlIHR5cGVzIDogY29tcG9uZW50LCBtb2R1bGUgZXRjXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSAnIycgKyByZXN1bHRJbkNvbXBvZG9jLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbkNvbXBvZG9jLnN1YnR5cGUgPT09ICdlbnVtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUgPSAnZW51bWVyYXRpb25zJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHRJbkNvbXBvZG9jLnN1YnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOYW1lID0gJ2Z1bmN0aW9ucyc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0SW5Db21wb2RvYy5zdWJ0eXBlID09PSAndHlwZWFsaWFzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUgPSAndHlwZWFsaWFzZXMnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdEluQ29tcG9kb2Muc3VidHlwZSA9PT0gJ3ZhcmlhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUgPSAndmFyaWFibGVzJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvb3RQYXRoID0gJyc7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RQYXRoID0gJy4vJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RQYXRoID0gJy4uLycucmVwZWF0KGRlcHRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nLmxlYWRpbmdUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBsZWFkaW5nLmxlYWRpbmdUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHNwbGl0LmxpbmtUZXh0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID09PSAnbWlzY2VsbGFuZW91cycgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID09PSAnY2xhc3NlcydcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtyb290UGF0aH0ke3Jlc3VsdEluQ29tcG9kb2MudHlwZX0vJHtwYWdlTmFtZX0uaHRtbCR7YW5jaG9yfVwiPiR7bGFiZWx9PC9hPmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtyb290UGF0aH0ke3Jlc3VsdEluQ29tcG9kb2MudHlwZX1zLyR7cGFnZU5hbWV9Lmh0bWwke2FuY2hvcn1cIj4ke2xhYmVsfTwvYT5gO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uLnJlcGxhY2Uoc3RyaW5ndG9SZXBsYWNlLCBuZXdMaW5rKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdEluQ29tcG9kb2MgJiYgdHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG5ld0xpbmsgPSBgPGEgaHJlZj1cIiR7c3BsaXQudGFyZ2V0fVwiPiR7c3BsaXQubGlua1RleHR9PC9hPmA7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdGlvbi5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgbmV3TGluayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXN1bHRJbkNvbXBvZG9jICYmIGxlYWRpbmcgJiYgdHlwZW9mIGxlYWRpbmcubGVhZGluZ1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtzcGxpdC50YXJnZXR9XCI+JHtsZWFkaW5nLmxlYWRpbmdUZXh0fTwvYT5gO1xuICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nVGV4dCArICddJyArIG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWFkaW5nLmxlYWRpbmdUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gJ1snICsgbGVhZGluZy5sZWFkaW5nVGV4dCArICddJyArIG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRGVzY3JpcHRpb24ucmVwbGFjZShzdHJpbmd0b1JlcGxhY2UsIG5ld0xpbmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzdWx0SW5Db21wb2RvYyAmJiB0eXBlb2Ygc3BsaXQubGlua1RleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtzcGxpdC50YXJnZXR9XCI+JHtzcGxpdC50YXJnZXR9PC9hPmA7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdGlvbi5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgbmV3TGluayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VNYXRjaChyZXBsYWNlciwgdGFnLCBtYXRjaCwgdGV4dCwgbGlua1RleHQ/KSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2hlZFRhZyA9IHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZVRhZzogbWF0Y2gsXG4gICAgICAgICAgICAgICAgdGFnOiB0YWcsXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRhZ0luZm8ucHVzaChtYXRjaGVkVGFnKTtcblxuICAgICAgICAgICAgaWYgKGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGRlc2NyaXB0aW9uLCBtYXRjaGVkVGFnLCBsaW5rVGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlcihkZXNjcmlwdGlvbiwgbWF0Y2hlZFRhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbiBkZXNjcmlwdGlvbiBmb3IgbWFya2VkIGEgdGFnIHBhcnNlZCB0b28gZWFybHlcblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24uaW5kZXhPZignaHJlZj0nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBpbnNpZGVNYXJrZWRBVGFnUmVzdWx0cyA9IGRlc2NyaXB0aW9uLm1hdGNoKC88YSBbXj5dKz4oW148XSspPFxcL2E+L2cpO1xuXG4gICAgICAgICAgICBpZiAoaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMgJiYgaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtlZEFUYWdSZWdFeHAgPSBuZXcgUmVnRXhwKCc8YSBbXj5dKz4oW148XSspPC9hPicsICdnbScpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkQVRhZyA9IG1hcmtlZEFUYWdSZWdFeHAuZXhlYyhkZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRBVGFnICYmIHBhcnNlZEFUYWcubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zaWRlTWFya2VkQVRhZyA9IHBhcnNlZEFUYWdbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYHtAbGluayA8YSBocmVmPVwiJHtlbmNvZGVVUkkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZU1hcmtlZEFUYWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVwiPiR7aW5zaWRlTWFya2VkQVRhZ308L2E+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBge0BsaW5rICR7aW5zaWRlTWFya2VkQVRhZ31gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgbWF0Y2hlcyA9IHRhZ1JlZ0V4cC5leGVjKGRlc2NyaXB0aW9uKTtcblxuICAgICAgICAgICAgLy8gRGlkIHdlIGhhdmUge0BsaW5rID9cbiAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdHJpbmcgPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSByZXBsYWNlTWF0Y2gocHJvY2Vzc1RoZUxpbmssICdsaW5rJywgbWF0Y2hlc1swXSwgbWF0Y2hlc1sxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHJlcGxhY2VNYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUaGVMaW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmsnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1swXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzWzFdXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChtYXRjaGVzICYmIHByZXZpb3VzU3RyaW5nICE9PSBkZXNjcmlwdGlvbik7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbXB0eSBsaW5lIHBsYWNlaG9sZGVycyBiYWNrIHRvIGFjdHVhbCBlbXB0eSBsaW5lc1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnJlcGxhY2UoL19fX0NPTVBPRE9DX0VNUFRZX0xJTkVfX18vZywgJ1xcbicpO1xuXG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5jb25zdCBIYW5kbGViYXJzID0gcmVxdWlyZSgnaGFuZGxlYmFycycpO1xuXG5leHBvcnQgY2xhc3MgUGFyc2VQcm9wZXJ0eUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgcHJvcDogYW55ID0gdGV4dDtcblxuICAgICAgICBpZiAoISF0ZXh0ICYmIHRleHQuY29uc3RydWN0b3IgPT09IE9iamVjdCAmJiB0ZXh0Wyd1cmwnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwcm9wID0gdGV4dFsndXJsJ107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISF0ZXh0ICYmIHRleHQuY29uc3RydWN0b3IgPT09IE9iamVjdCAmJiB0ZXh0WyduYW1lJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcHJvcCA9IHRleHRbJ25hbWUnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghIXRleHQgJiYgdGV4dC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0ICYmIE9iamVjdC5rZXlzKHRleHQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcHJvcCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBTdHJpbmcgJiYgcHJvcCAhPT0gJycgJiYgcHJvcC5pbmRleE9mKCdodHRwcycpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIGA8YSBocmVmPVwiJHtwcm9wfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7cHJvcH08L2E+YDtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wICE9PSAnJyAmJiBwcm9wIGluc3RhbmNlb2YgQXJyYXkgJiYgcHJvcC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwcm9wID0gSlNPTi5zdHJpbmdpZnkocHJvcCk7XG4gICAgICAgICAgICBwcm9wID0gcHJvcC5yZXBsYWNlKC9cIixcIi9nLCAnLCAnKTtcbiAgICAgICAgICAgIHByb3AgPSBwcm9wLnJlcGxhY2UoL1xcW1wiL2csICcnKTtcbiAgICAgICAgICAgIHByb3AgPSBwcm9wLnJlcGxhY2UoL1wiXS9nLCAnJyk7XG4gICAgICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgUmVsYXRpdmVVUkxIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBjdXJyZW50RGVwdGg6IG51bWJlciwgb3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAoY3VycmVudERlcHRoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcuLyc7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcuLi8nLnJlcGVhdChjdXJyZW50RGVwdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFNob3J0VVJMSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdXJsOiBzdHJpbmcsIG9wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbmV3VXJsID0gdXJsO1xuICAgICAgICBsZXQgZmlyc3RJbmRleE9mU2xhc2ggPSBuZXdVcmwuaW5kZXhPZignLycpO1xuICAgICAgICBsZXQgbGFzdEluZGV4T2ZTbGFzaCA9IG5ld1VybC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgICBpZiAoZmlyc3RJbmRleE9mU2xhc2ggIT09IC0xIHx8IGxhc3RJbmRleE9mU2xhc2ggIT09IC0xKSB7XG4gICAgICAgICAgICBuZXdVcmwgPVxuICAgICAgICAgICAgICAgIG5ld1VybC5zdWJzdHIoMCwgZmlyc3RJbmRleE9mU2xhc2ggKyAxKSArXG4gICAgICAgICAgICAgICAgJy4uLicgK1xuICAgICAgICAgICAgICAgIG5ld1VybC5zdWJzdHIobGFzdEluZGV4T2ZTbGFzaCwgbmV3VXJsLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1VybDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBTdHJpcFVSTEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHByZWZpeDogc3RyaW5nLCB1cmw6IHN0cmluZywgb3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBwcmVmaXggKyB1cmwuc3BsaXQoXCIvXCIpLnBvcCgpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSWZFcXVhbFN0cmluZ0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGE6IGFueSwgYjogYW55LCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYSA9PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImNvbnN0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7XG5cbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgQnJlYWtDb21tYUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1jb21tYS5oZWxwZXInO1xuaW1wb3J0IHsgQnJlYWtMaW5lc0hlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1saW5lcy5oZWxwZXInO1xuaW1wb3J0IHsgQ2FwaXRhbGl6ZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9jYXBpdGFsaXplLmhlbHBlcic7XG5pbXBvcnQgeyBDbGVhblBhcmFncmFwaEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9jbGVhbi1wYXJhZ3JhcGguaGVscGVyJztcbmltcG9ydCB7IENvbXBhcmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvY29tcGFyZS5oZWxwZXInO1xuaW1wb3J0IHsgRGVidWdIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZGVidWcuaGVscGVyJztcbmltcG9ydCB7IEVsZW1lbnRBbG9uZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9lbGVtZW50LWFsb25lLmhlbHBlcic7XG5pbXBvcnQgeyBFc2NhcGVTaW1wbGVRdW90ZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9lc2NhcGUtc2ltcGxlLXF1b3RlLmhlbHBlcic7XG5pbXBvcnQgeyBGaWx0ZXJBbmd1bGFyMk1vZHVsZXNIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZmlsdGVyLWFuZ3VsYXIyLW1vZHVsZXMuaGVscGVyJztcbmltcG9ydCB7IEZ1bmN0aW9uU2lnbmF0dXJlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2Z1bmN0aW9uLXNpZ25hdHVyZS5oZWxwZXInO1xuaW1wb3J0IHsgSGFzT3duSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2hhcy1vd24uaGVscGVyJztcbmltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSTE4bkhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pMThuLmhlbHBlcic7XG5pbXBvcnQgeyBJZlN0cmluZ0hlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pZi1zdHJpbmcuaGVscGVyJztcbmltcG9ydCB7IEluZGV4YWJsZVNpZ25hdHVyZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pbmRleGFibGUtc2lnbmF0dXJlLmhlbHBlcic7XG5pbXBvcnQgeyBJc0luaXRpYWxUYWJIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvaXMtaW5pdGlhbC10YWIuaGVscGVyJztcbmltcG9ydCB7IElzTm90VG9nZ2xlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2lzLW5vdC10b2dnbGUuaGVscGVyJztcbmltcG9ydCB7IElzVGFiRW5hYmxlZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pcy10YWItZW5hYmxlZC5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NDb2RlRXhhbXBsZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1jb2RlLWV4YW1wbGUuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jRGVmYXVsdEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1kZWZhdWx0LmhlbHBlcic7XG5pbXBvcnQgeyBKc2RvY0V4YW1wbGVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtZXhhbXBsZS5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NQYXJhbXNWYWxpZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1wYXJhbXMtdmFsaWQuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jUGFyYW1zSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXBhcmFtcy5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NSZXR1cm5zQ29tbWVudEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1yZXR1cm5zLWNvbW1lbnQuaGVscGVyJztcbmltcG9ydCB7IExpbmtUeXBlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2xpbmstdHlwZS5oZWxwZXInO1xuaW1wb3J0IHsgTW9kaWZJY29uSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWljb24uaGVscGVyJztcbmltcG9ydCB7IE1vZGlmS2luZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9tb2RpZi1raW5kLWhlbHBlcic7XG5pbXBvcnQgeyBPYmplY3RMZW5ndGhIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LWxlbmd0aC5oZWxwZXInO1xuaW1wb3J0IHsgT2JqZWN0SGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29iamVjdC5oZWxwZXInO1xuaW1wb3J0IHsgT25lUGFyYW1ldGVySGFzSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29uZS1wYXJhbWV0ZXItaGFzLmhlbHBlcic7XG5pbXBvcnQgeyBPckxlbmd0aEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9vci1sZW5ndGguaGVscGVyJztcbmltcG9ydCB7IE9ySGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29yLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJzZURlc2NyaXB0aW9uSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3BhcnNlLWRlc2NyaXB0aW9uLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJzZVByb3BlcnR5SGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3BhcnNlLXByb3BlcnR5LmhlbHBlcic7XG5pbXBvcnQgeyBSZWxhdGl2ZVVSTEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9yZWxhdGl2ZS11cmwuaGVscGVyJztcbmltcG9ydCB7IFNob3J0VVJMSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3Nob3J0LXVybC5oZWxwZXInO1xuaW1wb3J0IHsgU3RyaXBVUkxIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvc3RyaXAtdXJsLmhlbHBlcic7XG5pbXBvcnQgeyBJZkVxdWFsU3RyaW5nSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2lmLWVxdWFsLXN0cmluZy5oZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgSHRtbEVuZ2luZUhlbHBlcnMge1xuICAgIHB1YmxpYyByZWdpc3RlckhlbHBlcnMoYmFycyk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdjb21wYXJlJywgbmV3IENvbXBhcmVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ29yJywgbmV3IE9ySGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdmdW5jdGlvblNpZ25hdHVyZScsIG5ldyBGdW5jdGlvblNpZ25hdHVyZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaXNOb3RUb2dnbGUnLCBuZXcgSXNOb3RUb2dnbGVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2lzSW5pdGlhbFRhYicsIG5ldyBJc0luaXRpYWxUYWJIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2lzVGFiRW5hYmxlZCcsIG5ldyBJc1RhYkVuYWJsZWRIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2lmU3RyaW5nJywgbmV3IElmU3RyaW5nSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdpZkVxdWFsU3RyaW5nJywgbmV3IElmRXF1YWxTdHJpbmdIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ29yTGVuZ3RoJywgbmV3IE9yTGVuZ3RoSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdmaWx0ZXJBbmd1bGFyMk1vZHVsZXMnLCBuZXcgRmlsdGVyQW5ndWxhcjJNb2R1bGVzSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdkZWJ1ZycsIG5ldyBEZWJ1Z0hlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnYnJlYWtsaW5lcycsIG5ldyBCcmVha0xpbmVzSGVscGVyKGJhcnMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnY2xlYW4tcGFyYWdyYXBoJywgbmV3IENsZWFuUGFyYWdyYXBoSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdlc2NhcGVTaW1wbGVRdW90ZScsIG5ldyBFc2NhcGVTaW1wbGVRdW90ZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnYnJlYWtDb21tYScsIG5ldyBCcmVha0NvbW1hSGVscGVyKGJhcnMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnbW9kaWZLaW5kJywgbmV3IE1vZGlmS2luZEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnbW9kaWZJY29uJywgbmV3IE1vZGlmSWNvbkhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAncmVsYXRpdmVVUkwnLCBuZXcgUmVsYXRpdmVVUkxIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLXJldHVybnMtY29tbWVudCcsIG5ldyBKc2RvY1JldHVybnNDb21tZW50SGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdqc2RvYy1jb2RlLWV4YW1wbGUnLCBuZXcgSnNkb2NDb2RlRXhhbXBsZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtZXhhbXBsZScsIG5ldyBKc2RvY0V4YW1wbGVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLXBhcmFtcycsIG5ldyBKc2RvY1BhcmFtc0hlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtcGFyYW1zLXZhbGlkJywgbmV3IEpzZG9jUGFyYW1zVmFsaWRIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLWRlZmF1bHQnLCBuZXcgSnNkb2NEZWZhdWx0SGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdsaW5rVHlwZScsIG5ldyBMaW5rVHlwZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaW5kZXhhYmxlU2lnbmF0dXJlJywgbmV3IEluZGV4YWJsZVNpZ25hdHVyZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnb2JqZWN0JywgbmV3IE9iamVjdEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnb2JqZWN0TGVuZ3RoJywgbmV3IE9iamVjdExlbmd0aEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAncGFyc2VEZXNjcmlwdGlvbicsIG5ldyBQYXJzZURlc2NyaXB0aW9uSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdvbmUtcGFyYW1ldGVyLWhhcycsIG5ldyBPbmVQYXJhbWV0ZXJIYXNIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2VsZW1lbnQtYWxvbmUnLCBuZXcgRWxlbWVudEFsb25lSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdoYXNPd24nLCBuZXcgSGFzT3duSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdzaG9ydC11cmwnLCBuZXcgU2hvcnRVUkxIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ3N0cmlwLXVybCcsIG5ldyBTdHJpcFVSTEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAndCcsIG5ldyBJMThuSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdjYXBpdGFsaXplJywgbmV3IENhcGl0YWxpemVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ3BhcnNlLXByb3BlcnR5JywgbmV3IFBhcnNlUHJvcGVydHlIZWxwZXIoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlckhlbHBlcihiYXJzLCBrZXk6IHN0cmluZywgaGVscGVyOiBJSHRtbEVuZ2luZUhlbHBlcikge1xuICAgICAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKGtleSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWludmFsaWQtdGhpc1xuICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5oZWxwZXJGdW5jLmFwcGx5KGhlbHBlciwgW3RoaXMsIC4uLl8uc2xpY2UoYXJndW1lbnRzIGFzIGFueSldKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcbmltcG9ydCB7IEh0bWxFbmdpbmVIZWxwZXJzIH0gZnJvbSAnLi9odG1sLmVuZ2luZS5oZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEh0bWxFbmdpbmUge1xuICAgIHByaXZhdGUgY2FjaGU6IHsgcGFnZTogc3RyaW5nIH0gPSB7fSBhcyBhbnk7XG4gICAgcHJpdmF0ZSBjb21waWxlZFBhZ2U7XG5cbiAgICBwcml2YXRlIHByZWNvbXBpbGVkTWVudTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBIdG1sRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGhlbHBlciA9IG5ldyBIdG1sRW5naW5lSGVscGVycygpO1xuICAgICAgICBoZWxwZXIucmVnaXN0ZXJIZWxwZXJzKEhhbmRsZWJhcnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUh0bWxFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEh0bWxFbmdpbmUuaW5zdGFuY2UgPSBuZXcgSHRtbEVuZ2luZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIdG1sRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KHRlbXBsYXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWxzID0gW1xuICAgICAgICAgICAgJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICdtYXJrZG93bicsXG4gICAgICAgICAgICAnbW9kdWxlcycsXG4gICAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAgICdjb21wb25lbnQnLFxuICAgICAgICAgICAgJ2NvbnRyb2xsZXInLFxuICAgICAgICAgICAgJ2VudGl0eScsXG4gICAgICAgICAgICAnY29tcG9uZW50LWRldGFpbCcsXG4gICAgICAgICAgICAnZGlyZWN0aXZlJyxcbiAgICAgICAgICAgICdpbmplY3RhYmxlJyxcbiAgICAgICAgICAgICdpbnRlcmNlcHRvcicsXG4gICAgICAgICAgICAnZ3VhcmQnLFxuICAgICAgICAgICAgJ3BpcGUnLFxuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdpbnRlcmZhY2UnLFxuICAgICAgICAgICAgJ3JvdXRlcycsXG4gICAgICAgICAgICAnaW5kZXgnLFxuICAgICAgICAgICAgJ2luZGV4LW1pc2MnLFxuICAgICAgICAgICAgJ3NlYXJjaC1yZXN1bHRzJyxcbiAgICAgICAgICAgICdzZWFyY2gtaW5wdXQnLFxuICAgICAgICAgICAgJ2xpbmstdHlwZScsXG4gICAgICAgICAgICAnYmxvY2stbWV0aG9kJyxcbiAgICAgICAgICAgICdibG9jay1ob3N0LWxpc3RlbmVyJyxcbiAgICAgICAgICAgICdibG9jay1lbnVtJyxcbiAgICAgICAgICAgICdibG9jay1wcm9wZXJ0eScsXG4gICAgICAgICAgICAnYmxvY2staW5kZXgnLFxuICAgICAgICAgICAgJ2Jsb2NrLWNvbnN0cnVjdG9yJyxcbiAgICAgICAgICAgICdibG9jay10eXBlYWxpYXMnLFxuICAgICAgICAgICAgJ2Jsb2NrLWFjY2Vzc29ycycsXG4gICAgICAgICAgICAnYmxvY2staW5wdXQnLFxuICAgICAgICAgICAgJ2Jsb2NrLW91dHB1dCcsXG4gICAgICAgICAgICAnY292ZXJhZ2UtcmVwb3J0JyxcbiAgICAgICAgICAgICd1bml0LXRlc3QtcmVwb3J0JyxcbiAgICAgICAgICAgICdtaXNjZWxsYW5lb3VzLWZ1bmN0aW9ucycsXG4gICAgICAgICAgICAnbWlzY2VsbGFuZW91cy12YXJpYWJsZXMnLFxuICAgICAgICAgICAgJ21pc2NlbGxhbmVvdXMtdHlwZWFsaWFzZXMnLFxuICAgICAgICAgICAgJ21pc2NlbGxhbmVvdXMtZW51bWVyYXRpb25zJyxcbiAgICAgICAgICAgICdhZGRpdGlvbmFsLXBhZ2UnLFxuICAgICAgICAgICAgJ3BhY2thZ2UtZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICdwYWNrYWdlLXByb3BlcnRpZXMnXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0ZW1wbGF0ZVBhdGgpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRlbXBsYXRlUGF0aCBpcyBhYnNvbHV0ZSBvciByZWxhdGl2ZVxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRUZW1wbGF0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUodGVtcGxhdGVQYXRoKVxuICAgICAgICAgICAgICAgID8gdGVtcGxhdGVQYXRoXG4gICAgICAgICAgICAgICAgOiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgdGVtcGxhdGVQYXRoKTtcblxuICAgICAgICAgICAgaWYgKEZpbGVFbmdpbmUuZXhpc3RzU3luYyhyZXNvbHZlZFRlbXBsYXRlUGF0aCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZSBwYXRoIHNwZWNpZmljZWQgYnV0IGRvZXMgbm90IGV4aXN0Li4udXNpbmcgZGVmYXVsdCB0ZW1wbGF0ZXMnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHBhcnRpYWxzLm1hcChwYXJ0aWFsID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0aWFsUGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICdwYXJ0aWFscy8nICsgcGFydGlhbCArICcuaGJzJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KHBhcnRpYWxQYXRoKS50aGVuKGRhdGEgPT5cbiAgICAgICAgICAgICAgICAgICAgSGFuZGxlYmFycy5yZWdpc3RlclBhcnRpYWwocGFydGlhbCwgZGF0YSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VQYXRoID0gdGhpcy5kZXRlcm1pbmVUZW1wbGF0ZVBhdGgodGVtcGxhdGVQYXRoLCAncGFnZS5oYnMnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQocGFnZVBhdGgpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUucGFnZSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGlsZWRQYWdlID0gSGFuZGxlYmFycy5jb21waWxlKHRoaXMuY2FjaGUucGFnZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudEluZGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVudVBhdGggPSB0aGlzLmRldGVybWluZVRlbXBsYXRlUGF0aCh0ZW1wbGF0ZVBhdGgsICdwYXJ0aWFscy9tZW51LmhicycpO1xuICAgICAgICAgICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldChtZW51UGF0aCkudGhlbihtZW51VGVtcGxhdGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWNvbXBpbGVkTWVudSA9IEhhbmRsZWJhcnMuY29tcGlsZShtZW51VGVtcGxhdGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRJbmRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyTWVudSh0ZW1wbGF0ZVBhdGgsIGRhdGEpIHtcbiAgICAgICAgY29uc3QgbWVudVBhdGggPSB0aGlzLmRldGVybWluZVRlbXBsYXRlUGF0aCh0ZW1wbGF0ZVBhdGgsICdwYXJ0aWFscy9tZW51LmhicycpO1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQobWVudVBhdGgpLnRoZW4obWVudVRlbXBsYXRlID0+IHtcbiAgICAgICAgICAgIGRhdGEubWVudSA9ICdub3JtYWwnO1xuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWJhcnMuY29tcGlsZShtZW51VGVtcGxhdGUsIHtcbiAgICAgICAgICAgICAgICBwcmV2ZW50SW5kZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN0cmljdDogdHJ1ZVxuICAgICAgICAgICAgfSkoeyAuLi5kYXRhIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKG1haW5EYXRhOiBhbnksIHBhZ2U6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG8gPSBtYWluRGF0YTtcbiAgICAgICAgKE9iamVjdCBhcyBhbnkpLmFzc2lnbihvLCBwYWdlKTtcblxuICAgICAgICAvLyBsZXQgbWVtID0gcHJvY2Vzcy5tZW1vcnlVc2FnZSgpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgaGVhcFRvdGFsOiAke21lbS5oZWFwVG90YWx9IHwgaGVhcFVzZWQ6ICR7bWVtLmhlYXBVc2VkfWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkUGFnZSh7XG4gICAgICAgICAgICBkYXRhOiBvXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGRldGVybWluZVRlbXBsYXRlUGF0aCh0ZW1wbGF0ZVBhdGg6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBvdXRQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSArICcvLi4vc3JjL3RlbXBsYXRlcy8nICsgZmlsZVBhdGgpO1xuICAgICAgICBpZiAodGVtcGxhdGVQYXRoKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgYm90aCBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUgdGVtcGxhdGUgcGF0aHMgY29ycmVjdGx5XG4gICAgICAgICAgICBjb25zdCBiYXNlVGVtcGxhdGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHRlbXBsYXRlUGF0aClcbiAgICAgICAgICAgICAgICA/IHRlbXBsYXRlUGF0aFxuICAgICAgICAgICAgICAgIDogcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIHRlbXBsYXRlUGF0aCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRlc3RQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VUZW1wbGF0ZVBhdGggKyBwYXRoLnNlcCArIGZpbGVQYXRoKTtcbiAgICAgICAgICAgIG91dFBhdGggPSBGaWxlRW5naW5lLmV4aXN0c1N5bmModGVzdFBhdGgpID8gdGVzdFBhdGggOiBvdXRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRQYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZUNvdmVyYWdlQmFkZ2Uob3V0cHV0Rm9sZGVyLCBsYWJlbCwgY292ZXJhZ2VEYXRhKSB7XG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldChcbiAgICAgICAgICAgIHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUgKyAnLy4uL3NyYy90ZW1wbGF0ZXMvcGFydGlhbHMvY292ZXJhZ2UtYmFkZ2UuaGJzJylcbiAgICAgICAgKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGU6IGFueSA9IEhhbmRsZWJhcnMuY29tcGlsZShkYXRhKTtcbiAgICAgICAgICAgICAgICBjb3ZlcmFnZURhdGEubGFiZWwgPSBsYWJlbDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0ZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGNvdmVyYWdlRGF0YVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RPdXRwdXREaXIgPSBvdXRwdXRGb2xkZXIubWF0Y2gocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RPdXRwdXREaXIgJiYgdGVzdE91dHB1dERpci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlci5yZXBsYWNlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxlRW5naW5lLndyaXRlKFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIgKyBwYXRoLnNlcCArICcvaW1hZ2VzL2NvdmVyYWdlLWJhZGdlLScgKyBsYWJlbCArICcuc3ZnJyxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBjb3ZlcmFnZSBiYWRnZSAnICsgbGFiZWwgKyAnIGZpbGUgZ2VuZXJhdGlvbiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnIgPT4gUHJvbWlzZS5yZWplY3QoJ0Vycm9yIGR1cmluZyBjb3ZlcmFnZSBiYWRnZSBnZW5lcmF0aW9uJylcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEh0bWxFbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBGaWxlRW5naW5lIGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuaW1wb3J0IEkxOG5FbmdpbmUgZnJvbSAnLi9pMThuLmVuZ2luZSc7XG5pbXBvcnQgeyBtYXJrZWRBY2wgfSBmcm9tICcuLi8uLi91dGlscy9tYXJrZWQuYWNsJztcblxuY29uc3QgZGVjYWNoZSA9IHJlcXVpcmUoJ2RlY2FjaGUnKTtcblxuZXhwb3J0IGludGVyZmFjZSBtYXJrZG93blJlYWRlZERhdGFzIHtcbiAgICBtYXJrZG93bjogc3RyaW5nO1xuICAgIHJhd0RhdGE6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hcmtkb3duRW5naW5lIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIG1hcmtkb3duIGZpbGVzIHdpdGhvdXQgLm1kIGV4dGVuc2lvblxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFya2Rvd25GaWxlcyA9IFsnUkVBRE1FJywgJ0NIQU5HRUxPRycsICdMSUNFTlNFJywgJ0NPTlRSSUJVVElORycsICdUT0RPJ107XG5cbiAgICBwcml2YXRlIG1hcmtlZEluc3RhbmNlO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE1hcmtkb3duRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGRlY2FjaGUoJ21hcmtlZCcpO1xuICAgICAgICB0aGlzLm1hcmtlZEluc3RhbmNlID0gbWFya2VkQWNsO1xuXG4gICAgICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IHRoaXMubWFya2VkSW5zdGFuY2UuUmVuZGVyZXIoKTtcbiAgICAgICAgcmVuZGVyZXIuY29kZSA9IChjb2RlLCBsYW5ndWFnZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGhpZ2hsaWdodGVkID0gY29kZTtcbiAgICAgICAgICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdub25lJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGlnaGxpZ2h0ZWQgPSB0aGlzLmVzY2FwZShjb2RlKTtcbiAgICAgICAgICAgIHJldHVybiBgPGI+JHtJMThuRW5naW5lLnRyYW5zbGF0ZShcbiAgICAgICAgICAgICAgICAnZXhhbXBsZSdcbiAgICAgICAgICAgICl9IDo8L2I+PGRpdj48cHJlIGNsYXNzPVwibGluZS1udW1iZXJzXCI+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS0ke2xhbmd1YWdlfVwiPiR7aGlnaGxpZ2h0ZWR9PC9jb2RlPjwvcHJlPjwvZGl2PmA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVuZGVyZXIudGFibGUgPSAoaGVhZGVyLCBib2R5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICc8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCBjb21wb2RvYy10YWJsZVwiPlxcbicgK1xuICAgICAgICAgICAgICAgICc8dGhlYWQ+XFxuJyArXG4gICAgICAgICAgICAgICAgaGVhZGVyICtcbiAgICAgICAgICAgICAgICAnPC90aGVhZD5cXG4nICtcbiAgICAgICAgICAgICAgICAnPHRib2R5PlxcbicgK1xuICAgICAgICAgICAgICAgIGJvZHkgK1xuICAgICAgICAgICAgICAgICc8L3Rib2R5PlxcbicgK1xuICAgICAgICAgICAgICAgICc8L3RhYmxlPlxcbidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVuZGVyZXIuaW1hZ2UgPSBmdW5jdGlvbiAoaHJlZjogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGxldCBvdXQgPSAnPGltZyBzcmM9XCInICsgaHJlZiArICdcIiBhbHQ9XCInICsgdGV4dCArICdcIiBjbGFzcz1cImltZy1yZXNwb25zaXZlXCInO1xuICAgICAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICcgdGl0bGU9XCInICsgdGl0bGUgKyAnXCInO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0ICs9ICc+JztcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5tYXJrZWRJbnN0YW5jZS5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgIHJlbmRlcmVyOiByZW5kZXJlcixcbiAgICAgICAgICAgIGdmbTogdHJ1ZSxcbiAgICAgICAgICAgIGJyZWFrczogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghTWFya2Rvd25FbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIE1hcmtkb3duRW5naW5lLmluc3RhbmNlID0gbmV3IE1hcmtkb3duRW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hcmtkb3duRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmFkaXRpb25hbE1hcmtkb3duKGZpbGVwYXRoOiBzdHJpbmcpOiBQcm9taXNlPG1hcmtkb3duUmVhZGVkRGF0YXM+IHtcbiAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIGZpbGVwYXRoICsgJy5tZCcpXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IEZpbGVFbmdpbmUuZ2V0KHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIGZpbGVwYXRoKSlcbiAgICAgICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVybmVkRGF0YTogbWFya2Rvd25SZWFkZWREYXRhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgbWFya2Rvd246IHRoaXMubWFya2VkSW5zdGFuY2UoZGF0YSksXG4gICAgICAgICAgICAgICAgICAgIHJhd0RhdGE6IGRhdGFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5lZERhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJhZGl0aW9uYWxNYXJrZG93blN5bmMoZmlsZXBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcmtlZEluc3RhbmNlKEZpbGVFbmdpbmUuZ2V0U3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBmaWxlcGF0aCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVhZG1lRmlsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgJ1JFQURNRS5tZCcpLnRoZW4oZGF0YSA9PlxuICAgICAgICAgICAgdGhpcy5tYXJrZWRJbnN0YW5jZShkYXRhKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShmaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlKTtcbiAgICAgICAgbGV0IHJlYWRtZUZpbGUgPSBkaXJuYW1lICsgcGF0aC5zZXAgKyBwYXRoLmJhc2VuYW1lKGZpbGUsICcudHMnKSArICcubWQnO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHJlYWRtZUZpbGUsICd1dGY4Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc05laWdoYm91clJlYWRtZUZpbGUoZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGUpO1xuICAgICAgICBsZXQgcmVhZG1lRmlsZSA9IGRpcm5hbWUgKyBwYXRoLnNlcCArIHBhdGguYmFzZW5hbWUoZmlsZSwgJy50cycpICsgJy5tZCc7XG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmV4aXN0c1N5bmMocmVhZG1lRmlsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb21wb25lbnRSZWFkbWVGaWxlKGZpbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGUpO1xuICAgICAgICBsZXQgcmVhZG1lRmlsZSA9IGRpcm5hbWUgKyBwYXRoLnNlcCArICdSRUFETUUubWQnO1xuICAgICAgICBsZXQgcmVhZG1lQWx0ZXJuYXRpdmVGaWxlID0gZGlybmFtZSArIHBhdGguc2VwICsgcGF0aC5iYXNlbmFtZShmaWxlLCAnLnRzJykgKyAnLm1kJztcbiAgICAgICAgbGV0IGZpbmFsUGF0aCA9ICcnO1xuICAgICAgICBpZiAoRmlsZUVuZ2luZS5leGlzdHNTeW5jKHJlYWRtZUZpbGUpKSB7XG4gICAgICAgICAgICBmaW5hbFBhdGggPSByZWFkbWVGaWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxQYXRoID0gcmVhZG1lQWx0ZXJuYXRpdmVGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFBhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFueSBvZiB0aGUgbWFya2Rvd24gZmlsZXMgaXMgZXhpc3RzIHdpdGggb3Igd2l0aG91dCBlbmRpbmdzXG4gICAgICovXG4gICAgcHVibGljIGhhc1Jvb3RNYXJrZG93bnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZEVuZGluZ3ModGhpcy5tYXJrZG93bkZpbGVzKS5zb21lKHggPT5cbiAgICAgICAgICAgIEZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyB4KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0Um9vdE1hcmtkb3ducygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBmb3VuZEZpbGVzID0gdGhpcy5tYXJrZG93bkZpbGVzLmZpbHRlcihcbiAgICAgICAgICAgIHggPT5cbiAgICAgICAgICAgICAgICBGaWxlRW5naW5lLmV4aXN0c1N5bmMocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgeCArICcubWQnKSB8fFxuICAgICAgICAgICAgICAgIEZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyB4KVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEVuZGluZ3MoZm91bmRGaWxlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlc2NhcGUoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGh0bWxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvJy9nLCAnJiMzOTsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL0AvZywgJyYjNjQ7Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWydSRUFETUUnXSA9PiBbJ1JFQURNRScsICdSRUFETUUubWQnXVxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkRW5kaW5ncyhmaWxlczogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gXy5mbGF0TWFwKGZpbGVzLCB4ID0+IFt4LCB4ICsgJy5tZCddKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hcmtkb3duRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgRGVwZW5kZW5jaWVzRW5naW5lIGZyb20gJy4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuY29uc3QgbmdkVCA9IHJlcXVpcmUoJ0Bjb21wb2RvYy9uZ2QtdHJhbnNmb3JtZXInKTtcblxuZXhwb3J0IGNsYXNzIE5nZEVuZ2luZSB7XG4gICAgcHVibGljIGVuZ2luZTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBOZ2RFbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFOZ2RFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIE5nZEVuZ2luZS5pbnN0YW5jZSA9IG5ldyBOZ2RFbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTmdkRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KG91dHB1dHBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmVuZ2luZSA9IG5ldyBuZ2RULkRvdEVuZ2luZSh7XG4gICAgICAgICAgICBvdXRwdXQ6IG91dHB1dHBhdGgsXG4gICAgICAgICAgICBkaXNwbGF5TGVnZW5kOiB0cnVlLFxuICAgICAgICAgICAgb3V0cHV0Rm9ybWF0czogJ3N2ZycsXG4gICAgICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlckdyYXBoKGZpbGVwYXRoOiBzdHJpbmcsIG91dHB1dHBhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZU91dHB1dChvdXRwdXRwYXRoKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2YnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZ2VuZXJhdGVHcmFwaChbRGVwZW5kZW5jaWVzRW5naW5lLmdldFJhd01vZHVsZShuYW1lKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lLmdlbmVyYXRlR3JhcGgoRGVwZW5kZW5jaWVzRW5naW5lLnJhd01vZHVsZXNGb3JPdmVydmlldyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEdyYXBoKGZpbGVwYXRoOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldChmaWxlcGF0aCkuY2F0Y2goZXJyID0+XG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdCgnRXJyb3IgZHVyaW5nIGdyYXBoIHJlYWQgJyArIG5hbWUpXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBOZ2RFbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImV4cG9ydCBjb25zdCBDT01QT0RPQ19DT05TVEFOVFMgPSB7XG4gICAgbmF2VGFiRGVmaW5pdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdpbmZvJyxcbiAgICAgICAgICAgIGhyZWY6ICcjaW5mbycsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ2luZm8nLFxuICAgICAgICAgICAgbGFiZWw6ICdJbmZvJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2FsbCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAncmVhZG1lJyxcbiAgICAgICAgICAgIGhyZWY6ICcjcmVhZG1lJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAncmVhZG1lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUkVBRE1FJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2FsbCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnc291cmNlJyxcbiAgICAgICAgICAgIGhyZWY6ICcjc291cmNlJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnc291cmNlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnU291cmNlJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2FsbCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndGVtcGxhdGVEYXRhJyxcbiAgICAgICAgICAgIGhyZWY6ICcjdGVtcGxhdGVEYXRhJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAndGVtcGxhdGUnLFxuICAgICAgICAgICAgbGFiZWw6ICdUZW1wbGF0ZScsXG4gICAgICAgICAgICBkZXBUeXBlczogWydjb21wb25lbnQnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3N0eWxlRGF0YScsXG4gICAgICAgICAgICBocmVmOiAnI3N0eWxlRGF0YScsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ3N0eWxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnU3R5bGVzJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2NvbXBvbmVudCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndHJlZScsXG4gICAgICAgICAgICBocmVmOiAnI3RyZWUnLFxuICAgICAgICAgICAgJ2RhdGEtbGluayc6ICdkb20tdHJlZScsXG4gICAgICAgICAgICBsYWJlbDogJ0RPTSBUcmVlJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2NvbXBvbmVudCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnZXhhbXBsZScsXG4gICAgICAgICAgICBocmVmOiAnI2V4YW1wbGUnLFxuICAgICAgICAgICAgJ2RhdGEtbGluayc6ICdleGFtcGxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnRXhhbXBsZXMnLFxuICAgICAgICAgICAgZGVwVHlwZXM6IFsnY29tcG9uZW50JywgJ2RpcmVjdGl2ZScsICdpbmplY3RhYmxlJywgJ3BpcGUnXVxuICAgICAgICB9XG4gICAgXVxufTtcblxuLyoqXG4gKiBNYXggbGVuZ3RoIGZvciB0aGUgc3RyaW5nIG9mIGEgZmlsZSBkdXJpbmcgTHVuciBzZWFyY2ggZW5naW5lIGluZGV4aW5nLlxuICogUHJldmVudCBzdGFjayBzaXplIGV4Y2VlZGVkXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0laRV9GSUxFX1NFQVJDSF9JTkRFWCA9IDUwMDAwO1xuXG4vKipcbiAqIE1heCBsZW5ndGggZm9yIHRoZSBzdHJpbmcgb2YgYSBmaWxlIGR1cmluZyBjaGVlcmlvIHBhcnNpbmcuXG4gKiBQcmV2ZW50IHN0YWNrIHNpemUgZXhjZWVkZWRcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TSVpFX0ZJTEVfQ0hFRVJJT19QQVJTSU5HID0gNDAwMDAwMDAwO1xuIiwiY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGRlY29kZSB9IGZyb20gJ2h0bWwtZW50aXRpZXMnO1xuXG5pbXBvcnQgeyBNQVhfU0laRV9GSUxFX0NIRUVSSU9fUEFSU0lORywgTUFYX1NJWkVfRklMRV9TRUFSQ0hfSU5ERVggfSBmcm9tICcuLi8uLi91dGlscy9jb25zdGFudHMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcblxuY29uc3QgbHVucjogYW55ID0gcmVxdWlyZSgnbHVucicpO1xuXG5leHBvcnQgY2xhc3MgU2VhcmNoRW5naW5lIHtcbiAgICBwdWJsaWMgc2VhcmNoSW5kZXg6IGFueTtcbiAgICBwcml2YXRlIHNlYXJjaERvY3VtZW50cyA9IFtdO1xuICAgIHB1YmxpYyBkb2N1bWVudHNTdG9yZTogT2JqZWN0ID0ge307XG4gICAgcHVibGljIGluZGV4U2l6ZTogbnVtYmVyO1xuICAgIHB1YmxpYyBhbW91bnRPZk1lbW9yeSA9IDA7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogU2VhcmNoRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghU2VhcmNoRW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBTZWFyY2hFbmdpbmUuaW5zdGFuY2UgPSBuZXcgU2VhcmNoRW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNlYXJjaEVuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5kZXhQYWdlKHBhZ2UpIHtcbiAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgIHRoaXMuYW1vdW50T2ZNZW1vcnkgKz0gcGFnZS5yYXdEYXRhLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuYW1vdW50T2ZNZW1vcnkgPCBNQVhfU0laRV9GSUxFX0NIRUVSSU9fUEFSU0lORykge1xuICAgICAgICAgICAgbGV0IGluZGV4U3RhcnRDb250ZW50ID0gcGFnZS5yYXdEYXRhLmluZGV4T2YoJzwhLS0gU1RBUlQgQ09OVEVOVCAtLT4nKTtcbiAgICAgICAgICAgIGxldCBpbmRleEVuZENvbnRlbnQgPSBwYWdlLnJhd0RhdGEuaW5kZXhPZignPCEtLSBFTkQgQ09OVEVOVCAtLT4nKTtcblxuICAgICAgICAgICAgbGV0ICQgPSBjaGVlcmlvLmxvYWQocGFnZS5yYXdEYXRhLnN1YnN0cmluZyhpbmRleFN0YXJ0Q29udGVudCArIDEsIGluZGV4RW5kQ29udGVudCkpO1xuXG4gICAgICAgICAgICB0ZXh0ID0gJCgnLmNvbnRlbnQnKS5odG1sKCk7XG4gICAgICAgICAgICB0ZXh0ID0gZGVjb2RlKHRleHQpO1xuICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKDwoW14+XSspPikvZ2ksICcnKTtcblxuICAgICAgICAgICAgcGFnZS51cmwgPSBwYWdlLnVybC5yZXBsYWNlKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LCAnJyk7XG5cbiAgICAgICAgICAgIGxldCBkb2MgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiBwYWdlLnVybCxcbiAgICAgICAgICAgICAgICB0aXRsZTogcGFnZS5pbmZvcy5jb250ZXh0ICsgJyAtICcgKyBwYWdlLmluZm9zLm5hbWUsXG4gICAgICAgICAgICAgICAgYm9keTogdGV4dFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICF0aGlzLmRvY3VtZW50c1N0b3JlLmhhc093blByb3BlcnR5KGRvYy51cmwpICYmXG4gICAgICAgICAgICAgICAgZG9jLmJvZHkubGVuZ3RoIDwgTUFYX1NJWkVfRklMRV9TRUFSQ0hfSU5ERVhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRzU3RvcmVbZG9jLnVybF0gPSBkb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hEb2N1bWVudHMucHVzaChkb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlU2VhcmNoSW5kZXhKc29uKG91dHB1dEZvbGRlcjogc3RyaW5nKTogUHJvbWlzZSB7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcbiAgICAgICAgbGV0IHNlYXJjaEluZGV4ID0gbHVucihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1pbnZhbGlkLXRoaXMgKi9cbiAgICAgICAgICAgIHRoaXMucmVmKCd1cmwnKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJyk7XG4gICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG4gICAgICAgICAgICB0aGlzLnBpcGVsaW5lLnJlbW92ZShsdW5yLnN0ZW1tZXIpO1xuXG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhhdC5zZWFyY2hEb2N1bWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZCh0aGF0LnNlYXJjaERvY3VtZW50c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQoX19kaXJuYW1lICsgJy8uLi9zcmMvdGVtcGxhdGVzL3BhcnRpYWxzL3NlYXJjaC1pbmRleC5oYnMnKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlOiBhbnkgPSBIYW5kbGViYXJzLmNvbXBpbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRlbXBsYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IEpTT04uc3RyaW5naWZ5KHNlYXJjaEluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmU6IEpTT04uc3RyaW5naWZ5KHRoaXMuZG9jdW1lbnRzU3RvcmUpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSBvdXRwdXRGb2xkZXIubWF0Y2gocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RPdXRwdXREaXIgJiYgdGVzdE91dHB1dERpci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlci5yZXBsYWNlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxlRW5naW5lLndyaXRlKFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIgKyBwYXRoLnNlcCArICcvanMvc2VhcmNoL3NlYXJjaF9pbmRleC5qcycsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgc2VhcmNoIGluZGV4IGZpbGUgZ2VuZXJhdGlvbiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnIgPT4gUHJvbWlzZS5yZWplY3QoJ0Vycm9yIGR1cmluZyBzZWFyY2ggaW5kZXggZ2VuZXJhdGlvbicpXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZWFyY2hFbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcblxuY2xhc3MgQ29tcG9uZW50c1RyZWVFbmdpbmUge1xuICAgIHByaXZhdGUgY29tcG9uZW50czogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIGNvbXBvbmVudHNGb3JUcmVlOiBhbnlbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbXBvbmVudHNUcmVlRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghQ29tcG9uZW50c1RyZWVFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIENvbXBvbmVudHNUcmVlRW5naW5lLmluc3RhbmNlID0gbmV3IENvbXBvbmVudHNUcmVlRW5naW5lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbXBvbmVudHNUcmVlRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkVGVtcGxhdGVzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuY29tcG9uZW50c0ZvclRyZWUubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPD0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS50ZW1wbGF0ZVVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVQYXRoID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnNlcCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHRoaXMuY29tcG9uZW50c0ZvclRyZWVbaV0uZmlsZSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguc2VwICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlVXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUVuZ2luZS5nZXQoZmlsZVBhdGgpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS50ZW1wbGF0ZURhdGEgPSB0ZW1wbGF0ZURhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0ZvclRyZWVbaV0udGVtcGxhdGVEYXRhID0gdGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRDaGlsZHJlbkFuZFBhcmVudHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb21wb25lbnRzRm9yVHJlZSwgY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgJGNvbXBvbmVudCA9IGNoZWVyaW8oY29tcG9uZW50LnRlbXBsYXRlRGF0YSk7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMuY29tcG9uZW50c0ZvclRyZWUsIGNvbXBvbmVudFRvRmluZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkY29tcG9uZW50LmZpbmQoY29tcG9uZW50VG9GaW5kLnNlbGVjdG9yKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjb21wb25lbnRUb0ZpbmQubmFtZSArICcgZm91bmQgaW4gJyArIGNvbXBvbmVudC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5jaGlsZHJlbi5wdXNoKGNvbXBvbmVudFRvRmluZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlVHJlZXNGb3JDb21wb25lbnRzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMuY29tcG9uZW50cywgY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgX2NvbXBvbmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IGNvbXBvbmVudC5maWxlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogY29tcG9uZW50LnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC50ZW1wbGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbXBvbmVudC50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC50ZW1wbGF0ZVVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQudGVtcGxhdGVVcmwgPSBjb21wb25lbnQudGVtcGxhdGVVcmxbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0ZvclRyZWUucHVzaChfY29tcG9uZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZWFkVGVtcGxhdGVzKCkudGhlbihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZENoaWxkcmVuQW5kUGFyZW50cygpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMuY29tcG9uZW50c0ZvclRyZWU6ICcsIHRoaXMuY29tcG9uZW50c0ZvclRyZWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9uZW50c1RyZWVFbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCB7IFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBTdHJpbmdpZnlBcnJvd0Z1bmN0aW9uKGFmKSB7XG4gICAgbGV0IGkgPSAwLFxuICAgICAgICByZXN1bHQgPSAnKCc7XG4gICAgY29uc3QgbGVuID0gYWYucGFyYW1ldGVycy5sZW5ndGg7XG4gICAgaWYgKGxlbiA9PT0gMSkge1xuICAgICAgICByZXN1bHQgPSAnJztcbiAgICB9XG4gICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGFmLnBhcmFtZXRlcnNbaV0ubmFtZSAmJiBhZi5wYXJhbWV0ZXJzW2ldLm5hbWUuZXNjYXBlZFRleHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBhZi5wYXJhbWV0ZXJzW2ldLm5hbWUuZXNjYXBlZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJywgJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobGVuID4gMSB8fCBsZW4gPT09IDApIHtcbiAgICAgICAgcmVzdWx0ICs9ICcpJztcbiAgICB9XG4gICAgLy8gYm9keVxuICAgIHJlc3VsdCArPSAnID0+ICc7XG4gICAgaWYgKGFmLmJvZHkpIHtcbiAgICAgICAgaWYgKGFmLmJvZHkua2luZCA9PT0gU3ludGF4S2luZC5JZGVudGlmaWVyICYmIGFmLmJvZHkuZXNjYXBlZFRleHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBhZi5ib2R5LmVzY2FwZWRUZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgYWYuYm9keS5raW5kID09PSBTeW50YXhLaW5kLlByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgYWYuYm9keS5leHByZXNzaW9uICYmXG4gICAgICAgICAgICBhZi5ib2R5Lm5hbWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYWYuYm9keS5leHByZXNzaW9uLmVzY2FwZWRUZXh0O1xuICAgICAgICAgICAgcmVzdWx0ICs9ICcuJyArIGFmLmJvZHkubmFtZS5lc2NhcGVkVGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChhZi5ib2R5LmtpbmQgPT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCAmJiBhZi5ib2R5LnRleHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBhZi5ib2R5LnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCB7IFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5pbXBvcnQgeyBTdHJpbmdpZnlBcnJvd0Z1bmN0aW9uIH0gZnJvbSAnLi9hcnJvdy1mdW5jdGlvbi51dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIFN0cmluZ2lmeU9iamVjdExpdGVyYWxFeHByZXNzaW9uKG9sZSkge1xuICAgIGxldCByZXR1cm5lZFN0cmluZyA9ICd7JztcblxuICAgIGlmIChvbGUucHJvcGVydGllcyAmJiBvbGUucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9sZS5wcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5lZFN0cmluZyArPSBwcm9wZXJ0eS5uYW1lLnRleHQgKyAnOiAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFN0cmluZyArPSBgJ2AgKyBwcm9wZXJ0eS5pbml0aWFsaXplci50ZXh0ICsgYCdgO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5UcnVlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFN0cmluZyArPSBgdHJ1ZWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5pbml0aWFsaXplci5raW5kID09PSBTeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFN0cmluZyArPSBgZmFsc2VgO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9IFN0cmluZ2lmeUFycm93RnVuY3Rpb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9IHByb3BlcnR5LmluaXRpYWxpemVyLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGluZGV4IDwgb2xlLnByb3BlcnRpZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9ICcsICc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybmVkU3RyaW5nICs9ICd9JztcblxuICAgIHJldHVybiByZXR1cm5lZFN0cmluZztcbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9kZUhhc0RlY29yYXRvcihub2RlOiB0cy5Ob2RlKSB7XG4gICAgLy8gSW4gVHlwZVNjcmlwdCA1LngsIGRlY29yYXRvcnMgYXJlIGFjY2Vzc2VkIHZpYSB0cy5nZXREZWNvcmF0b3JzKCksIG5vdCB0cy5nZXRNb2RpZmllcnMoKVxuICAgIGNvbnN0IGRlY29yYXRvcnMgPSB0cy5nZXREZWNvcmF0b3JzKG5vZGUgYXMgdHMuSGFzRGVjb3JhdG9ycyk7XG4gICAgcmV0dXJuIGRlY29yYXRvcnMgIT09IHVuZGVmaW5lZCAmJiBkZWNvcmF0b3JzLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlRGVjb3JhdG9ycyhub2RlOiB0cy5Ob2RlKTogdHMuRGVjb3JhdG9yW10ge1xuICAgIC8vIEluIFR5cGVTY3JpcHQgNS54LCBkZWNvcmF0b3JzIGFyZSBhY2Nlc3NlZCB2aWEgdHMuZ2V0RGVjb3JhdG9ycygpLCBub3QgdHMuZ2V0TW9kaWZpZXJzKClcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gdHMuZ2V0RGVjb3JhdG9ycyhub2RlIGFzIHRzLkhhc0RlY29yYXRvcnMpO1xuICAgIHJldHVybiBkZWNvcmF0b3JzID8gWy4uLmRlY29yYXRvcnNdIDogW107XG59XG4iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5pbXBvcnQgeyBnZXROYW1lc0NvbXBhcmVGbiwgbWVyZ2VUYWdzQW5kQXJncywgbWFya2VkdGFncyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7IGtpbmRUb1R5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9raW5kLXRvLXR5cGUnO1xuaW1wb3J0IHsgSnNkb2NQYXJzZXJVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvanNkb2MtcGFyc2VyLnV0aWwnO1xuaW1wb3J0IHsgaXNJZ25vcmUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgQW5ndWxhclZlcnNpb25VdGlsIGZyb20gJy4uLy4uLy4uLy4uLy4uLy91dGlscy9hbmd1bGFyLXZlcnNpb24udXRpbCc7XG5pbXBvcnQgQmFzaWNUeXBlVXRpbCBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9iYXNpYy10eXBlLnV0aWwnO1xuaW1wb3J0IHsgU3RyaW5naWZ5T2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9vYmplY3QtbGl0ZXJhbC1leHByZXNzaW9uLnV0aWwnO1xuXG5pbXBvcnQgRGVwZW5kZW5jaWVzRW5naW5lIGZyb20gJy4uLy4uLy4uLy4uL2VuZ2luZXMvZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFN0cmluZ2lmeUFycm93RnVuY3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9hcnJvdy1mdW5jdGlvbi51dGlsJztcbmltcG9ydCB7IGdldE5vZGVEZWNvcmF0b3JzLCBub2RlSGFzRGVjb3JhdG9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvbm9kZS51dGlsJztcbmltcG9ydCB7IG1hcmtlZEFjbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL21hcmtlZC5hY2wnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIENsYXNzSGVscGVyIHtcbiAgICBwcml2YXRlIGpzZG9jUGFyc2VyVXRpbCA9IG5ldyBKc2RvY1BhcnNlclV0aWwoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyKSB7fVxuXG4gICAgLyoqXG4gICAgICogSEVMUEVSU1xuICAgICAqL1xuXG4gICAgcHVibGljIHN0cmluZ2lmeURlZmF1bHRWYWx1ZShub2RlOiB0cy5Ob2RlKTogc3RyaW5nIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG5vZGUgJiYgKG5vZGUgYXMgYW55KS5nZXRUZXh0ICYmIG5vZGUuZ2V0VGV4dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXh0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZSAmJiBub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZhbHNlJztcbiAgICAgICAgfSBlbHNlIGlmIChub2RlICYmIG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5UcnVlS2V5d29yZCkge1xuICAgICAgICAgICAgcmV0dXJuICd0cnVlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0ZvckRlcHJlY2F0aW9uKHRhZ3M6IGFueVtdLCByZXN1bHQ6IHsgW2tleSBpbiBzdHJpbmcgfCBudW1iZXJdOiBhbnkgfSkge1xuICAgICAgICBfLmZvckVhY2godGFncywgdGFnID0+IHtcbiAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZSAmJiB0YWcudGFnTmFtZS50ZXh0ICYmIHRhZy50YWdOYW1lLnRleHQuaW5kZXhPZignZGVwcmVjYXRlZCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZGVwcmVjYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlcHJlY2F0aW9uTWVzc2FnZSA9IHRhZy5jb21tZW50IHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIEpTRG9jIHRhZ3MgYW5kIGFwcGx5IHRoZW0gdG8gYSByZXN1bHQgb2JqZWN0XG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzSlNEb2NUYWdzKFxuICAgICAgICBqc2RvY3RhZ3M6IGFueSxcbiAgICAgICAgcmVzdWx0OiBhbnksXG4gICAgICAgIGluY2x1ZGVUYWdzQXJyYXk6IGJvb2xlYW4gPSB0cnVlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBqc2RvYyA9IGpzZG9jdGFnc1swXTtcbiAgICAgICAgICAgIGlmIChqc2RvYyAmJiBqc2RvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jLnRhZ3MgYXMgdW5rbm93biBhcyBhbnlbXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZVRhZ3NBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvYy50YWdzIGFzIHVua25vd24gYXMgYW55W10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgYW5kIHByb2Nlc3MgSlNEb2MgY29tbWVudCBmb3IgYSBub2RlXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0QW5kUHJvY2Vzc0pTRG9jQ29tbWVudChcbiAgICAgICAgbm9kZTogYW55LFxuICAgICAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgICAgICByZXN1bHQ6IGFueVxuICAgICk6IHZvaWQge1xuICAgICAgICBpZiAobm9kZS5qc0RvYykge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKG5vZGUsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21tZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuZWREZXNjcmlwdGlvbiA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLnBhcnNlQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgICAgICAgICByZXN1bHQucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gbWFya2VkQWNsKGNsZWFuZWREZXNjcmlwdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGNvbW1vbiBmaWVsZHMgZm9yIGRvY3VtZW50ZWQgaXRlbXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXRpYWxpemVEb2N1bWVudGF0aW9uRmllbGRzKCk6IHtcbiAgICAgICAgZGVwcmVjYXRlZDogYm9vbGVhbjtcbiAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBzdHJpbmc7XG4gICAgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJydcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IGFuZCBmaWx0ZXIgbW9kaWZpZXIga2luZHMgZnJvbSBhIG5vZGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RNb2RpZmllcktpbmRzKG5vZGU6IGFueSk6IG51bWJlcltdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKCFub2RlLm1vZGlmaWVycyB8fCBub2RlLm1vZGlmaWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGtpbmRzID0gbm9kZS5tb2RpZmllcnMubWFwKG1vZGlmaWVyID0+IG1vZGlmaWVyLmtpbmQpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBfLmluZGV4T2Yoa2luZHMsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZCkgIT09IC0xICYmXG4gICAgICAgICAgICBfLmluZGV4T2Yoa2luZHMsIFN5bnRheEtpbmQuU3RhdGljS2V5d29yZCkgIT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgICAga2luZHMgPSBraW5kcy5maWx0ZXIoa2luZCA9PiBraW5kICE9PSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBraW5kcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbnN1cmUgcHJpdmF0ZSBrZXl3b3JkIGlzIGFkZGVkIGZvciBFQ01BU2NyaXB0IHByaXZhdGUgZmllbGRzXG4gICAgICovXG4gICAgcHJpdmF0ZSBlbnN1cmVQcml2YXRlS2V5d29yZChyZXN1bHQ6IGFueSwgbm9kZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzUHJpdmF0ZShub2RlKSkge1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQubW9kaWZpZXJLaW5kKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Lm1vZGlmaWVyS2luZCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaGFzQWxyZWFkeVByaXZhdGVLZXl3b3JkID0gcmVzdWx0Lm1vZGlmaWVyS2luZC5pbmNsdWRlcyhTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKTtcbiAgICAgICAgICAgIGlmICghaGFzQWxyZWFkeVByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Lm1vZGlmaWVyS2luZC5wdXNoKFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGZhbGxiYWNrIGRlc2NyaXB0aW9uIGZyb20ganNEb2NbMF0uY29tbWVudCBpZiBubyBkZXNjcmlwdGlvbiBleGlzdHNcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldEZhbGxiYWNrRGVzY3JpcHRpb24ocmVzdWx0OiBhbnksIG5vZGU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoIXJlc3VsdC5kZXNjcmlwdGlvbiAmJiBub2RlLmpzRG9jICYmIG5vZGUuanNEb2MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmpzRG9jWzBdLmNvbW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmF3RGVzY3JpcHRpb24gPSBub2RlLmpzRG9jWzBdLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnJhd2Rlc2NyaXB0aW9uID0gcmF3RGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gbWFya2VkQWNsKHJhd0Rlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGVjb3JhdG9yT2ZUeXBlKG5vZGUsIGRlY29yYXRvclR5cGUpIHtcbiAgICAgICAgbGV0IGRlY29yYXRvcnMgPSBnZXROb2RlRGVjb3JhdG9ycyhub2RlKSB8fCBbXTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBjb25zdCBsZW4gPSBkZWNvcmF0b3JzLmxlbmd0aDtcblxuICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNvcmF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwciA9IGRlY29yYXRvcnNbaV0uZXhwcmVzc2lvbiBhcyBhbnk7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwci5leHByZXNzaW9uLnRleHQgPT09IGRlY29yYXRvclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRlY29yYXRvcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsZW4gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHByID0gZGVjb3JhdG9yc1swXS5leHByZXNzaW9uIGFzIGFueTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwciAmJiBleHByLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHIuZXhwcmVzc2lvbi50ZXh0ID09PSBkZWNvcmF0b3JUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChkZWNvcmF0b3JzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0RGVjb3JhdG9ycyhkZWNvcmF0b3JzKSB7XG4gICAgICAgIGxldCBfZGVjb3JhdG9ycyA9IFtdO1xuXG4gICAgICAgIF8uZm9yRWFjaChkZWNvcmF0b3JzLCAoZGVjb3JhdG9yOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIF9kZWNvcmF0b3JzLnB1c2goeyBuYW1lOiBkZWNvcmF0b3IuZXhwcmVzc2lvbi50ZXh0IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5mbzogYW55ID0geyBuYW1lOiBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5zdHJpbmdpZmllZEFyZ3VtZW50cyA9IHRoaXMuc3RyaW5naWZ5QXJndW1lbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfZGVjb3JhdG9ycy5wdXNoKGluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIF9kZWNvcmF0b3JzO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRnVuY3Rpb24oYXJnKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGFyZy5mdW5jdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06ICgpID0+IHZvaWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFyZ3VtcyA9IGFyZy5mdW5jdGlvbi5tYXAoYXJndSA9PiB7XG4gICAgICAgICAgICBsZXQgX3Jlc3VsdCA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kKGFyZ3UudHlwZSk7XG4gICAgICAgICAgICBpZiAoX3Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5kYXRhLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAnY2xhc3NlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogPGEgaHJlZj1cIi4uLyR7cGF0aH1zLyR7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEubmFtZVxuICAgICAgICAgICAgICAgICAgICB9Lmh0bWxcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IEFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBcGlMaW5rKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyVmVyc2lvblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICApfTogPGEgaHJlZj1cIiR7cGF0aH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUoYXJndS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gQmFzaWNUeXBlVXRpbC5nZXRUeXBlVXJsKGFyZ3UudHlwZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJndS50eXBlfTwvYT5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJndS5uYW1lICYmIGFyZ3UudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogJHthcmd1LnR5cGV9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJndS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lLnRleHR9YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06ICgke2FyZ3Vtc30pID0+IHZvaWRgO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGFyZy5vcHRpb25hbCA/ICc/JyA6ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RyaW5naWZ5QXJndW1lbnRzKGFyZ3MpIHtcbiAgICAgICAgbGV0IHN0cmluZ2lmeUFyZ3MgPSBbXTtcblxuICAgICAgICBzdHJpbmdpZnlBcmdzID0gYXJnc1xuICAgICAgICAgICAgLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9yZXN1bHQgPSBEZXBlbmRlbmNpZXNFbmdpbmUuZmluZChhcmcudHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuc291cmNlID09PSAnaW50ZXJuYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuZGF0YS50eXBlID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICdjbGFzc2UnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogPGEgaHJlZj1cIi4uLyR7cGF0aH1zLyR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0uaHRtbFwiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IEFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBcGlMaW5rKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5kb3REb3REb3RUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYC4uLiR7YXJnLm5hbWV9OiAke2FyZy50eXBlfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRnVuY3Rpb24oYXJnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5leHByZXNzaW9uICYmIGFyZy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmcuZXhwcmVzc2lvbi50ZXh0ICsgJy4nICsgYXJnLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5leHByZXNzaW9uICYmIGFyZy5raW5kID09PSBTeW50YXhLaW5kLk5ld0V4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICduZXcgJyArIGFyZy5leHByZXNzaW9uLnRleHQgKyAnKCknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmtpbmQgJiYgYXJnLmtpbmQgPT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCdgICsgYXJnLnRleHQgKyBgJ2A7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgYXJnLmtpbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgYXJnLmtpbmQgPT09IFN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICBhcmcuZWxlbWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgYXJnLmVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYXJnLmVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdbJztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgJ2AgKyBhcmcuZWxlbWVudHNbaV0udGV4dCArIGAnYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXSc7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgYXJnLmtpbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgYXJnLmtpbmQgPT09IFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICBhcmcucGFyYW1ldGVycyAmJlxuICAgICAgICAgICAgICAgICAgICBhcmcucGFyYW1ldGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdpZnlBcnJvd0Z1bmN0aW9uKGFyZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcua2luZCAmJiBhcmcua2luZCA9PT0gU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5naWZ5T2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oYXJnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUoYXJnLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBCYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwoYXJnLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VwYXJhdG9yID0gJzonO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50ICs9IGFyZy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5raW5kID09PSBTeW50YXhLaW5kLkFzRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5leHByZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLmV4cHJlc3Npb24udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50ICs9IGFyZy5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gJyBhcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50ICs9IHRoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsU3RyaW5naWZpZWRBcmd1bWVudCArPSBzZXBhcmF0b3IgKyAnICcgKyB0aGlzLnZpc2l0VHlwZShhcmcudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJnLnRleHR9YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlBcmdzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UG9zaXRpb24obm9kZTogdHMuTm9kZSwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHRzLkxpbmVBbmRDaGFyYWN0ZXIge1xuICAgICAgICBsZXQgcG9zaXRpb246IHRzLkxpbmVBbmRDaGFyYWN0ZXI7XG4gICAgICAgIGlmICgobm9kZSBhcyBhbnkpLm5hbWUgJiYgKG5vZGUgYXMgYW55KS5uYW1lLmVuZCkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0cy5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihzb3VyY2VGaWxlLCAobm9kZSBhcyBhbnkpLm5hbWUuZW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdHMuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oc291cmNlRmlsZSwgbm9kZS5wb3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEFjY2Vzc29yKGFjY2Vzc29ycywgbm9kZUFjY2Vzc29yLCBzb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCBub2RlTmFtZSA9ICcnO1xuICAgICAgICBpZiAobm9kZUFjY2Vzc29yLm5hbWUpIHtcbiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZUFjY2Vzc29yLm5hbWUudGV4dDtcbiAgICAgICAgICAgIGxldCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Mobm9kZUFjY2Vzc29yKTtcblxuICAgICAgICAgICAgaWYgKCFhY2Nlc3NvcnNbbm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgYWNjZXNzb3JzW25vZGVOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBnZXRTaWduYXR1cmU6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3Iua2luZCA9PT0gU3ludGF4S2luZC5TZXRBY2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIGxldCBzZXRTaWduYXR1cmU6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2b2lkJyxcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5pbml0aWFsaXplRG9jdW1lbnRhdGlvbkZpZWxkcygpLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBub2RlQWNjZXNzb3IucGFyYW1ldGVycy5tYXAocGFyYW0gPT4gdGhpcy52aXNpdEFyZ3VtZW50KHBhcmFtKSksXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGU6IG5vZGVBY2Nlc3Nvci50eXBlID8gdGhpcy52aXNpdFR5cGUobm9kZUFjY2Vzc29yLnR5cGUpIDogJ3ZvaWQnLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG5vZGVBY2Nlc3Nvciwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYWN0QW5kUHJvY2Vzc0pTRG9jQ29tbWVudChub2RlQWNjZXNzb3IsIHNvdXJjZUZpbGUsIHNldFNpZ25hdHVyZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzSlNEb2NUYWdzKGpzZG9jdGFncywgc2V0U2lnbmF0dXJlKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZXRTaWduYXR1cmUuanNkb2N0YWdzICYmIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUuanNkb2N0YWdzID0gbWVyZ2VUYWdzQW5kQXJncyhzZXRTaWduYXR1cmUuYXJncywgc2V0U2lnbmF0dXJlLmpzZG9jdGFncyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXRTaWduYXR1cmUuYXJncyAmJiBzZXRTaWduYXR1cmUuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHNldFNpZ25hdHVyZS5hcmdzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhY2Nlc3NvcnNbbm9kZU5hbWVdLnNldFNpZ25hdHVyZSA9IHNldFNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3Iua2luZCA9PT0gU3ludGF4S2luZC5HZXRBY2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIGxldCBnZXRTaWduYXR1cmU6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG5vZGVBY2Nlc3Nvci50eXBlID8ga2luZFRvVHlwZShub2RlQWNjZXNzb3IudHlwZS5raW5kKSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlOiBub2RlQWNjZXNzb3IudHlwZSA/IHRoaXMudmlzaXRUeXBlKG5vZGVBY2Nlc3Nvci50eXBlKSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG5vZGVBY2Nlc3Nvciwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5leHRyYWN0QW5kUHJvY2Vzc0pTRG9jQ29tbWVudChub2RlQWNjZXNzb3IsIHNvdXJjZUZpbGUsIGdldFNpZ25hdHVyZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzSlNEb2NUYWdzKGpzZG9jdGFncywgZ2V0U2lnbmF0dXJlKTtcblxuICAgICAgICAgICAgICAgIGFjY2Vzc29yc1tub2RlTmFtZV0uZ2V0U2lnbmF0dXJlID0gZ2V0U2lnbmF0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNEZWNvcmF0b3JUeXBlKGRlY29yYXRvcjogdHMuRGVjb3JhdG9yLCAuLi50eXBlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKChkZWNvcmF0b3IuZXhwcmVzc2lvbiBhcyBhbnkpLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29yYXRvclRleHQgPSAoZGVjb3JhdG9yLmV4cHJlc3Npb24gYXMgYW55KS5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gdHlwZXMuaW5jbHVkZXMoZGVjb3JhdG9yVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEaXJlY3RpdmVEZWNvcmF0b3IoZGVjb3JhdG9yOiB0cy5EZWNvcmF0b3IpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzRGVjb3JhdG9yVHlwZShkZWNvcmF0b3IsICdEaXJlY3RpdmUnLCAnQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1NlcnZpY2VEZWNvcmF0b3IoZGVjb3JhdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0RlY29yYXRvclR5cGUoZGVjb3JhdG9yLCAnSW5qZWN0YWJsZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQcml2YXRlKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBpZiAobWVtYmVyLm1vZGlmaWVycykge1xuICAgICAgICAgICAgY29uc3QgaXNQcml2YXRlOiBib29sZWFuID0gbWVtYmVyLm1vZGlmaWVycy5zb21lKFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyID0+IG1vZGlmaWVyLmtpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZm9yIEVDTUFTY3JpcHQgUHJpdmF0ZSBGaWVsZHNcbiAgICAgICAgaWYgKG1lbWJlci5uYW1lICYmIG1lbWJlci5uYW1lLmVzY2FwZWRUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBpc1ByaXZhdGU6IGJvb2xlYW4gPSBtZW1iZXIubmFtZS5lc2NhcGVkVGV4dC5pbmRleE9mKCcjJykgPT09IDA7XG4gICAgICAgICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIaWRkZW5NZW1iZXIobWVtYmVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUHJvdGVjdGVkKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWVtYmVyLm1vZGlmaWVycykge1xuICAgICAgICAgICAgY29uc3QgaXNQcm90ZWN0ZWQ6IGJvb2xlYW4gPSBtZW1iZXIubW9kaWZpZXJzLnNvbWUoXG4gICAgICAgICAgICAgICAgbW9kaWZpZXIgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGlzUHJvdGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIaWRkZW5NZW1iZXIobWVtYmVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW50ZXJuYWwobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGludGVybmFsVGFnczogc3RyaW5nW10gPSBbJ2ludGVybmFsJ107XG4gICAgICAgIGlmIChtZW1iZXIuanNEb2MpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jIG9mIG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsVGFncy5pbmRleE9mKHRhZy50YWdOYW1lLnRleHQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1B1YmxpYyhtZW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1lbWJlci5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUHVibGljOiBib29sZWFuID0gbWVtYmVyLm1vZGlmaWVycy5zb21lKFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyID0+IG1vZGlmaWVyLmtpbmQgPT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzSGlkZGVuTWVtYmVyKG1lbWJlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0hpZGRlbk1lbWJlcihtZW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaW50ZXJuYWxUYWdzOiBzdHJpbmdbXSA9IFsnaGlkZGVuJ107XG4gICAgICAgIGlmIChtZW1iZXIuanNEb2MpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jIG9mIG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsVGFncy5pbmRleE9mKHRhZy50YWdOYW1lLnRleHQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BpcGVEZWNvcmF0b3IoZGVjb3JhdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0RlY29yYXRvclR5cGUoZGVjb3JhdG9yLCAnUGlwZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNDb250cm9sbGVyRGVjb3JhdG9yKGRlY29yYXRvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNEZWNvcmF0b3JUeXBlKGRlY29yYXRvciwgJ0NvbnRyb2xsZXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTW9kdWxlRGVjb3JhdG9yKGRlY29yYXRvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNEZWNvcmF0b3JUeXBlKGRlY29yYXRvciwgJ05nTW9kdWxlJywgJ01vZHVsZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZJU0lURVJTXG4gICAgICovXG5cbiAgICBwdWJsaWMgdmlzaXRDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgICAgICBjbGFzc0RlY2xhcmF0aW9uOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gICAgICAgIHNvdXJjZUZpbGU/OiB0cy5Tb3VyY2VGaWxlLFxuICAgICAgICBhc3RGaWxlPzogdHMuU291cmNlRmlsZVxuICAgICk6IGFueSB7XG4gICAgICAgIGxldCBzeW1ib2wgPSB0aGlzLnR5cGVDaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oY2xhc3NEZWNsYXJhdGlvbi5uYW1lKTtcbiAgICAgICAgbGV0IHJhd2Rlc2NyaXB0aW9uID0gJyc7XG4gICAgICAgIGxldCBkZXByZWNhdGlvbiA9IHRoaXMuaW5pdGlhbGl6ZURvY3VtZW50YXRpb25GaWVsZHMoKTtcbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uID0gJyc7XG4gICAgICAgIGxldCBqc2RvY3RhZ3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaWYgKHN5bWJvbCkge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKGNsYXNzRGVjbGFyYXRpb24sIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb24gPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5wYXJzZUNvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG1hcmtlZEFjbChyYXdkZXNjcmlwdGlvbik7XG4gICAgICAgICAgICBpZiAoc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24gJiYgaXNJZ25vcmUoc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt7IGlnbm9yZTogdHJ1ZSB9XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzeW1ib2wuZGVjbGFyYXRpb25zICYmIHN5bWJvbC5kZWNsYXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBkZWNsYXJhdGlvbnNqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Moc3ltYm9sLmRlY2xhcmF0aW9uc1swXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzSlNEb2NUYWdzKGRlY2xhcmF0aW9uc2pzZG9jdGFncywgZGVwcmVjYXRpb24sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJZ25vcmUoc3ltYm9sLmRlY2xhcmF0aW9uc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt7IGlnbm9yZTogdHJ1ZSB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Moc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pIGFzIHVua25vd24gYXMgYW55W107XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QganNkb2MgPSBqc2RvY3RhZ3NbMF0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2MgJiYganNkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcERlcHJlY2F0aW9uID0gdGhpcy5pbml0aWFsaXplRG9jdW1lbnRhdGlvbkZpZWxkcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jLnRhZ3MsIHRlbXBEZXByZWNhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbiA9IHRlbXBEZXByZWNhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2MudGFncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gY2xhc3NEZWNsYXJhdGlvbi5uYW1lLnRleHQ7XG4gICAgICAgIGxldCBtZW1iZXJzO1xuICAgICAgICBsZXQgaW1wbGVtZW50c0VsZW1lbnRzID0gW107XG4gICAgICAgIGxldCBleHRlbmRzRWxlbWVudHMgPSBbXTtcblxuICAgICAgICBpZiAodHlwZW9mICh0cyBhcyBhbnkpLmdldEVmZmVjdGl2ZUltcGxlbWVudHNUeXBlTm9kZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBsZXQgaW1wbGVtZW50ZWRUeXBlcyA9ICh0cyBhcyBhbnkpLmdldEVmZmVjdGl2ZUltcGxlbWVudHNUeXBlTm9kZXMoY2xhc3NEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICBpZiAoaW1wbGVtZW50ZWRUeXBlcykge1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gaW1wbGVtZW50ZWRUeXBlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxlbWVudGVkVHlwZXNbaV0uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c0VsZW1lbnRzLnB1c2goaW1wbGVtZW50ZWRUeXBlc1tpXS5leHByZXNzaW9uLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiAodHMgYXMgYW55KS5nZXRDbGFzc0V4dGVuZHNIZXJpdGFnZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAoYXN0RmlsZSkge1xuICAgICAgICAgICAgICAgIGxldCBpbnRlcmZhY2VPckNsYXNzTm9kZSA9IChhc3RGaWxlIGFzIGFueSkuZ2V0SW50ZXJmYWNlKGNsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcmZhY2VPckNsYXNzTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VPckNsYXNzTm9kZSA9IChhc3RGaWxlIGFzIGFueSkuZ2V0Q2xhc3MoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZU9yQ2xhc3NOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVuZHNMaXN0UmF3ID0gaW50ZXJmYWNlT3JDbGFzc05vZGUuZ2V0RXh0ZW5kcygpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXh0ZW5kc0xpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuZHNMaXN0UmF3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHRlbmRzTGlzdFJhdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kc0xpc3RSYXcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzTGlzdFJhdy5mb3JFYWNoKGV4dGVuZEVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5kRWxlbWVudEV4cHJlc3Npb24gPSBleHRlbmRFbGVtZW50LmdldEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbmRFbGVtZW50RXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBleHRlbmRFbGVtZW50RXhwcmVzc2lvbi5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kc0xpc3QucHVzaCh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5kRWxlbWVudEV4cHJlc3Npb24gPSBleHRlbmRzTGlzdFJhdy5nZXRFeHByZXNzaW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuZEVsZW1lbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBleHRlbmRFbGVtZW50RXhwcmVzc2lvbi5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzTGlzdC5wdXNoKHRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZHNFbGVtZW50cyA9IGV4dGVuZHNMaXN0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtZW1iZXJzID0gdGhpcy52aXNpdE1lbWJlcnMoY2xhc3NEZWNsYXJhdGlvbi5tZW1iZXJzLCBzb3VyY2VGaWxlKTtcblxuICAgICAgICBpZiAobm9kZUhhc0RlY29yYXRvcihjbGFzc0RlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgY2xhc3NEZWNvcmF0b3JzID0gZ2V0Tm9kZURlY29yYXRvcnMoY2xhc3NEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAvLyBMb29wIGFuZCBzZWFyY2ggZm9yIG9mZmljaWFsIGRlY29yYXRvcnMgYXQgdG9wLWxldmVsIDpcbiAgICAgICAgICAgIC8vIEFuZ3VsYXIgOiBATmdNb2R1bGUsIEBDb21wb25lbnQsIEBEaXJlY3RpdmUsIEBJbmplY3RhYmxlLCBAUGlwZVxuICAgICAgICAgICAgLy8gTmVzdGpzIDogQENvbnRyb2xsZXIsIEBNb2R1bGUsIEBJbmplY3RhYmxlXG4gICAgICAgICAgICAvLyBTdGVuY2lsIDogQENvbXBvbmVudFxuICAgICAgICAgICAgbGV0IGlzRGlyZWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaXNTZXJ2aWNlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaXNQaXBlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaXNNb2R1bGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBpc0NvbnRyb2xsZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgY2xhc3NEZWNvcmF0b3JzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhjbGFzc0RlY2xhcmF0aW9uLmRlY29yYXRvcnNbaV0uZXhwcmVzc2lvbik7XG5cbiAgICAgICAgICAgICAgICAvLyBSRVRVUk4gVE9PIEVBUkxZIEZPUiBNQU5ZIERFQ09SQVRPUlMgISEhIVxuICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBkZWNvcmF0b3JzIGFycmF5IHdlIGhhdmUgdG8ga2VlcCB0aGUgZmxhZ3MgYHRydWVgIHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBsb29wIGl0ZXJhdGlvblxuICAgICAgICAgICAgICAgIGlzRGlyZWN0aXZlID0gaXNEaXJlY3RpdmUgfHwgdGhpcy5pc0RpcmVjdGl2ZURlY29yYXRvcihjbGFzc0RlY29yYXRvcnNbYV0pO1xuICAgICAgICAgICAgICAgIGlzU2VydmljZSA9IGlzU2VydmljZSB8fCB0aGlzLmlzU2VydmljZURlY29yYXRvcihjbGFzc0RlY29yYXRvcnNbYV0pO1xuICAgICAgICAgICAgICAgIGlzUGlwZSA9IGlzUGlwZSB8fCB0aGlzLmlzUGlwZURlY29yYXRvcihjbGFzc0RlY29yYXRvcnNbYV0pO1xuICAgICAgICAgICAgICAgIGlzTW9kdWxlID0gaXNNb2R1bGUgfHwgdGhpcy5pc01vZHVsZURlY29yYXRvcihjbGFzc0RlY29yYXRvcnNbYV0pO1xuICAgICAgICAgICAgICAgIGlzQ29udHJvbGxlciA9IGlzQ29udHJvbGxlciB8fCB0aGlzLmlzQ29udHJvbGxlckRlY29yYXRvcihjbGFzc0RlY29yYXRvcnNbYV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRGlyZWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogZGVwcmVjYXRpb24uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBkZXByZWNhdGlvbi5kZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogcmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogbWVtYmVycy5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IG1lbWJlcnMub3V0cHV0cyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBtZW1iZXJzLmhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdExpc3RlbmVyczogbWVtYmVycy5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtZW1iZXJzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAga2luZDogbWVtYmVycy5raW5kLFxuICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogbWVtYmVycy5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c0VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NvcnM6IG1lbWJlcnMuYWNjZXNzb3JzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBkZXByZWNhdGlvbi5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBkZXByZWNhdGlvbi5kZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd2Rlc2NyaXB0aW9uOiByYXdkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U2lnbmF0dXJlczogbWVtYmVycy5pbmRleFNpZ25hdHVyZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtZW1iZXJzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogbWVtYmVycy5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzZG9jdGFnczoganNkb2N0YWdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c0VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQaXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBkZXByZWNhdGlvbi5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBkZXByZWNhdGlvbi5kZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd2Rlc2NyaXB0aW9uOiByYXdkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzZG9jdGFnczoganNkb2N0YWdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc01vZHVsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogZGVwcmVjYXRpb24uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogZGVwcmVjYXRpb24uZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogcmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogZGVwcmVjYXRpb24uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogZGVwcmVjYXRpb24uZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogcmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBtZW1iZXJzLm1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleFNpZ25hdHVyZXM6IG1lbWJlcnMuaW5kZXhTaWduYXR1cmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogbWVtYmVycy5raW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IG1lbWJlcnMuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogZGVwcmVjYXRpb24uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBkZXByZWNhdGlvbi5kZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogcmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogbWVtYmVycy5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IG1lbWJlcnMub3V0cHV0cyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBtZW1iZXJzLmhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdExpc3RlbmVyczogbWVtYmVycy5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBtZW1iZXJzLm1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIGluZGV4U2lnbmF0dXJlczogbWVtYmVycy5pbmRleFNpZ25hdHVyZXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IG1lbWJlcnMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAga2luZDogbWVtYmVycy5raW5kLFxuICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogbWVtYmVycy5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c0VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NvcnM6IG1lbWJlcnMuYWNjZXNzb3JzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBkZXByZWNhdGlvbi5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IGRlcHJlY2F0aW9uLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IG1lbWJlcnMuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBtZW1iZXJzLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RCaW5kaW5nczogbWVtYmVycy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnM6IG1lbWJlcnMuaG9zdExpc3RlbmVycyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdE1lbWJlcnMobWVtYmVyczogYW55LCBzb3VyY2VGaWxlOiBhbnkpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IGlucHV0cyA9IFtdO1xuICAgICAgICBsZXQgb3V0cHV0cyA9IFtdO1xuICAgICAgICBsZXQgbWV0aG9kcyA9IFtdO1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IFtdO1xuICAgICAgICBsZXQgaW5kZXhTaWduYXR1cmVzID0gW107XG4gICAgICAgIGxldCBraW5kO1xuICAgICAgICBsZXQgaW5wdXREZWNvcmF0b3I7XG4gICAgICAgIGxldCBob3N0QmluZGluZ3MgPSBbXTtcbiAgICAgICAgbGV0IGhvc3RMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgbGV0IGNvbnN0cnVjdG9yO1xuICAgICAgICBsZXQgb3V0cHV0RGVjb3JhdG9yO1xuICAgICAgICBsZXQgYWNjZXNzb3JzID0ge307XG4gICAgICAgIGxldCByZXN1bHQgPSB7fTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEFsbG93cyB0eXBlc2NyaXB0IGd1ZXNzIHR5cGUgd2hlbiB1c2luZyB0cy5pcypcbiAgICAgICAgICAgIGxldCBtZW1iZXIgPSBtZW1iZXJzW2ldO1xuXG4gICAgICAgICAgICBpbnB1dERlY29yYXRvciA9IHRoaXMuZ2V0RGVjb3JhdG9yT2ZUeXBlKG1lbWJlciwgJ0lucHV0Jyk7XG4gICAgICAgICAgICBvdXRwdXREZWNvcmF0b3IgPSB0aGlzLmdldERlY29yYXRvck9mVHlwZShtZW1iZXIsICdPdXRwdXQnKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEhvc3RCaW5kaW5ncyA9IHRoaXMuZ2V0RGVjb3JhdG9yT2ZUeXBlKG1lbWJlciwgJ0hvc3RCaW5kaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRIb3N0TGlzdGVuZXJzID0gdGhpcy5nZXREZWNvcmF0b3JPZlR5cGUobWVtYmVyLCAnSG9zdExpc3RlbmVyJyk7XG5cbiAgICAgICAgICAgIGtpbmQgPSBtZW1iZXIua2luZDtcblxuICAgICAgICAgICAgaWYgKGlzSWdub3JlKG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnRlcm5hbChtZW1iZXIpICYmIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbnB1dERlY29yYXRvciAmJiBpbnB1dERlY29yYXRvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRzLnB1c2godGhpcy52aXNpdElucHV0QW5kSG9zdEJpbmRpbmcobWVtYmVyLCBpbnB1dERlY29yYXRvclswXSwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc1NldEFjY2Vzc29yRGVjbGFyYXRpb24obWVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEFjY2Vzc29yKGFjY2Vzc29ycywgbWVtYmVyc1tpXSwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXREZWNvcmF0b3IgJiYgb3V0cHV0RGVjb3JhdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRzLnB1c2godGhpcy52aXNpdE91dHB1dChtZW1iZXIsIG91dHB1dERlY29yYXRvclswXSwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZWRIb3N0QmluZGluZ3MgJiYgcGFyc2VkSG9zdEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgayA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuSEIgPSBwYXJzZWRIb3N0QmluZGluZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoazsgayA8IGxlbkhCOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0SW5wdXRBbmRIb3N0QmluZGluZyhtZW1iZXIsIHBhcnNlZEhvc3RCaW5kaW5nc1trXSwgc291cmNlRmlsZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZEhvc3RMaXN0ZW5lcnMgJiYgcGFyc2VkSG9zdExpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGwgPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbkhMID0gcGFyc2VkSG9zdExpc3RlbmVycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yIChsOyBsIDwgbGVuSEw7IGwrKykge1xuICAgICAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0SG9zdExpc3RlbmVyKG1lbWJlciwgcGFyc2VkSG9zdExpc3RlbmVyc1tsXSwgc291cmNlRmlsZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc0hpZGRlbk1lbWJlcihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5pc1ByaXZhdGUobWVtYmVyKSAmJiBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmlzSW50ZXJuYWwobWVtYmVyKSAmJiBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVJbnRlcm5hbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKHRoaXMuaXNQcm90ZWN0ZWQobWVtYmVyKSAmJiBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcm90ZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNNZXRob2REZWNsYXJhdGlvbihtZW1iZXIpIHx8IHRzLmlzTWV0aG9kU2lnbmF0dXJlKG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcy5wdXNoKHRoaXMudmlzaXRNZXRob2REZWNsYXJhdGlvbihtZW1iZXIsIHNvdXJjZUZpbGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy5pc1Byb3BlcnR5RGVjbGFyYXRpb24obWVtYmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy5pc1Byb3BlcnR5U2lnbmF0dXJlKG1lbWJlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dERlY29yYXRvciAmJiAhb3V0cHV0RGVjb3JhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2godGhpcy52aXNpdFByb3BlcnR5KG1lbWJlciwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh0aGlzLnZpc2l0Q2FsbERlY2xhcmF0aW9uKG1lbWJlciwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQWNjZXNzb3IoYWNjZXNzb3JzLCBtZW1iZXJzW2ldLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzSW5kZXhTaWduYXR1cmVEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U2lnbmF0dXJlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdEluZGV4RGVjbGFyYXRpb24obWVtYmVyLCBzb3VyY2VGaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF9jb25zdHJ1Y3RvclByb3BlcnRpZXMgPSB0aGlzLnZpc2l0Q29uc3RydWN0b3JQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZW4gPSBfY29uc3RydWN0b3JQcm9wZXJ0aWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChfY29uc3RydWN0b3JQcm9wZXJ0aWVzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IHRoaXMudmlzaXRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG1lbWJlciwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXRzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIG91dHB1dHMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgaG9zdEJpbmRpbmdzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIGhvc3RMaXN0ZW5lcnMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgcHJvcGVydGllcy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICBtZXRob2RzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIGluZGV4U2lnbmF0dXJlcy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuXG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgIG91dHB1dHMsXG4gICAgICAgICAgICBob3N0QmluZGluZ3MsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgbWV0aG9kcyxcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICBpbmRleFNpZ25hdHVyZXMsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgY29uc3RydWN0b3JcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjZXNzb3JzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdFsnYWNjZXNzb3JzJ10gPSBhY2Nlc3NvcnM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRUeXBlTmFtZSh0eXBlTmFtZTogdHMuSWRlbnRpZmllcikge1xuICAgICAgICBpZiAodHlwZU5hbWUuZXNjYXBlZFRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlTmFtZS5lc2NhcGVkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZU5hbWUudGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVOYW1lLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0eXBlTmFtZSBhcyBhbnkpLmxlZnQgJiYgKHR5cGVOYW1lIGFzIGFueSkucmlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VHlwZU5hbWUoKHR5cGVOYW1lIGFzIGFueSkubGVmdCkgKyAnLicgKyB0aGlzLnZpc2l0VHlwZU5hbWUoKHR5cGVOYW1lIGFzIGFueSkucmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgdmlzaXRUeXBlSW5kZXgobm9kZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBfcmV0dXJuID0gJyc7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vZGUudHlwZSAmJlxuICAgICAgICAgICAgbm9kZS50eXBlLmtpbmQgPT09IFN5bnRheEtpbmQuSW5kZXhlZEFjY2Vzc1R5cGUgJiZcbiAgICAgICAgICAgIG5vZGUudHlwZS5pbmRleFR5cGUgJiZcbiAgICAgICAgICAgIG5vZGUudHlwZS5pbmRleFR5cGUubGl0ZXJhbFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0VHlwZU5hbWUobm9kZS50eXBlLmluZGV4VHlwZS5saXRlcmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyB2aXNpdFR5cGUobm9kZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBfcmV0dXJuID0gJ3ZvaWQnO1xuXG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgX3JldHVybiA9IHRoaXMudmlzaXRUeXBlTmFtZShub2RlLnR5cGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLnR5cGUua2luZCAmJlxuICAgICAgICAgICAgICAgICF0cy5pc1VuaW9uVHlwZU5vZGUobm9kZS50eXBlKSAmJlxuICAgICAgICAgICAgICAgICF0cy5pc1R1cGxlVHlwZU5vZGUobm9kZS50eXBlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IGtpbmRUb1R5cGUobm9kZS50eXBlLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSB0aGlzLnZpc2l0VHlwZU5hbWUobm9kZS50eXBlLnR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUudHlwZUFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJzwnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIG5vZGUudHlwZS50eXBlQXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMucHVzaCh0aGlzLnZpc2l0VHlwZShhcmd1bWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHR5cGVBcmd1bWVudHMuam9pbignIHwgJyk7XG4gICAgICAgICAgICAgICAgX3JldHVybiArPSAnPic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZpcnN0UGFydCA9IHRoaXMudmlzaXRUeXBlKG5vZGUudHlwZS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IF9maXJzdFBhcnQgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlLmtpbmQgPT09IFN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiA9ICcoJyArIF9maXJzdFBhcnQgKyAnKScgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlVHlwZXNPckVsZW1lbnRzID0gKGFyciwgc2VwYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gYXJyW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfZmlyc3RQYXJ0ID0gdGhpcy52aXNpdFR5cGUodHlwZS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lbGVtZW50VHlwZS5raW5kID09PSBTeW50YXhLaW5kLlBhcmVudGhlc2l6ZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnKCcgKyBfZmlyc3RQYXJ0ICsgJyknICsga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IF9maXJzdFBhcnQgKyBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNMaXRlcmFsVHlwZU5vZGUodHlwZSkgJiYgdHlwZS5saXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlLmxpdGVyYWwgYXMgYW55KS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ1wiJyArICh0eXBlLmxpdGVyYWwgYXMgYW55KS50ZXh0ICsgJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5saXRlcmFsLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHR5cGUgYXMgYW55KS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdGhpcy52aXNpdFR5cGVOYW1lKCh0eXBlIGFzIGFueSkudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmtpbmQgPT09IFN5bnRheEtpbmQuUmVzdFR5cGUgJiYgdHlwZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnLi4uJyArIHRoaXMudmlzaXRUeXBlKHR5cGUudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0ga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUudHlwZUFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJzwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIHR5cGUudHlwZUFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnB1c2godGhpcy52aXNpdFR5cGUoYXJndW1lbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSB0eXBlQXJndW1lbnRzLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICc+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gc2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5lbGVtZW50cyAmJiB0cy5pc1R1cGxlVHlwZU5vZGUobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSAnWyc7XG4gICAgICAgICAgICAgICAgcGFyc2VUeXBlc09yRWxlbWVudHMobm9kZS50eXBlLmVsZW1lbnRzLCAnLCAnKTtcbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICddJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUudHlwZXMgJiYgdHMuaXNVbmlvblR5cGVOb2RlKG5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0gJyc7XG4gICAgICAgICAgICAgICAgcGFyc2VUeXBlc09yRWxlbWVudHMobm9kZS50eXBlLnR5cGVzLCAnIHwgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlcykge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50VHlwZXMgPSBub2RlLnR5cGUuZWxlbWVudFR5cGVzO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gZWxlbWVudFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuID0gJ1snO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGVsZW1lbnRUeXBlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmtpbmQgPT09IFN5bnRheEtpbmQuQXJyYXlUeXBlICYmIHR5cGUuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5lbGVtZW50VHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHR5cGUgYXMgYW55KS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciB0eXBlIHJlZmVyZW5jZXMsIHVzZSB0aGUgdHlwZSBuYW1lIGRpcmVjdGx5IGluc3RlYWQgb2Yga2luZFRvVHlwZSArIHR5cGVOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSB0aGlzLnZpc2l0VHlwZU5hbWUoKHR5cGUgYXMgYW55KS50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0ga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzTGl0ZXJhbFR5cGVOb2RlKHR5cGUpICYmIHR5cGUubGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZS5saXRlcmFsIGFzIGFueSkudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICdcIicgKyAodHlwZS5saXRlcmFsIGFzIGFueSkudGV4dCArICdcIic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUubGl0ZXJhbC5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5raW5kID09PSBTeW50YXhLaW5kLlJlc3RUeXBlICYmIHR5cGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJy4uLicgKyB0aGlzLnZpc2l0VHlwZSh0eXBlLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5raW5kID09PSBTeW50YXhLaW5kLlR5cGVSZWZlcmVuY2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLnR5cGVOYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHR5cGUudHlwZU5hbWUuZXNjYXBlZFRleHQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS50eXBlTmFtZS5lc2NhcGVkVGV4dCA9PT0gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ10nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLnR5cGUgJiZcbiAgICAgICAgICAgICAgICBub2RlLnR5cGUua2luZCA9PT0gU3ludGF4S2luZC5JbmRleGVkQWNjZXNzVHlwZSAmJlxuICAgICAgICAgICAgICAgIG5vZGUudHlwZS5vYmplY3RUeXBlICYmXG4gICAgICAgICAgICAgICAgbm9kZS50eXBlLm9iamVjdFR5cGUudHlwZU5hbWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSB0aGlzLnZpc2l0VHlwZU5hbWUobm9kZS50eXBlLm9iamVjdFR5cGUudHlwZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIF9yZXR1cm4gPSBraW5kVG9UeXBlKG5vZGUuZWxlbWVudFR5cGUua2luZCkgKyBraW5kVG9UeXBlKG5vZGUua2luZCk7XG4gICAgICAgICAgICBpZiAobm9kZS5lbGVtZW50VHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSB0aGlzLnZpc2l0VHlwZU5hbWUobm9kZS5lbGVtZW50VHlwZS50eXBlTmFtZSkgKyBraW5kVG9UeXBlKG5vZGUua2luZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlcyAmJiB0cy5pc1VuaW9uVHlwZU5vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIF9yZXR1cm4gPSAnJztcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBub2RlLnR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBub2RlLnR5cGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc0xpdGVyYWxUeXBlTm9kZSh0eXBlKSAmJiB0eXBlLmxpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlLmxpdGVyYWwgYXMgYW55KS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICdcIicgKyAodHlwZS5saXRlcmFsIGFzIGFueSkudGV4dCArICdcIic7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5saXRlcmFsLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodHlwZSBhcyBhbnkpLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdGhpcy52aXNpdFR5cGVOYW1lKCh0eXBlIGFzIGFueSkudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0ga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnIHwgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5kb3REb3REb3RUb2tlbikge1xuICAgICAgICAgICAgX3JldHVybiA9ICdhbnlbXSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfcmV0dXJuID0ga2luZFRvVHlwZShub2RlLmtpbmQpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChfcmV0dXJuID09PSAnJyB8fCBfcmV0dXJuID09PSAndW5rbm93bicpICYmXG4gICAgICAgICAgICAgICAgbm9kZS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgICAgIG5vZGUuaW5pdGlhbGl6ZXIua2luZCAmJlxuICAgICAgICAgICAgICAgIChub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuUHJvcGVydHlEZWNsYXJhdGlvbiB8fCBub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuUGFyYW1ldGVyKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IGtpbmRUb1R5cGUobm9kZS5pbml0aWFsaXplci5raW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuVHlwZVBhcmFtZXRlcikge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSBub2RlLm5hbWUudGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuTGl0ZXJhbFR5cGUpIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0gbm9kZS5saXRlcmFsLnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cyAmJiBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgX3JldHVybiArPSAnPCc7XG4gICAgICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICAgICAgbGVuID0gbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFyZ3VtZW50ID0gbm9kZS50eXBlQXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdGhpcy52aXNpdFR5cGUoYXJndW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpID49IDAgJiYgaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnLCAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9yZXR1cm4gKz0gJz4nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRDYWxsRGVjbGFyYXRpb24obWV0aG9kOiB0cy5DYWxsU2lnbmF0dXJlRGVjbGFyYXRpb24sIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IHNvdXJjZUNvZGUgPSBzb3VyY2VGaWxlLmdldFRleHQoKTtcbiAgICAgICAgbGV0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNvdXJjZUNvZGUpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIGxldCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgICAgIGlkOiAnY2FsbC1kZWNsYXJhdGlvbi0nICsgaGFzaCxcbiAgICAgICAgICAgIGFyZ3M6IG1ldGhvZC5wYXJhbWV0ZXJzID8gbWV0aG9kLnBhcmFtZXRlcnMubWFwKHByb3AgPT4gdGhpcy52aXNpdEFyZ3VtZW50KHByb3ApKSA6IFtdLFxuICAgICAgICAgICAgcmV0dXJuVHlwZTogdGhpcy52aXNpdFR5cGUobWV0aG9kLnR5cGUpLFxuICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihtZXRob2QsIHNvdXJjZUZpbGUpLmxpbmUgKyAxLFxuICAgICAgICAgICAgLi4udGhpcy5pbml0aWFsaXplRG9jdW1lbnRhdGlvbkZpZWxkcygpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZXh0cmFjdEFuZFByb2Nlc3NKU0RvY0NvbW1lbnQobWV0aG9kLCBzb3VyY2VGaWxlLCByZXN1bHQpO1xuICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MobWV0aG9kKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzSlNEb2NUYWdzKGpzZG9jdGFncywgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SW5kZXhEZWNsYXJhdGlvbihcbiAgICAgICAgbWV0aG9kOiB0cy5JbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uLFxuICAgICAgICBzb3VyY2VGaWxlPzogdHMuU291cmNlRmlsZVxuICAgICkge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNvdXJjZUZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGlkOiAnaW5kZXgtZGVjbGFyYXRpb24tJyArIGhhc2gsXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlKSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMSxcbiAgICAgICAgICAgIC4uLnRoaXMuaW5pdGlhbGl6ZURvY3VtZW50YXRpb25GaWVsZHMoKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmV4dHJhY3RBbmRQcm9jZXNzSlNEb2NDb21tZW50KG1ldGhvZCwgc291cmNlRmlsZSwgcmVzdWx0KTtcbiAgICAgICAgY29uc3QganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG1ldGhvZCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0pTRG9jVGFncyhqc2RvY3RhZ3MsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oXG4gICAgICAgIG1ldGhvZDogdHMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbixcbiAgICAgICAgc291cmNlRmlsZT86IHRzLlNvdXJjZUZpbGVcbiAgICApIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogJ2NvbnN0cnVjdG9yJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIC4uLnRoaXMuaW5pdGlhbGl6ZURvY3VtZW50YXRpb25GaWVsZHMoKSxcbiAgICAgICAgICAgIGFyZ3M6IG1ldGhvZC5wYXJhbWV0ZXJzID8gbWV0aG9kLnBhcmFtZXRlcnMubWFwKHByb3AgPT4gdGhpcy52aXNpdEFyZ3VtZW50KHByb3ApKSA6IFtdLFxuICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihtZXRob2QsIHNvdXJjZUZpbGUpLmxpbmUgKyAxXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZXh0cmFjdEFuZFByb2Nlc3NKU0RvY0NvbW1lbnQobWV0aG9kLCBzb3VyY2VGaWxlLCByZXN1bHQpO1xuXG4gICAgICAgIGNvbnN0IGtpbmRzID0gdGhpcy5leHRyYWN0TW9kaWZpZXJLaW5kcyhtZXRob2QpO1xuICAgICAgICBpZiAoa2luZHMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQgPSBraW5kcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhtZXRob2QpO1xuICAgICAgICB0aGlzLnByb2Nlc3NKU0RvY1RhZ3MoanNkb2N0YWdzLCByZXN1bHQpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRQcm9wZXJ0eShwcm9wZXJ0eTogdHMuUHJvcGVydHlEZWNsYXJhdGlvbiB8IHRzLlByb3BlcnR5U2lnbmF0dXJlLCBzb3VyY2VGaWxlKSB7XG4gICAgICAgIC8vIFByb3BlcnR5U2lnbmF0dXJlIChpbnRlcmZhY2VzKSBkb24ndCBoYXZlIGluaXRpYWxpemVyLCBQcm9wZXJ0eURlY2xhcmF0aW9uIChjbGFzc2VzKSBkb1xuICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IHRzLmlzUHJvcGVydHlEZWNsYXJhdGlvbihwcm9wZXJ0eSkgPyBwcm9wZXJ0eS5pbml0aWFsaXplciA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBFeHRyYWN0IHByb3BlcnR5IG5hbWUsIGhhbmRsaW5nIGRpZmZlcmVudCBub2RlIHR5cGVzOlxuICAgICAgICAvLyAtIElkZW50aWZpZXI6IHJlZ3VsYXIgcHJvcGVydHkgbmFtZXNcbiAgICAgICAgLy8gLSBQcml2YXRlSWRlbnRpZmllcjogRUNNQVNjcmlwdCBwcml2YXRlIGZpZWxkcyBsaWtlICNwcml2YXRlRmllbGRcbiAgICAgICAgLy8gLSBDb21wdXRlZFByb3BlcnR5TmFtZTogY29tcHV0ZWQgbmFtZXMgbGlrZSBbJ19fYWxsQW5kJ11cbiAgICAgICAgbGV0IHByb3BlcnR5TmFtZSA9ICcnO1xuICAgICAgICAvLyBDaGVjayBmb3IgbW9jayBvYmplY3RzIGZpcnN0IChmb3IgdGVzdGluZylcbiAgICAgICAgaWYgKChwcm9wZXJ0eS5uYW1lIGFzIGFueSkudGV4dCkge1xuICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gKHByb3BlcnR5Lm5hbWUgYXMgYW55KS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSkge1xuICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzUHJpdmF0ZUlkZW50aWZpZXIocHJvcGVydHkubmFtZSkpIHtcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5Lm5hbWUudGV4dDsgLy8gaW5jbHVkZXMgdGhlICMgcHJlZml4XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNDb21wdXRlZFByb3BlcnR5TmFtZShwcm9wZXJ0eS5uYW1lKSkge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGNvbXB1dGVkIHByb3BlcnR5IG5hbWVzIGxpa2UgWydfX2FsbEFuZCddXG4gICAgICAgICAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS5uYW1lLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS5uYW1lLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBpbml0aWFsaXplclxuICAgICAgICAgICAgICAgID8gdGhpcy5zdHJpbmdpZnlEZWZhdWx0VmFsdWUoaW5pdGlhbGl6ZXIpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAuLi50aGlzLmluaXRpYWxpemVEb2N1bWVudGF0aW9uRmllbGRzKCksXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnZpc2l0VHlwZShwcm9wZXJ0eSksXG4gICAgICAgICAgICBpbmRleEtleTogdGhpcy52aXNpdFR5cGVJbmRleChwcm9wZXJ0eSksXG4gICAgICAgICAgICBvcHRpb25hbDogdHlwZW9mIHByb3BlcnR5LnF1ZXN0aW9uVG9rZW4gIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgJiYgaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVmYXVsdFZhbHVlID0gJygpID0+IHsuLi59JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0Lm5hbWUgPT09ICd1bmRlZmluZWQnICYmIChwcm9wZXJ0eS5uYW1lIGFzIGFueSkuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcmVzdWx0Lm5hbWUgPSAocHJvcGVydHkubmFtZSBhcyBhbnkpLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXh0cmFjdEFuZFByb2Nlc3NKU0RvY0NvbW1lbnQocHJvcGVydHksIHNvdXJjZUZpbGUsIHJlc3VsdCk7XG5cbiAgICAgICAgaWYgKG5vZGVIYXNEZWNvcmF0b3IocHJvcGVydHkpKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eURlY29yYXRvcnMgPSBnZXROb2RlRGVjb3JhdG9ycyhwcm9wZXJ0eSk7XG4gICAgICAgICAgICByZXN1bHQuZGVjb3JhdG9ycyA9IHRoaXMuZm9ybWF0RGVjb3JhdG9ycyhwcm9wZXJ0eURlY29yYXRvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2luZHMgPSB0aGlzLmV4dHJhY3RNb2RpZmllcktpbmRzKHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGtpbmRzKSB7XG4gICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kID0ga2luZHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZm9yIEVDTUFTY3JpcHQgUHJpdmF0ZSBGaWVsZHNcbiAgICAgICAgdGhpcy5lbnN1cmVQcml2YXRlS2V5d29yZChyZXN1bHQsIHByb3BlcnR5KTtcblxuICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MocHJvcGVydHkpO1xuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgY29uc3QganNkb2MgPSBqc2RvY3RhZ3NbMF0gYXMgYW55O1xuICAgICAgICAgICAgaWYgKGpzZG9jICYmIGpzZG9jLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2MudGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAoKHByb3BlcnR5IGFzIGFueSkuanNEb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2MudGFncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0Q29uc3RydWN0b3JQcm9wZXJ0aWVzKGNvbnN0ciwgc291cmNlRmlsZSkge1xuICAgICAgICBpZiAoY29uc3RyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGxldCBfcGFyYW1ldGVycyA9IFtdO1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IGNvbnN0ci5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVyT2ZDb25zdHJ1Y3RvciA9IGNvbnN0ci5wYXJhbWV0ZXJzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChpc0lnbm9yZShwYXJhbWV0ZXJPZkNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSW50ZXJuYWwocGFyYW1ldGVyT2ZDb25zdHJ1Y3RvcikgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUHVibGljKHBhcmFtZXRlck9mQ29uc3RydWN0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9wYXJhbWV0ZXJzLnB1c2godGhpcy52aXNpdFByb3BlcnR5KGNvbnN0ci5wYXJhbWV0ZXJzW2ldLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBNZXJnZSBKU0RvYyB0YWdzIGRlc2NyaXB0aW9uIGZyb20gY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChjb25zdHIuanNEb2MpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3RyLmpzRG9jLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnN0clRhZ3MgPSBjb25zdHIuanNEb2NbMF0udGFncztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN0clRhZ3MgJiYgY29uc3RyVGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJUYWdzLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFyYW1ldGVycy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50YWdOYW1lLmVzY2FwZWRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcudGFnTmFtZS5lc2NhcGVkVGV4dCA9PT0gJ3BhcmFtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5uYW1lLmVzY2FwZWRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUuZXNjYXBlZFRleHQgPT09IHBhcmFtLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlc2NyaXB0aW9uID0gdGFnLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9wYXJhbWV0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZDogdHMuTWV0aG9kRGVjbGFyYXRpb24gfCB0cy5NZXRob2RTaWduYXR1cmUsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogKG1ldGhvZC5uYW1lIGFzIGFueSkudGV4dCB8fCAodHMuaXNJZGVudGlmaWVyKG1ldGhvZC5uYW1lKSA/IG1ldGhvZC5uYW1lLnRleHQgOiAnJyksXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0eXBlb2YgbWV0aG9kLnF1ZXN0aW9uVG9rZW4gIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgcmV0dXJuVHlwZTogdGhpcy52aXNpdFR5cGUobWV0aG9kLnR5cGUpLFxuICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihtZXRob2QsIHNvdXJjZUZpbGUpLmxpbmUgKyAxLFxuICAgICAgICAgICAgLi4udGhpcy5pbml0aWFsaXplRG9jdW1lbnRhdGlvbkZpZWxkcygpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgaW5mZXJyZWQgdHlwZVxuICAgICAgICAgICAgaWYgKChtZXRob2QgYXMgYW55KS5zeW1ib2wpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3ltYm9sOiB0cy5TeW1ib2wgPSAobWV0aG9kIGFzIGFueSkuc3ltYm9sO1xuICAgICAgICAgICAgICAgIGlmIChzeW1ib2wudmFsdWVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3ltYm9sVHlwZSA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0VHlwZU9mU3ltYm9sQXRMb2NhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2xUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0U2lnbmF0dXJlRnJvbURlY2xhcmF0aW9uKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJldHVyblR5cGUgPSB0aGlzLnR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhyZXR1cm5UeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZC50eXBlUGFyYW1ldGVycyAmJiBtZXRob2QudHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LnR5cGVQYXJhbWV0ZXJzID0gbWV0aG9kLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFyYW1ldGVyID0+XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdFR5cGUodHlwZVBhcmFtZXRlcilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4dHJhY3RBbmRQcm9jZXNzSlNEb2NDb21tZW50KG1ldGhvZCwgc291cmNlRmlsZSwgcmVzdWx0KTtcblxuICAgICAgICBpZiAobm9kZUhhc0RlY29yYXRvcihtZXRob2QpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRob2REZWNvcmF0b3JzID0gZ2V0Tm9kZURlY29yYXRvcnMobWV0aG9kKTtcbiAgICAgICAgICAgIHJlc3VsdC5kZWNvcmF0b3JzID0gdGhpcy5mb3JtYXREZWNvcmF0b3JzKG1ldGhvZERlY29yYXRvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2luZHMgPSB0aGlzLmV4dHJhY3RNb2RpZmllcktpbmRzKG1ldGhvZCk7XG4gICAgICAgIGlmIChraW5kcykge1xuICAgICAgICAgICAgcmVzdWx0Lm1vZGlmaWVyS2luZCA9IGtpbmRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBFQ01BU2NyaXB0IFByaXZhdGUgRmllbGRzXG4gICAgICAgIHRoaXMuZW5zdXJlUHJpdmF0ZUtleXdvcmQocmVzdWx0LCBtZXRob2QpO1xuXG4gICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhtZXRob2QpO1xuICAgICAgICB0aGlzLnByb2Nlc3NKU0RvY1RhZ3MoanNkb2N0YWdzLCByZXN1bHQpO1xuXG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRPdXRwdXQoXG4gICAgICAgIHByb3BlcnR5OiB0cy5Qcm9wZXJ0eURlY2xhcmF0aW9uLFxuICAgICAgICBvdXREZWNvcmF0b3I6IHRzLkRlY29yYXRvcixcbiAgICAgICAgc291cmNlRmlsZT86IHRzLlNvdXJjZUZpbGVcbiAgICApIHtcbiAgICAgICAgbGV0IGluQXJncyA9IChvdXREZWNvcmF0b3IuZXhwcmVzc2lvbiBhcyBhbnkpLmFyZ3VtZW50cztcbiAgICAgICAgbGV0IF9yZXR1cm46IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGluQXJncy5sZW5ndGggPiAwID8gKGluQXJnc1swXSBhcyBhbnkpLnRleHQgOiAoKHByb3BlcnR5Lm5hbWUgYXMgYW55KS50ZXh0IHx8ICh0cy5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgPyBwcm9wZXJ0eS5uYW1lLnRleHQgOiAnJykpLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBwcm9wZXJ0eS5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgID8gdGhpcy5zdHJpbmdpZnlEZWZhdWx0VmFsdWUocHJvcGVydHkuaW5pdGlhbGl6ZXIpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAuLi50aGlzLmluaXRpYWxpemVEb2N1bWVudGF0aW9uRmllbGRzKClcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoKHByb3BlcnR5IGFzIGFueSkuanNEb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZXh0cmFjdEFuZFByb2Nlc3NKU0RvY0NvbW1lbnQocHJvcGVydHksIHNvdXJjZUZpbGUsIF9yZXR1cm4pO1xuICAgICAgICAgICAgY29uc3QganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKHByb3BlcnR5KTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0pTRG9jVGFncyhqc2RvY3RhZ3MsIF9yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRGYWxsYmFja0Rlc2NyaXB0aW9uKF9yZXR1cm4sIHByb3BlcnR5KTtcbiAgICAgICAgX3JldHVybi5saW5lID0gdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDE7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUpIHtcbiAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IHRoaXMudmlzaXRUeXBlKHByb3BlcnR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBOZXdFeHByZXNzaW9uXG4gICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNOZXdFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi50eXBlID0gKHByb3BlcnR5LmluaXRpYWxpemVyLmV4cHJlc3Npb24gYXMgYW55KS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRBcmd1bWVudChhcmc6IHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uKSB7XG4gICAgICAgIGxldCBfcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiAoYXJnLm5hbWUgYXMgYW55KS50ZXh0IHx8ICh0cy5pc0lkZW50aWZpZXIoYXJnLm5hbWUpID8gYXJnLm5hbWUudGV4dCA6ICcnKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudmlzaXRUeXBlKGFyZyksXG4gICAgICAgICAgICBvcHRpb25hbDogISFhcmcucXVlc3Rpb25Ub2tlbixcbiAgICAgICAgICAgIGRvdERvdERvdFRva2VuOiAhIWFyZy5kb3REb3REb3RUb2tlbixcbiAgICAgICAgICAgIC4uLnRoaXMuaW5pdGlhbGl6ZURvY3VtZW50YXRpb25GaWVsZHMoKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYXJnLnR5cGUgJiYgYXJnLnR5cGUua2luZCAmJiB0cy5pc0Z1bmN0aW9uVHlwZU5vZGUoYXJnLnR5cGUpKSB7XG4gICAgICAgICAgICBfcmVzdWx0LmZ1bmN0aW9uID0gYXJnLnR5cGUucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgID8gYXJnLnR5cGUucGFyYW1ldGVycy5tYXAocHJvcCA9PiB0aGlzLnZpc2l0QXJndW1lbnQocHJvcCkpXG4gICAgICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJnLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICBfcmVzdWx0LmRlZmF1bHRWYWx1ZSA9IHRoaXMuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKGFyZy5pbml0aWFsaXplcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKGFyZyk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0pTRG9jVGFncyhqc2RvY3RhZ3MsIF9yZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdElucHV0QW5kSG9zdEJpbmRpbmcocHJvcGVydHksIGluRGVjb3JhdG9yLCBzb3VyY2VGaWxlPykge1xuICAgICAgICBjb25zdCBpbkFyZ3MgPSBpbkRlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50cztcblxuICAgICAgICBsZXQgX3JldHVybjogYW55ID0ge307XG5cbiAgICAgICAgbGV0IGlzSW5wdXRDb25maWdTdHJpbmdMaXRlcmFsID0gZmFsc2U7XG4gICAgICAgIGxldCBpc0lucHV0Q29uZmlnT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gPSBmYWxzZTtcbiAgICAgICAgbGV0IGhhc1JlcXVpcmVkRmllbGQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGhhc0FsaWFzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZ2V0UmVxdWlyZWRGaWVsZCA9ICgpID0+XG4gICAgICAgICAgICBpbkFyZ3NbMF0ucHJvcGVydGllcy5maW5kKHByb3BlcnR5ID0+IHByb3BlcnR5Lm5hbWUuZXNjYXBlZFRleHQgPT09ICdyZXF1aXJlZCcpO1xuICAgICAgICBjb25zdCBnZXRBbGlhc1Byb3BlcnR5ID0gKCkgPT5cbiAgICAgICAgICAgIGluQXJnc1swXS5wcm9wZXJ0aWVzLmZpbmQocHJvcGVydHkgPT4gcHJvcGVydHkubmFtZS5lc2NhcGVkVGV4dCA9PT0gJ2FsaWFzJyk7XG5cbiAgICAgICAgaWYgKGluQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpc0lucHV0Q29uZmlnU3RyaW5nTGl0ZXJhbCA9IGluQXJnc1swXSAmJiB0cy5pc1N0cmluZ0xpdGVyYWwoaW5BcmdzWzBdKTtcblxuICAgICAgICAgICAgaXNJbnB1dENvbmZpZ09iamVjdExpdGVyYWxFeHByZXNzaW9uID1cbiAgICAgICAgICAgICAgICBpbkFyZ3NbMF0gJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihpbkFyZ3NbMF0pO1xuXG4gICAgICAgICAgICBpZiAoaXNJbnB1dENvbmZpZ09iamVjdExpdGVyYWxFeHByZXNzaW9uICYmIGluQXJnc1swXS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgaGFzUmVxdWlyZWRGaWVsZCA9IGlzSW5wdXRDb25maWdPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiAmJiAhIWdldFJlcXVpcmVkRmllbGQoKTtcbiAgICAgICAgICAgICAgICBoYXNBbGlhcyA9IGlzSW5wdXRDb25maWdPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiA/ICEhZ2V0QWxpYXNQcm9wZXJ0eSgpIDogZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBfcmV0dXJuLnJlcXVpcmVkID0gISFnZXRSZXF1aXJlZEZpZWxkKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9yZXR1cm4ubmFtZSA9IGlzSW5wdXRDb25maWdTdHJpbmdMaXRlcmFsXG4gICAgICAgICAgICAgICAgPyBpbkFyZ3NbMF0udGV4dFxuICAgICAgICAgICAgICAgIDogaGFzQWxpYXNcbiAgICAgICAgICAgICAgICAgID8gZ2V0QWxpYXNQcm9wZXJ0eSgpLmluaXRpYWxpemVyLnRleHRcbiAgICAgICAgICAgICAgICAgIDogcHJvcGVydHkubmFtZS50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3JldHVybi5uYW1lID0gcHJvcGVydHkubmFtZS50ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgX3JldHVybi5kZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eS5pbml0aWFsaXplclxuICAgICAgICAgICAgPyB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShwcm9wZXJ0eS5pbml0aWFsaXplcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBPYmplY3QuYXNzaWduKF9yZXR1cm4sIHRoaXMuaW5pdGlhbGl6ZURvY3VtZW50YXRpb25GaWVsZHMoKSk7XG5cbiAgICAgICAgaWYgKGluQXJncy5sZW5ndGggPiAwICYmIGluQXJnc1swXS5wcm9wZXJ0aWVzICYmIGhhc1JlcXVpcmVkRmllbGQpIHtcbiAgICAgICAgICAgIF9yZXR1cm4ub3B0aW9uYWwgPSBnZXRSZXF1aXJlZEZpZWxkKCkuaW5pdGlhbGl6ZXIua2luZCAhPT0gU3ludGF4S2luZC5UcnVlS2V5d29yZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghX3JldHVybi5kZXNjcmlwdGlvbiAmJiBwcm9wZXJ0eS5qc0RvYyAmJiBwcm9wZXJ0eS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MocHJvcGVydHkpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzSlNEb2NUYWdzKGpzZG9jdGFncywgX3JldHVybik7XG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RBbmRQcm9jZXNzSlNEb2NDb21tZW50KHByb3BlcnR5LCBzb3VyY2VGaWxlLCBfcmV0dXJuKTtcbiAgICAgICAgfVxuICAgICAgICBfcmV0dXJuLmxpbmUgPSB0aGlzLmdldFBvc2l0aW9uKHByb3BlcnR5LCBzb3VyY2VGaWxlKS5saW5lICsgMTtcbiAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUpIHtcbiAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IHRoaXMudmlzaXRUeXBlKHByb3BlcnR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBOZXdFeHByZXNzaW9uXG4gICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNOZXdFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi50eXBlID0gcHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJ5IHRvIGdldCBpbmZlcnJlZCB0eXBlXG4gICAgICAgICAgICBpZiAocHJvcGVydHkuc3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sOiB0cy5TeW1ib2wgPSBwcm9wZXJ0eS5zeW1ib2w7XG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbFR5cGUgPSB0aGlzLnR5cGVDaGVja2VyLmdldFR5cGVPZlN5bWJvbEF0TG9jYXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wudmFsdWVEZWNsYXJhdGlvblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi50eXBlID0gdGhpcy50eXBlQ2hlY2tlci50eXBlVG9TdHJpbmcoc3ltYm9sVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5LmtpbmQgPT09IFN5bnRheEtpbmQuU2V0QWNjZXNzb3IpIHtcbiAgICAgICAgICAgIC8vIEZvciBzZXR0ZXIgYWNjZXNzb3IsIGZpbmQgdHlwZSBpbiBmaXJzdCBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5wYXJhbWV0ZXJzICYmIHByb3BlcnR5LnBhcmFtZXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LnBhcmFtZXRlcnNbMF0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLnR5cGUgPSB0aGlzLnZpc2l0VHlwZShwcm9wZXJ0eS5wYXJhbWV0ZXJzWzBdLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlSGFzRGVjb3JhdG9yKHByb3BlcnR5KSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlEZWNvcmF0b3JzID0gZ2V0Tm9kZURlY29yYXRvcnMocHJvcGVydHkpO1xuICAgICAgICAgICAgX3JldHVybi5kZWNvcmF0b3JzID0gdGhpcy5mb3JtYXREZWNvcmF0b3JzKHByb3BlcnR5RGVjb3JhdG9ycykuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5uYW1lICE9PSAnSW5wdXQnICYmIGl0ZW0ubmFtZSAhPT0gJ0hvc3RCaW5kaW5nJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SG9zdExpc3RlbmVyKHByb3BlcnR5LCBob3N0TGlzdGVuZXJEZWNvcmF0b3IsIHNvdXJjZUZpbGU/KSB7XG4gICAgICAgIGxldCBpbkFyZ3MgPSBob3N0TGlzdGVuZXJEZWNvcmF0b3IuZXhwcmVzc2lvbi5hcmd1bWVudHM7XG4gICAgICAgIGxldCBfcmV0dXJuOiBhbnkgPSB7fTtcbiAgICAgICAgX3JldHVybi5uYW1lID0gaW5BcmdzLmxlbmd0aCA+IDAgPyBpbkFyZ3NbMF0udGV4dCA6IHByb3BlcnR5Lm5hbWUudGV4dDtcbiAgICAgICAgX3JldHVybi5hcmdzID0gcHJvcGVydHkucGFyYW1ldGVyc1xuICAgICAgICAgICAgPyBwcm9wZXJ0eS5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSlcbiAgICAgICAgICAgIDogW107XG4gICAgICAgIF9yZXR1cm4uYXJnc0RlY29yYXRvciA9XG4gICAgICAgICAgICBpbkFyZ3MubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgID8gaW5BcmdzWzFdLmVsZW1lbnRzLm1hcChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcC50ZXh0O1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICBPYmplY3QuYXNzaWduKF9yZXR1cm4sIHRoaXMuaW5pdGlhbGl6ZURvY3VtZW50YXRpb25GaWVsZHMoKSk7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jKSB7XG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RBbmRQcm9jZXNzSlNEb2NDb21tZW50KHByb3BlcnR5LCBzb3VyY2VGaWxlLCBfcmV0dXJuKTtcbiAgICAgICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhwcm9wZXJ0eSk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NKU0RvY1RhZ3MoanNkb2N0YWdzLCBfcmV0dXJuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0RmFsbGJhY2tEZXNjcmlwdGlvbihfcmV0dXJuLCBwcm9wZXJ0eSk7XG4gICAgICAgIF9yZXR1cm4ubGluZSA9IHRoaXMuZ2V0UG9zaXRpb24ocHJvcGVydHksIHNvdXJjZUZpbGUpLmxpbmUgKyAxO1xuICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGNsYXNzIFRzUHJpbnRlclV0aWwge1xuICAgIHByaXZhdGUgcHJpbnRlcjogdHMuUHJpbnRlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHtcbiAgICAgICAgICAgIG5ld0xpbmU6IHRzLk5ld0xpbmVLaW5kLkxpbmVGZWVkXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmludChub2RlOiB0cy5Ob2RlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJpbnRlci5wcmludE5vZGUoXG4gICAgICAgICAgICB0cy5FbWl0SGludC5VbnNwZWNpZmllZCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICB0cy5jcmVhdGVTb3VyY2VGaWxlKCcnLCAnJywgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdClcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCIvLyBAdHMtbm9jaGVja1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5pbXBvcnQgeyBUc1ByaW50ZXJVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvdHMtcHJpbnRlci51dGlsJztcblxuaW1wb3J0IEltcG9ydHNVdGlsIGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL2ltcG9ydHMudXRpbCc7XG5cbmVudW0gQW5ndWxhclByb3ZpZGVyQ29uZmlnUHJvcGVydGllcyB7XG4gICAgVXNlY2xhc3MgPSAndXNlQ2xhc3MnLFxuICAgIFVzZVZhbHVlID0gJ3VzZVZhbHVlJyxcbiAgICBVc2VGYWN0b3J5ID0gJ3VzZUZhY3RvcnknLFxuICAgIFVzZUV4aXN0aW5nID0gJ3VzZUV4aXN0aW5nJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW1ib2xIZWxwZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdW5rbm93biA9ICc/Pz8nO1xuXG4gICAgcHVibGljIHBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWU6IHN0cmluZywgc3JjRmlsZT86IHRzLlNvdXJjZUZpbGUpOiBJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdCB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgIHR5cGU6ICcnXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbnNNb2R1bGUgPSBuYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgIGxldCB0eXBlID0gdGhpcy5nZXRUeXBlKG5hbWUpO1xuXG4gICAgICAgIGlmIChuc01vZHVsZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICByZXN1bHQubnMgPSBuc01vZHVsZVswXTtcbiAgICAgICAgICAgIHJlc3VsdC5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIHJlc3VsdC50eXBlID0gdHlwZTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzcmNGaWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVzdWx0LmZpbGUgPSBJbXBvcnRzVXRpbC5nZXRGaWxlTmFtZU9mSW1wb3J0KG5hbWUsIHNyY0ZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5uYW1lID0gbmFtZTtcbiAgICAgICAgcmVzdWx0LnR5cGUgPSB0eXBlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUeXBlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0eXBlO1xuICAgICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2NvbXBvbmVudCcpICE9PSAtMSkge1xuICAgICAgICAgICAgdHlwZSA9ICdjb21wb25lbnQnO1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdwaXBlJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0eXBlID0gJ3BpcGUnO1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjb250cm9sbGVyJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0eXBlID0gJ2NvbnRyb2xsZXInO1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdtb2R1bGUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZGlyZWN0aXZlJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0eXBlID0gJ2RpcmVjdGl2ZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignaW5qZWN0YWJsZScpICE9PSAtMSB8fFxuICAgICAgICAgICAgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3NlcnZpY2UnKSAhPT0gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0eXBlID0gJ2luamVjdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE91dHB1dFxuICAgICAqIFJvdXRlck1vZHVsZS5mb3JSb290IDE3OVxuICAgICAqL1xuICAgIHB1YmxpYyBidWlsZElkZW50aWZpZXJOYW1lKFxuICAgICAgICBub2RlOiB0cy5JZGVudGlmaWVyIHwgdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uIHwgdHMuU3ByZWFkRWxlbWVudCxcbiAgICAgICAgbmFtZVxuICAgICkge1xuICAgICAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5vZGUpICYmICF0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke25vZGUudGV4dH0uJHtuYW1lfWA7XG4gICAgICAgIH1cblxuICAgICAgICBuYW1lID0gbmFtZSA/IGAuJHtuYW1lfWAgOiAnJztcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSB0aGlzLnVua25vd247XG4gICAgICAgIGlmIChub2RlLm5hbWUpIHtcbiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5uYW1lLnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS50ZXh0KSB7XG4gICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUudGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24udGV4dCkge1xuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZXhwcmVzc2lvbi5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUuZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoZWwgPT4gZWwudGV4dCkuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBgWyR7bm9kZU5hbWV9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRzLmlzU3ByZWFkRWxlbWVudChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGAuLi4ke25vZGVOYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGRJZGVudGlmaWVyTmFtZShub2RlLmV4cHJlc3Npb24sIG5vZGVOYW1lKX0ke25hbWV9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOlxuICAgICAqIHsgcHJvdmlkZTogQVBQX0JBU0VfSFJFRiwgdXNlVmFsdWU6ICcvJyB9XG4gICAgICogeyBwcm92aWRlOiAnRGF0ZScsIHVzZUZhY3Rvcnk6IChkMSwgZDIpID0+IG5ldyBEYXRlKCksIGRlcHM6IFsnZDEnLCAnZDInXSB9XG4gICAgICovXG4gICAgcHVibGljIHBhcnNlUHJvdmlkZXJDb25maWd1cmF0aW9uKG5vZGU6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKG5vZGUua2luZCAmJiBub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVQcm9wZXJ0eSA9IG5vZGUucHJvcGVydGllcy5maW5kKChwcm9wcykgPT4gcHJvcHMubmFtZS5nZXRUZXh0KCkgPT09ICdwcm92aWRlJyk7XG5cbiAgICAgICAgICAgIGlmICghcHJvdmlkZVByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJvdmlkZSBwcm9wZXJ0eSBub3QgZm91bmQgaW4gcHJvdmlkZXIgb2JqZWN0IGNvbmZpZ1wiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHJvdmlkZXJPYmplY3RQcm9wcyA9IE9iamVjdC52YWx1ZXMoQW5ndWxhclByb3ZpZGVyQ29uZmlnUHJvcGVydGllcylcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdmlkZXJPYmplY3RQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyUHJvcCA9IHByb3ZpZGVyT2JqZWN0UHJvcHNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IG5vZGUucHJvcGVydGllcy5maW5kKChwcm9wcykgPT4gcHJvcHMubmFtZS5nZXRUZXh0KCkgPT09IHByb3ZpZGVyUHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3AuZ2V0TGFzdFRva2VuKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgVHNQcmludGVyVXRpbCgpLnByaW50KG5vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEtpbmRcbiAgICAgKiAgMTgxIENhbGxFeHByZXNzaW9uID0+IFwiUm91dGVyTW9kdWxlLmZvclJvb3QoYXJncylcIlxuICAgICAqICAgNzEgSWRlbnRpZmllciAgICAgPT4gXCJSb3V0ZXJNb2R1bGVcIiBcIlRvZG9TdG9yZVwiXG4gICAgICogICAgOSBTdHJpbmdMaXRlcmFsICA9PiBcIi4vYXBwLmNvbXBvbmVudC5jc3NcIiBcIi4vdGFiLnNjc3NcIlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJzZVN5bWJvbEVsZW1lbnRzKFxuICAgICAgICBub2RlOlxuICAgICAgICAgICAgfCB0cy5DYWxsRXhwcmVzc2lvblxuICAgICAgICAgICAgfCB0cy5JZGVudGlmaWVyXG4gICAgICAgICAgICB8IHRzLlN0cmluZ0xpdGVyYWxcbiAgICAgICAgICAgIHwgdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uXG4gICAgICAgICAgICB8IHRzLlNwcmVhZEVsZW1lbnRcbiAgICApOiBzdHJpbmcge1xuICAgICAgICAvLyBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOiBBbmd1bGFyRmlyZU1vZHVsZS5pbml0aWFsaXplQXBwKGZpcmViYXNlQ29uZmlnKVxuICAgICAgICAvLyBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiB0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0cy5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbikpIHx8XG4gICAgICAgICAgICAodHMuaXNOZXdFeHByZXNzaW9uKG5vZGUpICYmIHRzLmlzRWxlbWVudEFjY2Vzc0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gdGhpcy5idWlsZElkZW50aWZpZXJOYW1lKG5vZGUuZXhwcmVzc2lvbik7XG5cbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3VsZCBiZSByZWFsbHkgY29tcGxleC4gVGhlcmUgYXJlIHNvXG4gICAgICAgICAgICAvLyBtYW55IHVzZSBjYXNlcyB0aGF0IHdlIGNhbid0IGhhbmRsZS4gSnVzdCBwcmludCBcImFyZ3NcIiB0byBpbmRpY2F0ZVxuICAgICAgICAgICAgLy8gdGhhdCB3ZSBoYXZlIGFyZ3VtZW50cy5cblxuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uQXJncyA9IG5vZGUuYXJndW1lbnRzLmxlbmd0aCA+IDAgPyAnYXJncycgOiAnJztcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gYCR7Y2xhc3NOYW1lfSgke2Z1bmN0aW9uQXJnc30pYDtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOiBTaGFyZWQuTW9kdWxlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZElkZW50aWZpZXJOYW1lKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzSWRlbnRpZmllcihub2RlKSkge1xuICAgICAgICAgICAgLy8gcGFyc2UgZXhwcmVzc2lvbnMgc3VjaCBhczogTXlDb21wb25lbnRcbiAgICAgICAgICAgIGlmIChub2RlLnRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUuZXNjYXBlZFRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5lc2NhcGVkVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0cy5pc1NwcmVhZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlIGV4cHJlc3Npb25zIHN1Y2ggYXM6IC4uLk1ZQVJSQVlcbiAgICAgICAgICAgIC8vIFJlc29sdmUgTVlBUlJBWSBpbiBpbXBvcnRzIG9yIGxvY2FsIGZpbGUgdmFyaWFibGVzIGFmdGVyIGZ1bGwgc2NhbiwganVzdCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlXG4gICAgICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uICYmIG5vZGUuZXhwcmVzc2lvbi50ZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGUudGV4dCA/IG5vZGUudGV4dCA6IHRoaXMucGFyc2VQcm92aWRlckNvbmZpZ3VyYXRpb24obm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogS2luZFxuICAgICAqICAxNzcgQXJyYXlMaXRlcmFsRXhwcmVzc2lvblxuICAgICAqICAxMjIgQm9vbGVhbktleXdvcmRcbiAgICAgKiAgICA5IFN0cmluZ0xpdGVyYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlU3ltYm9scyhcbiAgICAgICAgbm9kZTogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnQsXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIGRlY29yYXRvclR5cGU6IHN0cmluZ1xuICAgICk6IEFycmF5PHN0cmluZyB8IGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IGxvY2FsTm9kZSA9IG5vZGU7XG5cbiAgICAgICAgaWYgKHRzLmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KGxvY2FsTm9kZSkgJiYgZGVjb3JhdG9yVHlwZSAhPT0gJ3RlbXBsYXRlJykge1xuICAgICAgICAgICAgbG9jYWxOb2RlID0gSW1wb3J0c1V0aWwuZmluZFZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKFxuICAgICAgICAgICAgICAgIG5vZGUubmFtZS50ZXh0LFxuICAgICAgICAgICAgICAgIHNyY0ZpbGUsXG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yVHlwZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHMuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQobG9jYWxOb2RlKSAmJiBkZWNvcmF0b3JUeXBlID09PSAndGVtcGxhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSW1wb3J0c1V0aWwuZmluZFZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKFxuICAgICAgICAgICAgICAgIG5vZGUubmFtZS50ZXh0LFxuICAgICAgICAgICAgICAgIHNyY0ZpbGUsXG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yVHlwZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBbZGF0YV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9jYWxOb2RlLmluaXRpYWxpemVyICYmIHRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihsb2NhbE5vZGUuaW5pdGlhbGl6ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxOb2RlLmluaXRpYWxpemVyLmVsZW1lbnRzLm1hcCh4ID0+IHRoaXMucGFyc2VTeW1ib2xFbGVtZW50cyh4KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAobG9jYWxOb2RlLmluaXRpYWxpemVyICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIpKSB8fFxuICAgICAgICAgICAgKGxvY2FsTm9kZS5pbml0aWFsaXplciAmJiB0cy5pc1RlbXBsYXRlTGl0ZXJhbChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIpKSB8fFxuICAgICAgICAgICAgKGxvY2FsTm9kZS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgICAgIHRzLmlzUHJvcGVydHlBc3NpZ25tZW50KGxvY2FsTm9kZSkgJiZcbiAgICAgICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIudGV4dClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW2xvY2FsTm9kZS5pbml0aWFsaXplci50ZXh0XTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgbG9jYWxOb2RlLmluaXRpYWxpemVyLmtpbmQgJiZcbiAgICAgICAgICAgIChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5UcnVlS2V5d29yZCB8fFxuICAgICAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplci5raW5kID09PSBTeW50YXhLaW5kLkZhbHNlS2V5d29yZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW2xvY2FsTm9kZS5pbml0aWFsaXplci5raW5kID09PSBTeW50YXhLaW5kLlRydWVLZXl3b3JkID8gdHJ1ZSA6IGZhbHNlXTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIgJiYgdHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obG9jYWxOb2RlLmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgbGV0IGlkZW50aWZpZXIgPSB0aGlzLnBhcnNlU3ltYm9sRWxlbWVudHMobG9jYWxOb2RlLmluaXRpYWxpemVyKTtcbiAgICAgICAgICAgIHJldHVybiBbaWRlbnRpZmllcl07XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIgJiZcbiAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplci5lbGVtZW50cyAmJlxuICAgICAgICAgICAgbG9jYWxOb2RlLmluaXRpYWxpemVyLmVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBOb2RlIHJlcGxhY2VkIGJ5IHRzLXNpbXBsZS1hc3QgJiBraW5kID0gMjY1XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxOb2RlLmluaXRpYWxpemVyLmVsZW1lbnRzLm1hcCh4ID0+IHRoaXMucGFyc2VTeW1ib2xFbGVtZW50cyh4KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3ltYm9sRGVwcyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgZGVjb3JhdG9yVHlwZTogc3RyaW5nLFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgICAgICBtdWx0aUxpbmU/OiBib29sZWFuXG4gICAgKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgIGxlbiA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICAgIGZpbHRlcmVkUHJvcHMgPSBbXTtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHByb3BzW2ldLm5hbWUgJiYgcHJvcHNbaV0ubmFtZS50ZXh0ID09PSBkZWNvcmF0b3JUeXBlKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRQcm9wcy5wdXNoKHByb3BzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BzLm1hcCh4ID0+IHRoaXMucGFyc2VTeW1ib2xzKHgsIHNyY0ZpbGUsIGRlY29yYXRvclR5cGUpKS5wb3AoKSB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3ltYm9sRGVwc1JhdyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBtdWx0aUxpbmU/OiBib29sZWFuXG4gICAgKTogQXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5maWx0ZXIobm9kZSA9PiBub2RlLm5hbWUuZ2V0VGV4dCgpID09PSB0eXBlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQge1xuICAgIG5zPzogYW55O1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmaWxlPzogc3RyaW5nO1xuICAgIHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IFN5bnRheEtpbmQsIHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuaW1wb3J0IHsgZGV0ZWN0SW5kZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ2xhc3NIZWxwZXIgfSBmcm9tICcuL2NsYXNzLWhlbHBlcic7XG5pbXBvcnQgeyBJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdCwgU3ltYm9sSGVscGVyIH0gZnJvbSAnLi9zeW1ib2wtaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2xhc3NIZWxwZXI6IENsYXNzSGVscGVyLFxuICAgICAgICBwcml2YXRlIHN5bWJvbEhlbHBlcjogU3ltYm9sSGVscGVyID0gbmV3IFN5bWJvbEhlbHBlcigpXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudENoYW5nZURldGVjdGlvbihcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnY2hhbmdlRGV0ZWN0aW9uJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEVuY2Fwc3VsYXRpb24oXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdlbmNhcHN1bGF0aW9uJywgc3JjRmlsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFB1cmUoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3B1cmUnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50TmFtZShcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnbmFtZScsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFeHBvcnRBcyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZXhwb3J0QXMnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SG9zdERpcmVjdGl2ZXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT5cbiAgICApOiBBcnJheTxhbnk+IHtcbiAgICAgICAgY29uc3QgaG9zdERpcmVjdGl2ZVN5bWJvbFBhcnNlZCA9IHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHNSYXcoXG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICdob3N0RGlyZWN0aXZlcydcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGhvc3REaXJlY3RpdmVTeW1ib2wgPSBudWxsO1xuXG4gICAgICAgIGlmIChob3N0RGlyZWN0aXZlU3ltYm9sUGFyc2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGhvc3REaXJlY3RpdmVTeW1ib2wgPSBob3N0RGlyZWN0aXZlU3ltYm9sUGFyc2VkLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbCAmJlxuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbC5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbC5pbml0aWFsaXplci5lbGVtZW50cyAmJlxuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbC5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbC5pbml0aWFsaXplci5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmtpbmQgPT09IFN5bnRheEtpbmQuSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50LmVzY2FwZWRUZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQua2luZCA9PT0gU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnByb3BlcnRpZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGlyZWN0aXZlOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5uYW1lLmVzY2FwZWRUZXh0ID09PSAnZGlyZWN0aXZlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERpcmVjdGl2ZS5uYW1lID0gcHJvcGVydHkuaW5pdGlhbGl6ZXIuZXNjYXBlZFRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5Lm5hbWUuZXNjYXBlZFRleHQgPT09ICdpbnB1dHMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplci5lbGVtZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmluaXRpYWxpemVyLmVsZW1lbnRzLmZvckVhY2gocHJvcGVydHlFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERpcmVjdGl2ZS5pbnB1dHMucHVzaChwcm9wZXJ0eUVsZW1lbnQudGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkubmFtZS5lc2NhcGVkVGV4dCA9PT0gJ291dHB1dHMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplci5lbGVtZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmluaXRpYWxpemVyLmVsZW1lbnRzLmZvckVhY2gocHJvcGVydHlFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERpcmVjdGl2ZS5vdXRwdXRzLnB1c2gocHJvcGVydHlFbGVtZW50LnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlZERpcmVjdGl2ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRIb3N0KFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+XG4gICAgKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN5bWJvbERlcHNPYmplY3QocHJvcHMsICdob3N0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFRhZyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAndGFnJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudElucHV0c01ldGFkYXRhKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnaW5wdXRzJywgc3JjRmlsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldElucHV0T3V0cHV0U2lnbmFscyhwcm9wcykge1xuICAgICAgICBjb25zdCBpbnB1dFNpZ25hbHMgPSBbXTtcbiAgICAgICAgY29uc3Qgb3V0cHV0U2lnbmFscyA9IFtdO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gW107XG5cbiAgICAgICAgcHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0U2lnbmFsID0gdGhpcy5nZXRJbnB1dFNpZ25hbChwcm9wKTtcbiAgICAgICAgICAgIGlmIChpbnB1dFNpZ25hbCkge1xuICAgICAgICAgICAgICAgIGlucHV0U2lnbmFscy5wdXNoKGlucHV0U2lnbmFsKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRTaWduYWwgPSB0aGlzLmdldE91dHB1dFNpZ25hbChwcm9wKTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRTaWduYWwpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRTaWduYWxzLnB1c2gob3V0cHV0U2lnbmFsKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlucHV0U2lnbmFsICYmICFvdXRwdXRTaWduYWwpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocHJvcClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtpbnB1dFNpZ25hbHMsIG91dHB1dFNpZ25hbHMsIHByb3BlcnRpZXN9XG4gICAgfVxuXG4gICAgcHVibGljIGdldElucHV0U2lnbmFsKHByb3ApIHtcbiAgICAgICAgY29uc3QgY29uZmlnID1cbiAgICAgICAgICAgIHRoaXMuZ2V0U2lnbmFsQ29uZmlnKCdpbnB1dCcsIHByb3AuZGVmYXVsdFZhbHVlKSA/P1xuICAgICAgICAgICAgdGhpcy5nZXRTaWduYWxDb25maWcoJ21vZGVsJywgcHJvcC5kZWZhdWx0VmFsdWUpO1xuXG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiAge1xuICAgICAgICAgICAgICAgIC4uLnByb3AsXG4gICAgICAgICAgICAgICAgLi4uY29uZmlnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3V0cHV0U2lnbmFsKHByb3ApIHtcbiAgICAgICAgY29uc3QgY29uZmlnID1cbiAgICAgICAgICAgIHRoaXMuZ2V0U2lnbmFsQ29uZmlnKCdvdXRwdXQnLCBwcm9wLmRlZmF1bHRWYWx1ZSkgPz9cbiAgICAgICAgICAgIHRoaXMuZ2V0U2lnbmFsQ29uZmlnKCdtb2RlbCcsIHByb3AuZGVmYXVsdFZhbHVlKTtcblxuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm4gIHtcbiAgICAgICAgICAgICAgICAuLi5wcm9wLFxuICAgICAgICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTaWduYWxDb25maWcodHlwZTogJ2lucHV0JyB8ICdvdXRwdXQnIHwgJ21vZGVsJywgZGVmYXVsdFZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gTWF0Y2hlcyBhIHF1b3RlIG1hcmtcbiAgICAgICAgY29uc3QgcXVvdGVQYXR0ZXJuID0gYFsnXCJcXGBdYDtcblxuICAgICAgICAvLyBNYXRjaGVzIGEgdmFsdWUgZm9yIHRoZSBpbnB1dFxuICAgICAgICBjb25zdCB2YWx1ZVBhdHRlcm4gPSAoY2FwdHVyZSA9IHRydWUpID0+XG4gICAgICAgICAgICBgKCR7Y2FwdHVyZSA/ICcnIDogJz86J31bXigpXSooPzpcXFxcKFteKCldKlxcXFwpW14oKV0qKSopYDtcblxuICAgICAgICAvLyBNYXRjaGVzIGFuIG9wdGlvbmFsIHNwYWNlXG4gICAgICAgIGNvbnN0IHNwYWNlUGF0dGVybiA9IGAoPzogKSpgO1xuXG4gICAgICAgIC8vIE1hdGNoZXMgdGhlIGlucHV0J3MgdHlwZVxuICAgICAgICBjb25zdCB0eXBlc1BhdHRlcm4gPSBgKD86PCgoPzoke3ZhbHVlUGF0dGVybihmYWxzZSl9KD86JHtzcGFjZVBhdHRlcm59XFxcXHwke3NwYWNlUGF0dGVybn0pPykrKT4pP2A7XG5cbiAgICAgICAgLy8gTWF0Y2hlcyB0aGUgYWxpYXMgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnNcbiAgICAgICAgY29uc3QgYWxpYXNSZWdFeHAgPSBuZXcgUmVnRXhwKGBhbGlhczoke3NwYWNlUGF0dGVybn0ke3F1b3RlUGF0dGVybn0oXFxcXHcrKSR7cXVvdGVQYXR0ZXJufWApO1xuXG4gICAgICAgIC8vIE1hdGNoZXMgYSBzaWduYWwgb2YgdGhlIHByb3ZpZGVkIHR5cGVcbiAgICAgICAgY29uc3Qgc2lnbmFsUmVnRXhwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgIGAke3R5cGV9KC5yZXF1aXJlZCk/JHt0eXBlc1BhdHRlcm59XFxcXCgke3ZhbHVlUGF0dGVybigpfT8oPzosJHtzcGFjZVBhdHRlcm59KHsuK30pKT9cXFxcKWBcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBtYXRjaGVzID0gc2lnbmFsUmVnRXhwLmV4ZWMoZGVmYXVsdFZhbHVlPy5yZXBsYWNlKC9cXG4vZywgJycpKTtcblxuICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgW19tYXRjaCwgcmVxdWlyZWQsIHR5cGUsIGRlZmF1bHRWYWx1ZSwgb3B0aW9uc10gPSBtYXRjaGVzO1xuXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gb3B0aW9ucz8ubWF0Y2goYWxpYXNSZWdFeHApPy5bMV07XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogISFyZXF1aXJlZCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnBhcnNlU2lnbmFsVHlwZSh0eXBlKSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZVNpZ25hbFR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGp1c3QgdW5pb24gc3RyaW5nIGV4cHJlc3Npb24gbGlrZTogJ2ZvbycgfCAnYmFyJyB8ICd0ZXN0J1xuICAgICAgICAvLyB3aGljaCBzaG91bGQgYmUgb3V0cHV0ZWQgYXM6IFwiZm9vXCIgfCBcImJhclwiIHwgXCJ0ZXN0XCJcblxuICAgICAgICBjb25zdCB1bmlvblR5cGVSZWdleCA9IC9eJyhbXFx3LV0rKSdcXHM/XFx8XFxzPygnKFtcXHctXSspJ3wuKikkL1xuICAgICAgICBsZXQgdHlwZVJlc3QgPSB0eXBlO1xuICAgICAgICBsZXQgbmV3VHlwZSA9IFwiXCI7XG4gICAgICAgIGxldCB0eXBlTWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXk7XG4gICAgICAgIHdoaWxlICgodHlwZU1hdGNoID0gdHlwZVJlc3QubWF0Y2godW5pb25UeXBlUmVnZXgpKSkge1xuICAgICAgICAgICAgY29uc3QgWywgZmlyc3QsIHJlc3QsIHNlY29uZF0gPSB0eXBlTWF0Y2g7XG4gICAgICAgICAgICBpZiAoc2Vjb25kKSB7XG4gICAgICAgICAgICAgICAgbmV3VHlwZSArPSBgXCIke2ZpcnN0fVwiIHwgXCIke3NlY29uZH1cImA7XG4gICAgICAgICAgICAgICAgdHlwZSA9IG5ld1R5cGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdUeXBlICs9IGBcIiR7Zmlyc3R9XCIgfCBgO1xuICAgICAgICAgICAgdHlwZVJlc3QgPSByZXN0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFN0YW5kYWxvbmUoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc3RhbmRhbG9uZScsIHNyY0ZpbGUpO1xuICAgICAgICBpZiAocGFyc2VkRGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocGFyc2VkRGF0YVswXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0ID0gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3RlbXBsYXRlJywgc3JjRmlsZSwgdHJ1ZSkucG9wKCk7XG4gICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICB0ID0gZGV0ZWN0SW5kZW50KHQsIDApO1xuICAgICAgICAgICAgdCA9IHQucmVwbGFjZSgvXFxuLywgJycpO1xuICAgICAgICAgICAgdCA9IHQucmVwbGFjZSgvICskL2dtLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFN0eWxlVXJscyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdzdHlsZVVybHMnLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50U3R5bGVVcmwoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3N0eWxlVXJsJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFNoYWRvdyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc2hhZG93Jywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFNjb3BlZChcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc2NvcGVkJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEFzc2V0c0RpcihcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnYXNzZXRzRGlyJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEFzc2V0c0RpcnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplVXJscyh0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnYXNzZXRzRGlyJywgc3JjRmlsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRTdHlsZXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc3R5bGVzJywgc3JjRmlsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudE1vZHVsZUlkKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdtb2R1bGVJZCcsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRPdXRwdXRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ291dHB1dHMnLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UHJvdmlkZXJzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3Byb3ZpZGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRJbXBvcnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2ltcG9ydHMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50RW50cnlDb21wb25lbnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2VudHJ5Q29tcG9uZW50cycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRWaWV3UHJvdmlkZXJzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3ZpZXdQcm92aWRlcnMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50VGVtcGxhdGVVcmwoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICd0ZW1wbGF0ZVVybCcsIHNyY0ZpbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFeGFtcGxlVXJscyh0ZXh0OiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGV4YW1wbGVVcmxzTWF0Y2hlcyA9IHRleHQubWF0Y2goLzxleGFtcGxlLXVybD4oLio/KTxcXC9leGFtcGxlLXVybD4vZyk7XG4gICAgICAgIGxldCBleGFtcGxlVXJscyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGV4YW1wbGVVcmxzTWF0Y2hlcyAmJiBleGFtcGxlVXJsc01hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBleGFtcGxlVXJscyA9IGV4YW1wbGVVcmxzTWF0Y2hlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWwucmVwbGFjZSgvPFxcLz9leGFtcGxlLXVybD4vZywgJycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4YW1wbGVVcmxzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRQcmVzZXJ2ZVdoaXRlc3BhY2VzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdwcmVzZXJ2ZVdoaXRlc3BhY2VzJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFNlbGVjdG9yKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdzZWxlY3RvcicsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VQcm9wZXJ0aWVzKG5vZGU6IHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZSk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBsZXQgb2JqID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IG5vZGUgYXMgYW55O1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IGVsZW1lbnQuaW5pdGlhbGl6ZXI/LnByb3BlcnRpZXMgfHwgW107XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcDogYW55KSA9PiB7XG4gICAgICAgICAgICBvYmouc2V0KHByb3AubmFtZT8udGV4dCwgcHJvcC5pbml0aWFsaXplcj8udGV4dCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTeW1ib2xEZXBzT2JqZWN0KFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgIG11bHRpTGluZT86IGJvb2xlYW5cbiAgICApOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgbGVuID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgICAgZmlsdGVyZWRQcm9wcyA9IFtdO1xuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocHJvcHNbaV0ubmFtZSAmJiAocHJvcHNbaV0ubmFtZSBhcyBhbnkpLnRleHQgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFByb3BzLnB1c2gocHJvcHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BzLm1hcCh4ID0+IHRoaXMucGFyc2VQcm9wZXJ0aWVzKHgpKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SU8oXG4gICAgICAgIGZpbGVuYW1lOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5vZGU6IHRzLk5vZGUsXG4gICAgICAgIGZpbGVCb2R5LFxuICAgICAgICBhc3RGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogYW55IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHJlZHVjZWRTb3VyY2UgPSBmaWxlQm9keSA/IGZpbGVCb2R5LnN0YXRlbWVudHMgOiBzb3VyY2VGaWxlLnN0YXRlbWVudHM7XG4gICAgICAgIGxldCByZXMgPSByZWR1Y2VkU291cmNlLnJlZHVjZSgoZGlyZWN0aXZlLCBzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdEZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICByZXR1cm4gcmVzWzBdIHx8IHt9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2FuaXRpemVVcmxzKHVybHM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHVybHMubWFwKHVybCA9PiB1cmwucmVwbGFjZSgnLi8nLCAnJykpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENhY2hlIHtcbiAgICBwcml2YXRlIGNhY2hlOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IENsYXNzSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9jbGFzcy1oZWxwZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9jb21wb25lbnQtaGVscGVyJztcblxuaW1wb3J0IHsgY29tcGlsZXJIb3N0IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgRnJhbWV3b3JrRGVwZW5kZW5jaWVzIHtcbiAgICBwdWJsaWMgZmlsZXM6IHN0cmluZ1tdO1xuICAgIHB1YmxpYyBwcm9ncmFtOiB0cy5Qcm9ncmFtO1xuICAgIHB1YmxpYyB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXI7XG4gICAgcHVibGljIGNsYXNzSGVscGVyOiBDbGFzc0hlbHBlcjtcbiAgICBwdWJsaWMgY29tcG9uZW50SGVscGVyOiBDb21wb25lbnRIZWxwZXI7XG4gICAgcHVibGljIHJvdXRlclBhcnNlcjtcblxuICAgIGNvbnN0cnVjdG9yKGZpbGVzOiBzdHJpbmdbXSwgb3B0aW9uczogYW55KSB7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlcztcblxuICAgICAgICBjb25zdCB0cmFuc3BpbGVPcHRpb25zID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiB0cy5TY3JpcHRUYXJnZXQuRVM1LFxuICAgICAgICAgICAgbW9kdWxlOiB0cy5Nb2R1bGVLaW5kLkNvbW1vbkpTLFxuICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IG9wdGlvbnMudHNjb25maWdEaXJlY3RvcnksXG4gICAgICAgICAgICBhbGxvd0pzOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgICAgICAgICB0aGlzLmZpbGVzLFxuICAgICAgICAgICAgdHJhbnNwaWxlT3B0aW9ucyxcbiAgICAgICAgICAgIGNvbXBpbGVySG9zdCh0cmFuc3BpbGVPcHRpb25zKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnR5cGVDaGVja2VyID0gdGhpcy5wcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gICAgICAgIHRoaXMuY2xhc3NIZWxwZXIgPSBuZXcgQ2xhc3NIZWxwZXIodGhpcy50eXBlQ2hlY2tlcik7XG4gICAgICAgIHRoaXMuY29tcG9uZW50SGVscGVyID0gbmV3IENvbXBvbmVudEhlbHBlcih0aGlzLmNsYXNzSGVscGVyKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGNsYXNzIENvZGVHZW5lcmF0b3Ige1xuICAgIHB1YmxpYyBnZW5lcmF0ZShub2RlOiB0cy5Ob2RlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRBbmRSZWNvZ25pemUobm9kZSwgW10pLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRBbmRSZWNvZ25pemUobm9kZTogdHMuTm9kZSwgY29kZTogQXJyYXk8c3RyaW5nPiwgZGVwdGggPSAwKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHRoaXMucmVjb2duaXplKG5vZGUsIGNvZGUpO1xuICAgICAgICBub2RlLmdldENoaWxkcmVuKCkuZm9yRWFjaChjID0+IHRoaXMudmlzaXRBbmRSZWNvZ25pemUoYywgY29kZSwgZGVwdGggKyAxKSk7XG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVjb2duaXplKG5vZGU6IHRzLk5vZGUsIGNvZGU6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgY29uc3QgY29udmVyc2lvbiA9IFRzS2luZENvbnZlcnNpb24uZmluZCh4ID0+IHgua2luZHMuc29tZSh6ID0+IHogPT09IG5vZGUua2luZCkpO1xuXG4gICAgICAgIGlmIChjb252ZXJzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJzaW9uLm91dHB1dChub2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKHRleHQgPT4gdGhpcy5nZW4odGV4dCwgY29kZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW4odG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCwgY29kZTogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBjb2RlLnB1c2goJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29kZS5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVHNLaW5kc1RvVGV4dCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG91dHB1dDogKG5vZGU6IHRzLk5vZGUpID0+IEFycmF5PHN0cmluZz4sIHB1YmxpYyBraW5kczogQXJyYXk8U3ludGF4S2luZD4pIHt9XG59XG5cbmNvbnN0IFRzS2luZENvbnZlcnNpb246IEFycmF5PFRzS2luZHNUb1RleHQ+ID0gW1xuICAgIG5ldyBUc0tpbmRzVG9UZXh0KFxuICAgICAgICBub2RlID0+IFsnXCInLCBub2RlLnRleHQsICdcIiddLFxuICAgICAgICBbU3ludGF4S2luZC5GaXJzdExpdGVyYWxUb2tlbiwgU3ludGF4S2luZC5JZGVudGlmaWVyXVxuICAgICksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ1wiJywgbm9kZS50ZXh0LCAnXCInXSwgW1N5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gW10sIFtTeW50YXhLaW5kLkFycmF5TGl0ZXJhbEV4cHJlc3Npb25dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnaW1wb3J0JywgJyAnXSwgW1N5bnRheEtpbmQuSW1wb3J0S2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydmcm9tJywgJyAnXSwgW1N5bnRheEtpbmQuRnJvbUtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnXFxuJywgJ2V4cG9ydCcsICcgJ10sIFtTeW50YXhLaW5kLkV4cG9ydEtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnY2xhc3MnLCAnICddLCBbU3ludGF4S2luZC5DbGFzc0tleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsndGhpcyddLCBbU3ludGF4S2luZC5UaGlzS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydjb25zdHJ1Y3RvciddLCBbU3ludGF4S2luZC5Db25zdHJ1Y3RvcktleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnZmFsc2UnXSwgW1N5bnRheEtpbmQuRmFsc2VLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3RydWUnXSwgW1N5bnRheEtpbmQuVHJ1ZUtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnbnVsbCddLCBbU3ludGF4S2luZC5OdWxsS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gW10sIFtTeW50YXhLaW5kLkF0VG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnKyddLCBbU3ludGF4S2luZC5QbHVzVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnID0+ICddLCBbU3ludGF4S2luZC5FcXVhbHNHcmVhdGVyVGhhblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJygnXSwgW1N5bnRheEtpbmQuT3BlblBhcmVuVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChcbiAgICAgICAgbm9kZSA9PiBbJ3snLCAnICddLFxuICAgICAgICBbU3ludGF4S2luZC5JbXBvcnRDbGF1c2UsIFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25dXG4gICAgKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsneycsICdcXG4nXSwgW1N5bnRheEtpbmQuQmxvY2tdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnfSddLCBbU3ludGF4S2luZC5DbG9zZUJyYWNlVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnKSddLCBbU3ludGF4S2luZC5DbG9zZVBhcmVuVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnWyddLCBbU3ludGF4S2luZC5PcGVuQnJhY2tldFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ10nXSwgW1N5bnRheEtpbmQuQ2xvc2VCcmFja2V0VG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnOycsICdcXG4nXSwgW1N5bnRheEtpbmQuU2VtaWNvbG9uVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnLCcsICcgJ10sIFtTeW50YXhLaW5kLkNvbW1hVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnICcsICc6JywgJyAnXSwgW1N5bnRheEtpbmQuQ29sb25Ub2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWycuJ10sIFtTeW50YXhLaW5kLkRvdFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbXSwgW1N5bnRheEtpbmQuRG9TdGF0ZW1lbnRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFtdLCBbU3ludGF4S2luZC5EZWNvcmF0b3JdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnID0gJ10sIFtTeW50YXhLaW5kLkZpcnN0QXNzaWdubWVudF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWycgJ10sIFtTeW50YXhLaW5kLkZpcnN0UHVuY3R1YXRpb25dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsncHJpdmF0ZScsICcgJ10sIFtTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3B1YmxpYycsICcgJ10sIFtTeW50YXhLaW5kLlB1YmxpY0tleXdvcmRdKVxuXTtcbiIsImltcG9ydCB7IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgSURlcCB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9jb21wb25lbnQtaGVscGVyJztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnREZXBGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGhlbHBlcjogQ29tcG9uZW50SGVscGVyKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZShmaWxlOiBhbnksIHNyY0ZpbGU6IGFueSwgbmFtZTogYW55LCBwcm9wczogYW55LCBJTzogYW55KTogSUNvbXBvbmVudERlcCB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHV0aWwuaW5zcGVjdChwcm9wcywgeyBzaG93SGlkZGVuOiB0cnVlLCBkZXB0aDogMTAgfSkpO1xuICAgICAgICBjb25zdCBzb3VyY2VDb2RlID0gc3JjRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNvdXJjZUNvZGUpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudERlcDogSUNvbXBvbmVudERlcCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ2NvbXBvbmVudC0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgLy8gYW5pbWF0aW9ucz86IHN0cmluZ1tdOyAvLyBUT0RPXG4gICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IHRoaXMuaGVscGVyLmdldENvbXBvbmVudENoYW5nZURldGVjdGlvbihwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFbmNhcHN1bGF0aW9uKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50RW50cnlDb21wb25lbnRzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGV4cG9ydEFzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFeHBvcnRBcyhwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBob3N0OiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRIb3N0KHByb3BzKSxcbiAgICAgICAgICAgIGlucHV0czogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50SW5wdXRzTWV0YWRhdGEocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGlvbj86IHN0cmluZzsgLy8gVE9ETyB3YWl0aW5nIGRvYyBpbmZvc1xuICAgICAgICAgICAgbW9kdWxlSWQ6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudE1vZHVsZUlkKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIG91dHB1dHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudE91dHB1dHMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcm92aWRlcnMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgLy8gcXVlcmllcz86IERlcHNbXTsgLy8gVE9ET1xuICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFNlbGVjdG9yKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlVXJsczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3R5bGVVcmxzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3R5bGVzKHByb3BzLCBzcmNGaWxlKSwgLy8gVE9ETyBmaXggYXJnc1xuICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFRlbXBsYXRlKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRUZW1wbGF0ZVVybChwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICB2aWV3UHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRWaWV3UHJvdmlkZXJzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGhvc3REaXJlY3RpdmVzOiBbLi4udGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50SG9zdERpcmVjdGl2ZXMocHJvcHMpXSxcbiAgICAgICAgICAgIGlucHV0c0NsYXNzOiBJTy5pbnB1dHMsXG4gICAgICAgICAgICBvdXRwdXRzQ2xhc3M6IElPLm91dHB1dHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzQ2xhc3M6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBtZXRob2RzQ2xhc3M6IElPLm1ldGhvZHMsXG5cbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcblxuICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBJTy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBJTy5ob3N0TGlzdGVuZXJzLFxuXG4gICAgICAgICAgICBzdGFuZGFsb25lOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRTdGFuZGFsb25lKHByb3BzLCBzcmNGaWxlKSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIGltcG9ydHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEltcG9ydHMocHJvcHMsIHNyY0ZpbGUpLFxuXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogSU8uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogSU8ucmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgZXhhbXBsZVVybHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEV4YW1wbGVVcmxzKHNyY0ZpbGUuZ2V0VGV4dCgpKSxcblxuICAgICAgICAgICAgdGFnOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRUYWcocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgc3R5bGVVcmw6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFN0eWxlVXJsKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHNoYWRvdzogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U2hhZG93KHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHNjb3BlZDogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U2NvcGVkKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGFzc2V0c0RpcjogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50QXNzZXRzRGlyKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGFzc2V0c0RpcnM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEFzc2V0c0RpcnMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgc3R5bGVVcmxzRGF0YTogJycsXG4gICAgICAgICAgICBzdHlsZXNEYXRhOiAnJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGVscGVyLmdldENvbXBvbmVudFByZXNlcnZlV2hpdGVzcGFjZXMocHJvcHMsIHNyY0ZpbGUpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29tcG9uZW50RGVwLnByZXNlcnZlV2hpdGVzcGFjZXMgPSB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcmVzZXJ2ZVdoaXRlc3BhY2VzKFxuICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgIHNyY0ZpbGVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAubWV0aG9kc0NsYXNzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKGNvbXBvbmVudERlcC5tZXRob2RzQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5qc2RvY3RhZ3MgJiYgSU8uanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IgJiYgIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvbnN0cnVjdG9ycykge1xuICAgICAgICAgICAgY29tcG9uZW50RGVwLmNvbnN0cnVjdG9yT2JqID0gSU8uY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmV4dGVuZHMpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaW1wbGVtZW50cyAmJiBJTy5pbXBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5pbXBsZW1lbnRzID0gSU8uaW1wbGVtZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAuYWNjZXNzb3JzID0gSU8uYWNjZXNzb3JzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCB7aW5wdXRTaWduYWxzLCBvdXRwdXRTaWduYWxzLCBwcm9wZXJ0aWVzfSA9IHRoaXMuaGVscGVyLmdldElucHV0T3V0cHV0U2lnbmFscyhJTy5wcm9wZXJ0aWVzKTtcblxuICAgICAgICAgICAgY29tcG9uZW50RGVwLmlucHV0c0NsYXNzID0gY29tcG9uZW50RGVwLmlucHV0c0NsYXNzLmNvbmNhdChpbnB1dFNpZ25hbHMpXG4gICAgICAgICAgICBjb21wb25lbnREZXAub3V0cHV0c0NsYXNzID0gY29tcG9uZW50RGVwLm91dHB1dHNDbGFzcy5jb25jYXQob3V0cHV0U2lnbmFscylcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5wcm9wZXJ0aWVzQ2xhc3MgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudERlcDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlcCBleHRlbmRzIElEZXAge1xuICAgIGZpbGU6IGFueTtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IGFueTtcbiAgICBlbmNhcHN1bGF0aW9uOiBhbnk7XG4gICAgZXhwb3J0QXM6IGFueTtcbiAgICBob3N0OiBhbnk7XG4gICAgaW5wdXRzOiBBcnJheTxhbnk+O1xuICAgIG91dHB1dHM6IEFycmF5PGFueT47XG4gICAgcHJvdmlkZXJzOiBBcnJheTxhbnk+O1xuICAgIG1vZHVsZUlkOiBzdHJpbmc7XG4gICAgc2VsZWN0b3I6IHN0cmluZztcbiAgICBzdHlsZVVybHM6IEFycmF5PHN0cmluZz47XG4gICAgc3R5bGVVcmxzRGF0YTogc3RyaW5nO1xuICAgIHN0eWxlczogQXJyYXk8c3RyaW5nPjtcbiAgICBzdHlsZXNEYXRhOiBzdHJpbmc7XG4gICAgdGVtcGxhdGU6IHN0cmluZztcbiAgICB0ZW1wbGF0ZVVybDogQXJyYXk8c3RyaW5nPjtcbiAgICB2aWV3UHJvdmlkZXJzOiBBcnJheTxhbnk+O1xuICAgIGlucHV0c0NsYXNzOiBBcnJheTxhbnk+O1xuICAgIG91dHB1dHNDbGFzczogQXJyYXk8YW55PjtcbiAgICBwcm9wZXJ0aWVzQ2xhc3M6IEFycmF5PGFueT47XG4gICAgbWV0aG9kc0NsYXNzOiBBcnJheTxhbnk+O1xuXG4gICAgZGVwcmVjYXRlZDogYm9vbGVhbjtcbiAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IHN0cmluZztcblxuICAgIHN0YW5kYWxvbmU6IGJvb2xlYW47XG4gICAgaW1wb3J0czogQXJyYXk8YW55PjtcblxuICAgIGVudHJ5Q29tcG9uZW50czogQXJyYXk8YW55PjtcblxuICAgIGhvc3RCaW5kaW5nczogQXJyYXk8YW55PjtcbiAgICBob3N0RGlyZWN0aXZlczogQXJyYXk8YW55PjtcbiAgICBob3N0TGlzdGVuZXJzOiBBcnJheTxhbnk+O1xuXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICByYXdkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHNvdXJjZUNvZGU6IHN0cmluZztcbiAgICBleGFtcGxlVXJsczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yT2JqPzogT2JqZWN0O1xuICAgIGpzZG9jdGFncz86IEFycmF5PHN0cmluZz47XG4gICAgZXh0ZW5kcz86IGFueTtcbiAgICBpbXBsZW1lbnRzPzogYW55O1xuICAgIGFjY2Vzc29ycz86IE9iamVjdDtcblxuICAgIHRhZz86IHN0cmluZztcbiAgICBzdHlsZVVybD86IHN0cmluZztcbiAgICBzaGFkb3c/OiBzdHJpbmc7XG4gICAgc2NvcGVkPzogc3RyaW5nO1xuICAgIGFzc2V0c0Rpcj86IHN0cmluZztcbiAgICBhc3NldHNEaXJzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM/OiBhbnk7XG59XG4iLCJpbXBvcnQgeyBJRGVwIH0gZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5leHBvcnQgY2xhc3MgQ29udHJvbGxlckRlcEZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyBjcmVhdGUoXG4gICAgICAgIGZpbGU6IGFueSxcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcm9wZXJ0aWVzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIElPOiBhbnlcbiAgICApOiBJQ29udHJvbGxlckRlcCB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgY29uc3QgaW5mb3M6IElDb250cm9sbGVyRGVwID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlkOiAnY29udHJvbGxlci0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgbWV0aG9kc0NsYXNzOiBJTy5tZXRob2RzLFxuICAgICAgICAgICAgdHlwZTogJ2NvbnRyb2xsZXInLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS50ZXh0LFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogSU8uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogSU8uZGVwcmVjYXRpb25NZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoKHByb3BlcnRpZXNbMF0gYXMgYW55KS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgaW5mb3MucHJlZml4ID0gKHByb3BlcnRpZXNbMF0gYXMgYW55KS50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICBpbmZvcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mb3M7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sbGVyRGVwIGV4dGVuZHMgSURlcCB7XG4gICAgZmlsZTogYW55O1xuICAgIHNvdXJjZUNvZGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJhd2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIG1ldGhvZHNDbGFzczogQXJyYXk8YW55PjtcbiAgICBkZXByZWNhdGVkOiBib29sZWFuO1xuICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogc3RyaW5nO1xuICAgIGV4dGVuZHM/OiBhbnk7XG59XG4iLCJpbXBvcnQgeyBJRGVwIH0gZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi4vLi4vLi4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlRGVwRmFjdG9yeSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBoZWxwZXI6IENvbXBvbmVudEhlbHBlcikge31cblxuICAgIHB1YmxpYyBjcmVhdGUoZmlsZTogYW55LCBzcmNGaWxlOiBhbnksIG5hbWU6IGFueSwgcHJvcHM6IGFueSwgSU86IGFueSk6IElEaXJlY3RpdmVEZXAge1xuICAgICAgICBjb25zdCBzb3VyY2VDb2RlID0gc3JjRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNvdXJjZUNvZGUpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIGNvbnN0IGRpcmVjdGl2ZURlcHM6IElEaXJlY3RpdmVEZXAgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdkaXJlY3RpdmUtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIHR5cGU6ICdkaXJlY3RpdmUnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS5nZXRUZXh0KCksXG4gICAgICAgICAgICBzZWxlY3RvcjogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U2VsZWN0b3IocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcm92aWRlcnMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgZXhwb3J0QXM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEV4cG9ydEFzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGhvc3REaXJlY3RpdmVzOiBbLi4udGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50SG9zdERpcmVjdGl2ZXMocHJvcHMpXSxcblxuICAgICAgICAgICAgc3RhbmRhbG9uZTogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3RhbmRhbG9uZShwcm9wcywgc3JjRmlsZSkgPyB0cnVlIDogZmFsc2UsXG5cbiAgICAgICAgICAgIGlucHV0c0NsYXNzOiBJTy5pbnB1dHMsXG4gICAgICAgICAgICBvdXRwdXRzQ2xhc3M6IElPLm91dHB1dHMsXG5cbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcblxuICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBJTy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBJTy5ob3N0TGlzdGVuZXJzLFxuXG4gICAgICAgICAgICBwcm9wZXJ0aWVzQ2xhc3M6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBtZXRob2RzQ2xhc3M6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICBleGFtcGxlVXJsczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50RXhhbXBsZVVybHMoc3JjRmlsZS5nZXRUZXh0KCkpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLm1ldGhvZHNDbGFzcyA9IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyhkaXJlY3RpdmVEZXBzLm1ldGhvZHNDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmpzZG9jdGFncyAmJiBJTy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGlyZWN0aXZlRGVwcy5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uZXh0ZW5kcykge1xuICAgICAgICAgICAgZGlyZWN0aXZlRGVwcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaW1wbGVtZW50cyAmJiBJTy5pbXBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuaW1wbGVtZW50cyA9IElPLmltcGxlbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmNvbnN0cnVjdG9yICYmICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb25zdHJ1Y3RvcnMpIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8ucHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3Qge2lucHV0U2lnbmFscywgb3V0cHV0U2lnbmFscywgcHJvcGVydGllc30gPSB0aGlzLmhlbHBlci5nZXRJbnB1dE91dHB1dFNpZ25hbHMoSU8ucHJvcGVydGllcyk7XG5cbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuaW5wdXRzQ2xhc3MgPSBkaXJlY3RpdmVEZXBzLmlucHV0c0NsYXNzLmNvbmNhdChpbnB1dFNpZ25hbHMpXG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLm91dHB1dHNDbGFzcyA9IGRpcmVjdGl2ZURlcHMub3V0cHV0c0NsYXNzLmNvbmNhdChvdXRwdXRTaWduYWxzKVxuICAgICAgICAgICAgZGlyZWN0aXZlRGVwcy5wcm9wZXJ0aWVzQ2xhc3MgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmVEZXBzO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGlyZWN0aXZlRGVwIGV4dGVuZHMgSURlcCB7XG4gICAgZmlsZTogYW55O1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcmF3ZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBzb3VyY2VDb2RlOiBzdHJpbmc7XG5cbiAgICBzZWxlY3Rvcjogc3RyaW5nO1xuICAgIHByb3ZpZGVyczogQXJyYXk8YW55PjtcbiAgICBleHBvcnRBczogc3RyaW5nO1xuXG4gICAgaW5wdXRzQ2xhc3M6IGFueTtcbiAgICBvdXRwdXRzQ2xhc3M6IGFueTtcblxuICAgIHN0YW5kYWxvbmU6IGJvb2xlYW47XG5cbiAgICBkZXByZWNhdGVkOiBib29sZWFuO1xuICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogc3RyaW5nO1xuXG4gICAgaG9zdEJpbmRpbmdzOiBhbnk7XG4gICAgaG9zdERpcmVjdGl2ZXM6IGFueTtcbiAgICBob3N0TGlzdGVuZXJzOiBhbnk7XG5cbiAgICBwcm9wZXJ0aWVzQ2xhc3M6IGFueTtcbiAgICBtZXRob2RzQ2xhc3M6IGFueTtcbiAgICBleGFtcGxlVXJsczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yT2JqPzogT2JqZWN0O1xuICAgIGpzZG9jdGFncz86IEFycmF5PHN0cmluZz47XG4gICAgaW1wbGVtZW50cz86IGFueTtcbiAgICBhY2Nlc3NvcnM/OiBPYmplY3Q7XG4gICAgZXh0ZW5kcz86IGFueTtcbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5leHBvcnQgY2xhc3MgSnNEb2NIZWxwZXIge1xuICAgIHB1YmxpYyBoYXNKU0RvY0ludGVybmFsVGFnKFxuICAgICAgICBmaWxlbmFtZTogc3RyaW5nLFxuICAgICAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgICAgICBub2RlOiB0cy5Ob2RlXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlRmlsZS5zdGF0ZW1lbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tTdGF0ZW1lbnRzKHNvdXJjZUZpbGUuc3RhdGVtZW50cywgbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1N0YXRlbWVudHMoc3RhdGVtZW50czogUmVhZG9ubHlBcnJheTx0cy5TdGF0ZW1lbnQ+LCBub2RlOiB0cy5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzdGF0ZW1lbnRzLnNvbWUoeCA9PiB0aGlzLmNoZWNrU3RhdGVtZW50KHgsIG5vZGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrU3RhdGVtZW50KHN0YXRlbWVudDogdHMuU3RhdGVtZW50LCBub2RlOiB0cy5Ob2RlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgaWYgKG5vZGUuanNEb2MgJiYgbm9kZS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tKc0RvY3Mobm9kZS5qc0RvYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0pzRG9jcyhqc0RvY3M6IFJlYWRvbmx5QXJyYXk8dHMuSlNEb2M+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBqc0RvY3NcbiAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4LnRhZ3MgJiYgeC50YWdzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAuc29tZSh4ID0+IHRoaXMuY2hlY2tKc0RvY1RhZ3MoeC50YWdzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0pzRG9jVGFncyh0YWdzOiBSZWFkb25seUFycmF5PHRzLkpTRG9jVGFnPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGFncy5zb21lKHggPT4geC50YWdOYW1lICYmIHgudGFnTmFtZS50ZXh0ID09PSAnaW50ZXJuYWwnKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBTeW1ib2xIZWxwZXIsIElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IH0gZnJvbSAnLi9zeW1ib2wtaGVscGVyJztcbmltcG9ydCB7IENvbXBvbmVudENhY2hlIH0gZnJvbSAnLi9jb21wb25lbnQtaGVscGVyJztcbmltcG9ydCB7IERlcHMgfSBmcm9tICcuLi8uLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGNsYXNzIE1vZHVsZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2FjaGU6IENvbXBvbmVudENhY2hlLFxuICAgICAgICBwcml2YXRlIHN5bWJvbEhlbHBlcjogU3ltYm9sSGVscGVyID0gbmV3IFN5bWJvbEhlbHBlcigpXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGdldE1vZHVsZVByb3ZpZGVycyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlclxuICAgICAgICAgICAgLmdldFN5bWJvbERlcHMocHJvcHMsICdwcm92aWRlcnMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChwcm92aWRlck5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIocHJvdmlkZXJOYW1lLCBzcmNGaWxlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUNvbnRyb2xsZXJzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2NvbnRyb2xsZXJzJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAocHJvdmlkZXJOYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKHByb3ZpZGVyTmFtZSwgc3JjRmlsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVEZWNsYXJhdGlvbnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBEZXBzW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2RlY2xhcmF0aW9ucycsIHNyY0ZpbGUpLm1hcChuYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBjb21wb25lbnQgPSB0aGlzLmNhY2hlLmdldChuYW1lKTtcblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lLCBzcmNGaWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUVudHJ5Q29tcG9uZW50cyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IERlcHNbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZW50cnlDb21wb25lbnRzJywgc3JjRmlsZSkubWFwKG5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbXBvbmVudCA9IHRoaXMuY2FjaGUuZ2V0KG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUsIHNyY0ZpbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFuSW1wb3J0Rm9yUm9vdEZvckNoaWxkKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBuc01vZHVsZSA9IG5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgaWYgKG5zTW9kdWxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5hbWUgPSBuc01vZHVsZVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlSW1wb3J0cyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlclxuICAgICAgICAgICAgLmdldFN5bWJvbERlcHMocHJvcHMsICdpbXBvcnRzJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLmNsZWFuSW1wb3J0Rm9yUm9vdEZvckNoaWxkKG5hbWUpKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlRXhwb3J0cyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlclxuICAgICAgICAgICAgLmdldFN5bWJvbERlcHMocHJvcHMsICdleHBvcnRzJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lLCBzcmNGaWxlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUltcG9ydHNSYXcoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHNSYXcocHJvcHMsICdpbXBvcnRzJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUlkKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgbGV0IF9pZCA9IHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdpZCcsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgaWQ7XG4gICAgICAgIGlmIChfaWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZCA9IF9pZFswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZVNjaGVtYXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApIHtcbiAgICAgICAgbGV0IHNjaGVtYXMgPSB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc2NoZW1hcycsIHNyY0ZpbGUpO1xuICAgICAgICByZXR1cm4gc2NoZW1hcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlQm9vdHN0cmFwKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2Jvb3RzdHJhcCcsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSwgc3JjRmlsZSkpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5pbXBvcnQgeyBJRGVwIH0gZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgTW9kdWxlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL21vZHVsZS1oZWxwZXInO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIE1vZHVsZURlcEZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kdWxlSGVscGVyOiBNb2R1bGVIZWxwZXIpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlKFxuICAgICAgICBmaWxlOiBhbnksXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydGllczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBJTzogYW55XG4gICAgKTogSU1vZHVsZURlcCB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ21vZHVsZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgbmdpZDogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlSWQocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBwcm92aWRlcnM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZVByb3ZpZGVycyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uczogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlRGVjbGFyYXRpb25zKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgY29udHJvbGxlcnM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUNvbnRyb2xsZXJzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVFbnRyeUNvbXBvbmVudHMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBpbXBvcnRzOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVJbXBvcnRzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgZXhwb3J0czogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlRXhwb3J0cyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHNjaGVtYXM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZVNjaGVtYXMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBib290c3RyYXA6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUJvb3RzdHJhcChwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgbWV0aG9kczogSU8ubWV0aG9kcyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBJTy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUudGV4dCxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZVxuICAgICAgICB9IGFzIElNb2R1bGVEZXA7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNb2R1bGVEZXAgZXh0ZW5kcyBJRGVwIHtcbiAgICBmaWxlOiBhbnk7XG4gICAgcHJvdmlkZXJzOiBBcnJheTxhbnk+O1xuICAgIGRlY2xhcmF0aW9uczogQXJyYXk8YW55PjtcbiAgICBjb250cm9sbGVyczogQXJyYXk8YW55PjtcbiAgICBlbnRyeUNvbXBvbmVudHM6IEFycmF5PGFueT47XG4gICAgaW1wb3J0czogQXJyYXk8YW55PjtcbiAgICBleHBvcnRzOiBBcnJheTxhbnk+O1xuICAgIGJvb3RzdHJhcDogYW55O1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcmF3ZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBzb3VyY2VDb2RlOiBzdHJpbmc7XG4gICAgbWV0aG9kczogYW55O1xufVxuIiwiaW1wb3J0IHsgSURlcCB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIEVudGl0eURlcEZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyBjcmVhdGUoXG4gICAgICAgIGZpbGU6IGFueSxcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcm9wZXJ0aWVzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIElPOiBhbnlcbiAgICApOiBJRW50aXR5RGVwIHtcbiAgICAgICAgY29uc3Qgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzb3VyY2VDb2RlKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBjb25zdCBpbmZvczogSUVudGl0eURlcCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ2NvbnRyb2xsZXItJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIHR5cGU6ICdlbnRpdHknLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS50ZXh0LFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogSU8uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogSU8uZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgcHJvcGVydGllczogSU8ucHJvcGVydGllc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaW5mb3M7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnRpdHlEZXAgZXh0ZW5kcyBJRGVwIHtcbiAgICBmaWxlOiBhbnk7XG4gICAgc291cmNlQ29kZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcmF3ZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBkZXByZWNhdGVkOiBib29sZWFuO1xuICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogc3RyaW5nO1xuICAgIHByb3BlcnRpZXM6IEFycmF5PGFueT47XG59XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBQcm9qZWN0LCB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IHsgSXNLaW5kVHlwZSwga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzLCBtYXJrZWR0YWdzLCBtZXJnZVRhZ3NBbmRBcmdzIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IENvbXBvbmVudHNUcmVlRW5naW5lIGZyb20gJy4uL2VuZ2luZXMvY29tcG9uZW50cy10cmVlLmVuZ2luZSc7XG5cbmltcG9ydCB7IEZyYW1ld29ya0RlcGVuZGVuY2llcyB9IGZyb20gJy4vZnJhbWV3b3JrLWRlcGVuZGVuY2llcyc7XG5cbmltcG9ydCBJbXBvcnRzVXRpbCBmcm9tICcuLi8uLi91dGlscy9pbXBvcnRzLnV0aWwnO1xuXG5pbXBvcnQge1xuICAgIGdldE1vZHVsZVdpdGhQcm92aWRlcnMsXG4gICAgaXNJZ25vcmUsXG4gICAgaXNNb2R1bGVXaXRoUHJvdmlkZXJzLFxuICAgIEpzZG9jUGFyc2VyVXRpbFxufSBmcm9tICcuLi8uLi91dGlscyc7XG5cbmltcG9ydCBFeHRlbmRzTWVyZ2VyIGZyb20gJy4uLy4uL3V0aWxzL2V4dGVuZHMtbWVyZ2VyLnV0aWwnO1xuXG5pbXBvcnQgUm91dGVyUGFyc2VyVXRpbCBmcm9tICcuLi8uLi91dGlscy9yb3V0ZXItcGFyc2VyLnV0aWwnO1xuXG5pbXBvcnQgeyBDb2RlR2VuZXJhdG9yIH0gZnJvbSAnLi9hbmd1bGFyL2NvZGUtZ2VuZXJhdG9yJztcblxuaW1wb3J0IHsgQ29tcG9uZW50RGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2NvbXBvbmVudC1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBDb250cm9sbGVyRGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2NvbnRyb2xsZXItZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgRGlyZWN0aXZlRGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2RpcmVjdGl2ZS1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBDb21wb25lbnRDYWNoZSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBKc0RvY0hlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvanMtZG9jLWhlbHBlcic7XG5pbXBvcnQgeyBNb2R1bGVIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL21vZHVsZS1oZWxwZXInO1xuaW1wb3J0IHsgU3ltYm9sSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9zeW1ib2wtaGVscGVyJztcbmltcG9ydCB7IE1vZHVsZURlcEZhY3RvcnkgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9tb2R1bGUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgRW50aXR5RGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2VudGl0eS1kZXAuZmFjdG9yeSc7XG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5pbXBvcnQge1xuICAgIElEZXAsXG4gICAgSUVudW1EZWNEZXAsXG4gICAgSUZ1bmN0aW9uRGVjRGVwLFxuICAgIElJbmplY3RhYmxlRGVwLFxuICAgIElJbnRlcmZhY2VEZXAsXG4gICAgSVBpcGVEZXAsXG4gICAgSVR5cGVBbGlhc0RlY0RlcFxufSBmcm9tICcuL2FuZ3VsYXIvZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGdldE5vZGVEZWNvcmF0b3JzLCBub2RlSGFzRGVjb3JhdG9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvbm9kZS51dGlsJztcbmltcG9ydCB7IG1hcmtlZEFjbCB9IGZyb20gJy4uLy4uL3V0aWxzL21hcmtlZC5hY2wnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgpO1xuXG4vLyBUeXBlU2NyaXB0IHJlZmVyZW5jZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21hc3Rlci9saWIvdHlwZXNjcmlwdC5kLnRzXG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFyRGVwZW5kZW5jaWVzIGV4dGVuZHMgRnJhbWV3b3JrRGVwZW5kZW5jaWVzIHtcbiAgICBwcml2YXRlIGVuZ2luZTogYW55O1xuICAgIHByaXZhdGUgY2FjaGU6IENvbXBvbmVudENhY2hlID0gbmV3IENvbXBvbmVudENhY2hlKCk7XG4gICAgcHJpdmF0ZSBtb2R1bGVIZWxwZXIgPSBuZXcgTW9kdWxlSGVscGVyKHRoaXMuY2FjaGUpO1xuICAgIHByaXZhdGUganNEb2NIZWxwZXIgPSBuZXcgSnNEb2NIZWxwZXIoKTtcbiAgICBwcml2YXRlIHN5bWJvbEhlbHBlciA9IG5ldyBTeW1ib2xIZWxwZXIoKTtcbiAgICBwcml2YXRlIGpzZG9jUGFyc2VyVXRpbCA9IG5ldyBKc2RvY1BhcnNlclV0aWwoKTtcbiAgICBwcml2YXRlIGFsbG93ZWRTeW1ib2xzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHByaXZhdGUgYWxsb3dlZEZpbGVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3RydWN0b3IoZmlsZXM6IHN0cmluZ1tdLCBvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgc3VwZXIoZmlsZXMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVQdWJsaWNBcGlGaWx0ZXJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHB1YmxpYyBBUEkgZmlsdGVyaW5nIGlmIGVuYWJsZWRcbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXRpYWxpemVQdWJsaWNBcGlGaWx0ZXJpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnB1YmxpY0FwaU9ubHkgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wdWJsaWNBcGlFeHBvcnRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnUHVibGljIEFQSSBmaWx0ZXJpbmcgZW5hYmxlZCcpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBCdWlsZCBzZXQgb2YgYWxsb3dlZCBzeW1ib2xzIGFuZCBmaWxlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBbc3ltYm9sTmFtZSwgc291cmNlRmlsZXNdIG9mIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucHVibGljQXBpRXhwb3J0cykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dlZFN5bWJvbHMuYWRkKHN5bWJvbE5hbWUpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBzb3VyY2VGaWxlcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbG93ZWRGaWxlcy5hZGQocGF0aC5yZXNvbHZlKHNvdXJjZUZpbGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBBbGxvd2VkICR7dGhpcy5hbGxvd2VkU3ltYm9scy5zaXplfSBwdWJsaWMgQVBJIHN5bWJvbChzKSBmcm9tICR7dGhpcy5hbGxvd2VkRmlsZXMuc2l6ZX0gZmlsZShzKWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBzeW1ib2wgaXMgcGFydCBvZiB0aGUgcHVibGljIEFQSVxuICAgICAqL1xuICAgIHByaXZhdGUgaXNTeW1ib2xBbGxvd2VkKHN5bWJvbE5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBJZiBwdWJsaWMgQVBJIGZpbHRlcmluZyBpcyBub3QgZW5hYmxlZCwgYWxsb3cgYWxsIHN5bWJvbHNcbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLnB1YmxpY0FwaU9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gc3ltYm9scyBhcmUgZGVmaW5lZCwgYWxsb3cgYWxsIChmYWxsYmFjaylcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dlZFN5bWJvbHMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZEZpbGVOYW1lID0gcGF0aC5yZXNvbHZlKGZpbGVOYW1lKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgYWxsb3dlZFxuICAgICAgICBpZiAodGhpcy5hbGxvd2VkU3ltYm9scy5oYXMoc3ltYm9sTmFtZSkpIHtcbiAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgc3ltYm9sIGlzIGZyb20gYW4gYWxsb3dlZCBmaWxlXG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkU291cmNlRmlsZXMgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLnB1YmxpY0FwaUV4cG9ydHMuZ2V0KHN5bWJvbE5hbWUpO1xuICAgICAgICAgICAgaWYgKGFsbG93ZWRTb3VyY2VGaWxlcyAmJiBhbGxvd2VkU291cmNlRmlsZXMuaGFzKHJlc29sdmVkRmlsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZGVwZW5kZW5jaWVzIG9mIGFuIGFsbG93ZWQgc3ltYm9sIHNob3VsZCBiZSBpbmNsdWRlZFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNEZXBlbmRlbmN5T2ZBbGxvd2VkU3ltYm9sKHN5bWJvbE5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBJZiBwdWJsaWMgQVBJIGZpbHRlcmluZyBpcyBub3QgZW5hYmxlZCwgYWxsb3cgYWxsXG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wdWJsaWNBcGlPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGNvbnRhaW5zIGFueSBhbGxvd2VkIHN5bWJvbHNcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRGaWxlTmFtZSA9IHBhdGgucmVzb2x2ZShmaWxlTmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFsbG93ZWRGaWxlcy5oYXMocmVzb2x2ZWRGaWxlTmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlcGVuZGVuY2llcygpIHtcbiAgICAgICAgbGV0IGRlcHMgPSB7XG4gICAgICAgICAgICBhbGlhc2VzOiB7fSxcbiAgICAgICAgICAgIG1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgbW9kdWxlc0ZvckdyYXBoOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICAgICAgY29udHJvbGxlcnM6IFtdLFxuICAgICAgICAgICAgZW50aXRpZXM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJjZXB0b3JzOiBbXSxcbiAgICAgICAgICAgIGd1YXJkczogW10sXG4gICAgICAgICAgICBwaXBlczogW10sXG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICAgICAgICAgIHJvdXRlczogW10sXG4gICAgICAgICAgICBjbGFzc2VzOiBbXSxcbiAgICAgICAgICAgIGludGVyZmFjZXM6IFtdLFxuICAgICAgICAgICAgdHlwZXNjcmlwdEltcG9ydHM6IFtdLFxuICAgICAgICAgICAgbWlzY2VsbGFuZW91czoge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogW10sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25zOiBbXSxcbiAgICAgICAgICAgICAgICB0eXBlYWxpYXNlczogW10sXG4gICAgICAgICAgICAgICAgZW51bWVyYXRpb25zOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJvdXRlc1RyZWU6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gdGhpcy5wcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkgfHwgW107XG5cbiAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5zY2FubmVkRmlsZXMgPSBzb3VyY2VGaWxlcztcblxuICAgICAgICBzb3VyY2VGaWxlcy5tYXAoKGZpbGU6IHRzLlNvdXJjZUZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5maWxlTmFtZTtcblxuICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPT09ICcudHMnIHx8IHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPT09ICcudHN4Jykge1xuICAgICAgICAgICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFySlNQcm9qZWN0ICYmIHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPT09ICcuanMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdwYXJzaW5nJywgZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNvdXJjZUZpbGVEZWNvcmF0b3JzKGZpbGUsIGRlcHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoLmxhc3RJbmRleE9mKCcuZC50cycpID09PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGgubGFzdEluZGV4T2YoJ3NwZWMudHMnKSA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygncGFyc2luZycsIGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VHlwZXNjcmlwdEV4cG9ydHNBbGlhc2VzKGZpbGUsIGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUeXBlc2NyaXB0SW1wb3J0c0FsaWFzZXMoZmlsZSwgZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNvdXJjZUZpbGVEZWNvcmF0b3JzKGZpbGUsIGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGVwcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW5kIG9mIGZpbGUgc2Nhbm5pbmdcbiAgICAgICAgLy8gVHJ5IG1lcmdpbmcgaW5zaWRlIHRoZSBzYW1lIGZpbGUgZGVjbGFyYXRlZCB2YXJpYWJsZXMgJiBtb2R1bGVzIHdpdGggaW1wb3J0cyB8IGV4cG9ydHMgfCBkZWNsYXJhdGlvbnMgfCBwcm92aWRlcnNcblxuICAgICAgICBpZiAoZGVwcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXBzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLmZvckVhY2goX3ZhcmlhYmxlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VmFyID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBsaW5rIC4uLlZBUiB0byBWQVIgdmFsdWVzLCByZWN1cnNpdmVseVxuICAgICAgICAgICAgICAgICgoX3ZhciwgX25ld1ZhcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXRUeXBlIHByIHJlY29uc3RydWlyZS4uLi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHNNYXRjaGVyID0gdmFyaWFiZWxUb1JlcGxhY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmVsVG9SZXBsYWNlLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmVsVG9SZXBsYWNlLmluaXRpYWxpemVyLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJlbFRvUmVwbGFjZS5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJlbFRvUmVwbGFjZS5pbml0aWFsaXplci5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdCB2YWx1ZSAtPiBLaW5kIDc5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5raW5kID09PSBTeW50YXhLaW5kLklkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFyLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5zeW1ib2xIZWxwZXIuZ2V0VHlwZShlbGVtZW50LnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBfdmFyaWFibGUgaXMgQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiAyMDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaGFzIFNwcmVhZEVsZW1lbnRzIGluIGhpcyBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQua2luZCA9PT0gU3ludGF4S2luZC5TcHJlYWRFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGRlcHMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9PT0gZWxlbWVudC5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50c01hdGNoZXIoZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzTWF0Y2hlcihfdmFyKTtcbiAgICAgICAgICAgICAgICB9KShfdmFyaWFibGUsIG5ld1Zhcik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvbkxpbmsgPSBtb2QgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzID0gKGluaXRpYWxBcnJheSwgX3ZhcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4VG9DbGVhbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmRWYXJpYWJsZUluQXJyYXkgPSAoZWwsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLm5hbWUgPT09IF92YXIubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFRvQ2xlYW4gPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQXJyYXkuZm9yRWFjaChmaW5kVmFyaWFibGVJbkFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIGluZGV4ZXMgdG8gcmVwbGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEFycmF5LnNwbGljZShpbmRleFRvQ2xlYW4sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB2YXJpYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Zhci5mb3JFYWNoKG5ld0VsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBfLmZpbmQoaW5pdGlhbEFycmF5LCB7IG5hbWU6IG5ld0VsZS5uYW1lIH0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQXJyYXkucHVzaChuZXdFbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLmltcG9ydHMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLmV4cG9ydHMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLmNvbnRyb2xsZXJzLCBfdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5kZWNsYXJhdGlvbnMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLnByb3ZpZGVycywgX3ZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgZGVwcy5tb2R1bGVzLmZvckVhY2gob25MaW5rKTtcbiAgICAgICAgICAgICAgICBkZXBzLm1vZHVsZXNGb3JHcmFwaC5mb3JFYWNoKG9uTGluayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBvbmUgdGhpbmcgZXh0ZW5kcyBhbm90aGVyLCBtZXJnZSB0aGVtLCBvbmx5IGZvciBpbnRlcm5hbCBzb3VyY2VzXG4gICAgICAgICAqIC0gY2xhc3Nlc1xuICAgICAgICAgKiAtIGNvbXBvbmVudHNcbiAgICAgICAgICogLSBpbmplY3RhYmxlc1xuICAgICAgICAgKiAtIGRpcmVjdGl2ZXNcbiAgICAgICAgICogZm9yXG4gICAgICAgICAqIC0gaW5wdXRzXG4gICAgICAgICAqIC0gb3V0cHV0c1xuICAgICAgICAgKiAtIHByb3BlcnRpZXNcbiAgICAgICAgICogLSBtZXRob2RzXG4gICAgICAgICAqL1xuICAgICAgICBkZXBzID0gRXh0ZW5kc01lcmdlci5tZXJnZShkZXBzKTtcblxuICAgICAgICAvLyBSb3V0ZXJQYXJzZXJVdGlsLnByaW50TW9kdWxlc1JvdXRlcygpO1xuICAgICAgICAvLyBSb3V0ZXJQYXJzZXJVdGlsLnByaW50Um91dGVzKCk7XG5cbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5saW5rTW9kdWxlc0FuZFJvdXRlcygpO1xuICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5jb25zdHJ1Y3RNb2R1bGVzVHJlZSgpO1xuXG4gICAgICAgICAgICBkZXBzLnJvdXRlc1RyZWUgPSBSb3V0ZXJQYXJzZXJVdGlsLmNvbnN0cnVjdFJvdXRlc1RyZWUoKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlcHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHksIGFzdEZpbGUpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0U3ltYm9sZU5hbWUobm9kZSk7XG4gICAgICAgIGNvbnN0IElPID0gdGhpcy5nZXRDbGFzc0lPKGZpbGUsIHNyY0ZpbGUsIG5vZGUsIGZpbGVCb2R5LCBhc3RGaWxlKTtcbiAgICAgICAgY29uc3Qgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzb3VyY2VDb2RlKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBjb25zdCBkZXBzOiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdjbGFzcy0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogSU8uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogSU8uZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgdHlwZTogJ2NsYXNzJyxcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgIH07XG4gICAgICAgIGxldCBleGNsdWRlRnJvbUNsYXNzQXJyYXkgPSBmYWxzZTtcblxuICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IgJiYgIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvbnN0cnVjdG9ycykge1xuICAgICAgICAgICAgZGVwcy5jb25zdHJ1Y3Rvck9iaiA9IElPLmNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGRlcHMuaW5wdXRzQ2xhc3MgPSBJTy5pbnB1dHMgPz8gW107XG4gICAgICAgIGRlcHMub3V0cHV0c0NsYXNzID0gSU8ub3V0cHV0cyA/PyBbXTtcbiAgICAgICAgaWYgKElPLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHtpbnB1dFNpZ25hbHMsIG91dHB1dFNpZ25hbHMsIHByb3BlcnRpZXN9ID0gdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0SW5wdXRPdXRwdXRTaWduYWxzKElPLnByb3BlcnRpZXMpO1xuXG4gICAgICAgICAgICBkZXBzLmlucHV0c0NsYXNzID0gZGVwcy5pbnB1dHNDbGFzcy5jb25jYXQoaW5wdXRTaWduYWxzKVxuICAgICAgICAgICAgZGVwcy5vdXRwdXRzQ2xhc3MgPSBkZXBzLm91dHB1dHNDbGFzcy5jb25jYXQob3V0cHV0U2lnbmFscylcbiAgICAgICAgICAgIGRlcHMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBkZXBzLmRlc2NyaXB0aW9uID0gSU8uZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLnJhd2Rlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBkZXBzLnJhd2Rlc2NyaXB0aW9uID0gSU8ucmF3ZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLm1ldGhvZHMpIHtcbiAgICAgICAgICAgIGRlcHMubWV0aG9kcyA9IElPLm1ldGhvZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmluZGV4U2lnbmF0dXJlcykge1xuICAgICAgICAgICAgZGVwcy5pbmRleFNpZ25hdHVyZXMgPSBJTy5pbmRleFNpZ25hdHVyZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmV4dGVuZHMpIHtcbiAgICAgICAgICAgIGRlcHMuZXh0ZW5kcyA9IElPLmV4dGVuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmpzZG9jdGFncyAmJiBJTy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGVwcy5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICBkZXBzLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChJTy5ob3N0QmluZGluZ3MpIHtcbiAgICAgICAgICAgIGRlcHMuaG9zdEJpbmRpbmdzID0gSU8uaG9zdEJpbmRpbmdzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5ob3N0TGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBkZXBzLmhvc3RMaXN0ZW5lcnMgPSBJTy5ob3N0TGlzdGVuZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgZGVwcy5tZXRob2RzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKGRlcHMubWV0aG9kcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmltcGxlbWVudHMgJiYgSU8uaW1wbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXBzLmltcGxlbWVudHMgPSBJTy5pbXBsZW1lbnRzO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0d1YXJkKElPLmltcGxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgR3VhcmQgdG8gc2hvdyB1cCBpbiB0aGUgQ2xhc3NlcyBtZW51XG4gICAgICAgICAgICAgICAgZXhjbHVkZUZyb21DbGFzc0FycmF5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZXBzLnR5cGUgPSAnZ3VhcmQnO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5ndWFyZHMucHVzaChkZXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoZGVwcyk7XG5cbiAgICAgICAgICAgIGlmICghZXhjbHVkZUZyb21DbGFzc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5jbGFzc2VzLnB1c2goZGVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlnbm9yZShkZXBzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VHlwZXNjcmlwdEltcG9ydHNBbGlhc2VzKGluaXRpYWxTcmNGaWxlOiB0cy5Tb3VyY2VGaWxlLCBvdXRwdXRTeW1ib2xzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYXN0RmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgcHJvamVjdC5nZXRTb3VyY2VGaWxlKGluaXRpYWxTcmNGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IHByb2plY3QuZ2V0U291cmNlRmlsZShpbml0aWFsU3JjRmlsZS5maWxlTmFtZSlcbiAgICAgICAgICAgICAgICA6IHByb2plY3QuYWRkU291cmNlRmlsZUF0UGF0aChpbml0aWFsU3JjRmlsZS5maWxlTmFtZSk7XG5cbiAgICAgICAgaWYgKGFzdEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydERlY2xhcmF0aW9ucyA9IGFzdEZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG4gICAgICAgICAgICBpZiAoaW1wb3J0RGVjbGFyYXRpb25zICYmIGltcG9ydERlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb25zLmZvckVhY2goaW1wb3J0RGVjbGFyYXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lZEltcG9ydHMgPSBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lZEltcG9ydHMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVkSW1wb3J0cyAmJiBuYW1lZEltcG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJbXBvcnRzLmZvckVhY2gobmFtZWRJbXBvcnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydC5nZXRBbGlhc05vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3ltYm9scy5hbGlhc2VzLmhhc093blByb3BlcnR5KG5hbWVkSW1wb3J0LmdldE5hbWUoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuYWxpYXNlc1tuYW1lZEltcG9ydC5nZXROYW1lKCldLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJbXBvcnQuZ2V0QWxpYXNOb2RlKCkuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5hbGlhc2VzW25hbWVkSW1wb3J0LmdldE5hbWUoKV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJbXBvcnQuZ2V0QWxpYXNOb2RlKCkuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VHlwZXNjcmlwdEV4cG9ydHNBbGlhc2VzKGluaXRpYWxTcmNGaWxlOiB0cy5Tb3VyY2VGaWxlLCBvdXRwdXRTeW1ib2xzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYXN0RmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgcHJvamVjdC5nZXRTb3VyY2VGaWxlKGluaXRpYWxTcmNGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IHByb2plY3QuZ2V0U291cmNlRmlsZShpbml0aWFsU3JjRmlsZS5maWxlTmFtZSlcbiAgICAgICAgICAgICAgICA6IHByb2plY3QuYWRkU291cmNlRmlsZUF0UGF0aChpbml0aWFsU3JjRmlsZS5maWxlTmFtZSk7XG5cbiAgICAgICAgaWYgKGFzdEZpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cG9ydERlY2xhcmF0aW9ucyA9IGFzdEZpbGUuZ2V0RXhwb3J0RGVjbGFyYXRpb25zKCk7XG4gICAgICAgICAgICBpZiAoZXhwb3J0RGVjbGFyYXRpb25zICYmIGV4cG9ydERlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb25zLmZvckVhY2goZXhwb3J0RGVjbGFyYXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNOYW1lZEV4cG9ydHMgPSBleHBvcnREZWNsYXJhdGlvbi5oYXNOYW1lZEV4cG9ydHMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc05hbWVkRXhwb3J0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZWRFeHBvcnRzID0gZXhwb3J0RGVjbGFyYXRpb24uZ2V0TmFtZWRFeHBvcnRzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZWRFeHBvcnRzICYmIG5hbWVkRXhwb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRFeHBvcnRzLmZvckVhY2gobmFtZWRFeHBvcnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZWRFeHBvcnQuZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmFsaWFzZXMuaGFzT3duUHJvcGVydHkobmFtZWRFeHBvcnQuZ2V0TmFtZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5hbGlhc2VzW25hbWVkRXhwb3J0LmdldE5hbWUoKV0ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRFeHBvcnQuZ2V0QWxpYXNOb2RlKCkuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5hbGlhc2VzW25hbWVkRXhwb3J0LmdldE5hbWUoKV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkRXhwb3J0LmdldEFsaWFzTm9kZSgpLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTb3VyY2VGaWxlRGVjb3JhdG9ycyhpbml0aWFsU3JjRmlsZTogdHMuU291cmNlRmlsZSwgb3V0cHV0U3ltYm9sczogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNsZWFuZXIgPSAocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUucmVwbGFjZShjbGVhbmVyLCAnJyk7XG4gICAgICAgIGxldCBzY2FubmVkRmlsZSA9IGluaXRpYWxTcmNGaWxlO1xuXG4gICAgICAgIC8vIFNlYXJjaCBpbiBmaWxlIGZvciB2YXJpYWJsZSBzdGF0ZW1lbnQgYXMgcm91dGVzIGRlZmluaXRpb25zXG5cbiAgICAgICAgY29uc3QgYXN0RmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgcHJvamVjdC5nZXRTb3VyY2VGaWxlKGluaXRpYWxTcmNGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IHByb2plY3QuZ2V0U291cmNlRmlsZShpbml0aWFsU3JjRmlsZS5maWxlTmFtZSlcbiAgICAgICAgICAgICAgICA6IHByb2plY3QuYWRkU291cmNlRmlsZUF0UGF0aChpbml0aWFsU3JjRmlsZS5maWxlTmFtZSk7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVSb3V0ZXNTdGF0ZW1lbnRzID0gYXN0RmlsZS5nZXRWYXJpYWJsZVN0YXRlbWVudHMoKTtcbiAgICAgICAgbGV0IGhhc1JvdXRlc1N0YXRlbWVudHMgPSBmYWxzZTtcblxuICAgICAgICBpZiAodmFyaWFibGVSb3V0ZXNTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIENsZWFuIGZpbGUgZm9yIHNwcmVhZCBhbmQgZHluYW1pY3MgaW5zaWRlIHJvdXRlcyBkZWZpbml0aW9uc1xuICAgICAgICAgICAgdmFyaWFibGVSb3V0ZXNTdGF0ZW1lbnRzLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFyaWFibGVEZWNsYXJhdGlvbnMgPSBzLmdldERlY2xhcmF0aW9ucygpO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSB2YXJpYWJsZURlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uc1tpXS5jb21waWxlck5vZGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25zW2ldLmNvbXBpbGVyTm9kZS50eXBlLnR5cGVOYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbnNbaV0uY29tcGlsZXJOb2RlLnR5cGUudHlwZU5hbWUudGV4dCA9PT0gJ1JvdXRlcydcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JvdXRlc1N0YXRlbWVudHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNSb3V0ZXNTdGF0ZW1lbnRzICYmICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gZmlsZSBmb3Igc3ByZWFkIGFuZCBkeW5hbWljcyBpbnNpZGUgcm91dGVzIGRlZmluaXRpb25zXG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnQW5hbHlzaW5nIHJvdXRlcyBkZWZpbml0aW9ucyBhbmQgY2xlYW4gdGhlbSBpZiBuZWNlc3NhcnknKTtcblxuICAgICAgICAgICAgLy8gc2Nhbm5lZEZpbGUgPSBSb3V0ZXJQYXJzZXJVdGlsLmNsZWFuRmlsZUlkZW50aWZpZXJzKGFzdEZpbGUpLmNvbXBpbGVyTm9kZTtcbiAgICAgICAgICAgIFJvdXRlclBhcnNlclV0aWwuY2xlYW5GaWxlU3ByZWFkcyhhc3RGaWxlKTtcblxuICAgICAgICAgICAgYXN0RmlsZSA9IFJvdXRlclBhcnNlclV0aWwuY2xlYW5DYWxsRXhwcmVzc2lvbnMoYXN0RmlsZSk7XG4gICAgICAgICAgICBzY2FubmVkRmlsZSA9IFJvdXRlclBhcnNlclV0aWwuY2xlYW5GaWxlRHluYW1pY3MoYXN0RmlsZSkuY29tcGlsZXJOb2RlO1xuXG4gICAgICAgICAgICBzY2FubmVkRmlsZS5raW5kID0gU3ludGF4S2luZC5Tb3VyY2VGaWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHMuZm9yRWFjaENoaWxkKHNjYW5uZWRGaWxlLCAoaW5pdGlhbE5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmpzRG9jSGVscGVyLmhhc0pTRG9jSW50ZXJuYWxUYWcoZmlsZU5hbWUsIHNjYW5uZWRGaWxlLCBpbml0aWFsTm9kZSkgJiZcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVJbnRlcm5hbFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyc2VOb2RlID0gKGZpbGUsIHNyY0ZpbGUsIG5vZGUsIGZpbGVCb2R5LCBhc3RGaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNvdXJjZUNvZGUpLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZUhhc0RlY29yYXRvcihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2xhc3NXaXRoQ3VzdG9tRGVjb3JhdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEZWNvcmF0b3JzID0gZ2V0Tm9kZURlY29yYXRvcnMobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0RGVjb3JhdG9yID0gKHZpc2l0ZWREZWNvcmF0b3IsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVwczogSURlcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0U3ltYm9sZU5hbWUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGVjb3JhdGVkIGNsYXNzIGlzIGFsbG93ZWQgYnkgcHVibGljIEFQSSBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1N5bWJvbEFsbG93ZWQobmFtZSwgZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFNraXBwaW5nIGRlY29yYXRlZCBjbGFzcyAke25hbWV9IChub3QgaW4gcHVibGljIEFQSSlgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5maW5kUHJvcGVydGllcyh2aXNpdGVkRGVjb3JhdG9yLCBzcmNGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElPID0gdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SU8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUJvZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0RmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2R1bGUodmlzaXRlZERlY29yYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVEZXAgPSBuZXcgTW9kdWxlRGVwRmFjdG9yeSh0aGlzLm1vZHVsZUhlbHBlcikuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSb3V0ZXJQYXJzZXJVdGlsLmhhc1JvdXRlck1vZHVsZUluSW1wb3J0cyhtb2R1bGVEZXAuaW1wb3J0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5hZGRNb2R1bGVXaXRoUm91dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUltcG9ydHNSYXcocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzID0gbW9kdWxlRGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmFkZE1vZHVsZShuYW1lLCBtb2R1bGVEZXAuaW1wb3J0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubW9kdWxlcy5wdXNoKG1vZHVsZURlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubW9kdWxlc0ZvckdyYXBoLnB1c2gobW9kdWxlRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb21wb25lbnQodmlzaXRlZERlY29yYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50RGVwID0gbmV3IENvbXBvbmVudERlcEZhY3RvcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SGVscGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5jcmVhdGUoZmlsZSwgc3JjRmlsZSwgbmFtZSwgcHJvcHMsIElPKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzID0gY29tcG9uZW50RGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRzVHJlZUVuZ2luZS5hZGRDb21wb25lbnQoY29tcG9uZW50RGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50RGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb250cm9sbGVyKHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbGxlckRlcCA9IG5ldyBDb250cm9sbGVyRGVwRmFjdG9yeSgpLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzID0gY29udHJvbGxlckRlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5jb250cm9sbGVycy5wdXNoKGNvbnRyb2xsZXJEZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0VudGl0eSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudGl0eURlcCA9IG5ldyBFbnRpdHlEZXBGYWN0b3J5KCkuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMgPSBlbnRpdHlEZXA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5lbnRpdGllcy5wdXNoKGVudGl0eURlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSW5qZWN0YWJsZSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluamVjdGFibGVEZXBzOiBJSW5qZWN0YWJsZURlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdpbmplY3RhYmxlLScgKyBuYW1lICsgJy0nICsgaGFzaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogSU8ucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogSU8ubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogSU8uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBJTy5kZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBJTy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZVVybHM6IHRoaXMuY29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEV4YW1wbGVVcmxzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRmlsZS5nZXRUZXh0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmNvbnN0cnVjdG9yICYmICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb25zdHJ1Y3RvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmpzZG9jdGFncyAmJiBJTy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmFjY2Vzc29ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy5hY2Nlc3NvcnMgPSBJTy5hY2Nlc3NvcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLmV4dGVuZHMgPSBJTy5leHRlbmRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMubWV0aG9kcyA9IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLm1ldGhvZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGluamVjdGFibGVEZXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhJTy5pbXBsZW1lbnRzLCAnSHR0cEludGVyY2VwdG9yJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLnR5cGUgPSAnaW50ZXJjZXB0b3InO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5pbnRlcmNlcHRvcnMucHVzaChpbmplY3RhYmxlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0d1YXJkKElPLmltcGxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy50eXBlID0gJ2d1YXJkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuZ3VhcmRzLnB1c2goaW5qZWN0YWJsZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMudHlwZSA9ICdpbmplY3RhYmxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTmV3RW50aXR5SW5TdG9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmluamVjdGFibGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUGlwZSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpcGVEZXBzOiBJUGlwZURlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdwaXBlLScgKyBuYW1lICsgJy0nICsgaGFzaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3BpcGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBJTy5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogSU8ucmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYWxvbmU6IHRoaXMuY29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudFN0YW5kYWxvbmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRQdXJlKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmduYW1lOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnROYW1lKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlRGVwcy5tZXRob2RzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKHBpcGVEZXBzLm1ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVEZXBzLmpzZG9jdGFncyA9IElPLmpzZG9jdGFnc1swXS50YWdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzID0gcGlwZURlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMucGlwZXMucHVzaChwaXBlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRGlyZWN0aXZlKHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVwcyA9IG5ldyBEaXJlY3RpdmVEZXBGYWN0b3J5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEhlbHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuY3JlYXRlKGZpbGUsIHNyY0ZpbGUsIG5hbWUsIHByb3BzLCBJTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGRpcmVjdGl2ZURlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuZGlyZWN0aXZlcy5wdXNoKGRpcmVjdGl2ZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzTXVsdGlwbGVEZWNvcmF0b3JzV2l0aEludGVybmFsT25lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNJbnRlcm5hbERlY29yYXRvcihub2RlRGVjb3JhdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBhIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2xhc3NXaXRoQ3VzdG9tRGVjb3JhdG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNNdWx0aXBsZURlY29yYXRvcnNXaXRoSW50ZXJuYWxPbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NXaXRoQ3VzdG9tRGVjb3JhdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KG5hbWUsIGRlcHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlnbm9yZShkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJCeURlY29yYXRvcnMgPSBmaWx0ZXJlZE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkTm9kZS5leHByZXNzaW9uICYmIGZpbHRlcmVkTm9kZS5leHByZXNzaW9uLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgX3Rlc3QgPSAvKE5nTW9kdWxlfENvbXBvbmVudHxJbmplY3RhYmxlfFBpcGV8RGlyZWN0aXZlKS8udGVzdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWROb2RlLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV90ZXN0ICYmIHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGVzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGVzdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBub2RlRGVjb3JhdG9ycy5maWx0ZXIoZmlsdGVyQnlEZWNvcmF0b3JzKS5mb3JFYWNoKHZpc2l0RGVjb3JhdG9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuc3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnN5bWJvbC5mbGFncyA9PT0gdHMuU3ltYm9sRmxhZ3MuQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGNsYXNzIGlzIGFsbG93ZWQgYnkgcHVibGljIEFQSSBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMuZ2V0U3ltYm9sZU5hbWUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTeW1ib2xBbGxvd2VkKGNsYXNzTmFtZSwgZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFNraXBwaW5nIGNsYXNzICR7Y2xhc3NOYW1lfSAobm90IGluIHB1YmxpYyBBUEkpYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHksIGFzdEZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuc3ltYm9sLmZsYWdzID09PSB0cy5TeW1ib2xGbGFncy5JbnRlcmZhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldFN5bWJvbGVOYW1lKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpbnRlcmZhY2UgaXMgYWxsb3dlZCBieSBwdWJsaWMgQVBJIGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3ltYm9sQWxsb3dlZChuYW1lLCBmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgU2tpcHBpbmcgaW50ZXJmYWNlICR7bmFtZX0gKG5vdCBpbiBwdWJsaWMgQVBJKWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU8gPSB0aGlzLmdldEludGVyZmFjZUlPKGZpbGUsIHNyY0ZpbGUsIG5vZGUsIGZpbGVCb2R5LCBhc3RGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVyZmFjZURlcHM6IElJbnRlcmZhY2VEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2ludGVyZmFjZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBJTy5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogSU8uZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VEZXBzLnByb3BlcnRpZXMgPSBJTy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmluZGV4U2lnbmF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZURlcHMuaW5kZXhTaWduYXR1cmVzID0gSU8uaW5kZXhTaWduYXR1cmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VEZXBzLmtpbmQgPSBJTy5raW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5kZXNjcmlwdGlvbiA9IElPLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZURlcHMucmF3ZGVzY3JpcHRpb24gPSBJTy5yYXdkZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5tZXRob2RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5tZXRob2RzID0gSU8ubWV0aG9kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoaW50ZXJmYWNlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5pbnRlcmZhY2VzLnB1c2goaW50ZXJmYWNlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlKGludGVyZmFjZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mb3MgPSB0aGlzLnZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBmdW5jdGlvbiBpcyBhbGxvd2VkIGJ5IHB1YmxpYyBBUEkgZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTeW1ib2xBbGxvd2VkKG5hbWUsIGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBTa2lwcGluZyBmdW5jdGlvbiAke25hbWV9IChub3QgaW4gcHVibGljIEFQSSlgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZWQgPSBpbmZvcy5kZXByZWNhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb25NZXNzYWdlID0gaW5mb3MuZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25EZXA6IElGdW5jdGlvbkRlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25EZXAuYXJncyA9IGluZm9zLmFyZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MucmV0dXJuVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLnJldHVyblR5cGUgPSBpbmZvcy5yZXR1cm5UeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmpzZG9jdGFncyAmJiBpbmZvcy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmpzZG9jdGFncyA9IGluZm9zLmpzZG9jdGFncztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5mb3MuaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzUHJpdmF0ZUpTRG9jVGFnKGZ1bmN0aW9uRGVwLmpzZG9jdGFncykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGZ1bmN0aW9uRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9uRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNFbnVtRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm9zID0gdGhpcy52aXNpdEVudW1EZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBlbnVtIGlzIGFsbG93ZWQgYnkgcHVibGljIEFQSSBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1N5bWJvbEFsbG93ZWQobmFtZSwgZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFNraXBwaW5nIGVudW0gJHtuYW1lfSAobm90IGluIHB1YmxpYyBBUEkpYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkID0gaW5mb3MuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTWVzc2FnZSA9IGluZm9zLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW1EZXBzOiBJRW51bURlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkczogaW5mb3MubWVtYmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICdlbnVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoZW51bURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMucHVzaChlbnVtRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mb3MgPSB0aGlzLnZpc2l0VHlwZURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGluZm9zLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHR5cGUgYWxpYXMgaXMgYWxsb3dlZCBieSBwdWJsaWMgQVBJIGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3ltYm9sQWxsb3dlZChuYW1lLCBmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgU2tpcHBpbmcgdHlwZSBhbGlhcyAke25hbWV9IChub3QgaW4gcHVibGljIEFQSSlgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZWQgPSBpbmZvcy5kZXByZWNhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb25NZXNzYWdlID0gaW5mb3MuZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZUFsaWFzRGVwczogSVR5cGVBbGlhc0RlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ3R5cGVhbGlhcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3dHlwZTogdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUobm9kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFsaWFzRGVwcy5raW5kID0gbm9kZS50eXBlLmtpbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVBbGlhc0RlcHMucmF3dHlwZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFsaWFzRGVwcy5yYXd0eXBlID0gdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFsaWFzRGVwcy5raW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFsaWFzRGVwcy5raW5kID09PSBTeW50YXhLaW5kLlRlbXBsYXRlTGl0ZXJhbFR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBbGlhc0RlcHMucmF3dHlwZSA9IHNyY0ZpbGUudGV4dC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudHlwZS5wb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudHlwZS5lbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLnB1c2godHlwZUFsaWFzRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5mb3MuaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcodHlwZUFsaWFzRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNNb2R1bGVEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmJvZHkuc3RhdGVtZW50cyAmJiBub2RlLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYm9keS5zdGF0ZW1lbnRzLmZvckVhY2goc3RhdGVtZW50ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZU5vZGUoZmlsZSwgc3JjRmlsZSwgc3RhdGVtZW50LCBub2RlLmJvZHksIGFzdEZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgSU8gPSB0aGlzLmdldFJvdXRlSU8oZmlsZSwgc3JjRmlsZSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJTy5yb3V0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdSb3V0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlcyA9IFJvdXRlclBhcnNlclV0aWwuY2xlYW5SYXdSb3V0ZVBhcnNlZChJTy5yb3V0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSb3V0ZXMgcGFyc2luZyBlcnJvciwgbWF5YmUgYSB0cmFpbGluZyBjb21tYSBvciBhbiBleHRlcm5hbCB2YXJpYWJsZSwgdHJ5aW5nIHRvIGZpeCB0aGF0IGxhdGVyIGFmdGVyIHNvdXJjZXMgc2Nhbm5pbmcuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVzID0gSU8ucm91dGVzLnJlcGxhY2UoLyAvZ20sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmFkZEluY29tcGxldGVSb3V0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG5ld1JvdXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5yb3V0ZXMgPSBbLi4ub3V0cHV0U3ltYm9scy5yb3V0ZXMsIC4uLm5ld1JvdXRlc107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0V4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSkgfHwgdHMuaXNJZlN0YXRlbWVudChub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vdHN0cmFwTW9kdWxlUmVmZXJlbmNlID0gJ2Jvb3RzdHJhcE1vZHVsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSByb290IG1vZHVsZSB3aXRoIGJvb3RzdHJhcE1vZHVsZSBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBmaW5kIGEgc2ltcGxlIGNhbGwgOiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBvciBpbnNpZGUgYSBjYWxsIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIHdpdGggYSBjYXRjaCA6IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlKS5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyA0LiB3aXRoIHBhcmFtZXRlcnMgOiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSwge30pLmNhdGNoKGVycm9yID0+IGNvbnNvbGUuZXJyb3IoZXJyb3IpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgcmVjdXNpdmVseSBpbiBleHByZXNzaW9uIG5vZGVzIG9uZSB3aXRoIG5hbWUgJ2Jvb3RzdHJhcE1vZHVsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb290TW9kdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjRmlsZS50ZXh0LmluZGV4T2YoYm9vdHN0cmFwTW9kdWxlUmVmZXJlbmNlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vZGUgPSB0aGlzLmZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9ucyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib290c3RyYXBNb2R1bGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZS50aGVuU3RhdGVtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRoZW5TdGF0ZW1lbnQuc3RhdGVtZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50aGVuU3RhdGVtZW50LnN0YXRlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaXJzdFN0YXRlbWVudCA9IG5vZGUudGhlblN0YXRlbWVudC5zdGF0ZW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Tm9kZSA9IHRoaXMuZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U3RhdGVtZW50LmV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb3RzdHJhcE1vZHVsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uLmFyZ3VtZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Tm9kZSA9IHRoaXMuZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25Bcmd1bWVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5leHByZXNzaW9uLmFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9vdHN0cmFwTW9kdWxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Tm9kZS5hcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHJlc3VsdE5vZGUuYXJndW1lbnRzLCAoYXJndW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudC50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RNb2R1bGUgPSBhcmd1bWVudC50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb290TW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLnNldFJvb3RNb2R1bGUocm9vdE1vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUm91dGVzVmFyaWFibGUgPSBSb3V0ZXJQYXJzZXJVdGlsLmlzVmFyaWFibGVSb3V0ZXMobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGFsbCB2YXJpYWJsZXMsIGluY2x1ZGluZyBleHBvcnRlZCByb3V0ZXMgdmFyaWFibGVzIGZvciBtaXNjZWxsYW5lb3VzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUm91dGVzVmFyaWFibGUgfHwgdGhpcy5pc0V4cG9ydGVkVmFyaWFibGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNEZXN0cnVjdHVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBkZXN0cnVjdHVyaW5nIGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlVmFyaWFibGVEZWNsYXJhdGlvbnMgPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhcmlhYmxlRGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYXJpYWJsZURlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYXJpYWJsZURlY2xhcmF0aW9uc1swXS5uYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVmFyaWFibGVEZWNsYXJhdGlvbnNbMF0ubmFtZS5raW5kID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEtpbmQuQXJyYXlCaW5kaW5nUGF0dGVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVzdHJ1Y3R1cmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaXRWYXJpYWJsZU5vZGUgPSB2YXJpYWJsZU5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm9zOiBhbnkgPSB0aGlzLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZCA9IGluZm9zLmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTWVzc2FnZSA9IGluZm9zLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwczogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAndmFyaWFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy50eXBlID0gaW5mb3MudHlwZSA/IGluZm9zLnR5cGUgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5kZWZhdWx0VmFsdWUgPSBpbmZvcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmluaXRpYWxpemVyID0gaW5mb3MuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOb2RlLmpzRG9jICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5vZGUuanNEb2MubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOb2RlLmpzRG9jWzBdLmNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdEZXNjcmlwdGlvbiA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLnBhcnNlSlNEb2NOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTm9kZS5qc0RvY1swXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucmF3ZGVzY3JpcHRpb24gPSByYXdEZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMuZGVzY3JpcHRpb24gPSBtYXJrZWRBY2wocmF3RGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01vZHVsZVdpdGhQcm92aWRlcnModmFyaWFibGVOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGluZ0luaXRpYWxpemVyID0gZ2V0TW9kdWxlV2l0aFByb3ZpZGVycyh2YXJpYWJsZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5hZGRNb2R1bGVXaXRoUm91dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRpbmdJbml0aWFsaXplcl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlclBhcnNlclV0aWwuYWRkTW9kdWxlKG5hbWUsIFtyb3V0aW5nSW5pdGlhbGl6ZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKHZhcmlhYmxlTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhcmlhYmxlIGlzIGFsbG93ZWQgYnkgcHVibGljIEFQSSBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1N5bWJvbEFsbG93ZWQobmFtZSwgZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFNraXBwaW5nIHZhcmlhYmxlICR7bmFtZX0gKG5vdCBpbiBwdWJsaWMgQVBJKWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLnB1c2goZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZXN0cnVjdHVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhcmlhYmxlRGVjbGFyYXRpb25zWzBdLm5hbWUuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdHJ1Y3R1cmVkVmFyaWFibGVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYXJpYWJsZURlY2xhcmF0aW9uc1swXS5uYW1lLmVsZW1lbnRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzdHJ1Y3R1cmVkVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0cnVjdHVyZWRWYXJpYWJsZSA9IGRlc3RydWN0dXJlZFZhcmlhYmxlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZXN0cnVjdHVyZWRWYXJpYWJsZS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXN0cnVjdHVyZWRWYXJpYWJsZS5uYW1lLmVzY2FwZWRUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHM6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ3ZhcmlhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYXJpYWJsZURlY2xhcmF0aW9uc1swXS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFyaWFibGVEZWNsYXJhdGlvbnNbMF0uaW5pdGlhbGl6ZXIuZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5pbml0aWFsaXplciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlVmFyaWFibGVEZWNsYXJhdGlvbnNbMF0uaW5pdGlhbGl6ZXIuZWxlbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMuZGVmYXVsdFZhbHVlID0gZGVwcy5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhc3NIZWxwZXIuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShkZXN0cnVjdHVyZWRWYXJpYWJsZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdmFyaWFibGUgaXMgYWxsb3dlZCBieSBwdWJsaWMgQVBJIGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1N5bWJvbEFsbG93ZWQobmFtZSwgZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBTa2lwcGluZyBkZXN0cnVjdHVyZWQgdmFyaWFibGUgJHtuYW1lfSAobm90IGluIHB1YmxpYyBBUEkpYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMucHVzaChkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRWYXJpYWJsZU5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IC8vIEVuZCBvZiBuZXcgaWYgY29uZGl0aW9uIGZvciBpc1JvdXRlc1ZhcmlhYmxlIHx8IGlzRXhwb3J0ZWRWYXJpYWJsZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvcyA9IHRoaXMudmlzaXRUeXBlRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZWQgPSBpbmZvcy5kZXByZWNhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb25NZXNzYWdlID0gaW5mb3MuZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwczogSVR5cGVBbGlhc0RlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ3R5cGVhbGlhcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3dHlwZTogdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUobm9kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5raW5kID0gbm9kZS50eXBlLmtpbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5raW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5raW5kID09PSBTeW50YXhLaW5kLlRlbXBsYXRlTGl0ZXJhbFR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucmF3dHlwZSA9IHNyY0ZpbGUudGV4dC5zdWJzdHJpbmcobm9kZS50eXBlLnBvcywgbm9kZS50eXBlLmVuZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMucHVzaChkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvcyA9IHRoaXMudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGluZm9zLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkID0gaW5mb3MuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTWVzc2FnZSA9IGluZm9zLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uRGVwOiBJRnVuY3Rpb25EZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmFyZ3MgPSBpbmZvcy5hcmdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLnJldHVyblR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkRlcC5yZXR1cm5UeXBlID0gaW5mb3MucmV0dXJuVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvcy5qc2RvY3RhZ3MgJiYgaW5mb3MuanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkRlcC5qc2RvY3RhZ3MgPSBpbmZvcy5qc2RvY3RhZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluZm9zLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1ByaXZhdGVKU0RvY1RhZyhmdW5jdGlvbkRlcC5qc2RvY3RhZ3MpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhmdW5jdGlvbkRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMucHVzaChmdW5jdGlvbkRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0VudW1EZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mb3MgPSB0aGlzLnZpc2l0RW51bURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGluZm9zLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkID0gaW5mb3MuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTWVzc2FnZSA9IGluZm9zLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW1EZXBzOiBJRW51bURlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkczogaW5mb3MubWVtYmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICdlbnVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJZ25vcmUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGVudW1EZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLnB1c2goZW51bURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcGFyc2VOb2RlKGZpbGVOYW1lLCBzY2FubmVkRmlsZSwgaW5pdGlhbE5vZGUsIG51bGwsIGFzdEZpbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBpbiBhIHNwZWNpZmljIHN0b3JlIGFuIGVudGl0eSwgYW5kIGNoZWNrIGJlZm9yZSBpcyB0aGVyZSBpcyBub3QgdGhlIHNhbWUgb25lXG4gICAgICogaW4gdGhhdCBzdG9yZSA6IHNhbWUgbmFtZSwgaWQgYW5kIGZpbGVcbiAgICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eSB0byBzdG9yZVxuICAgICAqIEBwYXJhbSBzdG9yZSBTdG9yZVxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkTmV3RW50aXR5SW5TdG9yZShlbnRpdHksIHN0b3JlKSB7XG4gICAgICAgIGNvbnN0IGZpbmRTYW1lRW50aXR5SW5TdG9yZSA9IF8uZmlsdGVyKHN0b3JlLCB7XG4gICAgICAgICAgICBuYW1lOiBlbnRpdHkubmFtZSxcbiAgICAgICAgICAgIGlkOiBlbnRpdHkuaWQsXG4gICAgICAgICAgICBmaWxlOiBlbnRpdHkuZmlsZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZpbmRTYW1lRW50aXR5SW5TdG9yZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHN0b3JlLnB1c2goZW50aXR5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVidWcoZGVwczogSURlcCkge1xuICAgICAgICBpZiAoZGVwcykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdmb3VuZCcsIGAke2RlcHMubmFtZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBbJ2ltcG9ydHMnLCAnZXhwb3J0cycsICdkZWNsYXJhdGlvbnMnLCAncHJvdmlkZXJzJywgJ2Jvb3RzdHJhcCddLmZvckVhY2goc3ltYm9scyA9PiB7XG4gICAgICAgICAgICBpZiAoZGVwc1tzeW1ib2xzXSAmJiBkZXBzW3N5bWJvbHNdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJycsIGAtICR7c3ltYm9sc306YCk7XG4gICAgICAgICAgICAgICAgZGVwc1tzeW1ib2xzXVxuICAgICAgICAgICAgICAgICAgICAubWFwKGkgPT4gaS5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJywgYFxcdC0gJHtkfWApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpZ25vcmUoZGVwczogSURlcCkge1xuICAgICAgICBpZiAoZGVwcykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2lnbm9yZScsIGAke2RlcHMubmFtZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tGb3JEZXByZWNhdGlvbih0YWdzOiBhbnlbXSwgcmVzdWx0OiB7IFtrZXkgaW4gc3RyaW5nIHwgbnVtYmVyXTogYW55IH0pIHtcbiAgICAgICAgXy5mb3JFYWNoKHRhZ3MsIHRhZyA9PiB7XG4gICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUgJiYgdGFnLnRhZ05hbWUudGV4dCAmJiB0YWcudGFnTmFtZS50ZXh0LmluZGV4T2YoJ2RlcHJlY2F0ZWQnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlcHJlY2F0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kZXByZWNhdGlvbk1lc3NhZ2UgPSB0YWcuY29tbWVudCB8fCAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRXhwcmVzc2lvbkJ5TmFtZUluRXhwcmVzc2lvbnMoZW50cnlOb2RlLCBuYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGxvb3AgPSBmdW5jdGlvbiAobm9kZSwgeikge1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uICYmICFub2RlLmV4cHJlc3Npb24ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBsb29wKG5vZGUuZXhwcmVzc2lvbiwgeik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24gJiYgbm9kZS5leHByZXNzaW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbi5uYW1lLnRleHQgPT09IHopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wKG5vZGUuZXhwcmVzc2lvbiwgeik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxvb3AoZW50cnlOb2RlLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9uQXJndW1lbnRzKGFyZywgbmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gYXJnLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbG9vcCA9IGZ1bmN0aW9uIChub2RlLCB6KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ib2R5KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keS5zdGF0ZW1lbnRzICYmIG5vZGUuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5nID0gbm9kZS5ib2R5LnN0YXRlbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGo7IGogPCBsZW5nOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoYXQuZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25zKG5vZGUuYm9keS5zdGF0ZW1lbnRzW2pdLCB6KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGxvb3AoYXJnW2ldLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEZWNvcmF0b3JzKGRlY29yYXRvcnMsIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChkZWNvcmF0b3JzLCBmdW5jdGlvbiAoZGVjb3JhdG9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEZWNvcmF0b3IoZGVjb3JhdG9yLCB0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ29udHJvbGxlcihtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0NvbnRyb2xsZXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRW50aXR5KG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnRW50aXR5Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0NvbXBvbmVudChtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0NvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQaXBlKG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnUGlwZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEaXJlY3RpdmUobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdEaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5qZWN0YWJsZShtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0luamVjdGFibGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTW9kdWxlKG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnTmdNb2R1bGUnKSB8fCB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnTW9kdWxlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNJbnRlcm5hbERlY29yYXRvcihtZXRhZGF0YXMpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMucGFyc2VEZWNvcmF0b3JzKG1ldGFkYXRhcywgJ0NvbnRyb2xsZXInKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnQ29tcG9uZW50JykgfHxcbiAgICAgICAgICAgIHRoaXMucGFyc2VEZWNvcmF0b3JzKG1ldGFkYXRhcywgJ1BpcGUnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnRGlyZWN0aXZlJykgfHxcbiAgICAgICAgICAgIHRoaXMucGFyc2VEZWNvcmF0b3JzKG1ldGFkYXRhcywgJ0luamVjdGFibGUnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnTmdNb2R1bGUnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnTW9kdWxlJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzR3VhcmQoaW9JbXBsZW1lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgXy5pbmNsdWRlcyhpb0ltcGxlbWVudHMsICdDYW5BY3RpdmF0ZScpIHx8XG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkFjdGl2YXRlQ2hpbGQnKSB8fFxuICAgICAgICAgICAgXy5pbmNsdWRlcyhpb0ltcGxlbWVudHMsICdDYW5EZWFjdGl2YXRlJykgfHxcbiAgICAgICAgICAgIF8uaW5jbHVkZXMoaW9JbXBsZW1lbnRzLCAnUmVzb2x2ZScpIHx8XG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkxvYWQnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3ltYm9sZU5hbWUobm9kZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBub2RlLm5hbWUudGV4dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRQcm9wZXJ0aWVzKFxuICAgICAgICB2aXNpdGVkTm9kZTogdHMuRGVjb3JhdG9yLFxuICAgICAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdmlzaXRlZE5vZGUuZXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgdmlzaXRlZE5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMgJiZcbiAgICAgICAgICAgIHZpc2l0ZWROb2RlLmV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBwb3AgPSB2aXNpdGVkTm9kZS5leHByZXNzaW9uLmFyZ3VtZW50c1swXTtcblxuICAgICAgICAgICAgaWYgKHBvcCAmJiBwb3AucHJvcGVydGllcyAmJiBwb3AucHJvcGVydGllcy5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb3AucHJvcGVydGllcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9wICYmIHBvcC5raW5kICYmIHBvcC5raW5kID09PSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3BvcF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFbXB0eSBtZXRhZGF0YXMsIHRyeWluZyB0byBmaW5kIGl0IHdpdGggaW1wb3J0cy4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSW1wb3J0c1V0aWwuZmluZFZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKHBvcC50ZXh0LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQW5ndWxhckxpZmVjeWNsZUhvb2sobWV0aG9kTmFtZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBBTkdVTEFSX0xJRkVDWUNMRV9NRVRIT0RTID0gW1xuICAgICAgICAgICAgJ25nT25Jbml0JyxcbiAgICAgICAgICAgICduZ09uQ2hhbmdlcycsXG4gICAgICAgICAgICAnbmdEb0NoZWNrJyxcbiAgICAgICAgICAgICduZ09uRGVzdHJveScsXG4gICAgICAgICAgICAnbmdBZnRlckNvbnRlbnRJbml0JyxcbiAgICAgICAgICAgICduZ0FmdGVyQ29udGVudENoZWNrZWQnLFxuICAgICAgICAgICAgJ25nQWZ0ZXJWaWV3SW5pdCcsXG4gICAgICAgICAgICAnbmdBZnRlclZpZXdDaGVja2VkJyxcbiAgICAgICAgICAgICd3cml0ZVZhbHVlJyxcbiAgICAgICAgICAgICdyZWdpc3Rlck9uQ2hhbmdlJyxcbiAgICAgICAgICAgICdyZWdpc3Rlck9uVG91Y2hlZCcsXG4gICAgICAgICAgICAnc2V0RGlzYWJsZWRTdGF0ZSdcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIEFOR1VMQVJfTElGRUNZQ0xFX01FVEhPRFMuaW5kZXhPZihtZXRob2ROYW1lKSA+PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRUeXBlRGVjbGFyYXRpb24obm9kZTogdHMuVHlwZUFsaWFzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJycsXG4gICAgICAgICAgICBuYW1lOiBub2RlLm5hbWUudGV4dCxcbiAgICAgICAgICAgIGtpbmQ6IG5vZGUua2luZFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Mobm9kZSk7XG5cbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRBcmd1bWVudChhcmcpIHtcbiAgICAgICAgaWYgKGFyZy5uYW1lICYmIGFyZy5uYW1lLmtpbmQgPT0gU3ludGF4S2luZC5PYmplY3RCaW5kaW5nUGF0dGVybikge1xuICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgZGVzdHJ1Y3VyZWRHcm91cElkID0gdXVpZHY0KCk7XG5cbiAgICAgICAgICAgIHJlc3VsdHMgPSBhcmcubmFtZS5lbGVtZW50cy5tYXAoZWxlbWVudCA9PiB0aGlzLnZpc2l0QXJndW1lbnQoZWxlbWVudCkpO1xuXG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5tYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZGVzdHJ1Y3VyZWRHcm91cElkID0gZGVzdHJ1Y3VyZWRHcm91cElkO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGFyZy5uYW1lLmVsZW1lbnRzICYmIGFyZy50eXBlICYmIGFyZy50eXBlLm1lbWJlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLm5hbWUuZWxlbWVudHMubGVuZ3RoID09PSBhcmcudHlwZS5tZW1iZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZy5uYW1lLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLnR5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShhcmcudHlwZS5tZW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFyZy5uYW1lLmVsZW1lbnRzICYmIGFyZy50eXBlICYmIGFyZy50eXBlLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c1swXS50eXBlID0gdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUoYXJnLnR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGFyZy5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUoYXJnKSxcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoYXJnLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRvdERvdERvdFRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcmcucXVlc3Rpb25Ub2tlbikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJnLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlZmF1bHRWYWx1ZSA9IGFyZy5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhc3NIZWxwZXIuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKGFyZy5pbml0aWFsaXplcilcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJnLnR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudHlwZSA9IHRoaXMubWFwVHlwZShhcmcudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLnR5cGUua2luZCA9PT0gU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRyeSByZXBsYWNlIFR5cGVSZWZlcmVuY2Ugd2l0aCB0eXBlTmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLnR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlID0gYXJnLnR5cGUudHlwZU5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhhcmcpO1xuXG4gICAgICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcFR5cGUodHlwZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLk51bGxLZXl3b3JkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuQW55S2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FueSc7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5OZXZlcktleXdvcmQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICduZXZlcic7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuTnVtYmVyS2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuVHlwZVJlZmVyZW5jZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVSZWZlcmVuY2UnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNQcml2YXRlSlNEb2NUYWcodGFncyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGlmICh0YWdzKSB7XG4gICAgICAgICAgICB0YWdzLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUgJiYgdGFnLnRhZ05hbWUudGV4dCAmJiB0YWcudGFnTmFtZS50ZXh0ID09PSAncHJpdmF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKG1ldGhvZDogdHMuRnVuY3Rpb25EZWNsYXJhdGlvbikge1xuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gbWV0aG9kLm5hbWUgPyBtZXRob2QubmFtZS50ZXh0IDogJ1VubmFtZWQgZnVuY3Rpb24nO1xuICAgICAgICBjb25zdCByZXN1bHRBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJycsXG4gICAgICAgICAgICBuYW1lOiBtZXRob2ROYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRob2QucGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXJndW1lbnQgPSBtZXRob2QucGFyYW1ldGVyc1tpXTtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3VtZW50UGFyc2VkID0gdGhpcy52aXNpdEFyZ3VtZW50KGFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRQYXJzZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFyZ3VtZW50UGFyc2VkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmd1bWVudFBhcnNlZEluc2lkZSA9IGFyZ3VtZW50UGFyc2VkW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRQYXJzZWRJbnNpZGUuZGVzdHJ1Y3R1cmVkUGFyYW1ldGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEFyZ3VtZW50cy5wdXNoKGFyZ3VtZW50UGFyc2VkSW5zaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdEFyZ3VtZW50cy5wdXNoKGFyZ3VtZW50UGFyc2VkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQuYXJncyA9IHJlc3VsdEFyZ3VtZW50cztcblxuICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MobWV0aG9kKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC50eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVzdWx0LnJldHVyblR5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShtZXRob2QudHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycykge1xuICAgICAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBraW5kcyA9IG1ldGhvZC5tb2RpZmllcnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChtb2RpZmllciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIHJlc3VsdCk7XG4gICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICBfLmZvckVhY2goanNkb2N0YWdzWzBdLnRhZ3MsIHRhZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUudGV4dC5pbmRleE9mKCdpZ25vcmUnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmlnbm9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmpzZG9jdGFncyAmJiByZXN1bHQuanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzLCByZXN1bHQuanNkb2N0YWdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWVyZ2VUYWdzQW5kQXJncyhyZXN1bHQuYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdCAmJiBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0ubmFtZS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmNsYXNzSGVscGVyLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplclxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0uaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmluaXRpYWxpemVyID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS50eXBlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0LnR5cGUgPT09ICd1bmRlZmluZWQnICYmIHJlc3VsdC5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudHlwZSA9IGtpbmRUb1R5cGUocmVzdWx0LmluaXRpYWxpemVyLmtpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MoXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChub2RlLmpzRG9jKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmpzRG9jWzBdLmNvbW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd0Rlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VKU0RvY05vZGUobm9kZS5qc0RvY1swXSk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbWFya2VkQWNsKHJhd0Rlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRFbnVtRGVjbGFyYXRpb24obm9kZTogdHMuRW51bURlY2xhcmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnLFxuICAgICAgICAgICAgbmFtZTogbm9kZS5uYW1lLnRleHQsXG4gICAgICAgICAgICBtZW1iZXJzOiBbXVxuICAgICAgICB9O1xuICAgICAgICBpZiAobm9kZS5tZW1iZXJzKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gbm9kZS5tZW1iZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBtZW1iZXJqc2RvY3RhZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVtYmVyOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGUubWVtYmVyc1tpXS5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5tZW1iZXJzW2ldLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbml0aWFsaXplciBraW5kIGlzIGEgbnVtYmVyIGRvIGNhc3QgdG8gdGhlIG51bWJlciB0eXBlXG4gICAgICAgICAgICAgICAgICAgIG1lbWJlci52YWx1ZSA9IElzS2luZFR5cGUuTlVNQkVSKG5vZGUubWVtYmVyc1tpXS5pbml0aWFsaXplci5raW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBOdW1iZXIobm9kZS5tZW1iZXJzW2ldLmluaXRpYWxpemVyLnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5vZGUubWVtYmVyc1tpXS5pbml0aWFsaXplci50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZW1iZXJqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Mobm9kZS5tZW1iZXJzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAobWVtYmVyanNkb2N0YWdzICYmIG1lbWJlcmpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBtZW1iZXJqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24obWVtYmVyanNkb2N0YWdzWzBdLnRhZ3MsIG1lbWJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5tZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Mobm9kZSk7XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0RW51bURlY2xhcmF0aW9uRm9yUm91dGVzKGZpbGVOYW1lLCBub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZXNJbml0aWFsaXplciA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IENvZGVHZW5lcmF0b3IoKS5nZW5lcmF0ZShyb3V0ZXNJbml0aWFsaXplcik7XG4gICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5hZGRSb3V0ZSh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFJvdXRlclBhcnNlclV0aWwuY2xlYW5SYXdSb3V0ZShkYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVOYW1lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzOiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJvdXRlSU8oZmlsZW5hbWU6IHN0cmluZywgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgbm9kZTogdHMuTm9kZSkge1xuICAgICAgICBsZXQgcmVzO1xuICAgICAgICBpZiAoc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgICAgICAgICByZXMgPSBzb3VyY2VGaWxlLnN0YXRlbWVudHMucmVkdWNlKChkaXJlY3RpdmUsIHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChSb3V0ZXJQYXJzZXJVdGlsLmlzVmFyaWFibGVSb3V0ZXMoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50LnBvcyA9PT0gbm9kZS5wb3MgJiYgc3RhdGVtZW50LmVuZCA9PT0gbm9kZS5lbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmUuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaXRFbnVtRGVjbGFyYXRpb25Gb3JSb3V0ZXMoZmlsZW5hbWUsIHN0YXRlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgICAgICAgICAgfSwgW10pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc1swXSB8fCB7fTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q2xhc3NJTyhcbiAgICAgICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbm9kZTogdHMuTm9kZSxcbiAgICAgICAgZmlsZUJvZHksXG4gICAgICAgIGFzdEZpbGVcbiAgICApIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcmVkdWNlZFNvdXJjZSA9IGZpbGVCb2R5ID8gZmlsZUJvZHkuc3RhdGVtZW50cyA6IHNvdXJjZUZpbGUuc3RhdGVtZW50cztcbiAgICAgICAgY29uc3QgcmVzID0gcmVkdWNlZFNvdXJjZS5yZWR1Y2UoKGRpcmVjdGl2ZSwgc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodHMuaXNDbGFzc0RlY2xhcmF0aW9uKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGVtZW50LnBvcyA9PT0gbm9kZS5wb3MgJiYgc3RhdGVtZW50LmVuZCA9PT0gbm9kZS5lbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsYXNzSGVscGVyLnZpc2l0Q2xhc3NEZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3RGaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc1swXSB8fCB7fTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEludGVyZmFjZUlPKGZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZUZpbGUsIG5vZGUsIGZpbGVCb2R5LCBhc3RGaWxlKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJlZHVjZWRTb3VyY2UgPSBmaWxlQm9keSA/IGZpbGVCb2R5LnN0YXRlbWVudHMgOiBzb3VyY2VGaWxlLnN0YXRlbWVudHM7XG4gICAgICAgIGNvbnN0IHJlcyA9IHJlZHVjZWRTb3VyY2UucmVkdWNlKChkaXJlY3RpdmUsIHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRzLmlzSW50ZXJmYWNlRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdEZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICByZXR1cm4gcmVzWzBdIHx8IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgdmFyaWFibGUgc3RhdGVtZW50IGlzIGV4cG9ydGVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0V4cG9ydGVkVmFyaWFibGUobm9kZTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIGhhcyBleHBvcnQgbW9kaWZpZXJzXG4gICAgICAgIHJldHVybiAhIShub2RlLm1vZGlmaWVycyAmJiBub2RlLm1vZGlmaWVycy5zb21lKG1vZGlmaWVyID0+IFxuICAgICAgICAgICAgbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkXG4gICAgICAgICkpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENvbXBvbmVudENhY2hlIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9jb21wb25lbnQtaGVscGVyJztcbmltcG9ydCB7IEpzRG9jSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9qcy1kb2MtaGVscGVyJztcbmltcG9ydCB7IE1vZHVsZUhlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvbW9kdWxlLWhlbHBlcic7XG5pbXBvcnQgeyBTeW1ib2xIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL3N5bWJvbC1oZWxwZXInO1xuaW1wb3J0IHsgRnJhbWV3b3JrRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi9mcmFtZXdvcmstZGVwZW5kZW5jaWVzJztcblxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJKU0RlcGVuZGVuY2llcyBleHRlbmRzIEZyYW1ld29ya0RlcGVuZGVuY2llcyB7XG4gICAgcHJpdmF0ZSBlbmdpbmU6IGFueTtcbiAgICBwcml2YXRlIGNhY2hlOiBDb21wb25lbnRDYWNoZSA9IG5ldyBDb21wb25lbnRDYWNoZSgpO1xuICAgIHByaXZhdGUgbW9kdWxlSGVscGVyID0gbmV3IE1vZHVsZUhlbHBlcih0aGlzLmNhY2hlKTtcbiAgICBwcml2YXRlIGpzRG9jSGVscGVyID0gbmV3IEpzRG9jSGVscGVyKCk7XG4gICAgcHJpdmF0ZSBzeW1ib2xIZWxwZXIgPSBuZXcgU3ltYm9sSGVscGVyKCk7XG5cbiAgICBjb25zdHJ1Y3RvcihmaWxlczogc3RyaW5nW10sIG9wdGlvbnM6IGFueSkge1xuICAgICAgICBzdXBlcihmaWxlcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlcGVuZGVuY2llcygpIHtcbiAgICAgICAgbGV0IGRlcHMgPSB7XG4gICAgICAgICAgICBtb2R1bGVzOiBbXSxcbiAgICAgICAgICAgIG1vZHVsZXNGb3JHcmFwaDogW10sXG4gICAgICAgICAgICBjb21wb25lbnRzOiBbXSxcbiAgICAgICAgICAgIGluamVjdGFibGVzOiBbXSxcbiAgICAgICAgICAgIGludGVyY2VwdG9yczogW10sXG4gICAgICAgICAgICBwaXBlczogW10sXG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICAgICAgICAgIHJvdXRlczogW10sXG4gICAgICAgICAgICBjbGFzc2VzOiBbXSxcbiAgICAgICAgICAgIGludGVyZmFjZXM6IFtdLFxuICAgICAgICAgICAgbWlzY2VsbGFuZW91czoge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogW10sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25zOiBbXSxcbiAgICAgICAgICAgICAgICB0eXBlYWxpYXNlczogW10sXG4gICAgICAgICAgICAgICAgZW51bWVyYXRpb25zOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJvdXRlc1RyZWU6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGVwcztcbiAgICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJvbWlzZVNlcXVlbnRpYWwocHJvbWlzZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvbWlzZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgbmVlZCB0byBiZSBhbiBhcnJheSBvZiBQcm9taXNlcycpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGxldCByZXN1bHRzID0gW107XG5cbiAgICAgICAgY29uc3QgaXRlcmF0ZWVGdW5jID0gKHByZXZpb3VzUHJvbWlzZSwgY3VycmVudFByb21pc2UpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2VcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50KysgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50UHJvbWlzZShyZXN1bHQsIHJlc3VsdHMsIGNvdW50KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcHJvbWlzZXMgPSBwcm9taXNlcy5jb25jYXQoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpO1xuXG4gICAgICAgIHByb21pc2VzLnJlZHVjZShpdGVyYXRlZUZ1bmMsIFByb21pc2UucmVzb2x2ZShmYWxzZSkpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgTGl2ZVNlcnZlciBmcm9tICdAY29tcG9kb2MvbGl2ZS1zZXJ2ZXInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuY29uc3QgY2hva2lkYXIgPSByZXF1aXJlKCdjaG9raWRhcicpO1xuXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ25lb3RyYXZlcnNlL2xlZ2FjeScpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCBiYWJlbCA9IHJlcXVpcmUoJ0BiYWJlbC9jb3JlJyk7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4vY29uZmlndXJhdGlvbic7XG5cbmltcG9ydCBEZXBlbmRlbmNpZXNFbmdpbmUgZnJvbSAnLi9lbmdpbmVzL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuaW1wb3J0IEV4cG9ydEVuZ2luZSBmcm9tICcuL2VuZ2luZXMvZXhwb3J0LmVuZ2luZSc7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2VuZ2luZXMvZmlsZS5lbmdpbmUnO1xuaW1wb3J0IEh0bWxFbmdpbmUgZnJvbSAnLi9lbmdpbmVzL2h0bWwuZW5naW5lJztcbmltcG9ydCBJMThuRW5naW5lIGZyb20gJy4vZW5naW5lcy9pMThuLmVuZ2luZSc7XG5pbXBvcnQgTWFya2Rvd25FbmdpbmUsIHsgbWFya2Rvd25SZWFkZWREYXRhcyB9IGZyb20gJy4vZW5naW5lcy9tYXJrZG93bi5lbmdpbmUnO1xuaW1wb3J0IE5nZEVuZ2luZSBmcm9tICcuL2VuZ2luZXMvbmdkLmVuZ2luZSc7XG5pbXBvcnQgU2VhcmNoRW5naW5lIGZyb20gJy4vZW5naW5lcy9zZWFyY2guZW5naW5lJztcblxuaW1wb3J0IHsgQW5ndWxhckRlcGVuZGVuY2llcyB9IGZyb20gJy4vY29tcGlsZXIvYW5ndWxhci1kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgQW5ndWxhckpTRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi9jb21waWxlci9hbmd1bGFyanMtZGVwZW5kZW5jaWVzJztcblxuaW1wb3J0IEFuZ3VsYXJWZXJzaW9uVXRpbCBmcm9tICcuLi91dGlscy9hbmd1bGFyLXZlcnNpb24udXRpbCc7XG5pbXBvcnQgeyBDT01QT0RPQ19DT05TVEFOVFMgfSBmcm9tICcuLi91dGlscy9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ09NUE9ET0NfREVGQVVMVFMgfSBmcm9tICcuLi91dGlscy9kZWZhdWx0cyc7XG5pbXBvcnQgeyBwcm9taXNlU2VxdWVudGlhbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2Utc2VxdWVudGlhbCc7XG5pbXBvcnQgUm91dGVyUGFyc2VyVXRpbCBmcm9tICcuLi91dGlscy9yb3V0ZXItcGFyc2VyLnV0aWwnO1xuXG5pbXBvcnQge1xuICAgIGNsZWFuTmFtZVdpdGhvdXRTcGFjZUFuZFRvTG93ZXJDYXNlLFxuICAgIGNsZWFuU291cmNlc0ZvcldhdGNoLFxuICAgIGZpbmRNYWluU291cmNlRm9sZGVyXG59IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHsgQWRkaXRpb25hbE5vZGUgfSBmcm9tICcuL2ludGVyZmFjZXMvYWRkaXRpb25hbC1ub2RlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb3ZlcmFnZURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvY292ZXJhZ2VEYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaXZlU2VydmVyQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9saXZlLXNlcnZlci1jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBtYXJrZWRBY2wgfSBmcm9tICcuLi91dGlscy9tYXJrZWQuYWNsJztcbmltcG9ydCB7IElDb21wb25lbnREZXAgfSBmcm9tICcuL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb21wb25lbnQtZGVwLmZhY3RvcnknO1xuXG5jb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xubGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5sZXQgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlO1xubGV0IGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0O1xuY29uc3QgZ2VuZXJhdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCA9IHJlamVjdDtcbn0pO1xuXG5leHBvcnQgY2xhc3MgQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEZpbGVzIHByb2Nlc3NlZCBkdXJpbmcgaW5pdGlhbCBzY2FubmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBmaWxlczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBGaWxlcyBwcm9jZXNzZWQgZHVyaW5nIHdhdGNoIHNjYW5uaW5nXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZWRGaWxlczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBGaWxlcyBjaGFuZ2VkIGR1cmluZyB3YXRjaCBzY2FubmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaENoYW5nZWRGaWxlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZm9yIHdhdGNoaW5nIHN0YXR1c1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1dhdGNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBwYWNrYWdlLmpzb24gZGF0YVxuICAgICAqL1xuICAgIHByaXZhdGUgcGFja2FnZUpzb25EYXRhID0ge307XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgY29tcG9kb2MgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3B0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICAgICAgZm9yIChsZXQgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgQ29uZmlndXJhdGlvbi5tYWluRGF0YVtvcHRpb25dICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGFbb3B0aW9uXSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvciBkb2N1bWVudGF0aW9uTWFpbk5hbWUsIHByb2Nlc3MgaXQgb3V0c2lkZSB0aGUgbG9vcCwgZm9yIGhhbmRsaW5nIGNvbmZsaWN0IHdpdGggcGFnZXMgbmFtZVxuICAgICAgICAgICAgaWYgKG9wdGlvbiA9PT0gJ25hbWUnKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3IgZG9jdW1lbnRhdGlvbk1haW5OYW1lLCBwcm9jZXNzIGl0IG91dHNpZGUgdGhlIGxvb3AsIGZvciBoYW5kbGluZyBjb25mbGljdCB3aXRoIHBhZ2VzIG5hbWVcbiAgICAgICAgICAgIGlmIChvcHRpb24gPT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgY29tcG9kb2MgcHJvY2Vzc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZW5lcmF0ZSgpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMudW5oYW5kbGVkUmVqZWN0aW9uTGlzdGVuZXIpO1xuICAgICAgICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMudW5jYXVnaHRFeGNlcHRpb25MaXN0ZW5lcik7XG5cbiAgICAgICAgSTE4bkVuZ2luZS5pbml0KENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubGFuZ3VhZ2UpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LmNoYXJBdChDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dC5sZW5ndGggLSAxKSAhPT0gJy8nXG4gICAgICAgICkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgKz0gJy8nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ICE9PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhY2thZ2VKc29uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBIdG1sRW5naW5lLmluaXQoQ29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMpLnRoZW4oKCkgPT4gdGhpcy5wcm9jZXNzUGFja2FnZUpzb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdlbmVyYXRpb25Qcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5kQ2FsbGJhY2soKSB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMudW5oYW5kbGVkUmVqZWN0aW9uTGlzdGVuZXIpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMudW5jYXVnaHRFeGNlcHRpb25MaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmhhbmRsZWRSZWplY3Rpb25MaXN0ZW5lcihlcnIsIHApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1VuaGFuZGxlZCBSZWplY3Rpb24gYXQ6JywgcCwgJ3JlYXNvbjonLCBlcnIpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAnU29ycnksIGJ1dCB0aGVyZSB3YXMgYSBwcm9ibGVtIGR1cmluZyBwYXJzaW5nIG9yIGdlbmVyYXRpb24gb2YgdGhlIGRvY3VtZW50YXRpb24uIFBsZWFzZSBmaWxsIGFuIGlzc3VlIG9uIGdpdGh1Yi4gKGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb2RvYy9jb21wb2RvYy9pc3N1ZXMvbmV3KSdcbiAgICAgICAgKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmNhdWdodEV4Y2VwdGlvbkxpc3RlbmVyKGVycikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgJ1NvcnJ5LCBidXQgdGhlcmUgd2FzIGEgcHJvYmxlbSBkdXJpbmcgcGFyc2luZyBvciBnZW5lcmF0aW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uLiBQbGVhc2UgZmlsbCBhbiBpc3N1ZSBvbiBnaXRodWIuIChodHRwczovL2dpdGh1Yi5jb20vY29tcG9kb2MvY29tcG9kb2MvaXNzdWVzL25ldyknXG4gICAgICAgICk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGNvbXBvZG9jIGRvY3VtZW50YXRpb24gY292ZXJhZ2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdGVzdENvdmVyYWdlKCkge1xuICAgICAgICB0aGlzLmdldERlcGVuZGVuY2llc0RhdGEoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBmaWxlcyBmb3IgaW5pdGlhbCBwcm9jZXNzaW5nXG4gICAgICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gZmlsZXMgRmlsZXMgZm91bmQgZHVyaW5nIHNvdXJjZSBmb2xkZXIgYW5kIHRzY29uZmlnIHNjYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsZXMoZmlsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5maWxlcyA9IGZpbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3JlIGZpbGVzIGZvciB3YXRjaCBwcm9jZXNzaW5nXG4gICAgICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gZmlsZXMgRmlsZXMgZm91bmQgZHVyaW5nIHNvdXJjZSBmb2xkZXIgYW5kIHRzY29uZmlnIHNjYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VXBkYXRlZEZpbGVzKGZpbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMudXBkYXRlZEZpbGVzID0gZmlsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIG9uZSBUeXBlU2NyaXB0IGZpbGUgaW4gdXBkYXRlZEZpbGVzIGxpc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXN1bHQgb2Ygc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNXYXRjaGVkRmlsZXNUU0ZpbGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgICAgXy5mb3JFYWNoKHRoaXMudXBkYXRlZEZpbGVzLCBmaWxlID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcudHMnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygb25lIHJvb3QgbWFya2Rvd24gZmlsZXMgaW4gdXBkYXRlZEZpbGVzIGxpc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXN1bHQgb2Ygc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNXYXRjaGVkRmlsZXNSb290TWFya2Rvd25GaWxlcygpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLnVwZGF0ZWRGaWxlcywgZmlsZSA9PiB7XG4gICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLm1kJyAmJiBwYXRoLmRpcm5hbWUoZmlsZSkgPT09IGN3ZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgZmlsZXMgZm9yIHdhdGNoIHByb2Nlc3NpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJVcGRhdGVkRmlsZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlZEZpbGVzID0gW107XG4gICAgICAgIHRoaXMud2F0Y2hDaGFuZ2VkRmlsZXMgPSBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NQYWNrYWdlSnNvbigpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1NlYXJjaGluZyBwYWNrYWdlLmpzb24gZmlsZScpO1xuICAgICAgICBGaWxlRW5naW5lLmdldChjd2QgKyBwYXRoLnNlcCArICdwYWNrYWdlLmpzb24nKS50aGVuKFxuICAgICAgICAgICAgcGFja2FnZURhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShwYWNrYWdlRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWNrYWdlSnNvbkRhdGEgPSBwYXJzZWREYXRhO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBhcnNlZERhdGEubmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPT09IENPTVBPRE9DX0RFRkFVTFRTLnRpdGxlXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZG9jdW1lbnRhdGlvbk1haW5OYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEubmFtZSArICcgZG9jdW1lbnRhdGlvbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkRGF0YS5kZXNjcmlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbkRlc2NyaXB0aW9uID0gcGFyc2VkRGF0YS5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyVmVyc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBbmd1bGFyVmVyc2lvbk9mUHJvamVjdChwYXJzZWREYXRhKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygncGFja2FnZS5qc29uIGZpbGUgZm91bmQnKTtcblxuICAgICAgICAgICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkRGF0YS5kZXBlbmRlbmNpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWNrYWdlRGVwZW5kZW5jaWVzKHBhcnNlZERhdGEuZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZERhdGEucGVlckRlcGVuZGVuY2llcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhY2thZ2VQZWVyRGVwZW5kZW5jaWVzKHBhcnNlZERhdGEucGVlckRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydGllc1RvQ2hlY2sgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdob21lcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnYnVncycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbGljZW5zZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAncmVwb3NpdG9yeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnYXV0aG9yJ1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzT25lT2ZDaGVja2VkUHJvcGVydGllcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVG9DaGVjay5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgaW4gcGFyc2VkRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09uZU9mQ2hlY2tlZFByb3BlcnRpZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGFja2FnZVByb3BlcnRpZXNbcHJvcF0gPSBwYXJzZWREYXRhW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc09uZU9mQ2hlY2tlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAncGFja2FnZVByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdwYWNrYWdlLXByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWFya2Rvd25zKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREZXBlbmRlbmNpZXNEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbnRpbnVpbmcgd2l0aG91dCBwYWNrYWdlLmpzb24gZmlsZScpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01hcmtkb3ducygpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGVwZW5kZW5jaWVzRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzUGFja2FnZVBlZXJEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzaW5nIHBhY2thZ2UuanNvbiBwZWVyRGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGFja2FnZVBlZXJEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7XG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5oYXNQYWdlKCdkZXBlbmRlbmNpZXMnKSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICBpZDogJ3BhY2thZ2VEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdwYWNrYWdlLWRlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NQYWNrYWdlRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcyk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyBwYWNrYWdlLmpzb24gZGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGFja2FnZURlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgIG5hbWU6ICdkZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgaWQ6ICdwYWNrYWdlRGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgIGNvbnRleHQ6ICdwYWNrYWdlLWRlcGVuZGVuY2llcycsXG4gICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWFya2Rvd25zKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgJ1NlYXJjaGluZyBSRUFETUUubWQsIENIQU5HRUxPRy5tZCwgQ09OVFJJQlVUSU5HLm1kLCBMSUNFTlNFLm1kLCBUT0RPLm1kIGZpbGVzJ1xuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBjb25zdCBtYXJrZG93bnMgPSBbJ3JlYWRtZScsICdjaGFuZ2Vsb2cnLCAnY29udHJpYnV0aW5nJywgJ2xpY2Vuc2UnLCAndG9kbyddO1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZNYXJrZG93bnMgPSA1O1xuICAgICAgICAgICAgY29uc3QgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IG51bWJlck9mTWFya2Rvd25zKSB7XG4gICAgICAgICAgICAgICAgICAgIE1hcmtkb3duRW5naW5lLmdldFRyYWRpdGlvbmFsTWFya2Rvd24obWFya2Rvd25zW2ldLnRvVXBwZXJDYXNlKCkpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVhZG1lRGF0YTogbWFya2Rvd25SZWFkZWREYXRhcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAke21hcmtkb3duc1tpXS50b1VwcGVyQ2FzZSgpfS5tZCBmaWxlIGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtkb3duc1tpXSA9PT0gJ3JlYWRtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5yZWFkbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgY3JlYXRlIGluZGV4Lmh0bWwgYXMgbWFpbiBwYWdlIHdpdGggUkVBRE1FIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAncmVhZG1lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Rvd246IHJlYWRtZURhdGEubWFya2Rvd24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByZWFkbWVEYXRhLnJhd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvdmVydmlldyBpcyBub3QgZGlzYWJsZWQsIGFsc28gY3JlYXRlIHNlcGFyYXRlIG92ZXJ2aWV3IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVPdmVydmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnb3ZlcnZpZXcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdvdmVydmlldycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdvdmVydmlldycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb3RoZXIgbWFya2Rvd24gZmlsZXMgKGNoYW5nZWxvZywgY29udHJpYnV0aW5nLCBldGMuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbWFya2Rvd25zW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogbWFya2Rvd25zW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1hcmtkb3duc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtkb3duOiByZWFkbWVEYXRhLm1hcmtkb3duLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcmVhZG1lRGF0YS5yYXdEYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1hcmtkb3ducy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hcmtkb3duc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVybmFtZTogbWFya2Rvd25zW2ldLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICkuY2F0Y2goZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBDb250aW51aW5nIHdpdGhvdXQgJHttYXJrZG93bnNbaV0udG9VcHBlckNhc2UoKX0ubWQgZmlsZWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZG93bnNbaV0gPT09ICdyZWFkbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlT3ZlcnZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnb3ZlcnZpZXcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBSRUFETUUgZG9lc24ndCBleGlzdCBhbmQgb3ZlcnZpZXcgaXMgZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSBvdmVydmlldyBwYWdlIGFueXdheSBidXQgc2hvdyB3YXJuaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignTm8gUkVBRE1FLm1kIGZvdW5kIGFuZCAtLWRpc2FibGVPdmVydmlldyBpcyBlbmFibGVkLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0dlbmVyYXRpbmcgb3ZlcnZpZXcgcGFnZSBhcyBsYW5kaW5nIHBhZ2UuIENvbnNpZGVyIGFkZGluZyBhIFJFQURNRS5tZCBmaWxlLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdvdmVydmlldycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVidWlsZFJvb3RNYXJrZG93bnMoKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgJ1JlZ2VuZXJhdGluZyBSRUFETUUubWQsIENIQU5HRUxPRy5tZCwgQ09OVFJJQlVUSU5HLm1kLCBMSUNFTlNFLm1kLCBUT0RPLm1kIHBhZ2VzJ1xuICAgICAgICApO1xuXG4gICAgICAgIGxldCBhY3Rpb25zID0gW107XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5yZXNldFJvb3RNYXJrZG93blBhZ2VzKCk7XG5cbiAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NNYXJrZG93bnMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJvbWlzZVNlcXVlbnRpYWwoYWN0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFnZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVXBkYXRlZEZpbGVzKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZGVwZW5kZW5jeSBkYXRhIGZvciBzbWFsbCBncm91cCBvZiB1cGRhdGVkIGZpbGVzIGR1cmluZyB3YXRjaCBwcm9jZXNzXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRNaWNyb0RlcGVuZGVuY2llc0RhdGEoKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdHZXQgZGlmZiBkZXBlbmRlbmNpZXMgZGF0YScpO1xuXG4gICAgICAgIGxldCBkZXBlbmRlbmNpZXNDbGFzczogQW5ndWxhckRlcGVuZGVuY2llcyB8IEFuZ3VsYXJKU0RlcGVuZGVuY2llcyA9IEFuZ3VsYXJEZXBlbmRlbmNpZXM7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclByb2plY3QgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLmRldGVjdEFuZ3VsYXJKU1Byb2plY3RzKCkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBbmd1bGFySlMgcHJvamVjdCBkZXRlY3RlZCcpO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyUHJvamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFySlNQcm9qZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llc0NsYXNzID0gQW5ndWxhckpTRGVwZW5kZW5jaWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNyYXdsZXIgPSBuZXcgZGVwZW5kZW5jaWVzQ2xhc3MoXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZWRGaWxlcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0c2NvbmZpZ0RpcmVjdG9yeTogcGF0aC5kaXJuYW1lKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgQ29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIFJvdXRlclBhcnNlclV0aWxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgZGVwZW5kZW5jaWVzRGF0YSA9IGNyYXdsZXIuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgICAgICAgRGVwZW5kZW5jaWVzRW5naW5lLnVwZGF0ZShkZXBlbmRlbmNpZXNEYXRhKTtcblxuICAgICAgICB0aGlzLnByZXBhcmVKdXN0QUZld1RoaW5ncyhkZXBlbmRlbmNpZXNEYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWJ1aWxkIGV4dGVybmFsIGRvY3VtZW50YXRpb24gZHVyaW5nIHdhdGNoIHByb2Nlc3NcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYnVpbGRFeHRlcm5hbERvY3VtZW50YXRpb24oKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZWJ1aWxkIGV4dGVybmFsIGRvY3VtZW50YXRpb24nKTtcblxuICAgICAgICBsZXQgYWN0aW9ucyA9IFtdO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24ucmVzZXRBZGRpdGlvbmFsUGFnZXMoKTtcblxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyAhPT0gJycpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUV4dGVybmFsSW5jbHVkZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZVNlcXVlbnRpYWwoYWN0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFnZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVXBkYXRlZEZpbGVzKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRldGVjdEFuZ3VsYXJKU1Byb2plY3RzKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYWNrYWdlSnNvbkRhdGEuZGVwZW5kZW5jaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhY2thZ2VKc29uRGF0YS5kZXBlbmRlbmNpZXMuYW5ndWxhciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgY291bnRKU0ZpbGVzID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcuanMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEpTRmlsZXMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBwZXJjZW50T2ZKU0ZpbGVzID0gKGNvdW50SlNGaWxlcyAqIDEwMCkgLyB0aGlzLmZpbGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAocGVyY2VudE9mSlNGaWxlcyA+PSA3NSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGVwZW5kZW5jaWVzRGF0YSgpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0dldCBkZXBlbmRlbmNpZXMgZGF0YScpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbmd1bGFySlMgZGV0ZWN0aW9uIHN0cmF0ZWd5IDpcbiAgICAgICAgICogLSBpZiBpbiBwYWNrYWdlLmpzb25cbiAgICAgICAgICogLSBpZiA3NSUgb2Ygc2Nhbm5lZCBmaWxlcyBhcmUgKi5qcyBmaWxlc1xuICAgICAgICAgKi9cbiAgICAgICAgbGV0IGRlcGVuZGVuY2llc0NsYXNzOiBBbmd1bGFyRGVwZW5kZW5jaWVzIHwgQW5ndWxhckpTRGVwZW5kZW5jaWVzID0gQW5ndWxhckRlcGVuZGVuY2llcztcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyUHJvamVjdCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuZGV0ZWN0QW5ndWxhckpTUHJvamVjdHMoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0FuZ3VsYXJKUyBwcm9qZWN0IGRldGVjdGVkJyk7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJQcm9qZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJKU1Byb2plY3QgPSB0cnVlO1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzQ2xhc3MgPSBBbmd1bGFySlNEZXBlbmRlbmNpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3Jhd2xlciA9IG5ldyBkZXBlbmRlbmNpZXNDbGFzcyhcbiAgICAgICAgICAgIHRoaXMuZmlsZXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IHBhdGguZGlybmFtZShDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGRlcGVuZGVuY2llc0RhdGEgPSBjcmF3bGVyLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5pbml0KGRlcGVuZGVuY2llc0RhdGEpO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucm91dGVzTGVuZ3RoID0gUm91dGVyUGFyc2VyVXRpbC5yb3V0ZXNMZW5ndGgoKTtcblxuICAgICAgICB0aGlzLnByaW50U3RhdGlzdGljcygpO1xuXG4gICAgICAgIHRoaXMucHJlcGFyZUV2ZXJ5dGhpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVKdXN0QUZld1RoaW5ncyhkaWZmQ3Jhd2xlZERhdGEpOiB2b2lkIHtcbiAgICAgICAgbGV0IGFjdGlvbnMgPSBbXTtcblxuICAgICAgICBDb25maWd1cmF0aW9uLnJlc2V0UGFnZXMoKTtcblxuICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlUm91dGVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZmZDcmF3bGVkRGF0YS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVDb21wb25lbnRzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUNvbnRyb2xsZXJzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUVudGl0aWVzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlTW9kdWxlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlRGlyZWN0aXZlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUluamVjdGFibGVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZmZDcmF3bGVkRGF0YS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUludGVyY2VwdG9ycygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVHdWFyZHMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVQaXBlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlQ2xhc3NlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlSW50ZXJmYWNlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGRpZmZDcmF3bGVkRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICBkaWZmQ3Jhd2xlZERhdGEubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgZGlmZkNyYXdsZWREYXRhLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgZGlmZkNyYXdsZWREYXRhLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlTWlzY2VsbGFuZW91cygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVDb3ZlcmFnZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb21pc2VTZXF1ZW50aWFsKGFjdGlvbnMpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCAhPT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdHNTdXBwb3J0ZWQuaW5kZXhPZihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdFxuICAgICAgICAgICAgICAgICAgICAgICAgKSA+IC0xXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbiBpbiBleHBvcnQgZm9ybWF0ICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXR9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9ydEVuZ2luZS5leHBvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgaW4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGluICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRFbGFwc2VkVGltZSgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgc2Vjb25kcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNlcnZpbmcgZG9jdW1lbnRhdGlvbiBmcm9tICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXR9IGF0IGh0dHA6Ly8ke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdG5hbWV9OiR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5wb3J0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5XZWJTZXJ2ZXIoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEV4cG9ydGVkIGZvcm1hdCBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NHcmFwaHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclVwZGF0ZWRGaWxlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJpbnRTdGF0aXN0aWNzKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvamVjdCBzdGF0aXN0aWNzICcpO1xuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLm1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gZmlsZXMgICAgICAgIDogJHt0aGlzLmZpbGVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLm1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gbW9kdWxlICAgICAgIDogJHtEZXBlbmRlbmNpZXNFbmdpbmUubW9kdWxlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGNvbXBvbmVudCAgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmNvbXBvbmVudHMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gY29udHJvbGxlciAgIDogJHtEZXBlbmRlbmNpZXNFbmdpbmUuY29udHJvbGxlcnMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuZW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gZW50aXR5ICAgICAgIDogJHtEZXBlbmRlbmNpZXNFbmdpbmUuZW50aXRpZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBkaXJlY3RpdmUgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5kaXJlY3RpdmVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmluamVjdGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGluamVjdGFibGUgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmluamVjdGFibGVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBpbmplY3RvciAgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmNlcHRvcnMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGd1YXJkICAgICAgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmd1YXJkcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBwaXBlICAgICAgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGNsYXNzICAgICAgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmNsYXNzZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBpbnRlcmZhY2UgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmZhY2VzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5yb3V0ZXNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSByb3V0ZSAgICAgICAgOiAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEucm91dGVzTGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSB0eXBlIGFsaWFzZXMgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZUV2ZXJ5dGhpbmcoKSB7XG4gICAgICAgIGxldCBhY3Rpb25zID0gW107XG5cbiAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb21wb25lbnRzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZU1vZHVsZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5kaXJlY3RpdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZURpcmVjdGl2ZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb250cm9sbGVycygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUVudGl0aWVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW5qZWN0YWJsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW50ZXJjZXB0b3JzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUd1YXJkcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUucm91dGVzICYmXG4gICAgICAgICAgICAhQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVSb3V0ZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVQaXBlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQ2xhc3NlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW50ZXJmYWNlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUubWlzY2VsbGFuZW91cy52YXJpYWJsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgRGVwZW5kZW5jaWVzRW5naW5lLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWlzY2VsbGFuZW91cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb3ZlcmFnZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS51bml0VGVzdENvdmVyYWdlICE9PSAnJykge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlVW5pdFRlc3RDb3ZlcmFnZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyAhPT0gJycpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUV4dGVybmFsSW5jbHVkZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZVNlcXVlbnRpYWwoYWN0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ICE9PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0c1N1cHBvcnRlZC5pbmRleE9mKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0XG4gICAgICAgICAgICAgICAgICAgICAgICApID4gLTFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgR2VuZXJhdGluZyBkb2N1bWVudGF0aW9uIGluIGV4cG9ydCBmb3JtYXQgJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdH1gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXhwb3J0RW5naW5lLmV4cG9ydChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZENhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgaW4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEVsYXBzZWRUaW1lKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBzZWNvbmRzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuc2VydmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgU2VydmluZyBkb2N1bWVudGF0aW9uIGZyb20gJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dH0gYXQgaHR0cDovLyR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0bmFtZX06JHtDb25maWd1cmF0aW9uLm1haW5EYXRhLnBvcnR9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bldlYlNlcnZlcihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgRXhwb3J0ZWQgZm9ybWF0IG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0dyYXBocygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluY2x1ZGVkUGF0aEZvckZpbGUoZmlsZSkge1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXMsIGZpbGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZUV4dGVybmFsSW5jbHVkZXMoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdBZGRpbmcgZXh0ZXJuYWwgbWFya2Rvd24gZmlsZXMnKTtcbiAgICAgICAgLy8gU2NhbiBpbmNsdWRlIGZvbGRlciBmb3IgZmlsZXMgZGV0YWlsZWQgaW4gc3VtbWFyeS5qc29uXG4gICAgICAgIC8vIEZvciBlYWNoIGZpbGUsIGFkZCB0byBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFkZGl0aW9uYWxQYWdlc1xuICAgICAgICAvLyBFYWNoIGZpbGUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gaHRtbCBwYWdlLCBpbnNpZGUgQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5UGF0aFxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgRmlsZUVuZ2luZS5nZXQodGhpcy5nZXRJbmNsdWRlZFBhdGhGb3JGaWxlKCdzdW1tYXJ5Lmpzb24nKSkudGhlbihcbiAgICAgICAgICAgICAgICBzdW1tYXJ5RGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBZGRpdGlvbmFsIGRvY3VtZW50YXRpb246IHN1bW1hcnkuanNvbiBmaWxlIGZvdW5kJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkU3VtbWFyeURhdGEgPSBKU09OLnBhcnNlKHN1bW1hcnlEYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0TGV2ZWxPbmVQYWdlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlKHBhcnNlZFN1bW1hcnlEYXRhKS5mb3JFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnZhbGlkLXRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vdFJvb3QgJiYgdHlwZW9mIHRoaXMubm9kZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW52YWxpZC10aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhd1BhdGggPSB0aGlzLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWludmFsaWQtdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRpdGlvbmFsTm9kZTogQWRkaXRpb25hbE5vZGUgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBhZGRpdGlvbmFsTm9kZS5maWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IGFkZGl0aW9uYWxOb2RlLnRpdGxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbFBhdGggPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzRm9sZGVyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsRGVwdGggPSByYXdQYXRoLmZpbHRlcihlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VJbnQoZWwsIDEwKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0aXRsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gY2xlYW5OYW1lV2l0aG91dFNwYWNlQW5kVG9Mb3dlckNhc2UodGl0bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZCBjcmVhdGVkIHdpdGggdGl0bGUgKyBmaWxlIHBhdGggaGFzaCwgc2VlbXMgdG8gYmUgaHlwb3RoZXRpY2FsbHkgdW5pcXVlIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gY3J5cHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlSGFzaCgnc2hhNTEyJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUodGl0bGUgKyBmaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWludmFsaWQtdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUuaWQgPSBpZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdEVsZW1lbnRSb290VHJlZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxEZXB0aC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50VHJlZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGxhc3RFbGVtZW50Um9vdFRyZWUgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VkU3VtbWFyeURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsYXN0RWxlbWVudFJvb3RUcmVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50VHJlZS5jaGlsZHJlbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VHJlZSA9IGVsZW1lbnRUcmVlLmNoaWxkcmVuW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRyZWUgPSBlbGVtZW50VHJlZVtlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFBhdGggKz1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuTmFtZVdpdGhvdXRTcGFjZUFuZFRvTG93ZXJDYXNlKGVsZW1lbnRUcmVlLnRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50Um9vdFRyZWUgPSBlbGVtZW50VHJlZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQYXRoID0gZmluYWxQYXRoLnJlcGxhY2UoJy8nICsgdXJsLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXJrZG93bkZpbGUgPSBNYXJrZG93bkVuZ2luZS5nZXRUcmFkaXRpb25hbE1hcmtkb3duU3luYyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuZ2V0SW5jbHVkZWRQYXRoRm9yRmlsZShmaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbERlcHRoLmxlbmd0aCA+IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignT25seSA1IGxldmVscyBvZiBkZXB0aCBhcmUgc3VwcG9ydGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgX3BhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2FkZGl0aW9uYWwtcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZmluYWxQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQYWdlOiBtYXJrZG93bkZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGZpbmFsRGVwdGgubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuTGVuZ3RoOiBhZGRpdGlvbmFsTm9kZS5jaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFkZGl0aW9uYWxOb2RlLmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaGlsZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxEZXB0aC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TGV2ZWxPbmVQYWdlID0gX3BhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxEZXB0aC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgYWxsIGNoaWxkIHBhZ2VzIG9mIHRoZSBsYXN0IHJvb3QgbGV2ZWwgMSBwYWdlIGluc2lkZSBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RMZXZlbE9uZVBhZ2UuY2hpbGRyZW4ucHVzaChfcGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkQWRkaXRpb25hbFBhZ2UoX3BhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnRXJyb3IgZHVyaW5nIEFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVNb2R1bGVzKHNvbWVNb2R1bGVzPyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIG1vZHVsZXMnKTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgX21vZHVsZXMgPSBzb21lTW9kdWxlcyA/IHNvbWVNb2R1bGVzIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldE1vZHVsZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzID0gX21vZHVsZXMubWFwKG5nTW9kdWxlID0+IHtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzID0ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBwaXBlczogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFsnZGVjbGFyYXRpb25zJywgJ2Jvb3RzdHJhcCcsICdpbXBvcnRzJywgJ2V4cG9ydHMnLCAnY29udHJvbGxlcnMnXS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVR5cGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVbbWV0YWRhdGFUeXBlXSA9IG5nTW9kdWxlW21ldGFkYXRhVHlwZV0uZmlsdGVyKG1ldGFEYXRhSXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtZXRhRGF0YUl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlcGVuZGVuY2llc0VuZ2luZS5nZXREaXJlY3RpdmVzKCkuc29tZShkaXJlY3RpdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZERpcmVjdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1ldGFEYXRhSXRlbS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREaXJlY3RpdmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREaXJlY3RpdmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSBhcyBhbnkpLm5hbWUgPT09IG1ldGFEYXRhSXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGlyZWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmRpcmVjdGl2ZXMuaW5jbHVkZXMoZGlyZWN0aXZlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmRpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWREaXJlY3RpdmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlcGVuZGVuY2llc0VuZ2luZS5nZXRDb21wb25lbnRzKCkuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50OiBJQ29tcG9uZW50RGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhRGF0YUl0ZW0uaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbXBvbmVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbXBvbmVudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm5hbWUgPT09IG1ldGFEYXRhSXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29tcG9uZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb21wb25lbnRzLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50LnN0YW5kYWxvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbXBvbmVudHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb250cm9sbGVyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0Q29udHJvbGxlcnMoKS5zb21lKGNvbnRyb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZENvbnRyb2xsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhRGF0YUl0ZW0uaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29udHJvbGxlciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udHJvbGxlciBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb250cm9sbGVyID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250cm9sbGVyIGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb250cm9sbGVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbnRyb2xsZXJzLmluY2x1ZGVzKGNvbnRyb2xsZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29udHJvbGxlcnMucHVzaChjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkQ29udHJvbGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21vZHVsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVwZW5kZW5jaWVzRW5naW5lLmdldE1vZHVsZXMoKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9PiAobW9kdWxlIGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGlwZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVwZW5kZW5jaWVzRW5naW5lLmdldFBpcGVzKCkuc29tZShwaXBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRQaXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0YURhdGFJdGVtLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBpcGUgPSAocGlwZSBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQaXBlID0gKHBpcGUgYXMgYW55KS5uYW1lID09PSBtZXRhRGF0YUl0ZW0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBpcGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MucGlwZXMuaW5jbHVkZXMocGlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5waXBlcy5wdXNoKHBpcGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRQaXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5wcm92aWRlcnMgPSBuZ01vZHVsZS5wcm92aWRlcnMuZmlsdGVyKHByb3ZpZGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5nZXRJbmplY3RhYmxlcygpLnNvbWUoaW5qZWN0YWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkSW5qZWN0YWJsZSA9IChpbmplY3RhYmxlIGFzIGFueSkubmFtZSA9PT0gcHJvdmlkZXIubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSW5qZWN0YWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5pbmplY3RhYmxlcy5pbmNsdWRlcyhpbmplY3RhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEluamVjdGFibGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW5jaWVzRW5naW5lLmdldEludGVyY2VwdG9ycygpLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgPT4gKGludGVyY2VwdG9yIGFzIGFueSkubmFtZSA9PT0gcHJvdmlkZXIubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFRyeSBmaXhpbmcgdHlwZSB1bmRlZmluZWQgZm9yIGVhY2ggcHJvdmlkZXJzXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKG5nTW9kdWxlLnByb3ZpZGVycywgcHJvdmlkZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW5qZWN0YWJsZXMoKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUgPT4gKGluamVjdGFibGUgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIudHlwZSA9ICdpbmplY3RhYmxlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW50ZXJjZXB0b3JzKCkuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvciA9PiAoaW50ZXJjZXB0b3IgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIudHlwZSA9ICdpbnRlcmNlcHRvcic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBPcmRlciB0aGluZ3NcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbXBvbmVudHMgPSBfLnNvcnRCeShuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbXBvbmVudHMsIFtcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb250cm9sbGVycyA9IF8uc29ydEJ5KG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29udHJvbGxlcnMsIFtcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5kaXJlY3RpdmVzID0gXy5zb3J0QnkobmdNb2R1bGUuY29tcG9kb2NMaW5rcy5kaXJlY3RpdmVzLCBbXG4gICAgICAgICAgICAgICAgICAgICduYW1lJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuaW5qZWN0YWJsZXMgPSBfLnNvcnRCeShuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmluamVjdGFibGVzLCBbXG4gICAgICAgICAgICAgICAgICAgICduYW1lJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MucGlwZXMgPSBfLnNvcnRCeShuZ01vZHVsZS5jb21wb2RvY0xpbmtzLnBpcGVzLCBbJ25hbWUnXSk7XG5cbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5kZWNsYXJhdGlvbnMgPSBfLnNvcnRCeShuZ01vZHVsZS5kZWNsYXJhdGlvbnMsIFsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5lbnRyeUNvbXBvbmVudHMgPSBfLnNvcnRCeShuZ01vZHVsZS5lbnRyeUNvbXBvbmVudHMsIFsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5wcm92aWRlcnMgPSBfLnNvcnRCeShuZ01vZHVsZS5wcm92aWRlcnMsIFsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5pbXBvcnRzID0gXy5zb3J0QnkobmdNb2R1bGUuaW1wb3J0cywgWyduYW1lJ10pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmV4cG9ydHMgPSBfLnNvcnRCeShuZ01vZHVsZS5leHBvcnRzLCBbJ25hbWUnXSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmdNb2R1bGU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgaWQ6ICdtb2R1bGVzJyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtkb3duRW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldLmZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRtZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldLnJlYWRtZSA9IG1hcmtlZEFjbChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtb2R1bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlOiBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlUGlwZXMgPSAoc29tZVBpcGVzPykgPT4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBwaXBlcycpO1xuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnBpcGVzID0gc29tZVBpcGVzID8gc29tZVBpcGVzIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldFBpcGVzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGlwZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXBlID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5waXBlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtkb3duRW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUocGlwZS5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke3BpcGUubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRtZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKHBpcGUuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaXBlLnJlYWRtZSA9IG1hcmtlZEFjbChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAncGlwZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGlwZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHBpcGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMocGlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAncGlwZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaXBlOiBwaXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAocGlwZS5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIHBpcGUuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcHJlcGFyZUNsYXNzZXMgPSAoc29tZUNsYXNzZXM/KSA9PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGNsYXNzZXMnKTtcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jbGFzc2VzID0gc29tZUNsYXNzZXNcbiAgICAgICAgICAgID8gc29tZUNsYXNzZXNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldENsYXNzZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jbGFzc2VzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhc3NlID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jbGFzc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShjbGFzc2UuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtjbGFzc2UubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRtZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGNsYXNzZS5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZS5yZWFkbWUgPSBtYXJrZWRBY2wocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2NsYXNzZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY2xhc3NlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogY2xhc3NlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGNsYXNzZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnY2xhc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGNsYXNzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzZS5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGNsYXNzZS5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBwcmVwYXJlSW50ZXJmYWNlcyhzb21lSW50ZXJmYWNlcz8pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgaW50ZXJmYWNlcycpO1xuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmludGVyZmFjZXMgPSBzb21lSW50ZXJmYWNlc1xuICAgICAgICAgICAgPyBzb21lSW50ZXJmYWNlc1xuICAgICAgICAgICAgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW50ZXJmYWNlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmludGVyZmFjZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmYgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmludGVyZmFjZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXJrZG93bkVuZ2luZS5oYXNOZWlnaGJvdXJSZWFkbWVGaWxlKGludGVyZi5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2ludGVyZi5uYW1lfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZG1lID0gTWFya2Rvd25FbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoaW50ZXJmLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmLnJlYWRtZSA9IG1hcmtlZEFjbChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnaW50ZXJmYWNlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbnRlcmYubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpbnRlcmYuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoaW50ZXJmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdpbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlOiBpbnRlcmYsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmYuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBpbnRlcmYuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlTWlzY2VsbGFuZW91cyhzb21lTWlzYz8pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgbWlzY2VsbGFuZW91cycpO1xuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMgPSBzb21lTWlzY1xuICAgICAgICAgICAgPyBzb21lTWlzY1xuICAgICAgICAgICAgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0TWlzY2VsbGFuZW91cygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdtaXNjZWxsYW5lb3VzLWZ1bmN0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtaXNjZWxsYW5lb3VzLWZ1bmN0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy52YXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3ZhcmlhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbWlzY2VsbGFuZW91cy12YXJpYWJsZXMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnbWlzY2VsbGFuZW91cy12YXJpYWJsZXMnLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3R5cGVhbGlhc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdtaXNjZWxsYW5lb3VzLXR5cGVhbGlhc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ21pc2NlbGxhbmVvdXMtdHlwZWFsaWFzZXMnLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlbnVtZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ21pc2NlbGxhbmVvdXMtZW51bWVyYXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ21pc2NlbGxhbmVvdXMtZW51bWVyYXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlVGVtcGxhdGV1cmwoY29tcG9uZW50KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZGlybmFtZSA9IHBhdGguZGlybmFtZShjb21wb25lbnQuZmlsZSk7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJuYW1lICsgcGF0aC5zZXAgKyBjb21wb25lbnQudGVtcGxhdGVVcmwpO1xuXG4gICAgICAgIGlmICghRmlsZUVuZ2luZS5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGBDYW5ub3QgcmVhZCB0ZW1wbGF0ZSBmb3IgJHtjb21wb25lbnQubmFtZX1gO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KHRlbXBsYXRlUGF0aCkudGhlbihcbiAgICAgICAgICAgIGRhdGEgPT4gKGNvbXBvbmVudC50ZW1wbGF0ZURhdGEgPSBkYXRhKSxcbiAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVN0eWxlcyhjb21wb25lbnQpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBjb21wb25lbnQuc3R5bGVzO1xuICAgICAgICBjb21wb25lbnQuc3R5bGVzRGF0YSA9ICcnO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmVTdHlsZXMsIHJlamVjdFN0eWxlcykgPT4ge1xuICAgICAgICAgICAgc3R5bGVzLmZvckVhY2goc3R5bGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zdHlsZXNEYXRhID0gY29tcG9uZW50LnN0eWxlc0RhdGEgKyBzdHlsZSArICdcXG4nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXNvbHZlU3R5bGVzKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVN0eWxldXJscyhjb21wb25lbnQpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGNvbXBvbmVudC5maWxlKTtcblxuICAgICAgICBjb25zdCBzdHlsZURhdGFQcm9taXNlID0gY29tcG9uZW50LnN0eWxlVXJscy5tYXAoc3R5bGVVcmwgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpcm5hbWUgKyBwYXRoLnNlcCArIHN0eWxlVXJsKTtcblxuICAgICAgICAgICAgaWYgKCFGaWxlRW5naW5lLmV4aXN0c1N5bmMoc3R5bGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGBDYW5ub3QgcmVhZCBzdHlsZSB1cmwgJHtzdHlsZVBhdGh9IGZvciAke2NvbXBvbmVudC5uYW1lfWA7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBGaWxlRW5naW5lLmdldChzdHlsZVBhdGgpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChzdHlsZURhdGFQcm9taXNlKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiAoY29tcG9uZW50LnN0eWxlVXJsc0RhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IG51bGwpKSxcbiAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5hdlRhYnMoZGVwZW5kZW5jeSk6IEFycmF5PGFueT4ge1xuICAgICAgICBsZXQgbmF2VGFiQ29uZmlnID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5uYXZUYWJDb25maWc7XG4gICAgICAgIGNvbnN0IGhhc0N1c3RvbU5hdlRhYkNvbmZpZyA9IG5hdlRhYkNvbmZpZy5sZW5ndGggIT09IDA7XG4gICAgICAgIG5hdlRhYkNvbmZpZyA9XG4gICAgICAgICAgICBuYXZUYWJDb25maWcubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgPyBfLmNsb25lRGVlcChDT01QT0RPQ19DT05TVEFOVFMubmF2VGFiRGVmaW5pdGlvbnMpXG4gICAgICAgICAgICAgICAgOiBuYXZUYWJDb25maWc7XG4gICAgICAgIGNvbnN0IG1hdGNoRGVwVHlwZSA9IChkZXBUeXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZXBUeXBlID09PSAnYWxsJyB8fCBkZXBUeXBlID09PSBkZXBlbmRlbmN5LnR5cGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IG5hdlRhYnMgPSBbXTtcbiAgICAgICAgXy5mb3JFYWNoKG5hdlRhYkNvbmZpZywgY3VzdG9tVGFiID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hdlRhYiA9IF8uZmluZChDT01QT0RPQ19DT05TVEFOVFMubmF2VGFiRGVmaW5pdGlvbnMsIHsgaWQ6IGN1c3RvbVRhYi5pZCB9KTtcbiAgICAgICAgICAgIGlmICghbmF2VGFiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRhYiBJRCAnJHtjdXN0b21UYWIuaWR9JyBzcGVjaWZpZWQgaW4gdGFiIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmF2VGFiLmxhYmVsID0gY3VzdG9tVGFiLmxhYmVsO1xuXG4gICAgICAgICAgICBpZiAoaGFzQ3VzdG9tTmF2VGFiQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgbmF2VGFiLmN1c3RvbSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlzIHRhYiBhcHBsaWNhYmxlIHRvIHRhcmdldCBkZXBlbmRlbmN5P1xuICAgICAgICAgICAgaWYgKC0xID09PSBfLmZpbmRJbmRleChuYXZUYWIuZGVwVHlwZXMsIG1hdGNoRGVwVHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGdsb2JhbCBjb25maWdcbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICd0cmVlJyAmJiBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVEb21UcmVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1c3RvbVRhYi5pZCA9PT0gJ3NvdXJjZScgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU291cmNlQ29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICd0ZW1wbGF0ZURhdGEnICYmIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVRlbXBsYXRlVGFiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1c3RvbVRhYi5pZCA9PT0gJ3N0eWxlRGF0YScgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU3R5bGVUYWIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHBlciBkZXBlbmRlbmN5IGNvbmZpZ1xuICAgICAgICAgICAgaWYgKGN1c3RvbVRhYi5pZCA9PT0gJ3JlYWRtZScgJiYgIWRlcGVuZGVuY3kucmVhZG1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1c3RvbVRhYi5pZCA9PT0gJ2V4YW1wbGUnICYmICFkZXBlbmRlbmN5LmV4YW1wbGVVcmxzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGN1c3RvbVRhYi5pZCA9PT0gJ3RlbXBsYXRlRGF0YScgJiZcbiAgICAgICAgICAgICAgICAoIWRlcGVuZGVuY3kudGVtcGxhdGVVcmwgfHwgZGVwZW5kZW5jeS50ZW1wbGF0ZVVybC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY3VzdG9tVGFiLmlkID09PSAnc3R5bGVEYXRhJyAmJlxuICAgICAgICAgICAgICAgICghZGVwZW5kZW5jeS5zdHlsZVVybHMgfHwgZGVwZW5kZW5jeS5zdHlsZVVybHMubGVuZ3RoID09PSAwKSAmJlxuICAgICAgICAgICAgICAgICghZGVwZW5kZW5jeS5zdHlsZXMgfHwgZGVwZW5kZW5jeS5zdHlsZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYXZUYWJzLnB1c2gobmF2VGFiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG5hdlRhYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHZhbGlkIG5hdmlnYXRpb24gdGFicyBoYXZlIGJlZW4gZGVmaW5lZCBmb3IgZGVwZW5kZW5jeSB0eXBlICcke2RlcGVuZGVuY3kudHlwZX0nLiBTcGVjaWZ5IFxcXG5hdCBsZWFzdCBvbmUgY29uZmlnIGZvciB0aGUgJ2luZm8nIG9yICdzb3VyY2UnIHRhYiBpbiAtLW5hdlRhYkNvbmZpZy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuYXZUYWJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlQ29udHJvbGxlcnMoc29tZUNvbnRyb2xsZXJzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBjb250cm9sbGVycycpO1xuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbnRyb2xsZXJzID0gc29tZUNvbnRyb2xsZXJzXG4gICAgICAgICAgICA/IHNvbWVDb250cm9sbGVyc1xuICAgICAgICAgICAgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0Q29udHJvbGxlcnMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb250cm9sbGVycy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbnRyb2xsZXJzW2ldO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2NvbnRyb2xsZXJzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbnRyb2xsZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjb250cm9sbGVyLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGNvbnRyb2xsZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2NvbnRyb2xsZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBjb250cm9sbGVyLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUVudGl0aWVzKHNvbWVFbnRpdGllcz8pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgZW50aXRpZXMnKTtcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5lbnRpdGllcyA9IHNvbWVFbnRpdGllc1xuICAgICAgICAgICAgPyBzb21lRW50aXRpZXNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldEVudGl0aWVzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZW50aXRpZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW50aXR5ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5lbnRpdGllc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnZW50aXRpZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZW50aXR5Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZW50aXR5LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGVudGl0eSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnZW50aXR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogZW50aXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50aXR5LmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgZW50aXR5LmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUNvbXBvbmVudHMoc29tZUNvbXBvbmVudHM/KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGNvbXBvbmVudHMnKTtcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb21wb25lbnRzID0gc29tZUNvbXBvbmVudHNcbiAgICAgICAgICAgID8gc29tZUNvbXBvbmVudHNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldENvbXBvbmVudHMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKG1haW5QcmVwYXJlQ29tcG9uZW50UmVzb2x2ZSwgbWFpblByZXBhcmVDb21wb25lbnRSZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29tcG9uZW50cy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDw9IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb21wb25lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShjb21wb25lbnQuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtjb21wb25lbnQubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRtZUZpbGUgPSBNYXJrZG93bkVuZ2luZS5yZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShjb21wb25lbnQuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVhZG1lID0gbWFya2VkQWNsKHJlYWRtZUZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY29tcG9uZW50cycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY29tcG9uZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdjb21wb25lbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGNvbXBvbmVudC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VGVtcGxhdGVVcmxQcm9taXNlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50VGVtcGxhdGVVcmxSZXNvbHZlLCBjb21wb25lbnRUZW1wbGF0ZVVybFJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQudGVtcGxhdGVVcmwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7Y29tcG9uZW50Lm5hbWV9IGhhcyBhIHRlbXBsYXRlVXJsLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVGVtcGxhdGV1cmwoY29tcG9uZW50KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRlbXBsYXRlVXJsUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VGVtcGxhdGVVcmxSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUZW1wbGF0ZVVybFJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRTdHlsZVVybHNQcm9taXNlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50U3R5bGVVcmxzUmVzb2x2ZSwgY29tcG9uZW50U3R5bGVVcmxzUmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zdHlsZVVybHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7Y29tcG9uZW50Lm5hbWV9IGhhcyBzdHlsZVVybHMsIGluY2x1ZGUgdGhlbWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0eWxldXJscyhjb21wb25lbnQpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3R5bGVVcmxzUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3R5bGVVcmxzUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3R5bGVVcmxzUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFN0eWxlc1Byb21pc2UgPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb21wb25lbnRTdHlsZXNSZXNvbHZlLCBjb21wb25lbnRTdHlsZXNSZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnN0eWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtjb21wb25lbnQubmFtZX0gaGFzIHN0eWxlcywgaW5jbHVkZSB0aGVtYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3R5bGVzKGNvbXBvbmVudCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdHlsZXNSZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdHlsZXNSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdHlsZXNSZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUZW1wbGF0ZVVybFByb21pc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdHlsZVVybHNQcm9taXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U3R5bGVzUHJvbWlzZVxuICAgICAgICAgICAgICAgICAgICBdKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpblByZXBhcmVDb21wb25lbnRSZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlRGlyZWN0aXZlcyhzb21lRGlyZWN0aXZlcz8pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgZGlyZWN0aXZlcycpO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlyZWN0aXZlcyA9IHNvbWVEaXJlY3RpdmVzXG4gICAgICAgICAgICA/IHNvbWVEaXJlY3RpdmVzXG4gICAgICAgICAgICA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXREaXJlY3RpdmVzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpcmVjdGl2ZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdGl2ZSA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlyZWN0aXZlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtkb3duRW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoZGlyZWN0aXZlLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7ZGlyZWN0aXZlLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gTWFya2Rvd25FbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoZGlyZWN0aXZlLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLnJlYWRtZSA9IG1hcmtlZEFjbChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2RpcmVjdGl2ZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZGlyZWN0aXZlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZGlyZWN0aXZlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGRpcmVjdGl2ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnZGlyZWN0aXZlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZTogZGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aXZlLmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgZGlyZWN0aXZlLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUluamVjdGFibGVzKHNvbWVJbmplY3RhYmxlcz8pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgaW5qZWN0YWJsZXMnKTtcblxuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmluamVjdGFibGVzID0gc29tZUluamVjdGFibGVzXG4gICAgICAgICAgICA/IHNvbWVJbmplY3RhYmxlc1xuICAgICAgICAgICAgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW5qZWN0YWJsZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5qZWN0YWJsZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluamVjID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmplY3RhYmxlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtkb3duRW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoaW5qZWMuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtpbmplYy5uYW1lfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWRtZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGluamVjLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWMucmVhZG1lID0gbWFya2VkQWNsKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnaW5qZWN0YWJsZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaW5qZWMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpbmplYy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhpbmplYyksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnaW5qZWN0YWJsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlOiBpbmplYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluamVjLmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgaW5qZWMuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVJbnRlcmNlcHRvcnMoc29tZUludGVyY2VwdG9ycz8pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgaW50ZXJjZXB0b3JzJyk7XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmNlcHRvcnMgPSBzb21lSW50ZXJjZXB0b3JzXG4gICAgICAgICAgICA/IHNvbWVJbnRlcmNlcHRvcnNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldEludGVyY2VwdG9ycygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmludGVyY2VwdG9ycy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmNlcHRvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXJrZG93bkVuZ2luZS5oYXNOZWlnaGJvdXJSZWFkbWVGaWxlKGludGVyY2VwdG9yLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7aW50ZXJjZXB0b3IubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWRtZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGludGVyY2VwdG9yLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3IucmVhZG1lID0gbWFya2VkQWNsKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbnRlcmNlcHRvcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaW50ZXJjZXB0b3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpbnRlcmNlcHRvci5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhpbnRlcmNlcHRvciksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnaW50ZXJjZXB0b3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZTogaW50ZXJjZXB0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcmNlcHRvci5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGludGVyY2VwdG9yLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlR3VhcmRzKHNvbWVHdWFyZHM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGd1YXJkcycpO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ3VhcmRzID0gc29tZUd1YXJkcyA/IHNvbWVHdWFyZHMgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0R3VhcmRzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ3VhcmRzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VhcmQgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmd1YXJkc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtkb3duRW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoZ3VhcmQuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtndWFyZC5uYW1lfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZG1lID0gTWFya2Rvd25FbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoZ3VhcmQuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBndWFyZC5yZWFkbWUgPSBtYXJrZWRBY2wocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2d1YXJkcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBndWFyZC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGd1YXJkLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGd1YXJkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdndWFyZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlOiBndWFyZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGd1YXJkLmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgZ3VhcmQuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVSb3V0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIHJvdXRlcycpO1xuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlcyA9IERlcGVuZGVuY2llc0VuZ2luZS5nZXRSb3V0ZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAncm91dGVzJyxcbiAgICAgICAgICAgICAgICBpZDogJ3JvdXRlcycsXG4gICAgICAgICAgICAgICAgY29udGV4dDogJ3JvdXRlcycsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCA9PT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5nZW5lcmF0ZVJvdXRlc0luZGV4KFxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5yb3V0ZXNcbiAgICAgICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCcgUm91dGVzIGluZGV4IGdlbmVyYXRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUNvdmVyYWdlKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHJlcG9ydCcpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogbG9vcCB3aXRoIGNvbXBvbmVudHMsIGRpcmVjdGl2ZXMsIGNvbnRyb2xsZXJzLCBlbnRpdGllcywgY2xhc3NlcywgaW5qZWN0YWJsZXMsIGludGVyZmFjZXMsIHBpcGVzLCBndWFyZHMsIG1pc2MgZnVuY3Rpb25zIHZhcmlhYmxlc1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0b3RhbFByb2plY3RTdGF0ZW1lbnREb2N1bWVudGVkID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGdldFN0YXR1cyA9IGZ1bmN0aW9uIChwZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cztcbiAgICAgICAgICAgICAgICBpZiAocGVyY2VudCA8PSAyNSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnbG93JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAyNSAmJiBwZXJjZW50IDw9IDUwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdtZWRpdW0nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA+IDUwICYmIHBlcmNlbnQgPD0gNzUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2dvb2QnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICd2ZXJ5LWdvb2QnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NDb21wb25lbnRzQW5kRGlyZWN0aXZlc0FuZENvbnRyb2xsZXJzQW5kRW50aXRpZXMgPSBsaXN0ID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2gobGlzdCwgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IChPYmplY3QgYXMgYW55KS5hc3NpZ24oe30sIGVsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LnByb3BlcnRpZXNDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzQ2xhc3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQubWV0aG9kc0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm1ldGhvZHNDbGFzcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5ob3N0QmluZGluZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaG9zdEJpbmRpbmdzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmhvc3RMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaG9zdExpc3RlbmVycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pbnB1dHNDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbnB1dHNDbGFzcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5vdXRwdXRzQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQub3V0cHV0c0NsYXNzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2w6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoOiBlbGVtZW50LmZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxTdGF0ZW1lbnRzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucHJvcGVydGllc0NsYXNzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm1ldGhvZHNDbGFzcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbnB1dHNDbGFzcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5ob3N0QmluZGluZ3MubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaG9zdExpc3RlbmVycy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5vdXRwdXRzQ2xhc3MubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIDE7IC8vICsxIGZvciBlbGVtZW50IGRlY29yYXRvciBjb21tZW50XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY29uc3RydWN0b3JPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29uc3RydWN0b3JPYmogJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb25zdHJ1Y3Rvck9iai5kZXNjcmlwdGlvbiAhPT0gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRlc2NyaXB0aW9uICYmIGVsZW1lbnQuZGVzY3JpcHRpb24gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50LnByb3BlcnRpZXNDbGFzcywgKHByb3BlcnR5OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50Lm1ldGhvZHNDbGFzcywgKG1ldGhvZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQuaG9zdEJpbmRpbmdzLCAocHJvcGVydHk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQuaG9zdExpc3RlbmVycywgKG1ldGhvZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQuaW5wdXRzQ2xhc3MsIChpbnB1dDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5vdXRwdXRzQ2xhc3MsIChvdXRwdXQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VQZXJjZW50ID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgLyB0b3RhbFN0YXRlbWVudHMpICogMTAwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbFN0YXRlbWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VDb3VudCA9IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArICcvJyArIHRvdGFsU3RhdGVtZW50cztcbiAgICAgICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgKz0gY2wuY292ZXJhZ2VQZXJjZW50O1xuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGNsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgcHJvY2Vzc0NvdmVyYWdlUGVyRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlJyk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcblxuICAgICAgICAgICAgICAgIGxldCBvdmVyRmlsZXMgPSBmaWxlcy5maWx0ZXIoZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvdmVyVGVzdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmNvdmVyYWdlUGVyY2VudCA+PSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyVGVzdCAmJiAhQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7Zi5jb3ZlcmFnZVBlcmNlbnR9ICUgZm9yIGZpbGUgJHtmLmZpbGVQYXRofSAtICR7Zi5uYW1lfSAtIG92ZXIgbWluaW11bSBwZXIgZmlsZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJUZXN0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCB1bmRlckZpbGVzID0gZmlsZXMuZmlsdGVyKGYgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdW5kZXJUZXN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGYuY292ZXJhZ2VQZXJjZW50IDwgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJUZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7Zi5jb3ZlcmFnZVBlcmNlbnR9ICUgZm9yIGZpbGUgJHtmLmZpbGVQYXRofSAtICR7Zi5uYW1lfSAtIHVuZGVyIG1pbmltdW0gcGVyIGZpbGVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlclRlc3Q7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJGaWxlczogb3ZlckZpbGVzLFxuICAgICAgICAgICAgICAgICAgICB1bmRlckZpbGVzOiB1bmRlckZpbGVzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgcHJvY2Vzc0Z1bmN0aW9uc0FuZFZhcmlhYmxlcyA9IChpZCwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChpZCwgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogZWwuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogZWwudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzdWJ0eXBlOiBlbC5zdWJ0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZWwubmFtZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3ZhcmlhYmxlJyB8fCB0eXBlID09PSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09ICd0eXBlIGFsaWFzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2wubGlua3R5cGUgPSAnbWlzY2VsbGFuZW91cyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSAxO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzKSAqIDEwMFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjbC5jb3ZlcmFnZUNvdW50ID0gdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICsgJy8nICsgdG90YWxTdGF0ZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBjbC5zdGF0dXMgPSBnZXRTdGF0dXMoY2wuY292ZXJhZ2VQZXJjZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbC5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goY2wpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IHByb2Nlc3NDbGFzc2VzID0gKGxpc3QsIHR5cGUsIGxpbmt0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGxpc3QsIChjbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gKE9iamVjdCBhcyBhbnkpLmFzc2lnbih7fSwgY2wpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm1ldGhvZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubWV0aG9kcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbGE6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoOiBlbGVtZW50LmZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua3R5cGU6IGxpbmt0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudC5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxTdGF0ZW1lbnRzID0gZWxlbWVudC5wcm9wZXJ0aWVzLmxlbmd0aCArIGVsZW1lbnQubWV0aG9kcy5sZW5ndGggKyAxOyAvLyArMSBmb3IgZWxlbWVudCBpdHNlbGZcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jb25zdHJ1Y3Rvck9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb25zdHJ1Y3Rvck9iaiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGVzY3JpcHRpb24gJiYgZWxlbWVudC5kZXNjcmlwdGlvbiAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQucHJvcGVydGllcywgKHByb3BlcnR5OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50Lm1ldGhvZHMsIChtZXRob2Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2xhLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzKSAqIDEwMFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxTdGF0ZW1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGEuY292ZXJhZ2VQZXJjZW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGEuY292ZXJhZ2VDb3VudCA9IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArICcvJyArIHRvdGFsU3RhdGVtZW50cztcbiAgICAgICAgICAgICAgICAgICAgY2xhLnN0YXR1cyA9IGdldFN0YXR1cyhjbGEuY292ZXJhZ2VQZXJjZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbGEuY292ZXJhZ2VQZXJjZW50O1xuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGNsYSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50c0FuZERpcmVjdGl2ZXNBbmRDb250cm9sbGVyc0FuZEVudGl0aWVzKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29tcG9uZW50c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzQW5kRGlyZWN0aXZlc0FuZENvbnRyb2xsZXJzQW5kRW50aXRpZXMoXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXJlY3RpdmVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHNBbmREaXJlY3RpdmVzQW5kQ29udHJvbGxlcnNBbmRFbnRpdGllcyhcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbnRyb2xsZXJzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHNBbmREaXJlY3RpdmVzQW5kQ29udHJvbGxlcnNBbmRFbnRpdGllcyhcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmVudGl0aWVzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBwcm9jZXNzQ2xhc3NlcyhDb25maWd1cmF0aW9uLm1haW5EYXRhLmNsYXNzZXMsICdjbGFzcycsICdjbGFzc2UnKTtcbiAgICAgICAgICAgIHByb2Nlc3NDbGFzc2VzKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5qZWN0YWJsZXMsICdpbmplY3RhYmxlJywgJ2luamVjdGFibGUnKTtcbiAgICAgICAgICAgIHByb2Nlc3NDbGFzc2VzKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJmYWNlcywgJ2ludGVyZmFjZScsICdpbnRlcmZhY2UnKTtcbiAgICAgICAgICAgIHByb2Nlc3NDbGFzc2VzKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ3VhcmRzLCAnZ3VhcmQnLCAnZ3VhcmQnKTtcbiAgICAgICAgICAgIHByb2Nlc3NDbGFzc2VzKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJjZXB0b3JzLCAnaW50ZXJjZXB0b3InLCAnaW50ZXJjZXB0b3InKTtcblxuICAgICAgICAgICAgXy5mb3JFYWNoKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGlwZXMsIChwaXBlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2w6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IHBpcGUuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcGlwZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogcGlwZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwaXBlLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSAxO1xuICAgICAgICAgICAgICAgIGlmIChwaXBlLmRlc2NyaXB0aW9uICYmIHBpcGUuZGVzY3JpcHRpb24gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IoKHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCAvIHRvdGFsU3RhdGVtZW50cykgKiAxMDApO1xuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbC5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uc0FuZFZhcmlhYmxlcyhcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLFxuICAgICAgICAgICAgICAgICdmdW5jdGlvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzRnVuY3Rpb25zQW5kVmFyaWFibGVzKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsXG4gICAgICAgICAgICAgICAgJ3ZhcmlhYmxlJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3NGdW5jdGlvbnNBbmRWYXJpYWJsZXMoXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLFxuICAgICAgICAgICAgICAgICd0eXBlIGFsaWFzJ1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZmlsZXMgPSBfLnNvcnRCeShmaWxlcywgWydmaWxlUGF0aCddKTtcblxuICAgICAgICAgICAgbGV0IGNvdmVyYWdlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjb3VudDpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLmZsb29yKHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgLyBmaWxlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnJyxcbiAgICAgICAgICAgICAgICBmaWxlc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5zdGF0dXMgPSBnZXRTdGF0dXMoY292ZXJhZ2VEYXRhLmNvdW50KTtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2NvdmVyYWdlJyxcbiAgICAgICAgICAgICAgICBpZDogJ2NvdmVyYWdlJyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnY292ZXJhZ2UnLFxuICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlcyxcbiAgICAgICAgICAgICAgICBkYXRhOiBjb3ZlcmFnZURhdGEsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb3ZlcmFnZURhdGEuZmlsZXMgPSBmaWxlcztcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VEYXRhID0gY292ZXJhZ2VEYXRhO1xuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID09PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBIdG1sRW5naW5lLmdlbmVyYXRlQ292ZXJhZ2VCYWRnZShcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VEYXRhXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGVzID0gXy5zb3J0QnkoZmlsZXMsIFsnY292ZXJhZ2VQZXJjZW50J10pO1xuXG4gICAgICAgICAgICBsZXQgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHM7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgJiZcbiAgICAgICAgICAgICAgICAhQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBHbG9iYWwgY292ZXJhZ2UgdGVzdCBhbmQgbm90IHBlciBmaWxlXG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyYWdlRGF0YS5jb3VudCA+PSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZH0lKWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSAoJHtjb3ZlcmFnZURhdGEuY291bnR9JSkgaXMgbm90IG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCAmJlxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0UGVyRmlsZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMgPSBwcm9jZXNzQ292ZXJhZ2VQZXJGaWxlKCk7XG4gICAgICAgICAgICAgICAgLy8gUGVyIGZpbGUgY292ZXJhZ2UgdGVzdCBhbmQgbm90IGdsb2JhbFxuICAgICAgICAgICAgICAgIGlmIChjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cy51bmRlckZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIGlzIG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZX0lKWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCAmJlxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0UGVyRmlsZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gUGVyIGZpbGUgY292ZXJhZ2UgdGVzdCBhbmQgZ2xvYmFsXG4gICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMgPSBwcm9jZXNzQ292ZXJhZ2VQZXJGaWxlKCk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZURhdGEuY291bnQgPj0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMudW5kZXJGaWxlcy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSAoJHtjb3ZlcmFnZURhdGEuY291bnR9JSkgaXMgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGR9JSlgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZURhdGEuY291bnQgPj0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMudW5kZXJGaWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7Y292ZXJhZ2VEYXRhLmNvdW50fSUpIGlzIG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGV9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA8IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkICYmXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzLnVuZGVyRmlsZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUdsb2JhbCA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGR9JSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBlckZpbGUgPSBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2VHbG9iYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2VQZXJGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2VHbG9iYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZVBlckZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSAoJHtjb3ZlcmFnZURhdGEuY291bnR9JSkgaXMgbm90IG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkfSUpYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQZXJGaWxlID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8obWVzc2FnZVBlckZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhtZXNzYWdlUGVyRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlVW5pdFRlc3RDb3ZlcmFnZSgpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgdW5pdCB0ZXN0IGNvdmVyYWdlIHJlcG9ydCcpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvdkRhdCwgY292RmlsZU5hbWVzO1xuXG4gICAgICAgICAgICBsZXQgY292ZXJhZ2VEYXRhOiBDb3ZlcmFnZURhdGEgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlRGF0YTtcblxuICAgICAgICAgICAgaWYgKCFjb3ZlcmFnZURhdGEuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybignTWlzc2luZyBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIGRhdGEnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY292RGF0ID0ge307XG4gICAgICAgICAgICAgICAgY292RmlsZU5hbWVzID0gXy5tYXAoY292ZXJhZ2VEYXRhLmZpbGVzLCBlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IHBhdGgubm9ybWFsaXplKGVsLmZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgY292RGF0W2ZpbGVOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGVsLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogZWwubGlua3R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rc3VidHlwZTogZWwubGlua3N1YnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbC5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJlYWQgY292ZXJhZ2Ugc3VtbWFyeSBmaWxlIGFuZCBkYXRhXG4gICAgICAgICAgICBsZXQgdW5pdFRlc3RTdW1tYXJ5ID0ge307XG4gICAgICAgICAgICBsZXQgZmlsZURhdCA9IEZpbGVFbmdpbmUuZ2V0U3luYyhDb25maWd1cmF0aW9uLm1haW5EYXRhLnVuaXRUZXN0Q292ZXJhZ2UpO1xuICAgICAgICAgICAgaWYgKGZpbGVEYXQpIHtcbiAgICAgICAgICAgICAgICB1bml0VGVzdFN1bW1hcnkgPSBKU09OLnBhcnNlKGZpbGVEYXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0Vycm9yIHJlYWRpbmcgdW5pdCB0ZXN0IGNvdmVyYWdlIGZpbGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBnZXRDb3ZTdGF0dXMgPSBmdW5jdGlvbiAocGVyY2VudCwgdG90YWxMaW5lcykge1xuICAgICAgICAgICAgICAgIGxldCBzdGF0dXM7XG4gICAgICAgICAgICAgICAgaWYgKHRvdGFsTGluZXMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ3VuY292ZXJlZCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50IDw9IDI1KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdsb3cnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA+IDI1ICYmIHBlcmNlbnQgPD0gNTApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ21lZGl1bSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID4gNTAgJiYgcGVyY2VudCA8PSA3NSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZ29vZCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ3ZlcnktZ29vZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGdldENvdmVyYWdlRGF0YSA9IGZ1bmN0aW9uIChkYXRhLCBmaWxlTmFtZSkge1xuICAgICAgICAgICAgICAgIGxldCBvdXQgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT09ICd0b3RhbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdkRhdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIGEgbmFtZSB0byBpbmNsdWRlIGluIG91dHB1dCBidXQgdGhpcyBpc24ndCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSB7IG5hbWU6IGZpbGVOYW1lLCBmaWxlUGF0aDogZmlsZU5hbWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmRNYXRjaCA9IF8uZmlsdGVyKGNvdkZpbGVOYW1lcywgZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlbmFtZSA9IHBhdGgubm9ybWFsaXplKGZpbGVOYW1lKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLmluY2x1ZGVzKGZpbGVOYW1lKSB8fCBub3JtYWxpemVkRmlsZW5hbWUuaW5jbHVkZXMoZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZE1hdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSBfLmNsb25lKGNvdkRhdFtmaW5kTWF0Y2hbMF1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbJ2ZpbGVQYXRoJ10gPSBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQga2V5c1RvR2V0ID0gWydzdGF0ZW1lbnRzJywgJ2JyYW5jaGVzJywgJ2Z1bmN0aW9ucycsICdsaW5lcyddO1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChrZXlzVG9HZXQsIGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ID0gZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0W2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VQZXJjZW50OiBNYXRoLnJvdW5kKHQucGN0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZUNvdW50OiAnJyArIHQuY292ZXJlZCArICcvJyArIHQudG90YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBnZXRDb3ZTdGF0dXModC5wY3QsIHQudG90YWwpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCB1bml0VGVzdERhdGEgPSB7fTtcbiAgICAgICAgICAgIGxldCBmaWxlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZmlsZSBpbiB1bml0VGVzdFN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0ID0gZ2V0Q292ZXJhZ2VEYXRhKHVuaXRUZXN0U3VtbWFyeVtmaWxlXSwgZmlsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUgPT09ICd0b3RhbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pdFRlc3REYXRhWyd0b3RhbCddID0gZGF0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goZGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1bml0VGVzdERhdGFbJ2ZpbGVzJ10gPSBmaWxlcztcbiAgICAgICAgICAgIHVuaXRUZXN0RGF0YVsnaWRDb2x1bW4nXSA9IGNvdkRhdCAhPT0gdW5kZWZpbmVkOyAvLyBzaG91bGQgd2UgaW5jbHVkZSB0aGUgaWQgY29sdW1uXG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnVuaXRUZXN0RGF0YSA9IHVuaXRUZXN0RGF0YTtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3VuaXQtdGVzdCcsXG4gICAgICAgICAgICAgICAgaWQ6ICd1bml0LXRlc3QnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICd1bml0LXRlc3QnLFxuICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlcyxcbiAgICAgICAgICAgICAgICBkYXRhOiB1bml0VGVzdERhdGEsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCA9PT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGtleXNUb0dldCA9IFsnc3RhdGVtZW50cycsICdicmFuY2hlcycsICdmdW5jdGlvbnMnLCAnbGluZXMnXTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goa2V5c1RvR2V0LCBrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5pdFRlc3REYXRhWyd0b3RhbCddW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEh0bWxFbmdpbmUuZ2VuZXJhdGVDb3ZlcmFnZUJhZGdlKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LCBrZXksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogdW5pdFRlc3REYXRhWyd0b3RhbCddW2tleV1bJ2NvdmVyYWdlUGVyY2VudCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogdW5pdFRlc3REYXRhWyd0b3RhbCddW2tleV1bJ3N0YXR1cyddXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzUGFnZShwYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIHBhZ2UnLCBwYWdlLm5hbWUpO1xuXG4gICAgICAgIGxldCBodG1sRGF0YSA9IEh0bWxFbmdpbmUucmVuZGVyKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEsIHBhZ2UpO1xuICAgICAgICBsZXQgZmluYWxQYXRoID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQ7XG5cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lmxhc3RJbmRleE9mKCcvJykgPT09IC0xKSB7XG4gICAgICAgICAgICBmaW5hbFBhdGggKz0gJy8nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlLnBhdGgpIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCArPSBwYWdlLnBhdGggKyAnLyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZS5maWxlbmFtZSkge1xuICAgICAgICAgICAgZmluYWxQYXRoICs9IHBhZ2UuZmlsZW5hbWUgKyAnLmh0bWwnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxQYXRoICs9IHBhZ2UubmFtZSArICcuaHRtbCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgU2VhcmNoRW5naW5lLmluZGV4UGFnZSh7XG4gICAgICAgICAgICAgICAgaW5mb3M6IHBhZ2UsXG4gICAgICAgICAgICAgICAgcmF3RGF0YTogaHRtbERhdGEsXG4gICAgICAgICAgICAgICAgdXJsOiBmaW5hbFBhdGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgRmlsZUVuZ2luZS53cml0ZVN5bmMoZmluYWxQYXRoLCBodG1sRGF0YSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzVGVtcGxhdGVQbGF5Z3JvdW5kKCk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyB0ZW1wbGF0ZSBwbGF5Z3JvdW5kJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBDcmVhdGUgdGVtcGxhdGUgcGxheWdyb3VuZCBwYWdlXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUGxheWdyb3VuZFBhZ2UgPSB7XG4gICAgICAgICAgICBuYW1lOiAndGVtcGxhdGUtcGxheWdyb3VuZCcsXG4gICAgICAgICAgICBmaWxlbmFtZTogJ3RlbXBsYXRlLXBsYXlncm91bmQnLFxuICAgICAgICAgICAgY29udGV4dDogJ3RlbXBsYXRlLXBsYXlncm91bmQnLFxuICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICBwYWdlVHlwZTogJ3RlbXBsYXRlLXBsYXlncm91bmQnXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYSBjb21wcmVoZW5zaXZlIHRlbXBsYXRlIHBsYXlncm91bmQgcGFnZSB3aXRoIGFsbCByZXF1aXJlZCBkZXBlbmRlbmNpZXNcbiAgICAgICAgY29uc3QgaHRtbENvbnRlbnQgPSBgPCFET0NUWVBFIGh0bWw+XG48aHRtbD5cbjxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxuICAgIDx0aXRsZT5UZW1wbGF0ZSBQbGF5Z3JvdW5kIC0gJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluTmFtZSB8fCAnRG9jdW1lbnRhdGlvbid9PC90aXRsZT5cbiAgICA8bWV0YSBuYW1lPVwiZGVzY3JpcHRpb25cIiBjb250ZW50PVwiVGVtcGxhdGUgcGxheWdyb3VuZCBmb3IgY3VzdG9taXppbmcgQ29tcG9kb2MgdGVtcGxhdGVzXCI+XG4gICAgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCJzdHlsZXMvdGVtcGxhdGUtcGxheWdyb3VuZC5jc3NcIj5cbiAgICA8c2NyaXB0IHNyYz1cImpzL2xpYnMvbW9uYWNvLWVkaXRvci9taW4vdnMvbG9hZGVyLmpzXCI+PC9zY3JpcHQ+XG4gICAgPHNjcmlwdCBzcmM9XCJqcy9saWJzL2hhbmRsZWJhcnMubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgPHNjcmlwdCBzcmM9XCJqcy9saWJzL2pzemlwLm1pbi5qc1wiPjwvc2NyaXB0PlxuPC9oZWFkPlxuPGJvZHk+XG4gICAgPGRpdiBpZD1cInRlbXBsYXRlLXBsYXlncm91bmQtcm9vdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGVtcGxhdGUtcGxheWdyb3VuZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxoMT5UZW1wbGF0ZSBQbGF5Z3JvdW5kPC9oMT5cbiAgICAgICAgICAgIDxwPldlbGNvbWUgdG8gdGhlIFRlbXBsYXRlIFBsYXlncm91bmQhIFRoaXMgdG9vbCBhbGxvd3MgeW91IHRvIGN1c3RvbWl6ZSBhbmQgcHJldmlldyBDb21wb2RvYyB0ZW1wbGF0ZXMuPC9wPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVhdHVyZXNcIj5cbiAgICAgICAgICAgICAgICA8aDI+RmVhdHVyZXM8L2gyPlxuICAgICAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICAgICAgPGxpPkxpdmUgdGVtcGxhdGUgZWRpdGluZyB3aXRoIG1vbmFjby1lZGl0b3I8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGk+UmVhbC10aW1lIHByZXZpZXcgdXNpbmcgaGFuZGxlYmFycy5taW4uanM8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGk+VGVtcGxhdGUgZXhwb3J0IGFuZCBkb3dubG9hZCB3aXRoIGpzemlwLm1pbi5qczwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaT5TZXNzaW9uLWJhc2VkIGN1c3RvbWl6YXRpb248L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzYWdlXCI+XG4gICAgICAgICAgICAgICAgPGgyPkhvdyB0byBVc2U8L2gyPlxuICAgICAgICAgICAgICAgIDxvbD5cbiAgICAgICAgICAgICAgICAgICAgPGxpPlN0YXJ0IHRoZSB0ZW1wbGF0ZSBwbGF5Z3JvdW5kIHNlcnZlcjwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaT5FZGl0IHRlbXBsYXRlcyBpbiB0aGUgTW9uYWNvIGVkaXRvcjwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaT5QcmV2aWV3IGNoYW5nZXMgaW4gcmVhbC10aW1lPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPGxpPkRvd25sb2FkIGN1c3RvbWl6ZWQgdGVtcGxhdGUgcGFja2FnZTwvbGk+XG4gICAgICAgICAgICAgICAgPC9vbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8c2NyaXB0IHNyYz1cImpzL3RlbXBsYXRlLXBsYXlncm91bmQuanNcIj48L3NjcmlwdD5cbjwvYm9keT5cbjwvaHRtbD5gO1xuXG4gICAgICAgIGxldCBmaW5hbFBhdGggPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dDtcblxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQubGFzdEluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCArPSAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9ICd0ZW1wbGF0ZS1wbGF5Z3JvdW5kLmh0bWwnO1xuXG4gICAgICAgIEZpbGVFbmdpbmUud3JpdGVTeW5jKGZpbmFsUGF0aCwgaHRtbENvbnRlbnQpO1xuICAgICAgICBsb2dnZXIuaW5mbygnVGVtcGxhdGUgcGxheWdyb3VuZCBwYWdlIGdlbmVyYXRlZCcpO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIHJlcXVpcmVkIEphdmFTY3JpcHQgZmlsZVxuICAgICAgICBjb25zdCBqc1BhdGggPSBwYXRoLmpvaW4oQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQsICdqcycsICd0ZW1wbGF0ZS1wbGF5Z3JvdW5kLmpzJyk7XG4gICAgICAgIGNvbnN0IGpzQ29udGVudCA9IGAvLyBUZW1wbGF0ZSBQbGF5Z3JvdW5kIEphdmFTY3JpcHRcbihmdW5jdGlvbigpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSB0ZW1wbGF0ZSBwbGF5Z3JvdW5kXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnVGVtcGxhdGUgUGxheWdyb3VuZCBpbml0aWFsaXplZCcpO1xuICAgICAgICBcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBNb25hY28gRWRpdG9yIHdoZW4gYXZhaWxhYmxlXG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJlcXVpcmUuY29uZmlnKHsgcGF0aHM6IHsgJ3ZzJzogJ2pzL2xpYnMvbW9uYWNvLWVkaXRvci9taW4vdnMnIH19KTtcbiAgICAgICAgICAgIHJlcXVpcmUoWyd2cy9lZGl0b3IvZWRpdG9yLm1haW4nXSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ01vbmFjbyBFZGl0b3IgbG9hZGVkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBIYW5kbGViYXJzIHdoZW4gYXZhaWxhYmxlXG4gICAgICAgIGlmICh0eXBlb2YgSGFuZGxlYmFycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdIYW5kbGViYXJzIGxvYWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJbml0aWFsaXplIEpTWmlwIHdoZW4gYXZhaWxhYmxlXG4gICAgICAgIGlmICh0eXBlb2YgSlNaaXAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSlNaaXAgbG9hZGVkJyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pKCk7YDtcbiAgICAgICAgXG4gICAgICAgIC8vIEVuc3VyZSBqcyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGNvbnN0IGpzRGlyID0gcGF0aC5qb2luKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LCAnanMnKTtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGpzRGlyKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKGpzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBGaWxlRW5naW5lLndyaXRlU3luYyhqc1BhdGgsIGpzQ29udGVudCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdUZW1wbGF0ZSBwbGF5Z3JvdW5kIEphdmFTY3JpcHQgZ2VuZXJhdGVkJyk7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgcmVxdWlyZWQgQ1NTIGZpbGVcbiAgICAgICAgY29uc3QgY3NzUGF0aCA9IHBhdGguam9pbihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCwgJ3N0eWxlcycsICd0ZW1wbGF0ZS1wbGF5Z3JvdW5kLmNzcycpO1xuICAgICAgICBjb25zdCBjc3NDb250ZW50ID0gYC8qIFRlbXBsYXRlIFBsYXlncm91bmQgU3R5bGVzICovXG4udGVtcGxhdGUtcGxheWdyb3VuZC1jb250YWluZXIge1xuICAgIG1heC13aWR0aDogMTIwMHB4O1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBzYW5zLXNlcmlmO1xufVxuXG4jdGVtcGxhdGUtcGxheWdyb3VuZC1yb290IHtcbiAgICBtaW4taGVpZ2h0OiAxMDB2aDtcbiAgICBiYWNrZ3JvdW5kOiAjZjhmOWZhO1xufVxuXG4udGVtcGxhdGUtcGxheWdyb3VuZC1jb250YWluZXIgaDEge1xuICAgIGNvbG9yOiAjMmMzZTUwO1xuICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjMzQ5OGRiO1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xufVxuXG4uZmVhdHVyZXMsIC51c2FnZSB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgcGFkZGluZzogMjBweDtcbiAgICBtYXJnaW46IDIwcHggMDtcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4xKTtcbn1cblxuLmZlYXR1cmVzIGgyLCAudXNhZ2UgaDIge1xuICAgIGNvbG9yOiAjMzQ0OTVlO1xuICAgIG1hcmdpbi10b3A6IDA7XG59XG5cbi5mZWF0dXJlcyB1bCwgLnVzYWdlIG9sIHtcbiAgICBsaW5lLWhlaWdodDogMS42O1xufVxuXG4uZmVhdHVyZXMgbGksIC51c2FnZSBsaSB7XG4gICAgbWFyZ2luOiA4cHggMDtcbn1gO1xuICAgICAgICBcbiAgICAgICAgLy8gRW5zdXJlIHN0eWxlcyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGNvbnN0IHN0eWxlc0RpciA9IHBhdGguam9pbihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCwgJ3N0eWxlcycpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3R5bGVzRGlyKSkge1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHN0eWxlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgRmlsZUVuZ2luZS53cml0ZVN5bmMoY3NzUGF0aCwgY3NzQ29udGVudCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdUZW1wbGF0ZSBwbGF5Z3JvdW5kIENTUyBnZW5lcmF0ZWQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJvY2Vzc1BhZ2VzKCkge1xuICAgICAgICBsZXQgcGFnZXMgPSBfLnNvcnRCeShDb25maWd1cmF0aW9uLnBhZ2VzLCBbJ25hbWUnXSk7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgcGFnZXMnKTtcbiAgICAgICAgUHJvbWlzZS5hbGwocGFnZXMubWFwKHBhZ2UgPT4gdGhpcy5wcm9jZXNzUGFnZShwYWdlKSkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrc0FmdGVyR2VuZXJhdGVTZWFyY2hJbmRleEpzb24gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGVtcGxhdGUgcGxheWdyb3VuZCBpZiBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnRlbXBsYXRlUGxheWdyb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVGVtcGxhdGVQbGF5Z3JvdW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmFkZGl0aW9uYWxQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBZGRpdGlvbmFsUGFnZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBc3NldHNGb2xkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Jlc291cmNlcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUuZ2VuZXJhdGVTZWFyY2hJbmRleEpzb24oQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzQWZ0ZXJHZW5lcmF0ZVNlYXJjaEluZGV4SnNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NBZnRlckdlbmVyYXRlU2VhcmNoSW5kZXhKc29uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTWVudShDb25maWd1cmF0aW9uLm1haW5EYXRhKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc3BpbGVNZW51V0NUb0VTNShlczZDb2RlKSB7XG4gICAgICAgIHJldHVybiBiYWJlbC50cmFuc2Zvcm1Bc3luYyhlczZDb2RlLCB7XG4gICAgICAgICAgICBjd2Q6IF9fZGlybmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiAnbWVudS13Y19lczUuanMnLFxuICAgICAgICAgICAgcHJlc2V0czogW1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJ0BiYWJlbC9wcmVzZXQtZW52JyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllOiAnMTEnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJ0BiYWJlbC9wbHVnaW4tdHJhbnNmb3JtLXByaXZhdGUtbWV0aG9kcycsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3NlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NNZW51KG1haW5EYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIG1lbnUuLi4nKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmVQcm9jZXNzTWVudSwgcmVqZWN0UHJvY2Vzc01lbnUpID0+IHtcbiAgICAgICAgICAgIGxldCBvdXRwdXQgPSBtYWluRGF0YS5vdXRwdXQuc2xpY2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dExhc3RDaGFyYWN0ZXIgPSBvdXRwdXQubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRMYXN0Q2hhcmFjdGVyICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaW5hbFBhdGhFUzYgPSBgJHtvdXRwdXR9L2pzL21lbnUtd2MuanNgO1xuICAgICAgICAgICAgY29uc3QgZmluYWxQYXRoRVM1ID0gYCR7b3V0cHV0fS9qcy9tZW51LXdjX2VzNS5qc2A7XG5cbiAgICAgICAgICAgIEh0bWxFbmdpbmUucmVuZGVyTWVudShDb25maWd1cmF0aW9uLm1haW5EYXRhLnRlbXBsYXRlcywgbWFpbkRhdGEpXG4gICAgICAgICAgICAgICAgLnRoZW4oaHRtbERhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBGaWxlRW5naW5lLndyaXRlKGZpbmFsUGF0aEVTNiwgaHRtbERhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc3BpbGVNZW51V0NUb0VTNShodG1sRGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZXM1RGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRW5naW5lLndyaXRlKGZpbmFsUGF0aEVTNSwgZXM1RGF0YS5jb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb2Nlc3NNZW51KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGR1cmluZyAnICsgZmluYWxQYXRoRVM1ICsgJyBwYWdlIGdlbmVyYXRpb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0UHJvY2Vzc01lbnUoJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZHVyaW5nICcgKyBmaW5hbFBhdGhFUzUgKyAnIHBhZ2UgZ2VuZXJhdGlvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RQcm9jZXNzTWVudSgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nICcgKyBmaW5hbFBhdGhFUzYgKyAnIHBhZ2UgZ2VuZXJhdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RQcm9jZXNzTWVudSgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyAnICsgZmluYWxQYXRoRVM2ICsgJyBwYWdlIGdlbmVyYXRpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RQcm9jZXNzTWVudSgnJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcm9jZXNzQWRkaXRpb25hbFBhZ2VzKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBhZGRpdGlvbmFsIHBhZ2VzJyk7XG4gICAgICAgIGxldCBwYWdlcyA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzO1xuICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHBhZ2VzLm1hcChwYWdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWdlKHBhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGFnZS5jaGlsZHJlbi5tYXAoY2hpbGRQYWdlID0+IHRoaXMucHJvY2Vzc1BhZ2UoY2hpbGRQYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1BhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZS5nZW5lcmF0ZVNlYXJjaEluZGV4SnNvbihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Fzc2V0c0ZvbGRlcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Jlc291cmNlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NBc3NldHNGb2xkZXIoKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5IGFzc2V0cyBmb2xkZXInKTtcblxuICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlcikpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgUHJvdmlkZWQgYXNzZXRzIGZvbGRlciAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyfSBkaWQgbm90IGV4aXN0YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmaW5hbE91dHB1dCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuXG4gICAgICAgICAgICBsZXQgdGVzdE91dHB1dERpciA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lm1hdGNoKGN3ZCk7XG5cbiAgICAgICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQucmVwbGFjZShjd2QgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBmaW5hbE91dHB1dCxcbiAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZzLmNvcHkoXG4gICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyKSxcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZGVzdGluYXRpb24pLFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nIHJlc291cmNlcyBjb3B5ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NSZXNvdXJjZXMoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5IG1haW4gcmVzb3VyY2VzJyk7XG5cbiAgICAgICAgY29uc3Qgb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICdEb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgK1xuICAgICAgICAgICAgICAgICAgICAnIGluICcgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEVsYXBzZWRUaW1lKCkgK1xuICAgICAgICAgICAgICAgICAgICAnIHNlY29uZHMgdXNpbmcgJyArXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGhlbWUgK1xuICAgICAgICAgICAgICAgICAgICAnIHRoZW1lJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0fSBhdCBodHRwOi8vJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3RuYW1lfToke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bldlYlNlcnZlcihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZENhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGZpbmFsT3V0cHV0ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQ7XG5cbiAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dC5tYXRjaChjd2QpO1xuXG4gICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmluYWxPdXRwdXQgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dC5yZXBsYWNlKGN3ZCArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKF9fZGlybmFtZSArICcvLi4vc3JjL3Jlc291cmNlcy8nKSxcbiAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE91dHB1dCksXG4gICAgICAgICAgICBlcnJvckNvcHkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNvcHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgcmVzb3VyY2VzIGNvcHkgJywgZXJyb3JDb3B5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRUaGVtZVByb21pc2UgPSBuZXcgUHJvbWlzZSgoZXh0VGhlbWVSZXNvbHZlLCBleHRUaGVtZVJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXh0VGhlbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoY3dkICsgcGF0aC5zZXAgKyBDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4dFRoZW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGZpbmFsT3V0cHV0ICsgJy9zdHlsZXMvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlcnJvckNvcHlUaGVtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29weVRoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZHVyaW5nIGV4dGVybmFsIHN0eWxpbmcgdGhlbWUgY29weSAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcHlUaGVtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0VGhlbWVSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0V4dGVybmFsIHN0eWxpbmcgdGhlbWUgY29weSBzdWNjZWVkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRUaGVtZVJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRUaGVtZVJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZhdmljb25Qcm9taXNlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY3VzdG9tRmF2aWNvblJlc29sdmUsIGN1c3RvbUZhdmljb25SZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21GYXZpY29uICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgQ3VzdG9tIGZhdmljb24gc3VwcGxpZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY29weShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QgKyBwYXRoLnNlcCArIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY3VzdG9tRmF2aWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE91dHB1dCArICcvaW1hZ2VzL2Zhdmljb24uaWNvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcHlGYXZpY29uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29weUZhdmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGR1cmluZyByZXNvdXJjZXMgY29weSBvZiBmYXZpY29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29weUZhdmljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmF2aWNvblJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdFeHRlcm5hbCBjdXN0b20gZmF2aWNvbiBjb3B5IHN1Y2NlZWRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21GYXZpY29uUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmF2aWNvblJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUxvZ29Qcm9taXNlID0gbmV3IFByb21pc2UoKGN1c3RvbUxvZ29SZXNvbHZlLCBjdXN0b21Mb2dvUmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21Mb2dvICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBDdXN0b20gbG9nbyBzdXBwbGllZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNvcHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShjd2QgKyBwYXRoLnNlcCArIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY3VzdG9tTG9nbyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ltYWdlcy8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUxvZ28uc3BsaXQoJy8nKS5wb3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcHlMb2dvID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvcHlMb2dvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZHVyaW5nIHJlc291cmNlcyBjb3B5IG9mIGxvZ28nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcHlMb2dvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21Mb2dvUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdFeHRlcm5hbCBjdXN0b20gbG9nbyBjb3B5IHN1Y2NlZWRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUxvZ29SZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tTG9nb1Jlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFtleHRUaGVtZVByb21pc2UsIGN1c3RvbUZhdmljb25Qcm9taXNlLCBjdXN0b21Mb2dvUHJvbWlzZV0pLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gd2FzIHN0YXJ0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RWxhcHNlZFRpbWUoKSB7XG4gICAgICAgIHJldHVybiAobmV3IERhdGUoKS52YWx1ZU9mKCkgLSBzdGFydFRpbWUudmFsdWVPZigpKSAvIDEwMDA7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NHcmFwaHMoKSB7XG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVHcmFwaCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0dyYXBoIGdlbmVyYXRpb24gZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhZ2VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBtYWluIGdyYXBoJyk7XG4gICAgICAgICAgICBsZXQgbW9kdWxlcyA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlcztcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBtb2R1bGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDw9IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgbW9kdWxlIGdyYXBoICcsIG1vZHVsZXNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbFBhdGggPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lmxhc3RJbmRleE9mKCcvJykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFBhdGggKz0gJy8nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsUGF0aCArPSAnbW9kdWxlcy8nICsgbW9kdWxlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgX3Jhd01vZHVsZSA9IERlcGVuZGVuY2llc0VuZ2luZS5nZXRSYXdNb2R1bGUobW9kdWxlc1tpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5kZWNsYXJhdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5ib290c3RyYXAubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5pbXBvcnRzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUuZXhwb3J0cy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLnByb3ZpZGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTmdkRW5naW5lLnJlbmRlckdyYXBoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbaV0uZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbaV0ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmdkRW5naW5lLnJlYWRHcmFwaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbFBhdGggKyBwYXRoLnNlcCArICdkZXBlbmRlbmNpZXMuc3ZnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzW2ldLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlc1tpXS5ncmFwaCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nIGdyYXBoIHJlYWQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFnZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGZpbmFsTWFpbkdyYXBoUGF0aCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuICAgICAgICAgICAgaWYgKGZpbmFsTWFpbkdyYXBoUGF0aC5sYXN0SW5kZXhPZignLycpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGZpbmFsTWFpbkdyYXBoUGF0aCArPSAnLyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbE1haW5HcmFwaFBhdGggKz0gJ2dyYXBoJztcbiAgICAgICAgICAgIE5nZEVuZ2luZS5pbml0KHBhdGgucmVzb2x2ZShmaW5hbE1haW5HcmFwaFBhdGgpKTtcblxuICAgICAgICAgICAgTmdkRW5naW5lLnJlbmRlckdyYXBoKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcsXG4gICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGZpbmFsTWFpbkdyYXBoUGF0aCksXG4gICAgICAgICAgICAgICAgJ3AnXG4gICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBOZ2RFbmdpbmUucmVhZEdyYXBoKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGZpbmFsTWFpbkdyYXBoUGF0aCArIHBhdGguc2VwICsgJ2RlcGVuZGVuY2llcy5zdmcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdNYWluIGdyYXBoJ1xuICAgICAgICAgICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1haW5HcmFwaCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgbWFpbiBncmFwaCByZWFkaW5nIDogJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVNYWluR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdPb29wcyBlcnJvciBkdXJpbmcgbWFpbiBncmFwaCBnZW5lcmF0aW9uLCBtb3Zpbmcgb24gbmV4dCBwYXJ0IHdpdGggbWFpbiBncmFwaCBkaXNhYmxlZCA6ICcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTWFpbkdyYXBoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcnVuV2ViU2VydmVyKGZvbGRlcikge1xuICAgICAgICBpZiAoIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgbGV0IGxpdmVTZXJ2ZXJDb25maWd1cmF0aW9uOiBMaXZlU2VydmVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICByb290OiBmb2xkZXIsXG4gICAgICAgICAgICAgICAgb3BlbjogQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuLFxuICAgICAgICAgICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvZ0xldmVsOiAwLFxuICAgICAgICAgICAgICAgIHdhaXQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgcG9ydDogQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wb3J0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBsaXZlU2VydmVyQ29uZmlndXJhdGlvbi5ob3N0ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTGl2ZVNlcnZlci5zdGFydChsaXZlU2VydmVyQ29uZmlndXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEud2F0Y2ggJiYgIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZpbGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc291cmNlcyBmaWxlcyBhdmFpbGFibGUsIHBsZWFzZSB1c2UgLXAgZmxhZycpO1xuICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bldhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS53YXRjaCAmJiB0aGlzLmlzV2F0Y2hpbmcpIHtcbiAgICAgICAgICAgIGxldCBzcmNGb2xkZXIgPSBmaW5kTWFpblNvdXJjZUZvbGRlcih0aGlzLmZpbGVzKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBBbHJlYWR5IHdhdGNoaW5nIHNvdXJjZXMgaW4gJHtzcmNGb2xkZXJ9IGZvbGRlcmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJ1bldhdGNoKCkge1xuICAgICAgICBsZXQgc291cmNlcyA9IFtmaW5kTWFpblNvdXJjZUZvbGRlcih0aGlzLmZpbGVzKV07XG4gICAgICAgIGxldCB3YXRjaGVyUmVhZHkgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmlzV2F0Y2hpbmcgPSB0cnVlO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKGBXYXRjaGluZyBzb3VyY2VzIGluICR7ZmluZE1haW5Tb3VyY2VGb2xkZXIodGhpcy5maWxlcyl9IGZvbGRlcmApO1xuXG4gICAgICAgIGlmIChNYXJrZG93bkVuZ2luZS5oYXNSb290TWFya2Rvd25zKCkpIHtcbiAgICAgICAgICAgIHNvdXJjZXMgPSBzb3VyY2VzLmNvbmNhdChNYXJrZG93bkVuZ2luZS5saXN0Um9vdE1hcmtkb3ducygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzICE9PSAnJykge1xuICAgICAgICAgICAgc291cmNlcyA9IHNvdXJjZXMuY29uY2F0KENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgYWxsIGVsZW1lbnRzIG9mIHNvdXJjZXMgbGlzdCBleGlzdFxuICAgICAgICBzb3VyY2VzID0gY2xlYW5Tb3VyY2VzRm9yV2F0Y2goc291cmNlcyk7XG5cbiAgICAgICAgbGV0IHdhdGNoZXIgPSBjaG9raWRhci53YXRjaChzb3VyY2VzLCB7XG4gICAgICAgICAgICBhd2FpdFdyaXRlRmluaXNoOiB0cnVlLFxuICAgICAgICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICAgICAgICAgIGlnbm9yZWQ6IC8oc3BlY3xcXC5kKVxcLnRzL1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHRpbWVyQWRkQW5kUmVtb3ZlUmVmO1xuICAgICAgICBsZXQgdGltZXJDaGFuZ2VSZWY7XG4gICAgICAgIGxldCBydW5uZXJBZGRBbmRSZW1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgd2FpdGVyQWRkQW5kUmVtb3ZlID0gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyQWRkQW5kUmVtb3ZlUmVmKTtcbiAgICAgICAgICAgIHRpbWVyQWRkQW5kUmVtb3ZlUmVmID0gc2V0VGltZW91dChydW5uZXJBZGRBbmRSZW1vdmUsIDEwMDApO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcnVubmVyQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VXBkYXRlZEZpbGVzKHRoaXMud2F0Y2hDaGFuZ2VkRmlsZXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzV2F0Y2hlZEZpbGVzVFNGaWxlcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNaWNyb0RlcGVuZGVuY2llc0RhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNXYXRjaGVkRmlsZXNSb290TWFya2Rvd25GaWxlcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWJ1aWxkUm9vdE1hcmtkb3ducygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRFeHRlcm5hbERvY3VtZW50YXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHdhaXRlckNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lckNoYW5nZVJlZik7XG4gICAgICAgICAgICB0aW1lckNoYW5nZVJlZiA9IHNldFRpbWVvdXQocnVubmVyQ2hhbmdlLCAxMDAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICB3YXRjaGVyLm9uKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghd2F0Y2hlclJlYWR5KSB7XG4gICAgICAgICAgICAgICAgd2F0Y2hlclJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3YXRjaGVyXG4gICAgICAgICAgICAgICAgICAgIC5vbignYWRkJywgZmlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgJHtmaWxlfSBoYXMgYmVlbiBhZGRlZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBleHRlbnNpb24sIGlmIHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjYW4gZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0ZXJBZGRBbmRSZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdjaGFuZ2UnLCBmaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmlsZSAke2ZpbGV9IGhhcyBiZWVuIGNoYW5nZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlc3QgZXh0ZW5zaW9uLCBpZiB0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzY2FuIG9ubHkgZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcubWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5leHRuYW1lKGZpbGUpID09PSAnLmpzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndhdGNoQ2hhbmdlZEZpbGVzLnB1c2gocGF0aC5qb2luKGN3ZCArIHBhdGguc2VwICsgZmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRlckNoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oJ3VubGluaycsIGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlICR7ZmlsZX0gaGFzIGJlZW4gcmVtb3ZlZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBleHRlbnNpb24sIGlmIHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjYW4gZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0ZXJBZGRBbmRSZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gLyByb290IGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXQgYXBwbGljYXRpb24oKTogQXBwbGljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXQgaXNDTEkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5cbmNvbnN0IGZnID0gcmVxdWlyZSgnZmFzdC1nbG9iJyk7XG5cbi8qKlxuICogUmVzdWx0IG9mIHBhcnNpbmcgQVBJIG1hcmtkb3duIGV4cG9ydHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNYXJrZG93bkV4cG9ydHMge1xuICAgIC8vIE1hcCBvZiBzeW1ib2wgbmFtZSB0byB0aGUgc291cmNlIGZpbGUgcGF0aHMgd2hlcmUgaXQncyBleHBvcnRlZFxuICAgIHN5bWJvbFRvRmlsZXM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PjtcbiAgICAvLyBTZXQgb2YgYWxsIHJlbGV2YW50ICouYXBpLm1kIGZpbGVzIGZvdW5kXG4gICAgYXBpTWRGaWxlczogU2V0PHN0cmluZz47XG59XG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyBmb3IgcGFyc2luZyAqLmFwaS5tZCBmaWxlcyBnZW5lcmF0ZWQgYnkgQVBJIEV4dHJhY3RvclxuICovXG5leHBvcnQgY2xhc3MgQXBpTWFya2Rvd25QYXJzZXIge1xuICAgIHByaXZhdGUgc291cmNlUm9vdDogc3RyaW5nO1xuICAgIHByaXZhdGUgc3ltYm9sVG9GaWxlczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+O1xuICAgIHByaXZhdGUgYXBpTWRGaWxlczogU2V0PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2VSb290OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VSb290ID0gcGF0aC5yZXNvbHZlKHNvdXJjZVJvb3QpO1xuICAgICAgICB0aGlzLnN5bWJvbFRvRmlsZXMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gICAgICAgIHRoaXMuYXBpTWRGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGFsbCAqLmFwaS5tZCBmaWxlcyBpbiB0aGUgc291cmNlIHJvb3QgYW5kIGV4dHJhY3QgZXhwb3J0ZWQgc3ltYm9sc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwYXJzZUFwaU1hcmtkb3duRmlsZXMoKTogUHJvbWlzZTxBcGlNYXJrZG93bkV4cG9ydHM+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFNjYW5uaW5nIGZvciAqLmFwaS5tZCBmaWxlcyBpbiAke3RoaXMuc291cmNlUm9vdH1gKTtcblxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5zb3VyY2VSb290KSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTb3VyY2Ugcm9vdCBwYXRoIGRvZXMgbm90IGV4aXN0OiAke3RoaXMuc291cmNlUm9vdH1gKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3ltYm9sVG9GaWxlczogdGhpcy5zeW1ib2xUb0ZpbGVzLFxuICAgICAgICAgICAgICAgIGFwaU1kRmlsZXM6IHRoaXMuYXBpTWRGaWxlc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgYWxsICouYXBpLm1kIGZpbGVzIHJlY3Vyc2l2ZWx5XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBwYXRoLmpvaW4odGhpcy5zb3VyY2VSb290LCAnKiovKi5hcGkubWQnKTtcbiAgICAgICAgY29uc3QgYXBpTWRGaWxlcyA9IGF3YWl0IGZnKHBhdHRlcm4sIHtcbiAgICAgICAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKGBGb3VuZCAke2FwaU1kRmlsZXMubGVuZ3RofSAqLmFwaS5tZCBmaWxlKHMpYCk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoICouYXBpLm1kIGZpbGVcbiAgICAgICAgZm9yIChjb25zdCBhcGlNZEZpbGUgb2YgYXBpTWRGaWxlcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgaXMgcmVsZXZhbnQgYmVmb3JlIGFkZGluZyBpdFxuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuaXNSZWxldmFudEFwaU1hcmtkb3duRmlsZShhcGlNZEZpbGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcGlNZEZpbGVzLmFkZChhcGlNZEZpbGUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGFyc2VBcGlNYXJrZG93bkZpbGUoYXBpTWRGaWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBTa2lwcGluZyBpcnJlbGV2YW50IEFQSSBtYXJrZG93biBmaWxlOiAke2FwaU1kRmlsZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5pbmZvKGBFeHRyYWN0ZWQgJHt0aGlzLnN5bWJvbFRvRmlsZXMuc2l6ZX0gcHVibGljIEFQSSBzeW1ib2wocykgZnJvbSAke3RoaXMuYXBpTWRGaWxlcy5zaXplfSByZWxldmFudCAqLmFwaS5tZCBmaWxlKHMpYCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN5bWJvbFRvRmlsZXM6IHRoaXMuc3ltYm9sVG9GaWxlcyxcbiAgICAgICAgICAgIGFwaU1kRmlsZXM6IHRoaXMuYXBpTWRGaWxlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGFuIEFQSSBtYXJrZG93biBmaWxlIGlzIHJlbGV2YW50IChjb250YWlucyBtZWFuaW5nZnVsIGV4cG9ydHMpXG4gICAgICogQSBmaWxlIGlzIHJlbGV2YW50IGlmIGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBleHBvcnQgdGhhdCBpczpcbiAgICAgKiAtIEEgY2xhc3MsIGludGVyZmFjZSwgZnVuY3Rpb24sIHR5cGUsIGVudW0sIG9yIHZhcmlhYmxlXG4gICAgICogLSBOb3QgYSBkZWZhdWx0IGV4cG9ydCBvZiBhbiBlbXB0eSBvYmplY3RcbiAgICAgKiAtIE5vdCBhbiBBbmd1bGFyIGludGVybmFsIHN5bWJvbCAoybVmYWMsIMm1aW5qLCDJtW1vZClcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGlzUmVsZXZhbnRBcGlNYXJrZG93bkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIFR5cGVTY3JpcHQgY29kZSBibG9jayBmcm9tIHRoZSBtYXJrZG93biBmaWxlXG4gICAgICAgICAgICBjb25zdCB0c0NvZGVCbG9jayA9IHRoaXMuZXh0cmFjdFR5cGVTY3JpcHRDb2RlQmxvY2soY29udGVudCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghdHNDb2RlQmxvY2spIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYE5vIFR5cGVTY3JpcHQgY29kZSBibG9jayBmb3VuZCBpbiAke2ZpbGVQYXRofWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUGFyc2UgdGhlIFR5cGVTY3JpcHQgY29kZSB0byBjaGVjayBmb3IgbWVhbmluZ2Z1bCBleHBvcnRzXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB0c0NvZGVCbG9jayxcbiAgICAgICAgICAgICAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGVhY2ggdG9wLWxldmVsIHN0YXRlbWVudFxuICAgICAgICAgICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNZWFuaW5nZnVsRXhwb3J0KHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGNoZWNraW5nIHJlbGV2YW5jZSBvZiAke2ZpbGVQYXRofTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgc3RhdGVtZW50IGlzIGEgbWVhbmluZ2Z1bCBleHBvcnRcbiAgICAgKiBFeGNsdWRlIGRlZmF1bHQgZXhwb3J0cyBvZiBlbXB0eSBvYmplY3RzIGFuZCBBbmd1bGFyIGludGVybmFsIHN5bWJvbHNcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzTWVhbmluZ2Z1bEV4cG9ydChzdGF0ZW1lbnQ6IHRzLk5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgY2xhc3MgRm9vIHt9XG4gICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IChzdGF0ZW1lbnQgYXMgYW55KS5uYW1lPy50ZXh0O1xuICAgICAgICAgICAgcmV0dXJuICEhbmFtZSAmJiAhdGhpcy5pc0FuZ3VsYXJJbnRlcm5hbFN5bWJvbChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgaW50ZXJmYWNlIEJhciB7fVxuICAgICAgICBpZiAodHMuaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gKHN0YXRlbWVudCBhcyBhbnkpLm5hbWU/LnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gISFuYW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBIYW5kbGU6IGV4cG9ydCBjb25zdCBiYXogPSAuLi5cbiAgICAgICAgaWYgKHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgaGFzRXhwb3J0TW9kaWZpZXIgPSAoc3RhdGVtZW50IGFzIGFueSkubW9kaWZpZXJzPy5zb21lKFxuICAgICAgICAgICAgICAgIChtOiB0cy5Nb2RpZmllcikgPT4gbS5raW5kID09PSB0cy5TeW50YXhLaW5kLkV4cG9ydEtleXdvcmRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaGFzRXhwb3J0TW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIG5vdCBqdXN0IGEgZGVmYXVsdCBleHBvcnQgb2YgYW4gZW1wdHkgb2JqZWN0XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZWNsIG9mIChzdGF0ZW1lbnQgYXMgYW55KS5kZWNsYXJhdGlvbkxpc3Q/LmRlY2xhcmF0aW9ucyB8fCBbXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZGVjbC5uYW1lPy50ZXh0O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAmJiAhdGhpcy5pc0FuZ3VsYXJJbnRlcm5hbFN5bWJvbChuYW1lKSAmJiBuYW1lICE9PSAnX2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgZnVuY3Rpb24gZm9vKCkge31cbiAgICAgICAgaWYgKHRzLmlzRnVuY3Rpb25EZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gKHN0YXRlbWVudCBhcyBhbnkpLm5hbWU/LnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gISFuYW1lICYmICF0aGlzLmlzQW5ndWxhckludGVybmFsU3ltYm9sKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBIYW5kbGU6IGV4cG9ydCB0eXBlIEZvb1R5cGUgPSAuLi5cbiAgICAgICAgaWYgKHRzLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IChzdGF0ZW1lbnQgYXMgYW55KS5uYW1lPy50ZXh0O1xuICAgICAgICAgICAgcmV0dXJuICEhbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgZW51bSBGb29FbnVtIHt9XG4gICAgICAgIGlmICh0cy5pc0VudW1EZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gKHN0YXRlbWVudCBhcyBhbnkpLm5hbWU/LnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gISFuYW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBIYW5kbGU6IGV4cG9ydCB7IEZvbywgQmFyIH1cbiAgICAgICAgaWYgKHRzLmlzRXhwb3J0RGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0Q2xhdXNlID0gKHN0YXRlbWVudCBhcyBhbnkpLmV4cG9ydENsYXVzZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcDogZXhwb3J0IGRlZmF1bHQgX2RlZmF1bHRcbiAgICAgICAgICAgIGlmICgoc3RhdGVtZW50IGFzIGFueSkuaXNUeXBlT25seSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIG5hbWVkIGV4cG9ydCBkZWNsYXJhdGlvblxuICAgICAgICAgICAgaWYgKGV4cG9ydENsYXVzZSAmJiB0cy5pc05hbWVkRXhwb3J0cyhleHBvcnRDbGF1c2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBleHBvcnRDbGF1c2UuZWxlbWVudHM7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbGVtZW50Lm5hbWU/LnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmICF0aGlzLmlzQW5ndWxhckludGVybmFsU3ltYm9sKG5hbWUpICYmIG5hbWUgIT09ICdfZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEhhbmRsZTogZXhwb3J0IGRlZmF1bHQgRm9vXG4gICAgICAgIGlmICh0cy5pc0V4cG9ydEFzc2lnbm1lbnQoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgX2RlZmF1bHQgaXMgbm90IG1lYW5pbmdmdWxcbiAgICAgICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIoKHN0YXRlbWVudCBhcyBhbnkpLmV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IChzdGF0ZW1lbnQgYXMgYW55KS5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdfZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNBbmd1bGFySW50ZXJuYWxTeW1ib2wobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBzeW1ib2wgaXMgYW4gQW5ndWxhciBpbnRlcm5hbCBzeW1ib2xcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzQW5ndWxhckludGVybmFsU3ltYm9sKHN5bWJvbE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBBbmd1bGFyIGludGVybmFsIHN5bWJvbHMgc3RhcnQgd2l0aCDJtVxuICAgICAgICByZXR1cm4gc3ltYm9sTmFtZS5zdGFydHNXaXRoKCfJtScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgdGhlIFR5cGVTY3JpcHQgY29kZSBibG9jayBmcm9tIGEgbWFya2Rvd24gZmlsZVxuICAgICAqIEFQSSBFeHRyYWN0b3IgbWFya2Rvd24gZmlsZXMgaGF2ZSBUeXBlU2NyaXB0IGNvZGUgaW4gYSBgYGB0cyBibG9ja1xuICAgICAqXG4gICAgICogTm90ZTogVXNlcyBzdHJpbmctYmFzZWQgcGFyc2luZyBpbnN0ZWFkIG9mIHJlZ2V4IHRvIGF2b2lkIFJlRG9TIHZ1bG5lcmFiaWxpdGllc1xuICAgICAqIHRoYXQgY2FuIG9jY3VyIHdpdGggcGF0dGVybnMgbGlrZSAvYGBgdHNcXHMqXFxuKFtcXHNcXFNdKj8pXFxuYGBgLyBvbiBtYWxmb3JtZWQgaW5wdXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0VHlwZVNjcmlwdENvZGVCbG9jayhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgLy8gRmluZCB0aGUgb3BlbmluZyBtYXJrZXIgKGBgYHRzIG9yIGBgYHR5cGVzY3JpcHQpXG4gICAgICAgIGNvbnN0IG9wZW5NYXJrZXJzID0gWydgYGB0c1xcbicsICdgYGB0c1xcclxcbicsICdgYGB0eXBlc2NyaXB0XFxuJywgJ2BgYHR5cGVzY3JpcHRcXHJcXG4nXTtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAtMTtcbiAgICAgICAgbGV0IG1hcmtlckxlbmd0aCA9IDA7XG5cbiAgICAgICAgZm9yIChjb25zdCBtYXJrZXIgb2Ygb3Blbk1hcmtlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGNvbnRlbnQuaW5kZXhPZihtYXJrZXIpO1xuICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEgJiYgKHN0YXJ0SW5kZXggPT09IC0xIHx8IGlkeCA8IHN0YXJ0SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGlkeDtcbiAgICAgICAgICAgICAgICBtYXJrZXJMZW5ndGggPSBtYXJrZXIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgdGhlIGNsb3NpbmcgbWFya2VyIChgYGAgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSlcbiAgICAgICAgY29uc3QgY29udGVudFN0YXJ0ID0gc3RhcnRJbmRleCArIG1hcmtlckxlbmd0aDtcbiAgICAgICAgY29uc3QgY2xvc2VNYXJrZXIgPSAnXFxuYGBgJztcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBjb250ZW50LmluZGV4T2YoY2xvc2VNYXJrZXIsIGNvbnRlbnRTdGFydCk7XG5cbiAgICAgICAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2RlQmxvY2sgPSBjb250ZW50LnNsaWNlKGNvbnRlbnRTdGFydCwgZW5kSW5kZXgpO1xuXG4gICAgICAgIC8vIFJldHVybiBudWxsIGZvciBlbXB0eSBjb2RlIGJsb2Nrc1xuICAgICAgICBpZiAoIWNvZGVCbG9jay50cmltKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvZGVCbG9jaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBhIHNpbmdsZSAqLmFwaS5tZCBmaWxlIGFuZCBleHRyYWN0IGl0cyBleHBvcnRzXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBwYXJzZUFwaU1hcmtkb3duRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgUGFyc2luZyBBUEkgbWFya2Rvd24gZmlsZTogJHtmaWxlUGF0aH1gKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICBjb25zdCB0c0NvZGVCbG9jayA9IHRoaXMuZXh0cmFjdFR5cGVTY3JpcHRDb2RlQmxvY2soY29udGVudCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghdHNDb2RlQmxvY2spIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYE5vIFR5cGVTY3JpcHQgY29kZSBibG9jayBmb3VuZCBpbiAke2ZpbGVQYXRofWApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgICAgICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgdHNDb2RlQmxvY2ssXG4gICAgICAgICAgICAgICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBQcm9jZXNzIGFsbCB0b3AtbGV2ZWwgc3RhdGVtZW50cyBpbiB0aGUgZmlsZVxuICAgICAgICAgICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RhdGVtZW50KHN0YXRlbWVudCwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciBwYXJzaW5nIEFQSSBtYXJrZG93biBmaWxlICR7ZmlsZVBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBhIFR5cGVTY3JpcHQgc3RhdGVtZW50IHRvIGV4dHJhY3QgZXhwb3J0c1xuICAgICAqL1xuICAgIHByaXZhdGUgcHJvY2Vzc1N0YXRlbWVudChzdGF0ZW1lbnQ6IHRzLk5vZGUsIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgY2xhc3MgRm9vIHt9XG4gICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IChzdGF0ZW1lbnQgYXMgYW55KS5uYW1lPy50ZXh0O1xuICAgICAgICAgICAgaWYgKG5hbWUgJiYgIXRoaXMuaXNBbmd1bGFySW50ZXJuYWxTeW1ib2wobmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFN5bWJvbChuYW1lLCBzb3VyY2VGaWxlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgaW50ZXJmYWNlIEJhciB7fVxuICAgICAgICBlbHNlIGlmICh0cy5pc0ludGVyZmFjZURlY2xhcmF0aW9uKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSAoc3RhdGVtZW50IGFzIGFueSkubmFtZT8udGV4dDtcbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2wobmFtZSwgc291cmNlRmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZTogZXhwb3J0IGNvbnN0IGJheiA9IC4uLlxuICAgICAgICBlbHNlIGlmICh0cy5pc1ZhcmlhYmxlU3RhdGVtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc0V4cG9ydE1vZGlmaWVyID0gKHN0YXRlbWVudCBhcyBhbnkpLm1vZGlmaWVycz8uc29tZShcbiAgICAgICAgICAgICAgICAobTogdHMuTW9kaWZpZXIpID0+IG0ua2luZCA9PT0gdHMuU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGhhc0V4cG9ydE1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZWNsIG9mIChzdGF0ZW1lbnQgYXMgYW55KS5kZWNsYXJhdGlvbkxpc3Q/LmRlY2xhcmF0aW9ucyB8fCBbXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZGVjbC5uYW1lPy50ZXh0O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAmJiAhdGhpcy5pc0FuZ3VsYXJJbnRlcm5hbFN5bWJvbChuYW1lKSAmJiBuYW1lICE9PSAnX2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFN5bWJvbChuYW1lLCBzb3VyY2VGaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlOiBleHBvcnQgZnVuY3Rpb24gZm9vKCkge31cbiAgICAgICAgZWxzZSBpZiAodHMuaXNGdW5jdGlvbkRlY2xhcmF0aW9uKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSAoc3RhdGVtZW50IGFzIGFueSkubmFtZT8udGV4dDtcbiAgICAgICAgICAgIGlmIChuYW1lICYmICF0aGlzLmlzQW5ndWxhckludGVybmFsU3ltYm9sKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2wobmFtZSwgc291cmNlRmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZTogZXhwb3J0IHR5cGUgRm9vVHlwZSA9IC4uLlxuICAgICAgICBlbHNlIGlmICh0cy5pc1R5cGVBbGlhc0RlY2xhcmF0aW9uKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSAoc3RhdGVtZW50IGFzIGFueSkubmFtZT8udGV4dDtcbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2wobmFtZSwgc291cmNlRmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZTogZXhwb3J0IGVudW0gRm9vRW51bSB7fVxuICAgICAgICBlbHNlIGlmICh0cy5pc0VudW1EZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gKHN0YXRlbWVudCBhcyBhbnkpLm5hbWU/LnRleHQ7XG4gICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkU3ltYm9sKG5hbWUsIHNvdXJjZUZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGU6IGV4cG9ydCB7IEZvbywgQmFyIH1cbiAgICAgICAgZWxzZSBpZiAodHMuaXNFeHBvcnREZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICBjb25zdCBleHBvcnRDbGF1c2UgPSAoc3RhdGVtZW50IGFzIGFueSkuZXhwb3J0Q2xhdXNlO1xuICAgICAgICAgICAgaWYgKGV4cG9ydENsYXVzZSAmJiB0cy5pc05hbWVkRXhwb3J0cyhleHBvcnRDbGF1c2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBleHBvcnRDbGF1c2UuZWxlbWVudHM7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbGVtZW50Lm5hbWU/LnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmICF0aGlzLmlzQW5ndWxhckludGVybmFsU3ltYm9sKG5hbWUpICYmIG5hbWUgIT09ICdfZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU3ltYm9sKG5hbWUsIHNvdXJjZUZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGU6IGV4cG9ydCBkZWZhdWx0IEZvb1xuICAgICAgICBlbHNlIGlmICh0cy5pc0V4cG9ydEFzc2lnbm1lbnQoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgaWYgKHRzLmlzSWRlbnRpZmllcigoc3RhdGVtZW50IGFzIGFueSkuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gKHN0YXRlbWVudCBhcyBhbnkpLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSAhPT0gJ19kZWZhdWx0JyAmJiAhdGhpcy5pc0FuZ3VsYXJJbnRlcm5hbFN5bWJvbChuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZFN5bWJvbChuYW1lLCBzb3VyY2VGaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc3ltYm9sIHRvIHRoZSB0cmFja2luZyBtYXBcbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZFN5bWJvbChzeW1ib2xOYW1lOiBzdHJpbmcsIGRlY2xhcmF0aW9uRmlsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zeW1ib2xUb0ZpbGVzLmhhcyhzeW1ib2xOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5zeW1ib2xUb0ZpbGVzLnNldChzeW1ib2xOYW1lLCBuZXcgU2V0PHN0cmluZz4oKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW1ib2xUb0ZpbGVzLmdldChzeW1ib2xOYW1lKSEuYWRkKGRlY2xhcmF0aW9uRmlsZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgVHJhY2tlZCBBUEkgbWFya2Rvd24gc3ltYm9sOiAke3N5bWJvbE5hbWV9IGZyb20gJHtkZWNsYXJhdGlvbkZpbGV9YCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFBhcnNlIHB1YmxpYyBBUEkgZXhwb3J0cyBmcm9tICouYXBpLm1kIGZpbGVzIGluIHRoZSBzb3VyY2Ugcm9vdFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VBcGlNYXJrZG93bkV4cG9ydHMoc291cmNlUm9vdDogc3RyaW5nKTogUHJvbWlzZTxBcGlNYXJrZG93bkV4cG9ydHM+IHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgQXBpTWFya2Rvd25QYXJzZXIoc291cmNlUm9vdCk7XG4gICAgcmV0dXJuIGF3YWl0IHBhcnNlci5wYXJzZUFwaU1hcmtkb3duRmlsZXMoKTtcbn1cblxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9hcHAvYXBwbGljYXRpb24nO1xuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi9hcHAvY29uZmlndXJhdGlvbic7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2FwcC9lbmdpbmVzL2ZpbGUuZW5naW5lJztcbmltcG9ydCBJMThuRW5naW5lIGZyb20gJy4vYXBwL2VuZ2luZXMvaTE4bi5lbmdpbmUnO1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRmlsZUludGVyZmFjZSB9IGZyb20gJy4vYXBwL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi1maWxlLmludGVyZmFjZSc7XG5pbXBvcnQgQW5ndWxhclZlcnNpb25VdGlsIGZyb20gJy4vdXRpbHMvYW5ndWxhci12ZXJzaW9uLnV0aWwnO1xuaW1wb3J0IHsgQ09NUE9ET0NfREVGQVVMVFMgfSBmcm9tICcuL3V0aWxzL2RlZmF1bHRzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vdXRpbHMvbG9nZ2VyJztcblxuaW1wb3J0IHsgcmVhZENvbmZpZywgRVhDTFVERV9QQVRURVJOUywgSU5DTFVERV9QQVRURVJOUyB9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsgcGFyc2VQdWJsaWNBcGkgfSBmcm9tICcuL3V0aWxzL3B1YmxpYy1hcGktcGFyc2VyLnV0aWwnO1xuaW1wb3J0IHsgcGFyc2VBcGlNYXJrZG93bkV4cG9ydHMgfSBmcm9tICcuL3V0aWxzL2FwaS1tYXJrZG93bi1wYXJzZXIudXRpbCc7XG5pbXBvcnQgeyBjcmVhdGVTb3VyY2VQYXRoTWFwcGVyIH0gZnJvbSAnLi91dGlscy9zb3VyY2UtcGF0aC1tYXBwZXIudXRpbCc7XG5cbmltcG9ydCB7IGNvc21pY29uZmlnU3luYyB9IGZyb20gJ2Nvc21pY29uZmlnJztcblxuY29uc3QgZmcgPSByZXF1aXJlKCdmYXN0LWdsb2InKTtcbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbmNvbnN0IG9zTmFtZSA9IHJlcXVpcmUoJ29zLW5hbWUnKTtcbmNvbnN0IHBrZyA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3QgeyBwcm9ncmFtIH0gPSByZXF1aXJlKCdjb21tYW5kZXInKTtcblxuY29uc3QgY29zbWljb25maWdNb2R1bGVOYW1lID0gJ2NvbXBvZG9jJztcblxubGV0IHNjYW5uZWRGaWxlcyA9IFtdO1xubGV0IGV4Y2x1ZGVGaWxlcyA9IEVYQ0xVREVfUEFUVEVSTlM7XG5sZXQgaW5jbHVkZUZpbGVzID0gW107XG5sZXQgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxucHJvY2Vzcy5zZXRNYXhMaXN0ZW5lcnMoMCk7XG5cbmV4cG9ydCBjbGFzcyBDbGlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBSdW4gY29tcG9kb2MgZnJvbSB0aGUgY29tbWFuZCBsaW5lLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBzdGFydCgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBmdW5jdGlvbiBsaXN0KHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbVxuICAgICAgICAgICAgLnZlcnNpb24ocGtnLnZlcnNpb24pXG4gICAgICAgICAgICAudXNhZ2UoJzxzcmM+IFtvcHRpb25zXScpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctYywgLS1jb25maWcgW2NvbmZpZ10nLFxuICAgICAgICAgICAgICAgICdBIGNvbmZpZ3VyYXRpb24gZmlsZSA6IC5jb21wb2RvY3JjLCAuY29tcG9kb2NyYy5qc29uLCAuY29tcG9kb2NyYy55YW1sIG9yIGNvbXBvZG9jIHByb3BlcnR5IGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy1wLCAtLXRzY29uZmlnIFtjb25maWddJywgJ0EgdHNjb25maWcuanNvbiBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1kLCAtLW91dHB1dCBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ1doZXJlIHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZm9sZGVyXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCcteSwgLS1leHRUaGVtZSBbZmlsZV0nLCAnRXh0ZXJuYWwgc3R5bGluZyB0aGVtZSBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1uLCAtLW5hbWUgW25hbWVdJywgJ1RpdGxlIGRvY3VtZW50YXRpb24nLCBDT01QT0RPQ19ERUZBVUxUUy50aXRsZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1hLCAtLWFzc2V0c0ZvbGRlciBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ0V4dGVybmFsIGFzc2V0cyBmb2xkZXIgdG8gY29weSBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBmb2xkZXInXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctbywgLS1vcGVuIFt2YWx1ZV0nLCAnT3BlbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLXQsIC0tc2lsZW50JyxcbiAgICAgICAgICAgICAgICBcIkluIHNpbGVudCBtb2RlLCBsb2cgbWVzc2FnZXMgYXJlbid0IGxvZ2dlZCBpbiB0aGUgY29uc29sZVwiLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLnNpbGVudFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLXMsIC0tc2VydmUnLFxuICAgICAgICAgICAgICAgICdTZXJ2ZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiAoZGVmYXVsdCBodHRwOi8vbG9jYWxob3N0OjgwODAvKScsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuc2VydmVcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0taG9zdCBbaG9zdF0nLCAnQ2hhbmdlIGRlZmF1bHQgaG9zdCBhZGRyZXNzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1yLCAtLXBvcnQgW3BvcnRdJywgJ0NoYW5nZSBkZWZhdWx0IHNlcnZpbmcgcG9ydCcsIENPTVBPRE9DX0RFRkFVTFRTLnBvcnQpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctdywgLS13YXRjaCcsXG4gICAgICAgICAgICAgICAgJ1dhdGNoIHNvdXJjZSBmaWxlcyBhZnRlciBzZXJ2ZSBhbmQgZm9yY2UgZG9jdW1lbnRhdGlvbiByZWJ1aWxkJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy53YXRjaFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLWUsIC0tZXhwb3J0Rm9ybWF0IFtmb3JtYXRdJyxcbiAgICAgICAgICAgICAgICAnRXhwb3J0IGluIHNwZWNpZmllZCBmb3JtYXQgKGpzb24sIGh0bWwpJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZmlsZXMgW2ZpbGVzXScsICdGaWxlcyBwcm92aWRlZCBieSBleHRlcm5hbCB0b29sLCB1c2VkIGZvciBjb3ZlcmFnZSB0ZXN0JylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tbGFuZ3VhZ2UgW2xhbmd1YWdlXScsXG4gICAgICAgICAgICAgICAgJ0xhbmd1YWdlIHVzZWQgZm9yIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiAoYmctQkcsIGRlLURFLCBlbi1VUywgZXMtRVMsIGZyLUZSLCBodS1IVSwgaXQtSVQsIGphLUpQLCBrYS1HRSwga28tS1IsIG5sLU5MLCBwbC1QTCwgcHQtQlIsIHJ1LVJVLCBzay1TSywgemgtQ04sIHpoLVRXKScsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMubGFuZ3VhZ2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdGhlbWUgW3RoZW1lXScsXG4gICAgICAgICAgICAgICAgXCJDaG9vc2Ugb25lIG9mIGF2YWlsYWJsZSB0aGVtZXMsIGRlZmF1bHQgaXMgJ2dpdGJvb2snIChsYXJhdmVsLCBvcmlnaW5hbCwgbWF0ZXJpYWwsIHBvc3RtYXJrLCByZWFkdGhlZG9jcywgc3RyaXBlLCB2YWdyYW50KVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWhpZGVHZW5lcmF0b3InLFxuICAgICAgICAgICAgICAgICdEbyBub3QgcHJpbnQgdGhlIENvbXBvZG9jIGxpbmsgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZScsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuaGlkZUdlbmVyYXRvclxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1oaWRlRGFya01vZGVUb2dnbGUnLFxuICAgICAgICAgICAgICAgICdEbyBub3Qgc2hvdyBkYXJrIG1vZGUgdG9nZ2xlIGJ1dHRvbiBhdCB0aGUgdG9wIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBwYWdlJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5oaWRlRGFya01vZGVUb2dnbGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdG9nZ2xlTWVudUl0ZW1zIDxpdGVtcz4nLFxuICAgICAgICAgICAgICAgIFwiQ2xvc2UgYnkgZGVmYXVsdCBpdGVtcyBpbiB0aGUgbWVudSB2YWx1ZXMgOiBbJ2FsbCddIG9yIG9uZSBvZiB0aGVzZSBbJ21vZHVsZXMnLCdjb21wb25lbnRzJywnZGlyZWN0aXZlcycsJ2NvbnRyb2xsZXJzJywnZW50aXRpZXMnLCdjbGFzc2VzJywnaW5qZWN0YWJsZXMnLCdndWFyZHMnLCdpbnRlcmZhY2VzJywnaW50ZXJjZXB0b3JzJywncGlwZXMnLCdtaXNjZWxsYW5lb3VzJywnYWRkaXRpb25hbFBhZ2VzJ11cIixcbiAgICAgICAgICAgICAgICBsaXN0LFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLnRvZ2dsZU1lbnVJdGVtc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1uYXZUYWJDb25maWcgPHRhYiBjb25maWdzPicsXG4gICAgICAgICAgICAgICAgYExpc3QgbmF2aWdhdGlvbiB0YWIgb2JqZWN0cyBpbiB0aGUgZGVzaXJlZCBvcmRlciB3aXRoIHR3byBzdHJpbmcgcHJvcGVydGllcyAoXCJpZFwiIGFuZCBcImxhYmVsXCIpLiBcXFxuRG91YmxlLXF1b3RlcyBtdXN0IGJlIGVzY2FwZWQgd2l0aCAnXFxcXCcuIFxcXG5BdmFpbGFibGUgdGFiIElEcyBhcmUgXCJpbmZvXCIsIFwicmVhZG1lXCIsIFwic291cmNlXCIsIFwidGVtcGxhdGVEYXRhXCIsIFwic3R5bGVEYXRhXCIsIFwidHJlZVwiLCBhbmQgXCJleGFtcGxlXCIuIFxcXG5Ob3RlOiBDZXJ0YWluIHRhYnMgd2lsbCBvbmx5IGJlIHNob3duIGlmIGFwcGxpY2FibGUgdG8gYSBnaXZlbiBkZXBlbmRlbmN5YCxcbiAgICAgICAgICAgICAgICBsaXN0LFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KENPTVBPRE9DX0RFRkFVTFRTLm5hdlRhYkNvbmZpZylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdGVtcGxhdGVzIFtmb2xkZXJdJyxcbiAgICAgICAgICAgICAgICAnUGF0aCB0byBkaXJlY3Rvcnkgb2YgSGFuZGxlYmFycyB0ZW1wbGF0ZXMgdG8gb3ZlcnJpZGUgYnVpbHQtaW4gdGVtcGxhdGVzJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLS1pbmNsdWRlcyBbcGF0aF0nLCAnUGF0aCBvZiBleHRlcm5hbCBtYXJrZG93biBmaWxlcyB0byBpbmNsdWRlJylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0taW5jbHVkZXNOYW1lIFtuYW1lXScsXG4gICAgICAgICAgICAgICAgJ05hbWUgb2YgaXRlbSBtZW51IG9mIGV4dGVybmFscyBtYXJrZG93biBmaWxlcycsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5TmFtZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1jb3ZlcmFnZVRlc3QgW3RocmVzaG9sZF0nLFxuICAgICAgICAgICAgICAgICdUZXN0IGNvbW1hbmQgb2YgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSB3aXRoIGEgdGhyZXNob2xkIChkZWZhdWx0IDcwKSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSBbbWluaW11bV0nLFxuICAgICAgICAgICAgICAgICdUZXN0IGNvbW1hbmQgb2YgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSB3aXRoIGEgbWluaW11bSAoZGVmYXVsdCAwKSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCBbdHJ1ZXxmYWxzZV0nLFxuICAgICAgICAgICAgICAgICdUZXN0IGNvbW1hbmQgb2YgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSAoZ2xvYmFsIG9yIHBlciBmaWxlKSB3aWxsIGZhaWwgd2l0aCBlcnJvciBvciBqdXN0IHdhcm4gdXNlciAodHJ1ZTogZXJyb3IsIGZhbHNlOiB3YXJuKScsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLS1jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCcsICdEaXNwbGF5IG9ubHkgZmFpbGVkIGZpbGVzIGZvciBhIGNvdmVyYWdlIHRlc3QnKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS11bml0VGVzdENvdmVyYWdlIFtqc29uLXN1bW1hcnldJyxcbiAgICAgICAgICAgICAgICAnVG8gaW5jbHVkZSB1bml0IHRlc3QgY292ZXJhZ2UsIHNwZWNpZnkgaXN0YW5idWwgSlNPTiBjb3ZlcmFnZSBzdW1tYXJ5IGZpbGUnXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWRpc2FibGVTb3VyY2VDb2RlJyxcbiAgICAgICAgICAgICAgICAnRG8gbm90IGFkZCBzb3VyY2UgY29kZSB0YWIgYW5kIGxpbmtzIHRvIHNvdXJjZSBjb2RlJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlU291cmNlQ29kZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlRG9tVHJlZScsICdEbyBub3QgYWRkIGRvbSB0cmVlIHRhYicsIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVEb21UcmVlKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlVGVtcGxhdGVUYWInLCAnRG8gbm90IGFkZCB0ZW1wbGF0ZSB0YWInLCBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlVGVtcGxhdGVUYWIpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVTdHlsZVRhYicsICdEbyBub3QgYWRkIHN0eWxlIHRhYicsIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVTdHlsZVRhYilcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZUdyYXBoJywgJ0RvIG5vdCBhZGQgdGhlIGRlcGVuZGVuY3kgZ3JhcGgnLCBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlR3JhcGgpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVDb3ZlcmFnZScsICdEbyBub3QgYWRkIHRoZSBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHJlcG9ydCcsIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVDb3ZlcmFnZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZVByaXZhdGUnLCAnRG8gbm90IHNob3cgcHJpdmF0ZSBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVQcml2YXRlKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlUHJvdGVjdGVkJywgJ0RvIG5vdCBzaG93IHByb3RlY3RlZCBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVQcm90ZWN0ZWQpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVJbnRlcm5hbCcsICdEbyBub3Qgc2hvdyBAaW50ZXJuYWwgaW4gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nLCBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlSW50ZXJuYWwpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWRpc2FibGVMaWZlQ3ljbGVIb29rcycsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBzaG93IEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2tzIGluIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlTGlmZUN5Y2xlSG9va3NcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tZGlzYWJsZUNvbnN0cnVjdG9ycycsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBzaG93IGNvbnN0cnVjdG9ycyBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZUNvbnN0cnVjdG9yc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1kaXNhYmxlUm91dGVzR3JhcGgnLFxuICAgICAgICAgICAgICAgICdEbyBub3QgYWRkIHRoZSByb3V0ZXMgZ3JhcGgnLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVSb3V0ZXNHcmFwaFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlU2VhcmNoJywgJ0RvIG5vdCBhZGQgdGhlIHNlYXJjaCBpbnB1dCcsIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVTZWFyY2gpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWRpc2FibGVEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgICdEbyBub3QgYWRkIHRoZSBkZXBlbmRlbmNpZXMgbGlzdCcsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZURlcGVuZGVuY2llc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1kaXNhYmxlUHJvcGVydGllcycsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBhZGQgdGhlIHByb3BlcnRpZXMgbGlzdCcsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVByb3BlcnRpZXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZUZpbGVQYXRoJywgJ0RvIG5vdCBhZGQgdGhlIGZpbGUgcGF0aCcsIENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVGaWxlUGF0aClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZU92ZXJ2aWV3JywgJ0RvIG5vdCBhZGQgdGhlIG92ZXJ2aWV3IHBhZ2UnLCBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlT3ZlcnZpZXcpXG4gICAgICAgICAgICAub3B0aW9uKCctLXRlbXBsYXRlUGxheWdyb3VuZCcsICdHZW5lcmF0ZSB0ZW1wbGF0ZSBwbGF5Z3JvdW5kIHBhZ2UgZm9yIGN1c3RvbWl6aW5nIHRlbXBsYXRlcycsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1taW5pbWFsJyxcbiAgICAgICAgICAgICAgICAnTWluaW1hbCBtb2RlIHdpdGggb25seSBkb2N1bWVudGF0aW9uLiBObyBzZWFyY2gsIG5vIGdyYXBoLCBubyBjb3ZlcmFnZS4nLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLm1pbmltYWxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY3VzdG9tRmF2aWNvbiBbcGF0aF0nLCAnVXNlIGEgY3VzdG9tIGZhdmljb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1jdXN0b21Mb2dvIFtwYXRoXScsICdVc2UgYSBjdXN0b20gbG9nbycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWdhSUQgW2lkXScsICdHb29nbGUgQW5hbHl0aWNzIHRyYWNraW5nIElEJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZ2FTaXRlIFtzaXRlXScsICdHb29nbGUgQW5hbHl0aWNzIHNpdGUgbmFtZScsIENPTVBPRE9DX0RFRkFVTFRTLmdhU2l0ZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcHVibGljQXBpT25seSBbcGF0aF0nLCAnRG9jdW1lbnQgb25seSBzeW1ib2xzIGV4cG9ydGVkIGZyb20gaW5kZXguZC50cyBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpc3QgZm9sZGVyJylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tbWF4U2VhcmNoUmVzdWx0cyBbbWF4U2VhcmNoUmVzdWx0c10nLFxuICAgICAgICAgICAgICAgICdNYXggc2VhcmNoIHJlc3VsdHMgb24gdGhlIHJlc3VsdHMgcGFnZS4gVG8gc2hvdyBhbGwgcmVzdWx0cywgc2V0IHRvIDAnLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLm1heFNlYXJjaFJlc3VsdHNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hbGxvd0V4Y2Vzc0FyZ3VtZW50cygpXG4gICAgICAgICAgICAucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuICAgICAgICBsZXQgb3V0cHV0SGVscCA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyYW0ub3V0cHV0SGVscCgpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZ0V4cGxvcmVyID0gY29zbWljb25maWdTeW5jKGNvc21pY29uZmlnTW9kdWxlTmFtZSk7XG5cbiAgICAgICAgbGV0IGNvbmZpZ0V4cGxvcmVyUmVzdWx0O1xuXG4gICAgICAgIGxldCBjb25maWdGaWxlOiBDb25maWd1cmF0aW9uRmlsZUludGVyZmFjZSA9IHt9O1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW1PcHRpb25zID0gcHJvZ3JhbS5vcHRzKCk7XG5cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvbmZpZykge1xuICAgICAgICAgICAgbGV0IGNvbmZpZ0ZpbGVQYXRoID0gcHJvZ3JhbU9wdGlvbnMuY29uZmlnO1xuICAgICAgICAgICAgbGV0IHRlc3RDb25maWdGaWxlUGF0aCA9IGNvbmZpZ0ZpbGVQYXRoLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgaWYgKHRlc3RDb25maWdGaWxlUGF0aCAmJiB0ZXN0Q29uZmlnRmlsZVBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gY29uZmlnRmlsZVBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0V4cGxvcmVyUmVzdWx0ID0gY29uZmlnRXhwbG9yZXIubG9hZChwYXRoLnJlc29sdmUoY29uZmlnRmlsZVBhdGgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0V4cGxvcmVyUmVzdWx0ID0gY29uZmlnRXhwbG9yZXIuc2VhcmNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRXhwbG9yZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnRXhwbG9yZXJSZXN1bHQuY29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUgPSBjb25maWdFeHBsb3JlclJlc3VsdC5jb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5vdXRwdXQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0ID0gY29uZmlnRmlsZS5vdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLm91dHB1dCAmJiBwcm9ncmFtT3B0aW9ucy5vdXRwdXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmZvbGRlcikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgPSBwcm9ncmFtT3B0aW9ucy5vdXRwdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5leHRUaGVtZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHRUaGVtZSA9IGNvbmZpZ0ZpbGUuZXh0VGhlbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmV4dFRoZW1lKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4dFRoZW1lID0gcHJvZ3JhbU9wdGlvbnMuZXh0VGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5sYW5ndWFnZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5sYW5ndWFnZSA9IGNvbmZpZ0ZpbGUubGFuZ3VhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmxhbmd1YWdlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmxhbmd1YWdlID0gcHJvZ3JhbU9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS50aGVtZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS50aGVtZSA9IGNvbmZpZ0ZpbGUudGhlbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnRoZW1lKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRoZW1lID0gcHJvZ3JhbU9wdGlvbnMudGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5uYW1lKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluTmFtZSA9IGNvbmZpZ0ZpbGUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMubmFtZSAmJiBwcm9ncmFtT3B0aW9ucy5uYW1lICE9PSBDT01QT0RPQ19ERUZBVUxUUy50aXRsZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPSBwcm9ncmFtT3B0aW9ucy5uYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuYXNzZXRzRm9sZGVyKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlciA9IGNvbmZpZ0ZpbGUuYXNzZXRzRm9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5hc3NldHNGb2xkZXIpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyID0gcHJvZ3JhbU9wdGlvbnMuYXNzZXRzRm9sZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUub3Blbikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuID0gY29uZmlnRmlsZS5vcGVuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5vcGVuKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm9wZW4gPSBwcm9ncmFtT3B0aW9ucy5vcGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUudG9nZ2xlTWVudUl0ZW1zKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRvZ2dsZU1lbnVJdGVtcyA9IGNvbmZpZ0ZpbGUudG9nZ2xlTWVudUl0ZW1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb2dyYW1PcHRpb25zLnRvZ2dsZU1lbnVJdGVtcyAmJlxuICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMudG9nZ2xlTWVudUl0ZW1zICE9PSBDT01QT0RPQ19ERUZBVUxUUy50b2dnbGVNZW51SXRlbXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRvZ2dsZU1lbnVJdGVtcyA9IHByb2dyYW1PcHRpb25zLnRvZ2dsZU1lbnVJdGVtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnRlbXBsYXRlcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMgPSBjb25maWdGaWxlLnRlbXBsYXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMudGVtcGxhdGVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRlbXBsYXRlcyA9IHByb2dyYW1PcHRpb25zLnRlbXBsYXRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLm5hdlRhYkNvbmZpZykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5uYXZUYWJDb25maWcgPSBjb25maWdGaWxlLm5hdlRhYkNvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5uYXZUYWJDb25maWcgJiZcbiAgICAgICAgICAgIEpTT04ucGFyc2UocHJvZ3JhbU9wdGlvbnMubmF2VGFiQ29uZmlnKS5sZW5ndGggIT09IENPTVBPRE9DX0RFRkFVTFRTLm5hdlRhYkNvbmZpZy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm5hdlRhYkNvbmZpZyA9IEpTT04ucGFyc2UocHJvZ3JhbU9wdGlvbnMubmF2VGFiQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmluY2x1ZGVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzID0gY29uZmlnRmlsZS5pbmNsdWRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuaW5jbHVkZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXMgPSBwcm9ncmFtT3B0aW9ucy5pbmNsdWRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmluY2x1ZGVzTmFtZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlc05hbWUgPSBjb25maWdGaWxlLmluY2x1ZGVzTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5pbmNsdWRlc05hbWUgJiZcbiAgICAgICAgICAgIHByb2dyYW1PcHRpb25zLmluY2x1ZGVzTmFtZSAhPT0gQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5TmFtZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXNOYW1lID0gcHJvZ3JhbU9wdGlvbnMuaW5jbHVkZXNOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuc2lsZW50KSB7XG4gICAgICAgICAgICBsb2dnZXIuc2lsZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuc2VydmUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuc2VydmUgPSBjb25maWdGaWxlLnNlcnZlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5zZXJ2ZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5zZXJ2ZSA9IHByb2dyYW1PcHRpb25zLnNlcnZlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUudGVtcGxhdGVQbGF5Z3JvdW5kKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRlbXBsYXRlUGxheWdyb3VuZCA9IGNvbmZpZ0ZpbGUudGVtcGxhdGVQbGF5Z3JvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy50ZW1wbGF0ZVBsYXlncm91bmQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGVtcGxhdGVQbGF5Z3JvdW5kID0gcHJvZ3JhbU9wdGlvbnMudGVtcGxhdGVQbGF5Z3JvdW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaG9zdCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0ID0gY29uZmlnRmlsZS5ob3N0O1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0bmFtZSA9IGNvbmZpZ0ZpbGUuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuaG9zdCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0ID0gcHJvZ3JhbU9wdGlvbnMuaG9zdDtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdG5hbWUgPSBwcm9ncmFtT3B0aW9ucy5ob3N0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUucG9ydCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wb3J0ID0gY29uZmlnRmlsZS5wb3J0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5wb3J0ICYmIHByb2dyYW1PcHRpb25zLnBvcnQgIT09IENPTVBPRE9DX0RFRkFVTFRTLnBvcnQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydCA9IHByb2dyYW1PcHRpb25zLnBvcnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS53YXRjaCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS53YXRjaCA9IGNvbmZpZ0ZpbGUud2F0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLndhdGNoKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoID0gcHJvZ3JhbU9wdGlvbnMud2F0Y2g7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID0gY29uZmlnRmlsZS5leHBvcnRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMuZXhwb3J0Rm9ybWF0ICYmXG4gICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdFxuICAgICAgICApIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID0gcHJvZ3JhbU9wdGlvbnMuZXhwb3J0Rm9ybWF0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaGlkZUdlbmVyYXRvcikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5oaWRlR2VuZXJhdG9yID0gY29uZmlnRmlsZS5oaWRlR2VuZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhpZGVHZW5lcmF0b3IgPSBwcm9ncmFtT3B0aW9ucy5oaWRlR2VuZXJhdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaGlkZURhcmtNb2RlVG9nZ2xlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhpZGVEYXJrTW9kZVRvZ2dsZSA9IGNvbmZpZ0ZpbGUuaGlkZURhcmtNb2RlVG9nZ2xlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5oaWRlRGFya01vZGVUb2dnbGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZURhcmtNb2RlVG9nZ2xlID0gcHJvZ3JhbU9wdGlvbnMuaGlkZURhcmtNb2RlVG9nZ2xlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0KSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0LCAxMClcbiAgICAgICAgICAgICAgICAgICAgOiBDT01QT0RPQ19ERUZBVUxUUy5kZWZhdWx0Q292ZXJhZ2VUaHJlc2hvbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlVGVzdCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZVRlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0LCAxMClcbiAgICAgICAgICAgICAgICAgICAgOiBDT01QT0RPQ19ERUZBVUxUUy5kZWZhdWx0Q292ZXJhZ2VUaHJlc2hvbGQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFBlckZpbGUgPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uZmlnRmlsZS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KGNvbmZpZ0ZpbGUuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSwgMTApXG4gICAgICAgICAgICAgICAgICAgIDogQ09NUE9ET0NfREVGQVVMVFMuZGVmYXVsdENvdmVyYWdlTWluaW11bVBlckZpbGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlTWluaW11bVBlckZpbGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0UGVyRmlsZSA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHByb2dyYW1PcHRpb25zLmNvdmVyYWdlTWluaW11bVBlckZpbGUsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZU1pbmltdW1QZXJGaWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsID1cbiAgICAgICAgICAgICAgICBjb25maWdGaWxlLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCA9XG4gICAgICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkID1cbiAgICAgICAgICAgICAgICBjb25maWdGaWxlLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCA9XG4gICAgICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS51bml0VGVzdENvdmVyYWdlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnVuaXRUZXN0Q292ZXJhZ2UgPSBjb25maWdGaWxlLnVuaXRUZXN0Q292ZXJhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnVuaXRUZXN0Q292ZXJhZ2UpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSA9IHByb2dyYW1PcHRpb25zLnVuaXRUZXN0Q292ZXJhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlU291cmNlQ29kZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU291cmNlQ29kZSA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVNvdXJjZUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTb3VyY2VDb2RlID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVNvdXJjZUNvZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlRG9tVHJlZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRG9tVHJlZSA9IGNvbmZpZ0ZpbGUuZGlzYWJsZURvbVRyZWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVEb21UcmVlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVEb21UcmVlID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZURvbVRyZWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlVGVtcGxhdGVUYWIpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVRlbXBsYXRlVGFiID0gY29uZmlnRmlsZS5kaXNhYmxlVGVtcGxhdGVUYWI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVUZW1wbGF0ZVRhYikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlVGVtcGxhdGVUYWIgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlVGVtcGxhdGVUYWI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlU3R5bGVUYWIpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVN0eWxlVGFiID0gY29uZmlnRmlsZS5kaXNhYmxlU3R5bGVUYWI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVTdHlsZVRhYikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU3R5bGVUYWIgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlU3R5bGVUYWI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlR3JhcGgpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUdyYXBoID0gY29uZmlnRmlsZS5kaXNhYmxlR3JhcGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVHcmFwaCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlR3JhcGggPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlR3JhcGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlQ292ZXJhZ2UpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlID0gY29uZmlnRmlsZS5kaXNhYmxlQ292ZXJhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVDb3ZlcmFnZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlQ292ZXJhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUHJpdmF0ZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJpdmF0ZSA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVByaXZhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVQcml2YXRlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVByaXZhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUHJvdGVjdGVkKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcm90ZWN0ZWQgPSBjb25maWdGaWxlLmRpc2FibGVQcm90ZWN0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVQcm90ZWN0ZWQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByb3RlY3RlZCA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVQcm90ZWN0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlSW50ZXJuYWwpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsID0gY29uZmlnRmlsZS5kaXNhYmxlSW50ZXJuYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVJbnRlcm5hbCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWwgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlSW50ZXJuYWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzID0gY29uZmlnRmlsZS5kaXNhYmxlTGlmZUN5Y2xlSG9va3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlTGlmZUN5Y2xlSG9va3M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlQ29uc3RydWN0b3JzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb25zdHJ1Y3RvcnMgPSBjb25maWdGaWxlLmRpc2FibGVDb25zdHJ1Y3RvcnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVDb25zdHJ1Y3RvcnMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvbnN0cnVjdG9ycyA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVDb25zdHJ1Y3RvcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUm91dGVzR3JhcGgpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoID0gY29uZmlnRmlsZS5kaXNhYmxlUm91dGVzR3JhcGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGggPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlUm91dGVzR3JhcGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlU2VhcmNoKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSBjb25maWdGaWxlLmRpc2FibGVTZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVTZWFyY2gpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVTZWFyY2g7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVEZXBlbmRlbmNpZXMgPSBjb25maWdGaWxlLmRpc2FibGVEZXBlbmRlbmNpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZURlcGVuZGVuY2llcyA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVEZXBlbmRlbmNpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUHJvcGVydGllcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvcGVydGllcyA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVByb3BlcnRpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcm9wZXJ0aWVzID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVByb3BlcnRpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlRmlsZVBhdGgpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUZpbGVQYXRoID0gY29uZmlnRmlsZS5kaXNhYmxlRmlsZVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVGaWxlUGF0aCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRmlsZVBhdGggPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlRmlsZVBhdGg7XG4gICAgICAgIH1cbiAgICAgIFxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlT3ZlcnZpZXcpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZU92ZXJ2aWV3ID0gY29uZmlnRmlsZS5kaXNhYmxlT3ZlcnZpZXc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVPdmVydmlldykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlT3ZlcnZpZXcgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlT3ZlcnZpZXc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5taW5pbWFsKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5taW5pbWFsKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY3VzdG9tRmF2aWNvbikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21GYXZpY29uID0gY29uZmlnRmlsZS5jdXN0b21GYXZpY29uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5jdXN0b21GYXZpY29uKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUZhdmljb24gPSBwcm9ncmFtT3B0aW9ucy5jdXN0b21GYXZpY29uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY3VzdG9tTG9nbykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21Mb2dvID0gY29uZmlnRmlsZS5jdXN0b21Mb2dvO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5jdXN0b21Mb2dvKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUxvZ28gPSBwcm9ncmFtT3B0aW9ucy5jdXN0b21Mb2dvO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZ2FJRCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5nYUlEID0gY29uZmlnRmlsZS5nYUlEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5nYUlEKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmdhSUQgPSBwcm9ncmFtT3B0aW9ucy5nYUlEO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZ2FTaXRlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmdhU2l0ZSA9IGNvbmZpZ0ZpbGUuZ2FTaXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5nYVNpdGUgJiYgcHJvZ3JhbU9wdGlvbnMuZ2FTaXRlICE9PSBDT01QT0RPQ19ERUZBVUxUUy5nYVNpdGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FTaXRlID0gcHJvZ3JhbU9wdGlvbnMuZ2FTaXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUucHVibGljQXBpT25seSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wdWJsaWNBcGlPbmx5ID0gY29uZmlnRmlsZS5wdWJsaWNBcGlPbmx5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5wdWJsaWNBcGlPbmx5KSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnB1YmxpY0FwaU9ubHkgPSBwcm9ncmFtT3B0aW9ucy5wdWJsaWNBcGlPbmx5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzV2F0Y2hpbmcpIHtcbiAgICAgICAgICAgIGlmICghbG9nZ2VyLnNpbGVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb21wb2RvYyB2JHtwa2cudmVyc2lvbn1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9zcmMvYmFubmVyJykpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBrZy52ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFR5cGVTY3JpcHQgdmVyc2lvbiB1c2VkIGJ5IENvbXBvZG9jIDogJHt0cy52ZXJzaW9ufWApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChGaWxlRW5naW5lLmV4aXN0c1N5bmMoY3dkICsgcGF0aC5zZXAgKyAncGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFja2FnZURhdGEgPSBGaWxlRW5naW5lLmdldFN5bmMoY3dkICsgcGF0aC5zZXAgKyAncGFja2FnZS5qc29uJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UocGFja2FnZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdERldkRlcGVuZGVuY2llcyA9IHBhcnNlZERhdGEuZGV2RGVwZW5kZW5jaWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3REZXZEZXBlbmRlbmNpZXMgJiYgcHJvamVjdERldkRlcGVuZGVuY2llcy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHNQcm9qZWN0VmVyc2lvbiA9IEFuZ3VsYXJWZXJzaW9uVXRpbC5jbGVhblZlcnNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3REZXZEZXBlbmRlbmNpZXMudHlwZXNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUeXBlU2NyaXB0IHZlcnNpb24gb2YgY3VycmVudCBwcm9qZWN0IDogJHt0c1Byb2plY3RWZXJzaW9ufWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgTm9kZS5qcyB2ZXJzaW9uIDogJHtwcm9jZXNzLnZlcnNpb259YCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBPcGVyYXRpbmcgc3lzdGVtIDogJHtvc05hbWUob3MucGxhdGZvcm0oKSwgb3MucmVsZWFzZSgpKX1gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRXhwbG9yZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnRXhwbG9yZXJSZXN1bHQuY29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBVc2luZyBjb25maWd1cmF0aW9uIGZpbGUgOiAke2NvbmZpZ0V4cGxvcmVyUmVzdWx0LmZpbGVwYXRofWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25maWdFeHBsb3JlclJlc3VsdCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYE5vIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3VuZCwgc3dpdGNoaW5nIHRvIENMSSBmbGFncy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5sYW5ndWFnZSAmJiAhSTE4bkVuZ2luZS5zdXBwb3J0TGFuZ3VhZ2UocHJvZ3JhbU9wdGlvbnMubGFuZ3VhZ2UpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBgVGhlIGxhbmd1YWdlICR7cHJvZ3JhbU9wdGlvbnMubGFuZ3VhZ2V9IGlzIG5vdCBhdmFpbGFibGUsIGZhbGxpbmcgYmFjayB0byAke0kxOG5FbmdpbmUuZmFsbGJhY2tMYW5ndWFnZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnRzY29uZmlnICYmIHR5cGVvZiBwcm9ncmFtT3B0aW9ucy50c2NvbmZpZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFBsZWFzZSBwcm92aWRlIGEgdHNjb25maWcgZmlsZS5gKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnRzY29uZmlnKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnID0gY29uZmlnRmlsZS50c2NvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMudHNjb25maWcpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgPSBwcm9ncmFtT3B0aW9ucy50c2NvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5tYXhTZWFyY2hSZXN1bHRzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1heFNlYXJjaFJlc3VsdHMgPSBwcm9ncmFtT3B0aW9ucy5tYXhTZWFyY2hSZXN1bHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZmlsZXMpIHtcbiAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IGNvbmZpZ0ZpbGUuZmlsZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZXhjbHVkZSkge1xuICAgICAgICAgICAgZXhjbHVkZUZpbGVzID0gY29uZmlnRmlsZS5leGNsdWRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdGaWxlLmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGluY2x1ZGVGaWxlcyA9IGNvbmZpZ0ZpbGUuaW5jbHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVjayAtLWZpbGVzIGFyZ3VtZW50IGNhbGxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGFyZ3YgPSByZXF1aXJlKCdtaW5pbWlzdCcpKHByb2Nlc3MuYXJndi5zbGljZSgyKSk7XG4gICAgICAgIGlmIChhcmd2ICYmIGFyZ3YuZmlsZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGFzRmlsZXNUb0NvdmVyYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndi5maWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBzdXBlci5zZXRGaWxlcyhbYXJndi5maWxlc10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdXBlci5zZXRGaWxlcyhhcmd2LmZpbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5zZXJ2ZSAmJiAhQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyAmJiBwcm9ncmFtT3B0aW9ucy5vdXRwdXQpIHtcbiAgICAgICAgICAgIC8vIGlmIC1zICYgLWQsIHNlcnZlIGl0XG4gICAgICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXR9IGZvbGRlciBkb2Vzbid0IGV4aXN0YCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFNlcnZpbmcgZG9jdW1lbnRhdGlvbiBmcm9tICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXR9IGF0IGh0dHA6Ly8ke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdG5hbWV9OiR7cHJvZ3JhbU9wdGlvbnMucG9ydH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzdXBlci5ydW5XZWJTZXJ2ZXIoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMuc2VydmUgJiZcbiAgICAgICAgICAgICFDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnICYmXG4gICAgICAgICAgICAhcHJvZ3JhbU9wdGlvbnMub3V0cHV0XG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gaWYgb25seSAtcyBmaW5kIC4vZG9jdW1lbnRhdGlvbiwgaWYgb2sgc2VydmUsIGVsc2UgZXJyb3IgcHJvdmlkZSAtZFxuICAgICAgICAgICAgaWYgKCFGaWxlRW5naW5lLmV4aXN0c1N5bmMoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdQcm92aWRlIG91dHB1dCBnZW5lcmF0ZWQgZm9sZGVyIHdpdGggLWQgZmxhZycpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0fSBhdCBodHRwOi8vJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3RuYW1lfToke3Byb2dyYW1PcHRpb25zLnBvcnR9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc3VwZXIucnVuV2ViU2VydmVyKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmhhc0ZpbGVzVG9Db3ZlcmFnZSkge1xuICAgICAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlTWluaW11bVBlckZpbGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUnVuIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgdGVzdCBmb3IgZmlsZXMnKTtcbiAgICAgICAgICAgICAgICBzdXBlci50ZXN0Q292ZXJhZ2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdNaXNzaW5nIGNvdmVyYWdlIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5oaWRlR2VuZXJhdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiB0c2NvbmZpZyBmaWxlIHByb3ZpZGVkIG9ubHlcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0VHNDb25maWdQYXRoID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5pbmRleE9mKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0VHNDb25maWdQYXRoICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRm9sZGVyO1xuICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtLmFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogdHNjb25maWcgZmlsZSBwcm92aWRlZCB3aXRoIHNvdXJjZSBmb2xkZXIgaW4gYXJnXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0VHNDb25maWdQYXRoID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5pbmRleE9mKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdFRzQ29uZmlnUGF0aCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc291cmNlRm9sZGVyID0gcHJvZ3JhbS5hcmdzWzBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhzb3VyY2VGb2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3ZpZGVkIHNvdXJjZSBmb2xkZXIgJHtzb3VyY2VGb2xkZXJ9IHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdVc2luZyBwcm92aWRlZCBzb3VyY2UgZm9sZGVyJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgXCIke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWd9XCIgZmlsZSB3YXMgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9maWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHBhdGguZGlybmFtZShDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb2YgdHNjb25maWcuanNvbiBhcyBhIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAgICAgICAgICAgIGN3ZCA9IF9maWxlLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMSkuam9pbihwYXRoLnNlcCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdVc2luZyB0c2NvbmZpZyBmaWxlICcsIF9maWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0c0NvbmZpZ0ZpbGUgPSByZWFkQ29uZmlnKF9maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzQ29uZmlnRmlsZS5maWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZEZpbGVzID0gdHNDb25maWdGaWxlLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggb2YgdGhlc2UgZmlsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IHNjYW5uZWRGaWxlcy5tYXAoc2Nhbm5lZEZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjd2QgKyBwYXRoLnNlcCArIHNjYW5uZWRGaWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIGZpbGVzIGFyZSBzdXBwbGllZCB3aXRoIFwiZmlsZXNcIiBhdHRyaWJ1dGVzLCBlbmhhbmNlIHRoZSBhcnJheSB3aXRoIGluY2x1ZGVzXG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVGaWxlcyA9IFsuLi5leGNsdWRlRmlsZXMsIC4uLih0c0NvbmZpZ0ZpbGUuZXhjbHVkZSB8fCBbXSldO1xuICAgICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMgPSBbLi4uaW5jbHVkZUZpbGVzLCAuLi4odHNDb25maWdGaWxlLmluY2x1ZGUgfHwgW10pXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2Nhbm5lZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVGaWxlcyA9IFsuLi5pbmNsdWRlRmlsZXMsIC4uLnNjYW5uZWRGaWxlc107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWluY2x1ZGVGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVGaWxlcyA9IElOQ0xVREVfUEFUVEVSTlM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBwdWJsaWNBcGlPbmx5IGlzIHNldCwgcGFyc2UgdGhlIHB1YmxpYyBBUEkgZXhwb3J0cyBmaXJzdFxuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wdWJsaWNBcGlPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NQdWJsaWNBcGkoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wdWJsaWNBcGlPbmx5LCBjd2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gZmcuc3RyZWFtKGluY2x1ZGVGaWxlcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3dkOiBzb3VyY2VGb2xkZXIgfHwgY3dkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlOiBleGNsdWRlRmlsZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ub24oJ2RhdGEnLCBmaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcudHMnIHx8IHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50c3gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0V4Y2x1ZGluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNldEZpbGVzKHNjYW5uZWRGaWxlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0IHx8IHByb2dyYW1PcHRpb25zLmNvdmVyYWdlVGVzdFBlckZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUnVuIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgdGVzdCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnRlc3RDb3ZlcmFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5nZW5lcmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigndHNjb25maWcuanNvbiBmaWxlIHdhcyBub3QgZm91bmQsIHBsZWFzZSB1c2UgLXAgZmxhZycpO1xuICAgICAgICAgICAgICAgIG91dHB1dEhlbHAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgcHVibGljIEFQSSBleHBvcnRzIGZyb20gZGlzdCBmb2xkZXIgb3IgQVBJIG1hcmtkb3duIGZpbGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzUHVibGljQXBpKGRpc3RQYXRoOiBzdHJpbmcsIHNvdXJjZVJvb3Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyBwdWJsaWMgQVBJIGV4cG9ydHMnKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRmlyc3QsIHRyeSB0byBwYXJzZSBBUEkgbWFya2Rvd24gZmlsZXMgZnJvbSB0aGUgc291cmNlIHJvb3RcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdDaGVja2luZyBmb3IgKi5hcGkubWQgZmlsZXMgaW4gc291cmNlIHJvb3QnKTtcbiAgICAgICAgICAgIGNvbnN0IGFwaU1hcmtkb3duRXhwb3J0cyA9IGF3YWl0IHBhcnNlQXBpTWFya2Rvd25FeHBvcnRzKHNvdXJjZVJvb3QpO1xuXG4gICAgICAgICAgICBpZiAoYXBpTWFya2Rvd25FeHBvcnRzLmFwaU1kRmlsZXMuc2l6ZSA+IDAgJiYgYXBpTWFya2Rvd25FeHBvcnRzLnN5bWJvbFRvRmlsZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgRm91bmQgJHthcGlNYXJrZG93bkV4cG9ydHMuYXBpTWRGaWxlcy5zaXplfSByZWxldmFudCAqLmFwaS5tZCBmaWxlKHMpIHdpdGggJHthcGlNYXJrZG93bkV4cG9ydHMuc3ltYm9sVG9GaWxlcy5zaXplfSBzeW1ib2wocylgKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBNYXAgc3ltYm9scyBmcm9tIEFQSSBtYXJrZG93biBmaWxlcyBkaXJlY3RseSB0byBzb3VyY2UgZmlsZXNcbiAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xUb1NvdXJjZUZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbc3ltYm9sTmFtZV0gb2YgYXBpTWFya2Rvd25FeHBvcnRzLnN5bWJvbFRvRmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlIGZvciB0aGlzIHN5bWJvbFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlID0gdGhpcy5maW5kU291cmNlRmlsZUZvclN5bWJvbChzeW1ib2xOYW1lLCBzb3VyY2VSb290KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVzLmFkZChzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VGaWxlcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sVG9Tb3VyY2VGaWxlcy5zZXQoc3ltYm9sTmFtZSwgc291cmNlRmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQdWJsaWMgQVBJIHN5bWJvbDogJHtzeW1ib2xOYW1lfSAtPiAke0FycmF5LmZyb20oc291cmNlRmlsZXMpLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFN0b3JlIGluIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnB1YmxpY0FwaUV4cG9ydHMgPSBzeW1ib2xUb1NvdXJjZUZpbGVzO1xuXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBMb2FkZWQgJHtzeW1ib2xUb1NvdXJjZUZpbGVzLnNpemV9IHB1YmxpYyBBUEkgc3ltYm9sKHMpIGZyb20gJHthcGlNYXJrZG93bkV4cG9ydHMuYXBpTWRGaWxlcy5zaXplfSAqLmFwaS5tZCBmaWxlKHMpICh1c2luZyBBUEkgTWFya2Rvd24gcGFyc2VyKWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gaW5kZXguZC50cyBwYXJzaW5nXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ05vIHJlbGV2YW50ICouYXBpLm1kIGZpbGVzIGZvdW5kLCBmYWxsaW5nIGJhY2sgdG8gaW5kZXguZC50cyBwYXJzaW5nJyk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgcHVibGljQXBpRXhwb3J0cyA9IGF3YWl0IHBhcnNlUHVibGljQXBpKGRpc3RQYXRoKTtcblxuICAgICAgICAgICAgICAgIGlmIChwdWJsaWNBcGlFeHBvcnRzLnN5bWJvbFRvRmlsZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignTm8gcHVibGljIEFQSSBleHBvcnRzIGZvdW5kIGluIGRpc3QgZm9sZGVyLiBEb2N1bWVudGF0aW9uIHdpbGwgYmUgZW1wdHkuJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgc291cmNlIHBhdGggbWFwcGVyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVyID0gY3JlYXRlU291cmNlUGF0aE1hcHBlcihkaXN0UGF0aCwgc291cmNlUm9vdCk7XG5cbiAgICAgICAgICAgICAgICAvLyBNYXAgc3ltYm9scyB0byBzb3VyY2UgZmlsZXMgYW5kIGJ1aWxkIHRoZSBhbGxvd2VkIGV4cG9ydHMgbWFwXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sVG9Tb3VyY2VGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3N5bWJvbE5hbWUsIGRlY2xGaWxlc10gb2YgcHVibGljQXBpRXhwb3J0cy5zeW1ib2xUb0ZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZWNsRmlsZSBvZiBkZWNsRmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBtYXBwZXIubWFwRGlzdFRvU291cmNlKGRlY2xGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZXMuYWRkKHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xUb1NvdXJjZUZpbGVzLnNldChzeW1ib2xOYW1lLCBzb3VyY2VGaWxlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFB1YmxpYyBBUEkgc3ltYm9sOiAke3N5bWJvbE5hbWV9IC0+ICR7QXJyYXkuZnJvbShzb3VyY2VGaWxlcykuam9pbignLCAnKX1gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RvcmUgaW4gY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucHVibGljQXBpRXhwb3J0cyA9IHN5bWJvbFRvU291cmNlRmlsZXM7XG5cbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYExvYWRlZCAke3N5bWJvbFRvU291cmNlRmlsZXMuc2l6ZX0gcHVibGljIEFQSSBzeW1ib2wocykgZnJvbSAke3B1YmxpY0FwaUV4cG9ydHMuaW5kZXhGaWxlcy5zaXplfSBpbmRleC5kLnRzIGZpbGUocykgKHVzaW5nIGluZGV4LmQudHMgcGFyc2VyKWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHB1YmxpYyBBUEk6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBzb3VyY2UgZmlsZSBmb3IgYSBnaXZlbiBzeW1ib2wgYnkgc2VhcmNoaW5nIHRocm91Z2ggdGhlIHNvdXJjZSBmaWxlc1xuICAgICAqL1xuICAgIHByaXZhdGUgZmluZFNvdXJjZUZpbGVGb3JTeW1ib2woc3ltYm9sTmFtZTogc3RyaW5nLCBzb3VyY2VSb290OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgLy8gVHJ5IHRvIGZpbmQgdGhlIHN5bWJvbCBpbiBzb3VyY2UgZmlsZXNcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNpbXBsaWZpZWQgYXBwcm9hY2ggLSBsb29rIGZvciBmaWxlcyB0aGF0IGNvbnRhaW4gdGhlIHN5bWJvbCBleHBvcnRcbiAgICAgICAgY29uc3Qgc291cmNlRm9sZGVyID0gc291cmNlUm9vdDtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGZnLnN5bmMocGF0aC5qb2luKHNvdXJjZUZvbGRlciwgJyoqLyoudHMnKSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovKi5zcGVjLnRzJywgJyoqLyouZC50cyddXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBleHBvcnQgcGF0dGVybnMgdGhhdCBtYXRjaCB0aGUgc3ltYm9sIG5hbWVcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJucyA9IFtcbiAgICAgICAgICAgICAgICAgICAgYGV4cG9ydCBjbGFzcyAke3N5bWJvbE5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgYGV4cG9ydCBpbnRlcmZhY2UgJHtzeW1ib2xOYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtzeW1ib2xOYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIGBleHBvcnQgZnVuY3Rpb24gJHtzeW1ib2xOYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIGBleHBvcnQgdHlwZSAke3N5bWJvbE5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgYGV4cG9ydCBlbnVtICR7c3ltYm9sTmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICBgZXhwb3J0IHsgJHtzeW1ib2xOYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIGBleHBvcnQgZGVmYXVsdCAke3N5bWJvbE5hbWV9YFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMocGF0dGVybikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBFcnJvciBzZWFyY2hpbmcgZm9yIHN5bWJvbCAke3N5bWJvbE5hbWV9OiAke2Vycm9yfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIl8iLCJwYXRoIiwiU3ludGF4S2luZCIsInRzIiwiX3RzLmdldEpTRG9jQ29tbWVudFJhbmdlcyIsIl9fdmFsdWVzIiwiX19zcHJlYWRBcnJheSIsIl9fcmVhZCIsImZzIiwibG9nZ2VyIiwidHJhdmVyc2UiLCJBbmd1bGFyQXBpVXRpbCIsIkNvbmZpZ3VyYXRpb24iLCJGaWxlRW5naW5lIiwiRGVwZW5kZW5jaWVzRW5naW5lIiwiRXhwb3J0SnNvbkVuZ2luZSIsIkhhbmRsZWJhcnMiLCJzZW12ZXIiLCJBbmd1bGFyVmVyc2lvblV0aWwiLCJCYXNpY1R5cGVVdGlsIiwiSTE4bkVuZ2luZSIsImFzdCIsIlByb2plY3QiLCJWYXJpYWJsZURlY2xhcmF0aW9uIiwiSlNPTjUiLCJJbXBvcnRzVXRpbCIsIk5vZGUiLCJmZyIsImNsb25lRGVlcCIsImNvbmNhdCIsImZpbmQiLCJFeHRlbmRzTWVyZ2VyIiwiX19hc3NpZ24iLCJjaGVlcmlvIiwiZGVjb2RlIiwiY3J5cHRvIiwiX19leHRlbmRzIiwiUm91dGVyUGFyc2VyVXRpbCIsIkNvbXBvbmVudHNUcmVlRW5naW5lIiwidXVpZHY0IiwiY3dkIiwiTWFya2Rvd25FbmdpbmUiLCJIdG1sRW5naW5lIiwiRXhwb3J0RW5naW5lIiwiU2VhcmNoRW5naW5lIiwiTmdkRW5naW5lIiwiTGl2ZVNlcnZlciIsImNvc21pY29uZmlnU3luYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQU8sSUFBTSxpQkFBaUIsR0FBRztBQUM3QixJQUFBLEtBQUssRUFBRSwyQkFBMkI7QUFDbEMsSUFBQSxtQkFB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
|