912 lines
129 KiB
JavaScript
912 lines
129 KiB
JavaScript
import { createUnplugin } from 'unplugin';
|
|
import { createFilter } from '@rollup/pluginutils';
|
|
import MagicString from 'magic-string';
|
|
import { shouldTransform as shouldTransform$1, transformAST, transform as transform$1 } from '@vue/reactivity-transform';
|
|
import { partition, notNullish, uniq } from '@antfu/utils';
|
|
import { baseParse } from '@vue/compiler-core';
|
|
import { parserOptions } from '@vue/compiler-dom';
|
|
import { capitalize, camelize } from '@vue/shared';
|
|
import * as babel from '@babel/core';
|
|
import { parse, parseExpression } from '@babel/parser';
|
|
import g from '@babel/generator';
|
|
import * as babel_traverse from '@babel/traverse';
|
|
|
|
var _a, _b, _c;
|
|
const t = (babel.default || babel).types;
|
|
const generate = g.default || g;
|
|
const traverse = (_c = (_b = (_a = babel_traverse == null ? void 0 : babel_traverse.default) == null ? void 0 : _a.default) != null ? _b : babel_traverse == null ? void 0 : babel_traverse.default) != null ? _c : babel_traverse;
|
|
|
|
function getIdentifierDeclarations(nodes) {
|
|
let result;
|
|
let programScopeUid;
|
|
traverse(t.file(t.program(nodes)), {
|
|
Program(path) {
|
|
result = new Set(Object.keys(path.scope.bindings));
|
|
programScopeUid = path.scope.uid;
|
|
},
|
|
// FIXME: babel bug, temporary add TSEnumDeclaration and TSModuleDeclaration logic
|
|
TSEnumDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid)
|
|
result.add(path.node.id.name);
|
|
},
|
|
TSModuleDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid) {
|
|
const id = path.node.id;
|
|
if (id.type === "Identifier")
|
|
result.add(id.name);
|
|
}
|
|
}
|
|
});
|
|
return Array.from(result);
|
|
}
|
|
function getFileGlobals(result) {
|
|
let globals;
|
|
let programScopeUid;
|
|
traverse(result, {
|
|
Program(path) {
|
|
globals = new Set(Object.keys(path.scope.globals));
|
|
programScopeUid = path.scope.uid;
|
|
},
|
|
// FIXME: babel bug, temporary add TSEnumDeclaration and TSModuleDeclaration logic
|
|
TSEnumDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid)
|
|
globals.delete(path.node.id.name);
|
|
},
|
|
TSModuleDeclaration(path) {
|
|
if (path.scope.uid === programScopeUid) {
|
|
const id = path.node.id;
|
|
if (id.type === "Identifier")
|
|
globals.delete(id.name);
|
|
}
|
|
}
|
|
});
|
|
return Array.from(globals);
|
|
}
|
|
|
|
const pascalize = (str) => capitalize(camelize(str));
|
|
function exhaustiveCheckReturnUndefined(_param) {
|
|
return void 0;
|
|
}
|
|
|
|
var NodeTypes;
|
|
((NodeTypes2) => {
|
|
NodeTypes2.ROOT = 0;
|
|
NodeTypes2.ELEMENT = 1;
|
|
NodeTypes2.TEXT = 2;
|
|
NodeTypes2.COMMENT = 3;
|
|
NodeTypes2.SIMPLE_EXPRESSION = 4;
|
|
NodeTypes2.INTERPOLATION = 5;
|
|
NodeTypes2.ATTRIBUTE = 6;
|
|
NodeTypes2.DIRECTIVE = 7;
|
|
NodeTypes2.COMPOUND_EXPRESSION = 8;
|
|
NodeTypes2.IF = 9;
|
|
NodeTypes2.IF_BRANCH = 10;
|
|
NodeTypes2.FOR = 11;
|
|
NodeTypes2.TEXT_CALL = 12;
|
|
NodeTypes2.VNODE_CALL = 13;
|
|
NodeTypes2.JS_CALL_EXPRESSION = 14;
|
|
NodeTypes2.JS_OBJECT_EXPRESSION = 15;
|
|
NodeTypes2.JS_PROPERTY = 16;
|
|
NodeTypes2.JS_ARRAY_EXPRESSION = 17;
|
|
NodeTypes2.JS_FUNCTION_EXPRESSION = 18;
|
|
NodeTypes2.JS_CONDITIONAL_EXPRESSION = 19;
|
|
NodeTypes2.JS_CACHE_EXPRESSION = 20;
|
|
NodeTypes2.JS_BLOCK_STATEMENT = 21;
|
|
NodeTypes2.JS_TEMPLATE_LITERAL = 22;
|
|
NodeTypes2.JS_IF_STATEMENT = 23;
|
|
NodeTypes2.JS_ASSIGNMENT_EXPRESSION = 24;
|
|
NodeTypes2.JS_SEQUENCE_EXPRESSION = 25;
|
|
NodeTypes2.JS_RETURN_STATEMENT = 26;
|
|
})(NodeTypes || (NodeTypes = {}));
|
|
var ElementTypes;
|
|
((ElementTypes2) => {
|
|
ElementTypes2.ELEMENT = 0;
|
|
ElementTypes2.COMPONENT = 1;
|
|
ElementTypes2.SLOT = 2;
|
|
ElementTypes2.TEMPLATE = 3;
|
|
})(ElementTypes || (ElementTypes = {}));
|
|
const BUILD_IN_DIRECTIVES = /* @__PURE__ */ new Set([
|
|
"if",
|
|
"else",
|
|
"else-if",
|
|
"for",
|
|
"once",
|
|
"model",
|
|
"on",
|
|
"bind",
|
|
"slot",
|
|
"slot-scope",
|
|
"key",
|
|
"ref",
|
|
"text",
|
|
"html",
|
|
"show",
|
|
"pre",
|
|
"cloak"
|
|
// 'el',
|
|
// 'ref',
|
|
]);
|
|
function getComponents(node) {
|
|
var _a;
|
|
const current = node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.COMPONENT ? [node.tag] : node.type === NodeTypes.ELEMENT && node.tagType === ElementTypes.ELEMENT ? [node.tag] : [];
|
|
const children = node.type === NodeTypes.IF ? node.branches : node.type === NodeTypes.ELEMENT || node.type === NodeTypes.IF_BRANCH || node.type === NodeTypes.FOR ? node.children : node.type === NodeTypes.TEXT || node.type === NodeTypes.COMMENT || node.type === NodeTypes.COMPOUND_EXPRESSION || node.type === NodeTypes.TEXT_CALL || node.type === NodeTypes.INTERPOLATION ? [] : (_a = exhaustiveCheckReturnUndefined()) != null ? _a : [];
|
|
return [...current, ...children.flatMap(getComponents)];
|
|
}
|
|
function getDirectiveNames(node) {
|
|
if (node.type === NodeTypes.ELEMENT) {
|
|
const directives = node.props.flatMap(
|
|
(x) => x.type === NodeTypes.DIRECTIVE ? [x.name] : []
|
|
);
|
|
return [...directives, ...node.children.flatMap(getDirectiveNames)];
|
|
} else if (node.type === NodeTypes.IF) {
|
|
return node.branches.flatMap(getDirectiveNames);
|
|
} else if (node.type === NodeTypes.IF_BRANCH || node.type === NodeTypes.FOR) {
|
|
return node.children.flatMap(getDirectiveNames);
|
|
} else if (node.type === NodeTypes.INTERPOLATION || node.type === NodeTypes.COMPOUND_EXPRESSION || node.type === NodeTypes.TEXT || node.type === NodeTypes.COMMENT || node.type === NodeTypes.TEXT_CALL) {
|
|
return [];
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
function getFreeVariablesForText(input) {
|
|
const inputWithPrefix = input.trimStart()[0] === "{" ? `(${input})` : input;
|
|
return getFileGlobals(parse(inputWithPrefix));
|
|
}
|
|
function getFreeVariablesForPropsNode(node) {
|
|
if (node.type === NodeTypes.DIRECTIVE) {
|
|
const arg = node.arg === void 0 ? [] : getFreeVariablesForNode(node.arg);
|
|
const exp = node.exp === void 0 ? [] : getFreeVariablesForNode(node.exp);
|
|
return [...arg, ...exp];
|
|
}
|
|
return [];
|
|
}
|
|
function getFreeVariablesForNode(node) {
|
|
var _a, _b, _c;
|
|
if (node.type === NodeTypes.SIMPLE_EXPRESSION) {
|
|
return node.isStatic ? [] : getFreeVariablesForText(node.content);
|
|
} else if (node.type === NodeTypes.COMPOUND_EXPRESSION) {
|
|
return node.children.flatMap(
|
|
(x) => typeof x !== "object" ? [] : getFreeVariablesForNode(x)
|
|
);
|
|
} else if (node.type === NodeTypes.INTERPOLATION) {
|
|
return getFreeVariablesForNode(node.content);
|
|
} else if (node.type === NodeTypes.ELEMENT) {
|
|
const children = node.children.flatMap(getFreeVariablesForNode);
|
|
const directiveProps = node.props.flatMap(
|
|
(x) => x.type === NodeTypes.DIRECTIVE ? [x] : []
|
|
);
|
|
const attributeProps = node.props.flatMap(
|
|
(x) => x.type === NodeTypes.ATTRIBUTE ? [x] : []
|
|
);
|
|
const refNode = attributeProps.find(
|
|
(node2) => node2.name === "ref" && node2.value !== void 0
|
|
);
|
|
const refIdentifier = (_a = refNode == null ? void 0 : refNode.value) == null ? void 0 : _a.content;
|
|
const vSlotNode = directiveProps.find((node2) => node2.name === "slot");
|
|
const vSlotArgIdentifiers = (vSlotNode == null ? void 0 : vSlotNode.arg) === void 0 ? [] : getFreeVariablesForNode(vSlotNode.arg);
|
|
const vSlotExpVariableShadowingIdentifiers = [];
|
|
const vForNode = directiveProps.find((node2) => node2.name === "for");
|
|
const vForIdentifiers = ((_b = vForNode == null ? void 0 : vForNode.exp) == null ? void 0 : _b.type) === NodeTypes.SIMPLE_EXPRESSION ? getFreeVariablesForText(
|
|
vForNode.exp.content.replace(/^.*\s(?:in|of)\s/, "")
|
|
) : [];
|
|
const vForExpVariableShadowingIdentifiers = [];
|
|
const props = directiveProps.filter(({ name }) => name !== "slot" && name !== "for").flatMap(getFreeVariablesForPropsNode);
|
|
const shadowingIdentifiers = /* @__PURE__ */ new Set([
|
|
...vSlotExpVariableShadowingIdentifiers,
|
|
...vForExpVariableShadowingIdentifiers
|
|
]);
|
|
return [
|
|
...vSlotArgIdentifiers,
|
|
refIdentifier,
|
|
...vForIdentifiers,
|
|
...[...children, ...props].filter((x) => !shadowingIdentifiers.has(x))
|
|
].filter(notNullish);
|
|
} else if (node.type === NodeTypes.FOR) {
|
|
return [node.source, ...node.children].flatMap(getFreeVariablesForNode);
|
|
} else if (node.type === NodeTypes.IF) {
|
|
return ((_c = node.branches) != null ? _c : []).flatMap(getFreeVariablesForNode);
|
|
} else if (node.type === NodeTypes.IF_BRANCH) {
|
|
return [node.condition, ...node.children].filter(notNullish).flatMap(getFreeVariablesForNode);
|
|
} else if (node.type === NodeTypes.TEXT || node.type === NodeTypes.COMMENT || node.type === NodeTypes.TEXT_CALL) {
|
|
return [];
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
function findReferencesForSFC(templateNode) {
|
|
var _a, _b, _c;
|
|
const components = (_a = templateNode == null ? void 0 : templateNode.children.flatMap(getComponents)) != null ? _a : [];
|
|
const directives = (_b = templateNode == null ? void 0 : templateNode.children.flatMap(getDirectiveNames)) != null ? _b : [];
|
|
const identifiers = (_c = templateNode == null ? void 0 : templateNode.children.flatMap(getFreeVariablesForNode)) != null ? _c : [];
|
|
return {
|
|
components,
|
|
directives,
|
|
identifiers
|
|
};
|
|
}
|
|
function getBabelParserOptions(lang) {
|
|
lang = lang || "js";
|
|
const pluginsDict = {
|
|
js: [],
|
|
ts: ["typescript"],
|
|
jsx: ["jsx"],
|
|
tsx: ["jsx", "typescript"]
|
|
};
|
|
const plugins = pluginsDict[lang];
|
|
if (plugins === void 0)
|
|
throw new SyntaxError(`Unsupported script language: ${lang}`);
|
|
return {
|
|
sourceType: "module",
|
|
plugins
|
|
};
|
|
}
|
|
async function parseSFC(code, id, options) {
|
|
var _a, _b, _c;
|
|
const elementChildren = baseParse(code, parserOptions).children.flatMap(
|
|
(x) => x.type === NodeTypes.ELEMENT && x.tagType === ElementTypes.ELEMENT ? [x] : []
|
|
);
|
|
const templateNode = elementChildren.find((x) => x.tag === "template");
|
|
const [scriptSetupChildNodes, scriptChildNodes] = partition(
|
|
elementChildren.filter((x) => x.tag === "script"),
|
|
(x) => x.props.some((p) => p.type === NodeTypes.ATTRIBUTE && p.name === "setup")
|
|
);
|
|
const getScriptTagMeta = (n, astTransforms = (x) => x) => {
|
|
var _a2, _b2, _c2, _d, _e, _f;
|
|
if (n === void 0) {
|
|
const content2 = "";
|
|
const ast2 = parse(content2, {
|
|
sourceType: "module",
|
|
plugins: []
|
|
}).program;
|
|
return {
|
|
start: 0,
|
|
end: 0,
|
|
contentStart: 0,
|
|
contentEnd: 0,
|
|
content: content2,
|
|
attrs: {},
|
|
found: false,
|
|
ast: ast2
|
|
};
|
|
}
|
|
const attrs = Object.fromEntries(
|
|
n.props.flatMap(
|
|
(x) => {
|
|
var _a3;
|
|
return !(x.type === NodeTypes.ATTRIBUTE && typeof ((_a3 = x.value) == null ? void 0 : _a3.content) === "string") ? [] : [[x.name, x.value.content]];
|
|
}
|
|
)
|
|
);
|
|
const content = (_b2 = (_a2 = n.children[0]) == null ? void 0 : _a2.loc.source) != null ? _b2 : "";
|
|
const contentStart = (_d = (_c2 = n.children[0]) == null ? void 0 : _c2.loc.start.offset) != null ? _d : 0;
|
|
const contentEnd = (_f = (_e = n.children[0]) == null ? void 0 : _e.loc.end.offset) != null ? _f : 0;
|
|
const ast = astTransforms(
|
|
parse(content, getBabelParserOptions(attrs.lang)).program
|
|
);
|
|
return {
|
|
start: n.loc.start.offset,
|
|
end: n.loc.end.offset,
|
|
contentStart,
|
|
contentEnd,
|
|
content,
|
|
attrs,
|
|
found: true,
|
|
ast
|
|
};
|
|
};
|
|
const scriptSetup = getScriptTagMeta(
|
|
scriptSetupChildNodes[0],
|
|
(_a = options == null ? void 0 : options.astTransforms) == null ? void 0 : _a.scriptSetup
|
|
);
|
|
const script = getScriptTagMeta(
|
|
scriptChildNodes[0],
|
|
(_b = options == null ? void 0 : options.astTransforms) == null ? void 0 : _b.script
|
|
);
|
|
if (script.found && scriptSetup.found && scriptSetup.attrs.lang !== script.attrs.lang) {
|
|
throw new SyntaxError(
|
|
"<script setup> language must be the same as <script>"
|
|
);
|
|
}
|
|
const codeOfTemplate = templateNode == null ? void 0 : templateNode.props.some(
|
|
(p) => {
|
|
var _a2;
|
|
return p.type === NodeTypes.ATTRIBUTE && p.name === "lang" && ((_a2 = p.value) == null ? void 0 : _a2.type) === NodeTypes.TEXT && p.value.content === "pug";
|
|
}
|
|
) ? baseParse(
|
|
(await import('pug')).compile(
|
|
templateNode.children.map((x) => x.loc.source).join(""),
|
|
{
|
|
filename: id
|
|
}
|
|
)(),
|
|
parserOptions
|
|
) : templateNode;
|
|
const result = codeOfTemplate ? findReferencesForSFC(codeOfTemplate) : void 0;
|
|
return {
|
|
id,
|
|
template: {
|
|
components: new Set(result == null ? void 0 : result.components.map(pascalize)),
|
|
directives: new Set(
|
|
result == null ? void 0 : result.directives.filter((x) => !BUILD_IN_DIRECTIVES.has(x)).map(camelize)
|
|
),
|
|
identifiers: new Set(result == null ? void 0 : result.identifiers)
|
|
},
|
|
scriptSetup,
|
|
script,
|
|
parserOptions: getBabelParserOptions(
|
|
(_c = script.attrs.lang) != null ? _c : scriptSetup.attrs.lang
|
|
),
|
|
extraDeclarations: []
|
|
};
|
|
}
|
|
|
|
const DEFINE_PROPS = "defineProps";
|
|
const DEFINE_EMITS = "defineEmits";
|
|
const DEFINE_EXPOSE = "defineExpose";
|
|
const WITH_DEFAULTS = "withDefaults";
|
|
function applyMacros(nodes) {
|
|
let hasDefinePropsCall = false;
|
|
let hasDefineEmitCall = false;
|
|
let propsRuntimeDecl;
|
|
let propsRuntimeDefaults;
|
|
let propsTypeDecl;
|
|
let propsTypeDeclRaw;
|
|
let emitsRuntimeDecl;
|
|
let emitsTypeDecl;
|
|
let emitsTypeDeclRaw;
|
|
let exposeDecl;
|
|
const typeDeclaredProps = {};
|
|
const declaredTypes = {};
|
|
function error(msg, _node) {
|
|
throw new Error(msg);
|
|
}
|
|
function processDefineProps(node) {
|
|
if (!isCallOf(node, DEFINE_PROPS))
|
|
return false;
|
|
if (hasDefinePropsCall)
|
|
error(`duplicate ${DEFINE_PROPS}() call`);
|
|
hasDefinePropsCall = true;
|
|
propsRuntimeDecl = node.arguments[0];
|
|
if (node.typeParameters) {
|
|
if (propsRuntimeDecl) {
|
|
error(
|
|
`${DEFINE_PROPS}() cannot accept both type and non-type arguments at the same time. Use one or the other.`);
|
|
}
|
|
propsTypeDeclRaw = node.typeParameters.params[0];
|
|
propsTypeDecl = resolveQualifiedType(
|
|
propsTypeDeclRaw,
|
|
(node2) => node2.type === "TSTypeLiteral"
|
|
);
|
|
if (!propsTypeDecl) {
|
|
error(
|
|
`type argument passed to ${DEFINE_PROPS}() must be a literal type, or a reference to an interface or literal type.`);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function processWithDefaults(node) {
|
|
if (!isCallOf(node, WITH_DEFAULTS))
|
|
return false;
|
|
if (processDefineProps(node.arguments[0])) {
|
|
if (propsRuntimeDecl) {
|
|
error(
|
|
`${WITH_DEFAULTS} can only be used with type-based ${DEFINE_PROPS} declaration.`);
|
|
}
|
|
propsRuntimeDefaults = node.arguments[1];
|
|
} else {
|
|
error(
|
|
`${WITH_DEFAULTS}' first argument must be a ${DEFINE_PROPS} call.`,
|
|
node.arguments[0] || node
|
|
);
|
|
}
|
|
return true;
|
|
}
|
|
function processDefineEmits(node) {
|
|
if (!isCallOf(node, DEFINE_EMITS))
|
|
return false;
|
|
if (hasDefineEmitCall)
|
|
error(`duplicate ${DEFINE_EMITS}() call`);
|
|
hasDefineEmitCall = true;
|
|
emitsRuntimeDecl = node.arguments[0];
|
|
if (node.typeParameters) {
|
|
if (emitsRuntimeDecl) {
|
|
error(
|
|
`${DEFINE_EMITS}() cannot accept both type and non-type arguments at the same time. Use one or the other.`);
|
|
}
|
|
emitsTypeDeclRaw = node.typeParameters.params[0];
|
|
emitsTypeDecl = resolveQualifiedType(
|
|
emitsTypeDeclRaw,
|
|
(node2) => node2.type === "TSFunctionType" || node2.type === "TSTypeLiteral"
|
|
);
|
|
if (!emitsTypeDecl) {
|
|
error(
|
|
`type argument passed to ${DEFINE_EMITS}() must be a function type, a literal type with call signatures, or a reference to the above types.`);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function resolveQualifiedType(node, qualifier) {
|
|
if (qualifier(node))
|
|
return node;
|
|
if (node.type === "TSTypeReference" && node.typeName.type === "Identifier") {
|
|
const refName = node.typeName.name;
|
|
const isQualifiedType = (node2) => {
|
|
if (node2.type === "TSInterfaceDeclaration" && node2.id.name === refName)
|
|
return node2.body;
|
|
else if (node2.type === "TSTypeAliasDeclaration" && node2.id.name === refName && qualifier(node2.typeAnnotation))
|
|
return node2.typeAnnotation;
|
|
else if (node2.type === "ExportNamedDeclaration" && node2.declaration)
|
|
return isQualifiedType(node2.declaration);
|
|
};
|
|
for (const node2 of nodes) {
|
|
const qualified = isQualifiedType(node2);
|
|
if (qualified)
|
|
return qualified;
|
|
}
|
|
}
|
|
}
|
|
function processDefineExpose(node) {
|
|
if (!isCallOf(node, DEFINE_EXPOSE))
|
|
return false;
|
|
if (exposeDecl)
|
|
error(`duplicate ${DEFINE_EXPOSE}() call`);
|
|
if (node.arguments.length !== 1)
|
|
error(`${DEFINE_EXPOSE}() requires one argument`);
|
|
exposeDecl = node.arguments[0];
|
|
return true;
|
|
}
|
|
function genRuntimeProps(props) {
|
|
const keys = Object.keys(props);
|
|
if (!keys.length)
|
|
return void 0;
|
|
const hasStaticDefaults = propsRuntimeDefaults && propsRuntimeDefaults.type === "ObjectExpression" && propsRuntimeDefaults.properties.every(
|
|
(node) => node.type === "ObjectProperty" && !node.computed
|
|
);
|
|
return t.objectExpression(
|
|
Object.entries(props).map(([key, value]) => {
|
|
const prop = hasStaticDefaults ? propsRuntimeDefaults.properties.find((node) => node.key.name === key) : void 0;
|
|
if (prop)
|
|
value.required = false;
|
|
const entries = Object.entries(value).map(
|
|
([key2, value2]) => key2 === "type" ? t.objectProperty(t.identifier(key2), typeof value2 === "string" ? t.identifier(value2) : t.arrayExpression(value2.map((i) => t.identifier(i)))) : t.objectProperty(t.identifier(key2), parseExpression(JSON.stringify(value2)))
|
|
);
|
|
if (prop)
|
|
entries.push(t.objectProperty(t.identifier("default"), prop.value));
|
|
return t.objectProperty(
|
|
t.identifier(key),
|
|
t.objectExpression(entries)
|
|
);
|
|
})
|
|
);
|
|
}
|
|
function getProps() {
|
|
if (propsRuntimeDecl)
|
|
return propsRuntimeDecl;
|
|
if (propsTypeDecl) {
|
|
extractRuntimeProps(propsTypeDecl, typeDeclaredProps, declaredTypes);
|
|
return genRuntimeProps(typeDeclaredProps);
|
|
}
|
|
}
|
|
function throwIfAwait(node) {
|
|
if (node.type === "AwaitExpression")
|
|
error("top-level await is not supported in Vue 2");
|
|
}
|
|
nodes = nodes.map((raw) => {
|
|
let node = raw;
|
|
if (raw.type === "ExpressionStatement")
|
|
node = raw.expression;
|
|
if (node.type === "VariableDeclaration" && !node.declare) {
|
|
const total = node.declarations.length;
|
|
for (let i = 0; i < total; i++) {
|
|
const decl = node.declarations[i];
|
|
if (decl.init) {
|
|
if (processDefineEmits(decl.init))
|
|
decl.init = t.memberExpression(t.identifier("__ctx"), t.identifier("emit"));
|
|
else if (processDefineProps(decl.init) || processWithDefaults(decl.init))
|
|
decl.init = t.identifier("__props");
|
|
else
|
|
throwIfAwait(decl.init);
|
|
}
|
|
}
|
|
}
|
|
if (processWithDefaults(node) || processDefineEmits(node) || processDefineProps(node) || processDefineExpose(node))
|
|
return null;
|
|
throwIfAwait(node);
|
|
return raw;
|
|
}).filter(Boolean);
|
|
return {
|
|
nodes,
|
|
props: getProps(),
|
|
expose: exposeDecl
|
|
};
|
|
}
|
|
function isCallOf(node, test) {
|
|
return !!(node && node.type === "CallExpression" && node.callee.type === "Identifier" && (typeof test === "string" ? node.callee.name === test : test(node.callee.name)));
|
|
}
|
|
function extractRuntimeProps(node, props, declaredTypes) {
|
|
const members = node.type === "TSTypeLiteral" ? node.members : node.body;
|
|
for (const m of members) {
|
|
if ((m.type === "TSPropertySignature" || m.type === "TSMethodSignature") && m.key.type === "Identifier") {
|
|
let type;
|
|
if (m.type === "TSMethodSignature") {
|
|
type = ["Function"];
|
|
} else if (m.typeAnnotation) {
|
|
type = inferRuntimeType(
|
|
m.typeAnnotation.typeAnnotation,
|
|
declaredTypes
|
|
);
|
|
}
|
|
props[m.key.name] = {
|
|
key: m.key.name,
|
|
required: !m.optional,
|
|
type: (type == null ? void 0 : type.length) === 1 ? type[0] : type || "null"
|
|
};
|
|
}
|
|
}
|
|
}
|
|
function inferRuntimeType(node, declaredTypes) {
|
|
switch (node.type) {
|
|
case "TSStringKeyword":
|
|
return ["String"];
|
|
case "TSNumberKeyword":
|
|
return ["Number"];
|
|
case "TSBooleanKeyword":
|
|
return ["Boolean"];
|
|
case "TSObjectKeyword":
|
|
return ["Object"];
|
|
case "TSTypeLiteral":
|
|
return ["Object"];
|
|
case "TSFunctionType":
|
|
return ["Function"];
|
|
case "TSArrayType":
|
|
case "TSTupleType":
|
|
return ["Array"];
|
|
case "TSLiteralType":
|
|
switch (node.literal.type) {
|
|
case "StringLiteral":
|
|
return ["String"];
|
|
case "BooleanLiteral":
|
|
return ["Boolean"];
|
|
case "NumericLiteral":
|
|
case "BigIntLiteral":
|
|
return ["Number"];
|
|
default:
|
|
return ["null"];
|
|
}
|
|
case "TSTypeReference":
|
|
if (node.typeName.type === "Identifier") {
|
|
if (declaredTypes[node.typeName.name])
|
|
return declaredTypes[node.typeName.name];
|
|
switch (node.typeName.name) {
|
|
case "Array":
|
|
case "Function":
|
|
case "Object":
|
|
case "Set":
|
|
case "Map":
|
|
case "WeakSet":
|
|
case "WeakMap":
|
|
return [node.typeName.name];
|
|
case "Record":
|
|
case "Partial":
|
|
case "Readonly":
|
|
case "Pick":
|
|
case "Omit":
|
|
case "Exclude":
|
|
case "Extract":
|
|
case "Required":
|
|
case "InstanceType":
|
|
return ["Object"];
|
|
}
|
|
}
|
|
return ["null"];
|
|
case "TSParenthesizedType":
|
|
return inferRuntimeType(node.typeAnnotation, declaredTypes);
|
|
case "TSUnionType":
|
|
return [
|
|
...new Set(
|
|
[].concat(
|
|
...node.types.map((t2) => inferRuntimeType(t2, declaredTypes))
|
|
)
|
|
)
|
|
];
|
|
case "TSIntersectionType":
|
|
return ["Object"];
|
|
default:
|
|
return ["null"];
|
|
}
|
|
}
|
|
|
|
function isAsyncImport(node) {
|
|
if (t.isVariableDeclaration(node)) {
|
|
const declaration = node.declarations[0];
|
|
return declaration !== void 0 && t.isCallExpression(declaration.init) && t.isIdentifier(declaration.init.callee) && declaration.init.callee.name === "defineAsyncComponent";
|
|
}
|
|
return false;
|
|
}
|
|
function transformScriptSetup(sfc, options) {
|
|
var _a, _b;
|
|
const { scriptSetup, script, template } = sfc;
|
|
const { nodes: body, props, expose } = applyMacros(scriptSetup.ast.body);
|
|
const [hoisted, setupBody] = partition(
|
|
body,
|
|
(n) => isAsyncImport(n) || t.isImportDeclaration(n) || t.isExportNamedDeclaration(n) || n.type.startsWith("TS")
|
|
);
|
|
const declarationArray = uniq([
|
|
...getIdentifierDeclarations(hoisted),
|
|
...getIdentifierDeclarations(setupBody),
|
|
...getIdentifierDeclarations(script.ast.body)
|
|
]).filter(notNullish);
|
|
const returns = declarationArray.filter((i) => template.identifiers.has(i)).map((i) => {
|
|
const id = t.identifier(i);
|
|
return t.objectProperty(id, id, false, true);
|
|
});
|
|
const components = Array.from(template.components).map(
|
|
(component) => {
|
|
var _a2;
|
|
return (_a2 = declarationArray.find((declare) => declare === component)) != null ? _a2 : declarationArray.find((declare) => pascalize(declare) === component);
|
|
}
|
|
).filter(notNullish);
|
|
const directiveDeclaration = Array.from(template.directives).map((directive) => {
|
|
const identifier = declarationArray.find(
|
|
(declaration) => declaration === `v${capitalize(directive)}`
|
|
);
|
|
if (identifier === void 0)
|
|
return void 0;
|
|
return { identifier, directive };
|
|
}).filter(notNullish);
|
|
const __sfc = t.identifier("__sfc_main");
|
|
let hasBody = false;
|
|
const bodyNodes = script.ast.body.map((node) => {
|
|
if (node.type === "ExportDefaultDeclaration") {
|
|
hasBody = true;
|
|
return t.variableDeclaration("const", [
|
|
t.variableDeclarator(__sfc, node.declaration)
|
|
]);
|
|
}
|
|
return node;
|
|
});
|
|
let ast = t.program([
|
|
...sfc.extraDeclarations,
|
|
...hoisted,
|
|
...bodyNodes
|
|
]);
|
|
if (!hasBody) {
|
|
ast.body.push(
|
|
t.variableDeclaration("const", [
|
|
t.variableDeclarator(__sfc, t.objectExpression([]))
|
|
])
|
|
);
|
|
}
|
|
if (props) {
|
|
hasBody = true;
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("props")),
|
|
props
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (body.length) {
|
|
hasBody = true;
|
|
const returnExpr = expose ? t.callExpression(
|
|
t.memberExpression(t.identifier("Object"), t.identifier("assign")),
|
|
[t.objectExpression(returns), expose]
|
|
) : t.objectExpression(returns);
|
|
const returnStatement = t.returnStatement(returnExpr);
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("setup")),
|
|
t.arrowFunctionExpression(
|
|
[t.identifier("__props"), t.identifier("__ctx")],
|
|
t.blockStatement([...setupBody, returnStatement])
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (components.length) {
|
|
hasBody = true;
|
|
const componentsObject = t.objectExpression(
|
|
components.map((i) => {
|
|
const id = t.identifier(i);
|
|
return t.objectProperty(id, id, false, true);
|
|
})
|
|
);
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("components")),
|
|
t.callExpression(
|
|
t.memberExpression(t.identifier("Object"), t.identifier("assign")),
|
|
[
|
|
componentsObject,
|
|
t.memberExpression(__sfc, t.identifier("components"))
|
|
]
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (directiveDeclaration.length) {
|
|
hasBody = true;
|
|
const directivesObject = t.objectExpression(
|
|
directiveDeclaration.map(
|
|
({ directive, identifier }) => t.objectProperty(
|
|
t.identifier(directive),
|
|
t.identifier(identifier),
|
|
false,
|
|
false
|
|
)
|
|
)
|
|
);
|
|
ast.body.push(
|
|
t.expressionStatement(
|
|
t.assignmentExpression(
|
|
"=",
|
|
t.memberExpression(__sfc, t.identifier("directives")),
|
|
t.callExpression(
|
|
t.memberExpression(t.identifier("Object"), t.identifier("assign")),
|
|
[
|
|
directivesObject,
|
|
t.memberExpression(__sfc, t.identifier("directives"))
|
|
]
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (!hasBody && !(options == null ? void 0 : options.astTransforms)) {
|
|
return {
|
|
ast: null,
|
|
code: ""
|
|
};
|
|
}
|
|
ast.body.push(t.exportDefaultDeclaration(__sfc));
|
|
ast = ((_b = (_a = options == null ? void 0 : options.astTransforms) == null ? void 0 : _a.post) == null ? void 0 : _b.call(_a, ast, sfc)) || ast;
|
|
return {
|
|
ast,
|
|
code: generate(ast).code
|
|
};
|
|
}
|
|
|
|
function transformSfcRefSugar(sfc, options) {
|
|
const importedHelpers = /* @__PURE__ */ new Set();
|
|
for (const script of [sfc.script, sfc.scriptSetup]) {
|
|
if (shouldTransform$1(script.content)) {
|
|
const s = new MagicString(script.content);
|
|
const { importedHelpers: imports } = transformAST(script.ast, s);
|
|
Array.from(imports).forEach((helper) => importedHelpers.add(helper));
|
|
script.content = s.toString();
|
|
script.ast = parse(script.content, sfc.parserOptions).program;
|
|
}
|
|
}
|
|
if (importedHelpers.size) {
|
|
sfc.extraDeclarations = [
|
|
t.importDeclaration(
|
|
Array.from(importedHelpers).map((i) => t.importSpecifier(t.identifier(`_${i}`), t.identifier(i))),
|
|
t.stringLiteral(options.importHelpersFrom)
|
|
)
|
|
];
|
|
}
|
|
}
|
|
|
|
function resolveOptions(options = {}) {
|
|
return Object.assign(
|
|
{},
|
|
{
|
|
sourceMap: true,
|
|
reactivityTransform: false,
|
|
importHelpersFrom: "@vue/composition-api",
|
|
astTransforms: {}
|
|
},
|
|
options
|
|
);
|
|
}
|
|
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
var __spreadValues = (a, b) => {
|
|
for (var prop in b || (b = {}))
|
|
if (__hasOwnProp.call(b, prop))
|
|
__defNormalProp(a, prop, b[prop]);
|
|
if (__getOwnPropSymbols)
|
|
for (var prop of __getOwnPropSymbols(b)) {
|
|
if (__propIsEnum.call(b, prop))
|
|
__defNormalProp(a, prop, b[prop]);
|
|
}
|
|
return a;
|
|
};
|
|
const scriptSetupRE = /<script\s(.*\s)?setup(\s.*)?>/;
|
|
function shouldTransform(code, id, options) {
|
|
if (code.includes("export default __sfc_main"))
|
|
return false;
|
|
return (options == null ? void 0 : options.reactivityTransform) && shouldTransform$1(code) || scriptSetupRE.test(code);
|
|
}
|
|
async function transform(input, id, options) {
|
|
if (!shouldTransform(input, id, options))
|
|
return null;
|
|
const resolved = resolveOptions(options);
|
|
if (id.endsWith(".vue") || id.includes(".vue?vue"))
|
|
return await transformVue(input, id, resolved);
|
|
else
|
|
return transformNonVue(input, id, resolved);
|
|
}
|
|
function transformNonVue(input, id, options) {
|
|
if (options.reactivityTransform && shouldTransform$1(input)) {
|
|
return transform$1(input, {
|
|
filename: id,
|
|
sourceMap: options.sourceMap,
|
|
importHelpersFrom: options.importHelpersFrom
|
|
});
|
|
}
|
|
return null;
|
|
}
|
|
async function transformVue(input, id, options) {
|
|
const s = new MagicString(input);
|
|
const sfc = await parseSFC(input, id);
|
|
if (options.reactivityTransform)
|
|
transformSfcRefSugar(sfc, options);
|
|
const { code } = transformScriptSetup(sfc, options);
|
|
const attributes = __spreadValues(__spreadValues({}, sfc.script.attrs), sfc.scriptSetup.attrs);
|
|
delete attributes.setup;
|
|
const attr = Object.entries(attributes).map(([key, value]) => value ? `${key}="${value}"` : key).join(" ");
|
|
if (code) {
|
|
const block = `<script ${attr}>
|
|
${code}
|
|
<\/script>`;
|
|
s.remove(sfc.script.start, sfc.script.end);
|
|
if (sfc.scriptSetup.start !== sfc.scriptSetup.end) {
|
|
s.overwrite(
|
|
sfc.scriptSetup.start,
|
|
sfc.scriptSetup.end,
|
|
block
|
|
);
|
|
} else {
|
|
s.prependLeft(0, `${block}
|
|
`);
|
|
}
|
|
}
|
|
return {
|
|
code: s.toString(),
|
|
map: options.sourceMap ? s.generateMap({
|
|
source: id,
|
|
includeContent: true
|
|
}) : null
|
|
};
|
|
}
|
|
|
|
const unplugin = createUnplugin((options = {}) => {
|
|
const filter = createFilter(
|
|
options.include || (options.reactivityTransform ? [/\.vue$/, /\.vue\?vue/, /\.[jt]sx?$/] : [/\.vue$/, /\.vue\?vue/]),
|
|
options.exclude || [/node_modules/, /\.git/, /\.nuxt/]
|
|
);
|
|
return {
|
|
name: "unplugin-vue2-script-setup",
|
|
enforce: "pre",
|
|
transformInclude(id) {
|
|
return filter(id);
|
|
},
|
|
async transform(code, id) {
|
|
try {
|
|
return await transform(code, id, options);
|
|
} catch (e) {
|
|
this.error(e);
|
|
}
|
|
}
|
|
};
|
|
});
|
|
|
|
var vite = unplugin.vite;
|
|
|
|
export { vite as default };
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5tanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlL2JhYmVsLnRzIiwiLi4vc3JjL2NvcmUvaWRlbnRpZmllcnMudHMiLCIuLi9zcmMvY29yZS91dGlscy50cyIsIi4uL3NyYy9jb3JlL3BhcnNlU0ZDLnRzIiwiLi4vc3JjL2NvcmUvbWFjcm9zLnRzIiwiLi4vc3JjL2NvcmUvdHJhbnNmb3JtU2NyaXB0U2V0dXAudHMiLCIuLi9zcmMvY29yZS90cmFuc2Zvcm1TZmNSZWZTdWdhci50cyIsIi4uL3NyYy9jb3JlL29wdGlvbnMudHMiLCIuLi9zcmMvY29yZS90cmFuc2Zvcm0udHMiLCIuLi9zcmMvaW5kZXgudHMiLCIuLi9zcmMvdml0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYWJlbCBmcm9tICdAYmFiZWwvY29yZSdcbmltcG9ydCB7IHBhcnNlLCBwYXJzZUV4cHJlc3Npb24gfSBmcm9tICdAYmFiZWwvcGFyc2VyJ1xuaW1wb3J0IGcgZnJvbSAnQGJhYmVsL2dlbmVyYXRvcidcbmltcG9ydCAqIGFzIGJhYmVsX3RyYXZlcnNlIGZyb20gJ0BiYWJlbC90cmF2ZXJzZSdcblxuZXhwb3J0IGNvbnN0IHQ6IHR5cGVvZiBiYWJlbFsndHlwZXMnXSA9ICgoYmFiZWwgYXMgYW55KS5kZWZhdWx0IHx8IGJhYmVsKS50eXBlc1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlOiB0eXBlb2YgZyA9ICgoZyBhcyBhbnkpLmRlZmF1bHQgfHwgZylcbmV4cG9ydCBjb25zdCB0cmF2ZXJzZSA9ICgoYmFiZWxfdHJhdmVyc2UgYXMgYW55KT8uZGVmYXVsdD8uZGVmYXVsdCBhcyBudWxsKSA/PyBiYWJlbF90cmF2ZXJzZT8uZGVmYXVsdCA/PyBiYWJlbF90cmF2ZXJzZVxuZXhwb3J0IHsgcGFyc2VFeHByZXNzaW9uLCBwYXJzZSB9XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEV4cHJlc3Npb24sXG4gIEZpbGUsXG4gIFByaXZhdGVOYW1lLFxuICBTcHJlYWRFbGVtZW50LFxuICBTdGF0ZW1lbnQsXG4gIFRTVHlwZSxcbn0gZnJvbSAnQGJhYmVsL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYXJzZVJlc3VsdCB9IGZyb20gJ0BiYWJlbC9wYXJzZXInXG5pbXBvcnQgeyB0LCB0cmF2ZXJzZSB9IGZyb20gJy4vYmFiZWwnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJZGVudGlmaWVyRGVjbGFyYXRpb25zKG5vZGVzOiBTdGF0ZW1lbnRbXSkge1xuICBsZXQgcmVzdWx0ITogU2V0PHN0cmluZz5cbiAgbGV0IHByb2dyYW1TY29wZVVpZDogbnVtYmVyXG4gIHRyYXZlcnNlKHQuZmlsZSh0LnByb2dyYW0obm9kZXMpKSwge1xuICAgIFByb2dyYW0ocGF0aCkge1xuICAgICAgcmVzdWx0ID0gbmV3IFNldChPYmplY3Qua2V5cyhwYXRoLnNjb3BlLmJpbmRpbmdzKSlcbiAgICAgIHByb2dyYW1TY29wZVVpZCA9IChwYXRoLnNjb3BlIGFzIGFueSkudWlkXG4gICAgfSxcbiAgICAvLyBGSVhNRTogYmFiZWwgYnVnLCB0ZW1wb3JhcnkgYWRkIFRTRW51bURlY2xhcmF0aW9uIGFuZCBUU01vZHVsZURlY2xhcmF0aW9uIGxvZ2ljXG4gICAgVFNFbnVtRGVjbGFyYXRpb24ocGF0aCkge1xuICAgICAgaWYgKChwYXRoLnNjb3BlIGFzIGFueSkudWlkID09PSBwcm9ncmFtU2NvcGVVaWQpXG4gICAgICAgIHJlc3VsdC5hZGQocGF0aC5ub2RlLmlkLm5hbWUpXG4gICAgfSxcbiAgICBUU01vZHVsZURlY2xhcmF0aW9uKHBhdGgpIHtcbiAgICAgIGlmICgocGF0aC5zY29wZSBhcyBhbnkpLnVpZCA9PT0gcHJvZ3JhbVNjb3BlVWlkKSB7XG4gICAgICAgIGNvbnN0IGlkID0gcGF0aC5ub2RlLmlkXG4gICAgICAgIGlmIChpZC50eXBlID09PSAnSWRlbnRpZmllcicpXG4gICAgICAgICAgcmVzdWx0LmFkZChpZC5uYW1lKVxuICAgICAgfVxuICAgIH0sXG4gIH0pXG4gIHJldHVybiBBcnJheS5mcm9tKHJlc3VsdClcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgYGdldEZpbGVHbG9iYWxzYCBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGU/OiBFeHByZXNzaW9uIHwgVFNUeXBlIHwgU3ByZWFkRWxlbWVudCB8IFByaXZhdGVOYW1lIHwgU3RhdGVtZW50IHwgbnVsbCwgaWRlbnRpZmllcnMgPSBuZXcgU2V0PHN0cmluZz4oKSkge1xuICBpZiAoIW5vZGUpXG4gICAgcmV0dXJuIGlkZW50aWZpZXJzXG5cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50Jykge1xuICAgIG5vZGUuYm9keS5mb3JFYWNoKGNoaWxkID0+IGdldElkZW50aWZpZXJVc2FnZXMoY2hpbGQsIGlkZW50aWZpZXJzKSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50Jykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5leHByZXNzaW9uLCBpZGVudGlmaWVycylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgIGlkZW50aWZpZXJzLmFkZChub2RlLm5hbWUpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgfHwgbm9kZS50eXBlID09PSAnT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uJykge1xuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5vYmplY3QsIGlkZW50aWZpZXJzKVxuICAgIGlmIChub2RlLmNvbXB1dGVkKVxuICAgICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLnByb3BlcnR5LCBpZGVudGlmaWVycylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgfHwgbm9kZS50eXBlID09PSAnT3B0aW9uYWxDYWxsRXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuY2FsbGVlIGFzIEV4cHJlc3Npb24sIGlkZW50aWZpZXJzKVxuICAgIG5vZGUuYXJndW1lbnRzLmZvckVhY2goYXJnID0+IGdldElkZW50aWZpZXJVc2FnZXMoYXJnIGFzIEV4cHJlc3Npb24sIGlkZW50aWZpZXJzKSlcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdCaW5hcnlFeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdMb2dpY2FsRXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUubGVmdCwgaWRlbnRpZmllcnMpXG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLnJpZ2h0LCBpZGVudGlmaWVycylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdVbmFyeUV4cHJlc3Npb24nKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmFyZ3VtZW50LCBpZGVudGlmaWVycylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdGb3JPZlN0YXRlbWVudCcgfHwgbm9kZS50eXBlID09PSAnRm9ySW5TdGF0ZW1lbnQnKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLnJpZ2h0LCBpZGVudGlmaWVycylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdDb25kaXRpb25hbEV4cHJlc3Npb24nKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLnRlc3QsIGlkZW50aWZpZXJzKVxuICAgIGdldElkZW50aWZpZXJVc2FnZXMobm9kZS5jb25zZXF1ZW50LCBpZGVudGlmaWVycylcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuYWx0ZXJuYXRlLCBpZGVudGlmaWVycylcbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdPYmplY3RFeHByZXNzaW9uJykge1xuICAgIG5vZGUucHJvcGVydGllcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICBpZiAocHJvcC50eXBlID09PSAnT2JqZWN0UHJvcGVydHknKSB7XG4gICAgICAgIGlmIChwcm9wLmNvbXB1dGVkKVxuICAgICAgICAgIGdldElkZW50aWZpZXJVc2FnZXMocHJvcC5rZXksIGlkZW50aWZpZXJzKVxuICAgICAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKHByb3AudmFsdWUgYXMgRXhwcmVzc2lvbiwgaWRlbnRpZmllcnMpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChwcm9wLnR5cGUgPT09ICdTcHJlYWRFbGVtZW50Jykge1xuICAgICAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKHByb3AsIGlkZW50aWZpZXJzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQXJyYXlFeHByZXNzaW9uJykge1xuICAgIG5vZGUuZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IGdldElkZW50aWZpZXJVc2FnZXMoZWxlbWVudCwgaWRlbnRpZmllcnMpKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ1NwcmVhZEVsZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ1JldHVyblN0YXRlbWVudCcpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuYXJndW1lbnQsIGlkZW50aWZpZXJzKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ05ld0V4cHJlc3Npb24nKSB7XG4gICAgZ2V0SWRlbnRpZmllclVzYWdlcyhub2RlLmNhbGxlZSBhcyBFeHByZXNzaW9uLCBpZGVudGlmaWVycylcbiAgICBub2RlLmFyZ3VtZW50cy5mb3JFYWNoKGFyZyA9PiBnZXRJZGVudGlmaWVyVXNhZ2VzKGFyZyBhcyBFeHByZXNzaW9uLCBpZGVudGlmaWVycykpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicpIHtcbiAgICBnZXRJZGVudGlmaWVyVXNhZ2VzKG5vZGUuYm9keSwgaWRlbnRpZmllcnMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnVGVtcGxhdGVMaXRlcmFsJykge1xuICAgIG5vZGUuZXhwcmVzc2lvbnMuZm9yRWFjaChleHByID0+IGdldElkZW50aWZpZXJVc2FnZXMoZXhwciwgaWRlbnRpZmllcnMpKVxuICB9XG4gIC8vIGVsc2Uge1xuICAvLyAgIGNvbnNvbGUubG9nKG5vZGUpXG4gIC8vIH1cbiAgcmV0dXJuIGlkZW50aWZpZXJzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlR2xvYmFscyhyZXN1bHQ6IFBhcnNlUmVzdWx0PEZpbGU+KSB7XG4gIGxldCBnbG9iYWxzITogU2V0PHN0cmluZz5cbiAgbGV0IHByb2dyYW1TY29wZVVpZDogbnVtYmVyXG4gIHRyYXZlcnNlKHJlc3VsdCwge1xuICAgIFByb2dyYW0ocGF0aCkge1xuICAgICAgZ2xvYmFscyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoKHBhdGguc2NvcGUgYXMgYW55KS5nbG9iYWxzKSlcbiAgICAgIHByb2dyYW1TY29wZVVpZCA9IChwYXRoLnNjb3BlIGFzIGFueSkudWlkXG4gICAgfSxcbiAgICAvLyBGSVhNRTogYmFiZWwgYnVnLCB0ZW1wb3JhcnkgYWRkIFRTRW51bURlY2xhcmF0aW9uIGFuZCBUU01vZHVsZURlY2xhcmF0aW9uIGxvZ2ljXG4gICAgVFNFbnVtRGVjbGFyYXRpb24ocGF0aCkge1xuICAgICAgaWYgKChwYXRoLnNjb3BlIGFzIGFueSkudWlkID09PSBwcm9ncmFtU2NvcGVVaWQpXG4gICAgICAgIGdsb2JhbHMuZGVsZXRlKHBhdGgubm9kZS5pZC5uYW1lKVxuICAgIH0sXG4gICAgVFNNb2R1bGVEZWNsYXJhdGlvbihwYXRoKSB7XG4gICAgICBpZiAoKHBhdGguc2NvcGUgYXMgYW55KS51aWQgPT09IHByb2dyYW1TY29wZVVpZCkge1xuICAgICAgICBjb25zdCBpZCA9IHBhdGgubm9kZS5pZFxuICAgICAgICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKVxuICAgICAgICAgIGdsb2JhbHMuZGVsZXRlKGlkLm5hbWUpXG4gICAgICB9XG4gICAgfSxcbiAgfSlcbiAgcmV0dXJuIEFycmF5LmZyb20oZ2xvYmFscylcbn1cbiIsImltcG9ydCB7IGNhbWVsaXplLCBjYXBpdGFsaXplIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnXG5cbmV4cG9ydCBjb25zdCBwYXNjYWxpemUgPSAoc3RyOiBzdHJpbmcpID0+IGNhcGl0YWxpemUoY2FtZWxpemUoc3RyKSlcblxuZXhwb3J0IGNvbnN0IGlzTm90TmlsID0gPFQ+KHZhbHVlOiBUKTogdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4gPT4gdmFsdWUgIT0gbnVsbFxuXG5leHBvcnQgZnVuY3Rpb24gZXhoYXVzdGl2ZUNoZWNrUmV0dXJuVW5kZWZpbmVkKF9wYXJhbTogbmV2ZXIpIHtcbiAgcmV0dXJuIHVuZGVmaW5lZCBhcyBuZXZlclxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgb25lLXZhciAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZSAqL1xuaW1wb3J0IHsgbm90TnVsbGlzaCwgcGFydGl0aW9uIH0gZnJvbSAnQGFudGZ1L3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBQcm9ncmFtIH0gZnJvbSAnQGJhYmVsL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYXJzZXJQbHVnaW4gfSBmcm9tICdAYmFiZWwvcGFyc2VyJ1xuaW1wb3J0IHR5cGUge1xuICBBdHRyaWJ1dGVOb2RlLFxuICBEaXJlY3RpdmVOb2RlLFxuICBFeHByZXNzaW9uTm9kZSxcbiAgUGxhaW5FbGVtZW50Tm9kZSxcbiAgUm9vdE5vZGUsXG4gIFRlbXBsYXRlQ2hpbGROb2RlLFxufSBmcm9tICdAdnVlL2NvbXBpbGVyLWNvcmUnXG5pbXBvcnQgeyBiYXNlUGFyc2UgfSBmcm9tICdAdnVlL2NvbXBpbGVyLWNvcmUnXG5pbXBvcnQgeyBwYXJzZXJPcHRpb25zIH0gZnJvbSAnQHZ1ZS9jb21waWxlci1kb20nXG5pbXBvcnQgeyBjYW1lbGl6ZSB9IGZyb20gJ0B2dWUvc2hhcmVkJ1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZWRTRkMsXG4gIFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyxcbiAgU2NyaXB0VGFnTWV0YSxcbn0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBnZXRGaWxlR2xvYmFscyB9IGZyb20gJy4vaWRlbnRpZmllcnMnXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJy4vYmFiZWwnXG5pbXBvcnQgeyBleGhhdXN0aXZlQ2hlY2tSZXR1cm5VbmRlZmluZWQsIHBhc2NhbGl6ZSB9IGZyb20gJy4vdXRpbHMnXG5cbm5hbWVzcGFjZSBOb2RlVHlwZXMge1xuICBleHBvcnQgY29uc3QgUk9PVCA9IDAsXG4gICAgRUxFTUVOVCA9IDEsXG4gICAgVEVYVCA9IDIsXG4gICAgQ09NTUVOVCA9IDMsXG4gICAgU0lNUExFX0VYUFJFU1NJT04gPSA0LFxuICAgIElOVEVSUE9MQVRJT04gPSA1LFxuICAgIEFUVFJJQlVURSA9IDYsXG4gICAgRElSRUNUSVZFID0gNyxcbiAgICBDT01QT1VORF9FWFBSRVNTSU9OID0gOCxcbiAgICBJRiA9IDksXG4gICAgSUZfQlJBTkNIID0gMTAsXG4gICAgRk9SID0gMTEsXG4gICAgVEVYVF9DQUxMID0gMTIsXG4gICAgVk5PREVfQ0FMTCA9IDEzLFxuICAgIEpTX0NBTExfRVhQUkVTU0lPTiA9IDE0LFxuICAgIEpTX09CSkVDVF9FWFBSRVNTSU9OID0gMTUsXG4gICAgSlNfUFJPUEVSVFkgPSAxNixcbiAgICBKU19BUlJBWV9FWFBSRVNTSU9OID0gMTcsXG4gICAgSlNfRlVOQ1RJT05fRVhQUkVTU0lPTiA9IDE4LFxuICAgIEpTX0NPTkRJVElPTkFMX0VYUFJFU1NJT04gPSAxOSxcbiAgICBKU19DQUNIRV9FWFBSRVNTSU9OID0gMjAsXG4gICAgSlNfQkxPQ0tfU1RBVEVNRU5UID0gMjEsXG4gICAgSlNfVEVNUExBVEVfTElURVJBTCA9IDIyLFxuICAgIEpTX0lGX1NUQVRFTUVOVCA9IDIzLFxuICAgIEpTX0FTU0lHTk1FTlRfRVhQUkVTU0lPTiA9IDI0LFxuICAgIEpTX1NFUVVFTkNFX0VYUFJFU1NJT04gPSAyNSxcbiAgICBKU19SRVRVUk5fU1RBVEVNRU5UID0gMjZcbn1cblxubmFtZXNwYWNlIEVsZW1lbnRUeXBlcyB7XG4gIGV4cG9ydCBjb25zdCBFTEVNRU5UID0gMCxcbiAgICBDT01QT05FTlQgPSAxLFxuICAgIFNMT1QgPSAyLFxuICAgIFRFTVBMQVRFID0gM1xufVxuXG5jb25zdCBCVUlMRF9JTl9ESVJFQ1RJVkVTID0gbmV3IFNldChbXG4gICdpZicsXG4gICdlbHNlJyxcbiAgJ2Vsc2UtaWYnLFxuICAnZm9yJyxcbiAgJ29uY2UnLFxuICAnbW9kZWwnLFxuICAnb24nLFxuICAnYmluZCcsXG4gICdzbG90JyxcbiAgJ3Nsb3Qtc2NvcGUnLFxuICAna2V5JyxcbiAgJ3JlZicsXG4gICd0ZXh0JyxcbiAgJ2h0bWwnLFxuICAnc2hvdycsXG4gICdwcmUnLFxuICAnY2xvYWsnLFxuICAvLyAnZWwnLFxuICAvLyAncmVmJyxcbl0pXG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudHMobm9kZTogVGVtcGxhdGVDaGlsZE5vZGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGN1cnJlbnRcbiAgICA9IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkVMRU1FTlQgJiYgbm9kZS50YWdUeXBlID09PSBFbGVtZW50VHlwZXMuQ09NUE9ORU5UXG4gICAgICA/IFtub2RlLnRhZ11cbiAgICAgIDogbm9kZS50eXBlID09PSBOb2RlVHlwZXMuRUxFTUVOVCAmJiBub2RlLnRhZ1R5cGUgPT09IEVsZW1lbnRUeXBlcy5FTEVNRU5UXG4gICAgICAgID8gW25vZGUudGFnXVxuICAgICAgICA6IFtdXG5cbiAgY29uc3QgY2hpbGRyZW5cbiAgICA9IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLklGXG4gICAgICA/IG5vZGUuYnJhbmNoZXNcbiAgICAgIDogbm9kZS50eXBlID09PSBOb2RlVHlwZXMuRUxFTUVOVFxuICAgICAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JRl9CUkFOQ0hcbiAgICAgICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuRk9SXG4gICAgICAgID8gbm9kZS5jaGlsZHJlblxuICAgICAgICA6IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLlRFWFRcbiAgICAgICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuQ09NTUVOVFxuICAgICAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5DT01QT1VORF9FWFBSRVNTSU9OXG4gICAgICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLlRFWFRfQ0FMTFxuICAgICAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JTlRFUlBPTEFUSU9OXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogZXhoYXVzdGl2ZUNoZWNrUmV0dXJuVW5kZWZpbmVkKG5vZGUpID8/IFtdXG5cbiAgcmV0dXJuIFsuLi5jdXJyZW50LCAuLi5jaGlsZHJlbi5mbGF0TWFwKGdldENvbXBvbmVudHMpXVxufVxuXG5mdW5jdGlvbiBnZXREaXJlY3RpdmVOYW1lcyhub2RlOiBUZW1wbGF0ZUNoaWxkTm9kZSk6IHN0cmluZ1tdIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkVMRU1FTlQpIHtcbiAgICBjb25zdCBkaXJlY3RpdmVzID0gbm9kZS5wcm9wcy5mbGF0TWFwKHggPT5cbiAgICAgIHgudHlwZSA9PT0gTm9kZVR5cGVzLkRJUkVDVElWRSA/IFt4Lm5hbWVdIDogW10sXG4gICAgKVxuICAgIHJldHVybiBbLi4uZGlyZWN0aXZlcywgLi4ubm9kZS5jaGlsZHJlbi5mbGF0TWFwKGdldERpcmVjdGl2ZU5hbWVzKV1cbiAgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5JRikge1xuICAgIHJldHVybiBub2RlLmJyYW5jaGVzLmZsYXRNYXAoZ2V0RGlyZWN0aXZlTmFtZXMpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuSUZfQlJBTkNIIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkZPUikge1xuICAgIHJldHVybiBub2RlLmNoaWxkcmVuLmZsYXRNYXAoZ2V0RGlyZWN0aXZlTmFtZXMpXG4gIH1cbiAgZWxzZSBpZiAoXG4gICAgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuSU5URVJQT0xBVElPTlxuICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkNPTVBPVU5EX0VYUFJFU1NJT05cbiAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5URVhUXG4gICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuQ09NTUVOVFxuICAgIHx8IG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLlRFWFRfQ0FMTFxuICApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBlbHNlIHtcbiAgICBleGhhdXN0aXZlQ2hlY2tSZXR1cm5VbmRlZmluZWQobm9kZSlcbiAgICByZXR1cm4gW11cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGcmVlVmFyaWFibGVzRm9yVGV4dChpbnB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBpbnB1dFdpdGhQcmVmaXggPSBpbnB1dC50cmltU3RhcnQoKVswXSA9PT0gJ3snID8gYCgke2lucHV0fSlgIDogaW5wdXRcbiAgcmV0dXJuIGdldEZpbGVHbG9iYWxzKHBhcnNlKGlucHV0V2l0aFByZWZpeCkpXG59XG5cbmZ1bmN0aW9uIGdldEZyZWVWYXJpYWJsZXNGb3JQcm9wc05vZGUoXG4gIG5vZGU6IEF0dHJpYnV0ZU5vZGUgfCBEaXJlY3RpdmVOb2RlLFxuKTogc3RyaW5nW10ge1xuICBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuRElSRUNUSVZFKSB7XG4gICAgY29uc3QgYXJnID0gbm9kZS5hcmcgPT09IHVuZGVmaW5lZCA/IFtdIDogZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUobm9kZS5hcmcpXG4gICAgY29uc3QgZXhwID0gbm9kZS5leHAgPT09IHVuZGVmaW5lZCA/IFtdIDogZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUobm9kZS5leHApXG4gICAgcmV0dXJuIFsuLi5hcmcsIC4uLmV4cF1cbiAgfVxuICByZXR1cm4gW11cbn1cblxuZnVuY3Rpb24gZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUoXG4gIG5vZGU6IFRlbXBsYXRlQ2hpbGROb2RlIHwgRXhwcmVzc2lvbk5vZGUsXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5TSU1QTEVfRVhQUkVTU0lPTikge1xuICAgIHJldHVybiBub2RlLmlzU3RhdGljID8gW10gOiBnZXRGcmVlVmFyaWFibGVzRm9yVGV4dChub2RlLmNvbnRlbnQpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuQ09NUE9VTkRfRVhQUkVTU0lPTikge1xuICAgIHJldHVybiBub2RlLmNoaWxkcmVuLmZsYXRNYXAoeCA9PlxuICAgICAgdHlwZW9mIHggIT09ICdvYmplY3QnID8gW10gOiBnZXRGcmVlVmFyaWFibGVzRm9yTm9kZSh4KSxcbiAgICApXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuSU5URVJQT0xBVElPTikge1xuICAgIHJldHVybiBnZXRGcmVlVmFyaWFibGVzRm9yTm9kZShub2RlLmNvbnRlbnQpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuRUxFTUVOVCkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbi5mbGF0TWFwKGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKVxuXG4gICAgY29uc3QgZGlyZWN0aXZlUHJvcHMgPSBub2RlLnByb3BzLmZsYXRNYXAoeCA9PlxuICAgICAgeC50eXBlID09PSBOb2RlVHlwZXMuRElSRUNUSVZFID8gW3hdIDogW10sXG4gICAgKVxuICAgIGNvbnN0IGF0dHJpYnV0ZVByb3BzID0gbm9kZS5wcm9wcy5mbGF0TWFwKHggPT5cbiAgICAgIHgudHlwZSA9PT0gTm9kZVR5cGVzLkFUVFJJQlVURSA/IFt4XSA6IFtdLFxuICAgIClcblxuICAgIGNvbnN0IHJlZk5vZGUgPSBhdHRyaWJ1dGVQcm9wcy5maW5kKFxuICAgICAgbm9kZSA9PiBub2RlLm5hbWUgPT09ICdyZWYnICYmIG5vZGUudmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICApXG4gICAgY29uc3QgcmVmSWRlbnRpZmllciA9IHJlZk5vZGU/LnZhbHVlPy5jb250ZW50XG5cbiAgICBjb25zdCB2U2xvdE5vZGUgPSBkaXJlY3RpdmVQcm9wcy5maW5kKG5vZGUgPT4gbm9kZS5uYW1lID09PSAnc2xvdCcpXG4gICAgY29uc3QgdlNsb3RBcmdJZGVudGlmaWVyc1xuICAgICAgPSB2U2xvdE5vZGU/LmFyZyA9PT0gdW5kZWZpbmVkID8gW10gOiBnZXRGcmVlVmFyaWFibGVzRm9yTm9kZSh2U2xvdE5vZGUuYXJnKVxuICAgIC8vIFRPRE86IFZhcmlhYmxlIHNoYWRvd2luZ1xuICAgIGNvbnN0IHZTbG90RXhwVmFyaWFibGVTaGFkb3dpbmdJZGVudGlmaWVyczogc3RyaW5nW10gPSBbXVxuXG4gICAgY29uc3QgdkZvck5vZGUgPSBkaXJlY3RpdmVQcm9wcy5maW5kKG5vZGUgPT4gbm9kZS5uYW1lID09PSAnZm9yJylcbiAgICBjb25zdCB2Rm9ySWRlbnRpZmllcnNcbiAgICAgID0gdkZvck5vZGU/LmV4cD8udHlwZSA9PT0gTm9kZVR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OXG4gICAgICAgID8gZ2V0RnJlZVZhcmlhYmxlc0ZvclRleHQoXG4gICAgICAgICAgdkZvck5vZGUuZXhwLmNvbnRlbnQucmVwbGFjZSgvXi4qXFxzKD86aW58b2YpXFxzLywgJycpLFxuICAgICAgICApXG4gICAgICAgIDogW11cbiAgICAvLyBUT0RPOiBWYXJpYWJsZSBzaGFkb3dpbmdcbiAgICBjb25zdCB2Rm9yRXhwVmFyaWFibGVTaGFkb3dpbmdJZGVudGlmaWVyczogc3RyaW5nW10gPSBbXVxuXG4gICAgY29uc3QgcHJvcHMgPSBkaXJlY3RpdmVQcm9wc1xuICAgICAgLmZpbHRlcigoeyBuYW1lIH0pID0+IG5hbWUgIT09ICdzbG90JyAmJiBuYW1lICE9PSAnZm9yJylcbiAgICAgIC5mbGF0TWFwKGdldEZyZWVWYXJpYWJsZXNGb3JQcm9wc05vZGUpXG5cbiAgICBjb25zdCBzaGFkb3dpbmdJZGVudGlmaWVycyA9IG5ldyBTZXQoW1xuICAgICAgLi4udlNsb3RFeHBWYXJpYWJsZVNoYWRvd2luZ0lkZW50aWZpZXJzLFxuICAgICAgLi4udkZvckV4cFZhcmlhYmxlU2hhZG93aW5nSWRlbnRpZmllcnMsXG4gICAgXSlcbiAgICByZXR1cm4gW1xuICAgICAgLi4udlNsb3RBcmdJZGVudGlmaWVycyxcbiAgICAgIHJlZklkZW50aWZpZXIsXG4gICAgICAuLi52Rm9ySWRlbnRpZmllcnMsXG4gICAgICAuLi5bLi4uY2hpbGRyZW4sIC4uLnByb3BzXS5maWx0ZXIoeCA9PiAhc2hhZG93aW5nSWRlbnRpZmllcnMuaGFzKHgpKSxcbiAgICBdLmZpbHRlcihub3ROdWxsaXNoKVxuICB9XG4gIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLkZPUikge1xuICAgIC8vIElmIHdlIHVzZSBgYmFzZUNvbXBpbGVyYCwgd2UgbmVlZCBhZGQgdmFyaWFibGUgc2hhZG93aW5nIGhlcmVcbiAgICAvLyBCdXQgd2UgdXNlIGBiYXNlUGFyc2VgIG5vdy4gU28gdGhpcyBicmFuY2ggd2lsbCBuZXZlciBiZSByZWFjaGVkLlxuICAgIC8vIGBOb2RlVHlwZXMuSUZgIGFuZCBgTm9kZVR5cGVzLklGX0JSQU5DSGAgd2lsbCBuZXZlciBiZSByZWFjaGVkLCBhbHNvLlxuXG4gICAgLy8gY29uc3QgeyBrZXlBbGlhcywgdmFsdWVBbGlhcyB9ID0gbm9kZVxuICAgIHJldHVybiBbbm9kZS5zb3VyY2UsIC4uLm5vZGUuY2hpbGRyZW5dLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuSUYpIHtcbiAgICByZXR1cm4gKG5vZGUuYnJhbmNoZXMgPz8gW10pLmZsYXRNYXAoZ2V0RnJlZVZhcmlhYmxlc0Zvck5vZGUpXG4gIH1cbiAgZWxzZSBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZXMuSUZfQlJBTkNIKSB7XG4gICAgcmV0dXJuIFtub2RlLmNvbmRpdGlvbiwgLi4ubm9kZS5jaGlsZHJlbl1cbiAgICAgIC5maWx0ZXIobm90TnVsbGlzaClcbiAgICAgIC5mbGF0TWFwKGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKVxuICB9XG4gIGVsc2UgaWYgKFxuICAgIG5vZGUudHlwZSA9PT0gTm9kZVR5cGVzLlRFWFRcbiAgICB8fCBub2RlLnR5cGUgPT09IE5vZGVUeXBlcy5DT01NRU5UXG4gICAgfHwgbm9kZS50eXBlID09PSBOb2RlVHlwZXMuVEVYVF9DQUxMXG4gICkge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGVsc2Uge1xuICAgIGV4aGF1c3RpdmVDaGVja1JldHVyblVuZGVmaW5lZChub2RlKVxuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUmVmZXJlbmNlc0ZvclNGQyhcbiAgdGVtcGxhdGVOb2RlOiBSb290Tm9kZSB8IFBsYWluRWxlbWVudE5vZGUgfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgY29tcG9uZW50cyA9IHRlbXBsYXRlTm9kZT8uY2hpbGRyZW4uZmxhdE1hcChnZXRDb21wb25lbnRzKSA/PyBbXVxuICBjb25zdCBkaXJlY3RpdmVzID0gdGVtcGxhdGVOb2RlPy5jaGlsZHJlbi5mbGF0TWFwKGdldERpcmVjdGl2ZU5hbWVzKSA/PyBbXVxuICBjb25zdCBpZGVudGlmaWVyc1xuICAgID0gdGVtcGxhdGVOb2RlPy5jaGlsZHJlbi5mbGF0TWFwKGdldEZyZWVWYXJpYWJsZXNGb3JOb2RlKSA/PyBbXVxuXG4gIHJldHVybiB7XG4gICAgY29tcG9uZW50cyxcbiAgICBkaXJlY3RpdmVzLFxuICAgIGlkZW50aWZpZXJzLFxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJhYmVsUGFyc2VyT3B0aW9ucyhsYW5nOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gIGxhbmcgPSBsYW5nIHx8ICdqcydcbiAgY29uc3QgcGx1Z2luc0RpY3Q6IFJlY29yZDxzdHJpbmcsIEFycmF5PFBhcnNlclBsdWdpbj4+ID0ge1xuICAgIGpzOiBbXSxcbiAgICB0czogWyd0eXBlc2NyaXB0J10sXG4gICAganN4OiBbJ2pzeCddLFxuICAgIHRzeDogWydqc3gnLCAndHlwZXNjcmlwdCddLFxuICB9XG4gIGNvbnN0IHBsdWdpbnMgPSBwbHVnaW5zRGljdFtsYW5nXVxuICBpZiAocGx1Z2lucyA9PT0gdW5kZWZpbmVkKVxuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5zdXBwb3J0ZWQgc2NyaXB0IGxhbmd1YWdlOiAke2xhbmd9YClcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2VUeXBlOiAnbW9kdWxlJyBhcyBjb25zdCxcbiAgICBwbHVnaW5zLFxuICB9XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VTRkMoXG4gIGNvZGU6IHN0cmluZyxcbiAgaWQ/OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMsXG4pOiBQcm9taXNlPFBhcnNlZFNGQz4ge1xuICBjb25zdCBlbGVtZW50Q2hpbGRyZW4gPSBiYXNlUGFyc2UoY29kZSwgcGFyc2VyT3B0aW9ucykuY2hpbGRyZW4uZmxhdE1hcCh4ID0+XG4gICAgeC50eXBlID09PSBOb2RlVHlwZXMuRUxFTUVOVCAmJiB4LnRhZ1R5cGUgPT09IEVsZW1lbnRUeXBlcy5FTEVNRU5UXG4gICAgICA/IFt4XVxuICAgICAgOiBbXSxcbiAgKVxuICBjb25zdCB0ZW1wbGF0ZU5vZGUgPSBlbGVtZW50Q2hpbGRyZW4uZmluZCh4ID0+IHgudGFnID09PSAndGVtcGxhdGUnKVxuXG4gIGNvbnN0IFtzY3JpcHRTZXR1cENoaWxkTm9kZXMsIHNjcmlwdENoaWxkTm9kZXNdID0gcGFydGl0aW9uKFxuICAgIGVsZW1lbnRDaGlsZHJlbi5maWx0ZXIoeCA9PiB4LnRhZyA9PT0gJ3NjcmlwdCcpLFxuICAgIHggPT4geC5wcm9wcy5zb21lKHAgPT4gcC50eXBlID09PSBOb2RlVHlwZXMuQVRUUklCVVRFICYmIHAubmFtZSA9PT0gJ3NldHVwJyksXG4gIClcblxuICBjb25zdCBnZXRTY3JpcHRUYWdNZXRhID0gKFxuICAgIG46IFBsYWluRWxlbWVudE5vZGUgfCB1bmRlZmluZWQsXG4gICAgYXN0VHJhbnNmb3JtczogKGFzdDogUHJvZ3JhbSkgPT4gUHJvZ3JhbSA9IHggPT4geCxcbiAgKTogU2NyaXB0VGFnTWV0YSA9PiB7XG4gICAgaWYgKG4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY29udGVudCA9ICcnXG4gICAgICBjb25zdCBhc3QgPSBwYXJzZShjb250ZW50LCB7XG4gICAgICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnLFxuICAgICAgICBwbHVnaW5zOiBbXSxcbiAgICAgIH0pLnByb2dyYW1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICBlbmQ6IDAsXG4gICAgICAgIGNvbnRlbnRTdGFydDogMCxcbiAgICAgICAgY29udGVudEVuZDogMCxcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgYXR0cnM6IHt9LFxuICAgICAgICBmb3VuZDogZmFsc2UsXG4gICAgICAgIGFzdCxcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXR0cnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBuLnByb3BzLmZsYXRNYXAoeCA9PlxuICAgICAgICAhKFxuICAgICAgICAgIHgudHlwZSA9PT0gTm9kZVR5cGVzLkFUVFJJQlVURSAmJiB0eXBlb2YgeC52YWx1ZT8uY29udGVudCA9PT0gJ3N0cmluZydcbiAgICAgICAgKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IFtbeC5uYW1lLCB4LnZhbHVlLmNvbnRlbnRdXSxcbiAgICAgICksXG4gICAgKVxuICAgIGNvbnN0IGNvbnRlbnQgPSBuLmNoaWxkcmVuWzBdPy5sb2Muc291cmNlID8/ICcnXG4gICAgY29uc3QgY29udGVudFN0YXJ0ID0gbi5jaGlsZHJlblswXT8ubG9jLnN0YXJ0Lm9mZnNldCA/PyAwXG4gICAgY29uc3QgY29udGVudEVuZCA9IG4uY2hpbGRyZW5bMF0/LmxvYy5lbmQub2Zmc2V0ID8/IDBcbiAgICBjb25zdCBhc3QgPSBhc3RUcmFuc2Zvcm1zKFxuICAgICAgcGFyc2UoY29udGVudCwgZ2V0QmFiZWxQYXJzZXJPcHRpb25zKGF0dHJzLmxhbmcpKS5wcm9ncmFtLFxuICAgIClcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG4ubG9jLnN0YXJ0Lm9mZnNldCxcbiAgICAgIGVuZDogbi5sb2MuZW5kLm9mZnNldCxcbiAgICAgIGNvbnRlbnRTdGFydCxcbiAgICAgIGNvbnRlbnRFbmQsXG4gICAgICBjb250ZW50LFxuICAgICAgYXR0cnMsXG4gICAgICBmb3VuZDogdHJ1ZSxcbiAgICAgIGFzdCxcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2NyaXB0U2V0dXAgPSBnZXRTY3JpcHRUYWdNZXRhKFxuICAgIHNjcmlwdFNldHVwQ2hpbGROb2Rlc1swXSxcbiAgICBvcHRpb25zPy5hc3RUcmFuc2Zvcm1zPy5zY3JpcHRTZXR1cCxcbiAgKVxuICBjb25zdCBzY3JpcHQgPSBnZXRTY3JpcHRUYWdNZXRhKFxuICAgIHNjcmlwdENoaWxkTm9kZXNbMF0sXG4gICAgb3B0aW9ucz8uYXN0VHJhbnNmb3Jtcz8uc2NyaXB0LFxuICApXG5cbiAgaWYgKFxuICAgIHNjcmlwdC5mb3VuZFxuICAgICYmIHNjcmlwdFNldHVwLmZvdW5kXG4gICAgJiYgc2NyaXB0U2V0dXAuYXR0cnMubGFuZyAhPT0gc2NyaXB0LmF0dHJzLmxhbmdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFxuICAgICAgJzxzY3JpcHQgc2V0dXA+IGxhbmd1YWdlIG11c3QgYmUgdGhlIHNhbWUgYXMgPHNjcmlwdD4nLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGNvZGVPZlRlbXBsYXRlXG4gICAgPSB0ZW1wbGF0ZU5vZGUgPT0gbnVsbFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdGVtcGxhdGVOb2RlLnByb3BzLnNvbWUoXG4gICAgICAgIHAgPT5cbiAgICAgICAgICBwLnR5cGUgPT09IE5vZGVUeXBlcy5BVFRSSUJVVEVcbiAgICAgICAgICAgICYmIHAubmFtZSA9PT0gJ2xhbmcnXG4gICAgICAgICAgICAmJiBwLnZhbHVlPy50eXBlID09PSBOb2RlVHlwZXMuVEVYVFxuICAgICAgICAgICAgJiYgcC52YWx1ZS5jb250ZW50ID09PSAncHVnJyxcbiAgICAgIClcbiAgICAgICAgPyBiYXNlUGFyc2UoXG4gICAgICAgICAgKGF3YWl0IGltcG9ydCgncHVnJykpLmNvbXBpbGUoXG4gICAgICAgICAgICB0ZW1wbGF0ZU5vZGUuY2hpbGRyZW4ubWFwKHggPT4geC5sb2Muc291cmNlKS5qb2luKCcnKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmlsZW5hbWU6IGlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApKCksXG4gICAgICAgICAgcGFyc2VyT3B0aW9ucyxcbiAgICAgICAgKVxuICAgICAgICA6IHRlbXBsYXRlTm9kZVxuXG4gIGNvbnN0IHJlc3VsdCA9IGNvZGVPZlRlbXBsYXRlXG4gICAgPyBmaW5kUmVmZXJlbmNlc0ZvclNGQyhjb2RlT2ZUZW1wbGF0ZSlcbiAgICA6IHVuZGVmaW5lZFxuXG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgIGNvbXBvbmVudHM6IG5ldyBTZXQocmVzdWx0Py5jb21wb25lbnRzLm1hcChwYXNjYWxpemUpKSxcbiAgICAgIGRpcmVjdGl2ZXM6IG5ldyBTZXQoXG4gICAgICAgIHJlc3VsdD8uZGlyZWN0aXZlc1xuICAgICAgICAgIC5maWx0ZXIoeCA9PiAhQlVJTERfSU5fRElSRUNUSVZFUy5oYXMoeCkpXG4gICAgICAgICAgLm1hcChjYW1lbGl6ZSksXG4gICAgICApLFxuICAgICAgaWRlbnRpZmllcnM6IG5ldyBTZXQocmVzdWx0Py5pZGVudGlmaWVycyksXG4gICAgfSxcbiAgICBzY3JpcHRTZXR1cCxcbiAgICBzY3JpcHQsXG4gICAgcGFyc2VyT3B0aW9uczogZ2V0QmFiZWxQYXJzZXJPcHRpb25zKFxuICAgICAgc2NyaXB0LmF0dHJzLmxhbmcgPz8gc2NyaXB0U2V0dXAuYXR0cnMubGFuZyxcbiAgICApLFxuICAgIGV4dHJhRGVjbGFyYXRpb25zOiBbXSxcbiAgfVxufVxuIiwiLy8gbW9kaWZpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLW5leHQvYmxvYi9tYWluL3BhY2thZ2VzL2NvbXBpbGVyLXNmYy9zcmMvY29tcGlsZVNjcmlwdC50c1xuXG5pbXBvcnQgdHlwZSB7XG4gIENhbGxFeHByZXNzaW9uLFxuICBOb2RlLFxuICBPYmplY3RFeHByZXNzaW9uLFxuICBPYmplY3RQcm9wZXJ0eSxcbiAgU3RhdGVtZW50LFxuICBUU0Z1bmN0aW9uVHlwZSxcbiAgVFNJbnRlcmZhY2VCb2R5LFxuICBUU1R5cGUsXG4gIFRTVHlwZUxpdGVyYWwsXG59IGZyb20gJ0BiYWJlbC90eXBlcydcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiwgdCB9IGZyb20gJy4vYmFiZWwnXG5cbi8vIFNwZWNpYWwgY29tcGlsZXIgbWFjcm9zXG5jb25zdCBERUZJTkVfUFJPUFMgPSAnZGVmaW5lUHJvcHMnXG5jb25zdCBERUZJTkVfRU1JVFMgPSAnZGVmaW5lRW1pdHMnXG5jb25zdCBERUZJTkVfRVhQT1NFID0gJ2RlZmluZUV4cG9zZSdcbmNvbnN0IFdJVEhfREVGQVVMVFMgPSAnd2l0aERlZmF1bHRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BUeXBlRGF0YSB7XG4gIGtleTogc3RyaW5nXG4gIHR5cGU6IHN0cmluZ1tdIHwgc3RyaW5nXG4gIHJlcXVpcmVkOiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1hY3Jvcyhub2RlczogU3RhdGVtZW50W10pIHtcbiAgbGV0IGhhc0RlZmluZVByb3BzQ2FsbCA9IGZhbHNlXG4gIGxldCBoYXNEZWZpbmVFbWl0Q2FsbCA9IGZhbHNlXG4gIGxldCBwcm9wc1J1bnRpbWVEZWNsOiBOb2RlIHwgdW5kZWZpbmVkXG4gIGxldCBwcm9wc1J1bnRpbWVEZWZhdWx0czogTm9kZSB8IHVuZGVmaW5lZFxuICBsZXQgcHJvcHNUeXBlRGVjbDogVFNUeXBlTGl0ZXJhbCB8IFRTSW50ZXJmYWNlQm9keSB8IHVuZGVmaW5lZFxuICBsZXQgcHJvcHNUeXBlRGVjbFJhdzogTm9kZSB8IHVuZGVmaW5lZFxuICBsZXQgZW1pdHNSdW50aW1lRGVjbDogTm9kZSB8IHVuZGVmaW5lZFxuICBsZXQgZW1pdHNUeXBlRGVjbDpcbiAgfCBUU0Z1bmN0aW9uVHlwZVxuICB8IFRTVHlwZUxpdGVyYWxcbiAgfCBUU0ludGVyZmFjZUJvZHlcbiAgfCB1bmRlZmluZWRcbiAgbGV0IGVtaXRzVHlwZURlY2xSYXc6IE5vZGUgfCB1bmRlZmluZWRcbiAgbGV0IGV4cG9zZURlY2w6IENhbGxFeHByZXNzaW9uWydhcmd1bWVudHMnXVtudW1iZXJdIHwgdW5kZWZpbmVkXG5cbiAgLy8gcHJvcHMvZW1pdHMgZGVjbGFyZWQgdmlhIHR5cGVzXG4gIGNvbnN0IHR5cGVEZWNsYXJlZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wVHlwZURhdGE+ID0ge31cbiAgLy8gcmVjb3JkIGRlY2xhcmVkIHR5cGVzIGZvciBydW50aW1lIHByb3BzIHR5cGUgZ2VuZXJhdGlvblxuICBjb25zdCBkZWNsYXJlZFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fVxuXG4gIGZ1bmN0aW9uIGVycm9yKFxuICAgIG1zZzogc3RyaW5nLFxuXG4gICAgX25vZGU6IE5vZGUsXG4gICk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKVxuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0RlZmluZVByb3BzKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzQ2FsbE9mKG5vZGUsIERFRklORV9QUk9QUykpXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAgIGlmIChoYXNEZWZpbmVQcm9wc0NhbGwpXG4gICAgICBlcnJvcihgZHVwbGljYXRlICR7REVGSU5FX1BST1BTfSgpIGNhbGxgLCBub2RlKVxuXG4gICAgaGFzRGVmaW5lUHJvcHNDYWxsID0gdHJ1ZVxuXG4gICAgcHJvcHNSdW50aW1lRGVjbCA9IG5vZGUuYXJndW1lbnRzWzBdXG5cbiAgICAvLyBjYWxsIGhhcyB0eXBlIHBhcmFtZXRlcnMgLSBpbmZlciBydW50aW1lIHR5cGVzIGZyb20gaXRcbiAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycykge1xuICAgICAgaWYgKHByb3BzUnVudGltZURlY2wpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgYCR7REVGSU5FX1BST1BTfSgpIGNhbm5vdCBhY2NlcHQgYm90aCB0eXBlIGFuZCBub24tdHlwZSBhcmd1bWVudHMgYFxuICAgICAgICAgICAgKyAnYXQgdGhlIHNhbWUgdGltZS4gVXNlIG9uZSBvciB0aGUgb3RoZXIuJyxcbiAgICAgICAgICBub2RlLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHByb3BzVHlwZURlY2xSYXcgPSBub2RlLnR5cGVQYXJhbWV0ZXJzLnBhcmFtc1swXVxuICAgICAgcHJvcHNUeXBlRGVjbCA9IHJlc29sdmVRdWFsaWZpZWRUeXBlKFxuICAgICAgICBwcm9wc1R5cGVEZWNsUmF3LFxuICAgICAgICBub2RlID0+IG5vZGUudHlwZSA9PT0gJ1RTVHlwZUxpdGVyYWwnLFxuICAgICAgKSBhcyBUU1R5cGVMaXRlcmFsIHwgVFNJbnRlcmZhY2VCb2R5IHwgdW5kZWZpbmVkXG5cbiAgICAgIGlmICghcHJvcHNUeXBlRGVjbCkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgdHlwZSBhcmd1bWVudCBwYXNzZWQgdG8gJHtERUZJTkVfUFJPUFN9KCkgbXVzdCBiZSBhIGxpdGVyYWwgdHlwZSwgYFxuICAgICAgICAgICAgKyAnb3IgYSByZWZlcmVuY2UgdG8gYW4gaW50ZXJmYWNlIG9yIGxpdGVyYWwgdHlwZS4nLFxuICAgICAgICAgIHByb3BzVHlwZURlY2xSYXcsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc1dpdGhEZWZhdWx0cyhub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpc0NhbGxPZihub2RlLCBXSVRIX0RFRkFVTFRTKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHByb2Nlc3NEZWZpbmVQcm9wcyhub2RlLmFyZ3VtZW50c1swXSkpIHtcbiAgICAgIGlmIChwcm9wc1J1bnRpbWVEZWNsKSB7XG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIGAke1dJVEhfREVGQVVMVFN9IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0eXBlLWJhc2VkIGBcbiAgICAgICAgICAgICsgYCR7REVGSU5FX1BST1BTfSBkZWNsYXJhdGlvbi5gLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHByb3BzUnVudGltZURlZmF1bHRzID0gbm9kZS5hcmd1bWVudHNbMV1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBlcnJvcihcbiAgICAgICAgYCR7V0lUSF9ERUZBVUxUU30nIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSAke0RFRklORV9QUk9QU30gY2FsbC5gLFxuICAgICAgICBub2RlLmFyZ3VtZW50c1swXSB8fCBub2RlLFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0RlZmluZUVtaXRzKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzQ2FsbE9mKG5vZGUsIERFRklORV9FTUlUUykpXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAgIGlmIChoYXNEZWZpbmVFbWl0Q2FsbClcbiAgICAgIGVycm9yKGBkdXBsaWNhdGUgJHtERUZJTkVfRU1JVFN9KCkgY2FsbGAsIG5vZGUpXG5cbiAgICBoYXNEZWZpbmVFbWl0Q2FsbCA9IHRydWVcbiAgICBlbWl0c1J1bnRpbWVEZWNsID0gbm9kZS5hcmd1bWVudHNbMF1cbiAgICBpZiAobm9kZS50eXBlUGFyYW1ldGVycykge1xuICAgICAgaWYgKGVtaXRzUnVudGltZURlY2wpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgYCR7REVGSU5FX0VNSVRTfSgpIGNhbm5vdCBhY2NlcHQgYm90aCB0eXBlIGFuZCBub24tdHlwZSBhcmd1bWVudHMgYFxuICAgICAgICAgICAgKyAnYXQgdGhlIHNhbWUgdGltZS4gVXNlIG9uZSBvciB0aGUgb3RoZXIuJyxcbiAgICAgICAgICBub2RlLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGVtaXRzVHlwZURlY2xSYXcgPSBub2RlLnR5cGVQYXJhbWV0ZXJzLnBhcmFtc1swXVxuICAgICAgZW1pdHNUeXBlRGVjbCA9IHJlc29sdmVRdWFsaWZpZWRUeXBlKFxuICAgICAgICBlbWl0c1R5cGVEZWNsUmF3LFxuICAgICAgICBub2RlID0+IG5vZGUudHlwZSA9PT0gJ1RTRnVuY3Rpb25UeXBlJyB8fCBub2RlLnR5cGUgPT09ICdUU1R5cGVMaXRlcmFsJyxcbiAgICAgICkgYXMgVFNGdW5jdGlvblR5cGUgfCBUU1R5cGVMaXRlcmFsIHwgVFNJbnRlcmZhY2VCb2R5IHwgdW5kZWZpbmVkXG5cbiAgICAgIGlmICghZW1pdHNUeXBlRGVjbCkge1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBgdHlwZSBhcmd1bWVudCBwYXNzZWQgdG8gJHtERUZJTkVfRU1JVFN9KCkgbXVzdCBiZSBhIGZ1bmN0aW9uIHR5cGUsIGBcbiAgICAgICAgICAgICsgJ2EgbGl0ZXJhbCB0eXBlIHdpdGggY2FsbCBzaWduYXR1cmVzLCBvciBhIHJlZmVyZW5jZSB0byB0aGUgYWJvdmUgdHlwZXMuJyxcbiAgICAgICAgICBlbWl0c1R5cGVEZWNsUmF3LFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlUXVhbGlmaWVkVHlwZShcbiAgICBub2RlOiBOb2RlLFxuICAgIHF1YWxpZmllcjogKG5vZGU6IE5vZGUpID0+IGJvb2xlYW4sXG4gICkge1xuICAgIGlmIChxdWFsaWZpZXIobm9kZSkpXG4gICAgICByZXR1cm4gbm9kZVxuXG4gICAgaWYgKFxuICAgICAgbm9kZS50eXBlID09PSAnVFNUeXBlUmVmZXJlbmNlJ1xuICAgICAgJiYgbm9kZS50eXBlTmFtZS50eXBlID09PSAnSWRlbnRpZmllcidcbiAgICApIHtcbiAgICAgIGNvbnN0IHJlZk5hbWUgPSBub2RlLnR5cGVOYW1lLm5hbWVcbiAgICAgIGNvbnN0IGlzUXVhbGlmaWVkVHlwZSA9IChub2RlOiBOb2RlKTogTm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBub2RlLnR5cGUgPT09ICdUU0ludGVyZmFjZURlY2xhcmF0aW9uJ1xuICAgICAgICAgICYmIG5vZGUuaWQubmFtZSA9PT0gcmVmTmFtZVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIG5vZGUuYm9keVxuXG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgIG5vZGUudHlwZSA9PT0gJ1RTVHlwZUFsaWFzRGVjbGFyYXRpb24nXG4gICAgICAgICAgJiYgbm9kZS5pZC5uYW1lID09PSByZWZOYW1lXG4gICAgICAgICAgJiYgcXVhbGlmaWVyKG5vZGUudHlwZUFubm90YXRpb24pXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gbm9kZS50eXBlQW5ub3RhdGlvblxuXG4gICAgICAgIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nICYmIG5vZGUuZGVjbGFyYXRpb24pXG4gICAgICAgICAgcmV0dXJuIGlzUXVhbGlmaWVkVHlwZShub2RlLmRlY2xhcmF0aW9uKVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgY29uc3QgcXVhbGlmaWVkID0gaXNRdWFsaWZpZWRUeXBlKG5vZGUpXG4gICAgICAgIGlmIChxdWFsaWZpZWQpXG4gICAgICAgICAgcmV0dXJuIHF1YWxpZmllZFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NEZWZpbmVFeHBvc2Uobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNDYWxsT2Yobm9kZSwgREVGSU5FX0VYUE9TRSkpXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAgIGlmIChleHBvc2VEZWNsKVxuICAgICAgZXJyb3IoYGR1cGxpY2F0ZSAke0RFRklORV9FWFBPU0V9KCkgY2FsbGAsIG5vZGUpXG5cbiAgICBpZiAobm9kZS5hcmd1bWVudHMubGVuZ3RoICE9PSAxKVxuICAgICAgZXJyb3IoYCR7REVGSU5FX0VYUE9TRX0oKSByZXF1aXJlcyBvbmUgYXJndW1lbnRgLCBub2RlKVxuXG4gICAgZXhwb3NlRGVjbCA9IG5vZGUuYXJndW1lbnRzWzBdXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gZ2VuUnVudGltZVByb3BzKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wVHlwZURhdGE+KSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKVxuICAgIGlmICgha2V5cy5sZW5ndGgpXG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAvLyBjaGVjayBkZWZhdWx0cy4gSWYgdGhlIGRlZmF1bHQgb2JqZWN0IGlzIGFuIG9iamVjdCBsaXRlcmFsIHdpdGggb25seVxuICAgIC8vIHN0YXRpYyBwcm9wZXJ0aWVzLCB3ZSBjYW4gZGlyZWN0bHkgZ2VuZXJhdGUgbW9yZSBvcHRpbXppZWQgZGVmYXVsdFxuICAgIC8vIGRlY2FscmF0aW9ucy4gT3RoZXJ3aXNlIHdlIHdpbGwgaGF2ZSB0byBmYWxsYmFjayB0byBydW50aW1lIG1lcmdpbmcuXG4gICAgY29uc3QgaGFzU3RhdGljRGVmYXVsdHMgPSBwcm9wc1J1bnRpbWVEZWZhdWx0c1xuICAgICAgJiYgcHJvcHNSdW50aW1lRGVmYXVsdHMudHlwZSA9PT0gJ09iamVjdEV4cHJlc3Npb24nXG4gICAgICAmJiBwcm9wc1J1bnRpbWVEZWZhdWx0cy5wcm9wZXJ0aWVzLmV2ZXJ5KFxuICAgICAgICBub2RlID0+IG5vZGUudHlwZSA9PT0gJ09iamVjdFByb3BlcnR5JyAmJiAhbm9kZS5jb21wdXRlZCxcbiAgICAgIClcblxuICAgIHJldHVybiB0Lm9iamVjdEV4cHJlc3Npb24oXG4gICAgICBPYmplY3QuZW50cmllcyhwcm9wcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgcHJvcCA9IGhhc1N0YXRpY0RlZmF1bHRzXG4gICAgICAgICAgPyAocHJvcHNSdW50aW1lRGVmYXVsdHMgYXMgT2JqZWN0RXhwcmVzc2lvbikucHJvcGVydGllcy5maW5kKChub2RlOiBhbnkpID0+IG5vZGUua2V5Lm5hbWUgPT09IGtleSkgYXMgT2JqZWN0UHJvcGVydHlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAgIGlmIChwcm9wKVxuICAgICAgICAgIHZhbHVlLnJlcXVpcmVkID0gZmFsc2VcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBrZXkgPT09ICd0eXBlJ1xuICAgICAgICAgID8gdC5vYmplY3RQcm9wZXJ0eSh0LmlkZW50aWZpZXIoa2V5KSwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHQuaWRlbnRpZmllcih2YWx1ZSkgOiB0LmFycmF5RXhwcmVzc2lvbih2YWx1ZS5tYXAoKGk6IGFueSkgPT4gdC5pZGVudGlmaWVyKGkpKSkgYXMgYW55KVxuICAgICAgICAgIDogdC5vYmplY3RQcm9wZXJ0eSh0LmlkZW50aWZpZXIoa2V5KSwgcGFyc2VFeHByZXNzaW9uKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgYXMgYW55KSxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChwcm9wKVxuICAgICAgICAgIGVudHJpZXMucHVzaCh0Lm9iamVjdFByb3BlcnR5KHQuaWRlbnRpZmllcignZGVmYXVsdCcpLCBwcm9wLnZhbHVlIGFzIGFueSkpXG5cbiAgICAgICAgcmV0dXJuIHQub2JqZWN0UHJvcGVydHkoXG4gICAgICAgICAgdC5pZGVudGlmaWVyKGtleSksXG4gICAgICAgICAgdC5vYmplY3RFeHByZXNzaW9uKGVudHJpZXMpLFxuICAgICAgICApXG4gICAgICB9KSxcbiAgICApXG4gIH1cblxuICBmdW5jdGlvbiBnZXRQcm9wcygpIHtcbiAgICBpZiAocHJvcHNSdW50aW1lRGVjbClcbiAgICAgIHJldHVybiBwcm9wc1J1bnRpbWVEZWNsXG5cbiAgICBpZiAocHJvcHNUeXBlRGVjbCkge1xuICAgICAgZXh0cmFjdFJ1bnRpbWVQcm9wcyhwcm9wc1R5cGVEZWNsLCB0eXBlRGVjbGFyZWRQcm9wcywgZGVjbGFyZWRUeXBlcylcbiAgICAgIHJldHVybiBnZW5SdW50aW1lUHJvcHModHlwZURlY2xhcmVkUHJvcHMpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGhyb3dJZkF3YWl0KG5vZGU6IE5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAnQXdhaXRFeHByZXNzaW9uJylcbiAgICAgIGVycm9yKCd0b3AtbGV2ZWwgYXdhaXQgaXMgbm90IHN1cHBvcnRlZCBpbiBWdWUgMicsIG5vZGUpXG4gIH1cblxuICBub2RlcyA9IG5vZGVzXG4gICAgLm1hcCgocmF3OiBOb2RlKSA9PiB7XG4gICAgICBsZXQgbm9kZSA9IHJhd1xuICAgICAgaWYgKHJhdy50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCcpXG4gICAgICAgIG5vZGUgPSByYXcuZXhwcmVzc2lvblxuXG4gICAgICBpZiAobm9kZS50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbicgJiYgIW5vZGUuZGVjbGFyZSkge1xuICAgICAgICBjb25zdCB0b3RhbCA9IG5vZGUuZGVjbGFyYXRpb25zLmxlbmd0aFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkZWNsID0gbm9kZS5kZWNsYXJhdGlvbnNbaV1cbiAgICAgICAgICBpZiAoZGVjbC5pbml0KSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzc0RlZmluZUVtaXRzKGRlY2wuaW5pdCkpXG4gICAgICAgICAgICAgIGRlY2wuaW5pdCA9IHQubWVtYmVyRXhwcmVzc2lvbih0LmlkZW50aWZpZXIoJ19fY3R4JyksIHQuaWRlbnRpZmllcignZW1pdCcpKSBhcyBhbnlcbiAgICAgICAgICAgIGVsc2UgaWYgKHByb2Nlc3NEZWZpbmVQcm9wcyhkZWNsLmluaXQpIHx8IHByb2Nlc3NXaXRoRGVmYXVsdHMoZGVjbC5pbml0KSlcbiAgICAgICAgICAgICAgZGVjbC5pbml0ID0gdC5pZGVudGlmaWVyKCdfX3Byb3BzJykgYXMgYW55XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIHRocm93SWZBd2FpdChkZWNsLmluaXQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzV2l0aERlZmF1bHRzKG5vZGUpIHx8IHByb2Nlc3NEZWZpbmVFbWl0cyhub2RlKSB8fCBwcm9jZXNzRGVmaW5lUHJvcHMobm9kZSkgfHwgcHJvY2Vzc0RlZmluZUV4cG9zZShub2RlKSlcbiAgICAgICAgcmV0dXJuIG51bGxcblxuICAgICAgdGhyb3dJZkF3YWl0KG5vZGUpXG5cbiAgICAgIHJldHVybiByYXdcbiAgICB9KVxuICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgU3RhdGVtZW50W11cblxuICByZXR1cm4ge1xuICAgIG5vZGVzLFxuICAgIHByb3BzOiBnZXRQcm9wcygpLFxuICAgIGV4cG9zZTogZXhwb3NlRGVjbCxcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NhbGxPZihcbiAgbm9kZTogTm9kZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHRlc3Q6IHN0cmluZyB8ICgoaWQ6IHN0cmluZykgPT4gYm9vbGVhbiksXG4pOiBub2RlIGlzIENhbGxFeHByZXNzaW9uIHtcbiAgcmV0dXJuICEhKFxuICAgIG5vZGVcbiAgICAmJiBub2RlLnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbidcbiAgICAmJiBub2RlLmNhbGxlZS50eXBlID09PSAnSWRlbnRpZmllcidcbiAgICAmJiAodHlwZW9mIHRlc3QgPT09ICdzdHJpbmcnXG4gICAgICA/IG5vZGUuY2FsbGVlLm5hbWUgPT09IHRlc3RcbiAgICAgIDogdGVzdChub2RlLmNhbGxlZS5uYW1lKSlcbiAgKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0UnVudGltZVByb3BzKFxuICBub2RlOiBUU1R5cGVMaXRlcmFsIHwgVFNJbnRlcmZhY2VCb2R5LFxuICBwcm9wczogUmVjb3JkPHN0cmluZywgUHJvcFR5cGVEYXRhPixcbiAgZGVjbGFyZWRUeXBlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxuKSB7XG4gIGNvbnN0IG1lbWJlcnMgPSBub2RlLnR5cGUgPT09ICdUU1R5cGVMaXRlcmFsJyA/IG5vZGUubWVtYmVycyA6IG5vZGUuYm9keVxuICBmb3IgKGNvbnN0IG0gb2YgbWVtYmVycykge1xuICAgIGlmIChcbiAgICAgIChtLnR5cGUgPT09ICdUU1Byb3BlcnR5U2lnbmF0dXJlJyB8fCBtLnR5cGUgPT09ICdUU01ldGhvZFNpZ25hdHVyZScpXG4gICAgICAmJiBtLmtleS50eXBlID09PSAnSWRlbnRpZmllcidcbiAgICApIHtcbiAgICAgIGxldCB0eXBlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZFxuICAgICAgaWYgKG0udHlwZSA9PT0gJ1RTTWV0aG9kU2lnbmF0dXJlJykge1xuICAgICAgICB0eXBlID0gWydGdW5jdGlvbiddXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChtLnR5cGVBbm5vdGF0aW9uKSB7XG4gICAgICAgIHR5cGUgPSBpbmZlclJ1bnRpbWVUeXBlKFxuICAgICAgICAgIG0udHlwZUFubm90YXRpb24udHlwZUFubm90YXRpb24sXG4gICAgICAgICAgZGVjbGFyZWRUeXBlcyxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcHJvcHNbbS5rZXkubmFtZV0gPSB7XG4gICAgICAgIGtleTogbS5rZXkubmFtZSxcbiAgICAgICAgcmVxdWlyZWQ6ICFtLm9wdGlvbmFsLFxuICAgICAgICB0eXBlOiB0eXBlPy5sZW5ndGggPT09IDEgPyB0eXBlWzBdIDogdHlwZSB8fCAnbnVsbCcsXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluZmVyUnVudGltZVR5cGUoXG4gIG5vZGU6IFRTVHlwZSxcbiAgZGVjbGFyZWRUeXBlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+LFxuKTogc3RyaW5nW10ge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgJ1RTU3RyaW5nS2V5d29yZCc6XG4gICAgICByZXR1cm4gWydTdHJpbmcnXVxuICAgIGNhc2UgJ1RTTnVtYmVyS2V5d29yZCc6XG4gICAgICByZXR1cm4gWydOdW1iZXInXVxuICAgIGNhc2UgJ1RTQm9vbGVhbktleXdvcmQnOlxuICAgICAgcmV0dXJuIFsnQm9vbGVhbiddXG4gICAgY2FzZSAnVFNPYmplY3RLZXl3b3JkJzpcbiAgICAgIHJldHVybiBbJ09iamVjdCddXG4gICAgY2FzZSAnVFNUeXBlTGl0ZXJhbCc6XG4gICAgICAvLyBUT0RPIChuaWNlIHRvIGhhdmUpIGdlbmVyYXRlIHJ1bnRpbWUgcHJvcGVydHkgdmFsaWRhdGlvblxuICAgICAgcmV0dXJuIFsnT2JqZWN0J11cbiAgICBjYXNlICdUU0Z1bmN0aW9uVHlwZSc6XG4gICAgICByZXR1cm4gWydGdW5jdGlvbiddXG4gICAgY2FzZSAnVFNBcnJheVR5cGUnOlxuICAgIGNhc2UgJ1RTVHVwbGVUeXBlJzpcbiAgICAgIC8vIFRPRE8gKG5pY2UgdG8gaGF2ZSkgZ2VuZXJhdGUgcnVudGltZSBlbGVtZW50IHR5cGUvbGVuZ3RoIGNoZWNrc1xuICAgICAgcmV0dXJuIFsnQXJyYXknXVxuXG4gICAgY2FzZSAnVFNMaXRlcmFsVHlwZSc6XG4gICAgICBzd2l0Y2ggKG5vZGUubGl0ZXJhbC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1N0cmluZ0xpdGVyYWwnOlxuICAgICAgICAgIHJldHVybiBbJ1N0cmluZyddXG4gICAgICAgIGNhc2UgJ0Jvb2xlYW5MaXRlcmFsJzpcbiAgICAgICAgICByZXR1cm4gWydCb29sZWFuJ11cbiAgICAgICAgY2FzZSAnTnVtZXJpY0xpdGVyYWwnOlxuICAgICAgICBjYXNlICdCaWdJbnRMaXRlcmFsJzpcbiAgICAgICAgICByZXR1cm4gWydOdW1iZXInXVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBbJ251bGwnXVxuICAgICAgfVxuXG4gICAgY2FzZSAnVFNUeXBlUmVmZXJlbmNlJzpcbiAgICAgIGlmIChub2RlLnR5cGVOYW1lLnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgICAgICBpZiAoZGVjbGFyZWRUeXBlc1tub2RlLnR5cGVOYW1lLm5hbWVdKVxuICAgICAgICAgIHJldHVybiBkZWNsYXJlZFR5cGVzW25vZGUudHlwZU5hbWUubmFtZV1cblxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZU5hbWUubmFtZSkge1xuICAgICAgICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgICAgICBjYXNlICdGdW5jdGlvbic6XG4gICAgICAgICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgICAgICBjYXNlICdTZXQnOlxuICAgICAgICAgIGNhc2UgJ01hcCc6XG4gICAgICAgICAgY2FzZSAnV2Vha1NldCc6XG4gICAgICAgICAgY2FzZSAnV2Vha01hcCc6XG4gICAgICAgICAgICByZXR1cm4gW25vZGUudHlwZU5hbWUubmFtZV1cbiAgICAgICAgICBjYXNlICdSZWNvcmQnOlxuICAgICAgICAgIGNhc2UgJ1BhcnRpYWwnOlxuICAgICAgICAgIGNhc2UgJ1JlYWRvbmx5JzpcbiAgICAgICAgICBjYXNlICdQaWNrJzpcbiAgICAgICAgICBjYXNlICdPbWl0JzpcbiAgICAgICAgICBjYXNlICdFeGNsdWRlJzpcbiAgICAgICAgICBjYXNlICdFeHRyYWN0JzpcbiAgICAgICAgICBjYXNlICdSZXF1aXJlZCc6XG4gICAgICAgICAgY2FzZSAnSW5zdGFuY2VUeXBlJzpcbiAgICAgICAgICAgIHJldHVybiBbJ09iamVjdCddXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbJ251bGwnXVxuXG4gICAgY2FzZSAnVFNQYXJlbnRoZXNpemVkVHlwZSc6XG4gICAgICByZXR1cm4gaW5mZXJSdW50aW1lVHlwZShub2RlLnR5cGVBbm5vdGF0aW9uLCBkZWNsYXJlZFR5cGVzKVxuICAgIGNhc2UgJ1RTVW5pb25UeXBlJzpcbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgICAgW10uY29uY2F0KFxuICAgICAgICAgICAgLi4uKG5vZGUudHlwZXMubWFwKHQgPT4gaW5mZXJSdW50aW1lVHlwZSh0LCBkZWNsYXJlZFR5cGVzKSkgYXMgYW55KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgXVxuICAgIGNhc2UgJ1RTSW50ZXJzZWN0aW9uVHlwZSc6XG4gICAgICByZXR1cm4gWydPYmplY3QnXVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbJ251bGwnXSAvLyBubyBydW50aW1lIGNoZWNrXG4gIH1cbn1cbiIsImltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tICdAdnVlL3NoYXJlZCdcbmltcG9ydCB0eXBlIHsgTm9kZSwgT2JqZWN0RXhwcmVzc2lvbiwgU3RhdGVtZW50IH0gZnJvbSAnQGJhYmVsL3R5cGVzJ1xuaW1wb3J0IHsgbm90TnVsbGlzaCwgcGFydGl0aW9uLCB1bmlxIH0gZnJvbSAnQGFudGZ1L3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBQYXJzZWRTRkMsIFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlNYWNyb3MgfSBmcm9tICcuL21hY3JvcydcbmltcG9ydCB7IGdldElkZW50aWZpZXJEZWNsYXJhdGlvbnMgfSBmcm9tICcuL2lkZW50aWZpZXJzJ1xuaW1wb3J0IHsgZ2VuZXJhdGUsIHQgfSBmcm9tICcuL2JhYmVsJ1xuaW1wb3J0IHsgcGFzY2FsaXplIH0gZnJvbSAnLi91dGlscydcblxuZnVuY3Rpb24gaXNBc3luY0ltcG9ydChub2RlOiBTdGF0ZW1lbnQpIHtcbiAgaWYgKHQuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBub2RlLmRlY2xhcmF0aW9uc1swXVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGRlY2xhcmF0aW9uICE9PSB1bmRlZmluZWRcbiAgICAgICYmIHQuaXNDYWxsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0KVxuICAgICAgJiYgdC5pc0lkZW50aWZpZXIoZGVjbGFyYXRpb24uaW5pdC5jYWxsZWUpXG4gICAgICAmJiBkZWNsYXJhdGlvbi5pbml0LmNhbGxlZS5uYW1lID09PSAnZGVmaW5lQXN5bmNDb21wb25lbnQnXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1TY3JpcHRTZXR1cChcbiAgc2ZjOiBQYXJzZWRTRkMsXG4gIG9wdGlvbnM/OiBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMsXG4pIHtcbiAgY29uc3QgeyBzY3JpcHRTZXR1cCwgc2NyaXB0LCB0ZW1wbGF0ZSB9ID0gc2ZjXG5cbiAgY29uc3QgeyBub2RlczogYm9keSwgcHJvcHMsIGV4cG9zZSB9ID0gYXBwbHlNYWNyb3Moc2NyaXB0U2V0dXAuYXN0LmJvZHkpXG5cbiAgY29uc3QgW2hvaXN0ZWQsIHNldHVwQm9keV0gPSBwYXJ0aXRpb24oXG4gICAgYm9keSxcbiAgICBuID0+XG4gICAgICBpc0FzeW5jSW1wb3J0KG4pXG4gICAgICB8fCB0LmlzSW1wb3J0RGVjbGFyYXRpb24obilcbiAgICAgIHx8IHQuaXNFeHBvcnROYW1lZERlY2xhcmF0aW9uKG4pXG4gICAgICB8fCBuLnR5cGUuc3RhcnRzV2l0aCgnVFMnKSxcbiAgKVxuXG4gIC8vIGdldCBhbGwgaWRlbnRpZmllcnMgaW4gYDxzY3JpcHQgc2V0dXA+YCBhbmQgYDxzY3JpcHQ+YFxuICBjb25zdCBkZWNsYXJhdGlvbkFycmF5ID0gdW5pcShbXG4gICAgLi4uZ2V0SWRlbnRpZmllckRlY2xhcmF0aW9ucyhob2lzdGVkKSxcbiAgICAuLi5nZXRJZGVudGlmaWVyRGVjbGFyYXRpb25zKHNldHVwQm9keSksXG4gICAgLi4uZ2V0SWRlbnRpZmllckRlY2xhcmF0aW9ucyhzY3JpcHQuYXN0LmJvZHkpLFxuICBdKS5maWx0ZXIobm90TnVsbGlzaClcblxuICAvLyBmaWx0ZXIgb3V0IGlkZW50aWZpZXJzIHRoYXQgYXJlIHVzZWQgaW4gYDx0ZW1wbGF0ZT5gXG4gIGNvbnN0IHJldHVybnM6IE9iamVjdEV4cHJlc3Npb25bJ3Byb3BlcnRpZXMnXSA9IGRlY2xhcmF0aW9uQXJyYXlcbiAgICAuZmlsdGVyKGkgPT4gdGVtcGxhdGUuaWRlbnRpZmllcnMuaGFzKGkpKVxuICAgIC5tYXAoKGkpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gdC5pZGVudGlmaWVyKGkpXG4gICAgICByZXR1cm4gdC5vYmplY3RQcm9wZXJ0eShpZCwgaWQsIGZhbHNlLCB0cnVlKVxuICAgIH0pXG5cbiAgY29uc3QgY29tcG9uZW50cyA9IEFycmF5LmZyb20odGVtcGxhdGUuY29tcG9uZW50cylcbiAgICAubWFwKFxuICAgICAgY29tcG9uZW50ID0+XG4gICAgICAgIGRlY2xhcmF0aW9uQXJyYXkuZmluZChkZWNsYXJlID0+IGRlY2xhcmUgPT09IGNvbXBvbmVudClcbiAgICAgICAgPz8gZGVjbGFyYXRpb25BcnJheS5maW5kKGRlY2xhcmUgPT4gcGFzY2FsaXplKGRlY2xhcmUpID09PSBjb21wb25lbnQpLFxuICAgIClcbiAgICAuZmlsdGVyKG5vdE51bGxpc2gpXG5cbiAgY29uc3QgZGlyZWN0aXZlRGVjbGFyYXRpb24gPSBBcnJheS5mcm9tKHRlbXBsYXRlLmRpcmVjdGl2ZXMpXG4gICAgLm1hcCgoZGlyZWN0aXZlKSA9PiB7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gZGVjbGFyYXRpb25BcnJheS5maW5kKFxuICAgICAgICBkZWNsYXJhdGlvbiA9PiBkZWNsYXJhdGlvbiA9PT0gYHYke2NhcGl0YWxpemUoZGlyZWN0aXZlKX1gLFxuICAgICAgKVxuICAgICAgaWYgKGlkZW50aWZpZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4geyBpZGVudGlmaWVyLCBkaXJlY3RpdmUgfVxuICAgIH0pXG4gICAgLmZpbHRlcihub3ROdWxsaXNoKVxuXG4gIC8vIGFwcGVuZCBgPHNjcmlwdCBzZXR1cD5gIGltcG9ydHMgdG8gYDxzY3JpcHQ+YFxuXG4gIGNvbnN0IF9fc2ZjID0gdC5pZGVudGlmaWVyKCdfX3NmY19tYWluJylcblxuICBsZXQgaGFzQm9keSA9IGZhbHNlXG5cbiAgY29uc3QgYm9keU5vZGVzID0gc2NyaXB0LmFzdC5ib2R5Lm1hcCgobm9kZTogTm9kZSkgPT4ge1xuICAgIC8vIHJlcGxhY2UgYGV4cG9ydCBkZWZhdWx0YCB3aXRoIGEgdGVtcHJvcmF5IHZhcmlhYmxlXG4gICAgLy8gYGNvbnN0IF9fc2ZjX21haW4gPSB7IC4uLiB9YFxuICAgIGlmIChub2RlLnR5cGUgPT09ICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nKSB7XG4gICAgICBoYXNCb2R5ID0gdHJ1ZVxuICAgICAgcmV0dXJuIHQudmFyaWFibGVEZWNsYXJhdGlvbignY29uc3QnLCBbXG4gICAgICAgIHQudmFyaWFibGVEZWNsYXJhdG9yKF9fc2ZjLCBub2RlLmRlY2xhcmF0aW9uIGFzIGFueSksXG4gICAgICBdKVxuICAgIH1cbiAgICByZXR1cm4gbm9kZVxuICB9KVxuXG4gIGxldCBhc3QgPSB0LnByb2dyYW0oW1xuICAgIC4uLnNmYy5leHRyYURlY2xhcmF0aW9ucyxcbiAgICAuLi5ob2lzdGVkLFxuICAgIC4uLmJvZHlOb2RlcyxcbiAgXSBhcyBTdGF0ZW1lbnRbXSlcblxuICAvLyBpbmplY3QgYGNvbnN0IF9fc2ZjX21haW4gPSB7fWAgaWYgYDxzY3JpcHQ+YCBoYXMgZGVmYXVsdCBleHBvcnRcbiAgaWYgKCFoYXNCb2R5KSB7XG4gICAgYXN0LmJvZHkucHVzaChcbiAgICAgIHQudmFyaWFibGVEZWNsYXJhdGlvbignY29uc3QnLCBbXG4gICAgICAgIHQudmFyaWFibGVEZWNsYXJhdG9yKF9fc2ZjLCB0Lm9iamVjdEV4cHJlc3Npb24oW10pKSxcbiAgICAgIF0pLFxuICAgIClcbiAgfVxuXG4gIC8vIGluamVjdCBwcm9wcyBmdW5jdGlvblxuICAvLyBgX19zZmNfbWFpbi5wcm9wcyA9IHsgLi4uIH1gXG4gIGlmIChwcm9wcykge1xuICAgIGhhc0JvZHkgPSB0cnVlXG4gICAgYXN0LmJvZHkucHVzaChcbiAgICAgIHQuZXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgdC5hc3NpZ25tZW50RXhwcmVzc2lvbihcbiAgICAgICAgICAnPScsXG4gICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ3Byb3BzJykpLFxuICAgICAgICAgIHByb3BzIGFzIGFueSxcbiAgICAgICAgKSxcbiAgICAgICkgYXMgYW55LFxuICAgIClcbiAgfVxuXG4gIC8vIGluamVjdCBzZXR1cCBmdW5jdGlvblxuICAvLyBgX19zZmNfbWFpbi5zZXR1cCA9ICgpID0+IHt9YFxuICBpZiAoYm9keS5sZW5ndGgpIHtcbiAgICBoYXNCb2R5ID0gdHJ1ZVxuICAgIGNvbnN0IHJldHVybkV4cHIgPSBleHBvc2VcbiAgICAgID8gdC5jYWxsRXhwcmVzc2lvbihcbiAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKHQuaWRlbnRpZmllcignT2JqZWN0JyksIHQuaWRlbnRpZmllcignYXNzaWduJykpLFxuICAgICAgICBbdC5vYmplY3RFeHByZXNzaW9uKHJldHVybnMpLCBleHBvc2VdLFxuICAgICAgKVxuICAgICAgOiB0Lm9iamVjdEV4cHJlc3Npb24ocmV0dXJucylcbiAgICBjb25zdCByZXR1cm5TdGF0ZW1lbnQgPSB0LnJldHVyblN0YXRlbWVudChyZXR1cm5FeHByKVxuXG4gICAgYXN0LmJvZHkucHVzaChcbiAgICAgIHQuZXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgdC5hc3NpZ25tZW50RXhwcmVzc2lvbihcbiAgICAgICAgICAnPScsXG4gICAgICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKF9fc2ZjLCB0LmlkZW50aWZpZXIoJ3NldHVwJykpLFxuICAgICAgICAgIHQuYXJyb3dGdW5jdGlvbkV4cHJlc3Npb24oXG4gICAgICAgICAgICBbdC5pZGVudGlmaWVyKCdfX3Byb3BzJyksIHQuaWRlbnRpZmllcignX19jdHgnKV0sXG4gICAgICAgICAgICB0LmJsb2NrU3RhdGVtZW50KFsuLi5zZXR1cEJvZHksIHJldHVyblN0YXRlbWVudCBhcyBhbnldKSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKSBhcyBhbnksXG4gICAgKVxuICB9XG5cbiAgLy8gaW5qZWN0IGNvbXBvbmVudHNcbiAgLy8gYF9fc2ZjX21haW4uY29tcG9uZW50cyA9IE9iamVjdC5hc3NpZ24oeyAuLi4gfSwgX19zZmNfbWFpbi5jb21wb25lbnRzKWBcbiAgaWYgKGNvbXBvbmVudHMubGVuZ3RoKSB7XG4gICAgaGFzQm9keSA9IHRydWVcbiAgICBjb25zdCBjb21wb25lbnRzT2JqZWN0ID0gdC5vYmplY3RFeHByZXNzaW9uKFxuICAgICAgY29tcG9uZW50cy5tYXAoKGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSB0LmlkZW50aWZpZXIoaSlcbiAgICAgICAgcmV0dXJuIHQub2JqZWN0UHJvcGVydHkoaWQsIGlkLCBmYWxzZSwgdHJ1ZSlcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGFzdC5ib2R5LnB1c2goXG4gICAgICB0LmV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgIHQuYXNzaWdubWVudEV4cHJlc3Npb24oXG4gICAgICAgICAgJz0nLFxuICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbihfX3NmYywgdC5pZGVudGlmaWVyKCdjb21wb25lbnRzJykpLFxuICAgICAgICAgIHQuY2FsbEV4cHJlc3Npb24oXG4gICAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24odC5pZGVudGlmaWVyKCdPYmplY3QnKSwgdC5pZGVudGlmaWVyKCdhc3NpZ24nKSksXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGNvbXBvbmVudHNPYmplY3QsXG4gICAgICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbihfX3NmYywgdC5pZGVudGlmaWVyKCdjb21wb25lbnRzJykpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKSBhcyBhbnksXG4gICAgKVxuICB9XG5cbiAgLy8gaW5qZWN0IGRpcmVjdGl2ZXNcbiAgLy8gYF9fc2ZjX21haW4uZGlyZWN0aXZlcyA9IE9iamVjdC5hc3NpZ24oeyAuLi4gfSwgX19zZmNfbWFpbi5kaXJlY3RpdmVzKWBcbiAgaWYgKGRpcmVjdGl2ZURlY2xhcmF0aW9uLmxlbmd0aCkge1xuICAgIGhhc0JvZHkgPSB0cnVlXG4gICAgY29uc3QgZGlyZWN0aXZlc09iamVjdCA9IHQub2JqZWN0RXhwcmVzc2lvbihcbiAgICAgIGRpcmVjdGl2ZURlY2xhcmF0aW9uLm1hcCgoeyBkaXJlY3RpdmUsIGlkZW50aWZpZXIgfSkgPT5cbiAgICAgICAgdC5vYmplY3RQcm9wZXJ0eShcbiAgICAgICAgICB0LmlkZW50aWZpZXIoZGlyZWN0aXZlKSxcbiAgICAgICAgICB0LmlkZW50aWZpZXIoaWRlbnRpZmllciksXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICksXG4gICAgICApLFxuICAgIClcblxuICAgIGFzdC5ib2R5LnB1c2goXG4gICAgICB0LmV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgIHQuYXNzaWdubWVudEV4cHJlc3Npb24oXG4gICAgICAgICAgJz0nLFxuICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbihfX3NmYywgdC5pZGVudGlmaWVyKCdkaXJlY3RpdmVzJykpLFxuICAgICAgICAgIHQuY2FsbEV4cHJlc3Npb24oXG4gICAgICAgICAgICB0Lm1lbWJlckV4cHJlc3Npb24odC5pZGVudGlmaWVyKCdPYmplY3QnKSwgdC5pZGVudGlmaWVyKCdhc3NpZ24nKSksXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGRpcmVjdGl2ZXNPYmplY3QsXG4gICAgICAgICAgICAgIHQubWVtYmVyRXhwcmVzc2lvbihfX3NmYywgdC5pZGVudGlmaWVyKCdkaXJlY3RpdmVzJykpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKSBhcyBhbnksXG4gICAgKVxuICB9XG5cbiAgaWYgKCFoYXNCb2R5ICYmICFvcHRpb25zPy5hc3RUcmFuc2Zvcm1zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFzdDogbnVsbCxcbiAgICAgIGNvZGU6ICcnLFxuICAgIH1cbiAgfVxuXG4gIC8vIHJlLWV4cG9ydFxuICAvLyBgZXhwb3J0IGRlZmF1bHQgX19zZmNfbWFpbmBcbiAgYXN0LmJvZHkucHVzaCh0LmV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihfX3NmYykgYXMgYW55KVxuXG4gIGFzdCA9IG9wdGlvbnM/LmFzdFRyYW5zZm9ybXM/LnBvc3Q/Lihhc3QsIHNmYykgfHwgYXN0XG5cbiAgcmV0dXJuIHtcbiAgICBhc3QsXG4gICAgY29kZTogZ2VuZXJhdGUoYXN0KS5jb2RlLFxuICB9XG59XG4iLCJpbXBvcnQgeyBzaG91bGRUcmFuc2Zvcm0sIHRyYW5zZm9ybUFTVCB9IGZyb20gJ0B2dWUvcmVhY3Rpdml0eS10cmFuc2Zvcm0nXG5pbXBvcnQgTWFnaWNTdHJpbmcgZnJvbSAnbWFnaWMtc3RyaW5nJ1xuaW1wb3J0IHR5cGUgeyBQYXJzZWRTRkMsIFJlc29sdmVkT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgcGFyc2UsIHQgfSBmcm9tICcuL2JhYmVsJ1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtU2ZjUmVmU3VnYXIoc2ZjOiBQYXJzZWRTRkMsIG9wdGlvbnM6IFJlc29sdmVkT3B0aW9ucykge1xuICBjb25zdCBpbXBvcnRlZEhlbHBlcnMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIGZvciAoY29uc3Qgc2NyaXB0IG9mIFtzZmMuc2NyaXB0LCBzZmMuc2NyaXB0U2V0dXBdKSB7XG4gICAgaWYgKHNob3VsZFRyYW5zZm9ybShzY3JpcHQuY29udGVudCkpIHtcbiAgICAgIGNvbnN0IHMgPSBuZXcgTWFnaWNTdHJpbmcoc2NyaXB0LmNvbnRlbnQpXG4gICAgICBjb25zdCB7IGltcG9ydGVkSGVscGVyczogaW1wb3J0cyB9ID0gdHJhbnNmb3JtQVNUKHNjcmlwdC5hc3QsIHMpXG4gICAgICBBcnJheS5mcm9tKGltcG9ydHMpLmZvckVhY2goaGVscGVyID0+IGltcG9ydGVkSGVscGVycy5hZGQoaGVscGVyKSlcbiAgICAgIHNjcmlwdC5jb250ZW50ID0gcy50b1N0cmluZygpXG4gICAgICBzY3JpcHQuYXN0ID0gcGFyc2Uoc2NyaXB0LmNvbnRlbnQsIHNmYy5wYXJzZXJPcHRpb25zKS5wcm9ncmFtXG4gICAgfVxuICB9XG5cbiAgaWYgKGltcG9ydGVkSGVscGVycy5zaXplKSB7XG4gICAgc2ZjLmV4dHJhRGVjbGFyYXRpb25zID0gW1xuICAgICAgdC5pbXBvcnREZWNsYXJhdGlvbihcbiAgICAgICAgQXJyYXkuZnJvbShpbXBvcnRlZEhlbHBlcnMpLm1hcChpID0+IHQuaW1wb3J0U3BlY2lmaWVyKHQuaWRlbnRpZmllcihgXyR7aX1gKSwgdC5pZGVudGlmaWVyKGkpKSksXG4gICAgICAgIHQuc3RyaW5nTGl0ZXJhbChvcHRpb25zLmltcG9ydEhlbHBlcnNGcm9tKSxcbiAgICAgICksXG4gICAgXVxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlc29sdmVkT3B0aW9ucywgU2NyaXB0U2V0dXBUcmFuc2Zvcm1PcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3B0aW9ucyhvcHRpb25zOiBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMgPSB7fSk6IFJlc29sdmVkT3B0aW9ucyB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgIHt9LFxuICAgIHtcbiAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgIHJlYWN0aXZpdHlUcmFuc2Zvcm06IGZhbHNlLFxuICAgICAgaW1wb3J0SGVscGVyc0Zyb206ICdAdnVlL2NvbXBvc2l0aW9uLWFwaScsXG4gICAgICBhc3RUcmFuc2Zvcm1zOiB7fSxcbiAgICB9LFxuICAgIG9wdGlvbnMsXG4gIClcbn1cbiIsImltcG9ydCBNYWdpY1N0cmluZyBmcm9tICdtYWdpYy1zdHJpbmcnXG5pbXBvcnQgeyBzaG91bGRUcmFuc2Zvcm0gYXMgc2hvdWxkVHJhbnNmb3JtUmVmU3VnYXIsIHRyYW5zZm9ybSBhcyB0cmFuc2Zvcm1SZWYgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHktdHJhbnNmb3JtJ1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZE9wdGlvbnMsIFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucywgVHJhbnNmb3JtUmVzdWx0IH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBwYXJzZVNGQyB9IGZyb20gJy4vcGFyc2VTRkMnXG5pbXBvcnQgeyB0cmFuc2Zvcm1TY3JpcHRTZXR1cCB9IGZyb20gJy4vdHJhbnNmb3JtU2NyaXB0U2V0dXAnXG5pbXBvcnQgeyB0cmFuc2Zvcm1TZmNSZWZTdWdhciB9IGZyb20gJy4vdHJhbnNmb3JtU2ZjUmVmU3VnYXInXG5pbXBvcnQgeyByZXNvbHZlT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucydcblxuY29uc3Qgc2NyaXB0U2V0dXBSRSA9IC88c2NyaXB0XFxzKC4qXFxzKT9zZXR1cChcXHMuKik/Pi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFRyYW5zZm9ybShjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBTY3JpcHRTZXR1cFRyYW5zZm9ybU9wdGlvbnMpOiBib29sZWFuIHtcbiAgLy8gYXZvaWQgdHJhbnNmb3JtaW5nIHR3aWNlXG4gIGlmIChjb2RlLmluY2x1ZGVzKCdleHBvcnQgZGVmYXVsdCBfX3NmY19tYWluJykpXG4gICAgcmV0dXJuIGZhbHNlXG4gIHJldHVybiAob3B0aW9ucz8ucmVhY3Rpdml0eVRyYW5zZm9ybSAmJiBzaG91bGRUcmFuc2Zvcm1SZWZTdWdhcihjb2RlKSkgfHwgc2NyaXB0U2V0dXBSRS50ZXN0KGNvZGUpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2Zvcm0oaW5wdXQ6IHN0cmluZywgaWQ6IHN0cmluZywgb3B0aW9ucz86IFNjcmlwdFNldHVwVHJhbnNmb3JtT3B0aW9ucyk6IFByb21pc2U8VHJhbnNmb3JtUmVzdWx0PiB7XG4gIGlmICghc2hvdWxkVHJhbnNmb3JtKGlucHV0LCBpZCwgb3B0aW9ucykpXG4gICAgcmV0dXJuIG51bGxcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlT3B0aW9ucyhvcHRpb25zKVxuICBpZiAoaWQuZW5kc1dpdGgoJy52dWUnKSB8fCBpZC5pbmNsdWRlcygnLnZ1ZT92dWUnKSlcbiAgICByZXR1cm4gYXdhaXQgdHJhbnNmb3JtVnVlKGlucHV0LCBpZCwgcmVzb2x2ZWQpXG4gIGVsc2VcbiAgICByZXR1cm4gdHJhbnNmb3JtTm9uVnVlKGlucHV0LCBpZCwgcmVzb2x2ZWQpXG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybU5vblZ1ZShpbnB1dDogc3RyaW5nLCBpZDogc3RyaW5nLCBvcHRpb25zOiBSZXNvbHZlZE9wdGlvbnMpOiBUcmFuc2Zvcm1SZXN1bHQge1xuICBpZiAob3B0aW9ucy5yZWFjdGl2aXR5VHJhbnNmb3JtICYmIHNob3VsZFRyYW5zZm9ybVJlZlN1Z2FyKGlucHV0KSkge1xuICAgIHJldHVybiB0cmFuc2Zvcm1SZWYoaW5wdXQsIHtcbiAgICAgIGZpbGVuYW1lOiBpZCxcbiAgICAgIHNvdXJjZU1hcDogb3B0aW9ucy5zb3VyY2VNYXAsXG4gICAgICBpbXBvcnRIZWxwZXJzRnJvbTogb3B0aW9ucy5pbXBvcnRIZWxwZXJzRnJvbSxcbiAgICB9KSBhcyBhbnlcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5hc3luYyBmdW5jdGlvbiB0cmFuc2Zvcm1WdWUoaW5wdXQ6IHN0cmluZywgaWQ6IHN0cmluZywgb3B0aW9uczogUmVzb2x2ZWRPcHRpb25zKTogUHJvbWlzZTxUcmFuc2Zvcm1SZXN1bHQ+IHtcbiAgY29uc3QgcyA9IG5ldyBNYWdpY1N0cmluZyhpbnB1dClcblxuICBjb25zdCBzZmMgPSBhd2FpdCBwYXJzZVNGQyhpbnB1dCwgaWQpXG5cbiAgaWYgKG9wdGlvbnMucmVhY3Rpdml0eVRyYW5zZm9ybSlcbiAgICB0cmFuc2Zvcm1TZmNSZWZTdWdhcihzZmMsIG9wdGlvbnMpXG5cbiAgY29uc3QgeyBjb2RlIH0gPSB0cmFuc2Zvcm1TY3JpcHRTZXR1cChzZmMsIG9wdGlvbnMpXG5cbiAgY29uc3QgYXR0cmlidXRlcyA9IHtcbiAgICAuLi5zZmMuc2NyaXB0LmF0dHJzLFxuICAgIC4uLnNmYy5zY3JpcHRTZXR1cC5hdHRycyxcbiAgfVxuICBkZWxldGUgYXR0cmlidXRlcy5zZXR1cFxuICBjb25zdCBhdHRyID0gT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcylcbiAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHZhbHVlID8gYCR7a2V5fT1cIiR7dmFsdWV9XCJgIDoga2V5KVxuICAgIC5qb2luKCcgJylcblxuICBpZiAoY29kZSkge1xuICAgIGNvbnN0IGJsb2NrID0gYDxzY3JpcHQgJHthdHRyfT5cXG4ke2NvZGV9XFxuPC9zY3JpcHQ+YFxuXG4gICAgcy5yZW1vdmUoc2ZjLnNjcmlwdC5zdGFydCwgc2ZjLnNjcmlwdC5lbmQpXG4gICAgaWYgKHNmYy5zY3JpcHRTZXR1cC5zdGFydCAhPT0gc2ZjLnNjcmlwdFNldHVwLmVuZCkge1xuICAgICAgcy5vdmVyd3JpdGUoXG4gICAgICAgIHNmYy5zY3JpcHRTZXR1cC5zdGFydCxcbiAgICAgICAgc2ZjLnNjcmlwdFNldHVwLmVuZCxcbiAgICAgICAgYmxvY2ssXG4gICAgICApXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5wcmVwZW5kTGVmdCgwLCBgJHtibG9ja31cXG5gKVxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGNvZGU6IHMudG9TdHJpbmcoKSxcbiAgICBtYXA6IG9wdGlvbnMuc291cmNlTWFwXG4gICAgICA/IHMuZ2VuZXJhdGVNYXAoe1xuICAgICAgICBzb3VyY2U6IGlkLFxuICAgICAgICBpbmNsdWRlQ29udGVudDogdHJ1ZSxcbiAgICAgIH0pIGFzIGFueVxuICAgICAgOiBudWxsLFxuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVVbnBsdWdpbiB9IGZyb20gJ3VucGx1Z2luJ1xuaW1wb3J0IHsgY3JlYXRlRmlsdGVyIH0gZnJvbSAnQHJvbGx1cC9wbHVnaW51dGlscydcbmltcG9ydCB0eXBlIHsgUGx1Z2luT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICcuL2NvcmUnXG5cbmV4cG9ydCAqIGZyb20gJy4vY29yZSdcblxuZXhwb3J0IGNvbnN0IHVucGx1Z2luID0gY3JlYXRlVW5wbHVnaW48UGx1Z2luT3B0aW9ucz4oKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBmaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoXG4gICAgb3B0aW9ucy5pbmNsdWRlIHx8IChvcHRpb25zLnJlYWN0aXZpdHlUcmFuc2Zvcm0gPyBbL1xcLnZ1ZSQvLCAvXFwudnVlXFw/dnVlLywgL1xcLltqdF1zeD8kL10gOiBbL1xcLnZ1ZSQvLCAvXFwudnVlXFw/dnVlL10pLFxuICAgIG9wdGlvbnMuZXhjbHVkZSB8fCBbL25vZGVfbW9kdWxlcy8sIC9cXC5naXQvLCAvXFwubnV4dC9dLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAndW5wbHVnaW4tdnVlMi1zY3JpcHQtc2V0dXAnLFxuICAgIGVuZm9yY2U6ICdwcmUnLFxuICAgIHRyYW5zZm9ybUluY2x1ZGUoaWQpIHtcbiAgICAgIHJldHVybiBmaWx0ZXIoaWQpXG4gICAgfSxcbiAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0cmFuc2Zvcm0oY29kZSwgaWQsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgICBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHRoaXMuZXJyb3IoZSlcbiAgICAgIH1cbiAgICB9LFxuICB9XG59KVxuXG5leHBvcnQgZGVmYXVsdCB1bnBsdWdpblxuIiwiaW1wb3J0IHVucGx1Z2luIGZyb20gJy4nXG5cbmV4cG9ydCBkZWZhdWx0IHVucGx1Z2luLnZpdGVcbiJdLCJuYW1lcyI6WyJOb2RlVHlwZXMiLCJFbGVtZW50VHlwZXMiLCJub2RlIiwiX2EiLCJfYiIsIl9jIiwiY29udGVudCIsImFzdCIsImtleSIsInZhbHVlIiwidCIsInNob3VsZFRyYW5zZm9ybSIsInNob3VsZFRyYW5zZm9ybVJlZlN1Z2FyIiwidHJhbnNmb3JtUmVmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsQ0FBQTtBQUthLE1BQUEsQ0FBQSxHQUFBLENBQTZCLEtBQWMsQ0FBQSxPQUFBLElBQVcsS0FBTyxFQUFBLEtBQUEsQ0FBQTtBQUM3RCxNQUFBLFFBQUEsR0FBdUIsRUFBVSxPQUFXLElBQUEsQ0FBQSxDQUFBO0FBQzVDLE1BQUEsUUFBQSxHQUFBLENBQWEsa0VBQXdCLE9BQXhCLEtBQUEsSUFBQSxHQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQUEsQ0FBaUMs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
|