@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
587 lines (455 loc) • 52.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.clientBuilder = clientBuilder;
exports.LiveBlockList = exports.UpdatableBlockImpl = exports.RemoteLiveBlock = exports.SimpleLiveBlock = exports.NewElementBuilder = exports.CURSOR_STACK = exports.Fragment = void 0;
var _util = require("@glimmer/util");
var _bounds2 = require("../bounds");
var _destroyable = require("@glimmer/destroyable");
var _dynamic = require("./attributes/dynamic");
function _assertThisInitialized(self) {
if (self === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
subClass.__proto__ = superClass;
}
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;
}
var _a;
var First = /*#__PURE__*/function () {
function First(node) {
this.node = node;
}
var _proto = First.prototype;
_proto.firstNode = function firstNode() {
return this.node;
};
return First;
}();
var Last = /*#__PURE__*/function () {
function Last(node) {
this.node = node;
}
var _proto2 = Last.prototype;
_proto2.lastNode = function lastNode() {
return this.node;
};
return Last;
}();
var Fragment = /*#__PURE__*/function () {
function Fragment(bounds) {
this.bounds = bounds;
}
var _proto3 = Fragment.prototype;
_proto3.parentElement = function parentElement() {
return this.bounds.parentElement();
};
_proto3.firstNode = function firstNode() {
return this.bounds.firstNode();
};
_proto3.lastNode = function lastNode() {
return this.bounds.lastNode();
};
return Fragment;
}();
exports.Fragment = Fragment;
var CURSOR_STACK = (0, _util.symbol)('CURSOR_STACK');
exports.CURSOR_STACK = CURSOR_STACK;
var NewElementBuilder = /*#__PURE__*/function () {
function NewElementBuilder(env, parentNode, nextSibling) {
this.constructing = null;
this.operations = null;
this[_a] = new _util.Stack();
this.modifierStack = new _util.Stack();
this.blockStack = new _util.Stack();
this.pushElement(parentNode, nextSibling);
this.env = env;
this.dom = env.getAppendOperations();
this.updateOperations = env.getDOM();
}
NewElementBuilder.forInitialRender = function forInitialRender(env, cursor) {
return new this(env, cursor.element, cursor.nextSibling).initialize();
};
NewElementBuilder.resume = function resume(env, block) {
var parentNode = block.parentElement();
var nextSibling = block.reset(env);
var stack = new this(env, parentNode, nextSibling).initialize();
stack.pushLiveBlock(block);
return stack;
};
var _proto4 = NewElementBuilder.prototype;
_proto4.initialize = function initialize() {
this.pushSimpleBlock();
return this;
};
_proto4.debugBlocks = function debugBlocks() {
return this.blockStack.toArray();
};
_proto4.block = function block() {
return this.blockStack.current;
};
_proto4.popElement = function popElement() {
this[CURSOR_STACK].pop();
this[CURSOR_STACK].current;
};
_proto4.pushSimpleBlock = function pushSimpleBlock() {
return this.pushLiveBlock(new SimpleLiveBlock(this.element));
};
_proto4.pushUpdatableBlock = function pushUpdatableBlock() {
return this.pushLiveBlock(new UpdatableBlockImpl(this.element));
};
_proto4.pushBlockList = function pushBlockList(list) {
return this.pushLiveBlock(new LiveBlockList(this.element, list));
};
_proto4.pushLiveBlock = function pushLiveBlock(block, isRemote) {
if (isRemote === void 0) {
isRemote = false;
}
var current = this.blockStack.current;
if (current !== null) {
if (!isRemote) {
current.didAppendBounds(block);
}
}
this.__openBlock();
this.blockStack.push(block);
return block;
};
_proto4.popBlock = function popBlock() {
this.block().finalize(this);
this.__closeBlock();
return this.blockStack.pop();
};
_proto4.__openBlock = function __openBlock() {};
_proto4.__closeBlock = function __closeBlock() {} // todo return seems unused
;
_proto4.openElement = function openElement(tag) {
var element = this.__openElement(tag);
this.constructing = element;
return element;
};
_proto4.__openElement = function __openElement(tag) {
return this.dom.createElement(tag, this.element);
};
_proto4.flushElement = function flushElement(modifiers) {
var parent = this.element;
var element = this.constructing;
this.__flushElement(parent, element);
this.constructing = null;
this.operations = null;
this.pushModifiers(modifiers);
this.pushElement(element, null);
this.didOpenElement(element);
};
_proto4.__flushElement = function __flushElement(parent, constructing) {
this.dom.insertBefore(parent, constructing, this.nextSibling);
};
_proto4.closeElement = function closeElement() {
this.willCloseElement();
this.popElement();
return this.popModifiers();
};
_proto4.pushRemoteElement = function pushRemoteElement(element, guid, insertBefore) {
return this.__pushRemoteElement(element, guid, insertBefore);
};
_proto4.__pushRemoteElement = function __pushRemoteElement(element, _guid, insertBefore) {
this.pushElement(element, insertBefore);
if (insertBefore === undefined) {
while (element.lastChild) {
element.removeChild(element.lastChild);
}
}
var block = new RemoteLiveBlock(element);
return this.pushLiveBlock(block, true);
};
_proto4.popRemoteElement = function popRemoteElement() {
this.popBlock();
this.popElement();
};
_proto4.pushElement = function pushElement(element, nextSibling) {
if (nextSibling === void 0) {
nextSibling = null;
}
this[CURSOR_STACK].push(new _bounds2.CursorImpl(element, nextSibling));
};
_proto4.pushModifiers = function pushModifiers(modifiers) {
this.modifierStack.push(modifiers);
};
_proto4.popModifiers = function popModifiers() {
return this.modifierStack.pop();
};
_proto4.didAppendBounds = function didAppendBounds(bounds) {
this.block().didAppendBounds(bounds);
return bounds;
};
_proto4.didAppendNode = function didAppendNode(node) {
this.block().didAppendNode(node);
return node;
};
_proto4.didOpenElement = function didOpenElement(element) {
this.block().openElement(element);
return element;
};
_proto4.willCloseElement = function willCloseElement() {
this.block().closeElement();
};
_proto4.appendText = function appendText(string) {
return this.didAppendNode(this.__appendText(string));
};
_proto4.__appendText = function __appendText(text) {
var dom = this.dom,
element = this.element,
nextSibling = this.nextSibling;
var node = dom.createTextNode(text);
dom.insertBefore(element, node, nextSibling);
return node;
};
_proto4.__appendNode = function __appendNode(node) {
this.dom.insertBefore(this.element, node, this.nextSibling);
return node;
};
_proto4.__appendFragment = function __appendFragment(fragment) {
var first = fragment.firstChild;
if (first) {
var ret = new _bounds2.ConcreteBounds(this.element, first, fragment.lastChild);
this.dom.insertBefore(this.element, fragment, this.nextSibling);
return ret;
} else {
return new _bounds2.SingleNodeBounds(this.element, this.__appendComment(''));
}
};
_proto4.__appendHTML = function __appendHTML(html) {
return this.dom.insertHTMLBefore(this.element, this.nextSibling, html);
};
_proto4.appendDynamicHTML = function appendDynamicHTML(value) {
var bounds = this.trustedContent(value);
this.didAppendBounds(bounds);
};
_proto4.appendDynamicText = function appendDynamicText(value) {
var node = this.untrustedContent(value);
this.didAppendNode(node);
return node;
};
_proto4.appendDynamicFragment = function appendDynamicFragment(value) {
var bounds = this.__appendFragment(value);
this.didAppendBounds(bounds);
};
_proto4.appendDynamicNode = function appendDynamicNode(value) {
var node = this.__appendNode(value);
var bounds = new _bounds2.SingleNodeBounds(this.element, node);
this.didAppendBounds(bounds);
};
_proto4.trustedContent = function trustedContent(value) {
return this.__appendHTML(value);
};
_proto4.untrustedContent = function untrustedContent(value) {
return this.__appendText(value);
};
_proto4.appendComment = function appendComment(string) {
return this.didAppendNode(this.__appendComment(string));
};
_proto4.__appendComment = function __appendComment(string) {
var dom = this.dom,
element = this.element,
nextSibling = this.nextSibling;
var node = dom.createComment(string);
dom.insertBefore(element, node, nextSibling);
return node;
};
_proto4.__setAttribute = function __setAttribute(name, value, namespace) {
this.dom.setAttribute(this.constructing, name, value, namespace);
};
_proto4.__setProperty = function __setProperty(name, value) {
this.constructing[name] = value;
};
_proto4.setStaticAttribute = function setStaticAttribute(name, value, namespace) {
this.__setAttribute(name, value, namespace);
};
_proto4.setDynamicAttribute = function setDynamicAttribute(name, value, trusting, namespace) {
var element = this.constructing;
var attribute = (0, _dynamic.dynamicAttribute)(element, name, namespace, trusting);
attribute.set(this, value, this.env);
return attribute;
};
_createClass(NewElementBuilder, [{
key: "element",
get: function get() {
return this[CURSOR_STACK].current.element;
}
}, {
key: "nextSibling",
get: function get() {
return this[CURSOR_STACK].current.nextSibling;
}
}, {
key: "hasBlocks",
get: function get() {
return this.blockStack.size > 0;
}
}]);
return NewElementBuilder;
}();
exports.NewElementBuilder = NewElementBuilder;
_a = CURSOR_STACK;
var SimpleLiveBlock = /*#__PURE__*/function () {
function SimpleLiveBlock(parent) {
this.parent = parent;
this.first = null;
this.last = null;
this.nesting = 0;
}
var _proto5 = SimpleLiveBlock.prototype;
_proto5.parentElement = function parentElement() {
return this.parent;
};
_proto5.firstNode = function firstNode() {
var first = this.first;
return first.firstNode();
};
_proto5.lastNode = function lastNode() {
var last = this.last;
return last.lastNode();
};
_proto5.openElement = function openElement(element) {
this.didAppendNode(element);
this.nesting++;
};
_proto5.closeElement = function closeElement() {
this.nesting--;
};
_proto5.didAppendNode = function didAppendNode(node) {
if (this.nesting !== 0) return;
if (!this.first) {
this.first = new First(node);
}
this.last = new Last(node);
};
_proto5.didAppendBounds = function didAppendBounds(bounds) {
if (this.nesting !== 0) return;
if (!this.first) {
this.first = bounds;
}
this.last = bounds;
};
_proto5.finalize = function finalize(stack) {
if (this.first === null) {
stack.appendComment('');
}
};
return SimpleLiveBlock;
}();
exports.SimpleLiveBlock = SimpleLiveBlock;
var RemoteLiveBlock = /*#__PURE__*/function (_SimpleLiveBlock) {
_inheritsLoose(RemoteLiveBlock, _SimpleLiveBlock);
function RemoteLiveBlock(parent) {
var _this;
_this = _SimpleLiveBlock.call(this, parent) || this;
(0, _destroyable.registerDestructor)(_assertThisInitialized(_this), function () {
// In general, you only need to clear the root of a hierarchy, and should never
// need to clear any child nodes. This is an important constraint that gives us
// a strong guarantee that clearing a subtree is a single DOM operation.
//
// Because remote blocks are not normally physically nested inside of the tree
// that they are logically nested inside, we manually clear remote blocks when
// a logical parent is cleared.
//
// HOWEVER, it is currently possible for a remote block to be physically nested
// inside of the block it is logically contained inside of. This happens when
// the remote block is appended to the end of the application's entire element.
//
// The problem with that scenario is that Glimmer believes that it owns more of
// the DOM than it actually does. The code is attempting to write past the end
// of the Glimmer-managed root, but Glimmer isn't aware of that.
//
// The correct solution to that problem is for Glimmer to be aware of the end
// of the bounds that it owns, and once we make that change, this check could
// be removed.
//
// For now, a more targeted fix is to check whether the node was already removed
// and avoid clearing the node if it was. In most cases this shouldn't happen,
// so this might hide bugs where the code clears nested nodes unnecessarily,
// so we should eventually try to do the correct fix.
if (_this.parentElement() === _this.firstNode().parentNode) {
(0, _bounds2.clear)(_assertThisInitialized(_this));
}
});
return _this;
}
return RemoteLiveBlock;
}(SimpleLiveBlock);
exports.RemoteLiveBlock = RemoteLiveBlock;
var UpdatableBlockImpl = /*#__PURE__*/function (_SimpleLiveBlock2) {
_inheritsLoose(UpdatableBlockImpl, _SimpleLiveBlock2);
function UpdatableBlockImpl() {
return _SimpleLiveBlock2.apply(this, arguments) || this;
}
var _proto6 = UpdatableBlockImpl.prototype;
_proto6.reset = function reset() {
(0, _destroyable.destroy)(this);
var nextSibling = (0, _bounds2.clear)(this);
this.first = null;
this.last = null;
this.nesting = 0;
return nextSibling;
};
return UpdatableBlockImpl;
}(SimpleLiveBlock); // FIXME: All the noops in here indicate a modelling problem
exports.UpdatableBlockImpl = UpdatableBlockImpl;
var LiveBlockList = /*#__PURE__*/function () {
function LiveBlockList(parent, boundList) {
this.parent = parent;
this.boundList = boundList;
this.parent = parent;
this.boundList = boundList;
}
var _proto7 = LiveBlockList.prototype;
_proto7.parentElement = function parentElement() {
return this.parent;
};
_proto7.firstNode = function firstNode() {
var head = this.boundList[0];
return head.firstNode();
};
_proto7.lastNode = function lastNode() {
var boundList = this.boundList;
var tail = boundList[boundList.length - 1];
return tail.lastNode();
};
_proto7.openElement = function openElement(_element) {
false && (0, _util.assert)(false, 'Cannot openElement directly inside a block list');
};
_proto7.closeElement = function closeElement() {
false && (0, _util.assert)(false, 'Cannot closeElement directly inside a block list');
};
_proto7.didAppendNode = function didAppendNode(_node) {
false && (0, _util.assert)(false, 'Cannot create a new node directly inside a block list');
};
_proto7.didAppendBounds = function didAppendBounds(_bounds) {};
_proto7.finalize = function finalize(_stack) {
false && (0, _util.assert)(this.boundList.length > 0, 'boundsList cannot be empty');
};
return LiveBlockList;
}();
exports.LiveBlockList = LiveBlockList;
function clientBuilder(env, cursor) {
return NewElementBuilder.forInitialRender(env, cursor);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3ZtL2VsZW1lbnQtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQWVBOztBQVNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBVUEsSztBQUNFLFdBQUEsS0FBQSxDQUFBLElBQUEsRUFBb0M7QUFBaEIsU0FBQSxJQUFBLEdBQUEsSUFBQTtBQUFvQjs7OztTQUV4QyxTLEdBQUEsU0FBQSxTQUFBLEdBQVM7QUFDUCxXQUFPLEtBQVAsSUFBQTs7Ozs7O0lBSUosSTtBQUNFLFdBQUEsSUFBQSxDQUFBLElBQUEsRUFBb0M7QUFBaEIsU0FBQSxJQUFBLEdBQUEsSUFBQTtBQUFvQjs7OztVQUV4QyxRLEdBQUEsU0FBQSxRQUFBLEdBQVE7QUFDTixXQUFPLEtBQVAsSUFBQTs7Ozs7O0FBSUosSUFBTSxRQUFOLEdBQUEsYUFBQSxZQUFBO0FBR0UsV0FBQSxRQUFBLENBQUEsTUFBQSxFQUEwQjtBQUN4QixTQUFBLE1BQUEsR0FBQSxNQUFBO0FBQ0Q7O0FBTEgsTUFBQSxPQUFBLEdBQUEsUUFBQSxDQUFBLFNBQUE7O0FBQUEsRUFBQSxPQUFBLENBQUEsYUFBQSxHQU9FLFNBQUEsYUFBQSxHQUFhO0FBQ1gsV0FBTyxLQUFBLE1BQUEsQ0FBUCxhQUFPLEVBQVA7QUFSSixHQUFBOztBQUFBLEVBQUEsT0FBQSxDQUFBLFNBQUEsR0FXRSxTQUFBLFNBQUEsR0FBUztBQUNQLFdBQU8sS0FBQSxNQUFBLENBQVAsU0FBTyxFQUFQO0FBWkosR0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxRQUFBLEdBZUUsU0FBQSxRQUFBLEdBQVE7QUFDTixXQUFPLEtBQUEsTUFBQSxDQUFQLFFBQU8sRUFBUDtBQWhCSixHQUFBOztBQUFBLFNBQUEsUUFBQTtBQUFBLENBQUEsRUFBQTs7O0FBb0JPLElBQU0sWUFBWSxHQUFzQixrQkFBeEMsY0FB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QixnQkFBQSxDQUFBLEdBQUEsRUFBUCxNQUFPLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJvdW5kcyxcbiAgQ3Vyc29yLFxuICBDdXJzb3JTdGFja1N5bWJvbCxcbiAgRWxlbWVudEJ1aWxkZXIsXG4gIEVsZW1lbnRPcGVyYXRpb25zLFxuICBFbnZpcm9ubWVudCxcbiAgR2xpbW1lclRyZWVDaGFuZ2VzLFxuICBHbGltbWVyVHJlZUNvbnN0cnVjdGlvbixcbiAgTGl2ZUJsb2NrLFxuICBNYXliZSxcbiAgT3B0aW9uLFxuICBVcGRhdGFibGVCbG9jayxcbiAgTW9kaWZpZXJJbnN0YW5jZSxcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnQsIGV4cGVjdCwgU3RhY2ssIHN5bWJvbCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHtcbiAgQXR0ck5hbWVzcGFjZSxcbiAgU2ltcGxlQ29tbWVudCxcbiAgU2ltcGxlRG9jdW1lbnRGcmFnbWVudCxcbiAgU2ltcGxlRWxlbWVudCxcbiAgU2ltcGxlTm9kZSxcbiAgU2ltcGxlVGV4dCxcbn0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcbmltcG9ydCB7IGNsZWFyLCBDb25jcmV0ZUJvdW5kcywgQ3Vyc29ySW1wbCwgU2luZ2xlTm9kZUJvdW5kcyB9IGZyb20gJy4uL2JvdW5kcyc7XG5pbXBvcnQgeyBkZXN0cm95LCByZWdpc3RlckRlc3RydWN0b3IgfSBmcm9tICdAZ2xpbW1lci9kZXN0cm95YWJsZSc7XG5pbXBvcnQgeyBEeW5hbWljQXR0cmlidXRlLCBkeW5hbWljQXR0cmlidXRlIH0gZnJvbSAnLi9hdHRyaWJ1dGVzL2R5bmFtaWMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpcnN0Tm9kZSB7XG4gIGZpcnN0Tm9kZSgpOiBTaW1wbGVOb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhc3ROb2RlIHtcbiAgbGFzdE5vZGUoKTogU2ltcGxlTm9kZTtcbn1cblxuY2xhc3MgRmlyc3Qge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vZGU6IFNpbXBsZU5vZGUpIHt9XG5cbiAgZmlyc3ROb2RlKCk6IFNpbXBsZU5vZGUge1xuICAgIHJldHVybiB0aGlzLm5vZGU7XG4gIH1cbn1cblxuY2xhc3MgTGFzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbm9kZTogU2ltcGxlTm9kZSkge31cblxuICBsYXN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGcmFnbWVudCBpbXBsZW1lbnRzIEJvdW5kcyB7XG4gIHByaXZhdGUgYm91bmRzOiBCb3VuZHM7XG5cbiAgY29uc3RydWN0b3IoYm91bmRzOiBCb3VuZHMpIHtcbiAgICB0aGlzLmJvdW5kcyA9IGJvdW5kcztcbiAgfVxuXG4gIHBhcmVudEVsZW1lbnQoKTogU2ltcGxlRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuYm91bmRzLnBhcmVudEVsZW1lbnQoKTtcbiAgfVxuXG4gIGZpcnN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5ib3VuZHMuZmlyc3ROb2RlKCk7XG4gIH1cblxuICBsYXN0Tm9kZSgpOiBTaW1wbGVOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5ib3VuZHMubGFzdE5vZGUoKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgQ1VSU09SX1NUQUNLOiBDdXJzb3JTdGFja1N5bWJvbCA9IHN5bWJvbCgnQ1VSU09SX1NUQUNLJyk7XG5cbmV4cG9ydCBjbGFzcyBOZXdFbGVtZW50QnVpbGRlciBpbXBsZW1lbnRzIEVsZW1lbnRCdWlsZGVyIHtcbiAgcHVibGljIGRvbTogR2xpbW1lclRyZWVDb25zdHJ1Y3Rpb247XG4gIHB1YmxpYyB1cGRhdGVPcGVyYXRpb25zOiBHbGltbWVyVHJlZUNoYW5nZXM7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rpbmc6IE9wdGlvbjxTaW1wbGVFbGVtZW50PiA9IG51bGw7XG4gIHB1YmxpYyBvcGVyYXRpb25zOiBPcHRpb248RWxlbWVudE9wZXJhdGlvbnM+ID0gbnVsbDtcbiAgcHJpdmF0ZSBlbnY6IEVudmlyb25tZW50O1xuXG4gIFtDVVJTT1JfU1RBQ0tdID0gbmV3IFN0YWNrPEN1cnNvcj4oKTtcbiAgcHJpdmF0ZSBtb2RpZmllclN0YWNrID0gbmV3IFN0YWNrPE9wdGlvbjxNb2RpZmllckluc3RhbmNlW10+PigpO1xuICBwcml2YXRlIGJsb2NrU3RhY2sgPSBuZXcgU3RhY2s8TGl2ZUJsb2NrPigpO1xuXG4gIHN0YXRpYyBmb3JJbml0aWFsUmVuZGVyKGVudjogRW52aXJvbm1lbnQsIGN1cnNvcjogQ3Vyc29ySW1wbCkge1xuICAgIHJldHVybiBuZXcgdGhpcyhlbnYsIGN1cnNvci5lbGVtZW50LCBjdXJzb3IubmV4dFNpYmxpbmcpLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIHN0YXRpYyByZXN1bWUoZW52OiBFbnZpcm9ubWVudCwgYmxvY2s6IFVwZGF0YWJsZUJsb2NrKTogTmV3RWxlbWVudEJ1aWxkZXIge1xuICAgIGxldCBwYXJlbnROb2RlID0gYmxvY2sucGFyZW50RWxlbWVudCgpO1xuICAgIGxldCBuZXh0U2libGluZyA9IGJsb2NrLnJlc2V0KGVudik7XG5cbiAgICBsZXQgc3RhY2sgPSBuZXcgdGhpcyhlbnYsIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nKS5pbml0aWFsaXplKCk7XG4gICAgc3RhY2sucHVzaExpdmVCbG9jayhibG9jayk7XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihlbnY6IEVudmlyb25tZW50LCBwYXJlbnROb2RlOiBTaW1wbGVFbGVtZW50LCBuZXh0U2libGluZzogT3B0aW9uPFNpbXBsZU5vZGU+KSB7XG4gICAgdGhpcy5wdXNoRWxlbWVudChwYXJlbnROb2RlLCBuZXh0U2libGluZyk7XG5cbiAgICB0aGlzLmVudiA9IGVudjtcbiAgICB0aGlzLmRvbSA9IGVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVPcGVyYXRpb25zID0gZW52LmdldERPTSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpemUoKTogdGhpcyB7XG4gICAgdGhpcy5wdXNoU2ltcGxlQmxvY2soKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRlYnVnQmxvY2tzKCk6IExpdmVCbG9ja1tdIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja1N0YWNrLnRvQXJyYXkoKTtcbiAgfVxuXG4gIGdldCBlbGVtZW50KCk6IFNpbXBsZUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzW0NVUlNPUl9TVEFDS10uY3VycmVudCEuZWxlbWVudDtcbiAgfVxuXG4gIGdldCBuZXh0U2libGluZygpOiBPcHRpb248U2ltcGxlTm9kZT4ge1xuICAgIHJldHVybiB0aGlzW0NVUlNPUl9TVEFDS10uY3VycmVudCEubmV4dFNpYmxpbmc7XG4gIH1cblxuICBnZXQgaGFzQmxvY2tzKCkge1xuICAgIHJldHVybiB0aGlzLmJsb2NrU3RhY2suc2l6ZSA+IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgYmxvY2soKTogTGl2ZUJsb2NrIHtcbiAgICByZXR1cm4gZXhwZWN0KHRoaXMuYmxvY2tTdGFjay5jdXJyZW50LCAnRXhwZWN0ZWQgYSBjdXJyZW50IGxpdmUgYmxvY2snKTtcbiAgfVxuXG4gIHBvcEVsZW1lbnQoKSB7XG4gICAgdGhpc1tDVVJTT1JfU1RBQ0tdLnBvcCgpO1xuICAgIGV4cGVjdCh0aGlzW0NVUlNPUl9TVEFDS10uY3VycmVudCwgXCJjYW4ndCBwb3AgcGFzdCB0aGUgbGFzdCBlbGVtZW50XCIpO1xuICB9XG5cbiAgcHVzaFNpbXBsZUJsb2NrKCk6IExpdmVCbG9jayB7XG4gICAgcmV0dXJuIHRoaXMucHVzaExpdmVCbG9jayhuZXcgU2ltcGxlTGl2ZUJsb2NrKHRoaXMuZWxlbWVudCkpO1xuICB9XG5cbiAgcHVzaFVwZGF0YWJsZUJsb2NrKCk6IFVwZGF0YWJsZUJsb2NrSW1wbCB7XG4gICAgcmV0dXJuIHRoaXMucHVzaExpdmVCbG9jayhuZXcgVXBkYXRhYmxlQmxvY2tJbXBsKHRoaXMuZWxlbWVudCkpO1xuICB9XG5cbiAgcHVzaEJsb2NrTGlzdChsaXN0OiBMaXZlQmxvY2tbXSk6IExpdmVCbG9ja0xpc3Qge1xuICAgIHJldHVybiB0aGlzLnB1c2hMaXZlQmxvY2sobmV3IExpdmVCbG9ja0xpc3QodGhpcy5lbGVtZW50LCBsaXN0KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHVzaExpdmVCbG9jazxUIGV4dGVuZHMgTGl2ZUJsb2NrPihibG9jazogVCwgaXNSZW1vdGUgPSBmYWxzZSk6IFQge1xuICAgIGxldCBjdXJyZW50ID0gdGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQ7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKCFpc1JlbW90ZSkge1xuICAgICAgICBjdXJyZW50LmRpZEFwcGVuZEJvdW5kcyhibG9jayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fX29wZW5CbG9jaygpO1xuICAgIHRoaXMuYmxvY2tTdGFjay5wdXNoKGJsb2NrKTtcbiAgICByZXR1cm4gYmxvY2s7XG4gIH1cblxuICBwb3BCbG9jaygpOiBMaXZlQmxvY2sge1xuICAgIHRoaXMuYmxvY2soKS5maW5hbGl6ZSh0aGlzKTtcbiAgICB0aGlzLl9fY2xvc2VCbG9jaygpO1xuICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLnBvcCgpLCAnRXhwZWN0ZWQgcG9wQmxvY2sgdG8gcmV0dXJuIGEgYmxvY2snKTtcbiAgfVxuXG4gIF9fb3BlbkJsb2NrKCk6IHZvaWQge31cbiAgX19jbG9zZUJsb2NrKCk6IHZvaWQge31cblxuICAvLyB0b2RvIHJldHVybiBzZWVtcyB1bnVzZWRcbiAgb3BlbkVsZW1lbnQodGFnOiBzdHJpbmcpOiBTaW1wbGVFbGVtZW50IHtcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuX19vcGVuRWxlbWVudCh0YWcpO1xuICAgIHRoaXMuY29uc3RydWN0aW5nID0gZWxlbWVudDtcblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgX19vcGVuRWxlbWVudCh0YWc6IHN0cmluZyk6IFNpbXBsZUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmRvbS5jcmVhdGVFbGVtZW50KHRhZywgdGhpcy5lbGVtZW50KTtcbiAgfVxuXG4gIGZsdXNoRWxlbWVudChtb2RpZmllcnM6IE9wdGlvbjxNb2RpZmllckluc3RhbmNlW10+KSB7XG4gICAgbGV0IHBhcmVudCA9IHRoaXMuZWxlbWVudDtcbiAgICBsZXQgZWxlbWVudCA9IGV4cGVjdChcbiAgICAgIHRoaXMuY29uc3RydWN0aW5nLFxuICAgICAgYGZsdXNoRWxlbWVudCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBjb25zdHJ1Y3RpbmcgYW4gZWxlbWVudGBcbiAgICApO1xuXG4gICAgdGhpcy5fX2ZsdXNoRWxlbWVudChwYXJlbnQsIGVsZW1lbnQpO1xuXG4gICAgdGhpcy5jb25zdHJ1Y3RpbmcgPSBudWxsO1xuICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG5cbiAgICB0aGlzLnB1c2hNb2RpZmllcnMobW9kaWZpZXJzKTtcbiAgICB0aGlzLnB1c2hFbGVtZW50KGVsZW1lbnQsIG51bGwpO1xuICAgIHRoaXMuZGlkT3BlbkVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICBfX2ZsdXNoRWxlbWVudChwYXJlbnQ6IFNpbXBsZUVsZW1lbnQsIGNvbnN0cnVjdGluZzogU2ltcGxlRWxlbWVudCkge1xuICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYXJlbnQsIGNvbnN0cnVjdGluZywgdGhpcy5uZXh0U2libGluZyk7XG4gIH1cblxuICBjbG9zZUVsZW1lbnQoKTogT3B0aW9uPE1vZGlmaWVySW5zdGFuY2VbXT4ge1xuICAgIHRoaXMud2lsbENsb3NlRWxlbWVudCgpO1xuICAgIHRoaXMucG9wRWxlbWVudCgpO1xuICAgIHJldHVybiB0aGlzLnBvcE1vZGlmaWVycygpO1xuICB9XG5cbiAgcHVzaFJlbW90ZUVsZW1lbnQoXG4gICAgZWxlbWVudDogU2ltcGxlRWxlbWVudCxcbiAgICBndWlkOiBzdHJpbmcsXG4gICAgaW5zZXJ0QmVmb3JlOiBNYXliZTxTaW1wbGVOb2RlPlxuICApOiBPcHRpb248UmVtb3RlTGl2ZUJsb2NrPiB7XG4gICAgcmV0dXJuIHRoaXMuX19wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBndWlkLCBpbnNlcnRCZWZvcmUpO1xuICB9XG5cbiAgX19wdXNoUmVtb3RlRWxlbWVudChcbiAgICBlbGVtZW50OiBTaW1wbGVFbGVtZW50LFxuICAgIF9ndWlkOiBzdHJpbmcsXG4gICAgaW5zZXJ0QmVmb3JlOiBNYXliZTxTaW1wbGVOb2RlPlxuICApOiBPcHRpb248UmVtb3RlTGl2ZUJsb2NrPiB7XG4gICAgdGhpcy5wdXNoRWxlbWVudChlbGVtZW50LCBpbnNlcnRCZWZvcmUpO1xuXG4gICAgaWYgKGluc2VydEJlZm9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB3aGlsZSAoZWxlbWVudC5sYXN0Q2hpbGQpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50Lmxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJsb2NrID0gbmV3IFJlbW90ZUxpdmVCbG9jayhlbGVtZW50KTtcblxuICAgIHJldHVybiB0aGlzLnB1c2hMaXZlQmxvY2soYmxvY2ssIHRydWUpO1xuICB9XG5cbiAgcG9wUmVtb3RlRWxlbWVudCgpIHtcbiAgICB0aGlzLnBvcEJsb2NrKCk7XG4gICAgdGhpcy5wb3BFbGVtZW50KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHVzaEVsZW1lbnQoZWxlbWVudDogU2ltcGxlRWxlbWVudCwgbmV4dFNpYmxpbmc6IE1heWJlPFNpbXBsZU5vZGU+ID0gbnVsbCkge1xuICAgIHRoaXNbQ1VSU09SX1NUQUNLXS5wdXNoKG5ldyBDdXJzb3JJbXBsKGVsZW1lbnQsIG5leHRTaWJsaW5nKSk7XG4gIH1cblxuICBwcml2YXRlIHB1c2hNb2RpZmllcnMobW9kaWZpZXJzOiBPcHRpb248TW9kaWZpZXJJbnN0YW5jZVtdPik6IHZvaWQge1xuICAgIHRoaXMubW9kaWZpZXJTdGFjay5wdXNoKG1vZGlmaWVycyk7XG4gIH1cblxuICBwcml2YXRlIHBvcE1vZGlmaWVycygpOiBPcHRpb248TW9kaWZpZXJJbnN0YW5jZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZXJTdGFjay5wb3AoKTtcbiAgfVxuXG4gIGRpZEFwcGVuZEJvdW5kcyhib3VuZHM6IEJvdW5kcyk6IEJvdW5kcyB7XG4gICAgdGhpcy5ibG9jaygpLmRpZEFwcGVuZEJvdW5kcyhib3VuZHMpO1xuICAgIHJldHVybiBib3VuZHM7XG4gIH1cblxuICBkaWRBcHBlbmROb2RlPFQgZXh0ZW5kcyBTaW1wbGVOb2RlPihub2RlOiBUKTogVCB7XG4gICAgdGhpcy5ibG9jaygpLmRpZEFwcGVuZE5vZGUobm9kZSk7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBkaWRPcGVuRWxlbWVudChlbGVtZW50OiBTaW1wbGVFbGVtZW50KTogU2ltcGxlRWxlbWVudCB7XG4gICAgdGhpcy5ibG9jaygpLm9wZW5FbGVtZW50KGVsZW1lbnQpO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgd2lsbENsb3NlRWxlbWVudCgpIHtcbiAgICB0aGlzLmJsb2NrKCkuY2xvc2VFbGVtZW50KCk7XG4gIH1cblxuICBhcHBlbmRUZXh0KHN0cmluZzogc3RyaW5nKTogU2ltcGxlVGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuZGlkQXBwZW5kTm9kZSh0aGlzLl9fYXBwZW5kVGV4dChzdHJpbmcpKTtcbiAgfVxuXG4gIF9fYXBwZW5kVGV4dCh0ZXh0OiBzdHJpbmcpOiBTaW1wbGVUZXh0IHtcbiAgICBsZXQgeyBkb20sIGVsZW1lbnQsIG5leHRTaWJsaW5nIH0gPSB0aGlzO1xuICAgIGxldCBub2RlID0gZG9tLmNyZWF0ZVRleHROb2RlKHRleHQpO1xuICAgIGRvbS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbm9kZSwgbmV4dFNpYmxpbmcpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgX19hcHBlbmROb2RlKG5vZGU6IFNpbXBsZU5vZGUpOiBTaW1wbGVOb2RlIHtcbiAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBub2RlLCB0aGlzLm5leHRTaWJsaW5nKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIF9fYXBwZW5kRnJhZ21lbnQoZnJhZ21lbnQ6IFNpbXBsZURvY3VtZW50RnJhZ21lbnQpOiBCb3VuZHMge1xuICAgIGxldCBmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cbiAgICBpZiAoZmlyc3QpIHtcbiAgICAgIGxldCByZXQgPSBuZXcgQ29uY3JldGVCb3VuZHModGhpcy5lbGVtZW50LCBmaXJzdCwgZnJhZ21lbnQubGFzdENoaWxkISk7XG4gICAgICB0aGlzLmRvbS5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBmcmFnbWVudCwgdGhpcy5uZXh0U2libGluZyk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFNpbmdsZU5vZGVCb3VuZHModGhpcy5lbGVtZW50LCB0aGlzLl9fYXBwZW5kQ29tbWVudCgnJykpO1xuICAgIH1cbiAgfVxuXG4gIF9fYXBwZW5kSFRNTChodG1sOiBzdHJpbmcpOiBCb3VuZHMge1xuICAgIHJldHVybiB0aGlzLmRvbS5pbnNlcnRIVE1MQmVmb3JlKHRoaXMuZWxlbWVudCwgdGhpcy5uZXh0U2libGluZywgaHRtbCk7XG4gIH1cblxuICBhcHBlbmREeW5hbWljSFRNTCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGJvdW5kcyA9IHRoaXMudHJ1c3RlZENvbnRlbnQodmFsdWUpO1xuICAgIHRoaXMuZGlkQXBwZW5kQm91bmRzKGJvdW5kcyk7XG4gIH1cblxuICBhcHBlbmREeW5hbWljVGV4dCh2YWx1ZTogc3RyaW5nKTogU2ltcGxlVGV4dCB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLnVudHJ1c3RlZENvbnRlbnQodmFsdWUpO1xuICAgIHRoaXMuZGlkQXBwZW5kTm9kZShub2RlKTtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGFwcGVuZER5bmFtaWNGcmFnbWVudCh2YWx1ZTogU2ltcGxlRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICAgIGxldCBib3VuZHMgPSB0aGlzLl9fYXBwZW5kRnJhZ21lbnQodmFsdWUpO1xuICAgIHRoaXMuZGlkQXBwZW5kQm91bmRzKGJvdW5kcyk7XG4gIH1cblxuICBhcHBlbmREeW5hbWljTm9kZSh2YWx1ZTogU2ltcGxlTm9kZSk6IHZvaWQge1xuICAgIGxldCBub2RlID0gdGhpcy5fX2FwcGVuZE5vZGUodmFsdWUpO1xuICAgIGxldCBib3VuZHMgPSBuZXcgU2luZ2xlTm9kZUJvdW5kcyh0aGlzLmVsZW1lbnQsIG5vZGUpO1xuICAgIHRoaXMuZGlkQXBwZW5kQm91bmRzKGJvdW5kcyk7XG4gIH1cblxuICBwcml2YXRlIHRydXN0ZWRDb250ZW50KHZhbHVlOiBzdHJpbmcpOiBCb3VuZHMge1xuICAgIHJldHVybiB0aGlzLl9fYXBwZW5kSFRNTCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHVudHJ1c3RlZENvbnRlbnQodmFsdWU6IHN0cmluZyk6IFNpbXBsZVRleHQge1xuICAgIHJldHVybiB0aGlzLl9fYXBwZW5kVGV4dCh2YWx1ZSk7XG4gIH1cblxuICBhcHBlbmRDb21tZW50KHN0cmluZzogc3RyaW5nKTogU2ltcGxlQ29tbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZGlkQXBwZW5kTm9kZSh0aGlzLl9fYXBwZW5kQ29tbWVudChzdHJpbmcpKTtcbiAgfVxuXG4gIF9fYXBwZW5kQ29tbWVudChzdHJpbmc6IHN0cmluZyk6IFNpbXBsZUNvbW1lbnQge1xuICAgIGxldCB7IGRvbSwgZWxlbWVudCwgbmV4dFNpYmxpbmcgfSA9IHRoaXM7XG4gICAgbGV0IG5vZGUgPSBkb20uY3JlYXRlQ29tbWVudChzdHJpbmcpO1xuICAgIGRvbS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbm9kZSwgbmV4dFNpYmxpbmcpO1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgX19zZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPik6IHZvaWQge1xuICAgIHRoaXMuZG9tLnNldEF0dHJpYnV0ZSh0aGlzLmNvbnN0cnVjdGluZyEsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgX19zZXRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgKHRoaXMuY29uc3RydWN0aW5nISBhcyBhbnkpW25hbWVdID0gdmFsdWU7XG4gIH1cblxuICBzZXRTdGF0aWNBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPik6IHZvaWQge1xuICAgIHRoaXMuX19zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBzZXREeW5hbWljQXR0cmlidXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICB0cnVzdGluZzogYm9vbGVhbixcbiAgICBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPlxuICApOiBEeW5hbWljQXR0cmlidXRlIHtcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuY29uc3RydWN0aW5nITtcbiAgICBsZXQgYXR0cmlidXRlID0gZHluYW1pY0F0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCBuYW1lc3BhY2UsIHRydXN0aW5nKTtcbiAgICBhdHRyaWJ1dGUuc2V0KHRoaXMsIHZhbHVlLCB0aGlzLmVudik7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2ltcGxlTGl2ZUJsb2NrIGltcGxlbWVudHMgTGl2ZUJsb2NrIHtcbiAgcHJvdGVjdGVkIGZpcnN0OiBPcHRpb248Rmlyc3ROb2RlPiA9IG51bGw7XG4gIHByb3RlY3RlZCBsYXN0OiBPcHRpb248TGFzdE5vZGU+ID0gbnVsbDtcbiAgcHJvdGVjdGVkIG5lc3RpbmcgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFyZW50OiBTaW1wbGVFbGVtZW50KSB7fVxuXG4gIHBhcmVudEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICB9XG5cbiAgZmlyc3ROb2RlKCk6IFNpbXBsZU5vZGUge1xuICAgIGxldCBmaXJzdCA9IGV4cGVjdChcbiAgICAgIHRoaXMuZmlyc3QsXG4gICAgICAnY2Fubm90IGNhbGwgYGZpcnN0Tm9kZSgpYCB3aGlsZSBgU2ltcGxlTGl2ZUJsb2NrYCBpcyBzdGlsbCBpbml0aWFsaXppbmcnXG4gICAgKTtcblxuICAgIHJldHVybiBmaXJzdC5maXJzdE5vZGUoKTtcbiAgfVxuXG4gIGxhc3ROb2RlKCk6IFNpbXBsZU5vZGUge1xuICAgIGxldCBsYXN0ID0gZXhwZWN0KFxuICAgICAgdGhpcy5sYXN0LFxuICAgICAgJ2Nhbm5vdCBjYWxsIGBsYXN0Tm9kZSgpYCB3aGlsZSBgU2ltcGxlTGl2ZUJsb2NrYCBpcyBzdGlsbCBpbml0aWFsaXppbmcnXG4gICAgKTtcblxuICAgIHJldHVybiBsYXN0Lmxhc3ROb2RlKCk7XG4gIH1cblxuICBvcGVuRWxlbWVudChlbGVtZW50OiBTaW1wbGVFbGVtZW50KSB7XG4gICAgdGhpcy5kaWRBcHBlbmROb2RlKGVsZW1lbnQpO1xuICAgIHRoaXMubmVzdGluZysrO1xuICB9XG5cbiAgY2xvc2VFbGVtZW50KCkge1xuICAgIHRoaXMubmVzdGluZy0tO1xuICB9XG5cbiAgZGlkQXBwZW5kTm9kZShub2RlOiBTaW1wbGVOb2RlKSB7XG4gICAgaWYgKHRoaXMubmVzdGluZyAhPT0gMCkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmZpcnN0KSB7XG4gICAgICB0aGlzLmZpcnN0ID0gbmV3IEZpcnN0KG5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMubGFzdCA9IG5ldyBMYXN0KG5vZGUpO1xuICB9XG5cbiAgZGlkQXBwZW5kQm91bmRzKGJvdW5kczogQm91bmRzKSB7XG4gICAgaWYgKHRoaXMubmVzdGluZyAhPT0gMCkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmZpcnN0KSB7XG4gICAgICB0aGlzLmZpcnN0ID0gYm91bmRzO1xuICAgIH1cblxuICAgIHRoaXMubGFzdCA9IGJvdW5kcztcbiAgfVxuXG4gIGZpbmFsaXplKHN0YWNrOiBFbGVtZW50QnVpbGRlcikge1xuICAgIGlmICh0aGlzLmZpcnN0ID09PSBudWxsKSB7XG4gICAgICBzdGFjay5hcHBlbmRDb21tZW50KCcnKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlbW90ZUxpdmVCbG9jayBleHRlbmRzIFNpbXBsZUxpdmVCbG9jayB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudDogU2ltcGxlRWxlbWVudCkge1xuICAgIHN1cGVyKHBhcmVudCk7XG5cbiAgICByZWdpc3RlckRlc3RydWN0b3IodGhpcywgKCkgPT4ge1xuICAgICAgLy8gSW4gZ2VuZXJhbCwgeW91IG9ubHkgbmVlZCB0byBjbGVhciB0aGUgcm9vdCBvZiBhIGhpZXJhcmNoeSwgYW5kIHNob3VsZCBuZXZlclxuICAgICAgLy8gbmVlZCB0byBjbGVhciBhbnkgY2hpbGQgbm9kZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGNvbnN0cmFpbnQgdGhhdCBnaXZlcyB1c1xuICAgICAgLy8gYSBzdHJvbmcgZ3VhcmFudGVlIHRoYXQgY2xlYXJpbmcgYSBzdWJ0cmVlIGlzIGEgc2luZ2xlIERPTSBvcGVyYXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gQmVjYXVzZSByZW1vdGUgYmxvY2tzIGFyZSBub3Qgbm9ybWFsbHkgcGh5c2ljYWxseSBuZXN0ZWQgaW5zaWRlIG9mIHRoZSB0cmVlXG4gICAgICAvLyB0aGF0IHRoZXkgYXJlIGxvZ2ljYWxseSBuZXN0ZWQgaW5zaWRlLCB3ZSBtYW51YWxseSBjbGVhciByZW1vdGUgYmxvY2tzIHdoZW5cbiAgICAgIC8vIGEgbG9naWNhbCBwYXJlbnQgaXMgY2xlYXJlZC5cbiAgICAgIC8vXG4gICAgICAvLyBIT1dFVkVSLCBpdCBpcyBjdXJyZW50bHkgcG9zc2libGUgZm9yIGEgcmVtb3RlIGJsb2NrIHRvIGJlIHBoeXNpY2FsbHkgbmVzdGVkXG4gICAgICAvLyBpbnNpZGUgb2YgdGhlIGJsb2NrIGl0IGlzIGxvZ2ljYWxseSBjb250YWluZWQgaW5zaWRlIG9mLiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gdGhlIHJlbW90ZSBibG9jayBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBhcHBsaWNhdGlvbidzIGVudGlyZSBlbGVtZW50LlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwcm9ibGVtIHdpdGggdGhhdCBzY2VuYXJpbyBpcyB0aGF0IEdsaW1tZXIgYmVsaWV2ZXMgdGhhdCBpdCBvd25zIG1vcmUgb2ZcbiAgICAgIC8vIHRoZSBET00gdGhhbiBpdCBhY3R1YWxseSBkb2VzLiBUaGUgY29kZSBpcyBhdHRlbXB0aW5nIHRvIHdyaXRlIHBhc3QgdGhlIGVuZFxuICAgICAgLy8gb2YgdGhlIEdsaW1tZXItbWFuYWdlZCByb290LCBidXQgR2xpbW1lciBpc24ndCBhd2FyZSBvZiB0aGF0LlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBjb3JyZWN0IHNvbHV0aW9uIHRvIHRoYXQgcHJvYmxlbSBpcyBmb3IgR2xpbW1lciB0byBiZSBhd2FyZSBvZiB0aGUgZW5kXG4gICAgICAvLyBvZiB0aGUgYm91bmRzIHRoYXQgaXQgb3ducywgYW5kIG9uY2Ugd2UgbWFrZSB0aGF0IGNoYW5nZSwgdGhpcyBjaGVjayBjb3VsZFxuICAgICAgLy8gYmUgcmVtb3ZlZC5cbiAgICAgIC8vXG4gICAgICAvLyBGb3Igbm93LCBhIG1vcmUgdGFyZ2V0ZWQgZml4IGlzIHRvIGNoZWNrIHdoZXRoZXIgdGhlIG5vZGUgd2FzIGFscmVhZHkgcmVtb3ZlZFxuICAgICAgLy8gYW5kIGF2b2lkIGNsZWFyaW5nIHRoZSBub2RlIGlmIGl0IHdhcy4gSW4gbW9zdCBjYXNlcyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sXG4gICAgICAvLyBzbyB0aGlzIG1pZ2h0IGhpZGUgYnVncyB3aGVyZSB0aGUgY29kZSB