UNPKG

use-travel

Version:

A React hook for state time travel with undo, redo, reset and archive functionalities.

194 lines 33.3 kB
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==