UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

547 lines (441 loc) 47.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createCapturedArgs = createCapturedArgs; exports.reifyNamed = reifyNamed; exports.reifyPositional = reifyPositional; exports.reifyArgs = reifyArgs; exports.EMPTY_ARGS = exports.EMPTY_POSITIONAL = exports.EMPTY_NAMED = exports.BlockArgumentsImpl = exports.NamedArgumentsImpl = exports.PositionalArgumentsImpl = exports.VMArgumentsImpl = void 0; var _env = require("@glimmer/env"); var _reference = require("@glimmer/reference"); var _util = require("@glimmer/util"); var _validator = require("@glimmer/validator"); var _vm = require("@glimmer/vm"); var _symbols = require("../symbols"); function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /* The calling convention is: * 0-N block arguments at the bottom * 0-N positional arguments next (left-to-right) * 0-N named arguments next */ var VMArgumentsImpl = /*#__PURE__*/function () { function VMArgumentsImpl() { this.stack = null; this.positional = new PositionalArgumentsImpl(); this.named = new NamedArgumentsImpl(); this.blocks = new BlockArgumentsImpl(); } var _proto = VMArgumentsImpl.prototype; _proto.empty = function empty(stack) { var base = stack[_symbols.REGISTERS][_vm.$sp] + 1; this.named.empty(stack, base); this.positional.empty(stack, base); this.blocks.empty(stack, base); return this; }; _proto.setup = function setup(stack, names, blockNames, positionalCount, atNames) { this.stack = stack; /* | ... | blocks | positional | named | | ... | b0 b1 | p0 p1 p2 p3 | n0 n1 | index | ... | 4/5/6 7/8/9 | 10 11 12 13 | 14 15 | ^ ^ ^ ^ bbase pbase nbase sp */ var named = this.named; var namedCount = names.length; var namedBase = stack[_symbols.REGISTERS][_vm.$sp] - namedCount + 1; named.setup(stack, namedBase, namedCount, names, atNames); var positional = this.positional; var positionalBase = namedBase - positionalCount; positional.setup(stack, positionalBase, positionalCount); var blocks = this.blocks; var blocksCount = blockNames.length; var blocksBase = positionalBase - blocksCount * 3; blocks.setup(stack, blocksBase, blocksCount, blockNames); }; _proto.at = function at(pos) { return this.positional.at(pos); }; _proto.realloc = function realloc(offset) { var stack = this.stack; if (offset > 0 && stack !== null) { var positional = this.positional, named = this.named; var newBase = positional.base + offset; var length = positional.length + named.length; for (var i = length - 1; i >= 0; i--) { stack.copy(i + positional.base, i + newBase); } positional.base += offset; named.base += offset; stack[_symbols.REGISTERS][_vm.$sp] += offset; } }; _proto.capture = function capture() { var positional = this.positional.length === 0 ? EMPTY_POSITIONAL : this.positional.capture(); var named = this.named.length === 0 ? EMPTY_NAMED : this.named.capture(); return { named: named, positional: positional }; }; _proto.clear = function clear() { var stack = this.stack, length = this.length; if (length > 0 && stack !== null) stack.pop(length); }; _createClass(VMArgumentsImpl, [{ key: "base", get: function get() { return this.blocks.base; } }, { key: "length", get: function get() { return this.positional.length + this.named.length + this.blocks.length * 3; } }]); return VMArgumentsImpl; }(); exports.VMArgumentsImpl = VMArgumentsImpl; var EMPTY_REFERENCES = (0, _util.emptyArray)(); var PositionalArgumentsImpl = /*#__PURE__*/function () { function PositionalArgumentsImpl() { this.base = 0; this.length = 0; this.stack = null; this._references = null; } var _proto2 = PositionalArgumentsImpl.prototype; _proto2.empty = function empty(stack, base) { this.stack = stack; this.base = base; this.length = 0; this._references = EMPTY_REFERENCES; }; _proto2.setup = function setup(stack, base, length) { this.stack = stack; this.base = base; this.length = length; if (length === 0) { this._references = EMPTY_REFERENCES; } else { this._references = null; } }; _proto2.at = function at(position) { var base = this.base, length = this.length, stack = this.stack; if (position < 0 || position >= length) { return _reference.UNDEFINED_REFERENCE; } return stack.get(position, base); }; _proto2.capture = function capture() { return this.references; }; _proto2.prepend = function prepend(other) { var additions = other.length; if (additions > 0) { var base = this.base, length = this.length, stack = this.stack; this.base = base = base - additions; this.length = length + additions; for (var i = 0; i < additions; i++) { stack.set(other[i], i, base); } this._references = null; } }; _createClass(PositionalArgumentsImpl, [{ key: "references", get: function get() { var references = this._references; if (!references) { var stack = this.stack, base = this.base, length = this.length; references = this._references = stack.slice(base, base + length); } return references; } }]); return PositionalArgumentsImpl; }(); exports.PositionalArgumentsImpl = PositionalArgumentsImpl; var NamedArgumentsImpl = /*#__PURE__*/function () { function NamedArgumentsImpl() { this.base = 0; this.length = 0; this._references = null; this._names = _util.EMPTY_STRING_ARRAY; this._atNames = _util.EMPTY_STRING_ARRAY; } var _proto3 = NamedArgumentsImpl.prototype; _proto3.empty = function empty(stack, base) { this.stack = stack; this.base = base; this.length = 0; this._references = EMPTY_REFERENCES; this._names = _util.EMPTY_STRING_ARRAY; this._atNames = _util.EMPTY_STRING_ARRAY; }; _proto3.setup = function setup(stack, base, length, names, atNames) { this.stack = stack; this.base = base; this.length = length; if (length === 0) { this._references = EMPTY_REFERENCES; this._names = _util.EMPTY_STRING_ARRAY; this._atNames = _util.EMPTY_STRING_ARRAY; } else { this._references = null; if (atNames) { this._names = null; this._atNames = names; } else { this._names = names; this._atNames = null; } } }; _proto3.has = function has(name) { return this.names.indexOf(name) !== -1; }; _proto3.get = function get(name, atNames) { if (atNames === void 0) { atNames = false; } var base = this.base, stack = this.stack; var names = atNames ? this.atNames : this.names; var idx = names.indexOf(name); if (idx === -1) { return _reference.UNDEFINED_REFERENCE; } var ref = stack.get(idx, base); if (_env.DEBUG) { return (0, _reference.createDebugAliasRef)(atNames ? name : "@" + name, ref); } else { return ref; } }; _proto3.capture = function capture() { var names = this.names, references = this.references; var map = (0, _util.dict)(); for (var i = 0; i < names.length; i++) { var name = names[i]; if (_env.DEBUG) { map[name] = (0, _reference.createDebugAliasRef)("@" + name, references[i]); } else { map[name] = references[i]; } } return map; }; _proto3.merge = function merge(other) { var keys = Object.keys(other); if (keys.length > 0) { var names = this.names, length = this.length, stack = this.stack; var newNames = names.slice(); for (var i = 0; i < keys.length; i++) { var name = keys[i]; var idx = newNames.indexOf(name); if (idx === -1) { length = newNames.push(name); stack.push(other[name]); } } this.length = length; this._references = null; this._names = newNames; this._atNames = null; } }; _proto3.toSyntheticName = function toSyntheticName(name) { return name.slice(1); }; _proto3.toAtName = function toAtName(name) { return "@" + name; }; _createClass(NamedArgumentsImpl, [{ key: "names", get: function get() { var names = this._names; if (!names) { names = this._names = this._atNames.map(this.toSyntheticName); } return names; } }, { key: "atNames", get: function get() { var atNames = this._atNames; if (!atNames) { atNames = this._atNames = this._names.map(this.toAtName); } return atNames; } }, { key: "references", get: function get() { var references = this._references; if (!references) { var base = this.base, length = this.length, stack = this.stack; references = this._references = stack.slice(base, base + length); } return references; } }]); return NamedArgumentsImpl; }(); exports.NamedArgumentsImpl = NamedArgumentsImpl; function toSymbolName(name) { return "&" + name; } var EMPTY_BLOCK_VALUES = (0, _util.emptyArray)(); var BlockArgumentsImpl = /*#__PURE__*/function () { function BlockArgumentsImpl() { this.internalValues = null; this._symbolNames = null; this.internalTag = null; this.names = _util.EMPTY_STRING_ARRAY; this.length = 0; this.base = 0; } var _proto4 = BlockArgumentsImpl.prototype; _proto4.empty = function empty(stack, base) { this.stack = stack; this.names = _util.EMPTY_STRING_ARRAY; this.base = base; this.length = 0; this._symbolNames = null; this.internalTag = _validator.CONSTANT_TAG; this.internalValues = EMPTY_BLOCK_VALUES; }; _proto4.setup = function setup(stack, base, length, names) { this.stack = stack; this.names = names; this.base = base; this.length = length; this._symbolNames = null; if (length === 0) { this.internalTag = _validator.CONSTANT_TAG; this.internalValues = EMPTY_BLOCK_VALUES; } else { this.internalTag = null; this.internalValues = null; } }; _proto4.has = function has(name) { return this.names.indexOf(name) !== -1; }; _proto4.get = function get(name) { var idx = this.names.indexOf(name); if (idx === -1) { return null; } var base = this.base, stack = this.stack; var table = stack.get(idx * 3, base); var scope = stack.get(idx * 3 + 1, base); var handle = stack.get(idx * 3 + 2, base); return handle === null ? null : [handle, scope, table]; }; _proto4.capture = function capture() { return new CapturedBlockArgumentsImpl(this.names, this.values); }; _createClass(BlockArgumentsImpl, [{ key: "values", get: function get() { var values = this.internalValues; if (!values) { var base = this.base, length = this.length, stack = this.stack; values = this.internalValues = stack.slice(base, base + length * 3); } return values; } }, { key: "symbolNames", get: function get() { var symbolNames = this._symbolNames; if (symbolNames === null) { symbolNames = this._symbolNames = this.names.map(toSymbolName); } return symbolNames; } }]); return BlockArgumentsImpl; }(); exports.BlockArgumentsImpl = BlockArgumentsImpl; var CapturedBlockArgumentsImpl = /*#__PURE__*/function () { function CapturedBlockArgumentsImpl(names, values) { this.names = names; this.values = values; this.length = names.length; } var _proto5 = CapturedBlockArgumentsImpl.prototype; _proto5.has = function has(name) { return this.names.indexOf(name) !== -1; }; _proto5.get = function get(name) { var idx = this.names.indexOf(name); if (idx === -1) return null; return [this.values[idx * 3 + 2], this.values[idx * 3 + 1], this.values[idx * 3]]; }; return CapturedBlockArgumentsImpl; }(); function createCapturedArgs(named, positional) { return { named: named, positional: positional }; } function reifyNamed(named) { var reified = (0, _util.dict)(); for (var key in named) { reified[key] = (0, _reference.valueForRef)(named[key]); } return reified; } function reifyPositional(positional) { return positional.map(_reference.valueForRef); } function reifyArgs(args) { return { named: reifyNamed(args.named), positional: reifyPositional(args.positional) }; } var EMPTY_NAMED = Object.freeze(Object.create(null)); exports.EMPTY_NAMED = EMPTY_NAMED; var EMPTY_POSITIONAL = EMPTY_REFERENCES; exports.EMPTY_POSITIONAL = EMPTY_POSITIONAL; var EMPTY_ARGS = createCapturedArgs(EMPTY_NAMED, EMPTY_POSITIONAL); exports.EMPTY_ARGS = EMPTY_ARGS; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2FyZ3VtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQWtCQTs7QUFNQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0E7Ozs7Ozs7QUFRQSxJQUFNLGVBQU4sR0FBQSxhQUFBLFlBQUE7QUFBQSxXQUFBLGVBQUEsR0FBQTtBQUNVLFNBQUEsS0FBQSxHQUFBLElBQUE7QUFDRCxTQUFBLFVBQUEsR0FBYSxJQUFiLHVCQUFhLEVBQWI7QUFDQSxTQUFBLEtBQUEsR0FBUSxJQUFSLGtCQUFRLEVBQVI7QUFDQSxTQUFBLE1BQUEsR0FBUyxJQUFULGtCQUFTLEVBQVQ7QUF1RlI7O0FBM0ZELE1BQUEsTUFBQSxHQUFBLGVBQUEsQ0FBQSxTQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLEtBQUEsR0FNRSxTQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQTRCO0FBQzFCLFFBQUksSUFBSSxHQUFHLEtBQUssQ0FBTCxrQkFBSyxDQUFMLENBQUEsT0FBQSxJQUFYLENBQUE7QUFFQSxTQUFBLEtBQUEsQ0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUE7QUFDQSxTQUFBLFVBQUEsQ0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUE7QUFDQSxTQUFBLE1BQUEsQ0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUE7QUFFQSxXQUFBLElBQUE7QUFiSixHQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLEtBQUEsR0FnQkUsU0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLEtBQUEsRUFBQSxVQUFBLEVBQUEsZUFBQSxFQUFBLE9BQUEsRUFLa0I7QUFFaEIsU0FBQSxLQUFBLEdBQUEsS0FBQTtBQUVBOzs7Ozs7OztBQVFBLFFBQUksS0FBSyxHQUFHLEtBQVosS0FBQTtBQUNBLFFBQUksVUFBVSxHQUFHLEtBQUssQ0FBdEIsTUFBQTtBQUNBLFFB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R0FEUCxDQUNMLENBREssRUFFTCxLQUFBLE1BQUEsQ0FBWSxHQUFHLEdBQUgsQ0FBQSxHQUZQLENBRUwsQ0FGSyxFQUdMLEtBQUEsTUFBQSxDQUFZLEdBQUcsR0FIakIsQ0FHRSxDQUhLLENBQVA7Ozs7OztBQVFFLFNBQUEsa0JBQUEsQ0FBQSxLQUFBLEVBQUEsVUFBQSxFQUE0RTtBQUNoRixTQUFPO0FBQ0wsSUFBQSxLQURLLEVBQUEsS0FBQTtBQUVMLElBQUEsVUFBQSxFQUFBO0FBRkssR0FBUDtBQUlEOztBQUVLLFNBQUEsVUFBQSxDQUFBLEtBQUEsRUFBa0Q7QUFDdEQsTUFBSSxPQUFPLEdBQVgsaUJBQUE7O0FBRUEsT0FBSyxJQUFMLEdBQUEsSUFBQSxLQUFBLEVBQXVCO0FBQ3JCLElBQUEsT0FBTyxDQUFQLEdBQU8sQ0FBUCxHQUFlLDRCQUFZLEtBQUssQ0FBaEMsR0FBZ0MsQ0FBakIsQ0FBZjtBQUNEOztBQUVELFNBQUEsT0FBQTtBQUNEOztBQUVLLFNBQUEsZUFBQSxDQUFBLFVBQUEsRUFBaUU7QUFDckUsU0FBTyxVQUFVLENBQVYsR0FBQSxDQUFQLHNCQUFPLENBQVA7QUFDRDs7QUFFSyxTQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQTJDO0FBQy9DLFNBQU87QUFDTCxJQUFBLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQURqQixLQUNZLENBRFo7QUFFTCxJQUFBLFVBQVUsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFMLFVBQUE7QUFGdEIsR0FBUDtBQUlEOztBQUVNLElBQU0sV0FBVyxHQUFHLE1BQU0sQ0FBTixNQUFBLENBQWMsTUFBTSxDQUFOLE1BQUEsQ0FBbEMsSUFBa0MsQ0FBZCxDQUFwQjs7QUFDQSxJQUFNLGdCQUFnQixHQUF0QixnQkFBQTs7QUFDQSxJQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQSxXQUFBLEVBQXJDLGdCQUFxQyxDQUFyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNoZWNrLCBDaGVja0Jsb2NrU3ltYm9sVGFibGUsIENoZWNrSGFuZGxlLCBDaGVja09wdGlvbiwgQ2hlY2tPciB9IGZyb20gJ0BnbGltbWVyL2RlYnVnJztcbmltcG9ydCB7IERFQlVHIH0gZnJvbSAnQGdsaW1tZXIvZW52JztcbmltcG9ydCB7XG4gIEJsb2NrQXJndW1lbnRzLFxuICBCbG9ja1N5bWJvbFRhYmxlLFxuICBCbG9ja1ZhbHVlLFxuICBDYXB0dXJlZEFyZ3VtZW50cyxcbiAgQ2FwdHVyZWRCbG9ja0FyZ3VtZW50cyxcbiAgQ2FwdHVyZWROYW1lZEFyZ3VtZW50cyxcbiAgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzLFxuICBDb21waWxhYmxlQmxvY2ssXG4gIERpY3QsXG4gIE5hbWVkQXJndW1lbnRzLFxuICBPcHRpb24sXG4gIFBvc2l0aW9uYWxBcmd1bWVudHMsXG4gIFNjb3BlLFxuICBTY29wZUJsb2NrLFxuICBWTUFyZ3VtZW50cyxcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBjcmVhdGVEZWJ1Z0FsaWFzUmVmLFxuICBSZWZlcmVuY2UsXG4gIFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gIHZhbHVlRm9yUmVmLFxufSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgZGljdCwgZW1wdHlBcnJheSwgRU1QVFlfU1RSSU5HX0FSUkFZIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBDT05TVEFOVF9UQUcsIFRhZyB9IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyAkc3AgfSBmcm9tICdAZ2xpbW1lci92bSc7XG5pbXBvcnQgeyBDaGVja0NvbXBpbGFibGVCbG9jaywgQ2hlY2tSZWZlcmVuY2UsIENoZWNrU2NvcGUgfSBmcm9tICcuLi9jb21waWxlZC9vcGNvZGVzLy1kZWJ1Zy1zdHJpcCc7XG5pbXBvcnQgeyBSRUdJU1RFUlMgfSBmcm9tICcuLi9zeW1ib2xzJztcbmltcG9ydCB7IEV2YWx1YXRpb25TdGFjayB9IGZyb20gJy4vc3RhY2snO1xuXG4vKlxuICBUaGUgY2FsbGluZyBjb252ZW50aW9uIGlzOlxuXG4gICogMC1OIGJsb2NrIGFyZ3VtZW50cyBhdCB0aGUgYm90dG9tXG4gICogMC1OIHBvc2l0aW9uYWwgYXJndW1lbnRzIG5leHQgKGxlZnQtdG8tcmlnaHQpXG4gICogMC1OIG5hbWVkIGFyZ3VtZW50cyBuZXh0XG4qL1xuXG5leHBvcnQgY2xhc3MgVk1Bcmd1bWVudHNJbXBsIGltcGxlbWVudHMgVk1Bcmd1bWVudHMge1xuICBwcml2YXRlIHN0YWNrOiBPcHRpb248RXZhbHVhdGlvblN0YWNrPiA9IG51bGw7XG4gIHB1YmxpYyBwb3NpdGlvbmFsID0gbmV3IFBvc2l0aW9uYWxBcmd1bWVudHNJbXBsKCk7XG4gIHB1YmxpYyBuYW1lZCA9IG5ldyBOYW1lZEFyZ3VtZW50c0ltcGwoKTtcbiAgcHVibGljIGJsb2NrcyA9IG5ldyBCbG9ja0FyZ3VtZW50c0ltcGwoKTtcblxuICBlbXB0eShzdGFjazogRXZhbHVhdGlvblN0YWNrKTogdGhpcyB7XG4gICAgbGV0IGJhc2UgPSBzdGFja1tSRUdJU1RFUlNdWyRzcF0gKyAxO1xuXG4gICAgdGhpcy5uYW1lZC5lbXB0eShzdGFjaywgYmFzZSk7XG4gICAgdGhpcy5wb3NpdGlvbmFsLmVtcHR5KHN0YWNrLCBiYXNlKTtcbiAgICB0aGlzLmJsb2Nrcy5lbXB0eShzdGFjaywgYmFzZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldHVwKFxuICAgIHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssXG4gICAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIGJsb2NrTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHBvc2l0aW9uYWxDb3VudDogbnVtYmVyLFxuICAgIGF0TmFtZXM6IGJvb2xlYW5cbiAgKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuXG4gICAgLypcbiAgICAgICAgICAgfCAuLi4gfCBibG9ja3MgICAgICB8IHBvc2l0aW9uYWwgIHwgbmFtZWQgfFxuICAgICAgICAgICB8IC4uLiB8IGIwICAgIGIxICAgIHwgcDAgcDEgcDIgcDMgfCBuMCBuMSB8XG4gICAgIGluZGV4IHwgLi4uIHwgNC81LzYgNy84LzkgfCAxMCAxMSAxMiAxMyB8IDE0IDE1IHxcbiAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICAgICAgXiAgXlxuICAgICAgICAgICAgICAgICBiYmFzZSAgICAgICAgIHBiYXNlICAgICAgIG5iYXNlICBzcFxuICAgICovXG5cbiAgICBsZXQgbmFtZWQgPSB0aGlzLm5hbWVkO1xuICAgIGxldCBuYW1lZENvdW50ID0gbmFtZXMubGVuZ3RoO1xuICAgIGxldCBuYW1lZEJhc2UgPSBzdGFja1tSRUdJU1RFUlNdWyRzcF0gLSBuYW1lZENvdW50ICsgMTtcblxuICAgIG5hbWVkLnNldHVwKHN0YWNrLCBuYW1lZEJhc2UsIG5hbWVkQ291bnQsIG5hbWVzLCBhdE5hbWVzKTtcblxuICAgIGxldCBwb3NpdGlvbmFsID0gdGhpcy5wb3NpdGlvbmFsO1xuICAgIGxldCBwb3NpdGlvbmFsQmFzZSA9IG5hbWVkQmFzZSAtIHBvc2l0aW9uYWxDb3VudDtcblxuICAgIHBvc2l0aW9uYWwuc2V0dXAoc3RhY2ssIHBvc2l0aW9uYWxCYXNlLCBwb3NpdGlvbmFsQ291bnQpO1xuXG4gICAgbGV0IGJsb2NrcyA9IHRoaXMuYmxvY2tzO1xuICAgIGxldCBibG9ja3NDb3VudCA9IGJsb2NrTmFtZXMubGVuZ3RoO1xuICAgIGxldCBibG9ja3NCYXNlID0gcG9zaXRpb25hbEJhc2UgLSBibG9ja3NDb3VudCAqIDM7XG5cbiAgICBibG9ja3Muc2V0dXAoc3RhY2ssIGJsb2Nrc0Jhc2UsIGJsb2Nrc0NvdW50LCBibG9ja05hbWVzKTtcbiAgfVxuXG4gIGdldCBiYXNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tzLmJhc2U7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25hbC5sZW5ndGggKyB0aGlzLm5hbWVkLmxlbmd0aCArIHRoaXMuYmxvY2tzLmxlbmd0aCAqIDM7XG4gIH1cblxuICBhdChwb3M6IG51bWJlcik6IFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25hbC5hdChwb3MpO1xuICB9XG5cbiAgcmVhbGxvYyhvZmZzZXQ6IG51bWJlcikge1xuICAgIGxldCB7IHN0YWNrIH0gPSB0aGlzO1xuICAgIGlmIChvZmZzZXQgPiAwICYmIHN0YWNrICE9PSBudWxsKSB7XG4gICAgICBsZXQgeyBwb3NpdGlvbmFsLCBuYW1lZCB9ID0gdGhpcztcbiAgICAgIGxldCBuZXdCYXNlID0gcG9zaXRpb25hbC5iYXNlICsgb2Zmc2V0O1xuICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9uYWwubGVuZ3RoICsgbmFtZWQubGVuZ3RoO1xuXG4gICAgICBmb3IgKGxldCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgc3RhY2suY29weShpICsgcG9zaXRpb25hbC5iYXNlLCBpICsgbmV3QmFzZSk7XG4gICAgICB9XG5cbiAgICAgIHBvc2l0aW9uYWwuYmFzZSArPSBvZmZzZXQ7XG4gICAgICBuYW1lZC5iYXNlICs9IG9mZnNldDtcbiAgICAgIHN0YWNrW1JFR0lTVEVSU11bJHNwXSArPSBvZmZzZXQ7XG4gICAgfVxuICB9XG5cbiAgY2FwdHVyZSgpOiBDYXB0dXJlZEFyZ3VtZW50cyB7XG4gICAgbGV0IHBvc2l0aW9uYWwgPSB0aGlzLnBvc2l0aW9uYWwubGVuZ3RoID09PSAwID8gRU1QVFlfUE9TSVRJT05BTCA6IHRoaXMucG9zaXRpb25hbC5jYXB0dXJlKCk7XG4gICAgbGV0IG5hbWVkID0gdGhpcy5uYW1lZC5sZW5ndGggPT09IDAgPyBFTVBUWV9OQU1FRCA6IHRoaXMubmFtZWQuY2FwdHVyZSgpO1xuXG4gICAgcmV0dXJuIHsgbmFtZWQsIHBvc2l0aW9uYWwgfSBhcyBDYXB0dXJlZEFyZ3VtZW50cztcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGxldCB7IHN0YWNrLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgaWYgKGxlbmd0aCA+IDAgJiYgc3RhY2sgIT09IG51bGwpIHN0YWNrLnBvcChsZW5ndGgpO1xuICB9XG59XG5cbmNvbnN0IEVNUFRZX1JFRkVSRU5DRVMgPSBlbXB0eUFycmF5PFJlZmVyZW5jZT4oKTtcblxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uYWxBcmd1bWVudHNJbXBsIGltcGxlbWVudHMgUG9zaXRpb25hbEFyZ3VtZW50cyB7XG4gIHB1YmxpYyBiYXNlID0gMDtcbiAgcHVibGljIGxlbmd0aCA9IDA7XG5cbiAgcHJpdmF0ZSBzdGFjazogRXZhbHVhdGlvblN0YWNrID0gbnVsbCBhcyBhbnk7XG5cbiAgcHJpdmF0ZSBfcmVmZXJlbmNlczogT3B0aW9uPHJlYWRvbmx5IFJlZmVyZW5jZVtdPiA9IG51bGw7XG5cbiAgZW1wdHkoc3RhY2s6IEV2YWx1YXRpb25TdGFjaywgYmFzZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgdGhpcy5fcmVmZXJlbmNlcyA9IEVNUFRZX1JFRkVSRU5DRVM7XG4gIH1cblxuICBzZXR1cChzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG5cbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gRU1QVFlfUkVGRVJFTkNFUztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXQocG9zaXRpb246IG51bWJlcik6IFJlZmVyZW5jZSB7XG4gICAgbGV0IHsgYmFzZSwgbGVuZ3RoLCBzdGFjayB9ID0gdGhpcztcblxuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hlY2soc3RhY2suZ2V0KHBvc2l0aW9uLCBiYXNlKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICB9XG5cbiAgY2FwdHVyZSgpOiBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMge1xuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZXMgYXMgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzO1xuICB9XG5cbiAgcHJlcGVuZChvdGhlcjogUmVmZXJlbmNlW10pIHtcbiAgICBsZXQgYWRkaXRpb25zID0gb3RoZXIubGVuZ3RoO1xuXG4gICAgaWYgKGFkZGl0aW9ucyA+IDApIHtcbiAgICAgIGxldCB7IGJhc2UsIGxlbmd0aCwgc3RhY2sgfSA9IHRoaXM7XG5cbiAgICAgIHRoaXMuYmFzZSA9IGJhc2UgPSBiYXNlIC0gYWRkaXRpb25zO1xuICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGggKyBhZGRpdGlvbnM7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkaXRpb25zOyBpKyspIHtcbiAgICAgICAgc3RhY2suc2V0KG90aGVyW2ldLCBpLCBiYXNlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcmVmZXJlbmNlcygpOiByZWFkb25seSBSZWZlcmVuY2VbXSB7XG4gICAgbGV0IHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzO1xuXG4gICAgaWYgKCFyZWZlcmVuY2VzKSB7XG4gICAgICBsZXQgeyBzdGFjaywgYmFzZSwgbGVuZ3RoIH0gPSB0aGlzO1xuICAgICAgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXMgPSBzdGFjay5zbGljZTxSZWZlcmVuY2U+KGJhc2UsIGJhc2UgKyBsZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiByZWZlcmVuY2VzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOYW1lZEFyZ3VtZW50c0ltcGwgaW1wbGVtZW50cyBOYW1lZEFyZ3VtZW50cyB7XG4gIHB1YmxpYyBiYXNlID0gMDtcbiAgcHVibGljIGxlbmd0aCA9IDA7XG5cbiAgcHJpdmF0ZSBzdGFjayE6IEV2YWx1YXRpb25TdGFjaztcblxuICBwcml2YXRlIF9yZWZlcmVuY2VzOiBPcHRpb248cmVhZG9ubHkgUmVmZXJlbmNlW10+ID0gbnVsbDtcblxuICBwcml2YXRlIF9uYW1lczogT3B0aW9uPHJlYWRvbmx5IHN0cmluZ1tdPiA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgcHJpdmF0ZSBfYXROYW1lczogT3B0aW9uPHJlYWRvbmx5IHN0cmluZ1tdPiA9IEVNUFRZX1NUUklOR19BUlJBWTtcblxuICBlbXB0eShzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICB0aGlzLl9yZWZlcmVuY2VzID0gRU1QVFlfUkVGRVJFTkNFUztcbiAgICB0aGlzLl9uYW1lcyA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgICB0aGlzLl9hdE5hbWVzID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICB9XG5cbiAgc2V0dXAoXG4gICAgc3RhY2s6IEV2YWx1YXRpb25TdGFjayxcbiAgICBiYXNlOiBudW1iZXIsXG4gICAgbGVuZ3RoOiBudW1iZXIsXG4gICAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIGF0TmFtZXM6IGJvb2xlYW5cbiAgKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG5cbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gRU1QVFlfUkVGRVJFTkNFUztcbiAgICAgIHRoaXMuX25hbWVzID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICAgICAgdGhpcy5fYXROYW1lcyA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG5cbiAgICAgIGlmIChhdE5hbWVzKSB7XG4gICAgICAgIHRoaXMuX25hbWVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYXROYW1lcyA9IG5hbWVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbmFtZXMgPSBuYW1lcztcbiAgICAgICAgdGhpcy5fYXROYW1lcyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IG5hbWVzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICBsZXQgbmFtZXMgPSB0aGlzLl9uYW1lcztcblxuICAgIGlmICghbmFtZXMpIHtcbiAgICAgIG5hbWVzID0gdGhpcy5fbmFtZXMgPSB0aGlzLl9hdE5hbWVzIS5tYXAodGhpcy50b1N5bnRoZXRpY05hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lcyE7XG4gIH1cblxuICBnZXQgYXROYW1lcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgbGV0IGF0TmFtZXMgPSB0aGlzLl9hdE5hbWVzO1xuXG4gICAgaWYgKCFhdE5hbWVzKSB7XG4gICAgICBhdE5hbWVzID0gdGhpcy5fYXROYW1lcyA9IHRoaXMuX25hbWVzIS5tYXAodGhpcy50b0F0TmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0TmFtZXMhO1xuICB9XG5cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLmluZGV4T2YobmFtZSkgIT09IC0xO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZywgYXROYW1lcyA9IGZhbHNlKTogUmVmZXJlbmNlIHtcbiAgICBsZXQgeyBiYXNlLCBzdGFjayB9ID0gdGhpcztcblxuICAgIGxldCBuYW1lcyA9IGF0TmFtZXMgPyB0aGlzLmF0TmFtZXMgOiB0aGlzLm5hbWVzO1xuXG4gICAgbGV0IGlkeCA9IG5hbWVzLmluZGV4T2YobmFtZSk7XG5cbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgfVxuXG4gICAgbGV0IHJlZiA9IHN0YWNrLmdldDxSZWZlcmVuY2U+KGlkeCwgYmFzZSk7XG5cbiAgICBpZiAoREVCVUcpIHtcbiAgICAgIHJldHVybiBjcmVhdGVEZWJ1Z0FsaWFzUmVmIShhdE5hbWVzID8gbmFtZSA6IGBAJHtuYW1lfWAsIHJlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZWY7XG4gICAgfVxuICB9XG5cbiAgY2FwdHVyZSgpOiBDYXB0dXJlZE5hbWVkQXJndW1lbnRzIHtcbiAgICBsZXQgeyBuYW1lcywgcmVmZXJlbmNlcyB9ID0gdGhpcztcbiAgICBsZXQgbWFwID0gZGljdDxSZWZlcmVuY2U+KCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbmFtZSA9IG5hbWVzW2ldO1xuXG4gICAgICBpZiAoREVCVUcpIHtcbiAgICAgICAgbWFwW25hbWVdID0gY3JlYXRlRGVidWdBbGlhc1JlZiEoYEAke25hbWV9YCwgcmVmZXJlbmNlc1tpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBbbmFtZV0gPSByZWZlcmVuY2VzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXAgYXMgQ2FwdHVyZWROYW1lZEFyZ3VtZW50cztcbiAgfVxuXG4gIG1lcmdlKG90aGVyOiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+KSB7XG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhvdGhlcik7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgeyBuYW1lcywgbGVuZ3RoLCBzdGFjayB9ID0gdGhpcztcbiAgICAgIGxldCBuZXdOYW1lcyA9IG5hbWVzLnNsaWNlKCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbmFtZSA9IGtleXNbaV07XG4gICAgICAgIGxldCBpZHggPSBuZXdOYW1lcy5pbmRleE9mKG5hbWUpO1xuXG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmV3TmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgICBzdGFjay5wdXNoKG90aGVyW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcbiAgICAgIHRoaXMuX2F0TmFtZXMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHJlZmVyZW5jZXMoKTogcmVhZG9ubHkgUmVmZXJlbmNlW10ge1xuICAgIGxldCByZWZlcmVuY2VzID0gdGhpcy5fcmVmZXJlbmNlcztcblxuICAgIGlmICghcmVmZXJlbmNlcykge1xuICAgICAgbGV0IHsgYmFzZSwgbGVuZ3RoLCBzdGFjayB9ID0gdGhpcztcbiAgICAgIHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzID0gc3RhY2suc2xpY2U8UmVmZXJlbmNlPihiYXNlLCBiYXNlICsgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgfVxuXG4gIHByaXZhdGUgdG9TeW50aGV0aWNOYW1lKHRoaXM6IHZvaWQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUuc2xpY2UoMSk7XG4gIH1cblxuICBwcml2YXRlIHRvQXROYW1lKHRoaXM6IHZvaWQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBAJHtuYW1lfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9TeW1ib2xOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJiR7bmFtZX1gO1xufVxuXG5jb25zdCBFTVBUWV9CTE9DS19WQUxVRVMgPSBlbXB0eUFycmF5PEJsb2NrVmFsdWU+KCk7XG5cbmV4cG9ydCBjbGFzcyBCbG9ja0FyZ3VtZW50c0ltcGwgaW1wbGVtZW50cyBCbG9ja0FyZ3VtZW50cyB7XG4gIHByaXZhdGUgc3RhY2shOiBFdmFsdWF0aW9uU3RhY2s7XG4gIHByaXZhdGUgaW50ZXJuYWxWYWx1ZXM6IE9wdGlvbjxyZWFkb25seSBCbG9ja1ZhbHVlW10+ID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3ltYm9sTmFtZXM6IE9wdGlvbjxyZWFkb25seSBzdHJpbmdbXT4gPSBudWxsO1xuXG4gIHB1YmxpYyBpbnRlcm5hbFRhZzogT3B0aW9uPFRhZz4gPSBudWxsO1xuICBwdWJsaWMgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuXG4gIHB1YmxpYyBsZW5ndGggPSAwO1xuICBwdWJsaWMgYmFzZSA9IDA7XG5cbiAgZW1wdHkoc3RhY2s6IEV2YWx1YXRpb25TdGFjaywgYmFzZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMubmFtZXMgPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fc3ltYm9sTmFtZXMgPSBudWxsO1xuXG4gICAgdGhpcy5pbnRlcm5hbFRhZyA9IENPTlNUQU5UX1RBRztcbiAgICB0aGlzLmludGVybmFsVmFsdWVzID0gRU1QVFlfQkxPQ0tfVkFMVUVTO1xuICB9XG5cbiAgc2V0dXAoc3RhY2s6IEV2YWx1YXRpb25TdGFjaywgYmFzZTogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMubmFtZXMgPSBuYW1lcztcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIHRoaXMuX3N5bWJvbE5hbWVzID0gbnVsbDtcblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxUYWcgPSBDT05TVEFOVF9UQUc7XG4gICAgICB0aGlzLmludGVybmFsVmFsdWVzID0gRU1QVFlfQkxPQ0tfVkFMVUVTO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmludGVybmFsVGFnID0gbnVsbDtcbiAgICAgIHRoaXMuaW50ZXJuYWxWYWx1ZXMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZXMoKTogcmVhZG9ubHkgQmxvY2tWYWx1ZVtdIHtcbiAgICBsZXQgdmFsdWVzID0gdGhpcy5pbnRlcm5hbFZhbHVlcztcblxuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICBsZXQgeyBiYXNlLCBsZW5ndGgsIHN0YWNrIH0gPSB0aGlzO1xuICAgICAgdmFsdWVzID0gdGhpcy5pbnRlcm5hbFZhbHVlcyA9IHN0YWNrLnNsaWNlPEJsb2NrVmFsdWU+KGJhc2UsIGJhc2UgKyBsZW5ndGggKiAzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hbWVzIS5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcpOiBPcHRpb248U2NvcGVCbG9jaz4ge1xuICAgIGxldCBpZHggPSB0aGlzLm5hbWVzIS5pbmRleE9mKG5hbWUpO1xuXG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB7IGJhc2UsIHN0YWNrIH0gPSB0aGlzO1xuXG4gICAgbGV0IHRhYmxlID0gY2hlY2soc3RhY2suZ2V0KGlkeCAqIDMsIGJhc2UpLCBDaGVja09wdGlvbihDaGVja0Jsb2NrU3ltYm9sVGFibGUpKTtcbiAgICBsZXQgc2NvcGUgPSBjaGVjayhzdGFjay5nZXQoaWR4ICogMyArIDEsIGJhc2UpLCBDaGVja09wdGlvbihDaGVja1Njb3BlKSk7XG4gICAgbGV0IGhhbmRsZSA9IGNoZWNrKFxuICAgICAgc3RhY2suZ2V0KGlkeCAqIDMgKyAyLCBiYXNlKSxcbiAgICAgIENoZWNrT3B0aW9uKENoZWNrT3IoQ2hlY2tIYW5kbGUsIENoZWNrQ29tcGlsYWJsZUJsb2NrKSlcbiAgICApO1xuXG4gICAgcmV0dXJuIGhhbmRsZSA9PT0gbnVsbCA/IG51bGwgOiAoW2hhbmRsZSwgc2NvcGUhLCB0YWJsZSFdIGFzIFNjb3BlQmxvY2spO1xuICB9XG5cbiAgY2FwdHVyZSgpOiBDYXB0dXJlZEJsb2NrQXJndW1lbnRzIHtcbiAgICByZXR1cm4gbmV3IENhcHR1cmVkQmxvY2tBcmd1bWVudHNJbXBsKHRoaXMubmFtZXMsIHRoaXMudmFsdWVzKTtcbiAgfVxuXG4gIGdldCBzeW1ib2xOYW1lcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgbGV0IHN5bWJvbE5hbWVzID0gdGhpcy5fc3ltYm9sTmFtZXM7XG5cbiAgICBpZiAoc3ltYm9sTmFtZXMgPT09IG51bGwpIHtcbiAgICAgIHN5bWJvbE5hbWVzID0gdGhpcy5fc3ltYm9sTmFtZXMgPSB0aGlzLm5hbWVzLm1hcCh0b1N5bWJvbE5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBzeW1ib2xOYW1lcztcbiAgfVxufVxuXG5jbGFzcyBDYXB0dXJlZEJsb2NrQXJndW1lbnRzSW1wbCBpbXBsZW1lbnRzIENhcHR1cmVkQmxvY2tBcmd1bWVudHMge1xuICBwdWJsaWMgbGVuZ3RoOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSwgcHVibGljIHZhbHVlczogcmVhZG9ubHkgT3B0aW9uPEJsb2NrVmFsdWU+W10pIHtcbiAgICB0aGlzLmxlbmd0aCA9IG5hbWVzLmxlbmd0aDtcbiAgfVxuXG4gIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcpOiBPcHRpb248U2NvcGVCbG9jaz4ge1xuICAgIGxldCBpZHggPSB0aGlzLm5hbWVzLmluZGV4T2YobmFtZSk7XG5cbiAgICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy52YWx1ZXNbaWR4ICogMyArIDJdIGFzIENvbXBpbGFibGVCbG9jayxcbiAgICAgIHRoaXMudmFsdWVzW2lkeCAqIDMgKyAxXSBhcyBTY29wZSxcbiAgICAgIHRoaXMudmFsdWVzW2lkeCAqIDNdIGFzIEJsb2NrU3ltYm9sVGFibGUsXG4gICAgXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRBcmdzKG5hbWVkOiBEaWN0PFJlZmVyZW5jZT4sIHBvc2l0aW9uYWw6IFJlZmVyZW5jZVtdKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZWQsXG4gICAgcG9zaXRpb25hbCxcbiAgfSBhcyBDYXB0dXJlZEFyZ3VtZW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlaWZ5TmFtZWQobmFtZWQ6IENhcHR1cmVkTmFtZWRBcmd1bWVudHMpIHtcbiAgbGV0IHJlaWZpZWQgPSBkaWN0KCk7XG5cbiAgZm9yIChsZXQga2V5IGluIG5hbWVkKSB7XG4gICAgcmVpZmllZFtrZXldID0gdmFsdWVGb3JSZWYobmFtZWRba2V5XSk7XG4gIH1cblxuICByZXR1cm4gcmVpZmllZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlaWZ5UG9zaXRpb25hbChwb3NpdGlvbmFsOiBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMpIHtcbiAgcmV0dXJuIHBvc2l0aW9uYWwubWFwKHZhbHVlRm9yUmVmKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlaWZ5QXJncyhhcmdzOiBDYXB0dXJlZEFyZ3VtZW50cykge1xuICByZXR1cm4ge1xuICAgIG5hbWVkOiByZWlmeU5hbWVkKGFyZ3MubmFtZWQpLFxuICAgIHBvc2l0aW9uYWw6IHJlaWZ5UG9zaXRpb25hbChhcmdzLnBvc2l0aW9uYWwpLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgRU1QVFlfTkFNRUQgPSBPYmplY3QuZnJlZXplKE9iamVjdC5jcmVhdGUobnVsbCkpIGFzIENhcHR1cmVkTmFtZWRBcmd1bWVudHM7XG5leHBvcnQgY29uc3QgRU1QVFlfUE9TSVRJT05BTCA9IEVNUFRZX1JFRkVSRU5DRVMgYXMgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSR1MgPSBjcmVhdGVDYXB0dXJlZEFyZ3MoRU1QVFlfTkFNRUQsIEVNUFRZX1BPU0lUSU9OQUwpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==