UNPKG

@glimmer/compiler

Version:
152 lines (132 loc) 16.8 kB
import { ASTv2, KEYWORDS_TYPES } from '@glimmer/syntax'; import { isPresent } from '@glimmer/util'; import { Ok, Result, ResultArray } from '../../../shared/result'; import * as mir from '../../2-encoding/mir'; import { CALL_KEYWORDS } from '../keywords'; import { hasPath } from '../utils/is-node'; export class NormalizeExpressions { visit(node, state) { switch (node.type) { case 'Literal': return Ok(this.Literal(node)); case 'Interpolate': return this.Interpolate(node, state); case 'Path': return this.PathExpression(node); case 'Call': let translated = 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 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 (isPresent(tail)) { let tailLoc = tail[0].loc.extend(tail[tail.length - 1].loc); return Ok(new mir.PathExpression({ loc: path.loc, head: ref, tail: new mir.Tail({ loc: tailLoc, members: tail }) })); } else { return 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 (!hasPath(expr)) { throw new Error(`unimplemented subexpression at the head of a subexpression`); } else { return 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 Ok(new mir.DeprecatedCallExpression({ loc, arg, callee })); } Args({ positional, named, loc }, state) { return 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 ResultArray(pairs).toOptionalList().mapOk(pairs => new mir.NamedArguments({ loc: named.loc, entries: pairs })); } } export function convertPathToCallIfKeyword(path) { if (path.type === 'Path' && path.ref.type === 'Free' && path.ref.name in KEYWORDS_TYPES) { return new ASTv2.CallExpression({ callee: path, args: ASTv2.Args.empty(path.loc), loc: path.loc }); } return path; } export const VISIT_EXPRS = new NormalizeExpressions(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMS1ub3JtYWxpemF0aW9uL3Zpc2l0b3JzL2V4cHJlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQVMsS0FBVCxFQUFnQixjQUFoQixRQUFzQyxpQkFBdEM7QUFDQSxTQUFTLFNBQVQsUUFBMEIsZUFBMUI7QUFHQSxTQUFTLEVBQVQsRUFBYSxNQUFiLEVBQXFCLFdBQXJCLFFBQXdDLHdCQUF4QztBQUNBLE9BQU8sS0FBSyxHQUFaLE1BQXFCLHNCQUFyQjtBQUVBLFNBQVMsYUFBVCxRQUE4QixhQUE5QjtBQUNBLFNBQVMsT0FBVCxRQUF3QixrQkFBeEI7QUFFQSxPQUFNLE1BQU8sb0JBQVAsQ0FBMkI7QUFDL0IsRUFBQSxLQUFLLENBQUMsSUFBRCxFQUE2QixLQUE3QixFQUFzRDtBQUN6RCxZQUFRLElBQUksQ0FBQyxJQUFiO0FBQ0UsV0FBSyxTQUFMO0FBQ0UsZUFBTyxFQUFFLENBQUMsS0FBSyxPQUFMLENBQWEsSUFBYixDQUFELENBQVQ7O0FBQ0YsV0FBSyxhQUFMO0FBQ0UsZUFBTyxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsRUFBdUIsS0FBdkIsQ0FBUDs7QUFDRixXQUFLLE1BQUw7QUFDRSxlQUFPLEtBQUssY0FBTCxDQUFvQixJQUFwQixDQUFQOztBQUNGLFdBQUssTUFBTDtBQUNFLFlBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQyxTQUFkLENBQXdCLElBQXhCLEVBQThCLEtBQTlCLENBQWpCOztBQUVBLFlBQUksVUFBVSxLQUFLLElBQW5CLEVBQXlCO0FBQ3ZCLGlCQUFPLFVBQVA7QUFDRDs7QUFFRCxlQUFPLEtBQUssY0FBTCxDQUFvQixJQUFwQixFQUEwQixLQUExQixDQUFQOztBQUNGLFdBQUssZ0JBQUw7QUFDRSxlQUFPLEtBQUssdUJBQUwsQ0FBNkIsSUFBN0IsRUFBbUMsS0FBbkMsQ0FBUDtBQWhCSjtBQWtCRDs7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QUFFLEdBQUcsQ0FBQyxJQUZXO0FBR3BCLFFBQUE7QUFIb0IsT0FBdEIsQ0FGRyxDQUFQO0FBUUQsS0FYVyxDQUFaO0FBYUEsV0FBTyxJQUFJLFdBQUosQ0FBZ0IsS0FBaEIsRUFDSixjQURJLEdBRUosS0FGSSxDQUVHLEtBQUQsSUFBVyxJQUFJLEdBQUcsQ0FBQyxjQUFSLENBQXVCO0FBQUUsTUFBQSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQWI7QUFBa0IsTUFBQSxPQUFPLEVBQUU7QUFBM0IsS0FBdkIsQ0FGYixDQUFQO0FBR0Q7O0FBeEo4QjtBQTJKakMsT0FBTSxTQUFVLDBCQUFWLENBQXFDLElBQXJDLEVBQStEO0FBQ25FLE1BQUksSUFBSSxDQUFDLElBQUwsS0FBYyxNQUFkLElBQXdCLElBQUksQ0FBQyxHQUFMLENBQVMsSUFBVCxLQUFrQixNQUExQyxJQUFvRCxJQUFJLENBQUMsR0FBTCxDQUFTLElBQVQsSUFBaUIsY0FBekUsRUFBeUY7QUFDdkYsV0FBTyxJQUFJLEtBQUssQ0FBQyxjQUFWLENBQXlCO0FBQzlCLE1BQUEsTUFBTSxFQUFFLElBRHNCO0FBRTlCLE1BQUEsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFOLENBQVcsS0FBWCxDQUFpQixJQUFJLENBQUMsR0FBdEIsQ0FGd0I7QUFHOUIsTUFBQSxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBSG9CLEtBQXpCLENBQVA7QUFLRDs7QUFFRCxTQUFPLElBQVA7QUFDRDtBQUVELE9BQU8sTUFBTSxXQUFXLEdBQUcsSUFBSSxvQkFBSixFQUFwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZXNlbnRBcnJheSB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQVNUdjIsIEtFWVdPUkRTX1RZUEVTIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmltcG9ydCB7IGlzUHJlc2VudCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBBbnlPcHRpb25hbExpc3QsIFByZXNlbnRMaXN0IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2xpc3QnO1xuaW1wb3J0IHsgT2ssIFJlc3VsdCwgUmVzdWx0QXJyYXkgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvcmVzdWx0JztcbmltcG9ydCAqIGFzIG1pciBmcm9tICcuLi8uLi8yLWVuY29kaW5nL21pcic7XG5pbXBvcnQgeyBOb3JtYWxpemF0aW9uU3RhdGUgfSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCB7IENBTExfS0VZV09SRFMgfSBmcm9tICcuLi9rZXl3b3Jkcyc7XG5pbXBvcnQgeyBoYXNQYXRoIH0gZnJvbSAnLi4vdXRpbHMvaXMtbm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBOb3JtYWxpemVFeHByZXNzaW9ucyB7XG4gIHZpc2l0KG5vZGU6IEFTVHYyLkV4cHJlc3Npb25Ob2RlLCBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlKTogUmVzdWx0PG1pci5FeHByZXNzaW9uTm9kZT4ge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgICAgcmV0dXJuIE9rKHRoaXMuTGl0ZXJhbChub2RlKSk7XG4gICAgICBjYXNlICdJbnRlcnBvbGF0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLkludGVycG9sYXRlKG5vZGUsIHN0YXRlKTtcbiAgICAgIGNhc2UgJ1BhdGgnOlxuICAgICAgICByZXR1cm4gdGhpcy5QYXRoRXhwcmVzc2lvbihub2RlKTtcbiAgICAgIGNhc2UgJ0NhbGwnOlxuICAgICAgICBsZXQgdHJhbnNsYXRlZCA9IENBTExfS0VZV09SRFMudHJhbnNsYXRlKG5vZGUsIHN0YXRlKTtcblxuICAgICAgICBpZiAodHJhbnNsYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuQ2FsbEV4cHJlc3Npb24obm9kZSwgc3RhdGUpO1xuICAgICAgY2FzZSAnRGVwcmVjYXRlZENhbGwnOlxuICAgICAgICByZXR1cm4gdGhpcy5EZXByZWNhZWRDYWxsRXhwcmVzc2lvbihub2RlLCBzdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRMaXN0KFxuICAgIG5vZGVzOiBQcmVzZW50QXJyYXk8QVNUdjIuRXhwcmVzc2lvbk5vZGU+LFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PFByZXNlbnRMaXN0PG1pci5FeHByZXNzaW9uTm9kZT4+O1xuICB2aXNpdExpc3QoXG4gICAgbm9kZXM6IHJlYWRvbmx5IEFTVHYyLkV4cHJlc3Npb25Ob2RlW10sXG4gICAgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZVxuICApOiBSZXN1bHQ8QW55T3B0aW9uYWxMaXN0PG1pci5FeHByZXNzaW9uTm9kZT4+O1xuICB2aXNpdExpc3QoXG4gICAgbm9kZXM6IHJlYWRvbmx5IEFTVHYyLkV4cHJlc3Npb25Ob2RlW10sXG4gICAgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZVxuICApOiBSZXN1bHQ8QW55T3B0aW9uYWxMaXN0PG1pci5FeHByZXNzaW9uTm9kZT4+IHtcbiAgICByZXR1cm4gbmV3IFJlc3VsdEFycmF5KG5vZGVzLm1hcCgoZSkgPT4gVklTSVRfRVhQUlMudmlzaXQoZSwgc3RhdGUpKSkudG9PcHRpb25hbExpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgcGF0aHMgaW50byBgaGlyLlBhdGhgIG9yIGEgYGhpci5FeHByYCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByZWYuXG4gICAqXG4gICAqIFRPRE8gc2luY2Uga2V5d29yZHMgZG9uJ3Qgc3VwcG9ydCB0YWlscyBhbnl3YXksIGRpc3Rpbmd1aXNoIFBhdGhFeHByZXNzaW9uIGZyb21cbiAgICogVmFyaWFibGVSZWZlcmVuY2UgaW4gQVNUdjIuXG4gICAqL1xuICBQYXRoRXhwcmVzc2lvbihwYXRoOiBBU1R2Mi5QYXRoRXhwcmVzc2lvbik6IFJlc3VsdDxtaXIuRXhwcmVzc2lvbk5vZGU+IHtcbiAgICBsZXQgcmVmID0gdGhpcy5WYXJpYWJsZVJlZmVyZW5jZShwYXRoLnJlZik7XG4gICAgbGV0IHsgdGFpbCB9ID0gcGF0aDtcblxuICAgIGlmIChpc1ByZXNlbnQodGFpbCkpIHtcbiAgICAgIGxldCB0YWlsTG9jID0gdGFpbFswXS5sb2MuZXh0ZW5kKHRhaWxbdGFpbC5sZW5ndGggLSAxXS5sb2MpO1xuICAgICAgcmV0dXJuIE9rKFxuICAgICAgICBuZXcgbWlyLlBhdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICBsb2M6IHBhdGgubG9jLFxuICAgICAgICAgIGhlYWQ6IHJlZixcbiAgICAgICAgICB0YWlsOiBuZXcgbWlyLlRhaWwoeyBsb2M6IHRhaWxMb2MsIG1lbWJlcnM6IHRhaWwgfSksXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gT2socmVmKTtcbiAgICB9XG4gIH1cblxuICBWYXJpYWJsZVJlZmVyZW5jZShyZWY6IEFTVHYyLlZhcmlhYmxlUmVmZXJlbmNlKTogQVNUdjIuVmFyaWFibGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiByZWY7XG4gIH1cblxuICBMaXRlcmFsKGxpdGVyYWw6IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uKTogQVNUdjIuTGl0ZXJhbEV4cHJlc3Npb24ge1xuICAgIHJldHVybiBsaXRlcmFsO1xuICB9XG5cbiAgSW50ZXJwb2xhdGUoXG4gICAgZXhwcjogQVNUdjIuSW50ZXJwb2xhdGVFeHByZXNzaW9uLFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PG1pci5JbnRlcnBvbGF0ZUV4cHJlc3Npb24+IHtcbiAgICBsZXQgcGFydHMgPSBleHByLnBhcnRzLm1hcChjb252ZXJ0UGF0aFRvQ2FsbElmS2V5d29yZCkgYXMgUHJlc2VudEFycmF5PEFTVHYyLkV4cHJlc3Npb25Ob2RlPjtcblxuICAgIHJldHVybiBWSVNJVF9FWFBSUy52aXNpdExpc3QocGFydHMsIHN0YXRlKS5tYXBPayhcbiAgICAgIChwYXJ0cykgPT4gbmV3IG1pci5JbnRlcnBvbGF0ZUV4cHJlc3Npb24oeyBsb2M6IGV4cHIubG9jLCBwYXJ0czogcGFydHMgfSlcbiAgICApO1xuICB9XG5cbiAgQ2FsbEV4cHJlc3Npb24oXG4gICAgZXhwcjogQVNUdjIuQ2FsbEV4cHJlc3Npb24sXG4gICAgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZVxuICApOiBSZXN1bHQ8bWlyLkV4cHJlc3Npb25Ob2RlPiB7XG4gICAgaWYgKCFoYXNQYXRoKGV4cHIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaW1wbGVtZW50ZWQgc3ViZXhwcmVzc2lvbiBhdCB0aGUgaGVhZCBvZiBhIHN1YmV4cHJlc3Npb25gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFJlc3VsdC5hbGwoXG4gICAgICAgIFZJU0lUX0VYUFJTLnZpc2l0KGV4cHIuY2FsbGVlLCBzdGF0ZSksXG4gICAgICAgIFZJU0lUX0VYUFJTLkFyZ3MoZXhwci5hcmdzLCBzdGF0ZSlcbiAgICAgICkubWFwT2soXG4gICAgICAgIChbY2FsbGVlLCBhcmdzXSkgPT5cbiAgICAgICAgICBuZXcgbWlyLkNhbGxFeHByZXNzaW9uKHtcbiAgICAgICAgICAgIGxvYzogZXhwci5sb2MsXG4gICAgICAgICAgICBjYWxsZWUsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIERlcHJlY2FlZENhbGxFeHByZXNzaW9uKFxuICAgIHsgYXJnLCBjYWxsZWUsIGxvYyB9OiBBU1R2Mi5EZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24sXG4gICAgX3N0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PG1pci5FeHByZXNzaW9uTm9kZT4ge1xuICAgIHJldHVybiBPayhuZXcgbWlyLkRlcHJlY2F0ZWRDYWxsRXhwcmVzc2lvbih7IGxvYywgYXJnLCBjYWxsZWUgfSkpO1xuICB9XG5cbiAgQXJncyh7IHBvc2l0aW9uYWwsIG5hbWVkLCBsb2MgfTogQVNUdjIuQXJncywgc3RhdGU6IE5vcm1hbGl6YXRpb25TdGF0ZSk6IFJlc3VsdDxtaXIuQXJncz4ge1xuICAgIHJldHVybiBSZXN1bHQuYWxsKHRoaXMuUG9zaXRpb25hbChwb3NpdGlvbmFsLCBzdGF0ZSksIHRoaXMuTmFtZWRBcmd1bWVudHMobmFtZWQsIHN0YXRlKSkubWFwT2soXG4gICAgICAoW3Bvc2l0aW9uYWwsIG5hbWVkXSkgPT5cbiAgICAgICAgbmV3IG1pci5BcmdzKHtcbiAgICAgICAgICBsb2MsXG4gICAgICAgICAgcG9zaXRpb25hbCxcbiAgICAgICAgICBuYW1lZCxcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgUG9zaXRpb25hbChcbiAgICBwb3NpdGlvbmFsOiBBU1R2Mi5Qb3NpdGlvbmFsQXJndW1lbnRzLFxuICAgIHN0YXRlOiBOb3JtYWxpemF0aW9uU3RhdGVcbiAgKTogUmVzdWx0PG1pci5Qb3NpdGlvbmFsPiB7XG4gICAgcmV0dXJuIFZJU0lUX0VYUFJTLnZpc2l0TGlzdChwb3NpdGlvbmFsLmV4cHJzLCBzdGF0ZSkubWFwT2soXG4gICAgICAobGlzdCkgPT5cbiAgICAgICAgbmV3IG1pci5Qb3NpdGlvbmFsKHtcbiAgICAgICAgICBsb2M6IHBvc2l0aW9uYWwubG9jLFxuICAgICAgICAgIGxpc3QsXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIE5hbWVkQXJndW1lbnRzKFxuICAgIG5hbWVkOiBBU1R2Mi5OYW1lZEFyZ3VtZW50cyxcbiAgICBzdGF0ZTogTm9ybWFsaXphdGlvblN0YXRlXG4gICk6IFJlc3VsdDxtaXIuTmFtZWRBcmd1bWVudHM+IHtcbiAgICBsZXQgcGFpcnMgPSBuYW1lZC5lbnRyaWVzLm1hcCgoYXJnKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBjb252ZXJ0UGF0aFRvQ2FsbElmS2V5d29yZChhcmcudmFsdWUpO1xuXG4gICAgICByZXR1cm4gVklTSVRfRVhQUlMudmlzaXQodmFsdWUsIHN0YXRlKS5tYXBPayhcbiAgICAgICAgKHZhbHVlKSA9PlxuICAgICAgICAgIG5ldyBtaXIuTmFtZWRBcmd1bWVudCh7XG4gICAgICAgICAgICBsb2M6IGFyZy5sb2MsXG4gICAgICAgICAgICBrZXk6IGFyZy5uYW1lLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFJlc3VsdEFycmF5KHBhaXJzKVxuICAgICAgLnRvT3B0aW9uYWxMaXN0KClcbiAgICAgIC5tYXBPaygocGFpcnMpID0+IG5ldyBtaXIuTmFtZWRBcmd1bWVudHMoeyBsb2M6IG5hbWVkLmxvYywgZW50cmllczogcGFpcnMgfSkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0UGF0aFRvQ2FsbElmS2V5d29yZChwYXRoOiBBU1R2Mi5FeHByZXNzaW9uTm9kZSk6IEFTVHYyLkV4cHJlc3Npb25Ob2RlIHtcbiAgaWYgKHBhdGgudHlwZSA9PT0gJ1BhdGgnICYmIHBhdGgucmVmLnR5cGUgPT09ICdGcmVlJyAmJiBwYXRoLnJlZi5uYW1lIGluIEtFWVdPUkRTX1RZUEVTKSB7XG4gICAgcmV0dXJuIG5ldyBBU1R2Mi5DYWxsRXhwcmVzc2lvbih7XG4gICAgICBjYWxsZWU6IHBhdGgsXG4gICAgICBhcmdzOiBBU1R2Mi5BcmdzLmVtcHR5KHBhdGgubG9jKSxcbiAgICAgIGxvYzogcGF0aC5sb2MsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGNvbnN0IFZJU0lUX0VYUFJTID0gbmV3IE5vcm1hbGl6ZUV4cHJlc3Npb25zKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9