{"version":3,"file":"index-DYKtbWET.js","sources":["../../../client/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../../../client/node_modules/resolve-pathname/esm/resolve-pathname.js","../../../client/node_modules/value-equal/esm/value-equal.js","../../../client/node_modules/tiny-warning/dist/tiny-warning.esm.js","../../../client/node_modules/tiny-invariant/dist/esm/tiny-invariant.js","../../../client/node_modules/react-router/node_modules/history/esm/history.js","../../../client/node_modules/mini-create-react-context/dist/esm/index.js","../../../client/node_modules/isarray/index.js","../../../client/node_modules/react-router/node_modules/path-to-regexp/index.js","../../../client/node_modules/react-router/esm/react-router.js","../../../client/node_modules/react-router-dom/node_modules/history/esm/history.js","../../../client/node_modules/react-router-dom/esm/react-router-dom.js","../../../client/node_modules/@remix-run/router/dist/router.js","../../../client/node_modules/react-router-dom-v5-compat/node_modules/react-router/dist/index.js","../../../client/node_modules/react-router-dom-v5-compat/dist/index.js"],"sourcesContent":["import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  setPrototypeOf(subClass, superClass);\n}","function isAbsolute(pathname) {\n  return pathname.charAt(0) === '/';\n}\n\n// About 1.5x faster than the two-arg version of Array#splice()\nfunction spliceOne(list, index) {\n  for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {\n    list[i] = list[k];\n  }\n\n  list.pop();\n}\n\n// This implementation is based heavily on node's url.parse\nfunction resolvePathname(to, from) {\n  if (from === undefined) from = '';\n\n  var toParts = (to && to.split('/')) || [];\n  var fromParts = (from && from.split('/')) || [];\n\n  var isToAbs = to && isAbsolute(to);\n  var isFromAbs = from && isAbsolute(from);\n  var mustEndAbs = isToAbs || isFromAbs;\n\n  if (to && isAbsolute(to)) {\n    // to is absolute\n    fromParts = toParts;\n  } else if (toParts.length) {\n    // to is relative, drop the filename\n    fromParts.pop();\n    fromParts = fromParts.concat(toParts);\n  }\n\n  if (!fromParts.length) return '/';\n\n  var hasTrailingSlash;\n  if (fromParts.length) {\n    var last = fromParts[fromParts.length - 1];\n    hasTrailingSlash = last === '.' || last === '..' || last === '';\n  } else {\n    hasTrailingSlash = false;\n  }\n\n  var up = 0;\n  for (var i = fromParts.length; i >= 0; i--) {\n    var part = fromParts[i];\n\n    if (part === '.') {\n      spliceOne(fromParts, i);\n    } else if (part === '..') {\n      spliceOne(fromParts, i);\n      up++;\n    } else if (up) {\n      spliceOne(fromParts, i);\n      up--;\n    }\n  }\n\n  if (!mustEndAbs) for (; up--; up) fromParts.unshift('..');\n\n  if (\n    mustEndAbs &&\n    fromParts[0] !== '' &&\n    (!fromParts[0] || !isAbsolute(fromParts[0]))\n  )\n    fromParts.unshift('');\n\n  var result = fromParts.join('/');\n\n  if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';\n\n  return result;\n}\n\nexport default resolvePathname;\n","function valueOf(obj) {\n  return obj.valueOf ? obj.valueOf() : Object.prototype.valueOf.call(obj);\n}\n\nfunction valueEqual(a, b) {\n  // Test for strict equality first.\n  if (a === b) return true;\n\n  // Otherwise, if either of them == null they are not equal.\n  if (a == null || b == null) return false;\n\n  if (Array.isArray(a)) {\n    return (\n      Array.isArray(b) &&\n      a.length === b.length &&\n      a.every(function(item, index) {\n        return valueEqual(item, b[index]);\n      })\n    );\n  }\n\n  if (typeof a === 'object' || typeof b === 'object') {\n    var aValue = valueOf(a);\n    var bValue = valueOf(b);\n\n    if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);\n\n    return Object.keys(Object.assign({}, a, b)).every(function(key) {\n      return valueEqual(a[key], b[key]);\n    });\n  }\n\n  return false;\n}\n\nexport default valueEqual;\n","var isProduction = process.env.NODE_ENV === 'production';\nfunction warning(condition, message) {\n  if (!isProduction) {\n    if (condition) {\n      return;\n    }\n\n    var text = \"Warning: \" + message;\n\n    if (typeof console !== 'undefined') {\n      console.warn(text);\n    }\n\n    try {\n      throw Error(text);\n    } catch (x) {}\n  }\n}\n\nexport default warning;\n","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n    if (condition) {\n        return;\n    }\n    if (isProduction) {\n        throw new Error(prefix);\n    }\n    var provided = typeof message === 'function' ? message() : message;\n    var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n    throw new Error(value);\n}\n\nexport { invariant as default };\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport resolvePathname from 'resolve-pathname';\nimport valueEqual from 'value-equal';\nimport warning from 'tiny-warning';\nimport invariant from 'tiny-invariant';\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path : '/' + path;\n}\nfunction stripLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path.substr(1) : path;\n}\nfunction hasBasename(path, prefix) {\n  return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && '/?#'.indexOf(path.charAt(prefix.length)) !== -1;\n}\nfunction stripBasename(path, prefix) {\n  return hasBasename(path, prefix) ? path.substr(prefix.length) : path;\n}\nfunction stripTrailingSlash(path) {\n  return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;\n}\nfunction parsePath(path) {\n  var pathname = path || '/';\n  var search = '';\n  var hash = '';\n  var hashIndex = pathname.indexOf('#');\n\n  if (hashIndex !== -1) {\n    hash = pathname.substr(hashIndex);\n    pathname = pathname.substr(0, hashIndex);\n  }\n\n  var searchIndex = pathname.indexOf('?');\n\n  if (searchIndex !== -1) {\n    search = pathname.substr(searchIndex);\n    pathname = pathname.substr(0, searchIndex);\n  }\n\n  return {\n    pathname: pathname,\n    search: search === '?' ? '' : search,\n    hash: hash === '#' ? '' : hash\n  };\n}\nfunction createPath(location) {\n  var pathname = location.pathname,\n      search = location.search,\n      hash = location.hash;\n  var path = pathname || '/';\n  if (search && search !== '?') path += search.charAt(0) === '?' ? search : \"?\" + search;\n  if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : \"#\" + hash;\n  return path;\n}\n\nfunction createLocation(path, state, key, currentLocation) {\n  var location;\n\n  if (typeof path === 'string') {\n    // Two-arg form: push(path, state)\n    location = parsePath(path);\n    location.state = state;\n  } else {\n    // One-arg form: push(location)\n    location = _extends({}, path);\n    if (location.pathname === undefined) location.pathname = '';\n\n    if (location.search) {\n      if (location.search.charAt(0) !== '?') location.search = '?' + location.search;\n    } else {\n      location.search = '';\n    }\n\n    if (location.hash) {\n      if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;\n    } else {\n      location.hash = '';\n    }\n\n    if (state !== undefined && location.state === undefined) location.state = state;\n  }\n\n  try {\n    location.pathname = decodeURI(location.pathname);\n  } catch (e) {\n    if (e instanceof URIError) {\n      throw new URIError('Pathname \"' + location.pathname + '\" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');\n    } else {\n      throw e;\n    }\n  }\n\n  if (key) location.key = key;\n\n  if (currentLocation) {\n    // Resolve incomplete/relative pathname relative to current location.\n    if (!location.pathname) {\n      location.pathname = currentLocation.pathname;\n    } else if (location.pathname.charAt(0) !== '/') {\n      location.pathname = resolvePathname(location.pathname, currentLocation.pathname);\n    }\n  } else {\n    // When there is no prior location and pathname is empty, set it to /\n    if (!location.pathname) {\n      location.pathname = '/';\n    }\n  }\n\n  return location;\n}\nfunction locationsAreEqual(a, b) {\n  return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && valueEqual(a.state, b.state);\n}\n\nfunction createTransitionManager() {\n  var prompt = null;\n\n  function setPrompt(nextPrompt) {\n    process.env.NODE_ENV !== \"production\" ? warning(prompt == null, 'A history supports only one prompt at a time') : void 0;\n    prompt = nextPrompt;\n    return function () {\n      if (prompt === nextPrompt) prompt = null;\n    };\n  }\n\n  function confirmTransitionTo(location, action, getUserConfirmation, callback) {\n    // TODO: If another transition starts while we're still confirming\n    // the previous one, we may end up in a weird state. Figure out the\n    // best way to handle this.\n    if (prompt != null) {\n      var result = typeof prompt === 'function' ? prompt(location, action) : prompt;\n\n      if (typeof result === 'string') {\n        if (typeof getUserConfirmation === 'function') {\n          getUserConfirmation(result, callback);\n        } else {\n          process.env.NODE_ENV !== \"production\" ? warning(false, 'A history needs a getUserConfirmation function in order to use a prompt message') : void 0;\n          callback(true);\n        }\n      } else {\n        // Return false from a transition hook to cancel the transition.\n        callback(result !== false);\n      }\n    } else {\n      callback(true);\n    }\n  }\n\n  var listeners = [];\n\n  function appendListener(fn) {\n    var isActive = true;\n\n    function listener() {\n      if (isActive) fn.apply(void 0, arguments);\n    }\n\n    listeners.push(listener);\n    return function () {\n      isActive = false;\n      listeners = listeners.filter(function (item) {\n        return item !== listener;\n      });\n    };\n  }\n\n  function notifyListeners() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    listeners.forEach(function (listener) {\n      return listener.apply(void 0, args);\n    });\n  }\n\n  return {\n    setPrompt: setPrompt,\n    confirmTransitionTo: confirmTransitionTo,\n    appendListener: appendListener,\n    notifyListeners: notifyListeners\n  };\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction getConfirmation(message, callback) {\n  callback(window.confirm(message)); // eslint-disable-line no-alert\n}\n/**\n * Returns true if the HTML5 history API is supported. Taken from Modernizr.\n *\n * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n * changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586\n */\n\nfunction supportsHistory() {\n  var ua = window.navigator.userAgent;\n  if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;\n  return window.history && 'pushState' in window.history;\n}\n/**\n * Returns true if browser fires popstate on hash change.\n * IE10 and IE11 do not.\n */\n\nfunction supportsPopStateOnHashChange() {\n  return window.navigator.userAgent.indexOf('Trident') === -1;\n}\n/**\n * Returns false if using go(n) with hash history causes a full page reload.\n */\n\nfunction supportsGoWithoutReloadUsingHash() {\n  return window.navigator.userAgent.indexOf('Firefox') === -1;\n}\n/**\n * Returns true if a given popstate event is an extraneous WebKit event.\n * Accounts for the fact that Chrome on iOS fires real popstate events\n * containing undefined state when pressing the back button.\n */\n\nfunction isExtraneousPopstateEvent(event) {\n  return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;\n}\n\nvar PopStateEvent = 'popstate';\nvar HashChangeEvent = 'hashchange';\n\nfunction getHistoryState() {\n  try {\n    return window.history.state || {};\n  } catch (e) {\n    // IE 11 sometimes throws when accessing window.history.state\n    // See https://github.com/ReactTraining/history/pull/289\n    return {};\n  }\n}\n/**\n * Creates a history object that uses the HTML5 history API including\n * pushState, replaceState, and the popstate event.\n */\n\n\nfunction createBrowserHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Browser history needs a DOM') : invariant(false) : void 0;\n  var globalHistory = window.history;\n  var canUseHistory = supportsHistory();\n  var needsHashChangeListener = !supportsPopStateOnHashChange();\n  var _props = props,\n      _props$forceRefresh = _props.forceRefresh,\n      forceRefresh = _props$forceRefresh === void 0 ? false : _props$forceRefresh,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n\n  function getDOMLocation(historyState) {\n    var _ref = historyState || {},\n        key = _ref.key,\n        state = _ref.state;\n\n    var _window$location = window.location,\n        pathname = _window$location.pathname,\n        search = _window$location.search,\n        hash = _window$location.hash;\n    var path = pathname + search + hash;\n    process.env.NODE_ENV !== \"production\" ? warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : void 0;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path, state, key);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    _extends(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function handlePopState(event) {\n    // Ignore extraneous popstate events in WebKit.\n    if (isExtraneousPopstateEvent(event)) return;\n    handlePop(getDOMLocation(event.state));\n  }\n\n  function handleHashChange() {\n    handlePop(getDOMLocation(getHistoryState()));\n  }\n\n  var forceNextPop = false;\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of keys we've seen in sessionStorage.\n    // Instead, we just default to 0 for keys we don't know.\n\n    var toIndex = allKeys.indexOf(toLocation.key);\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allKeys.indexOf(fromLocation.key);\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  }\n\n  var initialLocation = getDOMLocation(getHistoryState());\n  var allKeys = [initialLocation.key]; // Public interface\n\n  function createHref(location) {\n    return basename + createPath(location);\n  }\n\n  function push(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.pushState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.href = href;\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          var nextKeys = allKeys.slice(0, prevIndex + 1);\n          nextKeys.push(location.key);\n          allKeys = nextKeys;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history') : void 0;\n        window.location.href = href;\n      }\n    });\n  }\n\n  function replace(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.replaceState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.replace(href);\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          if (prevIndex !== -1) allKeys[prevIndex] = location.key;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history') : void 0;\n        window.location.replace(href);\n      }\n    });\n  }\n\n  function go(n) {\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.addEventListener(HashChangeEvent, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.removeEventListener(HashChangeEvent, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nvar HashChangeEvent$1 = 'hashchange';\nvar HashPathCoders = {\n  hashbang: {\n    encodePath: function encodePath(path) {\n      return path.charAt(0) === '!' ? path : '!/' + stripLeadingSlash(path);\n    },\n    decodePath: function decodePath(path) {\n      return path.charAt(0) === '!' ? path.substr(1) : path;\n    }\n  },\n  noslash: {\n    encodePath: stripLeadingSlash,\n    decodePath: addLeadingSlash\n  },\n  slash: {\n    encodePath: addLeadingSlash,\n    decodePath: addLeadingSlash\n  }\n};\n\nfunction stripHash(url) {\n  var hashIndex = url.indexOf('#');\n  return hashIndex === -1 ? url : url.slice(0, hashIndex);\n}\n\nfunction getHashPath() {\n  // We can't use window.location.hash here because it's not\n  // consistent across browsers - Firefox will pre-decode it!\n  var href = window.location.href;\n  var hashIndex = href.indexOf('#');\n  return hashIndex === -1 ? '' : href.substring(hashIndex + 1);\n}\n\nfunction pushHashPath(path) {\n  window.location.hash = path;\n}\n\nfunction replaceHashPath(path) {\n  window.location.replace(stripHash(window.location.href) + '#' + path);\n}\n\nfunction createHashHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Hash history needs a DOM') : invariant(false) : void 0;\n  var globalHistory = window.history;\n  var canGoWithoutReload = supportsGoWithoutReloadUsingHash();\n  var _props = props,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$hashType = _props.hashType,\n      hashType = _props$hashType === void 0 ? 'slash' : _props$hashType;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n  var _HashPathCoders$hashT = HashPathCoders[hashType],\n      encodePath = _HashPathCoders$hashT.encodePath,\n      decodePath = _HashPathCoders$hashT.decodePath;\n\n  function getDOMLocation() {\n    var path = decodePath(getHashPath());\n    process.env.NODE_ENV !== \"production\" ? warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : void 0;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    _extends(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  var forceNextPop = false;\n  var ignorePath = null;\n\n  function locationsAreEqual$$1(a, b) {\n    return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash;\n  }\n\n  function handleHashChange() {\n    var path = getHashPath();\n    var encodedPath = encodePath(path);\n\n    if (path !== encodedPath) {\n      // Ensure we always have a properly-encoded hash.\n      replaceHashPath(encodedPath);\n    } else {\n      var location = getDOMLocation();\n      var prevLocation = history.location;\n      if (!forceNextPop && locationsAreEqual$$1(prevLocation, location)) return; // A hashchange doesn't always == location change.\n\n      if (ignorePath === createPath(location)) return; // Ignore this change; we already setState in push/replace.\n\n      ignorePath = null;\n      handlePop(location);\n    }\n  }\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of paths we've seen in sessionStorage.\n    // Instead, we just default to 0 for paths we don't know.\n\n    var toIndex = allPaths.lastIndexOf(createPath(toLocation));\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allPaths.lastIndexOf(createPath(fromLocation));\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  } // Ensure the hash is encoded properly before doing anything else.\n\n\n  var path = getHashPath();\n  var encodedPath = encodePath(path);\n  if (path !== encodedPath) replaceHashPath(encodedPath);\n  var initialLocation = getDOMLocation();\n  var allPaths = [createPath(initialLocation)]; // Public interface\n\n  function createHref(location) {\n    var baseTag = document.querySelector('base');\n    var href = '';\n\n    if (baseTag && baseTag.getAttribute('href')) {\n      href = stripHash(window.location.href);\n    }\n\n    return href + '#' + encodePath(basename + createPath(location));\n  }\n\n  function push(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Hash history cannot push state; it is ignored') : void 0;\n    var action = 'PUSH';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a PUSH, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        pushHashPath(encodedPath);\n        var prevIndex = allPaths.lastIndexOf(createPath(history.location));\n        var nextPaths = allPaths.slice(0, prevIndex + 1);\n        nextPaths.push(path);\n        allPaths = nextPaths;\n        setState({\n          action: action,\n          location: location\n        });\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack') : void 0;\n        setState();\n      }\n    });\n  }\n\n  function replace(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Hash history cannot replace state; it is ignored') : void 0;\n    var action = 'REPLACE';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a REPLACE, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        replaceHashPath(encodedPath);\n      }\n\n      var prevIndex = allPaths.indexOf(createPath(history.location));\n      if (prevIndex !== -1) allPaths[prevIndex] = path;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n    process.env.NODE_ENV !== \"production\" ? warning(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser') : void 0;\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(HashChangeEvent$1, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(HashChangeEvent$1, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nfunction clamp(n, lowerBound, upperBound) {\n  return Math.min(Math.max(n, lowerBound), upperBound);\n}\n/**\n * Creates a history object that stores locations in memory.\n */\n\n\nfunction createMemoryHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  var _props = props,\n      getUserConfirmation = _props.getUserConfirmation,\n      _props$initialEntries = _props.initialEntries,\n      initialEntries = _props$initialEntries === void 0 ? ['/'] : _props$initialEntries,\n      _props$initialIndex = _props.initialIndex,\n      initialIndex = _props$initialIndex === void 0 ? 0 : _props$initialIndex,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    _extends(history, nextState);\n\n    history.length = history.entries.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var index = clamp(initialIndex, 0, initialEntries.length - 1);\n  var entries = initialEntries.map(function (entry) {\n    return typeof entry === 'string' ? createLocation(entry, undefined, createKey()) : createLocation(entry, undefined, entry.key || createKey());\n  }); // Public interface\n\n  var createHref = createPath;\n\n  function push(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var prevIndex = history.index;\n      var nextIndex = prevIndex + 1;\n      var nextEntries = history.entries.slice(0);\n\n      if (nextEntries.length > nextIndex) {\n        nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);\n      } else {\n        nextEntries.push(location);\n      }\n\n      setState({\n        action: action,\n        location: location,\n        index: nextIndex,\n        entries: nextEntries\n      });\n    });\n  }\n\n  function replace(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      history.entries[history.index] = location;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n    var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);\n    var action = 'POP';\n    var location = history.entries[nextIndex];\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (ok) {\n        setState({\n          action: action,\n          location: location,\n          index: nextIndex\n        });\n      } else {\n        // Mimic the behavior of DOM histories by\n        // causing a render after a cancelled POP.\n        setState();\n      }\n    });\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  function canGo(n) {\n    var nextIndex = history.index + n;\n    return nextIndex >= 0 && nextIndex < history.entries.length;\n  }\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    return transitionManager.setPrompt(prompt);\n  }\n\n  function listen(listener) {\n    return transitionManager.appendListener(listener);\n  }\n\n  var history = {\n    length: entries.length,\n    action: 'POP',\n    location: entries[index],\n    index: index,\n    entries: entries,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    canGo: canGo,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nexport { createBrowserHistory, createHashHistory, createMemoryHistory, createLocation, locationsAreEqual, parsePath, createPath };\n","import React, { Component } from 'react';\nimport _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';\nimport PropTypes from 'prop-types';\nimport warning from 'tiny-warning';\n\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : {};\n\nfunction getUniqueId() {\n  var key = '__global_unique_id__';\n  return commonjsGlobal[key] = (commonjsGlobal[key] || 0) + 1;\n}\n\nfunction objectIs(x, y) {\n  if (x === y) {\n    return x !== 0 || 1 / x === 1 / y;\n  } else {\n    return x !== x && y !== y;\n  }\n}\n\nfunction createEventEmitter(value) {\n  var handlers = [];\n  return {\n    on: function on(handler) {\n      handlers.push(handler);\n    },\n    off: function off(handler) {\n      handlers = handlers.filter(function (h) {\n        return h !== handler;\n      });\n    },\n    get: function get() {\n      return value;\n    },\n    set: function set(newValue, changedBits) {\n      value = newValue;\n      handlers.forEach(function (handler) {\n        return handler(value, changedBits);\n      });\n    }\n  };\n}\n\nfunction onlyChild(children) {\n  return Array.isArray(children) ? children[0] : children;\n}\n\nfunction createReactContext(defaultValue, calculateChangedBits) {\n  var _Provider$childContex, _Consumer$contextType;\n\n  var contextProp = '__create-react-context-' + getUniqueId() + '__';\n\n  var Provider = /*#__PURE__*/function (_Component) {\n    _inheritsLoose(Provider, _Component);\n\n    function Provider() {\n      var _this;\n\n      _this = _Component.apply(this, arguments) || this;\n      _this.emitter = createEventEmitter(_this.props.value);\n      return _this;\n    }\n\n    var _proto = Provider.prototype;\n\n    _proto.getChildContext = function getChildContext() {\n      var _ref;\n\n      return _ref = {}, _ref[contextProp] = this.emitter, _ref;\n    };\n\n    _proto.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      if (this.props.value !== nextProps.value) {\n        var oldValue = this.props.value;\n        var newValue = nextProps.value;\n        var changedBits;\n\n        if (objectIs(oldValue, newValue)) {\n          changedBits = 0;\n        } else {\n          changedBits = typeof calculateChangedBits === 'function' ? calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n\n          if (process.env.NODE_ENV !== 'production') {\n            warning((changedBits & MAX_SIGNED_31_BIT_INT) === changedBits, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: ' + changedBits);\n          }\n\n          changedBits |= 0;\n\n          if (changedBits !== 0) {\n            this.emitter.set(nextProps.value, changedBits);\n          }\n        }\n      }\n    };\n\n    _proto.render = function render() {\n      return this.props.children;\n    };\n\n    return Provider;\n  }(Component);\n\n  Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[contextProp] = PropTypes.object.isRequired, _Provider$childContex);\n\n  var Consumer = /*#__PURE__*/function (_Component2) {\n    _inheritsLoose(Consumer, _Component2);\n\n    function Consumer() {\n      var _this2;\n\n      _this2 = _Component2.apply(this, arguments) || this;\n      _this2.state = {\n        value: _this2.getValue()\n      };\n\n      _this2.onUpdate = function (newValue, changedBits) {\n        var observedBits = _this2.observedBits | 0;\n\n        if ((observedBits & changedBits) !== 0) {\n          _this2.setState({\n            value: _this2.getValue()\n          });\n        }\n      };\n\n      return _this2;\n    }\n\n    var _proto2 = Consumer.prototype;\n\n    _proto2.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      var observedBits = nextProps.observedBits;\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;\n    };\n\n    _proto2.componentDidMount = function componentDidMount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].on(this.onUpdate);\n      }\n\n      var observedBits = this.props.observedBits;\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT : observedBits;\n    };\n\n    _proto2.componentWillUnmount = function componentWillUnmount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].off(this.onUpdate);\n      }\n    };\n\n    _proto2.getValue = function getValue() {\n      if (this.context[contextProp]) {\n        return this.context[contextProp].get();\n      } else {\n        return defaultValue;\n      }\n    };\n\n    _proto2.render = function render() {\n      return onlyChild(this.props.children)(this.state.value);\n    };\n\n    return Consumer;\n  }(Component);\n\n  Consumer.contextTypes = (_Consumer$contextType = {}, _Consumer$contextType[contextProp] = PropTypes.object, _Consumer$contextType);\n  return {\n    Provider: Provider,\n    Consumer: Consumer\n  };\n}\n\nvar index = React.createContext || createReactContext;\n\nexport default index;\n","module.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n","var isarray = require('isarray')\n\n/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n  // Match escaped characters that would otherwise appear in future matches.\n  // This allows the user to escape special characters that won't transform.\n  '(\\\\\\\\.)',\n  // Match Express-style parameters and un-named parameters with a prefix\n  // and optional suffixes. Matches appear as:\n  //\n  // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n  // \"/route(\\\\d+)\"  => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n  // \"/*\"            => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n  '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param  {string}  str\n * @param  {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n  var tokens = []\n  var key = 0\n  var index = 0\n  var path = ''\n  var defaultDelimiter = options && options.delimiter || '/'\n  var res\n\n  while ((res = PATH_REGEXP.exec(str)) != null) {\n    var m = res[0]\n    var escaped = res[1]\n    var offset = res.index\n    path += str.slice(index, offset)\n    index = offset + m.length\n\n    // Ignore already escaped sequences.\n    if (escaped) {\n      path += escaped[1]\n      continue\n    }\n\n    var next = str[index]\n    var prefix = res[2]\n    var name = res[3]\n    var capture = res[4]\n    var group = res[5]\n    var modifier = res[6]\n    var asterisk = res[7]\n\n    // Push the current path onto the tokens.\n    if (path) {\n      tokens.push(path)\n      path = ''\n    }\n\n    var partial = prefix != null && next != null && next !== prefix\n    var repeat = modifier === '+' || modifier === '*'\n    var optional = modifier === '?' || modifier === '*'\n    var delimiter = prefix || defaultDelimiter\n    var pattern = capture || group\n    var prevText = prefix || (typeof tokens[tokens.length - 1] === 'string' ? tokens[tokens.length - 1] : '')\n\n    tokens.push({\n      name: name || key++,\n      prefix: prefix || '',\n      delimiter: delimiter,\n      optional: optional,\n      repeat: repeat,\n      partial: partial,\n      asterisk: !!asterisk,\n      pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : restrictBacktrack(delimiter, prevText))\n    })\n  }\n\n  // Match any characters still remaining.\n  if (index < str.length) {\n    path += str.substr(index)\n  }\n\n  // If the path exists, push it onto the end.\n  if (path) {\n    tokens.push(path)\n  }\n\n  return tokens\n}\n\nfunction restrictBacktrack(delimiter, prevText) {\n  if (!prevText || prevText.indexOf(delimiter) > -1) {\n    return '[^' + escapeString(delimiter) + ']+?'\n  }\n\n  return escapeString(prevText) + '|(?:(?!' + escapeString(prevText) + ')[^' + escapeString(delimiter) + '])+?'\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param  {string}             str\n * @param  {Object=}            options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n  return tokensToFunction(parse(str, options), options)\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n  return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param  {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n  return encodeURI(str).replace(/[?#]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens, options) {\n  // Compile all the tokens into regexps.\n  var matches = new Array(tokens.length)\n\n  // Compile all the patterns before compilation.\n  for (var i = 0; i < tokens.length; i++) {\n    if (typeof tokens[i] === 'object') {\n      matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options))\n    }\n  }\n\n  return function (obj, opts) {\n    var path = ''\n    var data = obj || {}\n    var options = opts || {}\n    var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent\n\n    for (var i = 0; i < tokens.length; i++) {\n      var token = tokens[i]\n\n      if (typeof token === 'string') {\n        path += token\n\n        continue\n      }\n\n      var value = data[token.name]\n      var segment\n\n      if (value == null) {\n        if (token.optional) {\n          // Prepend partial segment prefixes.\n          if (token.partial) {\n            path += token.prefix\n          }\n\n          continue\n        } else {\n          throw new TypeError('Expected \"' + token.name + '\" to be defined')\n        }\n      }\n\n      if (isarray(value)) {\n        if (!token.repeat) {\n          throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n        }\n\n        if (value.length === 0) {\n          if (token.optional) {\n            continue\n          } else {\n            throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n          }\n        }\n\n        for (var j = 0; j < value.length; j++) {\n          segment = encode(value[j])\n\n          if (!matches[i].test(segment)) {\n            throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n          }\n\n          path += (j === 0 ? token.prefix : token.delimiter) + segment\n        }\n\n        continue\n      }\n\n      segment = token.asterisk ? encodeAsterisk(value) : encode(value)\n\n      if (!matches[i].test(segment)) {\n        throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n      }\n\n      path += token.prefix + segment\n    }\n\n    return path\n  }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param  {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n  return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param  {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n  return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param  {!RegExp} re\n * @param  {Array}   keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n  re.keys = keys\n  return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param  {Object} options\n * @return {string}\n */\nfunction flags (options) {\n  return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param  {!RegExp} path\n * @param  {!Array}  keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n  // Use a negative lookahead to match only capturing groups.\n  var groups = path.source.match(/\\((?!\\?)/g)\n\n  if (groups) {\n    for (var i = 0; i < groups.length; i++) {\n      keys.push({\n        name: i,\n        prefix: null,\n        delimiter: null,\n        optional: false,\n        repeat: false,\n        partial: false,\n        asterisk: false,\n        pattern: null\n      })\n    }\n  }\n\n  return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param  {!Array}  path\n * @param  {Array}   keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n  var parts = []\n\n  for (var i = 0; i < path.length; i++) {\n    parts.push(pathToRegexp(path[i], keys, options).source)\n  }\n\n  var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))\n\n  return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param  {string}  path\n * @param  {!Array}  keys\n * @param  {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n  return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param  {!Array}          tokens\n * @param  {(Array|Object)=} keys\n * @param  {Object=}         options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  var strict = options.strict\n  var end = options.end !== false\n  var route = ''\n\n  // Iterate over the tokens and create our regexp string.\n  for (var i = 0; i < tokens.length; i++) {\n    var token = tokens[i]\n\n    if (typeof token === 'string') {\n      route += escapeString(token)\n    } else {\n      var prefix = escapeString(token.prefix)\n      var capture = '(?:' + token.pattern + ')'\n\n      keys.push(token)\n\n      if (token.repeat) {\n        capture += '(?:' + prefix + capture + ')*'\n      }\n\n      if (token.optional) {\n        if (!token.partial) {\n          capture = '(?:' + prefix + '(' + capture + '))?'\n        } else {\n          capture = prefix + '(' + capture + ')?'\n        }\n      } else {\n        capture = prefix + '(' + capture + ')'\n      }\n\n      route += capture\n    }\n  }\n\n  var delimiter = escapeString(options.delimiter || '/')\n  var endsWithDelimiter = route.slice(-delimiter.length) === delimiter\n\n  // In non-strict mode we allow a slash at the end of match. If the path to\n  // match already ends with a slash, we remove it for consistency. The slash\n  // is valid at the end of a path match, not in the middle. This is important\n  // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n  if (!strict) {\n    route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'\n  }\n\n  if (end) {\n    route += '$'\n  } else {\n    // In non-ending mode, we need the capturing groups to match as much as\n    // possible by using a positive lookahead to the end or next path segment.\n    route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'\n  }\n\n  return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param  {(string|RegExp|Array)} path\n * @param  {(Array|Object)=}       keys\n * @param  {Object=}               options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n  if (!isarray(keys)) {\n    options = /** @type {!Object} */ (keys || options)\n    keys = []\n  }\n\n  options = options || {}\n\n  if (path instanceof RegExp) {\n    return regexpToRegexp(path, /** @type {!Array} */ (keys))\n  }\n\n  if (isarray(path)) {\n    return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n  }\n\n  return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\n","import _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { createMemoryHistory, createLocation, locationsAreEqual, createPath } from 'history';\nimport warning from 'tiny-warning';\nimport createContext from 'mini-create-react-context';\nimport invariant from 'tiny-invariant';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport pathToRegexp from 'path-to-regexp';\nimport { isValidElementType } from 'react-is';\nimport _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport hoistStatics from 'hoist-non-react-statics';\n\n// TODO: Replace with React.createContext once we can assume React 16+\n\nvar createNamedContext = function createNamedContext(name) {\n  var context = createContext();\n  context.displayName = name;\n  return context;\n};\n\nvar historyContext = /*#__PURE__*/createNamedContext(\"Router-History\");\n\nvar context = /*#__PURE__*/createNamedContext(\"Router\");\n\n/**\n * The public API for putting history on context.\n */\n\nvar Router = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(Router, _React$Component);\n\n  Router.computeRootMatch = function computeRootMatch(pathname) {\n    return {\n      path: \"/\",\n      url: \"/\",\n      params: {},\n      isExact: pathname === \"/\"\n    };\n  };\n\n  function Router(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this;\n    _this.state = {\n      location: props.history.location\n    }; // This is a bit of a hack. We have to start listening for location\n    // changes here in the constructor in case there are any <Redirect>s\n    // on the initial render. If there are, they will replace/push when\n    // they mount and since cDM fires in children before parents, we may\n    // get a new location before the <Router> is mounted.\n\n    _this._isMounted = false;\n    _this._pendingLocation = null;\n\n    if (!props.staticContext) {\n      _this.unlisten = props.history.listen(function (location) {\n        if (_this._isMounted) {\n          _this.setState({\n            location: location\n          });\n        } else {\n          _this._pendingLocation = location;\n        }\n      });\n    }\n\n    return _this;\n  }\n\n  var _proto = Router.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this._isMounted = true;\n\n    if (this._pendingLocation) {\n      this.setState({\n        location: this._pendingLocation\n      });\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.unlisten) {\n      this.unlisten();\n      this._isMounted = false;\n      this._pendingLocation = null;\n    }\n  };\n\n  _proto.render = function render() {\n    return /*#__PURE__*/React.createElement(context.Provider, {\n      value: {\n        history: this.props.history,\n        location: this.state.location,\n        match: Router.computeRootMatch(this.state.location.pathname),\n        staticContext: this.props.staticContext\n      }\n    }, /*#__PURE__*/React.createElement(historyContext.Provider, {\n      children: this.props.children || null,\n      value: this.props.history\n    }));\n  };\n\n  return Router;\n}(React.Component);\n\nif (process.env.NODE_ENV !== \"production\") {\n  Router.propTypes = {\n    children: PropTypes.node,\n    history: PropTypes.object.isRequired,\n    staticContext: PropTypes.object\n  };\n\n  Router.prototype.componentDidUpdate = function (prevProps) {\n    process.env.NODE_ENV !== \"production\" ? warning(prevProps.history === this.props.history, \"You cannot change <Router history>\") : void 0;\n  };\n}\n\n/**\n * The public API for a <Router> that stores location in memory.\n */\n\nvar MemoryRouter = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(MemoryRouter, _React$Component);\n\n  function MemoryRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = createMemoryHistory(_this.props);\n    return _this;\n  }\n\n  var _proto = MemoryRouter.prototype;\n\n  _proto.render = function render() {\n    return /*#__PURE__*/React.createElement(Router, {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return MemoryRouter;\n}(React.Component);\n\nif (process.env.NODE_ENV !== \"production\") {\n  MemoryRouter.propTypes = {\n    initialEntries: PropTypes.array,\n    initialIndex: PropTypes.number,\n    getUserConfirmation: PropTypes.func,\n    keyLength: PropTypes.number,\n    children: PropTypes.node\n  };\n\n  MemoryRouter.prototype.componentDidMount = function () {\n    process.env.NODE_ENV !== \"production\" ? warning(!this.props.history, \"<MemoryRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { MemoryRouter as Router }`.\") : void 0;\n  };\n}\n\nvar Lifecycle = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(Lifecycle, _React$Component);\n\n  function Lifecycle() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Lifecycle.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    if (this.props.onMount) this.props.onMount.call(this, this);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    if (this.props.onUpdate) this.props.onUpdate.call(this, this, prevProps);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (this.props.onUnmount) this.props.onUnmount.call(this, this);\n  };\n\n  _proto.render = function render() {\n    return null;\n  };\n\n  return Lifecycle;\n}(React.Component);\n\n/**\n * The public API for prompting the user before navigating away from a screen.\n */\n\nfunction Prompt(_ref) {\n  var message = _ref.message,\n      _ref$when = _ref.when,\n      when = _ref$when === void 0 ? true : _ref$when;\n  return /*#__PURE__*/React.createElement(context.Consumer, null, function (context) {\n    !context ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You should not use <Prompt> outside a <Router>\") : invariant(false) : void 0;\n    if (!when || context.staticContext) return null;\n    var method = context.history.block;\n    return /*#__PURE__*/React.createElement(Lifecycle, {\n      onMount: function onMount(self) {\n        self.release = method(message);\n      },\n      onUpdate: function onUpdate(self, prevProps) {\n        if (prevProps.message !== message) {\n          self.release();\n          self.release = method(message);\n        }\n      },\n      onUnmount: function onUnmount(self) {\n        self.release();\n      },\n      message: message\n    });\n  });\n}\n\nif (process.env.NODE_ENV !== \"production\") {\n  var messageType = PropTypes.oneOfType([PropTypes.func, PropTypes.string]);\n  Prompt.propTypes = {\n    when: PropTypes.bool,\n    message: messageType.isRequired\n  };\n}\n\nvar cache = {};\nvar cacheLimit = 10000;\nvar cacheCount = 0;\n\nfunction compilePath(path) {\n  if (cache[path]) return cache[path];\n  var generator = pathToRegexp.compile(path);\n\n  if (cacheCount < cacheLimit) {\n    cache[path] = generator;\n    cacheCount++;\n  }\n\n  return generator;\n}\n/**\n * Public API for generating a URL pathname from a path and parameters.\n */\n\n\nfunction generatePath(path, params) {\n  if (path === void 0) {\n    path = \"/\";\n  }\n\n  if (params === void 0) {\n    params = {};\n  }\n\n  return path === \"/\" ? path : compilePath(path)(params, {\n    pretty: true\n  });\n}\n\n/**\n * The public API for navigating programmatically with a component.\n */\n\nfunction Redirect(_ref) {\n  var computedMatch = _ref.computedMatch,\n      to = _ref.to,\n      _ref$push = _ref.push,\n      push = _ref$push === void 0 ? false : _ref$push;\n  return /*#__PURE__*/React.createElement(context.Consumer, null, function (context) {\n    !context ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You should not use <Redirect> outside a <Router>\") : invariant(false) : void 0;\n    var history = context.history,\n        staticContext = context.staticContext;\n    var method = push ? history.push : history.replace;\n    var location = createLocation(computedMatch ? typeof to === \"string\" ? generatePath(to, computedMatch.params) : _extends({}, to, {\n      pathname: generatePath(to.pathname, computedMatch.params)\n    }) : to); // When rendering in a static context,\n    // set the new location immediately.\n\n    if (staticContext) {\n      method(location);\n      return null;\n    }\n\n    return /*#__PURE__*/React.createElement(Lifecycle, {\n      onMount: function onMount() {\n        method(location);\n      },\n      onUpdate: function onUpdate(self, prevProps) {\n        var prevLocation = createLocation(prevProps.to);\n\n        if (!locationsAreEqual(prevLocation, _extends({}, location, {\n          key: prevLocation.key\n        }))) {\n          method(location);\n        }\n      },\n      to: to\n    });\n  });\n}\n\nif (process.env.NODE_ENV !== \"production\") {\n  Redirect.propTypes = {\n    push: PropTypes.bool,\n    from: PropTypes.string,\n    to: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired\n  };\n}\n\nvar cache$1 = {};\nvar cacheLimit$1 = 10000;\nvar cacheCount$1 = 0;\n\nfunction compilePath$1(path, options) {\n  var cacheKey = \"\" + options.end + options.strict + options.sensitive;\n  var pathCache = cache$1[cacheKey] || (cache$1[cacheKey] = {});\n  if (pathCache[path]) return pathCache[path];\n  var keys = [];\n  var regexp = pathToRegexp(path, keys, options);\n  var result = {\n    regexp: regexp,\n    keys: keys\n  };\n\n  if (cacheCount$1 < cacheLimit$1) {\n    pathCache[path] = result;\n    cacheCount$1++;\n  }\n\n  return result;\n}\n/**\n * Public API for matching a URL pathname to a path.\n */\n\n\nfunction matchPath(pathname, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  if (typeof options === \"string\" || Array.isArray(options)) {\n    options = {\n      path: options\n    };\n  }\n\n  var _options = options,\n      path = _options.path,\n      _options$exact = _options.exact,\n      exact = _options$exact === void 0 ? false : _options$exact,\n      _options$strict = _options.strict,\n      strict = _options$strict === void 0 ? false : _options$strict,\n      _options$sensitive = _options.sensitive,\n      sensitive = _options$sensitive === void 0 ? false : _options$sensitive;\n  var paths = [].concat(path);\n  return paths.reduce(function (matched, path) {\n    if (!path && path !== \"\") return null;\n    if (matched) return matched;\n\n    var _compilePath = compilePath$1(path, {\n      end: exact,\n      strict: strict,\n      sensitive: sensitive\n    }),\n        regexp = _compilePath.regexp,\n        keys = _compilePath.keys;\n\n    var match = regexp.exec(pathname);\n    if (!match) return null;\n    var url = match[0],\n        values = match.slice(1);\n    var isExact = pathname === url;\n    if (exact && !isExact) return null;\n    return {\n      path: path,\n      // the path used to match\n      url: path === \"/\" && url === \"\" ? \"/\" : url,\n      // the matched portion of the URL\n      isExact: isExact,\n      // whether or not we matched exactly\n      params: keys.reduce(function (memo, key, index) {\n        memo[key.name] = values[index];\n        return memo;\n      }, {})\n    };\n  }, null);\n}\n\nfunction isEmptyChildren(children) {\n  return React.Children.count(children) === 0;\n}\n\nfunction evalChildrenDev(children, props, path) {\n  var value = children(props);\n  process.env.NODE_ENV !== \"production\" ? warning(value !== undefined, \"You returned `undefined` from the `children` function of \" + (\"<Route\" + (path ? \" path=\\\"\" + path + \"\\\"\" : \"\") + \">, but you \") + \"should have returned a React element or `null`\") : void 0;\n  return value || null;\n}\n/**\n * The public API for matching a single path and rendering.\n */\n\n\nvar Route = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(Route, _React$Component);\n\n  function Route() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Route.prototype;\n\n  _proto.render = function render() {\n    var _this = this;\n\n    return /*#__PURE__*/React.createElement(context.Consumer, null, function (context$1) {\n      !context$1 ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You should not use <Route> outside a <Router>\") : invariant(false) : void 0;\n      var location = _this.props.location || context$1.location;\n      var match = _this.props.computedMatch ? _this.props.computedMatch // <Switch> already computed the match for us\n      : _this.props.path ? matchPath(location.pathname, _this.props) : context$1.match;\n\n      var props = _extends({}, context$1, {\n        location: location,\n        match: match\n      });\n\n      var _this$props = _this.props,\n          children = _this$props.children,\n          component = _this$props.component,\n          render = _this$props.render; // Preact uses an empty array as children by\n      // default, so use null if that's the case.\n\n      if (Array.isArray(children) && isEmptyChildren(children)) {\n        children = null;\n      }\n\n      return /*#__PURE__*/React.createElement(context.Provider, {\n        value: props\n      }, props.match ? children ? typeof children === \"function\" ? process.env.NODE_ENV !== \"production\" ? evalChildrenDev(children, props, _this.props.path) : children(props) : children : component ? /*#__PURE__*/React.createElement(component, props) : render ? render(props) : null : typeof children === \"function\" ? process.env.NODE_ENV !== \"production\" ? evalChildrenDev(children, props, _this.props.path) : children(props) : null);\n    });\n  };\n\n  return Route;\n}(React.Component);\n\nif (process.env.NODE_ENV !== \"production\") {\n  Route.propTypes = {\n    children: PropTypes.oneOfType([PropTypes.func, PropTypes.node]),\n    component: function component(props, propName) {\n      if (props[propName] && !isValidElementType(props[propName])) {\n        return new Error(\"Invalid prop 'component' supplied to 'Route': the prop is not a valid React component\");\n      }\n    },\n    exact: PropTypes.bool,\n    location: PropTypes.object,\n    path: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]),\n    render: PropTypes.func,\n    sensitive: PropTypes.bool,\n    strict: PropTypes.bool\n  };\n\n  Route.prototype.componentDidMount = function () {\n    process.env.NODE_ENV !== \"production\" ? warning(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.component), \"You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored\") : void 0;\n    process.env.NODE_ENV !== \"production\" ? warning(!(this.props.children && !isEmptyChildren(this.props.children) && this.props.render), \"You should not use <Route render> and <Route children> in the same route; <Route render> will be ignored\") : void 0;\n    process.env.NODE_ENV !== \"production\" ? warning(!(this.props.component && this.props.render), \"You should not use <Route component> and <Route render> in the same route; <Route render> will be ignored\") : void 0;\n  };\n\n  Route.prototype.componentDidUpdate = function (prevProps) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(this.props.location && !prevProps.location), '<Route> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.') : void 0;\n    process.env.NODE_ENV !== \"production\" ? warning(!(!this.props.location && prevProps.location), '<Route> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.') : void 0;\n  };\n}\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === \"/\" ? path : \"/\" + path;\n}\n\nfunction addBasename(basename, location) {\n  if (!basename) return location;\n  return _extends({}, location, {\n    pathname: addLeadingSlash(basename) + location.pathname\n  });\n}\n\nfunction stripBasename(basename, location) {\n  if (!basename) return location;\n  var base = addLeadingSlash(basename);\n  if (location.pathname.indexOf(base) !== 0) return location;\n  return _extends({}, location, {\n    pathname: location.pathname.substr(base.length)\n  });\n}\n\nfunction createURL(location) {\n  return typeof location === \"string\" ? location : createPath(location);\n}\n\nfunction staticHandler(methodName) {\n  return function () {\n     process.env.NODE_ENV !== \"production\" ? invariant(false, \"You cannot %s with <StaticRouter>\", methodName) : invariant(false) ;\n  };\n}\n\nfunction noop() {}\n/**\n * The public top-level API for a \"static\" <Router>, so-called because it\n * can't actually change the current location. Instead, it just records\n * location changes in a context object. Useful mainly in testing and\n * server-rendering scenarios.\n */\n\n\nvar StaticRouter = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(StaticRouter, _React$Component);\n\n  function StaticRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n\n    _this.handlePush = function (location) {\n      return _this.navigateTo(location, \"PUSH\");\n    };\n\n    _this.handleReplace = function (location) {\n      return _this.navigateTo(location, \"REPLACE\");\n    };\n\n    _this.handleListen = function () {\n      return noop;\n    };\n\n    _this.handleBlock = function () {\n      return noop;\n    };\n\n    return _this;\n  }\n\n  var _proto = StaticRouter.prototype;\n\n  _proto.navigateTo = function navigateTo(location, action) {\n    var _this$props = this.props,\n        _this$props$basename = _this$props.basename,\n        basename = _this$props$basename === void 0 ? \"\" : _this$props$basename,\n        _this$props$context = _this$props.context,\n        context = _this$props$context === void 0 ? {} : _this$props$context;\n    context.action = action;\n    context.location = addBasename(basename, createLocation(location));\n    context.url = createURL(context.location);\n  };\n\n  _proto.render = function render() {\n    var _this$props2 = this.props,\n        _this$props2$basename = _this$props2.basename,\n        basename = _this$props2$basename === void 0 ? \"\" : _this$props2$basename,\n        _this$props2$context = _this$props2.context,\n        context = _this$props2$context === void 0 ? {} : _this$props2$context,\n        _this$props2$location = _this$props2.location,\n        location = _this$props2$location === void 0 ? \"/\" : _this$props2$location,\n        rest = _objectWithoutPropertiesLoose(_this$props2, [\"basename\", \"context\", \"location\"]);\n\n    var history = {\n      createHref: function createHref(path) {\n        return addLeadingSlash(basename + createURL(path));\n      },\n      action: \"POP\",\n      location: stripBasename(basename, createLocation(location)),\n      push: this.handlePush,\n      replace: this.handleReplace,\n      go: staticHandler(\"go\"),\n      goBack: staticHandler(\"goBack\"),\n      goForward: staticHandler(\"goForward\"),\n      listen: this.handleListen,\n      block: this.handleBlock\n    };\n    return /*#__PURE__*/React.createElement(Router, _extends({}, rest, {\n      history: history,\n      staticContext: context\n    }));\n  };\n\n  return StaticRouter;\n}(React.Component);\n\nif (process.env.NODE_ENV !== \"production\") {\n  StaticRouter.propTypes = {\n    basename: PropTypes.string,\n    context: PropTypes.object,\n    location: PropTypes.oneOfType([PropTypes.string, PropTypes.object])\n  };\n\n  StaticRouter.prototype.componentDidMount = function () {\n    process.env.NODE_ENV !== \"production\" ? warning(!this.props.history, \"<StaticRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { StaticRouter as Router }`.\") : void 0;\n  };\n}\n\n/**\n * The public API for rendering the first <Route> that matches.\n */\n\nvar Switch = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(Switch, _React$Component);\n\n  function Switch() {\n    return _React$Component.apply(this, arguments) || this;\n  }\n\n  var _proto = Switch.prototype;\n\n  _proto.render = function render() {\n    var _this = this;\n\n    return /*#__PURE__*/React.createElement(context.Consumer, null, function (context) {\n      !context ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You should not use <Switch> outside a <Router>\") : invariant(false) : void 0;\n      var location = _this.props.location || context.location;\n      var element, match; // We use React.Children.forEach instead of React.Children.toArray().find()\n      // here because toArray adds keys to all child elements and we do not want\n      // to trigger an unmount/remount for two <Route>s that render the same\n      // component at different URLs.\n\n      React.Children.forEach(_this.props.children, function (child) {\n        if (match == null && /*#__PURE__*/React.isValidElement(child)) {\n          element = child;\n          var path = child.props.path || child.props.from;\n          match = path ? matchPath(location.pathname, _extends({}, child.props, {\n            path: path\n          })) : context.match;\n        }\n      });\n      return match ? /*#__PURE__*/React.cloneElement(element, {\n        location: location,\n        computedMatch: match\n      }) : null;\n    });\n  };\n\n  return Switch;\n}(React.Component);\n\nif (process.env.NODE_ENV !== \"production\") {\n  Switch.propTypes = {\n    children: PropTypes.node,\n    location: PropTypes.object\n  };\n\n  Switch.prototype.componentDidUpdate = function (prevProps) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(this.props.location && !prevProps.location), '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.') : void 0;\n    process.env.NODE_ENV !== \"production\" ? warning(!(!this.props.location && prevProps.location), '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.') : void 0;\n  };\n}\n\n/**\n * A public higher-order component to access the imperative API\n */\n\nfunction withRouter(Component) {\n  var displayName = \"withRouter(\" + (Component.displayName || Component.name) + \")\";\n\n  var C = function C(props) {\n    var wrappedComponentRef = props.wrappedComponentRef,\n        remainingProps = _objectWithoutPropertiesLoose(props, [\"wrappedComponentRef\"]);\n\n    return /*#__PURE__*/React.createElement(context.Consumer, null, function (context) {\n      !context ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You should not use <\" + displayName + \" /> outside a <Router>\") : invariant(false) : void 0;\n      return /*#__PURE__*/React.createElement(Component, _extends({}, remainingProps, context, {\n        ref: wrappedComponentRef\n      }));\n    });\n  };\n\n  C.displayName = displayName;\n  C.WrappedComponent = Component;\n\n  if (process.env.NODE_ENV !== \"production\") {\n    C.propTypes = {\n      wrappedComponentRef: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.object])\n    };\n  }\n\n  return hoistStatics(C, Component);\n}\n\nvar useContext = React.useContext;\nfunction useHistory() {\n  if (process.env.NODE_ENV !== \"production\") {\n    !(typeof useContext === \"function\") ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You must use React >= 16.8 in order to use useHistory()\") : invariant(false) : void 0;\n  }\n\n  return useContext(historyContext);\n}\nfunction useLocation() {\n  if (process.env.NODE_ENV !== \"production\") {\n    !(typeof useContext === \"function\") ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You must use React >= 16.8 in order to use useLocation()\") : invariant(false) : void 0;\n  }\n\n  return useContext(context).location;\n}\nfunction useParams() {\n  if (process.env.NODE_ENV !== \"production\") {\n    !(typeof useContext === \"function\") ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You must use React >= 16.8 in order to use useParams()\") : invariant(false) : void 0;\n  }\n\n  var match = useContext(context).match;\n  return match ? match.params : {};\n}\nfunction useRouteMatch(path) {\n  if (process.env.NODE_ENV !== \"production\") {\n    !(typeof useContext === \"function\") ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You must use React >= 16.8 in order to use useRouteMatch()\") : invariant(false) : void 0;\n  }\n\n  var location = useLocation();\n  var match = useContext(context).match;\n  return path ? matchPath(location.pathname, path) : match;\n}\n\nif (process.env.NODE_ENV !== \"production\") {\n  if (typeof window !== \"undefined\") {\n    var global = window;\n    var key = \"__react_router_build__\";\n    var buildNames = {\n      cjs: \"CommonJS\",\n      esm: \"ES modules\",\n      umd: \"UMD\"\n    };\n\n    if (global[key] && global[key] !== \"esm\") {\n      var initialBuildName = buildNames[global[key]];\n      var secondaryBuildName = buildNames[\"esm\"]; // TODO: Add link to article that explains in detail how to avoid\n      // loading 2 different builds.\n\n      throw new Error(\"You are loading the \" + secondaryBuildName + \" build of React Router \" + (\"on a page that is already running the \" + initialBuildName + \" \") + \"build, so things won't work right.\");\n    }\n\n    global[key] = \"esm\";\n  }\n}\n\nexport { MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, historyContext as __HistoryContext, context as __RouterContext, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter };\n//# sourceMappingURL=react-router.js.map\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport resolvePathname from 'resolve-pathname';\nimport valueEqual from 'value-equal';\nimport warning from 'tiny-warning';\nimport invariant from 'tiny-invariant';\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path : '/' + path;\n}\nfunction stripLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path.substr(1) : path;\n}\nfunction hasBasename(path, prefix) {\n  return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && '/?#'.indexOf(path.charAt(prefix.length)) !== -1;\n}\nfunction stripBasename(path, prefix) {\n  return hasBasename(path, prefix) ? path.substr(prefix.length) : path;\n}\nfunction stripTrailingSlash(path) {\n  return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;\n}\nfunction parsePath(path) {\n  var pathname = path || '/';\n  var search = '';\n  var hash = '';\n  var hashIndex = pathname.indexOf('#');\n\n  if (hashIndex !== -1) {\n    hash = pathname.substr(hashIndex);\n    pathname = pathname.substr(0, hashIndex);\n  }\n\n  var searchIndex = pathname.indexOf('?');\n\n  if (searchIndex !== -1) {\n    search = pathname.substr(searchIndex);\n    pathname = pathname.substr(0, searchIndex);\n  }\n\n  return {\n    pathname: pathname,\n    search: search === '?' ? '' : search,\n    hash: hash === '#' ? '' : hash\n  };\n}\nfunction createPath(location) {\n  var pathname = location.pathname,\n      search = location.search,\n      hash = location.hash;\n  var path = pathname || '/';\n  if (search && search !== '?') path += search.charAt(0) === '?' ? search : \"?\" + search;\n  if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : \"#\" + hash;\n  return path;\n}\n\nfunction createLocation(path, state, key, currentLocation) {\n  var location;\n\n  if (typeof path === 'string') {\n    // Two-arg form: push(path, state)\n    location = parsePath(path);\n    location.state = state;\n  } else {\n    // One-arg form: push(location)\n    location = _extends({}, path);\n    if (location.pathname === undefined) location.pathname = '';\n\n    if (location.search) {\n      if (location.search.charAt(0) !== '?') location.search = '?' + location.search;\n    } else {\n      location.search = '';\n    }\n\n    if (location.hash) {\n      if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;\n    } else {\n      location.hash = '';\n    }\n\n    if (state !== undefined && location.state === undefined) location.state = state;\n  }\n\n  try {\n    location.pathname = decodeURI(location.pathname);\n  } catch (e) {\n    if (e instanceof URIError) {\n      throw new URIError('Pathname \"' + location.pathname + '\" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');\n    } else {\n      throw e;\n    }\n  }\n\n  if (key) location.key = key;\n\n  if (currentLocation) {\n    // Resolve incomplete/relative pathname relative to current location.\n    if (!location.pathname) {\n      location.pathname = currentLocation.pathname;\n    } else if (location.pathname.charAt(0) !== '/') {\n      location.pathname = resolvePathname(location.pathname, currentLocation.pathname);\n    }\n  } else {\n    // When there is no prior location and pathname is empty, set it to /\n    if (!location.pathname) {\n      location.pathname = '/';\n    }\n  }\n\n  return location;\n}\nfunction locationsAreEqual(a, b) {\n  return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && valueEqual(a.state, b.state);\n}\n\nfunction createTransitionManager() {\n  var prompt = null;\n\n  function setPrompt(nextPrompt) {\n    process.env.NODE_ENV !== \"production\" ? warning(prompt == null, 'A history supports only one prompt at a time') : void 0;\n    prompt = nextPrompt;\n    return function () {\n      if (prompt === nextPrompt) prompt = null;\n    };\n  }\n\n  function confirmTransitionTo(location, action, getUserConfirmation, callback) {\n    // TODO: If another transition starts while we're still confirming\n    // the previous one, we may end up in a weird state. Figure out the\n    // best way to handle this.\n    if (prompt != null) {\n      var result = typeof prompt === 'function' ? prompt(location, action) : prompt;\n\n      if (typeof result === 'string') {\n        if (typeof getUserConfirmation === 'function') {\n          getUserConfirmation(result, callback);\n        } else {\n          process.env.NODE_ENV !== \"production\" ? warning(false, 'A history needs a getUserConfirmation function in order to use a prompt message') : void 0;\n          callback(true);\n        }\n      } else {\n        // Return false from a transition hook to cancel the transition.\n        callback(result !== false);\n      }\n    } else {\n      callback(true);\n    }\n  }\n\n  var listeners = [];\n\n  function appendListener(fn) {\n    var isActive = true;\n\n    function listener() {\n      if (isActive) fn.apply(void 0, arguments);\n    }\n\n    listeners.push(listener);\n    return function () {\n      isActive = false;\n      listeners = listeners.filter(function (item) {\n        return item !== listener;\n      });\n    };\n  }\n\n  function notifyListeners() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    listeners.forEach(function (listener) {\n      return listener.apply(void 0, args);\n    });\n  }\n\n  return {\n    setPrompt: setPrompt,\n    confirmTransitionTo: confirmTransitionTo,\n    appendListener: appendListener,\n    notifyListeners: notifyListeners\n  };\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction getConfirmation(message, callback) {\n  callback(window.confirm(message)); // eslint-disable-line no-alert\n}\n/**\n * Returns true if the HTML5 history API is supported. Taken from Modernizr.\n *\n * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n * changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586\n */\n\nfunction supportsHistory() {\n  var ua = window.navigator.userAgent;\n  if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;\n  return window.history && 'pushState' in window.history;\n}\n/**\n * Returns true if browser fires popstate on hash change.\n * IE10 and IE11 do not.\n */\n\nfunction supportsPopStateOnHashChange() {\n  return window.navigator.userAgent.indexOf('Trident') === -1;\n}\n/**\n * Returns false if using go(n) with hash history causes a full page reload.\n */\n\nfunction supportsGoWithoutReloadUsingHash() {\n  return window.navigator.userAgent.indexOf('Firefox') === -1;\n}\n/**\n * Returns true if a given popstate event is an extraneous WebKit event.\n * Accounts for the fact that Chrome on iOS fires real popstate events\n * containing undefined state when pressing the back button.\n */\n\nfunction isExtraneousPopstateEvent(event) {\n  return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;\n}\n\nvar PopStateEvent = 'popstate';\nvar HashChangeEvent = 'hashchange';\n\nfunction getHistoryState() {\n  try {\n    return window.history.state || {};\n  } catch (e) {\n    // IE 11 sometimes throws when accessing window.history.state\n    // See https://github.com/ReactTraining/history/pull/289\n    return {};\n  }\n}\n/**\n * Creates a history object that uses the HTML5 history API including\n * pushState, replaceState, and the popstate event.\n */\n\n\nfunction createBrowserHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Browser history needs a DOM') : invariant(false) : void 0;\n  var globalHistory = window.history;\n  var canUseHistory = supportsHistory();\n  var needsHashChangeListener = !supportsPopStateOnHashChange();\n  var _props = props,\n      _props$forceRefresh = _props.forceRefresh,\n      forceRefresh = _props$forceRefresh === void 0 ? false : _props$forceRefresh,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n\n  function getDOMLocation(historyState) {\n    var _ref = historyState || {},\n        key = _ref.key,\n        state = _ref.state;\n\n    var _window$location = window.location,\n        pathname = _window$location.pathname,\n        search = _window$location.search,\n        hash = _window$location.hash;\n    var path = pathname + search + hash;\n    process.env.NODE_ENV !== \"production\" ? warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : void 0;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path, state, key);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    _extends(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function handlePopState(event) {\n    // Ignore extraneous popstate events in WebKit.\n    if (isExtraneousPopstateEvent(event)) return;\n    handlePop(getDOMLocation(event.state));\n  }\n\n  function handleHashChange() {\n    handlePop(getDOMLocation(getHistoryState()));\n  }\n\n  var forceNextPop = false;\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of keys we've seen in sessionStorage.\n    // Instead, we just default to 0 for keys we don't know.\n\n    var toIndex = allKeys.indexOf(toLocation.key);\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allKeys.indexOf(fromLocation.key);\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  }\n\n  var initialLocation = getDOMLocation(getHistoryState());\n  var allKeys = [initialLocation.key]; // Public interface\n\n  function createHref(location) {\n    return basename + createPath(location);\n  }\n\n  function push(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.pushState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.href = href;\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          var nextKeys = allKeys.slice(0, prevIndex + 1);\n          nextKeys.push(location.key);\n          allKeys = nextKeys;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history') : void 0;\n        window.location.href = href;\n      }\n    });\n  }\n\n  function replace(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.replaceState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.replace(href);\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          if (prevIndex !== -1) allKeys[prevIndex] = location.key;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history') : void 0;\n        window.location.replace(href);\n      }\n    });\n  }\n\n  function go(n) {\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.addEventListener(HashChangeEvent, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.removeEventListener(HashChangeEvent, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nvar HashChangeEvent$1 = 'hashchange';\nvar HashPathCoders = {\n  hashbang: {\n    encodePath: function encodePath(path) {\n      return path.charAt(0) === '!' ? path : '!/' + stripLeadingSlash(path);\n    },\n    decodePath: function decodePath(path) {\n      return path.charAt(0) === '!' ? path.substr(1) : path;\n    }\n  },\n  noslash: {\n    encodePath: stripLeadingSlash,\n    decodePath: addLeadingSlash\n  },\n  slash: {\n    encodePath: addLeadingSlash,\n    decodePath: addLeadingSlash\n  }\n};\n\nfunction stripHash(url) {\n  var hashIndex = url.indexOf('#');\n  return hashIndex === -1 ? url : url.slice(0, hashIndex);\n}\n\nfunction getHashPath() {\n  // We can't use window.location.hash here because it's not\n  // consistent across browsers - Firefox will pre-decode it!\n  var href = window.location.href;\n  var hashIndex = href.indexOf('#');\n  return hashIndex === -1 ? '' : href.substring(hashIndex + 1);\n}\n\nfunction pushHashPath(path) {\n  window.location.hash = path;\n}\n\nfunction replaceHashPath(path) {\n  window.location.replace(stripHash(window.location.href) + '#' + path);\n}\n\nfunction createHashHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Hash history needs a DOM') : invariant(false) : void 0;\n  var globalHistory = window.history;\n  var canGoWithoutReload = supportsGoWithoutReloadUsingHash();\n  var _props = props,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$hashType = _props.hashType,\n      hashType = _props$hashType === void 0 ? 'slash' : _props$hashType;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n  var _HashPathCoders$hashT = HashPathCoders[hashType],\n      encodePath = _HashPathCoders$hashT.encodePath,\n      decodePath = _HashPathCoders$hashT.decodePath;\n\n  function getDOMLocation() {\n    var path = decodePath(getHashPath());\n    process.env.NODE_ENV !== \"production\" ? warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : void 0;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    _extends(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  var forceNextPop = false;\n  var ignorePath = null;\n\n  function locationsAreEqual$$1(a, b) {\n    return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash;\n  }\n\n  function handleHashChange() {\n    var path = getHashPath();\n    var encodedPath = encodePath(path);\n\n    if (path !== encodedPath) {\n      // Ensure we always have a properly-encoded hash.\n      replaceHashPath(encodedPath);\n    } else {\n      var location = getDOMLocation();\n      var prevLocation = history.location;\n      if (!forceNextPop && locationsAreEqual$$1(prevLocation, location)) return; // A hashchange doesn't always == location change.\n\n      if (ignorePath === createPath(location)) return; // Ignore this change; we already setState in push/replace.\n\n      ignorePath = null;\n      handlePop(location);\n    }\n  }\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of paths we've seen in sessionStorage.\n    // Instead, we just default to 0 for paths we don't know.\n\n    var toIndex = allPaths.lastIndexOf(createPath(toLocation));\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allPaths.lastIndexOf(createPath(fromLocation));\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  } // Ensure the hash is encoded properly before doing anything else.\n\n\n  var path = getHashPath();\n  var encodedPath = encodePath(path);\n  if (path !== encodedPath) replaceHashPath(encodedPath);\n  var initialLocation = getDOMLocation();\n  var allPaths = [createPath(initialLocation)]; // Public interface\n\n  function createHref(location) {\n    var baseTag = document.querySelector('base');\n    var href = '';\n\n    if (baseTag && baseTag.getAttribute('href')) {\n      href = stripHash(window.location.href);\n    }\n\n    return href + '#' + encodePath(basename + createPath(location));\n  }\n\n  function push(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Hash history cannot push state; it is ignored') : void 0;\n    var action = 'PUSH';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a PUSH, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        pushHashPath(encodedPath);\n        var prevIndex = allPaths.lastIndexOf(createPath(history.location));\n        var nextPaths = allPaths.slice(0, prevIndex + 1);\n        nextPaths.push(path);\n        allPaths = nextPaths;\n        setState({\n          action: action,\n          location: location\n        });\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack') : void 0;\n        setState();\n      }\n    });\n  }\n\n  function replace(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Hash history cannot replace state; it is ignored') : void 0;\n    var action = 'REPLACE';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a REPLACE, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        replaceHashPath(encodedPath);\n      }\n\n      var prevIndex = allPaths.indexOf(createPath(history.location));\n      if (prevIndex !== -1) allPaths[prevIndex] = path;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n    process.env.NODE_ENV !== \"production\" ? warning(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser') : void 0;\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(HashChangeEvent$1, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(HashChangeEvent$1, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nfunction clamp(n, lowerBound, upperBound) {\n  return Math.min(Math.max(n, lowerBound), upperBound);\n}\n/**\n * Creates a history object that stores locations in memory.\n */\n\n\nfunction createMemoryHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  var _props = props,\n      getUserConfirmation = _props.getUserConfirmation,\n      _props$initialEntries = _props.initialEntries,\n      initialEntries = _props$initialEntries === void 0 ? ['/'] : _props$initialEntries,\n      _props$initialIndex = _props.initialIndex,\n      initialIndex = _props$initialIndex === void 0 ? 0 : _props$initialIndex,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    _extends(history, nextState);\n\n    history.length = history.entries.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var index = clamp(initialIndex, 0, initialEntries.length - 1);\n  var entries = initialEntries.map(function (entry) {\n    return typeof entry === 'string' ? createLocation(entry, undefined, createKey()) : createLocation(entry, undefined, entry.key || createKey());\n  }); // Public interface\n\n  var createHref = createPath;\n\n  function push(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var prevIndex = history.index;\n      var nextIndex = prevIndex + 1;\n      var nextEntries = history.entries.slice(0);\n\n      if (nextEntries.length > nextIndex) {\n        nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);\n      } else {\n        nextEntries.push(location);\n      }\n\n      setState({\n        action: action,\n        location: location,\n        index: nextIndex,\n        entries: nextEntries\n      });\n    });\n  }\n\n  function replace(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      history.entries[history.index] = location;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n    var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);\n    var action = 'POP';\n    var location = history.entries[nextIndex];\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (ok) {\n        setState({\n          action: action,\n          location: location,\n          index: nextIndex\n        });\n      } else {\n        // Mimic the behavior of DOM histories by\n        // causing a render after a cancelled POP.\n        setState();\n      }\n    });\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  function canGo(n) {\n    var nextIndex = history.index + n;\n    return nextIndex >= 0 && nextIndex < history.entries.length;\n  }\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    return transitionManager.setPrompt(prompt);\n  }\n\n  function listen(listener) {\n    return transitionManager.appendListener(listener);\n  }\n\n  var history = {\n    length: entries.length,\n    action: 'POP',\n    location: entries[index],\n    index: index,\n    entries: entries,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    canGo: canGo,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nexport { createBrowserHistory, createHashHistory, createMemoryHistory, createLocation, locationsAreEqual, parsePath, createPath };\n","import { Router, __RouterContext, matchPath } from 'react-router';\nexport { MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter } from 'react-router';\nimport _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';\nimport React from 'react';\nimport { createBrowserHistory, createHashHistory, createLocation, createPath } from 'history';\nimport PropTypes from 'prop-types';\nimport warning from 'tiny-warning';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport invariant from 'tiny-invariant';\n\n/**\n * The public API for a <Router> that uses HTML5 history.\n */\n\nvar BrowserRouter = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(BrowserRouter, _React$Component);\n\n  function BrowserRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = createBrowserHistory(_this.props);\n    return _this;\n  }\n\n  var _proto = BrowserRouter.prototype;\n\n  _proto.render = function render() {\n    return /*#__PURE__*/React.createElement(Router, {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return BrowserRouter;\n}(React.Component);\n\nif (process.env.NODE_ENV !== \"production\") {\n  BrowserRouter.propTypes = {\n    basename: PropTypes.string,\n    children: PropTypes.node,\n    forceRefresh: PropTypes.bool,\n    getUserConfirmation: PropTypes.func,\n    keyLength: PropTypes.number\n  };\n\n  BrowserRouter.prototype.componentDidMount = function () {\n    process.env.NODE_ENV !== \"production\" ? warning(!this.props.history, \"<BrowserRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { BrowserRouter as Router }`.\") : void 0;\n  };\n}\n\n/**\n * The public API for a <Router> that uses window.location.hash.\n */\n\nvar HashRouter = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(HashRouter, _React$Component);\n\n  function HashRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = createHashHistory(_this.props);\n    return _this;\n  }\n\n  var _proto = HashRouter.prototype;\n\n  _proto.render = function render() {\n    return /*#__PURE__*/React.createElement(Router, {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return HashRouter;\n}(React.Component);\n\nif (process.env.NODE_ENV !== \"production\") {\n  HashRouter.propTypes = {\n    basename: PropTypes.string,\n    children: PropTypes.node,\n    getUserConfirmation: PropTypes.func,\n    hashType: PropTypes.oneOf([\"hashbang\", \"noslash\", \"slash\"])\n  };\n\n  HashRouter.prototype.componentDidMount = function () {\n    process.env.NODE_ENV !== \"production\" ? warning(!this.props.history, \"<HashRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { HashRouter as Router }`.\") : void 0;\n  };\n}\n\nvar resolveToLocation = function resolveToLocation(to, currentLocation) {\n  return typeof to === \"function\" ? to(currentLocation) : to;\n};\nvar normalizeToLocation = function normalizeToLocation(to, currentLocation) {\n  return typeof to === \"string\" ? createLocation(to, null, null, currentLocation) : to;\n};\n\nvar forwardRefShim = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef = React.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n  forwardRef = forwardRefShim;\n}\n\nfunction isModifiedEvent(event) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nvar LinkAnchor = forwardRef(function (_ref, forwardedRef) {\n  var innerRef = _ref.innerRef,\n      navigate = _ref.navigate,\n      _onClick = _ref.onClick,\n      rest = _objectWithoutPropertiesLoose(_ref, [\"innerRef\", \"navigate\", \"onClick\"]);\n\n  var target = rest.target;\n\n  var props = _extends({}, rest, {\n    onClick: function onClick(event) {\n      try {\n        if (_onClick) _onClick(event);\n      } catch (ex) {\n        event.preventDefault();\n        throw ex;\n      }\n\n      if (!event.defaultPrevented && // onClick prevented default\n      event.button === 0 && ( // ignore everything but left clicks\n      !target || target === \"_self\") && // let browser handle \"target=_blank\" etc.\n      !isModifiedEvent(event) // ignore clicks with modifier keys\n      ) {\n          event.preventDefault();\n          navigate();\n        }\n    }\n  }); // React 15 compat\n\n\n  if (forwardRefShim !== forwardRef) {\n    props.ref = forwardedRef || innerRef;\n  } else {\n    props.ref = innerRef;\n  }\n  /* eslint-disable-next-line jsx-a11y/anchor-has-content */\n\n\n  return /*#__PURE__*/React.createElement(\"a\", props);\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n  LinkAnchor.displayName = \"LinkAnchor\";\n}\n/**\n * The public API for rendering a history-aware <a>.\n */\n\n\nvar Link = forwardRef(function (_ref2, forwardedRef) {\n  var _ref2$component = _ref2.component,\n      component = _ref2$component === void 0 ? LinkAnchor : _ref2$component,\n      replace = _ref2.replace,\n      to = _ref2.to,\n      innerRef = _ref2.innerRef,\n      rest = _objectWithoutPropertiesLoose(_ref2, [\"component\", \"replace\", \"to\", \"innerRef\"]);\n\n  return /*#__PURE__*/React.createElement(__RouterContext.Consumer, null, function (context) {\n    !context ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You should not use <Link> outside a <Router>\") : invariant(false) : void 0;\n    var history = context.history;\n    var location = normalizeToLocation(resolveToLocation(to, context.location), context.location);\n    var href = location ? history.createHref(location) : \"\";\n\n    var props = _extends({}, rest, {\n      href: href,\n      navigate: function navigate() {\n        var location = resolveToLocation(to, context.location);\n        var isDuplicateNavigation = createPath(context.location) === createPath(normalizeToLocation(location));\n        var method = replace || isDuplicateNavigation ? history.replace : history.push;\n        method(location);\n      }\n    }); // React 15 compat\n\n\n    if (forwardRefShim !== forwardRef) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return /*#__PURE__*/React.createElement(component, props);\n  });\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n  var toType = PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.func]);\n  var refType = PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.shape({\n    current: PropTypes.any\n  })]);\n  Link.displayName = \"Link\";\n  Link.propTypes = {\n    innerRef: refType,\n    onClick: PropTypes.func,\n    replace: PropTypes.bool,\n    target: PropTypes.string,\n    to: toType.isRequired\n  };\n}\n\nvar forwardRefShim$1 = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef$1 = React.forwardRef;\n\nif (typeof forwardRef$1 === \"undefined\") {\n  forwardRef$1 = forwardRefShim$1;\n}\n\nfunction joinClassnames() {\n  for (var _len = arguments.length, classnames = new Array(_len), _key = 0; _key < _len; _key++) {\n    classnames[_key] = arguments[_key];\n  }\n\n  return classnames.filter(function (i) {\n    return i;\n  }).join(\" \");\n}\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\n\n\nvar NavLink = forwardRef$1(function (_ref, forwardedRef) {\n  var _ref$ariaCurrent = _ref[\"aria-current\"],\n      ariaCurrent = _ref$ariaCurrent === void 0 ? \"page\" : _ref$ariaCurrent,\n      _ref$activeClassName = _ref.activeClassName,\n      activeClassName = _ref$activeClassName === void 0 ? \"active\" : _ref$activeClassName,\n      activeStyle = _ref.activeStyle,\n      classNameProp = _ref.className,\n      exact = _ref.exact,\n      isActiveProp = _ref.isActive,\n      locationProp = _ref.location,\n      sensitive = _ref.sensitive,\n      strict = _ref.strict,\n      styleProp = _ref.style,\n      to = _ref.to,\n      innerRef = _ref.innerRef,\n      rest = _objectWithoutPropertiesLoose(_ref, [\"aria-current\", \"activeClassName\", \"activeStyle\", \"className\", \"exact\", \"isActive\", \"location\", \"sensitive\", \"strict\", \"style\", \"to\", \"innerRef\"]);\n\n  return /*#__PURE__*/React.createElement(__RouterContext.Consumer, null, function (context) {\n    !context ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You should not use <NavLink> outside a <Router>\") : invariant(false) : void 0;\n    var currentLocation = locationProp || context.location;\n    var toLocation = normalizeToLocation(resolveToLocation(to, currentLocation), currentLocation);\n    var path = toLocation.pathname; // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202\n\n    var escapedPath = path && path.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n    var match = escapedPath ? matchPath(currentLocation.pathname, {\n      path: escapedPath,\n      exact: exact,\n      sensitive: sensitive,\n      strict: strict\n    }) : null;\n    var isActive = !!(isActiveProp ? isActiveProp(match, currentLocation) : match);\n    var className = isActive ? joinClassnames(classNameProp, activeClassName) : classNameProp;\n    var style = isActive ? _extends({}, styleProp, activeStyle) : styleProp;\n\n    var props = _extends({\n      \"aria-current\": isActive && ariaCurrent || null,\n      className: className,\n      style: style,\n      to: toLocation\n    }, rest); // React 15 compat\n\n\n    if (forwardRefShim$1 !== forwardRef$1) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return /*#__PURE__*/React.createElement(Link, props);\n  });\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n  NavLink.displayName = \"NavLink\";\n  var ariaCurrentType = PropTypes.oneOf([\"page\", \"step\", \"location\", \"date\", \"time\", \"true\", \"false\"]);\n  NavLink.propTypes = _extends({}, Link.propTypes, {\n    \"aria-current\": ariaCurrentType,\n    activeClassName: PropTypes.string,\n    activeStyle: PropTypes.object,\n    className: PropTypes.string,\n    exact: PropTypes.bool,\n    isActive: PropTypes.func,\n    location: PropTypes.object,\n    sensitive: PropTypes.bool,\n    strict: PropTypes.bool,\n    style: PropTypes.object\n  });\n}\n\nexport { BrowserRouter, HashRouter, Link, NavLink };\n//# sourceMappingURL=react-router-dom.js.map\n","/**\n * @remix-run/router v1.6.3\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Actions represent the type of change to a location value.\n */\nvar Action;\n(function (Action) {\n  /**\n   * A POP indicates a change to an arbitrary index in the history stack, such\n   * as a back or forward navigation. It does not describe the direction of the\n   * navigation, only that the current index changed.\n   *\n   * Note: This is the default action for newly created history objects.\n   */\n  Action[\"Pop\"] = \"POP\";\n  /**\n   * A PUSH indicates a new entry being added to the history stack, such as when\n   * a link is clicked and a new page loads. When this happens, all subsequent\n   * entries in the stack are lost.\n   */\n  Action[\"Push\"] = \"PUSH\";\n  /**\n   * A REPLACE indicates the entry at the current index in the history stack\n   * being replaced by a new one.\n   */\n  Action[\"Replace\"] = \"REPLACE\";\n})(Action || (Action = {}));\nconst PopStateEventType = \"popstate\";\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nfunction createMemoryHistory(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  let {\n    initialEntries = [\"/\"],\n    initialIndex,\n    v5Compat = false\n  } = options;\n  let entries; // Declare so we can access from createMemoryLocation\n  entries = initialEntries.map((entry, index) => createMemoryLocation(entry, typeof entry === \"string\" ? null : entry.state, index === 0 ? \"default\" : undefined));\n  let index = clampIndex(initialIndex == null ? entries.length - 1 : initialIndex);\n  let action = Action.Pop;\n  let listener = null;\n  function clampIndex(n) {\n    return Math.min(Math.max(n, 0), entries.length - 1);\n  }\n  function getCurrentLocation() {\n    return entries[index];\n  }\n  function createMemoryLocation(to, state, key) {\n    if (state === void 0) {\n      state = null;\n    }\n    let location = createLocation(entries ? getCurrentLocation().pathname : \"/\", to, state, key);\n    warning(location.pathname.charAt(0) === \"/\", \"relative pathnames are not supported in memory history: \" + JSON.stringify(to));\n    return location;\n  }\n  function createHref(to) {\n    return typeof to === \"string\" ? to : createPath(to);\n  }\n  let history = {\n    get index() {\n      return index;\n    },\n    get action() {\n      return action;\n    },\n    get location() {\n      return getCurrentLocation();\n    },\n    createHref,\n    createURL(to) {\n      return new URL(createHref(to), \"http://localhost\");\n    },\n    encodeLocation(to) {\n      let path = typeof to === \"string\" ? parsePath(to) : to;\n      return {\n        pathname: path.pathname || \"\",\n        search: path.search || \"\",\n        hash: path.hash || \"\"\n      };\n    },\n    push(to, state) {\n      action = Action.Push;\n      let nextLocation = createMemoryLocation(to, state);\n      index += 1;\n      entries.splice(index, entries.length, nextLocation);\n      if (v5Compat && listener) {\n        listener({\n          action,\n          location: nextLocation,\n          delta: 1\n        });\n      }\n    },\n    replace(to, state) {\n      action = Action.Replace;\n      let nextLocation = createMemoryLocation(to, state);\n      entries[index] = nextLocation;\n      if (v5Compat && listener) {\n        listener({\n          action,\n          location: nextLocation,\n          delta: 0\n        });\n      }\n    },\n    go(delta) {\n      action = Action.Pop;\n      let nextIndex = clampIndex(index + delta);\n      let nextLocation = entries[nextIndex];\n      index = nextIndex;\n      if (listener) {\n        listener({\n          action,\n          location: nextLocation,\n          delta\n        });\n      }\n    },\n    listen(fn) {\n      listener = fn;\n      return () => {\n        listener = null;\n      };\n    }\n  };\n  return history;\n}\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nfunction createBrowserHistory(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  function createBrowserLocation(window, globalHistory) {\n    let {\n      pathname,\n      search,\n      hash\n    } = window.location;\n    return createLocation(\"\", {\n      pathname,\n      search,\n      hash\n    },\n    // state defaults to `null` because `window.history.state` does\n    globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || \"default\");\n  }\n  function createBrowserHref(window, to) {\n    return typeof to === \"string\" ? to : createPath(to);\n  }\n  return getUrlBasedHistory(createBrowserLocation, createBrowserHref, null, options);\n}\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nfunction createHashHistory(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  function createHashLocation(window, globalHistory) {\n    let {\n      pathname = \"/\",\n      search = \"\",\n      hash = \"\"\n    } = parsePath(window.location.hash.substr(1));\n    return createLocation(\"\", {\n      pathname,\n      search,\n      hash\n    },\n    // state defaults to `null` because `window.history.state` does\n    globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || \"default\");\n  }\n  function createHashHref(window, to) {\n    let base = window.document.querySelector(\"base\");\n    let href = \"\";\n    if (base && base.getAttribute(\"href\")) {\n      let url = window.location.href;\n      let hashIndex = url.indexOf(\"#\");\n      href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n    }\n    return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n  }\n  function validateHashLocation(location, to) {\n    warning(location.pathname.charAt(0) === \"/\", \"relative pathnames are not supported in hash history.push(\" + JSON.stringify(to) + \")\");\n  }\n  return getUrlBasedHistory(createHashLocation, createHashHref, validateHashLocation, options);\n}\nfunction invariant(value, message) {\n  if (value === false || value === null || typeof value === \"undefined\") {\n    throw new Error(message);\n  }\n}\nfunction warning(cond, message) {\n  if (!cond) {\n    // eslint-disable-next-line no-console\n    if (typeof console !== \"undefined\") console.warn(message);\n    try {\n      // Welcome to debugging history!\n      //\n      // This error is thrown as a convenience so you can more easily\n      // find the source for a warning that appears in the console by\n      // enabling \"pause on exceptions\" in your JavaScript debugger.\n      throw new Error(message);\n      // eslint-disable-next-line no-empty\n    } catch (e) {}\n  }\n}\nfunction createKey() {\n  return Math.random().toString(36).substr(2, 8);\n}\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location, index) {\n  return {\n    usr: location.state,\n    key: location.key,\n    idx: index\n  };\n}\n/**\n * Creates a Location object with a unique key from the given Path\n */\nfunction createLocation(current, to, state, key) {\n  if (state === void 0) {\n    state = null;\n  }\n  let location = _extends({\n    pathname: typeof current === \"string\" ? current : current.pathname,\n    search: \"\",\n    hash: \"\"\n  }, typeof to === \"string\" ? parsePath(to) : to, {\n    state,\n    // TODO: This could be cleaned up.  push/replace should probably just take\n    // full Locations now and avoid the need to run through this flow at all\n    // But that's a pretty big refactor to the current test suite so going to\n    // keep as is for the time being and just let any incoming keys take precedence\n    key: to && to.key || key || createKey()\n  });\n  return location;\n}\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nfunction createPath(_ref) {\n  let {\n    pathname = \"/\",\n    search = \"\",\n    hash = \"\"\n  } = _ref;\n  if (search && search !== \"?\") pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n  if (hash && hash !== \"#\") pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n  return pathname;\n}\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nfunction parsePath(path) {\n  let parsedPath = {};\n  if (path) {\n    let hashIndex = path.indexOf(\"#\");\n    if (hashIndex >= 0) {\n      parsedPath.hash = path.substr(hashIndex);\n      path = path.substr(0, hashIndex);\n    }\n    let searchIndex = path.indexOf(\"?\");\n    if (searchIndex >= 0) {\n      parsedPath.search = path.substr(searchIndex);\n      path = path.substr(0, searchIndex);\n    }\n    if (path) {\n      parsedPath.pathname = path;\n    }\n  }\n  return parsedPath;\n}\nfunction getUrlBasedHistory(getLocation, createHref, validateLocation, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  let {\n    window = document.defaultView,\n    v5Compat = false\n  } = options;\n  let globalHistory = window.history;\n  let action = Action.Pop;\n  let listener = null;\n  let index = getIndex();\n  // Index should only be null when we initialize. If not, it's because the\n  // user called history.pushState or history.replaceState directly, in which\n  // case we should log a warning as it will result in bugs.\n  if (index == null) {\n    index = 0;\n    globalHistory.replaceState(_extends({}, globalHistory.state, {\n      idx: index\n    }), \"\");\n  }\n  function getIndex() {\n    let state = globalHistory.state || {\n      idx: null\n    };\n    return state.idx;\n  }\n  function handlePop() {\n    action = Action.Pop;\n    let nextIndex = getIndex();\n    let delta = nextIndex == null ? null : nextIndex - index;\n    index = nextIndex;\n    if (listener) {\n      listener({\n        action,\n        location: history.location,\n        delta\n      });\n    }\n  }\n  function push(to, state) {\n    action = Action.Push;\n    let location = createLocation(history.location, to, state);\n    if (validateLocation) validateLocation(location, to);\n    index = getIndex() + 1;\n    let historyState = getHistoryState(location, index);\n    let url = history.createHref(location);\n    // try...catch because iOS limits us to 100 pushState calls :/\n    try {\n      globalHistory.pushState(historyState, \"\", url);\n    } catch (error) {\n      // If the exception is because `state` can't be serialized, let that throw\n      // outwards just like a replace call would so the dev knows the cause\n      // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n      // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n      if (error instanceof DOMException && error.name === \"DataCloneError\") {\n        throw error;\n      }\n      // They are going to lose state here, but there is no real\n      // way to warn them about it since the page will refresh...\n      window.location.assign(url);\n    }\n    if (v5Compat && listener) {\n      listener({\n        action,\n        location: history.location,\n        delta: 1\n      });\n    }\n  }\n  function replace(to, state) {\n    action = Action.Replace;\n    let location = createLocation(history.location, to, state);\n    if (validateLocation) validateLocation(location, to);\n    index = getIndex();\n    let historyState = getHistoryState(location, index);\n    let url = history.createHref(location);\n    globalHistory.replaceState(historyState, \"\", url);\n    if (v5Compat && listener) {\n      listener({\n        action,\n        location: history.location,\n        delta: 0\n      });\n    }\n  }\n  function createURL(to) {\n    // window.location.origin is \"null\" (the literal string value) in Firefox\n    // under certain conditions, notably when serving from a local HTML file\n    // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n    let base = window.location.origin !== \"null\" ? window.location.origin : window.location.href;\n    let href = typeof to === \"string\" ? to : createPath(to);\n    invariant(base, \"No window.location.(origin|href) available to create URL for href: \" + href);\n    return new URL(href, base);\n  }\n  let history = {\n    get action() {\n      return action;\n    },\n    get location() {\n      return getLocation(window, globalHistory);\n    },\n    listen(fn) {\n      if (listener) {\n        throw new Error(\"A history only accepts one active listener\");\n      }\n      window.addEventListener(PopStateEventType, handlePop);\n      listener = fn;\n      return () => {\n        window.removeEventListener(PopStateEventType, handlePop);\n        listener = null;\n      };\n    },\n    createHref(to) {\n      return createHref(window, to);\n    },\n    createURL,\n    encodeLocation(to) {\n      // Encode a Location the same way window.location would\n      let url = createURL(to);\n      return {\n        pathname: url.pathname,\n        search: url.search,\n        hash: url.hash\n      };\n    },\n    push,\n    replace,\n    go(n) {\n      return globalHistory.go(n);\n    }\n  };\n  return history;\n}\n//#endregion\n\nvar ResultType;\n(function (ResultType) {\n  ResultType[\"data\"] = \"data\";\n  ResultType[\"deferred\"] = \"deferred\";\n  ResultType[\"redirect\"] = \"redirect\";\n  ResultType[\"error\"] = \"error\";\n})(ResultType || (ResultType = {}));\nconst immutableRouteKeys = new Set([\"lazy\", \"caseSensitive\", \"path\", \"id\", \"index\", \"children\"]);\nfunction isIndexRoute(route) {\n  return route.index === true;\n}\n// Walk the route tree generating unique IDs where necessary so we are working\n// solely with AgnosticDataRouteObject's within the Router\nfunction convertRoutesToDataRoutes(routes, mapRouteProperties, parentPath, manifest) {\n  if (parentPath === void 0) {\n    parentPath = [];\n  }\n  if (manifest === void 0) {\n    manifest = {};\n  }\n  return routes.map((route, index) => {\n    let treePath = [...parentPath, index];\n    let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n    invariant(route.index !== true || !route.children, \"Cannot specify children on an index route\");\n    invariant(!manifest[id], \"Found a route id collision on id \\\"\" + id + \"\\\".  Route \" + \"id's must be globally unique within Data Router usages\");\n    if (isIndexRoute(route)) {\n      let indexRoute = _extends({}, route, mapRouteProperties(route), {\n        id\n      });\n      manifest[id] = indexRoute;\n      return indexRoute;\n    } else {\n      let pathOrLayoutRoute = _extends({}, route, mapRouteProperties(route), {\n        id,\n        children: undefined\n      });\n      manifest[id] = pathOrLayoutRoute;\n      if (route.children) {\n        pathOrLayoutRoute.children = convertRoutesToDataRoutes(route.children, mapRouteProperties, treePath, manifest);\n      }\n      return pathOrLayoutRoute;\n    }\n  });\n}\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/utils/match-routes\n */\nfunction matchRoutes(routes, locationArg, basename) {\n  if (basename === void 0) {\n    basename = \"/\";\n  }\n  let location = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n  let pathname = stripBasename(location.pathname || \"/\", basename);\n  if (pathname == null) {\n    return null;\n  }\n  let branches = flattenRoutes(routes);\n  rankRouteBranches(branches);\n  let matches = null;\n  for (let i = 0; matches == null && i < branches.length; ++i) {\n    matches = matchRouteBranch(branches[i],\n    // Incoming pathnames are generally encoded from either window.location\n    // or from router.navigate, but we want to match against the unencoded\n    // paths in the route definitions.  Memory router locations won't be\n    // encoded here but there also shouldn't be anything to decode so this\n    // should be a safe operation.  This avoids needing matchRoutes to be\n    // history-aware.\n    safelyDecodeURI(pathname));\n  }\n  return matches;\n}\nfunction flattenRoutes(routes, branches, parentsMeta, parentPath) {\n  if (branches === void 0) {\n    branches = [];\n  }\n  if (parentsMeta === void 0) {\n    parentsMeta = [];\n  }\n  if (parentPath === void 0) {\n    parentPath = \"\";\n  }\n  let flattenRoute = (route, index, relativePath) => {\n    let meta = {\n      relativePath: relativePath === undefined ? route.path || \"\" : relativePath,\n      caseSensitive: route.caseSensitive === true,\n      childrenIndex: index,\n      route\n    };\n    if (meta.relativePath.startsWith(\"/\")) {\n      invariant(meta.relativePath.startsWith(parentPath), \"Absolute route path \\\"\" + meta.relativePath + \"\\\" nested under path \" + (\"\\\"\" + parentPath + \"\\\" is not valid. An absolute child route path \") + \"must start with the combined path of all its parent routes.\");\n      meta.relativePath = meta.relativePath.slice(parentPath.length);\n    }\n    let path = joinPaths([parentPath, meta.relativePath]);\n    let routesMeta = parentsMeta.concat(meta);\n    // Add the children before adding this route to the array so we traverse the\n    // route tree depth-first and child routes appear before their parents in\n    // the \"flattened\" version.\n    if (route.children && route.children.length > 0) {\n      invariant(\n      // Our types know better, but runtime JS may not!\n      // @ts-expect-error\n      route.index !== true, \"Index routes must not have child routes. Please remove \" + (\"all child routes from route path \\\"\" + path + \"\\\".\"));\n      flattenRoutes(route.children, branches, routesMeta, path);\n    }\n    // Routes without a path shouldn't ever match by themselves unless they are\n    // index routes, so don't add them to the list of possible branches.\n    if (route.path == null && !route.index) {\n      return;\n    }\n    branches.push({\n      path,\n      score: computeScore(path, route.index),\n      routesMeta\n    });\n  };\n  routes.forEach((route, index) => {\n    var _route$path;\n    // coarse-grain check for optional params\n    if (route.path === \"\" || !((_route$path = route.path) != null && _route$path.includes(\"?\"))) {\n      flattenRoute(route, index);\n    } else {\n      for (let exploded of explodeOptionalSegments(route.path)) {\n        flattenRoute(route, index, exploded);\n      }\n    }\n  });\n  return branches;\n}\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path) {\n  let segments = path.split(\"/\");\n  if (segments.length === 0) return [];\n  let [first, ...rest] = segments;\n  // Optional path segments are denoted by a trailing `?`\n  let isOptional = first.endsWith(\"?\");\n  // Compute the corresponding required segment: `foo?` -> `foo`\n  let required = first.replace(/\\?$/, \"\");\n  if (rest.length === 0) {\n    // Intepret empty string as omitting an optional segment\n    // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n    return isOptional ? [required, \"\"] : [required];\n  }\n  let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n  let result = [];\n  // All child paths with the prefix.  Do this for all children before the\n  // optional version for all children so we get consistent ordering where the\n  // parent optional aspect is preferred as required.  Otherwise, we can get\n  // child sections interspersed where deeper optional segments are higher than\n  // parent optional segments, where for example, /:two would explodes _earlier_\n  // then /:one.  By always including the parent as required _for all children_\n  // first, we avoid this issue\n  result.push(...restExploded.map(subpath => subpath === \"\" ? required : [required, subpath].join(\"/\")));\n  // Then if this is an optional value, add all child versions without\n  if (isOptional) {\n    result.push(...restExploded);\n  }\n  // for absolute paths, ensure `/` instead of empty segment\n  return result.map(exploded => path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded);\n}\nfunction rankRouteBranches(branches) {\n  branches.sort((a, b) => a.score !== b.score ? b.score - a.score // Higher score first\n  : compareIndexes(a.routesMeta.map(meta => meta.childrenIndex), b.routesMeta.map(meta => meta.childrenIndex)));\n}\nconst paramRe = /^:\\w+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = s => s === \"*\";\nfunction computeScore(path, index) {\n  let segments = path.split(\"/\");\n  let initialScore = segments.length;\n  if (segments.some(isSplat)) {\n    initialScore += splatPenalty;\n  }\n  if (index) {\n    initialScore += indexRouteValue;\n  }\n  return segments.filter(s => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === \"\" ? emptySegmentValue : staticSegmentValue), initialScore);\n}\nfunction compareIndexes(a, b) {\n  let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n  return siblings ?\n  // If two routes are siblings, we should try to match the earlier sibling\n  // first. This allows people to have fine-grained control over the matching\n  // behavior by simply putting routes with identical paths in the order they\n  // want them tried.\n  a[a.length - 1] - b[b.length - 1] :\n  // Otherwise, it doesn't really make sense to rank non-siblings by index,\n  // so they sort equally.\n  0;\n}\nfunction matchRouteBranch(branch, pathname) {\n  let {\n    routesMeta\n  } = branch;\n  let matchedParams = {};\n  let matchedPathname = \"/\";\n  let matches = [];\n  for (let i = 0; i < routesMeta.length; ++i) {\n    let meta = routesMeta[i];\n    let end = i === routesMeta.length - 1;\n    let remainingPathname = matchedPathname === \"/\" ? pathname : pathname.slice(matchedPathname.length) || \"/\";\n    let match = matchPath({\n      path: meta.relativePath,\n      caseSensitive: meta.caseSensitive,\n      end\n    }, remainingPathname);\n    if (!match) return null;\n    Object.assign(matchedParams, match.params);\n    let route = meta.route;\n    matches.push({\n      // TODO: Can this as be avoided?\n      params: matchedParams,\n      pathname: joinPaths([matchedPathname, match.pathname]),\n      pathnameBase: normalizePathname(joinPaths([matchedPathname, match.pathnameBase])),\n      route\n    });\n    if (match.pathnameBase !== \"/\") {\n      matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n    }\n  }\n  return matches;\n}\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/utils/generate-path\n */\nfunction generatePath(originalPath, params) {\n  if (params === void 0) {\n    params = {};\n  }\n  let path = originalPath;\n  if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n    warning(false, \"Route path \\\"\" + path + \"\\\" will be treated as if it were \" + (\"\\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\" because the `*` character must \") + \"always follow a `/` in the pattern. To get rid of this warning, \" + (\"please change the route path to \\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\".\"));\n    path = path.replace(/\\*$/, \"/*\");\n  }\n  // ensure `/` is added at the beginning if the path is absolute\n  const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n  const segments = path.split(/\\/+/).map((segment, index, array) => {\n    const isLastSegment = index === array.length - 1;\n    // only apply the splat if it's the last segment\n    if (isLastSegment && segment === \"*\") {\n      const star = \"*\";\n      const starParam = params[star];\n      // Apply the splat\n      return starParam;\n    }\n    const keyMatch = segment.match(/^:(\\w+)(\\??)$/);\n    if (keyMatch) {\n      const [, key, optional] = keyMatch;\n      let param = params[key];\n      if (optional === \"?\") {\n        return param == null ? \"\" : param;\n      }\n      if (param == null) {\n        invariant(false, \"Missing \\\":\" + key + \"\\\" param\");\n      }\n      return param;\n    }\n    // Remove any optional markers from optional static segments\n    return segment.replace(/\\?$/g, \"\");\n  })\n  // Remove empty segments\n  .filter(segment => !!segment);\n  return prefix + segments.join(\"/\");\n}\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/utils/match-path\n */\nfunction matchPath(pattern, pathname) {\n  if (typeof pattern === \"string\") {\n    pattern = {\n      path: pattern,\n      caseSensitive: false,\n      end: true\n    };\n  }\n  let [matcher, paramNames] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);\n  let match = pathname.match(matcher);\n  if (!match) return null;\n  let matchedPathname = match[0];\n  let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n  let captureGroups = match.slice(1);\n  let params = paramNames.reduce((memo, paramName, index) => {\n    // We need to compute the pathnameBase here using the raw splat value\n    // instead of using params[\"*\"] later because it will be decoded then\n    if (paramName === \"*\") {\n      let splatValue = captureGroups[index] || \"\";\n      pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\\/+$/, \"$1\");\n    }\n    memo[paramName] = safelyDecodeURIComponent(captureGroups[index] || \"\", paramName);\n    return memo;\n  }, {});\n  return {\n    params,\n    pathname: matchedPathname,\n    pathnameBase,\n    pattern\n  };\n}\nfunction compilePath(path, caseSensitive, end) {\n  if (caseSensitive === void 0) {\n    caseSensitive = false;\n  }\n  if (end === void 0) {\n    end = true;\n  }\n  warning(path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"), \"Route path \\\"\" + path + \"\\\" will be treated as if it were \" + (\"\\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\" because the `*` character must \") + \"always follow a `/` in the pattern. To get rid of this warning, \" + (\"please change the route path to \\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\".\"));\n  let paramNames = [];\n  let regexpSource = \"^\" + path.replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n  .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n  .replace(/[\\\\.*+^$?{}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n  .replace(/\\/:(\\w+)/g, (_, paramName) => {\n    paramNames.push(paramName);\n    return \"/([^\\\\/]+)\";\n  });\n  if (path.endsWith(\"*\")) {\n    paramNames.push(\"*\");\n    regexpSource += path === \"*\" || path === \"/*\" ? \"(.*)$\" // Already matched the initial /, just match the rest\n    : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n  } else if (end) {\n    // When matching to the end, ignore trailing slashes\n    regexpSource += \"\\\\/*$\";\n  } else if (path !== \"\" && path !== \"/\") {\n    // If our path is non-empty and contains anything beyond an initial slash,\n    // then we have _some_ form of path in our regex so we should expect to\n    // match only if we find the end of this path segment.  Look for an optional\n    // non-captured trailing slash (to match a portion of the URL) or the end\n    // of the path (if we've matched to the end).  We used to do this with a\n    // word boundary but that gives false positives on routes like\n    // /user-preferences since `-` counts as a word boundary.\n    regexpSource += \"(?:(?=\\\\/|$))\";\n  } else ;\n  let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n  return [matcher, paramNames];\n}\nfunction safelyDecodeURI(value) {\n  try {\n    return decodeURI(value);\n  } catch (error) {\n    warning(false, \"The URL path \\\"\" + value + \"\\\" could not be decoded because it is is a \" + \"malformed URL segment. This is probably due to a bad percent \" + (\"encoding (\" + error + \").\"));\n    return value;\n  }\n}\nfunction safelyDecodeURIComponent(value, paramName) {\n  try {\n    return decodeURIComponent(value);\n  } catch (error) {\n    warning(false, \"The value for the URL param \\\"\" + paramName + \"\\\" will not be decoded because\" + (\" the string \\\"\" + value + \"\\\" is a malformed URL segment. This is probably\") + (\" due to a bad percent encoding (\" + error + \").\"));\n    return value;\n  }\n}\n/**\n * @private\n */\nfunction stripBasename(pathname, basename) {\n  if (basename === \"/\") return pathname;\n  if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n    return null;\n  }\n  // We want to leave trailing slash behavior in the user's control, so if they\n  // specify a basename with a trailing slash, we should support it\n  let startIndex = basename.endsWith(\"/\") ? basename.length - 1 : basename.length;\n  let nextChar = pathname.charAt(startIndex);\n  if (nextChar && nextChar !== \"/\") {\n    // pathname does not start with basename/\n    return null;\n  }\n  return pathname.slice(startIndex) || \"/\";\n}\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/utils/resolve-path\n */\nfunction resolvePath(to, fromPathname) {\n  if (fromPathname === void 0) {\n    fromPathname = \"/\";\n  }\n  let {\n    pathname: toPathname,\n    search = \"\",\n    hash = \"\"\n  } = typeof to === \"string\" ? parsePath(to) : to;\n  let pathname = toPathname ? toPathname.startsWith(\"/\") ? toPathname : resolvePathname(toPathname, fromPathname) : fromPathname;\n  return {\n    pathname,\n    search: normalizeSearch(search),\n    hash: normalizeHash(hash)\n  };\n}\nfunction resolvePathname(relativePath, fromPathname) {\n  let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n  let relativeSegments = relativePath.split(\"/\");\n  relativeSegments.forEach(segment => {\n    if (segment === \"..\") {\n      // Keep the root \"\" segment so the pathname starts at /\n      if (segments.length > 1) segments.pop();\n    } else if (segment !== \".\") {\n      segments.push(segment);\n    }\n  });\n  return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\nfunction getInvalidPathError(char, field, dest, path) {\n  return \"Cannot include a '\" + char + \"' character in a manually specified \" + (\"`to.\" + field + \"` field [\" + JSON.stringify(path) + \"].  Please separate it out to the \") + (\"`to.\" + dest + \"` field. Alternatively you may provide the full path as \") + \"a string in <Link to=\\\"...\\\"> and the router will parse it for you.\";\n}\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same.  Both of the following examples should link back to the root:\n *\n *   <Route path=\"/\">\n *     <Route path=\"accounts\" element={<Link to=\"..\"}>\n *   </Route>\n *\n *   <Route path=\"/\">\n *     <Route path=\"accounts\">\n *       <Route element={<AccountsLayout />}>       // <-- Does not contribute\n *         <Route index element={<Link to=\"..\"} />  // <-- Does not contribute\n *       </Route\n *     </Route>\n *   </Route>\n */\nfunction getPathContributingMatches(matches) {\n  return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);\n}\n/**\n * @private\n */\nfunction resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {\n  if (isPathRelative === void 0) {\n    isPathRelative = false;\n  }\n  let to;\n  if (typeof toArg === \"string\") {\n    to = parsePath(toArg);\n  } else {\n    to = _extends({}, toArg);\n    invariant(!to.pathname || !to.pathname.includes(\"?\"), getInvalidPathError(\"?\", \"pathname\", \"search\", to));\n    invariant(!to.pathname || !to.pathname.includes(\"#\"), getInvalidPathError(\"#\", \"pathname\", \"hash\", to));\n    invariant(!to.search || !to.search.includes(\"#\"), getInvalidPathError(\"#\", \"search\", \"hash\", to));\n  }\n  let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n  let toPathname = isEmptyPath ? \"/\" : to.pathname;\n  let from;\n  // Routing is relative to the current pathname if explicitly requested.\n  //\n  // If a pathname is explicitly provided in `to`, it should be relative to the\n  // route context. This is explained in `Note on `<Link to>` values` in our\n  // migration guide from v5 as a means of disambiguation between `to` values\n  // that begin with `/` and those that do not. However, this is problematic for\n  // `to` values that do not provide a pathname. `to` can simply be a search or\n  // hash string, in which case we should assume that the navigation is relative\n  // to the current location's pathname and *not* the route pathname.\n  if (isPathRelative || toPathname == null) {\n    from = locationPathname;\n  } else {\n    let routePathnameIndex = routePathnames.length - 1;\n    if (toPathname.startsWith(\"..\")) {\n      let toSegments = toPathname.split(\"/\");\n      // Each leading .. segment means \"go up one route\" instead of \"go up one\n      // URL segment\".  This is a key difference from how <a href> works and a\n      // major reason we call this a \"to\" value instead of a \"href\".\n      while (toSegments[0] === \"..\") {\n        toSegments.shift();\n        routePathnameIndex -= 1;\n      }\n      to.pathname = toSegments.join(\"/\");\n    }\n    // If there are more \"..\" segments than parent routes, resolve relative to\n    // the root / URL.\n    from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n  }\n  let path = resolvePath(to, from);\n  // Ensure the pathname has a trailing slash if the original \"to\" had one\n  let hasExplicitTrailingSlash = toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n  // Or if this was a link to the current path which has a trailing slash\n  let hasCurrentTrailingSlash = (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n  if (!path.pathname.endsWith(\"/\") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n    path.pathname += \"/\";\n  }\n  return path;\n}\n/**\n * @private\n */\nfunction getToPathname(to) {\n  // Empty strings should be treated the same as / paths\n  return to === \"\" || to.pathname === \"\" ? \"/\" : typeof to === \"string\" ? parsePath(to).pathname : to.pathname;\n}\n/**\n * @private\n */\nconst joinPaths = paths => paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n/**\n * @private\n */\nconst normalizePathname = pathname => pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n/**\n * @private\n */\nconst normalizeSearch = search => !search || search === \"?\" ? \"\" : search.startsWith(\"?\") ? search : \"?\" + search;\n/**\n * @private\n */\nconst normalizeHash = hash => !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\nconst json = function json(data, init) {\n  if (init === void 0) {\n    init = {};\n  }\n  let responseInit = typeof init === \"number\" ? {\n    status: init\n  } : init;\n  let headers = new Headers(responseInit.headers);\n  if (!headers.has(\"Content-Type\")) {\n    headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n  }\n  return new Response(JSON.stringify(data), _extends({}, responseInit, {\n    headers\n  }));\n};\nclass AbortedDeferredError extends Error {}\nclass DeferredData {\n  constructor(data, responseInit) {\n    this.pendingKeysSet = new Set();\n    this.subscribers = new Set();\n    this.deferredKeys = [];\n    invariant(data && typeof data === \"object\" && !Array.isArray(data), \"defer() only accepts plain objects\");\n    // Set up an AbortController + Promise we can race against to exit early\n    // cancellation\n    let reject;\n    this.abortPromise = new Promise((_, r) => reject = r);\n    this.controller = new AbortController();\n    let onAbort = () => reject(new AbortedDeferredError(\"Deferred data aborted\"));\n    this.unlistenAbortSignal = () => this.controller.signal.removeEventListener(\"abort\", onAbort);\n    this.controller.signal.addEventListener(\"abort\", onAbort);\n    this.data = Object.entries(data).reduce((acc, _ref) => {\n      let [key, value] = _ref;\n      return Object.assign(acc, {\n        [key]: this.trackPromise(key, value)\n      });\n    }, {});\n    if (this.done) {\n      // All incoming values were resolved\n      this.unlistenAbortSignal();\n    }\n    this.init = responseInit;\n  }\n  trackPromise(key, value) {\n    if (!(value instanceof Promise)) {\n      return value;\n    }\n    this.deferredKeys.push(key);\n    this.pendingKeysSet.add(key);\n    // We store a little wrapper promise that will be extended with\n    // _data/_error props upon resolve/reject\n    let promise = Promise.race([value, this.abortPromise]).then(data => this.onSettle(promise, key, null, data), error => this.onSettle(promise, key, error));\n    // Register rejection listeners to avoid uncaught promise rejections on\n    // errors or aborted deferred values\n    promise.catch(() => {});\n    Object.defineProperty(promise, \"_tracked\", {\n      get: () => true\n    });\n    return promise;\n  }\n  onSettle(promise, key, error, data) {\n    if (this.controller.signal.aborted && error instanceof AbortedDeferredError) {\n      this.unlistenAbortSignal();\n      Object.defineProperty(promise, \"_error\", {\n        get: () => error\n      });\n      return Promise.reject(error);\n    }\n    this.pendingKeysSet.delete(key);\n    if (this.done) {\n      // Nothing left to abort!\n      this.unlistenAbortSignal();\n    }\n    if (error) {\n      Object.defineProperty(promise, \"_error\", {\n        get: () => error\n      });\n      this.emit(false, key);\n      return Promise.reject(error);\n    }\n    Object.defineProperty(promise, \"_data\", {\n      get: () => data\n    });\n    this.emit(false, key);\n    return data;\n  }\n  emit(aborted, settledKey) {\n    this.subscribers.forEach(subscriber => subscriber(aborted, settledKey));\n  }\n  subscribe(fn) {\n    this.subscribers.add(fn);\n    return () => this.subscribers.delete(fn);\n  }\n  cancel() {\n    this.controller.abort();\n    this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n    this.emit(true);\n  }\n  async resolveData(signal) {\n    let aborted = false;\n    if (!this.done) {\n      let onAbort = () => this.cancel();\n      signal.addEventListener(\"abort\", onAbort);\n      aborted = await new Promise(resolve => {\n        this.subscribe(aborted => {\n          signal.removeEventListener(\"abort\", onAbort);\n          if (aborted || this.done) {\n            resolve(aborted);\n          }\n        });\n      });\n    }\n    return aborted;\n  }\n  get done() {\n    return this.pendingKeysSet.size === 0;\n  }\n  get unwrappedData() {\n    invariant(this.data !== null && this.done, \"Can only unwrap data on initialized and settled deferreds\");\n    return Object.entries(this.data).reduce((acc, _ref2) => {\n      let [key, value] = _ref2;\n      return Object.assign(acc, {\n        [key]: unwrapTrackedPromise(value)\n      });\n    }, {});\n  }\n  get pendingKeys() {\n    return Array.from(this.pendingKeysSet);\n  }\n}\nfunction isTrackedPromise(value) {\n  return value instanceof Promise && value._tracked === true;\n}\nfunction unwrapTrackedPromise(value) {\n  if (!isTrackedPromise(value)) {\n    return value;\n  }\n  if (value._error) {\n    throw value._error;\n  }\n  return value._data;\n}\nconst defer = function defer(data, init) {\n  if (init === void 0) {\n    init = {};\n  }\n  let responseInit = typeof init === \"number\" ? {\n    status: init\n  } : init;\n  return new DeferredData(data, responseInit);\n};\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nconst redirect = function redirect(url, init) {\n  if (init === void 0) {\n    init = 302;\n  }\n  let responseInit = init;\n  if (typeof responseInit === \"number\") {\n    responseInit = {\n      status: responseInit\n    };\n  } else if (typeof responseInit.status === \"undefined\") {\n    responseInit.status = 302;\n  }\n  let headers = new Headers(responseInit.headers);\n  headers.set(\"Location\", url);\n  return new Response(null, _extends({}, responseInit, {\n    headers\n  }));\n};\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n */\nclass ErrorResponse {\n  constructor(status, statusText, data, internal) {\n    if (internal === void 0) {\n      internal = false;\n    }\n    this.status = status;\n    this.statusText = statusText || \"\";\n    this.internal = internal;\n    if (data instanceof Error) {\n      this.data = data.toString();\n      this.error = data;\n    } else {\n      this.data = data;\n    }\n  }\n}\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nfunction isRouteErrorResponse(error) {\n  return error != null && typeof error.status === \"number\" && typeof error.statusText === \"string\" && typeof error.internal === \"boolean\" && \"data\" in error;\n}\n\nconst validMutationMethodsArr = [\"post\", \"put\", \"patch\", \"delete\"];\nconst validMutationMethods = new Set(validMutationMethodsArr);\nconst validRequestMethodsArr = [\"get\", ...validMutationMethodsArr];\nconst validRequestMethods = new Set(validRequestMethodsArr);\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\nconst IDLE_NAVIGATION = {\n  state: \"idle\",\n  location: undefined,\n  formMethod: undefined,\n  formAction: undefined,\n  formEncType: undefined,\n  formData: undefined\n};\nconst IDLE_FETCHER = {\n  state: \"idle\",\n  data: undefined,\n  formMethod: undefined,\n  formAction: undefined,\n  formEncType: undefined,\n  formData: undefined\n};\nconst IDLE_BLOCKER = {\n  state: \"unblocked\",\n  proceed: undefined,\n  reset: undefined,\n  location: undefined\n};\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst defaultMapRouteProperties = route => ({\n  hasErrorBoundary: Boolean(route.hasErrorBoundary)\n});\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Create a router and listen to history POP navigations\n */\nfunction createRouter(init) {\n  const routerWindow = init.window ? init.window : typeof window !== \"undefined\" ? window : undefined;\n  const isBrowser = typeof routerWindow !== \"undefined\" && typeof routerWindow.document !== \"undefined\" && typeof routerWindow.document.createElement !== \"undefined\";\n  const isServer = !isBrowser;\n  invariant(init.routes.length > 0, \"You must provide a non-empty routes array to createRouter\");\n  let mapRouteProperties;\n  if (init.mapRouteProperties) {\n    mapRouteProperties = init.mapRouteProperties;\n  } else if (init.detectErrorBoundary) {\n    // If they are still using the deprecated version, wrap it with the new API\n    let detectErrorBoundary = init.detectErrorBoundary;\n    mapRouteProperties = route => ({\n      hasErrorBoundary: detectErrorBoundary(route)\n    });\n  } else {\n    mapRouteProperties = defaultMapRouteProperties;\n  }\n  // Routes keyed by ID\n  let manifest = {};\n  // Routes in tree format for matching\n  let dataRoutes = convertRoutesToDataRoutes(init.routes, mapRouteProperties, undefined, manifest);\n  let inFlightDataRoutes;\n  let basename = init.basename || \"/\";\n  // Config driven behavior flags\n  let future = _extends({\n    v7_normalizeFormMethod: false,\n    v7_prependBasename: false\n  }, init.future);\n  // Cleanup function for history\n  let unlistenHistory = null;\n  // Externally-provided functions to call on all state changes\n  let subscribers = new Set();\n  // Externally-provided object to hold scroll restoration locations during routing\n  let savedScrollPositions = null;\n  // Externally-provided function to get scroll restoration keys\n  let getScrollRestorationKey = null;\n  // Externally-provided function to get current scroll position\n  let getScrollPosition = null;\n  // One-time flag to control the initial hydration scroll restoration.  Because\n  // we don't get the saved positions from <ScrollRestoration /> until _after_\n  // the initial render, we need to manually trigger a separate updateState to\n  // send along the restoreScrollPosition\n  // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n  // SSR did the initial scroll restoration.\n  let initialScrollRestored = init.hydrationData != null;\n  let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n  let initialErrors = null;\n  if (initialMatches == null) {\n    // If we do not match a user-provided-route, fall back to the root\n    // to allow the error boundary to take over\n    let error = getInternalRouterError(404, {\n      pathname: init.history.location.pathname\n    });\n    let {\n      matches,\n      route\n    } = getShortCircuitMatches(dataRoutes);\n    initialMatches = matches;\n    initialErrors = {\n      [route.id]: error\n    };\n  }\n  let initialized =\n  // All initialMatches need to be loaded before we're ready.  If we have lazy\n  // functions around still then we'll need to run them in initialize()\n  !initialMatches.some(m => m.route.lazy) && (\n  // And we have to either have no loaders or have been provided hydrationData\n  !initialMatches.some(m => m.route.loader) || init.hydrationData != null);\n  let router;\n  let state = {\n    historyAction: init.history.action,\n    location: init.history.location,\n    matches: initialMatches,\n    initialized,\n    navigation: IDLE_NAVIGATION,\n    // Don't restore on initial updateState() if we were SSR'd\n    restoreScrollPosition: init.hydrationData != null ? false : null,\n    preventScrollReset: false,\n    revalidation: \"idle\",\n    loaderData: init.hydrationData && init.hydrationData.loaderData || {},\n    actionData: init.hydrationData && init.hydrationData.actionData || null,\n    errors: init.hydrationData && init.hydrationData.errors || initialErrors,\n    fetchers: new Map(),\n    blockers: new Map()\n  };\n  // -- Stateful internal variables to manage navigations --\n  // Current navigation in progress (to be committed in completeNavigation)\n  let pendingAction = Action.Pop;\n  // Should the current navigation prevent the scroll reset if scroll cannot\n  // be restored?\n  let pendingPreventScrollReset = false;\n  // AbortController for the active navigation\n  let pendingNavigationController;\n  // We use this to avoid touching history in completeNavigation if a\n  // revalidation is entirely uninterrupted\n  let isUninterruptedRevalidation = false;\n  // Use this internal flag to force revalidation of all loaders:\n  //  - submissions (completed or interrupted)\n  //  - useRevalidator()\n  //  - X-Remix-Revalidate (from redirect)\n  let isRevalidationRequired = false;\n  // Use this internal array to capture routes that require revalidation due\n  // to a cancelled deferred on action submission\n  let cancelledDeferredRoutes = [];\n  // Use this internal array to capture fetcher loads that were cancelled by an\n  // action navigation and require revalidation\n  let cancelledFetcherLoads = [];\n  // AbortControllers for any in-flight fetchers\n  let fetchControllers = new Map();\n  // Track loads based on the order in which they started\n  let incrementingLoadId = 0;\n  // Track the outstanding pending navigation data load to be compared against\n  // the globally incrementing load when a fetcher load lands after a completed\n  // navigation\n  let pendingNavigationLoadId = -1;\n  // Fetchers that triggered data reloads as a result of their actions\n  let fetchReloadIds = new Map();\n  // Fetchers that triggered redirect navigations\n  let fetchRedirectIds = new Set();\n  // Most recent href/match for fetcher.load calls for fetchers\n  let fetchLoadMatches = new Map();\n  // Store DeferredData instances for active route matches.  When a\n  // route loader returns defer() we stick one in here.  Then, when a nested\n  // promise resolves we update loaderData.  If a new navigation starts we\n  // cancel active deferreds for eliminated routes.\n  let activeDeferreds = new Map();\n  // Store blocker functions in a separate Map outside of router state since\n  // we don't need to update UI state if they change\n  let blockerFunctions = new Map();\n  // Flag to ignore the next history update, so we can revert the URL change on\n  // a POP navigation that was blocked by the user without touching router state\n  let ignoreNextHistoryUpdate = false;\n  // Initialize the router, all side effects should be kicked off from here.\n  // Implemented as a Fluent API for ease of:\n  //   let router = createRouter(init).initialize();\n  function initialize() {\n    // If history informs us of a POP navigation, start the navigation but do not update\n    // state.  We'll update our own state once the navigation completes\n    unlistenHistory = init.history.listen(_ref => {\n      let {\n        action: historyAction,\n        location,\n        delta\n      } = _ref;\n      // Ignore this event if it was just us resetting the URL from a\n      // blocked POP navigation\n      if (ignoreNextHistoryUpdate) {\n        ignoreNextHistoryUpdate = false;\n        return;\n      }\n      warning(blockerFunctions.size === 0 || delta != null, \"You are trying to use a blocker on a POP navigation to a location \" + \"that was not created by @remix-run/router. This will fail silently in \" + \"production. This can happen if you are navigating outside the router \" + \"via `window.history.pushState`/`window.location.hash` instead of using \" + \"router navigation APIs.  This can also happen if you are using \" + \"createHashRouter and the user manually changes the URL.\");\n      let blockerKey = shouldBlockNavigation({\n        currentLocation: state.location,\n        nextLocation: location,\n        historyAction\n      });\n      if (blockerKey && delta != null) {\n        // Restore the URL to match the current UI, but don't update router state\n        ignoreNextHistoryUpdate = true;\n        init.history.go(delta * -1);\n        // Put the blocker into a blocked state\n        updateBlocker(blockerKey, {\n          state: \"blocked\",\n          location,\n          proceed() {\n            updateBlocker(blockerKey, {\n              state: \"proceeding\",\n              proceed: undefined,\n              reset: undefined,\n              location\n            });\n            // Re-do the same POP navigation we just blocked\n            init.history.go(delta);\n          },\n          reset() {\n            deleteBlocker(blockerKey);\n            updateState({\n              blockers: new Map(router.state.blockers)\n            });\n          }\n        });\n        return;\n      }\n      return startNavigation(historyAction, location);\n    });\n    // Kick off initial data load if needed.  Use Pop to avoid modifying history\n    // Note we don't do any handling of lazy here.  For SPA's it'll get handled\n    // in the normal navigation flow.  For SSR it's expected that lazy modules are\n    // resolved prior to router creation since we can't go into a fallbackElement\n    // UI for SSR'd apps\n    if (!state.initialized) {\n      startNavigation(Action.Pop, state.location);\n    }\n    return router;\n  }\n  // Clean up a router and it's side effects\n  function dispose() {\n    if (unlistenHistory) {\n      unlistenHistory();\n    }\n    subscribers.clear();\n    pendingNavigationController && pendingNavigationController.abort();\n    state.fetchers.forEach((_, key) => deleteFetcher(key));\n    state.blockers.forEach((_, key) => deleteBlocker(key));\n  }\n  // Subscribe to state updates for the router\n  function subscribe(fn) {\n    subscribers.add(fn);\n    return () => subscribers.delete(fn);\n  }\n  // Update our state and notify the calling context of the change\n  function updateState(newState) {\n    state = _extends({}, state, newState);\n    subscribers.forEach(subscriber => subscriber(state));\n  }\n  // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n  // and setting state.[historyAction/location/matches] to the new route.\n  // - Location is a required param\n  // - Navigation will always be set to IDLE_NAVIGATION\n  // - Can pass any other state in newState\n  function completeNavigation(location, newState) {\n    var _location$state, _location$state2;\n    // Deduce if we're in a loading/actionReload state:\n    // - We have committed actionData in the store\n    // - The current navigation was a mutation submission\n    // - We're past the submitting state and into the loading state\n    // - The location being loaded is not the result of a redirect\n    let isActionReload = state.actionData != null && state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && state.navigation.state === \"loading\" && ((_location$state = location.state) == null ? void 0 : _location$state._isRedirect) !== true;\n    let actionData;\n    if (newState.actionData) {\n      if (Object.keys(newState.actionData).length > 0) {\n        actionData = newState.actionData;\n      } else {\n        // Empty actionData -> clear prior actionData due to an action error\n        actionData = null;\n      }\n    } else if (isActionReload) {\n      // Keep the current data if we're wrapping up the action reload\n      actionData = state.actionData;\n    } else {\n      // Clear actionData on any other completed navigations\n      actionData = null;\n    }\n    // Always preserve any existing loaderData from re-used routes\n    let loaderData = newState.loaderData ? mergeLoaderData(state.loaderData, newState.loaderData, newState.matches || [], newState.errors) : state.loaderData;\n    // On a successful navigation we can assume we got through all blockers\n    // so we can start fresh\n    for (let [key] of blockerFunctions) {\n      deleteBlocker(key);\n    }\n    // Always respect the user flag.  Otherwise don't reset on mutation\n    // submission navigations unless they redirect\n    let preventScrollReset = pendingPreventScrollReset === true || state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && ((_location$state2 = location.state) == null ? void 0 : _location$state2._isRedirect) !== true;\n    if (inFlightDataRoutes) {\n      dataRoutes = inFlightDataRoutes;\n      inFlightDataRoutes = undefined;\n    }\n    updateState(_extends({}, newState, {\n      actionData,\n      loaderData,\n      historyAction: pendingAction,\n      location,\n      initialized: true,\n      navigation: IDLE_NAVIGATION,\n      revalidation: \"idle\",\n      restoreScrollPosition: getSavedScrollPosition(location, newState.matches || state.matches),\n      preventScrollReset,\n      blockers: new Map(state.blockers)\n    }));\n    if (isUninterruptedRevalidation) ; else if (pendingAction === Action.Pop) ; else if (pendingAction === Action.Push) {\n      init.history.push(location, location.state);\n    } else if (pendingAction === Action.Replace) {\n      init.history.replace(location, location.state);\n    }\n    // Reset stateful navigation vars\n    pendingAction = Action.Pop;\n    pendingPreventScrollReset = false;\n    isUninterruptedRevalidation = false;\n    isRevalidationRequired = false;\n    cancelledDeferredRoutes = [];\n    cancelledFetcherLoads = [];\n  }\n  // Trigger a navigation event, which can either be a numerical POP or a PUSH\n  // replace with an optional submission\n  async function navigate(to, opts) {\n    if (typeof to === \"number\") {\n      init.history.go(to);\n      return;\n    }\n    let normalizedPath = normalizeTo(state.location, state.matches, basename, future.v7_prependBasename, to, opts == null ? void 0 : opts.fromRouteId, opts == null ? void 0 : opts.relative);\n    let {\n      path,\n      submission,\n      error\n    } = normalizeNavigateOptions(future.v7_normalizeFormMethod, false, normalizedPath, opts);\n    let currentLocation = state.location;\n    let nextLocation = createLocation(state.location, path, opts && opts.state);\n    // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n    // URL from window.location, so we need to encode it here so the behavior\n    // remains the same as POP and non-data-router usages.  new URL() does all\n    // the same encoding we'd get from a history.pushState/window.location read\n    // without having to touch history\n    nextLocation = _extends({}, nextLocation, init.history.encodeLocation(nextLocation));\n    let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n    let historyAction = Action.Push;\n    if (userReplace === true) {\n      historyAction = Action.Replace;\n    } else if (userReplace === false) ; else if (submission != null && isMutationMethod(submission.formMethod) && submission.formAction === state.location.pathname + state.location.search) {\n      // By default on submissions to the current location we REPLACE so that\n      // users don't have to double-click the back button to get to the prior\n      // location.  If the user redirects to a different location from the\n      // action/loader this will be ignored and the redirect will be a PUSH\n      historyAction = Action.Replace;\n    }\n    let preventScrollReset = opts && \"preventScrollReset\" in opts ? opts.preventScrollReset === true : undefined;\n    let blockerKey = shouldBlockNavigation({\n      currentLocation,\n      nextLocation,\n      historyAction\n    });\n    if (blockerKey) {\n      // Put the blocker into a blocked state\n      updateBlocker(blockerKey, {\n        state: \"blocked\",\n        location: nextLocation,\n        proceed() {\n          updateBlocker(blockerKey, {\n            state: \"proceeding\",\n            proceed: undefined,\n            reset: undefined,\n            location: nextLocation\n          });\n          // Send the same navigation through\n          navigate(to, opts);\n        },\n        reset() {\n          deleteBlocker(blockerKey);\n          updateState({\n            blockers: new Map(state.blockers)\n          });\n        }\n      });\n      return;\n    }\n    return await startNavigation(historyAction, nextLocation, {\n      submission,\n      // Send through the formData serialization error if we have one so we can\n      // render at the right error boundary after we match routes\n      pendingError: error,\n      preventScrollReset,\n      replace: opts && opts.replace\n    });\n  }\n  // Revalidate all current loaders.  If a navigation is in progress or if this\n  // is interrupted by a navigation, allow this to \"succeed\" by calling all\n  // loaders during the next loader round\n  function revalidate() {\n    interruptActiveLoads();\n    updateState({\n      revalidation: \"loading\"\n    });\n    // If we're currently submitting an action, we don't need to start a new\n    // navigation, we'll just let the follow up loader execution call all loaders\n    if (state.navigation.state === \"submitting\") {\n      return;\n    }\n    // If we're currently in an idle state, start a new navigation for the current\n    // action/location and mark it as uninterrupted, which will skip the history\n    // update in completeNavigation\n    if (state.navigation.state === \"idle\") {\n      startNavigation(state.historyAction, state.location, {\n        startUninterruptedRevalidation: true\n      });\n      return;\n    }\n    // Otherwise, if we're currently in a loading state, just start a new\n    // navigation to the navigation.location but do not trigger an uninterrupted\n    // revalidation so that history correctly updates once the navigation completes\n    startNavigation(pendingAction || state.historyAction, state.navigation.location, {\n      overrideNavigation: state.navigation\n    });\n  }\n  // Start a navigation to the given action/location.  Can optionally provide a\n  // overrideNavigation which will override the normalLoad in the case of a redirect\n  // navigation\n  async function startNavigation(historyAction, location, opts) {\n    // Abort any in-progress navigations and start a new one. Unset any ongoing\n    // uninterrupted revalidations unless told otherwise, since we want this\n    // new navigation to update history normally\n    pendingNavigationController && pendingNavigationController.abort();\n    pendingNavigationController = null;\n    pendingAction = historyAction;\n    isUninterruptedRevalidation = (opts && opts.startUninterruptedRevalidation) === true;\n    // Save the current scroll position every time we start a new navigation,\n    // and track whether we should reset scroll on completion\n    saveScrollPosition(state.location, state.matches);\n    pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let loadingNavigation = opts && opts.overrideNavigation;\n    let matches = matchRoutes(routesToUse, location, basename);\n    // Short circuit with a 404 on the root error boundary if we match nothing\n    if (!matches) {\n      let error = getInternalRouterError(404, {\n        pathname: location.pathname\n      });\n      let {\n        matches: notFoundMatches,\n        route\n      } = getShortCircuitMatches(routesToUse);\n      // Cancel all pending deferred on 404s since we don't keep any routes\n      cancelActiveDeferreds();\n      completeNavigation(location, {\n        matches: notFoundMatches,\n        loaderData: {},\n        errors: {\n          [route.id]: error\n        }\n      });\n      return;\n    }\n    // Short circuit if it's only a hash change and not a revalidation or\n    // mutation submission.\n    //\n    // Ignore on initial page loads because since the initial load will always\n    // be \"same hash\".  For example, on /page#hash and submit a <Form method=\"post\">\n    // which will default to a navigation to /page\n    if (state.initialized && !isRevalidationRequired && isHashChangeOnly(state.location, location) && !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))) {\n      completeNavigation(location, {\n        matches\n      });\n      return;\n    }\n    // Create a controller/Request for this navigation\n    pendingNavigationController = new AbortController();\n    let request = createClientSideRequest(init.history, location, pendingNavigationController.signal, opts && opts.submission);\n    let pendingActionData;\n    let pendingError;\n    if (opts && opts.pendingError) {\n      // If we have a pendingError, it means the user attempted a GET submission\n      // with binary FormData so assign here and skip to handleLoaders.  That\n      // way we handle calling loaders above the boundary etc.  It's not really\n      // different from an actionError in that sense.\n      pendingError = {\n        [findNearestBoundary(matches).route.id]: opts.pendingError\n      };\n    } else if (opts && opts.submission && isMutationMethod(opts.submission.formMethod)) {\n      // Call action if we received an action submission\n      let actionOutput = await handleAction(request, location, opts.submission, matches, {\n        replace: opts.replace\n      });\n      if (actionOutput.shortCircuited) {\n        return;\n      }\n      pendingActionData = actionOutput.pendingActionData;\n      pendingError = actionOutput.pendingActionError;\n      let navigation = _extends({\n        state: \"loading\",\n        location\n      }, opts.submission);\n      loadingNavigation = navigation;\n      // Create a GET request for the loaders\n      request = new Request(request.url, {\n        signal: request.signal\n      });\n    }\n    // Call loaders\n    let {\n      shortCircuited,\n      loaderData,\n      errors\n    } = await handleLoaders(request, location, matches, loadingNavigation, opts && opts.submission, opts && opts.fetcherSubmission, opts && opts.replace, pendingActionData, pendingError);\n    if (shortCircuited) {\n      return;\n    }\n    // Clean up now that the action/loaders have completed.  Don't clean up if\n    // we short circuited because pendingNavigationController will have already\n    // been assigned to a new controller for the next navigation\n    pendingNavigationController = null;\n    completeNavigation(location, _extends({\n      matches\n    }, pendingActionData ? {\n      actionData: pendingActionData\n    } : {}, {\n      loaderData,\n      errors\n    }));\n  }\n  // Call the action matched by the leaf route for this navigation and handle\n  // redirects/errors\n  async function handleAction(request, location, submission, matches, opts) {\n    interruptActiveLoads();\n    // Put us in a submitting state\n    let navigation = _extends({\n      state: \"submitting\",\n      location\n    }, submission);\n    updateState({\n      navigation\n    });\n    // Call our action and get the result\n    let result;\n    let actionMatch = getTargetMatch(matches, location);\n    if (!actionMatch.route.action && !actionMatch.route.lazy) {\n      result = {\n        type: ResultType.error,\n        error: getInternalRouterError(405, {\n          method: request.method,\n          pathname: location.pathname,\n          routeId: actionMatch.route.id\n        })\n      };\n    } else {\n      result = await callLoaderOrAction(\"action\", request, actionMatch, matches, manifest, mapRouteProperties, basename);\n      if (request.signal.aborted) {\n        return {\n          shortCircuited: true\n        };\n      }\n    }\n    if (isRedirectResult(result)) {\n      let replace;\n      if (opts && opts.replace != null) {\n        replace = opts.replace;\n      } else {\n        // If the user didn't explicity indicate replace behavior, replace if\n        // we redirected to the exact same location we're currently at to avoid\n        // double back-buttons\n        replace = result.location === state.location.pathname + state.location.search;\n      }\n      await startRedirectNavigation(state, result, {\n        submission,\n        replace\n      });\n      return {\n        shortCircuited: true\n      };\n    }\n    if (isErrorResult(result)) {\n      // Store off the pending error - we use it to determine which loaders\n      // to call and will commit it when we complete the navigation\n      let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n      // By default, all submissions are REPLACE navigations, but if the\n      // action threw an error that'll be rendered in an errorElement, we fall\n      // back to PUSH so that the user can use the back button to get back to\n      // the pre-submission form location to try again\n      if ((opts && opts.replace) !== true) {\n        pendingAction = Action.Push;\n      }\n      return {\n        // Send back an empty object we can use to clear out any prior actionData\n        pendingActionData: {},\n        pendingActionError: {\n          [boundaryMatch.route.id]: result.error\n        }\n      };\n    }\n    if (isDeferredResult(result)) {\n      throw getInternalRouterError(400, {\n        type: \"defer-action\"\n      });\n    }\n    return {\n      pendingActionData: {\n        [actionMatch.route.id]: result.data\n      }\n    };\n  }\n  // Call all applicable loaders for the given matches, handling redirects,\n  // errors, etc.\n  async function handleLoaders(request, location, matches, overrideNavigation, submission, fetcherSubmission, replace, pendingActionData, pendingError) {\n    // Figure out the right navigation we want to use for data loading\n    let loadingNavigation = overrideNavigation;\n    if (!loadingNavigation) {\n      let navigation = _extends({\n        state: \"loading\",\n        location,\n        formMethod: undefined,\n        formAction: undefined,\n        formEncType: undefined,\n        formData: undefined\n      }, submission);\n      loadingNavigation = navigation;\n    }\n    // If this was a redirect from an action we don't have a \"submission\" but\n    // we have it on the loading navigation so use that if available\n    let activeSubmission = submission || fetcherSubmission ? submission || fetcherSubmission : loadingNavigation.formMethod && loadingNavigation.formAction && loadingNavigation.formData && loadingNavigation.formEncType ? {\n      formMethod: loadingNavigation.formMethod,\n      formAction: loadingNavigation.formAction,\n      formData: loadingNavigation.formData,\n      formEncType: loadingNavigation.formEncType\n    } : undefined;\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, activeSubmission, location, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, fetchLoadMatches, routesToUse, basename, pendingActionData, pendingError);\n    // Cancel pending deferreds for no-longer-matched routes or routes we're\n    // about to reload.  Note that if this is an action reload we would have\n    // already cancelled all pending deferreds so this would be a no-op\n    cancelActiveDeferreds(routeId => !(matches && matches.some(m => m.route.id === routeId)) || matchesToLoad && matchesToLoad.some(m => m.route.id === routeId));\n    // Short circuit if we have no loaders to run\n    if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n      let updatedFetchers = markFetchRedirectsDone();\n      completeNavigation(location, _extends({\n        matches,\n        loaderData: {},\n        // Commit pending error if we're short circuiting\n        errors: pendingError || null\n      }, pendingActionData ? {\n        actionData: pendingActionData\n      } : {}, updatedFetchers ? {\n        fetchers: new Map(state.fetchers)\n      } : {}));\n      return {\n        shortCircuited: true\n      };\n    }\n    // If this is an uninterrupted revalidation, we remain in our current idle\n    // state.  If not, we need to switch to our loading state and load data,\n    // preserving any new action data or existing action data (in the case of\n    // a revalidation interrupting an actionReload)\n    if (!isUninterruptedRevalidation) {\n      revalidatingFetchers.forEach(rf => {\n        let fetcher = state.fetchers.get(rf.key);\n        let revalidatingFetcher = {\n          state: \"loading\",\n          data: fetcher && fetcher.data,\n          formMethod: undefined,\n          formAction: undefined,\n          formEncType: undefined,\n          formData: undefined,\n          \" _hasFetcherDoneAnything \": true\n        };\n        state.fetchers.set(rf.key, revalidatingFetcher);\n      });\n      let actionData = pendingActionData || state.actionData;\n      updateState(_extends({\n        navigation: loadingNavigation\n      }, actionData ? Object.keys(actionData).length === 0 ? {\n        actionData: null\n      } : {\n        actionData\n      } : {}, revalidatingFetchers.length > 0 ? {\n        fetchers: new Map(state.fetchers)\n      } : {}));\n    }\n    pendingNavigationLoadId = ++incrementingLoadId;\n    revalidatingFetchers.forEach(rf => {\n      if (rf.controller) {\n        // Fetchers use an independent AbortController so that aborting a fetcher\n        // (via deleteFetcher) does not abort the triggering navigation that\n        // triggered the revalidation\n        fetchControllers.set(rf.key, rf.controller);\n      }\n    });\n    // Proxy navigation abort through to revalidation fetchers\n    let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach(f => abortFetcher(f.key));\n    if (pendingNavigationController) {\n      pendingNavigationController.signal.addEventListener(\"abort\", abortPendingFetchRevalidations);\n    }\n    let {\n      results,\n      loaderResults,\n      fetcherResults\n    } = await callLoadersAndMaybeResolveData(state.matches, matches, matchesToLoad, revalidatingFetchers, request);\n    if (request.signal.aborted) {\n      return {\n        shortCircuited: true\n      };\n    }\n    // Clean up _after_ loaders have completed.  Don't clean up if we short\n    // circuited because fetchControllers would have been aborted and\n    // reassigned to new controllers for the next navigation\n    if (pendingNavigationController) {\n      pendingNavigationController.signal.removeEventListener(\"abort\", abortPendingFetchRevalidations);\n    }\n    revalidatingFetchers.forEach(rf => fetchControllers.delete(rf.key));\n    // If any loaders returned a redirect Response, start a new REPLACE navigation\n    let redirect = findRedirect(results);\n    if (redirect) {\n      await startRedirectNavigation(state, redirect, {\n        replace\n      });\n      return {\n        shortCircuited: true\n      };\n    }\n    // Process and commit output from loaders\n    let {\n      loaderData,\n      errors\n    } = processLoaderData(state, matches, matchesToLoad, loaderResults, pendingError, revalidatingFetchers, fetcherResults, activeDeferreds);\n    // Wire up subscribers to update loaderData as promises settle\n    activeDeferreds.forEach((deferredData, routeId) => {\n      deferredData.subscribe(aborted => {\n        // Note: No need to updateState here since the TrackedPromise on\n        // loaderData is stable across resolve/reject\n        // Remove this instance if we were aborted or if promises have settled\n        if (aborted || deferredData.done) {\n          activeDeferreds.delete(routeId);\n        }\n      });\n    });\n    let updatedFetchers = markFetchRedirectsDone();\n    let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n    let shouldUpdateFetchers = updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n    return _extends({\n      loaderData,\n      errors\n    }, shouldUpdateFetchers ? {\n      fetchers: new Map(state.fetchers)\n    } : {});\n  }\n  function getFetcher(key) {\n    return state.fetchers.get(key) || IDLE_FETCHER;\n  }\n  // Trigger a fetcher load/submit for the given fetcher key\n  function fetch(key, routeId, href, opts) {\n    if (isServer) {\n      throw new Error(\"router.fetch() was called during the server render, but it shouldn't be. \" + \"You are likely calling a useFetcher() method in the body of your component. \" + \"Try moving it to a useEffect or a callback.\");\n    }\n    if (fetchControllers.has(key)) abortFetcher(key);\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let normalizedPath = normalizeTo(state.location, state.matches, basename, future.v7_prependBasename, href, routeId, opts == null ? void 0 : opts.relative);\n    let matches = matchRoutes(routesToUse, normalizedPath, basename);\n    if (!matches) {\n      setFetcherError(key, routeId, getInternalRouterError(404, {\n        pathname: normalizedPath\n      }));\n      return;\n    }\n    let {\n      path,\n      submission\n    } = normalizeNavigateOptions(future.v7_normalizeFormMethod, true, normalizedPath, opts);\n    let match = getTargetMatch(matches, path);\n    pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n    if (submission && isMutationMethod(submission.formMethod)) {\n      handleFetcherAction(key, routeId, path, match, matches, submission);\n      return;\n    }\n    // Store off the match so we can call it's shouldRevalidate on subsequent\n    // revalidations\n    fetchLoadMatches.set(key, {\n      routeId,\n      path\n    });\n    handleFetcherLoader(key, routeId, path, match, matches, submission);\n  }\n  // Call the action for the matched fetcher.submit(), and then handle redirects,\n  // errors, and revalidation\n  async function handleFetcherAction(key, routeId, path, match, requestMatches, submission) {\n    interruptActiveLoads();\n    fetchLoadMatches.delete(key);\n    if (!match.route.action && !match.route.lazy) {\n      let error = getInternalRouterError(405, {\n        method: submission.formMethod,\n        pathname: path,\n        routeId: routeId\n      });\n      setFetcherError(key, routeId, error);\n      return;\n    }\n    // Put this fetcher into it's submitting state\n    let existingFetcher = state.fetchers.get(key);\n    let fetcher = _extends({\n      state: \"submitting\"\n    }, submission, {\n      data: existingFetcher && existingFetcher.data,\n      \" _hasFetcherDoneAnything \": true\n    });\n    state.fetchers.set(key, fetcher);\n    updateState({\n      fetchers: new Map(state.fetchers)\n    });\n    // Call the action for the fetcher\n    let abortController = new AbortController();\n    let fetchRequest = createClientSideRequest(init.history, path, abortController.signal, submission);\n    fetchControllers.set(key, abortController);\n    let actionResult = await callLoaderOrAction(\"action\", fetchRequest, match, requestMatches, manifest, mapRouteProperties, basename);\n    if (fetchRequest.signal.aborted) {\n      // We can delete this so long as we weren't aborted by ou our own fetcher\n      // re-submit which would have put _new_ controller is in fetchControllers\n      if (fetchControllers.get(key) === abortController) {\n        fetchControllers.delete(key);\n      }\n      return;\n    }\n    if (isRedirectResult(actionResult)) {\n      fetchControllers.delete(key);\n      fetchRedirectIds.add(key);\n      let loadingFetcher = _extends({\n        state: \"loading\"\n      }, submission, {\n        data: undefined,\n        \" _hasFetcherDoneAnything \": true\n      });\n      state.fetchers.set(key, loadingFetcher);\n      updateState({\n        fetchers: new Map(state.fetchers)\n      });\n      return startRedirectNavigation(state, actionResult, {\n        submission,\n        isFetchActionRedirect: true\n      });\n    }\n    // Process any non-redirect errors thrown\n    if (isErrorResult(actionResult)) {\n      setFetcherError(key, routeId, actionResult.error);\n      return;\n    }\n    if (isDeferredResult(actionResult)) {\n      throw getInternalRouterError(400, {\n        type: \"defer-action\"\n      });\n    }\n    // Start the data load for current matches, or the next location if we're\n    // in the middle of a navigation\n    let nextLocation = state.navigation.location || state.location;\n    let revalidationRequest = createClientSideRequest(init.history, nextLocation, abortController.signal);\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let matches = state.navigation.state !== \"idle\" ? matchRoutes(routesToUse, state.navigation.location, basename) : state.matches;\n    invariant(matches, \"Didn't find any matches after fetcher action\");\n    let loadId = ++incrementingLoadId;\n    fetchReloadIds.set(key, loadId);\n    let loadFetcher = _extends({\n      state: \"loading\",\n      data: actionResult.data\n    }, submission, {\n      \" _hasFetcherDoneAnything \": true\n    });\n    state.fetchers.set(key, loadFetcher);\n    let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, submission, nextLocation, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, fetchLoadMatches, routesToUse, basename, {\n      [match.route.id]: actionResult.data\n    }, undefined // No need to send through errors since we short circuit above\n    );\n    // Put all revalidating fetchers into the loading state, except for the\n    // current fetcher which we want to keep in it's current loading state which\n    // contains it's action submission info + action data\n    revalidatingFetchers.filter(rf => rf.key !== key).forEach(rf => {\n      let staleKey = rf.key;\n      let existingFetcher = state.fetchers.get(staleKey);\n      let revalidatingFetcher = {\n        state: \"loading\",\n        data: existingFetcher && existingFetcher.data,\n        formMethod: undefined,\n        formAction: undefined,\n        formEncType: undefined,\n        formData: undefined,\n        \" _hasFetcherDoneAnything \": true\n      };\n      state.fetchers.set(staleKey, revalidatingFetcher);\n      if (rf.controller) {\n        fetchControllers.set(staleKey, rf.controller);\n      }\n    });\n    updateState({\n      fetchers: new Map(state.fetchers)\n    });\n    let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach(rf => abortFetcher(rf.key));\n    abortController.signal.addEventListener(\"abort\", abortPendingFetchRevalidations);\n    let {\n      results,\n      loaderResults,\n      fetcherResults\n    } = await callLoadersAndMaybeResolveData(state.matches, matches, matchesToLoad, revalidatingFetchers, revalidationRequest);\n    if (abortController.signal.aborted) {\n      return;\n    }\n    abortController.signal.removeEventListener(\"abort\", abortPendingFetchRevalidations);\n    fetchReloadIds.delete(key);\n    fetchControllers.delete(key);\n    revalidatingFetchers.forEach(r => fetchControllers.delete(r.key));\n    let redirect = findRedirect(results);\n    if (redirect) {\n      return startRedirectNavigation(state, redirect);\n    }\n    // Process and commit output from loaders\n    let {\n      loaderData,\n      errors\n    } = processLoaderData(state, state.matches, matchesToLoad, loaderResults, undefined, revalidatingFetchers, fetcherResults, activeDeferreds);\n    // Since we let revalidations complete even if the submitting fetcher was\n    // deleted, only put it back to idle if it hasn't been deleted\n    if (state.fetchers.has(key)) {\n      let doneFetcher = {\n        state: \"idle\",\n        data: actionResult.data,\n        formMethod: undefined,\n        formAction: undefined,\n        formEncType: undefined,\n        formData: undefined,\n        \" _hasFetcherDoneAnything \": true\n      };\n      state.fetchers.set(key, doneFetcher);\n    }\n    let didAbortFetchLoads = abortStaleFetchLoads(loadId);\n    // If we are currently in a navigation loading state and this fetcher is\n    // more recent than the navigation, we want the newer data so abort the\n    // navigation and complete it with the fetcher data\n    if (state.navigation.state === \"loading\" && loadId > pendingNavigationLoadId) {\n      invariant(pendingAction, \"Expected pending action\");\n      pendingNavigationController && pendingNavigationController.abort();\n      completeNavigation(state.navigation.location, {\n        matches,\n        loaderData,\n        errors,\n        fetchers: new Map(state.fetchers)\n      });\n    } else {\n      // otherwise just update with the fetcher data, preserving any existing\n      // loaderData for loaders that did not need to reload.  We have to\n      // manually merge here since we aren't going through completeNavigation\n      updateState(_extends({\n        errors,\n        loaderData: mergeLoaderData(state.loaderData, loaderData, matches, errors)\n      }, didAbortFetchLoads || revalidatingFetchers.length > 0 ? {\n        fetchers: new Map(state.fetchers)\n      } : {}));\n      isRevalidationRequired = false;\n    }\n  }\n  // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n  async function handleFetcherLoader(key, routeId, path, match, matches, submission) {\n    let existingFetcher = state.fetchers.get(key);\n    // Put this fetcher into it's loading state\n    let loadingFetcher = _extends({\n      state: \"loading\",\n      formMethod: undefined,\n      formAction: undefined,\n      formEncType: undefined,\n      formData: undefined\n    }, submission, {\n      data: existingFetcher && existingFetcher.data,\n      \" _hasFetcherDoneAnything \": true\n    });\n    state.fetchers.set(key, loadingFetcher);\n    updateState({\n      fetchers: new Map(state.fetchers)\n    });\n    // Call the loader for this fetcher route match\n    let abortController = new AbortController();\n    let fetchRequest = createClientSideRequest(init.history, path, abortController.signal);\n    fetchControllers.set(key, abortController);\n    let result = await callLoaderOrAction(\"loader\", fetchRequest, match, matches, manifest, mapRouteProperties, basename);\n    // Deferred isn't supported for fetcher loads, await everything and treat it\n    // as a normal load.  resolveDeferredData will return undefined if this\n    // fetcher gets aborted, so we just leave result untouched and short circuit\n    // below if that happens\n    if (isDeferredResult(result)) {\n      result = (await resolveDeferredData(result, fetchRequest.signal, true)) || result;\n    }\n    // We can delete this so long as we weren't aborted by our our own fetcher\n    // re-load which would have put _new_ controller is in fetchControllers\n    if (fetchControllers.get(key) === abortController) {\n      fetchControllers.delete(key);\n    }\n    if (fetchRequest.signal.aborted) {\n      return;\n    }\n    // If the loader threw a redirect Response, start a new REPLACE navigation\n    if (isRedirectResult(result)) {\n      fetchRedirectIds.add(key);\n      await startRedirectNavigation(state, result);\n      return;\n    }\n    // Process any non-redirect errors thrown\n    if (isErrorResult(result)) {\n      let boundaryMatch = findNearestBoundary(state.matches, routeId);\n      state.fetchers.delete(key);\n      // TODO: In remix, this would reset to IDLE_NAVIGATION if it was a catch -\n      // do we need to behave any differently with our non-redirect errors?\n      // What if it was a non-redirect Response?\n      updateState({\n        fetchers: new Map(state.fetchers),\n        errors: {\n          [boundaryMatch.route.id]: result.error\n        }\n      });\n      return;\n    }\n    invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n    // Put the fetcher back into an idle state\n    let doneFetcher = {\n      state: \"idle\",\n      data: result.data,\n      formMethod: undefined,\n      formAction: undefined,\n      formEncType: undefined,\n      formData: undefined,\n      \" _hasFetcherDoneAnything \": true\n    };\n    state.fetchers.set(key, doneFetcher);\n    updateState({\n      fetchers: new Map(state.fetchers)\n    });\n  }\n  /**\n   * Utility function to handle redirects returned from an action or loader.\n   * Normally, a redirect \"replaces\" the navigation that triggered it.  So, for\n   * example:\n   *\n   *  - user is on /a\n   *  - user clicks a link to /b\n   *  - loader for /b redirects to /c\n   *\n   * In a non-JS app the browser would track the in-flight navigation to /b and\n   * then replace it with /c when it encountered the redirect response.  In\n   * the end it would only ever update the URL bar with /c.\n   *\n   * In client-side routing using pushState/replaceState, we aim to emulate\n   * this behavior and we also do not update history until the end of the\n   * navigation (including processed redirects).  This means that we never\n   * actually touch history until we've processed redirects, so we just use\n   * the history action from the original navigation (PUSH or REPLACE).\n   */\n  async function startRedirectNavigation(state, redirect, _temp) {\n    let {\n      submission,\n      replace,\n      isFetchActionRedirect\n    } = _temp === void 0 ? {} : _temp;\n    if (redirect.revalidate) {\n      isRevalidationRequired = true;\n    }\n    let redirectLocation = createLocation(state.location, redirect.location, // TODO: This can be removed once we get rid of useTransition in Remix v2\n    _extends({\n      _isRedirect: true\n    }, isFetchActionRedirect ? {\n      _isFetchActionRedirect: true\n    } : {}));\n    invariant(redirectLocation, \"Expected a location on the redirect navigation\");\n    // Check if this an absolute external redirect that goes to a new origin\n    if (ABSOLUTE_URL_REGEX.test(redirect.location) && isBrowser) {\n      let url = init.history.createURL(redirect.location);\n      let isDifferentBasename = stripBasename(url.pathname, basename) == null;\n      if (routerWindow.location.origin !== url.origin || isDifferentBasename) {\n        if (replace) {\n          routerWindow.location.replace(redirect.location);\n        } else {\n          routerWindow.location.assign(redirect.location);\n        }\n        return;\n      }\n    }\n    // There's no need to abort on redirects, since we don't detect the\n    // redirect until the action/loaders have settled\n    pendingNavigationController = null;\n    let redirectHistoryAction = replace === true ? Action.Replace : Action.Push;\n    // Use the incoming submission if provided, fallback on the active one in\n    // state.navigation\n    let {\n      formMethod,\n      formAction,\n      formEncType,\n      formData\n    } = state.navigation;\n    if (!submission && formMethod && formAction && formData && formEncType) {\n      submission = {\n        formMethod,\n        formAction,\n        formEncType,\n        formData\n      };\n    }\n    // If this was a 307/308 submission we want to preserve the HTTP method and\n    // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n    // redirected location\n    if (redirectPreserveMethodStatusCodes.has(redirect.status) && submission && isMutationMethod(submission.formMethod)) {\n      await startNavigation(redirectHistoryAction, redirectLocation, {\n        submission: _extends({}, submission, {\n          formAction: redirect.location\n        }),\n        // Preserve this flag across redirects\n        preventScrollReset: pendingPreventScrollReset\n      });\n    } else if (isFetchActionRedirect) {\n      // For a fetch action redirect, we kick off a new loading navigation\n      // without the fetcher submission, but we send it along for shouldRevalidate\n      await startNavigation(redirectHistoryAction, redirectLocation, {\n        overrideNavigation: {\n          state: \"loading\",\n          location: redirectLocation,\n          formMethod: undefined,\n          formAction: undefined,\n          formEncType: undefined,\n          formData: undefined\n        },\n        fetcherSubmission: submission,\n        // Preserve this flag across redirects\n        preventScrollReset: pendingPreventScrollReset\n      });\n    } else {\n      // Otherwise, we kick off a new loading navigation, preserving the\n      // submission info for the duration of this navigation\n      await startNavigation(redirectHistoryAction, redirectLocation, {\n        overrideNavigation: {\n          state: \"loading\",\n          location: redirectLocation,\n          formMethod: submission ? submission.formMethod : undefined,\n          formAction: submission ? submission.formAction : undefined,\n          formEncType: submission ? submission.formEncType : undefined,\n          formData: submission ? submission.formData : undefined\n        },\n        // Preserve this flag across redirects\n        preventScrollReset: pendingPreventScrollReset\n      });\n    }\n  }\n  async function callLoadersAndMaybeResolveData(currentMatches, matches, matchesToLoad, fetchersToLoad, request) {\n    // Call all navigation loaders and revalidating fetcher loaders in parallel,\n    // then slice off the results into separate arrays so we can handle them\n    // accordingly\n    let results = await Promise.all([...matchesToLoad.map(match => callLoaderOrAction(\"loader\", request, match, matches, manifest, mapRouteProperties, basename)), ...fetchersToLoad.map(f => {\n      if (f.matches && f.match && f.controller) {\n        return callLoaderOrAction(\"loader\", createClientSideRequest(init.history, f.path, f.controller.signal), f.match, f.matches, manifest, mapRouteProperties, basename);\n      } else {\n        let error = {\n          type: ResultType.error,\n          error: getInternalRouterError(404, {\n            pathname: f.path\n          })\n        };\n        return error;\n      }\n    })]);\n    let loaderResults = results.slice(0, matchesToLoad.length);\n    let fetcherResults = results.slice(matchesToLoad.length);\n    await Promise.all([resolveDeferredResults(currentMatches, matchesToLoad, loaderResults, loaderResults.map(() => request.signal), false, state.loaderData), resolveDeferredResults(currentMatches, fetchersToLoad.map(f => f.match), fetcherResults, fetchersToLoad.map(f => f.controller ? f.controller.signal : null), true)]);\n    return {\n      results,\n      loaderResults,\n      fetcherResults\n    };\n  }\n  function interruptActiveLoads() {\n    // Every interruption triggers a revalidation\n    isRevalidationRequired = true;\n    // Cancel pending route-level deferreds and mark cancelled routes for\n    // revalidation\n    cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n    // Abort in-flight fetcher loads\n    fetchLoadMatches.forEach((_, key) => {\n      if (fetchControllers.has(key)) {\n        cancelledFetcherLoads.push(key);\n        abortFetcher(key);\n      }\n    });\n  }\n  function setFetcherError(key, routeId, error) {\n    let boundaryMatch = findNearestBoundary(state.matches, routeId);\n    deleteFetcher(key);\n    updateState({\n      errors: {\n        [boundaryMatch.route.id]: error\n      },\n      fetchers: new Map(state.fetchers)\n    });\n  }\n  function deleteFetcher(key) {\n    let fetcher = state.fetchers.get(key);\n    // Don't abort the controller if this is a deletion of a fetcher.submit()\n    // in it's loading phase since - we don't want to abort the corresponding\n    // revalidation and want them to complete and land\n    if (fetchControllers.has(key) && !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))) {\n      abortFetcher(key);\n    }\n    fetchLoadMatches.delete(key);\n    fetchReloadIds.delete(key);\n    fetchRedirectIds.delete(key);\n    state.fetchers.delete(key);\n  }\n  function abortFetcher(key) {\n    let controller = fetchControllers.get(key);\n    invariant(controller, \"Expected fetch controller: \" + key);\n    controller.abort();\n    fetchControllers.delete(key);\n  }\n  function markFetchersDone(keys) {\n    for (let key of keys) {\n      let fetcher = getFetcher(key);\n      let doneFetcher = {\n        state: \"idle\",\n        data: fetcher.data,\n        formMethod: undefined,\n        formAction: undefined,\n        formEncType: undefined,\n        formData: undefined,\n        \" _hasFetcherDoneAnything \": true\n      };\n      state.fetchers.set(key, doneFetcher);\n    }\n  }\n  function markFetchRedirectsDone() {\n    let doneKeys = [];\n    let updatedFetchers = false;\n    for (let key of fetchRedirectIds) {\n      let fetcher = state.fetchers.get(key);\n      invariant(fetcher, \"Expected fetcher: \" + key);\n      if (fetcher.state === \"loading\") {\n        fetchRedirectIds.delete(key);\n        doneKeys.push(key);\n        updatedFetchers = true;\n      }\n    }\n    markFetchersDone(doneKeys);\n    return updatedFetchers;\n  }\n  function abortStaleFetchLoads(landedId) {\n    let yeetedKeys = [];\n    for (let [key, id] of fetchReloadIds) {\n      if (id < landedId) {\n        let fetcher = state.fetchers.get(key);\n        invariant(fetcher, \"Expected fetcher: \" + key);\n        if (fetcher.state === \"loading\") {\n          abortFetcher(key);\n          fetchReloadIds.delete(key);\n          yeetedKeys.push(key);\n        }\n      }\n    }\n    markFetchersDone(yeetedKeys);\n    return yeetedKeys.length > 0;\n  }\n  function getBlocker(key, fn) {\n    let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n    if (blockerFunctions.get(key) !== fn) {\n      blockerFunctions.set(key, fn);\n    }\n    return blocker;\n  }\n  function deleteBlocker(key) {\n    state.blockers.delete(key);\n    blockerFunctions.delete(key);\n  }\n  // Utility function to update blockers, ensuring valid state transitions\n  function updateBlocker(key, newBlocker) {\n    let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n    // Poor mans state machine :)\n    // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n    invariant(blocker.state === \"unblocked\" && newBlocker.state === \"blocked\" || blocker.state === \"blocked\" && newBlocker.state === \"blocked\" || blocker.state === \"blocked\" && newBlocker.state === \"proceeding\" || blocker.state === \"blocked\" && newBlocker.state === \"unblocked\" || blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\", \"Invalid blocker state transition: \" + blocker.state + \" -> \" + newBlocker.state);\n    state.blockers.set(key, newBlocker);\n    updateState({\n      blockers: new Map(state.blockers)\n    });\n  }\n  function shouldBlockNavigation(_ref2) {\n    let {\n      currentLocation,\n      nextLocation,\n      historyAction\n    } = _ref2;\n    if (blockerFunctions.size === 0) {\n      return;\n    }\n    // We ony support a single active blocker at the moment since we don't have\n    // any compelling use cases for multi-blocker yet\n    if (blockerFunctions.size > 1) {\n      warning(false, \"A router only supports one blocker at a time\");\n    }\n    let entries = Array.from(blockerFunctions.entries());\n    let [blockerKey, blockerFunction] = entries[entries.length - 1];\n    let blocker = state.blockers.get(blockerKey);\n    if (blocker && blocker.state === \"proceeding\") {\n      // If the blocker is currently proceeding, we don't need to re-check\n      // it and can let this navigation continue\n      return;\n    }\n    // At this point, we know we're unblocked/blocked so we need to check the\n    // user-provided blocker function\n    if (blockerFunction({\n      currentLocation,\n      nextLocation,\n      historyAction\n    })) {\n      return blockerKey;\n    }\n  }\n  function cancelActiveDeferreds(predicate) {\n    let cancelledRouteIds = [];\n    activeDeferreds.forEach((dfd, routeId) => {\n      if (!predicate || predicate(routeId)) {\n        // Cancel the deferred - but do not remove from activeDeferreds here -\n        // we rely on the subscribers to do that so our tests can assert proper\n        // cleanup via _internalActiveDeferreds\n        dfd.cancel();\n        cancelledRouteIds.push(routeId);\n        activeDeferreds.delete(routeId);\n      }\n    });\n    return cancelledRouteIds;\n  }\n  // Opt in to capturing and reporting scroll positions during navigations,\n  // used by the <ScrollRestoration> component\n  function enableScrollRestoration(positions, getPosition, getKey) {\n    savedScrollPositions = positions;\n    getScrollPosition = getPosition;\n    getScrollRestorationKey = getKey || (location => location.key);\n    // Perform initial hydration scroll restoration, since we miss the boat on\n    // the initial updateState() because we've not yet rendered <ScrollRestoration/>\n    // and therefore have no savedScrollPositions available\n    if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n      initialScrollRestored = true;\n      let y = getSavedScrollPosition(state.location, state.matches);\n      if (y != null) {\n        updateState({\n          restoreScrollPosition: y\n        });\n      }\n    }\n    return () => {\n      savedScrollPositions = null;\n      getScrollPosition = null;\n      getScrollRestorationKey = null;\n    };\n  }\n  function saveScrollPosition(location, matches) {\n    if (savedScrollPositions && getScrollRestorationKey && getScrollPosition) {\n      let userMatches = matches.map(m => createUseMatchesMatch(m, state.loaderData));\n      let key = getScrollRestorationKey(location, userMatches) || location.key;\n      savedScrollPositions[key] = getScrollPosition();\n    }\n  }\n  function getSavedScrollPosition(location, matches) {\n    if (savedScrollPositions && getScrollRestorationKey && getScrollPosition) {\n      let userMatches = matches.map(m => createUseMatchesMatch(m, state.loaderData));\n      let key = getScrollRestorationKey(location, userMatches) || location.key;\n      let y = savedScrollPositions[key];\n      if (typeof y === \"number\") {\n        return y;\n      }\n    }\n    return null;\n  }\n  function _internalSetRoutes(newRoutes) {\n    manifest = {};\n    inFlightDataRoutes = convertRoutesToDataRoutes(newRoutes, mapRouteProperties, undefined, manifest);\n  }\n  router = {\n    get basename() {\n      return basename;\n    },\n    get state() {\n      return state;\n    },\n    get routes() {\n      return dataRoutes;\n    },\n    initialize,\n    subscribe,\n    enableScrollRestoration,\n    navigate,\n    fetch,\n    revalidate,\n    // Passthrough to history-aware createHref used by useHref so we get proper\n    // hash-aware URLs in DOM paths\n    createHref: to => init.history.createHref(to),\n    encodeLocation: to => init.history.encodeLocation(to),\n    getFetcher,\n    deleteFetcher,\n    dispose,\n    getBlocker,\n    deleteBlocker,\n    _internalFetchControllers: fetchControllers,\n    _internalActiveDeferreds: activeDeferreds,\n    // TODO: Remove setRoutes, it's temporary to avoid dealing with\n    // updating the tree while validating the update algorithm.\n    _internalSetRoutes\n  };\n  return router;\n}\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\nconst UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\nfunction createStaticHandler(routes, opts) {\n  invariant(routes.length > 0, \"You must provide a non-empty routes array to createStaticHandler\");\n  let manifest = {};\n  let basename = (opts ? opts.basename : null) || \"/\";\n  let mapRouteProperties;\n  if (opts != null && opts.mapRouteProperties) {\n    mapRouteProperties = opts.mapRouteProperties;\n  } else if (opts != null && opts.detectErrorBoundary) {\n    // If they are still using the deprecated version, wrap it with the new API\n    let detectErrorBoundary = opts.detectErrorBoundary;\n    mapRouteProperties = route => ({\n      hasErrorBoundary: detectErrorBoundary(route)\n    });\n  } else {\n    mapRouteProperties = defaultMapRouteProperties;\n  }\n  let dataRoutes = convertRoutesToDataRoutes(routes, mapRouteProperties, undefined, manifest);\n  /**\n   * The query() method is intended for document requests, in which we want to\n   * call an optional action and potentially multiple loaders for all nested\n   * routes.  It returns a StaticHandlerContext object, which is very similar\n   * to the router state (location, loaderData, actionData, errors, etc.) and\n   * also adds SSR-specific information such as the statusCode and headers\n   * from action/loaders Responses.\n   *\n   * It _should_ never throw and should report all errors through the\n   * returned context.errors object, properly associating errors to their error\n   * boundary.  Additionally, it tracks _deepestRenderedBoundaryId which can be\n   * used to emulate React error boundaries during SSr by performing a second\n   * pass only down to the boundaryId.\n   *\n   * The one exception where we do not return a StaticHandlerContext is when a\n   * redirect response is returned or thrown from any action/loader.  We\n   * propagate that out and return the raw Response so the HTTP server can\n   * return it directly.\n   */\n  async function query(request, _temp2) {\n    let {\n      requestContext\n    } = _temp2 === void 0 ? {} : _temp2;\n    let url = new URL(request.url);\n    let method = request.method;\n    let location = createLocation(\"\", createPath(url), null, \"default\");\n    let matches = matchRoutes(dataRoutes, location, basename);\n    // SSR supports HEAD requests while SPA doesn't\n    if (!isValidMethod(method) && method !== \"HEAD\") {\n      let error = getInternalRouterError(405, {\n        method\n      });\n      let {\n        matches: methodNotAllowedMatches,\n        route\n      } = getShortCircuitMatches(dataRoutes);\n      return {\n        basename,\n        location,\n        matches: methodNotAllowedMatches,\n        loaderData: {},\n        actionData: null,\n        errors: {\n          [route.id]: error\n        },\n        statusCode: error.status,\n        loaderHeaders: {},\n        actionHeaders: {},\n        activeDeferreds: null\n      };\n    } else if (!matches) {\n      let error = getInternalRouterError(404, {\n        pathname: location.pathname\n      });\n      let {\n        matches: notFoundMatches,\n        route\n      } = getShortCircuitMatches(dataRoutes);\n      return {\n        basename,\n        location,\n        matches: notFoundMatches,\n        loaderData: {},\n        actionData: null,\n        errors: {\n          [route.id]: error\n        },\n        statusCode: error.status,\n        loaderHeaders: {},\n        actionHeaders: {},\n        activeDeferreds: null\n      };\n    }\n    let result = await queryImpl(request, location, matches, requestContext);\n    if (isResponse(result)) {\n      return result;\n    }\n    // When returning StaticHandlerContext, we patch back in the location here\n    // since we need it for React Context.  But this helps keep our submit and\n    // loadRouteData operating on a Request instead of a Location\n    return _extends({\n      location,\n      basename\n    }, result);\n  }\n  /**\n   * The queryRoute() method is intended for targeted route requests, either\n   * for fetch ?_data requests or resource route requests.  In this case, we\n   * are only ever calling a single action or loader, and we are returning the\n   * returned value directly.  In most cases, this will be a Response returned\n   * from the action/loader, but it may be a primitive or other value as well -\n   * and in such cases the calling context should handle that accordingly.\n   *\n   * We do respect the throw/return differentiation, so if an action/loader\n   * throws, then this method will throw the value.  This is important so we\n   * can do proper boundary identification in Remix where a thrown Response\n   * must go to the Catch Boundary but a returned Response is happy-path.\n   *\n   * One thing to note is that any Router-initiated Errors that make sense\n   * to associate with a status code will be thrown as an ErrorResponse\n   * instance which include the raw Error, such that the calling context can\n   * serialize the error as they see fit while including the proper response\n   * code.  Examples here are 404 and 405 errors that occur prior to reaching\n   * any user-defined loaders.\n   */\n  async function queryRoute(request, _temp3) {\n    let {\n      routeId,\n      requestContext\n    } = _temp3 === void 0 ? {} : _temp3;\n    let url = new URL(request.url);\n    let method = request.method;\n    let location = createLocation(\"\", createPath(url), null, \"default\");\n    let matches = matchRoutes(dataRoutes, location, basename);\n    // SSR supports HEAD requests while SPA doesn't\n    if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n      throw getInternalRouterError(405, {\n        method\n      });\n    } else if (!matches) {\n      throw getInternalRouterError(404, {\n        pathname: location.pathname\n      });\n    }\n    let match = routeId ? matches.find(m => m.route.id === routeId) : getTargetMatch(matches, location);\n    if (routeId && !match) {\n      throw getInternalRouterError(403, {\n        pathname: location.pathname,\n        routeId\n      });\n    } else if (!match) {\n      // This should never hit I don't think?\n      throw getInternalRouterError(404, {\n        pathname: location.pathname\n      });\n    }\n    let result = await queryImpl(request, location, matches, requestContext, match);\n    if (isResponse(result)) {\n      return result;\n    }\n    let error = result.errors ? Object.values(result.errors)[0] : undefined;\n    if (error !== undefined) {\n      // If we got back result.errors, that means the loader/action threw\n      // _something_ that wasn't a Response, but it's not guaranteed/required\n      // to be an `instanceof Error` either, so we have to use throw here to\n      // preserve the \"error\" state outside of queryImpl.\n      throw error;\n    }\n    // Pick off the right state value to return\n    if (result.actionData) {\n      return Object.values(result.actionData)[0];\n    }\n    if (result.loaderData) {\n      var _result$activeDeferre;\n      let data = Object.values(result.loaderData)[0];\n      if ((_result$activeDeferre = result.activeDeferreds) != null && _result$activeDeferre[match.route.id]) {\n        data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n      }\n      return data;\n    }\n    return undefined;\n  }\n  async function queryImpl(request, location, matches, requestContext, routeMatch) {\n    invariant(request.signal, \"query()/queryRoute() requests must contain an AbortController signal\");\n    try {\n      if (isMutationMethod(request.method.toLowerCase())) {\n        let result = await submit(request, matches, routeMatch || getTargetMatch(matches, location), requestContext, routeMatch != null);\n        return result;\n      }\n      let result = await loadRouteData(request, matches, requestContext, routeMatch);\n      return isResponse(result) ? result : _extends({}, result, {\n        actionData: null,\n        actionHeaders: {}\n      });\n    } catch (e) {\n      // If the user threw/returned a Response in callLoaderOrAction, we throw\n      // it to bail out and then return or throw here based on whether the user\n      // returned or threw\n      if (isQueryRouteResponse(e)) {\n        if (e.type === ResultType.error && !isRedirectResponse(e.response)) {\n          throw e.response;\n        }\n        return e.response;\n      }\n      // Redirects are always returned since they don't propagate to catch\n      // boundaries\n      if (isRedirectResponse(e)) {\n        return e;\n      }\n      throw e;\n    }\n  }\n  async function submit(request, matches, actionMatch, requestContext, isRouteRequest) {\n    let result;\n    if (!actionMatch.route.action && !actionMatch.route.lazy) {\n      let error = getInternalRouterError(405, {\n        method: request.method,\n        pathname: new URL(request.url).pathname,\n        routeId: actionMatch.route.id\n      });\n      if (isRouteRequest) {\n        throw error;\n      }\n      result = {\n        type: ResultType.error,\n        error\n      };\n    } else {\n      result = await callLoaderOrAction(\"action\", request, actionMatch, matches, manifest, mapRouteProperties, basename, true, isRouteRequest, requestContext);\n      if (request.signal.aborted) {\n        let method = isRouteRequest ? \"queryRoute\" : \"query\";\n        throw new Error(method + \"() call aborted\");\n      }\n    }\n    if (isRedirectResult(result)) {\n      // Uhhhh - this should never happen, we should always throw these from\n      // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n      // can get back on the \"throw all redirect responses\" train here should\n      // this ever happen :/\n      throw new Response(null, {\n        status: result.status,\n        headers: {\n          Location: result.location\n        }\n      });\n    }\n    if (isDeferredResult(result)) {\n      let error = getInternalRouterError(400, {\n        type: \"defer-action\"\n      });\n      if (isRouteRequest) {\n        throw error;\n      }\n      result = {\n        type: ResultType.error,\n        error\n      };\n    }\n    if (isRouteRequest) {\n      // Note: This should only be non-Response values if we get here, since\n      // isRouteRequest should throw any Response received in callLoaderOrAction\n      if (isErrorResult(result)) {\n        throw result.error;\n      }\n      return {\n        matches: [actionMatch],\n        loaderData: {},\n        actionData: {\n          [actionMatch.route.id]: result.data\n        },\n        errors: null,\n        // Note: statusCode + headers are unused here since queryRoute will\n        // return the raw Response or value\n        statusCode: 200,\n        loaderHeaders: {},\n        actionHeaders: {},\n        activeDeferreds: null\n      };\n    }\n    if (isErrorResult(result)) {\n      // Store off the pending error - we use it to determine which loaders\n      // to call and will commit it when we complete the navigation\n      let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n      let context = await loadRouteData(request, matches, requestContext, undefined, {\n        [boundaryMatch.route.id]: result.error\n      });\n      // action status codes take precedence over loader status codes\n      return _extends({}, context, {\n        statusCode: isRouteErrorResponse(result.error) ? result.error.status : 500,\n        actionData: null,\n        actionHeaders: _extends({}, result.headers ? {\n          [actionMatch.route.id]: result.headers\n        } : {})\n      });\n    }\n    // Create a GET request for the loaders\n    let loaderRequest = new Request(request.url, {\n      headers: request.headers,\n      redirect: request.redirect,\n      signal: request.signal\n    });\n    let context = await loadRouteData(loaderRequest, matches, requestContext);\n    return _extends({}, context, result.statusCode ? {\n      statusCode: result.statusCode\n    } : {}, {\n      actionData: {\n        [actionMatch.route.id]: result.data\n      },\n      actionHeaders: _extends({}, result.headers ? {\n        [actionMatch.route.id]: result.headers\n      } : {})\n    });\n  }\n  async function loadRouteData(request, matches, requestContext, routeMatch, pendingActionError) {\n    let isRouteRequest = routeMatch != null;\n    // Short circuit if we have no loaders to run (queryRoute())\n    if (isRouteRequest && !(routeMatch != null && routeMatch.route.loader) && !(routeMatch != null && routeMatch.route.lazy)) {\n      throw getInternalRouterError(400, {\n        method: request.method,\n        pathname: new URL(request.url).pathname,\n        routeId: routeMatch == null ? void 0 : routeMatch.route.id\n      });\n    }\n    let requestMatches = routeMatch ? [routeMatch] : getLoaderMatchesUntilBoundary(matches, Object.keys(pendingActionError || {})[0]);\n    let matchesToLoad = requestMatches.filter(m => m.route.loader || m.route.lazy);\n    // Short circuit if we have no loaders to run (query())\n    if (matchesToLoad.length === 0) {\n      return {\n        matches,\n        // Add a null for all matched routes for proper revalidation on the client\n        loaderData: matches.reduce((acc, m) => Object.assign(acc, {\n          [m.route.id]: null\n        }), {}),\n        errors: pendingActionError || null,\n        statusCode: 200,\n        loaderHeaders: {},\n        activeDeferreds: null\n      };\n    }\n    let results = await Promise.all([...matchesToLoad.map(match => callLoaderOrAction(\"loader\", request, match, matches, manifest, mapRouteProperties, basename, true, isRouteRequest, requestContext))]);\n    if (request.signal.aborted) {\n      let method = isRouteRequest ? \"queryRoute\" : \"query\";\n      throw new Error(method + \"() call aborted\");\n    }\n    // Process and commit output from loaders\n    let activeDeferreds = new Map();\n    let context = processRouteLoaderData(matches, matchesToLoad, results, pendingActionError, activeDeferreds);\n    // Add a null for any non-loader matches for proper revalidation on the client\n    let executedLoaders = new Set(matchesToLoad.map(match => match.route.id));\n    matches.forEach(match => {\n      if (!executedLoaders.has(match.route.id)) {\n        context.loaderData[match.route.id] = null;\n      }\n    });\n    return _extends({}, context, {\n      matches,\n      activeDeferreds: activeDeferreds.size > 0 ? Object.fromEntries(activeDeferreds.entries()) : null\n    });\n  }\n  return {\n    dataRoutes,\n    query,\n    queryRoute\n  };\n}\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nfunction getStaticContextFromError(routes, context, error) {\n  let newContext = _extends({}, context, {\n    statusCode: 500,\n    errors: {\n      [context._deepestRenderedBoundaryId || routes[0].id]: error\n    }\n  });\n  return newContext;\n}\nfunction isSubmissionNavigation(opts) {\n  return opts != null && \"formData\" in opts;\n}\nfunction normalizeTo(location, matches, basename, prependBasename, to, fromRouteId, relative) {\n  let contextualMatches;\n  let activeRouteMatch;\n  if (fromRouteId != null && relative !== \"path\") {\n    // Grab matches up to the calling route so our route-relative logic is\n    // relative to the correct source route.  When using relative:path,\n    // fromRouteId is ignored since that is always relative to the current\n    // location path\n    contextualMatches = [];\n    for (let match of matches) {\n      contextualMatches.push(match);\n      if (match.route.id === fromRouteId) {\n        activeRouteMatch = match;\n        break;\n      }\n    }\n  } else {\n    contextualMatches = matches;\n    activeRouteMatch = matches[matches.length - 1];\n  }\n  // Resolve the relative path\n  let path = resolveTo(to ? to : \".\", getPathContributingMatches(contextualMatches).map(m => m.pathnameBase), stripBasename(location.pathname, basename) || location.pathname, relative === \"path\");\n  // When `to` is not specified we inherit search/hash from the current\n  // location, unlike when to=\".\" and we just inherit the path.\n  // See https://github.com/remix-run/remix/issues/927\n  if (to == null) {\n    path.search = location.search;\n    path.hash = location.hash;\n  }\n  // Add an ?index param for matched index routes if we don't already have one\n  if ((to == null || to === \"\" || to === \".\") && activeRouteMatch && activeRouteMatch.route.index && !hasNakedIndexQuery(path.search)) {\n    path.search = path.search ? path.search.replace(/^\\?/, \"?index&\") : \"?index\";\n  }\n  // If we're operating within a basename, prepend it to the pathname.  If\n  // this is a root navigation, then just use the raw basename which allows\n  // the basename to have full control over the presence of a trailing slash\n  // on root actions\n  if (prependBasename && basename !== \"/\") {\n    path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n  }\n  return createPath(path);\n}\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(normalizeFormMethod, isFetcher, path, opts) {\n  // Return location verbatim on non-submission navigations\n  if (!opts || !isSubmissionNavigation(opts)) {\n    return {\n      path\n    };\n  }\n  if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n    return {\n      path,\n      error: getInternalRouterError(405, {\n        method: opts.formMethod\n      })\n    };\n  }\n  // Create a Submission on non-GET navigations\n  let submission;\n  if (opts.formData) {\n    let formMethod = opts.formMethod || \"get\";\n    submission = {\n      formMethod: normalizeFormMethod ? formMethod.toUpperCase() : formMethod.toLowerCase(),\n      formAction: stripHashFromPath(path),\n      formEncType: opts && opts.formEncType || \"application/x-www-form-urlencoded\",\n      formData: opts.formData\n    };\n    if (isMutationMethod(submission.formMethod)) {\n      return {\n        path,\n        submission\n      };\n    }\n  }\n  // Flatten submission onto URLSearchParams for GET submissions\n  let parsedPath = parsePath(path);\n  let searchParams = convertFormDataToSearchParams(opts.formData);\n  // On GET navigation submissions we can drop the ?index param from the\n  // resulting location since all loaders will run.  But fetcher GET submissions\n  // only run a single loader so we need to preserve any incoming ?index params\n  if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n    searchParams.append(\"index\", \"\");\n  }\n  parsedPath.search = \"?\" + searchParams;\n  return {\n    path: createPath(parsedPath),\n    submission\n  };\n}\n// Filter out all routes below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(matches, boundaryId) {\n  let boundaryMatches = matches;\n  if (boundaryId) {\n    let index = matches.findIndex(m => m.route.id === boundaryId);\n    if (index >= 0) {\n      boundaryMatches = matches.slice(0, index);\n    }\n  }\n  return boundaryMatches;\n}\nfunction getMatchesToLoad(history, state, matches, submission, location, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, fetchLoadMatches, routesToUse, basename, pendingActionData, pendingError) {\n  let actionResult = pendingError ? Object.values(pendingError)[0] : pendingActionData ? Object.values(pendingActionData)[0] : undefined;\n  let currentUrl = history.createURL(state.location);\n  let nextUrl = history.createURL(location);\n  // Pick navigation matches that are net-new or qualify for revalidation\n  let boundaryId = pendingError ? Object.keys(pendingError)[0] : undefined;\n  let boundaryMatches = getLoaderMatchesUntilBoundary(matches, boundaryId);\n  let navigationMatches = boundaryMatches.filter((match, index) => {\n    if (match.route.lazy) {\n      // We haven't loaded this route yet so we don't know if it's got a loader!\n      return true;\n    }\n    if (match.route.loader == null) {\n      return false;\n    }\n    // Always call the loader on new route instances and pending defer cancellations\n    if (isNewLoader(state.loaderData, state.matches[index], match) || cancelledDeferredRoutes.some(id => id === match.route.id)) {\n      return true;\n    }\n    // This is the default implementation for when we revalidate.  If the route\n    // provides it's own implementation, then we give them full control but\n    // provide this value so they can leverage it if needed after they check\n    // their own specific use cases\n    let currentRouteMatch = state.matches[index];\n    let nextRouteMatch = match;\n    return shouldRevalidateLoader(match, _extends({\n      currentUrl,\n      currentParams: currentRouteMatch.params,\n      nextUrl,\n      nextParams: nextRouteMatch.params\n    }, submission, {\n      actionResult,\n      defaultShouldRevalidate:\n      // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n      isRevalidationRequired ||\n      // Clicked the same link, resubmitted a GET form\n      currentUrl.pathname + currentUrl.search === nextUrl.pathname + nextUrl.search ||\n      // Search params affect all loaders\n      currentUrl.search !== nextUrl.search || isNewRouteInstance(currentRouteMatch, nextRouteMatch)\n    }));\n  });\n  // Pick fetcher.loads that need to be revalidated\n  let revalidatingFetchers = [];\n  fetchLoadMatches.forEach((f, key) => {\n    // Don't revalidate if fetcher won't be present in the subsequent render\n    if (!matches.some(m => m.route.id === f.routeId)) {\n      return;\n    }\n    let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n    // If the fetcher path no longer matches, push it in with null matches so\n    // we can trigger a 404 in callLoadersAndMaybeResolveData\n    if (!fetcherMatches) {\n      revalidatingFetchers.push({\n        key,\n        routeId: f.routeId,\n        path: f.path,\n        matches: null,\n        match: null,\n        controller: null\n      });\n      return;\n    }\n    let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n    if (cancelledFetcherLoads.includes(key)) {\n      revalidatingFetchers.push({\n        key,\n        routeId: f.routeId,\n        path: f.path,\n        matches: fetcherMatches,\n        match: fetcherMatch,\n        controller: new AbortController()\n      });\n      return;\n    }\n    // Revalidating fetchers are decoupled from the route matches since they\n    // hit a static href, so they _always_ check shouldRevalidate and the\n    // default is strictly if a revalidation is explicitly required (action\n    // submissions, useRevalidator, X-Remix-Revalidate).\n    let shouldRevalidate = shouldRevalidateLoader(fetcherMatch, _extends({\n      currentUrl,\n      currentParams: state.matches[state.matches.length - 1].params,\n      nextUrl,\n      nextParams: matches[matches.length - 1].params\n    }, submission, {\n      actionResult,\n      // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n      defaultShouldRevalidate: isRevalidationRequired\n    }));\n    if (shouldRevalidate) {\n      revalidatingFetchers.push({\n        key,\n        routeId: f.routeId,\n        path: f.path,\n        matches: fetcherMatches,\n        match: fetcherMatch,\n        controller: new AbortController()\n      });\n    }\n  });\n  return [navigationMatches, revalidatingFetchers];\n}\nfunction isNewLoader(currentLoaderData, currentMatch, match) {\n  let isNew =\n  // [a] -> [a, b]\n  !currentMatch ||\n  // [a, b] -> [a, c]\n  match.route.id !== currentMatch.route.id;\n  // Handle the case that we don't have data for a re-used route, potentially\n  // from a prior error or from a cancelled pending deferred\n  let isMissingData = currentLoaderData[match.route.id] === undefined;\n  // Always load if this is a net-new route or we don't yet have data\n  return isNew || isMissingData;\n}\nfunction isNewRouteInstance(currentMatch, match) {\n  let currentPath = currentMatch.route.path;\n  return (\n    // param change for this match, /users/123 -> /users/456\n    currentMatch.pathname !== match.pathname ||\n    // splat param changed, which is not present in match.path\n    // e.g. /files/images/avatar.jpg -> files/finances.xls\n    currentPath != null && currentPath.endsWith(\"*\") && currentMatch.params[\"*\"] !== match.params[\"*\"]\n  );\n}\nfunction shouldRevalidateLoader(loaderMatch, arg) {\n  if (loaderMatch.route.shouldRevalidate) {\n    let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n    if (typeof routeChoice === \"boolean\") {\n      return routeChoice;\n    }\n  }\n  return arg.defaultShouldRevalidate;\n}\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(route, mapRouteProperties, manifest) {\n  if (!route.lazy) {\n    return;\n  }\n  let lazyRoute = await route.lazy();\n  // If the lazy route function was executed and removed by another parallel\n  // call then we can return - first lazy() to finish wins because the return\n  // value of lazy is expected to be static\n  if (!route.lazy) {\n    return;\n  }\n  let routeToUpdate = manifest[route.id];\n  invariant(routeToUpdate, \"No route found in manifest\");\n  // Update the route in place.  This should be safe because there's no way\n  // we could yet be sitting on this route as we can't get there without\n  // resolving lazy() first.\n  //\n  // This is different than the HMR \"update\" use-case where we may actively be\n  // on the route being updated.  The main concern boils down to \"does this\n  // mutation affect any ongoing navigations or any current state.matches\n  // values?\".  If not, it should be safe to update in place.\n  let routeUpdates = {};\n  for (let lazyRouteProperty in lazyRoute) {\n    let staticRouteValue = routeToUpdate[lazyRouteProperty];\n    let isPropertyStaticallyDefined = staticRouteValue !== undefined &&\n    // This property isn't static since it should always be updated based\n    // on the route updates\n    lazyRouteProperty !== \"hasErrorBoundary\";\n    warning(!isPropertyStaticallyDefined, \"Route \\\"\" + routeToUpdate.id + \"\\\" has a static property \\\"\" + lazyRouteProperty + \"\\\" \" + \"defined but its lazy function is also returning a value for this property. \" + (\"The lazy route property \\\"\" + lazyRouteProperty + \"\\\" will be ignored.\"));\n    if (!isPropertyStaticallyDefined && !immutableRouteKeys.has(lazyRouteProperty)) {\n      routeUpdates[lazyRouteProperty] = lazyRoute[lazyRouteProperty];\n    }\n  }\n  // Mutate the route with the provided updates.  Do this first so we pass\n  // the updated version to mapRouteProperties\n  Object.assign(routeToUpdate, routeUpdates);\n  // Mutate the `hasErrorBoundary` property on the route based on the route\n  // updates and remove the `lazy` function so we don't resolve the lazy\n  // route again.\n  Object.assign(routeToUpdate, _extends({}, mapRouteProperties(routeToUpdate), {\n    lazy: undefined\n  }));\n}\nasync function callLoaderOrAction(type, request, match, matches, manifest, mapRouteProperties, basename, isStaticRequest, isRouteRequest, requestContext) {\n  if (isStaticRequest === void 0) {\n    isStaticRequest = false;\n  }\n  if (isRouteRequest === void 0) {\n    isRouteRequest = false;\n  }\n  let resultType;\n  let result;\n  let onReject;\n  let runHandler = handler => {\n    // Setup a promise we can race against so that abort signals short circuit\n    let reject;\n    let abortPromise = new Promise((_, r) => reject = r);\n    onReject = () => reject();\n    request.signal.addEventListener(\"abort\", onReject);\n    return Promise.race([handler({\n      request,\n      params: match.params,\n      context: requestContext\n    }), abortPromise]);\n  };\n  try {\n    let handler = match.route[type];\n    if (match.route.lazy) {\n      if (handler) {\n        // Run statically defined handler in parallel with lazy()\n        let values = await Promise.all([runHandler(handler), loadLazyRouteModule(match.route, mapRouteProperties, manifest)]);\n        result = values[0];\n      } else {\n        // Load lazy route module, then run any returned handler\n        await loadLazyRouteModule(match.route, mapRouteProperties, manifest);\n        handler = match.route[type];\n        if (handler) {\n          // Handler still run even if we got interrupted to maintain consistency\n          // with un-abortable behavior of handler execution on non-lazy or\n          // previously-lazy-loaded routes\n          result = await runHandler(handler);\n        } else if (type === \"action\") {\n          let url = new URL(request.url);\n          let pathname = url.pathname + url.search;\n          throw getInternalRouterError(405, {\n            method: request.method,\n            pathname,\n            routeId: match.route.id\n          });\n        } else {\n          // lazy() route has no loader to run.  Short circuit here so we don't\n          // hit the invariant below that errors on returning undefined.\n          return {\n            type: ResultType.data,\n            data: undefined\n          };\n        }\n      }\n    } else if (!handler) {\n      let url = new URL(request.url);\n      let pathname = url.pathname + url.search;\n      throw getInternalRouterError(404, {\n        pathname\n      });\n    } else {\n      result = await runHandler(handler);\n    }\n    invariant(result !== undefined, \"You defined \" + (type === \"action\" ? \"an action\" : \"a loader\") + \" for route \" + (\"\\\"\" + match.route.id + \"\\\" but didn't return anything from your `\" + type + \"` \") + \"function. Please return a value or `null`.\");\n  } catch (e) {\n    resultType = ResultType.error;\n    result = e;\n  } finally {\n    if (onReject) {\n      request.signal.removeEventListener(\"abort\", onReject);\n    }\n  }\n  if (isResponse(result)) {\n    let status = result.status;\n    // Process redirects\n    if (redirectStatusCodes.has(status)) {\n      let location = result.headers.get(\"Location\");\n      invariant(location, \"Redirects returned/thrown from loaders/actions must have a Location header\");\n      // Support relative routing in internal redirects\n      if (!ABSOLUTE_URL_REGEX.test(location)) {\n        location = normalizeTo(new URL(request.url), matches.slice(0, matches.indexOf(match) + 1), basename, true, location);\n      } else if (!isStaticRequest) {\n        // Strip off the protocol+origin for same-origin + same-basename absolute\n        // redirects. If this is a static request, we can let it go back to the\n        // browser as-is\n        let currentUrl = new URL(request.url);\n        let url = location.startsWith(\"//\") ? new URL(currentUrl.protocol + location) : new URL(location);\n        let isSameBasename = stripBasename(url.pathname, basename) != null;\n        if (url.origin === currentUrl.origin && isSameBasename) {\n          location = url.pathname + url.search + url.hash;\n        }\n      }\n      // Don't process redirects in the router during static requests requests.\n      // Instead, throw the Response and let the server handle it with an HTTP\n      // redirect.  We also update the Location header in place in this flow so\n      // basename and relative routing is taken into account\n      if (isStaticRequest) {\n        result.headers.set(\"Location\", location);\n        throw result;\n      }\n      return {\n        type: ResultType.redirect,\n        status,\n        location,\n        revalidate: result.headers.get(\"X-Remix-Revalidate\") !== null\n      };\n    }\n    // For SSR single-route requests, we want to hand Responses back directly\n    // without unwrapping.  We do this with the QueryRouteResponse wrapper\n    // interface so we can know whether it was returned or thrown\n    if (isRouteRequest) {\n      // eslint-disable-next-line no-throw-literal\n      throw {\n        type: resultType || ResultType.data,\n        response: result\n      };\n    }\n    let data;\n    let contentType = result.headers.get(\"Content-Type\");\n    // Check between word boundaries instead of startsWith() due to the last\n    // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n    if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n      data = await result.json();\n    } else {\n      data = await result.text();\n    }\n    if (resultType === ResultType.error) {\n      return {\n        type: resultType,\n        error: new ErrorResponse(status, result.statusText, data),\n        headers: result.headers\n      };\n    }\n    return {\n      type: ResultType.data,\n      data,\n      statusCode: result.status,\n      headers: result.headers\n    };\n  }\n  if (resultType === ResultType.error) {\n    return {\n      type: resultType,\n      error: result\n    };\n  }\n  if (isDeferredData(result)) {\n    var _result$init, _result$init2;\n    return {\n      type: ResultType.deferred,\n      deferredData: result,\n      statusCode: (_result$init = result.init) == null ? void 0 : _result$init.status,\n      headers: ((_result$init2 = result.init) == null ? void 0 : _result$init2.headers) && new Headers(result.init.headers)\n    };\n  }\n  return {\n    type: ResultType.data,\n    data: result\n  };\n}\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches.  During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(history, location, signal, submission) {\n  let url = history.createURL(stripHashFromPath(location)).toString();\n  let init = {\n    signal\n  };\n  if (submission && isMutationMethod(submission.formMethod)) {\n    let {\n      formMethod,\n      formEncType,\n      formData\n    } = submission;\n    // Didn't think we needed this but it turns out unlike other methods, patch\n    // won't be properly normalized to uppercase and results in a 405 error.\n    // See: https://fetch.spec.whatwg.org/#concept-method\n    init.method = formMethod.toUpperCase();\n    init.body = formEncType === \"application/x-www-form-urlencoded\" ? convertFormDataToSearchParams(formData) : formData;\n  }\n  // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n  return new Request(url, init);\n}\nfunction convertFormDataToSearchParams(formData) {\n  let searchParams = new URLSearchParams();\n  for (let [key, value] of formData.entries()) {\n    // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n    searchParams.append(key, value instanceof File ? value.name : value);\n  }\n  return searchParams;\n}\nfunction processRouteLoaderData(matches, matchesToLoad, results, pendingError, activeDeferreds) {\n  // Fill in loaderData/errors from our loaders\n  let loaderData = {};\n  let errors = null;\n  let statusCode;\n  let foundError = false;\n  let loaderHeaders = {};\n  // Process loader results into state.loaderData/state.errors\n  results.forEach((result, index) => {\n    let id = matchesToLoad[index].route.id;\n    invariant(!isRedirectResult(result), \"Cannot handle redirect results in processLoaderData\");\n    if (isErrorResult(result)) {\n      // Look upwards from the matched route for the closest ancestor\n      // error boundary, defaulting to the root match\n      let boundaryMatch = findNearestBoundary(matches, id);\n      let error = result.error;\n      // If we have a pending action error, we report it at the highest-route\n      // that throws a loader error, and then clear it out to indicate that\n      // it was consumed\n      if (pendingError) {\n        error = Object.values(pendingError)[0];\n        pendingError = undefined;\n      }\n      errors = errors || {};\n      // Prefer higher error values if lower errors bubble to the same boundary\n      if (errors[boundaryMatch.route.id] == null) {\n        errors[boundaryMatch.route.id] = error;\n      }\n      // Clear our any prior loaderData for the throwing route\n      loaderData[id] = undefined;\n      // Once we find our first (highest) error, we set the status code and\n      // prevent deeper status codes from overriding\n      if (!foundError) {\n        foundError = true;\n        statusCode = isRouteErrorResponse(result.error) ? result.error.status : 500;\n      }\n      if (result.headers) {\n        loaderHeaders[id] = result.headers;\n      }\n    } else {\n      if (isDeferredResult(result)) {\n        activeDeferreds.set(id, result.deferredData);\n        loaderData[id] = result.deferredData.data;\n      } else {\n        loaderData[id] = result.data;\n      }\n      // Error status codes always override success status codes, but if all\n      // loaders are successful we take the deepest status code.\n      if (result.statusCode != null && result.statusCode !== 200 && !foundError) {\n        statusCode = result.statusCode;\n      }\n      if (result.headers) {\n        loaderHeaders[id] = result.headers;\n      }\n    }\n  });\n  // If we didn't consume the pending action error (i.e., all loaders\n  // resolved), then consume it here.  Also clear out any loaderData for the\n  // throwing route\n  if (pendingError) {\n    errors = pendingError;\n    loaderData[Object.keys(pendingError)[0]] = undefined;\n  }\n  return {\n    loaderData,\n    errors,\n    statusCode: statusCode || 200,\n    loaderHeaders\n  };\n}\nfunction processLoaderData(state, matches, matchesToLoad, results, pendingError, revalidatingFetchers, fetcherResults, activeDeferreds) {\n  let {\n    loaderData,\n    errors\n  } = processRouteLoaderData(matches, matchesToLoad, results, pendingError, activeDeferreds);\n  // Process results from our revalidating fetchers\n  for (let index = 0; index < revalidatingFetchers.length; index++) {\n    let {\n      key,\n      match,\n      controller\n    } = revalidatingFetchers[index];\n    invariant(fetcherResults !== undefined && fetcherResults[index] !== undefined, \"Did not find corresponding fetcher result\");\n    let result = fetcherResults[index];\n    // Process fetcher non-redirect errors\n    if (controller && controller.signal.aborted) {\n      // Nothing to do for aborted fetchers\n      continue;\n    } else if (isErrorResult(result)) {\n      let boundaryMatch = findNearestBoundary(state.matches, match == null ? void 0 : match.route.id);\n      if (!(errors && errors[boundaryMatch.route.id])) {\n        errors = _extends({}, errors, {\n          [boundaryMatch.route.id]: result.error\n        });\n      }\n      state.fetchers.delete(key);\n    } else if (isRedirectResult(result)) {\n      // Should never get here, redirects should get processed above, but we\n      // keep this to type narrow to a success result in the else\n      invariant(false, \"Unhandled fetcher revalidation redirect\");\n    } else if (isDeferredResult(result)) {\n      // Should never get here, deferred data should be awaited for fetchers\n      // in resolveDeferredResults\n      invariant(false, \"Unhandled fetcher deferred data\");\n    } else {\n      let doneFetcher = {\n        state: \"idle\",\n        data: result.data,\n        formMethod: undefined,\n        formAction: undefined,\n        formEncType: undefined,\n        formData: undefined,\n        \" _hasFetcherDoneAnything \": true\n      };\n      state.fetchers.set(key, doneFetcher);\n    }\n  }\n  return {\n    loaderData,\n    errors\n  };\n}\nfunction mergeLoaderData(loaderData, newLoaderData, matches, errors) {\n  let mergedLoaderData = _extends({}, newLoaderData);\n  for (let match of matches) {\n    let id = match.route.id;\n    if (newLoaderData.hasOwnProperty(id)) {\n      if (newLoaderData[id] !== undefined) {\n        mergedLoaderData[id] = newLoaderData[id];\n      }\n    } else if (loaderData[id] !== undefined && match.route.loader) {\n      // Preserve existing keys not included in newLoaderData and where a loader\n      // wasn't removed by HMR\n      mergedLoaderData[id] = loaderData[id];\n    }\n    if (errors && errors.hasOwnProperty(id)) {\n      // Don't keep any loader data below the boundary\n      break;\n    }\n  }\n  return mergedLoaderData;\n}\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(matches, routeId) {\n  let eligibleMatches = routeId ? matches.slice(0, matches.findIndex(m => m.route.id === routeId) + 1) : [...matches];\n  return eligibleMatches.reverse().find(m => m.route.hasErrorBoundary === true) || matches[0];\n}\nfunction getShortCircuitMatches(routes) {\n  // Prefer a root layout route if present, otherwise shim in a route object\n  let route = routes.find(r => r.index || !r.path || r.path === \"/\") || {\n    id: \"__shim-error-route__\"\n  };\n  return {\n    matches: [{\n      params: {},\n      pathname: \"\",\n      pathnameBase: \"\",\n      route\n    }],\n    route\n  };\n}\nfunction getInternalRouterError(status, _temp4) {\n  let {\n    pathname,\n    routeId,\n    method,\n    type\n  } = _temp4 === void 0 ? {} : _temp4;\n  let statusText = \"Unknown Server Error\";\n  let errorMessage = \"Unknown @remix-run/router error\";\n  if (status === 400) {\n    statusText = \"Bad Request\";\n    if (method && pathname && routeId) {\n      errorMessage = \"You made a \" + method + \" request to \\\"\" + pathname + \"\\\" but \" + (\"did not provide a `loader` for route \\\"\" + routeId + \"\\\", \") + \"so there is no way to handle the request.\";\n    } else if (type === \"defer-action\") {\n      errorMessage = \"defer() is not supported in actions\";\n    }\n  } else if (status === 403) {\n    statusText = \"Forbidden\";\n    errorMessage = \"Route \\\"\" + routeId + \"\\\" does not match URL \\\"\" + pathname + \"\\\"\";\n  } else if (status === 404) {\n    statusText = \"Not Found\";\n    errorMessage = \"No route matches URL \\\"\" + pathname + \"\\\"\";\n  } else if (status === 405) {\n    statusText = \"Method Not Allowed\";\n    if (method && pathname && routeId) {\n      errorMessage = \"You made a \" + method.toUpperCase() + \" request to \\\"\" + pathname + \"\\\" but \" + (\"did not provide an `action` for route \\\"\" + routeId + \"\\\", \") + \"so there is no way to handle the request.\";\n    } else if (method) {\n      errorMessage = \"Invalid request method \\\"\" + method.toUpperCase() + \"\\\"\";\n    }\n  }\n  return new ErrorResponse(status || 500, statusText, new Error(errorMessage), true);\n}\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(results) {\n  for (let i = results.length - 1; i >= 0; i--) {\n    let result = results[i];\n    if (isRedirectResult(result)) {\n      return result;\n    }\n  }\n}\nfunction stripHashFromPath(path) {\n  let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n  return createPath(_extends({}, parsedPath, {\n    hash: \"\"\n  }));\n}\nfunction isHashChangeOnly(a, b) {\n  if (a.pathname !== b.pathname || a.search !== b.search) {\n    return false;\n  }\n  if (a.hash === \"\") {\n    // /page -> /page#hash\n    return b.hash !== \"\";\n  } else if (a.hash === b.hash) {\n    // /page#hash -> /page#hash\n    return true;\n  } else if (b.hash !== \"\") {\n    // /page#hash -> /page#other\n    return true;\n  }\n  // If the hash is removed the browser will re-perform a request to the server\n  // /page#hash -> /page\n  return false;\n}\nfunction isDeferredResult(result) {\n  return result.type === ResultType.deferred;\n}\nfunction isErrorResult(result) {\n  return result.type === ResultType.error;\n}\nfunction isRedirectResult(result) {\n  return (result && result.type) === ResultType.redirect;\n}\nfunction isDeferredData(value) {\n  let deferred = value;\n  return deferred && typeof deferred === \"object\" && typeof deferred.data === \"object\" && typeof deferred.subscribe === \"function\" && typeof deferred.cancel === \"function\" && typeof deferred.resolveData === \"function\";\n}\nfunction isResponse(value) {\n  return value != null && typeof value.status === \"number\" && typeof value.statusText === \"string\" && typeof value.headers === \"object\" && typeof value.body !== \"undefined\";\n}\nfunction isRedirectResponse(result) {\n  if (!isResponse(result)) {\n    return false;\n  }\n  let status = result.status;\n  let location = result.headers.get(\"Location\");\n  return status >= 300 && status <= 399 && location != null;\n}\nfunction isQueryRouteResponse(obj) {\n  return obj && isResponse(obj.response) && (obj.type === ResultType.data || ResultType.error);\n}\nfunction isValidMethod(method) {\n  return validRequestMethods.has(method.toLowerCase());\n}\nfunction isMutationMethod(method) {\n  return validMutationMethods.has(method.toLowerCase());\n}\nasync function resolveDeferredResults(currentMatches, matchesToLoad, results, signals, isFetcher, currentLoaderData) {\n  for (let index = 0; index < results.length; index++) {\n    let result = results[index];\n    let match = matchesToLoad[index];\n    // If we don't have a match, then we can have a deferred result to do\n    // anything with.  This is for revalidating fetchers where the route was\n    // removed during HMR\n    if (!match) {\n      continue;\n    }\n    let currentMatch = currentMatches.find(m => m.route.id === match.route.id);\n    let isRevalidatingLoader = currentMatch != null && !isNewRouteInstance(currentMatch, match) && (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n    if (isDeferredResult(result) && (isFetcher || isRevalidatingLoader)) {\n      // Note: we do not have to touch activeDeferreds here since we race them\n      // against the signal in resolveDeferredData and they'll get aborted\n      // there if needed\n      let signal = signals[index];\n      invariant(signal, \"Expected an AbortSignal for revalidating fetcher deferred result\");\n      await resolveDeferredData(result, signal, isFetcher).then(result => {\n        if (result) {\n          results[index] = result || results[index];\n        }\n      });\n    }\n  }\n}\nasync function resolveDeferredData(result, signal, unwrap) {\n  if (unwrap === void 0) {\n    unwrap = false;\n  }\n  let aborted = await result.deferredData.resolveData(signal);\n  if (aborted) {\n    return;\n  }\n  if (unwrap) {\n    try {\n      return {\n        type: ResultType.data,\n        data: result.deferredData.unwrappedData\n      };\n    } catch (e) {\n      // Handle any TrackedPromise._error values encountered while unwrapping\n      return {\n        type: ResultType.error,\n        error: e\n      };\n    }\n  }\n  return {\n    type: ResultType.data,\n    data: result.deferredData.data\n  };\n}\nfunction hasNakedIndexQuery(search) {\n  return new URLSearchParams(search).getAll(\"index\").some(v => v === \"\");\n}\n// Note: This should match the format exported by useMatches, so if you change\n// this please also change that :)  Eventually we'll DRY this up\nfunction createUseMatchesMatch(match, loaderData) {\n  let {\n    route,\n    pathname,\n    params\n  } = match;\n  return {\n    id: route.id,\n    pathname,\n    params,\n    data: loaderData[route.id],\n    handle: route.handle\n  };\n}\nfunction getTargetMatch(matches, location) {\n  let search = typeof location === \"string\" ? parsePath(location).search : location.search;\n  if (matches[matches.length - 1].route.index && hasNakedIndexQuery(search || \"\")) {\n    // Return the leaf index route when index is present\n    return matches[matches.length - 1];\n  }\n  // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n  // pathless layout routes)\n  let pathMatches = getPathContributingMatches(matches);\n  return pathMatches[pathMatches.length - 1];\n}\n//#endregion\n\nexport { AbortedDeferredError, Action, ErrorResponse, IDLE_BLOCKER, IDLE_FETCHER, IDLE_NAVIGATION, UNSAFE_DEFERRED_SYMBOL, DeferredData as UNSAFE_DeferredData, convertRoutesToDataRoutes as UNSAFE_convertRoutesToDataRoutes, getPathContributingMatches as UNSAFE_getPathContributingMatches, invariant as UNSAFE_invariant, warning as UNSAFE_warning, createBrowserHistory, createHashHistory, createMemoryHistory, createPath, createRouter, createStaticHandler, defer, generatePath, getStaticContextFromError, getToPathname, isDeferredData, isRouteErrorResponse, joinPaths, json, matchPath, matchRoutes, normalizePathname, parsePath, redirect, resolvePath, resolveTo, stripBasename };\n//# sourceMappingURL=router.js.map\n","/**\n * React Router v6.12.0\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport * as React from 'react';\nimport { UNSAFE_invariant, joinPaths, matchPath, UNSAFE_getPathContributingMatches, UNSAFE_warning, resolveTo, parsePath, matchRoutes, Action, isRouteErrorResponse, createMemoryHistory, stripBasename, AbortedDeferredError, createRouter } from '@remix-run/router';\nexport { AbortedDeferredError, Action as NavigationType, createPath, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, parsePath, redirect, resolvePath } from '@remix-run/router';\n\nfunction _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nconst DataRouterContext = /*#__PURE__*/React.createContext(null);\nif (process.env.NODE_ENV !== \"production\") {\n  DataRouterContext.displayName = \"DataRouter\";\n}\nconst DataRouterStateContext = /*#__PURE__*/React.createContext(null);\nif (process.env.NODE_ENV !== \"production\") {\n  DataRouterStateContext.displayName = \"DataRouterState\";\n}\nconst AwaitContext = /*#__PURE__*/React.createContext(null);\nif (process.env.NODE_ENV !== \"production\") {\n  AwaitContext.displayName = \"Await\";\n}\n\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level <Router> API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\n\nconst NavigationContext = /*#__PURE__*/React.createContext(null);\nif (process.env.NODE_ENV !== \"production\") {\n  NavigationContext.displayName = \"Navigation\";\n}\nconst LocationContext = /*#__PURE__*/React.createContext(null);\nif (process.env.NODE_ENV !== \"production\") {\n  LocationContext.displayName = \"Location\";\n}\nconst RouteContext = /*#__PURE__*/React.createContext({\n  outlet: null,\n  matches: [],\n  isDataRoute: false\n});\nif (process.env.NODE_ENV !== \"production\") {\n  RouteContext.displayName = \"Route\";\n}\nconst RouteErrorContext = /*#__PURE__*/React.createContext(null);\nif (process.env.NODE_ENV !== \"production\") {\n  RouteErrorContext.displayName = \"RouteError\";\n}\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/hooks/use-href\n */\nfunction useHref(to, _temp) {\n  let {\n    relative\n  } = _temp === void 0 ? {} : _temp;\n  !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n  // router loaded. We can help them understand how to avoid that.\n  \"useHref() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n  let {\n    basename,\n    navigator\n  } = React.useContext(NavigationContext);\n  let {\n    hash,\n    pathname,\n    search\n  } = useResolvedPath(to, {\n    relative\n  });\n  let joinedPathname = pathname;\n\n  // If we're operating within a basename, prepend it to the pathname prior\n  // to creating the href.  If this is a root navigation, then just use the raw\n  // basename which allows the basename to have full control over the presence\n  // of a trailing slash on root links\n  if (basename !== \"/\") {\n    joinedPathname = pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n  }\n  return navigator.createHref({\n    pathname: joinedPathname,\n    search,\n    hash\n  });\n}\n\n/**\n * Returns true if this component is a descendant of a <Router>.\n *\n * @see https://reactrouter.com/hooks/use-in-router-context\n */\nfunction useInRouterContext() {\n  return React.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/hooks/use-location\n */\nfunction useLocation() {\n  !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n  // router loaded. We can help them understand how to avoid that.\n  \"useLocation() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n  return React.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/hooks/use-navigation-type\n */\nfunction useNavigationType() {\n  return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * <NavLink>.\n *\n * @see https://reactrouter.com/hooks/use-match\n */\nfunction useMatch(pattern) {\n  !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n  // router loaded. We can help them understand how to avoid that.\n  \"useMatch() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n  let {\n    pathname\n  } = useLocation();\n  return React.useMemo(() => matchPath(pattern, pathname), [pathname, pattern]);\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\n\nconst navigateEffectWarning = \"You should call navigate() in a React.useEffect(), not when \" + \"your component is first rendered.\";\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(cb) {\n  let isStatic = React.useContext(NavigationContext).static;\n  if (!isStatic) {\n    // We should be able to get rid of this once react 18.3 is released\n    // See: https://github.com/facebook/react/pull/26395\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(cb);\n  }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by <Link>s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/hooks/use-navigate\n */\nfunction useNavigate() {\n  let {\n    isDataRoute\n  } = React.useContext(RouteContext);\n  // Conditional usage is OK here because the usage of a data router is static\n  // eslint-disable-next-line react-hooks/rules-of-hooks\n  return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\nfunction useNavigateUnstable() {\n  !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n  // router loaded. We can help them understand how to avoid that.\n  \"useNavigate() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n  let dataRouterContext = React.useContext(DataRouterContext);\n  let {\n    basename,\n    navigator\n  } = React.useContext(NavigationContext);\n  let {\n    matches\n  } = React.useContext(RouteContext);\n  let {\n    pathname: locationPathname\n  } = useLocation();\n  let routePathnamesJson = JSON.stringify(UNSAFE_getPathContributingMatches(matches).map(match => match.pathnameBase));\n  let activeRef = React.useRef(false);\n  useIsomorphicLayoutEffect(() => {\n    activeRef.current = true;\n  });\n  let navigate = React.useCallback(function (to, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(activeRef.current, navigateEffectWarning) : void 0;\n\n    // Short circuit here since if this happens on first render the navigate\n    // is useless because we haven't wired up our history listener yet\n    if (!activeRef.current) return;\n    if (typeof to === \"number\") {\n      navigator.go(to);\n      return;\n    }\n    let path = resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, options.relative === \"path\");\n\n    // If we're operating within a basename, prepend it to the pathname prior\n    // to handing off to history (but only if we're not in a data router,\n    // otherwise it'll prepend the basename inside of the router).\n    // If this is a root navigation, then we navigate to the raw basename\n    // which allows the basename to have full control over the presence of a\n    // trailing slash on root links\n    if (dataRouterContext == null && basename !== \"/\") {\n      path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n    }\n    (!!options.replace ? navigator.replace : navigator.push)(path, options.state, options);\n  }, [basename, navigator, routePathnamesJson, locationPathname, dataRouterContext]);\n  return navigate;\n}\nconst OutletContext = /*#__PURE__*/React.createContext(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/hooks/use-outlet-context\n */\nfunction useOutletContext() {\n  return React.useContext(OutletContext);\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by <Outlet> to render child routes.\n *\n * @see https://reactrouter.com/hooks/use-outlet\n */\nfunction useOutlet(context) {\n  let outlet = React.useContext(RouteContext).outlet;\n  if (outlet) {\n    return /*#__PURE__*/React.createElement(OutletContext.Provider, {\n      value: context\n    }, outlet);\n  }\n  return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/hooks/use-params\n */\nfunction useParams() {\n  let {\n    matches\n  } = React.useContext(RouteContext);\n  let routeMatch = matches[matches.length - 1];\n  return routeMatch ? routeMatch.params : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/hooks/use-resolved-path\n */\nfunction useResolvedPath(to, _temp2) {\n  let {\n    relative\n  } = _temp2 === void 0 ? {} : _temp2;\n  let {\n    matches\n  } = React.useContext(RouteContext);\n  let {\n    pathname: locationPathname\n  } = useLocation();\n  let routePathnamesJson = JSON.stringify(UNSAFE_getPathContributingMatches(matches).map(match => match.pathnameBase));\n  return React.useMemo(() => resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, relative === \"path\"), [to, routePathnamesJson, locationPathname, relative]);\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an <Outlet> to render their child route's\n * element.\n *\n * @see https://reactrouter.com/hooks/use-routes\n */\nfunction useRoutes(routes, locationArg) {\n  return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nfunction useRoutesImpl(routes, locationArg, dataRouterState) {\n  !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n  // router loaded. We can help them understand how to avoid that.\n  \"useRoutes() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n  let {\n    navigator\n  } = React.useContext(NavigationContext);\n  let {\n    matches: parentMatches\n  } = React.useContext(RouteContext);\n  let routeMatch = parentMatches[parentMatches.length - 1];\n  let parentParams = routeMatch ? routeMatch.params : {};\n  let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n  let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n  let parentRoute = routeMatch && routeMatch.route;\n  if (process.env.NODE_ENV !== \"production\") {\n    // You won't get a warning about 2 different <Routes> under a <Route>\n    // without a trailing *, but this is a best-effort warning anyway since we\n    // cannot even give the warning unless they land at the parent route.\n    //\n    // Example:\n    //\n    // <Routes>\n    //   {/* This route path MUST end with /* because otherwise\n    //       it will never match /blog/post/123 */}\n    //   <Route path=\"blog\" element={<Blog />} />\n    //   <Route path=\"blog/feed\" element={<BlogFeed />} />\n    // </Routes>\n    //\n    // function Blog() {\n    //   return (\n    //     <Routes>\n    //       <Route path=\"post/:id\" element={<Post />} />\n    //     </Routes>\n    //   );\n    // }\n    let parentPath = parentRoute && parentRoute.path || \"\";\n    warningOnce(parentPathname, !parentRoute || parentPath.endsWith(\"*\"), \"You rendered descendant <Routes> (or called `useRoutes()`) at \" + (\"\\\"\" + parentPathname + \"\\\" (under <Route path=\\\"\" + parentPath + \"\\\">) but the \") + \"parent route path has no trailing \\\"*\\\". This means if you navigate \" + \"deeper, the parent won't match anymore and therefore the child \" + \"routes will never render.\\n\\n\" + (\"Please change the parent <Route path=\\\"\" + parentPath + \"\\\"> to <Route \") + (\"path=\\\"\" + (parentPath === \"/\" ? \"*\" : parentPath + \"/*\") + \"\\\">.\"));\n  }\n  let locationFromContext = useLocation();\n  let location;\n  if (locationArg) {\n    var _parsedLocationArg$pa;\n    let parsedLocationArg = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n    !(parentPathnameBase === \"/\" || ((_parsedLocationArg$pa = parsedLocationArg.pathname) == null ? void 0 : _parsedLocationArg$pa.startsWith(parentPathnameBase))) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"When overriding the location using `<Routes location>` or `useRoutes(routes, location)`, \" + \"the location pathname must begin with the portion of the URL pathname that was \" + (\"matched by all parent routes. The current pathname base is \\\"\" + parentPathnameBase + \"\\\" \") + (\"but pathname \\\"\" + parsedLocationArg.pathname + \"\\\" was given in the `location` prop.\")) : UNSAFE_invariant(false) : void 0;\n    location = parsedLocationArg;\n  } else {\n    location = locationFromContext;\n  }\n  let pathname = location.pathname || \"/\";\n  let remainingPathname = parentPathnameBase === \"/\" ? pathname : pathname.slice(parentPathnameBase.length) || \"/\";\n  let matches = matchRoutes(routes, {\n    pathname: remainingPathname\n  });\n  if (process.env.NODE_ENV !== \"production\") {\n    process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(parentRoute || matches != null, \"No routes matched location \\\"\" + location.pathname + location.search + location.hash + \"\\\" \") : void 0;\n    process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(matches == null || matches[matches.length - 1].route.element !== undefined || matches[matches.length - 1].route.Component !== undefined, \"Matched leaf route at location \\\"\" + location.pathname + location.search + location.hash + \"\\\" \" + \"does not have an element or Component. This means it will render an <Outlet /> with a \" + \"null value by default resulting in an \\\"empty\\\" page.\") : void 0;\n  }\n  let renderedMatches = _renderMatches(matches && matches.map(match => Object.assign({}, match, {\n    params: Object.assign({}, parentParams, match.params),\n    pathname: joinPaths([parentPathnameBase,\n    // Re-encode pathnames that were decoded inside matchRoutes\n    navigator.encodeLocation ? navigator.encodeLocation(match.pathname).pathname : match.pathname]),\n    pathnameBase: match.pathnameBase === \"/\" ? parentPathnameBase : joinPaths([parentPathnameBase,\n    // Re-encode pathnames that were decoded inside matchRoutes\n    navigator.encodeLocation ? navigator.encodeLocation(match.pathnameBase).pathname : match.pathnameBase])\n  })), parentMatches, dataRouterState);\n\n  // When a user passes in a `locationArg`, the associated routes need to\n  // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n  // to use the scoped location instead of the global location.\n  if (locationArg && renderedMatches) {\n    return /*#__PURE__*/React.createElement(LocationContext.Provider, {\n      value: {\n        location: _extends({\n          pathname: \"/\",\n          search: \"\",\n          hash: \"\",\n          state: null,\n          key: \"default\"\n        }, location),\n        navigationType: Action.Pop\n      }\n    }, renderedMatches);\n  }\n  return renderedMatches;\n}\nfunction DefaultErrorComponent() {\n  let error = useRouteError();\n  let message = isRouteErrorResponse(error) ? error.status + \" \" + error.statusText : error instanceof Error ? error.message : JSON.stringify(error);\n  let stack = error instanceof Error ? error.stack : null;\n  let lightgrey = \"rgba(200,200,200, 0.5)\";\n  let preStyles = {\n    padding: \"0.5rem\",\n    backgroundColor: lightgrey\n  };\n  let codeStyles = {\n    padding: \"2px 4px\",\n    backgroundColor: lightgrey\n  };\n  let devInfo = null;\n  if (process.env.NODE_ENV !== \"production\") {\n    console.error(\"Error handled by React Router default ErrorBoundary:\", error);\n    devInfo = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(\"p\", null, \"\\uD83D\\uDCBF Hey developer \\uD83D\\uDC4B\"), /*#__PURE__*/React.createElement(\"p\", null, \"You can provide a way better UX than this when your app throws errors by providing your own \", /*#__PURE__*/React.createElement(\"code\", {\n      style: codeStyles\n    }, \"ErrorBoundary\"), \" or\", \" \", /*#__PURE__*/React.createElement(\"code\", {\n      style: codeStyles\n    }, \"errorElement\"), \" prop on your route.\"));\n  }\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(\"h2\", null, \"Unexpected Application Error!\"), /*#__PURE__*/React.createElement(\"h3\", {\n    style: {\n      fontStyle: \"italic\"\n    }\n  }, message), stack ? /*#__PURE__*/React.createElement(\"pre\", {\n    style: preStyles\n  }, stack) : null, devInfo);\n}\nconst defaultErrorElement = /*#__PURE__*/React.createElement(DefaultErrorComponent, null);\nclass RenderErrorBoundary extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      location: props.location,\n      revalidation: props.revalidation,\n      error: props.error\n    };\n  }\n  static getDerivedStateFromError(error) {\n    return {\n      error: error\n    };\n  }\n  static getDerivedStateFromProps(props, state) {\n    // When we get into an error state, the user will likely click \"back\" to the\n    // previous page that didn't have an error. Because this wraps the entire\n    // application, that will have no effect--the error page continues to display.\n    // This gives us a mechanism to recover from the error when the location changes.\n    //\n    // Whether we're in an error state or not, we update the location in state\n    // so that when we are in an error state, it gets reset when a new location\n    // comes in and the user recovers from the error.\n    if (state.location !== props.location || state.revalidation !== \"idle\" && props.revalidation === \"idle\") {\n      return {\n        error: props.error,\n        location: props.location,\n        revalidation: props.revalidation\n      };\n    }\n\n    // If we're not changing locations, preserve the location but still surface\n    // any new errors that may come through. We retain the existing error, we do\n    // this because the error provided from the app state may be cleared without\n    // the location changing.\n    return {\n      error: props.error || state.error,\n      location: state.location,\n      revalidation: props.revalidation || state.revalidation\n    };\n  }\n  componentDidCatch(error, errorInfo) {\n    console.error(\"React Router caught the following error during render\", error, errorInfo);\n  }\n  render() {\n    return this.state.error ? /*#__PURE__*/React.createElement(RouteContext.Provider, {\n      value: this.props.routeContext\n    }, /*#__PURE__*/React.createElement(RouteErrorContext.Provider, {\n      value: this.state.error,\n      children: this.props.component\n    })) : this.props.children;\n  }\n}\nfunction RenderedRoute(_ref) {\n  let {\n    routeContext,\n    match,\n    children\n  } = _ref;\n  let dataRouterContext = React.useContext(DataRouterContext);\n\n  // Track how deep we got in our render pass to emulate SSR componentDidCatch\n  // in a DataStaticRouter\n  if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {\n    dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n  }\n  return /*#__PURE__*/React.createElement(RouteContext.Provider, {\n    value: routeContext\n  }, children);\n}\nfunction _renderMatches(matches, parentMatches, dataRouterState) {\n  var _dataRouterState2;\n  if (parentMatches === void 0) {\n    parentMatches = [];\n  }\n  if (dataRouterState === void 0) {\n    dataRouterState = null;\n  }\n  if (matches == null) {\n    var _dataRouterState;\n    if ((_dataRouterState = dataRouterState) != null && _dataRouterState.errors) {\n      // Don't bail if we have data router errors so we can render them in the\n      // boundary.  Use the pre-matched (or shimmed) matches\n      matches = dataRouterState.matches;\n    } else {\n      return null;\n    }\n  }\n  let renderedMatches = matches;\n\n  // If we have data errors, trim matches to the highest error boundary\n  let errors = (_dataRouterState2 = dataRouterState) == null ? void 0 : _dataRouterState2.errors;\n  if (errors != null) {\n    let errorIndex = renderedMatches.findIndex(m => m.route.id && (errors == null ? void 0 : errors[m.route.id]));\n    !(errorIndex >= 0) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"Could not find a matching route for errors on route IDs: \" + Object.keys(errors).join(\",\")) : UNSAFE_invariant(false) : void 0;\n    renderedMatches = renderedMatches.slice(0, Math.min(renderedMatches.length, errorIndex + 1));\n  }\n  return renderedMatches.reduceRight((outlet, match, index) => {\n    let error = match.route.id ? errors == null ? void 0 : errors[match.route.id] : null;\n    // Only data routers handle errors\n    let errorElement = null;\n    if (dataRouterState) {\n      errorElement = match.route.errorElement || defaultErrorElement;\n    }\n    let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n    let getChildren = () => {\n      let children;\n      if (error) {\n        children = errorElement;\n      } else if (match.route.Component) {\n        // Note: This is a de-optimized path since React won't re-use the\n        // ReactElement since it's identity changes with each new\n        // React.createElement call.  We keep this so folks can use\n        // `<Route Component={...}>` in `<Routes>` but generally `Component`\n        // usage is only advised in `RouterProvider` when we can convert it to\n        // `element` ahead of time.\n        children = /*#__PURE__*/React.createElement(match.route.Component, null);\n      } else if (match.route.element) {\n        children = match.route.element;\n      } else {\n        children = outlet;\n      }\n      return /*#__PURE__*/React.createElement(RenderedRoute, {\n        match: match,\n        routeContext: {\n          outlet,\n          matches,\n          isDataRoute: dataRouterState != null\n        },\n        children: children\n      });\n    };\n    // Only wrap in an error boundary within data router usages when we have an\n    // ErrorBoundary/errorElement on this route.  Otherwise let it bubble up to\n    // an ancestor ErrorBoundary/errorElement\n    return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /*#__PURE__*/React.createElement(RenderErrorBoundary, {\n      location: dataRouterState.location,\n      revalidation: dataRouterState.revalidation,\n      component: errorElement,\n      error: error,\n      children: getChildren(),\n      routeContext: {\n        outlet: null,\n        matches,\n        isDataRoute: true\n      }\n    }) : getChildren();\n  }, null);\n}\nvar DataRouterHook;\n(function (DataRouterHook) {\n  DataRouterHook[\"UseBlocker\"] = \"useBlocker\";\n  DataRouterHook[\"UseRevalidator\"] = \"useRevalidator\";\n  DataRouterHook[\"UseNavigateStable\"] = \"useNavigate\";\n})(DataRouterHook || (DataRouterHook = {}));\nvar DataRouterStateHook;\n(function (DataRouterStateHook) {\n  DataRouterStateHook[\"UseBlocker\"] = \"useBlocker\";\n  DataRouterStateHook[\"UseLoaderData\"] = \"useLoaderData\";\n  DataRouterStateHook[\"UseActionData\"] = \"useActionData\";\n  DataRouterStateHook[\"UseRouteError\"] = \"useRouteError\";\n  DataRouterStateHook[\"UseNavigation\"] = \"useNavigation\";\n  DataRouterStateHook[\"UseRouteLoaderData\"] = \"useRouteLoaderData\";\n  DataRouterStateHook[\"UseMatches\"] = \"useMatches\";\n  DataRouterStateHook[\"UseRevalidator\"] = \"useRevalidator\";\n  DataRouterStateHook[\"UseNavigateStable\"] = \"useNavigate\";\n  DataRouterStateHook[\"UseRouteId\"] = \"useRouteId\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\nfunction getDataRouterConsoleError(hookName) {\n  return hookName + \" must be used within a data router.  See https://reactrouter.com/routers/picking-a-router.\";\n}\nfunction useDataRouterContext(hookName) {\n  let ctx = React.useContext(DataRouterContext);\n  !ctx ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n  return ctx;\n}\nfunction useDataRouterState(hookName) {\n  let state = React.useContext(DataRouterStateContext);\n  !state ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n  return state;\n}\nfunction useRouteContext(hookName) {\n  let route = React.useContext(RouteContext);\n  !route ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n  return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName) {\n  let route = useRouteContext(hookName);\n  let thisRoute = route.matches[route.matches.length - 1];\n  !thisRoute.route.id ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, hookName + \" can only be used on routes that contain a unique \\\"id\\\"\") : UNSAFE_invariant(false) : void 0;\n  return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nfunction useRouteId() {\n  return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\nfunction useNavigation() {\n  let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n  return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nfunction useRevalidator() {\n  let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n  let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n  return {\n    revalidate: dataRouterContext.router.revalidate,\n    state: state.revalidation\n  };\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\nfunction useMatches() {\n  let {\n    matches,\n    loaderData\n  } = useDataRouterState(DataRouterStateHook.UseMatches);\n  return React.useMemo(() => matches.map(match => {\n    let {\n      pathname,\n      params\n    } = match;\n    // Note: This structure matches that created by createUseMatchesMatch\n    // in the @remix-run/router , so if you change this please also change\n    // that :)  Eventually we'll DRY this up\n    return {\n      id: match.route.id,\n      pathname,\n      params,\n      data: loaderData[match.route.id],\n      handle: match.route.handle\n    };\n  }), [matches, loaderData]);\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nfunction useLoaderData() {\n  let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n  let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n  if (state.errors && state.errors[routeId] != null) {\n    console.error(\"You cannot `useLoaderData` in an errorElement (routeId: \" + routeId + \")\");\n    return undefined;\n  }\n  return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nfunction useRouteLoaderData(routeId) {\n  let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n  return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nfunction useActionData() {\n  let state = useDataRouterState(DataRouterStateHook.UseActionData);\n  let route = React.useContext(RouteContext);\n  !route ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"useActionData must be used inside a RouteContext\") : UNSAFE_invariant(false) : void 0;\n  return Object.values((state == null ? void 0 : state.actionData) || {})[0];\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error.  This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nfunction useRouteError() {\n  var _state$errors;\n  let error = React.useContext(RouteErrorContext);\n  let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n  let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n  // If this was a render error, we put it in a RouteError context inside\n  // of RenderErrorBoundary\n  if (error) {\n    return error;\n  }\n\n  // Otherwise look for errors from our data router state\n  return (_state$errors = state.errors) == null ? void 0 : _state$errors[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor <Await /> value\n */\nfunction useAsyncValue() {\n  let value = React.useContext(AwaitContext);\n  return value == null ? void 0 : value._data;\n}\n\n/**\n * Returns the error from the nearest ancestor <Await /> value\n */\nfunction useAsyncError() {\n  let value = React.useContext(AwaitContext);\n  return value == null ? void 0 : value._error;\n}\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation.  Mostly used to avoid\n * using half-filled form data.  This does not handle hard-reloads or\n * cross-origin navigations.\n */\nfunction useBlocker(shouldBlock) {\n  let {\n    router\n  } = useDataRouterContext(DataRouterHook.UseBlocker);\n  let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n  let [blockerKey] = React.useState(() => String(++blockerId));\n  let blockerFunction = React.useCallback(args => {\n    return typeof shouldBlock === \"function\" ? !!shouldBlock(args) : !!shouldBlock;\n  }, [shouldBlock]);\n  let blocker = router.getBlocker(blockerKey, blockerFunction);\n\n  // Cleanup on unmount\n  React.useEffect(() => () => router.deleteBlocker(blockerKey), [router, blockerKey]);\n\n  // Prefer the blocker from state since DataRouterContext is memoized so this\n  // ensures we update on blocker state updates\n  return state.blockers.get(blockerKey) || blocker;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable() {\n  let {\n    router\n  } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n  let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n  let activeRef = React.useRef(false);\n  useIsomorphicLayoutEffect(() => {\n    activeRef.current = true;\n  });\n  let navigate = React.useCallback(function (to, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(activeRef.current, navigateEffectWarning) : void 0;\n\n    // Short circuit here since if this happens on first render the navigate\n    // is useless because we haven't wired up our router subscriber yet\n    if (!activeRef.current) return;\n    if (typeof to === \"number\") {\n      router.navigate(to);\n    } else {\n      router.navigate(to, _extends({\n        fromRouteId: id\n      }, options));\n    }\n  }, [router, id]);\n  return navigate;\n}\nconst alreadyWarned = {};\nfunction warningOnce(key, cond, message) {\n  if (!cond && !alreadyWarned[key]) {\n    alreadyWarned[key] = true;\n    process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, message) : void 0;\n  }\n}\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nfunction RouterProvider(_ref) {\n  let {\n    fallbackElement,\n    router\n  } = _ref;\n  // Need to use a layout effect here so we are subscribed early enough to\n  // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n  let [state, setStateImpl] = React.useState(router.state);\n  let setState = React.useCallback(newState => {\n    \"startTransition\" in React ? React.startTransition(() => setStateImpl(newState)) : setStateImpl(newState);\n  }, [setStateImpl]);\n  React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n  let navigator = React.useMemo(() => {\n    return {\n      createHref: router.createHref,\n      encodeLocation: router.encodeLocation,\n      go: n => router.navigate(n),\n      push: (to, state, opts) => router.navigate(to, {\n        state,\n        preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n      }),\n      replace: (to, state, opts) => router.navigate(to, {\n        replace: true,\n        state,\n        preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n      })\n    };\n  }, [router]);\n  let basename = router.basename || \"/\";\n  let dataRouterContext = React.useMemo(() => ({\n    router,\n    navigator,\n    static: false,\n    basename\n  }), [router, navigator, basename]);\n\n  // The fragment and {null} here are important!  We need them to keep React 18's\n  // useId happy when we are server-rendering since we may have a <script> here\n  // containing the hydrated server-side staticContext (from StaticRouterProvider).\n  // useId relies on the component tree structure to generate deterministic id's\n  // so we need to ensure it remains the same on the client even though\n  // we don't need the <script> tag\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DataRouterContext.Provider, {\n    value: dataRouterContext\n  }, /*#__PURE__*/React.createElement(DataRouterStateContext.Provider, {\n    value: state\n  }, /*#__PURE__*/React.createElement(Router, {\n    basename: basename,\n    location: state.location,\n    navigationType: state.historyAction,\n    navigator: navigator\n  }, state.initialized ? /*#__PURE__*/React.createElement(DataRoutes, {\n    routes: router.routes,\n    state: state\n  }) : fallbackElement))), null);\n}\nfunction DataRoutes(_ref2) {\n  let {\n    routes,\n    state\n  } = _ref2;\n  return useRoutesImpl(routes, undefined, state);\n}\n/**\n * A <Router> that stores all entries in memory.\n *\n * @see https://reactrouter.com/router-components/memory-router\n */\nfunction MemoryRouter(_ref3) {\n  let {\n    basename,\n    children,\n    initialEntries,\n    initialIndex\n  } = _ref3;\n  let historyRef = React.useRef();\n  if (historyRef.current == null) {\n    historyRef.current = createMemoryHistory({\n      initialEntries,\n      initialIndex,\n      v5Compat: true\n    });\n  }\n  let history = historyRef.current;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location\n  });\n  let setState = React.useCallback(newState => {\n    \"startTransition\" in React ? React.startTransition(() => setStateImpl(newState)) : setStateImpl(newState);\n  }, [setStateImpl]);\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n  return /*#__PURE__*/React.createElement(Router, {\n    basename: basename,\n    children: children,\n    location: state.location,\n    navigationType: state.action,\n    navigator: history\n  });\n}\n/**\n * Changes the current location.\n *\n * Note: This API is mostly useful in React.Component subclasses that are not\n * able to use hooks. In functional components, we recommend you use the\n * `useNavigate` hook instead.\n *\n * @see https://reactrouter.com/components/navigate\n */\nfunction Navigate(_ref4) {\n  let {\n    to,\n    replace,\n    state,\n    relative\n  } = _ref4;\n  !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of\n  // the router loaded. We can help them understand how to avoid that.\n  \"<Navigate> may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n  process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(!React.useContext(NavigationContext).static, \"<Navigate> must not be used on the initial render in a <StaticRouter>. \" + \"This is a no-op, but you should modify your code so the <Navigate> is \" + \"only ever rendered in response to some user interaction or state change.\") : void 0;\n  let {\n    matches\n  } = React.useContext(RouteContext);\n  let {\n    pathname: locationPathname\n  } = useLocation();\n  let navigate = useNavigate();\n\n  // Resolve the path outside of the effect so that when effects run twice in\n  // StrictMode they navigate to the same place\n  let path = resolveTo(to, UNSAFE_getPathContributingMatches(matches).map(match => match.pathnameBase), locationPathname, relative === \"path\");\n  let jsonPath = JSON.stringify(path);\n  React.useEffect(() => navigate(JSON.parse(jsonPath), {\n    replace,\n    state,\n    relative\n  }), [navigate, jsonPath, relative, replace, state]);\n  return null;\n}\n/**\n * Renders the child route's element, if there is one.\n *\n * @see https://reactrouter.com/components/outlet\n */\nfunction Outlet(props) {\n  return useOutlet(props.context);\n}\n/**\n * Declares an element that should be rendered at a certain URL path.\n *\n * @see https://reactrouter.com/components/route\n */\nfunction Route(_props) {\n  process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"A <Route> is only ever to be used as the child of <Routes> element, \" + \"never rendered directly. Please wrap your <Route> in a <Routes>.\") : UNSAFE_invariant(false) ;\n}\n/**\n * Provides location context for the rest of the app.\n *\n * Note: You usually won't render a <Router> directly. Instead, you'll render a\n * router that is more specific to your environment such as a <BrowserRouter>\n * in web browsers or a <StaticRouter> for server rendering.\n *\n * @see https://reactrouter.com/router-components/router\n */\nfunction Router(_ref5) {\n  let {\n    basename: basenameProp = \"/\",\n    children = null,\n    location: locationProp,\n    navigationType = Action.Pop,\n    navigator,\n    static: staticProp = false\n  } = _ref5;\n  !!useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"You cannot render a <Router> inside another <Router>.\" + \" You should never have more than one in your app.\") : UNSAFE_invariant(false) : void 0;\n\n  // Preserve trailing slashes on basename, so we can let the user control\n  // the enforcement of trailing slashes throughout the app\n  let basename = basenameProp.replace(/^\\/*/, \"/\");\n  let navigationContext = React.useMemo(() => ({\n    basename,\n    navigator,\n    static: staticProp\n  }), [basename, navigator, staticProp]);\n  if (typeof locationProp === \"string\") {\n    locationProp = parsePath(locationProp);\n  }\n  let {\n    pathname = \"/\",\n    search = \"\",\n    hash = \"\",\n    state = null,\n    key = \"default\"\n  } = locationProp;\n  let locationContext = React.useMemo(() => {\n    let trailingPathname = stripBasename(pathname, basename);\n    if (trailingPathname == null) {\n      return null;\n    }\n    return {\n      location: {\n        pathname: trailingPathname,\n        search,\n        hash,\n        state,\n        key\n      },\n      navigationType\n    };\n  }, [basename, pathname, search, hash, state, key, navigationType]);\n  process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(locationContext != null, \"<Router basename=\\\"\" + basename + \"\\\"> is not able to match the URL \" + (\"\\\"\" + pathname + search + hash + \"\\\" because it does not start with the \") + \"basename, so the <Router> won't render anything.\") : void 0;\n  if (locationContext == null) {\n    return null;\n  }\n  return /*#__PURE__*/React.createElement(NavigationContext.Provider, {\n    value: navigationContext\n  }, /*#__PURE__*/React.createElement(LocationContext.Provider, {\n    children: children,\n    value: locationContext\n  }));\n}\n/**\n * A container for a nested tree of <Route> elements that renders the branch\n * that best matches the current location.\n *\n * @see https://reactrouter.com/components/routes\n */\nfunction Routes(_ref6) {\n  let {\n    children,\n    location\n  } = _ref6;\n  return useRoutes(createRoutesFromChildren(children), location);\n}\n/**\n * Component to use for rendering lazily loaded data from returning defer()\n * in a loader function\n */\nfunction Await(_ref7) {\n  let {\n    children,\n    errorElement,\n    resolve\n  } = _ref7;\n  return /*#__PURE__*/React.createElement(AwaitErrorBoundary, {\n    resolve: resolve,\n    errorElement: errorElement\n  }, /*#__PURE__*/React.createElement(ResolveAwait, null, children));\n}\nvar AwaitRenderStatus;\n(function (AwaitRenderStatus) {\n  AwaitRenderStatus[AwaitRenderStatus[\"pending\"] = 0] = \"pending\";\n  AwaitRenderStatus[AwaitRenderStatus[\"success\"] = 1] = \"success\";\n  AwaitRenderStatus[AwaitRenderStatus[\"error\"] = 2] = \"error\";\n})(AwaitRenderStatus || (AwaitRenderStatus = {}));\nconst neverSettledPromise = new Promise(() => {});\nclass AwaitErrorBoundary extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      error: null\n    };\n  }\n  static getDerivedStateFromError(error) {\n    return {\n      error\n    };\n  }\n  componentDidCatch(error, errorInfo) {\n    console.error(\"<Await> caught the following error during render\", error, errorInfo);\n  }\n  render() {\n    let {\n      children,\n      errorElement,\n      resolve\n    } = this.props;\n    let promise = null;\n    let status = AwaitRenderStatus.pending;\n    if (!(resolve instanceof Promise)) {\n      // Didn't get a promise - provide as a resolved promise\n      status = AwaitRenderStatus.success;\n      promise = Promise.resolve();\n      Object.defineProperty(promise, \"_tracked\", {\n        get: () => true\n      });\n      Object.defineProperty(promise, \"_data\", {\n        get: () => resolve\n      });\n    } else if (this.state.error) {\n      // Caught a render error, provide it as a rejected promise\n      status = AwaitRenderStatus.error;\n      let renderError = this.state.error;\n      promise = Promise.reject().catch(() => {}); // Avoid unhandled rejection warnings\n      Object.defineProperty(promise, \"_tracked\", {\n        get: () => true\n      });\n      Object.defineProperty(promise, \"_error\", {\n        get: () => renderError\n      });\n    } else if (resolve._tracked) {\n      // Already tracked promise - check contents\n      promise = resolve;\n      status = promise._error !== undefined ? AwaitRenderStatus.error : promise._data !== undefined ? AwaitRenderStatus.success : AwaitRenderStatus.pending;\n    } else {\n      // Raw (untracked) promise - track it\n      status = AwaitRenderStatus.pending;\n      Object.defineProperty(resolve, \"_tracked\", {\n        get: () => true\n      });\n      promise = resolve.then(data => Object.defineProperty(resolve, \"_data\", {\n        get: () => data\n      }), error => Object.defineProperty(resolve, \"_error\", {\n        get: () => error\n      }));\n    }\n    if (status === AwaitRenderStatus.error && promise._error instanceof AbortedDeferredError) {\n      // Freeze the UI by throwing a never resolved promise\n      throw neverSettledPromise;\n    }\n    if (status === AwaitRenderStatus.error && !errorElement) {\n      // No errorElement, throw to the nearest route-level error boundary\n      throw promise._error;\n    }\n    if (status === AwaitRenderStatus.error) {\n      // Render via our errorElement\n      return /*#__PURE__*/React.createElement(AwaitContext.Provider, {\n        value: promise,\n        children: errorElement\n      });\n    }\n    if (status === AwaitRenderStatus.success) {\n      // Render children with resolved value\n      return /*#__PURE__*/React.createElement(AwaitContext.Provider, {\n        value: promise,\n        children: children\n      });\n    }\n\n    // Throw to the suspense boundary\n    throw promise;\n  }\n}\n\n/**\n * @private\n * Indirection to leverage useAsyncValue for a render-prop API on <Await>\n */\nfunction ResolveAwait(_ref8) {\n  let {\n    children\n  } = _ref8;\n  let data = useAsyncValue();\n  let toRender = typeof children === \"function\" ? children(data) : children;\n  return /*#__PURE__*/React.createElement(React.Fragment, null, toRender);\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// UTILS\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Creates a route config from a React \"children\" object, which is usually\n * either a `<Route>` element or an array of them. Used internally by\n * `<Routes>` to create a route config from its children.\n *\n * @see https://reactrouter.com/utils/create-routes-from-children\n */\nfunction createRoutesFromChildren(children, parentPath) {\n  if (parentPath === void 0) {\n    parentPath = [];\n  }\n  let routes = [];\n  React.Children.forEach(children, (element, index) => {\n    if (! /*#__PURE__*/React.isValidElement(element)) {\n      // Ignore non-elements. This allows people to more easily inline\n      // conditionals in their route config.\n      return;\n    }\n    let treePath = [...parentPath, index];\n    if (element.type === React.Fragment) {\n      // Transparently support React.Fragment and its children.\n      routes.push.apply(routes, createRoutesFromChildren(element.props.children, treePath));\n      return;\n    }\n    !(element.type === Route) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"[\" + (typeof element.type === \"string\" ? element.type : element.type.name) + \"] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>\") : UNSAFE_invariant(false) : void 0;\n    !(!element.props.index || !element.props.children) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"An index route cannot have child routes.\") : UNSAFE_invariant(false) : void 0;\n    let route = {\n      id: element.props.id || treePath.join(\"-\"),\n      caseSensitive: element.props.caseSensitive,\n      element: element.props.element,\n      Component: element.props.Component,\n      index: element.props.index,\n      path: element.props.path,\n      loader: element.props.loader,\n      action: element.props.action,\n      errorElement: element.props.errorElement,\n      ErrorBoundary: element.props.ErrorBoundary,\n      hasErrorBoundary: element.props.ErrorBoundary != null || element.props.errorElement != null,\n      shouldRevalidate: element.props.shouldRevalidate,\n      handle: element.props.handle,\n      lazy: element.props.lazy\n    };\n    if (element.props.children) {\n      route.children = createRoutesFromChildren(element.props.children, treePath);\n    }\n    routes.push(route);\n  });\n  return routes;\n}\n\n/**\n * Renders the result of `matchRoutes()` into a React element.\n */\nfunction renderMatches(matches) {\n  return _renderMatches(matches);\n}\n\nfunction mapRouteProperties(route) {\n  let updates = {\n    // Note: this check also occurs in createRoutesFromChildren so update\n    // there if you change this -- please and thank you!\n    hasErrorBoundary: route.ErrorBoundary != null || route.errorElement != null\n  };\n  if (route.Component) {\n    if (process.env.NODE_ENV !== \"production\") {\n      if (route.element) {\n        process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, \"You should not include both `Component` and `element` on your route - \" + \"`Component` will be used.\") : void 0;\n      }\n    }\n    Object.assign(updates, {\n      element: /*#__PURE__*/React.createElement(route.Component),\n      Component: undefined\n    });\n  }\n  if (route.ErrorBoundary) {\n    if (process.env.NODE_ENV !== \"production\") {\n      if (route.errorElement) {\n        process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, \"You should not include both `ErrorBoundary` and `errorElement` on your route - \" + \"`ErrorBoundary` will be used.\") : void 0;\n      }\n    }\n    Object.assign(updates, {\n      errorElement: /*#__PURE__*/React.createElement(route.ErrorBoundary),\n      ErrorBoundary: undefined\n    });\n  }\n  return updates;\n}\nfunction createMemoryRouter(routes, opts) {\n  return createRouter({\n    basename: opts == null ? void 0 : opts.basename,\n    future: _extends({}, opts == null ? void 0 : opts.future, {\n      v7_prependBasename: true\n    }),\n    history: createMemoryHistory({\n      initialEntries: opts == null ? void 0 : opts.initialEntries,\n      initialIndex: opts == null ? void 0 : opts.initialIndex\n    }),\n    hydrationData: opts == null ? void 0 : opts.hydrationData,\n    routes,\n    mapRouteProperties\n  }).initialize();\n}\n\nexport { Await, MemoryRouter, Navigate, Outlet, Route, Router, RouterProvider, Routes, DataRouterContext as UNSAFE_DataRouterContext, DataRouterStateContext as UNSAFE_DataRouterStateContext, LocationContext as UNSAFE_LocationContext, NavigationContext as UNSAFE_NavigationContext, RouteContext as UNSAFE_RouteContext, mapRouteProperties as UNSAFE_mapRouteProperties, useRouteId as UNSAFE_useRouteId, useRoutesImpl as UNSAFE_useRoutesImpl, createMemoryRouter, createRoutesFromChildren, createRoutesFromChildren as createRoutesFromElements, renderMatches, useBlocker as unstable_useBlocker, useActionData, useAsyncError, useAsyncValue, useHref, useInRouterContext, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes };\n//# sourceMappingURL=index.js.map\n","/**\n * React Router DOM v5 Compat v6.12.0\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport * as React from 'react';\nimport { UNSAFE_mapRouteProperties, Router, UNSAFE_NavigationContext, useHref, useResolvedPath, useLocation, UNSAFE_DataRouterStateContext, useNavigate, createPath, UNSAFE_useRouteId, UNSAFE_RouteContext, useMatches, useNavigation, unstable_useBlocker, UNSAFE_DataRouterContext, Routes, Route } from 'react-router';\nexport { AbortedDeferredError, Await, MemoryRouter, Navigate, NavigationType, Outlet, Route, Router, RouterProvider, Routes, UNSAFE_DataRouterContext, UNSAFE_DataRouterStateContext, UNSAFE_LocationContext, UNSAFE_NavigationContext, UNSAFE_RouteContext, UNSAFE_useRouteId, createMemoryRouter, createPath, createRoutesFromChildren, createRoutesFromElements, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, parsePath, redirect, renderMatches, resolvePath, unstable_useBlocker, useActionData, useAsyncError, useAsyncValue, useHref, useInRouterContext, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes } from 'react-router';\nimport { stripBasename, createRouter, createBrowserHistory, createHashHistory, ErrorResponse, UNSAFE_warning, UNSAFE_invariant, joinPaths } from '@remix-run/router';\nimport { parsePath, Action, createPath as createPath$1 } from 'history';\nimport { Route as Route$1, useHistory } from 'react-router-dom';\n\nfunction _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}\n\nconst defaultMethod = \"get\";\nconst defaultEncType = \"application/x-www-form-urlencoded\";\nfunction isHtmlElement(object) {\n  return object != null && typeof object.tagName === \"string\";\n}\nfunction isButtonElement(object) {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\nfunction isFormElement(object) {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\nfunction isInputElement(object) {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\nfunction isModifiedEvent(event) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n  return event.button === 0 && (\n  // Ignore everything but left clicks\n  !target || target === \"_self\") &&\n  // Let browser handle \"target=_blank\" etc.\n  !isModifiedEvent(event) // Ignore clicks with modifier keys\n  ;\n}\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n *   let searchParams = new URLSearchParams([\n *     ['sort', 'name'],\n *     ['sort', 'price']\n *   ]);\n *\n * you can do:\n *\n *   let searchParams = createSearchParams({\n *     sort: ['name', 'price']\n *   });\n */\nfunction createSearchParams(init) {\n  if (init === void 0) {\n    init = \"\";\n  }\n  return new URLSearchParams(typeof init === \"string\" || Array.isArray(init) || init instanceof URLSearchParams ? init : Object.keys(init).reduce((memo, key) => {\n    let value = init[key];\n    return memo.concat(Array.isArray(value) ? value.map(v => [key, v]) : [[key, value]]);\n  }, []));\n}\nfunction getSearchParamsForLocation(locationSearch, defaultSearchParams) {\n  let searchParams = createSearchParams(locationSearch);\n  if (defaultSearchParams) {\n    for (let key of defaultSearchParams.keys()) {\n      if (!searchParams.has(key)) {\n        defaultSearchParams.getAll(key).forEach(value => {\n          searchParams.append(key, value);\n        });\n      }\n    }\n  }\n  return searchParams;\n}\nfunction getFormSubmissionInfo(target, options, basename) {\n  let method;\n  let action = null;\n  let encType;\n  let formData;\n  if (isFormElement(target)) {\n    let submissionTrigger = options.submissionTrigger;\n    if (options.action) {\n      action = options.action;\n    } else {\n      // When grabbing the action from the element, it will have had the basename\n      // prefixed to ensure non-JS scenarios work, so strip it since we'll\n      // re-prefix in the router\n      let attr = target.getAttribute(\"action\");\n      action = attr ? stripBasename(attr, basename) : null;\n    }\n    method = options.method || target.getAttribute(\"method\") || defaultMethod;\n    encType = options.encType || target.getAttribute(\"enctype\") || defaultEncType;\n    formData = new FormData(target);\n    if (submissionTrigger && submissionTrigger.name) {\n      formData.append(submissionTrigger.name, submissionTrigger.value);\n    }\n  } else if (isButtonElement(target) || isInputElement(target) && (target.type === \"submit\" || target.type === \"image\")) {\n    let form = target.form;\n    if (form == null) {\n      throw new Error(\"Cannot submit a <button> or <input type=\\\"submit\\\"> without a <form>\");\n    }\n    // <button>/<input type=\"submit\"> may override attributes of <form>\n    if (options.action) {\n      action = options.action;\n    } else {\n      // When grabbing the action from the element, it will have had the basename\n      // prefixed to ensure non-JS scenarios work, so strip it since we'll\n      // re-prefix in the router\n      let attr = target.getAttribute(\"formaction\") || form.getAttribute(\"action\");\n      action = attr ? stripBasename(attr, basename) : null;\n    }\n    method = options.method || target.getAttribute(\"formmethod\") || form.getAttribute(\"method\") || defaultMethod;\n    encType = options.encType || target.getAttribute(\"formenctype\") || form.getAttribute(\"enctype\") || defaultEncType;\n    formData = new FormData(form);\n    // Include name + value from a <button>, appending in case the button name\n    // matches an existing input name\n    if (target.name) {\n      formData.append(target.name, target.value);\n    }\n  } else if (isHtmlElement(target)) {\n    throw new Error(\"Cannot submit element that is not <form>, <button>, or \" + \"<input type=\\\"submit|image\\\">\");\n  } else {\n    method = options.method || defaultMethod;\n    action = options.action || null;\n    encType = options.encType || defaultEncType;\n    if (target instanceof FormData) {\n      formData = target;\n    } else {\n      formData = new FormData();\n      if (target instanceof URLSearchParams) {\n        for (let [name, value] of target) {\n          formData.append(name, value);\n        }\n      } else if (target != null) {\n        for (let name of Object.keys(target)) {\n          formData.append(name, target[name]);\n        }\n      }\n    }\n  }\n  return {\n    action,\n    method: method.toLowerCase(),\n    encType,\n    formData\n  };\n}\n\nconst _excluded = [\"onClick\", \"relative\", \"reloadDocument\", \"replace\", \"state\", \"target\", \"to\", \"preventScrollReset\"],\n  _excluded2 = [\"aria-current\", \"caseSensitive\", \"className\", \"end\", \"style\", \"to\", \"children\"],\n  _excluded3 = [\"reloadDocument\", \"replace\", \"method\", \"action\", \"onSubmit\", \"fetcherKey\", \"routeId\", \"relative\", \"preventScrollReset\"];\nfunction createBrowserRouter(routes, opts) {\n  return createRouter({\n    basename: opts == null ? void 0 : opts.basename,\n    future: _extends({}, opts == null ? void 0 : opts.future, {\n      v7_prependBasename: true\n    }),\n    history: createBrowserHistory({\n      window: opts == null ? void 0 : opts.window\n    }),\n    hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n    routes,\n    mapRouteProperties: UNSAFE_mapRouteProperties\n  }).initialize();\n}\nfunction createHashRouter(routes, opts) {\n  return createRouter({\n    basename: opts == null ? void 0 : opts.basename,\n    future: _extends({}, opts == null ? void 0 : opts.future, {\n      v7_prependBasename: true\n    }),\n    history: createHashHistory({\n      window: opts == null ? void 0 : opts.window\n    }),\n    hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n    routes,\n    mapRouteProperties: UNSAFE_mapRouteProperties\n  }).initialize();\n}\nfunction parseHydrationData() {\n  var _window;\n  let state = (_window = window) == null ? void 0 : _window.__staticRouterHydrationData;\n  if (state && state.errors) {\n    state = _extends({}, state, {\n      errors: deserializeErrors(state.errors)\n    });\n  }\n  return state;\n}\nfunction deserializeErrors(errors) {\n  if (!errors) return null;\n  let entries = Object.entries(errors);\n  let serialized = {};\n  for (let [key, val] of entries) {\n    // Hey you!  If you change this, please change the corresponding logic in\n    // serializeErrors in react-router-dom/server.tsx :)\n    if (val && val.__type === \"RouteErrorResponse\") {\n      serialized[key] = new ErrorResponse(val.status, val.statusText, val.data, val.internal === true);\n    } else if (val && val.__type === \"Error\") {\n      let error = new Error(val.message);\n      // Wipe away the client-side stack trace.  Nothing to fill it in with\n      // because we don't serialize SSR stack traces for security reasons\n      error.stack = \"\";\n      serialized[key] = error;\n    } else {\n      serialized[key] = val;\n    }\n  }\n  return serialized;\n}\n/**\n * A `<Router>` for use in web browsers. Provides the cleanest URLs.\n */\nfunction BrowserRouter(_ref) {\n  let {\n    basename,\n    children,\n    window\n  } = _ref;\n  let historyRef = React.useRef();\n  if (historyRef.current == null) {\n    historyRef.current = createBrowserHistory({\n      window,\n      v5Compat: true\n    });\n  }\n  let history = historyRef.current;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location\n  });\n  let setState = React.useCallback(newState => {\n    \"startTransition\" in React ? React.startTransition(() => setStateImpl(newState)) : setStateImpl(newState);\n  }, [setStateImpl]);\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n  return /*#__PURE__*/React.createElement(Router, {\n    basename: basename,\n    children: children,\n    location: state.location,\n    navigationType: state.action,\n    navigator: history\n  });\n}\n/**\n * A `<Router>` for use in web browsers. Stores the location in the hash\n * portion of the URL so it is not sent to the server.\n */\nfunction HashRouter(_ref2) {\n  let {\n    basename,\n    children,\n    window\n  } = _ref2;\n  let historyRef = React.useRef();\n  if (historyRef.current == null) {\n    historyRef.current = createHashHistory({\n      window,\n      v5Compat: true\n    });\n  }\n  let history = historyRef.current;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location\n  });\n  let setState = React.useCallback(newState => {\n    \"startTransition\" in React ? React.startTransition(() => setStateImpl(newState)) : setStateImpl(newState);\n  }, [setStateImpl]);\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n  return /*#__PURE__*/React.createElement(Router, {\n    basename: basename,\n    children: children,\n    location: state.location,\n    navigationType: state.action,\n    navigator: history\n  });\n}\n/**\n * A `<Router>` that accepts a pre-instantiated history object. It's important\n * to note that using your own history object is highly discouraged and may add\n * two versions of the history library to your bundles unless you use the same\n * version of the history library that React Router uses internally.\n */\nfunction HistoryRouter(_ref3) {\n  let {\n    basename,\n    children,\n    history\n  } = _ref3;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location\n  });\n  let setState = React.useCallback(newState => {\n    \"startTransition\" in React ? React.startTransition(() => setStateImpl(newState)) : setStateImpl(newState);\n  }, [setStateImpl]);\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n  return /*#__PURE__*/React.createElement(Router, {\n    basename: basename,\n    children: children,\n    location: state.location,\n    navigationType: state.action,\n    navigator: history\n  });\n}\nif (process.env.NODE_ENV !== \"production\") {\n  HistoryRouter.displayName = \"unstable_HistoryRouter\";\n}\nconst isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n/**\n * The public API for rendering a history-aware <a>.\n */\nconst Link = /*#__PURE__*/React.forwardRef(function LinkWithRef(_ref4, ref) {\n  let {\n      onClick,\n      relative,\n      reloadDocument,\n      replace,\n      state,\n      target,\n      to,\n      preventScrollReset\n    } = _ref4,\n    rest = _objectWithoutPropertiesLoose(_ref4, _excluded);\n  let {\n    basename\n  } = React.useContext(UNSAFE_NavigationContext);\n  // Rendered into <a href> for absolute URLs\n  let absoluteHref;\n  let isExternal = false;\n  if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n    // Render the absolute href server- and client-side\n    absoluteHref = to;\n    // Only check for external origins client-side\n    if (isBrowser) {\n      try {\n        let currentUrl = new URL(window.location.href);\n        let targetUrl = to.startsWith(\"//\") ? new URL(currentUrl.protocol + to) : new URL(to);\n        let path = stripBasename(targetUrl.pathname, basename);\n        if (targetUrl.origin === currentUrl.origin && path != null) {\n          // Strip the protocol/origin/basename for same-origin absolute URLs\n          to = path + targetUrl.search + targetUrl.hash;\n        } else {\n          isExternal = true;\n        }\n      } catch (e) {\n        // We can't do external URL detection without a valid URL\n        process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, \"<Link to=\\\"\" + to + \"\\\"> contains an invalid URL which will probably break \" + \"when clicked - please update to a valid URL path.\") : void 0;\n      }\n    }\n  }\n  // Rendered into <a href> for relative URLs\n  let href = useHref(to, {\n    relative\n  });\n  let internalOnClick = useLinkClickHandler(to, {\n    replace,\n    state,\n    target,\n    preventScrollReset,\n    relative\n  });\n  function handleClick(event) {\n    if (onClick) onClick(event);\n    if (!event.defaultPrevented) {\n      internalOnClick(event);\n    }\n  }\n  return (\n    /*#__PURE__*/\n    // eslint-disable-next-line jsx-a11y/anchor-has-content\n    React.createElement(\"a\", _extends({}, rest, {\n      href: absoluteHref || href,\n      onClick: isExternal || reloadDocument ? onClick : handleClick,\n      ref: ref,\n      target: target\n    }))\n  );\n});\nif (process.env.NODE_ENV !== \"production\") {\n  Link.displayName = \"Link\";\n}\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\nconst NavLink = /*#__PURE__*/React.forwardRef(function NavLinkWithRef(_ref5, ref) {\n  let {\n      \"aria-current\": ariaCurrentProp = \"page\",\n      caseSensitive = false,\n      className: classNameProp = \"\",\n      end = false,\n      style: styleProp,\n      to,\n      children\n    } = _ref5,\n    rest = _objectWithoutPropertiesLoose(_ref5, _excluded2);\n  let path = useResolvedPath(to, {\n    relative: rest.relative\n  });\n  let location = useLocation();\n  let routerState = React.useContext(UNSAFE_DataRouterStateContext);\n  let {\n    navigator\n  } = React.useContext(UNSAFE_NavigationContext);\n  let toPathname = navigator.encodeLocation ? navigator.encodeLocation(path).pathname : path.pathname;\n  let locationPathname = location.pathname;\n  let nextLocationPathname = routerState && routerState.navigation && routerState.navigation.location ? routerState.navigation.location.pathname : null;\n  if (!caseSensitive) {\n    locationPathname = locationPathname.toLowerCase();\n    nextLocationPathname = nextLocationPathname ? nextLocationPathname.toLowerCase() : null;\n    toPathname = toPathname.toLowerCase();\n  }\n  let isActive = locationPathname === toPathname || !end && locationPathname.startsWith(toPathname) && locationPathname.charAt(toPathname.length) === \"/\";\n  let isPending = nextLocationPathname != null && (nextLocationPathname === toPathname || !end && nextLocationPathname.startsWith(toPathname) && nextLocationPathname.charAt(toPathname.length) === \"/\");\n  let ariaCurrent = isActive ? ariaCurrentProp : undefined;\n  let className;\n  if (typeof classNameProp === \"function\") {\n    className = classNameProp({\n      isActive,\n      isPending\n    });\n  } else {\n    // If the className prop is not a function, we use a default `active`\n    // class for <NavLink />s that are active. In v5 `active` was the default\n    // value for `activeClassName`, but we are removing that API and can still\n    // use the old default behavior for a cleaner upgrade path and keep the\n    // simple styling rules working as they currently do.\n    className = [classNameProp, isActive ? \"active\" : null, isPending ? \"pending\" : null].filter(Boolean).join(\" \");\n  }\n  let style = typeof styleProp === \"function\" ? styleProp({\n    isActive,\n    isPending\n  }) : styleProp;\n  return /*#__PURE__*/React.createElement(Link, _extends({}, rest, {\n    \"aria-current\": ariaCurrent,\n    className: className,\n    ref: ref,\n    style: style,\n    to: to\n  }), typeof children === \"function\" ? children({\n    isActive,\n    isPending\n  }) : children);\n});\nif (process.env.NODE_ENV !== \"production\") {\n  NavLink.displayName = \"NavLink\";\n}\n/**\n * A `@remix-run/router`-aware `<form>`. It behaves like a normal form except\n * that the interaction with the server is with `fetch` instead of new document\n * requests, allowing components to add nicer UX to the page as the form is\n * submitted and returns with data.\n */\nconst Form = /*#__PURE__*/React.forwardRef((props, ref) => {\n  return /*#__PURE__*/React.createElement(FormImpl, _extends({}, props, {\n    ref: ref\n  }));\n});\nif (process.env.NODE_ENV !== \"production\") {\n  Form.displayName = \"Form\";\n}\nconst FormImpl = /*#__PURE__*/React.forwardRef((_ref6, forwardedRef) => {\n  let {\n      reloadDocument,\n      replace,\n      method = defaultMethod,\n      action,\n      onSubmit,\n      fetcherKey,\n      routeId,\n      relative,\n      preventScrollReset\n    } = _ref6,\n    props = _objectWithoutPropertiesLoose(_ref6, _excluded3);\n  let submit = useSubmitImpl(fetcherKey, routeId);\n  let formMethod = method.toLowerCase() === \"get\" ? \"get\" : \"post\";\n  let formAction = useFormAction(action, {\n    relative\n  });\n  let submitHandler = event => {\n    onSubmit && onSubmit(event);\n    if (event.defaultPrevented) return;\n    event.preventDefault();\n    let submitter = event.nativeEvent.submitter;\n    let submitMethod = (submitter == null ? void 0 : submitter.getAttribute(\"formmethod\")) || method;\n    submit(submitter || event.currentTarget, {\n      method: submitMethod,\n      replace,\n      relative,\n      preventScrollReset\n    });\n  };\n  return /*#__PURE__*/React.createElement(\"form\", _extends({\n    ref: forwardedRef,\n    method: formMethod,\n    action: formAction,\n    onSubmit: reloadDocument ? onSubmit : submitHandler\n  }, props));\n});\nif (process.env.NODE_ENV !== \"production\") {\n  FormImpl.displayName = \"FormImpl\";\n}\n/**\n * This component will emulate the browser's scroll restoration on location\n * changes.\n */\nfunction ScrollRestoration(_ref7) {\n  let {\n    getKey,\n    storageKey\n  } = _ref7;\n  useScrollRestoration({\n    getKey,\n    storageKey\n  });\n  return null;\n}\nif (process.env.NODE_ENV !== \"production\") {\n  ScrollRestoration.displayName = \"ScrollRestoration\";\n}\n//#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Hooks\n////////////////////////////////////////////////////////////////////////////////\nvar DataRouterHook;\n(function (DataRouterHook) {\n  DataRouterHook[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n  DataRouterHook[\"UseSubmitImpl\"] = \"useSubmitImpl\";\n  DataRouterHook[\"UseFetcher\"] = \"useFetcher\";\n})(DataRouterHook || (DataRouterHook = {}));\nvar DataRouterStateHook;\n(function (DataRouterStateHook) {\n  DataRouterStateHook[\"UseFetchers\"] = \"useFetchers\";\n  DataRouterStateHook[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\nfunction getDataRouterConsoleError(hookName) {\n  return hookName + \" must be used within a data router.  See https://reactrouter.com/routers/picking-a-router.\";\n}\nfunction useDataRouterContext(hookName) {\n  let ctx = React.useContext(UNSAFE_DataRouterContext);\n  !ctx ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n  return ctx;\n}\nfunction useDataRouterState(hookName) {\n  let state = React.useContext(UNSAFE_DataRouterStateContext);\n  !state ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n  return state;\n}\n/**\n * Handles the click behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same click behavior we\n * use in our exported `<Link>`.\n */\nfunction useLinkClickHandler(to, _temp) {\n  let {\n    target,\n    replace: replaceProp,\n    state,\n    preventScrollReset,\n    relative\n  } = _temp === void 0 ? {} : _temp;\n  let navigate = useNavigate();\n  let location = useLocation();\n  let path = useResolvedPath(to, {\n    relative\n  });\n  return React.useCallback(event => {\n    if (shouldProcessLinkClick(event, target)) {\n      event.preventDefault();\n      // If the URL hasn't changed, a regular <a> will do a replace instead of\n      // a push, so do the same here unless the replace prop is explicitly set\n      let replace = replaceProp !== undefined ? replaceProp : createPath(location) === createPath(path);\n      navigate(to, {\n        replace,\n        state,\n        preventScrollReset,\n        relative\n      });\n    }\n  }, [location, navigate, path, replaceProp, state, target, to, preventScrollReset, relative]);\n}\n/**\n * A convenient wrapper for reading and writing search parameters via the\n * URLSearchParams interface.\n */\nfunction useSearchParams(defaultInit) {\n  process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(typeof URLSearchParams !== \"undefined\", \"You cannot use the `useSearchParams` hook in a browser that does not \" + \"support the URLSearchParams API. If you need to support Internet \" + \"Explorer 11, we recommend you load a polyfill such as \" + \"https://github.com/ungap/url-search-params\\n\\n\" + \"If you're unsure how to load polyfills, we recommend you check out \" + \"https://polyfill.io/v3/ which provides some recommendations about how \" + \"to load polyfills only for users that need them, instead of for every \" + \"user.\") : void 0;\n  let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));\n  let hasSetSearchParamsRef = React.useRef(false);\n  let location = useLocation();\n  let searchParams = React.useMemo(() =>\n  // Only merge in the defaults if we haven't yet called setSearchParams.\n  // Once we call that we want those to take precedence, otherwise you can't\n  // remove a param with setSearchParams({}) if it has an initial value\n  getSearchParamsForLocation(location.search, hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current), [location.search]);\n  let navigate = useNavigate();\n  let setSearchParams = React.useCallback((nextInit, navigateOptions) => {\n    const newSearchParams = createSearchParams(typeof nextInit === \"function\" ? nextInit(searchParams) : nextInit);\n    hasSetSearchParamsRef.current = true;\n    navigate(\"?\" + newSearchParams, navigateOptions);\n  }, [navigate, searchParams]);\n  return [searchParams, setSearchParams];\n}\n/**\n * Returns a function that may be used to programmatically submit a form (or\n * some arbitrary data) to the server.\n */\nfunction useSubmit() {\n  return useSubmitImpl();\n}\nfunction useSubmitImpl(fetcherKey, fetcherRouteId) {\n  let {\n    router\n  } = useDataRouterContext(DataRouterHook.UseSubmitImpl);\n  let {\n    basename\n  } = React.useContext(UNSAFE_NavigationContext);\n  let currentRouteId = UNSAFE_useRouteId();\n  return React.useCallback(function (target, options) {\n    if (options === void 0) {\n      options = {};\n    }\n    if (typeof document === \"undefined\") {\n      throw new Error(\"You are calling submit during the server render. \" + \"Try calling submit within a `useEffect` or callback instead.\");\n    }\n    let {\n      action,\n      method,\n      encType,\n      formData\n    } = getFormSubmissionInfo(target, options, basename);\n    // Base options shared between fetch() and navigate()\n    let opts = {\n      preventScrollReset: options.preventScrollReset,\n      formData,\n      formMethod: method,\n      formEncType: encType\n    };\n    if (fetcherKey) {\n      !(fetcherRouteId != null) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"No routeId available for useFetcher()\") : UNSAFE_invariant(false) : void 0;\n      router.fetch(fetcherKey, fetcherRouteId, action, opts);\n    } else {\n      router.navigate(action, _extends({}, opts, {\n        replace: options.replace,\n        fromRouteId: currentRouteId\n      }));\n    }\n  }, [router, basename, fetcherKey, fetcherRouteId, currentRouteId]);\n}\n// v7: Eventually we should deprecate this entirely in favor of using the\n// router method directly?\nfunction useFormAction(action, _temp2) {\n  let {\n    relative\n  } = _temp2 === void 0 ? {} : _temp2;\n  let {\n    basename\n  } = React.useContext(UNSAFE_NavigationContext);\n  let routeContext = React.useContext(UNSAFE_RouteContext);\n  !routeContext ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"useFormAction must be used inside a RouteContext\") : UNSAFE_invariant(false) : void 0;\n  let [match] = routeContext.matches.slice(-1);\n  // Shallow clone path so we can modify it below, otherwise we modify the\n  // object referenced by useMemo inside useResolvedPath\n  let path = _extends({}, useResolvedPath(action ? action : \".\", {\n    relative\n  }));\n  // Previously we set the default action to \".\". The problem with this is that\n  // `useResolvedPath(\".\")` excludes search params and the hash of the resolved\n  // URL. This is the intended behavior of when \".\" is specifically provided as\n  // the form action, but inconsistent w/ browsers when the action is omitted.\n  // https://github.com/remix-run/remix/issues/927\n  let location = useLocation();\n  if (action == null) {\n    // Safe to write to these directly here since if action was undefined, we\n    // would have called useResolvedPath(\".\") which will never include a search\n    // or hash\n    path.search = location.search;\n    path.hash = location.hash;\n    // When grabbing search params from the URL, remove the automatically\n    // inserted ?index param so we match the useResolvedPath search behavior\n    // which would not include ?index\n    if (match.route.index) {\n      let params = new URLSearchParams(path.search);\n      params.delete(\"index\");\n      path.search = params.toString() ? \"?\" + params.toString() : \"\";\n    }\n  }\n  if ((!action || action === \".\") && match.route.index) {\n    path.search = path.search ? path.search.replace(/^\\?/, \"?index&\") : \"?index\";\n  }\n  // If we're operating within a basename, prepend it to the pathname prior\n  // to creating the form action.  If this is a root navigation, then just use\n  // the raw basename which allows the basename to have full control over the\n  // presence of a trailing slash on root actions\n  if (basename !== \"/\") {\n    path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n  }\n  return createPath(path);\n}\nfunction createFetcherForm(fetcherKey, routeId) {\n  let FetcherForm = /*#__PURE__*/React.forwardRef((props, ref) => {\n    return /*#__PURE__*/React.createElement(FormImpl, _extends({}, props, {\n      ref: ref,\n      fetcherKey: fetcherKey,\n      routeId: routeId\n    }));\n  });\n  if (process.env.NODE_ENV !== \"production\") {\n    FetcherForm.displayName = \"fetcher.Form\";\n  }\n  return FetcherForm;\n}\nlet fetcherId = 0;\n/**\n * Interacts with route loaders and actions without causing a navigation. Great\n * for any interaction that stays on the same page.\n */\nfunction useFetcher() {\n  var _route$matches;\n  let {\n    router\n  } = useDataRouterContext(DataRouterHook.UseFetcher);\n  let route = React.useContext(UNSAFE_RouteContext);\n  !route ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"useFetcher must be used inside a RouteContext\") : UNSAFE_invariant(false) : void 0;\n  let routeId = (_route$matches = route.matches[route.matches.length - 1]) == null ? void 0 : _route$matches.route.id;\n  !(routeId != null) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"useFetcher can only be used on routes that contain a unique \\\"id\\\"\") : UNSAFE_invariant(false) : void 0;\n  let [fetcherKey] = React.useState(() => String(++fetcherId));\n  let [Form] = React.useState(() => {\n    !routeId ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"No routeId available for fetcher.Form()\") : UNSAFE_invariant(false) : void 0;\n    return createFetcherForm(fetcherKey, routeId);\n  });\n  let [load] = React.useState(() => href => {\n    !router ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"No router available for fetcher.load()\") : UNSAFE_invariant(false) : void 0;\n    !routeId ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"No routeId available for fetcher.load()\") : UNSAFE_invariant(false) : void 0;\n    router.fetch(fetcherKey, routeId, href);\n  });\n  let submit = useSubmitImpl(fetcherKey, routeId);\n  let fetcher = router.getFetcher(fetcherKey);\n  let fetcherWithComponents = React.useMemo(() => _extends({\n    Form,\n    submit,\n    load\n  }, fetcher), [fetcher, Form, submit, load]);\n  React.useEffect(() => {\n    // Is this busted when the React team gets real weird and calls effects\n    // twice on mount?  We really just need to garbage collect here when this\n    // fetcher is no longer around.\n    return () => {\n      if (!router) {\n        console.warn(\"No router available to clean up from useFetcher()\");\n        return;\n      }\n      router.deleteFetcher(fetcherKey);\n    };\n  }, [router, fetcherKey]);\n  return fetcherWithComponents;\n}\n/**\n * Provides all fetchers currently on the page. Useful for layouts and parent\n * routes that need to provide pending/optimistic UI regarding the fetch.\n */\nfunction useFetchers() {\n  let state = useDataRouterState(DataRouterStateHook.UseFetchers);\n  return [...state.fetchers.values()];\n}\nconst SCROLL_RESTORATION_STORAGE_KEY = \"react-router-scroll-positions\";\nlet savedScrollPositions = {};\n/**\n * When rendered inside a RouterProvider, will restore scroll positions on navigations\n */\nfunction useScrollRestoration(_temp3) {\n  let {\n    getKey,\n    storageKey\n  } = _temp3 === void 0 ? {} : _temp3;\n  let {\n    router\n  } = useDataRouterContext(DataRouterHook.UseScrollRestoration);\n  let {\n    restoreScrollPosition,\n    preventScrollReset\n  } = useDataRouterState(DataRouterStateHook.UseScrollRestoration);\n  let location = useLocation();\n  let matches = useMatches();\n  let navigation = useNavigation();\n  // Trigger manual scroll restoration while we're active\n  React.useEffect(() => {\n    window.history.scrollRestoration = \"manual\";\n    return () => {\n      window.history.scrollRestoration = \"auto\";\n    };\n  }, []);\n  // Save positions on pagehide\n  usePageHide(React.useCallback(() => {\n    if (navigation.state === \"idle\") {\n      let key = (getKey ? getKey(location, matches) : null) || location.key;\n      savedScrollPositions[key] = window.scrollY;\n    }\n    sessionStorage.setItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY, JSON.stringify(savedScrollPositions));\n    window.history.scrollRestoration = \"auto\";\n  }, [storageKey, getKey, navigation.state, location, matches]));\n  // Read in any saved scroll locations\n  if (typeof document !== \"undefined\") {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      try {\n        let sessionPositions = sessionStorage.getItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY);\n        if (sessionPositions) {\n          savedScrollPositions = JSON.parse(sessionPositions);\n        }\n      } catch (e) {\n        // no-op, use default empty object\n      }\n    }, [storageKey]);\n    // Enable scroll restoration in the router\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      let disableScrollRestoration = router == null ? void 0 : router.enableScrollRestoration(savedScrollPositions, () => window.scrollY, getKey);\n      return () => disableScrollRestoration && disableScrollRestoration();\n    }, [router, getKey]);\n    // Restore scrolling when state.restoreScrollPosition changes\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      // Explicit false means don't do anything (used for submissions)\n      if (restoreScrollPosition === false) {\n        return;\n      }\n      // been here before, scroll to it\n      if (typeof restoreScrollPosition === \"number\") {\n        window.scrollTo(0, restoreScrollPosition);\n        return;\n      }\n      // try to scroll to the hash\n      if (location.hash) {\n        let el = document.getElementById(location.hash.slice(1));\n        if (el) {\n          el.scrollIntoView();\n          return;\n        }\n      }\n      // Don't reset if this navigation opted out\n      if (preventScrollReset === true) {\n        return;\n      }\n      // otherwise go to the top on new locations\n      window.scrollTo(0, 0);\n    }, [location, restoreScrollPosition, preventScrollReset]);\n  }\n}\n/**\n * Setup a callback to be fired on the window's `beforeunload` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nfunction useBeforeUnload(callback, options) {\n  let {\n    capture\n  } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? {\n      capture\n    } : undefined;\n    window.addEventListener(\"beforeunload\", callback, opts);\n    return () => {\n      window.removeEventListener(\"beforeunload\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n/**\n * Setup a callback to be fired on the window's `pagehide` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.  This event is better supported than beforeunload across browsers.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nfunction usePageHide(callback, options) {\n  let {\n    capture\n  } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? {\n      capture\n    } : undefined;\n    window.addEventListener(\"pagehide\", callback, opts);\n    return () => {\n      window.removeEventListener(\"pagehide\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n/**\n * Wrapper around useBlocker to show a window.confirm prompt to users instead\n * of building a custom UI with useBlocker.\n *\n * Warning: This has *a lot of rough edges* and behaves very differently (and\n * very incorrectly in some cases) across browsers if user click addition\n * back/forward navigations while the confirm is open.  Use at your own risk.\n */\nfunction usePrompt(_ref8) {\n  let {\n    when,\n    message\n  } = _ref8;\n  let blocker = unstable_useBlocker(when);\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\" && !when) {\n      blocker.reset();\n    }\n  }, [blocker, when]);\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\") {\n      let proceed = window.confirm(message);\n      if (proceed) {\n        setTimeout(blocker.proceed, 0);\n      } else {\n        blocker.reset();\n      }\n    }\n  }, [blocker, message]);\n}\n//#endregion\n\n// v5 isn't in TypeScript, they'll also lose the @types/react-router with this\n// but not worried about that for now.\nfunction CompatRoute(props) {\n  let {\n    location,\n    path\n  } = props;\n  if (!props.exact) path += \"/*\";\n  return /*#__PURE__*/React.createElement(Routes, {\n    location: location\n  }, /*#__PURE__*/React.createElement(Route, {\n    path: path,\n    element: /*#__PURE__*/React.createElement(Route$1, _extends({}, props))\n  }));\n}\n// Copied with 💜 from https://github.com/bvaughn/react-resizable-panels/blob/main/packages/react-resizable-panels/src/hooks/useIsomorphicEffect.ts\nconst canUseEffectHooks = !!(typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\");\nconst useIsomorphicLayoutEffect = canUseEffectHooks ? React.useLayoutEffect : () => {};\nfunction CompatRouter(_ref) {\n  let {\n    children\n  } = _ref;\n  let history = useHistory();\n  let [state, setState] = React.useState(() => ({\n    location: history.location,\n    action: history.action\n  }));\n  useIsomorphicLayoutEffect(() => {\n    history.listen((location, action) => setState({\n      location,\n      action\n    }));\n  }, [history]);\n  return /*#__PURE__*/React.createElement(Router, {\n    navigationType: state.action,\n    location: state.location,\n    navigator: history\n  }, /*#__PURE__*/React.createElement(Routes, null, /*#__PURE__*/React.createElement(Route, {\n    path: \"*\",\n    element: children\n  })));\n}\n/**\n * A <Router> that may not navigate to any other location. This is useful\n * on the server where there is no stateful UI.\n */\nfunction StaticRouter(_ref2) {\n  let {\n    basename,\n    children,\n    location: locationProp = \"/\"\n  } = _ref2;\n  if (typeof locationProp === \"string\") {\n    locationProp = parsePath(locationProp);\n  }\n  let action = Action.Pop;\n  let location = {\n    pathname: locationProp.pathname || \"/\",\n    search: locationProp.search || \"\",\n    hash: locationProp.hash || \"\",\n    state: locationProp.state || null,\n    key: locationProp.key || \"default\"\n  };\n  let staticNavigator = {\n    createHref(to) {\n      return typeof to === \"string\" ? to : createPath$1(to);\n    },\n    encodeLocation(to) {\n      let path = typeof to === \"string\" ? parsePath(to) : to;\n      return {\n        pathname: path.pathname || \"\",\n        search: path.search || \"\",\n        hash: path.hash || \"\"\n      };\n    },\n    push(to) {\n      throw new Error(\"You cannot use navigator.push() on the server because it is a stateless \" + \"environment. This error was probably triggered when you did a \" + (\"`navigate(\" + JSON.stringify(to) + \")` somewhere in your app.\"));\n    },\n    replace(to) {\n      throw new Error(\"You cannot use navigator.replace() on the server because it is a stateless \" + \"environment. This error was probably triggered when you did a \" + (\"`navigate(\" + JSON.stringify(to) + \", { replace: true })` somewhere \") + \"in your app.\");\n    },\n    go(delta) {\n      throw new Error(\"You cannot use navigator.go() on the server because it is a stateless \" + \"environment. This error was probably triggered when you did a \" + (\"`navigate(\" + delta + \")` somewhere in your app.\"));\n    },\n    back() {\n      throw new Error(\"You cannot use navigator.back() on the server because it is a stateless \" + \"environment.\");\n    },\n    forward() {\n      throw new Error(\"You cannot use navigator.forward() on the server because it is a stateless \" + \"environment.\");\n    }\n  };\n  return /*#__PURE__*/React.createElement(Router, {\n    basename: basename,\n    children: children,\n    location: location,\n    navigationType: action,\n    navigator: staticNavigator,\n    static: true\n  });\n}\n\nexport { BrowserRouter, CompatRoute, CompatRouter, Form, HashRouter, Link, NavLink, ScrollRestoration, StaticRouter, useScrollRestoration as UNSAFE_useScrollRestoration, createBrowserRouter, createHashRouter, createSearchParams, HistoryRouter as unstable_HistoryRouter, usePrompt as unstable_usePrompt, useBeforeUnload, useFetcher, useFetchers, useFormAction, useLinkClickHandler, useSearchParams, useSubmit };\n//# sourceMappingURL=index.js.map\n"],"names":["_inheritsLoose","subClass","superClass","setPrototypeOf","isAbsolute","pathname","spliceOne","list","index","i","k","n","resolvePathname","to","from","toParts","fromParts","isToAbs","isFromAbs","mustEndAbs","hasTrailingSlash","last","up","part","result","valueOf","obj","valueEqual","a","b","item","aValue","bValue","key","warning","condition","message","text","prefix","invariant","provided","value","parsePath","path","search","hash","hashIndex","searchIndex","createPath","location","createLocation","state","currentLocation","_extends","e","locationsAreEqual","createTransitionManager","prompt","setPrompt","nextPrompt","confirmTransitionTo","action","getUserConfirmation","callback","listeners","appendListener","fn","isActive","listener","notifyListeners","_len","args","_key","clamp","lowerBound","upperBound","createMemoryHistory","props","_props","_props$initialEntries","initialEntries","_props$initialIndex","initialIndex","_props$keyLength","keyLength","transitionManager","setState","nextState","history","createKey","entries","entry","createHref","push","ok","prevIndex","nextIndex","nextEntries","replace","go","goBack","goForward","canGo","block","listen","MAX_SIGNED_31_BIT_INT","commonjsGlobal","getUniqueId","objectIs","x","y","createEventEmitter","handlers","handler","h","newValue","changedBits","onlyChild","children","createReactContext","defaultValue","calculateChangedBits","_Provider$childContex","_Consumer$contextType","contextProp","Provider","_Component","_this","_proto","_ref","nextProps","oldValue","Component","PropTypes","Consumer","_Component2","_this2","observedBits","_proto2","React","isarray","arr","require$$0","pathToRegexpModule","pathToRegexp","parse","compile","tokensToFunction","tokensToRegExp","PATH_REGEXP","str","options","tokens","defaultDelimiter","res","m","escaped","offset","next","name","capture","group","modifier","asterisk","partial","repeat","optional","delimiter","pattern","prevText","escapeGroup","restrictBacktrack","escapeString","encodeURIComponentPretty","c","encodeAsterisk","matches","flags","opts","data","encode","token","segment","j","attachKeys","re","keys","regexpToRegexp","groups","arrayToRegexp","parts","regexp","stringToRegexp","strict","end","route","endsWithDelimiter","createNamedContext","context","createContext","historyContext","Router","_React$Component","Router2","prevProps","MemoryRouter","Lifecycle","messageType","cache","cacheLimit","cacheCount","compilePath","generator","generatePath","params","Redirect","computedMatch","_ref$push","staticContext","method","self","prevLocation","cache$1","cacheLimit$1","cacheCount$1","compilePath$1","cacheKey","pathCache","matchPath","_options","_options$exact","exact","_options$strict","_options$sensitive","sensitive","paths","matched","_compilePath","match","url","values","isExact","memo","isEmptyChildren","evalChildrenDev","Route","context$1","_this$props","component","render","propName","isValidElementType","addLeadingSlash","addBasename","basename","stripBasename","base","createURL","staticHandler","methodName","noop","StaticRouter","_this$props$basename","_this$props$context","context2","_this$props2","_this$props2$basename","_this$props2$context","_this$props2$location","rest","_objectWithoutPropertiesLoose","Switch","element","child","withRouter","displayName","C","wrappedComponentRef","remainingProps","hoistStatics","useContext","useHistory","useLocation","global","buildNames","initialBuildName","secondaryBuildName","stripLeadingSlash","hasBasename","stripTrailingSlash","canUseDOM","getConfirmation","supportsHistory","ua","supportsPopStateOnHashChange","supportsGoWithoutReloadUsingHash","isExtraneousPopstateEvent","event","PopStateEvent","HashChangeEvent","getHistoryState","createBrowserHistory","globalHistory","canUseHistory","needsHashChangeListener","_props$forceRefresh","forceRefresh","_props$getUserConfirm","getDOMLocation","historyState","_window$location","handlePopState","handlePop","handleHashChange","forceNextPop","revertPop","fromLocation","toLocation","toIndex","allKeys","fromIndex","delta","initialLocation","href","nextKeys","listenerCount","checkDOMListeners","isBlocked","unblock","unlisten","HashChangeEvent$1","HashPathCoders","stripHash","getHashPath","pushHashPath","replaceHashPath","createHashHistory","canGoWithoutReload","_props$hashType","hashType","_HashPathCoders$hashT","encodePath","decodePath","ignorePath","locationsAreEqual$$1","encodedPath","allPaths","baseTag","hashChanged","nextPaths","BrowserRouter","HashRouter","resolveToLocation","normalizeToLocation","forwardRefShim","forwardRef","isModifiedEvent","LinkAnchor","forwardedRef","innerRef","navigate","_onClick","target","ex","Link","_ref2","_ref2$component","__RouterContext","isDuplicateNavigation","toType","refType","forwardRefShim$1","forwardRef$1","joinClassnames","classnames","NavLink","_ref$ariaCurrent","ariaCurrent","_ref$activeClassName","activeClassName","activeStyle","classNameProp","isActiveProp","locationProp","styleProp","escapedPath","className","style","ariaCurrentType","source","Action","cond","parsedPath","ResultType","matchRoutes","routes","locationArg","branches","flattenRoutes","rankRouteBranches","matchRouteBranch","safelyDecodeURI","parentsMeta","parentPath","flattenRoute","relativePath","meta","joinPaths","routesMeta","computeScore","_route$path","exploded","explodeOptionalSegments","segments","first","isOptional","required","restExploded","subpath","compareIndexes","paramRe","dynamicSegmentValue","indexRouteValue","emptySegmentValue","staticSegmentValue","splatPenalty","isSplat","s","initialScore","score","branch","matchedParams","matchedPathname","remainingPathname","normalizePathname","matcher","paramNames","pathnameBase","captureGroups","paramName","splatValue","safelyDecodeURIComponent","caseSensitive","regexpSource","_","error","startIndex","nextChar","resolvePath","fromPathname","toPathname","normalizeSearch","normalizeHash","getInvalidPathError","char","field","dest","getPathContributingMatches","resolveTo","toArg","routePathnames","locationPathname","isPathRelative","isEmptyPath","routePathnameIndex","toSegments","hasExplicitTrailingSlash","hasCurrentTrailingSlash","isRouteErrorResponse","validMutationMethodsArr","validRequestMethodsArr","DataRouterContext","React.createContext","DataRouterStateContext","AwaitContext","NavigationContext","LocationContext","RouteContext","RouteErrorContext","useHref","_temp","relative","useInRouterContext","UNSAFE_invariant","navigator","React.useContext","useResolvedPath","joinedPathname","navigateEffectWarning","useIsomorphicLayoutEffect","cb","React.useLayoutEffect","useNavigate","isDataRoute","useNavigateStable","useNavigateUnstable","dataRouterContext","routePathnamesJson","UNSAFE_getPathContributingMatches","activeRef","React.useRef","React.useCallback","UNSAFE_warning","useParams","routeMatch","_temp2","React.useMemo","useRoutes","useRoutesImpl","dataRouterState","parentMatches","parentParams","parentPathname","parentPathnameBase","parentRoute","warningOnce","locationFromContext","_parsedLocationArg$pa","parsedLocationArg","renderedMatches","_renderMatches","React.createElement","DefaultErrorComponent","useRouteError","stack","lightgrey","preStyles","codeStyles","devInfo","React.Fragment","defaultErrorElement","RenderErrorBoundary","React.Component","errorInfo","RenderedRoute","routeContext","_dataRouterState2","_dataRouterState","errors","errorIndex","outlet","errorElement","getChildren","DataRouterHook","DataRouterStateHook","getDataRouterConsoleError","hookName","useDataRouterContext","ctx","useDataRouterState","useRouteContext","useCurrentRouteId","thisRoute","useRouteId","_state$errors","routeId","router","id","alreadyWarned","Navigate","_ref4","jsonPath","React.useEffect","_ref5","basenameProp","navigationType","staticProp","navigationContext","locationContext","trailingPathname","Routes","_ref6","createRoutesFromChildren","AwaitRenderStatus","React.Children","React.isValidElement","treePath","excluded","sourceKeys","defaultMethod","defaultEncType","isHtmlElement","object","isButtonElement","isFormElement","isInputElement","shouldProcessLinkClick","getFormSubmissionInfo","encType","formData","submissionTrigger","attr","form","_excluded","_excluded2","_excluded3","isBrowser","ABSOLUTE_URL_REGEX","React.forwardRef","ref","onClick","reloadDocument","preventScrollReset","UNSAFE_NavigationContext","absoluteHref","isExternal","currentUrl","targetUrl","internalOnClick","useLinkClickHandler","handleClick","ariaCurrentProp","routerState","UNSAFE_DataRouterStateContext","nextLocationPathname","isPending","Form","FormImpl","onSubmit","fetcherKey","submit","useSubmitImpl","formMethod","formAction","useFormAction","submitHandler","submitter","submitMethod","UNSAFE_DataRouterContext","replaceProp","fetcherRouteId","currentRouteId","UNSAFE_useRouteId","UNSAFE_RouteContext","canUseEffectHooks","CompatRouter","React.useState"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]}