ololog
Version:
Platform-agnostic logging with colors in terminals & browsers / shows call locations / pretty prints objects and stacktraces / smart newline and indentation handling
287 lines (224 loc) • 26.3 kB
JavaScript
;
/* ------------------------------------------------------------------------ */
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
function _defineEnumerableProperties(obj, descs) { for (var key in descs) { var desc = descs[key]; desc.configurable = desc.enumerable = true; if ("value" in desc) desc.writable = true; Object.defineProperty(obj, key, desc); } return obj; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }
var O = Object,
StackTracey = require('stacktracey'),
ansi = require('ansicolor'),
bullet = require('string.bullet'),
pipez = require('pipez');
/* ------------------------------------------------------------------------ */
var _stringify = require('string.ify').configure({
formatter: function formatter(x) {
if (x instanceof Error && !(typeof Symbol !== 'undefined' && x[Symbol.for('String.ify')])) {
var why = _stringify.limit((x.message || '').replace(/\r|\n/g, '').trim(), 120),
stack = new StackTracey(x).pretty,
stackIndented = stack.split('\n').map(function (x) {
return ' ' + x;
}).join('\n');
return '[EXCEPTION] ' + why + '\n\n' + stackIndented + '\n';
}
}
});
/* ------------------------------------------------------------------------ */
var _require = require('printable-characters'),
isBlank = _require.isBlank,
blank = _require.blank,
changeLastNonemptyLine = function changeLastNonemptyLine(lines, fn) {
for (var i = lines.length - 1; i >= 0; i--) {
if (i === 0 || !isBlank(lines[i])) {
lines[i] = fn(lines[i]);
break;
}
}
return lines;
};
/* ------------------------------------------------------------------------ */
var log = pipez({
/* ------------------------------------------------------------------------ */
stringify: function stringify(args, cfg) {
var print = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _stringify.configure(cfg);
return args.map(function (arg) {
return typeof arg === 'string' ? arg : print(arg);
});
},
trim: function trim(tokens, _ref) {
var _ref$max = _ref.max,
max = _ref$max === undefined ? undefined : _ref$max;
return !max ? tokens : tokens.map(function (t) {
return _stringify.limit(t, max);
});
},
lines: function lines(tokens, _ref2) {
var _ref2$linebreak = _ref2.linebreak,
linebreak = _ref2$linebreak === undefined ? '\n' : _ref2$linebreak;
var lines = [[]];
var leftPad = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = tokens[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var t = _step.value;
var _t$split = t.split(linebreak),
_t$split2 = _toArray(_t$split),
first = _t$split2[0],
rest = _t$split2.slice(1);
lines[lines.length - 1].push(first);
lines = [].concat(_toConsumableArray(lines), _toConsumableArray(rest.map(function (t) {
return t ? [].concat(leftPad, [t]) : [];
})));
var pad = blank(!rest.length ? t : rest[rest.length - 1]);
if (pad) {
leftPad.push(pad);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return lines;
},
concat: function concat(lines, _ref3) {
var _ref3$separator = _ref3.separator,
separator = _ref3$separator === undefined ? ' ' : _ref3$separator;
return lines.map(function (tokens) {
return tokens.join(separator);
});
},
indent: function indent(lines, _ref4) {
var _ref4$level = _ref4.level,
level = _ref4$level === undefined ? 0 : _ref4$level,
_ref4$pattern = _ref4.pattern,
pattern = _ref4$pattern === undefined ? '\t' : _ref4$pattern;
return lines.map(function (line) {
return pattern.repeat(level) + line;
});
},
time: function time(lines, _ref5) {
var _ref5$when = _ref5.when,
when = _ref5$when === undefined ? new Date() : _ref5$when,
_ref5$print = _ref5.print,
print = _ref5$print === undefined ? function (when) {
return ansi.dim(when.toISOString()) + '\t';
} : _ref5$print;
return bullet(print(when), lines);
},
locate: function locate(lines, _ref6) {
var _ref6$shift = _ref6.shift,
shift = _ref6$shift === undefined ? 0 : _ref6$shift,
_ref6$where = _ref6.where,
where = _ref6$where === undefined ? new StackTracey().clean.at(2 + shift) : _ref6$where,
_ref6$join = _ref6.join,
join = _ref6$join === undefined ? function (a, sep, b) {
return a && b ? a + sep + b : a || b;
} : _ref6$join,
_ref6$print = _ref6.print,
print = _ref6$print === undefined ? function (_ref7) {
var calleeShort = _ref7.calleeShort,
_ref7$fileName = _ref7.fileName,
fileName = _ref7$fileName === undefined ? [] : _ref7$fileName,
_ref7$line = _ref7.line,
line = _ref7$line === undefined ? [] : _ref7$line;
return ansi.dim('(' + join(calleeShort, ' @ ', join(fileName, ':', line)) + ')');
} : _ref6$print;
return changeLastNonemptyLine(lines, function (line) {
return join(line, ' ', print(where));
});
},
join: function join(lines, _ref8) {
var _ref8$linebreak = _ref8.linebreak,
linebreak = _ref8$linebreak === undefined ? '\n' : _ref8$linebreak;
return lines.join(linebreak);
},
render: function render(text, _ref9) {
var _ref9$engine = _ref9.engine,
engine = _ref9$engine === undefined ? typeof window !== 'undefined' && window.window === window && window.navigator ? navigator.userAgent.indexOf('Chrome') >= 0 ? 'chrome' : 'generic' : 'ansi' : _ref9$engine,
_ref9$engines = _ref9.engines,
engines = _ref9$engines === undefined ? {/* configurable */} : _ref9$engines,
_ref9$consoleMethod = _ref9.consoleMethod,
consoleMethod = _ref9$consoleMethod === undefined ? 'log' : _ref9$consoleMethod,
_ref9$defaults = _ref9.defaults,
defaults = _ref9$defaults === undefined ? {
ansi: function ansi(s) {
return console[consoleMethod](s);
},
chrome: function chrome(s) {
var _console;
return (_console = console)[consoleMethod].apply(_console, _toConsumableArray(ansi.parse(s).asChromeConsoleLogArguments));
},
generic: function generic(s) {
return console[consoleMethod](ansi.strip(s));
}
} : _ref9$defaults;
return text && O.assign(defaults, engines)[engine](text), text;
},
returnValue: function returnValue(__, _ref10) {
var _ref10$initialArgumen = _slicedToArray(_ref10.initialArguments, 1),
firstArgument = _ref10$initialArgumen[0];
return firstArgument;
}
/* ------------------------------------------------------------------------ */
}).configure({
time: false // disables 'time' step (until enabled back explicitly)
/* ------------------------------------------------------------------------ */
}).methods({
indent: function indent(level) {
return this.configure({ indent: { level: level } });
},
get error() {
return this.configure({ render: { consoleMethod: 'error' } });
},
get warn() {
return this.configure({ render: { consoleMethod: 'warn' } });
},
get info() {
return this.configure({ render: { consoleMethod: 'info' } });
},
maxArrayLength: function maxArrayLength(n) {
return this.configure({ stringify: { maxArrayLength: n } });
},
maxDepth: function maxDepth(n) {
return this.configure({ stringify: { maxDepth: n } });
},
get unlimited() {
return this.configure({ stringify: { maxArrayLength: Number.MAX_VALUE, maxDepth: Number.MAX_VALUE } });
},
get noPretty() {
return this.configure({ stringify: { pretty: false } });
},
get serialize() {
return this.before('render');
},
get deserialize() {
return this.from('render');
},
newline: function newline() {
return this.from('join')(['']);
}
});
/* ------------------------------------------------------------------------ */
ansi.names.forEach(function (color) {
var _log$methods, _mutatorMap;
log.methods((_log$methods = {}, _mutatorMap = {}, _mutatorMap[color] = _mutatorMap[color] || {}, _mutatorMap[color].get = function () {
return this.configure({ 'concat+': function concat(lines) {
return lines.map(ansi[color]);
} });
}, _defineEnumerableProperties(_log$methods, _mutatorMap), _log$methods));
});
/* ------------------------------------------------------------------------ */
module.exports = log;
/* ------------------------------------------------------------------------ */
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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S0FBSyxNQUFMLENBQWEsUUFBYixDQUFQO0FBQStCLEtBZDFDO0FBZVIsUUFBSSxXQUFKLEdBQW1CO0FBQUUsZUFBTyxLQUFLLElBQUwsQ0FBVyxRQUFYLENBQVA7QUFBNkIsS0FmMUM7O0FBaUJSLFdBakJRLHFCQWlCRztBQUFFLGVBQU8sS0FBSyxJQUFMLENBQVcsTUFBWCxFQUFtQixDQUFDLEVBQUQsQ0FBbkIsQ0FBUDtBQUFpQztBQWpCdEMsQ0FqRkEsQ0FBWjs7QUFxR0E7O0FBRUEsS0FBSyxLQUFMLENBQVcsT0FBWCxDQUFvQixpQkFBUztBQUFBOztBQUV6QixRQUFJLE9BQUosbURBRVMsS0FGVCxnQkFFUyxLQUZULHFCQUVTLEtBRlQsb0JBRW1CO0FBQUUsZUFBTyxLQUFLLFNBQUwsQ0FBZ0IsRUFBRSxXQUFXO0FBQUEsdUJBQVMsTUFBTSxHQUFOLENBQVcsS0FBSyxLQUFMLENBQVgsQ0FBVDtBQUFBLGFBQWIsRUFBaEIsQ0FBUDtBQUF5RSxLQUY5RjtBQUlILENBTkQ7O0FBUUE7O0FBRUEsT0FBTyxPQUFQLEdBQWlCLEdBQWpCOztBQUVBIiwiZmlsZSI6Im9sb2xvZy5lczUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5jb25zdCBPICAgICAgICAgICAgICAgICA9IE9iamVjdFxuICAgICwgU3RhY2tUcmFjZXkgICAgICAgPSByZXF1aXJlICgnc3RhY2t0cmFjZXknKVxuICAgICwgYW5zaSAgICAgICAgICAgICAgPSByZXF1aXJlICgnYW5zaWNvbG9yJylcbiAgICAsIGJ1bGxldCAgICAgICAgICAgID0gcmVxdWlyZSAoJ3N0cmluZy5idWxsZXQnKVxuICAgICwgcGlwZXogICAgICAgICAgICAgPSByZXF1aXJlICgncGlwZXonKVxuXG4vKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmNvbnN0IHN0cmluZ2lmeSA9IHJlcXVpcmUgKCdzdHJpbmcuaWZ5JykuY29uZmlndXJlICh7XG5cbiAgICBmb3JtYXR0ZXIgKHgpIHtcblxuICAgICAgICBpZiAoKHggaW5zdGFuY2VvZiBFcnJvcikgJiYgISh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiB4W1N5bWJvbC5mb3IgKCdTdHJpbmcuaWZ5JyldKSkge1xuXG4gICAgICAgICAgICBjb25zdCB3aHkgICAgICAgICAgID0gc3RyaW5naWZ5LmxpbWl0ICgoeC5tZXNzYWdlIHx8ICcnKS5yZXBsYWNlICgvXFxyfFxcbi9nLCAnJykudHJpbSAoKSwgMTIwKSxcbiAgICAgICAgICAgICAgICAgIHN0YWNrICAgICAgICAgPSBuZXcgU3RhY2tUcmFjZXkgKHgpLnByZXR0eSxcbiAgICAgICAgICAgICAgICAgIHN0YWNrSW5kZW50ZWQgPSBzdGFjay5zcGxpdCAoJ1xcbicpLm1hcCAoeCA9PiAnICAgICcgKyB4KS5qb2luICgnXFxuJylcblxuICAgICAgICAgICAgcmV0dXJuIGBbRVhDRVBUSU9OXSAke3doeX1cXG5cXG4ke3N0YWNrSW5kZW50ZWR9XFxuYFxuICAgICAgICB9XG4gICAgfVxufSlcblxuLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5jb25zdCB7IGlzQmxhbmssIGJsYW5rIH0gPSByZXF1aXJlICgncHJpbnRhYmxlLWNoYXJhY3RlcnMnKVxuXG4gICAgLCBjaGFuZ2VMYXN0Tm9uZW1wdHlMaW5lID0gKGxpbmVzLCBmbikgPT4ge1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXG4gICAgICAgICAgICBpZiAoKGkgPT09IDApIHx8ICFpc0JsYW5rIChsaW5lc1tpXSkpIHtcblxuICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gZm4gKGxpbmVzW2ldKVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGluZXNcbiAgICB9XG5cbi8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuY29uc3QgbG9nID0gcGlwZXogKHtcblxuLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4gICAgc3RyaW5naWZ5OiAoYXJncywgY2ZnLCBwcmludCA9IHN0cmluZ2lmeS5jb25maWd1cmUgKGNmZykpID0+IGFyZ3MubWFwIChhcmcgPT4gKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSA/IGFyZyA6IHByaW50IChhcmcpKSxcbiAgICBcbiAgICB0cmltOiAodG9rZW5zLCB7IG1heCA9IHVuZGVmaW5lZCB9KSA9PiAhbWF4ID8gdG9rZW5zIDogdG9rZW5zLm1hcCAodCA9PiBzdHJpbmdpZnkubGltaXQgKHQsIG1heCkpLFxuXG4gICAgbGluZXM6ICh0b2tlbnMsIHsgbGluZWJyZWFrID0gJ1xcbicgfSkgPT4ge1xuXG4gICAgICAgIGxldCBsaW5lcyA9IFtbXV1cblxuICAgICAgICBsZXQgbGVmdFBhZCA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRva2Vucykge1xuXG4gICAgICAgICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gdC5zcGxpdCAobGluZWJyZWFrKVxuXG4gICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5wdXNoIChmaXJzdClcbiAgICAgICAgICAgIGxpbmVzID0gWy4uLmxpbmVzLCAuLi5yZXN0Lm1hcCAodCA9PiB0ID8gWy4uLmxlZnRQYWQsIHRdIDogW10pXVxuXG4gICAgICAgICAgICBjb25zdCBwYWQgPSBibGFuayAoIXJlc3QubGVuZ3RoID8gdCA6IHJlc3RbcmVzdC5sZW5ndGggLSAxXSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHBhZCkgeyBsZWZ0UGFkLnB1c2ggKHBhZCkgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxpbmVzXG4gICAgfSxcblxuICAgIGNvbmNhdDogKGxpbmVzLCB7IHNlcGFyYXRvciA9ICcgJyB9KSA9PiBsaW5lcy5tYXAgKHRva2VucyA9PiB0b2tlbnMuam9pbiAoc2VwYXJhdG9yKSksXG5cbiAgICBpbmRlbnQ6IChsaW5lcywgeyBsZXZlbCA9IDAsIHBhdHRlcm4gPSAnXFx0JyB9KSA9PiBsaW5lcy5tYXAgKGxpbmUgPT4gcGF0dGVybi5yZXBlYXQgKGxldmVsKSArIGxpbmUpLFxuICAgIFxuICAgIHRpbWU6IChsaW5lcywgeyB3aGVuICA9IG5ldyBEYXRlICgpLFxuICAgICAgICAgICAgICAgICAgICBwcmludCA9IHdoZW4gPT4gYW5zaS5kaW0gKHdoZW4udG9JU09TdHJpbmcgKCkpICsgJ1xcdCcgfSkgPT4gYnVsbGV0IChwcmludCAod2hlbiksIGxpbmVzKSxcblxuICAgIGxvY2F0ZTogKGxpbmVzLCB7XG5cbiAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwLFxuICAgICAgICAgICAgICAgICAgICB3aGVyZSA9IChuZXcgU3RhY2tUcmFjZXkgKCkuY2xlYW4uYXQgKDIgKyBzaGlmdCkpLFxuICAgICAgICAgICAgICAgICAgICBqb2luICA9ICgoYSwgc2VwLCBiKSA9PiAoYSAmJiBiKSA/IChhICsgc2VwICsgYikgOiAoYSB8fCBiKSksXG4gICAgICAgICAgICAgICAgICAgIHByaW50ID0gKHsgY2FsbGVlU2hvcnQsIGZpbGVOYW1lID0gW10sIGxpbmUgPSBbXSB9KSA9PiBhbnNpLmRpbSAoJygnICsgam9pbiAoY2FsbGVlU2hvcnQsICcgQCAnLCBqb2luIChmaWxlTmFtZSwgJzonLCBsaW5lKSkgKyAnKScpXG5cbiAgICAgICAgICAgICAgICB9KSA9PiBjaGFuZ2VMYXN0Tm9uZW1wdHlMaW5lIChsaW5lcywgbGluZSA9PiBqb2luIChsaW5lLCAnICcsIHByaW50ICh3aGVyZSkpKSxcblxuICAgIGpvaW46IChsaW5lcywgeyBsaW5lYnJlYWsgPSAnXFxuJyB9KSA9PiBsaW5lcy5qb2luIChsaW5lYnJlYWspLFxuXG4gICAgcmVuZGVyOiAodGV4dCwge1xuXG4gICAgICAgIGVuZ2luZSA9ICgodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpICYmICh3aW5kb3cud2luZG93ID09PSB3aW5kb3cpICYmIHdpbmRvdy5uYXZpZ2F0b3IpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YgKCdDaHJvbWUnKSA+PSAwKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2Nocm9tZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnZ2VuZXJpYydcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2Fuc2knLFxuXG4gICAgICAgIGVuZ2luZXMgPSB7IC8qIGNvbmZpZ3VyYWJsZSAqLyB9LFxuXG4gICAgICAgIGNvbnNvbGVNZXRob2QgPSAnbG9nJyxcblxuICAgICAgICBkZWZhdWx0cyA9IHtcblxuICAgICAgICAgICAgYW5zaTogICAgcyA9PiBjb25zb2xlW2NvbnNvbGVNZXRob2RdIChzKSxcbiAgICAgICAgICAgIGNocm9tZTogIHMgPT4gY29uc29sZVtjb25zb2xlTWV0aG9kXSAoLi4uYW5zaS5wYXJzZSAocykuYXNDaHJvbWVDb25zb2xlTG9nQXJndW1lbnRzKSxcbiAgICAgICAgICAgIGdlbmVyaWM6IHMgPT4gY29uc29sZVtjb25zb2xlTWV0aG9kXSAoYW5zaS5zdHJpcCAocykpXG4gICAgICAgIH1cblxuICAgIH0pID0+ICgodGV4dCAmJiBPLmFzc2lnbiAoZGVmYXVsdHMsIGVuZ2luZXMpW2VuZ2luZV0gKHRleHQpLCB0ZXh0KSksXG5cbiAgICByZXR1cm5WYWx1ZTogKF9fLCB7IGluaXRpYWxBcmd1bWVudHM6IFtmaXJzdEFyZ3VtZW50XSB9KSA9PiBmaXJzdEFyZ3VtZW50XG5cbi8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxufSkuY29uZmlndXJlICh7XG5cbiAgICB0aW1lOiBmYWxzZSAvLyBkaXNhYmxlcyAndGltZScgc3RlcCAodW50aWwgZW5hYmxlZCBiYWNrIGV4cGxpY2l0bHkpXG5cbi8qICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxufSkubWV0aG9kcyAoe1xuXG4gICAgaW5kZW50IChsZXZlbCkgeyByZXR1cm4gdGhpcy5jb25maWd1cmUgKHsgaW5kZW50OiB7IGxldmVsOiBsZXZlbCB9fSkgfSxcblxuICAgIGdldCBlcnJvciAoKSB7IHJldHVybiB0aGlzLmNvbmZpZ3VyZSAoeyByZW5kZXI6IHsgY29uc29sZU1ldGhvZDogJ2Vycm9yJyB9IH0pIH0sXG4gICAgZ2V0IHdhcm4gKCkgIHsgcmV0dXJuIHRoaXMuY29uZmlndXJlICh7IHJlbmRlcjogeyBjb25zb2xlTWV0aG9kOiAnd2FybicgfSB9KSB9LFxuICAgIGdldCBpbmZvICgpICB7IHJldHVybiB0aGlzLmNvbmZpZ3VyZSAoeyByZW5kZXI6IHsgY29uc29sZU1ldGhvZDogJ2luZm8nIH0gfSkgfSxcblxuICAgIG1heEFycmF5TGVuZ3RoIChuKSB7IHJldHVybiB0aGlzLmNvbmZpZ3VyZSAoeyBzdHJpbmdpZnk6IHsgbWF4QXJyYXlMZW5ndGg6IG4gfSB9KSB9LFxuICAgIG1heERlcHRoIChuKSB7IHJldHVybiB0aGlzLmNvbmZpZ3VyZSAoeyBzdHJpbmdpZnk6IHsgbWF4RGVwdGg6IG4gfSB9KSB9LFxuXG4gICAgZ2V0IHVubGltaXRlZCAoKSB7IHJldHVybiB0aGlzLmNvbmZpZ3VyZSAoeyBzdHJpbmdpZnk6IHsgbWF4QXJyYXlMZW5ndGg6IE51bWJlci5NQVhfVkFMVUUsIG1heERlcHRoOiBOdW1iZXIuTUFYX1ZBTFVFIH0gfSkgfSxcbiAgICBnZXQgbm9QcmV0dHkgKCkgeyByZXR1cm4gdGhpcy5jb25maWd1cmUgKHsgc3RyaW5naWZ5OiB7IHByZXR0eTogZmFsc2UgfSB9KSB9LFxuXG4gICAgZ2V0IHNlcmlhbGl6ZSAoKSB7IHJldHVybiB0aGlzLmJlZm9yZSAoJ3JlbmRlcicpIH0sXG4gICAgZ2V0IGRlc2VyaWFsaXplICgpIHsgcmV0dXJuIHRoaXMuZnJvbSAoJ3JlbmRlcicpIH0sXG5cbiAgICBuZXdsaW5lICgpIHsgcmV0dXJuIHRoaXMuZnJvbSAoJ2pvaW4nKShbJyddKSB9XG59KVxuXG4vKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmFuc2kubmFtZXMuZm9yRWFjaCAoY29sb3IgPT4ge1xuXG4gICAgbG9nLm1ldGhvZHMgKHtcblxuICAgICAgICBnZXQgW2NvbG9yXSAoKSB7IHJldHVybiB0aGlzLmNvbmZpZ3VyZSAoeyAnY29uY2F0Kyc6IGxpbmVzID0+IGxpbmVzLm1hcCAoYW5zaVtjb2xvcl0pIH0pIH1cbiAgICB9KVxufSlcblxuLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGxvZ1xuXG4vKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblxuIl19