@glimmer/compiler
Version:
445 lines (408 loc) • 50.3 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 { dict, assertNever, assert, values } from '@glimmer/util';
import { normalizeStatement, VariableKind } from './builder-interface';
export var ProgramSymbols = function () {
function ProgramSymbols() {
_classCallCheck(this, ProgramSymbols);
this._freeVariables = [];
this._symbols = ['this'];
this.top = this;
}
ProgramSymbols.prototype.toSymbols = function toSymbols() {
return this._symbols.slice(1);
};
ProgramSymbols.prototype.toUpvars = function toUpvars() {
return this._freeVariables;
};
ProgramSymbols.prototype.freeVar = function freeVar(name) {
return addString(this._freeVariables, name);
};
ProgramSymbols.prototype.block = function block(name) {
return this.symbol(name);
};
ProgramSymbols.prototype.arg = function arg(name) {
return addString(this._symbols, name);
};
ProgramSymbols.prototype.local = function local(name) {
throw new Error('No local ' + name + ' was found. Maybe you meant ^' + name + '?');
};
ProgramSymbols.prototype.this = function _this() {
return 0;
};
ProgramSymbols.prototype.hasLocal = function hasLocal(_name) {
return false;
};
// any symbol
ProgramSymbols.prototype.symbol = function symbol(name) {
return addString(this._symbols, name);
};
ProgramSymbols.prototype.child = function child(locals) {
return new LocalSymbols(this, locals);
};
return ProgramSymbols;
}();
var LocalSymbols = function () {
function LocalSymbols(parent, locals) {
_classCallCheck(this, LocalSymbols);
this.parent = parent;
this.locals = dict();
for (var _iterator = locals, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var local = _ref;
this.locals[local] = parent.top.symbol(local);
}
}
LocalSymbols.prototype.freeVar = function freeVar(name) {
return this.parent.freeVar(name);
};
LocalSymbols.prototype.arg = function arg(name) {
return this.parent.arg(name);
};
LocalSymbols.prototype.block = function block(name) {
return this.parent.block(name);
};
LocalSymbols.prototype.local = function local(name) {
if (name in this.locals) {
return this.locals[name];
} else {
return this.parent.local(name);
}
};
LocalSymbols.prototype.this = function _this() {
return this.parent.this();
};
LocalSymbols.prototype.hasLocal = function hasLocal(name) {
if (name in this.locals) {
return true;
} else {
return this.parent.hasLocal(name);
}
};
LocalSymbols.prototype.child = function child(locals) {
return new LocalSymbols(this, locals);
};
_createClass(LocalSymbols, [{
key: 'paramSymbols',
get: function get() {
return values(this.locals);
}
}, {
key: 'top',
get: function get() {
return this.parent.top;
}
}]);
return LocalSymbols;
}();
function addString(array, item) {
var index = array.indexOf(item);
if (index === -1) {
index = array.length;
array.push(item);
return index;
} else {
return index;
}
}
function unimpl(message) {
return new Error('unimplemented ' + message);
}
export function buildStatements(statements, symbols) {
var out = [];
statements.forEach(function (s) {
return out.push.apply(out, buildStatement(normalizeStatement(s), symbols));
});
return out;
}
export function buildNormalizedStatements(statements, symbols) {
var out = [];
statements.forEach(function (s) {
return out.push.apply(out, buildStatement(s, symbols));
});
return out;
}
export function buildStatement(normalized) {
var symbols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new ProgramSymbols();
switch (normalized.kind) {
case "AppendPath" /* AppendPath */:
{
return [[1 /* Append */
, +normalized.trusted, 0, 0, buildPath(normalized.path, "AppendSingleId" /* AppendSingleId */, symbols)]];
}
case "AppendExpr" /* AppendExpr */:
{
return [[1 /* Append */
, +normalized.trusted, 0, 0, buildExpression(normalized.expr, "Expression" /* Expression */, symbols)]];
}
case "Call" /* Call */:
{
var path = normalized.path,
params = normalized.params,
hash = normalized.hash,
trusted = normalized.trusted;
var builtParams = params ? buildParams(params, symbols) : [];
var builtHash = hash ? buildHash(hash, symbols) : null;
var builtExpr = buildPath(path, "CallHead" /* CallHead */, symbols);
return [[1 /* Append */, +trusted, 0, 0, [31 /* Call */, 0, 0, builtExpr, builtParams, builtHash]]];
}
case "Literal" /* Literal */:
{
return [[1 /* Append */, 1, 0, 0, normalized.value]];
}
case "Comment" /* Comment */:
{
return [[2 /* Comment */, normalized.value]];
}
case "Block" /* Block */:
{
var blocks = buildBlocks(normalized.blocks, normalized.blockParams, symbols);
var _hash = buildHash(normalized.hash, symbols);
var _params = buildParams(normalized.params, symbols);
var _path = buildPath(normalized.path, "BlockHead" /* BlockHead */, symbols);
return [[5 /* Block */, _path, _params, _hash, blocks]];
}
case "Element" /* Element */:
return buildElement(normalized, symbols);
case "Modifier" /* Modifier */:
throw unimpl('modifier');
case "DynamicComponent" /* DynamicComponent */:
throw unimpl('dynamic component');
default:
throw assertNever(normalized);
}
}
export function s(arr) {
for (var _len = arguments.length, interpolated = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
interpolated[_key - 1] = arguments[_key];
}
var result = arr.reduce(function (result, string, i) {
return result + ('' + string + (interpolated[i] ? interpolated[i] : ''));
}, '');
return [0 /* Literal */, result];
}
export function c(arr) {
for (var _len2 = arguments.length, interpolated = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
interpolated[_key2 - 1] = arguments[_key2];
}
var result = arr.reduce(function (result, string, i) {
return result + ('' + string + (interpolated[i] ? interpolated[i] : ''));
}, '');
return [1 /* Comment */, result];
}
export function unicode(charCode) {
return String.fromCharCode(parseInt(charCode, 16));
}
export var NEWLINE = '\n';
function buildElement(_ref2, symbols) {
var name = _ref2.name,
attrs = _ref2.attrs,
block = _ref2.block;
var out = [[9 /* OpenElement */, name, !hasSplat(attrs)]];
if (attrs) {
var _buildAttrs = buildAttrs(attrs, symbols),
attributes = _buildAttrs.attributes,
args = _buildAttrs.args;
out.push.apply(out, attributes);
false && assert(args === null, 'Can\'t pass args to a simple element');
}
out.push([10 /* FlushElement */]);
if (Array.isArray(block)) {
block.forEach(function (s) {
return out.push.apply(out, buildStatement(s, symbols));
});
} else if (block === null) {
// do nothing
} else {
throw assertNever(block);
}
out.push([11 /* CloseElement */]);
return out;
}
function hasSplat(attrs) {
if (attrs === null) return false;
return Object.keys(attrs).some(function (a) {
return attrs[a] === "Splat";
} /* Splat */);
}
export function buildAngleInvocation(_ref3, symbols) {
var attrs = _ref3.attrs,
block = _ref3.block,
head = _ref3.head;
var attrList = [];
var args = null;
var blockList = [];
if (attrs) {
var built = buildAttrs(attrs, symbols);
attrList = built.attributes;
args = built.args;
}
if (block) blockList = buildNormalizedStatements(block, symbols);
return [7 /* Component */
, buildExpression(head, "CallHead" /* CallHead */, symbols), attrList, args, [['default'], [{ parameters: [], statements: blockList }]]];
}
export function buildAttrs(attrs, symbols) {
var attributes = [];
var keys = [];
var values = [];
Object.keys(attrs).forEach(function (key) {
var value = attrs[key];
if (value === "Splat" /* Splat */) {
attributes.push([15 /* AttrSplat */, symbols.block('&attrs')]);
} else if (key[0] === '@') {
keys.push(key);
values.push(buildExpression(value, "Expression" /* Expression */, symbols));
} else {
attributes.push.apply(attributes, buildAttributeValue(key, value,
// TODO: extract namespace from key
extractNamespace(key), symbols));
}
});
return { attributes: attributes, args: keys.length === 0 ? null : [keys, values] };
}
export function extractNamespace(name) {
if (name === 'xmlns') {
return "http://www.w3.org/2000/xmlns/" /* XMLNS */;
}
var match = name.match(/^([^:]*):([^:]*)$/);
if (match === null) {
return null;
}
var namespace = match[1];
switch (namespace) {
case 'xlink':
return "http://www.w3.org/1999/xlink" /* XLink */;
case 'xml':
return "http://www.w3.org/XML/1998/namespace" /* XML */;
case 'xmlns':
return "http://www.w3.org/2000/xmlns/" /* XMLNS */;
}
return null;
}
export function buildAttributeValue(name, value, namespace, symbols) {
switch (value.type) {
case "Literal" /* Literal */:
{
var val = value.value;
if (val === false) {
return [];
} else if (val === true) {
return [[12 /* StaticAttr */, name, '', namespace]];
} else if (typeof val === 'string') {
return [[12 /* StaticAttr */, name, val, namespace]];
} else {
throw new Error('Unexpected/unimplemented literal attribute ' + JSON.stringify(val));
}
}
default:
return [[13 /* DynamicAttr */
, name, buildExpression(value, "AppendSingleId" /* AppendSingleId */, symbols), namespace]];
}
}
export function buildExpression(expr, context, symbols) {
switch (expr.type) {
case "Get" /* Get */:
{
return buildPath(expr.path, context, symbols);
}
case "Concat" /* Concat */:
{
return [32 /* Concat */, buildConcat(expr.params, symbols)];
}
case "Call" /* Call */:
{
var builtParams = buildParams(expr.params, symbols);
var builtHash = buildHash(expr.hash, symbols);
var builtExpr = buildPath(expr.path, "CallHead" /* CallHead */, symbols);
return [31 /* Call */, 0, 0, builtExpr, builtParams, builtHash];
}
case "HasBlock" /* HasBlock */:
{
return [28 /* HasBlock */
, buildVar({ kind: VariableKind.Block, name: expr.name }, "Expression" /* Expression */, symbols)];
}
case "HasBlockParams" /* HasBlockParams */:
{
return [29 /* HasBlockParams */
, buildVar({ kind: VariableKind.Block, name: expr.name }, "Expression" /* Expression */, symbols)];
}
case "Literal" /* Literal */:
{
if (expr.value === undefined) {
return [30 /* Undefined */];
} else {
return expr.value;
}
}
}
}
export function buildPath(path, context, symbols) {
if (path.tail.length === 0) {
return [27 /* GetPath */, buildVar(path.variable, context, symbols), path.tail];
} else {
return [27 /* GetPath */, buildVar(path.variable, "Expression" /* Expression */, symbols), path.tail];
}
}
export function buildVar(head, context, symbols) {
switch (head.kind) {
case VariableKind.Free:
return [26 /* GetContextualFree */, symbols.freeVar(head.name), context];
case VariableKind.Arg:
return [24 /* GetSymbol */, symbols.arg(head.name)];
case VariableKind.Block:
return [24 /* GetSymbol */, symbols.block(head.name)];
case VariableKind.Local:
return [24 /* GetSymbol */, symbols.local(head.name)];
case VariableKind.This:
return [24 /* GetSymbol */, symbols.this()];
}
}
export function buildParams(exprs, symbols) {
if (exprs === null) return null;
return exprs.map(function (e) {
return buildExpression(e, "Expression" /* Expression */, symbols);
});
}
export function buildConcat(exprs, symbols) {
return exprs.map(function (e) {
return buildExpression(e, "AppendSingleId" /* AppendSingleId */, symbols);
});
}
export function buildHash(exprs, symbols) {
if (exprs === null) return null;
var out = [[], []];
Object.keys(exprs).forEach(function (key) {
out[0].push(key);
out[1].push(buildExpression(exprs[key], "Expression" /* Expression */, symbols));
});
return out;
}
export function buildBlocks(blocks, blockParams, parent) {
var keys = [];
var values = [];
Object.keys(blocks).forEach(function (name) {
keys.push(name);
if (name === 'default') {
var symbols = parent.child(blockParams || []);
values.push({
parameters: symbols.paramSymbols,
statements: buildNormalizedStatements(blocks[name], symbols)
});
} else {
values.push({
parameters: [],
statements: buildNormalizedStatements(blocks[name], parent)
});
}
});
return [keys, values];
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFHQSxTQUFBLElBQUEsRUFBQSxXQUFBLEVBQUEsTUFBQSxFQUFBLE1BQUEsUUFBQSxlQUFBO0FBQ0EsU0FBQSxrQkFBQSxFQUFBLFlBQUEsUUFBQSxxQkFBQTtBQWtDQSxXQUFNLGNBQU47QUFBQSw4QkFBQTtBQUFBOztBQUNFLGFBQUEsY0FBQSxHQUFBLEVBQUE7QUFDQSxhQUFBLFFBQUEsR0FBcUIsQ0FBckIsTUFBcUIsQ0FBckI7QUFFQSxhQUFBLEdBQUEsR0FBQSxJQUFBO0FBMENEOztBQTlDRCw2QkFNRSxTQU5GLHdCQU1XO0FBQ1AsZUFBTyxLQUFBLFFBQUEsQ0FBQSxLQUFBLENBQVAsQ0FBTyxDQUFQO0FBQ0QsS0FSSDs7QUFBQSw2QkFVRSxRQVZGLHVCQVVVO0FBQ04sZUFBTyxLQUFQLGNBQUE7QUFDRCxLQVpIOztBQUFBLDZCQWNFLE9BZEYsb0JBY0UsSUFkRixFQWNzQjtBQUNsQixlQUFPLFVBQVUsS0FBVixjQUFBLEVBQVAsSUFBTyxDQUFQO0FBQ0QsS0FoQkg7O0FBQUEsNkJBa0JFLEtBbEJGLGtCQWtCRSxJQWxCRixFQWtCb0I7QUFDaEIsZUFBTyxLQUFBLE1BQUEsQ0FBUCxJQUFPLENBQVA7QUFDRCxLQXBCSDs7QUFBQSw2QkFzQkUsR0F0QkYsZ0JBc0JFLElBdEJGLEVBc0JrQjtBQUNkLGVBQU8sVUFBVSxLQUFWLFFBQUEsRUFBUCxJQUFPLENBQVA7QUFDRCxLQXhCSDs7QUFBQSw2QkEwQkUsS0ExQkYsa0JBMEJFLElBMUJGLEVBMEJvQjtBQUNoQixjQUFNLElBQUEsS0FBQSxlQUFzQixJQUF0QixxQ0FBTixJQUFNLE9BQU47QUFDRCxLQTVCSDs7QUFBQSw2QkE4QkUsSUE5QkYsb0JBOEJNO0FBQ0YsZUFBQSxDQUFBO0FBQ0QsS0FoQ0g7O0FBQUEsNkJBa0NFLFFBbENGLHFCQWtDRSxL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QUEsRUFBQSxFQUEvQyxFQUErQyxDQUEvQztBQUVBLFdBQUEsSUFBQSxDQUFBLEtBQUEsRUFBQSxPQUFBLENBQTJCLGVBQU07QUFDL0IsWUFBQSxDQUFBLEVBQUEsSUFBQSxDQUFBLEdBQUE7QUFDQSxZQUFBLENBQUEsRUFBQSxJQUFBLENBQVksZ0JBQWdCLE1BQWhCLEdBQWdCLENBQWhCLEVBQUEsWUFBQSxDQUFBLGdCQUFBLEVBQVosT0FBWSxDQUFaO0FBRkYsS0FBQTtBQUtBLFdBQUEsR0FBQTtBQUNEO0FBRUQsT0FBTSxTQUFBLFdBQUEsQ0FBQSxNQUFBLEVBQUEsV0FBQSxFQUFBLE1BQUEsRUFHVztBQUVmLFFBQUksT0FBSixFQUFBO0FBQ0EsUUFBSSxTQUFKLEVBQUE7QUFFQSxXQUFBLElBQUEsQ0FBQSxNQUFBLEVBQUEsT0FBQSxDQUE0QixnQkFBTztBQUNqQyxhQUFBLElBQUEsQ0FBQSxJQUFBO0FBRUEsWUFBSSxTQUFKLFNBQUEsRUFBd0I7QUFDdEIsZ0JBQUksVUFBVSxPQUFBLEtBQUEsQ0FBYSxlQUEzQixFQUFjLENBQWQ7QUFFQSxtQkFBQSxJQUFBLENBQVk7QUFDViw0QkFBWSxRQURGLFlBQUE7QUFFViw0QkFBWSwwQkFBMEIsT0FBMUIsSUFBMEIsQ0FBMUIsRUFBQSxPQUFBO0FBRkYsYUFBWjtBQUhGLFNBQUEsTUFPTztBQUNMLG1CQUFBLElBQUEsQ0FBWTtBQUNWLDRCQURVLEVBQUE7QUFFViw0QkFBWSwwQkFBMEIsT0FBMUIsSUFBMEIsQ0FBMUIsRUFBQSxNQUFBO0FBRkYsYUFBWjtBQUlEO0FBZkgsS0FBQTtBQWtCQSxXQUFPLENBQUEsSUFBQSxFQUFQLE1BQU8sQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2lyZUZvcm1hdCwgT3B0aW9uLCBEaWN0LCBFeHByZXNzaW9ucywgRXhwcmVzc2lvbkNvbnRleHQgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcblxuaW1wb3J0IE9wID0gV2lyZUZvcm1hdC5TZXhwT3Bjb2RlcztcbmltcG9ydCB7IGRpY3QsIGFzc2VydE5ldmVyLCBhc3NlcnQsIHZhbHVlcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHtcbiAgQnVpbGRlclN0YXRlbWVudCxcbiAgQnVpbGRlckNvbW1lbnQsXG4gIG5vcm1hbGl6ZVN0YXRlbWVudCxcbiAgSGVhZEtpbmQsXG4gIFBhdGgsXG4gIFZhcmlhYmxlLFxuICBWYXJpYWJsZUtpbmQsXG4gIEJ1aWxkZXIsXG4gIE5vcm1hbGl6ZWRFeHByZXNzaW9uLFxuICBFeHByZXNzaW9uS2luZCxcbiAgTm9ybWFsaXplZFBhcmFtcyxcbiAgTm9ybWFsaXplZEhhc2gsXG4gIE5vcm1hbGl6ZWRBdHRycyxcbiAgTm9ybWFsaXplZEVsZW1lbnQsXG4gIE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIE5vcm1hbGl6ZWRBbmdsZUludm9jYXRpb24sXG4gIE5vcm1hbGl6ZWRCbG9ja3MsXG59IGZyb20gJy4vYnVpbGRlci1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQXR0ck5hbWVzcGFjZSwgTmFtZXNwYWNlIH0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcblxuaW50ZXJmYWNlIFN5bWJvbHMge1xuICB0b3A6IFByb2dyYW1TeW1ib2xzO1xuICBmcmVlVmFyKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYXJnKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYmxvY2sobmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICBsb2NhbChuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHRoaXMoKTogbnVtYmVyO1xuXG4gIGhhc0xvY2FsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgY2hpbGQocGFyYW1zOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scztcbn1cblxuZXhwb3J0IGNsYXNzIFByb2dyYW1TeW1ib2xzIGltcGxlbWVudHMgU3ltYm9scyB7XG4gIF9mcmVlVmFyaWFibGVzOiBzdHJpbmdbXSA9IFtdO1xuICBfc3ltYm9sczogc3RyaW5nW10gPSBbJ3RoaXMnXTtcblxuICB0b3AgPSB0aGlzO1xuXG4gIHRvU3ltYm9scygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N5bWJvbHMuc2xpY2UoMSk7XG4gIH1cblxuICB0b1VwdmFycygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZWVWYXJpYWJsZXM7XG4gIH1cblxuICBmcmVlVmFyKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFkZFN0cmluZyh0aGlzLl9mcmVlVmFyaWFibGVzLCBuYW1lKTtcbiAgfVxuXG4gIGJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sKG5hbWUpO1xuICB9XG5cbiAgYXJnKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFkZFN0cmluZyh0aGlzLl9zeW1ib2xzLCBuYW1lKTtcbiAgfVxuXG4gIGxvY2FsKG5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGxvY2FsICR7bmFtZX0gd2FzIGZvdW5kLiBNYXliZSB5b3UgbWVhbnQgXiR7bmFtZX0/YCk7XG4gIH1cblxuICB0aGlzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBoYXNMb2NhbChfbmFtZTogc3RyaW5nKTogZmFsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGFueSBzeW1ib2xcbiAgc3ltYm9sKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFkZFN0cmluZyh0aGlzLl9zeW1ib2xzLCBuYW1lKTtcbiAgfVxuXG4gIGNoaWxkKGxvY2Fsczogc3RyaW5nW10pOiBMb2NhbFN5bWJvbHMge1xuICAgIHJldHVybiBuZXcgTG9jYWxTeW1ib2xzKHRoaXMsIGxvY2Fscyk7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxTeW1ib2xzIGltcGxlbWVudHMgU3ltYm9scyB7XG4gIHByaXZhdGUgbG9jYWxzOiBEaWN0PG51bWJlcj4gPSBkaWN0KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYXJlbnQ6IFN5bWJvbHMsIGxvY2Fsczogc3RyaW5nW10pIHtcbiAgICBmb3IgKGxldCBsb2NhbCBvZiBsb2NhbHMpIHtcbiAgICAgIHRoaXMubG9jYWxzW2xvY2FsXSA9IHBhcmVudC50b3Auc3ltYm9sKGxvY2FsKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFyYW1TeW1ib2xzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdmFsdWVzKHRoaXMubG9jYWxzKTtcbiAgfVxuXG4gIGdldCB0b3AoKTogUHJvZ3JhbVN5bWJvbHMge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC50b3A7XG4gIH1cblxuICBmcmVlVmFyKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmZyZWVWYXIobmFtZSk7XG4gIH1cblxuICBhcmcobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYXJnKG5hbWUpO1xuICB9XG5cbiAgYmxvY2sobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYmxvY2sobmFtZSk7XG4gIH1cblxuICBsb2NhbChuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmIChuYW1lIGluIHRoaXMubG9jYWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbHNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5sb2NhbChuYW1lKTtcbiAgICB9XG4gIH1cblxuICB0aGlzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LnRoaXMoKTtcbiAgfVxuXG4gIGhhc0xvY2FsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChuYW1lIGluIHRoaXMubG9jYWxzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50Lmhhc0xvY2FsKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGNoaWxkKGxvY2Fsczogc3RyaW5nW10pOiBMb2NhbFN5bWJvbHMge1xuICAgIHJldHVybiBuZXcgTG9jYWxTeW1ib2xzKHRoaXMsIGxvY2Fscyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkU3RyaW5nKGFycmF5OiBzdHJpbmdbXSwgaXRlbTogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgaW5kZXggPSBhcnJheS5sZW5ndGg7XG4gICAgYXJyYXkucHVzaChpdGVtKTtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRlckdldEZyZWUge1xuICB0eXBlOiAnR2V0RnJlZSc7XG4gIGhlYWQ6IHN0cmluZztcbiAgdGFpbDogc3RyaW5nW107XG59XG5cbmZ1bmN0aW9uIHVuaW1wbChtZXNzYWdlOiBzdHJpbmcpOiBFcnJvciB7XG4gIHJldHVybiBuZXcgRXJyb3IoYHVuaW1wbGVtZW50ZWQgJHttZXNzYWdlfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnRzKFxuICBzdGF0ZW1lbnRzOiBCdWlsZGVyU3RhdGVtZW50W10sXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10ge1xuICBsZXQgb3V0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgc3RhdGVtZW50cy5mb3JFYWNoKHMgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQobm9ybWFsaXplU3RhdGVtZW50KHMpLCBzeW1ib2xzKSkpO1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRTdGF0ZW1lbnRzKFxuICBzdGF0ZW1lbnRzOiBOb3JtYWxpemVkU3RhdGVtZW50W10sXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10ge1xuICBsZXQgb3V0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgc3RhdGVtZW50cy5mb3JFYWNoKHMgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQocywgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnQoXG4gIG5vcm1hbGl6ZWQ6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIHN5bWJvbHM6IFN5bWJvbHMgPSBuZXcgUHJvZ3JhbVN5bWJvbHMoKVxuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIHN3aXRjaCAobm9ybWFsaXplZC5raW5kKSB7XG4gICAgY2FzZSBIZWFkS2luZC5BcHBlbmRQYXRoOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAgT3AuQXBwZW5kLFxuICAgICAgICAgICtub3JtYWxpemVkLnRydXN0ZWQsXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIGJ1aWxkUGF0aChub3JtYWxpemVkLnBhdGgsIEV4cHJlc3Npb25Db250ZXh0LkFwcGVuZFNpbmdsZUlkLCBzeW1ib2xzKSxcbiAgICAgICAgXSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5BcHBlbmRFeHByOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAgT3AuQXBwZW5kLFxuICAgICAgICAgICtub3JtYWxpemVkLnRydXN0ZWQsXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbihub3JtYWxpemVkLmV4cHIsIEV4cHJlc3Npb25Db250ZXh0LkV4cHJlc3Npb24sIHN5bWJvbHMpLFxuICAgICAgICBdLFxuICAgICAgXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkNhbGw6IHtcbiAgICAgIGxldCB7IHBhdGgsIHBhcmFtcywgaGFzaCwgdHJ1c3RlZCB9ID0gbm9ybWFsaXplZDtcbiAgICAgIGxldCBidWlsdFBhcmFtczogT3B0aW9uPFdpcmVGb3JtYXQuQ29yZS5QYXJhbXM+ID0gcGFyYW1zID8gYnVpbGRQYXJhbXMocGFyYW1zLCBzeW1ib2xzKSA6IFtdO1xuICAgICAgbGV0IGJ1aWx0SGFzaDogV2lyZUZvcm1hdC5Db3JlLkhhc2ggPSBoYXNoID8gYnVpbGRIYXNoKGhhc2gsIHN5bWJvbHMpIDogbnVsbDtcbiAgICAgIGxldCBidWlsdEV4cHI6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbiA9IGJ1aWxkUGF0aChwYXRoLCBFeHByZXNzaW9uQ29udGV4dC5DYWxsSGVhZCwgc3ltYm9scyk7XG5cbiAgICAgIHJldHVybiBbW09wLkFwcGVuZCwgK3RydXN0ZWQsIDAsIDAsIFtPcC5DYWxsLCAwLCAwLCBidWlsdEV4cHIsIGJ1aWx0UGFyYW1zLCBidWlsdEhhc2hdXV07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5MaXRlcmFsOiB7XG4gICAgICByZXR1cm4gW1tPcC5BcHBlbmQsIDEsIDAsIDAsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkNvbW1lbnQ6IHtcbiAgICAgIHJldHVybiBbW09wLkNvbW1lbnQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkJsb2NrOiB7XG4gICAgICBsZXQgYmxvY2tzID0gYnVpbGRCbG9ja3Mobm9ybWFsaXplZC5ibG9ja3MsIG5vcm1hbGl6ZWQuYmxvY2tQYXJhbXMsIHN5bWJvbHMpO1xuICAgICAgbGV0IGhhc2ggPSBidWlsZEhhc2gobm9ybWFsaXplZC5oYXNoLCBzeW1ib2xzKTtcbiAgICAgIGxldCBwYXJhbXMgPSBidWlsZFBhcmFtcyhub3JtYWxpemVkLnBhcmFtcywgc3ltYm9scyk7XG4gICAgICBsZXQgcGF0aCA9IGJ1aWxkUGF0aChub3JtYWxpemVkLnBhdGgsIEV4cHJlc3Npb25Db250ZXh0LkJsb2NrSGVhZCwgc3ltYm9scyk7XG5cbiAgICAgIHJldHVybiBbW09wLkJsb2NrLCBwYXRoLCBwYXJhbXMsIGhhc2gsIGJsb2Nrc11dO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuRWxlbWVudDpcbiAgICAgIHJldHVybiBidWlsZEVsZW1lbnQobm9ybWFsaXplZCwgc3ltYm9scyk7XG5cbiAgICBjYXNlIEhlYWRLaW5kLk1vZGlmaWVyOlxuICAgICAgdGhyb3cgdW5pbXBsKCdtb2RpZmllcicpO1xuXG4gICAgY2FzZSBIZWFkS2luZC5EeW5hbWljQ29tcG9uZW50OlxuICAgICAgdGhyb3cgdW5pbXBsKCdkeW5hbWljIGNvbXBvbmVudCcpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IGFzc2VydE5ldmVyKG5vcm1hbGl6ZWQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzKFxuICBhcnI6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi5pbnRlcnBvbGF0ZWQ6IHVua25vd25bXVxuKTogW0J1aWxkZXIuTGl0ZXJhbCwgc3RyaW5nXSB7XG4gIGxldCByZXN1bHQgPSBhcnIucmVkdWNlKFxuICAgIChyZXN1bHQsIHN0cmluZywgaSkgPT4gcmVzdWx0ICsgYCR7c3RyaW5nfSR7aW50ZXJwb2xhdGVkW2ldID8gaW50ZXJwb2xhdGVkW2ldIDogJyd9YCxcbiAgICAnJ1xuICApIGFzIHN0cmluZztcblxuICByZXR1cm4gW0J1aWxkZXIuTGl0ZXJhbCwgcmVzdWx0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGMoYXJyOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4uaW50ZXJwb2xhdGVkOiB1bmtub3duW10pOiBCdWlsZGVyQ29tbWVudCB7XG4gIGxldCByZXN1bHQgPSBhcnIucmVkdWNlKFxuICAgIChyZXN1bHQsIHN0cmluZywgaSkgPT4gcmVzdWx0ICsgYCR7c3RyaW5nfSR7aW50ZXJwb2xhdGVkW2ldID8gaW50ZXJwb2xhdGVkW2ldIDogJyd9YCxcbiAgICAnJ1xuICApIGFzIHN0cmluZztcblxuICByZXR1cm4gW0J1aWxkZXIuQ29tbWVudCwgcmVzdWx0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWNvZGUoY2hhckNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGNoYXJDb2RlLCAxNikpO1xufVxuXG5leHBvcnQgY29uc3QgTkVXTElORSA9ICdcXG4nO1xuXG5mdW5jdGlvbiBidWlsZEVsZW1lbnQoXG4gIHsgbmFtZSwgYXR0cnMsIGJsb2NrIH06IE5vcm1hbGl6ZWRFbGVtZW50LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgbGV0IG91dDogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSA9IFtbT3AuT3BlbkVsZW1lbnQsIG5hbWUsICFoYXNTcGxhdChhdHRycyldXTtcbiAgaWYgKGF0dHJzKSB7XG4gICAgbGV0IHsgYXR0cmlidXRlcywgYXJncyB9ID0gYnVpbGRBdHRycyhhdHRycywgc3ltYm9scyk7XG4gICAgb3V0LnB1c2goLi4uYXR0cmlidXRlcyk7XG4gICAgYXNzZXJ0KGFyZ3MgPT09IG51bGwsIGBDYW4ndCBwYXNzIGFyZ3MgdG8gYSBzaW1wbGUgZWxlbWVudGApO1xuICB9XG4gIG91dC5wdXNoKFtPcC5GbHVzaEVsZW1lbnRdKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShibG9jaykpIHtcbiAgICBibG9jay5mb3JFYWNoKHMgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQocywgc3ltYm9scykpKTtcbiAgfSBlbHNlIGlmIChibG9jayA9PT0gbnVsbCkge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBhc3NlcnROZXZlcihibG9jayk7XG4gIH1cblxuICBvdXQucHVzaChbT3AuQ2xvc2VFbGVtZW50XSk7XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gaGFzU3BsYXQoYXR0cnM6IE9wdGlvbjxOb3JtYWxpemVkQXR0cnM+KTogYm9vbGVhbiB7XG4gIGlmIChhdHRycyA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhhdHRycykuc29tZShhID0+IGF0dHJzW2FdID09PSBIZWFkS2luZC5TcGxhdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFuZ2xlSW52b2NhdGlvbihcbiAgeyBhdHRycywgYmxvY2ssIGhlYWQgfTogTm9ybWFsaXplZEFuZ2xlSW52b2NhdGlvbixcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkNvbXBvbmVudCB7XG4gIGxldCBhdHRyTGlzdDogV2lyZUZvcm1hdC5BdHRyaWJ1dGVbXSA9IFtdO1xuICBsZXQgYXJnczogV2lyZUZvcm1hdC5Db3JlLkhhc2ggPSBudWxsO1xuICBsZXQgYmxvY2tMaXN0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgaWYgKGF0dHJzKSB7XG4gICAgbGV0IGJ1aWx0ID0gYnVpbGRBdHRycyhhdHRycywgc3ltYm9scyk7XG4gICAgYXR0ckxpc3QgPSBidWlsdC5hdHRyaWJ1dGVzO1xuICAgIGFyZ3MgPSBidWlsdC5hcmdzO1xuICB9XG5cbiAgaWYgKGJsb2NrKSBibG9ja0xpc3QgPSBidWlsZE5vcm1hbGl6ZWRTdGF0ZW1lbnRzKGJsb2NrLCBzeW1ib2xzKTtcblxuICByZXR1cm4gW1xuICAgIE9wLkNvbXBvbmVudCxcbiAgICBidWlsZEV4cHJlc3Npb24oaGVhZCwgRXhwcmVzc2lvbkNvbnRleHQuQ2FsbEhlYWQsIHN5bWJvbHMpLFxuICAgIGF0dHJMaXN0LFxuICAgIGFyZ3MsXG4gICAgW1snZGVmYXVsdCddLCBbeyBwYXJhbWV0ZXJzOiBbXSwgc3RhdGVtZW50czogYmxvY2tMaXN0IH1dXSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXR0cnMoXG4gIGF0dHJzOiBOb3JtYWxpemVkQXR0cnMsXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IHsgYXR0cmlidXRlczogV2lyZUZvcm1hdC5BdHRyaWJ1dGVbXTsgYXJnczogV2lyZUZvcm1hdC5Db3JlLkhhc2ggfSB7XG4gIGxldCBhdHRyaWJ1dGVzOiBXaXJlRm9ybWF0LkF0dHJpYnV0ZVtdID0gW107XG4gIGxldCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgdmFsdWVzOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25bXSA9IFtdO1xuXG4gIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgbGV0IHZhbHVlID0gYXR0cnNba2V5XTtcblxuICAgIGlmICh2YWx1ZSA9PT0gSGVhZEtpbmQuU3BsYXQpIHtcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChbT3AuQXR0clNwbGF0LCBzeW1ib2xzLmJsb2NrKCcmYXR0cnMnKV0pO1xuICAgIH0gZWxzZSBpZiAoa2V5WzBdID09PSAnQCcpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgdmFsdWVzLnB1c2goYnVpbGRFeHByZXNzaW9uKHZhbHVlLCBFeHByZXNzaW9uQ29udGV4dC5FeHByZXNzaW9uLCBzeW1ib2xzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgLi4uYnVpbGRBdHRyaWJ1dGVWYWx1ZShcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgLy8gVE9ETzogZXh0cmFjdCBuYW1lc3BhY2UgZnJvbSBrZXlcbiAgICAgICAgICBleHRyYWN0TmFtZXNwYWNlKGtleSksXG4gICAgICAgICAgc3ltYm9sc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHsgYXR0cmlidXRlcywgYXJnczoga2V5cy5sZW5ndGggPT09IDAgPyBudWxsIDogW2tleXMsIHZhbHVlc10gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3ROYW1lc3BhY2UobmFtZTogc3RyaW5nKTogT3B0aW9uPEF0dHJOYW1lc3BhY2U+IHtcbiAgaWYgKG5hbWUgPT09ICd4bWxucycpIHtcbiAgICByZXR1cm4gTmFtZXNwYWNlLlhNTE5TO1xuICB9XG5cbiAgbGV0IG1hdGNoID0gbmFtZS5tYXRjaCgvXihbXjpdKik6KFteOl0qKSQvKTtcblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuYW1lc3BhY2UgPSBtYXRjaFsxXTtcblxuICBzd2l0Y2ggKG5hbWVzcGFjZSkge1xuICAgIGNhc2UgJ3hsaW5rJzpcbiAgICAgIHJldHVybiBOYW1lc3BhY2UuWExpbms7XG4gICAgY2FzZSAneG1sJzpcbiAgICAgIHJldHVybiBOYW1lc3BhY2UuWE1MO1xuICAgIGNhc2UgJ3htbG5zJzpcbiAgICAgIHJldHVybiBOYW1lc3BhY2UuWE1MTlM7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXR0cmlidXRlVmFsdWUoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IE5vcm1hbGl6ZWRFeHByZXNzaW9uLFxuICBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPixcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5BdHRyaWJ1dGVbXSB7XG4gIHN3aXRjaCAodmFsdWUudHlwZSkge1xuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuTGl0ZXJhbDoge1xuICAgICAgbGV0IHZhbCA9IHZhbHVlLnZhbHVlO1xuXG4gICAgICBpZiAodmFsID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9IGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gW1tPcC5TdGF0aWNBdHRyLCBuYW1lLCAnJywgbmFtZXNwYWNlXV07XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbW09wLlN0YXRpY0F0dHIsIG5hbWUsIHZhbCwgbmFtZXNwYWNlXV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQvdW5pbXBsZW1lbnRlZCBsaXRlcmFsIGF0dHJpYnV0ZSAke0pTT04uc3RyaW5naWZ5KHZhbCl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFtcbiAgICAgICAgICBPcC5EeW5hbWljQXR0cixcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbih2YWx1ZSwgRXhwcmVzc2lvbkNvbnRleHQuQXBwZW5kU2luZ2xlSWQsIHN5bWJvbHMpLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgXSxcbiAgICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwcmVzc2lvbihcbiAgZXhwcjogTm9ybWFsaXplZEV4cHJlc3Npb24sXG4gIGNvbnRleHQ6IEV4cHJlc3Npb25Db250ZXh0LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LkV4cHJlc3Npb24ge1xuICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuR2V0OiB7XG4gICAgICByZXR1cm4gYnVpbGRQYXRoKGV4cHIucGF0aCwgY29udGV4dCwgc3ltYm9scyk7XG4gICAgfVxuXG4gICAgY2FzZSBFeHByZXNzaW9uS2luZC5Db25jYXQ6IHtcbiAgICAgIHJldHVybiBbT3AuQ29uY2F0LCBidWlsZENvbmNhdChleHByLnBhcmFtcywgc3ltYm9scyldO1xuICAgIH1cblxuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuQ2FsbDoge1xuICAgICAgbGV0IGJ1aWx0UGFyYW1zID0gYnVpbGRQYXJhbXMoZXhwci5wYXJhbXMsIHN5bWJvbHMpO1xuICAgICAgbGV0IGJ1aWx0SGFzaCA9IGJ1aWxkSGFzaChleHByLmhhc2gsIHN5bWJvbHMpO1xuICAgICAgbGV0IGJ1aWx0RXhwciA9IGJ1aWxkUGF0aChleHByLnBhdGgsIEV4cHJlc3Npb25Db250ZXh0LkNhbGxIZWFkLCBzeW1ib2xzKTtcblxuICAgICAgcmV0dXJuIFtPcC5DYWxsLCAwLCAwLCBidWlsdEV4cHIsIGJ1aWx0UGFyYW1zLCBidWlsdEhhc2hdO1xuICAgIH1cblxuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuSGFzQmxvY2s6IHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIE9wLkhhc0Jsb2NrLFxuICAgICAgICBidWlsZFZhcihcbiAgICAgICAgICB7IGtpbmQ6IFZhcmlhYmxlS2luZC5CbG9jaywgbmFtZTogZXhwci5uYW1lIH0sXG4gICAgICAgICAgRXhwcmVzc2lvbkNvbnRleHQuRXhwcmVzc2lvbixcbiAgICAgICAgICBzeW1ib2xzXG4gICAgICAgICksXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuSGFzQmxvY2tQYXJhbXM6IHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIE9wLkhhc0Jsb2NrUGFyYW1zLFxuICAgICAgICBidWlsZFZhcihcbiAgICAgICAgICB7IGtpbmQ6IFZhcmlhYmxlS2luZC5CbG9jaywgbmFtZTogZXhwci5uYW1lIH0sXG4gICAgICAgICAgRXhwcmVzc2lvbkNvbnRleHQuRXhwcmVzc2lvbixcbiAgICAgICAgICBzeW1ib2xzXG4gICAgICAgICksXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuTGl0ZXJhbDoge1xuICAgICAgaWYgKGV4cHIudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW09wLlVuZGVmaW5lZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZXhwci52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBhdGgoXG4gIHBhdGg6IFBhdGgsXG4gIGNvbnRleHQ6IEV4cHJlc3Npb25Db250ZXh0LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBFeHByZXNzaW9ucy5HZXRQYXRoIHtcbiAgaWYgKHBhdGgudGFpbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW09wLkdldFBhdGgsIGJ1aWxkVmFyKHBhdGgudmFyaWFibGUsIGNvbnRleHQsIHN5bWJvbHMpLCBwYXRoLnRhaWxdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbT3AuR2V0UGF0aCwgYnVpbGRWYXIocGF0aC52YXJpYWJsZSwgRXhwcmVzc2lvbkNvbnRleHQuRXhwcmVzc2lvbiwgc3ltYm9scyksIHBhdGgudGFpbF07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVmFyKFxuICBoZWFkOiBWYXJpYWJsZSxcbiAgY29udGV4dDogRXhwcmVzc2lvbkNvbnRleHQsXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IEV4cHJlc3Npb25zLkdldFN5bWJvbCB8IEV4cHJlc3Npb25zLkdldEZyZWUgfCBFeHByZXNzaW9ucy5HZXRDb250ZXh0dWFsRnJlZSB7XG4gIHN3aXRjaCAoaGVhZC5raW5kKSB7XG4gICAgY2FzZSBWYXJpYWJsZUtpbmQuRnJlZTpcbiAgICAgIHJldHVybiBbT3AuR2V0Q29udGV4dHVhbEZyZWUsIHN5bWJvbHMuZnJlZVZhcihoZWFkLm5hbWUpLCBjb250ZXh0XTtcbiAgICBjYXNlIFZhcmlhYmxlS2luZC5Bcmc6XG4gICAgICByZXR1cm4gW09wLkdldFN5bWJvbCwgc3ltYm9scy5hcmcoaGVhZC5uYW1lKV07XG4gICAgY2FzZSBWYXJpYWJsZUtpbmQuQmxvY2s6XG4gICAgICByZXR1cm4gW09wLkdldFN5bWJvbCwgc3ltYm9scy5ibG9jayhoZWFkLm5hbWUpXTtcbiAgICBjYXNlIFZhcmlhYmxlS2luZC5Mb2NhbDpcbiAgICAgIHJldHVybiBbT3AuR2V0U3ltYm9sLCBzeW1ib2xzLmxvY2FsKGhlYWQubmFtZSldO1xuICAgIGNhc2UgVmFyaWFibGVLaW5kLlRoaXM6XG4gICAgICByZXR1cm4gW09wLkdldFN5bWJvbCwgc3ltYm9scy50aGlzKCldO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBhcmFtcyhcbiAgZXhwcnM6IE9wdGlvbjxOb3JtYWxpemVkUGFyYW1zPixcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogT3B0aW9uPFdpcmVGb3JtYXQuQ29yZS5QYXJhbXM+IHtcbiAgaWYgKGV4cHJzID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gZXhwcnMubWFwKGUgPT4gYnVpbGRFeHByZXNzaW9uKGUsIEV4cHJlc3Npb25Db250ZXh0LkV4cHJlc3Npb24sIHN5bWJvbHMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29uY2F0KFxuICBleHByczogW05vcm1hbGl6ZWRFeHByZXNzaW9uLCAuLi5Ob3JtYWxpemVkRXhwcmVzc2lvbltdXSxcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5Db3JlLkNvbmNhdFBhcmFtcyB7XG4gIHJldHVybiBleHBycy5tYXAoZSA9PlxuICAgIGJ1aWxkRXhwcmVzc2lvbihlLCBFeHByZXNzaW9uQ29udGV4dC5BcHBlbmRTaW5nbGVJZCwgc3ltYm9scylcbiAgKSBhcyBXaXJlRm9ybWF0LkNvcmUuQ29uY2F0UGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIYXNoKGV4cHJzOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+LCBzeW1ib2xzOiBTeW1ib2xzKTogV2lyZUZvcm1hdC5Db3JlLkhhc2gge1xuICBpZiAoZXhwcnMgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIGxldCBvdXQ6IFtzdHJpbmdbXSwgV2lyZUZvcm1hdC5FeHByZXNzaW9uW11dID0gW1tdLCBbXV07XG5cbiAgT2JqZWN0LmtleXMoZXhwcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICBvdXRbMF0ucHVzaChrZXkpO1xuICAgIG91dFsxXS5wdXNoKGJ1aWxkRXhwcmVzc2lvbihleHByc1trZXldLCBFeHByZXNzaW9uQ29udGV4dC5FeHByZXNzaW9uLCBzeW1ib2xzKSk7XG4gIH0pO1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEJsb2NrcyhcbiAgYmxvY2tzOiBOb3JtYWxpemVkQmxvY2tzLFxuICBibG9ja1BhcmFtczogT3B0aW9uPHN0cmluZ1tdPixcbiAgcGFyZW50OiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LkNvcmUuQmxvY2tzIHtcbiAgbGV0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGxldCB2YWx1ZXM6IFdpcmVGb3JtYXQuU2VyaWFsaXplZElubGluZUJsb2NrW10gPSBbXTtcblxuICBPYmplY3Qua2V5cyhibG9ja3MpLmZvckVhY2gobmFtZSA9PiB7XG4gICAga2V5cy5wdXNoKG5hbWUpO1xuXG4gICAgaWYgKG5hbWUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgbGV0IHN5bWJvbHMgPSBwYXJlbnQuY2hpbGQoYmxvY2tQYXJhbXMgfHwgW10pO1xuXG4gICAgICB2YWx1ZXMucHVzaCh7XG4gICAgICAgIHBhcmFtZXRlcnM6IHN5bWJvbHMucGFyYW1TeW1ib2xzLFxuICAgICAgICBzdGF0ZW1lbnRzOiBidWlsZE5vcm1hbGl6ZWRTdGF0ZW1lbnRzKGJsb2Nrc1tuYW1lXSwgc3ltYm9scyksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICA