@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
520 lines (418 loc) • 42.6 kB
JavaScript
"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");
/*
The calling convention is:
* 0-N block arguments at the bottom
* 0-N positional arguments next (left-to-right)
* 0-N named arguments next
*/
class VMArgumentsImpl {
constructor() {
this.stack = null;
this.positional = new PositionalArgumentsImpl();
this.named = new NamedArgumentsImpl();
this.blocks = new BlockArgumentsImpl();
}
empty(stack) {
let base = stack[_symbols.REGISTERS][_vm.$sp] + 1;
this.named.empty(stack, base);
this.positional.empty(stack, base);
this.blocks.empty(stack, base);
return this;
}
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
*/
let named = this.named;
let namedCount = names.length;
let namedBase = stack[_symbols.REGISTERS][_vm.$sp] - namedCount + 1;
named.setup(stack, namedBase, namedCount, names, atNames);
let positional = this.positional;
let positionalBase = namedBase - positionalCount;
positional.setup(stack, positionalBase, positionalCount);
let blocks = this.blocks;
let blocksCount = blockNames.length;
let blocksBase = positionalBase - blocksCount * 3;
blocks.setup(stack, blocksBase, blocksCount, blockNames);
}
get base() {
return this.blocks.base;
}
get length() {
return this.positional.length + this.named.length + this.blocks.length * 3;
}
at(pos) {
return this.positional.at(pos);
}
realloc(offset) {
let {
stack
} = this;
if (offset > 0 && stack !== null) {
let {
positional,
named
} = this;
let newBase = positional.base + offset;
let length = positional.length + named.length;
for (let 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;
}
}
capture() {
let positional = this.positional.length === 0 ? EMPTY_POSITIONAL : this.positional.capture();
let named = this.named.length === 0 ? EMPTY_NAMED : this.named.capture();
return {
named,
positional
};
}
clear() {
let {
stack,
length
} = this;
if (length > 0 && stack !== null) stack.pop(length);
}
}
exports.VMArgumentsImpl = VMArgumentsImpl;
const EMPTY_REFERENCES = (0, _util.emptyArray)();
class PositionalArgumentsImpl {
constructor() {
this.base = 0;
this.length = 0;
this.stack = null;
this._references = null;
}
empty(stack, base) {
this.stack = stack;
this.base = base;
this.length = 0;
this._references = EMPTY_REFERENCES;
}
setup(stack, base, length) {
this.stack = stack;
this.base = base;
this.length = length;
if (length === 0) {
this._references = EMPTY_REFERENCES;
} else {
this._references = null;
}
}
at(position) {
let {
base,
length,
stack
} = this;
if (position < 0 || position >= length) {
return _reference.UNDEFINED_REFERENCE;
}
return stack.get(position, base);
}
capture() {
return this.references;
}
prepend(other) {
let additions = other.length;
if (additions > 0) {
let {
base,
length,
stack
} = this;
this.base = base = base - additions;
this.length = length + additions;
for (let i = 0; i < additions; i++) {
stack.set(other[i], i, base);
}
this._references = null;
}
}
get references() {
let references = this._references;
if (!references) {
let {
stack,
base,
length
} = this;
references = this._references = stack.slice(base, base + length);
}
return references;
}
}
exports.PositionalArgumentsImpl = PositionalArgumentsImpl;
class NamedArgumentsImpl {
constructor() {
this.base = 0;
this.length = 0;
this._references = null;
this._names = _util.EMPTY_STRING_ARRAY;
this._atNames = _util.EMPTY_STRING_ARRAY;
}
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;
}
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;
}
}
}
get names() {
let names = this._names;
if (!names) {
names = this._names = this._atNames.map(this.toSyntheticName);
}
return names;
}
get atNames() {
let atNames = this._atNames;
if (!atNames) {
atNames = this._atNames = this._names.map(this.toAtName);
}
return atNames;
}
has(name) {
return this.names.indexOf(name) !== -1;
}
get(name, atNames = false) {
let {
base,
stack
} = this;
let names = atNames ? this.atNames : this.names;
let idx = names.indexOf(name);
if (idx === -1) {
return _reference.UNDEFINED_REFERENCE;
}
let ref = stack.get(idx, base);
if (_env.DEBUG) {
return (0, _reference.createDebugAliasRef)(atNames ? name : `@${name}`, ref);
} else {
return ref;
}
}
capture() {
let {
names,
references
} = this;
let map = (0, _util.dict)();
for (let i = 0; i < names.length; i++) {
let name = names[i];
if (_env.DEBUG) {
map[name] = (0, _reference.createDebugAliasRef)(`@${name}`, references[i]);
} else {
map[name] = references[i];
}
}
return map;
}
merge(other) {
let keys = Object.keys(other);
if (keys.length > 0) {
let {
names,
length,
stack
} = this;
let newNames = names.slice();
for (let i = 0; i < keys.length; i++) {
let name = keys[i];
let 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;
}
}
get references() {
let references = this._references;
if (!references) {
let {
base,
length,
stack
} = this;
references = this._references = stack.slice(base, base + length);
}
return references;
}
toSyntheticName(name) {
return name.slice(1);
}
toAtName(name) {
return `@${name}`;
}
}
exports.NamedArgumentsImpl = NamedArgumentsImpl;
function toSymbolName(name) {
return `&${name}`;
}
const EMPTY_BLOCK_VALUES = (0, _util.emptyArray)();
class BlockArgumentsImpl {
constructor() {
this.internalValues = null;
this._symbolNames = null;
this.internalTag = null;
this.names = _util.EMPTY_STRING_ARRAY;
this.length = 0;
this.base = 0;
}
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;
}
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;
}
}
get values() {
let values = this.internalValues;
if (!values) {
let {
base,
length,
stack
} = this;
values = this.internalValues = stack.slice(base, base + length * 3);
}
return values;
}
has(name) {
return this.names.indexOf(name) !== -1;
}
get(name) {
let idx = this.names.indexOf(name);
if (idx === -1) {
return null;
}
let {
base,
stack
} = this;
let table = stack.get(idx * 3, base);
let scope = stack.get(idx * 3 + 1, base);
let handle = stack.get(idx * 3 + 2, base);
return handle === null ? null : [handle, scope, table];
}
capture() {
return new CapturedBlockArgumentsImpl(this.names, this.values);
}
get symbolNames() {
let symbolNames = this._symbolNames;
if (symbolNames === null) {
symbolNames = this._symbolNames = this.names.map(toSymbolName);
}
return symbolNames;
}
}
exports.BlockArgumentsImpl = BlockArgumentsImpl;
class CapturedBlockArgumentsImpl {
constructor(names, values) {
this.names = names;
this.values = values;
this.length = names.length;
}
has(name) {
return this.names.indexOf(name) !== -1;
}
get(name) {
let 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]];
}
}
function createCapturedArgs(named, positional) {
return {
named,
positional
};
}
function reifyNamed(named) {
let reified = (0, _util.dict)();
for (let 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)
};
}
const EMPTY_NAMED = Object.freeze(Object.create(null));
exports.EMPTY_NAMED = EMPTY_NAMED;
const EMPTY_POSITIONAL = EMPTY_REFERENCES;
exports.EMPTY_POSITIONAL = EMPTY_POSITIONAL;
const EMPTY_ARGS = createCapturedArgs(EMPTY_NAMED, EMPTY_POSITIONAL);
exports.EMPTY_ARGS = EMPTY_ARGS;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2FyZ3VtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQWtCQTs7QUFNQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFHQTs7Ozs7OztBQVFNLE1BQUEsZUFBQSxDQUFzQjtBQUE1QixFQUFBLFdBQUEsR0FBQTtBQUNVLFNBQUEsS0FBQSxHQUFBLElBQUE7QUFDRCxTQUFBLFVBQUEsR0FBYSxJQUFiLHVCQUFhLEVBQWI7QUFDQSxTQUFBLEtBQUEsR0FBUSxJQUFSLGtCQUFRLEVBQVI7QUFDQSxTQUFBLE1BQUEsR0FBUyxJQUFULGtCQUFTLEVBQVQ7QUF1RlI7O0FBckZDLEVBQUEsS0FBSyxDQUFBLEtBQUEsRUFBdUI7QUFDMUIsUUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFMLGtCQUFLLENBQUwsQ0FBQSxPQUFBLElBQVgsQ0FBQTtBQUVBLFNBQUEsS0FBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUEsSUFBQTtBQUNBLFNBQUEsVUFBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUEsSUFBQTtBQUNBLFNBQUEsTUFBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUEsSUFBQTtBQUVBLFdBQUEsSUFBQTtBQUNEOztBQUVELEVBQUEsS0FBSyxDQUFBLEtBQUEsRUFBQSxLQUFBLEVBQUEsVUFBQSxFQUFBLGVBQUEsRUFBQSxPQUFBLEVBS2E7QUFFaEIsU0FBQSxLQUFBLEdBQUEsS0FBQTtBQUVBOzs7Ozs7OztBQVFBLFFBQUksS0FBSyxHQUFHLEtBQVosS0FBQTtBQUNBLFFBQUksVUFBVSxHQUFHLEtBQUssQ0FBdEIsTUFBQTtBQUNBLFFBQUksU0FBUyxHQUFHLEtBQUssQ0FBTCxrQkFBSyxDQUFMLENBQUEsT0FBQSxJQUFBLFVBQUEsR0FBaEIsQ0FBQTtBQUVBLElBQUEsS0FBSyxDQUFMLEtBQUEsQ0FBQSxLQUFBLEVBQUEsU0FBQSxFQUFBLFVB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ckI2Qjs7QUF3QjFCLFNBQUEsa0JBQUEsQ0FBQSxLQUFBLEVBQUEsVUFBQSxFQUE0RTtBQUNoRixTQUFPO0FBQUEsSUFBQSxLQUFBO0FBRUwsSUFBQTtBQUZLLEdBQVA7QUFJRDs7QUFFSyxTQUFBLFVBQUEsQ0FBQSxLQUFBLEVBQWtEO0FBQ3RELE1BQUksT0FBTyxHQUFYLGlCQUFBOztBQUVBLE9BQUssSUFBTCxHQUFBLElBQUEsS0FBQSxFQUF1QjtBQUNyQixJQUFBLE9BQU8sQ0FBUCxHQUFPLENBQVAsR0FBZSw0QkFBWSxLQUFLLENBQWhDLEdBQWdDLENBQWpCLENBQWY7QUFDRDs7QUFFRCxTQUFBLE9BQUE7QUFDRDs7QUFFSyxTQUFBLGVBQUEsQ0FBQSxVQUFBLEVBQWlFO0FBQ3JFLFNBQU8sVUFBVSxDQUFWLEdBQUEsQ0FBUCxzQkFBTyxDQUFQO0FBQ0Q7O0FBRUssU0FBQSxTQUFBLENBQUEsSUFBQSxFQUEyQztBQUMvQyxTQUFPO0FBQ0wsSUFBQSxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FEakIsS0FDWSxDQURaO0FBRUwsSUFBQSxVQUFVLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBTCxVQUFBO0FBRnRCLEdBQVA7QUFJRDs7QUFFTSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQU4sTUFBQSxDQUFjLE1BQU0sQ0FBTixNQUFBLENBQWxDLElBQWtDLENBQWQsQ0FBcEI7O0FBQ0EsTUFBTSxnQkFBZ0IsR0FBdEIsZ0JBQUE7O0FBQ0EsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUEsV0FBQSxFQUFyQyxnQkFBcUMsQ0FBckMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjaGVjaywgQ2hlY2tCbG9ja1N5bWJvbFRhYmxlLCBDaGVja0hhbmRsZSwgQ2hlY2tPcHRpb24sIENoZWNrT3IgfSBmcm9tICdAZ2xpbW1lci9kZWJ1Zyc7XG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQge1xuICBCbG9ja0FyZ3VtZW50cyxcbiAgQmxvY2tTeW1ib2xUYWJsZSxcbiAgQmxvY2tWYWx1ZSxcbiAgQ2FwdHVyZWRBcmd1bWVudHMsXG4gIENhcHR1cmVkQmxvY2tBcmd1bWVudHMsXG4gIENhcHR1cmVkTmFtZWRBcmd1bWVudHMsXG4gIENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgQ29tcGlsYWJsZUJsb2NrLFxuICBEaWN0LFxuICBOYW1lZEFyZ3VtZW50cyxcbiAgT3B0aW9uLFxuICBQb3NpdGlvbmFsQXJndW1lbnRzLFxuICBTY29wZSxcbiAgU2NvcGVCbG9jayxcbiAgVk1Bcmd1bWVudHMsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlRGVidWdBbGlhc1JlZixcbiAgUmVmZXJlbmNlLFxuICBVTkRFRklORURfUkVGRVJFTkNFLFxuICB2YWx1ZUZvclJlZixcbn0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGRpY3QsIGVtcHR5QXJyYXksIEVNUFRZX1NUUklOR19BUlJBWSB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQ09OU1RBTlRfVEFHLCBUYWcgfSBmcm9tICdAZ2xpbW1lci92YWxpZGF0b3InO1xuaW1wb3J0IHsgJHNwIH0gZnJvbSAnQGdsaW1tZXIvdm0nO1xuaW1wb3J0IHsgQ2hlY2tDb21waWxhYmxlQmxvY2ssIENoZWNrUmVmZXJlbmNlLCBDaGVja1Njb3BlIH0gZnJvbSAnLi4vY29tcGlsZWQvb3Bjb2Rlcy8tZGVidWctc3RyaXAnO1xuaW1wb3J0IHsgUkVHSVNURVJTIH0gZnJvbSAnLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBFdmFsdWF0aW9uU3RhY2sgfSBmcm9tICcuL3N0YWNrJztcblxuLypcbiAgVGhlIGNhbGxpbmcgY29udmVudGlvbiBpczpcblxuICAqIDAtTiBibG9jayBhcmd1bWVudHMgYXQgdGhlIGJvdHRvbVxuICAqIDAtTiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBuZXh0IChsZWZ0LXRvLXJpZ2h0KVxuICAqIDAtTiBuYW1lZCBhcmd1bWVudHMgbmV4dFxuKi9cblxuZXhwb3J0IGNsYXNzIFZNQXJndW1lbnRzSW1wbCBpbXBsZW1lbnRzIFZNQXJndW1lbnRzIHtcbiAgcHJpdmF0ZSBzdGFjazogT3B0aW9uPEV2YWx1YXRpb25TdGFjaz4gPSBudWxsO1xuICBwdWJsaWMgcG9zaXRpb25hbCA9IG5ldyBQb3NpdGlvbmFsQXJndW1lbnRzSW1wbCgpO1xuICBwdWJsaWMgbmFtZWQgPSBuZXcgTmFtZWRBcmd1bWVudHNJbXBsKCk7XG4gIHB1YmxpYyBibG9ja3MgPSBuZXcgQmxvY2tBcmd1bWVudHNJbXBsKCk7XG5cbiAgZW1wdHkoc3RhY2s6IEV2YWx1YXRpb25TdGFjayk6IHRoaXMge1xuICAgIGxldCBiYXNlID0gc3RhY2tbUkVHSVNURVJTXVskc3BdICsgMTtcblxuICAgIHRoaXMubmFtZWQuZW1wdHkoc3RhY2ssIGJhc2UpO1xuICAgIHRoaXMucG9zaXRpb25hbC5lbXB0eShzdGFjaywgYmFzZSk7XG4gICAgdGhpcy5ibG9ja3MuZW1wdHkoc3RhY2ssIGJhc2UpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXR1cChcbiAgICBzdGFjazogRXZhbHVhdGlvblN0YWNrLFxuICAgIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBibG9ja05hbWVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBwb3NpdGlvbmFsQ291bnQ6IG51bWJlcixcbiAgICBhdE5hbWVzOiBib29sZWFuXG4gICkge1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcblxuICAgIC8qXG4gICAgICAgICAgIHwgLi4uIHwgYmxvY2tzICAgICAgfCBwb3NpdGlvbmFsICB8IG5hbWVkIHxcbiAgICAgICAgICAgfCAuLi4gfCBiMCAgICBiMSAgICB8IHAwIHAxIHAyIHAzIHwgbjAgbjEgfFxuICAgICBpbmRleCB8IC4uLiB8IDQvNS82IDcvOC85IHwgMTAgMTEgMTIgMTMgfCAxNCAxNSB8XG4gICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICBeICAgICAgICAgICAgIF4gIF5cbiAgICAgICAgICAgICAgICAgYmJhc2UgICAgICAgICBwYmFzZSAgICAgICBuYmFzZSAgc3BcbiAgICAqL1xuXG4gICAgbGV0IG5hbWVkID0gdGhpcy5uYW1lZDtcbiAgICBsZXQgbmFtZWRDb3VudCA9IG5hbWVzLmxlbmd0aDtcbiAgICBsZXQgbmFtZWRCYXNlID0gc3RhY2tbUkVHSVNURVJTXVskc3BdIC0gbmFtZWRDb3VudCArIDE7XG5cbiAgICBuYW1lZC5zZXR1cChzdGFjaywgbmFtZWRCYXNlLCBuYW1lZENvdW50LCBuYW1lcywgYXROYW1lcyk7XG5cbiAgICBsZXQgcG9zaXRpb25hbCA9IHRoaXMucG9zaXRpb25hbDtcbiAgICBsZXQgcG9zaXRpb25hbEJhc2UgPSBuYW1lZEJhc2UgLSBwb3NpdGlvbmFsQ291bnQ7XG5cbiAgICBwb3NpdGlvbmFsLnNldHVwKHN0YWNrLCBwb3NpdGlvbmFsQmFzZSwgcG9zaXRpb25hbENvdW50KTtcblxuICAgIGxldCBibG9ja3MgPSB0aGlzLmJsb2NrcztcbiAgICBsZXQgYmxvY2tzQ291bnQgPSBibG9ja05hbWVzLmxlbmd0aDtcbiAgICBsZXQgYmxvY2tzQmFzZSA9IHBvc2l0aW9uYWxCYXNlIC0gYmxvY2tzQ291bnQgKiAzO1xuXG4gICAgYmxvY2tzLnNldHVwKHN0YWNrLCBibG9ja3NCYXNlLCBibG9ja3NDb3VudCwgYmxvY2tOYW1lcyk7XG4gIH1cblxuICBnZXQgYmFzZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJsb2Nrcy5iYXNlO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uYWwubGVuZ3RoICsgdGhpcy5uYW1lZC5sZW5ndGggKyB0aGlzLmJsb2Nrcy5sZW5ndGggKiAzO1xuICB9XG5cbiAgYXQocG9zOiBudW1iZXIpOiBSZWZlcmVuY2Uge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uYWwuYXQocG9zKTtcbiAgfVxuXG4gIHJlYWxsb2Mob2Zmc2V0OiBudW1iZXIpIHtcbiAgICBsZXQgeyBzdGFjayB9ID0gdGhpcztcbiAgICBpZiAob2Zmc2V0ID4gMCAmJiBzdGFjayAhPT0gbnVsbCkge1xuICAgICAgbGV0IHsgcG9zaXRpb25hbCwgbmFtZWQgfSA9IHRoaXM7XG4gICAgICBsZXQgbmV3QmFzZSA9IHBvc2l0aW9uYWwuYmFzZSArIG9mZnNldDtcbiAgICAgIGxldCBsZW5ndGggPSBwb3NpdGlvbmFsLmxlbmd0aCArIG5hbWVkLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaSA9IGxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHN0YWNrLmNvcHkoaSArIHBvc2l0aW9uYWwuYmFzZSwgaSArIG5ld0Jhc2UpO1xuICAgICAgfVxuXG4gICAgICBwb3NpdGlvbmFsLmJhc2UgKz0gb2Zmc2V0O1xuICAgICAgbmFtZWQuYmFzZSArPSBvZmZzZXQ7XG4gICAgICBzdGFja1tSRUdJU1RFUlNdWyRzcF0gKz0gb2Zmc2V0O1xuICAgIH1cbiAgfVxuXG4gIGNhcHR1cmUoKTogQ2FwdHVyZWRBcmd1bWVudHMge1xuICAgIGxldCBwb3NpdGlvbmFsID0gdGhpcy5wb3NpdGlvbmFsLmxlbmd0aCA9PT0gMCA/IEVNUFRZX1BPU0lUSU9OQUwgOiB0aGlzLnBvc2l0aW9uYWwuY2FwdHVyZSgpO1xuICAgIGxldCBuYW1lZCA9IHRoaXMubmFtZWQubGVuZ3RoID09PSAwID8gRU1QVFlfTkFNRUQgOiB0aGlzLm5hbWVkLmNhcHR1cmUoKTtcblxuICAgIHJldHVybiB7IG5hbWVkLCBwb3NpdGlvbmFsIH0gYXMgQ2FwdHVyZWRBcmd1bWVudHM7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBsZXQgeyBzdGFjaywgbGVuZ3RoIH0gPSB0aGlzO1xuICAgIGlmIChsZW5ndGggPiAwICYmIHN0YWNrICE9PSBudWxsKSBzdGFjay5wb3AobGVuZ3RoKTtcbiAgfVxufVxuXG5jb25zdCBFTVBUWV9SRUZFUkVOQ0VTID0gZW1wdHlBcnJheTxSZWZlcmVuY2U+KCk7XG5cbmV4cG9ydCBjbGFzcyBQb3NpdGlvbmFsQXJndW1lbnRzSW1wbCBpbXBsZW1lbnRzIFBvc2l0aW9uYWxBcmd1bWVudHMge1xuICBwdWJsaWMgYmFzZSA9IDA7XG4gIHB1YmxpYyBsZW5ndGggPSAwO1xuXG4gIHByaXZhdGUgc3RhY2s6IEV2YWx1YXRpb25TdGFjayA9IG51bGwgYXMgYW55O1xuXG4gIHByaXZhdGUgX3JlZmVyZW5jZXM6IE9wdGlvbjxyZWFkb25seSBSZWZlcmVuY2VbXT4gPSBudWxsO1xuXG4gIGVtcHR5KHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssIGJhc2U6IG51bWJlcikge1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBFTVBUWV9SRUZFUkVOQ0VTO1xuICB9XG5cbiAgc2V0dXAoc3RhY2s6IEV2YWx1YXRpb25TdGFjaywgYmFzZTogbnVtYmVyLCBsZW5ndGg6IG51bWJlcikge1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuXG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IEVNUFRZX1JFRkVSRU5DRVM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGF0KHBvc2l0aW9uOiBudW1iZXIpOiBSZWZlcmVuY2Uge1xuICAgIGxldCB7IGJhc2UsIGxlbmd0aCwgc3RhY2sgfSA9IHRoaXM7XG5cbiAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoZWNrKHN0YWNrLmdldChwb3NpdGlvbiwgYmFzZSksIENoZWNrUmVmZXJlbmNlKTtcbiAgfVxuXG4gIGNhcHR1cmUoKTogQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzIHtcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VzIGFzIENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cztcbiAgfVxuXG4gIHByZXBlbmQob3RoZXI6IFJlZmVyZW5jZVtdKSB7XG4gICAgbGV0IGFkZGl0aW9ucyA9IG90aGVyLmxlbmd0aDtcblxuICAgIGlmIChhZGRpdGlvbnMgPiAwKSB7XG4gICAgICBsZXQgeyBiYXNlLCBsZW5ndGgsIHN0YWNrIH0gPSB0aGlzO1xuXG4gICAgICB0aGlzLmJhc2UgPSBiYXNlID0gYmFzZSAtIGFkZGl0aW9ucztcbiAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoICsgYWRkaXRpb25zO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGl0aW9uczsgaSsrKSB7XG4gICAgICAgIHN0YWNrLnNldChvdGhlcltpXSwgaSwgYmFzZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHJlZmVyZW5jZXMoKTogcmVhZG9ubHkgUmVmZXJlbmNlW10ge1xuICAgIGxldCByZWZlcmVuY2VzID0gdGhpcy5fcmVmZXJlbmNlcztcblxuICAgIGlmICghcmVmZXJlbmNlcykge1xuICAgICAgbGV0IHsgc3RhY2ssIGJhc2UsIGxlbmd0aCB9ID0gdGhpcztcbiAgICAgIHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzID0gc3RhY2suc2xpY2U8UmVmZXJlbmNlPihiYXNlLCBiYXNlICsgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmFtZWRBcmd1bWVudHNJbXBsIGltcGxlbWVudHMgTmFtZWRBcmd1bWVudHMge1xuICBwdWJsaWMgYmFzZSA9IDA7XG4gIHB1YmxpYyBsZW5ndGggPSAwO1xuXG4gIHByaXZhdGUgc3RhY2shOiBFdmFsdWF0aW9uU3RhY2s7XG5cbiAgcHJpdmF0ZSBfcmVmZXJlbmNlczogT3B0aW9uPHJlYWRvbmx5IFJlZmVyZW5jZVtdPiA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfbmFtZXM6IE9wdGlvbjxyZWFkb25seSBzdHJpbmdbXT4gPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG4gIHByaXZhdGUgX2F0TmFtZXM6IE9wdGlvbjxyZWFkb25seSBzdHJpbmdbXT4gPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG5cbiAgZW1wdHkoc3RhY2s6IEV2YWx1YXRpb25TdGFjaywgYmFzZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgdGhpcy5fcmVmZXJlbmNlcyA9IEVNUFRZX1JFRkVSRU5DRVM7XG4gICAgdGhpcy5fbmFtZXMgPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG4gICAgdGhpcy5fYXROYW1lcyA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgfVxuXG4gIHNldHVwKFxuICAgIHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssXG4gICAgYmFzZTogbnVtYmVyLFxuICAgIGxlbmd0aDogbnVtYmVyLFxuICAgIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBhdE5hbWVzOiBib29sZWFuXG4gICkge1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuXG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IEVNUFRZX1JFRkVSRU5DRVM7XG4gICAgICB0aGlzLl9uYW1lcyA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgICAgIHRoaXMuX2F0TmFtZXMgPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuXG4gICAgICBpZiAoYXROYW1lcykge1xuICAgICAgICB0aGlzLl9uYW1lcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2F0TmFtZXMgPSBuYW1lcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX25hbWVzID0gbmFtZXM7XG4gICAgICAgIHRoaXMuX2F0TmFtZXMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBuYW1lcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgbGV0IG5hbWVzID0gdGhpcy5fbmFtZXM7XG5cbiAgICBpZiAoIW5hbWVzKSB7XG4gICAgICBuYW1lcyA9IHRoaXMuX25hbWVzID0gdGhpcy5fYXROYW1lcyEubWFwKHRoaXMudG9TeW50aGV0aWNOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZXMhO1xuICB9XG5cbiAgZ2V0IGF0TmFtZXMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIGxldCBhdE5hbWVzID0gdGhpcy5fYXROYW1lcztcblxuICAgIGlmICghYXROYW1lcykge1xuICAgICAgYXROYW1lcyA9IHRoaXMuX2F0TmFtZXMgPSB0aGlzLl9uYW1lcyEubWFwKHRoaXMudG9BdE5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBhdE5hbWVzITtcbiAgfVxuXG4gIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcsIGF0TmFtZXMgPSBmYWxzZSk6IFJlZmVyZW5jZSB7XG4gICAgbGV0IHsgYmFzZSwgc3RhY2sgfSA9IHRoaXM7XG5cbiAgICBsZXQgbmFtZXMgPSBhdE5hbWVzID8gdGhpcy5hdE5hbWVzIDogdGhpcy5uYW1lcztcblxuICAgIGxldCBpZHggPSBuYW1lcy5pbmRleE9mKG5hbWUpO1xuXG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBVTkRFRklORURfUkVGRVJFTkNFO1xuICAgIH1cblxuICAgIGxldCByZWYgPSBzdGFjay5nZXQ8UmVmZXJlbmNlPihpZHgsIGJhc2UpO1xuXG4gICAgaWYgKERFQlVHKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRGVidWdBbGlhc1JlZiEoYXROYW1lcyA/IG5hbWUgOiBgQCR7bmFtZX1gLCByZWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVmO1xuICAgIH1cbiAgfVxuXG4gIGNhcHR1cmUoKTogQ2FwdHVyZWROYW1lZEFyZ3VtZW50cyB7XG4gICAgbGV0IHsgbmFtZXMsIHJlZmVyZW5jZXMgfSA9IHRoaXM7XG4gICAgbGV0IG1hcCA9IGRpY3Q8UmVmZXJlbmNlPigpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG5hbWUgPSBuYW1lc1tpXTtcblxuICAgICAgaWYgKERFQlVHKSB7XG4gICAgICAgIG1hcFtuYW1lXSA9IGNyZWF0ZURlYnVnQWxpYXNSZWYhKGBAJHtuYW1lfWAsIHJlZmVyZW5jZXNbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFwW25hbWVdID0gcmVmZXJlbmNlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFwIGFzIENhcHR1cmVkTmFtZWRBcmd1bWVudHM7XG4gIH1cblxuICBtZXJnZShvdGhlcjogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPikge1xuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMob3RoZXIpO1xuXG4gICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHsgbmFtZXMsIGxlbmd0aCwgc3RhY2sgfSA9IHRoaXM7XG4gICAgICBsZXQgbmV3TmFtZXMgPSBuYW1lcy5zbGljZSgpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5hbWUgPSBrZXlzW2ldO1xuICAgICAgICBsZXQgaWR4ID0gbmV3TmFtZXMuaW5kZXhPZihuYW1lKTtcblxuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgIGxlbmd0aCA9IG5ld05hbWVzLnB1c2gobmFtZSk7XG4gICAgICAgICAgc3RhY2sucHVzaChvdGhlcltuYW1lXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gbnVsbDtcbiAgICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG4gICAgICB0aGlzLl9hdE5hbWVzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCByZWZlcmVuY2VzKCk6IHJlYWRvbmx5IFJlZmVyZW5jZVtdIHtcbiAgICBsZXQgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXM7XG5cbiAgICBpZiAoIXJlZmVyZW5jZXMpIHtcbiAgICAgIGxldCB7IGJhc2UsIGxlbmd0aCwgc3RhY2sgfSA9IHRoaXM7XG4gICAgICByZWZlcmVuY2VzID0gdGhpcy5fcmVmZXJlbmNlcyA9IHN0YWNrLnNsaWNlPFJlZmVyZW5jZT4oYmFzZSwgYmFzZSArIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZXM7XG4gIH1cblxuICBwcml2YXRlIHRvU3ludGhldGljTmFtZSh0aGlzOiB2b2lkLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnNsaWNlKDEpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0F0TmFtZSh0aGlzOiB2b2lkLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgQCR7bmFtZX1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvU3ltYm9sTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCYke25hbWV9YDtcbn1cblxuY29uc3QgRU1QVFlfQkxPQ0tfVkFMVUVTID0gZW1wdHlBcnJheTxCbG9ja1ZhbHVlPigpO1xuXG5leHBvcnQgY2xhc3MgQmxvY2tBcmd1bWVudHNJbXBsIGltcGxlbWVudHMgQmxvY2tBcmd1bWVudHMge1xuICBwcml2YXRlIHN0YWNrITogRXZhbHVhdGlvblN0YWNrO1xuICBwcml2YXRlIGludGVybmFsVmFsdWVzOiBPcHRpb248cmVhZG9ubHkgQmxvY2tWYWx1ZVtdPiA9IG51bGw7XG4gIHByaXZhdGUgX3N5bWJvbE5hbWVzOiBPcHRpb248cmVhZG9ubHkgc3RyaW5nW10+ID0gbnVsbDtcblxuICBwdWJsaWMgaW50ZXJuYWxUYWc6IE9wdGlvbjxUYWc+ID0gbnVsbDtcbiAgcHVibGljIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSA9IEVNUFRZX1NUUklOR19BUlJBWTtcblxuICBwdWJsaWMgbGVuZ3RoID0gMDtcbiAgcHVibGljIGJhc2UgPSAwO1xuXG4gIGVtcHR5KHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssIGJhc2U6IG51bWJlcikge1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICB0aGlzLm5hbWVzID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuX3N5bWJvbE5hbWVzID0gbnVsbDtcblxuICAgIHRoaXMuaW50ZXJuYWxUYWcgPSBDT05TVEFOVF9UQUc7XG4gICAgdGhpcy5pbnRlcm5hbFZhbHVlcyA9IEVNUFRZX0JMT0NLX1ZBTFVFUztcbiAgfVxuXG4gIHNldHVwKHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssIGJhc2U6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSkge1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICB0aGlzLm5hbWVzID0gbmFtZXM7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICB0aGlzLl9zeW1ib2xOYW1lcyA9IG51bGw7XG5cbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmludGVybmFsVGFnID0gQ09OU1RBTlRfVEFHO1xuICAgICAgdGhpcy5pbnRlcm5hbFZhbHVlcyA9IEVNUFRZX0JMT0NLX1ZBTFVFUztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcm5hbFRhZyA9IG51bGw7XG4gICAgICB0aGlzLmludGVybmFsVmFsdWVzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWVzKCk6IHJlYWRvbmx5IEJsb2NrVmFsdWVbXSB7XG4gICAgbGV0IHZhbHVlcyA9IHRoaXMuaW50ZXJuYWxWYWx1ZXM7XG5cbiAgICBpZiAoIXZhbHVlcykge1xuICAgICAgbGV0IHsgYmFzZSwgbGVuZ3RoLCBzdGFjayB9ID0gdGhpcztcbiAgICAgIHZhbHVlcyA9IHRoaXMuaW50ZXJuYWxWYWx1ZXMgPSBzdGFjay5zbGljZTxCbG9ja1ZhbHVlPihiYXNlLCBiYXNlICsgbGVuZ3RoICogMyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcyEuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKTogT3B0aW9uPFNjb3BlQmxvY2s+IHtcbiAgICBsZXQgaWR4ID0gdGhpcy5uYW1lcyEuaW5kZXhPZihuYW1lKTtcblxuICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgeyBiYXNlLCBzdGFjayB9ID0gdGhpcztcblxuICAgIGxldCB0YWJsZSA9IGNoZWNrKHN0YWNrLmdldChpZHggKiAzLCBiYXNlKSwgQ2hlY2tPcHRpb24oQ2hlY2tCbG9ja1N5bWJvbFRhYmxlKSk7XG4gICAgbGV0IHNjb3BlID0gY2hlY2soc3RhY2suZ2V0KGlkeCAqIDMgKyAxLCBiYXNlKSwgQ2hlY2tPcHRpb24oQ2hlY2tTY29wZSkpO1xuICAgIGxldCBoYW5kbGUgPSBjaGVjayhcbiAgICAgIHN0YWNrLmdldChpZHggKiAzICsgMiwgYmFzZSksXG4gICAgICBDaGVja09wdGlvbihDaGVja09yKENoZWNrSGFuZGxlLCBDaGVja0NvbXBpbGFibGVCbG9jaykpXG4gICAgKTtcblxuICAgIHJldHVybiBoYW5kbGUgPT09IG51bGwgPyBudWxsIDogKFtoYW5kbGUsIHNjb3BlISwgdGFibGUhXSBhcyBTY29wZUJsb2NrKTtcbiAgfVxuXG4gIGNhcHR1cmUoKTogQ2FwdHVyZWRCbG9ja0FyZ3VtZW50cyB7XG4gICAgcmV0dXJuIG5ldyBDYXB0dXJlZEJsb2NrQXJndW1lbnRzSW1wbCh0aGlzLm5hbWVzLCB0aGlzLnZhbHVlcyk7XG4gIH1cblxuICBnZXQgc3ltYm9sTmFtZXMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIGxldCBzeW1ib2xOYW1lcyA9IHRoaXMuX3N5bWJvbE5hbWVzO1xuXG4gICAgaWYgKHN5bWJvbE5hbWVzID09PSBudWxsKSB7XG4gICAgICBzeW1ib2xOYW1lcyA9IHRoaXMuX3N5bWJvbE5hbWVzID0gdGhpcy5uYW1lcy5tYXAodG9TeW1ib2xOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3ltYm9sTmFtZXM7XG4gIH1cbn1cblxuY2xhc3MgQ2FwdHVyZWRCbG9ja0FyZ3VtZW50c0ltcGwgaW1wbGVtZW50cyBDYXB0dXJlZEJsb2NrQXJndW1lbnRzIHtcbiAgcHVibGljIGxlbmd0aDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sIHB1YmxpYyB2YWx1ZXM6IHJlYWRvbmx5IE9wdGlvbjxCbG9ja1ZhbHVlPltdKSB7XG4gICAgdGhpcy5sZW5ndGggPSBuYW1lcy5sZW5ndGg7XG4gIH1cblxuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKTogT3B0aW9uPFNjb3BlQmxvY2s+IHtcbiAgICBsZXQgaWR4ID0gdGhpcy5uYW1lcy5pbmRleE9mKG5hbWUpO1xuXG4gICAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMudmFsdWVzW2lkeCAqIDMgKyAyXSBhcyBDb21waWxhYmxlQmxvY2ssXG4gICAgICB0aGlzLnZhbHVlc1tpZHggKiAzICsgMV0gYXMgU2NvcGUsXG4gICAgICB0aGlzLnZhbHVlc1tpZHggKiAzXSBhcyBCbG9ja1N5bWJvbFRhYmxlLFxuICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkQXJncyhuYW1lZDogRGljdDxSZWZlcmVuY2U+LCBwb3NpdGlvbmFsOiBSZWZlcmVuY2VbXSkge1xuICByZXR1cm4ge1xuICAgIG5hbWVkLFxuICAgIHBvc2l0aW9uYWwsXG4gIH0gYXMgQ2FwdHVyZWRBcmd1bWVudHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWlmeU5hbWVkKG5hbWVkOiBDYXB0dXJlZE5hbWVkQXJndW1lbnRzKSB7XG4gIGxldCByZWlmaWVkID0gZGljdCgpO1xuXG4gIGZvciAobGV0IGtleSBpbiBuYW1lZCkge1xuICAgIHJlaWZpZWRba2V5XSA9IHZhbHVlRm9yUmVmKG5hbWVkW2tleV0pO1xuICB9XG5cbiAgcmV0dXJuIHJlaWZpZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWlmeVBvc2l0aW9uYWwocG9zaXRpb25hbDogQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzKSB7XG4gIHJldHVybiBwb3NpdGlvbmFsLm1hcCh2YWx1ZUZvclJlZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWlmeUFyZ3MoYXJnczogQ2FwdHVyZWRBcmd1bWVudHMpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lZDogcmVpZnlOYW1lZChhcmdzLm5hbWVkKSxcbiAgICBwb3NpdGlvbmFsOiByZWlmeVBvc2l0aW9uYWwoYXJncy5wb3NpdGlvbmFsKSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEVNUFRZX05BTUVEID0gT2JqZWN0LmZyZWV6ZShPYmplY3QuY3JlYXRlKG51bGwpKSBhcyBDYXB0dXJlZE5hbWVkQXJndW1lbnRzO1xuZXhwb3J0IGNvbnN0IEVNUFRZX1BPU0lUSU9OQUwgPSBFTVBUWV9SRUZFUkVOQ0VTIGFzIENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cztcbmV4cG9ydCBjb25zdCBFTVBUWV9BUkdTID0gY3JlYXRlQ2FwdHVyZWRBcmdzKEVNUFRZX05BTUVELCBFTVBUWV9QT1NJVElPTkFMKTtcbiJdLCJzb3VyY2VSb290IjoiIn0=