UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

384 lines (298 loc) 37.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdateDynamicAttributeOpcode = exports.UpdateDynamicModifierOpcode = exports.UpdateModifierOpcode = void 0; var _reference = require("@glimmer/reference"); var _validator = require("@glimmer/validator"); var _vm = require("@glimmer/vm"); var _opcodes = require("../../opcodes"); var _vm2 = require("./vm"); var _symbols = require("../../symbols"); var _util = require("@glimmer/util"); var _curriedValue = require("../../curried-value"); var _env = require("@glimmer/env"); var _destroyable2 = require("@glimmer/destroyable"); _opcodes.APPEND_OPCODES.add(41 /* Text */ , function (vm, _ref) { var text = _ref.op1; vm.elements().appendText(vm[_symbols.CONSTANTS].getValue(text)); }); _opcodes.APPEND_OPCODES.add(42 /* Comment */ , function (vm, _ref2) { var text = _ref2.op1; vm.elements().appendComment(vm[_symbols.CONSTANTS].getValue(text)); }); _opcodes.APPEND_OPCODES.add(48 /* OpenElement */ , function (vm, _ref3) { var tag = _ref3.op1; vm.elements().openElement(vm[_symbols.CONSTANTS].getValue(tag)); }); _opcodes.APPEND_OPCODES.add(49 /* OpenDynamicElement */ , function (vm) { var tagName = (0, _reference.valueForRef)(vm.stack.pop()); vm.elements().openElement(tagName); }); _opcodes.APPEND_OPCODES.add(50 /* PushRemoteElement */ , function (vm) { var elementRef = vm.stack.pop(); var insertBeforeRef = vm.stack.pop(); var guidRef = vm.stack.pop(); var element = (0, _reference.valueForRef)(elementRef); var insertBefore = (0, _reference.valueForRef)(insertBeforeRef); var guid = (0, _reference.valueForRef)(guidRef); if (!(0, _reference.isConstRef)(elementRef)) { vm.updateWith(new _vm2.Assert(elementRef)); } if (insertBefore !== undefined && !(0, _reference.isConstRef)(insertBeforeRef)) { vm.updateWith(new _vm2.Assert(insertBeforeRef)); } var block = vm.elements().pushRemoteElement(element, guid, insertBefore); if (block) vm.associateDestroyable(block); }); _opcodes.APPEND_OPCODES.add(56 /* PopRemoteElement */ , function (vm) { vm.elements().popRemoteElement(); }); _opcodes.APPEND_OPCODES.add(54 /* FlushElement */ , function (vm) { var operations = vm.fetchValue(_vm.$t0); var modifiers = null; if (operations) { modifiers = operations.flush(vm); vm.loadValue(_vm.$t0, null); } vm.elements().flushElement(modifiers); }); _opcodes.APPEND_OPCODES.add(55 /* CloseElement */ , function (vm) { var modifiers = vm.elements().closeElement(); if (modifiers) { modifiers.forEach(function (modifier) { vm.env.scheduleInstallModifier(modifier); var manager = modifier.manager, state = modifier.state; var d = manager.getDestroyable(state); if (d) { vm.associateDestroyable(d); } }); } }); _opcodes.APPEND_OPCODES.add(57 /* Modifier */ , function (vm, _ref4) { var handle = _ref4.op1; if (vm.env.isInteractive === false) { return; } var owner = vm.getOwner(); var args = vm.stack.pop(); var definition = vm[_symbols.CONSTANTS].getValue(handle); var manager = definition.manager; var _vm$elements = vm.elements(), constructing = _vm$elements.constructing; var state = manager.create(owner, constructing, definition.state, args.capture()); var instance = { manager: manager, state: state, definition: definition }; var operations = vm.fetchValue(_vm.$t0); operations.addModifier(instance); var tag = manager.getTag(state); if (tag !== null) { (0, _validator.consumeTag)(tag); return vm.updateWith(new UpdateModifierOpcode(tag, instance)); } }); _opcodes.APPEND_OPCODES.add(108 /* DynamicModifier */ , function (vm) { if (vm.env.isInteractive === false) { return; } var stack = vm.stack, constants = vm[_symbols.CONSTANTS]; var ref = stack.pop(); var args = stack.pop().capture(); var _vm$elements2 = vm.elements(), constructing = _vm$elements2.constructing; var initialOwner = vm.getOwner(); var instanceRef = (0, _reference.createComputeRef)(function () { var value = (0, _reference.valueForRef)(ref); var owner; if (!(0, _util.isObject)(value)) { return; } var hostDefinition; if ((0, _curriedValue.isCurriedType)(value, 2 /* Modifier */ )) { var _resolveCurriedValue = (0, _curriedValue.resolveCurriedValue)(value), resolvedDefinition = _resolveCurriedValue.definition, curriedOwner = _resolveCurriedValue.owner, positional = _resolveCurriedValue.positional, named = _resolveCurriedValue.named; hostDefinition = resolvedDefinition; owner = curriedOwner; if (positional !== undefined) { args.positional = positional.concat(args.positional); } if (named !== undefined) { args.named = _util.assign.apply(void 0, [{}].concat(named, [args.named])); } } else { hostDefinition = value; owner = initialOwner; } var handle = constants.modifier(hostDefinition, null, true); if (_env.DEBUG && handle === null) { throw new Error("Expected a dynamic modifier definition, but received an object or function that did not have a modifier manager associated with it. The dynamic invocation was `{{" + ref.debugLabel + "}}`, and the incorrect definition is the value at the path `" + ref.debugLabel + "`, which was: " + (0, _util.debugToString)(hostDefinition)); } var definition = constants.getValue(handle); var manager = definition.manager; var state = manager.create(owner, constructing, definition.state, args); return { manager: manager, state: state, definition: definition }; }); var instance = (0, _reference.valueForRef)(instanceRef); var tag = null; if (instance !== undefined) { var operations = vm.fetchValue(_vm.$t0); operations.addModifier(instance); tag = instance.manager.getTag(instance.state); if (tag !== null) { (0, _validator.consumeTag)(tag); } } if (!(0, _reference.isConstRef)(ref) || tag) { return vm.updateWith(new UpdateDynamicModifierOpcode(tag, instance, instanceRef)); } }); var UpdateModifierOpcode = /*#__PURE__*/function () { function UpdateModifierOpcode(tag, modifier) { this.tag = tag; this.modifier = modifier; this.lastUpdated = (0, _validator.valueForTag)(tag); } var _proto = UpdateModifierOpcode.prototype; _proto.evaluate = function evaluate(vm) { var modifier = this.modifier, tag = this.tag, lastUpdated = this.lastUpdated; (0, _validator.consumeTag)(tag); if (!(0, _validator.validateTag)(tag, lastUpdated)) { vm.env.scheduleUpdateModifier(modifier); this.lastUpdated = (0, _validator.valueForTag)(tag); } }; return UpdateModifierOpcode; }(); exports.UpdateModifierOpcode = UpdateModifierOpcode; var UpdateDynamicModifierOpcode = /*#__PURE__*/function () { function UpdateDynamicModifierOpcode(tag, instance, instanceRef) { this.tag = tag; this.instance = instance; this.instanceRef = instanceRef; this.lastUpdated = (0, _validator.valueForTag)(tag !== null && tag !== void 0 ? tag : _validator.CURRENT_TAG); } var _proto2 = UpdateDynamicModifierOpcode.prototype; _proto2.evaluate = function evaluate(vm) { var tag = this.tag, lastUpdated = this.lastUpdated, instance = this.instance, instanceRef = this.instanceRef; var newInstance = (0, _reference.valueForRef)(instanceRef); if (newInstance !== instance) { if (instance !== undefined) { var destroyable = instance.manager.getDestroyable(instance.state); if (destroyable !== null) { (0, _destroyable2.destroy)(destroyable); } } if (newInstance !== undefined) { var manager = newInstance.manager, state = newInstance.state; var _destroyable = manager.getDestroyable(state); if (_destroyable !== null) { (0, _destroyable2.associateDestroyableChild)(this, _destroyable); } tag = manager.getTag(state); if (tag !== null) { this.lastUpdated = (0, _validator.valueForTag)(tag); } this.tag = tag; vm.env.scheduleInstallModifier(newInstance); } this.instance = newInstance; } else if (tag !== null && !(0, _validator.validateTag)(tag, lastUpdated)) { vm.env.scheduleUpdateModifier(instance); this.lastUpdated = (0, _validator.valueForTag)(tag); } if (tag !== null) { (0, _validator.consumeTag)(tag); } }; return UpdateDynamicModifierOpcode; }(); exports.UpdateDynamicModifierOpcode = UpdateDynamicModifierOpcode; _opcodes.APPEND_OPCODES.add(51 /* StaticAttr */ , function (vm, _ref5) { var _name = _ref5.op1, _value = _ref5.op2, _namespace = _ref5.op3; var name = vm[_symbols.CONSTANTS].getValue(_name); var value = vm[_symbols.CONSTANTS].getValue(_value); var namespace = _namespace ? vm[_symbols.CONSTANTS].getValue(_namespace) : null; vm.elements().setStaticAttribute(name, value, namespace); }); _opcodes.APPEND_OPCODES.add(52 /* DynamicAttr */ , function (vm, _ref6) { var _name = _ref6.op1, _trusting = _ref6.op2, _namespace = _ref6.op3; var name = vm[_symbols.CONSTANTS].getValue(_name); var trusting = vm[_symbols.CONSTANTS].getValue(_trusting); var reference = vm.stack.pop(); var value = (0, _reference.valueForRef)(reference); var namespace = _namespace ? vm[_symbols.CONSTANTS].getValue(_namespace) : null; var attribute = vm.elements().setDynamicAttribute(name, value, trusting, namespace); if (!(0, _reference.isConstRef)(reference)) { vm.updateWith(new UpdateDynamicAttributeOpcode(reference, attribute, vm.env)); } }); var UpdateDynamicAttributeOpcode = /*#__PURE__*/function () { function UpdateDynamicAttributeOpcode(reference, attribute, env) { var initialized = false; this.updateRef = (0, _reference.createComputeRef)(function () { var value = (0, _reference.valueForRef)(reference); if (initialized === true) { attribute.update(value, env); } else { initialized = true; } }); (0, _reference.valueForRef)(this.updateRef); } var _proto3 = UpdateDynamicAttributeOpcode.prototype; _proto3.evaluate = function evaluate() { (0, _reference.valueForRef)(this.updateRef); }; return UpdateDynamicAttributeOpcode; }(); exports.UpdateDynamicAttributeOpcode = UpdateDynamicAttributeOpcode; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUE2QkE7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQTRCLFVBQUEsRUFBQSxFQUFBLElBQUEsRUFBc0I7QUFBQSxNQUFWLElBQVUsR0FBQSxJQUFBLENBQWYsR0FBZTtBQUNoRCxFQUFBLEVBQUUsQ0FBRixRQUFBLEdBQUEsVUFBQSxDQUF5QixFQUFFLENBQUYsa0JBQUUsQ0FBRixDQUFBLFFBQUEsQ0FBekIsSUFBeUIsQ0FBekI7QUFERixDQUFBOztBQUlBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUErQixVQUFBLEVBQUEsRUFBQSxLQUFBLEVBQXNCO0FBQUEsTUFBVixJQUFVLEdBQUEsS0FBQSxDQUFmLEdBQWU7QUFDbkQsRUFBQSxFQUFFLENBQUYsUUFBQSxHQUFBLGFBQUEsQ0FBNEIsRUFBRSxDQUFGLGtCQUFFLENBQUYsQ0FBQSxRQUFBLENBQTVCLElBQTRCLENBQTVCO0FBREYsQ0FBQTs7QUFJQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBbUMsVUFBQSxFQUFBLEVBQUEsS0FBQSxFQUFxQjtBQUFBLE1BQVQsR0FBUyxHQUFBLEtBQUEsQ0FBZCxHQUFjO0FBQ3RELEVBQUEsRUFBRSxDQUFGLFFBQUEsR0FBQSxXQUFBLENBQTBCLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUExQixHQUEwQixDQUExQjtBQURGLENBQUE7O0FBSUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQTJDLFVBQUQsRUFBQyxFQUFNO0FBQy9DLE1BQUksT0FBTyxHQUFTLDRCQUFrQixFQUFFLENBQUYsS0FBQSxDQUF0QyxH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QUFJLFdBQVcsR0FBZixLQUFBO0FBRUEsU0FBQSxTQUFBLEdBQWlCLGlDQUFpQixZQUFLO0FBQ3JDLFVBQUksS0FBSyxHQUFHLDRCQUFaLFNBQVksQ0FBWjs7QUFFQSxVQUFJLFdBQVcsS0FBZixJQUFBLEVBQTBCO0FBQ3hCLFFBQUEsU0FBUyxDQUFULE1BQUEsQ0FBQSxLQUFBLEVBQUEsR0FBQTtBQURGLE9BQUEsTUFFTztBQUNMLFFBQUEsV0FBVyxHQUFYLElBQUE7QUFDRDtBQVBILEtBQWlCLENBQWpCO0FBVUEsZ0NBQVksS0FBWixTQUFBO0FBQ0Q7O0FBakJILE1BQUEsT0FBQSxHQUFBLDRCQUFBLENBQUEsU0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxRQUFBLEdBbUJFLFNBQUEsUUFBQSxHQUFRO0FBQ04sZ0NBQVksS0FBWixTQUFBO0FBcEJKLEdBQUE7O0FBQUEsU0FBQSw0QkFBQTtBQUFBLENBQUEsRUFBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlZmVyZW5jZSwgdmFsdWVGb3JSZWYsIGlzQ29uc3RSZWYsIGNyZWF0ZUNvbXB1dGVSZWYgfSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHtcbiAgUmV2aXNpb24sXG4gIFRhZyxcbiAgdmFsdWVGb3JUYWcsXG4gIHZhbGlkYXRlVGFnLFxuICBjb25zdW1lVGFnLFxuICBDVVJSRU5UX1RBRyxcbn0gZnJvbSAnQGdsaW1tZXIvdmFsaWRhdG9yJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBDaGVja1N0cmluZyxcbiAgQ2hlY2tFbGVtZW50LFxuICBDaGVja09wdGlvbixcbiAgQ2hlY2tOb2RlLFxuICBDaGVja01heWJlLFxufSBmcm9tICdAZ2xpbW1lci9kZWJ1Zyc7XG5pbXBvcnQge1xuICBPcCxcbiAgT3B0aW9uLFxuICBNb2RpZmllckRlZmluaXRpb24sXG4gIE1vZGlmaWVySW5zdGFuY2UsXG4gIE93bmVyLFxuICBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMsXG4gIEN1cnJpZWRUeXBlLFxuICBNb2RpZmllckRlZmluaXRpb25TdGF0ZSxcbiAgRW52aXJvbm1lbnQsXG4gIFVwZGF0aW5nVk0sXG4gIFVwZGF0aW5nT3Bjb2RlLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7ICR0MCB9IGZyb20gJ0BnbGltbWVyL3ZtJztcbmltcG9ydCB7IEFQUEVORF9PUENPREVTIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBBc3NlcnQgfSBmcm9tICcuL3ZtJztcbmltcG9ydCB7IER5bmFtaWNBdHRyaWJ1dGUgfSBmcm9tICcuLi8uLi92bS9hdHRyaWJ1dGVzL2R5bmFtaWMnO1xuaW1wb3J0IHsgQ2hlY2tSZWZlcmVuY2UsIENoZWNrQXJndW1lbnRzLCBDaGVja09wZXJhdGlvbnMgfSBmcm9tICcuLy1kZWJ1Zy1zdHJpcCc7XG5pbXBvcnQgeyBDT05TVEFOVFMgfSBmcm9tICcuLi8uLi9zeW1ib2xzJztcbmltcG9ydCB7IGFzc2lnbiwgZGVidWdUb1N0cmluZywgZXhwZWN0LCBpc09iamVjdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQ3VycmllZFZhbHVlLCBpc0N1cnJpZWRUeXBlLCByZXNvbHZlQ3VycmllZFZhbHVlIH0gZnJvbSAnLi4vLi4vY3VycmllZC12YWx1ZSc7XG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgeyBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkLCBkZXN0cm95IH0gZnJvbSAnQGdsaW1tZXIvZGVzdHJveWFibGUnO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuVGV4dCwgKHZtLCB7IG9wMTogdGV4dCB9KSA9PiB7XG4gIHZtLmVsZW1lbnRzKCkuYXBwZW5kVGV4dCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKHRleHQpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29tbWVudCwgKHZtLCB7IG9wMTogdGV4dCB9KSA9PiB7XG4gIHZtLmVsZW1lbnRzKCkuYXBwZW5kQ29tbWVudCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKHRleHQpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuT3BlbkVsZW1lbnQsICh2bSwgeyBvcDE6IHRhZyB9KSA9PiB7XG4gIHZtLmVsZW1lbnRzKCkub3BlbkVsZW1lbnQodm1bQ09OU1RBTlRTXS5nZXRWYWx1ZSh0YWcpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuT3BlbkR5bmFtaWNFbGVtZW50LCAodm0pID0+IHtcbiAgbGV0IHRhZ05hbWUgPSBjaGVjayh2YWx1ZUZvclJlZihjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpKSwgQ2hlY2tTdHJpbmcpO1xuICB2bS5lbGVtZW50cygpLm9wZW5FbGVtZW50KHRhZ05hbWUpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QdXNoUmVtb3RlRWxlbWVudCwgKHZtKSA9PiB7XG4gIGxldCBlbGVtZW50UmVmID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGluc2VydEJlZm9yZVJlZiA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCBndWlkUmVmID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBsZXQgZWxlbWVudCA9IGNoZWNrKHZhbHVlRm9yUmVmKGVsZW1lbnRSZWYpLCBDaGVja0VsZW1lbnQpO1xuICBsZXQgaW5zZXJ0QmVmb3JlID0gY2hlY2sodmFsdWVGb3JSZWYoaW5zZXJ0QmVmb3JlUmVmKSwgQ2hlY2tNYXliZShDaGVja09wdGlvbihDaGVja05vZGUpKSk7XG4gIGxldCBndWlkID0gdmFsdWVGb3JSZWYoZ3VpZFJlZikgYXMgc3RyaW5nO1xuXG4gIGlmICghaXNDb25zdFJlZihlbGVtZW50UmVmKSkge1xuICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChlbGVtZW50UmVmKSk7XG4gIH1cblxuICBpZiAoaW5zZXJ0QmVmb3JlICE9PSB1bmRlZmluZWQgJiYgIWlzQ29uc3RSZWYoaW5zZXJ0QmVmb3JlUmVmKSkge1xuICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChpbnNlcnRCZWZvcmVSZWYpKTtcbiAgfVxuXG4gIGxldCBibG9jayA9IHZtLmVsZW1lbnRzKCkucHVzaFJlbW90ZUVsZW1lbnQoZWxlbWVudCwgZ3VpZCwgaW5zZXJ0QmVmb3JlKTtcbiAgaWYgKGJsb2NrKSB2bS5hc3NvY2lhdGVEZXN0cm95YWJsZShibG9jayk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlBvcFJlbW90ZUVsZW1lbnQsICh2bSkgPT4ge1xuICB2bS5lbGVtZW50cygpLnBvcFJlbW90ZUVsZW1lbnQoKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRmx1c2hFbGVtZW50LCAodm0pID0+IHtcbiAgbGV0IG9wZXJhdGlvbnMgPSBjaGVjayh2bS5mZXRjaFZhbHVlKCR0MCksIENoZWNrT3BlcmF0aW9ucyk7XG4gIGxldCBtb2RpZmllcnM6IE9wdGlvbjxNb2RpZmllckluc3RhbmNlW10+ID0gbnVsbDtcblxuICBpZiAob3BlcmF0aW9ucykge1xuICAgIG1vZGlmaWVycyA9IG9wZXJhdGlvbnMuZmx1c2godm0pO1xuICAgIHZtLmxvYWRWYWx1ZSgkdDAsIG51bGwpO1xuICB9XG5cbiAgdm0uZWxlbWVudHMoKS5mbHVzaEVsZW1lbnQobW9kaWZpZXJzKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ2xvc2VFbGVtZW50LCAodm0pID0+IHtcbiAgbGV0IG1vZGlmaWVycyA9IHZtLmVsZW1lbnRzKCkuY2xvc2VFbGVtZW50KCk7XG5cbiAgaWYgKG1vZGlmaWVycykge1xuICAgIG1vZGlmaWVycy5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xuICAgICAgdm0uZW52LnNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG1vZGlmaWVyKTtcbiAgICAgIGxldCB7IG1hbmFnZXIsIHN0YXRlIH0gPSBtb2RpZmllcjtcbiAgICAgIGxldCBkID0gbWFuYWdlci5nZXREZXN0cm95YWJsZShzdGF0ZSk7XG5cbiAgICAgIGlmIChkKSB7XG4gICAgICAgIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKGQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLk1vZGlmaWVyLCAodm0sIHsgb3AxOiBoYW5kbGUgfSkgPT4ge1xuICBpZiAodm0uZW52LmlzSW50ZXJhY3RpdmUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG93bmVyID0gdm0uZ2V0T3duZXIoKTtcbiAgbGV0IGFyZ3MgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tBcmd1bWVudHMpO1xuICBsZXQgZGVmaW5pdGlvbiA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8TW9kaWZpZXJEZWZpbml0aW9uPihoYW5kbGUpO1xuXG4gIGxldCB7IG1hbmFnZXIgfSA9IGRlZmluaXRpb247XG5cbiAgbGV0IHsgY29uc3RydWN0aW5nIH0gPSB2bS5lbGVtZW50cygpO1xuXG4gIGxldCBzdGF0ZSA9IG1hbmFnZXIuY3JlYXRlKFxuICAgIG93bmVyLFxuICAgIGV4cGVjdChjb25zdHJ1Y3RpbmcsICdCVUc6IEVsZW1lbnRNb2RpZmllciBjb3VsZCBub3QgZmluZCB0aGUgZWxlbWVudCBpdCBhcHBsaWVzIHRvJyksXG4gICAgZGVmaW5pdGlvbi5zdGF0ZSxcbiAgICBhcmdzLmNhcHR1cmUoKVxuICApO1xuXG4gIGxldCBpbnN0YW5jZTogTW9kaWZpZXJJbnN0YW5jZSA9IHtcbiAgICBtYW5hZ2VyLFxuICAgIHN0YXRlLFxuICAgIGRlZmluaXRpb24sXG4gIH07XG5cbiAgbGV0IG9wZXJhdGlvbnMgPSBleHBlY3QoXG4gICAgY2hlY2sodm0uZmV0Y2hWYWx1ZSgkdDApLCBDaGVja09wZXJhdGlvbnMpLFxuICAgICdCVUc6IEVsZW1lbnRNb2RpZmllciBjb3VsZCBub3QgZmluZCBvcGVyYXRpb25zIHRvIGFwcGVuZCB0bydcbiAgKTtcblxuICBvcGVyYXRpb25zLmFkZE1vZGlmaWVyKGluc3RhbmNlKTtcblxuICBsZXQgdGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gIGlmICh0YWcgIT09IG51bGwpIHtcbiAgICBjb25zdW1lVGFnKHRhZyk7XG4gICAgcmV0dXJuIHZtLnVwZGF0ZVdpdGgobmV3IFVwZGF0ZU1vZGlmaWVyT3Bjb2RlKHRhZywgaW5zdGFuY2UpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5EeW5hbWljTW9kaWZpZXIsICh2bSkgPT4ge1xuICBpZiAodm0uZW52LmlzSW50ZXJhY3RpdmUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHsgc3RhY2ssIFtDT05TVEFOVFNdOiBjb25zdGFudHMgfSA9IHZtO1xuICBsZXQgcmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tBcmd1bWVudHMpLmNhcHR1cmUoKTtcbiAgbGV0IHsgY29uc3RydWN0aW5nIH0gPSB2bS5lbGVtZW50cygpO1xuICBsZXQgaW5pdGlhbE93bmVyID0gdm0uZ2V0T3duZXIoKTtcblxuICBsZXQgaW5zdGFuY2VSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICBsZXQgdmFsdWUgPSB2YWx1ZUZvclJlZihyZWYpO1xuICAgIGxldCBvd25lcjogT3duZXI7XG5cbiAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBob3N0RGVmaW5pdGlvbjogQ3VycmllZFZhbHVlIHwgTW9kaWZpZXJEZWZpbml0aW9uU3RhdGU7XG5cbiAgICBpZiAoaXNDdXJyaWVkVHlwZSh2YWx1ZSwgQ3VycmllZFR5cGUuTW9kaWZpZXIpKSB7XG4gICAgICBsZXQge1xuICAgICAgICBkZWZpbml0aW9uOiByZXNvbHZlZERlZmluaXRpb24sXG4gICAgICAgIG93bmVyOiBjdXJyaWVkT3duZXIsXG4gICAgICAgIHBvc2l0aW9uYWwsXG4gICAgICAgIG5hbWVkLFxuICAgICAgfSA9IHJlc29sdmVDdXJyaWVkVmFsdWUodmFsdWUpO1xuXG4gICAgICBob3N0RGVmaW5pdGlvbiA9IHJlc29sdmVkRGVmaW5pdGlvbjtcbiAgICAgIG93bmVyID0gY3VycmllZE93bmVyO1xuXG4gICAgICBpZiAocG9zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MucG9zaXRpb25hbCA9IHBvc2l0aW9uYWwuY29uY2F0KGFyZ3MucG9zaXRpb25hbCkgYXMgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzO1xuICAgICAgfVxuXG4gICAgICBpZiAobmFtZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhcmdzLm5hbWVkID0gYXNzaWduKHt9LCAuLi5uYW1lZCwgYXJncy5uYW1lZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvc3REZWZpbml0aW9uID0gdmFsdWU7XG4gICAgICBvd25lciA9IGluaXRpYWxPd25lcjtcbiAgICB9XG5cbiAgICBsZXQgaGFuZGxlID0gY29uc3RhbnRzLm1vZGlmaWVyKGhvc3REZWZpbml0aW9uLCBudWxsLCB0cnVlKTtcblxuICAgIGlmIChERUJVRyAmJiBoYW5kbGUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEV4cGVjdGVkIGEgZHluYW1pYyBtb2RpZmllciBkZWZpbml0aW9uLCBidXQgcmVjZWl2ZWQgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHRoYXQgZGlkIG5vdCBoYXZlIGEgbW9kaWZpZXIgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggaXQuIFRoZSBkeW5hbWljIGludm9jYXRpb24gd2FzIFxcYHt7JHtcbiAgICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgICB9fX1cXGAsIGFuZCB0aGUgaW5jb3JyZWN0IGRlZmluaXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBwYXRoIFxcYCR7XG4gICAgICAgICAgcmVmLmRlYnVnTGFiZWxcbiAgICAgICAgfVxcYCwgd2hpY2ggd2FzOiAke2RlYnVnVG9TdHJpbmchKGhvc3REZWZpbml0aW9uKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBkZWZpbml0aW9uID0gY29uc3RhbnRzLmdldFZhbHVlPE1vZGlmaWVyRGVmaW5pdGlvbj4oXG4gICAgICBleHBlY3QoaGFuZGxlLCAnQlVHOiBtb2RpZmllciBoYW5kbGUgZXhwZWN0ZWQnKVxuICAgICk7XG5cbiAgICBsZXQgeyBtYW5hZ2VyIH0gPSBkZWZpbml0aW9uO1xuXG4gICAgbGV0IHN0YXRlID0gbWFuYWdlci5jcmVhdGUoXG4gICAgICBvd25lcixcbiAgICAgIGV4cGVjdChjb25zdHJ1Y3RpbmcsICdCVUc6IEVsZW1lbnRNb2RpZmllciBjb3VsZCBub3QgZmluZCB0aGUgZWxlbWVudCBpdCBhcHBsaWVzIHRvJyksXG4gICAgICBkZWZpbml0aW9uLnN0YXRlLFxuICAgICAgYXJnc1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWFuYWdlcixcbiAgICAgIHN0YXRlLFxuICAgICAgZGVmaW5pdGlvbixcbiAgICB9O1xuICB9KTtcblxuICBsZXQgaW5zdGFuY2UgPSB2YWx1ZUZvclJlZihpbnN0YW5jZVJlZik7XG4gIGxldCB0YWcgPSBudWxsO1xuXG4gIGlmIChpbnN0YW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IG9wZXJhdGlvbnMgPSBleHBlY3QoXG4gICAgICBjaGVjayh2bS5mZXRjaFZhbHVlKCR0MCksIENoZWNrT3BlcmF0aW9ucyksXG4gICAgICAnQlVHOiBFbGVtZW50TW9kaWZpZXIgY291bGQgbm90IGZpbmQgb3BlcmF0aW9ucyB0byBhcHBlbmQgdG8nXG4gICAgKTtcblxuICAgIG9wZXJhdGlvbnMuYWRkTW9kaWZpZXIoaW5zdGFuY2UpO1xuXG4gICAgdGFnID0gaW5zdGFuY2UubWFuYWdlci5nZXRUYWcoaW5zdGFuY2Uuc3RhdGUpO1xuXG4gICAgaWYgKHRhZyAhPT0gbnVsbCkge1xuICAgICAgY29uc3VtZVRhZyh0YWcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghaXNDb25zdFJlZihyZWYpIHx8IHRhZykge1xuICAgIHJldHVybiB2bS51cGRhdGVXaXRoKG5ldyBVcGRhdGVEeW5hbWljTW9kaWZpZXJPcGNvZGUodGFnLCBpbnN0YW5jZSwgaW5zdGFuY2VSZWYpKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVNb2RpZmllck9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSBsYXN0VXBkYXRlZDogUmV2aXNpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0YWc6IFRhZywgcHJpdmF0ZSBtb2RpZmllcjogTW9kaWZpZXJJbnN0YW5jZSkge1xuICAgIHRoaXMubGFzdFVwZGF0ZWQgPSB2YWx1ZUZvclRhZyh0YWcpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyBtb2RpZmllciwgdGFnLCBsYXN0VXBkYXRlZCB9ID0gdGhpcztcblxuICAgIGNvbnN1bWVUYWcodGFnKTtcblxuICAgIGlmICghdmFsaWRhdGVUYWcodGFnLCBsYXN0VXBkYXRlZCkpIHtcbiAgICAgIHZtLmVudi5zY2hlZHVsZVVwZGF0ZU1vZGlmaWVyKG1vZGlmaWVyKTtcbiAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSB2YWx1ZUZvclRhZyh0YWcpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlRHluYW1pY01vZGlmaWVyT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIGxhc3RVcGRhdGVkOiBSZXZpc2lvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRhZzogVGFnIHwgbnVsbCxcbiAgICBwcml2YXRlIGluc3RhbmNlOiBNb2RpZmllckluc3RhbmNlIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgaW5zdGFuY2VSZWY6IFJlZmVyZW5jZTxNb2RpZmllckluc3RhbmNlIHwgdW5kZWZpbmVkPlxuICApIHtcbiAgICB0aGlzLmxhc3RVcGRhdGVkID0gdmFsdWVGb3JUYWcodGFnID8/IENVUlJFTlRfVEFHKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgbGV0IHsgdGFnLCBsYXN0VXBkYXRlZCwgaW5zdGFuY2UsIGluc3RhbmNlUmVmIH0gPSB0aGlzO1xuXG4gICAgbGV0IG5ld0luc3RhbmNlID0gdmFsdWVGb3JSZWYoaW5zdGFuY2VSZWYpO1xuXG4gICAgaWYgKG5ld0luc3RhbmNlICE9PSBpbnN0YW5jZSkge1xuICAgICAgaWYgKGluc3RhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGRlc3Ryb3lhYmxlID0gaW5zdGFuY2UubWFuYWdlci5nZXREZXN0cm95YWJsZShpbnN0YW5jZS5zdGF0ZSk7XG5cbiAgICAgICAgaWYgKGRlc3Ryb3lhYmxlICE9PSBudWxsKSB7XG4gICAgICAgICAgZGVzdHJveShkZXN0cm95YWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0luc3RhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IHsgbWFuYWdlciwgc3RhdGUgfSA9IG5ld0luc3RhbmNlO1xuICAgICAgICBsZXQgZGVzdHJveWFibGUgPSBtYW5hZ2VyLmdldERlc3Ryb3lhYmxlKHN0YXRlKTtcblxuICAgICAgICBpZiAoZGVzdHJveWFibGUgIT09IG51bGwpIHtcbiAgICAgICAgICBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkKHRoaXMsIGRlc3Ryb3lhYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhZyA9IG1hbmFnZXIuZ2V0VGFnKHN0YXRlKTtcblxuICAgICAgICBpZiAodGFnICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IHZhbHVlRm9yVGFnKHRhZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRhZyA9IHRhZztcbiAgICAgICAgdm0uZW52LnNjaGVkdWxlSW5zdGFsbE1vZGlmaWVyKG5ld0luc3RhbmNlISk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXdJbnN0YW5jZTtcbiAgICB9IGVsc2UgaWYgKHRhZyAhPT0gbnVsbCAmJiAhdmFsaWRhdGVUYWcodGFnLCBsYXN0VXBkYXRlZCkpIHtcbiAgICAgIHZtLmVudi5zY2hlZHVsZVVwZGF0ZU1vZGlmaWVyKGluc3RhbmNlISk7XG4gICAgICB0aGlzLmxhc3RVcGRhdGVkID0gdmFsdWVGb3JUYWcodGFnKTtcbiAgICB9XG5cbiAgICBpZiAodGFnICE9PSBudWxsKSB7XG4gICAgICBjb25zdW1lVGFnKHRhZyk7XG4gICAgfVxuICB9XG59XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5TdGF0aWNBdHRyLCAodm0sIHsgb3AxOiBfbmFtZSwgb3AyOiBfdmFsdWUsIG9wMzogX25hbWVzcGFjZSB9KSA9PiB7XG4gIGxldCBuYW1lID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9uYW1lKTtcbiAgbGV0IHZhbHVlID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF92YWx1ZSk7XG4gIGxldCBuYW1lc3BhY2UgPSBfbmFtZXNwYWNlID8gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9uYW1lc3BhY2UpIDogbnVsbDtcblxuICB2bS5lbGVtZW50cygpLnNldFN0YXRpY0F0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRHluYW1pY0F0dHIsICh2bSwgeyBvcDE6IF9uYW1lLCBvcDI6IF90cnVzdGluZywgb3AzOiBfbmFtZXNwYWNlIH0pID0+IHtcbiAgbGV0IG5hbWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWUpO1xuICBsZXQgdHJ1c3RpbmcgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPGJvb2xlYW4+KF90cnVzdGluZyk7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSB2YWx1ZUZvclJlZihyZWZlcmVuY2UpO1xuICBsZXQgbmFtZXNwYWNlID0gX25hbWVzcGFjZSA/IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZXNwYWNlKSA6IG51bGw7XG5cbiAgbGV0IGF0dHJpYnV0ZSA9IHZtLmVsZW1lbnRzKCkuc2V0RHluYW1pY0F0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgdHJ1c3RpbmcsIG5hbWVzcGFjZSk7XG5cbiAgaWYgKCFpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICB2bS51cGRhdGVXaXRoKG5ldyBVcGRhdGVEeW5hbWljQXR0cmlidXRlT3Bjb2RlKHJlZmVyZW5jZSwgYXR0cmlidXRlLCB2bS5lbnYpKTtcbiAgfVxufSk7XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVEeW5hbWljQXR0cmlidXRlT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIHVwZGF0ZVJlZjogUmVmZXJlbmNlO1xuXG4gIGNvbnN0cnVjdG9yKHJlZmVyZW5jZTogUmVmZXJlbmNlPHVua25vd24+LCBhdHRyaWJ1dGU6IER5bmFtaWNBdHRyaWJ1dGUsIGVudjogRW52aXJvbm1lbnQpIHtcbiAgICBsZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMudXBkYXRlUmVmID0gY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSB2YWx1ZUZvclJlZihyZWZlcmVuY2UpO1xuXG4gICAgICBpZiAoaW5pdGlhbGl6ZWQgPT09IHRydWUpIHtcbiAgICAgICAgYXR0cmlidXRlLnVwZGF0ZSh2YWx1ZSwgZW52KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhbHVlRm9yUmVmKHRoaXMudXBkYXRlUmVmKTtcbiAgfVxuXG4gIGV2YWx1YXRlKCkge1xuICAgIHZhbHVlRm9yUmVmKHRoaXMudXBkYXRlUmVmKTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==