UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

400 lines (326 loc) 29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EndTrackFrameOpcode = exports.BeginTrackFrameOpcode = exports.JumpIfNotModifiedOpcode = exports.AssertFilter = exports.Assert = void 0; var _globalContext = require("@glimmer/global-context"); var _reference = require("@glimmer/reference"); var _validator = require("@glimmer/validator"); var _util = require("@glimmer/util"); var _assert = require("./assert"); var _opcodes = require("../../opcodes"); var _symbols = require("../../symbols"); _opcodes.APPEND_OPCODES.add(39 /* ChildScope */ , vm => vm.pushChildScope()); _opcodes.APPEND_OPCODES.add(40 /* PopScope */ , vm => vm.popScope()); _opcodes.APPEND_OPCODES.add(59 /* PushDynamicScope */ , vm => vm.pushDynamicScope()); _opcodes.APPEND_OPCODES.add(60 /* PopDynamicScope */ , vm => vm.popDynamicScope()); _opcodes.APPEND_OPCODES.add(28 /* Constant */ , (vm, { op1: other }) => { vm.stack.push(vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(other))); }); _opcodes.APPEND_OPCODES.add(29 /* ConstantReference */ , (vm, { op1: other }) => { vm.stack.push((0, _reference.createConstRef)(vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(other)), false)); }); _opcodes.APPEND_OPCODES.add(30 /* Primitive */ , (vm, { op1: primitive }) => { let stack = vm.stack; if ((0, _util.isHandle)(primitive)) { // it is a handle which does not already exist on the stack let value = vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(primitive)); stack.push(value); } else { // is already an encoded immediate or primitive handle stack.push((0, _util.decodeImmediate)(primitive)); } }); _opcodes.APPEND_OPCODES.add(31 /* PrimitiveReference */ , vm => { let stack = vm.stack; let value = stack.pop(); let ref; if (value === undefined) { ref = _reference.UNDEFINED_REFERENCE; } else if (value === null) { ref = _reference.NULL_REFERENCE; } else if (value === true) { ref = _reference.TRUE_REFERENCE; } else if (value === false) { ref = _reference.FALSE_REFERENCE; } else { ref = (0, _reference.createPrimitiveRef)(value); } stack.push(ref); }); _opcodes.APPEND_OPCODES.add(33 /* Dup */ , (vm, { op1: register, op2: offset }) => { let position = vm.fetchValue(register) - offset; vm.stack.dup(position); }); _opcodes.APPEND_OPCODES.add(34 /* Pop */ , (vm, { op1: count }) => { vm.stack.pop(count); }); _opcodes.APPEND_OPCODES.add(35 /* Load */ , (vm, { op1: register }) => { vm.load(register); }); _opcodes.APPEND_OPCODES.add(36 /* Fetch */ , (vm, { op1: register }) => { vm.fetch(register); }); _opcodes.APPEND_OPCODES.add(58 /* BindDynamicScope */ , (vm, { op1: _names }) => { let names = vm[_symbols.CONSTANTS].getArray(_names); vm.bindDynamicScope(names); }); _opcodes.APPEND_OPCODES.add(69 /* Enter */ , (vm, { op1: args }) => { vm.enter(args); }); _opcodes.APPEND_OPCODES.add(70 /* Exit */ , vm => { vm.exit(); }); _opcodes.APPEND_OPCODES.add(63 /* PushSymbolTable */ , (vm, { op1: _table }) => { let stack = vm.stack; stack.push(vm[_symbols.CONSTANTS].getValue(_table)); }); _opcodes.APPEND_OPCODES.add(62 /* PushBlockScope */ , vm => { let stack = vm.stack; stack.push(vm.scope()); }); _opcodes.APPEND_OPCODES.add(61 /* CompileBlock */ , vm => { let stack = vm.stack; let block = stack.pop(); if (block) { stack.push(vm.compile(block)); } else { stack.push(null); } }); _opcodes.APPEND_OPCODES.add(64 /* InvokeYield */ , vm => { let { stack } = vm; let handle = stack.pop(); let scope = stack.pop(); let table = stack.pop(); false && (0, _util.assert)(table === null || table && typeof table === 'object' && Array.isArray(table.parameters), (0, _assert.stackAssert)('Option<BlockSymbolTable>', table)); let args = stack.pop(); if (table === null) { // To balance the pop{Frame,Scope} vm.pushFrame(); vm.pushScope(scope !== null && scope !== void 0 ? scope : vm.scope()); return; } let invokingScope = scope; // If necessary, create a child scope { let locals = table.parameters; let localsCount = locals.length; if (localsCount > 0) { invokingScope = invokingScope.child(); for (let i = 0; i < localsCount; i++) { invokingScope.bindSymbol(locals[i], args.at(i)); } } } vm.pushFrame(); vm.pushScope(invokingScope); vm.call(handle); }); _opcodes.APPEND_OPCODES.add(65 /* JumpIf */ , (vm, { op1: target }) => { let reference = vm.stack.pop(); let value = Boolean((0, _reference.valueForRef)(reference)); if ((0, _reference.isConstRef)(reference)) { if (value === true) { vm.goto(target); } } else { if (value === true) { vm.goto(target); } vm.updateWith(new Assert(reference)); } }); _opcodes.APPEND_OPCODES.add(66 /* JumpUnless */ , (vm, { op1: target }) => { let reference = vm.stack.pop(); let value = Boolean((0, _reference.valueForRef)(reference)); if ((0, _reference.isConstRef)(reference)) { if (value === false) { vm.goto(target); } } else { if (value === false) { vm.goto(target); } vm.updateWith(new Assert(reference)); } }); _opcodes.APPEND_OPCODES.add(67 /* JumpEq */ , (vm, { op1: target, op2: comparison }) => { let other = vm.stack.peek(); if (other === comparison) { vm.goto(target); } }); _opcodes.APPEND_OPCODES.add(68 /* AssertSame */ , vm => { let reference = vm.stack.peek(); if ((0, _reference.isConstRef)(reference) === false) { vm.updateWith(new Assert(reference)); } }); _opcodes.APPEND_OPCODES.add(71 /* ToBoolean */ , vm => { let { stack } = vm; let valueRef = stack.pop(); stack.push((0, _reference.createComputeRef)(() => (0, _globalContext.toBool)((0, _reference.valueForRef)(valueRef)))); }); class Assert { constructor(ref) { this.ref = ref; this.last = (0, _reference.valueForRef)(ref); } evaluate(vm) { let { last, ref } = this; let current = (0, _reference.valueForRef)(ref); if (last !== current) { vm.throw(); } } } exports.Assert = Assert; class AssertFilter { constructor(ref, filter) { this.ref = ref; this.filter = filter; this.last = filter((0, _reference.valueForRef)(ref)); } evaluate(vm) { let { last, ref, filter } = this; let current = filter((0, _reference.valueForRef)(ref)); if (last !== current) { vm.throw(); } } } exports.AssertFilter = AssertFilter; class JumpIfNotModifiedOpcode { constructor() { this.tag = _validator.CONSTANT_TAG; this.lastRevision = _validator.INITIAL; } finalize(tag, target) { this.target = target; this.didModify(tag); } evaluate(vm) { let { tag, target, lastRevision } = this; if (!vm.alwaysRevalidate && (0, _validator.validateTag)(tag, lastRevision)) { (0, _validator.consumeTag)(tag); vm.goto(target); } } didModify(tag) { this.tag = tag; this.lastRevision = (0, _validator.valueForTag)(this.tag); (0, _validator.consumeTag)(tag); } } exports.JumpIfNotModifiedOpcode = JumpIfNotModifiedOpcode; class BeginTrackFrameOpcode { constructor(debugLabel) { this.debugLabel = debugLabel; } evaluate() { (0, _validator.beginTrackFrame)(this.debugLabel); } } exports.BeginTrackFrameOpcode = BeginTrackFrameOpcode; class EndTrackFrameOpcode { constructor(target) { this.target = target; } evaluate() { let tag = (0, _validator.endTrackFrame)(); this.target.didModify(tag); } } exports.EndTrackFrameOpcode = EndTrackFrameOpcode; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUVBOztBQVlBOztBQVdBOztBQVVBOztBQUNBOztBQUlBOztBQUdBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFtQyxFQUFELElBQVEsRUFBRSxDQUE1QyxjQUEwQyxFQUExQzs7QUFFQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBaUMsRUFBRCxJQUFRLEVBQUUsQ0FBMUMsUUFBd0MsRUFBeEM7O0FBRUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQXlDLEVBQUQsSUFBUSxFQUFFLENBQWxELGdCQUFnRCxFQUFoRDs7QUFFQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBd0MsRUFBRCxJQUFRLEVBQUUsQ0FBakQsZUFBK0MsRUFBL0M7O0FBRUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQWdDLENBQUEsRUFBQSxFQUFLO0FBQUUsRUFBQSxHQUFHLEVBQUU7QUFBUCxDQUFMLEtBQXVCO0FBQ3JELEVBQUEsRUFBRSxDQUFGLEtBQUEsQ0FBQSxJQUFBLENBQWMsRUFBRSxDQUFGLGtCQUFFLENBQUYsQ0FBQSxRQUFBLENBQXVCLHdCQUFyQyxLQUFxQyxDQUF2QixDQUFkO0FBREYsQ0FBQTs7QUFJQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBeUMsQ0FBQSxFQUFBLEVBQUs7QUFBRSxFQUFBLEdBQUcsRUFBRTtBQUFQLENBQUwsS0FBdUI7QUFDOUQsRUFBQSxFQUFFLENBQUYsS0FBQSxDQUFBLElBQUEsQ0FBYywrQkFBZSxFQUFFLENBQUYsa0JBQUUsQ0FBRixDQUFBLFFBQUEsQ0FBdUIsd0JBQXhCLEtBQXdCLENBQXZCLENBQWYsRUFBZCxLQUFjLENBQWQ7QUFERixDQUFBOztBQUlBLHdCQUFB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LFFBQUksQ0FBQyxFQUFFLENBQUgsZ0JBQUEsSUFBd0IsNEJBQVcsR0FBWCxFQUE1QixZQUE0QixDQUE1QixFQUE0RDtBQUMxRCxpQ0FBQSxHQUFBO0FBQ0EsTUFBQSxFQUFFLENBQUYsSUFBQSxDQUFBLE1BQUE7QUFDRDtBQUNGOztBQUVELEVBQUEsU0FBUyxDQUFBLEdBQUEsRUFBUztBQUNoQixTQUFBLEdBQUEsR0FBQSxHQUFBO0FBQ0EsU0FBQSxZQUFBLEdBQW9CLDRCQUFZLEtBQWhDLEdBQW9CLENBQXBCO0FBQ0EsK0JBQUEsR0FBQTtBQUNEOztBQXZCaUM7Ozs7QUEwQjlCLE1BQUEscUJBQUEsQ0FBNEI7QUFDaEMsRUFBQSxXQUFBLENBQUEsVUFBQSxFQUF1QztBQUFuQixTQUFBLFVBQUEsR0FBQSxVQUFBO0FBQXVCOztBQUUzQyxFQUFBLFFBQVEsR0FBQTtBQUNOLG9DQUFnQixLQUFoQixVQUFBO0FBQ0Q7O0FBTCtCOzs7O0FBUTVCLE1BQUEsbUJBQUEsQ0FBMEI7QUFDOUIsRUFBQSxXQUFBLENBQUEsTUFBQSxFQUFtRDtBQUEvQixTQUFBLE1BQUEsR0FBQSxNQUFBO0FBQW1DOztBQUV2RCxFQUFBLFFBQVEsR0FBQTtBQUNOLFFBQUksR0FBRyxHQUFQLCtCQUFBO0FBQ0EsU0FBQSxNQUFBLENBQUEsU0FBQSxDQUFBLEdBQUE7QUFDRDs7QUFONkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0b0Jvb2wgfSBmcm9tICdAZ2xpbW1lci9nbG9iYWwtY29udGV4dCc7XG5pbXBvcnQgeyBDb21waWxhYmxlVGVtcGxhdGUsIE9wdGlvbiwgT3AsIFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBSZWZlcmVuY2UsXG4gIHZhbHVlRm9yUmVmLFxuICBpc0NvbnN0UmVmLFxuICBjcmVhdGVQcmltaXRpdmVSZWYsXG4gIFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gIE5VTExfUkVGRVJFTkNFLFxuICBUUlVFX1JFRkVSRU5DRSxcbiAgRkFMU0VfUkVGRVJFTkNFLFxuICBjcmVhdGVDb21wdXRlUmVmLFxuICBjcmVhdGVDb25zdFJlZixcbn0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7XG4gIENPTlNUQU5UX1RBRyxcbiAgUmV2aXNpb24sXG4gIFRhZyxcbiAgdmFsdWVGb3JUYWcsXG4gIHZhbGlkYXRlVGFnLFxuICBJTklUSUFMLFxuICBiZWdpblRyYWNrRnJhbWUsXG4gIGVuZFRyYWNrRnJhbWUsXG4gIGNvbnN1bWVUYWcsXG59IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyBhc3NlcnQsIGRlY29kZUhhbmRsZSwgZGVjb2RlSW1tZWRpYXRlLCBleHBlY3QsIGlzSGFuZGxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQge1xuICBDaGVja051bWJlcixcbiAgY2hlY2ssXG4gIENoZWNrSW5zdGFuY2VvZixcbiAgQ2hlY2tPcHRpb24sXG4gIENoZWNrQmxvY2tTeW1ib2xUYWJsZSxcbiAgQ2hlY2tIYW5kbGUsXG4gIENoZWNrUHJpbWl0aXZlLFxufSBmcm9tICdAZ2xpbW1lci9kZWJ1Zyc7XG5pbXBvcnQgeyBzdGFja0Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IEFQUEVORF9PUENPREVTIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBVcGRhdGluZ1ZNIH0gZnJvbSAnLi4vLi4vdm0nO1xuaW1wb3J0IHsgVk1Bcmd1bWVudHNJbXBsIH0gZnJvbSAnLi4vLi4vdm0vYXJndW1lbnRzJztcbmltcG9ydCB7IENoZWNrUmVmZXJlbmNlLCBDaGVja1Njb3BlIH0gZnJvbSAnLi8tZGVidWctc3RyaXAnO1xuaW1wb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBJbnRlcm5hbFZNIH0gZnJvbSAnLi4vLi4vdm0vYXBwZW5kJztcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNoaWxkU2NvcGUsICh2bSkgPT4gdm0ucHVzaENoaWxkU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3BTY29wZSwgKHZtKSA9PiB2bS5wb3BTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hEeW5hbWljU2NvcGUsICh2bSkgPT4gdm0ucHVzaER5bmFtaWNTY29wZSgpKTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcER5bmFtaWNTY29wZSwgKHZtKSA9PiB2bS5wb3BEeW5hbWljU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudCwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db25zdGFudFJlZmVyZW5jZSwgKHZtLCB7IG9wMTogb3RoZXIgfSkgPT4ge1xuICB2bS5zdGFjay5wdXNoKGNyZWF0ZUNvbnN0UmVmKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKG90aGVyKSksIGZhbHNlKSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlByaW1pdGl2ZSwgKHZtLCB7IG9wMTogcHJpbWl0aXZlIH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG5cbiAgaWYgKGlzSGFuZGxlKHByaW1pdGl2ZSkpIHtcbiAgICAvLyBpdCBpcyBhIGhhbmRsZSB3aGljaCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSBzdGFja1xuICAgIGxldCB2YWx1ZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoZGVjb2RlSGFuZGxlKHByaW1pdGl2ZSkpO1xuICAgIHN0YWNrLnB1c2godmFsdWUgYXMgb2JqZWN0KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpcyBhbHJlYWR5IGFuIGVuY29kZWQgaW1tZWRpYXRlIG9yIHByaW1pdGl2ZSBoYW5kbGVcbiAgICBzdGFjay5wdXNoKGRlY29kZUltbWVkaWF0ZShwcmltaXRpdmUpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QcmltaXRpdmVSZWZlcmVuY2UsICh2bSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IHZhbHVlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUHJpbWl0aXZlKTtcbiAgbGV0IHJlZjtcblxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJlZiA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZWYgPSBOVUxMX1JFRkVSRU5DRTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJlZiA9IFRSVUVfUkVGRVJFTkNFO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIHJlZiA9IEZBTFNFX1JFRkVSRU5DRTtcbiAgfSBlbHNlIHtcbiAgICByZWYgPSBjcmVhdGVQcmltaXRpdmVSZWYodmFsdWUpO1xuICB9XG5cbiAgc3RhY2sucHVzaChyZWYpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5EdXAsICh2bSwgeyBvcDE6IHJlZ2lzdGVyLCBvcDI6IG9mZnNldCB9KSA9PiB7XG4gIGxldCBwb3NpdGlvbiA9IGNoZWNrKHZtLmZldGNoVmFsdWUocmVnaXN0ZXIpLCBDaGVja051bWJlcikgLSBvZmZzZXQ7XG4gIHZtLnN0YWNrLmR1cChwb3NpdGlvbik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcCwgKHZtLCB7IG9wMTogY291bnQgfSkgPT4ge1xuICB2bS5zdGFjay5wb3AoY291bnQpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Mb2FkLCAodm0sIHsgb3AxOiByZWdpc3RlciB9KSA9PiB7XG4gIHZtLmxvYWQocmVnaXN0ZXIpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5GZXRjaCwgKHZtLCB7IG9wMTogcmVnaXN0ZXIgfSkgPT4ge1xuICB2bS5mZXRjaChyZWdpc3Rlcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkJpbmREeW5hbWljU2NvcGUsICh2bSwgeyBvcDE6IF9uYW1lcyB9KSA9PiB7XG4gIGxldCBuYW1lcyA9IHZtW0NPTlNUQU5UU10uZ2V0QXJyYXk8c3RyaW5nPihfbmFtZXMpO1xuICB2bS5iaW5kRHluYW1pY1Njb3BlKG5hbWVzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRW50ZXIsICh2bSwgeyBvcDE6IGFyZ3MgfSkgPT4ge1xuICB2bS5lbnRlcihhcmdzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRXhpdCwgKHZtKSA9PiB7XG4gIHZtLmV4aXQoKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHVzaFN5bWJvbFRhYmxlLCAodm0sIHsgb3AxOiBfdGFibGUgfSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgc3RhY2sucHVzaCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKF90YWJsZSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QdXNoQmxvY2tTY29wZSwgKHZtKSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBzdGFjay5wdXNoKHZtLnNjb3BlKCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db21waWxlQmxvY2ssICh2bTogSW50ZXJuYWxWTSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IGJsb2NrID0gc3RhY2sucG9wPE9wdGlvbjxDb21waWxhYmxlVGVtcGxhdGU+IHwgMD4oKTtcblxuICBpZiAoYmxvY2spIHtcbiAgICBzdGFjay5wdXNoKHZtLmNvbXBpbGUoYmxvY2spKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkludm9rZVlpZWxkLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuXG4gIGxldCBoYW5kbGUgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tIYW5kbGUpKTtcbiAgbGV0IHNjb3BlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrU2NvcGUpKTtcbiAgbGV0IHRhYmxlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrQmxvY2tTeW1ib2xUYWJsZSkpO1xuXG4gIGFzc2VydChcbiAgICB0YWJsZSA9PT0gbnVsbCB8fCAodGFibGUgJiYgdHlwZW9mIHRhYmxlID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHRhYmxlLnBhcmFtZXRlcnMpKSxcbiAgICBzdGFja0Fzc2VydCgnT3B0aW9uPEJsb2NrU3ltYm9sVGFibGU+JywgdGFibGUpXG4gICk7XG5cbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tJbnN0YW5jZW9mKFZNQXJndW1lbnRzSW1wbCkpO1xuXG4gIGlmICh0YWJsZSA9PT0gbnVsbCkge1xuICAgIC8vIFRvIGJhbGFuY2UgdGhlIHBvcHtGcmFtZSxTY29wZX1cbiAgICB2bS5wdXNoRnJhbWUoKTtcbiAgICB2bS5wdXNoU2NvcGUoc2NvcGUgPz8gdm0uc2NvcGUoKSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgaW52b2tpbmdTY29wZSA9IGV4cGVjdChzY29wZSwgJ0JVRzogZXhwZWN0ZWQgc2NvcGUnKTtcblxuICAvLyBJZiBuZWNlc3NhcnksIGNyZWF0ZSBhIGNoaWxkIHNjb3BlXG4gIHtcbiAgICBsZXQgbG9jYWxzID0gdGFibGUucGFyYW1ldGVycztcbiAgICBsZXQgbG9jYWxzQ291bnQgPSBsb2NhbHMubGVuZ3RoO1xuXG4gICAgaWYgKGxvY2Fsc0NvdW50ID4gMCkge1xuICAgICAgaW52b2tpbmdTY29wZSA9IGludm9raW5nU2NvcGUuY2hpbGQoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbHNDb3VudDsgaSsrKSB7XG4gICAgICAgIGludm9raW5nU2NvcGUuYmluZFN5bWJvbChsb2NhbHMhW2ldLCBhcmdzLmF0KGkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2bS5wdXNoRnJhbWUoKTtcbiAgdm0ucHVzaFNjb3BlKGludm9raW5nU2NvcGUpO1xuICB2bS5jYWxsKGhhbmRsZSEpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5KdW1wSWYsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuXG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkp1bXBVbmxlc3MsICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBCb29sZWFuKHZhbHVlRm9yUmVmKHJlZmVyZW5jZSkpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICB9XG5cbiAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQocmVmZXJlbmNlKSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSnVtcEVxLCAodm0sIHsgb3AxOiB0YXJnZXQsIG9wMjogY29tcGFyaXNvbiB9KSA9PiB7XG4gIGxldCBvdGhlciA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tOdW1iZXIpO1xuXG4gIGlmIChvdGhlciA9PT0gY29tcGFyaXNvbikge1xuICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Bc3NlcnRTYW1lLCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIGlmIChpc0NvbnN0UmVmKHJlZmVyZW5jZSkgPT09IGZhbHNlKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlRvQm9vbGVhbiwgKHZtKSA9PiB7XG4gIGxldCB7IHN0YWNrIH0gPSB2bTtcbiAgbGV0IHZhbHVlUmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBzdGFjay5wdXNoKGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4gdG9Cb29sKHZhbHVlRm9yUmVmKHZhbHVlUmVmKSkpKTtcbn0pO1xuXG5leHBvcnQgY2xhc3MgQXNzZXJ0IGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIGxhc3Q6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IFJlZmVyZW5jZSkge1xuICAgIHRoaXMubGFzdCA9IHZhbHVlRm9yUmVmKHJlZik7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IGxhc3QsIHJlZiB9ID0gdGhpcztcbiAgICBsZXQgY3VycmVudCA9IHZhbHVlRm9yUmVmKHJlZik7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzc2VydEZpbHRlcjxULCBVPiBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSBsYXN0OiBVO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBSZWZlcmVuY2U8VD4sIHByaXZhdGUgZmlsdGVyOiAoZnJvbTogVCkgPT4gVSkge1xuICAgIHRoaXMubGFzdCA9IGZpbHRlcih2YWx1ZUZvclJlZihyZWYpKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgbGV0IHsgbGFzdCwgcmVmLCBmaWx0ZXIgfSA9IHRoaXM7XG4gICAgbGV0IGN1cnJlbnQgPSBmaWx0ZXIodmFsdWVGb3JSZWYocmVmKSk7XG5cbiAgICBpZiAobGFzdCAhPT0gY3VycmVudCkge1xuICAgICAgdm0udGhyb3coKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIHRhZzogVGFnID0gQ09OU1RBTlRfVEFHO1xuICBwcml2YXRlIGxhc3RSZXZpc2lvbjogUmV2aXNpb24gPSBJTklUSUFMO1xuICBwcml2YXRlIHRhcmdldD86IG51bWJlcjtcblxuICBmaW5hbGl6ZSh0YWc6IFRhZywgdGFyZ2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLmRpZE1vZGlmeSh0YWcpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyB0YWcsIHRhcmdldCwgbGFzdFJldmlzaW9uIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF2bS5hbHdheXNSZXZhbGlkYXRlICYmIHZhbGlkYXRlVGFnKHRhZywgbGFzdFJldmlzaW9uKSkge1xuICAgICAgY29uc3VtZVRhZyh0YWcpO1xuICAgICAgdm0uZ290byhleHBlY3QodGFyZ2V0LCAnVk0gQlVHOiBUYXJnZXQgbXVzdCBiZSBzZXQgYmVmb3JlIGF0dGVtcHRpbmcgdG8ganVtcCcpKTtcbiAgICB9XG4gIH1cblxuICBkaWRNb2RpZnkodGFnOiBUYWcpIHtcbiAgICB0aGlzLnRhZyA9IHRhZztcbiAgICB0aGlzLmxhc3RSZXZpc2lvbiA9IHZhbHVlRm9yVGFnKHRoaXMudGFnKTtcbiAgICBjb25zdW1lVGFnKHRhZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJlZ2luVHJhY2tGcmFtZU9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWJ1Z0xhYmVsPzogc3RyaW5nKSB7fVxuXG4gIGV2YWx1YXRlKCkge1xuICAgIGJlZ2luVHJhY2tGcmFtZSh0aGlzLmRlYnVnTGFiZWwpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmRUcmFja0ZyYW1lT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhcmdldDogSnVtcElmTm90TW9kaWZpZWRPcGNvZGUpIHt9XG5cbiAgZXZhbHVhdGUoKSB7XG4gICAgbGV0IHRhZyA9IGVuZFRyYWNrRnJhbWUoKTtcbiAgICB0aGlzLnRhcmdldC5kaWRNb2RpZnkodGFnKTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==