ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
276 lines (266 loc) • 32 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ListBlockOpcode = exports.TryOpcode = exports.BlockOpcode = undefined;
var _bounds = require('../bounds');
var _builder = require('../builder');
var _util = require('@glimmer/util');
var _reference = require('@glimmer/reference');
var _opcodes = require('../opcodes');
var _append = require('./append');
var _append2 = _interopRequireDefault(_append);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
class UpdatingVM {
constructor(env, { alwaysRevalidate = false }) {
this.frameStack = new _util.Stack();
this.env = env;
this.constants = env.program.constants;
this.dom = env.getDOM();
this.alwaysRevalidate = alwaysRevalidate;
}
execute(opcodes, handler) {
let { frameStack } = this;
this.try(opcodes, handler);
while (true) {
if (frameStack.isEmpty()) break;
let opcode = this.frame.nextStatement();
if (opcode === null) {
this.frameStack.pop();
continue;
}
opcode.evaluate(this);
}
}
get frame() {
return (0, _util.expect)(this.frameStack.current, 'bug: expected a frame');
}
goto(op) {
this.frame.goto(op);
}
try(ops, handler) {
this.frameStack.push(new UpdatingVMFrame(this, ops, handler));
}
throw() {
this.frame.handleException();
this.frameStack.pop();
}
evaluateOpcode(opcode) {
opcode.evaluate(this);
}
}
exports.default = UpdatingVM;
class BlockOpcode extends _opcodes.UpdatingOpcode {
constructor(start, state, bounds, children) {
super();
this.start = start;
this.type = "block";
this.next = null;
this.prev = null;
let { env, scope, dynamicScope, stack } = state;
this.children = children;
this.env = env;
this.scope = scope;
this.dynamicScope = dynamicScope;
this.stack = stack;
this.bounds = bounds;
}
parentElement() {
return this.bounds.parentElement();
}
firstNode() {
return this.bounds.firstNode();
}
lastNode() {
return this.bounds.lastNode();
}
evaluate(vm) {
vm.try(this.children, null);
}
destroy() {
this.bounds.destroy();
}
didDestroy() {
this.env.didDestroy(this.bounds);
}
toJSON() {
let details = (0, _util.dict)();
details["guid"] = `${this._guid}`;
return {
guid: this._guid,
type: this.type,
details,
children: this.children.toArray().map(op => op.toJSON())
};
}
}
exports.BlockOpcode = BlockOpcode;
class TryOpcode extends BlockOpcode {
constructor(start, state, bounds, children) {
super(start, state, bounds, children);
this.type = "try";
this.tag = this._tag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);
}
didInitializeChildren() {
this._tag.inner.update((0, _reference.combineSlice)(this.children));
}
evaluate(vm) {
vm.try(this.children, this);
}
handleException() {
let { env, bounds, children, scope, dynamicScope, start, stack, prev, next } = this;
children.clear();
let elementStack = _builder.ElementStack.resume(env, bounds, bounds.reset(env));
let vm = new _append2.default(env, scope, dynamicScope, elementStack);
let updating = new _util.LinkedList();
vm.execute(start, vm => {
vm.stack = _append.EvaluationStack.restore(stack);
vm.updatingOpcodeStack.push(updating);
vm.updateWith(this);
vm.updatingOpcodeStack.push(children);
});
this.prev = prev;
this.next = next;
}
toJSON() {
let json = super.toJSON();
let details = json["details"];
if (!details) {
details = json["details"] = {};
}
return super.toJSON();
}
}
exports.TryOpcode = TryOpcode;
class ListRevalidationDelegate {
constructor(opcode, marker) {
this.opcode = opcode;
this.marker = marker;
this.didInsert = false;
this.didDelete = false;
this.map = opcode.map;
this.updating = opcode['children'];
}
insert(key, item, memo, before) {
let { map, opcode, updating } = this;
let nextSibling = null;
let reference = null;
if (before) {
reference = map[before];
nextSibling = reference['bounds'].firstNode();
} else {
nextSibling = this.marker;
}
let vm = opcode.vmForInsertion(nextSibling);
let tryOpcode = null;
let { start } = opcode;
vm.execute(start, vm => {
map[key] = tryOpcode = vm.iterate(memo, item);
vm.updatingOpcodeStack.push(new _util.LinkedList());
vm.updateWith(tryOpcode);
vm.updatingOpcodeStack.push(tryOpcode.children);
});
updating.insertBefore(tryOpcode, reference);
this.didInsert = true;
}
retain(_key, _item, _memo) {}
move(key, _item, _memo, before) {
let { map, updating } = this;
let entry = map[key];
let reference = map[before] || null;
if (before) {
(0, _bounds.move)(entry, reference.firstNode());
} else {
(0, _bounds.move)(entry, this.marker);
}
updating.remove(entry);
updating.insertBefore(entry, reference);
}
delete(key) {
let { map } = this;
let opcode = map[key];
opcode.didDestroy();
(0, _bounds.clear)(opcode);
this.updating.remove(opcode);
delete map[key];
this.didDelete = true;
}
done() {
this.opcode.didInitializeChildren(this.didInsert || this.didDelete);
}
}
class ListBlockOpcode extends BlockOpcode {
constructor(start, state, bounds, children, artifacts) {
super(start, state, bounds, children);
this.type = "list-block";
this.map = (0, _util.dict)();
this.lastIterated = _reference.INITIAL;
this.artifacts = artifacts;
let _tag = this._tag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);
this.tag = (0, _reference.combine)([artifacts.tag, _tag]);
}
didInitializeChildren(listDidChange = true) {
this.lastIterated = this.artifacts.tag.value();
if (listDidChange) {
this._tag.inner.update((0, _reference.combineSlice)(this.children));
}
}
evaluate(vm) {
let { artifacts, lastIterated } = this;
if (!artifacts.tag.validate(lastIterated)) {
let { bounds } = this;
let { dom } = vm;
let marker = dom.createComment('');
dom.insertAfter(bounds.parentElement(), marker, (0, _util.expect)(bounds.lastNode(), "can't insert after an empty bounds"));
let target = new ListRevalidationDelegate(this, marker);
let synchronizer = new _reference.IteratorSynchronizer({ target, artifacts });
synchronizer.sync();
this.parentElement().removeChild(marker);
}
// Run now-updated updating opcodes
super.evaluate(vm);
}
vmForInsertion(nextSibling) {
let { env, scope, dynamicScope } = this;
let elementStack = _builder.ElementStack.forInitialRender(this.env, this.bounds.parentElement(), nextSibling);
return new _append2.default(env, scope, dynamicScope, elementStack);
}
toJSON() {
let json = super.toJSON();
let map = this.map;
let inner = Object.keys(map).map(key => {
return `${JSON.stringify(key)}: ${map[key]._guid}`;
}).join(", ");
let details = json["details"];
if (!details) {
details = json["details"] = {};
}
details["map"] = `{${inner}}`;
return json;
}
}
exports.ListBlockOpcode = ListBlockOpcode;
class UpdatingVMFrame {
constructor(vm, ops, exceptionHandler) {
this.vm = vm;
this.ops = ops;
this.exceptionHandler = exceptionHandler;
this.vm = vm;
this.ops = ops;
this.current = ops.head();
}
goto(op) {
this.current = op;
}
nextStatement() {
let { current, ops } = this;
if (current) this.current = ops.nextNode(current);
return current;
}
handleException() {
if (this.exceptionHandler) {
this.exceptionHandler.handleException();
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92bS91cGRhdGUuanMiXSwibmFtZXMiOlsiVXBkYXRpbmdWTSIsImNvbnN0cnVjdG9yIiwiZW52IiwiYWx3YXlzUmV2YWxpZGF0ZSIsImZyYW1lU3RhY2siLCJjb25zdGFudHMiLCJwcm9ncmFtIiwiZG9tIiwiZ2V0RE9NIiwiZXhlY3V0ZSIsIm9wY29kZXMiLCJoYW5kbGVyIiwidHJ5IiwiaXNFbXB0eSIsIm9wY29kZSIsImZyYW1lIiwibmV4dFN0YXRlbWVudCIsInBvcCIsImV2YWx1YXRlIiwiY3VycmVudCIsImdvdG8iLCJvcCIsIm9wcyIsInB1c2giLCJVcGRhdGluZ1ZNRnJhbWUiLCJ0aHJvdyIsImhhbmRsZUV4Y2VwdGlvbiIsImV2YWx1YXRlT3Bjb2RlIiwiQmxvY2tPcGNvZGUiLCJzdGFydCIsInN0YXRlIiwiYm91bmRzIiwiY2hpbGRyZW4iLCJ0eXBlIiwibmV4dCIsInByZXYiLCJzY29wZSIsImR5bmFtaWNTY29wZSIsInN0YWNrIiwicGFyZW50RWxlbWVudCIsImZpcnN0Tm9kZSIsImxhc3ROb2RlIiwidm0iLCJkZXN0cm95IiwiZGlkRGVzdHJveSIsInRvSlNPTiIsImRldGFpbHMiLCJfZ3VpZCIsImd1aWQiLCJ0b0FycmF5IiwibWFwIiwiVHJ5T3Bjb2RlIiwidGFnIiwiX3RhZyIsImNyZWF0ZSIsImRpZEluaXRpYWxpemVDaGlsZHJlbiIsImlubmVyIiwidXBkYXRlIiwiY2xlYXIiLCJlbGVtZW50U3RhY2siLCJyZXN1bWUiLCJyZXNldCIsInVwZGF0aW5nIiwicmVzdG9yZSIsInVwZGF0aW5nT3Bjb2RlU3RhY2siLCJ1cGRhdGVXaXRoIiwianNvbiIsIkxpc3RSZXZhbGlkYXRpb25EZWxlZ2F0ZSIsIm1hcmtlciIsImRpZEluc2VydCIsImRpZERlbGV0ZSIsImluc2VydCIsImtleSIsIml0ZW0iLCJtZW1vIiwiYmVmb3JlIiwibmV4dFNpYmxpbmciLCJyZWZlcmVuY2UiLCJ2bUZvckluc2VydGlvbiIsInRyeU9wY29kZSIsIml0ZXJhdGUiLCJpbnNlcnRCZWZvcmUiLCJyZXRhaW4iLCJfa2V5IiwiX2l0ZW0iLCJfbWVtbyIsIm1vdmUiLCJlbnRyeSIsInJlbW92ZSIsImRlbGV0ZSIsImRvbmUiLCJMaXN0QmxvY2tPcGNvZGUiLCJhcnRpZmFjdHMiLCJsYXN0SXRlcmF0ZWQiLCJsaXN0RGlkQ2hhbmdlIiwidmFsdWUiLCJ2YWxpZGF0ZSIsImNyZWF0ZUNvbW1lbnQiLCJpbnNlcnRBZnRlciIsInRhcmdldCIsInN5bmNocm9uaXplciIsInN5bmMiLCJyZW1vdmVDaGlsZCIsImZvckluaXRpYWxSZW5kZXIiLCJPYmplY3QiLCJrZXlzIiwiSlNPTiIsInN0cmluZ2lmeSIsImpvaW4iLCJleGNlcHRpb25IYW5kbGVyIiwiaGVhZCIsIm5leHROb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7Ozs7OztBQUNlLE1BQU1BLFVBQU4sQ0FBaUI7QUFDNUJDLGdCQUFZQyxHQUFaLEVBQWlCLEVBQUVDLG1CQUFtQixLQUFyQixFQUFqQixFQUErQztBQUMzQyxhQUFLQyxVQUFMLEdBQWtCLGlCQUFsQjtBQUNBLGFBQUtGLEdBQUwsR0FBV0EsR0FBWDtBQUNBLGFBQUtHLFNBQUwsR0FBaUJILElBQUlJLE9BQUosQ0FBWUQsU0FBN0I7QUFDQSxhQUFLRSxHQUFMLEdBQVdMLElBQUlNLE1BQUosRUFBWDtBQUNBLGFBQUtMLGdCQUFMLEdBQXdCQSxnQkFBeEI7QUFDSDtBQUNETSxZQUFRQyxPQUFSLEVBQWlCQyxPQUFqQixFQUEwQjtBQUN0QixZQUFJLEVBQUVQLFVBQUYsS0FBaUIsSUFBckI7QUFDQSxhQUFLUSxHQUFMLENBQVNGLE9BQVQsRUFBa0JDLE9BQWxCO0FBQ0EsZUFBTyxJQUFQLEVBQWE7QUFDVCxnQkFBSVAsV0FBV1MsT0FBWCxFQUFKLEVBQTBCO0FBQzFCLGdCQUFJQyxTQUFTLEtBQUtDLEtBQUwsQ0FBV0MsYUFBWCxFQUFiO0FBQ0EsZ0JBQUlGLFdBQVcsSUFBZixFQUFxQjtB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Q0FFSixJQUZJLENBQVo7QUFHQSxZQUFJOUQsVUFBVW9CLEtBQUssU0FBTCxDQUFkO0FBQ0EsWUFBSSxDQUFDcEIsT0FBTCxFQUFjO0FBQ1ZBLHNCQUFVb0IsS0FBSyxTQUFMLElBQWtCLEVBQTVCO0FBQ0g7QUFDRHBCLGdCQUFRLEtBQVIsSUFBa0IsSUFBR1UsS0FBTSxHQUEzQjtBQUNBLGVBQU9VLElBQVA7QUFDSDtBQWhENEM7UUFBcEN5QixlLEdBQUFBLGU7QUFrRGIsTUFBTW5FLGVBQU4sQ0FBc0I7QUFDbEJ2QixnQkFBWXlDLEVBQVosRUFBZ0JwQixHQUFoQixFQUFxQnVGLGdCQUFyQixFQUF1QztBQUNuQyxhQUFLbkUsRUFBTCxHQUFVQSxFQUFWO0FBQ0EsYUFBS3BCLEdBQUwsR0FBV0EsR0FBWDtBQUNBLGFBQUt1RixnQkFBTCxHQUF3QkEsZ0JBQXhCO0FBQ0EsYUFBS25FLEVBQUwsR0FBVUEsRUFBVjtBQUNBLGFBQUtwQixHQUFMLEdBQVdBLEdBQVg7QUFDQSxhQUFLSCxPQUFMLEdBQWVHLElBQUl3RixJQUFKLEVBQWY7QUFDSDtBQUNEMUYsU0FBS0MsRUFBTCxFQUFTO0FBQ0wsYUFBS0YsT0FBTCxHQUFlRSxFQUFmO0FBQ0g7QUFDREwsb0JBQWdCO0FBQ1osWUFBSSxFQUFFRyxPQUFGLEVBQVdHLEdBQVgsS0FBbUIsSUFBdkI7QUFDQSxZQUFJSCxPQUFKLEVBQWEsS0FBS0EsT0FBTCxHQUFlRyxJQUFJeUYsUUFBSixDQUFhNUYsT0FBYixDQUFmO0FBQ2IsZUFBT0EsT0FBUDtBQUNIO0FBQ0RPLHNCQUFrQjtBQUNkLFlBQUksS0FBS21GLGdCQUFULEVBQTJCO0FBQ3ZCLGlCQUFLQSxnQkFBTCxDQUFzQm5GLGVBQXRCO0FBQ0g7QUFDSjtBQXJCaUIiLCJmaWxlIjoibGliL3ZtL3VwZGF0ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsZWFyLCBtb3ZlIGFzIG1vdmVCb3VuZHMgfSBmcm9tICcuLi9ib3VuZHMnO1xuaW1wb3J0IHsgRWxlbWVudFN0YWNrIH0gZnJvbSAnLi4vYnVpbGRlcic7XG5pbXBvcnQgeyBTdGFjaywgTGlua2VkTGlzdCwgZGljdCwgZXhwZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBJdGVyYXRvclN5bmNocm9uaXplcixcbi8vIFRhZ3NcbmNvbWJpbmUsIFVwZGF0YWJsZVRhZywgY29tYmluZVNsaWNlLCBDT05TVEFOVF9UQUcsIElOSVRJQUwgfSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgVXBkYXRpbmdPcGNvZGUgfSBmcm9tICcuLi9vcGNvZGVzJztcbmltcG9ydCBWTSwgeyBFdmFsdWF0aW9uU3RhY2sgfSBmcm9tICcuL2FwcGVuZCc7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVcGRhdGluZ1ZNIHtcbiAgICBjb25zdHJ1Y3RvcihlbnYsIHsgYWx3YXlzUmV2YWxpZGF0ZSA9IGZhbHNlIH0pIHtcbiAgICAgICAgdGhpcy5mcmFtZVN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMuZW52ID0gZW52O1xuICAgICAgICB0aGlzLmNvbnN0YW50cyA9IGVudi5wcm9ncmFtLmNvbnN0YW50cztcbiAgICAgICAgdGhpcy5kb20gPSBlbnYuZ2V0RE9NKCk7XG4gICAgICAgIHRoaXMuYWx3YXlzUmV2YWxpZGF0ZSA9IGFsd2F5c1JldmFsaWRhdGU7XG4gICAgfVxuICAgIGV4ZWN1dGUob3Bjb2RlcywgaGFuZGxlcikge1xuICAgICAgICBsZXQgeyBmcmFtZVN0YWNrIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLnRyeShvcGNvZGVzLCBoYW5kbGVyKTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGlmIChmcmFtZVN0YWNrLmlzRW1wdHkoKSkgYnJlYWs7XG4gICAgICAgICAgICBsZXQgb3Bjb2RlID0gdGhpcy5mcmFtZS5uZXh0U3RhdGVtZW50KCk7XG4gICAgICAgICAgICBpZiAob3Bjb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZVN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3Bjb2RlLmV2YWx1YXRlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBmcmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdCh0aGlzLmZyYW1lU3RhY2suY3VycmVudCwgJ2J1ZzogZXhwZWN0ZWQgYSBmcmFtZScpO1xuICAgIH1cbiAgICBnb3RvKG9wKSB7XG4gICAgICAgIHRoaXMuZnJhbWUuZ290byhvcCk7XG4gICAgfVxuICAgIHRyeShvcHMsIGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5mcmFtZVN0YWNrLnB1c2gobmV3IFVwZGF0aW5nVk1GcmFtZSh0aGlzLCBvcHMsIGhhbmRsZXIpKTtcbiAgICB9XG4gICAgdGhyb3coKSB7XG4gICAgICAgIHRoaXMuZnJhbWUuaGFuZGxlRXhjZXB0aW9uKCk7XG4gICAgICAgIHRoaXMuZnJhbWVTdGFjay5wb3AoKTtcbiAgICB9XG4gICAgZXZhbHVhdGVPcGNvZGUob3Bjb2RlKSB7XG4gICAgICAgIG9wY29kZS5ldmFsdWF0ZSh0aGlzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQmxvY2tPcGNvZGUgZXh0ZW5kcyBVcGRhdGluZ09wY29kZSB7XG4gICAgY29uc3RydWN0b3Ioc3RhcnQsIHN0YXRlLCBib3VuZHMsIGNoaWxkcmVuKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy50eXBlID0gXCJibG9ja1wiO1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgICAgICBsZXQgeyBlbnYsIHNjb3BlLCBkeW5hbWljU2NvcGUsIHN0YWNrIH0gPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLmVudiA9IGVudjtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLmR5bmFtaWNTY29wZSA9IGR5bmFtaWNTY29wZTtcbiAgICAgICAgdGhpcy5zdGFjayA9IHN0YWNrO1xuICAgICAgICB0aGlzLmJvdW5kcyA9IGJvdW5kcztcbiAgICB9XG4gICAgcGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLnBhcmVudEVsZW1lbnQoKTtcbiAgICB9XG4gICAgZmlyc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3VuZHMuZmlyc3ROb2RlKCk7XG4gICAgfVxuICAgIGxhc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3VuZHMubGFzdE5vZGUoKTtcbiAgICB9XG4gICAgZXZhbHVhdGUodm0pIHtcbiAgICAgICAgdm0udHJ5KHRoaXMuY2hpbGRyZW4sIG51bGwpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmJvdW5kcy5kZXN0cm95KCk7XG4gICAgfVxuICAgIGRpZERlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZW52LmRpZERlc3Ryb3kodGhpcy5ib3VuZHMpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBkZXRhaWxzID0gZGljdCgpO1xuICAgICAgICBkZXRhaWxzW1wiZ3VpZFwiXSA9IGAke3RoaXMuX2d1aWR9YDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGd1aWQ6IHRoaXMuX2d1aWQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBkZXRhaWxzLFxuICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMuY2hpbGRyZW4udG9BcnJheSgpLm1hcChvcCA9PiBvcC50b0pTT04oKSlcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVHJ5T3Bjb2RlIGV4dGVuZHMgQmxvY2tPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKHN0YXJ0LCBzdGF0ZSwgYm91bmRzLCBjaGlsZHJlbikge1xuICAgICAgICBzdXBlcihzdGFydCwgc3RhdGUsIGJvdW5kcywgY2hpbGRyZW4pO1xuICAgICAgICB0aGlzLnR5cGUgPSBcInRyeVwiO1xuICAgICAgICB0aGlzLnRhZyA9IHRoaXMuX3RhZyA9IFVwZGF0YWJsZVRhZy5jcmVhdGUoQ09OU1RBTlRfVEFHKTtcbiAgICB9XG4gICAgZGlkSW5pdGlhbGl6ZUNoaWxkcmVuKCkge1xuICAgICAgICB0aGlzLl90YWcuaW5uZXIudXBkYXRlKGNvbWJpbmVTbGljZSh0aGlzLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIGV2YWx1YXRlKHZtKSB7XG4gICAgICAgIHZtLnRyeSh0aGlzLmNoaWxkcmVuLCB0aGlzKTtcbiAgICB9XG4gICAgaGFuZGxlRXhjZXB0aW9uKCkge1xuICAgICAgICBsZXQgeyBlbnYsIGJvdW5kcywgY2hpbGRyZW4sIHNjb3BlLCBkeW5hbWljU2NvcGUsIHN0YXJ0LCBzdGFjaywgcHJldiwgbmV4dCB9ID0gdGhpcztcbiAgICAgICAgY2hpbGRyZW4uY2xlYXIoKTtcbiAgICAgICAgbGV0IGVsZW1lbnRTdGFjayA9IEVsZW1lbnRTdGFjay5yZXN1bWUoZW52LCBib3VuZHMsIGJvdW5kcy5yZXNldChlbnYpKTtcbiAgICAgICAgbGV0IHZtID0gbmV3IFZNKGVudiwgc2NvcGUsIGR5bmFtaWNTY29wZSwgZWxlbWVudFN0YWNrKTtcbiAgICAgICAgbGV0IHVwZGF0aW5nID0gbmV3IExpbmtlZExpc3QoKTtcbiAgICAgICAgdm0uZXhlY3V0ZShzdGFydCwgdm0gPT4ge1xuICAgICAgICAgICAgdm0uc3RhY2sgPSBFdmFsdWF0aW9uU3RhY2sucmVzdG9yZShzdGFjayk7XG4gICAgICAgICAgICB2bS51cGRhdGluZ09wY29kZVN0YWNrLnB1c2godXBkYXRpbmcpO1xuICAgICAgICAgICAgdm0udXBkYXRlV2l0aCh0aGlzKTtcbiAgICAgICAgICAgIHZtLnVwZGF0aW5nT3Bjb2RlU3RhY2sucHVzaChjaGlsZHJlbik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByZXYgPSBwcmV2O1xuICAgICAgICB0aGlzLm5leHQgPSBuZXh0O1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBqc29uID0gc3VwZXIudG9KU09OKCk7XG4gICAgICAgIGxldCBkZXRhaWxzID0ganNvbltcImRldGFpbHNcIl07XG4gICAgICAgIGlmICghZGV0YWlscykge1xuICAgICAgICAgICAgZGV0YWlscyA9IGpzb25bXCJkZXRhaWxzXCJdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnRvSlNPTigpO1xuICAgIH1cbn1cbmNsYXNzIExpc3RSZXZhbGlkYXRpb25EZWxlZ2F0ZSB7XG4gICAgY29uc3RydWN0b3Iob3Bjb2RlLCBtYXJrZXIpIHtcbiAgICAgICAgdGhpcy5vcGNvZGUgPSBvcGNvZGU7XG4gICAgICAgIHRoaXMubWFya2VyID0gbWFya2VyO1xuICAgICAgICB0aGlzLmRpZEluc2VydCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRpZERlbGV0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hcCA9IG9wY29kZS5tYXA7XG4gICAgICAgIHRoaXMudXBkYXRpbmcgPSBvcGNvZGVbJ2NoaWxkcmVuJ107XG4gICAgfVxuICAgIGluc2VydChrZXksIGl0ZW0sIG1lbW8sIGJlZm9yZSkge1xuICAgICAgICBsZXQgeyBtYXAsIG9wY29kZSwgdXBkYXRpbmcgfSA9IHRoaXM7XG4gICAgICAgIGxldCBuZXh0U2libGluZyA9IG51bGw7XG4gICAgICAgIGxldCByZWZlcmVuY2UgPSBudWxsO1xuICAgICAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgICAgICByZWZlcmVuY2UgPSBtYXBbYmVmb3JlXTtcbiAgICAgICAgICAgIG5leHRTaWJsaW5nID0gcmVmZXJlbmNlWydib3VuZHMnXS5maXJzdE5vZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHRTaWJsaW5nID0gdGhpcy5tYXJrZXI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZtID0gb3Bjb2RlLnZtRm9ySW5zZXJ0aW9uKG5leHRTaWJsaW5nKTtcbiAgICAgICAgbGV0IHRyeU9wY29kZSA9IG51bGw7XG4gICAgICAgIGxldCB7IHN0YXJ0IH0gPSBvcGNvZGU7XG4gICAgICAgIHZtLmV4ZWN1dGUoc3RhcnQsIHZtID0+IHtcbiAgICAgICAgICAgIG1hcFtrZXldID0gdHJ5T3Bjb2RlID0gdm0uaXRlcmF0ZShtZW1vLCBpdGVtKTtcbiAgICAgICAgICAgIHZtLnVwZGF0aW5nT3Bjb2RlU3RhY2sucHVzaChuZXcgTGlua2VkTGlzdCgpKTtcbiAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgodHJ5T3Bjb2RlKTtcbiAgICAgICAgICAgIHZtLnVwZGF0aW5nT3Bjb2RlU3RhY2sucHVzaCh0cnlPcGNvZGUuY2hpbGRyZW4pO1xuICAgICAgICB9KTtcbiAgICAgICAgdXBkYXRpbmcuaW5zZXJ0QmVmb3JlKHRyeU9wY29kZSwgcmVmZXJlbmNlKTtcbiAgICAgICAgdGhpcy5kaWRJbnNlcnQgPSB0cnVlO1xuICAgIH1cbiAgICByZXRhaW4oX2tleSwgX2l0ZW0sIF9tZW1vKSB7fVxuICAgIG1vdmUoa2V5LCBfaXRlbSwgX21lbW8sIGJlZm9yZSkge1xuICAgICAgICBsZXQgeyBtYXAsIHVwZGF0aW5nIH0gPSB0aGlzO1xuICAgICAgICBsZXQgZW50cnkgPSBtYXBba2V5XTtcbiAgICAgICAgbGV0IHJlZmVyZW5jZSA9IG1hcFtiZWZvcmVdIHx8IG51bGw7XG4gICAgICAgIGlmIChiZWZvcmUpIHtcbiAgICAgICAgICAgIG1vdmVCb3VuZHMoZW50cnksIHJlZmVyZW5jZS5maXJzdE5vZGUoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb3ZlQm91bmRzKGVudHJ5LCB0aGlzLm1hcmtlcik7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRpbmcucmVtb3ZlKGVudHJ5KTtcbiAgICAgICAgdXBkYXRpbmcuaW5zZXJ0QmVmb3JlKGVudHJ5LCByZWZlcmVuY2UpO1xuICAgIH1cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIGxldCB7IG1hcCB9ID0gdGhpcztcbiAgICAgICAgbGV0IG9wY29kZSA9IG1hcFtrZXldO1xuICAgICAgICBvcGNvZGUuZGlkRGVzdHJveSgpO1xuICAgICAgICBjbGVhcihvcGNvZGUpO1xuICAgICAgICB0aGlzLnVwZGF0aW5nLnJlbW92ZShvcGNvZGUpO1xuICAgICAgICBkZWxldGUgbWFwW2tleV07XG4gICAgICAgIHRoaXMuZGlkRGVsZXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgZG9uZSgpIHtcbiAgICAgICAgdGhpcy5vcGNvZGUuZGlkSW5pdGlhbGl6ZUNoaWxkcmVuKHRoaXMuZGlkSW5zZXJ0IHx8IHRoaXMuZGlkRGVsZXRlKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTGlzdEJsb2NrT3Bjb2RlIGV4dGVuZHMgQmxvY2tPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKHN0YXJ0LCBzdGF0ZSwgYm91bmRzLCBjaGlsZHJlbiwgYXJ0aWZhY3RzKSB7XG4gICAgICAgIHN1cGVyKHN0YXJ0LCBzdGF0ZSwgYm91bmRzLCBjaGlsZHJlbik7XG4gICAgICAgIHRoaXMudHlwZSA9IFwibGlzdC1ibG9ja1wiO1xuICAgICAgICB0aGlzLm1hcCA9IGRpY3QoKTtcbiAgICAgICAgdGhpcy5sYXN0SXRlcmF0ZWQgPSBJTklUSUFMO1xuICAgICAgICB0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0cztcbiAgICAgICAgbGV0IF90YWcgPSB0aGlzLl90YWcgPSBVcGRhdGFibGVUYWcuY3JlYXRlKENPTlNUQU5UX1RBRyk7XG4gICAgICAgIHRoaXMudGFnID0gY29tYmluZShbYXJ0aWZhY3RzLnRhZywgX3RhZ10pO1xuICAgIH1cbiAgICBkaWRJbml0aWFsaXplQ2hpbGRyZW4obGlzdERpZENoYW5nZSA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5sYXN0SXRlcmF0ZWQgPSB0aGlzLmFydGlmYWN0cy50YWcudmFsdWUoKTtcbiAgICAgICAgaWYgKGxpc3REaWRDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhZy5pbm5lci51cGRhdGUoY29tYmluZVNsaWNlKHRoaXMuY2hpbGRyZW4pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBldmFsdWF0ZSh2bSkge1xuICAgICAgICBsZXQgeyBhcnRpZmFjdHMsIGxhc3RJdGVyYXRlZCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFhcnRpZmFjdHMudGFnLnZhbGlkYXRlKGxhc3RJdGVyYXRlZCkpIHtcbiAgICAgICAgICAgIGxldCB7IGJvdW5kcyB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCB7IGRvbSB9ID0gdm07XG4gICAgICAgICAgICBsZXQgbWFya2VyID0gZG9tLmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgICAgICAgICAgZG9tLmluc2VydEFmdGVyKGJvdW5kcy5wYXJlbnRFbGVtZW50KCksIG1hcmtlciwgZXhwZWN0KGJvdW5kcy5sYXN0Tm9kZSgpLCBcImNhbid0IGluc2VydCBhZnRlciBhbiBlbXB0eSBib3VuZHNcIikpO1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IG5ldyBMaXN0UmV2YWxpZGF0aW9uRGVsZWdhdGUodGhpcywgbWFya2VyKTtcbiAgICAgICAgICAgIGxldCBzeW5jaHJvbml6ZXIgPSBuZXcgSXRlcmF0b3JTeW5jaHJvbml6ZXIoeyB0YXJnZXQsIGFydGlmYWN0cyB9KTtcbiAgICAgICAgICAgIHN5bmNocm9uaXplci5zeW5jKCk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQoKS5yZW1vdmVDaGlsZChtYXJrZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJ1biBub3ctdXBkYXRlZCB1cGRhdGluZyBvcGNvZGVzXG4gICAgICAgIHN1cGVyLmV2YWx1YXRlKHZtKTtcbiAgICB9XG4gICAgdm1Gb3JJbnNlcnRpb24obmV4dFNpYmxpbmcpIHtcbiAgICAgICAgbGV0IHsgZW52LCBzY29wZSwgZHluYW1pY1Njb3BlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgZWxlbWVudFN0YWNrID0gRWxlbWVudFN0YWNrLmZvckluaXRpYWxSZW5kZXIodGhpcy5lbnYsIHRoaXMuYm91bmRzLnBhcmVudEVsZW1lbnQoKSwgbmV4dFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gbmV3IFZNKGVudiwgc2NvcGUsIGR5bmFtaWNTY29wZSwgZWxlbWVudFN0YWNrKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQganNvbiA9IHN1cGVyLnRvSlNPTigpO1xuICAgICAgICBsZXQgbWFwID0gdGhpcy5tYXA7XG4gICAgICAgIGxldCBpbm5lciA9IE9iamVjdC5rZXlzKG1hcCkubWFwKGtleSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYCR7SlNPTi5zdHJpbmdpZnkoa2V5KX06ICR7bWFwW2tleV0uX2d1aWR9YDtcbiAgICAgICAgfSkuam9pbihcIiwgXCIpO1xuICAgICAgICBsZXQgZGV0YWlscyA9IGpzb25bXCJkZXRhaWxzXCJdO1xuICAgICAgICBpZiAoIWRldGFpbHMpIHtcbiAgICAgICAgICAgIGRldGFpbHMgPSBqc29uW1wiZGV0YWlsc1wiXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGRldGFpbHNbXCJtYXBcIl0gPSBgeyR7aW5uZXJ9fWA7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbn1cbmNsYXNzIFVwZGF0aW5nVk1GcmFtZSB7XG4gICAgY29uc3RydWN0b3Iodm0sIG9wcywgZXhjZXB0aW9uSGFuZGxlcikge1xuICAgICAgICB0aGlzLnZtID0gdm07XG4gICAgICAgIHRoaXMub3BzID0gb3BzO1xuICAgICAgICB0aGlzLmV4Y2VwdGlvbkhhbmRsZXIgPSBleGNlcHRpb25IYW5kbGVyO1xuICAgICAgICB0aGlzLnZtID0gdm07XG4gICAgICAgIHRoaXMub3BzID0gb3BzO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBvcHMuaGVhZCgpO1xuICAgIH1cbiAgICBnb3RvKG9wKSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IG9wO1xuICAgIH1cbiAgICBuZXh0U3RhdGVtZW50KCkge1xuICAgICAgICBsZXQgeyBjdXJyZW50LCBvcHMgfSA9IHRoaXM7XG4gICAgICAgIGlmIChjdXJyZW50KSB0aGlzLmN1cnJlbnQgPSBvcHMubmV4dE5vZGUoY3VycmVudCk7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBoYW5kbGVFeGNlcHRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cbn0iXX0=