@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
384 lines (298 loc) • 37.2 kB
JavaScript
"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==