ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
366 lines (346 loc) • 50.4 kB
JavaScript
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 { initializeGuid, fillNulls, unreachable, typePos } from '@glimmer/util';
/**
* Registers
*
* For the most part, these follows MIPS naming conventions, however the
* register numbers are different.
*/
export var Register;
(function (Register) {
// $0 or $pc (program counter): pointer into `program` for the next insturction; -1 means exit
Register[Register["pc"] = 0] = "pc";
// $1 or $ra (return address): pointer into `program` for the return
Register[Register["ra"] = 1] = "ra";
// $2 or $fp (frame pointer): pointer into the `evalStack` for the base of the stack
Register[Register["fp"] = 2] = "fp";
// $3 or $sp (stack pointer): pointer into the `evalStack` for the top of the stack
Register[Register["sp"] = 3] = "sp";
// $4-$5 or $s0-$s1 (saved): callee saved general-purpose registers
Register[Register["s0"] = 4] = "s0";
Register[Register["s1"] = 5] = "s1";
// $6-$7 or $t0-$t1 (temporaries): caller saved general-purpose registers
Register[Register["t0"] = 6] = "t0";
Register[Register["t1"] = 7] = "t1";
})(Register || (Register = {}));
export function debugSlice(env, start, end) {
if (!false && false) {
/* tslint:disable:no-console */
var program = env.program;
var constants = program.constants;
// console is not available in IE9
if (typeof console === 'undefined') {
return;
}
// IE10 does not have `console.group`
if (typeof console.group !== 'function') {
return;
}
console.group("%c" + start + ":" + end, 'color: #999');
for (var i = start; i < end; i = i + 4) {
var _program$opcode = program.opcode(i),
type = _program$opcode.type,
op1 = _program$opcode.op1,
op2 = _program$opcode.op2,
op3 = _program$opcode.op3;
var _debug = debug(constants, type, op1, op2, op3),
name = _debug[0],
params = _debug[1];
console.log(i + ". " + logOpcode(name, params));
}
console.groupEnd();
/* tslint:enable:no-console */
}
}
function logOpcode(type, params) {
if (!false && false) {
var out = type;
if (params) {
var args = Object.keys(params).map(function (p) {
return " " + p + "=" + json(params[p]);
}).join('');
out += args;
}
return "(" + out + ")";
}
}
function json(param) {
if (typeof param === 'function') {
return '<function>';
}
var string = void 0;
try {
string = JSON.stringify(param);
} catch (e) {
return '<cannot generate JSON>';
}
if (string === undefined) {
return 'undefined';
}
var debug = JSON.parse(string);
if (typeof debug === 'object' && debug !== null && debug.GlimmerDebug !== undefined) {
return debug.GlimmerDebug;
}
return string;
}
function debug(c, op, op1, op2, op3) {
if (!false && false) {
switch (op) {
case 0 /* Bug */:
throw unreachable();
case 1 /* Helper */:
return ['Helper', { helper: c.getFunction(op1) }];
case 2 /* Function */:
return ['Function', { function: c.getFunction(op1) }];
case 4 /* SetVariable */:
return ['SetVariable', { symbol: op1 }];
case 5 /* GetVariable */:
return ['GetVariable', { symbol: op1 }];
case 6 /* GetProperty */:
return ['GetProperty', { key: c.getString(op1) }];
case 7 /* PushBlock */:
return ['PushBlock', { block: c.getBlock(op1) }];
case 8 /* GetBlock */:
return ['GetBlock', { symbol: op1 }];
case 9 /* HasBlock */:
return ['HasBlock', { block: op1 }];
case 10 /* HasBlockParams */:
return ['HasBlockParams', { block: op1 }];
case 11 /* Concat */:
return ['Concat', { size: op1 }];
case 12 /* Immediate */:
return ['Immediate', { value: op1 }];
case 13 /* Constant */:
return ['Constant', { value: c.getOther(op1) }];
case 14 /* PrimitiveReference */:
return ['PrimitiveReference', { primitive: op1 }];
case 15 /* Dup */:
return ['Dup', { register: Register[op1], offset: op2 }];
case 16 /* Pop */:
return ['Pop', { count: op1 }];
case 17 /* Load */:
return ['Load', { register: Register[op1] }];
case 18 /* Fetch */:
return ['Fetch', { register: Register[op1] }];
/// PRELUDE & EXIT
case 19 /* RootScope */:
return ['RootScope', { symbols: op1, bindCallerScope: !!op2 }];
case 20 /* ChildScope */:
return ['ChildScope', {}];
case 21 /* PopScope */:
return ['PopScope', {}];
case 22 /* Return */:
return ['Return', {}];
case 23 /* ReturnTo */:
return ['ReturnTo', { offset: op1 }];
/// HTML
case 24 /* Text */:
return ['Text', { text: c.getString(op1) }];
case 25 /* Comment */:
return ['Comment', { comment: c.getString(op1) }];
case 26 /* DynamicContent */:
return ['DynamicContent', { value: c.getOther(op1) }];
case 27 /* OpenElement */:
return ['OpenElement', { tag: c.getString(op1) }];
case 28 /* OpenElementWithOperations */:
return ['OpenElementWithOperations', { tag: c.getString(op1) }];
case 29 /* OpenDynamicElement */:
return ['OpenDynamicElement', {}];
case 30 /* StaticAttr */:
return ['StaticAttr', { name: c.getString(op1), value: c.getString(op2), namespace: op3 ? c.getString(op3) : null }];
case 31 /* DynamicAttr */:
return ['DynamicAttr', { name: c.getString(op1), trusting: !!op2 }];
case 32 /* DynamicAttrNS */:
return ['DynamicAttrNS', { name: c.getString(op1), ns: c.getString(op2), trusting: !!op2 }];
case 33 /* FlushElement */:
return ['FlushElement', {}];
case 34 /* CloseElement */:
return ['CloseElement', {}];
/// MODIFIER
case 35 /* Modifier */:
return ['Modifier', {}];
/// WORMHOLE
case 36 /* PushRemoteElement */:
return ['PushRemoteElement', {}];
case 37 /* PopRemoteElement */:
return ['PopRemoteElement', {}];
/// DYNAMIC SCOPE
case 38 /* BindDynamicScope */:
return ['BindDynamicScope', {}];
case 39 /* PushDynamicScope */:
return ['PushDynamicScope', {}];
case 40 /* PopDynamicScope */:
return ['PopDynamicScope', {}];
/// VM
case 41 /* CompileDynamicBlock */:
return ['CompileDynamicBlock', {}];
case 42 /* InvokeStatic */:
return ['InvokeStatic', { block: c.getBlock(op1) }];
case 43 /* InvokeDynamic */:
return ['InvokeDynamic', { invoker: c.getOther(op1) }];
case 44 /* Jump */:
return ['Jump', { to: op1 }];
case 45 /* JumpIf */:
return ['JumpIf', { to: op1 }];
case 46 /* JumpUnless */:
return ['JumpUnless', { to: op1 }];
case 47 /* PushFrame */:
return ['PushFrame', {}];
case 48 /* PopFrame */:
return ['PopFrame', {}];
case 49 /* Enter */:
return ['Enter', { args: op1 }];
case 50 /* Exit */:
return ['Exit', {}];
case 51 /* Test */:
return ['ToBoolean', {}];
/// LISTS
case 52 /* EnterList */:
return ['EnterList', { start: op1 }];
case 53 /* ExitList */:
return ['ExitList', {}];
case 54 /* PutIterator */:
return ['PutIterator', {}];
case 55 /* Iterate */:
return ['Iterate', { end: op1 }];
/// COMPONENTS
case 56 /* PushComponentManager */:
return ['PushComponentManager', { definition: c.getOther(op1) }];
case 57 /* PushDynamicComponentManager */:
return ['PushDynamicComponentManager', {}];
case 58 /* PushArgs */:
return ['PushArgs', { synthetic: !!op2 }];
case 59 /* PrepareArgs */:
return ['PrepareArgs', { state: Register[op1] }];
case 60 /* CreateComponent */:
return ['CreateComponent', { flags: op1, state: Register[op2] }];
case 61 /* RegisterComponentDestructor */:
return ['RegisterComponentDestructor', {}];
case 62 /* PushComponentOperations */:
return ['PushComponentOperations', {}];
case 63 /* GetComponentSelf */:
return ['GetComponentSelf', { state: Register[op1] }];
case 64 /* GetComponentLayout */:
return ['GetComponentLayout', { state: Register[op1] }];
case 65 /* BeginComponentTransaction */:
return ['BeginComponentTransaction', {}];
case 66 /* CommitComponentTransaction */:
return ['CommitComponentTransaction', {}];
case 67 /* DidCreateElement */:
return ['DidCreateElement', { state: Register[op1] }];
case 68 /* DidRenderLayout */:
return ['DidRenderLayout', {}];
/// PARTIALS
case 69 /* GetPartialTemplate */:
return ['CompilePartial', {}];
case 70 /* ResolveMaybeLocal */:
return ['ResolveMaybeLocal', { name: c.getString(op1) }];
/// DEBUGGER
case 71 /* Debugger */:
return ['Debugger', { symbols: c.getOther(op1), evalInfo: c.getArray(op2) }];
/// STATEMENTS
case 72 /* Size */:
throw unreachable();
}
throw unreachable();
}
return ['', {}];
}
export var AppendOpcodes = function () {
function AppendOpcodes() {
_classCallCheck(this, AppendOpcodes);
this.evaluateOpcode = fillNulls(72 /* Size */).slice();
}
AppendOpcodes.prototype.add = function add(name, evaluate) {
this.evaluateOpcode[name] = evaluate;
};
AppendOpcodes.prototype.evaluate = function evaluate(vm, opcode, type) {
var func = this.evaluateOpcode[type];
if (!false && false) {
/* tslint:disable */
var _debug2 = debug(vm.constants, opcode.type, opcode.op1, opcode.op2, opcode.op3),
name = _debug2[0],
params = _debug2[1];
console.log(typePos(vm['pc']) + ". " + logOpcode(name, params));
// console.log(...debug(vm.constants, type, opcode.op1, opcode.op2, opcode.op3));
/* tslint:enable */
}
func(vm, opcode);
if (!false && false) {
/* tslint:disable */
console.log('%c -> pc: %d, ra: %d, fp: %d, sp: %d, s0: %O, s1: %O, t0: %O, t1: %O', 'color: orange', vm['pc'], vm['ra'], vm['fp'], vm['sp'], vm['s0'], vm['s1'], vm['t0'], vm['t1']);
console.log('%c -> eval stack', 'color: red', vm.stack.toArray());
console.log('%c -> scope', 'color: green', vm.scope()['slots'].map(function (s) {
return s && s['value'] ? s['value']() : s;
}));
console.log('%c -> elements', 'color: blue', vm.elements()['elementStack'].toArray());
/* tslint:enable */
}
};
return AppendOpcodes;
}();
export var APPEND_OPCODES = new AppendOpcodes();
export var AbstractOpcode = function () {
function AbstractOpcode() {
_classCallCheck(this, AbstractOpcode);
initializeGuid(this);
}
AbstractOpcode.prototype.toJSON = function toJSON() {
return { guid: this._guid, type: this.type };
};
return AbstractOpcode;
}();
export var UpdatingOpcode = function (_AbstractOpcode) {
_inherits(UpdatingOpcode, _AbstractOpcode);
function UpdatingOpcode() {
_classCallCheck(this, UpdatingOpcode);
var _this = _possibleConstructorReturn(this, _AbstractOpcode.apply(this, arguments));
_this.next = null;
_this.prev = null;
return _this;
}
return UpdatingOpcode;
}(AbstractOpcode);
export function inspect(opcodes) {
var buffer = [];
opcodes.forEach(function (opcode, i) {
_inspect(opcode.toJSON(), buffer, 0, i);
});
return buffer.join('');
}
function _inspect(opcode, buffer, level, index) {
var indentation = [];
for (var i = 0; i < level; i++) {
indentation.push(' ');
}
buffer.push.apply(buffer, indentation);
buffer.push(index + ". " + opcode.type);
if (opcode.args || opcode.details) {
buffer.push('(');
if (opcode.args) {
buffer.push(opcode.args.join(', '));
}
if (opcode.details) {
var keys = Object.keys(opcode.details);
if (keys.length) {
if (opcode.args && opcode.args.length) {
buffer.push(', ');
}
buffer.push(keys.map(function (key) {
return key + "=" + (opcode.details && opcode.details[key]);
}).join(', '));
}
}
buffer.push(')');
}
buffer.push('\n');
if (opcode.children && opcode.children.length) {
for (var _i = 0; _i < opcode.children.length; _i++) {
_inspect(opcode.children[_i], buffer, level + 1, _i);
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9vcGNvZGVzLmpzIl0sIm5hbWVzIjpbImluaXRpYWxpemVHdWlkIiwiZmlsbE51bGxzIiwidW5yZWFjaGFibGUiLCJ0eXBlUG9zIiwiUmVnaXN0ZXIiLCJkZWJ1Z1NsaWNlIiwiZW52Iiwic3RhcnQiLCJlbmQiLCJwcm9ncmFtIiwiY29uc3RhbnRzIiwiY29uc29sZSIsImdyb3VwIiwiaSIsIm9wY29kZSIsInR5cGUiLCJvcDEiLCJvcDIiLCJvcDMiLCJkZWJ1ZyIsIm5hbWUiLCJwYXJhbXMiLCJsb2ciLCJsb2dPcGNvZGUiLCJncm91cEVuZCIsIm91dCIsImFyZ3MiLCJPYmplY3QiLCJrZXlzIiwibWFwIiwicCIsImpzb24iLCJqb2luIiwicGFyYW0iLCJzdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsInVuZGVmaW5lZCIsInBhcnNlIiwiR2xpbW1lckRlYnVnIiwiYyIsIm9wIiwiaGVscGVyIiwiZ2V0RnVuY3Rpb24iLCJmdW5jdGlvbiIsInN5bWJvbCIsImtleSIsImdldFN0cmluZyIsImJsb2NrIiwiZ2V0QmxvY2siLCJzaXplIiwidmFsdWUiLCJnZXRPdGhlciIsInByaW1pdGl2ZSIsInJlZ2lzdGVyIiwib2Zmc2V0IiwiY291bnQiLCJzeW1ib2xzIiwiYmluZENhbGxlclNjb3BlIiwidGV4dCIsImNvbW1lbnQiLCJ0YWciLCJuYW1lc3BhY2UiLCJ0cnVzdGluZyIsIm5zIiwiaW52b2tlciIsInRvIiwiZGVmaW5pdGlvbiIsInN5bnRoZXRpYyIsInN0YXRlIiwiZmxhZ3MiLCJldmFsSW5mbyIsImdldEFycmF5IiwiQXBwZW5kT3Bjb2RlcyIsImV2YWx1YXRlT3Bjb2RlIiwic2xpY2UiLCJhZGQiLCJldmFsdWF0ZSIsInZtIiwiZnVuYyIsInN0YWNrIiwidG9BcnJheSIsInNjb3BlIiwicyIsImVsZW1lbnRzIiwiQVBQRU5EX09QQ09ERVMiLCJBYnN0cmFjdE9wY29kZSIsInRvSlNPTiIsImd1aWQiLCJfZ3VpZCIsIlVwZGF0aW5nT3Bjb2RlIiwiYXJndW1lbnRzIiwibmV4dCIsInByZXYiLCJpbnNwZWN0Iiwib3Bjb2RlcyIsImJ1ZmZlciIsImZvckVhY2giLCJfaW5zcGVjdCIsImxldmVsIiwiaW5kZXgiLCJpbmRlbnRhdGlvbiIsInB1c2giLCJkZXRhaWxzIiwibGVuZ3RoIiwiY2hpbGRyZW4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsU0FBU0EsY0FBVCxFQUF5QkMsU0FBekIsRUFBb0NDLFdBQXBDLEVBQWlEQyxPQUFqRCxRQUFnRSxlQUFoRTs7QUFFQTs7Ozs7O0FBTUEsT0FBTyxJQUFJQyxRQUFKO0FBQ1AsQ0FBQyxVQUFVQSxRQUFWLEVBQW9CO0FBQ2pCO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBO0FBQ0FBLGFBQVNBLFNBQVMsSUFBVCxJQUFpQixDQUExQixJQUErQixJQUEvQjtBQUNBQSxhQUFTQSxTQUFTLElBQVQsSUFBaUIsQ0FBMUIsSUFBK0IsSUFBL0I7QUFDQTtBQUNBQSxhQUFTQSxTQUFTLElBQVQsSUFBaUIsQ0FBMUIsSUFBK0IsSUFBL0I7QUFDQUEsYUFBU0EsU0FBUyxJQUFULElBQWlCLENBQTFCLElBQStCLElBQS9CO0FBQ0gsQ0FmRCxFQWVHQSxhQUFhQSxXQUFXLEVBQXhCLENBZkg7QUFnQkEsT0FBTyxTQUFTQyxVQUFULENBQW9CQyxHQUFwQixFQUF5QkMsS0FBekIsRUFBZ0NDLEdBQWhDLEVBQXFDO0FBQ3hDLFFBQUksQ0FBQyxLQUFELElBQVUsS0FBZCxFQUFxQjtBQUNqQjtBQURpQixZQUVYQyxPQUZXLEdBRUNILEdBRkQsQ0FFWEcsT0FGVztBQUFBLFlBR1hDLFNBSFcsR0FH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Z0JBLEtBQUlDLE9BQU80RixRQUFQLENBQWdCRCxNQUFwQyxFQUE0QzVGLElBQTVDLEVBQWlEO0FBQzdDc0YscUJBQVNyRixPQUFPNEYsUUFBUCxDQUFnQjdGLEVBQWhCLENBQVQsRUFBNkJvRixNQUE3QixFQUFxQ0csUUFBUSxDQUE3QyxFQUFnRHZGLEVBQWhEO0FBQ0g7QUFDSjtBQUNKIiwiZmlsZSI6ImxpYi9vcGNvZGVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5pdGlhbGl6ZUd1aWQsIGZpbGxOdWxscywgdW5yZWFjaGFibGUsIHR5cGVQb3MgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuLyoqXG4gKiBSZWdpc3RlcnNcbiAqXG4gKiBGb3IgdGhlIG1vc3QgcGFydCwgdGhlc2UgZm9sbG93cyBNSVBTIG5hbWluZyBjb252ZW50aW9ucywgaG93ZXZlciB0aGVcbiAqIHJlZ2lzdGVyIG51bWJlcnMgYXJlIGRpZmZlcmVudC5cbiAqL1xuZXhwb3J0IHZhciBSZWdpc3RlcjtcbihmdW5jdGlvbiAoUmVnaXN0ZXIpIHtcbiAgICAvLyAkMCBvciAkcGMgKHByb2dyYW0gY291bnRlcik6IHBvaW50ZXIgaW50byBgcHJvZ3JhbWAgZm9yIHRoZSBuZXh0IGluc3R1cmN0aW9uOyAtMSBtZWFucyBleGl0XG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJwY1wiXSA9IDBdID0gXCJwY1wiO1xuICAgIC8vICQxIG9yICRyYSAocmV0dXJuIGFkZHJlc3MpOiBwb2ludGVyIGludG8gYHByb2dyYW1gIGZvciB0aGUgcmV0dXJuXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJyYVwiXSA9IDFdID0gXCJyYVwiO1xuICAgIC8vICQyIG9yICRmcCAoZnJhbWUgcG9pbnRlcik6IHBvaW50ZXIgaW50byB0aGUgYGV2YWxTdGFja2AgZm9yIHRoZSBiYXNlIG9mIHRoZSBzdGFja1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1wiZnBcIl0gPSAyXSA9IFwiZnBcIjtcbiAgICAvLyAkMyBvciAkc3AgKHN0YWNrIHBvaW50ZXIpOiBwb2ludGVyIGludG8gdGhlIGBldmFsU3RhY2tgIGZvciB0aGUgdG9wIG9mIHRoZSBzdGFja1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1wic3BcIl0gPSAzXSA9IFwic3BcIjtcbiAgICAvLyAkNC0kNSBvciAkczAtJHMxIChzYXZlZCk6IGNhbGxlZSBzYXZlZCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJzMFwiXSA9IDRdID0gXCJzMFwiO1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1wiczFcIl0gPSA1XSA9IFwiczFcIjtcbiAgICAvLyAkNi0kNyBvciAkdDAtJHQxICh0ZW1wb3Jhcmllcyk6IGNhbGxlciBzYXZlZCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXJzXG4gICAgUmVnaXN0ZXJbUmVnaXN0ZXJbXCJ0MFwiXSA9IDZdID0gXCJ0MFwiO1xuICAgIFJlZ2lzdGVyW1JlZ2lzdGVyW1widDFcIl0gPSA3XSA9IFwidDFcIjtcbn0pKFJlZ2lzdGVyIHx8IChSZWdpc3RlciA9IHt9KSk7XG5leHBvcnQgZnVuY3Rpb24gZGVidWdTbGljZShlbnYsIHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIWZhbHNlICYmIGZhbHNlKSB7XG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGUgKi9cbiAgICAgICAgbGV0IHsgcHJvZ3JhbSB9ID0gZW52O1xuICAgICAgICBsZXQgeyBjb25zdGFudHMgfSA9IHByb2dyYW07XG4gICAgICAgIC8vIGNvbnNvbGUgaXMgbm90IGF2YWlsYWJsZSBpbiBJRTlcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElFMTAgZG9lcyBub3QgaGF2ZSBgY29uc29sZS5ncm91cGBcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLmdyb3VwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5ncm91cChgJWMke3N0YXJ0fToke2VuZH1gLCAnY29sb3I6ICM5OTknKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpID0gaSArIDQpIHtcbiAgICAgICAgICAgIGxldCB7IHR5cGUsIG9wMSwgb3AyLCBvcDMgfSA9IHByb2dyYW0ub3Bjb2RlKGkpO1xuICAgICAgICAgICAgbGV0IFtuYW1lLCBwYXJhbXNdID0gZGVidWcoY29uc3RhbnRzLCB0eXBlLCBvcDEsIG9wMiwgb3AzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke2l9LiAke2xvZ09wY29kZShuYW1lLCBwYXJhbXMpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgLyogdHNsaW50OmVuYWJsZTpuby1jb25zb2xlICovXG4gICAgfVxufVxuZnVuY3Rpb24gbG9nT3Bjb2RlKHR5cGUsIHBhcmFtcykge1xuICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgbGV0IG91dCA9IHR5cGU7XG4gICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgIGxldCBhcmdzID0gT2JqZWN0LmtleXMocGFyYW1zKS5tYXAocCA9PiBgICR7cH09JHtqc29uKHBhcmFtc1twXSl9YCkuam9pbignJyk7XG4gICAgICAgICAgICBvdXQgKz0gYXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCgke291dH0pYDtcbiAgICB9XG59XG5mdW5jdGlvbiBqc29uKHBhcmFtKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gJzxmdW5jdGlvbj4nO1xuICAgIH1cbiAgICBsZXQgc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICAgIHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHBhcmFtKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAnPGNhbm5vdCBnZW5lcmF0ZSBKU09OPic7XG4gICAgfVxuICAgIGlmIChzdHJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIGxldCBkZWJ1ZyA9IEpTT04ucGFyc2Uoc3RyaW5nKTtcbiAgICBpZiAodHlwZW9mIGRlYnVnID09PSAnb2JqZWN0JyAmJiBkZWJ1ZyAhPT0gbnVsbCAmJiBkZWJ1Zy5HbGltbWVyRGVidWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGVidWcuR2xpbW1lckRlYnVnO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nO1xufVxuZnVuY3Rpb24gZGVidWcoYywgb3AsIG9wMSwgb3AyLCBvcDMpIHtcbiAgICBpZiAoIWZhbHNlICYmIGZhbHNlKSB7XG4gICAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgICAgICAgIGNhc2UgMCAvKiBCdWcgKi86XG4gICAgICAgICAgICAgICAgdGhyb3cgdW5yZWFjaGFibGUoKTtcbiAgICAgICAgICAgIGNhc2UgMSAvKiBIZWxwZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSGVscGVyJywgeyBoZWxwZXI6IGMuZ2V0RnVuY3Rpb24ob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBGdW5jdGlvbiAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydGdW5jdGlvbicsIHsgZnVuY3Rpb246IGMuZ2V0RnVuY3Rpb24ob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgNCAvKiBTZXRWYXJpYWJsZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydTZXRWYXJpYWJsZScsIHsgc3ltYm9sOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDUgLyogR2V0VmFyaWFibGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnR2V0VmFyaWFibGUnLCB7IHN5bWJvbDogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA2IC8qIEdldFByb3BlcnR5ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0dldFByb3BlcnR5JywgeyBrZXk6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDcgLyogUHVzaEJsb2NrICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1B1c2hCbG9jaycsIHsgYmxvY2s6IGMuZ2V0QmxvY2sob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgOCAvKiBHZXRCbG9jayAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydHZXRCbG9jaycsIHsgc3ltYm9sOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDkgLyogSGFzQmxvY2sgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSGFzQmxvY2snLCB7IGJsb2NrOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDEwIC8qIEhhc0Jsb2NrUGFyYW1zICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0hhc0Jsb2NrUGFyYW1zJywgeyBibG9jazogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSAxMSAvKiBDb25jYXQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29uY2F0JywgeyBzaXplOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDEyIC8qIEltbWVkaWF0ZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydJbW1lZGlhdGUnLCB7IHZhbHVlOiBvcDEgfV07XG4gICAgICAgICAgICBjYXNlIDEzIC8qIENvbnN0YW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NvbnN0YW50JywgeyB2YWx1ZTogYy5nZXRPdGhlcihvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSAxNCAvKiBQcmltaXRpdmVSZWZlcmVuY2UgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHJpbWl0aXZlUmVmZXJlbmNlJywgeyBwcmltaXRpdmU6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgMTUgLyogRHVwICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0R1cCcsIHsgcmVnaXN0ZXI6IFJlZ2lzdGVyW29wMV0sIG9mZnNldDogb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSAxNiAvKiBQb3AgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wJywgeyBjb3VudDogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSAxNyAvKiBMb2FkICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0xvYWQnLCB7IHJlZ2lzdGVyOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSAxOCAvKiBGZXRjaCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydGZXRjaCcsIHsgcmVnaXN0ZXI6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICAvLy8gUFJFTFVERSAmIEVYSVRcbiAgICAgICAgICAgIGNhc2UgMTkgLyogUm9vdFNjb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1Jvb3RTY29wZScsIHsgc3ltYm9sczogb3AxLCBiaW5kQ2FsbGVyU2NvcGU6ICEhb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSAyMCAvKiBDaGlsZFNjb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NoaWxkU2NvcGUnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDIxIC8qIFBvcFNjb3BlICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1BvcFNjb3BlJywge31dO1xuICAgICAgICAgICAgY2FzZSAyMiAvKiBSZXR1cm4gKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUmV0dXJuJywge31dO1xuICAgICAgICAgICAgY2FzZSAyMyAvKiBSZXR1cm5UbyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydSZXR1cm5UbycsIHsgb2Zmc2V0OiBvcDEgfV07XG4gICAgICAgICAgICAvLy8gSFRNTFxuICAgICAgICAgICAgY2FzZSAyNCAvKiBUZXh0ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1RleHQnLCB7IHRleHQ6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI1IC8qIENvbW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29tbWVudCcsIHsgY29tbWVudDogYy5nZXRTdHJpbmcob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgMjYgLyogRHluYW1pY0NvbnRlbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRHluYW1pY0NvbnRlbnQnLCB7IHZhbHVlOiBjLmdldE90aGVyKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI3IC8qIE9wZW5FbGVtZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ09wZW5FbGVtZW50JywgeyB0YWc6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDI4IC8qIE9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnT3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucycsIHsgdGFnOiBjLmdldFN0cmluZyhvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSAyOSAvKiBPcGVuRHluYW1pY0VsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnT3BlbkR5bmFtaWNFbGVtZW50Jywge31dO1xuICAgICAgICAgICAgY2FzZSAzMCAvKiBTdGF0aWNBdHRyICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1N0YXRpY0F0dHInLCB7IG5hbWU6IGMuZ2V0U3RyaW5nKG9wMSksIHZhbHVlOiBjLmdldFN0cmluZyhvcDIpLCBuYW1lc3BhY2U6IG9wMyA/IGMuZ2V0U3RyaW5nKG9wMykgOiBudWxsIH1dO1xuICAgICAgICAgICAgY2FzZSAzMSAvKiBEeW5hbWljQXR0ciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydEeW5hbWljQXR0cicsIHsgbmFtZTogYy5nZXRTdHJpbmcob3AxKSwgdHJ1c3Rpbmc6ICEhb3AyIH1dO1xuICAgICAgICAgICAgY2FzZSAzMiAvKiBEeW5hbWljQXR0ck5TICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0R5bmFtaWNBdHRyTlMnLCB7IG5hbWU6IGMuZ2V0U3RyaW5nKG9wMSksIG5zOiBjLmdldFN0cmluZyhvcDIpLCB0cnVzdGluZzogISFvcDIgfV07XG4gICAgICAgICAgICBjYXNlIDMzIC8qIEZsdXNoRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydGbHVzaEVsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDM0IC8qIENsb3NlRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDbG9zZUVsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICAvLy8gTU9ESUZJRVJcbiAgICAgICAgICAgIGNhc2UgMzUgLyogTW9kaWZpZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnTW9kaWZpZXInLCB7fV07XG4gICAgICAgICAgICAvLy8gV09STUhPTEVcbiAgICAgICAgICAgIGNhc2UgMzYgLyogUHVzaFJlbW90ZUVsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaFJlbW90ZUVsZW1lbnQnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDM3IC8qIFBvcFJlbW90ZUVsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wUmVtb3RlRWxlbWVudCcsIHt9XTtcbiAgICAgICAgICAgIC8vLyBEWU5BTUlDIFNDT1BFXG4gICAgICAgICAgICBjYXNlIDM4IC8qIEJpbmREeW5hbWljU2NvcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQmluZER5bmFtaWNTY29wZScsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgMzkgLyogUHVzaER5bmFtaWNTY29wZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoRHluYW1pY1Njb3BlJywge31dO1xuICAgICAgICAgICAgY2FzZSA0MCAvKiBQb3BEeW5hbWljU2NvcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUG9wRHluYW1pY1Njb3BlJywge31dO1xuICAgICAgICAgICAgLy8vIFZNXG4gICAgICAgICAgICBjYXNlIDQxIC8qIENvbXBpbGVEeW5hbWljQmxvY2sgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ29tcGlsZUR5bmFtaWNCbG9jaycsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNDIgLyogSW52b2tlU3RhdGljICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0ludm9rZVN0YXRpYycsIHsgYmxvY2s6IGMuZ2V0QmxvY2sob3AxKSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDMgLyogSW52b2tlRHluYW1pYyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydJbnZva2VEeW5hbWljJywgeyBpbnZva2VyOiBjLmdldE90aGVyKG9wMSkgfV07XG4gICAgICAgICAgICBjYXNlIDQ0IC8qIEp1bXAgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSnVtcCcsIHsgdG86IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDUgLyogSnVtcElmICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0p1bXBJZicsIHsgdG86IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNDYgLyogSnVtcFVubGVzcyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydKdW1wVW5sZXNzJywgeyB0bzogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA0NyAvKiBQdXNoRnJhbWUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaEZyYW1lJywge31dO1xuICAgICAgICAgICAgY2FzZSA0OCAvKiBQb3BGcmFtZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQb3BGcmFtZScsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNDkgLyogRW50ZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRW50ZXInLCB7IGFyZ3M6IG9wMSB9XTtcbiAgICAgICAgICAgIGNhc2UgNTAgLyogRXhpdCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydFeGl0Jywge31dO1xuICAgICAgICAgICAgY2FzZSA1MSAvKiBUZXN0ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1RvQm9vbGVhbicsIHt9XTtcbiAgICAgICAgICAgIC8vLyBMSVNUU1xuICAgICAgICAgICAgY2FzZSA1MiAvKiBFbnRlckxpc3QgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRW50ZXJMaXN0JywgeyBzdGFydDogb3AxIH1dO1xuICAgICAgICAgICAgY2FzZSA1MyAvKiBFeGl0TGlzdCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydFeGl0TGlzdCcsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNTQgLyogUHV0SXRlcmF0b3IgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHV0SXRlcmF0b3InLCB7fV07XG4gICAgICAgICAgICBjYXNlIDU1IC8qIEl0ZXJhdGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnSXRlcmF0ZScsIHsgZW5kOiBvcDEgfV07XG4gICAgICAgICAgICAvLy8gQ09NUE9ORU5UU1xuICAgICAgICAgICAgY2FzZSA1NiAvKiBQdXNoQ29tcG9uZW50TWFuYWdlciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoQ29tcG9uZW50TWFuYWdlcicsIHsgZGVmaW5pdGlvbjogYy5nZXRPdGhlcihvcDEpIH1dO1xuICAgICAgICAgICAgY2FzZSA1NyAvKiBQdXNoRHluYW1pY0NvbXBvbmVudE1hbmFnZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyJywge31dO1xuICAgICAgICAgICAgY2FzZSA1OCAvKiBQdXNoQXJncyAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydQdXNoQXJncycsIHsgc3ludGhldGljOiAhIW9wMiB9XTtcbiAgICAgICAgICAgIGNhc2UgNTkgLyogUHJlcGFyZUFyZ3MgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHJlcGFyZUFyZ3MnLCB7IHN0YXRlOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSA2MCAvKiBDcmVhdGVDb21wb25lbnQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnQ3JlYXRlQ29tcG9uZW50JywgeyBmbGFnczogb3AxLCBzdGF0ZTogUmVnaXN0ZXJbb3AyXSB9XTtcbiAgICAgICAgICAgIGNhc2UgNjEgLyogUmVnaXN0ZXJDb21wb25lbnREZXN0cnVjdG9yICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ1JlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvcicsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNjIgLyogUHVzaENvbXBvbmVudE9wZXJhdGlvbnMgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUHVzaENvbXBvbmVudE9wZXJhdGlvbnMnLCB7fV07XG4gICAgICAgICAgICBjYXNlIDYzIC8qIEdldENvbXBvbmVudFNlbGYgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnR2V0Q29tcG9uZW50U2VsZicsIHsgc3RhdGU6IFJlZ2lzdGVyW29wMV0gfV07XG4gICAgICAgICAgICBjYXNlIDY0IC8qIEdldENvbXBvbmVudExheW91dCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydHZXRDb21wb25lbnRMYXlvdXQnLCB7IHN0YXRlOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSA2NSAvKiBCZWdpbkNvbXBvbmVudFRyYW5zYWN0aW9uICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0JlZ2luQ29tcG9uZW50VHJhbnNhY3Rpb24nLCB7fV07XG4gICAgICAgICAgICBjYXNlIDY2IC8qIENvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0NvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uJywge31dO1xuICAgICAgICAgICAgY2FzZSA2NyAvKiBEaWRDcmVhdGVFbGVtZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBbJ0RpZENyZWF0ZUVsZW1lbnQnLCB7IHN0YXRlOiBSZWdpc3RlcltvcDFdIH1dO1xuICAgICAgICAgICAgY2FzZSA2OCAvKiBEaWRSZW5kZXJMYXlvdXQgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRGlkUmVuZGVyTGF5b3V0Jywge31dO1xuICAgICAgICAgICAgLy8vIFBBUlRJQUxTXG4gICAgICAgICAgICBjYXNlIDY5IC8qIEdldFBhcnRpYWxUZW1wbGF0ZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gWydDb21waWxlUGFydGlhbCcsIHt9XTtcbiAgICAgICAgICAgIGNhc2UgNzAgLyogUmVzb2x2ZU1heWJlTG9jYWwgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnUmVzb2x2ZU1heWJlTG9jYWwnLCB7IG5hbWU6IGMuZ2V0U3RyaW5nKG9wMSkgfV07XG4gICAgICAgICAgICAvLy8gREVCVUdHRVJcbiAgICAgICAgICAgIGNhc2UgNzEgLyogRGVidWdnZXIgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnRGVidWdnZXInLCB7IHN5bWJvbHM6IGMuZ2V0T3RoZXIob3AxKSwgZXZhbEluZm86IGMuZ2V0QXJyYXkob3AyKSB9XTtcbiAgICAgICAgICAgIC8vLyBTVEFURU1FTlRTXG4gICAgICAgICAgICBjYXNlIDcyIC8qIFNpemUgKi86XG4gICAgICAgICAgICAgICAgdGhyb3cgdW5yZWFjaGFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyB1bnJlYWNoYWJsZSgpO1xuICAgIH1cbiAgICByZXR1cm4gWycnLCB7fV07XG59XG5leHBvcnQgY2xhc3MgQXBwZW5kT3Bjb2RlcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVPcGNvZGUgPSBmaWxsTnVsbHMoNzIgLyogU2l6ZSAqLykuc2xpY2UoKTtcbiAgICB9XG4gICAgYWRkKG5hbWUsIGV2YWx1YXRlKSB7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVPcGNvZGVbbmFtZV0gPSBldmFsdWF0ZTtcbiAgICB9XG4gICAgZXZhbHVhdGUodm0sIG9wY29kZSwgdHlwZSkge1xuICAgICAgICBsZXQgZnVuYyA9IHRoaXMuZXZhbHVhdGVPcGNvZGVbdHlwZV07XG4gICAgICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlICovXG4gICAgICAgICAgICBsZXQgW25hbWUsIHBhcmFtc10gPSBkZWJ1Zyh2bS5jb25zdGFudHMsIG9wY29kZS50eXBlLCBvcGNvZGUub3AxLCBvcGNvZGUub3AyLCBvcGNvZGUub3AzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3R5cGVQb3Modm1bJ3BjJ10pfS4gJHtsb2dPcGNvZGUobmFtZSwgcGFyYW1zKX1gKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKC4uLmRlYnVnKHZtLmNvbnN0YW50cywgdHlwZSwgb3Bjb2RlLm9wMSwgb3Bjb2RlLm9wMiwgb3Bjb2RlLm9wMykpO1xuICAgICAgICAgICAgLyogdHNsaW50OmVuYWJsZSAqL1xuICAgICAgICB9XG4gICAgICAgIGZ1bmModm0sIG9wY29kZSk7XG4gICAgICAgIGlmICghZmFsc2UgJiYgZmFsc2UpIHtcbiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlICovXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJWMgLT4gcGM6ICVkLCByYTogJWQsIGZwOiAlZCwgc3A6ICVkLCBzMDogJU8sIHMxOiAlTywgdDA6ICVPLCB0MTogJU8nLCAnY29sb3I6IG9yYW5nZScsIHZtWydwYyddLCB2bVsncmEnXSwgdm1bJ2ZwJ10sIHZtWydzcCddLCB2bVsnczAnXSwgdm1bJ3MxJ10sIHZtWyd0MCddLCB2bVsndDEnXSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJWMgLT4gZXZhbCBzdGFjaycsICdjb2xvcjogcmVkJywgdm0uc3RhY2sudG9BcnJheSgpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyAtPiBzY29wZScsICdjb2xvcjogZ3JlZW4nLCB2bS5zY29wZSgpWydzbG90cyddLm1hcChzID0+IHMgJiYgc1sndmFsdWUnXSA/IHNbJ3ZhbHVlJ10oKSA6IHMpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyAtPiBlbGVtZW50cycsICdjb2xvcjogYmx1ZScsIHZtLmVsZW1lbnRzKClbJ2VsZW1lbnRTdGFjayddLnRvQXJyYXkoKSk7XG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZW5hYmxlICovXG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY29uc3QgQVBQRU5EX09QQ09ERVMgPSBuZXcgQXBwZW5kT3Bjb2RlcygpO1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0T3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW5pdGlhbGl6ZUd1aWQodGhpcyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgZ3VpZDogdGhpcy5fZ3VpZCwgdHlwZTogdGhpcy50eXBlIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVwZGF0aW5nT3Bjb2RlIGV4dGVuZHMgQWJzdHJhY3RPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0KG9wY29kZXMpIHtcbiAgICBsZXQgYnVmZmVyID0gW107XG4gICAgb3Bjb2Rlcy5mb3JFYWNoKChvcGNvZGUsIGkpID0+IHtcbiAgICAgICAgX2luc3BlY3Qob3Bjb2RlLnRvSlNPTigpLCBidWZmZXIsIDAsIGkpO1xuICAgIH0pO1xuICAgIHJldHVybiBidWZmZXIuam9pbignJyk7XG59XG5mdW5jdGlvbiBfaW5zcGVjdChvcGNvZGUsIGJ1ZmZlciwgbGV2ZWwsIGluZGV4KSB7XG4gICAgbGV0IGluZGVudGF0aW9uID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7XG4gICAgICAgIGluZGVudGF0aW9uLnB1c2goJyAgJyk7XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKC4uLmluZGVudGF0aW9uKTtcbiAgICBidWZmZXIucHVzaChgJHtpbmRleH0uICR7b3Bjb2RlLnR5cGV9YCk7XG4gICAgaWYgKG9wY29kZS5hcmdzIHx8IG9wY29kZS5kZXRhaWxzKSB7XG4gICAgICAgIGJ1ZmZlci5wdXNoKCcoJyk7XG4gICAgICAgIGlmIChvcGNvZGUuYXJncykge1xuICAgICAgICAgICAgYnVmZmVyLnB1c2gob3Bjb2RlLmFyZ3Muam9pbignLCAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wY29kZS5kZXRhaWxzKSB7XG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG9wY29kZS5kZXRhaWxzKTtcbiAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChvcGNvZGUuYXJncyAmJiBvcGNvZGUuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goJywgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGtleXMubWFwKGtleSA9PiBgJHtrZXl9PSR7b3Bjb2RlLmRldGFpbHMgJiYgb3Bjb2RlLmRldGFpbHNba2V5XX1gKS5qb2luKC