@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
315 lines (253 loc) • 32.2 kB
JavaScript
;
var _reference = require("@glimmer/reference");
var _vm = require("@glimmer/vm");
var _opcodes = require("../../opcodes");
var _concat = require("../expressions/concat");
var _destroyable = require("@glimmer/destroyable");
var _util = require("@glimmer/util");
var _globalContext = require("@glimmer/global-context");
var _symbols = require("../../symbols");
var _env = require("@glimmer/env");
var _curryValue = _interopRequireDefault(require("../../references/curry-value"));
var _curriedValue = require("../../curried-value");
var _arguments = require("../../vm/arguments");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_opcodes.APPEND_OPCODES.add(77
/* Curry */
, function (vm, _ref) {
var type = _ref.op1,
_isStrict = _ref.op2;
var stack = vm.stack;
var definition = stack.pop();
var capturedArgs = stack.pop();
var owner = vm.getOwner();
var resolver = vm.runtime.resolver;
var isStrict = false;
if (_env.DEBUG) {
// strict check only happens in DEBUG builds, no reason to load it otherwise
isStrict = vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(_isStrict));
}
vm.loadValue(_vm.$v0, (0, _curryValue.default)(type, definition, owner, capturedArgs, resolver, isStrict));
});
_opcodes.APPEND_OPCODES.add(107
/* DynamicHelper */
, function (vm) {
var stack = vm.stack;
var ref = stack.pop();
var args = stack.pop().capture();
var helperRef;
var initialOwner = vm.getOwner();
var helperInstanceRef = (0, _reference.createComputeRef)(function () {
if (helperRef !== undefined) {
(0, _destroyable.destroy)(helperRef);
}
var definition = (0, _reference.valueForRef)(ref);
if ((0, _curriedValue.isCurriedType)(definition, 1
/* Helper */
)) {
var _resolveCurriedValue = (0, _curriedValue.resolveCurriedValue)(definition),
resolvedDef = _resolveCurriedValue.definition,
owner = _resolveCurriedValue.owner,
positional = _resolveCurriedValue.positional,
named = _resolveCurriedValue.named;
var helper = resolveHelper(vm[_symbols.CONSTANTS], resolvedDef, ref);
if (named !== undefined) {
args.named = _util.assign.apply(void 0, [{}].concat(named, [args.named]));
}
if (positional !== undefined) {
args.positional = positional.concat(args.positional);
}
helperRef = helper(args, owner);
(0, _destroyable.associateDestroyableChild)(helperInstanceRef, helperRef);
} else if ((0, _util.isObject)(definition)) {
var _helper = resolveHelper(vm[_symbols.CONSTANTS], definition, ref);
helperRef = _helper(args, initialOwner);
if ((0, _destroyable._hasDestroyableChildren)(helperRef)) {
(0, _destroyable.associateDestroyableChild)(helperInstanceRef, helperRef);
}
} else {
helperRef = _reference.UNDEFINED_REFERENCE;
}
});
var helperValueRef = (0, _reference.createComputeRef)(function () {
(0, _reference.valueForRef)(helperInstanceRef);
return (0, _reference.valueForRef)(helperRef);
});
vm.associateDestroyable(helperInstanceRef);
vm.loadValue(_vm.$v0, helperValueRef);
});
function resolveHelper(constants, definition, ref) {
var handle = constants.helper(definition, null, true);
if (_env.DEBUG && handle === null) {
throw new Error("Expected a dynamic helper definition, but received an object or function that did not have a helper manager associated with it. The dynamic invocation was `{{" + ref.debugLabel + "}}` or `(" + ref.debugLabel + ")`, and the incorrect definition is the value at the path `" + ref.debugLabel + "`, which was: " + (0, _util.debugToString)(definition));
}
return constants.getValue(handle);
}
_opcodes.APPEND_OPCODES.add(16
/* Helper */
, function (vm, _ref2) {
var handle = _ref2.op1;
var stack = vm.stack;
var helper = vm[_symbols.CONSTANTS].getValue(handle);
var args = stack.pop();
var value = helper(args.capture(), vm.getOwner(), vm.dynamicScope());
if ((0, _destroyable._hasDestroyableChildren)(value)) {
vm.associateDestroyable(value);
}
vm.loadValue(_vm.$v0, value);
});
_opcodes.APPEND_OPCODES.add(21
/* GetVariable */
, function (vm, _ref3) {
var symbol = _ref3.op1;
var expr = vm.referenceForSymbol(symbol);
vm.stack.push(expr);
});
_opcodes.APPEND_OPCODES.add(19
/* SetVariable */
, function (vm, _ref4) {
var symbol = _ref4.op1;
var expr = vm.stack.pop();
vm.scope().bindSymbol(symbol, expr);
});
_opcodes.APPEND_OPCODES.add(20
/* SetBlock */
, function (vm, _ref5) {
var symbol = _ref5.op1;
var handle = vm.stack.pop();
var scope = vm.stack.pop();
var table = vm.stack.pop();
vm.scope().bindBlock(symbol, [handle, scope, table]);
});
_opcodes.APPEND_OPCODES.add(102
/* ResolveMaybeLocal */
, function (vm, _ref6) {
var _name = _ref6.op1;
var name = vm[_symbols.CONSTANTS].getValue(_name);
var locals = vm.scope().getPartialMap();
var ref = locals[name];
if (ref === undefined) {
ref = (0, _reference.childRefFor)(vm.getSelf(), name);
}
vm.stack.push(ref);
});
_opcodes.APPEND_OPCODES.add(37
/* RootScope */
, function (vm, _ref7) {
var symbols = _ref7.op1;
vm.pushRootScope(symbols, vm.getOwner());
});
_opcodes.APPEND_OPCODES.add(22
/* GetProperty */
, function (vm, _ref8) {
var _key = _ref8.op1;
var key = vm[_symbols.CONSTANTS].getValue(_key);
var expr = vm.stack.pop();
vm.stack.push((0, _reference.childRefFor)(expr, key));
});
_opcodes.APPEND_OPCODES.add(23
/* GetBlock */
, function (vm, _ref9) {
var _block = _ref9.op1;
var stack = vm.stack;
var block = vm.scope().getBlock(_block);
stack.push(block);
});
_opcodes.APPEND_OPCODES.add(24
/* SpreadBlock */
, function (vm) {
var stack = vm.stack;
var block = stack.pop();
if (block && !isUndefinedReference(block)) {
var handleOrCompilable = block[0],
scope = block[1],
table = block[2];
stack.push(table);
stack.push(scope);
stack.push(handleOrCompilable);
} else {
stack.push(null);
stack.push(null);
stack.push(null);
}
});
function isUndefinedReference(input) {
false && (0, _util.assert)(Array.isArray(input) || input === _reference.UNDEFINED_REFERENCE, 'a reference other than UNDEFINED_REFERENCE is illegal here');
return input === _reference.UNDEFINED_REFERENCE;
}
_opcodes.APPEND_OPCODES.add(25
/* HasBlock */
, function (vm) {
var stack = vm.stack;
var block = stack.pop();
if (block && !isUndefinedReference(block)) {
stack.push(_reference.TRUE_REFERENCE);
} else {
stack.push(_reference.FALSE_REFERENCE);
}
});
_opcodes.APPEND_OPCODES.add(26
/* HasBlockParams */
, function (vm) {
// FIXME(mmun): should only need to push the symbol table
var block = vm.stack.pop();
var scope = vm.stack.pop();
var table = vm.stack.pop();
var hasBlockParams = table && table.parameters.length;
vm.stack.push(hasBlockParams ? _reference.TRUE_REFERENCE : _reference.FALSE_REFERENCE);
});
_opcodes.APPEND_OPCODES.add(27
/* Concat */
, function (vm, _ref10) {
var count = _ref10.op1;
var out = new Array(count);
for (var i = count; i > 0; i--) {
var offset = i - 1;
out[offset] = vm.stack.pop();
}
vm.stack.push((0, _concat.createConcatRef)(out));
});
_opcodes.APPEND_OPCODES.add(109
/* IfInline */
, function (vm) {
var condition = vm.stack.pop();
var truthy = vm.stack.pop();
var falsy = vm.stack.pop();
vm.stack.push((0, _reference.createComputeRef)(function () {
if ((0, _globalContext.toBool)((0, _reference.valueForRef)(condition)) === true) {
return (0, _reference.valueForRef)(truthy);
} else {
return (0, _reference.valueForRef)(falsy);
}
}));
});
_opcodes.APPEND_OPCODES.add(110
/* Not */
, function (vm) {
var ref = vm.stack.pop();
vm.stack.push((0, _reference.createComputeRef)(function () {
return !(0, _globalContext.toBool)((0, _reference.valueForRef)(ref));
}));
});
_opcodes.APPEND_OPCODES.add(111
/* GetDynamicVar */
, function (vm) {
var scope = vm.dynamicScope();
var stack = vm.stack;
var nameRef = stack.pop();
stack.push((0, _reference.createComputeRef)(function () {
var name = String((0, _reference.valueForRef)(nameRef));
return (0, _reference.valueForRef)(scope.get(name));
}));
});
_opcodes.APPEND_OPCODES.add(112
/* Log */
, function (vm) {
var _vm$stack$pop$capture = vm.stack.pop().capture(),
positional = _vm$stack$pop$capture.positional;
vm.loadValue(_vm.$v0, (0, _reference.createComputeRef)(function () {
var _console; // eslint-disable-next-line no-console
(_console = console).log.apply(_console, (0, _arguments.reifyPositional)(positional));
}));
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZXhwcmVzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFZQTs7QUFTQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFtQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFJQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBNkIsVUFBQSxFQUFBLEVBQUEsSUFBQSxFQUFzQztBQUFBLE1BQWpDLElBQWlDLEdBQUEsSUFBQSxDQUEvQixHQUErQjtBQUFBLE1BQWYsU0FBZSxHQUFBLElBQUEsQ0FBcEIsR0FBb0I7QUFDakUsTUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFkLEtBQUE7QUFFQSxNQUFJLFVBQVUsR0FBUyxLQUFLLENBQTVCLEdBQXVCLEVBQXZCO0FBQ0EsTUFBSSxZQUFZLEdBQVMsS0FBSyxDQUE5QixHQUF5QixFQUF6QjtBQUVBLE1BQUksS0FBSyxHQUFHLEVBQUUsQ0FBZCxRQUFZLEVBQVo7QUFDQSxNQUFJLFFBQVEsR0FBRyxFQUFFLENBQUYsT0FBQSxDQUFmLFFBQUE7QUFFQSxNQUFJLFFBQVEsR0FBWixLQUFBOztBQUVBLE1BQUEsVUFBQSxFQUFXO0FBQ1Q7QUFDQSxJQUFBLFFBQVEsR0FBRyxFQUFFLENBQUYsa0JBQUUsQ0FBRixDQUFBLFFBQUEsQ0FBZ0Msd0JBQTNDLFNBQTJDLENBQWhDLENBQVg7QUFDRDs7QUFFRCxFQUFBLEVBQUUsQ0FBRixTQUFBLENBQUEsT0FBQSxFQUVFLHlCQUFjLElBQWQsRUFBYyxVQUFkLEVBQWMsS0FBZCxFQUFjLFlBQWQsRUFBYyxRQUFkLEVBRkYsUUFFRSxDQUZGO0FBaEJGLENBQUE7O0FBc0JBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFzQyxVQUFELEVBQUMsRUFBTTtBQUMxQyxNQUFJLEtBQUssR0FBRyxFQUFFLENBQWQsS0FB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LFNBQUEsQ0FBQSxPQUFBLEVBRUUsaUNBQWlCLFlBQUs7QUFBQSxRQUFBLFFBQUEsQ0FBQSxDQUNwQjs7O0FBQ0EsS0FBQSxRQUFBLEdBQUEsT0FBQSxFQUFBLEdBQUEsQ0FBQSxLQUFBLENBQUEsUUFBQSxFQUFlLGdDQUFmLFVBQWUsQ0FBZjtBQUpKLEdBRUUsQ0FGRjtBQUhGLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMsXG4gIEN1cnJpZWRUeXBlLFxuICBIZWxwZXIsXG4gIEhlbHBlckRlZmluaXRpb25TdGF0ZSxcbiAgT3AsXG4gIE93bmVyLFxuICBSZXNvbHV0aW9uVGltZUNvbnN0YW50cyxcbiAgUnVudGltZUNvbnN0YW50cyxcbiAgU2NvcGVCbG9jayxcbiAgVk0gYXMgUHVibGljVk0sXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgUmVmZXJlbmNlLFxuICBjaGlsZFJlZkZvcixcbiAgVU5ERUZJTkVEX1JFRkVSRU5DRSxcbiAgVFJVRV9SRUZFUkVOQ0UsXG4gIEZBTFNFX1JFRkVSRU5DRSxcbiAgdmFsdWVGb3JSZWYsXG4gIGNyZWF0ZUNvbXB1dGVSZWYsXG59IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQgeyAkdjAgfSBmcm9tICdAZ2xpbW1lci92bSc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUyB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgY3JlYXRlQ29uY2F0UmVmIH0gZnJvbSAnLi4vZXhwcmVzc2lvbnMvY29uY2F0JztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQsIGRlc3Ryb3ksIF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuIH0gZnJvbSAnQGdsaW1tZXIvZGVzdHJveWFibGUnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NpZ24sIGRlYnVnVG9TdHJpbmcsIGRlY29kZUhhbmRsZSwgaXNPYmplY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IHRvQm9vbCB9IGZyb20gJ0BnbGltbWVyL2dsb2JhbC1jb250ZXh0JztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBDaGVja09wdGlvbixcbiAgQ2hlY2tIYW5kbGUsXG4gIENoZWNrQmxvY2tTeW1ib2xUYWJsZSxcbiAgQ2hlY2tPcixcbiAgQ2hlY2tNYXliZSxcbn0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHtcbiAgQ2hlY2tBcmd1bWVudHMsXG4gIENoZWNrUmVmZXJlbmNlLFxuICBDaGVja0NvbXBpbGFibGVCbG9jayxcbiAgQ2hlY2tTY29wZSxcbiAgQ2hlY2tIZWxwZXIsXG4gIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlLFxuICBDaGVja1Njb3BlQmxvY2ssXG4gIENoZWNrQ2FwdHVyZWRBcmd1bWVudHMsXG59IGZyb20gJy4vLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IGNyZWF0ZUN1cnJ5UmVmIGZyb20gJy4uLy4uL3JlZmVyZW5jZXMvY3VycnktdmFsdWUnO1xuaW1wb3J0IHsgaXNDdXJyaWVkVHlwZSwgcmVzb2x2ZUN1cnJpZWRWYWx1ZSB9IGZyb20gJy4uLy4uL2N1cnJpZWQtdmFsdWUnO1xuaW1wb3J0IHsgcmVpZnlQb3NpdGlvbmFsIH0gZnJvbSAnLi4vLi4vdm0vYXJndW1lbnRzJztcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gKHZtOiBQdWJsaWNWTSkgPT4gUmVmZXJlbmNlPFQ+O1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ3VycnksICh2bSwgeyBvcDE6IHR5cGUsIG9wMjogX2lzU3RyaWN0IH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG5cbiAgbGV0IGRlZmluaXRpb24gPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgY2FwdHVyZWRBcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQ2FwdHVyZWRBcmd1bWVudHMpO1xuXG4gIGxldCBvd25lciA9IHZtLmdldE93bmVyKCk7XG4gIGxldCByZXNvbHZlciA9IHZtLnJ1bnRpbWUucmVzb2x2ZXI7XG5cbiAgbGV0IGlzU3RyaWN0ID0gZmFsc2U7XG5cbiAgaWYgKERFQlVHKSB7XG4gICAgLy8gc3RyaWN0IGNoZWNrIG9ubHkgaGFwcGVucyBpbiBERUJVRyBidWlsZHMsIG5vIHJlYXNvbiB0byBsb2FkIGl0IG90aGVyd2lzZVxuICAgIGlzU3RyaWN0ID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxib29sZWFuPihkZWNvZGVIYW5kbGUoX2lzU3RyaWN0KSk7XG4gIH1cblxuICB2bS5sb2FkVmFsdWUoXG4gICAgJHYwLFxuICAgIGNyZWF0ZUN1cnJ5UmVmKHR5cGUgYXMgQ3VycmllZFR5cGUsIGRlZmluaXRpb24sIG93bmVyLCBjYXB0dXJlZEFyZ3MsIHJlc29sdmVyLCBpc1N0cmljdClcbiAgKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRHluYW1pY0hlbHBlciwgKHZtKSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgcmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tBcmd1bWVudHMpLmNhcHR1cmUoKTtcblxuICBsZXQgaGVscGVyUmVmOiBSZWZlcmVuY2U7XG4gIGxldCBpbml0aWFsT3duZXI6IE93bmVyID0gdm0uZ2V0T3duZXIoKTtcblxuICBsZXQgaGVscGVySW5zdGFuY2VSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICBpZiAoaGVscGVyUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3Ryb3koaGVscGVyUmVmKTtcbiAgICB9XG5cbiAgICBsZXQgZGVmaW5pdGlvbiA9IHZhbHVlRm9yUmVmKHJlZik7XG5cbiAgICBpZiAoaXNDdXJyaWVkVHlwZShkZWZpbml0aW9uLCBDdXJyaWVkVHlwZS5IZWxwZXIpKSB7XG4gICAgICBsZXQgeyBkZWZpbml0aW9uOiByZXNvbHZlZERlZiwgb3duZXIsIHBvc2l0aW9uYWwsIG5hbWVkIH0gPSByZXNvbHZlQ3VycmllZFZhbHVlKGRlZmluaXRpb24pO1xuXG4gICAgICBsZXQgaGVscGVyID0gcmVzb2x2ZUhlbHBlcih2bVtDT05TVEFOVFNdLCByZXNvbHZlZERlZiwgcmVmKTtcblxuICAgICAgaWYgKG5hbWVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncy5uYW1lZCA9IGFzc2lnbih7fSwgLi4ubmFtZWQsIGFyZ3MubmFtZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MucG9zaXRpb25hbCA9IHBvc2l0aW9uYWwuY29uY2F0KGFyZ3MucG9zaXRpb25hbCkgYXMgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzO1xuICAgICAgfVxuXG4gICAgICBoZWxwZXJSZWYgPSBoZWxwZXIoYXJncywgb3duZXIpO1xuXG4gICAgICBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkKGhlbHBlckluc3RhbmNlUmVmLCBoZWxwZXJSZWYpO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGVmaW5pdGlvbikpIHtcbiAgICAgIGxldCBoZWxwZXIgPSByZXNvbHZlSGVscGVyKHZtW0NPTlNUQU5UU10sIGRlZmluaXRpb24sIHJlZik7XG4gICAgICBoZWxwZXJSZWYgPSBoZWxwZXIoYXJncywgaW5pdGlhbE93bmVyKTtcblxuICAgICAgaWYgKF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuKGhlbHBlclJlZikpIHtcbiAgICAgICAgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZChoZWxwZXJJbnN0YW5jZVJlZiwgaGVscGVyUmVmKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVscGVyUmVmID0gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCBoZWxwZXJWYWx1ZVJlZiA9IGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgIHZhbHVlRm9yUmVmKGhlbHBlckluc3RhbmNlUmVmKTtcbiAgICByZXR1cm4gdmFsdWVGb3JSZWYoaGVscGVyUmVmKTtcbiAgfSk7XG5cbiAgdm0uYXNzb2NpYXRlRGVzdHJveWFibGUoaGVscGVySW5zdGFuY2VSZWYpO1xuICB2bS5sb2FkVmFsdWUoJHYwLCBoZWxwZXJWYWx1ZVJlZik7XG59KTtcblxuZnVuY3Rpb24gcmVzb2x2ZUhlbHBlcihcbiAgY29uc3RhbnRzOiBSdW50aW1lQ29uc3RhbnRzICYgUmVzb2x1dGlvblRpbWVDb25zdGFudHMsXG4gIGRlZmluaXRpb246IEhlbHBlckRlZmluaXRpb25TdGF0ZSxcbiAgcmVmOiBSZWZlcmVuY2Vcbik6IEhlbHBlciB7XG4gIGxldCBoYW5kbGUgPSBjb25zdGFudHMuaGVscGVyKGRlZmluaXRpb24sIG51bGwsIHRydWUpITtcblxuICBpZiAoREVCVUcgJiYgaGFuZGxlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV4cGVjdGVkIGEgZHluYW1pYyBoZWxwZXIgZGVmaW5pdGlvbiwgYnV0IHJlY2VpdmVkIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRpZCBub3QgaGF2ZSBhIGhlbHBlciBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhlIGR5bmFtaWMgaW52b2NhdGlvbiB3YXMgXFxge3ske1xuICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgfX19XFxgIG9yIFxcYCgke3JlZi5kZWJ1Z0xhYmVsfSlcXGAsIGFuZCB0aGUgaW5jb3JyZWN0IGRlZmluaXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBwYXRoIFxcYCR7XG4gICAgICAgIHJlZi5kZWJ1Z0xhYmVsXG4gICAgICB9XFxgLCB3aGljaCB3YXM6ICR7ZGVidWdUb1N0cmluZyEoZGVmaW5pdGlvbil9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29uc3RhbnRzLmdldFZhbHVlKGhhbmRsZSk7XG59XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5IZWxwZXIsICh2bSwgeyBvcDE6IGhhbmRsZSB9KSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgaGVscGVyID0gY2hlY2sodm1bQ09OU1RBTlRTXS5nZXRWYWx1ZShoYW5kbGUpLCBDaGVja0hlbHBlcik7XG4gIGxldCBhcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQXJndW1lbnRzKTtcbiAgbGV0IHZhbHVlID0gaGVscGVyKGFyZ3MuY2FwdHVyZSgpLCB2bS5nZXRPd25lcigpLCB2bS5keW5hbWljU2NvcGUoKSk7XG5cbiAgaWYgKF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuKHZhbHVlKSkge1xuICAgIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKHZhbHVlKTtcbiAgfVxuXG4gIHZtLmxvYWRWYWx1ZSgkdjAsIHZhbHVlKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0VmFyaWFibGUsICh2bSwgeyBvcDE6IHN5bWJvbCB9KSA9PiB7XG4gIGxldCBleHByID0gdm0ucmVmZXJlbmNlRm9yU3ltYm9sKHN5bWJvbCk7XG5cbiAgdm0uc3RhY2sucHVzaChleHByKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuU2V0VmFyaWFibGUsICh2bSwgeyBvcDE6IHN5bWJvbCB9KSA9PiB7XG4gIGxldCBleHByID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgdm0uc2NvcGUoKS5iaW5kU3ltYm9sKHN5bWJvbCwgZXhwcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlNldEJsb2NrLCAodm0sIHsgb3AxOiBzeW1ib2wgfSkgPT4ge1xuICBsZXQgaGFuZGxlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrQ29tcGlsYWJsZUJsb2NrKTtcbiAgbGV0IHNjb3BlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrU2NvcGUpO1xuICBsZXQgdGFibGUgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tCbG9ja1N5bWJvbFRhYmxlKTtcblxuICB2bS5zY29wZSgpLmJpbmRCbG9jayhzeW1ib2wsIFtoYW5kbGUsIHNjb3BlLCB0YWJsZV0pO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5SZXNvbHZlTWF5YmVMb2NhbCwgKHZtLCB7IG9wMTogX25hbWUgfSkgPT4ge1xuICBsZXQgbmFtZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZSk7XG4gIGxldCBsb2NhbHMgPSB2bS5zY29wZSgpLmdldFBhcnRpYWxNYXAoKSE7XG5cbiAgbGV0IHJlZiA9IGxvY2Fsc1tuYW1lXTtcbiAgaWYgKHJlZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVmID0gY2hpbGRSZWZGb3Iodm0uZ2V0U2VsZigpLCBuYW1lKTtcbiAgfVxuXG4gIHZtLnN0YWNrLnB1c2gocmVmKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUm9vdFNjb3BlLCAodm0sIHsgb3AxOiBzeW1ib2xzIH0pID0+IHtcbiAgdm0ucHVzaFJvb3RTY29wZShzeW1ib2xzLCB2bS5nZXRPd25lcigpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0UHJvcGVydHksICh2bSwgeyBvcDE6IF9rZXkgfSkgPT4ge1xuICBsZXQga2V5ID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9rZXkpO1xuICBsZXQgZXhwciA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIHZtLnN0YWNrLnB1c2goY2hpbGRSZWZGb3IoZXhwciwga2V5KSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkdldEJsb2NrLCAodm0sIHsgb3AxOiBfYmxvY2sgfSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCBibG9jayA9IHZtLnNjb3BlKCkuZ2V0QmxvY2soX2Jsb2NrKTtcblxuICBzdGFjay5wdXNoKGJsb2NrKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuU3ByZWFkQmxvY2ssICh2bSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCBibG9jayA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja09wdGlvbihDaGVja09yKENoZWNrU2NvcGVCbG9jaywgQ2hlY2tVbmRlZmluZWRSZWZlcmVuY2UpKSk7XG5cbiAgaWYgKGJsb2NrICYmICFpc1VuZGVmaW5lZFJlZmVyZW5jZShibG9jaykpIHtcbiAgICBsZXQgW2hhbmRsZU9yQ29tcGlsYWJsZSwgc2NvcGUsIHRhYmxlXSA9IGJsb2NrO1xuXG4gICAgc3RhY2sucHVzaCh0YWJsZSk7XG4gICAgc3RhY2sucHVzaChzY29wZSk7XG4gICAgc3RhY2sucHVzaChoYW5kbGVPckNvbXBpbGFibGUpO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgc3RhY2sucHVzaChudWxsKTtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWRSZWZlcmVuY2UoaW5wdXQ6IFNjb3BlQmxvY2sgfCBSZWZlcmVuY2UpOiBpbnB1dCBpcyBSZWZlcmVuY2Uge1xuICBhc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShpbnB1dCkgfHwgaW5wdXQgPT09IFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gICAgJ2EgcmVmZXJlbmNlIG90aGVyIHRoYW4gVU5ERUZJTkVEX1JFRkVSRU5DRSBpcyBpbGxlZ2FsIGhlcmUnXG4gICk7XG4gIHJldHVybiBpbnB1dCA9PT0gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbn1cblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkhhc0Jsb2NrLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuICBsZXQgYmxvY2sgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tPcihDaGVja1Njb3BlQmxvY2ssIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlKSkpO1xuXG4gIGlmIChibG9jayAmJiAhaXNVbmRlZmluZWRSZWZlcmVuY2UoYmxvY2spKSB7XG4gICAgc3RhY2sucHVzaChUUlVFX1JFRkVSRU5DRSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhY2sucHVzaChGQUxTRV9SRUZFUkVOQ0UpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkhhc0Jsb2NrUGFyYW1zLCAodm0pID0+IHtcbiAgLy8gRklYTUUobW11bik6IHNob3VsZCBvbmx5IG5lZWQgdG8gcHVzaCB0aGUgc3ltYm9sIHRhYmxlXG4gIGxldCBibG9jayA9IHZtLnN0YWNrLnBvcCgpO1xuICBsZXQgc2NvcGUgPSB2bS5zdGFjay5wb3AoKTtcblxuICBjaGVjayhibG9jaywgQ2hlY2tNYXliZShDaGVja09yKENoZWNrSGFuZGxlLCBDaGVja0NvbXBpbGFibGVCbG9jaykpKTtcbiAgY2hlY2soc2NvcGUsIENoZWNrTWF5YmUoQ2hlY2tTY29wZSkpO1xuICBsZXQgdGFibGUgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tNYXliZShDaGVja0Jsb2NrU3ltYm9sVGFibGUpKTtcblxuICBsZXQgaGFzQmxvY2tQYXJhbXMgPSB0YWJsZSAmJiB0YWJsZS5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgdm0uc3RhY2sucHVzaChoYXNCbG9ja1BhcmFtcyA/IFRSVUVfUkVGRVJFTkNFIDogRkFMU0VfUkVGRVJFTkNFKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29uY2F0LCAodm0sIHsgb3AxOiBjb3VudCB9KSA9PiB7XG4gIGxldCBvdXQ6IEFycmF5PFJlZmVyZW5jZTx1bmtub3duPj4gPSBuZXcgQXJyYXkoY291bnQpO1xuXG4gIGZvciAobGV0IGkgPSBjb3VudDsgaSA+IDA7IGktLSkge1xuICAgIGxldCBvZmZzZXQgPSBpIC0gMTtcbiAgICBvdXRbb2Zmc2V0XSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIH1cblxuICB2bS5zdGFjay5wdXNoKGNyZWF0ZUNvbmNhdFJlZihvdXQpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSWZJbmxpbmUsICh2bSkgPT4ge1xuICBsZXQgY29uZGl0aW9uID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IHRydXRoeSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCBmYWxzeSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgdm0uc3RhY2sucHVzaChcbiAgICBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGlmICh0b0Jvb2wodmFsdWVGb3JSZWYoY29uZGl0aW9uKSkgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRm9yUmVmKHRydXRoeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWVGb3JSZWYoZmFsc3kpO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLk5vdCwgKHZtKSA9PiB7XG4gIGxldCByZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHZtLnN0YWNrLnB1c2goXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICByZXR1cm4gIXRvQm9vbCh2YWx1ZUZvclJlZihyZWYpKTtcbiAgICB9KVxuICApO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5HZXREeW5hbWljVmFyLCAodm0pID0+IHtcbiAgbGV0IHNjb3BlID0gdm0uZHluYW1pY1Njb3BlKCk7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgbmFtZVJlZiA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgc3RhY2sucHVzaChcbiAgICBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGxldCBuYW1lID0gU3RyaW5nKHZhbHVlRm9yUmVmKG5hbWVSZWYpKTtcbiAgICAgIHJldHVybiB2YWx1ZUZvclJlZihzY29wZS5nZXQobmFtZSkpO1xuICAgIH0pXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkxvZywgKHZtKSA9PiB7XG4gIGxldCB7IHBvc2l0aW9uYWwgfSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cykuY2FwdHVyZSgpO1xuXG4gIHZtLmxvYWRWYWx1ZShcbiAgICAkdjAsXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coLi4ucmVpZnlQb3NpdGlvbmFsKHBvc2l0aW9uYWwpKTtcbiAgICB9KVxuICApO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9