@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
547 lines (441 loc) • 47.8 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");
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2FyZ3VtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUNBOztBQWtCQTs7QUFNQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0E7Ozs7Ozs7QUFRQSxJQUFNLGVBQU4sR0FBQSxhQUFBLFlBQUE7QUFBQSxXQUFBLGVBQUEsR0FBQTtBQUNVLFNBQUEsS0FBQSxHQUFBLElBQUE7QUFDRCxTQUFBLFVBQUEsR0FBYSxJQUFiLHVCQUFhLEVBQWI7QUFDQSxTQUFBLEtBQUEsR0FBUSxJQUFSLGtCQUFRLEVBQVI7QUFDQSxTQUFBLE1BQUEsR0FBUyxJQUFULGtCQUFTLEVBQVQ7QUF1RlI7O0FBM0ZELE1BQUEsTUFBQSxHQUFBLGVBQUEsQ0FBQSxTQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLEtBQUEsR0FNRSxTQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQTRCO0FBQzFCLFFBQUksSUFBSSxHQUFHLEtBQUssQ0FBTCxrQkFBSyxDQUFMLENBQUEsT0FBQSxJQUFYLENBQUE7QUFFQSxTQUFBLEtBQUEsQ0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUE7QUFDQSxTQUFBLFVBQUEsQ0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUE7QUFDQSxTQUFBLE1BQUEsQ0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUE7QUFFQSxXQUFBLElBQUE7QUFiSixHQUFBOztBQUFBLEVBQUEsTUFBQSxDQUFBLEtBQUEsR0FnQkUsU0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLEtBQUEsRUFBQSxVQUFBLEVBQUEsZUFBQSxFQUFBLE9BQUEsRUFLa0I7QUFFaEIsU0FBQSxLQUFBLEdBQUEsS0FBQTtBQUVBOzs7Ozs7OztBQVFBLFFBQUksS0FBSyxHQUFHLEtBQVosS0FBQTtBQUNBLFFBQUksVUFBVSxHQUFHLEtBQUssQ0FBdEIsTUFBQTtBQUNBLFFBQUksU0FBUyxHQUFHLEtBQUssQ0FBTCxrQkFBSyxDQUFMLENBQUEsT0FBQSxJQUFBLFVBQUEsR0FBaEIsQ0FBQTtBQUVBLElBQUEsS0FBSyxDQUFMLEtBQUEsQ0FBQSxLQUFBLEVBQUEsU0FBQSxFQUFBLFVBQUEsRUFBQSxLQUFBLEVBQUEsT0FBQTtBQUVBLFFBQUksVUFBVSxHQUFHLEtBQWpCLFVBQUE7QUFDQSxRQUFJLGNBQWMsR0FBRyxTQUFTLEdBQTlCLGVBQUE7QUFFQSxJQUFBLFVBQVUsQ0FBVixLQUFBLENBQUEsS0FBQSxFQUFBLGNBQUEsRUFBQSxlQUFBO0FBRUEsUUFBSSxNQUFNLEdBQUcsS0FBYixNQUFBO0FBQ0EsUUFBSSxXQUFXLEdBQUcsVUFBVSxDQUE1QixNQUFBO0FBQ0EsUUFBSSxVQUFVLEdBQUcsY0FBYyxHQUFHLFdBQVcsR0FBN0MsQ0FBQTtBQUVBLElBQUEsTUFBTSxDQUFOLEtBQUEsQ0FBQSxLQUFBLEVBQUEsVUFBQSxFQUFBLFdBQUEsRUFBQSxVQUFBO0FBaERKLEdBQUE7O0FBQUEsRUFBQSxNQUFBLENBQUEsRUFBQSxHQTJERSxTQUFBLEVBQUEsQ0FBQSxHQUFBLEVBQWM7QUFDWixXQUFPLEtBQUEsVUFBQSxDQUFBLEVBQUEsQ0FBUCxHQUFPLENBQVA7QUE1REosR0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxPQUFBLEdBK0RFLFNBQUEsT0FBQSxDQUFBLE1BQUEsRUFBc0I7QUFBQSxRQUNkLEtBRGMsR0FBQSxLQUFBLEtBQUE7O0FBRXBCLFFBQUksTUFBTSxHQUFOLENBQUEsSUFBYyxLQUFLLEtBQXZCLElBQUEsRUFBa0M7QUFBQSxVQUM1QixVQUQ0QixHQUFBLEtBQUEsVUFBQTtBQUFBLFVBQ2QsS0FEYyxHQUFBLEtBQUEsS0FBQTtBQUVoQyxVQUFJLE9BQU8sR0FBRyxVQUFVLENBQVYsSUFBQSxHQUFkLE1BQUE7QUFDQSxVQUFJLE1BQU0sR0FBRyxVQUFVLENBQVYsTUFBQSxHQUFvQixLQUFLLENBQXRDLE1BQUE7O0FBRUEsV0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLEdBQW5CLENBQUEsRUFBeUIsQ0FBQyxJQUExQixDQUFBLEVBQWlDLENBQWpDLEVBQUEsRUFBc0M7QUFDcEMsUUFBQSxLQUFLLENBQUwsSUFBQSxDQUFXLENBQUMsR0FBRyxVQUFVLENBQXpCLElBQUEsRUFBZ0MsQ0FBQyxHQUFqQyxPQUFBO0FBQ0Q7O0FBRUQsTUFBQSxVQUFVLENBQVYsSUFBQSxJQUFBLE1BQUE7QUFDQSxNQUFBLEtBQUssQ0FBTCxJQUFBLElBQUEsTUFBQTtBQUNBLE1BQUEsS0FBSyxDQUFMLGtCQUFLLENBQUwsQ0FBQSxPQUFBLEtBQUEsTUFBQTtBQUNEO0FBN0VMLEdBQUE7O0FBQUEsRUFBQSxNQUFBLENBQUEsT0FBQSxHQWdGRSxTQUFBLE9BQUEsR0FBTztBQUNMLFFBQUksVUFBVSxHQUFHLEtBQUEsVUFBQSxDQUFBLE1BQUEsS0FBQSxDQUFBLEdBQUEsZ0JBQUEsR0FBa0QsS0FBQSxVQUFBLENBQW5FLE9BQW1FLEVBQW5FO0FBQ0EsUUFBSSxLQUFLLEdBQUcsS0FBQSxLQUFBLENBQUEsTUFBQSxLQUFBLENBQUEsR0FBQSxXQUFBLEdBQXdDLEtBQUEsS0FBQSxDQUFwRCxPQUFvRCxFQUFwRDtBQUVBLFdBQU87QUFBRSxNQUFBLEtBQUYsRUFBQSxLQUFBO0FBQVMsTUFBQSxVQUFBLEVBQUE7QUFBVCxLQUFQO0FBcEZKLEdBQUE7O0FBQUEsRUFBQSxNQUFBLENBQUEsS0FBQSxHQXVGRSxTQUFBLEtBQUEsR0FBSztBQUFBLFFBQ0MsS0FERCxHQUFBLEtBQUEsS0FBQTtBQUFBLFFBQ1UsTUFEVixHQUFBLEtBQUEsTUFBQTtBQUVILFFBQUksTUFBTSxHQUFOLENBQUEsSUFBYyxLQUFLLEtBQXZCLElBQUEsRUFBa0MsS0FBSyxDQUFMLEdBQUEsQ0FBQSxNQUFBO0FBekZ0QyxHQUFBOztBQUFBLEVBQUEsWUFBQSxDQUFBLGVBQUEsRUFBQSxDQUFBO0FBQUEsSUFBQSxHQUFBLEVBQUEsTUFBQTtBQUFBLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxHQW1EVTtBQUNOLGFBQU8sS0FBQSxNQUFBLENBQVAsSUFBQTtBQUNEO0FBckRILEdBQUEsRUFBQTtBQUFBLElBQUEsR0FBQSxFQUFBLFFBQUE7QUFBQSxJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsR0F1RFk7QUFDUixhQUFPLEtBQUEsVUFBQSxDQUFBLE1BQUEsR0FBeUIsS0FBQSxLQUFBLENBQXpCLE1BQUEsR0FBNkMsS0FBQSxNQUFBLENBQUEsTUFBQSxHQUFwRCxDQUFBO0FBQ0Q7QUF6REgsR0FBQSxDQUFBLENBQUE7O0FBQUEsU0FBQSxlQUFBO0FBQUEsQ0FBQSxFQUFBOzs7QUE2RkEsSUFBTSxnQkFBZ0IsR0FBdEIsdUJBQUE7O0FBRUEsSUFBTSx1QkFBTixHQUFBLGFBQUEsWUFBQTtBQUFBLFdBQUEsdUJBQUEsR0FBQTtBQUNTLFNBQUEsSUFBQSxHQUFBLENBQUE7QUFDQSxTQUFBLE1BQUEsR0FBQSxDQUFBO0FBRUMsU0FBQSxLQUFBLEdBQUEsSUFBQTtBQUVBLFNBQUEsV0FBQSxHQUFBLElBQUE7QUErRFQ7O0FBckVELE1BQUEsT0FBQSxHQUFBLHVCQUFBLENBQUEsU0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxLQUFBLEdBUUUsU0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUEsRUFBMEM7QUFDeEMsU0FBQSxLQUFBLEdBQUEsS0FBQTtBQUNBLFNBQUEsSUFBQSxHQUFBLElBQUE7QUFDQSxTQUFBLE1BQUEsR0FBQSxDQUFBO0FBRUEsU0FBQSxXQUFBLEdBQUEsZ0JBQUE7QUFiSixHQUFBOztBQUFBLEVBQUEsT0FBQSxDQUFBLEtBQUEsR0FnQkUsU0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUEsRUFBQSxNQUFBLEVBQTBEO0FBQ3hELFNBQUEsS0FBQSxHQUFBLEtBQUE7QUFDQSxTQUFBLElBQUEsR0FBQSxJQUFBO0FBQ0EsU0FBQSxNQUFBLEdBQUEsTUFBQTs7QUFFQSxRQUFJLE1BQU0sS0FBVixDQUFBLEVBQWtCO0FBQ2hCLFdBQUEsV0FBQSxHQUFBLGdCQUFBO0FBREYsS0FBQSxNQUVPO0FBQ0wsV0FBQSxXQUFBLEdBQUEsSUFBQTtBQUNEO0FBekJMLEdBQUE7O0FBQUEsRUFBQSxPQUFBLENBQUEsRUFBQSxHQTRCRSxTQUFBLEVBQUEsQ0FBQSxRQUFBLEVBQW1CO0FBQUEsUUFDYixJQURhLEdBQUEsS0FBQSxJQUFBO0FBQUEsUUFDYixNQURhLEdBQUEsS0FBQSxNQUFBO0FBQUEsUUFDRyxLQURILEdBQUEsS0FBQSxLQUFBOztBQUdqQixRQUFJLFFBQVEsR0FBUixDQUFBLElBQWdCLFFBQVEsSUFBNUIsTUFBQSxFQUF3QztBQUN0QyxhQUFBLDhCQUFBO0FBQ0Q7O0FBRUQsV0FBYSxLQUFLLENBQUwsR0FBQSxDQUFBLFFBQUEsRUFBYixJQUFhLENBQWI7QUFuQ0osR0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxPQUFBLEdBc0NFLFNBQUEsT0FBQSxHQUFPO0FBQ0wsV0FBTyxLQUFQLFVBQUE7QUF2Q0osR0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxPQUFBLEdBMENFLFNBQUEsT0FBQSxDQUFBLEtBQUEsRUFBMEI7QUFDeEIsUUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFyQixNQUFBOztBQUVBLFFBQUksU0FBUyxHQUFiLENBQUEsRUFBbUI7QUFBQSxVQUNiLElBRGEsR0FBQSxLQUFBLElBQUE7QUFBQSxVQUNiLE1BRGEsR0FBQSxLQUFBLE1BQUE7QUFBQSxVQUNHLEtBREgsR0FBQSxLQUFBLEtBQUE7QUFHakIsV0FBQSxJQUFBLEdBQVksSUFBSSxHQUFHLElBQUksR0FBdkIsU0FBQTtBQUNBLFdBQUEsTUFBQSxHQUFjLE1BQU0sR0FBcEIsU0FBQTs7QUFFQSxXQUFLLElBQUksQ0FBQyxHQUFWLENBQUEsRUFBZ0IsQ0FBQyxHQUFqQixTQUFBLEVBQStCLENBQS9CLEVBQUEsRUFBb0M7QUFDbEMsUUFBQSxLQUFLLENBQUwsR0FBQSxDQUFVLEtBQUssQ0FBZixDQUFlLENBQWYsRUFBQSxDQUFBLEVBQUEsSUFBQTtBQUNEOztBQUVELFdBQUEsV0FBQSxHQUFBLElBQUE7QUFDRDtBQXhETCxHQUFBOztBQUFBLEVBQUEsWUFBQSxDQUFBLHVCQUFBLEVBQUEsQ0FBQTtBQUFBLElBQUEsR0FBQSxFQUFBLFlBQUE7QUFBQSxJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsR0EyRHdCO0FBQ3BCLFVBQUksVUFBVSxHQUFHLEtBQWpCLFdBQUE7O0FBRUEsVUFBSSxDQUFKLFVBQUEsRUFBaUI7QUFBQSxZQUNYLEtBRFcsR0FBQSxLQUFBLEtBQUE7QUFBQSxZQUNYLElBRFcsR0FBQSxLQUFBLElBQUE7QUFBQSxZQUNJLE1BREosR0FBQSxLQUFBLE1BQUE7QUFFZixRQUFBLFVBQVUsR0FBRyxLQUFBLFdBQUEsR0FBbUIsS0FBSyxDQUFMLEtBQUEsQ0FBQSxJQUFBLEVBQTZCLElBQUksR0FBakUsTUFBZ0MsQ0FBaEM7QUFDRDs7QUFFRCxhQUFBLFVBQUE7QUFDRDtBQXBFSCxHQUFBLENBQUEsQ0FBQTs7QUFBQSxTQUFBLHVCQUFBO0FBQUEsQ0FBQSxFQUFBOzs7O0FBdUVBLElBQU0sa0JBQU4sR0FBQSxhQUFBLFlBQUE7QUFBQSxXQUFBLGtCQUFBLEdBQUE7QUFDUyxTQUFBLElBQUEsR0FBQSxDQUFBO0FBQ0EsU0FBQSxNQUFBLEdBQUEsQ0FBQTtBQUlDLFNBQUEsV0FBQSxHQUFBLElBQUE7QUFFQSxTQUFBLE1BQUEsR0FBQSx3QkFBQTtBQUNBLFNBQUEsUUFBQSxHQUFBLHdCQUFBO0FBK0lUOztBQXhKRCxNQUFBLE9BQUEsR0FBQSxrQkFBQSxDQUFBLFNBQUE7O0FBQUEsRUFBQSxPQUFBLENBQUEsS0FBQSxHQVdFLFNBQUEsS0FBQSxDQUFBLEtBQUEsRUFBQSxJQUFBLEVBQTBDO0FBQ3hDLFNBQUEsS0FBQSxHQUFBLEtBQUE7QUFDQSxTQUFBLElBQUEsR0FBQSxJQUFBO0FBQ0EsU0FBQSxNQUFBLEdBQUEsQ0FBQTtBQUVBLFNBQUEsV0FBQSxHQUFBLGdCQUFBO0FBQ0EsU0FBQSxNQUFBLEdBQUEsd0JBQUE7QUFDQSxTQUFBLFFBQUEsR0FBQSx3QkFBQTtBQWxCSixHQUFBOztBQUFBLEVBQUEsT0FBQSxDQUFBLEtBQUEsR0FxQkUsU0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxFQUFBLE9BQUEsRUFLa0I7QUFFaEIsU0FBQSxLQUFBLEdBQUEsS0FBQTtBQUNBLFNBQUEsSUFBQSxHQUFBLElBQUE7QUFDQSxTQUFBLE1BQUEsR0FBQSxNQUFBOztBQUVBLFFBQUksTUFBTSxLQUFWLENBQUEsRUFBa0I7QUFDaEIsV0FBQSxXQUFBLEdBQUEsZ0JBQUE7QUFDQSxXQUFBLE1BQUEsR0FBQSx3QkFBQTtBQUNBLFdBQUEsUUFBQSxHQUFBLHdCQUFBO0FBSEYsS0FBQSxNQUlPO0FBQ0wsV0FBQSxXQUFBLEdBQUEsSUFBQTs7QUFFQSxVQUFBLE9BQUEsRUFBYTtBQUNYLGFBQUEsTUFBQSxHQUFBLElBQUE7QUFDQSxhQUFBLFFBQUEsR0FBQSxLQUFBO0FBRkYsT0FBQSxNQUdPO0FBQ0wsYUFBQSxNQUFBLEdBQUEsS0FBQTtBQUNBLGFBQUEsUUFBQSxHQUFBLElBQUE7QUFDRDtBQUNGO0FBOUNMLEdBQUE7O0FBQUEsRUFBQSxPQUFBLENBQUEsR0FBQSxHQXFFRSxTQUFBLEdBQUEsQ0FBQSxJQUFBLEVBQWdCO0FBQ2QsV0FBTyxLQUFBLEtBQUEsQ0FBQSxPQUFBLENBQUEsSUFBQSxNQUE2QixDQUFwQyxDQUFBO0FBdEVKLEdBQUE7O0FBQUEsRUFBQSxPQUFBLENBQUEsR0FBQSxHQXlFRSxTQUFBLEdBQUEsQ0FBQSxJQUFBLEVBQUEsT0FBQSxFQUFpQztBQUFBLFFBQWYsT0FBZSxLQUFBLEtBQUEsQ0FBQSxFQUFBO0FBQWYsTUFBQSxPQUFlLEdBQTlCLEtBQWU7QUFBZTs7QUFBQSxRQUMzQixJQUQyQixHQUFBLEtBQUEsSUFBQTtBQUFBLFFBQ25CLEtBRG1CLEdBQUEsS0FBQSxLQUFBO0FBRy9CLFFBQUksS0FBSyxHQUFHLE9BQU8sR0FBRyxLQUFILE9BQUEsR0FBa0IsS0FBckMsS0FBQTtBQUVBLFFBQUksR0FBRyxHQUFHLEtBQUssQ0FBTCxPQUFBLENBQVYsSUFBVSxDQUFWOztBQUVBLFFBQUksR0FBRyxLQUFLLENBQVosQ0FBQSxFQUFnQjtBQUNkLGFBQUEsOEJBQUE7QUFDRDs7QUFFRCxRQUFJLEdBQUcsR0FBRyxLQUFLLENBQUwsR0FBQSxDQUFBLEdBQUEsRUFBVixJQUFVLENBQVY7O0FBRUEsUUFBQSxVQUFBLEVBQVc7QUFDVCxhQUFPLG9DQUFxQixPQUFPLEdBQUEsSUFBQSxHQUFBLE1BQVIsSUFBcEIsRUFBUCxHQUFPLENBQVA7QUFERixLQUFBLE1BRU87QUFDTCxhQUFBLEdBQUE7QUFDRDtBQTFGTCxHQUFBOztBQUFBLEVBQUEsT0FBQSxDQUFBLE9BQUEsR0E2RkUsU0FBQSxPQUFBLEdBQU87QUFBQSxRQUNELEtBREMsR0FBQSxLQUFBLEtBQUE7QUFBQSxRQUNRLFVBRFIsR0FBQSxLQUFBLFVBQUE7QUFFTCxRQUFJLEdBQUcsR0FBUCxpQkFBQTs7QUFFQSxTQUFLLElBQUksQ0FBQyxHQUFWLENBQUEsRUFBZ0IsQ0FBQyxHQUFHLEtBQUssQ0FBekIsTUFBQSxFQUFrQyxDQUFsQyxFQUFBLEVBQXVDO0FBQ3JDLFVBQUksSUFBSSxHQUFHLEtBQUssQ0FBaEIsQ0FBZ0IsQ0FBaEI7O0FBRUEsVUFBQSxVQUFBLEVBQVc7QUFDVCxRQUFBLEdBQUcsQ0FBSCxJQUFHLENBQUgsR0FBWSxvQ0FBb0IsTUFBQSxJQUFwQixFQUFpQyxVQUFVLENBQXZELENBQXVELENBQTNDLENBQVo7QUFERixPQUFBLE1BRU87QUFDTCxRQUFBLEdBQUcsQ0FBSCxJQUFHLENBQUgsR0FBWSxVQUFVLENBQXRCLENBQXNCLENBQXRCO0FBQ0Q7QUFDRjs7QUFFRCxXQUFBLEdBQUE7QUEzR0osR0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxLQUFBLEdBOEdFLFNBQUEsS0FBQSxDQUFBLEtBQUEsRUFBc0M7QUFDcEMsUUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFOLElBQUEsQ0FBWCxLQUFXLENBQVg7O0FBRUEsUUFBSSxJQUFJLENBQUosTUFBQSxHQUFKLENBQUEsRUFBcUI7QUFBQSxVQUNmLEtBRGUsR0FBQSxLQUFBLEtBQUE7QUFBQSxVQUNmLE1BRGUsR0FBQSxLQUFBLE1BQUE7QUFBQSxVQUNFLEtBREYsR0FBQSxLQUFBLEtBQUE7QUFFbkIsVUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFwQixLQUFlLEVBQWY7O0FBRUEsV0FBSyxJQUFJLENBQUMsR0FBVixDQUFBLEVBQWdCLENBQUMsR0FBRyxJQUFJLENBQXhCLE1BQUEsRUFBaUMsQ0FBakMsRUFBQSxFQUFzQztBQUNwQyxZQUFJLElBQUksR0FBRyxJQUFJLENBQWYsQ0FBZSxDQUFmO0FBQ0EsWUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFSLE9BQUEsQ0FBVixJQUFVLENBQVY7O0FBRUEsWUFBSSxHQUFHLEtBQUssQ0FBWixDQUFBLEVBQWdCO0FBQ2QsVUFBQSxNQUFNLEdBQUcsUUFBUSxDQUFSLElBQUEsQ0FBVCxJQUFTLENBQVQ7QUFDQSxVQUFBLEtBQUssQ0FBTCxJQUFBLENBQVcsS0FBSyxDQUFoQixJQUFnQixDQUFoQjtBQUNEO0FBQ0Y7O0FBRUQsV0FBQSxNQUFBLEdBQUEsTUFBQTtBQUNBLFdBQUEsV0FBQSxHQUFBLElBQUE7QUFDQSxXQUFBLE1BQUEsR0FBQSxRQUFBO0FBQ0EsV0FBQSxRQUFBLEdBQUEsSUFBQTtBQUNEO0FBbklMLEdBQUE7O0FBQUEsRUFBQSxPQUFBLENBQUEsZUFBQSxHQWlKVSxTQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQXdDO0FBQzlDLFdBQU8sSUFBSSxDQUFKLEtBQUEsQ0FBUCxDQUFPLENBQVA7QUFsSkosR0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxRQUFBLEdBcUpVLFNBQUEsUUFBQSxDQUFBLElBQUEsRUFBaUM7QUFDdkMsV0FBQSxNQUFBLElBQUE7QUF0SkosR0FBQTs7QUFBQSxFQUFBLFlBQUEsQ0FBQSxrQkFBQSxFQUFBLENBQUE7QUFBQSxJQUFBLEdBQUEsRUFBQSxPQUFBO0FBQUEsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLEdBaURXO0FBQ1AsVUFBSSxLQUFLLEdBQUcsS0FBWixNQUFBOztBQUVBLFVBQUksQ0FBSixLQUFBLEVBQVk7QUFDVixRQUFBLEtBQUssR0FBRyxLQUFBLE1BQUEsR0FBYyxLQUFBLFFBQUEsQ0FBQSxHQUFBLENBQW1CLEtBQXpDLGVBQXNCLENBQXRCO0FBQ0Q7O0FBRUQsYUFBQSxLQUFBO0FBQ0Q7QUF6REgsR0FBQSxFQUFBO0FBQUEsSUFBQSxHQUFBLEVBQUEsU0FBQTtBQUFBLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxHQTJEYTtBQUNULFVBQUksT0FBTyxHQUFHLEtBQWQsUUFBQTs7QUFFQSxVQUFJLENBQUosT0FBQSxFQUFjO0FBQ1osUUFBQSxPQUFPLEdBQUcsS0FBQSxRQUFBLEdBQWdCLEtBQUEsTUFBQSxDQUFBLEdBQUEsQ0FBaUIsS0FBM0MsUUFBMEIsQ0FBMUI7QUFDRDs7QUFFRCxhQUFBLE9BQUE7QUFDRDtBQW5FSCxHQUFBLEVBQUE7QUFBQSxJQUFBLEdBQUEsRUFBQSxZQUFBO0FBQUEsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLEdBc0l3QjtBQUNwQixVQUFJLFVBQVUsR0FBRyxLQUFqQixXQUFBOztBQUVBLFVBQUksQ0FBSixVQUFBLEVBQWlCO0FBQUEsWUFDWCxJQURXLEdBQUEsS0FBQSxJQUFBO0FBQUEsWUFDWCxNQURXLEdBQUEsS0FBQSxNQUFBO0FBQUEsWUFDSyxLQURMLEdBQUEsS0FBQSxLQUFBO0FBRWYsUUFBQSxVQUFVLEdBQUcsS0FBQSxXQUFBLEdBQW1CLEtBQUssQ0FBTCxLQUFBLENBQUEsSUFBQSxFQUE2QixJQUFJLEdBQWpFLE1BQWdDLENBQWhDO0FBQ0Q7O0FBRUQsYUFBQSxVQUFBO0FBQ0Q7QUEvSUgsR0FBQSxDQUFBLENBQUE7O0FBQUEsU0FBQSxrQkFBQTtBQUFBLENBQUEsRUFBQTs7OztBQTBKQSxTQUFBLFlBQUEsQ0FBQSxJQUFBLEVBQWtDO0FBQ2hDLFNBQUEsTUFBQSxJQUFBO0FBQ0Q7O0FBRUQsSUFBTSxrQkFBa0IsR0FBeEIsdUJBQUE7O0FBRUEsSUFBTSxrQkFBTixHQUFBLGFBQUEsWUFBQTtBQUFBLFdBQUEsa0JBQUEsR0FBQTtBQUVVLFNBQUEsY0FBQSxHQUFBLElBQUE7QUFDQSxTQUFBLFlBQUEsR0FBQSxJQUFBO0FBRUQsU0FBQSxXQUFBLEdBQUEsSUFBQTtBQUNBLFNBQUEsS0FBQSxHQUFBLHdCQUFBO0FBRUEsU0FBQSxNQUFBLEdBQUEsQ0FBQTtBQUNBLFNBQUEsSUFBQSxHQUFBLENBQUE7QUE0RVI7O0FBckZELE1BQUEsT0FBQSxHQUFBLGtCQUFBLENBQUEsU0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxLQUFBLEdBV0UsU0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUEsRUFBMEM7QUFDeEMsU0FBQSxLQUFBLEdBQUEsS0FBQTtBQUNBLFNBQUEsS0FBQSxHQUFBLHdCQUFBO0FBQ0EsU0FBQSxJQUFBLEdBQUEsSUFBQTtBQUNBLFNBQUEsTUFBQSxHQUFBLENBQUE7QUFDQSxTQUFBLFlBQUEsR0FBQSxJQUFBO0FBRUEsU0FBQSxXQUFBLEdBQUEsdUJBQUE7QUFDQSxTQUFBLGNBQUEsR0FBQSxrQkFBQTtBQW5CSixHQUFBOztBQUFBLEVBQUEsT0FBQSxDQUFBLEtBQUEsR0FzQkUsU0FBQSxLQUFBLENBQUEsS0FBQSxFQUFBLElBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxFQUFvRjtBQUNsRixTQUFBLEtBQUEsR0FBQSxLQUFBO0FBQ0EsU0FBQSxLQUFBLEdBQUEsS0FBQTtBQUNBLFNBQUEsSUFBQSxHQUFBLElBQUE7QUFDQSxTQUFBLE1BQUEsR0FBQSxNQUFBO0FBQ0EsU0FBQSxZQUFBLEdBQUEsSUFBQTs7QUFFQSxRQUFJLE1BQU0sS0FBVixDQUFBLEVBQWtCO0FBQ2hCLFdBQUEsV0FBQSxHQUFBLHVCQUFBO0FBQ0EsV0FBQSxjQUFBLEdBQUEsa0JBQUE7QUFGRixLQUFBLE1BR087QUFDTCxXQUFBLFdBQUEsR0FBQSxJQUFBO0FBQ0EsV0FBQSxjQUFBLEdBQUEsSUFBQTtBQUNEO0FBbkNMLEdBQUE7O0FBQUEsRUFBQSxPQUFBLENBQUEsR0FBQSxHQWlERSxTQUFBLEdBQUEsQ0FBQSxJQUFBLEVBQWdCO0FBQ2QsV0FBTyxLQUFBLEtBQUEsQ0FBQSxPQUFBLENBQUEsSUFBQSxNQUE4QixDQUFyQyxDQUFBO0FBbERKLEdBQUE7O0FBQUEsRUFBQSxPQUFBLENBQUEsR0FBQSxHQXFERSxTQUFBLEdBQUEsQ0FBQSxJQUFBLEVBQWdCO0FBQ2QsUUFBSSxHQUFHLEdBQUcsS0FBQSxLQUFBLENBQUEsT0FBQSxDQUFWLElBQVUsQ0FBVjs7QUFFQSxRQUFJLEdBQUcsS0FBSyxDQUFaLENBQUEsRUFBZ0I7QUFDZCxhQUFBLElBQUE7QUFDRDs7QUFMYSxRQU9WLElBUFUsR0FBQSxLQUFBLElBQUE7QUFBQSxRQU9GLEtBUEUsR0FBQSxLQUFBLEtBQUE7QUFTZCxRQUFJLEtBQUssR0FBUyxLQUFLLENBQUwsR0FBQSxDQUFVLEdBQUcsR0FBYixDQUFBLEVBQWxCLElBQWtCLENBQWxCO0FBQ0EsUUFBSSxLQUFLLEdBQVMsS0FBSyxDQUFMLEdBQUEsQ0FBVSxHQUFHLEdBQUgsQ0FBQSxHQUFWLENBQUEsRUFBbEIsSUFBa0IsQ0FBbEI7QUFDQSxRQUFJLE1BQU0sR0FDUixLQUFLLENBQUwsR0FBQSxDQUFVLEdBQUcsR0FBSCxDQUFBLEdBQVYsQ0FBQSxFQURGLElBQ0UsQ0FERjtBQUtBLFdBQU8sTUFBTSxLQUFOLElBQUEsR0FBQSxJQUFBLEdBQTBCLENBQUEsTUFBQSxFQUFBLEtBQUEsRUFBakMsS0FBaUMsQ0FBakM7QUFyRUosR0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxPQUFBLEdBd0VFLFNBQUEsT0FBQSxHQUFPO0FBQ0wsV0FBTyxJQUFBLDBCQUFBLENBQStCLEtBQS9CLEtBQUEsRUFBMkMsS0FBbEQsTUFBTyxDQUFQO0FBekVKLEdBQUE7O0FBQUEsRUFBQSxZQUFBLENBQUEsa0JBQUEsRUFBQSxDQUFBO0FBQUEsSUFBQSxHQUFBLEVBQUEsUUFBQTtBQUFBLElBQUEsR0FBQSxFQUFBLFNBQUEsR0FBQSxHQXNDWTtBQUNSLFVBQUksTUFBTSxHQUFHLEtBQWIsY0FBQTs7QUFFQSxVQUFJLENBQUosTUFBQSxFQUFhO0FBQUEsWUFDUCxJQURPLEdBQUEsS0FBQSxJQUFBO0FBQUEsWUFDUCxNQURPLEdBQUEsS0FBQSxNQUFBO0FBQUEsWUFDUyxLQURULEdBQUEsS0FBQSxLQUFBO0FBRVgsUUFBQSxNQUFNLEdBQUcsS0FBQSxjQUFBLEdBQXNCLEtBQUssQ0FBTCxLQUFBLENBQUEsSUFBQSxFQUE4QixJQUFJLEdBQUcsTUFBTSxHQUExRSxDQUErQixDQUEvQjtBQUNEOztBQUVELGFBQUEsTUFBQTtBQUNEO0FBL0NILEdBQUEsRUFBQTtBQUFBLElBQUEsR0FBQSxFQUFBLGFBQUE7QUFBQSxJQUFBLEdBQUEsRUFBQSxTQUFBLEdBQUEsR0E0RWlCO0FBQ2IsVUFBSSxXQUFXLEdBQUcsS0FBbEIsWUFBQTs7QUFFQSxVQUFJLFdBQVcsS0FBZixJQUFBLEVBQTBCO0FBQ3hCLFFBQUEsV0FBVyxHQUFHLEtBQUEsWUFBQSxHQUFvQixLQUFBLEtBQUEsQ0FBQSxHQUFBLENBQWxDLFlBQWtDLENBQWxDO0FBQ0Q7O0FBRUQsYUFBQSxXQUFBO0FBQ0Q7QUFwRkgsR0FBQSxDQUFBLENBQUE7O0FBQUEsU0FBQSxrQkFBQTtBQUFBLENBQUEsRUFBQTs7OztJQXVGQSwwQjtBQUdFLFdBQUEsMEJBQUEsQ0FBQSxLQUFBLEVBQUEsTUFBQSxFQUF5RjtBQUF0RSxTQUFBLEtBQUEsR0FBQSxLQUFBO0FBQWlDLFNBQUEsTUFBQSxHQUFBLE1BQUE7QUFDbEQsU0FBQSxNQUFBLEdBQWMsS0FBSyxDQUFuQixNQUFBO0FBQ0Q7Ozs7VUFFRCxHLEdBQUEsU0FBQSxHQUFBLENBQUEsSUFBQSxFQUFnQjtBQUNkLFdBQU8sS0FBQSxLQUFBLENBQUEsT0FBQSxDQUFBLElBQUEsTUFBNkIsQ0FBcEMsQ0FBQTs7O1VBR0YsRyxHQUFBLFNBQUEsR0FBQSxDQUFBLElBQUEsRUFBZ0I7QUFDZCxRQUFJLEdBQUcsR0FBRyxLQUFBLEtBQUEsQ0FBQSxPQUFBLENBQVYsSUFBVSxDQUFWO0FBRUEsUUFBSSxHQUFHLEtBQUssQ0FBWixDQUFBLEVBQWdCLE9BQUEsSUFBQTtBQUVoQixXQUFPLENBQ0wsS0FBQSxNQUFBLENBQVksR0FBRyxHQUFILENBQUEsR0FEUCxDQUNMLENBREssRUFFTCxLQUFBLE1BQUEsQ0FBWSxHQUFHLEdBQUgsQ0FBQSxHQUZQLENBRUwsQ0FGSyxFQUdMLEtBQUEsTUFBQSxDQUFZLEdBQUcsR0FIakIsQ0FHRSxDQUhLLENBQVA7Ozs7OztBQVFFLFNBQUEsa0JBQUEsQ0FBQSxLQUFBLEVBQUEsVUFBQSxFQUE0RTtBQUNoRixTQUFPO0FBQ0wsSUFBQSxLQURLLEVBQUEsS0FBQTtBQUVMLElBQUEsVUFBQSxFQUFBO0FBRkssR0FBUDtBQUlEOztBQUVLLFNBQUEsVUFBQSxDQUFBLEtBQUEsRUFBa0Q7QUFDdEQsTUFBSSxPQUFPLEdBQVgsaUJBQUE7O0FBRUEsT0FBSyxJQUFMLEdBQUEsSUFBQSxLQUFBLEVBQXVCO0FBQ3JCLElBQUEsT0FBTyxDQUFQLEdBQU8sQ0FBUCxHQUFlLDRCQUFZLEtBQUssQ0FBaEMsR0FBZ0MsQ0FBakIsQ0FBZjtBQUNEOztBQUVELFNBQUEsT0FBQTtBQUNEOztBQUVLLFNBQUEsZUFBQSxDQUFBLFVBQUEsRUFBaUU7QUFDckUsU0FBTyxVQUFVLENBQVYsR0FBQSxDQUFQLHNCQUFPLENBQVA7QUFDRDs7QUFFSyxTQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQTJDO0FBQy9DLFNBQU87QUFDTCxJQUFBLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQURqQixLQUNZLENBRFo7QUFFTCxJQUFBLFVBQVUsRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFMLFVBQUE7QUFGdEIsR0FBUDtBQUlEOztBQUVNLElBQU0sV0FBVyxHQUFHLE1BQU0sQ0FBTixNQUFBLENBQWMsTUFBTSxDQUFOLE1BQUEsQ0FBbEMsSUFBa0MsQ0FBZCxDQUFwQjs7QUFDQSxJQUFNLGdCQUFnQixHQUF0QixnQkFBQTs7QUFDQSxJQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQSxXQUFBLEVBQXJDLGdCQUFxQyxDQUFyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNoZWNrLCBDaGVja0Jsb2NrU3ltYm9sVGFibGUsIENoZWNrSGFuZGxlLCBDaGVja09wdGlvbiwgQ2hlY2tPciB9IGZyb20gJ0BnbGltbWVyL2RlYnVnJztcbmltcG9ydCB7IERFQlVHIH0gZnJvbSAnQGdsaW1tZXIvZW52JztcbmltcG9ydCB7XG4gIEJsb2NrQXJndW1lbnRzLFxuICBCbG9ja1N5bWJvbFRhYmxlLFxuICBCbG9ja1ZhbHVlLFxuICBDYXB0dXJlZEFyZ3VtZW50cyxcbiAgQ2FwdHVyZWRCbG9ja0FyZ3VtZW50cyxcbiAgQ2FwdHVyZWROYW1lZEFyZ3VtZW50cyxcbiAgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzLFxuICBDb21waWxhYmxlQmxvY2ssXG4gIERpY3QsXG4gIE5hbWVkQXJndW1lbnRzLFxuICBPcHRpb24sXG4gIFBvc2l0aW9uYWxBcmd1bWVudHMsXG4gIFNjb3BlLFxuICBTY29wZUJsb2NrLFxuICBWTUFyZ3VtZW50cyxcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBjcmVhdGVEZWJ1Z0FsaWFzUmVmLFxuICBSZWZlcmVuY2UsXG4gIFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gIHZhbHVlRm9yUmVmLFxufSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgZGljdCwgZW1wdHlBcnJheSwgRU1QVFlfU1RSSU5HX0FSUkFZIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBDT05TVEFOVF9UQUcsIFRhZyB9IGZyb20gJ0BnbGltbWVyL3ZhbGlkYXRvcic7XG5pbXBvcnQgeyAkc3AgfSBmcm9tICdAZ2xpbW1lci92bSc7XG5pbXBvcnQgeyBDaGVja0NvbXBpbGFibGVCbG9jaywgQ2hlY2tSZWZlcmVuY2UsIENoZWNrU2NvcGUgfSBmcm9tICcuLi9jb21waWxlZC9vcGNvZGVzLy1kZWJ1Zy1zdHJpcCc7XG5pbXBvcnQgeyBSRUdJU1RFUlMgfSBmcm9tICcuLi9zeW1ib2xzJztcbmltcG9ydCB7IEV2YWx1YXRpb25TdGFjayB9IGZyb20gJy4vc3RhY2snO1xuXG4vKlxuICBUaGUgY2FsbGluZyBjb252ZW50aW9uIGlzOlxuXG4gICogMC1OIGJsb2NrIGFyZ3VtZW50cyBhdCB0aGUgYm90dG9tXG4gICogMC1OIHBvc2l0aW9uYWwgYXJndW1lbnRzIG5leHQgKGxlZnQtdG8tcmlnaHQpXG4gICogMC1OIG5hbWVkIGFyZ3VtZW50cyBuZXh0XG4qL1xuXG5leHBvcnQgY2xhc3MgVk1Bcmd1bWVudHNJbXBsIGltcGxlbWVudHMgVk1Bcmd1bWVudHMge1xuICBwcml2YXRlIHN0YWNrOiBPcHRpb248RXZhbHVhdGlvblN0YWNrPiA9IG51bGw7XG4gIHB1YmxpYyBwb3NpdGlvbmFsID0gbmV3IFBvc2l0aW9uYWxBcmd1bWVudHNJbXBsKCk7XG4gIHB1YmxpYyBuYW1lZCA9IG5ldyBOYW1lZEFyZ3VtZW50c0ltcGwoKTtcbiAgcHVibGljIGJsb2NrcyA9IG5ldyBCbG9ja0FyZ3VtZW50c0ltcGwoKTtcblxuICBlbXB0eShzdGFjazogRXZhbHVhdGlvblN0YWNrKTogdGhpcyB7XG4gICAgbGV0IGJhc2UgPSBzdGFja1tSRUdJU1RFUlNdWyRzcF0gKyAxO1xuXG4gICAgdGhpcy5uYW1lZC5lbXB0eShzdGFjaywgYmFzZSk7XG4gICAgdGhpcy5wb3NpdGlvbmFsLmVtcHR5KHN0YWNrLCBiYXNlKTtcbiAgICB0aGlzLmJsb2Nrcy5lbXB0eShzdGFjaywgYmFzZSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldHVwKFxuICAgIHN0YWNrOiBFdmFsdWF0aW9uU3RhY2ssXG4gICAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIGJsb2NrTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHBvc2l0aW9uYWxDb3VudDogbnVtYmVyLFxuICAgIGF0TmFtZXM6IGJvb2xlYW5cbiAgKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuXG4gICAgLypcbiAgICAgICAgICAgfCAuLi4gfCBibG9ja3MgICAgICB8IHBvc2l0aW9uYWwgIHwgbmFtZWQgfFxuICAgICAgICAgICB8IC4uLiB8IGIwICAgIGIxICAgIHwgcDAgcDEgcDIgcDMgfCBuMCBuMSB8XG4gICAgIGluZGV4IHwgLi4uIHwgNC81LzYgNy84LzkgfCAxMCAxMSAxMiAxMyB8IDE0IDE1IHxcbiAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgIF4gICAgICAgICAgICAgXiAgXlxuICAgICAgICAgICAgICAgICBiYmFzZSAgICAgICAgIHBiYXNlICAgICAgIG5iYXNlICBzcFxuICAgICovXG5cbiAgICBsZXQgbmFtZWQgPSB0aGlzLm5hbWVkO1xuICAgIGxldCBuYW1lZENvdW50ID0gbmFtZXMubGVuZ3RoO1xuICAgIGxldCBuYW1lZEJhc2UgPSBzdGFja1tSRUdJU1RFUlNdWyRzcF0gLSBuYW1lZENvdW50ICsgMTtcblxuICAgIG5hbWVkLnNldHVwKHN0YWNrLCBuYW1lZEJhc2UsIG5hbWVkQ291bnQsIG5hbWVzLCBhdE5hbWVzKTtcblxuICAgIGxldCBwb3NpdGlvbmFsID0gdGhpcy5wb3NpdGlvbmFsO1xuICAgIGxldCBwb3NpdGlvbmFsQmFzZSA9IG5hbWVkQmFzZSAtIHBvc2l0aW9uYWxDb3VudDtcblxuICAgIHBvc2l0aW9uYWwuc2V0dXAoc3RhY2ssIHBvc2l0aW9uYWxCYXNlLCBwb3NpdGlvbmFsQ291bnQpO1xuXG4gICAgbGV0IGJsb2NrcyA9IHRoaXMuYmxvY2tzO1xuICAgIGxldCBibG9ja3NDb3VudCA9IGJsb2NrTmFtZXMubGVuZ3RoO1xuICAgIGxldCBibG9ja3NCYXNlID0gcG9zaXRpb25hbEJhc2UgLSBibG9ja3NDb3VudCAqIDM7XG5cbiAgICBibG9ja3Muc2V0dXAoc3RhY2ssIGJsb2Nrc0Jhc2UsIGJsb2Nrc0NvdW50LCBibG9ja05hbWVzKTtcbiAgfVxuXG4gIGdldCBiYXNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tzLmJhc2U7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25hbC5sZW5ndGggKyB0aGlzLm5hbWVkLmxlbmd0aCArIHRoaXMuYmxvY2tzLmxlbmd0aCAqIDM7XG4gIH1cblxuICBhdChwb3M6IG51bWJlcik6IFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb25hbC5hdChwb3MpO1xuICB9XG5cbiAgcmVhbGxvYyhvZmZzZXQ6IG51bWJlcikge1xuICAgIGxldCB7IHN0YWNrIH0gPSB0aGlzO1xuICAgIGlmIChvZmZzZXQgPiAwICYmIHN0YWNrICE9PSBudWxsKSB7XG4gICAgICBsZXQgeyBwb3NpdGlvbmFsLCBuYW1lZCB9ID0gdGhpcztcbiAgICAgIGxldCBuZXdCYXNlID0gcG9zaXRpb25hbC5iYXNlICsgb2Zmc2V0O1xuICAgICAgbGV0IGxlbmd0aCA9IHBvc2l0aW9uYWwubGVuZ3RoICsgbmFtZWQubGVuZ3RoO1xuXG4gICAgICBmb3IgKGxldCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgc3RhY2suY29weShpICsgcG9zaXRpb25hbC5iYXNlLCBpICsgbmV3QmFzZSk7XG4gICAgICB9XG5cbiAgICAgIHBvc2l0aW9uYWwuYmFzZSArPSBvZmZzZXQ7XG4gICAgICBuYW1lZC5iYXNlICs9IG9mZnNldDtcbiAgICAgIHN0YWNrW1JFR0lTVEVSU11bJHNwXSArPSBvZmZzZXQ7XG4gICAgfVxuICB9XG5cbiAgY2FwdHVyZSgpOiBDYXB0dXJlZEFyZ3VtZW50cyB7XG4gICAgbGV0IHBvc2l0aW9uYWwgPSB0aGlzLnBvc2l0aW9uYWwubGVuZ3RoID09PSAwID8gRU1QVFlfUE9TSVRJT05BTCA6IHRoaXMucG9zaXRpb25hbC5jYXB0dXJlKCk7XG4gICAgbGV0IG5hbWVkID0gdGhpcy5uYW1lZC5sZW5ndGggPT09IDAgPyBFTVBUWV9OQU1FRCA6IHRoaXMubmFtZWQuY2FwdHVyZSgpO1xuXG4gICAgcmV0dXJuIHsgbmFtZWQsIHBvc2l0aW9uYWwgfSBhcyBDYXB0dXJlZEFyZ3VtZW50cztcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGxldCB7IHN0YWNrLCBsZW5ndGggfSA9IHRoaXM7XG4gICAgaWYgKGxlbmd0aCA+IDAgJiYgc3RhY2sgIT09IG51bGwpIHN0YWNrLnBvcChsZW5ndGgpO1xuICB9XG59XG5cbmNvbnN0IEVNUFRZX1JFRkVSRU5DRVMgPSBlbXB0eUFycmF5PFJlZmVyZW5jZT4oKTtcblxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uYWxBcmd1bWVudHNJbXBsIGltcGxlbWVudHMgUG9zaXRpb25hbEFyZ3VtZW50cyB7XG4gIHB1YmxpYyBiYXNlID0gMDtcbiAgcHVibGljIGxlbmd0aCA9IDA7XG5cbiAgcHJpdmF0ZSBzdGFjazogRXZhbHVhdGlvblN0YWNrID0gbnVsbCBhcyBhbnk7XG5cbiAgcHJpdmF0ZSBfcmVmZXJlbmNlczogT3B0aW9uPHJlYWRvbmx5IFJlZmVyZW5jZVtdPiA9IG51bGw7XG5cbiAgZW1wdHkoc3RhY2s6IEV2YWx1YXRpb25TdGFjaywgYmFzZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgdGhpcy5fcmVmZXJlbmNlcyA9IEVNUFRZX1JFRkVSRU5DRVM7XG4gIH1cblxuICBzZXR1cChzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG5cbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gRU1QVFlfUkVGRVJFTkNFUztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXQocG9zaXRpb246IG51bWJlcik6IFJlZmVyZW5jZSB7XG4gICAgbGV0IHsgYmFzZSwgbGVuZ3RoLCBzdGFjayB9ID0gdGhpcztcblxuICAgIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hlY2soc3RhY2suZ2V0KHBvc2l0aW9uLCBiYXNlKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICB9XG5cbiAgY2FwdHVyZSgpOiBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMge1xuICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZXMgYXMgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzO1xuICB9XG5cbiAgcHJlcGVuZChvdGhlcjogUmVmZXJlbmNlW10pIHtcbiAgICBsZXQgYWRkaXRpb25zID0gb3RoZXIubGVuZ3RoO1xuXG4gICAgaWYgKGFkZGl0aW9ucyA+IDApIHtcbiAgICAgIGxldCB7IGJhc2UsIGxlbmd0aCwgc3RhY2sgfSA9IHRoaXM7XG5cbiAgICAgIHRoaXMuYmFzZSA9IGJhc2UgPSBiYXNlIC0gYWRkaXRpb25zO1xuICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGggKyBhZGRpdGlvbnM7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkaXRpb25zOyBpKyspIHtcbiAgICAgICAgc3RhY2suc2V0KG90aGVyW2ldLCBpLCBiYXNlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcmVmZXJlbmNlcygpOiByZWFkb25seSBSZWZlcmVuY2VbXSB7XG4gICAgbGV0IHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzO1xuXG4gICAgaWYgKCFyZWZlcmVuY2VzKSB7XG4gICAgICBsZXQgeyBzdGFjaywgYmFzZSwgbGVuZ3RoIH0gPSB0aGlzO1xuICAgICAgcmVmZXJlbmNlcyA9IHRoaXMuX3JlZmVyZW5jZXMgPSBzdGFjay5zbGljZTxSZWZlcmVuY2U+KGJhc2UsIGJhc2UgKyBsZW5ndGgpO1xuICAgIH1cblxuICAgIHJldHVybiByZWZlcmVuY2VzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOYW1lZEFyZ3VtZW50c0ltcGwgaW1wbGVtZW50cyBOYW1lZEFyZ3VtZW50cyB7XG4gIHB1YmxpYyBiYXNlID0gMDtcbiAgcHVibGljIGxlbmd0aCA9IDA7XG5cbiAgcHJpdmF0ZSBzdGFjayE6IEV2YWx1YXRpb25TdGFjaztcblxuICBwcml2YXRlIF9yZWZlcmVuY2VzOiBPcHRpb248cmVhZG9ubHkgUmVmZXJlbmNlW10+ID0gbnVsbDtcblxuICBwcml2YXRlIF9uYW1lczogT3B0aW9uPHJlYWRvbmx5IHN0cmluZ1tdPiA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgcHJpdmF0ZSBfYXROYW1lczogT3B0aW9uPHJlYWRvbmx5IHN0cmluZ1tdPiA9IEVNUFRZX1NUUklOR19BUlJBWTtcblxuICBlbXB0eShzdGFjazogRXZhbHVhdGlvblN0YWNrLCBiYXNlOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0YWNrID0gc3RhY2s7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICB0aGlzLl9yZWZlcmVuY2VzID0gRU1QVFlfUkVGRVJFTkNFUztcbiAgICB0aGlzLl9uYW1lcyA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgICB0aGlzLl9hdE5hbWVzID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICB9XG5cbiAgc2V0dXAoXG4gICAgc3RhY2s6IEV2YWx1YXRpb25TdGFjayxcbiAgICBiYXNlOiBudW1iZXIsXG4gICAgbGVuZ3RoOiBudW1iZXIsXG4gICAgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIGF0TmFtZXM6IGJvb2xlYW5cbiAgKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMuYmFzZSA9IGJhc2U7XG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG5cbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9yZWZlcmVuY2VzID0gRU1QVFlfUkVGRVJFTkNFUztcbiAgICAgIHRoaXMuX25hbWVzID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuICAgICAgdGhpcy5fYXROYW1lcyA9IEVNUFRZX1NUUklOR19BUlJBWTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVmZXJlbmNlcyA9IG51bGw7XG5cbiAgICAgIGlmIChhdE5hbWVzKSB7XG4gICAgICAgIHRoaXMuX25hbWVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYXROYW1lcyA9IG5hbWVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbmFtZXMgPSBuYW1lcztcbiAgICAgICAgdGhpcy5fYXROYW1lcyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IG5hbWVzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICBsZXQgbmFtZXMgPSB0aGlzLl9uYW1lcztcblxuICAgIGlmICghbmFtZXMpIHtcbiAgICAgIG5hbWVzID0gdGhpcy5fbmFtZXMgPSB0aGlzLl9hdE5hbWVzIS5tYXAodGhpcy50b1N5bnRoZXRpY05hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lcyE7XG4gIH1cblxuICBnZXQgYXROYW1lcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgbGV0IGF0TmFtZXMgPSB0aGlzLl9hdE5hbWVzO1xuXG4gICAgaWYgKCFhdE5hbWVzKSB7XG4gICAgICBhdE5hbWVzID0gdGhpcy5fYXROYW1lcyA9IHRoaXMuX25hbWVzIS5tYXAodGhpcy50b0F0TmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF0TmFtZXMhO1xuICB9XG5cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLmluZGV4T2YobmFtZSkgIT09IC0xO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZywgYXROYW1lcyA9IGZhbHNlKTogUmVmZXJlbmNlIHtcbiAgICBsZXQgeyBiYXNlLCBzdGFjayB9ID0gdGhpcztcblxuICAgIGxldCBuYW1lcyA9IGF0TmFtZXMgPyB0aGlzLmF0TmFtZXMgOiB0aGlzLm5hbWVzO1xuXG4gICAgbGV0IGlkeCA9IG5hbWVzLmluZGV4T2YobmFtZSk7XG5cbiAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgfVxuXG4gICAgbGV0IHJlZiA9IHN0YWNrLmdldDxSZWZlcmVuY2U+KGlkeCwgYmFzZSk7XG5cbiAgICBpZiAoREVCVUcpIHtcbiAgICAgIHJldHVybiBjcmVhdGVEZWJ1Z0FsaWFzUmVmIShhdE5hbWVzID8gbmFtZSA6IGBAJHtuYW1lfWAsIHJlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZWY7XG4gICAgfVxuICB9XG5cbiAgY2FwdHVyZSgpOiBDYXB0dXJlZE5hbWVkQXJndW1lbnRzIHtcbiAgICBsZXQgeyBuYW1lcywgcmVmZXJlbmNlcyB9ID0gdGhpcztcbiAgICBsZXQgbWFwID0gZGljdDxSZWZlcmVuY2U+KCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbmFtZSA9IG5hbWVzW2ldO1xuXG4gICAgICBpZiAoREVCVUcpIHtcbiAgICAgICAgbWFwW25hbWVdID0gY3JlYXRlRGVidWdBbGlhc1JlZiEoYEAke25hbWV9YCwgcmVmZXJlbmNlc1tpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBbbmFtZV0gPSByZWZlcmVuY2VzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXAgYXMgQ2FwdHVyZWROYW1lZEFyZ3VtZW50cztcbiAgfVxuXG4gIG1lcmdlKG90aGVyOiBSZWNvcmQ8c3RyaW5nLCBSZWZlcmVuY2U+KSB7XG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhvdGhlcik7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgeyBuYW1lcywgbGVuZ3RoLCBzdGFjayB9ID0gdGhpcztcbiAgICAgIGxldCBuZXdOYW1lcyA9IG5hbWVzLnNsaWNlKCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbmFtZSA9IGtleXNbaV07XG4gICAgICAgIGxldCBpZHggPSBuZXdOYW1lcy5pbmRleE9mKG5hbWUpO1xuXG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmV3TmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgICBzdGFjay5wdXNoKG90aGVyW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgIHRoaXMuX3JlZmVyZW5jZXMgPSBudWxsO1xuICAgICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcbiAgICAgIHRoaXMuX2F0TmFtZXMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHJlZmVyZW5jZXMoKTogcmVhZG9ubHkgUmVmZXJlbmNlW10ge1xuICAgIGxldCByZWZlcmVuY2VzID0gdGhpcy5fcmVmZXJlbmNlcztcblxuICAgIGlmICghcmVmZXJlbmNlcykge1xuICAgICAgbGV0IHsgYmFzZSwgbGVuZ3RoLCBzdGFjayB9ID0gdGhpcztcbiAgICAgIHJlZmVyZW5jZXMgPSB0aGlzLl9yZWZlcmVuY2VzID0gc3RhY2suc2xpY2U8UmVmZXJlbmNlPihiYXNlLCBiYXNlICsgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgfVxuXG4gIHByaXZhdGUgdG9TeW50aGV0aWNOYW1lKHRoaXM6IHZvaWQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUuc2xpY2UoMSk7XG4gIH1cblxuICBwcml2YXRlIHRvQXROYW1lKHRoaXM6IHZvaWQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBAJHtuYW1lfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9TeW1ib2xOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJiR7bmFtZX1gO1xufVxuXG5jb25zdCBFTVBUWV9CTE9DS19WQUxVRVMgPSBlbXB0eUFycmF5PEJsb2NrVmFsdWU+KCk7XG5cbmV4cG9ydCBjbGFzcyBCbG9ja0FyZ3VtZW50c0ltcGwgaW1wbGVtZW50cyBCbG9ja0FyZ3VtZW50cyB7XG4gIHByaXZhdGUgc3RhY2shOiBFdmFsdWF0aW9uU3RhY2s7XG4gIHByaXZhdGUgaW50ZXJuYWxWYWx1ZXM6IE9wdGlvbjxyZWFkb25seSBCbG9ja1ZhbHVlW10+ID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3ltYm9sTmFtZXM6IE9wdGlvbjxyZWFkb25seSBzdHJpbmdbXT4gPSBudWxsO1xuXG4gIHB1YmxpYyBpbnRlcm5hbFRhZzogT3B0aW9uPFRhZz4gPSBudWxsO1xuICBwdWJsaWMgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gRU1QVFlfU1RSSU5HX0FSUkFZO1xuXG4gIHB1YmxpYyBsZW5ndGggPSAwO1xuICBwdWJsaWMgYmFzZSA9IDA7XG5cbiAgZW1wdHkoc3RhY2s6IEV2YWx1YXRpb25TdGFjaywgYmFzZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMubmFtZXMgPSBFTVBUWV9TVFJJTkdfQVJSQVk7XG4gICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fc3ltYm9sTmFtZXMgPSBudWxsO1xuXG4gICAgdGhpcy5pbnRlcm5hbFRhZyA9IENPTlNUQU5UX1RBRztcbiAgICB0aGlzLmludGVybmFsVmFsdWVzID0gRU1QVFlfQkxPQ0tfVkFMVUVTO1xuICB9XG5cbiAgc2V0dXAoc3RhY2s6IEV2YWx1YXRpb25TdGFjaywgYmFzZTogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgIHRoaXMubmFtZXMgPSBuYW1lcztcbiAgICB0aGlzLmJhc2UgPSBiYXNlO1xuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIHRoaXMuX3N5bWJvbE5hbWVzID0gbnVsbDtcblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaW50ZXJuYWxUYWcgPSBDT05TVEFOVF9UQUc7XG4gICAgICB0aGlzLmludGVybmFsVmFsdWVzID0gRU1QVFlfQkxPQ0tfVkFMVUVTO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmludGVybmFsVGFnID0gbnVsbDtcbiAgICAgIHRoaXMuaW50ZXJuYWxWYWx1ZXMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZXMoKTogcmVhZG9ubHkgQmxvY2tWYWx1ZVtdIHtcbiAgICBsZXQgdmFsdWVzID0gdGhpcy5pbnRlcm5hbFZhbHVlcztcblxuICAgIGlmICghdmFsdWVzKSB7XG4gICAgICBsZXQgeyBiYXNlLCBsZW5ndGgsIHN0YWNrIH0gPSB0aGlzO1xuICAgICAgdmFsdWVzID0gdGhpcy5pbnRlcm5hbFZhbHVlcyA9IHN0YWNrLnNsaWNlPEJsb2NrVmFsdWU+KGJhc2UsIGJhc2UgKyBsZW5ndGggKiAzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5hbWVzIS5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcpOiBPcHRpb248U2NvcGVCbG9jaz4ge1xuICAgIGxldCBpZHggPSB0aGlzLm5hbWVzIS5pbmRleE9mKG5hbWUpO1xuXG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB7IGJhc2UsIHN0YWNrIH0gPSB0aGlzO1xuXG4gICAgbGV0IHRhYmxlID0gY2hlY2soc3RhY2suZ2V0KGlkeCAqIDMsIGJhc2UpLCBDaGVja09wdGlvbihDaGVja0Jsb2NrU3ltYm9sVGFibGUpKTtcbiAgICBsZXQgc2NvcGUgPSBjaGVjayhzdGFjay5nZXQoaWR4ICogMyArIDEsIGJhc2UpLCBDaGVja09wdGlvbihDaGVja1Njb3BlKSk7XG4gICAgbGV0IGhhbmRsZSA9IGNoZWNrKFxuICAgICAgc3RhY2suZ2V0KGlkeCAqIDMgKyAyLCBiYXNlKSxcbiAgICAgIENoZWNrT3B0aW9uKENoZWNrT3IoQ2hlY2tIYW5kbGUsIENoZWNrQ29tcGlsYWJsZUJsb2NrKSlcbiAgICApO1xuXG4gICAgcmV0dXJuIGhhbmRsZSA9PT0gbnVsbCA/IG51bGwgOiAoW2hhbmRsZSwgc2NvcGUhLCB0YWJsZSFdIGFzIFNjb3BlQmxvY2spO1xuICB9XG5cbiAgY2FwdHVyZSgpOiBDYXB0dXJlZEJsb2NrQXJndW1lbnRzIHtcbiAgICByZXR1cm4gbmV3IENhcHR1cmVkQmxvY2tBcmd1bWVudHNJbXBsKHRoaXMubmFtZXMsIHRoaXMudmFsdWVzKTtcbiAgfVxuXG4gIGdldCBzeW1ib2xOYW1lcygpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgbGV0IHN5bWJvbE5hbWVzID0gdGhpcy5fc3ltYm9sTmFtZXM7XG5cbiAgICBpZiAoc3ltYm9sTmFtZXMgPT09IG51bGwpIHtcbiAgICAgIHN5bWJvbE5hbWVzID0gdGhpcy5fc3ltYm9sTmFtZXMgPSB0aGlzLm5hbWVzLm1hcCh0b1N5bWJvbE5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBzeW1ib2xOYW1lcztcbiAgfVxufVxuXG5jbGFzcyBDYXB0dXJlZEJsb2NrQXJndW1lbnRzSW1wbCBpbXBsZW1lbnRzIENhcHR1cmVkQmxvY2tBcmd1bWVudHMge1xuICBwdWJsaWMgbGVuZ3RoOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSwgcHVibGljIHZhbHVlczogcmVhZG9ubHkgT3B0aW9uPEJsb2NrVmFsdWU+W10pIHtcbiAgICB0aGlzLmxlbmd0aCA9IG5hbWVzLmxlbmd0aDtcbiAgfVxuXG4gIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcpOiBPcHRpb248U2NvcGVCbG9jaz4ge1xuICAgIGxldCBpZHggPSB0aGlzLm5hbWVzLmluZGV4T2YobmFtZSk7XG5cbiAgICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy52YWx1ZXNbaWR4ICogMyArIDJdIGFzIENvbXBpbGFibGVCbG9jayxcbiAgICAgIHRoaXMudmFsdWVzW2lkeCAqIDMgKyAxXSBhcyBTY29wZSxcbiAgICAgIHRoaXMudmFsdWVzW2lkeCAqIDNdIGFzIEJsb2NrU3ltYm9sVGFibGUsXG4gICAgXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRBcmdzKG5hbWVkOiBEaWN0PFJlZmVyZW5jZT4sIHBvc2l0aW9uYWw6IFJlZmVyZW5jZVtdKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZWQsXG4gICAgcG9zaXRpb25hbCxcbiAgfSBhcyBDYXB0dXJlZEFyZ3VtZW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlaWZ5TmFtZWQobmFtZWQ6IENhcHR1cmVkTmFtZWRBcmd1bWVudHMpIHtcbiAgbGV0IHJlaWZpZWQgPSBkaWN0KCk7XG5cbiAgZm9yIChsZXQga2V5IGluIG5hbWVkKSB7XG4gICAgcmVpZmllZFtrZXldID0gdmFsdWVGb3JSZWYobmFtZWRba2V5XSk7XG4gIH1cblxuICByZXR1cm4gcmVpZmllZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlaWZ5UG9zaXRpb25hbChwb3NpdGlvbmFsOiBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMpIHtcbiAgcmV0dXJuIHBvc2l0aW9uYWwubWFwKHZhbHVlRm9yUmVmKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlaWZ5QXJncyhhcmdzOiBDYXB0dXJlZEFyZ3VtZW50cykge1xuICByZXR1cm4ge1xuICAgIG5hbWVkOiByZWlmeU5hbWVkKGFyZ3MubmFtZWQpLFxuICAgIHBvc2l0aW9uYWw6IHJlaWZ5UG9zaXRpb25hbChhcmdzLnBvc2l0aW9uYWwpLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgRU1QVFlfTkFNRUQgPSBPYmplY3QuZnJlZXplKE9iamVjdC5jcmVhdGUobnVsbCkpIGFzIENhcHR1cmVkTmFtZWRBcmd1bWVudHM7XG5leHBvcnQgY29uc3QgRU1QVFlfUE9TSVRJT05BTCA9IEVNUFRZX1JFRkVSRU5DRVMgYXMgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSR1MgPSBjcmVhdGVDYXB0dXJlZEFyZ3MoRU1QVFlfTkFNRUQsIEVNUFRZX1BPU0lUSU9OQUwpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==