UNPKG

@glimmer/syntax

Version:
498 lines (436 loc) 46.3 kB
import { assert, assign, deprecate, isPresent } from '@glimmer/util'; import { SYNTHETIC_LOCATION } from '../source/location'; import { Source } from '../source/source'; import { SourceSpan } from '../source/span'; import { PathExpressionImplV1 } from './legacy-interop'; var _SOURCE; function SOURCE() { if (!_SOURCE) { _SOURCE = new Source('', '(synthetic)'); } return _SOURCE; } function buildMustache(path, params, hash, raw, loc, strip) { if (typeof path === 'string') { path = buildPath(path); } return { type: 'MustacheStatement', path: path, params: params || [], hash: hash || buildHash([]), escaped: !raw, trusting: !!raw, loc: buildLoc(loc || null), strip: strip || { open: false, close: false } }; } function buildBlock(path, params, hash, _defaultBlock, _elseBlock, loc, openStrip, inverseStrip, closeStrip) { var defaultBlock; var elseBlock; if (_defaultBlock.type === 'Template') { if (false /* LOCAL_DEBUG */ ) { false && !false && deprecate("b.program is deprecated. Use b.blockItself instead."); } defaultBlock = assign({}, _defaultBlock, { type: 'Block' }); } else { defaultBlock = _defaultBlock; } if (_elseBlock !== undefined && _elseBlock !== null && _elseBlock.type === 'Template') { if (false /* LOCAL_DEBUG */ ) { false && !false && deprecate("b.program is deprecated. Use b.blockItself instead."); } elseBlock = assign({}, _elseBlock, { type: 'Block' }); } else { elseBlock = _elseBlock; } return { type: 'BlockStatement', path: buildPath(path), params: params || [], hash: hash || buildHash([]), program: defaultBlock || null, inverse: elseBlock || null, loc: buildLoc(loc || null), openStrip: openStrip || { open: false, close: false }, inverseStrip: inverseStrip || { open: false, close: false }, closeStrip: closeStrip || { open: false, close: false } }; } function buildElementModifier(path, params, hash, loc) { return { type: 'ElementModifierStatement', path: buildPath(path), params: params || [], hash: hash || buildHash([]), loc: buildLoc(loc || null) }; } function buildPartial(name, params, hash, indent, loc) { return { type: 'PartialStatement', name: name, params: params || [], hash: hash || buildHash([]), indent: indent || '', strip: { open: false, close: false }, loc: buildLoc(loc || null) }; } function buildComment(value, loc) { return { type: 'CommentStatement', value: value, loc: buildLoc(loc || null) }; } function buildMustacheComment(value, loc) { return { type: 'MustacheCommentStatement', value: value, loc: buildLoc(loc || null) }; } function buildConcat(parts, loc) { if (!isPresent(parts)) { throw new Error("b.concat requires at least one part"); } return { type: 'ConcatStatement', parts: parts || [], loc: buildLoc(loc || null) }; } function buildElement(tag, options) { if (options === void 0) { options = {}; } var _options = options, attrs = _options.attrs, blockParams = _options.blockParams, modifiers = _options.modifiers, comments = _options.comments, children = _options.children, loc = _options.loc; var tagName; // this is used for backwards compat, prior to `selfClosing` being part of the ElementNode AST var selfClosing = false; if (typeof tag === 'object') { selfClosing = tag.selfClosing; tagName = tag.name; } else if (tag.slice(-1) === '/') { tagName = tag.slice(0, -1); selfClosing = true; } else { tagName = tag; } return { type: 'ElementNode', tag: tagName, selfClosing: selfClosing, attributes: attrs || [], blockParams: blockParams || [], modifiers: modifiers || [], comments: comments || [], children: children || [], loc: buildLoc(loc || null) }; } function buildAttr(name, value, loc) { return { type: 'AttrNode', name: name, value: value, loc: buildLoc(loc || null) }; } function buildText(chars, loc) { return { type: 'TextNode', chars: chars || '', loc: buildLoc(loc || null) }; } // Expressions function buildSexpr(path, params, hash, loc) { return { type: 'SubExpression', path: buildPath(path), params: params || [], hash: hash || buildHash([]), loc: buildLoc(loc || null) }; } function headToString(head) { switch (head.type) { case 'AtHead': return { original: head.name, parts: [head.name] }; case 'ThisHead': return { original: "this", parts: [] }; case 'VarHead': return { original: head.name, parts: [head.name] }; } } function buildHead(original, loc) { var _original$split = original.split('.'), head = _original$split[0], tail = _original$split.slice(1); var headNode; if (head === 'this') { headNode = { type: 'ThisHead', loc: buildLoc(loc || null) }; } else if (head[0] === '@') { headNode = { type: 'AtHead', name: head, loc: buildLoc(loc || null) }; } else { headNode = { type: 'VarHead', name: head, loc: buildLoc(loc || null) }; } return { head: headNode, tail: tail }; } function buildThis(loc) { return { type: 'ThisHead', loc: buildLoc(loc || null) }; } function buildAtName(name, loc) { // the `@` should be included so we have a complete source range false && assert(name[0] === '@', "call builders.at() with a string that starts with '@'"); return { type: 'AtHead', name: name, loc: buildLoc(loc || null) }; } function buildVar(name, loc) { false && assert(name !== 'this', "You called builders.var() with 'this'. Call builders.this instead"); false && assert(name[0] !== '@', "You called builders.var() with '" + name + "'. Call builders.at('" + name + "') instead"); return { type: 'VarHead', name: name, loc: buildLoc(loc || null) }; } function buildHeadFromString(head, loc) { if (head[0] === '@') { return buildAtName(head, loc); } else if (head === 'this') { return buildThis(loc); } else { return buildVar(head, loc); } } function buildNamedBlockName(name, loc) { return { type: 'NamedBlockName', name: name, loc: buildLoc(loc || null) }; } function buildCleanPath(head, tail, loc) { var _headToString = headToString(head), originalHead = _headToString.original, headParts = _headToString.parts; var parts = [].concat(headParts, tail); var original = [].concat(originalHead, parts).join('.'); return new PathExpressionImplV1(original, head, tail, buildLoc(loc || null)); } function buildPath(path, loc) { if (typeof path !== 'string') { if ('type' in path) { return path; } else { var _buildHead = buildHead(path.head, SourceSpan.broken()), _head = _buildHead.head, _tail = _buildHead.tail; false && assert(_tail.length === 0, "builder.path({ head, tail }) should not be called with a head with dots in it"); var _headToString2 = headToString(_head), originalHead = _headToString2.original; return new PathExpressionImplV1([originalHead].concat(_tail).join('.'), _head, _tail, buildLoc(loc || null)); } } var _buildHead2 = buildHead(path, SourceSpan.broken()), head = _buildHead2.head, tail = _buildHead2.tail; return new PathExpressionImplV1(path, head, tail, buildLoc(loc || null)); } function buildLiteral(type, value, loc) { return { type: type, value: value, original: value, loc: buildLoc(loc || null) }; } // Miscellaneous function buildHash(pairs, loc) { return { type: 'Hash', pairs: pairs || [], loc: buildLoc(loc || null) }; } function buildPair(key, value, loc) { return { type: 'HashPair', key: key, value: value, loc: buildLoc(loc || null) }; } function buildProgram(body, blockParams, loc) { return { type: 'Template', body: body || [], blockParams: blockParams || [], loc: buildLoc(loc || null) }; } function buildBlockItself(body, blockParams, chained, loc) { if (chained === void 0) { chained = false; } return { type: 'Block', body: body || [], blockParams: blockParams || [], chained: chained, loc: buildLoc(loc || null) }; } function buildTemplate(body, blockParams, loc) { return { type: 'Template', body: body || [], blockParams: blockParams || [], loc: buildLoc(loc || null) }; } function buildPosition(line, column) { return { line: line, column: column }; } function buildLoc() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (args.length === 1) { var loc = args[0]; if (loc && typeof loc === 'object') { return SourceSpan.forHbsLoc(SOURCE(), loc); } else { return SourceSpan.forHbsLoc(SOURCE(), SYNTHETIC_LOCATION); } } else { var startLine = args[0], startColumn = args[1], endLine = args[2], endColumn = args[3], _source = args[4]; var source = _source ? new Source('', _source) : SOURCE(); return SourceSpan.forHbsLoc(source, { start: { line: startLine, column: startColumn }, end: { line: endLine, column: endColumn } }); } } export default { mustache: buildMustache, block: buildBlock, partial: buildPartial, comment: buildComment, mustacheComment: buildMustacheComment, element: buildElement, elementModifier: buildElementModifier, attr: buildAttr, text: buildText, sexpr: buildSexpr, concat: buildConcat, hash: buildHash, pair: buildPair, literal: buildLiteral, program: buildProgram, blockItself: buildBlockItself, template: buildTemplate, loc: buildLoc, pos: buildPosition, path: buildPath, fullPath: buildCleanPath, head: buildHeadFromString, at: buildAtName, "var": buildVar, "this": buildThis, blockName: buildNamedBlockName, string: literal('StringLiteral'), "boolean": literal('BooleanLiteral'), number: literal('NumberLiteral'), undefined: function (_undefined) { function undefined() { return _undefined.apply(this, arguments); } undefined.toString = function () { return _undefined.toString(); }; return undefined; }(function () { return buildLiteral('UndefinedLiteral', undefined); }), "null": function _null() { return buildLiteral('NullLiteral', null); } }; function literal(type) { return function (value, loc) { return buildLiteral(type, value, loc); }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcHVibGljLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLFNBQUEsTUFBQSxFQUFBLE1BQUEsRUFBQSxTQUFBLEVBQUEsU0FBQSxRQUFBLGVBQUE7QUFFQSxTQUFBLGtCQUFBLFFBQUEsb0JBQUE7QUFDQSxTQUFBLE1BQUEsUUFBQSxrQkFBQTtBQUNBLFNBQUEsVUFBQSxRQUFBLGdCQUFBO0FBRUEsU0FBQSxvQkFBQSxRQUFBLGtCQUFBOztBQUVBLElBQUEsT0FBQTs7QUFFQSxTQUFBLE1BQUEsR0FBZTtBQUNiLE1BQUksQ0FBSixPQUFBLEVBQWM7QUFDWixJQUFBLE9BQU8sR0FBRyxJQUFBLE1BQUEsQ0FBQSxFQUFBLEVBQVYsYUFBVSxDQUFWO0FBQ0Q7O0FBRUQsU0FBQSxPQUFBO0FBQ0Q7O0FBU0QsU0FBQSxhQUFBLENBQUEsSUFBQSxFQUFBLE1BQUEsRUFBQSxJQUFBLEVBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxLQUFBLEVBTTBCO0FBRXhCLE1BQUksT0FBQSxJQUFBLEtBQUosUUFBQSxFQUE4QjtBQUM1QixJQUFBLElBQUksR0FBRyxTQUFTLENBQWhCLElBQWdCLENBQWhCO0FBQ0Q7O0FBRUQsU0FBTztBQUNMLElBQUEsSUFBSSxFQURDLG1CQUFBO0FBRUwsSUFBQSxJQUZLLEVBRUwsSUFGSztBQUdMLElBQUEsTUFBTSxFQUFFLE1BQU0sSUFIVCxFQUFBO0FBSUwsSUFBQSxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FKbEIsRUFJa0IsQ0FKbEI7QUFLTCxJQUFBLE9BQU8sRUFBRSxDQUxKLEdBQUE7QUFNTCxJQUFBLFFBQVEsRUFBRSxDQUFDLENBTk4sR0FBQTtBQU9MLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBUFosSUFPUSxDQVBSO0FBUUwsSUFBQSxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQUUsTUFBQSxJQUFJLEVB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QUFBO0FBY2IsRUFBQSxJQUFJLEVBZFMsU0FBQTtBQWViLEVBQUEsT0FBTyxFQWZNLFlBQUE7QUFnQmIsRUFBQSxPQUFPLEVBaEJNLFlBQUE7QUFpQmIsRUFBQSxXQUFXLEVBakJFLGdCQUFBO0FBa0JiLEVBQUEsUUFBUSxFQWxCSyxhQUFBO0FBbUJiLEVBQUEsR0FBRyxFQW5CVSxRQUFBO0FBb0JiLEVBQUEsR0FBRyxFQXBCVSxhQUFBO0FBc0JiLEVBQUEsSUFBSSxFQXRCUyxTQUFBO0FBd0JiLEVBQUEsUUFBUSxFQXhCSyxjQUFBO0FBeUJiLEVBQUEsSUFBSSxFQXpCUyxtQkFBQTtBQTBCYixFQUFBLEVBQUUsRUExQlcsV0FBQTtBQTJCYixTQTNCYSxRQUFBO0FBNEJiLFVBNUJhLFNBQUE7QUE2QmIsRUFBQSxTQUFTLEVBN0JJLG1CQUFBO0FBK0JiLEVBQUEsTUFBTSxFQUFFLE9BQU8sQ0EvQkYsZUErQkUsQ0EvQkY7QUFnQ2IsYUFBUyxPQUFPLENBaENILGdCQWdDRyxDQWhDSDtBQWlDYixFQUFBLE1BQU0sRUFBRSxPQUFPLENBakNGLGVBaUNFLENBakNGO0FBa0NiLEVBQUEsU0FsQ2E7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsZ0JBa0NKO0FBQ1AsV0FBTyxZQUFZLENBQUEsa0JBQUEsRUFBbkIsU0FBbUIsQ0FBbkI7QUFuQ1csR0FBQTtBQUFBLDJCQXFDVDtBQUNGLFdBQU8sWUFBWSxDQUFBLGFBQUEsRUFBbkIsSUFBbUIsQ0FBbkI7QUFDRDtBQXZDWSxDQUFmOztBQTRDQSxTQUFBLE9BQUEsQ0FBQSxJQUFBLEVBQXlEO0FBQ3ZELFNBQU8sVUFBQSxLQUFBLEVBQUEsR0FBQSxFQUFpRDtBQUN0RCxXQUFPLFlBQVksQ0FBQSxJQUFBLEVBQUEsS0FBQSxFQUFuQixHQUFtQixDQUFuQjtBQURGLEdBQUE7QUFHRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpY3QsIE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTE9DQUxfREVCVUcgfSBmcm9tICdAZ2xpbW1lci9sb2NhbC1kZWJ1Zy1mbGFncyc7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2lnbiwgZGVwcmVjYXRlLCBpc1ByZXNlbnQgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgU291cmNlTG9jYXRpb24sIFNvdXJjZVBvc2l0aW9uLCBTWU5USEVUSUNfTE9DQVRJT04gfSBmcm9tICcuLi9zb3VyY2UvbG9jYXRpb24nO1xuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi4vc291cmNlL3NvdXJjZSc7XG5pbXBvcnQgeyBTb3VyY2VTcGFuIH0gZnJvbSAnLi4vc291cmNlL3NwYW4nO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgUGF0aEV4cHJlc3Npb25JbXBsVjEgfSBmcm9tICcuL2xlZ2FjeS1pbnRlcm9wJztcblxubGV0IF9TT1VSQ0U6IFNvdXJjZSB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gU09VUkNFKCk6IFNvdXJjZSB7XG4gIGlmICghX1NPVVJDRSkge1xuICAgIF9TT1VSQ0UgPSBuZXcgU291cmNlKCcnLCAnKHN5bnRoZXRpYyknKTtcbiAgfVxuXG4gIHJldHVybiBfU09VUkNFO1xufVxuXG4vLyBjb25zdCBTT1VSQ0UgPSBuZXcgU291cmNlKCcnLCAnKHRlc3RzKScpO1xuXG4vLyBTdGF0ZW1lbnRzXG5cbmV4cG9ydCB0eXBlIEJ1aWxkZXJIZWFkID0gc3RyaW5nIHwgQVNUdjEuRXhwcmVzc2lvbjtcbmV4cG9ydCB0eXBlIFRhZ0Rlc2NyaXB0b3IgPSBzdHJpbmcgfCB7IG5hbWU6IHN0cmluZzsgc2VsZkNsb3Npbmc6IGJvb2xlYW4gfTtcblxuZnVuY3Rpb24gYnVpbGRNdXN0YWNoZShcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5MaXRlcmFsLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICByYXc/OiBib29sZWFuLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvbixcbiAgc3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzXG4pOiBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXRoID0gYnVpbGRQYXRoKHBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTXVzdGFjaGVTdGF0ZW1lbnQnLFxuICAgIHBhdGgsXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGVzY2FwZWQ6ICFyYXcsXG4gICAgdHJ1c3Rpbmc6ICEhcmF3LFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIHN0cmlwOiBzdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCbG9jayhcbiAgcGF0aDogQnVpbGRlckhlYWQsXG4gIHBhcmFtczogT3B0aW9uPEFTVHYxLkV4cHJlc3Npb25bXT4sXG4gIGhhc2g6IE9wdGlvbjxBU1R2MS5IYXNoPixcbiAgX2RlZmF1bHRCbG9jazogQVNUdjEuUG9zc2libHlEZXByZWNhdGVkQmxvY2ssXG4gIF9lbHNlQmxvY2s/OiBPcHRpb248QVNUdjEuUG9zc2libHlEZXByZWNhdGVkQmxvY2s+LFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvbixcbiAgb3BlblN0cmlwPzogQVNUdjEuU3RyaXBGbGFncyxcbiAgaW52ZXJzZVN0cmlwPzogQVNUdjEuU3RyaXBGbGFncyxcbiAgY2xvc2VTdHJpcD86IEFTVHYxLlN0cmlwRmxhZ3Ncbik6IEFTVHYxLkJsb2NrU3RhdGVtZW50IHtcbiAgbGV0IGRlZmF1bHRCbG9jazogQVNUdjEuQmxvY2s7XG4gIGxldCBlbHNlQmxvY2s6IE9wdGlvbjxBU1R2MS5CbG9jaz4gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKF9kZWZhdWx0QmxvY2sudHlwZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgIGlmIChMT0NBTF9ERUJVRykge1xuICAgICAgZGVwcmVjYXRlKGBiLnByb2dyYW0gaXMgZGVwcmVjYXRlZC4gVXNlIGIuYmxvY2tJdHNlbGYgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBkZWZhdWx0QmxvY2sgPSAoYXNzaWduKHt9LCBfZGVmYXVsdEJsb2NrLCB7IHR5cGU6ICdCbG9jaycgfSkgYXMgdW5rbm93bikgYXMgQVNUdjEuQmxvY2s7XG4gIH0gZWxzZSB7XG4gICAgZGVmYXVsdEJsb2NrID0gX2RlZmF1bHRCbG9jaztcbiAgfVxuXG4gIGlmIChfZWxzZUJsb2NrICE9PSB1bmRlZmluZWQgJiYgX2Vsc2VCbG9jayAhPT0gbnVsbCAmJiBfZWxzZUJsb2NrLnR5cGUgPT09ICdUZW1wbGF0ZScpIHtcbiAgICBpZiAoTE9DQUxfREVCVUcpIHtcbiAgICAgIGRlcHJlY2F0ZShgYi5wcm9ncmFtIGlzIGRlcHJlY2F0ZWQuIFVzZSBiLmJsb2NrSXRzZWxmIGluc3RlYWQuYCk7XG4gICAgfVxuXG4gICAgZWxzZUJsb2NrID0gKGFzc2lnbih7fSwgX2Vsc2VCbG9jaywgeyB0eXBlOiAnQmxvY2snIH0pIGFzIHVua25vd24pIGFzIEFTVHYxLkJsb2NrO1xuICB9IGVsc2Uge1xuICAgIGVsc2VCbG9jayA9IF9lbHNlQmxvY2s7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCbG9ja1N0YXRlbWVudCcsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBwcm9ncmFtOiBkZWZhdWx0QmxvY2sgfHwgbnVsbCxcbiAgICBpbnZlcnNlOiBlbHNlQmxvY2sgfHwgbnVsbCxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICBvcGVuU3RyaXA6IG9wZW5TdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBpbnZlcnNlU3RyaXA6IGludmVyc2VTdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBjbG9zZVN0cmlwOiBjbG9zZVN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEVsZW1lbnRNb2RpZmllcihcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5FeHByZXNzaW9uLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICBsb2M/OiBPcHRpb248U291cmNlTG9jYXRpb24+XG4pOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdFbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQnLFxuICAgIHBhdGg6IGJ1aWxkUGF0aChwYXRoKSxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGFydGlhbChcbiAgbmFtZTogQVNUdjEuUGF0aEV4cHJlc3Npb24sXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGluZGVudD86IHN0cmluZyxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlBhcnRpYWxTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBpbmRlbnQ6IGluZGVudCB8fCAnJyxcbiAgICBzdHJpcDogeyBvcGVuOiBmYWxzZSwgY2xvc2U6IGZhbHNlIH0sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29tbWVudCh2YWx1ZTogc3RyaW5nLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkNvbW1lbnRTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTXVzdGFjaGVDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTXVzdGFjaGVDb21tZW50U3RhdGVtZW50JyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29uY2F0KFxuICBwYXJ0czogKEFTVHYxLlRleHROb2RlIHwgQVNUdjEuTXVzdGFjaGVTdGF0ZW1lbnQpW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5Db25jYXRTdGF0ZW1lbnQge1xuICBpZiAoIWlzUHJlc2VudChwYXJ0cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGIuY29uY2F0IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBwYXJ0YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdDb25jYXRTdGF0ZW1lbnQnLFxuICAgIHBhcnRzOiBwYXJ0cyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuLy8gTm9kZXNcblxuZXhwb3J0IHR5cGUgRWxlbWVudFBhcnRzID1cbiAgfCBbJ2F0dHJzJywgLi4uQXR0clNleHBbXV1cbiAgfCBbJ21vZGlmaWVycycsIC4uLk1vZGlmaWVyU2V4cFtdXVxuICB8IFsnYm9keScsIC4uLkFTVHYxLlN0YXRlbWVudFtdXVxuICB8IFsnY29tbWVudHMnLCAuLi5FbGVtZW50Q29tbWVudFtdXVxuICB8IFsnYXMnLCAuLi5zdHJpbmdbXV1cbiAgfCBbJ2xvYycsIFNvdXJjZUxvY2F0aW9uXTtcblxuZXhwb3J0IHR5cGUgUGF0aFNleHAgPSBzdHJpbmcgfCBbJ3BhdGgnLCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTW9kaWZpZXJTZXhwID1cbiAgfCBzdHJpbmdcbiAgfCBbUGF0aFNleHAsIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBMb2NTZXhwP11cbiAgfCBbUGF0aFNleHAsIEFTVHYxLkV4cHJlc3Npb25bXSwgRGljdDxBU1R2MS5FeHByZXNzaW9uPiwgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBBdHRyU2V4cCA9IFtzdHJpbmcsIEFTVHYxLkF0dHJOb2RlWyd2YWx1ZSddIHwgc3RyaW5nLCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIExvY1NleHAgPSBbJ2xvYycsIFNvdXJjZUxvY2F0aW9uXTtcblxuZXhwb3J0IHR5cGUgRWxlbWVudENvbW1lbnQgPSBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQgfCBTb3VyY2VMb2NhdGlvbiB8IHN0cmluZztcblxuZXhwb3J0IHR5cGUgU2V4cFZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBBU1R2MS5FeHByZXNzaW9uW11cbiAgfCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+XG4gIHwgTG9jU2V4cFxuICB8IFBhdGhTZXhwXG4gIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRWxlbWVudE9wdGlvbnMge1xuICBhdHRycz86IEFTVHYxLkF0dHJOb2RlW107XG4gIG1vZGlmaWVycz86IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudFtdO1xuICBjaGlsZHJlbj86IEFTVHYxLlN0YXRlbWVudFtdO1xuICBjb21tZW50cz86IEVsZW1lbnRDb21tZW50W107XG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW107XG4gIGxvYz86IFNvdXJjZVNwYW47XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRWxlbWVudCh0YWc6IFRhZ0Rlc2NyaXB0b3IsIG9wdGlvbnM6IEJ1aWxkRWxlbWVudE9wdGlvbnMgPSB7fSk6IEFTVHYxLkVsZW1lbnROb2RlIHtcbiAgbGV0IHsgYXR0cnMsIGJsb2NrUGFyYW1zLCBtb2RpZmllcnMsIGNvbW1lbnRzLCBjaGlsZHJlbiwgbG9jIH0gPSBvcHRpb25zO1xuXG4gIGxldCB0YWdOYW1lOiBzdHJpbmc7XG5cbiAgLy8gdGhpcyBpcyB1c2VkIGZvciBiYWNrd2FyZHMgY29tcGF0LCBwcmlvciB0byBgc2VsZkNsb3NpbmdgIGJlaW5nIHBhcnQgb2YgdGhlIEVsZW1lbnROb2RlIEFTVFxuICBsZXQgc2VsZkNsb3NpbmcgPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiB0YWcgPT09ICdvYmplY3QnKSB7XG4gICAgc2VsZkNsb3NpbmcgPSB0YWcuc2VsZkNsb3Npbmc7XG4gICAgdGFnTmFtZSA9IHRhZy5uYW1lO1xuICB9IGVsc2UgaWYgKHRhZy5zbGljZSgtMSkgPT09ICcvJykge1xuICAgIHRhZ05hbWUgPSB0YWcuc2xpY2UoMCwgLTEpO1xuICAgIHNlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0YWdOYW1lID0gdGFnO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnRWxlbWVudE5vZGUnLFxuICAgIHRhZzogdGFnTmFtZSxcbiAgICBzZWxmQ2xvc2luZzogc2VsZkNsb3NpbmcsXG4gICAgYXR0cmlidXRlczogYXR0cnMgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIG1vZGlmaWVyczogbW9kaWZpZXJzIHx8IFtdLFxuICAgIGNvbW1lbnRzOiAoY29tbWVudHMgYXMgQVNUdjEuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50W10pIHx8IFtdLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbiB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBdHRyKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBBU1R2MS5BdHRyTm9kZVsndmFsdWUnXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkF0dHJOb2RlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQXR0ck5vZGUnLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRleHQoY2hhcnM/OiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuVGV4dE5vZGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUZXh0Tm9kZScsXG4gICAgY2hhcnM6IGNoYXJzIHx8ICcnLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG4vLyBFeHByZXNzaW9uc1xuXG5mdW5jdGlvbiBidWlsZFNleHByKFxuICBwYXRoOiBCdWlsZGVySGVhZCxcbiAgcGFyYW1zPzogQVNUdjEuRXhwcmVzc2lvbltdLFxuICBoYXNoPzogQVNUdjEuSGFzaCxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlN1YkV4cHJlc3Npb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJyxcbiAgICBwYXRoOiBidWlsZFBhdGgocGF0aCksXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBoZWFkVG9TdHJpbmcoaGVhZDogQVNUdjEuUGF0aEhlYWQpOiB7IG9yaWdpbmFsOiBzdHJpbmc7IHBhcnRzOiBzdHJpbmdbXSB9IHtcbiAgc3dpdGNoIChoZWFkLnR5cGUpIHtcbiAgICBjYXNlICdBdEhlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGhlYWQubmFtZSwgcGFydHM6IFtoZWFkLm5hbWVdIH07XG4gICAgY2FzZSAnVGhpc0hlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGB0aGlzYCwgcGFydHM6IFtdIH07XG4gICAgY2FzZSAnVmFySGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogaGVhZC5uYW1lLCBwYXJ0czogW2hlYWQubmFtZV0gfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEhlYWQoXG4gIG9yaWdpbmFsOiBzdHJpbmcsXG4gIGxvYzogU291cmNlTG9jYXRpb25cbik6IHsgaGVhZDogQVNUdjEuUGF0aEhlYWQ7IHRhaWw6IHN0cmluZ1tdIH0ge1xuICBsZXQgW2hlYWQsIC4uLnRhaWxdID0gb3JpZ2luYWwuc3BsaXQoJy4nKTtcbiAgbGV0IGhlYWROb2RlOiBBU1R2MS5QYXRoSGVhZDtcblxuICBpZiAoaGVhZCA9PT0gJ3RoaXMnKSB7XG4gICAgaGVhZE5vZGUgPSB7XG4gICAgICB0eXBlOiAnVGhpc0hlYWQnLFxuICAgICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgfTtcbiAgfSBlbHNlIGlmIChoZWFkWzBdID09PSAnQCcpIHtcbiAgICBoZWFkTm9kZSA9IHtcbiAgICAgIHR5cGU6ICdBdEhlYWQnLFxuICAgICAgbmFtZTogaGVhZCxcbiAgICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaGVhZE5vZGUgPSB7XG4gICAgICB0eXBlOiAnVmFySGVhZCcsXG4gICAgICBuYW1lOiBoZWFkLFxuICAgICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaGVhZDogaGVhZE5vZGUsXG4gICAgdGFpbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUaGlzKGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RoaXNIZWFkJyxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBdE5hbWUobmFtZTogc3RyaW5nLCBsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICAvLyB0aGUgYEBgIHNob3VsZCBiZSBpbmNsdWRlZCBzbyB3ZSBoYXZlIGEgY29tcGxldGUgc291cmNlIHJhbmdlXG4gIGFzc2VydChuYW1lWzBdID09PSAnQCcsIGBjYWxsIGJ1aWxkZXJzLmF0KCkgd2l0aCBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICdAJ2ApO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0F0SGVhZCcsXG4gICAgbmFtZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWYXIobmFtZTogc3RyaW5nLCBsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICBhc3NlcnQobmFtZSAhPT0gJ3RoaXMnLCBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICd0aGlzJy4gQ2FsbCBidWlsZGVycy50aGlzIGluc3RlYWRgKTtcbiAgYXNzZXJ0KFxuICAgIG5hbWVbMF0gIT09ICdAJyxcbiAgICBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICcke25hbWV9Jy4gQ2FsbCBidWlsZGVycy5hdCgnJHtuYW1lfScpIGluc3RlYWRgXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVmFySGVhZCcsXG4gICAgbmFtZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIZWFkRnJvbVN0cmluZyhoZWFkOiBzdHJpbmcsIGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIGlmIChoZWFkWzBdID09PSAnQCcpIHtcbiAgICByZXR1cm4gYnVpbGRBdE5hbWUoaGVhZCwgbG9jKTtcbiAgfSBlbHNlIGlmIChoZWFkID09PSAndGhpcycpIHtcbiAgICByZXR1cm4gYnVpbGRUaGlzKGxvYyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1aWxkVmFyKGhlYWQsIGxvYyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGROYW1lZEJsb2NrTmFtZShuYW1lOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuTmFtZWRCbG9ja05hbWUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdOYW1lZEJsb2NrTmFtZScsXG4gICAgbmFtZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGVhblBhdGgoXG4gIGhlYWQ6IEFTVHYxLlBhdGhIZWFkLFxuICB0YWlsOiBzdHJpbmdbXSxcbiAgbG9jOiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGF0aEV4cHJlc3Npb24ge1xuICBsZXQgeyBvcmlnaW5hbDogb3JpZ2luYWxIZWFkLCBwYXJ0czogaGVhZFBhcnRzIH0gPSBoZWFkVG9TdHJpbmcoaGVhZCk7XG4gIGxldCBwYXJ0cyA9IFsuLi5oZWFkUGFydHMsIC4uLnRhaWxdO1xuICBsZXQgb3JpZ2luYWwgPSBbLi4ub3JpZ2luYWxIZWFkLCAuLi5wYXJ0c10uam9pbignLicpO1xuXG4gIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEob3JpZ2luYWwsIGhlYWQsIHRhaWwsIGJ1aWxkTG9jKGxvYyB8fCBudWxsKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGF0aChcbiAgcGF0aDogQVNUdjEuUGF0aEV4cHJlc3Npb24gfCBzdHJpbmcgfCB7IGhlYWQ6IHN0cmluZzsgdGFpbDogc3RyaW5nW10gfSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlBhdGhFeHByZXNzaW9uO1xuZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGg6IEFTVHYxLkV4cHJlc3Npb24sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIGJ1aWxkUGF0aChcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5FeHByZXNzaW9uIHwgeyBoZWFkOiBzdHJpbmc7IHRhaWw6IHN0cmluZ1tdIH0sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5FeHByZXNzaW9uIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgIGlmICgndHlwZScgaW4gcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IGhlYWQsIHRhaWwgfSA9IGJ1aWxkSGVhZChwYXRoLmhlYWQsIFNvdXJjZVNwYW4uYnJva2VuKCkpO1xuXG4gICAgICBhc3NlcnQoXG4gICAgICAgIHRhaWwubGVuZ3RoID09PSAwLFxuICAgICAgICBgYnVpbGRlci5wYXRoKHsgaGVhZCwgdGFpbCB9KSBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIGEgaGVhZCB3aXRoIGRvdHMgaW4gaXRgXG4gICAgICApO1xuXG4gICAgICBsZXQgeyBvcmlnaW5hbDogb3JpZ2luYWxIZWFkIH0gPSBoZWFkVG9TdHJpbmcoaGVhZCk7XG5cbiAgICAgIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEoXG4gICAgICAgIFtvcmlnaW5hbEhlYWQsIC4uLnRhaWxdLmpvaW4oJy4nKSxcbiAgICAgICAgaGVhZCxcbiAgICAgICAgdGFpbCxcbiAgICAgICAgYnVpbGRMb2MobG9jIHx8IG51bGwpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxldCB7IGhlYWQsIHRhaWwgfSA9IGJ1aWxkSGVhZChwYXRoLCBTb3VyY2VTcGFuLmJyb2tlbigpKTtcblxuICByZXR1cm4gbmV3IFBhdGhFeHByZXNzaW9uSW1wbFYxKHBhdGgsIGhlYWQsIHRhaWwsIGJ1aWxkTG9jKGxvYyB8fCBudWxsKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGl0ZXJhbDxUIGV4dGVuZHMgQVNUdjEuTGl0ZXJhbD4oXG4gIHR5cGU6IFRbJ3R5cGUnXSxcbiAgdmFsdWU6IFRbJ3ZhbHVlJ10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBUIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlLFxuICAgIHZhbHVlLFxuICAgIG9yaWdpbmFsOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfSBhcyBUO1xufVxuXG4vLyBNaXNjZWxsYW5lb3VzXG5cbmZ1bmN0aW9uIGJ1aWxkSGFzaChwYWlycz86IEFTVHYxLkhhc2hQYWlyW10sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuSGFzaCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0hhc2gnLFxuICAgIHBhaXJzOiBwYWlycyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYWlyKGtleTogc3RyaW5nLCB2YWx1ZTogQVNUdjEuRXhwcmVzc2lvbiwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5IYXNoUGFpciB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0hhc2hQYWlyJyxcbiAgICBrZXk6IGtleSxcbiAgICB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9ncmFtKFxuICBib2R5PzogQVNUdjEuU3RhdGVtZW50W10sXG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5UZW1wbGF0ZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RlbXBsYXRlJyxcbiAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCbG9ja0l0c2VsZihcbiAgYm9keT86IEFTVHYxLlN0YXRlbWVudFtdLFxuICBibG9ja1BhcmFtcz86IHN0cmluZ1tdLFxuICBjaGFpbmVkID0gZmFsc2UsXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5CbG9jayB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0Jsb2NrJyxcbiAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBjaGFpbmVkLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRlbXBsYXRlKFxuICBib2R5PzogQVNUdjEuU3RhdGVtZW50W10sXG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5UZW1wbGF0ZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RlbXBsYXRlJyxcbiAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQb3NpdGlvbihsaW5lOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyKTogU291cmNlUG9zaXRpb24ge1xuICByZXR1cm4ge1xuICAgIGxpbmUsXG4gICAgY29sdW1uLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZExvYyhsb2M6IE9wdGlvbjxTb3VyY2VMb2NhdGlvbj4pOiBTb3VyY2VTcGFuO1xuZnVuY3Rpb24gYnVpbGRMb2MoXG4gIHN0YXJ0TGluZTogbnVtYmVyLFxuICBzdGFydENvbHVtbjogbnVtYmVyLFxuICBlbmRMaW5lPzogbnVtYmVyLFxuICBlbmRDb2x1bW4/OiBudW1iZXIsXG4gIHNvdXJjZT86IHN0cmluZ1xuKTogU291cmNlU3BhbjtcblxuZnVuY3Rpb24gYnVpbGRMb2MoLi4uYXJnczogYW55W10pOiBTb3VyY2VTcGFuIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgbGV0IGxvYyA9IGFyZ3NbMF07XG5cbiAgICBpZiAobG9jICYmIHR5cGVvZiBsb2MgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2MoU09VUkNFKCksIGxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBTb3VyY2VTcGFuLmZvckhic0xvYyhTT1VSQ0UoKSwgU1lOVEhFVElDX0xPQ0FUSU9OKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IFtzdGFydExpbmUsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIF9zb3VyY2VdID0gYXJncztcbiAgICBsZXQgc291cmNlID0gX3NvdXJjZSA/IG5ldyBTb3VyY2UoJycsIF9zb3VyY2UpIDogU09VUkNFKCk7XG5cbiAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2Moc291cmNlLCB7XG4gICAgICBzdGFydDoge1xuICAgICAgICBsaW5lOiBzdGFydExpbmUsXG4gICAgICAgIGNvbHVtbjogc3RhcnRDb2x1bW4sXG4gICAgICB9LFxuICAgICAgZW5kOiB7XG4gICAgICAgIGxpbmU6IGVuZExpbmUsXG4gICAgICAgIGNvbHVtbjogZW5kQ29sdW1uLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG11c3RhY2hlOiBidWlsZE11c3RhY2hlLFxuICBibG9jazogYnVpbGRCbG9jayxcbiAgcGFydGlhbDogYnVpbGRQYXJ0aWFsLFxuICBjb21tZW50OiBidWlsZENvbW1lbnQsXG4gIG11c3RhY2hlQ29tbWVudDogYnVpbGRNdXN0YWNoZUNvbW1lbnQsXG4gIGVsZW1lbnQ6IGJ1aWxkRWxlbWVudCxcbiAgZWxlbWVudE1vZGlmaWVyOiBidWlsZEVsZW1lbnRNb2RpZmllcixcbiAgYXR0cjogYnVpbGRBdHRyLFxuICB0ZXh0OiBidWlsZFRleHQsXG4gIHNleHByOiBidWlsZFNleHByLFxuXG4gIGNvbmNhdDogYnVpbGRDb25jYXQsXG4gIGhhc2g6IGJ1aWxkSGFzaCxcbiAgcGFpcjogYnVpbGRQYWlyLFxuICBsaXRlcmFsOiBidWlsZExpdGVyYWwsXG4gIHByb2dyYW06IGJ1aWxkUHJvZ3JhbSxcbiAgYmxvY2tJdHNlbGY6IGJ1aWxkQmxvY2tJdHNlbGYsXG4gIHRlbXBsYXRlOiBidWlsZFRlbXBsYXRlLFxuICBsb2M6IGJ1aWxkTG9jLFxuICBwb3M6IGJ1aWxkUG9zaXRpb24sXG5cbiAgcGF0aDogYnVpbGRQYXRoLFxuXG4gIGZ1bGxQYXRoOiBidWlsZENsZWFuUGF0aCxcbiAgaGVhZDogYnVpbGRIZWFkRnJvbVN0cmluZyxcbiAgYXQ6IGJ1aWxkQXROYW1lLFxuICB2YXI6IGJ1aWxkVmFyLFxuICB0aGlzOiBidWlsZFRoaXMsXG4gIGJsb2NrTmFtZTogYnVpbGROYW1lZEJsb2NrTmFtZSxcblxuICBzdHJpbmc6IGxpdGVyYWwoJ1N0cmluZ0xpdGVyYWwnKSBhcyAodmFsdWU6IHN0cmluZykgPT4gQVNUdjEuU3RyaW5nTGl0ZXJhbCxcbiAgYm9vbGVhbjogbGl0ZXJhbCgnQm9vbGVhbkxpdGVyYWwnKSBhcyAodmFsdWU6IGJvb2xlYW4pID0+IEFTVHYxLkJvb2xlYW5MaXRlcmFsLFxuICBudW1iZXI6IGxpdGVyYWwoJ051bWJlckxpdGVyYWwnKSBhcyAodmFsdWU6IG51bWJlcikgPT4gQVNUdjEuTnVtYmVyTGl0ZXJhbCxcbiAgdW5kZWZpbmVkKCk6IEFTVHYxLlVuZGVmaW5lZExpdGVyYWwge1xuICAgIHJldHVybiBidWlsZExpdGVyYWwoJ1VuZGVmaW5lZExpdGVyYWwnLCB1bmRlZmluZWQpO1xuICB9LFxuICBudWxsKCk6IEFTVHYxLk51bGxMaXRlcmFsIHtcbiAgICByZXR1cm4gYnVpbGRMaXRlcmFsKCdOdWxsTGl0ZXJhbCcsIG51bGwpO1xuICB9LFxufTtcblxudHlwZSBCdWlsZExpdGVyYWw8VCBleHRlbmRzIEFTVHYxLkxpdGVyYWw+ID0gKHZhbHVlOiBUWyd2YWx1ZSddKSA9PiBUO1xuXG5mdW5jdGlvbiBsaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPih0eXBlOiBUWyd0eXBlJ10pOiBCdWlsZExpdGVyYWw8VD4ge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlOiBUWyd2YWx1ZSddLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IFQge1xuICAgIHJldHVybiBidWlsZExpdGVyYWwodHlwZSwgdmFsdWUsIGxvYyk7XG4gIH07XG59XG4iXSwic291cmNlUm9vdCI6IiJ9