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'; let _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, 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) { let defaultBlock; let 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) { let { attrs, blockParams, modifiers, comments, children, loc } = options; let tagName; // this is used for backwards compat, prior to `selfClosing` being part of the ElementNode AST let 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) { let [head, ...tail] = original.split('.'); let 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 }; } 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, 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, 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, loc: buildLoc(loc || null) }; } function buildCleanPath(head, tail, loc) { let { original: originalHead, parts: headParts } = headToString(head); let parts = [...headParts, ...tail]; let original = [...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 { let { head, tail } = buildHead(path.head, SourceSpan.broken()); (false && assert(tail.length === 0, `builder.path({ head, tail }) should not be called with a head with dots in it`)); let { original: originalHead } = headToString(head); return new PathExpressionImplV1([originalHead, ...tail].join('.'), head, tail, buildLoc(loc || null)); } } let { head, tail } = buildHead(path, SourceSpan.broken()); return new PathExpressionImplV1(path, head, tail, buildLoc(loc || null)); } function buildLiteral(type, value, loc) { return { type, 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, 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 = false, loc) { return { type: 'Block', body: body || [], blockParams: blockParams || [], 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, column }; } function buildLoc(...args) { if (args.length === 1) { let loc = args[0]; if (loc && typeof loc === 'object') { return SourceSpan.forHbsLoc(SOURCE(), loc); } else { return SourceSpan.forHbsLoc(SOURCE(), SYNTHETIC_LOCATION); } } else { let [startLine, startColumn, endLine, endColumn, _source] = args; let 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() { return buildLiteral('UndefinedLiteral', undefined); }, 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcHVibGljLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLFNBQVMsTUFBVCxFQUFpQixNQUFqQixFQUF5QixTQUF6QixFQUFvQyxTQUFwQyxRQUFxRCxlQUFyRDtBQUVBLFNBQXlDLGtCQUF6QyxRQUFtRSxvQkFBbkU7QUFDQSxTQUFTLE1BQVQsUUFBdUIsa0JBQXZCO0FBQ0EsU0FBUyxVQUFULFFBQTJCLGdCQUEzQjtBQUVBLFNBQVMsb0JBQVQsUUFBcUMsa0JBQXJDOztBQUVBLElBQUksT0FBSjs7QUFFQSxTQUFTLE1BQVQsR0FBZTtBQUNiLE1BQUksQ0FBQyxPQUFMLEVBQWM7QUFDWixJQUFBLE9BQU8sR0FBRyxJQUFJLE1BQUosQ0FBVyxFQUFYLEVBQWUsYUFBZixDQUFWO0FBQ0Q7O0FBRUQsU0FBTyxPQUFQO0FBQ0Q7O0FBU0QsU0FBUyxhQUFULENBQ0UsSUFERixFQUVFLE1BRkYsRUFHRSxJQUhGLEVBSUUsR0FKRixFQUtFLEdBTEYsRUFNRSxLQU5GLEVBTTBCO0FBRXhCLE1BQUksT0FBTyxJQUFQLEtBQWdCLFFBQXBCLEVBQThCO0FBQzVCLElBQUEsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFELENBQWhCO0FBQ0Q7O0FBRUQsU0FBTztBQUNMLElBQUEsSUFBSSxFQUFFLG1CQUREO0FBRUwsSUFBQSxJQUZLO0FBR0wsSUFBQSxNQUFNLEVBQUUsTUFBTSxJQUFJLEVBSGI7QUFJTCxJQUFBLElBQUksRUFBRSxJQUFJLElBQUksU0FBUyxDQUFDLEVBQUQsQ0FKbEI7QUFLTCxJQUFBLE9BQU8sRUFBRSxDQUFDLEdBTEw7QUFNTCxJQUFBLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FOUDtBQU9MLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksSUFBUixDQVBSO0FBUUwsSUFBQSxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQUUsTUFBQSxJ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RUFBRSxjQXhCRztBQXlCYixFQUFBLElBQUksRUFBRSxtQkF6Qk87QUEwQmIsRUFBQSxFQUFFLEVBQUUsV0ExQlM7QUEyQmIsRUFBQSxHQUFHLEVBQUUsUUEzQlE7QUE0QmIsRUFBQSxJQUFJLEVBQUUsU0E1Qk87QUE2QmIsRUFBQSxTQUFTLEVBQUUsbUJBN0JFO0FBK0JiLEVBQUEsTUFBTSxFQUFFLE9BQU8sQ0FBQyxlQUFELENBL0JGO0FBZ0NiLEVBQUEsT0FBTyxFQUFFLE9BQU8sQ0FBQyxnQkFBRCxDQWhDSDtBQWlDYixFQUFBLE1BQU0sRUFBRSxPQUFPLENBQUMsZUFBRCxDQWpDRjs7QUFrQ2IsRUFBQSxTQUFTLEdBQUE7QUFDUCxXQUFPLFlBQVksQ0FBQyxrQkFBRCxFQUFxQixTQUFyQixDQUFuQjtBQUNELEdBcENZOztBQXFDYixFQUFBLElBQUksR0FBQTtBQUNGLFdBQU8sWUFBWSxDQUFDLGFBQUQsRUFBZ0IsSUFBaEIsQ0FBbkI7QUFDRDs7QUF2Q1ksQ0FBZjs7QUE0Q0EsU0FBUyxPQUFULENBQTBDLElBQTFDLEVBQXlEO0FBQ3ZELFNBQU8sVUFBVSxLQUFWLEVBQTZCLEdBQTdCLEVBQWlEO0FBQ3RELFdBQU8sWUFBWSxDQUFDLElBQUQsRUFBTyxLQUFQLEVBQWMsR0FBZCxDQUFuQjtBQUNELEdBRkQ7QUFHRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpY3QsIE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTE9DQUxfREVCVUcgfSBmcm9tICdAZ2xpbW1lci9sb2NhbC1kZWJ1Zy1mbGFncyc7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2lnbiwgZGVwcmVjYXRlLCBpc1ByZXNlbnQgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgU291cmNlTG9jYXRpb24sIFNvdXJjZVBvc2l0aW9uLCBTWU5USEVUSUNfTE9DQVRJT04gfSBmcm9tICcuLi9zb3VyY2UvbG9jYXRpb24nO1xuaW1wb3J0IHsgU291cmNlIH0gZnJvbSAnLi4vc291cmNlL3NvdXJjZSc7XG5pbXBvcnQgeyBTb3VyY2VTcGFuIH0gZnJvbSAnLi4vc291cmNlL3NwYW4nO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgUGF0aEV4cHJlc3Npb25JbXBsVjEgfSBmcm9tICcuL2xlZ2FjeS1pbnRlcm9wJztcblxubGV0IF9TT1VSQ0U6IFNvdXJjZSB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gU09VUkNFKCk6IFNvdXJjZSB7XG4gIGlmICghX1NPVVJDRSkge1xuICAgIF9TT1VSQ0UgPSBuZXcgU291cmNlKCcnLCAnKHN5bnRoZXRpYyknKTtcbiAgfVxuXG4gIHJldHVybiBfU09VUkNFO1xufVxuXG4vLyBjb25zdCBTT1VSQ0UgPSBuZXcgU291cmNlKCcnLCAnKHRlc3RzKScpO1xuXG4vLyBTdGF0ZW1lbnRzXG5cbmV4cG9ydCB0eXBlIEJ1aWxkZXJIZWFkID0gc3RyaW5nIHwgQVNUdjEuRXhwcmVzc2lvbjtcbmV4cG9ydCB0eXBlIFRhZ0Rlc2NyaXB0b3IgPSBzdHJpbmcgfCB7IG5hbWU6IHN0cmluZzsgc2VsZkNsb3Npbmc6IGJvb2xlYW4gfTtcblxuZnVuY3Rpb24gYnVpbGRNdXN0YWNoZShcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5MaXRlcmFsLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICByYXc/OiBib29sZWFuLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvbixcbiAgc3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzXG4pOiBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXRoID0gYnVpbGRQYXRoKHBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTXVzdGFjaGVTdGF0ZW1lbnQnLFxuICAgIHBhdGgsXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGVzY2FwZWQ6ICFyYXcsXG4gICAgdHJ1c3Rpbmc6ICEhcmF3LFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIHN0cmlwOiBzdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCbG9jayhcbiAgcGF0aDogQnVpbGRlckhlYWQsXG4gIHBhcmFtczogT3B0aW9uPEFTVHYxLkV4cHJlc3Npb25bXT4sXG4gIGhhc2g6IE9wdGlvbjxBU1R2MS5IYXNoPixcbiAgX2RlZmF1bHRCbG9jazogQVNUdjEuUG9zc2libHlEZXByZWNhdGVkQmxvY2ssXG4gIF9lbHNlQmxvY2s/OiBPcHRpb248QVNUdjEuUG9zc2libHlEZXByZWNhdGVkQmxvY2s+LFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvbixcbiAgb3BlblN0cmlwPzogQVNUdjEuU3RyaXBGbGFncyxcbiAgaW52ZXJzZVN0cmlwPzogQVNUdjEuU3RyaXBGbGFncyxcbiAgY2xvc2VTdHJpcD86IEFTVHYxLlN0cmlwRmxhZ3Ncbik6IEFTVHYxLkJsb2NrU3RhdGVtZW50IHtcbiAgbGV0IGRlZmF1bHRCbG9jazogQVNUdjEuQmxvY2s7XG4gIGxldCBlbHNlQmxvY2s6IE9wdGlvbjxBU1R2MS5CbG9jaz4gfCB1bmRlZmluZWQ7XG5cbiAgaWYgKF9kZWZhdWx0QmxvY2sudHlwZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgIGlmIChMT0NBTF9ERUJVRykge1xuICAgICAgZGVwcmVjYXRlKGBiLnByb2dyYW0gaXMgZGVwcmVjYXRlZC4gVXNlIGIuYmxvY2tJdHNlbGYgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBkZWZhdWx0QmxvY2sgPSAoYXNzaWduKHt9LCBfZGVmYXVsdEJsb2NrLCB7IHR5cGU6ICdCbG9jaycgfSkgYXMgdW5rbm93bikgYXMgQVNUdjEuQmxvY2s7XG4gIH0gZWxzZSB7XG4gICAgZGVmYXVsdEJsb2NrID0gX2RlZmF1bHRCbG9jaztcbiAgfVxuXG4gIGlmIChfZWxzZUJsb2NrICE9PSB1bmRlZmluZWQgJiYgX2Vsc2VCbG9jayAhPT0gbnVsbCAmJiBfZWxzZUJsb2NrLnR5cGUgPT09ICdUZW1wbGF0ZScpIHtcbiAgICBpZiAoTE9DQUxfREVCVUcpIHtcbiAgICAgIGRlcHJlY2F0ZShgYi5wcm9ncmFtIGlzIGRlcHJlY2F0ZWQuIFVzZSBiLmJsb2NrSXRzZWxmIGluc3RlYWQuYCk7XG4gICAgfVxuXG4gICAgZWxzZUJsb2NrID0gKGFzc2lnbih7fSwgX2Vsc2VCbG9jaywgeyB0eXBlOiAnQmxvY2snIH0pIGFzIHVua25vd24pIGFzIEFTVHYxLkJsb2NrO1xuICB9IGVsc2Uge1xuICAgIGVsc2VCbG9jayA9IF9lbHNlQmxvY2s7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCbG9ja1N0YXRlbWVudCcsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBwcm9ncmFtOiBkZWZhdWx0QmxvY2sgfHwgbnVsbCxcbiAgICBpbnZlcnNlOiBlbHNlQmxvY2sgfHwgbnVsbCxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICBvcGVuU3RyaXA6IG9wZW5TdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBpbnZlcnNlU3RyaXA6IGludmVyc2VTdHJpcCB8fCB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBjbG9zZVN0cmlwOiBjbG9zZVN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEVsZW1lbnRNb2RpZmllcihcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5FeHByZXNzaW9uLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICBsb2M/OiBPcHRpb248U291cmNlTG9jYXRpb24+XG4pOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdFbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnQnLFxuICAgIHBhdGg6IGJ1aWxkUGF0aChwYXRoKSxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGFydGlhbChcbiAgbmFtZTogQVNUdjEuUGF0aEV4cHJlc3Npb24sXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGluZGVudD86IHN0cmluZyxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlBhcnRpYWxTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdQYXJ0aWFsU3RhdGVtZW50JyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBpbmRlbnQ6IGluZGVudCB8fCAnJyxcbiAgICBzdHJpcDogeyBvcGVuOiBmYWxzZSwgY2xvc2U6IGZhbHNlIH0sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29tbWVudCh2YWx1ZTogc3RyaW5nLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkNvbW1lbnRTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdDb21tZW50U3RhdGVtZW50JyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTXVzdGFjaGVDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTXVzdGFjaGVDb21tZW50U3RhdGVtZW50JyxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ29uY2F0KFxuICBwYXJ0czogKEFTVHYxLlRleHROb2RlIHwgQVNUdjEuTXVzdGFjaGVTdGF0ZW1lbnQpW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5Db25jYXRTdGF0ZW1lbnQge1xuICBpZiAoIWlzUHJlc2VudChwYXJ0cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGIuY29uY2F0IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBwYXJ0YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdDb25jYXRTdGF0ZW1lbnQnLFxuICAgIHBhcnRzOiBwYXJ0cyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuLy8gTm9kZXNcblxuZXhwb3J0IHR5cGUgRWxlbWVudFBhcnRzID1cbiAgfCBbJ2F0dHJzJywgLi4uQXR0clNleHBbXV1cbiAgfCBbJ21vZGlmaWVycycsIC4uLk1vZGlmaWVyU2V4cFtdXVxuICB8IFsnYm9keScsIC4uLkFTVHYxLlN0YXRlbWVudFtdXVxuICB8IFsnY29tbWVudHMnLCAuLi5FbGVtZW50Q29tbWVudFtdXVxuICB8IFsnYXMnLCAuLi5zdHJpbmdbXV1cbiAgfCBbJ2xvYycsIFNvdXJjZUxvY2F0aW9uXTtcblxuZXhwb3J0IHR5cGUgUGF0aFNleHAgPSBzdHJpbmcgfCBbJ3BhdGgnLCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTW9kaWZpZXJTZXhwID1cbiAgfCBzdHJpbmdcbiAgfCBbUGF0aFNleHAsIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBMb2NTZXhwP11cbiAgfCBbUGF0aFNleHAsIEFTVHYxLkV4cHJlc3Npb25bXSwgRGljdDxBU1R2MS5FeHByZXNzaW9uPiwgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBBdHRyU2V4cCA9IFtzdHJpbmcsIEFTVHYxLkF0dHJOb2RlWyd2YWx1ZSddIHwgc3RyaW5nLCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIExvY1NleHAgPSBbJ2xvYycsIFNvdXJjZUxvY2F0aW9uXTtcblxuZXhwb3J0IHR5cGUgRWxlbWVudENvbW1lbnQgPSBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQgfCBTb3VyY2VMb2NhdGlvbiB8IHN0cmluZztcblxuZXhwb3J0IHR5cGUgU2V4cFZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBBU1R2MS5FeHByZXNzaW9uW11cbiAgfCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+XG4gIHwgTG9jU2V4cFxuICB8IFBhdGhTZXhwXG4gIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRWxlbWVudE9wdGlvbnMge1xuICBhdHRycz86IEFTVHYxLkF0dHJOb2RlW107XG4gIG1vZGlmaWVycz86IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudFtdO1xuICBjaGlsZHJlbj86IEFTVHYxLlN0YXRlbWVudFtdO1xuICBjb21tZW50cz86IEVsZW1lbnRDb21tZW50W107XG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW107XG4gIGxvYz86IFNvdXJjZVNwYW47XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRWxlbWVudCh0YWc6IFRhZ0Rlc2NyaXB0b3IsIG9wdGlvbnM6IEJ1aWxkRWxlbWVudE9wdGlvbnMpOiBBU1R2MS5FbGVtZW50Tm9kZSB7XG4gIGxldCB7IGF0dHJzLCBibG9ja1BhcmFtcywgbW9kaWZpZXJzLCBjb21tZW50cywgY2hpbGRyZW4sIGxvYyB9ID0gb3B0aW9ucztcblxuICBsZXQgdGFnTmFtZTogc3RyaW5nO1xuXG4gIC8vIHRoaXMgaXMgdXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdCwgcHJpb3IgdG8gYHNlbGZDbG9zaW5nYCBiZWluZyBwYXJ0IG9mIHRoZSBFbGVtZW50Tm9kZSBBU1RcbiAgbGV0IHNlbGZDbG9zaW5nID0gZmFsc2U7XG4gIGlmICh0eXBlb2YgdGFnID09PSAnb2JqZWN0Jykge1xuICAgIHNlbGZDbG9zaW5nID0gdGFnLnNlbGZDbG9zaW5nO1xuICAgIHRhZ05hbWUgPSB0YWcubmFtZTtcbiAgfSBlbHNlIGlmICh0YWcuc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICB0YWdOYW1lID0gdGFnLnNsaWNlKDAsIC0xKTtcbiAgICBzZWxmQ2xvc2luZyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGFnTmFtZSA9IHRhZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0VsZW1lbnROb2RlJyxcbiAgICB0YWc6IHRhZ05hbWUsXG4gICAgc2VsZkNsb3Npbmc6IHNlbGZDbG9zaW5nLFxuICAgIGF0dHJpYnV0ZXM6IGF0dHJzIHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBtb2RpZmllcnM6IG1vZGlmaWVycyB8fCBbXSxcbiAgICBjb21tZW50czogKGNvbW1lbnRzIGFzIEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudFtdKSB8fCBbXSxcbiAgICBjaGlsZHJlbjogY2hpbGRyZW4gfHwgW10sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQXR0cihcbiAgbmFtZTogc3RyaW5nLFxuICB2YWx1ZTogQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5BdHRyTm9kZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0F0dHJOb2RlJyxcbiAgICBuYW1lOiBuYW1lLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZXh0KGNoYXJzPzogc3RyaW5nLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlRleHROb2RlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGV4dE5vZGUnLFxuICAgIGNoYXJzOiBjaGFycyB8fCAnJyxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuLy8gRXhwcmVzc2lvbnNcblxuZnVuY3Rpb24gYnVpbGRTZXhwcihcbiAgcGF0aDogQnVpbGRlckhlYWQsXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5TdWJFeHByZXNzaW9uIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnU3ViRXhwcmVzc2lvbicsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaGVhZFRvU3RyaW5nKGhlYWQ6IEFTVHYxLlBhdGhIZWFkKTogeyBvcmlnaW5hbDogc3RyaW5nOyBwYXJ0czogc3RyaW5nW10gfSB7XG4gIHN3aXRjaCAoaGVhZC50eXBlKSB7XG4gICAgY2FzZSAnQXRIZWFkJzpcbiAgICAgIHJldHVybiB7IG9yaWdpbmFsOiBoZWFkLm5hbWUsIHBhcnRzOiBbaGVhZC5uYW1lXSB9O1xuICAgIGNhc2UgJ1RoaXNIZWFkJzpcbiAgICAgIHJldHVybiB7IG9yaWdpbmFsOiBgdGhpc2AsIHBhcnRzOiBbXSB9O1xuICAgIGNhc2UgJ1ZhckhlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGhlYWQubmFtZSwgcGFydHM6IFtoZWFkLm5hbWVdIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRIZWFkKFxuICBvcmlnaW5hbDogc3RyaW5nLFxuICBsb2M6IFNvdXJjZUxvY2F0aW9uXG4pOiB7IGhlYWQ6IEFTVHYxLlBhdGhIZWFkOyB0YWlsOiBzdHJpbmdbXSB9IHtcbiAgbGV0IFtoZWFkLCAuLi50YWlsXSA9IG9yaWdpbmFsLnNwbGl0KCcuJyk7XG4gIGxldCBoZWFkTm9kZTogQVNUdjEuUGF0aEhlYWQ7XG5cbiAgaWYgKGhlYWQgPT09ICd0aGlzJykge1xuICAgIGhlYWROb2RlID0ge1xuICAgICAgdHlwZTogJ1RoaXNIZWFkJyxcbiAgICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoaGVhZFswXSA9PT0gJ0AnKSB7XG4gICAgaGVhZE5vZGUgPSB7XG4gICAgICB0eXBlOiAnQXRIZWFkJyxcbiAgICAgIG5hbWU6IGhlYWQsXG4gICAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGhlYWROb2RlID0ge1xuICAgICAgdHlwZTogJ1ZhckhlYWQnLFxuICAgICAgbmFtZTogaGVhZCxcbiAgICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGhlYWQ6IGhlYWROb2RlLFxuICAgIHRhaWwsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGhpcyhsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUaGlzSGVhZCcsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQXROYW1lKG5hbWU6IHN0cmluZywgbG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgLy8gdGhlIGBAYCBzaG91bGQgYmUgaW5jbHVkZWQgc28gd2UgaGF2ZSBhIGNvbXBsZXRlIHNvdXJjZSByYW5nZVxuICBhc3NlcnQobmFtZVswXSA9PT0gJ0AnLCBgY2FsbCBidWlsZGVycy5hdCgpIHdpdGggYSBzdHJpbmcgdGhhdCBzdGFydHMgd2l0aCAnQCdgKTtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdBdEhlYWQnLFxuICAgIG5hbWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVmFyKG5hbWU6IHN0cmluZywgbG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgYXNzZXJ0KG5hbWUgIT09ICd0aGlzJywgYFlvdSBjYWxsZWQgYnVpbGRlcnMudmFyKCkgd2l0aCAndGhpcycuIENhbGwgYnVpbGRlcnMudGhpcyBpbnN0ZWFkYCk7XG4gIGFzc2VydChcbiAgICBuYW1lWzBdICE9PSAnQCcsXG4gICAgYFlvdSBjYWxsZWQgYnVpbGRlcnMudmFyKCkgd2l0aCAnJHtuYW1lfScuIENhbGwgYnVpbGRlcnMuYXQoJyR7bmFtZX0nKSBpbnN0ZWFkYFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1ZhckhlYWQnLFxuICAgIG5hbWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGVhZEZyb21TdHJpbmcoaGVhZDogc3RyaW5nLCBsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICBpZiAoaGVhZFswXSA9PT0gJ0AnKSB7XG4gICAgcmV0dXJuIGJ1aWxkQXROYW1lKGhlYWQsIGxvYyk7XG4gIH0gZWxzZSBpZiAoaGVhZCA9PT0gJ3RoaXMnKSB7XG4gICAgcmV0dXJuIGJ1aWxkVGhpcyhsb2MpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBidWlsZFZhcihoZWFkLCBsb2MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTmFtZWRCbG9ja05hbWUobmFtZTogc3RyaW5nLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLk5hbWVkQmxvY2tOYW1lIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTmFtZWRCbG9ja05hbWUnLFxuICAgIG5hbWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2xlYW5QYXRoKFxuICBoZWFkOiBBU1R2MS5QYXRoSGVhZCxcbiAgdGFpbDogc3RyaW5nW10sXG4gIGxvYzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlBhdGhFeHByZXNzaW9uIHtcbiAgbGV0IHsgb3JpZ2luYWw6IG9yaWdpbmFsSGVhZCwgcGFydHM6IGhlYWRQYXJ0cyB9ID0gaGVhZFRvU3RyaW5nKGhlYWQpO1xuICBsZXQgcGFydHMgPSBbLi4uaGVhZFBhcnRzLCAuLi50YWlsXTtcbiAgbGV0IG9yaWdpbmFsID0gWy4uLm9yaWdpbmFsSGVhZCwgLi4ucGFydHNdLmpvaW4oJy4nKTtcblxuICByZXR1cm4gbmV3IFBhdGhFeHByZXNzaW9uSW1wbFYxKG9yaWdpbmFsLCBoZWFkLCB0YWlsLCBidWlsZExvYyhsb2MgfHwgbnVsbCkpO1xufVxuXG5mdW5jdGlvbiBidWlsZFBhdGgoXG4gIHBhdGg6IEFTVHYxLlBhdGhFeHByZXNzaW9uIHwgc3RyaW5nIHwgeyBoZWFkOiBzdHJpbmc7IHRhaWw6IHN0cmluZ1tdIH0sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5QYXRoRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoOiBBU1R2MS5FeHByZXNzaW9uLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkV4cHJlc3Npb247XG5mdW5jdGlvbiBidWlsZFBhdGgocGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5FeHByZXNzaW9uLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkV4cHJlc3Npb247XG5mdW5jdGlvbiBidWlsZFBhdGgoXG4gIHBhdGg6IEJ1aWxkZXJIZWFkIHwgQVNUdjEuRXhwcmVzc2lvbiB8IHsgaGVhZDogc3RyaW5nOyB0YWlsOiBzdHJpbmdbXSB9LFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuRXhwcmVzc2lvbiB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICBpZiAoJ3R5cGUnIGluIHBhdGgpIHtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgeyBoZWFkLCB0YWlsIH0gPSBidWlsZEhlYWQocGF0aC5oZWFkLCBTb3VyY2VTcGFuLmJyb2tlbigpKTtcblxuICAgICAgYXNzZXJ0KFxuICAgICAgICB0YWlsLmxlbmd0aCA9PT0gMCxcbiAgICAgICAgYGJ1aWxkZXIucGF0aCh7IGhlYWQsIHRhaWwgfSkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCBhIGhlYWQgd2l0aCBkb3RzIGluIGl0YFxuICAgICAgKTtcblxuICAgICAgbGV0IHsgb3JpZ2luYWw6IG9yaWdpbmFsSGVhZCB9ID0gaGVhZFRvU3RyaW5nKGhlYWQpO1xuXG4gICAgICByZXR1cm4gbmV3IFBhdGhFeHByZXNzaW9uSW1wbFYxKFxuICAgICAgICBbb3JpZ2luYWxIZWFkLCAuLi50YWlsXS5qb2luKCcuJyksXG4gICAgICAgIGhlYWQsXG4gICAgICAgIHRhaWwsXG4gICAgICAgIGJ1aWxkTG9jKGxvYyB8fCBudWxsKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBsZXQgeyBoZWFkLCB0YWlsIH0gPSBidWlsZEhlYWQocGF0aCwgU291cmNlU3Bhbi5icm9rZW4oKSk7XG5cbiAgcmV0dXJuIG5ldyBQYXRoRXhwcmVzc2lvbkltcGxWMShwYXRoLCBoZWFkLCB0YWlsLCBidWlsZExvYyhsb2MgfHwgbnVsbCkpO1xufVxuXG5mdW5jdGlvbiBidWlsZExpdGVyYWw8VCBleHRlbmRzIEFTVHYxLkxpdGVyYWw+KFxuICB0eXBlOiBUWyd0eXBlJ10sXG4gIHZhbHVlOiBUWyd2YWx1ZSddLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogVCB7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICB2YWx1ZSxcbiAgICBvcmlnaW5hbDogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH0gYXMgVDtcbn1cblxuLy8gTWlzY2VsbGFuZW91c1xuXG5mdW5jdGlvbiBidWlsZEhhc2gocGFpcnM/OiBBU1R2MS5IYXNoUGFpcltdLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkhhc2gge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdIYXNoJyxcbiAgICBwYWlyczogcGFpcnMgfHwgW10sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGFpcihrZXk6IHN0cmluZywgdmFsdWU6IEFTVHYxLkV4cHJlc3Npb24sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuSGFzaFBhaXIge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdIYXNoUGFpcicsXG4gICAga2V5OiBrZXksXG4gICAgdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJvZ3JhbShcbiAgYm9keT86IEFTVHYxLlN0YXRlbWVudFtdLFxuICBibG9ja1BhcmFtcz86IHN0cmluZ1tdLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuVGVtcGxhdGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUZW1wbGF0ZScsXG4gICAgYm9keTogYm9keSB8fCBbXSxcbiAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMgfHwgW10sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQmxvY2tJdHNlbGYoXG4gIGJvZHk/OiBBU1R2MS5TdGF0ZW1lbnRbXSxcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXSxcbiAgY2hhaW5lZCA9IGZhbHNlLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuQmxvY2sge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCbG9jaycsXG4gICAgYm9keTogYm9keSB8fCBbXSxcbiAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMgfHwgW10sXG4gICAgY2hhaW5lZCxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZW1wbGF0ZShcbiAgYm9keT86IEFTVHYxLlN0YXRlbWVudFtdLFxuICBibG9ja1BhcmFtcz86IHN0cmluZ1tdLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuVGVtcGxhdGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUZW1wbGF0ZScsXG4gICAgYm9keTogYm9keSB8fCBbXSxcbiAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMgfHwgW10sXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUG9zaXRpb24obGluZTogbnVtYmVyLCBjb2x1bW46IG51bWJlcik6IFNvdXJjZVBvc2l0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICBsaW5lLFxuICAgIGNvbHVtbixcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMb2MobG9jOiBPcHRpb248U291cmNlTG9jYXRpb24+KTogU291cmNlU3BhbjtcbmZ1bmN0aW9uIGJ1aWxkTG9jKFxuICBzdGFydExpbmU6IG51bWJlcixcbiAgc3RhcnRDb2x1bW46IG51bWJlcixcbiAgZW5kTGluZT86IG51bWJlcixcbiAgZW5kQ29sdW1uPzogbnVtYmVyLFxuICBzb3VyY2U/OiBzdHJpbmdcbik6IFNvdXJjZVNwYW47XG5cbmZ1bmN0aW9uIGJ1aWxkTG9jKC4uLmFyZ3M6IGFueVtdKTogU291cmNlU3BhbiB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIGxldCBsb2MgPSBhcmdzWzBdO1xuXG4gICAgaWYgKGxvYyAmJiB0eXBlb2YgbG9jID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFNvdXJjZVNwYW4uZm9ySGJzTG9jKFNPVVJDRSgpLCBsb2MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2MoU09VUkNFKCksIFNZTlRIRVRJQ19MT0NBVElPTik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBbc3RhcnRMaW5lLCBzdGFydENvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uLCBfc291cmNlXSA9IGFyZ3M7XG4gICAgbGV0IHNvdXJjZSA9IF9zb3VyY2UgPyBuZXcgU291cmNlKCcnLCBfc291cmNlKSA6IFNPVVJDRSgpO1xuXG4gICAgcmV0dXJuIFNvdXJjZVNwYW4uZm9ySGJzTG9jKHNvdXJjZSwge1xuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgbGluZTogc3RhcnRMaW5lLFxuICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uLFxuICAgICAgfSxcbiAgICAgIGVuZDoge1xuICAgICAgICBsaW5lOiBlbmRMaW5lLFxuICAgICAgICBjb2x1bW46IGVuZENvbHVtbixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBtdXN0YWNoZTogYnVpbGRNdXN0YWNoZSxcbiAgYmxvY2s6IGJ1aWxkQmxvY2ssXG4gIHBhcnRpYWw6IGJ1aWxkUGFydGlhbCxcbiAgY29tbWVudDogYnVpbGRDb21tZW50LFxuICBtdXN0YWNoZUNvbW1lbnQ6IGJ1aWxkTXVzdGFjaGVDb21tZW50LFxuICBlbGVtZW50OiBidWlsZEVsZW1lbnQsXG4gIGVsZW1lbnRNb2RpZmllcjogYnVpbGRFbGVtZW50TW9kaWZpZXIsXG4gIGF0dHI6IGJ1aWxkQXR0cixcbiAgdGV4dDogYnVpbGRUZXh0LFxuICBzZXhwcjogYnVpbGRTZXhwcixcblxuICBjb25jYXQ6IGJ1aWxkQ29uY2F0LFxuICBoYXNoOiBidWlsZEhhc2gsXG4gIHBhaXI6IGJ1aWxkUGFpcixcbiAgbGl0ZXJhbDogYnVpbGRMaXRlcmFsLFxuICBwcm9ncmFtOiBidWlsZFByb2dyYW0sXG4gIGJsb2NrSXRzZWxmOiBidWlsZEJsb2NrSXRzZWxmLFxuICB0ZW1wbGF0ZTogYnVpbGRUZW1wbGF0ZSxcbiAgbG9jOiBidWlsZExvYyxcbiAgcG9zOiBidWlsZFBvc2l0aW9uLFxuXG4gIHBhdGg6IGJ1aWxkUGF0aCxcblxuICBmdWxsUGF0aDogYnVpbGRDbGVhblBhdGgsXG4gIGhlYWQ6IGJ1aWxkSGVhZEZyb21TdHJpbmcsXG4gIGF0OiBidWlsZEF0TmFtZSxcbiAgdmFyOiBidWlsZFZhcixcbiAgdGhpczogYnVpbGRUaGlzLFxuICBibG9ja05hbWU6IGJ1aWxkTmFtZWRCbG9ja05hbWUsXG5cbiAgc3RyaW5nOiBsaXRlcmFsKCdTdHJpbmdMaXRlcmFsJykgYXMgKHZhbHVlOiBzdHJpbmcpID0+IEFTVHYxLlN0cmluZ0xpdGVyYWwsXG4gIGJvb2xlYW46IGxpdGVyYWwoJ0Jvb2xlYW5MaXRlcmFsJykgYXMgKHZhbHVlOiBib29sZWFuKSA9PiBBU1R2MS5Cb29sZWFuTGl0ZXJhbCxcbiAgbnVtYmVyOiBsaXRlcmFsKCdOdW1iZXJMaXRlcmFsJykgYXMgKHZhbHVlOiBudW1iZXIpID0+IEFTVHYxLk51bWJlckxpdGVyYWwsXG4gIHVuZGVmaW5lZCgpOiBBU1R2MS5VbmRlZmluZWRMaXRlcmFsIHtcbiAgICByZXR1cm4gYnVpbGRMaXRlcmFsKCdVbmRlZmluZWRMaXRlcmFsJywgdW5kZWZpbmVkKTtcbiAgfSxcbiAgbnVsbCgpOiBBU1R2MS5OdWxsTGl0ZXJhbCB7XG4gICAgcmV0dXJuIGJ1aWxkTGl0ZXJhbCgnTnVsbExpdGVyYWwnLCBudWxsKTtcbiAgfSxcbn07XG5cbnR5cGUgQnVpbGRMaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPiA9ICh2YWx1ZTogVFsndmFsdWUnXSkgPT4gVDtcblxuZnVuY3Rpb24gbGl0ZXJhbDxUIGV4dGVuZHMgQVNUdjEuTGl0ZXJhbD4odHlwZTogVFsndHlwZSddKTogQnVpbGRMaXRlcmFsPFQ+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZTogVFsndmFsdWUnXSwgbG9jPzogU291cmNlTG9jYXRpb24pOiBUIHtcbiAgICByZXR1cm4gYnVpbGRMaXRlcmFsKHR5cGUsIHZhbHVlLCBsb2MpO1xuICB9O1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==