UNPKG

@circuitly/diff

Version:

A javascript text diff implementation.

275 lines (268 loc) 38.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createPatch = createPatch; exports.createTwoFilesPatch = createTwoFilesPatch; exports.formatPatch = formatPatch; exports.structuredPatch = structuredPatch; var _line3 = require("../diff/line"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { if (!options) { options = {}; } if (typeof options === 'function') { options = { callback: options }; } if (typeof options.context === 'undefined') { options.context = 4; } if (options.newlineIsToken) { throw new Error('newlineIsToken may not be used with patch-generation functions, only with diffing functions'); } if (!options.callback) { return diffLinesResultToPatch((0, _line3.diffLines)(oldStr, newStr, options)); } else { var _options = options, _callback = _options.callback; (0, _line3.diffLines)(oldStr, newStr, _objectSpread(_objectSpread({}, options), {}, { callback: function callback(diff) { var patch = diffLinesResultToPatch(diff); _callback(patch); } })); } function diffLinesResultToPatch(diff) { // STEP 1: Build up the patch with no "\ No newline at end of file" lines and with the arrays // of lines containing trailing newline characters. We'll tidy up later... if (!diff) { return; } diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier function contextLines(lines) { return lines.map(function (entry) { return ' ' + entry; }); } var startTime = performance.now(); function checkAbort() { var _options2; if (((_options2 = options) === null || _options2 === void 0 ? void 0 : _options2.timeout) !== undefined && performance.now() - startTime > options.timeout) { return true; } return false; } var hunks = []; var oldRangeStart = 0, newRangeStart = 0, curRange = [], oldLine = 1, newLine = 1; for (var i = 0; i < diff.length; i++) { if (checkAbort()) { break; } var current = diff[i], lines = current.lines || splitLines(current.value); current.lines = lines; if (current.added || current.removed) { // If we have previous context, start with that if (!oldRangeStart) { var prev = diff[i - 1]; oldRangeStart = oldLine; newRangeStart = newLine; if (prev) { curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : []; oldRangeStart -= curRange.length; newRangeStart -= curRange.length; } } // Output our changes var _iterator = _createForOfIteratorHelper(lines), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var line = _step.value; curRange.push((current.added ? '+' : '-') + line); } // Track the updated file position } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (current.added) { newLine += lines.length; } else { oldLine += lines.length; } } else { // Identical context lines. Track line changes if (oldRangeStart) { // Close out any changes that have been output (or join overlapping) if (lines.length <= options.context * 2 && i < diff.length - 2) { // Overlapping var _iterator2 = _createForOfIteratorHelper(contextLines(lines)), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var _line = _step2.value; curRange.push(_line); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } else { // end the range and output var contextSize = Math.min(lines.length, options.context); var _iterator3 = _createForOfIteratorHelper(contextLines(lines.slice(0, contextSize))), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var _line2 = _step3.value; curRange.push(_line2); } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } var hunk = { oldStart: oldRangeStart, oldLines: oldLine - oldRangeStart + contextSize, newStart: newRangeStart, newLines: newLine - newRangeStart + contextSize, lines: curRange }; hunks.push(hunk); oldRangeStart = 0; newRangeStart = 0; curRange = []; } } oldLine += lines.length; newLine += lines.length; } } // Step 2: eliminate the trailing `\n` from each line of each hunk, and, where needed, add // "\ No newline at end of file". for (var _i = 0, _hunks = hunks; _i < _hunks.length; _i++) { var _hunk = _hunks[_i]; for (var _i2 = 0; _i2 < _hunk.lines.length; _i2++) { if (_hunk.lines[_i2].endsWith('\n')) { _hunk.lines[_i2] = _hunk.lines[_i2].slice(0, -1); } else { _hunk.lines.splice(_i2 + 1, 0, '\\ No newline at end of file'); _i2++; // Skip the line we just added, then continue iterating } } } return { oldFileName: oldFileName, newFileName: newFileName, oldHeader: oldHeader, newHeader: newHeader, hunks: hunks }; } } function formatPatch(diff) { if (Array.isArray(diff)) { return diff.map(formatPatch).join('\n'); } var ret = []; if (diff.oldFileName == diff.newFileName) { ret.push('Index: ' + diff.oldFileName); } ret.push('==================================================================='); ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader)); ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader)); for (var i = 0; i < diff.hunks.length; i++) { var hunk = diff.hunks[i]; // Unified Diff Format quirk: If the chunk size is 0, // the first number is one lower than one would expect. // https://www.artima.com/weblogs/viewpost.jsp?thread=164293 if (hunk.oldLines === 0) { hunk.oldStart -= 1; } if (hunk.newLines === 0) { hunk.newStart -= 1; } ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@'); var _iterator4 = _createForOfIteratorHelper(hunk.lines), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var line = _step4.value; ret.push(line); } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } } return ret.join('\n') + '\n'; } function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { var _options3; if (typeof options === 'function') { options = { callback: options }; } if (!((_options3 = options) !== null && _options3 !== void 0 && _options3.callback)) { var patchObj = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options); if (!patchObj) { return; } return formatPatch(patchObj); } else { var _options4 = options, _callback2 = _options4.callback; structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, _objectSpread(_objectSpread({}, options), {}, { callback: function callback(patchObj) { if (!patchObj) { _callback2(); } else { _callback2(formatPatch(patchObj)); } } })); } } function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); } /** * Split `text` into an array of lines, including the trailing newline character (where present) */ function splitLines(text) { var hasTrailingNl = text.endsWith('\n'); var result = text.split('\n').map(function (line) { return line + '\n'; }); if (hasTrailingNl) { result.pop(); } else { result.push(result.pop().slice(0, -1)); } return result; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGluZTMiLCJyZXF1aXJlIiwiX3R5cGVvZiIsIm8iLCJTeW1ib2wiLCJpdGVyYXRvciIsImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwibmFtZSIsImZyb20iLCJ0ZXN0Iiwib3duS2V5cyIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX3RvUHJvcGVydHlLZXkiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImkiLCJfdG9QcmltaXRpdmUiLCJ0b1ByaW1pdGl2ZSIsIlN0cmluZyIsIk51bWJlciIsInN0cnVjdHVyZWRQYXRjaCIsIm9sZEZpbGVOYW1lIiwibmV3RmlsZU5hbWUiLCJvbGRTdHIiLCJuZXdTdHIiLCJvbGRIZWFkZXIiLCJuZXdIZWFkZXIiLCJvcHRpb25zIiwiY2FsbGJhY2siLCJjb250ZXh0IiwibmV3bGluZUlzVG9rZW4iLCJFcnJvciIsImRpZmZMaW5lc1Jlc3VsdFRvUGF0Y2giLCJkaWZmTGluZXMiLCJfb3B0aW9ucyIsImRpZmYiLCJwYXRjaCIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJzdGFydFRpbWUiLCJwZXJmb3JtYW5jZSIsIm5vdyIsImNoZWNrQWJvcnQiLCJfb3B0aW9uczIiLCJ0aW1lb3V0IiwidW5kZWZpbmVkIiwiaHVua3MiLCJvbGRSYW5nZVN0YXJ0IiwibmV3UmFuZ2VTdGFydCIsImN1clJhbmdlIiwib2xkTGluZSIsIm5ld0xpbmUiLCJjdXJyZW50Iiwic3BsaXRMaW5lcyIsImFkZGVkIiwicmVtb3ZlZCIsInByZXYiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImxpbmUiLCJlcnIiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsImh1bmsiLCJvbGRTdGFydCIsIm9sZExpbmVzIiwibmV3U3RhcnQiLCJuZXdMaW5lcyIsIl9pIiwiX2h1bmtzIiwiZW5kc1dpdGgiLCJzcGxpY2UiLCJmb3JtYXRQYXRjaCIsImpvaW4iLCJyZXQiLCJfaXRlcmF0b3I0IiwiX3N0ZXA0IiwiY3JlYXRlVHdvRmlsZXNQYXRjaCIsIl9vcHRpb25zMyIsInBhdGNoT2JqIiwiX29wdGlvbnM0IiwiY3JlYXRlUGF0Y2giLCJmaWxlTmFtZSIsInRleHQiLCJoYXNUcmFpbGluZ05sIiwicmVzdWx0Iiwic3BsaXQiLCJwb3AiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcGF0Y2gvY3JlYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGlmZkxpbmVzfSBmcm9tICcuLi9kaWZmL2xpbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRpb25zID0ge2NhbGxiYWNrOiBvcHRpb25zfTtcbiAgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMuY29udGV4dCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBvcHRpb25zLmNvbnRleHQgPSA0O1xuICB9XG4gIGlmIChvcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCduZXdsaW5lSXNUb2tlbiBtYXkgbm90IGJlIHVzZWQgd2l0aCBwYXRjaC1nZW5lcmF0aW9uIGZ1bmN0aW9ucywgb25seSB3aXRoIGRpZmZpbmcgZnVuY3Rpb25zJyk7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZGlmZkxpbmVzUmVzdWx0VG9QYXRjaChkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7Y2FsbGJhY2t9ID0gb3B0aW9ucztcbiAgICBkaWZmTGluZXMoXG4gICAgICBvbGRTdHIsXG4gICAgICBuZXdTdHIsXG4gICAgICB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGNhbGxiYWNrOiAoZGlmZikgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhdGNoID0gZGlmZkxpbmVzUmVzdWx0VG9QYXRjaChkaWZmKTtcbiAgICAgICAgICBjYWxsYmFjayhwYXRjaCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gZGlmZkxpbmVzUmVzdWx0VG9QYXRjaChkaWZmKSB7XG4gICAgLy8gU1RFUCAxOiBCdWlsZCB1cCB0aGUgcGF0Y2ggd2l0aCBubyBcIlxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGVcIiBsaW5lcyBhbmQgd2l0aCB0aGUgYXJyYXlzXG4gICAgLy8gICAgICAgICBvZiBsaW5lcyBjb250YWluaW5nIHRyYWlsaW5nIG5ld2xpbmUgY2hhcmFjdGVycy4gV2UnbGwgdGlkeSB1cCBsYXRlci4uLlxuXG4gICAgaWYoIWRpZmYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWZmLnB1c2goe3ZhbHVlOiAnJywgbGluZXM6IFtdfSk7IC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgICBmdW5jdGlvbiBjb250ZXh0TGluZXMobGluZXMpIHtcbiAgICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24oZW50cnkpIHsgcmV0dXJuICcgJyArIGVudHJ5OyB9KTtcbiAgICB9XG5cblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGZ1bmN0aW9uIGNoZWNrQWJvcnQoKSB7XG4gICAgICBpZiAob3B0aW9ucz8udGltZW91dCAhPT0gdW5kZWZpbmVkICYmIHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lID4gb3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBodW5rcyA9IFtdO1xuICAgIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICAgIG9sZExpbmUgPSAxLCBuZXdMaW5lID0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmYubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChjaGVja0Fib3J0KCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgICAgbGluZXMgPSBjdXJyZW50LmxpbmVzIHx8IHNwbGl0TGluZXMoY3VycmVudC52YWx1ZSk7XG4gICAgICBjdXJyZW50LmxpbmVzID0gbGluZXM7XG5cbiAgICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIHByZXZpb3VzIGNvbnRleHQsIHN0YXJ0IHdpdGggdGhhdFxuICAgICAgICBpZiAoIW9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgICAgb2xkUmFuZ2VTdGFydCA9IG9sZExpbmU7XG4gICAgICAgICAgbmV3UmFuZ2VTdGFydCA9IG5ld0xpbmU7XG5cbiAgICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgY3VyUmFuZ2UgPSBvcHRpb25zLmNvbnRleHQgPiAwID8gY29udGV4dExpbmVzKHByZXYubGluZXMuc2xpY2UoLW9wdGlvbnMuY29udGV4dCkpIDogW107XG4gICAgICAgICAgICBvbGRSYW5nZVN0YXJ0IC09IGN1clJhbmdlLmxlbmd0aDtcbiAgICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKChjdXJyZW50LmFkZGVkID8gJysnIDogJy0nKSArIGxpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgICBpZiAoY3VycmVudC5hZGRlZCkge1xuICAgICAgICAgIG5ld0xpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZGVudGljYWwgY29udGV4dCBsaW5lcy4gVHJhY2sgbGluZSBjaGFuZ2VzXG4gICAgICAgIGlmIChvbGRSYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgICBpZiAobGluZXMubGVuZ3RoIDw9IG9wdGlvbnMuY29udGV4dCAqIDIgJiYgaSA8IGRpZmYubGVuZ3RoIC0gMikge1xuICAgICAgICAgICAgLy8gT3ZlcmxhcHBpbmdcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjb250ZXh0TGluZXMobGluZXMpKSB7XG4gICAgICAgICAgICAgIGN1clJhbmdlLnB1c2gobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgICAgbGV0IGNvbnRleHRTaXplID0gTWF0aC5taW4obGluZXMubGVuZ3RoLCBvcHRpb25zLmNvbnRleHQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGNvbnRleHRMaW5lcyhsaW5lcy5zbGljZSgwLCBjb250ZXh0U2l6ZSkpKSB7XG4gICAgICAgICAgICAgIGN1clJhbmdlLnB1c2gobGluZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBodW5rID0ge1xuICAgICAgICAgICAgICBvbGRTdGFydDogb2xkUmFuZ2VTdGFydCxcbiAgICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgICAgbmV3U3RhcnQ6IG5ld1JhbmdlU3RhcnQsXG4gICAgICAgICAgICAgIG5ld0xpbmVzOiAobmV3TGluZSAtIG5ld1JhbmdlU3RhcnQgKyBjb250ZXh0U2l6ZSksXG4gICAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh1bmtzLnB1c2goaHVuayk7XG5cbiAgICAgICAgICAgIG9sZFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICAgICAgbmV3UmFuZ2VTdGFydCA9IDA7XG4gICAgICAgICAgICBjdXJSYW5nZSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBlbGltaW5hdGUgdGhlIHRyYWlsaW5nIGBcXG5gIGZyb20gZWFjaCBsaW5lIG9mIGVhY2ggaHVuaywgYW5kLCB3aGVyZSBuZWVkZWQsIGFkZFxuICAgIC8vICAgICAgICAgXCJcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlXCIuXG4gICAgZm9yIChjb25zdCBodW5rIG9mIGh1bmtzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmsubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGh1bmsubGluZXNbaV0uZW5kc1dpdGgoJ1xcbicpKSB7XG4gICAgICAgICAgaHVuay5saW5lc1tpXSA9IGh1bmsubGluZXNbaV0uc2xpY2UoMCwgLTEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGh1bmsubGluZXMuc3BsaWNlKGkgKyAxLCAwLCAnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG4gICAgICAgICAgaSsrOyAvLyBTa2lwIHRoZSBsaW5lIHdlIGp1c3QgYWRkZWQsIHRoZW4gY29udGludWUgaXRlcmF0aW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb2xkRmlsZU5hbWU6IG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZTogbmV3RmlsZU5hbWUsXG4gICAgICBvbGRIZWFkZXI6IG9sZEhlYWRlciwgbmV3SGVhZGVyOiBuZXdIZWFkZXIsXG4gICAgICBodW5rczogaHVua3NcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQYXRjaChkaWZmKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRpZmYpKSB7XG4gICAgcmV0dXJuIGRpZmYubWFwKGZvcm1hdFBhdGNoKS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGNvbnN0IHJldCA9IFtdO1xuICBpZiAoZGlmZi5vbGRGaWxlTmFtZSA9PSBkaWZmLm5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgZGlmZi5vbGRGaWxlTmFtZSk7XG4gIH1cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGh1bmsgPSBkaWZmLmh1bmtzW2ldO1xuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0IC09IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuICAgIHJldC5wdXNoKFxuICAgICAgJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXNcbiAgICAgICsgJyArJyArIGh1bmsubmV3U3RhcnQgKyAnLCcgKyBodW5rLm5ld0xpbmVzXG4gICAgICArICcgQEAnXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgaHVuay5saW5lcykge1xuICAgICAgcmV0LnB1c2gobGluZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRpb25zID0ge2NhbGxiYWNrOiBvcHRpb25zfTtcbiAgfVxuXG4gIGlmICghb3B0aW9ucz8uY2FsbGJhY2spIHtcbiAgICBjb25zdCBwYXRjaE9iaiA9IHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucyk7XG4gICAgaWYgKCFwYXRjaE9iaikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybWF0UGF0Y2gocGF0Y2hPYmopO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHtjYWxsYmFja30gPSBvcHRpb25zO1xuICAgIHN0cnVjdHVyZWRQYXRjaChcbiAgICAgIG9sZEZpbGVOYW1lLFxuICAgICAgbmV3RmlsZU5hbWUsXG4gICAgICBvbGRTdHIsXG4gICAgICBuZXdTdHIsXG4gICAgICBvbGRIZWFkZXIsXG4gICAgICBuZXdIZWFkZXIsXG4gICAgICB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGNhbGxiYWNrOiBwYXRjaE9iaiA9PiB7XG4gICAgICAgICAgaWYgKCFwYXRjaE9iaikge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soZm9ybWF0UGF0Y2gocGF0Y2hPYmopKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXRjaChmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBjcmVhdGVUd29GaWxlc1BhdGNoKGZpbGVOYW1lLCBmaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBgdGV4dGAgaW50byBhbiBhcnJheSBvZiBsaW5lcywgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBuZXdsaW5lIGNoYXJhY3RlciAod2hlcmUgcHJlc2VudClcbiAqL1xuZnVuY3Rpb24gc3BsaXRMaW5lcyh0ZXh0KSB7XG4gIGNvbnN0IGhhc1RyYWlsaW5nTmwgPSB0ZXh0LmVuZHNXaXRoKCdcXG4nKTtcbiAgY29uc3QgcmVzdWx0ID0gdGV4dC5zcGxpdCgnXFxuJykubWFwKGxpbmUgPT4gbGluZSArICdcXG4nKTtcbiAgaWYgKGhhc1RyYWlsaW5nTmwpIHtcbiAgICByZXN1bHQucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0LnB1c2gocmVzdWx0LnBvcCgpLnNsaWNlKDAsIC0xKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQXVDLFNBQUFDLFFBQUFDLENBQUEsc0NBQUFELE9BQUEsd0JBQUFFLE1BQUEsdUJBQUFBLE1BQUEsQ0FBQUMsUUFBQSxhQUFBRixDQUFBLGtCQUFBQSxDQUFBLGdCQUFBQSxDQUFBLFdBQUFBLENBQUEseUJBQUFDLE1BQUEsSUFBQUQsQ0FBQSxDQUFBRyxXQUFBLEtBQUFGLE1BQUEsSUFBQUQsQ0FBQSxLQUFBQyxNQUFBLENBQUFHLFNBQUEscUJBQUFKLENBQUEsS0FBQUQsT0FBQSxDQUFBQyxDQUFB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