UNPKG

@glimmer/compiler

Version:
175 lines (142 loc) 17.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.convertPathToCallIfKeyword = convertPathToCallIfKeyword; exports.VISIT_EXPRS = exports.NormalizeExpressions = void 0; var _syntax = require("@glimmer/syntax"); var _util = require("@glimmer/util"); var _result = require("../../../shared/result"); var mir = _interopRequireWildcard(require("../../2-encoding/mir")); var _keywords = require("../keywords"); var _isNode = require("../utils/is-node"); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } class NormalizeExpressions { visit(node, state) { switch (node.type) { case 'Literal': return (0, _result.Ok)(this.Literal(node)); case 'Interpolate': return this.Interpolate(node, state); case 'Path': return this.PathExpression(node); case 'Call': let translated = _keywords.CALL_KEYWORDS.translate(node, state); if (translated !== null) { return translated; } return this.CallExpression(node, state); case 'DeprecatedCall': return this.DeprecaedCallExpression(node, state); } } visitList(nodes, state) { return new _result.ResultArray(nodes.map(e => VISIT_EXPRS.visit(e, state))).toOptionalList(); } /** * Normalize paths into `hir.Path` or a `hir.Expr` that corresponds to the ref. * * TODO since keywords don't support tails anyway, distinguish PathExpression from * VariableReference in ASTv2. */ PathExpression(path) { let ref = this.VariableReference(path.ref); let { tail } = path; if ((0, _util.isPresent)(tail)) { let tailLoc = tail[0].loc.extend(tail[tail.length - 1].loc); return (0, _result.Ok)(new mir.PathExpression({ loc: path.loc, head: ref, tail: new mir.Tail({ loc: tailLoc, members: tail }) })); } else { return (0, _result.Ok)(ref); } } VariableReference(ref) { return ref; } Literal(literal) { return literal; } Interpolate(expr, state) { let parts = expr.parts.map(convertPathToCallIfKeyword); return VISIT_EXPRS.visitList(parts, state).mapOk(parts => new mir.InterpolateExpression({ loc: expr.loc, parts: parts })); } CallExpression(expr, state) { if (!(0, _isNode.hasPath)(expr)) { throw new Error(`unimplemented subexpression at the head of a subexpression`); } else { return _result.Result.all(VISIT_EXPRS.visit(expr.callee, state), VISIT_EXPRS.Args(expr.args, state)).mapOk(([callee, args]) => new mir.CallExpression({ loc: expr.loc, callee, args })); } } DeprecaedCallExpression({ arg, callee, loc }, _state) { return (0, _result.Ok)(new mir.DeprecatedCallExpression({ loc, arg, callee })); } Args({ positional, named, loc }, state) { return _result.Result.all(this.Positional(positional, state), this.NamedArguments(named, state)).mapOk(([positional, named]) => new mir.Args({ loc, positional, named })); } Positional(positional, state) { return VISIT_EXPRS.visitList(positional.exprs, state).mapOk(list => new mir.Positional({ loc: positional.loc, list })); } NamedArguments(named, state) { let pairs = named.entries.map(arg => { let value = convertPathToCallIfKeyword(arg.value); return VISIT_EXPRS.visit(value, state).mapOk(value => new mir.NamedArgument({ loc: arg.loc, key: arg.name, value })); }); return new _result.ResultArray(pairs).toOptionalList().mapOk(pairs => new mir.NamedArguments({ loc: named.loc, entries: pairs })); } } exports.NormalizeExpressions = NormalizeExpressions; function convertPathToCallIfKeyword(path) { if (path.type === 'Path' && path.ref.type === 'Free' && path.ref.name in _syntax.KEYWORDS_TYPES) { return new _syntax.ASTv2.CallExpression({ callee: path, args: _syntax.ASTv2.Args.empty(path.loc), loc: path.loc }); } return path; } const VISIT_EXPRS = new NormalizeExpressions(); exports.VISIT_EXPRS = VISIT_EXPRS; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL3Zpc2l0b3JzL2V4cHJlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7OztBQUVNLE1BQUEsb0JBQUEsQ0FBMkI7QUFDL0IsRUFBQSxLQUFLLENBQUEsSUFBQSxFQUFBLEtBQUEsRUFBc0Q7QUFDekQsWUFBUSxJQUFJLENBQVosSUFBQTtBQUNFLFdBQUEsU0FBQTtBQUNFLGVBQU8sZ0JBQUcsS0FBQSxPQUFBLENBQVYsSUFBVSxDQUFILENBQVA7O0FBQ0YsV0FBQSxhQUFBO0FBQ0UsZUFBTyxLQUFBLFdBQUEsQ0FBQSxJQUFBLEVBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsTUFBQTtBQUNFLGVBQU8sS0FBQSxjQUFBLENBQVAsSUFBTyxDQUFQOztBQUNGLFdBQUEsTUFBQTtBQUNFLFlBQUksVUFBVSxHQUFHLHdCQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQWpCLEtBQWlCLENBQWpCOztBQUVBLFlBQUksVUFBVSxLQUFkLElBQUEsRUFBeUI7QUFDdkIsaUJBQUEsVUFBQTtBQUNEOztBQUVELGVBQU8sS0FBQSxjQUFBLENBQUEsSUFBQSxFQUFQLEtBQU8sQ0FBUDs7QUFDRixXQUFBLGdCQUFBO0FBQ0UsZUFBTyxLQUFBLHVCQUFBLENBQUEsSUFBQSxFQUFQLEtBQU8sQ0FBUDtBQWhCSjtBQWtCRDs7QUFVRCxFQUFBLFNBQVMsQ0FBQSxLQUFBLEVBQUEsS0FBQSxFQUVrQjtBQUV6QixXQUFPLElBQUEsbUJBQUEsQ0FBZ0IsS0FBSyxDQUFMLEdBQUEsQ0FBVyxDQUFELElBQU8sV0FBVyxDQUFYLEtBQUEsQ0FBQSxDQUFBLEVBQWpDLEtBQWlDLENBQWpCLENBQWhCLEVBQVAsY0FBTyxFQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7QUFNQSxFQUFB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QTJKM0IsU0FBQSwwQkFBQSxDQUFBLElBQUEsRUFBK0Q7QUFDbkUsTUFBSSxJQUFJLENBQUosSUFBQSxLQUFBLE1BQUEsSUFBd0IsSUFBSSxDQUFKLEdBQUEsQ0FBQSxJQUFBLEtBQXhCLE1BQUEsSUFBb0QsSUFBSSxDQUFKLEdBQUEsQ0FBQSxJQUFBLElBQXhELHNCQUFBLEVBQXlGO0FBQ3ZGLFdBQU8sSUFBSSxjQUFKLGNBQUEsQ0FBeUI7QUFDOUIsTUFBQSxNQUFNLEVBRHdCLElBQUE7QUFFOUIsTUFBQSxJQUFJLEVBQUUsY0FBQSxJQUFBLENBQUEsS0FBQSxDQUFpQixJQUFJLENBRkcsR0FFeEIsQ0FGd0I7QUFHOUIsTUFBQSxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBSG9CLEtBQXpCLENBQVA7QUFLRDs7QUFFRCxTQUFBLElBQUE7QUFDRDs7QUFFTSxNQUFNLFdBQVcsR0FBRyxJQUFwQixvQkFBb0IsRUFBcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcmVzZW50QXJyYXkgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFTVHYyLCBLRVlXT1JEU19UWVBFUyB9IGZyb20gJ0BnbGltbWVyL3N5bnRheCc7XG5pbXBvcnQgeyBpc1ByZXNlbnQgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgQW55T3B0aW9uYWxMaXN0LCBQcmVzZW50TGlzdCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9saXN0JztcbmltcG9ydCB7IE9rLCBSZXN1bHQsIFJlc3VsdEFycmF5IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3Jlc3VsdCc7XG5pbXBvcnQgKiBhcyBtaXIgZnJvbSAnLi4vLi4vMi1lbmNvZGluZy9taXInO1xuaW1wb3J0IHsgTm9ybWFsaXphdGlvblN0YXRlIH0gZnJvbSAnLi4vY29udGV4dCc7XG5pbXBvcnQgeyBDQUxMX0tFWVdPUkRTIH0gZnJvbSAnLi4va2V5d29yZHMnO1xuaW1wb3J0IHsgaGFzUGF0aCB9IGZyb20gJy4uL3V0aWxzL2lzLW5vZGUnO1xuXG5leHBvcnQgY2xhc3MgTm9ybWFsaXplRXhwcmVzc2lvbnMge1xuICB2aXNpdChub2RlOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSwgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSk6IFJlc3VsdDxtaXIuRXhwcmVzc2lvbk5vZGU+IHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnTGl0ZXJhbCc6XG4gICAgICAgIHJldHVybiBPayh0aGlzLkxpdGVyYWwobm9kZSkpO1xuICAgICAgY2FzZSAnSW50ZXJwb2xhdGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5JbnRlcnBvbGF0ZShub2RlLCBzdGF0ZSk7XG4gICAgICBjYXNlICdQYXRoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuUGF0aEV4cHJlc3Npb24obm9kZSk7XG4gICAgICBjYXNlICdDYWxsJzpcbiAgICAgICAgbGV0IHRyYW5zbGF0ZWQgPSBDQUxMX0tFWVdPUkRTLnRyYW5zbGF0ZShub2RlLCBzdGF0ZSk7XG5cbiAgICAgICAgaWYgKHRyYW5zbGF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLkNhbGxFeHByZXNzaW9uKG5vZGUsIHN0YXRlKTtcbiAgICAgIGNhc2UgJ0RlcHJlY2F0ZWRDYWxsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuRGVwcmVjYWVkQ2FsbEV4cHJlc3Npb24obm9kZSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0TGlzdChcbiAgICBub2RlczogUHJlc2VudEFycmF5PEFTVHYyLkV4cHJlc3Npb25Ob2RlPixcbiAgICBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlXG4gICk6IFJlc3VsdDxQcmVzZW50TGlzdDxtaXIuRXhwcmVzc2lvbk5vZGU+PjtcbiAgdmlzaXRMaXN0KFxuICAgIG5vZGVzOiByZWFkb25seSBBU1R2Mi5FeHByZXNzaW9uTm9kZVtdLFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PEFueU9wdGlvbmFsTGlzdDxtaXIuRXhwcmVzc2lvbk5vZGU+PjtcbiAgdmlzaXRMaXN0KFxuICAgIG5vZGVzOiByZWFkb25seSBBU1R2Mi5FeHByZXNzaW9uTm9kZVtdLFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PEFueU9wdGlvbmFsTGlzdDxtaXIuRXhwcmVzc2lvbk5vZGU+PiB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHRBcnJheShub2Rlcy5tYXAoKGUpID0+IFZJU0lUX0VYUFJTLnZpc2l0KGUsIHN0YXRlKSkpLnRvT3B0aW9uYWxMaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIHBhdGhzIGludG8gYGhpci5QYXRoYCBvciBhIGBoaXIuRXhwcmAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgcmVmLlxuICAgKlxuICAgKiBUT0RPIHNpbmNlIGtleXdvcmRzIGRvbid0IHN1cHBvcnQgdGFpbHMgYW55d2F5LCBkaXN0aW5ndWlzaCBQYXRoRXhwcmVzc2lvbiBmcm9tXG4gICAqIFZhcmlhYmxlUmVmZXJlbmNlIGluIEFTVHYyLlxuICAgKi9cbiAgUGF0aEV4cHJlc3Npb24ocGF0aDogQVNUdjIuUGF0aEV4cHJlc3Npb24pOiBSZXN1bHQ8bWlyLkV4cHJlc3Npb25Ob2RlPiB7XG4gICAgbGV0IHJlZiA9IHRoaXMuVmFyaWFibGVSZWZlcmVuY2UocGF0aC5yZWYpO1xuICAgIGxldCB7IHRhaWwgfSA9IHBhdGg7XG5cbiAgICBpZiAoaXNQcmVzZW50KHRhaWwpKSB7XG4gICAgICBsZXQgdGFpbExvYyA9IHRhaWxbMF0ubG9jLmV4dGVuZCh0YWlsW3RhaWwubGVuZ3RoIC0gMV0ubG9jKTtcbiAgICAgIHJldHVybiBPayhcbiAgICAgICAgbmV3IG1pci5QYXRoRXhwcmVzc2lvbih7XG4gICAgICAgICAgbG9jOiBwYXRoLmxvYyxcbiAgICAgICAgICBoZWFkOiByZWYsXG4gICAgICAgICAgdGFpbDogbmV3IG1pci5UYWlsKHsgbG9jOiB0YWlsTG9jLCBtZW1iZXJzOiB0YWlsIH0pLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE9rKHJlZik7XG4gICAgfVxuICB9XG5cbiAgVmFyaWFibGVSZWZlcmVuY2UocmVmOiBBU1R2Mi5WYXJpYWJsZVJlZmVyZW5jZSk6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgTGl0ZXJhbChsaXRlcmFsOiBBU1R2Mi5MaXRlcmFsRXhwcmVzc2lvbik6IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbGl0ZXJhbDtcbiAgfVxuXG4gIEludGVycG9sYXRlKFxuICAgIGV4cHI6IEFTVHYyLkludGVycG9sYXRlRXhwcmVzc2lvbixcbiAgICBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlXG4gICk6IFJlc3VsdDxtaXIuSW50ZXJwb2xhdGVFeHByZXNzaW9uPiB7XG4gICAgbGV0IHBhcnRzID0gZXhwci5wYXJ0cy5tYXAoY29udmVydFBhdGhUb0NhbGxJZktleXdvcmQpIGFzIFByZXNlbnRBcnJheTxBU1R2Mi5FeHByZXNzaW9uTm9kZT47XG5cbiAgICByZXR1cm4gVklTSVRfRVhQUlMudmlzaXRMaXN0KHBhcnRzLCBzdGF0ZSkubWFwT2soXG4gICAgICAocGFydHMpID0+IG5ldyBtaXIuSW50ZXJwb2xhdGVFeHByZXNzaW9uKHsgbG9jOiBleHByLmxvYywgcGFydHM6IHBhcnRzIH0pXG4gICAgKTtcbiAgfVxuXG4gIENhbGxFeHByZXNzaW9uKFxuICAgIGV4cHI6IEFTVHYyLkNhbGxFeHByZXNzaW9uLFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PG1pci5FeHByZXNzaW9uTm9kZT4ge1xuICAgIGlmICghaGFzUGF0aChleHByKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmltcGxlbWVudGVkIHN1YmV4cHJlc3Npb24gYXQgdGhlIGhlYWQgb2YgYSBzdWJleHByZXNzaW9uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBSZXN1bHQuYWxsKFxuICAgICAgICBWSVNJVF9FWFBSUy52aXNpdChleHByLmNhbGxlZSwgc3RhdGUpLFxuICAgICAgICBWSVNJVF9FWFBSUy5BcmdzKGV4cHIuYXJncywgc3RhdGUpXG4gICAgICApLm1hcE9rKFxuICAgICAgICAoW2NhbGxlZSwgYXJnc10pID0+XG4gICAgICAgICAgbmV3IG1pci5DYWxsRXhwcmVzc2lvbih7XG4gICAgICAgICAgICBsb2M6IGV4cHIubG9jLFxuICAgICAgICAgICAgY2FsbGVlLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBEZXByZWNhZWRDYWxsRXhwcmVzc2lvbihcbiAgICB7IGFyZywgY2FsbGVlLCBsb2MgfTogQVNUdjIuRGVwcmVjYXRlZENhbGxFeHByZXNzaW9uLFxuICAgIF9zdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlXG4gICk6IFJlc3VsdDxtaXIuRXhwcmVzc2lvbk5vZGU+IHtcbiAgICByZXR1cm4gT2sobmV3IG1pci5EZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24oeyBsb2MsIGFyZywgY2FsbGVlIH0pKTtcbiAgfVxuXG4gIEFyZ3MoeyBwb3NpdGlvbmFsLCBuYW1lZCwgbG9jIH06IEFTVHYyLkFyZ3MsIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGUpOiBSZXN1bHQ8bWlyLkFyZ3M+IHtcbiAgICByZXR1cm4gUmVzdWx0LmFsbCh0aGlzLlBvc2l0aW9uYWwocG9zaXRpb25hbCwgc3RhdGUpLCB0aGlzLk5hbWVkQXJndW1lbnRzKG5hbWVkLCBzdGF0ZSkpLm1hcE9rKFxuICAgICAgKFtwb3NpdGlvbmFsLCBuYW1lZF0pID0+XG4gICAgICAgIG5ldyBtaXIuQXJncyh7XG4gICAgICAgICAgbG9jLFxuICAgICAgICAgIHBvc2l0aW9uYWwsXG4gICAgICAgICAgbmFtZWQsXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIFBvc2l0aW9uYWwoXG4gICAgcG9zaXRpb25hbDogQVNUdjIuUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgICBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlXG4gICk6IFJlc3VsdDxtaXIuUG9zaXRpb25hbD4ge1xuICAgIHJldHVybiBWSVNJVF9FWFBSUy52aXNpdExpc3QocG9zaXRpb25hbC5leHBycywgc3RhdGUpLm1hcE9rKFxuICAgICAgKGxpc3QpID0+XG4gICAgICAgIG5ldyBtaXIuUG9zaXRpb25hbCh7XG4gICAgICAgICAgbG9jOiBwb3NpdGlvbmFsLmxvYyxcbiAgICAgICAgICBsaXN0LFxuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBOYW1lZEFyZ3VtZW50cyhcbiAgICBuYW1lZDogQVNUdjIuTmFtZWRBcmd1bWVudHMsXG4gICAgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZVxuICApOiBSZXN1bHQ8bWlyLk5hbWVkQXJndW1lbnRzPiB7XG4gICAgbGV0IHBhaXJzID0gbmFtZWQuZW50cmllcy5tYXAoKGFyZykgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gY29udmVydFBhdGhUb0NhbGxJZktleXdvcmQoYXJnLnZhbHVlKTtcblxuICAgICAgcmV0dXJuIFZJU0lUX0VYUFJTLnZpc2l0KHZhbHVlLCBzdGF0ZSkubWFwT2soXG4gICAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgICBuZXcgbWlyLk5hbWVkQXJndW1lbnQoe1xuICAgICAgICAgICAgbG9jOiBhcmcubG9jLFxuICAgICAgICAgICAga2V5OiBhcmcubmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBSZXN1bHRBcnJheShwYWlycylcbiAgICAgIC50b09wdGlvbmFsTGlzdCgpXG4gICAgICAubWFwT2soKHBhaXJzKSA9PiBuZXcgbWlyLk5hbWVkQXJndW1lbnRzKHsgbG9jOiBuYW1lZC5sb2MsIGVudHJpZXM6IHBhaXJzIH0pKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFBhdGhUb0NhbGxJZktleXdvcmQocGF0aDogQVNUdjIuRXhwcmVzc2lvbk5vZGUpOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSB7XG4gIGlmIChwYXRoLnR5cGUgPT09ICdQYXRoJyAmJiBwYXRoLnJlZi50eXBlID09PSAnRnJlZScgJiYgcGF0aC5yZWYubmFtZSBpbiBLRVlXT1JEU19UWVBFUykge1xuICAgIHJldHVybiBuZXcgQVNUdjIuQ2FsbEV4cHJlc3Npb24oe1xuICAgICAgY2FsbGVlOiBwYXRoLFxuICAgICAgYXJnczogQVNUdjIuQXJncy5lbXB0eShwYXRoLmxvYyksXG4gICAgICBsb2M6IHBhdGgubG9jLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBjb25zdCBWSVNJVF9FWFBSUyA9IG5ldyBOb3JtYWxpemVFeHByZXNzaW9ucygpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==