UNPKG

@circuitly/diff

Version:

A javascript text diff implementation.

135 lines (124 loc) 16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parsePatch = parsePatch; function parsePatch(uniDiff) { var diffstr = uniDiff.split(/\n/), list = [], i = 0; function parseIndex() { var index = {}; list.push(index); // Parse diff metadata while (i < diffstr.length) { var line = diffstr[i]; // File header found, end parsing diff metadata if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { break; } // Diff index var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); if (header) { index.index = header[1]; } i++; } // Parse file headers if they are defined. Unified diff requires them, but // there's no technical issues to have an isolated hunk without file header parseFileHeader(index); parseFileHeader(index); // Parse hunks index.hunks = []; while (i < diffstr.length) { var _line = diffstr[i]; if (/^(Index:\s|diff\s|\-\-\-\s|\+\+\+\s|===================================================================)/.test(_line)) { break; } else if (/^@@/.test(_line)) { index.hunks.push(parseHunk()); } else if (_line) { throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line)); } else { i++; } } } // Parses the --- and +++ headers, if none are found, no lines // are consumed. function parseFileHeader(index) { var fileHeader = /^(---|\+\+\+)\s+(.*)\r?$/.exec(diffstr[i]); if (fileHeader) { var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new'; var data = fileHeader[2].split('\t', 2); var fileName = data[0].replace(/\\\\/g, '\\'); if (/^".*"$/.test(fileName)) { fileName = fileName.substr(1, fileName.length - 2); } index[keyPrefix + 'FileName'] = fileName; index[keyPrefix + 'Header'] = (data[1] || '').trim(); i++; } } // Parses a hunk // This assumes that we are at the start of a hunk. function parseHunk() { var chunkHeaderIndex = i, chunkHeaderLine = diffstr[i++], chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); var hunk = { oldStart: +chunkHeader[1], oldLines: typeof chunkHeader[2] === 'undefined' ? 1 : +chunkHeader[2], newStart: +chunkHeader[3], newLines: typeof chunkHeader[4] === 'undefined' ? 1 : +chunkHeader[4], lines: [] }; // 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; } var addCount = 0, removeCount = 0; for (; i < diffstr.length && (removeCount < hunk.oldLines || addCount < hunk.newLines || (_diffstr$i = diffstr[i]) !== null && _diffstr$i !== void 0 && _diffstr$i.startsWith('\\')); i++) { var _diffstr$i; var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0]; if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') { hunk.lines.push(diffstr[i]); if (operation === '+') { addCount++; } else if (operation === '-') { removeCount++; } else if (operation === ' ') { addCount++; removeCount++; } } else { throw new Error("Hunk at line ".concat(chunkHeaderIndex + 1, " contained invalid line ").concat(diffstr[i])); } } // Handle the empty block count case if (!addCount && hunk.newLines === 1) { hunk.newLines = 0; } if (!removeCount && hunk.oldLines === 1) { hunk.oldLines = 0; } // Perform sanity checking if (addCount !== hunk.newLines) { throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); } if (removeCount !== hunk.oldLines) { throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); } return hunk; } while (i < diffstr.length) { parseIndex(); } return list; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZVBhdGNoIiwidW5pRGlmZiIsImRpZmZzdHIiLCJzcGxpdCIsImxpc3QiLCJpIiwicGFyc2VJbmRleCIsImluZGV4IiwicHVzaCIsImxlbmd0aCIsImxpbmUiLCJ0ZXN0IiwiaGVhZGVyIiwiZXhlYyIsInBhcnNlRmlsZUhlYWRlciIsImh1bmtzIiwicGFyc2VIdW5rIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiZmlsZUhlYWRlciIsImtleVByZWZpeCIsImRhdGEiLCJmaWxlTmFtZSIsInJlcGxhY2UiLCJzdWJzdHIiLCJ0cmltIiwiY2h1bmtIZWFkZXJJbmRleCIsImNodW5rSGVhZGVyTGluZSIsImNodW5rSGVhZGVyIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwibGluZXMiLCJhZGRDb3VudCIsInJlbW92ZUNvdW50IiwiX2RpZmZzdHIkaSIsInN0YXJ0c1dpdGgiLCJvcGVyYXRpb24iLCJjb25jYXQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcGF0Y2gvcGFyc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGF0Y2godW5pRGlmZikge1xuICBsZXQgZGlmZnN0ciA9IHVuaURpZmYuc3BsaXQoL1xcbi8pLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICBsZXQgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG4gICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcbiAgICAgIGlmICgoL14oXFwtXFwtXFwtfFxcK1xcK1xcK3xAQClcXHMvKS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBEaWZmIGluZGV4XG4gICAgICBsZXQgaGVhZGVyID0gKC9eKD86SW5kZXg6fGRpZmYoPzogLXIgXFx3KykrKVxccysoLis/KVxccyokLykuZXhlYyhsaW5lKTtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaW5kZXguaW5kZXggPSBoZWFkZXJbMV07XG4gICAgICB9XG5cbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBmaWxlIGhlYWRlcnMgaWYgdGhleSBhcmUgZGVmaW5lZC4gVW5pZmllZCBkaWZmIHJlcXVpcmVzIHRoZW0sIGJ1dFxuICAgIC8vIHRoZXJlJ3Mgbm8gdGVjaG5pY2FsIGlzc3VlcyB0byBoYXZlIGFuIGlzb2xhdGVkIGh1bmsgd2l0aG91dCBmaWxlIGhlYWRlclxuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG4gICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcblxuICAgIC8vIFBhcnNlIGh1bmtzXG4gICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcbiAgICAgIGlmICgoL14oSW5kZXg6XFxzfGRpZmZcXHN8XFwtXFwtXFwtXFxzfFxcK1xcK1xcK1xcc3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KS8pLnRlc3QobGluZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKCgvXkBALykudGVzdChsaW5lKSkge1xuICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcbiAgICAgIH0gZWxzZSBpZiAobGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KGxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAvLyBhcmUgY29uc3VtZWQuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIGNvbnN0IGZpbGVIZWFkZXIgPSAoL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKVxccj8kLykuZXhlYyhkaWZmc3RyW2ldKTtcbiAgICBpZiAoZmlsZUhlYWRlcikge1xuICAgICAgbGV0IGtleVByZWZpeCA9IGZpbGVIZWFkZXJbMV0gPT09ICctLS0nID8gJ29sZCcgOiAnbmV3JztcbiAgICAgIGNvbnN0IGRhdGEgPSBmaWxlSGVhZGVyWzJdLnNwbGl0KCdcXHQnLCAyKTtcbiAgICAgIGxldCBmaWxlTmFtZSA9IGRhdGFbMF0ucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKTtcbiAgICAgIGlmICgoL15cIi4qXCIkLykudGVzdChmaWxlTmFtZSkpIHtcbiAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHIoMSwgZmlsZU5hbWUubGVuZ3RoIC0gMik7XG4gICAgICB9XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnRmlsZU5hbWUnXSA9IGZpbGVOYW1lO1xuICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0hlYWRlciddID0gKGRhdGFbMV0gfHwgJycpLnRyaW0oKTtcblxuICAgICAgaSsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlcyBhIGh1bmtcbiAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiBhIGh1bmsuXG4gIGZ1bmN0aW9uIHBhcnNlSHVuaygpIHtcbiAgICBsZXQgY2h1bmtIZWFkZXJJbmRleCA9IGksXG4gICAgICAgIGNodW5rSGVhZGVyTGluZSA9IGRpZmZzdHJbaSsrXSxcbiAgICAgICAgY2h1bmtIZWFkZXIgPSBjaHVua0hlYWRlckxpbmUuc3BsaXQoL0BAIC0oXFxkKykoPzosKFxcZCspKT8gXFwrKFxcZCspKD86LChcXGQrKSk/IEBALyk7XG5cbiAgICBsZXQgaHVuayA9IHtcbiAgICAgIG9sZFN0YXJ0OiArY2h1bmtIZWFkZXJbMV0sXG4gICAgICBvbGRMaW5lczogdHlwZW9mIGNodW5rSGVhZGVyWzJdID09PSAndW5kZWZpbmVkJyA/IDEgOiArY2h1bmtIZWFkZXJbMl0sXG4gICAgICBuZXdTdGFydDogK2NodW5rSGVhZGVyWzNdLFxuICAgICAgbmV3TGluZXM6IHR5cGVvZiBjaHVua0hlYWRlcls0XSA9PT0gJ3VuZGVmaW5lZCcgPyAxIDogK2NodW5rSGVhZGVyWzRdLFxuICAgICAgbGluZXM6IFtdXG4gICAgfTtcblxuICAgIC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuICAgIGlmIChodW5rLm9sZExpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm9sZFN0YXJ0ICs9IDE7XG4gICAgfVxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0ICs9IDE7XG4gICAgfVxuXG4gICAgbGV0IGFkZENvdW50ID0gMCxcbiAgICAgICAgcmVtb3ZlQ291bnQgPSAwO1xuICAgIGZvciAoXG4gICAgICA7XG4gICAgICBpIDwgZGlmZnN0ci5sZW5ndGggJiYgKHJlbW92ZUNvdW50IDwgaHVuay5vbGRMaW5lcyB8fCBhZGRDb3VudCA8IGh1bmsubmV3TGluZXMgfHwgZGlmZnN0cltpXT8uc3RhcnRzV2l0aCgnXFxcXCcpKTtcbiAgICAgIGkrK1xuICAgICkge1xuICAgICAgbGV0IG9wZXJhdGlvbiA9IChkaWZmc3RyW2ldLmxlbmd0aCA9PSAwICYmIGkgIT0gKGRpZmZzdHIubGVuZ3RoIC0gMSkpID8gJyAnIDogZGlmZnN0cltpXVswXTtcbiAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJyB8fCBvcGVyYXRpb24gPT09ICctJyB8fCBvcGVyYXRpb24gPT09ICcgJyB8fCBvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBodW5rLmxpbmVzLnB1c2goZGlmZnN0cltpXSk7XG5cbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnICcpIHtcbiAgICAgICAgICBhZGRDb3VudCsrO1xuICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSHVuayBhdCBsaW5lICR7Y2h1bmtIZWFkZXJJbmRleCArIDF9IGNvbnRhaW5lZCBpbnZhbGlkIGxpbmUgJHtkaWZmc3RyW2ldfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgZW1wdHkgYmxvY2sgY291bnQgY2FzZVxuICAgIGlmICghYWRkQ291bnQgJiYgaHVuay5uZXdMaW5lcyA9PT0gMSkge1xuICAgICAgaHVuay5uZXdMaW5lcyA9IDA7XG4gICAgfVxuICAgIGlmICghcmVtb3ZlQ291bnQgJiYgaHVuay5vbGRMaW5lcyA9PT0gMSkge1xuICAgICAgaHVuay5vbGRMaW5lcyA9IDA7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBzYW5pdHkgY2hlY2tpbmdcbiAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWRkZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuICAgIH1cbiAgICBpZiAocmVtb3ZlQ291bnQgIT09IGh1bmsub2xkTGluZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVtb3ZlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh1bms7XG4gIH1cblxuICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgcGFyc2VJbmRleCgpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3Q7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLFNBQVNBLFVBQVVBLENBQUNDLE9BQU8sRUFBRTtFQUNsQyxJQUFJQyxPQUFPLEdBQUdELE9BQU8sQ0FBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQztJQUM3QkMsSUFBSSxHQUFHLEVBQUU7SUFDVEMsQ0FBQyxHQUFHLENBQUM7RUFFVCxTQUFTQyxVQUFVQSxDQUFBLEVBQUc7SUFDcEIsSUFBSUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkSCxJQUFJLENBQUNJLElBQUksQ0FBQ0QsS0FBSyxDQUFDOztJQUVoQjtJQUNBLE9BQU9GLENBQUMsR0FBR0gsT0FBTyxDQUFDTyxNQUFNLEVBQUU7TUFDekIsSUFBSUMsSUFBSSxHQUFHUixPQUFPLENBQUNHLENBQUMsQ0FBQzs7TUFFckI7TUFDQSxJQUFLLHVCQUF1QixDQUFFTSxJQUFJLENBQUNELElBQUksQ0FBQyxFQUFFO1FBQ3hDO01BQ0Y7O01BRUE7TUFDQSxJQUFJRSxNQUFNLEdBQUksMENBQTBDLENBQUVDLElBQUksQ0FBQ0gsSUFBSSxDQUFDO01BQ3BFLElBQUlFLE1BQU0sRUFBRTtRQUNWTCxLQUFLLENBQUNBLEtBQUssR0FBR0ssTUFBTSxDQUFDLENBQUMsQ0FBQztNQUN6QjtNQUVBUCxDQUFDLEVBQUU7SUFDTDs7SUFFQTtJQUNBO0lBQ0FTLGVBQWUsQ0FBQ1AsS0FBSyxDQUFDO0lBQ3RCTyxlQUFlLENBQUNQLEtBQUssQ0FBQzs7SUFFdEI7SUFDQUEsS0FBSyxDQUFDUSxLQUFLLEdBQUcsRUFBRTtJQUVoQixPQUFPVixDQUFDLEdBQUdILE9BQU8sQ0FBQ08sTUFBTSxFQUFFO01BQ3pCLElBQUlDLEtBQUksR0FBR1IsT0FBTyxDQUFDRyxDQUFDLENBQUM7TUFDckIsSUFBSywwR0FBMEcsQ0FBRU0sSUFBSSxDQUFDRCxLQUFJLENBQUMsRUFBRTtRQUMzSDtNQUNGLENBQUMsTUFBTSxJQUFLLEtBQUssQ0FBRUMsSUFBSSxDQUFDRCxLQUFJLENBQUMsRUFBRTtRQUM3QkgsS0FBSyxDQUFDUSxLQUFLLENBQUNQLElBQUksQ0FBQ1EsU0FBUyxDQUFDLENBQUMsQ0FBQztNQUMvQixDQUFDLE1BQU0sSUFBSU4sS0FBSSxFQUFFO1FBQ2YsTUFBTSxJQUFJTyxLQUFLLENBQUMsZUFBZSxJQUFJWixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHYSxJQUFJLENBQUNDLFNBQVMsQ0FBQ1QsS0FBSSxDQUFDLENBQUM7TUFDekUsQ0FBQyxNQUFNO1FBQ0xMLENBQUMsRUFBRTtNQUNMO0lBQ0Y7RUFDRjs7RUFFQTtFQUNBO0VBQ0EsU0FBU1MsZUFBZUEsQ0FBQ1AsS0FBSyxFQUFFO0lBQzlCLElBQU1hLFVBQVUsR0FBSSwwQkFBMEIsQ0FBRVAsSUFBSSxDQUFDWCxPQUFPLENBQUNHLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLElBQUllLFVBQVUsRUFBRTtNQUNkLElBQUlDLFNBQVMsR0FBR0QsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSztNQUN2RCxJQUFNRSxJQUFJLEdBQUdGLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ2pCLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO01BQ3pDLElBQUlvQixRQUFRLEdBQUdELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ0UsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7TUFDN0MsSUFBSyxRQUFRLENBQUViLElBQUksQ0FBQ1ksUUFBUSxDQUFDLEVBQUU7UUFDN0JBLFFBQVEsR0FBR0EsUUFBUSxDQUFDRSxNQUFNLENBQUMsQ0FBQyxFQUFFRixRQUFRLENBQUNkLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDcEQ7TUFDQUYsS0FBSyxDQUFDYyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUdFLFFBQVE7TUFDeENoQixLQUFLLENBQUNjLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFSSxJQUFJLENBQUMsQ0FBQztNQUVwRHJCLENBQUMsRUFBRTtJQUNMO0VBQ0Y7O0VBRUE7RUFDQTtFQUNBLFNBQVNXLFNBQVNBLENBQUEsRUFBRztJQUNuQixJQUFJVyxnQkFBZ0IsR0FBR3RCLENBQUM7TUFDcEJ1QixlQUFlLEdBQUcxQixPQUFPLENBQUNHLENBQUMsRUFBRSxDQUFDO01BQzlCd0IsV0FBVyxHQUFHRCxlQUFlLENBQUN6QixLQUFLLENBQUMsNENBQTRDLENBQUM7SUFFckYsSUFBSTJCLElBQUksR0FBRztNQUNUQyxRQUFRLEVBQUUsQ0FBQ0YsV0FBVyxDQUFDLENBQUMsQ0FBQztNQUN6QkcsUUFBUSxFQUFFLE9BQU9ILFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUNBLFdBQVcsQ0FBQyxDQUFDLENBQUM7TUFDckVJLFFBQVEsRUFBRSxDQUFDSixXQUFXLENBQUMsQ0FBQyxDQUFDO01BQ3pCSyxRQUFRLEVBQUUsT0FBT0wsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQ0EsV0FBVyxDQUFDLENBQUMsQ0FBQztNQUNyRU0sS0FBSyxFQUFFO0lBQ1QsQ0FBQzs7SUFFRDtJQUNBO0lBQ0E7SUFDQSxJQUFJTCxJQUFJLENBQUNFLFFBQVEsS0FBSyxDQUFDLEVBQUU7TUFDdkJGLElBQUksQ0FBQ0MsUUFBUSxJQUFJLENBQUM7SUFDcEI7SUFDQSxJQUFJRCxJQUFJLENBQUNJLFFBQVEsS0FBSyxDQUFDLEVBQUU7TUFDdkJKLElBQUksQ0FBQ0csUUFBUSxJQUFJLENBQUM7SUFDcEI7SUFFQSxJQUFJRyxRQUFRLEdBQUcsQ0FBQztNQUNaQyxXQUFXLEdBQUcsQ0FBQztJQUNuQixPQUVFaEMsQ0FBQyxHQUFHSCxPQUFPLENBQUNPLE1BQU0sS0FBSzRCLFdBQVcsR0FBR1AsSUFBSSxDQUFDRSxRQUFRLElBQUlJLFFBQVEsR0FBR04sSUFBSSxDQUFDSSxRQUFRLEtBQUFJLFVBQUEsR0FBSXBDLE9BQU8sQ0FBQ0csQ0FBQyxDQUFDLGNBQUFpQyxVQUFBLGVBQVZBLFVBQUEsQ0FBWUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQy9HbEMsQ0FBQyxFQUFFLEVBQ0g7TUFBQSxJQUFBaUMsVUFBQTtNQUNBLElBQUlFLFNBQVMsR0FBSXRDLE9BQU8sQ0FBQ0csQ0FBQyxDQUFDLENBQUNJLE1BQU0sSUFBSSxDQUFDLElBQUlKLENBQUMsSUFBS0gsT0FBTyxDQUFDTyxNQUFNLEdBQUcsQ0FBRSxHQUFJLEdBQUcsR0FBR1AsT0FBTyxDQUFDRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDM0YsSUFBSW1DLFNBQVMsS0FBSyxHQUFHLElBQUlBLFNBQVMsS0FBSyxHQUFHLElBQUlBLFNBQVMsS0FBSyxHQUFHLElBQUlBLFNBQVMsS0FBSyxJQUFJLEVBQUU7UUFDckZWLElBQUksQ0FBQ0ssS0FBSyxDQUFDM0IsSUFBSSxDQUFDTixPQUFPLENBQUNHLENBQUMsQ0FBQyxDQUFDO1FBRTNCLElBQUltQyxTQUFTLEtBQUssR0FBRyxFQUFFO1VBQ3JCSixRQUFRLEVBQUU7UUFDWixDQUFDLE1BQU0sSUFBSUksU0FBUyxLQUFLLEdBQUcsRUFBRTtVQUM1QkgsV0FBVyxFQUFFO1FBQ2YsQ0FBQyxNQUFNLElBQUlHLFNBQVMsS0FBSyxHQUFHLEVBQUU7VUFDNUJKLFFBQVEsRUFBRTtVQUNWQyxXQUFXLEVBQUU7UUFDZjtNQUNGLENBQUMsTUFBTTtRQUNMLE1BQU0sSUFBSXBCLEtBQUssaUJBQUF3QixNQUFBLENBQWlCZCxnQkFBZ0IsR0FBRyxDQUFDLDhCQUFBYyxNQUFBLENBQTJCdkMsT0FBTyxDQUFDRyxDQUFDLENBQUMsQ0FBRSxDQUFDO01BQzlGO0lBQ0Y7O0lBRUE7SUFDQSxJQUFJLENBQUMrQixRQUFRLElBQUlOLElBQUksQ0FBQ0ksUUFBUSxLQUFLLENBQUMsRUFBRTtNQUNwQ0osSUFBSSxDQUFDSSxRQUFRLEdBQUcsQ0FBQztJQUNuQjtJQUNBLElBQUksQ0FBQ0csV0FBVyxJQUFJUCxJQUFJLENBQUNFLFFBQVEsS0FBSyxDQUFDLEVBQUU7TUFDdkNGLElBQUksQ0FBQ0UsUUFBUSxHQUFHLENBQUM7SUFDbkI7O0lBRUE7SUFDQSxJQUFJSSxRQUFRLEtBQUtOLElBQUksQ0FBQ0ksUUFBUSxFQUFFO01BQzlCLE1BQU0sSUFBSWpCLEtBQUssQ0FBQyxrREFBa0QsSUFBSVUsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDOUY7SUFDQSxJQUFJVSxXQUFXLEtBQUtQLElBQUksQ0FBQ0UsUUFBUSxFQUFFO01BQ2pDLE1BQU0sSUFBSWYsS0FBSyxDQUFDLG9EQUFvRCxJQUFJVSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRztJQUVBLE9BQU9HLElBQUk7RUFDYjtFQUVBLE9BQU96QixDQUFDLEdBQUdILE9BQU8sQ0FBQ08sTUFBTSxFQUFFO0lBQ3pCSCxVQUFVLENBQUMsQ0FBQztFQUNkO0VBRUEsT0FBT0YsSUFBSTtBQUNiIiwiaWdub3JlTGlzdCI6W119