use-travel
Version:
A React hook for state time travel with undo, redo, reset and archive functionalities.
194 lines • 33.3 kB
JavaScript
import { __rest } from "tslib";
import { useCallback, useMemo, useState } from 'react';
import { apply, create, } from 'mutative';
import { useMutative } from 'use-mutative';
/**
* A hook to travel in the history of a state
*/
export const useTravel = (initialState, _options = {}) => {
const { maxHistory = 10, initialPatches, initialPosition = 0, autoArchive = true } = _options, options = __rest(_options, ["maxHistory", "initialPatches", "initialPosition", "autoArchive"]);
const [position, setPosition] = useState(initialPosition);
const [tempPatches, setTempPatches] = useMutative(() => ({
patches: [],
inversePatches: [],
}));
const [allPatches, setAllPatches] = useMutative(() => (initialPatches !== null && initialPatches !== void 0 ? initialPatches : {
patches: [],
inversePatches: [],
}));
const [state, setState] = useState(initialState);
const cachedSetState = useCallback((updater) => {
const [nextState, patches, inversePatches] = (typeof updater === 'function'
? create(state, updater, Object.assign(Object.assign({}, options), { enablePatches: true }))
: create(state, () => updater, Object.assign(Object.assign({}, options), { enablePatches: true })));
setState(nextState);
if (autoArchive) {
setPosition(maxHistory < allPatches.patches.length + 1 ? maxHistory : position + 1);
setAllPatches((allPatchesDraft) => {
const notLast = position < allPatchesDraft.patches.length;
// Remove all patches after the current position
if (notLast) {
allPatchesDraft.patches.splice(position, allPatchesDraft.patches.length - position);
allPatchesDraft.inversePatches.splice(position, allPatchesDraft.inversePatches.length - position);
}
allPatchesDraft.patches.push(patches);
allPatchesDraft.inversePatches.push(inversePatches);
if (maxHistory < allPatchesDraft.patches.length) {
allPatchesDraft.patches = allPatchesDraft.patches.slice(-maxHistory);
allPatchesDraft.inversePatches =
allPatchesDraft.inversePatches.slice(-maxHistory);
}
});
}
else {
const notLast = position <
allPatches.patches.length + Number(!!tempPatches.patches.length);
// Remove all patches after the current position
if (notLast) {
allPatches.patches.splice(position, allPatches.patches.length - position);
allPatches.inversePatches.splice(position, allPatches.inversePatches.length - position);
}
if (!tempPatches.patches.length || notLast) {
setPosition(maxHistory < allPatches.patches.length + 1
? maxHistory
: position + 1);
}
setTempPatches((tempPatchesDraft) => {
if (notLast) {
tempPatchesDraft.patches.length = 0;
tempPatchesDraft.inversePatches.length = 0;
}
tempPatchesDraft.patches.push(patches);
tempPatchesDraft.inversePatches.push(inversePatches);
});
}
}, [allPatches, state, position, setTempPatches]);
const archive = () => {
if (autoArchive) {
console.warn('Auto archive is enabled, no need to archive manually');
return;
}
if (!tempPatches.patches.length)
return;
setAllPatches((allPatchesDraft) => {
// All patches will be merged, it helps to minimize the patch structure
const [, patches, inversePatches] = create(state, (draft) => apply(draft, tempPatches.inversePatches.flat().reverse()), {
enablePatches: true,
});
allPatchesDraft.patches.push(inversePatches);
allPatchesDraft.inversePatches.push(patches);
if (maxHistory < allPatchesDraft.patches.length) {
allPatchesDraft.patches = allPatchesDraft.patches.slice(-maxHistory);
allPatchesDraft.inversePatches = allPatchesDraft.inversePatches.slice(-maxHistory);
}
});
setTempPatches((tempPatchesDraft) => {
tempPatchesDraft.patches.length = 0;
tempPatchesDraft.inversePatches.length = 0;
});
};
const shouldArchive = useMemo(() => !autoArchive && !!tempPatches.patches.length, [tempPatches]);
const _allPatches = useMemo(() => {
let mergedPatches = allPatches;
if (shouldArchive) {
mergedPatches = {
patches: allPatches.patches.concat(),
inversePatches: allPatches.inversePatches.concat(),
};
mergedPatches.patches.push(tempPatches.patches.flat());
mergedPatches.inversePatches.push(tempPatches.inversePatches.flat().reverse());
}
return mergedPatches;
}, [allPatches, tempPatches, shouldArchive]);
const cachedTravels = useMemo(() => {
const go = (nextPosition) => {
const back = nextPosition < position;
if (shouldArchive) {
archive();
}
if (nextPosition > _allPatches.patches.length) {
console.warn(`Can't go forward to position ${nextPosition}`);
nextPosition = _allPatches.patches.length;
}
if (nextPosition < 0) {
console.warn(`Can't go back to position ${nextPosition}`);
nextPosition = 0;
}
if (nextPosition === position)
return;
if (shouldArchive) {
_allPatches.inversePatches.slice(-1)[0].reverse();
}
setState(() => apply(state, back
? _allPatches.inversePatches
.slice(-maxHistory)
.slice(nextPosition)
.flat()
.reverse()
: _allPatches.patches
.slice(-maxHistory)
.slice(position, nextPosition)
.flat()));
setPosition(nextPosition);
};
let cachedHistory;
return {
position,
getHistory: () => {
if (cachedHistory)
return cachedHistory;
cachedHistory = [state];
let currentState = state;
const patches = !autoArchive && _allPatches.patches.length > maxHistory
? _allPatches.patches.slice(_allPatches.patches.length - maxHistory)
: _allPatches.patches;
const inversePatches = !autoArchive && _allPatches.inversePatches.length > maxHistory
? _allPatches.inversePatches.slice(_allPatches.inversePatches.length - maxHistory)
: _allPatches.inversePatches;
for (let i = position; i < patches.length; i++) {
currentState = apply(currentState, patches[i]);
cachedHistory.push(currentState);
}
currentState = state;
for (let i = position - 1; i > -1; i--) {
currentState = apply(currentState, inversePatches[i]);
cachedHistory.unshift(currentState);
}
return cachedHistory;
},
patches: shouldArchive ? _allPatches : allPatches,
back: (amount = 1) => {
go(position - amount);
},
forward: (amount = 1) => {
go(position + amount);
},
reset: () => {
setPosition(initialPosition);
setAllPatches(() => initialPatches !== null && initialPatches !== void 0 ? initialPatches : { patches: [], inversePatches: [] });
setState(() => initialState);
setTempPatches(() => ({ patches: [], inversePatches: [] }));
},
go,
canBack: () => position > 0,
canForward: () => shouldArchive
? position < _allPatches.patches.length - 1
: position < allPatches.patches.length,
canArchive: () => shouldArchive,
archive,
};
}, [
position,
allPatches,
setPosition,
setAllPatches,
setState,
initialState,
state,
tempPatches,
_allPatches,
shouldArchive,
]);
return [state, cachedSetState, cachedTravels];
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN2RCxPQUFPLEVBS0wsS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBeUYzQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUN2QixZQUFlLEVBQ2YsV0FBMEIsRUFBRSxFQUM1QixFQUFFO0lBQ0YsTUFBTSxFQUNKLFVBQVUsR0FBRyxFQUFFLEVBQ2YsY0FBYyxFQUNkLGVBQWUsR0FBRyxDQUFDLEVBQ25CLFdBQVcsR0FBRyxJQUFJLEtBRWhCLFFBQVEsRUFEUCxPQUFPLFVBQ1IsUUFBUSxFQU5OLGtFQU1MLENBQVcsQ0FBQztJQUNiLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEdBQUcsV0FBVyxDQUMvQyxHQUFHLEVBQUUsQ0FDSCxDQUFDO1FBQ0MsT0FBTyxFQUFFLEVBQUU7UUFDWCxjQUFjLEVBQUUsRUFBRTtLQUNELENBQUEsQ0FDdEIsQ0FBQztJQUNGLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsV0FBVyxDQUM3QyxHQUFHLEVBQUUsQ0FDSCxDQUFDLGNBQWMsYUFBZCxjQUFjLGNBQWQsY0FBYyxHQUFJO1FBQ2pCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsY0FBYyxFQUFFLEVBQUU7S0FDbkIsQ0FBa0IsQ0FDdEIsQ0FBQztJQUNGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2pE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RSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEdBQUcsQ0FBQztZQUMzQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQ2YsYUFBYTtnQkFDWCxDQUFDLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQzFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhO1lBQy9CLE9BQU87U0FDUixDQUFDO0lBQ0osQ0FBQyxFQUFFO1FBQ0QsUUFBUTtRQUNSLFVBQVU7UUFDVixXQUFXO1FBQ1gsYUFBYTtRQUNiLFFBQVE7UUFDUixZQUFZO1FBQ1osS0FBSztRQUNMLFdBQVc7UUFDWCxXQUFXO1FBQ1gsYUFBYTtLQUNkLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBb0IsQ0FBQztBQUNuRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICB0eXBlIE9wdGlvbnMgYXMgTXV0YXRpdmVPcHRpb25zLFxuICB0eXBlIFBhdGNoZXMsXG4gIHR5cGUgRHJhZnQsXG4gIHR5cGUgSW1tdXRhYmxlLFxuICBhcHBseSxcbiAgY3JlYXRlLFxufSBmcm9tICdtdXRhdGl2ZSc7XG5pbXBvcnQgeyB1c2VNdXRhdGl2ZSB9IGZyb20gJ3VzZS1tdXRhdGl2ZSc7XG5cbnR5cGUgVHJhdmVsUGF0Y2hlcyA9IHtcbiAgcGF0Y2hlczogUGF0Y2hlc1tdO1xuICBpbnZlcnNlUGF0Y2hlczogUGF0Y2hlc1tdO1xufTtcblxudHlwZSBPcHRpb25zPEYgZXh0ZW5kcyBib29sZWFuLCBBIGV4dGVuZHMgYm9vbGVhbj4gPSB7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaGlzdG9yeSB0byBrZWVwLCBieSBkZWZhdWx0IGAxMGBcbiAgICovXG4gIG1heEhpc3Rvcnk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB0aGUgaGlzdG9yeSwgYnkgZGVmYXVsdCBgMGBcbiAgICovXG4gIGluaXRpYWxQb3NpdGlvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHBhdGNoZXMgb2YgdGhlIGhpc3RvcnlcbiAgICovXG4gIGluaXRpYWxQYXRjaGVzPzogVHJhdmVsUGF0Y2hlcztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBhcmNoaXZlIHRoZSBjdXJyZW50IHN0YXRlLCBieSBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgYXV0b0FyY2hpdmU/OiBBO1xufSAmIE9taXQ8TXV0YXRpdmVPcHRpb25zPHRydWUsIEY+LCAnZW5hYmxlUGF0Y2hlcyc+O1xuXG50eXBlIEluaXRpYWxWYWx1ZTxJIGV4dGVuZHMgYW55PiA9IEkgZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBpbmZlciBSID8gUiA6IEk7XG50eXBlIERyYWZ0RnVuY3Rpb248Uz4gPSAoZHJhZnQ6IERyYWZ0PFM+KSA9PiB2b2lkO1xudHlwZSBVcGRhdGVyPFM+ID0gKHZhbHVlOiBTIHwgKCgpID0+IFMpIHwgRHJhZnRGdW5jdGlvbjxTPikgPT4gdm9pZDtcbnR5cGUgVmFsdWU8UywgRiBleHRlbmRzIGJvb2xlYW4+ID0gRiBleHRlbmRzIHRydWVcbiAgPyBJbW11dGFibGU8SW5pdGlhbFZhbHVlPFM+PlxuICA6IEluaXRpYWxWYWx1ZTxTPjtcblxuaW50ZXJmYWNlIENvbnRyb2xzPFMsIEYgZXh0ZW5kcyBib29sZWFuPiB7XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaGlzdG9yeVxuICAgKi9cbiAgcG9zaXRpb246IG51bWJlcjtcbiAgLyoqXG4gICAqIEdldCB0aGUgaGlzdG9yeSBvZiB0aGUgc3RhdGVcbiAgICovXG4gIGdldEhpc3Rvcnk6ICgpID0+IFZhbHVlPFMsIEY+W107XG4gIC8qKlxuICAgKiBUaGUgcGF0Y2hlcyBvZiB0aGUgaGlzdG9yeVxuICAgKi9cbiAgcGF0Y2hlczogVHJhdmVsUGF0Y2hlcztcbiAgLyoqXG4gICAqIEdvIGJhY2sgaW4gdGhlIGhpc3RvcnlcbiAgICovXG4gIGJhY2s6IChhbW91bnQ/OiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBHbyBmb3J3YXJkIGluIHRoZSBoaXN0b3J5XG4gICAqL1xuICBmb3J3YXJkOiAoYW1vdW50PzogbnVtYmVyKSA9PiB2b2lkO1xuICAvKipcbiAgICogUmVzZXQgdGhlIGhpc3RvcnlcbiAgICovXG4gIHJlc2V0OiAoKSA9PiB2b2lkO1xuICAvKipcbiAgICogR28gdG8gYSBzcGVjaWZpYyBwb3NpdGlvbiBpbiB0aGUgaGlzdG9yeVxuICAgKi9cbiAgZ286IChwb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSB0byBnbyBiYWNrXG4gICAqL1xuICBjYW5CYWNrOiAoKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogQ2hlY2sgaWYgaXQncyBwb3NzaWJsZSB0byBnbyBmb3J3YXJkXG4gICAqL1xuICBjYW5Gb3J3YXJkOiAoKSA9PiBib29sZWFuO1xufVxuXG50eXBlIFJlc3VsdDxTLCBGIGV4dGVuZHMgYm9vbGVhbiwgQSBleHRlbmRzIGJvb2xlYW4+ID0gW1xuICBWYWx1ZTxTLCBGPixcbiAgVXBkYXRlcjxJbml0aWFsVmFsdWU8Uz4+LFxuICBBIGV4dGVuZHMgZmFsc2VcbiAgICA/IENvbnRyb2xzPFMsIEY+ICYge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJjaGl2ZSB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgYXJjaGl2ZTogKCkgPT4gdm9pZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIGlmIGl0J3MgcG9zc2libGUgdG8gYXJjaGl2ZSB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgY2FuQXJjaGl2ZTogKCkgPT4gYm9vbGVhbjtcbiAgICAgIH1cbiAgICA6IENvbnRyb2xzPFMsIEY+XG5dO1xuXG4vKipcbiAqIEEgaG9vayB0byB0cmF2ZWwgaW4gdGhlIGhpc3Rvcnkgb2YgYSBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgdXNlVHJhdmVsID0gPFMsIEYgZXh0ZW5kcyBib29sZWFuLCBBIGV4dGVuZHMgYm9vbGVhbj4oXG4gIGluaXRpYWxTdGF0ZTogUyxcbiAgX29wdGlvbnM6IE9wdGlvbnM8RiwgQT4gPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBtYXhIaXN0b3J5ID0gMTAsXG4gICAgaW5pdGlhbFBhdGNoZXMsXG4gICAgaW5pdGlhbFBvc2l0aW9uID0gMCxcbiAgICBhdXRvQXJjaGl2ZSA9IHRydWUsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gX29wdGlvbnM7XG4gIGNvbnN0IFtwb3NpdGlvbiwgc2V0UG9zaXRpb25dID0gdXNlU3RhdGUoaW5pdGlhbFBvc2l0aW9uKTtcbiAgY29uc3QgW3RlbXBQYXRjaGVzLCBzZXRUZW1wUGF0Y2hlc10gPSB1c2VNdXRhdGl2ZShcbiAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgcGF0Y2hlczogW10sXG4gICAgICAgIGludmVyc2VQYXRjaGVzOiBbXSxcbiAgICAgIH0gYXMgVHJhdmVsUGF0Y2hlcylcbiAgKTtcbiAgY29uc3QgW2FsbFBhdGNoZXMsIHNldEFsbFBhdGNoZXNdID0gdXNlTXV0YXRpdmUoXG4gICAgKCkgPT5cbiAgICAgIChpbml0aWFsUGF0Y2hlcyA/PyB7XG4gICAgICAgIHBhdGNoZXM6IFtdLFxuICAgICAgICBpbnZlcnNlUGF0Y2hlczogW10sXG4gICAgICB9KSBhcyBUcmF2ZWxQYXRjaGVzXG4gICk7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgY29uc3QgY2FjaGVkU2V0U3RhdGUgPSB1c2VDYWxsYmFjayhcbiAgICAodXBkYXRlcjogYW55KSA9PiB7XG4gICAgICBjb25zdCBbbmV4dFN0YXRlLCBwYXRjaGVzLCBpbnZlcnNlUGF0Y2hlc10gPSAoXG4gICAgICAgIHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyBjcmVhdGUoc3RhdGUsIHVwZGF0ZXIsIHsgLi4ub3B0aW9ucywgZW5hYmxlUGF0Y2hlczogdHJ1ZSB9KVxuICAgICAgICAgIDogY3JlYXRlKHN0YXRlLCAoKSA9PiB1cGRhdGVyLCB7IC4uLm9wdGlvbnMsIGVuYWJsZVBhdGNoZXM6IHRydWUgfSlcbiAgICAgICkgYXMgW1MsIFBhdGNoZXM8dHJ1ZT4sIFBhdGNoZXM8dHJ1ZT5dO1xuICAgICAgc2V0U3RhdGUobmV4dFN0YXRlKTtcbiAgICAgIGlmIChhdXRvQXJjaGl2ZSkge1xuICAgICAgICBzZXRQb3NpdGlvbihcbiAgICAgICAgICBtYXhIaXN0b3J5IDwgYWxsUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCArIDEgPyBtYXhIaXN0b3J5IDogcG9zaXRpb24gKyAxXG4gICAgICAgICk7XG4gICAgICAgIHNldEFsbFBhdGNoZXMoKGFsbFBhdGNoZXNEcmFmdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vdExhc3QgPSBwb3NpdGlvbiA8IGFsbFBhdGNoZXNEcmFmdC5wYXRjaGVzLmxlbmd0aDtcbiAgICAgICAgICAvLyBSZW1vdmUgYWxsIHBhdGNoZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgICAgICBpZiAobm90TGFzdCkge1xuICAgICAgICAgICAgYWxsUGF0Y2hlc0RyYWZ0LnBhdGNoZXMuc3BsaWNlKFxuICAgICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgICAgYWxsUGF0Y2hlc0RyYWZ0LnBhdGNoZXMubGVuZ3RoIC0gcG9zaXRpb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhbGxQYXRjaGVzRHJhZnQuaW52ZXJzZVBhdGNoZXMuc3BsaWNlKFxuICAgICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgICAgYWxsUGF0Y2hlc0RyYWZ0LmludmVyc2VQYXRjaGVzLmxlbmd0aCAtIHBvc2l0aW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhbGxQYXRjaGVzRHJhZnQucGF0Y2hlcy5wdXNoKHBhdGNoZXMpO1xuICAgICAgICAgIGFsbFBhdGNoZXNEcmFmdC5pbnZlcnNlUGF0Y2hlcy5wdXNoKGludmVyc2VQYXRjaGVzKTtcbiAgICAgICAgICBpZiAobWF4SGlzdG9yeSA8IGFsbFBhdGNoZXNEcmFmdC5wYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgYWxsUGF0Y2hlc0RyYWZ0LnBhdGNoZXMgPSBhbGxQYXRjaGVzRHJhZnQucGF0Y2hlcy5zbGljZShcbiAgICAgICAgICAgICAgLW1heEhpc3RvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhbGxQYXRjaGVzRHJhZnQuaW52ZXJzZVBhdGNoZXMgPVxuICAgICAgICAgICAgICBhbGxQYXRjaGVzRHJhZnQuaW52ZXJzZVBhdGNoZXMuc2xpY2UoLW1heEhpc3RvcnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBub3RMYXN0ID1cbiAgICAgICAgICBwb3NpdGlvbiA8XG4gICAgICAgICAgYWxsUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCArIE51bWJlcighIXRlbXBQYXRjaGVzLnBhdGNoZXMubGVuZ3RoKTtcbiAgICAgICAgLy8gUmVtb3ZlIGFsbCBwYXRjaGVzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICAgIGlmIChub3RMYXN0KSB7XG4gICAgICAgICAgYWxsUGF0Y2hlcy5wYXRjaGVzLnNwbGljZShcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgYWxsUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCAtIHBvc2l0aW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzLnNwbGljZShcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgYWxsUGF0Y2hlcy5pbnZlcnNlUGF0Y2hlcy5sZW5ndGggLSBwb3NpdGlvblxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0ZW1wUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCB8fCBub3RMYXN0KSB7XG4gICAgICAgICAgc2V0UG9zaXRpb24oXG4gICAgICAgICAgICBtYXhIaXN0b3J5IDwgYWxsUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgPyBtYXhIaXN0b3J5XG4gICAgICAgICAgICAgIDogcG9zaXRpb24gKyAxXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUZW1wUGF0Y2hlcygodGVtcFBhdGNoZXNEcmFmdCkgPT4ge1xuICAgICAgICAgIGlmIChub3RMYXN0KSB7XG4gICAgICAgICAgICB0ZW1wUGF0Y2hlc0RyYWZ0LnBhdGNoZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIHRlbXBQYXRjaGVzRHJhZnQuaW52ZXJzZVBhdGNoZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGVtcFBhdGNoZXNEcmFmdC5wYXRjaGVzLnB1c2gocGF0Y2hlcyk7XG4gICAgICAgICAgdGVtcFBhdGNoZXNEcmFmdC5pbnZlcnNlUGF0Y2hlcy5wdXNoKGludmVyc2VQYXRjaGVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWxsUGF0Y2hlcywgc3RhdGUsIHBvc2l0aW9uLCBzZXRUZW1wUGF0Y2hlc11cbiAgKTtcbiAgY29uc3QgYXJjaGl2ZSA9ICgpID0+IHtcbiAgICBpZiAoYXV0b0FyY2hpdmUpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXV0byBhcmNoaXZlIGlzIGVuYWJsZWQsIG5vIG5lZWQgdG8gYXJjaGl2ZSBtYW51YWxseScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRlbXBQYXRjaGVzLnBhdGNoZXMubGVuZ3RoKSByZXR1cm47XG4gICAgc2V0QWxsUGF0Y2hlcygoYWxsUGF0Y2hlc0RyYWZ0KSA9PiB7XG4gICAgICAvLyBBbGwgcGF0Y2hlcyB3aWxsIGJlIG1lcmdlZCwgaXQgaGVscHMgdG8gbWluaW1pemUgdGhlIHBhdGNoIHN0cnVjdHVyZVxuICAgICAgY29uc3QgWywgcGF0Y2hlcywgaW52ZXJzZVBhdGNoZXNdID0gY3JlYXRlKFxuICAgICAgICBzdGF0ZSBhcyBvYmplY3QsXG4gICAgICAgIChkcmFmdCkgPT4gYXBwbHkoZHJhZnQsIHRlbXBQYXRjaGVzLmludmVyc2VQYXRjaGVzLmZsYXQoKS5yZXZlcnNlKCkpLFxuICAgICAgICB7XG4gICAgICAgICAgZW5hYmxlUGF0Y2hlczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGFsbFBhdGNoZXNEcmFmdC5wYXRjaGVzLnB1c2goaW52ZXJzZVBhdGNoZXMpO1xuICAgICAgYWxsUGF0Y2hlc0RyYWZ0LmludmVyc2VQYXRjaGVzLnB1c2gocGF0Y2hlcyk7XG4gICAgICBpZiAobWF4SGlzdG9yeSA8IGFsbFBhdGNoZXNEcmFmdC5wYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICBhbGxQYXRjaGVzRHJhZnQucGF0Y2hlcyA9IGFsbFBhdGNoZXNEcmFmdC5wYXRjaGVzLnNsaWNlKC1tYXhIaXN0b3J5KTtcbiAgICAgICAgYWxsUGF0Y2hlc0RyYWZ0LmludmVyc2VQYXRjaGVzID0gYWxsUGF0Y2hlc0RyYWZ0LmludmVyc2VQYXRjaGVzLnNsaWNlKFxuICAgICAgICAgIC1tYXhIaXN0b3J5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgc2V0VGVtcFBhdGNoZXMoKHRlbXBQYXRjaGVzRHJhZnQpID0+IHtcbiAgICAgIHRlbXBQYXRjaGVzRHJhZnQucGF0Y2hlcy5sZW5ndGggPSAwO1xuICAgICAgdGVtcFBhdGNoZXNEcmFmdC5pbnZlcnNlUGF0Y2hlcy5sZW5ndGggPSAwO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBzaG91bGRBcmNoaXZlID0gdXNlTWVtbyhcbiAgICAoKSA9PiAhYXV0b0FyY2hpdmUgJiYgISF0ZW1wUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCxcbiAgICBbdGVtcFBhdGNoZXNdXG4gICk7XG4gIGNvbnN0IF9hbGxQYXRjaGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IG1lcmdlZFBhdGNoZXMgPSBhbGxQYXRjaGVzO1xuICAgIGlmIChzaG91bGRBcmNoaXZlKSB7XG4gICAgICBtZXJnZWRQYXRjaGVzID0ge1xuICAgICAgICBwYXRjaGVzOiBhbGxQYXRjaGVzLnBhdGNoZXMuY29uY2F0KCksXG4gICAgICAgIGludmVyc2VQYXRjaGVzOiBhbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzLmNvbmNhdCgpLFxuICAgICAgfTtcbiAgICAgIG1lcmdlZFBhdGNoZXMucGF0Y2hlcy5wdXNoKHRlbXBQYXRjaGVzLnBhdGNoZXMuZmxhdCgpKTtcbiAgICAgIG1lcmdlZFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMucHVzaChcbiAgICAgICAgdGVtcFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMuZmxhdCgpLnJldmVyc2UoKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFBhdGNoZXM7XG4gIH0sIFthbGxQYXRjaGVzLCB0ZW1wUGF0Y2hlcywgc2hvdWxkQXJjaGl2ZV0pO1xuXG4gIGNvbnN0IGNhY2hlZFRyYXZlbHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBnbyA9IChuZXh0UG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgYmFjayA9IG5leHRQb3NpdGlvbiA8IHBvc2l0aW9uO1xuICAgICAgaWYgKHNob3VsZEFyY2hpdmUpIHtcbiAgICAgICAgYXJjaGl2ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKG5leHRQb3NpdGlvbiA+IF9hbGxQYXRjaGVzLnBhdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ2FuJ3QgZ28gZm9yd2FyZCB0byBwb3NpdGlvbiAke25leHRQb3NpdGlvbn1gKTtcbiAgICAgICAgbmV4dFBvc2l0aW9uID0gX2FsbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAobmV4dFBvc2l0aW9uIDwgMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYENhbid0IGdvIGJhY2sgdG8gcG9zaXRpb24gJHtuZXh0UG9zaXRpb259YCk7XG4gICAgICAgIG5leHRQb3NpdGlvbiA9IDA7XG4gICAgICB9XG4gICAgICBpZiAobmV4dFBvc2l0aW9uID09PSBwb3NpdGlvbikgcmV0dXJuO1xuICAgICAgaWYgKHNob3VsZEFyY2hpdmUpIHtcbiAgICAgICAgX2FsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMuc2xpY2UoLTEpWzBdLnJldmVyc2UoKTtcbiAgICAgIH1cbiAgICAgIHNldFN0YXRlKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGFwcGx5KFxuICAgICAgICAgICAgc3RhdGUgYXMgb2JqZWN0LFxuICAgICAgICAgICAgYmFja1xuICAgICAgICAgICAgICA/IF9hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzXG4gICAgICAgICAgICAgICAgICAuc2xpY2UoLW1heEhpc3RvcnkpXG4gICAgICAgICAgICAgICAgICAuc2xpY2UobmV4dFBvc2l0aW9uKVxuICAgICAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgICA6IF9hbGxQYXRjaGVzLnBhdGNoZXNcbiAgICAgICAgICAgICAgICAgIC5zbGljZSgtbWF4SGlzdG9yeSlcbiAgICAgICAgICAgICAgICAgIC5zbGljZShwb3NpdGlvbiwgbmV4dFBvc2l0aW9uKVxuICAgICAgICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICkgYXMgU1xuICAgICAgKTtcbiAgICAgIHNldFBvc2l0aW9uKG5leHRQb3NpdGlvbik7XG4gICAgfTtcbiAgICBsZXQgY2FjaGVkSGlzdG9yeTogU1tdO1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbixcbiAgICAgIGdldEhpc3Rvcnk6ICgpID0+IHtcbiAgICAgICAgaWYgKGNhY2hlZEhpc3RvcnkpIHJldHVybiBjYWNoZWRIaXN0b3J5O1xuICAgICAgICBjYWNoZWRIaXN0b3J5ID0gW3N0YXRlXTtcbiAgICAgICAgbGV0IGN1cnJlbnRTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBjb25zdCBwYXRjaGVzID1cbiAgICAgICAgICAhYXV0b0FyY2hpdmUgJiYgX2FsbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGggPiBtYXhIaXN0b3J5XG4gICAgICAgICAgICA/IF9hbGxQYXRjaGVzLnBhdGNoZXMuc2xpY2UoX2FsbFBhdGNoZXMucGF0Y2hlcy5sZW5ndGggLSBtYXhIaXN0b3J5KVxuICAgICAgICAgICAgOiBfYWxsUGF0Y2hlcy5wYXRjaGVzO1xuICAgICAgICBjb25zdCBpbnZlcnNlUGF0Y2hlcyA9XG4gICAgICAgICAgIWF1dG9BcmNoaXZlICYmIF9hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzLmxlbmd0aCA+IG1heEhpc3RvcnlcbiAgICAgICAgICAgID8gX2FsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMuc2xpY2UoXG4gICAgICAgICAgICAgICAgX2FsbFBhdGNoZXMuaW52ZXJzZVBhdGNoZXMubGVuZ3RoIC0gbWF4SGlzdG9yeVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IF9hbGxQYXRjaGVzLmludmVyc2VQYXRjaGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gcG9zaXRpb247IGkgPCBwYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY3VycmVudFN0YXRlID0gYXBwbHkoY3VycmVudFN0YXRlIGFzIG9iamVjdCwgcGF0Y2hlc1tpXSkgYXMgUztcbiAgICAgICAgICBjYWNoZWRIaXN0b3J5LnB1c2goY3VycmVudFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHBvc2l0aW9uIC0gMTsgaSA+IC0xOyBpLS0pIHtcbiAgICAgICAgICBjdXJyZW50U3RhdGUgPSBhcHBseShjdXJyZW50U3RhdGUgYXMgb2JqZWN0LCBpbnZlcnNlUGF0Y2hlc1tpXSkgYXMgUztcbiAgICAgICAgICBjYWNoZWRIaXN0b3J5LnVuc2hpZnQoY3VycmVudFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGVkSGlzdG9yeTtcbiAgICAgIH0sXG4gICAgICBwYXRjaGVzOiBzaG91bGRBcmNoaXZlID8gX2FsbFBhdGNoZXMgOiBhbGxQYXRjaGVzLFxuICAgICAgYmFjazogKGFtb3VudCA9IDEpID0+IHtcbiAgICAgICAgZ28ocG9zaXRpb24gLSBhbW91bnQpO1xuICAgICAgfSxcbiAgICAgIGZvcndhcmQ6IChhbW91bnQgPSAxKSA9PiB7XG4gICAgICAgIGdvKHBvc2l0aW9uICsgYW1vdW50KTtcbiAgICAgIH0sXG4gICAgICByZXNldDogKCkgPT4ge1xuICAgICAgICBzZXRQb3NpdGlvbihpbml0aWFsUG9zaXRpb24pO1xuICAgICAgICBzZXRBbGxQYXRjaGVzKFxuICAgICAgICAgICgpID0+IGluaXRpYWxQYXRjaGVzID8/IHsgcGF0Y2hlczogW10sIGludmVyc2VQYXRjaGVzOiBbXSB9XG4gICAgICAgICk7XG4gICAgICAgIHNldFN0YXRlKCgpID0+IGluaXRpYWxTdGF0ZSk7XG4gICAgICAgIHNldFRlbXBQYXRjaGVzKCgpID0+ICh7IHBhdGNoZXM6IFtdLCBpbnZlcnNlUGF0Y2hlczogW10gfSkpO1xuICAgICAgfSxcbiAgICAgIGdvLFxuICAgICAgY2FuQmFjazogKCkgPT4gcG9zaXRpb24gPiAwLFxuICAgICAgY2FuRm9yd2FyZDogKCkgPT5cbiAgICAgICAgc2hvdWxkQXJjaGl2ZVxuICAgICAgICAgID8gcG9zaXRpb24gPCBfYWxsUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCAtIDFcbiAgICAgICAgICA6IHBvc2l0aW9uIDwgYWxsUGF0Y2hlcy5wYXRjaGVzLmxlbmd0aCxcbiAgICAgIGNhbkFyY2hpdmU6ICgpID0+IHNob3VsZEFyY2hpdmUsXG4gICAgICBhcmNoaXZlLFxuICAgIH07XG4gIH0sIFtcbiAgICBwb3NpdGlvbixcbiAgICBhbGxQYXRjaGVzLFxuICAgIHNldFBvc2l0aW9uLFxuICAgIHNldEFsbFBhdGNoZXMsXG4gICAgc2V0U3RhdGUsXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIHN0YXRlLFxuICAgIHRlbXBQYXRjaGVzLFxuICAgIF9hbGxQYXRjaGVzLFxuICAgIHNob3VsZEFyY2hpdmUsXG4gIF0pO1xuICByZXR1cm4gW3N0YXRlLCBjYWNoZWRTZXRTdGF0ZSwgY2FjaGVkVHJhdmVsc10gYXMgUmVzdWx0PFMsIEYsIEE+O1xufTtcbiJdfQ==