UNPKG

ember-legacy-class-transform

Version:
419 lines (331 loc) 41.6 kB
function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import { clear } from './bounds'; import { Stack, assert } from '@glimmer/util'; import { SimpleElementOperations } from './compiled/opcodes/dom'; var First = function () { function First(node) { _classCallCheck(this, First); this.node = node; } First.prototype.firstNode = function firstNode() { return this.node; }; return First; }(); var Last = function () { function Last(node) { _classCallCheck(this, Last); this.node = node; } Last.prototype.lastNode = function lastNode() { return this.node; }; return Last; }(); export var Fragment = function () { function Fragment(bounds) { _classCallCheck(this, Fragment); this.bounds = bounds; } Fragment.prototype.parentElement = function parentElement() { return this.bounds.parentElement(); }; Fragment.prototype.firstNode = function firstNode() { return this.bounds.firstNode(); }; Fragment.prototype.lastNode = function lastNode() { return this.bounds.lastNode(); }; Fragment.prototype.update = function update(bounds) { this.bounds = bounds; }; return Fragment; }(); export var ElementStack = function () { function ElementStack(env, parentNode, nextSibling) { _classCallCheck(this, ElementStack); this.constructing = null; this.operations = null; this.elementStack = new Stack(); this.nextSiblingStack = new Stack(); this.blockStack = new Stack(); this.env = env; this.dom = env.getAppendOperations(); this.updateOperations = env.getDOM(); this.element = parentNode; this.nextSibling = nextSibling; this.defaultOperations = new SimpleElementOperations(env); this.pushSimpleBlock(); this.elementStack.push(this.element); this.nextSiblingStack.push(this.nextSibling); } ElementStack.forInitialRender = function forInitialRender(env, parentNode, nextSibling) { return new ElementStack(env, parentNode, nextSibling); }; ElementStack.resume = function resume(env, tracker, nextSibling) { var parentNode = tracker.parentElement(); var stack = new ElementStack(env, parentNode, nextSibling); stack.pushBlockTracker(tracker); return stack; }; ElementStack.prototype.expectConstructing = function expectConstructing(method) { return this.constructing; }; ElementStack.prototype.expectOperations = function expectOperations(method) { return this.operations; }; ElementStack.prototype.block = function block() { return this.blockStack.current; }; ElementStack.prototype.popElement = function popElement() { var elementStack = this.elementStack, nextSiblingStack = this.nextSiblingStack; var topElement = elementStack.pop(); nextSiblingStack.pop(); // LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`); this.element = elementStack.current; this.nextSibling = nextSiblingStack.current; return topElement; }; ElementStack.prototype.pushSimpleBlock = function pushSimpleBlock() { var tracker = new SimpleBlockTracker(this.element); this.pushBlockTracker(tracker); return tracker; }; ElementStack.prototype.pushUpdatableBlock = function pushUpdatableBlock() { var tracker = new UpdatableBlockTracker(this.element); this.pushBlockTracker(tracker); return tracker; }; ElementStack.prototype.pushBlockTracker = function pushBlockTracker(tracker) { var isRemote = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var current = this.blockStack.current; if (current !== null) { current.newDestroyable(tracker); if (!isRemote) { current.newBounds(tracker); } } this.blockStack.push(tracker); return tracker; }; ElementStack.prototype.pushBlockList = function pushBlockList(list) { var tracker = new BlockListTracker(this.element, list); var current = this.blockStack.current; if (current !== null) { current.newDestroyable(tracker); current.newBounds(tracker); } this.blockStack.push(tracker); return tracker; }; ElementStack.prototype.popBlock = function popBlock() { this.block().finalize(this); return this.blockStack.pop(); }; ElementStack.prototype.openElement = function openElement(tag, _operations) { // workaround argument.length transpile of arg initializer var operations = _operations === undefined ? this.defaultOperations : _operations; var element = this.dom.createElement(tag, this.element); this.constructing = element; this.operations = operations; return element; }; ElementStack.prototype.flushElement = function flushElement() { var parent = this.element; var element = this.constructing; this.dom.insertBefore(parent, element, this.nextSibling); this.constructing = null; this.operations = null; this.pushElement(element, null); this.block().openElement(element); }; ElementStack.prototype.pushRemoteElement = function pushRemoteElement(element) { var nextSibling = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; this.pushElement(element, nextSibling); var tracker = new RemoteBlockTracker(element); this.pushBlockTracker(tracker, true); }; ElementStack.prototype.popRemoteElement = function popRemoteElement() { this.popBlock(); this.popElement(); }; ElementStack.prototype.pushElement = function pushElement(element, nextSibling) { this.element = element; this.elementStack.push(element); // LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`); this.nextSibling = nextSibling; this.nextSiblingStack.push(nextSibling); }; ElementStack.prototype.newDestroyable = function newDestroyable(d) { this.block().newDestroyable(d); }; ElementStack.prototype.newBounds = function newBounds(bounds) { this.block().newBounds(bounds); }; ElementStack.prototype.appendText = function appendText(string) { var dom = this.dom; var text = dom.createTextNode(string); dom.insertBefore(this.element, text, this.nextSibling); this.block().newNode(text); return text; }; ElementStack.prototype.appendComment = function appendComment(string) { var dom = this.dom; var comment = dom.createComment(string); dom.insertBefore(this.element, comment, this.nextSibling); this.block().newNode(comment); return comment; }; ElementStack.prototype.setStaticAttribute = function setStaticAttribute(name, value) { this.expectOperations('setStaticAttribute').addStaticAttribute(this.expectConstructing('setStaticAttribute'), name, value); }; ElementStack.prototype.setStaticAttributeNS = function setStaticAttributeNS(namespace, name, value) { this.expectOperations('setStaticAttributeNS').addStaticAttributeNS(this.expectConstructing('setStaticAttributeNS'), namespace, name, value); }; ElementStack.prototype.setDynamicAttribute = function setDynamicAttribute(name, reference, isTrusting) { this.expectOperations('setDynamicAttribute').addDynamicAttribute(this.expectConstructing('setDynamicAttribute'), name, reference, isTrusting); }; ElementStack.prototype.setDynamicAttributeNS = function setDynamicAttributeNS(namespace, name, reference, isTrusting) { this.expectOperations('setDynamicAttributeNS').addDynamicAttributeNS(this.expectConstructing('setDynamicAttributeNS'), namespace, name, reference, isTrusting); }; ElementStack.prototype.closeElement = function closeElement() { this.block().closeElement(); this.popElement(); }; return ElementStack; }(); export var SimpleBlockTracker = function () { function SimpleBlockTracker(parent) { _classCallCheck(this, SimpleBlockTracker); this.parent = parent; this.first = null; this.last = null; this.destroyables = null; this.nesting = 0; } SimpleBlockTracker.prototype.destroy = function destroy() { var destroyables = this.destroyables; if (destroyables && destroyables.length) { for (var i = 0; i < destroyables.length; i++) { destroyables[i].destroy(); } } }; SimpleBlockTracker.prototype.parentElement = function parentElement() { return this.parent; }; SimpleBlockTracker.prototype.firstNode = function firstNode() { return this.first && this.first.firstNode(); }; SimpleBlockTracker.prototype.lastNode = function lastNode() { return this.last && this.last.lastNode(); }; SimpleBlockTracker.prototype.openElement = function openElement(element) { this.newNode(element); this.nesting++; }; SimpleBlockTracker.prototype.closeElement = function closeElement() { this.nesting--; }; SimpleBlockTracker.prototype.newNode = function newNode(node) { if (this.nesting !== 0) return; if (!this.first) { this.first = new First(node); } this.last = new Last(node); }; SimpleBlockTracker.prototype.newBounds = function newBounds(bounds) { if (this.nesting !== 0) return; if (!this.first) { this.first = bounds; } this.last = bounds; }; SimpleBlockTracker.prototype.newDestroyable = function newDestroyable(d) { this.destroyables = this.destroyables || []; this.destroyables.push(d); }; SimpleBlockTracker.prototype.finalize = function finalize(stack) { if (!this.first) { stack.appendComment(''); } }; return SimpleBlockTracker; }(); var RemoteBlockTracker = function (_SimpleBlockTracker) { _inherits(RemoteBlockTracker, _SimpleBlockTracker); function RemoteBlockTracker() { _classCallCheck(this, RemoteBlockTracker); return _possibleConstructorReturn(this, _SimpleBlockTracker.apply(this, arguments)); } RemoteBlockTracker.prototype.destroy = function destroy() { _SimpleBlockTracker.prototype.destroy.call(this); clear(this); }; return RemoteBlockTracker; }(SimpleBlockTracker); export var UpdatableBlockTracker = function (_SimpleBlockTracker2) { _inherits(UpdatableBlockTracker, _SimpleBlockTracker2); function UpdatableBlockTracker() { _classCallCheck(this, UpdatableBlockTracker); return _possibleConstructorReturn(this, _SimpleBlockTracker2.apply(this, arguments)); } UpdatableBlockTracker.prototype.reset = function reset(env) { var destroyables = this.destroyables; if (destroyables && destroyables.length) { for (var i = 0; i < destroyables.length; i++) { env.didDestroy(destroyables[i]); } } var nextSibling = clear(this); this.first = null; this.last = null; this.destroyables = null; this.nesting = 0; return nextSibling; }; return UpdatableBlockTracker; }(SimpleBlockTracker); var BlockListTracker = function () { function BlockListTracker(parent, boundList) { _classCallCheck(this, BlockListTracker); this.parent = parent; this.boundList = boundList; this.parent = parent; this.boundList = boundList; } BlockListTracker.prototype.destroy = function destroy() { this.boundList.forEachNode(function (node) { return node.destroy(); }); }; BlockListTracker.prototype.parentElement = function parentElement() { return this.parent; }; BlockListTracker.prototype.firstNode = function firstNode() { var head = this.boundList.head(); return head && head.firstNode(); }; BlockListTracker.prototype.lastNode = function lastNode() { var tail = this.boundList.tail(); return tail && tail.lastNode(); }; BlockListTracker.prototype.openElement = function openElement(_element) { assert(false, 'Cannot openElement directly inside a block list'); }; BlockListTracker.prototype.closeElement = function closeElement() { assert(false, 'Cannot closeElement directly inside a block list'); }; BlockListTracker.prototype.newNode = function newNode(_node) { assert(false, 'Cannot create a new node directly inside a block list'); }; BlockListTracker.prototype.newBounds = function newBounds(_bounds) {}; BlockListTracker.prototype.newDestroyable = function newDestroyable(_d) {}; BlockListTracker.prototype.finalize = function finalize(_stack) {}; return BlockListTracker; }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9idWlsZGVyLmpzIl0sIm5hbWVzIjpbImNsZWFyIiwiU3RhY2siLCJhc3NlcnQiLCJTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyIsIkZpcnN0Iiwibm9kZSIsImZpcnN0Tm9kZSIsIkxhc3QiLCJsYXN0Tm9kZSIsIkZyYWdtZW50IiwiYm91bmRzIiwicGFyZW50RWxlbWVudCIsInVwZGF0ZSIsIkVsZW1lbnRTdGFjayIsImVudiIsInBhcmVudE5vZGUiLCJuZXh0U2libGluZyIsImNvbnN0cnVjdGluZyIsIm9wZXJhdGlvbnMiLCJlbGVtZW50U3RhY2siLCJuZXh0U2libGluZ1N0YWNrIiwiYmxvY2tTdGFjayIsImRvbSIsImdldEFwcGVuZE9wZXJhdGlvbnMiLCJ1cGRhdGVPcGVyYXRpb25zIiwiZ2V0RE9NIiwiZWxlbWVudCIsImRlZmF1bHRPcGVyYXRpb25zIiwicHVzaFNpbXBsZUJsb2NrIiwicHVzaCIsImZvckluaXRpYWxSZW5kZXIiLCJyZXN1bWUiLCJ0cmFja2VyIiwic3RhY2siLCJwdXNoQmxvY2tUcmFja2VyIiwiZXhwZWN0Q29uc3RydWN0aW5nIiwibWV0aG9kIiwiZXhwZWN0T3BlcmF0aW9ucyIsImJsb2NrIiwiY3VycmVudCIsInBvcEVsZW1lbnQiLCJ0b3BFbGVtZW50IiwicG9wIiwiU2ltcGxlQmxvY2tUcmFja2VyIiwicHVzaFVwZGF0YWJsZUJsb2NrIiwiVXBkYXRhYmxlQmxvY2tUcmFja2VyIiwiaXNSZW1vdGUiLCJuZXdEZXN0cm95YWJsZSIsIm5ld0JvdW5kcyIsInB1c2hCbG9ja0xpc3QiLCJsaXN0IiwiQmxvY2tMaXN0VHJhY2tlciIsInBvcEJsb2NrIiwiZmluYWxpemUiLCJvcGVuRWxlbWVudCIsInRhZyIsIl9vcGVyYXRpb25zIiwidW5kZWZpbmVkIiwiY3JlYXRlRWxlbWVudCIsImZsdXNoRWxlbWVudCIsInBhcmVudCIsImluc2VydEJlZm9yZSIsInB1c2hFbGVtZW50IiwicHVzaFJlbW90ZUVsZW1lbnQiLCJSZW1vdGVCbG9ja1RyYWNrZXIiLCJwb3BSZW1vdGVFbGVtZW50IiwiZCIsImFwcGVuZFRleHQiLCJzdHJpbmciLCJ0ZXh0IiwiY3JlYXRlVGV4dE5vZGUiLCJuZXdOb2RlIiwiYXBwZW5kQ29tbWVudCIsImNvbW1lbnQiLCJjcmVhdGVDb21tZW50Iiwic2V0U3RhdGljQXR0cmlidXRlIiwibmFtZSIsInZhbHVlIiwiYWRkU3RhdGljQXR0cmlidXRlIiwic2V0U3RhdGljQXR0cmlidXRlTlMiLCJuYW1lc3BhY2UiLCJhZGRTdGF0aWNBdHRyaWJ1dGVOUyIsInNldER5bmFtaWNBdHRyaWJ1dGUiLCJyZWZlcmVuY2UiLCJpc1RydXN0aW5nIiwiYWRkRHluYW1pY0F0dHJpYnV0ZSIsInNldER5bmFtaWNBdHRyaWJ1dGVOUyIsImFkZER5bmFtaWNBdHRyaWJ1dGVOUyIsImNsb3NlRWxlbWVudCIsImZpcnN0IiwibGFzdCIsImRlc3Ryb3lhYmxlcyIsIm5lc3RpbmciLCJkZXN0cm95IiwibGVuZ3RoIiwiaSIsInJlc2V0IiwiZGlkRGVzdHJveSIsImJvdW5kTGlzdCIsImZvckVhY2hOb2RlIiwiaGVhZCIsInRhaWwiLCJfZWxlbWVudCIsIl9ub2RlIiwiX2JvdW5kcyIsIl9kIiwiX3N0YWNrIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLFNBQVNBLEtBQVQsUUFBc0IsVUFBdEI7QUFDQSxTQUFTQyxLQUFULEVBQWdCQyxNQUFoQixRQUFzQyxlQUF0QztBQUNBLFNBQVNDLHVCQUFULFFBQXdDLHdCQUF4Qzs7SUFDTUMsSztBQUNGLG1CQUFZQyxJQUFaLEVBQWtCO0FBQUE7O0FBQ2QsYUFBS0EsSUFBTCxHQUFZQSxJQUFaO0FBQ0g7O29CQUNEQyxTLHdCQUFZO0FBQ1IsZUFBTyxLQUFLRCxJQUFaO0FBQ0gsSzs7Ozs7SUFFQ0UsSTtBQUNGLGtCQUFZRixJQUFaLEVBQWtCO0FBQUE7O0FBQ2QsYUFBS0EsSUFBTCxHQUFZQSxJQUFaO0FBQ0g7O21CQUNERyxRLHVCQUFXO0FBQ1AsZUFBTyxLQUFLSCxJQUFaO0FBQ0gs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aUQsTUFBWjtBQUNILEs7OytCQUNEdEQsUyx3QkFBWTtBQUNSLFlBQUk4RixPQUFPLEtBQUtGLFNBQUwsQ0FBZUUsSUFBZixFQUFYO0FBQ0EsZUFBT0EsUUFBUUEsS0FBSzlGLFNBQUwsRUFBZjtBQUNILEs7OytCQUNERSxRLHVCQUFXO0FBQ1AsWUFBSTZGLE9BQU8sS0FBS0gsU0FBTCxDQUFlRyxJQUFmLEVBQVg7QUFDQSxlQUFPQSxRQUFRQSxLQUFLN0YsUUFBTCxFQUFmO0FBQ0gsSzs7K0JBQ0Q4QyxXLHdCQUFZZ0QsUSxFQUFVO0FBQ2xCcEcsZUFBTyxLQUFQLEVBQWMsaURBQWQ7QUFDSCxLOzsrQkFDRHNGLFksMkJBQWU7QUFDWHRGLGVBQU8sS0FBUCxFQUFjLGtEQUFkO0FBQ0gsSzs7K0JBQ0RxRSxPLG9CQUFRZ0MsSyxFQUFPO0FBQ1hyRyxlQUFPLEtBQVAsRUFBYyx1REFBZDtBQUNILEs7OytCQUNEOEMsUyxzQkFBVXdELE8sRUFBUyxDQUFFLEM7OytCQUNyQnpELGMsMkJBQWUwRCxFLEVBQUksQ0FBRSxDOzsrQkFDckJwRCxRLHFCQUFTcUQsTSxFQUFRLENBQUUsQyIsImZpbGUiOiJsaWIvYnVpbGRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsZWFyIH0gZnJvbSAnLi9ib3VuZHMnO1xuaW1wb3J0IHsgU3RhY2ssIGFzc2VydCwgZXhwZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyB9IGZyb20gJy4vY29tcGlsZWQvb3Bjb2Rlcy9kb20nO1xuY2xhc3MgRmlyc3Qge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgZmlyc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlO1xuICAgIH1cbn1cbmNsYXNzIExhc3Qge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgbGFzdE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZyYWdtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihib3VuZHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxuICAgIHBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gICAgfVxuICAgIGZpcnN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmZpcnN0Tm9kZSgpO1xuICAgIH1cbiAgICBsYXN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmxhc3ROb2RlKCk7XG4gICAgfVxuICAgIHVwZGF0ZShib3VuZHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEVsZW1lbnRTdGFjayB7XG4gICAgY29uc3RydWN0b3IoZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZykge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuZWxlbWVudFN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMubmV4dFNpYmxpbmdTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLmJsb2NrU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuZG9tID0gZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcGVyYXRpb25zID0gZW52LmdldERPTSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBwYXJlbnROb2RlO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmc7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdGlvbnMgPSBuZXcgU2ltcGxlRWxlbWVudE9wZXJhdGlvbnMoZW52KTtcbiAgICAgICAgdGhpcy5wdXNoU2ltcGxlQmxvY2soKTtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nU3RhY2sucHVzaCh0aGlzLm5leHRTaWJsaW5nKTtcbiAgICB9XG4gICAgc3RhdGljIGZvckluaXRpYWxSZW5kZXIoZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRTdGFjayhlbnYsIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nKTtcbiAgICB9XG4gICAgc3RhdGljIHJlc3VtZShlbnYsIHRyYWNrZXIsIG5leHRTaWJsaW5nKSB7XG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdHJhY2tlci5wYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIGxldCBzdGFjayA9IG5ldyBFbGVtZW50U3RhY2soZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZyk7XG4gICAgICAgIHN0YWNrLnB1c2hCbG9ja1RyYWNrZXIodHJhY2tlcik7XG4gICAgICAgIHJldHVybiBzdGFjaztcbiAgICB9XG4gICAgZXhwZWN0Q29uc3RydWN0aW5nKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMuY29uc3RydWN0aW5nLCBgJHttZXRob2R9IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZSBjb25zdHJ1Y3RpbmcgYW4gZWxlbWVudGApO1xuICAgIH1cbiAgICBleHBlY3RPcGVyYXRpb25zKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMub3BlcmF0aW9ucywgYCR7bWV0aG9kfSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUgY29uc3RydWN0aW5nIGFuIGVsZW1lbnRgKTtcbiAgICB9XG4gICAgYmxvY2soKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQsIFwiRXhwZWN0ZWQgYSBjdXJyZW50IGJsb2NrIHRyYWNrZXJcIik7XG4gICAgfVxuICAgIHBvcEVsZW1lbnQoKSB7XG4gICAgICAgIGxldCB7IGVsZW1lbnRTdGFjaywgbmV4dFNpYmxpbmdTdGFjayB9ID0gdGhpcztcbiAgICAgICAgbGV0IHRvcEVsZW1lbnQgPSBlbGVtZW50U3RhY2sucG9wKCk7XG4gICAgICAgIG5leHRTaWJsaW5nU3RhY2sucG9wKCk7XG4gICAgICAgIC8vIExPR0dFUi5kZWJ1ZyhgLT4gZWxlbWVudCBzdGFjayAke3RoaXMuZWxlbWVudFN0YWNrLnRvQXJyYXkoKS5tYXAoZSA9PiBlLnRhZ05hbWUpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGV4cGVjdChlbGVtZW50U3RhY2suY3VycmVudCwgXCJjYW4ndCBwb3AgcGFzdCB0aGUgbGFzdCBlbGVtZW50XCIpO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmdTdGFjay5jdXJyZW50O1xuICAgICAgICByZXR1cm4gdG9wRWxlbWVudDtcbiAgICB9XG4gICAgcHVzaFNpbXBsZUJsb2NrKCkge1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBTaW1wbGVCbG9ja1RyYWNrZXIodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wdXNoQmxvY2tUcmFja2VyKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaFVwZGF0YWJsZUJsb2NrKCkge1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBVcGRhdGFibGVCbG9ja1RyYWNrZXIodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wdXNoQmxvY2tUcmFja2VyKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaEJsb2NrVHJhY2tlcih0cmFja2VyLCBpc1JlbW90ZSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQ7XG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjdXJyZW50Lm5ld0Rlc3Ryb3lhYmxlKHRyYWNrZXIpO1xuICAgICAgICAgICAgaWYgKCFpc1JlbW90ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQubmV3Qm91bmRzKHRyYWNrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmxvY2tTdGFjay5wdXNoKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaEJsb2NrTGlzdChsaXN0KSB7XG4gICAgICAgIGxldCB0cmFja2VyID0gbmV3IEJsb2NrTGlzdFRyYWNrZXIodGhpcy5lbGVtZW50LCBsaXN0KTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmJsb2NrU3RhY2suY3VycmVudDtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnQubmV3RGVzdHJveWFibGUodHJhY2tlcik7XG4gICAgICAgICAgICBjdXJyZW50Lm5ld0JvdW5kcyh0cmFja2VyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJsb2NrU3RhY2sucHVzaCh0cmFja2VyKTtcbiAgICAgICAgcmV0dXJuIHRyYWNrZXI7XG4gICAgfVxuICAgIHBvcEJsb2NrKCkge1xuICAgICAgICB0aGlzLmJsb2NrKCkuZmluYWxpemUodGhpcyk7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLnBvcCgpLCBcIkV4cGVjdGVkIHBvcEJsb2NrIHRvIHJldHVybiBhIGJsb2NrXCIpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudCh0YWcsIF9vcGVyYXRpb25zKSB7XG4gICAgICAgIC8vIHdvcmthcm91bmQgYXJndW1lbnQubGVuZ3RoIHRyYW5zcGlsZSBvZiBhcmcgaW5pdGlhbGl6ZXJcbiAgICAgICAgbGV0IG9wZXJhdGlvbnMgPSBfb3BlcmF0aW9ucyA9PT0gdW5kZWZpbmVkID8gdGhpcy5kZWZhdWx0T3BlcmF0aW9ucyA6IF9vcGVyYXRpb25zO1xuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQodGFnLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBmbHVzaEVsZW1lbnQoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtZW50ID0gZXhwZWN0KHRoaXMuY29uc3RydWN0aW5nLCBgZmx1c2hFbGVtZW50IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNvbnN0cnVjdGluZyBhbiBlbGVtZW50YCk7XG4gICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYXJlbnQsIGVsZW1lbnQsIHRoaXMubmV4dFNpYmxpbmcpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMucHVzaEVsZW1lbnQoZWxlbWVudCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYmxvY2soKS5vcGVuRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG4gICAgcHVzaFJlbW90ZUVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcgPSBudWxsKSB7XG4gICAgICAgIHRoaXMucHVzaEVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcpO1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBSZW1vdGVCbG9ja1RyYWNrZXIoZWxlbWVudCk7XG4gICAgICAgIHRoaXMucHVzaEJsb2NrVHJhY2tlcih0cmFja2VyLCB0cnVlKTtcbiAgICB9XG4gICAgcG9wUmVtb3RlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wb3BCbG9jaygpO1xuICAgICAgICB0aGlzLnBvcEVsZW1lbnQoKTtcbiAgICB9XG4gICAgcHVzaEVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaChlbGVtZW50KTtcbiAgICAgICAgLy8gTE9HR0VSLmRlYnVnKGAtPiBlbGVtZW50IHN0YWNrICR7dGhpcy5lbGVtZW50U3RhY2sudG9BcnJheSgpLm1hcChlID0+IGUudGFnTmFtZSkuam9pbignLCAnKX1gKTtcbiAgICAgICAgdGhpcy5uZXh0U2libGluZyA9IG5leHRTaWJsaW5nO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nU3RhY2sucHVzaChuZXh0U2libGluZyk7XG4gICAgfVxuICAgIG5ld0Rlc3Ryb3lhYmxlKGQpIHtcbiAgICAgICAgdGhpcy5ibG9jaygpLm5ld0Rlc3Ryb3lhYmxlKGQpO1xuICAgIH1cbiAgICBuZXdCb3VuZHMoYm91bmRzKSB7XG4gICAgICAgIHRoaXMuYmxvY2soKS5uZXdCb3VuZHMoYm91bmRzKTtcbiAgICB9XG4gICAgYXBwZW5kVGV4dChzdHJpbmcpIHtcbiAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdGV4dCA9IGRvbS5jcmVhdGVUZXh0Tm9kZShzdHJpbmcpO1xuICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgdGV4dCwgdGhpcy5uZXh0U2libGluZyk7XG4gICAgICAgIHRoaXMuYmxvY2soKS5uZXdOb2RlKHRleHQpO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgYXBwZW5kQ29tbWVudChzdHJpbmcpIHtcbiAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgY29tbWVudCA9IGRvbS5jcmVhdGVDb21tZW50KHN0cmluZyk7XG4gICAgICAgIGRvbS5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBjb21tZW50LCB0aGlzLm5leHRTaWJsaW5nKTtcbiAgICAgICAgdGhpcy5ibG9jaygpLm5ld05vZGUoY29tbWVudCk7XG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgIH1cbiAgICBzZXRTdGF0aWNBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXRTdGF0aWNBdHRyaWJ1dGUnKS5hZGRTdGF0aWNBdHRyaWJ1dGUodGhpcy5leHBlY3RDb25zdHJ1Y3RpbmcoJ3NldFN0YXRpY0F0dHJpYnV0ZScpLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIHNldFN0YXRpY0F0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXRTdGF0aWNBdHRyaWJ1dGVOUycpLmFkZFN0YXRpY0F0dHJpYnV0ZU5TKHRoaXMuZXhwZWN0Q29uc3RydWN0aW5nKCdzZXRTdGF0aWNBdHRyaWJ1dGVOUycpLCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgc2V0RHluYW1pY0F0dHJpYnV0ZShuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXREeW5hbWljQXR0cmlidXRlJykuYWRkRHluYW1pY0F0dHJpYnV0ZSh0aGlzLmV4cGVjdENvbnN0cnVjdGluZygnc2V0RHluYW1pY0F0dHJpYnV0ZScpLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpO1xuICAgIH1cbiAgICBzZXREeW5hbWljQXR0cmlidXRlTlMobmFtZXNwYWNlLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXREeW5hbWljQXR0cmlidXRlTlMnKS5hZGREeW5hbWljQXR0cmlidXRlTlModGhpcy5leHBlY3RDb25zdHJ1Y3RpbmcoJ3NldER5bmFtaWNBdHRyaWJ1dGVOUycpLCBuYW1lc3BhY2UsIG5hbWUsIHJlZmVyZW5jZSwgaXNUcnVzdGluZyk7XG4gICAgfVxuICAgIGNsb3NlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5ibG9jaygpLmNsb3NlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLnBvcEVsZW1lbnQoKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgU2ltcGxlQmxvY2tUcmFja2VyIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuZmlyc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmRlc3Ryb3lhYmxlcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmVzdGluZyA9IDA7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGxldCB7IGRlc3Ryb3lhYmxlcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKGRlc3Ryb3lhYmxlcyAmJiBkZXN0cm95YWJsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc3Ryb3lhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3lhYmxlc1tpXS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cbiAgICBmaXJzdE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpcnN0ICYmIHRoaXMuZmlyc3QuZmlyc3ROb2RlKCk7XG4gICAgfVxuICAgIGxhc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0ICYmIHRoaXMubGFzdC5sYXN0Tm9kZSgpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMubmV3Tm9kZShlbGVtZW50KTtcbiAgICAgICAgdGhpcy5uZXN0aW5nKys7XG4gICAgfVxuICAgIGNsb3NlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5uZXN0aW5nLS07XG4gICAgfVxuICAgIG5ld05vZGUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5uZXN0aW5nICE9PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5ldyBGaXJzdChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3QgPSBuZXcgTGFzdChub2RlKTtcbiAgICB9XG4gICAgbmV3Qm91bmRzKGJvdW5kcykge1xuICAgICAgICBpZiAodGhpcy5uZXN0aW5nICE9PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGJvdW5kcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3QgPSBib3VuZHM7XG4gICAgfVxuICAgIG5ld0Rlc3Ryb3lhYmxlKGQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95YWJsZXMgPSB0aGlzLmRlc3Ryb3lhYmxlcyB8fCBbXTtcbiAgICAgICAgdGhpcy5kZXN0cm95YWJsZXMucHVzaChkKTtcbiAgICB9XG4gICAgZmluYWxpemUoc3RhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpcnN0KSB7XG4gICAgICAgICAgICBzdGFjay5hcHBlbmRDb21tZW50KCcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFJlbW90ZUJsb2NrVHJhY2tlciBleHRlbmRzIFNpbXBsZUJsb2NrVHJhY2tlciB7XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBjbGVhcih0aGlzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVXBkYXRhYmxlQmxvY2tUcmFja2VyIGV4dGVuZHMgU2ltcGxlQmxvY2tUcmFja2VyIHtcbiAgICByZXNldChlbnYpIHtcbiAgICAgICAgbGV0IHsgZGVzdHJveWFibGVzIH0gPSB0aGlzO1xuICAgICAgICBpZiAoZGVzdHJveWFibGVzICYmIGRlc3Ryb3lhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzdHJveWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZW52LmRpZERlc3Ryb3koZGVzdHJveWFibGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFNpYmxpbmcgPSBjbGVhcih0aGlzKTtcbiAgICAgICAgdGhpcy5maXJzdCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdCA9IG51bGw7XG4gICAgICAgIHRoaXMuZGVzdHJveWFibGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXN0aW5nID0gMDtcbiAgICAgICAgcmV0dXJuIG5leHRTaWJsaW5nO1xuICAgIH1cbn1cbmNsYXNzIEJsb2NrTGlzdFRyYWNrZXIge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgYm91bmRMaXN0KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmJvdW5kTGlzdCA9IGJvdW5kTGlzdDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYm91bmRMaXN0ID0gYm91bmRMaXN0O1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmJvdW5kTGlzdC5mb3JFYWNoTm9kZShub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcbiAgICB9XG4gICAgcGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cbiAgICBmaXJzdE5vZGUoKSB7XG4gICAgICAgIGxldCBoZWFkID0gdGhpcy5ib3VuZExpc3QuaGVhZCgpO1xuICAgICAgICByZXR1cm4gaGVhZCAmJiBoZWFkLmZpcnN0Tm9kZSgpO1xuICAgIH1cbiAgICBsYXN0Tm9kZSgpIHtcbiAgICAgICAgbGV0IHRhaWwgPSB0aGlzLmJvdW5kTGlzdC50YWlsKCk7XG4gICAgICAgIHJldHVybiB0YWlsICYmIHRhaWwubGFzdE5vZGUoKTtcbiAgICB9XG4gICAgb3BlbkVsZW1lbnQoX2VsZW1lbnQpIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCAnQ2Fubm90IG9wZW5FbGVtZW50IGRpcmVjdGx5IGluc2lkZSBhIGJsb2NrIGxpc3QnKTtcbiAgICB9XG4gICAgY2xvc2VFbGVtZW50KCkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsICdDYW5ub3QgY2xvc2VFbGVtZW50IGRpcmVjdGx5IGluc2lkZSBhIGJsb2NrIGxpc3QnKTtcbiAgICB9XG4gICAgbmV3Tm9kZShfbm9kZSkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsICdDYW5ub3QgY3JlYXRlIGEgbmV3IG5vZGUgZGlyZWN0bHkgaW5zaWRlIGEgYmxvY2sgbGlzdCcpO1xuICAgIH1cbiAgICBuZXdCb3VuZHMoX2JvdW5kcykge31cbiAgICBuZXdEZXN0cm95YWJsZShfZCkge31cbiAgICBmaW5hbGl6ZShfc3RhY2spIHt9XG59Il19