Best Comic Reader for Google Drive
// ==UserScript== // @name TruyenDrive // @namespace http://tampermonkey.net/ // @version 2.2.0 // @author Zennomi // @description Best Comic Reader for Google Drive // @icon https://zennomi.github.io/truyendrive/icon.webp // @match https://drive.google.com/drive/* // @match https://drive.google.com/file/* // @match https://onedrive.live.com/* // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/system.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/extras/named-register.min.js // @require data:application/javascript,%3B(typeof%20System!%3D'undefined')%26%26(System%3Dnew%20System.constructor())%3B // @license MIT // ==/UserScript== System.register("./__entry.js", [], (function (exports, module) { 'use strict'; return { execute: (function () { function getDefaultExportFromCjs(x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; } var jsxRuntime = { exports: {} }; var reactJsxRuntime_production = {}; var hasRequiredReactJsxRuntime_production; function requireReactJsxRuntime_production() { if (hasRequiredReactJsxRuntime_production) return reactJsxRuntime_production; hasRequiredReactJsxRuntime_production = 1; var REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"); function jsxProd(type, config, maybeKey) { var key = null; void 0 !== maybeKey && (key = "" + maybeKey); void 0 !== config.key && (key = "" + config.key); if ("key" in config) { maybeKey = {}; for (var propName in config) "key" !== propName && (maybeKey[propName] = config[propName]); } else maybeKey = config; config = maybeKey.ref; return { $$typeof: REACT_ELEMENT_TYPE, type, key, ref: void 0 !== config ? config : null, props: maybeKey }; } reactJsxRuntime_production.Fragment = REACT_FRAGMENT_TYPE; reactJsxRuntime_production.jsx = jsxProd; reactJsxRuntime_production.jsxs = jsxProd; return reactJsxRuntime_production; } var hasRequiredJsxRuntime; function requireJsxRuntime() { if (hasRequiredJsxRuntime) return jsxRuntime.exports; hasRequiredJsxRuntime = 1; { jsxRuntime.exports = requireReactJsxRuntime_production(); } return jsxRuntime.exports; } var jsxRuntimeExports = requireJsxRuntime(); var react = { exports: {} }; var react_production = {}; var hasRequiredReact_production; function requireReact_production() { if (hasRequiredReact_production) return react_production; hasRequiredReact_production = 1; var REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"), REACT_ACTIVITY_TYPE = Symbol.for("react.activity"), MAYBE_ITERATOR_SYMBOL = Symbol.iterator; function getIteratorFn(maybeIterable) { if (null === maybeIterable || "object" !== typeof maybeIterable) return null; maybeIterable = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable["@@iterator"]; return "function" === typeof maybeIterable ? maybeIterable : null; } var ReactNoopUpdateQueue = { isMounted: function() { return false; }, enqueueForceUpdate: function() { }, enqueueReplaceState: function() { }, enqueueSetState: function() { } }, assign = Object.assign, emptyObject = {}; function Component(props, context, updater) { this.props = props; this.context = context; this.refs = emptyObject; this.updater = updater || ReactNoopUpdateQueue; } Component.prototype.isReactComponent = {}; Component.prototype.setState = function(partialState, callback) { if ("object" !== typeof partialState && "function" !== typeof partialState && null != partialState) throw Error( "takes an object of state variables to update or a function which returns an object of state variables." ); this.updater.enqueueSetState(this, partialState, callback, "setState"); }; Component.prototype.forceUpdate = function(callback) { this.updater.enqueueForceUpdate(this, callback, "forceUpdate"); }; function ComponentDummy() { } ComponentDummy.prototype = Component.prototype; function PureComponent(props, context, updater) { this.props = props; this.context = context; this.refs = emptyObject; this.updater = updater || ReactNoopUpdateQueue; } var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); pureComponentPrototype.constructor = PureComponent; assign(pureComponentPrototype, Component.prototype); pureComponentPrototype.isPureReactComponent = true; var isArrayImpl = Array.isArray; function noop() { } var ReactSharedInternals = { H: null, A: null, T: null, S: null }, hasOwnProperty = Object.prototype.hasOwnProperty; function ReactElement(type, key, props) { var refProp = props.ref; return { $$typeof: REACT_ELEMENT_TYPE, type, key, ref: void 0 !== refProp ? refProp : null, props }; } function cloneAndReplaceKey(oldElement, newKey) { return ReactElement(oldElement.type, newKey, oldElement.props); } function isValidElement(object) { return "object" === typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE; } function escape(key) { var escaperLookup = { "=": "=0", ":": "=2" }; return "$" + key.replace(/[=:]/g, function(match) { return escaperLookup[match]; }); } var userProvidedKeyEscapeRegex = /\/+/g; function getElementKey(element, index) { return "object" === typeof element && null !== element && null != element.key ? escape("" + element.key) : index.toString(36); } function resolveThenable(thenable) { switch (thenable.status) { case "fulfilled": return thenable.value; case "rejected": throw thenable.reason; default: switch ("string" === typeof thenable.status ? thenable.then(noop, noop) : (thenable.status = "pending", thenable.then( function(fulfilledValue) { "pending" === thenable.status && (thenable.status = "fulfilled", thenable.value = fulfilledValue); }, function(error) { "pending" === thenable.status && (thenable.status = "rejected", thenable.reason = error); } )), thenable.status) { case "fulfilled": return thenable.value; case "rejected": throw thenable.reason; } } throw thenable; } function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { var type = typeof children; if ("undefined" === type || "boolean" === type) children = null; var invokeCallback = false; if (null === children) invokeCallback = true; else switch (type) { case "bigint": case "string": case "number": invokeCallback = true; break; case "object": switch (children.$$typeof) { case REACT_ELEMENT_TYPE: case REACT_PORTAL_TYPE: invokeCallback = true; break; case REACT_LAZY_TYPE: return invokeCallback = children._init, mapIntoArray( invokeCallback(children._payload), array, escapedPrefix, nameSoFar, callback ); } } if (invokeCallback) return callback = callback(children), invokeCallback = "" === nameSoFar ? "." + getElementKey(children, 0) : nameSoFar, isArrayImpl(callback) ? (escapedPrefix = "", null != invokeCallback && (escapedPrefix = invokeCallback.replace(userProvidedKeyEscapeRegex, "$&/") + "/"), mapIntoArray(callback, array, escapedPrefix, "", function(c) { return c; })) : null != callback && (isValidElement(callback) && (callback = cloneAndReplaceKey( callback, escapedPrefix + (null == callback.key || children && children.key === callback.key ? "" : ("" + callback.key).replace( userProvidedKeyEscapeRegex, "$&/" ) + "/") + invokeCallback )), array.push(callback)), 1; invokeCallback = 0; var nextNamePrefix = "" === nameSoFar ? "." : nameSoFar + ":"; if (isArrayImpl(children)) for (var i = 0; i < children.length; i++) nameSoFar = children[i], type = nextNamePrefix + getElementKey(nameSoFar, i), invokeCallback += mapIntoArray( nameSoFar, array, escapedPrefix, type, callback ); else if (i = getIteratorFn(children), "function" === typeof i) for (children = i.call(children), i = 0; !(nameSoFar = children.next()).done; ) nameSoFar = nameSoFar.value, type = nextNamePrefix + getElementKey(nameSoFar, i++), invokeCallback += mapIntoArray( nameSoFar, array, escapedPrefix, type, callback ); else if ("object" === type) { if ("function" === typeof children.then) return mapIntoArray( resolveThenable(children), array, escapedPrefix, nameSoFar, callback ); array = String(children); throw Error( "Objects are not valid as a React child (found: " + ("[object Object]" === array ? "object with keys {" + Object.keys(children).join(", ") + "}" : array) + "). If you meant to render a collection of children, use an array instead." ); } return invokeCallback; } function mapChildren(children, func, context) { if (null == children) return children; var result = [], count = 0; mapIntoArray(children, result, "", "", function(child) { return func.call(context, child, count++); }); return result; } function lazyInitializer(payload) { if (-1 === payload._status) { var ctor = payload._result; ctor = ctor(); ctor.then( function(moduleObject) { if (0 === payload._status || -1 === payload._status) payload._status = 1, payload._result = moduleObject; }, function(error) { if (0 === payload._status || -1 === payload._status) payload._status = 2, payload._result = error; } ); -1 === payload._status && (payload._status = 0, payload._result = ctor); } if (1 === payload._status) return payload._result.default; throw payload._result; } var reportGlobalError = "function" === typeof reportError ? reportError : function(error) { if ("object" === typeof window && "function" === typeof window.ErrorEvent) { var event = new window.ErrorEvent("error", { bubbles: true, cancelable: true, message: "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error), error }); if (!window.dispatchEvent(event)) return; } else if ("object" === typeof process && "function" === typeof process.emit) { process.emit("uncaughtException", error); return; } console.error(error); }, Children = { map: mapChildren, forEach: function(children, forEachFunc, forEachContext) { mapChildren( children, function() { forEachFunc.apply(this, arguments); }, forEachContext ); }, count: function(children) { var n = 0; mapChildren(children, function() { n++; }); return n; }, toArray: function(children) { return mapChildren(children, function(child) { return child; }) || []; }, only: function(children) { if (!isValidElement(children)) throw Error( "React.Children.only expected to receive a single React element child." ); return children; } }; react_production.Activity = REACT_ACTIVITY_TYPE; react_production.Children = Children; react_production.Component = Component; react_production.Fragment = REACT_FRAGMENT_TYPE; react_production.Profiler = REACT_PROFILER_TYPE; react_production.PureComponent = PureComponent; react_production.StrictMode = REACT_STRICT_MODE_TYPE; react_production.Suspense = REACT_SUSPENSE_TYPE; react_production.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE = ReactSharedInternals; react_production.__COMPILER_RUNTIME = { __proto__: null, c: function(size) { return ReactSharedInternals.H.useMemoCache(size); } }; react_production.cache = function(fn) { return function() { return fn.apply(null, arguments); }; }; react_production.cacheSignal = function() { return null; }; react_production.cloneElement = function(element, config, children) { if (null === element || void 0 === element) throw Error( "The argument must be a React element, but you passed " + element + "." ); var props = assign({}, element.props), key = element.key; if (null != config) for (propName in void 0 !== config.key && (key = "" + config.key), config) !hasOwnProperty.call(config, propName) || "key" === propName || "__self" === propName || "__source" === propName || "ref" === propName && void 0 === config.ref || (props[propName] = config[propName]); var propName = arguments.length - 2; if (1 === propName) props.children = children; else if (1 < propName) { for (var childArray = Array(propName), i = 0; i < propName; i++) childArray[i] = arguments[i + 2]; props.children = childArray; } return ReactElement(element.type, key, props); }; react_production.createContext = function(defaultValue) { defaultValue = { $$typeof: REACT_CONTEXT_TYPE, _currentValue: defaultValue, _currentValue2: defaultValue, _threadCount: 0, Provider: null, Consumer: null }; defaultValue.Provider = defaultValue; defaultValue.Consumer = { $$typeof: REACT_CONSUMER_TYPE, _context: defaultValue }; return defaultValue; }; react_production.createElement = function(type, config, children) { var propName, props = {}, key = null; if (null != config) for (propName in void 0 !== config.key && (key = "" + config.key), config) hasOwnProperty.call(config, propName) && "key" !== propName && "__self" !== propName && "__source" !== propName && (props[propName] = config[propName]); var childrenLength = arguments.length - 2; if (1 === childrenLength) props.children = children; else if (1 < childrenLength) { for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++) childArray[i] = arguments[i + 2]; props.children = childArray; } if (type && type.defaultProps) for (propName in childrenLength = type.defaultProps, childrenLength) void 0 === props[propName] && (props[propName] = childrenLength[propName]); return ReactElement(type, key, props); }; react_production.createRef = function() { return { current: null }; }; react_production.forwardRef = function(render) { return { $$typeof: REACT_FORWARD_REF_TYPE, render }; }; react_production.isValidElement = isValidElement; react_production.lazy = function(ctor) { return { $$typeof: REACT_LAZY_TYPE, _payload: { _status: -1, _result: ctor }, _init: lazyInitializer }; }; react_production.memo = function(type, compare) { return { $$typeof: REACT_MEMO_TYPE, type, compare: void 0 === compare ? null : compare }; }; react_production.startTransition = function(scope) { var prevTransition = ReactSharedInternals.T, currentTransition = {}; ReactSharedInternals.T = currentTransition; try { var returnValue = scope(), onStartTransitionFinish = ReactSharedInternals.S; null !== onStartTransitionFinish && onStartTransitionFinish(currentTransition, returnValue); "object" === typeof returnValue && null !== returnValue && "function" === typeof returnValue.then && returnValue.then(noop, reportGlobalError); } catch (error) { reportGlobalError(error); } finally { null !== prevTransition && null !== currentTransition.types && (prevTransition.types = currentTransition.types), ReactSharedInternals.T = prevTransition; } }; react_production.unstable_useCacheRefresh = function() { return ReactSharedInternals.H.useCacheRefresh(); }; react_production.use = function(usable) { return ReactSharedInternals.H.use(usable); }; react_production.useActionState = function(action, initialState, permalink) { return ReactSharedInternals.H.useActionState(action, initialState, permalink); }; react_production.useCallback = function(callback, deps) { return ReactSharedInternals.H.useCallback(callback, deps); }; react_production.useContext = function(Context) { return ReactSharedInternals.H.useContext(Context); }; react_production.useDebugValue = function() { }; react_production.useDeferredValue = function(value, initialValue) { return ReactSharedInternals.H.useDeferredValue(value, initialValue); }; react_production.useEffect = function(create, deps) { return ReactSharedInternals.H.useEffect(create, deps); }; react_production.useEffectEvent = function(callback) { return ReactSharedInternals.H.useEffectEvent(callback); }; react_production.useId = function() { return ReactSharedInternals.H.useId(); }; react_production.useImperativeHandle = function(ref, create, deps) { return ReactSharedInternals.H.useImperativeHandle(ref, create, deps); }; react_production.useInsertionEffect = function(create, deps) { return ReactSharedInternals.H.useInsertionEffect(create, deps); }; react_production.useLayoutEffect = function(create, deps) { return ReactSharedInternals.H.useLayoutEffect(create, deps); }; react_production.useMemo = function(create, deps) { return ReactSharedInternals.H.useMemo(create, deps); }; react_production.useOptimistic = function(passthrough, reducer) { return ReactSharedInternals.H.useOptimistic(passthrough, reducer); }; react_production.useReducer = function(reducer, initialArg, init) { return ReactSharedInternals.H.useReducer(reducer, initialArg, init); }; react_production.useRef = function(initialValue) { return ReactSharedInternals.H.useRef(initialValue); }; react_production.useState = function(initialState) { return ReactSharedInternals.H.useState(initialState); }; react_production.useSyncExternalStore = function(subscribe, getSnapshot, getServerSnapshot) { return ReactSharedInternals.H.useSyncExternalStore( subscribe, getSnapshot, getServerSnapshot ); }; react_production.useTransition = function() { return ReactSharedInternals.H.useTransition(); }; react_production.version = "19.2.5"; return react_production; } var hasRequiredReact; function requireReact() { if (hasRequiredReact) return react.exports; hasRequiredReact = 1; { react.exports = requireReact_production(); } return react.exports; } var reactExports = requireReact(); const React = getDefaultExportFromCjs(reactExports); var client = { exports: {} }; var reactDomClient_production = {}; var scheduler = { exports: {} }; var scheduler_production = {}; var hasRequiredScheduler_production; function requireScheduler_production() { if (hasRequiredScheduler_production) return scheduler_production; hasRequiredScheduler_production = 1; (function(exports$1) { function push(heap, node) { var index = heap.length; heap.push(node); a: for (; 0 < index; ) { var parentIndex = index - 1 >>> 1, parent = heap[parentIndex]; if (0 < compare(parent, node)) heap[parentIndex] = node, heap[index] = parent, index = parentIndex; else break a; } } function peek(heap) { return 0 === heap.length ? null : heap[0]; } function pop(heap) { if (0 === heap.length) return null; var first = heap[0], last = heap.pop(); if (last !== first) { heap[0] = last; a: for (var index = 0, length = heap.length, halfLength = length >>> 1; index < halfLength; ) { var leftIndex = 2 * (index + 1) - 1, left = heap[leftIndex], rightIndex = leftIndex + 1, right = heap[rightIndex]; if (0 > compare(left, last)) rightIndex < length && 0 > compare(right, left) ? (heap[index] = right, heap[rightIndex] = last, index = rightIndex) : (heap[index] = left, heap[leftIndex] = last, index = leftIndex); else if (rightIndex < length && 0 > compare(right, last)) heap[index] = right, heap[rightIndex] = last, index = rightIndex; else break a; } } return first; } function compare(a, b) { var diff = a.sortIndex - b.sortIndex; return 0 !== diff ? diff : a.id - b.id; } exports$1.unstable_now = void 0; if ("object" === typeof performance && "function" === typeof performance.now) { var localPerformance = performance; exports$1.unstable_now = function() { return localPerformance.now(); }; } else { var localDate = Date, initialTime = localDate.now(); exports$1.unstable_now = function() { return localDate.now() - initialTime; }; } var taskQueue = [], timerQueue = [], taskIdCounter = 1, currentTask = null, currentPriorityLevel = 3, isPerformingWork = false, isHostCallbackScheduled = false, isHostTimeoutScheduled = false, needsPaint = false, localSetTimeout = "function" === typeof setTimeout ? setTimeout : null, localClearTimeout = "function" === typeof clearTimeout ? clearTimeout : null, localSetImmediate = "undefined" !== typeof setImmediate ? setImmediate : null; function advanceTimers(currentTime) { for (var timer = peek(timerQueue); null !== timer; ) { if (null === timer.callback) pop(timerQueue); else if (timer.startTime <= currentTime) pop(timerQueue), timer.sortIndex = timer.expirationTime, push(taskQueue, timer); else break; timer = peek(timerQueue); } } function handleTimeout(currentTime) { isHostTimeoutScheduled = false; advanceTimers(currentTime); if (!isHostCallbackScheduled) if (null !== peek(taskQueue)) isHostCallbackScheduled = true, isMessageLoopRunning || (isMessageLoopRunning = true, schedulePerformWorkUntilDeadline()); else { var firstTimer = peek(timerQueue); null !== firstTimer && requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); } } var isMessageLoopRunning = false, taskTimeoutID = -1, frameInterval = 5, startTime = -1; function shouldYieldToHost() { return needsPaint ? true : exports$1.unstable_now() - startTime < frameInterval ? false : true; } function performWorkUntilDeadline() { needsPaint = false; if (isMessageLoopRunning) { var currentTime = exports$1.unstable_now(); startTime = currentTime; var hasMoreWork = true; try { a: { isHostCallbackScheduled = false; isHostTimeoutScheduled && (isHostTimeoutScheduled = false, localClearTimeout(taskTimeoutID), taskTimeoutID = -1); isPerformingWork = true; var previousPriorityLevel = currentPriorityLevel; try { b: { advanceTimers(currentTime); for (currentTask = peek(taskQueue); null !== currentTask && !(currentTask.expirationTime > currentTime && shouldYieldToHost()); ) { var callback = currentTask.callback; if ("function" === typeof callback) { currentTask.callback = null; currentPriorityLevel = currentTask.priorityLevel; var continuationCallback = callback( currentTask.expirationTime <= currentTime ); currentTime = exports$1.unstable_now(); if ("function" === typeof continuationCallback) { currentTask.callback = continuationCallback; advanceTimers(currentTime); hasMoreWork = true; break b; } currentTask === peek(taskQueue) && pop(taskQueue); advanceTimers(currentTime); } else pop(taskQueue); currentTask = peek(taskQueue); } if (null !== currentTask) hasMoreWork = true; else { var firstTimer = peek(timerQueue); null !== firstTimer && requestHostTimeout( handleTimeout, firstTimer.startTime - currentTime ); hasMoreWork = false; } } break a; } finally { currentTask = null, currentPriorityLevel = previousPriorityLevel, isPerformingWork = false; } hasMoreWork = void 0; } } finally { hasMoreWork ? schedulePerformWorkUntilDeadline() : isMessageLoopRunning = false; } } } var schedulePerformWorkUntilDeadline; if ("function" === typeof localSetImmediate) schedulePerformWorkUntilDeadline = function() { localSetImmediate(performWorkUntilDeadline); }; else if ("undefined" !== typeof MessageChannel) { var channel = new MessageChannel(), port = channel.port2; channel.port1.onmessage = performWorkUntilDeadline; schedulePerformWorkUntilDeadline = function() { port.postMessage(null); }; } else schedulePerformWorkUntilDeadline = function() { localSetTimeout(performWorkUntilDeadline, 0); }; function requestHostTimeout(callback, ms) { taskTimeoutID = localSetTimeout(function() { callback(exports$1.unstable_now()); }, ms); } exports$1.unstable_IdlePriority = 5; exports$1.unstable_ImmediatePriority = 1; exports$1.unstable_LowPriority = 4; exports$1.unstable_NormalPriority = 3; exports$1.unstable_Profiling = null; exports$1.unstable_UserBlockingPriority = 2; exports$1.unstable_cancelCallback = function(task) { task.callback = null; }; exports$1.unstable_forceFrameRate = function(fps) { 0 > fps || 125 < fps ? console.error( "forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported" ) : frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5; }; exports$1.unstable_getCurrentPriorityLevel = function() { return currentPriorityLevel; }; exports$1.unstable_next = function(eventHandler) { switch (currentPriorityLevel) { case 1: case 2: case 3: var priorityLevel = 3; break; default: priorityLevel = currentPriorityLevel; } var previousPriorityLevel = currentPriorityLevel; currentPriorityLevel = priorityLevel; try { return eventHandler(); } finally { currentPriorityLevel = previousPriorityLevel; } }; exports$1.unstable_requestPaint = function() { needsPaint = true; }; exports$1.unstable_runWithPriority = function(priorityLevel, eventHandler) { switch (priorityLevel) { case 1: case 2: case 3: case 4: case 5: break; default: priorityLevel = 3; } var previousPriorityLevel = currentPriorityLevel; currentPriorityLevel = priorityLevel; try { return eventHandler(); } finally { currentPriorityLevel = previousPriorityLevel; } }; exports$1.unstable_scheduleCallback = function(priorityLevel, callback, options) { var currentTime = exports$1.unstable_now(); "object" === typeof options && null !== options ? (options = options.delay, options = "number" === typeof options && 0 < options ? currentTime + options : currentTime) : options = currentTime; switch (priorityLevel) { case 1: var timeout = -1; break; case 2: timeout = 250; break; case 5: timeout = 1073741823; break; case 4: timeout = 1e4; break; default: timeout = 5e3; } timeout = options + timeout; priorityLevel = { id: taskIdCounter++, callback, priorityLevel, startTime: options, expirationTime: timeout, sortIndex: -1 }; options > currentTime ? (priorityLevel.sortIndex = options, push(timerQueue, priorityLevel), null === peek(taskQueue) && priorityLevel === peek(timerQueue) && (isHostTimeoutScheduled ? (localClearTimeout(taskTimeoutID), taskTimeoutID = -1) : isHostTimeoutScheduled = true, requestHostTimeout(handleTimeout, options - currentTime))) : (priorityLevel.sortIndex = timeout, push(taskQueue, priorityLevel), isHostCallbackScheduled || isPerformingWork || (isHostCallbackScheduled = true, isMessageLoopRunning || (isMessageLoopRunning = true, schedulePerformWorkUntilDeadline()))); return priorityLevel; }; exports$1.unstable_shouldYield = shouldYieldToHost; exports$1.unstable_wrapCallback = function(callback) { var parentPriorityLevel = currentPriorityLevel; return function() { var previousPriorityLevel = currentPriorityLevel; currentPriorityLevel = parentPriorityLevel; try { return callback.apply(this, arguments); } finally { currentPriorityLevel = previousPriorityLevel; } }; }; })(scheduler_production); return scheduler_production; } var hasRequiredScheduler; function requireScheduler() { if (hasRequiredScheduler) return scheduler.exports; hasRequiredScheduler = 1; { scheduler.exports = requireScheduler_production(); } return scheduler.exports; } var reactDom = { exports: {} }; var reactDom_production = {}; var hasRequiredReactDom_production; function requireReactDom_production() { if (hasRequiredReactDom_production) return reactDom_production; hasRequiredReactDom_production = 1; var React2 = requireReact(); function formatProdErrorMessage(code) { var url = "https://react.dev/errors/" + code; if (1 < arguments.length) { url += "?args[]=" + encodeURIComponent(arguments[1]); for (var i = 2; i < arguments.length; i++) url += "&args[]=" + encodeURIComponent(arguments[i]); } return "Minified React error #" + code + "; visit " + url + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."; } function noop() { } var Internals = { d: { f: noop, r: function() { throw Error(formatProdErrorMessage(522)); }, D: noop, C: noop, L: noop, m: noop, X: noop, S: noop, M: noop }, p: 0, findDOMNode: null }, REACT_PORTAL_TYPE = Symbol.for("react.portal"); function createPortal$1(children, containerInfo, implementation) { var key = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null; return { $$typeof: REACT_PORTAL_TYPE, key: null == key ? null : "" + key, children, containerInfo, implementation }; } var ReactSharedInternals = React2.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE; function getCrossOriginStringAs(as, input) { if ("font" === as) return ""; if ("string" === typeof input) return "use-credentials" === input ? input : ""; } reactDom_production.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE = Internals; reactDom_production.createPortal = function(children, container) { var key = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null; if (!container || 1 !== container.nodeType && 9 !== container.nodeType && 11 !== container.nodeType) throw Error(formatProdErrorMessage(299)); return createPortal$1(children, container, null, key); }; reactDom_production.flushSync = function(fn) { var previousTransition = ReactSharedInternals.T, previousUpdatePriority = Internals.p; try { if (ReactSharedInternals.T = null, Internals.p = 2, fn) return fn(); } finally { ReactSharedInternals.T = previousTransition, Internals.p = previousUpdatePriority, Internals.d.f(); } }; reactDom_production.preconnect = function(href, options) { "string" === typeof href && (options ? (options = options.crossOrigin, options = "string" === typeof options ? "use-credentials" === options ? options : "" : void 0) : options = null, Internals.d.C(href, options)); }; reactDom_production.prefetchDNS = function(href) { "string" === typeof href && Internals.d.D(href); }; reactDom_production.preinit = function(href, options) { if ("string" === typeof href && options && "string" === typeof options.as) { var as = options.as, crossOrigin = getCrossOriginStringAs(as, options.crossOrigin), integrity = "string" === typeof options.integrity ? options.integrity : void 0, fetchPriority = "string" === typeof options.fetchPriority ? options.fetchPriority : void 0; "style" === as ? Internals.d.S( href, "string" === typeof options.precedence ? options.precedence : void 0, { crossOrigin, integrity, fetchPriority } ) : "script" === as && Internals.d.X(href, { crossOrigin, integrity, fetchPriority, nonce: "string" === typeof options.nonce ? options.nonce : void 0 }); } }; reactDom_production.preinitModule = function(href, options) { if ("string" === typeof href) if ("object" === typeof options && null !== options) { if (null == options.as || "script" === options.as) { var crossOrigin = getCrossOriginStringAs( options.as, options.crossOrigin ); Internals.d.M(href, { crossOrigin, integrity: "string" === typeof options.integrity ? options.integrity : void 0, nonce: "string" === typeof options.nonce ? options.nonce : void 0 }); } } else null == options && Internals.d.M(href); }; reactDom_production.preload = function(href, options) { if ("string" === typeof href && "object" === typeof options && null !== options && "string" === typeof options.as) { var as = options.as, crossOrigin = getCrossOriginStringAs(as, options.crossOrigin); Internals.d.L(href, as, { crossOrigin, integrity: "string" === typeof options.integrity ? options.integrity : void 0, nonce: "string" === typeof options.nonce ? options.nonce : void 0, type: "string" === typeof options.type ? options.type : void 0, fetchPriority: "string" === typeof options.fetchPriority ? options.fetchPriority : void 0, referrerPolicy: "string" === typeof options.referrerPolicy ? options.referrerPolicy : void 0, imageSrcSet: "string" === typeof options.imageSrcSet ? options.imageSrcSet : void 0, imageSizes: "string" === typeof options.imageSizes ? options.imageSizes : void 0, media: "string" === typeof options.media ? options.media : void 0 }); } }; reactDom_production.preloadModule = function(href, options) { if ("string" === typeof href) if (options) { var crossOrigin = getCrossOriginStringAs(options.as, options.crossOrigin); Internals.d.m(href, { as: "string" === typeof options.as && "script" !== options.as ? options.as : void 0, crossOrigin, integrity: "string" === typeof options.integrity ? options.integrity : void 0 }); } else Internals.d.m(href); }; reactDom_production.requestFormReset = function(form) { Internals.d.r(form); }; reactDom_production.unstable_batchedUpdates = function(fn, a) { return fn(a); }; reactDom_production.useFormState = function(action, initialState, permalink) { return ReactSharedInternals.H.useFormState(action, initialState, permalink); }; reactDom_production.useFormStatus = function() { return ReactSharedInternals.H.useHostTransitionStatus(); }; reactDom_production.version = "19.2.5"; return reactDom_production; } var hasRequiredReactDom; function requireReactDom() { if (hasRequiredReactDom) return reactDom.exports; hasRequiredReactDom = 1; function checkDCE() { if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function") { return; } try { __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); } catch (err) { console.error(err); } } { checkDCE(); reactDom.exports = requireReactDom_production(); } return reactDom.exports; } var hasRequiredReactDomClient_production; function requireReactDomClient_production() { if (hasRequiredReactDomClient_production) return reactDomClient_production; hasRequiredReactDomClient_production = 1; var Scheduler = requireScheduler(), React2 = requireReact(), ReactDOM2 = requireReactDom(); function formatProdErrorMessage(code) { var url = "https://react.dev/errors/" + code; if (1 < arguments.length) { url += "?args[]=" + encodeURIComponent(arguments[1]); for (var i = 2; i < arguments.length; i++) url += "&args[]=" + encodeURIComponent(arguments[i]); } return "Minified React error #" + code + "; visit " + url + " for the full message or use the non-minified dev environment for full errors and additional helpful warnings."; } function isValidContainer(node) { return !(!node || 1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType); } function getNearestMountedFiber(fiber) { var node = fiber, nearestMounted = fiber; if (fiber.alternate) for (; node.return; ) node = node.return; else { fiber = node; do node = fiber, 0 !== (node.flags & 4098) && (nearestMounted = node.return), fiber = node.return; while (fiber); } return 3 === node.tag ? nearestMounted : null; } function getSuspenseInstanceFromFiber(fiber) { if (13 === fiber.tag) { var suspenseState = fiber.memoizedState; null === suspenseState && (fiber = fiber.alternate, null !== fiber && (suspenseState = fiber.memoizedState)); if (null !== suspenseState) return suspenseState.dehydrated; } return null; } function getActivityInstanceFromFiber(fiber) { if (31 === fiber.tag) { var activityState = fiber.memoizedState; null === activityState && (fiber = fiber.alternate, null !== fiber && (activityState = fiber.memoizedState)); if (null !== activityState) return activityState.dehydrated; } return null; } function assertIsMounted(fiber) { if (getNearestMountedFiber(fiber) !== fiber) throw Error(formatProdErrorMessage(188)); } function findCurrentFiberUsingSlowPath(fiber) { var alternate = fiber.alternate; if (!alternate) { alternate = getNearestMountedFiber(fiber); if (null === alternate) throw Error(formatProdErrorMessage(188)); return alternate !== fiber ? null : fiber; } for (var a = fiber, b = alternate; ; ) { var parentA = a.return; if (null === parentA) break; var parentB = parentA.alternate; if (null === parentB) { b = parentA.return; if (null !== b) { a = b; continue; } break; } if (parentA.child === parentB.child) { for (parentB = parentA.child; parentB; ) { if (parentB === a) return assertIsMounted(parentA), fiber; if (parentB === b) return assertIsMounted(parentA), alternate; parentB = parentB.sibling; } throw Error(formatProdErrorMessage(188)); } if (a.return !== b.return) a = parentA, b = parentB; else { for (var didFindChild = false, child$0 = parentA.child; child$0; ) { if (child$0 === a) { didFindChild = true; a = parentA; b = parentB; break; } if (child$0 === b) { didFindChild = true; b = parentA; a = parentB; break; } child$0 = child$0.sibling; } if (!didFindChild) { for (child$0 = parentB.child; child$0; ) { if (child$0 === a) { didFindChild = true; a = parentB; b = parentA; break; } if (child$0 === b) { didFindChild = true; b = parentB; a = parentA; break; } child$0 = child$0.sibling; } if (!didFindChild) throw Error(formatProdErrorMessage(189)); } } if (a.alternate !== b) throw Error(formatProdErrorMessage(190)); } if (3 !== a.tag) throw Error(formatProdErrorMessage(188)); return a.stateNode.current === a ? fiber : alternate; } function findCurrentHostFiberImpl(node) { var tag = node.tag; if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node; for (node = node.child; null !== node; ) { tag = findCurrentHostFiberImpl(node); if (null !== tag) return tag; node = node.sibling; } return null; } var assign = Object.assign, REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"), REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"); var REACT_ACTIVITY_TYPE = Symbol.for("react.activity"); var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"); var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; function getIteratorFn(maybeIterable) { if (null === maybeIterable || "object" !== typeof maybeIterable) return null; maybeIterable = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable["@@iterator"]; return "function" === typeof maybeIterable ? maybeIterable : null; } var REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"); function getComponentNameFromType(type) { if (null == type) return null; if ("function" === typeof type) return type.$$typeof === REACT_CLIENT_REFERENCE ? null : type.displayName || type.name || null; if ("string" === typeof type) return type; switch (type) { case REACT_FRAGMENT_TYPE: return "Fragment"; case REACT_PROFILER_TYPE: return "Profiler"; case REACT_STRICT_MODE_TYPE: return "StrictMode"; case REACT_SUSPENSE_TYPE: return "Suspense"; case REACT_SUSPENSE_LIST_TYPE: return "SuspenseList"; case REACT_ACTIVITY_TYPE: return "Activity"; } if ("object" === typeof type) switch (type.$$typeof) { case REACT_PORTAL_TYPE: return "Portal"; case REACT_CONTEXT_TYPE: return type.displayName || "Context"; case REACT_CONSUMER_TYPE: return (type._context.displayName || "Context") + ".Consumer"; case REACT_FORWARD_REF_TYPE: var innerType = type.render; type = type.displayName; type || (type = innerType.displayName || innerType.name || "", type = "" !== type ? "ForwardRef(" + type + ")" : "ForwardRef"); return type; case REACT_MEMO_TYPE: return innerType = type.displayName || null, null !== innerType ? innerType : getComponentNameFromType(type.type) || "Memo"; case REACT_LAZY_TYPE: innerType = type._payload; type = type._init; try { return getComponentNameFromType(type(innerType)); } catch (x) { } } return null; } var isArrayImpl = Array.isArray, ReactSharedInternals = React2.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, ReactDOMSharedInternals = ReactDOM2.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, sharedNotPendingObject = { pending: false, data: null, method: null, action: null }, valueStack = [], index = -1; function createCursor(defaultValue) { return { current: defaultValue }; } function pop(cursor) { 0 > index || (cursor.current = valueStack[index], valueStack[index] = null, index--); } function push(cursor, value) { index++; valueStack[index] = cursor.current; cursor.current = value; } var contextStackCursor = createCursor(null), contextFiberStackCursor = createCursor(null), rootInstanceStackCursor = createCursor(null), hostTransitionProviderCursor = createCursor(null); function pushHostContainer(fiber, nextRootInstance) { push(rootInstanceStackCursor, nextRootInstance); push(contextFiberStackCursor, fiber); push(contextStackCursor, null); switch (nextRootInstance.nodeType) { case 9: case 11: fiber = (fiber = nextRootInstance.documentElement) ? (fiber = fiber.namespaceURI) ? getOwnHostContext(fiber) : 0 : 0; break; default: if (fiber = nextRootInstance.tagName, nextRootInstance = nextRootInstance.namespaceURI) nextRootInstance = getOwnHostContext(nextRootInstance), fiber = getChildHostContextProd(nextRootInstance, fiber); else switch (fiber) { case "svg": fiber = 1; break; case "math": fiber = 2; break; default: fiber = 0; } } pop(contextStackCursor); push(contextStackCursor, fiber); } function popHostContainer() { pop(contextStackCursor); pop(contextFiberStackCursor); pop(rootInstanceStackCursor); } function pushHostContext(fiber) { null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber); var context = contextStackCursor.current; var JSCompiler_inline_result = getChildHostContextProd(context, fiber.type); context !== JSCompiler_inline_result && (push(contextFiberStackCursor, fiber), push(contextStackCursor, JSCompiler_inline_result)); } function popHostContext(fiber) { contextFiberStackCursor.current === fiber && (pop(contextStackCursor), pop(contextFiberStackCursor)); hostTransitionProviderCursor.current === fiber && (pop(hostTransitionProviderCursor), HostTransitionContext._currentValue = sharedNotPendingObject); } var prefix, suffix; function describeBuiltInComponentFrame(name) { if (void 0 === prefix) try { throw Error(); } catch (x) { var match = x.stack.trim().match(/\n( *(at )?)/); prefix = match && match[1] || ""; suffix = -1 < x.stack.indexOf("\n at") ? " (<anonymous>)" : -1 < x.stack.indexOf("@") ? "@unknown:0:0" : ""; } return "\n" + prefix + name + suffix; } var reentry = false; function describeNativeComponentFrame(fn, construct) { if (!fn || reentry) return ""; reentry = true; var previousPrepareStackTrace = Error.prepareStackTrace; Error.prepareStackTrace = void 0; try { var RunInRootFrame = { DetermineComponentFrameRoot: function() { try { if (construct) { var Fake = function() { throw Error(); }; Object.defineProperty(Fake.prototype, "props", { set: function() { throw Error(); } }); if ("object" === typeof Reflect && Reflect.construct) { try { Reflect.construct(Fake, []); } catch (x) { var control = x; } Reflect.construct(fn, [], Fake); } else { try { Fake.call(); } catch (x$1) { control = x$1; } fn.call(Fake.prototype); } } else { try { throw Error(); } catch (x$2) { control = x$2; } (Fake = fn()) && "function" === typeof Fake.catch && Fake.catch(function() { }); } } catch (sample) { if (sample && control && "string" === typeof sample.stack) return [sample.stack, control.stack]; } return [null, null]; } }; RunInRootFrame.DetermineComponentFrameRoot.displayName = "DetermineComponentFrameRoot"; var namePropDescriptor = Object.getOwnPropertyDescriptor( RunInRootFrame.DetermineComponentFrameRoot, "name" ); namePropDescriptor && namePropDescriptor.configurable && Object.defineProperty( RunInRootFrame.DetermineComponentFrameRoot, "name", { value: "DetermineComponentFrameRoot" } ); var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(), sampleStack = _RunInRootFrame$Deter[0], controlStack = _RunInRootFrame$Deter[1]; if (sampleStack && controlStack) { var sampleLines = sampleStack.split("\n"), controlLines = controlStack.split("\n"); for (namePropDescriptor = RunInRootFrame = 0; RunInRootFrame < sampleLines.length && !sampleLines[RunInRootFrame].includes("DetermineComponentFrameRoot"); ) RunInRootFrame++; for (; namePropDescriptor < controlLines.length && !controlLines[namePropDescriptor].includes( "DetermineComponentFrameRoot" ); ) namePropDescriptor++; if (RunInRootFrame === sampleLines.length || namePropDescriptor === controlLines.length) for (RunInRootFrame = sampleLines.length - 1, namePropDescriptor = controlLines.length - 1; 1 <= RunInRootFrame && 0 <= namePropDescriptor && sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor]; ) namePropDescriptor--; for (; 1 <= RunInRootFrame && 0 <= namePropDescriptor; RunInRootFrame--, namePropDescriptor--) if (sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor]) { if (1 !== RunInRootFrame || 1 !== namePropDescriptor) { do if (RunInRootFrame--, namePropDescriptor--, 0 > namePropDescriptor || sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor]) { var frame = "\n" + sampleLines[RunInRootFrame].replace(" at new ", " at "); fn.displayName && frame.includes("<anonymous>") && (frame = frame.replace("<anonymous>", fn.displayName)); return frame; } while (1 <= RunInRootFrame && 0 <= namePropDescriptor); } break; } } } finally { reentry = false, Error.prepareStackTrace = previousPrepareStackTrace; } return (previousPrepareStackTrace = fn ? fn.displayName || fn.name : "") ? describeBuiltInComponentFrame(previousPrepareStackTrace) : ""; } function describeFiber(fiber, childFiber) { switch (fiber.tag) { case 26: case 27: case 5: return describeBuiltInComponentFrame(fiber.type); case 16: return describeBuiltInComponentFrame("Lazy"); case 13: return fiber.child !== childFiber && null !== childFiber ? describeBuiltInComponentFrame("Suspense Fallback") : describeBuiltInComponentFrame("Suspense"); case 19: return describeBuiltInComponentFrame("SuspenseList"); case 0: case 15: return describeNativeComponentFrame(fiber.type, false); case 11: return describeNativeComponentFrame(fiber.type.render, false); case 1: return describeNativeComponentFrame(fiber.type, true); case 31: return describeBuiltInComponentFrame("Activity"); default: return ""; } } function getStackByFiberInDevAndProd(workInProgress2) { try { var info = "", previous = null; do info += describeFiber(workInProgress2, previous), previous = workInProgress2, workInProgress2 = workInProgress2.return; while (workInProgress2); return info; } catch (x) { return "\nError generating stack: " + x.message + "\n" + x.stack; } } var hasOwnProperty = Object.prototype.hasOwnProperty, scheduleCallback$3 = Scheduler.unstable_scheduleCallback, cancelCallback$1 = Scheduler.unstable_cancelCallback, shouldYield = Scheduler.unstable_shouldYield, requestPaint = Scheduler.unstable_requestPaint, now = Scheduler.unstable_now, getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel, ImmediatePriority = Scheduler.unstable_ImmediatePriority, UserBlockingPriority = Scheduler.unstable_UserBlockingPriority, NormalPriority$1 = Scheduler.unstable_NormalPriority, LowPriority = Scheduler.unstable_LowPriority, IdlePriority = Scheduler.unstable_IdlePriority, log$1 = Scheduler.log, unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue, rendererID = null, injectedHook = null; function setIsStrictModeForDevtools(newIsStrictMode) { "function" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode); if (injectedHook && "function" === typeof injectedHook.setStrictMode) try { injectedHook.setStrictMode(rendererID, newIsStrictMode); } catch (err) { } } var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, log = Math.log, LN2 = Math.LN2; function clz32Fallback(x) { x >>>= 0; return 0 === x ? 32 : 31 - (log(x) / LN2 | 0) | 0; } var nextTransitionUpdateLane = 256, nextTransitionDeferredLane = 262144, nextRetryLane = 4194304; function getHighestPriorityLanes(lanes) { var pendingSyncLanes = lanes & 42; if (0 !== pendingSyncLanes) return pendingSyncLanes; switch (lanes & -lanes) { case 1: return 1; case 2: return 2; case 4: return 4; case 8: return 8; case 16: return 16; case 32: return 32; case 64: return 64; case 128: return 128; case 256: case 512: case 1024: case 2048: case 4096: case 8192: case 16384: case 32768: case 65536: case 131072: return lanes & 261888; case 262144: case 524288: case 1048576: case 2097152: return lanes & 3932160; case 4194304: case 8388608: case 16777216: case 33554432: return lanes & 62914560; case 67108864: return 67108864; case 134217728: return 134217728; case 268435456: return 268435456; case 536870912: return 536870912; case 1073741824: return 0; default: return lanes; } } function getNextLanes(root2, wipLanes, rootHasPendingCommit) { var pendingLanes = root2.pendingLanes; if (0 === pendingLanes) return 0; var nextLanes = 0, suspendedLanes = root2.suspendedLanes, pingedLanes = root2.pingedLanes; root2 = root2.warmLanes; var nonIdlePendingLanes = pendingLanes & 134217727; 0 !== nonIdlePendingLanes ? (pendingLanes = nonIdlePendingLanes & ~suspendedLanes, 0 !== pendingLanes ? nextLanes = getHighestPriorityLanes(pendingLanes) : (pingedLanes &= nonIdlePendingLanes, 0 !== pingedLanes ? nextLanes = getHighestPriorityLanes(pingedLanes) : rootHasPendingCommit || (rootHasPendingCommit = nonIdlePendingLanes & ~root2, 0 !== rootHasPendingCommit && (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))))) : (nonIdlePendingLanes = pendingLanes & ~suspendedLanes, 0 !== nonIdlePendingLanes ? nextLanes = getHighestPriorityLanes(nonIdlePendingLanes) : 0 !== pingedLanes ? nextLanes = getHighestPriorityLanes(pingedLanes) : rootHasPendingCommit || (rootHasPendingCommit = pendingLanes & ~root2, 0 !== rootHasPendingCommit && (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))); return 0 === nextLanes ? 0 : 0 !== wipLanes && wipLanes !== nextLanes && 0 === (wipLanes & suspendedLanes) && (suspendedLanes = nextLanes & -nextLanes, rootHasPendingCommit = wipLanes & -wipLanes, suspendedLanes >= rootHasPendingCommit || 32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)) ? wipLanes : nextLanes; } function checkIfRootIsPrerendering(root2, renderLanes2) { return 0 === (root2.pendingLanes & ~(root2.suspendedLanes & ~root2.pingedLanes) & renderLanes2); } function computeExpirationTime(lane, currentTime) { switch (lane) { case 1: case 2: case 4: case 8: case 64: return currentTime + 250; case 16: case 32: case 128: case 256: case 512: case 1024: case 2048: case 4096: case 8192: case 16384: case 32768: case 65536: case 131072: case 262144: case 524288: case 1048576: case 2097152: return currentTime + 5e3; case 4194304: case 8388608: case 16777216: case 33554432: return -1; case 67108864: case 134217728: case 268435456: case 536870912: case 1073741824: return -1; default: return -1; } } function claimNextRetryLane() { var lane = nextRetryLane; nextRetryLane <<= 1; 0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304); return lane; } function createLaneMap(initial) { for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial); return laneMap; } function markRootUpdated$1(root2, updateLane) { root2.pendingLanes |= updateLane; 268435456 !== updateLane && (root2.suspendedLanes = 0, root2.pingedLanes = 0, root2.warmLanes = 0); } function markRootFinished(root2, finishedLanes, remainingLanes, spawnedLane, updatedLanes, suspendedRetryLanes) { var previouslyPendingLanes = root2.pendingLanes; root2.pendingLanes = remainingLanes; root2.suspendedLanes = 0; root2.pingedLanes = 0; root2.warmLanes = 0; root2.expiredLanes &= remainingLanes; root2.entangledLanes &= remainingLanes; root2.errorRecoveryDisabledLanes &= remainingLanes; root2.shellSuspendCounter = 0; var entanglements = root2.entanglements, expirationTimes = root2.expirationTimes, hiddenUpdates = root2.hiddenUpdates; for (remainingLanes = previouslyPendingLanes & ~remainingLanes; 0 < remainingLanes; ) { var index$7 = 31 - clz32(remainingLanes), lane = 1 << index$7; entanglements[index$7] = 0; expirationTimes[index$7] = -1; var hiddenUpdatesForLane = hiddenUpdates[index$7]; if (null !== hiddenUpdatesForLane) for (hiddenUpdates[index$7] = null, index$7 = 0; index$7 < hiddenUpdatesForLane.length; index$7++) { var update = hiddenUpdatesForLane[index$7]; null !== update && (update.lane &= -536870913); } remainingLanes &= ~lane; } 0 !== spawnedLane && markSpawnedDeferredLane(root2, spawnedLane, 0); 0 !== suspendedRetryLanes && 0 === updatedLanes && 0 !== root2.tag && (root2.suspendedLanes |= suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes)); } function markSpawnedDeferredLane(root2, spawnedLane, entangledLanes) { root2.pendingLanes |= spawnedLane; root2.suspendedLanes &= ~spawnedLane; var spawnedLaneIndex = 31 - clz32(spawnedLane); root2.entangledLanes |= spawnedLane; root2.entanglements[spawnedLaneIndex] = root2.entanglements[spawnedLaneIndex] | 1073741824 | entangledLanes & 261930; } function markRootEntangled(root2, entangledLanes) { var rootEntangledLanes = root2.entangledLanes |= entangledLanes; for (root2 = root2.entanglements; rootEntangledLanes; ) { var index$8 = 31 - clz32(rootEntangledLanes), lane = 1 << index$8; lane & entangledLanes | root2[index$8] & entangledLanes && (root2[index$8] |= entangledLanes); rootEntangledLanes &= ~lane; } } function getBumpedLaneForHydration(root2, renderLanes2) { var renderLane = renderLanes2 & -renderLanes2; renderLane = 0 !== (renderLane & 42) ? 1 : getBumpedLaneForHydrationByLane(renderLane); return 0 !== (renderLane & (root2.suspendedLanes | renderLanes2)) ? 0 : renderLane; } function getBumpedLaneForHydrationByLane(lane) { switch (lane) { case 2: lane = 1; break; case 8: lane = 4; break; case 32: lane = 16; break; case 256: case 512: case 1024: case 2048: case 4096: case 8192: case 16384: case 32768: case 65536: case 131072: case 262144: case 524288: case 1048576: case 2097152: case 4194304: case 8388608: case 16777216: case 33554432: lane = 128; break; case 268435456: lane = 134217728; break; default: lane = 0; } return lane; } function lanesToEventPriority(lanes) { lanes &= -lanes; return 2 < lanes ? 8 < lanes ? 0 !== (lanes & 134217727) ? 32 : 268435456 : 8 : 2; } function resolveUpdatePriority() { var updatePriority = ReactDOMSharedInternals.p; if (0 !== updatePriority) return updatePriority; updatePriority = window.event; return void 0 === updatePriority ? 32 : getEventPriority(updatePriority.type); } function runWithPriority(priority, fn) { var previousPriority = ReactDOMSharedInternals.p; try { return ReactDOMSharedInternals.p = priority, fn(); } finally { ReactDOMSharedInternals.p = previousPriority; } } var randomKey = Math.random().toString(36).slice(2), internalInstanceKey = "__reactFiber$" + randomKey, internalPropsKey = "__reactProps$" + randomKey, internalContainerInstanceKey = "__reactContainer$" + randomKey, internalEventHandlersKey = "__reactEvents$" + randomKey, internalEventHandlerListenersKey = "__reactListeners$" + randomKey, internalEventHandlesSetKey = "__reactHandles$" + randomKey, internalRootNodeResourcesKey = "__reactResources$" + randomKey, internalHoistableMarker = "__reactMarker$" + randomKey; function detachDeletedInstance(node) { delete node[internalInstanceKey]; delete node[internalPropsKey]; delete node[internalEventHandlersKey]; delete node[internalEventHandlerListenersKey]; delete node[internalEventHandlesSetKey]; } function getClosestInstanceFromNode(targetNode) { var targetInst = targetNode[internalInstanceKey]; if (targetInst) return targetInst; for (var parentNode = targetNode.parentNode; parentNode; ) { if (targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey]) { parentNode = targetInst.alternate; if (null !== targetInst.child || null !== parentNode && null !== parentNode.child) for (targetNode = getParentHydrationBoundary(targetNode); null !== targetNode; ) { if (parentNode = targetNode[internalInstanceKey]) return parentNode; targetNode = getParentHydrationBoundary(targetNode); } return targetInst; } targetNode = parentNode; parentNode = targetNode.parentNode; } return null; } function getInstanceFromNode(node) { if (node = node[internalInstanceKey] || node[internalContainerInstanceKey]) { var tag = node.tag; if (5 === tag || 6 === tag || 13 === tag || 31 === tag || 26 === tag || 27 === tag || 3 === tag) return node; } return null; } function getNodeFromInstance(inst) { var tag = inst.tag; if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return inst.stateNode; throw Error(formatProdErrorMessage(33)); } function getResourcesFromRoot(root2) { var resources = root2[internalRootNodeResourcesKey]; resources || (resources = root2[internalRootNodeResourcesKey] = { hoistableStyles: new Map(), hoistableScripts: new Map() }); return resources; } function markNodeAsHoistable(node) { node[internalHoistableMarker] = true; } var allNativeEvents = new Set(), registrationNameDependencies = {}; function registerTwoPhaseEvent(registrationName, dependencies) { registerDirectEvent(registrationName, dependencies); registerDirectEvent(registrationName + "Capture", dependencies); } function registerDirectEvent(registrationName, dependencies) { registrationNameDependencies[registrationName] = dependencies; for (registrationName = 0; registrationName < dependencies.length; registrationName++) allNativeEvents.add(dependencies[registrationName]); } var VALID_ATTRIBUTE_NAME_REGEX = RegExp( "^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$" ), illegalAttributeNameCache = {}, validatedAttributeNameCache = {}; function isAttributeNameSafe(attributeName) { if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) return true; if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) return false; if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) return validatedAttributeNameCache[attributeName] = true; illegalAttributeNameCache[attributeName] = true; return false; } function setValueForAttribute(node, name, value) { if (isAttributeNameSafe(name)) if (null === value) node.removeAttribute(name); else { switch (typeof value) { case "undefined": case "function": case "symbol": node.removeAttribute(name); return; case "boolean": var prefix$10 = name.toLowerCase().slice(0, 5); if ("data-" !== prefix$10 && "aria-" !== prefix$10) { node.removeAttribute(name); return; } } node.setAttribute(name, "" + value); } } function setValueForKnownAttribute(node, name, value) { if (null === value) node.removeAttribute(name); else { switch (typeof value) { case "undefined": case "function": case "symbol": case "boolean": node.removeAttribute(name); return; } node.setAttribute(name, "" + value); } } function setValueForNamespacedAttribute(node, namespace, name, value) { if (null === value) node.removeAttribute(name); else { switch (typeof value) { case "undefined": case "function": case "symbol": case "boolean": node.removeAttribute(name); return; } node.setAttributeNS(namespace, name, "" + value); } } function getToStringValue(value) { switch (typeof value) { case "bigint": case "boolean": case "number": case "string": case "undefined": return value; case "object": return value; default: return ""; } } function isCheckable(elem) { var type = elem.type; return (elem = elem.nodeName) && "input" === elem.toLowerCase() && ("checkbox" === type || "radio" === type); } function trackValueOnNode(node, valueField, currentValue) { var descriptor = Object.getOwnPropertyDescriptor( node.constructor.prototype, valueField ); if (!node.hasOwnProperty(valueField) && "undefined" !== typeof descriptor && "function" === typeof descriptor.get && "function" === typeof descriptor.set) { var get = descriptor.get, set = descriptor.set; Object.defineProperty(node, valueField, { configurable: true, get: function() { return get.call(this); }, set: function(value) { currentValue = "" + value; set.call(this, value); } }); Object.defineProperty(node, valueField, { enumerable: descriptor.enumerable }); return { getValue: function() { return currentValue; }, setValue: function(value) { currentValue = "" + value; }, stopTracking: function() { node._valueTracker = null; delete node[valueField]; } }; } } function track(node) { if (!node._valueTracker) { var valueField = isCheckable(node) ? "checked" : "value"; node._valueTracker = trackValueOnNode( node, valueField, "" + node[valueField] ); } } function updateValueIfChanged(node) { if (!node) return false; var tracker = node._valueTracker; if (!tracker) return true; var lastValue = tracker.getValue(); var value = ""; node && (value = isCheckable(node) ? node.checked ? "true" : "false" : node.value); node = value; return node !== lastValue ? (tracker.setValue(node), true) : false; } function getActiveElement(doc) { doc = doc || ("undefined" !== typeof document ? document : void 0); if ("undefined" === typeof doc) return null; try { return doc.activeElement || doc.body; } catch (e) { return doc.body; } } var escapeSelectorAttributeValueInsideDoubleQuotesRegex = /[\n"\\]/g; function escapeSelectorAttributeValueInsideDoubleQuotes(value) { return value.replace( escapeSelectorAttributeValueInsideDoubleQuotesRegex, function(ch) { return "\\" + ch.charCodeAt(0).toString(16) + " "; } ); } function updateInput(element, value, defaultValue, lastDefaultValue, checked, defaultChecked, type, name) { element.name = ""; null != type && "function" !== typeof type && "symbol" !== typeof type && "boolean" !== typeof type ? element.type = type : element.removeAttribute("type"); if (null != value) if ("number" === type) { if (0 === value && "" === element.value || element.value != value) element.value = "" + getToStringValue(value); } else element.value !== "" + getToStringValue(value) && (element.value = "" + getToStringValue(value)); else "submit" !== type && "reset" !== type || element.removeAttribute("value"); null != value ? setDefaultValue(element, type, getToStringValue(value)) : null != defaultValue ? setDefaultValue(element, type, getToStringValue(defaultValue)) : null != lastDefaultValue && element.removeAttribute("value"); null == checked && null != defaultChecked && (element.defaultChecked = !!defaultChecked); null != checked && (element.checked = checked && "function" !== typeof checked && "symbol" !== typeof checked); null != name && "function" !== typeof name && "symbol" !== typeof name && "boolean" !== typeof name ? element.name = "" + getToStringValue(name) : element.removeAttribute("name"); } function initInput(element, value, defaultValue, checked, defaultChecked, type, name, isHydrating2) { null != type && "function" !== typeof type && "symbol" !== typeof type && "boolean" !== typeof type && (element.type = type); if (null != value || null != defaultValue) { if (!("submit" !== type && "reset" !== type || void 0 !== value && null !== value)) { track(element); return; } defaultValue = null != defaultValue ? "" + getToStringValue(defaultValue) : ""; value = null != value ? "" + getToStringValue(value) : defaultValue; isHydrating2 || value === element.value || (element.value = value); element.defaultValue = value; } checked = null != checked ? checked : defaultChecked; checked = "function" !== typeof checked && "symbol" !== typeof checked && !!checked; element.checked = isHydrating2 ? element.checked : !!checked; element.defaultChecked = !!checked; null != name && "function" !== typeof name && "symbol" !== typeof name && "boolean" !== typeof name && (element.name = name); track(element); } function setDefaultValue(node, type, value) { "number" === type && getActiveElement(node.ownerDocument) === node || node.defaultValue === "" + value || (node.defaultValue = "" + value); } function updateOptions(node, multiple, propValue, setDefaultSelected) { node = node.options; if (multiple) { multiple = {}; for (var i = 0; i < propValue.length; i++) multiple["$" + propValue[i]] = true; for (propValue = 0; propValue < node.length; propValue++) i = multiple.hasOwnProperty("$" + node[propValue].value), node[propValue].selected !== i && (node[propValue].selected = i), i && setDefaultSelected && (node[propValue].defaultSelected = true); } else { propValue = "" + getToStringValue(propValue); multiple = null; for (i = 0; i < node.length; i++) { if (node[i].value === propValue) { node[i].selected = true; setDefaultSelected && (node[i].defaultSelected = true); return; } null !== multiple || node[i].disabled || (multiple = node[i]); } null !== multiple && (multiple.selected = true); } } function updateTextarea(element, value, defaultValue) { if (null != value && (value = "" + getToStringValue(value), value !== element.value && (element.value = value), null == defaultValue)) { element.defaultValue !== value && (element.defaultValue = value); return; } element.defaultValue = null != defaultValue ? "" + getToStringValue(defaultValue) : ""; } function initTextarea(element, value, defaultValue, children) { if (null == value) { if (null != children) { if (null != defaultValue) throw Error(formatProdErrorMessage(92)); if (isArrayImpl(children)) { if (1 < children.length) throw Error(formatProdErrorMessage(93)); children = children[0]; } defaultValue = children; } null == defaultValue && (defaultValue = ""); value = defaultValue; } defaultValue = getToStringValue(value); element.defaultValue = defaultValue; children = element.textContent; children === defaultValue && "" !== children && null !== children && (element.value = children); track(element); } function setTextContent(node, text) { if (text) { var firstChild = node.firstChild; if (firstChild && firstChild === node.lastChild && 3 === firstChild.nodeType) { firstChild.nodeValue = text; return; } } node.textContent = text; } var unitlessNumbers = new Set( "animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split( " " ) ); function setValueForStyle(style2, styleName, value) { var isCustomProperty = 0 === styleName.indexOf("--"); null == value || "boolean" === typeof value || "" === value ? isCustomProperty ? style2.setProperty(styleName, "") : "float" === styleName ? style2.cssFloat = "" : style2[styleName] = "" : isCustomProperty ? style2.setProperty(styleName, value) : "number" !== typeof value || 0 === value || unitlessNumbers.has(styleName) ? "float" === styleName ? style2.cssFloat = value : style2[styleName] = ("" + value).trim() : style2[styleName] = value + "px"; } function setValueForStyles(node, styles, prevStyles) { if (null != styles && "object" !== typeof styles) throw Error(formatProdErrorMessage(62)); node = node.style; if (null != prevStyles) { for (var styleName in prevStyles) !prevStyles.hasOwnProperty(styleName) || null != styles && styles.hasOwnProperty(styleName) || (0 === styleName.indexOf("--") ? node.setProperty(styleName, "") : "float" === styleName ? node.cssFloat = "" : node[styleName] = ""); for (var styleName$16 in styles) styleName = styles[styleName$16], styles.hasOwnProperty(styleName$16) && prevStyles[styleName$16] !== styleName && setValueForStyle(node, styleName$16, styleName); } else for (var styleName$17 in styles) styles.hasOwnProperty(styleName$17) && setValueForStyle(node, styleName$17, styles[styleName$17]); } function isCustomElement(tagName) { if (-1 === tagName.indexOf("-")) return false; switch (tagName) { case "annotation-xml": case "color-profile": case "font-face": case "font-face-src": case "font-face-uri": case "font-face-format": case "font-face-name": case "missing-glyph": return false; default: return true; } } var aliases = new Map([ ["acceptCharset", "accept-charset"], ["htmlFor", "for"], ["httpEquiv", "http-equiv"], ["crossOrigin", "crossorigin"], ["accentHeight", "accent-height"], ["alignmentBaseline", "alignment-baseline"], ["arabicForm", "arabic-form"], ["baselineShift", "baseline-shift"], ["capHeight", "cap-height"], ["clipPath", "clip-path"], ["clipRule", "clip-rule"], ["colorInterpolation", "color-interpolation"], ["colorInterpolationFilters", "color-interpolation-filters"], ["colorProfile", "color-profile"], ["colorRendering", "color-rendering"], ["dominantBaseline", "dominant-baseline"], ["enableBackground", "enable-background"], ["fillOpacity", "fill-opacity"], ["fillRule", "fill-rule"], ["floodColor", "flood-color"], ["floodOpacity", "flood-opacity"], ["fontFamily", "font-family"], ["fontSize", "font-size"], ["fontSizeAdjust", "font-size-adjust"], ["fontStretch", "font-stretch"], ["fontStyle", "font-style"], ["fontVariant", "font-variant"], ["fontWeight", "font-weight"], ["glyphName", "glyph-name"], ["glyphOrientationHorizontal", "glyph-orientation-horizontal"], ["glyphOrientationVertical", "glyph-orientation-vertical"], ["horizAdvX", "horiz-adv-x"], ["horizOriginX", "horiz-origin-x"], ["imageRendering", "image-rendering"], ["letterSpacing", "letter-spacing"], ["lightingColor", "lighting-color"], ["markerEnd", "marker-end"], ["markerMid", "marker-mid"], ["markerStart", "marker-start"], ["overlinePosition", "overline-position"], ["overlineThickness", "overline-thickness"], ["paintOrder", "paint-order"], ["panose-1", "panose-1"], ["pointerEvents", "pointer-events"], ["renderingIntent", "rendering-intent"], ["shapeRendering", "shape-rendering"], ["stopColor", "stop-color"], ["stopOpacity", "stop-opacity"], ["strikethroughPosition", "strikethrough-position"], ["strikethroughThickness", "strikethrough-thickness"], ["strokeDasharray", "stroke-dasharray"], ["strokeDashoffset", "stroke-dashoffset"], ["strokeLinecap", "stroke-linecap"], ["strokeLinejoin", "stroke-linejoin"], ["strokeMiterlimit", "stroke-miterlimit"], ["strokeOpacity", "stroke-opacity"], ["strokeWidth", "stroke-width"], ["textAnchor", "text-anchor"], ["textDecoration", "text-decoration"], ["textRendering", "text-rendering"], ["transformOrigin", "transform-origin"], ["underlinePosition", "underline-position"], ["underlineThickness", "underline-thickness"], ["unicodeBidi", "unicode-bidi"], ["unicodeRange", "unicode-range"], ["unitsPerEm", "units-per-em"], ["vAlphabetic", "v-alphabetic"], ["vHanging", "v-hanging"], ["vIdeographic", "v-ideographic"], ["vMathematical", "v-mathematical"], ["vectorEffect", "vector-effect"], ["vertAdvY", "vert-adv-y"], ["vertOriginX", "vert-origin-x"], ["vertOriginY", "vert-origin-y"], ["wordSpacing", "word-spacing"], ["writingMode", "writing-mode"], ["xmlnsXlink", "xmlns:xlink"], ["xHeight", "x-height"] ]), isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i; function sanitizeURL(url) { return isJavaScriptProtocol.test("" + url) ? "javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')" : url; } function noop$1() { } var currentReplayingEvent = null; function getEventTarget(nativeEvent) { nativeEvent = nativeEvent.target || nativeEvent.srcElement || window; nativeEvent.correspondingUseElement && (nativeEvent = nativeEvent.correspondingUseElement); return 3 === nativeEvent.nodeType ? nativeEvent.parentNode : nativeEvent; } var restoreTarget = null, restoreQueue = null; function restoreStateOfTarget(target) { var internalInstance = getInstanceFromNode(target); if (internalInstance && (target = internalInstance.stateNode)) { var props = target[internalPropsKey] || null; a: switch (target = internalInstance.stateNode, internalInstance.type) { case "input": updateInput( target, props.value, props.defaultValue, props.defaultValue, props.checked, props.defaultChecked, props.type, props.name ); internalInstance = props.name; if ("radio" === props.type && null != internalInstance) { for (props = target; props.parentNode; ) props = props.parentNode; props = props.querySelectorAll( 'input[name="' + escapeSelectorAttributeValueInsideDoubleQuotes( "" + internalInstance ) + '"][type="radio"]' ); for (internalInstance = 0; internalInstance < props.length; internalInstance++) { var otherNode = props[internalInstance]; if (otherNode !== target && otherNode.form === target.form) { var otherProps = otherNode[internalPropsKey] || null; if (!otherProps) throw Error(formatProdErrorMessage(90)); updateInput( otherNode, otherProps.value, otherProps.defaultValue, otherProps.defaultValue, otherProps.checked, otherProps.defaultChecked, otherProps.type, otherProps.name ); } } for (internalInstance = 0; internalInstance < props.length; internalInstance++) otherNode = props[internalInstance], otherNode.form === target.form && updateValueIfChanged(otherNode); } break a; case "textarea": updateTextarea(target, props.value, props.defaultValue); break a; case "select": internalInstance = props.value, null != internalInstance && updateOptions(target, !!props.multiple, internalInstance, false); } } } var isInsideEventHandler = false; function batchedUpdates$1(fn, a, b) { if (isInsideEventHandler) return fn(a, b); isInsideEventHandler = true; try { var JSCompiler_inline_result = fn(a); return JSCompiler_inline_result; } finally { if (isInsideEventHandler = false, null !== restoreTarget || null !== restoreQueue) { if (flushSyncWork$1(), restoreTarget && (a = restoreTarget, fn = restoreQueue, restoreQueue = restoreTarget = null, restoreStateOfTarget(a), fn)) for (a = 0; a < fn.length; a++) restoreStateOfTarget(fn[a]); } } } function getListener(inst, registrationName) { var stateNode = inst.stateNode; if (null === stateNode) return null; var props = stateNode[internalPropsKey] || null; if (null === props) return null; stateNode = props[registrationName]; a: switch (registrationName) { case "onClick": case "onClickCapture": case "onDoubleClick": case "onDoubleClickCapture": case "onMouseDown": case "onMouseDownCapture": case "onMouseMove": case "onMouseMoveCapture": case "onMouseUp": case "onMouseUpCapture": case "onMouseEnter": (props = !props.disabled) || (inst = inst.type, props = !("button" === inst || "input" === inst || "select" === inst || "textarea" === inst)); inst = !props; break a; default: inst = false; } if (inst) return null; if (stateNode && "function" !== typeof stateNode) throw Error( formatProdErrorMessage(231, registrationName, typeof stateNode) ); return stateNode; } var canUseDOM = !("undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement), passiveBrowserEventsSupported = false; if (canUseDOM) try { var options = {}; Object.defineProperty(options, "passive", { get: function() { passiveBrowserEventsSupported = true; } }); window.addEventListener("test", options, options); window.removeEventListener("test", options, options); } catch (e) { passiveBrowserEventsSupported = false; } var root = null, startText = null, fallbackText = null; function getData() { if (fallbackText) return fallbackText; var start, startValue = startText, startLength = startValue.length, end, endValue = "value" in root ? root.value : root.textContent, endLength = endValue.length; for (start = 0; start < startLength && startValue[start] === endValue[start]; start++) ; var minEnd = startLength - start; for (end = 1; end <= minEnd && startValue[startLength - end] === endValue[endLength - end]; end++) ; return fallbackText = endValue.slice(start, 1 < end ? 1 - end : void 0); } function getEventCharCode(nativeEvent) { var keyCode = nativeEvent.keyCode; "charCode" in nativeEvent ? (nativeEvent = nativeEvent.charCode, 0 === nativeEvent && 13 === keyCode && (nativeEvent = 13)) : nativeEvent = keyCode; 10 === nativeEvent && (nativeEvent = 13); return 32 <= nativeEvent || 13 === nativeEvent ? nativeEvent : 0; } function functionThatReturnsTrue() { return true; } function functionThatReturnsFalse() { return false; } function createSyntheticEvent(Interface) { function SyntheticBaseEvent(reactName, reactEventType, targetInst, nativeEvent, nativeEventTarget) { this._reactName = reactName; this._targetInst = targetInst; this.type = reactEventType; this.nativeEvent = nativeEvent; this.target = nativeEventTarget; this.currentTarget = null; for (var propName in Interface) Interface.hasOwnProperty(propName) && (reactName = Interface[propName], this[propName] = reactName ? reactName(nativeEvent) : nativeEvent[propName]); this.isDefaultPrevented = (null != nativeEvent.defaultPrevented ? nativeEvent.defaultPrevented : false === nativeEvent.returnValue) ? functionThatReturnsTrue : functionThatReturnsFalse; this.isPropagationStopped = functionThatReturnsFalse; return this; } assign(SyntheticBaseEvent.prototype, { preventDefault: function() { this.defaultPrevented = true; var event = this.nativeEvent; event && (event.preventDefault ? event.preventDefault() : "unknown" !== typeof event.returnValue && (event.returnValue = false), this.isDefaultPrevented = functionThatReturnsTrue); }, stopPropagation: function() { var event = this.nativeEvent; event && (event.stopPropagation ? event.stopPropagation() : "unknown" !== typeof event.cancelBubble && (event.cancelBubble = true), this.isPropagationStopped = functionThatReturnsTrue); }, persist: function() { }, isPersistent: functionThatReturnsTrue }); return SyntheticBaseEvent; } var EventInterface = { eventPhase: 0, bubbles: 0, cancelable: 0, timeStamp: function(event) { return event.timeStamp || Date.now(); }, defaultPrevented: 0, isTrusted: 0 }, SyntheticEvent = createSyntheticEvent(EventInterface), UIEventInterface = assign({}, EventInterface, { view: 0, detail: 0 }), SyntheticUIEvent = createSyntheticEvent(UIEventInterface), lastMovementX, lastMovementY, lastMouseEvent, MouseEventInterface = assign({}, UIEventInterface, { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, getModifierState: getEventModifierState, button: 0, buttons: 0, relatedTarget: function(event) { return void 0 === event.relatedTarget ? event.fromElement === event.srcElement ? event.toElement : event.fromElement : event.relatedTarget; }, movementX: function(event) { if ("movementX" in event) return event.movementX; event !== lastMouseEvent && (lastMouseEvent && "mousemove" === event.type ? (lastMovementX = event.screenX - lastMouseEvent.screenX, lastMovementY = event.screenY - lastMouseEvent.screenY) : lastMovementY = lastMovementX = 0, lastMouseEvent = event); return lastMovementX; }, movementY: function(event) { return "movementY" in event ? event.movementY : lastMovementY; } }), SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface), DragEventInterface = assign({}, MouseEventInterface, { dataTransfer: 0 }), SyntheticDragEvent = createSyntheticEvent(DragEventInterface), FocusEventInterface = assign({}, UIEventInterface, { relatedTarget: 0 }), SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface), AnimationEventInterface = assign({}, EventInterface, { animationName: 0, elapsedTime: 0, pseudoElement: 0 }), SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface), ClipboardEventInterface = assign({}, EventInterface, { clipboardData: function(event) { return "clipboardData" in event ? event.clipboardData : window.clipboardData; } }), SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface), CompositionEventInterface = assign({}, EventInterface, { data: 0 }), SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface), normalizeKey = { Esc: "Escape", Spacebar: " ", Left: "ArrowLeft", Up: "ArrowUp", Right: "ArrowRight", Down: "ArrowDown", Del: "Delete", Win: "OS", Menu: "ContextMenu", Apps: "ContextMenu", Scroll: "ScrollLock", MozPrintableKey: "Unidentified" }, translateToKey = { 8: "Backspace", 9: "Tab", 12: "Clear", 13: "Enter", 16: "Shift", 17: "Control", 18: "Alt", 19: "Pause", 20: "CapsLock", 27: "Escape", 32: " ", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "ArrowLeft", 38: "ArrowUp", 39: "ArrowRight", 40: "ArrowDown", 45: "Insert", 46: "Delete", 112: "F1", 113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7", 119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12", 144: "NumLock", 145: "ScrollLock", 224: "Meta" }, modifierKeyToProp = { Alt: "altKey", Control: "ctrlKey", Meta: "metaKey", Shift: "shiftKey" }; function modifierStateGetter(keyArg) { var nativeEvent = this.nativeEvent; return nativeEvent.getModifierState ? nativeEvent.getModifierState(keyArg) : (keyArg = modifierKeyToProp[keyArg]) ? !!nativeEvent[keyArg] : false; } function getEventModifierState() { return modifierStateGetter; } var KeyboardEventInterface = assign({}, UIEventInterface, { key: function(nativeEvent) { if (nativeEvent.key) { var key = normalizeKey[nativeEvent.key] || nativeEvent.key; if ("Unidentified" !== key) return key; } return "keypress" === nativeEvent.type ? (nativeEvent = getEventCharCode(nativeEvent), 13 === nativeEvent ? "Enter" : String.fromCharCode(nativeEvent)) : "keydown" === nativeEvent.type || "keyup" === nativeEvent.type ? translateToKey[nativeEvent.keyCode] || "Unidentified" : ""; }, code: 0, location: 0, ctrlKey: 0, shiftKey: 0, altKey: 0, metaKey: 0, repeat: 0, locale: 0, getModifierState: getEventModifierState, charCode: function(event) { return "keypress" === event.type ? getEventCharCode(event) : 0; }, keyCode: function(event) { return "keydown" === event.type || "keyup" === event.type ? event.keyCode : 0; }, which: function(event) { return "keypress" === event.type ? getEventCharCode(event) : "keydown" === event.type || "keyup" === event.type ? event.keyCode : 0; } }), SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface), PointerEventInterface = assign({}, MouseEventInterface, { pointerId: 0, width: 0, height: 0, pressure: 0, tangentialPressure: 0, tiltX: 0, tiltY: 0, twist: 0, pointerType: 0, isPrimary: 0 }), SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface), TouchEventInterface = assign({}, UIEventInterface, { touches: 0, targetTouches: 0, changedTouches: 0, altKey: 0, metaKey: 0, ctrlKey: 0, shiftKey: 0, getModifierState: getEventModifierState }), SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface), TransitionEventInterface = assign({}, EventInterface, { propertyName: 0, elapsedTime: 0, pseudoElement: 0 }), SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface), WheelEventInterface = assign({}, MouseEventInterface, { deltaX: function(event) { return "deltaX" in event ? event.deltaX : "wheelDeltaX" in event ? -event.wheelDeltaX : 0; }, deltaY: function(event) { return "deltaY" in event ? event.deltaY : "wheelDeltaY" in event ? -event.wheelDeltaY : "wheelDelta" in event ? -event.wheelDelta : 0; }, deltaZ: 0, deltaMode: 0 }), SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface), ToggleEventInterface = assign({}, EventInterface, { newState: 0, oldState: 0 }), SyntheticToggleEvent = createSyntheticEvent(ToggleEventInterface), END_KEYCODES = [9, 13, 27, 32], canUseCompositionEvent = canUseDOM && "CompositionEvent" in window, documentMode = null; canUseDOM && "documentMode" in document && (documentMode = document.documentMode); var canUseTextInputEvent = canUseDOM && "TextEvent" in window && !documentMode, useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && 8 < documentMode && 11 >= documentMode), SPACEBAR_CHAR = String.fromCharCode(32), hasSpaceKeypress = false; function isFallbackCompositionEnd(domEventName, nativeEvent) { switch (domEventName) { case "keyup": return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode); case "keydown": return 229 !== nativeEvent.keyCode; case "keypress": case "mousedown": case "focusout": return true; default: return false; } } function getDataFromCustomEvent(nativeEvent) { nativeEvent = nativeEvent.detail; return "object" === typeof nativeEvent && "data" in nativeEvent ? nativeEvent.data : null; } var isComposing = false; function getNativeBeforeInputChars(domEventName, nativeEvent) { switch (domEventName) { case "compositionend": return getDataFromCustomEvent(nativeEvent); case "keypress": if (32 !== nativeEvent.which) return null; hasSpaceKeypress = true; return SPACEBAR_CHAR; case "textInput": return domEventName = nativeEvent.data, domEventName === SPACEBAR_CHAR && hasSpaceKeypress ? null : domEventName; default: return null; } } function getFallbackBeforeInputChars(domEventName, nativeEvent) { if (isComposing) return "compositionend" === domEventName || !canUseCompositionEvent && isFallbackCompositionEnd(domEventName, nativeEvent) ? (domEventName = getData(), fallbackText = startText = root = null, isComposing = false, domEventName) : null; switch (domEventName) { case "paste": return null; case "keypress": if (!(nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) || nativeEvent.ctrlKey && nativeEvent.altKey) { if (nativeEvent.char && 1 < nativeEvent.char.length) return nativeEvent.char; if (nativeEvent.which) return String.fromCharCode(nativeEvent.which); } return null; case "compositionend": return useFallbackCompositionData && "ko" !== nativeEvent.locale ? null : nativeEvent.data; default: return null; } } var supportedInputTypes = { color: true, date: true, datetime: true, "datetime-local": true, email: true, month: true, number: true, password: true, range: true, search: true, tel: true, text: true, time: true, url: true, week: true }; function isTextInputElement(elem) { var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); return "input" === nodeName ? !!supportedInputTypes[elem.type] : "textarea" === nodeName ? true : false; } function createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, target) { restoreTarget ? restoreQueue ? restoreQueue.push(target) : restoreQueue = [target] : restoreTarget = target; inst = accumulateTwoPhaseListeners(inst, "onChange"); 0 < inst.length && (nativeEvent = new SyntheticEvent( "onChange", "change", null, nativeEvent, target ), dispatchQueue.push({ event: nativeEvent, listeners: inst })); } var activeElement$1 = null, activeElementInst$1 = null; function runEventInBatch(dispatchQueue) { processDispatchQueue(dispatchQueue, 0); } function getInstIfValueChanged(targetInst) { var targetNode = getNodeFromInstance(targetInst); if (updateValueIfChanged(targetNode)) return targetInst; } function getTargetInstForChangeEvent(domEventName, targetInst) { if ("change" === domEventName) return targetInst; } var isInputEventSupported = false; if (canUseDOM) { var JSCompiler_inline_result$jscomp$286; if (canUseDOM) { var isSupported$jscomp$inline_427 = "oninput" in document; if (!isSupported$jscomp$inline_427) { var element$jscomp$inline_428 = document.createElement("div"); element$jscomp$inline_428.setAttribute("oninput", "return;"); isSupported$jscomp$inline_427 = "function" === typeof element$jscomp$inline_428.oninput; } JSCompiler_inline_result$jscomp$286 = isSupported$jscomp$inline_427; } else JSCompiler_inline_result$jscomp$286 = false; isInputEventSupported = JSCompiler_inline_result$jscomp$286 && (!document.documentMode || 9 < document.documentMode); } function stopWatchingForValueChange() { activeElement$1 && (activeElement$1.detachEvent("onpropertychange", handlePropertyChange), activeElementInst$1 = activeElement$1 = null); } function handlePropertyChange(nativeEvent) { if ("value" === nativeEvent.propertyName && getInstIfValueChanged(activeElementInst$1)) { var dispatchQueue = []; createAndAccumulateChangeEvent( dispatchQueue, activeElementInst$1, nativeEvent, getEventTarget(nativeEvent) ); batchedUpdates$1(runEventInBatch, dispatchQueue); } } function handleEventsForInputEventPolyfill(domEventName, target, targetInst) { "focusin" === domEventName ? (stopWatchingForValueChange(), activeElement$1 = target, activeElementInst$1 = targetInst, activeElement$1.attachEvent("onpropertychange", handlePropertyChange)) : "focusout" === domEventName && stopWatchingForValueChange(); } function getTargetInstForInputEventPolyfill(domEventName) { if ("selectionchange" === domEventName || "keyup" === domEventName || "keydown" === domEventName) return getInstIfValueChanged(activeElementInst$1); } function getTargetInstForClickEvent(domEventName, targetInst) { if ("click" === domEventName) return getInstIfValueChanged(targetInst); } function getTargetInstForInputOrChangeEvent(domEventName, targetInst) { if ("input" === domEventName || "change" === domEventName) return getInstIfValueChanged(targetInst); } function is(x, y) { return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y; } var objectIs = "function" === typeof Object.is ? Object.is : is; function shallowEqual(objA, objB) { if (objectIs(objA, objB)) return true; if ("object" !== typeof objA || null === objA || "object" !== typeof objB || null === objB) return false; var keysA = Object.keys(objA), keysB = Object.keys(objB); if (keysA.length !== keysB.length) return false; for (keysB = 0; keysB < keysA.length; keysB++) { var currentKey = keysA[keysB]; if (!hasOwnProperty.call(objB, currentKey) || !objectIs(objA[currentKey], objB[currentKey])) return false; } return true; } function getLeafNode(node) { for (; node && node.firstChild; ) node = node.firstChild; return node; } function getNodeForCharacterOffset(root2, offset) { var node = getLeafNode(root2); root2 = 0; for (var nodeEnd; node; ) { if (3 === node.nodeType) { nodeEnd = root2 + node.textContent.length; if (root2 <= offset && nodeEnd >= offset) return { node, offset: offset - root2 }; root2 = nodeEnd; } a: { for (; node; ) { if (node.nextSibling) { node = node.nextSibling; break a; } node = node.parentNode; } node = void 0; } node = getLeafNode(node); } } function containsNode(outerNode, innerNode) { return outerNode && innerNode ? outerNode === innerNode ? true : outerNode && 3 === outerNode.nodeType ? false : innerNode && 3 === innerNode.nodeType ? containsNode(outerNode, innerNode.parentNode) : "contains" in outerNode ? outerNode.contains(innerNode) : outerNode.compareDocumentPosition ? !!(outerNode.compareDocumentPosition(innerNode) & 16) : false : false; } function getActiveElementDeep(containerInfo) { containerInfo = null != containerInfo && null != containerInfo.ownerDocument && null != containerInfo.ownerDocument.defaultView ? containerInfo.ownerDocument.defaultView : window; for (var element = getActiveElement(containerInfo.document); element instanceof containerInfo.HTMLIFrameElement; ) { try { var JSCompiler_inline_result = "string" === typeof element.contentWindow.location.href; } catch (err) { JSCompiler_inline_result = false; } if (JSCompiler_inline_result) containerInfo = element.contentWindow; else break; element = getActiveElement(containerInfo.document); } return element; } function hasSelectionCapabilities(elem) { var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); return nodeName && ("input" === nodeName && ("text" === elem.type || "search" === elem.type || "tel" === elem.type || "url" === elem.type || "password" === elem.type) || "textarea" === nodeName || "true" === elem.contentEditable); } var skipSelectionChangeEvent = canUseDOM && "documentMode" in document && 11 >= document.documentMode, activeElement = null, activeElementInst = null, lastSelection = null, mouseDown = false; function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) { var doc = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget.document : 9 === nativeEventTarget.nodeType ? nativeEventTarget : nativeEventTarget.ownerDocument; mouseDown || null == activeElement || activeElement !== getActiveElement(doc) || (doc = activeElement, "selectionStart" in doc && hasSelectionCapabilities(doc) ? doc = { start: doc.selectionStart, end: doc.selectionEnd } : (doc = (doc.ownerDocument && doc.ownerDocument.defaultView || window).getSelection(), doc = { anchorNode: doc.anchorNode, anchorOffset: doc.anchorOffset, focusNode: doc.focusNode, focusOffset: doc.focusOffset }), lastSelection && shallowEqual(lastSelection, doc) || (lastSelection = doc, doc = accumulateTwoPhaseListeners(activeElementInst, "onSelect"), 0 < doc.length && (nativeEvent = new SyntheticEvent( "onSelect", "select", null, nativeEvent, nativeEventTarget ), dispatchQueue.push({ event: nativeEvent, listeners: doc }), nativeEvent.target = activeElement))); } function makePrefixMap(styleProp, eventName) { var prefixes = {}; prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(); prefixes["Webkit" + styleProp] = "webkit" + eventName; prefixes["Moz" + styleProp] = "moz" + eventName; return prefixes; } var vendorPrefixes = { animationend: makePrefixMap("Animation", "AnimationEnd"), animationiteration: makePrefixMap("Animation", "AnimationIteration"), animationstart: makePrefixMap("Animation", "AnimationStart"), transitionrun: makePrefixMap("Transition", "TransitionRun"), transitionstart: makePrefixMap("Transition", "TransitionStart"), transitioncancel: makePrefixMap("Transition", "TransitionCancel"), transitionend: makePrefixMap("Transition", "TransitionEnd") }, prefixedEventNames = {}, style = {}; canUseDOM && (style = document.createElement("div").style, "AnimationEvent" in window || (delete vendorPrefixes.animationend.animation, delete vendorPrefixes.animationiteration.animation, delete vendorPrefixes.animationstart.animation), "TransitionEvent" in window || delete vendorPrefixes.transitionend.transition); function getVendorPrefixedEventName(eventName) { if (prefixedEventNames[eventName]) return prefixedEventNames[eventName]; if (!vendorPrefixes[eventName]) return eventName; var prefixMap = vendorPrefixes[eventName], styleProp; for (styleProp in prefixMap) if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) return prefixedEventNames[eventName] = prefixMap[styleProp]; return eventName; } var ANIMATION_END = getVendorPrefixedEventName("animationend"), ANIMATION_ITERATION = getVendorPrefixedEventName("animationiteration"), ANIMATION_START = getVendorPrefixedEventName("animationstart"), TRANSITION_RUN = getVendorPrefixedEventName("transitionrun"), TRANSITION_START = getVendorPrefixedEventName("transitionstart"), TRANSITION_CANCEL = getVendorPrefixedEventName("transitioncancel"), TRANSITION_END = getVendorPrefixedEventName("transitionend"), topLevelEventsToReactNames = new Map(), simpleEventPluginEvents = "abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split( " " ); simpleEventPluginEvents.push("scrollEnd"); function registerSimpleEvent(domEventName, reactName) { topLevelEventsToReactNames.set(domEventName, reactName); registerTwoPhaseEvent(reactName, [domEventName]); } var reportGlobalError = "function" === typeof reportError ? reportError : function(error) { if ("object" === typeof window && "function" === typeof window.ErrorEvent) { var event = new window.ErrorEvent("error", { bubbles: true, cancelable: true, message: "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error), error }); if (!window.dispatchEvent(event)) return; } else if ("object" === typeof process && "function" === typeof process.emit) { process.emit("uncaughtException", error); return; } console.error(error); }, concurrentQueues = [], concurrentQueuesIndex = 0, concurrentlyUpdatedLanes = 0; function finishQueueingConcurrentUpdates() { for (var endIndex = concurrentQueuesIndex, i = concurrentlyUpdatedLanes = concurrentQueuesIndex = 0; i < endIndex; ) { var fiber = concurrentQueues[i]; concurrentQueues[i++] = null; var queue = concurrentQueues[i]; concurrentQueues[i++] = null; var update = concurrentQueues[i]; concurrentQueues[i++] = null; var lane = concurrentQueues[i]; concurrentQueues[i++] = null; if (null !== queue && null !== update) { var pending = queue.pending; null === pending ? update.next = update : (update.next = pending.next, pending.next = update); queue.pending = update; } 0 !== lane && markUpdateLaneFromFiberToRoot(fiber, update, lane); } } function enqueueUpdate$1(fiber, queue, update, lane) { concurrentQueues[concurrentQueuesIndex++] = fiber; concurrentQueues[concurrentQueuesIndex++] = queue; concurrentQueues[concurrentQueuesIndex++] = update; concurrentQueues[concurrentQueuesIndex++] = lane; concurrentlyUpdatedLanes |= lane; fiber.lanes |= lane; fiber = fiber.alternate; null !== fiber && (fiber.lanes |= lane); } function enqueueConcurrentHookUpdate(fiber, queue, update, lane) { enqueueUpdate$1(fiber, queue, update, lane); return getRootForUpdatedFiber(fiber); } function enqueueConcurrentRenderForLane(fiber, lane) { enqueueUpdate$1(fiber, null, null, lane); return getRootForUpdatedFiber(fiber); } function markUpdateLaneFromFiberToRoot(sourceFiber, update, lane) { sourceFiber.lanes |= lane; var alternate = sourceFiber.alternate; null !== alternate && (alternate.lanes |= lane); for (var isHidden = false, parent = sourceFiber.return; null !== parent; ) parent.childLanes |= lane, alternate = parent.alternate, null !== alternate && (alternate.childLanes |= lane), 22 === parent.tag && (sourceFiber = parent.stateNode, null === sourceFiber || sourceFiber._visibility & 1 || (isHidden = true)), sourceFiber = parent, parent = parent.return; return 3 === sourceFiber.tag ? (parent = sourceFiber.stateNode, isHidden && null !== update && (isHidden = 31 - clz32(lane), sourceFiber = parent.hiddenUpdates, alternate = sourceFiber[isHidden], null === alternate ? sourceFiber[isHidden] = [update] : alternate.push(update), update.lane = lane | 536870912), parent) : null; } function getRootForUpdatedFiber(sourceFiber) { if (50 < nestedUpdateCount) throw nestedUpdateCount = 0, rootWithNestedUpdates = null, Error(formatProdErrorMessage(185)); for (var parent = sourceFiber.return; null !== parent; ) sourceFiber = parent, parent = sourceFiber.return; return 3 === sourceFiber.tag ? sourceFiber.stateNode : null; } var emptyContextObject = {}; function FiberNode(tag, pendingProps, key, mode) { this.tag = tag; this.key = key; this.sibling = this.child = this.return = this.stateNode = this.type = this.elementType = null; this.index = 0; this.refCleanup = this.ref = null; this.pendingProps = pendingProps; this.dependencies = this.memoizedState = this.updateQueue = this.memoizedProps = null; this.mode = mode; this.subtreeFlags = this.flags = 0; this.deletions = null; this.childLanes = this.lanes = 0; this.alternate = null; } function createFiberImplClass(tag, pendingProps, key, mode) { return new FiberNode(tag, pendingProps, key, mode); } function shouldConstruct(Component) { Component = Component.prototype; return !(!Component || !Component.isReactComponent); } function createWorkInProgress(current, pendingProps) { var workInProgress2 = current.alternate; null === workInProgress2 ? (workInProgress2 = createFiberImplClass( current.tag, pendingProps, current.key, current.mode ), workInProgress2.elementType = current.elementType, workInProgress2.type = current.type, workInProgress2.stateNode = current.stateNode, workInProgress2.alternate = current, current.alternate = workInProgress2) : (workInProgress2.pendingProps = pendingProps, workInProgress2.type = current.type, workInProgress2.flags = 0, workInProgress2.subtreeFlags = 0, workInProgress2.deletions = null); workInProgress2.flags = current.flags & 65011712; workInProgress2.childLanes = current.childLanes; workInProgress2.lanes = current.lanes; workInProgress2.child = current.child; workInProgress2.memoizedProps = current.memoizedProps; workInProgress2.memoizedState = current.memoizedState; workInProgress2.updateQueue = current.updateQueue; pendingProps = current.dependencies; workInProgress2.dependencies = null === pendingProps ? null : { lanes: pendingProps.lanes, firstContext: pendingProps.firstContext }; workInProgress2.sibling = current.sibling; workInProgress2.index = current.index; workInProgress2.ref = current.ref; workInProgress2.refCleanup = current.refCleanup; return workInProgress2; } function resetWorkInProgress(workInProgress2, renderLanes2) { workInProgress2.flags &= 65011714; var current = workInProgress2.alternate; null === current ? (workInProgress2.childLanes = 0, workInProgress2.lanes = renderLanes2, workInProgress2.child = null, workInProgress2.subtreeFlags = 0, workInProgress2.memoizedProps = null, workInProgress2.memoizedState = null, workInProgress2.updateQueue = null, workInProgress2.dependencies = null, workInProgress2.stateNode = null) : (workInProgress2.childLanes = current.childLanes, workInProgress2.lanes = current.lanes, workInProgress2.child = current.child, workInProgress2.subtreeFlags = 0, workInProgress2.deletions = null, workInProgress2.memoizedProps = current.memoizedProps, workInProgress2.memoizedState = current.memoizedState, workInProgress2.updateQueue = current.updateQueue, workInProgress2.type = current.type, renderLanes2 = current.dependencies, workInProgress2.dependencies = null === renderLanes2 ? null : { lanes: renderLanes2.lanes, firstContext: renderLanes2.firstContext }); return workInProgress2; } function createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes) { var fiberTag = 0; owner = type; if ("function" === typeof type) shouldConstruct(type) && (fiberTag = 1); else if ("string" === typeof type) fiberTag = isHostHoistableType( type, pendingProps, contextStackCursor.current ) ? 26 : "html" === type || "head" === type || "body" === type ? 27 : 5; else a: switch (type) { case REACT_ACTIVITY_TYPE: return type = createFiberImplClass(31, pendingProps, key, mode), type.elementType = REACT_ACTIVITY_TYPE, type.lanes = lanes, type; case REACT_FRAGMENT_TYPE: return createFiberFromFragment(pendingProps.children, mode, lanes, key); case REACT_STRICT_MODE_TYPE: fiberTag = 8; mode |= 24; break; case REACT_PROFILER_TYPE: return type = createFiberImplClass(12, pendingProps, key, mode | 2), type.elementType = REACT_PROFILER_TYPE, type.lanes = lanes, type; case REACT_SUSPENSE_TYPE: return type = createFiberImplClass(13, pendingProps, key, mode), type.elementType = REACT_SUSPENSE_TYPE, type.lanes = lanes, type; case REACT_SUSPENSE_LIST_TYPE: return type = createFiberImplClass(19, pendingProps, key, mode), type.elementType = REACT_SUSPENSE_LIST_TYPE, type.lanes = lanes, type; default: if ("object" === typeof type && null !== type) switch (type.$$typeof) { case REACT_CONTEXT_TYPE: fiberTag = 10; break a; case REACT_CONSUMER_TYPE: fiberTag = 9; break a; case REACT_FORWARD_REF_TYPE: fiberTag = 11; break a; case REACT_MEMO_TYPE: fiberTag = 14; break a; case REACT_LAZY_TYPE: fiberTag = 16; owner = null; break a; } fiberTag = 29; pendingProps = Error( formatProdErrorMessage(130, null === type ? "null" : typeof type, "") ); owner = null; } key = createFiberImplClass(fiberTag, pendingProps, key, mode); key.elementType = type; key.type = owner; key.lanes = lanes; return key; } function createFiberFromFragment(elements, mode, lanes, key) { elements = createFiberImplClass(7, elements, key, mode); elements.lanes = lanes; return elements; } function createFiberFromText(content, mode, lanes) { content = createFiberImplClass(6, content, null, mode); content.lanes = lanes; return content; } function createFiberFromDehydratedFragment(dehydratedNode) { var fiber = createFiberImplClass(18, null, null, 0); fiber.stateNode = dehydratedNode; return fiber; } function createFiberFromPortal(portal, mode, lanes) { mode = createFiberImplClass( 4, null !== portal.children ? portal.children : [], portal.key, mode ); mode.lanes = lanes; mode.stateNode = { containerInfo: portal.containerInfo, pendingChildren: null, implementation: portal.implementation }; return mode; } var CapturedStacks = new WeakMap(); function createCapturedValueAtFiber(value, source) { if ("object" === typeof value && null !== value) { var existing = CapturedStacks.get(value); if (void 0 !== existing) return existing; source = { value, source, stack: getStackByFiberInDevAndProd(source) }; CapturedStacks.set(value, source); return source; } return { value, source, stack: getStackByFiberInDevAndProd(source) }; } var forkStack = [], forkStackIndex = 0, treeForkProvider = null, treeForkCount = 0, idStack = [], idStackIndex = 0, treeContextProvider = null, treeContextId = 1, treeContextOverflow = ""; function pushTreeFork(workInProgress2, totalChildren) { forkStack[forkStackIndex++] = treeForkCount; forkStack[forkStackIndex++] = treeForkProvider; treeForkProvider = workInProgress2; treeForkCount = totalChildren; } function pushTreeId(workInProgress2, totalChildren, index2) { idStack[idStackIndex++] = treeContextId; idStack[idStackIndex++] = treeContextOverflow; idStack[idStackIndex++] = treeContextProvider; treeContextProvider = workInProgress2; var baseIdWithLeadingBit = treeContextId; workInProgress2 = treeContextOverflow; var baseLength = 32 - clz32(baseIdWithLeadingBit) - 1; baseIdWithLeadingBit &= ~(1 << baseLength); index2 += 1; var length = 32 - clz32(totalChildren) + baseLength; if (30 < length) { var numberOfOverflowBits = baseLength - baseLength % 5; length = (baseIdWithLeadingBit & (1 << numberOfOverflowBits) - 1).toString(32); baseIdWithLeadingBit >>= numberOfOverflowBits; baseLength -= numberOfOverflowBits; treeContextId = 1 << 32 - clz32(totalChildren) + baseLength | index2 << baseLength | baseIdWithLeadingBit; treeContextOverflow = length + workInProgress2; } else treeContextId = 1 << length | index2 << baseLength | baseIdWithLeadingBit, treeContextOverflow = workInProgress2; } function pushMaterializedTreeId(workInProgress2) { null !== workInProgress2.return && (pushTreeFork(workInProgress2, 1), pushTreeId(workInProgress2, 1, 0)); } function popTreeContext(workInProgress2) { for (; workInProgress2 === treeForkProvider; ) treeForkProvider = forkStack[--forkStackIndex], forkStack[forkStackIndex] = null, treeForkCount = forkStack[--forkStackIndex], forkStack[forkStackIndex] = null; for (; workInProgress2 === treeContextProvider; ) treeContextProvider = idStack[--idStackIndex], idStack[idStackIndex] = null, treeContextOverflow = idStack[--idStackIndex], idStack[idStackIndex] = null, treeContextId = idStack[--idStackIndex], idStack[idStackIndex] = null; } function restoreSuspendedTreeContext(workInProgress2, suspendedContext) { idStack[idStackIndex++] = treeContextId; idStack[idStackIndex++] = treeContextOverflow; idStack[idStackIndex++] = treeContextProvider; treeContextId = suspendedContext.id; treeContextOverflow = suspendedContext.overflow; treeContextProvider = workInProgress2; } var hydrationParentFiber = null, nextHydratableInstance = null, isHydrating = false, hydrationErrors = null, rootOrSingletonContext = false, HydrationMismatchException = Error(formatProdErrorMessage(519)); function throwOnHydrationMismatch(fiber) { var error = Error( formatProdErrorMessage( 418, 1 < arguments.length && void 0 !== arguments[1] && arguments[1] ? "text" : "HTML", "" ) ); queueHydrationError(createCapturedValueAtFiber(error, fiber)); throw HydrationMismatchException; } function prepareToHydrateHostInstance(fiber) { var instance = fiber.stateNode, type = fiber.type, props = fiber.memoizedProps; instance[internalInstanceKey] = fiber; instance[internalPropsKey] = props; switch (type) { case "dialog": listenToNonDelegatedEvent("cancel", instance); listenToNonDelegatedEvent("close", instance); break; case "iframe": case "object": case "embed": listenToNonDelegatedEvent("load", instance); break; case "video": case "audio": for (type = 0; type < mediaEventTypes.length; type++) listenToNonDelegatedEvent(mediaEventTypes[type], instance); break; case "source": listenToNonDelegatedEvent("error", instance); break; case "img": case "image": case "link": listenToNonDelegatedEvent("error", instance); listenToNonDelegatedEvent("load", instance); break; case "details": listenToNonDelegatedEvent("toggle", instance); break; case "input": listenToNonDelegatedEvent("invalid", instance); initInput( instance, props.value, props.defaultValue, props.checked, props.defaultChecked, props.type, props.name, true ); break; case "select": listenToNonDelegatedEvent("invalid", instance); break; case "textarea": listenToNonDelegatedEvent("invalid", instance), initTextarea(instance, props.value, props.defaultValue, props.children); } type = props.children; "string" !== typeof type && "number" !== typeof type && "bigint" !== typeof type || instance.textContent === "" + type || true === props.suppressHydrationWarning || checkForUnmatchedText(instance.textContent, type) ? (null != props.popover && (listenToNonDelegatedEvent("beforetoggle", instance), listenToNonDelegatedEvent("toggle", instance)), null != props.onScroll && listenToNonDelegatedEvent("scroll", instance), null != props.onScrollEnd && listenToNonDelegatedEvent("scrollend", instance), null != props.onClick && (instance.onclick = noop$1), instance = true) : instance = false; instance || throwOnHydrationMismatch(fiber, true); } function popToNextHostParent(fiber) { for (hydrationParentFiber = fiber.return; hydrationParentFiber; ) switch (hydrationParentFiber.tag) { case 5: case 31: case 13: rootOrSingletonContext = false; return; case 27: case 3: rootOrSingletonContext = true; return; default: hydrationParentFiber = hydrationParentFiber.return; } } function popHydrationState(fiber) { if (fiber !== hydrationParentFiber) return false; if (!isHydrating) return popToNextHostParent(fiber), isHydrating = true, false; var tag = fiber.tag, JSCompiler_temp; if (JSCompiler_temp = 3 !== tag && 27 !== tag) { if (JSCompiler_temp = 5 === tag) JSCompiler_temp = fiber.type, JSCompiler_temp = !("form" !== JSCompiler_temp && "button" !== JSCompiler_temp) || shouldSetTextContent(fiber.type, fiber.memoizedProps); JSCompiler_temp = !JSCompiler_temp; } JSCompiler_temp && nextHydratableInstance && throwOnHydrationMismatch(fiber); popToNextHostParent(fiber); if (13 === tag) { fiber = fiber.memoizedState; fiber = null !== fiber ? fiber.dehydrated : null; if (!fiber) throw Error(formatProdErrorMessage(317)); nextHydratableInstance = getNextHydratableInstanceAfterHydrationBoundary(fiber); } else if (31 === tag) { fiber = fiber.memoizedState; fiber = null !== fiber ? fiber.dehydrated : null; if (!fiber) throw Error(formatProdErrorMessage(317)); nextHydratableInstance = getNextHydratableInstanceAfterHydrationBoundary(fiber); } else 27 === tag ? (tag = nextHydratableInstance, isSingletonScope(fiber.type) ? (fiber = previousHydratableOnEnteringScopedSingleton, previousHydratableOnEnteringScopedSingleton = null, nextHydratableInstance = fiber) : nextHydratableInstance = tag) : nextHydratableInstance = hydrationParentFiber ? getNextHydratable(fiber.stateNode.nextSibling) : null; return true; } function resetHydrationState() { nextHydratableInstance = hydrationParentFiber = null; isHydrating = false; } function upgradeHydrationErrorsToRecoverable() { var queuedErrors = hydrationErrors; null !== queuedErrors && (null === workInProgressRootRecoverableErrors ? workInProgressRootRecoverableErrors = queuedErrors : workInProgressRootRecoverableErrors.push.apply( workInProgressRootRecoverableErrors, queuedErrors ), hydrationErrors = null); return queuedErrors; } function queueHydrationError(error) { null === hydrationErrors ? hydrationErrors = [error] : hydrationErrors.push(error); } var valueCursor = createCursor(null), currentlyRenderingFiber$1 = null, lastContextDependency = null; function pushProvider(providerFiber, context, nextValue) { push(valueCursor, context._currentValue); context._currentValue = nextValue; } function popProvider(context) { context._currentValue = valueCursor.current; pop(valueCursor); } function scheduleContextWorkOnParentPath(parent, renderLanes2, propagationRoot) { for (; null !== parent; ) { var alternate = parent.alternate; (parent.childLanes & renderLanes2) !== renderLanes2 ? (parent.childLanes |= renderLanes2, null !== alternate && (alternate.childLanes |= renderLanes2)) : null !== alternate && (alternate.childLanes & renderLanes2) !== renderLanes2 && (alternate.childLanes |= renderLanes2); if (parent === propagationRoot) break; parent = parent.return; } } function propagateContextChanges(workInProgress2, contexts, renderLanes2, forcePropagateEntireTree) { var fiber = workInProgress2.child; null !== fiber && (fiber.return = workInProgress2); for (; null !== fiber; ) { var list = fiber.dependencies; if (null !== list) { var nextFiber = fiber.child; list = list.firstContext; a: for (; null !== list; ) { var dependency = list; list = fiber; for (var i = 0; i < contexts.length; i++) if (dependency.context === contexts[i]) { list.lanes |= renderLanes2; dependency = list.alternate; null !== dependency && (dependency.lanes |= renderLanes2); scheduleContextWorkOnParentPath( list.return, renderLanes2, workInProgress2 ); forcePropagateEntireTree || (nextFiber = null); break a; } list = dependency.next; } } else if (18 === fiber.tag) { nextFiber = fiber.return; if (null === nextFiber) throw Error(formatProdErrorMessage(341)); nextFiber.lanes |= renderLanes2; list = nextFiber.alternate; null !== list && (list.lanes |= renderLanes2); scheduleContextWorkOnParentPath(nextFiber, renderLanes2, workInProgress2); nextFiber = null; } else nextFiber = fiber.child; if (null !== nextFiber) nextFiber.return = fiber; else for (nextFiber = fiber; null !== nextFiber; ) { if (nextFiber === workInProgress2) { nextFiber = null; break; } fiber = nextFiber.sibling; if (null !== fiber) { fiber.return = nextFiber.return; nextFiber = fiber; break; } nextFiber = nextFiber.return; } fiber = nextFiber; } } function propagateParentContextChanges(current, workInProgress2, renderLanes2, forcePropagateEntireTree) { current = null; for (var parent = workInProgress2, isInsidePropagationBailout = false; null !== parent; ) { if (!isInsidePropagationBailout) { if (0 !== (parent.flags & 524288)) isInsidePropagationBailout = true; else if (0 !== (parent.flags & 262144)) break; } if (10 === parent.tag) { var currentParent = parent.alternate; if (null === currentParent) throw Error(formatProdErrorMessage(387)); currentParent = currentParent.memoizedProps; if (null !== currentParent) { var context = parent.type; objectIs(parent.pendingProps.value, currentParent.value) || (null !== current ? current.push(context) : current = [context]); } } else if (parent === hostTransitionProviderCursor.current) { currentParent = parent.alternate; if (null === currentParent) throw Error(formatProdErrorMessage(387)); currentParent.memoizedState.memoizedState !== parent.memoizedState.memoizedState && (null !== current ? current.push(HostTransitionContext) : current = [HostTransitionContext]); } parent = parent.return; } null !== current && propagateContextChanges( workInProgress2, current, renderLanes2, forcePropagateEntireTree ); workInProgress2.flags |= 262144; } function checkIfContextChanged(currentDependencies) { for (currentDependencies = currentDependencies.firstContext; null !== currentDependencies; ) { if (!objectIs( currentDependencies.context._currentValue, currentDependencies.memoizedValue )) return true; currentDependencies = currentDependencies.next; } return false; } function prepareToReadContext(workInProgress2) { currentlyRenderingFiber$1 = workInProgress2; lastContextDependency = null; workInProgress2 = workInProgress2.dependencies; null !== workInProgress2 && (workInProgress2.firstContext = null); } function readContext(context) { return readContextForConsumer(currentlyRenderingFiber$1, context); } function readContextDuringReconciliation(consumer, context) { null === currentlyRenderingFiber$1 && prepareToReadContext(consumer); return readContextForConsumer(consumer, context); } function readContextForConsumer(consumer, context) { var value = context._currentValue; context = { context, memoizedValue: value, next: null }; if (null === lastContextDependency) { if (null === consumer) throw Error(formatProdErrorMessage(308)); lastContextDependency = context; consumer.dependencies = { lanes: 0, firstContext: context }; consumer.flags |= 524288; } else lastContextDependency = lastContextDependency.next = context; return value; } var AbortControllerLocal = "undefined" !== typeof AbortController ? AbortController : function() { var listeners = [], signal = this.signal = { aborted: false, addEventListener: function(type, listener) { listeners.push(listener); } }; this.abort = function() { signal.aborted = true; listeners.forEach(function(listener) { return listener(); }); }; }, scheduleCallback$2 = Scheduler.unstable_scheduleCallback, NormalPriority = Scheduler.unstable_NormalPriority, CacheContext = { $$typeof: REACT_CONTEXT_TYPE, Consumer: null, Provider: null, _currentValue: null, _currentValue2: null, _threadCount: 0 }; function createCache() { return { controller: new AbortControllerLocal(), data: new Map(), refCount: 0 }; } function releaseCache(cache) { cache.refCount--; 0 === cache.refCount && scheduleCallback$2(NormalPriority, function() { cache.controller.abort(); }); } var currentEntangledListeners = null, currentEntangledPendingCount = 0, currentEntangledLane = 0, currentEntangledActionThenable = null; function entangleAsyncAction(transition, thenable) { if (null === currentEntangledListeners) { var entangledListeners = currentEntangledListeners = []; currentEntangledPendingCount = 0; currentEntangledLane = requestTransitionLane(); currentEntangledActionThenable = { status: "pending", value: void 0, then: function(resolve) { entangledListeners.push(resolve); } }; } currentEntangledPendingCount++; thenable.then(pingEngtangledActionScope, pingEngtangledActionScope); return thenable; } function pingEngtangledActionScope() { if (0 === --currentEntangledPendingCount && null !== currentEntangledListeners) { null !== currentEntangledActionThenable && (currentEntangledActionThenable.status = "fulfilled"); var listeners = currentEntangledListeners; currentEntangledListeners = null; currentEntangledLane = 0; currentEntangledActionThenable = null; for (var i = 0; i < listeners.length; i++) (0, listeners[i])(); } } function chainThenableValue(thenable, result) { var listeners = [], thenableWithOverride = { status: "pending", value: null, reason: null, then: function(resolve) { listeners.push(resolve); } }; thenable.then( function() { thenableWithOverride.status = "fulfilled"; thenableWithOverride.value = result; for (var i = 0; i < listeners.length; i++) (0, listeners[i])(result); }, function(error) { thenableWithOverride.status = "rejected"; thenableWithOverride.reason = error; for (error = 0; error < listeners.length; error++) (0, listeners[error])(void 0); } ); return thenableWithOverride; } var prevOnStartTransitionFinish = ReactSharedInternals.S; ReactSharedInternals.S = function(transition, returnValue) { globalMostRecentTransitionTime = now(); "object" === typeof returnValue && null !== returnValue && "function" === typeof returnValue.then && entangleAsyncAction(transition, returnValue); null !== prevOnStartTransitionFinish && prevOnStartTransitionFinish(transition, returnValue); }; var resumedCache = createCursor(null); function peekCacheFromPool() { var cacheResumedFromPreviousRender = resumedCache.current; return null !== cacheResumedFromPreviousRender ? cacheResumedFromPreviousRender : workInProgressRoot.pooledCache; } function pushTransition(offscreenWorkInProgress, prevCachePool) { null === prevCachePool ? push(resumedCache, resumedCache.current) : push(resumedCache, prevCachePool.pool); } function getSuspendedCache() { var cacheFromPool = peekCacheFromPool(); return null === cacheFromPool ? null : { parent: CacheContext._currentValue, pool: cacheFromPool }; } var SuspenseException = Error(formatProdErrorMessage(460)), SuspenseyCommitException = Error(formatProdErrorMessage(474)), SuspenseActionException = Error(formatProdErrorMessage(542)), noopSuspenseyCommitThenable = { then: function() { } }; function isThenableResolved(thenable) { thenable = thenable.status; return "fulfilled" === thenable || "rejected" === thenable; } function trackUsedThenable(thenableState2, thenable, index2) { index2 = thenableState2[index2]; void 0 === index2 ? thenableState2.push(thenable) : index2 !== thenable && (thenable.then(noop$1, noop$1), thenable = index2); switch (thenable.status) { case "fulfilled": return thenable.value; case "rejected": throw thenableState2 = thenable.reason, checkIfUseWrappedInAsyncCatch(thenableState2), thenableState2; default: if ("string" === typeof thenable.status) thenable.then(noop$1, noop$1); else { thenableState2 = workInProgressRoot; if (null !== thenableState2 && 100 < thenableState2.shellSuspendCounter) throw Error(formatProdErrorMessage(482)); thenableState2 = thenable; thenableState2.status = "pending"; thenableState2.then( function(fulfilledValue) { if ("pending" === thenable.status) { var fulfilledThenable = thenable; fulfilledThenable.status = "fulfilled"; fulfilledThenable.value = fulfilledValue; } }, function(error) { if ("pending" === thenable.status) { var rejectedThenable = thenable; rejectedThenable.status = "rejected"; rejectedThenable.reason = error; } } ); } switch (thenable.status) { case "fulfilled": return thenable.value; case "rejected": throw thenableState2 = thenable.reason, checkIfUseWrappedInAsyncCatch(thenableState2), thenableState2; } suspendedThenable = thenable; throw SuspenseException; } } function resolveLazy(lazyType) { try { var init = lazyType._init; return init(lazyType._payload); } catch (x) { if (null !== x && "object" === typeof x && "function" === typeof x.then) throw suspendedThenable = x, SuspenseException; throw x; } } var suspendedThenable = null; function getSuspendedThenable() { if (null === suspendedThenable) throw Error(formatProdErrorMessage(459)); var thenable = suspendedThenable; suspendedThenable = null; return thenable; } function checkIfUseWrappedInAsyncCatch(rejectedReason) { if (rejectedReason === SuspenseException || rejectedReason === SuspenseActionException) throw Error(formatProdErrorMessage(483)); } var thenableState$1 = null, thenableIndexCounter$1 = 0; function unwrapThenable(thenable) { var index2 = thenableIndexCounter$1; thenableIndexCounter$1 += 1; null === thenableState$1 && (thenableState$1 = []); return trackUsedThenable(thenableState$1, thenable, index2); } function coerceRef(workInProgress2, element) { element = element.props.ref; workInProgress2.ref = void 0 !== element ? element : null; } function throwOnInvalidObjectTypeImpl(returnFiber, newChild) { if (newChild.$$typeof === REACT_LEGACY_ELEMENT_TYPE) throw Error(formatProdErrorMessage(525)); returnFiber = Object.prototype.toString.call(newChild); throw Error( formatProdErrorMessage( 31, "[object Object]" === returnFiber ? "object with keys {" + Object.keys(newChild).join(", ") + "}" : returnFiber ) ); } function createChildReconciler(shouldTrackSideEffects) { function deleteChild(returnFiber, childToDelete) { if (shouldTrackSideEffects) { var deletions = returnFiber.deletions; null === deletions ? (returnFiber.deletions = [childToDelete], returnFiber.flags |= 16) : deletions.push(childToDelete); } } function deleteRemainingChildren(returnFiber, currentFirstChild) { if (!shouldTrackSideEffects) return null; for (; null !== currentFirstChild; ) deleteChild(returnFiber, currentFirstChild), currentFirstChild = currentFirstChild.sibling; return null; } function mapRemainingChildren(currentFirstChild) { for (var existingChildren = new Map(); null !== currentFirstChild; ) null !== currentFirstChild.key ? existingChildren.set(currentFirstChild.key, currentFirstChild) : existingChildren.set(currentFirstChild.index, currentFirstChild), currentFirstChild = currentFirstChild.sibling; return existingChildren; } function useFiber(fiber, pendingProps) { fiber = createWorkInProgress(fiber, pendingProps); fiber.index = 0; fiber.sibling = null; return fiber; } function placeChild(newFiber, lastPlacedIndex, newIndex) { newFiber.index = newIndex; if (!shouldTrackSideEffects) return newFiber.flags |= 1048576, lastPlacedIndex; newIndex = newFiber.alternate; if (null !== newIndex) return newIndex = newIndex.index, newIndex < lastPlacedIndex ? (newFiber.flags |= 67108866, lastPlacedIndex) : newIndex; newFiber.flags |= 67108866; return lastPlacedIndex; } function placeSingleChild(newFiber) { shouldTrackSideEffects && null === newFiber.alternate && (newFiber.flags |= 67108866); return newFiber; } function updateTextNode(returnFiber, current, textContent, lanes) { if (null === current || 6 !== current.tag) return current = createFiberFromText(textContent, returnFiber.mode, lanes), current.return = returnFiber, current; current = useFiber(current, textContent); current.return = returnFiber; return current; } function updateElement(returnFiber, current, element, lanes) { var elementType = element.type; if (elementType === REACT_FRAGMENT_TYPE) return updateFragment( returnFiber, current, element.props.children, lanes, element.key ); if (null !== current && (current.elementType === elementType || "object" === typeof elementType && null !== elementType && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === current.type)) return current = useFiber(current, element.props), coerceRef(current, element), current.return = returnFiber, current; current = createFiberFromTypeAndProps( element.type, element.key, element.props, null, returnFiber.mode, lanes ); coerceRef(current, element); current.return = returnFiber; return current; } function updatePortal(returnFiber, current, portal, lanes) { if (null === current || 4 !== current.tag || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) return current = createFiberFromPortal(portal, returnFiber.mode, lanes), current.return = returnFiber, current; current = useFiber(current, portal.children || []); current.return = returnFiber; return current; } function updateFragment(returnFiber, current, fragment, lanes, key) { if (null === current || 7 !== current.tag) return current = createFiberFromFragment( fragment, returnFiber.mode, lanes, key ), current.return = returnFiber, current; current = useFiber(current, fragment); current.return = returnFiber; return current; } function createChild(returnFiber, newChild, lanes) { if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return newChild = createFiberFromText( "" + newChild, returnFiber.mode, lanes ), newChild.return = returnFiber, newChild; if ("object" === typeof newChild && null !== newChild) { switch (newChild.$$typeof) { case REACT_ELEMENT_TYPE: return lanes = createFiberFromTypeAndProps( newChild.type, newChild.key, newChild.props, null, returnFiber.mode, lanes ), coerceRef(lanes, newChild), lanes.return = returnFiber, lanes; case REACT_PORTAL_TYPE: return newChild = createFiberFromPortal( newChild, returnFiber.mode, lanes ), newChild.return = returnFiber, newChild; case REACT_LAZY_TYPE: return newChild = resolveLazy(newChild), createChild(returnFiber, newChild, lanes); } if (isArrayImpl(newChild) || getIteratorFn(newChild)) return newChild = createFiberFromFragment( newChild, returnFiber.mode, lanes, null ), newChild.return = returnFiber, newChild; if ("function" === typeof newChild.then) return createChild(returnFiber, unwrapThenable(newChild), lanes); if (newChild.$$typeof === REACT_CONTEXT_TYPE) return createChild( returnFiber, readContextDuringReconciliation(returnFiber, newChild), lanes ); throwOnInvalidObjectTypeImpl(returnFiber, newChild); } return null; } function updateSlot(returnFiber, oldFiber, newChild, lanes) { var key = null !== oldFiber ? oldFiber.key : null; if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return null !== key ? null : updateTextNode(returnFiber, oldFiber, "" + newChild, lanes); if ("object" === typeof newChild && null !== newChild) { switch (newChild.$$typeof) { case REACT_ELEMENT_TYPE: return newChild.key === key ? updateElement(returnFiber, oldFiber, newChild, lanes) : null; case REACT_PORTAL_TYPE: return newChild.key === key ? updatePortal(returnFiber, oldFiber, newChild, lanes) : null; case REACT_LAZY_TYPE: return newChild = resolveLazy(newChild), updateSlot(returnFiber, oldFiber, newChild, lanes); } if (isArrayImpl(newChild) || getIteratorFn(newChild)) return null !== key ? null : updateFragment(returnFiber, oldFiber, newChild, lanes, null); if ("function" === typeof newChild.then) return updateSlot( returnFiber, oldFiber, unwrapThenable(newChild), lanes ); if (newChild.$$typeof === REACT_CONTEXT_TYPE) return updateSlot( returnFiber, oldFiber, readContextDuringReconciliation(returnFiber, newChild), lanes ); throwOnInvalidObjectTypeImpl(returnFiber, newChild); } return null; } function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) { if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return existingChildren = existingChildren.get(newIdx) || null, updateTextNode(returnFiber, existingChildren, "" + newChild, lanes); if ("object" === typeof newChild && null !== newChild) { switch (newChild.$$typeof) { case REACT_ELEMENT_TYPE: return existingChildren = existingChildren.get( null === newChild.key ? newIdx : newChild.key ) || null, updateElement(returnFiber, existingChildren, newChild, lanes); case REACT_PORTAL_TYPE: return existingChildren = existingChildren.get( null === newChild.key ? newIdx : newChild.key ) || null, updatePortal(returnFiber, existingChildren, newChild, lanes); case REACT_LAZY_TYPE: return newChild = resolveLazy(newChild), updateFromMap( existingChildren, returnFiber, newIdx, newChild, lanes ); } if (isArrayImpl(newChild) || getIteratorFn(newChild)) return existingChildren = existingChildren.get(newIdx) || null, updateFragment(returnFiber, existingChildren, newChild, lanes, null); if ("function" === typeof newChild.then) return updateFromMap( existingChildren, returnFiber, newIdx, unwrapThenable(newChild), lanes ); if (newChild.$$typeof === REACT_CONTEXT_TYPE) return updateFromMap( existingChildren, returnFiber, newIdx, readContextDuringReconciliation(returnFiber, newChild), lanes ); throwOnInvalidObjectTypeImpl(returnFiber, newChild); } return null; } function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) { for (var resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, newIdx = currentFirstChild = 0, nextOldFiber = null; null !== oldFiber && newIdx < newChildren.length; newIdx++) { oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling; var newFiber = updateSlot( returnFiber, oldFiber, newChildren[newIdx], lanes ); if (null === newFiber) { null === oldFiber && (oldFiber = nextOldFiber); break; } shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber); currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx); null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber; previousNewFiber = newFiber; oldFiber = nextOldFiber; } if (newIdx === newChildren.length) return deleteRemainingChildren(returnFiber, oldFiber), isHydrating && pushTreeFork(returnFiber, newIdx), resultingFirstChild; if (null === oldFiber) { for (; newIdx < newChildren.length; newIdx++) oldFiber = createChild(returnFiber, newChildren[newIdx], lanes), null !== oldFiber && (currentFirstChild = placeChild( oldFiber, currentFirstChild, newIdx ), null === previousNewFiber ? resultingFirstChild = oldFiber : previousNewFiber.sibling = oldFiber, previousNewFiber = oldFiber); isHydrating && pushTreeFork(returnFiber, newIdx); return resultingFirstChild; } for (oldFiber = mapRemainingChildren(oldFiber); newIdx < newChildren.length; newIdx++) nextOldFiber = updateFromMap( oldFiber, returnFiber, newIdx, newChildren[newIdx], lanes ), null !== nextOldFiber && (shouldTrackSideEffects && null !== nextOldFiber.alternate && oldFiber.delete( null === nextOldFiber.key ? newIdx : nextOldFiber.key ), currentFirstChild = placeChild( nextOldFiber, currentFirstChild, newIdx ), null === previousNewFiber ? resultingFirstChild = nextOldFiber : previousNewFiber.sibling = nextOldFiber, previousNewFiber = nextOldFiber); shouldTrackSideEffects && oldFiber.forEach(function(child) { return deleteChild(returnFiber, child); }); isHydrating && pushTreeFork(returnFiber, newIdx); return resultingFirstChild; } function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildren, lanes) { if (null == newChildren) throw Error(formatProdErrorMessage(151)); for (var resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, newIdx = currentFirstChild = 0, nextOldFiber = null, step = newChildren.next(); null !== oldFiber && !step.done; newIdx++, step = newChildren.next()) { oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling; var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes); if (null === newFiber) { null === oldFiber && (oldFiber = nextOldFiber); break; } shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber); currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx); null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber; previousNewFiber = newFiber; oldFiber = nextOldFiber; } if (step.done) return deleteRemainingChildren(returnFiber, oldFiber), isHydrating && pushTreeFork(returnFiber, newIdx), resultingFirstChild; if (null === oldFiber) { for (; !step.done; newIdx++, step = newChildren.next()) step = createChild(returnFiber, step.value, lanes), null !== step && (currentFirstChild = placeChild(step, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = step : previousNewFiber.sibling = step, previousNewFiber = step); isHydrating && pushTreeFork(returnFiber, newIdx); return resultingFirstChild; } for (oldFiber = mapRemainingChildren(oldFiber); !step.done; newIdx++, step = newChildren.next()) step = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes), null !== step && (shouldTrackSideEffects && null !== step.alternate && oldFiber.delete(null === step.key ? newIdx : step.key), currentFirstChild = placeChild(step, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = step : previousNewFiber.sibling = step, previousNewFiber = step); shouldTrackSideEffects && oldFiber.forEach(function(child) { return deleteChild(returnFiber, child); }); isHydrating && pushTreeFork(returnFiber, newIdx); return resultingFirstChild; } function reconcileChildFibersImpl(returnFiber, currentFirstChild, newChild, lanes) { "object" === typeof newChild && null !== newChild && newChild.type === REACT_FRAGMENT_TYPE && null === newChild.key && (newChild = newChild.props.children); if ("object" === typeof newChild && null !== newChild) { switch (newChild.$$typeof) { case REACT_ELEMENT_TYPE: a: { for (var key = newChild.key; null !== currentFirstChild; ) { if (currentFirstChild.key === key) { key = newChild.type; if (key === REACT_FRAGMENT_TYPE) { if (7 === currentFirstChild.tag) { deleteRemainingChildren( returnFiber, currentFirstChild.sibling ); lanes = useFiber( currentFirstChild, newChild.props.children ); lanes.return = returnFiber; returnFiber = lanes; break a; } } else if (currentFirstChild.elementType === key || "object" === typeof key && null !== key && key.$$typeof === REACT_LAZY_TYPE && resolveLazy(key) === currentFirstChild.type) { deleteRemainingChildren( returnFiber, currentFirstChild.sibling ); lanes = useFiber(currentFirstChild, newChild.props); coerceRef(lanes, newChild); lanes.return = returnFiber; returnFiber = lanes; break a; } deleteRemainingChildren(returnFiber, currentFirstChild); break; } else deleteChild(returnFiber, currentFirstChild); currentFirstChild = currentFirstChild.sibling; } newChild.type === REACT_FRAGMENT_TYPE ? (lanes = createFiberFromFragment( newChild.props.children, returnFiber.mode, lanes, newChild.key ), lanes.return = returnFiber, returnFiber = lanes) : (lanes = createFiberFromTypeAndProps( newChild.type, newChild.key, newChild.props, null, returnFiber.mode, lanes ), coerceRef(lanes, newChild), lanes.return = returnFiber, returnFiber = lanes); } return placeSingleChild(returnFiber); case REACT_PORTAL_TYPE: a: { for (key = newChild.key; null !== currentFirstChild; ) { if (currentFirstChild.key === key) if (4 === currentFirstChild.tag && currentFirstChild.stateNode.containerInfo === newChild.containerInfo && currentFirstChild.stateNode.implementation === newChild.implementation) { deleteRemainingChildren( returnFiber, currentFirstChild.sibling ); lanes = useFiber(currentFirstChild, newChild.children || []); lanes.return = returnFiber; returnFiber = lanes; break a; } else { deleteRemainingChildren(returnFiber, currentFirstChild); break; } else deleteChild(returnFiber, currentFirstChild); currentFirstChild = currentFirstChild.sibling; } lanes = createFiberFromPortal(newChild, returnFiber.mode, lanes); lanes.return = returnFiber; returnFiber = lanes; } return placeSingleChild(returnFiber); case REACT_LAZY_TYPE: return newChild = resolveLazy(newChild), reconcileChildFibersImpl( returnFiber, currentFirstChild, newChild, lanes ); } if (isArrayImpl(newChild)) return reconcileChildrenArray( returnFiber, currentFirstChild, newChild, lanes ); if (getIteratorFn(newChild)) { key = getIteratorFn(newChild); if ("function" !== typeof key) throw Error(formatProdErrorMessage(150)); newChild = key.call(newChild); return reconcileChildrenIterator( returnFiber, currentFirstChild, newChild, lanes ); } if ("function" === typeof newChild.then) return reconcileChildFibersImpl( returnFiber, currentFirstChild, unwrapThenable(newChild), lanes ); if (newChild.$$typeof === REACT_CONTEXT_TYPE) return reconcileChildFibersImpl( returnFiber, currentFirstChild, readContextDuringReconciliation(returnFiber, newChild), lanes ); throwOnInvalidObjectTypeImpl(returnFiber, newChild); } return "string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild ? (newChild = "" + newChild, null !== currentFirstChild && 6 === currentFirstChild.tag ? (deleteRemainingChildren(returnFiber, currentFirstChild.sibling), lanes = useFiber(currentFirstChild, newChild), lanes.return = returnFiber, returnFiber = lanes) : (deleteRemainingChildren(returnFiber, currentFirstChild), lanes = createFiberFromText(newChild, returnFiber.mode, lanes), lanes.return = returnFiber, returnFiber = lanes), placeSingleChild(returnFiber)) : deleteRemainingChildren(returnFiber, currentFirstChild); } return function(returnFiber, currentFirstChild, newChild, lanes) { try { thenableIndexCounter$1 = 0; var firstChildFiber = reconcileChildFibersImpl( returnFiber, currentFirstChild, newChild, lanes ); thenableState$1 = null; return firstChildFiber; } catch (x) { if (x === SuspenseException || x === SuspenseActionException) throw x; var fiber = createFiberImplClass(29, x, null, returnFiber.mode); fiber.lanes = lanes; fiber.return = returnFiber; return fiber; } finally { } }; } var reconcileChildFibers = createChildReconciler(true), mountChildFibers = createChildReconciler(false), hasForceUpdate = false; function initializeUpdateQueue(fiber) { fiber.updateQueue = { baseState: fiber.memoizedState, firstBaseUpdate: null, lastBaseUpdate: null, shared: { pending: null, lanes: 0, hiddenCallbacks: null }, callbacks: null }; } function cloneUpdateQueue(current, workInProgress2) { current = current.updateQueue; workInProgress2.updateQueue === current && (workInProgress2.updateQueue = { baseState: current.baseState, firstBaseUpdate: current.firstBaseUpdate, lastBaseUpdate: current.lastBaseUpdate, shared: current.shared, callbacks: null }); } function createUpdate(lane) { return { lane, tag: 0, payload: null, callback: null, next: null }; } function enqueueUpdate(fiber, update, lane) { var updateQueue = fiber.updateQueue; if (null === updateQueue) return null; updateQueue = updateQueue.shared; if (0 !== (executionContext & 2)) { var pending = updateQueue.pending; null === pending ? update.next = update : (update.next = pending.next, pending.next = update); updateQueue.pending = update; update = getRootForUpdatedFiber(fiber); markUpdateLaneFromFiberToRoot(fiber, null, lane); return update; } enqueueUpdate$1(fiber, updateQueue, update, lane); return getRootForUpdatedFiber(fiber); } function entangleTransitions(root2, fiber, lane) { fiber = fiber.updateQueue; if (null !== fiber && (fiber = fiber.shared, 0 !== (lane & 4194048))) { var queueLanes = fiber.lanes; queueLanes &= root2.pendingLanes; lane |= queueLanes; fiber.lanes = lane; markRootEntangled(root2, lane); } } function enqueueCapturedUpdate(workInProgress2, capturedUpdate) { var queue = workInProgress2.updateQueue, current = workInProgress2.alternate; if (null !== current && (current = current.updateQueue, queue === current)) { var newFirst = null, newLast = null; queue = queue.firstBaseUpdate; if (null !== queue) { do { var clone = { lane: queue.lane, tag: queue.tag, payload: queue.payload, callback: null, next: null }; null === newLast ? newFirst = newLast = clone : newLast = newLast.next = clone; queue = queue.next; } while (null !== queue); null === newLast ? newFirst = newLast = capturedUpdate : newLast = newLast.next = capturedUpdate; } else newFirst = newLast = capturedUpdate; queue = { baseState: current.baseState, firstBaseUpdate: newFirst, lastBaseUpdate: newLast, shared: current.shared, callbacks: current.callbacks }; workInProgress2.updateQueue = queue; return; } workInProgress2 = queue.lastBaseUpdate; null === workInProgress2 ? queue.firstBaseUpdate = capturedUpdate : workInProgress2.next = capturedUpdate; queue.lastBaseUpdate = capturedUpdate; } var didReadFromEntangledAsyncAction = false; function suspendIfUpdateReadFromEntangledAsyncAction() { if (didReadFromEntangledAsyncAction) { var entangledActionThenable = currentEntangledActionThenable; if (null !== entangledActionThenable) throw entangledActionThenable; } } function processUpdateQueue(workInProgress$jscomp$0, props, instance$jscomp$0, renderLanes2) { didReadFromEntangledAsyncAction = false; var queue = workInProgress$jscomp$0.updateQueue; hasForceUpdate = false; var firstBaseUpdate = queue.firstBaseUpdate, lastBaseUpdate = queue.lastBaseUpdate, pendingQueue = queue.shared.pending; if (null !== pendingQueue) { queue.shared.pending = null; var lastPendingUpdate = pendingQueue, firstPendingUpdate = lastPendingUpdate.next; lastPendingUpdate.next = null; null === lastBaseUpdate ? firstBaseUpdate = firstPendingUpdate : lastBaseUpdate.next = firstPendingUpdate; lastBaseUpdate = lastPendingUpdate; var current = workInProgress$jscomp$0.alternate; null !== current && (current = current.updateQueue, pendingQueue = current.lastBaseUpdate, pendingQueue !== lastBaseUpdate && (null === pendingQueue ? current.firstBaseUpdate = firstPendingUpdate : pendingQueue.next = firstPendingUpdate, current.lastBaseUpdate = lastPendingUpdate)); } if (null !== firstBaseUpdate) { var newState = queue.baseState; lastBaseUpdate = 0; current = firstPendingUpdate = lastPendingUpdate = null; pendingQueue = firstBaseUpdate; do { var updateLane = pendingQueue.lane & -536870913, isHiddenUpdate = updateLane !== pendingQueue.lane; if (isHiddenUpdate ? (workInProgressRootRenderLanes & updateLane) === updateLane : (renderLanes2 & updateLane) === updateLane) { 0 !== updateLane && updateLane === currentEntangledLane && (didReadFromEntangledAsyncAction = true); null !== current && (current = current.next = { lane: 0, tag: pendingQueue.tag, payload: pendingQueue.payload, callback: null, next: null }); a: { var workInProgress2 = workInProgress$jscomp$0, update = pendingQueue; updateLane = props; var instance = instance$jscomp$0; switch (update.tag) { case 1: workInProgress2 = update.payload; if ("function" === typeof workInProgress2) { newState = workInProgress2.call(instance, newState, updateLane); break a; } newState = workInProgress2; break a; case 3: workInProgress2.flags = workInProgress2.flags & -65537 | 128; case 0: workInProgress2 = update.payload; updateLane = "function" === typeof workInProgress2 ? workInProgress2.call(instance, newState, updateLane) : workInProgress2; if (null === updateLane || void 0 === updateLane) break a; newState = assign({}, newState, updateLane); break a; case 2: hasForceUpdate = true; } } updateLane = pendingQueue.callback; null !== updateLane && (workInProgress$jscomp$0.flags |= 64, isHiddenUpdate && (workInProgress$jscomp$0.flags |= 8192), isHiddenUpdate = queue.callbacks, null === isHiddenUpdate ? queue.callbacks = [updateLane] : isHiddenUpdate.push(updateLane)); } else isHiddenUpdate = { lane: updateLane, tag: pendingQueue.tag, payload: pendingQueue.payload, callback: pendingQueue.callback, next: null }, null === current ? (firstPendingUpdate = current = isHiddenUpdate, lastPendingUpdate = newState) : current = current.next = isHiddenUpdate, lastBaseUpdate |= updateLane; pendingQueue = pendingQueue.next; if (null === pendingQueue) if (pendingQueue = queue.shared.pending, null === pendingQueue) break; else isHiddenUpdate = pendingQueue, pendingQueue = isHiddenUpdate.next, isHiddenUpdate.next = null, queue.lastBaseUpdate = isHiddenUpdate, queue.shared.pending = null; } while (1); null === current && (lastPendingUpdate = newState); queue.baseState = lastPendingUpdate; queue.firstBaseUpdate = firstPendingUpdate; queue.lastBaseUpdate = current; null === firstBaseUpdate && (queue.shared.lanes = 0); workInProgressRootSkippedLanes |= lastBaseUpdate; workInProgress$jscomp$0.lanes = lastBaseUpdate; workInProgress$jscomp$0.memoizedState = newState; } } function callCallback(callback, context) { if ("function" !== typeof callback) throw Error(formatProdErrorMessage(191, callback)); callback.call(context); } function commitCallbacks(updateQueue, context) { var callbacks = updateQueue.callbacks; if (null !== callbacks) for (updateQueue.callbacks = null, updateQueue = 0; updateQueue < callbacks.length; updateQueue++) callCallback(callbacks[updateQueue], context); } var currentTreeHiddenStackCursor = createCursor(null), prevEntangledRenderLanesCursor = createCursor(0); function pushHiddenContext(fiber, context) { fiber = entangledRenderLanes; push(prevEntangledRenderLanesCursor, fiber); push(currentTreeHiddenStackCursor, context); entangledRenderLanes = fiber | context.baseLanes; } function reuseHiddenContextOnStack() { push(prevEntangledRenderLanesCursor, entangledRenderLanes); push(currentTreeHiddenStackCursor, currentTreeHiddenStackCursor.current); } function popHiddenContext() { entangledRenderLanes = prevEntangledRenderLanesCursor.current; pop(currentTreeHiddenStackCursor); pop(prevEntangledRenderLanesCursor); } var suspenseHandlerStackCursor = createCursor(null), shellBoundary = null; function pushPrimaryTreeSuspenseHandler(handler) { var current = handler.alternate; push(suspenseStackCursor, suspenseStackCursor.current & 1); push(suspenseHandlerStackCursor, handler); null === shellBoundary && (null === current || null !== currentTreeHiddenStackCursor.current ? shellBoundary = handler : null !== current.memoizedState && (shellBoundary = handler)); } function pushDehydratedActivitySuspenseHandler(fiber) { push(suspenseStackCursor, suspenseStackCursor.current); push(suspenseHandlerStackCursor, fiber); null === shellBoundary && (shellBoundary = fiber); } function pushOffscreenSuspenseHandler(fiber) { 22 === fiber.tag ? (push(suspenseStackCursor, suspenseStackCursor.current), push(suspenseHandlerStackCursor, fiber), null === shellBoundary && (shellBoundary = fiber)) : reuseSuspenseHandlerOnStack(); } function reuseSuspenseHandlerOnStack() { push(suspenseStackCursor, suspenseStackCursor.current); push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current); } function popSuspenseHandler(fiber) { pop(suspenseHandlerStackCursor); shellBoundary === fiber && (shellBoundary = null); pop(suspenseStackCursor); } var suspenseStackCursor = createCursor(0); function findFirstSuspended(row) { for (var node = row; null !== node; ) { if (13 === node.tag) { var state = node.memoizedState; if (null !== state && (state = state.dehydrated, null === state || isSuspenseInstancePending(state) || isSuspenseInstanceFallback(state))) return node; } else if (19 === node.tag && ("forwards" === node.memoizedProps.revealOrder || "backwards" === node.memoizedProps.revealOrder || "unstable_legacy-backwards" === node.memoizedProps.revealOrder || "together" === node.memoizedProps.revealOrder)) { if (0 !== (node.flags & 128)) return node; } else if (null !== node.child) { node.child.return = node; node = node.child; continue; } if (node === row) break; for (; null === node.sibling; ) { if (null === node.return || node.return === row) return null; node = node.return; } node.sibling.return = node.return; node = node.sibling; } return null; } var renderLanes = 0, currentlyRenderingFiber = null, currentHook = null, workInProgressHook = null, didScheduleRenderPhaseUpdate = false, didScheduleRenderPhaseUpdateDuringThisPass = false, shouldDoubleInvokeUserFnsInHooksDEV = false, localIdCounter = 0, thenableIndexCounter = 0, thenableState = null, globalClientIdCounter = 0; function throwInvalidHookError() { throw Error(formatProdErrorMessage(321)); } function areHookInputsEqual(nextDeps, prevDeps) { if (null === prevDeps) return false; for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) if (!objectIs(nextDeps[i], prevDeps[i])) return false; return true; } function renderWithHooks(current, workInProgress2, Component, props, secondArg, nextRenderLanes) { renderLanes = nextRenderLanes; currentlyRenderingFiber = workInProgress2; workInProgress2.memoizedState = null; workInProgress2.updateQueue = null; workInProgress2.lanes = 0; ReactSharedInternals.H = null === current || null === current.memoizedState ? HooksDispatcherOnMount : HooksDispatcherOnUpdate; shouldDoubleInvokeUserFnsInHooksDEV = false; nextRenderLanes = Component(props, secondArg); shouldDoubleInvokeUserFnsInHooksDEV = false; didScheduleRenderPhaseUpdateDuringThisPass && (nextRenderLanes = renderWithHooksAgain( workInProgress2, Component, props, secondArg )); finishRenderingHooks(current); return nextRenderLanes; } function finishRenderingHooks(current) { ReactSharedInternals.H = ContextOnlyDispatcher; var didRenderTooFewHooks = null !== currentHook && null !== currentHook.next; renderLanes = 0; workInProgressHook = currentHook = currentlyRenderingFiber = null; didScheduleRenderPhaseUpdate = false; thenableIndexCounter = 0; thenableState = null; if (didRenderTooFewHooks) throw Error(formatProdErrorMessage(300)); null === current || didReceiveUpdate || (current = current.dependencies, null !== current && checkIfContextChanged(current) && (didReceiveUpdate = true)); } function renderWithHooksAgain(workInProgress2, Component, props, secondArg) { currentlyRenderingFiber = workInProgress2; var numberOfReRenders = 0; do { didScheduleRenderPhaseUpdateDuringThisPass && (thenableState = null); thenableIndexCounter = 0; didScheduleRenderPhaseUpdateDuringThisPass = false; if (25 <= numberOfReRenders) throw Error(formatProdErrorMessage(301)); numberOfReRenders += 1; workInProgressHook = currentHook = null; if (null != workInProgress2.updateQueue) { var children = workInProgress2.updateQueue; children.lastEffect = null; children.events = null; children.stores = null; null != children.memoCache && (children.memoCache.index = 0); } ReactSharedInternals.H = HooksDispatcherOnRerender; children = Component(props, secondArg); } while (didScheduleRenderPhaseUpdateDuringThisPass); return children; } function TransitionAwareHostComponent() { var dispatcher = ReactSharedInternals.H, maybeThenable = dispatcher.useState()[0]; maybeThenable = "function" === typeof maybeThenable.then ? useThenable(maybeThenable) : maybeThenable; dispatcher = dispatcher.useState()[0]; (null !== currentHook ? currentHook.memoizedState : null) !== dispatcher && (currentlyRenderingFiber.flags |= 1024); return maybeThenable; } function checkDidRenderIdHook() { var didRenderIdHook = 0 !== localIdCounter; localIdCounter = 0; return didRenderIdHook; } function bailoutHooks(current, workInProgress2, lanes) { workInProgress2.updateQueue = current.updateQueue; workInProgress2.flags &= -2053; current.lanes &= ~lanes; } function resetHooksOnUnwind(workInProgress2) { if (didScheduleRenderPhaseUpdate) { for (workInProgress2 = workInProgress2.memoizedState; null !== workInProgress2; ) { var queue = workInProgress2.queue; null !== queue && (queue.pending = null); workInProgress2 = workInProgress2.next; } didScheduleRenderPhaseUpdate = false; } renderLanes = 0; workInProgressHook = currentHook = currentlyRenderingFiber = null; didScheduleRenderPhaseUpdateDuringThisPass = false; thenableIndexCounter = localIdCounter = 0; thenableState = null; } function mountWorkInProgressHook() { var hook = { memoizedState: null, baseState: null, baseQueue: null, queue: null, next: null }; null === workInProgressHook ? currentlyRenderingFiber.memoizedState = workInProgressHook = hook : workInProgressHook = workInProgressHook.next = hook; return workInProgressHook; } function updateWorkInProgressHook() { if (null === currentHook) { var nextCurrentHook = currentlyRenderingFiber.alternate; nextCurrentHook = null !== nextCurrentHook ? nextCurrentHook.memoizedState : null; } else nextCurrentHook = currentHook.next; var nextWorkInProgressHook = null === workInProgressHook ? currentlyRenderingFiber.memoizedState : workInProgressHook.next; if (null !== nextWorkInProgressHook) workInProgressHook = nextWorkInProgressHook, currentHook = nextCurrentHook; else { if (null === nextCurrentHook) { if (null === currentlyRenderingFiber.alternate) throw Error(formatProdErrorMessage(467)); throw Error(formatProdErrorMessage(310)); } currentHook = nextCurrentHook; nextCurrentHook = { memoizedState: currentHook.memoizedState, baseState: currentHook.baseState, baseQueue: currentHook.baseQueue, queue: currentHook.queue, next: null }; null === workInProgressHook ? currentlyRenderingFiber.memoizedState = workInProgressHook = nextCurrentHook : workInProgressHook = workInProgressHook.next = nextCurrentHook; } return workInProgressHook; } function createFunctionComponentUpdateQueue() { return { lastEffect: null, events: null, stores: null, memoCache: null }; } function useThenable(thenable) { var index2 = thenableIndexCounter; thenableIndexCounter += 1; null === thenableState && (thenableState = []); thenable = trackUsedThenable(thenableState, thenable, index2); index2 = currentlyRenderingFiber; null === (null === workInProgressHook ? index2.memoizedState : workInProgressHook.next) && (index2 = index2.alternate, ReactSharedInternals.H = null === index2 || null === index2.memoizedState ? HooksDispatcherOnMount : HooksDispatcherOnUpdate); return thenable; } function use(usable) { if (null !== usable && "object" === typeof usable) { if ("function" === typeof usable.then) return useThenable(usable); if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable); } throw Error(formatProdErrorMessage(438, String(usable))); } function useMemoCache(size) { var memoCache = null, updateQueue = currentlyRenderingFiber.updateQueue; null !== updateQueue && (memoCache = updateQueue.memoCache); if (null == memoCache) { var current = currentlyRenderingFiber.alternate; null !== current && (current = current.updateQueue, null !== current && (current = current.memoCache, null != current && (memoCache = { data: current.data.map(function(array) { return array.slice(); }), index: 0 }))); } null == memoCache && (memoCache = { data: [], index: 0 }); null === updateQueue && (updateQueue = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = updateQueue); updateQueue.memoCache = memoCache; updateQueue = memoCache.data[memoCache.index]; if (void 0 === updateQueue) for (updateQueue = memoCache.data[memoCache.index] = Array(size), current = 0; current < size; current++) updateQueue[current] = REACT_MEMO_CACHE_SENTINEL; memoCache.index++; return updateQueue; } function basicStateReducer(state, action) { return "function" === typeof action ? action(state) : action; } function updateReducer(reducer) { var hook = updateWorkInProgressHook(); return updateReducerImpl(hook, currentHook, reducer); } function updateReducerImpl(hook, current, reducer) { var queue = hook.queue; if (null === queue) throw Error(formatProdErrorMessage(311)); queue.lastRenderedReducer = reducer; var baseQueue = hook.baseQueue, pendingQueue = queue.pending; if (null !== pendingQueue) { if (null !== baseQueue) { var baseFirst = baseQueue.next; baseQueue.next = pendingQueue.next; pendingQueue.next = baseFirst; } current.baseQueue = baseQueue = pendingQueue; queue.pending = null; } pendingQueue = hook.baseState; if (null === baseQueue) hook.memoizedState = pendingQueue; else { current = baseQueue.next; var newBaseQueueFirst = baseFirst = null, newBaseQueueLast = null, update = current, didReadFromEntangledAsyncAction$60 = false; do { var updateLane = update.lane & -536870913; if (updateLane !== update.lane ? (workInProgressRootRenderLanes & updateLane) === updateLane : (renderLanes & updateLane) === updateLane) { var revertLane = update.revertLane; if (0 === revertLane) null !== newBaseQueueLast && (newBaseQueueLast = newBaseQueueLast.next = { lane: 0, revertLane: 0, gesture: null, action: update.action, hasEagerState: update.hasEagerState, eagerState: update.eagerState, next: null }), updateLane === currentEntangledLane && (didReadFromEntangledAsyncAction$60 = true); else if ((renderLanes & revertLane) === revertLane) { update = update.next; revertLane === currentEntangledLane && (didReadFromEntangledAsyncAction$60 = true); continue; } else updateLane = { lane: 0, revertLane: update.revertLane, gesture: null, action: update.action, hasEagerState: update.hasEagerState, eagerState: update.eagerState, next: null }, null === newBaseQueueLast ? (newBaseQueueFirst = newBaseQueueLast = updateLane, baseFirst = pendingQueue) : newBaseQueueLast = newBaseQueueLast.next = updateLane, currentlyRenderingFiber.lanes |= revertLane, workInProgressRootSkippedLanes |= revertLane; updateLane = update.action; shouldDoubleInvokeUserFnsInHooksDEV && reducer(pendingQueue, updateLane); pendingQueue = update.hasEagerState ? update.eagerState : reducer(pendingQueue, updateLane); } else revertLane = { lane: updateLane, revertLane: update.revertLane, gesture: update.gesture, action: update.action, hasEagerState: update.hasEagerState, eagerState: update.eagerState, next: null }, null === newBaseQueueLast ? (newBaseQueueFirst = newBaseQueueLast = revertLane, baseFirst = pendingQueue) : newBaseQueueLast = newBaseQueueLast.next = revertLane, currentlyRenderingFiber.lanes |= updateLane, workInProgressRootSkippedLanes |= updateLane; update = update.next; } while (null !== update && update !== current); null === newBaseQueueLast ? baseFirst = pendingQueue : newBaseQueueLast.next = newBaseQueueFirst; if (!objectIs(pendingQueue, hook.memoizedState) && (didReceiveUpdate = true, didReadFromEntangledAsyncAction$60 && (reducer = currentEntangledActionThenable, null !== reducer))) throw reducer; hook.memoizedState = pendingQueue; hook.baseState = baseFirst; hook.baseQueue = newBaseQueueLast; queue.lastRenderedState = pendingQueue; } null === baseQueue && (queue.lanes = 0); return [hook.memoizedState, queue.dispatch]; } function rerenderReducer(reducer) { var hook = updateWorkInProgressHook(), queue = hook.queue; if (null === queue) throw Error(formatProdErrorMessage(311)); queue.lastRenderedReducer = reducer; var dispatch = queue.dispatch, lastRenderPhaseUpdate = queue.pending, newState = hook.memoizedState; if (null !== lastRenderPhaseUpdate) { queue.pending = null; var update = lastRenderPhaseUpdate = lastRenderPhaseUpdate.next; do newState = reducer(newState, update.action), update = update.next; while (update !== lastRenderPhaseUpdate); objectIs(newState, hook.memoizedState) || (didReceiveUpdate = true); hook.memoizedState = newState; null === hook.baseQueue && (hook.baseState = newState); queue.lastRenderedState = newState; } return [newState, dispatch]; } function updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { var fiber = currentlyRenderingFiber, hook = updateWorkInProgressHook(), isHydrating$jscomp$0 = isHydrating; if (isHydrating$jscomp$0) { if (void 0 === getServerSnapshot) throw Error(formatProdErrorMessage(407)); getServerSnapshot = getServerSnapshot(); } else getServerSnapshot = getSnapshot(); var snapshotChanged = !objectIs( (currentHook || hook).memoizedState, getServerSnapshot ); snapshotChanged && (hook.memoizedState = getServerSnapshot, didReceiveUpdate = true); hook = hook.queue; updateEffect(subscribeToStore.bind(null, fiber, hook, subscribe), [ subscribe ]); if (hook.getSnapshot !== getSnapshot || snapshotChanged || null !== workInProgressHook && workInProgressHook.memoizedState.tag & 1) { fiber.flags |= 2048; pushSimpleEffect( 9, { destroy: void 0 }, updateStoreInstance.bind( null, fiber, hook, getServerSnapshot, getSnapshot ), null ); if (null === workInProgressRoot) throw Error(formatProdErrorMessage(349)); isHydrating$jscomp$0 || 0 !== (renderLanes & 127) || pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot); } return getServerSnapshot; } function pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) { fiber.flags |= 16384; fiber = { getSnapshot, value: renderedSnapshot }; getSnapshot = currentlyRenderingFiber.updateQueue; null === getSnapshot ? (getSnapshot = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = getSnapshot, getSnapshot.stores = [fiber]) : (renderedSnapshot = getSnapshot.stores, null === renderedSnapshot ? getSnapshot.stores = [fiber] : renderedSnapshot.push(fiber)); } function updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) { inst.value = nextSnapshot; inst.getSnapshot = getSnapshot; checkIfSnapshotChanged(inst) && forceStoreRerender(fiber); } function subscribeToStore(fiber, inst, subscribe) { return subscribe(function() { checkIfSnapshotChanged(inst) && forceStoreRerender(fiber); }); } function checkIfSnapshotChanged(inst) { var latestGetSnapshot = inst.getSnapshot; inst = inst.value; try { var nextValue = latestGetSnapshot(); return !objectIs(inst, nextValue); } catch (error) { return true; } } function forceStoreRerender(fiber) { var root2 = enqueueConcurrentRenderForLane(fiber, 2); null !== root2 && scheduleUpdateOnFiber(root2, fiber, 2); } function mountStateImpl(initialState) { var hook = mountWorkInProgressHook(); if ("function" === typeof initialState) { var initialStateInitializer = initialState; initialState = initialStateInitializer(); if (shouldDoubleInvokeUserFnsInHooksDEV) { setIsStrictModeForDevtools(true); try { initialStateInitializer(); } finally { setIsStrictModeForDevtools(false); } } } hook.memoizedState = hook.baseState = initialState; hook.queue = { pending: null, lanes: 0, dispatch: null, lastRenderedReducer: basicStateReducer, lastRenderedState: initialState }; return hook; } function updateOptimisticImpl(hook, current, passthrough, reducer) { hook.baseState = passthrough; return updateReducerImpl( hook, currentHook, "function" === typeof reducer ? reducer : basicStateReducer ); } function dispatchActionState(fiber, actionQueue, setPendingState, setState, payload) { if (isRenderPhaseUpdate(fiber)) throw Error(formatProdErrorMessage(485)); fiber = actionQueue.action; if (null !== fiber) { var actionNode = { payload, action: fiber, next: null, isTransition: true, status: "pending", value: null, reason: null, listeners: [], then: function(listener) { actionNode.listeners.push(listener); } }; null !== ReactSharedInternals.T ? setPendingState(true) : actionNode.isTransition = false; setState(actionNode); setPendingState = actionQueue.pending; null === setPendingState ? (actionNode.next = actionQueue.pending = actionNode, runActionStateAction(actionQueue, actionNode)) : (actionNode.next = setPendingState.next, actionQueue.pending = setPendingState.next = actionNode); } } function runActionStateAction(actionQueue, node) { var action = node.action, payload = node.payload, prevState = actionQueue.state; if (node.isTransition) { var prevTransition = ReactSharedInternals.T, currentTransition = {}; ReactSharedInternals.T = currentTransition; try { var returnValue = action(prevState, payload), onStartTransitionFinish = ReactSharedInternals.S; null !== onStartTransitionFinish && onStartTransitionFinish(currentTransition, returnValue); handleActionReturnValue(actionQueue, node, returnValue); } catch (error) { onActionError(actionQueue, node, error); } finally { null !== prevTransition && null !== currentTransition.types && (prevTransition.types = currentTransition.types), ReactSharedInternals.T = prevTransition; } } else try { prevTransition = action(prevState, payload), handleActionReturnValue(actionQueue, node, prevTransition); } catch (error$66) { onActionError(actionQueue, node, error$66); } } function handleActionReturnValue(actionQueue, node, returnValue) { null !== returnValue && "object" === typeof returnValue && "function" === typeof returnValue.then ? returnValue.then( function(nextState) { onActionSuccess(actionQueue, node, nextState); }, function(error) { return onActionError(actionQueue, node, error); } ) : onActionSuccess(actionQueue, node, returnValue); } function onActionSuccess(actionQueue, actionNode, nextState) { actionNode.status = "fulfilled"; actionNode.value = nextState; notifyActionListeners(actionNode); actionQueue.state = nextState; actionNode = actionQueue.pending; null !== actionNode && (nextState = actionNode.next, nextState === actionNode ? actionQueue.pending = null : (nextState = nextState.next, actionNode.next = nextState, runActionStateAction(actionQueue, nextState))); } function onActionError(actionQueue, actionNode, error) { var last = actionQueue.pending; actionQueue.pending = null; if (null !== last) { last = last.next; do actionNode.status = "rejected", actionNode.reason = error, notifyActionListeners(actionNode), actionNode = actionNode.next; while (actionNode !== last); } actionQueue.action = null; } function notifyActionListeners(actionNode) { actionNode = actionNode.listeners; for (var i = 0; i < actionNode.length; i++) (0, actionNode[i])(); } function actionStateReducer(oldState, newState) { return newState; } function mountActionState(action, initialStateProp) { if (isHydrating) { var ssrFormState = workInProgressRoot.formState; if (null !== ssrFormState) { a: { var JSCompiler_inline_result = currentlyRenderingFiber; if (isHydrating) { if (nextHydratableInstance) { b: { var JSCompiler_inline_result$jscomp$0 = nextHydratableInstance; for (var inRootOrSingleton = rootOrSingletonContext; 8 !== JSCompiler_inline_result$jscomp$0.nodeType; ) { if (!inRootOrSingleton) { JSCompiler_inline_result$jscomp$0 = null; break b; } JSCompiler_inline_result$jscomp$0 = getNextHydratable( JSCompiler_inline_result$jscomp$0.nextSibling ); if (null === JSCompiler_inline_result$jscomp$0) { JSCompiler_inline_result$jscomp$0 = null; break b; } } inRootOrSingleton = JSCompiler_inline_result$jscomp$0.data; JSCompiler_inline_result$jscomp$0 = "F!" === inRootOrSingleton || "F" === inRootOrSingleton ? JSCompiler_inline_result$jscomp$0 : null; } if (JSCompiler_inline_result$jscomp$0) { nextHydratableInstance = getNextHydratable( JSCompiler_inline_result$jscomp$0.nextSibling ); JSCompiler_inline_result = "F!" === JSCompiler_inline_result$jscomp$0.data; break a; } } throwOnHydrationMismatch(JSCompiler_inline_result); } JSCompiler_inline_result = false; } JSCompiler_inline_result && (initialStateProp = ssrFormState[0]); } } ssrFormState = mountWorkInProgressHook(); ssrFormState.memoizedState = ssrFormState.baseState = initialStateProp; JSCompiler_inline_result = { pending: null, lanes: 0, dispatch: null, lastRenderedReducer: actionStateReducer, lastRenderedState: initialStateProp }; ssrFormState.queue = JSCompiler_inline_result; ssrFormState = dispatchSetState.bind( null, currentlyRenderingFiber, JSCompiler_inline_result ); JSCompiler_inline_result.dispatch = ssrFormState; JSCompiler_inline_result = mountStateImpl(false); inRootOrSingleton = dispatchOptimisticSetState.bind( null, currentlyRenderingFiber, false, JSCompiler_inline_result.queue ); JSCompiler_inline_result = mountWorkInProgressHook(); JSCompiler_inline_result$jscomp$0 = { state: initialStateProp, dispatch: null, action, pending: null }; JSCompiler_inline_result.queue = JSCompiler_inline_result$jscomp$0; ssrFormState = dispatchActionState.bind( null, currentlyRenderingFiber, JSCompiler_inline_result$jscomp$0, inRootOrSingleton, ssrFormState ); JSCompiler_inline_result$jscomp$0.dispatch = ssrFormState; JSCompiler_inline_result.memoizedState = action; return [initialStateProp, ssrFormState, false]; } function updateActionState(action) { var stateHook = updateWorkInProgressHook(); return updateActionStateImpl(stateHook, currentHook, action); } function updateActionStateImpl(stateHook, currentStateHook, action) { currentStateHook = updateReducerImpl( stateHook, currentStateHook, actionStateReducer )[0]; stateHook = updateReducer(basicStateReducer)[0]; if ("object" === typeof currentStateHook && null !== currentStateHook && "function" === typeof currentStateHook.then) try { var state = useThenable(currentStateHook); } catch (x) { if (x === SuspenseException) throw SuspenseActionException; throw x; } else state = currentStateHook; currentStateHook = updateWorkInProgressHook(); var actionQueue = currentStateHook.queue, dispatch = actionQueue.dispatch; action !== currentStateHook.memoizedState && (currentlyRenderingFiber.flags |= 2048, pushSimpleEffect( 9, { destroy: void 0 }, actionStateActionEffect.bind(null, actionQueue, action), null )); return [state, dispatch, stateHook]; } function actionStateActionEffect(actionQueue, action) { actionQueue.action = action; } function rerenderActionState(action) { var stateHook = updateWorkInProgressHook(), currentStateHook = currentHook; if (null !== currentStateHook) return updateActionStateImpl(stateHook, currentStateHook, action); updateWorkInProgressHook(); stateHook = stateHook.memoizedState; currentStateHook = updateWorkInProgressHook(); var dispatch = currentStateHook.queue.dispatch; currentStateHook.memoizedState = action; return [stateHook, dispatch, false]; } function pushSimpleEffect(tag, inst, create, deps) { tag = { tag, create, deps, inst, next: null }; inst = currentlyRenderingFiber.updateQueue; null === inst && (inst = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = inst); create = inst.lastEffect; null === create ? inst.lastEffect = tag.next = tag : (deps = create.next, create.next = tag, tag.next = deps, inst.lastEffect = tag); return tag; } function updateRef() { return updateWorkInProgressHook().memoizedState; } function mountEffectImpl(fiberFlags, hookFlags, create, deps) { var hook = mountWorkInProgressHook(); currentlyRenderingFiber.flags |= fiberFlags; hook.memoizedState = pushSimpleEffect( 1 | hookFlags, { destroy: void 0 }, create, void 0 === deps ? null : deps ); } function updateEffectImpl(fiberFlags, hookFlags, create, deps) { var hook = updateWorkInProgressHook(); deps = void 0 === deps ? null : deps; var inst = hook.memoizedState.inst; null !== currentHook && null !== deps && areHookInputsEqual(deps, currentHook.memoizedState.deps) ? hook.memoizedState = pushSimpleEffect(hookFlags, inst, create, deps) : (currentlyRenderingFiber.flags |= fiberFlags, hook.memoizedState = pushSimpleEffect( 1 | hookFlags, inst, create, deps )); } function mountEffect(create, deps) { mountEffectImpl(8390656, 8, create, deps); } function updateEffect(create, deps) { updateEffectImpl(2048, 8, create, deps); } function useEffectEventImpl(payload) { currentlyRenderingFiber.flags |= 4; var componentUpdateQueue = currentlyRenderingFiber.updateQueue; if (null === componentUpdateQueue) componentUpdateQueue = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = componentUpdateQueue, componentUpdateQueue.events = [payload]; else { var events = componentUpdateQueue.events; null === events ? componentUpdateQueue.events = [payload] : events.push(payload); } } function updateEvent(callback) { var ref = updateWorkInProgressHook().memoizedState; useEffectEventImpl({ ref, nextImpl: callback }); return function() { if (0 !== (executionContext & 2)) throw Error(formatProdErrorMessage(440)); return ref.impl.apply(void 0, arguments); }; } function updateInsertionEffect(create, deps) { return updateEffectImpl(4, 2, create, deps); } function updateLayoutEffect(create, deps) { return updateEffectImpl(4, 4, create, deps); } function imperativeHandleEffect(create, ref) { if ("function" === typeof ref) { create = create(); var refCleanup = ref(create); return function() { "function" === typeof refCleanup ? refCleanup() : ref(null); }; } if (null !== ref && void 0 !== ref) return create = create(), ref.current = create, function() { ref.current = null; }; } function updateImperativeHandle(ref, create, deps) { deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null; updateEffectImpl(4, 4, imperativeHandleEffect.bind(null, create, ref), deps); } function mountDebugValue() { } function updateCallback(callback, deps) { var hook = updateWorkInProgressHook(); deps = void 0 === deps ? null : deps; var prevState = hook.memoizedState; if (null !== deps && areHookInputsEqual(deps, prevState[1])) return prevState[0]; hook.memoizedState = [callback, deps]; return callback; } function updateMemo(nextCreate, deps) { var hook = updateWorkInProgressHook(); deps = void 0 === deps ? null : deps; var prevState = hook.memoizedState; if (null !== deps && areHookInputsEqual(deps, prevState[1])) return prevState[0]; prevState = nextCreate(); if (shouldDoubleInvokeUserFnsInHooksDEV) { setIsStrictModeForDevtools(true); try { nextCreate(); } finally { setIsStrictModeForDevtools(false); } } hook.memoizedState = [prevState, deps]; return prevState; } function mountDeferredValueImpl(hook, value, initialValue) { if (void 0 === initialValue || 0 !== (renderLanes & 1073741824) && 0 === (workInProgressRootRenderLanes & 261930)) return hook.memoizedState = value; hook.memoizedState = initialValue; hook = requestDeferredLane(); currentlyRenderingFiber.lanes |= hook; workInProgressRootSkippedLanes |= hook; return initialValue; } function updateDeferredValueImpl(hook, prevValue, value, initialValue) { if (objectIs(value, prevValue)) return value; if (null !== currentTreeHiddenStackCursor.current) return hook = mountDeferredValueImpl(hook, value, initialValue), objectIs(hook, prevValue) || (didReceiveUpdate = true), hook; if (0 === (renderLanes & 42) || 0 !== (renderLanes & 1073741824) && 0 === (workInProgressRootRenderLanes & 261930)) return didReceiveUpdate = true, hook.memoizedState = value; hook = requestDeferredLane(); currentlyRenderingFiber.lanes |= hook; workInProgressRootSkippedLanes |= hook; return prevValue; } function startTransition(fiber, queue, pendingState, finishedState, callback) { var previousPriority = ReactDOMSharedInternals.p; ReactDOMSharedInternals.p = 0 !== previousPriority && 8 > previousPriority ? previousPriority : 8; var prevTransition = ReactSharedInternals.T, currentTransition = {}; ReactSharedInternals.T = currentTransition; dispatchOptimisticSetState(fiber, false, queue, pendingState); try { var returnValue = callback(), onStartTransitionFinish = ReactSharedInternals.S; null !== onStartTransitionFinish && onStartTransitionFinish(currentTransition, returnValue); if (null !== returnValue && "object" === typeof returnValue && "function" === typeof returnValue.then) { var thenableForFinishedState = chainThenableValue( returnValue, finishedState ); dispatchSetStateInternal( fiber, queue, thenableForFinishedState, requestUpdateLane(fiber) ); } else dispatchSetStateInternal( fiber, queue, finishedState, requestUpdateLane(fiber) ); } catch (error) { dispatchSetStateInternal( fiber, queue, { then: function() { }, status: "rejected", reason: error }, requestUpdateLane() ); } finally { ReactDOMSharedInternals.p = previousPriority, null !== prevTransition && null !== currentTransition.types && (prevTransition.types = currentTransition.types), ReactSharedInternals.T = prevTransition; } } function noop() { } function startHostTransition(formFiber, pendingState, action, formData) { if (5 !== formFiber.tag) throw Error(formatProdErrorMessage(476)); var queue = ensureFormComponentIsStateful(formFiber).queue; startTransition( formFiber, queue, pendingState, sharedNotPendingObject, null === action ? noop : function() { requestFormReset$1(formFiber); return action(formData); } ); } function ensureFormComponentIsStateful(formFiber) { var existingStateHook = formFiber.memoizedState; if (null !== existingStateHook) return existingStateHook; existingStateHook = { memoizedState: sharedNotPendingObject, baseState: sharedNotPendingObject, baseQueue: null, queue: { pending: null, lanes: 0, dispatch: null, lastRenderedReducer: basicStateReducer, lastRenderedState: sharedNotPendingObject }, next: null }; var initialResetState = {}; existingStateHook.next = { memoizedState: initialResetState, baseState: initialResetState, baseQueue: null, queue: { pending: null, lanes: 0, dispatch: null, lastRenderedReducer: basicStateReducer, lastRenderedState: initialResetState }, next: null }; formFiber.memoizedState = existingStateHook; formFiber = formFiber.alternate; null !== formFiber && (formFiber.memoizedState = existingStateHook); return existingStateHook; } function requestFormReset$1(formFiber) { var stateHook = ensureFormComponentIsStateful(formFiber); null === stateHook.next && (stateHook = formFiber.alternate.memoizedState); dispatchSetStateInternal( formFiber, stateHook.next.queue, {}, requestUpdateLane() ); } function useHostTransitionStatus() { return readContext(HostTransitionContext); } function updateId() { return updateWorkInProgressHook().memoizedState; } function updateRefresh() { return updateWorkInProgressHook().memoizedState; } function refreshCache(fiber) { for (var provider2 = fiber.return; null !== provider2; ) { switch (provider2.tag) { case 24: case 3: var lane = requestUpdateLane(); fiber = createUpdate(lane); var root$69 = enqueueUpdate(provider2, fiber, lane); null !== root$69 && (scheduleUpdateOnFiber(root$69, provider2, lane), entangleTransitions(root$69, provider2, lane)); provider2 = { cache: createCache() }; fiber.payload = provider2; return; } provider2 = provider2.return; } } function dispatchReducerAction(fiber, queue, action) { var lane = requestUpdateLane(); action = { lane, revertLane: 0, gesture: null, action, hasEagerState: false, eagerState: null, next: null }; isRenderPhaseUpdate(fiber) ? enqueueRenderPhaseUpdate(queue, action) : (action = enqueueConcurrentHookUpdate(fiber, queue, action, lane), null !== action && (scheduleUpdateOnFiber(action, fiber, lane), entangleTransitionUpdate(action, queue, lane))); } function dispatchSetState(fiber, queue, action) { var lane = requestUpdateLane(); dispatchSetStateInternal(fiber, queue, action, lane); } function dispatchSetStateInternal(fiber, queue, action, lane) { var update = { lane, revertLane: 0, gesture: null, action, hasEagerState: false, eagerState: null, next: null }; if (isRenderPhaseUpdate(fiber)) enqueueRenderPhaseUpdate(queue, update); else { var alternate = fiber.alternate; if (0 === fiber.lanes && (null === alternate || 0 === alternate.lanes) && (alternate = queue.lastRenderedReducer, null !== alternate)) try { var currentState = queue.lastRenderedState, eagerState = alternate(currentState, action); update.hasEagerState = true; update.eagerState = eagerState; if (objectIs(eagerState, currentState)) return enqueueUpdate$1(fiber, queue, update, 0), null === workInProgressRoot && finishQueueingConcurrentUpdates(), false; } catch (error) { } finally { } action = enqueueConcurrentHookUpdate(fiber, queue, update, lane); if (null !== action) return scheduleUpdateOnFiber(action, fiber, lane), entangleTransitionUpdate(action, queue, lane), true; } return false; } function dispatchOptimisticSetState(fiber, throwIfDuringRender, queue, action) { action = { lane: 2, revertLane: requestTransitionLane(), gesture: null, action, hasEagerState: false, eagerState: null, next: null }; if (isRenderPhaseUpdate(fiber)) { if (throwIfDuringRender) throw Error(formatProdErrorMessage(479)); } else throwIfDuringRender = enqueueConcurrentHookUpdate( fiber, queue, action, 2 ), null !== throwIfDuringRender && scheduleUpdateOnFiber(throwIfDuringRender, fiber, 2); } function isRenderPhaseUpdate(fiber) { var alternate = fiber.alternate; return fiber === currentlyRenderingFiber || null !== alternate && alternate === currentlyRenderingFiber; } function enqueueRenderPhaseUpdate(queue, update) { didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = true; var pending = queue.pending; null === pending ? update.next = update : (update.next = pending.next, pending.next = update); queue.pending = update; } function entangleTransitionUpdate(root2, queue, lane) { if (0 !== (lane & 4194048)) { var queueLanes = queue.lanes; queueLanes &= root2.pendingLanes; lane |= queueLanes; queue.lanes = lane; markRootEntangled(root2, lane); } } var ContextOnlyDispatcher = { readContext, use, useCallback: throwInvalidHookError, useContext: throwInvalidHookError, useEffect: throwInvalidHookError, useImperativeHandle: throwInvalidHookError, useLayoutEffect: throwInvalidHookError, useInsertionEffect: throwInvalidHookError, useMemo: throwInvalidHookError, useReducer: throwInvalidHookError, useRef: throwInvalidHookError, useState: throwInvalidHookError, useDebugValue: throwInvalidHookError, useDeferredValue: throwInvalidHookError, useTransition: throwInvalidHookError, useSyncExternalStore: throwInvalidHookError, useId: throwInvalidHookError, useHostTransitionStatus: throwInvalidHookError, useFormState: throwInvalidHookError, useActionState: throwInvalidHookError, useOptimistic: throwInvalidHookError, useMemoCache: throwInvalidHookError, useCacheRefresh: throwInvalidHookError }; ContextOnlyDispatcher.useEffectEvent = throwInvalidHookError; var HooksDispatcherOnMount = { readContext, use, useCallback: function(callback, deps) { mountWorkInProgressHook().memoizedState = [ callback, void 0 === deps ? null : deps ]; return callback; }, useContext: readContext, useEffect: mountEffect, useImperativeHandle: function(ref, create, deps) { deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null; mountEffectImpl( 4194308, 4, imperativeHandleEffect.bind(null, create, ref), deps ); }, useLayoutEffect: function(create, deps) { return mountEffectImpl(4194308, 4, create, deps); }, useInsertionEffect: function(create, deps) { mountEffectImpl(4, 2, create, deps); }, useMemo: function(nextCreate, deps) { var hook = mountWorkInProgressHook(); deps = void 0 === deps ? null : deps; var nextValue = nextCreate(); if (shouldDoubleInvokeUserFnsInHooksDEV) { setIsStrictModeForDevtools(true); try { nextCreate(); } finally { setIsStrictModeForDevtools(false); } } hook.memoizedState = [nextValue, deps]; return nextValue; }, useReducer: function(reducer, initialArg, init) { var hook = mountWorkInProgressHook(); if (void 0 !== init) { var initialState = init(initialArg); if (shouldDoubleInvokeUserFnsInHooksDEV) { setIsStrictModeForDevtools(true); try { init(initialArg); } finally { setIsStrictModeForDevtools(false); } } } else initialState = initialArg; hook.memoizedState = hook.baseState = initialState; reducer = { pending: null, lanes: 0, dispatch: null, lastRenderedReducer: reducer, lastRenderedState: initialState }; hook.queue = reducer; reducer = reducer.dispatch = dispatchReducerAction.bind( null, currentlyRenderingFiber, reducer ); return [hook.memoizedState, reducer]; }, useRef: function(initialValue) { var hook = mountWorkInProgressHook(); initialValue = { current: initialValue }; return hook.memoizedState = initialValue; }, useState: function(initialState) { initialState = mountStateImpl(initialState); var queue = initialState.queue, dispatch = dispatchSetState.bind(null, currentlyRenderingFiber, queue); queue.dispatch = dispatch; return [initialState.memoizedState, dispatch]; }, useDebugValue: mountDebugValue, useDeferredValue: function(value, initialValue) { var hook = mountWorkInProgressHook(); return mountDeferredValueImpl(hook, value, initialValue); }, useTransition: function() { var stateHook = mountStateImpl(false); stateHook = startTransition.bind( null, currentlyRenderingFiber, stateHook.queue, true, false ); mountWorkInProgressHook().memoizedState = stateHook; return [false, stateHook]; }, useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) { var fiber = currentlyRenderingFiber, hook = mountWorkInProgressHook(); if (isHydrating) { if (void 0 === getServerSnapshot) throw Error(formatProdErrorMessage(407)); getServerSnapshot = getServerSnapshot(); } else { getServerSnapshot = getSnapshot(); if (null === workInProgressRoot) throw Error(formatProdErrorMessage(349)); 0 !== (workInProgressRootRenderLanes & 127) || pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot); } hook.memoizedState = getServerSnapshot; var inst = { value: getServerSnapshot, getSnapshot }; hook.queue = inst; mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [ subscribe ]); fiber.flags |= 2048; pushSimpleEffect( 9, { destroy: void 0 }, updateStoreInstance.bind( null, fiber, inst, getServerSnapshot, getSnapshot ), null ); return getServerSnapshot; }, useId: function() { var hook = mountWorkInProgressHook(), identifierPrefix = workInProgressRoot.identifierPrefix; if (isHydrating) { var JSCompiler_inline_result = treeContextOverflow; var idWithLeadingBit = treeContextId; JSCompiler_inline_result = (idWithLeadingBit & ~(1 << 32 - clz32(idWithLeadingBit) - 1)).toString(32) + JSCompiler_inline_result; identifierPrefix = "_" + identifierPrefix + "R_" + JSCompiler_inline_result; JSCompiler_inline_result = localIdCounter++; 0 < JSCompiler_inline_result && (identifierPrefix += "H" + JSCompiler_inline_result.toString(32)); identifierPrefix += "_"; } else JSCompiler_inline_result = globalClientIdCounter++, identifierPrefix = "_" + identifierPrefix + "r_" + JSCompiler_inline_result.toString(32) + "_"; return hook.memoizedState = identifierPrefix; }, useHostTransitionStatus, useFormState: mountActionState, useActionState: mountActionState, useOptimistic: function(passthrough) { var hook = mountWorkInProgressHook(); hook.memoizedState = hook.baseState = passthrough; var queue = { pending: null, lanes: 0, dispatch: null, lastRenderedReducer: null, lastRenderedState: null }; hook.queue = queue; hook = dispatchOptimisticSetState.bind( null, currentlyRenderingFiber, true, queue ); queue.dispatch = hook; return [passthrough, hook]; }, useMemoCache, useCacheRefresh: function() { return mountWorkInProgressHook().memoizedState = refreshCache.bind( null, currentlyRenderingFiber ); }, useEffectEvent: function(callback) { var hook = mountWorkInProgressHook(), ref = { impl: callback }; hook.memoizedState = ref; return function() { if (0 !== (executionContext & 2)) throw Error(formatProdErrorMessage(440)); return ref.impl.apply(void 0, arguments); }; } }, HooksDispatcherOnUpdate = { readContext, use, useCallback: updateCallback, useContext: readContext, useEffect: updateEffect, useImperativeHandle: updateImperativeHandle, useInsertionEffect: updateInsertionEffect, useLayoutEffect: updateLayoutEffect, useMemo: updateMemo, useReducer: updateReducer, useRef: updateRef, useState: function() { return updateReducer(basicStateReducer); }, useDebugValue: mountDebugValue, useDeferredValue: function(value, initialValue) { var hook = updateWorkInProgressHook(); return updateDeferredValueImpl( hook, currentHook.memoizedState, value, initialValue ); }, useTransition: function() { var booleanOrThenable = updateReducer(basicStateReducer)[0], start = updateWorkInProgressHook().memoizedState; return [ "boolean" === typeof booleanOrThenable ? booleanOrThenable : useThenable(booleanOrThenable), start ]; }, useSyncExternalStore: updateSyncExternalStore, useId: updateId, useHostTransitionStatus, useFormState: updateActionState, useActionState: updateActionState, useOptimistic: function(passthrough, reducer) { var hook = updateWorkInProgressHook(); return updateOptimisticImpl(hook, currentHook, passthrough, reducer); }, useMemoCache, useCacheRefresh: updateRefresh }; HooksDispatcherOnUpdate.useEffectEvent = updateEvent; var HooksDispatcherOnRerender = { readContext, use, useCallback: updateCallback, useContext: readContext, useEffect: updateEffect, useImperativeHandle: updateImperativeHandle, useInsertionEffect: updateInsertionEffect, useLayoutEffect: updateLayoutEffect, useMemo: updateMemo, useReducer: rerenderReducer, useRef: updateRef, useState: function() { return rerenderReducer(basicStateReducer); }, useDebugValue: mountDebugValue, useDeferredValue: function(value, initialValue) { var hook = updateWorkInProgressHook(); return null === currentHook ? mountDeferredValueImpl(hook, value, initialValue) : updateDeferredValueImpl( hook, currentHook.memoizedState, value, initialValue ); }, useTransition: function() { var booleanOrThenable = rerenderReducer(basicStateReducer)[0], start = updateWorkInProgressHook().memoizedState; return [ "boolean" === typeof booleanOrThenable ? booleanOrThenable : useThenable(booleanOrThenable), start ]; }, useSyncExternalStore: updateSyncExternalStore, useId: updateId, useHostTransitionStatus, useFormState: rerenderActionState, useActionState: rerenderActionState, useOptimistic: function(passthrough, reducer) { var hook = updateWorkInProgressHook(); if (null !== currentHook) return updateOptimisticImpl(hook, currentHook, passthrough, reducer); hook.baseState = passthrough; return [passthrough, hook.queue.dispatch]; }, useMemoCache, useCacheRefresh: updateRefresh }; HooksDispatcherOnRerender.useEffectEvent = updateEvent; function applyDerivedStateFromProps(workInProgress2, ctor, getDerivedStateFromProps, nextProps) { ctor = workInProgress2.memoizedState; getDerivedStateFromProps = getDerivedStateFromProps(nextProps, ctor); getDerivedStateFromProps = null === getDerivedStateFromProps || void 0 === getDerivedStateFromProps ? ctor : assign({}, ctor, getDerivedStateFromProps); workInProgress2.memoizedState = getDerivedStateFromProps; 0 === workInProgress2.lanes && (workInProgress2.updateQueue.baseState = getDerivedStateFromProps); } var classComponentUpdater = { enqueueSetState: function(inst, payload, callback) { inst = inst._reactInternals; var lane = requestUpdateLane(), update = createUpdate(lane); update.payload = payload; void 0 !== callback && null !== callback && (update.callback = callback); payload = enqueueUpdate(inst, update, lane); null !== payload && (scheduleUpdateOnFiber(payload, inst, lane), entangleTransitions(payload, inst, lane)); }, enqueueReplaceState: function(inst, payload, callback) { inst = inst._reactInternals; var lane = requestUpdateLane(), update = createUpdate(lane); update.tag = 1; update.payload = payload; void 0 !== callback && null !== callback && (update.callback = callback); payload = enqueueUpdate(inst, update, lane); null !== payload && (scheduleUpdateOnFiber(payload, inst, lane), entangleTransitions(payload, inst, lane)); }, enqueueForceUpdate: function(inst, callback) { inst = inst._reactInternals; var lane = requestUpdateLane(), update = createUpdate(lane); update.tag = 2; void 0 !== callback && null !== callback && (update.callback = callback); callback = enqueueUpdate(inst, update, lane); null !== callback && (scheduleUpdateOnFiber(callback, inst, lane), entangleTransitions(callback, inst, lane)); } }; function checkShouldComponentUpdate(workInProgress2, ctor, oldProps, newProps, oldState, newState, nextContext) { workInProgress2 = workInProgress2.stateNode; return "function" === typeof workInProgress2.shouldComponentUpdate ? workInProgress2.shouldComponentUpdate(newProps, newState, nextContext) : ctor.prototype && ctor.prototype.isPureReactComponent ? !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState) : true; } function callComponentWillReceiveProps(workInProgress2, instance, newProps, nextContext) { workInProgress2 = instance.state; "function" === typeof instance.componentWillReceiveProps && instance.componentWillReceiveProps(newProps, nextContext); "function" === typeof instance.UNSAFE_componentWillReceiveProps && instance.UNSAFE_componentWillReceiveProps(newProps, nextContext); instance.state !== workInProgress2 && classComponentUpdater.enqueueReplaceState(instance, instance.state, null); } function resolveClassComponentProps(Component, baseProps) { var newProps = baseProps; if ("ref" in baseProps) { newProps = {}; for (var propName in baseProps) "ref" !== propName && (newProps[propName] = baseProps[propName]); } if (Component = Component.defaultProps) { newProps === baseProps && (newProps = assign({}, newProps)); for (var propName$73 in Component) void 0 === newProps[propName$73] && (newProps[propName$73] = Component[propName$73]); } return newProps; } function defaultOnUncaughtError(error) { reportGlobalError(error); } function defaultOnCaughtError(error) { console.error(error); } function defaultOnRecoverableError(error) { reportGlobalError(error); } function logUncaughtError(root2, errorInfo) { try { var onUncaughtError = root2.onUncaughtError; onUncaughtError(errorInfo.value, { componentStack: errorInfo.stack }); } catch (e$74) { setTimeout(function() { throw e$74; }); } } function logCaughtError(root2, boundary, errorInfo) { try { var onCaughtError = root2.onCaughtError; onCaughtError(errorInfo.value, { componentStack: errorInfo.stack, errorBoundary: 1 === boundary.tag ? boundary.stateNode : null }); } catch (e$75) { setTimeout(function() { throw e$75; }); } } function createRootErrorUpdate(root2, errorInfo, lane) { lane = createUpdate(lane); lane.tag = 3; lane.payload = { element: null }; lane.callback = function() { logUncaughtError(root2, errorInfo); }; return lane; } function createClassErrorUpdate(lane) { lane = createUpdate(lane); lane.tag = 3; return lane; } function initializeClassErrorUpdate(update, root2, fiber, errorInfo) { var getDerivedStateFromError = fiber.type.getDerivedStateFromError; if ("function" === typeof getDerivedStateFromError) { var error = errorInfo.value; update.payload = function() { return getDerivedStateFromError(error); }; update.callback = function() { logCaughtError(root2, fiber, errorInfo); }; } var inst = fiber.stateNode; null !== inst && "function" === typeof inst.componentDidCatch && (update.callback = function() { logCaughtError(root2, fiber, errorInfo); "function" !== typeof getDerivedStateFromError && (null === legacyErrorBoundariesThatAlreadyFailed ? legacyErrorBoundariesThatAlreadyFailed = new Set([this]) : legacyErrorBoundariesThatAlreadyFailed.add(this)); var stack = errorInfo.stack; this.componentDidCatch(errorInfo.value, { componentStack: null !== stack ? stack : "" }); }); } function throwException(root2, returnFiber, sourceFiber, value, rootRenderLanes) { sourceFiber.flags |= 32768; if (null !== value && "object" === typeof value && "function" === typeof value.then) { returnFiber = sourceFiber.alternate; null !== returnFiber && propagateParentContextChanges( returnFiber, sourceFiber, rootRenderLanes, true ); sourceFiber = suspenseHandlerStackCursor.current; if (null !== sourceFiber) { switch (sourceFiber.tag) { case 31: case 13: return null === shellBoundary ? renderDidSuspendDelayIfPossible() : null === sourceFiber.alternate && 0 === workInProgressRootExitStatus && (workInProgressRootExitStatus = 3), sourceFiber.flags &= -257, sourceFiber.flags |= 65536, sourceFiber.lanes = rootRenderLanes, value === noopSuspenseyCommitThenable ? sourceFiber.flags |= 16384 : (returnFiber = sourceFiber.updateQueue, null === returnFiber ? sourceFiber.updateQueue = new Set([value]) : returnFiber.add(value), attachPingListener(root2, value, rootRenderLanes)), false; case 22: return sourceFiber.flags |= 65536, value === noopSuspenseyCommitThenable ? sourceFiber.flags |= 16384 : (returnFiber = sourceFiber.updateQueue, null === returnFiber ? (returnFiber = { transitions: null, markerInstances: null, retryQueue: new Set([value]) }, sourceFiber.updateQueue = returnFiber) : (sourceFiber = returnFiber.retryQueue, null === sourceFiber ? returnFiber.retryQueue = new Set([value]) : sourceFiber.add(value)), attachPingListener(root2, value, rootRenderLanes)), false; } throw Error(formatProdErrorMessage(435, sourceFiber.tag)); } attachPingListener(root2, value, rootRenderLanes); renderDidSuspendDelayIfPossible(); return false; } if (isHydrating) return returnFiber = suspenseHandlerStackCursor.current, null !== returnFiber ? (0 === (returnFiber.flags & 65536) && (returnFiber.flags |= 256), returnFiber.flags |= 65536, returnFiber.lanes = rootRenderLanes, value !== HydrationMismatchException && (root2 = Error(formatProdErrorMessage(422), { cause: value }), queueHydrationError(createCapturedValueAtFiber(root2, sourceFiber)))) : (value !== HydrationMismatchException && (returnFiber = Error(formatProdErrorMessage(423), { cause: value }), queueHydrationError( createCapturedValueAtFiber(returnFiber, sourceFiber) )), root2 = root2.current.alternate, root2.flags |= 65536, rootRenderLanes &= -rootRenderLanes, root2.lanes |= rootRenderLanes, value = createCapturedValueAtFiber(value, sourceFiber), rootRenderLanes = createRootErrorUpdate( root2.stateNode, value, rootRenderLanes ), enqueueCapturedUpdate(root2, rootRenderLanes), 4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2)), false; var wrapperError = Error(formatProdErrorMessage(520), { cause: value }); wrapperError = createCapturedValueAtFiber(wrapperError, sourceFiber); null === workInProgressRootConcurrentErrors ? workInProgressRootConcurrentErrors = [wrapperError] : workInProgressRootConcurrentErrors.push(wrapperError); 4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2); if (null === returnFiber) return true; value = createCapturedValueAtFiber(value, sourceFiber); sourceFiber = returnFiber; do { switch (sourceFiber.tag) { case 3: return sourceFiber.flags |= 65536, root2 = rootRenderLanes & -rootRenderLanes, sourceFiber.lanes |= root2, root2 = createRootErrorUpdate(sourceFiber.stateNode, value, root2), enqueueCapturedUpdate(sourceFiber, root2), false; case 1: if (returnFiber = sourceFiber.type, wrapperError = sourceFiber.stateNode, 0 === (sourceFiber.flags & 128) && ("function" === typeof returnFiber.getDerivedStateFromError || null !== wrapperError && "function" === typeof wrapperError.componentDidCatch && (null === legacyErrorBoundariesThatAlreadyFailed || !legacyErrorBoundariesThatAlreadyFailed.has(wrapperError)))) return sourceFiber.flags |= 65536, rootRenderLanes &= -rootRenderLanes, sourceFiber.lanes |= rootRenderLanes, rootRenderLanes = createClassErrorUpdate(rootRenderLanes), initializeClassErrorUpdate( rootRenderLanes, root2, sourceFiber, value ), enqueueCapturedUpdate(sourceFiber, rootRenderLanes), false; } sourceFiber = sourceFiber.return; } while (null !== sourceFiber); return false; } var SelectiveHydrationException = Error(formatProdErrorMessage(461)), didReceiveUpdate = false; function reconcileChildren(current, workInProgress2, nextChildren, renderLanes2) { workInProgress2.child = null === current ? mountChildFibers(workInProgress2, null, nextChildren, renderLanes2) : reconcileChildFibers( workInProgress2, current.child, nextChildren, renderLanes2 ); } function updateForwardRef(current, workInProgress2, Component, nextProps, renderLanes2) { Component = Component.render; var ref = workInProgress2.ref; if ("ref" in nextProps) { var propsWithoutRef = {}; for (var key in nextProps) "ref" !== key && (propsWithoutRef[key] = nextProps[key]); } else propsWithoutRef = nextProps; prepareToReadContext(workInProgress2); nextProps = renderWithHooks( current, workInProgress2, Component, propsWithoutRef, ref, renderLanes2 ); key = checkDidRenderIdHook(); if (null !== current && !didReceiveUpdate) return bailoutHooks(current, workInProgress2, renderLanes2), bailoutOnAlreadyFinishedWork(current, workInProgress2, renderLanes2); isHydrating && key && pushMaterializedTreeId(workInProgress2); workInProgress2.flags |= 1; reconcileChildren(current, workInProgress2, nextProps, renderLanes2); return workInProgress2.child; } function updateMemoComponent(current, workInProgress2, Component, nextProps, renderLanes2) { if (null === current) { var type = Component.type; if ("function" === typeof type && !shouldConstruct(type) && void 0 === type.defaultProps && null === Component.compare) return workInProgress2.tag = 15, workInProgress2.type = type, updateSimpleMemoComponent( current, workInProgress2, type, nextProps, renderLanes2 ); current = createFiberFromTypeAndProps( Component.type, null, nextProps, workInProgress2, workInProgress2.mode, renderLanes2 ); current.ref = workInProgress2.ref; current.return = workInProgress2; return workInProgress2.child = current; } type = current.child; if (!checkScheduledUpdateOrContext(current, renderLanes2)) { var prevProps = type.memoizedProps; Component = Component.compare; Component = null !== Component ? Component : shallowEqual; if (Component(prevProps, nextProps) && current.ref === workInProgress2.ref) return bailoutOnAlreadyFinishedWork(current, workInProgress2, renderLanes2); } workInProgress2.flags |= 1; current = createWorkInProgress(type, nextProps); current.ref = workInProgress2.ref; current.return = workInProgress2; return workInProgress2.child = current; } function updateSimpleMemoComponent(current, workInProgress2, Component, nextProps, renderLanes2) { if (null !== current) { var prevProps = current.memoizedProps; if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress2.ref) if (didReceiveUpdate = false, workInProgress2.pendingProps = nextProps = prevProps, checkScheduledUpdateOrContext(current, renderLanes2)) 0 !== (current.flags & 131072) && (didReceiveUpdate = true); else return workInProgress2.lanes = current.lanes, bailoutOnAlreadyFinishedWork(current, workInProgress2, renderLanes2); } return updateFunctionComponent( current, workInProgress2, Component, nextProps, renderLanes2 ); } function updateOffscreenComponent(current, workInProgress2, renderLanes2, nextProps) { var nextChildren = nextProps.children, prevState = null !== current ? current.memoizedState : null; null === current && null === workInProgress2.stateNode && (workInProgress2.stateNode = { _visibility: 1, _pendingMarkers: null, _retryCache: null, _transitions: null }); if ("hidden" === nextProps.mode) { if (0 !== (workInProgress2.flags & 128)) { prevState = null !== prevState ? prevState.baseLanes | renderLanes2 : renderLanes2; if (null !== current) { nextProps = workInProgress2.child = current.child; for (nextChildren = 0; null !== nextProps; ) nextChildren = nextChildren | nextProps.lanes | nextProps.childLanes, nextProps = nextProps.sibling; nextProps = nextChildren & ~prevState; } else nextProps = 0, workInProgress2.child = null; return deferHiddenOffscreenComponent( current, workInProgress2, prevState, renderLanes2, nextProps ); } if (0 !== (renderLanes2 & 536870912)) workInProgress2.memoizedState = { baseLanes: 0, cachePool: null }, null !== current && pushTransition( workInProgress2, null !== prevState ? prevState.cachePool : null ), null !== prevState ? pushHiddenContext(workInProgress2, prevState) : reuseHiddenContextOnStack(), pushOffscreenSuspenseHandler(workInProgress2); else return nextProps = workInProgress2.lanes = 536870912, deferHiddenOffscreenComponent( current, workInProgress2, null !== prevState ? prevState.baseLanes | renderLanes2 : renderLanes2, renderLanes2, nextProps ); } else null !== prevState ? (pushTransition(workInProgress2, prevState.cachePool), pushHiddenContext(workInProgress2, prevState), reuseSuspenseHandlerOnStack(), workInProgress2.memoizedState = null) : (null !== current && pushTransition(workInProgress2, null), reuseHiddenContextOnStack(), reuseSuspenseHandlerOnStack()); reconcileChildren(current, workInProgress2, nextChildren, renderLanes2); return workInProgress2.child; } function bailoutOffscreenComponent(current, workInProgress2) { null !== current && 22 === current.tag || null !== workInProgress2.stateNode || (workInProgress2.stateNode = { _visibility: 1, _pendingMarkers: null, _retryCache: null, _transitions: null }); return workInProgress2.sibling; } function deferHiddenOffscreenComponent(current, workInProgress2, nextBaseLanes, renderLanes2, remainingChildLanes) { var JSCompiler_inline_result = peekCacheFromPool(); JSCompiler_inline_result = null === JSCompiler_inline_result ? null : { parent: CacheContext._currentValue, pool: JSCompiler_inline_result }; workInProgress2.memoizedState = { baseLanes: nextBaseLanes, cachePool: JSCompiler_inline_result }; null !== current && pushTransition(workInProgress2, null); reuseHiddenContextOnStack(); pushOffscreenSuspenseHandler(workInProgress2); null !== current && propagateParentContextChanges(current, workInProgress2, renderLanes2, true); workInProgress2.childLanes = remainingChildLanes; return null; } function mountActivityChildren(workInProgress2, nextProps) { nextProps = mountWorkInProgressOffscreenFiber( { mode: nextProps.mode, children: nextProps.children }, workInProgress2.mode ); nextProps.ref = workInProgress2.ref; workInProgress2.child = nextProps; nextProps.return = workInProgress2; return nextProps; } function retryActivityComponentWithoutHydrating(current, workInProgress2, renderLanes2) { reconcileChildFibers(workInProgress2, current.child, null, renderLanes2); current = mountActivityChildren(workInProgress2, workInProgress2.pendingProps); current.flags |= 2; popSuspenseHandler(workInProgress2); workInProgress2.memoizedState = null; return current; } function updateActivityComponent(current, workInProgress2, renderLanes2) { var nextProps = workInProgress2.pendingProps, didSuspend = 0 !== (workInProgress2.flags & 128); workInProgress2.flags &= -129; if (null === current) { if (isHydrating) { if ("hidden" === nextProps.mode) return current = mountActivityChildren(workInProgress2, nextProps), workInProgress2.lanes = 536870912, bailoutOffscreenComponent(null, current); pushDehydratedActivitySuspenseHandler(workInProgress2); (current = nextHydratableInstance) ? (current = canHydrateHydrationBoundary( current, rootOrSingletonContext ), current = null !== current && "&" === current.data ? current : null, null !== current && (workInProgress2.memoizedState = { dehydrated: current, treeContext: null !== treeContextProvider ? { id: treeContextId, overflow: treeContextOverflow } : null, retryLane: 536870912, hydrationErrors: null }, renderLanes2 = createFiberFromDehydratedFragment(current), renderLanes2.return = workInProgress2, workInProgress2.child = renderLanes2, hydrationParentFiber = workInProgress2, nextHydratableInstance = null)) : current = null; if (null === current) throw throwOnHydrationMismatch(workInProgress2); workInProgress2.lanes = 536870912; return null; } return mountActivityChildren(workInProgress2, nextProps); } var prevState = current.memoizedState; if (null !== prevState) { var dehydrated = prevState.dehydrated; pushDehydratedActivitySuspenseHandler(workInProgress2); if (didSuspend) if (workInProgress2.flags & 256) workInProgress2.flags &= -257, workInProgress2 = retryActivityComponentWithoutHydrating( current, workInProgress2, renderLanes2 ); else if (null !== workInProgress2.memoizedState) workInProgress2.child = current.child, workInProgress2.flags |= 128, workInProgress2 = null; else throw Error(formatProdErrorMessage(558)); else if (didReceiveUpdate || propagateParentContextChanges(current, workInProgress2, renderLanes2, false), didSuspend = 0 !== (renderLanes2 & current.childLanes), didReceiveUpdate || didSuspend) { nextProps = workInProgressRoot; if (null !== nextProps && (dehydrated = getBumpedLaneForHydration(nextProps, renderLanes2), 0 !== dehydrated && dehydrated !== prevState.retryLane)) throw prevState.retryLane = dehydrated, enqueueConcurrentRenderForLane(current, dehydrated), scheduleUpdateOnFiber(nextProps, current, dehydrated), SelectiveHydrationException; renderDidSuspendDelayIfPossible(); workInProgress2 = retryActivityComponentWithoutHydrating( current, workInProgress2, renderLanes2 ); } else current = prevState.treeContext, nextHydratableInstance = getNextHydratable(dehydrated.nextSibling), hydrationParentFiber = workInProgress2, isHydrating = true, hydrationErrors = null, rootOrSingletonContext = false, null !== current && restoreSuspendedTreeContext(workInProgress2, current), workInProgress2 = mountActivityChildren(workInProgress2, nextProps), workInProgress2.flags |= 4096; return workInProgress2; } current = createWorkInProgress(current.child, { mode: nextProps.mode, children: nextProps.children }); current.ref = workInProgress2.ref; workInProgress2.child = current; current.return = workInProgress2; return current; } function markRef(current, workInProgress2) { var ref = workInProgress2.ref; if (null === ref) null !== current && null !== current.ref && (workInProgress2.flags |= 4194816); else { if ("function" !== typeof ref && "object" !== typeof ref) throw Error(formatProdErrorMessage(284)); if (null === current || current.ref !== ref) workInProgress2.flags |= 4194816; } } function updateFunctionComponent(current, workInProgress2, Component, nextProps, renderLanes2) { prepareToReadContext(workInProgress2); Component = renderWithHooks( current, workInProgress2, Component, nextProps, void 0, renderLanes2 ); nextProps = checkDidRenderIdHook(); if (null !== current && !didReceiveUpdate) return bailoutHooks(current, workInProgress2, renderLanes2), bailoutOnAlreadyFinishedWork(current, workInProgress2, renderLanes2); isHydrating && nextProps && pushMaterializedTreeId(workInProgress2); workInProgress2.flags |= 1; reconcileChildren(current, workInProgress2, Component, renderLanes2); return workInProgress2.child; } function replayFunctionComponent(current, workInProgress2, nextProps, Component, secondArg, renderLanes2) { prepareToReadContext(workInProgress2); workInProgress2.updateQueue = null; nextProps = renderWithHooksAgain( workInProgress2, Component, nextProps, secondArg ); finishRenderingHooks(current); Component = checkDidRenderIdHook(); if (null !== current && !didReceiveUpdate) return bailoutHooks(current, workInProgress2, renderLanes2), bailoutOnAlreadyFinishedWork(current, workInProgress2, renderLanes2); isHydrating && Component && pushMaterializedTreeId(workInProgress2); workInProgress2.flags |= 1; reconcileChildren(current, workInProgress2, nextProps, renderLanes2); return workInProgress2.child; } function updateClassComponent(current, workInProgress2, Component, nextProps, renderLanes2) { prepareToReadContext(workInProgress2); if (null === workInProgress2.stateNode) { var context = emptyContextObject, contextType = Component.contextType; "object" === typeof contextType && null !== contextType && (context = readContext(contextType)); context = new Component(nextProps, context); workInProgress2.memoizedState = null !== context.state && void 0 !== context.state ? context.state : null; context.updater = classComponentUpdater; workInProgress2.stateNode = context; context._reactInternals = workInProgress2; context = workInProgress2.stateNode; context.props = nextProps; context.state = workInProgress2.memoizedState; context.refs = {}; initializeUpdateQueue(workInProgress2); contextType = Component.contextType; context.context = "object" === typeof contextType && null !== contextType ? readContext(contextType) : emptyContextObject; context.state = workInProgress2.memoizedState; contextType = Component.getDerivedStateFromProps; "function" === typeof contextType && (applyDerivedStateFromProps( workInProgress2, Component, contextType, nextProps ), context.state = workInProgress2.memoizedState); "function" === typeof Component.getDerivedStateFromProps || "function" === typeof context.getSnapshotBeforeUpdate || "function" !== typeof context.UNSAFE_componentWillMount && "function" !== typeof context.componentWillMount || (contextType = context.state, "function" === typeof context.componentWillMount && context.componentWillMount(), "function" === typeof context.UNSAFE_componentWillMount && context.UNSAFE_componentWillMount(), contextType !== context.state && classComponentUpdater.enqueueReplaceState(context, context.state, null), processUpdateQueue(workInProgress2, nextProps, context, renderLanes2), suspendIfUpdateReadFromEntangledAsyncAction(), context.state = workInProgress2.memoizedState); "function" === typeof context.componentDidMount && (workInProgress2.flags |= 4194308); nextProps = true; } else if (null === current) { context = workInProgress2.stateNode; var unresolvedOldProps = workInProgress2.memoizedProps, oldProps = resolveClassComponentProps(Component, unresolvedOldProps); context.props = oldProps; var oldContext = context.context, contextType$jscomp$0 = Component.contextType; contextType = emptyContextObject; "object" === typeof contextType$jscomp$0 && null !== contextType$jscomp$0 && (contextType = readContext(contextType$jscomp$0)); var getDerivedStateFromProps = Component.getDerivedStateFromProps; contextType$jscomp$0 = "function" === typeof getDerivedStateFromProps || "function" === typeof context.getSnapshotBeforeUpdate; unresolvedOldProps = workInProgress2.pendingProps !== unresolvedOldProps; contextType$jscomp$0 || "function" !== typeof context.UNSAFE_componentWillReceiveProps && "function" !== typeof context.componentWillReceiveProps || (unresolvedOldProps || oldContext !== contextType) && callComponentWillReceiveProps( workInProgress2, context, nextProps, contextType ); hasForceUpdate = false; var oldState = workInProgress2.memoizedState; context.state = oldState; processUpdateQueue(workInProgress2, nextProps, context, renderLanes2); suspendIfUpdateReadFromEntangledAsyncAction(); oldContext = workInProgress2.memoizedState; unresolvedOldProps || oldState !== oldContext || hasForceUpdate ? ("function" === typeof getDerivedStateFromProps && (applyDerivedStateFromProps( workInProgress2, Component, getDerivedStateFromProps, nextProps ), oldContext = workInProgress2.memoizedState), (oldProps = hasForceUpdate || checkShouldComponentUpdate( workInProgress2, Component, oldProps, nextProps, oldState, oldContext, contextType )) ? (contextType$jscomp$0 || "function" !== typeof context.UNSAFE_componentWillMount && "function" !== typeof context.componentWillMount || ("function" === typeof context.componentWillMount && context.componentWillMount(), "function" === typeof context.UNSAFE_componentWillMount && context.UNSAFE_componentWillMount()), "function" === typeof context.componentDidMount && (workInProgress2.flags |= 4194308)) : ("function" === typeof context.componentDidMount && (workInProgress2.flags |= 4194308), workInProgress2.memoizedProps = nextProps, workInProgress2.memoizedState = oldContext), context.props = nextProps, context.state = oldContext, context.context = contextType, nextProps = oldProps) : ("function" === typeof context.componentDidMount && (workInProgress2.flags |= 4194308), nextProps = false); } else { context = workInProgress2.stateNode; cloneUpdateQueue(current, workInProgress2); contextType = workInProgress2.memoizedProps; contextType$jscomp$0 = resolveClassComponentProps(Component, contextType); context.props = contextType$jscomp$0; getDerivedStateFromProps = workInProgress2.pendingProps; oldState = context.context; oldContext = Component.contextType; oldProps = emptyContextObject; "object" === typeof oldContext && null !== oldContext && (oldProps = readContext(oldContext)); unresolvedOldProps = Component.getDerivedStateFromProps; (oldContext = "function" === typeof unresolvedOldProps || "function" === typeof context.getSnapshotBeforeUpdate) || "function" !== typeof context.UNSAFE_componentWillReceiveProps && "function" !== typeof context.componentWillReceiveProps || (contextType !== getDerivedStateFromProps || oldState !== oldProps) && callComponentWillReceiveProps( workInProgress2, context, nextProps, oldProps ); hasForceUpdate = false; oldState = workInProgress2.memoizedState; context.state = oldState; processUpdateQueue(workInProgress2, nextProps, context, renderLanes2); suspendIfUpdateReadFromEntangledAsyncAction(); var newState = workInProgress2.memoizedState; contextType !== getDerivedStateFromProps || oldState !== newState || hasForceUpdate || null !== current && null !== current.dependencies && checkIfContextChanged(current.dependencies) ? ("function" === typeof unresolvedOldProps && (applyDerivedStateFromProps( workInProgress2, Component, unresolvedOldProps, nextProps ), newState = workInProgress2.memoizedState), (contextType$jscomp$0 = hasForceUpdate || checkShouldComponentUpdate( workInProgress2, Component, contextType$jscomp$0, nextProps, oldState, newState, oldProps ) || null !== current && null !== current.dependencies && checkIfContextChanged(current.dependencies)) ? (oldContext || "function" !== typeof context.UNSAFE_componentWillUpdate && "function" !== typeof context.componentWillUpdate || ("function" === typeof context.componentWillUpdate && context.componentWillUpdate(nextProps, newState, oldProps), "function" === typeof context.UNSAFE_componentWillUpdate && context.UNSAFE_componentWillUpdate( nextProps, newState, oldProps )), "function" === typeof context.componentDidUpdate && (workInProgress2.flags |= 4), "function" === typeof context.getSnapshotBeforeUpdate && (workInProgress2.flags |= 1024)) : ("function" !== typeof context.componentDidUpdate || contextType === current.memoizedProps && oldState === current.memoizedState || (workInProgress2.flags |= 4), "function" !== typeof context.getSnapshotBeforeUpdate || contextType === current.memoizedProps && oldState === current.memoizedState || (workInProgress2.flags |= 1024), workInProgress2.memoizedProps = nextProps, workInProgress2.memoizedState = newState), context.props = nextProps, context.state = newState, context.context = oldProps, nextProps = contextType$jscomp$0) : ("function" !== typeof context.componentDidUpdate || contextType === current.memoizedProps && oldState === current.memoizedState || (workInProgress2.flags |= 4), "function" !== typeof context.getSnapshotBeforeUpdate || contextType === current.memoizedProps && oldState === current.memoizedState || (workInProgress2.flags |= 1024), nextProps = false); } context = nextProps; markRef(current, workInProgress2); nextProps = 0 !== (workInProgress2.flags & 128); context || nextProps ? (context = workInProgress2.stateNode, Component = nextProps && "function" !== typeof Component.getDerivedStateFromError ? null : context.render(), workInProgress2.flags |= 1, null !== current && nextProps ? (workInProgress2.child = reconcileChildFibers( workInProgress2, current.child, null, renderLanes2 ), workInProgress2.child = reconcileChildFibers( workInProgress2, null, Component, renderLanes2 )) : reconcileChildren(current, workInProgress2, Component, renderLanes2), workInProgress2.memoizedState = context.state, current = workInProgress2.child) : current = bailoutOnAlreadyFinishedWork( current, workInProgress2, renderLanes2 ); return current; } function mountHostRootWithoutHydrating(current, workInProgress2, nextChildren, renderLanes2) { resetHydrationState(); workInProgress2.flags |= 256; reconcileChildren(current, workInProgress2, nextChildren, renderLanes2); return workInProgress2.child; } var SUSPENDED_MARKER = { dehydrated: null, treeContext: null, retryLane: 0, hydrationErrors: null }; function mountSuspenseOffscreenState(renderLanes2) { return { baseLanes: renderLanes2, cachePool: getSuspendedCache() }; } function getRemainingWorkInPrimaryTree(current, primaryTreeDidDefer, renderLanes2) { current = null !== current ? current.childLanes & ~renderLanes2 : 0; primaryTreeDidDefer && (current |= workInProgressDeferredLane); return current; } function updateSuspenseComponent(current, workInProgress2, renderLanes2) { var nextProps = workInProgress2.pendingProps, showFallback = false, didSuspend = 0 !== (workInProgress2.flags & 128), JSCompiler_temp; (JSCompiler_temp = didSuspend) || (JSCompiler_temp = null !== current && null === current.memoizedState ? false : 0 !== (suspenseStackCursor.current & 2)); JSCompiler_temp && (showFallback = true, workInProgress2.flags &= -129); JSCompiler_temp = 0 !== (workInProgress2.flags & 32); workInProgress2.flags &= -33; if (null === current) { if (isHydrating) { showFallback ? pushPrimaryTreeSuspenseHandler(workInProgress2) : reuseSuspenseHandlerOnStack(); (current = nextHydratableInstance) ? (current = canHydrateHydrationBoundary( current, rootOrSingletonContext ), current = null !== current && "&" !== current.data ? current : null, null !== current && (workInProgress2.memoizedState = { dehydrated: current, treeContext: null !== treeContextProvider ? { id: treeContextId, overflow: treeContextOverflow } : null, retryLane: 536870912, hydrationErrors: null }, renderLanes2 = createFiberFromDehydratedFragment(current), renderLanes2.return = workInProgress2, workInProgress2.child = renderLanes2, hydrationParentFiber = workInProgress2, nextHydratableInstance = null)) : current = null; if (null === current) throw throwOnHydrationMismatch(workInProgress2); isSuspenseInstanceFallback(current) ? workInProgress2.lanes = 32 : workInProgress2.lanes = 536870912; return null; } var nextPrimaryChildren = nextProps.children; nextProps = nextProps.fallback; if (showFallback) return reuseSuspenseHandlerOnStack(), showFallback = workInProgress2.mode, nextPrimaryChildren = mountWorkInProgressOffscreenFiber( { mode: "hidden", children: nextPrimaryChildren }, showFallback ), nextProps = createFiberFromFragment( nextProps, showFallback, renderLanes2, null ), nextPrimaryChildren.return = workInProgress2, nextProps.return = workInProgress2, nextPrimaryChildren.sibling = nextProps, workInProgress2.child = nextPrimaryChildren, nextProps = workInProgress2.child, nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes2), nextProps.childLanes = getRemainingWorkInPrimaryTree( current, JSCompiler_temp, renderLanes2 ), workInProgress2.memoizedState = SUSPENDED_MARKER, bailoutOffscreenComponent(null, nextProps); pushPrimaryTreeSuspenseHandler(workInProgress2); return mountSuspensePrimaryChildren(workInProgress2, nextPrimaryChildren); } var prevState = current.memoizedState; if (null !== prevState && (nextPrimaryChildren = prevState.dehydrated, null !== nextPrimaryChildren)) { if (didSuspend) workInProgress2.flags & 256 ? (pushPrimaryTreeSuspenseHandler(workInProgress2), workInProgress2.flags &= -257, workInProgress2 = retrySuspenseComponentWithoutHydrating( current, workInProgress2, renderLanes2 )) : null !== workInProgress2.memoizedState ? (reuseSuspenseHandlerOnStack(), workInProgress2.child = current.child, workInProgress2.flags |= 128, workInProgress2 = null) : (reuseSuspenseHandlerOnStack(), nextPrimaryChildren = nextProps.fallback, showFallback = workInProgress2.mode, nextProps = mountWorkInProgressOffscreenFiber( { mode: "visible", children: nextProps.children }, showFallback ), nextPrimaryChildren = createFiberFromFragment( nextPrimaryChildren, showFallback, renderLanes2, null ), nextPrimaryChildren.flags |= 2, nextProps.return = workInProgress2, nextPrimaryChildren.return = workInProgress2, nextProps.sibling = nextPrimaryChildren, workInProgress2.child = nextProps, reconcileChildFibers( workInProgress2, current.child, null, renderLanes2 ), nextProps = workInProgress2.child, nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes2), nextProps.childLanes = getRemainingWorkInPrimaryTree( current, JSCompiler_temp, renderLanes2 ), workInProgress2.memoizedState = SUSPENDED_MARKER, workInProgress2 = bailoutOffscreenComponent(null, nextProps)); else if (pushPrimaryTreeSuspenseHandler(workInProgress2), isSuspenseInstanceFallback(nextPrimaryChildren)) { JSCompiler_temp = nextPrimaryChildren.nextSibling && nextPrimaryChildren.nextSibling.dataset; if (JSCompiler_temp) var digest = JSCompiler_temp.dgst; JSCompiler_temp = digest; nextProps = Error(formatProdErrorMessage(419)); nextProps.stack = ""; nextProps.digest = JSCompiler_temp; queueHydrationError({ value: nextProps, source: null, stack: null }); workInProgress2 = retrySuspenseComponentWithoutHydrating( current, workInProgress2, renderLanes2 ); } else if (didReceiveUpdate || propagateParentContextChanges(current, workInProgress2, renderLanes2, false), JSCompiler_temp = 0 !== (renderLanes2 & current.childLanes), didReceiveUpdate || JSCompiler_temp) { JSCompiler_temp = workInProgressRoot; if (null !== JSCompiler_temp && (nextProps = getBumpedLaneForHydration(JSCompiler_temp, renderLanes2), 0 !== nextProps && nextProps !== prevState.retryLane)) throw prevState.retryLane = nextProps, enqueueConcurrentRenderForLane(current, nextProps), scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps), SelectiveHydrationException; isSuspenseInstancePending(nextPrimaryChildren) || renderDidSuspendDelayIfPossible(); workInProgress2 = retrySuspenseComponentWithoutHydrating( current, workInProgress2, renderLanes2 ); } else isSuspenseInstancePending(nextPrimaryChildren) ? (workInProgress2.flags |= 192, workInProgress2.child = current.child, workInProgress2 = null) : (current = prevState.treeContext, nextHydratableInstance = getNextHydratable( nextPrimaryChildren.nextSibling ), hydrationParentFiber = workInProgress2, isHydrating = true, hydrationErrors = null, rootOrSingletonContext = false, null !== current && restoreSuspendedTreeContext(workInProgress2, current), workInProgress2 = mountSuspensePrimaryChildren( workInProgress2, nextProps.children ), workInProgress2.flags |= 4096); return workInProgress2; } if (showFallback) return reuseSuspenseHandlerOnStack(), nextPrimaryChildren = nextProps.fallback, showFallback = workInProgress2.mode, prevState = current.child, digest = prevState.sibling, nextProps = createWorkInProgress(prevState, { mode: "hidden", children: nextProps.children }), nextProps.subtreeFlags = prevState.subtreeFlags & 65011712, null !== digest ? nextPrimaryChildren = createWorkInProgress( digest, nextPrimaryChildren ) : (nextPrimaryChildren = createFiberFromFragment( nextPrimaryChildren, showFallback, renderLanes2, null ), nextPrimaryChildren.flags |= 2), nextPrimaryChildren.return = workInProgress2, nextProps.return = workInProgress2, nextProps.sibling = nextPrimaryChildren, workInProgress2.child = nextProps, bailoutOffscreenComponent(null, nextProps), nextProps = workInProgress2.child, nextPrimaryChildren = current.child.memoizedState, null === nextPrimaryChildren ? nextPrimaryChildren = mountSuspenseOffscreenState(renderLanes2) : (showFallback = nextPrimaryChildren.cachePool, null !== showFallback ? (prevState = CacheContext._currentValue, showFallback = showFallback.parent !== prevState ? { parent: prevState, pool: prevState } : showFallback) : showFallback = getSuspendedCache(), nextPrimaryChildren = { baseLanes: nextPrimaryChildren.baseLanes | renderLanes2, cachePool: showFallback }), nextProps.memoizedState = nextPrimaryChildren, nextProps.childLanes = getRemainingWorkInPrimaryTree( current, JSCompiler_temp, renderLanes2 ), workInProgress2.memoizedState = SUSPENDED_MARKER, bailoutOffscreenComponent(current.child, nextProps); pushPrimaryTreeSuspenseHandler(workInProgress2); renderLanes2 = current.child; current = renderLanes2.sibling; renderLanes2 = createWorkInProgress(renderLanes2, { mode: "visible", children: nextProps.children }); renderLanes2.return = workInProgress2; renderLanes2.sibling = null; null !== current && (JSCompiler_temp = workInProgress2.deletions, null === JSCompiler_temp ? (workInProgress2.deletions = [current], workInProgress2.flags |= 16) : JSCompiler_temp.push(current)); workInProgress2.child = renderLanes2; workInProgress2.memoizedState = null; return renderLanes2; } function mountSuspensePrimaryChildren(workInProgress2, primaryChildren) { primaryChildren = mountWorkInProgressOffscreenFiber( { mode: "visible", children: primaryChildren }, workInProgress2.mode ); primaryChildren.return = workInProgress2; return workInProgress2.child = primaryChildren; } function mountWorkInProgressOffscreenFiber(offscreenProps, mode) { offscreenProps = createFiberImplClass(22, offscreenProps, null, mode); offscreenProps.lanes = 0; return offscreenProps; } function retrySuspenseComponentWithoutHydrating(current, workInProgress2, renderLanes2) { reconcileChildFibers(workInProgress2, current.child, null, renderLanes2); current = mountSuspensePrimaryChildren( workInProgress2, workInProgress2.pendingProps.children ); current.flags |= 2; workInProgress2.memoizedState = null; return current; } function scheduleSuspenseWorkOnFiber(fiber, renderLanes2, propagationRoot) { fiber.lanes |= renderLanes2; var alternate = fiber.alternate; null !== alternate && (alternate.lanes |= renderLanes2); scheduleContextWorkOnParentPath(fiber.return, renderLanes2, propagationRoot); } function initSuspenseListRenderState(workInProgress2, isBackwards, tail, lastContentRow, tailMode, treeForkCount2) { var renderState = workInProgress2.memoizedState; null === renderState ? workInProgress2.memoizedState = { isBackwards, rendering: null, renderingStartTime: 0, last: lastContentRow, tail, tailMode, treeForkCount: treeForkCount2 } : (renderState.isBackwards = isBackwards, renderState.rendering = null, renderState.renderingStartTime = 0, renderState.last = lastContentRow, renderState.tail = tail, renderState.tailMode = tailMode, renderState.treeForkCount = treeForkCount2); } function updateSuspenseListComponent(current, workInProgress2, renderLanes2) { var nextProps = workInProgress2.pendingProps, revealOrder = nextProps.revealOrder, tailMode = nextProps.tail; nextProps = nextProps.children; var suspenseContext = suspenseStackCursor.current, shouldForceFallback = 0 !== (suspenseContext & 2); shouldForceFallback ? (suspenseContext = suspenseContext & 1 | 2, workInProgress2.flags |= 128) : suspenseContext &= 1; push(suspenseStackCursor, suspenseContext); reconcileChildren(current, workInProgress2, nextProps, renderLanes2); nextProps = isHydrating ? treeForkCount : 0; if (!shouldForceFallback && null !== current && 0 !== (current.flags & 128)) a: for (current = workInProgress2.child; null !== current; ) { if (13 === current.tag) null !== current.memoizedState && scheduleSuspenseWorkOnFiber(current, renderLanes2, workInProgress2); else if (19 === current.tag) scheduleSuspenseWorkOnFiber(current, renderLanes2, workInProgress2); else if (null !== current.child) { current.child.return = current; current = current.child; continue; } if (current === workInProgress2) break a; for (; null === current.sibling; ) { if (null === current.return || current.return === workInProgress2) break a; current = current.return; } current.sibling.return = current.return; current = current.sibling; } switch (revealOrder) { case "forwards": renderLanes2 = workInProgress2.child; for (revealOrder = null; null !== renderLanes2; ) current = renderLanes2.alternate, null !== current && null === findFirstSuspended(current) && (revealOrder = renderLanes2), renderLanes2 = renderLanes2.sibling; renderLanes2 = revealOrder; null === renderLanes2 ? (revealOrder = workInProgress2.child, workInProgress2.child = null) : (revealOrder = renderLanes2.sibling, renderLanes2.sibling = null); initSuspenseListRenderState( workInProgress2, false, revealOrder, renderLanes2, tailMode, nextProps ); break; case "backwards": case "unstable_legacy-backwards": renderLanes2 = null; revealOrder = workInProgress2.child; for (workInProgress2.child = null; null !== revealOrder; ) { current = revealOrder.alternate; if (null !== current && null === findFirstSuspended(current)) { workInProgress2.child = revealOrder; break; } current = revealOrder.sibling; revealOrder.sibling = renderLanes2; renderLanes2 = revealOrder; revealOrder = current; } initSuspenseListRenderState( workInProgress2, true, renderLanes2, null, tailMode, nextProps ); break; case "together": initSuspenseListRenderState( workInProgress2, false, null, null, void 0, nextProps ); break; default: workInProgress2.memoizedState = null; } return workInProgress2.child; } function bailoutOnAlreadyFinishedWork(current, workInProgress2, renderLanes2) { null !== current && (workInProgress2.dependencies = current.dependencies); workInProgressRootSkippedLanes |= workInProgress2.lanes; if (0 === (renderLanes2 & workInProgress2.childLanes)) if (null !== current) { if (propagateParentContextChanges( current, workInProgress2, renderLanes2, false ), 0 === (renderLanes2 & workInProgress2.childLanes)) return null; } else return null; if (null !== current && workInProgress2.child !== current.child) throw Error(formatProdErrorMessage(153)); if (null !== workInProgress2.child) { current = workInProgress2.child; renderLanes2 = createWorkInProgress(current, current.pendingProps); workInProgress2.child = renderLanes2; for (renderLanes2.return = workInProgress2; null !== current.sibling; ) current = current.sibling, renderLanes2 = renderLanes2.sibling = createWorkInProgress(current, current.pendingProps), renderLanes2.return = workInProgress2; renderLanes2.sibling = null; } return workInProgress2.child; } function checkScheduledUpdateOrContext(current, renderLanes2) { if (0 !== (current.lanes & renderLanes2)) return true; current = current.dependencies; return null !== current && checkIfContextChanged(current) ? true : false; } function attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress2, renderLanes2) { switch (workInProgress2.tag) { case 3: pushHostContainer(workInProgress2, workInProgress2.stateNode.containerInfo); pushProvider(workInProgress2, CacheContext, current.memoizedState.cache); resetHydrationState(); break; case 27: case 5: pushHostContext(workInProgress2); break; case 4: pushHostContainer(workInProgress2, workInProgress2.stateNode.containerInfo); break; case 10: pushProvider( workInProgress2, workInProgress2.type, workInProgress2.memoizedProps.value ); break; case 31: if (null !== workInProgress2.memoizedState) return workInProgress2.flags |= 128, pushDehydratedActivitySuspenseHandler(workInProgress2), null; break; case 13: var state$102 = workInProgress2.memoizedState; if (null !== state$102) { if (null !== state$102.dehydrated) return pushPrimaryTreeSuspenseHandler(workInProgress2), workInProgress2.flags |= 128, null; if (0 !== (renderLanes2 & workInProgress2.child.childLanes)) return updateSuspenseComponent(current, workInProgress2, renderLanes2); pushPrimaryTreeSuspenseHandler(workInProgress2); current = bailoutOnAlreadyFinishedWork( current, workInProgress2, renderLanes2 ); return null !== current ? current.sibling : null; } pushPrimaryTreeSuspenseHandler(workInProgress2); break; case 19: var didSuspendBefore = 0 !== (current.flags & 128); state$102 = 0 !== (renderLanes2 & workInProgress2.childLanes); state$102 || (propagateParentContextChanges( current, workInProgress2, renderLanes2, false ), state$102 = 0 !== (renderLanes2 & workInProgress2.childLanes)); if (didSuspendBefore) { if (state$102) return updateSuspenseListComponent( current, workInProgress2, renderLanes2 ); workInProgress2.flags |= 128; } didSuspendBefore = workInProgress2.memoizedState; null !== didSuspendBefore && (didSuspendBefore.rendering = null, didSuspendBefore.tail = null, didSuspendBefore.lastEffect = null); push(suspenseStackCursor, suspenseStackCursor.current); if (state$102) break; else return null; case 22: return workInProgress2.lanes = 0, updateOffscreenComponent( current, workInProgress2, renderLanes2, workInProgress2.pendingProps ); case 24: pushProvider(workInProgress2, CacheContext, current.memoizedState.cache); } return bailoutOnAlreadyFinishedWork(current, workInProgress2, renderLanes2); } function beginWork(current, workInProgress2, renderLanes2) { if (null !== current) if (current.memoizedProps !== workInProgress2.pendingProps) didReceiveUpdate = true; else { if (!checkScheduledUpdateOrContext(current, renderLanes2) && 0 === (workInProgress2.flags & 128)) return didReceiveUpdate = false, attemptEarlyBailoutIfNoScheduledUpdate( current, workInProgress2, renderLanes2 ); didReceiveUpdate = 0 !== (current.flags & 131072) ? true : false; } else didReceiveUpdate = false, isHydrating && 0 !== (workInProgress2.flags & 1048576) && pushTreeId(workInProgress2, treeForkCount, workInProgress2.index); workInProgress2.lanes = 0; switch (workInProgress2.tag) { case 16: a: { var props = workInProgress2.pendingProps; current = resolveLazy(workInProgress2.elementType); workInProgress2.type = current; if ("function" === typeof current) shouldConstruct(current) ? (props = resolveClassComponentProps(current, props), workInProgress2.tag = 1, workInProgress2 = updateClassComponent( null, workInProgress2, current, props, renderLanes2 )) : (workInProgress2.tag = 0, workInProgress2 = updateFunctionComponent( null, workInProgress2, current, props, renderLanes2 )); else { if (void 0 !== current && null !== current) { var $$typeof = current.$$typeof; if ($$typeof === REACT_FORWARD_REF_TYPE) { workInProgress2.tag = 11; workInProgress2 = updateForwardRef( null, workInProgress2, current, props, renderLanes2 ); break a; } else if ($$typeof === REACT_MEMO_TYPE) { workInProgress2.tag = 14; workInProgress2 = updateMemoComponent( null, workInProgress2, current, props, renderLanes2 ); break a; } } workInProgress2 = getComponentNameFromType(current) || current; throw Error(formatProdErrorMessage(306, workInProgress2, "")); } } return workInProgress2; case 0: return updateFunctionComponent( current, workInProgress2, workInProgress2.type, workInProgress2.pendingProps, renderLanes2 ); case 1: return props = workInProgress2.type, $$typeof = resolveClassComponentProps( props, workInProgress2.pendingProps ), updateClassComponent( current, workInProgress2, props, $$typeof, renderLanes2 ); case 3: a: { pushHostContainer( workInProgress2, workInProgress2.stateNode.containerInfo ); if (null === current) throw Error(formatProdErrorMessage(387)); props = workInProgress2.pendingProps; var prevState = workInProgress2.memoizedState; $$typeof = prevState.element; cloneUpdateQueue(current, workInProgress2); processUpdateQueue(workInProgress2, props, null, renderLanes2); var nextState = workInProgress2.memoizedState; props = nextState.cache; pushProvider(workInProgress2, CacheContext, props); props !== prevState.cache && propagateContextChanges( workInProgress2, [CacheContext], renderLanes2, true ); suspendIfUpdateReadFromEntangledAsyncAction(); props = nextState.element; if (prevState.isDehydrated) if (prevState = { element: props, isDehydrated: false, cache: nextState.cache }, workInProgress2.updateQueue.baseState = prevState, workInProgress2.memoizedState = prevState, workInProgress2.flags & 256) { workInProgress2 = mountHostRootWithoutHydrating( current, workInProgress2, props, renderLanes2 ); break a; } else if (props !== $$typeof) { $$typeof = createCapturedValueAtFiber( Error(formatProdErrorMessage(424)), workInProgress2 ); queueHydrationError($$typeof); workInProgress2 = mountHostRootWithoutHydrating( current, workInProgress2, props, renderLanes2 ); break a; } else { current = workInProgress2.stateNode.containerInfo; switch (current.nodeType) { case 9: current = current.body; break; default: current = "HTML" === current.nodeName ? current.ownerDocument.body : current; } nextHydratableInstance = getNextHydratable(current.firstChild); hydrationParentFiber = workInProgress2; isHydrating = true; hydrationErrors = null; rootOrSingletonContext = true; renderLanes2 = mountChildFibers( workInProgress2, null, props, renderLanes2 ); for (workInProgress2.child = renderLanes2; renderLanes2; ) renderLanes2.flags = renderLanes2.flags & -3 | 4096, renderLanes2 = renderLanes2.sibling; } else { resetHydrationState(); if (props === $$typeof) { workInProgress2 = bailoutOnAlreadyFinishedWork( current, workInProgress2, renderLanes2 ); break a; } reconcileChildren(current, workInProgress2, props, renderLanes2); } workInProgress2 = workInProgress2.child; } return workInProgress2; case 26: return markRef(current, workInProgress2), null === current ? (renderLanes2 = getResource( workInProgress2.type, null, workInProgress2.pendingProps, null )) ? workInProgress2.memoizedState = renderLanes2 : isHydrating || (renderLanes2 = workInProgress2.type, current = workInProgress2.pendingProps, props = getOwnerDocumentFromRootContainer( rootInstanceStackCursor.current ).createElement(renderLanes2), props[internalInstanceKey] = workInProgress2, props[internalPropsKey] = current, setInitialProperties(props, renderLanes2, current), markNodeAsHoistable(props), workInProgress2.stateNode = props) : workInProgress2.memoizedState = getResource( workInProgress2.type, current.memoizedProps, workInProgress2.pendingProps, current.memoizedState ), null; case 27: return pushHostContext(workInProgress2), null === current && isHydrating && (props = workInProgress2.stateNode = resolveSingletonInstance( workInProgress2.type, workInProgress2.pendingProps, rootInstanceStackCursor.current ), hydrationParentFiber = workInProgress2, rootOrSingletonContext = true, $$typeof = nextHydratableInstance, isSingletonScope(workInProgress2.type) ? (previousHydratableOnEnteringScopedSingleton = $$typeof, nextHydratableInstance = getNextHydratable(props.firstChild)) : nextHydratableInstance = $$typeof), reconcileChildren( current, workInProgress2, workInProgress2.pendingProps.children, renderLanes2 ), markRef(current, workInProgress2), null === current && (workInProgress2.flags |= 4194304), workInProgress2.child; case 5: if (null === current && isHydrating) { if ($$typeof = props = nextHydratableInstance) props = canHydrateInstance( props, workInProgress2.type, workInProgress2.pendingProps, rootOrSingletonContext ), null !== props ? (workInProgress2.stateNode = props, hydrationParentFiber = workInProgress2, nextHydratableInstance = getNextHydratable(props.firstChild), rootOrSingletonContext = false, $$typeof = true) : $$typeof = false; $$typeof || throwOnHydrationMismatch(workInProgress2); } pushHostContext(workInProgress2); $$typeof = workInProgress2.type; prevState = workInProgress2.pendingProps; nextState = null !== current ? current.memoizedProps : null; props = prevState.children; shouldSetTextContent($$typeof, prevState) ? props = null : null !== nextState && shouldSetTextContent($$typeof, nextState) && (workInProgress2.flags |= 32); null !== workInProgress2.memoizedState && ($$typeof = renderWithHooks( current, workInProgress2, TransitionAwareHostComponent, null, null, renderLanes2 ), HostTransitionContext._currentValue = $$typeof); markRef(current, workInProgress2); reconcileChildren(current, workInProgress2, props, renderLanes2); return workInProgress2.child; case 6: if (null === current && isHydrating) { if (current = renderLanes2 = nextHydratableInstance) renderLanes2 = canHydrateTextInstance( renderLanes2, workInProgress2.pendingProps, rootOrSingletonContext ), null !== renderLanes2 ? (workInProgress2.stateNode = renderLanes2, hydrationParentFiber = workInProgress2, nextHydratableInstance = null, current = true) : current = false; current || throwOnHydrationMismatch(workInProgress2); } return null; case 13: return updateSuspenseComponent(current, workInProgress2, renderLanes2); case 4: return pushHostContainer( workInProgress2, workInProgress2.stateNode.containerInfo ), props = workInProgress2.pendingProps, null === current ? workInProgress2.child = reconcileChildFibers( workInProgress2, null, props, renderLanes2 ) : reconcileChildren(current, workInProgress2, props, renderLanes2), workInProgress2.child; case 11: return updateForwardRef( current, workInProgress2, workInProgress2.type, workInProgress2.pendingProps, renderLanes2 ); case 7: return reconcileChildren( current, workInProgress2, workInProgress2.pendingProps, renderLanes2 ), workInProgress2.child; case 8: return reconcileChildren( current, workInProgress2, workInProgress2.pendingProps.children, renderLanes2 ), workInProgress2.child; case 12: return reconcileChildren( current, workInProgress2, workInProgress2.pendingProps.children, renderLanes2 ), workInProgress2.child; case 10: return props = workInProgress2.pendingProps, pushProvider(workInProgress2, workInProgress2.type, props.value), reconcileChildren(current, workInProgress2, props.children, renderLanes2), workInProgress2.child; case 9: return $$typeof = workInProgress2.type._context, props = workInProgress2.pendingProps.children, prepareToReadContext(workInProgress2), $$typeof = readContext($$typeof), props = props($$typeof), workInProgress2.flags |= 1, reconcileChildren(current, workInProgress2, props, renderLanes2), workInProgress2.child; case 14: return updateMemoComponent( current, workInProgress2, workInProgress2.type, workInProgress2.pendingProps, renderLanes2 ); case 15: return updateSimpleMemoComponent( current, workInProgress2, workInProgress2.type, workInProgress2.pendingProps, renderLanes2 ); case 19: return updateSuspenseListComponent(current, workInProgress2, renderLanes2); case 31: return updateActivityComponent(current, workInProgress2, renderLanes2); case 22: return updateOffscreenComponent( current, workInProgress2, renderLanes2, workInProgress2.pendingProps ); case 24: return prepareToReadContext(workInProgress2), props = readContext(CacheContext), null === current ? ($$typeof = peekCacheFromPool(), null === $$typeof && ($$typeof = workInProgressRoot, prevState = createCache(), $$typeof.pooledCache = prevState, prevState.refCount++, null !== prevState && ($$typeof.pooledCacheLanes |= renderLanes2), $$typeof = prevState), workInProgress2.memoizedState = { parent: props, cache: $$typeof }, initializeUpdateQueue(workInProgress2), pushProvider(workInProgress2, CacheContext, $$typeof)) : (0 !== (current.lanes & renderLanes2) && (cloneUpdateQueue(current, workInProgress2), processUpdateQueue(workInProgress2, null, null, renderLanes2), suspendIfUpdateReadFromEntangledAsyncAction()), $$typeof = current.memoizedState, prevState = workInProgress2.memoizedState, $$typeof.parent !== props ? ($$typeof = { parent: props, cache: props }, workInProgress2.memoizedState = $$typeof, 0 === workInProgress2.lanes && (workInProgress2.memoizedState = workInProgress2.updateQueue.baseState = $$typeof), pushProvider(workInProgress2, CacheContext, props)) : (props = prevState.cache, pushProvider(workInProgress2, CacheContext, props), props !== $$typeof.cache && propagateContextChanges( workInProgress2, [CacheContext], renderLanes2, true ))), reconcileChildren( current, workInProgress2, workInProgress2.pendingProps.children, renderLanes2 ), workInProgress2.child; case 29: throw workInProgress2.pendingProps; } throw Error(formatProdErrorMessage(156, workInProgress2.tag)); } function markUpdate(workInProgress2) { workInProgress2.flags |= 4; } function preloadInstanceAndSuspendIfNeeded(workInProgress2, type, oldProps, newProps, renderLanes2) { if (type = 0 !== (workInProgress2.mode & 32)) type = false; if (type) { if (workInProgress2.flags |= 16777216, (renderLanes2 & 335544128) === renderLanes2) if (workInProgress2.stateNode.complete) workInProgress2.flags |= 8192; else if (shouldRemainOnPreviousScreen()) workInProgress2.flags |= 8192; else throw suspendedThenable = noopSuspenseyCommitThenable, SuspenseyCommitException; } else workInProgress2.flags &= -16777217; } function preloadResourceAndSuspendIfNeeded(workInProgress2, resource) { if ("stylesheet" !== resource.type || 0 !== (resource.state.loading & 4)) workInProgress2.flags &= -16777217; else if (workInProgress2.flags |= 16777216, !preloadResource(resource)) if (shouldRemainOnPreviousScreen()) workInProgress2.flags |= 8192; else throw suspendedThenable = noopSuspenseyCommitThenable, SuspenseyCommitException; } function scheduleRetryEffect(workInProgress2, retryQueue) { null !== retryQueue && (workInProgress2.flags |= 4); workInProgress2.flags & 16384 && (retryQueue = 22 !== workInProgress2.tag ? claimNextRetryLane() : 536870912, workInProgress2.lanes |= retryQueue, workInProgressSuspendedRetryLanes |= retryQueue); } function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { if (!isHydrating) switch (renderState.tailMode) { case "hidden": hasRenderedATailFallback = renderState.tail; for (var lastTailNode = null; null !== hasRenderedATailFallback; ) null !== hasRenderedATailFallback.alternate && (lastTailNode = hasRenderedATailFallback), hasRenderedATailFallback = hasRenderedATailFallback.sibling; null === lastTailNode ? renderState.tail = null : lastTailNode.sibling = null; break; case "collapsed": lastTailNode = renderState.tail; for (var lastTailNode$106 = null; null !== lastTailNode; ) null !== lastTailNode.alternate && (lastTailNode$106 = lastTailNode), lastTailNode = lastTailNode.sibling; null === lastTailNode$106 ? hasRenderedATailFallback || null === renderState.tail ? renderState.tail = null : renderState.tail.sibling = null : lastTailNode$106.sibling = null; } } function bubbleProperties(completedWork) { var didBailout = null !== completedWork.alternate && completedWork.alternate.child === completedWork.child, newChildLanes = 0, subtreeFlags = 0; if (didBailout) for (var child$107 = completedWork.child; null !== child$107; ) newChildLanes |= child$107.lanes | child$107.childLanes, subtreeFlags |= child$107.subtreeFlags & 65011712, subtreeFlags |= child$107.flags & 65011712, child$107.return = completedWork, child$107 = child$107.sibling; else for (child$107 = completedWork.child; null !== child$107; ) newChildLanes |= child$107.lanes | child$107.childLanes, subtreeFlags |= child$107.subtreeFlags, subtreeFlags |= child$107.flags, child$107.return = completedWork, child$107 = child$107.sibling; completedWork.subtreeFlags |= subtreeFlags; completedWork.childLanes = newChildLanes; return didBailout; } function completeWork(current, workInProgress2, renderLanes2) { var newProps = workInProgress2.pendingProps; popTreeContext(workInProgress2); switch (workInProgress2.tag) { case 16: case 15: case 0: case 11: case 7: case 8: case 12: case 9: case 14: return bubbleProperties(workInProgress2), null; case 1: return bubbleProperties(workInProgress2), null; case 3: renderLanes2 = workInProgress2.stateNode; newProps = null; null !== current && (newProps = current.memoizedState.cache); workInProgress2.memoizedState.cache !== newProps && (workInProgress2.flags |= 2048); popProvider(CacheContext); popHostContainer(); renderLanes2.pendingContext && (renderLanes2.context = renderLanes2.pendingContext, renderLanes2.pendingContext = null); if (null === current || null === current.child) popHydrationState(workInProgress2) ? markUpdate(workInProgress2) : null === current || current.memoizedState.isDehydrated && 0 === (workInProgress2.flags & 256) || (workInProgress2.flags |= 1024, upgradeHydrationErrorsToRecoverable()); bubbleProperties(workInProgress2); return null; case 26: var type = workInProgress2.type, nextResource = workInProgress2.memoizedState; null === current ? (markUpdate(workInProgress2), null !== nextResource ? (bubbleProperties(workInProgress2), preloadResourceAndSuspendIfNeeded(workInProgress2, nextResource)) : (bubbleProperties(workInProgress2), preloadInstanceAndSuspendIfNeeded( workInProgress2, type, null, newProps, renderLanes2 ))) : nextResource ? nextResource !== current.memoizedState ? (markUpdate(workInProgress2), bubbleProperties(workInProgress2), preloadResourceAndSuspendIfNeeded(workInProgress2, nextResource)) : (bubbleProperties(workInProgress2), workInProgress2.flags &= -16777217) : (current = current.memoizedProps, current !== newProps && markUpdate(workInProgress2), bubbleProperties(workInProgress2), preloadInstanceAndSuspendIfNeeded( workInProgress2, type, current, newProps, renderLanes2 )); return null; case 27: popHostContext(workInProgress2); renderLanes2 = rootInstanceStackCursor.current; type = workInProgress2.type; if (null !== current && null != workInProgress2.stateNode) current.memoizedProps !== newProps && markUpdate(workInProgress2); else { if (!newProps) { if (null === workInProgress2.stateNode) throw Error(formatProdErrorMessage(166)); bubbleProperties(workInProgress2); return null; } current = contextStackCursor.current; popHydrationState(workInProgress2) ? prepareToHydrateHostInstance(workInProgress2) : (current = resolveSingletonInstance(type, newProps, renderLanes2), workInProgress2.stateNode = current, markUpdate(workInProgress2)); } bubbleProperties(workInProgress2); return null; case 5: popHostContext(workInProgress2); type = workInProgress2.type; if (null !== current && null != workInProgress2.stateNode) current.memoizedProps !== newProps && markUpdate(workInProgress2); else { if (!newProps) { if (null === workInProgress2.stateNode) throw Error(formatProdErrorMessage(166)); bubbleProperties(workInProgress2); return null; } nextResource = contextStackCursor.current; if (popHydrationState(workInProgress2)) prepareToHydrateHostInstance(workInProgress2); else { var ownerDocument = getOwnerDocumentFromRootContainer( rootInstanceStackCursor.current ); switch (nextResource) { case 1: nextResource = ownerDocument.createElementNS( "http://www.w3.org/2000/svg", type ); break; case 2: nextResource = ownerDocument.createElementNS( "http://www.w3.org/1998/Math/MathML", type ); break; default: switch (type) { case "svg": nextResource = ownerDocument.createElementNS( "http://www.w3.org/2000/svg", type ); break; case "math": nextResource = ownerDocument.createElementNS( "http://www.w3.org/1998/Math/MathML", type ); break; case "script": nextResource = ownerDocument.createElement("div"); nextResource.innerHTML = "<script><\/script>"; nextResource = nextResource.removeChild( nextResource.firstChild ); break; case "select": nextResource = "string" === typeof newProps.is ? ownerDocument.createElement("select", { is: newProps.is }) : ownerDocument.createElement("select"); newProps.multiple ? nextResource.multiple = true : newProps.size && (nextResource.size = newProps.size); break; default: nextResource = "string" === typeof newProps.is ? ownerDocument.createElement(type, { is: newProps.is }) : ownerDocument.createElement(type); } } nextResource[internalInstanceKey] = workInProgress2; nextResource[internalPropsKey] = newProps; a: for (ownerDocument = workInProgress2.child; null !== ownerDocument; ) { if (5 === ownerDocument.tag || 6 === ownerDocument.tag) nextResource.appendChild(ownerDocument.stateNode); else if (4 !== ownerDocument.tag && 27 !== ownerDocument.tag && null !== ownerDocument.child) { ownerDocument.child.return = ownerDocument; ownerDocument = ownerDocument.child; continue; } if (ownerDocument === workInProgress2) break a; for (; null === ownerDocument.sibling; ) { if (null === ownerDocument.return || ownerDocument.return === workInProgress2) break a; ownerDocument = ownerDocument.return; } ownerDocument.sibling.return = ownerDocument.return; ownerDocument = ownerDocument.sibling; } workInProgress2.stateNode = nextResource; a: switch (setInitialProperties(nextResource, type, newProps), type) { case "button": case "input": case "select": case "textarea": newProps = !!newProps.autoFocus; break a; case "img": newProps = true; break a; default: newProps = false; } newProps && markUpdate(workInProgress2); } } bubbleProperties(workInProgress2); preloadInstanceAndSuspendIfNeeded( workInProgress2, workInProgress2.type, null === current ? null : current.memoizedProps, workInProgress2.pendingProps, renderLanes2 ); return null; case 6: if (current && null != workInProgress2.stateNode) current.memoizedProps !== newProps && markUpdate(workInProgress2); else { if ("string" !== typeof newProps && null === workInProgress2.stateNode) throw Error(formatProdErrorMessage(166)); current = rootInstanceStackCursor.current; if (popHydrationState(workInProgress2)) { current = workInProgress2.stateNode; renderLanes2 = workInProgress2.memoizedProps; newProps = null; type = hydrationParentFiber; if (null !== type) switch (type.tag) { case 27: case 5: newProps = type.memoizedProps; } current[internalInstanceKey] = workInProgress2; current = current.nodeValue === renderLanes2 || null !== newProps && true === newProps.suppressHydrationWarning || checkForUnmatchedText(current.nodeValue, renderLanes2) ? true : false; current || throwOnHydrationMismatch(workInProgress2, true); } else current = getOwnerDocumentFromRootContainer(current).createTextNode( newProps ), current[internalInstanceKey] = workInProgress2, workInProgress2.stateNode = current; } bubbleProperties(workInProgress2); return null; case 31: renderLanes2 = workInProgress2.memoizedState; if (null === current || null !== current.memoizedState) { newProps = popHydrationState(workInProgress2); if (null !== renderLanes2) { if (null === current) { if (!newProps) throw Error(formatProdErrorMessage(318)); current = workInProgress2.memoizedState; current = null !== current ? current.dehydrated : null; if (!current) throw Error(formatProdErrorMessage(557)); current[internalInstanceKey] = workInProgress2; } else resetHydrationState(), 0 === (workInProgress2.flags & 128) && (workInProgress2.memoizedState = null), workInProgress2.flags |= 4; bubbleProperties(workInProgress2); current = false; } else renderLanes2 = upgradeHydrationErrorsToRecoverable(), null !== current && null !== current.memoizedState && (current.memoizedState.hydrationErrors = renderLanes2), current = true; if (!current) { if (workInProgress2.flags & 256) return popSuspenseHandler(workInProgress2), workInProgress2; popSuspenseHandler(workInProgress2); return null; } if (0 !== (workInProgress2.flags & 128)) throw Error(formatProdErrorMessage(558)); } bubbleProperties(workInProgress2); return null; case 13: newProps = workInProgress2.memoizedState; if (null === current || null !== current.memoizedState && null !== current.memoizedState.dehydrated) { type = popHydrationState(workInProgress2); if (null !== newProps && null !== newProps.dehydrated) { if (null === current) { if (!type) throw Error(formatProdErrorMessage(318)); type = workInProgress2.memoizedState; type = null !== type ? type.dehydrated : null; if (!type) throw Error(formatProdErrorMessage(317)); type[internalInstanceKey] = workInProgress2; } else resetHydrationState(), 0 === (workInProgress2.flags & 128) && (workInProgress2.memoizedState = null), workInProgress2.flags |= 4; bubbleProperties(workInProgress2); type = false; } else type = upgradeHydrationErrorsToRecoverable(), null !== current && null !== current.memoizedState && (current.memoizedState.hydrationErrors = type), type = true; if (!type) { if (workInProgress2.flags & 256) return popSuspenseHandler(workInProgress2), workInProgress2; popSuspenseHandler(workInProgress2); return null; } } popSuspenseHandler(workInProgress2); if (0 !== (workInProgress2.flags & 128)) return workInProgress2.lanes = renderLanes2, workInProgress2; renderLanes2 = null !== newProps; current = null !== current && null !== current.memoizedState; renderLanes2 && (newProps = workInProgress2.child, type = null, null !== newProps.alternate && null !== newProps.alternate.memoizedState && null !== newProps.alternate.memoizedState.cachePool && (type = newProps.alternate.memoizedState.cachePool.pool), nextResource = null, null !== newProps.memoizedState && null !== newProps.memoizedState.cachePool && (nextResource = newProps.memoizedState.cachePool.pool), nextResource !== type && (newProps.flags |= 2048)); renderLanes2 !== current && renderLanes2 && (workInProgress2.child.flags |= 8192); scheduleRetryEffect(workInProgress2, workInProgress2.updateQueue); bubbleProperties(workInProgress2); return null; case 4: return popHostContainer(), null === current && listenToAllSupportedEvents(workInProgress2.stateNode.containerInfo), bubbleProperties(workInProgress2), null; case 10: return popProvider(workInProgress2.type), bubbleProperties(workInProgress2), null; case 19: pop(suspenseStackCursor); newProps = workInProgress2.memoizedState; if (null === newProps) return bubbleProperties(workInProgress2), null; type = 0 !== (workInProgress2.flags & 128); nextResource = newProps.rendering; if (null === nextResource) if (type) cutOffTailIfNeeded(newProps, false); else { if (0 !== workInProgressRootExitStatus || null !== current && 0 !== (current.flags & 128)) for (current = workInProgress2.child; null !== current; ) { nextResource = findFirstSuspended(current); if (null !== nextResource) { workInProgress2.flags |= 128; cutOffTailIfNeeded(newProps, false); current = nextResource.updateQueue; workInProgress2.updateQueue = current; scheduleRetryEffect(workInProgress2, current); workInProgress2.subtreeFlags = 0; current = renderLanes2; for (renderLanes2 = workInProgress2.child; null !== renderLanes2; ) resetWorkInProgress(renderLanes2, current), renderLanes2 = renderLanes2.sibling; push( suspenseStackCursor, suspenseStackCursor.current & 1 | 2 ); isHydrating && pushTreeFork(workInProgress2, newProps.treeForkCount); return workInProgress2.child; } current = current.sibling; } null !== newProps.tail && now() > workInProgressRootRenderTargetTime && (workInProgress2.flags |= 128, type = true, cutOffTailIfNeeded(newProps, false), workInProgress2.lanes = 4194304); } else { if (!type) if (current = findFirstSuspended(nextResource), null !== current) { if (workInProgress2.flags |= 128, type = true, current = current.updateQueue, workInProgress2.updateQueue = current, scheduleRetryEffect(workInProgress2, current), cutOffTailIfNeeded(newProps, true), null === newProps.tail && "hidden" === newProps.tailMode && !nextResource.alternate && !isHydrating) return bubbleProperties(workInProgress2), null; } else 2 * now() - newProps.renderingStartTime > workInProgressRootRenderTargetTime && 536870912 !== renderLanes2 && (workInProgress2.flags |= 128, type = true, cutOffTailIfNeeded(newProps, false), workInProgress2.lanes = 4194304); newProps.isBackwards ? (nextResource.sibling = workInProgress2.child, workInProgress2.child = nextResource) : (current = newProps.last, null !== current ? current.sibling = nextResource : workInProgress2.child = nextResource, newProps.last = nextResource); } if (null !== newProps.tail) return current = newProps.tail, newProps.rendering = current, newProps.tail = current.sibling, newProps.renderingStartTime = now(), current.sibling = null, renderLanes2 = suspenseStackCursor.current, push( suspenseStackCursor, type ? renderLanes2 & 1 | 2 : renderLanes2 & 1 ), isHydrating && pushTreeFork(workInProgress2, newProps.treeForkCount), current; bubbleProperties(workInProgress2); return null; case 22: case 23: return popSuspenseHandler(workInProgress2), popHiddenContext(), newProps = null !== workInProgress2.memoizedState, null !== current ? null !== current.memoizedState !== newProps && (workInProgress2.flags |= 8192) : newProps && (workInProgress2.flags |= 8192), newProps ? 0 !== (renderLanes2 & 536870912) && 0 === (workInProgress2.flags & 128) && (bubbleProperties(workInProgress2), workInProgress2.subtreeFlags & 6 && (workInProgress2.flags |= 8192)) : bubbleProperties(workInProgress2), renderLanes2 = workInProgress2.updateQueue, null !== renderLanes2 && scheduleRetryEffect(workInProgress2, renderLanes2.retryQueue), renderLanes2 = null, null !== current && null !== current.memoizedState && null !== current.memoizedState.cachePool && (renderLanes2 = current.memoizedState.cachePool.pool), newProps = null, null !== workInProgress2.memoizedState && null !== workInProgress2.memoizedState.cachePool && (newProps = workInProgress2.memoizedState.cachePool.pool), newProps !== renderLanes2 && (workInProgress2.flags |= 2048), null !== current && pop(resumedCache), null; case 24: return renderLanes2 = null, null !== current && (renderLanes2 = current.memoizedState.cache), workInProgress2.memoizedState.cache !== renderLanes2 && (workInProgress2.flags |= 2048), popProvider(CacheContext), bubbleProperties(workInProgress2), null; case 25: return null; case 30: return null; } throw Error(formatProdErrorMessage(156, workInProgress2.tag)); } function unwindWork(current, workInProgress2) { popTreeContext(workInProgress2); switch (workInProgress2.tag) { case 1: return current = workInProgress2.flags, current & 65536 ? (workInProgress2.flags = current & -65537 | 128, workInProgress2) : null; case 3: return popProvider(CacheContext), popHostContainer(), current = workInProgress2.flags, 0 !== (current & 65536) && 0 === (current & 128) ? (workInProgress2.flags = current & -65537 | 128, workInProgress2) : null; case 26: case 27: case 5: return popHostContext(workInProgress2), null; case 31: if (null !== workInProgress2.memoizedState) { popSuspenseHandler(workInProgress2); if (null === workInProgress2.alternate) throw Error(formatProdErrorMessage(340)); resetHydrationState(); } current = workInProgress2.flags; return current & 65536 ? (workInProgress2.flags = current & -65537 | 128, workInProgress2) : null; case 13: popSuspenseHandler(workInProgress2); current = workInProgress2.memoizedState; if (null !== current && null !== current.dehydrated) { if (null === workInProgress2.alternate) throw Error(formatProdErrorMessage(340)); resetHydrationState(); } current = workInProgress2.flags; return current & 65536 ? (workInProgress2.flags = current & -65537 | 128, workInProgress2) : null; case 19: return pop(suspenseStackCursor), null; case 4: return popHostContainer(), null; case 10: return popProvider(workInProgress2.type), null; case 22: case 23: return popSuspenseHandler(workInProgress2), popHiddenContext(), null !== current && pop(resumedCache), current = workInProgress2.flags, current & 65536 ? (workInProgress2.flags = current & -65537 | 128, workInProgress2) : null; case 24: return popProvider(CacheContext), null; case 25: return null; default: return null; } } function unwindInterruptedWork(current, interruptedWork) { popTreeContext(interruptedWork); switch (interruptedWork.tag) { case 3: popProvider(CacheContext); popHostContainer(); break; case 26: case 27: case 5: popHostContext(interruptedWork); break; case 4: popHostContainer(); break; case 31: null !== interruptedWork.memoizedState && popSuspenseHandler(interruptedWork); break; case 13: popSuspenseHandler(interruptedWork); break; case 19: pop(suspenseStackCursor); break; case 10: popProvider(interruptedWork.type); break; case 22: case 23: popSuspenseHandler(interruptedWork); popHiddenContext(); null !== current && pop(resumedCache); break; case 24: popProvider(CacheContext); } } function commitHookEffectListMount(flags, finishedWork) { try { var updateQueue = finishedWork.updateQueue, lastEffect = null !== updateQueue ? updateQueue.lastEffect : null; if (null !== lastEffect) { var firstEffect = lastEffect.next; updateQueue = firstEffect; do { if ((updateQueue.tag & flags) === flags) { lastEffect = void 0; var create = updateQueue.create, inst = updateQueue.inst; lastEffect = create(); inst.destroy = lastEffect; } updateQueue = updateQueue.next; } while (updateQueue !== firstEffect); } } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } function commitHookEffectListUnmount(flags, finishedWork, nearestMountedAncestor$jscomp$0) { try { var updateQueue = finishedWork.updateQueue, lastEffect = null !== updateQueue ? updateQueue.lastEffect : null; if (null !== lastEffect) { var firstEffect = lastEffect.next; updateQueue = firstEffect; do { if ((updateQueue.tag & flags) === flags) { var inst = updateQueue.inst, destroy = inst.destroy; if (void 0 !== destroy) { inst.destroy = void 0; lastEffect = finishedWork; var nearestMountedAncestor = nearestMountedAncestor$jscomp$0, destroy_ = destroy; try { destroy_(); } catch (error) { captureCommitPhaseError( lastEffect, nearestMountedAncestor, error ); } } } updateQueue = updateQueue.next; } while (updateQueue !== firstEffect); } } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } function commitClassCallbacks(finishedWork) { var updateQueue = finishedWork.updateQueue; if (null !== updateQueue) { var instance = finishedWork.stateNode; try { commitCallbacks(updateQueue, instance); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } } function safelyCallComponentWillUnmount(current, nearestMountedAncestor, instance) { instance.props = resolveClassComponentProps( current.type, current.memoizedProps ); instance.state = current.memoizedState; try { instance.componentWillUnmount(); } catch (error) { captureCommitPhaseError(current, nearestMountedAncestor, error); } } function safelyAttachRef(current, nearestMountedAncestor) { try { var ref = current.ref; if (null !== ref) { switch (current.tag) { case 26: case 27: case 5: var instanceToUse = current.stateNode; break; case 30: instanceToUse = current.stateNode; break; default: instanceToUse = current.stateNode; } "function" === typeof ref ? current.refCleanup = ref(instanceToUse) : ref.current = instanceToUse; } } catch (error) { captureCommitPhaseError(current, nearestMountedAncestor, error); } } function safelyDetachRef(current, nearestMountedAncestor) { var ref = current.ref, refCleanup = current.refCleanup; if (null !== ref) if ("function" === typeof refCleanup) try { refCleanup(); } catch (error) { captureCommitPhaseError(current, nearestMountedAncestor, error); } finally { current.refCleanup = null, current = current.alternate, null != current && (current.refCleanup = null); } else if ("function" === typeof ref) try { ref(null); } catch (error$140) { captureCommitPhaseError(current, nearestMountedAncestor, error$140); } else ref.current = null; } function commitHostMount(finishedWork) { var type = finishedWork.type, props = finishedWork.memoizedProps, instance = finishedWork.stateNode; try { a: switch (type) { case "button": case "input": case "select": case "textarea": props.autoFocus && instance.focus(); break a; case "img": props.src ? instance.src = props.src : props.srcSet && (instance.srcset = props.srcSet); } } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } function commitHostUpdate(finishedWork, newProps, oldProps) { try { var domElement = finishedWork.stateNode; updateProperties(domElement, finishedWork.type, oldProps, newProps); domElement[internalPropsKey] = newProps; } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } function isHostParent(fiber) { return 5 === fiber.tag || 3 === fiber.tag || 26 === fiber.tag || 27 === fiber.tag && isSingletonScope(fiber.type) || 4 === fiber.tag; } function getHostSibling(fiber) { a: for (; ; ) { for (; null === fiber.sibling; ) { if (null === fiber.return || isHostParent(fiber.return)) return null; fiber = fiber.return; } fiber.sibling.return = fiber.return; for (fiber = fiber.sibling; 5 !== fiber.tag && 6 !== fiber.tag && 18 !== fiber.tag; ) { if (27 === fiber.tag && isSingletonScope(fiber.type)) continue a; if (fiber.flags & 2) continue a; if (null === fiber.child || 4 === fiber.tag) continue a; else fiber.child.return = fiber, fiber = fiber.child; } if (!(fiber.flags & 2)) return fiber.stateNode; } } function insertOrAppendPlacementNodeIntoContainer(node, before, parent) { var tag = node.tag; if (5 === tag || 6 === tag) node = node.stateNode, before ? (9 === parent.nodeType ? parent.body : "HTML" === parent.nodeName ? parent.ownerDocument.body : parent).insertBefore(node, before) : (before = 9 === parent.nodeType ? parent.body : "HTML" === parent.nodeName ? parent.ownerDocument.body : parent, before.appendChild(node), parent = parent._reactRootContainer, null !== parent && void 0 !== parent || null !== before.onclick || (before.onclick = noop$1)); else if (4 !== tag && (27 === tag && isSingletonScope(node.type) && (parent = node.stateNode, before = null), node = node.child, null !== node)) for (insertOrAppendPlacementNodeIntoContainer(node, before, parent), node = node.sibling; null !== node; ) insertOrAppendPlacementNodeIntoContainer(node, before, parent), node = node.sibling; } function insertOrAppendPlacementNode(node, before, parent) { var tag = node.tag; if (5 === tag || 6 === tag) node = node.stateNode, before ? parent.insertBefore(node, before) : parent.appendChild(node); else if (4 !== tag && (27 === tag && isSingletonScope(node.type) && (parent = node.stateNode), node = node.child, null !== node)) for (insertOrAppendPlacementNode(node, before, parent), node = node.sibling; null !== node; ) insertOrAppendPlacementNode(node, before, parent), node = node.sibling; } function commitHostSingletonAcquisition(finishedWork) { var singleton = finishedWork.stateNode, props = finishedWork.memoizedProps; try { for (var type = finishedWork.type, attributes = singleton.attributes; attributes.length; ) singleton.removeAttributeNode(attributes[0]); setInitialProperties(singleton, type, props); singleton[internalInstanceKey] = finishedWork; singleton[internalPropsKey] = props; } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } var offscreenSubtreeIsHidden = false, offscreenSubtreeWasHidden = false, needsFormReset = false, PossiblyWeakSet = "function" === typeof WeakSet ? WeakSet : Set, nextEffect = null; function commitBeforeMutationEffects(root2, firstChild) { root2 = root2.containerInfo; eventsEnabled = _enabled; root2 = getActiveElementDeep(root2); if (hasSelectionCapabilities(root2)) { if ("selectionStart" in root2) var JSCompiler_temp = { start: root2.selectionStart, end: root2.selectionEnd }; else a: { JSCompiler_temp = (JSCompiler_temp = root2.ownerDocument) && JSCompiler_temp.defaultView || window; var selection = JSCompiler_temp.getSelection && JSCompiler_temp.getSelection(); if (selection && 0 !== selection.rangeCount) { JSCompiler_temp = selection.anchorNode; var anchorOffset = selection.anchorOffset, focusNode = selection.focusNode; selection = selection.focusOffset; try { JSCompiler_temp.nodeType, focusNode.nodeType; } catch (e$20) { JSCompiler_temp = null; break a; } var length = 0, start = -1, end = -1, indexWithinAnchor = 0, indexWithinFocus = 0, node = root2, parentNode = null; b: for (; ; ) { for (var next; ; ) { node !== JSCompiler_temp || 0 !== anchorOffset && 3 !== node.nodeType || (start = length + anchorOffset); node !== focusNode || 0 !== selection && 3 !== node.nodeType || (end = length + selection); 3 === node.nodeType && (length += node.nodeValue.length); if (null === (next = node.firstChild)) break; parentNode = node; node = next; } for (; ; ) { if (node === root2) break b; parentNode === JSCompiler_temp && ++indexWithinAnchor === anchorOffset && (start = length); parentNode === focusNode && ++indexWithinFocus === selection && (end = length); if (null !== (next = node.nextSibling)) break; node = parentNode; parentNode = node.parentNode; } node = next; } JSCompiler_temp = -1 === start || -1 === end ? null : { start, end }; } else JSCompiler_temp = null; } JSCompiler_temp = JSCompiler_temp || { start: 0, end: 0 }; } else JSCompiler_temp = null; selectionInformation = { focusedElem: root2, selectionRange: JSCompiler_temp }; _enabled = false; for (nextEffect = firstChild; null !== nextEffect; ) if (firstChild = nextEffect, root2 = firstChild.child, 0 !== (firstChild.subtreeFlags & 1028) && null !== root2) root2.return = firstChild, nextEffect = root2; else for (; null !== nextEffect; ) { firstChild = nextEffect; focusNode = firstChild.alternate; root2 = firstChild.flags; switch (firstChild.tag) { case 0: if (0 !== (root2 & 4) && (root2 = firstChild.updateQueue, root2 = null !== root2 ? root2.events : null, null !== root2)) for (JSCompiler_temp = 0; JSCompiler_temp < root2.length; JSCompiler_temp++) anchorOffset = root2[JSCompiler_temp], anchorOffset.ref.impl = anchorOffset.nextImpl; break; case 11: case 15: break; case 1: if (0 !== (root2 & 1024) && null !== focusNode) { root2 = void 0; JSCompiler_temp = firstChild; anchorOffset = focusNode.memoizedProps; focusNode = focusNode.memoizedState; selection = JSCompiler_temp.stateNode; try { var resolvedPrevProps = resolveClassComponentProps( JSCompiler_temp.type, anchorOffset ); root2 = selection.getSnapshotBeforeUpdate( resolvedPrevProps, focusNode ); selection.__reactInternalSnapshotBeforeUpdate = root2; } catch (error) { captureCommitPhaseError( JSCompiler_temp, JSCompiler_temp.return, error ); } } break; case 3: if (0 !== (root2 & 1024)) { if (root2 = firstChild.stateNode.containerInfo, JSCompiler_temp = root2.nodeType, 9 === JSCompiler_temp) clearContainerSparingly(root2); else if (1 === JSCompiler_temp) switch (root2.nodeName) { case "HEAD": case "HTML": case "BODY": clearContainerSparingly(root2); break; default: root2.textContent = ""; } } break; case 5: case 26: case 27: case 6: case 4: case 17: break; default: if (0 !== (root2 & 1024)) throw Error(formatProdErrorMessage(163)); } root2 = firstChild.sibling; if (null !== root2) { root2.return = firstChild.return; nextEffect = root2; break; } nextEffect = firstChild.return; } } function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) { var flags = finishedWork.flags; switch (finishedWork.tag) { case 0: case 11: case 15: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); flags & 4 && commitHookEffectListMount(5, finishedWork); break; case 1: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); if (flags & 4) if (finishedRoot = finishedWork.stateNode, null === current) try { finishedRoot.componentDidMount(); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } else { var prevProps = resolveClassComponentProps( finishedWork.type, current.memoizedProps ); current = current.memoizedState; try { finishedRoot.componentDidUpdate( prevProps, current, finishedRoot.__reactInternalSnapshotBeforeUpdate ); } catch (error$139) { captureCommitPhaseError( finishedWork, finishedWork.return, error$139 ); } } flags & 64 && commitClassCallbacks(finishedWork); flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); break; case 3: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); if (flags & 64 && (finishedRoot = finishedWork.updateQueue, null !== finishedRoot)) { current = null; if (null !== finishedWork.child) switch (finishedWork.child.tag) { case 27: case 5: current = finishedWork.child.stateNode; break; case 1: current = finishedWork.child.stateNode; } try { commitCallbacks(finishedRoot, current); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } break; case 27: null === current && flags & 4 && commitHostSingletonAcquisition(finishedWork); case 26: case 5: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); null === current && flags & 4 && commitHostMount(finishedWork); flags & 512 && safelyAttachRef(finishedWork, finishedWork.return); break; case 12: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); break; case 31: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); flags & 4 && commitActivityHydrationCallbacks(finishedRoot, finishedWork); break; case 13: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); flags & 4 && commitSuspenseHydrationCallbacks(finishedRoot, finishedWork); flags & 64 && (finishedRoot = finishedWork.memoizedState, null !== finishedRoot && (finishedRoot = finishedRoot.dehydrated, null !== finishedRoot && (finishedWork = retryDehydratedSuspenseBoundary.bind( null, finishedWork ), registerSuspenseInstanceRetry(finishedRoot, finishedWork)))); break; case 22: flags = null !== finishedWork.memoizedState || offscreenSubtreeIsHidden; if (!flags) { current = null !== current && null !== current.memoizedState || offscreenSubtreeWasHidden; prevProps = offscreenSubtreeIsHidden; var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; offscreenSubtreeIsHidden = flags; (offscreenSubtreeWasHidden = current) && !prevOffscreenSubtreeWasHidden ? recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, 0 !== (finishedWork.subtreeFlags & 8772) ) : recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); offscreenSubtreeIsHidden = prevProps; offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; } break; case 30: break; default: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork); } } function detachFiberAfterEffects(fiber) { var alternate = fiber.alternate; null !== alternate && (fiber.alternate = null, detachFiberAfterEffects(alternate)); fiber.child = null; fiber.deletions = null; fiber.sibling = null; 5 === fiber.tag && (alternate = fiber.stateNode, null !== alternate && detachDeletedInstance(alternate)); fiber.stateNode = null; fiber.return = null; fiber.dependencies = null; fiber.memoizedProps = null; fiber.memoizedState = null; fiber.pendingProps = null; fiber.stateNode = null; fiber.updateQueue = null; } var hostParent = null, hostParentIsContainer = false; function recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, parent) { for (parent = parent.child; null !== parent; ) commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, parent), parent = parent.sibling; } function commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, deletedFiber) { if (injectedHook && "function" === typeof injectedHook.onCommitFiberUnmount) try { injectedHook.onCommitFiberUnmount(rendererID, deletedFiber); } catch (err) { } switch (deletedFiber.tag) { case 26: offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor); recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, deletedFiber ); deletedFiber.memoizedState ? deletedFiber.memoizedState.count-- : deletedFiber.stateNode && (deletedFiber = deletedFiber.stateNode, deletedFiber.parentNode.removeChild(deletedFiber)); break; case 27: offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor); var prevHostParent = hostParent, prevHostParentIsContainer = hostParentIsContainer; isSingletonScope(deletedFiber.type) && (hostParent = deletedFiber.stateNode, hostParentIsContainer = false); recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, deletedFiber ); releaseSingletonInstance(deletedFiber.stateNode); hostParent = prevHostParent; hostParentIsContainer = prevHostParentIsContainer; break; case 5: offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor); case 6: prevHostParent = hostParent; prevHostParentIsContainer = hostParentIsContainer; hostParent = null; recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, deletedFiber ); hostParent = prevHostParent; hostParentIsContainer = prevHostParentIsContainer; if (null !== hostParent) if (hostParentIsContainer) try { (9 === hostParent.nodeType ? hostParent.body : "HTML" === hostParent.nodeName ? hostParent.ownerDocument.body : hostParent).removeChild(deletedFiber.stateNode); } catch (error) { captureCommitPhaseError( deletedFiber, nearestMountedAncestor, error ); } else try { hostParent.removeChild(deletedFiber.stateNode); } catch (error) { captureCommitPhaseError( deletedFiber, nearestMountedAncestor, error ); } break; case 18: null !== hostParent && (hostParentIsContainer ? (finishedRoot = hostParent, clearHydrationBoundary( 9 === finishedRoot.nodeType ? finishedRoot.body : "HTML" === finishedRoot.nodeName ? finishedRoot.ownerDocument.body : finishedRoot, deletedFiber.stateNode ), retryIfBlockedOn(finishedRoot)) : clearHydrationBoundary(hostParent, deletedFiber.stateNode)); break; case 4: prevHostParent = hostParent; prevHostParentIsContainer = hostParentIsContainer; hostParent = deletedFiber.stateNode.containerInfo; hostParentIsContainer = true; recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, deletedFiber ); hostParent = prevHostParent; hostParentIsContainer = prevHostParentIsContainer; break; case 0: case 11: case 14: case 15: commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor); offscreenSubtreeWasHidden || commitHookEffectListUnmount(4, deletedFiber, nearestMountedAncestor); recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, deletedFiber ); break; case 1: offscreenSubtreeWasHidden || (safelyDetachRef(deletedFiber, nearestMountedAncestor), prevHostParent = deletedFiber.stateNode, "function" === typeof prevHostParent.componentWillUnmount && safelyCallComponentWillUnmount( deletedFiber, nearestMountedAncestor, prevHostParent )); recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, deletedFiber ); break; case 21: recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, deletedFiber ); break; case 22: offscreenSubtreeWasHidden = (prevHostParent = offscreenSubtreeWasHidden) || null !== deletedFiber.memoizedState; recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, deletedFiber ); offscreenSubtreeWasHidden = prevHostParent; break; default: recursivelyTraverseDeletionEffects( finishedRoot, nearestMountedAncestor, deletedFiber ); } } function commitActivityHydrationCallbacks(finishedRoot, finishedWork) { if (null === finishedWork.memoizedState && (finishedRoot = finishedWork.alternate, null !== finishedRoot && (finishedRoot = finishedRoot.memoizedState, null !== finishedRoot))) { finishedRoot = finishedRoot.dehydrated; try { retryIfBlockedOn(finishedRoot); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } } function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) { if (null === finishedWork.memoizedState && (finishedRoot = finishedWork.alternate, null !== finishedRoot && (finishedRoot = finishedRoot.memoizedState, null !== finishedRoot && (finishedRoot = finishedRoot.dehydrated, null !== finishedRoot)))) try { retryIfBlockedOn(finishedRoot); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } function getRetryCache(finishedWork) { switch (finishedWork.tag) { case 31: case 13: case 19: var retryCache = finishedWork.stateNode; null === retryCache && (retryCache = finishedWork.stateNode = new PossiblyWeakSet()); return retryCache; case 22: return finishedWork = finishedWork.stateNode, retryCache = finishedWork._retryCache, null === retryCache && (retryCache = finishedWork._retryCache = new PossiblyWeakSet()), retryCache; default: throw Error(formatProdErrorMessage(435, finishedWork.tag)); } } function attachSuspenseRetryListeners(finishedWork, wakeables) { var retryCache = getRetryCache(finishedWork); wakeables.forEach(function(wakeable) { if (!retryCache.has(wakeable)) { retryCache.add(wakeable); var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable); wakeable.then(retry, retry); } }); } function recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber) { var deletions = parentFiber.deletions; if (null !== deletions) for (var i = 0; i < deletions.length; i++) { var childToDelete = deletions[i], root2 = root$jscomp$0, returnFiber = parentFiber, parent = returnFiber; a: for (; null !== parent; ) { switch (parent.tag) { case 27: if (isSingletonScope(parent.type)) { hostParent = parent.stateNode; hostParentIsContainer = false; break a; } break; case 5: hostParent = parent.stateNode; hostParentIsContainer = false; break a; case 3: case 4: hostParent = parent.stateNode.containerInfo; hostParentIsContainer = true; break a; } parent = parent.return; } if (null === hostParent) throw Error(formatProdErrorMessage(160)); commitDeletionEffectsOnFiber(root2, returnFiber, childToDelete); hostParent = null; hostParentIsContainer = false; root2 = childToDelete.alternate; null !== root2 && (root2.return = null); childToDelete.return = null; } if (parentFiber.subtreeFlags & 13886) for (parentFiber = parentFiber.child; null !== parentFiber; ) commitMutationEffectsOnFiber(parentFiber, root$jscomp$0), parentFiber = parentFiber.sibling; } var currentHoistableRoot = null; function commitMutationEffectsOnFiber(finishedWork, root2) { var current = finishedWork.alternate, flags = finishedWork.flags; switch (finishedWork.tag) { case 0: case 11: case 14: case 15: recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); flags & 4 && (commitHookEffectListUnmount(3, finishedWork, finishedWork.return), commitHookEffectListMount(3, finishedWork), commitHookEffectListUnmount(5, finishedWork, finishedWork.return)); break; case 1: recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); flags & 64 && offscreenSubtreeIsHidden && (finishedWork = finishedWork.updateQueue, null !== finishedWork && (flags = finishedWork.callbacks, null !== flags && (current = finishedWork.shared.hiddenCallbacks, finishedWork.shared.hiddenCallbacks = null === current ? flags : current.concat(flags)))); break; case 26: var hoistableRoot = currentHoistableRoot; recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); if (flags & 4) { var currentResource = null !== current ? current.memoizedState : null; flags = finishedWork.memoizedState; if (null === current) if (null === flags) if (null === finishedWork.stateNode) { a: { flags = finishedWork.type; current = finishedWork.memoizedProps; hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot; b: switch (flags) { case "title": currentResource = hoistableRoot.getElementsByTagName("title")[0]; if (!currentResource || currentResource[internalHoistableMarker] || currentResource[internalInstanceKey] || "http://www.w3.org/2000/svg" === currentResource.namespaceURI || currentResource.hasAttribute("itemprop")) currentResource = hoistableRoot.createElement(flags), hoistableRoot.head.insertBefore( currentResource, hoistableRoot.querySelector("head > title") ); setInitialProperties(currentResource, flags, current); currentResource[internalInstanceKey] = finishedWork; markNodeAsHoistable(currentResource); flags = currentResource; break a; case "link": var maybeNodes = getHydratableHoistableCache( "link", "href", hoistableRoot ).get(flags + (current.href || "")); if (maybeNodes) { for (var i = 0; i < maybeNodes.length; i++) if (currentResource = maybeNodes[i], currentResource.getAttribute("href") === (null == current.href || "" === current.href ? null : current.href) && currentResource.getAttribute("rel") === (null == current.rel ? null : current.rel) && currentResource.getAttribute("title") === (null == current.title ? null : current.title) && currentResource.getAttribute("crossorigin") === (null == current.crossOrigin ? null : current.crossOrigin)) { maybeNodes.splice(i, 1); break b; } } currentResource = hoistableRoot.createElement(flags); setInitialProperties(currentResource, flags, current); hoistableRoot.head.appendChild(currentResource); break; case "meta": if (maybeNodes = getHydratableHoistableCache( "meta", "content", hoistableRoot ).get(flags + (current.content || ""))) { for (i = 0; i < maybeNodes.length; i++) if (currentResource = maybeNodes[i], currentResource.getAttribute("content") === (null == current.content ? null : "" + current.content) && currentResource.getAttribute("name") === (null == current.name ? null : current.name) && currentResource.getAttribute("property") === (null == current.property ? null : current.property) && currentResource.getAttribute("http-equiv") === (null == current.httpEquiv ? null : current.httpEquiv) && currentResource.getAttribute("charset") === (null == current.charSet ? null : current.charSet)) { maybeNodes.splice(i, 1); break b; } } currentResource = hoistableRoot.createElement(flags); setInitialProperties(currentResource, flags, current); hoistableRoot.head.appendChild(currentResource); break; default: throw Error(formatProdErrorMessage(468, flags)); } currentResource[internalInstanceKey] = finishedWork; markNodeAsHoistable(currentResource); flags = currentResource; } finishedWork.stateNode = flags; } else mountHoistable( hoistableRoot, finishedWork.type, finishedWork.stateNode ); else finishedWork.stateNode = acquireResource( hoistableRoot, flags, finishedWork.memoizedProps ); else currentResource !== flags ? (null === currentResource ? null !== current.stateNode && (current = current.stateNode, current.parentNode.removeChild(current)) : currentResource.count--, null === flags ? mountHoistable( hoistableRoot, finishedWork.type, finishedWork.stateNode ) : acquireResource( hoistableRoot, flags, finishedWork.memoizedProps )) : null === flags && null !== finishedWork.stateNode && commitHostUpdate( finishedWork, finishedWork.memoizedProps, current.memoizedProps ); } break; case 27: recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); null !== current && flags & 4 && commitHostUpdate( finishedWork, finishedWork.memoizedProps, current.memoizedProps ); break; case 5: recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)); if (finishedWork.flags & 32) { hoistableRoot = finishedWork.stateNode; try { setTextContent(hoistableRoot, ""); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } flags & 4 && null != finishedWork.stateNode && (hoistableRoot = finishedWork.memoizedProps, commitHostUpdate( finishedWork, hoistableRoot, null !== current ? current.memoizedProps : hoistableRoot )); flags & 1024 && (needsFormReset = true); break; case 6: recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); if (flags & 4) { if (null === finishedWork.stateNode) throw Error(formatProdErrorMessage(162)); flags = finishedWork.memoizedProps; current = finishedWork.stateNode; try { current.nodeValue = flags; } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } break; case 3: tagCaches = null; hoistableRoot = currentHoistableRoot; currentHoistableRoot = getHoistableRoot(root2.containerInfo); recursivelyTraverseMutationEffects(root2, finishedWork); currentHoistableRoot = hoistableRoot; commitReconciliationEffects(finishedWork); if (flags & 4 && null !== current && current.memoizedState.isDehydrated) try { retryIfBlockedOn(root2.containerInfo); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } needsFormReset && (needsFormReset = false, recursivelyResetForms(finishedWork)); break; case 4: flags = currentHoistableRoot; currentHoistableRoot = getHoistableRoot( finishedWork.stateNode.containerInfo ); recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); currentHoistableRoot = flags; break; case 12: recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); break; case 31: recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); flags & 4 && (flags = finishedWork.updateQueue, null !== flags && (finishedWork.updateQueue = null, attachSuspenseRetryListeners(finishedWork, flags))); break; case 13: recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); finishedWork.child.flags & 8192 && null !== finishedWork.memoizedState !== (null !== current && null !== current.memoizedState) && (globalMostRecentFallbackTime = now()); flags & 4 && (flags = finishedWork.updateQueue, null !== flags && (finishedWork.updateQueue = null, attachSuspenseRetryListeners(finishedWork, flags))); break; case 22: hoistableRoot = null !== finishedWork.memoizedState; var wasHidden = null !== current && null !== current.memoizedState, prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden, prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || hoistableRoot; offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || wasHidden; recursivelyTraverseMutationEffects(root2, finishedWork); offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden; offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden; commitReconciliationEffects(finishedWork); if (flags & 8192) a: for (root2 = finishedWork.stateNode, root2._visibility = hoistableRoot ? root2._visibility & -2 : root2._visibility | 1, hoistableRoot && (null === current || wasHidden || offscreenSubtreeIsHidden || offscreenSubtreeWasHidden || recursivelyTraverseDisappearLayoutEffects(finishedWork)), current = null, root2 = finishedWork; ; ) { if (5 === root2.tag || 26 === root2.tag) { if (null === current) { wasHidden = current = root2; try { if (currentResource = wasHidden.stateNode, hoistableRoot) maybeNodes = currentResource.style, "function" === typeof maybeNodes.setProperty ? maybeNodes.setProperty("display", "none", "important") : maybeNodes.display = "none"; else { i = wasHidden.stateNode; var styleProp = wasHidden.memoizedProps.style, display = void 0 !== styleProp && null !== styleProp && styleProp.hasOwnProperty("display") ? styleProp.display : null; i.style.display = null == display || "boolean" === typeof display ? "" : ("" + display).trim(); } } catch (error) { captureCommitPhaseError(wasHidden, wasHidden.return, error); } } } else if (6 === root2.tag) { if (null === current) { wasHidden = root2; try { wasHidden.stateNode.nodeValue = hoistableRoot ? "" : wasHidden.memoizedProps; } catch (error) { captureCommitPhaseError(wasHidden, wasHidden.return, error); } } } else if (18 === root2.tag) { if (null === current) { wasHidden = root2; try { var instance = wasHidden.stateNode; hoistableRoot ? hideOrUnhideDehydratedBoundary(instance, true) : hideOrUnhideDehydratedBoundary(wasHidden.stateNode, false); } catch (error) { captureCommitPhaseError(wasHidden, wasHidden.return, error); } } } else if ((22 !== root2.tag && 23 !== root2.tag || null === root2.memoizedState || root2 === finishedWork) && null !== root2.child) { root2.child.return = root2; root2 = root2.child; continue; } if (root2 === finishedWork) break a; for (; null === root2.sibling; ) { if (null === root2.return || root2.return === finishedWork) break a; current === root2 && (current = null); root2 = root2.return; } current === root2 && (current = null); root2.sibling.return = root2.return; root2 = root2.sibling; } flags & 4 && (flags = finishedWork.updateQueue, null !== flags && (current = flags.retryQueue, null !== current && (flags.retryQueue = null, attachSuspenseRetryListeners(finishedWork, current)))); break; case 19: recursivelyTraverseMutationEffects(root2, finishedWork); commitReconciliationEffects(finishedWork); flags & 4 && (flags = finishedWork.updateQueue, null !== flags && (finishedWork.updateQueue = null, attachSuspenseRetryListeners(finishedWork, flags))); break; case 30: break; case 21: break; default: recursivelyTraverseMutationEffects(root2, finishedWork), commitReconciliationEffects(finishedWork); } } function commitReconciliationEffects(finishedWork) { var flags = finishedWork.flags; if (flags & 2) { try { for (var hostParentFiber, parentFiber = finishedWork.return; null !== parentFiber; ) { if (isHostParent(parentFiber)) { hostParentFiber = parentFiber; break; } parentFiber = parentFiber.return; } if (null == hostParentFiber) throw Error(formatProdErrorMessage(160)); switch (hostParentFiber.tag) { case 27: var parent = hostParentFiber.stateNode, before = getHostSibling(finishedWork); insertOrAppendPlacementNode(finishedWork, before, parent); break; case 5: var parent$141 = hostParentFiber.stateNode; hostParentFiber.flags & 32 && (setTextContent(parent$141, ""), hostParentFiber.flags &= -33); var before$142 = getHostSibling(finishedWork); insertOrAppendPlacementNode(finishedWork, before$142, parent$141); break; case 3: case 4: var parent$143 = hostParentFiber.stateNode.containerInfo, before$144 = getHostSibling(finishedWork); insertOrAppendPlacementNodeIntoContainer( finishedWork, before$144, parent$143 ); break; default: throw Error(formatProdErrorMessage(161)); } } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } finishedWork.flags &= -3; } flags & 4096 && (finishedWork.flags &= -4097); } function recursivelyResetForms(parentFiber) { if (parentFiber.subtreeFlags & 1024) for (parentFiber = parentFiber.child; null !== parentFiber; ) { var fiber = parentFiber; recursivelyResetForms(fiber); 5 === fiber.tag && fiber.flags & 1024 && fiber.stateNode.reset(); parentFiber = parentFiber.sibling; } } function recursivelyTraverseLayoutEffects(root2, parentFiber) { if (parentFiber.subtreeFlags & 8772) for (parentFiber = parentFiber.child; null !== parentFiber; ) commitLayoutEffectOnFiber(root2, parentFiber.alternate, parentFiber), parentFiber = parentFiber.sibling; } function recursivelyTraverseDisappearLayoutEffects(parentFiber) { for (parentFiber = parentFiber.child; null !== parentFiber; ) { var finishedWork = parentFiber; switch (finishedWork.tag) { case 0: case 11: case 14: case 15: commitHookEffectListUnmount(4, finishedWork, finishedWork.return); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; case 1: safelyDetachRef(finishedWork, finishedWork.return); var instance = finishedWork.stateNode; "function" === typeof instance.componentWillUnmount && safelyCallComponentWillUnmount( finishedWork, finishedWork.return, instance ); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; case 27: releaseSingletonInstance(finishedWork.stateNode); case 26: case 5: safelyDetachRef(finishedWork, finishedWork.return); recursivelyTraverseDisappearLayoutEffects(finishedWork); break; case 22: null === finishedWork.memoizedState && recursivelyTraverseDisappearLayoutEffects(finishedWork); break; case 30: recursivelyTraverseDisappearLayoutEffects(finishedWork); break; default: recursivelyTraverseDisappearLayoutEffects(finishedWork); } parentFiber = parentFiber.sibling; } } function recursivelyTraverseReappearLayoutEffects(finishedRoot$jscomp$0, parentFiber, includeWorkInProgressEffects) { includeWorkInProgressEffects = includeWorkInProgressEffects && 0 !== (parentFiber.subtreeFlags & 8772); for (parentFiber = parentFiber.child; null !== parentFiber; ) { var current = parentFiber.alternate, finishedRoot = finishedRoot$jscomp$0, finishedWork = parentFiber, flags = finishedWork.flags; switch (finishedWork.tag) { case 0: case 11: case 15: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, includeWorkInProgressEffects ); commitHookEffectListMount(4, finishedWork); break; case 1: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, includeWorkInProgressEffects ); current = finishedWork; finishedRoot = current.stateNode; if ("function" === typeof finishedRoot.componentDidMount) try { finishedRoot.componentDidMount(); } catch (error) { captureCommitPhaseError(current, current.return, error); } current = finishedWork; finishedRoot = current.updateQueue; if (null !== finishedRoot) { var instance = current.stateNode; try { var hiddenCallbacks = finishedRoot.shared.hiddenCallbacks; if (null !== hiddenCallbacks) for (finishedRoot.shared.hiddenCallbacks = null, finishedRoot = 0; finishedRoot < hiddenCallbacks.length; finishedRoot++) callCallback(hiddenCallbacks[finishedRoot], instance); } catch (error) { captureCommitPhaseError(current, current.return, error); } } includeWorkInProgressEffects && flags & 64 && commitClassCallbacks(finishedWork); safelyAttachRef(finishedWork, finishedWork.return); break; case 27: commitHostSingletonAcquisition(finishedWork); case 26: case 5: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, includeWorkInProgressEffects ); includeWorkInProgressEffects && null === current && flags & 4 && commitHostMount(finishedWork); safelyAttachRef(finishedWork, finishedWork.return); break; case 12: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, includeWorkInProgressEffects ); break; case 31: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, includeWorkInProgressEffects ); includeWorkInProgressEffects && flags & 4 && commitActivityHydrationCallbacks(finishedRoot, finishedWork); break; case 13: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, includeWorkInProgressEffects ); includeWorkInProgressEffects && flags & 4 && commitSuspenseHydrationCallbacks(finishedRoot, finishedWork); break; case 22: null === finishedWork.memoizedState && recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, includeWorkInProgressEffects ); safelyAttachRef(finishedWork, finishedWork.return); break; case 30: break; default: recursivelyTraverseReappearLayoutEffects( finishedRoot, finishedWork, includeWorkInProgressEffects ); } parentFiber = parentFiber.sibling; } } function commitOffscreenPassiveMountEffects(current, finishedWork) { var previousCache = null; null !== current && null !== current.memoizedState && null !== current.memoizedState.cachePool && (previousCache = current.memoizedState.cachePool.pool); current = null; null !== finishedWork.memoizedState && null !== finishedWork.memoizedState.cachePool && (current = finishedWork.memoizedState.cachePool.pool); current !== previousCache && (null != current && current.refCount++, null != previousCache && releaseCache(previousCache)); } function commitCachePassiveMountEffect(current, finishedWork) { current = null; null !== finishedWork.alternate && (current = finishedWork.alternate.memoizedState.cache); finishedWork = finishedWork.memoizedState.cache; finishedWork !== current && (finishedWork.refCount++, null != current && releaseCache(current)); } function recursivelyTraversePassiveMountEffects(root2, parentFiber, committedLanes, committedTransitions) { if (parentFiber.subtreeFlags & 10256) for (parentFiber = parentFiber.child; null !== parentFiber; ) commitPassiveMountOnFiber( root2, parentFiber, committedLanes, committedTransitions ), parentFiber = parentFiber.sibling; } function commitPassiveMountOnFiber(finishedRoot, finishedWork, committedLanes, committedTransitions) { var flags = finishedWork.flags; switch (finishedWork.tag) { case 0: case 11: case 15: recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ); flags & 2048 && commitHookEffectListMount(9, finishedWork); break; case 1: recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ); break; case 3: recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ); flags & 2048 && (finishedRoot = null, null !== finishedWork.alternate && (finishedRoot = finishedWork.alternate.memoizedState.cache), finishedWork = finishedWork.memoizedState.cache, finishedWork !== finishedRoot && (finishedWork.refCount++, null != finishedRoot && releaseCache(finishedRoot))); break; case 12: if (flags & 2048) { recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ); finishedRoot = finishedWork.stateNode; try { var _finishedWork$memoize2 = finishedWork.memoizedProps, id = _finishedWork$memoize2.id, onPostCommit = _finishedWork$memoize2.onPostCommit; "function" === typeof onPostCommit && onPostCommit( id, null === finishedWork.alternate ? "mount" : "update", finishedRoot.passiveEffectDuration, -0 ); } catch (error) { captureCommitPhaseError(finishedWork, finishedWork.return, error); } } else recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ); break; case 31: recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ); break; case 13: recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ); break; case 23: break; case 22: _finishedWork$memoize2 = finishedWork.stateNode; id = finishedWork.alternate; null !== finishedWork.memoizedState ? _finishedWork$memoize2._visibility & 2 ? recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ) : recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork) : _finishedWork$memoize2._visibility & 2 ? recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ) : (_finishedWork$memoize2._visibility |= 2, recursivelyTraverseReconnectPassiveEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, 0 !== (finishedWork.subtreeFlags & 10256) || false )); flags & 2048 && commitOffscreenPassiveMountEffects(id, finishedWork); break; case 24: recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ); flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork); break; default: recursivelyTraversePassiveMountEffects( finishedRoot, finishedWork, committedLanes, committedTransitions ); } } function recursivelyTraverseReconnectPassiveEffects(finishedRoot$jscomp$0, parentFiber, committedLanes$jscomp$0, committedTransitions$jscomp$0, includeWorkInProgressEffects) { includeWorkInProgressEffects = includeWorkInProgressEffects && (0 !== (parentFiber.subtreeFlags & 10256) || false); for (parentFiber = parentFiber.child; null !== parentFiber; ) { var finishedRoot = finishedRoot$jscomp$0, finishedWork = parentFiber, committedLanes = committedLanes$jscomp$0, committedTransitions = committedTransitions$jscomp$0, flags = finishedWork.flags; switch (finishedWork.tag) { case 0: case 11: case 15: recursivelyTraverseReconnectPassiveEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects ); commitHookEffectListMount(8, finishedWork); break; case 23: break; case 22: var instance = finishedWork.stateNode; null !== finishedWork.memoizedState ? instance._visibility & 2 ? recursivelyTraverseReconnectPassiveEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects ) : recursivelyTraverseAtomicPassiveEffects( finishedRoot, finishedWork ) : (instance._visibility |= 2, recursivelyTraverseReconnectPassiveEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects )); includeWorkInProgressEffects && flags & 2048 && commitOffscreenPassiveMountEffects( finishedWork.alternate, finishedWork ); break; case 24: recursivelyTraverseReconnectPassiveEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects ); includeWorkInProgressEffects && flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork); break; default: recursivelyTraverseReconnectPassiveEffects( finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects ); } parentFiber = parentFiber.sibling; } } function recursivelyTraverseAtomicPassiveEffects(finishedRoot$jscomp$0, parentFiber) { if (parentFiber.subtreeFlags & 10256) for (parentFiber = parentFiber.child; null !== parentFiber; ) { var finishedRoot = finishedRoot$jscomp$0, finishedWork = parentFiber, flags = finishedWork.flags; switch (finishedWork.tag) { case 22: recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork); flags & 2048 && commitOffscreenPassiveMountEffects( finishedWork.alternate, finishedWork ); break; case 24: recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork); flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork); break; default: recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork); } parentFiber = parentFiber.sibling; } } var suspenseyCommitFlag = 8192; function recursivelyAccumulateSuspenseyCommit(parentFiber, committedLanes, suspendedState) { if (parentFiber.subtreeFlags & suspenseyCommitFlag) for (parentFiber = parentFiber.child; null !== parentFiber; ) accumulateSuspenseyCommitOnFiber( parentFiber, committedLanes, suspendedState ), parentFiber = parentFiber.sibling; } function accumulateSuspenseyCommitOnFiber(fiber, committedLanes, suspendedState) { switch (fiber.tag) { case 26: recursivelyAccumulateSuspenseyCommit( fiber, committedLanes, suspendedState ); fiber.flags & suspenseyCommitFlag && null !== fiber.memoizedState && suspendResource( suspendedState, currentHoistableRoot, fiber.memoizedState, fiber.memoizedProps ); break; case 5: recursivelyAccumulateSuspenseyCommit( fiber, committedLanes, suspendedState ); break; case 3: case 4: var previousHoistableRoot = currentHoistableRoot; currentHoistableRoot = getHoistableRoot(fiber.stateNode.containerInfo); recursivelyAccumulateSuspenseyCommit( fiber, committedLanes, suspendedState ); currentHoistableRoot = previousHoistableRoot; break; case 22: null === fiber.memoizedState && (previousHoistableRoot = fiber.alternate, null !== previousHoistableRoot && null !== previousHoistableRoot.memoizedState ? (previousHoistableRoot = suspenseyCommitFlag, suspenseyCommitFlag = 16777216, recursivelyAccumulateSuspenseyCommit( fiber, committedLanes, suspendedState ), suspenseyCommitFlag = previousHoistableRoot) : recursivelyAccumulateSuspenseyCommit( fiber, committedLanes, suspendedState )); break; default: recursivelyAccumulateSuspenseyCommit( fiber, committedLanes, suspendedState ); } } function detachAlternateSiblings(parentFiber) { var previousFiber = parentFiber.alternate; if (null !== previousFiber && (parentFiber = previousFiber.child, null !== parentFiber)) { previousFiber.child = null; do previousFiber = parentFiber.sibling, parentFiber.sibling = null, parentFiber = previousFiber; while (null !== parentFiber); } } function recursivelyTraversePassiveUnmountEffects(parentFiber) { var deletions = parentFiber.deletions; if (0 !== (parentFiber.flags & 16)) { if (null !== deletions) for (var i = 0; i < deletions.length; i++) { var childToDelete = deletions[i]; nextEffect = childToDelete; commitPassiveUnmountEffectsInsideOfDeletedTree_begin( childToDelete, parentFiber ); } detachAlternateSiblings(parentFiber); } if (parentFiber.subtreeFlags & 10256) for (parentFiber = parentFiber.child; null !== parentFiber; ) commitPassiveUnmountOnFiber(parentFiber), parentFiber = parentFiber.sibling; } function commitPassiveUnmountOnFiber(finishedWork) { switch (finishedWork.tag) { case 0: case 11: case 15: recursivelyTraversePassiveUnmountEffects(finishedWork); finishedWork.flags & 2048 && commitHookEffectListUnmount(9, finishedWork, finishedWork.return); break; case 3: recursivelyTraversePassiveUnmountEffects(finishedWork); break; case 12: recursivelyTraversePassiveUnmountEffects(finishedWork); break; case 22: var instance = finishedWork.stateNode; null !== finishedWork.memoizedState && instance._visibility & 2 && (null === finishedWork.return || 13 !== finishedWork.return.tag) ? (instance._visibility &= -3, recursivelyTraverseDisconnectPassiveEffects(finishedWork)) : recursivelyTraversePassiveUnmountEffects(finishedWork); break; default: recursivelyTraversePassiveUnmountEffects(finishedWork); } } function recursivelyTraverseDisconnectPassiveEffects(parentFiber) { var deletions = parentFiber.deletions; if (0 !== (parentFiber.flags & 16)) { if (null !== deletions) for (var i = 0; i < deletions.length; i++) { var childToDelete = deletions[i]; nextEffect = childToDelete; commitPassiveUnmountEffectsInsideOfDeletedTree_begin( childToDelete, parentFiber ); } detachAlternateSiblings(parentFiber); } for (parentFiber = parentFiber.child; null !== parentFiber; ) { deletions = parentFiber; switch (deletions.tag) { case 0: case 11: case 15: commitHookEffectListUnmount(8, deletions, deletions.return); recursivelyTraverseDisconnectPassiveEffects(deletions); break; case 22: i = deletions.stateNode; i._visibility & 2 && (i._visibility &= -3, recursivelyTraverseDisconnectPassiveEffects(deletions)); break; default: recursivelyTraverseDisconnectPassiveEffects(deletions); } parentFiber = parentFiber.sibling; } } function commitPassiveUnmountEffectsInsideOfDeletedTree_begin(deletedSubtreeRoot, nearestMountedAncestor) { for (; null !== nextEffect; ) { var fiber = nextEffect; switch (fiber.tag) { case 0: case 11: case 15: commitHookEffectListUnmount(8, fiber, nearestMountedAncestor); break; case 23: case 22: if (null !== fiber.memoizedState && null !== fiber.memoizedState.cachePool) { var cache = fiber.memoizedState.cachePool.pool; null != cache && cache.refCount++; } break; case 24: releaseCache(fiber.memoizedState.cache); } cache = fiber.child; if (null !== cache) cache.return = fiber, nextEffect = cache; else a: for (fiber = deletedSubtreeRoot; null !== nextEffect; ) { cache = nextEffect; var sibling = cache.sibling, returnFiber = cache.return; detachFiberAfterEffects(cache); if (cache === fiber) { nextEffect = null; break a; } if (null !== sibling) { sibling.return = returnFiber; nextEffect = sibling; break a; } nextEffect = returnFiber; } } } var DefaultAsyncDispatcher = { getCacheForType: function(resourceType) { var cache = readContext(CacheContext), cacheForType = cache.data.get(resourceType); void 0 === cacheForType && (cacheForType = resourceType(), cache.data.set(resourceType, cacheForType)); return cacheForType; }, cacheSignal: function() { return readContext(CacheContext).controller.signal; } }, PossiblyWeakMap = "function" === typeof WeakMap ? WeakMap : Map, executionContext = 0, workInProgressRoot = null, workInProgress = null, workInProgressRootRenderLanes = 0, workInProgressSuspendedReason = 0, workInProgressThrownValue = null, workInProgressRootDidSkipSuspendedSiblings = false, workInProgressRootIsPrerendering = false, workInProgressRootDidAttachPingListener = false, entangledRenderLanes = 0, workInProgressRootExitStatus = 0, workInProgressRootSkippedLanes = 0, workInProgressRootInterleavedUpdatedLanes = 0, workInProgressRootPingedLanes = 0, workInProgressDeferredLane = 0, workInProgressSuspendedRetryLanes = 0, workInProgressRootConcurrentErrors = null, workInProgressRootRecoverableErrors = null, workInProgressRootDidIncludeRecursiveRenderUpdate = false, globalMostRecentFallbackTime = 0, globalMostRecentTransitionTime = 0, workInProgressRootRenderTargetTime = Infinity, workInProgressTransitions = null, legacyErrorBoundariesThatAlreadyFailed = null, pendingEffectsStatus = 0, pendingEffectsRoot = null, pendingFinishedWork = null, pendingEffectsLanes = 0, pendingEffectsRemainingLanes = 0, pendingPassiveTransitions = null, pendingRecoverableErrors = null, nestedUpdateCount = 0, rootWithNestedUpdates = null; function requestUpdateLane() { return 0 !== (executionContext & 2) && 0 !== workInProgressRootRenderLanes ? workInProgressRootRenderLanes & -workInProgressRootRenderLanes : null !== ReactSharedInternals.T ? requestTransitionLane() : resolveUpdatePriority(); } function requestDeferredLane() { if (0 === workInProgressDeferredLane) if (0 === (workInProgressRootRenderLanes & 536870912) || isHydrating) { var lane = nextTransitionDeferredLane; nextTransitionDeferredLane <<= 1; 0 === (nextTransitionDeferredLane & 3932160) && (nextTransitionDeferredLane = 262144); workInProgressDeferredLane = lane; } else workInProgressDeferredLane = 536870912; lane = suspenseHandlerStackCursor.current; null !== lane && (lane.flags |= 32); return workInProgressDeferredLane; } function scheduleUpdateOnFiber(root2, fiber, lane) { if (root2 === workInProgressRoot && (2 === workInProgressSuspendedReason || 9 === workInProgressSuspendedReason) || null !== root2.cancelPendingCommit) prepareFreshStack(root2, 0), markRootSuspended( root2, workInProgressRootRenderLanes, workInProgressDeferredLane, false ); markRootUpdated$1(root2, lane); if (0 === (executionContext & 2) || root2 !== workInProgressRoot) root2 === workInProgressRoot && (0 === (executionContext & 2) && (workInProgressRootInterleavedUpdatedLanes |= lane), 4 === workInProgressRootExitStatus && markRootSuspended( root2, workInProgressRootRenderLanes, workInProgressDeferredLane, false )), ensureRootIsScheduled(root2); } function performWorkOnRoot(root$jscomp$0, lanes, forceSync) { if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(327)); var shouldTimeSlice = !forceSync && 0 === (lanes & 127) && 0 === (lanes & root$jscomp$0.expiredLanes) || checkIfRootIsPrerendering(root$jscomp$0, lanes), exitStatus = shouldTimeSlice ? renderRootConcurrent(root$jscomp$0, lanes) : renderRootSync(root$jscomp$0, lanes, true), renderWasConcurrent = shouldTimeSlice; do { if (0 === exitStatus) { workInProgressRootIsPrerendering && !shouldTimeSlice && markRootSuspended(root$jscomp$0, lanes, 0, false); break; } else { forceSync = root$jscomp$0.current.alternate; if (renderWasConcurrent && !isRenderConsistentWithExternalStores(forceSync)) { exitStatus = renderRootSync(root$jscomp$0, lanes, false); renderWasConcurrent = false; continue; } if (2 === exitStatus) { renderWasConcurrent = lanes; if (root$jscomp$0.errorRecoveryDisabledLanes & renderWasConcurrent) var JSCompiler_inline_result = 0; else JSCompiler_inline_result = root$jscomp$0.pendingLanes & -536870913, JSCompiler_inline_result = 0 !== JSCompiler_inline_result ? JSCompiler_inline_result : JSCompiler_inline_result & 536870912 ? 536870912 : 0; if (0 !== JSCompiler_inline_result) { lanes = JSCompiler_inline_result; a: { var root2 = root$jscomp$0; exitStatus = workInProgressRootConcurrentErrors; var wasRootDehydrated = root2.current.memoizedState.isDehydrated; wasRootDehydrated && (prepareFreshStack(root2, JSCompiler_inline_result).flags |= 256); JSCompiler_inline_result = renderRootSync( root2, JSCompiler_inline_result, false ); if (2 !== JSCompiler_inline_result) { if (workInProgressRootDidAttachPingListener && !wasRootDehydrated) { root2.errorRecoveryDisabledLanes |= renderWasConcurrent; workInProgressRootInterleavedUpdatedLanes |= renderWasConcurrent; exitStatus = 4; break a; } renderWasConcurrent = workInProgressRootRecoverableErrors; workInProgressRootRecoverableErrors = exitStatus; null !== renderWasConcurrent && (null === workInProgressRootRecoverableErrors ? workInProgressRootRecoverableErrors = renderWasConcurrent : workInProgressRootRecoverableErrors.push.apply( workInProgressRootRecoverableErrors, renderWasConcurrent )); } exitStatus = JSCompiler_inline_result; } renderWasConcurrent = false; if (2 !== exitStatus) continue; } } if (1 === exitStatus) { prepareFreshStack(root$jscomp$0, 0); markRootSuspended(root$jscomp$0, lanes, 0, true); break; } a: { shouldTimeSlice = root$jscomp$0; renderWasConcurrent = exitStatus; switch (renderWasConcurrent) { case 0: case 1: throw Error(formatProdErrorMessage(345)); case 4: if ((lanes & 4194048) !== lanes) break; case 6: markRootSuspended( shouldTimeSlice, lanes, workInProgressDeferredLane, !workInProgressRootDidSkipSuspendedSiblings ); break a; case 2: workInProgressRootRecoverableErrors = null; break; case 3: case 5: break; default: throw Error(formatProdErrorMessage(329)); } if ((lanes & 62914560) === lanes && (exitStatus = globalMostRecentFallbackTime + 300 - now(), 10 < exitStatus)) { markRootSuspended( shouldTimeSlice, lanes, workInProgressDeferredLane, !workInProgressRootDidSkipSuspendedSiblings ); if (0 !== getNextLanes(shouldTimeSlice, 0, true)) break a; pendingEffectsLanes = lanes; shouldTimeSlice.timeoutHandle = scheduleTimeout( commitRootWhenReady.bind( null, shouldTimeSlice, forceSync, workInProgressRootRecoverableErrors, workInProgressTransitions, workInProgressRootDidIncludeRecursiveRenderUpdate, lanes, workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, workInProgressSuspendedRetryLanes, workInProgressRootDidSkipSuspendedSiblings, renderWasConcurrent, "Throttled", -0, 0 ), exitStatus ); break a; } commitRootWhenReady( shouldTimeSlice, forceSync, workInProgressRootRecoverableErrors, workInProgressTransitions, workInProgressRootDidIncludeRecursiveRenderUpdate, lanes, workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, workInProgressSuspendedRetryLanes, workInProgressRootDidSkipSuspendedSiblings, renderWasConcurrent, null, -0, 0 ); } } break; } while (1); ensureRootIsScheduled(root$jscomp$0); } function commitRootWhenReady(root2, finishedWork, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, lanes, spawnedLane, updatedLanes, suspendedRetryLanes, didSkipSuspendedSiblings, exitStatus, suspendedCommitReason, completedRenderStartTime, completedRenderEndTime) { root2.timeoutHandle = -1; suspendedCommitReason = finishedWork.subtreeFlags; if (suspendedCommitReason & 8192 || 16785408 === (suspendedCommitReason & 16785408)) { suspendedCommitReason = { stylesheets: null, count: 0, imgCount: 0, imgBytes: 0, suspenseyImages: [], waitingForImages: true, waitingForViewTransition: false, unsuspend: noop$1 }; accumulateSuspenseyCommitOnFiber( finishedWork, lanes, suspendedCommitReason ); var timeoutOffset = (lanes & 62914560) === lanes ? globalMostRecentFallbackTime - now() : (lanes & 4194048) === lanes ? globalMostRecentTransitionTime - now() : 0; timeoutOffset = waitForCommitToBeReady( suspendedCommitReason, timeoutOffset ); if (null !== timeoutOffset) { pendingEffectsLanes = lanes; root2.cancelPendingCommit = timeoutOffset( commitRoot.bind( null, root2, finishedWork, lanes, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes, exitStatus, suspendedCommitReason, null, completedRenderStartTime, completedRenderEndTime ) ); markRootSuspended(root2, lanes, spawnedLane, !didSkipSuspendedSiblings); return; } } commitRoot( root2, finishedWork, lanes, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes ); } function isRenderConsistentWithExternalStores(finishedWork) { for (var node = finishedWork; ; ) { var tag = node.tag; if ((0 === tag || 11 === tag || 15 === tag) && node.flags & 16384 && (tag = node.updateQueue, null !== tag && (tag = tag.stores, null !== tag))) for (var i = 0; i < tag.length; i++) { var check = tag[i], getSnapshot = check.getSnapshot; check = check.value; try { if (!objectIs(getSnapshot(), check)) return false; } catch (error) { return false; } } tag = node.child; if (node.subtreeFlags & 16384 && null !== tag) tag.return = node, node = tag; else { if (node === finishedWork) break; for (; null === node.sibling; ) { if (null === node.return || node.return === finishedWork) return true; node = node.return; } node.sibling.return = node.return; node = node.sibling; } } return true; } function markRootSuspended(root2, suspendedLanes, spawnedLane, didAttemptEntireTree) { suspendedLanes &= ~workInProgressRootPingedLanes; suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes; root2.suspendedLanes |= suspendedLanes; root2.pingedLanes &= ~suspendedLanes; didAttemptEntireTree && (root2.warmLanes |= suspendedLanes); didAttemptEntireTree = root2.expirationTimes; for (var lanes = suspendedLanes; 0 < lanes; ) { var index$6 = 31 - clz32(lanes), lane = 1 << index$6; didAttemptEntireTree[index$6] = -1; lanes &= ~lane; } 0 !== spawnedLane && markSpawnedDeferredLane(root2, spawnedLane, suspendedLanes); } function flushSyncWork$1() { return 0 === (executionContext & 6) ? (flushSyncWorkAcrossRoots_impl(0), false) : true; } function resetWorkInProgressStack() { if (null !== workInProgress) { if (0 === workInProgressSuspendedReason) var interruptedWork = workInProgress.return; else interruptedWork = workInProgress, lastContextDependency = currentlyRenderingFiber$1 = null, resetHooksOnUnwind(interruptedWork), thenableState$1 = null, thenableIndexCounter$1 = 0, interruptedWork = workInProgress; for (; null !== interruptedWork; ) unwindInterruptedWork(interruptedWork.alternate, interruptedWork), interruptedWork = interruptedWork.return; workInProgress = null; } } function prepareFreshStack(root2, lanes) { var timeoutHandle = root2.timeoutHandle; -1 !== timeoutHandle && (root2.timeoutHandle = -1, cancelTimeout(timeoutHandle)); timeoutHandle = root2.cancelPendingCommit; null !== timeoutHandle && (root2.cancelPendingCommit = null, timeoutHandle()); pendingEffectsLanes = 0; resetWorkInProgressStack(); workInProgressRoot = root2; workInProgress = timeoutHandle = createWorkInProgress(root2.current, null); workInProgressRootRenderLanes = lanes; workInProgressSuspendedReason = 0; workInProgressThrownValue = null; workInProgressRootDidSkipSuspendedSiblings = false; workInProgressRootIsPrerendering = checkIfRootIsPrerendering(root2, lanes); workInProgressRootDidAttachPingListener = false; workInProgressSuspendedRetryLanes = workInProgressDeferredLane = workInProgressRootPingedLanes = workInProgressRootInterleavedUpdatedLanes = workInProgressRootSkippedLanes = workInProgressRootExitStatus = 0; workInProgressRootRecoverableErrors = workInProgressRootConcurrentErrors = null; workInProgressRootDidIncludeRecursiveRenderUpdate = false; 0 !== (lanes & 8) && (lanes |= lanes & 32); var allEntangledLanes = root2.entangledLanes; if (0 !== allEntangledLanes) for (root2 = root2.entanglements, allEntangledLanes &= lanes; 0 < allEntangledLanes; ) { var index$4 = 31 - clz32(allEntangledLanes), lane = 1 << index$4; lanes |= root2[index$4]; allEntangledLanes &= ~lane; } entangledRenderLanes = lanes; finishQueueingConcurrentUpdates(); return timeoutHandle; } function handleThrow(root2, thrownValue) { currentlyRenderingFiber = null; ReactSharedInternals.H = ContextOnlyDispatcher; thrownValue === SuspenseException || thrownValue === SuspenseActionException ? (thrownValue = getSuspendedThenable(), workInProgressSuspendedReason = 3) : thrownValue === SuspenseyCommitException ? (thrownValue = getSuspendedThenable(), workInProgressSuspendedReason = 4) : workInProgressSuspendedReason = thrownValue === SelectiveHydrationException ? 8 : null !== thrownValue && "object" === typeof thrownValue && "function" === typeof thrownValue.then ? 6 : 1; workInProgressThrownValue = thrownValue; null === workInProgress && (workInProgressRootExitStatus = 1, logUncaughtError( root2, createCapturedValueAtFiber(thrownValue, root2.current) )); } function shouldRemainOnPreviousScreen() { var handler = suspenseHandlerStackCursor.current; return null === handler ? true : (workInProgressRootRenderLanes & 4194048) === workInProgressRootRenderLanes ? null === shellBoundary ? true : false : (workInProgressRootRenderLanes & 62914560) === workInProgressRootRenderLanes || 0 !== (workInProgressRootRenderLanes & 536870912) ? handler === shellBoundary : false; } function pushDispatcher() { var prevDispatcher = ReactSharedInternals.H; ReactSharedInternals.H = ContextOnlyDispatcher; return null === prevDispatcher ? ContextOnlyDispatcher : prevDispatcher; } function pushAsyncDispatcher() { var prevAsyncDispatcher = ReactSharedInternals.A; ReactSharedInternals.A = DefaultAsyncDispatcher; return prevAsyncDispatcher; } function renderDidSuspendDelayIfPossible() { workInProgressRootExitStatus = 4; workInProgressRootDidSkipSuspendedSiblings || (workInProgressRootRenderLanes & 4194048) !== workInProgressRootRenderLanes && null !== suspenseHandlerStackCursor.current || (workInProgressRootIsPrerendering = true); 0 === (workInProgressRootSkippedLanes & 134217727) && 0 === (workInProgressRootInterleavedUpdatedLanes & 134217727) || null === workInProgressRoot || markRootSuspended( workInProgressRoot, workInProgressRootRenderLanes, workInProgressDeferredLane, false ); } function renderRootSync(root2, lanes, shouldYieldForPrerendering) { var prevExecutionContext = executionContext; executionContext |= 2; var prevDispatcher = pushDispatcher(), prevAsyncDispatcher = pushAsyncDispatcher(); if (workInProgressRoot !== root2 || workInProgressRootRenderLanes !== lanes) workInProgressTransitions = null, prepareFreshStack(root2, lanes); lanes = false; var exitStatus = workInProgressRootExitStatus; a: do try { if (0 !== workInProgressSuspendedReason && null !== workInProgress) { var unitOfWork = workInProgress, thrownValue = workInProgressThrownValue; switch (workInProgressSuspendedReason) { case 8: resetWorkInProgressStack(); exitStatus = 6; break a; case 3: case 2: case 9: case 6: null === suspenseHandlerStackCursor.current && (lanes = true); var reason = workInProgressSuspendedReason; workInProgressSuspendedReason = 0; workInProgressThrownValue = null; throwAndUnwindWorkLoop(root2, unitOfWork, thrownValue, reason); if (shouldYieldForPrerendering && workInProgressRootIsPrerendering) { exitStatus = 0; break a; } break; default: reason = workInProgressSuspendedReason, workInProgressSuspendedReason = 0, workInProgressThrownValue = null, throwAndUnwindWorkLoop(root2, unitOfWork, thrownValue, reason); } } workLoopSync(); exitStatus = workInProgressRootExitStatus; break; } catch (thrownValue$165) { handleThrow(root2, thrownValue$165); } while (1); lanes && root2.shellSuspendCounter++; lastContextDependency = currentlyRenderingFiber$1 = null; executionContext = prevExecutionContext; ReactSharedInternals.H = prevDispatcher; ReactSharedInternals.A = prevAsyncDispatcher; null === workInProgress && (workInProgressRoot = null, workInProgressRootRenderLanes = 0, finishQueueingConcurrentUpdates()); return exitStatus; } function workLoopSync() { for (; null !== workInProgress; ) performUnitOfWork(workInProgress); } function renderRootConcurrent(root2, lanes) { var prevExecutionContext = executionContext; executionContext |= 2; var prevDispatcher = pushDispatcher(), prevAsyncDispatcher = pushAsyncDispatcher(); workInProgressRoot !== root2 || workInProgressRootRenderLanes !== lanes ? (workInProgressTransitions = null, workInProgressRootRenderTargetTime = now() + 500, prepareFreshStack(root2, lanes)) : workInProgressRootIsPrerendering = checkIfRootIsPrerendering( root2, lanes ); a: do try { if (0 !== workInProgressSuspendedReason && null !== workInProgress) { lanes = workInProgress; var thrownValue = workInProgressThrownValue; b: switch (workInProgressSuspendedReason) { case 1: workInProgressSuspendedReason = 0; workInProgressThrownValue = null; throwAndUnwindWorkLoop(root2, lanes, thrownValue, 1); break; case 2: case 9: if (isThenableResolved(thrownValue)) { workInProgressSuspendedReason = 0; workInProgressThrownValue = null; replaySuspendedUnitOfWork(lanes); break; } lanes = function() { 2 !== workInProgressSuspendedReason && 9 !== workInProgressSuspendedReason || workInProgressRoot !== root2 || (workInProgressSuspendedReason = 7); ensureRootIsScheduled(root2); }; thrownValue.then(lanes, lanes); break a; case 3: workInProgressSuspendedReason = 7; break a; case 4: workInProgressSuspendedReason = 5; break a; case 7: isThenableResolved(thrownValue) ? (workInProgressSuspendedReason = 0, workInProgressThrownValue = null, replaySuspendedUnitOfWork(lanes)) : (workInProgressSuspendedReason = 0, workInProgressThrownValue = null, throwAndUnwindWorkLoop(root2, lanes, thrownValue, 7)); break; case 5: var resource = null; switch (workInProgress.tag) { case 26: resource = workInProgress.memoizedState; case 5: case 27: var hostFiber = workInProgress; if (resource ? preloadResource(resource) : hostFiber.stateNode.complete) { workInProgressSuspendedReason = 0; workInProgressThrownValue = null; var sibling = hostFiber.sibling; if (null !== sibling) workInProgress = sibling; else { var returnFiber = hostFiber.return; null !== returnFiber ? (workInProgress = returnFiber, completeUnitOfWork(returnFiber)) : workInProgress = null; } break b; } } workInProgressSuspendedReason = 0; workInProgressThrownValue = null; throwAndUnwindWorkLoop(root2, lanes, thrownValue, 5); break; case 6: workInProgressSuspendedReason = 0; workInProgressThrownValue = null; throwAndUnwindWorkLoop(root2, lanes, thrownValue, 6); break; case 8: resetWorkInProgressStack(); workInProgressRootExitStatus = 6; break a; default: throw Error(formatProdErrorMessage(462)); } } workLoopConcurrentByScheduler(); break; } catch (thrownValue$167) { handleThrow(root2, thrownValue$167); } while (1); lastContextDependency = currentlyRenderingFiber$1 = null; ReactSharedInternals.H = prevDispatcher; ReactSharedInternals.A = prevAsyncDispatcher; executionContext = prevExecutionContext; if (null !== workInProgress) return 0; workInProgressRoot = null; workInProgressRootRenderLanes = 0; finishQueueingConcurrentUpdates(); return workInProgressRootExitStatus; } function workLoopConcurrentByScheduler() { for (; null !== workInProgress && !shouldYield(); ) performUnitOfWork(workInProgress); } function performUnitOfWork(unitOfWork) { var next = beginWork(unitOfWork.alternate, unitOfWork, entangledRenderLanes); unitOfWork.memoizedProps = unitOfWork.pendingProps; null === next ? completeUnitOfWork(unitOfWork) : workInProgress = next; } function replaySuspendedUnitOfWork(unitOfWork) { var next = unitOfWork; var current = next.alternate; switch (next.tag) { case 15: case 0: next = replayFunctionComponent( current, next, next.pendingProps, next.type, void 0, workInProgressRootRenderLanes ); break; case 11: next = replayFunctionComponent( current, next, next.pendingProps, next.type.render, next.ref, workInProgressRootRenderLanes ); break; case 5: resetHooksOnUnwind(next); default: unwindInterruptedWork(current, next), next = workInProgress = resetWorkInProgress(next, entangledRenderLanes), next = beginWork(current, next, entangledRenderLanes); } unitOfWork.memoizedProps = unitOfWork.pendingProps; null === next ? completeUnitOfWork(unitOfWork) : workInProgress = next; } function throwAndUnwindWorkLoop(root2, unitOfWork, thrownValue, suspendedReason) { lastContextDependency = currentlyRenderingFiber$1 = null; resetHooksOnUnwind(unitOfWork); thenableState$1 = null; thenableIndexCounter$1 = 0; var returnFiber = unitOfWork.return; try { if (throwException( root2, returnFiber, unitOfWork, thrownValue, workInProgressRootRenderLanes )) { workInProgressRootExitStatus = 1; logUncaughtError( root2, createCapturedValueAtFiber(thrownValue, root2.current) ); workInProgress = null; return; } } catch (error) { if (null !== returnFiber) throw workInProgress = returnFiber, error; workInProgressRootExitStatus = 1; logUncaughtError( root2, createCapturedValueAtFiber(thrownValue, root2.current) ); workInProgress = null; return; } if (unitOfWork.flags & 32768) { if (isHydrating || 1 === suspendedReason) root2 = true; else if (workInProgressRootIsPrerendering || 0 !== (workInProgressRootRenderLanes & 536870912)) root2 = false; else if (workInProgressRootDidSkipSuspendedSiblings = root2 = true, 2 === suspendedReason || 9 === suspendedReason || 3 === suspendedReason || 6 === suspendedReason) suspendedReason = suspenseHandlerStackCursor.current, null !== suspendedReason && 13 === suspendedReason.tag && (suspendedReason.flags |= 16384); unwindUnitOfWork(unitOfWork, root2); } else completeUnitOfWork(unitOfWork); } function completeUnitOfWork(unitOfWork) { var completedWork = unitOfWork; do { if (0 !== (completedWork.flags & 32768)) { unwindUnitOfWork( completedWork, workInProgressRootDidSkipSuspendedSiblings ); return; } unitOfWork = completedWork.return; var next = completeWork( completedWork.alternate, completedWork, entangledRenderLanes ); if (null !== next) { workInProgress = next; return; } completedWork = completedWork.sibling; if (null !== completedWork) { workInProgress = completedWork; return; } workInProgress = completedWork = unitOfWork; } while (null !== completedWork); 0 === workInProgressRootExitStatus && (workInProgressRootExitStatus = 5); } function unwindUnitOfWork(unitOfWork, skipSiblings) { do { var next = unwindWork(unitOfWork.alternate, unitOfWork); if (null !== next) { next.flags &= 32767; workInProgress = next; return; } next = unitOfWork.return; null !== next && (next.flags |= 32768, next.subtreeFlags = 0, next.deletions = null); if (!skipSiblings && (unitOfWork = unitOfWork.sibling, null !== unitOfWork)) { workInProgress = unitOfWork; return; } workInProgress = unitOfWork = next; } while (null !== unitOfWork); workInProgressRootExitStatus = 6; workInProgress = null; } function commitRoot(root2, finishedWork, lanes, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes) { root2.cancelPendingCommit = null; do flushPendingEffects(); while (0 !== pendingEffectsStatus); if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(327)); if (null !== finishedWork) { if (finishedWork === root2.current) throw Error(formatProdErrorMessage(177)); didIncludeRenderPhaseUpdate = finishedWork.lanes | finishedWork.childLanes; didIncludeRenderPhaseUpdate |= concurrentlyUpdatedLanes; markRootFinished( root2, lanes, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes ); root2 === workInProgressRoot && (workInProgress = workInProgressRoot = null, workInProgressRootRenderLanes = 0); pendingFinishedWork = finishedWork; pendingEffectsRoot = root2; pendingEffectsLanes = lanes; pendingEffectsRemainingLanes = didIncludeRenderPhaseUpdate; pendingPassiveTransitions = transitions; pendingRecoverableErrors = recoverableErrors; 0 !== (finishedWork.subtreeFlags & 10256) || 0 !== (finishedWork.flags & 10256) ? (root2.callbackNode = null, root2.callbackPriority = 0, scheduleCallback$1(NormalPriority$1, function() { flushPassiveEffects(); return null; })) : (root2.callbackNode = null, root2.callbackPriority = 0); recoverableErrors = 0 !== (finishedWork.flags & 13878); if (0 !== (finishedWork.subtreeFlags & 13878) || recoverableErrors) { recoverableErrors = ReactSharedInternals.T; ReactSharedInternals.T = null; transitions = ReactDOMSharedInternals.p; ReactDOMSharedInternals.p = 2; spawnedLane = executionContext; executionContext |= 4; try { commitBeforeMutationEffects(root2, finishedWork, lanes); } finally { executionContext = spawnedLane, ReactDOMSharedInternals.p = transitions, ReactSharedInternals.T = recoverableErrors; } } pendingEffectsStatus = 1; flushMutationEffects(); flushLayoutEffects(); flushSpawnedWork(); } } function flushMutationEffects() { if (1 === pendingEffectsStatus) { pendingEffectsStatus = 0; var root2 = pendingEffectsRoot, finishedWork = pendingFinishedWork, rootMutationHasEffect = 0 !== (finishedWork.flags & 13878); if (0 !== (finishedWork.subtreeFlags & 13878) || rootMutationHasEffect) { rootMutationHasEffect = ReactSharedInternals.T; ReactSharedInternals.T = null; var previousPriority = ReactDOMSharedInternals.p; ReactDOMSharedInternals.p = 2; var prevExecutionContext = executionContext; executionContext |= 4; try { commitMutationEffectsOnFiber(finishedWork, root2); var priorSelectionInformation = selectionInformation, curFocusedElem = getActiveElementDeep(root2.containerInfo), priorFocusedElem = priorSelectionInformation.focusedElem, priorSelectionRange = priorSelectionInformation.selectionRange; if (curFocusedElem !== priorFocusedElem && priorFocusedElem && priorFocusedElem.ownerDocument && containsNode( priorFocusedElem.ownerDocument.documentElement, priorFocusedElem )) { if (null !== priorSelectionRange && hasSelectionCapabilities(priorFocusedElem)) { var start = priorSelectionRange.start, end = priorSelectionRange.end; void 0 === end && (end = start); if ("selectionStart" in priorFocusedElem) priorFocusedElem.selectionStart = start, priorFocusedElem.selectionEnd = Math.min( end, priorFocusedElem.value.length ); else { var doc = priorFocusedElem.ownerDocument || document, win = doc && doc.defaultView || window; if (win.getSelection) { var selection = win.getSelection(), length = priorFocusedElem.textContent.length, start$jscomp$0 = Math.min(priorSelectionRange.start, length), end$jscomp$0 = void 0 === priorSelectionRange.end ? start$jscomp$0 : Math.min(priorSelectionRange.end, length); !selection.extend && start$jscomp$0 > end$jscomp$0 && (curFocusedElem = end$jscomp$0, end$jscomp$0 = start$jscomp$0, start$jscomp$0 = curFocusedElem); var startMarker = getNodeForCharacterOffset( priorFocusedElem, start$jscomp$0 ), endMarker = getNodeForCharacterOffset( priorFocusedElem, end$jscomp$0 ); if (startMarker && endMarker && (1 !== selection.rangeCount || selection.anchorNode !== startMarker.node || selection.anchorOffset !== startMarker.offset || selection.focusNode !== endMarker.node || selection.focusOffset !== endMarker.offset)) { var range = doc.createRange(); range.setStart(startMarker.node, startMarker.offset); selection.removeAllRanges(); start$jscomp$0 > end$jscomp$0 ? (selection.addRange(range), selection.extend(endMarker.node, endMarker.offset)) : (range.setEnd(endMarker.node, endMarker.offset), selection.addRange(range)); } } } } doc = []; for (selection = priorFocusedElem; selection = selection.parentNode; ) 1 === selection.nodeType && doc.push({ element: selection, left: selection.scrollLeft, top: selection.scrollTop }); "function" === typeof priorFocusedElem.focus && priorFocusedElem.focus(); for (priorFocusedElem = 0; priorFocusedElem < doc.length; priorFocusedElem++) { var info = doc[priorFocusedElem]; info.element.scrollLeft = info.left; info.element.scrollTop = info.top; } } _enabled = !!eventsEnabled; selectionInformation = eventsEnabled = null; } finally { executionContext = prevExecutionContext, ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = rootMutationHasEffect; } } root2.current = finishedWork; pendingEffectsStatus = 2; } } function flushLayoutEffects() { if (2 === pendingEffectsStatus) { pendingEffectsStatus = 0; var root2 = pendingEffectsRoot, finishedWork = pendingFinishedWork, rootHasLayoutEffect = 0 !== (finishedWork.flags & 8772); if (0 !== (finishedWork.subtreeFlags & 8772) || rootHasLayoutEffect) { rootHasLayoutEffect = ReactSharedInternals.T; ReactSharedInternals.T = null; var previousPriority = ReactDOMSharedInternals.p; ReactDOMSharedInternals.p = 2; var prevExecutionContext = executionContext; executionContext |= 4; try { commitLayoutEffectOnFiber(root2, finishedWork.alternate, finishedWork); } finally { executionContext = prevExecutionContext, ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = rootHasLayoutEffect; } } pendingEffectsStatus = 3; } } function flushSpawnedWork() { if (4 === pendingEffectsStatus || 3 === pendingEffectsStatus) { pendingEffectsStatus = 0; requestPaint(); var root2 = pendingEffectsRoot, finishedWork = pendingFinishedWork, lanes = pendingEffectsLanes, recoverableErrors = pendingRecoverableErrors; 0 !== (finishedWork.subtreeFlags & 10256) || 0 !== (finishedWork.flags & 10256) ? pendingEffectsStatus = 5 : (pendingEffectsStatus = 0, pendingFinishedWork = pendingEffectsRoot = null, releaseRootPooledCache(root2, root2.pendingLanes)); var remainingLanes = root2.pendingLanes; 0 === remainingLanes && (legacyErrorBoundariesThatAlreadyFailed = null); lanesToEventPriority(lanes); finishedWork = finishedWork.stateNode; if (injectedHook && "function" === typeof injectedHook.onCommitFiberRoot) try { injectedHook.onCommitFiberRoot( rendererID, finishedWork, void 0, 128 === (finishedWork.current.flags & 128) ); } catch (err) { } if (null !== recoverableErrors) { finishedWork = ReactSharedInternals.T; remainingLanes = ReactDOMSharedInternals.p; ReactDOMSharedInternals.p = 2; ReactSharedInternals.T = null; try { for (var onRecoverableError = root2.onRecoverableError, i = 0; i < recoverableErrors.length; i++) { var recoverableError = recoverableErrors[i]; onRecoverableError(recoverableError.value, { componentStack: recoverableError.stack }); } } finally { ReactSharedInternals.T = finishedWork, ReactDOMSharedInternals.p = remainingLanes; } } 0 !== (pendingEffectsLanes & 3) && flushPendingEffects(); ensureRootIsScheduled(root2); remainingLanes = root2.pendingLanes; 0 !== (lanes & 261930) && 0 !== (remainingLanes & 42) ? root2 === rootWithNestedUpdates ? nestedUpdateCount++ : (nestedUpdateCount = 0, rootWithNestedUpdates = root2) : nestedUpdateCount = 0; flushSyncWorkAcrossRoots_impl(0); } } function releaseRootPooledCache(root2, remainingLanes) { 0 === (root2.pooledCacheLanes &= remainingLanes) && (remainingLanes = root2.pooledCache, null != remainingLanes && (root2.pooledCache = null, releaseCache(remainingLanes))); } function flushPendingEffects() { flushMutationEffects(); flushLayoutEffects(); flushSpawnedWork(); return flushPassiveEffects(); } function flushPassiveEffects() { if (5 !== pendingEffectsStatus) return false; var root2 = pendingEffectsRoot, remainingLanes = pendingEffectsRemainingLanes; pendingEffectsRemainingLanes = 0; var renderPriority = lanesToEventPriority(pendingEffectsLanes), prevTransition = ReactSharedInternals.T, previousPriority = ReactDOMSharedInternals.p; try { ReactDOMSharedInternals.p = 32 > renderPriority ? 32 : renderPriority; ReactSharedInternals.T = null; renderPriority = pendingPassiveTransitions; pendingPassiveTransitions = null; var root$jscomp$0 = pendingEffectsRoot, lanes = pendingEffectsLanes; pendingEffectsStatus = 0; pendingFinishedWork = pendingEffectsRoot = null; pendingEffectsLanes = 0; if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(331)); var prevExecutionContext = executionContext; executionContext |= 4; commitPassiveUnmountOnFiber(root$jscomp$0.current); commitPassiveMountOnFiber( root$jscomp$0, root$jscomp$0.current, lanes, renderPriority ); executionContext = prevExecutionContext; flushSyncWorkAcrossRoots_impl(0, false); if (injectedHook && "function" === typeof injectedHook.onPostCommitFiberRoot) try { injectedHook.onPostCommitFiberRoot(rendererID, root$jscomp$0); } catch (err) { } return true; } finally { ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = prevTransition, releaseRootPooledCache(root2, remainingLanes); } } function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) { sourceFiber = createCapturedValueAtFiber(error, sourceFiber); sourceFiber = createRootErrorUpdate(rootFiber.stateNode, sourceFiber, 2); rootFiber = enqueueUpdate(rootFiber, sourceFiber, 2); null !== rootFiber && (markRootUpdated$1(rootFiber, 2), ensureRootIsScheduled(rootFiber)); } function captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error) { if (3 === sourceFiber.tag) captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error); else for (; null !== nearestMountedAncestor; ) { if (3 === nearestMountedAncestor.tag) { captureCommitPhaseErrorOnRoot( nearestMountedAncestor, sourceFiber, error ); break; } else if (1 === nearestMountedAncestor.tag) { var instance = nearestMountedAncestor.stateNode; if ("function" === typeof nearestMountedAncestor.type.getDerivedStateFromError || "function" === typeof instance.componentDidCatch && (null === legacyErrorBoundariesThatAlreadyFailed || !legacyErrorBoundariesThatAlreadyFailed.has(instance))) { sourceFiber = createCapturedValueAtFiber(error, sourceFiber); error = createClassErrorUpdate(2); instance = enqueueUpdate(nearestMountedAncestor, error, 2); null !== instance && (initializeClassErrorUpdate( error, instance, nearestMountedAncestor, sourceFiber ), markRootUpdated$1(instance, 2), ensureRootIsScheduled(instance)); break; } } nearestMountedAncestor = nearestMountedAncestor.return; } } function attachPingListener(root2, wakeable, lanes) { var pingCache = root2.pingCache; if (null === pingCache) { pingCache = root2.pingCache = new PossiblyWeakMap(); var threadIDs = new Set(); pingCache.set(wakeable, threadIDs); } else threadIDs = pingCache.get(wakeable), void 0 === threadIDs && (threadIDs = new Set(), pingCache.set(wakeable, threadIDs)); threadIDs.has(lanes) || (workInProgressRootDidAttachPingListener = true, threadIDs.add(lanes), root2 = pingSuspendedRoot.bind(null, root2, wakeable, lanes), wakeable.then(root2, root2)); } function pingSuspendedRoot(root2, wakeable, pingedLanes) { var pingCache = root2.pingCache; null !== pingCache && pingCache.delete(wakeable); root2.pingedLanes |= root2.suspendedLanes & pingedLanes; root2.warmLanes &= ~pingedLanes; workInProgressRoot === root2 && (workInProgressRootRenderLanes & pingedLanes) === pingedLanes && (4 === workInProgressRootExitStatus || 3 === workInProgressRootExitStatus && (workInProgressRootRenderLanes & 62914560) === workInProgressRootRenderLanes && 300 > now() - globalMostRecentFallbackTime ? 0 === (executionContext & 2) && prepareFreshStack(root2, 0) : workInProgressRootPingedLanes |= pingedLanes, workInProgressSuspendedRetryLanes === workInProgressRootRenderLanes && (workInProgressSuspendedRetryLanes = 0)); ensureRootIsScheduled(root2); } function retryTimedOutBoundary(boundaryFiber, retryLane) { 0 === retryLane && (retryLane = claimNextRetryLane()); boundaryFiber = enqueueConcurrentRenderForLane(boundaryFiber, retryLane); null !== boundaryFiber && (markRootUpdated$1(boundaryFiber, retryLane), ensureRootIsScheduled(boundaryFiber)); } function retryDehydratedSuspenseBoundary(boundaryFiber) { var suspenseState = boundaryFiber.memoizedState, retryLane = 0; null !== suspenseState && (retryLane = suspenseState.retryLane); retryTimedOutBoundary(boundaryFiber, retryLane); } function resolveRetryWakeable(boundaryFiber, wakeable) { var retryLane = 0; switch (boundaryFiber.tag) { case 31: case 13: var retryCache = boundaryFiber.stateNode; var suspenseState = boundaryFiber.memoizedState; null !== suspenseState && (retryLane = suspenseState.retryLane); break; case 19: retryCache = boundaryFiber.stateNode; break; case 22: retryCache = boundaryFiber.stateNode._retryCache; break; default: throw Error(formatProdErrorMessage(314)); } null !== retryCache && retryCache.delete(wakeable); retryTimedOutBoundary(boundaryFiber, retryLane); } function scheduleCallback$1(priorityLevel, callback) { return scheduleCallback$3(priorityLevel, callback); } var firstScheduledRoot = null, lastScheduledRoot = null, didScheduleMicrotask = false, mightHavePendingSyncWork = false, isFlushingWork = false, currentEventTransitionLane = 0; function ensureRootIsScheduled(root2) { root2 !== lastScheduledRoot && null === root2.next && (null === lastScheduledRoot ? firstScheduledRoot = lastScheduledRoot = root2 : lastScheduledRoot = lastScheduledRoot.next = root2); mightHavePendingSyncWork = true; didScheduleMicrotask || (didScheduleMicrotask = true, scheduleImmediateRootScheduleTask()); } function flushSyncWorkAcrossRoots_impl(syncTransitionLanes, onlyLegacy) { if (!isFlushingWork && mightHavePendingSyncWork) { isFlushingWork = true; do { var didPerformSomeWork = false; for (var root$170 = firstScheduledRoot; null !== root$170; ) { if (0 !== syncTransitionLanes) { var pendingLanes = root$170.pendingLanes; if (0 === pendingLanes) var JSCompiler_inline_result = 0; else { var suspendedLanes = root$170.suspendedLanes, pingedLanes = root$170.pingedLanes; JSCompiler_inline_result = (1 << 31 - clz32(42 | syncTransitionLanes) + 1) - 1; JSCompiler_inline_result &= pendingLanes & ~(suspendedLanes & ~pingedLanes); JSCompiler_inline_result = JSCompiler_inline_result & 201326741 ? JSCompiler_inline_result & 201326741 | 1 : JSCompiler_inline_result ? JSCompiler_inline_result | 2 : 0; } 0 !== JSCompiler_inline_result && (didPerformSomeWork = true, performSyncWorkOnRoot(root$170, JSCompiler_inline_result)); } else JSCompiler_inline_result = workInProgressRootRenderLanes, JSCompiler_inline_result = getNextLanes( root$170, root$170 === workInProgressRoot ? JSCompiler_inline_result : 0, null !== root$170.cancelPendingCommit || -1 !== root$170.timeoutHandle ), 0 === (JSCompiler_inline_result & 3) || checkIfRootIsPrerendering(root$170, JSCompiler_inline_result) || (didPerformSomeWork = true, performSyncWorkOnRoot(root$170, JSCompiler_inline_result)); root$170 = root$170.next; } } while (didPerformSomeWork); isFlushingWork = false; } } function processRootScheduleInImmediateTask() { processRootScheduleInMicrotask(); } function processRootScheduleInMicrotask() { mightHavePendingSyncWork = didScheduleMicrotask = false; var syncTransitionLanes = 0; 0 !== currentEventTransitionLane && shouldAttemptEagerTransition() && (syncTransitionLanes = currentEventTransitionLane); for (var currentTime = now(), prev = null, root2 = firstScheduledRoot; null !== root2; ) { var next = root2.next, nextLanes = scheduleTaskForRootDuringMicrotask(root2, currentTime); if (0 === nextLanes) root2.next = null, null === prev ? firstScheduledRoot = next : prev.next = next, null === next && (lastScheduledRoot = prev); else if (prev = root2, 0 !== syncTransitionLanes || 0 !== (nextLanes & 3)) mightHavePendingSyncWork = true; root2 = next; } 0 !== pendingEffectsStatus && 5 !== pendingEffectsStatus || flushSyncWorkAcrossRoots_impl(syncTransitionLanes); 0 !== currentEventTransitionLane && (currentEventTransitionLane = 0); } function scheduleTaskForRootDuringMicrotask(root2, currentTime) { for (var suspendedLanes = root2.suspendedLanes, pingedLanes = root2.pingedLanes, expirationTimes = root2.expirationTimes, lanes = root2.pendingLanes & -62914561; 0 < lanes; ) { var index$5 = 31 - clz32(lanes), lane = 1 << index$5, expirationTime = expirationTimes[index$5]; if (-1 === expirationTime) { if (0 === (lane & suspendedLanes) || 0 !== (lane & pingedLanes)) expirationTimes[index$5] = computeExpirationTime(lane, currentTime); } else expirationTime <= currentTime && (root2.expiredLanes |= lane); lanes &= ~lane; } currentTime = workInProgressRoot; suspendedLanes = workInProgressRootRenderLanes; suspendedLanes = getNextLanes( root2, root2 === currentTime ? suspendedLanes : 0, null !== root2.cancelPendingCommit || -1 !== root2.timeoutHandle ); pingedLanes = root2.callbackNode; if (0 === suspendedLanes || root2 === currentTime && (2 === workInProgressSuspendedReason || 9 === workInProgressSuspendedReason) || null !== root2.cancelPendingCommit) return null !== pingedLanes && null !== pingedLanes && cancelCallback$1(pingedLanes), root2.callbackNode = null, root2.callbackPriority = 0; if (0 === (suspendedLanes & 3) || checkIfRootIsPrerendering(root2, suspendedLanes)) { currentTime = suspendedLanes & -suspendedLanes; if (currentTime === root2.callbackPriority) return currentTime; null !== pingedLanes && cancelCallback$1(pingedLanes); switch (lanesToEventPriority(suspendedLanes)) { case 2: case 8: suspendedLanes = UserBlockingPriority; break; case 32: suspendedLanes = NormalPriority$1; break; case 268435456: suspendedLanes = IdlePriority; break; default: suspendedLanes = NormalPriority$1; } pingedLanes = performWorkOnRootViaSchedulerTask.bind(null, root2); suspendedLanes = scheduleCallback$3(suspendedLanes, pingedLanes); root2.callbackPriority = currentTime; root2.callbackNode = suspendedLanes; return currentTime; } null !== pingedLanes && null !== pingedLanes && cancelCallback$1(pingedLanes); root2.callbackPriority = 2; root2.callbackNode = null; return 2; } function performWorkOnRootViaSchedulerTask(root2, didTimeout) { if (0 !== pendingEffectsStatus && 5 !== pendingEffectsStatus) return root2.callbackNode = null, root2.callbackPriority = 0, null; var originalCallbackNode = root2.callbackNode; if (flushPendingEffects() && root2.callbackNode !== originalCallbackNode) return null; var workInProgressRootRenderLanes$jscomp$0 = workInProgressRootRenderLanes; workInProgressRootRenderLanes$jscomp$0 = getNextLanes( root2, root2 === workInProgressRoot ? workInProgressRootRenderLanes$jscomp$0 : 0, null !== root2.cancelPendingCommit || -1 !== root2.timeoutHandle ); if (0 === workInProgressRootRenderLanes$jscomp$0) return null; performWorkOnRoot(root2, workInProgressRootRenderLanes$jscomp$0, didTimeout); scheduleTaskForRootDuringMicrotask(root2, now()); return null != root2.callbackNode && root2.callbackNode === originalCallbackNode ? performWorkOnRootViaSchedulerTask.bind(null, root2) : null; } function performSyncWorkOnRoot(root2, lanes) { if (flushPendingEffects()) return null; performWorkOnRoot(root2, lanes, true); } function scheduleImmediateRootScheduleTask() { scheduleMicrotask(function() { 0 !== (executionContext & 6) ? scheduleCallback$3( ImmediatePriority, processRootScheduleInImmediateTask ) : processRootScheduleInMicrotask(); }); } function requestTransitionLane() { if (0 === currentEventTransitionLane) { var actionScopeLane = currentEntangledLane; 0 === actionScopeLane && (actionScopeLane = nextTransitionUpdateLane, nextTransitionUpdateLane <<= 1, 0 === (nextTransitionUpdateLane & 261888) && (nextTransitionUpdateLane = 256)); currentEventTransitionLane = actionScopeLane; } return currentEventTransitionLane; } function coerceFormActionProp(actionProp) { return null == actionProp || "symbol" === typeof actionProp || "boolean" === typeof actionProp ? null : "function" === typeof actionProp ? actionProp : sanitizeURL("" + actionProp); } function createFormDataWithSubmitter(form, submitter) { var temp = submitter.ownerDocument.createElement("input"); temp.name = submitter.name; temp.value = submitter.value; form.id && temp.setAttribute("form", form.id); submitter.parentNode.insertBefore(temp, submitter); form = new FormData(form); temp.parentNode.removeChild(temp); return form; } function extractEvents$1(dispatchQueue, domEventName, maybeTargetInst, nativeEvent, nativeEventTarget) { if ("submit" === domEventName && maybeTargetInst && maybeTargetInst.stateNode === nativeEventTarget) { var action = coerceFormActionProp( (nativeEventTarget[internalPropsKey] || null).action ), submitter = nativeEvent.submitter; submitter && (domEventName = (domEventName = submitter[internalPropsKey] || null) ? coerceFormActionProp(domEventName.formAction) : submitter.getAttribute("formAction"), null !== domEventName && (action = domEventName, submitter = null)); var event = new SyntheticEvent( "action", "action", null, nativeEvent, nativeEventTarget ); dispatchQueue.push({ event, listeners: [ { instance: null, listener: function() { if (nativeEvent.defaultPrevented) { if (0 !== currentEventTransitionLane) { var formData = submitter ? createFormDataWithSubmitter(nativeEventTarget, submitter) : new FormData(nativeEventTarget); startHostTransition( maybeTargetInst, { pending: true, data: formData, method: nativeEventTarget.method, action }, null, formData ); } } else "function" === typeof action && (event.preventDefault(), formData = submitter ? createFormDataWithSubmitter(nativeEventTarget, submitter) : new FormData(nativeEventTarget), startHostTransition( maybeTargetInst, { pending: true, data: formData, method: nativeEventTarget.method, action }, action, formData )); }, currentTarget: nativeEventTarget } ] }); } } for (var i$jscomp$inline_1577 = 0; i$jscomp$inline_1577 < simpleEventPluginEvents.length; i$jscomp$inline_1577++) { var eventName$jscomp$inline_1578 = simpleEventPluginEvents[i$jscomp$inline_1577], domEventName$jscomp$inline_1579 = eventName$jscomp$inline_1578.toLowerCase(), capitalizedEvent$jscomp$inline_1580 = eventName$jscomp$inline_1578[0].toUpperCase() + eventName$jscomp$inline_1578.slice(1); registerSimpleEvent( domEventName$jscomp$inline_1579, "on" + capitalizedEvent$jscomp$inline_1580 ); } registerSimpleEvent(ANIMATION_END, "onAnimationEnd"); registerSimpleEvent(ANIMATION_ITERATION, "onAnimationIteration"); registerSimpleEvent(ANIMATION_START, "onAnimationStart"); registerSimpleEvent("dblclick", "onDoubleClick"); registerSimpleEvent("focusin", "onFocus"); registerSimpleEvent("focusout", "onBlur"); registerSimpleEvent(TRANSITION_RUN, "onTransitionRun"); registerSimpleEvent(TRANSITION_START, "onTransitionStart"); registerSimpleEvent(TRANSITION_CANCEL, "onTransitionCancel"); registerSimpleEvent(TRANSITION_END, "onTransitionEnd"); registerDirectEvent("onMouseEnter", ["mouseout", "mouseover"]); registerDirectEvent("onMouseLeave", ["mouseout", "mouseover"]); registerDirectEvent("onPointerEnter", ["pointerout", "pointerover"]); registerDirectEvent("onPointerLeave", ["pointerout", "pointerover"]); registerTwoPhaseEvent( "onChange", "change click focusin focusout input keydown keyup selectionchange".split(" ") ); registerTwoPhaseEvent( "onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split( " " ) ); registerTwoPhaseEvent("onBeforeInput", [ "compositionend", "keypress", "textInput", "paste" ]); registerTwoPhaseEvent( "onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" ") ); registerTwoPhaseEvent( "onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" ") ); registerTwoPhaseEvent( "onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" ") ); var mediaEventTypes = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split( " " ), nonDelegatedEvents = new Set( "beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(mediaEventTypes) ); function processDispatchQueue(dispatchQueue, eventSystemFlags) { eventSystemFlags = 0 !== (eventSystemFlags & 4); for (var i = 0; i < dispatchQueue.length; i++) { var _dispatchQueue$i = dispatchQueue[i], event = _dispatchQueue$i.event; _dispatchQueue$i = _dispatchQueue$i.listeners; a: { var previousInstance = void 0; if (eventSystemFlags) for (var i$jscomp$0 = _dispatchQueue$i.length - 1; 0 <= i$jscomp$0; i$jscomp$0--) { var _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0], instance = _dispatchListeners$i.instance, currentTarget = _dispatchListeners$i.currentTarget; _dispatchListeners$i = _dispatchListeners$i.listener; if (instance !== previousInstance && event.isPropagationStopped()) break a; previousInstance = _dispatchListeners$i; event.currentTarget = currentTarget; try { previousInstance(event); } catch (error) { reportGlobalError(error); } event.currentTarget = null; previousInstance = instance; } else for (i$jscomp$0 = 0; i$jscomp$0 < _dispatchQueue$i.length; i$jscomp$0++) { _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0]; instance = _dispatchListeners$i.instance; currentTarget = _dispatchListeners$i.currentTarget; _dispatchListeners$i = _dispatchListeners$i.listener; if (instance !== previousInstance && event.isPropagationStopped()) break a; previousInstance = _dispatchListeners$i; event.currentTarget = currentTarget; try { previousInstance(event); } catch (error) { reportGlobalError(error); } event.currentTarget = null; previousInstance = instance; } } } } function listenToNonDelegatedEvent(domEventName, targetElement) { var JSCompiler_inline_result = targetElement[internalEventHandlersKey]; void 0 === JSCompiler_inline_result && (JSCompiler_inline_result = targetElement[internalEventHandlersKey] = new Set()); var listenerSetKey = domEventName + "__bubble"; JSCompiler_inline_result.has(listenerSetKey) || (addTrappedEventListener(targetElement, domEventName, 2, false), JSCompiler_inline_result.add(listenerSetKey)); } function listenToNativeEvent(domEventName, isCapturePhaseListener, target) { var eventSystemFlags = 0; isCapturePhaseListener && (eventSystemFlags |= 4); addTrappedEventListener( target, domEventName, eventSystemFlags, isCapturePhaseListener ); } var listeningMarker = "_reactListening" + Math.random().toString(36).slice(2); function listenToAllSupportedEvents(rootContainerElement) { if (!rootContainerElement[listeningMarker]) { rootContainerElement[listeningMarker] = true; allNativeEvents.forEach(function(domEventName) { "selectionchange" !== domEventName && (nonDelegatedEvents.has(domEventName) || listenToNativeEvent(domEventName, false, rootContainerElement), listenToNativeEvent(domEventName, true, rootContainerElement)); }); var ownerDocument = 9 === rootContainerElement.nodeType ? rootContainerElement : rootContainerElement.ownerDocument; null === ownerDocument || ownerDocument[listeningMarker] || (ownerDocument[listeningMarker] = true, listenToNativeEvent("selectionchange", false, ownerDocument)); } } function addTrappedEventListener(targetContainer, domEventName, eventSystemFlags, isCapturePhaseListener) { switch (getEventPriority(domEventName)) { case 2: var listenerWrapper = dispatchDiscreteEvent; break; case 8: listenerWrapper = dispatchContinuousEvent; break; default: listenerWrapper = dispatchEvent; } eventSystemFlags = listenerWrapper.bind( null, domEventName, eventSystemFlags, targetContainer ); listenerWrapper = void 0; !passiveBrowserEventsSupported || "touchstart" !== domEventName && "touchmove" !== domEventName && "wheel" !== domEventName || (listenerWrapper = true); isCapturePhaseListener ? void 0 !== listenerWrapper ? targetContainer.addEventListener(domEventName, eventSystemFlags, { capture: true, passive: listenerWrapper }) : targetContainer.addEventListener(domEventName, eventSystemFlags, true) : void 0 !== listenerWrapper ? targetContainer.addEventListener(domEventName, eventSystemFlags, { passive: listenerWrapper }) : targetContainer.addEventListener(domEventName, eventSystemFlags, false); } function dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst$jscomp$0, targetContainer) { var ancestorInst = targetInst$jscomp$0; if (0 === (eventSystemFlags & 1) && 0 === (eventSystemFlags & 2) && null !== targetInst$jscomp$0) a: for (; ; ) { if (null === targetInst$jscomp$0) return; var nodeTag = targetInst$jscomp$0.tag; if (3 === nodeTag || 4 === nodeTag) { var container = targetInst$jscomp$0.stateNode.containerInfo; if (container === targetContainer) break; if (4 === nodeTag) for (nodeTag = targetInst$jscomp$0.return; null !== nodeTag; ) { var grandTag = nodeTag.tag; if ((3 === grandTag || 4 === grandTag) && nodeTag.stateNode.containerInfo === targetContainer) return; nodeTag = nodeTag.return; } for (; null !== container; ) { nodeTag = getClosestInstanceFromNode(container); if (null === nodeTag) return; grandTag = nodeTag.tag; if (5 === grandTag || 6 === grandTag || 26 === grandTag || 27 === grandTag) { targetInst$jscomp$0 = ancestorInst = nodeTag; continue a; } container = container.parentNode; } } targetInst$jscomp$0 = targetInst$jscomp$0.return; } batchedUpdates$1(function() { var targetInst = ancestorInst, nativeEventTarget = getEventTarget(nativeEvent), dispatchQueue = []; a: { var reactName = topLevelEventsToReactNames.get(domEventName); if (void 0 !== reactName) { var SyntheticEventCtor = SyntheticEvent, reactEventType = domEventName; switch (domEventName) { case "keypress": if (0 === getEventCharCode(nativeEvent)) break a; case "keydown": case "keyup": SyntheticEventCtor = SyntheticKeyboardEvent; break; case "focusin": reactEventType = "focus"; SyntheticEventCtor = SyntheticFocusEvent; break; case "focusout": reactEventType = "blur"; SyntheticEventCtor = SyntheticFocusEvent; break; case "beforeblur": case "afterblur": SyntheticEventCtor = SyntheticFocusEvent; break; case "click": if (2 === nativeEvent.button) break a; case "auxclick": case "dblclick": case "mousedown": case "mousemove": case "mouseup": case "mouseout": case "mouseover": case "contextmenu": SyntheticEventCtor = SyntheticMouseEvent; break; case "drag": case "dragend": case "dragenter": case "dragexit": case "dragleave": case "dragover": case "dragstart": case "drop": SyntheticEventCtor = SyntheticDragEvent; break; case "touchcancel": case "touchend": case "touchmove": case "touchstart": SyntheticEventCtor = SyntheticTouchEvent; break; case ANIMATION_END: case ANIMATION_ITERATION: case ANIMATION_START: SyntheticEventCtor = SyntheticAnimationEvent; break; case TRANSITION_END: SyntheticEventCtor = SyntheticTransitionEvent; break; case "scroll": case "scrollend": SyntheticEventCtor = SyntheticUIEvent; break; case "wheel": SyntheticEventCtor = SyntheticWheelEvent; break; case "copy": case "cut": case "paste": SyntheticEventCtor = SyntheticClipboardEvent; break; case "gotpointercapture": case "lostpointercapture": case "pointercancel": case "pointerdown": case "pointermove": case "pointerout": case "pointerover": case "pointerup": SyntheticEventCtor = SyntheticPointerEvent; break; case "toggle": case "beforetoggle": SyntheticEventCtor = SyntheticToggleEvent; } var inCapturePhase = 0 !== (eventSystemFlags & 4), accumulateTargetOnly = !inCapturePhase && ("scroll" === domEventName || "scrollend" === domEventName), reactEventName = inCapturePhase ? null !== reactName ? reactName + "Capture" : null : reactName; inCapturePhase = []; for (var instance = targetInst, lastHostComponent; null !== instance; ) { var _instance = instance; lastHostComponent = _instance.stateNode; _instance = _instance.tag; 5 !== _instance && 26 !== _instance && 27 !== _instance || null === lastHostComponent || null === reactEventName || (_instance = getListener(instance, reactEventName), null != _instance && inCapturePhase.push( createDispatchListener(instance, _instance, lastHostComponent) )); if (accumulateTargetOnly) break; instance = instance.return; } 0 < inCapturePhase.length && (reactName = new SyntheticEventCtor( reactName, reactEventType, null, nativeEvent, nativeEventTarget ), dispatchQueue.push({ event: reactName, listeners: inCapturePhase })); } } if (0 === (eventSystemFlags & 7)) { a: { reactName = "mouseover" === domEventName || "pointerover" === domEventName; SyntheticEventCtor = "mouseout" === domEventName || "pointerout" === domEventName; if (reactName && nativeEvent !== currentReplayingEvent && (reactEventType = nativeEvent.relatedTarget || nativeEvent.fromElement) && (getClosestInstanceFromNode(reactEventType) || reactEventType[internalContainerInstanceKey])) break a; if (SyntheticEventCtor || reactName) { reactName = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget : (reactName = nativeEventTarget.ownerDocument) ? reactName.defaultView || reactName.parentWindow : window; if (SyntheticEventCtor) { if (reactEventType = nativeEvent.relatedTarget || nativeEvent.toElement, SyntheticEventCtor = targetInst, reactEventType = reactEventType ? getClosestInstanceFromNode(reactEventType) : null, null !== reactEventType && (accumulateTargetOnly = getNearestMountedFiber(reactEventType), inCapturePhase = reactEventType.tag, reactEventType !== accumulateTargetOnly || 5 !== inCapturePhase && 27 !== inCapturePhase && 6 !== inCapturePhase)) reactEventType = null; } else SyntheticEventCtor = null, reactEventType = targetInst; if (SyntheticEventCtor !== reactEventType) { inCapturePhase = SyntheticMouseEvent; _instance = "onMouseLeave"; reactEventName = "onMouseEnter"; instance = "mouse"; if ("pointerout" === domEventName || "pointerover" === domEventName) inCapturePhase = SyntheticPointerEvent, _instance = "onPointerLeave", reactEventName = "onPointerEnter", instance = "pointer"; accumulateTargetOnly = null == SyntheticEventCtor ? reactName : getNodeFromInstance(SyntheticEventCtor); lastHostComponent = null == reactEventType ? reactName : getNodeFromInstance(reactEventType); reactName = new inCapturePhase( _instance, instance + "leave", SyntheticEventCtor, nativeEvent, nativeEventTarget ); reactName.target = accumulateTargetOnly; reactName.relatedTarget = lastHostComponent; _instance = null; getClosestInstanceFromNode(nativeEventTarget) === targetInst && (inCapturePhase = new inCapturePhase( reactEventName, instance + "enter", reactEventType, nativeEvent, nativeEventTarget ), inCapturePhase.target = lastHostComponent, inCapturePhase.relatedTarget = accumulateTargetOnly, _instance = inCapturePhase); accumulateTargetOnly = _instance; if (SyntheticEventCtor && reactEventType) b: { inCapturePhase = getParent; reactEventName = SyntheticEventCtor; instance = reactEventType; lastHostComponent = 0; for (_instance = reactEventName; _instance; _instance = inCapturePhase(_instance)) lastHostComponent++; _instance = 0; for (var tempB = instance; tempB; tempB = inCapturePhase(tempB)) _instance++; for (; 0 < lastHostComponent - _instance; ) reactEventName = inCapturePhase(reactEventName), lastHostComponent--; for (; 0 < _instance - lastHostComponent; ) instance = inCapturePhase(instance), _instance--; for (; lastHostComponent--; ) { if (reactEventName === instance || null !== instance && reactEventName === instance.alternate) { inCapturePhase = reactEventName; break b; } reactEventName = inCapturePhase(reactEventName); instance = inCapturePhase(instance); } inCapturePhase = null; } else inCapturePhase = null; null !== SyntheticEventCtor && accumulateEnterLeaveListenersForEvent( dispatchQueue, reactName, SyntheticEventCtor, inCapturePhase, false ); null !== reactEventType && null !== accumulateTargetOnly && accumulateEnterLeaveListenersForEvent( dispatchQueue, accumulateTargetOnly, reactEventType, inCapturePhase, true ); } } } a: { reactName = targetInst ? getNodeFromInstance(targetInst) : window; SyntheticEventCtor = reactName.nodeName && reactName.nodeName.toLowerCase(); if ("select" === SyntheticEventCtor || "input" === SyntheticEventCtor && "file" === reactName.type) var getTargetInstFunc = getTargetInstForChangeEvent; else if (isTextInputElement(reactName)) if (isInputEventSupported) getTargetInstFunc = getTargetInstForInputOrChangeEvent; else { getTargetInstFunc = getTargetInstForInputEventPolyfill; var handleEventFunc = handleEventsForInputEventPolyfill; } else SyntheticEventCtor = reactName.nodeName, !SyntheticEventCtor || "input" !== SyntheticEventCtor.toLowerCase() || "checkbox" !== reactName.type && "radio" !== reactName.type ? targetInst && isCustomElement(targetInst.elementType) && (getTargetInstFunc = getTargetInstForChangeEvent) : getTargetInstFunc = getTargetInstForClickEvent; if (getTargetInstFunc && (getTargetInstFunc = getTargetInstFunc(domEventName, targetInst))) { createAndAccumulateChangeEvent( dispatchQueue, getTargetInstFunc, nativeEvent, nativeEventTarget ); break a; } handleEventFunc && handleEventFunc(domEventName, reactName, targetInst); "focusout" === domEventName && targetInst && "number" === reactName.type && null != targetInst.memoizedProps.value && setDefaultValue(reactName, "number", reactName.value); } handleEventFunc = targetInst ? getNodeFromInstance(targetInst) : window; switch (domEventName) { case "focusin": if (isTextInputElement(handleEventFunc) || "true" === handleEventFunc.contentEditable) activeElement = handleEventFunc, activeElementInst = targetInst, lastSelection = null; break; case "focusout": lastSelection = activeElementInst = activeElement = null; break; case "mousedown": mouseDown = true; break; case "contextmenu": case "mouseup": case "dragend": mouseDown = false; constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget); break; case "selectionchange": if (skipSelectionChangeEvent) break; case "keydown": case "keyup": constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget); } var fallbackData; if (canUseCompositionEvent) b: { switch (domEventName) { case "compositionstart": var eventType = "onCompositionStart"; break b; case "compositionend": eventType = "onCompositionEnd"; break b; case "compositionupdate": eventType = "onCompositionUpdate"; break b; } eventType = void 0; } else isComposing ? isFallbackCompositionEnd(domEventName, nativeEvent) && (eventType = "onCompositionEnd") : "keydown" === domEventName && 229 === nativeEvent.keyCode && (eventType = "onCompositionStart"); eventType && (useFallbackCompositionData && "ko" !== nativeEvent.locale && (isComposing || "onCompositionStart" !== eventType ? "onCompositionEnd" === eventType && isComposing && (fallbackData = getData()) : (root = nativeEventTarget, startText = "value" in root ? root.value : root.textContent, isComposing = true)), handleEventFunc = accumulateTwoPhaseListeners(targetInst, eventType), 0 < handleEventFunc.length && (eventType = new SyntheticCompositionEvent( eventType, domEventName, null, nativeEvent, nativeEventTarget ), dispatchQueue.push({ event: eventType, listeners: handleEventFunc }), fallbackData ? eventType.data = fallbackData : (fallbackData = getDataFromCustomEvent(nativeEvent), null !== fallbackData && (eventType.data = fallbackData)))); if (fallbackData = canUseTextInputEvent ? getNativeBeforeInputChars(domEventName, nativeEvent) : getFallbackBeforeInputChars(domEventName, nativeEvent)) eventType = accumulateTwoPhaseListeners(targetInst, "onBeforeInput"), 0 < eventType.length && (handleEventFunc = new SyntheticCompositionEvent( "onBeforeInput", "beforeinput", null, nativeEvent, nativeEventTarget ), dispatchQueue.push({ event: handleEventFunc, listeners: eventType }), handleEventFunc.data = fallbackData); extractEvents$1( dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget ); } processDispatchQueue(dispatchQueue, eventSystemFlags); }); } function createDispatchListener(instance, listener, currentTarget) { return { instance, listener, currentTarget }; } function accumulateTwoPhaseListeners(targetFiber, reactName) { for (var captureName = reactName + "Capture", listeners = []; null !== targetFiber; ) { var _instance2 = targetFiber, stateNode = _instance2.stateNode; _instance2 = _instance2.tag; 5 !== _instance2 && 26 !== _instance2 && 27 !== _instance2 || null === stateNode || (_instance2 = getListener(targetFiber, captureName), null != _instance2 && listeners.unshift( createDispatchListener(targetFiber, _instance2, stateNode) ), _instance2 = getListener(targetFiber, reactName), null != _instance2 && listeners.push( createDispatchListener(targetFiber, _instance2, stateNode) )); if (3 === targetFiber.tag) return listeners; targetFiber = targetFiber.return; } return []; } function getParent(inst) { if (null === inst) return null; do inst = inst.return; while (inst && 5 !== inst.tag && 27 !== inst.tag); return inst ? inst : null; } function accumulateEnterLeaveListenersForEvent(dispatchQueue, event, target, common, inCapturePhase) { for (var registrationName = event._reactName, listeners = []; null !== target && target !== common; ) { var _instance3 = target, alternate = _instance3.alternate, stateNode = _instance3.stateNode; _instance3 = _instance3.tag; if (null !== alternate && alternate === common) break; 5 !== _instance3 && 26 !== _instance3 && 27 !== _instance3 || null === stateNode || (alternate = stateNode, inCapturePhase ? (stateNode = getListener(target, registrationName), null != stateNode && listeners.unshift( createDispatchListener(target, stateNode, alternate) )) : inCapturePhase || (stateNode = getListener(target, registrationName), null != stateNode && listeners.push( createDispatchListener(target, stateNode, alternate) ))); target = target.return; } 0 !== listeners.length && dispatchQueue.push({ event, listeners }); } var NORMALIZE_NEWLINES_REGEX = /\r\n?/g, NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g; function normalizeMarkupForTextOrAttribute(markup) { return ("string" === typeof markup ? markup : "" + markup).replace(NORMALIZE_NEWLINES_REGEX, "\n").replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, ""); } function checkForUnmatchedText(serverText, clientText) { clientText = normalizeMarkupForTextOrAttribute(clientText); return normalizeMarkupForTextOrAttribute(serverText) === clientText ? true : false; } function setProp(domElement, tag, key, value, props, prevValue) { switch (key) { case "children": "string" === typeof value ? "body" === tag || "textarea" === tag && "" === value || setTextContent(domElement, value) : ("number" === typeof value || "bigint" === typeof value) && "body" !== tag && setTextContent(domElement, "" + value); break; case "className": setValueForKnownAttribute(domElement, "class", value); break; case "tabIndex": setValueForKnownAttribute(domElement, "tabindex", value); break; case "dir": case "role": case "viewBox": case "width": case "height": setValueForKnownAttribute(domElement, key, value); break; case "style": setValueForStyles(domElement, value, prevValue); break; case "data": if ("object" !== tag) { setValueForKnownAttribute(domElement, "data", value); break; } case "src": case "href": if ("" === value && ("a" !== tag || "href" !== key)) { domElement.removeAttribute(key); break; } if (null == value || "function" === typeof value || "symbol" === typeof value || "boolean" === typeof value) { domElement.removeAttribute(key); break; } value = sanitizeURL("" + value); domElement.setAttribute(key, value); break; case "action": case "formAction": if ("function" === typeof value) { domElement.setAttribute( key, "javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')" ); break; } else "function" === typeof prevValue && ("formAction" === key ? ("input" !== tag && setProp(domElement, tag, "name", props.name, props, null), setProp( domElement, tag, "formEncType", props.formEncType, props, null ), setProp( domElement, tag, "formMethod", props.formMethod, props, null ), setProp( domElement, tag, "formTarget", props.formTarget, props, null )) : (setProp(domElement, tag, "encType", props.encType, props, null), setProp(domElement, tag, "method", props.method, props, null), setProp(domElement, tag, "target", props.target, props, null))); if (null == value || "symbol" === typeof value || "boolean" === typeof value) { domElement.removeAttribute(key); break; } value = sanitizeURL("" + value); domElement.setAttribute(key, value); break; case "onClick": null != value && (domElement.onclick = noop$1); break; case "onScroll": null != value && listenToNonDelegatedEvent("scroll", domElement); break; case "onScrollEnd": null != value && listenToNonDelegatedEvent("scrollend", domElement); break; case "dangerouslySetInnerHTML": if (null != value) { if ("object" !== typeof value || !("__html" in value)) throw Error(formatProdErrorMessage(61)); key = value.__html; if (null != key) { if (null != props.children) throw Error(formatProdErrorMessage(60)); domElement.innerHTML = key; } } break; case "multiple": domElement.multiple = value && "function" !== typeof value && "symbol" !== typeof value; break; case "muted": domElement.muted = value && "function" !== typeof value && "symbol" !== typeof value; break; case "suppressContentEditableWarning": case "suppressHydrationWarning": case "defaultValue": case "defaultChecked": case "innerHTML": case "ref": break; case "autoFocus": break; case "xlinkHref": if (null == value || "function" === typeof value || "boolean" === typeof value || "symbol" === typeof value) { domElement.removeAttribute("xlink:href"); break; } key = sanitizeURL("" + value); domElement.setAttributeNS( "http://www.w3.org/1999/xlink", "xlink:href", key ); break; case "contentEditable": case "spellCheck": case "draggable": case "value": case "autoReverse": case "externalResourcesRequired": case "focusable": case "preserveAlpha": null != value && "function" !== typeof value && "symbol" !== typeof value ? domElement.setAttribute(key, "" + value) : domElement.removeAttribute(key); break; case "inert": case "allowFullScreen": case "async": case "autoPlay": case "controls": case "default": case "defer": case "disabled": case "disablePictureInPicture": case "disableRemotePlayback": case "formNoValidate": case "hidden": case "loop": case "noModule": case "noValidate": case "open": case "playsInline": case "readOnly": case "required": case "reversed": case "scoped": case "seamless": case "itemScope": value && "function" !== typeof value && "symbol" !== typeof value ? domElement.setAttribute(key, "") : domElement.removeAttribute(key); break; case "capture": case "download": true === value ? domElement.setAttribute(key, "") : false !== value && null != value && "function" !== typeof value && "symbol" !== typeof value ? domElement.setAttribute(key, value) : domElement.removeAttribute(key); break; case "cols": case "rows": case "size": case "span": null != value && "function" !== typeof value && "symbol" !== typeof value && !isNaN(value) && 1 <= value ? domElement.setAttribute(key, value) : domElement.removeAttribute(key); break; case "rowSpan": case "start": null == value || "function" === typeof value || "symbol" === typeof value || isNaN(value) ? domElement.removeAttribute(key) : domElement.setAttribute(key, value); break; case "popover": listenToNonDelegatedEvent("beforetoggle", domElement); listenToNonDelegatedEvent("toggle", domElement); setValueForAttribute(domElement, "popover", value); break; case "xlinkActuate": setValueForNamespacedAttribute( domElement, "http://www.w3.org/1999/xlink", "xlink:actuate", value ); break; case "xlinkArcrole": setValueForNamespacedAttribute( domElement, "http://www.w3.org/1999/xlink", "xlink:arcrole", value ); break; case "xlinkRole": setValueForNamespacedAttribute( domElement, "http://www.w3.org/1999/xlink", "xlink:role", value ); break; case "xlinkShow": setValueForNamespacedAttribute( domElement, "http://www.w3.org/1999/xlink", "xlink:show", value ); break; case "xlinkTitle": setValueForNamespacedAttribute( domElement, "http://www.w3.org/1999/xlink", "xlink:title", value ); break; case "xlinkType": setValueForNamespacedAttribute( domElement, "http://www.w3.org/1999/xlink", "xlink:type", value ); break; case "xmlBase": setValueForNamespacedAttribute( domElement, "http://www.w3.org/XML/1998/namespace", "xml:base", value ); break; case "xmlLang": setValueForNamespacedAttribute( domElement, "http://www.w3.org/XML/1998/namespace", "xml:lang", value ); break; case "xmlSpace": setValueForNamespacedAttribute( domElement, "http://www.w3.org/XML/1998/namespace", "xml:space", value ); break; case "is": setValueForAttribute(domElement, "is", value); break; case "innerText": case "textContent": break; default: if (!(2 < key.length) || "o" !== key[0] && "O" !== key[0] || "n" !== key[1] && "N" !== key[1]) key = aliases.get(key) || key, setValueForAttribute(domElement, key, value); } } function setPropOnCustomElement(domElement, tag, key, value, props, prevValue) { switch (key) { case "style": setValueForStyles(domElement, value, prevValue); break; case "dangerouslySetInnerHTML": if (null != value) { if ("object" !== typeof value || !("__html" in value)) throw Error(formatProdErrorMessage(61)); key = value.__html; if (null != key) { if (null != props.children) throw Error(formatProdErrorMessage(60)); domElement.innerHTML = key; } } break; case "children": "string" === typeof value ? setTextContent(domElement, value) : ("number" === typeof value || "bigint" === typeof value) && setTextContent(domElement, "" + value); break; case "onScroll": null != value && listenToNonDelegatedEvent("scroll", domElement); break; case "onScrollEnd": null != value && listenToNonDelegatedEvent("scrollend", domElement); break; case "onClick": null != value && (domElement.onclick = noop$1); break; case "suppressContentEditableWarning": case "suppressHydrationWarning": case "innerHTML": case "ref": break; case "innerText": case "textContent": break; default: if (!registrationNameDependencies.hasOwnProperty(key)) a: { if ("o" === key[0] && "n" === key[1] && (props = key.endsWith("Capture"), tag = key.slice(2, props ? key.length - 7 : void 0), prevValue = domElement[internalPropsKey] || null, prevValue = null != prevValue ? prevValue[key] : null, "function" === typeof prevValue && domElement.removeEventListener(tag, prevValue, props), "function" === typeof value)) { "function" !== typeof prevValue && null !== prevValue && (key in domElement ? domElement[key] = null : domElement.hasAttribute(key) && domElement.removeAttribute(key)); domElement.addEventListener(tag, value, props); break a; } key in domElement ? domElement[key] = value : true === value ? domElement.setAttribute(key, "") : setValueForAttribute(domElement, key, value); } } } function setInitialProperties(domElement, tag, props) { switch (tag) { case "div": case "span": case "svg": case "path": case "a": case "g": case "p": case "li": break; case "img": listenToNonDelegatedEvent("error", domElement); listenToNonDelegatedEvent("load", domElement); var hasSrc = false, hasSrcSet = false, propKey; for (propKey in props) if (props.hasOwnProperty(propKey)) { var propValue = props[propKey]; if (null != propValue) switch (propKey) { case "src": hasSrc = true; break; case "srcSet": hasSrcSet = true; break; case "children": case "dangerouslySetInnerHTML": throw Error(formatProdErrorMessage(137, tag)); default: setProp(domElement, tag, propKey, propValue, props, null); } } hasSrcSet && setProp(domElement, tag, "srcSet", props.srcSet, props, null); hasSrc && setProp(domElement, tag, "src", props.src, props, null); return; case "input": listenToNonDelegatedEvent("invalid", domElement); var defaultValue = propKey = propValue = hasSrcSet = null, checked = null, defaultChecked = null; for (hasSrc in props) if (props.hasOwnProperty(hasSrc)) { var propValue$184 = props[hasSrc]; if (null != propValue$184) switch (hasSrc) { case "name": hasSrcSet = propValue$184; break; case "type": propValue = propValue$184; break; case "checked": checked = propValue$184; break; case "defaultChecked": defaultChecked = propValue$184; break; case "value": propKey = propValue$184; break; case "defaultValue": defaultValue = propValue$184; break; case "children": case "dangerouslySetInnerHTML": if (null != propValue$184) throw Error(formatProdErrorMessage(137, tag)); break; default: setProp(domElement, tag, hasSrc, propValue$184, props, null); } } initInput( domElement, propKey, defaultValue, checked, defaultChecked, propValue, hasSrcSet, false ); return; case "select": listenToNonDelegatedEvent("invalid", domElement); hasSrc = propValue = propKey = null; for (hasSrcSet in props) if (props.hasOwnProperty(hasSrcSet) && (defaultValue = props[hasSrcSet], null != defaultValue)) switch (hasSrcSet) { case "value": propKey = defaultValue; break; case "defaultValue": propValue = defaultValue; break; case "multiple": hasSrc = defaultValue; default: setProp(domElement, tag, hasSrcSet, defaultValue, props, null); } tag = propKey; props = propValue; domElement.multiple = !!hasSrc; null != tag ? updateOptions(domElement, !!hasSrc, tag, false) : null != props && updateOptions(domElement, !!hasSrc, props, true); return; case "textarea": listenToNonDelegatedEvent("invalid", domElement); propKey = hasSrcSet = hasSrc = null; for (propValue in props) if (props.hasOwnProperty(propValue) && (defaultValue = props[propValue], null != defaultValue)) switch (propValue) { case "value": hasSrc = defaultValue; break; case "defaultValue": hasSrcSet = defaultValue; break; case "children": propKey = defaultValue; break; case "dangerouslySetInnerHTML": if (null != defaultValue) throw Error(formatProdErrorMessage(91)); break; default: setProp(domElement, tag, propValue, defaultValue, props, null); } initTextarea(domElement, hasSrc, hasSrcSet, propKey); return; case "option": for (checked in props) if (props.hasOwnProperty(checked) && (hasSrc = props[checked], null != hasSrc)) switch (checked) { case "selected": domElement.selected = hasSrc && "function" !== typeof hasSrc && "symbol" !== typeof hasSrc; break; default: setProp(domElement, tag, checked, hasSrc, props, null); } return; case "dialog": listenToNonDelegatedEvent("beforetoggle", domElement); listenToNonDelegatedEvent("toggle", domElement); listenToNonDelegatedEvent("cancel", domElement); listenToNonDelegatedEvent("close", domElement); break; case "iframe": case "object": listenToNonDelegatedEvent("load", domElement); break; case "video": case "audio": for (hasSrc = 0; hasSrc < mediaEventTypes.length; hasSrc++) listenToNonDelegatedEvent(mediaEventTypes[hasSrc], domElement); break; case "image": listenToNonDelegatedEvent("error", domElement); listenToNonDelegatedEvent("load", domElement); break; case "details": listenToNonDelegatedEvent("toggle", domElement); break; case "embed": case "source": case "link": listenToNonDelegatedEvent("error", domElement), listenToNonDelegatedEvent("load", domElement); case "area": case "base": case "br": case "col": case "hr": case "keygen": case "meta": case "param": case "track": case "wbr": case "menuitem": for (defaultChecked in props) if (props.hasOwnProperty(defaultChecked) && (hasSrc = props[defaultChecked], null != hasSrc)) switch (defaultChecked) { case "children": case "dangerouslySetInnerHTML": throw Error(formatProdErrorMessage(137, tag)); default: setProp(domElement, tag, defaultChecked, hasSrc, props, null); } return; default: if (isCustomElement(tag)) { for (propValue$184 in props) props.hasOwnProperty(propValue$184) && (hasSrc = props[propValue$184], void 0 !== hasSrc && setPropOnCustomElement( domElement, tag, propValue$184, hasSrc, props, void 0 )); return; } } for (defaultValue in props) props.hasOwnProperty(defaultValue) && (hasSrc = props[defaultValue], null != hasSrc && setProp(domElement, tag, defaultValue, hasSrc, props, null)); } function updateProperties(domElement, tag, lastProps, nextProps) { switch (tag) { case "div": case "span": case "svg": case "path": case "a": case "g": case "p": case "li": break; case "input": var name = null, type = null, value = null, defaultValue = null, lastDefaultValue = null, checked = null, defaultChecked = null; for (propKey in lastProps) { var lastProp = lastProps[propKey]; if (lastProps.hasOwnProperty(propKey) && null != lastProp) switch (propKey) { case "checked": break; case "value": break; case "defaultValue": lastDefaultValue = lastProp; default: nextProps.hasOwnProperty(propKey) || setProp(domElement, tag, propKey, null, nextProps, lastProp); } } for (var propKey$201 in nextProps) { var propKey = nextProps[propKey$201]; lastProp = lastProps[propKey$201]; if (nextProps.hasOwnProperty(propKey$201) && (null != propKey || null != lastProp)) switch (propKey$201) { case "type": type = propKey; break; case "name": name = propKey; break; case "checked": checked = propKey; break; case "defaultChecked": defaultChecked = propKey; break; case "value": value = propKey; break; case "defaultValue": defaultValue = propKey; break; case "children": case "dangerouslySetInnerHTML": if (null != propKey) throw Error(formatProdErrorMessage(137, tag)); break; default: propKey !== lastProp && setProp( domElement, tag, propKey$201, propKey, nextProps, lastProp ); } } updateInput( domElement, value, defaultValue, lastDefaultValue, checked, defaultChecked, type, name ); return; case "select": propKey = value = defaultValue = propKey$201 = null; for (type in lastProps) if (lastDefaultValue = lastProps[type], lastProps.hasOwnProperty(type) && null != lastDefaultValue) switch (type) { case "value": break; case "multiple": propKey = lastDefaultValue; default: nextProps.hasOwnProperty(type) || setProp( domElement, tag, type, null, nextProps, lastDefaultValue ); } for (name in nextProps) if (type = nextProps[name], lastDefaultValue = lastProps[name], nextProps.hasOwnProperty(name) && (null != type || null != lastDefaultValue)) switch (name) { case "value": propKey$201 = type; break; case "defaultValue": defaultValue = type; break; case "multiple": value = type; default: type !== lastDefaultValue && setProp( domElement, tag, name, type, nextProps, lastDefaultValue ); } tag = defaultValue; lastProps = value; nextProps = propKey; null != propKey$201 ? updateOptions(domElement, !!lastProps, propKey$201, false) : !!nextProps !== !!lastProps && (null != tag ? updateOptions(domElement, !!lastProps, tag, true) : updateOptions(domElement, !!lastProps, lastProps ? [] : "", false)); return; case "textarea": propKey = propKey$201 = null; for (defaultValue in lastProps) if (name = lastProps[defaultValue], lastProps.hasOwnProperty(defaultValue) && null != name && !nextProps.hasOwnProperty(defaultValue)) switch (defaultValue) { case "value": break; case "children": break; default: setProp(domElement, tag, defaultValue, null, nextProps, name); } for (value in nextProps) if (name = nextProps[value], type = lastProps[value], nextProps.hasOwnProperty(value) && (null != name || null != type)) switch (value) { case "value": propKey$201 = name; break; case "defaultValue": propKey = name; break; case "children": break; case "dangerouslySetInnerHTML": if (null != name) throw Error(formatProdErrorMessage(91)); break; default: name !== type && setProp(domElement, tag, value, name, nextProps, type); } updateTextarea(domElement, propKey$201, propKey); return; case "option": for (var propKey$217 in lastProps) if (propKey$201 = lastProps[propKey$217], lastProps.hasOwnProperty(propKey$217) && null != propKey$201 && !nextProps.hasOwnProperty(propKey$217)) switch (propKey$217) { case "selected": domElement.selected = false; break; default: setProp( domElement, tag, propKey$217, null, nextProps, propKey$201 ); } for (lastDefaultValue in nextProps) if (propKey$201 = nextProps[lastDefaultValue], propKey = lastProps[lastDefaultValue], nextProps.hasOwnProperty(lastDefaultValue) && propKey$201 !== propKey && (null != propKey$201 || null != propKey)) switch (lastDefaultValue) { case "selected": domElement.selected = propKey$201 && "function" !== typeof propKey$201 && "symbol" !== typeof propKey$201; break; default: setProp( domElement, tag, lastDefaultValue, propKey$201, nextProps, propKey ); } return; case "img": case "link": case "area": case "base": case "br": case "col": case "embed": case "hr": case "keygen": case "meta": case "param": case "source": case "track": case "wbr": case "menuitem": for (var propKey$222 in lastProps) propKey$201 = lastProps[propKey$222], lastProps.hasOwnProperty(propKey$222) && null != propKey$201 && !nextProps.hasOwnProperty(propKey$222) && setProp(domElement, tag, propKey$222, null, nextProps, propKey$201); for (checked in nextProps) if (propKey$201 = nextProps[checked], propKey = lastProps[checked], nextProps.hasOwnProperty(checked) && propKey$201 !== propKey && (null != propKey$201 || null != propKey)) switch (checked) { case "children": case "dangerouslySetInnerHTML": if (null != propKey$201) throw Error(formatProdErrorMessage(137, tag)); break; default: setProp( domElement, tag, checked, propKey$201, nextProps, propKey ); } return; default: if (isCustomElement(tag)) { for (var propKey$227 in lastProps) propKey$201 = lastProps[propKey$227], lastProps.hasOwnProperty(propKey$227) && void 0 !== propKey$201 && !nextProps.hasOwnProperty(propKey$227) && setPropOnCustomElement( domElement, tag, propKey$227, void 0, nextProps, propKey$201 ); for (defaultChecked in nextProps) propKey$201 = nextProps[defaultChecked], propKey = lastProps[defaultChecked], !nextProps.hasOwnProperty(defaultChecked) || propKey$201 === propKey || void 0 === propKey$201 && void 0 === propKey || setPropOnCustomElement( domElement, tag, defaultChecked, propKey$201, nextProps, propKey ); return; } } for (var propKey$232 in lastProps) propKey$201 = lastProps[propKey$232], lastProps.hasOwnProperty(propKey$232) && null != propKey$201 && !nextProps.hasOwnProperty(propKey$232) && setProp(domElement, tag, propKey$232, null, nextProps, propKey$201); for (lastProp in nextProps) propKey$201 = nextProps[lastProp], propKey = lastProps[lastProp], !nextProps.hasOwnProperty(lastProp) || propKey$201 === propKey || null == propKey$201 && null == propKey || setProp(domElement, tag, lastProp, propKey$201, nextProps, propKey); } function isLikelyStaticResource(initiatorType) { switch (initiatorType) { case "css": case "script": case "font": case "img": case "image": case "input": case "link": return true; default: return false; } } function estimateBandwidth() { if ("function" === typeof performance.getEntriesByType) { for (var count = 0, bits = 0, resourceEntries = performance.getEntriesByType("resource"), i = 0; i < resourceEntries.length; i++) { var entry = resourceEntries[i], transferSize = entry.transferSize, initiatorType = entry.initiatorType, duration = entry.duration; if (transferSize && duration && isLikelyStaticResource(initiatorType)) { initiatorType = 0; duration = entry.responseEnd; for (i += 1; i < resourceEntries.length; i++) { var overlapEntry = resourceEntries[i], overlapStartTime = overlapEntry.startTime; if (overlapStartTime > duration) break; var overlapTransferSize = overlapEntry.transferSize, overlapInitiatorType = overlapEntry.initiatorType; overlapTransferSize && isLikelyStaticResource(overlapInitiatorType) && (overlapEntry = overlapEntry.responseEnd, initiatorType += overlapTransferSize * (overlapEntry < duration ? 1 : (duration - overlapStartTime) / (overlapEntry - overlapStartTime))); } --i; bits += 8 * (transferSize + initiatorType) / (entry.duration / 1e3); count++; if (10 < count) break; } } if (0 < count) return bits / count / 1e6; } return navigator.connection && (count = navigator.connection.downlink, "number" === typeof count) ? count : 5; } var eventsEnabled = null, selectionInformation = null; function getOwnerDocumentFromRootContainer(rootContainerElement) { return 9 === rootContainerElement.nodeType ? rootContainerElement : rootContainerElement.ownerDocument; } function getOwnHostContext(namespaceURI) { switch (namespaceURI) { case "http://www.w3.org/2000/svg": return 1; case "http://www.w3.org/1998/Math/MathML": return 2; default: return 0; } } function getChildHostContextProd(parentNamespace, type) { if (0 === parentNamespace) switch (type) { case "svg": return 1; case "math": return 2; default: return 0; } return 1 === parentNamespace && "foreignObject" === type ? 0 : parentNamespace; } function shouldSetTextContent(type, props) { return "textarea" === type || "noscript" === type || "string" === typeof props.children || "number" === typeof props.children || "bigint" === typeof props.children || "object" === typeof props.dangerouslySetInnerHTML && null !== props.dangerouslySetInnerHTML && null != props.dangerouslySetInnerHTML.__html; } var currentPopstateTransitionEvent = null; function shouldAttemptEagerTransition() { var event = window.event; if (event && "popstate" === event.type) { if (event === currentPopstateTransitionEvent) return false; currentPopstateTransitionEvent = event; return true; } currentPopstateTransitionEvent = null; return false; } var scheduleTimeout = "function" === typeof setTimeout ? setTimeout : void 0, cancelTimeout = "function" === typeof clearTimeout ? clearTimeout : void 0, localPromise = "function" === typeof Promise ? Promise : void 0, scheduleMicrotask = "function" === typeof queueMicrotask ? queueMicrotask : "undefined" !== typeof localPromise ? function(callback) { return localPromise.resolve(null).then(callback).catch(handleErrorInNextTick); } : scheduleTimeout; function handleErrorInNextTick(error) { setTimeout(function() { throw error; }); } function isSingletonScope(type) { return "head" === type; } function clearHydrationBoundary(parentInstance, hydrationInstance) { var node = hydrationInstance, depth = 0; do { var nextNode = node.nextSibling; parentInstance.removeChild(node); if (nextNode && 8 === nextNode.nodeType) if (node = nextNode.data, "/$" === node || "/&" === node) { if (0 === depth) { parentInstance.removeChild(nextNode); retryIfBlockedOn(hydrationInstance); return; } depth--; } else if ("$" === node || "$?" === node || "$~" === node || "$!" === node || "&" === node) depth++; else if ("html" === node) releaseSingletonInstance(parentInstance.ownerDocument.documentElement); else if ("head" === node) { node = parentInstance.ownerDocument.head; releaseSingletonInstance(node); for (var node$jscomp$0 = node.firstChild; node$jscomp$0; ) { var nextNode$jscomp$0 = node$jscomp$0.nextSibling, nodeName = node$jscomp$0.nodeName; node$jscomp$0[internalHoistableMarker] || "SCRIPT" === nodeName || "STYLE" === nodeName || "LINK" === nodeName && "stylesheet" === node$jscomp$0.rel.toLowerCase() || node.removeChild(node$jscomp$0); node$jscomp$0 = nextNode$jscomp$0; } } else "body" === node && releaseSingletonInstance(parentInstance.ownerDocument.body); node = nextNode; } while (node); retryIfBlockedOn(hydrationInstance); } function hideOrUnhideDehydratedBoundary(suspenseInstance, isHidden) { var node = suspenseInstance; suspenseInstance = 0; do { var nextNode = node.nextSibling; 1 === node.nodeType ? isHidden ? (node._stashedDisplay = node.style.display, node.style.display = "none") : (node.style.display = node._stashedDisplay || "", "" === node.getAttribute("style") && node.removeAttribute("style")) : 3 === node.nodeType && (isHidden ? (node._stashedText = node.nodeValue, node.nodeValue = "") : node.nodeValue = node._stashedText || ""); if (nextNode && 8 === nextNode.nodeType) if (node = nextNode.data, "/$" === node) if (0 === suspenseInstance) break; else suspenseInstance--; else "$" !== node && "$?" !== node && "$~" !== node && "$!" !== node || suspenseInstance++; node = nextNode; } while (node); } function clearContainerSparingly(container) { var nextNode = container.firstChild; nextNode && 10 === nextNode.nodeType && (nextNode = nextNode.nextSibling); for (; nextNode; ) { var node = nextNode; nextNode = nextNode.nextSibling; switch (node.nodeName) { case "HTML": case "HEAD": case "BODY": clearContainerSparingly(node); detachDeletedInstance(node); continue; case "SCRIPT": case "STYLE": continue; case "LINK": if ("stylesheet" === node.rel.toLowerCase()) continue; } container.removeChild(node); } } function canHydrateInstance(instance, type, props, inRootOrSingleton) { for (; 1 === instance.nodeType; ) { var anyProps = props; if (instance.nodeName.toLowerCase() !== type.toLowerCase()) { if (!inRootOrSingleton && ("INPUT" !== instance.nodeName || "hidden" !== instance.type)) break; } else if (!inRootOrSingleton) if ("input" === type && "hidden" === instance.type) { var name = null == anyProps.name ? null : "" + anyProps.name; if ("hidden" === anyProps.type && instance.getAttribute("name") === name) return instance; } else return instance; else if (!instance[internalHoistableMarker]) switch (type) { case "meta": if (!instance.hasAttribute("itemprop")) break; return instance; case "link": name = instance.getAttribute("rel"); if ("stylesheet" === name && instance.hasAttribute("data-precedence")) break; else if (name !== anyProps.rel || instance.getAttribute("href") !== (null == anyProps.href || "" === anyProps.href ? null : anyProps.href) || instance.getAttribute("crossorigin") !== (null == anyProps.crossOrigin ? null : anyProps.crossOrigin) || instance.getAttribute("title") !== (null == anyProps.title ? null : anyProps.title)) break; return instance; case "style": if (instance.hasAttribute("data-precedence")) break; return instance; case "script": name = instance.getAttribute("src"); if ((name !== (null == anyProps.src ? null : anyProps.src) || instance.getAttribute("type") !== (null == anyProps.type ? null : anyProps.type) || instance.getAttribute("crossorigin") !== (null == anyProps.crossOrigin ? null : anyProps.crossOrigin)) && name && instance.hasAttribute("async") && !instance.hasAttribute("itemprop")) break; return instance; default: return instance; } instance = getNextHydratable(instance.nextSibling); if (null === instance) break; } return null; } function canHydrateTextInstance(instance, text, inRootOrSingleton) { if ("" === text) return null; for (; 3 !== instance.nodeType; ) { if ((1 !== instance.nodeType || "INPUT" !== instance.nodeName || "hidden" !== instance.type) && !inRootOrSingleton) return null; instance = getNextHydratable(instance.nextSibling); if (null === instance) return null; } return instance; } function canHydrateHydrationBoundary(instance, inRootOrSingleton) { for (; 8 !== instance.nodeType; ) { if ((1 !== instance.nodeType || "INPUT" !== instance.nodeName || "hidden" !== instance.type) && !inRootOrSingleton) return null; instance = getNextHydratable(instance.nextSibling); if (null === instance) return null; } return instance; } function isSuspenseInstancePending(instance) { return "$?" === instance.data || "$~" === instance.data; } function isSuspenseInstanceFallback(instance) { return "$!" === instance.data || "$?" === instance.data && "loading" !== instance.ownerDocument.readyState; } function registerSuspenseInstanceRetry(instance, callback) { var ownerDocument = instance.ownerDocument; if ("$~" === instance.data) instance._reactRetry = callback; else if ("$?" !== instance.data || "loading" !== ownerDocument.readyState) callback(); else { var listener = function() { callback(); ownerDocument.removeEventListener("DOMContentLoaded", listener); }; ownerDocument.addEventListener("DOMContentLoaded", listener); instance._reactRetry = listener; } } function getNextHydratable(node) { for (; null != node; node = node.nextSibling) { var nodeType = node.nodeType; if (1 === nodeType || 3 === nodeType) break; if (8 === nodeType) { nodeType = node.data; if ("$" === nodeType || "$!" === nodeType || "$?" === nodeType || "$~" === nodeType || "&" === nodeType || "F!" === nodeType || "F" === nodeType) break; if ("/$" === nodeType || "/&" === nodeType) return null; } } return node; } var previousHydratableOnEnteringScopedSingleton = null; function getNextHydratableInstanceAfterHydrationBoundary(hydrationInstance) { hydrationInstance = hydrationInstance.nextSibling; for (var depth = 0; hydrationInstance; ) { if (8 === hydrationInstance.nodeType) { var data = hydrationInstance.data; if ("/$" === data || "/&" === data) { if (0 === depth) return getNextHydratable(hydrationInstance.nextSibling); depth--; } else "$" !== data && "$!" !== data && "$?" !== data && "$~" !== data && "&" !== data || depth++; } hydrationInstance = hydrationInstance.nextSibling; } return null; } function getParentHydrationBoundary(targetInstance) { targetInstance = targetInstance.previousSibling; for (var depth = 0; targetInstance; ) { if (8 === targetInstance.nodeType) { var data = targetInstance.data; if ("$" === data || "$!" === data || "$?" === data || "$~" === data || "&" === data) { if (0 === depth) return targetInstance; depth--; } else "/$" !== data && "/&" !== data || depth++; } targetInstance = targetInstance.previousSibling; } return null; } function resolveSingletonInstance(type, props, rootContainerInstance) { props = getOwnerDocumentFromRootContainer(rootContainerInstance); switch (type) { case "html": type = props.documentElement; if (!type) throw Error(formatProdErrorMessage(452)); return type; case "head": type = props.head; if (!type) throw Error(formatProdErrorMessage(453)); return type; case "body": type = props.body; if (!type) throw Error(formatProdErrorMessage(454)); return type; default: throw Error(formatProdErrorMessage(451)); } } function releaseSingletonInstance(instance) { for (var attributes = instance.attributes; attributes.length; ) instance.removeAttributeNode(attributes[0]); detachDeletedInstance(instance); } var preloadPropsMap = new Map(), preconnectsSet = new Set(); function getHoistableRoot(container) { return "function" === typeof container.getRootNode ? container.getRootNode() : 9 === container.nodeType ? container : container.ownerDocument; } var previousDispatcher = ReactDOMSharedInternals.d; ReactDOMSharedInternals.d = { f: flushSyncWork, r: requestFormReset, D: prefetchDNS, C: preconnect, L: preload2, m: preloadModule, X: preinitScript, S: preinitStyle, M: preinitModuleScript }; function flushSyncWork() { var previousWasRendering = previousDispatcher.f(), wasRendering = flushSyncWork$1(); return previousWasRendering || wasRendering; } function requestFormReset(form) { var formInst = getInstanceFromNode(form); null !== formInst && 5 === formInst.tag && "form" === formInst.type ? requestFormReset$1(formInst) : previousDispatcher.r(form); } var globalDocument = "undefined" === typeof document ? null : document; function preconnectAs(rel, href, crossOrigin) { var ownerDocument = globalDocument; if (ownerDocument && "string" === typeof href && href) { var limitedEscapedHref = escapeSelectorAttributeValueInsideDoubleQuotes(href); limitedEscapedHref = 'link[rel="' + rel + '"][href="' + limitedEscapedHref + '"]'; "string" === typeof crossOrigin && (limitedEscapedHref += '[crossorigin="' + crossOrigin + '"]'); preconnectsSet.has(limitedEscapedHref) || (preconnectsSet.add(limitedEscapedHref), rel = { rel, crossOrigin, href }, null === ownerDocument.querySelector(limitedEscapedHref) && (href = ownerDocument.createElement("link"), setInitialProperties(href, "link", rel), markNodeAsHoistable(href), ownerDocument.head.appendChild(href))); } } function prefetchDNS(href) { previousDispatcher.D(href); preconnectAs("dns-prefetch", href, null); } function preconnect(href, crossOrigin) { previousDispatcher.C(href, crossOrigin); preconnectAs("preconnect", href, crossOrigin); } function preload2(href, as, options2) { previousDispatcher.L(href, as, options2); var ownerDocument = globalDocument; if (ownerDocument && href && as) { var preloadSelector = 'link[rel="preload"][as="' + escapeSelectorAttributeValueInsideDoubleQuotes(as) + '"]'; "image" === as ? options2 && options2.imageSrcSet ? (preloadSelector += '[imagesrcset="' + escapeSelectorAttributeValueInsideDoubleQuotes( options2.imageSrcSet ) + '"]', "string" === typeof options2.imageSizes && (preloadSelector += '[imagesizes="' + escapeSelectorAttributeValueInsideDoubleQuotes( options2.imageSizes ) + '"]')) : preloadSelector += '[href="' + escapeSelectorAttributeValueInsideDoubleQuotes(href) + '"]' : preloadSelector += '[href="' + escapeSelectorAttributeValueInsideDoubleQuotes(href) + '"]'; var key = preloadSelector; switch (as) { case "style": key = getStyleKey(href); break; case "script": key = getScriptKey(href); } preloadPropsMap.has(key) || (href = assign( { rel: "preload", href: "image" === as && options2 && options2.imageSrcSet ? void 0 : href, as }, options2 ), preloadPropsMap.set(key, href), null !== ownerDocument.querySelector(preloadSelector) || "style" === as && ownerDocument.querySelector(getStylesheetSelectorFromKey(key)) || "script" === as && ownerDocument.querySelector(getScriptSelectorFromKey(key)) || (as = ownerDocument.createElement("link"), setInitialProperties(as, "link", href), markNodeAsHoistable(as), ownerDocument.head.appendChild(as))); } } function preloadModule(href, options2) { previousDispatcher.m(href, options2); var ownerDocument = globalDocument; if (ownerDocument && href) { var as = options2 && "string" === typeof options2.as ? options2.as : "script", preloadSelector = 'link[rel="modulepreload"][as="' + escapeSelectorAttributeValueInsideDoubleQuotes(as) + '"][href="' + escapeSelectorAttributeValueInsideDoubleQuotes(href) + '"]', key = preloadSelector; switch (as) { case "audioworklet": case "paintworklet": case "serviceworker": case "sharedworker": case "worker": case "script": key = getScriptKey(href); } if (!preloadPropsMap.has(key) && (href = assign({ rel: "modulepreload", href }, options2), preloadPropsMap.set(key, href), null === ownerDocument.querySelector(preloadSelector))) { switch (as) { case "audioworklet": case "paintworklet": case "serviceworker": case "sharedworker": case "worker": case "script": if (ownerDocument.querySelector(getScriptSelectorFromKey(key))) return; } as = ownerDocument.createElement("link"); setInitialProperties(as, "link", href); markNodeAsHoistable(as); ownerDocument.head.appendChild(as); } } } function preinitStyle(href, precedence, options2) { previousDispatcher.S(href, precedence, options2); var ownerDocument = globalDocument; if (ownerDocument && href) { var styles = getResourcesFromRoot(ownerDocument).hoistableStyles, key = getStyleKey(href); precedence = precedence || "default"; var resource = styles.get(key); if (!resource) { var state = { loading: 0, preload: null }; if (resource = ownerDocument.querySelector( getStylesheetSelectorFromKey(key) )) state.loading = 5; else { href = assign( { rel: "stylesheet", href, "data-precedence": precedence }, options2 ); (options2 = preloadPropsMap.get(key)) && adoptPreloadPropsForStylesheet(href, options2); var link = resource = ownerDocument.createElement("link"); markNodeAsHoistable(link); setInitialProperties(link, "link", href); link._p = new Promise(function(resolve, reject) { link.onload = resolve; link.onerror = reject; }); link.addEventListener("load", function() { state.loading |= 1; }); link.addEventListener("error", function() { state.loading |= 2; }); state.loading |= 4; insertStylesheet(resource, precedence, ownerDocument); } resource = { type: "stylesheet", instance: resource, count: 1, state }; styles.set(key, resource); } } } function preinitScript(src, options2) { previousDispatcher.X(src, options2); var ownerDocument = globalDocument; if (ownerDocument && src) { var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts, key = getScriptKey(src), resource = scripts.get(key); resource || (resource = ownerDocument.querySelector(getScriptSelectorFromKey(key)), resource || (src = assign({ src, async: true }, options2), (options2 = preloadPropsMap.get(key)) && adoptPreloadPropsForScript(src, options2), resource = ownerDocument.createElement("script"), markNodeAsHoistable(resource), setInitialProperties(resource, "link", src), ownerDocument.head.appendChild(resource)), resource = { type: "script", instance: resource, count: 1, state: null }, scripts.set(key, resource)); } } function preinitModuleScript(src, options2) { previousDispatcher.M(src, options2); var ownerDocument = globalDocument; if (ownerDocument && src) { var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts, key = getScriptKey(src), resource = scripts.get(key); resource || (resource = ownerDocument.querySelector(getScriptSelectorFromKey(key)), resource || (src = assign({ src, async: true, type: "module" }, options2), (options2 = preloadPropsMap.get(key)) && adoptPreloadPropsForScript(src, options2), resource = ownerDocument.createElement("script"), markNodeAsHoistable(resource), setInitialProperties(resource, "link", src), ownerDocument.head.appendChild(resource)), resource = { type: "script", instance: resource, count: 1, state: null }, scripts.set(key, resource)); } } function getResource(type, currentProps, pendingProps, currentResource) { var JSCompiler_inline_result = (JSCompiler_inline_result = rootInstanceStackCursor.current) ? getHoistableRoot(JSCompiler_inline_result) : null; if (!JSCompiler_inline_result) throw Error(formatProdErrorMessage(446)); switch (type) { case "meta": case "title": return null; case "style": return "string" === typeof pendingProps.precedence && "string" === typeof pendingProps.href ? (currentProps = getStyleKey(pendingProps.href), pendingProps = getResourcesFromRoot( JSCompiler_inline_result ).hoistableStyles, currentResource = pendingProps.get(currentProps), currentResource || (currentResource = { type: "style", instance: null, count: 0, state: null }, pendingProps.set(currentProps, currentResource)), currentResource) : { type: "void", instance: null, count: 0, state: null }; case "link": if ("stylesheet" === pendingProps.rel && "string" === typeof pendingProps.href && "string" === typeof pendingProps.precedence) { type = getStyleKey(pendingProps.href); var styles$243 = getResourcesFromRoot( JSCompiler_inline_result ).hoistableStyles, resource$244 = styles$243.get(type); resource$244 || (JSCompiler_inline_result = JSCompiler_inline_result.ownerDocument || JSCompiler_inline_result, resource$244 = { type: "stylesheet", instance: null, count: 0, state: { loading: 0, preload: null } }, styles$243.set(type, resource$244), (styles$243 = JSCompiler_inline_result.querySelector( getStylesheetSelectorFromKey(type) )) && !styles$243._p && (resource$244.instance = styles$243, resource$244.state.loading = 5), preloadPropsMap.has(type) || (pendingProps = { rel: "preload", as: "style", href: pendingProps.href, crossOrigin: pendingProps.crossOrigin, integrity: pendingProps.integrity, media: pendingProps.media, hrefLang: pendingProps.hrefLang, referrerPolicy: pendingProps.referrerPolicy }, preloadPropsMap.set(type, pendingProps), styles$243 || preloadStylesheet( JSCompiler_inline_result, type, pendingProps, resource$244.state ))); if (currentProps && null === currentResource) throw Error(formatProdErrorMessage(528, "")); return resource$244; } if (currentProps && null !== currentResource) throw Error(formatProdErrorMessage(529, "")); return null; case "script": return currentProps = pendingProps.async, pendingProps = pendingProps.src, "string" === typeof pendingProps && currentProps && "function" !== typeof currentProps && "symbol" !== typeof currentProps ? (currentProps = getScriptKey(pendingProps), pendingProps = getResourcesFromRoot( JSCompiler_inline_result ).hoistableScripts, currentResource = pendingProps.get(currentProps), currentResource || (currentResource = { type: "script", instance: null, count: 0, state: null }, pendingProps.set(currentProps, currentResource)), currentResource) : { type: "void", instance: null, count: 0, state: null }; default: throw Error(formatProdErrorMessage(444, type)); } } function getStyleKey(href) { return 'href="' + escapeSelectorAttributeValueInsideDoubleQuotes(href) + '"'; } function getStylesheetSelectorFromKey(key) { return 'link[rel="stylesheet"][' + key + "]"; } function stylesheetPropsFromRawProps(rawProps) { return assign({}, rawProps, { "data-precedence": rawProps.precedence, precedence: null }); } function preloadStylesheet(ownerDocument, key, preloadProps, state) { ownerDocument.querySelector('link[rel="preload"][as="style"][' + key + "]") ? state.loading = 1 : (key = ownerDocument.createElement("link"), state.preload = key, key.addEventListener("load", function() { return state.loading |= 1; }), key.addEventListener("error", function() { return state.loading |= 2; }), setInitialProperties(key, "link", preloadProps), markNodeAsHoistable(key), ownerDocument.head.appendChild(key)); } function getScriptKey(src) { return '[src="' + escapeSelectorAttributeValueInsideDoubleQuotes(src) + '"]'; } function getScriptSelectorFromKey(key) { return "script[async]" + key; } function acquireResource(hoistableRoot, resource, props) { resource.count++; if (null === resource.instance) switch (resource.type) { case "style": var instance = hoistableRoot.querySelector( 'style[data-href~="' + escapeSelectorAttributeValueInsideDoubleQuotes(props.href) + '"]' ); if (instance) return resource.instance = instance, markNodeAsHoistable(instance), instance; var styleProps = assign({}, props, { "data-href": props.href, "data-precedence": props.precedence, href: null, precedence: null }); instance = (hoistableRoot.ownerDocument || hoistableRoot).createElement( "style" ); markNodeAsHoistable(instance); setInitialProperties(instance, "style", styleProps); insertStylesheet(instance, props.precedence, hoistableRoot); return resource.instance = instance; case "stylesheet": styleProps = getStyleKey(props.href); var instance$249 = hoistableRoot.querySelector( getStylesheetSelectorFromKey(styleProps) ); if (instance$249) return resource.state.loading |= 4, resource.instance = instance$249, markNodeAsHoistable(instance$249), instance$249; instance = stylesheetPropsFromRawProps(props); (styleProps = preloadPropsMap.get(styleProps)) && adoptPreloadPropsForStylesheet(instance, styleProps); instance$249 = (hoistableRoot.ownerDocument || hoistableRoot).createElement("link"); markNodeAsHoistable(instance$249); var linkInstance = instance$249; linkInstance._p = new Promise(function(resolve, reject) { linkInstance.onload = resolve; linkInstance.onerror = reject; }); setInitialProperties(instance$249, "link", instance); resource.state.loading |= 4; insertStylesheet(instance$249, props.precedence, hoistableRoot); return resource.instance = instance$249; case "script": instance$249 = getScriptKey(props.src); if (styleProps = hoistableRoot.querySelector( getScriptSelectorFromKey(instance$249) )) return resource.instance = styleProps, markNodeAsHoistable(styleProps), styleProps; instance = props; if (styleProps = preloadPropsMap.get(instance$249)) instance = assign({}, props), adoptPreloadPropsForScript(instance, styleProps); hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot; styleProps = hoistableRoot.createElement("script"); markNodeAsHoistable(styleProps); setInitialProperties(styleProps, "link", instance); hoistableRoot.head.appendChild(styleProps); return resource.instance = styleProps; case "void": return null; default: throw Error(formatProdErrorMessage(443, resource.type)); } else "stylesheet" === resource.type && 0 === (resource.state.loading & 4) && (instance = resource.instance, resource.state.loading |= 4, insertStylesheet(instance, props.precedence, hoistableRoot)); return resource.instance; } function insertStylesheet(instance, precedence, root2) { for (var nodes = root2.querySelectorAll( 'link[rel="stylesheet"][data-precedence],style[data-precedence]' ), last = nodes.length ? nodes[nodes.length - 1] : null, prior = last, i = 0; i < nodes.length; i++) { var node = nodes[i]; if (node.dataset.precedence === precedence) prior = node; else if (prior !== last) break; } prior ? prior.parentNode.insertBefore(instance, prior.nextSibling) : (precedence = 9 === root2.nodeType ? root2.head : root2, precedence.insertBefore(instance, precedence.firstChild)); } function adoptPreloadPropsForStylesheet(stylesheetProps, preloadProps) { null == stylesheetProps.crossOrigin && (stylesheetProps.crossOrigin = preloadProps.crossOrigin); null == stylesheetProps.referrerPolicy && (stylesheetProps.referrerPolicy = preloadProps.referrerPolicy); null == stylesheetProps.title && (stylesheetProps.title = preloadProps.title); } function adoptPreloadPropsForScript(scriptProps, preloadProps) { null == scriptProps.crossOrigin && (scriptProps.crossOrigin = preloadProps.crossOrigin); null == scriptProps.referrerPolicy && (scriptProps.referrerPolicy = preloadProps.referrerPolicy); null == scriptProps.integrity && (scriptProps.integrity = preloadProps.integrity); } var tagCaches = null; function getHydratableHoistableCache(type, keyAttribute, ownerDocument) { if (null === tagCaches) { var cache = new Map(); var caches = tagCaches = new Map(); caches.set(ownerDocument, cache); } else caches = tagCaches, cache = caches.get(ownerDocument), cache || (cache = new Map(), caches.set(ownerDocument, cache)); if (cache.has(type)) return cache; cache.set(type, null); ownerDocument = ownerDocument.getElementsByTagName(type); for (caches = 0; caches < ownerDocument.length; caches++) { var node = ownerDocument[caches]; if (!(node[internalHoistableMarker] || node[internalInstanceKey] || "link" === type && "stylesheet" === node.getAttribute("rel")) && "http://www.w3.org/2000/svg" !== node.namespaceURI) { var nodeKey = node.getAttribute(keyAttribute) || ""; nodeKey = type + nodeKey; var existing = cache.get(nodeKey); existing ? existing.push(node) : cache.set(nodeKey, [node]); } } return cache; } function mountHoistable(hoistableRoot, type, instance) { hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot; hoistableRoot.head.insertBefore( instance, "title" === type ? hoistableRoot.querySelector("head > title") : null ); } function isHostHoistableType(type, props, hostContext) { if (1 === hostContext || null != props.itemProp) return false; switch (type) { case "meta": case "title": return true; case "style": if ("string" !== typeof props.precedence || "string" !== typeof props.href || "" === props.href) break; return true; case "link": if ("string" !== typeof props.rel || "string" !== typeof props.href || "" === props.href || props.onLoad || props.onError) break; switch (props.rel) { case "stylesheet": return type = props.disabled, "string" === typeof props.precedence && null == type; default: return true; } case "script": if (props.async && "function" !== typeof props.async && "symbol" !== typeof props.async && !props.onLoad && !props.onError && props.src && "string" === typeof props.src) return true; } return false; } function preloadResource(resource) { return "stylesheet" === resource.type && 0 === (resource.state.loading & 3) ? false : true; } function suspendResource(state, hoistableRoot, resource, props) { if ("stylesheet" === resource.type && ("string" !== typeof props.media || false !== matchMedia(props.media).matches) && 0 === (resource.state.loading & 4)) { if (null === resource.instance) { var key = getStyleKey(props.href), instance = hoistableRoot.querySelector( getStylesheetSelectorFromKey(key) ); if (instance) { hoistableRoot = instance._p; null !== hoistableRoot && "object" === typeof hoistableRoot && "function" === typeof hoistableRoot.then && (state.count++, state = onUnsuspend.bind(state), hoistableRoot.then(state, state)); resource.state.loading |= 4; resource.instance = instance; markNodeAsHoistable(instance); return; } instance = hoistableRoot.ownerDocument || hoistableRoot; props = stylesheetPropsFromRawProps(props); (key = preloadPropsMap.get(key)) && adoptPreloadPropsForStylesheet(props, key); instance = instance.createElement("link"); markNodeAsHoistable(instance); var linkInstance = instance; linkInstance._p = new Promise(function(resolve, reject) { linkInstance.onload = resolve; linkInstance.onerror = reject; }); setInitialProperties(instance, "link", props); resource.instance = instance; } null === state.stylesheets && (state.stylesheets = new Map()); state.stylesheets.set(resource, hoistableRoot); (hoistableRoot = resource.state.preload) && 0 === (resource.state.loading & 3) && (state.count++, resource = onUnsuspend.bind(state), hoistableRoot.addEventListener("load", resource), hoistableRoot.addEventListener("error", resource)); } } var estimatedBytesWithinLimit = 0; function waitForCommitToBeReady(state, timeoutOffset) { state.stylesheets && 0 === state.count && insertSuspendedStylesheets(state, state.stylesheets); return 0 < state.count || 0 < state.imgCount ? function(commit) { var stylesheetTimer = setTimeout(function() { state.stylesheets && insertSuspendedStylesheets(state, state.stylesheets); if (state.unsuspend) { var unsuspend = state.unsuspend; state.unsuspend = null; unsuspend(); } }, 6e4 + timeoutOffset); 0 < state.imgBytes && 0 === estimatedBytesWithinLimit && (estimatedBytesWithinLimit = 62500 * estimateBandwidth()); var imgTimer = setTimeout( function() { state.waitingForImages = false; if (0 === state.count && (state.stylesheets && insertSuspendedStylesheets(state, state.stylesheets), state.unsuspend)) { var unsuspend = state.unsuspend; state.unsuspend = null; unsuspend(); } }, (state.imgBytes > estimatedBytesWithinLimit ? 50 : 800) + timeoutOffset ); state.unsuspend = commit; return function() { state.unsuspend = null; clearTimeout(stylesheetTimer); clearTimeout(imgTimer); }; } : null; } function onUnsuspend() { this.count--; if (0 === this.count && (0 === this.imgCount || !this.waitingForImages)) { if (this.stylesheets) insertSuspendedStylesheets(this, this.stylesheets); else if (this.unsuspend) { var unsuspend = this.unsuspend; this.unsuspend = null; unsuspend(); } } } var precedencesByRoot = null; function insertSuspendedStylesheets(state, resources) { state.stylesheets = null; null !== state.unsuspend && (state.count++, precedencesByRoot = new Map(), resources.forEach(insertStylesheetIntoRoot, state), precedencesByRoot = null, onUnsuspend.call(state)); } function insertStylesheetIntoRoot(root2, resource) { if (!(resource.state.loading & 4)) { var precedences = precedencesByRoot.get(root2); if (precedences) var last = precedences.get(null); else { precedences = new Map(); precedencesByRoot.set(root2, precedences); for (var nodes = root2.querySelectorAll( "link[data-precedence],style[data-precedence]" ), i = 0; i < nodes.length; i++) { var node = nodes[i]; if ("LINK" === node.nodeName || "not all" !== node.getAttribute("media")) precedences.set(node.dataset.precedence, node), last = node; } last && precedences.set(null, last); } nodes = resource.instance; node = nodes.getAttribute("data-precedence"); i = precedences.get(node) || last; i === last && precedences.set(null, nodes); precedences.set(node, nodes); this.count++; last = onUnsuspend.bind(this); nodes.addEventListener("load", last); nodes.addEventListener("error", last); i ? i.parentNode.insertBefore(nodes, i.nextSibling) : (root2 = 9 === root2.nodeType ? root2.head : root2, root2.insertBefore(nodes, root2.firstChild)); resource.state.loading |= 4; } } var HostTransitionContext = { $$typeof: REACT_CONTEXT_TYPE, Provider: null, Consumer: null, _currentValue: sharedNotPendingObject, _currentValue2: sharedNotPendingObject, _threadCount: 0 }; function FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onUncaughtError, onCaughtError, onRecoverableError, onDefaultTransitionIndicator, formState) { this.tag = 1; this.containerInfo = containerInfo; this.pingCache = this.current = this.pendingChildren = null; this.timeoutHandle = -1; this.callbackNode = this.next = this.pendingContext = this.context = this.cancelPendingCommit = null; this.callbackPriority = 0; this.expirationTimes = createLaneMap(-1); this.entangledLanes = this.shellSuspendCounter = this.errorRecoveryDisabledLanes = this.expiredLanes = this.warmLanes = this.pingedLanes = this.suspendedLanes = this.pendingLanes = 0; this.entanglements = createLaneMap(0); this.hiddenUpdates = createLaneMap(null); this.identifierPrefix = identifierPrefix; this.onUncaughtError = onUncaughtError; this.onCaughtError = onCaughtError; this.onRecoverableError = onRecoverableError; this.pooledCache = null; this.pooledCacheLanes = 0; this.formState = formState; this.incompleteTransitions = new Map(); } function createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, identifierPrefix, formState, onUncaughtError, onCaughtError, onRecoverableError, onDefaultTransitionIndicator) { containerInfo = new FiberRootNode( containerInfo, tag, hydrate, identifierPrefix, onUncaughtError, onCaughtError, onRecoverableError, onDefaultTransitionIndicator, formState ); tag = 1; true === isStrictMode && (tag |= 24); isStrictMode = createFiberImplClass(3, null, null, tag); containerInfo.current = isStrictMode; isStrictMode.stateNode = containerInfo; tag = createCache(); tag.refCount++; containerInfo.pooledCache = tag; tag.refCount++; isStrictMode.memoizedState = { element: initialChildren, isDehydrated: hydrate, cache: tag }; initializeUpdateQueue(isStrictMode); return containerInfo; } function getContextForSubtree(parentComponent) { if (!parentComponent) return emptyContextObject; parentComponent = emptyContextObject; return parentComponent; } function updateContainerImpl(rootFiber, lane, element, container, parentComponent, callback) { parentComponent = getContextForSubtree(parentComponent); null === container.context ? container.context = parentComponent : container.pendingContext = parentComponent; container = createUpdate(lane); container.payload = { element }; callback = void 0 === callback ? null : callback; null !== callback && (container.callback = callback); element = enqueueUpdate(rootFiber, container, lane); null !== element && (scheduleUpdateOnFiber(element, rootFiber, lane), entangleTransitions(element, rootFiber, lane)); } function markRetryLaneImpl(fiber, retryLane) { fiber = fiber.memoizedState; if (null !== fiber && null !== fiber.dehydrated) { var a = fiber.retryLane; fiber.retryLane = 0 !== a && a < retryLane ? a : retryLane; } } function markRetryLaneIfNotHydrated(fiber, retryLane) { markRetryLaneImpl(fiber, retryLane); (fiber = fiber.alternate) && markRetryLaneImpl(fiber, retryLane); } function attemptContinuousHydration(fiber) { if (13 === fiber.tag || 31 === fiber.tag) { var root2 = enqueueConcurrentRenderForLane(fiber, 67108864); null !== root2 && scheduleUpdateOnFiber(root2, fiber, 67108864); markRetryLaneIfNotHydrated(fiber, 67108864); } } function attemptHydrationAtCurrentPriority(fiber) { if (13 === fiber.tag || 31 === fiber.tag) { var lane = requestUpdateLane(); lane = getBumpedLaneForHydrationByLane(lane); var root2 = enqueueConcurrentRenderForLane(fiber, lane); null !== root2 && scheduleUpdateOnFiber(root2, fiber, lane); markRetryLaneIfNotHydrated(fiber, lane); } } var _enabled = true; function dispatchDiscreteEvent(domEventName, eventSystemFlags, container, nativeEvent) { var prevTransition = ReactSharedInternals.T; ReactSharedInternals.T = null; var previousPriority = ReactDOMSharedInternals.p; try { ReactDOMSharedInternals.p = 2, dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent); } finally { ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = prevTransition; } } function dispatchContinuousEvent(domEventName, eventSystemFlags, container, nativeEvent) { var prevTransition = ReactSharedInternals.T; ReactSharedInternals.T = null; var previousPriority = ReactDOMSharedInternals.p; try { ReactDOMSharedInternals.p = 8, dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent); } finally { ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = prevTransition; } } function dispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) { if (_enabled) { var blockedOn = findInstanceBlockingEvent(nativeEvent); if (null === blockedOn) dispatchEventForPluginEventSystem( domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer ), clearIfContinuousEvent(domEventName, nativeEvent); else if (queueIfContinuousEvent( blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent )) nativeEvent.stopPropagation(); else if (clearIfContinuousEvent(domEventName, nativeEvent), eventSystemFlags & 4 && -1 < discreteReplayableEvents.indexOf(domEventName)) { for (; null !== blockedOn; ) { var fiber = getInstanceFromNode(blockedOn); if (null !== fiber) switch (fiber.tag) { case 3: fiber = fiber.stateNode; if (fiber.current.memoizedState.isDehydrated) { var lanes = getHighestPriorityLanes(fiber.pendingLanes); if (0 !== lanes) { var root2 = fiber; root2.pendingLanes |= 2; for (root2.entangledLanes |= 2; lanes; ) { var lane = 1 << 31 - clz32(lanes); root2.entanglements[1] |= lane; lanes &= ~lane; } ensureRootIsScheduled(fiber); 0 === (executionContext & 6) && (workInProgressRootRenderTargetTime = now() + 500, flushSyncWorkAcrossRoots_impl(0)); } } break; case 31: case 13: root2 = enqueueConcurrentRenderForLane(fiber, 2), null !== root2 && scheduleUpdateOnFiber(root2, fiber, 2), flushSyncWork$1(), markRetryLaneIfNotHydrated(fiber, 2); } fiber = findInstanceBlockingEvent(nativeEvent); null === fiber && dispatchEventForPluginEventSystem( domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer ); if (fiber === blockedOn) break; blockedOn = fiber; } null !== blockedOn && nativeEvent.stopPropagation(); } else dispatchEventForPluginEventSystem( domEventName, eventSystemFlags, nativeEvent, null, targetContainer ); } } function findInstanceBlockingEvent(nativeEvent) { nativeEvent = getEventTarget(nativeEvent); return findInstanceBlockingTarget(nativeEvent); } var return_targetInst = null; function findInstanceBlockingTarget(targetNode) { return_targetInst = null; targetNode = getClosestInstanceFromNode(targetNode); if (null !== targetNode) { var nearestMounted = getNearestMountedFiber(targetNode); if (null === nearestMounted) targetNode = null; else { var tag = nearestMounted.tag; if (13 === tag) { targetNode = getSuspenseInstanceFromFiber(nearestMounted); if (null !== targetNode) return targetNode; targetNode = null; } else if (31 === tag) { targetNode = getActivityInstanceFromFiber(nearestMounted); if (null !== targetNode) return targetNode; targetNode = null; } else if (3 === tag) { if (nearestMounted.stateNode.current.memoizedState.isDehydrated) return 3 === nearestMounted.tag ? nearestMounted.stateNode.containerInfo : null; targetNode = null; } else nearestMounted !== targetNode && (targetNode = null); } } return_targetInst = targetNode; return null; } function getEventPriority(domEventName) { switch (domEventName) { case "beforetoggle": case "cancel": case "click": case "close": case "contextmenu": case "copy": case "cut": case "auxclick": case "dblclick": case "dragend": case "dragstart": case "drop": case "focusin": case "focusout": case "input": case "invalid": case "keydown": case "keypress": case "keyup": case "mousedown": case "mouseup": case "paste": case "pause": case "play": case "pointercancel": case "pointerdown": case "pointerup": case "ratechange": case "reset": case "resize": case "seeked": case "submit": case "toggle": case "touchcancel": case "touchend": case "touchstart": case "volumechange": case "change": case "selectionchange": case "textInput": case "compositionstart": case "compositionend": case "compositionupdate": case "beforeblur": case "afterblur": case "beforeinput": case "blur": case "fullscreenchange": case "focus": case "hashchange": case "popstate": case "select": case "selectstart": return 2; case "drag": case "dragenter": case "dragexit": case "dragleave": case "dragover": case "mousemove": case "mouseout": case "mouseover": case "pointermove": case "pointerout": case "pointerover": case "scroll": case "touchmove": case "wheel": case "mouseenter": case "mouseleave": case "pointerenter": case "pointerleave": return 8; case "message": switch (getCurrentPriorityLevel()) { case ImmediatePriority: return 2; case UserBlockingPriority: return 8; case NormalPriority$1: case LowPriority: return 32; case IdlePriority: return 268435456; default: return 32; } default: return 32; } } var hasScheduledReplayAttempt = false, queuedFocus = null, queuedDrag = null, queuedMouse = null, queuedPointers = new Map(), queuedPointerCaptures = new Map(), queuedExplicitHydrationTargets = [], discreteReplayableEvents = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split( " " ); function clearIfContinuousEvent(domEventName, nativeEvent) { switch (domEventName) { case "focusin": case "focusout": queuedFocus = null; break; case "dragenter": case "dragleave": queuedDrag = null; break; case "mouseover": case "mouseout": queuedMouse = null; break; case "pointerover": case "pointerout": queuedPointers.delete(nativeEvent.pointerId); break; case "gotpointercapture": case "lostpointercapture": queuedPointerCaptures.delete(nativeEvent.pointerId); } } function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { if (null === existingQueuedEvent || existingQueuedEvent.nativeEvent !== nativeEvent) return existingQueuedEvent = { blockedOn, domEventName, eventSystemFlags, nativeEvent, targetContainers: [targetContainer] }, null !== blockedOn && (blockedOn = getInstanceFromNode(blockedOn), null !== blockedOn && attemptContinuousHydration(blockedOn)), existingQueuedEvent; existingQueuedEvent.eventSystemFlags |= eventSystemFlags; blockedOn = existingQueuedEvent.targetContainers; null !== targetContainer && -1 === blockedOn.indexOf(targetContainer) && blockedOn.push(targetContainer); return existingQueuedEvent; } function queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { switch (domEventName) { case "focusin": return queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent( queuedFocus, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent ), true; case "dragenter": return queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent( queuedDrag, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent ), true; case "mouseover": return queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent( queuedMouse, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent ), true; case "pointerover": var pointerId = nativeEvent.pointerId; queuedPointers.set( pointerId, accumulateOrCreateContinuousQueuedReplayableEvent( queuedPointers.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent ) ); return true; case "gotpointercapture": return pointerId = nativeEvent.pointerId, queuedPointerCaptures.set( pointerId, accumulateOrCreateContinuousQueuedReplayableEvent( queuedPointerCaptures.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent ) ), true; } return false; } function attemptExplicitHydrationTarget(queuedTarget) { var targetInst = getClosestInstanceFromNode(queuedTarget.target); if (null !== targetInst) { var nearestMounted = getNearestMountedFiber(targetInst); if (null !== nearestMounted) { if (targetInst = nearestMounted.tag, 13 === targetInst) { if (targetInst = getSuspenseInstanceFromFiber(nearestMounted), null !== targetInst) { queuedTarget.blockedOn = targetInst; runWithPriority(queuedTarget.priority, function() { attemptHydrationAtCurrentPriority(nearestMounted); }); return; } } else if (31 === targetInst) { if (targetInst = getActivityInstanceFromFiber(nearestMounted), null !== targetInst) { queuedTarget.blockedOn = targetInst; runWithPriority(queuedTarget.priority, function() { attemptHydrationAtCurrentPriority(nearestMounted); }); return; } } else if (3 === targetInst && nearestMounted.stateNode.current.memoizedState.isDehydrated) { queuedTarget.blockedOn = 3 === nearestMounted.tag ? nearestMounted.stateNode.containerInfo : null; return; } } } queuedTarget.blockedOn = null; } function attemptReplayContinuousQueuedEvent(queuedEvent) { if (null !== queuedEvent.blockedOn) return false; for (var targetContainers = queuedEvent.targetContainers; 0 < targetContainers.length; ) { var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.nativeEvent); if (null === nextBlockedOn) { nextBlockedOn = queuedEvent.nativeEvent; var nativeEventClone = new nextBlockedOn.constructor( nextBlockedOn.type, nextBlockedOn ); currentReplayingEvent = nativeEventClone; nextBlockedOn.target.dispatchEvent(nativeEventClone); currentReplayingEvent = null; } else return targetContainers = getInstanceFromNode(nextBlockedOn), null !== targetContainers && attemptContinuousHydration(targetContainers), queuedEvent.blockedOn = nextBlockedOn, false; targetContainers.shift(); } return true; } function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) { attemptReplayContinuousQueuedEvent(queuedEvent) && map.delete(key); } function replayUnblockedEvents() { hasScheduledReplayAttempt = false; null !== queuedFocus && attemptReplayContinuousQueuedEvent(queuedFocus) && (queuedFocus = null); null !== queuedDrag && attemptReplayContinuousQueuedEvent(queuedDrag) && (queuedDrag = null); null !== queuedMouse && attemptReplayContinuousQueuedEvent(queuedMouse) && (queuedMouse = null); queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap); queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap); } function scheduleCallbackIfUnblocked(queuedEvent, unblocked) { queuedEvent.blockedOn === unblocked && (queuedEvent.blockedOn = null, hasScheduledReplayAttempt || (hasScheduledReplayAttempt = true, Scheduler.unstable_scheduleCallback( Scheduler.unstable_NormalPriority, replayUnblockedEvents ))); } var lastScheduledReplayQueue = null; function scheduleReplayQueueIfNeeded(formReplayingQueue) { lastScheduledReplayQueue !== formReplayingQueue && (lastScheduledReplayQueue = formReplayingQueue, Scheduler.unstable_scheduleCallback( Scheduler.unstable_NormalPriority, function() { lastScheduledReplayQueue === formReplayingQueue && (lastScheduledReplayQueue = null); for (var i = 0; i < formReplayingQueue.length; i += 3) { var form = formReplayingQueue[i], submitterOrAction = formReplayingQueue[i + 1], formData = formReplayingQueue[i + 2]; if ("function" !== typeof submitterOrAction) if (null === findInstanceBlockingTarget(submitterOrAction || form)) continue; else break; var formInst = getInstanceFromNode(form); null !== formInst && (formReplayingQueue.splice(i, 3), i -= 3, startHostTransition( formInst, { pending: true, data: formData, method: form.method, action: submitterOrAction }, submitterOrAction, formData )); } } )); } function retryIfBlockedOn(unblocked) { function unblock(queuedEvent) { return scheduleCallbackIfUnblocked(queuedEvent, unblocked); } null !== queuedFocus && scheduleCallbackIfUnblocked(queuedFocus, unblocked); null !== queuedDrag && scheduleCallbackIfUnblocked(queuedDrag, unblocked); null !== queuedMouse && scheduleCallbackIfUnblocked(queuedMouse, unblocked); queuedPointers.forEach(unblock); queuedPointerCaptures.forEach(unblock); for (var i = 0; i < queuedExplicitHydrationTargets.length; i++) { var queuedTarget = queuedExplicitHydrationTargets[i]; queuedTarget.blockedOn === unblocked && (queuedTarget.blockedOn = null); } for (; 0 < queuedExplicitHydrationTargets.length && (i = queuedExplicitHydrationTargets[0], null === i.blockedOn); ) attemptExplicitHydrationTarget(i), null === i.blockedOn && queuedExplicitHydrationTargets.shift(); i = (unblocked.ownerDocument || unblocked).$$reactFormReplay; if (null != i) for (queuedTarget = 0; queuedTarget < i.length; queuedTarget += 3) { var form = i[queuedTarget], submitterOrAction = i[queuedTarget + 1], formProps = form[internalPropsKey] || null; if ("function" === typeof submitterOrAction) formProps || scheduleReplayQueueIfNeeded(i); else if (formProps) { var action = null; if (submitterOrAction && submitterOrAction.hasAttribute("formAction")) if (form = submitterOrAction, formProps = submitterOrAction[internalPropsKey] || null) action = formProps.formAction; else { if (null !== findInstanceBlockingTarget(form)) continue; } else action = formProps.action; "function" === typeof action ? i[queuedTarget + 1] = action : (i.splice(queuedTarget, 3), queuedTarget -= 3); scheduleReplayQueueIfNeeded(i); } } } function defaultOnDefaultTransitionIndicator() { function handleNavigate(event) { event.canIntercept && "react-transition" === event.info && event.intercept({ handler: function() { return new Promise(function(resolve) { return pendingResolve = resolve; }); }, focusReset: "manual", scroll: "manual" }); } function handleNavigateComplete() { null !== pendingResolve && (pendingResolve(), pendingResolve = null); isCancelled || setTimeout(startFakeNavigation, 20); } function startFakeNavigation() { if (!isCancelled && !navigation.transition) { var currentEntry = navigation.currentEntry; currentEntry && null != currentEntry.url && navigation.navigate(currentEntry.url, { state: currentEntry.getState(), info: "react-transition", history: "replace" }); } } if ("object" === typeof navigation) { var isCancelled = false, pendingResolve = null; navigation.addEventListener("navigate", handleNavigate); navigation.addEventListener("navigatesuccess", handleNavigateComplete); navigation.addEventListener("navigateerror", handleNavigateComplete); setTimeout(startFakeNavigation, 100); return function() { isCancelled = true; navigation.removeEventListener("navigate", handleNavigate); navigation.removeEventListener("navigatesuccess", handleNavigateComplete); navigation.removeEventListener("navigateerror", handleNavigateComplete); null !== pendingResolve && (pendingResolve(), pendingResolve = null); }; } } function ReactDOMRoot(internalRoot) { this._internalRoot = internalRoot; } ReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render = function(children) { var root2 = this._internalRoot; if (null === root2) throw Error(formatProdErrorMessage(409)); var current = root2.current, lane = requestUpdateLane(); updateContainerImpl(current, lane, children, root2, null, null); }; ReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount = function() { var root2 = this._internalRoot; if (null !== root2) { this._internalRoot = null; var container = root2.containerInfo; updateContainerImpl(root2.current, 2, null, root2, null, null); flushSyncWork$1(); container[internalContainerInstanceKey] = null; } }; function ReactDOMHydrationRoot(internalRoot) { this._internalRoot = internalRoot; } ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function(target) { if (target) { var updatePriority = resolveUpdatePriority(); target = { blockedOn: null, target, priority: updatePriority }; for (var i = 0; i < queuedExplicitHydrationTargets.length && 0 !== updatePriority && updatePriority < queuedExplicitHydrationTargets[i].priority; i++) ; queuedExplicitHydrationTargets.splice(i, 0, target); 0 === i && attemptExplicitHydrationTarget(target); } }; var isomorphicReactPackageVersion$jscomp$inline_1840 = React2.version; if ("19.2.5" !== isomorphicReactPackageVersion$jscomp$inline_1840) throw Error( formatProdErrorMessage( 527, isomorphicReactPackageVersion$jscomp$inline_1840, "19.2.5" ) ); ReactDOMSharedInternals.findDOMNode = function(componentOrElement) { var fiber = componentOrElement._reactInternals; if (void 0 === fiber) { if ("function" === typeof componentOrElement.render) throw Error(formatProdErrorMessage(188)); componentOrElement = Object.keys(componentOrElement).join(","); throw Error(formatProdErrorMessage(268, componentOrElement)); } componentOrElement = findCurrentFiberUsingSlowPath(fiber); componentOrElement = null !== componentOrElement ? findCurrentHostFiberImpl(componentOrElement) : null; componentOrElement = null === componentOrElement ? null : componentOrElement.stateNode; return componentOrElement; }; var internals$jscomp$inline_2347 = { bundleType: 0, version: "19.2.5", rendererPackageName: "react-dom", currentDispatcherRef: ReactSharedInternals, reconcilerVersion: "19.2.5" }; if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { var hook$jscomp$inline_2348 = __REACT_DEVTOOLS_GLOBAL_HOOK__; if (!hook$jscomp$inline_2348.isDisabled && hook$jscomp$inline_2348.supportsFiber) try { rendererID = hook$jscomp$inline_2348.inject( internals$jscomp$inline_2347 ), injectedHook = hook$jscomp$inline_2348; } catch (err) { } } reactDomClient_production.createRoot = function(container, options2) { if (!isValidContainer(container)) throw Error(formatProdErrorMessage(299)); var isStrictMode = false, identifierPrefix = "", onUncaughtError = defaultOnUncaughtError, onCaughtError = defaultOnCaughtError, onRecoverableError = defaultOnRecoverableError; null !== options2 && void 0 !== options2 && (true === options2.unstable_strictMode && (isStrictMode = true), void 0 !== options2.identifierPrefix && (identifierPrefix = options2.identifierPrefix), void 0 !== options2.onUncaughtError && (onUncaughtError = options2.onUncaughtError), void 0 !== options2.onCaughtError && (onCaughtError = options2.onCaughtError), void 0 !== options2.onRecoverableError && (onRecoverableError = options2.onRecoverableError)); options2 = createFiberRoot( container, 1, false, null, null, isStrictMode, identifierPrefix, null, onUncaughtError, onCaughtError, onRecoverableError, defaultOnDefaultTransitionIndicator ); container[internalContainerInstanceKey] = options2.current; listenToAllSupportedEvents(container); return new ReactDOMRoot(options2); }; reactDomClient_production.hydrateRoot = function(container, initialChildren, options2) { if (!isValidContainer(container)) throw Error(formatProdErrorMessage(299)); var isStrictMode = false, identifierPrefix = "", onUncaughtError = defaultOnUncaughtError, onCaughtError = defaultOnCaughtError, onRecoverableError = defaultOnRecoverableError, formState = null; null !== options2 && void 0 !== options2 && (true === options2.unstable_strictMode && (isStrictMode = true), void 0 !== options2.identifierPrefix && (identifierPrefix = options2.identifierPrefix), void 0 !== options2.onUncaughtError && (onUncaughtError = options2.onUncaughtError), void 0 !== options2.onCaughtError && (onCaughtError = options2.onCaughtError), void 0 !== options2.onRecoverableError && (onRecoverableError = options2.onRecoverableError), void 0 !== options2.formState && (formState = options2.formState)); initialChildren = createFiberRoot( container, 1, true, initialChildren, null != options2 ? options2 : null, isStrictMode, identifierPrefix, formState, onUncaughtError, onCaughtError, onRecoverableError, defaultOnDefaultTransitionIndicator ); initialChildren.context = getContextForSubtree(null); options2 = initialChildren.current; isStrictMode = requestUpdateLane(); isStrictMode = getBumpedLaneForHydrationByLane(isStrictMode); identifierPrefix = createUpdate(isStrictMode); identifierPrefix.callback = null; enqueueUpdate(options2, identifierPrefix, isStrictMode); options2 = isStrictMode; initialChildren.current.lanes = options2; markRootUpdated$1(initialChildren, options2); ensureRootIsScheduled(initialChildren); container[internalContainerInstanceKey] = initialChildren.current; listenToAllSupportedEvents(container); return new ReactDOMHydrationRoot(initialChildren); }; reactDomClient_production.version = "19.2.5"; return reactDomClient_production; } var hasRequiredClient; function requireClient() { if (hasRequiredClient) return client.exports; hasRequiredClient = 1; function checkDCE() { if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function") { return; } try { __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); } catch (err) { console.error(err); } } { checkDCE(); client.exports = requireReactDomClient_production(); } return client.exports; } var clientExports = requireClient(); const ReactDOM = getDefaultExportFromCjs(clientExports); const readerStyles = `:root{--readerBg: #000000;--sidebarCol: #28292b;--accentCol: #b73636;--icoCol: #eee;--textCol: #ddd;--sidebarColDark: #2b2f33;--sidebarColDarkA: #2b2f3300;--prevCol: #34393d;--accentSelected: #ffffff;--accentSelectedInvert: #333333;--sidebarColFocus: rgba(0, 0, 0, .3);--borderColor: rgba(0, 0, 0, .7);--blackFlag: rgba(0, 0, 0, .7);--blackLight: rgba(0, 0, 0, .2);--rdrBorderL: 1px;--rdr-wb: 2px;--rdrAncBottomWhite: rgba(255, 255, 255, .35);--rescueShade: unset}.ico-btn{font-family:guya!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,sub,sup,tt,var,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1;position:relative;max-height:100vh;max-height:100dvh}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}table{border-collapse:collapse;border-spacing:0}@supports (-webkit-overflow-scrolling: touch){html,body{height:100.001vh}}button{border:0;margin:0;padding:0;cursor:pointer;background:none;border:none;all:unset}button::-moz-focus-inner{border:0;margin:0;padding:0;cursor:pointer;background:none;border:none}button:focus,option,details,summary{outline:none!important}*[tabindex="-1"]{outline:none;outline-style:none;box-shadow:none;border-color:transparent}html{background:var(--readerBg)}body{background:var(--readerBg);font-size:1.2rem;font-family:Open Sans,sans-serif;line-height:1.3;color:var(--textCol)}main{font-size:1.2rem;display:flex;height:100vh;height:100dvh;overflow:hidden;max-height:100vh;max-height:100dvh;position:relative}main>aside{height:100vh;height:100dvh;min-width:16em;max-width:16em;display:flex;flex-direction:column;background:var(--sidebarCol);position:relative;transition:margin-left .3s ease}main>aside>header{display:flex;align-items:flex-top;align-content:stretch}*{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.3) var(--prevCol)}*::-webkit-scrollbar{border-radius:4px;width:6px}*::-webkit-scrollbar-track{border-radius:4px;background:var(--prevCol);background-clip:content-box}*::-webkit-scrollbar-thumb{border-radius:4px;background:#0000004d}.ico-btn{display:flex;justify-content:center;align-items:center;font-size:18px;width:3rem;height:3rem;flex-shrink:0;color:var(--icoCol);text-decoration:none;cursor:default;position:relative;transition:all .1s ease,top 0s linear}.ico-btn:hover{color:var(--accentCol);top:-1px}.inline-icon{font-family:guya!important;font-size:1em}.ico-btn:active{top:0}header>h1{display:flex;justify-content:center;text-align:center;padding:.5rem;font-size:1rem;flex-grow:1;align-items:center;min-height:3rem;box-sizing:border-box}header>h1 a{color:inherit;text-decoration:none}header>h1 a:hover{text-decoration:underline}.ico-btn.guya:before{content:"";font-size:1.2em}.ico-btn.close:before{content:""}.ico-btn.search{cursor:pointer}.ico-btn.search:before{content:""}.ico-btn.jump{cursor:pointer}.ico-btn.jump:before{content:"⮠";transform:scaleX(-1)}.ico-btn.download:before{content:""}.download-anchor{width:.1px;position:relative}.download-wrapper{display:flex;border-radius:1px;background:var(--blackLight);box-shadow:2px 10px 20px var(--borderColor);height:2rem;position:absolute;right:0}.ico-btn.downloading{width:7rem!important;font-family:Open Sans,sans-serif!important;font-size:70%;font-weight:600;top:0!important;background:var(--sidebarCol);color:var(--accentCol);display:inherit;height:99%!important}.ico-btn.ico-btn.download-cancel{display:inherit}.ico-btn.download-cancel:before{content:""}.rdr-aside-content{display:flex;width:100%;flex-grow:1;flex-direction:column}.rdr-selector{display:flex;flex-direction:column;flex-grow:0}.rdr-selector>div{display:flex;align-items:stretch;align-content:stretch}.rdr-selector select{flex-grow:1;border:0;background:transparent;color:var(--icoCol)}.rdr-selector option{color:var(--icoCol);background:var(--sidebarColDark);padding:.4em .2em;display:block;line-height:1.3em;cursor:pointer}.rdr-selector-top,.rdr-selector-bot{padding-left:2rem;height:2rem}.rdr-selector-top .ico-btn,.rdr-selector-bot .ico-btn{height:2rem;width:2.6rem}.rdr-selector-mid{height:2.5rem;background:var(--sidebarColDark)}#message-box{flex-grow:1;text-align:right;font-size:.7rem;padding:0 1rem;line-height:2.2rem;color:#aaa;opacity:1;transition:opacity .3s ease}.initFlash{animation:initFlash 2s}.flash{animation:flash .5s}.fade{animation:fade .5s}.fadeOut{opacity:0;transition:opacity .3s ease}@keyframes flash{0%{color:#fff}to{color:#aaa;text-shadow:none}}@keyframes initFlash{0%{background:#ffffff4d}to{background:none}}@keyframes fade{0%{opacity:0}to{opacity:1}}.rdr-selector-mid .ico-btn{height:2.5rem;width:2.5rem}.rdr-selector-vol{height:2rem}.flex-spacer{flex-grow:1000}.rdr-selector-chap.prev:before{content:""}.rdr-selector-chap.next:before{content:""}.rdr-selector-vol.prev,.rdr-selector-vol.next{width:2.9rem}.rdr-selector-vol.prev:before{content:""}.rdr-selector-vol.next:before{content:""}[data-apr\\.selpinned].ico-btn:before{content:"";transform:rotate(270deg)}[data-apr\\.selpinned=true].ico-btn:before{content:""}.ico-btn.password[data-password-active=true]{color:var(--accentCol)}[data-lyt\\.fit=height].ico-btn:before{content:"h"}[data-lyt\\.fit=width].ico-btn:before{content:"w"}[data-lyt\\.fit=height_limit].ico-btn:before{content:"H"}[data-lyt\\.fit=width_limit].ico-btn:before{content:"W"}[data-lyt\\.fit=all].ico-btn:before{content:""}[data-lyt\\.fit=all_limit].ico-btn:before{content:""}[data-lyt\\.fit=none].ico-btn:before{content:""}[data-lyt\\.direction].ico-btn:before{font-size:.8em}[data-lyt\\.direction=ltr].ico-btn:before{content:""}[data-lyt\\.direction=rtl].ico-btn:before{content:"";transform:scaleX(-1)}[data-lyt\\.direction=ttb].ico-btn:before{content:"";transform:rotate(90deg)}[data-lyt\\.spread="1"].ico-btn:before{content:""}[data-lyt\\.spread="2"].ico-btn:before{content:""}[data-lyt\\.spread="2-odd"].ico-btn:before{content:"";transform:scaleX(-1)}[data-bind=settings_button].ico-btn{box-shadow:-4px 1px 4px -5px #000;margin-left:.3rem;color:var(--icoCol);text-shadow:1px 1px 3px var(--borderColor)}[data-bind=settings_button].ico-btn:before{content:""}.rdr-comment{cursor:pointer}.rdr-comment.ico-btn:before{content:"";font-size:.9em}.rdr-share.ico-btn:before{content:""}[data-bhv\\.preload="1"].ico-btn:before{content:""}[data-bhv\\.preload="2"].ico-btn:before{content:""}[data-bhv\\.preload="3"].ico-btn:before{content:""}[data-bhv\\.preload="4"].ico-btn:before{content:""}[data-bhv\\.preload="5"].ico-btn:before{content:""}[data-bhv\\.preload="6"].ico-btn:before{content:""}[data-bhv\\.preload="7"].ico-btn:before{content:""}[data-bhv\\.preload="8"].ico-btn:before{content:""}[data-bhv\\.preload="9"].ico-btn:before{content:""}[data-bhv\\.preload="100"].ico-btn:before{content:""}.rdr-page-selector .preloaded{border-left-color:var(--accentCol)}.rdr-vol-wrap{position:relative;flex-grow:0;min-width:2rem;overflow:hidden;font-size:12px}.rdr-chap-wrap{position:relative;flex-grow:7;overflow:hidden;font-size:12px}.rdr-chap-wrap:after{content:"";position:absolute;bottom:0;right:0;top:0;width:2rem;background:linear-gradient(90deg,var(--sidebarColDarkA) 0%,var(--sidebarColDark) 100%);pointer-events:none}.rdr-vol-wrap label{justify-content:center}.rdr-chap-wrap label{padding-left:1ch;white-space:nowrap}.rdr-vol-wrap:hover label,.rdr-chap-wrap:hover label{color:var(--accentCol)}.rdr-groups{margin-top:.5rem;flex-grow:0}.rdr-groups div{font-size:.7em;padding:.7rem;text-align:center;cursor:default}.rdr-groups div:hover{background:#ffffff08;color:var(--accentCol)}.rdr-groups div.is-active{background:var(--sidebarColFocus);color:var(--icoCol)}.rdr-description div{margin:2em .8em;line-height:1.8;white-space:pre-wrap;font-size:.7em;max-height:50vh;overflow-y:auto}@media(max-width:768px){.rdr-description{display:none}}.rdr-previews{display:flex;flex-direction:column;margin-top:1rem;overflow:hidden;flex-basis:0;flex-grow:1}.rdr-previews .header{display:flex;flex-wrap:nowrap;list-style:none;background:var(--prevCol);flex-grow:0;font-size:0}.rdr-previews .header:hover,.rdr-previews .header:hover .expander{color:var(--accentCol)}.rdr-previews .header span{display:flex;align-items:center;padding:0 0 0 1rem;flex-grow:1;font-size:.8rem}.rdr-previews .header .expander{height:2.6rem;font-size:1.5rem}.rdr-previews .header .expander:before{content:""}.previews-true .rdr-previews .header .expander:before{content:""}.rdr-previews-gallery{flex-wrap:wrap;justify-content:space-around;align-items:center;padding-top:.25rem;overflow:auto;display:none;max-height:calc(100% - 3rem)}.previews-true .rdr-previews-gallery{display:flex}.rdr-previews-gallery img{flex-basis:30%;width:30%;margin-bottom:.5rem;box-shadow:0 1px 3px #0000004d;cursor:pointer}.rdr-previews-gallery .is-active{opacity:.7;outline:2px solid var(--accentCol)}.unload .rdr-selector-chap.next{transform:translate(-18rem)}.unload .rdr-selector-chap.prev{transform:translate(18rem)}.unload .rdr-selector-vol.prev{transform:translateY(230%)}.unload .rdr-selector-vol.next{transform:translateY(-230%)}.unload .rdr-vol-wrap label{transform:scaleY(0)}.unload .rdr-chap-wrap label{transform:scaleX(0)}.unload .rdr-groups{transform:translateY(2rem)}.rdr-selector-chap.next,.rdr-selector-chap.prev,.rdr-selector-vol.next,.rdr-selector-vol.prev,.rdr-selector-top,.rdr-selector-bot,.rdr-chap-wrap label,.rdr-vol-wrap label,.rdr-groups,.rdr-previews{transition:all .5s cubic-bezier(.22,.61,.36,1)}.rdr-chap-wrap label,.rdr-vol-wrap label{transform-origin:5.1rem center;transition-delay:.1s}.rdr-selector-top,.rdr-selector-bot{transition-delay:.2s;transition-duration:.5s}.unload .rdr-selector-chap.next,.unload .rdr-selector-chap.prev,.unload .rdr-selector-top,.unload .rdr-selector-bot,.unload .rdr-chap-wrap label,.unload .rdr-vol-wrap label,.unload .rdr-groups,.unload .rdr-previews{opacity:0}.unload .rdr-selector-mid:before{content:"";font-family:Guya;display:block;position:absolute;left:50%;animation:rotat 1.1s infinite linear;font-size:24px;line-height:2.4rem;transform-origin:center 52.5%}@keyframes rotat{0%{transform:translate3d(-50%,0,0) rotate(0)}to{transform:translate3d(-50%,0,0) rotate(360deg)}}.rdr-area{overflow:hidden;position:relative;min-height:100%;flex-grow:1;cursor:pointer}.rdr-area .hover-prev,.rdr-area .hover-next{position:fixed;bottom:0;right:0;width:10rem;height:13rem;background:linear-gradient(310deg,#00000073,#0000 50%);transition:opacity 1s ease;opacity:0;display:flex;justify-content:flex-end;align-items:flex-end;align-content:flex-end;pointer-events:none;-webkit-user-select:none;user-select:none;padding-bottom:1.5rem;z-index:1;box-sizing:border-box;will-change:transform}.direction-ttb .hover-prev,.direction-ttb .hover-next,.hoverinos-false .hover-prev,.hoverinos-false .hover-next{display:none}.rdr-area .hover-prev{justify-content:flex-start;align-items:flex-end;right:unset;background:linear-gradient(50deg,#00000073,#0000 50%);padding-left:2rem}.rdr-area .hover-prev.viz,.rdr-area .hover-next.viz{transition:opacity .5s ease;opacity:1}.rdr-area .hover-prev.nodelay,.rdr-area .hover-next.nodelay{transition:opacity .5s ease}.direction-ttb .rdr-area .hover-arrow{transform:translate(18%) rotate(90deg) translate(18%)}.rdr-area .hover-wrap{display:flex;flex-direction:column;text-align:center}.rdr-area .hover-arrow{color:#fff;display:block;font-family:guya;font-size:2em;padding:2rem 2rem 0rem;text-shadow:0px 2px 1px rgba(0,0,0,.7),0px 1px 3px rgba(0,0,0,.7)}.rdr-area .hover-sub{color:#fff;display:block;margin-top:.1rem;text-shadow:0px 2px 1px rgba(0,0,0,.7),0px 1px 3px rgba(0,0,0,.7);width:100%;font-size:.8em;font-variant:small-caps}.rdr-area .hover-prev .hover-sub:before{content:"prev"}.rdr-area .hover-next .hover-sub:before{content:"next"}.direction-rtl .rdr-area .hover-prev .hover-sub:before{content:"next"}.direction-rtl .rdr-area .hover-next .hover-sub:before{content:"prev"}#test_element{position:absolute;width:100%;left:0;z-index:3000;height:1px;background:red}.rdr-image-wrap{display:flex;height:100%;width:100%;position:relative;outline:none;outline-style:none;box-shadow:none;border-color:transparent;transform:translateZ(0);-webkit-transform:translate3d(0,0,0);perspective:1000;-webkit-perspective:1000}.direction-rtl .rdr-image-wrap,.direction-ltr .rdr-image-wrap{will-change:transform}.direction-ttb .rdr-image-wrap{margin-left:unset!important}.loaded .rdr-image-wrap{scroll-behavior:smooth}.rdr-image-wrap:after{content:"ы";font-size:.005em}.rdr-image-wrap *{transform:translateZ(0);-webkit-transform:translate3d(0,0,0);perspective:1000;-webkit-perspective:1000}.rdr-image-wrap:after{content:"讎";font-size:.005em}.rdr-image-wrap .ReaderImageWrapper{display:flex;min-width:100%;min-height:100%;justify-content:center;align-items:flex-start;position:relative;overflow:auto;outline-style:none;box-shadow:none;border-color:transparent;box-sizing:border-box}.o .rdr-image-wrap{opacity:.03}.rdr-image-wrap .ReaderImageWrapper img{-webkit-user-select:none;user-select:none;min-height:16rem;min-width:9rem;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1em' height='1em' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12 2A10 10 0 1 0 22 12A10 10 0 0 0 12 2Zm0 18a8 8 0 1 1 8-8A8 8 0 0 1 12 20Z' opacity='.5'/%3E%3Cpath fill='%23fff' d='M20 12h2A10 10 0 0 0 12 2V4A8 8 0 0 1 20 12Z'%3E%3CanimateTransform attributeName='transform' dur='1s' from='0 12 12' repeatCount='indefinite' to='360 12 12' type='rotate'/%3E%3C/path%3E%3C/svg%3E");background-size:10vw auto;background-position:50% 50%;background-repeat:no-repeat}.fit-width .rdr-image-wrap .ReaderImageWrapper img{min-width:0;width:100%;height:auto;max-width:unset;flex-grow:1}.fit-width_limit .rdr-image-wrap .ReaderImageWrapper img{height:auto;max-width:100%;object-fit:contain}.fit-width_limit .rdr-image-wrap .ReaderImageWrapper.two-page img{max-width:50%}.fit-height .rdr-image-wrap .ReaderImageWrapper.too-wide{justify-content:flex-start}.fit-height .rdr-image-wrap .ReaderImageWrapper img{max-width:unset;min-width:unset;width:auto;max-height:100%;min-height:100%;flex-shrink:1}.fit-height_limit .rdr-image-wrap .ReaderImageWrapper{max-height:100vh;max-height:100dvh}.fit-height_limit .rdr-image-wrap .ReaderImageWrapper img{max-width:unset;max-height:100%;width:auto;height:auto;flex-shrink:0}_:-webkit-full-screen:not(:root:root),.fit-height_limit .rdr-image-wrap .ReaderImageWrapper img{flex-shrink:1}.fit-none .rdr-image-wrap .ReaderImageWrapper{min-height:100vh;min-height:100dvh}.too-wide{justify-content:flex-start!important}.fit-none .rdr-image-wrap .ReaderImageWrapper img{flex-shrink:0}.fit-all .rdr-image-wrap .ReaderImageWrapper{min-height:100vh;min-height:100dvh;min-width:100%;align-items:center}.fit-all .rdr-image-wrap .ReaderImageWrapper img{object-fit:contain;min-width:0;width:auto;height:100%}.fit-all_limit .rdr-image-wrap .ReaderImageWrapper img{width:auto;height:100%;max-width:100%;max-height:100%;object-fit:contain}.direction-ttb .rdr-image-wrap{transform:none!important;flex-direction:row;flex-wrap:wrap;overflow-y:auto}.direction-ttb .rdr-image-wrap .ReaderImageWrapper{flex-shrink:0;margin-bottom:1em;min-height:20%!important;max-width:100%}.gap-true .rdr-image-wrap .ReaderImageWrapper{margin-bottom:0!important}.direction-ttb.fit-width .rdr-image-wrap .ReaderImageWrapper,.direction-ttb.fit-all .rdr-image-wrap .ReaderImageWrapper{min-height:auto}.direction-ttb.fit-all .rdr-image-wrap .ReaderImageWrapper img{max-height:100vh;max-height:100dvh}.direction-ttb.fit-height .rdr-image-wrap .ReaderImageWrapper img{min-height:100vh;min-height:100dvh;max-height:100vh;max-height:100dvh}.rdr-page-selector{height:100vh;height:100dvh;width:1px;top:0;opacity:0;position:relative;z-index:3;transition:left .3s ease,opacity .3s ease;min-width:2rem;margin-right:-2rem;cursor:pointer}.selPinned-true .rdr-page-selector,.vis,.rdr-page-selector:hover{opacity:1!important}.rdr-page-selector:hover .rdr-page-selector-keys,.rdr-page-selector.vis .rdr-page-selector-keys,.selPinned-true .rdr-page-selector-keys{left:3px}.rdr-page-selector-keys{height:100%;display:flex;flex-direction:column;position:relative;left:0;transition:left .3s ease,opacity .2s ease,box-shadow .2s ease}.rdr-page-selector-keys div{flex-grow:1;z-index:2;margin-bottom:2px;border-left:var(--rdrBorderL) solid #555;transition:left .2s ease,opacity .2s ease,box-shadow .2s ease,margin .2s ease,padding .2s ease,color .2s ease,text-shadow .2s ease,border .2s ease;position:relative;text-align:left;color:transparent;font-size:2vh;line-height:0;display:flex;align-items:center;justify-content:flex-start;padding-left:1em;will-change:transform;text-shadow:none}.rdr-page-selector-keys div:before{content:"";display:block;position:absolute;vertical-align:middle;margin-right:1.4ch;height:100%;width:var(--rdr-wb);left:-4px;background:#272b30}.rdr-page-selector-keys div:after{content:"";display:block;height:102%;width:100%;position:absolute}.rdr-page-selector-keys div:hover{border-left:1px solid lightgray;box-shadow:100px 0 20px -100px #ffffff80 inset,100px 0 20px -100px #0000008c inset;left:2px;color:#fff;text-shadow:1px 1px 0px rgba(0,0,0,.5),-1px -1px 0px rgba(0,0,0,.5),1px -1px 0px rgba(0,0,0,.5),-1px 1px 0px rgba(0,0,0,.5),1px 0px 0px rgba(0,0,0,.5),-1px 0px 0px rgba(0,0,0,.5),0px -1px 0px rgba(0,0,0,.5),0px 1px 0px rgba(0,0,0,.5),0px 0px 3px rgba(0,0,0,.5)}.rdr-page-selector-keys div.shown{border-left:1px solid white;color:#fff;box-shadow:100px 0 20px -100px #fff inset,100px 0 20px -90px inset #0000009e;text-shadow:1px 1px 0px rgba(0,0,0,.5),-1px -1px 0px rgba(0,0,0,.5),1px -1px 0px rgba(0,0,0,.5),-1px 1px 0px rgba(0,0,0,.5),1px 0px 0px rgba(0,0,0,.5),-1px 0px 0px rgba(0,0,0,.5),0px -1px 0px rgba(0,0,0,.5),0px 1px 0px rgba(0,0,0,.5),0px 0px 3px rgba(0,0,0,.5);left:0}.selPinned-true .rdr-page-selector-keys div.shown{color:#ffffffe6}.selPinned-true.selNum-false .rdr-page-selector-keys div.shown{color:transparent;text-shadow:none}.selPinned-true.selNum-false .rdr-page-selector-keys div.shown:hover{color:#fff;text-shadow:1px 1px 1px black,-1px -1px 1px black,1px -1px 1px black,-1px 1px 1px black}.selNum-false .rdr-page-selector-keys div,.selNum-false .rdr-page-selector-keys div:hover,.selNum-false .rdr-page-selector-keys div.shown,.selNum-false .rdr-page-selector-keys div.shown:hover{color:transparent;text-shadow:none}.rdr-page-selector-keys div.shown{padding-bottom:2px;margin-bottom:0}.rdr-page-selector-counter{display:none}.hide-side{position:absolute;top:0;right:0;top:unset!important;z-index:500;width:3rem}.hide-side div{top:unset!important}.hide-side div:after{content:"";transform:scaleX(-1);position:relative;bottom:.5rem;left:.6rem}.hide-side div:before{content:"";position:absolute;width:0;height:0;border-style:solid;border-width:0 3rem 3rem 0;border-color:transparent var(--sidebarColDark) transparent transparent}.hide-side:hover div:before{border-color:transparent var(--prevCol) transparent transparent}.zoom-level{top:0;flex-direction:column;overflow:hidden;right:24px;padding:2rem 3.5rem;opacity:.01;transition:opacity .3s ease;position:absolute;-webkit-user-select:none;user-select:none;display:none}.fit-width .zoom-level,.fit-width_limit .zoom-level{display:block}@keyframes zoomFlash{0%{opacity:0;padding:2rem 0rem}10%{opacity:1;padding:2rem 3.5rem}70%{opacity:1}to{opacity:0}}.zoom-level .ico-btn{background:var(--sidebarCol);width:3rem;height:3rem;border-top-left-radius:4px;border-top-right-radius:4px}.zoom-level .ico-btn:last-child{width:3rem;height:3rem;border-radius:0 0 4px 4px;margin-top:-1px}.zoom-level .ico-btn:hover{background:var(--sidebarColDark)}.fit-width .zoom-level:hover,.fit-width_limit .zoom-level:hover{opacity:1!important;animation-play-state:paused}.Tooltippy{position:absolute;padding:.4em .8em;background:var(--sidebarColFocus);border-radius:2px;box-shadow:2px 2px 3px #00000080;z-index:3000;font-size:11px;pointer-events:none;display:none}.Tooltippy.Error{border:1px solid rgb(230,60,60)}.Tooltippy .Tooltippy-key{display:inline-block;border:1px solid rgba(255,255,255,.2);padding:.1em .2em;min-width:1em;text-align:center;border-radius:2px;font-family:monospace}.Tooltippy .Tooltippy-key:first-of-type{margin-left:1ch}.FauxDrop{position:relative;display:flex}.FauxDrop select{position:absolute;width:100%;left:0;top:0;bottom:0;opacity:0}#rdr-vol,#rdr-chap{opacity:0}.FauxDrop label{display:flex;flex-grow:1;align-items:center;pointer-events:none}.LodaManager{inset:0;z-index:2000;display:flex;overflow:auto;position:fixed;will-change:transform;background:#0009;justify-content:center;align-items:flex-start;flex-direction:row;flex-wrap:wrap}.LodaManager:after{content:"";display:block;padding:5vh 0;min-width:100%}.Loda{display:flex;flex-direction:column;background:var(--prevCol);border-radius:4px;position:relative;box-shadow:0 4px 7px 3px #0000004d;margin-top:10vh;min-width:40vw}.Loda .close{position:absolute;right:0;top:0;z-index:20}.Loda header{display:flex;min-width:10rem;padding:0 4rem 0 1rem;font-size:.8rem;text-transform:uppercase;align-items:center;min-height:3rem;font-weight:600;letter-spacing:.04ch;color:var(--textCol)}.Loda_Search content{padding:0 .8em .8em}.Loda_Search input{background:#ffffff1a;width:100%;height:3rem;line-height:3rem;padding:0 1rem;box-sizing:border-box;border:none;font-size:1.2rem;color:var(--textCol);box-shadow:0 4px 8px var(--blackLight)}.Loda_Search input::-webkit-input-placeholder,.Loda_Search input::-moz-placeholder,.Loda_Search input:-ms-input-placeholder,.Loda_Search input:-moz-placeholder,.Loda_Jump input::-webkit-input-placeholder,.Loda_Jump input::-moz-placeholder,.Loda_Jump input:-ms-input-placeholder,.Loda_Jump input:-moz-placeholder{font-family:guya;opacity:.5}.Loda_Search .list{padding:1rem 0 0}.Loda_Search .list:empty{padding:0}.Loda.Loda_Jump{max-width:35ch;min-width:27ch;margin-top:0;align-self:center}.Loda_Jump .close{right:auto;top:-3rem;text-shadow:0px 1px 3px black}.Loda_Jump header{display:none}.Jump-Wrapper{display:flex;justify-content:stretch;height:3.5rem;align-items:stretch;align-content:stretch;border-radius:4px;overflow:hidden}.Loda_Jump input::placeholder{font-size:.7em}.Loda_Jump input{background:#ffffff1a;width:0%;text-align:center;line-height:2.5rem;padding:0 1rem;box-sizing:border-box;border:none;font-size:1.4rem;color:rgba(var(--textCol),.9);box-shadow:0 3.5px 6px #0003;flex-grow:1;height:auto;font-family:Open Sans}.Loda_Jump input:focus{outline:none;border:none}.Loda_Jump input:first-child{border-bottom-left-radius:4px;border-top-left-radius:4px}.Loda_Jump .Button{display:inline-block;color:#333;box-shadow:0 3.5px 6px #0003;font-family:Open Sans;height:auto;font-size:1.5em;color:var(--accentCol)}.Loda_Password{min-width:min(34rem,calc(100vw - 2rem));max-width:34rem}.Loda_Password .password-dialog-content{display:flex;flex-direction:column;gap:1.2rem;padding:0 1rem 1rem}.Loda_Password .password-field{display:flex;flex-direction:column;gap:.5rem}.Loda_Password .password-field span,.Loda_Password .password-methods legend{color:var(--textCol);font-size:.78rem;font-weight:600;text-transform:uppercase}.Loda_Password .password-field input{background:#ffffff1a;border:1px solid var(--borderColor);border-radius:4px;box-shadow:0 4px 8px var(--blackLight);color:var(--textCol);font-family:Open Sans;font-size:1rem;height:2.8rem;padding:0 .85rem}.Loda_Password .password-methods{border:0;margin:0;padding:0}.Loda_Password .password-method-grid{display:grid;gap:.8rem;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:.6rem}.Loda_Password .password-method-card{background:var(--sidebarColDark);border:1px solid var(--borderColor);border-radius:4px;cursor:pointer;display:flex;flex-direction:column;gap:.35rem;min-height:11rem;padding:.7rem;position:relative}.Loda_Password .password-method-card[data-selected=true]{border-color:var(--accentCol);box-shadow:0 0 0 1px var(--accentCol)}.Loda_Password .password-method-card input{height:1rem;margin:0;position:absolute;right:.7rem;top:.7rem;width:1rem}.Loda_Password .password-method-illustration{align-items:center;background:var(--sidebarColFocus);border:1px solid rgba(255,255,255,.1);border-radius:4px;display:flex;min-height:5.2rem;width:100%;overflow:hidden;position:relative;transition:border-color .25s cubic-bezier(.4,0,.2,1),box-shadow .25s cubic-bezier(.4,0,.2,1)}.Loda_Password .password-method-card:hover .password-method-illustration{border-color:#ffffff40;box-shadow:0 0 10px #0000004d}.Loda_Password .password-method-card[data-selected=true] .password-method-illustration{border-color:var(--accentCol)}.Loda_Password .password-method-illustration svg{display:block;height:100%;width:100%}.Loda_Password .password-method-illustration .center-symbol{transform-origin:center;transition:transform .3s cubic-bezier(.175,.885,.32,1.275)}.Loda_Password .password-method-card:hover .center-symbol{transform:translate(80px,40px) scale(1.1)}.Loda_Password .password-method-card:hover .center-symbol circle:first-of-type{opacity:.3}.Loda_Password .password-method-illustration .scramble-slices rect{transition:transform .2s ease}@keyframes jitter-s1{0%,to{transform:translate(0)}20%{transform:translate(-3px)}40%{transform:translate(1px)}60%{transform:translate(-1px)}80%{transform:translate(2px)}}@keyframes jitter-s2{0%,to{transform:translate(0)}15%{transform:translate(2px)}35%{transform:translate(-2px)}55%{transform:translate(4px)}75%{transform:translate(-1px)}}@keyframes jitter-s3{0%,to{transform:translate(0)}25%{transform:translate(-4px)}50%{transform:translate(3px)}75%{transform:translate(-2px)}}@keyframes jitter-s4{0%,to{transform:translate(0)}10%{transform:translate(4px)}30%{transform:translate(-1px)}50%{transform:translate(2px)}70%{transform:translate(-3px)}90%{transform:translate(1px)}}@keyframes jitter-s5{0%,to{transform:translate(0)}30%{transform:translate(-2px)}60%{transform:translate(2px)}90%{transform:translate(-4px)}}.Loda_Password .scramble-slice-1{animation:jitter-s1 2.5s infinite steps(2)}.Loda_Password .scramble-slice-2{animation:jitter-s2 3.1s infinite steps(1)}.Loda_Password .scramble-slice-3{animation:jitter-s3 1.9s infinite steps(2)}.Loda_Password .scramble-slice-4{animation:jitter-s4 2.7s infinite steps(1)}.Loda_Password .scramble-slice-5{animation:jitter-s5 3.5s infinite steps(2)}.Loda_Password .password-method-card:hover .scramble-slice-1{animation-duration:.8s}.Loda_Password .password-method-card:hover .scramble-slice-2{animation-duration:.6s}.Loda_Password .password-method-card:hover .scramble-slice-3{animation-duration:.7s}.Loda_Password .password-method-card:hover .scramble-slice-4{animation-duration:.5s}.Loda_Password .password-method-card:hover .scramble-slice-5{animation-duration:.9s}.Loda_Password .password-method-title{color:var(--textCol);font-size:1rem;font-weight:700;padding-right:1.5rem}.Loda_Password .password-method-description{color:#ffffffa8;font-size:.78rem;line-height:1.4}.Loda_Password .password-actions{align-items:center;display:grid;gap:.6rem;grid-template-columns:auto 1fr auto auto}.Loda_Password .password-actions .ResetButton{margin-top:0;min-height:2.15rem}.Loda_Password .password-confirm{background:var(--accentCol);color:#111}.Loda_Password .password-field input:focus-visible,.Loda_Password .password-method-card:focus-within,.Loda_Password .ResetButton:focus-visible{outline:2px solid var(--accentCol);outline-offset:2px}@media(max-width:480px){.Loda_Password .password-method-grid{grid-template-columns:1fr}.Loda_Password .password-actions{grid-template-columns:1fr 1fr}.Loda_Password .password-actions span{display:none}}.Loda_Settings{margin-right:auto;margin-left:8rem;flex-direction:row;align-content:stretch;-webkit-user-select:none;user-select:none;min-width:31.2rem}.Loda_Settings aside{width:11.2rem;background-color:var(--sidebarColDark);padding-bottom:2rem}.Loda_Settings content{padding-bottom:2rem;min-width:20rem;max-width:30rem}.Loda_Settings .Tab{padding:.5rem 1rem;font-size:.9em}.Loda_Settings .Tab:hover{background:#ffffff26;cursor:default}.Loda_Settings .Tab.is-active{background:var(--sidebarColFocus);padding:.5rem 1rem;font-size:.9em}.Loda_Settings .Tab .ico-btn{display:none}.Loda_Settings .setting-wrapper{padding:.3rem 1rem 1.2rem;border-bottom:1px solid rgba(0,0,0,.3)}.Loda_Settings .setting-wrapper:last-child{border-bottom:none}.Loda_Settings .setting-header{padding:0;min-height:2.5rem;padding-top:.5rem;color:var(--textCol)}.Loda_Settings .t-row{margin:0 0 .7rem}.Loda_Settings .ico-btn{font-size:17.8px}.compact.setting-wrapper{padding:.5rem 1rem;display:flex}.Loda_Settings .setting-header{padding-top:0}.compact .UI.SettingDisplay{align-items:center;align-content:center;display:flex;flex-grow:1;justify-content:flex-end}.SettingUnit.compact .ToggleButton>*{display:none}.SettingUnit.compact .ToggleButton:before{content:"";display:inline-block;font-family:Guya;font-size:1.7em;line-height:0;margin-right:-.2em}.SettingUnit.compact .ToggleButton:last-child:before{content:""}.SettingUnit.compact .t-1{flex-grow:0;margin-left:1rem}.SettingUnit.compact .ButtonGroup{margin-bottom:0}.IndexSearch:empty:before{content:"Type your query and press Enter to search the entire manga contents.";width:100%;display:flex;padding:1rem 4rem;text-align:center;opacity:.5;box-sizing:border-box}.ChapterUnit{display:flex;flex-grow:1;justify-content:flex-start;align-items:stretch;margin-bottom:.8rem;border-radius:3px;overflow:hidden;border:1px solid transparent;cursor:pointer}.ChapterUnit:last-child{margin-bottom:0}.ChapterUnit:hover{border:1px solid #393939;background:#0000004d}.ChapterUnit figure{flex-grow:0;max-width:3rem;min-width:3rem;margin-right:.2rem;background-size:cover;background-position:center center}.ChapterUnit content{display:flex;flex-direction:column;font-size:1rem;padding:.8em}.ChapterUnit h2{font-size:1.2em;padding-bottom:.5em}.ChapterUnit blockquote:before{color:#ffffff1a;font-size:.8rem}.ChapterUnit .pages div{display:inline-block;border:1px solid rgba(255,255,255,.2);padding:.1em .2em;min-width:1em;text-align:center;border-radius:2px;font-family:monospace;margin-right:.4rem}.ChapterUnit .pages div:hover{background:#ffffff80;color:#000}.ChapterUnit i{color:var(--accentCol);text-decoration:none;font-style:normal}.Loadable{position:relative}.Loadable:after{content:"Loading...";position:absolute;top:50%;left:50%;transform:translate(-50%) translateY(-50%);display:flex;width:10rem;max-width:100%;height:5rem;background-position:left center;background-repeat:no-repeat;background-size:contain;display:none}.Loadable.loading:after{min-height:6rem;display:flex;background-image:url(data:image/png;base64,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);animation:weewoo 1s infinite}@keyframes weewoo{0%{transform:translate(-50%),translateY(-50%) scale(1) rotate(0)}20%{transform:translate(-50%) translateY(-50%) scale(1.2) rotate(10deg)}50%{transform:translate(-50%) translateY(-50%) scale(1) rotate(0)}75%{transform:translate(-50%) translateY(-50%) scale(1.2) rotate(-10deg)}to{transform:translate(-50%) translateY(-50%) scale(1) rotate(0)}}.search-tabs{display:flex;width:100%;justify-content:stretch;align-items:center;margin-top:.5rem}.search-tabs .Tab{flex-grow:1;display:flex;align-items:center;justify-content:center;padding:.5rem 0;font-size:.8em;cursor:default;border-bottom:1px solid transparent}.search-tabs .Tab:hover{border-bottom:1px solid rgba(255,255,255,.2)}.search-tabs .Tab.is-active{border-bottom:1px solid var(--accentCol, .8)}.search-tabs .Tab i{font-style:normal;font-weight:400;display:inline-block;padding:.1em .3em;border:1px solid gray;border-radius:3px;font-size:.8em;margin-left:1em;text-align:center;min-width:2ch}.search-tabs .Tab i:empty{display:none}.rdr-aside-overlay{position:absolute;top:0;bottom:0;width:100%;background:#000000b3;z-index:100;display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;padding:1rem;box-sizing:border-box;cursor:pointer}.card-arrow-up{width:0;height:0;border-style:solid;border-width:0 .6em .6em .6em;border-color:transparent transparent #3a3f40 transparent}.rdr-aside-overlay:before{content:"×";font-family:Open Sans;font-size:1.5em;height:2em;width:1.7em;font-weight:700;text-shadow:0px 1px 2px rgba(0,0,0,.4);display:flex;justify-content:center;align-items:center;cursor:pointer;align-self:flex-start}.rdr-aside-view{cursor:default;padding:.5rem 1rem;background:var(--sidebarCol);border-radius:3px;position:relative;box-shadow:0 4px 7px 3px #0006}.zoom-level.refresh-chapter{will-change:transform;flex-direction:row;display:flex;bottom:10px;top:unset;right:20px;left:unset;opacity:1}.zoom-level.refresh-chapter .ico-btn{border-radius:4px;background:#c83200b3}.refresh-chapter-note{background:#000c;margin-right:6px;padding:.5em .7em;font-size:1rem;color:#fff;opacity:0;border-radius:4px;transition:opacity .2s ease}.zoom-level.refresh-chapter:hover .refresh-chapter-note{opacity:1}.rdr-aside-view .header{text-align:left;padding:.5em 0;font-size:.6em;text-transform:uppercase;font-weight:700}.rdr-aside-view .ToggleButton{flex-grow:1;text-align:center}.t-row{display:flex;justify-content:flex-end;flex-wrap:nowrap;width:100%;margin:.7rem 0}.t-row>div{display:flex;align-items:stretch}.t-0{flex-grow:0}.t-1{flex-grow:1}.t-tooltip{display:flex;flex-basis:5em;font-size:12px;align-items:center!important;padding-right:.4em}.ToggleButton{display:inline-block;padding:.5em 1.4em .5em 1em;line-height:1;font-size:.59em;line-height:1.2;cursor:default;-webkit-user-select:none;user-select:none;text-align:center;display:flex;justify-content:center;align-items:center;background:var(--blackLight);min-height:1.1rem;flex-grow:1;border-left:1px solid var(--borderColor);border-top:1px solid var(--borderColor);margin-top:-1px;margin-left:-1px}.ToggleButton.s{background:var(--accentCol);color:var(--accentSelected)}.ToggleButton.s .ico-btn{color:var(--accentSelected)}.ButtonGroup .t-1{flex-wrap:wrap;max-width:99.499%;border:1px solid var(--borderColor);border-radius:3px;overflow:hidden}.ButtonGroup.b4 .ToggleButton{flex-basis:30%}.ButtonGroup .Button .ico-btn{padding:0 .4em 0 0;height:auto;width:auto;pointer-events:none;transition:none}.s .ico-btn{color:#333}.selectorAnchor-bottom .rdr-page-selector{min-width:unset;margin-right:unset;position:fixed;will-change:transform;width:100vw;height:1px;min-height:3rem;bottom:0;background:linear-gradient(0deg,var(--blackFlag) 10%,rgba(0,0,0,0) 100%);top:unset!important}.selectorAnchor-bottom .rdr-page-selector:hover .rdr-page-selector-keys,.selectorAnchor-bottom .rdr-page-selector.vis .rdr-page-selector-keys,.selectorAnchor-bottom.selPinned-true .rdr-page-selector-keys{left:unset;bottom:3px}.selectorAnchor-bottom .rdr-page-selector-counter{position:absolute;width:100%;height:2.2rem;bottom:-3px;font-size:.7rem;display:flex;justify-content:center;align-items:flex-start;color:#fff;text-shadow:1px 1px 1px black,-1px -1px 1px black,1px -1px 1px black,-1px 1px 1px black,1px 1px 6px black;transition:all .3s ease}.selectorAnchor-bottom.selPinned-true.selNum-false .rdr-page-selector-counter{opacity:0}.selNum-false .rdr-page-selector-counter{display:none!important}.selectorAnchor-bottom .rdr-page-selector:hover .rdr-page-selector-counter,.selectorAnchor-bottom .rdr-page-selector.vis .rdr-page-selector-counter,.selectorAnchor-bottom.selPinned-true .rdr-page-selector-counter{bottom:0}.selectorAnchor-bottom .rdr-page-selector-keys{height:unset;width:100%;height:100%;flex-direction:row;left:unset;bottom:0}.selectorAnchor-bottom .rdr-page-selector-keys div{margin-right:1px;margin-bottom:unset;border-left:none;border-bottom:1.5px solid #555;text-align:center;font-size:3vw;min-width:0px;align-items:flex-start;justify-content:center;padding-left:0;font-size:0;padding-bottom:1em}.selectorAnchor-bottom .rdr-page-selector-keys div:before{content:"";display:block;position:absolute;vertical-align:middle;margin-right:1.4ch;height:3px;width:100%;left:0;bottom:-4px}.selectorAnchor-bottom .rdr-page-selector-keys div:after{content:"";display:block;height:100%;width:102%;position:absolute}.selectorAnchor-bottom .rdr-page-selector-keys div:hover{border-left:none;border-bottom:1px solid lightgray;box-shadow:0 -100px 20px -100px #fffc inset,0 -100px 20px -100px #00000080 inset;left:0;bottom:2px}.selectorAnchor-bottom .rdr-page-selector-keys div.shown{border-left:none;border-bottom:3.5px solid var(--accentCol);box-shadow:0 -100px 20px -80px var(--rdrAncBottomWhite) inset}.selectorAnchor-bottom .rdr-page-selector-keys div.shown:hover{bottom:0!important}.selectorAnchor-bottom .rdr-page-selector .preloaded{border-bottom-color:var(--accentCol)}@media(min-width:699px){.sidebar-false main>aside{margin-left:-16em}.rdr-aside-buffer{display:none}.selectorAnchor-left.sidebar-false .rdr-page-selector{height:calc(100vh - 3rem);height:calc(100dvh - 3rem);top:3rem}.sidebar-false .hide-side{right:-3rem;z-index:20;transform:scaleX(-1)}.sidebar-false .hide-side div:hover:before{filter:brightness(110%)}.fit-width.zoom-10 .ReaderImageWrapper img{max-width:10%;min-height:0}.fit-width_limit.zoom-10 .ReaderImageWrapper img{max-width:10%}.fit-width.zoom-20 .ReaderImageWrapper img{max-width:20%;min-height:0}.fit-width_limit.zoom-20 .ReaderImageWrapper img{max-width:20%}.fit-width.zoom-30 .ReaderImageWrapper img{max-width:30%;min-height:0}.fit-width_limit.zoom-30 .ReaderImageWrapper img{max-width:30%}.fit-width.zoom-40 .ReaderImageWrapper img{max-width:40%;min-height:0}.fit-width_limit.zoom-40 .ReaderImageWrapper img{max-width:40%}.fit-width.zoom-50 .ReaderImageWrapper img{max-width:50%;min-height:0}.fit-width_limit.zoom-50 .ReaderImageWrapper img{max-width:50%}.fit-width.zoom-60 .ReaderImageWrapper img{max-width:60%;min-height:0}.fit-width_limit.zoom-60 .ReaderImageWrapper img{max-width:60%}.fit-width.zoom-70 .ReaderImageWrapper img{max-width:70%;min-height:0}.fit-width_limit.zoom-70 .ReaderImageWrapper img{max-width:70%}.fit-width.zoom-80 .ReaderImageWrapper img{max-width:80%;min-height:0}.fit-width_limit.zoom-80 .ReaderImageWrapper img{max-width:80%}.fit-width.zoom-90 .ReaderImageWrapper img{max-width:90%;min-height:0}.fit-width_limit.zoom-90 .ReaderImageWrapper img{max-width:90%}.fit-width.zoom-10 .two-page.ReaderImageWrapper img{max-width:25%!important;min-height:0}.fit-width_limit.zoom-10 .two-page.ReaderImageWrapper img{max-width:25%!important}.fit-width.zoom-20 .two-page.ReaderImageWrapper img{max-width:25%!important;min-height:0}.fit-width_limit.zoom-20 .two-page.ReaderImageWrapper img{max-width:25%!important}.fit-width.zoom-30 .two-page.ReaderImageWrapper img{max-width:25%!important;min-height:0}.fit-width_limit.zoom-30 .two-page.ReaderImageWrapper img{max-width:25%!important}.fit-width.zoom-40 .two-page.ReaderImageWrapper img{max-width:25%!important;min-height:0}.fit-width_limit.zoom-40 .two-page.ReaderImageWrapper img{max-width:25%!important}.fit-width.zoom-50 .two-page.ReaderImageWrapper img{max-width:25%!important;min-height:0}.fit-width_limit.zoom-50 .two-page.ReaderImageWrapper img{max-width:25%!important}.fit-width.zoom-60 .two-page.ReaderImageWrapper img{max-width:30%!important;min-height:0}.fit-width_limit.zoom-60 .two-page.ReaderImageWrapper img{max-width:30%!important}.fit-width.zoom-70 .two-page.ReaderImageWrapper img{max-width:35%!important;min-height:0}.fit-width_limit.zoom-70 .two-page.ReaderImageWrapper img{max-width:35%!important}.fit-width.zoom-80 .two-page.ReaderImageWrapper img{max-width:40%!important;min-height:0}.fit-width_limit.zoom-80 .two-page.ReaderImageWrapper img{max-width:40%!important}.fit-width.zoom-90 .two-page.ReaderImageWrapper img{max-width:45%!important;min-height:0}.fit-width_limit.zoom-90 .two-page.ReaderImageWrapper img{max-width:45%!important}}@media(max-width:700px){main{flex-direction:column;height:auto;max-height:unset;max-height:auto;overflow:auto}main>aside{min-width:100%;height:auto;position:relative;flex-shrink:0;transition:none}main>aside>header{overflow-y:auto;max-height:3rem}.rdr-aside-overlay{position:fixed;justify-content:flex-start;will-change:transform}.rdr-aside-overlay:before{align-self:flex-end}.rdr-previews{display:none}.rdr-page-selector{min-width:unset;margin-right:unset;position:fixed;will-change:transform;width:100vw;height:1px;min-height:3rem;bottom:0;background:linear-gradient(0deg,#000 10%,#0000);top:unset!important}.rdr-page-selector:hover .rdr-page-selector-keys,.rdr-page-selector.vis .rdr-page-selector-keys,.selPinned-true .rdr-page-selector-keys{left:unset;bottom:3px}.rdr-page-selector-counter{position:absolute;width:100%;height:2.2rem;bottom:-3px;font-size:.7rem;display:flex;justify-content:center;align-items:flex-start;color:#fff;text-shadow:1px 1px 1px black,-1px -1px 1px black,1px -1px 1px black,-1px 1px 1px black,1px 1px 6px black;transition:all .3s ease}.selPinned-true.selNum-false .rdr-page-selector-counter{opacity:0}.rdr-page-selector:hover .rdr-page-selector-counter,.rdr-page-selector.vis .rdr-page-selector-counter,.selPinned-true .rdr-page-selector-counter{bottom:0}.rdr-page-selector-keys{height:unset;width:100%;height:100%;flex-direction:row;left:unset;bottom:0}.rdr-page-selector-keys div{margin-right:1px;margin-bottom:unset;border-left:none;border-bottom:1px solid #555;text-align:center;font-size:3vw;min-width:0px;align-items:flex-start;justify-content:center;padding-left:0;font-size:0;padding-bottom:1em}.rdr-page-selector-keys div:before{content:"";display:block;position:absolute;vertical-align:middle;margin-right:1.4ch;height:3px;width:100%;left:0;bottom:-4px}.rdr-page-selector-keys div:after{content:"";display:block;height:100%;width:102%;position:absolute}.rdr-page-selector-keys div:hover{border-left:none;border-bottom:1px solid lightgray;box-shadow:0 -100px 20px -100px #ffffff80 inset,0 -100px 20px -100px #000 inset;left:0;bottom:2px}.rdr-page-selector-keys div.shown{border-left:none;border-bottom:1px solid white;box-shadow:0 -100px 20px -100px #fff inset}.rdr-page-selector-keys div.shown:hover{bottom:0!important}.rdr-page-selector .preloaded{border-bottom-color:var(--accentCol)}.rdr-groups{margin-top:0rem}.rdr-selector{padding-bottom:.5rem}.rdr-aside-buffer{transition:none}.selPinned-true.direction-ttb .stick header{width:100%;position:fixed;will-change:transform;z-index:100;background:var(--sidebarCol);top:0}.selPinned-true.direction-ttb .stick .rdr-selector{width:100%;position:fixed;will-change:transform;z-index:100;background:var(--sidebarCol)}.rdr-image-wrap{height:auto;max-height:100vh;max-height:100dvh;min-height:100vh;min-height:100dvh}.direction-ttb .rdr-image-wrap{max-height:unset;overflow-y:hidden}.direction-ttb.fit-all_limit .ReaderImageWrapper img,.direction-ttb.fit-all .ReaderImageWrapper img{height:unset}.hide-side{display:none!important}.fit-width div.zoom-level{display:none}.fit-width .ReaderImageWrapper img{flex-grow:1}.Tooltippy{position:fixed;will-change:transform;top:30vh;bottom:unset!important;font-size:.9rem;text-align:center;max-width:80vw;border:1px solid rgba(255,255,255,.1);border-radius:3px}.Tooltippy .Tooltippy-key{display:none}.Loda{min-width:96vw!important;max-width:96vw!important}.refresh-chapter{position:fixed;bottom:unset;top:0;right:.5rem;padding:0;align-items:flex-start;z-index:200}.refresh-chapter .ico-btn{font-size:.8em;height:2em;width:2em;border-top-left-radius:0;border-top-right-radius:0}main>.zoom-level{display:none!important}.Loda_Settings{width:100%;margin:0 1rem;height:57vh;flex-direction:column-reverse}.Loda_Settings aside{display:flex;width:auto;padding:0;flex-shrink:1;flex-grow:0}.Loda_Settings aside header{display:none}.Loda_Settings content{font-size:110%;max-width:100%;flex-grow:1;overflow:auto}.Loda_Settings content>div{padding-bottom:.5rem}.Loda_Settings .close{position:static;order:100;margin-left:auto}.Loda_Settings .settings-tabs{display:flex}.Loda_Settings .IconTab{padding:0!important;display:flex;justify-content:center;align-items:center;font-size:16px}.IconTab>span{display:none}.IconTab .ico-btn{display:flex!important}.IconTab[data-name=Reader] .ico-btn:before{content:""}.IconTab[data-name=Behavior] .ico-btn:before{content:""}.IconTab[data-name=Layout] .ico-btn:before{content:""}.IconTab[data-name=Themes] .ico-btn:before{content:""}.IconTab[data-name=Advanced] .ico-btn:before{content:""}.IconTab[data-name=About] .ico-btn:before{content:""}.nomobile{display:none!important}.Loda_Settings{align-self:flex-end;order:100;margin-bottom:5vh}}.preload-entity{opacity:.0000000000001;z-index:-1;position:absolute;width:100vw;height:100vw;overflow:hidden;top:0;left:0;pointer-events:none}.preload-entity img{height:100%;position:absolute;right:0;display:inline-block}.disabled{opacity:.2;pointer-events:none}.nextCha{opacity:.5;color:#fff;min-height:5rem;display:flex;min-width:80%;max-width:80%;margin:0 auto;justify-content:center;align-items:center;margin-top:2rem;margin-bottom:4rem;border:2px dashed rgba(255,255,255,.4);box-sizing:border-box}.nextCha:hover{opacity:.7;background:#ffffff1a}.nextCha:before{content:"Next chapter"}.nextCha:after{content:"⮠";font-family:Guya;margin-left:1em;border:1px solid gray;border-radius:3px;padding:.1rem .4rem;position:relative;top:1px}.last-chapter .nextCha{display:none}input[type=range]{-webkit-appearance:none;width:100%;height:2rem;background:none;border-radius:4px;margin:0;position:relative;z-index:1}input[type=range]:focus{outline:none}input[type=range]::-webkit-slider-runnable-track{width:100%;background:var(--blackLight);border-radius:1.3px;border:.2px solid var(--borderColor);height:.2rem}input[type=range]::-webkit-slider-thumb{border:1px solid var(--borderColor);height:1.4rem;width:.6rem;margin-top:-.65rem;border-radius:3px;cursor:pointer;background:var(--accentCol);-webkit-appearance:none}input[type=range]::-moz-range-track{width:100%;background:var(--blackLight);border-radius:1.3px;border:.2px solid var(--borderColor)}input[type=range]::-moz-range-thumb{border:1px solid var(--borderColor);height:1.4rem;width:.6rem;border-radius:3px;cursor:pointer;background:var(--accentCol)}input[type=range]::-ms-track{width:100%;height:8.4px;cursor:pointer;animate:.2s;background:transparent;border-color:transparent;border-width:16px 0;color:transparent}input[type=range]::-ms-track{width:100%;height:.3rem;cursor:pointer;background:transparent;border-color:transparent;border-width:1px 0;color:transparent}input[type=range]::-ms-fill-lower{background:var(--blackLight);border:.2px solid var(--borderColor);border-radius:2.6px}input[type=range]::-ms-fill-upper{background:#0003;border:.2px solid #010101;border-radius:2.6px}input[type=range]::-ms-thumb{border:1px solid var(--borderColor);height:1.4rem;width:.5rem;border-radius:3px;background:var(--accentCol);cursor:pointer}.Slider input[type=text]::-webkit-inner-spin-button,.Slider input[type=text]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.Slider input[type=text]{-moz-appearance:textfield;border-radius:3px;display:inline-block;line-height:1;font-size:.7em;line-height:1.2;border:1px solid var(--borderColor);background:#0000001a;min-height:1.1rem;min-width:0px;max-width:10rem;color:var(--textCol);padding:0 .5em;text-align:center;height:1.8rem;margin-left:.5rem}.Slider{display:flex}.Slider .slider-wrap{flex-grow:1}.Slider .ticks{display:flex;justify-content:space-between;padding:0 .4rem 0 .3rem}.Slider .ticks i{width:0;display:inline-flex;justify-content:center;flex-grow:0;flex-shrink:1;font-style:normal;color:var(--textCol);font-size:.6rem;position:relative;margin:0 2ch;opacity:.7}.Slider .ticks i:last-child{margin-right:0}.Slider .ticks i:first-child{margin-left:0}.Slider .ticks i:before{content:"";display:block;height:.9rem;margin-top:-1.75rem;position:absolute;border-right:1px solid var(--borderColor);z-index:0}.Slider .slider-value{flex-basis:6ch}.hidden,.is-hidden{display:none!important}.About{display:flex;flex-direction:column;align-items:center;font-size:.8em}.About>*{margin-left:auto;margin-right:auto}.About img{height:3.3rem;padding:2rem 0 1rem}.muted{opacity:.5;font-size:.8em}.About hr{border:none;border-bottom:1px solid rgba(0,0,0,.3);width:100%}.About p{padding:.2rem;font-size:.9em}.About a{color:var(--accentCol);text-decoration:none;padding:.3em}.cubari{height:1em;width:100%;margin-top:.5rem;position:relative;font-size:6rem}.cubari:after{content:"";background:url(data:image/webp;base64,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);height:1em;width:1em;background-size:contain;background-position:center;background-repeat:no-repeat;display:block;position:absolute;top:0;display:inline-block;margin:auto;left:50%;transform:translate(-50%)}.cubari>div{height:1em;width:1em;background-size:contain;background-position:50% 50%;background-repeat:no-repeat;position:relative;margin:auto}.ReaderNotice{display:flex;-webkit-user-select:none;user-select:none;object-fit:contain;min-width:100%;min-height:100%;height:100%;flex-direction:column;justify-content:center;align-items:center;padding:1rem;text-align:center;box-sizing:border-box}.ReaderNotice h2{font-size:1.5em;margin-bottom:1rem}.ReaderNotice p{color:#999}.ReaderNotice .timer{border-top:1px solid rgba(255,255,255,.3);margin-top:.5rem;padding-top:.5rem;margin-bottom:.6rem;text-align:center}.ReaderNotice .timer:after{content:unset;display:block;text-align:center;font-size:.7rem;color:#999;margin-top:.4em}.ReaderNotice a{color:var(--accentCol);text-decoration:none;font-size:.9em;margin-top:.8em;display:inline-block;border:1px solid var(--borderColor);border-radius:4px;padding:.4em 1em}.ReaderNotice a:hover{background:var(--accentCol);color:var(--accentSelected)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}.ColorPicker{display:block;width:2em;height:2em;outline:none!important;border:1px solid rgba(0,0,0,.3);border-radius:4px;color:transparent;box-shadow:0 0 0 1px inset #fff6;cursor:pointer;-webkit-user-select:none;user-select:none}body,button,button:before{text-shadow:var(--rescueShade)}.ResetButton{margin-top:1em;font-size:12px;text-align:center;text-transform:uppercase;letter-spacing:.07em;font-family:Open Sans;text-shadow:var(--rescueShade);border:1px solid var(--borderColor);border-radius:2px;overflow:hidden;box-shadow:0 2px 3px -1px #0000004d;color:var(--textCol);background-color:var(--sidebarColDark);padding:.4rem 1.6rem}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-chooser{grid-area:2/1/2 / span 2!important}.pcr-app[data-theme=nano] .pcr-swatches{display:none!important}.pcr-app{background:#33383d}.pcr-app .pcr-interaction .pcr-save{background:#b2dffb}.pcr-app .pcr-interaction .pcr-cancel,.pcr-app .pcr-interaction .pcr-clear,.pcr-app .pcr-interaction .pcr-save{color:#000;font-family:Open Sans}.pcr-app .pcr-interaction input{letter-spacing:unset;font-size:.8rem;border-radius:unset;padding:unset;margin-top:unset;padding:.45em 1.1em}.pcr-app .pcr-interaction>*{margin:unset}.pcr-app .pcr-interaction{margin:unset;align-items:stretch;overflow:hidden;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.pcr-app[data-theme=nano] .pcr-interaction{padding:unset;height:2.1rem;margin-bottom:-5px}.pcr-app .pcr-interaction .pcr-result{border-radius:unset;background:#292d31;color:#eee;outline:none!important;box-shadow:none!important}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-palette .pcr-palette{border-radius:unset;border-top-left-radius:4px;border-top-right-radius:4px}.pcr-app[data-theme=nano] .pcr-selection .pcr-color-chooser,.pcr-app[data-theme=nano] .pcr-selection .pcr-color-opacity{margin:.2em .8em}.dropbtn{background-color:var(--blackLight);color:var(--textCol);height:2.2em;min-width:165px;font-family:Open Sans;display:flex;justify-content:space-between;align-items:center;padding:0 11px;border:1px solid var(--borderColor);border-radius:4px;cursor:initial;outline:none!important}.input-container{display:flex}.arrd{height:4px;width:4px}.arrd:after{position:relative;left:-25px;bottom:-2px;font-family:Guya;font-size:20px;content:""}.dropdown{position:relative;display:inline-block}.dropdown-content{margin-top:.5em;position:absolute;background-color:var(--sidebarCol);min-width:190px;overflow-x:hidden;overflow-y:auto;box-shadow:0 8px 16px #0003;border-radius:4px;z-index:1}.dropdown-content button{color:var(--textCol);padding:0 11px;min-width:190px;height:35px;display:flex;font-size:.8em;align-items:center;text-decoration:none}.dropdown-content button:not(:last-child){border-bottom:1px solid var(--sidebarColDark)}.dropdown:hover .dropbtn,.dropdown-content button:hover{background-color:var(--sidebarColDark)}.dropdown:hover .dropdown-content{display:block}.dd-s{background-color:var(--sidebarColDark)}.Loda_Notice,.Loda_Webtoon{max-width:15em}.Loda_Notice content,.Loda_Webtoon content{font-size:.8em;padding:1em;text-align:center;line-height:1.5}.Loda_Notice content~button,.Loda_Webtoon .buttons button{display:inline-block;margin:auto auto 1em;border:1px solid var(--textCol);color:var(--textCol);padding:.5em 2em;border-radius:4px}.Loda_Notice content~button:before,.Loda_Webtoon button.yes:before{content:"";display:inline-block;font-family:Guya;font-size:1.7em}.Loda_Webtoon .buttons{text-align:center;padding-bottom:1rem}.Loda_Webtoon .buttons button{margin:0 1em}.Loda_Webtoon .buttons button.no:before{content:"";display:inline-block;font-family:Guya;font-size:1.7em}.chapter-list-overlay,.mode-picker-backdrop{position:fixed;inset:0;z-index:2147483647}.chapter-list-overlay{display:flex;align-items:stretch;justify-content:center;background:linear-gradient(180deg,#000000e0,#0d0d0df5),var(--readerBg)}.chapter-list-panel{display:flex;width:min(960px,100vw);height:100vh;height:100dvh;flex-direction:column;background:linear-gradient(180deg,rgba(255,255,255,.03),transparent 18%),var(--sidebarCol);box-shadow:0 18px 48px #00000059}.chapter-list-header{display:flex;min-height:4.5rem;align-items:center;gap:1rem;padding:1rem 1.5rem;border-bottom:1px solid rgba(255,255,255,.08)}.chapter-list-header h1{margin:0;flex:1;font-size:1.15rem;font-weight:600}.chapter-list-close{display:inline-flex;width:2.5rem;height:2.5rem;align-items:center;justify-content:center;border-radius:999px;color:var(--icoCol);background:#ffffff0f;transition:background .2s ease,color .2s ease,transform .2s ease}.chapter-list-close:hover,.chapter-list-close:focus-visible{color:var(--accentSelected);background:#ffffff24;transform:translateY(-1px)}.chapter-list-items{display:flex;flex:1;flex-direction:column;overflow-y:auto}.chapter-list-row{display:flex;width:100%;flex-direction:column;gap:.35rem;padding:1rem 1.5rem;border-bottom:1px solid rgba(255,255,255,.06);color:var(--textCol);transition:background .2s ease,color .2s ease}.chapter-list-row:hover,.chapter-list-row:focus-visible{color:var(--accentSelected);background:#ffffff14}.chapter-list-name{font-size:1rem;font-weight:600}.chapter-list-meta{font-size:.78rem;color:#ffffffb3}.chapter-list-status{padding:.9rem 1.5rem 1.2rem;font-size:.82rem;color:#ffffffb3}`; const comicStyles = '.ico-btn{font-family:coobaree,guya!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-ri:before{content:">";font-size:1.6em}.icon-help:before{content:"?"}.icon-close:before{content:"×";font-size:1.5em}.icon-pin:before{content:""}.icon-pin-x:before{content:""}.icon-close:before{content:""}html *{box-sizing:border-box;font-family:Open Sans,sans-serif}a{color:#e25656;text-decoration:none!important}html{width:100%;height:100%}body{width:100%;min-height:100%;background:#050505;position:relative;color:#fff;padding:0}p{line-height:1.5}code{font-family:monospace;font-size:1.2em;margin:0 .2em}.home body{background:#1c1c1c;height:100%}.body-wrapper{width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden}.home-background,.home header .cubari-logo{display:none}.home .home-background{display:block;position:absolute;inset:0;overflow:hidden;z-index:-1}.home .home-background:before{content:"";width:300vh;height:300vh;display:block;position:absolute;top:50%;left:50%;transform-origin:50% 50%;transform:translate(-50%) translateY(-50%) rotate(14deg);box-shadow:0 0 140vh 100vh #000 inset;pointer-events:none;z-index:-1;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABBCAYAAACO98lFAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFEGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDYwLCAyMDIwLzA1LzEyLTE2OjA0OjE3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTAzLTI1VDIyOjAzKzAzOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wMy0yNVQyMjowMzo0NiswMzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0wMy0yNVQyMjowMzo0NiswMzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5NTdmNzY3NC1iODNkLTc2NDUt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)}.home #main{display:flex;flex-direction:column;align-items:center;height:100%}.home .donate{visibility:visible}header{flex-grow:0;width:100%;display:flex;justify-content:space-between;align-items:center}header>*{width:33%}header .donate{margin-left:2rem}header .cubari-logo{color:#fff;opacity:.5;font-size:3rem}header .cubari-logo:hover{opacity:1}#main>section{flex-grow:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;max-width:650px;width:100%;padding:0 1.5rem}#main .header-wrapper{display:flex;flex-direction:column;justify-content:center;align-items:center}#main .header-wrapper h1{margin-top:0;margin-right:-.7em;margin-bottom:.1rem;-webkit-user-select:none;user-select:none;font-size:3.5rem;font-weight:100;letter-spacing:.7em;text-align:center}#main .header-wrapper h2{font-weight:400;font-size:.8rem;letter-spacing:.5px;color:#888;margin-bottom:2rem;-webkit-user-select:none;user-select:none;text-align:center}.search-focus .header-wrapper{opacity:0}.search-focus .donate,.search-focus footer{opacity:0;pointer-events:none}.search-wrapper{height:50vh;margin-bottom:1.4rem;width:100%}.ico-btn{width:2.8rem;height:2.8rem;border:none;background:none;padding:0;text-align:center;color:#e25656;font-family:coobaree;display:inline-block;margin:0;line-height:2.88rem;outline:none!important}#search{border-radius:4px;border:none;height:2.8rem;line-height:2.8rem;padding:0 .8rem;width:100%;outline:none}#search+.ico-btn{margin-left:-2.8rem;cursor:pointer}#search+.ico-btn:hover:before{color:#822828}#status{text-align:center;padding-top:1.5rem;font-style:italic;line-height:1.5;font-size:.9em;opacity:.8}#status.red{color:#ff9393}.search-box{white-space:nowrap;display:flex;position:relative}.search-box .cubari-logo{font-size:30rem;position:absolute;transform:rotate(0);z-index:-1;opacity:.03;height:0;width:0;text-align:center;display:flex;justify-content:center;align-items:center;top:50%;left:50%;margin-right:-100%;margin-bottom:-100%;transition:transform .6s ease}.search-box.spin .cubari-logo{transform:rotate(0);transition:none;animation:10s linear infinite spin}.rhombutton{border:1px solid rgba(255,255,255,.4);border-radius:2px;margin:2rem;transform:rotate(45deg);height:2.5rem;width:2.5rem;display:inline-flex;justify-content:center;align-items:center;background:#000;font-family:Open Sans,coobaree,guya}.rhombutton:before{transform:rotate(-45deg)}.rhombutton:hover,a:hover,a:hover span{color:#fff;border-color:#fff}.home footer{flex-grow:0;width:100%;height:5rem;margin-top:-5rem;position:relative}footer{display:flex;justify-content:space-between;padding:0 2rem;align-items:flex-start}footer a{display:inline-block;max-height:100%}.donate span{font-size:1.8em;position:relative;top:.09em;vertical-align:baseline;line-height:0}footer .guya img{width:7rem}#layers{position:fixed;top:0;left:0;right:0;max-height:100%;overflow:auto;background:#00000080}#layers article{position:relative;width:100%;max-width:50rem;margin:0 auto;background:#1c1c1cfb;padding:1rem 3rem;min-height:100vh;z-index:2}#layers article .icon-close{position:fixed;cursor:pointer;top:0;right:0;z-index:1000}article p{line-height:1.5}article h2{margin-top:2em}*{transition:opacity .25s ease}.hidden{display:none!important}.series-content{background-color:#1a1a1a;background-attachment:fixed;background-position:50% 10%;background-size:1500px;border-radius:5px;padding:0;max-width:95%;margin:0 auto;width:60rem;margin-bottom:5rem}.series-content .sidecard{background-color:#1a1a1a;background-attachment:fixed;background-position:50% 10%;background-size:1500px}.series-content .side-cover .media{border-top-left-radius:3px;overflow:hidden;border-top-right-radius:3px}.series-content article{padding:1em;display:flex}.series-content article aside{flex-grow:0;display:flex;flex-direction:column;align-items:center}.series-content article .series-content-body{min-width:7em;overflow:hidden}.series-content article .series-content-body .manga-link.chapter{margin-top:1rem;display:none}.series-content article h1{color:#fff;font-size:2em;margin-bottom:.5em;margin-top:0;display:inline;margin-right:.5em}.series-content article h2{font-size:.9em;color:#aaa;font-weight:400}.series-content article p{font-size:1em;margin-bottom:0;margin-top:.5em;font-size:.9em;color:#ccc}.series-content article p:nth-of-type(1){margin-top:1.5em}.series-content article picture{width:11em;margin-right:1.4em;border-radius:4px;overflow:hidden;margin-bottom:.5em;max-height:19em}.series-content .card{border-top-left-radius:0;border-top-right-radius:0;border:none}.series-content .card-body{padding:.7em;border-top-left-radius:0;border-top-right-radius:0}.series-content .table{color:#ddd}.series-content #chapters th{white-space:nowrap;padding:0 .75em;line-height:3em;font-weight:400;font-size:1em;border-bottom:0;border-top:0}.series-content #chapters th:first-child{padding-left:1.2rem}.series-content #chapters th:last-child{text-align:right;padding-right:1.5rem}.series-content #chapters td{border-bottom:0;border-top:1px solid #444;box-shadow:none!important;outline:none!important}.series-content #chapters td:first-child{padding-left:1.2rem}.series-content #chapters td:last-child{text-align:right;padding-right:1.5rem}.series-content #chapters a{text-decoration:none}.series-content .chapter-title a{color:#fff}.series-content .chapter-title a:hover{color:#e25656}.series-content .read-icon{text-align:center;cursor:pointer;position:relative}.series-content td.read-icon:hover{color:#eee}.series-content .read-icon:before{font-family:guya;content:""}.series-content th.read-icon.confirm:after{content:attr(data-tooltip);position:absolute;padding:.4em .6em;color:#fff;margin-left:8px;margin-top:4px;line-height:1.5em;white-space:pre-wrap;text-align:left;width:34ch;background:#141414f2;border-radius:2px;box-shadow:2px 2px 3px #000000b3,0 2px 10px #000000e6;z-index:3000;pointer-events:none;border:1px solid rgba(255,255,255,.1)}.is-read{opacity:.6}.is-read .read-icon:before,.series-content .all-read:before{content:""}.series-content .btn-group{display:flex;height:3em;width:100%}.series-content .btn-group .btn{outline:none!important;border:none!important;border-radius:0!important;box-shadow:none!important;padding:0;border-bottom:1px solid transparent!important}.series-content .btn-group .btn.s{border-bottom:1px solid #bbb!important;box-shadow:0 -34px 20px -40px #bbb inset!important;color:#fff}.series-content .btn-group .btn:not(.s):hover{box-shadow:0 -35px 20px -40px #666 inset!important;border-bottom:1px solid #666!important}.series-content .btn-group a{display:flex;justify-content:center;align-items:center;padding:0 1em;text-decoration:none}.series-content .btn-group a i{font-size:1.5em}.series-content #chapterTitleSearch{border:none!important;background:#0003!important;border-radius:0!important;line-height:inherit;height:3em;color:#fff;padding-left:1em}.series-content #chapterTitleSearch::placeholder{color:#fff;opacity:.6}.series-content .card table{margin-bottom:0}.series-content .detailed-chapter-upload-date{text-align:right;width:0;white-space:nowrap;padding-right:1.5rem}#compactView .card{background:none;padding:0}#compactView .card-title{color:#fff;padding:0 0 1em 1em;border-bottom:1px solid #555}#compactView .card .chapter-number{font-size:1.3em}#compactView .card .compact-chapter-upload-date,#compactView .card .chapter-group{color:#aaa!important}#compactView .card .row{margin:0!important}#compactView .card .col-3{padding:0!important}#compactView .card .col-3 a{text-decoration:none!important;padding:1em;display:block}#compactView .card .col-3 a:hover{background:#ffffff1a}#volumeCoversView{display:flex;flex-wrap:wrap}#volumeCoversView a{display:block;flex-grow:1;flex-shrink:1;min-width:14em;flex-basis:0;padding:1em;max-width:16em}#volumeCoversView a img{height:100%;width:100%}.img-fluid{max-width:100%;height:auto}aside .table{font-size:.8em}aside .table td,aside .table th{padding:.5em}.table{width:100%;color:#aaa;border-collapse:collapse}.table thead th{vertical-align:bottom;text-align:left}.table th,.table td{padding:.75rem;vertical-align:top;text-align:left}.table-responsive{overflow:auto}.manga-link{display:inline-block;padding:.6em 1em;border:1px solid rgba(255,255,255,.2);border-radius:.2em;text-align:center;position:relative;font-size:.8em;margin:0 1rem 0 0;-webkit-user-select:none;user-select:none;cursor:pointer}.manga-link.external{margin:1em 0 0;padding:.5em 1em;top:-.3em}.manga-link.chapter{font-size:.9rem;border-color:#f00c;background-color:#c608082e;padding:0;cursor:pointer;margin-left:0;outline:none!important;white-space:nowrap}.manga-link.chapter>span{border-color:#f00c;padding:.6em 1em;display:inline-block;color:#ddd}.manga-link.chapter .manga-link-chap{border-right:1px solid #f00c;padding:.6em .5em}.manga-link.chapter .manga-link-text{background:#0006}.manga-link.chapter.no-chapter .manga-link-chap{display:none}.manga-card{display:block;border-radius:5px;background:#141414;box-shadow:0 2px 10px #00000080;overflow:hidden;margin:0rem 0 1rem;color:#eee;background-size:cover;background-repeat:no-repeat;position:relative;font-size:1em;flex-grow:1;transform:translateZ(0)}.manga-card{min-height:9em}.manga-card picture img{height:9em}.manga-card:before{content:"";display:block;position:absolute;inset:4em;outline:2px solid rgba(0,0,0,1);background:#000;box-shadow:0 0 4em 6em #000;z-index:0;opacity:.95;background-clip:padding-box}.manga-card>*{z-index:2;position:relative}.manga-card>a.picture,.manga-card>picture{display:inline-block;float:left;margin-right:2em;z-index:4}.manga-card picture:after{content:"";position:absolute;inset:0;box-shadow:3em 3em 3em -3em #0a0a0ab3 inset}.manga-card article{padding:1em 2em 1em 1em;flex-direction:column}.manga-card article h1{font-size:2em;line-height:1.5;display:inline;margin-right:auto}.manga-card article>a:hover h1{text-decoration:underline}.manga-card article h2{font-size:.9em;color:#aaa;font-weight:400;line-height:1.5;margin-top:.5em}.manga-card article p{margin:.4em 0 0;color:#ddd;font-size:.9em}.manga-card.proxy picture img{max-width:6.5rem;min-width:6.5rem;object-fit:cover}.manga-card.smol{margin:.75rem .5rem;transition:top .3s ease;background-position:50% 30%;text-decoration:none;position:relative;top:0;outline:none;display:flex}.manga-card.smol .bloor{position:absolute;inset:-10px;background:#0f0f0f;filter:blur(20px);opacity:.3;box-shadow:none!important}.manga-card.smol:hover .bloor{opacity:.2}.manga-card.smol:hover picture{opacity:.7}.manga-card.smol h2{font-size:1.3em;color:#fff;line-height:1.5;margin-top:0}.manga-card.smol h3{font-size:1em}.manga-card.smol p{color:#ccc}.manga-card.smol picture{margin-right:1em;float:none}.manga-card.smol article{padding-top:.5em;padding-right:1em;flex-grow:1}.manga-card.smol .button-drawer{display:flex;flex-direction:column;justify-content:center;width:0;overflow:hidden}.manga-card.smol:hover .button-drawer{width:auto;min-width:3.8rem}@media(max-width:768px){.manga-card.smol .button-drawer{width:auto;min-width:3rem}}.manga-card.smol .button-drawer>i{flex-grow:1;display:flex;flex-direction:column;justify-content:center;font-size:1.4em;width:100%}.manga-card.smol .button-drawer>i:hover{background:#0003;color:#fff}.manga-card.full{flex-basis:100%;flex-shrink:1;max-width:100%}.history-scroller{overflow:hidden;padding-bottom:1em;position:relative;text-shadow:0px 0px 2px black,0px 0px 2px black,0px 0px 2px black,0px 0px 2px black,0px 0px 2px black,0px 0px 2px black;letter-spacing:3px;padding-left:3px;font-size:.9em;cursor:pointer;-webkit-user-select:none;user-select:none}.history-scroller:before{content:"";display:block;position:absolute;width:.8rem;height:.8rem;border-right:1px solid white;border-bottom:1px solid white;transform:translate(-50%) rotate(45deg);transform-origin:50% 50%;left:50%;z-index:-1;margin-top:1em}#history{padding:1rem;box-shadow:0 39px 10px -40px #000 inset;margin:0 auto}#history .history-button{margin:2rem 0 0;font-size:1.3em}#history .HistoryView .history-header{justify-content:space-between}#history .HistoryView .history-header .manga-link{font-size:.5em;margin:0;font-weight:400}#history .HistoryView>h2{padding:0 .75rem;font-weight:400;font-size:1.9em}#history .HistoryView .pinned-header,#history .HistoryView .pinned,#history .HistoryView .history-header,#history .HistoryView .history{display:none}#history .HistoryView.has-pinned .pinned-header,#history .HistoryView.has-history .history-header{align-items:center;display:flex;max-width:150rem;margin:2rem auto .2rem}#history .HistoryView.has-history .history,#history .HistoryView.has-pinned .pinned{display:flex;flex-wrap:wrap;justify-content:center}#history .HistoryView .List>div{flex-grow:1;flex-basis:33%;flex-shrink:0;min-width:32em;max-width:50em}#history .pinned .button-drawer .icon-close{display:none}#history .HistoryView .List:before,#history .HistoryView .List:after{content:"";box-sizing:border-box;box-shadow:0 1px 8px 1px #0006 inset;display:inline-block;flex-grow:1;flex-basis:33%;flex-shrink:0;min-width:32em;border:0px solid transparent;border-width:.75rem .5rem .75rem .5rem;border-radius:1rem;max-width:50em}#history .HistoryView .List[data-things="2"]:before{display:none}#history .HistoryView .List[data-things="3"]:before,#history .HistoryView .List[data-things="3"]:after{display:none}@media(max-width:80em){#history .HistoryView .List:after{display:none}}@media(max-width:120em){#history .HistoryView .List:before{display:none}}.history-desc,.history-sync{max-width:650px;margin:0 auto}.history-desc{padding-top:3rem}#history #rs-widget{display:flex;justify-content:center;margin:2rem 0}#history .rs-widget{box-sizing:content-box;padding:.7rem 0rem .5rem;border:1px solid rgba(255,255,255,.2);border-radius:4px}#history #rs-main-logo-remotestorage{margin:0 .8rem}#history .rs-widget-icon{text-align:center}@media(max-width:768px){.series-content h1{font-size:1.8em}.series-content picture{max-width:5rem}.series-content article aside .manga-link{display:none}.series-content article .series-content-body .manga-link.chapter{display:inline-block}aside .table *{display:block}aside .table td{padding-top:0;padding-bottom:1em}#history .HistoryView .List:before,#history .HistoryView .List:after,#history .HistoryView .List>div{font-size:.8em;min-width:30em}#main .header-wrapper h1{letter-spacing:.6em;margin-right:-.6em}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}'; const defaultSeriesImg = "data:image/png;base64,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"; const logo = "data:image/webp;base64,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"; function formatUpdatedAt(updatedAt) { if (updatedAt <= 0) { return "Unknown date"; } return new Date(updatedAt).toLocaleString(); } const ChapterList = reactExports.memo(function ChapterList2({ chapters, folderDetails, onClose, onSelectChapter, statusMessage, title }) { const [search, setSearch] = reactExports.useState(""); const seriesTitle = folderDetails?.title || title || "Unknown Series"; const { filteredChapters, isLoading } = reactExports.useMemo(() => { const normalizedSearch = search.toLowerCase(); return { filteredChapters: chapters.map((chapter, index) => ({ chapter, index })).filter( ({ chapter }) => chapter.name.toLowerCase().includes(normalizedSearch) ), isLoading: statusMessage.includes("Loading") }; }, [chapters, search, statusMessage]); const handleClose = reactExports.useCallback( (event) => { event.preventDefault(); onClose(); }, [onClose] ); const handlePreventDefault = reactExports.useCallback( (event) => { event.preventDefault(); }, [] ); const handleSearchChange = reactExports.useCallback( (event) => { setSearch(event.target.value); }, [] ); const handleReadLatest = reactExports.useCallback( (event) => { event.preventDefault(); if (chapters.length === 0) { return; } const latestChapterIndex = chapters.length - 1; const latestChapter = chapters[latestChapterIndex]; if (!latestChapter) { return; } onSelectChapter(latestChapter.id, latestChapterIndex); }, [chapters, onSelectChapter] ); const handleChapterClick = reactExports.useCallback( (event) => { event.preventDefault(); const { chapterId, chapterIndex } = event.currentTarget.dataset; if (!chapterId || !chapterIndex) { return; } const parsedIndex = Number.parseInt(chapterIndex, 10); if (Number.isNaN(parsedIndex)) { return; } onSelectChapter(chapterId, parsedIndex); }, [onSelectChapter] ); return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ jsxRuntimeExports.jsx("style", { children: comicStyles }), jsxRuntimeExports.jsxs("div", { className: "body-wrapper", children: [ jsxRuntimeExports.jsx("div", { className: "home-background" }), jsxRuntimeExports.jsxs("header", { children: [ jsxRuntimeExports.jsxs( "a", { className: "donate", href: "https://github.com/zennomi/truyendrive", target: "_blank", rel: "noreferrer", children: [ jsxRuntimeExports.jsx("span", { children: "‹" }), " github ", jsxRuntimeExports.jsx("span", { children: "›" }) ] } ), jsxRuntimeExports.jsx("a", { href: "#", className: "cubari-logo", onClick: handlePreventDefault, children: jsxRuntimeExports.jsx( "img", { style: { height: "60px", width: "60px" }, src: logo, alt: "TruyenDrive" } ) }), jsxRuntimeExports.jsx("a", { className: "rhombutton icon-close", onClick: handleClose }) ] }), jsxRuntimeExports.jsxs("div", { className: "series-content", children: [ jsxRuntimeExports.jsxs("article", { children: [ jsxRuntimeExports.jsxs("aside", { children: [ jsxRuntimeExports.jsx("picture", { children: jsxRuntimeExports.jsx( "img", { src: folderDetails?.thumbnailUrl || defaultSeriesImg, className: "img-fluid", alt: `${seriesTitle} cover` } ) }), jsxRuntimeExports.jsxs( "a", { href: "#", className: "manga-link chapter no-chapter", onClick: handleReadLatest, children: [ jsxRuntimeExports.jsx("span", { className: "manga-link-chap" }), jsxRuntimeExports.jsx("span", { className: "manga-link-text", children: "Read latest chapter ›" }) ] } ) ] }), jsxRuntimeExports.jsxs("section", { className: "series-content-body", children: [ jsxRuntimeExports.jsx("h1", { children: seriesTitle }), jsxRuntimeExports.jsx("table", { className: "table table-borderless table-sm small", children: jsxRuntimeExports.jsx("tbody", { children: jsxRuntimeExports.jsxs("tr", { children: [ jsxRuntimeExports.jsx("th", { children: "Uploader" }), jsxRuntimeExports.jsx("td", { className: "text-sm", children: folderDetails?.ownerEmail ?? "Unknown" }) ] }) }) }), jsxRuntimeExports.jsxs( "a", { href: "#", className: "manga-link chapter no-chapter", onClick: handleReadLatest, children: [ jsxRuntimeExports.jsx("span", { className: "manga-link-chap" }), jsxRuntimeExports.jsx("span", { className: "manga-link-text", children: "Read latest chapter ›" }) ] } ) ] }) ] }), jsxRuntimeExports.jsx("div", { id: "detailedView", className: "table-responsive", children: jsxRuntimeExports.jsxs("table", { id: "chapters", className: "table table-hover", children: [ jsxRuntimeExports.jsx("thead", { children: jsxRuntimeExports.jsxs("tr", { children: [ jsxRuntimeExports.jsx("th", { scope: "col", className: "read-icon all-read" }), jsxRuntimeExports.jsxs("th", { scope: "col", children: [ "Title ", jsxRuntimeExports.jsx( "input", { className: "form-control-sm", id: "chapterTitleSearch", type: "text", placeholder: "⌕ Search", value: search, onChange: handleSearchChange } ) ] }), jsxRuntimeExports.jsx("th", { scope: "col", children: "Uploader" }), jsxRuntimeExports.jsx("th", { scope: "col", children: "Last Updated" }) ] }) }), jsxRuntimeExports.jsxs("tbody", { id: "chapterTable", children: [ isLoading && jsxRuntimeExports.jsx("tr", { children: jsxRuntimeExports.jsx( "td", { colSpan: 4, style: { textAlign: "center", padding: "2rem" }, children: statusMessage } ) }), filteredChapters.map(({ chapter, index }) => jsxRuntimeExports.jsxs( "tr", { className: "table-default is-read", "data-chapter": chapter.name, children: [ jsxRuntimeExports.jsx("td", { scope: "row", className: "read-icon" }), jsxRuntimeExports.jsx("td", { scope: "row", className: "chapter-title", children: jsxRuntimeExports.jsx( "a", { "data-chapter-id": chapter.id, "data-chapter-index": String(index), href: "#", onClick: handleChapterClick, children: chapter.name } ) }), jsxRuntimeExports.jsx("td", { scope: "row", children: chapter.creator || "Unknown Group" }), jsxRuntimeExports.jsx("td", { scope: "row", className: "detailed-chapter-upload-date", children: formatUpdatedAt(chapter.updatedAt) }) ] }, chapter.id )) ] }) ] }) }) ] }) ] }) ] }); }); const ModePickerDialog = reactExports.memo(function ModePickerDialog2({ onSelectMode }) { const handleSelectChapters = reactExports.useCallback(() => { onSelectMode("chapters"); }, [onSelectMode]); const handleSelectImages = reactExports.useCallback(() => { onSelectMode("images"); }, [onSelectMode]); return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ jsxRuntimeExports.jsx("style", { children: comicStyles }), jsxRuntimeExports.jsx( "div", { id: "layers", "aria-label": "Choose comic mode", role: "dialog", style: { display: "flex", alignItems: "center", justifyContent: "center", bottom: 0, zIndex: 99999 }, children: jsxRuntimeExports.jsxs( "article", { style: { minHeight: "auto", padding: "2rem 3rem", borderRadius: "4px", maxWidth: "45rem" }, children: [ jsxRuntimeExports.jsx( "h2", { style: { marginTop: 0, marginBottom: "1rem", color: "white", fontSize: "1.5rem" }, children: "How should this folder open?" } ), jsxRuntimeExports.jsx("p", { style: { color: "#ccc", fontSize: "0.9rem" }, children: "This folder contains a mix of items, so Comic Mode needs a hint before it can continue." }), jsxRuntimeExports.jsxs( "div", { style: { display: "flex", gap: "1rem", marginTop: "2rem", flexWrap: "wrap" }, children: [ jsxRuntimeExports.jsxs( "button", { className: "manga-link chapter", onClick: handleSelectChapters, type: "button", children: [ jsxRuntimeExports.jsx("span", { className: "manga-link-chap", children: "Chapter List" }), jsxRuntimeExports.jsx("span", { className: "manga-link-text", children: "Browse sub-folders" }) ] } ), jsxRuntimeExports.jsxs( "button", { className: "manga-link chapter", onClick: handleSelectImages, type: "button", children: [ jsxRuntimeExports.jsx("span", { className: "manga-link-chap", children: "Direct Images" }), jsxRuntimeExports.jsx("span", { className: "manga-link-text", children: "Open flat image list" }) ] } ) ] } ) ] } ) } ) ] }); }); const READER_HISTORY_HASH = "truyendrive-page"; const READER_STATE_HASH_PREFIX = "truyendrive-chap"; const READER_PAGE_SEARCH_PARAM = "truyendrive-page"; const READER_CHAPTER_SEARCH_PARAM = "truyendrive-chap"; function buildPageGroups(images, spread, direction) { const groupSize = spread === "1" ? 1 : 2; const oddOffset = spread === "2-odd" ? 1 : 0; const groups = []; let startIndex = 0; if (oddOffset === 1 && images.length > 0) { groups.push({ id: "group-0", pages: [ { index: 0, ...images[0] } ] }); startIndex = 1; } for (let index = startIndex; index < images.length; index += groupSize) { const pages = images.slice(index, index + groupSize).map((image, offset) => ({ index: index + offset, ...image })); groups.push({ id: `group-${index}`, pages }); } return direction === "rtl" ? [...groups].reverse() : groups; } function getRootClasses(settings) { return [ `direction-${settings.lyt.direction}`, `fit-${settings.lyt.fit}`, `gap-${settings.lyt.gap}`, `spread-${settings.lyt.spread}`, `selectorAnchor-${settings.apr.selectorAnchor}`, `selPinned-${settings.apr.selPinned}`, `selNum-${settings.apr.selNum}`, `hoverinos-${settings.apr.hoverinos}`, `sidebar-${settings.apr.sidebar}`, `previews-${settings.apr.previews}`, `zoom-${settings.lyt.zoom}`, "loaded" ].join(" "); } function pageLabel(group) { if (group.pages.length === 1) { return `${group.pages[0].index + 1}`; } return `${group.pages[0].index + 1}-${group.pages[group.pages.length - 1].index + 1}`; } function getDisplayGroupIndex(logicalIndex, groupCount, direction) { if (direction !== "rtl") { return logicalIndex; } return groupCount - 1 - logicalIndex; } function getLogicalGroupIndex(displayIndex, groupCount, direction) { if (direction !== "rtl") { return displayIndex; } return groupCount - 1 - displayIndex; } function getChapterStartGroupIndex(groupCount, direction) { if (groupCount <= 0) { return 0; } return direction === "rtl" ? groupCount - 1 : 0; } function getMaxGroupDistance(distance, groupCount) { return distance === 100 ? groupCount : Math.max(distance, 1); } function getGroupsInRange(displayGroups, anchorGroupIndex, maxDistance, includeAnchor) { const groups = []; for (let distance = includeAnchor ? 0 : 1; distance <= maxDistance; distance += 1) { const nextGroup = displayGroups[anchorGroupIndex + distance]; if (nextGroup) { groups.push(nextGroup); } if (distance === 0) { continue; } const previousGroup = displayGroups[anchorGroupIndex - distance]; if (previousGroup) { groups.push(previousGroup); } } return groups; } function clampIndex(value, max) { return Math.max(0, Math.min(max, value)); } function findGroupIndexForPage(groups, pageIndex) { return groups.findIndex( (group) => group.pages.some((page) => page.index === pageIndex) ); } function buildPageTitle(title, pageIndex) { return `${title} • Page ${pageIndex + 1}`; } function buildReaderHistoryUrl(baseUrl, pageIndex) { const url = new URL(baseUrl); url.searchParams.delete(READER_CHAPTER_SEARCH_PARAM); url.searchParams.set(READER_PAGE_SEARCH_PARAM, `${pageIndex + 1}`); url.hash = ""; return url.toString(); } function buildChapterStateUrl(baseUrl, chapterId, pageIndex) { const url = new URL(baseUrl); url.searchParams.set(READER_CHAPTER_SEARCH_PARAM, chapterId); url.searchParams.set(READER_PAGE_SEARCH_PARAM, `${pageIndex + 1}`); url.hash = ""; return url.toString(); } function parseReaderStateFromUrl(url) { let parsedUrl; try { parsedUrl = new URL(url); } catch { return { chapterId: null, page: -1 }; } const searchPage = parsedUrl.searchParams.get(READER_PAGE_SEARCH_PARAM); if (searchPage) { const parsedPage = Number.parseInt(searchPage, 10); return { chapterId: parsedUrl.searchParams.get(READER_CHAPTER_SEARCH_PARAM), page: Number.isNaN(parsedPage) ? -1 : Math.max(parsedPage - 1, 0) }; } const hash = parsedUrl.hash.slice(1); const pageOnlyMatch = hash.match( new RegExp(`^${READER_HISTORY_HASH}-(\\d+)$`) ); if (pageOnlyMatch) { return { chapterId: null, page: Math.max(Number.parseInt(pageOnlyMatch[1], 10) - 1, 0) }; } const chapterMatch = hash.match( new RegExp(`^${READER_STATE_HASH_PREFIX}-(.+)-page-(\\d+)$`) ); if (!chapterMatch) { return { chapterId: null, page: -1 }; } try { return { chapterId: decodeURIComponent(chapterMatch[1]), page: Math.max(Number.parseInt(chapterMatch[2], 10) - 1, 0) }; } catch { return { chapterId: chapterMatch[1], page: 0 }; } } function clearReaderStateUrl(url) { const nextUrl = new URL(url); nextUrl.searchParams.delete(READER_CHAPTER_SEARCH_PARAM); nextUrl.searchParams.delete(READER_PAGE_SEARCH_PARAM); nextUrl.hash = ""; return nextUrl.toString(); } function isReaderHistoryState(value) { return typeof value === "object" && value !== null && "truyendriveReader" in value && "page" in value && value.truyendriveReader === true && typeof value.page === "number"; } const PageSelector = reactExports.memo(function PageSelector2({ activeGroupIndex, activePageNumber, displayGroups, direction, isGroupLoaded, isSelectorVisible, pageCount, scrollToGroup }) { const orderedGroups = direction === "rtl" ? [...displayGroups].reverse() : displayGroups; const getGroupIndex = reactExports.useCallback((value) => { if (!value) { return -1; } const parsedIndex = Number.parseInt(value, 10); return Number.isNaN(parsedIndex) ? -1 : parsedIndex; }, []); const handleGroupClick = reactExports.useCallback( (event) => { const groupIndex = getGroupIndex(event.currentTarget.dataset.groupIndex); if (groupIndex !== -1) { scrollToGroup(groupIndex); } }, [getGroupIndex, scrollToGroup] ); const handleGroupKeyDown = reactExports.useCallback( (event) => { if (event.key !== "Enter" && event.key !== " ") { return; } event.preventDefault(); const groupIndex = getGroupIndex(event.currentTarget.dataset.groupIndex); if (groupIndex !== -1) { scrollToGroup(groupIndex); } }, [getGroupIndex, scrollToGroup] ); return jsxRuntimeExports.jsxs("div", { className: `rdr-page-selector${isSelectorVisible ? " vis" : ""}`, children: [ jsxRuntimeExports.jsxs("div", { className: "rdr-page-selector-counter", children: [ activePageNumber, " / ", pageCount ] }), jsxRuntimeExports.jsx("div", { className: "rdr-page-selector-keys", children: orderedGroups.map((group, logicalIndex) => { const displayIndex = getDisplayGroupIndex( logicalIndex, displayGroups.length, direction ); return jsxRuntimeExports.jsx( "div", { className: [ displayIndex === activeGroupIndex ? "shown" : "", isGroupLoaded(displayIndex) ? "preloaded" : "" ].filter(Boolean).join(" "), "data-group-index": String(displayIndex), onClick: handleGroupClick, onKeyDown: handleGroupKeyDown, role: "button", tabIndex: 0, children: pageLabel(group) }, group.id ); }) }) ] }); }); const ScanlineIllustration = () => { return jsxRuntimeExports.jsxs( "svg", { className: "illustration-scanline", viewBox: "0 0 160 80", xmlns: "http://www.w3.org/2000/svg", children: [ jsxRuntimeExports.jsxs("defs", { children: [ jsxRuntimeExports.jsxs("linearGradient", { id: "scanlineBgGrad", x1: "0%", y1: "0%", x2: "0%", y2: "100%", children: [ jsxRuntimeExports.jsx("stop", { offset: "0%", stopColor: "#0d0e12" }), jsxRuntimeExports.jsx("stop", { offset: "100%", stopColor: "#15171f" }) ] }), jsxRuntimeExports.jsxs("linearGradient", { id: "panelGrad", x1: "0%", y1: "0%", x2: "100%", y2: "100%", children: [ jsxRuntimeExports.jsx("stop", { offset: "0%", stopColor: "#ff0055", stopOpacity: "0.15" }), jsxRuntimeExports.jsx("stop", { offset: "100%", stopColor: "#00ffff", stopOpacity: "0.15" }) ] }) ] }), jsxRuntimeExports.jsx("rect", { width: "100%", height: "100%", fill: "url(#scanlineBgGrad)" }), jsxRuntimeExports.jsxs("g", { stroke: "rgba(255, 255, 255, 0.03)", strokeWidth: "0.5", children: [ jsxRuntimeExports.jsx("line", { x1: "20", y1: "0", x2: "20", y2: "80" }), jsxRuntimeExports.jsx("line", { x1: "40", y1: "0", x2: "40", y2: "80" }), jsxRuntimeExports.jsx("line", { x1: "60", y1: "0", x2: "60", y2: "80" }), jsxRuntimeExports.jsx("line", { x1: "80", y1: "0", x2: "80", y2: "80" }), jsxRuntimeExports.jsx("line", { x1: "100", y1: "0", x2: "100", y2: "80" }), jsxRuntimeExports.jsx("line", { x1: "120", y1: "0", x2: "120", y2: "80" }), jsxRuntimeExports.jsx("line", { x1: "140", y1: "0", x2: "140", y2: "80" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "20", x2: "160", y2: "20" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "40", x2: "160", y2: "40" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "60", x2: "160", y2: "60" }) ] }), jsxRuntimeExports.jsxs("g", { className: "comic-panels-base", children: [ jsxRuntimeExports.jsx("rect", { x: "15", y: "12", width: "60", height: "56", fill: "url(#panelGrad)", stroke: "rgba(255, 255, 255, 0.2)", strokeWidth: "1", rx: "2" }), jsxRuntimeExports.jsx("rect", { x: "85", y: "12", width: "60", height: "56", fill: "url(#panelGrad)", stroke: "rgba(255, 255, 255, 0.2)", strokeWidth: "1", rx: "2" }), jsxRuntimeExports.jsxs("g", { className: "scramble-slices", children: [ jsxRuntimeExports.jsx("rect", { x: "-8", y: "16", width: "180", height: "4", fill: "#00ffff", opacity: "0.6", className: "scramble-slice-1" }), jsxRuntimeExports.jsx("rect", { x: "-4", y: "16", width: "170", height: "4", fill: "#ffffff", opacity: "0.3", className: "scramble-slice-1" }), jsxRuntimeExports.jsx("rect", { x: "12", y: "24", width: "140", height: "6", fill: "#ff0055", opacity: "0.6", className: "scramble-slice-2" }), jsxRuntimeExports.jsx("rect", { x: "8", y: "24", width: "145", height: "6", fill: "#ffffff", opacity: "0.25", className: "scramble-slice-2" }), jsxRuntimeExports.jsx("rect", { x: "-12", y: "34", width: "180", height: "5", fill: "#00ffff", opacity: "0.5", className: "scramble-slice-3" }), jsxRuntimeExports.jsx("rect", { x: "-7", y: "34", width: "170", height: "5", fill: "#ffffff", opacity: "0.3", className: "scramble-slice-3" }), jsxRuntimeExports.jsx("rect", { x: "6", y: "44", width: "150", height: "8", fill: "#ff0055", opacity: "0.7", className: "scramble-slice-4" }), jsxRuntimeExports.jsx("rect", { x: "10", y: "44", width: "140", height: "8", fill: "#ffffff", opacity: "0.2", className: "scramble-slice-4" }), jsxRuntimeExports.jsx("rect", { x: "-6", y: "56", width: "175", height: "4", fill: "#00ffff", opacity: "0.6", className: "scramble-slice-5" }), jsxRuntimeExports.jsx("rect", { x: "-2", y: "56", width: "165", height: "4", fill: "#ffffff", opacity: "0.35", className: "scramble-slice-5" }) ] }), jsxRuntimeExports.jsxs("g", { className: "center-symbol", transform: "translate(80, 40)", children: [ jsxRuntimeExports.jsx("circle", { r: "14", fill: "#ff0055", opacity: "0.15" }), jsxRuntimeExports.jsx("circle", { r: "10", fill: "none", stroke: "#ff0055", strokeWidth: "1.5", opacity: "0.8" }), jsxRuntimeExports.jsx("path", { d: "M -6 -3 L 6 -3 L 6 3 L -6 3 Z", fill: "#ffffff" }), jsxRuntimeExports.jsx("path", { d: "M -3 -3 L -3 -7 C -3 -9, 3 -9, 3 -7 L 3 -3", fill: "none", stroke: "#ffffff", strokeWidth: "1.5" }) ] }) ] }), jsxRuntimeExports.jsxs("g", { stroke: "#000000", strokeWidth: "0.5", opacity: "0.25", children: [ jsxRuntimeExports.jsx("line", { x1: "0", y1: "4", x2: "160", y2: "4" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "8", x2: "160", y2: "8" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "12", x2: "160", y2: "12" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "16", x2: "160", y2: "16" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "20", x2: "160", y2: "20" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "24", x2: "160", y2: "24" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "28", x2: "160", y2: "28" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "32", x2: "160", y2: "32" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "36", x2: "160", y2: "36" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "40", x2: "160", y2: "40" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "44", x2: "160", y2: "44" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "48", x2: "160", y2: "48" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "52", x2: "160", y2: "52" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "56", x2: "160", y2: "56" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "60", x2: "160", y2: "60" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "64", x2: "160", y2: "64" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "68", x2: "160", y2: "68" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "72", x2: "160", y2: "72" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "76", x2: "160", y2: "76" }) ] }) ] } ); }; const NoiseIllustration = () => { return jsxRuntimeExports.jsxs( "svg", { className: "illustration-noise", viewBox: "0 0 160 80", xmlns: "http://www.w3.org/2000/svg", children: [ jsxRuntimeExports.jsxs("defs", { children: [ jsxRuntimeExports.jsxs("radialGradient", { id: "noiseBgGrad", cx: "50%", cy: "50%", r: "70%", children: [ jsxRuntimeExports.jsx("stop", { offset: "0%", stopColor: "#2a164d" }), jsxRuntimeExports.jsx("stop", { offset: "100%", stopColor: "#0a0514" }) ] }), jsxRuntimeExports.jsxs("filter", { id: "staticFilter", x: "0", y: "0", width: "160", height: "80", children: [ jsxRuntimeExports.jsx( "feTurbulence", { type: "fractalNoise", baseFrequency: "0.85", numOctaves: "3", result: "noise", children: jsxRuntimeExports.jsx( "animate", { attributeName: "seed", from: "1", to: "100", dur: "0.8s", repeatCount: "indefinite" } ) } ), jsxRuntimeExports.jsx( "feColorMatrix", { type: "matrix", values: "\n 1 0 0 0 0\n 0 1 0 0 0\n 0 0 1 0 0\n 0 0 0 0.5 0" } ) ] }) ] }), jsxRuntimeExports.jsx("rect", { width: "100%", height: "100%", fill: "url(#noiseBgGrad)" }), jsxRuntimeExports.jsx("rect", { width: "100%", height: "100%", filter: "url(#staticFilter)" }), jsxRuntimeExports.jsxs("g", { stroke: "rgba(0, 0, 0, 0.15)", strokeWidth: "0.5", children: [ jsxRuntimeExports.jsx("line", { x1: "0", y1: "10", x2: "160", y2: "10" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "20", x2: "160", y2: "20" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "30", x2: "160", y2: "30" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "40", x2: "160", y2: "40" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "50", x2: "160", y2: "50" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "60", x2: "160", y2: "60" }), jsxRuntimeExports.jsx("line", { x1: "0", y1: "70", x2: "160", y2: "70" }) ] }), jsxRuntimeExports.jsxs("g", { className: "center-symbol", transform: "translate(80, 40)", children: [ jsxRuntimeExports.jsx("circle", { r: "14", fill: "#00e5ff", opacity: "0.15" }), jsxRuntimeExports.jsx("circle", { r: "10", fill: "none", stroke: "#00e5ff", strokeWidth: "1.5", opacity: "0.8" }), jsxRuntimeExports.jsx("path", { d: "M -6 -3 L 6 -3 L 6 3 L -6 3 Z", fill: "#ffffff" }), jsxRuntimeExports.jsx("path", { d: "M -3 -3 L -3 -7 C -3 -9, 3 -9, 3 -7 L 3 -3", fill: "none", stroke: "#ffffff", strokeWidth: "1.5" }) ] }) ] } ); }; const METHOD_OPTIONS = [ { description: "Default scanline scramble", label: "Scanline", value: "scanline" }, { description: "Legacy pixel noise", label: "Noise", value: "noise" } ]; const PasswordDialog = reactExports.memo(function PasswordDialog2({ currentMethod, currentPassword, onClose, onConfirm }) { const passwordInputId = reactExports.useId(); const titleId = reactExports.useId(); const inputRef = reactExports.useRef(null); const [password, setPassword] = reactExports.useState(currentPassword ?? ""); const [method, setMethod] = reactExports.useState(currentMethod); reactExports.useEffect(() => { setPassword(currentPassword ?? ""); setMethod(currentMethod); }, [currentMethod, currentPassword]); reactExports.useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []); const submitPassword = (event) => { event?.preventDefault(); const trimmedPassword = password.trim(); onConfirm(trimmedPassword.length > 0 ? trimmedPassword : null, method); }; const clearPassword = () => { onConfirm(null, method); }; const handleKeyDown = (event) => { event.stopPropagation(); if (event.key === "Escape") { event.preventDefault(); onClose(); } }; return jsxRuntimeExports.jsx( "div", { className: "LodaManager", onMouseDown: (event) => { if (event.target === event.currentTarget) { onClose(); } }, children: jsxRuntimeExports.jsxs( "form", { "aria-labelledby": titleId, "aria-modal": "true", className: "Loda-window UI Loda Loda_Password", onKeyDown: handleKeyDown, onMouseDown: (event) => event.stopPropagation(), onSubmit: submitPassword, role: "dialog", tabIndex: -1, children: [ jsxRuntimeExports.jsx("button", { className: "ico-btn close", onClick: onClose, type: "button" }), jsxRuntimeExports.jsx("header", { id: titleId, children: "Decryption Password" }), jsxRuntimeExports.jsxs("div", { className: "password-dialog-content", children: [ jsxRuntimeExports.jsxs("label", { className: "password-field", htmlFor: passwordInputId, children: [ jsxRuntimeExports.jsx("span", { children: "Password" }), jsxRuntimeExports.jsx( "input", { autoComplete: "current-password", id: passwordInputId, onChange: (event) => setPassword(event.target.value), ref: inputRef, type: "password", value: password } ) ] }), jsxRuntimeExports.jsxs("fieldset", { className: "password-methods", children: [ jsxRuntimeExports.jsx("legend", { children: "Encryption method" }), jsxRuntimeExports.jsx("div", { className: "password-method-grid", children: METHOD_OPTIONS.map((option) => jsxRuntimeExports.jsxs( "label", { className: "password-method-card", "data-selected": method === option.value, children: [ jsxRuntimeExports.jsx( "input", { checked: method === option.value, name: "encryption-method", onChange: () => setMethod(option.value), type: "radio", value: option.value } ), jsxRuntimeExports.jsx("span", { className: `password-method-illustration ${option.value}`, children: option.value === "scanline" ? jsxRuntimeExports.jsx(ScanlineIllustration, {}) : jsxRuntimeExports.jsx(NoiseIllustration, {}) }), jsxRuntimeExports.jsx("span", { className: "password-method-title", children: option.label }), jsxRuntimeExports.jsx("span", { className: "password-method-description", children: option.description }) ] }, option.value )) }) ] }), jsxRuntimeExports.jsxs("footer", { className: "password-actions", children: [ jsxRuntimeExports.jsx( "button", { className: "ResetButton password-clear", onClick: clearPassword, type: "button", children: "Clear" } ), jsxRuntimeExports.jsx("span", {}), jsxRuntimeExports.jsx("button", { className: "ResetButton", onClick: onClose, type: "button", children: "Cancel" }), jsxRuntimeExports.jsx("button", { className: "ResetButton password-confirm", type: "submit", children: "Confirm" }) ] }) ] }) ] } ) } ); }); const SELECTOR_PROXIMITY_PX = 72; const ZOOM_PROXIMITY_PX = 140; function createIdlePointerGestureState() { return { active: false, dragged: false, initialScrollLeft: 0, pointerType: "", startX: 0, startY: 0, wrapper: null }; } const ReaderArea = reactExports.memo(function ReaderArea2({ decryptedSrcs, displayGroups, getImageUrl, groupRefs, hasNextChapter, hoverEdge, imageWrapRef, isGroupPreloaded, isMobile, isPasswordMode, isScrollReady, isTtb, navigateGroupOrChapter, onMobileTtbTap, onPageLoad, performVerticalPageTurnOrChapter, preloadImageRefs, setHoverEdge, setImageLoadVersion, settings, showPageSelector, showZoomControls, syncActiveGroupFromScroll, tooWideGroups, goToAdjacentChapter }) { const pointerGestureRef = reactExports.useRef( createIdlePointerGestureState() ); const suppressClickRef = reactExports.useRef(false); const handleAreaClick = (event) => { if (isMobile && isTtb) { onMobileTtbTap(); return; } if (suppressClickRef.current) { suppressClickRef.current = false; return; } if (!settings.bhv.clickTurnPage) { return; } const bounds = event.currentTarget.getBoundingClientRect(); const ratio = (event.clientX - bounds.left) / bounds.width; if (settings.lyt.direction === "ttb") { const verticalRatio = (event.clientY - bounds.top) / bounds.height; if (verticalRatio < 0.35) { performVerticalPageTurnOrChapter(-1); return; } if (verticalRatio > 0.65) { performVerticalPageTurnOrChapter(1); return; } showPageSelector(); return; } if (ratio < 0.35) { navigateGroupOrChapter(-1); } else if (ratio > 0.65) { navigateGroupOrChapter(1); } else { showPageSelector(); } }; const handleAreaMouseLeave = () => { setHoverEdge(null); }; const handleAreaMouseMove = (event) => { const bounds = event.currentTarget.getBoundingClientRect(); const offsetX = event.clientX - bounds.left; const offsetY = event.clientY - bounds.top; const isNearSelector = settings.apr.selectorAnchor === "bottom" ? offsetY >= bounds.height - SELECTOR_PROXIMITY_PX : offsetX <= SELECTOR_PROXIMITY_PX; if (isNearSelector) { showPageSelector(); } const isNearZoomControls = offsetX >= bounds.width - ZOOM_PROXIMITY_PX && offsetY <= ZOOM_PROXIMITY_PX; if (isNearZoomControls) { showZoomControls(); } if (!settings.apr.hoverinos || settings.lyt.direction === "ttb") { setHoverEdge(null); return; } const ratio = offsetX / bounds.width; if (ratio < 0.25) { setHoverEdge("prev"); } else if (ratio > 0.75) { setHoverEdge("next"); } else { setHoverEdge(null); } }; const resetPointerGesture = () => { pointerGestureRef.current = createIdlePointerGestureState(); }; const handlePointerDown = (event) => { const wrapper = event.target instanceof Element ? event.target.closest(".ReaderImageWrapper") : null; pointerGestureRef.current = { active: true, dragged: false, initialScrollLeft: wrapper?.scrollLeft ?? 0, pointerType: event.pointerType, startX: event.clientX, startY: event.clientY, wrapper }; suppressClickRef.current = false; }; const handlePointerMove = (event) => { const gesture = pointerGestureRef.current; if (!gesture.active) { return; } const deltaX = event.clientX - gesture.startX; const deltaY = event.clientY - gesture.startY; if (Math.abs(deltaX) > 8 || Math.abs(deltaY) > 8) { gesture.dragged = true; suppressClickRef.current = true; } if (settings.lyt.direction === "ttb" || !settings.bhv.swipeGestures || !gesture.wrapper || Math.abs(deltaX) <= Math.abs(deltaY)) { return; } const maxScrollLeft = gesture.wrapper.scrollWidth - gesture.wrapper.clientWidth; if (maxScrollLeft <= 0) { return; } gesture.wrapper.scrollLeft = clampIndex( gesture.initialScrollLeft - deltaX, maxScrollLeft ); }; const handlePointerUp = (event) => { const gesture = pointerGestureRef.current; pointerGestureRef.current = createIdlePointerGestureState(); if (settings.lyt.direction === "ttb" || !settings.bhv.swipeGestures || gesture.pointerType !== "touch" && gesture.pointerType !== "pen") { return; } const deltaX = event.clientX - gesture.startX; const deltaY = event.clientY - gesture.startY; const horizontalSwipe = Math.abs(deltaX) >= 60 && Math.abs(deltaX) > Math.abs(deltaY) * 1.2; if (!horizontalSwipe) { return; } const wrapper = gesture.wrapper; if (wrapper) { const maxScrollLeft = wrapper.scrollWidth - wrapper.clientWidth; if (maxScrollLeft > 0) { const atStart = wrapper.scrollLeft <= 1; const atEnd = maxScrollLeft - wrapper.scrollLeft <= 1; if (deltaX < 0 && !atEnd || deltaX > 0 && !atStart) { return; } } } if (deltaX < 0) { navigateGroupOrChapter(settings.lyt.direction === "rtl" ? -1 : 1); return; } navigateGroupOrChapter(settings.lyt.direction === "rtl" ? 1 : -1); }; const handlePageImageLoad = (event) => { const pageId = event.currentTarget.dataset.pageId; if (!pageId) { return; } onPageLoad(pageId); setImageLoadVersion((version) => version + 1); }; return jsxRuntimeExports.jsxs( "div", { className: "rdr-area", onClick: handleAreaClick, onMouseLeave: handleAreaMouseLeave, onMouseMove: handleAreaMouseMove, children: [ jsxRuntimeExports.jsx("div", { className: "preload-entity", children: Array.from({ length: 4 }).map((_, index) => jsxRuntimeExports.jsx( "img", { ref: (element) => { preloadImageRefs.current[index] = element; } }, index )) }), jsxRuntimeExports.jsxs( "div", { className: "rdr-image-wrap", onPointerCancel: resetPointerGesture, onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerUp, onScroll: isTtb ? void 0 : syncActiveGroupFromScroll, ref: imageWrapRef, style: { visibility: isScrollReady ? "visible" : "hidden" }, tabIndex: -1, children: [ displayGroups.map((group, groupIndex) => jsxRuntimeExports.jsx( "div", { className: `ReaderImageWrapper UI${group.pages.length > 1 ? " two-page" : ""}${tooWideGroups[group.id] ? " too-wide" : ""}`, ref: (element) => { groupRefs.current[groupIndex] = element; }, children: group.pages.map((page) => { const shouldDecryptPage = isPasswordMode && page.requiresDecryption !== false; const decryptedSrc = isPasswordMode ? decryptedSrcs.get(page.id) : void 0; const dimensionHints = page.width && page.height ? { height: page.height, style: { aspectRatio: `${page.width} / ${page.height}` }, width: page.width } : void 0; if (shouldDecryptPage && !decryptedSrc) { return jsxRuntimeExports.jsx( "img", { alt: `Page ${page.index + 1}`, "data-page-id": page.id, src: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7", ...dimensionHints }, page.id ); } return jsxRuntimeExports.jsx( "img", { alt: `Page ${page.index + 1}`, "data-page-id": page.id, decoding: "async", loading: isGroupPreloaded(groupIndex) ? "eager" : "lazy", onLoad: handlePageImageLoad, src: decryptedSrc ?? getImageUrl(page), ...dimensionHints }, page.id ); }) }, group.id )), hasNextChapter && jsxRuntimeExports.jsx( "div", { className: "UI Dummy nextCha", onClick: (e) => { e.stopPropagation(); goToAdjacentChapter(1); } } ) ] } ), jsxRuntimeExports.jsx( "div", { className: `hover-prev${hoverEdge === "prev" ? " viz nodelay" : ""}`, children: jsxRuntimeExports.jsxs("div", { className: "hover-wrap", children: [ jsxRuntimeExports.jsx("div", { className: "hover-arrow", children: "" }), jsxRuntimeExports.jsx("div", { className: "hover-sub" }) ] }) } ), jsxRuntimeExports.jsx( "div", { className: `hover-next${hoverEdge === "next" ? " viz nodelay" : ""}`, children: jsxRuntimeExports.jsxs("div", { className: "hover-wrap", children: [ jsxRuntimeExports.jsx("div", { className: "hover-arrow", children: "" }), jsxRuntimeExports.jsx("div", { className: "hover-sub" }) ] }) } ) ] } ); }); const FIT_OPTIONS = [ "none", "all_limit", "width_limit", "height_limit", "all", "width", "height" ]; const DIRECTION_OPTIONS = ["ttb", "ltr", "rtl"]; const SPREAD_OPTIONS = ["1", "2", "2-odd"]; const PRELOAD_OPTIONS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 100]; const ZOOM_OPTIONS = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]; const SCROLL_SPEED_OPTIONS = [ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 ]; const SELECTOR_ANCHOR_OPTIONS = ["left", "bottom"]; const HISTORY_UPDATE_OPTIONS = [ "none", "replace", "chap", "jump", "all" ]; const THEME_OPTIONS = [ "Cubari", "Classic", "Reaper", "Zaibatsu", "Light", "Custom" ]; const THEME_PRESETS = { Cubari: { sidebar: "#28292B", reader: "#000000", accent: "#B73636", text: "#EEEEEE" }, Classic: { sidebar: "#3A3F44", reader: "#272B30", accent: "#B2DFFB", text: "#EEEEEE" }, Reaper: { sidebar: "#272836", reader: "#121223", accent: "#487DE4", text: "#EEEEEE" }, Zaibatsu: { sidebar: "#1D1D1D", reader: "#000000", accent: "#BA1F1F", text: "#EEEEEE" }, Light: { sidebar: "#F1F4FF", reader: "#FFFFFF", accent: "#5889F0", text: "#2B2B2B" } }; const STORAGE_KEY = "truyendrive-reader-settings"; const LEGACY_STORAGE_KEY = "settings"; const STORAGE_VERSION = "truyendrive-reader-1"; const CUSTOM_THEME_DEFAULT = { primaryCol: THEME_PRESETS.Cubari.sidebar, readerBg: THEME_PRESETS.Cubari.reader, accentCol: THEME_PRESETS.Cubari.accent, textCol: THEME_PRESETS.Cubari.text }; const DEFAULT_SETTINGS = { lyt: { fit: "width_limit", zoom: 100, direction: "ttb", gap: true, spread: "1" }, bhv: { preload: 3, scrollYDelta: 25, resetScroll: false, clickTurnPage: true, arrowTurnPage: false, swipeGestures: true, historyUpdate: "replace" }, apr: { selectorAnchor: "left", selPinned: false, selNum: true, hoverinos: true, sidebar: true, previews: false }, thm: { theme: "Cubari", ...CUSTOM_THEME_DEFAULT }, adv: { spreadCount: 1, spreadOffset: 0, parallelDownloads: 5 } }; function isObject(value) { return typeof value === "object" && value !== null; } function clampToOptions(value, options, fallback) { return options.includes(value) ? value : fallback; } function asBoolean(value, fallback) { return typeof value === "boolean" ? value : fallback; } function normalizeColor(value, fallback) { if (typeof value !== "string") { return fallback; } const normalized = value.trim(); return /^#[0-9a-f]{6}$/i.test(normalized) ? normalized.toUpperCase() : fallback; } function flattenSettings(settings) { return { "lyt.fit": settings.lyt.fit, "lyt.zoom": settings.lyt.zoom, "lyt.direction": settings.lyt.direction, "lyt.gap": settings.lyt.gap, "lyt.spread": settings.lyt.spread, "bhv.preload": settings.bhv.preload, "bhv.scrollYDelta": settings.bhv.scrollYDelta, "bhv.resetScroll": settings.bhv.resetScroll, "bhv.clickTurnPage": settings.bhv.clickTurnPage, "bhv.arrowTurnPage": settings.bhv.arrowTurnPage, "bhv.swipeGestures": settings.bhv.swipeGestures, "bhv.historyUpdate": settings.bhv.historyUpdate, "apr.selectorAnchor": settings.apr.selectorAnchor, "apr.selPinned": settings.apr.selPinned, "apr.selNum": settings.apr.selNum, "apr.hoverinos": settings.apr.hoverinos, "apr.sidebar": settings.apr.sidebar, "apr.previews": settings.apr.previews, "thm.theme": settings.thm.theme, "thm.primaryCol": settings.thm.primaryCol, "thm.textCol": settings.thm.textCol, "thm.accentCol": settings.thm.accentCol, "thm.readerBg": settings.thm.readerBg, "adv.spreadCount": settings.adv.spreadCount, "adv.spreadOffset": settings.adv.spreadOffset, "adv.parallelDownloads": settings.adv.parallelDownloads, VER: STORAGE_VERSION }; } function hydrateSettings(source) { if (!isObject(source)) { return DEFAULT_SETTINGS; } return { lyt: { fit: clampToOptions( source["lyt.fit"], FIT_OPTIONS, DEFAULT_SETTINGS.lyt.fit ), zoom: clampToOptions( source["lyt.zoom"], ZOOM_OPTIONS, DEFAULT_SETTINGS.lyt.zoom ), direction: clampToOptions( source["lyt.direction"], DIRECTION_OPTIONS, DEFAULT_SETTINGS.lyt.direction ), gap: asBoolean(source["lyt.gap"], DEFAULT_SETTINGS.lyt.gap), spread: clampToOptions( source["lyt.spread"], SPREAD_OPTIONS, DEFAULT_SETTINGS.lyt.spread ) }, bhv: { preload: clampToOptions( source["bhv.preload"], PRELOAD_OPTIONS, DEFAULT_SETTINGS.bhv.preload ), scrollYDelta: clampToOptions( source["bhv.scrollYDelta"], SCROLL_SPEED_OPTIONS, DEFAULT_SETTINGS.bhv.scrollYDelta ), resetScroll: asBoolean( source["bhv.resetScroll"], DEFAULT_SETTINGS.bhv.resetScroll ), clickTurnPage: asBoolean( source["bhv.clickTurnPage"], DEFAULT_SETTINGS.bhv.clickTurnPage ), arrowTurnPage: asBoolean( source["bhv.arrowTurnPage"], DEFAULT_SETTINGS.bhv.arrowTurnPage ), swipeGestures: asBoolean( source["bhv.swipeGestures"], DEFAULT_SETTINGS.bhv.swipeGestures ), historyUpdate: clampToOptions( source["bhv.historyUpdate"], HISTORY_UPDATE_OPTIONS, DEFAULT_SETTINGS.bhv.historyUpdate ) }, apr: { selectorAnchor: clampToOptions( source["apr.selectorAnchor"], SELECTOR_ANCHOR_OPTIONS, DEFAULT_SETTINGS.apr.selectorAnchor ), selPinned: asBoolean( source["apr.selPinned"], DEFAULT_SETTINGS.apr.selPinned ), selNum: asBoolean(source["apr.selNum"], DEFAULT_SETTINGS.apr.selNum), hoverinos: asBoolean( source["apr.hoverinos"], DEFAULT_SETTINGS.apr.hoverinos ), sidebar: asBoolean(source["apr.sidebar"], DEFAULT_SETTINGS.apr.sidebar), previews: asBoolean( source["apr.previews"], DEFAULT_SETTINGS.apr.previews ) }, thm: { theme: clampToOptions( source["thm.theme"], THEME_OPTIONS, DEFAULT_SETTINGS.thm.theme ), primaryCol: normalizeColor( source["thm.primaryCol"], DEFAULT_SETTINGS.thm.primaryCol ), textCol: normalizeColor( source["thm.textCol"], DEFAULT_SETTINGS.thm.textCol ), accentCol: normalizeColor( source["thm.accentCol"], DEFAULT_SETTINGS.thm.accentCol ), readerBg: normalizeColor( source["thm.readerBg"], DEFAULT_SETTINGS.thm.readerBg ) }, adv: { spreadCount: typeof source["adv.spreadCount"] === "number" ? source["adv.spreadCount"] : DEFAULT_SETTINGS.adv.spreadCount, spreadOffset: typeof source["adv.spreadOffset"] === "number" ? source["adv.spreadOffset"] : DEFAULT_SETTINGS.adv.spreadOffset, parallelDownloads: typeof source["adv.parallelDownloads"] === "number" ? source["adv.parallelDownloads"] : DEFAULT_SETTINGS.adv.parallelDownloads } }; } function isPersistedSettingsPayload(value) { if (!isObject(value)) { return false; } if (value.VER === STORAGE_VERSION) { return true; } return "lyt.fit" in value || "bhv.preload" in value || "apr.selectorAnchor" in value || "thm.theme" in value; } function readStoredSettingsFromKey(key) { const raw = window.localStorage.getItem(key); if (!raw) { return null; } const parsed = JSON.parse(raw); return isPersistedSettingsPayload(parsed) ? hydrateSettings(parsed) : null; } function readStoredSettings() { try { const storedSettings = readStoredSettingsFromKey(STORAGE_KEY); if (storedSettings) { return storedSettings; } const legacySettings = readStoredSettingsFromKey(LEGACY_STORAGE_KEY); return legacySettings ?? DEFAULT_SETTINGS; } catch { return DEFAULT_SETTINGS; } } function hexToRgb(color) { const cleaned = color.replace("#", ""); return { b: Number.parseInt(cleaned.slice(4, 6), 16), g: Number.parseInt(cleaned.slice(2, 4), 16), r: Number.parseInt(cleaned.slice(0, 2), 16) }; } function rgbToHex(value) { return Math.max(0, Math.min(255, value)).toString(16).padStart(2, "0"); } function colManipulate(color, delta) { const { r, g, b } = hexToRgb(color); return `#${rgbToHex(r + delta)}${rgbToHex(g + delta)}${rgbToHex(b + delta)}`.toUpperCase(); } function getLuma(color) { const { r, g, b } = hexToRgb(color); return (r * 299 + g * 587 + b * 114) / 1e3; } function getResolvedTheme(settings) { if (settings.theme === "Custom") { return { accent: settings.accentCol, reader: settings.readerBg, sidebar: settings.primaryCol, text: settings.textCol }; } return THEME_PRESETS[settings.theme]; } function getThemeStyle(settings) { const resolved = getResolvedTheme(settings); const sidebarLuma = getLuma(resolved.sidebar); const readerLuma = getLuma(resolved.reader); const accentLuma = getLuma(resolved.accent); const sidebarRgb = hexToRgb(resolved.sidebar); const textRgb = hexToRgb(resolved.text); const lowContrast = Math.abs(sidebarRgb.r - textRgb.r) < 50 && Math.abs(sidebarRgb.g - textRgb.g) < 50 && Math.abs(sidebarRgb.b - textRgb.b) < 50; return { "--accentCol": resolved.accent, "--accentSelected": accentLuma > 160 ? "#111111" : "#FFFFFF", "--accentSelectedInvert": sidebarLuma < 160 ? "#444444" : "#CCCCCC", "--blackFlag": readerLuma > 100 ? "rgba(0,0,0,0.3)" : "rgba(0,0,0,0.7)", "--blackLight": sidebarLuma > 100 ? "rgba(0,0,0,0.05)" : "rgba(0,0,0,0.2)", "--borderColor": sidebarLuma > 100 ? "rgba(0,0,0,0.2)" : "rgba(0,0,0,0.7)", "--icoCol": resolved.text, "--prevCol": colManipulate(resolved.sidebar, -7), "--rdr-wb": readerLuma > 100 ? "1px" : "2px", "--rdrAncBottomWhite": readerLuma > 100 ? "rgba(255,255,255,0.6)" : "rgba(255,255,255,0.35)", "--rdrBorderL": readerLuma > 100 ? "3px" : "1px", "--readerBg": resolved.reader, "--rescueShade": lowContrast ? sidebarLuma > 200 ? "0px 1px 1px rgba(0,0,0,0.6),0px -1px 1px rgba(0,0,0,0.6),-1px 0px 1px rgba(0,0,0,0.6),1px 0px 1px rgba(0,0,0,0.6)" : "0px 1px 1px rgba(255,255,255,0.6),0px -1px 1px rgba(255,255,255,0.6),-1px 0px 1px rgba(255,255,255,0.6),1px 0px 1px rgba(255,255,255,0.6)" : "unset", "--sidebarCol": resolved.sidebar, "--sidebarColDark": colManipulate(resolved.sidebar, -15), "--sidebarColDarkA": `${colManipulate(resolved.sidebar, -15)}00`, "--sidebarColFocus": sidebarLuma > 100 ? colManipulate(resolved.sidebar, -24) : colManipulate(resolved.sidebar, -27), "--textCol": resolved.text }; } function isCustomThemeDirty(settings) { return settings.primaryCol !== CUSTOM_THEME_DEFAULT.primaryCol || settings.readerBg !== CUSTOM_THEME_DEFAULT.readerBg || settings.accentCol !== CUSTOM_THEME_DEFAULT.accentCol || settings.textCol !== CUSTOM_THEME_DEFAULT.textCol; } function useSettings() { const [settings, setSettings] = reactExports.useState(readStoredSettings); reactExports.useEffect(() => { try { window.localStorage.setItem( STORAGE_KEY, JSON.stringify(flattenSettings(settings)) ); } catch { } }, [settings]); function updateSetting(category, key, value) { setSettings((current) => ({ ...current, [category]: { ...current[category], [key]: value } })); } function cycleSetting(category, key, options) { setSettings((current) => { const currentValue = current[category][key]; const currentIndex = options.findIndex( (option) => option === currentValue ); const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % options.length; return { ...current, [category]: { ...current[category], [key]: options[nextIndex] } }; }); } function toggleSetting(category, key) { setSettings((current) => ({ ...current, [category]: { ...current[category], [key]: !current[category][key] } })); } function resetCustomTheme() { setSettings((current) => ({ ...current, thm: { ...current.thm, theme: "Custom", ...CUSTOM_THEME_DEFAULT } })); } return { cycleSetting, resetCustomTheme, settings, toggleSetting, updateSetting }; } const ReaderSidebar = reactExports.memo(function ReaderSidebar2({ activeGroup, activeGroupIndex, activeChapterIndex, activePage, activePageNumber, closeComicMode, copyShareUrl, cycleSetting, displayGroups, folderMode, goToAdjacentChapter, goToAdjacentGroup, goToChapterAtIndex, getThumbnailUrl, images, isPasswordMode, jumpToChapterStart, logicalActiveGroupIndex, parentChapters, password, readerTitle, requestPassword, scrollToGroup, setIsSettingsOpen, setSettingsTab, settings, statusMessage, toggleSetting }) { const [tooltip, setTooltip] = reactExports.useState(null); const [isTooltipFaded, setIsTooltipFaded] = reactExports.useState(false); const tooltipTimeoutRef = reactExports.useRef(null); const tooltipTargetRef = reactExports.useRef(null); const clearTooltipTimeout = reactExports.useCallback(() => { if (tooltipTimeoutRef.current !== null) { window.clearTimeout(tooltipTimeoutRef.current); tooltipTimeoutRef.current = null; } }, []); reactExports.useEffect(() => clearTooltipTimeout, [clearTooltipTimeout]); const handleMouseOver = reactExports.useCallback( (event) => { if (window.innerWidth <= 768) { return; } const closestTip = event.target.closest( "[data-tip]" ); if (!closestTip || tooltipTargetRef.current === closestTip) { return; } const text = closestTip.getAttribute("data-tip"); if (!text) { return; } tooltipTargetRef.current = closestTip; setTooltip({ text, align: closestTip.getAttribute("data-tip-align") === "right" ? "right" : null, rect: closestTip.getBoundingClientRect(), mouseX: event.clientX }); setIsTooltipFaded(false); clearTooltipTimeout(); tooltipTimeoutRef.current = window.setTimeout(() => { setIsTooltipFaded(true); }, 3e3); }, [clearTooltipTimeout] ); const handleMouseOut = reactExports.useCallback( (event) => { const closestTip = event.target.closest( "[data-tip]" ); if (!closestTip || tooltipTargetRef.current !== closestTip) { return; } if (event.relatedTarget instanceof Node && closestTip.contains(event.relatedTarget)) { return; } tooltipTargetRef.current = null; setTooltip(null); clearTooltipTimeout(); }, [clearTooltipTimeout] ); const hasAdjacentChapters = parentChapters.length > 1; const isRtl = settings.lyt.direction === "rtl"; const isAtFirstGroup = activeGroupIndex === 0; const isAtLastGroup = displayGroups.length > 0 && activeGroupIndex === displayGroups.length - 1; const isAtChapterStart = isRtl ? isAtLastGroup : isAtFirstGroup; const isAtChapterEnd = isRtl ? isAtFirstGroup : isAtLastGroup; const previousGroupDelta = isRtl ? 1 : -1; const nextGroupDelta = isRtl ? -1 : 1; const isImagesMode = folderMode === "images"; const orderedGroups = isRtl ? [...displayGroups].reverse() : displayGroups; const chapterSelectorLabel = isImagesMode ? parentChapters.length > 0 ? parentChapters[activeChapterIndex]?.name ?? "Unknown chapter" : "Chapter 1" : activeGroup ? pageLabel(activeGroup) : "0"; const handleToggleSidebar = reactExports.useCallback(() => { toggleSetting("apr", "sidebar"); }, [toggleSetting]); const handleClose = reactExports.useCallback( (event) => { event.preventDefault(); closeComicMode(); }, [closeComicMode] ); const handlePreventDefault = reactExports.useCallback( (event) => { event.preventDefault(); }, [] ); const handleOpenSettings = reactExports.useCallback(() => { setSettingsTab("Reader"); setIsSettingsOpen(true); }, [setIsSettingsOpen, setSettingsTab]); const handlePrevPage = reactExports.useCallback(() => { if (isAtChapterStart && hasAdjacentChapters) { goToAdjacentChapter(-1); return; } goToAdjacentGroup(previousGroupDelta); }, [ goToAdjacentChapter, goToAdjacentGroup, hasAdjacentChapters, isAtChapterStart, previousGroupDelta ]); const handleNextPage = reactExports.useCallback(() => { if (isAtChapterEnd && hasAdjacentChapters) { goToAdjacentChapter(1); return; } goToAdjacentGroup(nextGroupDelta); }, [ goToAdjacentChapter, goToAdjacentGroup, hasAdjacentChapters, isAtChapterEnd, nextGroupDelta ]); const handlePrevChapter = reactExports.useCallback(() => { goToAdjacentChapter(-1); }, [goToAdjacentChapter]); const handleNextChapter = reactExports.useCallback(() => { goToAdjacentChapter(1); }, [goToAdjacentChapter]); const handleChapterSelectChange = reactExports.useCallback( (event) => { const nextIndex = Number.parseInt(event.target.value, 10); if (Number.isNaN(nextIndex)) { return; } if (isImagesMode) { if (parentChapters.length > 0) { goToChapterAtIndex(nextIndex); } return; } scrollToGroup( getDisplayGroupIndex( nextIndex, displayGroups.length, settings.lyt.direction ) ); }, [ displayGroups.length, goToChapterAtIndex, isImagesMode, parentChapters.length, scrollToGroup, settings.lyt.direction ] ); const handlePageSelectChange = reactExports.useCallback( (event) => { const targetPage = Number.parseInt(event.target.value, 10); const targetGroupIndex = findGroupIndexForPage(displayGroups, targetPage); if (targetGroupIndex !== -1) { scrollToGroup(targetGroupIndex); } }, [displayGroups, scrollToGroup] ); const handleCyclePreload = reactExports.useCallback(() => { cycleSetting("bhv", "preload", PRELOAD_OPTIONS); }, [cycleSetting]); const handleCycleFit = reactExports.useCallback(() => { cycleSetting("lyt", "fit", FIT_OPTIONS); }, [cycleSetting]); const handleCycleDirection = reactExports.useCallback(() => { cycleSetting("lyt", "direction", DIRECTION_OPTIONS); }, [cycleSetting]); const handleCycleSpread = reactExports.useCallback(() => { cycleSetting("lyt", "spread", SPREAD_OPTIONS); }, [cycleSetting]); const handleTogglePinned = reactExports.useCallback(() => { toggleSetting("apr", "selPinned"); }, [toggleSetting]); const handleTogglePreviews = reactExports.useCallback(() => { toggleSetting("apr", "previews"); }, [toggleSetting]); const handlePreviewClick = reactExports.useCallback( (event) => { const groupIndex = Number.parseInt( event.currentTarget.dataset.groupIndex ?? "", 10 ); if (!Number.isNaN(groupIndex)) { scrollToGroup(groupIndex); } }, [scrollToGroup] ); const handleCopyUrl = reactExports.useCallback( (event) => { event.preventDefault(); copyShareUrl(); }, [copyShareUrl] ); const tooltipParts = reactExports.useMemo( () => tooltip?.text.split(/(\[.+?\])/) ?? [], [tooltip] ); return jsxRuntimeExports.jsxs( "aside", { className: "", onMouseOver: handleMouseOver, onMouseOut: handleMouseOut, children: [ jsxRuntimeExports.jsx( "div", { className: "hide-side UI Button MultiStateButton", "data-tip": "Show/hide sidebar [S]", "data-tip-align": "right", ...{ "data-apr.sidebar": settings.apr.sidebar }, onClick: handleToggleSidebar, role: "button", tabIndex: 0, children: jsxRuntimeExports.jsx("div", { className: "hide-side-actual ico-btn" }) } ), jsxRuntimeExports.jsxs("header", { children: [ jsxRuntimeExports.jsx("a", { className: "ico-btn guya", href: "/", onClick: handleClose }), jsxRuntimeExports.jsx("h1", { children: jsxRuntimeExports.jsx("a", { href: "#", onClick: handlePreventDefault, children: readerTitle }) }), jsxRuntimeExports.jsx("button", { className: "ico-btn", type: "button" }) ] }), jsxRuntimeExports.jsx("div", { className: "rdr-aside-buffer" }), jsxRuntimeExports.jsxs("div", { className: "rdr-aside-content", children: [ jsxRuntimeExports.jsxs("section", { className: "rdr-selector", children: [ jsxRuntimeExports.jsxs("div", { className: "rdr-selector-top", children: [ jsxRuntimeExports.jsx( "button", { className: "rdr-selector-vol ico-btn prev", "data-tip": "Next page [.]", onClick: handlePrevPage, type: "button" } ), jsxRuntimeExports.jsx("div", { className: "flex-spacer UI MessageBox", id: "message-box", children: statusMessage }), jsxRuntimeExports.jsx( "button", { className: "ico-btn UI Button password", "data-password-active": password !== null, "data-tip": password ? "Set new/Clear decryption password [K]" : "Set decryption password [K]", onClick: requestPassword, type: "button", children: jsxRuntimeExports.jsx( "svg", { xmlns: "http://www.w3.org/2000/svg", width: 20, height: 20, viewBox: "0 0 24 24", children: jsxRuntimeExports.jsx( "path", { fill: "currentColor", d: "M2.5 18.5v-1h19v1zm.535-5.973l-.762-.442l.965-1.693h-1.93v-.884h1.93l-.965-1.642l.762-.443L4 9.066l.966-1.643l.761.443l-.965 1.642h1.93v.884h-1.93l.965 1.693l-.762.442L4 10.835zm8 0l-.762-.442l.966-1.693H9.308v-.884h1.93l-.965-1.642l.762-.443L12 9.066l.966-1.643l.761.443l-.965 1.642h1.93v.884h-1.93l.965 1.693l-.762.442L12 10.835zm8 0l-.762-.442l.966-1.693h-1.931v-.884h1.93l-.965-1.642l.762-.443L20 9.066l.966-1.643l.761.443l-.965 1.642h1.93v.884h-1.93l.965 1.693l-.762.442L20 10.835z" } ) } ) } ), jsxRuntimeExports.jsx( "a", { className: "rdr-share ico-btn ", "data-tip": "Copy short link [R]", onClick: handleCopyUrl, role: "button", tabIndex: 0 } ), jsxRuntimeExports.jsx( "button", { className: "ico-btn jump", "data-tip": "Jump to top [J]", onClick: jumpToChapterStart, type: "button" } ) ] }), jsxRuntimeExports.jsxs("div", { className: "rdr-selector-mid", children: [ jsxRuntimeExports.jsx( "button", { className: "rdr-selector-chap ico-btn prev", "data-tip": "Previous chapter [[]", onClick: handlePrevChapter, type: "button" } ), jsxRuntimeExports.jsxs("div", { className: "rdr-vol-wrap UI FauxDrop", children: [ jsxRuntimeExports.jsx("label", { children: activePageNumber }), jsxRuntimeExports.jsx( "select", { className: "UI List SimpleList", id: "rdr-vol", onChange: handlePageSelectChange, value: String(activePage), children: images.map((image, index) => jsxRuntimeExports.jsxs( "option", { className: "UI SimpleListItem", value: String(index), children: [ "Page ", index + 1 ] }, image.id )) } ) ] }), jsxRuntimeExports.jsxs("div", { className: "rdr-chap-wrap UI FauxDrop", children: [ jsxRuntimeExports.jsx("label", { children: chapterSelectorLabel }), jsxRuntimeExports.jsx( "select", { className: "UI List SimpleList", disabled: isImagesMode && parentChapters.length === 0, id: "rdr-chap", onChange: handleChapterSelectChange, value: String( isImagesMode ? activeChapterIndex : logicalActiveGroupIndex ), children: isImagesMode ? parentChapters.length > 0 ? parentChapters.map((chapter, index) => jsxRuntimeExports.jsx( "option", { className: "UI SimpleListItem", value: String(index), children: chapter.name }, chapter.id )) : jsxRuntimeExports.jsx("option", { className: "UI SimpleListItem", value: "0", children: "Chapter 1" }) : orderedGroups.map((group, index) => jsxRuntimeExports.jsx( "option", { className: "UI SimpleListItem", value: String(index), children: pageLabel(group) }, group.id )) } ) ] }), jsxRuntimeExports.jsx( "button", { className: "rdr-selector-chap ico-btn next", "data-tip": "Next chapter []]", onClick: handleNextChapter, type: "button" } ) ] }), jsxRuntimeExports.jsxs("div", { className: "rdr-selector-bot", children: [ jsxRuntimeExports.jsx( "button", { className: "rdr-selector-vol ico-btn next", "data-tip": "Previous page [,]", onClick: handleNextPage, type: "button" } ), jsxRuntimeExports.jsx("div", { className: "flex-spacer" }), jsxRuntimeExports.jsx( "button", { ...{ "data-bhv.preload": settings.bhv.preload }, className: "ico-btn hidden UI Button MultiStateButton", "data-tip": "Change preload [L]", onClick: handleCyclePreload, type: "button" } ), jsxRuntimeExports.jsx( "button", { ...{ "data-lyt.fit": settings.lyt.fit }, className: "ico-btn UI Button MultiStateButton", "data-tip": "Change fit mode [F]", onClick: handleCycleFit, type: "button" } ), jsxRuntimeExports.jsx( "button", { ...{ "data-lyt.direction": settings.lyt.direction }, className: "ico-btn UI Button MultiStateButton", "data-tip": "Change layout direction [D]", onClick: handleCycleDirection, type: "button" } ), jsxRuntimeExports.jsx( "button", { ...{ "data-lyt.spread": settings.lyt.spread }, className: "ico-btn UI Button MultiStateButton", "data-tip": "Change two-page mode [Q]", onClick: handleCycleSpread, type: "button" } ), jsxRuntimeExports.jsx( "button", { ...{ "data-apr.selpinned": settings.apr.selPinned }, className: "ico-btn UI Button MultiStateButton", "data-tip": "Pin page selector [N]", onClick: handleTogglePinned, type: "button" } ), jsxRuntimeExports.jsx( "button", { className: "ico-btn", "data-bind": "settings_button", "data-tip": "Advanced settings... [O]", onClick: handleOpenSettings, type: "button" } ) ] }) ] }), jsxRuntimeExports.jsx("section", { className: "rdr-groups UI List Selector Tabs", children: jsxRuntimeExports.jsxs("div", { className: "is-active UI SimpleListItem", children: [ images.length, " image pages detected" ] }) }), jsxRuntimeExports.jsx("section", { className: "rdr-previews", children: !isPasswordMode && jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ jsxRuntimeExports.jsxs( "div", { className: "header UI Button MultiStateButton", ...{ "data-apr.previews": settings.apr.previews }, onClick: handleTogglePreviews, role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("span", { children: "Previews" }), jsxRuntimeExports.jsx( "div", { className: "ico-btn expander", "data-tip": "Show previews [P]" } ) ] } ), jsxRuntimeExports.jsx("div", { className: "rdr-previews-gallery UI List Selector Tabs", children: images.map((image, index) => { const previewGroupIndex = findGroupIndexForPage( displayGroups, index ); return jsxRuntimeExports.jsx( "img", { className: previewGroupIndex === activeGroupIndex ? "is-active" : void 0, "data-group-index": String(previewGroupIndex), loading: "lazy", onClick: handlePreviewClick, src: getThumbnailUrl(image) }, image.id ); }) }) ] }) }), jsxRuntimeExports.jsx("section", { className: "rdr-description", children: jsxRuntimeExports.jsx("div", { children: jsxRuntimeExports.jsx( "a", { href: "https://github.com/zennomi/truyendrive", target: "_blank", rel: "noreferrer", children: "truyendrive on GitHub" } ) }) }) ] }), tooltip && jsxRuntimeExports.jsx( "div", { className: `Tooltippy ${isTooltipFaded ? "fadeOut" : ""}`, style: { position: "fixed", display: "block", zIndex: 3e3, ...tooltip.align === "right" ? { left: `${tooltip.rect.right + 4}px`, top: `${tooltip.rect.top}px` } : { bottom: `${window.innerHeight - tooltip.rect.top + 2}px`, ...tooltip.mouseX > window.innerWidth / 2 ? { right: `${window.innerWidth - tooltip.rect.right}px`, left: "unset" } : { left: `${tooltip.rect.left}px`, right: "unset" } } }, children: tooltipParts.map((part, i) => { if (part.startsWith("[") && part.endsWith("]")) { return jsxRuntimeExports.jsx("span", { className: "Tooltippy-key", children: part.slice(1, -1) }, i); } return part; }) } ) ] } ); }); const ZoomControls = reactExports.memo(function ZoomControls2({ isVisible, onZoomChange, showZoomControls, zoom }) { const handleZoomIn = reactExports.useCallback(() => { onZoomChange(Math.min(100, zoom + 10)); showZoomControls(); }, [onZoomChange, showZoomControls, zoom]); const handleZoomOut = reactExports.useCallback(() => { onZoomChange(Math.max(10, zoom - 10)); showZoomControls(); }, [onZoomChange, showZoomControls, zoom]); return jsxRuntimeExports.jsxs("div", { className: `zoom-level${isVisible ? " vis" : ""}`, children: [ jsxRuntimeExports.jsx("button", { className: "ico-btn", onClick: handleZoomIn, type: "button", children: "" }), jsxRuntimeExports.jsx("button", { className: "ico-btn", onClick: handleZoomOut, type: "button", children: "" }) ] }); }); function startCase(value) { return value.replace(/[-_]/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()); } function SettingBlock({ children, compact = false, nomobile = false, disabled = false, title }) { const wrapperClasses = ["setting-wrapper", "UI", "SettingUnit"]; if (compact) wrapperClasses.push("compact"); if (nomobile) wrapperClasses.push("nomobile"); const headerClasses = ["setting-header"]; if (disabled) headerClasses.push("disabled"); const fieldClasses = ["setting-field", "UI", "SettingDisplay"]; if (disabled) fieldClasses.push("disabled"); return jsxRuntimeExports.jsxs("div", { className: wrapperClasses.join(" "), children: [ jsxRuntimeExports.jsx("header", { className: headerClasses.join(" "), children: title }), jsxRuntimeExports.jsx("div", { className: fieldClasses.join(" "), children }) ] }); } function ButtonGroup({ labels, onChange, selected, values }) { return jsxRuntimeExports.jsx("div", { className: "t-row UI ButtonGroup", children: jsxRuntimeExports.jsx("div", { className: "t-1", children: values.map((value) => jsxRuntimeExports.jsxs( "div", { className: `ToggleButton UI Button${selected === value ? " s" : ""}`, onClick: () => onChange(value), role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("div", { className: "ico-btn" }), jsxRuntimeExports.jsx("span", { children: labels?.[`${value}`] ?? startCase(String(value)) }) ] }, String(value) )) }) }); } function BooleanGroup({ falseLabel, onChange, trueLabel, value }) { return jsxRuntimeExports.jsx( ButtonGroup, { labels: { false: falseLabel, true: trueLabel }, onChange, selected: value, values: [true, false] } ); } function SliderGroup({ onChange, options, ticks, value }) { const selectedIndex = Math.max( 0, options.findIndex((opt) => opt === value) ); return jsxRuntimeExports.jsxs("div", { className: "UI Slider", children: [ jsxRuntimeExports.jsxs("div", { className: "slider-wrap", children: [ jsxRuntimeExports.jsx( "input", { className: "slider-control", max: options.length - 1, min: 0, onChange: (e) => onChange(options[Number(e.target.value)]), type: "range", value: selectedIndex } ), jsxRuntimeExports.jsx("div", { className: "ticks", children: ticks.map((tick, index) => jsxRuntimeExports.jsx("i", { children: tick }, index)) }) ] }), jsxRuntimeExports.jsx( "input", { className: "slider-value", type: "text", readOnly: true, value: value === 100 && options.includes(100) ? "∞" : value } ) ] }); } function ThemeDropdown({ onChange, selected, values }) { const [open, setOpen] = reactExports.useState(false); return jsxRuntimeExports.jsxs("div", { className: "dropdown UI InputDropdown", onClick: () => setOpen(!open), children: [ jsxRuntimeExports.jsxs("div", { className: "input-container", children: [ jsxRuntimeExports.jsx( "input", { type: "text", placeholder: selected, className: "dropbtn", readOnly: true, value: selected } ), jsxRuntimeExports.jsx("span", { className: "arrd" }) ] }), jsxRuntimeExports.jsx( "div", { className: `dropdown-content${open ? "" : " hidden"}`, tabIndex: -1, style: { height: "unset" }, children: values.map((value) => jsxRuntimeExports.jsx( "button", { className: "opts", onClick: (e) => { e.stopPropagation(); onChange(value); setOpen(false); }, type: "button", children: value }, value )) } ) ] }); } function SettingsContent({ resetCustomTheme, settings, tab, updateSetting }) { const resolvedTheme = getResolvedTheme(settings.thm); const themeValues = { accentCol: settings.thm.theme === "Custom" ? settings.thm.accentCol : resolvedTheme.accent.toUpperCase(), primaryCol: settings.thm.theme === "Custom" ? settings.thm.primaryCol : resolvedTheme.sidebar.toUpperCase(), readerBg: settings.thm.theme === "Custom" ? settings.thm.readerBg : resolvedTheme.reader.toUpperCase(), textCol: settings.thm.theme === "Custom" ? settings.thm.textCol : resolvedTheme.text.toUpperCase() }; const updateThemeColor = (key, value) => { const normalizedValue = value.toUpperCase(); if (settings.thm.theme !== "Custom") { updateSetting("thm", "primaryCol", resolvedTheme.sidebar.toUpperCase()); updateSetting("thm", "textCol", resolvedTheme.text.toUpperCase()); updateSetting("thm", "accentCol", resolvedTheme.accent.toUpperCase()); updateSetting("thm", "readerBg", resolvedTheme.reader.toUpperCase()); updateSetting("thm", "theme", "Custom"); } updateSetting("thm", key, normalizedValue); }; return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ jsxRuntimeExports.jsxs("div", { className: `UI Dummy${tab === "Reader" ? "" : " is-hidden"}`, children: [ jsxRuntimeExports.jsx(SettingBlock, { title: "Page fit", children: jsxRuntimeExports.jsxs("div", { className: "UI ButtonGroup", children: [ jsxRuntimeExports.jsx("div", { className: "t-row", children: jsxRuntimeExports.jsx("div", { className: "t-1", children: jsxRuntimeExports.jsxs( "div", { className: `ToggleButton UI Button${settings.lyt.fit === "none" ? " s" : ""}`, onClick: () => updateSetting("lyt", "fit", "none"), role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("div", { className: "ico-btn" }), jsxRuntimeExports.jsx("span", { children: "Original size" }) ] } ) }) }), jsxRuntimeExports.jsxs("div", { className: "t-row", children: [ jsxRuntimeExports.jsx("div", { className: "t-tooltip", children: "Limit" }), jsxRuntimeExports.jsxs("div", { className: "t-1", children: [ jsxRuntimeExports.jsxs( "div", { className: `ToggleButton UI Button${settings.lyt.fit === "all_limit" ? " s" : ""}`, onClick: () => updateSetting("lyt", "fit", "all_limit"), role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("div", { className: "ico-btn" }), jsxRuntimeExports.jsx("span", { children: "All" }) ] } ), jsxRuntimeExports.jsxs( "div", { className: `ToggleButton UI Button${settings.lyt.fit === "width_limit" ? " s" : ""}`, onClick: () => updateSetting("lyt", "fit", "width_limit"), role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("div", { className: "ico-btn" }), jsxRuntimeExports.jsx("span", { children: "Width" }) ] } ), jsxRuntimeExports.jsxs( "div", { className: `ToggleButton UI Button${settings.lyt.fit === "height_limit" ? " s" : ""}`, onClick: () => updateSetting("lyt", "fit", "height_limit"), role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("div", { className: "ico-btn" }), jsxRuntimeExports.jsx("span", { children: "Height" }) ] } ) ] }) ] }), jsxRuntimeExports.jsxs("div", { className: "t-row", children: [ jsxRuntimeExports.jsx("div", { className: "t-tooltip", children: "Stretch" }), jsxRuntimeExports.jsxs("div", { className: "t-1", children: [ jsxRuntimeExports.jsxs( "div", { className: `ToggleButton UI Button${settings.lyt.fit === "all" ? " s" : ""}`, onClick: () => updateSetting("lyt", "fit", "all"), role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("div", { className: "ico-btn" }), jsxRuntimeExports.jsx("span", { children: "All" }) ] } ), jsxRuntimeExports.jsxs( "div", { className: `ToggleButton UI Button${settings.lyt.fit === "width" ? " s" : ""}`, onClick: () => updateSetting("lyt", "fit", "width"), role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("div", { className: "ico-btn" }), jsxRuntimeExports.jsx("span", { children: "Width" }) ] } ), jsxRuntimeExports.jsxs( "div", { className: `ToggleButton UI Button${settings.lyt.fit === "height" ? " s" : ""}`, onClick: () => updateSetting("lyt", "fit", "height"), role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("div", { className: "ico-btn" }), jsxRuntimeExports.jsx("span", { children: "Height" }) ] } ) ] }) ] }) ] }) }), jsxRuntimeExports.jsx( SettingBlock, { nomobile: true, disabled: [ "none", "all_limit", "height_limit", "all", "height" ].includes(settings.lyt.fit), title: "Maximum page width", children: jsxRuntimeExports.jsx( SliderGroup, { onChange: (value) => updateSetting("lyt", "zoom", value), options: ZOOM_OPTIONS, ticks: ZOOM_OPTIONS.map((val) => `${val}%`), value: settings.lyt.zoom } ) } ), jsxRuntimeExports.jsx(SettingBlock, { title: "Reader layout", children: jsxRuntimeExports.jsx( ButtonGroup, { labels: { ltr: "Left-to-right", rtl: "Right-to-left", ttb: "Top-to-bottom" }, onChange: (value) => updateSetting("lyt", "direction", value), selected: settings.lyt.direction, values: DIRECTION_OPTIONS } ) }), jsxRuntimeExports.jsx(SettingBlock, { compact: true, title: "Remove gaps in vertical view", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Gaps applied", onChange: (value) => updateSetting("lyt", "gap", value), trueLabel: "Gaps removed", value: settings.lyt.gap } ) }), jsxRuntimeExports.jsx(SettingBlock, { title: "2-page spread", children: jsxRuntimeExports.jsx( ButtonGroup, { labels: { "1": "1-page layout", "2": "2-page layout", "2-odd": "2-page layout, odd" }, onChange: (value) => updateSetting("lyt", "spread", value), selected: settings.lyt.spread, values: SPREAD_OPTIONS } ) }) ] }), jsxRuntimeExports.jsxs("div", { className: `UI Dummy${tab === "Behavior" ? "" : " is-hidden"}`, children: [ jsxRuntimeExports.jsx(SettingBlock, { title: "Page preload", children: jsxRuntimeExports.jsx( SliderGroup, { onChange: (value) => updateSetting("bhv", "preload", value), options: PRELOAD_OPTIONS, ticks: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "∞"], value: settings.bhv.preload } ) }), jsxRuntimeExports.jsx( SettingBlock, { nomobile: true, title: "Vertical scroll speed using keyboard arrows", children: jsxRuntimeExports.jsx( SliderGroup, { onChange: (value) => updateSetting("bhv", "scrollYDelta", value), options: SCROLL_SPEED_OPTIONS, ticks: SCROLL_SPEED_OPTIONS.map((val) => `${val}px`), value: settings.bhv.scrollYDelta } ) } ), jsxRuntimeExports.jsx(SettingBlock, { compact: true, title: "Reset page scroll after page flip", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Leave it be", onChange: (value) => updateSetting("bhv", "resetScroll", value), trueLabel: "Reset", value: settings.bhv.resetScroll } ) }), jsxRuntimeExports.jsx(SettingBlock, { compact: true, title: "Turn pages by clicking", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Disabled", onChange: (value) => updateSetting("bhv", "clickTurnPage", value), trueLabel: "Turn page", value: settings.bhv.clickTurnPage } ) }), jsxRuntimeExports.jsx( SettingBlock, { compact: true, title: "Turn pages with arrow keys in vertical view", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Disabled", onChange: (value) => updateSetting("bhv", "arrowTurnPage", value), trueLabel: "Turn page", value: settings.bhv.arrowTurnPage } ) } ), jsxRuntimeExports.jsx(SettingBlock, { compact: true, title: "Enable swipe gestures", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Swipe disabled", onChange: (value) => updateSetting("bhv", "swipeGestures", value), trueLabel: "Swipe enabled", value: settings.bhv.swipeGestures } ) }), jsxRuntimeExports.jsx(SettingBlock, { title: "Browser history/back button behavior", children: jsxRuntimeExports.jsx( ButtonGroup, { labels: { all: "Add every move to history", chap: "Add every chapter to history", jump: "Add every chapter and page skips", none: "Don't touch browser history", replace: "Just change the page title" }, onChange: (value) => updateSetting("bhv", "historyUpdate", value), selected: settings.bhv.historyUpdate, values: HISTORY_UPDATE_OPTIONS } ) }) ] }), jsxRuntimeExports.jsxs("div", { className: `UI Dummy${tab === "Layout" ? "" : " is-hidden"}`, children: [ jsxRuntimeExports.jsx(SettingBlock, { nomobile: true, title: "Page selector position", children: jsxRuntimeExports.jsx( ButtonGroup, { labels: { bottom: "Bottom", left: "Left" }, onChange: (value) => updateSetting("apr", "selectorAnchor", value), selected: settings.apr.selectorAnchor, values: SELECTOR_ANCHOR_OPTIONS } ) }), jsxRuntimeExports.jsx(SettingBlock, { compact: true, title: "Pin page selector", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Shown on hover", onChange: (value) => updateSetting("apr", "selPinned", value), trueLabel: "Pinned", value: settings.apr.selPinned } ) }), jsxRuntimeExports.jsx(SettingBlock, { compact: true, title: "Page selector: show page number", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Hide page number", onChange: (value) => updateSetting("apr", "selNum", value), trueLabel: "Show page number", value: settings.apr.selNum } ) }), jsxRuntimeExports.jsx( SettingBlock, { compact: true, nomobile: true, title: "Mouseover reader hints (next, prev)", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Hidden", onChange: (value) => updateSetting("apr", "hoverinos", value), trueLabel: "Visible", value: settings.apr.hoverinos } ) } ), jsxRuntimeExports.jsx(SettingBlock, { compact: true, nomobile: true, title: "Show sidebar", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Hide sidebar", onChange: (value) => updateSetting("apr", "sidebar", value), trueLabel: "Show sidebar", value: settings.apr.sidebar } ) }), jsxRuntimeExports.jsx(SettingBlock, { compact: true, nomobile: true, title: "Show previews", children: jsxRuntimeExports.jsx( BooleanGroup, { falseLabel: "Hide previews", onChange: (value) => updateSetting("apr", "previews", value), trueLabel: "Show previews", value: settings.apr.previews } ) }) ] }), jsxRuntimeExports.jsxs("div", { className: `UI Dummy${tab === "Themes" ? "" : " is-hidden"}`, children: [ jsxRuntimeExports.jsx(SettingBlock, { title: "Reader Theme", children: jsxRuntimeExports.jsx( ThemeDropdown, { onChange: (value) => updateSetting("thm", "theme", value), selected: settings.thm.theme, values: THEME_OPTIONS } ) }), jsxRuntimeExports.jsx( SettingBlock, { compact: true, disabled: settings.thm.theme !== "Custom", title: "Interface Color", children: jsxRuntimeExports.jsx( "button", { "aria-label": "toggle color picker dialog", className: "UI ColorPicker", onClick: () => { const input = document.createElement("input"); input.type = "color"; input.value = themeValues.primaryCol; input.oninput = (e) => updateThemeColor( "primaryCol", e.target.value ); input.click(); }, role: "button", style: { backgroundColor: themeValues.primaryCol }, type: "button" } ) } ), jsxRuntimeExports.jsx( SettingBlock, { compact: true, disabled: settings.thm.theme !== "Custom", title: "Text Color", children: jsxRuntimeExports.jsx( "button", { "aria-label": "toggle color picker dialog", className: "UI ColorPicker", onClick: () => { const input = document.createElement("input"); input.type = "color"; input.value = themeValues.textCol; input.oninput = (e) => updateThemeColor( "textCol", e.target.value ); input.click(); }, role: "button", style: { backgroundColor: themeValues.textCol }, type: "button" } ) } ), jsxRuntimeExports.jsx( SettingBlock, { compact: true, disabled: settings.thm.theme !== "Custom", title: "Accent Color", children: jsxRuntimeExports.jsx( "button", { "aria-label": "toggle color picker dialog", className: "UI ColorPicker", onClick: () => { const input = document.createElement("input"); input.type = "color"; input.value = themeValues.accentCol; input.oninput = (e) => updateThemeColor( "accentCol", e.target.value ); input.click(); }, role: "button", style: { backgroundColor: themeValues.accentCol }, type: "button" } ) } ), jsxRuntimeExports.jsx( SettingBlock, { compact: true, disabled: settings.thm.theme !== "Custom", title: "Reader Background", children: jsxRuntimeExports.jsx( "button", { "aria-label": "toggle color picker dialog", className: "UI ColorPicker", onClick: () => { const input = document.createElement("input"); input.type = "color"; input.value = themeValues.readerBg; input.oninput = (e) => updateThemeColor( "readerBg", e.target.value ); input.click(); }, role: "button", style: { backgroundColor: themeValues.readerBg }, type: "button" } ) } ), jsxRuntimeExports.jsx( SettingBlock, { compact: true, disabled: settings.thm.theme !== "Custom" || !isCustomThemeDirty(settings.thm), title: "", children: jsxRuntimeExports.jsx( "button", { className: "reset-btn UI ResetButton", onClick: resetCustomTheme, type: "button", children: "Reset" } ) } ) ] }), settings.adv && jsxRuntimeExports.jsxs("div", { className: `UI Dummy${tab === "Advanced" ? "" : " is-hidden"}`, children: [ jsxRuntimeExports.jsx(SettingBlock, { title: "Spread mode custom page count", children: jsxRuntimeExports.jsx( SliderGroup, { onChange: (value) => updateSetting("adv", "spreadCount", value), options: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ticks: [ "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p" ], value: settings.adv.spreadCount } ) }), jsxRuntimeExports.jsx(SettingBlock, { disabled: true, title: "Spread mode custom page offset", children: jsxRuntimeExports.jsx( SliderGroup, { onChange: (value) => updateSetting("adv", "spreadOffset", value), options: [0], ticks: ["0p"], value: settings.adv.spreadOffset } ) }), jsxRuntimeExports.jsx(SettingBlock, { title: "Number of parallel image downloads", children: jsxRuntimeExports.jsx( SliderGroup, { onChange: (value) => updateSetting("adv", "parallelDownloads", value), options: [5, 10, 15, 20, 25, 30, 35, 40, 45, 50], ticks: [ "5", "10", "15", "20", "25", "30", "35", "40", "45", "50" ], value: settings.adv.parallelDownloads } ) }) ] }), jsxRuntimeExports.jsxs("div", { className: `UI About${tab === "About" ? "" : " is-hidden"}`, children: [ jsxRuntimeExports.jsx("p", { className: "muted", children: " " }), jsxRuntimeExports.jsx("p", { className: "muted", children: " " }), jsxRuntimeExports.jsx("p", { className: "muted", children: "Powered by" }), jsxRuntimeExports.jsx("div", { className: "cubari", children: jsxRuntimeExports.jsx("div", {}) }), jsxRuntimeExports.jsx("hr", {}), jsxRuntimeExports.jsx("p", { children: "Reader code: Cubari.moe" }), jsxRuntimeExports.jsx("p", { children: "Userscript: Zennomi" }), jsxRuntimeExports.jsx("hr", {}), jsxRuntimeExports.jsx( "a", { href: "https://github.com/zennomi/truyendrive", rel: "noreferrer", target: "_blank", children: "github" } ), jsxRuntimeExports.jsx("hr", {}), jsxRuntimeExports.jsx("p", { style: { maxWidth: "15em", textAlign: "center", lineHeight: 1.5 }, children: "TruyenDrive does not host any of the content you are viewing. Just like your computer does not store or own all the images you see on the internet, TruyenDrive is doing the same thing. We are simply a service that lets you view other data on the internet using our custom UI." }) ] }) ] }); } function SettingsModal({ activeTab, onClose, onTabChange, open, resetCustomTheme, settings, updateSetting }) { if (!open) { return null; } const tabs = [ "Reader", "Behavior", "Layout", "Themes", "Advanced", "About" ]; return jsxRuntimeExports.jsx( "div", { className: "LodaManager", onMouseDown: (event) => { if (event.target === event.currentTarget) { onClose(); } }, children: jsxRuntimeExports.jsxs( "div", { className: "Loda-window UI Loda Loda_Settings", onMouseDown: (event) => event.stopPropagation(), role: "dialog", tabIndex: -1, children: [ jsxRuntimeExports.jsxs("aside", { children: [ jsxRuntimeExports.jsx("button", { className: "ico-btn close", onClick: onClose, type: "button" }), jsxRuntimeExports.jsx("header", { children: "Settings" }), jsxRuntimeExports.jsx("div", { className: "settings-tabs UI List Selector Tabs", children: tabs.map((tab) => jsxRuntimeExports.jsxs( "div", { className: `UI Tab IconTab${activeTab === tab ? " is-active" : ""}`, "data-name": tab, onClick: () => onTabChange(tab), role: "button", tabIndex: 0, children: [ jsxRuntimeExports.jsx("i", { className: "ico-btn" }), jsxRuntimeExports.jsx("span", { children: tab }), jsxRuntimeExports.jsx("i", {}) ] }, tab )) }) ] }), jsxRuntimeExports.jsx("content", { className: "UI List Selector ContainerList", children: jsxRuntimeExports.jsx( SettingsContent, { resetCustomTheme, settings, tab: activeTab, updateSetting } ) }) ] } ) } ); } const ProviderContext = reactExports.createContext( void 0 ); const AUTH_USER_POLL_MS = 500; function ProviderProvider({ children, provider: provider2 }) { const [authUser, setAuthUser] = reactExports.useState(() => provider2.getAuthUser()); const [error, setError] = reactExports.useState( () => provider2.getInitError() ); const [isLoading, setIsLoading] = reactExports.useState(() => !provider2.isReady()); const [isReady, setIsReady] = reactExports.useState(() => provider2.isReady()); reactExports.useEffect(() => { const syncAuthUser = () => { const nextAuthUser = provider2.getAuthUser(); setAuthUser( (currentAuthUser) => currentAuthUser === nextAuthUser ? currentAuthUser : nextAuthUser ); }; syncAuthUser(); const intervalId = window.setInterval(syncAuthUser, AUTH_USER_POLL_MS); window.addEventListener("hashchange", syncAuthUser); window.addEventListener("popstate", syncAuthUser); return () => { window.clearInterval(intervalId); window.removeEventListener("hashchange", syncAuthUser); window.removeEventListener("popstate", syncAuthUser); }; }, [provider2]); reactExports.useEffect(() => { let isCancelled = false; const isReadyBeforeInit = provider2.isReady(); setError(null); setIsLoading(!isReadyBeforeInit); setIsReady(isReadyBeforeInit); provider2.initialize().catch(() => void 0).then(() => { if (isCancelled) { return; } setError(provider2.getInitError()); setIsReady(provider2.isReady()); setIsLoading(false); }); return () => { isCancelled = true; }; }, [authUser, provider2]); const value = reactExports.useMemo( () => ({ error, isLoading, isReady, provider: provider2 }), [error, isLoading, isReady, provider2] ); return jsxRuntimeExports.jsx(ProviderContext.Provider, { value, children }); } function useProvider() { const context = reactExports.useContext(ProviderContext); if (!context) { throw new Error("useProvider must be used within a ProviderProvider"); } return context.provider; } function useProviderStatus() { const context = reactExports.useContext(ProviderContext); if (!context) { throw new Error("useProviderStatus must be used within a ProviderProvider"); } return { error: context.error, isLoading: context.isLoading, isReady: context.isReady }; } function logOpenError(message, details) { console.error(`[TruyenDrive] ${message}`, { href: window.location.href, host: window.location.hostname, ...details }); } function mergeImages(currentImages, nextImages) { if (nextImages.length === 0) { return currentImages; } const knownIds = new Set(currentImages.map((image) => image.id)); const mergedImages = [...currentImages]; nextImages.forEach((image) => { if (!knownIds.has(image.id)) { knownIds.add(image.id); mergedImages.push(image); } }); return mergedImages.length === currentImages.length ? currentImages : mergedImages; } function mergeChapters(currentChapters, nextChapters) { if (nextChapters.length === 0) { return currentChapters; } const knownIds = new Set(currentChapters.map((chapter) => chapter.id)); const mergedChapters = [...currentChapters]; nextChapters.forEach((chapter) => { if (!knownIds.has(chapter.id)) { knownIds.add(chapter.id); mergedChapters.push(chapter); } }); return mergedChapters.length === currentChapters.length ? currentChapters : mergedChapters; } function useComicMode({ beginReaderSession, initialChapterId = null, initialPage = -1, onResetPassword, onResetUi, resetHistoryState }) { const provider2 = useProvider(); const { error: providerError, isLoading: isProviderLoading, isReady: isProviderReady } = useProviderStatus(); const [activeResource, setActiveResource] = reactExports.useState( null ); const activeFolderId = activeResource?.id ?? null; const [activeChapterIndex, setActiveChapterIndex] = reactExports.useState(0); const [chapters, setChapters] = reactExports.useState([]); const [folderDetails, setFolderDetails] = reactExports.useState( null ); const [folderMode, setFolderMode] = reactExports.useState(null); const [folderPassword, setFolderPassword] = reactExports.useState(null); const [folderEncryptionMethod, setFolderEncryptionMethod] = reactExports.useState(null); const [images, setImages] = reactExports.useState([]); const [isAutoOpening, setIsAutoOpening] = reactExports.useState( initialChapterId !== null || initialPage >= 0 ); const [isFolderScanComplete, setIsFolderScanComplete] = reactExports.useState(false); const [isModePickerOpen, setIsModePickerOpen] = reactExports.useState(false); const [isOpen, setIsOpen] = reactExports.useState(false); const [parentChapters, setParentChapters] = reactExports.useState([]); const [statusMessage, setStatusMessage] = reactExports.useState("Ready"); const activeFetchIdRef = reactExports.useRef(0); const chaptersRef = reactExports.useRef([]); const firstPageCacheRef = reactExports.useRef(null); const imagesRef = reactExports.useRef([]); const initialChapterIdRef = reactExports.useRef(initialChapterId); const initialPageRef = reactExports.useRef(initialPage); const initialReaderOpenAttemptedRef = reactExports.useRef(false); const initialChapterOpenAttemptedRef = reactExports.useRef(false); const cancelFetchLoop = reactExports.useCallback(() => { activeFetchIdRef.current += 1; }, []); const replaceImages = reactExports.useCallback((nextImages) => { imagesRef.current = nextImages; setImages(nextImages); }, []); const replaceChapters = reactExports.useCallback((nextChapters) => { chaptersRef.current = nextChapters; setChapters(nextChapters); }, []); const resetParentChapterState = reactExports.useCallback(() => { setActiveChapterIndex(0); setParentChapters([]); }, []); const resetReaderState = reactExports.useCallback( (restoreHistoryUrl = false) => { cancelFetchLoop(); firstPageCacheRef.current = null; onResetPassword(); onResetUi(); setActiveResource(null); resetParentChapterState(); replaceChapters([]); setFolderDetails(null); setFolderMode(null); setFolderEncryptionMethod(null); setFolderPassword(null); setIsAutoOpening(false); setIsFolderScanComplete(false); setIsModePickerOpen(false); replaceImages([]); setIsOpen(false); setStatusMessage("Reader closed"); resetHistoryState(restoreHistoryUrl); }, [ cancelFetchLoop, onResetPassword, onResetUi, replaceChapters, replaceImages, resetHistoryState, resetParentChapterState ] ); const closeComicMode = reactExports.useCallback(() => { resetReaderState(true); }, [resetReaderState]); const getOpenStatusMessage = reactExports.useEffectEvent(() => { if (isProviderLoading) { return "Loading account..."; } if (isProviderReady) { return "Detecting folder contents..."; } return providerError?.message ?? "Loading account..."; }); const openComicMode = reactExports.useCallback( (restorePage = -1) => { const resource = provider2.getResourceFromUrl(); if (!resource) { logOpenError("Failed to open reader: no supported resource found", {}); window.alert("Please open a folder or PDF file first."); return; } beginReaderSession(restorePage); cancelFetchLoop(); firstPageCacheRef.current = null; onResetPassword(); setActiveResource(resource); resetParentChapterState(); replaceChapters([]); setFolderDetails(null); setFolderMode(resource.kind === "pdf" ? "images" : null); setFolderEncryptionMethod(null); setFolderPassword(null); setIsFolderScanComplete(false); setIsModePickerOpen(false); replaceImages([]); setIsOpen(resource.kind === "pdf"); setStatusMessage( resource.kind === "pdf" ? "Loading pages..." : getOpenStatusMessage() ); }, [ beginReaderSession, cancelFetchLoop, getOpenStatusMessage, onResetPassword, provider2, replaceChapters, replaceImages, resetParentChapterState ] ); reactExports.useEffect(() => { if (initialReaderOpenAttemptedRef.current) { return; } if (!initialChapterIdRef.current && initialPageRef.current < 0) { setIsAutoOpening(false); return; } if (!provider2.getResourceFromUrl()) { setIsAutoOpening(false); return; } initialReaderOpenAttemptedRef.current = true; openComicMode(initialPageRef.current); }, [openComicMode, provider2]); const openChapter = reactExports.useCallback( (chapter, nextParentChapters = [], nextActiveChapterIndex = 0) => { cancelFetchLoop(); firstPageCacheRef.current = null; setActiveResource({ id: chapter.id, kind: chapter.kind }); setActiveChapterIndex(nextActiveChapterIndex); setParentChapters(nextParentChapters); replaceChapters([]); setFolderMode("images"); setIsFolderScanComplete(false); setIsModePickerOpen(false); replaceImages([]); setIsOpen(true); setStatusMessage("Loading pages..."); }, [cancelFetchLoop, replaceChapters, replaceImages] ); const goToChapterAtIndex = reactExports.useCallback( (index) => { if (parentChapters.length === 0) { return; } const nextIndex = Math.min(Math.max(index, 0), parentChapters.length - 1); const targetChapter = parentChapters[nextIndex]; if (!targetChapter) { return; } if (targetChapter.id === activeFolderId && nextIndex === activeChapterIndex) { return; } openChapter(targetChapter, parentChapters, nextIndex); }, [activeChapterIndex, activeFolderId, openChapter, parentChapters] ); const goToAdjacentChapter = reactExports.useCallback( (delta) => { if (parentChapters.length <= 1) { return; } goToChapterAtIndex(activeChapterIndex + delta); }, [activeChapterIndex, goToChapterAtIndex, parentChapters.length] ); const selectMode = reactExports.useCallback( (mode) => { const cachedPage = firstPageCacheRef.current; if (!cachedPage || cachedPage.resourceId !== activeFolderId) { return; } resetParentChapterState(); replaceChapters([]); replaceImages([]); setFolderMode(mode); setIsFolderScanComplete(false); setIsModePickerOpen(false); setIsOpen(false); setStatusMessage( mode === "chapters" ? "Loading chapters..." : "Loading pages..." ); }, [activeFolderId, replaceChapters, replaceImages, resetParentChapterState] ); const applyPasswordMetadata = reactExports.useCallback((page) => { if (page.password !== null) { setFolderPassword((current) => current ?? page.password); } if (page.encryptionMethod !== null) { setFolderEncryptionMethod((current) => current ?? page.encryptionMethod); } }, []); reactExports.useEffect(() => { if (!activeResource) { return; } const resourceId = activeResource.id; if (isProviderLoading) { setStatusMessage("Loading account..."); return; } if (!isProviderReady) { logOpenError("Failed to open reader: provider is not ready", { resourceId, error: providerError }); setIsAutoOpening(false); setStatusMessage(providerError?.message ?? "Failed to load account"); return; } const fetchId = activeFetchIdRef.current + 1; activeFetchIdRef.current = fetchId; let isCancelled = false; const loadFolderDetails = (nextResourceId) => { void provider2.fetchFolderDetails(nextResourceId).then((details) => { if (isCancelled || activeFetchIdRef.current !== fetchId) { return; } setFolderDetails(details); }).catch(() => { if (isCancelled || activeFetchIdRef.current !== fetchId) { return; } setFolderDetails(null); }); }; const processImages = async (initialPage2, initialCursor) => { let page = initialPage2; let cursor = initialCursor; setIsOpen(true); setIsAutoOpening(false); setFolderDetails(null); loadFolderDetails(resourceId); while (!isCancelled && activeFetchIdRef.current === fetchId) { applyPasswordMetadata(page); const mergedImages = mergeImages(imagesRef.current, page.images); if (mergedImages !== imagesRef.current) { replaceImages(mergedImages); } const pageCount = mergedImages.length; if (!cursor) { setIsFolderScanComplete(true); setStatusMessage( pageCount === 0 ? "No image files found in this folder" : `Loaded ${pageCount} page${pageCount === 1 ? "" : "s"}` ); return; } setStatusMessage( pageCount === 0 ? "Loading pages..." : `Loaded ${pageCount} page${pageCount === 1 ? "" : "s"}...` ); const [nextPage, nextCursor] = await provider2.fetchFolderPage( resourceId, cursor ); if (isCancelled || activeFetchIdRef.current !== fetchId) { return; } page = nextPage; cursor = nextCursor ?? void 0; } }; const processPdf = async (pdfId) => { setIsAutoOpening(false); setIsFolderScanComplete(false); setFolderDetails(null); loadFolderDetails(pdfId); const pdfImages = await provider2.fetchPdfImages(pdfId); if (isCancelled || activeFetchIdRef.current !== fetchId) { return; } replaceImages(pdfImages); setIsFolderScanComplete(true); setStatusMessage( pdfImages.length === 0 ? "No pages found in this PDF" : `Loaded ${pdfImages.length} page${pdfImages.length === 1 ? "" : "s"}` ); }; const processChapters = async (initialPage2, initialCursor) => { let page = initialPage2; let cursor = initialCursor; setIsOpen(false); setIsFolderScanComplete(false); setFolderDetails(null); loadFolderDetails(resourceId); while (!isCancelled && activeFetchIdRef.current === fetchId) { applyPasswordMetadata(page); const mergedChapters = mergeChapters( chaptersRef.current, page.chapters ); if (mergedChapters !== chaptersRef.current) { replaceChapters(mergedChapters); } const chapterCount = mergedChapters.length; if (!cursor) { setIsFolderScanComplete(true); setStatusMessage( chapterCount === 0 ? "No chapter folders found in this folder" : `Loaded ${chapterCount} chapter${chapterCount === 1 ? "" : "s"}` ); return; } setStatusMessage( chapterCount === 0 ? "Loading chapters..." : `Loaded ${chapterCount} chapter${chapterCount === 1 ? "" : "s"}...` ); const [nextPage, nextCursor] = await provider2.fetchFolderPage( resourceId, cursor ); if (isCancelled || activeFetchIdRef.current !== fetchId) { return; } page = nextPage; cursor = nextCursor ?? void 0; } }; const loadItems = async () => { try { const cachedFirstPage = firstPageCacheRef.current; if (activeResource.kind === "pdf") { await processPdf(activeResource.id); return; } if (folderMode && cachedFirstPage?.resourceId === resourceId) { firstPageCacheRef.current = null; if (folderMode === "chapters") { await processChapters( cachedFirstPage.page, cachedFirstPage.nextCursor ); } else { await processImages( cachedFirstPage.page, cachedFirstPage.nextCursor ); } return; } const [page, nextCursor] = await provider2.fetchFolderPage( activeResource.id, void 0 ); if (isCancelled || activeFetchIdRef.current !== fetchId) { return; } applyPasswordMetadata(page); if (folderMode === null) { if (page.isEmpty) { firstPageCacheRef.current = null; setIsAutoOpening(false); setIsFolderScanComplete(true); setStatusMessage("No files found in this folder"); return; } firstPageCacheRef.current = { resourceId, page, nextCursor: nextCursor ?? void 0 }; if (page.isMixed) { if (initialChapterIdRef.current || initialPageRef.current >= 0) { const initialMode = initialChapterIdRef.current && initialChapterIdRef.current !== resourceId ? "chapters" : "images"; setIsModePickerOpen(false); setFolderMode(initialMode); setStatusMessage( initialMode === "chapters" ? "Loading chapters..." : "Loading pages..." ); return; } setIsAutoOpening(false); setIsFolderScanComplete(true); setIsModePickerOpen(true); setStatusMessage("Choose how to open this folder"); return; } const classification = page.chapters.length > 0 ? "chapters" : "images"; setIsModePickerOpen(false); setFolderMode(classification); setIsFolderScanComplete(false); setStatusMessage( classification === "chapters" ? "Loading chapters..." : "Loading pages..." ); return; } if (folderMode === "chapters") { await processChapters(page, nextCursor ?? void 0); } else { await processImages(page, nextCursor ?? void 0); } } catch (error) { if (isCancelled || activeFetchIdRef.current !== fetchId) { return; } logOpenError("Failed to load folder items", { resourceId, activeResource, error, folderMode }); setIsAutoOpening(false); setStatusMessage( error instanceof Error ? error.message : "Failed to load folder items" ); } }; void loadItems(); return () => { isCancelled = true; if (activeFetchIdRef.current === fetchId) { activeFetchIdRef.current += 1; } }; }, [ activeResource, applyPasswordMetadata, folderMode, isProviderLoading, isProviderReady, provider2, providerError, replaceChapters, replaceImages ]); reactExports.useEffect(() => { const targetChapterId = initialChapterIdRef.current; if (!targetChapterId || initialChapterOpenAttemptedRef.current || folderMode !== "chapters" || !isFolderScanComplete || isOpen) { return; } const chapterIndex = chapters.findIndex( (chapter2) => chapter2.id === targetChapterId ); if (chapterIndex === -1) { setIsAutoOpening(false); return; } const chapter = chapters[chapterIndex]; if (!chapter) { setIsAutoOpening(false); return; } initialChapterOpenAttemptedRef.current = true; setIsAutoOpening(false); openChapter(chapter, chapters, chapterIndex); }, [chapters, folderMode, isFolderScanComplete, isOpen, openChapter]); reactExports.useEffect(() => { if (!isAutoOpening || !isFolderScanComplete || isOpen) { return; } if (!initialChapterIdRef.current || folderMode !== "chapters") { setIsAutoOpening(false); } }, [folderMode, isAutoOpening, isFolderScanComplete, isOpen]); reactExports.useEffect( () => () => { cancelFetchLoop(); }, [cancelFetchLoop] ); return { activeFolderId, activeChapterIndex, chapters, closeComicMode, folderDetails, folderEncryptionMethod, folderMode, folderPassword, goToAdjacentChapter, goToChapterAtIndex, images, isAutoOpening, isModePickerOpen, isOpen, openChapter, openComicMode, parentChapters, resetReaderState, selectMode, statusMessage }; } const READER_STICKY_CLASS = "stick"; function getReaderStickyElements(main) { return { buffer: main.querySelector(".rdr-aside-buffer"), header: main.querySelector("header"), selector: main.querySelector(".rdr-selector") }; } function getReaderStickyOffset(main) { if (!main?.classList.contains(READER_STICKY_CLASS)) { return 0; } const { header, selector } = getReaderStickyElements(main); return (header?.offsetHeight ?? 0) + (selector?.offsetHeight ?? 0); } function isScrollableY(element) { const styles = window.getComputedStyle(element); return element.scrollHeight > element.clientHeight && /(auto|scroll|overlay)/.test(styles.overflowY); } function addUniqueTarget(targets, target) { if (target && !targets.includes(target)) { targets.push(target); } } function useReaderControls({ activeGroupIndex, displayGroups, groupRefs, imageWrapRef, mainRef, scrollContainerRef, isScrollReady, isOpen, setActiveGroupIndex, settings, supportsZoomOverlay }) { const [hoverEdge, setHoverEdge] = reactExports.useState(null); const [isSelectorVisible, setIsSelectorVisible] = reactExports.useState(false); const [isZoomVisible, setIsZoomVisible] = reactExports.useState(false); const selectorHideTimeoutRef = reactExports.useRef(null); const zoomHideTimeoutRef = reactExports.useRef(null); const clearSelectorHideTimer = reactExports.useCallback(() => { if (selectorHideTimeoutRef.current !== null) { window.clearTimeout(selectorHideTimeoutRef.current); selectorHideTimeoutRef.current = null; } }, []); const clearZoomHideTimer = reactExports.useCallback(() => { if (zoomHideTimeoutRef.current !== null) { window.clearTimeout(zoomHideTimeoutRef.current); zoomHideTimeoutRef.current = null; } }, []); const resetControls = reactExports.useCallback(() => { clearSelectorHideTimer(); clearZoomHideTimer(); setHoverEdge(null); setIsSelectorVisible(false); setIsZoomVisible(false); }, [clearSelectorHideTimer, clearZoomHideTimer]); const showPageSelector = reactExports.useCallback(() => { clearSelectorHideTimer(); if (settings.apr.selPinned) { setIsSelectorVisible(false); return; } setIsSelectorVisible(true); selectorHideTimeoutRef.current = window.setTimeout(() => { setIsSelectorVisible(false); selectorHideTimeoutRef.current = null; }, 3e3); }, [clearSelectorHideTimer, settings.apr.selPinned]); const showZoomControls = reactExports.useCallback(() => { clearZoomHideTimer(); if (!supportsZoomOverlay) { setIsZoomVisible(false); return; } setIsZoomVisible(true); zoomHideTimeoutRef.current = window.setTimeout(() => { setIsZoomVisible(false); zoomHideTimeoutRef.current = null; }, 3e3); }, [clearZoomHideTimer, supportsZoomOverlay]); const getTtbScroller = reactExports.useCallback(() => { const candidates = [ scrollContainerRef?.current, mainRef?.current, imageWrapRef.current ]; return candidates.find( (candidate) => candidate !== null && candidate !== void 0 && isScrollableY(candidate) ) ?? scrollContainerRef?.current ?? mainRef?.current ?? imageWrapRef.current; }, [imageWrapRef, mainRef, scrollContainerRef]); const scrollToGroup = reactExports.useCallback( (index, behavior = "smooth") => { const target = groupRefs.current[index]; if (!target) { return; } setActiveGroupIndex(index); if (settings.lyt.direction === "ttb") { const scroller = getTtbScroller(); if (!scroller) { target.scrollIntoView({ behavior, block: "start" }); return; } const scrollerBounds = scroller.getBoundingClientRect(); const targetBounds = target.getBoundingClientRect(); const stickyOffset = getReaderStickyOffset(mainRef?.current); scroller.scrollTo({ behavior, top: scroller.scrollTop + targetBounds.top - scrollerBounds.top - stickyOffset }); return; } target.scrollIntoView({ behavior, block: "nearest", inline: "start" }); if (settings.bhv.resetScroll) { target.scrollTop = 0; } }, [ getTtbScroller, groupRefs, mainRef, setActiveGroupIndex, settings.bhv.resetScroll, settings.lyt.direction ] ); const syncActiveGroupFromScroll = reactExports.useCallback(() => { const scroller = settings.lyt.direction === "ttb" ? getTtbScroller() : imageWrapRef.current; if (!isScrollReady || !scroller || displayGroups.length === 0) { return; } if (settings.lyt.direction === "ttb") { const scrollerBounds = scroller.getBoundingClientRect(); const targetY = scrollerBounds.top + getReaderStickyOffset(mainRef?.current) + 1; let closestIndex = 0; let closestDistance = Number.POSITIVE_INFINITY; groupRefs.current.forEach((group, index) => { if (!group) { return; } const groupBounds = group.getBoundingClientRect(); if (groupBounds.top <= targetY && groupBounds.bottom > targetY) { closestIndex = index; closestDistance = 0; return; } const distance = Math.abs(groupBounds.top - targetY); if (closestDistance !== 0 && distance < closestDistance) { closestDistance = distance; closestIndex = index; } }); if (closestIndex !== activeGroupIndex) { setActiveGroupIndex(closestIndex); } return; } const nextIndex = clampIndex( Math.round(scroller.scrollLeft / Math.max(scroller.clientWidth, 1)), displayGroups.length - 1 ); if (nextIndex !== activeGroupIndex) { setActiveGroupIndex(nextIndex); } }, [ activeGroupIndex, displayGroups.length, getTtbScroller, groupRefs, imageWrapRef, isScrollReady, mainRef, setActiveGroupIndex, settings.lyt.direction ]); reactExports.useEffect(() => { if (!isOpen || !isScrollReady || settings.lyt.direction !== "ttb" || displayGroups.length === 0) { return; } const targets = []; addUniqueTarget(targets, scrollContainerRef?.current); addUniqueTarget(targets, mainRef?.current); addUniqueTarget(targets, imageWrapRef.current); let ancestor = groupRefs.current.find((group) => group !== null)?.parentElement ?? null; while (ancestor) { if (isScrollableY(ancestor)) { addUniqueTarget(targets, ancestor); } ancestor = ancestor.parentElement; } addUniqueTarget(targets, window); const handleScroll = () => { syncActiveGroupFromScroll(); }; targets.forEach((target) => { target.addEventListener("scroll", handleScroll, { passive: true }); }); handleScroll(); return () => { targets.forEach((target) => { target.removeEventListener("scroll", handleScroll); }); }; }, [ displayGroups.length, groupRefs, imageWrapRef, isOpen, isScrollReady, mainRef, scrollContainerRef, settings.lyt.direction, syncActiveGroupFromScroll ]); const goToAdjacentGroup = reactExports.useCallback( (delta) => { if (displayGroups.length === 0) { return; } const nextIndex = clampIndex( activeGroupIndex + delta, displayGroups.length - 1 ); scrollToGroup(nextIndex); }, [activeGroupIndex, displayGroups.length, scrollToGroup] ); const performVerticalStep = reactExports.useCallback( (direction) => { const scroller = imageWrapRef.current; if (!scroller) { return; } scroller.scrollBy({ behavior: "smooth", top: direction * settings.bhv.scrollYDelta * 8 }); }, [imageWrapRef, settings.bhv.scrollYDelta] ); const performVerticalPageTurn = reactExports.useCallback( (direction) => { const scroller = imageWrapRef.current; if (!scroller) { return; } scroller.scrollBy({ behavior: "smooth", top: direction * Math.max(scroller.clientHeight * 0.9, settings.bhv.scrollYDelta * 8) }); }, [imageWrapRef, settings.bhv.scrollYDelta] ); reactExports.useEffect(() => { if (!isOpen) { resetControls(); } }, [isOpen, resetControls]); reactExports.useEffect( () => () => { clearSelectorHideTimer(); clearZoomHideTimer(); }, [clearSelectorHideTimer, clearZoomHideTimer] ); return { goToAdjacentGroup, hoverEdge, isSelectorVisible, isZoomVisible, performVerticalPageTurn, performVerticalStep, scrollToGroup, setHoverEdge, showPageSelector, showZoomControls, syncActiveGroupFromScroll }; } function useReaderHistory({ activeChapterId, activePage, currentPageRef, displayGroups, historyPageRef, imageIds, isHandlingPopStateRef, isOpen, readerTitle, resetReaderState, scrollToGroup, settings }) { const handlePopState = reactExports.useEffectEvent((event) => { if (isReaderHistoryState(event.state)) { if (!isOpen || displayGroups.length === 0) { return; } const targetPage = clampIndex(event.state.page, imageIds.length - 1); const targetGroupIndex = findGroupIndexForPage(displayGroups, targetPage); isHandlingPopStateRef.current = true; currentPageRef.current = targetPage; historyPageRef.current = targetPage; document.title = buildPageTitle(readerTitle, targetPage); scrollToGroup(targetGroupIndex === -1 ? 0 : targetGroupIndex, "auto"); requestAnimationFrame(() => { isHandlingPopStateRef.current = false; }); return; } if (isOpen) { resetReaderState(false); } }); reactExports.useEffect(() => { if (!isOpen || displayGroups.length === 0) { return; } if (settings.bhv.historyUpdate === "none") { return; } const title = buildPageTitle(readerTitle, activePage); if (isHandlingPopStateRef.current) { document.title = title; historyPageRef.current = activePage; return; } const nextState = { page: activePage, truyendriveReader: true }; const nextUrl = activeChapterId ? buildChapterStateUrl(window.location.href, activeChapterId, activePage) : buildReaderHistoryUrl(window.location.href, activePage); const previousPage = historyPageRef.current; switch (settings.bhv.historyUpdate) { case "replace": case "chap": window.history.replaceState(nextState, "", nextUrl); break; case "jump": if (previousPage === null || Math.abs(previousPage - activePage) > 2) { window.history.pushState(nextState, "", nextUrl); } else { window.history.replaceState(nextState, "", nextUrl); } break; case "all": if (previousPage !== activePage) { window.history.pushState(nextState, "", nextUrl); } else { window.history.replaceState(nextState, "", nextUrl); } break; } historyPageRef.current = activePage; document.title = title; }, [ activePage, activeChapterId, displayGroups, historyPageRef, isHandlingPopStateRef, isOpen, readerTitle, settings.bhv.historyUpdate ]); return { handlePopState }; } function useInitialScroll({ activeFolderId, activeGroupIndex, chapterStartGroupIndex, currentPageRef, displayGroups, groupRefs, isOpen, setActiveGroupIndex, setIsScrollReady, settings }) { const initialScrollFolderIdRef = reactExports.useRef(null); reactExports.useLayoutEffect(() => { if (!isOpen || !activeFolderId) { initialScrollFolderIdRef.current = null; return; } if (initialScrollFolderIdRef.current === activeFolderId || displayGroups.length === 0) { return; } const targetPage = currentPageRef.current; const matchingIndex = targetPage < 0 ? -1 : findGroupIndexForPage(displayGroups, targetPage); const nextIndex = matchingIndex === -1 ? chapterStartGroupIndex : matchingIndex; const targetGroup = groupRefs.current[nextIndex]; initialScrollFolderIdRef.current = activeFolderId; if (activeGroupIndex !== nextIndex) { setActiveGroupIndex(nextIndex); } if (targetGroup) { if (settings.lyt.direction === "ttb") { targetGroup.scrollIntoView({ behavior: "auto", block: "start" }); } else { targetGroup.scrollIntoView({ behavior: "auto", block: "nearest", inline: "start" }); if (settings.bhv.resetScroll) { targetGroup.scrollTop = 0; } } } setIsScrollReady(true); }, [ activeFolderId, displayGroups, isOpen, chapterStartGroupIndex, settings.bhv.resetScroll, settings.lyt.fit, settings.lyt.direction, settings.lyt.spread ]); } const scriptRel = (function detectScriptRel() { const relList = typeof document !== "undefined" && document.createElement("link").relList; return relList && relList.supports && relList.supports("modulepreload") ? "modulepreload" : "preload"; })(); const assetsURL = function(dep) { return "/" + dep; }; const seen = {}; const __vitePreload = function preload(baseModule, deps, importerUrl) { let promise = Promise.resolve(); if (deps && deps.length > 0) { let allSettled2 = function(promises$2) { return Promise.all(promises$2.map((p) => Promise.resolve(p).then((value$1) => ({ status: "fulfilled", value: value$1 }), (reason) => ({ status: "rejected", reason })))); }; document.getElementsByTagName("link"); const cspNonceMeta = document.querySelector("meta[property=csp-nonce]"); const cspNonce = cspNonceMeta?.nonce || cspNonceMeta?.getAttribute("nonce"); promise = allSettled2(deps.map((dep) => { dep = assetsURL(dep); if (dep in seen) return; seen[dep] = true; const isCss = dep.endsWith(".css"); const cssSelector = isCss ? '[rel="stylesheet"]' : ""; if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) return; const link = document.createElement("link"); link.rel = isCss ? "stylesheet" : scriptRel; if (!isCss) link.as = "script"; link.crossOrigin = ""; link.href = dep; if (cspNonce) link.setAttribute("nonce", cspNonce); document.head.appendChild(link); if (isCss) return new Promise((res, rej) => { link.addEventListener("load", res); link.addEventListener("error", () => rej( new Error(`Unable to preload CSS for ${dep}`))); }); })); } function handlePreloadError(err$2) { const e$1 = new Event("vite:preloadError", { cancelable: true }); e$1.payload = err$2; window.dispatchEvent(e$1); if (!e$1.defaultPrevented) throw err$2; } return promise.then((res) => { for (const item of res || []) { if (item.status !== "rejected") continue; handlePreloadError(item.reason); } return baseModule().catch(handlePreloadError); }); }; function cyrb128(str) { let h1 = 1779033703; let h2 = 3144134277; let h3 = 1013904242; let h4 = 2773480762; for (let i = 0; i < str.length; i += 1) { const k = str.charCodeAt(i); h1 = h2 ^ Math.imul(h1 ^ k, 597399067); h2 = h3 ^ Math.imul(h2 ^ k, 2869860233); h3 = h4 ^ Math.imul(h3 ^ k, 951274213); h4 = h1 ^ Math.imul(h4 ^ k, 2716044179); } h1 = Math.imul(h3 ^ h1 >>> 18, 597399067); h2 = Math.imul(h4 ^ h2 >>> 22, 2869860233); h3 = Math.imul(h1 ^ h3 >>> 17, 951274213); h4 = Math.imul(h2 ^ h4 >>> 19, 2716044179); return (h1 ^ h2 ^ h3 ^ h4) >>> 0; } function mulberry32(seed) { let a = seed; return () => { a += 1831565813; let t = Math.imul(a ^ a >>> 15, a | 1); t ^= t + Math.imul(t ^ t >>> 7, t | 61); return ((t ^ t >>> 14) >>> 0) / 4294967296; }; } function loadImage(src) { return new Promise((resolve, reject) => { const img = new Image(); img.onload = () => resolve(img); img.onerror = () => reject(new Error("Failed to load image blob")); img.src = src; }); } async function fetchImageBlob(imageUrl, signal) { const response = await fetch(imageUrl, { credentials: "include", signal }); if (!response.ok) { throw new Error(`Failed to fetch image: ${response.status}`); } return response.blob(); } async function canvasToBlob(canvas) { if ("convertToBlob" in canvas) { try { return await canvas.convertToBlob({ type: "image/jpeg", quality: 0.9 }); } catch (e) { return await canvas.convertToBlob({ type: "image/webp", quality: 0.85 }); } } const htmlCanvas = canvas; const jpeg = await new Promise( (resolve) => htmlCanvas.toBlob(resolve, "image/jpeg", 0.9) ); if (jpeg) { return jpeg; } return new Promise( (resolve, reject) => htmlCanvas.toBlob( (blob) => blob ? resolve(blob) : reject(new Error("toBlob failed")), "image/webp" ) ); } async function decryptImageBuffer(imageUrl, password, method, signal) { const blob = await fetchImageBlob(imageUrl, signal); let imgBitmap; let objectUrl; let img; let workerModule = null; try { if (typeof Worker !== "undefined") { workerModule = await __vitePreload(() => module.import('./decryptWorker-DYbJWN8U-BOfDuyZ4.js'), true ? void 0 : void 0); } } catch { } try { if (typeof createImageBitmap !== "undefined") { imgBitmap = await createImageBitmap(blob); } else { objectUrl = URL.createObjectURL(blob); img = await loadImage(objectUrl); } const width = imgBitmap ? imgBitmap.width : img.naturalWidth || img.width; const height = imgBitmap ? imgBitmap.height : img.naturalHeight || img.height; let canvas; let ctx; if (typeof OffscreenCanvas !== "undefined") { canvas = new OffscreenCanvas(width, height); ctx = canvas.getContext("2d", { willReadFrequently: true }); } else { canvas = document.createElement("canvas"); canvas.width = width; canvas.height = height; ctx = canvas.getContext("2d", { willReadFrequently: true }); } if (!ctx) { throw new Error("Failed to create image canvas context"); } if (imgBitmap) { ctx.drawImage(imgBitmap, 0, 0); } else { ctx.drawImage(img, 0, 0); } const imageData = ctx.getImageData(0, 0, width, height); let decryptedBuffer; if (workerModule) { decryptedBuffer = await workerModule.decryptInWorker( imageData.data.buffer, password, method, width, height, signal ); } else { decryptedBuffer = method === "scanline" ? scanlineDecryptMainThread( imageData.data.buffer, password, width, height ) : xorDecryptMainThread(imageData.data.buffer, password); } const decryptedData = new ImageData( new Uint8ClampedArray(decryptedBuffer), width, height ); ctx.putImageData(decryptedData, 0, 0); const resultBlob = await canvasToBlob(canvas); return resultBlob; } finally { if (objectUrl) URL.revokeObjectURL(objectUrl); if (imgBitmap) imgBitmap.close(); } } function xorDecryptMainThread(buffer, password) { const data = new Uint8Array(buffer); const rand = mulberry32(cyrb128(password)); for (let i = 0; i < data.length; i += 4) { data[i] ^= Math.floor(rand() * 256); data[i + 1] ^= Math.floor(rand() * 256); data[i + 2] ^= Math.floor(rand() * 256); } return buffer; } function scanlineDecryptMainThread(buffer, password, width, height) { const channels = 4; const rowByteLength = width * channels; const data = new Uint8Array(buffer); const output = new Uint8Array(data.length); const rand = mulberry32( cyrb128(`${password}:${width}x${height}:${channels}:scanline`) ); for (let row = 0; row < height; row += 1) { const offset = width === 0 ? 0 : Math.floor(rand() * width); const reverse = rand() >= 0.5; for (let destinationColumn = 0; destinationColumn < width; destinationColumn += 1) { const transformedColumn = reverse ? width - 1 - destinationColumn : destinationColumn; const sourceColumn = (transformedColumn + offset) % width; const srcStart = row * rowByteLength + sourceColumn * channels; const destStart = row * rowByteLength + destinationColumn * channels; output[destStart] = data[srcStart]; output[destStart + 1] = data[srcStart + 1]; output[destStart + 2] = data[srcStart + 2]; output[destStart + 3] = data[srcStart + 3]; } } return output.buffer; } function revokeBlobUrls(blobUrls) { blobUrls.forEach((url) => URL.revokeObjectURL(url)); blobUrls.clear(); } function retainImageBlobUrls(blobUrls, imageIds) { blobUrls.forEach((url, id) => { if (!imageIds.has(id)) { URL.revokeObjectURL(url); blobUrls.delete(id); } }); } function useImageDecryptor(images, password, encryptionMethod, displayGroups, activeGroupIndex, initialGroupIndex, isInitialScrollDone, preloadDistance, buildFetchUrl) { const imageIds = reactExports.useMemo(() => images.map((image) => image.id), [images]); const imageIdKey = reactExports.useMemo(() => imageIds.join("\n"), [imageIds]); const imageById = reactExports.useMemo( () => new Map(images.map((image) => [image.id, image])), [images] ); const [decryptedSrcs, setDecryptedSrcs] = reactExports.useState( () => new Map() ); const blobUrlsRef = reactExports.useRef( new Map()); const decryptGenerationRef = reactExports.useRef(0); const decryptRequestRef = reactExports.useRef(0); const pendingIdsRef = reactExports.useRef( new Set()); const anchorGroupIndex = isInitialScrollDone ? activeGroupIndex : initialGroupIndex; reactExports.useEffect(() => { decryptGenerationRef.current += 1; pendingIdsRef.current.clear(); revokeBlobUrls(blobUrlsRef.current); setDecryptedSrcs( new Map()); }, [encryptionMethod, password]); reactExports.useEffect(() => { return () => { decryptGenerationRef.current += 1; pendingIdsRef.current.clear(); revokeBlobUrls(blobUrlsRef.current); }; }, []); reactExports.useEffect(() => { const validImageIds = new Set(imageIds); retainImageBlobUrls(blobUrlsRef.current, validImageIds); pendingIdsRef.current.forEach((id) => { if (!validImageIds.has(id)) { pendingIdsRef.current.delete(id); } }); setDecryptedSrcs((previous) => { let didRemove = false; const next = new Map(); previous.forEach((src, id) => { if (validImageIds.has(id)) { next.set(id, src); } else { didRemove = true; } }); return didRemove ? next : previous; }); }, [imageIdKey, imageIds]); reactExports.useEffect(() => { const decryptRequest = decryptRequestRef.current += 1; if (password === null || displayGroups.length === 0) { return; } const decryptGeneration = decryptGenerationRef.current; const maxDistance = getMaxGroupDistance( preloadDistance, displayGroups.length ); const windowedImageIds = new Set( getGroupsInRange( displayGroups, anchorGroupIndex, maxDistance, true ).flatMap((group) => group.pages.map((page) => page.id)) ); const decryptImages = async () => { for (const id of windowedImageIds) { if (decryptGenerationRef.current !== decryptGeneration || decryptRequestRef.current !== decryptRequest) { return; } if (blobUrlsRef.current.has(id) || pendingIdsRef.current.has(id)) { continue; } pendingIdsRef.current.add(id); try { const image = imageById.get(id); if (!image) { continue; } if (image.requiresDecryption === false) { continue; } const blob = await decryptImageBuffer( buildFetchUrl(image), password, encryptionMethod ); if (decryptGenerationRef.current !== decryptGeneration) { return; } const blobUrl = URL.createObjectURL(blob); blobUrlsRef.current.set(id, blobUrl); setDecryptedSrcs((previous) => new Map(previous).set(id, blobUrl)); if (decryptRequestRef.current !== decryptRequest) { return; } } catch (error) { console.error("[truyendrive] Failed to decrypt image", id, error); } finally { pendingIdsRef.current.delete(id); } } }; void decryptImages(); }, [ anchorGroupIndex, displayGroups, encryptionMethod, imageById, buildFetchUrl, password, preloadDistance ]); return { decryptedSrcs }; } function useKeyboardHandler({ closeComicMode, copyShareUrl, cycleSetting, goToAdjacentChapter, isComicSurfaceOpen, isOpen, isSettingsOpen, jumpToChapterStart, navigateGroupOrChapter, performVerticalStep, requestPassword, setIsSettingsOpen, settings, toggleSetting }) { const handleKeyDown = reactExports.useEffectEvent((event) => { if (!isComicSurfaceOpen) { return; } if (event.key === "Escape") { if (isSettingsOpen) { setIsSettingsOpen(false); } else { closeComicMode(); } return; } if (!isOpen) { return; } if (event.key === "o" || event.key === "O") { event.preventDefault(); setIsSettingsOpen((current) => !current); return; } if (!isSettingsOpen && (event.key === "k" || event.key === "K")) { event.preventDefault(); requestPassword(); return; } if (event.key === "f" || event.key === "F") { event.preventDefault(); cycleSetting("lyt", "fit", FIT_OPTIONS); return; } if (event.key === "d" || event.key === "D") { event.preventDefault(); cycleSetting("lyt", "direction", DIRECTION_OPTIONS); return; } if (event.key === "q" || event.key === "Q") { event.preventDefault(); cycleSetting("lyt", "spread", SPREAD_OPTIONS); return; } if (event.key === "l" || event.key === "L") { event.preventDefault(); cycleSetting("bhv", "preload", PRELOAD_OPTIONS); return; } if (event.key === "n" || event.key === "N") { event.preventDefault(); toggleSetting("apr", "selPinned"); return; } if (event.key === "s" || event.key === "S") { event.preventDefault(); toggleSetting("apr", "sidebar"); return; } if (event.key === "r" || event.key === "R") { event.preventDefault(); copyShareUrl(); return; } if (event.key === "j" || event.key === "J") { event.preventDefault(); jumpToChapterStart(); return; } if (event.key === "p" || event.key === "P") { event.preventDefault(); toggleSetting("apr", "previews"); return; } if (event.key === "[") { event.preventDefault(); goToAdjacentChapter(-1); return; } if (event.key === "]") { event.preventDefault(); goToAdjacentChapter(1); return; } if (event.key === ".") { event.preventDefault(); navigateGroupOrChapter(-1); return; } if (event.key === ",") { event.preventDefault(); navigateGroupOrChapter(1); return; } if (settings.lyt.direction === "ttb") { if (event.key === "ArrowDown") { event.preventDefault(); performVerticalStep(1); return; } if (event.key === "ArrowUp") { event.preventDefault(); performVerticalStep(-1); return; } if (settings.bhv.arrowTurnPage && event.key === "ArrowRight") { event.preventDefault(); navigateGroupOrChapter(1); return; } if (settings.bhv.arrowTurnPage && event.key === "ArrowLeft") { event.preventDefault(); navigateGroupOrChapter(-1); } return; } if (event.key === "ArrowRight") { event.preventDefault(); navigateGroupOrChapter(1); return; } if (event.key === "ArrowLeft") { event.preventDefault(); navigateGroupOrChapter(-1); } }); reactExports.useEffect(() => { window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [handleKeyDown]); } const MOBILE_BREAKPOINT_QUERY = "(max-width: 700px)"; function restoreScrollAfterLayout(main, scrollTop) { requestAnimationFrame(() => { main.scrollTop = scrollTop; }); } function useMobileTtbSticky({ isOpen, isTtb, mainRef, scrollContainerRef, settings, updateSetting }) { const [isMobile, setIsMobile] = reactExports.useState( () => window.matchMedia(MOBILE_BREAKPOINT_QUERY).matches ); const clearStickyElements = reactExports.useCallback(() => { const main = mainRef.current; if (!main) { return; } const { buffer, selector } = getReaderStickyElements(main); main.classList.remove(READER_STICKY_CLASS); if (selector) { selector.style.top = ""; } if (buffer) { buffer.style.height = ""; } }, [mainRef]); reactExports.useEffect(() => { const mediaQuery = window.matchMedia(MOBILE_BREAKPOINT_QUERY); const handleChange = (event) => { setIsMobile(event.matches); }; setIsMobile(mediaQuery.matches); mediaQuery.addEventListener("change", handleChange); return () => { mediaQuery.removeEventListener("change", handleChange); }; }, []); reactExports.useEffect(() => { if (isOpen && isMobile && isTtb) { return; } clearStickyElements(); if (settings.apr.selPinned) { updateSetting("apr", "selPinned", false); } }, [ clearStickyElements, isMobile, isOpen, isTtb, settings.apr.selPinned, updateSetting ]); const handleTtbTap = reactExports.useCallback(() => { const main = mainRef.current; if (!main) { return; } const { buffer, header, selector } = getReaderStickyElements(main); if (!header || !selector || !buffer) { return; } const scroller = scrollContainerRef?.current ?? main; const savedScroll = scroller.scrollTop; const nextSelPinned = !settings.apr.selPinned; if (nextSelPinned) { main.classList.add(READER_STICKY_CLASS); updateSetting("apr", "selPinned", true); const headerHeight = header.offsetHeight; const selectorHeight = selector.offsetHeight; selector.style.top = `${headerHeight}px`; buffer.style.height = `${headerHeight + selectorHeight}px`; restoreScrollAfterLayout(scroller, savedScroll); return; } main.classList.remove(READER_STICKY_CLASS); updateSetting("apr", "selPinned", false); selector.style.top = ""; buffer.style.height = ""; restoreScrollAfterLayout(scroller, savedScroll); }, [mainRef, scrollContainerRef, settings.apr.selPinned, updateSetting]); return { handleTtbTap, isMobile }; } function useReaderPreload({ activeGroupIndex, displayGroups, getImageUrl, initialGroupIndex, isInitialScrollDone, isPasswordMode, isOpen, preloadDistance }) { const preloadCacheRef = reactExports.useRef( new Map()); const preloadImageRefs = reactExports.useRef([]); const resetPreloadState = reactExports.useEffectEvent(() => { preloadCacheRef.current.clear(); preloadImageRefs.current.forEach((image) => { if (image) { image.removeAttribute("src"); } }); }); const isGroupPreloaded = reactExports.useCallback( (index) => { if (isPasswordMode) { return false; } const maxDistance = getMaxGroupDistance( preloadDistance, displayGroups.length ); const anchorGroupIndex = isInitialScrollDone ? activeGroupIndex : initialGroupIndex; return index >= 0 && index < displayGroups.length && Math.abs(index - anchorGroupIndex) <= maxDistance; }, [ activeGroupIndex, displayGroups.length, initialGroupIndex, isInitialScrollDone, isPasswordMode, preloadDistance ] ); reactExports.useEffect(() => { if (!isOpen || displayGroups.length === 0) { resetPreloadState(); return; } if (isPasswordMode) { resetPreloadState(); return; } const maxDistance = getMaxGroupDistance( preloadDistance, displayGroups.length ); const anchorGroupIndex = isInitialScrollDone ? activeGroupIndex : initialGroupIndex; const preloadUrls = []; getGroupsInRange( displayGroups, anchorGroupIndex, maxDistance, false ).forEach((group) => { group.pages.forEach((page) => { preloadUrls.push(getImageUrl(page)); }); }); preloadUrls.forEach((url) => { if (preloadCacheRef.current.has(url)) { return; } const image = new window.Image(); image.decoding = "async"; image.src = url; preloadCacheRef.current.set(url, image); }); preloadImageRefs.current.forEach((image, index) => { if (!image) { return; } const url = preloadUrls[index]; if (url) { image.src = url; } else { image.removeAttribute("src"); } }); }, [ activeGroupIndex, displayGroups, getImageUrl, initialGroupIndex, isInitialScrollDone, isPasswordMode, isOpen, preloadDistance, resetPreloadState ]); return { isGroupPreloaded, preloadImageRefs }; } function getReaderBaseUrl(url) { const readerState = parseReaderStateFromUrl(url); if (readerState.page < 0 && !readerState.chapterId) { return url; } return clearReaderStateUrl(url); } function useReaderSession({ currentPageRef, historyPageRef, isHandlingPopStateRef }) { const previousTitleRef = reactExports.useRef(null); const previousUrlRef = reactExports.useRef(null); const beginReaderSession = reactExports.useEffectEvent((initialPage = -1) => { previousTitleRef.current = document.title; previousUrlRef.current = getReaderBaseUrl(window.location.href); currentPageRef.current = initialPage; historyPageRef.current = null; isHandlingPopStateRef.current = false; }); const resetHistoryState = reactExports.useEffectEvent((restoreHistoryUrl) => { currentPageRef.current = -1; historyPageRef.current = null; isHandlingPopStateRef.current = false; if (previousTitleRef.current) { document.title = previousTitleRef.current; previousTitleRef.current = null; } if (restoreHistoryUrl && previousUrlRef.current) { window.history.replaceState( window.history.state, "", previousUrlRef.current ); } previousUrlRef.current = null; }); return { beginReaderSession, resetHistoryState }; } function useReaderUiState() { const [activeGroupIndex, setActiveGroupIndex] = reactExports.useState(0); const [imageLoadVersion, setImageLoadVersion] = reactExports.useState(0); const [isScrollReady, setIsScrollReady] = reactExports.useState(false); const [isSettingsOpen, setIsSettingsOpen] = reactExports.useState(false); const [loadedPageIds, setLoadedPageIds] = reactExports.useState( () => new Set() ); const [settingsTab, setSettingsTab] = reactExports.useState("Reader"); const resetReaderUi = reactExports.useEffectEvent(() => { setActiveGroupIndex(0); setImageLoadVersion(0); setIsScrollReady(false); setIsSettingsOpen(false); setLoadedPageIds( new Set()); }); const handlePageLoad = reactExports.useCallback((pageId) => { setLoadedPageIds((current) => { if (current.has(pageId)) { return current; } const next = new Set(current); next.add(pageId); return next; }); }, []); return { activeGroupIndex, handlePageLoad, imageLoadVersion, isScrollReady, isSettingsOpen, loadedPageIds, resetReaderUi, setActiveGroupIndex, setImageLoadVersion, setIsScrollReady, setIsSettingsOpen, setSettingsTab, settingsTab }; } function useWideGroupTracker({ displayGroups, groupRefs, imageLoadVersion, isOpen, settings }) { const [tooWideGroups, setTooWideGroups] = reactExports.useState({}); const syncWideGroupState = reactExports.useEffectEvent(() => { if (!isOpen || settings.lyt.fit !== "height" && settings.lyt.fit !== "height_limit") { setTooWideGroups( (current) => Object.keys(current).length === 0 ? current : {} ); return; } const nextGroups = {}; displayGroups.forEach((group, index) => { const wrapper = groupRefs.current[index]; if (!wrapper) { return; } if (wrapper.scrollWidth > wrapper.clientWidth + 1) { nextGroups[group.id] = true; } }); setTooWideGroups((current) => { const currentKeys = Object.keys(current); const nextKeys = Object.keys(nextGroups); if (currentKeys.length === nextKeys.length && currentKeys.every((key) => key in nextGroups)) { return current; } return nextGroups; }); }); reactExports.useEffect(() => { const frame = window.requestAnimationFrame(() => { syncWideGroupState(); }); return () => { window.cancelAnimationFrame(frame); }; }, [ displayGroups, imageLoadVersion, isOpen, settings.lyt.direction, settings.lyt.fit, settings.lyt.spread, settings.lyt.zoom, syncWideGroupState ]); reactExports.useEffect(() => { if (!isOpen) { return; } const handleResize = () => { syncWideGroupState(); }; window.addEventListener("resize", handleResize); return () => { window.removeEventListener("resize", handleResize); }; }, [isOpen, syncWideGroupState]); return { tooWideGroups }; } const errorFallbackSurfaceStyle = { minHeight: "100vh", display: "grid", placeItems: "center", padding: "32px", boxSizing: "border-box", background: "linear-gradient(180deg, rgba(11, 15, 25, 0.96), rgba(20, 27, 45, 0.96))", color: "#f7f9fc", fontFamily: '"Guya", system-ui, sans-serif' }; const errorFallbackCardStyle = { width: "min(100%, 560px)", display: "grid", gap: "16px", padding: "24px", border: "1px solid rgba(255, 255, 255, 0.12)", borderRadius: "20px", background: "rgba(8, 12, 20, 0.88)", boxShadow: "0 24px 60px rgba(0, 0, 0, 0.35)" }; const errorActionRowStyle = { display: "flex", flexWrap: "wrap", gap: "12px" }; const primaryErrorActionStyle = { border: "none", borderRadius: "999px", padding: "11px 18px", background: "#f4f7ff", color: "#09101d", font: "inherit", fontWeight: 700, cursor: "pointer" }; const secondaryErrorActionStyle = { ...primaryErrorActionStyle, background: "transparent", color: "#f7f9fc", border: "1px solid rgba(255, 255, 255, 0.18)" }; const errorDetailsStyle = { margin: 0, padding: "12px 14px", borderRadius: "12px", background: "rgba(255, 255, 255, 0.06)", color: "#c8d3e6", fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", fontSize: "12px", lineHeight: 1.5, whiteSpace: "pre-wrap", wordBreak: "break-word" }; class AppErrorBoundary extends reactExports.Component { state = { error: null }; static getDerivedStateFromError(error) { return { error }; } componentDidCatch(error, errorInfo) { console.error("Reader crashed", error, errorInfo); } handleReset = () => { this.setState({ error: null }); this.props.onReset(); }; render() { const { error } = this.state; if (!error) { return this.props.children; } return jsxRuntimeExports.jsx("section", { style: errorFallbackSurfaceStyle, children: jsxRuntimeExports.jsxs("div", { style: errorFallbackCardStyle, children: [ jsxRuntimeExports.jsxs("div", { children: [ jsxRuntimeExports.jsx( "p", { style: { margin: 0, fontSize: "12px", fontWeight: 700, letterSpacing: "0.08em", textTransform: "uppercase", color: "#8fb4ff" }, children: "Reader error" } ), jsxRuntimeExports.jsx( "h1", { style: { margin: "10px 0 0", fontSize: "30px", lineHeight: 1.1 }, children: "TruyenDrive hit an unexpected error." } ) ] }), jsxRuntimeExports.jsx("p", { style: { margin: 0, color: "#c8d3e6", lineHeight: 1.6 }, children: "The reader UI was unmounted to avoid leaving the page in a broken state. You can retry the reader or reload the page." }), jsxRuntimeExports.jsxs("div", { style: errorActionRowStyle, children: [ jsxRuntimeExports.jsx( "button", { style: primaryErrorActionStyle, type: "button", onClick: this.handleReset, children: "Retry reader" } ), jsxRuntimeExports.jsx( "button", { style: secondaryErrorActionStyle, type: "button", onClick: () => window.location.reload(), children: "Reload page" } ) ] }), jsxRuntimeExports.jsxs("details", { children: [ jsxRuntimeExports.jsx("summary", { style: { cursor: "pointer", color: "#dbe6f8" }, children: "Error details" }), jsxRuntimeExports.jsx("pre", { style: errorDetailsStyle, children: error.stack ?? error.message }) ] }) ] }) }); } } function AppContent() { const provider2 = useProvider(); const [initialReaderState] = reactExports.useState( () => parseReaderStateFromUrl(window.location.href) ); const [urlPassword] = reactExports.useState( () => new URL(window.location.href).searchParams.get("password") ); const [manualPassword, setManualPassword] = reactExports.useState(void 0); const [manualEncryptionMethod, setManualEncryptionMethod] = reactExports.useState(null); const [isPasswordDialogOpen, setIsPasswordDialogOpen] = reactExports.useState(false); const { settings, cycleSetting, resetCustomTheme, toggleSetting, updateSetting } = useSettings(); const imageWrapRef = reactExports.useRef(null); const mainRef = reactExports.useRef(null); const readerPortalRef = reactExports.useRef(null); const groupRefs = reactExports.useRef([]); const previousActiveFolderIdRef = reactExports.useRef(null); const currentPageRef = reactExports.useRef(-1); const historyPageRef = reactExports.useRef(null); const isHandlingPopStateRef = reactExports.useRef(false); const { activeGroupIndex, handlePageLoad, imageLoadVersion, isScrollReady, isSettingsOpen, loadedPageIds, resetReaderUi, setActiveGroupIndex, setImageLoadVersion, setIsScrollReady, setIsSettingsOpen, setSettingsTab, settingsTab } = useReaderUiState(); const { beginReaderSession, resetHistoryState } = useReaderSession({ currentPageRef, historyPageRef, isHandlingPopStateRef }); const handleResetPassword = reactExports.useCallback(() => { setManualPassword(void 0); setManualEncryptionMethod(null); setIsPasswordDialogOpen(false); }, []); const { activeFolderId, activeChapterIndex, chapters, closeComicMode, folderDetails, folderEncryptionMethod, folderMode, folderPassword, goToAdjacentChapter, goToChapterAtIndex, images, isAutoOpening, isModePickerOpen, isOpen, openChapter, openComicMode, parentChapters, resetReaderState, selectMode, statusMessage } = useComicMode({ beginReaderSession, initialChapterId: initialReaderState.chapterId, initialPage: initialReaderState.page, onResetPassword: handleResetPassword, onResetUi: resetReaderUi, resetHistoryState }); reactExports.useEffect(() => { const previousFolderId = previousActiveFolderIdRef.current; if (previousFolderId !== activeFolderId) { if (previousFolderId !== null) { handleResetPassword(); } previousActiveFolderIdRef.current = activeFolderId; } }, [activeFolderId, handleResetPassword]); const displayGroups = reactExports.useMemo( () => buildPageGroups(images, settings.lyt.spread, settings.lyt.direction), [images, settings.lyt.direction, settings.lyt.spread] ); const imageIds = reactExports.useMemo(() => images.map((image) => image.id), [images]); const themeStyle = reactExports.useMemo(() => getThemeStyle(settings.thm), [settings.thm]); const activePage = displayGroups[activeGroupIndex]?.pages[0]?.index ?? 0; const activePageNumber = images.length === 0 ? 0 : activePage + 1; const activeGroup = displayGroups[activeGroupIndex]; const hasAdjacentChapters = parentChapters.length > 1; const hasNextChapter = parentChapters.length > 1 && activeChapterIndex < parentChapters.length - 1; const isRtl = settings.lyt.direction === "rtl"; const isTtb = settings.lyt.direction === "ttb"; const isAtFirstGroup = activeGroupIndex === 0; const isAtLastGroup = displayGroups.length > 0 && activeGroupIndex === displayGroups.length - 1; const chapterStartGroupIndex = getChapterStartGroupIndex( displayGroups.length, settings.lyt.direction ); const logicalActiveGroupIndex = getLogicalGroupIndex( activeGroupIndex, displayGroups.length, settings.lyt.direction ); const supportsZoomOverlay = settings.lyt.fit === "width" || settings.lyt.fit === "width_limit"; const isComicSurfaceOpen = isOpen || folderMode === "chapters" || isModePickerOpen; const readerTitle = folderDetails?.title || parentChapters[activeChapterIndex]?.name || "Truyen Drive Comic Reader"; const activeChapterId = parentChapters[activeChapterIndex]?.id ?? activeFolderId; const password = manualPassword !== void 0 ? manualPassword : folderPassword ?? urlPassword; const encryptionMethod = manualEncryptionMethod ?? folderEncryptionMethod ?? "scanline"; const imagePassword = folderMode === "images" ? password : null; const isPasswordMode = reactExports.useMemo( () => imagePassword !== null && images.some((image) => image.requiresDecryption !== false), [imagePassword, images] ); const getImageUrl = reactExports.useCallback( (image) => provider2.getImageUrl(image), [provider2] ); const buildFetchUrl = reactExports.useCallback( (image) => provider2.buildFetchUrl(image), [provider2] ); const getThumbnailUrl = reactExports.useCallback( (image) => image.thumbnailUrl ?? provider2.getThumbnailUrl(image.id) ?? provider2.getImageUrl(image), [provider2] ); const { decryptedSrcs } = useImageDecryptor( images, imagePassword, encryptionMethod, displayGroups, activeGroupIndex, chapterStartGroupIndex, isScrollReady, settings.bhv.preload, buildFetchUrl ); const { goToAdjacentGroup, hoverEdge, isSelectorVisible, isZoomVisible, performVerticalPageTurn, performVerticalStep, scrollToGroup, setHoverEdge, showPageSelector, showZoomControls, syncActiveGroupFromScroll } = useReaderControls({ activeGroupIndex, displayGroups, groupRefs, imageWrapRef, mainRef, scrollContainerRef: readerPortalRef, isScrollReady, isOpen, setActiveGroupIndex, settings, supportsZoomOverlay }); const { handlePopState } = useReaderHistory({ activeChapterId, activePage, currentPageRef, displayGroups, historyPageRef, imageIds, isHandlingPopStateRef, isOpen, readerTitle, resetReaderState, scrollToGroup, settings }); const { isGroupPreloaded, preloadImageRefs } = useReaderPreload({ activeGroupIndex, displayGroups, getImageUrl, initialGroupIndex: chapterStartGroupIndex, isInitialScrollDone: isScrollReady, isPasswordMode, isOpen, preloadDistance: settings.bhv.preload }); const { tooWideGroups } = useWideGroupTracker({ displayGroups, groupRefs, imageLoadVersion, isOpen, settings }); const { handleTtbTap, isMobile } = useMobileTtbSticky({ isOpen, isTtb, mainRef, scrollContainerRef: readerPortalRef, settings, updateSetting }); useInitialScroll({ activeFolderId, activeGroupIndex, chapterStartGroupIndex, currentPageRef, displayGroups, groupRefs, isOpen, setActiveGroupIndex, setIsScrollReady, settings }); const isGroupLoaded = reactExports.useCallback( (index) => { const group = displayGroups[index]; return group ? group.pages.every((page) => loadedPageIds.has(page.id)) : false; }, [displayGroups, loadedPageIds] ); const goToChapterAtIndexFromReader = reactExports.useCallback( (index) => { currentPageRef.current = -1; goToChapterAtIndex(index); }, [goToChapterAtIndex] ); const goToAdjacentChapterFromReader = reactExports.useCallback( (delta) => { currentPageRef.current = -1; goToAdjacentChapter(delta); }, [goToAdjacentChapter] ); const handleSelectChapter = reactExports.useCallback( (_chapterId, index) => { const chapter = chapters[index]; if (!chapter) { return; } currentPageRef.current = -1; openChapter(chapter, chapters, index); }, [chapters, openChapter] ); const handleZoomChange = reactExports.useCallback( (zoom) => { updateSetting("lyt", "zoom", zoom); }, [updateSetting] ); const navigateGroupOrChapter = reactExports.useCallback( (delta) => { if (displayGroups.length === 0) { return; } if (delta === -1 && isAtFirstGroup && hasAdjacentChapters) { goToAdjacentChapterFromReader(isRtl ? 1 : -1); return; } if (delta === 1 && isAtLastGroup && hasAdjacentChapters) { goToAdjacentChapterFromReader(isRtl ? -1 : 1); return; } goToAdjacentGroup(delta); }, [ displayGroups.length, goToAdjacentChapterFromReader, goToAdjacentGroup, hasAdjacentChapters, isAtFirstGroup, isAtLastGroup, isRtl ] ); const performVerticalPageTurnOrChapter = reactExports.useCallback( (direction) => { const scroller = imageWrapRef.current; if (!scroller) { return; } const maxScrollTop = Math.max( scroller.scrollHeight - scroller.clientHeight, 0 ); const isAtTop = scroller.scrollTop <= 1; const isAtBottom = maxScrollTop - scroller.scrollTop <= 1; if (direction === -1 && isAtTop && isAtFirstGroup && hasAdjacentChapters) { goToAdjacentChapterFromReader(-1); return; } if (direction === 1 && isAtBottom && isAtLastGroup && hasAdjacentChapters) { goToAdjacentChapterFromReader(1); return; } performVerticalPageTurn(direction); }, [ goToAdjacentChapterFromReader, hasAdjacentChapters, isAtFirstGroup, isAtLastGroup, performVerticalPageTurn ] ); const jumpToChapterStart = reactExports.useCallback(() => { scrollToGroup(chapterStartGroupIndex); }, [chapterStartGroupIndex, scrollToGroup]); const copyShareUrl = reactExports.useCallback(() => { const url = window.location.href.replace(/\/u\/\d+/, ""); navigator.clipboard.writeText(url).catch((err) => { console.error("Failed to copy URL: ", err); }); }, []); const requestPassword = reactExports.useCallback(() => { setIsPasswordDialogOpen(true); }, []); useKeyboardHandler({ closeComicMode, copyShareUrl, cycleSetting, goToAdjacentChapter: goToAdjacentChapterFromReader, isComicSurfaceOpen, isOpen, isSettingsOpen, jumpToChapterStart, navigateGroupOrChapter, performVerticalStep, requestPassword, setIsSettingsOpen, settings, toggleSetting }); reactExports.useEffect(() => { window.addEventListener("popstate", handlePopState); return () => window.removeEventListener("popstate", handlePopState); }, [handlePopState]); reactExports.useEffect(() => { if (!isComicSurfaceOpen) { return; } const previousOverflow = document.body.style.overflow; document.body.style.overflow = "hidden"; return () => { document.body.style.overflow = previousOverflow; }; }, [isComicSurfaceOpen]); reactExports.useEffect(() => { if (!isOpen || displayGroups.length === 0) { return; } currentPageRef.current = activePage; }, [activePage, displayGroups.length, isOpen]); return jsxRuntimeExports.jsxs("div", { style: themeStyle, children: [ jsxRuntimeExports.jsxs( "button", { className: "truyendrive-launcher", onClick: () => openComicMode(), type: "button", children: [ jsxRuntimeExports.jsx("span", { className: "launcher-icon", children: "📖" }), jsxRuntimeExports.jsx("span", { className: "launcher-text", children: "TruyenDrive" }) ] } ), folderMode === "chapters" && !isOpen && !isAutoOpening && jsxRuntimeExports.jsx("div", { className: "truyendrive-portal", children: jsxRuntimeExports.jsx("main", { tabIndex: -1, children: jsxRuntimeExports.jsx( ChapterList, { chapters, folderDetails, onClose: () => resetReaderState(true), onSelectChapter: handleSelectChapter, statusMessage, title: readerTitle } ) }) }), isModePickerOpen && !isAutoOpening && jsxRuntimeExports.jsx(ModePickerDialog, { onSelectMode: selectMode }), isOpen && jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ jsxRuntimeExports.jsx("style", { children: readerStyles }), jsxRuntimeExports.jsx("div", { className: "truyendrive-portal", ref: readerPortalRef, children: jsxRuntimeExports.jsxs("div", { className: getRootClasses(settings), children: [ jsxRuntimeExports.jsxs("main", { ref: mainRef, tabIndex: -1, children: [ jsxRuntimeExports.jsx( ReaderSidebar, { activeGroup, activeChapterIndex, activeGroupIndex, logicalActiveGroupIndex, activePage, activePageNumber, closeComicMode, copyShareUrl, cycleSetting, displayGroups, folderMode, goToAdjacentChapter: goToAdjacentChapterFromReader, goToAdjacentGroup, goToChapterAtIndex: goToChapterAtIndexFromReader, getThumbnailUrl, images, isPasswordMode, jumpToChapterStart, parentChapters, password, readerTitle, requestPassword, scrollToGroup, setIsSettingsOpen, setSettingsTab, settings, statusMessage, toggleSetting } ), jsxRuntimeExports.jsx( PageSelector, { activeGroupIndex, activePageNumber, displayGroups, direction: settings.lyt.direction, isGroupLoaded, isSelectorVisible, pageCount: images.length, scrollToGroup } ), jsxRuntimeExports.jsx( ReaderArea, { displayGroups, groupRefs, getImageUrl, hoverEdge, imageWrapRef, isGroupPreloaded, isMobile, isPasswordMode, isScrollReady, isTtb, navigateGroupOrChapter, onMobileTtbTap: handleTtbTap, onPageLoad: handlePageLoad, performVerticalPageTurnOrChapter, preloadImageRefs, setHoverEdge, setImageLoadVersion, settings, showPageSelector, showZoomControls, syncActiveGroupFromScroll, decryptedSrcs, tooWideGroups, hasNextChapter, goToAdjacentChapter: goToAdjacentChapterFromReader } ), jsxRuntimeExports.jsx( ZoomControls, { isVisible: isZoomVisible, onZoomChange: handleZoomChange, showZoomControls, zoom: settings.lyt.zoom } ) ] }), jsxRuntimeExports.jsx( SettingsModal, { activeTab: settingsTab, onClose: () => setIsSettingsOpen(false), onTabChange: setSettingsTab, open: isSettingsOpen, resetCustomTheme, settings, updateSetting } ), isPasswordDialogOpen && jsxRuntimeExports.jsx( PasswordDialog, { currentMethod: encryptionMethod, currentPassword: password, onClose: () => setIsPasswordDialogOpen(false), onConfirm: (nextPassword, nextMethod) => { setManualPassword(nextPassword); setManualEncryptionMethod(nextMethod); setIsPasswordDialogOpen(false); } } ) ] }) }) ] }) ] }); } function App() { const [retryKey, setRetryKey] = reactExports.useState(0); return jsxRuntimeExports.jsx(AppErrorBoundary, { onReset: () => setRetryKey((current) => current + 1), children: jsxRuntimeExports.jsx(AppContent, {}, retryKey) }); } const DRIVE_API_KEY = "AIzaSyD_InbmSFufIEps5UAt2NmB_3LvBH3Sz_8"; const DRIVE_GUEST_API_KEY = "AIzaSyC1qbk75NzWBvSaDh6KnsjjA9pIrP4lYIE"; const DRIVE_CLIENT_VERSION = window._DRIVE_buildLabel; const DRIVE_JSPB_EXTENSION = "W1szMDUsMCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwxLG51bGwsbnVsbCxbMl1dXQ=="; const DRIVE_ITEM_JSPB_EXTENSION = "W1sxMDAxLDAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMSxudWxsLG51bGwsWzJdXV0="; const DRIVE_GUEST_JSPB_EXTENSION = "W1sxNDk3LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMSxudWxsLG51bGwsWzJdXV0="; const DRIVE_ACCOUNT_URL = `https://drivefrontend-pa.clients6.google.com/v1/account?alt=protojson&fields=account.drive_for_desktop_settings.switchblade_psk%2Caccount.enterprise_settings.can_access_admin_console%2Caccount.enterprise_settings.is_dasher_admin%2Caccount.enterprise_settings.is_dasher_user%2Caccount.metadata.backend_diagnostics.backend%2Caccount.metadata.export_format%2Caccount.metadata.gsuite_subscription_info.status%2Caccount.metadata.gsuite_subscription_info.trial_end_time_millis%2Caccount.metadata.gsuite_subscription_info.trial_millis_remaining%2Caccount.metadata.import_format%2Caccount.metadata.max_upload_size%2Caccount.metadata.quota.bytes_limit%2Caccount.metadata.quota.bytes_remaining%2Caccount.metadata.quota.bytes_used_by_all_services%2Caccount.metadata.quota.bytes_used_by_team%2Caccount.metadata.quota.bytes_used_by_user%2Caccount.metadata.quota.bytes_used_in_drive_trash_by_user%2Caccount.metadata.quota.grace_period_info.active%2Caccount.metadata.quota.grace_period_info.additional_quota_bytes%2Caccount.metadata.quota.grace_period_info.end_timestamp_millis%2Caccount.metadata.quota.individual_bytes_limit%2Caccount.metadata.quota.individual_usage_state%2Caccount.metadata.quota.quota_bytes_total%2Caccount.metadata.quota.quota_bytes_used%2Caccount.metadata.quota.quota_bytes_used_aggregate%2Caccount.metadata.quota.quota_bytes_used_in_trash%2Caccount.metadata.quota.quota_status%2Caccount.metadata.quota.quota_type%2Caccount.metadata.quota.service_usage.bytes_used%2Caccount.metadata.quota.service_usage.service_key%2Caccount.metadata.quota.usage_state%2Caccount.metadata.root_folder_id%2Caccount.metadata.target_audiences.audience_id%2Caccount.metadata.target_audiences.display_name%2Caccount.metadata.team_dashboard_capabilities.can_administer_team%2Caccount.metadata.team_dashboard_capabilities.can_manage_invites%2Caccount.search_settings.can_display_zero_state_search%2Caccount.security_settings.is_cse_create_enabled%2Caccount.security_settings.is_cse_enabled%2Caccount.security_settings.is_cse_on_by_default%2Caccount.shared_drives_settings.can_create_shared_drives%2Caccount.shared_drives_settings.can_interact_with_shared_drives%2Caccount.shared_drives_settings.can_migrate_to_shared_drives_as_admin%2Caccount.shared_drives_settings.has_shared_drives%2Caccount.storage_settings.can_buy_storage%2Caccount.user.customer_id%2Caccount.user.domain%2Caccount.user.email%2Caccount.user.email_from_account%2Caccount.user.focus_user_id%2Caccount.user.id%2Caccount.user.photo_url%2Caccount.user.short_name%2Caccount.user_capabilities%2Caccount.user_pref%2Caccount.view_settings.can_display_suggestions_in_shared_with_me%2Caccount.view_settings.can_view_priority%2Caccount.view_settings.show_machine_root_view%2Caccount.view_settings.show_spam_view%2Caccount.workspace_settings.active_workspace_limit%2Caccount.workspace_settings.can_create_workspaces%2Caccount.workspace_settings.total_workspace_limit%2Caccount.workspace_settings.workspace_item_limit&key=${DRIVE_API_KEY}`; const DRIVE_ITEMS_URL = `https://drivefrontend-pa.clients6.google.com/v1/items:list?key=${DRIVE_API_KEY}`; const DRIVE_ITEM_URL = `https://drivefrontend-pa.clients6.google.com/v1/items:get?key=${DRIVE_API_KEY}`; const DRIVE_GUEST_ITEMS_URL = `https://drivefrontend-pa.clients6.google.com/v1/items:list?key=${DRIVE_GUEST_API_KEY}`; const DRIVE_GUEST_ITEM_URL = `https://drivefrontend-pa.clients6.google.com/v1/items:get?key=${DRIVE_GUEST_API_KEY}`; const DRIVE_FILE_INTERNAL_URL = "https://clients6.google.com/drive/v2internal/files"; const DRIVE_FIELD_MASK = "items(parent,modified_date_millis,has_visitor_permissions,contains_unsubscribed_children,capabilities(can_move_item_into_team_drive,can_untrash,can_modify_content_restriction,can_move_item_within_team_drive,can_move_item_out_of_team_drive,can_delete_children,can_trash_children,can_request_approval,can_read_category_metadata,can_edit_category_metadata,can_add_my_drive_parent,can_remove_my_drive_parent,can_share_child_files,can_share_child_folders,can_read,can_move_item_within_drive,can_move_children_within_drive,can_add_folder_from_another_drive,can_change_security_update_enabled,can_create_decrypted_copy,can_create_encrypted_copy,can_add_encrypted_children,can_block_owner,can_report_spam_or_abuse,can_copy_encrypted_file,can_copy_non_authoritative,can_download_non_authoritative,can_report_not_spam,can_initiate_esignature,can_discover_by_search,can_copy,can_download,can_edit,can_add_children,can_delete,can_remove_children,can_share,can_trash,can_rename,can_list_children,can_read_team_drive,can_move_team_drive_item),modified_by_me_date_millis,last_viewed_by_me_date_millis,alternate_link,workspace_id,file_size,content_restrictions(read_only),approval_version,owner(id,focus_user_id,is_me,type,email),approval_summaries,shortcut_details(target_id,target_mime_type,target_lookup_status,target_item,can_request_access_to_target),last_modifying_user(id,focus_user_id,is_me,type,email),customer_id,ancestor_has_own_permissions,has_thumbnail,thumbnail_version,title,mime_type,image(width,height),id,resource_key,abuse_is_appealable,abuse_notice_reason,spam_metadata(marked_as_spam_date_millis,in_spam_view,is_spam,is_inherited_spam),shared,access_requests_count,has_incoming_approval,shared_with_me_date_millis,user_role,inheritance_broken,explicitly_trashed,quota_bytes_used,gmail_message_storage_id,applied_labels,has_catch_me_up_content,workflow_creation_id,vids_import_compatibility_info,workbook_details,subscribed,folder_color,has_child_folder,starred,creator_app_id,file_extension,primary_sync_parent,sharing_user(id,focus_user_id,is_me,type,email),flagged_for_abuse,folder_features,spaces,source_app_id,trashed,recency_date_millis,recency_date_reason,restricted,version,action_item,viewed,team_drive_id,has_own_permissions,create_date_millis,primary_domain_name,organization_display_name,passively_subscribed,trashing_user(id,focus_user_id,is_me,type,email),trashed_date_millis),continuation_token,search_response_metadata(incomplete_search,moonshine_item_ids,query_suggestions(spell_response,nlp_response))"; const DRIVE_ITEM_FIELD_MASK = "responses(status(code,message,details),item(parent,modified_date_millis,has_visitor_permissions,contains_unsubscribed_children,capabilities(can_move_item_into_team_drive,can_untrash,can_modify_content_restriction,can_move_item_within_team_drive,can_move_item_out_of_team_drive,can_delete_children,can_trash_children,can_request_approval,can_read_category_metadata,can_edit_category_metadata,can_add_my_drive_parent,can_remove_my_drive_parent,can_share_child_files,can_share_child_folders,can_read,can_move_item_within_drive,can_move_children_within_drive,can_add_folder_from_another_drive,can_change_security_update_enabled,can_create_decrypted_copy,can_create_encrypted_copy,can_add_encrypted_children,can_block_owner,can_report_spam_or_abuse,can_copy_encrypted_file,can_copy_non_authoritative,can_download_non_authoritative,can_report_not_spam,can_initiate_esignature,can_discover_by_search,can_copy,can_download,can_edit,can_add_children,can_delete,can_remove_children,can_share,can_trash,can_rename,can_list_children,can_read_team_drive,can_move_team_drive_item),modified_by_me_date_millis,last_viewed_by_me_date_millis,alternate_link,workspace_id,file_size,content_restrictions(read_only),approval_version,owner(id,focus_user_id,is_me,type,email),approval_summaries,shortcut_details(target_id,target_mime_type,target_lookup_status,target_item,can_request_access_to_target),last_modifying_user(id,focus_user_id,is_me,type,email),customer_id,ancestor_has_own_permissions,has_thumbnail,thumbnail_version,title,mime_type,id,resource_key,abuse_is_appealable,abuse_notice_reason,spam_metadata(marked_as_spam_date_millis,in_spam_view,is_spam,is_inherited_spam),shared,access_requests_count,has_incoming_approval,shared_with_me_date_millis,user_role,inheritance_broken,explicitly_trashed,quota_bytes_used,gmail_message_storage_id,applied_labels,has_catch_me_up_content,workflow_creation_id,vids_import_compatibility_info,workbook_details,subscribed,folder_color,has_child_folder,starred,creator_app_id,file_extension,primary_sync_parent,sharing_user(id,focus_user_id,is_me,type,email),flagged_for_abuse,folder_features,spaces,source_app_id,trashed,recency_date_millis,recency_date_reason,restricted,version,action_item,viewed,team_drive_id,has_own_permissions,create_date_millis,primary_domain_name,organization_display_name,passively_subscribed,trashing_user(id,focus_user_id,is_me,type,email),trashed_date_millis,permission_summary))"; const DRIVE_ACCEPT_LANGUAGE = "vi"; const DRIVE_ORIGIN = "https://drive.google.com"; const DRIVE_GAPI_PROXY_TIMEOUT_MS = 3e3; const DRIVE_GAPI_LAZY_SCRIPT_URL = "https://www.gstatic.com/feedback/js/help/prod/service/lazy.min.js"; const DRIVE_GAPI_CLIENT_SCRIPT_URL = "https://apis.google.com/js/client.js"; async function getSapisidHash(timestamp, context) { const sapisid = document.cookie.match(/SAPISID=([^;]+)/)?.[1]; if (!sapisid) { throw new Error("SAPISID cookie not found. Are you logged in?"); } const contextKeys = context ? Object.keys(context) : []; const contextValues = context ? Object.values(context) : []; const rawString = (contextValues.length === 0 ? [timestamp, sapisid, DRIVE_ORIGIN] : [contextValues.join(":"), timestamp, sapisid, DRIVE_ORIGIN]).join(" "); const encoder = new TextEncoder(); const data = encoder.encode(rawString); const hashBuffer = await crypto.subtle.digest("SHA-1", data); const hashHex = Array.from(new Uint8Array(hashBuffer)).map((byte) => byte.toString(16).padStart(2, "0")).join(""); const hashValue = (contextKeys.length === 0 ? [timestamp, hashHex] : [timestamp, hashHex, contextKeys.join("")]).join("_"); return `SAPISIDHASH ${hashValue} SAPISID1PHASH ${hashValue} SAPISID3PHASH ${hashValue}`; } function getAuthUser$1() { const match = window.location.href.match(/\/u\/(\d+)/); return match ? match[1] : "0"; } function isAuthenticated() { return /SAPISID=/.test(document.cookie); } function createDriveHeaders(authUser, authorization, extraHeaders = {}) { return { accept: "*/*", "accept-language": DRIVE_ACCEPT_LANGUAGE, authorization, "cache-control": "no-cache", "content-type": "application/json+protobuf", pragma: "no-cache", "x-goog-authuser": authUser, "x-goog-drive-client-version": DRIVE_CLIENT_VERSION, "x-goog-ext-472780938-jspb": DRIVE_JSPB_EXTENSION, ...extraHeaders }; } function createGuestHeaders(extraHeaders = {}) { return { accept: "*/*", "accept-language": DRIVE_ACCEPT_LANGUAGE, "content-type": "application/json+protobuf", "x-goog-drive-client-version": DRIVE_CLIENT_VERSION, "x-goog-ext-472780938-jspb": DRIVE_GUEST_JSPB_EXTENSION, ...extraHeaders }; } function requestProtoJson({ authUser, body, headers, method, url }) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.withCredentials = true; Object.entries(headers ?? {}).forEach(([key, value]) => { xhr.setRequestHeader(key, value); }); xhr.onload = () => { if (xhr.status < 200 || xhr.status >= 300) { reject(new Error(`Request failed with status ${xhr.status}`)); return; } try { resolve(JSON.parse(xhr.responseText)); } catch (error) { reject(error); } }; xhr.onerror = () => reject( new Error( `Network error while requesting Google Drive data for auth user ${authUser}` ) ); xhr.send(body); }); } function requestText({ body, headers, method, url }) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.withCredentials = true; Object.entries(headers ?? {}).forEach(([key, value]) => { xhr.setRequestHeader(key, value); }); xhr.onload = () => { if (xhr.status < 200 || xhr.status >= 300) { reject(new Error(`Request failed with status ${xhr.status}`)); return; } resolve(xhr.responseText); }; xhr.onerror = () => reject(new Error("Network error while requesting data")); xhr.send(body); }); } function stripXssiPrefix(text) { return text.replace(/^\)\]\}'\s*/, "").trim(); } function parseJsonText(text) { const strippedText = stripXssiPrefix(text); try { return JSON.parse(strippedText); } catch (error) { try { return JSON.parse(stripXssiPrefix(atob(strippedText))); } catch { throw error; } } } function buildFolderItemsBody(folderId, cursor) { return `[[null,null,null,null,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"",null,0,null,null,[4,1,1],null,null,null,null,null,null,null,null,null,null,[[1]],null,null,null,null,null,null,null,[["${folderId}"]]],[50,"${cursor ?? ""}",[2,5]]]`; } function buildFolderDetailsBody(folderId) { return `[["${folderId}"],[null,null,null,null,null,[2,5]]]`; } function buildPdfPreviewUrl(pdfId, apiKey, baseUrl, withCacheBust = false) { const url = new URL(`${baseUrl}/${encodeURIComponent(pdfId)}`); url.searchParams.set("fields", "preview,kind"); url.searchParams.set("supportsTeamDrives", "true"); url.searchParams.set("enforceSingleParent", "true"); url.searchParams.set("key", apiKey); if (withCacheBust) { url.searchParams.set("$unique", `truyendrive-${Date.now()}`); } return url; } function buildClientDetails() { const userAgent = navigator.userAgent; return [ ["appVersion", navigator.appVersion], ["platform", navigator.platform], ["userAgent", userAgent] ].map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join("&"); } function getBrowserAcceptLanguage() { const languages = navigator.languages && navigator.languages.length > 0 ? navigator.languages : [navigator.language || "en-US"]; return languages.map( (language, index) => index === 0 ? language : `${language};q=${Math.max(0.1, 1 - index / 10)}` ).join(","); } function getGapiClientRequest() { const gapi = window.gapi; return typeof gapi?.client?.request === "function" ? gapi.client.request.bind(gapi.client) : null; } let gapiScriptsPromise = null; function loadScript(src) { return new Promise((resolve, reject) => { const script = document.createElement("script"); script.src = src; script.async = true; script.onload = () => resolve(); script.onerror = () => reject(new Error(`Failed to load script: ${src}`)); document.head.appendChild(script); }); } function ensureGapiScriptsLoaded() { if (window.gapi) { return Promise.resolve(); } if (!gapiScriptsPromise) { gapiScriptsPromise = loadScript(DRIVE_GAPI_LAZY_SCRIPT_URL).then( () => loadScript(DRIVE_GAPI_CLIENT_SCRIPT_URL) ); } return gapiScriptsPromise; } async function waitForGapiClientRequest() { const existingRequest = getGapiClientRequest(); if (existingRequest) { return existingRequest; } if (!window.gapi) { await ensureGapiScriptsLoaded(); } const startedAt = Date.now(); return new Promise( (resolve, reject) => { const poll = () => { const request = getGapiClientRequest(); if (request) { resolve(request); return; } if (Date.now() - startedAt >= DRIVE_GAPI_PROXY_TIMEOUT_MS) { reject( new Error("Google Drive gapi client is not ready for guest PDF") ); return; } window.setTimeout(poll, 50); }; poll(); } ); } async function requestGapiJson(options) { const request = (await waitForGapiClientRequest())(options); if (typeof request.then === "function") { const response = await new Promise((resolve, reject) => { request.then?.(resolve, reject); }); return response.result ?? (typeof response.body === "string" ? parseJsonText(response.body) : response); } if (typeof request.execute === "function") { return new Promise((resolve, reject) => { request.execute?.((response) => { if (response?.error) { reject( new Error( response.error.message ?? `Request failed with status ${response.status}` ) ); return; } resolve( response.result ?? (typeof response.body === "string" ? parseJsonText(response.body) : response) ); }); }); } throw new Error("Google Drive gapi request could not be created"); } function isDriveProtoItem(value) { return Array.isArray(value) && typeof value[0] === "string" && value[0].length > 0 && typeof value[2] === "string" && value[2].length > 0 && typeof value[3] === "string" && value[3].length > 0; } function extractDriveProtoItem(response) { const responses = Array.isArray(response[0]) ? response[0] : []; for (const entry of responses) { if (!Array.isArray(entry)) { continue; } for (const candidate of entry) { if (isDriveProtoItem(candidate)) { return candidate; } } } for (const candidate of response) { if (isDriveProtoItem(candidate)) { return candidate; } } return null; } function findEmailValue(value) { if (typeof value === "string" && value.includes("@")) { return value; } if (!Array.isArray(value)) { return ""; } for (const entry of value) { const email = findEmailValue(entry); if (email) { return email; } } return ""; } function findThumbnailVersion(item) { for (let index = 0; index < item.length - 1; index += 1) { if (item[index] !== true) { continue; } const candidate = item[index + 1]; if (typeof candidate === "number" && Number.isFinite(candidate) && candidate > 0) { return String(candidate); } if (typeof candidate === "string" && /^\d+$/.test(candidate) && candidate !== "0") { return candidate; } } return ""; } async function fetchAccount(authUser = getAuthUser$1()) { const timestamp = Math.floor(Date.now() / 1e3); const authorization = await getSapisidHash(timestamp, null); return requestProtoJson({ authUser, headers: createDriveHeaders(authUser, authorization), method: "GET", url: DRIVE_ACCOUNT_URL }); } async function fetchFolderItems(folderId, cursor, accountData, authUser = getAuthUser$1()) { const userInfo = accountData ?? await fetchAccount(authUser); const timestamp = Math.floor(Date.now() / 1e3); const authorization = await getSapisidHash(timestamp, { u: userInfo[0][0][10] }); return requestProtoJson({ authUser, body: buildFolderItemsBody(folderId, cursor), headers: createDriveHeaders(authUser, authorization, { "x-goog-fieldmask": DRIVE_FIELD_MASK }), method: "POST", url: DRIVE_ITEMS_URL }); } async function fetchFolderItemsGuest(folderId, cursor) { return requestProtoJson({ authUser: "guest", body: buildFolderItemsBody(folderId, cursor), headers: createGuestHeaders({ "x-goog-fieldmask": DRIVE_FIELD_MASK }), method: "POST", url: DRIVE_GUEST_ITEMS_URL }); } async function fetchPdfPreviewLink(pdfId, authUser = getAuthUser$1()) { if (authUser === "guest") { return fetchPdfPreviewLinkGuest(pdfId); } const timestamp = Math.floor(Date.now() / 1e3); const authorization = await getSapisidHash(timestamp, null); const url = buildPdfPreviewUrl( pdfId, DRIVE_API_KEY, DRIVE_FILE_INTERNAL_URL, true ); const response = parseJsonText( await requestText({ headers: { accept: "*/*", "accept-language": DRIVE_ACCEPT_LANGUAGE, authorization, "cache-control": "no-cache", pragma: "no-cache", "x-goog-authuser": authUser, "x-javascript-user-agent": "google-api-javascript-client/1.1.0", "x-requested-with": "XMLHttpRequest" }, method: "GET", url: url.toString() }) ); const previewLink = response.preview?.link; if (!previewLink) { throw new Error("Failed to load Google Drive PDF preview link"); } return previewLink; } async function fetchPdfPreviewLinkGuest(pdfId) { const response = await requestGapiJson({ headers: { accept: "*/*", "accept-language": getBrowserAcceptLanguage(), "x-clientdetails": buildClientDetails(), "x-goog-authuser": "0", "x-goog-encode-response-if-executable": "base64", "x-javascript-user-agent": "google-api-javascript-client/1.1.0", "x-origin": DRIVE_ORIGIN, "x-referer": DRIVE_ORIGIN, "x-requested-with": "XMLHttpRequest" }, method: "GET", params: { enforceSingleParent: true, fields: "preview,kind", key: DRIVE_GUEST_API_KEY, supportsTeamDrives: true }, path: `/drive/v2beta/files/${encodeURIComponent(pdfId)}`, root: "https://clients6.google.com" }); const previewLink = response.preview?.link; if (!previewLink) { throw new Error("Failed to load Google Drive PDF preview link"); } return previewLink; } function buildViewerUrl(path) { return new URL(path, "https://drive.google.com/viewer/"); } function buildPdfPageUrl(pageTemplate, pageIndex, width, thumbnail = false) { const url = buildViewerUrl(pageTemplate); url.searchParams.set("page", String(pageIndex)); url.searchParams.set("skiphighlight", "true"); url.searchParams.set("w", String(thumbnail ? 240 : width)); if (!thumbnail) { url.searchParams.set("auditContext", "forDisplay"); url.searchParams.set("webp", "true"); } return url.toString(); } async function fetchPdfImages(pdfId, authUser = getAuthUser$1()) { const previewLink = await fetchPdfPreviewLink(pdfId, authUser); const bootstrap = parseJsonText( await requestText({ headers: { accept: "*/*", "accept-language": DRIVE_ACCEPT_LANGUAGE, "cache-control": "no-cache", pragma: "no-cache" }, method: "GET", url: previewLink }) ); if (!bootstrap.img || !bootstrap.meta) { throw new Error("Failed to parse Google Drive PDF viewer data"); } const meta = parseJsonText( await requestText({ headers: { accept: "*/*", "accept-language": DRIVE_ACCEPT_LANGUAGE, "cache-control": "no-cache", pragma: "no-cache" }, method: "GET", url: buildViewerUrl(bootstrap.meta).toString() }) ); const pageCount = Number(meta.pages ?? 0); const maxPageWidth = Number(meta.maxPageWidth ?? 0); if (!Number.isFinite(pageCount) || pageCount <= 0) { throw new Error("Failed to detect Google Drive PDF page count"); } const pageWidth = Number.isFinite(maxPageWidth) && maxPageWidth > 0 ? maxPageWidth : 1600; return Array.from({ length: pageCount }, (_, pageIndex) => { const url = buildPdfPageUrl(bootstrap.img, pageIndex, pageWidth); return { fetchUrl: url, height: 0, id: `pdf:${pdfId}:${pageIndex}`, requiresDecryption: false, thumbnailUrl: buildPdfPageUrl(bootstrap.img, pageIndex, pageWidth, true), url, width: pageWidth }; }); } async function fetchFolderDetails(folderId, accountData, authUser = getAuthUser$1()) { const userInfo = accountData ?? await fetchAccount(authUser); const timestamp = Math.floor(Date.now() / 1e3); const authorization = await getSapisidHash(timestamp, { u: userInfo[0][0][10] }); const response = await requestProtoJson({ authUser, body: buildFolderDetailsBody(folderId), headers: createDriveHeaders(authUser, authorization, { "x-goog-ext-472780938-jspb": DRIVE_ITEM_JSPB_EXTENSION, "x-goog-fieldmask": DRIVE_ITEM_FIELD_MASK }), method: "POST", url: DRIVE_ITEM_URL }); const item = extractDriveProtoItem(response); if (!item) { throw new Error("Failed to parse Google Drive folder details"); } const owner = Array.isArray(item[16]) ? item[16] : null; const thumbnailVersion = findThumbnailVersion(item); return { ownerEmail: owner ? findEmailValue(owner) || "Unknown" : "Unknown", thumbnailUrl: thumbnailVersion ? `https://lh3.google.com/u/${authUser}/d/${folderId}=s220` : null, title: typeof item[2] === "string" && item[2].length > 0 ? item[2] : "Untitled" }; } async function fetchFolderDetailsGuest(folderId) { const response = await requestProtoJson({ authUser: "guest", body: buildFolderDetailsBody(folderId), headers: createGuestHeaders({ "x-goog-fieldmask": DRIVE_ITEM_FIELD_MASK }), method: "POST", url: DRIVE_GUEST_ITEM_URL }); const item = extractDriveProtoItem(response); if (!item) { throw new Error("Failed to parse Google Drive folder details"); } const owner = Array.isArray(item[16]) ? item[16] : null; const thumbnailVersion = findThumbnailVersion(item); return { ownerEmail: owner ? findEmailValue(owner) || "Unknown" : "Unknown", thumbnailUrl: thumbnailVersion ? `https://drive.google.com/u/0/drive-usercontent/${folderId}=s220` : null, title: typeof item[2] === "string" && item[2].length > 0 ? item[2] : "Untitled" }; } const accountCache = new Map(); const pendingAccountRequests = new Map(); function getAuthUser() { return isAuthenticated() ? getAuthUser$1() : "guest"; } function loadAccount(authUser = getAuthUser()) { if (!isAuthenticated()) { return Promise.resolve(null); } const cachedAccountData = accountCache.get(authUser); if (cachedAccountData) { return Promise.resolve(cachedAccountData); } const pendingRequest = pendingAccountRequests.get(authUser); if (pendingRequest) { return pendingRequest; } const request = fetchAccount(authUser).then((accountData) => { accountCache.set(authUser, accountData); pendingAccountRequests.delete(authUser); return accountData; }).catch((error) => { pendingAccountRequests.delete(authUser); throw error; }); pendingAccountRequests.set(authUser, request); return request; } const FOLDER_ID_PATTERN = /\/folders\/([^/?#]+)/; const FILE_ID_PATTERN = /\/file\/d\/([^/?#]+)/; const DRIVE_FOLDER_MIME = "application/vnd.google-apps.folder"; const PDF_MIME = "application/pdf"; const SHORTCUT_MIME = "application/vnd.google-apps.shortcut"; const PASSWORD_FILE_PATTERN$1 = /^\.password\.(.+?)(?:\.(scanline|noise))?\.truyendrive$/; function findShortcutDetails(item) { for (let index = 0; index < item.length; index += 1) { const candidate = item[index]; if (Array.isArray(candidate) && typeof candidate[0] === "string" && candidate[0].length > 0 && typeof candidate[2] === "string" && candidate[2].startsWith("application/")) { return candidate; } } return null; } function resolveShortcutItem(item) { const mimeType = typeof item[3] === "string" ? item[3] : ""; if (mimeType !== SHORTCUT_MIME) { return item; } const details = findShortcutDetails(item); if (!details) { return item; } const targetItem = Array.isArray(details[4]) ? details[4] : null; if (targetItem) { return resolveShortcutItem(targetItem); } const patchedItem = [...item]; patchedItem[0] = details[0]; patchedItem[3] = details[2]; return patchedItem; } function resolveShortcuts(items) { return items.map(resolveShortcutItem); } function extractPasswordFromItems(items) { for (const item of items) { const name = typeof item[2] === "string" ? item[2] : ""; const match = name.match(PASSWORD_FILE_PATTERN$1); if (match) { return { password: match[1] ?? null, method: match[2] ?? null }; } } return { password: null, method: null }; } function isPasswordFileItem(item) { const name = typeof item[2] === "string" ? item[2] : ""; return PASSWORD_FILE_PATTERN$1.test(name); } function extractImages(items) { const images = []; items.forEach((item) => { const id = typeof item[0] === "string" ? item[0] : ""; const mimeType = typeof item[3] === "string" ? item[3] : ""; if (!id || !mimeType.startsWith("image/")) { return; } const dimensions = Array.isArray(item[26]) ? item[26] : null; const width = typeof dimensions?.[1] === "number" ? dimensions[1] : 0; const height = typeof dimensions?.[2] === "number" ? dimensions[2] : 0; images.push({ id, width, height }); }); return images; } function extractChapters(items) { const chapters = []; items.forEach((item) => { const id = typeof item[0] === "string" ? item[0] : ""; const mimeType = typeof item[3] === "string" ? item[3] : ""; if (!id || mimeType !== DRIVE_FOLDER_MIME && mimeType !== PDF_MIME) { return; } chapters.push({ creator: typeof item[16]?.[7] === "string" && item[16][7].length > 0 ? item[16][7] : "Unknown", id, kind: mimeType === PDF_MIME ? "pdf" : "folder", name: typeof item[2] === "string" && item[2].length > 0 ? item[2] : "Untitled", updatedAt: typeof item[9] === "number" ? item[9] : 0 }); }); return chapters; } function classifyItems(items) { const contentItems = items.filter((item) => !isPasswordFileItem(item)); if (contentItems.length === 0) { return "empty"; } let allChapters = true; let allImages = true; contentItems.forEach((item) => { const mimeType = typeof item[3] === "string" ? item[3] : ""; if (mimeType !== DRIVE_FOLDER_MIME && mimeType !== PDF_MIME) { allChapters = false; } if (!mimeType.startsWith("image/")) { allImages = false; } }); if (allChapters) { return "chapters"; } if (allImages) { return "images"; } return "mixed"; } function toFolderPageResult$1(items) { const classification = classifyItems(items); const passwordFile = extractPasswordFromItems(items); return { chapters: extractChapters(items), encryptionMethod: passwordFile.method, images: extractImages(items), isEmpty: classification === "empty", isMixed: classification === "mixed", password: passwordFile.password }; } class GoogleDriveProvider { accountData = null; authUser = getAuthUser(); error = null; initGeneration = 0; isGuest = !isAuthenticated(); pendingInit = null; getFolderIdFromUrl() { return window.location.href.match(FOLDER_ID_PATTERN)?.[1] ?? null; } getResourceFromUrl() { const folderId = this.getFolderIdFromUrl(); if (folderId) { return { id: folderId, kind: "folder" }; } const fileId = window.location.href.match(FILE_ID_PATTERN)?.[1]; if (fileId) { return { id: fileId, kind: "pdf" }; } return null; } getAuthUser() { return getAuthUser(); } getImageUrl(image) { if (image.url) { return image.url; } if (this.isGuest) { return `https://drive.google.com/u/0/drive-usercontent/${image.id}`; } return `https://lh3.google.com/u/${this.authUser}/d/${image.id}`; } buildFetchUrl(image) { if (image.fetchUrl ?? image.url) { return image.fetchUrl ?? image.url ?? ""; } const base = this.getContentUrl(image.id); const width = image.width ?? 0; const height = image.height ?? 0; if (!base.startsWith("https://drive.google.com/") && !base.startsWith("https://lh3.google.com/")) { return base; } if (!width && !height) { return `${base}=w10000`; } if (width > 1600 || height > 1600) { return `${base}=w${width}-h${height}`; } return base; } getContentUrl(id) { const authUser = this.isGuest ? "0" : this.authUser; return `https://drive.google.com/u/${authUser}/drive-usercontent/${id}`; } getThumbnailUrl(imageId) { return `${this.getImageUrl({ id: imageId, width: 0, height: 0 })}=s220`; } async initialize() { const nextAuthUser = getAuthUser(); if (!isAuthenticated()) { this.initGeneration += 1; this.authUser = nextAuthUser; this.accountData = null; this.error = null; this.isGuest = true; this.pendingInit = null; return; } if (!this.isGuest && this.accountData && this.authUser === nextAuthUser) { return; } if (!this.isGuest && this.error && this.authUser === nextAuthUser) { return; } if (this.pendingInit?.authUser === nextAuthUser) { return this.pendingInit.promise; } const requestGeneration = this.initGeneration + 1; this.initGeneration = requestGeneration; this.authUser = nextAuthUser; this.accountData = null; this.error = null; this.isGuest = false; const request = loadAccount(nextAuthUser).then((accountData) => { if (this.initGeneration !== requestGeneration) { return; } if (!accountData) { throw new Error("Failed to load account"); } this.accountData = accountData; this.error = null; }).catch((error) => { if (this.initGeneration !== requestGeneration) { return; } this.accountData = null; this.error = error instanceof Error ? error : new Error("Failed to load account"); throw this.error; }).finally(() => { if (this.pendingInit?.promise === request) { this.pendingInit = null; } }); this.pendingInit = { authUser: nextAuthUser, promise: request }; return request; } isReady() { return this.isGuest || this.accountData !== null; } getInitError() { return this.error; } async fetchFolderPage(folderId, cursor) { if (!this.isReady()) { await this.initialize(); } if (this.isGuest) { const [rawItems2, nextCursor2] = await fetchFolderItemsGuest( folderId, cursor ); const items2 = resolveShortcuts(rawItems2); return [toFolderPageResult$1(items2), nextCursor2 ?? void 0]; } if (!this.accountData) { throw this.error ?? new Error("Failed to load account"); } const [rawItems, nextCursor] = await fetchFolderItems( folderId, cursor, this.accountData, this.authUser ); const items = resolveShortcuts(rawItems); return [toFolderPageResult$1(items), nextCursor ?? void 0]; } async fetchPdfImages(pdfId) { if (!this.isReady()) { await this.initialize(); } if (this.isGuest) { return fetchPdfImages(pdfId, "guest"); } if (!this.accountData) { throw this.error ?? new Error("Failed to load account"); } return fetchPdfImages(pdfId, this.authUser); } async fetchFolderDetails(folderId) { if (!this.isReady()) { await this.initialize(); } if (this.isGuest) { return fetchFolderDetailsGuest(folderId); } if (!this.accountData) { throw this.error ?? new Error("Failed to load account"); } return fetchFolderDetails(folderId, this.accountData, this.authUser); } } const IMAGE_EXTENSIONS = new Set(["avif", "gif", "jpeg", "jpg", "png", "webp"]); const ONEDRIVE_ORIGIN = "https://onedrive.live.com"; const PASSWORD_FILE_PATTERN = /^\.password\.(.+?)(?:\.(scanline|noise))?\.truyendrive$/; const FIRST_PAGE_RENDER_OPTIONS = 1496871; const PAGED_RENDER_OPTIONS = 1232931; function decodeFolderId(value) { if (!value) { return null; } try { return decodeURIComponent(value); } catch { return value; } } function getString(value) { if (typeof value === "string") { return value; } if (typeof value === "number") { return String(value); } return ""; } function cleanLookupValue(value) { const rawValue = getString(value); const separatorIndex = rawValue.lastIndexOf(";#"); return separatorIndex === -1 ? rawValue : rawValue.slice(separatorIndex + 2); } function getFileName(row) { return cleanLookupValue(row.FileLeafRef) || cleanLookupValue(row.LinkFilename) || cleanLookupValue(row.FileRef).split("/").pop() || "Untitled"; } function getExtension(name) { const extension = name.split(".").pop(); return extension ? extension.toLowerCase() : ""; } function isImageRow(row) { return getString(row.FSObjType) === "0" && IMAGE_EXTENSIONS.has(getExtension(getFileName(row))); } function isFolderRow(row) { return getString(row.FSObjType) === "1"; } function parseModifiedAt(row) { const rawModified = getString(row["Modified."]) || getString(row.Modified); const timestamp = Date.parse(rawModified); return Number.isFinite(timestamp) ? timestamp : 0; } function getCreator(row) { const editor = row.Editor; if (Array.isArray(editor)) { const firstEditor = editor[0]; if (firstEditor && typeof firstEditor === "object" && !Array.isArray(firstEditor)) { const email = getString(firstEditor.email); if (email) { return email; } } } return getString(row.Editor) || "Unknown"; } function parseFastMetadata(row) { const rawMetadata = getString(row.MediaServiceFastMetadata); if (!rawMetadata) { return { height: 0, width: 0 }; } try { const metadata = JSON.parse(rawMetadata); const width = Number(metadata.photo?.width ?? 0); const height = Number(metadata.photo?.height ?? 0); return { height: Number.isFinite(height) ? height : 0, width: Number.isFinite(width) ? width : 0 }; } catch { return { height: 0, width: 0 }; } } function getItemIdFromApiUrl(row) { const url = getString(row[".spItemUrl"]); const match = url.match(/\/items\/([^/?#]+)/); return match ? decodeURIComponent(match[1]) : ""; } function getDriveApiBaseFromRows(rows) { for (const row of rows) { const url = getString(row[".spItemUrl"]); const match = url.match( /^(https:\/\/onedrive\.live\.com(?::443)?\/_api\/v2\.0\/drives\/[^/]+)/ ); if (match) { return match[1]; } } return null; } function getImageId(row) { return getString(row["name.FileSystemItemId"]) || getString(row.UniqueId) || getItemIdFromApiUrl(row) || getString(row.ID); } function getFolderPath(row, parentFolderId) { const fileRef = cleanLookupValue(row.FileRef); if (fileRef) { return fileRef; } const encodedUrl = cleanLookupValue(row.EncodedAbsUrl); if (encodedUrl) { try { return decodeURIComponent(new URL(encodedUrl).pathname); } catch { return encodedUrl; } } const folderName = getFileName(row); return `${parentFolderId.replace(/\/+$/, "")}/${folderName}`; } function toFolderPageResult(rows, folderId) { const chapters = []; const images = []; let hasChapters = false; let hasImages = false; let hasOther = false; let password = null; let encryptionMethod = null; rows.forEach((row) => { const fileName = getFileName(row); const passwordMatch = fileName.match(PASSWORD_FILE_PATTERN); if (passwordMatch) { password ??= passwordMatch[1]; encryptionMethod ??= passwordMatch[2] ?? null; return; } if (isFolderRow(row)) { hasChapters = true; chapters.push({ creator: getCreator(row), id: getFolderPath(row, folderId), kind: "folder", name: fileName, updatedAt: parseModifiedAt(row) }); return; } if (isImageRow(row)) { hasImages = true; const id = getImageId(row); if (!id) { return; } images.push({ id, ...parseFastMetadata(row) }); return; } hasOther = true; }); const isEmpty = !hasChapters && !hasImages && !hasOther; return { chapters, encryptionMethod, images, isEmpty, isMixed: !isEmpty && (hasChapters && hasImages || hasOther), password }; } function getListData(response) { return response.ListData ?? response; } function unwrapListResponse(response) { const data = response.d; if (!data) { return response; } if ("RenderListDataAsStream" in data && data.RenderListDataAsStream) { return data.RenderListDataAsStream; } return data; } function getListSchema(response) { const listData = getListData(response); return response.ListSchema ?? listData.ListSchema ?? null; } function getNextHref(response) { const nextHref = getListData(response).NextHref ?? response.NextHref; return nextHref ? nextHref.replace(/&/g, "&") : void 0; } function getRows(response) { const rows = getListData(response).Row ?? response.Row ?? []; return Array.isArray(rows) ? rows : []; } function parseFolderParts(folderId) { const cid = folderId.match(/^\/personal\/([^/]+)/)?.[1]; if (!cid) { throw new Error("Invalid OneDrive folder URL"); } const pathParts = folderId.split("/").filter(Boolean); const documentsIndex = pathParts.findIndex((part) => part === "Documents"); const listParts = documentsIndex === -1 ? pathParts.slice(0, Math.min(pathParts.length, 3)) : pathParts.slice(0, documentsIndex + 1); return { cid, listUrl: `/${listParts.join("/")}`, rootFolder: folderId }; } function parseFolderPartsForRequest(folderId) { try { return parseFolderParts(folderId); } catch { throw new Error( "Unsupported OneDrive folder URL. Open a personal OneDrive folder and try again." ); } } function buildListEndpoint(cid) { return `${ONEDRIVE_ORIGIN}/personal/${encodeURIComponent( cid )}/_api/web/GetListUsingPath(DecodedUrl=@a1)/RenderListDataAsStream`; } function buildFirstPageUrl({ cid, listUrl, rootFolder }, viewId) { const query = [ `@a1=${encodeURIComponent(`'${listUrl}'`)}`, `RootFolder=${encodeURIComponent(rootFolder)}`, ...viewId ? [`View=${viewId}`] : [], "SortField=LinkFilename", "SortDir=Asc", "TryNewExperienceSingle=TRUE" ].join("&"); return `${buildListEndpoint(cid)}?${query}`; } function buildPagedUrl({ cid, listUrl }, cursor) { const queryPrefix = `@a1=${encodeURIComponent(`'${listUrl}'`)}&TryNewExperienceSingle=TRUE&`; const normalizedCursor = cursor.startsWith("?") ? cursor.slice(1) : cursor; return `${buildListEndpoint(cid)}?${queryPrefix}${normalizedCursor}`; } function buildRequestBody(renderOptions, viewXml) { return JSON.stringify({ parameters: { __metadata: { type: "SP.RenderListDataParameters" }, RenderOptions: renderOptions, ...viewXml ? { ViewXml: viewXml } : {}, AddRequiredFields: true, AllowMultipleValueFilterForTaxonomyFields: true, RequireFolderColoringFields: true } }); } function requestJson(url, body, listUrl) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.withCredentials = true; xhr.setRequestHeader("accept", "application/json;odata=verbose"); xhr.setRequestHeader("content-type", "application/json;odata=verbose"); xhr.setRequestHeader("application", "onedrive web consumer"); xhr.setRequestHeader("authorization", "Bearer"); xhr.setRequestHeader("scenario", "ViewList"); xhr.setRequestHeader("scenariotype", "AUO"); if (listUrl) { xhr.setRequestHeader( "x-sp-requestresources", `listUrl=${encodeURIComponent(listUrl)}` ); } xhr.onload = () => { if (xhr.status < 200 || xhr.status >= 300) { reject(new Error(`OneDrive request failed with status ${xhr.status}`)); return; } try { resolve(JSON.parse(xhr.responseText)); } catch (error) { reject(error); } }; xhr.onerror = () => reject(new Error("Network error while requesting OneDrive data")); xhr.send(body); }); } function hasOneDriveAuthCookie() { return /(?:^|;\s*)(?:MUID|OIDCAuth_[^=]+)=/.test(document.cookie); } class OneDriveProvider { activeCid = null; driveApiBaseByCid = new Map(); error = null; listViewXmlByFolderId = new Map(); viewIdByFolderId = new Map(); metadataLoadedByCid = new Set(); ownerEmailByCid = new Map(); ready = false; getFolderIdFromUrl() { try { return decodeFolderId( new URL(window.location.href).searchParams.get("id") ); } catch { return null; } } getResourceFromUrl() { const folderId = this.getFolderIdFromUrl(); return folderId ? { id: folderId, kind: "folder" } : null; } getAuthUser() { return this.getFolderIdFromUrl()?.match(/^\/personal\/([^/]+)/)?.[1] ?? "onedrive"; } getImageUrl(image) { const driveApiBase = this.getDriveApiBase(); if (!driveApiBase || !image.width && !image.height) { return this.getContentUrl(image.id); } const max = 2560; let width = image.width ?? 0; let height = image.height ?? 0; if (width > max || height > max) { if (width >= height) { height = Math.round(height / width * max); width = max; } else { width = Math.round(width / height * max); height = max; } } const thumbnailWidth = width || max; const thumbnailHeight = height || max; return `${driveApiBase}/items/${encodeURIComponent( image.id )}/thumbnails/0/c${thumbnailWidth}x${thumbnailHeight}/content`; } buildFetchUrl(image) { const driveApiBase = this.getDriveApiBase(); if (!driveApiBase) { return this.getContentUrl(image.id); } const width = image.width ?? 0; const height = image.height ?? 0; const max = 2560; if (!width || !height || width > max || height > max) { return this.getContentUrl(image.id); } return `${driveApiBase}/items/${encodeURIComponent( image.id )}/thumbnails/0/c${width}x${height}/content`; } getCurrentCid() { const folderId = this.getFolderIdFromUrl(); if (!folderId) { return this.activeCid; } try { return parseFolderParts(folderId).cid; } catch { return this.activeCid; } } getDriveApiBase() { const cid = this.getCurrentCid(); return cid ? this.driveApiBaseByCid.get(cid) ?? null : null; } getContentUrl(id) { const driveApiBase = this.getDriveApiBase(); if (!driveApiBase) { return ""; } return `${driveApiBase}/items/${encodeURIComponent(id)}/content`; } getThumbnailUrl(imageId) { const driveApiBase = this.getDriveApiBase(); if (!driveApiBase) { return null; } return `${driveApiBase}/items/${encodeURIComponent( imageId )}/thumbnails/0/c220x220/content`; } async initialize() { if (hasOneDriveAuthCookie()) { this.error = null; this.ready = true; return; } this.ready = false; this.error = new Error("Not logged in to OneDrive"); throw this.error; } isReady() { return this.ready; } getInitError() { return this.error; } async fetchFolderPage(folderId, cursor) { if (!this.isReady()) { await this.initialize(); } const folderParts = parseFolderPartsForRequest(folderId); this.activeCid = folderParts.cid; const rawResponse = await requestJson( cursor ? buildPagedUrl(folderParts, cursor) : buildFirstPageUrl( folderParts, this.viewIdByFolderId.get(folderParts.rootFolder) ), buildRequestBody( cursor ? PAGED_RENDER_OPTIONS : FIRST_PAGE_RENDER_OPTIONS, this.listViewXmlByFolderId.get(folderParts.rootFolder) ), folderParts.listUrl ); const response = unwrapListResponse(rawResponse); this.updateFolderMetadata(folderParts, response); return [ toFolderPageResult(getRows(response), folderId), getNextHref(response) ]; } async fetchPdfImages(_pdfId) { throw new Error("PDF reader is not supported for OneDrive yet"); } updateFolderMetadata(folderParts, response) { const schema = getListSchema(response); const rows = getRows(response); const driveApiBase = schema?.[".driveUrl"]?.replace(/\/+$/, "") ?? getDriveApiBaseFromRows(rows)?.replace(/\/+$/, "") ?? null; if (driveApiBase) { this.driveApiBaseByCid.set(folderParts.cid, driveApiBase); } if (schema?.ViewMetadata?.ListViewXml) { this.listViewXmlByFolderId.set( folderParts.rootFolder, schema.ViewMetadata.ListViewXml ); } if (schema?.ViewMetadata?.Id) { this.viewIdByFolderId.set(folderParts.rootFolder, schema.ViewMetadata.Id); } const ownerEmail = schema?.userEmail ?? schema?.PageContextInfo?.userEmail; if (ownerEmail) { this.ownerEmailByCid.set(folderParts.cid, ownerEmail); } this.metadataLoadedByCid.add(folderParts.cid); } async fetchFolderDetails(folderId) { if (!this.isReady()) { await this.initialize(); } const folderParts = parseFolderPartsForRequest(folderId); this.activeCid = folderParts.cid; if (!this.metadataLoadedByCid.has(folderParts.cid)) { const rawResponse = await requestJson( buildFirstPageUrl( folderParts, this.viewIdByFolderId.get(folderParts.rootFolder) ), buildRequestBody( FIRST_PAGE_RENDER_OPTIONS, this.listViewXmlByFolderId.get(folderParts.rootFolder) ), folderParts.listUrl ); this.updateFolderMetadata(folderParts, unwrapListResponse(rawResponse)); } const rootFolder = folderParts.rootFolder; const title = decodeURIComponent(rootFolder.split("/").pop() ?? ""); return { ownerEmail: this.ownerEmailByCid.get(folderParts.cid) ?? "Unknown", thumbnailUrl: null, title: title || "OneDrive Folder" }; } } const shadowStyles = ':host{all:initial;background:transparent;color:var(--textCol, #ddd);font-family:Open Sans,sans-serif;position:relative;z-index:2147483647}:host,:host *{box-sizing:border-box}.truyendrive-portal{background:var(--readerBg);color:var(--textCol);font-family:Open Sans,sans-serif;inset:0;line-height:1.3;position:fixed;z-index:2147483647;width:100vw;height:100vh;height:100dvh;overflow:auto}.truyendrive-portal,.truyendrive-portal a,.truyendrive-portal input,.truyendrive-portal label,.truyendrive-portal option,.truyendrive-portal select,.truyendrive-portal textarea{color:inherit}.truyendrive-launcher{align-items:center;background-color:#000;border:1px solid #f00c;border-radius:.2em;bottom:20px;right:80px;color:#ddd;cursor:pointer;display:inline-flex;font:600 .9rem/1 Open Sans,sans-serif;padding:0;position:fixed;z-index:2147483647;transition:all .2s ease}@media(max-width:768px){.truyendrive-launcher{right:20px}}.truyendrive-launcher .launcher-icon{border-right:1px solid #f00c;padding:.6em .8em}.truyendrive-launcher .launcher-text{padding:.6em 1em}.truyendrive-launcher:hover{background-color:#1a1a1a;transform:translateY(-1px)}.reader-close-button{align-items:center;align-self:center;background:transparent;border:1px solid rgba(255,255,255,.16);border-radius:999px;color:var(--textCol);cursor:pointer;display:inline-flex;font:600 .72rem/1 Open Sans,sans-serif;height:auto;margin-right:.8rem;padding:.45rem .8rem;text-transform:uppercase}.reader-close-button:hover{border-color:var(--accentCol);color:var(--accentCol)}.direction-ltr .rdr-image-wrap,.direction-rtl .rdr-image-wrap{overflow-x:auto;overflow-y:hidden;scroll-behavior:smooth;scroll-snap-type:x mandatory}.direction-ltr .rdr-image-wrap .ReaderImageWrapper,.direction-rtl .rdr-image-wrap .ReaderImageWrapper{overflow-y:auto;scroll-snap-align:start}.direction-ttb .rdr-image-wrap{scroll-behavior:smooth}.rdr-page-selector-keys div,.rdr-previews-gallery img,.header,.hide-side-actual,.rdr-groups div{cursor:pointer}.reader-settings-content{display:flex;flex:1;flex-direction:column;max-width:30rem;min-width:20rem;padding-bottom:0}.reader-settings-content header{align-items:center;display:flex;justify-content:space-between}.reader-settings-scroller{overflow-y:auto;padding-bottom:1.5rem}.reader-settings-close{cursor:pointer}.reader-settings-close:before{content:"✕";font-family:Open Sans,sans-serif!important;font-size:.95rem;font-weight:700}.reader-select-wrap{display:flex}.reader-select{appearance:none;background:var(--blackLight);border:1px solid var(--borderColor);border-radius:4px;color:var(--textCol);font:500 .82rem/1.2 Open Sans,sans-serif;min-width:14rem;padding:.65rem .8rem;width:100%}.reader-reset-row{display:flex;justify-content:center;padding:1rem 1rem 1.5rem}.reader-select:focus-visible,.ColorPicker:focus-visible,.ResetButton:focus-visible,.truyendrive-launcher:focus-visible,.reader-close-button:focus-visible{outline:2px solid var(--accentCol);outline-offset:2px}.preload-entity{display:none}'; const fontStyles = '@font-face{font-family:guya;src:url(data:font/woff;base64,d09GRgABAAAAACYMAAsAAAAAJcAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgEocGoGNtYXAAAAFoAAAAhAAAAIS+xUKjZ2FzcAAAAewAAAAIAAAACAAAABBnbHlmAAAB9AAAIGwAACBsczFptmhlYWQAACJgAAAANgAAADYcc/5raGhlYQAAIpgAAAAkAAAAJAgLBFFobXR4AAAivAAAARwAAAEcEkkhD2xvY2EAACPYAAAAkAAAAJD2fP5YbWF4cAAAJGgAAAAgAAAAIABOAKFuYW1lAAAkiAAAAWIAAAFijGLp6nBvc3QAACXsAAAAIAAAACAAAwAAAAMD+gGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAACAAAAAAAAAAAAAAAAAAQAAA6XwDwP/AAEADwABAAAAAAQAAAAAAAANVAAAAIAAAAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEAGgAAAAWABAAAwAGAAEAIABIAFcAaAB3K6DpPOl8//3//wAAAAAAIABIAFcAaAB3K6DpAOl8//3//wAB/+P/vP+u/57/kNRoFwkWygADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAwCrAAADVQNVAAkADgATAAABETMHJzMRIzcXASEVITURIRUhNQIrgKurgICrq/4AAqr9VgKq/VYCK/8Aq6sBAKqqASpVVf0AVVUAAAMAVQBVA6sDAAAKAA4AEgAAASE1Fwc1IRUnNxUBETMRIREzEQGAAQCrq/8Aq6v+1VYCqlYB1YCqq4CAq6qA/oACq/1VAqv9VQAAAAABARf/1QLpA4AADQAAJQcnNxcRByc3FwcnETcC6enpPYGBPenpPYGBvunpPIECZII86ek8gv2cgQAAAAABACsAwgPVApMADgAAJSc3FwchJzcXByc3IRcHARPo6DyBAmSBPOjoPIH9nIE8wunoPIKCPOjpPIKCPAABAFUAqwOAAqsACwAAARUhNycJATcnIREjAyv9zpg8/wABADyYAodVAoCrmjz/AP8APJkBAAAAAAEAXAAHA6QDTwAgAAABMyc3FwcnNyMVNxcHJzcXNSMXByc3FwczNQcnNxcHJxUCK9VAPaenPUDVQDynpzxA1UA9p6c9QNVAPKenPEAB1UA9p6g9QNVAPaenPUDVQD2opz1A1kA8qKg8QNYAAAMAVQBVA6sDAAAPABMAGQAAATQmIyEiBhURFBYzITI2NQMFJSERIREFJREDqzIk/VYkMjIkAqokMlb+q/6rAqr9VgFVAVUCqyMyMiP+ACQyMiQCANbW/gABqtXV/lYAAAEBAAEBAwACPQAFAAABFzcXCQEBPMTEPP8A/wACPcTEPP8AAQAAAAAEAFUADAOrA2IAAwAfAEAARQAAATM1IxMiJy4BJyY1NDc+ATc2MzIXHgEXFhUUBw4BBwYDIgcOAQcGFTEUFx4BFxYzMTI3PgE3NjUxNCcuAScmIzEDMxEjEQHVVlYrRz4+XRobGxpdPj5HRz4+XRobGxpdPj5HWE5OdCEiIiF0Tk5YWE5OdCEiIiF0Tk5YK1ZWAjdV/dYaG10+PkdGPz5cGxsbG1w+P0ZHPj5dGxoDACIic05OWFlNTnQhIiIhdE5NWVhOTnMiIv2AAQD/AAAABACaAKsDMwKrAAUACQANABMAABMVMxEzERMVMzUnFTM1NxUzETMRmmZmZ2ZmZjNnZgKrZ/5nAgD+mWZmzWZmmmf+ZwIAAAAAAQEAAAADAAJVAAsAACURMzUhFTMRBxUhNQKrKv5WKlUCAKsBVVVV/qtWVVUAAAAAAgEAAAADAANVABAAFgAAAREzNSEVMxEHFTMRMxEzNScFNxEzERcCqyr+VipV3kTeVf7MNKo0AasBVVVV/qtWVf8AAQBVVlY0AXf+iTQAAAABANYAgQMqAtUACwAAAQcXBycHJzcnNxc3Ayru7jzu7jzu7jzu7gKZ7u487u487u487u4AAwArAHcD1QL3AA8ALwBLAAABIgYVMRQWMzEyNjUxNCYjESInLgEnJjUxNDc+ATc2MzEyFx4BFxYVMRQHDgEHBiMRIgcOAQcGBxYXHgEXFjMyNz4BNzY3JicuAScmAgA1S0s1NUtLNSwnJzoREBAROicnLCwnJzoREBAROicnLFBJSXovLxsbLy96SUlQUElJei8vGxsvL3pJSQI3SzU1S0s1NUv+qxAROicnLCwnJzoQEREQOicnLCwnJzoREAIVGBdVOztGRjs7VRcYGBdVOztGRjs7VRcYAAAAAAEBVgCrApICqwAFAAAlBwkBFwcCkjz/AAEAPMTnPAEAAQA8xAAAAAABAW4AqwKqAqsABQAAJTcnNwkBAW7ExDwBAP8A58TEPP8A/wAAAAAAAQEAARkDAAJVAAUAAAEnCQEHJwE8PAEAAQA8xAEZPAEA/wA8xAAAAAIAKgCrA6oCqwADAAwAAAEzESMBNwkBJzchNSEDVlRU/pg8AQD/ADya/aICXgKr/gABxDz/AP8APJpUAAQAKv/VA9YDgQADABcAHQAnAAAlESERATIXFhURFAcGIyEiJyY1ETQ3NjMBESM1MxEBESEVISInJjURA4D9qgJWIhoaGhoi/aoiGRkZGSIBLFaq/dYCqv1WIhoa1QJW/aoCrBoaIv2qIhkZGRkiAlYiGhr9qgFWVP5WAar9VlYaGiICqgAAAAAEACr/1QPWA4EAFwAbAC8AOQAAARUhNTQ3NjsBNSM1MzIXFh0BFAcGKwEVBREhEQEyFxYVERQHBiMhIicmNRE0NzYzBxEhFSEiJyY1EQLW/wAYGCRWqqokGRkZGSRWAVb9qgJWIhoaGhoi/aoiGRkZGSKqAqr9ViIaGgGBVqokGRlWVBgYJFYkGRlUrAJW/aoCrBoaIv2qIhkZGRkiAlYiGhqs/VZWGhoiAqoABAAq/9UD1gOBABwAJgAqAD4AAAEUBwYrATUzNSM1MzUjNTMyFxYdARQHBiMyFxYVAREhFSEiJyY1EQERIREBMhcWFREUBwYjISInJjURNDc2MwLWGRkkqqpWVqqqJBkZExMaGhMT/aoCqv1WIhoaA1b9qgJWIhoaGhoi/aoiGRkZGSIBgSQZGVZUVlZUGBgkQBoTExMTGgEU/VZWGhoiAqr+AAJW/aoCrBoaIv2qIhkZGRkiAlYiGhoAAAAEANYAgQMqAtUABQALABEAFwAAATMVIzUjEzUzFSM1ATUzFSMVHQEzFSM1AlbUVICAVNT+gNSAgNQC1dSA/lSA1FQBLNRUgKyAVNQAAgE8ACsCxAMrAAUACwAAJTcXByc3EwcnNxcHAgCIPMTEPIiIPMTEPKOIPMTEPAGIiDzExDwAAAACAIAAKwOAAysABQAZAAAlAScBJwcBMhcWFREUBwYjISInJjURNDc2MwGqAYA8/ryYPAJUJBkZGRkk/awkGRkZGSTVAYA+/ryYPAGAGRkk/awkGRkZGSQCVCQZGQAAAAACAIAAKwOAAysAEwAXAAABMhcWFREUBwYjISInJjURNDc2MwUhESEDKiIaGhoaIv2sIhoaGhoiAlT9rAJUAysaGiL9rCIaGhoaIgJUIhoaVv2sAAAEACr/1QPWA4EAAwAXACEAKwAAJREhEQEyFxYVERQHBiMhIicmNRE0NzYzATUjETMVMzUzEQERIRUhIicmNREDgP2qAlYiGhoaGiL9qiIZGRkZIgFWqlRWVv2qAqr9ViIaGtUCVv2qAqwaGiL9qiIZGRkZIgJWIhoa/aqqAQCqqv5WAar9VlYaGiICqgAAAAAEACr/1QPWA4EAEwAdACEANQAAARQHBisBNTM1IxEhFSMVMzIXFhUBESEVISInJjURAREhEQEyFxYVERQHBiMhIicmNRE0NzYzAtYZGSSqqqoBAKxWJBkZ/aoCqv1WIhoaA1b9qgJWIhoaGhoi/aoiGRkZGSIBgSQZGVZUAQBUVhkZJAEA/VZWGhoiAqr+AAJW/aoCrBoaIv2qIhkZGRkiAlYiGhoAAAAFACr/1QPWA4EAAwAbAB8AMwA9AAABFTM1ByInJjURNDc2OwEVIxUzMhcWHQEUBwYjBREhEQEyFxYVERQHBiMhIicmNRE0NzYzBxEhFSEiJyY1EQIqVlYkGBgYGCSsrFYkGRkZGSQBAP2qAlYiGhoaGiL9qiIZGRkZIqoCqv1WIhoaAdVUVKoZGSQBACQYGFRWGRkkVCQZGVYCVv2qAqwaGiL9qiIZGRkZIgJWIhoarP1WVhoaIgKqAAAAAAQAKv/VA9YDgQAGAAoAHgAoAAABIxMjNSEVExEhEQEyFxYVERQHBiMhIicmNRE0NzYzBxEhFSEiJyY1EQIqVKqqAQCq/aoCViIaGhoaIv2qIhkZGRkiqgKq/VYiGhoBKwFWVFT+VAJW/aoCrBoaIv2qIhkZGRkiAlYiGhqs/VZWGhoiAqoAAAAGACr/1QPWA4EAAwAHAC0AMQBFAE8AAAEVMzUnFTM1AyInJj0BNDc2MyInJj0BNDc2OwEyFxYdARQHBiMyFxYdARQHBiMFESERATIXFhURFAcGIyEiJyY1ETQ3NjMHESEVISInJjURAipWVlZWJBgYExMaGhMTGBgkViQZGRMTGhoTExkZJAEA/aoCViIaGhoaIv2qIhkZGRkiqgKq/VYiGhoB1VRUrFZW/qoZGSRAGhMTExMaQCQYGBgYJEAaExMTExpAJBkZVgJW/aoCrBoaIv2qIhkZGRkiAlYiGhqs/VZWGhoiAqoABQAq/9UD1gOBAAMAGwAfADMAPQAAATUjFTcyFxYVERQHBisBNTM1IyInJj0BNDc2MwERIREBMhcWFREUBwYjISInJjURNDc2MwcRIRUhIicmNRECgFZWJBkZGRkkqqpWJBgYGBgkAVb9qgJWIhoaGhoi/aoiGRkZGSKqAqr9ViIaGgIrVlaqGBgk/wAkGRlWVBkZJFYkGBj+AAJW/aoCrBoaIv2qIhkZGRkiAlYiGhqs/VZWGhoiAqoAAAAFACr/1QPWA4EADwAjACcAPwBJAAABESERIREjFSM1IzUzNTMVEzIXFhURFAcGIyEiJyY1ETQ3NjMTMzUjFxQHBisBNTM1IyInJj0BNDc2OwEyFxYVJREhFSEiJyY1EQOA/aoCVlZUVlZUViIaGhoaIv2qIhkZGRkirCoqgBkZJICAKiQZGRkZJCokGRn+KgKq/VYiGhoCKwEA/aoBAFRUVlZWAVYaGiL9qiIZGRkZIgJWIhoa/qoqqiQZGVYqGRkkKiQZGRkZJID9VlYaGiICqgAAAAMAVgABA6oDVQAEABgAIgAAAREjETcTMhcWFREUBwYjISInJjURNDc2MwcRIRUhIicmNREDVtZqbCIZGRkZIv4AIhoaGhoirAJW/aoiGRkBqwFW/qpAAWoZGSL+ACIaGhoaIgIAIhkZqv2qVBkZIgJWAAAAAgBWAKsDqgKrAAUACwAAJTcnNwkBJQcJARcHAm7GxjwBAP8A/ug8/wABADzG58TEPP8A/wA8PAEAAQA8xAAAAAQAVgABA6oDVQADAAcACwAcAAABNSEVATUhFTUVITUTMhcWFREUBwYjIQcRNDc2MwMA/gABVv6qAgBWIhkZGRki/aqqGRkiAlVWVv8AVlbWVlYBKhkZIv4AIhoaqgMAIhkZAAADAFYA1QOqAoEAFQAZAC8AAAEyFxYVFAcGKwE1MzI3NjU0JyYrATUDNSEVJRQXFjsBFSMiJyY1NDc2OwEVIyIHBgLWWD4+Pj5YrKw2JycnJzas1AFU/fwnJzasrFg+Pj4+WKysNicnAoE/P1hYPz9SJyc2NicnUv8AVFQqNicnUj8/WFg/P1InJwAAAAIAgAArA4ADKwAIAB4AAAEhESM1AScBIxMRMxEUBwYjISInJjURNDc2MyEVIRECVgEqVv5ePAGimNRWGhoi/awkGRkZGSQBKv7WAyv+1pj+XjwBov2sASr+1iIaGhkZJAJUJBkZVv2sAAAAAAMAgP/VA4ADgAAgACMAPgAAASEiBgcOARURFBYXHgEzITI2Nz4BNRE0JicBLgEnLgEjEyM1JxEUFjMhERQGBw4BIyEiJicuATURNDY3PgEzAiv+1RovERIUFBIRLxoCABovERIUBwb+1gMHBAQIBMOZVRkSAQAHBgYPCf4ACQ8GBgcHBgYPCQOAFBIRLxr9VRovEREVFBIRLxoB1ggQBgEqBAQCAQL+1Zk9/wASGf5VCBAGBgYGBgYQCAKrCQ8GBgcAAAAEAIAAKwOAAysACQATAB0AJwAAATIXFh0BIzUjNRM1MxUUBwYrATUlFTMVIyInJj0BETQ3NjsBFSMVIwMqIhoaVqqqVhoaIqr+VqqqIhoaGhoiqqpWAysaGiKqqlb9VqqqIhoaVqqqVhoaIqoBqiIaGlaqAAMAgAArA4ADKwAEAAgAHAAAARchNxcFESERATIXFhURFAcGIyEiJyY1ETQ3NjMCVJb+LHRUAUz9rAJUIhoaGhoi/awiGhoaGiIBn8qYZoYCVP2sAqoaGiL9rCIaGhoaIgJUIhoaAAAABACAACsDgAMrAAYADQAUABsAAAERITcnNxcFIREXNxcHAxEhBxcHJyUhEScHJzcDgP8AYnw+ev5i/wBiej58ngEAYnw+egGeAQBiej58ASv/AGJ6PnyeAQBifD56AZ4BAGJ6Pnye/wBifD56AAAAAAQA1gCBAyoC1QAFAAsAEQAXAAABMxUjNTMDNTMVIxUBNTMVIzURNTMVIzUCqoDUVFTUgP6sVNTUVAJVVNT9rNRUgAHUgNRU/qxU1IAAAAAAAwCAAKsDgAKrAAMABwALAAATIRUhFTUhFQU1IRWAAwD9AAMA/QADAAKrVtRUVNZWVgAAAAMAqgFVA1YCAQAPAB8ALwAAATIXFhUUBwYjIicmNTQ3NiEyFxYVFAcGIyInJjU0NzYhMhcWFRQHBiMiJyY1NDc2AgAiGhoaGiIiGhoaGgEiIhoaGhoiIhoaGhr+IiIaGhoaIiIaGhoaAgEaGiIiGhoaGiIiGhoaGiIiGhoaGiIiGhoaGiIiGhoaGiIiGhoAAAMBqgBVAlYDAQAPAB8ALwAAATIXFhUUBwYjIicmNTQ3NhMyFxYVFAcGIyInJjU0NzY3IicmNTQ3NjMyFxYVFAcGAgAiGhoaGiIiGhoaGiIiGhoaGiIiGhoaGiIiGhoaGiIiGhoaGgEBGhoiIhoaGhoiIhoaAQAaGiIiGhoaGiIiGhpUGhoiIhoaGhoiIhoaAAIAgABBA2oDKwAPACgAAAEyNzY1NCcmIyIHBhUUFxYhFwcnNScGIyInJjU0NzYzMhcWFRQHBgcXAZZQODg4OFBQODg4OAFQ1EDUDExodFFRUVF0dFBQFBQaDAFVODhQUDg4ODhQUDg41EDUIgxCUFB0dFFRUVF0KjU1IAwAAAAAAgBkAAEDnANVAA8ASQAAATI3NjU0JyYjIgcGFRQXFiUXFg8BBi8BBg8BBisBIi8BJicHBi8BJj8BJjU0NycmPwE2HwE2PwE2OwEyHwEWFzc2HwEWDwEWFRQCAD4sLCwsPj4sLCwsAXxaDgpWCBJqKh4QBBCsEAQQJiJqEghWCg5aAgJaDgpWCBJqKh4QBBCsEAQQJiJqEghWCg5aAgEVLCw+PiwsLCw+PiwsbEYKEpQOBioeDHASEnAQGioGDpQSCkYOHBwORgoSlA4GKh4McBIScBAaKgYOlBIKRg4cHAACACoAFQPWAusACQApAAAlESYjIgcRNjMyAzIXERQHBiMiJyYjIgcmIyIHIgcGIyInJjURNjMyFzYDgEJUgmhogk5OmFQHBwgGBFJ6gmhWlGxgAgMDAggHB1aWlFZWlQHsFED+FkACQED9kggHBwIsQEAuAQEGBggCckBAQAAAAAIAqgABA1YDVQACABMAAAEzJyUhAREUBwYjISInJjUTNDc2Airs7P7WAVYBABoaIv4AIhoaAhkZAivqQP8A/gAiGRkZGSICrCIZGQAEAKsAAANVA1UAEQAYAB0ALQAACQERFAYjMSEiJjUxETQ2MzEhExEjNSERIQMRITcXJxQGIzEiJjUxNDYzMTIWFQJVAQAyI/4AIzIyIwFVq9X+1QIAK/5W1VWqJhobJSUbGiYDVf8A/gAjMjIjAqsjMv0AAdbV/VUBK/8A1VXrGyUlGxomJhoAAgArAAAD1QNVAAQAMQAAAQcRNxEFIgYHERQWMzI2Mz4BMzIWFz4BMzIWFxYyMzI2NREuAScRLgEjIgYHES4BIzEDK9bW/eo+fi4NCAMEBCtxLj9+LiuJNzRqLAQEAwgNEyoYI0wmN4krLn4/A1XA/ivAAdWAHCT9jwgNAhUaHSMbJRUYAg4IAm4PFAj9wAsKJBwCQCQcAAADAIAAQQNqAysACwAbADQAAAEjFSM1IzUzNTMVMwcyNzY1NCcmIyIHBhUUFxYhFwcnNScGIyInJjU0NzYzMhcWFRQHBgcXAgBWKlZWKlZqUDg4ODhQUDg4ODgBUNRA1AxMaHRRUVFRdHRQUBQUGgwCAVZWKlZW1jg4UFA4ODg4UFA4ONRA1CIMQlBQdHRRUVFRdCo1NSAMAAUARv/xA7oDZQADAAcACwAbAB8AAAEHIScDBxcRIRE3JwciBhUxFBYzMTI2NTE0JiMDFzchAgC6AXS66dHRAdLR0eknNjYnJzY2J7q6uv6MA2XS0v8AuroBdP6MurpdNyYnNjYnJjf+utHRAAMAgABBA2oDKwADABMALAAAATMVIxcyNzY1NCcmIyIHBhUUFxYhFwcnNScGIyInJjU0NzYzMhcWFRQHBgcXASrW1mxQODg4OFBQODg4OAFQ1EDUDExodFFRUVF0dFBQFBQaDAIrKqw4OFBQODg4OFBQODjUQNQiDEJQUHR0UVFRUXQqNTUgDAAEAAAAAARJA24ACwASACMAMwAAARQGIyImNTQ2MzIWAREhNTcXASUhIgYVERQWMyEyNjURNCYjFxEUBiMhIiY1ETQ2MyEyFgFuQS0tQUEtLUECSfzbt1wBJAEl/G0HCwsHA5MHCwsHWzYl/G0lNjYlA5MlNgJuLkBALi1AQP73/wBut1wBJaULCP1JBwsLBwK3CAsT/UklNjYlArcmNjYAAwAA/94D7wPNAB8APgBDAAAlDgEjIicuAScmNTQ3PgE3NjMyFx4BFxYVFAYHNwEHAScyNz4BNzY1NCcuAScmIzEiBw4BBwYVFBceARcWMzEDIRUhNQKUM4BIVUpLbyAgICBvS0pVVUtKbyEgLikBARJJ/u/7Pzg4VBgYGBhUODg/QDg4UxgZGRhTODhAmgEz/s3wKS4hIG9LSlVVS0pvICEhIG9KS1VHgTQB/u9JARIQGBhUODg/QDg4UxgYGBhTODhAPzg4VBgYAWZmZgAAAAMAAP/eA+8DzQAfAD4ASgAAJQ4BIyInLgEnJjU0Nz4BNzYzMhceARcWFRQGBzcBBwEnMjc+ATc2NTQnLgEnJiMxIgcOAQcGFRQXHgEXFjMxAzUzFTMVIxUjNSM1ApQzgEhVSktvICAgIG9LSlVVS0pvISAuKQEBEkn+7/s/ODhUGBgYGFQ4OD9AODhTGBkZGFM4OEA0Z2ZmZ2bwKS4hIG9LSlVVS0pvICEhIG9KS1VHgTQB/u9JARIQGBhUODg/QDg4UxgYGBhTODhAPzg4VBgYAWZnZ2ZmZmYAAAAEAGT/4gPHA2IACwBRAF8AngAAJTI2NTQmIyIGFRQWJRceAQ8BDgEvAQ4BDwEOASsBIiYvAS4BJwcGJi8BJjY/ASc3Jy4BPwE+AR8BPgE/AT4BOwEyFh8BHgEXNzYWHwEWBg8BFwEyNjU0JiMiBhUxFBYzNxceAQ8BDgEvAQ8BFAYrASImLwIHBiYvASY2PwEnNycuAT8BPgEfAT8BPgE7ATIWFR8BNzYWHwEWBg8BFwcCpiw9PSwrPT0BCT8FAgM8AwoFSgwZDgsBCAZ3BggBCw4ZDEoFCwI8AwIEQAMDQAQCAzwCCwVKDBkOCwEIBncGCAELDhkMSgUKAzwDAgU/Av2XHCcnHBsoKBuPKQMBAicBBwMwIAgGA00EBQEHIDEDBgImAgEDKQICKQMBAiYCBgMxIAcBBQRNAwYIIDADBwEnAgEDKQEBpD0rKz4+Kys9SzEECgZnBQMCHgkPBk8FBwcFTwYPCR4CAwVnBgoEMR0eMQMLBWcFBAIeCQ8FTwYHBwZPBQ8JHgIEBWcFCwMxHgFTJxwbKCgbHCcwIAIHA0MDAgETEzIEBAQEMhMTAQIDQwMHAiATEiACBwNDAwIBExMyBAUFBDITEwECA0MDBwIgEhMAAAAABACAADcDgAM3AAQACAAMABgAAAERIREhASERIRkBIRETMzUzFTMVIxUjNSMCKwFV/qv+VQFV/qsBVVaAVYCAVYADN/6rAVX9AAFVAav+qwFV/dWAgFWAgAAAAAADAFUAjAOrAwwAAwAHAAsAAAERMxEBMxEjEyERIQMAq/yqq6vWAar+VgK3/isB1f4rAdX91QKAAAUAgAA3A4ADNwAPAB8ALwA/AG0AAAEiJjUxNDYzMTIWFTEUBiMnIiY1MTQ2MzEyFhUxFAYjIyImNTE0NjMxMhYVMRQGIwciJjUxNDYzMTIWFTEUBiMTIgcOAQcGFTEUFx4BFxYzMTI2NTE0JicuATU0NjMxMzI3PgE3NjUxNCcuAScmAusbJSUbGiYmGoAbJSUbGiYmGtYaJiYaGyUlG4AaJiYaGyUlG+tQRUZpHh4eHmlGRVAbJQkIBwkmGkwsJyc5EREeHmlGRQG3JRsaJiYaGyWrJRsaJiYaGyUlGxomJhobJaslGxomJhobJQGAHh5pRkZPUEZGaB4eJRsMFgkIFgwbJREROiYnLUY+P1wbGwAAAAIA1QBiAysDNwADAAsAADchNSEBIxEhESMJAdUCVv2qAlar/wCrASsBK2JVAYABAP8A/tUBKwAAAQCVAJUDgALRAAYAAAkBJzcXARcDgP4A6zyvAcQ8ApX+AOs8rgHDPAAAAAACAAAAAAQAA6EABQAOAAAJAjUJAQcRIREhESERAQQA/gD+AAIAAgCA/wD/AP8AAYABcgGN/nOiAY3+c5T+gAEA/wABgAEgAAABAQAADAMAA2IAEAAAAREzNSEVMxEHFTMRMxEzNScCqyr+VipV3kTeVQG3AVVWVv6rVVb/AAEAVlUAAAACAFUADANVA2IADAAYAAATNwEHJxUjESM1NzUBARcVIwE1IzUhFSMRVTcCyTb9RN5V/wACVlUI/l0qAaoqAtY2/Tc3/f0BAFZVHwEA/uFVVgGjXVZW/qsAAQBlACUDmwMvAEQAACUiJy4BJyYnJicuAScmNTQ2Nz4BNxcOAQcOARUUFx4BFxYzMjc+ATc2NTQmJy4BJzceARceARUUBw4BBwYHBgcOAQcGIwIAKSgnSiIhHR0XFh8ICCAfHlQyIylEGBoaGxpaPT1FRT09WhobGhoYRCkjMlQeHyAICB8WFx0dISJKJygpJQgIHxYXHR0hIkonKCk6cDEvTBlFFD4mKFsvRT09WhobGxpaPT1FL1soJj4URRlMLzFwOikoJ0oiIR0dFxYfCAgAAAABAAAAAQAAQUeXyV8PPPUACwQAAAAAANyF3OYAAAAA3IXc5gAA/9UESQPNAAAACAACAAAAAAAAAAEAAAPA/8AAAARJAAAAAARJAAEAAAAAAAAAAAAAAAAAAABHBAAAAAAAAAAAAAAAAgAAAAQAAKsEAABVBAABFwQAACsEAABVBAAAXAQAAFUEAAEABAAAVQQAAJoEAAEABAABAAQAANYEAAArBAABVgQAAW4EAAEABAAAKgQAACoEAAAqBAAAKgQAANYEAAE8BAAAgAQAAIAEAAAqBAAAKgQAACoEAAAqBAAAKgQAACoEAAAqBAAAVgQAAFYEAABWBAAAVgQAAIAEAACABAAAgAQAAIAEAACABAAA1gQAAIAEAACqBAABqgQAAIAEAABkBAAAKgQAAKoEAACrBAAAKwQAAIAEAABGBAAAgARJAAAEAAAABAAAAAQAAGQEAACABAAAVQQAAIAEAADVBAAAlQQAAAAEAAEABAAAVQQAAGUAAAAAAAoAFAAeAEQAagCIAKYAwgD4ASgBPAGkAcgB4AIIAiICkAKkArgCzALqAy4DhAPiBAgEJARUBH4ExgUaBXgFvAYwBo4G+AcyB1IHhAfKCAAIYgicCNAJCAkwCUoJkgnaChoKigrKCvALNAuAC8wMAgxGDJYM/g1sDlgOhg6iDywPSA9eD4IPoA/MEDYAAQAAAEcAnwAGAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAQAAAABAAAAAAACAAcARQABAAAAAAADAAQALQABAAAAAAAEAAQAWgABAAAAAAAFAAsADAABAAAAAAAGAAQAOQABAAAAAAAKABoAZgADAAEECQABAAgABAADAAEECQACAA4ATAADAAEECQADAAgAMQADAAEECQAEAAgAXgADAAEECQAFABYAFwADAAEECQAGAAgAPQADAAEECQAKADQAgGd1eWEAZwB1AHkAYVZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGd1eWEAZwB1AHkAYWd1eWEAZwB1AHkAYVJlZ3VsYXIAUgBlAGcAdQBsAGEAcmd1eWEAZwB1AHkAYUZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format("woff");font-weight:400;font-style:normal}@font-face{font-family:coobaree;src:url(data:font/woff;base64,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) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:inline-icons;src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff");font-weight:400;font-style:normal}'; const globalStyle = document.createElement("style"); globalStyle.textContent = fontStyles; document.head.appendChild(globalStyle); const host = document.createElement("div"); host.id = "truyendrive-reader-host"; document.body.append(host); const shadowRoot = host.attachShadow({ mode: "open" }); const mountNode = document.createElement("div"); shadowRoot.append(mountNode); const provider = window.location.hostname === "onedrive.live.com" ? new OneDriveProvider() : new GoogleDriveProvider(); ReactDOM.createRoot(mountNode).render( jsxRuntimeExports.jsxs(React.StrictMode, { children: [ jsxRuntimeExports.jsx("style", { children: shadowStyles }), jsxRuntimeExports.jsx(ProviderProvider, { provider, children: jsxRuntimeExports.jsx(App, {}) }) ] }) ); }) }; })); System.register("./decryptWorker-DYbJWN8U-BOfDuyZ4.js", [], (function (exports, module) { 'use strict'; return { execute: (function () { exports({ decryptInWorker: decryptInWorker, xorDecryptInWorker: xorDecryptInWorker }); const WORKER_SOURCE = ( ` "use strict"; function cyrb128(str) { var h1 = 1779033703; var h2 = 3144134277; var h3 = 1013904242; var h4 = 2773480762; for (var i = 0; i < str.length; i++) { var k = str.charCodeAt(i); h1 = h2 ^ Math.imul(h1 ^ k, 597399067); h2 = h3 ^ Math.imul(h2 ^ k, 2869860233); h3 = h4 ^ Math.imul(h3 ^ k, 951274213); h4 = h1 ^ Math.imul(h4 ^ k, 2716044179); } h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067); h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233); h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213); h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179); return (h1 ^ h2 ^ h3 ^ h4) >>> 0; } function mulberry32(seed) { var a = seed; return function () { a += 0x6d2b79f5; var t = Math.imul(a ^ (a >>> 15), a | 1); t ^= t + Math.imul(t ^ (t >>> 7), t | 61); return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; } function decryptNoise(buffer, password) { var data = new Uint8Array(buffer); var len = data.length; var rand = mulberry32(cyrb128(password)); for (var i = 0; i < len; i += 4) { data[i] ^= Math.floor(rand() * 256); data[i + 1] ^= Math.floor(rand() * 256); data[i + 2] ^= Math.floor(rand() * 256); // data[i + 3] is alpha — skip } return buffer; } function decryptScanline(buffer, password, width, height) { var channels = 4; var rowByteLength = width * channels; var data = new Uint8Array(buffer); var output = new Uint8Array(data.length); var rand = mulberry32(cyrb128(password + ":" + width + "x" + height + ":" + channels + ":scanline")); for (var row = 0; row < height; row++) { var offset = width === 0 ? 0 : Math.floor(rand() * width); var reverse = rand() >= 0.5; for (var destinationColumn = 0; destinationColumn < width; destinationColumn++) { var transformedColumn = reverse ? width - 1 - destinationColumn : destinationColumn; var sourceColumn = (transformedColumn + offset) % width; var srcStart = row * rowByteLength + sourceColumn * channels; var destStart = row * rowByteLength + destinationColumn * channels; output[destStart] = data[srcStart]; output[destStart + 1] = data[srcStart + 1]; output[destStart + 2] = data[srcStart + 2]; output[destStart + 3] = data[srcStart + 3]; } } return output.buffer; } self.onmessage = function (e) { var jobId = e.data.jobId; var buffer = e.data.buffer; var password = e.data.password; var method = e.data.method || "noise"; var width = e.data.width; var height = e.data.height; var decryptedBuffer = method === "scanline" ? decryptScanline(buffer, password, width, height) : decryptNoise(buffer, password); self.postMessage({ jobId: jobId, buffer: decryptedBuffer }, [decryptedBuffer]); }; ` ); let workerBlobUrl = null; function getWorkerBlobUrl() { if (!workerBlobUrl) { const blob = new Blob([WORKER_SOURCE], { type: "application/javascript" }); workerBlobUrl = URL.createObjectURL(blob); } return workerBlobUrl; } const POOL_SIZE = navigator.hardwareConcurrency ? Math.min(navigator.hardwareConcurrency, 4) : 2; let pool = null; function getPool() { if (!pool) { const url = getWorkerBlobUrl(); pool = Array.from({ length: POOL_SIZE }, () => ({ worker: new Worker(url), busy: false })); } return pool; } function acquireWorker() { const p = getPool(); const free = p.find((w) => !w.busy); if (free) { free.busy = true; return Promise.resolve(free); } return new Promise((resolve) => { const check = () => { const w = p.find((w2) => !w2.busy); if (w) { w.busy = true; resolve(w); } else { setTimeout(check, 10); } }; check(); }); } function releaseWorker(pw) { pw.busy = false; } let nextJobId = 0; async function decryptInWorker(pixelBuffer, password, method, width, height, signal) { const pw = await acquireWorker(); const jobId = nextJobId++; return new Promise((resolve, reject) => { if (signal?.aborted) { releaseWorker(pw); reject(signal.reason ?? new DOMException("Aborted", "AbortError")); return; } let settled = false; pw.worker.onmessage = (e) => { releaseWorker(pw); if (settled) return; if (e.data.jobId !== jobId) return; settled = true; signal?.removeEventListener("abort", onAbort); resolve(e.data.buffer); }; pw.worker.onerror = (err) => { releaseWorker(pw); if (settled) return; settled = true; signal?.removeEventListener("abort", onAbort); reject(err); }; const onAbort = () => { if (settled) return; settled = true; reject(signal.reason ?? new DOMException("Aborted", "AbortError")); }; signal?.addEventListener("abort", onAbort, { once: true }); pw.worker.postMessage( { jobId, buffer: pixelBuffer, password, method, width, height }, [pixelBuffer] ); }); } function xorDecryptInWorker(pixelBuffer, password, signal) { return decryptInWorker(pixelBuffer, password, "noise", 0, 0, signal); } }) }; })); System.import("./__entry.js", "./");