@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
501 lines (413 loc) • 45.6 kB
JavaScript
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; }
import { DEBUG } from '@glimmer/env';
import { createDebugAliasRef, UNDEFINED_REFERENCE, valueForRef } from '@glimmer/reference';
import { dict, emptyArray, EMPTY_STRING_ARRAY } from '@glimmer/util';
import { CONSTANT_TAG } from '@glimmer/validator';
import { $sp } from '@glimmer/vm';
import { REGISTERS } from '../symbols';
/*
The calling convention is:
* 0-N block arguments at the bottom
* 0-N positional arguments next (left-to-right)
* 0-N named arguments next
*/
export 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[REGISTERS][$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[REGISTERS][$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[REGISTERS][$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;
}();
var EMPTY_REFERENCES = emptyArray();
export 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 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;
}();
export var NamedArgumentsImpl = /*#__PURE__*/function () {
function NamedArgumentsImpl() {
this.base = 0;
this.length = 0;
this._references = null;
this._names = EMPTY_STRING_ARRAY;
this._atNames = 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 = EMPTY_STRING_ARRAY;
this._atNames = 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 = EMPTY_STRING_ARRAY;
this._atNames = 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 UNDEFINED_REFERENCE;
}
var ref = stack.get(idx, base);
if (DEBUG) {
return createDebugAliasRef(atNames ? name : "@" + name, ref);
} else {
return ref;
}
};
_proto3.capture = function capture() {
var names = this.names,
references = this.references;
var map = dict();
for (var i = 0; i < names.length; i++) {
var name = names[i];
if (DEBUG) {
map[name] = 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;
}();
function toSymbolName(name) {
return "&" + name;
}
var EMPTY_BLOCK_VALUES = emptyArray();
export var BlockArgumentsImpl = /*#__PURE__*/function () {
function BlockArgumentsImpl() {
this.internalValues = null;
this._symbolNames = null;
this.internalTag = null;
this.names = EMPTY_STRING_ARRAY;
this.length = 0;
this.base = 0;
}
var _proto4 = BlockArgumentsImpl.prototype;
_proto4.empty = function empty(stack, base) {
this.stack = stack;
this.names = EMPTY_STRING_ARRAY;
this.base = base;
this.length = 0;
this._symbolNames = null;
this.internalTag = 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 = 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;
}();
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;
}();
export function createCapturedArgs(named, positional) {
return {
named: named,
positional: positional
};
}
export function reifyNamed(named) {
var reified = dict();
for (var key in named) {
reified[key] = valueForRef(named[key]);
}
return reified;
}
export function reifyPositional(positional) {
return positional.map(valueForRef);
}
export function reifyArgs(args) {
return {
named: reifyNamed(args.named),
positional: reifyPositional(args.positional)
};
}
export var EMPTY_NAMED = Object.freeze(Object.create(null));
export var EMPTY_POSITIONAL = EMPTY_REFERENCES;
export var EMPTY_ARGS = createCapturedArgs(EMPTY_NAMED, EMPTY_POSITIONAL);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2FyZ3VtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsU0FBQSxLQUFBLFFBQUEsY0FBQTtBQWtCQSxTQUFBLG1CQUFBLEVBQUEsbUJBQUEsRUFBQSxXQUFBLFFBQUEsb0JBQUE7QUFNQSxTQUFBLElBQUEsRUFBQSxVQUFBLEVBQUEsa0JBQUEsUUFBQSxlQUFBO0FBQ0EsU0FBQSxZQUFBLFFBQUEsb0JBQUE7QUFDQSxTQUFBLEdBQUEsUUFBQSxhQUFBO0FBRUEsU0FBQSxTQUFBLFFBQUEsWUFBQTtBQUdBOzs7Ozs7OztBQVFBLFdBQU0sZUFBTjtBQUFBLDZCQUFBO0FBQ1UsU0FBQSxLQUFBLEdBQUEsSUFBQTtBQUNELFNBQUEsVUFBQSxHQUFhLElBQWIsdUJBQWEsRUFBYjtBQUNBLFNBQUEsS0FBQSxHQUFRLElBQVIsa0JBQVEsRUFBUjtBQUNBLFNBQUEsTUFBQSxHQUFTLElBQVQsa0JBQVMsRUFBVDtBQXVGUjs7QUEzRkQ7O0FBQUEsU0FNRSxLQU5GLEdBTUUsZUFBSyxLQUFMLEVBQTRCO0FBQzFCLFFBQUksSUFBSSxHQUFHLEtBQUssQ0FBTCxTQUFLLENBQUwsQ0FBQSxHQUFBLElBQVgsQ0FBQTtBQUVBLFNBQUEsS0FBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUEsSUFBQTtBQUNBLFNBQUEsVUFBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUEsSUFBQTtBQUNBLFNBQUEsTUFBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUEsSUFBQTtBQUVBLFdBQUEsSUFBQTtBQUNELEdBZEg7O0FBQUEsU0FnQkUsS0FoQkYsR0FnQkUsZUFBSyxLQUFMLEVBQUssS0FBTCxFQUFLLFVBQUwsRUFBSyxlQUFMLEVBQUssT0FBTCxFQUtrQjtBQUVoQixTQUFBLEtBQUEsR0FBQSxLQUFBO0FBRUE7Ozs7Ozs7O0FBUUEsUUFBSSxLQUFLLEdBQUcsS0FBWixLQUFB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S0FBQSxFQUFBLFVBQUEsRUFBNEU7QUFDaEYsU0FBTztBQUNMLElBQUEsS0FESyxFQUNMLEtBREs7QUFFTCxJQUFBLFVBQUEsRUFBQTtBQUZLLEdBQVA7QUFJRDtBQUVELE9BQU0sU0FBQSxVQUFBLENBQUEsS0FBQSxFQUFrRDtBQUN0RCxNQUFJLE9BQU8sR0FBRyxJQUFkLEVBQUE7O0FBRUEsT0FBSyxJQUFMLEdBQUEsSUFBQSxLQUFBLEVBQXVCO0FBQ3JCLElBQUEsT0FBTyxDQUFQLEdBQU8sQ0FBUCxHQUFlLFdBQVcsQ0FBQyxLQUFLLENBQWhDLEdBQWdDLENBQU4sQ0FBMUI7QUFDRDs7QUFFRCxTQUFBLE9BQUE7QUFDRDtBQUVELE9BQU0sU0FBQSxlQUFBLENBQUEsVUFBQSxFQUFpRTtBQUNyRSxTQUFPLFVBQVUsQ0FBVixHQUFBLENBQVAsV0FBTyxDQUFQO0FBQ0Q7QUFFRCxPQUFNLFNBQUEsU0FBQSxDQUFBLElBQUEsRUFBMkM7QUFDL0MsU0FBTztBQUNMLElBQUEsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBRGpCLEtBQ1ksQ0FEWjtBQUVMLElBQUEsVUFBVSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUwsVUFBQTtBQUZ0QixHQUFQO0FBSUQ7QUFFRCxPQUFPLElBQU0sV0FBVyxHQUFHLE1BQU0sQ0FBTixNQUFBLENBQWMsTUFBTSxDQUFOLE1BQUEsQ0FBbEMsSUFBa0MsQ0FBZCxDQUFwQjtBQUNQLE9BQU8sSUFBTSxnQkFBZ0IsR0FBdEIsZ0JBQUE7QUFDUCxPQUFPLElBQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFBLFdBQUEsRUFBckMsZ0JBQXFDLENBQXJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2hlY2ssIENoZWNrQmxvY2tTeW1ib2xUYWJsZSwgQ2hlY2tIYW5kbGUsIENoZWNrT3B0aW9uLCBDaGVja09yIH0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IHtcbiAgQmxvY2tBcmd1bWVudHMsXG4gIEJsb2NrU3ltYm9sVGFibGUsXG4gIEJsb2NrVmFsdWUsXG4gIENhcHR1cmVkQXJndW1lbnRzLFxuICBDYXB0dXJlZEJsb2NrQXJndW1lbnRzLFxuICBDYXB0dXJlZE5hbWVkQXJndW1lbnRzLFxuICBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMsXG4gIENvbXBpbGFibGVCbG9jayxcbiAgRGljdCxcbiAgTmFtZWRBcmd1bWVudHMsXG4gIE9wdGlvbixcbiAgUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgU2NvcGUsXG4gIFNjb3BlQmxvY2ssXG4gIFZNQXJndW1lbnRzLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIGNyZWF0ZURlYnVnQWxpYXNSZWYsXG4gIFJlZmVyZW5jZSxcbiAgVU5ERUZJTkVEX1JFRkVSRU5DRSxcbiAgdmFsdWVGb3JSZWYsXG59IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQgeyBkaWN0LCBlbXB0eUFycmF5LCBFTVBUWV9TVFJJTkdfQVJSQVkgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IENPTlNUQU5UX1RBRywgVGFnIH0gZnJvbSAnQGdsaW1tZXIvdmFsaWRhdG9yJztcbmltcG9ydCB7ICRzcCB9IGZyb20gJ0BnbGltbWVyL3ZtJztcbmltcG9ydCB7IENoZWNrQ29tcGlsYWJsZUJsb2NrLCBDaGVja1JlZmVyZW5jZSwgQ2hlY2tTY29wZSB9IGZyb20gJy4uL2NvbXBpbGVkL29wY29kZXMvLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IFJFR0lTVEVSUyB9IGZyb20gJy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgRXZhbHVhdGlvblN0YWNrIH0gZnJvbSAnLi9zdGFjayc7XG5cbi8qXG4gIFRoZSBjYWxsaW5nIGNvbnZlbnRpb24gaXM6XG5cbiAgKiAwLU4gYmxvY2sgYXJndW1lbnRzIGF0IHRoZSBib3R0b21cbiAgKiAwLU4gcG9zaXRpb25hbCBhcmd1bWVudHMgbmV4dCAobGVmdC10by1yaWdodClcbiAgKiAwLU4gbmFtZWQgYXJndW1lbnRzIG5leHRcbiovXG5cbmV4cG9ydCBjbGFzcyBWTUFyZ3VtZW50c0ltcGwgaW1wbGVtZW50cyBWTUFyZ3VtZW50cyB7XG4gIHByaXZhdGUgc3RhY2s6IE9wdGlvbjxFdmFsdWF0aW9uU3RhY2s+ID0gbnVsbDtcbiAgcHVibGljIHBvc2l0aW9uYWwgPSBuZXcgUG9zaXRpb25hbEFyZ3VtZW50c0ltcGwoKTtcbiAgcHVibGljIG5hbWVkID0gbmV3IE5hbWVkQXJndW1lbnRzSW1wbCgpO1xuICBwdWJsaWMgYmxvY2tzID0gbmV3IEJsb2NrQXJndW1lbnRzSW1wbCgpO1xuXG4gIGVtcHR5KHN0YWNrOiBFdmFsdWF0aW9uU3RhY2spOiB0aGlzIHtcbiAgICBsZXQgYmFzZSA9IHN0YWNrW1JFR0lTVEVSU11bJHNwXSArIDE7XG5cbiAgICB0aGlzLm5hbWVkLmVtcHR5KHN0YWNrLCBiYXNlKTtcbiAgICB0aGlzLnBvc2l0aW9uYWwuZW1wdHkoc3RhY2ssIGJhc2UpO1xuICAgIHRoaXMuYmxvY2tzLmVtcHR5KHN0YWNrLCBiYXNlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0dXAoXG4gICAgc3RhY2s6IEV2YWx1YXRpb25TdGFjayxcbiAgICBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgYmxvY2tOYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgcG9zaXRpb25hbENvdW50OiBudW1iZXIsXG4gICAgYXROYW1lczogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG5cbiAgICAvKlxuICAgICAgICAgICB8IC4uLiB8IGJsb2NrcyAgICAgIHwgcG9zaXRpb25hbCAgfCBuYW1lZCB8XG4gICAgICAgICAgIHwgLi4uIHwgYjAgICAgYjEgICAgfCBwMCBwMSBwMiBwMyB8IG4wIG4xIHxcbiAgICAgaW5kZXggfCAuLi4gfCA0LzUvNiA3LzgvOSB8IDEwIDExIDEyIDEzIHwgMTQgMTUgfFxuICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgXiAgICAgICAgICAgICBeICBeXG4gICAgICAgICAgICAgICAgIGJiYXNlICAgICAgICAgcGJhc2UgICAgICAgbmJhc2UgIHNwXG4gICAgKi9cblxuICAgIGxldCBuYW1lZCA9IHRoaXMubmFtZWQ7XG4gICAgbGV0IG5hbWVkQ291bnQgPSBuYW1lcy5sZW5ndGg7XG4gICAgbGV0IG5hbWVkQmFzZSA9IHN0YWNrW1JFR0lTVEVSU11bJHNwXSAtIG5hbWVkQ291bnQgKyAxO1xuXG4gICAgbmFtZWQuc2V0dXAoc3RhY2ssIG5hbWVkQmFzZSwgbmFtZWRDb3VudCwgbmFtZXMsIGF0TmFtZXMpO1xuXG4gICAgbGV0IHBvc2l0aW9uYWwgPSB0aGlzLnBvc2l0aW9uYWw7XG4gICAgbGV0IHBvc2l0aW9uYWxCYXNlID0gbmFtZWRCYXNlIC0gcG9zaXRpb25hbENvdW50O1xuXG4gICAgcG9zaXRpb25hbC5zZXR1cChzdGFjaywgcG9zaXRpb25hbEJhc2UsIHBvc2l0aW9uYWxDb3VudCk7XG5cbiAgICBsZXQgYmxvY2tzID0gdGhpcy5ibG9ja3M7XG4gICAgbGV0IGJsb2Nrc0NvdW50ID0gYmxvY2tOYW1lcy5sZW5ndGg7XG4gICAgbGV0IGJsb2Nrc0Jhc2UgPSBwb3NpdGlvbmFsQmFzZSAtIGJsb2Nrc0NvdW50ICogMztcblxuICAgIGJsb2Nrcy5zZXR1cChzdGFjaywgYmxvY2tzQmFzZSwgYmxvY2tzQ291bnQsIGJsb2NrTmFtZXMpO1xuICB9XG5cbiAgZ2V0IGJhc2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja3MuYmFzZTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbmFsLmxlbmd0aCArIHRoaXMubmFtZWQubGVuZ3RoICsgdGhpcy5ibG9ja3MubGVuZ3RoICogMztcbiAgfVxuXG4gIGF0KHBvczogbnVtYmVyKTogUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbmFsLmF0KHBvcyk7XG4gIH1cblxuICByZWFsbG9jKG9mZnNldDogbnVtYmVyKSB7XG4gICAgbGV0IHsgc3RhY2sgfSA9IHRoaXM7XG4gICAgaWYgKG9mZnNldCA+IDAgJiYgc3RhY2sgIT09IG51bGwpIHtcbiAgICAgIGxldCB7IHBvc2l0aW9uYWwsIG5hbWVkIH0gPSB0aGlzO1xuICAgICAgbGV0IG5ld0Jhc2UgPSBwb3NpdGlvbmFsLmJhc2UgKyBvZmZzZXQ7XG4gICAgICBsZXQgbGVuZ3RoID0gcG9zaXRpb25hbC5sZW5ndGggKyBuYW1lZC5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSBsZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBzdGFjay5jb3B5KGkgKyBwb3NpdGlvbmFsLmJhc2UsIGkgKyBuZXdCYXNlKTtcbiAgICAgIH1cblxuICAgICAgcG9zaXRpb25hbC5iYXNlICs9IG9mZnNldDtcbiAgICAgIG5hbWVkLmJhc2UgKz0gb2Zmc2V0O1xuICAgICAgc3RhY2tbUkVHSVNURVJTXVskc3BdICs9IG9mZnNldDtcbiAgICB9XG4gIH1cblxuICBjYXB0dXJlKCk6IENhcHR1cmVkQXJndW1lbnRzIHtcbiAgICBsZXQgcG9zaXRpb25hbCA9IHRoaXMucG9zaXRpb25hbC5sZW5ndGggPT09IDAgPyBFTVBUWV9QT1NJVElPTkFMIDogdGhpcy5wb3NpdGlvbmFsLmNhcHR1cmUoKTtcbiAgICBsZXQgbmFtZWQgPSB0aGlzLm5hbWVkLmxlbmd0aCA9PT0gMCA/IEVNUFRZX05BTUVEIDogdGhpcy5uYW1lZC5jYXB0dXJlKCk7XG5cbiAgICByZXR1cm4geyBuYW1lZCwgcG9zaXRpb25hbCB9IGFzIENhcHR1cmVkQXJndW1lbnRzO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgbGV0IHsgc3RhY2ssIGxlbmd0aCB9ID0gdGhpcztcbiAgICBpZiAobGVuZ3RoID4gMCAmJiBzdGFjayAhPT0gbnVsbCkgc3RhY2sucG9wKGxlbmd0aCk7XG4gIH1cbn1cblxuY29uc3QgRU1QVFlfUkVGRVJFTkNFUyA9IGVtcHR5QXJyYXk8UmVmZXJlbmNlPigpO1xuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25hbEFyZ3VtZW50c0ltcGwgaW1wbGVtZW50cyBQb3NpdGlvbmFsQXJndW1lbnRzIHtcbiAgcHVibGljIGJhc2UgPSAwO1xuICBwdWJsaWMgbGVuZ3RoID0gMDtcblxuICBwcml2YXRlIHN0YWNrOiBFdmFsdWF0aW9uU3RhY2sgPSBudWxsIGFzIGFueTtcblxuICBwcml2YXRlIF9yZWZlcmVuY2VzOiBPcHRpb248cmVhZG9ubHkgUmVmZXJlbmNlW10+ID0gbnVsbDtcblxuICBlbXB0eShzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICB0aGlzLl9yZWZlcmVuY2VzID0gRU1QVFlfUkVGRVJFTkNFUztcbiAgfVxuXG4gIHNldHVwKHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssIGJhc2U6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBFTVBUWV9SRUZFUkVOQ0VTO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhdChwb3NpdGlvbjogbnVtYmVyKTogUmVmZXJlbmNlIHtcbiAgICBsZXQgeyBiYXNlLCBsZW5ndGgsIHN0YWNrIH0gPSB0aGlzO1xuXG4gICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBVTkRFRklORURfUkVGRVJFTkNFO1xuICAgIH1cblxuICAgIHJldHVybiBjaGVjayhzdGFjay5nZXQocG9zaXRpb24sIGJhc2UpLCBDaGVja1JlZmVyZW5jZSk7XG4gIH1cblxuICBjYXB0dXJlKCk6IENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cyB7XG4gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlcyBhcyBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHM7XG4gIH1cblxuICBwcmVwZW5kKG90aGVyOiBSZWZlcmVuY2VbXSkge1xuICAgIGxldCBhZGRpdGlvbnMgPSBvdGhlci5sZW5ndGg7XG5cbiAgICBpZiAoYWRkaXRpb25zID4gMCkge1xuICAgICAgbGV0IHsgYmFzZSwgbGVuZ3RoLCBzdGFjayB9ID0gdGhpcztcblxuICAgICAgdGhpcy5iYXNlID0gYmFzZSA9IGJhc2UgLSBhZGRpdGlvbnM7XG4gICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aCArIGFkZGl0aW9ucztcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRpdGlvbnM7IGkrKykge1xuICAgICAgICBzdGFjay5zZXQob3RoZXJbaV0sIGksIGJhc2UpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCByZWZlcmVuY2VzKCk6IHJlYWRvbmx5IFJlZmVyZW5jZVtdIHtcbiAgICBsZXQgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXM7XG5cbiAgICBpZiAoIXJlZmVyZW5jZXMpIHtcbiAgICAgIGxldCB7IHN0YWNrLCBiYXNlLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgICByZWZlcmVuY2VzID0gdGhpcy5fcmVmZXJlbmNlcyA9IHN0YWNrLnNsaWNlPFJlZmVyZW5jZT4oYmFzZSwgYmFzZSArIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5hbWVkQXJndW1lbnRzSW1wbCBpbXBsZW1lbnRzIE5hbWVkQXJndW1lbnRzIHtcbiAgcHVibGljIGJhc2UgPSAwO1xuICBwdWJsaWMgbGVuZ3RoID0gMDtcblxuICBwcml2YXRlIHN0YWNrITogRXZhbHVhdGlvblN0YWNrO1xuXG4gIHByaXZhdGUgX3JlZmVyZW5jZXM6IE9wdGlvbjxyZWFkb25seSBSZWZlcmVuY2VbXT4gPSBudWxsO1xuXG4gIHByaXZhdGUgX25hbWVzOiBPcHRpb248cmVhZG9ubHkgc3RyaW5nW10+ID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICBwcml2YXRlIF9hdE5hbWVzOiBPcHRpb248cmVhZG9ubHkgc3RyaW5nW10+ID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuXG4gIGVtcHR5KHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssIGJhc2U6IG51bWJlcikge1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBFTVBUWV9SRUZFUkVOQ0VTO1xuICAgIHRoaXMuX25hbWVzID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICAgIHRoaXMuX2F0TmFtZXMgPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG4gIH1cblxuICBzZXR1cChcbiAgICBzdGFjazogRXZhbHVhdGlvblN0YWNrLFxuICAgIGJhc2U6IG51bWJlcixcbiAgICBsZW5ndGg6IG51bWJlcixcbiAgICBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgYXROYW1lczogYm9vbGVhblxuICApIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBFTVBUWV9SRUZFUkVOQ0VTO1xuICAgICAgdGhpcy5fbmFtZXMgPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG4gICAgICB0aGlzLl9hdE5hbWVzID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcblxuICAgICAgaWYgKGF0TmFtZXMpIHtcbiAgICAgICAgdGhpcy5fbmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9hdE5hbWVzID0gbmFtZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9uYW1lcyA9IG5hbWVzO1xuICAgICAgICB0aGlzLl9hdE5hbWVzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgbmFtZXMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIGxldCBuYW1lcyA9IHRoaXMuX25hbWVzO1xuXG4gICAgaWYgKCFuYW1lcykge1xuICAgICAgbmFtZXMgPSB0aGlzLl9uYW1lcyA9IHRoaXMuX2F0TmFtZXMhLm1hcCh0aGlzLnRvU3ludGhldGljTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVzITtcbiAgfVxuXG4gIGdldCBhdE5hbWVzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICBsZXQgYXROYW1lcyA9IHRoaXMuX2F0TmFtZXM7XG5cbiAgICBpZiAoIWF0TmFtZXMpIHtcbiAgICAgIGF0TmFtZXMgPSB0aGlzLl9hdE5hbWVzID0gdGhpcy5fbmFtZXMhLm1hcCh0aGlzLnRvQXROYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXROYW1lcyE7XG4gIH1cblxuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nLCBhdE5hbWVzID0gZmFsc2UpOiBSZWZlcmVuY2Uge1xuICAgIGxldCB7IGJhc2UsIHN0YWNrIH0gPSB0aGlzO1xuXG4gICAgbGV0IG5hbWVzID0gYXROYW1lcyA/IHRoaXMuYXROYW1lcyA6IHRoaXMubmFtZXM7XG5cbiAgICBsZXQgaWR4ID0gbmFtZXMuaW5kZXhPZihuYW1lKTtcblxuICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICByZXR1cm4gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICB9XG5cbiAgICBsZXQgcmVmID0gc3RhY2suZ2V0PFJlZmVyZW5jZT4oaWR4LCBiYXNlKTtcblxuICAgIGlmIChERUJVRykge1xuICAgICAgcmV0dXJuIGNyZWF0ZURlYnVnQWxpYXNSZWYhKGF0TmFtZXMgPyBuYW1lIDogYEAke25hbWV9YCwgcmVmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9XG4gIH1cblxuICBjYXB0dXJlKCk6IENhcHR1cmVkTmFtZWRBcmd1bWVudHMge1xuICAgIGxldCB7IG5hbWVzLCByZWZlcmVuY2VzIH0gPSB0aGlzO1xuICAgIGxldCBtYXAgPSBkaWN0PFJlZmVyZW5jZT4oKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBuYW1lID0gbmFtZXNbaV07XG5cbiAgICAgIGlmIChERUJVRykge1xuICAgICAgICBtYXBbbmFtZV0gPSBjcmVhdGVEZWJ1Z0FsaWFzUmVmIShgQCR7bmFtZX1gLCByZWZlcmVuY2VzW2ldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hcFtuYW1lXSA9IHJlZmVyZW5jZXNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcCBhcyBDYXB0dXJlZE5hbWVkQXJndW1lbnRzO1xuICB9XG5cbiAgbWVyZ2Uob3RoZXI6IFJlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT4pIHtcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG90aGVyKTtcblxuICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCB7IG5hbWVzLCBsZW5ndGgsIHN0YWNrIH0gPSB0aGlzO1xuICAgICAgbGV0IG5ld05hbWVzID0gbmFtZXMuc2xpY2UoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBuYW1lID0ga2V5c1tpXTtcbiAgICAgICAgbGV0IGlkeCA9IG5ld05hbWVzLmluZGV4T2YobmFtZSk7XG5cbiAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICBsZW5ndGggPSBuZXdOYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgICAgIHN0YWNrLnB1c2gob3RoZXJbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG4gICAgICB0aGlzLl9uYW1lcyA9IG5ld05hbWVzO1xuICAgICAgdGhpcy5fYXROYW1lcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcmVmZXJlbmNlcygpOiByZWFkb25seSBSZWZlcmVuY2VbXSB7XG4gICAgbGV0IHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzO1xuXG4gICAgaWYgKCFyZWZlcmVuY2VzKSB7XG4gICAgICBsZXQgeyBiYXNlLCBsZW5ndGgsIHN0YWNrIH0gPSB0aGlzO1xuICAgICAgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXMgPSBzdGFjay5zbGljZTxSZWZlcmVuY2U+KGJhc2UsIGJhc2UgKyBsZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiByZWZlcmVuY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSB0b1N5bnRoZXRpY05hbWUodGhpczogdm9pZCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZS5zbGljZSgxKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9BdE5hbWUodGhpczogdm9pZCwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEAke25hbWV9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1N5bWJvbE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAmJHtuYW1lfWA7XG59XG5cbmNvbnN0IEVNUFRZX0JMT0NLX1ZBTFVFUyA9IGVtcHR5QXJyYXk8QmxvY2tWYWx1ZT4oKTtcblxuZXhwb3J0IGNsYXNzIEJsb2NrQXJndW1lbnRzSW1wbCBpbXBsZW1lbnRzIEJsb2NrQXJndW1lbnRzIHtcbiAgcHJpdmF0ZSBzdGFjayE6IEV2YWx1YXRpb25TdGFjaztcbiAgcHJpdmF0ZSBpbnRlcm5hbFZhbHVlczogT3B0aW9uPHJlYWRvbmx5IEJsb2NrVmFsdWVbXT4gPSBudWxsO1xuICBwcml2YXRlIF9zeW1ib2xOYW1lczogT3B0aW9uPHJlYWRvbmx5IHN0cmluZ1tdPiA9IG51bGw7XG5cbiAgcHVibGljIGludGVybmFsVGFnOiBPcHRpb248VGFnPiA9IG51bGw7XG4gIHB1YmxpYyBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10gPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG5cbiAgcHVibGljIGxlbmd0aCA9IDA7XG4gIHB1YmxpYyBiYXNlID0gMDtcblxuICBlbXB0eShzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5uYW1lcyA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9zeW1ib2xOYW1lcyA9IG51bGw7XG5cbiAgICB0aGlzLmludGVybmFsVGFnID0gQ09OU1RBTlRfVEFHO1xuICAgIHRoaXMuaW50ZXJuYWxWYWx1ZXMgPSBFTVBUWV9CTE9DS19WQUxVRVM7XG4gIH1cblxuICBzZXR1cChzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5uYW1lcyA9IG5hbWVzO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgdGhpcy5fc3ltYm9sTmFtZXMgPSBudWxsO1xuXG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5pbnRlcm5hbFRhZyA9IENPTlNUQU5UX1RBRztcbiAgICAgIHRoaXMuaW50ZXJuYWxWYWx1ZXMgPSBFTVBUWV9CTE9DS19WQUxVRVM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxUYWcgPSBudWxsO1xuICAgICAgdGhpcy5pbnRlcm5hbFZhbHVlcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHZhbHVlcygpOiByZWFkb25seSBCbG9ja1ZhbHVlW10ge1xuICAgIGxldCB2YWx1ZXMgPSB0aGlzLmludGVybmFsVmFsdWVzO1xuXG4gICAgaWYgKCF2YWx1ZXMpIHtcbiAgICAgIGxldCB7IGJhc2UsIGxlbmd0aCwgc3RhY2sgfSA9IHRoaXM7XG4gICAgICB2YWx1ZXMgPSB0aGlzLmludGVybmFsVmFsdWVzID0gc3RhY2suc2xpY2U8QmxvY2tWYWx1ZT4oYmFzZSwgYmFzZSArIGxlbmd0aCAqIDMpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMhLmluZGV4T2YobmFtZSkgIT09IC0xO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IE9wdGlvbjxTY29wZUJsb2NrPiB7XG4gICAgbGV0IGlkeCA9IHRoaXMubmFtZXMhLmluZGV4T2YobmFtZSk7XG5cbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHsgYmFzZSwgc3RhY2sgfSA9IHRoaXM7XG5cbiAgICBsZXQgdGFibGUgPSBjaGVjayhzdGFjay5nZXQoaWR4ICogMywgYmFzZSksIENoZWNrT3B0aW9uKENoZWNrQmxvY2tTeW1ib2xUYWJsZSkpO1xuICAgIGxldCBzY29wZSA9IGNoZWNrKHN0YWNrLmdldChpZHggKiAzICsgMSwgYmFzZSksIENoZWNrT3B0aW9uKENoZWNrU2NvcGUpKTtcbiAgICBsZXQgaGFuZGxlID0gY2hlY2soXG4gICAgICBzdGFjay5nZXQoaWR4ICogMyArIDIsIGJhc2UpLFxuICAgICAgQ2hlY2tPcHRpb24oQ2hlY2tPcihDaGVja0hhbmRsZSwgQ2hlY2tDb21waWxhYmxlQmxvY2spKVxuICAgICk7XG5cbiAgICByZXR1cm4gaGFuZGxlID09PSBudWxsID8gbnVsbCA6IChbaGFuZGxlLCBzY29wZSEsIHRhYmxlIV0gYXMgU2NvcGVCbG9jayk7XG4gIH1cblxuICBjYXB0dXJlKCk6IENhcHR1cmVkQmxvY2tBcmd1bWVudHMge1xuICAgIHJldHVybiBuZXcgQ2FwdHVyZWRCbG9ja0FyZ3VtZW50c0ltcGwodGhpcy5uYW1lcywgdGhpcy52YWx1ZXMpO1xuICB9XG5cbiAgZ2V0IHN5bWJvbE5hbWVzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICBsZXQgc3ltYm9sTmFtZXMgPSB0aGlzLl9zeW1ib2xOYW1lcztcblxuICAgIGlmIChzeW1ib2xOYW1lcyA9PT0gbnVsbCkge1xuICAgICAgc3ltYm9sTmFtZXMgPSB0aGlzLl9zeW1ib2xOYW1lcyA9IHRoaXMubmFtZXMubWFwKHRvU3ltYm9sTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN5bWJvbE5hbWVzO1xuICB9XG59XG5cbmNsYXNzIENhcHR1cmVkQmxvY2tBcmd1bWVudHNJbXBsIGltcGxlbWVudHMgQ2FwdHVyZWRCbG9ja0FyZ3VtZW50cyB7XG4gIHB1YmxpYyBsZW5ndGg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBwdWJsaWMgdmFsdWVzOiByZWFkb25seSBPcHRpb248QmxvY2tWYWx1ZT5bXSkge1xuICAgIHRoaXMubGVuZ3RoID0gbmFtZXMubGVuZ3RoO1xuICB9XG5cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLmluZGV4T2YobmFtZSkgIT09IC0xO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IE9wdGlvbjxTY29wZUJsb2NrPiB7XG4gICAgbGV0IGlkeCA9IHRoaXMubmFtZXMuaW5kZXhPZihuYW1lKTtcblxuICAgIGlmIChpZHggPT09IC0xKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBbXG4gICAgICB0aGlzLnZhbHVlc1tpZHggKiAzICsgMl0gYXMgQ29tcGlsYWJsZUJsb2NrLFxuICAgICAgdGhpcy52YWx1ZXNbaWR4ICogMyArIDFdIGFzIFNjb3BlLFxuICAgICAgdGhpcy52YWx1ZXNbaWR4ICogM10gYXMgQmxvY2tTeW1ib2xUYWJsZSxcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYXB0dXJlZEFyZ3MobmFtZWQ6IERpY3Q8UmVmZXJlbmNlPiwgcG9zaXRpb25hbDogUmVmZXJlbmNlW10pIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lZCxcbiAgICBwb3NpdGlvbmFsLFxuICB9IGFzIENhcHR1cmVkQXJndW1lbnRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVpZnlOYW1lZChuYW1lZDogQ2FwdHVyZWROYW1lZEFyZ3VtZW50cykge1xuICBsZXQgcmVpZmllZCA9IGRpY3QoKTtcblxuICBmb3IgKGxldCBrZXkgaW4gbmFtZWQpIHtcbiAgICByZWlmaWVkW2tleV0gPSB2YWx1ZUZvclJlZihuYW1lZFtrZXldKTtcbiAgfVxuXG4gIHJldHVybiByZWlmaWVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVpZnlQb3NpdGlvbmFsKHBvc2l0aW9uYWw6IENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cykge1xuICByZXR1cm4gcG9zaXRpb25hbC5tYXAodmFsdWVGb3JSZWYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVpZnlBcmdzKGFyZ3M6IENhcHR1cmVkQXJndW1lbnRzKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZWQ6IHJlaWZ5TmFtZWQoYXJncy5uYW1lZCksXG4gICAgcG9zaXRpb25hbDogcmVpZnlQb3NpdGlvbmFsKGFyZ3MucG9zaXRpb25hbCksXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBFTVBUWV9OQU1FRCA9IE9iamVjdC5mcmVlemUoT2JqZWN0LmNyZWF0ZShudWxsKSkgYXMgQ2FwdHVyZWROYW1lZEFyZ3VtZW50cztcbmV4cG9ydCBjb25zdCBFTVBUWV9QT1NJVElPTkFMID0gRU1QVFlfUkVGRVJFTkNFUyBhcyBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHM7XG5leHBvcnQgY29uc3QgRU1QVFlfQVJHUyA9IGNyZWF0ZUNhcHR1cmVkQXJncyhFTVBUWV9OQU1FRCwgRU1QVFlfUE9TSVRJT05BTCk7XG4iXSwic291cmNlUm9vdCI6IiJ9