#!/usr/bin/env node /// var BeautylogPlugins; (function (BeautylogPlugins) { var plugins = {}; BeautylogPlugins.init = function () { plugins = { lodash: require("lodash"), smartenv: require("smartenv"), q: require("q") }; if (plugins.smartenv.getEnv().isNode) { plugins = plugins.lodash.assign(plugins, { colors: require("colors"), clc: require("cli-color"), figlet: require("figlet") }); } return plugins; }; })(BeautylogPlugins || (BeautylogPlugins = {})); /// var tableHelpers = { makeRow: function (cellCounterArg, colorArg) { if (cellCounterArg === void 0) { cellCounterArg = 2; } if (colorArg === void 0) { colorArg = "cyan"; } var rowArray = []; for (var i = 0; i < (cellCounterArg); i++) { rowArray.push(String(i + 1).cyan); } return rowArray; } }; var ConsoleTable = (function () { function ConsoleTable(tableTypeArg, tableHeadArrayArg) { if (tableHeadArrayArg === void 0) { tableHeadArrayArg = tableHelpers.makeRow(); } switch (tableTypeArg) { case "checks": this.tableHead = ['Check Item:'.cyan, 'Status:'.cyan]; break; case "custom": this.tableHead = tableHeadArrayArg; break; default: break; } this.rows = []; this.type = tableTypeArg; } ConsoleTable.prototype.push = function (row) { this.rows.push(row); }; ConsoleTable.prototype.print = function () { var table = new BeautylogNodeTable.cliTable({ head: this.tableHead }); for (var row in this.rows) { if (this.rows[row][1] == "success") { this.rows[row][1] = ' '.bgGreen + ' ' + this.rows[row][1]; } else if (this.rows[row][1] == "error") { this.rows[row][1] = ' '.bgRed + ' ' + this.rows[row][1]; } table.push(this.rows[row]); } ; console.log(table.toString()); }; return ConsoleTable; })(); /// var BeautylogNode; (function (BeautylogNode) { function init() { var beautylogNode = { log: BeautylogNodeLog.init(), code: BeautylogNodeCode.init(), figlet: BeautylogNodeFiglet.figlet, figletSync: BeautylogNodeFiglet.figletSync }; /** * logs an directory to console * @param logText * @returns {boolean} */ beautylogNode.dir = function (logText) { return beautylogNode.log(logText, 'dir'); }; /** * logs an error to console * @param logText * @returns {boolean} */ beautylogNode.error = function (logText) { return beautylogNode.log(logText, 'error'); }; /** * logs an info to console * @param logText * @returns {boolean} */ beautylogNode.info = function (logText) { return beautylogNode.log(logText, 'info'); }; /** * logs an 'OK!' message to console * @param logText * @returns {boolean} */ beautylogNode.ok = function (logText) { return beautylogNode.log(logText, 'ok'); }; /** * logs a success to console * @param logText string to log as error * @returns {boolean} */ beautylogNode.success = function (logText) { return beautylogNode.log(logText, 'success'); }; /** * logs a 'warn:' message to console * @param logText string to log as error * @returns {boolean} */ beautylogNode.warn = function (logText) { return beautylogNode.log(logText, 'warn'); }; beautylogNode.table = BeautylogNodeTable.init(); return beautylogNode; } BeautylogNode.init = init; })(BeautylogNode || (BeautylogNode = {})); /// var BeautylogNodeLog; (function (BeautylogNodeLog) { BeautylogNodeLog.init = function () { var localBl = { dirPrefix: plugins.clc.bgXterm(39).xterm(231).bold(' DIR ') + ' ', errorPrefix: ' Error: '.bgRed.white.bold + ' ', infoPrefix: plugins.clc.bgXterm(198).xterm(231).bold(' INFO ') + ' ', normalPrefix: ' Log: '.bgCyan.white.bold + ' ', okPrefix: ' '.bgGreen + ' OK! '.bgBlack.green.bold + ' ', successPrefix: ' Success: '.bgGreen.white.bold + ' ', warnPrefix: ' '.bgYellow + ' Warn: '.bgBlack.yellow.bold + ' ' }; /** * * @param logText * @param logType * @returns {boolean} */ var logFunction = function (logText, logType) { if (logText === void 0) { logText = 'empty log'; } if (logType === void 0) { logType = 'normal'; } try { switch (logType) { case 'dir': logText = localBl.dirPrefix + plugins.clc.xterm(26)(logText); break; case 'error': logText = localBl.errorPrefix + logText.red.bold; break; case 'info': logText = localBl.infoPrefix + plugins.clc.xterm(198)(logText); break; case 'normal': logText = localBl.normalPrefix + logText.cyan.bold; break; case 'ok': logText = localBl.okPrefix + logText.bold; break; case 'success': logText = localBl.successPrefix + logText.green.bold; break; case 'warn': logText = localBl.warnPrefix + logText.bold; break; case 'log': default: logText.blue.bold; console.log(('unknown logType for "' + logText + '"').red.bold); break; } console.log(logText); return true; } catch (error) { console.log(localBl.errorPrefix + 'You seem to have tried logging something strange'.red.bold + error); return false; } }; return logFunction; }; })(BeautylogNodeLog || (BeautylogNodeLog = {})); /// var BeautylogNodeCode; (function (BeautylogNodeCode) { BeautylogNodeCode.init = function () { var codeFunction = function (codeString, options) { var hlight = require("hlight"); var codeSnippet = { source: codeString, highlighted: "default" }; if (typeof codeString != "string") { console.log("beautylog.code() expects a string as first argument!"); return; } ; if (typeof options != "undefined") { codeSnippet.highlighted = hlight(codeSnippet.source, options.language); } }; return codeFunction; }; })(BeautylogNodeCode || (BeautylogNodeCode = {})); /// var BeautylogNodeTable; (function (BeautylogNodeTable) { function init() { BeautylogNodeTable.cliTable = require("cli-table2"); var beautylogOsTable = {}; beautylogOsTable.new = function (typeArg, tableHeadArrayArg) { var newConsoleTable = new ConsoleTable(typeArg, tableHeadArrayArg); return newConsoleTable; }; return beautylogOsTable; } BeautylogNodeTable.init = init; })(BeautylogNodeTable || (BeautylogNodeTable = {})); /// var BeautylogNodeFiglet; (function (BeautylogNodeFiglet) { var defaultOptions = { font: "Star Wars", color: "green", cb: function () { } }; BeautylogNodeFiglet.figlet = function (textArg, optionsArg) { var done = plugins.q.defer(); var mergeOptions = plugins.lodash.cloneDeep(defaultOptions); var options = plugins.lodash.assign(mergeOptions, optionsArg); plugins.figlet(textArg, { font: options.font, horizontalLayout: 'default', verticalLayout: 'default' }, function (err, data) { if (err) { console.log('Something went wrong...'); console.dir(err); return; } console.log(data[options.color]); options.cb(); done.resolve(); }); return done.promise; }; BeautylogNodeFiglet.figletSync = function (textArg, optionsArg) { var mergeOptions = plugins.lodash.cloneDeep(defaultOptions); var options = plugins.lodash.assign(mergeOptions, optionsArg); console.log(plugins.figlet.textSync(textArg, { font: options.font, horizontalLayout: 'default', verticalLayout: 'default' })[options.color]); return true; }; })(BeautylogNodeFiglet || (BeautylogNodeFiglet = {})); /// var BeautylogBrowser; (function (BeautylogBrowser) { function init() { var beautylogBrowser = {}; beautylogBrowser.log = function (message) { console.log('%c Log: %c ' + message, "background:#42A5F5;color:#ffffff", "color:#42A5F5;"); }; beautylogBrowser.info = function (message) { console.log('%c Info: %c ' + message, 'background:#EC407A;color:#ffffff;', 'color:#EC407A;'); }; beautylogBrowser.ok = function (message) { console.log('%c OK: %c ' + message, "background:#000000;color:#8BC34A;", "color:#000000;"); }; beautylogBrowser.success = function (message) { console.log('%c Success: %c ' + message, "background:#8BC34A;color:#ffffff;", "color:#8BC34A;"); }; beautylogBrowser.warn = function (message) { console.log('%c Warn: %c ' + message, "background:#000000;color:#FB8C00;", "color:#000000;"); }; return beautylogBrowser; } BeautylogBrowser.init = init; })(BeautylogBrowser || (BeautylogBrowser = {})); /// /// /// /// /// /// /// /// /// /// /// var plugins = BeautylogPlugins.init(); var beautylog = (function () { switch (plugins.smartenv.getEnv().runtimeEnv) { case "node": var beautylogOs = BeautylogNode.init(); return beautylogOs; break; case "browser": var beautylogBrowser = BeautylogBrowser.init(); return beautylogBrowser; break; default: console.log("something is strange about the platform in which you try to use beautylog"); break; } })(); module.exports = beautylog; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJlYXV0eWxvZy5wbHVnaW5zLnRzIiwiYmVhdXR5bG9nLmNsYXNzZXMudHMiLCJiZWF1dHlsb2cubm9kZS50cyIsImJlYXV0eWxvZy5ub2RlLmxvZy50cyIsImJlYXV0eWxvZy5ub2RlLmNvZGUudHMiLCJiZWF1dHlsb2cubm9kZS50YWJsZS50cyIsImJlYXV0eWxvZy5ub2RlLmZpZ2xldC50cyIsImJlYXV0eWxvZy5icm93c2VyLnRzIiwiYmVhdXR5bG9nLnByb21pc2VjaGFpbi50cyIsImluZGV4LnRzIl0sIm5hbWVzIjpbIkJlYXV0eWxvZ1BsdWdpbnMiLCJDb25zb2xlVGFibGUiLCJDb25zb2xlVGFibGUuY29uc3RydWN0b3IiLCJDb25zb2xlVGFibGUucHVzaCIsIkNvbnNvbGVUYWJsZS5wcmludCIsIkJlYXV0eWxvZ05vZGUiLCJCZWF1dHlsb2dOb2RlLmluaXQiLCJCZWF1dHlsb2dOb2RlTG9nIiwiQmVhdXR5bG9nTm9kZUNvZGUiLCJCZWF1dHlsb2dOb2RlVGFibGUiLCJCZWF1dHlsb2dOb2RlVGFibGUuaW5pdCIsIkJlYXV0eWxvZ05vZGVGaWdsZXQiLCJCZWF1dHlsb2dCcm93c2VyIiwiQmVhdXR5bG9nQnJvd3Nlci5pbml0Il0sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFDbkMsSUFBTyxnQkFBZ0IsQ0FpQnRCO0FBakJELFdBQU8sZ0JBQWdCLEVBQUMsQ0FBQztJQUNyQkEsSUFBSUEsT0FBT0EsR0FBT0EsRUFBRUEsQ0FBQ0E7SUFDVkEscUJBQUlBLEdBQUdBO1FBQ2QsT0FBTyxHQUFHO1lBQ04sTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDekIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDN0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUM7U0FDbEIsQ0FBQztRQUNGLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQztZQUNs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LGdCQUFnQixRQW9CdEI7QUNyQkQsQUFDQSxtQ0FEbUM7QUNBbkMsNENBQTRDO0FBQzVDLCtDQUErQztBQUMvQywrQ0FBK0M7QUFDL0MsNENBQTRDO0FBQzVDLGdEQUFnRDtBQUNoRCxpREFBaUQ7QUFDakQsa0RBQWtEO0FBQ2xELG1EQUFtRDtBQUNuRCwrQ0FBK0M7QUFDL0Msb0RBQW9EO0FBRXBELElBQUksT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3RDLElBQUksU0FBUyxHQUFHLENBQUM7SUFDYixNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsS0FBSyxNQUFNO1lBQ1AsSUFBSSxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDbkIsS0FBSyxDQUFDO1FBQ1YsS0FBSyxTQUFTO1lBQ1YsSUFBSSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDeEIsS0FBSyxDQUFDO1FBQ1Y7WUFDSSxPQUFPLENBQUMsR0FBRyxDQUFDLDJFQUEyRSxDQUFDLENBQUM7WUFDekYsS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDTCxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2luZGV4LnRzXCIgLz5cbm1vZHVsZSBCZWF1dHlsb2dQbHVnaW5zIHtcbiAgICB2YXIgcGx1Z2luczphbnkgPSB7fTtcbiAgICBleHBvcnQgdmFyIGluaXQgPSBmdW5jdGlvbigpe1xuICAgICAgICBwbHVnaW5zID0ge1xuICAgICAgICAgICAgbG9kYXNoOiByZXF1aXJlKFwibG9kYXNoXCIpLFxuICAgICAgICAgICAgc21hcnRlbnY6IHJlcXVpcmUoXCJzbWFydGVudlwiKSxcbiAgICAgICAgICAgIHE6IHJlcXVpcmUoXCJxXCIpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwbHVnaW5zLnNtYXJ0ZW52LmdldEVudigpLmlzTm9kZSl7XG4gICAgICAgICAgICBwbHVnaW5zID0gcGx1Z2lucy5sb2Rhc2guYXNzaWduKHBsdWdpbnMse1xuICAgICAgICAgICAgICAgIGNvbG9yczogcmVxdWlyZShcImNvbG9yc1wiKSxcbiAgICAgICAgICAgICAgICBjbGM6IHJlcXVpcmUoXCJjbGktY29sb3JcIiksXG4gICAgICAgICAgICAgICAgZmlnbGV0OiByZXF1aXJlKFwiZmlnbGV0XCIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGx1Z2lucztcbiAgICB9O1xufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2luZGV4LnRzXCIgLz5cbnZhciB0YWJsZUhlbHBlcnMgPSB7XG4gICAgbWFrZVJvdzogZnVuY3Rpb24oY2VsbENvdW50ZXJBcmc6bnVtYmVyID0gMixjb2xvckFyZzpzdHJpbmcgPSBcImN5YW5cIil7XG4gICAgICAgIHZhciByb3dBcnJheSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IChjZWxsQ291bnRlckFyZyk7IGkrKykge1xuICAgICAgICAgICAgcm93QXJyYXkucHVzaChTdHJpbmcoaSArIDEpLmN5YW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dBcnJheTtcbiAgICB9XG59O1xuXG5jbGFzcyBDb25zb2xlVGFibGUge1xuICAgIHRhYmxlSGVhZDpzdHJpbmdbXTtcbiAgICByb3dzO1xuICAgIHR5cGU6c3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKHRhYmxlVHlwZUFyZzpzdHJpbmcsdGFibGVIZWFkQXJyYXlBcmc6c3RyaW5nW10gPSB0YWJsZUhlbHBlcnMubWFrZVJvdygpKSB7XG4gICAgICAgIHN3aXRjaCAodGFibGVUeXBlQXJnKSB7XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tzXCI6XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZUhlYWQgPSBbJ0NoZWNrIEl0ZW06Jy5jeWFuLCdTdGF0dXM6Jy5jeWFuXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjdXN0b21cIjpcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlSGVhZCA9IHRhYmxlSGVhZEFycmF5QXJnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICAgICAgdGhpcy50eXBlID0gdGFibGVUeXBlQXJnO1xuICAgIH1cbiAgICBwdXNoKHJvdzpzdHJpbmdbXSl7XG4gICAgICAgIHRoaXMucm93cy5wdXNoKHJvdyk7XG4gICAgfVxuICAgIHByaW50KCkge1xuICAgICAgICB2YXIgdGFibGUgPSBuZXcgQmVhdXR5bG9nTm9kZVRhYmxlLmNsaVRhYmxlKHtcbiAgICAgICAgICAgIGhlYWQ6IHRoaXMudGFibGVIZWFkXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKHZhciByb3cgaW4gdGhpcy5yb3dzKXtcbiAgICAgICAgICAgIGlmKHRoaXMucm93c1tyb3ddWzFdID09IFwic3VjY2Vzc1wiKXtcbiAgICAgICAgICAgICAgICB0aGlzLnJvd3Nbcm93XVsxXSA9ICcgJy5iZ0dyZWVuICsgJyAnICsgdGhpcy5yb3dzW3Jvd11bMV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm93c1tyb3ddWzFdID09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgICAgIHRoaXMucm93c1tyb3ddWzFdID0gJyAnLmJnUmVkICsgJyAnICsgdGhpcy5yb3dzW3Jvd11bMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YWJsZS5wdXNoKHRoaXMucm93c1tyb3ddKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc29sZS5sb2codGFibGUudG9TdHJpbmcoKSk7XG4gICAgfVxufVxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW5kZXgudHNcIiAvPlxubW9kdWxlIEJlYXV0eWxvZ05vZGUge1xuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuXG4gICAgICAgIHZhciBiZWF1dHlsb2dOb2RlOmFueSA9IHtcbiAgICAgICAgICAgIGxvZzpCZWF1dHlsb2dOb2RlTG9nLmluaXQoKSxcbiAgICAgICAgICAgIGNvZGU6QmVhdXR5bG9nTm9kZUNvZGUuaW5pdCgpLFxuICAgICAgICAgICAgZmlnbGV0OkJlYXV0eWxvZ05vZGVGaWdsZXQuZmlnbGV0LFxuICAgICAgICAgICAgZmlnbGV0U3luYzpCZWF1dHlsb2dOb2RlRmlnbGV0LmZpZ2xldFN5bmNcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogbG9ncyBhbiBkaXJlY3RvcnkgdG8gY29uc29sZVxuICAgICAgICAgKiBAcGFyYW0gbG9nVGV4dFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUuZGlyID0gZnVuY3Rpb24obG9nVGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlYXV0eWxvZ05vZGUubG9nKGxvZ1RleHQsICdkaXInKTtcbiAgICAgICAgfTtcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsb2dzIGFuIGVycm9yIHRvIGNvbnNvbGVcbiAgICAgICAgICogQHBhcmFtIGxvZ1RleHRcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBiZWF1dHlsb2dOb2RlLmVycm9yID0gZnVuY3Rpb24obG9nVGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGJlYXV0eWxvZ05vZGUubG9nKGxvZ1RleHQsICdlcnJvcicpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsb2dzIGFuIGluZm8gdG8gY29uc29sZVxuICAgICAgICAgKiBAcGFyYW0gbG9nVGV4dFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUuaW5mbyA9IGZ1bmN0aW9uKGxvZ1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dOb2RlLmxvZyhsb2dUZXh0LCAnaW5mbycpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsb2dzIGFuICdPSyEnIG1lc3NhZ2UgdG8gY29uc29sZVxuICAgICAgICAgKiBAcGFyYW0gbG9nVGV4dFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUub2sgPSBmdW5jdGlvbihsb2dUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmVhdXR5bG9nTm9kZS5sb2cobG9nVGV4dCwgJ29rJyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGxvZ3MgYSBzdWNjZXNzIHRvIGNvbnNvbGVcbiAgICAgICAgICogQHBhcmFtIGxvZ1RleHQgc3RyaW5nIHRvIGxvZyBhcyBlcnJvclxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUuc3VjY2VzcyA9IGZ1bmN0aW9uKGxvZ1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dOb2RlLmxvZyhsb2dUZXh0LCAnc3VjY2VzcycpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsb2dzIGEgJ3dhcm46JyBtZXNzYWdlIHRvIGNvbnNvbGVcbiAgICAgICAgICogQHBhcmFtIGxvZ1RleHQgc3RyaW5nIHRvIGxvZyBhcyBlcnJvclxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYXV0eWxvZ05vZGUud2FybiA9IGZ1bmN0aW9uKGxvZ1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dOb2RlLmxvZyhsb2dUZXh0LCAnd2FybicpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGJlYXV0eWxvZ05vZGUudGFibGUgPSBCZWF1dHlsb2dOb2RlVGFibGUuaW5pdCgpO1xuXG4gICAgICAgIHJldHVybiBiZWF1dHlsb2dOb2RlO1xuICAgIH1cbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbmRleC50c1wiIC8+XG5tb2R1bGUgQmVhdXR5bG9nTm9kZUxvZyB7XG4gICAgZXhwb3J0IHZhciBpbml0ID0gZnVuY3Rpb24oKXtcblxuICAgICAgICB2YXIgbG9jYWxCbCA9IHtcbiAgICAgICAgICAgIGRpclByZWZpeDogcGx1Z2lucy5jbGMuYmdYdGVybSgzOSkueHRlcm0oMjMxKS5ib2xkKCcgRElSICcpICsgJyAnLFxuICAgICAgICAgICAgZXJyb3JQcmVmaXg6ICcgRXJyb3I6ICcuYmdSZWQud2hpdGUuYm9sZCArICcgJyxcbiAgICAgICAgICAgIGluZm9QcmVmaXg6IHBsdWdpbnMuY2xjLmJnWHRlcm0oMTk4KS54dGVybSgyMzEpLmJvbGQoJyBJTkZPICcpICsgJyAnLFxuICAgICAgICAgICAgbm9ybWFsUHJlZml4OiAnIExvZzogJy5iZ0N5YW4ud2hpdGUuYm9sZCArICcgJyxcbiAgICAgICAgICAgIG9rUHJlZml4OiAnICcuYmdHcmVlbiArICcgT0shICcuYmdCbGFjay5ncmVlbi5ib2xkICsgJyAnLFxuICAgICAgICAgICAgc3VjY2Vzc1ByZWZpeDogJyBTdWNjZXNzOiAnLmJnR3JlZW4ud2hpdGUuYm9sZCArICcgJyxcbiAgICAgICAgICAgIHdhcm5QcmVmaXg6ICcgJy5iZ1llbGxvdyArICcgV2FybjogJy5iZ0JsYWNrLnllbGxvdy5ib2xkICsgJyAnXG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBsb2dUZXh0XG4gICAgICAgICAqIEBwYXJhbSBsb2dUeXBlXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGxvZ0Z1bmN0aW9uID0gZnVuY3Rpb24obG9nVGV4dDpzdHJpbmcgPSAnZW1wdHkgbG9nJywgbG9nVHlwZTpzdHJpbmcgPSAnbm9ybWFsJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGxvZ1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGlyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1RleHQgPSBsb2NhbEJsLmRpclByZWZpeCArIHBsdWdpbnMuY2xjLnh0ZXJtKDI2KShsb2dUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dUZXh0ID0gbG9jYWxCbC5lcnJvclByZWZpeCArIGxvZ1RleHQucmVkLmJvbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5mbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dUZXh0ID0gbG9jYWxCbC5pbmZvUHJlZml4ICsgcGx1Z2lucy5jbGMueHRlcm0oMTk4KShsb2dUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdub3JtYWwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nVGV4dCA9IGxvY2FsQmwubm9ybWFsUHJlZml4ICsgbG9nVGV4dC5jeWFuLmJvbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnb2snOlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nVGV4dCA9IGxvY2FsQmwub2tQcmVmaXggKyBsb2dUZXh0LmJvbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dUZXh0ID0gbG9jYWxCbC5zdWNjZXNzUHJlZml4ICsgbG9nVGV4dC5ncmVlbi5ib2xkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nVGV4dCA9IGxvY2FsQmwud2FyblByZWZpeCArIGxvZ1RleHQuYm9sZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdsb2cnOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nVGV4dC5ibHVlLmJvbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygoJ3Vua25vd24gbG9nVHlwZSBmb3IgXCInICsgbG9nVGV4dCArICdcIicpLnJlZC5ib2xkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dUZXh0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvY2FsQmwuZXJyb3JQcmVmaXggKyAnWW91IHNlZW0gdG8gaGF2ZSB0cmllZCBsb2dnaW5nIHNvbWV0aGluZyBzdHJhbmdlJy5yZWQuYm9sZCArIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBsb2dGdW5jdGlvbjtcbiAgICB9XG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW5kZXgudHNcIiAvPlxubW9kdWxlIEJlYXV0eWxvZ05vZGVDb2RlIHtcbiAgICBleHBvcnQgdmFyIGluaXQgPSBmdW5jdGlvbigpIHtcblxuXG4gICAgICAgIHZhciBjb2RlRnVuY3Rpb24gPSBmdW5jdGlvbihjb2RlU3RyaW5nLG9wdGlvbnM/KXtcbiAgICAgICAgICAgIHZhciBobGlnaHQgPSByZXF1aXJlKFwiaGxpZ2h0XCIpO1xuICAgICAgICAgICAgdmFyIGNvZGVTbmlwcGV0ID0ge1xuICAgICAgICAgICAgICAgIHNvdXJjZTpjb2RlU3RyaW5nLFxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOlwiZGVmYXVsdFwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2RlU3RyaW5nICE9IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiYmVhdXR5bG9nLmNvZGUoKSBleHBlY3RzIGEgc3RyaW5nIGFzIGZpcnN0IGFyZ3VtZW50IVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICAgICAgICAgIGNvZGVTbmlwcGV0LmhpZ2hsaWdodGVkID0gaGxpZ2h0KGNvZGVTbmlwcGV0LnNvdXJjZSxvcHRpb25zLmxhbmd1YWdlKTtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNvZGVTbmlwcGV0LmhpZ2hsaWdodGVkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gY29kZUZ1bmN0aW9uO1xuICAgIH1cbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbmRleC50c1wiIC8+XG5tb2R1bGUgQmVhdXR5bG9nTm9kZVRhYmxlIHtcbiAgICBleHBvcnQgdmFyIGNsaVRhYmxlO1xuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICBjbGlUYWJsZSA9ICByZXF1aXJlKFwiY2xpLXRhYmxlMlwiKTtcbiAgICAgICAgdmFyIGJlYXV0eWxvZ09zVGFibGU6YW55ID0ge307XG5cbiAgICAgICAgYmVhdXR5bG9nT3NUYWJsZS5uZXcgPSBmdW5jdGlvbih0eXBlQXJnOnN0cmluZyx0YWJsZUhlYWRBcnJheUFyZz8pIHtcbiAgICAgICAgICAgIHZhciBuZXdDb25zb2xlVGFibGUgPSBuZXcgQ29uc29sZVRhYmxlKHR5cGVBcmcsdGFibGVIZWFkQXJyYXlBcmcpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbnNvbGVUYWJsZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJlYXV0eWxvZ09zVGFibGU7XG4gICAgfVxufSIsIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL2luZGV4LnRzXCIgLz5cbm1vZHVsZSBCZWF1dHlsb2dOb2RlRmlnbGV0IHtcbiAgICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIGZvbnQ6XCJTdGFyIFdhcnNcIixcbiAgICAgICAgY29sb3I6IFwiZ3JlZW5cIixcbiAgICAgICAgY2I6IGZ1bmN0aW9uKCl7fVxuICAgIH07XG4gICAgZXhwb3J0IHZhciBmaWdsZXQgPSBmdW5jdGlvbih0ZXh0QXJnOnN0cmluZyxvcHRpb25zQXJnPyl7XG4gICAgICAgIHZhciBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgICAgIHZhciBtZXJnZU9wdGlvbnMgPSBwbHVnaW5zLmxvZGFzaC5jbG9uZURlZXAoZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHBsdWdpbnMubG9kYXNoLmFzc2lnbihtZXJnZU9wdGlvbnMsb3B0aW9uc0FyZyk7XG4gICAgICAgIHBsdWdpbnMuZmlnbGV0KHRleHRBcmcse1xuICAgICAgICAgICAgZm9udDogb3B0aW9ucy5mb250LFxuICAgICAgICAgICAgaG9yaXpvbnRhbExheW91dDogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgdmVydGljYWxMYXlvdXQ6ICdkZWZhdWx0J1xuICAgICAgICB9LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4nKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGFbb3B0aW9ucy5jb2xvcl0pO1xuICAgICAgICAgICAgb3B0aW9ucy5jYigpO1xuICAgICAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xuICAgIH07XG4gICAgZXhwb3J0IHZhciBmaWdsZXRTeW5jID0gZnVuY3Rpb24odGV4dEFyZzpzdHJpbmcsb3B0aW9uc0FyZz8pe1xuICAgICAgICB2YXIgbWVyZ2VPcHRpb25zID0gcGx1Z2lucy5sb2Rhc2guY2xvbmVEZWVwKGRlZmF1bHRPcHRpb25zKTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBwbHVnaW5zLmxvZGFzaC5hc3NpZ24obWVyZ2VPcHRpb25zLG9wdGlvbnNBcmcpO1xuICAgICAgICBjb25zb2xlLmxvZyhwbHVnaW5zLmZpZ2xldC50ZXh0U3luYyh0ZXh0QXJnLHtcbiAgICAgICAgICAgIGZvbnQ6IG9wdGlvbnMuZm9udCxcbiAgICAgICAgICAgIGhvcml6b250YWxMYXlvdXQ6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIHZlcnRpY2FsTGF5b3V0OiAnZGVmYXVsdCdcbiAgICAgICAgfSlbb3B0aW9ucy5jb2xvcl0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuIiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW5kZXgudHNcIiAvPlxubW9kdWxlIEJlYXV0eWxvZ0Jyb3dzZXIge1xuICAgIGV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIgYmVhdXR5bG9nQnJvd3NlcjphbnkgPSB7fTtcbiAgICAgICAgYmVhdXR5bG9nQnJvd3Nlci5sb2cgPSBmdW5jdGlvbihtZXNzYWdlKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyBMb2c6ICVjICcgKyBtZXNzYWdlLFwiYmFja2dyb3VuZDojNDJBNUY1O2NvbG9yOiNmZmZmZmZcIixcImNvbG9yOiM0MkE1RjU7XCIpO1xuICAgICAgICB9O1xuICAgICAgICBiZWF1dHlsb2dCcm93c2VyLmluZm8gPSBmdW5jdGlvbihtZXNzYWdlKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCclYyBJbmZvOiAlYyAnICsgbWVzc2FnZSwnYmFja2dyb3VuZDojRUM0MDdBO2NvbG9yOiNmZmZmZmY7JywnY29sb3I6I0VDNDA3QTsnKTtcbiAgICAgICAgfTtcbiAgICAgICAgYmVhdXR5bG9nQnJvd3Nlci5vayA9IGZ1bmN0aW9uKG1lc3NhZ2Upe1xuICAgICAgICAgICAgY29uc29sZS5sb2coJyVjIE9LOiAlYyAnICsgbWVzc2FnZSxcImJhY2tncm91bmQ6IzAwMDAwMDtjb2xvcjojOEJDMzRBO1wiLFwiY29sb3I6IzAwMDAwMDtcIik7XG4gICAgICAgIH07XG4gICAgICAgIGJlYXV0eWxvZ0Jyb3dzZXIuc3VjY2VzcyA9IGZ1bmN0aW9uKG1lc3NhZ2Upe1xuICAgICAgICAgICAgY29uc29sZS5sb2coJyVjIFN1Y2Nlc3M6ICVjICcgKyBtZXNzYWdlLFwiYmFja2dyb3VuZDojOEJDMzRBO2NvbG9yOiNmZmZmZmY7XCIsXCJjb2xvcjojOEJDMzRBO1wiKTtcbiAgICAgICAgfTtcbiAgICAgICAgYmVhdXR5bG9nQnJvd3Nlci53YXJuID0gZnVuY3Rpb24obWVzc2FnZSl7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJWMgV2FybjogJWMgJyArIG1lc3NhZ2UsXCJiYWNrZ3JvdW5kOiMwMDAwMDA7Y29sb3I6I0ZCOEMwMDtcIixcImNvbG9yOiMwMDAwMDA7XCIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYmVhdXR5bG9nQnJvd3NlcjtcbiAgICB9XG59IiwiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vaW5kZXgudHNcIiAvPlxubW9kdWxlIEJlYXV0eWxvZ1Byb21pc2VDaGFpbiB7XG5cbn0iLCIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi90eXBpbmdzL21haW4uZC50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cucGx1Z2lucy50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cuY2xhc3Nlcy50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cubm9kZS50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cubm9kZS5sb2cudHNcIiAvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vYmVhdXR5bG9nLm5vZGUuY29kZS50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cubm9kZS50YWJsZS50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9iZWF1dHlsb2cubm9kZS5maWdsZXQudHNcIiAvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vYmVhdXR5bG9nLmJyb3dzZXIudHNcIiAvPlxuLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vYmVhdXR5bG9nLnByb21pc2VjaGFpbi50c1wiIC8+XG5cbnZhciBwbHVnaW5zID0gQmVhdXR5bG9nUGx1Z2lucy5pbml0KCk7XG52YXIgYmVhdXR5bG9nID0gKGZ1bmN0aW9uKCkge1xuICAgIHN3aXRjaCAocGx1Z2lucy5zbWFydGVudi5nZXRFbnYoKS5ydW50aW1lRW52KSB7XG4gICAgICAgIGNhc2UgXCJub2RlXCI6XG4gICAgICAgICAgICB2YXIgYmVhdXR5bG9nT3MgPSBCZWF1dHlsb2dOb2RlLmluaXQoKTtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dPcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYnJvd3NlclwiOlxuICAgICAgICAgICAgdmFyIGJlYXV0eWxvZ0Jyb3dzZXIgPSBCZWF1dHlsb2dCcm93c2VyLmluaXQoKTtcbiAgICAgICAgICAgIHJldHVybiBiZWF1dHlsb2dCcm93c2VyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInNvbWV0aGluZyBpcyBzdHJhbmdlIGFib3V0IHRoZSBwbGF0Zm9ybSBpbiB3aGljaCB5b3UgdHJ5IHRvIHVzZSBiZWF1dHlsb2dcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59KSgpO1xubW9kdWxlLmV4cG9ydHMgPSBiZWF1dHlsb2c7XG4iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=