UNPKG

lesslint

Version:
282 lines (246 loc) 24.4 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.formatMsg = formatMsg; exports.uniqueMsg = uniqueMsg; exports.getCandidates = getCandidates; exports.getIgnorePatterns = getIgnorePatterns; exports.isIgnored = isIgnored; exports.getLineContent = getLineContent; exports.changeColorByIndex = changeColorByIndex; exports.changeColorByStartAndEndIndex = changeColorByStartAndEndIndex; var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk); var _fs = require('fs'); var _edpCore = require('edp-core'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 'use strict'; /** * 调用给定的迭代函数 n 次,每一次传递 index 参数,调用迭代函数。 * from underscore * * @param {number} n 迭代次数 * @param {Function} iterator 处理函数 * @param {Object} context 上下文 * * @return {Array} 结果 */ /** * @file 通用方法 * @author ielgnaw(wuji0223@gmail.com) */ function times(n, iterator, context) { var accum = new Array(Math.max(0, n)); for (var i = 0; i < n; i++) { accum[i] = iterator.call(context, i); } return accum; } /** * 格式化信息 * * @param {string} msg 输出的信息 * @param {number} spaceCount 信息前面空格的个数即缩进的长度 * * @return {string} 格式化后的信息 */ function formatMsg(msg) { var spaceCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var space = ''; times(spaceCount, function () { space += ' '; }); return space + msg; } /** * 去掉 error.messages 里面重复的信息 * * @param {Array} msg error.messages * * @return {Array} 结果数组,是一个新数组 */ function uniqueMsg(msg) { var ret = []; var tmp = []; for (var i = 0, j = 1, len = msg.length; i < len; i++, j++) { var cur = msg[i]; if (!cur.uniqueFlag) { ret.push(cur); } else { if (tmp.indexOf(cur.uniqueFlag) === -1) { tmp.push(cur.uniqueFlag); ret.push(cur); } } } return ret; } /** * 根据参数以及模式匹配相应的文件 * * @param {Array} args 文件 * @param {Array} patterns minimatch 模式 * * @return {Array.<string>} 匹配的文件集合 */ function getCandidates(args, patterns) { var candidates = []; args = args.filter(function (item) { return item !== '.'; }); if (!args.length) { candidates = _edpCore.glob.sync(patterns); } else { var i = -1; var len = args.length; while (++i < len) { var target = args[i]; if (!(0, _fs.existsSync)(target)) { _edpCore.log.warn('No such file or directory %s', target); continue; } var stat = (0, _fs.statSync)(target); if (stat.isDirectory()) { target = target.replace(/[\/|\\]+$/, ''); candidates.push.apply(candidates, _edpCore.glob.sync(target + '/' + patterns[0])); } /* istanbul ignore else */ else if (stat.isFile()) { candidates.push(target); } } } return candidates; } /** * 获取忽略的 pattern * * @param {string} file 文件路径 * * @return {Array.<string>} 结果 */ function getIgnorePatterns(file) { if (!(0, _fs.existsSync)(file)) { return []; } var patterns = (0, _fs.readFileSync)(file, 'utf-8').split(/\r?\n/g); return patterns.filter(function (item) { return item.trim().length > 0 && item[0] !== '#'; }); } var _IGNORE_CACHE = {}; /** * 判断一下是否应该忽略这个文件. * * @param {string} file 需要检查的文件路径. * @param {string=} name ignore文件的名称. * @return {boolean} */ function isIgnored(file) { var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '.jshintignore'; var ignorePatterns = null; file = _edpCore.path.resolve(file); var key = name + '@' + _edpCore.path.dirname(file); if (_IGNORE_CACHE[key]) { ignorePatterns = _IGNORE_CACHE[key]; } else { var options = { name: name, factory: function factory(item) { var config = {}; getIgnorePatterns(item).forEach(function (line) { config[line] = true; }); return config; } }; ignorePatterns = _edpCore.util.getConfig(_edpCore.path.dirname(file), options); _IGNORE_CACHE[key] = ignorePatterns; } var bizOrPkgRoot = process.cwd(); try { bizOrPkgRoot = _edpCore.path.getRootDirectory(); } catch (ex) {} var dirname = _edpCore.path.relative(bizOrPkgRoot, file); var isMatch = _edpCore.glob.match(dirname, Object.keys(ignorePatterns)); return isMatch; } /** * 根据行号获取当前行的内容 * * @param {number} line 行号 * @param {string} fileData 文件内容 * @param {boolean} notRemoveSpace 不去掉前面的空格,为 true,则不去掉,为 false 则去掉 * 这是后加的参数,为了兼容之前的代码 * * @return {string} 当前行内容 */ function getLineContent(line, fileData, notRemoveSpace) { if (notRemoveSpace) { return fileData.split('\n')[line - 1]; } // 去掉前面的缩进 return fileData.split('\n')[line - 1].replace(/^\s*/, ''); } /** * 根据索引把一行内容中的某个子串变色 * 直接用正则匹配的话,可能会把这一行所有的 colorStr 给变色,所以要通过索引来判断 * * @param {string} source 源字符串 * @param {number} startIndex 开始的索引,通常是 col * @param {string} colorStr 要变色的字符串 * * @return {string} 改变颜色后的字符串 */ function changeColorByIndex(source, startIndex, colorStr) { var ret = ''; if (source) { var colorStrLen = colorStr.length; var endIndex = startIndex + colorStrLen; ret = '' + source.slice(0, startIndex) // colorStr 前面的部分 + _chalk2.default.magenta(source.slice(startIndex, endIndex)) // colorStr 的部分 + source.slice(endIndex, source.length); // colorStr 后面的部分 } return ret; } /** * 根据开始和结束的索引来高亮字符串的子串 * * @param {string} source 源字符串 * @param {number} startIndex 开始的索引 * @param {number} endIndex 结束的索引 * * @return {string} 改变颜色后的字符串 */ function changeColorByStartAndEndIndex(source) { var startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var endIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; if (!source) { return ''; } startIndex -= 1; endIndex -= 1; return '' + source.slice(0, startIndex) // colorStr 前面的部分 + _chalk2.default.magenta(source.slice(startIndex, endIndex)) // colorStr 的部分 + source.slice(endIndex, source.length); // colorStr 后面的部分 } /** * 把错误信息放入 errors 数组中 * * @param {string} ruleName 规则名称 * @param {number} line 行号 * @param {number} col 列号 * @param {string} message 错误信息 * @param {string} colorMessage 彩色错误信息 */ // function addInvalidList(ruleName, line, col, message, colorMessage) { // this.push({ // ruleName: ruleName, // line: line, // col: col, // message: message, // colorMessage: colorMessage // }); // } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLmpzIl0sIm5hbWVzIjpbImZvcm1hdE1zZyIsInVuaXF1ZU1zZyIsImdldENhbmRpZGF0ZXMiLCJnZXRJZ25vcmVQYXR0ZXJucyIsImlzSWdub3JlZCIsImdldExpbmVDb250ZW50IiwiY2hhbmdlQ29sb3JCeUluZGV4IiwiY2hhbmdlQ29sb3JCeVN0YXJ0QW5kRW5kSW5kZXgiLCJ0aW1lcyIsIm4iLCJpdGVyYXRvciIsImNvbnRleHQiLCJhY2N1bSIsIkFycmF5IiwiTWF0aCIsIm1heCIsImkiLCJjYWxsIiwibXNnIiwic3BhY2VDb3VudCIsInNwYWNlIiwicmV0IiwidG1wIiwiaiIsImxlbiIsImxlbmd0aCIsImN1ciIsInVuaXF1ZUZsYWciLCJwdXNoIiwiaW5kZXhPZiIsImFyZ3MiLCJwYXR0ZXJucyIsImNhbmRpZGF0ZXMiLCJmaWx0ZXIiLCJpdGVtIiwiZ2xvYiIsInN5bmMiLCJ0YXJnZXQiLCJsb2ciLCJ3YXJuIiwic3RhdCIsImlzRGlyZWN0b3J5IiwicmVwbGFjZSIsImFwcGx5IiwiaXNGaWxlIiwiZmlsZSIsInNwbGl0IiwidHJpbSIsIl9JR05PUkVfQ0FDSEUiLCJuYW1lIiwiaWdub3JlUGF0dGVybnMiLCJlZHBQYXRoIiwicmVzb2x2ZSIsImtleSIsImRpcm5hbWUiLCJvcHRpb25zIiwiZmFjdG9yeSIsImNvbmZpZyIsImZvckVhY2giLCJsaW5lIiwiZWRwVXRpbCIsImdldENvbmZpZyIsImJpek9yUGtnUm9vdCIsInByb2Nlc3MiLCJjd2QiLCJnZXRSb290RGlyZWN0b3J5IiwiZXgiLCJyZWxhdGl2ZSIsImlzTWF0Y2giLCJtYXRjaCIsIk9iamVjdCIsImtleXMiLCJmaWxlRGF0YSIsIm5vdFJlbW92ZVNwYWNlIiwic291cmNlIiwic3RhcnRJbmRleCIsImNvbG9yU3RyIiwiY29sb3JTdHJMZW4iLCJlbmRJbmRleCIsInNsaWNlIiwiY2hhbGsiLCJtYWdlbnRhIl0sIm1hcHBpbmdzIjoiOzs7OztRQXNDZ0JBLFMsR0FB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SCxhQUFhRSxXQUE5QjtBQUNBeEQsY0FBTSxLQUNBcUQsT0FBT0ssS0FBUCxDQUFhLENBQWIsRUFBZ0JKLFVBQWhCLENBREEsQ0FDNEI7QUFENUIsVUFFQUssZ0JBQU1DLE9BQU4sQ0FBY1AsT0FBT0ssS0FBUCxDQUFhSixVQUFiLEVBQXlCRyxRQUF6QixDQUFkLENBRkEsQ0FFa0Q7QUFGbEQsVUFHQUosT0FBT0ssS0FBUCxDQUFhRCxRQUFiLEVBQXVCSixPQUFPakQsTUFBOUIsQ0FITixDQUhRLENBTXFDO0FBQ2hEO0FBQ0QsV0FBT0osR0FBUDtBQUNIOztBQUVEOzs7Ozs7Ozs7QUFTTyxTQUFTZCw2QkFBVCxDQUF1Q21FLE1BQXZDLEVBQTZFO0FBQUEsUUFBOUJDLFVBQThCLHVFQUFqQixDQUFpQjtBQUFBLFFBQWRHLFFBQWMsdUVBQUgsQ0FBRzs7QUFDaEYsUUFBSSxDQUFDSixNQUFMLEVBQWE7QUFDVCxlQUFPLEVBQVA7QUFDSDs7QUFFREMsa0JBQWMsQ0FBZDtBQUNBRyxnQkFBWSxDQUFaOztBQUVBLFdBQU8sS0FDREosT0FBT0ssS0FBUCxDQUFhLENBQWIsRUFBZ0JKLFVBQWhCLENBREMsQ0FDMkI7QUFEM0IsTUFFREssZ0JBQU1DLE9BQU4sQ0FBY1AsT0FBT0ssS0FBUCxDQUFhSixVQUFiLEVBQXlCRyxRQUF6QixDQUFkLENBRkMsQ0FFaUQ7QUFGakQsTUFHREosT0FBT0ssS0FBUCxDQUFhRCxRQUFiLEVBQXVCSixPQUFPakQsTUFBOUIsQ0FITixDQVJnRixDQVduQztBQUNoRDs7QUFFRDs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6InV0aWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIOmAmueUqOaWueazlVxuICogQGF1dGhvciBpZWxnbmF3KHd1amkwMjIzQGdtYWlsLmNvbSlcbiAqL1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHtzdGF0U3luYywgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2dsb2IsIGxvZywgdXRpbCBhcyBlZHBVdGlsLCBwYXRoIGFzIGVkcFBhdGh9IGZyb20gJ2VkcC1jb3JlJztcblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIOiwg+eUqOe7meWumueahOi/reS7o+WHveaVsCBuIOasoSzmr4/kuIDmrKHkvKDpgJIgaW5kZXgg5Y+C5pWw77yM6LCD55So6L+t5Luj5Ye95pWw44CCXG4gKiBmcm9tIHVuZGVyc2NvcmVcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbiDov63ku6PmrKHmlbBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdG9yIOWkhOeQhuWHveaVsFxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQg5LiK5LiL5paHXG4gKlxuICogQHJldHVybiB7QXJyYXl9IOe7k+aenFxuICovXG5mdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGNvbnN0IGFjY3VtID0gbmV3IEFycmF5KE1hdGgubWF4KDAsIG4pKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBhY2N1bVtpXSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgaSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bTtcbn1cblxuXG4vKipcbiAqIOagvOW8j+WMluS/oeaBr1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cg6L6T5Ye655qE5L+h5oGvXG4gKiBAcGFyYW0ge251bWJlcn0gc3BhY2VDb3VudCDkv6Hmga/liY3pnaLnqbrmoLznmoTkuKrmlbDljbPnvKnov5vnmoTplb/luqZcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IOagvOW8j+WMluWQjueahOS/oeaBr1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TXNnKG1zZywgc3BhY2VDb3VudCA9IDApIHtcbiAgICBsZXQgc3BhY2UgPSAnJztcbiAgICB0aW1lcyhzcGFjZUNvdW50LCAoKSA9PiB7XG4gICAgICAgIHNwYWNlICs9ICcgJztcbiAgICB9KTtcbiAgICByZXR1cm4gc3BhY2UgKyBtc2c7XG59XG5cbi8qKlxuICog5Y675o6JIGVycm9yLm1lc3NhZ2VzIOmHjOmdoumHjeWkjeeahOS/oeaBr1xuICpcbiAqIEBwYXJhbSB7QXJyYXl9IG1zZyBlcnJvci5tZXNzYWdlc1xuICpcbiAqIEByZXR1cm4ge0FycmF5fSDnu5PmnpzmlbDnu4TvvIzmmK/kuIDkuKrmlrDmlbDnu4RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZU1zZyhtc2cpIHtcbiAgICBsZXQgcmV0ID0gW107XG4gICAgbGV0IHRtcCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBqID0gMSwgbGVuID0gbXNnLmxlbmd0aDsgaSA8IGxlbjsgaSsrLCBqKyspIHtcbiAgICAgICAgbGV0IGN1ciA9IG1zZ1tpXTtcbiAgICAgICAgaWYgKCFjdXIudW5pcXVlRmxhZykge1xuICAgICAgICAgICAgcmV0LnB1c2goY3VyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0bXAuaW5kZXhPZihjdXIudW5pcXVlRmxhZykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdG1wLnB1c2goY3VyLnVuaXF1ZUZsYWcpO1xuICAgICAgICAgICAgICAgIHJldC5wdXNoKGN1cik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxuXG4vKipcbiAqIOagueaNruWPguaVsOS7peWPiuaooeW8j+WMuemFjeebuOW6lOeahOaWh+S7tlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3Mg5paH5Lu2XG4gKiBAcGFyYW0ge0FycmF5fSBwYXR0ZXJucyBtaW5pbWF0Y2gg5qih5byPXG4gKlxuICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IOWMuemFjeeahOaWh+S7tumbhuWQiFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FuZGlkYXRlcyhhcmdzLCBwYXR0ZXJucykge1xuICAgIGxldCBjYW5kaWRhdGVzID0gW107XG5cbiAgICBhcmdzID0gYXJncy5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSAnLicpO1xuXG4gICAgaWYgKCFhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYW5kaWRhdGVzID0gZ2xvYi5zeW5jKHBhdHRlcm5zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBpID0gLTE7XG4gICAgICAgIGxldCBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGFyZ3NbaV07XG4gICAgICAgICAgICBpZiAoIWV4aXN0c1N5bmModGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGxvZy53YXJuKCdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICVzJywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHN0YXQgPSBzdGF0U3luYyh0YXJnZXQpO1xuICAgICAgICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5yZXBsYWNlKC9bXFwvfFxcXFxdKyQvLCAnJyk7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoLmFwcGx5KFxuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgICAgICAgICAgICBnbG9iLnN5bmModGFyZ2V0ICsgJy8nICsgcGF0dGVybnNbMF0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0LmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlcztcbn1cblxuLyoqXG4gKiDojrflj5blv73nlaXnmoQgcGF0dGVyblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIOaWh+S7tui3r+W+hFxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSDnu5PmnpxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElnbm9yZVBhdHRlcm5zKGZpbGUpIHtcbiAgICBpZiAoIWV4aXN0c1N5bmMoZmlsZSkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGxldCBwYXR0ZXJucyA9IHJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKS5zcGxpdCgvXFxyP1xcbi9nKTtcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKGl0ZW0gPT4gaXRlbS50cmltKCkubGVuZ3RoID4gMCAmJiBpdGVtWzBdICE9PSAnIycpO1xufVxuXG5jb25zdCBfSUdOT1JFX0NBQ0hFID0ge307XG5cbi8qKlxuICog5Yik5pat5LiA5LiL5piv5ZCm5bqU6K+l5b+955Wl6L+Z5Liq5paH5Lu2LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIOmcgOimgeajgOafpeeahOaWh+S7tui3r+W+hC5cbiAqIEBwYXJhbSB7c3RyaW5nPX0gbmFtZSBpZ25vcmXmlofku7bnmoTlkI3np7AuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJZ25vcmVkKGZpbGUsIG5hbWUgPSAnLmpzaGludGlnbm9yZScpIHtcbiAgICBsZXQgaWdub3JlUGF0dGVybnMgPSBudWxsO1xuXG4gICAgZmlsZSA9IGVkcFBhdGgucmVzb2x2ZShmaWxlKTtcblxuICAgIGxldCBrZXkgPSBuYW1lICsgJ0AnICArIGVkcFBhdGguZGlybmFtZShmaWxlKTtcbiAgICBpZiAoX0lHTk9SRV9DQUNIRVtrZXldKSB7XG4gICAgICAgIGlnbm9yZVBhdHRlcm5zID0gX0lHTk9SRV9DQUNIRVtrZXldO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgZmFjdG9yeShpdGVtKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IHt9O1xuICAgICAgICAgICAgICAgIGdldElnbm9yZVBhdHRlcm5zKGl0ZW0pLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1tsaW5lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWdub3JlUGF0dGVybnMgPSBlZHBVdGlsLmdldENvbmZpZyhcbiAgICAgICAgICAgIGVkcFBhdGguZGlybmFtZShmaWxlKSxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgICBfSUdOT1JFX0NBQ0hFW2tleV0gPSBpZ25vcmVQYXR0ZXJucztcbiAgICB9XG5cbiAgICBsZXQgYml6T3JQa2dSb290ID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGJpek9yUGtnUm9vdCA9IGVkcFBhdGguZ2V0Um9vdERpcmVjdG9yeSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXgpIHtcbiAgICB9XG5cbiAgICBjb25zdCBkaXJuYW1lID0gZWRwUGF0aC5yZWxhdGl2ZShiaXpPclBrZ1Jvb3QsIGZpbGUpO1xuICAgIGNvbnN0IGlzTWF0Y2ggPSBnbG9iLm1hdGNoKGRpcm5hbWUsIE9iamVjdC5rZXlzKGlnbm9yZVBhdHRlcm5zKSk7XG5cbiAgICByZXR1cm4gaXNNYXRjaDtcbn1cblxuLyoqXG4gKiDmoLnmja7ooYzlj7fojrflj5blvZPliY3ooYznmoTlhoXlrrlcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGluZSDooYzlj7dcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlRGF0YSDmlofku7blhoXlrrlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm90UmVtb3ZlU3BhY2Ug5LiN5Y675o6J5YmN6Z2i55qE56m65qC877yM5Li6IHRydWXvvIzliJnkuI3ljrvmjonvvIzkuLogZmFsc2Ug5YiZ5Y675o6JXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOi/meaYr+WQjuWKoOeahOWPguaVsO+8jOS4uuS6huWFvOWuueS5i+WJjeeahOS7o+eggVxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30g5b2T5YmN6KGM5YaF5a65XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lQ29udGVudChsaW5lLCBmaWxlRGF0YSwgbm90UmVtb3ZlU3BhY2UpIHtcbiAgICBpZiAobm90UmVtb3ZlU3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVEYXRhLnNwbGl0KCdcXG4nKVtsaW5lIC0gMV07XG4gICAgfVxuICAgIC8vIOWOu+aOieWJjemdoueahOe8qei/m1xuICAgIHJldHVybiBmaWxlRGF0YS5zcGxpdCgnXFxuJylbbGluZSAtIDFdLnJlcGxhY2UoL15cXHMqLywgJycpO1xufVxuXG4vKipcbiAqIOagueaNrue0ouW8leaKiuS4gOihjOWGheWuueS4reeahOafkOS4quWtkOS4suWPmOiJslxuICog55u05o6l55So5q2j5YiZ5Yy56YWN55qE6K+d77yM5Y+v6IO95Lya5oqK6L+Z5LiA6KGM5omA5pyJ55qEIGNvbG9yU3RyIOe7meWPmOiJsu+8jOaJgOS7peimgemAmui/h+e0ouW8leadpeWIpOaWrVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Ug5rqQ5a2X56ym5LiyXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnRJbmRleCDlvIDlp4vnmoTntKLlvJXvvIzpgJrluLjmmK8gY29sXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3JTdHIg6KaB5Y+Y6Imy55qE5a2X56ym5LiyXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSDmlLnlj5jpopzoibLlkI7nmoTlrZfnrKbkuLJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUNvbG9yQnlJbmRleChzb3VyY2UsIHN0YXJ0SW5kZXgsIGNvbG9yU3RyKSB7XG4gICAgbGV0IHJldCA9ICcnO1xuICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgY29sb3JTdHJMZW4gPSBjb2xvclN0ci5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIGNvbG9yU3RyTGVuO1xuICAgICAgICByZXQgPSAnJ1xuICAgICAgICAgICAgKyBzb3VyY2Uuc2xpY2UoMCwgc3RhcnRJbmRleCkgLy8gY29sb3JTdHIg5YmN6Z2i55qE6YOo5YiGXG4gICAgICAgICAgICArIGNoYWxrLm1hZ2VudGEoc291cmNlLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSkgLy8gY29sb3JTdHIg55qE6YOo5YiGXG4gICAgICAgICAgICArIHNvdXJjZS5zbGljZShlbmRJbmRleCwgc291cmNlLmxlbmd0aCk7IC8vIGNvbG9yU3RyIOWQjumdoueahOmDqOWIhlxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIOagueaNruW8gOWni+WSjOe7k+adn+eahOe0ouW8leadpemrmOS6ruWtl+espuS4sueahOWtkOS4slxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Ug5rqQ5a2X56ym5LiyXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnRJbmRleCDlvIDlp4vnmoTntKLlvJVcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRJbmRleCDnu5PmnZ/nmoTntKLlvJVcbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IOaUueWPmOminOiJsuWQjueahOWtl+espuS4slxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlQ29sb3JCeVN0YXJ0QW5kRW5kSW5kZXgoc291cmNlLCBzdGFydEluZGV4ID0gMCwgZW5kSW5kZXggPSAwKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHN0YXJ0SW5kZXggLT0gMTtcbiAgICBlbmRJbmRleCAtPSAxO1xuXG4gICAgcmV0dXJuICcnXG4gICAgICAgICsgc291cmNlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpIC8vIGNvbG9yU3RyIOWJjemdoueahOmDqOWIhlxuICAgICAgICArIGNoYWxrLm1hZ2VudGEoc291cmNlLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSkgLy8gY29sb3JTdHIg55qE6YOo5YiGXG4gICAgICAgICsgc291cmNlLnNsaWNlKGVuZEluZGV4LCBzb3VyY2UubGVuZ3RoKTsgLy8gY29sb3JTdHIg5ZCO6Z2i55qE6YOo5YiGXG59XG5cbi8qKlxuICog5oqK6ZSZ6K+v5L+h5oGv5pS+5YWlIGVycm9ycyDmlbDnu4TkuK1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcnVsZU5hbWUg6KeE5YiZ5ZCN56ewXG4gKiBAcGFyYW0ge251bWJlcn0gbGluZSDooYzlj7dcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb2wg5YiX5Y+3XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSDplJnor6/kv6Hmga9cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvck1lc3NhZ2Ug5b2p6Imy6ZSZ6K+v5L+h5oGvXG4gKi9cbi8vIGZ1bmN0aW9uIGFkZEludmFsaWRMaXN0KHJ1bGVOYW1lLCBsaW5lLCBjb2wsIG1lc3NhZ2UsIGNvbG9yTWVzc2FnZSkge1xuLy8gICAgIHRoaXMucHVzaCh7XG4vLyAgICAgICAgIHJ1bGVOYW1lOiBydWxlTmFtZSxcbi8vICAgICAgICAgbGluZTogbGluZSxcbi8vICAgICAgICAgY29sOiBjb2wsXG4vLyAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4vLyAgICAgICAgIGNvbG9yTWVzc2FnZTogY29sb3JNZXNzYWdlXG4vLyAgICAgfSk7XG4vLyB9XG4iXX0=