@glimmer/compiler
Version:
881 lines (748 loc) • 69.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.buildStatements = buildStatements;
exports.buildNormalizedStatements = buildNormalizedStatements;
exports.buildStatement = buildStatement;
exports.s = s;
exports.c = c;
exports.unicode = unicode;
exports.buildAngleInvocation = buildAngleInvocation;
exports.buildElementParams = buildElementParams;
exports.extractNamespace = extractNamespace;
exports.buildAttributeValue = buildAttributeValue;
exports.buildExpression = buildExpression;
exports.buildCallHead = buildCallHead;
exports.buildGetPath = buildGetPath;
exports.buildVar = buildVar;
exports.expressionContextOp = expressionContextOp;
exports.buildParams = buildParams;
exports.buildConcat = buildConcat;
exports.buildHash = buildHash;
exports.buildBlocks = buildBlocks;
exports.NEWLINE = exports.ProgramSymbols = void 0;
var _util = require("@glimmer/util");
var _builderInterface = require("./builder-interface");
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;
}
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;
}();
exports.ProgramSymbols = ProgramSymbols;
var LocalSymbols = /*#__PURE__*/function () {
function LocalSymbols(parent, locals) {
this.parent = parent;
this.locals = (0, _util.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 (0, _util.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);
}
function buildStatements(statements, symbols) {
var out = [];
statements.forEach(function (s) {
return out.push.apply(out, buildStatement((0, _builderInterface.normalizeStatement)(s), symbols));
});
return out;
}
function buildNormalizedStatements(statements, symbols) {
var out = [];
statements.forEach(function (s) {
return out.push.apply(out, buildStatement(s, symbols));
});
return out;
}
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 (0, _util.assertNever)(normalized);
}
}
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];
}
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];
}
function unicode(charCode) {
return String.fromCharCode(parseInt(charCode, 16));
}
var NEWLINE = '\n';
exports.NEWLINE = NEWLINE;
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 && (0, _util.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 (0, _util.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 */
);
}
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), (0, _util.isPresent)(paramList) ? paramList : null, args, [['default'], [[blockList, []]]]];
}
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: (0, _util.isPresent)(keys) && (0, _util.isPresent)(values) ? [keys, values] : null
};
}
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;
}
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;
}
}
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: _builderInterface.VariableKind.Block,
name: expr.name,
mode: 'loose'
}, 0
/* Strict */
, symbols)];
}
case "HasBlockParams"
/* HasBlockParams */
:
{
return [49
/* HasBlockParams */
, buildVar({
kind: _builderInterface.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:
(0, _util.assertNever)(expr);
}
}
function buildCallHead(callHead, context, symbols) {
if (callHead.type === "GetVar"
/* GetVar */
) {
return buildVar(callHead.variable, context, symbols);
} else {
return buildGetPath(callHead, symbols);
}
}
function buildGetPath(head, symbols) {
return buildVar(head.path.head, 0
/* Strict */
, symbols, head.path.tail);
}
function buildVar(head, context, symbols, path) {
var op = 30
/* GetSymbol */
;
var sym;
switch (head.kind) {
case _builderInterface.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 _builderInterface.VariableKind.Arg:
return symbols.arg(name);
case _builderInterface.VariableKind.Block:
return symbols.block(name);
case _builderInterface.VariableKind.Local:
return symbols.local(name);
case _builderInterface.VariableKind.This:
return symbols["this"]();
default:
return (0, _util.exhausted)(kind);
}
}
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 (0, _util.exhausted)(context);
}
}
function buildParams(exprs, symbols) {
if (exprs === null || !(0, _util.isPresent)(exprs)) return null;
return exprs.map(function (e) {
return buildExpression(e, 'Strict', symbols);
});
}
function buildConcat(exprs, symbols) {
return exprs.map(function (e) {
return buildExpression(e, 'AttrValue', symbols);
});
}
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;
}
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQTs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQ0EsSUFBTSxjQUFOLEdBQUEsYUFBQSxZQUFBO0FBQUEsV0FBQSxjQUFBLEdBQUE7QUFDRSxTQUFBLGNBQUEsR0FBQSxFQUFBO0FBQ0EsU0FBQSxRQUFBLEdBQXFCLENBQXJCLE1BQXFCLENBQXJCO0FBRUEsU0FBQSxHQUFBLEdBQUEsSUFBQTtBQTRDRDs7QUFoREQsTUFBQSxNQUFBLEdBQUEsY0FBQSxDQUFBLFNBQUE7O0FBQUEsRUFBQSxNQUFBLENBQUEsU0FBQSxHQU1FLFNBQUEsU0FBQSxHQUFTO0FBQ1AsV0FBTyxLQUFBLFFBQUEsQ0FBQSxLQUFBLENBQVAsQ0FBTyxDQUFQO0FBUEosR0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxRQUFBLEdBVUUsU0FBQSxRQUFBLEdBQVE7QUFDTixXQUFPLEtBQVAsY0FBQTtBQVhKLEdBQUE7O0FBQUEsRUFBQSxNQUFBLENBQUEsT0FBQSxHQWNFLFNBQUEsT0FBQSxDQUFBLElBQUEsRUFBb0I7QUFDbEIsV0FBTyxTQUFTLENBQUMsS0FBRCxjQUFBLEVBQWhCLElBQWdCLENBQWhCO0FBZkosR0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxLQUFBLEdBa0JFLFNBQUEsS0FBQSxDQUFBLElBQUEsRUFBa0I7QUFDaEIsV0FBTyxLQUFBLE1BQUEsQ0FBUCxJQUFPLENBQVA7QUFuQkosR0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxHQUFBLEdBc0JFLFNBQUEsR0FBQSxDQUFBLElBQUEsRUFBZ0I7QUFDZCxXQUFPLFNBQVMsQ0FBQyxLQUFELFFBQUEsRUFBaEIsSUFBZ0IsQ0FBaEI7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LEdBQVYsRUFBQTtBQUVBLEVBQUEsTUFBTSxDQUFOLElBQUEsQ0FBQSxNQUFBLEVBQUEsT0FBQSxDQUE2QixVQUFELElBQUMsRUFBUTtBQUNuQyxJQUFBLElBQUksQ0FBSixJQUFBLENBQUEsSUFBQTs7QUFFQSxRQUFJLElBQUksS0FBUixTQUFBLEVBQXdCO0FBQ3RCLFVBQUksT0FBTyxHQUFHLE1BQU0sQ0FBTixLQUFBLENBQWEsV0FBVyxJQUF0QyxFQUFjLENBQWQ7QUFFQSxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxPQUFBLEVBQXdCLE9BQU8sQ0FBckQsWUFBc0IsQ0FBdEI7QUFIRixLQUFBLE1BSU87QUFDTCxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxNQUFBLEVBQXRCLEVBQXNCLENBQXRCO0FBQ0Q7QUFUSCxHQUFBO0FBWUEsU0FBTyxDQUFBLElBQUEsRUFBUCxNQUFPLENBQVA7QUFDRDs7QUFFRCxTQUFBLFVBQUEsQ0FBQSxLQUFBLEVBQUEsT0FBQSxFQUFBLE1BQUEsRUFHdUI7QUFBQSxNQUFyQixNQUFxQixLQUFBLEtBQUEsQ0FBQSxFQUFBO0FBQXJCLElBQUEsTUFBcUIsR0FIdkIsRUFHRTtBQUFxQjs7QUFFckIsU0FBTyxDQUFDLHlCQUF5QixDQUFBLEtBQUEsRUFBMUIsT0FBMEIsQ0FBMUIsRUFBUCxNQUFPLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpY3QsXG4gIEV4cHJlc3Npb25zLFxuICBHZXRDb250ZXh0dWFsRnJlZU9wLFxuICBPcHRpb24sXG4gIFByZXNlbnRBcnJheSxcbiAgU2V4cE9wY29kZXMsXG4gIFZhcmlhYmxlUmVzb2x1dGlvbkNvbnRleHQsXG4gIFdpcmVGb3JtYXQsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnROZXZlciwgZGljdCwgZXhoYXVzdGVkLCBleHBlY3QsIGlzUHJlc2VudCwgdmFsdWVzIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBBdHRyTmFtZXNwYWNlLCBOYW1lc3BhY2UgfSBmcm9tICdAc2ltcGxlLWRvbS9pbnRlcmZhY2UnO1xuXG5pbXBvcnQge1xuICBCdWlsZGVyLFxuICBCdWlsZGVyQ29tbWVudCxcbiAgQnVpbGRlclN0YXRlbWVudCxcbiAgRXhwcmVzc2lvbktpbmQsXG4gIEhlYWRLaW5kLFxuICBOb3JtYWxpemVkQW5nbGVJbnZvY2F0aW9uLFxuICBOb3JtYWxpemVkQXR0cnMsXG4gIE5vcm1hbGl6ZWRCbG9jayxcbiAgTm9ybWFsaXplZEJsb2NrcyxcbiAgTm9ybWFsaXplZEVsZW1lbnQsXG4gIE5vcm1hbGl6ZWRFeHByZXNzaW9uLFxuICBOb3JtYWxpemVkSGFzaCxcbiAgTm9ybWFsaXplZEhlYWQsXG4gIE5vcm1hbGl6ZWRLZXl3b3JkU3RhdGVtZW50LFxuICBOb3JtYWxpemVkUGFyYW1zLFxuICBOb3JtYWxpemVkUGF0aCxcbiAgTm9ybWFsaXplZFN0YXRlbWVudCxcbiAgbm9ybWFsaXplU3RhdGVtZW50LFxuICBWYXJpYWJsZSxcbiAgVmFyaWFibGVLaW5kLFxufSBmcm9tICcuL2J1aWxkZXItaW50ZXJmYWNlJztcblxuaW1wb3J0IE9wID0gV2lyZUZvcm1hdC5TZXhwT3Bjb2RlcztcblxuaW50ZXJmYWNlIFN5bWJvbHMge1xuICB0b3A6IFByb2dyYW1TeW1ib2xzO1xuICBmcmVlVmFyKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYXJnKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYmxvY2sobmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICBsb2NhbChuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHRoaXMoKTogbnVtYmVyO1xuXG4gIGhhc0xvY2FsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgY2hpbGQocGFyYW1zOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scztcbn1cblxuZXhwb3J0IGNsYXNzIFByb2dyYW1TeW1ib2xzIGltcGxlbWVudHMgU3ltYm9scyB7XG4gIF9mcmVlVmFyaWFibGVzOiBzdHJpbmdbXSA9IFtdO1xuICBfc3ltYm9sczogc3RyaW5nW10gPSBbJ3RoaXMnXTtcblxuICB0b3AgPSB0aGlzO1xuXG4gIHRvU3ltYm9scygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N5bWJvbHMuc2xpY2UoMSk7XG4gIH1cblxuICB0b1VwdmFycygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZWVWYXJpYWJsZXM7XG4gIH1cblxuICBmcmVlVmFyKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFkZFN0cmluZyh0aGlzLl9mcmVlVmFyaWFibGVzLCBuYW1lKTtcbiAgfVxuXG4gIGJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sKG5hbWUpO1xuICB9XG5cbiAgYXJnKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFkZFN0cmluZyh0aGlzLl9zeW1ib2xzLCBuYW1lKTtcbiAgfVxuXG4gIGxvY2FsKG5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gbG9jYWwgJHtuYW1lfSB3YXMgZm91bmQuIE1heWJlIHlvdSBtZWFudCBeJHtuYW1lfSBmb3IgdXB2YXIsIG9yICEke25hbWV9IGZvciBrZXl3b3JkP2BcbiAgICApO1xuICB9XG5cbiAgdGhpcygpOiBudW1iZXIge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaGFzTG9jYWwoX25hbWU6IHN0cmluZyk6IGZhbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBhbnkgc3ltYm9sXG4gIHN5bWJvbChuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBhZGRTdHJpbmcodGhpcy5fc3ltYm9scywgbmFtZSk7XG4gIH1cblxuICBjaGlsZChsb2NhbHM6IHN0cmluZ1tdKTogTG9jYWxTeW1ib2xzIHtcbiAgICByZXR1cm4gbmV3IExvY2FsU3ltYm9scyh0aGlzLCBsb2NhbHMpO1xuICB9XG59XG5cbmNsYXNzIExvY2FsU3ltYm9scyBpbXBsZW1lbnRzIFN5bWJvbHMge1xuICBwcml2YXRlIGxvY2FsczogRGljdDxudW1iZXI+ID0gZGljdCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFyZW50OiBTeW1ib2xzLCBsb2NhbHM6IHN0cmluZ1tdKSB7XG4gICAgZm9yIChsZXQgbG9jYWwgb2YgbG9jYWxzKSB7XG4gICAgICB0aGlzLmxvY2Fsc1tsb2NhbF0gPSBwYXJlbnQudG9wLnN5bWJvbChsb2NhbCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhcmFtU3ltYm9scygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHZhbHVlcyh0aGlzLmxvY2Fscyk7XG4gIH1cblxuICBnZXQgdG9wKCk6IFByb2dyYW1TeW1ib2xzIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQudG9wO1xuICB9XG5cbiAgZnJlZVZhcihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5mcmVlVmFyKG5hbWUpO1xuICB9XG5cbiAgYXJnKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmFyZyhuYW1lKTtcbiAgfVxuXG4gIGJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmJsb2NrKG5hbWUpO1xuICB9XG5cbiAgbG9jYWwobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmxvY2Fscykge1xuICAgICAgcmV0dXJuIHRoaXMubG9jYWxzW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQubG9jYWwobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdGhpcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC50aGlzKCk7XG4gIH1cblxuICBoYXNMb2NhbChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAobmFtZSBpbiB0aGlzLmxvY2Fscykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5oYXNMb2NhbChuYW1lKTtcbiAgICB9XG4gIH1cblxuICBjaGlsZChsb2NhbHM6IHN0cmluZ1tdKTogTG9jYWxTeW1ib2xzIHtcbiAgICByZXR1cm4gbmV3IExvY2FsU3ltYm9scyh0aGlzLCBsb2NhbHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFN0cmluZyhhcnJheTogc3RyaW5nW10sIGl0ZW06IHN0cmluZyk6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XG5cbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIGluZGV4ID0gYXJyYXkubGVuZ3RoO1xuICAgIGFycmF5LnB1c2goaXRlbSk7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJHZXRGcmVlIHtcbiAgdHlwZTogJ0dldEZyZWUnO1xuICBoZWFkOiBzdHJpbmc7XG4gIHRhaWw6IHN0cmluZ1tdO1xufVxuXG5mdW5jdGlvbiB1bmltcGwobWVzc2FnZTogc3RyaW5nKTogRXJyb3Ige1xuICByZXR1cm4gbmV3IEVycm9yKGB1bmltcGxlbWVudGVkICR7bWVzc2FnZX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RhdGVtZW50cyhcbiAgc3RhdGVtZW50czogQnVpbGRlclN0YXRlbWVudFtdLFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgbGV0IG91dDogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSA9IFtdO1xuXG4gIHN0YXRlbWVudHMuZm9yRWFjaCgocykgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQobm9ybWFsaXplU3RhdGVtZW50KHMpLCBzeW1ib2xzKSkpO1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRTdGF0ZW1lbnRzKFxuICBzdGF0ZW1lbnRzOiBOb3JtYWxpemVkU3RhdGVtZW50W10sXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10ge1xuICBsZXQgb3V0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgc3RhdGVtZW50cy5mb3JFYWNoKChzKSA9PiBvdXQucHVzaCguLi5idWlsZFN0YXRlbWVudChzLCBzeW1ib2xzKSkpO1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0YXRlbWVudChcbiAgbm9ybWFsaXplZDogTm9ybWFsaXplZFN0YXRlbWVudCxcbiAgc3ltYm9sczogU3ltYm9scyA9IG5ldyBQcm9ncmFtU3ltYm9scygpXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgc3dpdGNoIChub3JtYWxpemVkLmtpbmQpIHtcbiAgICBjYXNlIEhlYWRLaW5kLkFwcGVuZFBhdGg6IHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFtcbiAgICAgICAgICBub3JtYWxpemVkLnRydXN0ZWQgPyBPcC5UcnVzdGluZ0FwcGVuZCA6IE9wLkFwcGVuZCxcbiAgICAgICAgICBidWlsZEdldFBhdGgobm9ybWFsaXplZC5wYXRoLCBzeW1ib2xzKSxcbiAgICAgICAgXSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5BcHBlbmRFeHByOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAgbm9ybWFsaXplZC50cnVzdGVkID8gT3AuVHJ1c3RpbmdBcHBlbmQgOiBPcC5BcHBlbmQsXG4gICAgICAgICAgYnVpbGRFeHByZXNzaW9uKFxuICAgICAgICAgICAgbm9ybWFsaXplZC5leHByLFxuICAgICAgICAgICAgbm9ybWFsaXplZC50cnVzdGVkID8gJ1RydXN0ZWRBcHBlbmQnIDogJ0FwcGVuZCcsXG4gICAgICAgICAgICBzeW1ib2xzXG4gICAgICAgICAgKSxcbiAgICAgICAgXSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5DYWxsOiB7XG4gICAgICBsZXQgeyBoZWFkOiBwYXRoLCBwYXJhbXMsIGhhc2gsIHRydXN0ZWQgfSA9IG5vcm1hbGl6ZWQ7XG4gICAgICBsZXQgYnVpbHRQYXJhbXM6IE9wdGlvbjxXaXJlRm9ybWF0LkNvcmUuUGFyYW1zPiA9IHBhcmFtc1xuICAgICAgICA/IGJ1aWxkUGFyYW1zKHBhcmFtcywgc3ltYm9scylcbiAgICAgICAgOiBudWxsO1xuICAgICAgbGV0IGJ1aWx0SGFzaDogV2lyZUZvcm1hdC5Db3JlLkhhc2ggPSBoY