UNPKG

@glimmer/syntax

Version:
510 lines (442 loc) 47.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _util = require("@glimmer/util"); var _location = require("../source/location"); var _source2 = require("../source/source"); var _span = require("../source/span"); var _legacyInterop = require("./legacy-interop"); var _SOURCE; function SOURCE() { if (!_SOURCE) { _SOURCE = new _source2.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 && (0, _util.deprecate)("b.program is deprecated. Use b.blockItself instead."); } defaultBlock = (0, _util.assign)({}, _defaultBlock, { type: 'Block' }); } else { defaultBlock = _defaultBlock; } if (_elseBlock !== undefined && _elseBlock !== null && _elseBlock.type === 'Template') { if (false /* LOCAL_DEBUG */ ) { false && !false && (0, _util.deprecate)("b.program is deprecated. Use b.blockItself instead."); } elseBlock = (0, _util.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 (!(0, _util.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 && (0, _util.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 && (0, _util.assert)(name !== 'this', "You called builders.var() with 'this'. Call builders.this instead"); false && (0, _util.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 _legacyInterop.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, _span.SourceSpan.broken()), _head = _buildHead.head, _tail = _buildHead.tail; false && (0, _util.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 _legacyInterop.PathExpressionImplV1([originalHead].concat(_tail).join('.'), _head, _tail, buildLoc(loc || null)); } } var _buildHead2 = buildHead(path, _span.SourceSpan.broken()), head = _buildHead2.head, tail = _buildHead2.tail; return new _legacyInterop.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 _span.SourceSpan.forHbsLoc(SOURCE(), loc); } else { return _span.SourceSpan.forHbsLoc(SOURCE(), _location.SYNTHETIC_LOCATION); } } else { var startLine = args[0], startColumn = args[1], endLine = args[2], endColumn = args[3], _source = args[4]; var source = _source ? new _source2.Source('', _source) : SOURCE(); return _span.SourceSpan.forHbsLoc(source, { start: { line: startLine, column: startColumn }, end: { line: endLine, column: endColumn } }); } } var _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); } }; exports.default = _default; function literal(type) { return function (value, loc) { return buildLiteral(type, value, loc); }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcHVibGljLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQSxJQUFBLE9BQUE7O0FBRUEsU0FBQSxNQUFBLEdBQWU7QUFDYixNQUFJLENBQUosT0FBQSxFQUFjO0FBQ1osSUFBQSxPQUFPLEdBQUcsSUFBQSxlQUFBLENBQUEsRUFBQSxFQUFWLGFBQVUsQ0FBVjtBQUNEOztBQUVELFNBQUEsT0FBQTtBQUNEOztBQVNELFNBQUEsYUFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsSUFBQSxFQUFBLEdBQUEsRUFBQSxHQUFBLEVBQUEsS0FBQSxFQU0wQjtBQUV4QixNQUFJLE9BQUEsSUFBQSxLQUFKLFFBQUEsRUFBOEI7QUFDNUIsSUFBQSxJQUFJLEdBQUcsU0FBUyxDQUFoQixJQUFnQixDQUFoQjtBQUNEOztBQUVELFNBQU87QUFDTCxJQUFBLElBQUksRUFEQyxtQkFBQTtBQUVMLElBQUEsSUFGSyxFQUFBLElBQUE7QUFHTCxJQUFBLE1BQU0sRUFBRSxNQUFNLElBSFQsRUFBQTtBQUlMLElBQUEsSUFBSSxFQUFFLElBQUksSUFBSSxTQUFTLENBSmxCLEVBSWtCLENBSmxCO0FBS0wsSUFBQSxPQUFPLEVBQUUsQ0FMSixHQUFBO0FBTUwsSUFBQSxRQUFRLEVBQUUsQ0FBQyxDQU5OLEdBQUE7QUFPTCxJQUFBLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxJQVBaLElBT1EsQ0FQUjtBQVFMLElBQUEsS0FBSyxFQUFFLEtBQUssSUFBSTtBQUFFLE1BQUEsSUFBSSxFQUFOLEtBQUE7QUFBZSxNQUFBLEtBQUssRUFBRTtBQUF0QjtBQVJYLEdBQVA7QUFVRDs7QUFFRCxTQUFBLFVBQUEsQ0FBQSxJQUFBLEVBQUEsTUFBQSxFQUFBLElBQUEsRUFBQSxhQUFBLEVBQUEsVUFBQSxFQUFBLEdBQUEsRUFBQSxTQUFBLEVBQUEsWUFBQSxFQUFBLFVBQUEsRUFTK0I7QUFFN0IsTUFBQSxZQUFBO0FBQ0EsTUFBQSxTQUFBOztBQUVBLE1BQUksYUFBYSxDQUFiLElBQUEsS0FBSixVQUFBLEVBQXVDO0FBQ3JDLFFBQUE7QUFBQTtBQUFBLE1BQWlCO0FBQUEsaUJBQUEsQ0FBQSxLQUFBLElBQUEscUJBQUEscURBQUEsQ0FBQTtBQUVoQjs7QUFFRCxJQUFBLFlBQVksR0FBSSxrQkFBTSxFQUFOLEVBQU0sYUFBTixFQUEwQjtBQUFFLE1BQUEsSUFBSSxFQUFFO0FBQVIsS0FBMUIsQ0FBaEI7QUFMRixHQUFBLE1BTU87QUFDTCxJQUFBLFlBQVksR0FBWixhQUFBO0FBQ0Q7O0FBRUQsTUFBSSxVQUFVLEtBQVYsU0FBQSxJQUE0QixVQUFVLEtBQXRDLElBQUEsSUFBbUQsVUFBVSxDQUFWLElBQUEsS0FBdkQsVUFBQSxFQUF1RjtBQUNyRixRQUFBO0FBQUE7QUFBQSxNQUFpQjtBQUFBLGlCQUFBLENBQUEsS0FBQSxJQUFBLHFCQUFBLHFEQUFBLENBQUE7QUFFaEI7O0FBRUQsSUFBQSxTQUFTLEdBQUksa0JBQU0sRUFBTixFQUFNLFVBQU4sRUFBdUI7QUFBRSxNQUFBLElBQUksRUFBRTtBQUFSLEtBQXZCLENBQWI7QUFMRixHQUFBLE1BTU87QUFDTCxJQUFBLFNBQVMsR0FBVCxVQUFBO0FBQ0Q7O0FBRUQsU0FBTztBQUNMLElBQUEsSUFBSSxFQURDLGdCQUFBO0FBRUwsSUFBQSxJQUFJLEVBQUUsU0FBUyxDQUZWLElBRVUsQ0FGVjtBQUdMLElBQUEsTUFBTSxFQUFFLE1BQU0sSUFIVCxFQUFBO0FBSUwsSUFBQSxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FKbEIsRUFJa0IsQ0FKbEI7QUFLTCxJQUFBLE9BQU8sRUFBRSxZQUFZLElBTGhCLElBQUE7QUFNTCxJQUFBLE9BQU8sRUFBRSxTQUFTLElBTmIsSUFBQTtBQU9MLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBUFosSUFPUSxDQVBSO0FBUUwsSUFBQSxTQUFTLEVBQUUsU0FBUyxJQUFJO0FBQUUsTUFBQSxJQUFJLEVBQU4sS0FBQTtBQUFlLE1BQUEsS0FBSyxFQUFFO0FBQXRCLEtBUm5CO0FBU0wsSUFBQSxZQUFZLEVBQUUsWUFBWSxJQUFJO0FBQUUsTUFBQSxJQUFJLEVBQU4sS0FBQTtBQUFlLE1BQUEsS0FBSyxFQUFFO0FBQXRCLEtBVHpCO0FBVUwsSUFBQSxVQUFVLEVBQUUsVUFBVSxJQUFJO0FBQUUsTUFBQSxJQUFJLEVBQU4sS0FBQTtBQUFlLE1BQUEsS0FBSyxFQUFFO0FBQXRCO0FBVnJCLEdBQVA7QUFZRDs7QUFFRCxTQUFBLG9CQUFBLENBQUEsSUFBQSxFQUFBLE1BQUEsRUFBQSxJQUFBLEVBQUEsR0FBQSxFQUk4QjtBQUU1QixTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsMEJBQUE7QUFFTCxJQUFBLElBQUksRUFBRSxTQUFTLENBRlYsSUFFVSxDQUZWO0FBR0wsSUFBQSxNQUFNLEVBQUUsTUFBTSxJQUhULEVBQUE7QUFJTCxJQUFBLElBQUksRUFBRSxJQUFJLElBQUksU0FBUyxDQUpsQixFQUlrQixDQUpsQjtBQUtMLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUosSUFBQTtBQUxSLEdBQVA7QUFPRDs7QUFFRCxTQUFBLFlBQUEsQ0FBQSxJQUFBLEVBQUEsTUFBQSxFQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsR0FBQSxFQUtzQjtBQUVwQixTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsa0JBQUE7QUFFTCxJQUFBLElBQUksRUFGQyxJQUFBO0FBR0wsSUFBQSxNQUFNLEVBQUUsTUFBTSxJQUhULEVBQUE7QUFJTCxJQUFBLElBQUksRUFBRSxJQUFJLElBQUksU0FBUyxDQUpsQixFQUlrQixDQUpsQjtBQUtMLElBQUEsTUFBTSxFQUFFLE1BQU0sSUFMVCxFQUFBO0FBTUwsSUFBQSxLQUFLLEVBQUU7QUFBRSxNQUFBLElBQUksRUFBTixLQUFBO0FBQWUsTUFBQSxLQUFLLEVBQUU7QUFBdEIsS0FORjtBQU9MLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUosSUFBQTtBQVBSLEdBQVA7QUFTRDs7QUFFRCxTQUFBLFlBQUEsQ0FBQSxLQUFBLEVBQUEsR0FBQSxFQUF5RDtBQUN2RCxTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsa0JBQUE7QUFFTCxJQUFBLEtBQUssRUFGQSxLQUFBO0FBR0wsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSFIsR0FBUDtBQUtEOztBQUVELFNBQUEsb0JBQUEsQ0FBQSxLQUFBLEVBQUEsR0FBQSxFQUFpRTtBQUMvRCxTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsMEJBQUE7QUFFTCxJQUFBLEtBQUssRUFGQSxLQUFBO0FBR0wsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSFIsR0FBUDtBQUtEOztBQUVELFNBQUEsV0FBQSxDQUFBLEtBQUEsRUFBQSxHQUFBLEVBRXNCO0FBRXBCLE1BQUksQ0FBQyxxQkFBTCxLQUFLLENBQUwsRUFBdUI7QUFDckIsVUFBTSxJQUFOLEtBQU0sQ0FBTixxQ0FBTSxDQUFOO0FBQ0Q7O0FBRUQsU0FBTztBQUNMLElBQUEsSUFBSSxFQURDLGlCQUFBO0FBRUwsSUFBQSxLQUFLLEVBQUUsS0FBSyxJQUZQLEVBQUE7QUFHTCxJQUFBLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFKLElBQUE7QUFIUixHQUFQO0FBS0Q7O0FBMkNELFNBQUEsWUFBQSxDQUFBLEdBQUEsRUFBQSxPQUFBLEVBQTJFO0FBQUEsTUFBakMsT0FBaUMsS0FBQSxLQUFBLENBQUEsRUFBQTtBQUFqQyxJQUFBLE9BQWlDLEdBQTNFLEVBQTBDO0FBQWlDOztBQUFBLE1BQUEsUUFBQSxHQUFBLE9BQUE7QUFBQSxNQUNyRSxLQURxRSxHQUFBLFFBQUEsQ0FBQSxLQUFBO0FBQUEsTUFDckUsV0FEcUUsR0FBQSxRQUFBLENBQUEsV0FBQTtBQUFBLE1BQ3JFLFNBRHFFLEdBQUEsUUFBQSxDQUFBLFNBQUE7QUFBQSxNQUNyRSxRQURxRSxHQUFBLFFBQUEsQ0FBQSxRQUFBO0FBQUEsTUFDckUsUUFEcUUsR0FBQSxRQUFBLENBQUEsUUFBQTtBQUFBLE1BQ2hCLEdBRGdCLEdBQUEsUUFBQSxDQUFBLEdBQUE7QUFHekUsTUFIeUUsT0FHekUsQ0FIeUUsQ0FLekU7O0FBQ0EsTUFBSSxXQUFXLEdBQWYsS0FBQTs7QUFDQSxNQUFJLE9BQUEsR0FBQSxLQUFKLFFBQUEsRUFBNkI7QUFDM0IsSUFBQSxXQUFXLEdBQUcsR0FBRyxDQUFqQixXQUFBO0FBQ0EsSUFBQSxPQUFPLEdBQUcsR0FBRyxDQUFiLElBQUE7QUFGRixHQUFBLE1BR08sSUFBSSxHQUFHLENBQUgsS0FBQSxDQUFVLENBQVYsQ0FBQSxNQUFKLEdBQUEsRUFBMkI7QUFDaEMsSUFBQSxPQUFPLEdBQUcsR0FBRyxDQUFILEtBQUEsQ0FBQSxDQUFBLEVBQWEsQ0FBdkIsQ0FBVSxDQUFWO0FBQ0EsSUFBQSxXQUFXLEdBQVgsSUFBQTtBQUZLLEdBQUEsTUFHQTtBQUNMLElBQUEsT0FBTyxHQUFQLEdBQUE7QUFDRDs7QUFFRCxTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsYUFBQTtBQUVMLElBQUEsR0FBRyxFQUZFLE9BQUE7QUFHTCxJQUFBLFdBQVcsRUFITixXQUFBO0FBSUwsSUFBQSxVQUFVLEVBQUUsS0FBSyxJQUpaLEVBQUE7QUFLTCxJQUFBLFdBQVcsRUFBRSxXQUFXLElBTG5CLEVBQUE7QUFNTCxJQUFBLFNBQVMsRUFBRSxTQUFTLElBTmYsRUFBQTtBQU9MLElBQUEsUUFBUSxFQUFHLFFBQTZDLElBUG5ELEVBQUE7QUFRTCxJQUFBLFFBQVEsRUFBRSxRQUFRLElBUmIsRUFBQTtBQVNMLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUosSUFBQTtBQVRSLEdBQVA7QUFXRDs7QUFFRCxTQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQUEsS0FBQSxFQUFBLEdBQUEsRUFHc0I7QUFFcEIsU0FBTztBQUNMLElBQUEsSUFBSSxFQURDLFVBQUE7QUFFTCxJQUFBLElBQUksRUFGQyxJQUFBO0FBR0wsSUFBQSxLQUFLLEVBSEEsS0FBQTtBQUlMLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUosSUFBQTtBQUpSLEdBQVA7QUFNRDs7QUFFRCxTQUFBLFNBQUEsQ0FBQSxLQUFBLEVBQUEsR0FBQSxFQUF1RDtBQUNyRCxTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsVUFBQTtBQUVMLElBQUEsS0FBSyxFQUFFLEtBQUssSUFGUCxFQUFBO0FBR0wsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSFIsR0FBUDtFQU9GOzs7QUFFQSxTQUFBLFVBQUEsQ0FBQSxJQUFBLEVBQUEsTUFBQSxFQUFBLElBQUEsRUFBQSxHQUFBLEVBSXNCO0FBRXBCLFNBQU87QUFDTCxJQUFBLElBQUksRUFEQyxlQUFBO0FBRUwsSUFBQSxJQUFJLEVBQUUsU0FBUyxDQUZWLElBRVUsQ0FGVjtBQUdMLElBQUEsTUFBTSxFQUFFLE1BQU0sSUFIVCxFQUFBO0FBSUwsSUFBQSxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FKbEIsRUFJa0IsQ0FKbEI7QUFLTCxJQUFBLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFKLElBQUE7QUFMUixHQUFQO0FBT0Q7O0FBRUQsU0FBQSxZQUFBLENBQUEsSUFBQSxFQUEwQztBQUN4QyxVQUFRLElBQUksQ0FBWixJQUFBO0FBQ0UsU0FBQSxRQUFBO0FBQ0UsYUFBTztBQUFFLFFBQUEsUUFBUSxFQUFFLElBQUksQ0FBaEIsSUFBQTtBQUF1QixRQUFBLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBTCxJQUFBO0FBQTlCLE9BQVA7O0FBQ0YsU0FBQSxVQUFBO0FBQ0UsYUFBTztBQUFFLFFBQUEsUUFBRixFQUFBLE1BQUE7QUFBb0IsUUFBQSxLQUFLLEVBQUU7QUFBM0IsT0FBUDs7QUFDRixTQUFBLFNBQUE7QUFDRSxhQUFPO0FBQUUsUUFBQSxRQUFRLEVBQUUsSUFBSSxDQUFoQixJQUFBO0FBQXVCLFFBQUEsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFMLElBQUE7QUFBOUIsT0FBUDtBQU5KO0FBUUQ7O0FBRUQsU0FBQSxTQUFBLENBQUEsUUFBQSxFQUFBLEdBQUEsRUFFcUI7QUFBQSxNQUFBLGVBQUEsR0FFRyxRQUFRLENBQVIsS0FBQSxDQUZILEdBRUcsQ0FGSDtBQUFBLE1BRWYsSUFGZSxHQUFBLGVBQUEsQ0FBQSxDQUFBLENBQUE7QUFBQSxNQUVmLElBRmUsR0FBQSxlQUFBLENBQUEsS0FBQSxDQUFBLENBQUEsQ0FBQTs7QUFHbkIsTUFBQSxRQUFBOztBQUVBLE1BQUksSUFBSSxLQUFSLE1BQUEsRUFBcUI7QUFDbkIsSUFBQSxRQUFRLEdBQUc7QUFDVCxNQUFBLElBQUksRUFESyxVQUFBO0FBRVQsTUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBRkosS0FBWDtBQURGLEdBQUEsTUFLTyxJQUFJLElBQUksQ0FBSixDQUFJLENBQUosS0FBSixHQUFBLEVBQXFCO0FBQzFCLElBQUEsUUFBUSxHQUFHO0FBQ1QsTUFBQSxJQUFJLEVBREssUUFBQTtBQUVULE1BQUEsSUFBSSxFQUZLLElBQUE7QUFHVCxNQUFBLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFKLElBQUE7QUFISixLQUFYO0FBREssR0FBQSxNQU1BO0FBQ0wsSUFBQSxRQUFRLEdBQUc7QUFDVCxNQUFBLElBQUksRUFESyxTQUFBO0FBRVQsTUFBQSxJQUFJLEVBRkssSUFBQTtBQUdULE1BQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUosSUFBQTtBQUhKLEtBQVg7QUFLRDs7QUFFRCxTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsUUFBQTtBQUVMLElBQUEsSUFBQSxFQUFBO0FBRkssR0FBUDtBQUlEOztBQUVELFNBQUEsU0FBQSxDQUFBLEdBQUEsRUFBc0M7QUFDcEMsU0FBTztBQUNMLElBQUEsSUFBSSxFQURDLFVBQUE7QUFFTCxJQUFBLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFKLElBQUE7QUFGUixHQUFQO0FBSUQ7O0FBRUQsU0FBQSxXQUFBLENBQUEsSUFBQSxFQUFBLEdBQUEsRUFBc0Q7QUFDcEQ7QUFEb0QsV0FFcEQsa0JBQU8sSUFBSSxDQUFKLENBQUksQ0FBSixLQUY2QyxHQUVwRCxFQUZvRCx1REFFcEQsQ0FGb0Q7QUFJcEQsU0FBTztBQUNMLElBQUEsSUFBSSxFQURDLFFBQUE7QUFFTCxJQUFBLElBRkssRUFBQSxJQUFBO0FBR0wsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSFIsR0FBUDtBQUtEOztBQUVELFNBQUEsUUFBQSxDQUFBLElBQUEsRUFBQSxHQUFBLEVBQW1EO0FBQUEsV0FDakQsa0JBQU8sSUFBSSxLQURzQyxNQUNqRCxFQURpRCxtRUFDakQsQ0FEaUQ7QUFBQSxXQUVqRCxrQkFDRSxJQUFJLENBQUosQ0FBSSxDQUFKLEtBREksR0FBTixFQUFNLHFDQUFBLElBQUEsR0FBQSx1QkFBQSxHQUYyQyxJQUUzQyxHQUYyQyxZQUVqRCxDQUZpRDtBQU9qRCxTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsU0FBQTtBQUVMLElBQUEsSUFGSyxFQUFBLElBQUE7QUFHTCxJQUFBLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxJQUFKLElBQUE7QUFIUixHQUFQO0FBS0Q7O0FBRUQsU0FBQSxtQkFBQSxDQUFBLElBQUEsRUFBQSxHQUFBLEVBQThEO0FBQzVELE1BQUksSUFBSSxDQUFKLENBQUksQ0FBSixLQUFKLEdBQUEsRUFBcUI7QUFDbkIsV0FBTyxXQUFXLENBQUEsSUFBQSxFQUFsQixHQUFrQixDQUFsQjtBQURGLEdBQUEsTUFFTyxJQUFJLElBQUksS0FBUixNQUFBLEVBQXFCO0FBQzFCLFdBQU8sU0FBUyxDQUFoQixHQUFnQixDQUFoQjtBQURLLEdBQUEsTUFFQTtBQUNMLFdBQU8sUUFBUSxDQUFBLElBQUEsRUFBZixHQUFlLENBQWY7QUFDRDtBQUNGOztBQUVELFNBQUEsbUJBQUEsQ0FBQSxJQUFBLEVBQUEsR0FBQSxFQUErRDtBQUM3RCxTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsZ0JBQUE7QUFFTCxJQUFBLElBRkssRUFBQSxJQUFBO0FBR0wsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSFIsR0FBUDtBQUtEOztBQUVELFNBQUEsY0FBQSxDQUFBLElBQUEsRUFBQSxJQUFBLEVBQUEsR0FBQSxFQUdxQjtBQUFBLE1BQUEsYUFBQSxHQUVnQyxZQUFZLENBRjVDLElBRTRDLENBRjVDO0FBQUEsTUFFZixZQUZlLEdBQUEsYUFBQSxDQUFBLFFBQUE7QUFBQSxNQUVrQixTQUZsQixHQUFBLGFBQUEsQ0FBQSxLQUFBOztBQUduQixNQUFJLEtBQUssR0FBQSxHQUFBLE1BQUEsQ0FBQSxTQUFBLEVBQVQsSUFBUyxDQUFUO0FBQ0EsTUFBSSxRQUFRLEdBQUcsR0FBQSxNQUFBLENBQUEsWUFBQSxFQUFBLEtBQUEsRUFBQSxJQUFBLENBQWYsR0FBZSxDQUFmO0FBRUEsU0FBTyxJQUFBLG1DQUFBLENBQUEsUUFBQSxFQUFBLElBQUEsRUFBQSxJQUFBLEVBQStDLFFBQVEsQ0FBQyxHQUFHLElBQWxFLElBQThELENBQXZELENBQVA7QUFDRDs7QUFRRCxTQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQUEsR0FBQSxFQUVzQjtBQUVwQixNQUFJLE9BQUEsSUFBQSxLQUFKLFFBQUEsRUFBOEI7QUFDNUIsUUFBSSxVQUFKLElBQUEsRUFBb0I7QUFDbEIsYUFBQSxJQUFBO0FBREYsS0FBQSxNQUVPO0FBQUEsVUFBQSxVQUFBLEdBQ2dCLFNBQVMsQ0FBQyxJQUFJLENBQUwsSUFBQSxFQUFZLGlCQURyQyxNQUNxQyxFQUFaLENBRHpCO0FBQUEsVUFDRCxLQURDLEdBQUEsVUFBQSxDQUFBLElBQUE7QUFBQSxVQUNPLEtBRFAsR0FBQSxVQUFBLENBQUEsSUFBQTs7QUFBQSxlQUdMLGtCQUNFLEtBQUksQ0FBSixNQUFBLEtBSkcsQ0FHTCxFQUhLLCtFQUdMLENBSEs7O0FBQUEsVUFBQSxjQUFBLEdBUTRCLFlBQVksQ0FSeEMsS0FRd0MsQ0FSeEM7QUFBQSxVQVFXLFlBUlgsR0FBQSxjQUFBLENBQUEsUUFBQTs7QUFVTCxhQUFPLElBQUEsbUNBQUEsQ0FDTCxDQUFBLFlBQUEsRUFBQSxNQUFBLENBQUEsS0FBQSxFQUFBLElBQUEsQ0FESyxHQUNMLENBREssRUFBQSxLQUFBLEVBQUEsS0FBQSxFQUlMLFFBQVEsQ0FBQyxHQUFHLElBSmQsSUFJVSxDQUpILENBQVA7QUFNRDtBQUNGOztBQXRCbUIsTUFBQSxXQUFBLEdBd0JDLFNBQVMsQ0FBQSxJQUFBLEVBQU8saUJBeEJqQixNQXdCaUIsRUFBUCxDQXhCVjtBQUFBLE1Bd0JoQixJQXhCZ0IsR0FBQSxXQUFBLENBQUEsSUFBQTtBQUFBLE1Bd0JSLElBeEJRLEdBQUEsV0FBQSxDQUFBLElBQUE7O0FBMEJwQixTQUFPLElBQUEsbUNBQUEsQ0FBQSxJQUFBLEVBQUEsSUFBQSxFQUFBLElBQUEsRUFBMkMsUUFBUSxDQUFDLEdBQUcsSUFBOUQsSUFBMEQsQ0FBbkQsQ0FBUDtBQUNEOztBQUVELFNBQUEsWUFBQSxDQUFBLElBQUEsRUFBQSxLQUFBLEVBQUEsR0FBQSxFQUdzQjtBQUVwQixTQUFPO0FBQ0wsSUFBQSxJQURLLEVBQUEsSUFBQTtBQUVMLElBQUEsS0FGSyxFQUFBLEtBQUE7QUFHTCxJQUFBLFFBQVEsRUFISCxLQUFBO0FBSUwsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSlIsR0FBUDtFQVFGOzs7QUFFQSxTQUFBLFNBQUEsQ0FBQSxLQUFBLEVBQUEsR0FBQSxFQUFpRTtBQUMvRCxTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsTUFBQTtBQUVMLElBQUEsS0FBSyxFQUFFLEtBQUssSUFGUCxFQUFBO0FBR0wsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSFIsR0FBUDtBQUtEOztBQUVELFNBQUEsU0FBQSxDQUFBLEdBQUEsRUFBQSxLQUFBLEVBQUEsR0FBQSxFQUE2RTtBQUMzRSxTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsVUFBQTtBQUVMLElBQUEsR0FBRyxFQUZFLEdBQUE7QUFHTCxJQUFBLEtBSEssRUFBQSxLQUFBO0FBSUwsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSlIsR0FBUDtBQU1EOztBQUVELFNBQUEsWUFBQSxDQUFBLElBQUEsRUFBQSxXQUFBLEVBQUEsR0FBQSxFQUdzQjtBQUVwQixTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsVUFBQTtBQUVMLElBQUEsSUFBSSxFQUFFLElBQUksSUFGTCxFQUFBO0FBR0wsSUFBQSxXQUFXLEVBQUUsV0FBVyxJQUhuQixFQUFBO0FBSUwsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSlIsR0FBUDtBQU1EOztBQUVELFNBQUEsZ0JBQUEsQ0FBQSxJQUFBLEVBQUEsV0FBQSxFQUFBLE9BQUEsRUFBQSxHQUFBLEVBSXNCO0FBQUEsTUFEcEIsT0FDb0IsS0FBQSxLQUFBLENBQUEsRUFBQTtBQURwQixJQUFBLE9BQ29CLEdBSnRCLEtBR0U7QUFDb0I7O0FBRXBCLFNBQU87QUFDTCxJQUFBLElBQUksRUFEQyxPQUFBO0FBRUwsSUFBQSxJQUFJLEVBQUUsSUFBSSxJQUZMLEVBQUE7QUFHTCxJQUFBLFdBQVcsRUFBRSxXQUFXLElBSG5CLEVBQUE7QUFJTCxJQUFBLE9BSkssRUFBQSxPQUFBO0FBS0wsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBTFIsR0FBUDtBQU9EOztBQUVELFNBQUEsYUFBQSxDQUFBLElBQUEsRUFBQSxXQUFBLEVBQUEsR0FBQSxFQUdzQjtBQUVwQixTQUFPO0FBQ0wsSUFBQSxJQUFJLEVBREMsVUFBQTtBQUVMLElBQUEsSUFBSSxFQUFFLElBQUksSUFGTCxFQUFBO0FBR0wsSUFBQSxXQUFXLEVBQUUsV0FBVyxJQUhuQixFQUFBO0FBSUwsSUFBQSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSixJQUFBO0FBSlIsR0FBUDtBQU1EOztBQUVELFNBQUEsYUFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQW1EO0FBQ2pELFNBQU87QUFDTCxJQUFBLElBREssRUFBQSxJQUFBO0FBRUwsSUFBQSxNQUFBLEVBQUE7QUFGSyxHQUFQO0FBSUQ7O0FBV0QsU0FBQSxRQUFBLEdBQWdDO0FBQUEsT0FBQSxJQUFBLElBQUEsR0FBQSxTQUFBLENBQUEsTUFBQSxFQUFoQyxJQUFnQyxHQUFBLElBQUEsS0FBQSxDQUFBLElBQUEsQ0FBQSxFQUFBLElBQUEsR0FBQSxDQUFBLEVBQUEsSUFBQSxHQUFBLElBQUEsRUFBQSxJQUFBLEVBQUEsRUFBQTtBQUFoQyxJQUFBLElBQWdDLENBQUEsSUFBQSxDQUFoQyxHQUFnQyxTQUFBLENBQUEsSUFBQSxDQUFoQztBQUFnQzs7QUFDOUIsTUFBSSxJQUFJLENBQUosTUFBQSxLQUFKLENBQUEsRUFBdUI7QUFDckIsUUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFkLENBQWMsQ0FBZDs7QUFFQSxRQUFJLEdBQUcsSUFBSSxPQUFBLEdBQUEsS0FBWCxRQUFBLEVBQW9DO0FBQ2xDLGFBQU8saUJBQUEsU0FBQSxDQUFxQixNQUFyQixFQUFBLEVBQVAsR0FBTyxDQUFQO0FBREYsS0FBQSxNQUVPO0FBQ0wsYUFBTyxpQkFBQSxTQUFBLENBQXFCLE1BQXJCLEVBQUEsRUFBUCw0QkFBTyxDQUFQO0FBQ0Q7QUFQSCxHQUFBLE1BUU87QUFBQSxRQUNELFNBREMsR0FDTCxJQURLLENBQUEsQ0FBQSxDQUFBO0FBQUEsUUFDRCxXQURDLEdBQ0wsSUFESyxDQUFBLENBQUEsQ0FBQTtBQUFBLFFBQ0QsT0FEQyxHQUNMLElBREssQ0FBQSxDQUFBLENBQUE7QUFBQSxRQUNELFNBREMsR0FDTCxJQURLLENBQUEsQ0FBQSxDQUFBO0FBQUEsUUFDRCxPQURDLEdBQ0wsSUFESyxDQUFBLENBQUEsQ0FBQTtBQUVMLFFBQUksTUFBTSxHQUFHLE9BQU8sR0FBRyxJQUFBLGVBQUEsQ0FBQSxFQUFBLEVBQUgsT0FBRyxDQUFILEdBQTZCLE1BQWpELEVBQUE7QUFFQSxXQUFPLGlCQUFBLFNBQUEsQ0FBQSxNQUFBLEVBQTZCO0FBQ2xDLE1BQUEsS0FBSyxFQUFFO0FBQ0wsUUFBQSxJQUFJLEVBREMsU0FBQTtBQUVMLFFBQUEsTUFBTSxFQUFFO0FBRkgsT0FEMkI7QUFLbEMsTUFBQSxHQUFHLEVBQUU7QUFDSCxRQUFBLElBQUksRUFERCxPQUFBO0FBRUgsUUFBQSxNQUFNLEVBQUU7QUFGTDtBQUw2QixLQUE3QixDQUFQO0FBVUQ7QUFDRjs7ZUFFYztBQUNiLEVBQUEsUUFBUSxFQURLLGFBQUE7QUFFYixFQUFBLEtBQUssRUFGUSxVQUFBO0FBR2IsRUFBQSxPQUFPLEVBSE0sWUFBQTtBQUliLEVBQUEsT0FBTyxFQUpNLFlBQUE7QUFLYixFQUFBLGVBQWUsRUFMRixvQkFBQTtBQU1iLEVBQUEsT0FBTyxFQU5NLFlBQUE7QUFPYixFQUFBLGVBQWUsRUFQRixvQkFBQTtBQVFiLEVBQUEsSUFBSSxFQVJTLFNBQUE7QUFTYixFQUFBLElBQUksRUFUUyxTQUFBO0FBVWIsRUFBQSxLQUFLLEVBVlEsVUFBQTtBQVliLEVBQUEsTUFBTSxFQVpPLFdBQUE7QUFhYixFQUFBLElBQUksRUFiUyxTQUFBO0FBY2IsRUFBQSxJQUFJLEVBZFMsU0FBQTtBQWViLEVBQUEsT0FBTyxFQWZNLFlBQUE7QUFnQmIsRUFBQSxPQUFPLEVBaEJNLFlBQUE7QUFpQmIsRUFBQSxXQUFXLEVBakJFLGdCQUFBO0FBa0JiLEVBQUEsUUFBUSxFQWxCSyxhQUFBO0FBbUJiLEVBQUEsR0FBRyxFQW5CVSxRQUFBO0FBb0JiLEVBQUEsR0FBRyxFQXBCVSxhQUFBO0FBc0JiLEVBQUEsSUFBSSxFQXRCUyxTQUFBO0FBd0JiLEVBQUEsUUFBUSxFQXhCSyxjQUFBO0FBeUJiLEVBQUEsSUFBSSxFQXpCUyxtQkFBQTtBQTBCYixFQUFBLEVBQUUsRUExQlcsV0FBQTtBQTJCYixTQTNCYSxRQUFBO0FBNEJiLFVBNUJhLFNBQUE7QUE2QmIsRUFBQSxTQUFTLEVBN0JJLG1CQUFBO0FBK0JiLEVBQUEsTUFBTSxFQUFFLE9BQU8sQ0EvQkYsZUErQkUsQ0EvQkY7QUFnQ2IsYUFBUyxPQUFPLENBaENILGdCQWdDRyxDQWhDSDtBQWlDYixFQUFBLE1BQU0sRUFBRSxPQUFPLENBakNGLGVBaUNFLENBakNGO0FBa0NiLEVBQUEsU0FsQ2EsRUFBQSxVQUFBLFVBQUEsRUFBQTtBQUFBLGFBQUEsU0FBQSxHQUFBO0FBQUEsYUFBQSxVQUFBLENBQUEsS0FBQSxDQUFBLElBQUEsRUFBQSxTQUFBLENBQUE7QUFBQTs7QUFBQSxJQUFBLFNBQUEsQ0FBQSxRQUFBLEdBQUEsWUFBQTtBQUFBLGFBQUEsVUFBQSxDQUFBLFFBQUEsRUFBQTtBQUFBLEtBQUE7O0FBQUEsV0FBQSxTQUFBO0FBQUEsR0FBQSxDQUFBLFlBa0NKO0FBQ1AsV0FBTyxZQUFZLENBQUEsa0JBQUEsRUFBbkIsU0FBbUIsQ0FBbkI7QUFuQ1csR0FBQSxDQUFBO0FBQUEsVUFBQSxTQUFBLEtBQUEsR0FxQ1Q7QUFDRixXQUFPLFlBQVksQ0FBQSxhQUFBLEVBQW5CLElBQW1CLENBQW5CO0FBQ0Q7QUF2Q1ksQzs7O0FBNENmLFNBQUEsT0FBQSxDQUFBLElBQUEsRUFBeUQ7QUFDdkQsU0FBTyxVQUFBLEtBQUEsRUFBQSxHQUFBLEVBQWlEO0FBQ3RELFdBQU8sWUFBWSxDQUFBLElBQUEsRUFBQSxLQUFBLEVBQW5CLEdBQW1CLENBQW5CO0FBREYsR0FBQTtBQUdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgT3B0aW9uIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMT0NBTF9ERUJVRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzaWduLCBkZXByZWNhdGUsIGlzUHJlc2VudCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBTb3VyY2VMb2NhdGlvbiwgU291cmNlUG9zaXRpb24sIFNZTlRIRVRJQ19MT0NBVElPTiB9IGZyb20gJy4uL3NvdXJjZS9sb2NhdGlvbic7XG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlJztcbmltcG9ydCB7IFNvdXJjZVNwYW4gfSBmcm9tICcuLi9zb3VyY2Uvc3Bhbic7XG5pbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBQYXRoRXhwcmVzc2lvbkltcGxWMSB9IGZyb20gJy4vbGVnYWN5LWludGVyb3AnO1xuXG5sZXQgX1NPVVJDRTogU291cmNlIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBTT1VSQ0UoKTogU291cmNlIHtcbiAgaWYgKCFfU09VUkNFKSB7XG4gICAgX1NPVVJDRSA9IG5ldyBTb3VyY2UoJycsICcoc3ludGhldGljKScpO1xuICB9XG5cbiAgcmV0dXJuIF9TT1VSQ0U7XG59XG5cbi8vIGNvbnN0IFNPVVJDRSA9IG5ldyBTb3VyY2UoJycsICcodGVzdHMpJyk7XG5cbi8vIFN0YXRlbWVudHNcblxuZXhwb3J0IHR5cGUgQnVpbGRlckhlYWQgPSBzdHJpbmcgfCBBU1R2MS5FeHByZXNzaW9uO1xuZXhwb3J0IHR5cGUgVGFnRGVzY3JpcHRvciA9IHN0cmluZyB8IHsgbmFtZTogc3RyaW5nOyBzZWxmQ2xvc2luZzogYm9vbGVhbiB9O1xuXG5mdW5jdGlvbiBidWlsZE11c3RhY2hlKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkxpdGVyYWwsXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIHJhdz86IGJvb2xlYW4sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uLFxuICBzdHJpcD86IEFTVHYxLlN0cmlwRmxhZ3Ncbik6IEFTVHYxLk11c3RhY2hlU3RhdGVtZW50IHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgIHBhdGggPSBidWlsZFBhdGgocGF0aCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdNdXN0YWNoZVN0YXRlbWVudCcsXG4gICAgcGF0aCxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgZXNjYXBlZDogIXJhdyxcbiAgICB0cnVzdGluZzogISFyYXcsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgc3RyaXA6IHN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJsb2NrKFxuICBwYXRoOiBCdWlsZGVySGVhZCxcbiAgcGFyYW1zOiBPcHRpb248QVNUdjEuRXhwcmVzc2lvbltdPixcbiAgaGFzaDogT3B0aW9uPEFTVHYxLkhhc2g+LFxuICBfZGVmYXVsdEJsb2NrOiBBU1R2MS5Qb3NzaWJseURlcHJlY2F0ZWRCbG9jayxcbiAgX2Vsc2VCbG9jaz86IE9wdGlvbjxBU1R2MS5Qb3NzaWJseURlcHJlY2F0ZWRCbG9jaz4sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uLFxuICBvcGVuU3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzLFxuICBpbnZlcnNlU3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzLFxuICBjbG9zZVN0cmlwPzogQVNUdjEuU3RyaXBGbGFnc1xuKTogQVNUdjEuQmxvY2tTdGF0ZW1lbnQge1xuICBsZXQgZGVmYXVsdEJsb2NrOiBBU1R2MS5CbG9jaztcbiAgbGV0IGVsc2VCbG9jazogT3B0aW9uPEFTVHYxLkJsb2NrPiB8IHVuZGVmaW5lZDtcblxuICBpZiAoX2RlZmF1bHRCbG9jay50eXBlID09PSAnVGVtcGxhdGUnKSB7XG4gICAgaWYgKExPQ0FMX0RFQlVHKSB7XG4gICAgICBkZXByZWNhdGUoYGIucHJvZ3JhbSBpcyBkZXByZWNhdGVkLiBVc2UgYi5ibG9ja0l0c2VsZiBpbnN0ZWFkLmApO1xuICAgIH1cblxuICAgIGRlZmF1bHRCbG9jayA9IChhc3NpZ24oe30sIF9kZWZhdWx0QmxvY2ssIHsgdHlwZTogJ0Jsb2NrJyB9KSBhcyB1bmtub3duKSBhcyBBU1R2MS5CbG9jaztcbiAgfSBlbHNlIHtcbiAgICBkZWZhdWx0QmxvY2sgPSBfZGVmYXVsdEJsb2NrO1xuICB9XG5cbiAgaWYgKF9lbHNlQmxvY2sgIT09IHVuZGVmaW5lZCAmJiBfZWxzZUJsb2NrICE9PSBudWxsICYmIF9lbHNlQmxvY2sudHlwZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgIGlmIChMT0NBTF9ERUJVRykge1xuICAgICAgZGVwcmVjYXRlKGBiLnByb2dyYW0gaXMgZGVwcmVjYXRlZC4gVXNlIGIuYmxvY2tJdHNlbGYgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBlbHNlQmxvY2sgPSAoYXNzaWduKHt9LCBfZWxzZUJsb2NrLCB7IHR5cGU6ICdCbG9jaycgfSkgYXMgdW5rbm93bikgYXMgQVNUdjEuQmxvY2s7XG4gIH0gZWxzZSB7XG4gICAgZWxzZUJsb2NrID0gX2Vsc2VCbG9jaztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0Jsb2NrU3RhdGVtZW50JyxcbiAgICBwYXRoOiBidWlsZFBhdGgocGF0aCksXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIHByb2dyYW06IGRlZmF1bHRCbG9jayB8fCBudWxsLFxuICAgIGludmVyc2U6IGVsc2VCbG9jayB8fCBudWxsLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIG9wZW5TdHJpcDogb3BlblN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIGludmVyc2VTdHJpcDogaW52ZXJzZVN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIGNsb3NlU3RyaXA6IGNsb3NlU3RyaXAgfHwgeyBvcGVuOiBmYWxzZSwgY2xvc2U6IGZhbHNlIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRWxlbWVudE1vZGlmaWVyKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24sXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGxvYz86IE9wdGlvbjxTb3VyY2VMb2NhdGlvbj5cbik6IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0VsZW1lbnRNb2RpZmllclN0YXRlbWVudCcsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYXJ0aWFsKFxuICBuYW1lOiBBU1R2MS5QYXRoRXhwcmVzc2lvbixcbiAgcGFyYW1zPzogQVNUdjEuRXhwcmVzc2lvbltdLFxuICBoYXNoPzogQVNUdjEuSGFzaCxcbiAgaW5kZW50Pzogc3RyaW5nLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGFydGlhbFN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1BhcnRpYWxTdGF0ZW1lbnQnLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGluZGVudDogaW5kZW50IHx8ICcnLFxuICAgIHN0cmlwOiB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuQ29tbWVudFN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0NvbW1lbnRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNdXN0YWNoZUNvbW1lbnQodmFsdWU6IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb25jYXQoXG4gIHBhcnRzOiAoQVNUdjEuVGV4dE5vZGUgfCBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudClbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkNvbmNhdFN0YXRlbWVudCB7XG4gIGlmICghaXNQcmVzZW50KHBhcnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYi5jb25jYXQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHBhcnRgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0NvbmNhdFN0YXRlbWVudCcsXG4gICAgcGFydHM6IHBhcnRzIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG4vLyBOb2Rlc1xuXG5leHBvcnQgdHlwZSBFbGVtZW50UGFydHMgPVxuICB8IFsnYXR0cnMnLCAuLi5BdHRyU2V4cFtdXVxuICB8IFsnbW9kaWZpZXJzJywgLi4uTW9kaWZpZXJTZXhwW11dXG4gIHwgWydib2R5JywgLi4uQVNUdjEuU3RhdGVtZW50W11dXG4gIHwgWydjb21tZW50cycsIC4uLkVsZW1lbnRDb21tZW50W11dXG4gIHwgWydhcycsIC4uLnN0cmluZ1tdXVxuICB8IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBQYXRoU2V4cCA9IHN0cmluZyB8IFsncGF0aCcsIHN0cmluZywgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBNb2RpZmllclNleHAgPVxuICB8IHN0cmluZ1xuICB8IFtQYXRoU2V4cCwgTG9jU2V4cD9dXG4gIHwgW1BhdGhTZXhwLCBBU1R2MS5FeHByZXNzaW9uW10sIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+LCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIEF0dHJTZXhwID0gW3N0cmluZywgQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ10gfCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTG9jU2V4cCA9IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBFbGVtZW50Q29tbWVudCA9IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudCB8IFNvdXJjZUxvY2F0aW9uIHwgc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBTZXhwVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IEFTVHYxLkV4cHJlc3Npb25bXVxuICB8IERpY3Q8QVNUdjEuRXhwcmVzc2lvbj5cbiAgfCBMb2NTZXhwXG4gIHwgUGF0aFNleHBcbiAgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRFbGVtZW50T3B0aW9ucyB7XG4gIGF0dHJzPzogQVNUdjEuQXR0ck5vZGVbXTtcbiAgbW9kaWZpZXJzPzogQVNUdjEuRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50W107XG4gIGNoaWxkcmVuPzogQVNUdjEuU3RhdGVtZW50W107XG4gIGNvbW1lbnRzPzogRWxlbWVudENvbW1lbnRbXTtcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXTtcbiAgbG9jPzogU291cmNlU3Bhbjtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbGVtZW50KHRhZzogVGFnRGVzY3JpcHRvciwgb3B0aW9uczogQnVpbGRFbGVtZW50T3B0aW9ucyA9IHt9KTogQVNUdjEuRWxlbWVudE5vZGUge1xuICBsZXQgeyBhdHRycywgYmxvY2tQYXJhbXMsIG1vZGlmaWVycywgY29tbWVudHMsIGNoaWxkcmVuLCBsb2MgfSA9IG9wdGlvbnM7XG5cbiAgbGV0IHRhZ05hbWU6IHN0cmluZztcblxuICAvLyB0aGlzIGlzIHVzZWQgZm9yIGJhY2t3YXJkcyBjb21wYXQsIHByaW9yIHRvIGBzZWxmQ2xvc2luZ2AgYmVpbmcgcGFydCBvZiB0aGUgRWxlbWVudE5vZGUgQVNUXG4gIGxldCBzZWxmQ2xvc2luZyA9IGZhbHNlO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcpIHtcbiAgICBzZWxmQ2xvc2luZyA9IHRhZy5zZWxmQ2xvc2luZztcbiAgICB0YWdOYW1lID0gdGFnLm5hbWU7XG4gIH0gZWxzZSBpZiAodGFnLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgdGFnTmFtZSA9IHRhZy5zbGljZSgwLCAtMSk7XG4gICAgc2VsZkNsb3NpbmcgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHRhZ05hbWUgPSB0YWc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdFbGVtZW50Tm9kZScsXG4gICAgdGFnOiB0YWdOYW1lLFxuICAgIHNlbGZDbG9zaW5nOiBzZWxmQ2xvc2luZyxcbiAgICBhdHRyaWJ1dGVzOiBhdHRycyB8fCBbXSxcbiAgICBibG9ja1BhcmFtczogYmxvY2tQYXJhbXMgfHwgW10sXG4gICAgbW9kaWZpZXJzOiBtb2RpZmllcnMgfHwgW10sXG4gICAgY29tbWVudHM6IChjb21tZW50cyBhcyBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnRbXSkgfHwgW10sXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEF0dHIoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IEFTVHYxLkF0dHJOb2RlWyd2YWx1ZSddLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuQXR0ck5vZGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdBdHRyTm9kZScsXG4gICAgbmFtZTogbmFtZSxcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGV4dChjaGFycz86IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5UZXh0Tm9kZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RleHROb2RlJyxcbiAgICBjaGFyczogY2hhcnMgfHwgJycsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbi8vIEV4cHJlc3Npb25zXG5cbmZ1bmN0aW9uIGJ1aWxkU2V4cHIoXG4gIHBhdGg6IEJ1aWxkZXJIZWFkLFxuICBwYXJhbXM/OiBBU1R2MS5FeHByZXNzaW9uW10sXG4gIGhhc2g/OiBBU1R2MS5IYXNoLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuU3ViRXhwcmVzc2lvbiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1N1YkV4cHJlc3Npb24nLFxuICAgIHBhdGg6IGJ1aWxkUGF0aChwYXRoKSxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGhlYWRUb1N0cmluZyhoZWFkOiBBU1R2MS5QYXRoSGVhZCk6IHsgb3JpZ2luYWw6IHN0cmluZzsgcGFydHM6IHN0cmluZ1tdIH0ge1xuICBzd2l0Y2ggKGhlYWQudHlwZSkge1xuICAgIGNhc2UgJ0F0SGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogaGVhZC5uYW1lLCBwYXJ0czogW2hlYWQubmFtZV0gfTtcbiAgICBjYXNlICdUaGlzSGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogYHRoaXNgLCBwYXJ0czogW10gfTtcbiAgICBjYXNlICdWYXJIZWFkJzpcbiAgICAgIHJldHVybiB7IG9yaWdpbmFsOiBoZWFkLm5hbWUsIHBhcnRzOiBbaGVhZC5uYW1lXSB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGVhZChcbiAgb3JpZ2luYWw6IHN0cmluZyxcbiAgbG9jOiBTb3VyY2VMb2NhdGlvblxuKTogeyBoZWFkOiBBU1R2MS5QYXRoSGVhZDsgdGFpbDogc3RyaW5nW10gfSB7XG4gIGxldCBbaGVhZCwgLi4udGFpbF0gPSBvcmlnaW5hbC5zcGxpdCgnLicpO1xuICBsZXQgaGVhZE5vZGU6IEFTVHYxLlBhdGhIZWFkO1xuXG4gIGlmIChoZWFkID09PSAndGhpcycpIHtcbiAgICBoZWFkTm9kZSA9IHtcbiAgICAgIHR5cGU6ICdUaGlzSGVhZCcsXG4gICAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKGhlYWRbMF0gPT09ICdAJykge1xuICAgIGhlYWROb2RlID0ge1xuICAgICAgdHlwZTogJ0F0SGVhZCcsXG4gICAgICBuYW1lOiBoZWFkLFxuICAgICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBoZWFkTm9kZSA9IHtcbiAgICAgIHR5cGU6ICdWYXJIZWFkJyxcbiAgICAgIG5hbWU6IGhlYWQsXG4gICAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBoZWFkOiBoZWFkTm9kZSxcbiAgICB0YWlsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRoaXMobG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGhpc0hlYWQnLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEF0TmFtZShuYW1lOiBzdHJpbmcsIGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIC8vIHRoZSBgQGAgc2hvdWxkIGJlIGluY2x1ZGVkIHNvIHdlIGhhdmUgYSBjb21wbGV0ZSBzb3VyY2UgcmFuZ2VcbiAgYXNzZXJ0KG5hbWVbMF0gPT09ICdAJywgYGNhbGwgYnVpbGRlcnMuYXQoKSB3aXRoIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggJ0AnYCk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQXRIZWFkJyxcbiAgICBuYW1lLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFZhcihuYW1lOiBzdHJpbmcsIGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIGFzc2VydChuYW1lICE9PSAndGhpcycsIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJ3RoaXMnLiBDYWxsIGJ1aWxkZXJzLnRoaXMgaW5zdGVhZGApO1xuICBhc3NlcnQoXG4gICAgbmFtZVswXSAhPT0gJ0AnLFxuICAgIGBZb3UgY2FsbGVkIGJ1aWxkZXJzLnZhcigpIHdpdGggJyR7bmFtZX0nLiBDYWxsIGJ1aWxkZXJzLmF0KCcke25hbWV9JykgaW5zdGVhZGBcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdWYXJIZWFkJyxcbiAgICBuYW1lLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEhlYWRGcm9tU3RyaW5nKGhlYWQ6IHN0cmluZywgbG9jOiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLlBhdGhIZWFkIHtcbiAgaWYgKGhlYWRbMF0gPT09ICdAJykge1xuICAgIHJldHVybiBidWlsZEF0TmFtZShoZWFkLCBsb2MpO1xuICB9IGVsc2UgaWYgKGhlYWQgPT09ICd0aGlzJykge1xuICAgIHJldHVybiBidWlsZFRoaXMobG9jKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYnVpbGRWYXIoaGVhZCwgbG9jKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZE5hbWVkQmxvY2tOYW1lKG5hbWU6IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5OYW1lZEJsb2NrTmFtZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ05hbWVkQmxvY2tOYW1lJyxcbiAgICBuYW1lLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZENsZWFuUGF0aChcbiAgaGVhZDogQVNUdjEuUGF0aEhlYWQsXG4gIHRhaWw6IHN0cmluZ1tdLFxuICBsb2M6IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB7XG4gIGxldCB7IG9yaWdpbmFsOiBvcmlnaW5hbEhlYWQsIHBhcnRzOiBoZWFkUGFydHMgfSA9IGhlYWRUb1N0cmluZyhoZWFkKTtcbiAgbGV0IHBhcnRzID0gWy4uLmhlYWRQYXJ0cywgLi4udGFpbF07XG4gIGxldCBvcmlnaW5hbCA9IFsuLi5vcmlnaW5hbEhlYWQsIC4uLnBhcnRzXS5qb2luKCcuJyk7XG5cbiAgcmV0dXJuIG5ldyBQYXRoRXhwcmVzc2lvbkltcGxWMShvcmlnaW5hbCwgaGVhZCwgdGFpbCwgYnVpbGRMb2MobG9jIHx8IG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYXRoKFxuICBwYXRoOiBBU1R2MS5QYXRoRXhwcmVzc2lvbiB8IHN0cmluZyB8IHsgaGVhZDogc3RyaW5nOyB0YWlsOiBzdHJpbmdbXSB9LFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGF0aEV4cHJlc3Npb247XG5mdW5jdGlvbiBidWlsZFBhdGgocGF0aDogQVNUdjEuRXhwcmVzc2lvbiwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5FeHByZXNzaW9uO1xuZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGg6IEJ1aWxkZXJIZWFkIHwgQVNUdjEuRXhwcmVzc2lvbiwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5FeHByZXNzaW9uO1xuZnVuY3Rpb24gYnVpbGRQYXRoKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24gfCB7IGhlYWQ6IHN0cmluZzsgdGFpbDogc3RyaW5nW10gfSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkV4cHJlc3Npb24ge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCd0eXBlJyBpbiBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHsgaGVhZCwgdGFpbCB9ID0gYnVpbGRIZWFkKHBhdGguaGVhZCwgU291cmNlU3Bhbi5icm9rZW4oKSk7XG5cbiAgICAgIGFzc2VydChcbiAgICAgICAgdGFpbC5sZW5ndGggPT09IDAsXG4gICAgICAgIGBidWlsZGVyLnBhdGgoeyBoZWFkLCB0YWlsIH0pIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggYSBoZWFkIHdpdGggZG90cyBpbiBpdGBcbiAgICAgICk7XG5cbiAgICAgIGxldCB7IG9yaWdpbmFsOiBvcmlnaW5hbEhlYWQgfSA9IGhlYWRUb1N0cmluZyhoZWFkKTtcblxuICAgICAgcmV0dXJuIG5ldyBQYXRoRXhwcmVzc2lvbkltcGxWMShcbiAgICAgICAgW29yaWdpbmFsSGVhZCwgLi4udGFpbF0uam9pbignLicpLFxuICAgICAgICBoZWFkLFxuICAgICAgICB0YWlsLFxuICAgICAgICBidWlsZExvYyhsb2MgfHwgbnVsbClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHsgaGVhZCwgdGFpbCB9ID0gYnVpbGRIZWFkKHBhdGgsIFNvdXJjZVNwYW4uYnJva2VuKCkpO1xuXG4gIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEocGF0aCwgaGVhZCwgdGFpbCwgYnVpbGRMb2MobG9jIHx8IG51bGwpKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPihcbiAgdHlwZTogVFsndHlwZSddLFxuICB2YWx1ZTogVFsndmFsdWUnXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IFQge1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgdmFsdWUsXG4gICAgb3JpZ2luYWw6IHZhbHVlLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9IGFzIFQ7XG59XG5cbi8vIE1pc2NlbGxhbmVvdXNcblxuZnVuY3Rpb24gYnVpbGRIYXNoKHBhaXJzPzogQVNUdjEuSGFzaFBhaXJbXSwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5IYXNoIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnSGFzaCcsXG4gICAgcGFpcnM6IHBhaXJzIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFBhaXIoa2V5OiBzdHJpbmcsIHZhbHVlOiBBU1R2MS5FeHByZXNzaW9uLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IEFTVHYxLkhhc2hQYWlyIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnSGFzaFBhaXInLFxuICAgIGtleToga2V5LFxuICAgIHZhbHVlLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFByb2dyYW0oXG4gIGJvZHk/OiBBU1R2MS5TdGF0ZW1lbnRbXSxcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlRlbXBsYXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGVtcGxhdGUnLFxuICAgIGJvZHk6IGJvZHkgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJsb2NrSXRzZWxmKFxuICBib2R5PzogQVNUdjEuU3RhdGVtZW50W10sXG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW10sXG4gIGNoYWluZWQgPSBmYWxzZSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkJsb2NrIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQmxvY2snLFxuICAgIGJvZHk6IGJvZHkgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIGNoYWluZWQsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGUoXG4gIGJvZHk/OiBBU1R2MS5TdGF0ZW1lbnRbXSxcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlRlbXBsYXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVGVtcGxhdGUnLFxuICAgIGJvZHk6IGJvZHkgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFBvc2l0aW9uKGxpbmU6IG51bWJlciwgY29sdW1uOiBudW1iZXIpOiBTb3VyY2VQb3NpdGlvbiB7XG4gIHJldHVybiB7XG4gICAgbGluZSxcbiAgICBjb2x1bW4sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTG9jKGxvYzogT3B0aW9uPFNvdXJjZUxvY2F0aW9uPik6IFNvdXJjZVNwYW47XG5mdW5jdGlvbiBidWlsZExvYyhcbiAgc3RhcnRMaW5lOiBudW1iZXIsXG4gIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gIGVuZExpbmU/OiBudW1iZXIsXG4gIGVuZENvbHVtbj86IG51bWJlcixcbiAgc291cmNlPzogc3RyaW5nXG4pOiBTb3VyY2VTcGFuO1xuXG5mdW5jdGlvbiBidWlsZExvYyguLi5hcmdzOiBhbnlbXSk6IFNvdXJjZVNwYW4ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICBsZXQgbG9jID0gYXJnc1swXTtcblxuICAgIGlmIChsb2MgJiYgdHlwZW9mIGxvYyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBTb3VyY2VTcGFuLmZvckhic0xvYyhTT1VSQ0UoKSwgbG9jKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFNvdXJjZVNwYW4uZm9ySGJzTG9jKFNPVVJDRSgpLCBTWU5USEVUSUNfTE9DQVRJT04pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgW3N0YXJ0TGluZSwgc3RhcnRDb2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbiwgX3NvdXJjZV0gPSBhcmdzO1xuICAgIGxldCBzb3VyY2UgPSBfc291cmNlID8gbmV3IFNvdXJjZSgnJywgX3NvdXJjZSkgOiBTT1VSQ0UoKTtcblxuICAgIHJldHVybiBTb3VyY2VTcGFuLmZvckhic0xvYyhzb3VyY2UsIHtcbiAgICAgIHN0YXJ0OiB7XG4gICAgICAgIGxpbmU6IHN0YXJ0TGluZSxcbiAgICAgICAgY29sdW1uOiBzdGFydENvbHVtbixcbiAgICAgIH0sXG4gICAgICBlbmQ6IHtcbiAgICAgICAgbGluZTogZW5kTGluZSxcbiAgICAgICAgY29sdW1uOiBlbmRDb2x1bW4sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbXVzdGFjaGU6IGJ1aWxkTXVzdGFjaGUsXG4gIGJsb2NrOiBidWlsZEJsb2NrLFxuICBwYXJ0aWFsOiBidWlsZFBhcnRpYWwsXG4gIGNvbW1lbnQ6IGJ1aWxkQ29tbWVudCxcbiAgbXVzdGFjaGVDb21tZW50OiBidWlsZE11c3RhY2hlQ29tbWVudCxcbiAgZWxlbWVudDogYnVpbGRFbGVtZW50LFxuICBlbGVtZW50TW9kaWZpZXI6IGJ1aWxkRWxlbWVudE1vZGlmaWVyLFxuICBhdHRyOiBidWlsZEF0dHIsXG4gIHRleHQ6IGJ1aWxkVGV4dCxcbiAgc2V4cHI6IGJ1aWxkU2V4cHIsXG5cbiAgY29uY2F0OiBidWlsZENvbmNhdCxcbiAgaGFzaDogYnVpbGRIYXNoLFxuICBwYWlyOiBidWlsZFBhaXIsXG4gIGxpdGVyYWw6IGJ1aWxkTGl0ZXJhbCxcbiAgcHJvZ3JhbTogYnVpbGRQcm9ncmFtLFxuICBibG9ja0l0c2VsZjogYnVpbGRCbG9ja0l0c2VsZixcbiAgdGVtcGxhdGU6IGJ1aWxkVGVtcGxhdGUsXG4gIGxvYzogYnVpbGRMb2MsXG4gIHBvczogYnVpbGRQb3NpdGlvbixcblxuICBwYXRoOiBidWlsZFBhdGgsXG5cbiAgZnVsbFBhdGg6IGJ1aWxkQ2xlYW5QYXRoLFxuICBoZWFkOiBidWlsZEhlYWRGcm9tU3RyaW5nLFxuICBhdDogYnVpbGRBdE5hbWUsXG4gIHZhcjogYnVpbGRWYXIsXG4gIHRoaXM6IGJ1aWxkVGhpcyxcbiAgYmxvY2tOYW1lOiBidWlsZE5hbWVkQmxvY2tOYW1lLFxuXG4gIHN0cmluZzogbGl0ZXJhbCgnU3RyaW5nTGl0ZXJhbCcpIGFzICh2YWx1ZTogc3RyaW5nKSA9PiBBU1R2MS5TdHJpbmdMaXRlcmFsLFxuICBib29sZWFuOiBsaXRlcmFsKCdCb29sZWFuTGl0ZXJhbCcpIGFzICh2YWx1ZTogYm9vbGVhbikgPT4gQVNUdjEuQm9vbGVhbkxpdGVyYWwsXG4gIG51bWJlcjogbGl0ZXJhbCgnTnVtYmVyTGl0ZXJhbCcpIGFzICh2YWx1ZTogbnVtYmVyKSA9PiBBU1R2MS5OdW1iZXJMaXRlcmFsLFxuICB1bmRlZmluZWQoKTogQVNUdjEuVW5kZWZpbmVkTGl0ZXJhbCB7XG4gICAgcmV0dXJuIGJ1aWxkTGl0ZXJhbCgnVW5kZWZpbmVkTGl0ZXJhbCcsIHVuZGVmaW5lZCk7XG4gIH0sXG4gIG51bGwoKTogQVNUdjEuTnVsbExpdGVyYWwge1xuICAgIHJldHVybiBidWlsZExpdGVyYWwoJ051bGxMaXRlcmFsJywgbnVsbCk7XG4gIH0sXG59O1xuXG50eXBlIEJ1aWxkTGl0ZXJhbDxUIGV4dGVuZHMgQVNUdjEuTGl0ZXJhbD4gPSAodmFsdWU6IFRbJ3ZhbHVlJ10pID0+IFQ7XG5cbmZ1bmN0aW9uIGxpdGVyYWw8VCBleHRlbmRzIEFTVHYxLkxpdGVyYWw+KHR5cGU6IFRbJ3R5cGUnXSk6IEJ1aWxkTGl0ZXJhbDxUPiB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWU6IFRbJ3ZhbHVlJ10sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogVCB7XG4gICAgcmV0dXJuIGJ1aWxkTGl0ZXJhbCh0eXBlLCB2YWx1ZSwgbG9jKTtcbiAgfTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=