{"version":3,"file":"@remix-run-rApWKGR-.js","sources":["../../node_modules/@remix-run/router/dist/router.js"],"sourcesContent":["/**\n * @remix-run/router v1.23.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 */\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    // Hash URL should always have a leading / just like window.location.pathname\n    // does, so if an app ends up at a route like /#something then we add a\n    // leading slash so all of our path-matching behaves the same as if it would\n    // in a browser router.  This is particularly important when there exists a\n    // root splat route (<Route path=\"*\">) since that matches internally against\n    // \"/*\" and we'd expect /#something to 404 in a hash router app.\n    if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n      pathname = \"/\" + pathname;\n    }\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    // Treating this as a full URL will strip any trailing spaces so we need to\n    // pre-encode them since they might be part of a matching splat param from\n    // an ancestor route\n    href = href.replace(/ $/, \"%20\");\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, String(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/v6/utils/match-routes\n */\nfunction matchRoutes(routes, locationArg, basename) {\n  if (basename === void 0) {\n    basename = \"/\";\n  }\n  return matchRoutesImpl(routes, locationArg, basename, false);\n}\nfunction matchRoutesImpl(routes, locationArg, basename, allowPartial) {\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    // 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    let decoded = decodePath(pathname);\n    matches = matchRouteBranch(branches[i], decoded, allowPartial);\n  }\n  return matches;\n}\nfunction convertRouteMatchToUiMatch(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 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 explode _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, allowPartial) {\n  if (allowPartial === void 0) {\n    allowPartial = false;\n  }\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    let route = meta.route;\n    if (!match && end && allowPartial && !routesMeta[routesMeta.length - 1].route.index) {\n      match = matchPath({\n        path: meta.relativePath,\n        caseSensitive: meta.caseSensitive,\n        end: false\n      }, remainingPathname);\n    }\n    if (!match) {\n      return null;\n    }\n    Object.assign(matchedParams, match.params);\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/v6/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 stringify = p => p == null ? \"\" : typeof p === \"string\" ? p : String(p);\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      // Apply the splat\n      return stringify(params[star]);\n    }\n    const keyMatch = segment.match(/^:([\\w-]+)(\\??)$/);\n    if (keyMatch) {\n      const [, key, optional] = keyMatch;\n      let param = params[key];\n      invariant(optional === \"?\" || param != null, \"Missing \\\":\" + key + \"\\\" param\");\n      return stringify(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/v6/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, compiledParams] = 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 = compiledParams.reduce((memo, _ref, index) => {\n    let {\n      paramName,\n      isOptional\n    } = _ref;\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    const value = captureGroups[index];\n    if (isOptional && !value) {\n      memo[paramName] = undefined;\n    } else {\n      memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n    }\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 params = [];\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, isOptional) => {\n    params.push({\n      paramName,\n      isOptional: isOptional != null\n    });\n    return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n  });\n  if (path.endsWith(\"*\")) {\n    params.push({\n      paramName: \"*\"\n    });\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, params];\n}\nfunction decodePath(value) {\n  try {\n    return value.split(\"/\").map(v => decodeURIComponent(v).replace(/\\//g, \"%2F\")).join(\"/\");\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}\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/v6/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// Return the array of pathnames for the current route matches - used to\n// generate the routePathnames input for resolveTo()\nfunction getResolveToMatches(matches, v7_relativeSplatPath) {\n  let pathMatches = getPathContributingMatches(matches);\n  // When v7_relativeSplatPath is enabled, use the full pathname for the leaf\n  // match so we include splat values for \".\" links.  See:\n  // https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329\n  if (v7_relativeSplatPath) {\n    return pathMatches.map((match, idx) => idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase);\n  }\n  return pathMatches.map(match => match.pathnameBase);\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 (toPathname == null) {\n    from = locationPathname;\n  } else {\n    let routePathnameIndex = routePathnames.length - 1;\n    // With relative=\"route\" (the default), each leading .. segment means\n    // \"go up one route\" instead of \"go up one URL segment\".  This is a key\n    // difference from how <a href> works and a major reason we call this a\n    // \"to\" value instead of a \"href\".\n    if (!isPathRelative && toPathname.startsWith(\"..\")) {\n      let toSegments = toPathname.split(\"/\");\n      while (toSegments[0] === \"..\") {\n        toSegments.shift();\n        routePathnameIndex -= 1;\n      }\n      to.pathname = toSegments.join(\"/\");\n    }\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 *\n * @deprecated The `json` method is deprecated in favor of returning raw objects.\n * This method will be removed in v7.\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 DataWithResponseInit {\n  constructor(data, init) {\n    this.type = \"DataWithResponseInit\";\n    this.data = data;\n    this.init = init || null;\n  }\n}\n/**\n * Create \"responses\" that contain `status`/`headers` without forcing\n * serialization into an actual `Response` - used by Remix single fetch\n */\nfunction data(data, init) {\n  return new DataWithResponseInit(data, typeof init === \"number\" ? {\n    status: init\n  } : init);\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, _ref2) => {\n      let [key, value] = _ref2;\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, undefined, 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 the promise was resolved/rejected with undefined, we'll throw an error as you\n    // should always resolve with a value or null\n    if (error === undefined && data === undefined) {\n      let undefinedError = new Error(\"Deferred data for key \\\"\" + key + \"\\\" resolved/rejected with `undefined`, \" + \"you must resolve/reject with a value or `null`.\");\n      Object.defineProperty(promise, \"_error\", {\n        get: () => undefinedError\n      });\n      this.emit(false, key);\n      return Promise.reject(undefinedError);\n    }\n    if (data === undefined) {\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, _ref3) => {\n      let [key, value] = _ref3;\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}\n/**\n * @deprecated The `defer` method is deprecated in favor of returning raw\n * objects. This method will be removed in v7.\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 * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nconst redirectDocument = (url, init) => {\n  let response = redirect(url, init);\n  response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n  return response;\n};\n/**\n * A redirect response that will perform a `history.replaceState` instead of a\n * `history.pushState` for client-side navigation redirects.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nconst replace = (url, init) => {\n  let response = redirect(url, init);\n  response.headers.set(\"X-Remix-Replace\", \"true\");\n  return response;\n};\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don't export the class for public use since it's an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nclass ErrorResponseImpl {\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  json: undefined,\n  text: undefined\n};\nconst IDLE_FETCHER = {\n  state: \"idle\",\n  data: undefined,\n  formMethod: undefined,\n  formAction: undefined,\n  formEncType: undefined,\n  formData: undefined,\n  json: undefined,\n  text: 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});\nconst TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\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  let dataStrategyImpl = init.dataStrategy || defaultDataStrategy;\n  let patchRoutesOnNavigationImpl = init.patchRoutesOnNavigation;\n  // Config driven behavior flags\n  let future = _extends({\n    v7_fetcherPersist: false,\n    v7_normalizeFormMethod: false,\n    v7_partialHydration: false,\n    v7_prependBasename: false,\n    v7_relativeSplatPath: false,\n    v7_skipActionErrorRevalidation: 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 initialMatchesIsFOW = false;\n  let initialErrors = null;\n  if (initialMatches == null && !patchRoutesOnNavigationImpl) {\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  // In SPA apps, if the user provided a patchRoutesOnNavigation implementation and\n  // our initial match is a splat route, clear them out so we run through lazy\n  // discovery on hydration in case there's a more accurate lazy route match.\n  // In SSR apps (with `hydrationData`), we expect that the server will send\n  // up the proper matched routes so we don't want to run lazy discovery on\n  // initial hydration and want to hydrate into the splat route.\n  if (initialMatches && !init.hydrationData) {\n    let fogOfWar = checkFogOfWar(initialMatches, dataRoutes, init.history.location.pathname);\n    if (fogOfWar.active) {\n      initialMatches = null;\n    }\n  }\n  let initialized;\n  if (!initialMatches) {\n    initialized = false;\n    initialMatches = [];\n    // If partial hydration and fog of war is enabled, we will be running\n    // `patchRoutesOnNavigation` during hydration so include any partial matches as\n    // the initial matches so we can properly render `HydrateFallback`'s\n    if (future.v7_partialHydration) {\n      let fogOfWar = checkFogOfWar(null, dataRoutes, init.history.location.pathname);\n      if (fogOfWar.active && fogOfWar.matches) {\n        initialMatchesIsFOW = true;\n        initialMatches = fogOfWar.matches;\n      }\n    }\n  } else if (initialMatches.some(m => m.route.lazy)) {\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    initialized = false;\n  } else if (!initialMatches.some(m => m.route.loader)) {\n    // If we've got no loaders to run, then we're good to go\n    initialized = true;\n  } else if (future.v7_partialHydration) {\n    // If partial hydration is enabled, we're initialized so long as we were\n    // provided with hydrationData for every route with a loader, and no loaders\n    // were marked for explicit hydration\n    let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;\n    let errors = init.hydrationData ? init.hydrationData.errors : null;\n    // If errors exist, don't consider routes below the boundary\n    if (errors) {\n      let idx = initialMatches.findIndex(m => errors[m.route.id] !== undefined);\n      initialized = initialMatches.slice(0, idx + 1).every(m => !shouldLoadRouteOnHydration(m.route, loaderData, errors));\n    } else {\n      initialized = initialMatches.every(m => !shouldLoadRouteOnHydration(m.route, loaderData, errors));\n    }\n  } else {\n    // Without partial hydration - we're initialized if we were provided any\n    // hydrationData - which is expected to be complete\n    initialized = init.hydrationData != null;\n  }\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  // Should the current navigation enable document.startViewTransition?\n  let pendingViewTransitionEnabled = false;\n  // Store applied view transitions so we can apply them on POP\n  let appliedViewTransitions = new Map();\n  // Cleanup function for persisting applied transitions to sessionStorage\n  let removePageHideEventListener = null;\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 = new Set();\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  // Ref-count mounted fetchers so we know when it's ok to clean them up\n  let activeFetchers = new Map();\n  // Fetchers that have requested a delete when using v7_fetcherPersist,\n  // they'll be officially removed after they return to idle\n  let deletedFetchers = new Set();\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 unblockBlockerHistoryUpdate = undefined;\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 (unblockBlockerHistoryUpdate) {\n        unblockBlockerHistoryUpdate();\n        unblockBlockerHistoryUpdate = undefined;\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        let nextHistoryUpdatePromise = new Promise(resolve => {\n          unblockBlockerHistoryUpdate = resolve;\n        });\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, after the url\n            // restoration is also complete.  See:\n            // https://github.com/remix-run/react-router/issues/11613\n            nextHistoryUpdatePromise.then(() => init.history.go(delta));\n          },\n          reset() {\n            let blockers = new Map(state.blockers);\n            blockers.set(blockerKey, IDLE_BLOCKER);\n            updateState({\n              blockers\n            });\n          }\n        });\n        return;\n      }\n      return startNavigation(historyAction, location);\n    });\n    if (isBrowser) {\n      // FIXME: This feels gross.  How can we cleanup the lines between\n      // scrollRestoration/appliedTransitions persistance?\n      restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n      let _saveAppliedTransitions = () => persistAppliedTransitions(routerWindow, appliedViewTransitions);\n      routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n      removePageHideEventListener = () => routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\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        initialHydration: true\n      });\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    if (removePageHideEventListener) {\n      removePageHideEventListener();\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, opts) {\n    if (opts === void 0) {\n      opts = {};\n    }\n    state = _extends({}, state, newState);\n    // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n    // can be removed\n    let completedFetchers = [];\n    let deletedFetchersKeys = [];\n    if (future.v7_fetcherPersist) {\n      state.fetchers.forEach((fetcher, key) => {\n        if (fetcher.state === \"idle\") {\n          if (deletedFetchers.has(key)) {\n            // Unmounted from the UI and can be totally removed\n            deletedFetchersKeys.push(key);\n          } else {\n            // Returned to idle but still mounted in the UI, so semi-remains for\n            // revalidations and such\n            completedFetchers.push(key);\n          }\n        }\n      });\n    }\n    // Remove any lingering deleted fetchers that have already been removed\n    // from state.fetchers\n    deletedFetchers.forEach(key => {\n      if (!state.fetchers.has(key) && !fetchControllers.has(key)) {\n        deletedFetchersKeys.push(key);\n      }\n    });\n    // Iterate over a local copy so that if flushSync is used and we end up\n    // removing and adding a new subscriber due to the useCallback dependencies,\n    // we don't get ourselves into a loop calling the new subscriber immediately\n    [...subscribers].forEach(subscriber => subscriber(state, {\n      deletedFetchers: deletedFetchersKeys,\n      viewTransitionOpts: opts.viewTransitionOpts,\n      flushSync: opts.flushSync === true\n    }));\n    // Remove idle fetchers from state since we only care about in-flight fetchers.\n    if (future.v7_fetcherPersist) {\n      completedFetchers.forEach(key => state.fetchers.delete(key));\n      deletedFetchersKeys.forEach(key => deleteFetcher(key));\n    } else {\n      // We already called deleteFetcher() on these, can remove them from this\n      // Set now that we've handed the keys off to the data layer\n      deletedFetchersKeys.forEach(key => deletedFetchers.delete(key));\n    }\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, _temp) {\n    var _location$state, _location$state2;\n    let {\n      flushSync\n    } = _temp === void 0 ? {} : _temp;\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    let blockers = state.blockers;\n    if (blockers.size > 0) {\n      blockers = new Map(blockers);\n      blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\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    // Commit any in-flight routes at the end of the HMR revalidation \"navigation\"\n    if (inFlightDataRoutes) {\n      dataRoutes = inFlightDataRoutes;\n      inFlightDataRoutes = undefined;\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    let viewTransitionOpts;\n    // On POP, enable transitions if they were enabled on the original navigation\n    if (pendingAction === Action.Pop) {\n      // Forward takes precedence so they behave like the original navigation\n      let priorPaths = appliedViewTransitions.get(state.location.pathname);\n      if (priorPaths && priorPaths.has(location.pathname)) {\n        viewTransitionOpts = {\n          currentLocation: state.location,\n          nextLocation: location\n        };\n      } else if (appliedViewTransitions.has(location.pathname)) {\n        // If we don't have a previous forward nav, assume we're popping back to\n        // the new location and enable if that location previously enabled\n        viewTransitionOpts = {\n          currentLocation: location,\n          nextLocation: state.location\n        };\n      }\n    } else if (pendingViewTransitionEnabled) {\n      // Store the applied transition on PUSH/REPLACE\n      let toPaths = appliedViewTransitions.get(state.location.pathname);\n      if (toPaths) {\n        toPaths.add(location.pathname);\n      } else {\n        toPaths = new Set([location.pathname]);\n        appliedViewTransitions.set(state.location.pathname, toPaths);\n      }\n      viewTransitionOpts = {\n        currentLocation: state.location,\n        nextLocation: location\n      };\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\n    }), {\n      viewTransitionOpts,\n      flushSync: flushSync === true\n    });\n    // Reset stateful navigation vars\n    pendingAction = Action.Pop;\n    pendingPreventScrollReset = false;\n    pendingViewTransitionEnabled = false;\n    isUninterruptedRevalidation = false;\n    isRevalidationRequired = false;\n    cancelledDeferredRoutes = [];\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, future.v7_relativeSplatPath, 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 flushSync = (opts && opts.flushSync) === true;\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          let blockers = new Map(state.blockers);\n          blockers.set(blockerKey, IDLE_BLOCKER);\n          updateState({\n            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      enableViewTransition: opts && opts.viewTransition,\n      flushSync\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      // Proxy through any rending view transition\n      enableViewTransition: pendingViewTransitionEnabled === true\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    pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let loadingNavigation = opts && opts.overrideNavigation;\n    let matches = opts != null && opts.initialHydration && state.matches && state.matches.length > 0 && !initialMatchesIsFOW ?\n    // `matchRoutes()` has already been called if we're in here via `router.initialize()`\n    state.matches : matchRoutes(routesToUse, location, basename);\n    let flushSync = (opts && opts.flushSync) === true;\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 hydration 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 (matches && state.initialized && !isRevalidationRequired && isHashChangeOnly(state.location, location) && !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))) {\n      completeNavigation(location, {\n        matches\n      }, {\n        flushSync\n      });\n      return;\n    }\n    let fogOfWar = checkFogOfWar(matches, routesToUse, location.pathname);\n    if (fogOfWar.active && fogOfWar.matches) {\n      matches = fogOfWar.matches;\n    }\n    // Short circuit with a 404 on the root error boundary if we match nothing\n    if (!matches) {\n      let {\n        error,\n        notFoundMatches,\n        route\n      } = handleNavigational404(location.pathname);\n      completeNavigation(location, {\n        matches: notFoundMatches,\n        loaderData: {},\n        errors: {\n          [route.id]: error\n        }\n      }, {\n        flushSync\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 pendingActionResult;\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      pendingActionResult = [findNearestBoundary(matches).route.id, {\n        type: ResultType.error,\n        error: opts.pendingError\n      }];\n    } else if (opts && opts.submission && isMutationMethod(opts.submission.formMethod)) {\n      // Call action if we received an action submission\n      let actionResult = await handleAction(request, location, opts.submission, matches, fogOfWar.active, {\n        replace: opts.replace,\n        flushSync\n      });\n      if (actionResult.shortCircuited) {\n        return;\n      }\n      // If we received a 404 from handleAction, it's because we couldn't lazily\n      // discover the destination route so we don't want to call loaders\n      if (actionResult.pendingActionResult) {\n        let [routeId, result] = actionResult.pendingActionResult;\n        if (isErrorResult(result) && isRouteErrorResponse(result.error) && result.error.status === 404) {\n          pendingNavigationController = null;\n          completeNavigation(location, {\n            matches: actionResult.matches,\n            loaderData: {},\n            errors: {\n              [routeId]: result.error\n            }\n          });\n          return;\n        }\n      }\n      matches = actionResult.matches || matches;\n      pendingActionResult = actionResult.pendingActionResult;\n      loadingNavigation = getLoadingNavigation(location, opts.submission);\n      flushSync = false;\n      // No need to do fog of war matching again on loader execution\n      fogOfWar.active = false;\n      // Create a GET request for the loaders\n      request = createClientSideRequest(init.history, request.url, request.signal);\n    }\n    // Call loaders\n    let {\n      shortCircuited,\n      matches: updatedMatches,\n      loaderData,\n      errors\n    } = await handleLoaders(request, location, matches, fogOfWar.active, loadingNavigation, opts && opts.submission, opts && opts.fetcherSubmission, opts && opts.replace, opts && opts.initialHydration === true, flushSync, pendingActionResult);\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: updatedMatches || matches\n    }, getActionDataForCommit(pendingActionResult), {\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, isFogOfWar, opts) {\n    if (opts === void 0) {\n      opts = {};\n    }\n    interruptActiveLoads();\n    // Put us in a submitting state\n    let navigation = getSubmittingNavigation(location, submission);\n    updateState({\n      navigation\n    }, {\n      flushSync: opts.flushSync === true\n    });\n    if (isFogOfWar) {\n      let discoverResult = await discoverRoutes(matches, location.pathname, request.signal);\n      if (discoverResult.type === \"aborted\") {\n        return {\n          shortCircuited: true\n        };\n      } else if (discoverResult.type === \"error\") {\n        let boundaryId = findNearestBoundary(discoverResult.partialMatches).route.id;\n        return {\n          matches: discoverResult.partialMatches,\n          pendingActionResult: [boundaryId, {\n            type: ResultType.error,\n            error: discoverResult.error\n          }]\n        };\n      } else if (!discoverResult.matches) {\n        let {\n          notFoundMatches,\n          error,\n          route\n        } = handleNavigational404(location.pathname);\n        return {\n          matches: notFoundMatches,\n          pendingActionResult: [route.id, {\n            type: ResultType.error,\n            error\n          }]\n        };\n      } else {\n        matches = discoverResult.matches;\n      }\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      let results = await callDataStrategy(\"action\", state, request, [actionMatch], matches, null);\n      result = results[actionMatch.route.id];\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        let location = normalizeRedirectLocation(result.response.headers.get(\"Location\"), new URL(request.url), basename);\n        replace = location === state.location.pathname + state.location.search;\n      }\n      await startRedirectNavigation(request, result, true, {\n        submission,\n        replace\n      });\n      return {\n        shortCircuited: true\n      };\n    }\n    if (isDeferredResult(result)) {\n      throw getInternalRouterError(400, {\n        type: \"defer-action\"\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 to the current location are REPLACE\n      // navigations, but if the action threw an error that'll be rendered in\n      // an errorElement, we fall back to PUSH so that the user can use the\n      // back button to get back to the pre-submission form location to try\n      // again\n      if ((opts && opts.replace) !== true) {\n        pendingAction = Action.Push;\n      }\n      return {\n        matches,\n        pendingActionResult: [boundaryMatch.route.id, result]\n      };\n    }\n    return {\n      matches,\n      pendingActionResult: [actionMatch.route.id, result]\n    };\n  }\n  // Call all applicable loaders for the given matches, handling redirects,\n  // errors, etc.\n  async function handleLoaders(request, location, matches, isFogOfWar, overrideNavigation, submission, fetcherSubmission, replace, initialHydration, flushSync, pendingActionResult) {\n    // Figure out the right navigation we want to use for data loading\n    let loadingNavigation = overrideNavigation || getLoadingNavigation(location, submission);\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 || getSubmissionFromNavigation(loadingNavigation);\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 we have partialHydration enabled, then don't update the state for the\n    // initial data load since it's not a \"navigation\"\n    let shouldUpdateNavigationState = !isUninterruptedRevalidation && (!future.v7_partialHydration || !initialHydration);\n    // When fog of war is enabled, we enter our `loading` state earlier so we\n    // can discover new routes during the `loading` state.  We skip this if\n    // we've already run actions since we would have done our matching already.\n    // If the children() function threw then, we want to proceed with the\n    // partial matches it discovered.\n    if (isFogOfWar) {\n      if (shouldUpdateNavigationState) {\n        let actionData = getUpdatedActionData(pendingActionResult);\n        updateState(_extends({\n          navigation: loadingNavigation\n        }, actionData !== undefined ? {\n          actionData\n        } : {}), {\n          flushSync\n        });\n      }\n      let discoverResult = await discoverRoutes(matches, location.pathname, request.signal);\n      if (discoverResult.type === \"aborted\") {\n        return {\n          shortCircuited: true\n        };\n      } else if (discoverResult.type === \"error\") {\n        let boundaryId = findNearestBoundary(discoverResult.partialMatches).route.id;\n        return {\n          matches: discoverResult.partialMatches,\n          loaderData: {},\n          errors: {\n            [boundaryId]: discoverResult.error\n          }\n        };\n      } else if (!discoverResult.matches) {\n        let {\n          error,\n          notFoundMatches,\n          route\n        } = handleNavigational404(location.pathname);\n        return {\n          matches: notFoundMatches,\n          loaderData: {},\n          errors: {\n            [route.id]: error\n          }\n        };\n      } else {\n        matches = discoverResult.matches;\n      }\n    }\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, activeSubmission, location, future.v7_partialHydration && initialHydration === true, future.v7_skipActionErrorRevalidation, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, deletedFetchers, fetchLoadMatches, fetchRedirectIds, routesToUse, basename, pendingActionResult);\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    pendingNavigationLoadId = ++incrementingLoadId;\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: pendingActionResult && isErrorResult(pendingActionResult[1]) ? {\n          [pendingActionResult[0]]: pendingActionResult[1].error\n        } : null\n      }, getActionDataForCommit(pendingActionResult), updatedFetchers ? {\n        fetchers: new Map(state.fetchers)\n      } : {}), {\n        flushSync\n      });\n      return {\n        shortCircuited: true\n      };\n    }\n    if (shouldUpdateNavigationState) {\n      let updates = {};\n      if (!isFogOfWar) {\n        // Only update navigation/actionNData if we didn't already do it above\n        updates.navigation = loadingNavigation;\n        let actionData = getUpdatedActionData(pendingActionResult);\n        if (actionData !== undefined) {\n          updates.actionData = actionData;\n        }\n      }\n      if (revalidatingFetchers.length > 0) {\n        updates.fetchers = getUpdatedRevalidatingFetchers(revalidatingFetchers);\n      }\n      updateState(updates, {\n        flushSync\n      });\n    }\n    revalidatingFetchers.forEach(rf => {\n      abortFetcher(rf.key);\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      loaderResults,\n      fetcherResults\n    } = await callLoadersAndMaybeResolveData(state, 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(loaderResults);\n    if (redirect) {\n      await startRedirectNavigation(request, redirect.result, true, {\n        replace\n      });\n      return {\n        shortCircuited: true\n      };\n    }\n    redirect = findRedirect(fetcherResults);\n    if (redirect) {\n      // If this redirect came from a fetcher make sure we mark it in\n      // fetchRedirectIds so it doesn't get revalidated on the next set of\n      // loader executions\n      fetchRedirectIds.add(redirect.key);\n      await startRedirectNavigation(request, redirect.result, true, {\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, loaderResults, pendingActionResult, 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    // Preserve SSR errors during partial hydration\n    if (future.v7_partialHydration && initialHydration && state.errors) {\n      errors = _extends({}, state.errors, errors);\n    }\n    let updatedFetchers = markFetchRedirectsDone();\n    let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n    let shouldUpdateFetchers = updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n    return _extends({\n      matches,\n      loaderData,\n      errors\n    }, shouldUpdateFetchers ? {\n      fetchers: new Map(state.fetchers)\n    } : {});\n  }\n  function getUpdatedActionData(pendingActionResult) {\n    if (pendingActionResult && !isErrorResult(pendingActionResult[1])) {\n      // This is cast to `any` currently because `RouteData`uses any and it\n      // would be a breaking change to use any.\n      // TODO: v7 - change `RouteData` to use `unknown` instead of `any`\n      return {\n        [pendingActionResult[0]]: pendingActionResult[1].data\n      };\n    } else if (state.actionData) {\n      if (Object.keys(state.actionData).length === 0) {\n        return null;\n      } else {\n        return state.actionData;\n      }\n    }\n  }\n  function getUpdatedRevalidatingFetchers(revalidatingFetchers) {\n    revalidatingFetchers.forEach(rf => {\n      let fetcher = state.fetchers.get(rf.key);\n      let revalidatingFetcher = getLoadingFetcher(undefined, fetcher ? fetcher.data : undefined);\n      state.fetchers.set(rf.key, revalidatingFetcher);\n    });\n    return new Map(state.fetchers);\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    abortFetcher(key);\n    let flushSync = (opts && opts.flushSync) === true;\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let normalizedPath = normalizeTo(state.location, state.matches, basename, future.v7_prependBasename, href, future.v7_relativeSplatPath, routeId, opts == null ? void 0 : opts.relative);\n    let matches = matchRoutes(routesToUse, normalizedPath, basename);\n    let fogOfWar = checkFogOfWar(matches, routesToUse, normalizedPath);\n    if (fogOfWar.active && fogOfWar.matches) {\n      matches = fogOfWar.matches;\n    }\n    if (!matches) {\n      setFetcherError(key, routeId, getInternalRouterError(404, {\n        pathname: normalizedPath\n      }), {\n        flushSync\n      });\n      return;\n    }\n    let {\n      path,\n      submission,\n      error\n    } = normalizeNavigateOptions(future.v7_normalizeFormMethod, true, normalizedPath, opts);\n    if (error) {\n      setFetcherError(key, routeId, error, {\n        flushSync\n      });\n      return;\n    }\n    let match = getTargetMatch(matches, path);\n    let preventScrollReset = (opts && opts.preventScrollReset) === true;\n    if (submission && isMutationMethod(submission.formMethod)) {\n      handleFetcherAction(key, routeId, path, match, matches, fogOfWar.active, flushSync, preventScrollReset, 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, fogOfWar.active, flushSync, preventScrollReset, 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, isFogOfWar, flushSync, preventScrollReset, submission) {\n    interruptActiveLoads();\n    fetchLoadMatches.delete(key);\n    function detectAndHandle405Error(m) {\n      if (!m.route.action && !m.route.lazy) {\n        let error = getInternalRouterError(405, {\n          method: submission.formMethod,\n          pathname: path,\n          routeId: routeId\n        });\n        setFetcherError(key, routeId, error, {\n          flushSync\n        });\n        return true;\n      }\n      return false;\n    }\n    if (!isFogOfWar && detectAndHandle405Error(match)) {\n      return;\n    }\n    // Put this fetcher into it's submitting state\n    let existingFetcher = state.fetchers.get(key);\n    updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n      flushSync\n    });\n    let abortController = new AbortController();\n    let fetchRequest = createClientSideRequest(init.history, path, abortController.signal, submission);\n    if (isFogOfWar) {\n      let discoverResult = await discoverRoutes(requestMatches, new URL(fetchRequest.url).pathname, fetchRequest.signal, key);\n      if (discoverResult.type === \"aborted\") {\n        return;\n      } else if (discoverResult.type === \"error\") {\n        setFetcherError(key, routeId, discoverResult.error, {\n          flushSync\n        });\n        return;\n      } else if (!discoverResult.matches) {\n        setFetcherError(key, routeId, getInternalRouterError(404, {\n          pathname: path\n        }), {\n          flushSync\n        });\n        return;\n      } else {\n        requestMatches = discoverResult.matches;\n        match = getTargetMatch(requestMatches, path);\n        if (detectAndHandle405Error(match)) {\n          return;\n        }\n      }\n    }\n    // Call the action for the fetcher\n    fetchControllers.set(key, abortController);\n    let originatingLoadId = incrementingLoadId;\n    let actionResults = await callDataStrategy(\"action\", state, fetchRequest, [match], requestMatches, key);\n    let actionResult = actionResults[match.route.id];\n    if (fetchRequest.signal.aborted) {\n      // We can delete this so long as we weren't aborted by 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    // When using v7_fetcherPersist, we don't want errors bubbling up to the UI\n    // or redirects processed for unmounted fetchers so we just revert them to\n    // idle\n    if (future.v7_fetcherPersist && deletedFetchers.has(key)) {\n      if (isRedirectResult(actionResult) || isErrorResult(actionResult)) {\n        updateFetcherState(key, getDoneFetcher(undefined));\n        return;\n      }\n      // Let SuccessResult's fall through for revalidation\n    } else {\n      if (isRedirectResult(actionResult)) {\n        fetchControllers.delete(key);\n        if (pendingNavigationLoadId > originatingLoadId) {\n          // A new navigation was kicked off after our action started, so that\n          // should take precedence over this redirect navigation.  We already\n          // set isRevalidationRequired so all loaders for the new route should\n          // fire unless opted out via shouldRevalidate\n          updateFetcherState(key, getDoneFetcher(undefined));\n          return;\n        } else {\n          fetchRedirectIds.add(key);\n          updateFetcherState(key, getLoadingFetcher(submission));\n          return startRedirectNavigation(fetchRequest, actionResult, false, {\n            fetcherSubmission: submission,\n            preventScrollReset\n          });\n        }\n      }\n      // Process any non-redirect errors thrown\n      if (isErrorResult(actionResult)) {\n        setFetcherError(key, routeId, actionResult.error);\n        return;\n      }\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 = getLoadingFetcher(submission, actionResult.data);\n    state.fetchers.set(key, loadFetcher);\n    let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, submission, nextLocation, false, future.v7_skipActionErrorRevalidation, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, deletedFetchers, fetchLoadMatches, fetchRedirectIds, routesToUse, basename, [match.route.id, actionResult]);\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 = getLoadingFetcher(undefined, existingFetcher ? existingFetcher.data : undefined);\n      state.fetchers.set(staleKey, revalidatingFetcher);\n      abortFetcher(staleKey);\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      loaderResults,\n      fetcherResults\n    } = await callLoadersAndMaybeResolveData(state, 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(loaderResults);\n    if (redirect) {\n      return startRedirectNavigation(revalidationRequest, redirect.result, false, {\n        preventScrollReset\n      });\n    }\n    redirect = findRedirect(fetcherResults);\n    if (redirect) {\n      // If this redirect came from a fetcher make sure we mark it in\n      // fetchRedirectIds so it doesn't get revalidated on the next set of\n      // loader executions\n      fetchRedirectIds.add(redirect.key);\n      return startRedirectNavigation(revalidationRequest, redirect.result, false, {\n        preventScrollReset\n      });\n    }\n    // Process and commit output from loaders\n    let {\n      loaderData,\n      errors\n    } = processLoaderData(state, matches, 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 = getDoneFetcher(actionResult.data);\n      state.fetchers.set(key, doneFetcher);\n    }\n    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({\n        errors,\n        loaderData: mergeLoaderData(state.loaderData, loaderData, matches, errors),\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, isFogOfWar, flushSync, preventScrollReset, submission) {\n    let existingFetcher = state.fetchers.get(key);\n    updateFetcherState(key, getLoadingFetcher(submission, existingFetcher ? existingFetcher.data : undefined), {\n      flushSync\n    });\n    let abortController = new AbortController();\n    let fetchRequest = createClientSideRequest(init.history, path, abortController.signal);\n    if (isFogOfWar) {\n      let discoverResult = await discoverRoutes(matches, new URL(fetchRequest.url).pathname, fetchRequest.signal, key);\n      if (discoverResult.type === \"aborted\") {\n        return;\n      } else if (discoverResult.type === \"error\") {\n        setFetcherError(key, routeId, discoverResult.error, {\n          flushSync\n        });\n        return;\n      } else if (!discoverResult.matches) {\n        setFetcherError(key, routeId, getInternalRouterError(404, {\n          pathname: path\n        }), {\n          flushSync\n        });\n        return;\n      } else {\n        matches = discoverResult.matches;\n        match = getTargetMatch(matches, path);\n      }\n    }\n    // Call the loader for this fetcher route match\n    fetchControllers.set(key, abortController);\n    let originatingLoadId = incrementingLoadId;\n    let results = await callDataStrategy(\"loader\", state, fetchRequest, [match], matches, key);\n    let result = results[match.route.id];\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    // We don't want errors bubbling up or redirects followed for unmounted\n    // fetchers, so short circuit here if it was removed from the UI\n    if (deletedFetchers.has(key)) {\n      updateFetcherState(key, getDoneFetcher(undefined));\n      return;\n    }\n    // If the loader threw a redirect Response, start a new REPLACE navigation\n    if (isRedirectResult(result)) {\n      if (pendingNavigationLoadId > originatingLoadId) {\n        // A new navigation was kicked off after our loader started, so that\n        // should take precedence over this redirect navigation\n        updateFetcherState(key, getDoneFetcher(undefined));\n        return;\n      } else {\n        fetchRedirectIds.add(key);\n        await startRedirectNavigation(fetchRequest, result, false, {\n          preventScrollReset\n        });\n        return;\n      }\n    }\n    // Process any non-redirect errors thrown\n    if (isErrorResult(result)) {\n      setFetcherError(key, routeId, result.error);\n      return;\n    }\n    invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n    // Put the fetcher back into an idle state\n    updateFetcherState(key, getDoneFetcher(result.data));\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(request, redirect, isNavigation, _temp2) {\n    let {\n      submission,\n      fetcherSubmission,\n      preventScrollReset,\n      replace\n    } = _temp2 === void 0 ? {} : _temp2;\n    if (redirect.response.headers.has(\"X-Remix-Revalidate\")) {\n      isRevalidationRequired = true;\n    }\n    let location = redirect.response.headers.get(\"Location\");\n    invariant(location, \"Expected a Location header on the redirect Response\");\n    location = normalizeRedirectLocation(location, new URL(request.url), basename);\n    let redirectLocation = createLocation(state.location, location, {\n      _isRedirect: true\n    });\n    if (isBrowser) {\n      let isDocumentReload = false;\n      if (redirect.response.headers.has(\"X-Remix-Reload-Document\")) {\n        // Hard reload if the response contained X-Remix-Reload-Document\n        isDocumentReload = true;\n      } else if (ABSOLUTE_URL_REGEX.test(location)) {\n        const url = init.history.createURL(location);\n        isDocumentReload =\n        // Hard reload if it's an absolute URL to a new origin\n        url.origin !== routerWindow.location.origin ||\n        // Hard reload if it's an absolute URL that does not match our basename\n        stripBasename(url.pathname, basename) == null;\n      }\n      if (isDocumentReload) {\n        if (replace) {\n          routerWindow.location.replace(location);\n        } else {\n          routerWindow.location.assign(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 || redirect.response.headers.has(\"X-Remix-Replace\") ? 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    } = state.navigation;\n    if (!submission && !fetcherSubmission && formMethod && formAction && formEncType) {\n      submission = getSubmissionFromNavigation(state.navigation);\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    let activeSubmission = submission || fetcherSubmission;\n    if (redirectPreserveMethodStatusCodes.has(redirect.response.status) && activeSubmission && isMutationMethod(activeSubmission.formMethod)) {\n      await startNavigation(redirectHistoryAction, redirectLocation, {\n        submission: _extends({}, activeSubmission, {\n          formAction: location\n        }),\n        // Preserve these flags across redirects\n        preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n        enableViewTransition: isNavigation ? pendingViewTransitionEnabled : undefined\n      });\n    } else {\n      // If we have a navigation submission, we will preserve it through the\n      // redirect navigation\n      let overrideNavigation = getLoadingNavigation(redirectLocation, submission);\n      await startNavigation(redirectHistoryAction, redirectLocation, {\n        overrideNavigation,\n        // Send fetcher submissions through for shouldRevalidate\n        fetcherSubmission,\n        // Preserve these flags across redirects\n        preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n        enableViewTransition: isNavigation ? pendingViewTransitionEnabled : undefined\n      });\n    }\n  }\n  // Utility wrapper for calling dataStrategy client-side without having to\n  // pass around the manifest, mapRouteProperties, etc.\n  async function callDataStrategy(type, state, request, matchesToLoad, matches, fetcherKey) {\n    let results;\n    let dataResults = {};\n    try {\n      results = await callDataStrategyImpl(dataStrategyImpl, type, state, request, matchesToLoad, matches, fetcherKey, manifest, mapRouteProperties);\n    } catch (e) {\n      // If the outer dataStrategy method throws, just return the error for all\n      // matches - and it'll naturally bubble to the root\n      matchesToLoad.forEach(m => {\n        dataResults[m.route.id] = {\n          type: ResultType.error,\n          error: e\n        };\n      });\n      return dataResults;\n    }\n    for (let [routeId, result] of Object.entries(results)) {\n      if (isRedirectDataStrategyResultResult(result)) {\n        let response = result.result;\n        dataResults[routeId] = {\n          type: ResultType.redirect,\n          response: normalizeRelativeRoutingRedirectResponse(response, request, routeId, matches, basename, future.v7_relativeSplatPath)\n        };\n      } else {\n        dataResults[routeId] = await convertDataStrategyResultToDataResult(result);\n      }\n    }\n    return dataResults;\n  }\n  async function callLoadersAndMaybeResolveData(state, matches, matchesToLoad, fetchersToLoad, request) {\n    let currentMatches = state.matches;\n    // Kick off loaders and fetchers in parallel\n    let loaderResultsPromise = callDataStrategy(\"loader\", state, request, matchesToLoad, matches, null);\n    let fetcherResultsPromise = Promise.all(fetchersToLoad.map(async f => {\n      if (f.matches && f.match && f.controller) {\n        let results = await callDataStrategy(\"loader\", state, createClientSideRequest(init.history, f.path, f.controller.signal), [f.match], f.matches, f.key);\n        let result = results[f.match.route.id];\n        // Fetcher results are keyed by fetcher key from here on out, not routeId\n        return {\n          [f.key]: result\n        };\n      } else {\n        return Promise.resolve({\n          [f.key]: {\n            type: ResultType.error,\n            error: getInternalRouterError(404, {\n              pathname: f.path\n            })\n          }\n        });\n      }\n    }));\n    let loaderResults = await loaderResultsPromise;\n    let fetcherResults = (await fetcherResultsPromise).reduce((acc, r) => Object.assign(acc, r), {});\n    await Promise.all([resolveNavigationDeferredResults(matches, loaderResults, request.signal, currentMatches, state.loaderData), resolveFetcherDeferredResults(matches, fetcherResults, fetchersToLoad)]);\n    return {\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.add(key);\n      }\n      abortFetcher(key);\n    });\n  }\n  function updateFetcherState(key, fetcher, opts) {\n    if (opts === void 0) {\n      opts = {};\n    }\n    state.fetchers.set(key, fetcher);\n    updateState({\n      fetchers: new Map(state.fetchers)\n    }, {\n      flushSync: (opts && opts.flushSync) === true\n    });\n  }\n  function setFetcherError(key, routeId, error, opts) {\n    if (opts === void 0) {\n      opts = {};\n    }\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      flushSync: (opts && opts.flushSync) === true\n    });\n  }\n  function getFetcher(key) {\n    activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n    // If this fetcher was previously marked for deletion, unmark it since we\n    // have a new instance\n    if (deletedFetchers.has(key)) {\n      deletedFetchers.delete(key);\n    }\n    return state.fetchers.get(key) || IDLE_FETCHER;\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    // If we opted into the flag we can clear this now since we're calling\n    // deleteFetcher() at the end of updateState() and we've already handed the\n    // deleted fetcher keys off to the data layer.\n    // If not, we're eagerly calling deleteFetcher() and we need to keep this\n    // Set populated until the next updateState call, and we'll clear\n    // `deletedFetchers` then\n    if (future.v7_fetcherPersist) {\n      deletedFetchers.delete(key);\n    }\n    cancelledFetcherLoads.delete(key);\n    state.fetchers.delete(key);\n  }\n  function deleteFetcherAndUpdateState(key) {\n    let count = (activeFetchers.get(key) || 0) - 1;\n    if (count <= 0) {\n      activeFetchers.delete(key);\n      deletedFetchers.add(key);\n      if (!future.v7_fetcherPersist) {\n        deleteFetcher(key);\n      }\n    } else {\n      activeFetchers.set(key, count);\n    }\n    updateState({\n      fetchers: new Map(state.fetchers)\n    });\n  }\n  function abortFetcher(key) {\n    let controller = fetchControllers.get(key);\n    if (controller) {\n      controller.abort();\n      fetchControllers.delete(key);\n    }\n  }\n  function markFetchersDone(keys) {\n    for (let key of keys) {\n      let fetcher = getFetcher(key);\n      let doneFetcher = getDoneFetcher(fetcher.data);\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    let blockers = new Map(state.blockers);\n    blockers.set(key, newBlocker);\n    updateState({\n      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 handleNavigational404(pathname) {\n    let error = getInternalRouterError(404, {\n      pathname\n    });\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let {\n      matches,\n      route\n    } = getShortCircuitMatches(routesToUse);\n    // Cancel all pending deferred on 404s since we don't keep any routes\n    cancelActiveDeferreds();\n    return {\n      notFoundMatches: matches,\n      route,\n      error\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 || null;\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 getScrollKey(location, matches) {\n    if (getScrollRestorationKey) {\n      let key = getScrollRestorationKey(location, matches.map(m => convertRouteMatchToUiMatch(m, state.loaderData)));\n      return key || location.key;\n    }\n    return location.key;\n  }\n  function saveScrollPosition(location, matches) {\n    if (savedScrollPositions && getScrollPosition) {\n      let key = getScrollKey(location, matches);\n      savedScrollPositions[key] = getScrollPosition();\n    }\n  }\n  function getSavedScrollPosition(location, matches) {\n    if (savedScrollPositions) {\n      let key = getScrollKey(location, matches);\n      let y = savedScrollPositions[key];\n      if (typeof y === \"number\") {\n        return y;\n      }\n    }\n    return null;\n  }\n  function checkFogOfWar(matches, routesToUse, pathname) {\n    if (patchRoutesOnNavigationImpl) {\n      if (!matches) {\n        let fogMatches = matchRoutesImpl(routesToUse, pathname, basename, true);\n        return {\n          active: true,\n          matches: fogMatches || []\n        };\n      } else {\n        if (Object.keys(matches[0].params).length > 0) {\n          // If we matched a dynamic param or a splat, it might only be because\n          // we haven't yet discovered other routes that would match with a\n          // higher score.  Call patchRoutesOnNavigation just to be sure\n          let partialMatches = matchRoutesImpl(routesToUse, pathname, basename, true);\n          return {\n            active: true,\n            matches: partialMatches\n          };\n        }\n      }\n    }\n    return {\n      active: false,\n      matches: null\n    };\n  }\n  async function discoverRoutes(matches, pathname, signal, fetcherKey) {\n    if (!patchRoutesOnNavigationImpl) {\n      return {\n        type: \"success\",\n        matches\n      };\n    }\n    let partialMatches = matches;\n    while (true) {\n      let isNonHMR = inFlightDataRoutes == null;\n      let routesToUse = inFlightDataRoutes || dataRoutes;\n      let localManifest = manifest;\n      try {\n        await patchRoutesOnNavigationImpl({\n          signal,\n          path: pathname,\n          matches: partialMatches,\n          fetcherKey,\n          patch: (routeId, children) => {\n            if (signal.aborted) return;\n            patchRoutesImpl(routeId, children, routesToUse, localManifest, mapRouteProperties);\n          }\n        });\n      } catch (e) {\n        return {\n          type: \"error\",\n          error: e,\n          partialMatches\n        };\n      } finally {\n        // If we are not in the middle of an HMR revalidation and we changed the\n        // routes, provide a new identity so when we `updateState` at the end of\n        // this navigation/fetch `router.routes` will be a new identity and\n        // trigger a re-run of memoized `router.routes` dependencies.\n        // HMR will already update the identity and reflow when it lands\n        // `inFlightDataRoutes` in `completeNavigation`\n        if (isNonHMR && !signal.aborted) {\n          dataRoutes = [...dataRoutes];\n        }\n      }\n      if (signal.aborted) {\n        return {\n          type: \"aborted\"\n        };\n      }\n      let newMatches = matchRoutes(routesToUse, pathname, basename);\n      if (newMatches) {\n        return {\n          type: \"success\",\n          matches: newMatches\n        };\n      }\n      let newPartialMatches = matchRoutesImpl(routesToUse, pathname, basename, true);\n      // Avoid loops if the second pass results in the same partial matches\n      if (!newPartialMatches || partialMatches.length === newPartialMatches.length && partialMatches.every((m, i) => m.route.id === newPartialMatches[i].route.id)) {\n        return {\n          type: \"success\",\n          matches: null\n        };\n      }\n      partialMatches = newPartialMatches;\n    }\n  }\n  function _internalSetRoutes(newRoutes) {\n    manifest = {};\n    inFlightDataRoutes = convertRoutesToDataRoutes(newRoutes, mapRouteProperties, undefined, manifest);\n  }\n  function patchRoutes(routeId, children) {\n    let isNonHMR = inFlightDataRoutes == null;\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    patchRoutesImpl(routeId, children, routesToUse, manifest, mapRouteProperties);\n    // If we are not in the middle of an HMR revalidation and we changed the\n    // routes, provide a new identity and trigger a reflow via `updateState`\n    // to re-run memoized `router.routes` dependencies.\n    // HMR will already update the identity and reflow when it lands\n    // `inFlightDataRoutes` in `completeNavigation`\n    if (isNonHMR) {\n      dataRoutes = [...dataRoutes];\n      updateState({});\n    }\n  }\n  router = {\n    get basename() {\n      return basename;\n    },\n    get future() {\n      return future;\n    },\n    get state() {\n      return state;\n    },\n    get routes() {\n      return dataRoutes;\n    },\n    get window() {\n      return routerWindow;\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: deleteFetcherAndUpdateState,\n    dispose,\n    getBlocker,\n    deleteBlocker,\n    patchRoutes,\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  // Config driven behavior flags\n  let future = _extends({\n    v7_relativeSplatPath: false,\n    v7_throwAbortReason: false\n  }, opts ? opts.future : null);\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   * - `opts.requestContext` is an optional server context that will be passed\n   *   to actions/loaders in the `context` parameter\n   * - `opts.skipLoaderErrorBubbling` is an optional parameter that will prevent\n   *   the bubbling of errors which allows single-fetch-type implementations\n   *   where the client will handle the bubbling and we may need to return data\n   *   for the handling route\n   */\n  async function query(request, _temp3) {\n    let {\n      requestContext,\n      skipLoaderErrorBubbling,\n      dataStrategy\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\") {\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, dataStrategy || null, skipLoaderErrorBubbling === true, null);\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   * - `opts.routeId` allows you to specify the specific route handler to call.\n   *   If not provided the handler will determine the proper route by matching\n   *   against `request.url`\n   * - `opts.requestContext` is an optional server context that will be passed\n   *    to actions/loaders in the `context` parameter\n   */\n  async function queryRoute(request, _temp4) {\n    let {\n      routeId,\n      requestContext,\n      dataStrategy\n    } = _temp4 === void 0 ? {} : _temp4;\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, dataStrategy || null, false, 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, dataStrategy, skipLoaderErrorBubbling, 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, dataStrategy, skipLoaderErrorBubbling, routeMatch != null);\n        return result;\n      }\n      let result = await loadRouteData(request, matches, requestContext, dataStrategy, skipLoaderErrorBubbling, 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 for a\n      // `queryRoute` call, we throw the `DataStrategyResult` to bail out early\n      // and then return or throw the raw Response here accordingly\n      if (isDataStrategyResult(e) && isResponse(e.result)) {\n        if (e.type === ResultType.error) {\n          throw e.result;\n        }\n        return e.result;\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, dataStrategy, skipLoaderErrorBubbling, 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      let results = await callDataStrategy(\"action\", request, [actionMatch], matches, isRouteRequest, requestContext, dataStrategy);\n      result = results[actionMatch.route.id];\n      if (request.signal.aborted) {\n        throwStaticHandlerAbortedError(request, isRouteRequest, future);\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.response.status,\n        headers: {\n          Location: result.response.headers.get(\"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    // 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    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 = skipLoaderErrorBubbling ? actionMatch : findNearestBoundary(matches, actionMatch.route.id);\n      let context = await loadRouteData(loaderRequest, matches, requestContext, dataStrategy, skipLoaderErrorBubbling, null, [boundaryMatch.route.id, result]);\n      // action status codes take precedence over loader status codes\n      return _extends({}, context, {\n        statusCode: isRouteErrorResponse(result.error) ? result.error.status : result.statusCode != null ? result.statusCode : 500,\n        actionData: null,\n        actionHeaders: _extends({}, result.headers ? {\n          [actionMatch.route.id]: result.headers\n        } : {})\n      });\n    }\n    let context = await loadRouteData(loaderRequest, matches, requestContext, dataStrategy, skipLoaderErrorBubbling, null);\n    return _extends({}, context, {\n      actionData: {\n        [actionMatch.route.id]: result.data\n      }\n    }, result.statusCode ? {\n      statusCode: result.statusCode\n    } : {}, {\n      actionHeaders: result.headers ? {\n        [actionMatch.route.id]: result.headers\n      } : {}\n    });\n  }\n  async function loadRouteData(request, matches, requestContext, dataStrategy, skipLoaderErrorBubbling, routeMatch, pendingActionResult) {\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] : pendingActionResult && isErrorResult(pendingActionResult[1]) ? getLoaderMatchesUntilBoundary(matches, pendingActionResult[0]) : matches;\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: pendingActionResult && isErrorResult(pendingActionResult[1]) ? {\n          [pendingActionResult[0]]: pendingActionResult[1].error\n        } : null,\n        statusCode: 200,\n        loaderHeaders: {},\n        activeDeferreds: null\n      };\n    }\n    let results = await callDataStrategy(\"loader\", request, matchesToLoad, matches, isRouteRequest, requestContext, dataStrategy);\n    if (request.signal.aborted) {\n      throwStaticHandlerAbortedError(request, isRouteRequest, future);\n    }\n    // Process and commit output from loaders\n    let activeDeferreds = new Map();\n    let context = processRouteLoaderData(matches, results, pendingActionResult, activeDeferreds, skipLoaderErrorBubbling);\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  // Utility wrapper for calling dataStrategy server-side without having to\n  // pass around the manifest, mapRouteProperties, etc.\n  async function callDataStrategy(type, request, matchesToLoad, matches, isRouteRequest, requestContext, dataStrategy) {\n    let results = await callDataStrategyImpl(dataStrategy || defaultDataStrategy, type, null, request, matchesToLoad, matches, null, manifest, mapRouteProperties, requestContext);\n    let dataResults = {};\n    await Promise.all(matches.map(async match => {\n      if (!(match.route.id in results)) {\n        return;\n      }\n      let result = results[match.route.id];\n      if (isRedirectDataStrategyResultResult(result)) {\n        let response = result.result;\n        // Throw redirects and let the server handle them with an HTTP redirect\n        throw normalizeRelativeRoutingRedirectResponse(response, request, match.route.id, matches, basename, future.v7_relativeSplatPath);\n      }\n      if (isResponse(result.result) && isRouteRequest) {\n        // For SSR single-route requests, we want to hand Responses back\n        // directly without unwrapping\n        throw result;\n      }\n      dataResults[match.route.id] = await convertDataStrategyResultToDataResult(result);\n    }));\n    return dataResults;\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: isRouteErrorResponse(error) ? error.status : 500,\n    errors: {\n      [context._deepestRenderedBoundaryId || routes[0].id]: error\n    }\n  });\n  return newContext;\n}\nfunction throwStaticHandlerAbortedError(request, isRouteRequest, future) {\n  if (future.v7_throwAbortReason && request.signal.reason !== undefined) {\n    throw request.signal.reason;\n  }\n  let method = isRouteRequest ? \"queryRoute\" : \"query\";\n  throw new Error(method + \"() call aborted: \" + request.method + \" \" + request.url);\n}\nfunction isSubmissionNavigation(opts) {\n  return opts != null && (\"formData\" in opts && opts.formData != null || \"body\" in opts && opts.body !== undefined);\n}\nfunction normalizeTo(location, matches, basename, prependBasename, to, v7_relativeSplatPath, fromRouteId, relative) {\n  let contextualMatches;\n  let activeRouteMatch;\n  if (fromRouteId) {\n    // Grab matches up to the calling route so our route-relative logic is\n    // relative to the correct source route\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 : \".\", getResolveToMatches(contextualMatches, v7_relativeSplatPath), 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  // Account for `?index` params when routing to the current location\n  if ((to == null || to === \"\" || to === \".\") && activeRouteMatch) {\n    let nakedIndex = hasNakedIndexQuery(path.search);\n    if (activeRouteMatch.route.index && !nakedIndex) {\n      // Add one when we're targeting an index route\n      path.search = path.search ? path.search.replace(/^\\?/, \"?index&\") : \"?index\";\n    } else if (!activeRouteMatch.route.index && nakedIndex) {\n      // Remove existing ones when we're not\n      let params = new URLSearchParams(path.search);\n      let indexValues = params.getAll(\"index\");\n      params.delete(\"index\");\n      indexValues.filter(v => v).forEach(v => params.append(\"index\", v));\n      let qs = params.toString();\n      path.search = qs ? \"?\" + qs : \"\";\n    }\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  let getInvalidBodyError = () => ({\n    path,\n    error: getInternalRouterError(400, {\n      type: \"invalid-body\"\n    })\n  });\n  // Create a Submission on non-GET navigations\n  let rawFormMethod = opts.formMethod || \"get\";\n  let formMethod = normalizeFormMethod ? rawFormMethod.toUpperCase() : rawFormMethod.toLowerCase();\n  let formAction = stripHashFromPath(path);\n  if (opts.body !== undefined) {\n    if (opts.formEncType === \"text/plain\") {\n      // text only support POST/PUT/PATCH/DELETE submissions\n      if (!isMutationMethod(formMethod)) {\n        return getInvalidBodyError();\n      }\n      let text = typeof opts.body === \"string\" ? opts.body : opts.body instanceof FormData || opts.body instanceof URLSearchParams ?\n      // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n      Array.from(opts.body.entries()).reduce((acc, _ref3) => {\n        let [name, value] = _ref3;\n        return \"\" + acc + name + \"=\" + value + \"\\n\";\n      }, \"\") : String(opts.body);\n      return {\n        path,\n        submission: {\n          formMethod,\n          formAction,\n          formEncType: opts.formEncType,\n          formData: undefined,\n          json: undefined,\n          text\n        }\n      };\n    } else if (opts.formEncType === \"application/json\") {\n      // json only supports POST/PUT/PATCH/DELETE submissions\n      if (!isMutationMethod(formMethod)) {\n        return getInvalidBodyError();\n      }\n      try {\n        let json = typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n        return {\n          path,\n          submission: {\n            formMethod,\n            formAction,\n            formEncType: opts.formEncType,\n            formData: undefined,\n            json,\n            text: undefined\n          }\n        };\n      } catch (e) {\n        return getInvalidBodyError();\n      }\n    }\n  }\n  invariant(typeof FormData === \"function\", \"FormData is not available in this environment\");\n  let searchParams;\n  let formData;\n  if (opts.formData) {\n    searchParams = convertFormDataToSearchParams(opts.formData);\n    formData = opts.formData;\n  } else if (opts.body instanceof FormData) {\n    searchParams = convertFormDataToSearchParams(opts.body);\n    formData = opts.body;\n  } else if (opts.body instanceof URLSearchParams) {\n    searchParams = opts.body;\n    formData = convertSearchParamsToFormData(searchParams);\n  } else if (opts.body == null) {\n    searchParams = new URLSearchParams();\n    formData = new FormData();\n  } else {\n    try {\n      searchParams = new URLSearchParams(opts.body);\n      formData = convertSearchParamsToFormData(searchParams);\n    } catch (e) {\n      return getInvalidBodyError();\n    }\n  }\n  let submission = {\n    formMethod,\n    formAction,\n    formEncType: opts && opts.formEncType || \"application/x-www-form-urlencoded\",\n    formData,\n    json: undefined,\n    text: undefined\n  };\n  if (isMutationMethod(submission.formMethod)) {\n    return {\n      path,\n      submission\n    };\n  }\n  // Flatten submission onto URLSearchParams for GET submissions\n  let parsedPath = parsePath(path);\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 at/below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(matches, boundaryId, includeBoundary) {\n  if (includeBoundary === void 0) {\n    includeBoundary = false;\n  }\n  let index = matches.findIndex(m => m.route.id === boundaryId);\n  if (index >= 0) {\n    return matches.slice(0, includeBoundary ? index + 1 : index);\n  }\n  return matches;\n}\nfunction getMatchesToLoad(history, state, matches, submission, location, initialHydration, skipActionErrorRevalidation, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, deletedFetchers, fetchLoadMatches, fetchRedirectIds, routesToUse, basename, pendingActionResult) {\n  let actionResult = pendingActionResult ? isErrorResult(pendingActionResult[1]) ? pendingActionResult[1].error : pendingActionResult[1].data : 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 boundaryMatches = matches;\n  if (initialHydration && state.errors) {\n    // On initial hydration, only consider matches up to _and including_ the boundary.\n    // This is inclusive to handle cases where a server loader ran successfully,\n    // a child server loader bubbled up to this route, but this route has\n    // `clientLoader.hydrate` so we want to still run the `clientLoader` so that\n    // we have a complete version of `loaderData`\n    boundaryMatches = getLoaderMatchesUntilBoundary(matches, Object.keys(state.errors)[0], true);\n  } else if (pendingActionResult && isErrorResult(pendingActionResult[1])) {\n    // If an action threw an error, we call loaders up to, but not including the\n    // boundary\n    boundaryMatches = getLoaderMatchesUntilBoundary(matches, pendingActionResult[0]);\n  }\n  // Don't revalidate loaders by default after action 4xx/5xx responses\n  // when the flag is enabled.  They can still opt-into revalidation via\n  // `shouldRevalidate` via `actionResult`\n  let actionStatus = pendingActionResult ? pendingActionResult[1].statusCode : undefined;\n  let shouldSkipRevalidation = skipActionErrorRevalidation && actionStatus && actionStatus >= 400;\n  let navigationMatches = boundaryMatches.filter((match, index) => {\n    let {\n      route\n    } = match;\n    if (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 (route.loader == null) {\n      return false;\n    }\n    if (initialHydration) {\n      return shouldLoadRouteOnHydration(route, state.loaderData, state.errors);\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      actionStatus,\n      defaultShouldRevalidate: shouldSkipRevalidation ? false :\n      // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n      isRevalidationRequired || 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:\n    //  - on initial hydration (shouldn't be any fetchers then anyway)\n    //  - if fetcher won't be present in the subsequent render\n    //    - no longer matches the URL (v7_fetcherPersist=false)\n    //    - was unmounted but persisted due to v7_fetcherPersist=true\n    if (initialHydration || !matches.some(m => m.route.id === f.routeId) || deletedFetchers.has(key)) {\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.  Note this is\n    // currently only a use-case for Remix HMR where the route tree can change\n    // at runtime and remove a route previously loaded via a fetcher\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    // Revalidating fetchers are decoupled from the route matches since they\n    // load from a static href.  They revalidate based on explicit revalidation\n    // (submission, useRevalidator, or X-Remix-Revalidate)\n    let fetcher = state.fetchers.get(key);\n    let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n    let shouldRevalidate = false;\n    if (fetchRedirectIds.has(key)) {\n      // Never trigger a revalidation of an actively redirecting fetcher\n      shouldRevalidate = false;\n    } else if (cancelledFetcherLoads.has(key)) {\n      // Always mark for revalidation if the fetcher was cancelled\n      cancelledFetcherLoads.delete(key);\n      shouldRevalidate = true;\n    } else if (fetcher && fetcher.state !== \"idle\" && fetcher.data === undefined) {\n      // If the fetcher hasn't ever completed loading yet, then this isn't a\n      // revalidation, it would just be a brand new load if an explicit\n      // revalidation is required\n      shouldRevalidate = isRevalidationRequired;\n    } else {\n      // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n      // to explicit revalidations only\n      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        actionStatus,\n        defaultShouldRevalidate: shouldSkipRevalidation ? false : isRevalidationRequired\n      }));\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 shouldLoadRouteOnHydration(route, loaderData, errors) {\n  // We dunno if we have a loader - gotta find out!\n  if (route.lazy) {\n    return true;\n  }\n  // No loader, nothing to initialize\n  if (!route.loader) {\n    return false;\n  }\n  let hasData = loaderData != null && loaderData[route.id] !== undefined;\n  let hasError = errors != null && errors[route.id] !== undefined;\n  // Don't run if we error'd during SSR\n  if (!hasData && hasError) {\n    return false;\n  }\n  // Explicitly opting-in to running on hydration\n  if (typeof route.loader === \"function\" && route.loader.hydrate === true) {\n    return true;\n  }\n  // Otherwise, run if we're not yet initialized with anything\n  return !hasData && !hasError;\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}\nfunction patchRoutesImpl(routeId, children, routesToUse, manifest, mapRouteProperties) {\n  var _childrenToPatch;\n  let childrenToPatch;\n  if (routeId) {\n    let route = manifest[routeId];\n    invariant(route, \"No route found to patch children into: routeId = \" + routeId);\n    if (!route.children) {\n      route.children = [];\n    }\n    childrenToPatch = route.children;\n  } else {\n    childrenToPatch = routesToUse;\n  }\n  // Don't patch in routes we already know about so that `patch` is idempotent\n  // to simplify user-land code. This is useful because we re-call the\n  // `patchRoutesOnNavigation` function for matched routes with params.\n  let uniqueChildren = children.filter(newRoute => !childrenToPatch.some(existingRoute => isSameRoute(newRoute, existingRoute)));\n  let newRoutes = convertRoutesToDataRoutes(uniqueChildren, mapRouteProperties, [routeId || \"_\", \"patch\", String(((_childrenToPatch = childrenToPatch) == null ? void 0 : _childrenToPatch.length) || \"0\")], manifest);\n  childrenToPatch.push(...newRoutes);\n}\nfunction isSameRoute(newRoute, existingRoute) {\n  // Most optimal check is by id\n  if (\"id\" in newRoute && \"id\" in existingRoute && newRoute.id === existingRoute.id) {\n    return true;\n  }\n  // Second is by pathing differences\n  if (!(newRoute.index === existingRoute.index && newRoute.path === existingRoute.path && newRoute.caseSensitive === existingRoute.caseSensitive)) {\n    return false;\n  }\n  // Pathless layout routes are trickier since we need to check children.\n  // If they have no children then they're the same as far as we can tell\n  if ((!newRoute.children || newRoute.children.length === 0) && (!existingRoute.children || existingRoute.children.length === 0)) {\n    return true;\n  }\n  // Otherwise, we look to see if every child in the new route is already\n  // represented in the existing route's children\n  return newRoute.children.every((aChild, i) => {\n    var _existingRoute$childr;\n    return (_existingRoute$childr = existingRoute.children) == null ? void 0 : _existingRoute$childr.some(bChild => isSameRoute(aChild, bChild));\n  });\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}\n// Default implementation of `dataStrategy` which fetches all loaders in parallel\nasync function defaultDataStrategy(_ref4) {\n  let {\n    matches\n  } = _ref4;\n  let matchesToLoad = matches.filter(m => m.shouldLoad);\n  let results = await Promise.all(matchesToLoad.map(m => m.resolve()));\n  return results.reduce((acc, result, i) => Object.assign(acc, {\n    [matchesToLoad[i].route.id]: result\n  }), {});\n}\nasync function callDataStrategyImpl(dataStrategyImpl, type, state, request, matchesToLoad, matches, fetcherKey, manifest, mapRouteProperties, requestContext) {\n  let loadRouteDefinitionsPromises = matches.map(m => m.route.lazy ? loadLazyRouteModule(m.route, mapRouteProperties, manifest) : undefined);\n  let dsMatches = matches.map((match, i) => {\n    let loadRoutePromise = loadRouteDefinitionsPromises[i];\n    let shouldLoad = matchesToLoad.some(m => m.route.id === match.route.id);\n    // `resolve` encapsulates route.lazy(), executing the loader/action,\n    // and mapping return values/thrown errors to a `DataStrategyResult`.  Users\n    // can pass a callback to take fine-grained control over the execution\n    // of the loader/action\n    let resolve = async handlerOverride => {\n      if (handlerOverride && request.method === \"GET\" && (match.route.lazy || match.route.loader)) {\n        shouldLoad = true;\n      }\n      return shouldLoad ? callLoaderOrAction(type, request, match, loadRoutePromise, handlerOverride, requestContext) : Promise.resolve({\n        type: ResultType.data,\n        result: undefined\n      });\n    };\n    return _extends({}, match, {\n      shouldLoad,\n      resolve\n    });\n  });\n  // Send all matches here to allow for a middleware-type implementation.\n  // handler will be a no-op for unneeded routes and we filter those results\n  // back out below.\n  let results = await dataStrategyImpl({\n    matches: dsMatches,\n    request,\n    params: matches[0].params,\n    fetcherKey,\n    context: requestContext\n  });\n  // Wait for all routes to load here but 'swallow the error since we want\n  // it to bubble up from the `await loadRoutePromise` in `callLoaderOrAction` -\n  // called from `match.resolve()`\n  try {\n    await Promise.all(loadRouteDefinitionsPromises);\n  } catch (e) {\n    // No-op\n  }\n  return results;\n}\n// Default logic for calling a loader/action is the user has no specified a dataStrategy\nasync function callLoaderOrAction(type, request, match, loadRoutePromise, handlerOverride, staticContext) {\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    // This will never resolve so safe to type it as Promise<DataStrategyResult> to\n    // satisfy the function return value\n    let abortPromise = new Promise((_, r) => reject = r);\n    onReject = () => reject();\n    request.signal.addEventListener(\"abort\", onReject);\n    let actualHandler = ctx => {\n      if (typeof handler !== \"function\") {\n        return Promise.reject(new Error(\"You cannot call the handler for a route which defines a boolean \" + (\"\\\"\" + type + \"\\\" [routeId: \" + match.route.id + \"]\")));\n      }\n      return handler({\n        request,\n        params: match.params,\n        context: staticContext\n      }, ...(ctx !== undefined ? [ctx] : []));\n    };\n    let handlerPromise = (async () => {\n      try {\n        let val = await (handlerOverride ? handlerOverride(ctx => actualHandler(ctx)) : actualHandler());\n        return {\n          type: \"data\",\n          result: val\n        };\n      } catch (e) {\n        return {\n          type: \"error\",\n          result: e\n        };\n      }\n    })();\n    return Promise.race([handlerPromise, abortPromise]);\n  };\n  try {\n    let handler = match.route[type];\n    // If we have a route.lazy promise, await that first\n    if (loadRoutePromise) {\n      if (handler) {\n        // Run statically defined handler in parallel with lazy()\n        let handlerError;\n        let [value] = await Promise.all([\n        // If the handler throws, don't let it immediately bubble out,\n        // since we need to let the lazy() execution finish so we know if this\n        // route has a boundary that can handle the error\n        runHandler(handler).catch(e => {\n          handlerError = e;\n        }), loadRoutePromise]);\n        if (handlerError !== undefined) {\n          throw handlerError;\n        }\n        result = value;\n      } else {\n        // Load lazy route module, then run any returned handler\n        await loadRoutePromise;\n        handler = match.route[type];\n        if (handler) {\n          // Handler still runs 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            result: 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.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    // We should already be catching and converting normal handler executions to\n    // DataStrategyResults and returning them, so anything that throws here is an\n    // unexpected error we still need to wrap\n    return {\n      type: ResultType.error,\n      result: e\n    };\n  } finally {\n    if (onReject) {\n      request.signal.removeEventListener(\"abort\", onReject);\n    }\n  }\n  return result;\n}\nasync function convertDataStrategyResultToDataResult(dataStrategyResult) {\n  let {\n    result,\n    type\n  } = dataStrategyResult;\n  if (isResponse(result)) {\n    let data;\n    try {\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        if (result.body == null) {\n          data = null;\n        } else {\n          data = await result.json();\n        }\n      } else {\n        data = await result.text();\n      }\n    } catch (e) {\n      return {\n        type: ResultType.error,\n        error: e\n      };\n    }\n    if (type === ResultType.error) {\n      return {\n        type: ResultType.error,\n        error: new ErrorResponseImpl(result.status, result.statusText, data),\n        statusCode: result.status,\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 (type === ResultType.error) {\n    if (isDataWithResponseInit(result)) {\n      var _result$init3, _result$init4;\n      if (result.data instanceof Error) {\n        var _result$init, _result$init2;\n        return {\n          type: ResultType.error,\n          error: result.data,\n          statusCode: (_result$init = result.init) == null ? void 0 : _result$init.status,\n          headers: (_result$init2 = result.init) != null && _result$init2.headers ? new Headers(result.init.headers) : undefined\n        };\n      }\n      // Convert thrown data() to ErrorResponse instances\n      return {\n        type: ResultType.error,\n        error: new ErrorResponseImpl(((_result$init3 = result.init) == null ? void 0 : _result$init3.status) || 500, undefined, result.data),\n        statusCode: isRouteErrorResponse(result) ? result.status : undefined,\n        headers: (_result$init4 = result.init) != null && _result$init4.headers ? new Headers(result.init.headers) : undefined\n      };\n    }\n    return {\n      type: ResultType.error,\n      error: result,\n      statusCode: isRouteErrorResponse(result) ? result.status : undefined\n    };\n  }\n  if (isDeferredData(result)) {\n    var _result$init5, _result$init6;\n    return {\n      type: ResultType.deferred,\n      deferredData: result,\n      statusCode: (_result$init5 = result.init) == null ? void 0 : _result$init5.status,\n      headers: ((_result$init6 = result.init) == null ? void 0 : _result$init6.headers) && new Headers(result.init.headers)\n    };\n  }\n  if (isDataWithResponseInit(result)) {\n    var _result$init7, _result$init8;\n    return {\n      type: ResultType.data,\n      data: result.data,\n      statusCode: (_result$init7 = result.init) == null ? void 0 : _result$init7.status,\n      headers: (_result$init8 = result.init) != null && _result$init8.headers ? new Headers(result.init.headers) : undefined\n    };\n  }\n  return {\n    type: ResultType.data,\n    data: result\n  };\n}\n// Support relative routing in internal redirects\nfunction normalizeRelativeRoutingRedirectResponse(response, request, routeId, matches, basename, v7_relativeSplatPath) {\n  let location = response.headers.get(\"Location\");\n  invariant(location, \"Redirects returned/thrown from loaders/actions must have a Location header\");\n  if (!ABSOLUTE_URL_REGEX.test(location)) {\n    let trimmedMatches = matches.slice(0, matches.findIndex(m => m.route.id === routeId) + 1);\n    location = normalizeTo(new URL(request.url), trimmedMatches, basename, true, location, v7_relativeSplatPath);\n    response.headers.set(\"Location\", location);\n  }\n  return response;\n}\nfunction normalizeRedirectLocation(location, currentUrl, basename) {\n  if (ABSOLUTE_URL_REGEX.test(location)) {\n    // Strip off the protocol+origin for same-origin + same-basename absolute redirects\n    let normalizedLocation = location;\n    let url = normalizedLocation.startsWith(\"//\") ? new URL(currentUrl.protocol + normalizedLocation) : new URL(normalizedLocation);\n    let isSameBasename = stripBasename(url.pathname, basename) != null;\n    if (url.origin === currentUrl.origin && isSameBasename) {\n      return url.pathname + url.search + url.hash;\n    }\n  }\n  return location;\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    } = 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    if (formEncType === \"application/json\") {\n      init.headers = new Headers({\n        \"Content-Type\": formEncType\n      });\n      init.body = JSON.stringify(submission.json);\n    } else if (formEncType === \"text/plain\") {\n      // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n      init.body = submission.text;\n    } else if (formEncType === \"application/x-www-form-urlencoded\" && submission.formData) {\n      // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n      init.body = convertFormDataToSearchParams(submission.formData);\n    } else {\n      // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n      init.body = submission.formData;\n    }\n  }\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, typeof value === \"string\" ? value : value.name);\n  }\n  return searchParams;\n}\nfunction convertSearchParamsToFormData(searchParams) {\n  let formData = new FormData();\n  for (let [key, value] of searchParams.entries()) {\n    formData.append(key, value);\n  }\n  return formData;\n}\nfunction processRouteLoaderData(matches, results, pendingActionResult, activeDeferreds, skipLoaderErrorBubbling) {\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  let pendingError = pendingActionResult && isErrorResult(pendingActionResult[1]) ? pendingActionResult[1].error : undefined;\n  // Process loader results into state.loaderData/state.errors\n  matches.forEach(match => {\n    if (!(match.route.id in results)) {\n      return;\n    }\n    let id = match.route.id;\n    let result = results[id];\n    invariant(!isRedirectResult(result), \"Cannot handle redirect results in processLoaderData\");\n    if (isErrorResult(result)) {\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 !== undefined) {\n        error = pendingError;\n        pendingError = undefined;\n      }\n      errors = errors || {};\n      if (skipLoaderErrorBubbling) {\n        errors[id] = error;\n      } else {\n        // Look upwards from the matched route for the closest ancestor error\n        // boundary, defaulting to the root match.  Prefer higher error values\n        // if lower errors bubble to the same boundary\n        let boundaryMatch = findNearestBoundary(matches, id);\n        if (errors[boundaryMatch.route.id] == null) {\n          errors[boundaryMatch.route.id] = error;\n        }\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        // 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      } else {\n        loaderData[id] = result.data;\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 && result.statusCode !== 200 && !foundError) {\n          statusCode = result.statusCode;\n        }\n        if (result.headers) {\n          loaderHeaders[id] = result.headers;\n        }\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 !== undefined && pendingActionResult) {\n    errors = {\n      [pendingActionResult[0]]: pendingError\n    };\n    loaderData[pendingActionResult[0]] = undefined;\n  }\n  return {\n    loaderData,\n    errors,\n    statusCode: statusCode || 200,\n    loaderHeaders\n  };\n}\nfunction processLoaderData(state, matches, results, pendingActionResult, revalidatingFetchers, fetcherResults, activeDeferreds) {\n  let {\n    loaderData,\n    errors\n  } = processRouteLoaderData(matches, results, pendingActionResult, activeDeferreds, false // This method is only called client side so we always want to bubble\n  );\n  // Process results from our revalidating fetchers\n  revalidatingFetchers.forEach(rf => {\n    let {\n      key,\n      match,\n      controller\n    } = rf;\n    let result = fetcherResults[key];\n    invariant(result, \"Did not find corresponding fetcher result\");\n    // Process fetcher non-redirect errors\n    if (controller && controller.signal.aborted) {\n      // Nothing to do for aborted fetchers\n      return;\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 = getDoneFetcher(result.data);\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}\nfunction getActionDataForCommit(pendingActionResult) {\n  if (!pendingActionResult) {\n    return {};\n  }\n  return isErrorResult(pendingActionResult[1]) ? {\n    // Clear out prior actionData on errors\n    actionData: {}\n  } : {\n    actionData: {\n      [pendingActionResult[0]]: pendingActionResult[1].data\n    }\n  };\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.length === 1 ? routes[0] : 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, _temp5) {\n  let {\n    pathname,\n    routeId,\n    method,\n    type,\n    message\n  } = _temp5 === void 0 ? {} : _temp5;\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    } else if (type === \"invalid-body\") {\n      errorMessage = \"Unable to encode submission body\";\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 ErrorResponseImpl(status || 500, statusText, new Error(errorMessage), true);\n}\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(results) {\n  let entries = Object.entries(results);\n  for (let i = entries.length - 1; i >= 0; i--) {\n    let [key, result] = entries[i];\n    if (isRedirectResult(result)) {\n      return {\n        key,\n        result\n      };\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 isDataStrategyResult(result) {\n  return result != null && typeof result === \"object\" && \"type\" in result && \"result\" in result && (result.type === ResultType.data || result.type === ResultType.error);\n}\nfunction isRedirectDataStrategyResultResult(result) {\n  return isResponse(result.result) && redirectStatusCodes.has(result.result.status);\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 isDataWithResponseInit(value) {\n  return typeof value === \"object\" && value != null && \"type\" in value && \"data\" in value && \"init\" in value && value.type === \"DataWithResponseInit\";\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 isValidMethod(method) {\n  return validRequestMethods.has(method.toLowerCase());\n}\nfunction isMutationMethod(method) {\n  return validMutationMethods.has(method.toLowerCase());\n}\nasync function resolveNavigationDeferredResults(matches, results, signal, currentMatches, currentLoaderData) {\n  let entries = Object.entries(results);\n  for (let index = 0; index < entries.length; index++) {\n    let [routeId, result] = entries[index];\n    let match = matches.find(m => (m == null ? void 0 : m.route.id) === routeId);\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) && 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      await resolveDeferredData(result, signal, false).then(result => {\n        if (result) {\n          results[routeId] = result;\n        }\n      });\n    }\n  }\n}\nasync function resolveFetcherDeferredResults(matches, results, revalidatingFetchers) {\n  for (let index = 0; index < revalidatingFetchers.length; index++) {\n    let {\n      key,\n      routeId,\n      controller\n    } = revalidatingFetchers[index];\n    let result = results[key];\n    let match = matches.find(m => (m == null ? void 0 : m.route.id) === routeId);\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    if (isDeferredResult(result)) {\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      invariant(controller, \"Expected an AbortController for revalidating fetcher deferred result\");\n      await resolveDeferredData(result, controller.signal, true).then(result => {\n        if (result) {\n          results[key] = result;\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}\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}\nfunction getSubmissionFromNavigation(navigation) {\n  let {\n    formMethod,\n    formAction,\n    formEncType,\n    text,\n    formData,\n    json\n  } = navigation;\n  if (!formMethod || !formAction || !formEncType) {\n    return;\n  }\n  if (text != null) {\n    return {\n      formMethod,\n      formAction,\n      formEncType,\n      formData: undefined,\n      json: undefined,\n      text\n    };\n  } else if (formData != null) {\n    return {\n      formMethod,\n      formAction,\n      formEncType,\n      formData,\n      json: undefined,\n      text: undefined\n    };\n  } else if (json !== undefined) {\n    return {\n      formMethod,\n      formAction,\n      formEncType,\n      formData: undefined,\n      json,\n      text: undefined\n    };\n  }\n}\nfunction getLoadingNavigation(location, submission) {\n  if (submission) {\n    let navigation = {\n      state: \"loading\",\n      location,\n      formMethod: submission.formMethod,\n      formAction: submission.formAction,\n      formEncType: submission.formEncType,\n      formData: submission.formData,\n      json: submission.json,\n      text: submission.text\n    };\n    return navigation;\n  } else {\n    let navigation = {\n      state: \"loading\",\n      location,\n      formMethod: undefined,\n      formAction: undefined,\n      formEncType: undefined,\n      formData: undefined,\n      json: undefined,\n      text: undefined\n    };\n    return navigation;\n  }\n}\nfunction getSubmittingNavigation(location, submission) {\n  let navigation = {\n    state: \"submitting\",\n    location,\n    formMethod: submission.formMethod,\n    formAction: submission.formAction,\n    formEncType: submission.formEncType,\n    formData: submission.formData,\n    json: submission.json,\n    text: submission.text\n  };\n  return navigation;\n}\nfunction getLoadingFetcher(submission, data) {\n  if (submission) {\n    let fetcher = {\n      state: \"loading\",\n      formMethod: submission.formMethod,\n      formAction: submission.formAction,\n      formEncType: submission.formEncType,\n      formData: submission.formData,\n      json: submission.json,\n      text: submission.text,\n      data\n    };\n    return fetcher;\n  } else {\n    let fetcher = {\n      state: \"loading\",\n      formMethod: undefined,\n      formAction: undefined,\n      formEncType: undefined,\n      formData: undefined,\n      json: undefined,\n      text: undefined,\n      data\n    };\n    return fetcher;\n  }\n}\nfunction getSubmittingFetcher(submission, existingFetcher) {\n  let fetcher = {\n    state: \"submitting\",\n    formMethod: submission.formMethod,\n    formAction: submission.formAction,\n    formEncType: submission.formEncType,\n    formData: submission.formData,\n    json: submission.json,\n    text: submission.text,\n    data: existingFetcher ? existingFetcher.data : undefined\n  };\n  return fetcher;\n}\nfunction getDoneFetcher(data) {\n  let fetcher = {\n    state: \"idle\",\n    formMethod: undefined,\n    formAction: undefined,\n    formEncType: undefined,\n    formData: undefined,\n    json: undefined,\n    text: undefined,\n    data\n  };\n  return fetcher;\n}\nfunction restoreAppliedTransitions(_window, transitions) {\n  try {\n    let sessionPositions = _window.sessionStorage.getItem(TRANSITIONS_STORAGE_KEY);\n    if (sessionPositions) {\n      let json = JSON.parse(sessionPositions);\n      for (let [k, v] of Object.entries(json || {})) {\n        if (v && Array.isArray(v)) {\n          transitions.set(k, new Set(v || []));\n        }\n      }\n    }\n  } catch (e) {\n    // no-op, use default empty object\n  }\n}\nfunction persistAppliedTransitions(_window, transitions) {\n  if (transitions.size > 0) {\n    let json = {};\n    for (let [k, v] of transitions) {\n      json[k] = [...v];\n    }\n    try {\n      _window.sessionStorage.setItem(TRANSITIONS_STORAGE_KEY, JSON.stringify(json));\n    } catch (error) {\n      warning(false, \"Failed to save applied view transitions in sessionStorage (\" + error + \").\");\n    }\n  }\n}\n//#endregion\n\nexport { AbortedDeferredError, Action, IDLE_BLOCKER, IDLE_FETCHER, IDLE_NAVIGATION, UNSAFE_DEFERRED_SYMBOL, DeferredData as UNSAFE_DeferredData, ErrorResponseImpl as UNSAFE_ErrorResponseImpl, convertRouteMatchToUiMatch as UNSAFE_convertRouteMatchToUiMatch, convertRoutesToDataRoutes as UNSAFE_convertRoutesToDataRoutes, decodePath as UNSAFE_decodePath, getResolveToMatches as UNSAFE_getResolveToMatches, invariant as UNSAFE_invariant, warning as UNSAFE_warning, createBrowserHistory, createHashHistory, createMemoryHistory, createPath, createRouter, createStaticHandler, data, defer, generatePath, getStaticContextFromError, getToPathname, isDataWithResponseInit, isDeferredData, isRouteErrorResponse, joinPaths, json, matchPath, matchRoutes, normalizePathname, parsePath, redirect, redirectDocument, replace, resolvePath, resolveTo, stripBasename };\n//# sourceMappingURL=router.js.map\n"],"names":["n","_extends","target","i","source","key","Action","PopStateEventType","createBrowserHistory","options","createBrowserLocation","window","globalHistory","pathname","search","hash","createLocation","createBrowserHref","to","createPath","getUrlBasedHistory","invariant","value","message","warning","cond","createKey","getHistoryState","location","index","current","state","parsePath","_ref","path","parsedPath","hashIndex","searchIndex","getLocation","createHref","validateLocation","v5Compat","action","listener","getIndex","handlePop","nextIndex","delta","history","push","historyState","url","error","replace","createURL","base","href","fn","ResultType","immutableRouteKeys","isIndexRoute","route","convertRoutesToDataRoutes","routes","mapRouteProperties","parentPath","manifest","treePath","id","indexRoute","pathOrLayoutRoute","matchRoutes","locationArg","basename","matchRoutesImpl","allowPartial","stripBasename","branches","flattenRoutes","rankRouteBranches","matches","decoded","decodePath","matchRouteBranch","convertRouteMatchToUiMatch","match","loaderData","params","parentsMeta","flattenRoute","relativePath","meta","joinPaths","routesMeta","computeScore","_route$path","exploded","explodeOptionalSegments","segments","first","rest","isOptional","required","restExploded","result","subpath","a","b","compareIndexes","paramRe","dynamicSegmentValue","indexRouteValue","emptySegmentValue","staticSegmentValue","splatPenalty","isSplat","s","initialScore","score","segment","branch","matchedParams","matchedPathname","end","remainingPathname","matchPath","normalizePathname","pattern","matcher","compiledParams","compilePath","pathnameBase","captureGroups","memo","paramName","splatValue","caseSensitive","regexpSource","_","v","startIndex","nextChar","resolvePath","fromPathname","toPathname","resolvePathname","normalizeSearch","normalizeHash","getInvalidPathError","char","field","dest","getPathContributingMatches","getResolveToMatches","v7_relativeSplatPath","pathMatches","idx","resolveTo","toArg","routePathnames","locationPathname","isPathRelative","isEmptyPath","from","routePathnameIndex","toSegments","hasExplicitTrailingSlash","hasCurrentTrailingSlash","paths","AbortedDeferredError","DeferredData","data","responseInit","reject","r","onAbort","acc","_ref2","promise","undefinedError","aborted","settledKey","subscriber","k","signal","resolve","_ref3","unwrapTrackedPromise","isTrackedPromise","defer","init","ErrorResponseImpl","status","statusText","internal","isRouteErrorResponse","validMutationMethodsArr","validMutationMethods","validRequestMethodsArr","validRequestMethods","redirectStatusCodes","redirectPreserveMethodStatusCodes","IDLE_NAVIGATION","IDLE_FETCHER","IDLE_BLOCKER","ABSOLUTE_URL_REGEX","defaultMapRouteProperties","TRANSITIONS_STORAGE_KEY","createRouter","routerWindow","isBrowser","isServer","detectErrorBoundary","dataRoutes","inFlightDataRoutes","dataStrategyImpl","defaultDataStrategy","patchRoutesOnNavigationImpl","future","unlistenHistory","subscribers","savedScrollPositions","getScrollRestorationKey","getScrollPosition","initialScrollRestored","initialMatches","initialMatchesIsFOW","initialErrors","getInternalRouterError","getShortCircuitMatches","checkFogOfWar","initialized","m","errors","shouldLoadRouteOnHydration","fogOfWar","router","pendingAction","pendingPreventScrollReset","pendingNavigationController","pendingViewTransitionEnabled","appliedViewTransitions","removePageHideEventListener","isUninterruptedRevalidation","isRevalidationRequired","cancelledDeferredRoutes","cancelledFetcherLoads","fetchControllers","incrementingLoadId","pendingNavigationLoadId","fetchReloadIds","fetchRedirectIds","fetchLoadMatches","activeFetchers","deletedFetchers","activeDeferreds","blockerFunctions","unblockBlockerHistoryUpdate","initialize","historyAction","blockerKey","shouldBlockNavigation","nextHistoryUpdatePromise","updateBlocker","blockers","updateState","startNavigation","restoreAppliedTransitions","_saveAppliedTransitions","persistAppliedTransitions","dispose","deleteFetcher","deleteBlocker","subscribe","newState","opts","completedFetchers","deletedFetchersKeys","fetcher","completeNavigation","_temp","_location$state","_location$state2","flushSync","isActionReload","isMutationMethod","actionData","mergeLoaderData","preventScrollReset","viewTransitionOpts","priorPaths","toPaths","getSavedScrollPosition","navigate","normalizedPath","normalizeTo","submission","normalizeNavigateOptions","currentLocation","nextLocation","userReplace","revalidate","interruptActiveLoads","saveScrollPosition","routesToUse","loadingNavigation","isHashChangeOnly","notFoundMatches","handleNavigational404","request","createClientSideRequest","pendingActionResult","findNearestBoundary","actionResult","handleAction","routeId","isErrorResult","getLoadingNavigation","shortCircuited","updatedMatches","handleLoaders","getActionDataForCommit","isFogOfWar","navigation","getSubmittingNavigation","discoverResult","discoverRoutes","boundaryId","actionMatch","getTargetMatch","callDataStrategy","isRedirectResult","normalizeRedirectLocation","startRedirectNavigation","isDeferredResult","boundaryMatch","overrideNavigation","fetcherSubmission","initialHydration","activeSubmission","getSubmissionFromNavigation","shouldUpdateNavigationState","getUpdatedActionData","matchesToLoad","revalidatingFetchers","getMatchesToLoad","cancelActiveDeferreds","updatedFetchers","markFetchRedirectsDone","updates","getUpdatedRevalidatingFetchers","rf","abortFetcher","abortPendingFetchRevalidations","f","loaderResults","fetcherResults","callLoadersAndMaybeResolveData","redirect","findRedirect","processLoaderData","deferredData","didAbortFetchLoads","abortStaleFetchLoads","shouldUpdateFetchers","revalidatingFetcher","getLoadingFetcher","fetch","setFetcherError","handleFetcherAction","handleFetcherLoader","requestMatches","detectAndHandle405Error","existingFetcher","updateFetcherState","getSubmittingFetcher","abortController","fetchRequest","originatingLoadId","getDoneFetcher","revalidationRequest","loadId","loadFetcher","staleKey","doneFetcher","resolveDeferredData","isNavigation","_temp2","redirectLocation","isDocumentReload","redirectHistoryAction","formMethod","formAction","formEncType","type","fetcherKey","results","dataResults","callDataStrategyImpl","e","isRedirectDataStrategyResultResult","response","normalizeRelativeRoutingRedirectResponse","convertDataStrategyResultToDataResult","fetchersToLoad","currentMatches","loaderResultsPromise","fetcherResultsPromise","resolveNavigationDeferredResults","resolveFetcherDeferredResults","getFetcher","deleteFetcherAndUpdateState","count","controller","markFetchersDone","keys","doneKeys","landedId","yeetedKeys","getBlocker","blocker","newBlocker","entries","blockerFunction","predicate","cancelledRouteIds","dfd","enableScrollRestoration","positions","getPosition","getKey","y","getScrollKey","partialMatches","isNonHMR","localManifest","children","patchRoutesImpl","newMatches","newPartialMatches","_internalSetRoutes","newRoutes","patchRoutes","isSubmissionNavigation","prependBasename","fromRouteId","relative","contextualMatches","activeRouteMatch","nakedIndex","hasNakedIndexQuery","indexValues","qs","normalizeFormMethod","isFetcher","isValidMethod","getInvalidBodyError","rawFormMethod","stripHashFromPath","text","name","json","searchParams","formData","convertFormDataToSearchParams","convertSearchParamsToFormData","getLoaderMatchesUntilBoundary","includeBoundary","skipActionErrorRevalidation","currentUrl","nextUrl","boundaryMatches","actionStatus","shouldSkipRevalidation","navigationMatches","isNewLoader","currentRouteMatch","nextRouteMatch","shouldRevalidateLoader","isNewRouteInstance","fetcherMatches","fetcherMatch","shouldRevalidate","hasData","hasError","currentLoaderData","currentMatch","isNew","isMissingData","currentPath","loaderMatch","arg","routeChoice","_childrenToPatch","childrenToPatch","uniqueChildren","newRoute","existingRoute","isSameRoute","aChild","_existingRoute$childr","bChild","loadLazyRouteModule","lazyRoute","routeToUpdate","routeUpdates","lazyRouteProperty","isPropertyStaticallyDefined","_ref4","requestContext","loadRouteDefinitionsPromises","dsMatches","loadRoutePromise","shouldLoad","handlerOverride","callLoaderOrAction","staticContext","onReject","runHandler","handler","abortPromise","actualHandler","ctx","handlerPromise","handlerError","dataStrategyResult","isResponse","contentType","isDataWithResponseInit","_result$init3","_result$init4","_result$init","_result$init2","isDeferredData","_result$init5","_result$init6","_result$init7","_result$init8","trimmedMatches","normalizedLocation","isSameBasename","processRouteLoaderData","skipLoaderErrorBubbling","statusCode","foundError","loaderHeaders","pendingError","newLoaderData","mergedLoaderData","_temp5","method","errorMessage","deferred","isRevalidatingLoader","unwrap","_window","transitions","sessionPositions"],"mappings":"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","x_google_ignoreList":[0]}