@glimmer/compiler
Version:
784 lines (677 loc) • 67.1 kB
JavaScript
function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
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); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
import { assert, assertNever, dict, exhausted, isPresent, values } from '@glimmer/util';
import { normalizeStatement, VariableKind } from './builder-interface';
export var ProgramSymbols = /*#__PURE__*/function () {
function ProgramSymbols() {
this._freeVariables = [];
this._symbols = ['this'];
this.top = this;
}
var _proto = ProgramSymbols.prototype;
_proto.toSymbols = function toSymbols() {
return this._symbols.slice(1);
};
_proto.toUpvars = function toUpvars() {
return this._freeVariables;
};
_proto.freeVar = function freeVar(name) {
return addString(this._freeVariables, name);
};
_proto.block = function block(name) {
return this.symbol(name);
};
_proto.arg = function arg(name) {
return addString(this._symbols, name);
};
_proto.local = function local(name) {
throw new Error("No local " + name + " was found. Maybe you meant ^" + name + " for upvar, or !" + name + " for keyword?");
};
_proto["this"] = function _this() {
return 0;
};
_proto.hasLocal = function hasLocal(_name) {
return false;
} // any symbol
;
_proto.symbol = function symbol(name) {
return addString(this._symbols, name);
};
_proto.child = function child(locals) {
return new LocalSymbols(this, locals);
};
return ProgramSymbols;
}();
var LocalSymbols = /*#__PURE__*/function () {
function LocalSymbols(parent, locals) {
this.parent = parent;
this.locals = dict();
for (var _iterator = _createForOfIteratorHelperLoose(locals), _step; !(_step = _iterator()).done;) {
var local = _step.value;
this.locals[local] = parent.top.symbol(local);
}
}
var _proto2 = LocalSymbols.prototype;
_proto2.freeVar = function freeVar(name) {
return this.parent.freeVar(name);
};
_proto2.arg = function arg(name) {
return this.parent.arg(name);
};
_proto2.block = function block(name) {
return this.parent.block(name);
};
_proto2.local = function local(name) {
if (name in this.locals) {
return this.locals[name];
} else {
return this.parent.local(name);
}
};
_proto2["this"] = function _this() {
return this.parent["this"]();
};
_proto2.hasLocal = function hasLocal(name) {
if (name in this.locals) {
return true;
} else {
return this.parent.hasLocal(name);
}
};
_proto2.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, symbols) {
if (symbols === void 0) {
symbols = new ProgramSymbols();
}
switch (normalized.kind) {
case "AppendPath"
/* AppendPath */
:
{
return [[normalized.trusted ? 2
/* TrustingAppend */
: 1
/* Append */
, buildGetPath(normalized.path, symbols)]];
}
case "AppendExpr"
/* AppendExpr */
:
{
return [[normalized.trusted ? 2
/* TrustingAppend */
: 1
/* Append */
, buildExpression(normalized.expr, normalized.trusted ? 'TrustedAppend' : 'Append', symbols)]];
}
case "Call"
/* Call */
:
{
var path = normalized.head,
params = normalized.params,
hash = normalized.hash,
trusted = normalized.trusted;
var builtParams = params ? buildParams(params, symbols) : null;
var builtHash = hash ? buildHash(hash, symbols) : null;
var builtExpr = buildCallHead(path, trusted ? 3
/* AmbiguousInvoke */
: 2
/* AmbiguousAppendInvoke */
, symbols);
return [[trusted ? 2
/* TrustingAppend */
: 1
/* Append */
, [28
/* Call */
, builtExpr, builtParams, builtHash]]];
}
case "Literal"
/* Literal */
:
{
return [[1
/* Append */
, normalized.value]];
}
case "Comment"
/* Comment */
:
{
return [[3
/* 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 = buildCallHead(normalized.head, 7
/* ResolveAsComponentHead */
, symbols);
return [[6
/* Block */
, _path, _params, _hash, blocks]];
}
case "Keyword"
/* Keyword */
:
{
return [buildKeyword(normalized, symbols)];
}
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 = new 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] ? String(interpolated[i]) : ''));
}, '');
return [0
/* Literal */
, result];
}
export function c(arr) {
for (var _len2 = arguments.length, interpolated = new 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] ? String(interpolated[i]) : ''));
}, '');
return [1
/* Comment */
, result];
}
export function unicode(charCode) {
return String.fromCharCode(parseInt(charCode, 16));
}
export var NEWLINE = '\n';
function buildKeyword(normalized, symbols) {
var name = normalized.name;
var params = buildParams(normalized.params, symbols);
var childSymbols = symbols.child(normalized.blockParams || []);
var block = buildBlock(normalized.blocks["default"], childSymbols, childSymbols.paramSymbols);
var inverse = normalized.blocks["else"] ? buildBlock(normalized.blocks["else"], symbols, []) : null;
switch (name) {
case 'with':
return [43
/* With */
, params[0], block, inverse];
case 'if':
return [41
/* If */
, params[0], block, inverse];
case 'each':
var keyExpr = normalized.hash ? normalized.hash['key'] : null;
var key = keyExpr ? buildExpression(keyExpr, 'Strict', symbols) : null;
return [42
/* Each */
, params[0], key, block, inverse];
default:
throw new Error('unimplemented keyword');
}
}
function buildElement(_ref, symbols) {
var name = _ref.name,
attrs = _ref.attrs,
block = _ref.block;
var out = [hasSplat(attrs) ? [11
/* OpenElementWithSplat */
, name] : [10
/* OpenElement */
, name]];
if (attrs) {
var _buildElementParams = buildElementParams(attrs, symbols),
params = _buildElementParams.params,
args = _buildElementParams.args;
out.push.apply(out, params);
false && assert(args === null, "Can't pass args to a simple element");
}
out.push([12
/* 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([13
/* 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(_ref2, symbols) {
var attrs = _ref2.attrs,
block = _ref2.block,
head = _ref2.head;
var paramList = [];
var args = null;
var blockList = [];
if (attrs) {
var built = buildElementParams(attrs, symbols);
paramList = built.params;
args = built.args;
}
if (block) blockList = buildNormalizedStatements(block, symbols);
return [8
/* Component */
, buildExpression(head, 7
/* ResolveAsComponentHead */
, symbols), isPresent(paramList) ? paramList : null, args, [['default'], [[blockList, []]]]];
}
export function buildElementParams(attrs, symbols) {
var params = [];
var keys = [];
var values = [];
Object.keys(attrs).forEach(function (key) {
var value = attrs[key];
if (value === "Splat"
/* Splat */
) {
params.push([17
/* AttrSplat */
, symbols.block('&attrs')]);
} else if (key[0] === '@') {
keys.push(key);
values.push(buildExpression(value, 'Strict', symbols));
} else {
params.push.apply(params, buildAttributeValue(key, value, // TODO: extract namespace from key
extractNamespace(key), symbols));
}
});
return {
params: params,
args: isPresent(keys) && isPresent(values) ? [keys, values] : null
};
}
export function extractNamespace(name) {
if (name === 'xmlns') {
return "http://www.w3.org/2000/xmlns/"
/* XMLNS */
;
}
var match = /^([^:]*):([^:]*)$/.exec(name);
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 [[14
/* StaticAttr */
, name, '', namespace !== null && namespace !== void 0 ? namespace : undefined]];
} else if (typeof val === 'string') {
return [[14
/* StaticAttr */
, name, val, namespace !== null && namespace !== void 0 ? namespace : undefined]];
} else {
throw new Error("Unexpected/unimplemented literal attribute " + JSON.stringify(val));
}
}
default:
return [[15
/* DynamicAttr */
, name, buildExpression(value, 'AttrValue', symbols), namespace !== null && namespace !== void 0 ? namespace : undefined]];
}
}
function varContext(context, bare) {
switch (context) {
case 'Append':
return bare ? 'AppendBare' : 'AppendInvoke';
case 'TrustedAppend':
return bare ? 'TrustedAppendBare' : 'TrustedAppendInvoke';
case 'AttrValue':
return bare ? 'AttrValueBare' : 'AttrValueInvoke';
default:
return context;
}
}
export function buildExpression(expr, context, symbols) {
switch (expr.type) {
case "GetPath"
/* GetPath */
:
{
return buildGetPath(expr, symbols);
}
case "GetVar"
/* GetVar */
:
{
return buildVar(expr.variable, varContext(context, true), symbols);
}
case "Concat"
/* Concat */
:
{
return [29
/* Concat */
, buildConcat(expr.params, symbols)];
}
case "Call"
/* Call */
:
{
var builtParams = buildParams(expr.params, symbols);
var builtHash = buildHash(expr.hash, symbols);
var builtExpr = buildCallHead(expr.head, context === 'Strict' ? 'SubExpression' : varContext(context, false), symbols);
return [28
/* Call */
, builtExpr, builtParams, builtHash];
}
case "HasBlock"
/* HasBlock */
:
{
return [48
/* HasBlock */
, buildVar({
kind: VariableKind.Block,
name: expr.name,
mode: 'loose'
}, 0
/* Strict */
, symbols)];
}
case "HasBlockParams"
/* HasBlockParams */
:
{
return [49
/* HasBlockParams */
, buildVar({
kind: VariableKind.Block,
name: expr.name,
mode: 'loose'
}, 0
/* Strict */
, symbols)];
}
case "Literal"
/* Literal */
:
{
if (expr.value === undefined) {
return [27
/* Undefined */
];
} else {
return expr.value;
}
}
default:
assertNever(expr);
}
}
export function buildCallHead(callHead, context, symbols) {
if (callHead.type === "GetVar"
/* GetVar */
) {
return buildVar(callHead.variable, context, symbols);
} else {
return buildGetPath(callHead, symbols);
}
}
export function buildGetPath(head, symbols) {
return buildVar(head.path.head, 0
/* Strict */
, symbols, head.path.tail);
}
export function buildVar(head, context, symbols, path) {
var op = 30
/* GetSymbol */
;
var sym;
switch (head.kind) {
case VariableKind.Free:
if (context === 'Strict') {
op = 31
/* GetStrictFree */
;
} else if (context === 'AppendBare') {
op = 34
/* GetFreeAsComponentOrHelperHeadOrThisFallback */
;
} else if (context === 'AppendInvoke') {
op = 35
/* GetFreeAsComponentOrHelperHead */
;
} else if (context === 'TrustedAppendBare') {
op = 36
/* GetFreeAsHelperHeadOrThisFallback */
;
} else if (context === 'TrustedAppendInvoke') {
op = 37
/* GetFreeAsHelperHead */
;
} else if (context === 'AttrValueBare') {
op = 36
/* GetFreeAsHelperHeadOrThisFallback */
;
} else if (context === 'AttrValueInvoke') {
op = 37
/* GetFreeAsHelperHead */
;
} else if (context === 'SubExpression') {
op = 37
/* GetFreeAsHelperHead */
;
} else {
op = expressionContextOp(context);
}
sym = symbols.freeVar(head.name);
break;
default:
op = 30
/* GetSymbol */
;
sym = getSymbolForVar(head.kind, symbols, head.name);
}
if (path === undefined || path.length === 0) {
return [op, sym];
} else {
return [op, sym, path];
}
}
function getSymbolForVar(kind, symbols, name) {
switch (kind) {
case VariableKind.Arg:
return symbols.arg(name);
case VariableKind.Block:
return symbols.block(name);
case VariableKind.Local:
return symbols.local(name);
case VariableKind.This:
return symbols["this"]();
default:
return exhausted(kind);
}
}
export function expressionContextOp(context) {
switch (context) {
case 0
/* Strict */
:
return 31
/* GetStrictFree */
;
case 1
/* AmbiguousAppend */
:
return 34
/* GetFreeAsComponentOrHelperHeadOrThisFallback */
;
case 2
/* AmbiguousAppendInvoke */
:
return 35
/* GetFreeAsComponentOrHelperHead */
;
case 3
/* AmbiguousInvoke */
:
return 36
/* GetFreeAsHelperHeadOrThisFallback */
;
case 5
/* ResolveAsCallHead */
:
return 37
/* GetFreeAsHelperHead */
;
case 6
/* ResolveAsModifierHead */
:
return 38
/* GetFreeAsModifierHead */
;
case 7
/* ResolveAsComponentHead */
:
return 39
/* GetFreeAsComponentHead */
;
default:
return exhausted(context);
}
}
export function buildParams(exprs, symbols) {
if (exprs === null || !isPresent(exprs)) return null;
return exprs.map(function (e) {
return buildExpression(e, 'Strict', symbols);
});
}
export function buildConcat(exprs, symbols) {
return exprs.map(function (e) {
return buildExpression(e, 'AttrValue', 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], 'Strict', 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(buildBlock(blocks[name], symbols, symbols.paramSymbols));
} else {
values.push(buildBlock(blocks[name], parent, []));
}
});
return [keys, values];
}
function buildBlock(block, symbols, locals) {
if (locals === void 0) {
locals = [];
}
return [buildNormalizedStatements(block, symbols), locals];
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQVVBLFNBQUEsTUFBQSxFQUFBLFdBQUEsRUFBQSxJQUFBLEVBQUEsU0FBQSxFQUFBLFNBQUEsRUFBQSxNQUFBLFFBQUEsZUFBQTtBQUdBLFNBQUEsa0JBQUEsRUFBQSxZQUFBLFFBQUEscUJBQUE7QUFzQ0EsV0FBTSxjQUFOO0FBQUEsNEJBQUE7QUFDRSxTQUFBLGNBQUEsR0FBQSxFQUFBO0FBQ0EsU0FBQSxRQUFBLEdBQXFCLENBQXJCLE1BQXFCLENBQXJCO0FBRUEsU0FBQSxHQUFBLEdBQUEsSUFBQTtBQTRDRDs7QUFoREQ7O0FBQUEsU0FNRSxTQU5GLEdBTUUscUJBQVM7QUFDUCxXQUFPLEtBQUEsUUFBQSxDQUFBLEtBQUEsQ0FBUCxDQUFPLENBQVA7QUFDRCxHQVJIOztBQUFBLFNBVUUsUUFWRixHQVVFLG9CQUFRO0FBQ04sV0FBTyxLQUFQLGNBQUE7QUFDRCxHQVpIOztBQUFBLFNBY0UsT0FkRixHQWNFLGlCQUFPLElBQVAsRUFBb0I7QUFDbEIsV0FBTyxTQUFTLENBQUMsS0FBRCxjQUFBLEVBQWhCLElBQWdCLENBQWhCO0FBQ0QsR0FoQkg7O0FBQUEsU0FrQkUsS0FsQkYsR0FrQkUsZUFBSyxJQUFMLEVBQWtCO0FBQ2hCLFdBQU8sS0FBQSxNQUFBLENBQVAsSUFBTyxDQUFQO0FBQ0QsR0FwQkg7O0FBQUEsU0FzQkUsR0F0QkYsR0FzQkUsYUFBRyxJQUFILEVBQWdCO0FBQ2QsV0FBTyxTQUFTLENBQUMsS0FBRCxRQUFBLEVBQWhCLElBQWdCLENBQWhCO0FBQ0QsR0F4Qkg7O0FBQUEsU0EwQkUsS0ExQkYsR0EwQkUsZUFBSyxJQUFMLEVBQWtCO0FBQ2hCLFVBQU0sSUFBQSxLQUFBLGVBQ1EsSUFEUixxQ0FDNEMsSUFENUMsd0JBQU4sSUFBTSxtQkFBTjtBQUdELEdBOUJI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LEVBQUEsT0FBQSxDQUE2QixVQUFBLElBQUQsRUFBUztBQUNuQyxJQUFBLElBQUksQ0FBSixJQUFBLENBQUEsSUFBQTs7QUFFQSxRQUFJLElBQUksS0FBUixTQUFBLEVBQXdCO0FBQ3RCLFVBQUksT0FBTyxHQUFHLE1BQU0sQ0FBTixLQUFBLENBQWEsV0FBVyxJQUF0QyxFQUFjLENBQWQ7QUFFQSxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxPQUFBLEVBQXdCLE9BQU8sQ0FBckQsWUFBc0IsQ0FBdEI7QUFIRixLQUFBLE1BSU87QUFDTCxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxNQUFBLEVBQXRCLEVBQXNCLENBQXRCO0FBQ0Q7QUFUSCxHQUFBO0FBWUEsU0FBTyxDQUFBLElBQUEsRUFBUCxNQUFPLENBQVA7QUFDRDs7QUFFRCxTQUFBLFVBQUEsQ0FBQSxLQUFBLEVBQUEsT0FBQSxFQUdFLE1BSEYsRUFHdUI7QUFBQSxNQUFyQixNQUFxQjtBQUFyQixJQUFBLE1BQXFCLEdBSHZCLEVBR3VCO0FBQUE7O0FBRXJCLFNBQU8sQ0FBQyx5QkFBeUIsQ0FBQSxLQUFBLEVBQTFCLE9BQTBCLENBQTFCLEVBQVAsTUFBTyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaWN0LFxuICBFeHByZXNzaW9ucyxcbiAgR2V0Q29udGV4dHVhbEZyZWVPcCxcbiAgT3B0aW9uLFxuICBQcmVzZW50QXJyYXksXG4gIFNleHBPcGNvZGVzLFxuICBWYXJpYWJsZVJlc29sdXRpb25Db250ZXh0LFxuICBXaXJlRm9ybWF0LFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0TmV2ZXIsIGRpY3QsIGV4aGF1c3RlZCwgZXhwZWN0LCBpc1ByZXNlbnQsIHZhbHVlcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQXR0ck5hbWVzcGFjZSwgTmFtZXNwYWNlIH0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcblxuaW1wb3J0IHtcbiAgQnVpbGRlcixcbiAgQnVpbGRlckNvbW1lbnQsXG4gIEJ1aWxkZXJTdGF0ZW1lbnQsXG4gIEV4cHJlc3Npb25LaW5kLFxuICBIZWFkS2luZCxcbiAgTm9ybWFsaXplZEFuZ2xlSW52b2NhdGlvbixcbiAgTm9ybWFsaXplZEF0dHJzLFxuICBOb3JtYWxpemVkQmxvY2ssXG4gIE5vcm1hbGl6ZWRCbG9ja3MsXG4gIE5vcm1hbGl6ZWRFbGVtZW50LFxuICBOb3JtYWxpemVkRXhwcmVzc2lvbixcbiAgTm9ybWFsaXplZEhhc2gsXG4gIE5vcm1hbGl6ZWRIZWFkLFxuICBOb3JtYWxpemVkS2V5d29yZFN0YXRlbWVudCxcbiAgTm9ybWFsaXplZFBhcmFtcyxcbiAgTm9ybWFsaXplZFBhdGgsXG4gIE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIG5vcm1hbGl6ZVN0YXRlbWVudCxcbiAgVmFyaWFibGUsXG4gIFZhcmlhYmxlS2luZCxcbn0gZnJvbSAnLi9idWlsZGVyLWludGVyZmFjZSc7XG5cbmltcG9ydCBPcCA9IFdpcmVGb3JtYXQuU2V4cE9wY29kZXM7XG5cbmludGVyZmFjZSBTeW1ib2xzIHtcbiAgdG9wOiBQcm9ncmFtU3ltYm9scztcbiAgZnJlZVZhcihuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgbG9jYWwobmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICB0aGlzKCk6IG51bWJlcjtcblxuICBoYXNMb2NhbChuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIGNoaWxkKHBhcmFtczogc3RyaW5nW10pOiBMb2NhbFN5bWJvbHM7XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmFtU3ltYm9scyBpbXBsZW1lbnRzIFN5bWJvbHMge1xuICBfZnJlZVZhcmlhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgX3N5bWJvbHM6IHN0cmluZ1tdID0gWyd0aGlzJ107XG5cbiAgdG9wID0gdGhpcztcblxuICB0b1N5bWJvbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9zeW1ib2xzLnNsaWNlKDEpO1xuICB9XG5cbiAgdG9VcHZhcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9mcmVlVmFyaWFibGVzO1xuICB9XG5cbiAgZnJlZVZhcihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBhZGRTdHJpbmcodGhpcy5fZnJlZVZhcmlhYmxlcywgbmFtZSk7XG4gIH1cblxuICBibG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbChuYW1lKTtcbiAgfVxuXG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBhZGRTdHJpbmcodGhpcy5fc3ltYm9scywgbmFtZSk7XG4gIH1cblxuICBsb2NhbChuYW1lOiBzdHJpbmcpOiBuZXZlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIGxvY2FsICR7bmFtZX0gd2FzIGZvdW5kLiBNYXliZSB5b3UgbWVhbnQgXiR7bmFtZX0gZm9yIHVwdmFyLCBvciAhJHtuYW1lfSBmb3Iga2V5d29yZD9gXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGhhc0xvY2FsKF9uYW1lOiBzdHJpbmcpOiBmYWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gYW55IHN5bWJvbFxuICBzeW1ib2wobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYWRkU3RyaW5nKHRoaXMuX3N5bWJvbHMsIG5hbWUpO1xuICB9XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbFN5bWJvbHModGhpcywgbG9jYWxzKTtcbiAgfVxufVxuXG5jbGFzcyBMb2NhbFN5bWJvbHMgaW1wbGVtZW50cyBTeW1ib2xzIHtcbiAgcHJpdmF0ZSBsb2NhbHM6IERpY3Q8bnVtYmVyPiA9IGRpY3QoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmVudDogU3ltYm9scywgbG9jYWxzOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IGxvY2FsIG9mIGxvY2Fscykge1xuICAgICAgdGhpcy5sb2NhbHNbbG9jYWxdID0gcGFyZW50LnRvcC5zeW1ib2wobG9jYWwpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYXJhbVN5bWJvbHMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB2YWx1ZXModGhpcy5sb2NhbHMpO1xuICB9XG5cbiAgZ2V0IHRvcCgpOiBQcm9ncmFtU3ltYm9scyB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LnRvcDtcbiAgfVxuXG4gIGZyZWVWYXIobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZnJlZVZhcihuYW1lKTtcbiAgfVxuXG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5hcmcobmFtZSk7XG4gIH1cblxuICBibG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5ibG9jayhuYW1lKTtcbiAgfVxuXG4gIGxvY2FsKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5sb2NhbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY2Fsc1tuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmxvY2FsKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQudGhpcygpO1xuICB9XG5cbiAgaGFzTG9jYWwobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5sb2NhbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuaGFzTG9jYWwobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbFN5bWJvbHModGhpcywgbG9jYWxzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRTdHJpbmcoYXJyYXk6IHN0cmluZ1tdLCBpdGVtOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBpbmRleCA9IGFycmF5Lmxlbmd0aDtcbiAgICBhcnJheS5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBpbmRleDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVyR2V0RnJlZSB7XG4gIHR5cGU6ICdHZXRGcmVlJztcbiAgaGVhZDogc3RyaW5nO1xuICB0YWlsOiBzdHJpbmdbXTtcbn1cblxuZnVuY3Rpb24gdW5pbXBsKG1lc3NhZ2U6IHN0cmluZyk6IEVycm9yIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihgdW5pbXBsZW1lbnRlZCAke21lc3NhZ2V9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0YXRlbWVudHMoXG4gIHN0YXRlbWVudHM6IEJ1aWxkZXJTdGF0ZW1lbnRbXSxcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIGxldCBvdXQ6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10gPSBbXTtcblxuICBzdGF0ZW1lbnRzLmZvckVhY2goKHMpID0+IG91dC5wdXNoKC4uLmJ1aWxkU3RhdGVtZW50KG5vcm1hbGl6ZVN0YXRlbWVudChzKSwgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkU3RhdGVtZW50cyhcbiAgc3RhdGVtZW50czogTm9ybWFsaXplZFN0YXRlbWVudFtdLFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgbGV0IG91dDogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSA9IFtdO1xuXG4gIHN0YXRlbWVudHMuZm9yRWFjaCgocykgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQocywgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnQoXG4gIG5vcm1hbGl6ZWQ6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIHN5bWJvbHM6IFN5bWJvbHMgPSBuZXcgUHJvZ3JhbVN5bWJvbHMoKVxuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIHN3aXRjaCAobm9ybWFsaXplZC5raW5kKSB7XG4gICAgY2FzZSBIZWFkS2luZC5BcHBlbmRQYXRoOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAgbm9ybWFsaXplZC50cnVzdGVkID8gT3AuVHJ1c3RpbmdBcHBlbmQgOiBPcC5BcHBlbmQsXG4gICAgICAgICAgYnVpbGRHZXRQYXRoKG5vcm1hbGl6ZWQucGF0aCwgc3ltYm9scyksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuQXBwZW5kRXhwcjoge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgW1xuICAgICAgICAgIG5vcm1hbGl6ZWQudHJ1c3RlZCA/IE9wLlRydXN0aW5nQXBwZW5kIDogT3AuQXBwZW5kLFxuICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbihcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQuZXhwcixcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQudHJ1c3RlZCA/ICdUcnVzdGVkQXBwZW5kJyA6ICdBcHBlbmQnLFxuICAgICAgICAgICAgc3ltYm9sc1xuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuQ2FsbDoge1xuICAgICAgbGV0IHsgaGVhZDogcGF0aCwgcGFyYW1zLCBoYXNoLCB0cnVzdGVkIH0gPSBub3JtYWxpemVkO1xuICAgICAgbGV0IGJ1aWx0UGFyYW1zOiBPcHRpb248V2lyZUZvcm1hdC5Db3JlLlBhcmFtcz4gPSBwYXJhbXNcbiAgICAgICAgPyBidWlsZFBhcmFtcyhwYXJhbXMsIHN5bWJvbHMpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGxldCBidWlsdEhhc2g6IFdpcmVGb3JtYXQuQ29yZS5IYXNoID0gaGFzaCA/IGJ1aWxkSGFzaChoYXNoLCBzeW1ib2xzKSA6IG51bGw7XG4gICAgICBsZXQgYnVpbHRFeHByOiBXaXJlRm9ybWF0LkV4cHJlc3Npb24gPSBidWlsZENhbGxIZWFkKFxuICAgICAgICBwYXRoLFxuICAgICAgICB0cnVzdGVkXG4gICAgICAgICAgPyBWYXJpYWJsZVJlc29sdXRpb25Db250ZXh0LkFtYmlndW91c0ludm9rZVxuICAgICAgICAgIDogVmFyaWFibGVSZXNvbHV0aW9uQ29udGV4dC5BbWJpZ3VvdXNBcHBlbmRJbnZva2UsXG4gICAgICAgIHN5bWJvbHNcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIFt0cnVzdGVkID8gT3AuVHJ1c3RpbmdBcHBlbmQgOiBPcC5BcHBlbmQsIFtPcC5DYWxsLCBidWlsdEV4cHIsIGJ1aWx0UGFyYW1zLCBidWlsdEhhc2hdXSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5MaXRlcmFsOiB7XG4gICAgICByZXR1cm4gW1tPcC5BcHBlbmQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkNvbW1lbnQ6IHtcbiAgICAgIHJldHVybiBbW09wLkNvbW1lbnQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkJsb2NrOiB7XG4gICAgICBsZXQgYmxvY2tzID0gYnVpbGRCbG9ja3Mobm9ybWFsaXplZC5ibG9ja3MsIG5vcm1hbGl6ZWQuYmxvY2tQYXJhbXMsIHN5bWJvbHMpO1xuICAgICAgbGV0IGhhc2ggPSBidWlsZEhhc2gobm9ybWFsaXplZC5oYXNoLCBzeW1ib2xzKTtcbiAgICAgIGxldCBwYXJhbXMgPSBidWlsZFBhcmFtcyhub3JtYWxpemVkLnBhcmFtcywgc3ltYm9scyk7XG4gICAgICBsZXQgcGF0aCA9IGJ1aWxkQ2FsbEhlYWQoXG4gICAgICAgIG5vcm1hbGl6ZWQuaGVhZCxcbiAgICAgICAgVmFyaWFibGVSZXNvbHV0aW9uQ29udGV4dC5SZXNvbHZlQXNDb21wb25lbnRIZWFkLFxuICAgICAgICBzeW1ib2xzXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gW1tPcC5CbG9jaywgcGF0aCwgcGFyYW1zLCBoYXNoLCBibG9ja3NdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLktleXdvcmQ6IHtcbiAgICAgIHJldHVybiBbYnVpbGRLZXl3b3JkKG5vcm1hbGl6ZWQsIHN5bWJvbHMpXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkVsZW1lbnQ6XG4gICAgICByZXR1cm4gYnVpbGRFbGVtZW50KG5vcm1hbGl6ZWQsIHN5bWJvbHMpO1xuXG4gICAgY2FzZSBIZWFkS2luZC5Nb2RpZmllcjpcbiAgICAgIHRocm93IHVuaW1wbCgnbW9kaWZpZXInKTtcblxuICAgIGNhc2UgSGVhZEtpbmQuRHluYW1pY0NvbXBvbmVudDpcbiAgICAgIHRocm93IHVuaW1wbCgnZHluYW1pYyBjb21wb25lbnQnKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBhc3NlcnROZXZlcihub3JtYWxpemVkKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcyhcbiAgYXJyOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgLi4uaW50ZXJwb2xhdGVkOiB1bmtub3duW11cbik6IFtCdWlsZGVyLkxpdGVyYWwsIHN0cmluZ10ge1xuICBsZXQgcmVzdWx0ID0gYXJyLnJlZHVjZShcbiAgICAocmVzdWx0LCBzdHJpbmcsIGkpID0+IHJlc3VsdCArIGAke3N0cmluZ30ke2ludGVycG9sYXRlZFtpXSA/IFN0cmluZyhpbnRlcnBvbGF0ZWRbaV0pIDogJyd9YCxcbiAgICAnJ1xuICApO1xuXG4gIHJldHVybiBbQnVpbGRlci5MaXRlcmFsLCByZXN1bHRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYyhhcnI6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi5pbnRlcnBvbGF0ZWQ6IHVua25vd25bXSk6IEJ1aWxkZXJDb21tZW50IHtcbiAgbGV0IHJlc3VsdCA9IGFyci5yZWR1Y2UoXG4gICAgKHJlc3VsdCwgc3RyaW5nLCBpKSA9PiByZXN1bHQgKyBgJHt