UNPKG

@glimmer/compiler

Version:
682 lines (597 loc) 78.5 kB
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import TemplateVisitor from './template-visitor'; import JavaScriptCompiler from './javascript-compiler'; import { assert } from '@glimmer/util'; import { isLiteral, SyntaxError } from '@glimmer/syntax'; import { getAttrNamespace } from './utils'; import { SymbolAllocator } from './allocate-symbols'; import { locationToOffset } from './location'; function isTrustedValue(value) { return value.escaped !== undefined && !value.escaped; } export var THIS = 0; var TemplateCompiler = function () { function TemplateCompiler(source) { _classCallCheck(this, TemplateCompiler); this.source = source; this.templateId = 0; this.templateIds = []; this.opcodes = []; this.locations = []; this.includeMeta = true; } TemplateCompiler.compile = function compile(ast, source, options) { var templateVisitor = new TemplateVisitor(); templateVisitor.visit(ast); var compiler = new TemplateCompiler(source); var _compiler$process = compiler.process(templateVisitor.actions), opcodes = _compiler$process.opcodes, templateLocations = _compiler$process.locations; var _process = new SymbolAllocator(opcodes, templateLocations).process(), ops = _process.ops, allocationLocations = _process.locations; var out = JavaScriptCompiler.process(ops, allocationLocations, ast.symbols, options); if (false) { console.log('Template ->', out); } return out; }; TemplateCompiler.prototype.process = function process(actions) { var _this = this; actions.forEach(function (_ref) { var name = _ref[0], args = _ref[1]; if (!_this[name]) { throw new Error('Unimplemented ' + name + ' on TemplateCompiler'); } _this[name](args); }); return { opcodes: this.opcodes, locations: this.locations }; }; TemplateCompiler.prototype.startProgram = function startProgram(_ref2) { var program = _ref2[0]; this.opcode(['startProgram', program], program); }; TemplateCompiler.prototype.endProgram = function endProgram() { this.opcode(['endProgram'], null); }; TemplateCompiler.prototype.startBlock = function startBlock(_ref3) { var program = _ref3[0]; this.templateId++; this.opcode(['startBlock', program], program); }; TemplateCompiler.prototype.endBlock = function endBlock() { this.templateIds.push(this.templateId - 1); this.opcode(['endBlock'], null); }; TemplateCompiler.prototype.text = function text(_ref4) { var action = _ref4[0]; this.opcode(['text', action.chars], action); }; TemplateCompiler.prototype.comment = function comment(_ref5) { var action = _ref5[0]; this.opcode(['comment', action.value], action); }; TemplateCompiler.prototype.openElement = function openElement(_ref6) { var action = _ref6[0]; var attributes = action.attributes; var simple = true; for (var i = 0; i < attributes.length; i++) { var attr = attributes[i]; if (attr.name === '...attributes') { simple = false; break; } } if (action.modifiers.length > 0) { simple = false; } var actionIsComponent = false; var dynamic = destructureDynamicComponent(action); if (dynamic) { this.expression(dynamic, "ComponentHead" /* ComponentHead */, action); this.opcode(['openComponent', action], action); actionIsComponent = true; } else if (isNamedBlock(action)) { this.opcode(['openNamedBlock', action], action); } else if (isComponent(action)) { this.opcode(['openComponent', action], action); actionIsComponent = true; } else { this.opcode(['openElement', [action, simple]], action); } if (!isNamedBlock(action)) { // TODO: Assert no attributes var typeAttr = null; var attrs = action.attributes; for (var _i = 0; _i < attrs.length; _i++) { if (attrs[_i].name === 'type') { typeAttr = attrs[_i]; continue; } this.attribute([attrs[_i]], !simple || actionIsComponent); } if (typeAttr) { this.attribute([typeAttr], !simple || actionIsComponent); } for (var _i2 = 0; _i2 < action.modifiers.length; _i2++) { this.modifier([action.modifiers[_i2]]); } this.opcode(['flushElement', action], null); } }; TemplateCompiler.prototype.closeElement = function closeElement(_ref7) { var action = _ref7[0]; if (isNamedBlock(action)) { this.opcode(['closeNamedBlock', action]); } else if (destructureDynamicComponent(action)) { this.opcode(['closeDynamicComponent', action], action); } else if (isComponent(action)) { this.opcode(['closeComponent', action], action); } else { this.opcode(['closeElement', action], action); } }; TemplateCompiler.prototype.attribute = function attribute(_ref8, isComponent) { var action = _ref8[0]; var name = action.name, value = action.value; var namespace = getAttrNamespace(name); var isStatic = this.prepareAttributeValue(value); if (name.charAt(0) === '@') { // Arguments if (isStatic) { this.opcode(['staticArg', name], action); } else if (action.value.type === 'MustacheStatement') { this.opcode(['dynamicArg', name], action); } else { this.opcode(['dynamicArg', name], action); } } else { var isTrusting = isTrustedValue(value); if (isStatic && name === '...attributes') { this.opcode(['attrSplat'], action); } else if (isStatic && !isComponent) { this.opcode(['staticAttr', [name, namespace]], action); } else if (isTrusting) { this.opcode(isComponent ? ['trustingComponentAttr', [name, namespace]] : ['trustingAttr', [name, namespace]], action); } else if (action.value.type === 'MustacheStatement') { this.opcode(isComponent ? ['componentAttr', [name, namespace]] : ['dynamicAttr', [name, namespace]], action); } else { this.opcode(isComponent ? ['componentAttr', [name, namespace]] : ['dynamicAttr', [name, namespace]], action); } } }; TemplateCompiler.prototype.modifier = function modifier(_ref9) { var action = _ref9[0]; this.prepareHelper(action, 'modifier'); this.expression(action.path, "ModifierHead" /* ModifierHead */, action); this.opcode(['modifier'], action); }; TemplateCompiler.prototype.mustache = function mustache(_ref10) { var _mustache = _ref10[0]; var path = _mustache.path; if (isLiteral(path)) { this.expression(_mustache.path, "Expression" /* Expression */, _mustache); this.opcode(['append', !_mustache.escaped], _mustache); } else if (path.type !== 'PathExpression') { throw new SyntaxError('Expected PathExpression, got ' + path.type, path.loc); } else if (isYield(path)) { var to = assertValidYield(_mustache); this.yield(to, _mustache); } else if (isPartial(path)) { var params = assertValidPartial(_mustache); this.partial(params, _mustache); } else if (isDebugger(path)) { assertValidDebuggerUsage(_mustache); this.debugger('debugger', _mustache); } else if (isKeyword(_mustache)) { this.keyword(_mustache); this.opcode(['append', !_mustache.escaped], _mustache); } else if (isHelperInvocation(_mustache)) { this.prepareHelper(_mustache, 'helper'); this.expression(_mustache.path, "CallHead" /* CallHead */, _mustache.path); this.opcode(['helper'], _mustache); this.opcode(['append', !_mustache.escaped], _mustache); } else { this.expression(_mustache.path, mustacheContext(_mustache.path), _mustache); this.opcode(['append', !_mustache.escaped], _mustache); } }; TemplateCompiler.prototype.block = function block(_ref11) { var action /*, index, count*/ = _ref11[0]; this.prepareHelper(action, 'block'); var templateId = this.templateIds.pop(); var inverseId = action.inverse === null ? null : this.templateIds.pop(); this.expression(action.path, "BlockHead" /* BlockHead */, action); this.opcode(['block', [templateId, inverseId]], action); }; /// Internal actions, not found in the original processed actions // private path(head: string, rest: string[], context: ExpressionContext, loc: AST.BaseNode) { // if (head[0] === '@') { // this.argPath(head, rest, loc); // } else { // this.varPath(head, rest, context, loc); // } // } TemplateCompiler.prototype.argPath = function argPath(head, rest, loc) { this.opcode(['getArg', head], loc); this.opcode(['getPath', rest], loc); }; TemplateCompiler.prototype.varPath = function varPath(head, rest, context, loc) { this.opcode(['getVar', [head, context]], loc); this.opcode(['getPath', rest], loc); }; TemplateCompiler.prototype.thisPath = function thisPath(rest, loc) { this.opcode(['getThis'], loc); this.opcode(['getPath', rest], loc); }; TemplateCompiler.prototype.expression = function expression(path, context, expr) { if (isLiteral(path)) { this.opcode(['literal', path.value], expr); } else if (path.type !== 'PathExpression') { throw new SyntaxError('Expected PathExpression, got ' + path.type, path.loc); } else if (isKeyword(expr)) { this.keyword(expr); } else { this.path(path, context); } }; /// Internal Syntax TemplateCompiler.prototype.yield = function _yield(to, action) { this.prepareParams(action.params); this.opcode(['yield', to], action); }; TemplateCompiler.prototype.debugger = function _debugger(_name, action) { this.opcode(['debugger', null], action); }; TemplateCompiler.prototype.hasBlock = function hasBlock(name, action) { this.opcode(['hasBlock', name], action); }; TemplateCompiler.prototype.hasBlockParams = function hasBlockParams(name, action) { this.opcode(['hasBlockParams', name], action); }; TemplateCompiler.prototype.partial = function partial(_params, action) { this.prepareParams(action.params); this.opcode(['partial'], action); }; TemplateCompiler.prototype.keyword = function keyword(action) { var path = action.path; if (isHasBlock(path)) { var name = assertValidHasBlockUsage(path.original, action); this.hasBlock(name, action); } else if (isHasBlockParams(path)) { var _name2 = assertValidHasBlockUsage(path.original, action); this.hasBlockParams(_name2, action); } }; /// Expressions, invoked recursively from prepareParams and prepareHash TemplateCompiler.prototype.SubExpression = function SubExpression(expr) { if (isKeyword(expr)) { this.keyword(expr); } else { this.prepareHelper(expr, 'helper'); this.expression(expr.path, "CallHead" /* CallHead */, expr); this.opcode(['helper']); } }; TemplateCompiler.prototype.PathExpression = function PathExpression(expr) { this.path(expr, "Expression" /* Expression */); }; TemplateCompiler.prototype.path = function path(expr, context) { var _expr$parts = expr.parts, head = _expr$parts[0], rest = _expr$parts.slice(1); if (expr.data) { this.argPath('@' + head, rest, expr); } else if (expr.this) { this.thisPath(expr.parts, expr); } else { this.varPath(head, rest, context, expr); } }; TemplateCompiler.prototype.StringLiteral = function StringLiteral(action) { this.opcode(['literal', action.value], action); }; TemplateCompiler.prototype.BooleanLiteral = function BooleanLiteral(action) { this.opcode(['literal', action.value], action); }; TemplateCompiler.prototype.NumberLiteral = function NumberLiteral(action) { this.opcode(['literal', action.value], action); }; TemplateCompiler.prototype.NullLiteral = function NullLiteral(action) { this.opcode(['literal', action.value], action); }; TemplateCompiler.prototype.UndefinedLiteral = function UndefinedLiteral(action) { this.opcode(['literal', action.value], action); }; /// Utilities TemplateCompiler.prototype.opcode = function opcode(_opcode) { var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; if (action) { this.locations.push(this.location(action)); } else { this.locations.push(null); } if (this.includeMeta && action) { _opcode.push(this.meta(action)); } this.opcodes.push(_opcode); }; TemplateCompiler.prototype.helperCall = function helperCall(call, node) { this.prepareHelper(call, 'helper'); this.expression(call.path, "CallHead" /* CallHead */, node); this.opcode(['helper'], node); }; TemplateCompiler.prototype.mustacheCall = function mustacheCall(call) { this.prepareHelper(call, 'helper'); this.expression(call.path, "CallHead" /* CallHead */, call); this.opcode(['helper'], call); }; TemplateCompiler.prototype.prepareHelper = function prepareHelper(expr, context) { assertIsSimplePath(expr.path, expr.loc, context); var params = expr.params, hash = expr.hash; this.prepareHash(hash); this.prepareParams(params); }; TemplateCompiler.prototype.prepareParams = function prepareParams(params) { if (!params.length) { this.opcode(['literal', null], null); return; } for (var i = params.length - 1; i >= 0; i--) { var param = params[i]; false && assert(this[param.type], 'Unimplemented ' + param.type + ' on TemplateCompiler'); this[param.type](param); } this.opcode(['prepareArray', params.length], null); }; TemplateCompiler.prototype.prepareHash = function prepareHash(hash) { var pairs = hash.pairs; if (!pairs.length) { this.opcode(['literal', null], null); return; } for (var i = pairs.length - 1; i >= 0; i--) { var _pairs$i = pairs[i], key = _pairs$i.key, value = _pairs$i.value; false && assert(this[value.type], 'Unimplemented ' + value.type + ' on TemplateCompiler'); this[value.type](value); this.opcode(['literal', key], null); } this.opcode(['prepareObject', pairs.length], null); }; TemplateCompiler.prototype.prepareAttributeValue = function prepareAttributeValue(value) { // returns the static value if the value is static if (value.type === 'ConcatStatement') { this.prepareConcatParts(value.parts); this.opcode(['concat'], value); return false; } else { return this.mustacheAttrValue(value); } }; TemplateCompiler.prototype.prepareConcatParts = function prepareConcatParts(parts) { for (var i = parts.length - 1; i >= 0; i--) { var part = parts[i]; this.mustacheAttrValue(part); } this.opcode(['prepareArray', parts.length], null); }; TemplateCompiler.prototype.mustacheAttrValue = function mustacheAttrValue(value) { if (value.type === 'TextNode') { this.opcode(['literal', value.chars]); return true; } else if (isKeyword(value)) { this.keyword(value); } else if (isHelperInvocation(value)) { this.prepareHelper(value, 'helper'); this.expression(value.path, "CallHead" /* CallHead */, value); this.opcode(['helper'], value); } else { this.expression(value.path, "AppendSingleId" /* AppendSingleId */, value); } return false; }; TemplateCompiler.prototype.meta = function meta(node) { var loc = node.loc; if (!loc) { return []; } var source = loc.source, start = loc.start, end = loc.end; return ['loc', [source || null, [start.line, start.column], [end.line, end.column]]]; }; TemplateCompiler.prototype.location = function location(node) { var loc = node.loc; if (!loc) return null; var source = loc.source, start = loc.start, end = loc.end; var startOffset = locationToOffset(this.source, start.line - 1, start.column); var endOffset = locationToOffset(this.source, end.line - 1, end.column); if (startOffset === null || endOffset === null) { // Should this be an assertion? return null; } return { source: source || null, start: startOffset, end: endOffset }; }; return TemplateCompiler; }(); export default TemplateCompiler; function isHelperInvocation(mustache) { if (mustache.type !== 'SubExpression' && mustache.type !== 'MustacheStatement') { return false; } return mustache.params && mustache.params.length > 0 || mustache.hash && mustache.hash.pairs.length > 0; } function isSimplePath(_ref12) { var parts = _ref12.parts; return parts.length === 1; } function isYield(path) { return path.original === 'yield'; } function isPartial(path) { return path.original === 'partial'; } function isDebugger(path) { return path.original === 'debugger'; } function isHasBlock(path) { if (path.type !== 'PathExpression') return false; return path.original === 'has-block'; } function isHasBlockParams(path) { if (path.type !== 'PathExpression') return false; return path.original === 'has-block-params'; } function isKeyword(node) { if (isCall(node)) { return isHasBlock(node.path) || isHasBlockParams(node.path); } else if (isPath(node)) { return isHasBlock(node) || isHasBlockParams(node); } else { return false; } } function isCall(node) { return node.type === 'SubExpression' || node.type === 'MustacheStatement'; } function isPath(node) { return node.type === 'PathExpression'; } function destructureDynamicComponent(element) { var open = element.tag.charAt(0); var _element$tag$split = element.tag.split('.'), maybeLocal = _element$tag$split[0], rest = _element$tag$split.slice(1); var isNamedArgument = open === '@'; var isLocal = element.symbols.has(maybeLocal); var isThisPath = maybeLocal === 'this'; if (isLocal) { return { type: 'PathExpression', data: false, parts: [maybeLocal].concat(rest), this: false, original: element.tag, loc: element.loc }; } else if (isNamedArgument) { return { type: 'PathExpression', data: true, parts: [maybeLocal.slice(1)].concat(rest), this: false, original: element.tag, loc: element.loc }; } else if (isThisPath) { return { type: 'PathExpression', data: false, parts: rest, this: true, original: element.tag, loc: element.loc }; } else { return null; } } function isComponent(element) { var open = element.tag.charAt(0); var isPath = element.tag.indexOf('.') > -1; var isUpperCase = open === open.toUpperCase() && open !== open.toLowerCase(); return isUpperCase && !isPath || !!destructureDynamicComponent(element); } function isNamedBlock(element) { var open = element.tag.charAt(0); return open === ':'; } function assertIsSimplePath(path, loc, context) { if (path.type !== 'PathExpression') { throw new SyntaxError('`' + path.type + '` is not a valid ' + context + ' on line ' + loc.start.line + '.', path.loc); } if (!isSimplePath(path)) { throw new SyntaxError('`' + path.original + '` is not a valid name for a ' + context + ' on line ' + loc.start.line + '.', path.loc); } } function assertValidYield(statement) { var pairs = statement.hash.pairs; if (pairs.length === 1 && pairs[0].key !== 'to' || pairs.length > 1) { throw new SyntaxError('yield only takes a single named argument: \'to\'', statement.loc); } else if (pairs.length === 1 && pairs[0].value.type !== 'StringLiteral') { throw new SyntaxError('you can only yield to a literal value', statement.loc); } else if (pairs.length === 0) { return 'default'; } else { return pairs[0].value.value; } } function assertValidPartial(statement) { var params = statement.params, hash = statement.hash, escaped = statement.escaped, loc = statement.loc; if (params && params.length !== 1) { throw new SyntaxError('Partial found with no arguments. You must specify a template name. (on line ' + loc.start.line + ')', statement.loc); } else if (hash && hash.pairs.length > 0) { throw new SyntaxError('partial does not take any named arguments (on line ' + loc.start.line + ')', statement.loc); } else if (!escaped) { throw new SyntaxError('{{{partial ...}}} is not supported, please use {{partial ...}} instead (on line ' + loc.start.line + ')', statement.loc); } return params; } function assertValidHasBlockUsage(type, call) { var params = call.params, hash = call.hash, loc = call.loc; if (hash && hash.pairs.length > 0) { throw new SyntaxError(type + ' does not take any named arguments', call.loc); } if (params.length === 0) { return 'default'; } else if (params.length === 1) { var param = params[0]; if (param.type === 'StringLiteral') { return param.value; } else { throw new SyntaxError('you can only yield to a literal value (on line ' + loc.start.line + ')', call.loc); } } else { throw new SyntaxError(type + ' only takes a single positional argument (on line ' + loc.start.line + ')', call.loc); } } function assertValidDebuggerUsage(statement) { var params = statement.params, hash = statement.hash; if (hash && hash.pairs.length > 0) { throw new SyntaxError('debugger does not take any named arguments', statement.loc); } if (params.length === 0) { return 'default'; } else { throw new SyntaxError('debugger does not take any positional arguments', statement.loc); } } function mustacheContext(body) { if (body.type === 'PathExpression') { if (body.parts.length > 1 || body.data) { return "Expression" /* Expression */; } else { return "AppendSingleId" /* AppendSingleId */; } } else { return "Expression" /* Expression */; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi90ZW1wbGF0ZS1jb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQUEsZUFBQSxNQUFBLG9CQUFBO0FBQ0EsT0FBQSxrQkFBQSxNQUFBLHVCQUFBO0FBQ0EsU0FBQSxNQUFBLFFBQUEsZUFBQTtBQUNBLFNBQUEsU0FBQSxFQUFBLFdBQUEsUUFBQSxpQkFBQTtBQUNBLFNBQUEsZ0JBQUEsUUFBQSxTQUFBO0FBQ0EsU0FBQSxlQUFBLFFBQUEsb0JBQUE7O0FBSUEsU0FBQSxnQkFBQSxRQUFBLFlBQUE7QUFPQSxTQUFBLGNBQUEsQ0FBQSxLQUFBLEVBQWtDO0FBQ2hDLFdBQU8sTUFBQSxPQUFBLEtBQUEsU0FBQSxJQUErQixDQUFDLE1BQXZDLE9BQUE7QUFDRDtBQUVELE9BQU8sSUFBTSxPQUFOLENBQUE7O0lBRU8sZ0I7QUFxQlosOEJBQUEsTUFBQSxFQUFrQztBQUFBOztBQUFkLGFBQUEsTUFBQSxHQUFBLE1BQUE7QUFFWixhQUFBLFVBQUEsR0FBQSxDQUFBO0FBQ0EsYUFBQSxXQUFBLEdBQUEsRUFBQTtBQUNBLGFBQUEsT0FBQSxHQUFBLEVBQUE7QUFDQSxhQUFBLFNBQUEsR0FBQSxFQUFBO0FBQ0EsYUFBQSxXQUFBLEdBQUEsSUFBQTtBQU44Qjs7cUJBcEJ0QyxPLG9CQUFBLEcsRUFBQSxNLEVBQUEsTyxFQUEwRTtBQUN4RSxZQUFJLGtCQUFrQixJQUF0QixlQUFzQixFQUF0QjtBQUNBLHdCQUFBLEtBQUEsQ0FBQSxHQUFBO0FBRUEsWUFBSSxXQUFXLElBQUEsZ0JBQUEsQ0FBZixNQUFlLENBQWY7O0FBSndFLGdDQUt4QixTQUFBLE9BQUEsQ0FBaUIsZ0JBQWpFLE9BQWdELENBTHdCO0FBQUEsWUFLcEUsT0FMb0UscUJBS3BFLE9BTG9FO0FBQUEsWUFLcEUsaUJBTG9FLHFCQUt6RCxTQUx5RDs7QUFBQSx1QkFNMUIsSUFBQSxlQUFBLENBQUEsT0FB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LElBRDREOztBQUdoRSxRQUFJLFFBQVEsS0FBQSxLQUFBLENBQUEsTUFBQSxHQUFaLENBQUEsRUFBbUM7QUFDakMsY0FBTSxJQUFBLFdBQUEsK0NBQThELFVBQXBFLEdBQU0sQ0FBTjtBQUNEO0FBRUQsUUFBSSxPQUFBLE1BQUEsS0FBSixDQUFBLEVBQXlCO0FBQ3ZCLGVBQUEsU0FBQTtBQURGLEtBQUEsTUFFTztBQUNMLGNBQU0sSUFBQSxXQUFBLG9EQUFtRSxVQUF6RSxHQUFNLENBQU47QUFDRDtBQUNGO0FBRUQsU0FBQSxlQUFBLENBQUEsSUFBQSxFQUE2QztBQUMzQyxRQUFJLEtBQUEsSUFBQSxLQUFKLGdCQUFBLEVBQW9DO0FBQ2xDLFlBQUksS0FBQSxLQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBeUIsS0FBN0IsSUFBQSxFQUF3QztBQUN0QyxtQkFBQSxZQUFBLENBQUEsZ0JBQUE7QUFERixTQUFBLE1BRU87QUFDTCx1QkFBQSxnQkFBQSxDQUFBLG9CQUFBO0FBQ0Q7QUFMSCxLQUFBLE1BTU87QUFDTCxtQkFBQSxZQUFBLENBQUEsZ0JBQUE7QUFDRDtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVmlzaXRvciwgeyBBY3Rpb24gfSBmcm9tICcuL3RlbXBsYXRlLXZpc2l0b3InO1xuaW1wb3J0IEphdmFTY3JpcHRDb21waWxlciwgeyBUZW1wbGF0ZSB9IGZyb20gJy4vamF2YXNjcmlwdC1jb21waWxlcic7XG5pbXBvcnQgeyBhc3NlcnQsIE9wdGlvbiB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQVNULCBpc0xpdGVyYWwsIFN5bnRheEVycm9yIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmltcG9ydCB7IGdldEF0dHJOYW1lc3BhY2UgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFN5bWJvbEFsbG9jYXRvciB9IGZyb20gJy4vYWxsb2NhdGUtc3ltYm9scyc7XG5pbXBvcnQgeyBQcm9jZXNzb3IsIElucHV0T3BzLCBBbGxvY2F0ZVN5bWJvbHNPcHMsIE9wcywgU291cmNlTG9jYXRpb24gfSBmcm9tICcuL2NvbXBpbGVyLW9wcyc7XG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IEV4cHJlc3Npb25Db250ZXh0IH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBsb2NhdGlvblRvT2Zmc2V0IH0gZnJvbSAnLi9sb2NhdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZU9wdGlvbnMge1xuICBtZXRhPzogdW5rbm93bjtcbiAgY3VzdG9taXplQ29tcG9uZW50TmFtZT8odGFnOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlz