UNPKG

@glimmer/compiler

Version:
383 lines (313 loc) 29.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CONTENT = exports.ContentEncoder = void 0; var _util = require("@glimmer/util"); var _utils = require("../../utils"); var _expressions = require("./expressions"); class WireStatements { constructor(statements) { this.statements = statements; } toArray() { return this.statements; } } class ContentEncoder { list(statements) { let out = []; for (let statement of statements) { let result = CONTENT.content(statement); if (result && result instanceof WireStatements) { out.push(...result.toArray()); } else { out.push(result); } } return out; } content(stmt) { if (false /* LOCAL_SHOULD_LOG */ ) { _util.LOCAL_LOGGER.log(`encoding`, stmt); } return this.visitContent(stmt); } visitContent(stmt) { switch (stmt.type) { case 'Debugger': return [26 /* Debugger */ , stmt.scope.getEvalInfo()]; case 'AppendComment': return this.AppendComment(stmt); case 'AppendTextNode': return this.AppendTextNode(stmt); case 'AppendTrustedHTML': return this.AppendTrustedHTML(stmt); case 'Yield': return this.Yield(stmt); case 'Component': return this.Component(stmt); case 'SimpleElement': return this.SimpleElement(stmt); case 'InElement': return this.InElement(stmt); case 'InvokeBlock': return this.InvokeBlock(stmt); case 'If': return this.If(stmt); case 'Each': return this.Each(stmt); case 'With': return this.With(stmt); case 'Let': return this.Let(stmt); case 'WithDynamicVars': return this.WithDynamicVars(stmt); case 'InvokeComponent': return this.InvokeComponent(stmt); default: return (0, _util.exhausted)(stmt); } } Yield({ to, positional }) { return [18 /* Yield */ , to, _expressions.EXPR.Positional(positional)]; } InElement({ guid, insertBefore, destination, block }) { let wireBlock = CONTENT.NamedBlock(block)[1]; // let guid = args.guid; let wireDestination = _expressions.EXPR.expr(destination); let wireInsertBefore = _expressions.EXPR.expr(insertBefore); if (wireInsertBefore === undefined) { return [40 /* InElement */ , wireBlock, guid, wireDestination]; } else { return [40 /* InElement */ , wireBlock, guid, wireDestination, wireInsertBefore]; } } InvokeBlock({ head, args, blocks }) { return [6 /* Block */ , _expressions.EXPR.expr(head), ..._expressions.EXPR.Args(args), CONTENT.NamedBlocks(blocks)]; } AppendTrustedHTML({ html }) { return [2 /* TrustingAppend */ , _expressions.EXPR.expr(html)]; } AppendTextNode({ text }) { return [1 /* Append */ , _expressions.EXPR.expr(text)]; } AppendComment({ value }) { return [3 /* Comment */ , value.chars]; } SimpleElement({ tag, params, body, dynamicFeatures }) { let op = dynamicFeatures ? 11 /* OpenElementWithSplat */ : 10 /* OpenElement */ ; return new WireStatements([[op, (0, _utils.deflateTagName)(tag.chars)], ...CONTENT.ElementParameters(params).toArray(), [12 /* FlushElement */ ], ...CONTENT.list(body), [13 /* CloseElement */ ]]); } Component({ tag, params, args, blocks }) { let wireTag = _expressions.EXPR.expr(tag); let wirePositional = CONTENT.ElementParameters(params); let wireNamed = _expressions.EXPR.NamedArguments(args); let wireNamedBlocks = CONTENT.NamedBlocks(blocks); return [8 /* Component */ , wireTag, wirePositional.toPresentArray(), wireNamed, wireNamedBlocks]; } ElementParameters({ body }) { return body.map(p => CONTENT.ElementParameter(p)); } ElementParameter(param) { switch (param.type) { case 'SplatAttr': return [17 /* AttrSplat */ , param.symbol]; case 'DynamicAttr': return [dynamicAttrOp(param.kind), ...dynamicAttr(param)]; case 'StaticAttr': return [staticAttrOp(param.kind), ...staticAttr(param)]; case 'Modifier': return [4 /* Modifier */ , _expressions.EXPR.expr(param.callee), ..._expressions.EXPR.Args(param.args)]; } } NamedBlocks({ blocks }) { let names = []; let serializedBlocks = []; for (let block of blocks.toArray()) { let [name, serializedBlock] = CONTENT.NamedBlock(block); names.push(name); serializedBlocks.push(serializedBlock); } return names.length > 0 ? [names, serializedBlocks] : null; } NamedBlock({ name, body, scope }) { let nameChars = name.chars; if (nameChars === 'inverse') { nameChars = 'else'; } return [nameChars, [CONTENT.list(body), scope.slots]]; } If({ condition, block, inverse }) { return [41 /* If */ , _expressions.EXPR.expr(condition), CONTENT.NamedBlock(block)[1], inverse ? CONTENT.NamedBlock(inverse)[1] : null]; } Each({ value, key, block, inverse }) { return [42 /* Each */ , _expressions.EXPR.expr(value), key ? _expressions.EXPR.expr(key) : null, CONTENT.NamedBlock(block)[1], inverse ? CONTENT.NamedBlock(inverse)[1] : null]; } With({ value, block, inverse }) { return [43 /* With */ , _expressions.EXPR.expr(value), CONTENT.NamedBlock(block)[1], inverse ? CONTENT.NamedBlock(inverse)[1] : null]; } Let({ positional, block }) { return [44 /* Let */ , _expressions.EXPR.Positional(positional), CONTENT.NamedBlock(block)[1]]; } WithDynamicVars({ named, block }) { return [45 /* WithDynamicVars */ , _expressions.EXPR.NamedArguments(named), CONTENT.NamedBlock(block)[1]]; } InvokeComponent({ definition, args, blocks }) { return [46 /* InvokeComponent */ , _expressions.EXPR.expr(definition), _expressions.EXPR.Positional(args.positional), _expressions.EXPR.NamedArguments(args.named), blocks ? CONTENT.NamedBlocks(blocks) : null]; } } exports.ContentEncoder = ContentEncoder; const CONTENT = new ContentEncoder(); exports.CONTENT = CONTENT; function staticAttr({ name, value, namespace }) { let out = [(0, _utils.deflateAttrName)(name.chars), value.chars]; if (namespace) { out.push(namespace); } return out; } function dynamicAttr({ name, value, namespace }) { let out = [(0, _utils.deflateAttrName)(name.chars), _expressions.EXPR.expr(value)]; if (namespace) { out.push(namespace); } return out; } function staticAttrOp(kind) { if (kind.component) { return 24 /* StaticComponentAttr */ ; } else { return 14 /* StaticAttr */ ; } } function dynamicAttrOp(kind) { if (kind.component) { return kind.trusting ? 23 /* TrustingComponentAttr */ : 16 /* ComponentAttr */ ; } else { return kind.trusting ? 22 /* TrustingDynamicAttr */ : 15 /* DynamicAttr */ ; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMi1lbmNvZGluZy9jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQTs7QUFHQTs7QUFDQTs7QUFHQSxNQUFBLGNBQUEsQ0FBb0I7QUFDbEIsRUFBQSxXQUFBLENBQUEsVUFBQSxFQUE0QztBQUF4QixTQUFBLFVBQUEsR0FBQSxVQUFBO0FBQTRCOztBQUVoRCxFQUFBLE9BQU8sR0FBQTtBQUNMLFdBQU8sS0FBUCxVQUFBO0FBQ0Q7O0FBTGlCOztBQVFkLE1BQUEsY0FBQSxDQUFxQjtBQUN6QixFQUFBLElBQUksQ0FBQSxVQUFBLEVBQTRCO0FBQzlCLFFBQUksR0FBRyxHQUFQLEVBQUE7O0FBRUEsU0FBSyxJQUFMLFNBQUEsSUFBQSxVQUFBLEVBQWtDO0FBQ2hDLFVBQUksTUFBTSxHQUFHLE9BQU8sQ0FBUCxPQUFBLENBQWIsU0FBYSxDQUFiOztBQUVBLFVBQUksTUFBTSxJQUFJLE1BQU0sWUFBcEIsY0FBQSxFQUFnRDtBQUM5QyxRQUFBLEdBQUcsQ0FBSCxJQUFBLENBQVMsR0FBRyxNQUFNLENBQWxCLE9BQVksRUFBWjtBQURGLE9BQUEsTUFFTztBQUNMLFFBQUEsR0FBRyxDQUFILElBQUEsQ0FBQSxNQUFBO0FBQ0Q7QUFDRjs7QUFFRCxXQUFBLEdBQUE7QUFDRDs7QUFFRCxFQUFBLE9BQU8sQ0FBQSxJQUFBLEVBQW9CO0FBQ3pCLFFBQUE7QUFBQTtBQUFBLE1BQXNCO0FBQ3BCLDJCQUFBLEdBQUEsQ0FBQSxVQUFBLEVBQUEsSUFBQTtBQUNEOztBQUVELFdBQU8sS0FBQSxZQUFBLENBQVAsSUFBTyxDQUFQO0FBQ0Q7O0FBRU8sRUFBQSxZQUFZLENBQUEsSUFBQSxFQUFvQjtBQUN0QyxZQUFRLElBQUksQ0FBWixJQUFBO0FBQ0UsV0FBQSxVQUFBO0FBQ0UsZUFBTyxDQUFBO0FBQUE7QUFBQSxVQUF1QixJQUFJLENBQUosS0FB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LFdBQU8sSUFBSSxDQUFKLFFBQUEsR0FBZTtBQUFBO0FBQWYsTUFBaUQ7QUFBQTtBQUF4RDtBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZXhwT3Bjb2RlcywgV2VsbEtub3duQXR0ck5hbWUsIFdpcmVGb3JtYXQgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExPQ0FMX1NIT1VMRF9MT0cgfSBmcm9tICdAZ2xpbW1lci9sb2NhbC1kZWJ1Zy1mbGFncyc7XG5pbXBvcnQgeyBleGhhdXN0ZWQsIExPQ0FMX0xPR0dFUiB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBPcHRpb25hbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvbGlzdCc7XG5pbXBvcnQgeyBkZWZsYXRlQXR0ck5hbWUsIGRlZmxhdGVUYWdOYW1lIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRVhQUiB9IGZyb20gJy4vZXhwcmVzc2lvbnMnO1xuaW1wb3J0ICogYXMgbWlyIGZyb20gJy4vbWlyJztcblxuY2xhc3MgV2lyZVN0YXRlbWVudHM8UyBleHRlbmRzIFdpcmVGb3JtYXQuU3RhdGVtZW50ID0gV2lyZUZvcm1hdC5TdGF0ZW1lbnQ+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdGF0ZW1lbnRzOiByZWFkb25seSBTW10pIHt9XG5cbiAgdG9BcnJheSgpOiByZWFkb25seSBTW10ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudHM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnRlbnRFbmNvZGVyIHtcbiAgbGlzdChzdGF0ZW1lbnRzOiBtaXIuU3RhdGVtZW50W10pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgICBsZXQgb3V0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgbGV0IHJlc3VsdCA9IENPTlRFTlQuY29udGVudChzdGF0ZW1lbnQpO1xuXG4gICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFdpcmVTdGF0ZW1lbnRzKSB7XG4gICAgICAgIG91dC5wdXNoKC4uLnJlc3VsdC50b0FycmF5KCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0LnB1c2gocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgY29udGVudChzdG10OiBtaXIuU3RhdGVtZW50KTogV2lyZUZvcm1hdC5TdGF0ZW1lbnQgfCBXaXJlU3RhdGVtZW50cyB7XG4gICAgaWYgKExPQ0FMX1NIT1VMRF9MT0cpIHtcbiAgICAgIExPQ0FMX0xPR0dFUi5sb2coYGVuY29kaW5nYCwgc3RtdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmlzaXRDb250ZW50KHN0bXQpO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdENvbnRlbnQoc3RtdDogbWlyLlN0YXRlbWVudCk6IFdpcmVGb3JtYXQuU3RhdGVtZW50IHwgV2lyZVN0YXRlbWVudHMge1xuICAgIHN3aXRjaCAoc3RtdC50eXBlKSB7XG4gICAgICBjYXNlICdEZWJ1Z2dlcic6XG4gICAgICAgIHJldHVybiBbU2V4cE9wY29kZXMuRGVidWdnZXIsIHN0bXQuc2NvcGUuZ2V0RXZhbEluZm8oKV07XG4gICAgICBjYXNlICdBcHBlbmRDb21tZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQXBwZW5kQ29tbWVudChzdG10KTtcbiAgICAgIGNhc2UgJ0FwcGVuZFRleHROb2RlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQXBwZW5kVGV4dE5vZGUoc3RtdCk7XG4gICAgICBjYXNlICdBcHBlbmRUcnVzdGVkSFRNTCc6XG4gICAgICAgIHJldHVybiB0aGlzLkFwcGVuZFRydXN0ZWRIVE1MKHN0bXQpO1xuICAgICAgY2FzZSAnWWllbGQnOlxuICAgICAgICByZXR1cm4gdGhpcy5ZaWVsZChzdG10KTtcbiAgICAgIGNhc2UgJ0NvbXBvbmVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLkNvbXBvbmVudChzdG10KTtcbiAgICAgIGNhc2UgJ1NpbXBsZUVsZW1lbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5TaW1wbGVFbGVtZW50KHN0bXQpO1xuICAgICAgY2FzZSAnSW5FbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuSW5FbGVtZW50KHN0bXQpO1xuICAgICAgY2FzZSAnSW52b2tlQmxvY2snOlxuICAgICAgICByZXR1cm4gdGhpcy5JbnZva2VCbG9jayhzdG10KTtcbiAgICAgIGNhc2UgJ0lmJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuSWYoc3RtdCk7XG4gICAgICBjYXNlICdFYWNoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuRWFjaChzdG10KTtcbiAgICAgIGNhc2UgJ1dpdGgnOlxuICAgICAgICByZXR1cm4gdGhpcy5XaXRoKHN0bXQpO1xuICAgICAgY2FzZSAnTGV0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuTGV0KHN0bXQpO1xuICAgICAgY2FzZSAnV2l0aER5bmFtaWNWYXJzJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuV2l0aER5bmFtaWNWYXJzKHN0bXQpO1xuICAgICAgY2FzZSAnSW52b2tlQ29tcG9uZW50JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuSW52b2tlQ29tcG9uZW50KHN0bXQpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGV4aGF1c3RlZChzdG10KTtcbiAgICB9XG4gIH1cblxuICBZaWVsZCh7IHRvLCBwb3NpdGlvbmFsIH06IG1pci5ZaWVsZCk6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5ZaWVsZCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5ZaWVsZCwgdG8sIEVYUFIuUG9zaXRpb25hbChwb3NpdGlvbmFsKV07XG4gIH1cblxuICBJbkVsZW1lbnQoe1xuICAgIGd1aWQsXG4gICAgaW5zZXJ0QmVmb3JlLFxuICAgIGRlc3RpbmF0aW9uLFxuICAgIGJsb2NrLFxuICB9OiBtaXIuSW5FbGVtZW50KTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkluRWxlbWVudCB7XG4gICAgbGV0IHdpcmVCbG9jayA9IENPTlRFTlQuTmFtZWRCbG9jayhibG9jaylbMV07XG4gICAgLy8gbGV0IGd1aWQgPSBhcmdzLmd1aWQ7XG4gICAgbGV0IHdpcmVEZXN0aW5hdGlvbiA9IEVYUFIuZXhwcihkZXN0aW5hdGlvbik7XG4gICAgbGV0IHdpcmVJbnNlcnRCZWZvcmUgPSBFWFBSLmV4cHIoaW5zZXJ0QmVmb3JlKTtcblxuICAgIGlmICh3aXJlSW5zZXJ0QmVmb3JlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbU2V4cE9wY29kZXMuSW5FbGVtZW50LCB3aXJlQmxvY2ssIGd1aWQsIHdpcmVEZXN0aW5hdGlvbl07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbU2V4cE9wY29kZXMuSW5FbGVtZW50LCB3aXJlQmxvY2ssIGd1aWQsIHdpcmVEZXN0aW5hdGlvbiwgd2lyZUluc2VydEJlZm9yZV07XG4gICAgfVxuICB9XG5cbiAgSW52b2tlQmxvY2soeyBoZWFkLCBhcmdzLCBibG9ja3MgfTogbWlyLkludm9rZUJsb2NrKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkJsb2NrIHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLkJsb2NrLCBFWFBSLmV4cHIoaGVhZCksIC4uLkVYUFIuQXJncyhhcmdzKSwgQ09OVEVOVC5OYW1lZEJsb2NrcyhibG9ja3MpXTtcbiAgfVxuXG4gIEFwcGVuZFRydXN0ZWRIVE1MKHsgaHRtbCB9OiBtaXIuQXBwZW5kVHJ1c3RlZEhUTUwpOiBXaXJlRm9ybWF0LlN0YXRlbWVudHMuVHJ1c3RpbmdBcHBlbmQge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuVHJ1c3RpbmdBcHBlbmQsIEVYUFIuZXhwcihodG1sKV07XG4gIH1cblxuICBBcHBlbmRUZXh0Tm9kZSh7IHRleHQgfTogbWlyLkFwcGVuZFRleHROb2RlKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkFwcGVuZCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5BcHBlbmQsIEVYUFIuZXhwcih0ZXh0KV07XG4gIH1cblxuICBBcHBlbmRDb21tZW50KHsgdmFsdWUgfTogbWlyLkFwcGVuZENvbW1lbnQpOiBXaXJlRm9ybWF0LlN0YXRlbWVudHMuQ29tbWVudCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5Db21tZW50LCB2YWx1ZS5jaGFyc107XG4gIH1cblxuICBTaW1wbGVFbGVtZW50KHsgdGFnLCBwYXJhbXMsIGJvZHksIGR5bmFtaWNGZWF0dXJlcyB9OiBtaXIuU2ltcGxlRWxlbWVudCk6IFdpcmVTdGF0ZW1lbnRzIHtcbiAgICBsZXQgb3AgPSBkeW5hbWljRmVhdHVyZXMgPyBTZXhwT3Bjb2Rlcy5PcGVuRWxlbWVudFdpdGhTcGxhdCA6IFNleHBPcGNvZGVzLk9wZW5FbGVtZW50O1xuICAgIHJldHVybiBuZXcgV2lyZVN0YXRlbWVudHM8V2lyZUZvcm1hdC5TdGF0ZW1lbnQgfCBXaXJlRm9ybWF0LkVsZW1lbnRQYXJhbWV0ZXI+KFtcbiAgICAgIFtvcCwgZGVmbGF0ZVRhZ05hbWUodGFnLmNoYXJzKV0sXG4gICAgICAuLi5DT05URU5ULkVsZW1lbnRQYXJhbWV0ZXJzKHBhcmFtcykudG9BcnJheSgpLFxuICAgICAgW1NleHBPcGNvZGVzLkZsdXNoRWxlbWVudF0sXG4gICAgICAuLi5DT05URU5ULmxpc3QoYm9keSksXG4gICAgICBbU2V4cE9wY29kZXMuQ2xvc2VFbGVtZW50XSxcbiAgICBdKTtcbiAgfVxuXG4gIENvbXBvbmVudCh7IHRhZywgcGFyYW1zLCBhcmdzLCBibG9ja3MgfTogbWlyLkNvbXBvbmVudCk6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5Db21wb25lbnQge1xuICAgIGxldCB3aXJlVGFnID0gRVhQUi5leHByKHRhZyk7XG4gICAgbGV0IHdpcmVQb3NpdGlvbmFsID0gQ09OVEVOVC5FbGVtZW50UGFyYW1ldGVycyhwYXJhbXMpO1xuICAgIGxldCB3aXJlTmFtZWQgPSBFWFBSLk5hbWVkQXJndW1lbnRzKGFyZ3MpO1xuXG4gICAgbGV0IHdpcmVOYW1lZEJsb2NrcyA9IENPTlRFTlQuTmFtZWRCbG9ja3MoYmxvY2tzKTtcblxuICAgIHJldHVybiBbXG4gICAgICBTZXhwT3Bjb2Rlcy5Db21wb25lbnQsXG4gICAgICB3aXJlVGFnLFxuICAgICAgd2lyZVBvc2l0aW9uYWwudG9QcmVzZW50QXJyYXkoKSxcbiAgICAgIHdpcmVOYW1lZCxcbiAgICAgIHdpcmVOYW1lZEJsb2NrcyxcbiAgICBdO1xuICB9XG5cbiAgRWxlbWVudFBhcmFtZXRlcnMoeyBib2R5IH06IG1pci5FbGVtZW50UGFyYW1ldGVycyk6IE9wdGlvbmFsTGlzdDxXaXJlRm9ybWF0LkVsZW1lbnRQYXJhbWV0ZXI+IHtcbiAgICByZXR1cm4gYm9keS5tYXAoKHApID0+IENPTlRFTlQuRWxlbWVudFBhcmFtZXRlcihwKSk7XG4gIH1cblxuICBFbGVtZW50UGFyYW1ldGVyKHBhcmFtOiBtaXIuRWxlbWVudFBhcmFtZXRlcik6IFdpcmVGb3JtYXQuRWxlbWVudFBhcmFtZXRlciB7XG4gICAgc3dpdGNoIChwYXJhbS50eXBlKSB7XG4gICAgICBjYXNlICdTcGxhdEF0dHInOlxuICAgICAgICByZXR1cm4gW1NleHBPcGNvZGVzLkF0dHJTcGxhdCwgcGFyYW0uc3ltYm9sXTtcbiAgICAgIGNhc2UgJ0R5bmFtaWNBdHRyJzpcbiAgICAgICAgcmV0dXJuIFtkeW5hbWljQXR0ck9wKHBhcmFtLmtpbmQpLCAuLi5keW5hbWljQXR0cihwYXJhbSldO1xuICAgICAgY2FzZSAnU3RhdGljQXR0cic6XG4gICAgICAgIHJldHVybiBbc3RhdGljQXR0ck9wKHBhcmFtLmtpbmQpLCAuLi5zdGF0aWNBdHRyKHBhcmFtKV07XG4gICAgICBjYXNlICdNb2RpZmllcic6XG4gICAgICAgIHJldHVybiBbU2V4cE9wY29kZXMuTW9kaWZpZXIsIEVYUFIuZXhwcihwYXJhbS5jYWxsZWUpLCAuLi5FWFBSLkFyZ3MocGFyYW0uYXJncyldO1xuICAgIH1cbiAgfVxuXG4gIE5hbWVkQmxvY2tzKHsgYmxvY2tzIH06IG1pci5OYW1lZEJsb2Nrcyk6IFdpcmVGb3JtYXQuQ29yZS5CbG9ja3Mge1xuICAgIGxldCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc2VyaWFsaXplZEJsb2NrczogV2lyZUZvcm1hdC5TZXJpYWxpemVkSW5saW5lQmxvY2tbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgYmxvY2sgb2YgYmxvY2tzLnRvQXJyYXkoKSkge1xuICAgICAgbGV0IFtuYW1lLCBzZXJpYWxpemVkQmxvY2tdID0gQ09OVEVOVC5OYW1lZEJsb2NrKGJsb2NrKTtcblxuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHNlcmlhbGl6ZWRCbG9ja3MucHVzaChzZXJpYWxpemVkQmxvY2spO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lcy5sZW5ndGggPiAwID8gW25hbWVzLCBzZXJpYWxpemVkQmxvY2tzXSA6IG51bGw7XG4gIH1cblxuICBOYW1lZEJsb2NrKHsgbmFtZSwgYm9keSwgc2NvcGUgfTogbWlyLk5hbWVkQmxvY2spOiBXaXJlRm9ybWF0LkNvcmUuTmFtZWRCbG9jayB7XG4gICAgbGV0IG5hbWVDaGFycyA9IG5hbWUuY2hhcnM7XG4gICAgaWYgKG5hbWVDaGFycyA9PT0gJ2ludmVyc2UnKSB7XG4gICAgICBuYW1lQ2hhcnMgPSAnZWxzZSc7XG4gICAgfVxuICAgIHJldHVybiBbbmFtZUNoYXJzLCBbQ09OVEVOVC5saXN0KGJvZHkpLCBzY29wZS5zbG90c11dO1xuICB9XG5cbiAgSWYoeyBjb25kaXRpb24sIGJsb2NrLCBpbnZlcnNlIH06IG1pci5JZik6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5JZiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFNleHBPcGNvZGVzLklmLFxuICAgICAgRVhQUi5leHByKGNvbmRpdGlvbiksXG4gICAgICBDT05URU5ULk5hbWVkQmxvY2soYmxvY2spWzFdLFxuICAgICAgaW52ZXJzZSA/IENPTlRFTlQuTmFtZWRCbG9jayhpbnZlcnNlKVsxXSA6IG51bGwsXG4gICAgXTtcbiAgfVxuXG4gIEVhY2goeyB2YWx1ZSwga2V5LCBibG9jaywgaW52ZXJzZSB9OiBtaXIuRWFjaCk6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5FYWNoIHtcbiAgICByZXR1cm4gW1xuICAgICAgU2V4cE9wY29kZXMuRWFjaCxcbiAgICAgIEVYUFIuZXhwcih2YWx1ZSksXG4gICAgICBrZXkgPyBFWFBSLmV4cHIoa2V5KSA6IG51bGwsXG4gICAgICBDT05URU5ULk5hbWVkQmxvY2soYmxvY2spWzFdLFxuICAgICAgaW52ZXJzZSA/IENPTlRFTlQuTmFtZWRCbG9jayhpbnZlcnNlKVsxXSA6IG51bGwsXG4gICAgXTtcbiAgfVxuXG4gIFdpdGgoeyB2YWx1ZSwgYmxvY2ssIGludmVyc2UgfTogbWlyLldpdGgpOiBXaXJlRm9ybWF0LlN0YXRlbWVudHMuV2l0aCB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFNleHBPcGNvZGVzLldpdGgsXG4gICAgICBFWFBSLmV4cHIodmFsdWUpLFxuICAgICAgQ09OVEVOVC5OYW1lZEJsb2NrKGJsb2NrKVsxXSxcbiAgICAgIGludmVyc2UgPyBDT05URU5ULk5hbWVkQmxvY2soaW52ZXJzZSlbMV0gOiBudWxsLFxuICAgIF07XG4gIH1cblxuICBMZXQoeyBwb3NpdGlvbmFsLCBibG9jayB9OiBtaXIuTGV0KTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkxldCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5MZXQsIEVYUFIuUG9zaXRpb25hbChwb3NpdGlvbmFsKSwgQ09OVEVOVC5OYW1lZEJsb2NrKGJsb2NrKVsxXV07XG4gIH1cblxuICBXaXRoRHluYW1pY1ZhcnMoeyBuYW1lZCwgYmxvY2sgfTogbWlyLldpdGhEeW5hbWljVmFycyk6IFdpcmVGb3JtYXQuU3RhdGVtZW50cy5XaXRoRHluYW1pY1ZhcnMge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuV2l0aER5bmFtaWNWYXJzLCBFWFBSLk5hbWVkQXJndW1lbnRzKG5hbWVkKSwgQ09OVEVOVC5OYW1lZEJsb2NrKGJsb2NrKVsxXV07XG4gIH1cblxuICBJbnZva2VDb21wb25lbnQoe1xuICAgIGRlZmluaXRpb24sXG4gICAgYXJncyxcbiAgICBibG9ja3MsXG4gIH06IG1pci5JbnZva2VDb21wb25lbnQpOiBXaXJlRm9ybWF0LlN0YXRlbWVudHMuSW52b2tlQ29tcG9uZW50IHtcbiAgICByZXR1cm4gW1xuICAgICAgU2V4cE9wY29kZXMuSW52b2tlQ29tcG9uZW50LFxuICAgICAgRVhQUi5leHByKGRlZmluaXRpb24pLFxuICAgICAgRVhQUi5Qb3NpdGlvbmFsKGFyZ3MucG9zaXRpb25hbCksXG4gICAgICBFWFBSLk5hbWVkQXJndW1lbnRzKGFyZ3MubmFtZWQpLFxuICAgICAgYmxvY2tzID8gQ09OVEVOVC5OYW1lZEJsb2NrcyhibG9ja3MpIDogbnVsbCxcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDT05URU5UID0gbmV3IENvbnRlbnRFbmNvZGVyKCk7XG5cbmV4cG9ydCB0eXBlIFN0YXRpY0F0dHJBcmdzID0gW25hbWU6IHN0cmluZyB8IFdlbGxLbm93bkF0dHJOYW1lLCB2YWx1ZTogc3RyaW5nLCBuYW1lc3BhY2U/OiBzdHJpbmddO1xuXG5mdW5jdGlvbiBzdGF0aWNBdHRyKHsgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSB9OiBtaXIuU3RhdGljQXR0cik6IFN0YXRpY0F0dHJBcmdzIHtcbiAgbGV0IG91dDogU3RhdGljQXR0ckFyZ3MgPSBbZGVmbGF0ZUF0dHJOYW1lKG5hbWUuY2hhcnMpLCB2YWx1ZS5jaGFyc107XG5cbiAgaWYgKG5hbWVzcGFjZSkge1xuICAgIG91dC5wdXNoKG5hbWVzcGFjZSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgdHlwZSBEeW5hbWljQXR0ckFyZ3MgPSBbXG4gIG5hbWU6IHN0cmluZyB8IFdlbGxLbm93bkF0dHJOYW1lLFxuICB2YWx1ZTogV2lyZUZvcm1hdC5FeHByZXNzaW9uLFxuICBuYW1lc3BhY2U/OiBzdHJpbmdcbl07XG5cbmZ1bmN0aW9uIGR5bmFtaWNBdHRyKHsgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSB9OiBtaXIuRHluYW1pY0F0dHIpOiBEeW5hbWljQXR0ckFyZ3Mge1xuICBsZXQgb3V0OiBEeW5hbWljQXR0ckFyZ3MgPSBbZGVmbGF0ZUF0dHJOYW1lKG5hbWUuY2hhcnMpLCBFWFBSLmV4cHIodmFsdWUpXTtcblxuICBpZiAobmFtZXNwYWNlKSB7XG4gICAgb3V0LnB1c2gobmFtZXNwYWNlKTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHN0YXRpY0F0dHJPcChraW5kOiB7XG4gIGNvbXBvbmVudDogYm9vbGVhbjtcbn0pOiBTZXhwT3Bjb2Rlcy5TdGF0aWNBdHRyIHwgU2V4cE9wY29kZXMuU3RhdGljQ29tcG9uZW50QXR0cjtcbmZ1bmN0aW9uIHN0YXRpY0F0dHJPcChraW5kOiB7IGNvbXBvbmVudDogYm9vbGVhbiB9KTogV2lyZUZvcm1hdC5BdHRyT3Age1xuICBpZiAoa2luZC5jb21wb25lbnQpIHtcbiAgICByZXR1cm4gU2V4cE9wY29kZXMuU3RhdGljQ29tcG9uZW50QXR0cjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gU2V4cE9wY29kZXMuU3RhdGljQXR0cjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkeW5hbWljQXR0ck9wKFxuICBraW5kOiBtaXIuQXR0cktpbmRcbik6XG4gIHwgU2V4cE9wY29kZXMuVHJ1c3RpbmdDb21wb25lbnRBdHRyXG4gIHwgU2V4cE9wY29kZXMuVHJ1c3RpbmdEeW5hbWljQXR0clxuICB8IFNleHBPcGNvZGVzLkNvbXBvbmVudEF0dHJcbiAgfCBTZXhwT3Bjb2Rlcy5EeW5hbWljQXR0ciB7XG4gIGlmIChraW5kLmNvbXBvbmVudCkge1xuICAgIHJldHVybiBraW5kLnRydXN0aW5nID8gU2V4cE9wY29kZXMuVHJ1c3RpbmdDb21wb25lbnRBdHRyIDogU2V4cE9wY29kZXMuQ29tcG9uZW50QXR0cjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ga2luZC50cnVzdGluZyA/IFNleHBPcGNvZGVzLlRydXN0aW5nRHluYW1pY0F0dHIgOiBTZXhwT3Bjb2Rlcy5EeW5hbWljQXR0cjtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==