@glimmer/compiler
Version:
246 lines (188 loc) • 21.4 kB
JavaScript
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import { Stack } from '@glimmer/util';
var SymbolAllocator = function () {
function SymbolAllocator(ops, locations) {
_classCallCheck(this, SymbolAllocator);
this.ops = ops;
this.locations = locations;
this.symbolStack = new Stack();
}
SymbolAllocator.prototype.process = function process() {
var out = [];
var locations = [];
var ops = this.ops;
for (var i = 0; i < ops.length; i++) {
var op = ops[i];
var location = this.locations[i];
var result = this.dispatch(op);
out.push(result);
locations.push(location);
}
return { ops: out, locations: locations };
};
SymbolAllocator.prototype.dispatch = function dispatch(op) {
var name = op[0];
var operand = op[1];
return this[name](operand) || op;
};
SymbolAllocator.prototype.startProgram = function startProgram(op) {
this.symbolStack.push(op.symbols);
};
SymbolAllocator.prototype.endProgram = function endProgram() {
this.symbolStack.pop();
};
SymbolAllocator.prototype.startBlock = function startBlock(op) {
this.symbolStack.push(op.symbols);
};
SymbolAllocator.prototype.endBlock = function endBlock() {
this.symbolStack.pop();
};
SymbolAllocator.prototype.openNamedBlock = function openNamedBlock(op) {
this.symbolStack.push(op.symbols);
};
SymbolAllocator.prototype.closeNamedBlock = function closeNamedBlock(_op) {
this.symbolStack.pop();
};
SymbolAllocator.prototype.flushElement = function flushElement(op) {
this.symbolStack.push(op.symbols);
};
SymbolAllocator.prototype.closeElement = function closeElement(_op) {
this.symbolStack.pop();
};
SymbolAllocator.prototype.closeComponent = function closeComponent(_op) {
this.symbolStack.pop();
};
SymbolAllocator.prototype.closeDynamicComponent = function closeDynamicComponent(_op) {
this.symbolStack.pop();
};
SymbolAllocator.prototype.attrSplat = function attrSplat() {
return ['attrSplat', this.symbols.allocateBlock('attrs')];
};
SymbolAllocator.prototype.getFree = function getFree(name) {
var symbol = this.symbols.allocateFree(name);
return ['getFree', symbol];
};
SymbolAllocator.prototype.getArg = function getArg(name) {
var symbol = this.symbols.allocateNamed(name);
return ['getSymbol', symbol];
};
SymbolAllocator.prototype.getThis = function getThis() {
return ['getSymbol', 0];
};
SymbolAllocator.prototype.getVar = function getVar(_ref) {
var name = _ref[0],
context = _ref[1];
if (this.symbols.has(name)) {
var symbol = this.symbols.get(name);
return ['getSymbol', symbol];
} else {
var _symbol = this.symbols.allocateFree(name);
return ['getFreeWithContext', [_symbol, context]];
}
};
SymbolAllocator.prototype.getPath = function getPath(rest) {
return ['getPath', rest];
};
SymbolAllocator.prototype.yield = function _yield(op) {
return ['yield', this.symbols.allocateBlock(op)];
};
SymbolAllocator.prototype.debugger = function _debugger(_op) {
return ['debugger', this.symbols.getEvalInfo()];
};
SymbolAllocator.prototype.hasBlock = function hasBlock(op) {
if (op === 0) {
throw new Error('Cannot hasBlock this');
}
return ['hasBlock', this.symbols.allocateBlock(op)];
};
SymbolAllocator.prototype.hasBlockParams = function hasBlockParams(op) {
if (op === 0) {
throw new Error('Cannot hasBlockParams this');
}
return ['hasBlockParams', this.symbols.allocateBlock(op)];
};
SymbolAllocator.prototype.partial = function partial() {
return ['partial', this.symbols.getEvalInfo()];
};
SymbolAllocator.prototype.block = function block(_ref2) {
var template = _ref2[0],
inverse = _ref2[1];
return ['block', [template, inverse]];
};
SymbolAllocator.prototype.modifier = function modifier() {
return ['modifier'];
};
SymbolAllocator.prototype.helper = function helper() {
return ['helper'];
};
SymbolAllocator.prototype.text = function text(content) {
return ['text', content];
};
SymbolAllocator.prototype.comment = function comment(_comment) {
return ['comment', _comment];
};
SymbolAllocator.prototype.openComponent = function openComponent(element) {
return ['openComponent', element];
};
SymbolAllocator.prototype.openElement = function openElement(_ref3) {
var element = _ref3[0],
simple = _ref3[1];
return ['openElement', [element, simple]];
};
SymbolAllocator.prototype.staticArg = function staticArg(name) {
return ['staticArg', name];
};
SymbolAllocator.prototype.dynamicArg = function dynamicArg(name) {
return ['dynamicArg', name];
};
SymbolAllocator.prototype.staticAttr = function staticAttr(_ref4) {
var name = _ref4[0],
ns = _ref4[1];
return ['staticAttr', [name, ns]];
};
SymbolAllocator.prototype.trustingAttr = function trustingAttr(_ref5) {
var name = _ref5[0],
ns = _ref5[1];
return ['trustingAttr', [name, ns]];
};
SymbolAllocator.prototype.dynamicAttr = function dynamicAttr(_ref6) {
var name = _ref6[0],
ns = _ref6[1];
return ['dynamicAttr', [name, ns]];
};
SymbolAllocator.prototype.componentAttr = function componentAttr(_ref7) {
var name = _ref7[0],
ns = _ref7[1];
return ['componentAttr', [name, ns]];
};
SymbolAllocator.prototype.trustingComponentAttr = function trustingComponentAttr(_ref8) {
var name = _ref8[0],
ns = _ref8[1];
return ['trustedComponentAttr', [name, ns]];
};
SymbolAllocator.prototype.append = function append(trusted) {
return ['append', trusted];
};
SymbolAllocator.prototype.literal = function literal(value) {
return ['literal', value];
};
SymbolAllocator.prototype.prepareArray = function prepareArray(count) {
return ['prepareArray', count];
};
SymbolAllocator.prototype.prepareObject = function prepareObject(count) {
return ['prepareObject', count];
};
SymbolAllocator.prototype.concat = function concat() {
return ['concat'];
};
_createClass(SymbolAllocator, [{
key: 'symbols',
get: function get() {
return this.symbolStack.current;
}
}]);
return SymbolAllocator;
}();
export { SymbolAllocator };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9hbGxvY2F0ZS1zeW1ib2xzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFXQSxTQUFBLEtBQUEsUUFBQSxlQUFBOztJQU9NLGU7QUFHSiw2QkFBQSxHQUFBLEVBQUEsU0FBQSxFQUVzRDtBQUFBOztBQUQ1QyxhQUFBLEdBQUEsR0FBQSxHQUFBO0FBQ0EsYUFBQSxTQUFBLEdBQUEsU0FBQTtBQUpGLGFBQUEsV0FBQSxHQUFjLElBQWQsS0FBYyxFQUFkO0FBS0o7OzhCQUVKLE8sc0JBQU87QUFJTCxZQUFJLE1BQUosRUFBQTtBQUNBLFlBQUksWUFBSixFQUFBO0FBTEssWUFNRCxHQU5DLEdBTUwsSUFOSyxDQU1ELEdBTkM7O0FBUUwsYUFBSyxJQUFJLElBQVQsQ0FBQSxFQUFnQixJQUFJLElBQXBCLE1BQUEsRUFBQSxHQUFBLEVBQXFDO0FBQ25DLGdCQUFJLEtBQUssSUFBVCxDQUFTLENBQVQ7QUFDQSxnQkFBSSxXQUFXLEtBQUEsU0FBQSxDQUFmLENBQWUsQ0FBZjtBQUNBLGdCQUFJLFNBQVMsS0FBQSxRQUFBLENBQWIsRUFBYSxDQUFiO0FBRUEsZ0JBQUEsSUFBQSxDQUFBLE1BQUE7QUFDQSxzQkFBQSxJQUFBLENBQUEsUUFBQTtBQUNEO0FBRUQsZUFBTyxFQUFFLEtBQUYsR0FBQSxFQUFQLG9CQUFPLEVBQVA7QUFDRCxLOzs4QkFFRCxRLHFCQUFBLEUsRUFBaUQ7QUFDL0MsWUFBSSxPQUFPLEdBQVgsQ0FBVyxDQUFYO0FBQ0EsWUFBSSxVQUFVLEdBQWQsQ0FBYyxDQUFkO0FBRUEsZUFBUSxLQUFBLElBQUEsRUFBQSxPQUFBLEtBQVIsRUFBQTtBQUNELEs7OzhCQU1ELFkseUJBQUEsRSxFQUE2QjtBQUMzQixhQUFBLFdBQUEsQ0FBQSxJQUFBLENBQXNCLEdBQXRCLE9BQUE7QUFDRCxLOzs4QkFFRCxVLHlCQUFVO0FBQ1IsYUFBQSxXQUFBLENBQUEsR0FBQTtBQUNELEs7OzhCQUVELFUsdUJBQUEsRSxFQUF3QjtBQUN0QixhQUFBLFdBQUEsQ0FBQSxJQUFBLENBQXNCLEdBQXRCLE9BQUE7QUFDRCxLOzs4QkFFRCxRLHVCQUFRO0FBQ04sYUFBQSxXQUFBLENBQUEsR0FBQTtBQUNELEs7OzhCQUVELGMsMkJBQUEsRSxFQUFrQztBQUNoQyxhQUFBLFdBQUEsQ0FBQSxJQUFBLENBQXNCLEdBQXRCLE9BQUE7QUFDRCxLOzs4QkFFRCxlLDRCQUFBLEcsRUFBb0M7QUFDbEMsYUFBQSxXQUFBLENBQUEsR0FBQTtBQUNELEs7OzhCQUVELFkseUJBQUEsRSxFQUFnQztBQUM5QixhQUFBLFdBQUEsQ0FBQSxJQUFBLENBQXNCLEdBQXRCLE9BQUE7QUFDRCxLOzs4QkFFRCxZLHlCQUFBLEcsRUFBaUM7QUFDL0IsYUFBQSxXQUFBLENBQUEsR0FBQTtBQUNELEs7OzhCQUVELGMsMkJBQUEsRyxFQUFtQztBQUNqQyxhQUFBLFdBQUEsQ0FBQSxHQUFBO0FBQ0QsSzs7OEJBRUQscUIsa0NBQUEsRyxFQUEwQztBQUN4QyxhQUFBLFdBQUEsQ0FBQSxHQUFBO0FBQ0QsSzs7OEJBRUQsUyx3QkFBUztBQUNQLGVBQU8sQ0FBQSxXQUFBLEVBQWMsS0FBQSxPQUFBLENBQUEsYUFBQSxDQUFyQixPQUFxQixDQUFkLENBQVA7QUFDRCxLOzs4QkFFRCxPLG9CQUFBLEksRUFBb0I7QUFDbEIsWUFBSSxTQUFTLEtBQUEsT0FBQSxDQUFBLFlBQUEsQ0FBYixJQUFhLENBQWI7QUFDQSxlQUFPLENBQUEsU0FBQSxFQUFQLE1BQU8sQ0FBUDtBQUNELEs7OzhCQUVELE0sbUJBQUEsSSxFQUFtQjtBQUNqQixZQUFJLFNBQVMsS0FBQSxPQUFBLENBQUEsYUFBQSxDQUFiLElBQWEsQ0FBYjtBQUNBLGVBQU8sQ0FBQSxXQUFBLEVBQVAsTUFBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsTyxzQkFBTztBQUNMLGVBQU8sQ0FBQSxXQUFBLEVBQVAsQ0FBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsTSx5QkFBbUQ7QUFBQSxZQUE1QyxJQUE0QztBQUFBLFlBQW5ELE9BQW1EOztBQUlqRCxZQUFJLEtBQUEsT0FBQSxDQUFBLEdBQUEsQ0FBSixJQUFJLENBQUosRUFBNEI7QUFDMUIsZ0JBQUksU0FBUyxLQUFBLE9BQUEsQ0FBQSxHQUFBLENBQWIsSUFBYSxDQUFiO0FBQ0EsbUJBQU8sQ0FBQSxXQUFBLEVBQVAsTUFBTyxDQUFQO0FBRkYsU0FBQSxNQUdPO0FBQ0wsZ0JBQUksVUFBUyxLQUFBLE9BQUEsQ0FBQSxZQUFBLENBQWIsSUFBYSxDQUFiO0FBQ0EsbUJBQU8sQ0FBQSxvQkFBQSxFQUF1QixDQUFBLE9BQUEsRUFBOUIsT0FBOEIsQ0FBdkIsQ0FBUDtBQUNEO0FBQ0YsSzs7OEJBRUQsTyxvQkFBQSxJLEVBQXNCO0FBQ3BCLGVBQU8sQ0FBQSxTQUFBLEVBQVAsSUFBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsSyxtQkFBQSxFLEVBQWdCO0FBQ2QsZUFBTyxDQUFBLE9BQUEsRUFBVSxLQUFBLE9BQUEsQ0FBQSxhQUFBLENBQWpCLEVBQWlCLENBQVYsQ0FBUDtBQUNELEs7OzhCQUVELFEsc0JBQUEsRyxFQUFrQztBQUNoQyxlQUFPLENBQUEsVUFBQSxFQUFhLEtBQUEsT0FBQSxDQUFwQixXQUFvQixFQUFiLENBQVA7QUFDRCxLOzs4QkFFRCxRLHFCQUFBLEUsRUFBdUI7QUFDckIsWUFBSSxPQUFKLENBQUEsRUFBYztBQUNaLGtCQUFNLElBQUEsS0FBQSxDQUFOLHNCQUFNLENBQU47QUFDRDtBQUVELGVBQU8sQ0FBQSxVQUFBLEVBQWEsS0FBQSxPQUFBLENBQUEsYUFBQSxDQUFwQixFQUFvQixDQUFiLENBQVA7QUFDRCxLOzs4QkFFRCxjLDJCQUFBLEUsRUFBNkI7QUFDM0IsWUFBSSxPQUFKLENBQUEsRUFBYztBQUNaLGtCQUFNLElBQUEsS0FBQSxDQUFOLDRCQUFNLENBQU47QUFDRDtBQUVELGVBQU8sQ0FBQSxnQkFBQSxFQUFtQixLQUFBLE9BQUEsQ0FBQSxhQUFBLENBQTFCLEVBQTBCLENBQW5CLENBQVA7QUFDRCxLOzs4QkFFRCxPLHNCQUFPO0FBQ0wsZUFBTyxDQUFBLFNBQUEsRUFBWSxLQUFBLE9BQUEsQ0FBbkIsV0FBbUIsRUFBWixDQUFQO0FBQ0QsSzs7OEJBRUQsSyx5QkFBbUQ7QUFBQSxZQUE3QyxRQUE2QztBQUFBLFlBQW5ELE9BQW1EOztBQUNqRCxlQUFPLENBQUEsT0FBQSxFQUFVLENBQUEsUUFBQSxFQUFqQixPQUFpQixDQUFWLENBQVA7QUFDRCxLOzs4QkFFRCxRLHVCQUFRO0FBQ04sZUFBTyxDQUFQLFVBQU8sQ0FBUDtBQUNELEs7OzhCQUVELE0scUJBQU07QUFDSixlQUFPLENBQVAsUUFBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsSSxpQkFBQSxPLEVBQW9CO0FBQ2xCLGVBQU8sQ0FBQSxNQUFBLEVBQVAsT0FBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsTyxvQkFBQSxRLEVBQXVCO0FBQ3JCLGVBQU8sQ0FBQSxTQUFBLEVBQVAsUUFBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsYSwwQkFBQSxPLEVBQXNDO0FBQ3BDLGVBQU8sQ0FBQSxlQUFBLEVBQVAsT0FBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsVywrQkFBeUQ7QUFBQSxZQUE3QyxPQUE2QztBQUFBLFlBQXpELE1BQXlEOztBQUN2RCxlQUFPLENBQUEsYUFBQSxFQUFnQixDQUFBLE9BQUEsRUFBdkIsTUFBdUIsQ0FBaEIsQ0FBUDtBQUNELEs7OzhCQUVELFMsc0JBQUEsSSxFQUFzQjtBQUNwQixlQUFPLENBQUEsV0FBQSxFQUFQLElBQU8sQ0FBUDtBQUNELEs7OzhCQUVELFUsdUJBQUEsSSxFQUF1QjtBQUNyQixlQUFPLENBQUEsWUFBQSxFQUFQLElBQU8sQ0FBUDtBQUNELEs7OzhCQUVELFUsOEJBQStDO0FBQUEsWUFBcEMsSUFBb0M7QUFBQSxZQUEvQyxFQUErQzs7QUFDN0MsZUFBTyxDQUFBLFlBQUEsRUFBZSxDQUFBLElBQUEsRUFBdEIsRUFBc0IsQ0FBZixDQUFQO0FBQ0QsSzs7OEJBRUQsWSxnQ0FBaUQ7QUFBQSxZQUFwQyxJQUFvQztBQUFBLFlBQWpELEVBQWlEOztBQUMvQyxlQUFPLENBQUEsY0FBQSxFQUFpQixDQUFBLElBQUEsRUFBeEIsRUFBd0IsQ0FBakIsQ0FBUDtBQUNELEs7OzhCQUVELFcsK0JBQWdEO0FBQUEsWUFBcEMsSUFBb0M7QUFBQSxZQUFoRCxFQUFnRDs7QUFDOUMsZUFBTyxDQUFBLGFBQUEsRUFBZ0IsQ0FBQSxJQUFBLEVBQXZCLEVBQXVCLENBQWhCLENBQVA7QUFDRCxLOzs4QkFFRCxhLGlDQUFrRDtBQUFBLFlBQXBDLElBQW9DO0FBQUEsWUFBbEQsRUFBa0Q7O0FBQ2hELGVBQU8sQ0FBQSxlQUFBLEVBQWtCLENBQUEsSUFBQSxFQUF6QixFQUF5QixDQUFsQixDQUFQO0FBQ0QsSzs7OEJBRUQscUIseUNBQTBEO0FBQUEsWUFBcEMsSUFBb0M7QUFBQSxZQUExRCxFQUEwRDs7QUFDeEQsZUFBTyxDQUFBLHNCQUFBLEVBQXlCLENBQUEsSUFBQSxFQUFoQyxFQUFnQyxDQUF6QixDQUFQO0FBQ0QsSzs7OEJBRUQsTSxtQkFBQSxPLEVBQXVCO0FBQ3JCLGVBQU8sQ0FBQSxRQUFBLEVBQVAsT0FBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsTyxvQkFBQSxLLEVBQTJEO0FBQ3pELGVBQU8sQ0FBQSxTQUFBLEVBQVAsS0FBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsWSx5QkFBQSxLLEVBQTBCO0FBQ3hCLGVBQU8sQ0FBQSxjQUFBLEVBQVAsS0FBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsYSwwQkFBQSxLLEVBQTJCO0FBQ3pCLGVBQU8sQ0FBQSxlQUFBLEVBQVAsS0FBTyxDQUFQO0FBQ0QsSzs7OEJBRUQsTSxxQkFBTTtBQUNKLGVBQU8sQ0FBUCxRQUFPLENBQVA7QUFDRCxLOzs7OzRCQXJMVTtBQUNULG1CQUFjLEtBQUEsV0FBQSxDQUFkLE9BQUE7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFByb2Nlc3NvcixcbiAgT3AsXG4gIEFsbG9jYXRlU3ltYm9sc09wcyxcbiAgUGF0aEhlYWQsXG4gIEphdmFTY3JpcHRDb21waWxlck9wcyxcbiAgT3BzLFxuICBTb3VyY2VMb2NhdGlvbixcbn0gZnJvbSAnLi9jb21waWxlci1vcHMnO1xuaW1wb3J0IHsgQVNUIH0gZnJvbSAnQGdsaW1tZXIvc3ludGF4JztcbmltcG9ydCB7IE9wdGlvbiwgRXhwcmVzc2lvbkNvbnRleHQgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFN0YWNrLCBleHBlY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuZXhwb3J0IHR5cGUgSW5WYXJpYWJsZSA9IFBhdGhIZWFkO1xuZXhwb3J0IHR5cGUgT3V0VmFyaWFibGUgPSBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIE91dCA9IE9wczxKYXZhU2NyaXB0Q29tcGlsZXJPcHM+O1xuXG5leHBvcnQgY2xhc3MgU3ltYm9sQWxsb2NhdG9yIGltcGxlbWVudHMgUHJvY2Vzc29yPEFsbG9jYXRlU3ltYm9sc09wcz4ge1xuICBwcml2YXRlIHN5bWJvbFN0YWNrID0gbmV3IFN0YWNrPEFTVC5TeW1ib2xzPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb3BzOiByZWFkb25seSBPcHM8QWxsb2NhdGVTeW1ib2xzT3BzPltdLFxuICAgIHByaXZhdGUgbG9jYXRpb25zOiByZWFkb25seSBPcHRpb248U291cmNlTG9jYXRpb24+W11cbiAgKSB7fVxuXG4gIHByb2Nlc3MoKToge1xuICAgIG9wczogcmVhZG9ubHkgT3BzPEphdmFTY3JpcHRDb21waWxlck9wcz5bXTtcbiAgICByZWFkb25seSBsb2NhdGlvbnM6IE9wdGlvbjxTb3VyY2VMb2NhdGlvbj5bXTtcbiAgfSB7XG4gICAgbGV0IG91dCA9IFtdO1xuICAgIGxldCBsb2NhdGlvbnMgPSBbXTtcbiAgICBsZXQgeyBvcHMgfSA9IHRoaXM7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG9wID0gb3BzW2ldO1xuICAgICAgbGV0IGxvY2F0aW9uID0gdGhpcy5sb2NhdGlvbnNbaV07XG4gICAgICBsZXQgcmVzdWx0ID0gdGhpcy5kaXNwYXRjaChvcCk7XG5cbiAgICAgIG91dC5wdXNoKHJlc3VsdCk7XG4gICAgICBsb2NhdGlvbnMucHVzaChsb2NhdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgb3BzOiBvdXQsIGxvY2F0aW9ucyB9O1xuICB9XG5cbiAgZGlzcGF0Y2g8TyBleHRlbmRzIE9wczxBbGxvY2F0ZVN5bWJvbHNPcHM+PihvcDogTyk6IE9wczxKYXZhU2NyaXB0Q29tcGlsZXJPcHM+IHtcbiAgICBsZXQgbmFtZSA9IG9wWzBdO1xuICAgIGxldCBvcGVyYW5kID0gb3BbMV07XG5cbiAgICByZXR1cm4gKHRoaXNbbmFtZV0gYXMgYW55KShvcGVyYW5kKSB8fCAoKG9wIGFzIHVua25vd24pIGFzIE9wczxKYXZhU2NyaXB0Q29tcGlsZXJPcHM+KTtcbiAgfVxuXG4gIGdldCBzeW1ib2xzKCk6IEFTVC5TeW1ib2xzIHtcbiAgICByZXR1cm4gZXhwZWN0KHRoaXMuc3ltYm9sU3RhY2suY3VycmVudCwgJ0V4cGVjdGVkIGEgc3ltYm9sIHRhYmxlIG9uIHRoZSBzdGFjaycpO1xuICB9XG5cbiAgc3RhcnRQcm9ncmFtKG9wOiBBU1QuVGVtcGxhdGUpIHtcbiAgICB0aGlzLnN5bWJvbFN0YWNrLnB1c2gob3Auc3ltYm9scyEpO1xuICB9XG5cbiAgZW5kUHJvZ3JhbSgpIHtcbiAgICB0aGlzLnN5bWJvbFN0YWNrLnBvcCgpO1xuICB9XG5cbiAgc3RhcnRCbG9jayhvcDogQVNULkJsb2NrKSB7XG4gICAgdGhpcy5zeW1ib2xTdGFjay5wdXNoKG9wLnN5bWJvbHMhKTtcbiAgfVxuXG4gIGVuZEJsb2NrKCkge1xuICAgIHRoaXMuc3ltYm9sU3RhY2sucG9wKCk7XG4gIH1cblxuICBvcGVuTmFtZWRCbG9jayhvcDogQVNULkVsZW1lbnROb2RlKSB7XG4gICAgdGhpcy5zeW1ib2xTdGFjay5wdXNoKG9wLnN5bWJvbHMhKTtcbiAgfVxuXG4gIGNsb3NlTmFtZWRCbG9jayhfb3A6IEFTVC5FbGVtZW50Tm9kZSkge1xuICAgIHRoaXMuc3ltYm9sU3RhY2sucG9wKCk7XG4gIH1cblxuICBmbHVzaEVsZW1lbnQob3A6IEFTVC5FbGVtZW50Tm9kZSkge1xuICAgIHRoaXMuc3ltYm9sU3RhY2sucHVzaChvcC5zeW1ib2xzISk7XG4gIH1cblxuICBjbG9zZUVsZW1lbnQoX29wOiBBU1QuRWxlbWVudE5vZGUpIHtcbiAgICB0aGlzLnN5bWJvbFN0YWNrLnBvcCgpO1xuICB9XG5cbiAgY2xvc2VDb21wb25lbnQoX29wOiBBU1QuRWxlbWVudE5vZGUpIHtcbiAgICB0aGlzLnN5bWJvbFN0YWNrLnBvcCgpO1xuICB9XG5cbiAgY2xvc2VEeW5hbWljQ29tcG9uZW50KF9vcDogQVNULkVsZW1lbnROb2RlKSB7XG4gICAgdGhpcy5zeW1ib2xTdGFjay5wb3AoKTtcbiAgfVxuXG4gIGF0dHJTcGxhdCgpOiBPcDxKYXZhU2NyaXB0Q29tcGlsZXJPcHMsICdhdHRyU3BsYXQnPiB7XG4gICAgcmV0dXJuIFsnYXR0clNwbGF0JywgdGhpcy5zeW1ib2xzLmFsbG9jYXRlQmxvY2soJ2F0dHJzJyldO1xuICB9XG5cbiAgZ2V0RnJlZShuYW1lOiBzdHJpbmcpOiBPcDxKYXZhU2NyaXB0Q29tcGlsZXJPcHMsICdnZXRGcmVlJz4ge1xuICAgIGxldCBzeW1ib2wgPSB0aGlzLnN5bWJvbHMuYWxsb2NhdGVGcmVlKG5hbWUpO1xuICAgIHJldHVybiBbJ2dldEZyZWUnLCBzeW1ib2xdO1xuICB9XG5cbiAgZ2V0QXJnKG5hbWU6IHN0cmluZyk6IE9wPEphdmFTY3JpcHRDb21waWxlck9wcywgJ2dldFN5bWJvbCc+IHtcbiAgICBsZXQgc3ltYm9sID0gdGhpcy5zeW1ib2xzLmFsbG9jYXRlTmFtZWQobmFtZSk7XG4gICAgcmV0dXJuIFsnZ2V0U3ltYm9sJywgc3ltYm9sXTtcbiAgfVxuXG4gIGdldFRoaXMoKTogT3A8SmF2YVNjcmlwdENvbXBpbGVyT3BzLCAnZ2V0U3ltYm9sJz4ge1xuICAgIHJldHVybiBbJ2dldFN5bWJvbCcsIDBdO1xuICB9XG5cbiAgZ2V0VmFyKFtuYW1lLCBjb250ZXh0XTogW3N0cmluZywgRXhwcmVzc2lvbkNvbnRleHRdKTogT3A8XG4gICAgSmF2YVNjcmlwdENvbXBpbGVyT3BzLFxuICAgICdnZXRTeW1ib2wnIHwgJ2dldEZyZWUnIHwgJ2dldEZyZWVXaXRoQ29udGV4dCdcbiAgPiB7XG4gICAgaWYgKHRoaXMuc3ltYm9scy5oYXMobmFtZSkpIHtcbiAgICAgIGxldCBzeW1ib2wgPSB0aGlzLnN5bWJvbHMuZ2V0KG5hbWUpO1xuICAgICAgcmV0dXJuIFsnZ2V0U3ltYm9sJywgc3ltYm9sXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHN5bWJvbCA9IHRoaXMuc3ltYm9scy5hbGxvY2F0ZUZyZWUobmFtZSk7XG4gICAgICByZXR1cm4gWydnZXRGcmVlV2l0aENvbnRleHQnLCBbc3ltYm9sLCBjb250ZXh0XV07XG4gICAgfVxuICB9XG5cbiAgZ2V0UGF0aChyZXN0OiBzdHJpbmdbXSk6IE9wPEphdmFTY3JpcHRDb21waWxlck9wcywgJ2dldFBhdGgnPiB7XG4gICAgcmV0dXJuIFsnZ2V0UGF0aCcsIHJlc3RdO1xuICB9XG5cbiAgeWllbGQob3A6IHN0cmluZyk6IE9wPEphdmFTY3JpcHRDb21waWxlck9wcywgJ3lpZWxkJz4ge1xuICAgIHJldHVybiBbJ3lpZWxkJywgdGhpcy5zeW1ib2xzLmFsbG9jYXRlQmxvY2sob3ApXTtcbiAgfVxuXG4gIGRlYnVnZ2VyKF9vcDogT3B0aW9uPEluVmFyaWFibGVbXT4pOiBPcDxKYXZhU2NyaXB0Q29tcGlsZXJPcHMsICdkZWJ1Z2dlcic+IHtcbiAgICByZXR1cm4gWydkZWJ1Z2dlcicsIHRoaXMuc3ltYm9scy5nZXRFdmFsSW5mbygpXTtcbiAgfVxuXG4gIGhhc0Jsb2NrKG9wOiBJblZhcmlhYmxlKTogT3A8SmF2YVNjcmlwdENvbXBpbGVyT3BzLCAnaGFzQmxvY2snPiB7XG4gICAgaWYgKG9wID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYXNCbG9jayB0aGlzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFsnaGFzQmxvY2snLCB0aGlzLnN5bWJvbHMuYWxsb2NhdGVCbG9jayhvcCldO1xuICB9XG5cbiAgaGFzQmxvY2tQYXJhbXMob3A6IEluVmFyaWFibGUpOiBPcDxKYXZhU2NyaXB0Q29tcGlsZXJPcHMsICdoYXNCbG9ja1BhcmFtcyc+IHtcbiAgICBpZiAob3AgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhc0Jsb2NrUGFyYW1zIHRoaXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gWydoYXNCbG9ja1BhcmFtcycsIHRoaXMuc3ltYm9scy5hbGxvY2F0ZUJsb2NrKG9wKV07XG4gIH1cblxuICBwYXJ0aWFsKCk6IE9wPEphdmFTY3JpcHRDb21waWxlck9wcywgJ3BhcnRpYWwnPiB7XG4gICAgcmV0dXJuIFsncGFydGlhbCcsIHRoaXMuc3ltYm9scy5nZXRFdmFsSW5mbygpXTtcbiAgfVxuXG4gIGJsb2NrKFt0ZW1wbGF0ZSwgaW52ZXJzZV06IFtudW1iZXIsIE9wdGlvbjxudW1iZXI+XSk6IE9wPEphdmFTY3JpcHRDb21waWxlck9wcywgJ2Jsb2NrJz4ge1xuICAgIHJldHVybiBbJ2Jsb2NrJywgW3RlbXBsYXRlLCBpbnZlcnNlXV07XG4gIH1cblxuICBtb2RpZmllcigpOiBPdXQge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJ107XG4gIH1cblxuICBoZWxwZXIoKTogT3A8SmF2YVNjcmlwdENvbXBpbGVyT3BzLCAnaGVscGVyJz4ge1xuICAgIHJldHVybiBbJ2hlbHBlciddO1xuICB9XG5cbiAgdGV4dChjb250ZW50OiBzdHJpbmcpOiBPdXQge1xuICAgIHJldHVybiBbJ3RleHQnLCBjb250ZW50XTtcbiAgfVxuXG4gIGNvbW1lbnQoY29tbWVudDogc3RyaW5nKTogT3V0IHtcbiAgICByZXR1cm4gWydjb21tZW50JywgY29tbWVudF07XG4gIH1cblxuICBvcGVuQ29tcG9uZW50KGVsZW1lbnQ6IEFTVC5FbGVtZW50Tm9kZSk6IE91dCB7XG4gICAgcmV0dXJuIFsnb3BlbkNvbXBvbmVudCcsIGVsZW1lbnRdO1xuICB9XG5cbiAgb3BlbkVsZW1lbnQoW2VsZW1lbnQsIHNpbXBsZV06IFtBU1QuRWxlbWVudE5vZGUsIGJvb2xlYW5dKTogT3V0IHtcbiAgICByZXR1cm4gWydvcGVuRWxlbWVudCcsIFtlbGVtZW50LCBzaW1wbGVdXTtcbiAgfVxuXG4gIHN0YXRpY0FyZyhuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gWydzdGF0aWNBcmcnLCBuYW1lXTtcbiAgfVxuXG4gIGR5bmFtaWNBcmcobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFsnZHluYW1pY0FyZycsIG5hbWVdO1xuICB9XG5cbiAgc3RhdGljQXR0cihbbmFtZSwgbnNdOiBbc3RyaW5nLCBPcHRpb248c3RyaW5nPl0pIHtcbiAgICByZXR1cm4gWydzdGF0aWNBdHRyJywgW25hbWUsIG5zXV07XG4gIH1cblxuICB0cnVzdGluZ0F0dHIoW25hbWUsIG5zXTogW3N0cmluZywgT3B0aW9uPHN0cmluZz5dKSB7XG4gICAgcmV0dXJuIFsndHJ1c3RpbmdBdHRyJywgW25hbWUsIG5zXV07XG4gIH1cblxuICBkeW5hbWljQXR0cihbbmFtZSwgbnNdOiBbc3RyaW5nLCBPcHRpb248c3RyaW5nPl0pIHtcbiAgICByZXR1cm4gWydkeW5hbWljQXR0cicsIFtuYW1lLCBuc11dO1xuICB9XG5cbiAgY29tcG9uZW50QXR0cihbbmFtZSwgbnNdOiBbc3RyaW5nLCBPcHRpb248c3RyaW5nPl0pIHtcbiAgICByZXR1cm4gWydjb21wb25lbnRBdHRyJywgW25hbWUsIG5zXV07XG4gIH1cblxuICB0cnVzdGluZ0NvbXBvbmVudEF0dHIoW25hbWUsIG5zXTogW3N0cmluZywgT3B0aW9uPHN0cmluZz5dKSB7XG4gICAgcmV0dXJuIFsndHJ1c3RlZENvbXBvbmVudEF0dHInLCBbbmFtZSwgbnNdXTtcbiAgfVxuXG4gIGFwcGVuZCh0cnVzdGVkOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIFsnYXBwZW5kJywgdHJ1c3RlZF07XG4gIH1cblxuICBsaXRlcmFsKHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9wPEFsbG9jYXRlU3ltYm9sc09wcywgJ2xpdGVyYWwnPiB7XG4gICAgcmV0dXJuIFsnbGl0ZXJhbCcsIHZhbHVlXTtcbiAgfVxuXG4gIHByZXBhcmVBcnJheShjb3VudDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIFsncHJlcGFyZUFycmF5JywgY291bnRdO1xuICB9XG5cbiAgcHJlcGFyZU9iamVjdChjb3VudDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIFsncHJlcGFyZU9iamVjdCcsIGNvdW50XTtcbiAgfVxuXG4gIGNvbmNhdCgpIHtcbiAgICByZXR1cm4gWydjb25jYXQnXTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==