ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
446 lines (354 loc) • 40.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UpdatableBlockTracker = exports.SimpleBlockTracker = exports.ElementStack = exports.Fragment = undefined;
var _bounds2 = require("./bounds");
var _util = require("@glimmer/util");
var _dom = require("./compiled/opcodes/dom");
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");
}
}
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;
}();
var Fragment = exports.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;
}();
var ElementStack = exports.ElementStack = function () {
function ElementStack(env, parentNode, nextSibling) {
_classCallCheck(this, ElementStack);
this.constructing = null;
this.operations = null;
this.elementStack = new _util.Stack();
this.nextSiblingStack = new _util.Stack();
this.blockStack = new _util.Stack();
this.env = env;
this.dom = env.getAppendOperations();
this.updateOperations = env.getDOM();
this.element = parentNode;
this.nextSibling = nextSibling;
this.defaultOperations = new _dom.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;
}();
var SimpleBlockTracker = exports.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);
(0, _bounds2.clear)(this);
};
return RemoteBlockTracker;
}(SimpleBlockTracker);
var UpdatableBlockTracker = exports.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 = (0, _bounds2.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) {
(0, _util.assert)(false, 'Cannot openElement directly inside a block list');
};
BlockListTracker.prototype.closeElement = function closeElement() {
(0, _util.assert)(false, 'Cannot closeElement directly inside a block list');
};
BlockListTracker.prototype.newNode = function newNode(_node) {
(0, _util.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9idWlsZGVyLmpzIl0sIm5hbWVzIjpbImNsZWFyIiwiU3RhY2siLCJhc3NlcnQiLCJTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyIsIkZpcnN0Iiwibm9kZSIsImZpcnN0Tm9kZSIsIkxhc3QiLCJsYXN0Tm9kZSIsIkZyYWdtZW50IiwiYm91bmRzIiwicGFyZW50RWxlbWVudCIsInVwZGF0ZSIsIkVsZW1lbnRTdGFjayIsImVudiIsInBhcmVudE5vZGUiLCJuZXh0U2libGluZyIsImNvbnN0cnVjdGluZyIsIm9wZXJhdGlvbnMiLCJlbGVtZW50U3RhY2siLCJuZXh0U2libGluZ1N0YWNrIiwiYmxvY2tTdGFjayIsImRvbSIsImdldEFwcGVuZE9wZXJhdGlvbnMiLCJ1cGRhdGVPcGVyYXRpb25zIiwiZ2V0RE9NIiwiZWxlbWVudCIsImRlZmF1bHRPcGVyYXRpb25zIiwicHVzaFNpbXBsZUJsb2NrIiwicHVzaCIsImZvckluaXRpYWxSZW5kZXIiLCJyZXN1bWUiLCJ0cmFja2VyIiwic3RhY2siLCJwdXNoQmxvY2tUcmFja2VyIiwiZXhwZWN0Q29uc3RydWN0aW5nIiwibWV0aG9kIiwiZXhwZWN0T3BlcmF0aW9ucyIsImJsb2NrIiwiY3VycmVudCIsInBvcEVsZW1lbnQiLCJ0b3BFbGVtZW50IiwicG9wIiwiU2ltcGxlQmxvY2tUcmFja2VyIiwicHVzaFVwZGF0YWJsZUJsb2NrIiwiVXBkYXRhYmxlQmxvY2tUcmFja2VyIiwiaXNSZW1vdGUiLCJuZXdEZXN0cm95YWJsZSIsIm5ld0JvdW5kcyIsInB1c2hCbG9ja0xpc3QiLCJsaXN0IiwiQmxvY2tMaXN0VHJhY2tlciIsInBvcEJsb2NrIiwiZmluYWxpemUiLCJvcGVuRWxlbWVudCIsInRhZyIsIl9vcGVyYXRpb25zIiwidW5kZWZpbmVkIiwiY3JlYXRlRWxlbWVudCIsImZsdXNoRWxlbWVudCIsInBhcmVudCIsImluc2VydEJlZm9yZSIsInB1c2hFbGVtZW50IiwicHVzaFJlbW90ZUVsZW1lbnQiLCJSZW1vdGVCbG9ja1RyYWNrZXIiLCJwb3BSZW1vdGVFbGVtZW50IiwiZCIsImFwcGVuZFRleHQiLCJzdHJpbmciLCJ0ZXh0IiwiY3JlYXRlVGV4dE5vZGUiLCJuZXdOb2RlIiwiYXBwZW5kQ29tbWVudCIsImNvbW1lbnQiLCJjcmVhdGVDb21tZW50Iiwic2V0U3RhdGljQXR0cmlidXRlIiwibmFtZSIsInZhbHVlIiwiYWRkU3RhdGljQXR0cmlidXRlIiwic2V0U3RhdGljQXR0cmlidXRlTlMiLCJuYW1lc3BhY2UiLCJhZGRTdGF0aWNBdHRyaWJ1dGVOUyIsInNldER5bmFtaWNBdHRyaWJ1dGUiLCJyZWZlcmVuY2UiLCJpc1RydXN0aW5nIiwiYWRkRHluYW1pY0F0dHJpYnV0ZSIsInNldER5bmFtaWNBdHRyaWJ1dGVOUyIsImFkZER5bmFtaWNBdHRyaWJ1dGVOUyIsImNsb3NlRWxlbWVudCIsImZpcnN0IiwibGFzdCIsImRlc3Ryb3lhYmxlcyIsIm5lc3RpbmciLCJkZXN0cm95IiwibGVuZ3RoIiwiaSIsInJlc2V0IiwiZGlkRGVzdHJveSIsImJvdW5kTGlzdCIsImZvckVhY2hOb2RlIiwiaGVhZCIsInRhaWwiLCJfZWxlbWVudCIsIl9ub2RlIiwiX2JvdW5kcyIsIl9kIiwiX3N0YWNrIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsQUFBUyxBQUFULEFBQXNCLEFBQXRCOztBQUNBLEFBQVMsQUFBVCxBQUFnQixBQUFoQixBQUFzQyxBQUF0Qzs7QUFDQSxBQUFTLEFBQVQsQUFBd0MsQUFBeEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFDTSxBLG9CQUNGO21CQUFZLEFBQVosTUFBa0I7OEJBQ2Q7O2FBQUssQUFBTCxPQUFZLEFBQVosQUFDSDs7O29CQUNELEEsaUNBQVksQUFDUjtlQUFPLEtBQUssQUFBWixBQUNIO0E7Ozs7O0lBRUMsQSxtQkFDRjtrQkFBWSxBQUFaLE1BQWtCOzhCQUNkOzthQUFLLEFBQUwsT0FBWSxBQUFaLEFBQ0g7OzttQkFDRCxBLCtCQUFXLEFBQ1A7ZUFBTyxLQUFLLEFBQVos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QUFDSDtBOzsrQkFDRCxBLHlDQUFnQixBQUNaO2VBQU8sS0FBSyxBQUFaLEFBQ0g7QTs7K0JBQ0QsQSxpQ0FBWSxBQUNSO1lBQUksT0FBTyxLQUFLLEFBQUwsVUFBZSxBQUFmLEFBQVgsQUFDQTtlQUFPLFFBQVEsS0FBSyxBQUFMLEFBQWYsQUFDSDtBOzsrQkFDRCxBLCtCQUFXLEFBQ1A7WUFBSSxPQUFPLEtBQUssQUFBTCxVQUFlLEFBQWYsQUFBWCxBQUNBO2VBQU8sUUFBUSxLQUFLLEFBQUwsQUFBZixBQUNIO0E7OytCQUNELEEsbUNBQVksQSxVQUFVLEFBQ2xCOzBCQUFPLEFBQVAsT0FBYyxBQUFkLEFBQ0g7QTs7K0JBQ0QsQSx1Q0FBZSxBQUNYOzBCQUFPLEFBQVAsT0FBYyxBQUFkLEFBQ0g7QTs7K0JBQ0QsQSwyQkFBUSxBLE9BQU8sQUFDWDswQkFBTyxBQUFQLE9BQWMsQUFBZCxBQUNIO0E7OytCQUNELEEsK0JBQVUsQSxTQUFTLEFBQUUsQzs7K0JBQ3JCLEEseUNBQWUsQSxJQUFJLEFBQUUsQzs7K0JBQ3JCLEEsNkJBQVMsQSxRQUFRLEFBQUUsQyIsImZpbGUiOiJsaWIvYnVpbGRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsZWFyIH0gZnJvbSAnLi9ib3VuZHMnO1xuaW1wb3J0IHsgU3RhY2ssIGFzc2VydCwgZXhwZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyB9IGZyb20gJy4vY29tcGlsZWQvb3Bjb2Rlcy9kb20nO1xuY2xhc3MgRmlyc3Qge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgZmlyc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlO1xuICAgIH1cbn1cbmNsYXNzIExhc3Qge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgbGFzdE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZyYWdtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihib3VuZHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxuICAgIHBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gICAgfVxuICAgIGZpcnN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmZpcnN0Tm9kZSgpO1xuICAgIH1cbiAgICBsYXN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmxhc3ROb2RlKCk7XG4gICAgfVxuICAgIHVwZGF0ZShib3VuZHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEVsZW1lbnRTdGFjayB7XG4gICAgY29uc3RydWN0b3IoZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZykge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuZWxlbWVudFN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMubmV4dFNpYmxpbmdTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLmJsb2NrU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuZG9tID0gZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcGVyYXRpb25zID0gZW52LmdldERPTSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBwYXJlbnROb2RlO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmc7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdGlvbnMgPSBuZXcgU2ltcGxlRWxlbWVudE9wZXJhdGlvbnMoZW52KTtcbiAgICAgICAgdGhpcy5wdXNoU2ltcGxlQmxvY2soKTtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nU3RhY2sucHVzaCh0aGlzLm5leHRTaWJsaW5nKTtcbiAgICB9XG4gICAgc3RhdGljIGZvckluaXRpYWxSZW5kZXIoZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRTdGFjayhlbnYsIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nKTtcbiAgICB9XG4gICAgc3RhdGljIHJlc3VtZShlbnYsIHRyYWNrZXIsIG5leHRTaWJsaW5nKSB7XG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdHJhY2tlci5wYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIGxldCBzdGFjayA9IG5ldyBFbGVtZW50U3RhY2soZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZyk7XG4gICAgICAgIHN0YWNrLnB1c2hCbG9ja1RyYWNrZXIodHJhY2tlcik7XG4gICAgICAgIHJldHVybiBzdGFjaztcbiAgICB9XG4gICAgZXhwZWN0Q29uc3RydWN0aW5nKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMuY29uc3RydWN0aW5nLCBgJHttZXRob2R9IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZSBjb25zdHJ1Y3RpbmcgYW4gZWxlbWVudGApO1xuICAgIH1cbiAgICBleHBlY3RPcGVyYXRpb25zKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMub3BlcmF0aW9ucywgYCR7bWV0aG9kfSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUgY29uc3RydWN0aW5nIGFuIGVsZW1lbnRgKTtcbiAgICB9XG4gICAgYmxvY2soKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQsIFwiRXhwZWN0ZWQgYSBjdXJyZW50IGJsb2NrIHRyYWNrZXJcIik7XG4gICAgfVxuICAgIHBvcEVsZW1lbnQoKSB7XG4gICAgICAgIGxldCB7IGVsZW1lbnRTdGFjaywgbmV4dFNpYmxpbmdTdGFjayB9ID0gdGhpcztcbiAgICAgICAgbGV0IHRvcEVsZW1lbnQgPSBlbGVtZW50U3RhY2sucG9wKCk7XG4gICAgICAgIG5leHRTaWJsaW5nU3RhY2sucG9wKCk7XG4gICAgICAgIC8vIExPR0dFUi5kZWJ1ZyhgLT4gZWxlbWVudCBzdGFjayAke3RoaXMuZWxlbWVudFN0YWNrLnRvQXJyYXkoKS5tYXAoZSA9PiBlLnRhZ05hbWUpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGV4cGVjdChlbGVtZW50U3RhY2suY3VycmVudCwgXCJjYW4ndCBwb3AgcGFzdCB0aGUgbGFzdCBlbGVtZW50XCIpO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmdTdGFjay5jdXJyZW50O1xuICAgICAgICByZXR1cm4gdG9wRWxlbWVudDtcbiAgICB9XG4gICAgcHVzaFNpbXBsZUJsb2NrKCkge1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBTaW1wbGVCbG9ja1RyYWNrZXIodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wdXNoQmxvY2tUcmFja2VyKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaFVwZGF0YWJsZUJsb2NrKCkge1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBVcGRhdGFibGVCbG9ja1RyYWNrZXIodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wdXNoQmxvY2tUcmFja2VyKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaEJsb2NrVHJhY2tlcih0cmFja2VyLCBpc1JlbW90ZSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQ7XG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjdXJyZW50Lm5ld0Rlc3Ryb3lhYmxlKHRyYWNrZXIpO1xuICAgICAgICAgICAgaWYgKCFpc1JlbW90ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQubmV3Qm91bmRzKHRyYWNrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmxvY2tTdGFjay5wdXNoKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaEJsb2NrTGlzdChsaXN0KSB7XG4gICAgICAgIGxldCB0cmFja2VyID0gbmV3IEJsb2NrTGlzdFRyYWNrZXIodGhpcy5lbGVtZW50LCBsaXN0KTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmJsb2NrU3RhY2suY3VycmVudDtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnQubmV3RGVzdHJveWFibGUodHJhY2tlcik7XG4gICAgICAgICAgICBjdXJyZW50Lm5ld0JvdW5kcyh0cmFja2VyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJsb2NrU3RhY2sucHVzaCh0cmFja2VyKTtcbiAgICAgICAgcmV0dXJuIHRyYWNrZXI7XG4gICAgfVxuICAgIHBvcEJsb2NrKCkge1xuICAgICAgICB0aGlzLmJsb2NrKCkuZmluYWxpemUodGhpcyk7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLnBvcCgpLCBcIkV4cGVjdGVkIHBvcEJsb2NrIHRvIHJldHVybiBhIGJsb2NrXCIpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudCh0YWcsIF9vcGVyYXRpb25zKSB7XG4gICAgICAgIC8vIHdvcmthcm91bmQgYXJndW1lbnQubGVuZ3RoIHRyYW5zcGlsZSBvZiBhcmcgaW5pdGlhbGl6ZXJcbiAgICAgICAgbGV0IG9wZXJhdGlvbnMgPSBfb3BlcmF0aW9ucyA9PT0gdW5kZWZpbmVkID8gdGhpcy5kZWZhdWx0T3BlcmF0aW9ucyA6IF9vcGVyYXRpb25zO1xuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQodGFnLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBmbHVzaEVsZW1lbnQoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtZW50ID0gZXhwZWN0KHRoaXMuY29uc3RydWN0aW5nLCBgZmx1c2hFbGVtZW50IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNvbnN0cnVjdGluZyBhbiBlbGVtZW50YCk7XG4gICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYXJlbnQsIGVsZW1lbnQsIHRoaXMubmV4dFNpYmxpbmcpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMucHVzaEVsZW1lbnQoZWxlbWVudCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYmxvY2soKS5vcGVuRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG4gICAgcHVzaFJlbW90ZUVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcgPSBudWxsKSB7XG4gICAgICAgIHRoaXMucHVzaEVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcpO1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBSZW1vdGVCbG9ja1RyYWNrZXIoZWxlbWVudCk7XG4gICAgICAgIHRoaXMucHVzaEJsb2NrVHJhY2tlcih0cmFja2VyLCB0cnVlKTtcbiAgICB9XG4gICAgcG9wUmVtb3RlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wb3BCbG9jaygpO1xuICAgICAgICB0aGlzLnBvcEVsZW1lbnQoKTtcbiAgICB9XG4gICAgcHVzaEVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaChlbGVtZW50KTtcbiAgICAgICAgLy8gTE9HR0VSLmRlYnVnKGAtPiBlbGVtZW50IHN0YWNrICR7dGhpcy5lbGVtZW50U3RhY2sudG9BcnJheSgpLm1hcChlID0+IGUudGFnTmFtZSkuam9pbignLCAnKX1gKTtcbiAgICAgICAgdGhpcy5uZXh0U2libGluZyA9IG5leHRTaWJsaW5nO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nU3RhY2sucHVzaChuZXh0U2libGluZyk7XG4gICAgfVxuICAgIG5ld0Rlc3Ryb3lhYmxlKGQpIHtcbiAgICAgICAgdGhpcy5ibG9jaygpLm5ld0Rlc3Ryb3lhYmxlKGQpO1xuICAgIH1cbiAgICBuZXdCb3VuZHMoYm91bmRzKSB7XG4gICAgICAgIHRoaXMuYmxvY2soKS5uZXdCb3VuZHMoYm91bmRzKTtcbiAgICB9XG4gICAgYXBwZW5kVGV4dChzdHJpbmcpIHtcbiAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdGV4dCA9IGRvbS5jcmVhdGVUZXh0Tm9kZShzdHJpbmcpO1xuICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgdGV4dCwgdGhpcy5uZXh0U2libGluZyk7XG4gICAgICAgIHRoaXMuYmxvY2soKS5uZXdOb2RlKHRleHQpO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgYXBwZW5kQ29tbWVudChzdHJpbmcpIHtcbiAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgY29tbWVudCA9IGRvbS5jcmVhdGVDb21tZW50KHN0cmluZyk7XG4gICAgICAgIGRvbS5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBjb21tZW50LCB0aGlzLm5leHRTaWJsaW5nKTtcbiAgICAgICAgdGhpcy5ibG9jaygpLm5ld05vZGUoY29tbWVudCk7XG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgIH1cbiAgICBzZXRTdGF0aWNBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXRTdGF0aWNBdHRyaWJ1dGUnKS5hZGRTdGF0aWNBdHRyaWJ1dGUodGhpcy5leHBlY3RDb25zdHJ1Y3RpbmcoJ3NldFN0YXRpY0F0dHJpYnV0ZScpLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIHNldFN0YXRpY0F0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXRTdGF0aWNBdHRyaWJ1dGVOUycpLmFkZFN0YXRpY0F0dHJpYnV0ZU5TKHRoaXMuZXhwZWN0Q29uc3RydWN0aW5nKCdzZXRTdGF0aWNBdHRyaWJ1dGVOUycpLCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgc2V0RHluYW1pY0F0dHJpYnV0ZShuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXREeW5hbWljQXR0cmlidXRlJykuYWRkRHluYW1pY0F0dHJpYnV0ZSh0aGlzLmV4cGVjdENvbnN0cnVjdGluZygnc2V0RHluYW1pY0F0dHJpYnV0ZScpLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpO1xuICAgIH1cbiAgICBzZXREeW5hbWljQXR0cmlidXRlTlMobmFtZXNwYWNlLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXREeW5hbWljQXR0cmlidXRlTlMnKS5hZGREeW5hbWljQXR0cmlidXRlTlModGhpcy5leHBlY3RDb25zdHJ1Y3RpbmcoJ3NldER5bmFtaWNBdHRyaWJ1dGVOUycpLCBuYW1lc3BhY2UsIG5hbWUsIHJlZmVyZW5jZSwgaXNUcnVzdGluZyk7XG4gICAgfVxuICAgIGNsb3NlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5ibG9jaygpLmNsb3NlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLnBvcEVsZW1lbnQoKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgU2ltcGxlQmxvY2tUcmFja2VyIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuZmlyc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmRlc3Ryb3lhYmxlcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmVzdGluZyA9IDA7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGxldCB7IGRlc3Ryb3lhYmxlcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKGRlc3Ryb3lhYmxlcyAmJiBkZXN0cm95YWJsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc3Ryb3lhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3lhYmxlc1tpXS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cbiAgICBmaXJzdE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpcnN0ICYmIHRoaXMuZmlyc3QuZmlyc3ROb2RlKCk7XG4gICAgfVxuICAgIGxhc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0ICYmIHRoaXMubGFzdC5sYXN0Tm9kZSgpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMubmV3Tm9kZShlbGVtZW50KTtcbiAgICAgICAgdGhpcy5uZXN0aW5nKys7XG4gICAgfVxuICAgIGNsb3NlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5uZXN0aW5nLS07XG4gICAgfVxuICAgIG5ld05vZGUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5uZXN0aW5nICE9PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5ldyBGaXJzdChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3QgPSBuZXcgTGFzdChub2RlKTtcbiAgICB9XG4gICAgbmV3Qm91bmRzKGJvdW5kcykge1xuICAgICAgICBpZiAodGhpcy5uZXN0aW5nICE9PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGJvdW5kcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3QgPSBib3VuZHM7XG4gICAgfVxuICAgIG5ld0Rlc3Ryb3lhYmxlKGQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95YWJsZXMgPSB0aGlzLmRlc3Ryb3lhYmxlcyB8fCBbXTtcbiAgICAgICAgdGhpcy5kZXN0cm95YWJsZXMucHVzaChkKTtcbiAgICB9XG4gICAgZmluYWxpemUoc3RhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpcnN0KSB7XG4gICAgICAgICAgICBzdGFjay5hcHBlbmRDb21tZW50KCcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFJlbW90ZUJsb2NrVHJhY2tlciBleHRlbmRzIFNpbXBsZUJsb2NrVHJhY2tlciB7XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBjbGVhcih0aGlzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVXBkYXRhYmxlQmxvY2tUcmFja2VyIGV4dGVuZHMgU2ltcGxlQmxvY2tUcmFja2VyIHtcbiAgICByZXNldChlbnYpIHtcbiAgICAgICAgbGV0IHsgZGVzdHJveWFibGVzIH0gPSB0aGlzO1xuICAgICAgICBpZiAoZGVzdHJveWFibGVzICYmIGRlc3Ryb3lhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzdHJveWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZW52LmRpZERlc3Ryb3koZGVzdHJveWFibGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFNpYmxpbmcgPSBjbGVhcih0aGlzKTtcbiAgICAgICAgdGhpcy5maXJzdCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdCA9IG51bGw7XG4gICAgICAgIHRoaXMuZGVzdHJveWFibGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXN0aW5nID0gMDtcbiAgICAgICAgcmV0dXJuIG5leHRTaWJsaW5nO1xuICAgIH1cbn1cbmNsYXNzIEJsb2NrTGlzdFRyYWNrZXIge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgYm91bmRMaXN0KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmJvdW5kTGlzdCA9IGJvdW5kTGlzdDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYm91bmRMaXN0ID0gYm91bmRMaXN0O1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmJvdW5kTGlzdC5mb3JFYWNoTm9kZShub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcbiAgICB9XG4gICAgcGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cbiAgICBmaXJzdE5vZGUoKSB7XG4gICAgICAgIGxldCBoZWFkID0gdGhpcy5ib3VuZExpc3QuaGVhZCgpO1xuICAgICAgICByZXR1cm4gaGVhZCAmJiBoZWFkLmZpcnN0Tm9kZSgpO1xuICAgIH1cbiAgICBsYXN0Tm9kZSgpIHtcbiAgICAgICAgbGV0IHRhaWwgPSB0aGlzLmJvdW5kTGlzdC50YWlsKCk7XG4gICAgICAgIHJldHVybiB0YWlsICYmIHRhaWwubGFzdE5vZGUoKTtcbiAgICB9XG4gICAgb3BlbkVsZW1lbnQoX2VsZW1lbnQpIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCAnQ2Fubm90IG9wZW5FbGVtZW50IGRpcmVjdGx5IGluc2lkZSBhIGJsb2NrIGxpc3QnKTtcbiAgICB9XG4gICAgY2xvc2VFbGVtZW50KCkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsICdDYW5ub3QgY2xvc2VFbGVtZW50IGRpcmVjdGx5IGluc2lkZSBhIGJsb2NrIGxpc3QnKTtcbiAgICB9XG4gICAgbmV3Tm9kZShfbm9kZSkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsICdDYW5ub3QgY3JlYXRlIGEgbmV3IG5vZGUgZGlyZWN0bHkgaW5zaWRlIGEgYmxvY2sgbGlzdCcpO1xuICAgIH1cbiAgICBuZXdCb3VuZHMoX2JvdW5kcykge31cbiAgICBuZXdEZXN0cm95YWJsZShfZCkge31cbiAgICBmaW5hbGl6ZShfc3RhY2spIHt9XG59Il19